././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0784526 aiohttp-3.8.1/0000755000175100001710000000000000000000000012533 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/CHANGES.rst0000644000175100001710000013174700000000000014352 0ustar00runnerdocker.. You should *NOT* be adding new change log entries to this file, this file is managed by towncrier. You *may* edit previous change logs to fix problems like typo corrections or such. To add a new change log entry, please see https://pip.pypa.io/en/latest/development/#adding-a-news-entry we named the news folder "changes". WARNING: Don't drop the next directive! .. towncrier release notes start 3.8.1 (2021-11-14) ================== Bugfixes -------- - Fix the error in handling the return value of `getaddrinfo`. `getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family. It will cause a index out of range error in aiohttp. For example, if user compile CPython with `--disable-ipv6` option but his system enable the ipv6. `#5901 `_ - Do not install "examples" as a top-level package. `#6189 `_ - Restored ability to connect IPv6-only host. `#6195 `_ - Remove ``Signal`` from ``__all__``, replace ``aiohttp.Signal`` with ``aiosignal.Signal`` in docs `#6201 `_ - Made chunked encoding HTTP header check stricter. `#6305 `_ Improved Documentation ---------------------- - update quick starter demo codes. `#6240 `_ - Added an explanation of how tiny timeouts affect performance to the client reference document. `#6274 `_ - Add flake8-docstrings to flake8 configuration, enable subset of checks. `#6276 `_ - Added information on running complex applications with additional tasks/processes -- :user:`Dreamsorcerer`. `#6278 `_ Misc ---- - `#6205 `_ ---- 3.8.0 (2021-10-31) ================== Features -------- - Added a ``GunicornWebWorker`` feature for extending the aiohttp server configuration by allowing the 'wsgi' coroutine to return ``web.AppRunner`` object. `#2988 `_ - Switch from ``http-parser`` to ``llhttp`` `#3561 `_ - Use Brotli instead of brotlipy `#3803 `_ - Disable implicit switch-back to pure python mode. The build fails loudly if aiohttp cannot be compiled with C Accelerators. Use AIOHTTP_NO_EXTENSIONS=1 to explicitly disable C Extensions complication and switch to Pure-Python mode. Note that Pure-Python mode is significantly slower than compiled one. `#3828 `_ - Make access log use local time with timezone `#3853 `_ - Implemented ``readuntil`` in ``StreamResponse`` `#4054 `_ - FileResponse now supports ETag. `#4594 `_ - Add a request handler type alias ``aiohttp.typedefs.Handler``. `#4686 `_ - ``AioHTTPTestCase`` is more async friendly now. For people who use unittest and are used to use :py:exc:`~unittest.TestCase` it will be easier to write new test cases like the sync version of the :py:exc:`~unittest.TestCase` class, without using the decorator `@unittest_run_loop`, just `async def test_*`. The only difference is that for the people using python3.7 and below a new dependency is needed, it is ``asynctestcase``. `#4700 `_ - Add validation of HTTP header keys and values to prevent header injection. `#4818 `_ - Add predicate to ``AbstractCookieJar.clear``. Add ``AbstractCookieJar.clear_domain`` to clean all domain and subdomains cookies only. `#4942 `_ - Add keepalive_timeout parameter to web.run_app. `#5094 `_ - Tracing for client sent headers `#5105 `_ - Make type hints for http parser stricter `#5267 `_ - Add final declarations for constants. `#5275 `_ - Switch to external frozenlist and aiosignal libraries. `#5293 `_ - Don't send secure cookies by insecure transports. By default, the transport is secure if https or wss scheme is used. Use `CookieJar(treat_as_secure_origin="http://127.0.0.1")` to override the default security checker. `#5571 `_ - Always create a new event loop in ``aiohttp.web.run_app()``. This adds better compatibility with ``asyncio.run()`` or if trying to run multiple apps in sequence. `#5572 `_ - Add ``aiohttp.pytest_plugin.AiohttpClient`` for static typing of pytest plugin. `#5585 `_ - Added a ``socket_factory`` argument to ``BaseTestServer``. `#5844 `_ - Add compression strategy parameter to enable_compression method. `#5909 `_ - Added support for Python 3.10 to Github Actions CI/CD workflows and fix the related deprecation warnings -- :user:`Hanaasagi`. `#5927 `_ - Switched ``chardet`` to ``charset-normalizer`` for guessing the HTTP payload body encoding -- :user:`Ousret`. `#5930 `_ - Added optional auto_decompress argument for HttpRequestParser `#5957 `_ - Added support for HTTPS proxies to the extent CPython's :py:mod:`asyncio` supports it -- by :user:`bmbouter`, :user:`jborean93` and :user:`webknjaz`. `#5992 `_ - Added ``base_url`` parameter to the initializer of :class:`~aiohttp.ClientSession`. `#6013 `_ - Add Trove classifier and create binary wheels for 3.10. -- :user:`hugovk`. `#6079 `_ - Started shipping platform-specific wheels with the ``musl`` tag targeting typical Alpine Linux runtimes — :user:`asvetlov`. `#6139 `_ - Started shipping platform-specific arm64 wheels for Apple Silicon — :user:`asvetlov`. `#6139 `_ Bugfixes -------- - Modify _drain_helper() to handle concurrent `await resp.write(...)` or `ws.send_json(...)` calls without race-condition. `#2934 `_ - Started using `MultiLoopChildWatcher` when it's available under POSIX while setting up the test I/O loop. `#3450 `_ - Only encode content-disposition filename parameter using percent-encoding. Other parameters are encoded to quoted-string or RFC2231 extended parameter value. `#4012 `_ - Fixed HTTP client requests to honor ``no_proxy`` environment variables. `#4431 `_ - Fix supporting WebSockets proxies configured via environment variables. `#4648 `_ - Change return type on URLDispatcher to UrlMappingMatchInfo to improve type annotations. `#4748 `_ - Ensure a cleanup context is cleaned up even when an exception occurs during startup. `#4799 `_ - Added a new exception type for Unix socket client errors which provides a more useful error message. `#4984 `_ - Remove Transfer-Encoding and Content-Type headers for 204 in StreamResponse `#5106 `_ - Only depend on typing_extensions for Python <3.8 `#5107 `_ - Add ABNORMAL_CLOSURE and BAD_GATEWAY to WSCloseCode `#5192 `_ - Fix cookies disappearing from HTTPExceptions. `#5233 `_ - StaticResource prefixes no longer match URLs with a non-folder prefix. For example ``routes.static('/foo', '/foo')`` no longer matches the URL ``/foobar``. Previously, this would attempt to load the file ``/foo/ar``. `#5250 `_ - Acquire the connection before running traces to prevent race condition. `#5259 `_ - Add missing slots to ```_RequestContextManager`` and ``_WSRequestContextManager`` `#5329 `_ - Ensure sending a zero byte file does not throw an exception (round 2) `#5380 `_ - Set "text/plain" when data is an empty string in client requests. `#5392 `_ - Stop automatically releasing the ``ClientResponse`` object on calls to the ``ok`` property for the failed requests. `#5403 `_ - Include query parameters from `params` keyword argument in tracing `URL`. `#5432 `_ - Fix annotations `#5466 `_ - Fixed the multipart POST requests processing to always release file descriptors for the ``tempfile.Temporaryfile``-created ``_io.BufferedRandom`` instances of files sent within multipart request bodies via HTTP POST requests -- by :user:`webknjaz`. `#5494 `_ - Fix 0 being incorrectly treated as an immediate timeout. `#5527 `_ - Fixes failing tests when an environment variable _proxy is set. `#5554 `_ - Replace deprecated app handler design in ``tests/autobahn/server.py`` with call to ``web.run_app``; replace deprecated ``aiohttp.ws_connect`` calls in ``tests/autobahn/client.py`` with ``aiohttp.ClienSession.ws_connect``. `#5606 `_ - Fixed test for ``HTTPUnauthorized`` that access the ``text`` argument. This is not used in any part of the code, so it's removed now. `#5657 `_ - Remove incorrect default from docs `#5727 `_ - Remove external test dependency to http://httpbin.org `#5840 `_ - Don't cancel current task when entering a cancelled timer. `#5853 `_ - Added ``params`` keyword argument to ``ClientSession.ws_connect``. -- :user:`hoh`. `#5868 `_ - Uses :py:class:`~asyncio.ThreadedChildWatcher` under POSIX to allow setting up test loop in non-main thread. `#5877 `_ - Fix the error in handling the return value of `getaddrinfo`. `getaddrinfo` will return an `(int, bytes)` tuple, if CPython could not handle the address family. It will cause a index out of range error in aiohttp. For example, if user compile CPython with `--disable-ipv6` option but his system enable the ipv6. `#5901 `_ - Removed the deprecated ``loop`` argument from the ``asyncio.sleep``/``gather`` calls `#5905 `_ - Return ``None`` from ``request.if_modified_since``, ``request.if_unmodified_since``, ``request.if_range`` and ``response.last_modified`` when corresponding http date headers are invalid. `#5925 `_ - Fix resetting `SIGCHLD` signals in Gunicorn aiohttp Worker to fix `subprocesses` that capture output having an incorrect `returncode`. `#6130 `_ - Raise ``400: Content-Length can't be present with Transfer-Encoding`` if both ``Content-Length`` and ``Transfer-Encoding`` are sent by peer by both C and Python implementations `#6182 `_ Improved Documentation ---------------------- - Refactored OpenAPI/Swagger aiohttp addons, added ``aio-openapi`` `#5326 `_ - Fixed docs on request cookies type, so it matches what is actually used in the code (a read-only dictionary-like object). `#5725 `_ - Documented that the HTTP client ``Authorization`` header is removed on redirects to a different host or protocol. `#5850 `_ Misc ---- - `#3927 `_, `#4247 `_, `#4247 `_, `#5389 `_, `#5457 `_, `#5486 `_, `#5494 `_, `#5515 `_, `#5625 `_, `#5635 `_, `#5648 `_, `#5657 `_, `#5890 `_, `#5914 `_, `#5932 `_, `#6002 `_, `#6045 `_, `#6131 `_, `#6156 `_, `#6165 `_, `#6166 `_ ---- 3.7.4.post0 (2021-03-06) ======================== Misc ---- - Bumped upper bound of the ``chardet`` runtime dependency to allow their v4.0 version stream. `#5366 `_ ---- 3.7.4 (2021-02-25) ================== Bugfixes -------- - **(SECURITY BUG)** Started preventing open redirects in the ``aiohttp.web.normalize_path_middleware`` middleware. For more details, see https://github.com/aio-libs/aiohttp/security/advisories/GHSA-v6wp-4m6f-gcjg. Thanks to `Beast Glatisant `__ for finding the first instance of this issue and `Jelmer Vernooij `__ for reporting and tracking it down in aiohttp. `#5497 `_ - Fix interpretation difference of the pure-Python and the Cython-based HTTP parsers construct a ``yarl.URL`` object for HTTP request-target. Before this fix, the Python parser would turn the URI's absolute-path for ``//some-path`` into ``/`` while the Cython code preserved it as ``//some-path``. Now, both do the latter. `#5498 `_ ---- 3.7.3 (2020-11-18) ================== Features -------- - Use Brotli instead of brotlipy `#3803 `_ - Made exceptions pickleable. Also changed the repr of some exceptions. `#4077 `_ Bugfixes -------- - Raise a ClientResponseError instead of an AssertionError for a blank HTTP Reason Phrase. `#3532 `_ - Fix ``web_middlewares.normalize_path_middleware`` behavior for patch without slash. `#3669 `_ - Fix overshadowing of overlapped sub-applications prefixes. `#3701 `_ - Make `BaseConnector.close()` a coroutine and wait until the client closes all connections. Drop deprecated "with Connector():" syntax. `#3736 `_ - Reset the ``sock_read`` timeout each time data is received for a ``aiohttp.client`` response. `#3808 `_ - Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of View `#3880 `_ - Fixed querying the address families from DNS that the current host supports. `#5156 `_ - Change return type of MultipartReader.__aiter__() and BodyPartReader.__aiter__() to AsyncIterator. `#5163 `_ - Provide x86 Windows wheels. `#5230 `_ Improved Documentation ---------------------- - Add documentation for ``aiohttp.web.FileResponse``. `#3958 `_ - Removed deprecation warning in tracing example docs `#3964 `_ - Fixed wrong "Usage" docstring of ``aiohttp.client.request``. `#4603 `_ - Add aiohttp-pydantic to third party libraries `#5228 `_ Misc ---- - `#4102 `_ ---- 3.7.2 (2020-10-27) ================== Bugfixes -------- - Fixed static files handling for loops without ``.sendfile()`` support `#5149 `_ ---- 3.7.1 (2020-10-25) ================== Bugfixes -------- - Fixed a type error caused by the conditional import of `Protocol`. `#5111 `_ - Server doesn't send Content-Length for 1xx or 204 `#4901 `_ - Fix run_app typing `#4957 `_ - Always require ``typing_extensions`` library. `#5107 `_ - Fix a variable-shadowing bug causing `ThreadedResolver.resolve` to return the resolved IP as the ``hostname`` in each record, which prevented validation of HTTPS connections. `#5110 `_ - Added annotations to all public attributes. `#5115 `_ - Fix flaky test_when_timeout_smaller_second `#5116 `_ - Ensure sending a zero byte file does not throw an exception `#5124 `_ - Fix a bug in ``web.run_app()`` about Python version checking on Windows `#5127 `_ ---- 3.7.0 (2020-10-24) ================== Features -------- - Response headers are now prepared prior to running ``on_response_prepare`` hooks, directly before headers are sent to the client. `#1958 `_ - Add a ``quote_cookie`` option to ``CookieJar``, a way to skip quotation wrapping of cookies containing special characters. `#2571 `_ - Call ``AccessLogger.log`` with the current exception available from ``sys.exc_info()``. `#3557 `_ - `web.UrlDispatcher.add_routes` and `web.Application.add_routes` return a list of registered `AbstractRoute` instances. `AbstractRouteDef.register` (and all subclasses) return a list of registered resources registered resource. `#3866 `_ - Added properties of default ClientSession params to ClientSession class so it is available for introspection `#3882 `_ - Don't cancel web handler on peer disconnection, raise `OSError` on reading/writing instead. `#4080 `_ - Implement BaseRequest.get_extra_info() to access a protocol transports' extra info. `#4189 `_ - Added `ClientSession.timeout` property. `#4191 `_ - allow use of SameSite in cookies. `#4224 `_ - Use ``loop.sendfile()`` instead of custom implementation if available. `#4269 `_ - Apply SO_REUSEADDR to test server's socket. `#4393 `_ - Use .raw_host instead of slower .host in client API `#4402 `_ - Allow configuring the buffer size of input stream by passing ``read_bufsize`` argument. `#4453 `_ - Pass tests on Python 3.8 for Windows. `#4513 `_ - Add `method` and `url` attributes to `TraceRequestChunkSentParams` and `TraceResponseChunkReceivedParams`. `#4674 `_ - Add ClientResponse.ok property for checking status code under 400. `#4711 `_ - Don't ceil timeouts that are smaller than 5 seconds. `#4850 `_ - TCPSite now listens by default on all interfaces instead of just IPv4 when `None` is passed in as the host. `#4894 `_ - Bump ``http_parser`` to 2.9.4 `#5070 `_ Bugfixes -------- - Fix keepalive connections not being closed in time `#3296 `_ - Fix failed websocket handshake leaving connection hanging. `#3380 `_ - Fix tasks cancellation order on exit. The run_app task needs to be cancelled first for cleanup hooks to run with all tasks intact. `#3805 `_ - Don't start heartbeat until _writer is set `#4062 `_ - Fix handling of multipart file uploads without a content type. `#4089 `_ - Preserve view handler function attributes across middlewares `#4174 `_ - Fix the string representation of ``ServerDisconnectedError``. `#4175 `_ - Raising RuntimeError when trying to get encoding from not read body `#4214 `_ - Remove warning messages from noop. `#4282 `_ - Raise ClientPayloadError if FormData re-processed. `#4345 `_ - Fix a warning about unfinished task in ``web_protocol.py`` `#4408 `_ - Fixed 'deflate' compression. According to RFC 2616 now. `#4506 `_ - Fixed OverflowError on platforms with 32-bit time_t `#4515 `_ - Fixed request.body_exists returns wrong value for methods without body. `#4528 `_ - Fix connecting to link-local IPv6 addresses. `#4554 `_ - Fix a problem with connection waiters that are never awaited. `#4562 `_ - Always make sure transport is not closing before reuse a connection. Reuse a protocol based on keepalive in headers is unreliable. For example, uWSGI will not support keepalive even it serves a HTTP 1.1 request, except explicitly configure uWSGI with a ``--http-keepalive`` option. Servers designed like uWSGI could cause aiohttp intermittently raise a ConnectionResetException when the protocol poll runs out and some protocol is reused. `#4587 `_ - Handle the last CRLF correctly even if it is received via separate TCP segment. `#4630 `_ - Fix the register_resource function to validate route name before splitting it so that route name can include python keywords. `#4691 `_ - Improve typing annotations for ``web.Request``, ``aiohttp.ClientResponse`` and ``multipart`` module. `#4736 `_ - Fix resolver task is not awaited when connector is cancelled `#4795 `_ - Fix a bug "Aiohttp doesn't return any error on invalid request methods" `#4798 `_ - Fix HEAD requests for static content. `#4809 `_ - Fix incorrect size calculation for memoryview `#4890 `_ - Add HTTPMove to _all__. `#4897 `_ - Fixed the type annotations in the ``tracing`` module. `#4912 `_ - Fix typing for multipart ``__aiter__``. `#4931 `_ - Fix for race condition on connections in BaseConnector that leads to exceeding the connection limit. `#4936 `_ - Add forced UTF-8 encoding for ``application/rdap+json`` responses. `#4938 `_ - Fix inconsistency between Python and C http request parsers in parsing pct-encoded URL. `#4972 `_ - Fix connection closing issue in HEAD request. `#5012 `_ - Fix type hint on BaseRunner.addresses (from ``List[str]`` to ``List[Any]``) `#5086 `_ - Make `web.run_app()` more responsive to Ctrl+C on Windows for Python < 3.8. It slightly increases CPU load as a side effect. `#5098 `_ Improved Documentation ---------------------- - Fix example code in client quick-start `#3376 `_ - Updated the docs so there is no contradiction in ``ttl_dns_cache`` default value `#3512 `_ - Add 'Deploy with SSL' to docs. `#4201 `_ - Change typing of the secure argument on StreamResponse.set_cookie from ``Optional[str]`` to ``Optional[bool]`` `#4204 `_ - Changes ``ttl_dns_cache`` type from int to Optional[int]. `#4270 `_ - Simplify README hello word example and add a documentation page for people coming from requests. `#4272 `_ - Improve some code examples in the documentation involving websockets and starting a simple HTTP site with an AppRunner. `#4285 `_ - Fix typo in code example in Multipart docs `#4312 `_ - Fix code example in Multipart section. `#4314 `_ - Update contributing guide so new contributors read the most recent version of that guide. Update command used to create test coverage reporting. `#4810 `_ - Spelling: Change "canonize" to "canonicalize". `#4986 `_ - Add ``aiohttp-sse-client`` library to third party usage list. `#5084 `_ Misc ---- - `#2856 `_, `#4218 `_, `#4250 `_ ---- 3.6.3 (2020-10-12) ================== Bugfixes -------- - Pin yarl to ``<1.6.0`` to avoid buggy behavior that will be fixed by the next aiohttp release. 3.6.2 (2019-10-09) ================== Features -------- - Made exceptions pickleable. Also changed the repr of some exceptions. `#4077 `_ - Use ``Iterable`` type hint instead of ``Sequence`` for ``Application`` *middleware* parameter. `#4125 `_ Bugfixes -------- - Reset the ``sock_read`` timeout each time data is received for a ``aiohttp.ClientResponse``. `#3808 `_ - Fix handling of expired cookies so they are not stored in CookieJar. `#4063 `_ - Fix misleading message in the string representation of ``ClientConnectorError``; ``self.ssl == None`` means default SSL context, not SSL disabled `#4097 `_ - Don't clobber HTTP status when using FileResponse. `#4106 `_ Improved Documentation ---------------------- - Added minimal required logging configuration to logging documentation. `#2469 `_ - Update docs to reflect proxy support. `#4100 `_ - Fix typo in code example in testing docs. `#4108 `_ Misc ---- - `#4102 `_ ---- 3.6.1 (2019-09-19) ================== Features -------- - Compatibility with Python 3.8. `#4056 `_ Bugfixes -------- - correct some exception string format `#4068 `_ - Emit a warning when ``ssl.OP_NO_COMPRESSION`` is unavailable because the runtime is built against an outdated OpenSSL. `#4052 `_ - Update multidict requirement to >= 4.5 `#4057 `_ Improved Documentation ---------------------- - Provide pytest-aiohttp namespace for pytest fixtures in docs. `#3723 `_ ---- 3.6.0 (2019-09-06) ================== Features -------- - Add support for Named Pipes (Site and Connector) under Windows. This feature requires Proactor event loop to work. `#3629 `_ - Removed ``Transfer-Encoding: chunked`` header from websocket responses to be compatible with more http proxy servers. `#3798 `_ - Accept non-GET request for starting websocket handshake on server side. `#3980 `_ Bugfixes -------- - Raise a ClientResponseError instead of an AssertionError for a blank HTTP Reason Phrase. `#3532 `_ - Fix an issue where cookies would sometimes not be set during a redirect. `#3576 `_ - Change normalize_path_middleware to use 308 redirect instead of 301. This behavior should prevent clients from being unable to use PUT/POST methods on endpoints that are redirected because of a trailing slash. `#3579 `_ - Drop the processed task from ``all_tasks()`` list early. It prevents logging about a task with unhandled exception when the server is used in conjunction with ``asyncio.run()``. `#3587 `_ - ``Signal`` type annotation changed from ``Signal[Callable[['TraceConfig'], Awaitable[None]]]`` to ``Signal[Callable[ClientSession, SimpleNamespace, ...]``. `#3595 `_ - Use sanitized URL as Location header in redirects `#3614 `_ - Improve typing annotations for multipart.py along with changes required by mypy in files that references multipart.py. `#3621 `_ - Close session created inside ``aiohttp.request`` when unhandled exception occurs `#3628 `_ - Cleanup per-chunk data in generic data read. Memory leak fixed. `#3631 `_ - Use correct type for add_view and family `#3633 `_ - Fix _keepalive field in __slots__ of ``RequestHandler``. `#3644 `_ - Properly handle ConnectionResetError, to silence the "Cannot write to closing transport" exception when clients disconnect uncleanly. `#3648 `_ - Suppress pytest warnings due to ``test_utils`` classes `#3660 `_ - Fix overshadowing of overlapped sub-application prefixes. `#3701 `_ - Fixed return type annotation for WSMessage.json() `#3720 `_ - Properly expose TooManyRedirects publicly as documented. `#3818 `_ - Fix missing brackets for IPv6 in proxy CONNECT request `#3841 `_ - Make the signature of ``aiohttp.test_utils.TestClient.request`` match ``asyncio.ClientSession.request`` according to the docs `#3852 `_ - Use correct style for re-exported imports, makes mypy ``--strict`` mode happy. `#3868 `_ - Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of View `#3880 `_ - Made cython HTTP parser set Reason-Phrase of the response to an empty string if it is missing. `#3906 `_ - Add URL to the string representation of ClientResponseError. `#3959 `_ - Accept ``istr`` keys in ``LooseHeaders`` type hints. `#3976 `_ - Fixed race conditions in _resolve_host caching and throttling when tracing is enabled. `#4013 `_ - For URLs like "unix://localhost/..." set Host HTTP header to "localhost" instead of "localhost:None". `#4039 `_ Improved Documentation ---------------------- - Modify documentation for Background Tasks to remove deprecated usage of event loop. `#3526 `_ - use ``if __name__ == '__main__':`` in server examples. `#3775 `_ - Update documentation reference to the default access logger. `#3783 `_ - Improve documentation for ``web.BaseRequest.path`` and ``web.BaseRequest.raw_path``. `#3791 `_ - Removed deprecation warning in tracing example docs `#3964 `_ ---- 3.5.4 (2019-01-12) ================== Bugfixes -------- - Fix stream ``.read()`` / ``.readany()`` / ``.iter_any()`` which used to return a partial content only in case of compressed content `#3525 `_ 3.5.3 (2019-01-10) ================== Bugfixes -------- - Fix type stubs for ``aiohttp.web.run_app(access_log=True)`` and fix edge case of ``access_log=True`` and the event loop being in debug mode. `#3504 `_ - Fix ``aiohttp.ClientTimeout`` type annotations to accept ``None`` for fields `#3511 `_ - Send custom per-request cookies even if session jar is empty `#3515 `_ - Restore Linux binary wheels publishing on PyPI ---- 3.5.2 (2019-01-08) ================== Features -------- - ``FileResponse`` from ``web_fileresponse.py`` uses a ``ThreadPoolExecutor`` to work with files asynchronously. I/O based payloads from ``payload.py`` uses a ``ThreadPoolExecutor`` to work with I/O objects asynchronously. `#3313 `_ - Internal Server Errors in plain text if the browser does not support HTML. `#3483 `_ Bugfixes -------- - Preserve MultipartWriter parts headers on write. Refactor the way how ``Payload.headers`` are handled. Payload instances now always have headers and Content-Type defined. Fix Payload Content-Disposition header reset after initial creation. `#3035 `_ - Log suppressed exceptions in ``GunicornWebWorker``. `#3464 `_ - Remove wildcard imports. `#3468 `_ - Use the same task for app initialization and web server handling in gunicorn workers. It allows to use Python3.7 context vars smoothly. `#3471 `_ - Fix handling of chunked+gzipped response when first chunk does not give uncompressed data `#3477 `_ - Replace ``collections.MutableMapping`` with ``collections.abc.MutableMapping`` to avoid a deprecation warning. `#3480 `_ - ``Payload.size`` type annotation changed from ``Optional[float]`` to ``Optional[int]``. `#3484 `_ - Ignore done tasks when cancels pending activities on ``web.run_app`` finalization. `#3497 `_ Improved Documentation ---------------------- - Add documentation for ``aiohttp.web.HTTPException``. `#3490 `_ Misc ---- - `#3487 `_ ---- 3.5.1 (2018-12-24) ==================== - Fix a regression about ``ClientSession._requote_redirect_url`` modification in debug mode. 3.5.0 (2018-12-22) ==================== Features -------- - The library type annotations are checked in strict mode now. - Add support for setting cookies for individual request (`#2387 `_) - Application.add_domain implementation (`#2809 `_) - The default ``app`` in the request returned by ``test_utils.make_mocked_request`` can now have objects assigned to it and retrieved using the ``[]`` operator. (`#3174 `_) - Make ``request.url`` accessible when transport is closed. (`#3177 `_) - Add ``zlib_executor_size`` argument to ``Response`` constructor to allow compression to run in a background executor to avoid blocking the main thread and potentially triggering health check failures. (`#3205 `_) - Enable users to set ``ClientTimeout`` in ``aiohttp.request`` (`#3213 `_) - Don't raise a warning if ``NETRC`` environment variable is not set and ``~/.netrc`` file doesn't exist. (`#3267 `_) - Add default logging handler to web.run_app If the ``Application.debug``` flag is set and the default logger ``aiohttp.access`` is used, access logs will now be output using a *stderr* ``StreamHandler`` if no handlers are attached. Furthermore, if the default logger has no log level set, the log level will be set to ``DEBUG``. (`#3324 `_) - Add method argument to ``session.ws_connect()``. Sometimes server API requires a different HTTP method for WebSocket connection establishment. For example, ``Docker exec`` needs POST. (`#3378 `_) - Create a task per request handling. (`#3406 `_) Bugfixes -------- - Enable passing ``access_log_class`` via ``handler_args`` (`#3158 `_) - Return empty bytes with end-of-chunk marker in empty stream reader. (`#3186 `_) - Accept ``CIMultiDictProxy`` instances for ``headers`` argument in ``web.Response`` constructor. (`#3207 `_) - Don't uppercase HTTP method in parser (`#3233 `_) - Make method match regexp RFC-7230 compliant (`#3235 `_) - Add ``app.pre_frozen`` state to properly handle startup signals in sub-applications. (`#3237 `_) - Enhanced parsing and validation of helpers.BasicAuth.decode. (`#3239 `_) - Change imports from collections module in preparation for 3.8. (`#3258 `_) - Ensure Host header is added first to ClientRequest to better replicate browser (`#3265 `_) - Fix forward compatibility with Python 3.8: importing ABCs directly from the collections module will not be supported anymore. (`#3273 `_) - Keep the query string by ``normalize_path_middleware``. (`#3278 `_) - Fix missing parameter ``raise_for_status`` for aiohttp.request() (`#3290 `_) - Bracket IPv6 addresses in the HOST header (`#3304 `_) - Fix default message for server ping and pong frames. (`#3308 `_) - Fix tests/test_connector.py typo and tests/autobahn/server.py duplicate loop def. (`#3337 `_) - Fix false-negative indicator end_of_HTTP_chunk in StreamReader.readchunk function (`#3361 `_) - Release HTTP response before raising status exception (`#3364 `_) - Fix task cancellation when ``sendfile()`` syscall is used by static file handling. (`#3383 `_) - Fix stack trace for ``asyncio.TimeoutError`` which was not logged, when it is caught in the handler. (`#3414 `_) Improved Documentation ---------------------- - Improve documentation of ``Application.make_handler`` parameters. (`#3152 `_) - Fix BaseRequest.raw_headers doc. (`#3215 `_) - Fix typo in TypeError exception reason in ``web.Application._handle`` (`#3229 `_) - Make server access log format placeholder %b documentation reflect behavior and docstring. (`#3307 `_) Deprecations and Removals ------------------------- - Deprecate modification of ``session.requote_redirect_url`` (`#2278 `_) - Deprecate ``stream.unread_data()`` (`#3260 `_) - Deprecated use of boolean in ``resp.enable_compression()`` (`#3318 `_) - Encourage creation of aiohttp public objects inside a coroutine (`#3331 `_) - Drop dead ``Connection.detach()`` and ``Connection.writer``. Both methods were broken for more than 2 years. (`#3358 `_) - Deprecate ``app.loop``, ``request.loop``, ``client.loop`` and ``connector.loop`` properties. (`#3374 `_) - Deprecate explicit debug argument. Use asyncio debug mode instead. (`#3381 `_) - Deprecate body parameter in HTTPException (and derived classes) constructor. (`#3385 `_) - Deprecate bare connector close, use ``async with connector:`` and ``await connector.close()`` instead. (`#3417 `_) - Deprecate obsolete ``read_timeout`` and ``conn_timeout`` in ``ClientSession`` constructor. (`#3438 `_) Misc ---- - #3341, #3351 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/CONTRIBUTORS.txt0000644000175100001710000001170500000000000015235 0ustar00runnerdocker- Contributors - ---------------- A. Jesse Jiryu Davis Adam Bannister Adam Cooper Adam Horacek Adam Mills Adrian Krupa Adrián Chaves Ahmed Tahri Alan Tse Alec Hanefeld Alejandro Gómez Aleksandr Danshyn Aleksey Kutepov Alex Hayes Alex Key Alex Khomchenko Alex Kuzmenko Alex Lisovoy Alexander Bayandin Alexander Karpinsky Alexander Koshevoy Alexander Malev Alexander Mohr Alexander Shorin Alexander Travov Alexandru Mihai Alexey Firsov Alexey Popravka Alexey Stepanov Amin Etesamian Amit Tulshyan Amy Boyle Anas El Amraoui Anders Melchiorsen Andrei Ursulenko Andrej Antonov Andrew Leech Andrew Lytvyn Andrew Svetlov Andrew Zhou Andrii Soldatenko Anes Abismail Antoine Pietri Anton Kasyanov Anton Zhdan-Pushkin Arseny Timoniq Artem Yushkovskiy Arthur Darcet Austin Scola Ben Bader Ben Timby Benedikt Reinartz Bob Haddleton Boris Feld Boyi Chen Brett Cannon Brian Bouterse Brian C. Lane Brian Muller Bruce Merry Bryan Kok Bryce Drennan Carl George Cecile Tonglet Chien-Wei Huang Chih-Yuan Chen Chris AtLee Chris Laws Chris Moore Christopher Schmitt Claudiu Popa Colin Dunklau Cong Xu Damien Nadé Dan King Dan Xu Daniel García Daniel Grossmann-Kavanagh Daniel Nelson Danny Song David Bibb David Michael Brown Denilson Amorim Denis Matiychuk Denis Moshensky Dennis Kliban Dima Veselov Dimitar Dimitrov Dmitriy Safonov Dmitry Doroshev Dmitry Erlikh Dmitry Lukashin Dmitry Marakasov Dmitry Shamov Dmitry Trofimov Dmytro Bohomiakov Dmytro Kuznetsov Dustin J. Mitchell Eduard Iskandarov Eli Ribble Elizabeth Leddy Enrique Saez Eric Sheng Erich Healy Erik Peterson Eugene Chernyshov Eugene Naydenov Eugene Nikolaiev Eugene Tolmachev Evan Kepner Evert Lammerts Felix Yan Fernanda Guimarães FichteFoll Florian Scheffler Franek Magiera Frederik Gladhorn Frederik Peter Aalund Gabriel Tremblay Gary Wilson Jr. Gennady Andreyev Georges Dubus Greg Holt Gregory Haynes Gus Goulart Gustavo Carneiro Günther Jena Hans Adema Harmon Y. Harry Liu Hiroshi Ogawa Hrishikesh Paranjape Hu Bo Hugh Young Hugo Herter Hugo van Kemenade Hynek Schlawack Igor Alexandrov Igor Davydenko Igor Mozharovsky Igor Pavlov Illia Volochii Ilya Chichak Ilya Gruzinov Ingmar Steen Jacob Champion Jaesung Lee Jake Davis Jakob Ackermann Jakub Wilk Jan Buchar Jashandeep Sohi Jens Steinhauser Jeonghun Lee Jeongkyu Shin Jeroen van der Heijden Jesus Cea Jian Zeng Jinkyu Yi Joel Watts Jon Nabozny Jonas Krüger Svensson Jonas Obrist Jonathan Wright Jonny Tan Joongi Kim Jordan Borean Josep Cugat Josh Junon Joshu Coats Julia Tsemusheva Julien Duponchelle Jungkook Park Junjie Tao Junyeong Jeong Justas Trimailovas Justin Foo Justin Turner Arthur Kay Zheng Kevin Samuel Kimmo Parviainen-Jalanko Kirill Klenov Kirill Malovitsa Konstantin Valetov Krzysztof Blazewicz Kyrylo Perevozchikov Kyungmin Lee Lars P. Søndergaard Liu Hua Louis-Philippe Huberdeau Loïc Lajeanne Lu Gong Lubomir Gelo Ludovic Gasc Luis Pedrosa Lukasz Marcin Dobrzanski Makc Belousow Manuel Miranda Marat Sharafutdinov Marco Paolini Mariano Anaya Mariusz Masztalerczuk Marko Kohtala Martijn Pieters Martin Melka Martin Richard Mathias Fröjdman Mathieu Dugré Matthieu Hauglustaine Matthieu Rigal Michael Ihnatenko Michał Górny Mikhail Burshteyn Mikhail Kashkin Mikhail Lukyanchenko Mikhail Nacharov Misha Behersky Mitchell Ferree Morgan Delahaye-Prat Moss Collum Mun Gwan-gyeong Navid Sheikhol Nicolas Braem Nikolay Kim Nikolay Novik Nándor Mátravölgyi Oisin Aylward Olaf Conradi Pahaz Blinov Panagiotis Kolokotronis Pankaj Pandey Pau Freixes Paul Colomiets Paulius Šileikis Paulus Schoutsen Pavel Kamaev Pavel Polyakov Pavel Sapezhko Pavol Vargovčík Pawel Kowalski Pawel Miech Pepe Osca Philipp A. Pieter van Beek Qiao Han Rafael Viotti Raphael Bialon Raúl Cumplido Required Field Robert Lu Robert Nikolich Roman Podoliaka Samuel Colvin Sean Hunt Sebastian Acuna Sebastian Hanula Sebastian Hüther Sebastien Geffroy SeongSoo Cho Sergey Ninua Sergey Skripnick Serhii Charykov Serhii Kostel Serhiy Storchaka Simon Kennedy Sin-Woo Bang Stanislas Plum Stanislav Prokop Stefan Tjarks Stepan Pletnev Stephan Jaensch Stephen Cirelli Stephen Granade Steven Seguin Sunghyun Hwang Sunit Deshpande Sviatoslav Bulbakha Sviatoslav Sydorenko Taha Jahangir Taras Voinarovskyi Terence Honles Thanos Lefteris Thijs Vermeir Thomas Forbes Thomas Grainger Tolga Tezel Tomasz Trebski Toshiaki Tanaka Trinh Hoang Nhu Vadim Suharnikov Vaibhav Sagar Vamsi Krishna Avula Vasiliy Faronov Vasyl Baran Viacheslav Greshilov Victor Collod Victor Kovtun Vikas Kawadia Viktor Danyliuk Ville Skyttä Vincent Maillol Vitalik Verhovodov Vitaly Haritonsky Vitaly Magerya Vladimir Kamarzin Vladimir Kozlovski Vladimir Rutsky Vladimir Shulyak Vladimir Zakharov Vladyslav Bohaichuk Vladyslav Bondar W. Trevor King Wei Lin Weiwei Wang Will Fatherley Will McGugan Willem de Groot William Grzybowski William S. Wilson Ong Yang Zhou Yannick Koechlin Yannick Péroux Ye Cao Yegor Roganov Yifei Kong Young-Ho Cha Yuriy Shatrov Yury Pliner Yury Selivanov Yusuke Tsutsumi Yuval Ofir Zeal Wierslee Zlatan Sičanica Марк Коренберг Семён Марьясин ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/LICENSE.txt0000644000175100001710000000112700000000000014357 0ustar00runnerdocker Copyright 2013-2020 aio-libs collaboration. 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. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/MANIFEST.in0000644000175100001710000000061200000000000014270 0ustar00runnerdockerinclude LICENSE.txt include CHANGES.rst include README.rst include CONTRIBUTORS.txt include Makefile graft aiohttp graft docs graft examples graft tests recursive-include vendor * global-include aiohttp *.pyi global-exclude *.pyc global-exclude *.pyd global-exclude *.so global-exclude *.lib global-exclude *.dll global-exclude *.a global-exclude *.obj exclude aiohttp/*.html prune docs/_build ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/Makefile0000644000175100001710000001221600000000000014175 0ustar00runnerdocker# Some simple testing tasks (sorry, UNIX only). to-hash-one = $(dir $1).hash/$(addsuffix .hash,$(notdir $1)) to-hash = $(foreach fname,$1,$(call to-hash-one,$(fname))) CYS := $(wildcard aiohttp/*.pyx) $(wildcard aiohttp/*.pyi) $(wildcard aiohttp/*.pxd) PYXS := $(wildcard aiohttp/*.pyx) CS := $(wildcard aiohttp/*.c) PYS := $(wildcard aiohttp/*.py) IN := doc-spelling lint cython dev ALLS := $(sort $(CYS) $(CS) $(PYS) $(REQS)) .PHONY: all all: test tst: @echo $(call to-hash,requirements/cython.txt) @echo $(call to-hash,aiohttp/%.pyx) # Recipe from https://www.cmcrossroads.com/article/rebuilding-when-files-checksum-changes FORCE: # check_sum.py works perfectly fine but slow when called for every file from $(ALLS) # (perhaps even several times for each file). # That is why much less readable but faster solution exists ifneq (, $(shell which sha256sum)) %.hash: FORCE $(eval $@_ABS := $(abspath $@)) $(eval $@_NAME := $($@_ABS)) $(eval $@_HASHDIR := $(dir $($@_ABS))) $(eval $@_TMP := $($@_HASHDIR)../$(notdir $($@_ABS))) $(eval $@_ORIG := $(subst /.hash/../,/,$(basename $($@_TMP)))) @#echo ==== $($@_ABS) $($@_HASHDIR) $($@_NAME) $($@_TMP) $($@_ORIG) @if ! (sha256sum --check $($@_ABS) 1>/dev/null 2>/dev/null); then \ mkdir -p $($@_HASHDIR); \ echo re-hash $($@_ORIG); \ sha256sum $($@_ORIG) > $($@_ABS); \ fi else %.hash: FORCE @./tools/check_sum.py $@ # --debug endif # Enumerate intermediate files to don't remove them automatically. .SECONDARY: $(call to-hash,$(ALLS)) .update-pip: @python -m pip install --upgrade pip .install-cython: .update-pip $(call to-hash,requirements/cython.txt) @pip install -r requirements/cython.txt -c requirements/constraints.txt @touch .install-cython aiohttp/_find_header.c: $(call to-hash,aiohttp/hdrs.py ./tools/gen.py) ./tools/gen.py # _find_headers generator creates _headers.pyi as well aiohttp/%.c: aiohttp/%.pyx $(call to-hash,$(CYS)) aiohttp/_find_header.c cython -3 -o $@ $< -I aiohttp vendor/llhttp/node_modules: vendor/llhttp/package.json cd vendor/llhttp; npm install .llhttp-gen: vendor/llhttp/node_modules $(MAKE) -C vendor/llhttp generate @touch .llhttp-gen .PHONY: generate-llhttp generate-llhttp: .llhttp-gen .PHONY: cythonize cythonize: .install-cython $(PYXS:.pyx=.c) .install-deps: .install-cython $(PYXS:.pyx=.c) $(call to-hash,$(CYS) $(REQS)) @pip install -r requirements/dev.txt -c requirements/constraints.txt @touch .install-deps .PHONY: lint lint: fmt mypy .PHONY: fmt format fmt format: python -m pre_commit run --all-files --show-diff-on-failure .PHONY: mypy mypy: mypy .develop: .install-deps generate-llhttp $(call to-hash,$(PYS) $(CYS) $(CS)) pip install -e . -c requirements/constraints.txt @touch .develop .PHONY: test test: .develop @pytest -q .PHONY: vtest vtest: .develop @pytest -s -v .PHONY: vvtest vvtest: .develop @pytest -vv define run_tests_in_docker DOCKER_BUILDKIT=1 docker build --build-arg PYTHON_VERSION=$(1) --build-arg AIOHTTP_NO_EXTENSIONS=$(2) -t "aiohttp-test-$(1)-$(2)" -f tools/testing/Dockerfile . docker run --rm -ti -v `pwd`:/src -w /src "aiohttp-test-$(1)-$(2)" $(TEST_SPEC) endef .PHONY: test-3.7-no-extensions test-3.7 test-3.8-no-extensions test-3.8 test-3.9-no-extensions test-3.9 test-3.10-no-extensions test-3.10 test-3.7-no-extensions: $(call run_tests_in_docker,3.7,y) test-3.7: $(call run_tests_in_docker,3.7,n) test-3.8-no-extensions: $(call run_tests_in_docker,3.8,y) test-3.8: $(call run_tests_in_docker,3.8,n) test-3.9-no-extensions: $(call run_tests_in_docker,3.9,y) test-3.9: $(call run_tests_in_docker,3.9,n) test-3.10-no-extensions: $(call run_tests_in_docker,3.10,y) test-3.10: $(call run_tests_in_docker,3.10,n) .PHONY: clean clean: @rm -rf `find . -name __pycache__` @rm -rf `find . -name .hash` @rm -rf `find . -name .md5` # old styling @rm -f `find . -type f -name '*.py[co]' ` @rm -f `find . -type f -name '*~' ` @rm -f `find . -type f -name '.*~' ` @rm -f `find . -type f -name '@*' ` @rm -f `find . -type f -name '#*#' ` @rm -f `find . -type f -name '*.orig' ` @rm -f `find . -type f -name '*.rej' ` @rm -f `find . -type f -name '*.md5' ` # old styling @rm -f .coverage @rm -rf htmlcov @rm -rf build @rm -rf cover @make -C docs clean @python setup.py clean @rm -f aiohttp/*.so @rm -f aiohttp/*.pyd @rm -f aiohttp/*.html @rm -f aiohttp/_frozenlist.c @rm -f aiohttp/_find_header.c @rm -f aiohttp/_http_parser.c @rm -f aiohttp/_http_writer.c @rm -f aiohttp/_websocket.c @rm -rf .tox @rm -f .develop @rm -f .flake @rm -rf aiohttp.egg-info @rm -f .install-deps @rm -f .install-cython @rm -rf vendor/llhttp/node_modules @rm -f .llhttp-gen @$(MAKE) -C vendor/llhttp clean .PHONY: doc doc: @make -C docs html SPHINXOPTS="-W --keep-going -n -E" @echo "open file://`pwd`/docs/_build/html/index.html" .PHONY: doc-spelling doc-spelling: @make -C docs spelling SPHINXOPTS="-W --keep-going -n -E" .PHONY: compile-deps compile-deps: .update-pip $(REQS) pip-compile --no-header --allow-unsafe -q --strip-extras \ -o requirements/constraints.txt \ requirements/constraints.in .PHONY: install install: .update-pip @pip install -r requirements/dev.txt -c requirements/constraints.txt .PHONY: install-dev install-dev: .develop ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0784526 aiohttp-3.8.1/PKG-INFO0000644000175100001710000001511700000000000013635 0ustar00runnerdockerMetadata-Version: 2.1 Name: aiohttp Version: 3.8.1 Summary: Async http client/server framework (asyncio) Home-page: https://github.com/aio-libs/aiohttp Maintainer: aiohttp team Maintainer-email: team@aiohttp.org License: Apache 2 Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp Project-URL: Docs: Changelog, https://docs.aiohttp.org/en/stable/changes.html Project-URL: Docs: RTD, https://docs.aiohttp.org Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: AsyncIO Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Apache Software License Classifier: Operating System :: POSIX Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft :: Windows Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Topic :: Internet :: WWW/HTTP Requires-Python: >=3.6 Description-Content-Type: text/x-rst Provides-Extra: speedups License-File: LICENSE.txt ================================== Async http client/server framework ================================== .. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg :height: 64px :width: 64px :alt: aiohttp logo | .. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI :alt: GitHub Actions status for master branch .. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg :target: https://codecov.io/gh/aio-libs/aiohttp :alt: codecov.io status for master branch .. image:: https://badge.fury.io/py/aiohttp.svg :target: https://pypi.org/project/aiohttp :alt: Latest PyPI package version .. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest :target: https://docs.aiohttp.org/ :alt: Latest Read The Docs .. image:: https://img.shields.io/discourse/status?server=https%3A%2F%2Faio-libs.discourse.group :target: https://aio-libs.discourse.group :alt: Discourse status .. image:: https://badges.gitter.im/Join%20Chat.svg :target: https://gitter.im/aio-libs/Lobby :alt: Chat on Gitter Key Features ============ - Supports both client and server side of HTTP protocol. - Supports both client and server Web-Sockets out-of-the-box and avoids Callback Hell. - Provides Web-server with middlewares and plugable routing. Getting started =============== Client ------ To get something from the web: .. code-block:: python import aiohttp import asyncio async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: print("Status:", response.status) print("Content-type:", response.headers['content-type']) html = await response.text() print("Body:", html[:15], "...") loop = asyncio.get_event_loop() loop.run_until_complete(main()) This prints: .. code-block:: Status: 200 Content-type: text/html; charset=utf-8 Body: ... Coming from `requests `_ ? Read `why we need so many lines `_. Server ------ An example using a simple server: .. code-block:: python # examples/server_simple.py from aiohttp import web async def handle(request): name = request.match_info.get('name', "Anonymous") text = "Hello, " + name return web.Response(text=text) async def wshandle(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: if msg.type == web.WSMsgType.text: await ws.send_str("Hello, {}".format(msg.data)) elif msg.type == web.WSMsgType.binary: await ws.send_bytes(msg.data) elif msg.type == web.WSMsgType.close: break return ws app = web.Application() app.add_routes([web.get('/', handle), web.get('/echo', wshandle), web.get('/{name}', handle)]) if __name__ == '__main__': web.run_app(app) Documentation ============= https://aiohttp.readthedocs.io/ Demos ===== https://github.com/aio-libs/aiohttp-demos External links ============== * `Third party libraries `_ * `Built with aiohttp `_ * `Powered by aiohttp `_ Feel free to make a Pull Request for adding your link to these pages! Communication channels ====================== *aio-libs discourse group*: https://aio-libs.discourse.group *gitter chat* https://gitter.im/aio-libs/Lobby We support `Stack Overflow `_. Please add *aiohttp* tag to your question there. Requirements ============ - Python >= 3.6 - async-timeout_ - attrs_ - charset-normalizer_ - multidict_ - yarl_ Optionally you may install the cChardet_ and aiodns_ libraries (highly recommended for sake of speed). .. _charset-normalizer: https://pypi.org/project/charset-normalizer .. _aiodns: https://pypi.python.org/pypi/aiodns .. _attrs: https://github.com/python-attrs/attrs .. _multidict: https://pypi.python.org/pypi/multidict .. _yarl: https://pypi.python.org/pypi/yarl .. _async-timeout: https://pypi.python.org/pypi/async_timeout .. _cChardet: https://pypi.python.org/pypi/cchardet License ======= ``aiohttp`` is offered under the Apache 2 license. Keepsafe ======== The aiohttp community would like to thank Keepsafe (https://www.getkeepsafe.com) for its support in the early days of the project. Source code =========== The latest developer version is available in a GitHub repository: https://github.com/aio-libs/aiohttp Benchmarks ========== If you are interested in efficiency, the AsyncIO community maintains a list of benchmarks on the official wiki: https://github.com/python/asyncio/wiki/Benchmarks ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/README.rst0000644000175100001710000001202400000000000014221 0ustar00runnerdocker================================== Async http client/server framework ================================== .. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg :height: 64px :width: 64px :alt: aiohttp logo | .. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI :alt: GitHub Actions status for master branch .. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg :target: https://codecov.io/gh/aio-libs/aiohttp :alt: codecov.io status for master branch .. image:: https://badge.fury.io/py/aiohttp.svg :target: https://pypi.org/project/aiohttp :alt: Latest PyPI package version .. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest :target: https://docs.aiohttp.org/ :alt: Latest Read The Docs .. image:: https://img.shields.io/discourse/status?server=https%3A%2F%2Faio-libs.discourse.group :target: https://aio-libs.discourse.group :alt: Discourse status .. image:: https://badges.gitter.im/Join%20Chat.svg :target: https://gitter.im/aio-libs/Lobby :alt: Chat on Gitter Key Features ============ - Supports both client and server side of HTTP protocol. - Supports both client and server Web-Sockets out-of-the-box and avoids Callback Hell. - Provides Web-server with middlewares and plugable routing. Getting started =============== Client ------ To get something from the web: .. code-block:: python import aiohttp import asyncio async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: print("Status:", response.status) print("Content-type:", response.headers['content-type']) html = await response.text() print("Body:", html[:15], "...") loop = asyncio.get_event_loop() loop.run_until_complete(main()) This prints: .. code-block:: Status: 200 Content-type: text/html; charset=utf-8 Body: ... Coming from `requests `_ ? Read `why we need so many lines `_. Server ------ An example using a simple server: .. code-block:: python # examples/server_simple.py from aiohttp import web async def handle(request): name = request.match_info.get('name', "Anonymous") text = "Hello, " + name return web.Response(text=text) async def wshandle(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: if msg.type == web.WSMsgType.text: await ws.send_str("Hello, {}".format(msg.data)) elif msg.type == web.WSMsgType.binary: await ws.send_bytes(msg.data) elif msg.type == web.WSMsgType.close: break return ws app = web.Application() app.add_routes([web.get('/', handle), web.get('/echo', wshandle), web.get('/{name}', handle)]) if __name__ == '__main__': web.run_app(app) Documentation ============= https://aiohttp.readthedocs.io/ Demos ===== https://github.com/aio-libs/aiohttp-demos External links ============== * `Third party libraries `_ * `Built with aiohttp `_ * `Powered by aiohttp `_ Feel free to make a Pull Request for adding your link to these pages! Communication channels ====================== *aio-libs discourse group*: https://aio-libs.discourse.group *gitter chat* https://gitter.im/aio-libs/Lobby We support `Stack Overflow `_. Please add *aiohttp* tag to your question there. Requirements ============ - Python >= 3.6 - async-timeout_ - attrs_ - charset-normalizer_ - multidict_ - yarl_ Optionally you may install the cChardet_ and aiodns_ libraries (highly recommended for sake of speed). .. _charset-normalizer: https://pypi.org/project/charset-normalizer .. _aiodns: https://pypi.python.org/pypi/aiodns .. _attrs: https://github.com/python-attrs/attrs .. _multidict: https://pypi.python.org/pypi/multidict .. _yarl: https://pypi.python.org/pypi/yarl .. _async-timeout: https://pypi.python.org/pypi/async_timeout .. _cChardet: https://pypi.python.org/pypi/cchardet License ======= ``aiohttp`` is offered under the Apache 2 license. Keepsafe ======== The aiohttp community would like to thank Keepsafe (https://www.getkeepsafe.com) for its support in the early days of the project. Source code =========== The latest developer version is available in a GitHub repository: https://github.com/aio-libs/aiohttp Benchmarks ========== If you are interested in efficiency, the AsyncIO community maintains a list of benchmarks on the official wiki: https://github.com/python/asyncio/wiki/Benchmarks ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0024514 aiohttp-3.8.1/aiohttp/0000755000175100001710000000000000000000000014203 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0064514 aiohttp-3.8.1/aiohttp/.hash/0000755000175100001710000000000000000000000015204 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920314.0 aiohttp-3.8.1/aiohttp/.hash/_cparser.pxd.hash0000644000175100001710000000017100000000000020440 0ustar00runnerdockere6d134d56d5f516ab2b5c3b295d0d440a3bef911f4384d506204018895a1f833 /home/runner/work/aiohttp/aiohttp/aiohttp/_cparser.pxd ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920314.0 aiohttp-3.8.1/aiohttp/.hash/_find_header.pxd.hash0000644000175100001710000000017500000000000021235 0ustar00runnerdockerd067f01423cddb3c442933b5fcc039b18ab651fcec1bc91c577693aafc25cf78 /home/runner/work/aiohttp/aiohttp/aiohttp/_find_header.pxd ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920314.0 aiohttp-3.8.1/aiohttp/.hash/_helpers.pyi.hash0000644000175100001710000000017100000000000020451 0ustar00runnerdocker6682a22524b9d4fc442e123672622be7bdfb6238d9709b7b15b2113b7ca6d52b /home/runner/work/aiohttp/aiohttp/aiohttp/_helpers.pyi ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920314.0 aiohttp-3.8.1/aiohttp/.hash/_helpers.pyx.hash0000644000175100001710000000017100000000000020470 0ustar00runnerdocker5de2db35fb795ffe227e2f1007c8ba4f2ad1b9aca28cc48edc80c779203cf6e3 /home/runner/work/aiohttp/aiohttp/aiohttp/_helpers.pyx ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920314.0 aiohttp-3.8.1/aiohttp/.hash/_http_parser.pyx.hash0000644000175100001710000000017500000000000021365 0ustar00runnerdocker345b08ac0432cd6a201c76b25419ea59487e19e179a21a716e191ed9fb0fd871 /home/runner/work/aiohttp/aiohttp/aiohttp/_http_parser.pyx ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920314.0 aiohttp-3.8.1/aiohttp/.hash/_http_writer.pyx.hash0000644000175100001710000000017500000000000021405 0ustar00runnerdocker6881c0a7c838655e646c645d99971efaf5e310bc3633a7c62b226e39d81842ac /home/runner/work/aiohttp/aiohttp/aiohttp/_http_writer.pyx ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920314.0 aiohttp-3.8.1/aiohttp/.hash/_websocket.pyx.hash0000644000175100001710000000017300000000000021016 0ustar00runnerdockerd57b8e48d0c26f20ebcc5e6e300da2b2a6aeb12b3c9768d64cb0e53432ccf48a /home/runner/work/aiohttp/aiohttp/aiohttp/_websocket.pyx ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920313.0 aiohttp-3.8.1/aiohttp/.hash/hdrs.py.hash0000644000175100001710000000016400000000000017441 0ustar00runnerdockera30351c34760a1d7835b2a1b0552e463cf1d2db90da0cdb473313dc66e34a031 /home/runner/work/aiohttp/aiohttp/aiohttp/hdrs.py ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/__init__.py0000644000175100001710000001532600000000000016323 0ustar00runnerdocker__version__ = "3.8.1" from typing import Tuple from . import hdrs as hdrs from .client import ( BaseConnector as BaseConnector, ClientConnectionError as ClientConnectionError, ClientConnectorCertificateError as ClientConnectorCertificateError, ClientConnectorError as ClientConnectorError, ClientConnectorSSLError as ClientConnectorSSLError, ClientError as ClientError, ClientHttpProxyError as ClientHttpProxyError, ClientOSError as ClientOSError, ClientPayloadError as ClientPayloadError, ClientProxyConnectionError as ClientProxyConnectionError, ClientRequest as ClientRequest, ClientResponse as ClientResponse, ClientResponseError as ClientResponseError, ClientSession as ClientSession, ClientSSLError as ClientSSLError, ClientTimeout as ClientTimeout, ClientWebSocketResponse as ClientWebSocketResponse, ContentTypeError as ContentTypeError, Fingerprint as Fingerprint, InvalidURL as InvalidURL, NamedPipeConnector as NamedPipeConnector, RequestInfo as RequestInfo, ServerConnectionError as ServerConnectionError, ServerDisconnectedError as ServerDisconnectedError, ServerFingerprintMismatch as ServerFingerprintMismatch, ServerTimeoutError as ServerTimeoutError, TCPConnector as TCPConnector, TooManyRedirects as TooManyRedirects, UnixConnector as UnixConnector, WSServerHandshakeError as WSServerHandshakeError, request as request, ) from .cookiejar import CookieJar as CookieJar, DummyCookieJar as DummyCookieJar from .formdata import FormData as FormData from .helpers import BasicAuth, ChainMapProxy, ETag from .http import ( HttpVersion as HttpVersion, HttpVersion10 as HttpVersion10, HttpVersion11 as HttpVersion11, WebSocketError as WebSocketError, WSCloseCode as WSCloseCode, WSMessage as WSMessage, WSMsgType as WSMsgType, ) from .multipart import ( BadContentDispositionHeader as BadContentDispositionHeader, BadContentDispositionParam as BadContentDispositionParam, BodyPartReader as BodyPartReader, MultipartReader as MultipartReader, MultipartWriter as MultipartWriter, content_disposition_filename as content_disposition_filename, parse_content_disposition as parse_content_disposition, ) from .payload import ( PAYLOAD_REGISTRY as PAYLOAD_REGISTRY, AsyncIterablePayload as AsyncIterablePayload, BufferedReaderPayload as BufferedReaderPayload, BytesIOPayload as BytesIOPayload, BytesPayload as BytesPayload, IOBasePayload as IOBasePayload, JsonPayload as JsonPayload, Payload as Payload, StringIOPayload as StringIOPayload, StringPayload as StringPayload, TextIOPayload as TextIOPayload, get_payload as get_payload, payload_type as payload_type, ) from .payload_streamer import streamer as streamer from .resolver import ( AsyncResolver as AsyncResolver, DefaultResolver as DefaultResolver, ThreadedResolver as ThreadedResolver, ) from .streams import ( EMPTY_PAYLOAD as EMPTY_PAYLOAD, DataQueue as DataQueue, EofStream as EofStream, FlowControlDataQueue as FlowControlDataQueue, StreamReader as StreamReader, ) from .tracing import ( TraceConfig as TraceConfig, TraceConnectionCreateEndParams as TraceConnectionCreateEndParams, TraceConnectionCreateStartParams as TraceConnectionCreateStartParams, TraceConnectionQueuedEndParams as TraceConnectionQueuedEndParams, TraceConnectionQueuedStartParams as TraceConnectionQueuedStartParams, TraceConnectionReuseconnParams as TraceConnectionReuseconnParams, TraceDnsCacheHitParams as TraceDnsCacheHitParams, TraceDnsCacheMissParams as TraceDnsCacheMissParams, TraceDnsResolveHostEndParams as TraceDnsResolveHostEndParams, TraceDnsResolveHostStartParams as TraceDnsResolveHostStartParams, TraceRequestChunkSentParams as TraceRequestChunkSentParams, TraceRequestEndParams as TraceRequestEndParams, TraceRequestExceptionParams as TraceRequestExceptionParams, TraceRequestRedirectParams as TraceRequestRedirectParams, TraceRequestStartParams as TraceRequestStartParams, TraceResponseChunkReceivedParams as TraceResponseChunkReceivedParams, ) __all__: Tuple[str, ...] = ( "hdrs", # client "BaseConnector", "ClientConnectionError", "ClientConnectorCertificateError", "ClientConnectorError", "ClientConnectorSSLError", "ClientError", "ClientHttpProxyError", "ClientOSError", "ClientPayloadError", "ClientProxyConnectionError", "ClientResponse", "ClientRequest", "ClientResponseError", "ClientSSLError", "ClientSession", "ClientTimeout", "ClientWebSocketResponse", "ContentTypeError", "Fingerprint", "InvalidURL", "RequestInfo", "ServerConnectionError", "ServerDisconnectedError", "ServerFingerprintMismatch", "ServerTimeoutError", "TCPConnector", "TooManyRedirects", "UnixConnector", "NamedPipeConnector", "WSServerHandshakeError", "request", # cookiejar "CookieJar", "DummyCookieJar", # formdata "FormData", # helpers "BasicAuth", "ChainMapProxy", "ETag", # http "HttpVersion", "HttpVersion10", "HttpVersion11", "WSMsgType", "WSCloseCode", "WSMessage", "WebSocketError", # multipart "BadContentDispositionHeader", "BadContentDispositionParam", "BodyPartReader", "MultipartReader", "MultipartWriter", "content_disposition_filename", "parse_content_disposition", # payload "AsyncIterablePayload", "BufferedReaderPayload", "BytesIOPayload", "BytesPayload", "IOBasePayload", "JsonPayload", "PAYLOAD_REGISTRY", "Payload", "StringIOPayload", "StringPayload", "TextIOPayload", "get_payload", "payload_type", # payload_streamer "streamer", # resolver "AsyncResolver", "DefaultResolver", "ThreadedResolver", # streams "DataQueue", "EMPTY_PAYLOAD", "EofStream", "FlowControlDataQueue", "StreamReader", # tracing "TraceConfig", "TraceConnectionCreateEndParams", "TraceConnectionCreateStartParams", "TraceConnectionQueuedEndParams", "TraceConnectionQueuedStartParams", "TraceConnectionReuseconnParams", "TraceDnsCacheHitParams", "TraceDnsCacheMissParams", "TraceDnsResolveHostEndParams", "TraceDnsResolveHostStartParams", "TraceRequestChunkSentParams", "TraceRequestEndParams", "TraceRequestExceptionParams", "TraceRequestRedirectParams", "TraceRequestStartParams", "TraceResponseChunkReceivedParams", ) try: from .worker import GunicornUVLoopWebWorker, GunicornWebWorker __all__ += ("GunicornWebWorker", "GunicornUVLoopWebWorker") except ImportError: # pragma: no cover pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/_cparser.pxd0000644000175100001710000001160600000000000016522 0ustar00runnerdockerfrom libc.stdint cimport ( int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, ) cdef extern from "../vendor/llhttp/build/llhttp.h": struct llhttp__internal_s: int32_t _index void* _span_pos0 void* _span_cb0 int32_t error const char* reason const char* error_pos void* data void* _current uint64_t content_length uint8_t type uint8_t method uint8_t http_major uint8_t http_minor uint8_t header_state uint8_t lenient_flags uint8_t upgrade uint8_t finish uint16_t flags uint16_t status_code void* settings ctypedef llhttp__internal_s llhttp__internal_t ctypedef llhttp__internal_t llhttp_t ctypedef int (*llhttp_data_cb)(llhttp_t*, const char *at, size_t length) except -1 ctypedef int (*llhttp_cb)(llhttp_t*) except -1 struct llhttp_settings_s: llhttp_cb on_message_begin llhttp_data_cb on_url llhttp_data_cb on_status llhttp_data_cb on_header_field llhttp_data_cb on_header_value llhttp_cb on_headers_complete llhttp_data_cb on_body llhttp_cb on_message_complete llhttp_cb on_chunk_header llhttp_cb on_chunk_complete llhttp_cb on_url_complete llhttp_cb on_status_complete llhttp_cb on_header_field_complete llhttp_cb on_header_value_complete ctypedef llhttp_settings_s llhttp_settings_t enum llhttp_errno: HPE_OK, HPE_INTERNAL, HPE_STRICT, HPE_LF_EXPECTED, HPE_UNEXPECTED_CONTENT_LENGTH, HPE_CLOSED_CONNECTION, HPE_INVALID_METHOD, HPE_INVALID_URL, HPE_INVALID_CONSTANT, HPE_INVALID_VERSION, HPE_INVALID_HEADER_TOKEN, HPE_INVALID_CONTENT_LENGTH, HPE_INVALID_CHUNK_SIZE, HPE_INVALID_STATUS, HPE_INVALID_EOF_STATE, HPE_INVALID_TRANSFER_ENCODING, HPE_CB_MESSAGE_BEGIN, HPE_CB_HEADERS_COMPLETE, HPE_CB_MESSAGE_COMPLETE, HPE_CB_CHUNK_HEADER, HPE_CB_CHUNK_COMPLETE, HPE_PAUSED, HPE_PAUSED_UPGRADE, HPE_USER ctypedef llhttp_errno llhttp_errno_t enum llhttp_flags: F_CONNECTION_KEEP_ALIVE, F_CONNECTION_CLOSE, F_CONNECTION_UPGRADE, F_CHUNKED, F_UPGRADE, F_CONTENT_LENGTH, F_SKIPBODY, F_TRAILING, F_TRANSFER_ENCODING enum llhttp_lenient_flags: LENIENT_HEADERS, LENIENT_CHUNKED_LENGTH enum llhttp_type: HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH enum llhttp_finish_t: HTTP_FINISH_SAFE, HTTP_FINISH_SAFE_WITH_CB, HTTP_FINISH_UNSAFE enum llhttp_method: HTTP_DELETE, HTTP_GET, HTTP_HEAD, HTTP_POST, HTTP_PUT, HTTP_CONNECT, HTTP_OPTIONS, HTTP_TRACE, HTTP_COPY, HTTP_LOCK, HTTP_MKCOL, HTTP_MOVE, HTTP_PROPFIND, HTTP_PROPPATCH, HTTP_SEARCH, HTTP_UNLOCK, HTTP_BIND, HTTP_REBIND, HTTP_UNBIND, HTTP_ACL, HTTP_REPORT, HTTP_MKACTIVITY, HTTP_CHECKOUT, HTTP_MERGE, HTTP_MSEARCH, HTTP_NOTIFY, HTTP_SUBSCRIBE, HTTP_UNSUBSCRIBE, HTTP_PATCH, HTTP_PURGE, HTTP_MKCALENDAR, HTTP_LINK, HTTP_UNLINK, HTTP_SOURCE, HTTP_PRI, HTTP_DESCRIBE, HTTP_ANNOUNCE, HTTP_SETUP, HTTP_PLAY, HTTP_PAUSE, HTTP_TEARDOWN, HTTP_GET_PARAMETER, HTTP_SET_PARAMETER, HTTP_REDIRECT, HTTP_RECORD, HTTP_FLUSH ctypedef llhttp_method llhttp_method_t; void llhttp_settings_init(llhttp_settings_t* settings) void llhttp_init(llhttp_t* parser, llhttp_type type, const llhttp_settings_t* settings) llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len) llhttp_errno_t llhttp_finish(llhttp_t* parser) int llhttp_message_needs_eof(const llhttp_t* parser) int llhttp_should_keep_alive(const llhttp_t* parser) void llhttp_pause(llhttp_t* parser) void llhttp_resume(llhttp_t* parser) void llhttp_resume_after_upgrade(llhttp_t* parser) llhttp_errno_t llhttp_get_errno(const llhttp_t* parser) const char* llhttp_get_error_reason(const llhttp_t* parser) void llhttp_set_error_reason(llhttp_t* parser, const char* reason) const char* llhttp_get_error_pos(const llhttp_t* parser) const char* llhttp_errno_name(llhttp_errno_t err) const char* llhttp_method_name(llhttp_method_t method) void llhttp_set_lenient_headers(llhttp_t* parser, int enabled) void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920314.0 aiohttp-3.8.1/aiohttp/_find_header.c0000644000175100001710000055626200000000000016756 0ustar00runnerdocker/* The file is autogenerated from aiohttp/hdrs.py Run ./tools/gen.py to update it after the origin changing. */ #include "_find_header.h" #define NEXT_CHAR() \ { \ count++; \ if (count == size) { \ /* end of search */ \ return -1; \ } \ pchar++; \ ch = *pchar; \ last = (count == size -1); \ } while(0); int find_header(const char *str, int size) { char *pchar = str; int last; char ch; int count = -1; pchar--; NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto A; case 'a': if (last) { return -1; } goto A; case 'C': if (last) { return -1; } goto C; case 'c': if (last) { return -1; } goto C; case 'D': if (last) { return -1; } goto D; case 'd': if (last) { return -1; } goto D; case 'E': if (last) { return -1; } goto E; case 'e': if (last) { return -1; } goto E; case 'F': if (last) { return -1; } goto F; case 'f': if (last) { return -1; } goto F; case 'H': if (last) { return -1; } goto H; case 'h': if (last) { return -1; } goto H; case 'I': if (last) { return -1; } goto I; case 'i': if (last) { return -1; } goto I; case 'K': if (last) { return -1; } goto K; case 'k': if (last) { return -1; } goto K; case 'L': if (last) { return -1; } goto L; case 'l': if (last) { return -1; } goto L; case 'M': if (last) { return -1; } goto M; case 'm': if (last) { return -1; } goto M; case 'O': if (last) { return -1; } goto O; case 'o': if (last) { return -1; } goto O; case 'P': if (last) { return -1; } goto P; case 'p': if (last) { return -1; } goto P; case 'R': if (last) { return -1; } goto R; case 'r': if (last) { return -1; } goto R; case 'S': if (last) { return -1; } goto S; case 's': if (last) { return -1; } goto S; case 'T': if (last) { return -1; } goto T; case 't': if (last) { return -1; } goto T; case 'U': if (last) { return -1; } goto U; case 'u': if (last) { return -1; } goto U; case 'V': if (last) { return -1; } goto V; case 'v': if (last) { return -1; } goto V; case 'W': if (last) { return -1; } goto W; case 'w': if (last) { return -1; } goto W; case 'X': if (last) { return -1; } goto X; case 'x': if (last) { return -1; } goto X; default: return -1; } A: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto AC; case 'c': if (last) { return -1; } goto AC; case 'G': if (last) { return -1; } goto AG; case 'g': if (last) { return -1; } goto AG; case 'L': if (last) { return -1; } goto AL; case 'l': if (last) { return -1; } goto AL; case 'U': if (last) { return -1; } goto AU; case 'u': if (last) { return -1; } goto AU; default: return -1; } AC: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto ACC; case 'c': if (last) { return -1; } goto ACC; default: return -1; } ACC: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCE; case 'e': if (last) { return -1; } goto ACCE; default: return -1; } ACCE: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto ACCEP; case 'p': if (last) { return -1; } goto ACCEP; case 'S': if (last) { return -1; } goto ACCES; case 's': if (last) { return -1; } goto ACCES; default: return -1; } ACCEP: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 0; } goto ACCEPT; case 't': if (last) { return 0; } goto ACCEPT; default: return -1; } ACCEPT: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCEPT_; default: return -1; } ACCEPT_: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto ACCEPT_C; case 'c': if (last) { return -1; } goto ACCEPT_C; case 'E': if (last) { return -1; } goto ACCEPT_E; case 'e': if (last) { return -1; } goto ACCEPT_E; case 'L': if (last) { return -1; } goto ACCEPT_L; case 'l': if (last) { return -1; } goto ACCEPT_L; case 'R': if (last) { return -1; } goto ACCEPT_R; case 'r': if (last) { return -1; } goto ACCEPT_R; default: return -1; } ACCEPT_C: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto ACCEPT_CH; case 'h': if (last) { return -1; } goto ACCEPT_CH; default: return -1; } ACCEPT_CH: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCEPT_CHA; case 'a': if (last) { return -1; } goto ACCEPT_CHA; default: return -1; } ACCEPT_CHA: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCEPT_CHAR; case 'r': if (last) { return -1; } goto ACCEPT_CHAR; default: return -1; } ACCEPT_CHAR: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto ACCEPT_CHARS; case 's': if (last) { return -1; } goto ACCEPT_CHARS; default: return -1; } ACCEPT_CHARS: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCEPT_CHARSE; case 'e': if (last) { return -1; } goto ACCEPT_CHARSE; default: return -1; } ACCEPT_CHARSE: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 1; } goto ACCEPT_CHARSET; case 't': if (last) { return 1; } goto ACCEPT_CHARSET; default: return -1; } ACCEPT_E: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCEPT_EN; case 'n': if (last) { return -1; } goto ACCEPT_EN; default: return -1; } ACCEPT_EN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto ACCEPT_ENC; case 'c': if (last) { return -1; } goto ACCEPT_ENC; default: return -1; } ACCEPT_ENC: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCEPT_ENCO; case 'o': if (last) { return -1; } goto ACCEPT_ENCO; default: return -1; } ACCEPT_ENCO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCEPT_ENCOD; case 'd': if (last) { return -1; } goto ACCEPT_ENCOD; default: return -1; } ACCEPT_ENCOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ACCEPT_ENCODI; case 'i': if (last) { return -1; } goto ACCEPT_ENCODI; default: return -1; } ACCEPT_ENCODI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCEPT_ENCODIN; case 'n': if (last) { return -1; } goto ACCEPT_ENCODIN; default: return -1; } ACCEPT_ENCODIN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 2; } goto ACCEPT_ENCODING; case 'g': if (last) { return 2; } goto ACCEPT_ENCODING; default: return -1; } ACCEPT_L: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCEPT_LA; case 'a': if (last) { return -1; } goto ACCEPT_LA; default: return -1; } ACCEPT_LA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCEPT_LAN; case 'n': if (last) { return -1; } goto ACCEPT_LAN; default: return -1; } ACCEPT_LAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ACCEPT_LANG; case 'g': if (last) { return -1; } goto ACCEPT_LANG; default: return -1; } ACCEPT_LANG: NEXT_CHAR(); switch (ch) { case 'U': if (last) { return -1; } goto ACCEPT_LANGU; case 'u': if (last) { return -1; } goto ACCEPT_LANGU; default: return -1; } ACCEPT_LANGU: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCEPT_LANGUA; case 'a': if (last) { return -1; } goto ACCEPT_LANGUA; default: return -1; } ACCEPT_LANGUA: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ACCEPT_LANGUAG; case 'g': if (last) { return -1; } goto ACCEPT_LANGUAG; default: return -1; } ACCEPT_LANGUAG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 3; } goto ACCEPT_LANGUAGE; case 'e': if (last) { return 3; } goto ACCEPT_LANGUAGE; default: return -1; } ACCEPT_R: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCEPT_RA; case 'a': if (last) { return -1; } goto ACCEPT_RA; default: return -1; } ACCEPT_RA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCEPT_RAN; case 'n': if (last) { return -1; } goto ACCEPT_RAN; default: return -1; } ACCEPT_RAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ACCEPT_RANG; case 'g': if (last) { return -1; } goto ACCEPT_RANG; default: return -1; } ACCEPT_RANG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCEPT_RANGE; case 'e': if (last) { return -1; } goto ACCEPT_RANGE; default: return -1; } ACCEPT_RANGE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 4; } goto ACCEPT_RANGES; case 's': if (last) { return 4; } goto ACCEPT_RANGES; default: return -1; } ACCES: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto ACCESS; case 's': if (last) { return -1; } goto ACCESS; default: return -1; } ACCESS: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_; default: return -1; } ACCESS_: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto ACCESS_C; case 'c': if (last) { return -1; } goto ACCESS_C; default: return -1; } ACCESS_C: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CO; case 'o': if (last) { return -1; } goto ACCESS_CO; default: return -1; } ACCESS_CO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCESS_CON; case 'n': if (last) { return -1; } goto ACCESS_CON; default: return -1; } ACCESS_CON: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ACCESS_CONT; case 't': if (last) { return -1; } goto ACCESS_CONT; default: return -1; } ACCESS_CONT: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTR; case 'r': if (last) { return -1; } goto ACCESS_CONTR; default: return -1; } ACCESS_CONTR: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CONTRO; case 'o': if (last) { return -1; } goto ACCESS_CONTRO; default: return -1; } ACCESS_CONTRO: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto ACCESS_CONTROL; case 'l': if (last) { return -1; } goto ACCESS_CONTROL; default: return -1; } ACCESS_CONTROL: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_CONTROL_; default: return -1; } ACCESS_CONTROL_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_A; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_A; case 'E': if (last) { return -1; } goto ACCESS_CONTROL_E; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_E; case 'M': if (last) { return -1; } goto ACCESS_CONTROL_M; case 'm': if (last) { return -1; } goto ACCESS_CONTROL_M; case 'R': if (last) { return -1; } goto ACCESS_CONTROL_R; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_R; default: return -1; } ACCESS_CONTROL_A: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto ACCESS_CONTROL_AL; case 'l': if (last) { return -1; } goto ACCESS_CONTROL_AL; default: return -1; } ACCESS_CONTROL_AL: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto ACCESS_CONTROL_ALL; case 'l': if (last) { return -1; } goto ACCESS_CONTROL_ALL; default: return -1; } ACCESS_CONTROL_ALL: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CONTROL_ALLO; case 'o': if (last) { return -1; } goto ACCESS_CONTROL_ALLO; default: return -1; } ACCESS_CONTROL_ALLO: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW; case 'w': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW; default: return -1; } ACCESS_CONTROL_ALLOW: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_; default: return -1; } ACCESS_CONTROL_ALLOW_: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_C; case 'c': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_C; case 'H': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_H; case 'h': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_H; case 'M': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_M; case 'm': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_M; case 'O': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_O; case 'o': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_O; default: return -1; } ACCESS_CONTROL_ALLOW_C: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CR; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CR; default: return -1; } ACCESS_CONTROL_ALLOW_CR: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CRE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CRE; default: return -1; } ACCESS_CONTROL_ALLOW_CRE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CRED; case 'd': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CRED; default: return -1; } ACCESS_CONTROL_ALLOW_CRED: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDE; default: return -1; } ACCESS_CONTROL_ALLOW_CREDE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDEN; case 'n': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDEN; default: return -1; } ACCESS_CONTROL_ALLOW_CREDEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENT; case 't': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENT; default: return -1; } ACCESS_CONTROL_ALLOW_CREDENT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTI; case 'i': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTI; default: return -1; } ACCESS_CONTROL_ALLOW_CREDENTI: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTIA; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTIA; default: return -1; } ACCESS_CONTROL_ALLOW_CREDENTIA: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTIAL; case 'l': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_CREDENTIAL; default: return -1; } ACCESS_CONTROL_ALLOW_CREDENTIAL: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 5; } goto ACCESS_CONTROL_ALLOW_CREDENTIALS; case 's': if (last) { return 5; } goto ACCESS_CONTROL_ALLOW_CREDENTIALS; default: return -1; } ACCESS_CONTROL_ALLOW_H: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HE; default: return -1; } ACCESS_CONTROL_ALLOW_HE: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEA; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEA; default: return -1; } ACCESS_CONTROL_ALLOW_HEA: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEAD; case 'd': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEAD; default: return -1; } ACCESS_CONTROL_ALLOW_HEAD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEADE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEADE; default: return -1; } ACCESS_CONTROL_ALLOW_HEADE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEADER; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_HEADER; default: return -1; } ACCESS_CONTROL_ALLOW_HEADER: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 6; } goto ACCESS_CONTROL_ALLOW_HEADERS; case 's': if (last) { return 6; } goto ACCESS_CONTROL_ALLOW_HEADERS; default: return -1; } ACCESS_CONTROL_ALLOW_M: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ME; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ME; default: return -1; } ACCESS_CONTROL_ALLOW_ME: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_MET; case 't': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_MET; default: return -1; } ACCESS_CONTROL_ALLOW_MET: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METH; case 'h': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METH; default: return -1; } ACCESS_CONTROL_ALLOW_METH: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METHO; case 'o': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METHO; default: return -1; } ACCESS_CONTROL_ALLOW_METHO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METHOD; case 'd': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_METHOD; default: return -1; } ACCESS_CONTROL_ALLOW_METHOD: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 7; } goto ACCESS_CONTROL_ALLOW_METHODS; case 's': if (last) { return 7; } goto ACCESS_CONTROL_ALLOW_METHODS; default: return -1; } ACCESS_CONTROL_ALLOW_O: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_OR; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_OR; default: return -1; } ACCESS_CONTROL_ALLOW_OR: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORI; case 'i': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORI; default: return -1; } ACCESS_CONTROL_ALLOW_ORI: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORIG; case 'g': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORIG; default: return -1; } ACCESS_CONTROL_ALLOW_ORIG: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORIGI; case 'i': if (last) { return -1; } goto ACCESS_CONTROL_ALLOW_ORIGI; default: return -1; } ACCESS_CONTROL_ALLOW_ORIGI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 8; } goto ACCESS_CONTROL_ALLOW_ORIGIN; case 'n': if (last) { return 8; } goto ACCESS_CONTROL_ALLOW_ORIGIN; default: return -1; } ACCESS_CONTROL_E: NEXT_CHAR(); switch (ch) { case 'X': if (last) { return -1; } goto ACCESS_CONTROL_EX; case 'x': if (last) { return -1; } goto ACCESS_CONTROL_EX; default: return -1; } ACCESS_CONTROL_EX: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto ACCESS_CONTROL_EXP; case 'p': if (last) { return -1; } goto ACCESS_CONTROL_EXP; default: return -1; } ACCESS_CONTROL_EXP: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CONTROL_EXPO; case 'o': if (last) { return -1; } goto ACCESS_CONTROL_EXPO; default: return -1; } ACCESS_CONTROL_EXPO: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto ACCESS_CONTROL_EXPOS; case 's': if (last) { return -1; } goto ACCESS_CONTROL_EXPOS; default: return -1; } ACCESS_CONTROL_EXPOS: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE; default: return -1; } ACCESS_CONTROL_EXPOSE: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_; default: return -1; } ACCESS_CONTROL_EXPOSE_: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_H; case 'h': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_H; default: return -1; } ACCESS_CONTROL_EXPOSE_H: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HE; default: return -1; } ACCESS_CONTROL_EXPOSE_HE: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEA; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEA; default: return -1; } ACCESS_CONTROL_EXPOSE_HEA: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEAD; case 'd': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEAD; default: return -1; } ACCESS_CONTROL_EXPOSE_HEAD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEADE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEADE; default: return -1; } ACCESS_CONTROL_EXPOSE_HEADE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEADER; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_EXPOSE_HEADER; default: return -1; } ACCESS_CONTROL_EXPOSE_HEADER: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 9; } goto ACCESS_CONTROL_EXPOSE_HEADERS; case 's': if (last) { return 9; } goto ACCESS_CONTROL_EXPOSE_HEADERS; default: return -1; } ACCESS_CONTROL_M: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_MA; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_MA; default: return -1; } ACCESS_CONTROL_MA: NEXT_CHAR(); switch (ch) { case 'X': if (last) { return -1; } goto ACCESS_CONTROL_MAX; case 'x': if (last) { return -1; } goto ACCESS_CONTROL_MAX; default: return -1; } ACCESS_CONTROL_MAX: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_CONTROL_MAX_; default: return -1; } ACCESS_CONTROL_MAX_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_MAX_A; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_MAX_A; default: return -1; } ACCESS_CONTROL_MAX_A: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ACCESS_CONTROL_MAX_AG; case 'g': if (last) { return -1; } goto ACCESS_CONTROL_MAX_AG; default: return -1; } ACCESS_CONTROL_MAX_AG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 10; } goto ACCESS_CONTROL_MAX_AGE; case 'e': if (last) { return 10; } goto ACCESS_CONTROL_MAX_AGE; default: return -1; } ACCESS_CONTROL_R: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_RE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_RE; default: return -1; } ACCESS_CONTROL_RE: NEXT_CHAR(); switch (ch) { case 'Q': if (last) { return -1; } goto ACCESS_CONTROL_REQ; case 'q': if (last) { return -1; } goto ACCESS_CONTROL_REQ; default: return -1; } ACCESS_CONTROL_REQ: NEXT_CHAR(); switch (ch) { case 'U': if (last) { return -1; } goto ACCESS_CONTROL_REQU; case 'u': if (last) { return -1; } goto ACCESS_CONTROL_REQU; default: return -1; } ACCESS_CONTROL_REQU: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_REQUE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_REQUE; default: return -1; } ACCESS_CONTROL_REQUE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto ACCESS_CONTROL_REQUES; case 's': if (last) { return -1; } goto ACCESS_CONTROL_REQUES; default: return -1; } ACCESS_CONTROL_REQUES: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST; case 't': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST; default: return -1; } ACCESS_CONTROL_REQUEST: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_; default: return -1; } ACCESS_CONTROL_REQUEST_: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_H; case 'h': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_H; case 'M': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_M; case 'm': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_M; default: return -1; } ACCESS_CONTROL_REQUEST_H: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HE; default: return -1; } ACCESS_CONTROL_REQUEST_HE: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEA; case 'a': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEA; default: return -1; } ACCESS_CONTROL_REQUEST_HEA: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEAD; case 'd': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEAD; default: return -1; } ACCESS_CONTROL_REQUEST_HEAD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEADE; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEADE; default: return -1; } ACCESS_CONTROL_REQUEST_HEADE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEADER; case 'r': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_HEADER; default: return -1; } ACCESS_CONTROL_REQUEST_HEADER: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 11; } goto ACCESS_CONTROL_REQUEST_HEADERS; case 's': if (last) { return 11; } goto ACCESS_CONTROL_REQUEST_HEADERS; default: return -1; } ACCESS_CONTROL_REQUEST_M: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_ME; case 'e': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_ME; default: return -1; } ACCESS_CONTROL_REQUEST_ME: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_MET; case 't': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_MET; default: return -1; } ACCESS_CONTROL_REQUEST_MET: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_METH; case 'h': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_METH; default: return -1; } ACCESS_CONTROL_REQUEST_METH: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_METHO; case 'o': if (last) { return -1; } goto ACCESS_CONTROL_REQUEST_METHO; default: return -1; } ACCESS_CONTROL_REQUEST_METHO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return 12; } goto ACCESS_CONTROL_REQUEST_METHOD; case 'd': if (last) { return 12; } goto ACCESS_CONTROL_REQUEST_METHOD; default: return -1; } AG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 13; } goto AGE; case 'e': if (last) { return 13; } goto AGE; default: return -1; } AL: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto ALL; case 'l': if (last) { return -1; } goto ALL; default: return -1; } ALL: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto ALLO; case 'o': if (last) { return -1; } goto ALLO; default: return -1; } ALLO: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return 14; } goto ALLOW; case 'w': if (last) { return 14; } goto ALLOW; default: return -1; } AU: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto AUT; case 't': if (last) { return -1; } goto AUT; default: return -1; } AUT: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto AUTH; case 'h': if (last) { return -1; } goto AUTH; default: return -1; } AUTH: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto AUTHO; case 'o': if (last) { return -1; } goto AUTHO; default: return -1; } AUTHO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto AUTHOR; case 'r': if (last) { return -1; } goto AUTHOR; default: return -1; } AUTHOR: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto AUTHORI; case 'i': if (last) { return -1; } goto AUTHORI; default: return -1; } AUTHORI: NEXT_CHAR(); switch (ch) { case 'Z': if (last) { return -1; } goto AUTHORIZ; case 'z': if (last) { return -1; } goto AUTHORIZ; default: return -1; } AUTHORIZ: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto AUTHORIZA; case 'a': if (last) { return -1; } goto AUTHORIZA; default: return -1; } AUTHORIZA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto AUTHORIZAT; case 't': if (last) { return -1; } goto AUTHORIZAT; default: return -1; } AUTHORIZAT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto AUTHORIZATI; case 'i': if (last) { return -1; } goto AUTHORIZATI; default: return -1; } AUTHORIZATI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto AUTHORIZATIO; case 'o': if (last) { return -1; } goto AUTHORIZATIO; default: return -1; } AUTHORIZATIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 15; } goto AUTHORIZATION; case 'n': if (last) { return 15; } goto AUTHORIZATION; default: return -1; } C: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CA; case 'a': if (last) { return -1; } goto CA; case 'O': if (last) { return -1; } goto CO; case 'o': if (last) { return -1; } goto CO; default: return -1; } CA: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CAC; case 'c': if (last) { return -1; } goto CAC; default: return -1; } CAC: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto CACH; case 'h': if (last) { return -1; } goto CACH; default: return -1; } CACH: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto CACHE; case 'e': if (last) { return -1; } goto CACHE; default: return -1; } CACHE: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto CACHE_; default: return -1; } CACHE_: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CACHE_C; case 'c': if (last) { return -1; } goto CACHE_C; default: return -1; } CACHE_C: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CACHE_CO; case 'o': if (last) { return -1; } goto CACHE_CO; default: return -1; } CACHE_CO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CACHE_CON; case 'n': if (last) { return -1; } goto CACHE_CON; default: return -1; } CACHE_CON: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CACHE_CONT; case 't': if (last) { return -1; } goto CACHE_CONT; default: return -1; } CACHE_CONT: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto CACHE_CONTR; case 'r': if (last) { return -1; } goto CACHE_CONTR; default: return -1; } CACHE_CONTR: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CACHE_CONTRO; case 'o': if (last) { return -1; } goto CACHE_CONTRO; default: return -1; } CACHE_CONTRO: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return 16; } goto CACHE_CONTROL; case 'l': if (last) { return 16; } goto CACHE_CONTROL; default: return -1; } CO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CON; case 'n': if (last) { return -1; } goto CON; case 'O': if (last) { return -1; } goto COO; case 'o': if (last) { return -1; } goto COO; default: return -1; } CON: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONN; case 'n': if (last) { return -1; } goto CONN; case 'T': if (last) { return -1; } goto CONT; case 't': if (last) { return -1; } goto CONT; default: return -1; } CONN: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto CONNE; case 'e': if (last) { return -1; } goto CONNE; default: return -1; } CONNE: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CONNEC; case 'c': if (last) { return -1; } goto CONNEC; default: return -1; } CONNEC: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CONNECT; case 't': if (last) { return -1; } goto CONNECT; default: return -1; } CONNECT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONNECTI; case 'i': if (last) { return -1; } goto CONNECTI; default: return -1; } CONNECTI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONNECTIO; case 'o': if (last) { return -1; } goto CONNECTIO; default: return -1; } CONNECTIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 17; } goto CONNECTION; case 'n': if (last) { return 17; } goto CONNECTION; default: return -1; } CONT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto CONTE; case 'e': if (last) { return -1; } goto CONTE; default: return -1; } CONTE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTEN; case 'n': if (last) { return -1; } goto CONTEN; default: return -1; } CONTEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CONTENT; case 't': if (last) { return -1; } goto CONTENT; default: return -1; } CONTENT: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto CONTENT_; default: return -1; } CONTENT_: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto CONTENT_D; case 'd': if (last) { return -1; } goto CONTENT_D; case 'E': if (last) { return -1; } goto CONTENT_E; case 'e': if (last) { return -1; } goto CONTENT_E; case 'L': if (last) { return -1; } goto CONTENT_L; case 'l': if (last) { return -1; } goto CONTENT_L; case 'M': if (last) { return -1; } goto CONTENT_M; case 'm': if (last) { return -1; } goto CONTENT_M; case 'R': if (last) { return -1; } goto CONTENT_R; case 'r': if (last) { return -1; } goto CONTENT_R; case 'T': if (last) { return -1; } goto CONTENT_T; case 't': if (last) { return -1; } goto CONTENT_T; default: return -1; } CONTENT_D: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_DI; case 'i': if (last) { return -1; } goto CONTENT_DI; default: return -1; } CONTENT_DI: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto CONTENT_DIS; case 's': if (last) { return -1; } goto CONTENT_DIS; default: return -1; } CONTENT_DIS: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto CONTENT_DISP; case 'p': if (last) { return -1; } goto CONTENT_DISP; default: return -1; } CONTENT_DISP: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONTENT_DISPO; case 'o': if (last) { return -1; } goto CONTENT_DISPO; default: return -1; } CONTENT_DISPO: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto CONTENT_DISPOS; case 's': if (last) { return -1; } goto CONTENT_DISPOS; default: return -1; } CONTENT_DISPOS: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_DISPOSI; case 'i': if (last) { return -1; } goto CONTENT_DISPOSI; default: return -1; } CONTENT_DISPOSI: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CONTENT_DISPOSIT; case 't': if (last) { return -1; } goto CONTENT_DISPOSIT; default: return -1; } CONTENT_DISPOSIT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_DISPOSITI; case 'i': if (last) { return -1; } goto CONTENT_DISPOSITI; default: return -1; } CONTENT_DISPOSITI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONTENT_DISPOSITIO; case 'o': if (last) { return -1; } goto CONTENT_DISPOSITIO; default: return -1; } CONTENT_DISPOSITIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 18; } goto CONTENT_DISPOSITION; case 'n': if (last) { return 18; } goto CONTENT_DISPOSITION; default: return -1; } CONTENT_E: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_EN; case 'n': if (last) { return -1; } goto CONTENT_EN; default: return -1; } CONTENT_EN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CONTENT_ENC; case 'c': if (last) { return -1; } goto CONTENT_ENC; default: return -1; } CONTENT_ENC: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONTENT_ENCO; case 'o': if (last) { return -1; } goto CONTENT_ENCO; default: return -1; } CONTENT_ENCO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto CONTENT_ENCOD; case 'd': if (last) { return -1; } goto CONTENT_ENCOD; default: return -1; } CONTENT_ENCOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_ENCODI; case 'i': if (last) { return -1; } goto CONTENT_ENCODI; default: return -1; } CONTENT_ENCODI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_ENCODIN; case 'n': if (last) { return -1; } goto CONTENT_ENCODIN; default: return -1; } CONTENT_ENCODIN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 19; } goto CONTENT_ENCODING; case 'g': if (last) { return 19; } goto CONTENT_ENCODING; default: return -1; } CONTENT_L: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CONTENT_LA; case 'a': if (last) { return -1; } goto CONTENT_LA; case 'E': if (last) { return -1; } goto CONTENT_LE; case 'e': if (last) { return -1; } goto CONTENT_LE; case 'O': if (last) { return -1; } goto CONTENT_LO; case 'o': if (last) { return -1; } goto CONTENT_LO; default: return -1; } CONTENT_LA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_LAN; case 'n': if (last) { return -1; } goto CONTENT_LAN; default: return -1; } CONTENT_LAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto CONTENT_LANG; case 'g': if (last) { return -1; } goto CONTENT_LANG; default: return -1; } CONTENT_LANG: NEXT_CHAR(); switch (ch) { case 'U': if (last) { return -1; } goto CONTENT_LANGU; case 'u': if (last) { return -1; } goto CONTENT_LANGU; default: return -1; } CONTENT_LANGU: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CONTENT_LANGUA; case 'a': if (last) { return -1; } goto CONTENT_LANGUA; default: return -1; } CONTENT_LANGUA: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto CONTENT_LANGUAG; case 'g': if (last) { return -1; } goto CONTENT_LANGUAG; default: return -1; } CONTENT_LANGUAG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 20; } goto CONTENT_LANGUAGE; case 'e': if (last) { return 20; } goto CONTENT_LANGUAGE; default: return -1; } CONTENT_LE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_LEN; case 'n': if (last) { return -1; } goto CONTENT_LEN; default: return -1; } CONTENT_LEN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto CONTENT_LENG; case 'g': if (last) { return -1; } goto CONTENT_LENG; default: return -1; } CONTENT_LENG: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CONTENT_LENGT; case 't': if (last) { return -1; } goto CONTENT_LENGT; default: return -1; } CONTENT_LENGT: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return 21; } goto CONTENT_LENGTH; case 'h': if (last) { return 21; } goto CONTENT_LENGTH; default: return -1; } CONTENT_LO: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CONTENT_LOC; case 'c': if (last) { return -1; } goto CONTENT_LOC; default: return -1; } CONTENT_LOC: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CONTENT_LOCA; case 'a': if (last) { return -1; } goto CONTENT_LOCA; default: return -1; } CONTENT_LOCA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto CONTENT_LOCAT; case 't': if (last) { return -1; } goto CONTENT_LOCAT; default: return -1; } CONTENT_LOCAT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_LOCATI; case 'i': if (last) { return -1; } goto CONTENT_LOCATI; default: return -1; } CONTENT_LOCATI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONTENT_LOCATIO; case 'o': if (last) { return -1; } goto CONTENT_LOCATIO; default: return -1; } CONTENT_LOCATIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 22; } goto CONTENT_LOCATION; case 'n': if (last) { return 22; } goto CONTENT_LOCATION; default: return -1; } CONTENT_M: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto CONTENT_MD; case 'd': if (last) { return -1; } goto CONTENT_MD; default: return -1; } CONTENT_MD: NEXT_CHAR(); switch (ch) { case '5': if (last) { return 23; } goto CONTENT_MD5; default: return -1; } CONTENT_R: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CONTENT_RA; case 'a': if (last) { return -1; } goto CONTENT_RA; default: return -1; } CONTENT_RA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_RAN; case 'n': if (last) { return -1; } goto CONTENT_RAN; default: return -1; } CONTENT_RAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto CONTENT_RANG; case 'g': if (last) { return -1; } goto CONTENT_RANG; default: return -1; } CONTENT_RANG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 24; } goto CONTENT_RANGE; case 'e': if (last) { return 24; } goto CONTENT_RANGE; default: return -1; } CONTENT_T: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto CONTENT_TR; case 'r': if (last) { return -1; } goto CONTENT_TR; case 'Y': if (last) { return -1; } goto CONTENT_TY; case 'y': if (last) { return -1; } goto CONTENT_TY; default: return -1; } CONTENT_TR: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto CONTENT_TRA; case 'a': if (last) { return -1; } goto CONTENT_TRA; default: return -1; } CONTENT_TRA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_TRAN; case 'n': if (last) { return -1; } goto CONTENT_TRAN; default: return -1; } CONTENT_TRAN: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto CONTENT_TRANS; case 's': if (last) { return -1; } goto CONTENT_TRANS; default: return -1; } CONTENT_TRANS: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto CONTENT_TRANSF; case 'f': if (last) { return -1; } goto CONTENT_TRANSF; default: return -1; } CONTENT_TRANSF: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto CONTENT_TRANSFE; case 'e': if (last) { return -1; } goto CONTENT_TRANSFE; default: return -1; } CONTENT_TRANSFE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto CONTENT_TRANSFER; case 'r': if (last) { return -1; } goto CONTENT_TRANSFER; default: return -1; } CONTENT_TRANSFER: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto CONTENT_TRANSFER_; default: return -1; } CONTENT_TRANSFER_: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto CONTENT_TRANSFER_E; case 'e': if (last) { return -1; } goto CONTENT_TRANSFER_E; default: return -1; } CONTENT_TRANSFER_E: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_TRANSFER_EN; case 'n': if (last) { return -1; } goto CONTENT_TRANSFER_EN; default: return -1; } CONTENT_TRANSFER_EN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto CONTENT_TRANSFER_ENC; case 'c': if (last) { return -1; } goto CONTENT_TRANSFER_ENC; default: return -1; } CONTENT_TRANSFER_ENC: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto CONTENT_TRANSFER_ENCO; case 'o': if (last) { return -1; } goto CONTENT_TRANSFER_ENCO; default: return -1; } CONTENT_TRANSFER_ENCO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto CONTENT_TRANSFER_ENCOD; case 'd': if (last) { return -1; } goto CONTENT_TRANSFER_ENCOD; default: return -1; } CONTENT_TRANSFER_ENCOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto CONTENT_TRANSFER_ENCODI; case 'i': if (last) { return -1; } goto CONTENT_TRANSFER_ENCODI; default: return -1; } CONTENT_TRANSFER_ENCODI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto CONTENT_TRANSFER_ENCODIN; case 'n': if (last) { return -1; } goto CONTENT_TRANSFER_ENCODIN; default: return -1; } CONTENT_TRANSFER_ENCODIN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 25; } goto CONTENT_TRANSFER_ENCODING; case 'g': if (last) { return 25; } goto CONTENT_TRANSFER_ENCODING; default: return -1; } CONTENT_TY: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto CONTENT_TYP; case 'p': if (last) { return -1; } goto CONTENT_TYP; default: return -1; } CONTENT_TYP: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 26; } goto CONTENT_TYPE; case 'e': if (last) { return 26; } goto CONTENT_TYPE; default: return -1; } COO: NEXT_CHAR(); switch (ch) { case 'K': if (last) { return -1; } goto COOK; case 'k': if (last) { return -1; } goto COOK; default: return -1; } COOK: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto COOKI; case 'i': if (last) { return -1; } goto COOKI; default: return -1; } COOKI: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 27; } goto COOKIE; case 'e': if (last) { return 27; } goto COOKIE; default: return -1; } D: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto DA; case 'a': if (last) { return -1; } goto DA; case 'E': if (last) { return -1; } goto DE; case 'e': if (last) { return -1; } goto DE; case 'I': if (last) { return -1; } goto DI; case 'i': if (last) { return -1; } goto DI; default: return -1; } DA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto DAT; case 't': if (last) { return -1; } goto DAT; default: return -1; } DAT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 28; } goto DATE; case 'e': if (last) { return 28; } goto DATE; default: return -1; } DE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto DES; case 's': if (last) { return -1; } goto DES; default: return -1; } DES: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto DEST; case 't': if (last) { return -1; } goto DEST; default: return -1; } DEST: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto DESTI; case 'i': if (last) { return -1; } goto DESTI; default: return -1; } DESTI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto DESTIN; case 'n': if (last) { return -1; } goto DESTIN; default: return -1; } DESTIN: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto DESTINA; case 'a': if (last) { return -1; } goto DESTINA; default: return -1; } DESTINA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto DESTINAT; case 't': if (last) { return -1; } goto DESTINAT; default: return -1; } DESTINAT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto DESTINATI; case 'i': if (last) { return -1; } goto DESTINATI; default: return -1; } DESTINATI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto DESTINATIO; case 'o': if (last) { return -1; } goto DESTINATIO; default: return -1; } DESTINATIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 29; } goto DESTINATION; case 'n': if (last) { return 29; } goto DESTINATION; default: return -1; } DI: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto DIG; case 'g': if (last) { return -1; } goto DIG; default: return -1; } DIG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto DIGE; case 'e': if (last) { return -1; } goto DIGE; default: return -1; } DIGE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto DIGES; case 's': if (last) { return -1; } goto DIGES; default: return -1; } DIGES: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 30; } goto DIGEST; case 't': if (last) { return 30; } goto DIGEST; default: return -1; } E: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto ET; case 't': if (last) { return -1; } goto ET; case 'X': if (last) { return -1; } goto EX; case 'x': if (last) { return -1; } goto EX; default: return -1; } ET: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto ETA; case 'a': if (last) { return -1; } goto ETA; default: return -1; } ETA: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 31; } goto ETAG; case 'g': if (last) { return 31; } goto ETAG; default: return -1; } EX: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto EXP; case 'p': if (last) { return -1; } goto EXP; default: return -1; } EXP: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto EXPE; case 'e': if (last) { return -1; } goto EXPE; case 'I': if (last) { return -1; } goto EXPI; case 'i': if (last) { return -1; } goto EXPI; default: return -1; } EXPE: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto EXPEC; case 'c': if (last) { return -1; } goto EXPEC; default: return -1; } EXPEC: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 32; } goto EXPECT; case 't': if (last) { return 32; } goto EXPECT; default: return -1; } EXPI: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto EXPIR; case 'r': if (last) { return -1; } goto EXPIR; default: return -1; } EXPIR: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto EXPIRE; case 'e': if (last) { return -1; } goto EXPIRE; default: return -1; } EXPIRE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 33; } goto EXPIRES; case 's': if (last) { return 33; } goto EXPIRES; default: return -1; } F: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto FO; case 'o': if (last) { return -1; } goto FO; case 'R': if (last) { return -1; } goto FR; case 'r': if (last) { return -1; } goto FR; default: return -1; } FO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto FOR; case 'r': if (last) { return -1; } goto FOR; default: return -1; } FOR: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto FORW; case 'w': if (last) { return -1; } goto FORW; default: return -1; } FORW: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto FORWA; case 'a': if (last) { return -1; } goto FORWA; default: return -1; } FORWA: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto FORWAR; case 'r': if (last) { return -1; } goto FORWAR; default: return -1; } FORWAR: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto FORWARD; case 'd': if (last) { return -1; } goto FORWARD; default: return -1; } FORWARD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto FORWARDE; case 'e': if (last) { return -1; } goto FORWARDE; default: return -1; } FORWARDE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return 34; } goto FORWARDED; case 'd': if (last) { return 34; } goto FORWARDED; default: return -1; } FR: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto FRO; case 'o': if (last) { return -1; } goto FRO; default: return -1; } FRO: NEXT_CHAR(); switch (ch) { case 'M': if (last) { return 35; } goto FROM; case 'm': if (last) { return 35; } goto FROM; default: return -1; } H: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto HO; case 'o': if (last) { return -1; } goto HO; default: return -1; } HO: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto HOS; case 's': if (last) { return -1; } goto HOS; default: return -1; } HOS: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 36; } goto HOST; case 't': if (last) { return 36; } goto HOST; default: return -1; } I: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto IF; case 'f': if (last) { return -1; } goto IF; default: return -1; } IF: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto IF_; default: return -1; } IF_: NEXT_CHAR(); switch (ch) { case 'M': if (last) { return -1; } goto IF_M; case 'm': if (last) { return -1; } goto IF_M; case 'N': if (last) { return -1; } goto IF_N; case 'n': if (last) { return -1; } goto IF_N; case 'R': if (last) { return -1; } goto IF_R; case 'r': if (last) { return -1; } goto IF_R; case 'U': if (last) { return -1; } goto IF_U; case 'u': if (last) { return -1; } goto IF_U; default: return -1; } IF_M: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto IF_MA; case 'a': if (last) { return -1; } goto IF_MA; case 'O': if (last) { return -1; } goto IF_MO; case 'o': if (last) { return -1; } goto IF_MO; default: return -1; } IF_MA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto IF_MAT; case 't': if (last) { return -1; } goto IF_MAT; default: return -1; } IF_MAT: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto IF_MATC; case 'c': if (last) { return -1; } goto IF_MATC; default: return -1; } IF_MATC: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return 37; } goto IF_MATCH; case 'h': if (last) { return 37; } goto IF_MATCH; default: return -1; } IF_MO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto IF_MOD; case 'd': if (last) { return -1; } goto IF_MOD; default: return -1; } IF_MOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_MODI; case 'i': if (last) { return -1; } goto IF_MODI; default: return -1; } IF_MODI: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto IF_MODIF; case 'f': if (last) { return -1; } goto IF_MODIF; default: return -1; } IF_MODIF: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_MODIFI; case 'i': if (last) { return -1; } goto IF_MODIFI; default: return -1; } IF_MODIFI: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto IF_MODIFIE; case 'e': if (last) { return -1; } goto IF_MODIFIE; default: return -1; } IF_MODIFIE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto IF_MODIFIED; case 'd': if (last) { return -1; } goto IF_MODIFIED; default: return -1; } IF_MODIFIED: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto IF_MODIFIED_; default: return -1; } IF_MODIFIED_: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto IF_MODIFIED_S; case 's': if (last) { return -1; } goto IF_MODIFIED_S; default: return -1; } IF_MODIFIED_S: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_MODIFIED_SI; case 'i': if (last) { return -1; } goto IF_MODIFIED_SI; default: return -1; } IF_MODIFIED_SI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto IF_MODIFIED_SIN; case 'n': if (last) { return -1; } goto IF_MODIFIED_SIN; default: return -1; } IF_MODIFIED_SIN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto IF_MODIFIED_SINC; case 'c': if (last) { return -1; } goto IF_MODIFIED_SINC; default: return -1; } IF_MODIFIED_SINC: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 38; } goto IF_MODIFIED_SINCE; case 'e': if (last) { return 38; } goto IF_MODIFIED_SINCE; default: return -1; } IF_N: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto IF_NO; case 'o': if (last) { return -1; } goto IF_NO; default: return -1; } IF_NO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto IF_NON; case 'n': if (last) { return -1; } goto IF_NON; default: return -1; } IF_NON: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto IF_NONE; case 'e': if (last) { return -1; } goto IF_NONE; default: return -1; } IF_NONE: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto IF_NONE_; default: return -1; } IF_NONE_: NEXT_CHAR(); switch (ch) { case 'M': if (last) { return -1; } goto IF_NONE_M; case 'm': if (last) { return -1; } goto IF_NONE_M; default: return -1; } IF_NONE_M: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto IF_NONE_MA; case 'a': if (last) { return -1; } goto IF_NONE_MA; default: return -1; } IF_NONE_MA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto IF_NONE_MAT; case 't': if (last) { return -1; } goto IF_NONE_MAT; default: return -1; } IF_NONE_MAT: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto IF_NONE_MATC; case 'c': if (last) { return -1; } goto IF_NONE_MATC; default: return -1; } IF_NONE_MATC: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return 39; } goto IF_NONE_MATCH; case 'h': if (last) { return 39; } goto IF_NONE_MATCH; default: return -1; } IF_R: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto IF_RA; case 'a': if (last) { return -1; } goto IF_RA; default: return -1; } IF_RA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto IF_RAN; case 'n': if (last) { return -1; } goto IF_RAN; default: return -1; } IF_RAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto IF_RANG; case 'g': if (last) { return -1; } goto IF_RANG; default: return -1; } IF_RANG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 40; } goto IF_RANGE; case 'e': if (last) { return 40; } goto IF_RANGE; default: return -1; } IF_U: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto IF_UN; case 'n': if (last) { return -1; } goto IF_UN; default: return -1; } IF_UN: NEXT_CHAR(); switch (ch) { case 'M': if (last) { return -1; } goto IF_UNM; case 'm': if (last) { return -1; } goto IF_UNM; default: return -1; } IF_UNM: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto IF_UNMO; case 'o': if (last) { return -1; } goto IF_UNMO; default: return -1; } IF_UNMO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto IF_UNMOD; case 'd': if (last) { return -1; } goto IF_UNMOD; default: return -1; } IF_UNMOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_UNMODI; case 'i': if (last) { return -1; } goto IF_UNMODI; default: return -1; } IF_UNMODI: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto IF_UNMODIF; case 'f': if (last) { return -1; } goto IF_UNMODIF; default: return -1; } IF_UNMODIF: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_UNMODIFI; case 'i': if (last) { return -1; } goto IF_UNMODIFI; default: return -1; } IF_UNMODIFI: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto IF_UNMODIFIE; case 'e': if (last) { return -1; } goto IF_UNMODIFIE; default: return -1; } IF_UNMODIFIE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto IF_UNMODIFIED; case 'd': if (last) { return -1; } goto IF_UNMODIFIED; default: return -1; } IF_UNMODIFIED: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto IF_UNMODIFIED_; default: return -1; } IF_UNMODIFIED_: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto IF_UNMODIFIED_S; case 's': if (last) { return -1; } goto IF_UNMODIFIED_S; default: return -1; } IF_UNMODIFIED_S: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto IF_UNMODIFIED_SI; case 'i': if (last) { return -1; } goto IF_UNMODIFIED_SI; default: return -1; } IF_UNMODIFIED_SI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto IF_UNMODIFIED_SIN; case 'n': if (last) { return -1; } goto IF_UNMODIFIED_SIN; default: return -1; } IF_UNMODIFIED_SIN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto IF_UNMODIFIED_SINC; case 'c': if (last) { return -1; } goto IF_UNMODIFIED_SINC; default: return -1; } IF_UNMODIFIED_SINC: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 41; } goto IF_UNMODIFIED_SINCE; case 'e': if (last) { return 41; } goto IF_UNMODIFIED_SINCE; default: return -1; } K: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto KE; case 'e': if (last) { return -1; } goto KE; default: return -1; } KE: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto KEE; case 'e': if (last) { return -1; } goto KEE; default: return -1; } KEE: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto KEEP; case 'p': if (last) { return -1; } goto KEEP; default: return -1; } KEEP: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto KEEP_; default: return -1; } KEEP_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto KEEP_A; case 'a': if (last) { return -1; } goto KEEP_A; default: return -1; } KEEP_A: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto KEEP_AL; case 'l': if (last) { return -1; } goto KEEP_AL; default: return -1; } KEEP_AL: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto KEEP_ALI; case 'i': if (last) { return -1; } goto KEEP_ALI; default: return -1; } KEEP_ALI: NEXT_CHAR(); switch (ch) { case 'V': if (last) { return -1; } goto KEEP_ALIV; case 'v': if (last) { return -1; } goto KEEP_ALIV; default: return -1; } KEEP_ALIV: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 42; } goto KEEP_ALIVE; case 'e': if (last) { return 42; } goto KEEP_ALIVE; default: return -1; } L: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto LA; case 'a': if (last) { return -1; } goto LA; case 'I': if (last) { return -1; } goto LI; case 'i': if (last) { return -1; } goto LI; case 'O': if (last) { return -1; } goto LO; case 'o': if (last) { return -1; } goto LO; default: return -1; } LA: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto LAS; case 's': if (last) { return -1; } goto LAS; default: return -1; } LAS: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto LAST; case 't': if (last) { return -1; } goto LAST; default: return -1; } LAST: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto LAST_; default: return -1; } LAST_: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto LAST_E; case 'e': if (last) { return -1; } goto LAST_E; case 'M': if (last) { return -1; } goto LAST_M; case 'm': if (last) { return -1; } goto LAST_M; default: return -1; } LAST_E: NEXT_CHAR(); switch (ch) { case 'V': if (last) { return -1; } goto LAST_EV; case 'v': if (last) { return -1; } goto LAST_EV; default: return -1; } LAST_EV: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto LAST_EVE; case 'e': if (last) { return -1; } goto LAST_EVE; default: return -1; } LAST_EVE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto LAST_EVEN; case 'n': if (last) { return -1; } goto LAST_EVEN; default: return -1; } LAST_EVEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto LAST_EVENT; case 't': if (last) { return -1; } goto LAST_EVENT; default: return -1; } LAST_EVENT: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto LAST_EVENT_; default: return -1; } LAST_EVENT_: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto LAST_EVENT_I; case 'i': if (last) { return -1; } goto LAST_EVENT_I; default: return -1; } LAST_EVENT_I: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return 43; } goto LAST_EVENT_ID; case 'd': if (last) { return 43; } goto LAST_EVENT_ID; default: return -1; } LAST_M: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto LAST_MO; case 'o': if (last) { return -1; } goto LAST_MO; default: return -1; } LAST_MO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto LAST_MOD; case 'd': if (last) { return -1; } goto LAST_MOD; default: return -1; } LAST_MOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto LAST_MODI; case 'i': if (last) { return -1; } goto LAST_MODI; default: return -1; } LAST_MODI: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto LAST_MODIF; case 'f': if (last) { return -1; } goto LAST_MODIF; default: return -1; } LAST_MODIF: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto LAST_MODIFI; case 'i': if (last) { return -1; } goto LAST_MODIFI; default: return -1; } LAST_MODIFI: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto LAST_MODIFIE; case 'e': if (last) { return -1; } goto LAST_MODIFIE; default: return -1; } LAST_MODIFIE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return 44; } goto LAST_MODIFIED; case 'd': if (last) { return 44; } goto LAST_MODIFIED; default: return -1; } LI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto LIN; case 'n': if (last) { return -1; } goto LIN; default: return -1; } LIN: NEXT_CHAR(); switch (ch) { case 'K': if (last) { return 45; } goto LINK; case 'k': if (last) { return 45; } goto LINK; default: return -1; } LO: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto LOC; case 'c': if (last) { return -1; } goto LOC; default: return -1; } LOC: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto LOCA; case 'a': if (last) { return -1; } goto LOCA; default: return -1; } LOCA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto LOCAT; case 't': if (last) { return -1; } goto LOCAT; default: return -1; } LOCAT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto LOCATI; case 'i': if (last) { return -1; } goto LOCATI; default: return -1; } LOCATI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto LOCATIO; case 'o': if (last) { return -1; } goto LOCATIO; default: return -1; } LOCATIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 46; } goto LOCATION; case 'n': if (last) { return 46; } goto LOCATION; default: return -1; } M: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto MA; case 'a': if (last) { return -1; } goto MA; default: return -1; } MA: NEXT_CHAR(); switch (ch) { case 'X': if (last) { return -1; } goto MAX; case 'x': if (last) { return -1; } goto MAX; default: return -1; } MAX: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto MAX_; default: return -1; } MAX_: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto MAX_F; case 'f': if (last) { return -1; } goto MAX_F; default: return -1; } MAX_F: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto MAX_FO; case 'o': if (last) { return -1; } goto MAX_FO; default: return -1; } MAX_FO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto MAX_FOR; case 'r': if (last) { return -1; } goto MAX_FOR; default: return -1; } MAX_FOR: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto MAX_FORW; case 'w': if (last) { return -1; } goto MAX_FORW; default: return -1; } MAX_FORW: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto MAX_FORWA; case 'a': if (last) { return -1; } goto MAX_FORWA; default: return -1; } MAX_FORWA: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto MAX_FORWAR; case 'r': if (last) { return -1; } goto MAX_FORWAR; default: return -1; } MAX_FORWAR: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto MAX_FORWARD; case 'd': if (last) { return -1; } goto MAX_FORWARD; default: return -1; } MAX_FORWARD: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 47; } goto MAX_FORWARDS; case 's': if (last) { return 47; } goto MAX_FORWARDS; default: return -1; } O: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto OR; case 'r': if (last) { return -1; } goto OR; default: return -1; } OR: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ORI; case 'i': if (last) { return -1; } goto ORI; default: return -1; } ORI: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto ORIG; case 'g': if (last) { return -1; } goto ORIG; default: return -1; } ORIG: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto ORIGI; case 'i': if (last) { return -1; } goto ORIGI; default: return -1; } ORIGI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 48; } goto ORIGIN; case 'n': if (last) { return 48; } goto ORIGIN; default: return -1; } P: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto PR; case 'r': if (last) { return -1; } goto PR; default: return -1; } PR: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto PRA; case 'a': if (last) { return -1; } goto PRA; case 'O': if (last) { return -1; } goto PRO; case 'o': if (last) { return -1; } goto PRO; default: return -1; } PRA: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto PRAG; case 'g': if (last) { return -1; } goto PRAG; default: return -1; } PRAG: NEXT_CHAR(); switch (ch) { case 'M': if (last) { return -1; } goto PRAGM; case 'm': if (last) { return -1; } goto PRAGM; default: return -1; } PRAGM: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return 49; } goto PRAGMA; case 'a': if (last) { return 49; } goto PRAGMA; default: return -1; } PRO: NEXT_CHAR(); switch (ch) { case 'X': if (last) { return -1; } goto PROX; case 'x': if (last) { return -1; } goto PROX; default: return -1; } PROX: NEXT_CHAR(); switch (ch) { case 'Y': if (last) { return -1; } goto PROXY; case 'y': if (last) { return -1; } goto PROXY; default: return -1; } PROXY: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto PROXY_; default: return -1; } PROXY_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto PROXY_A; case 'a': if (last) { return -1; } goto PROXY_A; default: return -1; } PROXY_A: NEXT_CHAR(); switch (ch) { case 'U': if (last) { return -1; } goto PROXY_AU; case 'u': if (last) { return -1; } goto PROXY_AU; default: return -1; } PROXY_AU: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto PROXY_AUT; case 't': if (last) { return -1; } goto PROXY_AUT; default: return -1; } PROXY_AUT: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto PROXY_AUTH; case 'h': if (last) { return -1; } goto PROXY_AUTH; default: return -1; } PROXY_AUTH: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto PROXY_AUTHE; case 'e': if (last) { return -1; } goto PROXY_AUTHE; case 'O': if (last) { return -1; } goto PROXY_AUTHO; case 'o': if (last) { return -1; } goto PROXY_AUTHO; default: return -1; } PROXY_AUTHE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto PROXY_AUTHEN; case 'n': if (last) { return -1; } goto PROXY_AUTHEN; default: return -1; } PROXY_AUTHEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto PROXY_AUTHENT; case 't': if (last) { return -1; } goto PROXY_AUTHENT; default: return -1; } PROXY_AUTHENT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto PROXY_AUTHENTI; case 'i': if (last) { return -1; } goto PROXY_AUTHENTI; default: return -1; } PROXY_AUTHENTI: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto PROXY_AUTHENTIC; case 'c': if (last) { return -1; } goto PROXY_AUTHENTIC; default: return -1; } PROXY_AUTHENTIC: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto PROXY_AUTHENTICA; case 'a': if (last) { return -1; } goto PROXY_AUTHENTICA; default: return -1; } PROXY_AUTHENTICA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto PROXY_AUTHENTICAT; case 't': if (last) { return -1; } goto PROXY_AUTHENTICAT; default: return -1; } PROXY_AUTHENTICAT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 50; } goto PROXY_AUTHENTICATE; case 'e': if (last) { return 50; } goto PROXY_AUTHENTICATE; default: return -1; } PROXY_AUTHO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto PROXY_AUTHOR; case 'r': if (last) { return -1; } goto PROXY_AUTHOR; default: return -1; } PROXY_AUTHOR: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto PROXY_AUTHORI; case 'i': if (last) { return -1; } goto PROXY_AUTHORI; default: return -1; } PROXY_AUTHORI: NEXT_CHAR(); switch (ch) { case 'Z': if (last) { return -1; } goto PROXY_AUTHORIZ; case 'z': if (last) { return -1; } goto PROXY_AUTHORIZ; default: return -1; } PROXY_AUTHORIZ: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto PROXY_AUTHORIZA; case 'a': if (last) { return -1; } goto PROXY_AUTHORIZA; default: return -1; } PROXY_AUTHORIZA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto PROXY_AUTHORIZAT; case 't': if (last) { return -1; } goto PROXY_AUTHORIZAT; default: return -1; } PROXY_AUTHORIZAT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto PROXY_AUTHORIZATI; case 'i': if (last) { return -1; } goto PROXY_AUTHORIZATI; default: return -1; } PROXY_AUTHORIZATI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto PROXY_AUTHORIZATIO; case 'o': if (last) { return -1; } goto PROXY_AUTHORIZATIO; default: return -1; } PROXY_AUTHORIZATIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 51; } goto PROXY_AUTHORIZATION; case 'n': if (last) { return 51; } goto PROXY_AUTHORIZATION; default: return -1; } R: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto RA; case 'a': if (last) { return -1; } goto RA; case 'E': if (last) { return -1; } goto RE; case 'e': if (last) { return -1; } goto RE; default: return -1; } RA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto RAN; case 'n': if (last) { return -1; } goto RAN; default: return -1; } RAN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto RANG; case 'g': if (last) { return -1; } goto RANG; default: return -1; } RANG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 52; } goto RANGE; case 'e': if (last) { return 52; } goto RANGE; default: return -1; } RE: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto REF; case 'f': if (last) { return -1; } goto REF; case 'T': if (last) { return -1; } goto RET; case 't': if (last) { return -1; } goto RET; default: return -1; } REF: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto REFE; case 'e': if (last) { return -1; } goto REFE; default: return -1; } REFE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto REFER; case 'r': if (last) { return -1; } goto REFER; default: return -1; } REFER: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto REFERE; case 'e': if (last) { return -1; } goto REFERE; default: return -1; } REFERE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return 53; } goto REFERER; case 'r': if (last) { return 53; } goto REFERER; default: return -1; } RET: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto RETR; case 'r': if (last) { return -1; } goto RETR; default: return -1; } RETR: NEXT_CHAR(); switch (ch) { case 'Y': if (last) { return -1; } goto RETRY; case 'y': if (last) { return -1; } goto RETRY; default: return -1; } RETRY: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto RETRY_; default: return -1; } RETRY_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto RETRY_A; case 'a': if (last) { return -1; } goto RETRY_A; default: return -1; } RETRY_A: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto RETRY_AF; case 'f': if (last) { return -1; } goto RETRY_AF; default: return -1; } RETRY_AF: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto RETRY_AFT; case 't': if (last) { return -1; } goto RETRY_AFT; default: return -1; } RETRY_AFT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto RETRY_AFTE; case 'e': if (last) { return -1; } goto RETRY_AFTE; default: return -1; } RETRY_AFTE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return 54; } goto RETRY_AFTER; case 'r': if (last) { return 54; } goto RETRY_AFTER; default: return -1; } S: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SE; case 'e': if (last) { return -1; } goto SE; default: return -1; } SE: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SEC; case 'c': if (last) { return -1; } goto SEC; case 'R': if (last) { return -1; } goto SER; case 'r': if (last) { return -1; } goto SER; case 'T': if (last) { return -1; } goto SET; case 't': if (last) { return -1; } goto SET; default: return -1; } SEC: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto SEC_; default: return -1; } SEC_: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto SEC_W; case 'w': if (last) { return -1; } goto SEC_W; default: return -1; } SEC_W: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WE; case 'e': if (last) { return -1; } goto SEC_WE; default: return -1; } SEC_WE: NEXT_CHAR(); switch (ch) { case 'B': if (last) { return -1; } goto SEC_WEB; case 'b': if (last) { return -1; } goto SEC_WEB; default: return -1; } SEC_WEB: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto SEC_WEBS; case 's': if (last) { return -1; } goto SEC_WEBS; default: return -1; } SEC_WEBS: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSO; case 'o': if (last) { return -1; } goto SEC_WEBSO; default: return -1; } SEC_WEBSO: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SEC_WEBSOC; case 'c': if (last) { return -1; } goto SEC_WEBSOC; default: return -1; } SEC_WEBSOC: NEXT_CHAR(); switch (ch) { case 'K': if (last) { return -1; } goto SEC_WEBSOCK; case 'k': if (last) { return -1; } goto SEC_WEBSOCK; default: return -1; } SEC_WEBSOCK: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WEBSOCKE; case 'e': if (last) { return -1; } goto SEC_WEBSOCKE; default: return -1; } SEC_WEBSOCKE: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto SEC_WEBSOCKET; case 't': if (last) { return -1; } goto SEC_WEBSOCKET; default: return -1; } SEC_WEBSOCKET: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto SEC_WEBSOCKET_; default: return -1; } SEC_WEBSOCKET_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto SEC_WEBSOCKET_A; case 'a': if (last) { return -1; } goto SEC_WEBSOCKET_A; case 'E': if (last) { return -1; } goto SEC_WEBSOCKET_E; case 'e': if (last) { return -1; } goto SEC_WEBSOCKET_E; case 'K': if (last) { return -1; } goto SEC_WEBSOCKET_K; case 'k': if (last) { return -1; } goto SEC_WEBSOCKET_K; case 'P': if (last) { return -1; } goto SEC_WEBSOCKET_P; case 'p': if (last) { return -1; } goto SEC_WEBSOCKET_P; case 'V': if (last) { return -1; } goto SEC_WEBSOCKET_V; case 'v': if (last) { return -1; } goto SEC_WEBSOCKET_V; default: return -1; } SEC_WEBSOCKET_A: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SEC_WEBSOCKET_AC; case 'c': if (last) { return -1; } goto SEC_WEBSOCKET_AC; default: return -1; } SEC_WEBSOCKET_AC: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SEC_WEBSOCKET_ACC; case 'c': if (last) { return -1; } goto SEC_WEBSOCKET_ACC; default: return -1; } SEC_WEBSOCKET_ACC: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WEBSOCKET_ACCE; case 'e': if (last) { return -1; } goto SEC_WEBSOCKET_ACCE; default: return -1; } SEC_WEBSOCKET_ACCE: NEXT_CHAR(); switch (ch) { case 'P': if (last) { return -1; } goto SEC_WEBSOCKET_ACCEP; case 'p': if (last) { return -1; } goto SEC_WEBSOCKET_ACCEP; default: return -1; } SEC_WEBSOCKET_ACCEP: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 55; } goto SEC_WEBSOCKET_ACCEPT; case 't': if (last) { return 55; } goto SEC_WEBSOCKET_ACCEPT; default: return -1; } SEC_WEBSOCKET_E: NEXT_CHAR(); switch (ch) { case 'X': if (last) { return -1; } goto SEC_WEBSOCKET_EX; case 'x': if (last) { return -1; } goto SEC_WEBSOCKET_EX; default: return -1; } SEC_WEBSOCKET_EX: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto SEC_WEBSOCKET_EXT; case 't': if (last) { return -1; } goto SEC_WEBSOCKET_EXT; default: return -1; } SEC_WEBSOCKET_EXT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WEBSOCKET_EXTE; case 'e': if (last) { return -1; } goto SEC_WEBSOCKET_EXTE; default: return -1; } SEC_WEBSOCKET_EXTE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto SEC_WEBSOCKET_EXTEN; case 'n': if (last) { return -1; } goto SEC_WEBSOCKET_EXTEN; default: return -1; } SEC_WEBSOCKET_EXTEN: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENS; case 's': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENS; default: return -1; } SEC_WEBSOCKET_EXTENS: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSI; case 'i': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSI; default: return -1; } SEC_WEBSOCKET_EXTENSI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSIO; case 'o': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSIO; default: return -1; } SEC_WEBSOCKET_EXTENSIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSION; case 'n': if (last) { return -1; } goto SEC_WEBSOCKET_EXTENSION; default: return -1; } SEC_WEBSOCKET_EXTENSION: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return 56; } goto SEC_WEBSOCKET_EXTENSIONS; case 's': if (last) { return 56; } goto SEC_WEBSOCKET_EXTENSIONS; default: return -1; } SEC_WEBSOCKET_K: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WEBSOCKET_KE; case 'e': if (last) { return -1; } goto SEC_WEBSOCKET_KE; default: return -1; } SEC_WEBSOCKET_KE: NEXT_CHAR(); switch (ch) { case 'Y': if (last) { return 57; } goto SEC_WEBSOCKET_KEY; case 'y': if (last) { return 57; } goto SEC_WEBSOCKET_KEY; default: return -1; } SEC_WEBSOCKET_KEY: NEXT_CHAR(); switch (ch) { case '1': if (last) { return 58; } goto SEC_WEBSOCKET_KEY1; default: return -1; } SEC_WEBSOCKET_P: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto SEC_WEBSOCKET_PR; case 'r': if (last) { return -1; } goto SEC_WEBSOCKET_PR; default: return -1; } SEC_WEBSOCKET_PR: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSOCKET_PRO; case 'o': if (last) { return -1; } goto SEC_WEBSOCKET_PRO; default: return -1; } SEC_WEBSOCKET_PRO: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto SEC_WEBSOCKET_PROT; case 't': if (last) { return -1; } goto SEC_WEBSOCKET_PROT; default: return -1; } SEC_WEBSOCKET_PROT: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSOCKET_PROTO; case 'o': if (last) { return -1; } goto SEC_WEBSOCKET_PROTO; default: return -1; } SEC_WEBSOCKET_PROTO: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SEC_WEBSOCKET_PROTOC; case 'c': if (last) { return -1; } goto SEC_WEBSOCKET_PROTOC; default: return -1; } SEC_WEBSOCKET_PROTOC: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSOCKET_PROTOCO; case 'o': if (last) { return -1; } goto SEC_WEBSOCKET_PROTOCO; default: return -1; } SEC_WEBSOCKET_PROTOCO: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return 59; } goto SEC_WEBSOCKET_PROTOCOL; case 'l': if (last) { return 59; } goto SEC_WEBSOCKET_PROTOCOL; default: return -1; } SEC_WEBSOCKET_V: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SEC_WEBSOCKET_VE; case 'e': if (last) { return -1; } goto SEC_WEBSOCKET_VE; default: return -1; } SEC_WEBSOCKET_VE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto SEC_WEBSOCKET_VER; case 'r': if (last) { return -1; } goto SEC_WEBSOCKET_VER; default: return -1; } SEC_WEBSOCKET_VER: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto SEC_WEBSOCKET_VERS; case 's': if (last) { return -1; } goto SEC_WEBSOCKET_VERS; default: return -1; } SEC_WEBSOCKET_VERS: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto SEC_WEBSOCKET_VERSI; case 'i': if (last) { return -1; } goto SEC_WEBSOCKET_VERSI; default: return -1; } SEC_WEBSOCKET_VERSI: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SEC_WEBSOCKET_VERSIO; case 'o': if (last) { return -1; } goto SEC_WEBSOCKET_VERSIO; default: return -1; } SEC_WEBSOCKET_VERSIO: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return 60; } goto SEC_WEBSOCKET_VERSION; case 'n': if (last) { return 60; } goto SEC_WEBSOCKET_VERSION; default: return -1; } SER: NEXT_CHAR(); switch (ch) { case 'V': if (last) { return -1; } goto SERV; case 'v': if (last) { return -1; } goto SERV; default: return -1; } SERV: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto SERVE; case 'e': if (last) { return -1; } goto SERVE; default: return -1; } SERVE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return 61; } goto SERVER; case 'r': if (last) { return 61; } goto SERVER; default: return -1; } SET: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto SET_; default: return -1; } SET_: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto SET_C; case 'c': if (last) { return -1; } goto SET_C; default: return -1; } SET_C: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SET_CO; case 'o': if (last) { return -1; } goto SET_CO; default: return -1; } SET_CO: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto SET_COO; case 'o': if (last) { return -1; } goto SET_COO; default: return -1; } SET_COO: NEXT_CHAR(); switch (ch) { case 'K': if (last) { return -1; } goto SET_COOK; case 'k': if (last) { return -1; } goto SET_COOK; default: return -1; } SET_COOK: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto SET_COOKI; case 'i': if (last) { return -1; } goto SET_COOKI; default: return -1; } SET_COOKI: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 62; } goto SET_COOKIE; case 'e': if (last) { return 62; } goto SET_COOKIE; default: return -1; } T: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 63; } goto TE; case 'e': if (last) { return 63; } goto TE; case 'R': if (last) { return -1; } goto TR; case 'r': if (last) { return -1; } goto TR; default: return -1; } TR: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto TRA; case 'a': if (last) { return -1; } goto TRA; default: return -1; } TRA: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto TRAI; case 'i': if (last) { return -1; } goto TRAI; case 'N': if (last) { return -1; } goto TRAN; case 'n': if (last) { return -1; } goto TRAN; default: return -1; } TRAI: NEXT_CHAR(); switch (ch) { case 'L': if (last) { return -1; } goto TRAIL; case 'l': if (last) { return -1; } goto TRAIL; default: return -1; } TRAIL: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto TRAILE; case 'e': if (last) { return -1; } goto TRAILE; default: return -1; } TRAILE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return 64; } goto TRAILER; case 'r': if (last) { return 64; } goto TRAILER; default: return -1; } TRAN: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto TRANS; case 's': if (last) { return -1; } goto TRANS; default: return -1; } TRANS: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto TRANSF; case 'f': if (last) { return -1; } goto TRANSF; default: return -1; } TRANSF: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto TRANSFE; case 'e': if (last) { return -1; } goto TRANSFE; default: return -1; } TRANSFE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto TRANSFER; case 'r': if (last) { return -1; } goto TRANSFER; default: return -1; } TRANSFER: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto TRANSFER_; default: return -1; } TRANSFER_: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto TRANSFER_E; case 'e': if (last) { return -1; } goto TRANSFER_E; default: return -1; } TRANSFER_E: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto TRANSFER_EN; case 'n': if (last) { return -1; } goto TRANSFER_EN; default: return -1; } TRANSFER_EN: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto TRANSFER_ENC; case 'c': if (last) { return -1; } goto TRANSFER_ENC; default: return -1; } TRANSFER_ENC: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto TRANSFER_ENCO; case 'o': if (last) { return -1; } goto TRANSFER_ENCO; default: return -1; } TRANSFER_ENCO: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto TRANSFER_ENCOD; case 'd': if (last) { return -1; } goto TRANSFER_ENCOD; default: return -1; } TRANSFER_ENCOD: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto TRANSFER_ENCODI; case 'i': if (last) { return -1; } goto TRANSFER_ENCODI; default: return -1; } TRANSFER_ENCODI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto TRANSFER_ENCODIN; case 'n': if (last) { return -1; } goto TRANSFER_ENCODIN; default: return -1; } TRANSFER_ENCODIN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 65; } goto TRANSFER_ENCODING; case 'g': if (last) { return 65; } goto TRANSFER_ENCODING; default: return -1; } U: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto UR; case 'r': if (last) { return -1; } goto UR; case 'P': if (last) { return -1; } goto UP; case 'p': if (last) { return -1; } goto UP; case 'S': if (last) { return -1; } goto US; case 's': if (last) { return -1; } goto US; default: return -1; } UR: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return 66; } goto URI; case 'i': if (last) { return 66; } goto URI; default: return -1; } UP: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto UPG; case 'g': if (last) { return -1; } goto UPG; default: return -1; } UPG: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto UPGR; case 'r': if (last) { return -1; } goto UPGR; default: return -1; } UPGR: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto UPGRA; case 'a': if (last) { return -1; } goto UPGRA; default: return -1; } UPGRA: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto UPGRAD; case 'd': if (last) { return -1; } goto UPGRAD; default: return -1; } UPGRAD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 67; } goto UPGRADE; case 'e': if (last) { return 67; } goto UPGRADE; default: return -1; } US: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto USE; case 'e': if (last) { return -1; } goto USE; default: return -1; } USE: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto USER; case 'r': if (last) { return -1; } goto USER; default: return -1; } USER: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto USER_; default: return -1; } USER_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto USER_A; case 'a': if (last) { return -1; } goto USER_A; default: return -1; } USER_A: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto USER_AG; case 'g': if (last) { return -1; } goto USER_AG; default: return -1; } USER_AG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto USER_AGE; case 'e': if (last) { return -1; } goto USER_AGE; default: return -1; } USER_AGE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto USER_AGEN; case 'n': if (last) { return -1; } goto USER_AGEN; default: return -1; } USER_AGEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 68; } goto USER_AGENT; case 't': if (last) { return 68; } goto USER_AGENT; default: return -1; } V: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto VA; case 'a': if (last) { return -1; } goto VA; case 'I': if (last) { return -1; } goto VI; case 'i': if (last) { return -1; } goto VI; default: return -1; } VA: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto VAR; case 'r': if (last) { return -1; } goto VAR; default: return -1; } VAR: NEXT_CHAR(); switch (ch) { case 'Y': if (last) { return 69; } goto VARY; case 'y': if (last) { return 69; } goto VARY; default: return -1; } VI: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return 70; } goto VIA; case 'a': if (last) { return 70; } goto VIA; default: return -1; } W: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto WW; case 'w': if (last) { return -1; } goto WW; case 'A': if (last) { return -1; } goto WA; case 'a': if (last) { return -1; } goto WA; default: return -1; } WW: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto WWW; case 'w': if (last) { return -1; } goto WWW; default: return -1; } WWW: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto WWW_; default: return -1; } WWW_: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto WWW_A; case 'a': if (last) { return -1; } goto WWW_A; default: return -1; } WWW_A: NEXT_CHAR(); switch (ch) { case 'U': if (last) { return -1; } goto WWW_AU; case 'u': if (last) { return -1; } goto WWW_AU; default: return -1; } WWW_AU: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto WWW_AUT; case 't': if (last) { return -1; } goto WWW_AUT; default: return -1; } WWW_AUT: NEXT_CHAR(); switch (ch) { case 'H': if (last) { return -1; } goto WWW_AUTH; case 'h': if (last) { return -1; } goto WWW_AUTH; default: return -1; } WWW_AUTH: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto WWW_AUTHE; case 'e': if (last) { return -1; } goto WWW_AUTHE; default: return -1; } WWW_AUTHE: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto WWW_AUTHEN; case 'n': if (last) { return -1; } goto WWW_AUTHEN; default: return -1; } WWW_AUTHEN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto WWW_AUTHENT; case 't': if (last) { return -1; } goto WWW_AUTHENT; default: return -1; } WWW_AUTHENT: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto WWW_AUTHENTI; case 'i': if (last) { return -1; } goto WWW_AUTHENTI; default: return -1; } WWW_AUTHENTI: NEXT_CHAR(); switch (ch) { case 'C': if (last) { return -1; } goto WWW_AUTHENTIC; case 'c': if (last) { return -1; } goto WWW_AUTHENTIC; default: return -1; } WWW_AUTHENTIC: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto WWW_AUTHENTICA; case 'a': if (last) { return -1; } goto WWW_AUTHENTICA; default: return -1; } WWW_AUTHENTICA: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto WWW_AUTHENTICAT; case 't': if (last) { return -1; } goto WWW_AUTHENTICAT; default: return -1; } WWW_AUTHENTICAT: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return 71; } goto WWW_AUTHENTICATE; case 'e': if (last) { return 71; } goto WWW_AUTHENTICATE; default: return -1; } WA: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto WAN; case 'n': if (last) { return -1; } goto WAN; case 'R': if (last) { return -1; } goto WAR; case 'r': if (last) { return -1; } goto WAR; default: return -1; } WAN: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto WANT; case 't': if (last) { return -1; } goto WANT; default: return -1; } WANT: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto WANT_; default: return -1; } WANT_: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto WANT_D; case 'd': if (last) { return -1; } goto WANT_D; default: return -1; } WANT_D: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto WANT_DI; case 'i': if (last) { return -1; } goto WANT_DI; default: return -1; } WANT_DI: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return -1; } goto WANT_DIG; case 'g': if (last) { return -1; } goto WANT_DIG; default: return -1; } WANT_DIG: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto WANT_DIGE; case 'e': if (last) { return -1; } goto WANT_DIGE; default: return -1; } WANT_DIGE: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto WANT_DIGES; case 's': if (last) { return -1; } goto WANT_DIGES; default: return -1; } WANT_DIGES: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 72; } goto WANT_DIGEST; case 't': if (last) { return 72; } goto WANT_DIGEST; default: return -1; } WAR: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto WARN; case 'n': if (last) { return -1; } goto WARN; default: return -1; } WARN: NEXT_CHAR(); switch (ch) { case 'I': if (last) { return -1; } goto WARNI; case 'i': if (last) { return -1; } goto WARNI; default: return -1; } WARNI: NEXT_CHAR(); switch (ch) { case 'N': if (last) { return -1; } goto WARNIN; case 'n': if (last) { return -1; } goto WARNIN; default: return -1; } WARNIN: NEXT_CHAR(); switch (ch) { case 'G': if (last) { return 73; } goto WARNING; case 'g': if (last) { return 73; } goto WARNING; default: return -1; } X: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto X_; default: return -1; } X_: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto X_F; case 'f': if (last) { return -1; } goto X_F; default: return -1; } X_F: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto X_FO; case 'o': if (last) { return -1; } goto X_FO; default: return -1; } X_FO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto X_FOR; case 'r': if (last) { return -1; } goto X_FOR; default: return -1; } X_FOR: NEXT_CHAR(); switch (ch) { case 'W': if (last) { return -1; } goto X_FORW; case 'w': if (last) { return -1; } goto X_FORW; default: return -1; } X_FORW: NEXT_CHAR(); switch (ch) { case 'A': if (last) { return -1; } goto X_FORWA; case 'a': if (last) { return -1; } goto X_FORWA; default: return -1; } X_FORWA: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto X_FORWAR; case 'r': if (last) { return -1; } goto X_FORWAR; default: return -1; } X_FORWAR: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto X_FORWARD; case 'd': if (last) { return -1; } goto X_FORWARD; default: return -1; } X_FORWARD: NEXT_CHAR(); switch (ch) { case 'E': if (last) { return -1; } goto X_FORWARDE; case 'e': if (last) { return -1; } goto X_FORWARDE; default: return -1; } X_FORWARDE: NEXT_CHAR(); switch (ch) { case 'D': if (last) { return -1; } goto X_FORWARDED; case 'd': if (last) { return -1; } goto X_FORWARDED; default: return -1; } X_FORWARDED: NEXT_CHAR(); switch (ch) { case '-': if (last) { return -1; } goto X_FORWARDED_; default: return -1; } X_FORWARDED_: NEXT_CHAR(); switch (ch) { case 'F': if (last) { return -1; } goto X_FORWARDED_F; case 'f': if (last) { return -1; } goto X_FORWARDED_F; case 'H': if (last) { return -1; } goto X_FORWARDED_H; case 'h': if (last) { return -1; } goto X_FORWARDED_H; case 'P': if (last) { return -1; } goto X_FORWARDED_P; case 'p': if (last) { return -1; } goto X_FORWARDED_P; default: return -1; } X_FORWARDED_F: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto X_FORWARDED_FO; case 'o': if (last) { return -1; } goto X_FORWARDED_FO; default: return -1; } X_FORWARDED_FO: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return 74; } goto X_FORWARDED_FOR; case 'r': if (last) { return 74; } goto X_FORWARDED_FOR; default: return -1; } X_FORWARDED_H: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto X_FORWARDED_HO; case 'o': if (last) { return -1; } goto X_FORWARDED_HO; default: return -1; } X_FORWARDED_HO: NEXT_CHAR(); switch (ch) { case 'S': if (last) { return -1; } goto X_FORWARDED_HOS; case 's': if (last) { return -1; } goto X_FORWARDED_HOS; default: return -1; } X_FORWARDED_HOS: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return 75; } goto X_FORWARDED_HOST; case 't': if (last) { return 75; } goto X_FORWARDED_HOST; default: return -1; } X_FORWARDED_P: NEXT_CHAR(); switch (ch) { case 'R': if (last) { return -1; } goto X_FORWARDED_PR; case 'r': if (last) { return -1; } goto X_FORWARDED_PR; default: return -1; } X_FORWARDED_PR: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return -1; } goto X_FORWARDED_PRO; case 'o': if (last) { return -1; } goto X_FORWARDED_PRO; default: return -1; } X_FORWARDED_PRO: NEXT_CHAR(); switch (ch) { case 'T': if (last) { return -1; } goto X_FORWARDED_PROT; case 't': if (last) { return -1; } goto X_FORWARDED_PROT; default: return -1; } X_FORWARDED_PROT: NEXT_CHAR(); switch (ch) { case 'O': if (last) { return 76; } goto X_FORWARDED_PROTO; case 'o': if (last) { return 76; } goto X_FORWARDED_PROTO; default: return -1; } ACCEPT_CHARSET: ACCEPT_ENCODING: ACCEPT_LANGUAGE: ACCEPT_RANGES: ACCESS_CONTROL_ALLOW_CREDENTIALS: ACCESS_CONTROL_ALLOW_HEADERS: ACCESS_CONTROL_ALLOW_METHODS: ACCESS_CONTROL_ALLOW_ORIGIN: ACCESS_CONTROL_EXPOSE_HEADERS: ACCESS_CONTROL_MAX_AGE: ACCESS_CONTROL_REQUEST_HEADERS: ACCESS_CONTROL_REQUEST_METHOD: AGE: ALLOW: AUTHORIZATION: CACHE_CONTROL: CONNECTION: CONTENT_DISPOSITION: CONTENT_ENCODING: CONTENT_LANGUAGE: CONTENT_LENGTH: CONTENT_LOCATION: CONTENT_MD5: CONTENT_RANGE: CONTENT_TRANSFER_ENCODING: CONTENT_TYPE: COOKIE: DATE: DESTINATION: DIGEST: ETAG: EXPECT: EXPIRES: FORWARDED: FROM: HOST: IF_MATCH: IF_MODIFIED_SINCE: IF_NONE_MATCH: IF_RANGE: IF_UNMODIFIED_SINCE: KEEP_ALIVE: LAST_EVENT_ID: LAST_MODIFIED: LINK: LOCATION: MAX_FORWARDS: ORIGIN: PRAGMA: PROXY_AUTHENTICATE: PROXY_AUTHORIZATION: RANGE: REFERER: RETRY_AFTER: SEC_WEBSOCKET_ACCEPT: SEC_WEBSOCKET_EXTENSIONS: SEC_WEBSOCKET_KEY1: SEC_WEBSOCKET_PROTOCOL: SEC_WEBSOCKET_VERSION: SERVER: SET_COOKIE: TE: TRAILER: TRANSFER_ENCODING: UPGRADE: URI: USER_AGENT: VARY: VIA: WANT_DIGEST: WARNING: WWW_AUTHENTICATE: X_FORWARDED_FOR: X_FORWARDED_HOST: X_FORWARDED_PROTO: missing: /* nothing found */ return -1; } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/_find_header.h0000644000175100001710000000025200000000000016742 0ustar00runnerdocker#ifndef _FIND_HEADERS_H #define _FIND_HEADERS_H #ifdef __cplusplus extern "C" { #endif int find_header(const char *str, int size); #ifdef __cplusplus } #endif #endif ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/_find_header.pxd0000644000175100001710000000010400000000000017302 0ustar00runnerdockercdef extern from "_find_header.h": int find_header(char *, int) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920314.0 aiohttp-3.8.1/aiohttp/_headers.pxi0000644000175100001710000000372700000000000016510 0ustar00runnerdocker# The file is autogenerated from aiohttp/hdrs.py # Run ./tools/gen.py to update it after the origin changing. from . import hdrs cdef tuple headers = ( hdrs.ACCEPT, hdrs.ACCEPT_CHARSET, hdrs.ACCEPT_ENCODING, hdrs.ACCEPT_LANGUAGE, hdrs.ACCEPT_RANGES, hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, hdrs.ACCESS_CONTROL_ALLOW_HEADERS, hdrs.ACCESS_CONTROL_ALLOW_METHODS, hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, hdrs.ACCESS_CONTROL_MAX_AGE, hdrs.ACCESS_CONTROL_REQUEST_HEADERS, hdrs.ACCESS_CONTROL_REQUEST_METHOD, hdrs.AGE, hdrs.ALLOW, hdrs.AUTHORIZATION, hdrs.CACHE_CONTROL, hdrs.CONNECTION, hdrs.CONTENT_DISPOSITION, hdrs.CONTENT_ENCODING, hdrs.CONTENT_LANGUAGE, hdrs.CONTENT_LENGTH, hdrs.CONTENT_LOCATION, hdrs.CONTENT_MD5, hdrs.CONTENT_RANGE, hdrs.CONTENT_TRANSFER_ENCODING, hdrs.CONTENT_TYPE, hdrs.COOKIE, hdrs.DATE, hdrs.DESTINATION, hdrs.DIGEST, hdrs.ETAG, hdrs.EXPECT, hdrs.EXPIRES, hdrs.FORWARDED, hdrs.FROM, hdrs.HOST, hdrs.IF_MATCH, hdrs.IF_MODIFIED_SINCE, hdrs.IF_NONE_MATCH, hdrs.IF_RANGE, hdrs.IF_UNMODIFIED_SINCE, hdrs.KEEP_ALIVE, hdrs.LAST_EVENT_ID, hdrs.LAST_MODIFIED, hdrs.LINK, hdrs.LOCATION, hdrs.MAX_FORWARDS, hdrs.ORIGIN, hdrs.PRAGMA, hdrs.PROXY_AUTHENTICATE, hdrs.PROXY_AUTHORIZATION, hdrs.RANGE, hdrs.REFERER, hdrs.RETRY_AFTER, hdrs.SEC_WEBSOCKET_ACCEPT, hdrs.SEC_WEBSOCKET_EXTENSIONS, hdrs.SEC_WEBSOCKET_KEY, hdrs.SEC_WEBSOCKET_KEY1, hdrs.SEC_WEBSOCKET_PROTOCOL, hdrs.SEC_WEBSOCKET_VERSION, hdrs.SERVER, hdrs.SET_COOKIE, hdrs.TE, hdrs.TRAILER, hdrs.TRANSFER_ENCODING, hdrs.URI, hdrs.UPGRADE, hdrs.USER_AGENT, hdrs.VARY, hdrs.VIA, hdrs.WWW_AUTHENTICATE, hdrs.WANT_DIGEST, hdrs.WARNING, hdrs.X_FORWARDED_FOR, hdrs.X_FORWARDED_HOST, hdrs.X_FORWARDED_PROTO, ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920315.0 aiohttp-3.8.1/aiohttp/_helpers.c0000644000175100001710000063776600000000000016201 0ustar00runnerdocker/* Generated by Cython 0.29.24 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* PY_SSIZE_T_CLEAN */ #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else #define CYTHON_ABI "0_29_24" #define CYTHON_HEX_VERSION 0x001D18F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #if PY_VERSION_HEX >= 0x02070000 #define HAVE_LONG_LONG #endif #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #elif !defined(CYTHON_USE_PYLONG_INTERNALS) #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) #endif #ifndef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) #endif #ifndef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } # else # define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; #endif #endif #else #include #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) && __cplusplus >= 201103L #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #elif __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__ ) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #define __Pyx_DefaultClassType PyType_Type #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_FAST_PYCCALL #define __Pyx_PyFastCFunction_Check(func)\ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) #else #define __Pyx_PyFastCFunction_Check(func) 0 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 #define PyMem_RawMalloc(n) PyMem_Malloc(n) #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) #define PyMem_RawFree(p) PyMem_Free(p) #endif #if CYTHON_COMPILING_IN_PYSTON #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) #else #define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #if defined(PyUnicode_IS_READY) #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #else #define __Pyx_PyUnicode_READY(op) (0) #endif #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #endif #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #if PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #else #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__aiohttp___helpers #define __PYX_HAVE_API__aiohttp___helpers /* Early includes */ #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "aiohttp/_helpers.pyx", "stringsource", }; /*--- Type declarations ---*/ struct __pyx_obj_7aiohttp_8_helpers_reify; /* "aiohttp/_helpers.pyx":1 * cdef class reify: # <<<<<<<<<<<<<< * """Use as a class method decorator. It operates almost exactly like * the Python `@property` decorator, but it puts the result of the */ struct __pyx_obj_7aiohttp_8_helpers_reify { PyObject_HEAD PyObject *wrapped; PyObject *name; }; /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ const char* function_name); /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* GetItemInt.proto */ #define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ __Pyx_GetItemInt_Generic(o, to_py_func(i)))) #define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); #define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck); /* ObjectGetItem.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key); #else #define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) #endif /* GetTopmostException.proto */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); #endif /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() PyErr_Occurred() #endif /* SaveResetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); #else #define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) #define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) #endif /* PyErrExceptionMatches.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); #else #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) #endif /* GetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); #endif /* PyCFunctionFastCall.proto */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); #else #define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) #endif /* PyFunctionFastCall.proto */ #if CYTHON_FAST_PYCALL #define __Pyx_PyFunction_FastCall(func, args, nargs)\ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); #else #define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) #endif #define __Pyx_BUILD_ASSERT_EXPR(cond)\ (sizeof(char [1 - 2*!(cond)]) - 1) #ifndef Py_MEMBER_SIZE #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) #endif static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" #define __Pxy_PyFrame_Initialize_Offsets()\ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) #define __Pyx_PyFrame_GetLocalsplus(frame)\ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* PyObjectCall2Args.proto */ static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); /* PyObjectCallMethO.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif /* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* GetAttr.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); /* GetAttr3.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* GetModuleGlobalName.proto */ #if CYTHON_USE_DICT_VERSIONS #define __Pyx_GetModuleGlobalName(var, name) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } #define __Pyx_GetModuleGlobalNameUncached(var, name) {\ PY_UINT64_T __pyx_dict_version;\ PyObject *__pyx_dict_cached_value;\ (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); #else #define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) #define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); #endif /* Import.proto */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /* ImportFrom.proto */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); /* HasAttr.proto */ static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); /* PyObject_GenericGetAttrNoDict.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr #endif /* PyObject_GenericGetAttr.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr #endif /* PyObjectGetAttrStrNoError.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); /* SetupReduce.proto */ static int __Pyx_setup_reduce(PyObject* type_obj); /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* GCCDiagnostics.proto */ #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* Module declarations from 'aiohttp._helpers' */ static PyTypeObject *__pyx_ptype_7aiohttp_8_helpers_reify = 0; static PyObject *__pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(struct __pyx_obj_7aiohttp_8_helpers_reify *, PyObject *); /*proto*/ #define __Pyx_MODULE_NAME "aiohttp._helpers" extern int __pyx_module_is_main_aiohttp___helpers; int __pyx_module_is_main_aiohttp___helpers = 0; /* Implementation of 'aiohttp._helpers' */ static PyObject *__pyx_builtin_KeyError; static PyObject *__pyx_builtin_AttributeError; static const char __pyx_k_doc[] = "__doc__"; static const char __pyx_k_new[] = "__new__"; static const char __pyx_k_dict[] = "__dict__"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_cache[] = "_cache"; static const char __pyx_k_reify[] = "reify"; static const char __pyx_k_import[] = "__import__"; static const char __pyx_k_pickle[] = "pickle"; static const char __pyx_k_reduce[] = "__reduce__"; static const char __pyx_k_update[] = "update"; static const char __pyx_k_wrapped[] = "wrapped"; static const char __pyx_k_KeyError[] = "KeyError"; static const char __pyx_k_getstate[] = "__getstate__"; static const char __pyx_k_pyx_type[] = "__pyx_type"; static const char __pyx_k_setstate[] = "__setstate__"; static const char __pyx_k_pyx_state[] = "__pyx_state"; static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; static const char __pyx_k_pyx_result[] = "__pyx_result"; static const char __pyx_k_PickleError[] = "PickleError"; static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; static const char __pyx_k_stringsource[] = "stringsource"; static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; static const char __pyx_k_AttributeError[] = "AttributeError"; static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; static const char __pyx_k_aiohttp__helpers[] = "aiohttp._helpers"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_pyx_unpickle_reify[] = "__pyx_unpickle_reify"; static const char __pyx_k_reified_property_is_read_only[] = "reified property is read-only"; static const char __pyx_k_Incompatible_checksums_s_vs_0x77[] = "Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))"; static PyObject *__pyx_n_s_AttributeError; static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0x77; static PyObject *__pyx_n_s_KeyError; static PyObject *__pyx_n_s_PickleError; static PyObject *__pyx_n_s_aiohttp__helpers; static PyObject *__pyx_n_s_cache; static PyObject *__pyx_n_s_cline_in_traceback; static PyObject *__pyx_n_s_dict; static PyObject *__pyx_n_s_doc; static PyObject *__pyx_n_s_getstate; static PyObject *__pyx_n_s_import; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_name; static PyObject *__pyx_n_s_new; static PyObject *__pyx_n_s_pickle; static PyObject *__pyx_n_s_pyx_PickleError; static PyObject *__pyx_n_s_pyx_checksum; static PyObject *__pyx_n_s_pyx_result; static PyObject *__pyx_n_s_pyx_state; static PyObject *__pyx_n_s_pyx_type; static PyObject *__pyx_n_s_pyx_unpickle_reify; static PyObject *__pyx_n_s_reduce; static PyObject *__pyx_n_s_reduce_cython; static PyObject *__pyx_n_s_reduce_ex; static PyObject *__pyx_kp_u_reified_property_is_read_only; static PyObject *__pyx_n_s_reify; static PyObject *__pyx_n_s_setstate; static PyObject *__pyx_n_s_setstate_cython; static PyObject *__pyx_kp_s_stringsource; static PyObject *__pyx_n_s_test; static PyObject *__pyx_n_s_update; static PyObject *__pyx_n_s_wrapped; static int __pyx_pf_7aiohttp_8_helpers_5reify___init__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_wrapped); /* proto */ static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_2__get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_owner); /* proto */ static int __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_value); /* proto */ static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ static PyObject *__pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ static PyObject *__pyx_tp_new_7aiohttp_8_helpers_reify(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_int_124832655; static PyObject *__pyx_tuple_; static PyObject *__pyx_tuple__2; static PyObject *__pyx_codeobj__3; /* Late includes */ /* "aiohttp/_helpers.pyx":13 * cdef object name * * def __init__(self, wrapped): # <<<<<<<<<<<<<< * self.wrapped = wrapped * self.name = wrapped.__name__ */ /* Python wrapper */ static int __pyx_pw_7aiohttp_8_helpers_5reify_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_8_helpers_5reify_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_wrapped = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_wrapped,0}; PyObject* values[1] = {0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_wrapped)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 13, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); } __pyx_v_wrapped = values[0]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 13, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("aiohttp._helpers.reify.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify___init__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), __pyx_v_wrapped); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_8_helpers_5reify___init__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_wrapped) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 0); /* "aiohttp/_helpers.pyx":14 * * def __init__(self, wrapped): * self.wrapped = wrapped # <<<<<<<<<<<<<< * self.name = wrapped.__name__ * */ __Pyx_INCREF(__pyx_v_wrapped); __Pyx_GIVEREF(__pyx_v_wrapped); __Pyx_GOTREF(__pyx_v_self->wrapped); __Pyx_DECREF(__pyx_v_self->wrapped); __pyx_v_self->wrapped = __pyx_v_wrapped; /* "aiohttp/_helpers.pyx":15 * def __init__(self, wrapped): * self.wrapped = wrapped * self.name = wrapped.__name__ # <<<<<<<<<<<<<< * * @property */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_wrapped, __pyx_n_s_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->name); __Pyx_DECREF(__pyx_v_self->name); __pyx_v_self->name = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_helpers.pyx":13 * cdef object name * * def __init__(self, wrapped): # <<<<<<<<<<<<<< * self.wrapped = wrapped * self.name = wrapped.__name__ */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._helpers.reify.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_helpers.pyx":18 * * @property * def __doc__(self): # <<<<<<<<<<<<<< * return self.wrapped.__doc__ * */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); /* "aiohttp/_helpers.pyx":19 * @property * def __doc__(self): * return self.wrapped.__doc__ # <<<<<<<<<<<<<< * * def __get__(self, inst, owner): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->wrapped, __pyx_n_s_doc); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "aiohttp/_helpers.pyx":18 * * @property * def __doc__(self): # <<<<<<<<<<<<<< * return self.wrapped.__doc__ * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._helpers.reify.__doc__.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_helpers.pyx":21 * return self.wrapped.__doc__ * * def __get__(self, inst, owner): # <<<<<<<<<<<<<< * try: * try: */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_3__get__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_owner); /*proto*/ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_3__get__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_owner) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_2__get__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), ((PyObject *)__pyx_v_inst), ((PyObject *)__pyx_v_owner)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_2__get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_owner) { PyObject *__pyx_v_val = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_t_9; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; int __pyx_t_14; int __pyx_t_15; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); /* "aiohttp/_helpers.pyx":22 * * def __get__(self, inst, owner): * try: # <<<<<<<<<<<<<< * try: * return inst._cache[self.name] */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "aiohttp/_helpers.pyx":23 * def __get__(self, inst, owner): * try: * try: # <<<<<<<<<<<<<< * return inst._cache[self.name] * except KeyError: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6); __Pyx_XGOTREF(__pyx_t_4); __Pyx_XGOTREF(__pyx_t_5); __Pyx_XGOTREF(__pyx_t_6); /*try:*/ { /* "aiohttp/_helpers.pyx":24 * try: * try: * return inst._cache[self.name] # <<<<<<<<<<<<<< * except KeyError: * val = self.wrapped(inst) */ __Pyx_XDECREF(__pyx_r); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_inst, __pyx_n_s_cache); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 24, __pyx_L9_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = __Pyx_PyObject_GetItem(__pyx_t_7, __pyx_v_self->name); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 24, __pyx_L9_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_r = __pyx_t_8; __pyx_t_8 = 0; goto __pyx_L13_try_return; /* "aiohttp/_helpers.pyx":23 * def __get__(self, inst, owner): * try: * try: # <<<<<<<<<<<<<< * return inst._cache[self.name] * except KeyError: */ } __pyx_L9_error:; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; /* "aiohttp/_helpers.pyx":25 * try: * return inst._cache[self.name] * except KeyError: # <<<<<<<<<<<<<< * val = self.wrapped(inst) * inst._cache[self.name] = val */ __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_KeyError); if (__pyx_t_9) { __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_7, &__pyx_t_10) < 0) __PYX_ERR(0, 25, __pyx_L11_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_GOTREF(__pyx_t_7); __Pyx_GOTREF(__pyx_t_10); /* "aiohttp/_helpers.pyx":26 * return inst._cache[self.name] * except KeyError: * val = self.wrapped(inst) # <<<<<<<<<<<<<< * inst._cache[self.name] = val * return val */ __Pyx_INCREF(__pyx_v_self->wrapped); __pyx_t_12 = __pyx_v_self->wrapped; __pyx_t_13 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_12))) { __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_12); if (likely(__pyx_t_13)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12); __Pyx_INCREF(__pyx_t_13); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_12, function); } } __pyx_t_11 = (__pyx_t_13) ? __Pyx_PyObject_Call2Args(__pyx_t_12, __pyx_t_13, __pyx_v_inst) : __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_v_inst); __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 26, __pyx_L11_except_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; __pyx_v_val = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_helpers.pyx":27 * except KeyError: * val = self.wrapped(inst) * inst._cache[self.name] = val # <<<<<<<<<<<<<< * return val * except AttributeError: */ __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_v_inst, __pyx_n_s_cache); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 27, __pyx_L11_except_error) __Pyx_GOTREF(__pyx_t_11); if (unlikely(PyObject_SetItem(__pyx_t_11, __pyx_v_self->name, __pyx_v_val) < 0)) __PYX_ERR(0, 27, __pyx_L11_except_error) __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; /* "aiohttp/_helpers.pyx":28 * val = self.wrapped(inst) * inst._cache[self.name] = val * return val # <<<<<<<<<<<<<< * except AttributeError: * if inst is None: */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_val); __pyx_r = __pyx_v_val; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; goto __pyx_L12_except_return; } goto __pyx_L11_except_error; __pyx_L11_except_error:; /* "aiohttp/_helpers.pyx":23 * def __get__(self, inst, owner): * try: * try: # <<<<<<<<<<<<<< * return inst._cache[self.name] * except KeyError: */ __Pyx_XGIVEREF(__pyx_t_4); __Pyx_XGIVEREF(__pyx_t_5); __Pyx_XGIVEREF(__pyx_t_6); __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); goto __pyx_L3_error; __pyx_L13_try_return:; __Pyx_XGIVEREF(__pyx_t_4); __Pyx_XGIVEREF(__pyx_t_5); __Pyx_XGIVEREF(__pyx_t_6); __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); goto __pyx_L7_try_return; __pyx_L12_except_return:; __Pyx_XGIVEREF(__pyx_t_4); __Pyx_XGIVEREF(__pyx_t_5); __Pyx_XGIVEREF(__pyx_t_6); __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); goto __pyx_L7_try_return; } /* "aiohttp/_helpers.pyx":22 * * def __get__(self, inst, owner): * try: # <<<<<<<<<<<<<< * try: * return inst._cache[self.name] */ } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; /* "aiohttp/_helpers.pyx":29 * inst._cache[self.name] = val * return val * except AttributeError: # <<<<<<<<<<<<<< * if inst is None: * return self */ __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_AttributeError); if (__pyx_t_9) { __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_7, &__pyx_t_8) < 0) __PYX_ERR(0, 29, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_GOTREF(__pyx_t_7); __Pyx_GOTREF(__pyx_t_8); /* "aiohttp/_helpers.pyx":30 * return val * except AttributeError: * if inst is None: # <<<<<<<<<<<<<< * return self * raise */ __pyx_t_14 = (__pyx_v_inst == Py_None); __pyx_t_15 = (__pyx_t_14 != 0); if (__pyx_t_15) { /* "aiohttp/_helpers.pyx":31 * except AttributeError: * if inst is None: * return self # <<<<<<<<<<<<<< * raise * */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_self)); __pyx_r = ((PyObject *)__pyx_v_self); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; goto __pyx_L6_except_return; /* "aiohttp/_helpers.pyx":30 * return val * except AttributeError: * if inst is None: # <<<<<<<<<<<<<< * return self * raise */ } /* "aiohttp/_helpers.pyx":32 * if inst is None: * return self * raise # <<<<<<<<<<<<<< * * def __set__(self, inst, value): */ __Pyx_GIVEREF(__pyx_t_10); __Pyx_GIVEREF(__pyx_t_7); __Pyx_XGIVEREF(__pyx_t_8); __Pyx_ErrRestoreWithState(__pyx_t_10, __pyx_t_7, __pyx_t_8); __pyx_t_10 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __PYX_ERR(0, 32, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "aiohttp/_helpers.pyx":22 * * def __get__(self, inst, owner): * try: # <<<<<<<<<<<<<< * try: * return inst._cache[self.name] */ __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L7_try_return:; __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L0; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L0; } /* "aiohttp/_helpers.pyx":21 * return self.wrapped.__doc__ * * def __get__(self, inst, owner): # <<<<<<<<<<<<<< * try: * try: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_XDECREF(__pyx_t_12); __Pyx_XDECREF(__pyx_t_13); __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_val); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_helpers.pyx":34 * raise * * def __set__(self, inst, value): # <<<<<<<<<<<<<< * raise AttributeError("reified property is read-only") */ /* Python wrapper */ static int __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_value); /*proto*/ static int __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_value) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), ((PyObject *)__pyx_v_inst), ((PyObject *)__pyx_v_value)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_value) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__set__", 0); /* "aiohttp/_helpers.pyx":35 * * def __set__(self, inst, value): * raise AttributeError("reified property is read-only") # <<<<<<<<<<<<<< */ __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_AttributeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 35, __pyx_L1_error) /* "aiohttp/_helpers.pyx":34 * raise * * def __set__(self, inst, value): # <<<<<<<<<<<<<< * raise AttributeError("reified property is read-only") */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._helpers.reify.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self) { PyObject *__pyx_v_state = 0; PyObject *__pyx_v__dict = 0; int __pyx_v_use_setstate; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":5 * cdef object _dict * cdef bint use_setstate * state = (self.name, self.wrapped) # <<<<<<<<<<<<<< * _dict = getattr(self, '__dict__', None) * if _dict is not None: */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v_self->name); __Pyx_GIVEREF(__pyx_v_self->name); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name); __Pyx_INCREF(__pyx_v_self->wrapped); __Pyx_GIVEREF(__pyx_v_self->wrapped); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->wrapped); __pyx_v_state = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":6 * cdef bint use_setstate * state = (self.name, self.wrapped) * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< * if _dict is not None: * state += (_dict,) */ __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v__dict = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":7 * state = (self.name, self.wrapped) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ __pyx_t_2 = (__pyx_v__dict != Py_None); __pyx_t_3 = (__pyx_t_2 != 0); if (__pyx_t_3) { /* "(tree fragment)":8 * _dict = getattr(self, '__dict__', None) * if _dict is not None: * state += (_dict,) # <<<<<<<<<<<<<< * use_setstate = True * else: */ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v__dict); __Pyx_GIVEREF(__pyx_v__dict); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); __pyx_t_4 = 0; /* "(tree fragment)":9 * if _dict is not None: * state += (_dict,) * use_setstate = True # <<<<<<<<<<<<<< * else: * use_setstate = self.name is not None or self.wrapped is not None */ __pyx_v_use_setstate = 1; /* "(tree fragment)":7 * state = (self.name, self.wrapped) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ goto __pyx_L3; } /* "(tree fragment)":11 * use_setstate = True * else: * use_setstate = self.name is not None or self.wrapped is not None # <<<<<<<<<<<<<< * if use_setstate: * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state */ /*else*/ { __pyx_t_2 = (__pyx_v_self->name != Py_None); __pyx_t_5 = (__pyx_t_2 != 0); if (!__pyx_t_5) { } else { __pyx_t_3 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = (__pyx_v_self->wrapped != Py_None); __pyx_t_2 = (__pyx_t_5 != 0); __pyx_t_3 = __pyx_t_2; __pyx_L4_bool_binop_done:; __pyx_v_use_setstate = __pyx_t_3; } __pyx_L3:; /* "(tree fragment)":12 * else: * use_setstate = self.name is not None or self.wrapped is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state * else: */ __pyx_t_3 = (__pyx_v_use_setstate != 0); if (__pyx_t_3) { /* "(tree fragment)":13 * use_setstate = self.name is not None or self.wrapped is not None * if use_setstate: * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state # <<<<<<<<<<<<<< * else: * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_reify); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_124832655); __Pyx_GIVEREF(__pyx_int_124832655); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_124832655); __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state); __pyx_t_4 = 0; __pyx_t_1 = 0; __pyx_r = __pyx_t_6; __pyx_t_6 = 0; goto __pyx_L0; /* "(tree fragment)":12 * else: * use_setstate = self.name is not None or self.wrapped is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state * else: */ } /* "(tree fragment)":15 * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state * else: * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_reify__set_state(self, __pyx_state) */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pyx_unpickle_reify); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_124832655); __Pyx_GIVEREF(__pyx_int_124832655); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_124832655); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); __pyx_t_6 = 0; __pyx_t_1 = 0; __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("aiohttp._helpers.reify.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_state); __Pyx_XDECREF(__pyx_v__dict); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":16 * else: * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_reify__set_state(self, __pyx_state) */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":17 * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_reify__set_state(self, __pyx_state) # <<<<<<<<<<<<<< */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) __pyx_t_1 = __pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":16 * else: * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_reify__set_state(self, __pyx_state) */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._helpers.reify.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_8_helpers_1__pyx_unpickle_reify = {"__pyx_unpickle_reify", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v___pyx_type = 0; long __pyx_v___pyx_checksum; PyObject *__pyx_v___pyx_state = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__pyx_unpickle_reify (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; PyObject* values[3] = {0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_reify") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v___pyx_type = values[0]; __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) __pyx_v___pyx_state = values[2]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_v___pyx_PickleError = 0; PyObject *__pyx_v___pyx_result = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_reify", 0); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum != 0x770cb8f: # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) */ __pyx_t_1 = ((__pyx_v___pyx_checksum != 0x770cb8f) != 0); if (__pyx_t_1) { /* "(tree fragment)":5 * cdef object __pyx_result * if __pyx_checksum != 0x770cb8f: * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) * __pyx_result = reify.__new__(__pyx_type) */ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_PickleError); __Pyx_GIVEREF(__pyx_n_s_PickleError); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_t_2); __pyx_v___pyx_PickleError = __pyx_t_2; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":6 * if __pyx_checksum != 0x770cb8f: * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) # <<<<<<<<<<<<<< * __pyx_result = reify.__new__(__pyx_type) * if __pyx_state is not None: */ __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0x77, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_INCREF(__pyx_v___pyx_PickleError); __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 6, __pyx_L1_error) /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum != 0x770cb8f: # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) */ } /* "(tree fragment)":7 * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) * __pyx_result = reify.__new__(__pyx_type) # <<<<<<<<<<<<<< * if __pyx_state is not None: * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_8_helpers_reify), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v___pyx_result = __pyx_t_3; __pyx_t_3 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) * __pyx_result = reify.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) * return __pyx_result */ __pyx_t_1 = (__pyx_v___pyx_state != Py_None); __pyx_t_6 = (__pyx_t_1 != 0); if (__pyx_t_6) { /* "(tree fragment)":9 * __pyx_result = reify.__new__(__pyx_type) * if __pyx_state is not None: * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< * return __pyx_result * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) __pyx_t_3 = __pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) * __pyx_result = reify.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) * return __pyx_result */ } /* "(tree fragment)":10 * if __pyx_state is not None: * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) * return __pyx_result # <<<<<<<<<<<<<< * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v___pyx_result); __pyx_r = __pyx_v___pyx_result; goto __pyx_L0; /* "(tree fragment)":1 * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v___pyx_PickleError); __Pyx_XDECREF(__pyx_v___pyx_result); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":11 * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): */ static PyObject *__pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; Py_ssize_t __pyx_t_3; int __pyx_t_4; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_reify__set_state", 0); /* "(tree fragment)":12 * return __pyx_result * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] # <<<<<<<<<<<<<< * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[2]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->name); __Pyx_DECREF(__pyx_v___pyx_result->name); __pyx_v___pyx_result->name = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->wrapped); __Pyx_DECREF(__pyx_v___pyx_result->wrapped); __pyx_v___pyx_result->wrapped = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[2]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(1, 13, __pyx_L1_error) } __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_4 = ((__pyx_t_3 > 2) != 0); if (__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_5 = (__pyx_t_4 != 0); __pyx_t_2 = __pyx_t_5; __pyx_L4_bool_binop_done:; if (__pyx_t_2) { /* "(tree fragment)":14 * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[2]) # <<<<<<<<<<<<<< */ __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 14, __pyx_L1_error) } __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_8 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_8)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_8); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); } } __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[2]) */ } /* "(tree fragment)":11 * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_tp_new_7aiohttp_8_helpers_reify(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_7aiohttp_8_helpers_reify *p; PyObject *o; if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { o = (*t->tp_alloc)(t, 0); } else { o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; p = ((struct __pyx_obj_7aiohttp_8_helpers_reify *)o); p->wrapped = Py_None; Py_INCREF(Py_None); p->name = Py_None; Py_INCREF(Py_None); return o; } static void __pyx_tp_dealloc_7aiohttp_8_helpers_reify(PyObject *o) { struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; #if CYTHON_USE_TP_FINALIZE if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { if (PyObject_CallFinalizerFromDealloc(o)) return; } #endif PyObject_GC_UnTrack(o); Py_CLEAR(p->wrapped); Py_CLEAR(p->name); (*Py_TYPE(o)->tp_free)(o); } static int __pyx_tp_traverse_7aiohttp_8_helpers_reify(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; if (p->wrapped) { e = (*v)(p->wrapped, a); if (e) return e; } if (p->name) { e = (*v)(p->name, a); if (e) return e; } return 0; } static int __pyx_tp_clear_7aiohttp_8_helpers_reify(PyObject *o) { PyObject* tmp; struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; tmp = ((PyObject*)p->wrapped); p->wrapped = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->name); p->name = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); return 0; } static PyObject *__pyx_tp_descr_get_7aiohttp_8_helpers_reify(PyObject *o, PyObject *i, PyObject *c) { PyObject *r = 0; if (!i) i = Py_None; if (!c) c = Py_None; r = __pyx_pw_7aiohttp_8_helpers_5reify_3__get__(o, i, c); return r; } static int __pyx_tp_descr_set_7aiohttp_8_helpers_reify(PyObject *o, PyObject *i, PyObject *v) { if (v) { return __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(o, i, v); } else { PyErr_SetString(PyExc_NotImplementedError, "__delete__"); return -1; } } static PyObject *__pyx_getprop_7aiohttp_8_helpers_5reify___doc__(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(o); } static PyMethodDef __pyx_methods_7aiohttp_8_helpers_reify[] = { {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__, METH_NOARGS, 0}, {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__, METH_O, 0}, {0, 0, 0, 0} }; static struct PyGetSetDef __pyx_getsets_7aiohttp_8_helpers_reify[] = { {(char *)"__doc__", __pyx_getprop_7aiohttp_8_helpers_5reify___doc__, 0, (char *)0, 0}, {0, 0, 0, 0, 0} }; static PyTypeObject __pyx_type_7aiohttp_8_helpers_reify = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._helpers.reify", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_8_helpers_reify), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_8_helpers_reify, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ "Use as a class method decorator. It operates almost exactly like\n the Python `@property` decorator, but it puts the result of the\n method it decorates into the instance dict after the first call,\n effectively replacing the function it decorates with an instance\n variable. It is, in Python parlance, a data descriptor.\n\n ", /*tp_doc*/ __pyx_tp_traverse_7aiohttp_8_helpers_reify, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_8_helpers_reify, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_8_helpers_reify, /*tp_methods*/ 0, /*tp_members*/ __pyx_getsets_7aiohttp_8_helpers_reify, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ __pyx_tp_descr_get_7aiohttp_8_helpers_reify, /*tp_descr_get*/ __pyx_tp_descr_set_7aiohttp_8_helpers_reify, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_7aiohttp_8_helpers_5reify_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_8_helpers_reify, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec__helpers(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec__helpers}, {0, NULL} }; #endif static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, "_helpers", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1}, {&__pyx_kp_s_Incompatible_checksums_s_vs_0x77, __pyx_k_Incompatible_checksums_s_vs_0x77, sizeof(__pyx_k_Incompatible_checksums_s_vs_0x77), 0, 0, 1, 0}, {&__pyx_n_s_KeyError, __pyx_k_KeyError, sizeof(__pyx_k_KeyError), 0, 0, 1, 1}, {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, {&__pyx_n_s_aiohttp__helpers, __pyx_k_aiohttp__helpers, sizeof(__pyx_k_aiohttp__helpers), 0, 0, 1, 1}, {&__pyx_n_s_cache, __pyx_k_cache, sizeof(__pyx_k_cache), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, {&__pyx_n_s_doc, __pyx_k_doc, sizeof(__pyx_k_doc), 0, 0, 1, 1}, {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, {&__pyx_n_s_pyx_unpickle_reify, __pyx_k_pyx_unpickle_reify, sizeof(__pyx_k_pyx_unpickle_reify), 0, 0, 1, 1}, {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, {&__pyx_kp_u_reified_property_is_read_only, __pyx_k_reified_property_is_read_only, sizeof(__pyx_k_reified_property_is_read_only), 0, 1, 0, 0}, {&__pyx_n_s_reify, __pyx_k_reify, sizeof(__pyx_k_reify), 0, 0, 1, 1}, {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, {&__pyx_n_s_wrapped, __pyx_k_wrapped, sizeof(__pyx_k_wrapped), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_KeyError = __Pyx_GetBuiltinName(__pyx_n_s_KeyError); if (!__pyx_builtin_KeyError) __PYX_ERR(0, 25, __pyx_L1_error) __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(0, 29, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "aiohttp/_helpers.pyx":35 * * def __set__(self, inst, value): * raise AttributeError("reified property is read-only") # <<<<<<<<<<<<<< */ __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_reified_property_is_read_only); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); /* "(tree fragment)":1 * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ __pyx_tuple__2 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); __pyx_codeobj__3 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__2, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_reify, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__3)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); __pyx_int_124832655 = PyInt_FromLong(124832655L); if (unlikely(!__pyx_int_124832655)) __PYX_ERR(0, 1, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ if (PyType_Ready(&__pyx_type_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_7aiohttp_8_helpers_reify.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_8_helpers_reify.tp_dictoffset && __pyx_type_7aiohttp_8_helpers_reify.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_7aiohttp_8_helpers_reify.tp_getattro = __Pyx_PyObject_GenericGetAttr; } if (PyObject_SetAttr(__pyx_m, __pyx_n_s_reify, (PyObject *)&__pyx_type_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_ptype_7aiohttp_8_helpers_reify = &__pyx_type_7aiohttp_8_helpers_reify; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC init_helpers(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC init_helpers(void) #else __Pyx_PyMODINIT_FUNC PyInit__helpers(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit__helpers(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { result = PyDict_SetItemString(moddict, to_name, value); } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec__helpers(PyObject *__pyx_pyinit_module) #endif #endif { PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module '_helpers' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__helpers(void)", 0); if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS PyEval_InitThreads(); #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_helpers", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_b); __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_cython_runtime); if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_aiohttp___helpers) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "aiohttp._helpers")) { if (unlikely(PyDict_SetItemString(modules, "aiohttp._helpers", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) (void)__Pyx_modinit_type_import_code(); (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "(tree fragment)":1 * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_8_helpers_1__pyx_unpickle_reify, NULL, __pyx_n_s_aiohttp__helpers); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_reify, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_helpers.pyx":1 * cdef class reify: # <<<<<<<<<<<<<< * """Use as a class method decorator. It operates almost exactly like * the Python `@property` decorator, but it puts the result of the */ __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init aiohttp._helpers", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_CLEAR(__pyx_m); } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init aiohttp._helpers"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* RaiseDoubleKeywords */ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } /* RaiseArgTupleInvalid */ static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } /* GetItemInt */ static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyList_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyTuple_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS if (is_list || PyList_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; if (likely(m && m->sq_item)) { if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { Py_ssize_t l = m->sq_length(o); if (likely(l >= 0)) { i += l; } else { if (!PyErr_ExceptionMatches(PyExc_OverflowError)) return NULL; PyErr_Clear(); } } return m->sq_item(o, i); } } #else if (is_list || PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } /* ObjectGetItem */ #if CYTHON_USE_TYPE_SLOTS static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) { PyObject *runerr; Py_ssize_t key_value; PySequenceMethods *m = Py_TYPE(obj)->tp_as_sequence; if (unlikely(!(m && m->sq_item))) { PyErr_Format(PyExc_TypeError, "'%.200s' object is not subscriptable", Py_TYPE(obj)->tp_name); return NULL; } key_value = __Pyx_PyIndex_AsSsize_t(index); if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); } if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { PyErr_Clear(); PyErr_Format(PyExc_IndexError, "cannot fit '%.200s' into an index-sized integer", Py_TYPE(index)->tp_name); } return NULL; } static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) { PyMappingMethods *m = Py_TYPE(obj)->tp_as_mapping; if (likely(m && m->mp_subscript)) { return m->mp_subscript(obj, key); } return __Pyx_PyObject_GetIndex(obj, key); } #endif /* GetTopmostException */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate) { _PyErr_StackItem *exc_info = tstate->exc_info; while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && exc_info->previous_item != NULL) { exc_info = exc_info->previous_item; } return exc_info; } #endif /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); *type = exc_info->exc_type; *value = exc_info->exc_value; *tb = exc_info->exc_traceback; #else *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; #endif Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = type; exc_info->exc_value = value; exc_info->exc_traceback = tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } #endif /* PyErrExceptionMatches */ #if CYTHON_FAST_THREAD_STATE static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; icurexc_type; if (exc_type == err) return 1; if (unlikely(!exc_type)) return 0; if (unlikely(PyTuple_Check(err))) return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); } #endif /* GetException */ #if CYTHON_FAST_THREAD_STATE static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) #endif { PyObject *local_type, *local_value, *local_tb; #if CYTHON_FAST_THREAD_STATE PyObject *tmp_type, *tmp_value, *tmp_tb; local_type = tstate->curexc_type; local_value = tstate->curexc_value; local_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(&local_type, &local_value, &local_tb); #endif PyErr_NormalizeException(&local_type, &local_value, &local_tb); #if CYTHON_FAST_THREAD_STATE if (unlikely(tstate->curexc_type)) #else if (unlikely(PyErr_Occurred())) #endif goto bad; #if PY_MAJOR_VERSION >= 3 if (local_tb) { if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) goto bad; } #endif Py_XINCREF(local_tb); Py_XINCREF(local_type); Py_XINCREF(local_value); *type = local_type; *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE #if CYTHON_USE_EXC_INFO_STACK { _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = local_type; exc_info->exc_value = local_value; exc_info->exc_traceback = local_tb; } #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(local_type, local_value, local_tb); #endif return 0; bad: *type = 0; *value = 0; *tb = 0; Py_XDECREF(local_type); Py_XDECREF(local_value); Py_XDECREF(local_tb); return -1; } /* PyCFunctionFastCall */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { PyCFunctionObject *func = (PyCFunctionObject*)func_obj; PyCFunction meth = PyCFunction_GET_FUNCTION(func); PyObject *self = PyCFunction_GET_SELF(func); int flags = PyCFunction_GET_FLAGS(func); assert(PyCFunction_Check(func)); assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); assert(nargs >= 0); assert(nargs == 0 || args != NULL); /* _PyCFunction_FastCallDict() must not be called with an exception set, because it may clear it (directly or indirectly) and so the caller loses its exception */ assert(!PyErr_Occurred()); if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); } else { return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); } } #endif /* PyFunctionFastCall */ #if CYTHON_FAST_PYCALL static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, PyObject *globals) { PyFrameObject *f; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject **fastlocals; Py_ssize_t i; PyObject *result; assert(globals != NULL); /* XXX Perhaps we should create a specialized PyFrame_New() that doesn't take locals, but does take builtins without sanity checking them. */ assert(tstate != NULL); f = PyFrame_New(tstate, co, globals, NULL); if (f == NULL) { return NULL; } fastlocals = __Pyx_PyFrame_GetLocalsplus(f); for (i = 0; i < na; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } result = PyEval_EvalFrameEx(f,0); ++tstate->recursion_depth; Py_DECREF(f); --tstate->recursion_depth; return result; } #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *closure; #if PY_MAJOR_VERSION >= 3 PyObject *kwdefs; #endif PyObject *kwtuple, **k; PyObject **d; Py_ssize_t nd; Py_ssize_t nk; PyObject *result; assert(kwargs == NULL || PyDict_Check(kwargs)); nk = kwargs ? PyDict_Size(kwargs) : 0; if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { return NULL; } if ( #if PY_MAJOR_VERSION >= 3 co->co_kwonlyargcount == 0 && #endif likely(kwargs == NULL || nk == 0) && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); goto done; } else if (nargs == 0 && argdefs != NULL && co->co_argcount == Py_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = &PyTuple_GET_ITEM(argdefs, 0); result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); goto done; } } if (kwargs != NULL) { Py_ssize_t pos, i; kwtuple = PyTuple_New(2 * nk); if (kwtuple == NULL) { result = NULL; goto done; } k = &PyTuple_GET_ITEM(kwtuple, 0); pos = i = 0; while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { Py_INCREF(k[i]); Py_INCREF(k[i+1]); i += 2; } nk = i / 2; } else { kwtuple = NULL; k = NULL; } closure = PyFunction_GET_CLOSURE(func); #if PY_MAJOR_VERSION >= 3 kwdefs = PyFunction_GET_KW_DEFAULTS(func); #endif if (argdefs != NULL) { d = &PyTuple_GET_ITEM(argdefs, 0); nd = Py_SIZE(argdefs); } else { d = NULL; nd = 0; } #if PY_MAJOR_VERSION >= 3 result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, kwdefs, closure); #else result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, closure); #endif Py_XDECREF(kwtuple); done: Py_LeaveRecursiveCall(); return result; } #endif #endif /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = Py_TYPE(func)->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCall2Args */ static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { PyObject *args, *result = NULL; #if CYTHON_FAST_PYCALL if (PyFunction_Check(function)) { PyObject *args[2] = {arg1, arg2}; return __Pyx_PyFunction_FastCall(function, args, 2); } #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(function)) { PyObject *args[2] = {arg1, arg2}; return __Pyx_PyCFunction_FastCall(function, args, 2); } #endif args = PyTuple_New(2); if (unlikely(!args)) goto done; Py_INCREF(arg1); PyTuple_SET_ITEM(args, 0, arg1); Py_INCREF(arg2); PyTuple_SET_ITEM(args, 1, arg2); Py_INCREF(function); result = __Pyx_PyObject_Call(function, args, NULL); Py_DECREF(args); Py_DECREF(function); done: return result; } /* PyObjectCallMethO */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { PyObject *self, *result; PyCFunction cfunc; cfunc = PyCFunction_GET_FUNCTION(func); self = PyCFunction_GET_SELF(func); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = cfunc(self, arg); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallOneArg */ #if CYTHON_COMPILING_IN_CPYTHON static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_New(1); if (unlikely(!args)) return NULL; Py_INCREF(arg); PyTuple_SET_ITEM(args, 0, arg); result = __Pyx_PyObject_Call(func, args, NULL); Py_DECREF(args); return result; } static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCall(func, &arg, 1); } #endif if (likely(PyCFunction_Check(func))) { if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { return __Pyx_PyObject_CallMethO(func, arg); #if CYTHON_FAST_PYCCALL } else if (__Pyx_PyFastCFunction_Check(func)) { return __Pyx_PyCFunction_FastCall(func, &arg, 1); #endif } } return __Pyx__PyObject_CallOneArg(func, arg); } #else static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_Pack(1, arg); if (unlikely(!args)) return NULL; result = __Pyx_PyObject_Call(func, args, NULL); Py_DECREF(args); return result; } #endif /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #endif /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, CYTHON_UNUSED PyObject *cause) { __Pyx_PyThreadState_declare Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if CYTHON_COMPILING_IN_PYPY PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #else PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* GetAttr */ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { #if CYTHON_USE_TYPE_SLOTS #if PY_MAJOR_VERSION >= 3 if (likely(PyUnicode_Check(n))) #else if (likely(PyString_Check(n))) #endif return __Pyx_PyObject_GetAttrStr(o, n); #endif return PyObject_GetAttr(o, n); } /* GetAttr3 */ static PyObject *__Pyx_GetAttr3Default(PyObject *d) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) return NULL; __Pyx_PyErr_Clear(); Py_INCREF(d); return d; } static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { PyObject *r = __Pyx_GetAttr(o, n); return (likely(r)) ? r : __Pyx_GetAttr3Default(d); } /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* GetModuleGlobalName */ #if CYTHON_USE_DICT_VERSIONS static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) #else static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) #endif { PyObject *result; #if !CYTHON_AVOID_BORROWED_REFS #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } else if (unlikely(PyErr_Occurred())) { return NULL; } #else result = PyDict_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } #endif #else result = PyObject_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } PyErr_Clear(); #endif return __Pyx_GetBuiltinName(name); } /* Import */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; #if PY_MAJOR_VERSION < 3 PyObject *py_import; py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); if (!py_import) goto bad; #endif if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, 1); if (!module) { if (!PyErr_ExceptionMatches(PyExc_ImportError)) goto bad; PyErr_Clear(); } } level = 0; } #endif if (!module) { #if PY_MAJOR_VERSION < 3 PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, level); #endif } } bad: #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_import); #endif Py_XDECREF(empty_list); Py_XDECREF(empty_dict); return module; } /* ImportFrom */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Format(PyExc_ImportError, #if PY_MAJOR_VERSION < 3 "cannot import name %.230s", PyString_AS_STRING(name)); #else "cannot import name %S", name); #endif } return value; } /* HasAttr */ static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { PyObject *r; if (unlikely(!__Pyx_PyBaseString_Check(n))) { PyErr_SetString(PyExc_TypeError, "hasattr(): attribute name must be string"); return -1; } r = __Pyx_GetAttr(o, n); if (unlikely(!r)) { PyErr_Clear(); return 0; } else { Py_DECREF(r); return 1; } } /* PyObject_GenericGetAttrNoDict */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'%.50s' object has no attribute '%U'", tp->tp_name, attr_name); #else "'%.50s' object has no attribute '%.400s'", tp->tp_name, PyString_AS_STRING(attr_name)); #endif return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { PyObject *descr; PyTypeObject *tp = Py_TYPE(obj); if (unlikely(!PyString_Check(attr_name))) { return PyObject_GenericGetAttr(obj, attr_name); } assert(!tp->tp_dictoffset); descr = _PyType_Lookup(tp, attr_name); if (unlikely(!descr)) { return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); } Py_INCREF(descr); #if PY_MAJOR_VERSION < 3 if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) #endif { descrgetfunc f = Py_TYPE(descr)->tp_descr_get; if (unlikely(f)) { PyObject *res = f(descr, obj, (PyObject *)tp); Py_DECREF(descr); return res; } } return descr; } #endif /* PyObject_GenericGetAttr */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { return PyObject_GenericGetAttr(obj, attr_name); } return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); } #endif /* PyObjectGetAttrStrNoError */ static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) __Pyx_PyErr_Clear(); } static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { PyObject *result; #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); } #endif result = __Pyx_PyObject_GetAttrStr(obj, attr_name); if (unlikely(!result)) { __Pyx_PyObject_GetAttrStr_ClearAttributeError(); } return result; } /* SetupReduce */ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { int ret; PyObject *name_attr; name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name); if (likely(name_attr)) { ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); } else { ret = -1; } if (unlikely(ret < 0)) { PyErr_Clear(); ret = 0; } Py_XDECREF(name_attr); return ret; } static int __Pyx_setup_reduce(PyObject* type_obj) { int ret = 0; PyObject *object_reduce = NULL; PyObject *object_reduce_ex = NULL; PyObject *reduce = NULL; PyObject *reduce_ex = NULL; PyObject *reduce_cython = NULL; PyObject *setstate = NULL; PyObject *setstate_cython = NULL; #if CYTHON_USE_PYTYPE_LOOKUP if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; #else if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; #endif #if CYTHON_USE_PYTYPE_LOOKUP object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #else object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #endif reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; if (reduce_ex == object_reduce_ex) { #if CYTHON_USE_PYTYPE_LOOKUP object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #else object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #endif reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); if (likely(reduce_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (reduce == object_reduce || PyErr_Occurred()) { goto __PYX_BAD; } setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); if (!setstate) PyErr_Clear(); if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); if (likely(setstate_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (!setstate || PyErr_Occurred()) { goto __PYX_BAD; } } PyType_Modified((PyTypeObject*)type_obj); } } goto __PYX_GOOD; __PYX_BAD: if (!PyErr_Occurred()) PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); ret = -1; __PYX_GOOD: #if !CYTHON_USE_PYTYPE_LOOKUP Py_XDECREF(object_reduce); Py_XDECREF(object_reduce_ex); #endif Py_XDECREF(reduce); Py_XDECREF(reduce_ex); Py_XDECREF(reduce_cython); Py_XDECREF(setstate); Py_XDECREF(setstate_cython); return ret; } /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) case -2: if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) case -2: if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = a->tp_base; if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; if (!res) { res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } return res; } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; ip) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", type_name, type_name, Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)b)->ob_digit; const Py_ssize_t size = Py_SIZE(b); if (likely(__Pyx_sst_abs(size) <= 1)) { ival = likely(size) ? digits[0] : 0; if (size == -1) ival = -ival; return ival; } else { switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/_helpers.pyi0000644000175100001710000000031200000000000016523 0ustar00runnerdockerfrom typing import Any class reify: def __init__(self, wrapped: Any) -> None: ... def __get__(self, inst: Any, owner: Any) -> Any: ... def __set__(self, inst: Any, value: Any) -> None: ... ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/_helpers.pyx0000644000175100001710000000203100000000000016542 0ustar00runnerdockercdef class reify: """Use as a class method decorator. It operates almost exactly like the Python `@property` decorator, but it puts the result of the method it decorates into the instance dict after the first call, effectively replacing the function it decorates with an instance variable. It is, in Python parlance, a data descriptor. """ cdef object wrapped cdef object name def __init__(self, wrapped): self.wrapped = wrapped self.name = wrapped.__name__ @property def __doc__(self): return self.wrapped.__doc__ def __get__(self, inst, owner): try: try: return inst._cache[self.name] except KeyError: val = self.wrapped(inst) inst._cache[self.name] = val return val except AttributeError: if inst is None: return self raise def __set__(self, inst, value): raise AttributeError("reified property is read-only") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920316.0 aiohttp-3.8.1/aiohttp/_http_parser.c0000644000175100001710000356641300000000000017063 0ustar00runnerdocker/* Generated by Cython 0.29.24 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* PY_SSIZE_T_CLEAN */ #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else #define CYTHON_ABI "0_29_24" #define CYTHON_HEX_VERSION 0x001D18F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #if PY_VERSION_HEX >= 0x02070000 #define HAVE_LONG_LONG #endif #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #elif !defined(CYTHON_USE_PYLONG_INTERNALS) #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) #endif #ifndef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) #endif #ifndef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } # else # define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; #endif #endif #else #include #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) && __cplusplus >= 201103L #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #elif __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__ ) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #define __Pyx_DefaultClassType PyType_Type #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_FAST_PYCCALL #define __Pyx_PyFastCFunction_Check(func)\ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) #else #define __Pyx_PyFastCFunction_Check(func) 0 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 #define PyMem_RawMalloc(n) PyMem_Malloc(n) #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) #define PyMem_RawFree(p) PyMem_Free(p) #endif #if CYTHON_COMPILING_IN_PYSTON #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) #else #define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #if defined(PyUnicode_IS_READY) #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #else #define __Pyx_PyUnicode_READY(op) (0) #endif #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #endif #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #if PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #else #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__aiohttp___http_parser #define __PYX_HAVE_API__aiohttp___http_parser /* Early includes */ #include #include #include "pythread.h" #include #include #include "../vendor/llhttp/build/llhttp.h" #include "_find_header.h" #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "aiohttp/_http_parser.pyx", "stringsource", "type.pxd", "bool.pxd", "complex.pxd", "aiohttp/_headers.pxi", }; /*--- Type declarations ---*/ struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage; struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage; struct __pyx_obj_7aiohttp_12_http_parser_HttpParser; struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser; struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr; struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init; /* "aiohttp/_http_parser.pyx":328 * * cdef _init( * self, cparser.llhttp_type mode, # <<<<<<<<<<<<<< * object protocol, object loop, int limit, * object timer=None, */ struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init { int __pyx_n; PyObject *timer; size_t max_line_size; size_t max_headers; size_t max_field_size; PyObject *payload_exception; int response_with_body; int read_until_eof; int auto_decompress; }; /* "aiohttp/_http_parser.pyx":110 * * @cython.freelist(DEFAULT_FREELIST_SIZE) * cdef class RawRequestMessage: # <<<<<<<<<<<<<< * cdef readonly str method * cdef readonly str path */ struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage { PyObject_HEAD PyObject *method; PyObject *path; PyObject *version; PyObject *headers; PyObject *raw_headers; PyObject *should_close; PyObject *compression; PyObject *upgrade; PyObject *chunked; PyObject *url; }; /* "aiohttp/_http_parser.pyx":210 * * @cython.freelist(DEFAULT_FREELIST_SIZE) * cdef class RawResponseMessage: # <<<<<<<<<<<<<< * cdef readonly object version # HttpVersion * cdef readonly int code */ struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage { PyObject_HEAD PyObject *version; int code; PyObject *reason; PyObject *headers; PyObject *raw_headers; PyObject *should_close; PyObject *compression; PyObject *upgrade; PyObject *chunked; }; /* "aiohttp/_http_parser.pyx":272 * * @cython.internal * cdef class HttpParser: # <<<<<<<<<<<<<< * * cdef: */ struct __pyx_obj_7aiohttp_12_http_parser_HttpParser { PyObject_HEAD struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *__pyx_vtab; llhttp_t *_cparser; llhttp_settings_t *_csettings; PyObject *_raw_name; PyObject *_raw_value; int _has_value; PyObject *_protocol; PyObject *_loop; PyObject *_timer; size_t _max_line_size; size_t _max_field_size; size_t _max_headers; int _response_with_body; int _read_until_eof; int _started; PyObject *_url; PyObject *_buf; PyObject *_path; PyObject *_reason; PyObject *_headers; PyObject *_raw_headers; int _upgraded; PyObject *_messages; PyObject *_payload; int _payload_error; PyObject *_payload_exception; PyObject *_last_error; int _auto_decompress; int _limit; PyObject *_content_encoding; Py_buffer py_buf; }; /* "aiohttp/_http_parser.pyx":568 * * * cdef class HttpRequestParser(HttpParser): # <<<<<<<<<<<<<< * * def __init__( */ struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser __pyx_base; }; /* "aiohttp/_http_parser.pyx":621 * * * cdef class HttpResponseParser(HttpParser): # <<<<<<<<<<<<<< * * def __init__( */ struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser __pyx_base; }; /* "aiohttp/_http_parser.pyx":135 * self.url = url * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("method", self.method)) */ struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ { PyObject_HEAD PyObject *__pyx_v_info; }; /* "aiohttp/_http_parser.pyx":147 * info.append(("chunked", self.chunked)) * info.append(("url", self.url)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr { PyObject_HEAD struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *__pyx_outer_scope; PyObject *__pyx_v_name; PyObject *__pyx_v_val; }; /* "aiohttp/_http_parser.pyx":233 * self.chunked = chunked * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("version", self.version)) */ struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ { PyObject_HEAD PyObject *__pyx_v_info; }; /* "aiohttp/_http_parser.pyx":244 * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr { PyObject_HEAD struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *__pyx_outer_scope; PyObject *__pyx_v_name; PyObject *__pyx_v_val; }; /* "aiohttp/_http_parser.pyx":272 * * @cython.internal * cdef class HttpParser: # <<<<<<<<<<<<<< * * cdef: */ struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser { PyObject *(*_init)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, enum llhttp_type, PyObject *, PyObject *, int, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args); PyObject *(*_process_header)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*_on_header_field)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t); PyObject *(*_on_header_value)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t); PyObject *(*_on_headers_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*_on_message_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*_on_chunk_header)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*_on_chunk_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*_on_status_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); PyObject *(*http_version)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); }; static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); /* "aiohttp/_http_parser.pyx":568 * * * cdef class HttpRequestParser(HttpParser): # <<<<<<<<<<<<<< * * def __init__( */ struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser { struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_base; }; static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser; /* "aiohttp/_http_parser.pyx":621 * * * cdef class HttpResponseParser(HttpParser): # <<<<<<<<<<<<<< * * def __init__( */ struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser { struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_base; }; static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser; /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* GetItemInt.proto */ #define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ __Pyx_GetItemInt_Generic(o, to_py_func(i)))) #define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); #define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck); /* decode_c_string_utf16.proto */ static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors) { int byteorder = 0; return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); } static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char *s, Py_ssize_t size, const char *errors) { int byteorder = -1; return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); } static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char *s, Py_ssize_t size, const char *errors) { int byteorder = 1; return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); } /* decode_c_bytes.proto */ static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); /* decode_bytes.proto */ static CYTHON_INLINE PyObject* __Pyx_decode_bytes( PyObject* string, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { return __Pyx_decode_c_bytes( PyBytes_AS_STRING(string), PyBytes_GET_SIZE(string), start, stop, encoding, errors, decode_func); } /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ const char* function_name); /* None.proto */ static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname); /* RaiseTooManyValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); /* RaiseNeedMoreValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); /* IterFinish.proto */ static CYTHON_INLINE int __Pyx_IterFinish(void); /* UnpackItemEndCheck.proto */ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /* ListCompAppend.proto */ #if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { PyListObject* L = (PyListObject*) list; Py_ssize_t len = Py_SIZE(list); if (likely(L->allocated > len)) { Py_INCREF(x); PyList_SET_ITEM(list, len, x); __Pyx_SET_SIZE(list, len + 1); return 0; } return PyList_Append(list, x); } #else #define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) #endif /* ListAppend.proto */ #if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { PyListObject* L = (PyListObject*) list; Py_ssize_t len = Py_SIZE(list); if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { Py_INCREF(x); PyList_SET_ITEM(list, len, x); __Pyx_SET_SIZE(list, len + 1); return 0; } return PyList_Append(list, x); } #else #define __Pyx_PyList_Append(L,x) PyList_Append(L,x) #endif /* KeywordStringCheck.proto */ static int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); /* ExtTypeTest.proto */ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /* PyDictContains.proto */ static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) { int result = PyDict_Contains(dict, item); return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); } /* DictGetItem.proto */ #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); #define __Pyx_PyObject_Dict_GetItem(obj, name)\ (likely(PyDict_CheckExact(obj)) ?\ __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) #else #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) #define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) #endif /* PyErrExceptionMatches.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); #else #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) #endif /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* GetAttr.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); /* GetAttr3.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* GetModuleGlobalName.proto */ #if CYTHON_USE_DICT_VERSIONS #define __Pyx_GetModuleGlobalName(var, name) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } #define __Pyx_GetModuleGlobalNameUncached(var, name) {\ PY_UINT64_T __pyx_dict_version;\ PyObject *__pyx_dict_cached_value;\ (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); #else #define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) #define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); #endif /* PyFunctionFastCall.proto */ #if CYTHON_FAST_PYCALL #define __Pyx_PyFunction_FastCall(func, args, nargs)\ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); #else #define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) #endif #define __Pyx_BUILD_ASSERT_EXPR(cond)\ (sizeof(char [1 - 2*!(cond)]) - 1) #ifndef Py_MEMBER_SIZE #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) #endif static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" #define __Pxy_PyFrame_Initialize_Offsets()\ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) #define __Pyx_PyFrame_GetLocalsplus(frame)\ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* PyObjectCallMethO.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif /* PyObjectCallNoArg.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); #else #define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) #endif /* PyCFunctionFastCall.proto */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); #else #define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) #endif /* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); /* PyObjectCall2Args.proto */ static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); /* PySequenceContains.proto */ static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { int result = PySequence_Contains(seq, item); return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); } /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* IncludeStringH.proto */ #include /* BytesEquals.proto */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /* UnicodeEquals.proto */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /* SliceObject.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, PyObject** py_start, PyObject** py_stop, PyObject** py_slice, int has_cstart, int has_cstop, int wraparound); /* decode_bytearray.proto */ static CYTHON_INLINE PyObject* __Pyx_decode_bytearray( PyObject* string, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { return __Pyx_decode_c_bytes( PyByteArray_AS_STRING(string), PyByteArray_GET_SIZE(string), start, stop, encoding, errors, decode_func); } /* PyUnicode_Substring.proto */ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( PyObject* text, Py_ssize_t start, Py_ssize_t stop); /* GetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); #endif /* SwapException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); #endif /* GetTopmostException.proto */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); #endif /* SaveResetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); #else #define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) #define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) #endif /* Import.proto */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /* ImportFrom.proto */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); /* HasAttr.proto */ static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); /* PyObject_GenericGetAttrNoDict.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr #endif /* PyObject_GenericGetAttr.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr #endif /* PyObjectGetAttrStrNoError.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); /* SetupReduce.proto */ static int __Pyx_setup_reduce(PyObject* type_obj); /* SetVTable.proto */ static int __Pyx_SetVtable(PyObject *dict, void *vtable); /* TypeImport.proto */ #ifndef __PYX_HAVE_RT_ImportType_proto #define __PYX_HAVE_RT_ImportType_proto enum __Pyx_ImportType_CheckSize { __Pyx_ImportType_CheckSize_Error = 0, __Pyx_ImportType_CheckSize_Warn = 1, __Pyx_ImportType_CheckSize_Ignore = 2 }; static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); #endif /* decode_c_string.proto */ static CYTHON_INLINE PyObject* __Pyx_decode_c_string( const char* cstring, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* GCCDiagnostics.proto */ #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE enum llhttp_method __Pyx_PyInt_As_enum__llhttp_method(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint8_t(uint8_t value); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* FetchCommonType.proto */ static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); /* PyObjectGetMethod.proto */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); /* PyObjectCallMethod1.proto */ static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg); /* CoroutineBase.proto */ typedef PyObject *(*__pyx_coroutine_body_t)(PyObject *, PyThreadState *, PyObject *); #if CYTHON_USE_EXC_INFO_STACK #define __Pyx_ExcInfoStruct _PyErr_StackItem #else typedef struct { PyObject *exc_type; PyObject *exc_value; PyObject *exc_traceback; } __Pyx_ExcInfoStruct; #endif typedef struct { PyObject_HEAD __pyx_coroutine_body_t body; PyObject *closure; __Pyx_ExcInfoStruct gi_exc_state; PyObject *gi_weakreflist; PyObject *classobj; PyObject *yieldfrom; PyObject *gi_name; PyObject *gi_qualname; PyObject *gi_modulename; PyObject *gi_code; PyObject *gi_frame; int resume_label; char is_running; } __pyx_CoroutineObject; static __pyx_CoroutineObject *__Pyx__Coroutine_New( PyTypeObject *type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, PyObject *name, PyObject *qualname, PyObject *module_name); static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, PyObject *name, PyObject *qualname, PyObject *module_name); static CYTHON_INLINE void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *self); static int __Pyx_Coroutine_clear(PyObject *self); static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value); static PyObject *__Pyx_Coroutine_Close(PyObject *self); static PyObject *__Pyx_Coroutine_Throw(PyObject *gen, PyObject *args); #if CYTHON_USE_EXC_INFO_STACK #define __Pyx_Coroutine_SwapException(self) #define __Pyx_Coroutine_ResetAndClearException(self) __Pyx_Coroutine_ExceptionClear(&(self)->gi_exc_state) #else #define __Pyx_Coroutine_SwapException(self) {\ __Pyx_ExceptionSwap(&(self)->gi_exc_state.exc_type, &(self)->gi_exc_state.exc_value, &(self)->gi_exc_state.exc_traceback);\ __Pyx_Coroutine_ResetFrameBackpointer(&(self)->gi_exc_state);\ } #define __Pyx_Coroutine_ResetAndClearException(self) {\ __Pyx_ExceptionReset((self)->gi_exc_state.exc_type, (self)->gi_exc_state.exc_value, (self)->gi_exc_state.exc_traceback);\ (self)->gi_exc_state.exc_type = (self)->gi_exc_state.exc_value = (self)->gi_exc_state.exc_traceback = NULL;\ } #endif #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyGen_FetchStopIterationValue(pvalue)\ __Pyx_PyGen__FetchStopIterationValue(__pyx_tstate, pvalue) #else #define __Pyx_PyGen_FetchStopIterationValue(pvalue)\ __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, pvalue) #endif static int __Pyx_PyGen__FetchStopIterationValue(PyThreadState *tstate, PyObject **pvalue); static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state); /* PatchModuleWithCoroutine.proto */ static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code); /* PatchGeneratorABC.proto */ static int __Pyx_patch_abc(void); /* Generator.proto */ #define __Pyx_Generator_USED static PyTypeObject *__pyx_GeneratorType = 0; #define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType) #define __Pyx_Generator_New(body, code, closure, name, qualname, module_name)\ __Pyx__Coroutine_New(__pyx_GeneratorType, body, code, closure, name, qualname, module_name) static PyObject *__Pyx_Generator_Next(PyObject *self); static int __pyx_Generator_init(void); /* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__init(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, enum llhttp_type __pyx_v_mode, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self); /* proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self); /* proto*/ /* Module declarations from 'cpython.version' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.type' */ static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; /* Module declarations from 'libc.string' */ /* Module declarations from 'libc.stdio' */ /* Module declarations from 'cpython.object' */ /* Module declarations from 'cpython.ref' */ /* Module declarations from 'cpython.exc' */ /* Module declarations from 'cpython.module' */ /* Module declarations from 'cpython.mem' */ /* Module declarations from 'cpython.tuple' */ /* Module declarations from 'cpython.list' */ /* Module declarations from 'cpython.sequence' */ /* Module declarations from 'cpython.mapping' */ /* Module declarations from 'cpython.iterator' */ /* Module declarations from 'cpython.number' */ /* Module declarations from 'cpython.int' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.bool' */ static PyTypeObject *__pyx_ptype_7cpython_4bool_bool = 0; /* Module declarations from 'cpython.long' */ /* Module declarations from 'cpython.float' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.complex' */ static PyTypeObject *__pyx_ptype_7cpython_7complex_complex = 0; /* Module declarations from 'cpython.string' */ /* Module declarations from 'cpython.unicode' */ /* Module declarations from 'cpython.dict' */ /* Module declarations from 'cpython.instance' */ /* Module declarations from 'cpython.function' */ /* Module declarations from 'cpython.method' */ /* Module declarations from 'cpython.weakref' */ /* Module declarations from 'cpython.getargs' */ /* Module declarations from 'cpython.pythread' */ /* Module declarations from 'cpython.pystate' */ /* Module declarations from 'cpython.cobject' */ /* Module declarations from 'cpython.oldbuffer' */ /* Module declarations from 'cpython.set' */ /* Module declarations from 'cpython.buffer' */ /* Module declarations from 'cpython.bytes' */ /* Module declarations from 'cpython.pycapsule' */ /* Module declarations from 'cpython' */ /* Module declarations from 'libc.limits' */ /* Module declarations from 'cython' */ /* Module declarations from 'aiohttp' */ /* Module declarations from 'libc.stdint' */ /* Module declarations from 'aiohttp._cparser' */ /* Module declarations from 'aiohttp._find_header' */ /* Module declarations from 'aiohttp._http_parser' */ static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage = 0; static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage = 0; static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_HttpParser = 0; static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser = 0; static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser = 0; static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = 0; static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = 0; static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = 0; static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_headers = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_URL = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_URL_build = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_CIMultiDict = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion10 = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion11 = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1 = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_StreamReader = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser_DeflateBuffer = 0; static PyObject *__pyx_v_7aiohttp_12_http_parser__http_method = 0; static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_extend(PyObject *, char const *, size_t); /*proto*/ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_http_method_str(int); /*proto*/ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_find_header(PyObject *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser__new_request_message(PyObject *, PyObject *, PyObject *, PyObject *, PyObject *, int, PyObject *, int, int, PyObject *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser__new_response_message(PyObject *, int, PyObject *, PyObject *, PyObject *, int, PyObject *, int, int); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin(llhttp_t *); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_url(llhttp_t *, char const *, size_t); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_status(llhttp_t *, char const *, size_t); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_field(llhttp_t *, char const *, size_t); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_value(llhttp_t *, char const *, size_t); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete(llhttp_t *); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_body(llhttp_t *, char const *, size_t); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete(llhttp_t *); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header(llhttp_t *); /*proto*/ static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete(llhttp_t *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(llhttp_t *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *, PyObject *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *, PyObject *); /*proto*/ #define __Pyx_MODULE_NAME "aiohttp._http_parser" extern int __pyx_module_is_main_aiohttp___http_parser; int __pyx_module_is_main_aiohttp___http_parser = 0; /* Implementation of 'aiohttp._http_parser' */ static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_MemoryError; static PyObject *__pyx_builtin_TypeError; static PyObject *__pyx_builtin_BaseException; static const char __pyx_k_[] = "="; static const char __pyx_k_i[] = "i"; static const char __pyx_k_TE[] = "TE"; static const char __pyx_k__2[] = ", "; static const char __pyx_k__3[] = ")>"; static const char __pyx_k__4[] = ""; static const char __pyx_k__7[] = "?"; static const char __pyx_k__8[] = "#"; static const char __pyx_k_br[] = "br"; static const char __pyx_k_AGE[] = "AGE"; static const char __pyx_k_URI[] = "URI"; static const char __pyx_k_URL[] = "URL"; static const char __pyx_k_VIA[] = "VIA"; static const char __pyx_k_add[] = "add"; static const char __pyx_k_all[] = "__all__"; static const char __pyx_k_new[] = "__new__"; static const char __pyx_k_url[] = "url"; static const char __pyx_k_DATE[] = "DATE"; static const char __pyx_k_ETAG[] = "ETAG"; static const char __pyx_k_FROM[] = "FROM"; static const char __pyx_k_HOST[] = "HOST"; static const char __pyx_k_LINK[] = "LINK"; static const char __pyx_k_VARY[] = "VARY"; static const char __pyx_k_args[] = "args"; static const char __pyx_k_code[] = "code"; static const char __pyx_k_dict[] = "__dict__"; static const char __pyx_k_gzip[] = "gzip"; static const char __pyx_k_hdrs[] = "hdrs"; static const char __pyx_k_loop[] = "loop"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_path[] = "path"; static const char __pyx_k_send[] = "send"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_yarl[] = "yarl"; static const char __pyx_k_ALLOW[] = "ALLOW"; static const char __pyx_k_RANGE[] = "RANGE"; static const char __pyx_k_URL_2[] = "_URL"; static const char __pyx_k_build[] = "build"; static const char __pyx_k_close[] = "close"; static const char __pyx_k_limit[] = "limit"; static const char __pyx_k_lower[] = "lower"; static const char __pyx_k_range[] = "range"; static const char __pyx_k_throw[] = "throw"; static const char __pyx_k_timer[] = "timer"; static const char __pyx_k_ACCEPT[] = "ACCEPT"; static const char __pyx_k_COOKIE[] = "COOKIE"; static const char __pyx_k_DIGEST[] = "DIGEST"; static const char __pyx_k_EXPECT[] = "EXPECT"; static const char __pyx_k_ORIGIN[] = "ORIGIN"; static const char __pyx_k_PRAGMA[] = "PRAGMA"; static const char __pyx_k_SERVER[] = "SERVER"; static const char __pyx_k_import[] = "__import__"; static const char __pyx_k_method[] = "method"; static const char __pyx_k_pickle[] = "pickle"; static const char __pyx_k_reason[] = "reason"; static const char __pyx_k_reduce[] = "__reduce__"; static const char __pyx_k_update[] = "update"; static const char __pyx_k_EXPIRES[] = "EXPIRES"; static const char __pyx_k_REFERER[] = "REFERER"; static const char __pyx_k_TRAILER[] = "TRAILER"; static const char __pyx_k_UPGRADE[] = "UPGRADE"; static const char __pyx_k_WARNING[] = "WARNING"; static const char __pyx_k_aiohttp[] = "aiohttp"; static const char __pyx_k_chunked[] = "chunked"; static const char __pyx_k_deflate[] = "deflate"; static const char __pyx_k_encoded[] = "encoded"; static const char __pyx_k_genexpr[] = "genexpr"; static const char __pyx_k_headers[] = "headers"; static const char __pyx_k_streams[] = "streams"; static const char __pyx_k_unknown[] = ""; static const char __pyx_k_upgrade[] = "upgrade"; static const char __pyx_k_version[] = "version"; static const char __pyx_k_IF_MATCH[] = "IF_MATCH"; static const char __pyx_k_IF_RANGE[] = "IF_RANGE"; static const char __pyx_k_LOCATION[] = "LOCATION"; static const char __pyx_k_feed_eof[] = "feed_eof"; static const char __pyx_k_fragment[] = "fragment"; static const char __pyx_k_getstate[] = "__getstate__"; static const char __pyx_k_protocol[] = "protocol"; static const char __pyx_k_pyx_type[] = "__pyx_type"; static const char __pyx_k_setstate[] = "__setstate__"; static const char __pyx_k_FORWARDED[] = "FORWARDED"; static const char __pyx_k_TypeError[] = "TypeError"; static const char __pyx_k_feed_data[] = "feed_data"; static const char __pyx_k_multidict[] = "multidict"; static const char __pyx_k_pyx_state[] = "__pyx_state"; static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; static const char __pyx_k_CONNECTION[] = "CONNECTION"; static const char __pyx_k_KEEP_ALIVE[] = "KEEP_ALIVE"; static const char __pyx_k_SET_COOKIE[] = "SET_COOKIE"; static const char __pyx_k_USER_AGENT[] = "USER_AGENT"; static const char __pyx_k_pyx_result[] = "__pyx_result"; static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; static const char __pyx_k_CIMultiDict[] = "CIMultiDict"; static const char __pyx_k_CONTENT_MD5[] = "CONTENT_MD5"; static const char __pyx_k_DESTINATION[] = "DESTINATION"; static const char __pyx_k_HttpVersion[] = "HttpVersion"; static const char __pyx_k_LineTooLong[] = "LineTooLong"; static const char __pyx_k_MemoryError[] = "MemoryError"; static const char __pyx_k_PickleError[] = "PickleError"; static const char __pyx_k_RETRY_AFTER[] = "RETRY_AFTER"; static const char __pyx_k_WANT_DIGEST[] = "WANT_DIGEST"; static const char __pyx_k_compression[] = "compression"; static const char __pyx_k_http_parser[] = "http_parser"; static const char __pyx_k_http_writer[] = "http_writer"; static const char __pyx_k_max_headers[] = "max_headers"; static const char __pyx_k_raw_headers[] = "raw_headers"; static const char __pyx_k_CONTENT_TYPE[] = "CONTENT_TYPE"; static const char __pyx_k_MAX_FORWARDS[] = "MAX_FORWARDS"; static const char __pyx_k_StreamReader[] = "StreamReader"; static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; static const char __pyx_k_query_string[] = "query_string"; static const char __pyx_k_should_close[] = "should_close"; static const char __pyx_k_stringsource[] = "stringsource"; static const char __pyx_k_ACCEPT_RANGES[] = "ACCEPT_RANGES"; static const char __pyx_k_AUTHORIZATION[] = "AUTHORIZATION"; static const char __pyx_k_BadStatusLine[] = "BadStatusLine"; static const char __pyx_k_BaseException[] = "BaseException"; static const char __pyx_k_CACHE_CONTROL[] = "CACHE_CONTROL"; static const char __pyx_k_CIMultiDict_2[] = "_CIMultiDict"; static const char __pyx_k_CONTENT_RANGE[] = "CONTENT_RANGE"; static const char __pyx_k_DeflateBuffer[] = "DeflateBuffer"; static const char __pyx_k_EMPTY_PAYLOAD[] = "EMPTY_PAYLOAD"; static const char __pyx_k_HttpVersion10[] = "HttpVersion10"; static const char __pyx_k_HttpVersion11[] = "HttpVersion11"; static const char __pyx_k_HttpVersion_2[] = "_HttpVersion"; static const char __pyx_k_IF_NONE_MATCH[] = "IF_NONE_MATCH"; static const char __pyx_k_InvalidHeader[] = "InvalidHeader"; static const char __pyx_k_LAST_EVENT_ID[] = "LAST_EVENT_ID"; static const char __pyx_k_LAST_MODIFIED[] = "LAST_MODIFIED"; static const char __pyx_k_max_line_size[] = "max_line_size"; static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; static const char __pyx_k_set_exception[] = "set_exception"; static const char __pyx_k_ACCEPT_CHARSET[] = "ACCEPT_CHARSET"; static const char __pyx_k_BadHttpMessage[] = "BadHttpMessage"; static const char __pyx_k_CONTENT_LENGTH[] = "CONTENT_LENGTH"; static const char __pyx_k_StreamReader_2[] = "_StreamReader"; static const char __pyx_k_max_field_size[] = "max_field_size"; static const char __pyx_k_read_until_eof[] = "read_until_eof"; static const char __pyx_k_ACCEPT_ENCODING[] = "ACCEPT_ENCODING"; static const char __pyx_k_ACCEPT_LANGUAGE[] = "ACCEPT_LANGUAGE"; static const char __pyx_k_DeflateBuffer_2[] = "_DeflateBuffer"; static const char __pyx_k_EMPTY_PAYLOAD_2[] = "_EMPTY_PAYLOAD"; static const char __pyx_k_HttpVersion10_2[] = "_HttpVersion10"; static const char __pyx_k_HttpVersion11_2[] = "_HttpVersion11"; static const char __pyx_k_InvalidURLError[] = "InvalidURLError"; static const char __pyx_k_X_FORWARDED_FOR[] = "X_FORWARDED_FOR"; static const char __pyx_k_auto_decompress[] = "auto_decompress"; static const char __pyx_k_http_exceptions[] = "http_exceptions"; static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; static const char __pyx_k_CIMultiDictProxy[] = "CIMultiDictProxy"; static const char __pyx_k_CONTENT_ENCODING[] = "CONTENT_ENCODING"; static const char __pyx_k_CONTENT_LANGUAGE[] = "CONTENT_LANGUAGE"; static const char __pyx_k_CONTENT_LOCATION[] = "CONTENT_LOCATION"; static const char __pyx_k_WWW_AUTHENTICATE[] = "WWW_AUTHENTICATE"; static const char __pyx_k_X_FORWARDED_HOST[] = "X_FORWARDED_HOST"; static const char __pyx_k_HttpRequestParser[] = "HttpRequestParser"; static const char __pyx_k_IF_MODIFIED_SINCE[] = "IF_MODIFIED_SINCE"; static const char __pyx_k_RawRequestMessage[] = "_http_method[i] */ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_http_method_str(int __pyx_v_i) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("http_method_str", 0); /* "aiohttp/_http_parser.pyx":93 * * cdef inline str http_method_str(int i): * if i < METHODS_COUNT: # <<<<<<<<<<<<<< * return _http_method[i] * else: */ __pyx_t_1 = ((__pyx_v_i < 46) != 0); if (__pyx_t_1) { /* "aiohttp/_http_parser.pyx":94 * cdef inline str http_method_str(int i): * if i < METHODS_COUNT: * return _http_method[i] # <<<<<<<<<<<<<< * else: * return "" */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_7aiohttp_12_http_parser__http_method == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 94, __pyx_L1_error) } __pyx_t_2 = __Pyx_GetItemInt_List(__pyx_v_7aiohttp_12_http_parser__http_method, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 1, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 94, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject*)__pyx_t_2)); __pyx_r = ((PyObject*)__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":93 * * cdef inline str http_method_str(int i): * if i < METHODS_COUNT: # <<<<<<<<<<<<<< * return _http_method[i] * else: */ } /* "aiohttp/_http_parser.pyx":96 * return _http_method[i] * else: * return "" # <<<<<<<<<<<<<< * * cdef inline object find_header(bytes raw_header): */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_kp_u_unknown); __pyx_r = __pyx_kp_u_unknown; goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":92 * * * cdef inline str http_method_str(int i): # <<<<<<<<<<<<<< * if i < METHODS_COUNT: * return _http_method[i] */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("aiohttp._http_parser.http_method_str", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":98 * return "" * * cdef inline object find_header(bytes raw_header): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_find_header(PyObject *__pyx_v_raw_header) { Py_ssize_t __pyx_v_size; char *__pyx_v_buf; int __pyx_v_idx; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("find_header", 0); /* "aiohttp/_http_parser.pyx":102 * cdef char *buf * cdef int idx * PyBytes_AsStringAndSize(raw_header, &buf, &size) # <<<<<<<<<<<<<< * idx = _find_header.find_header(buf, size) * if idx == -1: */ __pyx_t_1 = PyBytes_AsStringAndSize(__pyx_v_raw_header, (&__pyx_v_buf), (&__pyx_v_size)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 102, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":103 * cdef int idx * PyBytes_AsStringAndSize(raw_header, &buf, &size) * idx = _find_header.find_header(buf, size) # <<<<<<<<<<<<<< * if idx == -1: * return raw_header.decode('utf-8', 'surrogateescape') */ __pyx_v_idx = find_header(__pyx_v_buf, __pyx_v_size); /* "aiohttp/_http_parser.pyx":104 * PyBytes_AsStringAndSize(raw_header, &buf, &size) * idx = _find_header.find_header(buf, size) * if idx == -1: # <<<<<<<<<<<<<< * return raw_header.decode('utf-8', 'surrogateescape') * return headers[idx] */ __pyx_t_2 = ((__pyx_v_idx == -1L) != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":105 * idx = _find_header.find_header(buf, size) * if idx == -1: * return raw_header.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< * return headers[idx] * */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_raw_header == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); __PYX_ERR(0, 105, __pyx_L1_error) } __pyx_t_3 = __Pyx_decode_bytes(__pyx_v_raw_header, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 105, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":104 * PyBytes_AsStringAndSize(raw_header, &buf, &size) * idx = _find_header.find_header(buf, size) * if idx == -1: # <<<<<<<<<<<<<< * return raw_header.decode('utf-8', 'surrogateescape') * return headers[idx] */ } /* "aiohttp/_http_parser.pyx":106 * if idx == -1: * return raw_header.decode('utf-8', 'surrogateescape') * return headers[idx] # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_7aiohttp_12_http_parser_headers == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 106, __pyx_L1_error) } __pyx_t_3 = __Pyx_GetItemInt_Tuple(__pyx_v_7aiohttp_12_http_parser_headers, __pyx_v_idx, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 106, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":98 * return "" * * cdef inline object find_header(bytes raw_header): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.find_header", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":122 * cdef readonly object url # yarl.URL * * def __init__(self, method, path, version, headers, raw_headers, # <<<<<<<<<<<<<< * should_close, compression, upgrade, chunked, url): * self.method = method */ /* Python wrapper */ static int __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_method = 0; PyObject *__pyx_v_path = 0; PyObject *__pyx_v_version = 0; PyObject *__pyx_v_headers = 0; PyObject *__pyx_v_raw_headers = 0; PyObject *__pyx_v_should_close = 0; PyObject *__pyx_v_compression = 0; PyObject *__pyx_v_upgrade = 0; PyObject *__pyx_v_chunked = 0; PyObject *__pyx_v_url = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method,&__pyx_n_s_path,&__pyx_n_s_version,&__pyx_n_s_headers,&__pyx_n_s_raw_headers,&__pyx_n_s_should_close,&__pyx_n_s_compression,&__pyx_n_s_upgrade,&__pyx_n_s_chunked,&__pyx_n_s_url,0}; PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_method)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_path)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 1); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_version)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 2); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_headers)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 3); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_raw_headers)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 4); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_should_close)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 5); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 6: if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_compression)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 6); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 7: if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_upgrade)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 7); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 8: if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_chunked)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 8); __PYX_ERR(0, 122, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 9: if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_url)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 9); __PYX_ERR(0, 122, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 122, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 10) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); values[5] = PyTuple_GET_ITEM(__pyx_args, 5); values[6] = PyTuple_GET_ITEM(__pyx_args, 6); values[7] = PyTuple_GET_ITEM(__pyx_args, 7); values[8] = PyTuple_GET_ITEM(__pyx_args, 8); values[9] = PyTuple_GET_ITEM(__pyx_args, 9); } __pyx_v_method = values[0]; __pyx_v_path = values[1]; __pyx_v_version = values[2]; __pyx_v_headers = values[3]; __pyx_v_raw_headers = values[4]; __pyx_v_should_close = values[5]; __pyx_v_compression = values[6]; __pyx_v_upgrade = values[7]; __pyx_v_chunked = values[8]; __pyx_v_url = values[9]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 122, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage___init__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), __pyx_v_method, __pyx_v_path, __pyx_v_version, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_compression, __pyx_v_upgrade, __pyx_v_chunked, __pyx_v_url); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage___init__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v_method, PyObject *__pyx_v_path, PyObject *__pyx_v_version, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, PyObject *__pyx_v_should_close, PyObject *__pyx_v_compression, PyObject *__pyx_v_upgrade, PyObject *__pyx_v_chunked, PyObject *__pyx_v_url) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 0); /* "aiohttp/_http_parser.pyx":124 * def __init__(self, method, path, version, headers, raw_headers, * should_close, compression, upgrade, chunked, url): * self.method = method # <<<<<<<<<<<<<< * self.path = path * self.version = version */ if (!(likely(PyUnicode_CheckExact(__pyx_v_method))||((__pyx_v_method) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_method)->tp_name), 0))) __PYX_ERR(0, 124, __pyx_L1_error) __pyx_t_1 = __pyx_v_method; __Pyx_INCREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->method); __Pyx_DECREF(__pyx_v_self->method); __pyx_v_self->method = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":125 * should_close, compression, upgrade, chunked, url): * self.method = method * self.path = path # <<<<<<<<<<<<<< * self.version = version * self.headers = headers */ if (!(likely(PyUnicode_CheckExact(__pyx_v_path))||((__pyx_v_path) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_path)->tp_name), 0))) __PYX_ERR(0, 125, __pyx_L1_error) __pyx_t_1 = __pyx_v_path; __Pyx_INCREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->path); __Pyx_DECREF(__pyx_v_self->path); __pyx_v_self->path = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":126 * self.method = method * self.path = path * self.version = version # <<<<<<<<<<<<<< * self.headers = headers * self.raw_headers = raw_headers */ __Pyx_INCREF(__pyx_v_version); __Pyx_GIVEREF(__pyx_v_version); __Pyx_GOTREF(__pyx_v_self->version); __Pyx_DECREF(__pyx_v_self->version); __pyx_v_self->version = __pyx_v_version; /* "aiohttp/_http_parser.pyx":127 * self.path = path * self.version = version * self.headers = headers # <<<<<<<<<<<<<< * self.raw_headers = raw_headers * self.should_close = should_close */ __Pyx_INCREF(__pyx_v_headers); __Pyx_GIVEREF(__pyx_v_headers); __Pyx_GOTREF(__pyx_v_self->headers); __Pyx_DECREF(__pyx_v_self->headers); __pyx_v_self->headers = __pyx_v_headers; /* "aiohttp/_http_parser.pyx":128 * self.version = version * self.headers = headers * self.raw_headers = raw_headers # <<<<<<<<<<<<<< * self.should_close = should_close * self.compression = compression */ __Pyx_INCREF(__pyx_v_raw_headers); __Pyx_GIVEREF(__pyx_v_raw_headers); __Pyx_GOTREF(__pyx_v_self->raw_headers); __Pyx_DECREF(__pyx_v_self->raw_headers); __pyx_v_self->raw_headers = __pyx_v_raw_headers; /* "aiohttp/_http_parser.pyx":129 * self.headers = headers * self.raw_headers = raw_headers * self.should_close = should_close # <<<<<<<<<<<<<< * self.compression = compression * self.upgrade = upgrade */ __Pyx_INCREF(__pyx_v_should_close); __Pyx_GIVEREF(__pyx_v_should_close); __Pyx_GOTREF(__pyx_v_self->should_close); __Pyx_DECREF(__pyx_v_self->should_close); __pyx_v_self->should_close = __pyx_v_should_close; /* "aiohttp/_http_parser.pyx":130 * self.raw_headers = raw_headers * self.should_close = should_close * self.compression = compression # <<<<<<<<<<<<<< * self.upgrade = upgrade * self.chunked = chunked */ __Pyx_INCREF(__pyx_v_compression); __Pyx_GIVEREF(__pyx_v_compression); __Pyx_GOTREF(__pyx_v_self->compression); __Pyx_DECREF(__pyx_v_self->compression); __pyx_v_self->compression = __pyx_v_compression; /* "aiohttp/_http_parser.pyx":131 * self.should_close = should_close * self.compression = compression * self.upgrade = upgrade # <<<<<<<<<<<<<< * self.chunked = chunked * self.url = url */ __Pyx_INCREF(__pyx_v_upgrade); __Pyx_GIVEREF(__pyx_v_upgrade); __Pyx_GOTREF(__pyx_v_self->upgrade); __Pyx_DECREF(__pyx_v_self->upgrade); __pyx_v_self->upgrade = __pyx_v_upgrade; /* "aiohttp/_http_parser.pyx":132 * self.compression = compression * self.upgrade = upgrade * self.chunked = chunked # <<<<<<<<<<<<<< * self.url = url * */ __Pyx_INCREF(__pyx_v_chunked); __Pyx_GIVEREF(__pyx_v_chunked); __Pyx_GOTREF(__pyx_v_self->chunked); __Pyx_DECREF(__pyx_v_self->chunked); __pyx_v_self->chunked = __pyx_v_chunked; /* "aiohttp/_http_parser.pyx":133 * self.upgrade = upgrade * self.chunked = chunked * self.url = url # <<<<<<<<<<<<<< * * def __repr__(self): */ __Pyx_INCREF(__pyx_v_url); __Pyx_GIVEREF(__pyx_v_url); __Pyx_GOTREF(__pyx_v_self->url); __Pyx_DECREF(__pyx_v_self->url); __pyx_v_self->url = __pyx_v_url; /* "aiohttp/_http_parser.pyx":122 * cdef readonly object url # yarl.URL * * def __init__(self, method, path, version, headers, raw_headers, # <<<<<<<<<<<<<< * should_close, compression, upgrade, chunked, url): * self.method = method */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":135 * self.url = url * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("method", self.method)) */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_2__repr__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */ /* "aiohttp/_http_parser.pyx":147 * info.append(("chunked", self.chunked)) * info.append(("url", self.url)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___genexpr(PyObject *__pyx_self) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_cur_scope; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("genexpr", 0); __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, __pyx_empty_tuple, NULL); if (unlikely(!__pyx_cur_scope)) { __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)Py_None); __Pyx_INCREF(Py_None); __PYX_ERR(0, 147, __pyx_L1_error) } else { __Pyx_GOTREF(__pyx_cur_scope); } __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *) __pyx_self; __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope)); __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope); { __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_repr___locals_genexpr, __pyx_n_s_aiohttp__http_parser); if (unlikely(!gen)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_DECREF(__pyx_cur_scope); __Pyx_RefNannyFinishContext(); return (PyObject *) gen; } /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__repr__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */ { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)__pyx_generator->closure); PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *(*__pyx_t_7)(PyObject *); int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("genexpr", 0); switch (__pyx_generator->resume_label) { case 0: goto __pyx_L3_first_run; default: /* CPython raises the right error here */ __Pyx_RefNannyFinishContext(); return NULL; } __pyx_L3_first_run:; if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 147, __pyx_L1_error) __pyx_r = PyList_New(0); if (unlikely(!__pyx_r)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_r); if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info)) { __Pyx_RaiseClosureNameError("info"); __PYX_ERR(0, 147, __pyx_L1_error) } if (unlikely(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 147, __pyx_L1_error) } __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_info; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; for (;;) { if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 147, __pyx_L1_error) #else __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); #endif if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) { PyObject* sequence = __pyx_t_3; Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); __PYX_ERR(0, 147, __pyx_L1_error) } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); } else { __pyx_t_4 = PyList_GET_ITEM(sequence, 0); __pyx_t_5 = PyList_GET_ITEM(sequence, 1); } __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(__pyx_t_5); #else __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); #endif __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } else { Py_ssize_t index = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext; index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L6_unpacking_failed; __Pyx_GOTREF(__pyx_t_4); index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed; __Pyx_GOTREF(__pyx_t_5); if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 147, __pyx_L1_error) __pyx_t_7 = NULL; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; goto __pyx_L7_unpacking_done; __pyx_L6_unpacking_failed:; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_7 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); __PYX_ERR(0, 147, __pyx_L1_error) __pyx_L7_unpacking_done:; } __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_name); __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_name, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_val); __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_val, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_3 = PyNumber_Add(__pyx_cur_scope->__pyx_v_name, __pyx_kp_u_); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_Repr(__pyx_cur_scope->__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = PyNumber_Add(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(__Pyx_ListComp_Append(__pyx_r, (PyObject*)__pyx_t_4))) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_r); __pyx_r = 0; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); #if !CYTHON_USE_EXC_INFO_STACK __Pyx_Coroutine_ResetAndClearException(__pyx_generator); #endif __pyx_generator->resume_label = -1; __Pyx_Coroutine_clear((PyObject*)__pyx_generator); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":135 * self.url = url * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("method", self.method)) */ static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_2__repr__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *__pyx_cur_scope; PyObject *__pyx_v_sinfo = NULL; PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__repr__", 0); __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct____repr__(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct____repr__, __pyx_empty_tuple, NULL); if (unlikely(!__pyx_cur_scope)) { __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)Py_None); __Pyx_INCREF(Py_None); __PYX_ERR(0, 135, __pyx_L1_error) } else { __Pyx_GOTREF(__pyx_cur_scope); } /* "aiohttp/_http_parser.pyx":136 * * def __repr__(self): * info = [] # <<<<<<<<<<<<<< * info.append(("method", self.method)) * info.append(("path", self.path)) */ __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 136, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_cur_scope->__pyx_v_info = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":137 * def __repr__(self): * info = [] * info.append(("method", self.method)) # <<<<<<<<<<<<<< * info.append(("path", self.path)) * info.append(("version", self.version)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 137, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_method); __Pyx_GIVEREF(__pyx_n_u_method); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_method); __Pyx_INCREF(__pyx_v_self->method); __Pyx_GIVEREF(__pyx_v_self->method); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->method); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 137, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":138 * info = [] * info.append(("method", self.method)) * info.append(("path", self.path)) # <<<<<<<<<<<<<< * info.append(("version", self.version)) * info.append(("headers", self.headers)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_path); __Pyx_GIVEREF(__pyx_n_u_path); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_path); __Pyx_INCREF(__pyx_v_self->path); __Pyx_GIVEREF(__pyx_v_self->path); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->path); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":139 * info.append(("method", self.method)) * info.append(("path", self.path)) * info.append(("version", self.version)) # <<<<<<<<<<<<<< * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_version); __Pyx_GIVEREF(__pyx_n_u_version); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_version); __Pyx_INCREF(__pyx_v_self->version); __Pyx_GIVEREF(__pyx_v_self->version); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->version); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 139, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":140 * info.append(("path", self.path)) * info.append(("version", self.version)) * info.append(("headers", self.headers)) # <<<<<<<<<<<<<< * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_headers); __Pyx_GIVEREF(__pyx_n_u_headers); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_headers); __Pyx_INCREF(__pyx_v_self->headers); __Pyx_GIVEREF(__pyx_v_self->headers); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->headers); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":141 * info.append(("version", self.version)) * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) # <<<<<<<<<<<<<< * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 141, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_raw_headers); __Pyx_GIVEREF(__pyx_n_u_raw_headers); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_raw_headers); __Pyx_INCREF(__pyx_v_self->raw_headers); __Pyx_GIVEREF(__pyx_v_self->raw_headers); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->raw_headers); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 141, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":142 * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) # <<<<<<<<<<<<<< * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 142, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_should_close); __Pyx_GIVEREF(__pyx_n_u_should_close); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_should_close); __Pyx_INCREF(__pyx_v_self->should_close); __Pyx_GIVEREF(__pyx_v_self->should_close); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->should_close); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 142, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":143 * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) # <<<<<<<<<<<<<< * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_compression); __Pyx_GIVEREF(__pyx_n_u_compression); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_compression); __Pyx_INCREF(__pyx_v_self->compression); __Pyx_GIVEREF(__pyx_v_self->compression); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->compression); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":144 * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) # <<<<<<<<<<<<<< * info.append(("chunked", self.chunked)) * info.append(("url", self.url)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 144, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_upgrade); __Pyx_GIVEREF(__pyx_n_u_upgrade); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_upgrade); __Pyx_INCREF(__pyx_v_self->upgrade); __Pyx_GIVEREF(__pyx_v_self->upgrade); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->upgrade); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 144, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":145 * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) # <<<<<<<<<<<<<< * info.append(("url", self.url)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_chunked); __Pyx_GIVEREF(__pyx_n_u_chunked); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_chunked); __Pyx_INCREF(__pyx_v_self->chunked); __Pyx_GIVEREF(__pyx_v_self->chunked); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->chunked); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 145, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":146 * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) * info.append(("url", self.url)) # <<<<<<<<<<<<<< * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) * return '' */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_url); __Pyx_GIVEREF(__pyx_n_u_url); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_url); __Pyx_INCREF(__pyx_v_self->url); __Pyx_GIVEREF(__pyx_v_self->url); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->url); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":147 * info.append(("chunked", self.chunked)) * info.append(("url", self.url)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ __pyx_t_1 = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_Generator_Next(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyUnicode_Join(__pyx_kp_u__2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_sinfo = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":148 * info.append(("url", self.url)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) * return '' # <<<<<<<<<<<<<< * * def _replace(self, **dct): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyUnicode_ConcatSafe(__pyx_kp_u_RawRequestMessage, __pyx_v_sinfo); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyUnicode_Concat(__pyx_t_1, __pyx_kp_u__3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":135 * self.url = url * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("method", self.method)) */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_sinfo); __Pyx_XDECREF(__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator); __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":150 * return '' * * def _replace(self, **dct): # <<<<<<<<<<<<<< * cdef RawRequestMessage ret * ret = _new_request_message(self.method, */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_dct = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_replace (wrapper)", 0); if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) { __Pyx_RaiseArgtupleInvalid("_replace", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return NULL;} if (__pyx_kwds && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_replace", 1))) return NULL; __pyx_v_dct = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_dct)) return NULL; __Pyx_GOTREF(__pyx_v_dct); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4_replace(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), __pyx_v_dct); /* function exit code */ __Pyx_XDECREF(__pyx_v_dct); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4_replace(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v_dct) { struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_ret = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_t_6; PyObject *__pyx_t_7 = NULL; int __pyx_t_8; int __pyx_t_9; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_replace", 0); /* "aiohttp/_http_parser.pyx":152 * def _replace(self, **dct): * cdef RawRequestMessage ret * ret = _new_request_message(self.method, # <<<<<<<<<<<<<< * self.path, * self.version, */ __pyx_t_1 = __pyx_v_self->method; __Pyx_INCREF(__pyx_t_1); /* "aiohttp/_http_parser.pyx":153 * cdef RawRequestMessage ret * ret = _new_request_message(self.method, * self.path, # <<<<<<<<<<<<<< * self.version, * self.headers, */ __pyx_t_2 = __pyx_v_self->path; __Pyx_INCREF(__pyx_t_2); /* "aiohttp/_http_parser.pyx":154 * ret = _new_request_message(self.method, * self.path, * self.version, # <<<<<<<<<<<<<< * self.headers, * self.raw_headers, */ __pyx_t_3 = __pyx_v_self->version; __Pyx_INCREF(__pyx_t_3); /* "aiohttp/_http_parser.pyx":155 * self.path, * self.version, * self.headers, # <<<<<<<<<<<<<< * self.raw_headers, * self.should_close, */ __pyx_t_4 = __pyx_v_self->headers; __Pyx_INCREF(__pyx_t_4); /* "aiohttp/_http_parser.pyx":156 * self.version, * self.headers, * self.raw_headers, # <<<<<<<<<<<<<< * self.should_close, * self.compression, */ __pyx_t_5 = __pyx_v_self->raw_headers; __Pyx_INCREF(__pyx_t_5); /* "aiohttp/_http_parser.pyx":157 * self.headers, * self.raw_headers, * self.should_close, # <<<<<<<<<<<<<< * self.compression, * self.upgrade, */ __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_self->should_close); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 157, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":158 * self.raw_headers, * self.should_close, * self.compression, # <<<<<<<<<<<<<< * self.upgrade, * self.chunked, */ __pyx_t_7 = __pyx_v_self->compression; __Pyx_INCREF(__pyx_t_7); /* "aiohttp/_http_parser.pyx":159 * self.should_close, * self.compression, * self.upgrade, # <<<<<<<<<<<<<< * self.chunked, * self.url) */ __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_v_self->upgrade); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 159, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":160 * self.compression, * self.upgrade, * self.chunked, # <<<<<<<<<<<<<< * self.url) * if "method" in dct: */ __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_v_self->chunked); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":161 * self.upgrade, * self.chunked, * self.url) # <<<<<<<<<<<<<< * if "method" in dct: * ret.method = dct["method"] */ __pyx_t_10 = __pyx_v_self->url; __Pyx_INCREF(__pyx_t_10); /* "aiohttp/_http_parser.pyx":152 * def _replace(self, **dct): * cdef RawRequestMessage ret * ret = _new_request_message(self.method, # <<<<<<<<<<<<<< * self.path, * self.version, */ __pyx_t_11 = __pyx_f_7aiohttp_12_http_parser__new_request_message(((PyObject*)__pyx_t_1), ((PyObject*)__pyx_t_2), __pyx_t_3, __pyx_t_4, __pyx_t_5, __pyx_t_6, __pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 152, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; if (!(likely(((__pyx_t_11) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_11, __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage))))) __PYX_ERR(0, 152, __pyx_L1_error) __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_t_11); __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":162 * self.chunked, * self.url) * if "method" in dct: # <<<<<<<<<<<<<< * ret.method = dct["method"] * if "path" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_method, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 162, __pyx_L1_error) __pyx_t_8 = (__pyx_t_9 != 0); if (__pyx_t_8) { /* "aiohttp/_http_parser.pyx":163 * self.url) * if "method" in dct: * ret.method = dct["method"] # <<<<<<<<<<<<<< * if "path" in dct: * ret.path = dct["path"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_method); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 163, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); if (!(likely(PyUnicode_CheckExact(__pyx_t_11))||((__pyx_t_11) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_11)->tp_name), 0))) __PYX_ERR(0, 163, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->method); __Pyx_DECREF(__pyx_v_ret->method); __pyx_v_ret->method = ((PyObject*)__pyx_t_11); __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":162 * self.chunked, * self.url) * if "method" in dct: # <<<<<<<<<<<<<< * ret.method = dct["method"] * if "path" in dct: */ } /* "aiohttp/_http_parser.pyx":164 * if "method" in dct: * ret.method = dct["method"] * if "path" in dct: # <<<<<<<<<<<<<< * ret.path = dct["path"] * if "version" in dct: */ __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_path, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 164, __pyx_L1_error) __pyx_t_9 = (__pyx_t_8 != 0); if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":165 * ret.method = dct["method"] * if "path" in dct: * ret.path = dct["path"] # <<<<<<<<<<<<<< * if "version" in dct: * ret.version = dct["version"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_path); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 165, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); if (!(likely(PyUnicode_CheckExact(__pyx_t_11))||((__pyx_t_11) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_11)->tp_name), 0))) __PYX_ERR(0, 165, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->path); __Pyx_DECREF(__pyx_v_ret->path); __pyx_v_ret->path = ((PyObject*)__pyx_t_11); __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":164 * if "method" in dct: * ret.method = dct["method"] * if "path" in dct: # <<<<<<<<<<<<<< * ret.path = dct["path"] * if "version" in dct: */ } /* "aiohttp/_http_parser.pyx":166 * if "path" in dct: * ret.path = dct["path"] * if "version" in dct: # <<<<<<<<<<<<<< * ret.version = dct["version"] * if "headers" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_version, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 166, __pyx_L1_error) __pyx_t_8 = (__pyx_t_9 != 0); if (__pyx_t_8) { /* "aiohttp/_http_parser.pyx":167 * ret.path = dct["path"] * if "version" in dct: * ret.version = dct["version"] # <<<<<<<<<<<<<< * if "headers" in dct: * ret.headers = dct["headers"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_version); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 167, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->version); __Pyx_DECREF(__pyx_v_ret->version); __pyx_v_ret->version = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":166 * if "path" in dct: * ret.path = dct["path"] * if "version" in dct: # <<<<<<<<<<<<<< * ret.version = dct["version"] * if "headers" in dct: */ } /* "aiohttp/_http_parser.pyx":168 * if "version" in dct: * ret.version = dct["version"] * if "headers" in dct: # <<<<<<<<<<<<<< * ret.headers = dct["headers"] * if "raw_headers" in dct: */ __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_headers, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 168, __pyx_L1_error) __pyx_t_9 = (__pyx_t_8 != 0); if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":169 * ret.version = dct["version"] * if "headers" in dct: * ret.headers = dct["headers"] # <<<<<<<<<<<<<< * if "raw_headers" in dct: * ret.raw_headers = dct["raw_headers"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_headers); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 169, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->headers); __Pyx_DECREF(__pyx_v_ret->headers); __pyx_v_ret->headers = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":168 * if "version" in dct: * ret.version = dct["version"] * if "headers" in dct: # <<<<<<<<<<<<<< * ret.headers = dct["headers"] * if "raw_headers" in dct: */ } /* "aiohttp/_http_parser.pyx":170 * if "headers" in dct: * ret.headers = dct["headers"] * if "raw_headers" in dct: # <<<<<<<<<<<<<< * ret.raw_headers = dct["raw_headers"] * if "should_close" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_raw_headers, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 170, __pyx_L1_error) __pyx_t_8 = (__pyx_t_9 != 0); if (__pyx_t_8) { /* "aiohttp/_http_parser.pyx":171 * ret.headers = dct["headers"] * if "raw_headers" in dct: * ret.raw_headers = dct["raw_headers"] # <<<<<<<<<<<<<< * if "should_close" in dct: * ret.should_close = dct["should_close"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_raw_headers); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 171, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->raw_headers); __Pyx_DECREF(__pyx_v_ret->raw_headers); __pyx_v_ret->raw_headers = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":170 * if "headers" in dct: * ret.headers = dct["headers"] * if "raw_headers" in dct: # <<<<<<<<<<<<<< * ret.raw_headers = dct["raw_headers"] * if "should_close" in dct: */ } /* "aiohttp/_http_parser.pyx":172 * if "raw_headers" in dct: * ret.raw_headers = dct["raw_headers"] * if "should_close" in dct: # <<<<<<<<<<<<<< * ret.should_close = dct["should_close"] * if "compression" in dct: */ __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_should_close, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 172, __pyx_L1_error) __pyx_t_9 = (__pyx_t_8 != 0); if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":173 * ret.raw_headers = dct["raw_headers"] * if "should_close" in dct: * ret.should_close = dct["should_close"] # <<<<<<<<<<<<<< * if "compression" in dct: * ret.compression = dct["compression"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_should_close); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 173, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->should_close); __Pyx_DECREF(__pyx_v_ret->should_close); __pyx_v_ret->should_close = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":172 * if "raw_headers" in dct: * ret.raw_headers = dct["raw_headers"] * if "should_close" in dct: # <<<<<<<<<<<<<< * ret.should_close = dct["should_close"] * if "compression" in dct: */ } /* "aiohttp/_http_parser.pyx":174 * if "should_close" in dct: * ret.should_close = dct["should_close"] * if "compression" in dct: # <<<<<<<<<<<<<< * ret.compression = dct["compression"] * if "upgrade" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_compression, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 174, __pyx_L1_error) __pyx_t_8 = (__pyx_t_9 != 0); if (__pyx_t_8) { /* "aiohttp/_http_parser.pyx":175 * ret.should_close = dct["should_close"] * if "compression" in dct: * ret.compression = dct["compression"] # <<<<<<<<<<<<<< * if "upgrade" in dct: * ret.upgrade = dct["upgrade"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_compression); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 175, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->compression); __Pyx_DECREF(__pyx_v_ret->compression); __pyx_v_ret->compression = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":174 * if "should_close" in dct: * ret.should_close = dct["should_close"] * if "compression" in dct: # <<<<<<<<<<<<<< * ret.compression = dct["compression"] * if "upgrade" in dct: */ } /* "aiohttp/_http_parser.pyx":176 * if "compression" in dct: * ret.compression = dct["compression"] * if "upgrade" in dct: # <<<<<<<<<<<<<< * ret.upgrade = dct["upgrade"] * if "chunked" in dct: */ __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_upgrade, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 176, __pyx_L1_error) __pyx_t_9 = (__pyx_t_8 != 0); if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":177 * ret.compression = dct["compression"] * if "upgrade" in dct: * ret.upgrade = dct["upgrade"] # <<<<<<<<<<<<<< * if "chunked" in dct: * ret.chunked = dct["chunked"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_upgrade); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 177, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->upgrade); __Pyx_DECREF(__pyx_v_ret->upgrade); __pyx_v_ret->upgrade = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":176 * if "compression" in dct: * ret.compression = dct["compression"] * if "upgrade" in dct: # <<<<<<<<<<<<<< * ret.upgrade = dct["upgrade"] * if "chunked" in dct: */ } /* "aiohttp/_http_parser.pyx":178 * if "upgrade" in dct: * ret.upgrade = dct["upgrade"] * if "chunked" in dct: # <<<<<<<<<<<<<< * ret.chunked = dct["chunked"] * if "url" in dct: */ __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_chunked, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 178, __pyx_L1_error) __pyx_t_8 = (__pyx_t_9 != 0); if (__pyx_t_8) { /* "aiohttp/_http_parser.pyx":179 * ret.upgrade = dct["upgrade"] * if "chunked" in dct: * ret.chunked = dct["chunked"] # <<<<<<<<<<<<<< * if "url" in dct: * ret.url = dct["url"] */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_chunked); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 179, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->chunked); __Pyx_DECREF(__pyx_v_ret->chunked); __pyx_v_ret->chunked = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":178 * if "upgrade" in dct: * ret.upgrade = dct["upgrade"] * if "chunked" in dct: # <<<<<<<<<<<<<< * ret.chunked = dct["chunked"] * if "url" in dct: */ } /* "aiohttp/_http_parser.pyx":180 * if "chunked" in dct: * ret.chunked = dct["chunked"] * if "url" in dct: # <<<<<<<<<<<<<< * ret.url = dct["url"] * return ret */ __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_url, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 180, __pyx_L1_error) __pyx_t_9 = (__pyx_t_8 != 0); if (__pyx_t_9) { /* "aiohttp/_http_parser.pyx":181 * ret.chunked = dct["chunked"] * if "url" in dct: * ret.url = dct["url"] # <<<<<<<<<<<<<< * return ret * */ __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_url); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 181, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_11); __Pyx_GOTREF(__pyx_v_ret->url); __Pyx_DECREF(__pyx_v_ret->url); __pyx_v_ret->url = __pyx_t_11; __pyx_t_11 = 0; /* "aiohttp/_http_parser.pyx":180 * if "chunked" in dct: * ret.chunked = dct["chunked"] * if "url" in dct: # <<<<<<<<<<<<<< * ret.url = dct["url"] * return ret */ } /* "aiohttp/_http_parser.pyx":182 * if "url" in dct: * ret.url = dct["url"] * return ret # <<<<<<<<<<<<<< * * cdef _new_request_message(str method, */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_ret)); __pyx_r = ((PyObject *)__pyx_v_ret); goto __pyx_L0; /* "aiohttp/_http_parser.pyx":150 * return '' * * def _replace(self, **dct): # <<<<<<<<<<<<<< * cdef RawRequestMessage ret * ret = _new_request_message(self.method, */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage._replace", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_ret); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":111 * @cython.freelist(DEFAULT_FREELIST_SIZE) * cdef class RawRequestMessage: * cdef readonly str method # <<<<<<<<<<<<<< * cdef readonly str path * cdef readonly object version # HttpVersion */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6method___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6method___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->method); __pyx_r = __pyx_v_self->method; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":112 * cdef class RawRequestMessage: * cdef readonly str method * cdef readonly str path # <<<<<<<<<<<<<< * cdef readonly object version # HttpVersion * cdef readonly object headers # CIMultiDict */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4path___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4path___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->path); __pyx_r = __pyx_v_self->path; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":113 * cdef readonly str method * cdef readonly str path * cdef readonly object version # HttpVersion # <<<<<<<<<<<<<< * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7version___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7version___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->version); __pyx_r = __pyx_v_self->version; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":114 * cdef readonly str path * cdef readonly object version # HttpVersion * cdef readonly object headers # CIMultiDict # <<<<<<<<<<<<<< * cdef readonly object raw_headers # tuple * cdef readonly object should_close */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->headers); __pyx_r = __pyx_v_self->headers; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":115 * cdef readonly object version # HttpVersion * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple # <<<<<<<<<<<<<< * cdef readonly object should_close * cdef readonly object compression */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->raw_headers); __pyx_r = __pyx_v_self->raw_headers; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":116 * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple * cdef readonly object should_close # <<<<<<<<<<<<<< * cdef readonly object compression * cdef readonly object upgrade */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_12should_close___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_12should_close___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->should_close); __pyx_r = __pyx_v_self->should_close; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":117 * cdef readonly object raw_headers # tuple * cdef readonly object should_close * cdef readonly object compression # <<<<<<<<<<<<<< * cdef readonly object upgrade * cdef readonly object chunked */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11compression___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11compression___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->compression); __pyx_r = __pyx_v_self->compression; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":118 * cdef readonly object should_close * cdef readonly object compression * cdef readonly object upgrade # <<<<<<<<<<<<<< * cdef readonly object chunked * cdef readonly object url # yarl.URL */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->upgrade); __pyx_r = __pyx_v_self->upgrade; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":119 * cdef readonly object compression * cdef readonly object upgrade * cdef readonly object chunked # <<<<<<<<<<<<<< * cdef readonly object url # yarl.URL * */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7chunked___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7chunked___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->chunked); __pyx_r = __pyx_v_self->chunked; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":120 * cdef readonly object upgrade * cdef readonly object chunked * cdef readonly object url # yarl.URL # <<<<<<<<<<<<<< * * def __init__(self, method, path, version, headers, raw_headers, */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_3url___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_3url___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->url); __pyx_r = __pyx_v_self->url; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6__reduce_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { PyObject *__pyx_v_state = 0; PyObject *__pyx_v__dict = 0; int __pyx_v_use_setstate; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":5 * cdef object _dict * cdef bint use_setstate * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) # <<<<<<<<<<<<<< * _dict = getattr(self, '__dict__', None) * if _dict is not None: */ __pyx_t_1 = PyTuple_New(10); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v_self->chunked); __Pyx_GIVEREF(__pyx_v_self->chunked); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->chunked); __Pyx_INCREF(__pyx_v_self->compression); __Pyx_GIVEREF(__pyx_v_self->compression); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->compression); __Pyx_INCREF(__pyx_v_self->headers); __Pyx_GIVEREF(__pyx_v_self->headers); PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_self->headers); __Pyx_INCREF(__pyx_v_self->method); __Pyx_GIVEREF(__pyx_v_self->method); PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_self->method); __Pyx_INCREF(__pyx_v_self->path); __Pyx_GIVEREF(__pyx_v_self->path); PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_v_self->path); __Pyx_INCREF(__pyx_v_self->raw_headers); __Pyx_GIVEREF(__pyx_v_self->raw_headers); PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_v_self->raw_headers); __Pyx_INCREF(__pyx_v_self->should_close); __Pyx_GIVEREF(__pyx_v_self->should_close); PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_v_self->should_close); __Pyx_INCREF(__pyx_v_self->upgrade); __Pyx_GIVEREF(__pyx_v_self->upgrade); PyTuple_SET_ITEM(__pyx_t_1, 7, __pyx_v_self->upgrade); __Pyx_INCREF(__pyx_v_self->url); __Pyx_GIVEREF(__pyx_v_self->url); PyTuple_SET_ITEM(__pyx_t_1, 8, __pyx_v_self->url); __Pyx_INCREF(__pyx_v_self->version); __Pyx_GIVEREF(__pyx_v_self->version); PyTuple_SET_ITEM(__pyx_t_1, 9, __pyx_v_self->version); __pyx_v_state = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":6 * cdef bint use_setstate * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< * if _dict is not None: * state += (_dict,) */ __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v__dict = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":7 * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ __pyx_t_2 = (__pyx_v__dict != Py_None); __pyx_t_3 = (__pyx_t_2 != 0); if (__pyx_t_3) { /* "(tree fragment)":8 * _dict = getattr(self, '__dict__', None) * if _dict is not None: * state += (_dict,) # <<<<<<<<<<<<<< * use_setstate = True * else: */ __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v__dict); __Pyx_GIVEREF(__pyx_v__dict); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); __pyx_t_4 = 0; /* "(tree fragment)":9 * if _dict is not None: * state += (_dict,) * use_setstate = True # <<<<<<<<<<<<<< * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None */ __pyx_v_use_setstate = 1; /* "(tree fragment)":7 * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ goto __pyx_L3; } /* "(tree fragment)":11 * use_setstate = True * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None # <<<<<<<<<<<<<< * if use_setstate: * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state */ /*else*/ { __pyx_t_2 = (__pyx_v_self->chunked != Py_None); __pyx_t_5 = (__pyx_t_2 != 0); if (!__pyx_t_5) { } else { __pyx_t_3 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = (__pyx_v_self->compression != Py_None); __pyx_t_2 = (__pyx_t_5 != 0); if (!__pyx_t_2) { } else { __pyx_t_3 = __pyx_t_2; goto __pyx_L4_bool_binop_done; } __pyx_t_2 = (__pyx_v_self->headers != Py_None); __pyx_t_5 = (__pyx_t_2 != 0); if (!__pyx_t_5) { } else { __pyx_t_3 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = (__pyx_v_self->method != ((PyObject*)Py_None)); __pyx_t_2 = (__pyx_t_5 != 0); if (!__pyx_t_2) { } else { __pyx_t_3 = __pyx_t_2; goto __pyx_L4_bool_binop_done; } __pyx_t_2 = (__pyx_v_self->path != ((PyObject*)Py_None)); __pyx_t_5 = (__pyx_t_2 != 0); if (!__pyx_t_5) { } else { __pyx_t_3 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = (__pyx_v_self->raw_headers != Py_None); __pyx_t_2 = (__pyx_t_5 != 0); if (!__pyx_t_2) { } else { __pyx_t_3 = __pyx_t_2; goto __pyx_L4_bool_binop_done; } __pyx_t_2 = (__pyx_v_self->should_close != Py_None); __pyx_t_5 = (__pyx_t_2 != 0); if (!__pyx_t_5) { } else { __pyx_t_3 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = (__pyx_v_self->upgrade != Py_None); __pyx_t_2 = (__pyx_t_5 != 0); if (!__pyx_t_2) { } else { __pyx_t_3 = __pyx_t_2; goto __pyx_L4_bool_binop_done; } __pyx_t_2 = (__pyx_v_self->url != Py_None); __pyx_t_5 = (__pyx_t_2 != 0); if (!__pyx_t_5) { } else { __pyx_t_3 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = (__pyx_v_self->version != Py_None); __pyx_t_2 = (__pyx_t_5 != 0); __pyx_t_3 = __pyx_t_2; __pyx_L4_bool_binop_done:; __pyx_v_use_setstate = __pyx_t_3; } __pyx_L3:; /* "(tree fragment)":12 * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state * else: */ __pyx_t_3 = (__pyx_v_use_setstate != 0); if (__pyx_t_3) { /* "(tree fragment)":13 * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None * if use_setstate: * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state # <<<<<<<<<<<<<< * else: * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_RawRequestMessage); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_21004882); __Pyx_GIVEREF(__pyx_int_21004882); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_21004882); __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state); __pyx_t_4 = 0; __pyx_t_1 = 0; __pyx_r = __pyx_t_6; __pyx_t_6 = 0; goto __pyx_L0; /* "(tree fragment)":12 * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state * else: */ } /* "(tree fragment)":15 * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state * else: * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pyx_unpickle_RawRequestMessage); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_21004882); __Pyx_GIVEREF(__pyx_int_21004882); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_21004882); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); __pyx_t_6 = 0; __pyx_t_1 = 0; __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_state); __Pyx_XDECREF(__pyx_v__dict); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__setstate_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":17 * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) # <<<<<<<<<<<<<< */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":184 * return ret * * cdef _new_request_message(str method, # <<<<<<<<<<<<<< * str path, * object version, */ static PyObject *__pyx_f_7aiohttp_12_http_parser__new_request_message(PyObject *__pyx_v_method, PyObject *__pyx_v_path, PyObject *__pyx_v_version, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, int __pyx_v_should_close, PyObject *__pyx_v_compression, int __pyx_v_upgrade, int __pyx_v_chunked, PyObject *__pyx_v_url) { struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_ret = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_new_request_message", 0); /* "aiohttp/_http_parser.pyx":195 * object url): * cdef RawRequestMessage ret * ret = RawRequestMessage.__new__(RawRequestMessage) # <<<<<<<<<<<<<< * ret.method = method * ret.path = path */ __pyx_t_1 = ((PyObject *)__pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage(((PyTypeObject *)__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage), __pyx_empty_tuple, NULL)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 195, __pyx_L1_error) __Pyx_GOTREF(((PyObject *)__pyx_t_1)); __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":196 * cdef RawRequestMessage ret * ret = RawRequestMessage.__new__(RawRequestMessage) * ret.method = method # <<<<<<<<<<<<<< * ret.path = path * ret.version = version */ __Pyx_INCREF(__pyx_v_method); __Pyx_GIVEREF(__pyx_v_method); __Pyx_GOTREF(__pyx_v_ret->method); __Pyx_DECREF(__pyx_v_ret->method); __pyx_v_ret->method = __pyx_v_method; /* "aiohttp/_http_parser.pyx":197 * ret = RawRequestMessage.__new__(RawRequestMessage) * ret.method = method * ret.path = path # <<<<<<<<<<<<<< * ret.version = version * ret.headers = headers */ __Pyx_INCREF(__pyx_v_path); __Pyx_GIVEREF(__pyx_v_path); __Pyx_GOTREF(__pyx_v_ret->path); __Pyx_DECREF(__pyx_v_ret->path); __pyx_v_ret->path = __pyx_v_path; /* "aiohttp/_http_parser.pyx":198 * ret.method = method * ret.path = path * ret.version = version # <<<<<<<<<<<<<< * ret.headers = headers * ret.raw_headers = raw_headers */ __Pyx_INCREF(__pyx_v_version); __Pyx_GIVEREF(__pyx_v_version); __Pyx_GOTREF(__pyx_v_ret->version); __Pyx_DECREF(__pyx_v_ret->version); __pyx_v_ret->version = __pyx_v_version; /* "aiohttp/_http_parser.pyx":199 * ret.path = path * ret.version = version * ret.headers = headers # <<<<<<<<<<<<<< * ret.raw_headers = raw_headers * ret.should_close = should_close */ __Pyx_INCREF(__pyx_v_headers); __Pyx_GIVEREF(__pyx_v_headers); __Pyx_GOTREF(__pyx_v_ret->headers); __Pyx_DECREF(__pyx_v_ret->headers); __pyx_v_ret->headers = __pyx_v_headers; /* "aiohttp/_http_parser.pyx":200 * ret.version = version * ret.headers = headers * ret.raw_headers = raw_headers # <<<<<<<<<<<<<< * ret.should_close = should_close * ret.compression = compression */ __Pyx_INCREF(__pyx_v_raw_headers); __Pyx_GIVEREF(__pyx_v_raw_headers); __Pyx_GOTREF(__pyx_v_ret->raw_headers); __Pyx_DECREF(__pyx_v_ret->raw_headers); __pyx_v_ret->raw_headers = __pyx_v_raw_headers; /* "aiohttp/_http_parser.pyx":201 * ret.headers = headers * ret.raw_headers = raw_headers * ret.should_close = should_close # <<<<<<<<<<<<<< * ret.compression = compression * ret.upgrade = upgrade */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_should_close); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 201, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->should_close); __Pyx_DECREF(__pyx_v_ret->should_close); __pyx_v_ret->should_close = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":202 * ret.raw_headers = raw_headers * ret.should_close = should_close * ret.compression = compression # <<<<<<<<<<<<<< * ret.upgrade = upgrade * ret.chunked = chunked */ __Pyx_INCREF(__pyx_v_compression); __Pyx_GIVEREF(__pyx_v_compression); __Pyx_GOTREF(__pyx_v_ret->compression); __Pyx_DECREF(__pyx_v_ret->compression); __pyx_v_ret->compression = __pyx_v_compression; /* "aiohttp/_http_parser.pyx":203 * ret.should_close = should_close * ret.compression = compression * ret.upgrade = upgrade # <<<<<<<<<<<<<< * ret.chunked = chunked * ret.url = url */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_upgrade); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 203, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->upgrade); __Pyx_DECREF(__pyx_v_ret->upgrade); __pyx_v_ret->upgrade = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":204 * ret.compression = compression * ret.upgrade = upgrade * ret.chunked = chunked # <<<<<<<<<<<<<< * ret.url = url * return ret */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_chunked); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 204, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->chunked); __Pyx_DECREF(__pyx_v_ret->chunked); __pyx_v_ret->chunked = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":205 * ret.upgrade = upgrade * ret.chunked = chunked * ret.url = url # <<<<<<<<<<<<<< * return ret * */ __Pyx_INCREF(__pyx_v_url); __Pyx_GIVEREF(__pyx_v_url); __Pyx_GOTREF(__pyx_v_ret->url); __Pyx_DECREF(__pyx_v_ret->url); __pyx_v_ret->url = __pyx_v_url; /* "aiohttp/_http_parser.pyx":206 * ret.chunked = chunked * ret.url = url * return ret # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_ret)); __pyx_r = ((PyObject *)__pyx_v_ret); goto __pyx_L0; /* "aiohttp/_http_parser.pyx":184 * return ret * * cdef _new_request_message(str method, # <<<<<<<<<<<<<< * str path, * object version, */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser._new_request_message", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_ret); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":221 * cdef readonly object chunked * * def __init__(self, version, code, reason, headers, raw_headers, # <<<<<<<<<<<<<< * should_close, compression, upgrade, chunked): * self.version = version */ /* Python wrapper */ static int __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_version = 0; PyObject *__pyx_v_code = 0; PyObject *__pyx_v_reason = 0; PyObject *__pyx_v_headers = 0; PyObject *__pyx_v_raw_headers = 0; PyObject *__pyx_v_should_close = 0; PyObject *__pyx_v_compression = 0; PyObject *__pyx_v_upgrade = 0; PyObject *__pyx_v_chunked = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_version,&__pyx_n_s_code,&__pyx_n_s_reason,&__pyx_n_s_headers,&__pyx_n_s_raw_headers,&__pyx_n_s_should_close,&__pyx_n_s_compression,&__pyx_n_s_upgrade,&__pyx_n_s_chunked,0}; PyObject* values[9] = {0,0,0,0,0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_version)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_code)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 1); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_reason)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 2); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_headers)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 3); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_raw_headers)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 4); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_should_close)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 5); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 6: if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_compression)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 6); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 7: if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_upgrade)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 7); __PYX_ERR(0, 221, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 8: if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_chunked)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 8); __PYX_ERR(0, 221, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 221, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 9) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); values[5] = PyTuple_GET_ITEM(__pyx_args, 5); values[6] = PyTuple_GET_ITEM(__pyx_args, 6); values[7] = PyTuple_GET_ITEM(__pyx_args, 7); values[8] = PyTuple_GET_ITEM(__pyx_args, 8); } __pyx_v_version = values[0]; __pyx_v_code = values[1]; __pyx_v_reason = values[2]; __pyx_v_headers = values[3]; __pyx_v_raw_headers = values[4]; __pyx_v_should_close = values[5]; __pyx_v_compression = values[6]; __pyx_v_upgrade = values[7]; __pyx_v_chunked = values[8]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 221, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage___init__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self), __pyx_v_version, __pyx_v_code, __pyx_v_reason, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_compression, __pyx_v_upgrade, __pyx_v_chunked); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage___init__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self, PyObject *__pyx_v_version, PyObject *__pyx_v_code, PyObject *__pyx_v_reason, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, PyObject *__pyx_v_should_close, PyObject *__pyx_v_compression, PyObject *__pyx_v_upgrade, PyObject *__pyx_v_chunked) { int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 0); /* "aiohttp/_http_parser.pyx":223 * def __init__(self, version, code, reason, headers, raw_headers, * should_close, compression, upgrade, chunked): * self.version = version # <<<<<<<<<<<<<< * self.code = code * self.reason = reason */ __Pyx_INCREF(__pyx_v_version); __Pyx_GIVEREF(__pyx_v_version); __Pyx_GOTREF(__pyx_v_self->version); __Pyx_DECREF(__pyx_v_self->version); __pyx_v_self->version = __pyx_v_version; /* "aiohttp/_http_parser.pyx":224 * should_close, compression, upgrade, chunked): * self.version = version * self.code = code # <<<<<<<<<<<<<< * self.reason = reason * self.headers = headers */ __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_code); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 224, __pyx_L1_error) __pyx_v_self->code = __pyx_t_1; /* "aiohttp/_http_parser.pyx":225 * self.version = version * self.code = code * self.reason = reason # <<<<<<<<<<<<<< * self.headers = headers * self.raw_headers = raw_headers */ if (!(likely(PyUnicode_CheckExact(__pyx_v_reason))||((__pyx_v_reason) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_reason)->tp_name), 0))) __PYX_ERR(0, 225, __pyx_L1_error) __pyx_t_2 = __pyx_v_reason; __Pyx_INCREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_GOTREF(__pyx_v_self->reason); __Pyx_DECREF(__pyx_v_self->reason); __pyx_v_self->reason = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":226 * self.code = code * self.reason = reason * self.headers = headers # <<<<<<<<<<<<<< * self.raw_headers = raw_headers * self.should_close = should_close */ __Pyx_INCREF(__pyx_v_headers); __Pyx_GIVEREF(__pyx_v_headers); __Pyx_GOTREF(__pyx_v_self->headers); __Pyx_DECREF(__pyx_v_self->headers); __pyx_v_self->headers = __pyx_v_headers; /* "aiohttp/_http_parser.pyx":227 * self.reason = reason * self.headers = headers * self.raw_headers = raw_headers # <<<<<<<<<<<<<< * self.should_close = should_close * self.compression = compression */ __Pyx_INCREF(__pyx_v_raw_headers); __Pyx_GIVEREF(__pyx_v_raw_headers); __Pyx_GOTREF(__pyx_v_self->raw_headers); __Pyx_DECREF(__pyx_v_self->raw_headers); __pyx_v_self->raw_headers = __pyx_v_raw_headers; /* "aiohttp/_http_parser.pyx":228 * self.headers = headers * self.raw_headers = raw_headers * self.should_close = should_close # <<<<<<<<<<<<<< * self.compression = compression * self.upgrade = upgrade */ __Pyx_INCREF(__pyx_v_should_close); __Pyx_GIVEREF(__pyx_v_should_close); __Pyx_GOTREF(__pyx_v_self->should_close); __Pyx_DECREF(__pyx_v_self->should_close); __pyx_v_self->should_close = __pyx_v_should_close; /* "aiohttp/_http_parser.pyx":229 * self.raw_headers = raw_headers * self.should_close = should_close * self.compression = compression # <<<<<<<<<<<<<< * self.upgrade = upgrade * self.chunked = chunked */ __Pyx_INCREF(__pyx_v_compression); __Pyx_GIVEREF(__pyx_v_compression); __Pyx_GOTREF(__pyx_v_self->compression); __Pyx_DECREF(__pyx_v_self->compression); __pyx_v_self->compression = __pyx_v_compression; /* "aiohttp/_http_parser.pyx":230 * self.should_close = should_close * self.compression = compression * self.upgrade = upgrade # <<<<<<<<<<<<<< * self.chunked = chunked * */ __Pyx_INCREF(__pyx_v_upgrade); __Pyx_GIVEREF(__pyx_v_upgrade); __Pyx_GOTREF(__pyx_v_self->upgrade); __Pyx_DECREF(__pyx_v_self->upgrade); __pyx_v_self->upgrade = __pyx_v_upgrade; /* "aiohttp/_http_parser.pyx":231 * self.compression = compression * self.upgrade = upgrade * self.chunked = chunked # <<<<<<<<<<<<<< * * def __repr__(self): */ __Pyx_INCREF(__pyx_v_chunked); __Pyx_GIVEREF(__pyx_v_chunked); __Pyx_GOTREF(__pyx_v_self->chunked); __Pyx_DECREF(__pyx_v_self->chunked); __pyx_v_self->chunked = __pyx_v_chunked; /* "aiohttp/_http_parser.pyx":221 * cdef readonly object chunked * * def __init__(self, version, code, reason, headers, raw_headers, # <<<<<<<<<<<<<< * should_close, compression, upgrade, chunked): * self.version = version */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":233 * self.chunked = chunked * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("version", self.version)) */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_2__repr__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */ /* "aiohttp/_http_parser.pyx":244 * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___genexpr(PyObject *__pyx_self) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *__pyx_cur_scope; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("genexpr", 0); __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, __pyx_empty_tuple, NULL); if (unlikely(!__pyx_cur_scope)) { __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)Py_None); __Pyx_INCREF(Py_None); __PYX_ERR(0, 244, __pyx_L1_error) } else { __Pyx_GOTREF(__pyx_cur_scope); } __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *) __pyx_self; __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope)); __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope); { __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_repr___locals_genexpr, __pyx_n_s_aiohttp__http_parser); if (unlikely(!gen)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_DECREF(__pyx_cur_scope); __Pyx_RefNannyFinishContext(); return (PyObject *) gen; } /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__repr__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */ { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *__pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)__pyx_generator->closure); PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *(*__pyx_t_7)(PyObject *); int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("genexpr", 0); switch (__pyx_generator->resume_label) { case 0: goto __pyx_L3_first_run; default: /* CPython raises the right error here */ __Pyx_RefNannyFinishContext(); return NULL; } __pyx_L3_first_run:; if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 244, __pyx_L1_error) __pyx_r = PyList_New(0); if (unlikely(!__pyx_r)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_r); if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info)) { __Pyx_RaiseClosureNameError("info"); __PYX_ERR(0, 244, __pyx_L1_error) } if (unlikely(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 244, __pyx_L1_error) } __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_info; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; for (;;) { if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 244, __pyx_L1_error) #else __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); #endif if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) { PyObject* sequence = __pyx_t_3; Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); __PYX_ERR(0, 244, __pyx_L1_error) } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); } else { __pyx_t_4 = PyList_GET_ITEM(sequence, 0); __pyx_t_5 = PyList_GET_ITEM(sequence, 1); } __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(__pyx_t_5); #else __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); #endif __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } else { Py_ssize_t index = -1; __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext; index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L6_unpacking_failed; __Pyx_GOTREF(__pyx_t_4); index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed; __Pyx_GOTREF(__pyx_t_5); if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 244, __pyx_L1_error) __pyx_t_7 = NULL; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; goto __pyx_L7_unpacking_done; __pyx_L6_unpacking_failed:; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_7 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); __PYX_ERR(0, 244, __pyx_L1_error) __pyx_L7_unpacking_done:; } __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_name); __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_name, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_val); __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_val, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_3 = PyNumber_Add(__pyx_cur_scope->__pyx_v_name, __pyx_kp_u_); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_Repr(__pyx_cur_scope->__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = PyNumber_Add(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(__Pyx_ListComp_Append(__pyx_r, (PyObject*)__pyx_t_4))) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_r); __pyx_r = 0; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); #if !CYTHON_USE_EXC_INFO_STACK __Pyx_Coroutine_ResetAndClearException(__pyx_generator); #endif __pyx_generator->resume_label = -1; __Pyx_Coroutine_clear((PyObject*)__pyx_generator); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":233 * self.chunked = chunked * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("version", self.version)) */ static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_2__repr__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *__pyx_cur_scope; PyObject *__pyx_v_sinfo = NULL; PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1 = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__repr__", 0); __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, __pyx_empty_tuple, NULL); if (unlikely(!__pyx_cur_scope)) { __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)Py_None); __Pyx_INCREF(Py_None); __PYX_ERR(0, 233, __pyx_L1_error) } else { __Pyx_GOTREF(__pyx_cur_scope); } /* "aiohttp/_http_parser.pyx":234 * * def __repr__(self): * info = [] # <<<<<<<<<<<<<< * info.append(("version", self.version)) * info.append(("code", self.code)) */ __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 234, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_cur_scope->__pyx_v_info = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":235 * def __repr__(self): * info = [] * info.append(("version", self.version)) # <<<<<<<<<<<<<< * info.append(("code", self.code)) * info.append(("reason", self.reason)) */ __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 235, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_version); __Pyx_GIVEREF(__pyx_n_u_version); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_version); __Pyx_INCREF(__pyx_v_self->version); __Pyx_GIVEREF(__pyx_v_self->version); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->version); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 235, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":236 * info = [] * info.append(("version", self.version)) * info.append(("code", self.code)) # <<<<<<<<<<<<<< * info.append(("reason", self.reason)) * info.append(("headers", self.headers)) */ __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 236, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 236, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_code); __Pyx_GIVEREF(__pyx_n_u_code); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_code); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 236, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":237 * info.append(("version", self.version)) * info.append(("code", self.code)) * info.append(("reason", self.reason)) # <<<<<<<<<<<<<< * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 237, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_reason); __Pyx_GIVEREF(__pyx_n_u_reason); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_reason); __Pyx_INCREF(__pyx_v_self->reason); __Pyx_GIVEREF(__pyx_v_self->reason); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->reason); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 237, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":238 * info.append(("code", self.code)) * info.append(("reason", self.reason)) * info.append(("headers", self.headers)) # <<<<<<<<<<<<<< * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 238, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_headers); __Pyx_GIVEREF(__pyx_n_u_headers); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_headers); __Pyx_INCREF(__pyx_v_self->headers); __Pyx_GIVEREF(__pyx_v_self->headers); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->headers); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 238, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":239 * info.append(("reason", self.reason)) * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) # <<<<<<<<<<<<<< * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 239, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_raw_headers); __Pyx_GIVEREF(__pyx_n_u_raw_headers); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_raw_headers); __Pyx_INCREF(__pyx_v_self->raw_headers); __Pyx_GIVEREF(__pyx_v_self->raw_headers); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->raw_headers); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 239, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":240 * info.append(("headers", self.headers)) * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) # <<<<<<<<<<<<<< * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 240, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_should_close); __Pyx_GIVEREF(__pyx_n_u_should_close); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_should_close); __Pyx_INCREF(__pyx_v_self->should_close); __Pyx_GIVEREF(__pyx_v_self->should_close); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->should_close); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 240, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":241 * info.append(("raw_headers", self.raw_headers)) * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) # <<<<<<<<<<<<<< * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 241, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_compression); __Pyx_GIVEREF(__pyx_n_u_compression); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_compression); __Pyx_INCREF(__pyx_v_self->compression); __Pyx_GIVEREF(__pyx_v_self->compression); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->compression); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 241, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":242 * info.append(("should_close", self.should_close)) * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) # <<<<<<<<<<<<<< * info.append(("chunked", self.chunked)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 242, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_upgrade); __Pyx_GIVEREF(__pyx_n_u_upgrade); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_upgrade); __Pyx_INCREF(__pyx_v_self->upgrade); __Pyx_GIVEREF(__pyx_v_self->upgrade); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->upgrade); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 242, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":243 * info.append(("compression", self.compression)) * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) # <<<<<<<<<<<<<< * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) * return '' */ __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_n_u_chunked); __Pyx_GIVEREF(__pyx_n_u_chunked); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_chunked); __Pyx_INCREF(__pyx_v_self->chunked); __Pyx_GIVEREF(__pyx_v_self->chunked); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->chunked); __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":244 * info.append(("upgrade", self.upgrade)) * info.append(("chunked", self.chunked)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< * return '' * */ __pyx_t_3 = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_Generator_Next(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyUnicode_Join(__pyx_kp_u__2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_sinfo = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":245 * info.append(("chunked", self.chunked)) * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) * return '' # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_3 = __Pyx_PyUnicode_ConcatSafe(__pyx_kp_u_RawResponseMessage, __pyx_v_sinfo); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 245, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyUnicode_Concat(__pyx_t_3, __pyx_kp_u__3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 245, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":233 * self.chunked = chunked * * def __repr__(self): # <<<<<<<<<<<<<< * info = [] * info.append(("version", self.version)) */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_sinfo); __Pyx_XDECREF(__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1); __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":211 * @cython.freelist(DEFAULT_FREELIST_SIZE) * cdef class RawResponseMessage: * cdef readonly object version # HttpVersion # <<<<<<<<<<<<<< * cdef readonly int code * cdef readonly str reason */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7version___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7version___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->version); __pyx_r = __pyx_v_self->version; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":212 * cdef class RawResponseMessage: * cdef readonly object version # HttpVersion * cdef readonly int code # <<<<<<<<<<<<<< * cdef readonly str reason * cdef readonly object headers # CIMultiDict */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4code___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4code___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 212, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.code.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":213 * cdef readonly object version # HttpVersion * cdef readonly int code * cdef readonly str reason # <<<<<<<<<<<<<< * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6reason___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6reason___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->reason); __pyx_r = __pyx_v_self->reason; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":214 * cdef readonly int code * cdef readonly str reason * cdef readonly object headers # CIMultiDict # <<<<<<<<<<<<<< * cdef readonly object raw_headers # tuple * cdef readonly object should_close */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->headers); __pyx_r = __pyx_v_self->headers; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":215 * cdef readonly str reason * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple # <<<<<<<<<<<<<< * cdef readonly object should_close * cdef readonly object compression */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->raw_headers); __pyx_r = __pyx_v_self->raw_headers; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":216 * cdef readonly object headers # CIMultiDict * cdef readonly object raw_headers # tuple * cdef readonly object should_close # <<<<<<<<<<<<<< * cdef readonly object compression * cdef readonly object upgrade */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_12should_close___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_12should_close___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->should_close); __pyx_r = __pyx_v_self->should_close; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":217 * cdef readonly object raw_headers # tuple * cdef readonly object should_close * cdef readonly object compression # <<<<<<<<<<<<<< * cdef readonly object upgrade * cdef readonly object chunked */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11compression___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11compression___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->compression); __pyx_r = __pyx_v_self->compression; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":218 * cdef readonly object should_close * cdef readonly object compression * cdef readonly object upgrade # <<<<<<<<<<<<<< * cdef readonly object chunked * */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->upgrade); __pyx_r = __pyx_v_self->upgrade; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":219 * cdef readonly object compression * cdef readonly object upgrade * cdef readonly object chunked # <<<<<<<<<<<<<< * * def __init__(self, version, code, reason, headers, raw_headers, */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(PyObject *__pyx_v_self); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(PyObject *__pyx_v_self) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7chunked___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7chunked___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_self->chunked); __pyx_r = __pyx_v_self->chunked; goto __pyx_L0; /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4__reduce_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { PyObject *__pyx_v_state = 0; PyObject *__pyx_v__dict = 0; int __pyx_v_use_setstate; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; int __pyx_t_4; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":5 * cdef object _dict * cdef bint use_setstate * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) # <<<<<<<<<<<<<< * _dict = getattr(self, '__dict__', None) * if _dict is not None: */ __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(9); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_self->chunked); __Pyx_GIVEREF(__pyx_v_self->chunked); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->chunked); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_INCREF(__pyx_v_self->compression); __Pyx_GIVEREF(__pyx_v_self->compression); PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_self->compression); __Pyx_INCREF(__pyx_v_self->headers); __Pyx_GIVEREF(__pyx_v_self->headers); PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->headers); __Pyx_INCREF(__pyx_v_self->raw_headers); __Pyx_GIVEREF(__pyx_v_self->raw_headers); PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_v_self->raw_headers); __Pyx_INCREF(__pyx_v_self->reason); __Pyx_GIVEREF(__pyx_v_self->reason); PyTuple_SET_ITEM(__pyx_t_2, 5, __pyx_v_self->reason); __Pyx_INCREF(__pyx_v_self->should_close); __Pyx_GIVEREF(__pyx_v_self->should_close); PyTuple_SET_ITEM(__pyx_t_2, 6, __pyx_v_self->should_close); __Pyx_INCREF(__pyx_v_self->upgrade); __Pyx_GIVEREF(__pyx_v_self->upgrade); PyTuple_SET_ITEM(__pyx_t_2, 7, __pyx_v_self->upgrade); __Pyx_INCREF(__pyx_v_self->version); __Pyx_GIVEREF(__pyx_v_self->version); PyTuple_SET_ITEM(__pyx_t_2, 8, __pyx_v_self->version); __pyx_t_1 = 0; __pyx_v_state = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "(tree fragment)":6 * cdef bint use_setstate * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< * if _dict is not None: * state += (_dict,) */ __pyx_t_2 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v__dict = __pyx_t_2; __pyx_t_2 = 0; /* "(tree fragment)":7 * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ __pyx_t_3 = (__pyx_v__dict != Py_None); __pyx_t_4 = (__pyx_t_3 != 0); if (__pyx_t_4) { /* "(tree fragment)":8 * _dict = getattr(self, '__dict__', None) * if _dict is not None: * state += (_dict,) # <<<<<<<<<<<<<< * use_setstate = True * else: */ __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v__dict); __Pyx_GIVEREF(__pyx_v__dict); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v__dict); __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_1)); __pyx_t_1 = 0; /* "(tree fragment)":9 * if _dict is not None: * state += (_dict,) * use_setstate = True # <<<<<<<<<<<<<< * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None */ __pyx_v_use_setstate = 1; /* "(tree fragment)":7 * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) * _dict = getattr(self, '__dict__', None) * if _dict is not None: # <<<<<<<<<<<<<< * state += (_dict,) * use_setstate = True */ goto __pyx_L3; } /* "(tree fragment)":11 * use_setstate = True * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None # <<<<<<<<<<<<<< * if use_setstate: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state */ /*else*/ { __pyx_t_3 = (__pyx_v_self->chunked != Py_None); __pyx_t_5 = (__pyx_t_3 != 0); if (!__pyx_t_5) { } else { __pyx_t_4 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = (__pyx_v_self->compression != Py_None); __pyx_t_3 = (__pyx_t_5 != 0); if (!__pyx_t_3) { } else { __pyx_t_4 = __pyx_t_3; goto __pyx_L4_bool_binop_done; } __pyx_t_3 = (__pyx_v_self->headers != Py_None); __pyx_t_5 = (__pyx_t_3 != 0); if (!__pyx_t_5) { } else { __pyx_t_4 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = (__pyx_v_self->raw_headers != Py_None); __pyx_t_3 = (__pyx_t_5 != 0); if (!__pyx_t_3) { } else { __pyx_t_4 = __pyx_t_3; goto __pyx_L4_bool_binop_done; } __pyx_t_3 = (__pyx_v_self->reason != ((PyObject*)Py_None)); __pyx_t_5 = (__pyx_t_3 != 0); if (!__pyx_t_5) { } else { __pyx_t_4 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = (__pyx_v_self->should_close != Py_None); __pyx_t_3 = (__pyx_t_5 != 0); if (!__pyx_t_3) { } else { __pyx_t_4 = __pyx_t_3; goto __pyx_L4_bool_binop_done; } __pyx_t_3 = (__pyx_v_self->upgrade != Py_None); __pyx_t_5 = (__pyx_t_3 != 0); if (!__pyx_t_5) { } else { __pyx_t_4 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = (__pyx_v_self->version != Py_None); __pyx_t_3 = (__pyx_t_5 != 0); __pyx_t_4 = __pyx_t_3; __pyx_L4_bool_binop_done:; __pyx_v_use_setstate = __pyx_t_4; } __pyx_L3:; /* "(tree fragment)":12 * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state * else: */ __pyx_t_4 = (__pyx_v_use_setstate != 0); if (__pyx_t_4) { /* "(tree fragment)":13 * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None * if use_setstate: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state # <<<<<<<<<<<<<< * else: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) */ __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pyx_unpickle_RawResponseMessag); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_209127132); __Pyx_GIVEREF(__pyx_int_209127132); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_209127132); __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None); __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_2); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_r = __pyx_t_6; __pyx_t_6 = 0; goto __pyx_L0; /* "(tree fragment)":12 * else: * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None * if use_setstate: # <<<<<<<<<<<<<< * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state * else: */ } /* "(tree fragment)":15 * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state * else: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pyx_unpickle_RawResponseMessag); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); __Pyx_INCREF(__pyx_int_209127132); __Pyx_GIVEREF(__pyx_int_209127132); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_209127132); __Pyx_INCREF(__pyx_v_state); __Pyx_GIVEREF(__pyx_v_state); PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2); __pyx_t_6 = 0; __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * cdef tuple state * cdef object _dict */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_state); __Pyx_XDECREF(__pyx_v__dict); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6__setstate_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":17 * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) # <<<<<<<<<<<<<< */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":16 * else: * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":248 * * * cdef _new_response_message(object version, # <<<<<<<<<<<<<< * int code, * str reason, */ static PyObject *__pyx_f_7aiohttp_12_http_parser__new_response_message(PyObject *__pyx_v_version, int __pyx_v_code, PyObject *__pyx_v_reason, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, int __pyx_v_should_close, PyObject *__pyx_v_compression, int __pyx_v_upgrade, int __pyx_v_chunked) { struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_ret = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_new_response_message", 0); /* "aiohttp/_http_parser.pyx":258 * bint chunked): * cdef RawResponseMessage ret * ret = RawResponseMessage.__new__(RawResponseMessage) # <<<<<<<<<<<<<< * ret.version = version * ret.code = code */ __pyx_t_1 = ((PyObject *)__pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage(((PyTypeObject *)__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage), __pyx_empty_tuple, NULL)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 258, __pyx_L1_error) __Pyx_GOTREF(((PyObject *)__pyx_t_1)); __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":259 * cdef RawResponseMessage ret * ret = RawResponseMessage.__new__(RawResponseMessage) * ret.version = version # <<<<<<<<<<<<<< * ret.code = code * ret.reason = reason */ __Pyx_INCREF(__pyx_v_version); __Pyx_GIVEREF(__pyx_v_version); __Pyx_GOTREF(__pyx_v_ret->version); __Pyx_DECREF(__pyx_v_ret->version); __pyx_v_ret->version = __pyx_v_version; /* "aiohttp/_http_parser.pyx":260 * ret = RawResponseMessage.__new__(RawResponseMessage) * ret.version = version * ret.code = code # <<<<<<<<<<<<<< * ret.reason = reason * ret.headers = headers */ __pyx_v_ret->code = __pyx_v_code; /* "aiohttp/_http_parser.pyx":261 * ret.version = version * ret.code = code * ret.reason = reason # <<<<<<<<<<<<<< * ret.headers = headers * ret.raw_headers = raw_headers */ __Pyx_INCREF(__pyx_v_reason); __Pyx_GIVEREF(__pyx_v_reason); __Pyx_GOTREF(__pyx_v_ret->reason); __Pyx_DECREF(__pyx_v_ret->reason); __pyx_v_ret->reason = __pyx_v_reason; /* "aiohttp/_http_parser.pyx":262 * ret.code = code * ret.reason = reason * ret.headers = headers # <<<<<<<<<<<<<< * ret.raw_headers = raw_headers * ret.should_close = should_close */ __Pyx_INCREF(__pyx_v_headers); __Pyx_GIVEREF(__pyx_v_headers); __Pyx_GOTREF(__pyx_v_ret->headers); __Pyx_DECREF(__pyx_v_ret->headers); __pyx_v_ret->headers = __pyx_v_headers; /* "aiohttp/_http_parser.pyx":263 * ret.reason = reason * ret.headers = headers * ret.raw_headers = raw_headers # <<<<<<<<<<<<<< * ret.should_close = should_close * ret.compression = compression */ __Pyx_INCREF(__pyx_v_raw_headers); __Pyx_GIVEREF(__pyx_v_raw_headers); __Pyx_GOTREF(__pyx_v_ret->raw_headers); __Pyx_DECREF(__pyx_v_ret->raw_headers); __pyx_v_ret->raw_headers = __pyx_v_raw_headers; /* "aiohttp/_http_parser.pyx":264 * ret.headers = headers * ret.raw_headers = raw_headers * ret.should_close = should_close # <<<<<<<<<<<<<< * ret.compression = compression * ret.upgrade = upgrade */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_should_close); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 264, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->should_close); __Pyx_DECREF(__pyx_v_ret->should_close); __pyx_v_ret->should_close = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":265 * ret.raw_headers = raw_headers * ret.should_close = should_close * ret.compression = compression # <<<<<<<<<<<<<< * ret.upgrade = upgrade * ret.chunked = chunked */ __Pyx_INCREF(__pyx_v_compression); __Pyx_GIVEREF(__pyx_v_compression); __Pyx_GOTREF(__pyx_v_ret->compression); __Pyx_DECREF(__pyx_v_ret->compression); __pyx_v_ret->compression = __pyx_v_compression; /* "aiohttp/_http_parser.pyx":266 * ret.should_close = should_close * ret.compression = compression * ret.upgrade = upgrade # <<<<<<<<<<<<<< * ret.chunked = chunked * return ret */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_upgrade); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 266, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->upgrade); __Pyx_DECREF(__pyx_v_ret->upgrade); __pyx_v_ret->upgrade = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":267 * ret.compression = compression * ret.upgrade = upgrade * ret.chunked = chunked # <<<<<<<<<<<<<< * return ret * */ __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_chunked); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 267, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_ret->chunked); __Pyx_DECREF(__pyx_v_ret->chunked); __pyx_v_ret->chunked = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":268 * ret.upgrade = upgrade * ret.chunked = chunked * return ret # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_ret)); __pyx_r = ((PyObject *)__pyx_v_ret); goto __pyx_L0; /* "aiohttp/_http_parser.pyx":248 * * * cdef _new_response_message(object version, # <<<<<<<<<<<<<< * int code, * str reason, */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser._new_response_message", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_ret); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":312 * Py_buffer py_buf * * def __cinit__(self): # <<<<<<<<<<<<<< * self._cparser = \ * PyMem_Malloc(sizeof(cparser.llhttp_t)) */ /* Python wrapper */ static int __pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) { __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;} if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser___cinit__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_12_http_parser_10HttpParser___cinit__(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__cinit__", 0); /* "aiohttp/_http_parser.pyx":313 * * def __cinit__(self): * self._cparser = \ # <<<<<<<<<<<<<< * PyMem_Malloc(sizeof(cparser.llhttp_t)) * if self._cparser is NULL: */ __pyx_v_self->_cparser = ((llhttp_t *)PyMem_Malloc((sizeof(llhttp_t)))); /* "aiohttp/_http_parser.pyx":315 * self._cparser = \ * PyMem_Malloc(sizeof(cparser.llhttp_t)) * if self._cparser is NULL: # <<<<<<<<<<<<<< * raise MemoryError() * */ __pyx_t_1 = ((__pyx_v_self->_cparser == NULL) != 0); if (unlikely(__pyx_t_1)) { /* "aiohttp/_http_parser.pyx":316 * PyMem_Malloc(sizeof(cparser.llhttp_t)) * if self._cparser is NULL: * raise MemoryError() # <<<<<<<<<<<<<< * * self._csettings = \ */ PyErr_NoMemory(); __PYX_ERR(0, 316, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":315 * self._cparser = \ * PyMem_Malloc(sizeof(cparser.llhttp_t)) * if self._cparser is NULL: # <<<<<<<<<<<<<< * raise MemoryError() * */ } /* "aiohttp/_http_parser.pyx":318 * raise MemoryError() * * self._csettings = \ # <<<<<<<<<<<<<< * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) * if self._csettings is NULL: */ __pyx_v_self->_csettings = ((llhttp_settings_t *)PyMem_Malloc((sizeof(llhttp_settings_t)))); /* "aiohttp/_http_parser.pyx":320 * self._csettings = \ * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) * if self._csettings is NULL: # <<<<<<<<<<<<<< * raise MemoryError() * */ __pyx_t_1 = ((__pyx_v_self->_csettings == NULL) != 0); if (unlikely(__pyx_t_1)) { /* "aiohttp/_http_parser.pyx":321 * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) * if self._csettings is NULL: * raise MemoryError() # <<<<<<<<<<<<<< * * def __dealloc__(self): */ PyErr_NoMemory(); __PYX_ERR(0, 321, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":320 * self._csettings = \ * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) * if self._csettings is NULL: # <<<<<<<<<<<<<< * raise MemoryError() * */ } /* "aiohttp/_http_parser.pyx":312 * Py_buffer py_buf * * def __cinit__(self): # <<<<<<<<<<<<<< * self._cparser = \ * PyMem_Malloc(sizeof(cparser.llhttp_t)) */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":323 * raise MemoryError() * * def __dealloc__(self): # <<<<<<<<<<<<<< * PyMem_Free(self._cparser) * PyMem_Free(self._csettings) */ /* Python wrapper */ static void __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ static void __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(PyObject *__pyx_v_self) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); __pyx_pf_7aiohttp_12_http_parser_10HttpParser_2__dealloc__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); } static void __pyx_pf_7aiohttp_12_http_parser_10HttpParser_2__dealloc__(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__dealloc__", 0); /* "aiohttp/_http_parser.pyx":324 * * def __dealloc__(self): * PyMem_Free(self._cparser) # <<<<<<<<<<<<<< * PyMem_Free(self._csettings) * */ PyMem_Free(__pyx_v_self->_cparser); /* "aiohttp/_http_parser.pyx":325 * def __dealloc__(self): * PyMem_Free(self._cparser) * PyMem_Free(self._csettings) # <<<<<<<<<<<<<< * * cdef _init( */ PyMem_Free(__pyx_v_self->_csettings); /* "aiohttp/_http_parser.pyx":323 * raise MemoryError() * * def __dealloc__(self): # <<<<<<<<<<<<<< * PyMem_Free(self._cparser) * PyMem_Free(self._csettings) */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "aiohttp/_http_parser.pyx":327 * PyMem_Free(self._csettings) * * cdef _init( # <<<<<<<<<<<<<< * self, cparser.llhttp_type mode, * object protocol, object loop, int limit, */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__init(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, enum llhttp_type __pyx_v_mode, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args) { /* "aiohttp/_http_parser.pyx":330 * self, cparser.llhttp_type mode, * object protocol, object loop, int limit, * object timer=None, # <<<<<<<<<<<<<< * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, */ PyObject *__pyx_v_timer = ((PyObject *)Py_None); size_t __pyx_v_max_line_size = ((size_t)0x1FFE); size_t __pyx_v_max_headers = ((size_t)0x8000); size_t __pyx_v_max_field_size = ((size_t)0x1FFE); /* "aiohttp/_http_parser.pyx":332 * object timer=None, * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True, */ PyObject *__pyx_v_payload_exception = ((PyObject *)Py_None); /* "aiohttp/_http_parser.pyx":333 * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< * bint auto_decompress=True, * ): */ int __pyx_v_response_with_body = ((int)1); int __pyx_v_read_until_eof = ((int)0); /* "aiohttp/_http_parser.pyx":334 * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True, # <<<<<<<<<<<<<< * ): * cparser.llhttp_settings_init(self._csettings) */ int __pyx_v_auto_decompress = ((int)1); PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_init", 0); if (__pyx_optional_args) { if (__pyx_optional_args->__pyx_n > 0) { __pyx_v_timer = __pyx_optional_args->timer; if (__pyx_optional_args->__pyx_n > 1) { __pyx_v_max_line_size = __pyx_optional_args->max_line_size; if (__pyx_optional_args->__pyx_n > 2) { __pyx_v_max_headers = __pyx_optional_args->max_headers; if (__pyx_optional_args->__pyx_n > 3) { __pyx_v_max_field_size = __pyx_optional_args->max_field_size; if (__pyx_optional_args->__pyx_n > 4) { __pyx_v_payload_exception = __pyx_optional_args->payload_exception; if (__pyx_optional_args->__pyx_n > 5) { __pyx_v_response_with_body = __pyx_optional_args->response_with_body; if (__pyx_optional_args->__pyx_n > 6) { __pyx_v_read_until_eof = __pyx_optional_args->read_until_eof; if (__pyx_optional_args->__pyx_n > 7) { __pyx_v_auto_decompress = __pyx_optional_args->auto_decompress; } } } } } } } } } /* "aiohttp/_http_parser.pyx":336 * bint auto_decompress=True, * ): * cparser.llhttp_settings_init(self._csettings) # <<<<<<<<<<<<<< * cparser.llhttp_init(self._cparser, mode, self._csettings) * self._cparser.data = self */ llhttp_settings_init(__pyx_v_self->_csettings); /* "aiohttp/_http_parser.pyx":337 * ): * cparser.llhttp_settings_init(self._csettings) * cparser.llhttp_init(self._cparser, mode, self._csettings) # <<<<<<<<<<<<<< * self._cparser.data = self * self._cparser.content_length = 0 */ llhttp_init(__pyx_v_self->_cparser, __pyx_v_mode, __pyx_v_self->_csettings); /* "aiohttp/_http_parser.pyx":338 * cparser.llhttp_settings_init(self._csettings) * cparser.llhttp_init(self._cparser, mode, self._csettings) * self._cparser.data = self # <<<<<<<<<<<<<< * self._cparser.content_length = 0 * */ __pyx_v_self->_cparser->data = ((void *)__pyx_v_self); /* "aiohttp/_http_parser.pyx":339 * cparser.llhttp_init(self._cparser, mode, self._csettings) * self._cparser.data = self * self._cparser.content_length = 0 # <<<<<<<<<<<<<< * * self._protocol = protocol */ __pyx_v_self->_cparser->content_length = 0; /* "aiohttp/_http_parser.pyx":341 * self._cparser.content_length = 0 * * self._protocol = protocol # <<<<<<<<<<<<<< * self._loop = loop * self._timer = timer */ __Pyx_INCREF(__pyx_v_protocol); __Pyx_GIVEREF(__pyx_v_protocol); __Pyx_GOTREF(__pyx_v_self->_protocol); __Pyx_DECREF(__pyx_v_self->_protocol); __pyx_v_self->_protocol = __pyx_v_protocol; /* "aiohttp/_http_parser.pyx":342 * * self._protocol = protocol * self._loop = loop # <<<<<<<<<<<<<< * self._timer = timer * */ __Pyx_INCREF(__pyx_v_loop); __Pyx_GIVEREF(__pyx_v_loop); __Pyx_GOTREF(__pyx_v_self->_loop); __Pyx_DECREF(__pyx_v_self->_loop); __pyx_v_self->_loop = __pyx_v_loop; /* "aiohttp/_http_parser.pyx":343 * self._protocol = protocol * self._loop = loop * self._timer = timer # <<<<<<<<<<<<<< * * self._buf = bytearray() */ __Pyx_INCREF(__pyx_v_timer); __Pyx_GIVEREF(__pyx_v_timer); __Pyx_GOTREF(__pyx_v_self->_timer); __Pyx_DECREF(__pyx_v_self->_timer); __pyx_v_self->_timer = __pyx_v_timer; /* "aiohttp/_http_parser.pyx":345 * self._timer = timer * * self._buf = bytearray() # <<<<<<<<<<<<<< * self._payload = None * self._payload_error = 0 */ __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 345, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->_buf); __Pyx_DECREF(__pyx_v_self->_buf); __pyx_v_self->_buf = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":346 * * self._buf = bytearray() * self._payload = None # <<<<<<<<<<<<<< * self._payload_error = 0 * self._payload_exception = payload_exception */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_payload); __Pyx_DECREF(__pyx_v_self->_payload); __pyx_v_self->_payload = Py_None; /* "aiohttp/_http_parser.pyx":347 * self._buf = bytearray() * self._payload = None * self._payload_error = 0 # <<<<<<<<<<<<<< * self._payload_exception = payload_exception * self._messages = [] */ __pyx_v_self->_payload_error = 0; /* "aiohttp/_http_parser.pyx":348 * self._payload = None * self._payload_error = 0 * self._payload_exception = payload_exception # <<<<<<<<<<<<<< * self._messages = [] * */ __Pyx_INCREF(__pyx_v_payload_exception); __Pyx_GIVEREF(__pyx_v_payload_exception); __Pyx_GOTREF(__pyx_v_self->_payload_exception); __Pyx_DECREF(__pyx_v_self->_payload_exception); __pyx_v_self->_payload_exception = __pyx_v_payload_exception; /* "aiohttp/_http_parser.pyx":349 * self._payload_error = 0 * self._payload_exception = payload_exception * self._messages = [] # <<<<<<<<<<<<<< * * self._raw_name = bytearray() */ __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->_messages); __Pyx_DECREF(__pyx_v_self->_messages); __pyx_v_self->_messages = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":351 * self._messages = [] * * self._raw_name = bytearray() # <<<<<<<<<<<<<< * self._raw_value = bytearray() * self._has_value = False */ __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 351, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->_raw_name); __Pyx_DECREF(__pyx_v_self->_raw_name); __pyx_v_self->_raw_name = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":352 * * self._raw_name = bytearray() * self._raw_value = bytearray() # <<<<<<<<<<<<<< * self._has_value = False * */ __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 352, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_self->_raw_value); __Pyx_DECREF(__pyx_v_self->_raw_value); __pyx_v_self->_raw_value = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":353 * self._raw_name = bytearray() * self._raw_value = bytearray() * self._has_value = False # <<<<<<<<<<<<<< * * self._max_line_size = max_line_size */ __pyx_v_self->_has_value = 0; /* "aiohttp/_http_parser.pyx":355 * self._has_value = False * * self._max_line_size = max_line_size # <<<<<<<<<<<<<< * self._max_headers = max_headers * self._max_field_size = max_field_size */ __pyx_v_self->_max_line_size = __pyx_v_max_line_size; /* "aiohttp/_http_parser.pyx":356 * * self._max_line_size = max_line_size * self._max_headers = max_headers # <<<<<<<<<<<<<< * self._max_field_size = max_field_size * self._response_with_body = response_with_body */ __pyx_v_self->_max_headers = __pyx_v_max_headers; /* "aiohttp/_http_parser.pyx":357 * self._max_line_size = max_line_size * self._max_headers = max_headers * self._max_field_size = max_field_size # <<<<<<<<<<<<<< * self._response_with_body = response_with_body * self._read_until_eof = read_until_eof */ __pyx_v_self->_max_field_size = __pyx_v_max_field_size; /* "aiohttp/_http_parser.pyx":358 * self._max_headers = max_headers * self._max_field_size = max_field_size * self._response_with_body = response_with_body # <<<<<<<<<<<<<< * self._read_until_eof = read_until_eof * self._upgraded = False */ __pyx_v_self->_response_with_body = __pyx_v_response_with_body; /* "aiohttp/_http_parser.pyx":359 * self._max_field_size = max_field_size * self._response_with_body = response_with_body * self._read_until_eof = read_until_eof # <<<<<<<<<<<<<< * self._upgraded = False * self._auto_decompress = auto_decompress */ __pyx_v_self->_read_until_eof = __pyx_v_read_until_eof; /* "aiohttp/_http_parser.pyx":360 * self._response_with_body = response_with_body * self._read_until_eof = read_until_eof * self._upgraded = False # <<<<<<<<<<<<<< * self._auto_decompress = auto_decompress * self._content_encoding = None */ __pyx_v_self->_upgraded = 0; /* "aiohttp/_http_parser.pyx":361 * self._read_until_eof = read_until_eof * self._upgraded = False * self._auto_decompress = auto_decompress # <<<<<<<<<<<<<< * self._content_encoding = None * */ __pyx_v_self->_auto_decompress = __pyx_v_auto_decompress; /* "aiohttp/_http_parser.pyx":362 * self._upgraded = False * self._auto_decompress = auto_decompress * self._content_encoding = None # <<<<<<<<<<<<<< * * self._csettings.on_url = cb_on_url */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_content_encoding); __Pyx_DECREF(__pyx_v_self->_content_encoding); __pyx_v_self->_content_encoding = ((PyObject*)Py_None); /* "aiohttp/_http_parser.pyx":364 * self._content_encoding = None * * self._csettings.on_url = cb_on_url # <<<<<<<<<<<<<< * self._csettings.on_status = cb_on_status * self._csettings.on_header_field = cb_on_header_field */ __pyx_v_self->_csettings->on_url = __pyx_f_7aiohttp_12_http_parser_cb_on_url; /* "aiohttp/_http_parser.pyx":365 * * self._csettings.on_url = cb_on_url * self._csettings.on_status = cb_on_status # <<<<<<<<<<<<<< * self._csettings.on_header_field = cb_on_header_field * self._csettings.on_header_value = cb_on_header_value */ __pyx_v_self->_csettings->on_status = __pyx_f_7aiohttp_12_http_parser_cb_on_status; /* "aiohttp/_http_parser.pyx":366 * self._csettings.on_url = cb_on_url * self._csettings.on_status = cb_on_status * self._csettings.on_header_field = cb_on_header_field # <<<<<<<<<<<<<< * self._csettings.on_header_value = cb_on_header_value * self._csettings.on_headers_complete = cb_on_headers_complete */ __pyx_v_self->_csettings->on_header_field = __pyx_f_7aiohttp_12_http_parser_cb_on_header_field; /* "aiohttp/_http_parser.pyx":367 * self._csettings.on_status = cb_on_status * self._csettings.on_header_field = cb_on_header_field * self._csettings.on_header_value = cb_on_header_value # <<<<<<<<<<<<<< * self._csettings.on_headers_complete = cb_on_headers_complete * self._csettings.on_body = cb_on_body */ __pyx_v_self->_csettings->on_header_value = __pyx_f_7aiohttp_12_http_parser_cb_on_header_value; /* "aiohttp/_http_parser.pyx":368 * self._csettings.on_header_field = cb_on_header_field * self._csettings.on_header_value = cb_on_header_value * self._csettings.on_headers_complete = cb_on_headers_complete # <<<<<<<<<<<<<< * self._csettings.on_body = cb_on_body * self._csettings.on_message_begin = cb_on_message_begin */ __pyx_v_self->_csettings->on_headers_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete; /* "aiohttp/_http_parser.pyx":369 * self._csettings.on_header_value = cb_on_header_value * self._csettings.on_headers_complete = cb_on_headers_complete * self._csettings.on_body = cb_on_body # <<<<<<<<<<<<<< * self._csettings.on_message_begin = cb_on_message_begin * self._csettings.on_message_complete = cb_on_message_complete */ __pyx_v_self->_csettings->on_body = __pyx_f_7aiohttp_12_http_parser_cb_on_body; /* "aiohttp/_http_parser.pyx":370 * self._csettings.on_headers_complete = cb_on_headers_complete * self._csettings.on_body = cb_on_body * self._csettings.on_message_begin = cb_on_message_begin # <<<<<<<<<<<<<< * self._csettings.on_message_complete = cb_on_message_complete * self._csettings.on_chunk_header = cb_on_chunk_header */ __pyx_v_self->_csettings->on_message_begin = __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin; /* "aiohttp/_http_parser.pyx":371 * self._csettings.on_body = cb_on_body * self._csettings.on_message_begin = cb_on_message_begin * self._csettings.on_message_complete = cb_on_message_complete # <<<<<<<<<<<<<< * self._csettings.on_chunk_header = cb_on_chunk_header * self._csettings.on_chunk_complete = cb_on_chunk_complete */ __pyx_v_self->_csettings->on_message_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete; /* "aiohttp/_http_parser.pyx":372 * self._csettings.on_message_begin = cb_on_message_begin * self._csettings.on_message_complete = cb_on_message_complete * self._csettings.on_chunk_header = cb_on_chunk_header # <<<<<<<<<<<<<< * self._csettings.on_chunk_complete = cb_on_chunk_complete * */ __pyx_v_self->_csettings->on_chunk_header = __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header; /* "aiohttp/_http_parser.pyx":373 * self._csettings.on_message_complete = cb_on_message_complete * self._csettings.on_chunk_header = cb_on_chunk_header * self._csettings.on_chunk_complete = cb_on_chunk_complete # <<<<<<<<<<<<<< * * self._last_error = None */ __pyx_v_self->_csettings->on_chunk_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete; /* "aiohttp/_http_parser.pyx":375 * self._csettings.on_chunk_complete = cb_on_chunk_complete * * self._last_error = None # <<<<<<<<<<<<<< * self._limit = limit * */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_last_error); __Pyx_DECREF(__pyx_v_self->_last_error); __pyx_v_self->_last_error = Py_None; /* "aiohttp/_http_parser.pyx":376 * * self._last_error = None * self._limit = limit # <<<<<<<<<<<<<< * * cdef _process_header(self): */ __pyx_v_self->_limit = __pyx_v_limit; /* "aiohttp/_http_parser.pyx":327 * PyMem_Free(self._csettings) * * cdef _init( # <<<<<<<<<<<<<< * self, cparser.llhttp_type mode, * object protocol, object loop, int limit, */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._init", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":378 * self._limit = limit * * cdef _process_header(self): # <<<<<<<<<<<<<< * if self._raw_name: * raw_name = bytes(self._raw_name) */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_v_raw_name = NULL; PyObject *__pyx_v_raw_value = NULL; PyObject *__pyx_v_name = NULL; PyObject *__pyx_v_value = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; int __pyx_t_7; int __pyx_t_8; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_process_header", 0); /* "aiohttp/_http_parser.pyx":379 * * cdef _process_header(self): * if self._raw_name: # <<<<<<<<<<<<<< * raw_name = bytes(self._raw_name) * raw_value = bytes(self._raw_value) */ __pyx_t_1 = (__pyx_v_self->_raw_name != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->_raw_name) != 0); if (__pyx_t_1) { /* "aiohttp/_http_parser.pyx":380 * cdef _process_header(self): * if self._raw_name: * raw_name = bytes(self._raw_name) # <<<<<<<<<<<<<< * raw_value = bytes(self._raw_value) * */ __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_self->_raw_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 380, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v_raw_name = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":381 * if self._raw_name: * raw_name = bytes(self._raw_name) * raw_value = bytes(self._raw_value) # <<<<<<<<<<<<<< * * name = find_header(raw_name) */ __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_self->_raw_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 381, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v_raw_value = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":383 * raw_value = bytes(self._raw_value) * * name = find_header(raw_name) # <<<<<<<<<<<<<< * value = raw_value.decode('utf-8', 'surrogateescape') * */ __pyx_t_2 = __pyx_f_7aiohttp_12_http_parser_find_header(__pyx_v_raw_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 383, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v_name = __pyx_t_2; __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":384 * * name = find_header(raw_name) * value = raw_value.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< * * self._headers.add(name, value) */ __pyx_t_2 = __Pyx_decode_bytes(__pyx_v_raw_value, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 384, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v_value = __pyx_t_2; __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":386 * value = raw_value.decode('utf-8', 'surrogateescape') * * self._headers.add(name, value) # <<<<<<<<<<<<<< * * if name is CONTENT_ENCODING: */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_headers, __pyx_n_s_add); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 386, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_5 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_3)) { PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_name, __pyx_v_value}; __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_2); } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_name, __pyx_v_value}; __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GOTREF(__pyx_t_2); } else #endif { __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 386, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); if (__pyx_t_4) { __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; } __Pyx_INCREF(__pyx_v_name); __Pyx_GIVEREF(__pyx_v_name); PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_name); __Pyx_INCREF(__pyx_v_value); __Pyx_GIVEREF(__pyx_v_value); PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_value); __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":388 * self._headers.add(name, value) * * if name is CONTENT_ENCODING: # <<<<<<<<<<<<<< * self._content_encoding = value * */ __pyx_t_1 = (__pyx_v_name == __pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING); __pyx_t_7 = (__pyx_t_1 != 0); if (__pyx_t_7) { /* "aiohttp/_http_parser.pyx":389 * * if name is CONTENT_ENCODING: * self._content_encoding = value # <<<<<<<<<<<<<< * * PyByteArray_Resize(self._raw_name, 0) */ if (!(likely(PyUnicode_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 389, __pyx_L1_error) __pyx_t_2 = __pyx_v_value; __Pyx_INCREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_GOTREF(__pyx_v_self->_content_encoding); __Pyx_DECREF(__pyx_v_self->_content_encoding); __pyx_v_self->_content_encoding = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":388 * self._headers.add(name, value) * * if name is CONTENT_ENCODING: # <<<<<<<<<<<<<< * self._content_encoding = value * */ } /* "aiohttp/_http_parser.pyx":391 * self._content_encoding = value * * PyByteArray_Resize(self._raw_name, 0) # <<<<<<<<<<<<<< * PyByteArray_Resize(self._raw_value, 0) * self._has_value = False */ __pyx_t_2 = __pyx_v_self->_raw_name; __Pyx_INCREF(__pyx_t_2); __pyx_t_5 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 391, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":392 * * PyByteArray_Resize(self._raw_name, 0) * PyByteArray_Resize(self._raw_value, 0) # <<<<<<<<<<<<<< * self._has_value = False * self._raw_headers.append((raw_name, raw_value)) */ __pyx_t_2 = __pyx_v_self->_raw_value; __Pyx_INCREF(__pyx_t_2); __pyx_t_5 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 392, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":393 * PyByteArray_Resize(self._raw_name, 0) * PyByteArray_Resize(self._raw_value, 0) * self._has_value = False # <<<<<<<<<<<<<< * self._raw_headers.append((raw_name, raw_value)) * */ __pyx_v_self->_has_value = 0; /* "aiohttp/_http_parser.pyx":394 * PyByteArray_Resize(self._raw_value, 0) * self._has_value = False * self._raw_headers.append((raw_name, raw_value)) # <<<<<<<<<<<<<< * * cdef _on_header_field(self, char* at, size_t length): */ if (unlikely(__pyx_v_self->_raw_headers == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); __PYX_ERR(0, 394, __pyx_L1_error) } __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 394, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_raw_name); __Pyx_GIVEREF(__pyx_v_raw_name); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_raw_name); __Pyx_INCREF(__pyx_v_raw_value); __Pyx_GIVEREF(__pyx_v_raw_value); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_raw_value); __pyx_t_8 = __Pyx_PyList_Append(__pyx_v_self->_raw_headers, __pyx_t_2); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 394, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":379 * * cdef _process_header(self): * if self._raw_name: # <<<<<<<<<<<<<< * raw_name = bytes(self._raw_name) * raw_value = bytes(self._raw_value) */ } /* "aiohttp/_http_parser.pyx":378 * self._limit = limit * * cdef _process_header(self): # <<<<<<<<<<<<<< * if self._raw_name: * raw_name = bytes(self._raw_name) */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._process_header", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_raw_name); __Pyx_XDECREF(__pyx_v_raw_value); __Pyx_XDECREF(__pyx_v_name); __Pyx_XDECREF(__pyx_v_value); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":396 * self._raw_headers.append((raw_name, raw_value)) * * cdef _on_header_field(self, char* at, size_t length): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length) { Py_ssize_t __pyx_v_size; char *__pyx_v_buf; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; Py_ssize_t __pyx_t_3; int __pyx_t_4; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_header_field", 0); /* "aiohttp/_http_parser.pyx":399 * cdef Py_ssize_t size * cdef char *buf * if self._has_value: # <<<<<<<<<<<<<< * self._process_header() * */ __pyx_t_1 = (__pyx_v_self->_has_value != 0); if (__pyx_t_1) { /* "aiohttp/_http_parser.pyx":400 * cdef char *buf * if self._has_value: * self._process_header() # <<<<<<<<<<<<<< * * size = PyByteArray_Size(self._raw_name) */ __pyx_t_2 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_process_header(__pyx_v_self); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 400, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":399 * cdef Py_ssize_t size * cdef char *buf * if self._has_value: # <<<<<<<<<<<<<< * self._process_header() * */ } /* "aiohttp/_http_parser.pyx":402 * self._process_header() * * size = PyByteArray_Size(self._raw_name) # <<<<<<<<<<<<<< * PyByteArray_Resize(self._raw_name, size + length) * buf = PyByteArray_AsString(self._raw_name) */ __pyx_t_2 = __pyx_v_self->_raw_name; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = PyByteArray_Size(__pyx_t_2); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1L))) __PYX_ERR(0, 402, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_size = __pyx_t_3; /* "aiohttp/_http_parser.pyx":403 * * size = PyByteArray_Size(self._raw_name) * PyByteArray_Resize(self._raw_name, size + length) # <<<<<<<<<<<<<< * buf = PyByteArray_AsString(self._raw_name) * memcpy(buf + size, at, length) */ __pyx_t_2 = __pyx_v_self->_raw_name; __Pyx_INCREF(__pyx_t_2); __pyx_t_4 = PyByteArray_Resize(__pyx_t_2, (__pyx_v_size + __pyx_v_length)); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(0, 403, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":404 * size = PyByteArray_Size(self._raw_name) * PyByteArray_Resize(self._raw_name, size + length) * buf = PyByteArray_AsString(self._raw_name) # <<<<<<<<<<<<<< * memcpy(buf + size, at, length) * */ __pyx_t_2 = __pyx_v_self->_raw_name; __Pyx_INCREF(__pyx_t_2); __pyx_v_buf = PyByteArray_AsString(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":405 * PyByteArray_Resize(self._raw_name, size + length) * buf = PyByteArray_AsString(self._raw_name) * memcpy(buf + size, at, length) # <<<<<<<<<<<<<< * * cdef _on_header_value(self, char* at, size_t length): */ (void)(memcpy((__pyx_v_buf + __pyx_v_size), __pyx_v_at, __pyx_v_length)); /* "aiohttp/_http_parser.pyx":396 * self._raw_headers.append((raw_name, raw_value)) * * cdef _on_header_field(self, char* at, size_t length): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":407 * memcpy(buf + size, at, length) * * cdef _on_header_value(self, char* at, size_t length): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length) { Py_ssize_t __pyx_v_size; char *__pyx_v_buf; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; int __pyx_t_3; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_header_value", 0); /* "aiohttp/_http_parser.pyx":411 * cdef char *buf * * size = PyByteArray_Size(self._raw_value) # <<<<<<<<<<<<<< * PyByteArray_Resize(self._raw_value, size + length) * buf = PyByteArray_AsString(self._raw_value) */ __pyx_t_1 = __pyx_v_self->_raw_value; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = PyByteArray_Size(__pyx_t_1); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1L))) __PYX_ERR(0, 411, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_size = __pyx_t_2; /* "aiohttp/_http_parser.pyx":412 * * size = PyByteArray_Size(self._raw_value) * PyByteArray_Resize(self._raw_value, size + length) # <<<<<<<<<<<<<< * buf = PyByteArray_AsString(self._raw_value) * memcpy(buf + size, at, length) */ __pyx_t_1 = __pyx_v_self->_raw_value; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = PyByteArray_Resize(__pyx_t_1, (__pyx_v_size + __pyx_v_length)); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 412, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":413 * size = PyByteArray_Size(self._raw_value) * PyByteArray_Resize(self._raw_value, size + length) * buf = PyByteArray_AsString(self._raw_value) # <<<<<<<<<<<<<< * memcpy(buf + size, at, length) * self._has_value = True */ __pyx_t_1 = __pyx_v_self->_raw_value; __Pyx_INCREF(__pyx_t_1); __pyx_v_buf = PyByteArray_AsString(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":414 * PyByteArray_Resize(self._raw_value, size + length) * buf = PyByteArray_AsString(self._raw_value) * memcpy(buf + size, at, length) # <<<<<<<<<<<<<< * self._has_value = True * */ (void)(memcpy((__pyx_v_buf + __pyx_v_size), __pyx_v_at, __pyx_v_length)); /* "aiohttp/_http_parser.pyx":415 * buf = PyByteArray_AsString(self._raw_value) * memcpy(buf + size, at, length) * self._has_value = True # <<<<<<<<<<<<<< * * cdef _on_headers_complete(self): */ __pyx_v_self->_has_value = 1; /* "aiohttp/_http_parser.pyx":407 * memcpy(buf + size, at, length) * * cdef _on_header_value(self, char* at, size_t length): # <<<<<<<<<<<<<< * cdef Py_ssize_t size * cdef char *buf */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":417 * self._has_value = True * * cdef _on_headers_complete(self): # <<<<<<<<<<<<<< * self._process_header() * */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_v_method = NULL; int __pyx_v_should_close; uint8_t __pyx_v_upgrade; int __pyx_v_chunked; PyObject *__pyx_v_raw_headers = NULL; PyObject *__pyx_v_headers = NULL; PyObject *__pyx_v_encoding = NULL; PyObject *__pyx_v_enc = NULL; PyObject *__pyx_v_msg = NULL; PyObject *__pyx_v_payload = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; uint8_t __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; PyObject *__pyx_t_7 = NULL; int __pyx_t_8; int __pyx_t_9; int __pyx_t_10; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_headers_complete", 0); /* "aiohttp/_http_parser.pyx":418 * * cdef _on_headers_complete(self): * self._process_header() # <<<<<<<<<<<<<< * * method = http_method_str(self._cparser.method) */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_process_header(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":420 * self._process_header() * * method = http_method_str(self._cparser.method) # <<<<<<<<<<<<<< * should_close = not cparser.llhttp_should_keep_alive(self._cparser) * upgrade = self._cparser.upgrade */ __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser_http_method_str(__pyx_v_self->_cparser->method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_method = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":421 * * method = http_method_str(self._cparser.method) * should_close = not cparser.llhttp_should_keep_alive(self._cparser) # <<<<<<<<<<<<<< * upgrade = self._cparser.upgrade * chunked = self._cparser.flags & cparser.F_CHUNKED */ __pyx_v_should_close = (!(llhttp_should_keep_alive(__pyx_v_self->_cparser) != 0)); /* "aiohttp/_http_parser.pyx":422 * method = http_method_str(self._cparser.method) * should_close = not cparser.llhttp_should_keep_alive(self._cparser) * upgrade = self._cparser.upgrade # <<<<<<<<<<<<<< * chunked = self._cparser.flags & cparser.F_CHUNKED * */ __pyx_t_2 = __pyx_v_self->_cparser->upgrade; __pyx_v_upgrade = __pyx_t_2; /* "aiohttp/_http_parser.pyx":423 * should_close = not cparser.llhttp_should_keep_alive(self._cparser) * upgrade = self._cparser.upgrade * chunked = self._cparser.flags & cparser.F_CHUNKED # <<<<<<<<<<<<<< * * raw_headers = tuple(self._raw_headers) */ __pyx_v_chunked = (__pyx_v_self->_cparser->flags & F_CHUNKED); /* "aiohttp/_http_parser.pyx":425 * chunked = self._cparser.flags & cparser.F_CHUNKED * * raw_headers = tuple(self._raw_headers) # <<<<<<<<<<<<<< * headers = CIMultiDictProxy(self._headers) * */ if (unlikely(__pyx_v_self->_raw_headers == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 425, __pyx_L1_error) } __pyx_t_1 = PyList_AsTuple(__pyx_v_self->_raw_headers); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 425, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_raw_headers = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":426 * * raw_headers = tuple(self._raw_headers) * headers = CIMultiDictProxy(self._headers) # <<<<<<<<<<<<<< * * if upgrade or self._cparser.method == 5: # cparser.CONNECT: */ __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy); __pyx_t_3 = __pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy; __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_v_self->_headers) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_self->_headers); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 426, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_headers = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":428 * headers = CIMultiDictProxy(self._headers) * * if upgrade or self._cparser.method == 5: # cparser.CONNECT: # <<<<<<<<<<<<<< * self._upgraded = True * */ __pyx_t_6 = (__pyx_v_upgrade != 0); if (!__pyx_t_6) { } else { __pyx_t_5 = __pyx_t_6; goto __pyx_L4_bool_binop_done; } __pyx_t_6 = ((__pyx_v_self->_cparser->method == 5) != 0); __pyx_t_5 = __pyx_t_6; __pyx_L4_bool_binop_done:; if (__pyx_t_5) { /* "aiohttp/_http_parser.pyx":429 * * if upgrade or self._cparser.method == 5: # cparser.CONNECT: * self._upgraded = True # <<<<<<<<<<<<<< * * # do not support old websocket spec */ __pyx_v_self->_upgraded = 1; /* "aiohttp/_http_parser.pyx":428 * headers = CIMultiDictProxy(self._headers) * * if upgrade or self._cparser.method == 5: # cparser.CONNECT: # <<<<<<<<<<<<<< * self._upgraded = True * */ } /* "aiohttp/_http_parser.pyx":432 * * # do not support old websocket spec * if SEC_WEBSOCKET_KEY1 in headers: # <<<<<<<<<<<<<< * raise InvalidHeader(SEC_WEBSOCKET_KEY1) * */ __pyx_t_5 = (__Pyx_PySequence_ContainsTF(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1, __pyx_v_headers, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 432, __pyx_L1_error) __pyx_t_6 = (__pyx_t_5 != 0); if (unlikely(__pyx_t_6)) { /* "aiohttp/_http_parser.pyx":433 * # do not support old websocket spec * if SEC_WEBSOCKET_KEY1 in headers: * raise InvalidHeader(SEC_WEBSOCKET_KEY1) # <<<<<<<<<<<<<< * * encoding = None */ __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_InvalidHeader); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 433, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 433, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 433, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":432 * * # do not support old websocket spec * if SEC_WEBSOCKET_KEY1 in headers: # <<<<<<<<<<<<<< * raise InvalidHeader(SEC_WEBSOCKET_KEY1) * */ } /* "aiohttp/_http_parser.pyx":435 * raise InvalidHeader(SEC_WEBSOCKET_KEY1) * * encoding = None # <<<<<<<<<<<<<< * enc = self._content_encoding * if enc is not None: */ __Pyx_INCREF(Py_None); __pyx_v_encoding = Py_None; /* "aiohttp/_http_parser.pyx":436 * * encoding = None * enc = self._content_encoding # <<<<<<<<<<<<<< * if enc is not None: * self._content_encoding = None */ __pyx_t_1 = __pyx_v_self->_content_encoding; __Pyx_INCREF(__pyx_t_1); __pyx_v_enc = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":437 * encoding = None * enc = self._content_encoding * if enc is not None: # <<<<<<<<<<<<<< * self._content_encoding = None * enc = enc.lower() */ __pyx_t_6 = (__pyx_v_enc != Py_None); __pyx_t_5 = (__pyx_t_6 != 0); if (__pyx_t_5) { /* "aiohttp/_http_parser.pyx":438 * enc = self._content_encoding * if enc is not None: * self._content_encoding = None # <<<<<<<<<<<<<< * enc = enc.lower() * if enc in ('gzip', 'deflate', 'br'): */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_content_encoding); __Pyx_DECREF(__pyx_v_self->_content_encoding); __pyx_v_self->_content_encoding = ((PyObject*)Py_None); /* "aiohttp/_http_parser.pyx":439 * if enc is not None: * self._content_encoding = None * enc = enc.lower() # <<<<<<<<<<<<<< * if enc in ('gzip', 'deflate', 'br'): * encoding = enc */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_enc, __pyx_n_s_lower); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 439, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4) : __Pyx_PyObject_CallNoArg(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 439, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF_SET(__pyx_v_enc, __pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":440 * self._content_encoding = None * enc = enc.lower() * if enc in ('gzip', 'deflate', 'br'): # <<<<<<<<<<<<<< * encoding = enc * */ __Pyx_INCREF(__pyx_v_enc); __pyx_t_1 = __pyx_v_enc; __pyx_t_6 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_gzip, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 440, __pyx_L1_error) if (!__pyx_t_6) { } else { __pyx_t_5 = __pyx_t_6; goto __pyx_L9_bool_binop_done; } __pyx_t_6 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_deflate, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 440, __pyx_L1_error) if (!__pyx_t_6) { } else { __pyx_t_5 = __pyx_t_6; goto __pyx_L9_bool_binop_done; } __pyx_t_6 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_br, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 440, __pyx_L1_error) __pyx_t_5 = __pyx_t_6; __pyx_L9_bool_binop_done:; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_6 = (__pyx_t_5 != 0); if (__pyx_t_6) { /* "aiohttp/_http_parser.pyx":441 * enc = enc.lower() * if enc in ('gzip', 'deflate', 'br'): * encoding = enc # <<<<<<<<<<<<<< * * if self._cparser.type == cparser.HTTP_REQUEST: */ __Pyx_INCREF(__pyx_v_enc); __Pyx_DECREF_SET(__pyx_v_encoding, __pyx_v_enc); /* "aiohttp/_http_parser.pyx":440 * self._content_encoding = None * enc = enc.lower() * if enc in ('gzip', 'deflate', 'br'): # <<<<<<<<<<<<<< * encoding = enc * */ } /* "aiohttp/_http_parser.pyx":437 * encoding = None * enc = self._content_encoding * if enc is not None: # <<<<<<<<<<<<<< * self._content_encoding = None * enc = enc.lower() */ } /* "aiohttp/_http_parser.pyx":443 * encoding = enc * * if self._cparser.type == cparser.HTTP_REQUEST: # <<<<<<<<<<<<<< * msg = _new_request_message( * method, self._path, */ __pyx_t_6 = ((__pyx_v_self->_cparser->type == HTTP_REQUEST) != 0); if (__pyx_t_6) { /* "aiohttp/_http_parser.pyx":445 * if self._cparser.type == cparser.HTTP_REQUEST: * msg = _new_request_message( * method, self._path, # <<<<<<<<<<<<<< * self.http_version(), headers, raw_headers, * should_close, encoding, upgrade, chunked, self._url) */ __pyx_t_1 = __pyx_v_self->_path; __Pyx_INCREF(__pyx_t_1); /* "aiohttp/_http_parser.pyx":446 * msg = _new_request_message( * method, self._path, * self.http_version(), headers, raw_headers, # <<<<<<<<<<<<<< * should_close, encoding, upgrade, chunked, self._url) * else: */ __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(__pyx_v_self); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 446, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); /* "aiohttp/_http_parser.pyx":447 * method, self._path, * self.http_version(), headers, raw_headers, * should_close, encoding, upgrade, chunked, self._url) # <<<<<<<<<<<<<< * else: * msg = _new_response_message( */ __pyx_t_4 = __pyx_v_self->_url; __Pyx_INCREF(__pyx_t_4); /* "aiohttp/_http_parser.pyx":444 * * if self._cparser.type == cparser.HTTP_REQUEST: * msg = _new_request_message( # <<<<<<<<<<<<<< * method, self._path, * self.http_version(), headers, raw_headers, */ __pyx_t_7 = __pyx_f_7aiohttp_12_http_parser__new_request_message(__pyx_v_method, ((PyObject*)__pyx_t_1), __pyx_t_3, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_encoding, __pyx_v_upgrade, __pyx_v_chunked, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 444, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_msg = __pyx_t_7; __pyx_t_7 = 0; /* "aiohttp/_http_parser.pyx":443 * encoding = enc * * if self._cparser.type == cparser.HTTP_REQUEST: # <<<<<<<<<<<<<< * msg = _new_request_message( * method, self._path, */ goto __pyx_L12; } /* "aiohttp/_http_parser.pyx":449 * should_close, encoding, upgrade, chunked, self._url) * else: * msg = _new_response_message( # <<<<<<<<<<<<<< * self.http_version(), self._cparser.status_code, self._reason, * headers, raw_headers, should_close, encoding, */ /*else*/ { /* "aiohttp/_http_parser.pyx":450 * else: * msg = _new_response_message( * self.http_version(), self._cparser.status_code, self._reason, # <<<<<<<<<<<<<< * headers, raw_headers, should_close, encoding, * upgrade, chunked) */ __pyx_t_7 = __pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(__pyx_v_self); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 450, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_4 = __pyx_v_self->_reason; __Pyx_INCREF(__pyx_t_4); /* "aiohttp/_http_parser.pyx":449 * should_close, encoding, upgrade, chunked, self._url) * else: * msg = _new_response_message( # <<<<<<<<<<<<<< * self.http_version(), self._cparser.status_code, self._reason, * headers, raw_headers, should_close, encoding, */ __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser__new_response_message(__pyx_t_7, __pyx_v_self->_cparser->status_code, ((PyObject*)__pyx_t_4), __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_encoding, __pyx_v_upgrade, __pyx_v_chunked); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 449, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_msg = __pyx_t_3; __pyx_t_3 = 0; } __pyx_L12:; /* "aiohttp/_http_parser.pyx":455 * * if ( * ULLONG_MAX > self._cparser.content_length > 0 or chunked or # <<<<<<<<<<<<<< * self._cparser.method == 5 or # CONNECT: 5 * (self._cparser.status_code >= 199 and */ __pyx_t_5 = (ULLONG_MAX > __pyx_v_self->_cparser->content_length); if (__pyx_t_5) { __pyx_t_5 = (__pyx_v_self->_cparser->content_length > 0); } __pyx_t_8 = (__pyx_t_5 != 0); if (!__pyx_t_8) { } else { __pyx_t_6 = __pyx_t_8; goto __pyx_L14_bool_binop_done; } __pyx_t_8 = (__pyx_v_chunked != 0); if (!__pyx_t_8) { } else { __pyx_t_6 = __pyx_t_8; goto __pyx_L14_bool_binop_done; } /* "aiohttp/_http_parser.pyx":456 * if ( * ULLONG_MAX > self._cparser.content_length > 0 or chunked or * self._cparser.method == 5 or # CONNECT: 5 # <<<<<<<<<<<<<< * (self._cparser.status_code >= 199 and * self._cparser.content_length == 0 and */ __pyx_t_8 = ((__pyx_v_self->_cparser->method == 5) != 0); if (!__pyx_t_8) { } else { __pyx_t_6 = __pyx_t_8; goto __pyx_L14_bool_binop_done; } /* "aiohttp/_http_parser.pyx":457 * ULLONG_MAX > self._cparser.content_length > 0 or chunked or * self._cparser.method == 5 or # CONNECT: 5 * (self._cparser.status_code >= 199 and # <<<<<<<<<<<<<< * self._cparser.content_length == 0 and * self._read_until_eof) */ __pyx_t_8 = ((__pyx_v_self->_cparser->status_code >= 0xC7) != 0); if (__pyx_t_8) { } else { __pyx_t_6 = __pyx_t_8; goto __pyx_L14_bool_binop_done; } /* "aiohttp/_http_parser.pyx":458 * self._cparser.method == 5 or # CONNECT: 5 * (self._cparser.status_code >= 199 and * self._cparser.content_length == 0 and # <<<<<<<<<<<<<< * self._read_until_eof) * ): */ __pyx_t_8 = ((__pyx_v_self->_cparser->content_length == 0) != 0); if (__pyx_t_8) { } else { __pyx_t_6 = __pyx_t_8; goto __pyx_L14_bool_binop_done; } /* "aiohttp/_http_parser.pyx":459 * (self._cparser.status_code >= 199 and * self._cparser.content_length == 0 and * self._read_until_eof) # <<<<<<<<<<<<<< * ): * payload = StreamReader( */ __pyx_t_8 = (__pyx_v_self->_read_until_eof != 0); __pyx_t_6 = __pyx_t_8; __pyx_L14_bool_binop_done:; /* "aiohttp/_http_parser.pyx":454 * upgrade, chunked) * * if ( # <<<<<<<<<<<<<< * ULLONG_MAX > self._cparser.content_length > 0 or chunked or * self._cparser.method == 5 or # CONNECT: 5 */ if (__pyx_t_6) { /* "aiohttp/_http_parser.pyx":461 * self._read_until_eof) * ): * payload = StreamReader( # <<<<<<<<<<<<<< * self._protocol, timer=self._timer, loop=self._loop, * limit=self._limit) */ __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 461, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_v_self->_protocol); __Pyx_GIVEREF(__pyx_v_self->_protocol); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->_protocol); /* "aiohttp/_http_parser.pyx":462 * ): * payload = StreamReader( * self._protocol, timer=self._timer, loop=self._loop, # <<<<<<<<<<<<<< * limit=self._limit) * else: */ __pyx_t_4 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 462, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_timer, __pyx_v_self->_timer) < 0) __PYX_ERR(0, 462, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_loop, __pyx_v_self->_loop) < 0) __PYX_ERR(0, 462, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":463 * payload = StreamReader( * self._protocol, timer=self._timer, loop=self._loop, * limit=self._limit) # <<<<<<<<<<<<<< * else: * payload = EMPTY_PAYLOAD */ __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_self->_limit); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 463, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_limit, __pyx_t_7) < 0) __PYX_ERR(0, 462, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; /* "aiohttp/_http_parser.pyx":461 * self._read_until_eof) * ): * payload = StreamReader( # <<<<<<<<<<<<<< * self._protocol, timer=self._timer, loop=self._loop, * limit=self._limit) */ __pyx_t_7 = __Pyx_PyObject_Call(__pyx_v_7aiohttp_12_http_parser_StreamReader, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 461, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_payload = __pyx_t_7; __pyx_t_7 = 0; /* "aiohttp/_http_parser.pyx":454 * upgrade, chunked) * * if ( # <<<<<<<<<<<<<< * ULLONG_MAX > self._cparser.content_length > 0 or chunked or * self._cparser.method == 5 or # CONNECT: 5 */ goto __pyx_L13; } /* "aiohttp/_http_parser.pyx":465 * limit=self._limit) * else: * payload = EMPTY_PAYLOAD # <<<<<<<<<<<<<< * * self._payload = payload */ /*else*/ { __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); __pyx_v_payload = __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD; } __pyx_L13:; /* "aiohttp/_http_parser.pyx":467 * payload = EMPTY_PAYLOAD * * self._payload = payload # <<<<<<<<<<<<<< * if encoding is not None and self._auto_decompress: * self._payload = DeflateBuffer(payload, encoding) */ __Pyx_INCREF(__pyx_v_payload); __Pyx_GIVEREF(__pyx_v_payload); __Pyx_GOTREF(__pyx_v_self->_payload); __Pyx_DECREF(__pyx_v_self->_payload); __pyx_v_self->_payload = __pyx_v_payload; /* "aiohttp/_http_parser.pyx":468 * * self._payload = payload * if encoding is not None and self._auto_decompress: # <<<<<<<<<<<<<< * self._payload = DeflateBuffer(payload, encoding) * */ __pyx_t_8 = (__pyx_v_encoding != Py_None); __pyx_t_5 = (__pyx_t_8 != 0); if (__pyx_t_5) { } else { __pyx_t_6 = __pyx_t_5; goto __pyx_L21_bool_binop_done; } __pyx_t_5 = (__pyx_v_self->_auto_decompress != 0); __pyx_t_6 = __pyx_t_5; __pyx_L21_bool_binop_done:; if (__pyx_t_6) { /* "aiohttp/_http_parser.pyx":469 * self._payload = payload * if encoding is not None and self._auto_decompress: * self._payload = DeflateBuffer(payload, encoding) # <<<<<<<<<<<<<< * * if not self._response_with_body: */ __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer); __pyx_t_4 = __pyx_v_7aiohttp_12_http_parser_DeflateBuffer; __pyx_t_3 = NULL; __pyx_t_9 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_9 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_payload, __pyx_v_encoding}; __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_9, 2+__pyx_t_9); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 469, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_7); } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_payload, __pyx_v_encoding}; __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_9, 2+__pyx_t_9); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 469, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_t_7); } else #endif { __pyx_t_1 = PyTuple_New(2+__pyx_t_9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 469, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (__pyx_t_3) { __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3); __pyx_t_3 = NULL; } __Pyx_INCREF(__pyx_v_payload); __Pyx_GIVEREF(__pyx_v_payload); PyTuple_SET_ITEM(__pyx_t_1, 0+__pyx_t_9, __pyx_v_payload); __Pyx_INCREF(__pyx_v_encoding); __Pyx_GIVEREF(__pyx_v_encoding); PyTuple_SET_ITEM(__pyx_t_1, 1+__pyx_t_9, __pyx_v_encoding); __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 469, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GIVEREF(__pyx_t_7); __Pyx_GOTREF(__pyx_v_self->_payload); __Pyx_DECREF(__pyx_v_self->_payload); __pyx_v_self->_payload = __pyx_t_7; __pyx_t_7 = 0; /* "aiohttp/_http_parser.pyx":468 * * self._payload = payload * if encoding is not None and self._auto_decompress: # <<<<<<<<<<<<<< * self._payload = DeflateBuffer(payload, encoding) * */ } /* "aiohttp/_http_parser.pyx":471 * self._payload = DeflateBuffer(payload, encoding) * * if not self._response_with_body: # <<<<<<<<<<<<<< * payload = EMPTY_PAYLOAD * */ __pyx_t_6 = ((!(__pyx_v_self->_response_with_body != 0)) != 0); if (__pyx_t_6) { /* "aiohttp/_http_parser.pyx":472 * * if not self._response_with_body: * payload = EMPTY_PAYLOAD # <<<<<<<<<<<<<< * * self._messages.append((msg, payload)) */ __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); __Pyx_DECREF_SET(__pyx_v_payload, __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); /* "aiohttp/_http_parser.pyx":471 * self._payload = DeflateBuffer(payload, encoding) * * if not self._response_with_body: # <<<<<<<<<<<<<< * payload = EMPTY_PAYLOAD * */ } /* "aiohttp/_http_parser.pyx":474 * payload = EMPTY_PAYLOAD * * self._messages.append((msg, payload)) # <<<<<<<<<<<<<< * * cdef _on_message_complete(self): */ if (unlikely(__pyx_v_self->_messages == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); __PYX_ERR(0, 474, __pyx_L1_error) } __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 474, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_INCREF(__pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_msg); __Pyx_INCREF(__pyx_v_payload); __Pyx_GIVEREF(__pyx_v_payload); PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_v_payload); __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_self->_messages, __pyx_t_7); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(0, 474, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; /* "aiohttp/_http_parser.pyx":417 * self._has_value = True * * cdef _on_headers_complete(self): # <<<<<<<<<<<<<< * self._process_header() * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_method); __Pyx_XDECREF(__pyx_v_raw_headers); __Pyx_XDECREF(__pyx_v_headers); __Pyx_XDECREF(__pyx_v_encoding); __Pyx_XDECREF(__pyx_v_enc); __Pyx_XDECREF(__pyx_v_msg); __Pyx_XDECREF(__pyx_v_payload); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":476 * self._messages.append((msg, payload)) * * cdef _on_message_complete(self): # <<<<<<<<<<<<<< * self._payload.feed_eof() * self._payload = None */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_message_complete", 0); /* "aiohttp/_http_parser.pyx":477 * * cdef _on_message_complete(self): * self._payload.feed_eof() # <<<<<<<<<<<<<< * self._payload = None * */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_feed_eof); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 477, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 477, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":478 * cdef _on_message_complete(self): * self._payload.feed_eof() * self._payload = None # <<<<<<<<<<<<<< * * cdef _on_chunk_header(self): */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_payload); __Pyx_DECREF(__pyx_v_self->_payload); __pyx_v_self->_payload = Py_None; /* "aiohttp/_http_parser.pyx":476 * self._messages.append((msg, payload)) * * cdef _on_message_complete(self): # <<<<<<<<<<<<<< * self._payload.feed_eof() * self._payload = None */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":480 * self._payload = None * * cdef _on_chunk_header(self): # <<<<<<<<<<<<<< * self._payload.begin_http_chunk_receiving() * */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_chunk_header", 0); /* "aiohttp/_http_parser.pyx":481 * * cdef _on_chunk_header(self): * self._payload.begin_http_chunk_receiving() # <<<<<<<<<<<<<< * * cdef _on_chunk_complete(self): */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_begin_http_chunk_receiving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 481, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 481, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":480 * self._payload = None * * cdef _on_chunk_header(self): # <<<<<<<<<<<<<< * self._payload.begin_http_chunk_receiving() * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":483 * self._payload.begin_http_chunk_receiving() * * cdef _on_chunk_complete(self): # <<<<<<<<<<<<<< * self._payload.end_http_chunk_receiving() * */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_chunk_complete", 0); /* "aiohttp/_http_parser.pyx":484 * * cdef _on_chunk_complete(self): * self._payload.end_http_chunk_receiving() # <<<<<<<<<<<<<< * * cdef object _on_status_complete(self): */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_end_http_chunk_receiving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 484, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 484, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":483 * self._payload.begin_http_chunk_receiving() * * cdef _on_chunk_complete(self): # <<<<<<<<<<<<<< * self._payload.end_http_chunk_receiving() * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":486 * self._payload.end_http_chunk_receiving() * * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< * pass * */ static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_on_status_complete", 0); /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":489 * pass * * cdef inline http_version(self): # <<<<<<<<<<<<<< * cdef cparser.llhttp_t* parser = self._cparser * */ static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { llhttp_t *__pyx_v_parser; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations llhttp_t *__pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_t_8; PyObject *__pyx_t_9 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("http_version", 0); /* "aiohttp/_http_parser.pyx":490 * * cdef inline http_version(self): * cdef cparser.llhttp_t* parser = self._cparser # <<<<<<<<<<<<<< * * if parser.http_major == 1: */ __pyx_t_1 = __pyx_v_self->_cparser; __pyx_v_parser = __pyx_t_1; /* "aiohttp/_http_parser.pyx":492 * cdef cparser.llhttp_t* parser = self._cparser * * if parser.http_major == 1: # <<<<<<<<<<<<<< * if parser.http_minor == 0: * return HttpVersion10 */ __pyx_t_2 = ((__pyx_v_parser->http_major == 1) != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":493 * * if parser.http_major == 1: * if parser.http_minor == 0: # <<<<<<<<<<<<<< * return HttpVersion10 * elif parser.http_minor == 1: */ switch (__pyx_v_parser->http_minor) { case 0: /* "aiohttp/_http_parser.pyx":494 * if parser.http_major == 1: * if parser.http_minor == 0: * return HttpVersion10 # <<<<<<<<<<<<<< * elif parser.http_minor == 1: * return HttpVersion11 */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion10); __pyx_r = __pyx_v_7aiohttp_12_http_parser_HttpVersion10; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":493 * * if parser.http_major == 1: * if parser.http_minor == 0: # <<<<<<<<<<<<<< * return HttpVersion10 * elif parser.http_minor == 1: */ break; case 1: /* "aiohttp/_http_parser.pyx":496 * return HttpVersion10 * elif parser.http_minor == 1: * return HttpVersion11 # <<<<<<<<<<<<<< * * return HttpVersion(parser.http_major, parser.http_minor) */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion11); __pyx_r = __pyx_v_7aiohttp_12_http_parser_HttpVersion11; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":495 * if parser.http_minor == 0: * return HttpVersion10 * elif parser.http_minor == 1: # <<<<<<<<<<<<<< * return HttpVersion11 * */ break; default: break; } /* "aiohttp/_http_parser.pyx":492 * cdef cparser.llhttp_t* parser = self._cparser * * if parser.http_major == 1: # <<<<<<<<<<<<<< * if parser.http_minor == 0: * return HttpVersion10 */ } /* "aiohttp/_http_parser.pyx":498 * return HttpVersion11 * * return HttpVersion(parser.http_major, parser.http_minor) # <<<<<<<<<<<<<< * * ### Public API ### */ __Pyx_XDECREF(__pyx_r); __pyx_t_4 = __Pyx_PyInt_From_uint8_t(__pyx_v_parser->http_major); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyInt_From_uint8_t(__pyx_v_parser->http_minor); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion); __pyx_t_6 = __pyx_v_7aiohttp_12_http_parser_HttpVersion; __pyx_t_7 = NULL; __pyx_t_8 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_6, function); __pyx_t_8 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_4, __pyx_t_5}; __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_4, __pyx_t_5}; __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } else #endif { __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); if (__pyx_t_7) { __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; } __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_t_5); __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":489 * pass * * cdef inline http_version(self): # <<<<<<<<<<<<<< * cdef cparser.llhttp_t* parser = self._cparser * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.http_version", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":502 * ### Public API ### * * def feed_eof(self): # <<<<<<<<<<<<<< * cdef bytes desc * */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("feed_eof (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_4feed_eof(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_4feed_eof(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_v_desc = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("feed_eof", 0); /* "aiohttp/_http_parser.pyx":505 * cdef bytes desc * * if self._payload is not None: # <<<<<<<<<<<<<< * if self._cparser.flags & cparser.F_CHUNKED: * raise TransferEncodingError( */ __pyx_t_1 = (__pyx_v_self->_payload != Py_None); __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":506 * * if self._payload is not None: * if self._cparser.flags & cparser.F_CHUNKED: # <<<<<<<<<<<<<< * raise TransferEncodingError( * "Not enough data for satisfy transfer length header.") */ __pyx_t_2 = ((__pyx_v_self->_cparser->flags & F_CHUNKED) != 0); if (unlikely(__pyx_t_2)) { /* "aiohttp/_http_parser.pyx":507 * if self._payload is not None: * if self._cparser.flags & cparser.F_CHUNKED: * raise TransferEncodingError( # <<<<<<<<<<<<<< * "Not enough data for satisfy transfer length header.") * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: */ __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_TransferEncodingError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 507, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_Not_enough_data_for_satisfy_tran) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_Not_enough_data_for_satisfy_tran); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 507, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(0, 507, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":506 * * if self._payload is not None: * if self._cparser.flags & cparser.F_CHUNKED: # <<<<<<<<<<<<<< * raise TransferEncodingError( * "Not enough data for satisfy transfer length header.") */ } /* "aiohttp/_http_parser.pyx":509 * raise TransferEncodingError( * "Not enough data for satisfy transfer length header.") * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: # <<<<<<<<<<<<<< * raise ContentLengthError( * "Not enough data for satisfy content length header.") */ __pyx_t_2 = ((__pyx_v_self->_cparser->flags & F_CONTENT_LENGTH) != 0); if (unlikely(__pyx_t_2)) { /* "aiohttp/_http_parser.pyx":510 * "Not enough data for satisfy transfer length header.") * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: * raise ContentLengthError( # <<<<<<<<<<<<<< * "Not enough data for satisfy content length header.") * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: */ __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_ContentLengthError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 510, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_Not_enough_data_for_satisfy_cont) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_Not_enough_data_for_satisfy_cont); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 510, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(0, 510, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":509 * raise TransferEncodingError( * "Not enough data for satisfy transfer length header.") * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: # <<<<<<<<<<<<<< * raise ContentLengthError( * "Not enough data for satisfy content length header.") */ } /* "aiohttp/_http_parser.pyx":512 * raise ContentLengthError( * "Not enough data for satisfy content length header.") * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: # <<<<<<<<<<<<<< * desc = cparser.llhttp_get_error_reason(self._cparser) * raise PayloadEncodingError(desc.decode('latin-1')) */ __pyx_t_2 = ((llhttp_get_errno(__pyx_v_self->_cparser) != HPE_OK) != 0); if (unlikely(__pyx_t_2)) { /* "aiohttp/_http_parser.pyx":513 * "Not enough data for satisfy content length header.") * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: * desc = cparser.llhttp_get_error_reason(self._cparser) # <<<<<<<<<<<<<< * raise PayloadEncodingError(desc.decode('latin-1')) * else: */ __pyx_t_3 = __Pyx_PyBytes_FromString(llhttp_get_error_reason(__pyx_v_self->_cparser)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 513, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_desc = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":514 * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: * desc = cparser.llhttp_get_error_reason(self._cparser) * raise PayloadEncodingError(desc.decode('latin-1')) # <<<<<<<<<<<<<< * else: * self._payload.feed_eof() */ __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_PayloadEncodingError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 514, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_decode_bytes(__pyx_v_desc, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeLatin1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 514, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_3 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 514, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(0, 514, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":512 * raise ContentLengthError( * "Not enough data for satisfy content length header.") * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: # <<<<<<<<<<<<<< * desc = cparser.llhttp_get_error_reason(self._cparser) * raise PayloadEncodingError(desc.decode('latin-1')) */ } /* "aiohttp/_http_parser.pyx":516 * raise PayloadEncodingError(desc.decode('latin-1')) * else: * self._payload.feed_eof() # <<<<<<<<<<<<<< * elif self._started: * self._on_headers_complete() */ /*else*/ { __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_feed_eof); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 516, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5) : __Pyx_PyObject_CallNoArg(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 516, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } /* "aiohttp/_http_parser.pyx":505 * cdef bytes desc * * if self._payload is not None: # <<<<<<<<<<<<<< * if self._cparser.flags & cparser.F_CHUNKED: * raise TransferEncodingError( */ goto __pyx_L3; } /* "aiohttp/_http_parser.pyx":517 * else: * self._payload.feed_eof() * elif self._started: # <<<<<<<<<<<<<< * self._on_headers_complete() * if self._messages: */ __pyx_t_2 = (__pyx_v_self->_started != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":518 * self._payload.feed_eof() * elif self._started: * self._on_headers_complete() # <<<<<<<<<<<<<< * if self._messages: * return self._messages[-1][0] */ __pyx_t_3 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_on_headers_complete(__pyx_v_self); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 518, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":519 * elif self._started: * self._on_headers_complete() * if self._messages: # <<<<<<<<<<<<<< * return self._messages[-1][0] * */ __pyx_t_2 = (__pyx_v_self->_messages != Py_None)&&(PyList_GET_SIZE(__pyx_v_self->_messages) != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":520 * self._on_headers_complete() * if self._messages: * return self._messages[-1][0] # <<<<<<<<<<<<<< * * def feed_data(self, data): */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_self->_messages == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 520, __pyx_L1_error) } __pyx_t_3 = __Pyx_GetItemInt_List(__pyx_v_self->_messages, -1L, long, 1, __Pyx_PyInt_From_long, 1, 1, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 520, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 520, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":519 * elif self._started: * self._on_headers_complete() * if self._messages: # <<<<<<<<<<<<<< * return self._messages[-1][0] * */ } /* "aiohttp/_http_parser.pyx":517 * else: * self._payload.feed_eof() * elif self._started: # <<<<<<<<<<<<<< * self._on_headers_complete() * if self._messages: */ } __pyx_L3:; /* "aiohttp/_http_parser.pyx":502 * ### Public API ### * * def feed_eof(self): # <<<<<<<<<<<<<< * cdef bytes desc * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.feed_eof", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_desc); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":522 * return self._messages[-1][0] * * def feed_data(self, data): # <<<<<<<<<<<<<< * cdef: * size_t data_len */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("feed_data (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_6feed_data(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), ((PyObject *)__pyx_v_data)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_6feed_data(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, PyObject *__pyx_v_data) { size_t __pyx_v_data_len; size_t __pyx_v_nb; llhttp_errno_t __pyx_v_errno; PyObject *__pyx_v_ex = NULL; PyObject *__pyx_v_messages = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("feed_data", 0); /* "aiohttp/_http_parser.pyx":528 * cdef cparser.llhttp_errno_t errno * * PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) # <<<<<<<<<<<<<< * data_len = self.py_buf.len * */ __pyx_t_1 = PyObject_GetBuffer(__pyx_v_data, (&__pyx_v_self->py_buf), PyBUF_SIMPLE); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 528, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":529 * * PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) * data_len = self.py_buf.len # <<<<<<<<<<<<<< * * errno = cparser.llhttp_execute( */ __pyx_v_data_len = ((size_t)__pyx_v_self->py_buf.len); /* "aiohttp/_http_parser.pyx":531 * data_len = self.py_buf.len * * errno = cparser.llhttp_execute( # <<<<<<<<<<<<<< * self._cparser, * self.py_buf.buf, */ __pyx_v_errno = llhttp_execute(__pyx_v_self->_cparser, ((char *)__pyx_v_self->py_buf.buf), __pyx_v_data_len); /* "aiohttp/_http_parser.pyx":536 * data_len) * * if errno is cparser.HPE_PAUSED_UPGRADE: # <<<<<<<<<<<<<< * cparser.llhttp_resume_after_upgrade(self._cparser) * */ __pyx_t_2 = ((__pyx_v_errno == HPE_PAUSED_UPGRADE) != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":537 * * if errno is cparser.HPE_PAUSED_UPGRADE: * cparser.llhttp_resume_after_upgrade(self._cparser) # <<<<<<<<<<<<<< * * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf */ llhttp_resume_after_upgrade(__pyx_v_self->_cparser); /* "aiohttp/_http_parser.pyx":539 * cparser.llhttp_resume_after_upgrade(self._cparser) * * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf # <<<<<<<<<<<<<< * * PyBuffer_Release(&self.py_buf) */ __pyx_v_nb = (llhttp_get_error_pos(__pyx_v_self->_cparser) - ((char *)__pyx_v_self->py_buf.buf)); /* "aiohttp/_http_parser.pyx":536 * data_len) * * if errno is cparser.HPE_PAUSED_UPGRADE: # <<<<<<<<<<<<<< * cparser.llhttp_resume_after_upgrade(self._cparser) * */ } /* "aiohttp/_http_parser.pyx":541 * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf * * PyBuffer_Release(&self.py_buf) # <<<<<<<<<<<<<< * * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): */ PyBuffer_Release((&__pyx_v_self->py_buf)); /* "aiohttp/_http_parser.pyx":543 * PyBuffer_Release(&self.py_buf) * * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): # <<<<<<<<<<<<<< * if self._payload_error == 0: * if self._last_error is not None: */ switch (__pyx_v_errno) { case HPE_OK: case HPE_PAUSED_UPGRADE: __pyx_t_2 = 0; break; default: __pyx_t_2 = 1; break; } __pyx_t_3 = (__pyx_t_2 != 0); if (__pyx_t_3) { /* "aiohttp/_http_parser.pyx":544 * * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): * if self._payload_error == 0: # <<<<<<<<<<<<<< * if self._last_error is not None: * ex = self._last_error */ __pyx_t_3 = ((__pyx_v_self->_payload_error == 0) != 0); if (__pyx_t_3) { /* "aiohttp/_http_parser.pyx":545 * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): * if self._payload_error == 0: * if self._last_error is not None: # <<<<<<<<<<<<<< * ex = self._last_error * self._last_error = None */ __pyx_t_3 = (__pyx_v_self->_last_error != Py_None); __pyx_t_2 = (__pyx_t_3 != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":546 * if self._payload_error == 0: * if self._last_error is not None: * ex = self._last_error # <<<<<<<<<<<<<< * self._last_error = None * else: */ __pyx_t_4 = __pyx_v_self->_last_error; __Pyx_INCREF(__pyx_t_4); __pyx_v_ex = __pyx_t_4; __pyx_t_4 = 0; /* "aiohttp/_http_parser.pyx":547 * if self._last_error is not None: * ex = self._last_error * self._last_error = None # <<<<<<<<<<<<<< * else: * ex = parser_error_from_errno(self._cparser) */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_last_error); __Pyx_DECREF(__pyx_v_self->_last_error); __pyx_v_self->_last_error = Py_None; /* "aiohttp/_http_parser.pyx":545 * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): * if self._payload_error == 0: * if self._last_error is not None: # <<<<<<<<<<<<<< * ex = self._last_error * self._last_error = None */ goto __pyx_L6; } /* "aiohttp/_http_parser.pyx":549 * self._last_error = None * else: * ex = parser_error_from_errno(self._cparser) # <<<<<<<<<<<<<< * self._payload = None * raise ex */ /*else*/ { __pyx_t_4 = __pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(__pyx_v_self->_cparser); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 549, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_v_ex = __pyx_t_4; __pyx_t_4 = 0; } __pyx_L6:; /* "aiohttp/_http_parser.pyx":550 * else: * ex = parser_error_from_errno(self._cparser) * self._payload = None # <<<<<<<<<<<<<< * raise ex * */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_self->_payload); __Pyx_DECREF(__pyx_v_self->_payload); __pyx_v_self->_payload = Py_None; /* "aiohttp/_http_parser.pyx":551 * ex = parser_error_from_errno(self._cparser) * self._payload = None * raise ex # <<<<<<<<<<<<<< * * if self._messages: */ __Pyx_Raise(__pyx_v_ex, 0, 0, 0); __PYX_ERR(0, 551, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":544 * * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): * if self._payload_error == 0: # <<<<<<<<<<<<<< * if self._last_error is not None: * ex = self._last_error */ } /* "aiohttp/_http_parser.pyx":543 * PyBuffer_Release(&self.py_buf) * * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): # <<<<<<<<<<<<<< * if self._payload_error == 0: * if self._last_error is not None: */ } /* "aiohttp/_http_parser.pyx":553 * raise ex * * if self._messages: # <<<<<<<<<<<<<< * messages = self._messages * self._messages = [] */ __pyx_t_2 = (__pyx_v_self->_messages != Py_None)&&(PyList_GET_SIZE(__pyx_v_self->_messages) != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":554 * * if self._messages: * messages = self._messages # <<<<<<<<<<<<<< * self._messages = [] * else: */ __pyx_t_4 = __pyx_v_self->_messages; __Pyx_INCREF(__pyx_t_4); __pyx_v_messages = __pyx_t_4; __pyx_t_4 = 0; /* "aiohttp/_http_parser.pyx":555 * if self._messages: * messages = self._messages * self._messages = [] # <<<<<<<<<<<<<< * else: * messages = () */ __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 555, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __Pyx_GOTREF(__pyx_v_self->_messages); __Pyx_DECREF(__pyx_v_self->_messages); __pyx_v_self->_messages = ((PyObject*)__pyx_t_4); __pyx_t_4 = 0; /* "aiohttp/_http_parser.pyx":553 * raise ex * * if self._messages: # <<<<<<<<<<<<<< * messages = self._messages * self._messages = [] */ goto __pyx_L7; } /* "aiohttp/_http_parser.pyx":557 * self._messages = [] * else: * messages = () # <<<<<<<<<<<<<< * * if self._upgraded: */ /*else*/ { __Pyx_INCREF(__pyx_empty_tuple); __pyx_v_messages = __pyx_empty_tuple; } __pyx_L7:; /* "aiohttp/_http_parser.pyx":559 * messages = () * * if self._upgraded: # <<<<<<<<<<<<<< * return messages, True, data[nb:] * else: */ __pyx_t_2 = (__pyx_v_self->_upgraded != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":560 * * if self._upgraded: * return messages, True, data[nb:] # <<<<<<<<<<<<<< * else: * return messages, False, b'' */ __Pyx_XDECREF(__pyx_r); __pyx_t_4 = __Pyx_PyObject_GetSlice(__pyx_v_data, __pyx_v_nb, 0, NULL, NULL, NULL, 1, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 560, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 560, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v_messages); __Pyx_GIVEREF(__pyx_v_messages); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_messages); __Pyx_INCREF(Py_True); __Pyx_GIVEREF(Py_True); PyTuple_SET_ITEM(__pyx_t_5, 1, Py_True); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_4); __pyx_t_4 = 0; __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":559 * messages = () * * if self._upgraded: # <<<<<<<<<<<<<< * return messages, True, data[nb:] * else: */ } /* "aiohttp/_http_parser.pyx":562 * return messages, True, data[nb:] * else: * return messages, False, b'' # <<<<<<<<<<<<<< * * def set_upgraded(self, val): */ /*else*/ { __Pyx_XDECREF(__pyx_r); __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 562, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v_messages); __Pyx_GIVEREF(__pyx_v_messages); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_messages); __Pyx_INCREF(Py_False); __Pyx_GIVEREF(Py_False); PyTuple_SET_ITEM(__pyx_t_5, 1, Py_False); __Pyx_INCREF(__pyx_kp_b__4); __Pyx_GIVEREF(__pyx_kp_b__4); PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_b__4); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":522 * return self._messages[-1][0] * * def feed_data(self, data): # <<<<<<<<<<<<<< * cdef: * size_t data_len */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.feed_data", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_ex); __Pyx_XDECREF(__pyx_v_messages); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":564 * return messages, False, b'' * * def set_upgraded(self, val): # <<<<<<<<<<<<<< * self._upgraded = val * */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded(PyObject *__pyx_v_self, PyObject *__pyx_v_val) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_upgraded (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_8set_upgraded(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), ((PyObject *)__pyx_v_val)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_8set_upgraded(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, PyObject *__pyx_v_val) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_upgraded", 0); /* "aiohttp/_http_parser.pyx":565 * * def set_upgraded(self, val): * self._upgraded = val # <<<<<<<<<<<<<< * * */ __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_val); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 565, __pyx_L1_error) __pyx_v_self->_upgraded = __pyx_t_1; /* "aiohttp/_http_parser.pyx":564 * return messages, False, b'' * * def set_upgraded(self, val): # <<<<<<<<<<<<<< * self._upgraded = val * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.set_upgraded", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_10__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_10__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":2 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(1, 2, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_12__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_12__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(1, 4, __pyx_L1_error) /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":570 * cdef class HttpRequestParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* Python wrapper */ static int __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_protocol = 0; PyObject *__pyx_v_loop = 0; int __pyx_v_limit; PyObject *__pyx_v_timer = 0; size_t __pyx_v_max_line_size; size_t __pyx_v_max_headers; size_t __pyx_v_max_field_size; PyObject *__pyx_v_payload_exception = 0; int __pyx_v_response_with_body; int __pyx_v_read_until_eof; int __pyx_v_auto_decompress; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_protocol,&__pyx_n_s_loop,&__pyx_n_s_limit,&__pyx_n_s_timer,&__pyx_n_s_max_line_size,&__pyx_n_s_max_headers,&__pyx_n_s_max_field_size,&__pyx_n_s_payload_exception,&__pyx_n_s_response_with_body,&__pyx_n_s_read_until_eof,&__pyx_n_s_auto_decompress,0}; PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0}; /* "aiohttp/_http_parser.pyx":571 * * def __init__( * self, protocol, loop, int limit, timer=None, # <<<<<<<<<<<<<< * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, */ values[3] = ((PyObject *)Py_None); /* "aiohttp/_http_parser.pyx":573 * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True, */ values[7] = ((PyObject *)Py_None); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); CYTHON_FALLTHROUGH; case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_protocol)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loop)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 1); __PYX_ERR(0, 570, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_limit)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 2); __PYX_ERR(0, 570, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_timer); if (value) { values[3] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 4: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_line_size); if (value) { values[4] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 5: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_headers); if (value) { values[5] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 6: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_field_size); if (value) { values[6] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 7: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_payload_exception); if (value) { values[7] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 8: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_response_with_body); if (value) { values[8] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 9: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_read_until_eof); if (value) { values[9] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 10: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_auto_decompress); if (value) { values[10] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 570, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); CYTHON_FALLTHROUGH; case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[0] = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_protocol = values[0]; __pyx_v_loop = values[1]; __pyx_v_limit = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_limit == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 571, __pyx_L3_error) __pyx_v_timer = values[3]; if (values[4]) { __pyx_v_max_line_size = __Pyx_PyInt_As_size_t(values[4]); if (unlikely((__pyx_v_max_line_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 572, __pyx_L3_error) } else { __pyx_v_max_line_size = ((size_t)0x1FFE); } if (values[5]) { __pyx_v_max_headers = __Pyx_PyInt_As_size_t(values[5]); if (unlikely((__pyx_v_max_headers == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 572, __pyx_L3_error) } else { __pyx_v_max_headers = ((size_t)0x8000); } if (values[6]) { __pyx_v_max_field_size = __Pyx_PyInt_As_size_t(values[6]); if (unlikely((__pyx_v_max_field_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 573, __pyx_L3_error) } else { __pyx_v_max_field_size = ((size_t)0x1FFE); } __pyx_v_payload_exception = values[7]; if (values[8]) { __pyx_v_response_with_body = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_response_with_body == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 574, __pyx_L3_error) } else { /* "aiohttp/_http_parser.pyx":574 * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< * bint auto_decompress=True, * ): */ __pyx_v_response_with_body = ((int)1); } if (values[9]) { __pyx_v_read_until_eof = __Pyx_PyObject_IsTrue(values[9]); if (unlikely((__pyx_v_read_until_eof == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 574, __pyx_L3_error) } else { __pyx_v_read_until_eof = ((int)0); } if (values[10]) { __pyx_v_auto_decompress = __Pyx_PyObject_IsTrue(values[10]); if (unlikely((__pyx_v_auto_decompress == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 575, __pyx_L3_error) } else { /* "aiohttp/_http_parser.pyx":575 * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True, # <<<<<<<<<<<<<< * ): * self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, */ __pyx_v_auto_decompress = ((int)1); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 570, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser___init__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self), __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, __pyx_v_timer, __pyx_v_max_line_size, __pyx_v_max_headers, __pyx_v_max_field_size, __pyx_v_payload_exception, __pyx_v_response_with_body, __pyx_v_read_until_eof, __pyx_v_auto_decompress); /* "aiohttp/_http_parser.pyx":570 * cdef class HttpRequestParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser___init__(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, PyObject *__pyx_v_timer, size_t __pyx_v_max_line_size, size_t __pyx_v_max_headers, size_t __pyx_v_max_field_size, PyObject *__pyx_v_payload_exception, int __pyx_v_response_with_body, int __pyx_v_read_until_eof, int __pyx_v_auto_decompress) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init __pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 0); /* "aiohttp/_http_parser.pyx":577 * bint auto_decompress=True, * ): * self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, # <<<<<<<<<<<<<< * max_line_size, max_headers, max_field_size, * payload_exception, response_with_body, read_until_eof, */ __pyx_t_2.__pyx_n = 8; __pyx_t_2.timer = __pyx_v_timer; __pyx_t_2.max_line_size = __pyx_v_max_line_size; __pyx_t_2.max_headers = __pyx_v_max_headers; __pyx_t_2.max_field_size = __pyx_v_max_field_size; __pyx_t_2.payload_exception = __pyx_v_payload_exception; __pyx_t_2.response_with_body = __pyx_v_response_with_body; __pyx_t_2.read_until_eof = __pyx_v_read_until_eof; __pyx_t_2.auto_decompress = __pyx_v_auto_decompress; __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._init(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), HTTP_REQUEST, __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 577, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":570 * cdef class HttpRequestParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":582 * auto_decompress) * * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< * cdef int idx1, idx2 * if not self._buf: */ static PyObject *__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self) { int __pyx_v_idx1; int __pyx_v_idx2; CYTHON_UNUSED Py_ssize_t __pyx_v_idx3; PyObject *__pyx_v_query = NULL; PyObject *__pyx_v_path = NULL; PyObject *__pyx_v_fragment = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; Py_ssize_t __pyx_t_4; Py_ssize_t __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_t_8; int __pyx_t_9; char const *__pyx_t_10; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; PyObject *__pyx_t_14 = NULL; PyObject *__pyx_t_15 = NULL; PyObject *__pyx_t_16 = NULL; int __pyx_t_17; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_status_complete", 0); /* "aiohttp/_http_parser.pyx":584 * cdef object _on_status_complete(self): * cdef int idx1, idx2 * if not self._buf: # <<<<<<<<<<<<<< * return * self._path = self._buf.decode('utf-8', 'surrogateescape') */ __pyx_t_1 = (__pyx_v_self->__pyx_base._buf != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->__pyx_base._buf) != 0); __pyx_t_2 = ((!__pyx_t_1) != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":585 * cdef int idx1, idx2 * if not self._buf: * return # <<<<<<<<<<<<<< * self._path = self._buf.decode('utf-8', 'surrogateescape') * try: */ __Pyx_XDECREF(__pyx_r); __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; /* "aiohttp/_http_parser.pyx":584 * cdef object _on_status_complete(self): * cdef int idx1, idx2 * if not self._buf: # <<<<<<<<<<<<<< * return * self._path = self._buf.decode('utf-8', 'surrogateescape') */ } /* "aiohttp/_http_parser.pyx":586 * if not self._buf: * return * self._path = self._buf.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< * try: * idx3 = len(self._path) */ if (unlikely(__pyx_v_self->__pyx_base._buf == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); __PYX_ERR(0, 586, __pyx_L1_error) } __pyx_t_3 = __Pyx_decode_bytearray(__pyx_v_self->__pyx_base._buf, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 586, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __Pyx_GOTREF(__pyx_v_self->__pyx_base._path); __Pyx_DECREF(__pyx_v_self->__pyx_base._path); __pyx_v_self->__pyx_base._path = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":587 * return * self._path = self._buf.decode('utf-8', 'surrogateescape') * try: # <<<<<<<<<<<<<< * idx3 = len(self._path) * idx1 = self._path.find("?") */ /*try:*/ { /* "aiohttp/_http_parser.pyx":588 * self._path = self._buf.decode('utf-8', 'surrogateescape') * try: * idx3 = len(self._path) # <<<<<<<<<<<<<< * idx1 = self._path.find("?") * if idx1 == -1: */ __pyx_t_3 = __pyx_v_self->__pyx_base._path; __Pyx_INCREF(__pyx_t_3); if (unlikely(__pyx_t_3 == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(0, 588, __pyx_L5_error) } __pyx_t_4 = __Pyx_PyUnicode_GET_LENGTH(__pyx_t_3); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(0, 588, __pyx_L5_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_idx3 = __pyx_t_4; /* "aiohttp/_http_parser.pyx":589 * try: * idx3 = len(self._path) * idx1 = self._path.find("?") # <<<<<<<<<<<<<< * if idx1 == -1: * query = "" */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); __PYX_ERR(0, 589, __pyx_L5_error) } __pyx_t_4 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__7, 0, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-2))) __PYX_ERR(0, 589, __pyx_L5_error) __pyx_v_idx1 = __pyx_t_4; /* "aiohttp/_http_parser.pyx":590 * idx3 = len(self._path) * idx1 = self._path.find("?") * if idx1 == -1: # <<<<<<<<<<<<<< * query = "" * idx2 = self._path.find("#") */ __pyx_t_2 = ((__pyx_v_idx1 == -1L) != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":591 * idx1 = self._path.find("?") * if idx1 == -1: * query = "" # <<<<<<<<<<<<<< * idx2 = self._path.find("#") * if idx2 == -1: */ __Pyx_INCREF(__pyx_kp_u__4); __pyx_v_query = __pyx_kp_u__4; /* "aiohttp/_http_parser.pyx":592 * if idx1 == -1: * query = "" * idx2 = self._path.find("#") # <<<<<<<<<<<<<< * if idx2 == -1: * path = self._path */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); __PYX_ERR(0, 592, __pyx_L5_error) } __pyx_t_4 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__8, 0, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-2))) __PYX_ERR(0, 592, __pyx_L5_error) __pyx_v_idx2 = __pyx_t_4; /* "aiohttp/_http_parser.pyx":593 * query = "" * idx2 = self._path.find("#") * if idx2 == -1: # <<<<<<<<<<<<<< * path = self._path * fragment = "" */ __pyx_t_2 = ((__pyx_v_idx2 == -1L) != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":594 * idx2 = self._path.find("#") * if idx2 == -1: * path = self._path # <<<<<<<<<<<<<< * fragment = "" * else: */ __pyx_t_3 = __pyx_v_self->__pyx_base._path; __Pyx_INCREF(__pyx_t_3); __pyx_v_path = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":595 * if idx2 == -1: * path = self._path * fragment = "" # <<<<<<<<<<<<<< * else: * path = self._path[0: idx2] */ __Pyx_INCREF(__pyx_kp_u__4); __pyx_v_fragment = __pyx_kp_u__4; /* "aiohttp/_http_parser.pyx":593 * query = "" * idx2 = self._path.find("#") * if idx2 == -1: # <<<<<<<<<<<<<< * path = self._path * fragment = "" */ goto __pyx_L8; } /* "aiohttp/_http_parser.pyx":597 * fragment = "" * else: * path = self._path[0: idx2] # <<<<<<<<<<<<<< * fragment = self._path[idx2+1:] * */ /*else*/ { if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 597, __pyx_L5_error) } __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, 0, __pyx_v_idx2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 597, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_path = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":598 * else: * path = self._path[0: idx2] * fragment = self._path[idx2+1:] # <<<<<<<<<<<<<< * * else: */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 598, __pyx_L5_error) } __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, (__pyx_v_idx2 + 1), PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 598, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_fragment = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; } __pyx_L8:; /* "aiohttp/_http_parser.pyx":590 * idx3 = len(self._path) * idx1 = self._path.find("?") * if idx1 == -1: # <<<<<<<<<<<<<< * query = "" * idx2 = self._path.find("#") */ goto __pyx_L7; } /* "aiohttp/_http_parser.pyx":601 * * else: * path = self._path[0:idx1] # <<<<<<<<<<<<<< * idx1 += 1 * idx2 = self._path.find("#", idx1+1) */ /*else*/ { if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 601, __pyx_L5_error) } __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, 0, __pyx_v_idx1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 601, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_path = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":602 * else: * path = self._path[0:idx1] * idx1 += 1 # <<<<<<<<<<<<<< * idx2 = self._path.find("#", idx1+1) * if idx2 == -1: */ __pyx_v_idx1 = (__pyx_v_idx1 + 1); /* "aiohttp/_http_parser.pyx":603 * path = self._path[0:idx1] * idx1 += 1 * idx2 = self._path.find("#", idx1+1) # <<<<<<<<<<<<<< * if idx2 == -1: * query = self._path[idx1:] */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); __PYX_ERR(0, 603, __pyx_L5_error) } __pyx_t_3 = __Pyx_PyInt_From_long((__pyx_v_idx1 + 1)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 603, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 603, __pyx_L5_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_5 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__8, __pyx_t_4, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-2))) __PYX_ERR(0, 603, __pyx_L5_error) __pyx_v_idx2 = __pyx_t_5; /* "aiohttp/_http_parser.pyx":604 * idx1 += 1 * idx2 = self._path.find("#", idx1+1) * if idx2 == -1: # <<<<<<<<<<<<<< * query = self._path[idx1:] * fragment = "" */ __pyx_t_2 = ((__pyx_v_idx2 == -1L) != 0); if (__pyx_t_2) { /* "aiohttp/_http_parser.pyx":605 * idx2 = self._path.find("#", idx1+1) * if idx2 == -1: * query = self._path[idx1:] # <<<<<<<<<<<<<< * fragment = "" * else: */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 605, __pyx_L5_error) } __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, __pyx_v_idx1, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 605, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_query = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":606 * if idx2 == -1: * query = self._path[idx1:] * fragment = "" # <<<<<<<<<<<<<< * else: * query = self._path[idx1: idx2] */ __Pyx_INCREF(__pyx_kp_u__4); __pyx_v_fragment = __pyx_kp_u__4; /* "aiohttp/_http_parser.pyx":604 * idx1 += 1 * idx2 = self._path.find("#", idx1+1) * if idx2 == -1: # <<<<<<<<<<<<<< * query = self._path[idx1:] * fragment = "" */ goto __pyx_L9; } /* "aiohttp/_http_parser.pyx":608 * fragment = "" * else: * query = self._path[idx1: idx2] # <<<<<<<<<<<<<< * fragment = self._path[idx2+1:] * */ /*else*/ { if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 608, __pyx_L5_error) } __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, __pyx_v_idx1, __pyx_v_idx2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 608, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_query = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "aiohttp/_http_parser.pyx":609 * else: * query = self._path[idx1: idx2] * fragment = self._path[idx2+1:] # <<<<<<<<<<<<<< * * self._url = URL.build( */ if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(0, 609, __pyx_L5_error) } __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, (__pyx_v_idx2 + 1), PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 609, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_fragment = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; } __pyx_L9:; } __pyx_L7:; /* "aiohttp/_http_parser.pyx":611 * fragment = self._path[idx2+1:] * * self._url = URL.build( # <<<<<<<<<<<<<< * path=path, * query_string=query, */ __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_n_s_build); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 611, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_3); /* "aiohttp/_http_parser.pyx":612 * * self._url = URL.build( * path=path, # <<<<<<<<<<<<<< * query_string=query, * fragment=fragment, */ __pyx_t_6 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 612, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_6); if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_path, __pyx_v_path) < 0) __PYX_ERR(0, 612, __pyx_L5_error) /* "aiohttp/_http_parser.pyx":613 * self._url = URL.build( * path=path, * query_string=query, # <<<<<<<<<<<<<< * fragment=fragment, * encoded=True, */ if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_query_string, __pyx_v_query) < 0) __PYX_ERR(0, 612, __pyx_L5_error) /* "aiohttp/_http_parser.pyx":614 * path=path, * query_string=query, * fragment=fragment, # <<<<<<<<<<<<<< * encoded=True, * ) */ if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_fragment, __pyx_v_fragment) < 0) __PYX_ERR(0, 612, __pyx_L5_error) /* "aiohttp/_http_parser.pyx":615 * query_string=query, * fragment=fragment, * encoded=True, # <<<<<<<<<<<<<< * ) * finally: */ if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_encoded, Py_True) < 0) __PYX_ERR(0, 612, __pyx_L5_error) /* "aiohttp/_http_parser.pyx":611 * fragment = self._path[idx2+1:] * * self._url = URL.build( # <<<<<<<<<<<<<< * path=path, * query_string=query, */ __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 611, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_GIVEREF(__pyx_t_7); __Pyx_GOTREF(__pyx_v_self->__pyx_base._url); __Pyx_DECREF(__pyx_v_self->__pyx_base._url); __pyx_v_self->__pyx_base._url = __pyx_t_7; __pyx_t_7 = 0; } /* "aiohttp/_http_parser.pyx":618 * ) * finally: * PyByteArray_Resize(self._buf, 0) # <<<<<<<<<<<<<< * * */ /*finally:*/ { /*normal exit:*/{ __pyx_t_7 = __pyx_v_self->__pyx_base._buf; __Pyx_INCREF(__pyx_t_7); __pyx_t_8 = PyByteArray_Resize(__pyx_t_7, 0); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 618, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; goto __pyx_L6; } __pyx_L5_error:; /*exception exit:*/{ __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16); if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_11, &__pyx_t_12, &__pyx_t_13) < 0)) __Pyx_ErrFetch(&__pyx_t_11, &__pyx_t_12, &__pyx_t_13); __Pyx_XGOTREF(__pyx_t_11); __Pyx_XGOTREF(__pyx_t_12); __Pyx_XGOTREF(__pyx_t_13); __Pyx_XGOTREF(__pyx_t_14); __Pyx_XGOTREF(__pyx_t_15); __Pyx_XGOTREF(__pyx_t_16); __pyx_t_8 = __pyx_lineno; __pyx_t_9 = __pyx_clineno; __pyx_t_10 = __pyx_filename; { __pyx_t_7 = __pyx_v_self->__pyx_base._buf; __Pyx_INCREF(__pyx_t_7); __pyx_t_17 = PyByteArray_Resize(__pyx_t_7, 0); if (unlikely(__pyx_t_17 == ((int)-1))) __PYX_ERR(0, 618, __pyx_L11_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } if (PY_MAJOR_VERSION >= 3) { __Pyx_XGIVEREF(__pyx_t_14); __Pyx_XGIVEREF(__pyx_t_15); __Pyx_XGIVEREF(__pyx_t_16); __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); } __Pyx_XGIVEREF(__pyx_t_11); __Pyx_XGIVEREF(__pyx_t_12); __Pyx_XGIVEREF(__pyx_t_13); __Pyx_ErrRestore(__pyx_t_11, __pyx_t_12, __pyx_t_13); __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_lineno = __pyx_t_8; __pyx_clineno = __pyx_t_9; __pyx_filename = __pyx_t_10; goto __pyx_L1_error; __pyx_L11_error:; if (PY_MAJOR_VERSION >= 3) { __Pyx_XGIVEREF(__pyx_t_14); __Pyx_XGIVEREF(__pyx_t_15); __Pyx_XGIVEREF(__pyx_t_16); __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); } __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; goto __pyx_L1_error; } __pyx_L6:; } /* "aiohttp/_http_parser.pyx":582 * auto_decompress) * * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< * cdef int idx1, idx2 * if not self._buf: */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser._on_status_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_query); __Pyx_XDECREF(__pyx_v_path); __Pyx_XDECREF(__pyx_v_fragment); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_2__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":2 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(1, 2, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_4__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(1, 4, __pyx_L1_error) /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":623 * cdef class HttpResponseParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* Python wrapper */ static int __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_protocol = 0; PyObject *__pyx_v_loop = 0; int __pyx_v_limit; PyObject *__pyx_v_timer = 0; size_t __pyx_v_max_line_size; size_t __pyx_v_max_headers; size_t __pyx_v_max_field_size; PyObject *__pyx_v_payload_exception = 0; int __pyx_v_response_with_body; int __pyx_v_read_until_eof; int __pyx_v_auto_decompress; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_protocol,&__pyx_n_s_loop,&__pyx_n_s_limit,&__pyx_n_s_timer,&__pyx_n_s_max_line_size,&__pyx_n_s_max_headers,&__pyx_n_s_max_field_size,&__pyx_n_s_payload_exception,&__pyx_n_s_response_with_body,&__pyx_n_s_read_until_eof,&__pyx_n_s_auto_decompress,0}; PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0}; /* "aiohttp/_http_parser.pyx":624 * * def __init__( * self, protocol, loop, int limit, timer=None, # <<<<<<<<<<<<<< * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, */ values[3] = ((PyObject *)Py_None); /* "aiohttp/_http_parser.pyx":626 * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True */ values[7] = ((PyObject *)Py_None); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); CYTHON_FALLTHROUGH; case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_protocol)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loop)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 1); __PYX_ERR(0, 623, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_limit)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 2); __PYX_ERR(0, 623, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_timer); if (value) { values[3] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 4: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_line_size); if (value) { values[4] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 5: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_headers); if (value) { values[5] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 6: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_field_size); if (value) { values[6] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 7: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_payload_exception); if (value) { values[7] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 8: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_response_with_body); if (value) { values[8] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 9: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_read_until_eof); if (value) { values[9] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 10: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_auto_decompress); if (value) { values[10] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 623, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); CYTHON_FALLTHROUGH; case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[0] = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_protocol = values[0]; __pyx_v_loop = values[1]; __pyx_v_limit = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_limit == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 624, __pyx_L3_error) __pyx_v_timer = values[3]; if (values[4]) { __pyx_v_max_line_size = __Pyx_PyInt_As_size_t(values[4]); if (unlikely((__pyx_v_max_line_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 625, __pyx_L3_error) } else { __pyx_v_max_line_size = ((size_t)0x1FFE); } if (values[5]) { __pyx_v_max_headers = __Pyx_PyInt_As_size_t(values[5]); if (unlikely((__pyx_v_max_headers == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 625, __pyx_L3_error) } else { __pyx_v_max_headers = ((size_t)0x8000); } if (values[6]) { __pyx_v_max_field_size = __Pyx_PyInt_As_size_t(values[6]); if (unlikely((__pyx_v_max_field_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 626, __pyx_L3_error) } else { __pyx_v_max_field_size = ((size_t)0x1FFE); } __pyx_v_payload_exception = values[7]; if (values[8]) { __pyx_v_response_with_body = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_response_with_body == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 627, __pyx_L3_error) } else { /* "aiohttp/_http_parser.pyx":627 * size_t max_line_size=8190, size_t max_headers=32768, * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< * bint auto_decompress=True * ): */ __pyx_v_response_with_body = ((int)1); } if (values[9]) { __pyx_v_read_until_eof = __Pyx_PyObject_IsTrue(values[9]); if (unlikely((__pyx_v_read_until_eof == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 627, __pyx_L3_error) } else { __pyx_v_read_until_eof = ((int)0); } if (values[10]) { __pyx_v_auto_decompress = __Pyx_PyObject_IsTrue(values[10]); if (unlikely((__pyx_v_auto_decompress == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 628, __pyx_L3_error) } else { /* "aiohttp/_http_parser.pyx":628 * size_t max_field_size=8190, payload_exception=None, * bint response_with_body=True, bint read_until_eof=False, * bint auto_decompress=True # <<<<<<<<<<<<<< * ): * self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, */ __pyx_v_auto_decompress = ((int)1); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 623, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser___init__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self), __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, __pyx_v_timer, __pyx_v_max_line_size, __pyx_v_max_headers, __pyx_v_max_field_size, __pyx_v_payload_exception, __pyx_v_response_with_body, __pyx_v_read_until_eof, __pyx_v_auto_decompress); /* "aiohttp/_http_parser.pyx":623 * cdef class HttpResponseParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser___init__(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, PyObject *__pyx_v_timer, size_t __pyx_v_max_line_size, size_t __pyx_v_max_headers, size_t __pyx_v_max_field_size, PyObject *__pyx_v_payload_exception, int __pyx_v_response_with_body, int __pyx_v_read_until_eof, int __pyx_v_auto_decompress) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init __pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 0); /* "aiohttp/_http_parser.pyx":630 * bint auto_decompress=True * ): * self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, # <<<<<<<<<<<<<< * max_line_size, max_headers, max_field_size, * payload_exception, response_with_body, read_until_eof, */ __pyx_t_2.__pyx_n = 8; __pyx_t_2.timer = __pyx_v_timer; __pyx_t_2.max_line_size = __pyx_v_max_line_size; __pyx_t_2.max_headers = __pyx_v_max_headers; __pyx_t_2.max_field_size = __pyx_v_max_field_size; __pyx_t_2.payload_exception = __pyx_v_payload_exception; __pyx_t_2.response_with_body = __pyx_v_response_with_body; __pyx_t_2.read_until_eof = __pyx_v_read_until_eof; __pyx_t_2.auto_decompress = __pyx_v_auto_decompress; __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._init(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), HTTP_RESPONSE, __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 630, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":623 * cdef class HttpResponseParser(HttpParser): * * def __init__( # <<<<<<<<<<<<<< * self, protocol, loop, int limit, timer=None, * size_t max_line_size=8190, size_t max_headers=32768, */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":635 * auto_decompress) * * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< * if self._buf: * self._reason = self._buf.decode('utf-8', 'surrogateescape') */ static PyObject *__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_on_status_complete", 0); /* "aiohttp/_http_parser.pyx":636 * * cdef object _on_status_complete(self): * if self._buf: # <<<<<<<<<<<<<< * self._reason = self._buf.decode('utf-8', 'surrogateescape') * PyByteArray_Resize(self._buf, 0) */ __pyx_t_1 = (__pyx_v_self->__pyx_base._buf != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->__pyx_base._buf) != 0); if (__pyx_t_1) { /* "aiohttp/_http_parser.pyx":637 * cdef object _on_status_complete(self): * if self._buf: * self._reason = self._buf.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< * PyByteArray_Resize(self._buf, 0) * else: */ if (unlikely(__pyx_v_self->__pyx_base._buf == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); __PYX_ERR(0, 637, __pyx_L1_error) } __pyx_t_2 = __Pyx_decode_bytearray(__pyx_v_self->__pyx_base._buf, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 637, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_GOTREF(__pyx_v_self->__pyx_base._reason); __Pyx_DECREF(__pyx_v_self->__pyx_base._reason); __pyx_v_self->__pyx_base._reason = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":638 * if self._buf: * self._reason = self._buf.decode('utf-8', 'surrogateescape') * PyByteArray_Resize(self._buf, 0) # <<<<<<<<<<<<<< * else: * self._reason = self._reason or '' */ __pyx_t_2 = __pyx_v_self->__pyx_base._buf; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 638, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":636 * * cdef object _on_status_complete(self): * if self._buf: # <<<<<<<<<<<<<< * self._reason = self._buf.decode('utf-8', 'surrogateescape') * PyByteArray_Resize(self._buf, 0) */ goto __pyx_L3; } /* "aiohttp/_http_parser.pyx":640 * PyByteArray_Resize(self._buf, 0) * else: * self._reason = self._reason or '' # <<<<<<<<<<<<<< * * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: */ /*else*/ { __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->__pyx_base._reason); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 640, __pyx_L1_error) if (!__pyx_t_1) { } else { __Pyx_INCREF(__pyx_v_self->__pyx_base._reason); __pyx_t_2 = __pyx_v_self->__pyx_base._reason; goto __pyx_L4_bool_binop_done; } __Pyx_INCREF(__pyx_kp_u__4); __pyx_t_2 = __pyx_kp_u__4; __pyx_L4_bool_binop_done:; __Pyx_GIVEREF(__pyx_t_2); __Pyx_GOTREF(__pyx_v_self->__pyx_base._reason); __Pyx_DECREF(__pyx_v_self->__pyx_base._reason); __pyx_v_self->__pyx_base._reason = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; } __pyx_L3:; /* "aiohttp/_http_parser.pyx":635 * auto_decompress) * * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< * if self._buf: * self._reason = self._buf.decode('utf-8', 'surrogateescape') */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser._on_status_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_2__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":2 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(1, 2, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_4__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(1, 4, __pyx_L1_error) /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":642 * self._reason = self._reason or '' * * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin(llhttp_t *__pyx_v_parser) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_message_begin", 0); /* "aiohttp/_http_parser.pyx":643 * * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * * pyparser._started = True */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":645 * cdef HttpParser pyparser = parser.data * * pyparser._started = True # <<<<<<<<<<<<<< * pyparser._headers = CIMultiDict() * pyparser._raw_headers = [] */ __pyx_v_pyparser->_started = 1; /* "aiohttp/_http_parser.pyx":646 * * pyparser._started = True * pyparser._headers = CIMultiDict() # <<<<<<<<<<<<<< * pyparser._raw_headers = [] * PyByteArray_Resize(pyparser._buf, 0) */ __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDict); __pyx_t_2 = __pyx_v_7aiohttp_12_http_parser_CIMultiDict; __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 646, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_pyparser->_headers); __Pyx_DECREF(__pyx_v_pyparser->_headers); __pyx_v_pyparser->_headers = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":647 * pyparser._started = True * pyparser._headers = CIMultiDict() * pyparser._raw_headers = [] # <<<<<<<<<<<<<< * PyByteArray_Resize(pyparser._buf, 0) * pyparser._path = None */ __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 647, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v_pyparser->_raw_headers); __Pyx_DECREF(__pyx_v_pyparser->_raw_headers); __pyx_v_pyparser->_raw_headers = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":648 * pyparser._headers = CIMultiDict() * pyparser._raw_headers = [] * PyByteArray_Resize(pyparser._buf, 0) # <<<<<<<<<<<<<< * pyparser._path = None * pyparser._reason = None */ __pyx_t_1 = __pyx_v_pyparser->_buf; __Pyx_INCREF(__pyx_t_1); __pyx_t_4 = PyByteArray_Resize(__pyx_t_1, 0); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(0, 648, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":649 * pyparser._raw_headers = [] * PyByteArray_Resize(pyparser._buf, 0) * pyparser._path = None # <<<<<<<<<<<<<< * pyparser._reason = None * return 0 */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_pyparser->_path); __Pyx_DECREF(__pyx_v_pyparser->_path); __pyx_v_pyparser->_path = ((PyObject*)Py_None); /* "aiohttp/_http_parser.pyx":650 * PyByteArray_Resize(pyparser._buf, 0) * pyparser._path = None * pyparser._reason = None # <<<<<<<<<<<<<< * return 0 * */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_pyparser->_reason); __Pyx_DECREF(__pyx_v_pyparser->_reason); __pyx_v_pyparser->_reason = ((PyObject*)Py_None); /* "aiohttp/_http_parser.pyx":651 * pyparser._path = None * pyparser._reason = None * return 0 # <<<<<<<<<<<<<< * * */ __pyx_r = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":642 * self._reason = self._reason or '' * * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_begin", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":654 * * * cdef int cb_on_url(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_url(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_ex = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; int __pyx_t_10; PyObject *__pyx_t_11 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_url", 0); /* "aiohttp/_http_parser.pyx":656 * cdef int cb_on_url(cparser.llhttp_t* parser, * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * try: * if length > pyparser._max_line_size: */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":657 * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":658 * cdef HttpParser pyparser = parser.data * try: * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) */ __pyx_t_5 = ((__pyx_v_length > __pyx_v_pyparser->_max_line_size) != 0); if (unlikely(__pyx_t_5)) { /* "aiohttp/_http_parser.pyx":659 * try: * if length > pyparser._max_line_size: * raise LineTooLong( # <<<<<<<<<<<<<< * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) */ __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 659, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_6); /* "aiohttp/_http_parser.pyx":660 * if length > pyparser._max_line_size: * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) # <<<<<<<<<<<<<< * extend(pyparser._buf, at, length) * except BaseException as ex: */ __pyx_t_7 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_line_size); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 660, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 660, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = NULL; __pyx_t_10 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6); if (likely(__pyx_t_9)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); __Pyx_INCREF(__pyx_t_9); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_6, function); __pyx_t_10 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 659, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 659, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } else #endif { __pyx_t_11 = PyTuple_New(3+__pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 659, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_11); if (__pyx_t_9) { __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_9); __pyx_t_9 = NULL; } __Pyx_INCREF(__pyx_kp_u_Status_line_is_too_long); __Pyx_GIVEREF(__pyx_kp_u_Status_line_is_too_long); PyTuple_SET_ITEM(__pyx_t_11, 0+__pyx_t_10, __pyx_kp_u_Status_line_is_too_long); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_11, 1+__pyx_t_10, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_11, 2+__pyx_t_10, __pyx_t_8); __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 659, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; } __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 659, __pyx_L3_error) /* "aiohttp/_http_parser.pyx":658 * cdef HttpParser pyparser = parser.data * try: * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) */ } /* "aiohttp/_http_parser.pyx":661 * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) # <<<<<<<<<<<<<< * except BaseException as ex: * pyparser._last_error = ex */ __pyx_t_1 = __pyx_v_pyparser->_buf; __Pyx_INCREF(__pyx_t_1); __pyx_t_6 = __pyx_f_7aiohttp_12_http_parser_extend(__pyx_t_1, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 661, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_parser.pyx":657 * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ } /* "aiohttp/_http_parser.pyx":666 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; /* "aiohttp/_http_parser.pyx":662 * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_10) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_url", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_11) < 0) __PYX_ERR(0, 662, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_v_ex = __pyx_t_1; /*try:*/ { /* "aiohttp/_http_parser.pyx":663 * extend(pyparser._buf, at, length) * except BaseException as ex: * pyparser._last_error = ex # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_ex); __Pyx_GIVEREF(__pyx_v_ex); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_ex; /* "aiohttp/_http_parser.pyx":664 * except BaseException as ex: * pyparser._last_error = ex * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; goto __pyx_L14_return; } /* "aiohttp/_http_parser.pyx":662 * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ /*finally:*/ { __pyx_L14_return: { __pyx_t_10 = __pyx_r; __Pyx_DECREF(__pyx_v_ex); __pyx_v_ex = NULL; __pyx_r = __pyx_t_10; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "aiohttp/_http_parser.pyx":657 * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":654 * * * cdef int cb_on_url(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_11); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_url", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_ex); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":669 * * * cdef int cb_on_status(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_status(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_ex = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; int __pyx_t_10; PyObject *__pyx_t_11 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_status", 0); /* "aiohttp/_http_parser.pyx":671 * cdef int cb_on_status(cparser.llhttp_t* parser, * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * cdef str reason * try: */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":673 * cdef HttpParser pyparser = parser.data * cdef str reason * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":674 * cdef str reason * try: * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) */ __pyx_t_5 = ((__pyx_v_length > __pyx_v_pyparser->_max_line_size) != 0); if (unlikely(__pyx_t_5)) { /* "aiohttp/_http_parser.pyx":675 * try: * if length > pyparser._max_line_size: * raise LineTooLong( # <<<<<<<<<<<<<< * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) */ __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 675, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_6); /* "aiohttp/_http_parser.pyx":676 * if length > pyparser._max_line_size: * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) # <<<<<<<<<<<<<< * extend(pyparser._buf, at, length) * except BaseException as ex: */ __pyx_t_7 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_line_size); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 676, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 676, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = NULL; __pyx_t_10 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6); if (likely(__pyx_t_9)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); __Pyx_INCREF(__pyx_t_9); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_6, function); __pyx_t_10 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 675, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 675, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } else #endif { __pyx_t_11 = PyTuple_New(3+__pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 675, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_11); if (__pyx_t_9) { __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_9); __pyx_t_9 = NULL; } __Pyx_INCREF(__pyx_kp_u_Status_line_is_too_long); __Pyx_GIVEREF(__pyx_kp_u_Status_line_is_too_long); PyTuple_SET_ITEM(__pyx_t_11, 0+__pyx_t_10, __pyx_kp_u_Status_line_is_too_long); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_11, 1+__pyx_t_10, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_11, 2+__pyx_t_10, __pyx_t_8); __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 675, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; } __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 675, __pyx_L3_error) /* "aiohttp/_http_parser.pyx":674 * cdef str reason * try: * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) */ } /* "aiohttp/_http_parser.pyx":677 * raise LineTooLong( * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) # <<<<<<<<<<<<<< * except BaseException as ex: * pyparser._last_error = ex */ __pyx_t_1 = __pyx_v_pyparser->_buf; __Pyx_INCREF(__pyx_t_1); __pyx_t_6 = __pyx_f_7aiohttp_12_http_parser_extend(__pyx_t_1, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 677, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_parser.pyx":673 * cdef HttpParser pyparser = parser.data * cdef str reason * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ } /* "aiohttp/_http_parser.pyx":682 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; /* "aiohttp/_http_parser.pyx":678 * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_10) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_status", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_11) < 0) __PYX_ERR(0, 678, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_v_ex = __pyx_t_1; /*try:*/ { /* "aiohttp/_http_parser.pyx":679 * extend(pyparser._buf, at, length) * except BaseException as ex: * pyparser._last_error = ex # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_ex); __Pyx_GIVEREF(__pyx_v_ex); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_ex; /* "aiohttp/_http_parser.pyx":680 * except BaseException as ex: * pyparser._last_error = ex * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; goto __pyx_L14_return; } /* "aiohttp/_http_parser.pyx":678 * 'Status line is too long', pyparser._max_line_size, length) * extend(pyparser._buf, at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ /*finally:*/ { __pyx_L14_return: { __pyx_t_10 = __pyx_r; __Pyx_DECREF(__pyx_v_ex); __pyx_v_ex = NULL; __pyx_r = __pyx_t_10; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "aiohttp/_http_parser.pyx":673 * cdef HttpParser pyparser = parser.data * cdef str reason * try: # <<<<<<<<<<<<<< * if length > pyparser._max_line_size: * raise LineTooLong( */ __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":669 * * * cdef int cb_on_status(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_11); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_status", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_ex); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":685 * * * cdef int cb_on_header_field(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_field(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; Py_ssize_t __pyx_v_size; PyObject *__pyx_v_ex = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; Py_ssize_t __pyx_t_5; int __pyx_t_6; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; int __pyx_t_11; PyObject *__pyx_t_12 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_header_field", 0); /* "aiohttp/_http_parser.pyx":687 * cdef int cb_on_header_field(cparser.llhttp_t* parser, * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * cdef Py_ssize_t size * try: */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":689 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":690 * cdef Py_ssize_t size * try: * pyparser._on_status_complete() # <<<<<<<<<<<<<< * size = len(pyparser._raw_name) + length * if size > pyparser._max_field_size: */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_status_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 690, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":691 * try: * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length # <<<<<<<<<<<<<< * if size > pyparser._max_field_size: * raise LineTooLong( */ __pyx_t_1 = __pyx_v_pyparser->_raw_name; __Pyx_INCREF(__pyx_t_1); if (unlikely(__pyx_t_1 == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(0, 691, __pyx_L3_error) } __pyx_t_5 = PyByteArray_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 691, __pyx_L3_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_size = (__pyx_t_5 + __pyx_v_length); /* "aiohttp/_http_parser.pyx":692 * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Header name is too long', pyparser._max_field_size, size) */ __pyx_t_6 = ((__pyx_v_size > __pyx_v_pyparser->_max_field_size) != 0); if (unlikely(__pyx_t_6)) { /* "aiohttp/_http_parser.pyx":693 * size = len(pyparser._raw_name) + length * if size > pyparser._max_field_size: * raise LineTooLong( # <<<<<<<<<<<<<< * 'Header name is too long', pyparser._max_field_size, size) * pyparser._on_header_field(at, length) */ __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 693, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_7); /* "aiohttp/_http_parser.pyx":694 * if size > pyparser._max_field_size: * raise LineTooLong( * 'Header name is too long', pyparser._max_field_size, size) # <<<<<<<<<<<<<< * pyparser._on_header_field(at, length) * except BaseException as ex: */ __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_field_size); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 694, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_size); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 694, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_10 = NULL; __pyx_t_11 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_10)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_10); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); __pyx_t_11 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_name_is_too_long, __pyx_t_8, __pyx_t_9}; __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_name_is_too_long, __pyx_t_8, __pyx_t_9}; __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } else #endif { __pyx_t_12 = PyTuple_New(3+__pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 693, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_12); if (__pyx_t_10) { __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL; } __Pyx_INCREF(__pyx_kp_u_Header_name_is_too_long); __Pyx_GIVEREF(__pyx_kp_u_Header_name_is_too_long); PyTuple_SET_ITEM(__pyx_t_12, 0+__pyx_t_11, __pyx_kp_u_Header_name_is_too_long); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_11, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_12, 2+__pyx_t_11, __pyx_t_9); __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 693, __pyx_L3_error) /* "aiohttp/_http_parser.pyx":692 * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Header name is too long', pyparser._max_field_size, size) */ } /* "aiohttp/_http_parser.pyx":695 * raise LineTooLong( * 'Header name is too long', pyparser._max_field_size, size) * pyparser._on_header_field(at, length) # <<<<<<<<<<<<<< * except BaseException as ex: * pyparser._last_error = ex */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_header_field(__pyx_v_pyparser, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 695, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":689 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length */ } /* "aiohttp/_http_parser.pyx":700 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; /* "aiohttp/_http_parser.pyx":696 * 'Header name is too long', pyparser._max_field_size, size) * pyparser._on_header_field(at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_11) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_7, &__pyx_t_12) < 0) __PYX_ERR(0, 696, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_7); __Pyx_GOTREF(__pyx_t_12); __Pyx_INCREF(__pyx_t_7); __pyx_v_ex = __pyx_t_7; /*try:*/ { /* "aiohttp/_http_parser.pyx":697 * pyparser._on_header_field(at, length) * except BaseException as ex: * pyparser._last_error = ex # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_ex); __Pyx_GIVEREF(__pyx_v_ex); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_ex; /* "aiohttp/_http_parser.pyx":698 * except BaseException as ex: * pyparser._last_error = ex * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; goto __pyx_L14_return; } /* "aiohttp/_http_parser.pyx":696 * 'Header name is too long', pyparser._max_field_size, size) * pyparser._on_header_field(at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ /*finally:*/ { __pyx_L14_return: { __pyx_t_11 = __pyx_r; __Pyx_DECREF(__pyx_v_ex); __pyx_v_ex = NULL; __pyx_r = __pyx_t_11; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "aiohttp/_http_parser.pyx":689 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * size = len(pyparser._raw_name) + length */ __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":685 * * * cdef int cb_on_header_field(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_12); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_ex); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":703 * * * cdef int cb_on_header_value(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_value(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; Py_ssize_t __pyx_v_size; PyObject *__pyx_v_ex = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; Py_ssize_t __pyx_t_5; int __pyx_t_6; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; int __pyx_t_11; PyObject *__pyx_t_12 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_header_value", 0); /* "aiohttp/_http_parser.pyx":705 * cdef int cb_on_header_value(cparser.llhttp_t* parser, * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * cdef Py_ssize_t size * try: */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":707 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":708 * cdef Py_ssize_t size * try: * size = len(pyparser._raw_value) + length # <<<<<<<<<<<<<< * if size > pyparser._max_field_size: * raise LineTooLong( */ __pyx_t_1 = __pyx_v_pyparser->_raw_value; __Pyx_INCREF(__pyx_t_1); if (unlikely(__pyx_t_1 == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(0, 708, __pyx_L3_error) } __pyx_t_5 = PyByteArray_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 708, __pyx_L3_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_size = (__pyx_t_5 + __pyx_v_length); /* "aiohttp/_http_parser.pyx":709 * try: * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Header value is too long', pyparser._max_field_size, size) */ __pyx_t_6 = ((__pyx_v_size > __pyx_v_pyparser->_max_field_size) != 0); if (unlikely(__pyx_t_6)) { /* "aiohttp/_http_parser.pyx":710 * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: * raise LineTooLong( # <<<<<<<<<<<<<< * 'Header value is too long', pyparser._max_field_size, size) * pyparser._on_header_value(at, length) */ __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 710, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_7); /* "aiohttp/_http_parser.pyx":711 * if size > pyparser._max_field_size: * raise LineTooLong( * 'Header value is too long', pyparser._max_field_size, size) # <<<<<<<<<<<<<< * pyparser._on_header_value(at, length) * except BaseException as ex: */ __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_field_size); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 711, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_size); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 711, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_10 = NULL; __pyx_t_11 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_10)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_10); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); __pyx_t_11 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_value_is_too_long, __pyx_t_8, __pyx_t_9}; __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 710, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_value_is_too_long, __pyx_t_8, __pyx_t_9}; __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 710, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } else #endif { __pyx_t_12 = PyTuple_New(3+__pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 710, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_12); if (__pyx_t_10) { __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL; } __Pyx_INCREF(__pyx_kp_u_Header_value_is_too_long); __Pyx_GIVEREF(__pyx_kp_u_Header_value_is_too_long); PyTuple_SET_ITEM(__pyx_t_12, 0+__pyx_t_11, __pyx_kp_u_Header_value_is_too_long); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_11, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_12, 2+__pyx_t_11, __pyx_t_9); __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 710, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_ERR(0, 710, __pyx_L3_error) /* "aiohttp/_http_parser.pyx":709 * try: * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< * raise LineTooLong( * 'Header value is too long', pyparser._max_field_size, size) */ } /* "aiohttp/_http_parser.pyx":712 * raise LineTooLong( * 'Header value is too long', pyparser._max_field_size, size) * pyparser._on_header_value(at, length) # <<<<<<<<<<<<<< * except BaseException as ex: * pyparser._last_error = ex */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_header_value(__pyx_v_pyparser, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 712, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":707 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: */ } /* "aiohttp/_http_parser.pyx":717 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; /* "aiohttp/_http_parser.pyx":713 * 'Header value is too long', pyparser._max_field_size, size) * pyparser._on_header_value(at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_11) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_7, &__pyx_t_12) < 0) __PYX_ERR(0, 713, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_7); __Pyx_GOTREF(__pyx_t_12); __Pyx_INCREF(__pyx_t_7); __pyx_v_ex = __pyx_t_7; /*try:*/ { /* "aiohttp/_http_parser.pyx":714 * pyparser._on_header_value(at, length) * except BaseException as ex: * pyparser._last_error = ex # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_ex); __Pyx_GIVEREF(__pyx_v_ex); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_ex; /* "aiohttp/_http_parser.pyx":715 * except BaseException as ex: * pyparser._last_error = ex * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; goto __pyx_L14_return; } /* "aiohttp/_http_parser.pyx":713 * 'Header value is too long', pyparser._max_field_size, size) * pyparser._on_header_value(at, length) * except BaseException as ex: # <<<<<<<<<<<<<< * pyparser._last_error = ex * return -1 */ /*finally:*/ { __pyx_L14_return: { __pyx_t_11 = __pyx_r; __Pyx_DECREF(__pyx_v_ex); __pyx_v_ex = NULL; __pyx_r = __pyx_t_11; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "aiohttp/_http_parser.pyx":707 * cdef HttpParser pyparser = parser.data * cdef Py_ssize_t size * try: # <<<<<<<<<<<<<< * size = len(pyparser._raw_value) + length * if size > pyparser._max_field_size: */ __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":703 * * * cdef int cb_on_header_value(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_12); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_ex); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":720 * * * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete(llhttp_t *__pyx_v_parser) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_exc = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; int __pyx_t_7; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_headers_complete", 0); /* "aiohttp/_http_parser.pyx":721 * * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * try: * pyparser._on_status_complete() */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":722 * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * pyparser._on_headers_complete() */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":723 * cdef HttpParser pyparser = parser.data * try: * pyparser._on_status_complete() # <<<<<<<<<<<<<< * pyparser._on_headers_complete() * except BaseException as exc: */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_status_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 723, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":724 * try: * pyparser._on_status_complete() * pyparser._on_headers_complete() # <<<<<<<<<<<<<< * except BaseException as exc: * pyparser._last_error = exc */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_headers_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 724, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":722 * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * pyparser._on_headers_complete() */ } /* "aiohttp/_http_parser.pyx":729 * return -1 * else: * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT # <<<<<<<<<<<<<< * return 2 * else: */ /*else:*/ { __pyx_t_6 = (__pyx_v_pyparser->_cparser->upgrade != 0); if (!__pyx_t_6) { } else { __pyx_t_5 = __pyx_t_6; goto __pyx_L10_bool_binop_done; } __pyx_t_6 = ((__pyx_v_pyparser->_cparser->method == 5) != 0); __pyx_t_5 = __pyx_t_6; __pyx_L10_bool_binop_done:; if (__pyx_t_5) { /* "aiohttp/_http_parser.pyx":730 * else: * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT * return 2 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = 2; goto __pyx_L6_except_return; /* "aiohttp/_http_parser.pyx":729 * return -1 * else: * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT # <<<<<<<<<<<<<< * return 2 * else: */ } /* "aiohttp/_http_parser.pyx":732 * return 2 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else*/ { __pyx_r = 0; goto __pyx_L6_except_return; } } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":725 * pyparser._on_status_complete() * pyparser._on_headers_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ __pyx_t_7 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_7) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_8, &__pyx_t_9) < 0) __PYX_ERR(0, 725, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_8); __Pyx_GOTREF(__pyx_t_9); __Pyx_INCREF(__pyx_t_8); __pyx_v_exc = __pyx_t_8; /*try:*/ { /* "aiohttp/_http_parser.pyx":726 * pyparser._on_headers_complete() * except BaseException as exc: * pyparser._last_error = exc # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_exc); __Pyx_GIVEREF(__pyx_v_exc); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_exc; /* "aiohttp/_http_parser.pyx":727 * except BaseException as exc: * pyparser._last_error = exc * return -1 # <<<<<<<<<<<<<< * else: * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; goto __pyx_L16_return; } /* "aiohttp/_http_parser.pyx":725 * pyparser._on_status_complete() * pyparser._on_headers_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ /*finally:*/ { __pyx_L16_return: { __pyx_t_7 = __pyx_r; __Pyx_DECREF(__pyx_v_exc); __pyx_v_exc = NULL; __pyx_r = __pyx_t_7; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "aiohttp/_http_parser.pyx":722 * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_status_complete() * pyparser._on_headers_complete() */ __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":720 * * * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_exc); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":735 * * * cdef int cb_on_body(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_body(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_body = 0; PyObject *__pyx_v_exc = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_t_8; PyObject *__pyx_t_9 = NULL; int __pyx_t_10; int __pyx_t_11; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; PyObject *__pyx_t_14 = NULL; PyObject *__pyx_t_15 = NULL; int __pyx_t_16; char const *__pyx_t_17; PyObject *__pyx_t_18 = NULL; PyObject *__pyx_t_19 = NULL; PyObject *__pyx_t_20 = NULL; PyObject *__pyx_t_21 = NULL; PyObject *__pyx_t_22 = NULL; PyObject *__pyx_t_23 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_body", 0); /* "aiohttp/_http_parser.pyx":737 * cdef int cb_on_body(cparser.llhttp_t* parser, * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * cdef bytes body = at[:length] * try: */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":738 * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data * cdef bytes body = at[:length] # <<<<<<<<<<<<<< * try: * pyparser._payload.feed_data(body, length) */ __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_at + 0, __pyx_v_length - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 738, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_body = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":739 * cdef HttpParser pyparser = parser.data * cdef bytes body = at[:length] * try: # <<<<<<<<<<<<<< * pyparser._payload.feed_data(body, length) * except BaseException as exc: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":740 * cdef bytes body = at[:length] * try: * pyparser._payload.feed_data(body, length) # <<<<<<<<<<<<<< * except BaseException as exc: * if pyparser._payload_exception is not None: */ __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_pyparser->_payload, __pyx_n_s_feed_data); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 740, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 740, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = NULL; __pyx_t_8 = 0; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_5, function); __pyx_t_8 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_body, __pyx_t_6}; __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_body, __pyx_t_6}; __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } else #endif { __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 740, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_9); if (__pyx_t_7) { __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; } __Pyx_INCREF(__pyx_v_body); __Pyx_GIVEREF(__pyx_v_body); PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_v_body); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_t_6); __pyx_t_6 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":739 * cdef HttpParser pyparser = parser.data * cdef bytes body = at[:length] * try: # <<<<<<<<<<<<<< * pyparser._payload.feed_data(body, length) * except BaseException as exc: */ } /* "aiohttp/_http_parser.pyx":749 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; /* "aiohttp/_http_parser.pyx":741 * try: * pyparser._payload.feed_data(body, length) * except BaseException as exc: # <<<<<<<<<<<<<< * if pyparser._payload_exception is not None: * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) */ __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_8) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_body", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_5, &__pyx_t_9) < 0) __PYX_ERR(0, 741, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_9); __Pyx_INCREF(__pyx_t_5); __pyx_v_exc = __pyx_t_5; /*try:*/ { /* "aiohttp/_http_parser.pyx":742 * pyparser._payload.feed_data(body, length) * except BaseException as exc: * if pyparser._payload_exception is not None: # <<<<<<<<<<<<<< * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) * else: */ __pyx_t_10 = (__pyx_v_pyparser->_payload_exception != Py_None); __pyx_t_11 = (__pyx_t_10 != 0); if (__pyx_t_11) { /* "aiohttp/_http_parser.pyx":743 * except BaseException as exc: * if pyparser._payload_exception is not None: * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) # <<<<<<<<<<<<<< * else: * pyparser._payload.set_exception(exc) */ __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_pyparser->_payload, __pyx_n_s_set_exception); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 743, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_13 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_exc); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 743, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_13); __Pyx_INCREF(__pyx_v_pyparser->_payload_exception); __pyx_t_14 = __pyx_v_pyparser->_payload_exception; __pyx_t_15 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_14))) { __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_14); if (likely(__pyx_t_15)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_14); __Pyx_INCREF(__pyx_t_15); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_14, function); } } __pyx_t_12 = (__pyx_t_15) ? __Pyx_PyObject_Call2Args(__pyx_t_14, __pyx_t_15, __pyx_t_13) : __Pyx_PyObject_CallOneArg(__pyx_t_14, __pyx_t_13); __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 743, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; __pyx_t_14 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_14)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_14); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); } } __pyx_t_6 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_14, __pyx_t_12) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_12); __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 743, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_parser.pyx":742 * pyparser._payload.feed_data(body, length) * except BaseException as exc: * if pyparser._payload_exception is not None: # <<<<<<<<<<<<<< * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) * else: */ goto __pyx_L16; } /* "aiohttp/_http_parser.pyx":745 * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) * else: * pyparser._payload.set_exception(exc) # <<<<<<<<<<<<<< * pyparser._payload_error = 1 * return -1 */ /*else*/ { __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_pyparser->_payload, __pyx_n_s_set_exception); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 745, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_12 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_12)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_12); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); } } __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_12, __pyx_v_exc) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_v_exc); __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 745, __pyx_L14_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __pyx_L16:; /* "aiohttp/_http_parser.pyx":746 * else: * pyparser._payload.set_exception(exc) * pyparser._payload_error = 1 # <<<<<<<<<<<<<< * return -1 * else: */ __pyx_v_pyparser->_payload_error = 1; /* "aiohttp/_http_parser.pyx":747 * pyparser._payload.set_exception(exc) * pyparser._payload_error = 1 * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; goto __pyx_L13_return; } /* "aiohttp/_http_parser.pyx":741 * try: * pyparser._payload.feed_data(body, length) * except BaseException as exc: # <<<<<<<<<<<<<< * if pyparser._payload_exception is not None: * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) */ /*finally:*/ { __pyx_L14_error:; /*exception exit:*/{ __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0; __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_21, &__pyx_t_22, &__pyx_t_23); if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20) < 0)) __Pyx_ErrFetch(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20); __Pyx_XGOTREF(__pyx_t_18); __Pyx_XGOTREF(__pyx_t_19); __Pyx_XGOTREF(__pyx_t_20); __Pyx_XGOTREF(__pyx_t_21); __Pyx_XGOTREF(__pyx_t_22); __Pyx_XGOTREF(__pyx_t_23); __pyx_t_8 = __pyx_lineno; __pyx_t_16 = __pyx_clineno; __pyx_t_17 = __pyx_filename; { __Pyx_DECREF(__pyx_v_exc); __pyx_v_exc = NULL; } if (PY_MAJOR_VERSION >= 3) { __Pyx_XGIVEREF(__pyx_t_21); __Pyx_XGIVEREF(__pyx_t_22); __Pyx_XGIVEREF(__pyx_t_23); __Pyx_ExceptionReset(__pyx_t_21, __pyx_t_22, __pyx_t_23); } __Pyx_XGIVEREF(__pyx_t_18); __Pyx_XGIVEREF(__pyx_t_19); __Pyx_XGIVEREF(__pyx_t_20); __Pyx_ErrRestore(__pyx_t_18, __pyx_t_19, __pyx_t_20); __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0; __pyx_lineno = __pyx_t_8; __pyx_clineno = __pyx_t_16; __pyx_filename = __pyx_t_17; goto __pyx_L5_except_error; } __pyx_L13_return: { __pyx_t_16 = __pyx_r; __Pyx_DECREF(__pyx_v_exc); __pyx_v_exc = NULL; __pyx_r = __pyx_t_16; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "aiohttp/_http_parser.pyx":739 * cdef HttpParser pyparser = parser.data * cdef bytes body = at[:length] * try: # <<<<<<<<<<<<<< * pyparser._payload.feed_data(body, length) * except BaseException as exc: */ __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":735 * * * cdef int cb_on_body(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< * const char *at, size_t length) except -1: * cdef HttpParser pyparser = parser.data */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_12); __Pyx_XDECREF(__pyx_t_13); __Pyx_XDECREF(__pyx_t_14); __Pyx_XDECREF(__pyx_t_15); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_body", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_body); __Pyx_XDECREF(__pyx_v_exc); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":752 * * * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete(llhttp_t *__pyx_v_parser) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_exc = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_message_complete", 0); /* "aiohttp/_http_parser.pyx":753 * * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * try: * pyparser._started = False */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":754 * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._started = False * pyparser._on_message_complete() */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":755 * cdef HttpParser pyparser = parser.data * try: * pyparser._started = False # <<<<<<<<<<<<<< * pyparser._on_message_complete() * except BaseException as exc: */ __pyx_v_pyparser->_started = 0; /* "aiohttp/_http_parser.pyx":756 * try: * pyparser._started = False * pyparser._on_message_complete() # <<<<<<<<<<<<<< * except BaseException as exc: * pyparser._last_error = exc */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_message_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 756, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":754 * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._started = False * pyparser._on_message_complete() */ } /* "aiohttp/_http_parser.pyx":761 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":757 * pyparser._started = False * pyparser._on_message_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_5) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 757, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); __Pyx_INCREF(__pyx_t_6); __pyx_v_exc = __pyx_t_6; /*try:*/ { /* "aiohttp/_http_parser.pyx":758 * pyparser._on_message_complete() * except BaseException as exc: * pyparser._last_error = exc # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_exc); __Pyx_GIVEREF(__pyx_v_exc); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_exc; /* "aiohttp/_http_parser.pyx":759 * except BaseException as exc: * pyparser._last_error = exc * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; goto __pyx_L13_return; } /* "aiohttp/_http_parser.pyx":757 * pyparser._started = False * pyparser._on_message_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ /*finally:*/ { __pyx_L13_return: { __pyx_t_5 = __pyx_r; __Pyx_DECREF(__pyx_v_exc); __pyx_v_exc = NULL; __pyx_r = __pyx_t_5; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "aiohttp/_http_parser.pyx":754 * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._started = False * pyparser._on_message_complete() */ __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":752 * * * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_exc); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":764 * * * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header(llhttp_t *__pyx_v_parser) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_exc = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_chunk_header", 0); /* "aiohttp/_http_parser.pyx":765 * * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * try: * pyparser._on_chunk_header() */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":766 * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_header() * except BaseException as exc: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":767 * cdef HttpParser pyparser = parser.data * try: * pyparser._on_chunk_header() # <<<<<<<<<<<<<< * except BaseException as exc: * pyparser._last_error = exc */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_chunk_header(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 767, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":766 * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_header() * except BaseException as exc: */ } /* "aiohttp/_http_parser.pyx":772 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":768 * try: * pyparser._on_chunk_header() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_5) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 768, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); __Pyx_INCREF(__pyx_t_6); __pyx_v_exc = __pyx_t_6; /*try:*/ { /* "aiohttp/_http_parser.pyx":769 * pyparser._on_chunk_header() * except BaseException as exc: * pyparser._last_error = exc # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_exc); __Pyx_GIVEREF(__pyx_v_exc); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_exc; /* "aiohttp/_http_parser.pyx":770 * except BaseException as exc: * pyparser._last_error = exc * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; goto __pyx_L13_return; } /* "aiohttp/_http_parser.pyx":768 * try: * pyparser._on_chunk_header() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ /*finally:*/ { __pyx_L13_return: { __pyx_t_5 = __pyx_r; __Pyx_DECREF(__pyx_v_exc); __pyx_v_exc = NULL; __pyx_r = __pyx_t_5; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "aiohttp/_http_parser.pyx":766 * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_header() * except BaseException as exc: */ __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":764 * * * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_exc); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":775 * * * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete(llhttp_t *__pyx_v_parser) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; PyObject *__pyx_v_exc = NULL; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("cb_on_chunk_complete", 0); /* "aiohttp/_http_parser.pyx":776 * * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< * try: * pyparser._on_chunk_complete() */ __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); __Pyx_INCREF(__pyx_t_1); __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":777 * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_complete() * except BaseException as exc: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { /* "aiohttp/_http_parser.pyx":778 * cdef HttpParser pyparser = parser.data * try: * pyparser._on_chunk_complete() # <<<<<<<<<<<<<< * except BaseException as exc: * pyparser._last_error = exc */ __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_chunk_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 778, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":777 * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_complete() * except BaseException as exc: */ } /* "aiohttp/_http_parser.pyx":783 * return -1 * else: * return 0 # <<<<<<<<<<<<<< * * */ /*else:*/ { __pyx_r = 0; goto __pyx_L6_except_return; } __pyx_L3_error:; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":779 * try: * pyparser._on_chunk_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); if (__pyx_t_5) { __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 779, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); __Pyx_INCREF(__pyx_t_6); __pyx_v_exc = __pyx_t_6; /*try:*/ { /* "aiohttp/_http_parser.pyx":780 * pyparser._on_chunk_complete() * except BaseException as exc: * pyparser._last_error = exc # <<<<<<<<<<<<<< * return -1 * else: */ __Pyx_INCREF(__pyx_v_exc); __Pyx_GIVEREF(__pyx_v_exc); __Pyx_GOTREF(__pyx_v_pyparser->_last_error); __Pyx_DECREF(__pyx_v_pyparser->_last_error); __pyx_v_pyparser->_last_error = __pyx_v_exc; /* "aiohttp/_http_parser.pyx":781 * except BaseException as exc: * pyparser._last_error = exc * return -1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; goto __pyx_L13_return; } /* "aiohttp/_http_parser.pyx":779 * try: * pyparser._on_chunk_complete() * except BaseException as exc: # <<<<<<<<<<<<<< * pyparser._last_error = exc * return -1 */ /*finally:*/ { __pyx_L13_return: { __pyx_t_5 = __pyx_r; __Pyx_DECREF(__pyx_v_exc); __pyx_v_exc = NULL; __pyx_r = __pyx_t_5; goto __pyx_L6_except_return; } } } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "aiohttp/_http_parser.pyx":777 * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: * cdef HttpParser pyparser = parser.data * try: # <<<<<<<<<<<<<< * pyparser._on_chunk_complete() * except BaseException as exc: */ __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L1_error; __pyx_L6_except_return:; __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_XGIVEREF(__pyx_t_4); __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); goto __pyx_L0; } /* "aiohttp/_http_parser.pyx":775 * * * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< * cdef HttpParser pyparser = parser.data * try: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); __Pyx_XDECREF(__pyx_v_exc); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_parser.pyx":786 * * * cdef parser_error_from_errno(cparser.llhttp_t* parser): # <<<<<<<<<<<<<< * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) * cdef bytes desc = cparser.llhttp_get_error_reason(parser) */ static PyObject *__pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(llhttp_t *__pyx_v_parser) { llhttp_errno_t __pyx_v_errno; PyObject *__pyx_v_desc = 0; PyObject *__pyx_v_cls = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("parser_error_from_errno", 0); /* "aiohttp/_http_parser.pyx":787 * * cdef parser_error_from_errno(cparser.llhttp_t* parser): * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) # <<<<<<<<<<<<<< * cdef bytes desc = cparser.llhttp_get_error_reason(parser) * */ __pyx_v_errno = llhttp_get_errno(__pyx_v_parser); /* "aiohttp/_http_parser.pyx":788 * cdef parser_error_from_errno(cparser.llhttp_t* parser): * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) * cdef bytes desc = cparser.llhttp_get_error_reason(parser) # <<<<<<<<<<<<<< * * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, */ __pyx_t_1 = __Pyx_PyBytes_FromString(llhttp_get_error_reason(__pyx_v_parser)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 788, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_desc = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":790 * cdef bytes desc = cparser.llhttp_get_error_reason(parser) * * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, # <<<<<<<<<<<<<< * cparser.HPE_CB_HEADERS_COMPLETE, * cparser.HPE_CB_MESSAGE_COMPLETE, */ switch (__pyx_v_errno) { case HPE_CB_MESSAGE_BEGIN: case HPE_CB_HEADERS_COMPLETE: /* "aiohttp/_http_parser.pyx":791 * * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, * cparser.HPE_CB_HEADERS_COMPLETE, # <<<<<<<<<<<<<< * cparser.HPE_CB_MESSAGE_COMPLETE, * cparser.HPE_CB_CHUNK_HEADER, */ case HPE_CB_MESSAGE_COMPLETE: /* "aiohttp/_http_parser.pyx":792 * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, * cparser.HPE_CB_HEADERS_COMPLETE, * cparser.HPE_CB_MESSAGE_COMPLETE, # <<<<<<<<<<<<<< * cparser.HPE_CB_CHUNK_HEADER, * cparser.HPE_CB_CHUNK_COMPLETE, */ case HPE_CB_CHUNK_HEADER: /* "aiohttp/_http_parser.pyx":793 * cparser.HPE_CB_HEADERS_COMPLETE, * cparser.HPE_CB_MESSAGE_COMPLETE, * cparser.HPE_CB_CHUNK_HEADER, # <<<<<<<<<<<<<< * cparser.HPE_CB_CHUNK_COMPLETE, * cparser.HPE_INVALID_CONSTANT, */ case HPE_CB_CHUNK_COMPLETE: /* "aiohttp/_http_parser.pyx":794 * cparser.HPE_CB_MESSAGE_COMPLETE, * cparser.HPE_CB_CHUNK_HEADER, * cparser.HPE_CB_CHUNK_COMPLETE, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_CONSTANT, * cparser.HPE_INVALID_HEADER_TOKEN, */ case HPE_INVALID_CONSTANT: /* "aiohttp/_http_parser.pyx":795 * cparser.HPE_CB_CHUNK_HEADER, * cparser.HPE_CB_CHUNK_COMPLETE, * cparser.HPE_INVALID_CONSTANT, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_HEADER_TOKEN, * cparser.HPE_INVALID_CONTENT_LENGTH, */ case HPE_INVALID_HEADER_TOKEN: /* "aiohttp/_http_parser.pyx":796 * cparser.HPE_CB_CHUNK_COMPLETE, * cparser.HPE_INVALID_CONSTANT, * cparser.HPE_INVALID_HEADER_TOKEN, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_CONTENT_LENGTH, * cparser.HPE_INVALID_CHUNK_SIZE, */ case HPE_INVALID_CONTENT_LENGTH: /* "aiohttp/_http_parser.pyx":797 * cparser.HPE_INVALID_CONSTANT, * cparser.HPE_INVALID_HEADER_TOKEN, * cparser.HPE_INVALID_CONTENT_LENGTH, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_CHUNK_SIZE, * cparser.HPE_INVALID_EOF_STATE, */ case HPE_INVALID_CHUNK_SIZE: /* "aiohttp/_http_parser.pyx":798 * cparser.HPE_INVALID_HEADER_TOKEN, * cparser.HPE_INVALID_CONTENT_LENGTH, * cparser.HPE_INVALID_CHUNK_SIZE, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_EOF_STATE, * cparser.HPE_INVALID_TRANSFER_ENCODING): */ case HPE_INVALID_EOF_STATE: /* "aiohttp/_http_parser.pyx":799 * cparser.HPE_INVALID_CONTENT_LENGTH, * cparser.HPE_INVALID_CHUNK_SIZE, * cparser.HPE_INVALID_EOF_STATE, # <<<<<<<<<<<<<< * cparser.HPE_INVALID_TRANSFER_ENCODING): * cls = BadHttpMessage */ case HPE_INVALID_TRANSFER_ENCODING: /* "aiohttp/_http_parser.pyx":801 * cparser.HPE_INVALID_EOF_STATE, * cparser.HPE_INVALID_TRANSFER_ENCODING): * cls = BadHttpMessage # <<<<<<<<<<<<<< * * elif errno == cparser.HPE_INVALID_STATUS: */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 801, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_cls = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":790 * cdef bytes desc = cparser.llhttp_get_error_reason(parser) * * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, # <<<<<<<<<<<<<< * cparser.HPE_CB_HEADERS_COMPLETE, * cparser.HPE_CB_MESSAGE_COMPLETE, */ break; case HPE_INVALID_STATUS: /* "aiohttp/_http_parser.pyx":804 * * elif errno == cparser.HPE_INVALID_STATUS: * cls = BadStatusLine # <<<<<<<<<<<<<< * * elif errno == cparser.HPE_INVALID_METHOD: */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 804, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_cls = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":803 * cls = BadHttpMessage * * elif errno == cparser.HPE_INVALID_STATUS: # <<<<<<<<<<<<<< * cls = BadStatusLine * */ break; case HPE_INVALID_METHOD: /* "aiohttp/_http_parser.pyx":807 * * elif errno == cparser.HPE_INVALID_METHOD: * cls = BadStatusLine # <<<<<<<<<<<<<< * * elif errno == cparser.HPE_INVALID_VERSION: */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 807, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_cls = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":806 * cls = BadStatusLine * * elif errno == cparser.HPE_INVALID_METHOD: # <<<<<<<<<<<<<< * cls = BadStatusLine * */ break; case HPE_INVALID_VERSION: /* "aiohttp/_http_parser.pyx":810 * * elif errno == cparser.HPE_INVALID_VERSION: * cls = BadStatusLine # <<<<<<<<<<<<<< * * elif errno == cparser.HPE_INVALID_URL: */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 810, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_cls = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":809 * cls = BadStatusLine * * elif errno == cparser.HPE_INVALID_VERSION: # <<<<<<<<<<<<<< * cls = BadStatusLine * */ break; case HPE_INVALID_URL: /* "aiohttp/_http_parser.pyx":813 * * elif errno == cparser.HPE_INVALID_URL: * cls = InvalidURLError # <<<<<<<<<<<<<< * * else: */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_InvalidURLError); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 813, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_cls = __pyx_t_1; __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":812 * cls = BadStatusLine * * elif errno == cparser.HPE_INVALID_URL: # <<<<<<<<<<<<<< * cls = InvalidURLError * */ break; default: /* "aiohttp/_http_parser.pyx":816 * * else: * cls = BadHttpMessage # <<<<<<<<<<<<<< * * return cls(desc.decode('latin-1')) */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 816, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_cls = __pyx_t_1; __pyx_t_1 = 0; break; } /* "aiohttp/_http_parser.pyx":818 * cls = BadHttpMessage * * return cls(desc.decode('latin-1')) # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __pyx_t_2 = __Pyx_decode_bytes(__pyx_v_desc, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeLatin1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 818, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_cls); __pyx_t_3 = __pyx_v_cls; __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 818, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "aiohttp/_http_parser.pyx":786 * * * cdef parser_error_from_errno(cparser.llhttp_t* parser): # <<<<<<<<<<<<<< * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) * cdef bytes desc = cparser.llhttp_get_error_reason(parser) */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("aiohttp._http_parser.parser_error_from_errno", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_desc); __Pyx_XDECREF(__pyx_v_cls); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage = {"__pyx_unpickle_RawRequestMessage", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v___pyx_type = 0; long __pyx_v___pyx_checksum; PyObject *__pyx_v___pyx_state = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; PyObject* values[3] = {0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_RawRequestMessage") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v___pyx_type = values[0]; __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) __pyx_v___pyx_state = values[2]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_v___pyx_PickleError = 0; PyObject *__pyx_v___pyx_result = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage", 0); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum != 0x1408252: # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) */ __pyx_t_1 = ((__pyx_v___pyx_checksum != 0x1408252) != 0); if (__pyx_t_1) { /* "(tree fragment)":5 * cdef object __pyx_result * if __pyx_checksum != 0x1408252: * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) * __pyx_result = RawRequestMessage.__new__(__pyx_type) */ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_PickleError); __Pyx_GIVEREF(__pyx_n_s_PickleError); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_t_2); __pyx_v___pyx_PickleError = __pyx_t_2; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":6 * if __pyx_checksum != 0x1408252: * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) # <<<<<<<<<<<<<< * __pyx_result = RawRequestMessage.__new__(__pyx_type) * if __pyx_state is not None: */ __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0x14, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_INCREF(__pyx_v___pyx_PickleError); __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 6, __pyx_L1_error) /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum != 0x1408252: # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) */ } /* "(tree fragment)":7 * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) * __pyx_result = RawRequestMessage.__new__(__pyx_type) # <<<<<<<<<<<<<< * if __pyx_state is not None: * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v___pyx_result = __pyx_t_3; __pyx_t_3 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) * __pyx_result = RawRequestMessage.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result */ __pyx_t_1 = (__pyx_v___pyx_state != Py_None); __pyx_t_6 = (__pyx_t_1 != 0); if (__pyx_t_6) { /* "(tree fragment)":9 * __pyx_result = RawRequestMessage.__new__(__pyx_type) * if __pyx_state is not None: * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< * return __pyx_result * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) * __pyx_result = RawRequestMessage.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result */ } /* "(tree fragment)":10 * if __pyx_state is not None: * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result # <<<<<<<<<<<<<< * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v___pyx_result); __pyx_r = __pyx_v___pyx_result; goto __pyx_L0; /* "(tree fragment)":1 * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v___pyx_PickleError); __Pyx_XDECREF(__pyx_v___pyx_result); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":11 * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): */ static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; Py_ssize_t __pyx_t_3; int __pyx_t_4; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage__set_state", 0); /* "(tree fragment)":12 * return __pyx_result * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] # <<<<<<<<<<<<<< * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[10]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->chunked); __Pyx_DECREF(__pyx_v___pyx_result->chunked); __pyx_v___pyx_result->chunked = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->compression); __Pyx_DECREF(__pyx_v___pyx_result->compression); __pyx_v___pyx_result->compression = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->headers); __Pyx_DECREF(__pyx_v___pyx_result->headers); __pyx_v___pyx_result->headers = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->method); __Pyx_DECREF(__pyx_v___pyx_result->method); __pyx_v___pyx_result->method = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->path); __Pyx_DECREF(__pyx_v___pyx_result->path); __pyx_v___pyx_result->path = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->raw_headers); __Pyx_DECREF(__pyx_v___pyx_result->raw_headers); __pyx_v___pyx_result->raw_headers = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->should_close); __Pyx_DECREF(__pyx_v___pyx_result->should_close); __pyx_v___pyx_result->should_close = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->upgrade); __Pyx_DECREF(__pyx_v___pyx_result->upgrade); __pyx_v___pyx_result->upgrade = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 8, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->url); __Pyx_DECREF(__pyx_v___pyx_result->url); __pyx_v___pyx_result->url = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 9, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->version); __Pyx_DECREF(__pyx_v___pyx_result->version); __pyx_v___pyx_result->version = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[10]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(1, 13, __pyx_L1_error) } __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_4 = ((__pyx_t_3 > 10) != 0); if (__pyx_t_4) { } else { __pyx_t_2 = __pyx_t_4; goto __pyx_L4_bool_binop_done; } __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_5 = (__pyx_t_4 != 0); __pyx_t_2 = __pyx_t_5; __pyx_L4_bool_binop_done:; if (__pyx_t_2) { /* "(tree fragment)":14 * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[10]) # <<<<<<<<<<<<<< */ __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 14, __pyx_L1_error) } __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 10, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_8 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_8)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_8); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); } } __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[10]) */ } /* "(tree fragment)":11 * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __pyx_unpickle_RawResponseMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage = {"__pyx_unpickle_RawResponseMessage", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v___pyx_type = 0; long __pyx_v___pyx_checksum; PyObject *__pyx_v___pyx_state = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; PyObject* values[3] = {0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_RawResponseMessage") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v___pyx_type = values[0]; __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) __pyx_v___pyx_state = values[2]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_12_http_parser_2__pyx_unpickle_RawResponseMessage(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_parser_2__pyx_unpickle_RawResponseMessage(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_v___pyx_PickleError = 0; PyObject *__pyx_v___pyx_result = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage", 0); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum != 0xc7706dc: # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) */ __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xc7706dc) != 0); if (__pyx_t_1) { /* "(tree fragment)":5 * cdef object __pyx_result * if __pyx_checksum != 0xc7706dc: * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) * __pyx_result = RawResponseMessage.__new__(__pyx_type) */ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_PickleError); __Pyx_GIVEREF(__pyx_n_s_PickleError); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_t_2); __pyx_v___pyx_PickleError = __pyx_t_2; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":6 * if __pyx_checksum != 0xc7706dc: * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) # <<<<<<<<<<<<<< * __pyx_result = RawResponseMessage.__new__(__pyx_type) * if __pyx_state is not None: */ __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xc7, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_INCREF(__pyx_v___pyx_PickleError); __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 6, __pyx_L1_error) /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result * if __pyx_checksum != 0xc7706dc: # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) */ } /* "(tree fragment)":7 * from pickle import PickleError as __pyx_PickleError * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) * __pyx_result = RawResponseMessage.__new__(__pyx_type) # <<<<<<<<<<<<<< * if __pyx_state is not None: * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) */ __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v___pyx_result = __pyx_t_3; __pyx_t_3 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) * __pyx_result = RawResponseMessage.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result */ __pyx_t_1 = (__pyx_v___pyx_state != Py_None); __pyx_t_6 = (__pyx_t_1 != 0); if (__pyx_t_6) { /* "(tree fragment)":9 * __pyx_result = RawResponseMessage.__new__(__pyx_type) * if __pyx_state is not None: * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< * return __pyx_result * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): */ if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "(tree fragment)":8 * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) * __pyx_result = RawResponseMessage.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result */ } /* "(tree fragment)":10 * if __pyx_state is not None: * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result # <<<<<<<<<<<<<< * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v___pyx_result); __pyx_r = __pyx_v___pyx_result; goto __pyx_L0; /* "(tree fragment)":1 * def __pyx_unpickle_RawResponseMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v___pyx_PickleError); __Pyx_XDECREF(__pyx_v___pyx_result); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":11 * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): */ static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; int __pyx_t_3; Py_ssize_t __pyx_t_4; int __pyx_t_5; int __pyx_t_6; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage__set_state", 0); /* "(tree fragment)":12 * return __pyx_result * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] # <<<<<<<<<<<<<< * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[9]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->chunked); __Pyx_DECREF(__pyx_v___pyx_result->chunked); __pyx_v___pyx_result->chunked = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v___pyx_result->code = __pyx_t_2; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->compression); __Pyx_DECREF(__pyx_v___pyx_result->compression); __pyx_v___pyx_result->compression = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->headers); __Pyx_DECREF(__pyx_v___pyx_result->headers); __pyx_v___pyx_result->headers = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->raw_headers); __Pyx_DECREF(__pyx_v___pyx_result->raw_headers); __pyx_v___pyx_result->raw_headers = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->reason); __Pyx_DECREF(__pyx_v___pyx_result->reason); __pyx_v___pyx_result->reason = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->should_close); __Pyx_DECREF(__pyx_v___pyx_result->should_close); __pyx_v___pyx_result->should_close = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->upgrade); __Pyx_DECREF(__pyx_v___pyx_result->upgrade); __pyx_v___pyx_result->upgrade = __pyx_t_1; __pyx_t_1 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 12, __pyx_L1_error) } __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 8, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __Pyx_GOTREF(__pyx_v___pyx_result->version); __Pyx_DECREF(__pyx_v___pyx_result->version); __pyx_v___pyx_result->version = __pyx_t_1; __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[9]) */ if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); __PYX_ERR(1, 13, __pyx_L1_error) } __pyx_t_4 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_5 = ((__pyx_t_4 > 9) != 0); if (__pyx_t_5) { } else { __pyx_t_3 = __pyx_t_5; goto __pyx_L4_bool_binop_done; } __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) __pyx_t_6 = (__pyx_t_5 != 0); __pyx_t_3 = __pyx_t_6; __pyx_L4_bool_binop_done:; if (__pyx_t_3) { /* "(tree fragment)":14 * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): * __pyx_result.__dict__.update(__pyx_state[9]) # <<<<<<<<<<<<<< */ __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_update); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; if (unlikely(__pyx_v___pyx_state == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 14, __pyx_L1_error) } __pyx_t_7 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 9, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_9 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) { __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_8); if (likely(__pyx_t_9)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); __Pyx_INCREF(__pyx_t_9); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_8, function); } } __pyx_t_1 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_8, __pyx_t_9, __pyx_t_7) : __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_7); __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":13 * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< * __pyx_result.__dict__.update(__pyx_state[9]) */ } /* "(tree fragment)":11 * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[250]; static int __pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage = 0; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p; PyObject *o; if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)) & ((t->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[--__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage]; memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)); (void) PyObject_INIT(o, t); PyObject_GC_Track(o); } else { if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { o = (*t->tp_alloc)(t, 0); } else { o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; } p = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o); p->method = ((PyObject*)Py_None); Py_INCREF(Py_None); p->path = ((PyObject*)Py_None); Py_INCREF(Py_None); p->version = Py_None; Py_INCREF(Py_None); p->headers = Py_None; Py_INCREF(Py_None); p->raw_headers = Py_None; Py_INCREF(Py_None); p->should_close = Py_None; Py_INCREF(Py_None); p->compression = Py_None; Py_INCREF(Py_None); p->upgrade = Py_None; Py_INCREF(Py_None); p->chunked = Py_None; Py_INCREF(Py_None); p->url = Py_None; Py_INCREF(Py_None); return o; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; #if CYTHON_USE_TP_FINALIZE if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { if (PyObject_CallFinalizerFromDealloc(o)) return; } #endif PyObject_GC_UnTrack(o); Py_CLEAR(p->method); Py_CLEAR(p->path); Py_CLEAR(p->version); Py_CLEAR(p->headers); Py_CLEAR(p->raw_headers); Py_CLEAR(p->should_close); Py_CLEAR(p->compression); Py_CLEAR(p->upgrade); Py_CLEAR(p->chunked); Py_CLEAR(p->url); if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage < 250) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)) & ((Py_TYPE(o)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { __pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage++] = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o); } else { (*Py_TYPE(o)->tp_free)(o); } } static int __pyx_tp_traverse_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; if (p->version) { e = (*v)(p->version, a); if (e) return e; } if (p->headers) { e = (*v)(p->headers, a); if (e) return e; } if (p->raw_headers) { e = (*v)(p->raw_headers, a); if (e) return e; } if (p->should_close) { e = (*v)(p->should_close, a); if (e) return e; } if (p->compression) { e = (*v)(p->compression, a); if (e) return e; } if (p->upgrade) { e = (*v)(p->upgrade, a); if (e) return e; } if (p->chunked) { e = (*v)(p->chunked, a); if (e) return e; } if (p->url) { e = (*v)(p->url, a); if (e) return e; } return 0; } static int __pyx_tp_clear_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o) { PyObject* tmp; struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; tmp = ((PyObject*)p->version); p->version = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->headers); p->headers = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->raw_headers); p->raw_headers = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->should_close); p->should_close = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->compression); p->compression = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->upgrade); p->upgrade = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->chunked); p->chunked = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->url); p->url = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); return 0; } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_method(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_path(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_version(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_headers(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_raw_headers(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_should_close(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_compression(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_upgrade(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_chunked(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_url(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(o); } static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_RawRequestMessage[] = { {"_replace", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace, METH_VARARGS|METH_KEYWORDS, 0}, {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__, METH_NOARGS, 0}, {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__, METH_O, 0}, {0, 0, 0, 0} }; static struct PyGetSetDef __pyx_getsets_7aiohttp_12_http_parser_RawRequestMessage[] = { {(char *)"method", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_method, 0, (char *)0, 0}, {(char *)"path", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_path, 0, (char *)0, 0}, {(char *)"version", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_version, 0, (char *)0, 0}, {(char *)"headers", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_headers, 0, (char *)0, 0}, {(char *)"raw_headers", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_raw_headers, 0, (char *)0, 0}, {(char *)"should_close", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_should_close, 0, (char *)0, 0}, {(char *)"compression", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_compression, 0, (char *)0, 0}, {(char *)"upgrade", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_upgrade, 0, (char *)0, 0}, {(char *)"chunked", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_chunked, 0, (char *)0, 0}, {(char *)"url", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_url, 0, (char *)0, 0}, {0, 0, 0, 0, 0} }; static PyTypeObject __pyx_type_7aiohttp_12_http_parser_RawRequestMessage = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.RawRequestMessage", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser_RawRequestMessage, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser_RawRequestMessage, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser_RawRequestMessage, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_12_http_parser_RawRequestMessage, /*tp_methods*/ 0, /*tp_members*/ __pyx_getsets_7aiohttp_12_http_parser_RawRequestMessage, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[250]; static int __pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage = 0; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p; PyObject *o; if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)) & ((t->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[--__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage]; memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)); (void) PyObject_INIT(o, t); PyObject_GC_Track(o); } else { if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { o = (*t->tp_alloc)(t, 0); } else { o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; } p = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o); p->version = Py_None; Py_INCREF(Py_None); p->reason = ((PyObject*)Py_None); Py_INCREF(Py_None); p->headers = Py_None; Py_INCREF(Py_None); p->raw_headers = Py_None; Py_INCREF(Py_None); p->should_close = Py_None; Py_INCREF(Py_None); p->compression = Py_None; Py_INCREF(Py_None); p->upgrade = Py_None; Py_INCREF(Py_None); p->chunked = Py_None; Py_INCREF(Py_None); return o; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; #if CYTHON_USE_TP_FINALIZE if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { if (PyObject_CallFinalizerFromDealloc(o)) return; } #endif PyObject_GC_UnTrack(o); Py_CLEAR(p->version); Py_CLEAR(p->reason); Py_CLEAR(p->headers); Py_CLEAR(p->raw_headers); Py_CLEAR(p->should_close); Py_CLEAR(p->compression); Py_CLEAR(p->upgrade); Py_CLEAR(p->chunked); if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage < 250) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)) & ((Py_TYPE(o)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { __pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage++] = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o); } else { (*Py_TYPE(o)->tp_free)(o); } } static int __pyx_tp_traverse_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; if (p->version) { e = (*v)(p->version, a); if (e) return e; } if (p->headers) { e = (*v)(p->headers, a); if (e) return e; } if (p->raw_headers) { e = (*v)(p->raw_headers, a); if (e) return e; } if (p->should_close) { e = (*v)(p->should_close, a); if (e) return e; } if (p->compression) { e = (*v)(p->compression, a); if (e) return e; } if (p->upgrade) { e = (*v)(p->upgrade, a); if (e) return e; } if (p->chunked) { e = (*v)(p->chunked, a); if (e) return e; } return 0; } static int __pyx_tp_clear_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o) { PyObject* tmp; struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; tmp = ((PyObject*)p->version); p->version = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->headers); p->headers = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->raw_headers); p->raw_headers = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->should_close); p->should_close = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->compression); p->compression = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->upgrade); p->upgrade = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->chunked); p->chunked = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); return 0; } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_version(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_code(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_reason(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_headers(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_raw_headers(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_should_close(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_compression(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_upgrade(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(o); } static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_chunked(PyObject *o, CYTHON_UNUSED void *x) { return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(o); } static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_RawResponseMessage[] = { {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__, METH_NOARGS, 0}, {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__, METH_O, 0}, {0, 0, 0, 0} }; static struct PyGetSetDef __pyx_getsets_7aiohttp_12_http_parser_RawResponseMessage[] = { {(char *)"version", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_version, 0, (char *)0, 0}, {(char *)"code", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_code, 0, (char *)0, 0}, {(char *)"reason", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_reason, 0, (char *)0, 0}, {(char *)"headers", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_headers, 0, (char *)0, 0}, {(char *)"raw_headers", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_raw_headers, 0, (char *)0, 0}, {(char *)"should_close", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_should_close, 0, (char *)0, 0}, {(char *)"compression", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_compression, 0, (char *)0, 0}, {(char *)"upgrade", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_upgrade, 0, (char *)0, 0}, {(char *)"chunked", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_chunked, 0, (char *)0, 0}, {0, 0, 0, 0, 0} }; static PyTypeObject __pyx_type_7aiohttp_12_http_parser_RawResponseMessage = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.RawResponseMessage", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser_RawResponseMessage, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser_RawResponseMessage, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser_RawResponseMessage, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_12_http_parser_RawResponseMessage, /*tp_methods*/ 0, /*tp_members*/ __pyx_getsets_7aiohttp_12_http_parser_RawResponseMessage, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_vtable_7aiohttp_12_http_parser_HttpParser; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpParser(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p; PyObject *o; if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { o = (*t->tp_alloc)(t, 0); } else { o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o); p->__pyx_vtab = __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; p->_raw_name = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_raw_value = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_protocol = Py_None; Py_INCREF(Py_None); p->_loop = Py_None; Py_INCREF(Py_None); p->_timer = Py_None; Py_INCREF(Py_None); p->_url = Py_None; Py_INCREF(Py_None); p->_buf = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_path = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_reason = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_headers = Py_None; Py_INCREF(Py_None); p->_raw_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_messages = ((PyObject*)Py_None); Py_INCREF(Py_None); p->_payload = Py_None; Py_INCREF(Py_None); p->_payload_exception = Py_None; Py_INCREF(Py_None); p->_last_error = Py_None; Py_INCREF(Py_None); p->_content_encoding = ((PyObject*)Py_None); Py_INCREF(Py_None); p->py_buf.obj = NULL; if (unlikely(__pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad; return o; bad: Py_DECREF(o); o = 0; return NULL; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; #if CYTHON_USE_TP_FINALIZE if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { if (PyObject_CallFinalizerFromDealloc(o)) return; } #endif PyObject_GC_UnTrack(o); { PyObject *etype, *eval, *etb; PyErr_Fetch(&etype, &eval, &etb); __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(o); __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); PyErr_Restore(etype, eval, etb); } Py_CLEAR(p->_raw_name); Py_CLEAR(p->_raw_value); Py_CLEAR(p->_protocol); Py_CLEAR(p->_loop); Py_CLEAR(p->_timer); Py_CLEAR(p->_url); Py_CLEAR(p->_buf); Py_CLEAR(p->_path); Py_CLEAR(p->_reason); Py_CLEAR(p->_headers); Py_CLEAR(p->_raw_headers); Py_CLEAR(p->_messages); Py_CLEAR(p->_payload); Py_CLEAR(p->_payload_exception); Py_CLEAR(p->_last_error); Py_CLEAR(p->_content_encoding); (*Py_TYPE(o)->tp_free)(o); } static int __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; if (p->_protocol) { e = (*v)(p->_protocol, a); if (e) return e; } if (p->_loop) { e = (*v)(p->_loop, a); if (e) return e; } if (p->_timer) { e = (*v)(p->_timer, a); if (e) return e; } if (p->_url) { e = (*v)(p->_url, a); if (e) return e; } if (p->_headers) { e = (*v)(p->_headers, a); if (e) return e; } if (p->_raw_headers) { e = (*v)(p->_raw_headers, a); if (e) return e; } if (p->_messages) { e = (*v)(p->_messages, a); if (e) return e; } if (p->_payload) { e = (*v)(p->_payload, a); if (e) return e; } if (p->_payload_exception) { e = (*v)(p->_payload_exception, a); if (e) return e; } if (p->_last_error) { e = (*v)(p->_last_error, a); if (e) return e; } if (p->py_buf.obj) { e = (*v)(p->py_buf.obj, a); if (e) return e; } return 0; } static int __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser(PyObject *o) { PyObject* tmp; struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; tmp = ((PyObject*)p->_protocol); p->_protocol = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_loop); p->_loop = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_timer); p->_timer = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_url); p->_url = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_headers); p->_headers = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_raw_headers); p->_raw_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_messages); p->_messages = ((PyObject*)Py_None); Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_payload); p->_payload = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_payload_exception); p->_payload_exception = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); tmp = ((PyObject*)p->_last_error); p->_last_error = Py_None; Py_INCREF(Py_None); Py_XDECREF(tmp); Py_CLEAR(p->py_buf.obj); return 0; } static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpParser[] = { {"feed_eof", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof, METH_NOARGS, 0}, {"feed_data", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data, METH_O, 0}, {"set_upgraded", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded, METH_O, 0}, {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__, METH_NOARGS, 0}, {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__, METH_O, 0}, {0, 0, 0, 0} }; static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpParser = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.HttpParser", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_12_http_parser_HttpParser, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser_HttpParser, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpRequestParser(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *p; PyObject *o = __pyx_tp_new_7aiohttp_12_http_parser_HttpParser(t, a, k); if (unlikely(!o)) return 0; p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)o); p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser*)__pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser; return o; } static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpRequestParser[] = { {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__, METH_NOARGS, 0}, {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__, METH_O, 0}, {0, 0, 0, 0} }; static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpRequestParser = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.HttpRequestParser", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_12_http_parser_HttpRequestParser, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser_HttpRequestParser, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpResponseParser(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *p; PyObject *o = __pyx_tp_new_7aiohttp_12_http_parser_HttpParser(t, a, k); if (unlikely(!o)) return 0; p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)o); p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser*)__pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser; return o; } static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpResponseParser[] = { {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__, METH_NOARGS, 0}, {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__, METH_O, 0}, {0, 0, 0, 0} }; static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpResponseParser = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.HttpResponseParser", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7aiohttp_12_http_parser_HttpResponseParser, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser_HttpResponseParser, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct____repr__[8]; static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = 0; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { PyObject *o; if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__ > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__)))) { o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct____repr__[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__]; memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__)); (void) PyObject_INIT(o, t); PyObject_GC_Track(o); } else { o = (*t->tp_alloc)(t, 0); if (unlikely(!o)) return 0; } return o; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o; PyObject_GC_UnTrack(o); Py_CLEAR(p->__pyx_v_info); if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__ < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__)))) { __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct____repr__[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o); } else { (*Py_TYPE(o)->tp_free)(o); } } static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o; if (p->__pyx_v_info) { e = (*v)(p->__pyx_v_info, a); if (e) return e; } return 0; } static int __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyObject *o) { PyObject* tmp; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o; tmp = ((PyObject*)p->__pyx_v_info); p->__pyx_v_info = ((PyObject*)Py_None); Py_INCREF(Py_None); Py_XDECREF(tmp); return 0; } static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.__pyx_scope_struct____repr__", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[8]; static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = 0; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { PyObject *o; if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)))) { o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr]; memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)); (void) PyObject_INIT(o, t); PyObject_GC_Track(o); } else { o = (*t->tp_alloc)(t, 0); if (unlikely(!o)) return 0; } return o; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o; PyObject_GC_UnTrack(o); Py_CLEAR(p->__pyx_outer_scope); Py_CLEAR(p->__pyx_v_name); Py_CLEAR(p->__pyx_v_val); if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)))) { __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o); } else { (*Py_TYPE(o)->tp_free)(o); } } static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o; if (p->__pyx_outer_scope) { e = (*v)(((PyObject *)p->__pyx_outer_scope), a); if (e) return e; } if (p->__pyx_v_name) { e = (*v)(p->__pyx_v_name, a); if (e) return e; } if (p->__pyx_v_val) { e = (*v)(p->__pyx_v_val, a); if (e) return e; } return 0; } static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.__pyx_scope_struct_1_genexpr", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__[8]; static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = 0; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { PyObject *o; if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__)))) { o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__]; memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__)); (void) PyObject_INIT(o, t); PyObject_GC_Track(o); } else { o = (*t->tp_alloc)(t, 0); if (unlikely(!o)) return 0; } return o; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o; PyObject_GC_UnTrack(o); Py_CLEAR(p->__pyx_v_info); if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__)))) { __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o); } else { (*Py_TYPE(o)->tp_free)(o); } } static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o; if (p->__pyx_v_info) { e = (*v)(p->__pyx_v_info, a); if (e) return e; } return 0; } static int __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyObject *o) { PyObject* tmp; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o; tmp = ((PyObject*)p->__pyx_v_info); p->__pyx_v_info = ((PyObject*)Py_None); Py_INCREF(Py_None); Py_XDECREF(tmp); return 0; } static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.__pyx_scope_struct_2___repr__", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_traverse*/ __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr[8]; static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = 0; static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { PyObject *o; if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr)))) { o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr]; memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr)); (void) PyObject_INIT(o, t); PyObject_GC_Track(o); } else { o = (*t->tp_alloc)(t, 0); if (unlikely(!o)) return 0; } return o; } static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(PyObject *o) { struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)o; PyObject_GC_UnTrack(o); Py_CLEAR(p->__pyx_outer_scope); Py_CLEAR(p->__pyx_v_name); Py_CLEAR(p->__pyx_v_val); if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr)))) { __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)o); } else { (*Py_TYPE(o)->tp_free)(o); } } static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)o; if (p->__pyx_outer_scope) { e = (*v)(((PyObject *)p->__pyx_outer_scope), a); if (e) return e; } if (p->__pyx_v_name) { e = (*v)(p->__pyx_v_name, a); if (e) return e; } if (p->__pyx_v_val) { e = (*v)(p->__pyx_v_val, a); if (e) return e; } return 0; } static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = { PyVarObject_HEAD_INIT(0, 0) "aiohttp._http_parser.__pyx_scope_struct_3_genexpr", /*tp_name*/ sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif #if PY_VERSION_HEX >= 0x030800b1 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif }; static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec__http_parser(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec__http_parser}, {0, NULL} }; #endif static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, "_http_parser", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, {&__pyx_n_s_ACCEPT, __pyx_k_ACCEPT, sizeof(__pyx_k_ACCEPT), 0, 0, 1, 1}, {&__pyx_n_s_ACCEPT_CHARSET, __pyx_k_ACCEPT_CHARSET, sizeof(__pyx_k_ACCEPT_CHARSET), 0, 0, 1, 1}, {&__pyx_n_s_ACCEPT_ENCODING, __pyx_k_ACCEPT_ENCODING, sizeof(__pyx_k_ACCEPT_ENCODING), 0, 0, 1, 1}, {&__pyx_n_s_ACCEPT_LANGUAGE, __pyx_k_ACCEPT_LANGUAGE, sizeof(__pyx_k_ACCEPT_LANGUAGE), 0, 0, 1, 1}, {&__pyx_n_s_ACCEPT_RANGES, __pyx_k_ACCEPT_RANGES, sizeof(__pyx_k_ACCEPT_RANGES), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS, __pyx_k_ACCESS_CONTROL_ALLOW_CREDENTIALS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_CREDENTIALS), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS, __pyx_k_ACCESS_CONTROL_ALLOW_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_HEADERS), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS, __pyx_k_ACCESS_CONTROL_ALLOW_METHODS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_METHODS), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN, __pyx_k_ACCESS_CONTROL_ALLOW_ORIGIN, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_ORIGIN), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS, __pyx_k_ACCESS_CONTROL_EXPOSE_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_EXPOSE_HEADERS), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_MAX_AGE, __pyx_k_ACCESS_CONTROL_MAX_AGE, sizeof(__pyx_k_ACCESS_CONTROL_MAX_AGE), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS, __pyx_k_ACCESS_CONTROL_REQUEST_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_REQUEST_HEADERS), 0, 0, 1, 1}, {&__pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD, __pyx_k_ACCESS_CONTROL_REQUEST_METHOD, sizeof(__pyx_k_ACCESS_CONTROL_REQUEST_METHOD), 0, 0, 1, 1}, {&__pyx_n_s_AGE, __pyx_k_AGE, sizeof(__pyx_k_AGE), 0, 0, 1, 1}, {&__pyx_n_s_ALLOW, __pyx_k_ALLOW, sizeof(__pyx_k_ALLOW), 0, 0, 1, 1}, {&__pyx_n_s_AUTHORIZATION, __pyx_k_AUTHORIZATION, sizeof(__pyx_k_AUTHORIZATION), 0, 0, 1, 1}, {&__pyx_n_s_BadHttpMessage, __pyx_k_BadHttpMessage, sizeof(__pyx_k_BadHttpMessage), 0, 0, 1, 1}, {&__pyx_n_s_BadStatusLine, __pyx_k_BadStatusLine, sizeof(__pyx_k_BadStatusLine), 0, 0, 1, 1}, {&__pyx_n_s_BaseException, __pyx_k_BaseException, sizeof(__pyx_k_BaseException), 0, 0, 1, 1}, {&__pyx_n_s_CACHE_CONTROL, __pyx_k_CACHE_CONTROL, sizeof(__pyx_k_CACHE_CONTROL), 0, 0, 1, 1}, {&__pyx_n_s_CIMultiDict, __pyx_k_CIMultiDict, sizeof(__pyx_k_CIMultiDict), 0, 0, 1, 1}, {&__pyx_n_s_CIMultiDictProxy, __pyx_k_CIMultiDictProxy, sizeof(__pyx_k_CIMultiDictProxy), 0, 0, 1, 1}, {&__pyx_n_s_CIMultiDictProxy_2, __pyx_k_CIMultiDictProxy_2, sizeof(__pyx_k_CIMultiDictProxy_2), 0, 0, 1, 1}, {&__pyx_n_s_CIMultiDict_2, __pyx_k_CIMultiDict_2, sizeof(__pyx_k_CIMultiDict_2), 0, 0, 1, 1}, {&__pyx_n_s_CONNECTION, __pyx_k_CONNECTION, sizeof(__pyx_k_CONNECTION), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_DISPOSITION, __pyx_k_CONTENT_DISPOSITION, sizeof(__pyx_k_CONTENT_DISPOSITION), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_ENCODING, __pyx_k_CONTENT_ENCODING, sizeof(__pyx_k_CONTENT_ENCODING), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_LANGUAGE, __pyx_k_CONTENT_LANGUAGE, sizeof(__pyx_k_CONTENT_LANGUAGE), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_LENGTH, __pyx_k_CONTENT_LENGTH, sizeof(__pyx_k_CONTENT_LENGTH), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_LOCATION, __pyx_k_CONTENT_LOCATION, sizeof(__pyx_k_CONTENT_LOCATION), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_MD5, __pyx_k_CONTENT_MD5, sizeof(__pyx_k_CONTENT_MD5), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_RANGE, __pyx_k_CONTENT_RANGE, sizeof(__pyx_k_CONTENT_RANGE), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_TRANSFER_ENCODING, __pyx_k_CONTENT_TRANSFER_ENCODING, sizeof(__pyx_k_CONTENT_TRANSFER_ENCODING), 0, 0, 1, 1}, {&__pyx_n_s_CONTENT_TYPE, __pyx_k_CONTENT_TYPE, sizeof(__pyx_k_CONTENT_TYPE), 0, 0, 1, 1}, {&__pyx_n_s_COOKIE, __pyx_k_COOKIE, sizeof(__pyx_k_COOKIE), 0, 0, 1, 1}, {&__pyx_n_s_ContentLengthError, __pyx_k_ContentLengthError, sizeof(__pyx_k_ContentLengthError), 0, 0, 1, 1}, {&__pyx_n_s_DATE, __pyx_k_DATE, sizeof(__pyx_k_DATE), 0, 0, 1, 1}, {&__pyx_n_s_DESTINATION, __pyx_k_DESTINATION, sizeof(__pyx_k_DESTINATION), 0, 0, 1, 1}, {&__pyx_n_s_DIGEST, __pyx_k_DIGEST, sizeof(__pyx_k_DIGEST), 0, 0, 1, 1}, {&__pyx_n_s_DeflateBuffer, __pyx_k_DeflateBuffer, sizeof(__pyx_k_DeflateBuffer), 0, 0, 1, 1}, {&__pyx_n_s_DeflateBuffer_2, __pyx_k_DeflateBuffer_2, sizeof(__pyx_k_DeflateBuffer_2), 0, 0, 1, 1}, {&__pyx_n_s_EMPTY_PAYLOAD, __pyx_k_EMPTY_PAYLOAD, sizeof(__pyx_k_EMPTY_PAYLOAD), 0, 0, 1, 1}, {&__pyx_n_s_EMPTY_PAYLOAD_2, __pyx_k_EMPTY_PAYLOAD_2, sizeof(__pyx_k_EMPTY_PAYLOAD_2), 0, 0, 1, 1}, {&__pyx_n_s_ETAG, __pyx_k_ETAG, sizeof(__pyx_k_ETAG), 0, 0, 1, 1}, {&__pyx_n_s_EXPECT, __pyx_k_EXPECT, sizeof(__pyx_k_EXPECT), 0, 0, 1, 1}, {&__pyx_n_s_EXPIRES, __pyx_k_EXPIRES, sizeof(__pyx_k_EXPIRES), 0, 0, 1, 1}, {&__pyx_n_s_FORWARDED, __pyx_k_FORWARDED, sizeof(__pyx_k_FORWARDED), 0, 0, 1, 1}, {&__pyx_n_s_FROM, __pyx_k_FROM, sizeof(__pyx_k_FROM), 0, 0, 1, 1}, {&__pyx_n_s_HOST, __pyx_k_HOST, sizeof(__pyx_k_HOST), 0, 0, 1, 1}, {&__pyx_kp_u_Header_name_is_too_long, __pyx_k_Header_name_is_too_long, sizeof(__pyx_k_Header_name_is_too_long), 0, 1, 0, 0}, {&__pyx_kp_u_Header_value_is_too_long, __pyx_k_Header_value_is_too_long, sizeof(__pyx_k_Header_value_is_too_long), 0, 1, 0, 0}, {&__pyx_n_s_HttpRequestParser, __pyx_k_HttpRequestParser, sizeof(__pyx_k_HttpRequestParser), 0, 0, 1, 1}, {&__pyx_n_u_HttpRequestParser, __pyx_k_HttpRequestParser, sizeof(__pyx_k_HttpRequestParser), 0, 1, 0, 1}, {&__pyx_n_s_HttpResponseParser, __pyx_k_HttpResponseParser, sizeof(__pyx_k_HttpResponseParser), 0, 0, 1, 1}, {&__pyx_n_u_HttpResponseParser, __pyx_k_HttpResponseParser, sizeof(__pyx_k_HttpResponseParser), 0, 1, 0, 1}, {&__pyx_n_s_HttpVersion, __pyx_k_HttpVersion, sizeof(__pyx_k_HttpVersion), 0, 0, 1, 1}, {&__pyx_n_s_HttpVersion10, __pyx_k_HttpVersion10, sizeof(__pyx_k_HttpVersion10), 0, 0, 1, 1}, {&__pyx_n_s_HttpVersion10_2, __pyx_k_HttpVersion10_2, sizeof(__pyx_k_HttpVersion10_2), 0, 0, 1, 1}, {&__pyx_n_s_HttpVersion11, __pyx_k_HttpVersion11, sizeof(__pyx_k_HttpVersion11), 0, 0, 1, 1}, {&__pyx_n_s_HttpVersion11_2, __pyx_k_HttpVersion11_2, sizeof(__pyx_k_HttpVersion11_2), 0, 0, 1, 1}, {&__pyx_n_s_HttpVersion_2, __pyx_k_HttpVersion_2, sizeof(__pyx_k_HttpVersion_2), 0, 0, 1, 1}, {&__pyx_n_s_IF_MATCH, __pyx_k_IF_MATCH, sizeof(__pyx_k_IF_MATCH), 0, 0, 1, 1}, {&__pyx_n_s_IF_MODIFIED_SINCE, __pyx_k_IF_MODIFIED_SINCE, sizeof(__pyx_k_IF_MODIFIED_SINCE), 0, 0, 1, 1}, {&__pyx_n_s_IF_NONE_MATCH, __pyx_k_IF_NONE_MATCH, sizeof(__pyx_k_IF_NONE_MATCH), 0, 0, 1, 1}, {&__pyx_n_s_IF_RANGE, __pyx_k_IF_RANGE, sizeof(__pyx_k_IF_RANGE), 0, 0, 1, 1}, {&__pyx_n_s_IF_UNMODIFIED_SINCE, __pyx_k_IF_UNMODIFIED_SINCE, sizeof(__pyx_k_IF_UNMODIFIED_SINCE), 0, 0, 1, 1}, {&__pyx_kp_s_Incompatible_checksums_s_vs_0x14, __pyx_k_Incompatible_checksums_s_vs_0x14, sizeof(__pyx_k_Incompatible_checksums_s_vs_0x14), 0, 0, 1, 0}, {&__pyx_kp_s_Incompatible_checksums_s_vs_0xc7, __pyx_k_Incompatible_checksums_s_vs_0xc7, sizeof(__pyx_k_Incompatible_checksums_s_vs_0xc7), 0, 0, 1, 0}, {&__pyx_n_s_InvalidHeader, __pyx_k_InvalidHeader, sizeof(__pyx_k_InvalidHeader), 0, 0, 1, 1}, {&__pyx_n_s_InvalidURLError, __pyx_k_InvalidURLError, sizeof(__pyx_k_InvalidURLError), 0, 0, 1, 1}, {&__pyx_n_s_KEEP_ALIVE, __pyx_k_KEEP_ALIVE, sizeof(__pyx_k_KEEP_ALIVE), 0, 0, 1, 1}, {&__pyx_n_s_LAST_EVENT_ID, __pyx_k_LAST_EVENT_ID, sizeof(__pyx_k_LAST_EVENT_ID), 0, 0, 1, 1}, {&__pyx_n_s_LAST_MODIFIED, __pyx_k_LAST_MODIFIED, sizeof(__pyx_k_LAST_MODIFIED), 0, 0, 1, 1}, {&__pyx_n_s_LINK, __pyx_k_LINK, sizeof(__pyx_k_LINK), 0, 0, 1, 1}, {&__pyx_n_s_LOCATION, __pyx_k_LOCATION, sizeof(__pyx_k_LOCATION), 0, 0, 1, 1}, {&__pyx_n_s_LineTooLong, __pyx_k_LineTooLong, sizeof(__pyx_k_LineTooLong), 0, 0, 1, 1}, {&__pyx_n_s_MAX_FORWARDS, __pyx_k_MAX_FORWARDS, sizeof(__pyx_k_MAX_FORWARDS), 0, 0, 1, 1}, {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, {&__pyx_kp_u_Not_enough_data_for_satisfy_cont, __pyx_k_Not_enough_data_for_satisfy_cont, sizeof(__pyx_k_Not_enough_data_for_satisfy_cont), 0, 1, 0, 0}, {&__pyx_kp_u_Not_enough_data_for_satisfy_tran, __pyx_k_Not_enough_data_for_satisfy_tran, sizeof(__pyx_k_Not_enough_data_for_satisfy_tran), 0, 1, 0, 0}, {&__pyx_n_s_ORIGIN, __pyx_k_ORIGIN, sizeof(__pyx_k_ORIGIN), 0, 0, 1, 1}, {&__pyx_n_s_PRAGMA, __pyx_k_PRAGMA, sizeof(__pyx_k_PRAGMA), 0, 0, 1, 1}, {&__pyx_n_s_PROXY_AUTHENTICATE, __pyx_k_PROXY_AUTHENTICATE, sizeof(__pyx_k_PROXY_AUTHENTICATE), 0, 0, 1, 1}, {&__pyx_n_s_PROXY_AUTHORIZATION, __pyx_k_PROXY_AUTHORIZATION, sizeof(__pyx_k_PROXY_AUTHORIZATION), 0, 0, 1, 1}, {&__pyx_n_s_PayloadEncodingError, __pyx_k_PayloadEncodingError, sizeof(__pyx_k_PayloadEncodingError), 0, 0, 1, 1}, {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, {&__pyx_n_s_RANGE, __pyx_k_RANGE, sizeof(__pyx_k_RANGE), 0, 0, 1, 1}, {&__pyx_n_s_REFERER, __pyx_k_REFERER, sizeof(__pyx_k_REFERER), 0, 0, 1, 1}, {&__pyx_n_s_RETRY_AFTER, __pyx_k_RETRY_AFTER, sizeof(__pyx_k_RETRY_AFTER), 0, 0, 1, 1}, {&__pyx_kp_u_RawRequestMessage, __pyx_k_RawRequestMessage, sizeof(__pyx_k_RawRequestMessage), 0, 1, 0, 0}, {&__pyx_n_s_RawRequestMessage_2, __pyx_k_RawRequestMessage_2, sizeof(__pyx_k_RawRequestMessage_2), 0, 0, 1, 1}, {&__pyx_n_u_RawRequestMessage_2, __pyx_k_RawRequestMessage_2, sizeof(__pyx_k_RawRequestMessage_2), 0, 1, 0, 1}, {&__pyx_kp_u_RawResponseMessage, __pyx_k_RawResponseMessage, sizeof(__pyx_k_RawResponseMessage), 0, 1, 0, 0}, {&__pyx_n_s_RawResponseMessage_2, __pyx_k_RawResponseMessage_2, sizeof(__pyx_k_RawResponseMessage_2), 0, 0, 1, 1}, {&__pyx_n_u_RawResponseMessage_2, __pyx_k_RawResponseMessage_2, sizeof(__pyx_k_RawResponseMessage_2), 0, 1, 0, 1}, {&__pyx_n_s_SEC_WEBSOCKET_ACCEPT, __pyx_k_SEC_WEBSOCKET_ACCEPT, sizeof(__pyx_k_SEC_WEBSOCKET_ACCEPT), 0, 0, 1, 1}, {&__pyx_n_s_SEC_WEBSOCKET_EXTENSIONS, __pyx_k_SEC_WEBSOCKET_EXTENSIONS, sizeof(__pyx_k_SEC_WEBSOCKET_EXTENSIONS), 0, 0, 1, 1}, {&__pyx_n_s_SEC_WEBSOCKET_KEY, __pyx_k_SEC_WEBSOCKET_KEY, sizeof(__pyx_k_SEC_WEBSOCKET_KEY), 0, 0, 1, 1}, {&__pyx_n_s_SEC_WEBSOCKET_KEY1, __pyx_k_SEC_WEBSOCKET_KEY1, sizeof(__pyx_k_SEC_WEBSOCKET_KEY1), 0, 0, 1, 1}, {&__pyx_n_s_SEC_WEBSOCKET_PROTOCOL, __pyx_k_SEC_WEBSOCKET_PROTOCOL, sizeof(__pyx_k_SEC_WEBSOCKET_PROTOCOL), 0, 0, 1, 1}, {&__pyx_n_s_SEC_WEBSOCKET_VERSION, __pyx_k_SEC_WEBSOCKET_VERSION, sizeof(__pyx_k_SEC_WEBSOCKET_VERSION), 0, 0, 1, 1}, {&__pyx_n_s_SERVER, __pyx_k_SERVER, sizeof(__pyx_k_SERVER), 0, 0, 1, 1}, {&__pyx_n_s_SET_COOKIE, __pyx_k_SET_COOKIE, sizeof(__pyx_k_SET_COOKIE), 0, 0, 1, 1}, {&__pyx_kp_u_Status_line_is_too_long, __pyx_k_Status_line_is_too_long, sizeof(__pyx_k_Status_line_is_too_long), 0, 1, 0, 0}, {&__pyx_n_s_StreamReader, __pyx_k_StreamReader, sizeof(__pyx_k_StreamReader), 0, 0, 1, 1}, {&__pyx_n_s_StreamReader_2, __pyx_k_StreamReader_2, sizeof(__pyx_k_StreamReader_2), 0, 0, 1, 1}, {&__pyx_n_s_TE, __pyx_k_TE, sizeof(__pyx_k_TE), 0, 0, 1, 1}, {&__pyx_n_s_TRAILER, __pyx_k_TRAILER, sizeof(__pyx_k_TRAILER), 0, 0, 1, 1}, {&__pyx_n_s_TRANSFER_ENCODING, __pyx_k_TRANSFER_ENCODING, sizeof(__pyx_k_TRANSFER_ENCODING), 0, 0, 1, 1}, {&__pyx_n_s_TransferEncodingError, __pyx_k_TransferEncodingError, sizeof(__pyx_k_TransferEncodingError), 0, 0, 1, 1}, {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, {&__pyx_n_s_UPGRADE, __pyx_k_UPGRADE, sizeof(__pyx_k_UPGRADE), 0, 0, 1, 1}, {&__pyx_n_s_URI, __pyx_k_URI, sizeof(__pyx_k_URI), 0, 0, 1, 1}, {&__pyx_n_s_URL, __pyx_k_URL, sizeof(__pyx_k_URL), 0, 0, 1, 1}, {&__pyx_n_s_URL_2, __pyx_k_URL_2, sizeof(__pyx_k_URL_2), 0, 0, 1, 1}, {&__pyx_n_s_USER_AGENT, __pyx_k_USER_AGENT, sizeof(__pyx_k_USER_AGENT), 0, 0, 1, 1}, {&__pyx_n_s_VARY, __pyx_k_VARY, sizeof(__pyx_k_VARY), 0, 0, 1, 1}, {&__pyx_n_s_VIA, __pyx_k_VIA, sizeof(__pyx_k_VIA), 0, 0, 1, 1}, {&__pyx_n_s_WANT_DIGEST, __pyx_k_WANT_DIGEST, sizeof(__pyx_k_WANT_DIGEST), 0, 0, 1, 1}, {&__pyx_n_s_WARNING, __pyx_k_WARNING, sizeof(__pyx_k_WARNING), 0, 0, 1, 1}, {&__pyx_n_s_WWW_AUTHENTICATE, __pyx_k_WWW_AUTHENTICATE, sizeof(__pyx_k_WWW_AUTHENTICATE), 0, 0, 1, 1}, {&__pyx_n_s_X_FORWARDED_FOR, __pyx_k_X_FORWARDED_FOR, sizeof(__pyx_k_X_FORWARDED_FOR), 0, 0, 1, 1}, {&__pyx_n_s_X_FORWARDED_HOST, __pyx_k_X_FORWARDED_HOST, sizeof(__pyx_k_X_FORWARDED_HOST), 0, 0, 1, 1}, {&__pyx_n_s_X_FORWARDED_PROTO, __pyx_k_X_FORWARDED_PROTO, sizeof(__pyx_k_X_FORWARDED_PROTO), 0, 0, 1, 1}, {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, {&__pyx_kp_u__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 1, 0, 0}, {&__pyx_n_s__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 1, 1}, {&__pyx_kp_b__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 0, 0}, {&__pyx_kp_u__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 1, 0, 0}, {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, {&__pyx_kp_u__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 1, 0, 0}, {&__pyx_n_s_add, __pyx_k_add, sizeof(__pyx_k_add), 0, 0, 1, 1}, {&__pyx_n_s_aiohttp, __pyx_k_aiohttp, sizeof(__pyx_k_aiohttp), 0, 0, 1, 1}, {&__pyx_n_s_aiohttp__http_parser, __pyx_k_aiohttp__http_parser, sizeof(__pyx_k_aiohttp__http_parser), 0, 0, 1, 1}, {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1}, {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, {&__pyx_n_s_auto_decompress, __pyx_k_auto_decompress, sizeof(__pyx_k_auto_decompress), 0, 0, 1, 1}, {&__pyx_n_s_begin_http_chunk_receiving, __pyx_k_begin_http_chunk_receiving, sizeof(__pyx_k_begin_http_chunk_receiving), 0, 0, 1, 1}, {&__pyx_n_u_br, __pyx_k_br, sizeof(__pyx_k_br), 0, 1, 0, 1}, {&__pyx_n_s_build, __pyx_k_build, sizeof(__pyx_k_build), 0, 0, 1, 1}, {&__pyx_n_s_chunked, __pyx_k_chunked, sizeof(__pyx_k_chunked), 0, 0, 1, 1}, {&__pyx_n_u_chunked, __pyx_k_chunked, sizeof(__pyx_k_chunked), 0, 1, 0, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1}, {&__pyx_n_s_code, __pyx_k_code, sizeof(__pyx_k_code), 0, 0, 1, 1}, {&__pyx_n_u_code, __pyx_k_code, sizeof(__pyx_k_code), 0, 1, 0, 1}, {&__pyx_n_s_compression, __pyx_k_compression, sizeof(__pyx_k_compression), 0, 0, 1, 1}, {&__pyx_n_u_compression, __pyx_k_compression, sizeof(__pyx_k_compression), 0, 1, 0, 1}, {&__pyx_n_u_deflate, __pyx_k_deflate, sizeof(__pyx_k_deflate), 0, 1, 0, 1}, {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, {&__pyx_n_s_encoded, __pyx_k_encoded, sizeof(__pyx_k_encoded), 0, 0, 1, 1}, {&__pyx_n_s_end_http_chunk_receiving, __pyx_k_end_http_chunk_receiving, sizeof(__pyx_k_end_http_chunk_receiving), 0, 0, 1, 1}, {&__pyx_n_s_feed_data, __pyx_k_feed_data, sizeof(__pyx_k_feed_data), 0, 0, 1, 1}, {&__pyx_n_s_feed_eof, __pyx_k_feed_eof, sizeof(__pyx_k_feed_eof), 0, 0, 1, 1}, {&__pyx_n_s_fragment, __pyx_k_fragment, sizeof(__pyx_k_fragment), 0, 0, 1, 1}, {&__pyx_n_s_genexpr, __pyx_k_genexpr, sizeof(__pyx_k_genexpr), 0, 0, 1, 1}, {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, {&__pyx_n_u_gzip, __pyx_k_gzip, sizeof(__pyx_k_gzip), 0, 1, 0, 1}, {&__pyx_n_s_hdrs, __pyx_k_hdrs, sizeof(__pyx_k_hdrs), 0, 0, 1, 1}, {&__pyx_n_s_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 0, 1, 1}, {&__pyx_n_u_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 1, 0, 1}, {&__pyx_n_s_http_exceptions, __pyx_k_http_exceptions, sizeof(__pyx_k_http_exceptions), 0, 0, 1, 1}, {&__pyx_n_s_http_parser, __pyx_k_http_parser, sizeof(__pyx_k_http_parser), 0, 0, 1, 1}, {&__pyx_n_s_http_writer, __pyx_k_http_writer, sizeof(__pyx_k_http_writer), 0, 0, 1, 1}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_n_s_limit, __pyx_k_limit, sizeof(__pyx_k_limit), 0, 0, 1, 1}, {&__pyx_n_s_loop, __pyx_k_loop, sizeof(__pyx_k_loop), 0, 0, 1, 1}, {&__pyx_n_s_lower, __pyx_k_lower, sizeof(__pyx_k_lower), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_max_field_size, __pyx_k_max_field_size, sizeof(__pyx_k_max_field_size), 0, 0, 1, 1}, {&__pyx_n_s_max_headers, __pyx_k_max_headers, sizeof(__pyx_k_max_headers), 0, 0, 1, 1}, {&__pyx_n_s_max_line_size, __pyx_k_max_line_size, sizeof(__pyx_k_max_line_size), 0, 0, 1, 1}, {&__pyx_n_s_method, __pyx_k_method, sizeof(__pyx_k_method), 0, 0, 1, 1}, {&__pyx_n_u_method, __pyx_k_method, sizeof(__pyx_k_method), 0, 1, 0, 1}, {&__pyx_n_s_multidict, __pyx_k_multidict, sizeof(__pyx_k_multidict), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, {&__pyx_n_s_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 0, 1, 1}, {&__pyx_n_u_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 1, 0, 1}, {&__pyx_n_s_payload_exception, __pyx_k_payload_exception, sizeof(__pyx_k_payload_exception), 0, 0, 1, 1}, {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, {&__pyx_n_s_protocol, __pyx_k_protocol, sizeof(__pyx_k_protocol), 0, 0, 1, 1}, {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, {&__pyx_n_s_pyx_unpickle_RawRequestMessage, __pyx_k_pyx_unpickle_RawRequestMessage, sizeof(__pyx_k_pyx_unpickle_RawRequestMessage), 0, 0, 1, 1}, {&__pyx_n_s_pyx_unpickle_RawResponseMessag, __pyx_k_pyx_unpickle_RawResponseMessag, sizeof(__pyx_k_pyx_unpickle_RawResponseMessag), 0, 0, 1, 1}, {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, {&__pyx_n_s_query_string, __pyx_k_query_string, sizeof(__pyx_k_query_string), 0, 0, 1, 1}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_n_s_raw_headers, __pyx_k_raw_headers, sizeof(__pyx_k_raw_headers), 0, 0, 1, 1}, {&__pyx_n_u_raw_headers, __pyx_k_raw_headers, sizeof(__pyx_k_raw_headers), 0, 1, 0, 1}, {&__pyx_n_s_read_until_eof, __pyx_k_read_until_eof, sizeof(__pyx_k_read_until_eof), 0, 0, 1, 1}, {&__pyx_n_s_reason, __pyx_k_reason, sizeof(__pyx_k_reason), 0, 0, 1, 1}, {&__pyx_n_u_reason, __pyx_k_reason, sizeof(__pyx_k_reason), 0, 1, 0, 1}, {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, {&__pyx_n_s_repr___locals_genexpr, __pyx_k_repr___locals_genexpr, sizeof(__pyx_k_repr___locals_genexpr), 0, 0, 1, 1}, {&__pyx_n_s_response_with_body, __pyx_k_response_with_body, sizeof(__pyx_k_response_with_body), 0, 0, 1, 1}, {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1}, {&__pyx_n_s_set_exception, __pyx_k_set_exception, sizeof(__pyx_k_set_exception), 0, 0, 1, 1}, {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, {&__pyx_n_s_should_close, __pyx_k_should_close, sizeof(__pyx_k_should_close), 0, 0, 1, 1}, {&__pyx_n_u_should_close, __pyx_k_should_close, sizeof(__pyx_k_should_close), 0, 1, 0, 1}, {&__pyx_n_s_streams, __pyx_k_streams, sizeof(__pyx_k_streams), 0, 0, 1, 1}, {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1}, {&__pyx_n_s_timer, __pyx_k_timer, sizeof(__pyx_k_timer), 0, 0, 1, 1}, {&__pyx_kp_u_unknown, __pyx_k_unknown, sizeof(__pyx_k_unknown), 0, 1, 0, 0}, {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, {&__pyx_n_s_upgrade, __pyx_k_upgrade, sizeof(__pyx_k_upgrade), 0, 0, 1, 1}, {&__pyx_n_u_upgrade, __pyx_k_upgrade, sizeof(__pyx_k_upgrade), 0, 1, 0, 1}, {&__pyx_n_s_url, __pyx_k_url, sizeof(__pyx_k_url), 0, 0, 1, 1}, {&__pyx_n_u_url, __pyx_k_url, sizeof(__pyx_k_url), 0, 1, 0, 1}, {&__pyx_n_s_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 0, 1, 1}, {&__pyx_n_u_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 1, 0, 1}, {&__pyx_n_s_yarl, __pyx_k_yarl, sizeof(__pyx_k_yarl), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 87, __pyx_L1_error) __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(0, 316, __pyx_L1_error) __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(1, 2, __pyx_L1_error) __pyx_builtin_BaseException = __Pyx_GetBuiltinName(__pyx_n_s_BaseException); if (!__pyx_builtin_BaseException) __PYX_ERR(0, 662, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "(tree fragment)":2 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); /* "(tree fragment)":2 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(1, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__10); __Pyx_GIVEREF(__pyx_tuple__10); /* "(tree fragment)":2 * def __reduce_cython__(self): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(1, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__11); __Pyx_GIVEREF(__pyx_tuple__11); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(1, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__12); __Pyx_GIVEREF(__pyx_tuple__12); /* "aiohttp/_http_parser.pyx":57 * char* PyByteArray_AsString(object) * * __all__ = ('HttpRequestParser', 'HttpResponseParser', # <<<<<<<<<<<<<< * 'RawRequestMessage', 'RawResponseMessage') * */ __pyx_tuple__13 = PyTuple_Pack(4, __pyx_n_u_HttpRequestParser, __pyx_n_u_HttpResponseParser, __pyx_n_u_RawRequestMessage_2, __pyx_n_u_RawResponseMessage_2); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 57, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__13); __Pyx_GIVEREF(__pyx_tuple__13); /* "(tree fragment)":1 * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ __pyx_tuple__14 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__14); __Pyx_GIVEREF(__pyx_tuple__14); __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_RawRequestMessage, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) __PYX_ERR(1, 1, __pyx_L1_error) __pyx_tuple__16 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__16); __Pyx_GIVEREF(__pyx_tuple__16); __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_RawResponseMessag, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); __pyx_int_21004882 = PyInt_FromLong(21004882L); if (unlikely(!__pyx_int_21004882)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_209127132 = PyInt_FromLong(209127132L); if (unlikely(!__pyx_int_209127132)) __PYX_ERR(0, 1, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __pyx_v_7aiohttp_12_http_parser_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_URL = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_URL_build = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_CIMultiDict = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_HttpVersion = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_HttpVersion10 = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_HttpVersion11 = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1 = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_StreamReader = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser_DeflateBuffer = Py_None; Py_INCREF(Py_None); __pyx_v_7aiohttp_12_http_parser__http_method = ((PyObject*)Py_None); Py_INCREF(Py_None); __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_getattro = __Pyx_PyObject_GenericGetAttr; } if (PyObject_SetAttr(__pyx_m, __pyx_n_s_RawRequestMessage_2, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage = &__pyx_type_7aiohttp_12_http_parser_RawRequestMessage; if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_getattro = __Pyx_PyObject_GenericGetAttr; } if (PyObject_SetAttr(__pyx_m, __pyx_n_s_RawResponseMessage_2, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage = &__pyx_type_7aiohttp_12_http_parser_RawResponseMessage; __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpParser; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._init = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, enum llhttp_type, PyObject *, PyObject *, int, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args))__pyx_f_7aiohttp_12_http_parser_10HttpParser__init; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._process_header = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_header_field = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_header_value = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_headers_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_message_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_chunk_header = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_chunk_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete; __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete; __pyx_vtable_7aiohttp_12_http_parser_HttpParser.http_version = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version; if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_7aiohttp_12_http_parser_HttpParser.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_HttpParser.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_HttpParser.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_7aiohttp_12_http_parser_HttpParser.tp_getattro = __Pyx_PyObject_GenericGetAttr; } if (__Pyx_SetVtable(__pyx_type_7aiohttp_12_http_parser_HttpParser.tp_dict, __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) __pyx_ptype_7aiohttp_12_http_parser_HttpParser = &__pyx_type_7aiohttp_12_http_parser_HttpParser; __pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser; __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser.__pyx_base = *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser.__pyx_base._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete; __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_base = __pyx_ptype_7aiohttp_12_http_parser_HttpParser; if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_getattro = __Pyx_PyObject_GenericGetAttr; } if (__Pyx_SetVtable(__pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_dict, __pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) if (PyObject_SetAttr(__pyx_m, __pyx_n_s_HttpRequestParser, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser = &__pyx_type_7aiohttp_12_http_parser_HttpRequestParser; __pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser; __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser.__pyx_base = *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser.__pyx_base._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete; __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_base = __pyx_ptype_7aiohttp_12_http_parser_HttpParser; if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_getattro = __Pyx_PyObject_GenericGetAttr; } if (__Pyx_SetVtable(__pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_dict, __pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) if (PyObject_SetAttr(__pyx_m, __pyx_n_s_HttpResponseParser, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser = &__pyx_type_7aiohttp_12_http_parser_HttpResponseParser; if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__) < 0) __PYX_ERR(0, 135, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; } __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__; if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr) < 0) __PYX_ERR(0, 147, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; } __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr; if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__) < 0) __PYX_ERR(0, 233, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; } __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__; if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr) < 0) __PYX_ERR(0, 244, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; } __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 sizeof(PyTypeObject), #else sizeof(PyHeapTypeObject), #endif __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(3, 8, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(4, 15, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC init_http_parser(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC init_http_parser(void) #else __Pyx_PyMODINIT_FUNC PyInit__http_parser(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit__http_parser(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { result = PyDict_SetItemString(moddict, to_name, value); } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec__http_parser(PyObject *__pyx_pyinit_module) #endif #endif { PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; PyObject *__pyx_t_14 = NULL; PyObject *__pyx_t_15 = NULL; PyObject *__pyx_t_16 = NULL; PyObject *__pyx_t_17 = NULL; PyObject *__pyx_t_18 = NULL; PyObject *__pyx_t_19 = NULL; PyObject *__pyx_t_20 = NULL; PyObject *__pyx_t_21 = NULL; PyObject *__pyx_t_22 = NULL; PyObject *__pyx_t_23 = NULL; PyObject *__pyx_t_24 = NULL; PyObject *__pyx_t_25 = NULL; PyObject *__pyx_t_26 = NULL; PyObject *__pyx_t_27 = NULL; PyObject *__pyx_t_28 = NULL; PyObject *__pyx_t_29 = NULL; PyObject *__pyx_t_30 = NULL; PyObject *__pyx_t_31 = NULL; PyObject *__pyx_t_32 = NULL; PyObject *__pyx_t_33 = NULL; PyObject *__pyx_t_34 = NULL; PyObject *__pyx_t_35 = NULL; PyObject *__pyx_t_36 = NULL; PyObject *__pyx_t_37 = NULL; PyObject *__pyx_t_38 = NULL; PyObject *__pyx_t_39 = NULL; PyObject *__pyx_t_40 = NULL; PyObject *__pyx_t_41 = NULL; PyObject *__pyx_t_42 = NULL; PyObject *__pyx_t_43 = NULL; PyObject *__pyx_t_44 = NULL; PyObject *__pyx_t_45 = NULL; PyObject *__pyx_t_46 = NULL; PyObject *__pyx_t_47 = NULL; PyObject *__pyx_t_48 = NULL; PyObject *__pyx_t_49 = NULL; PyObject *__pyx_t_50 = NULL; PyObject *__pyx_t_51 = NULL; PyObject *__pyx_t_52 = NULL; PyObject *__pyx_t_53 = NULL; PyObject *__pyx_t_54 = NULL; PyObject *__pyx_t_55 = NULL; PyObject *__pyx_t_56 = NULL; PyObject *__pyx_t_57 = NULL; PyObject *__pyx_t_58 = NULL; PyObject *__pyx_t_59 = NULL; PyObject *__pyx_t_60 = NULL; PyObject *__pyx_t_61 = NULL; PyObject *__pyx_t_62 = NULL; PyObject *__pyx_t_63 = NULL; PyObject *__pyx_t_64 = NULL; PyObject *__pyx_t_65 = NULL; PyObject *__pyx_t_66 = NULL; PyObject *__pyx_t_67 = NULL; PyObject *__pyx_t_68 = NULL; PyObject *__pyx_t_69 = NULL; PyObject *__pyx_t_70 = NULL; PyObject *__pyx_t_71 = NULL; PyObject *__pyx_t_72 = NULL; PyObject *__pyx_t_73 = NULL; PyObject *__pyx_t_74 = NULL; PyObject *__pyx_t_75 = NULL; PyObject *__pyx_t_76 = NULL; PyObject *__pyx_t_77 = NULL; PyObject *__pyx_t_78 = NULL; long __pyx_t_79; llhttp_method_t __pyx_t_80; char const *__pyx_t_81; int __pyx_t_82; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module '_http_parser' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__http_parser(void)", 0); if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS PyEval_InitThreads(); #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_http_parser", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_b); __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_cython_runtime); if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_aiohttp___http_parser) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "aiohttp._http_parser")) { if (unlikely(PyDict_SetItemString(modules, "aiohttp._http_parser", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "aiohttp/_http_parser.pyx":19 * from libc.string cimport memcpy * * from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy # <<<<<<<<<<<<<< * from yarl import URL as _URL * */ __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_CIMultiDict); __Pyx_GIVEREF(__pyx_n_s_CIMultiDict); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_CIMultiDict); __Pyx_INCREF(__pyx_n_s_CIMultiDictProxy); __Pyx_GIVEREF(__pyx_n_s_CIMultiDictProxy); PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_CIMultiDictProxy); __pyx_t_2 = __Pyx_Import(__pyx_n_s_multidict, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_CIMultiDict); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_CIMultiDict_2, __pyx_t_1) < 0) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_CIMultiDictProxy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_CIMultiDictProxy_2, __pyx_t_1) < 0) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":20 * * from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy * from yarl import URL as _URL # <<<<<<<<<<<<<< * * from aiohttp import hdrs */ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 20, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_URL); __Pyx_GIVEREF(__pyx_n_s_URL); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_URL); __pyx_t_1 = __Pyx_Import(__pyx_n_s_yarl, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 20, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_URL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 20, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_URL_2, __pyx_t_2) < 0) __PYX_ERR(0, 20, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":22 * from yarl import URL as _URL * * from aiohttp import hdrs # <<<<<<<<<<<<<< * * from .http_exceptions import ( */ __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_hdrs); __Pyx_GIVEREF(__pyx_n_s_hdrs); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_hdrs); __pyx_t_2 = __Pyx_Import(__pyx_n_s_aiohttp, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_hdrs, __pyx_t_1) < 0) __PYX_ERR(0, 22, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":25 * * from .http_exceptions import ( * BadHttpMessage, # <<<<<<<<<<<<<< * BadStatusLine, * ContentLengthError, */ __pyx_t_2 = PyList_New(8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 25, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_BadHttpMessage); __Pyx_GIVEREF(__pyx_n_s_BadHttpMessage); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_BadHttpMessage); __Pyx_INCREF(__pyx_n_s_BadStatusLine); __Pyx_GIVEREF(__pyx_n_s_BadStatusLine); PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_BadStatusLine); __Pyx_INCREF(__pyx_n_s_ContentLengthError); __Pyx_GIVEREF(__pyx_n_s_ContentLengthError); PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_ContentLengthError); __Pyx_INCREF(__pyx_n_s_InvalidHeader); __Pyx_GIVEREF(__pyx_n_s_InvalidHeader); PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_InvalidHeader); __Pyx_INCREF(__pyx_n_s_InvalidURLError); __Pyx_GIVEREF(__pyx_n_s_InvalidURLError); PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_s_InvalidURLError); __Pyx_INCREF(__pyx_n_s_LineTooLong); __Pyx_GIVEREF(__pyx_n_s_LineTooLong); PyList_SET_ITEM(__pyx_t_2, 5, __pyx_n_s_LineTooLong); __Pyx_INCREF(__pyx_n_s_PayloadEncodingError); __Pyx_GIVEREF(__pyx_n_s_PayloadEncodingError); PyList_SET_ITEM(__pyx_t_2, 6, __pyx_n_s_PayloadEncodingError); __Pyx_INCREF(__pyx_n_s_TransferEncodingError); __Pyx_GIVEREF(__pyx_n_s_TransferEncodingError); PyList_SET_ITEM(__pyx_t_2, 7, __pyx_n_s_TransferEncodingError); /* "aiohttp/_http_parser.pyx":24 * from aiohttp import hdrs * * from .http_exceptions import ( # <<<<<<<<<<<<<< * BadHttpMessage, * BadStatusLine, */ __pyx_t_1 = __Pyx_Import(__pyx_n_s_http_exceptions, __pyx_t_2, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_BadHttpMessage, __pyx_t_2) < 0) __PYX_ERR(0, 25, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_BadStatusLine, __pyx_t_2) < 0) __PYX_ERR(0, 26, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_ContentLengthError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_ContentLengthError, __pyx_t_2) < 0) __PYX_ERR(0, 27, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_InvalidHeader); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_InvalidHeader, __pyx_t_2) < 0) __PYX_ERR(0, 28, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_InvalidURLError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_InvalidURLError, __pyx_t_2) < 0) __PYX_ERR(0, 29, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_LineTooLong, __pyx_t_2) < 0) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_PayloadEncodingError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_PayloadEncodingError, __pyx_t_2) < 0) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_TransferEncodingError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_TransferEncodingError, __pyx_t_2) < 0) __PYX_ERR(0, 32, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":34 * TransferEncodingError, * ) * from .http_parser import DeflateBuffer as _DeflateBuffer # <<<<<<<<<<<<<< * from .http_writer import ( * HttpVersion as _HttpVersion, */ __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_DeflateBuffer); __Pyx_GIVEREF(__pyx_n_s_DeflateBuffer); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_DeflateBuffer); __pyx_t_2 = __Pyx_Import(__pyx_n_s_http_parser, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_DeflateBuffer); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_DeflateBuffer_2, __pyx_t_1) < 0) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_parser.pyx":36 * from .http_parser import DeflateBuffer as _DeflateBuffer * from .http_writer import ( * HttpVersion as _HttpVersion, # <<<<<<<<<<<<<< * HttpVersion10 as _HttpVersion10, * HttpVersion11 as _HttpVersion11, */ __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 36, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_HttpVersion); __Pyx_GIVEREF(__pyx_n_s_HttpVersion); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_HttpVersion); __Pyx_INCREF(__pyx_n_s_HttpVersion10); __Pyx_GIVEREF(__pyx_n_s_HttpVersion10); PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_HttpVersion10); __Pyx_INCREF(__pyx_n_s_HttpVersion11); __Pyx_GIVEREF(__pyx_n_s_HttpVersion11); PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_HttpVersion11); /* "aiohttp/_http_parser.pyx":35 * ) * from .http_parser import DeflateBuffer as _DeflateBuffer * from .http_writer import ( # <<<<<<<<<<<<<< * HttpVersion as _HttpVersion, * HttpVersion10 as _HttpVersion10, */ __pyx_t_1 = __Pyx_Import(__pyx_n_s_http_writer, __pyx_t_2, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_HttpVersion); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion_2, __pyx_t_2) < 0) __PYX_ERR(0, 36, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_HttpVersion10); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion10_2, __pyx_t_2) < 0) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_HttpVersion11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion11_2, __pyx_t_2) < 0) __PYX_ERR(0, 38, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":40 * HttpVersion11 as _HttpVersion11, * ) * from .streams import EMPTY_PAYLOAD as _EMPTY_PAYLOAD, StreamReader as _StreamReader # <<<<<<<<<<<<<< * * cimport cython */ __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_EMPTY_PAYLOAD); __Pyx_GIVEREF(__pyx_n_s_EMPTY_PAYLOAD); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_EMPTY_PAYLOAD); __Pyx_INCREF(__pyx_n_s_StreamReader); __Pyx_GIVEREF(__pyx_n_s_StreamReader); PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_StreamReader); __pyx_t_2 = __Pyx_Import(__pyx_n_s_streams, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_EMPTY_PAYLOAD); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_EMPTY_PAYLOAD_2, __pyx_t_1) < 0) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_StreamReader); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_StreamReader_2, __pyx_t_1) < 0) __PYX_ERR(0, 40, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_headers.pxi":4 * # Run ./tools/gen.py to update it after the origin changing. * * from . import hdrs # <<<<<<<<<<<<<< * cdef tuple headers = ( * hdrs.ACCEPT, */ __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_hdrs); __Pyx_GIVEREF(__pyx_n_s_hdrs); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_hdrs); __pyx_t_1 = __Pyx_Import(__pyx_n_s__4, __pyx_t_2, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_hdrs, __pyx_t_2) < 0) __PYX_ERR(5, 4, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":6 * from . import hdrs * cdef tuple headers = ( * hdrs.ACCEPT, # <<<<<<<<<<<<<< * hdrs.ACCEPT_CHARSET, * hdrs.ACCEPT_ENCODING, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":7 * cdef tuple headers = ( * hdrs.ACCEPT, * hdrs.ACCEPT_CHARSET, # <<<<<<<<<<<<<< * hdrs.ACCEPT_ENCODING, * hdrs.ACCEPT_LANGUAGE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_CHARSET); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":8 * hdrs.ACCEPT, * hdrs.ACCEPT_CHARSET, * hdrs.ACCEPT_ENCODING, # <<<<<<<<<<<<<< * hdrs.ACCEPT_LANGUAGE, * hdrs.ACCEPT_RANGES, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_ENCODING); if (unlikely(!__pyx_t_4)) __PYX_ERR(5, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":9 * hdrs.ACCEPT_CHARSET, * hdrs.ACCEPT_ENCODING, * hdrs.ACCEPT_LANGUAGE, # <<<<<<<<<<<<<< * hdrs.ACCEPT_RANGES, * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_LANGUAGE); if (unlikely(!__pyx_t_5)) __PYX_ERR(5, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":10 * hdrs.ACCEPT_ENCODING, * hdrs.ACCEPT_LANGUAGE, * hdrs.ACCEPT_RANGES, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 10, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_RANGES); if (unlikely(!__pyx_t_6)) __PYX_ERR(5, 10, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":11 * hdrs.ACCEPT_LANGUAGE, * hdrs.ACCEPT_RANGES, * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, * hdrs.ACCESS_CONTROL_ALLOW_METHODS, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 11, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS); if (unlikely(!__pyx_t_7)) __PYX_ERR(5, 11, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":12 * hdrs.ACCEPT_RANGES, * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_ALLOW_METHODS, * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS); if (unlikely(!__pyx_t_8)) __PYX_ERR(5, 12, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":13 * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, * hdrs.ACCESS_CONTROL_ALLOW_METHODS, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS); if (unlikely(!__pyx_t_9)) __PYX_ERR(5, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":14 * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, * hdrs.ACCESS_CONTROL_ALLOW_METHODS, * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, * hdrs.ACCESS_CONTROL_MAX_AGE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN); if (unlikely(!__pyx_t_10)) __PYX_ERR(5, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":15 * hdrs.ACCESS_CONTROL_ALLOW_METHODS, * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_MAX_AGE, * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS); if (unlikely(!__pyx_t_11)) __PYX_ERR(5, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":16 * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, * hdrs.ACCESS_CONTROL_MAX_AGE, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, * hdrs.ACCESS_CONTROL_REQUEST_METHOD, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_MAX_AGE); if (unlikely(!__pyx_t_12)) __PYX_ERR(5, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":17 * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, * hdrs.ACCESS_CONTROL_MAX_AGE, * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, # <<<<<<<<<<<<<< * hdrs.ACCESS_CONTROL_REQUEST_METHOD, * hdrs.AGE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS); if (unlikely(!__pyx_t_13)) __PYX_ERR(5, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_13); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":18 * hdrs.ACCESS_CONTROL_MAX_AGE, * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, * hdrs.ACCESS_CONTROL_REQUEST_METHOD, # <<<<<<<<<<<<<< * hdrs.AGE, * hdrs.ALLOW, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 18, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD); if (unlikely(!__pyx_t_14)) __PYX_ERR(5, 18, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_14); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":19 * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, * hdrs.ACCESS_CONTROL_REQUEST_METHOD, * hdrs.AGE, # <<<<<<<<<<<<<< * hdrs.ALLOW, * hdrs.AUTHORIZATION, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_AGE); if (unlikely(!__pyx_t_15)) __PYX_ERR(5, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_15); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":20 * hdrs.ACCESS_CONTROL_REQUEST_METHOD, * hdrs.AGE, * hdrs.ALLOW, # <<<<<<<<<<<<<< * hdrs.AUTHORIZATION, * hdrs.CACHE_CONTROL, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 20, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ALLOW); if (unlikely(!__pyx_t_16)) __PYX_ERR(5, 20, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_16); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":21 * hdrs.AGE, * hdrs.ALLOW, * hdrs.AUTHORIZATION, # <<<<<<<<<<<<<< * hdrs.CACHE_CONTROL, * hdrs.CONNECTION, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 21, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_17 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_AUTHORIZATION); if (unlikely(!__pyx_t_17)) __PYX_ERR(5, 21, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_17); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":22 * hdrs.ALLOW, * hdrs.AUTHORIZATION, * hdrs.CACHE_CONTROL, # <<<<<<<<<<<<<< * hdrs.CONNECTION, * hdrs.CONTENT_DISPOSITION, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 22, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_18 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CACHE_CONTROL); if (unlikely(!__pyx_t_18)) __PYX_ERR(5, 22, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_18); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":23 * hdrs.AUTHORIZATION, * hdrs.CACHE_CONTROL, * hdrs.CONNECTION, # <<<<<<<<<<<<<< * hdrs.CONTENT_DISPOSITION, * hdrs.CONTENT_ENCODING, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 23, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_19 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONNECTION); if (unlikely(!__pyx_t_19)) __PYX_ERR(5, 23, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_19); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":24 * hdrs.CACHE_CONTROL, * hdrs.CONNECTION, * hdrs.CONTENT_DISPOSITION, # <<<<<<<<<<<<<< * hdrs.CONTENT_ENCODING, * hdrs.CONTENT_LANGUAGE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_20 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_DISPOSITION); if (unlikely(!__pyx_t_20)) __PYX_ERR(5, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_20); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":25 * hdrs.CONNECTION, * hdrs.CONTENT_DISPOSITION, * hdrs.CONTENT_ENCODING, # <<<<<<<<<<<<<< * hdrs.CONTENT_LANGUAGE, * hdrs.CONTENT_LENGTH, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 25, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_21 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_ENCODING); if (unlikely(!__pyx_t_21)) __PYX_ERR(5, 25, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_21); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":26 * hdrs.CONTENT_DISPOSITION, * hdrs.CONTENT_ENCODING, * hdrs.CONTENT_LANGUAGE, # <<<<<<<<<<<<<< * hdrs.CONTENT_LENGTH, * hdrs.CONTENT_LOCATION, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 26, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_22 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_LANGUAGE); if (unlikely(!__pyx_t_22)) __PYX_ERR(5, 26, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_22); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":27 * hdrs.CONTENT_ENCODING, * hdrs.CONTENT_LANGUAGE, * hdrs.CONTENT_LENGTH, # <<<<<<<<<<<<<< * hdrs.CONTENT_LOCATION, * hdrs.CONTENT_MD5, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 27, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_23 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_LENGTH); if (unlikely(!__pyx_t_23)) __PYX_ERR(5, 27, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_23); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":28 * hdrs.CONTENT_LANGUAGE, * hdrs.CONTENT_LENGTH, * hdrs.CONTENT_LOCATION, # <<<<<<<<<<<<<< * hdrs.CONTENT_MD5, * hdrs.CONTENT_RANGE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 28, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_24 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_LOCATION); if (unlikely(!__pyx_t_24)) __PYX_ERR(5, 28, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_24); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":29 * hdrs.CONTENT_LENGTH, * hdrs.CONTENT_LOCATION, * hdrs.CONTENT_MD5, # <<<<<<<<<<<<<< * hdrs.CONTENT_RANGE, * hdrs.CONTENT_TRANSFER_ENCODING, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 29, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_25 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_MD5); if (unlikely(!__pyx_t_25)) __PYX_ERR(5, 29, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_25); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":30 * hdrs.CONTENT_LOCATION, * hdrs.CONTENT_MD5, * hdrs.CONTENT_RANGE, # <<<<<<<<<<<<<< * hdrs.CONTENT_TRANSFER_ENCODING, * hdrs.CONTENT_TYPE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_26 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_RANGE); if (unlikely(!__pyx_t_26)) __PYX_ERR(5, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_26); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":31 * hdrs.CONTENT_MD5, * hdrs.CONTENT_RANGE, * hdrs.CONTENT_TRANSFER_ENCODING, # <<<<<<<<<<<<<< * hdrs.CONTENT_TYPE, * hdrs.COOKIE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_27 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_TRANSFER_ENCODING); if (unlikely(!__pyx_t_27)) __PYX_ERR(5, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_27); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":32 * hdrs.CONTENT_RANGE, * hdrs.CONTENT_TRANSFER_ENCODING, * hdrs.CONTENT_TYPE, # <<<<<<<<<<<<<< * hdrs.COOKIE, * hdrs.DATE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 32, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_28 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_TYPE); if (unlikely(!__pyx_t_28)) __PYX_ERR(5, 32, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_28); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":33 * hdrs.CONTENT_TRANSFER_ENCODING, * hdrs.CONTENT_TYPE, * hdrs.COOKIE, # <<<<<<<<<<<<<< * hdrs.DATE, * hdrs.DESTINATION, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_29 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COOKIE); if (unlikely(!__pyx_t_29)) __PYX_ERR(5, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_29); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":34 * hdrs.CONTENT_TYPE, * hdrs.COOKIE, * hdrs.DATE, # <<<<<<<<<<<<<< * hdrs.DESTINATION, * hdrs.DIGEST, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_30 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_DATE); if (unlikely(!__pyx_t_30)) __PYX_ERR(5, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_30); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":35 * hdrs.COOKIE, * hdrs.DATE, * hdrs.DESTINATION, # <<<<<<<<<<<<<< * hdrs.DIGEST, * hdrs.ETAG, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_31 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_DESTINATION); if (unlikely(!__pyx_t_31)) __PYX_ERR(5, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_31); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":36 * hdrs.DATE, * hdrs.DESTINATION, * hdrs.DIGEST, # <<<<<<<<<<<<<< * hdrs.ETAG, * hdrs.EXPECT, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 36, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_32 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_DIGEST); if (unlikely(!__pyx_t_32)) __PYX_ERR(5, 36, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_32); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":37 * hdrs.DESTINATION, * hdrs.DIGEST, * hdrs.ETAG, # <<<<<<<<<<<<<< * hdrs.EXPECT, * hdrs.EXPIRES, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_33 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ETAG); if (unlikely(!__pyx_t_33)) __PYX_ERR(5, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_33); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":38 * hdrs.DIGEST, * hdrs.ETAG, * hdrs.EXPECT, # <<<<<<<<<<<<<< * hdrs.EXPIRES, * hdrs.FORWARDED, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 38, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_34 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_EXPECT); if (unlikely(!__pyx_t_34)) __PYX_ERR(5, 38, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_34); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":39 * hdrs.ETAG, * hdrs.EXPECT, * hdrs.EXPIRES, # <<<<<<<<<<<<<< * hdrs.FORWARDED, * hdrs.FROM, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 39, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_35 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_EXPIRES); if (unlikely(!__pyx_t_35)) __PYX_ERR(5, 39, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_35); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":40 * hdrs.EXPECT, * hdrs.EXPIRES, * hdrs.FORWARDED, # <<<<<<<<<<<<<< * hdrs.FROM, * hdrs.HOST, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_36 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_FORWARDED); if (unlikely(!__pyx_t_36)) __PYX_ERR(5, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_36); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":41 * hdrs.EXPIRES, * hdrs.FORWARDED, * hdrs.FROM, # <<<<<<<<<<<<<< * hdrs.HOST, * hdrs.IF_MATCH, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 41, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_37 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_FROM); if (unlikely(!__pyx_t_37)) __PYX_ERR(5, 41, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_37); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":42 * hdrs.FORWARDED, * hdrs.FROM, * hdrs.HOST, # <<<<<<<<<<<<<< * hdrs.IF_MATCH, * hdrs.IF_MODIFIED_SINCE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 42, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_38 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_HOST); if (unlikely(!__pyx_t_38)) __PYX_ERR(5, 42, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_38); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":43 * hdrs.FROM, * hdrs.HOST, * hdrs.IF_MATCH, # <<<<<<<<<<<<<< * hdrs.IF_MODIFIED_SINCE, * hdrs.IF_NONE_MATCH, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_39 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_MATCH); if (unlikely(!__pyx_t_39)) __PYX_ERR(5, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_39); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":44 * hdrs.HOST, * hdrs.IF_MATCH, * hdrs.IF_MODIFIED_SINCE, # <<<<<<<<<<<<<< * hdrs.IF_NONE_MATCH, * hdrs.IF_RANGE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 44, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_40 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_MODIFIED_SINCE); if (unlikely(!__pyx_t_40)) __PYX_ERR(5, 44, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":45 * hdrs.IF_MATCH, * hdrs.IF_MODIFIED_SINCE, * hdrs.IF_NONE_MATCH, # <<<<<<<<<<<<<< * hdrs.IF_RANGE, * hdrs.IF_UNMODIFIED_SINCE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 45, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_41 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_NONE_MATCH); if (unlikely(!__pyx_t_41)) __PYX_ERR(5, 45, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_41); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":46 * hdrs.IF_MODIFIED_SINCE, * hdrs.IF_NONE_MATCH, * hdrs.IF_RANGE, # <<<<<<<<<<<<<< * hdrs.IF_UNMODIFIED_SINCE, * hdrs.KEEP_ALIVE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_42 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_RANGE); if (unlikely(!__pyx_t_42)) __PYX_ERR(5, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_42); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":47 * hdrs.IF_NONE_MATCH, * hdrs.IF_RANGE, * hdrs.IF_UNMODIFIED_SINCE, # <<<<<<<<<<<<<< * hdrs.KEEP_ALIVE, * hdrs.LAST_EVENT_ID, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_43 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_UNMODIFIED_SINCE); if (unlikely(!__pyx_t_43)) __PYX_ERR(5, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_43); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":48 * hdrs.IF_RANGE, * hdrs.IF_UNMODIFIED_SINCE, * hdrs.KEEP_ALIVE, # <<<<<<<<<<<<<< * hdrs.LAST_EVENT_ID, * hdrs.LAST_MODIFIED, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_44 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_KEEP_ALIVE); if (unlikely(!__pyx_t_44)) __PYX_ERR(5, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_44); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":49 * hdrs.IF_UNMODIFIED_SINCE, * hdrs.KEEP_ALIVE, * hdrs.LAST_EVENT_ID, # <<<<<<<<<<<<<< * hdrs.LAST_MODIFIED, * hdrs.LINK, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_45 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LAST_EVENT_ID); if (unlikely(!__pyx_t_45)) __PYX_ERR(5, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_45); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":50 * hdrs.KEEP_ALIVE, * hdrs.LAST_EVENT_ID, * hdrs.LAST_MODIFIED, # <<<<<<<<<<<<<< * hdrs.LINK, * hdrs.LOCATION, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 50, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_46 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LAST_MODIFIED); if (unlikely(!__pyx_t_46)) __PYX_ERR(5, 50, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_46); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":51 * hdrs.LAST_EVENT_ID, * hdrs.LAST_MODIFIED, * hdrs.LINK, # <<<<<<<<<<<<<< * hdrs.LOCATION, * hdrs.MAX_FORWARDS, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 51, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_47 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LINK); if (unlikely(!__pyx_t_47)) __PYX_ERR(5, 51, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_47); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":52 * hdrs.LAST_MODIFIED, * hdrs.LINK, * hdrs.LOCATION, # <<<<<<<<<<<<<< * hdrs.MAX_FORWARDS, * hdrs.ORIGIN, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 52, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_48 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LOCATION); if (unlikely(!__pyx_t_48)) __PYX_ERR(5, 52, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_48); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":53 * hdrs.LINK, * hdrs.LOCATION, * hdrs.MAX_FORWARDS, # <<<<<<<<<<<<<< * hdrs.ORIGIN, * hdrs.PRAGMA, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 53, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_49 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_MAX_FORWARDS); if (unlikely(!__pyx_t_49)) __PYX_ERR(5, 53, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_49); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":54 * hdrs.LOCATION, * hdrs.MAX_FORWARDS, * hdrs.ORIGIN, # <<<<<<<<<<<<<< * hdrs.PRAGMA, * hdrs.PROXY_AUTHENTICATE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 54, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_50 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ORIGIN); if (unlikely(!__pyx_t_50)) __PYX_ERR(5, 54, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_50); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":55 * hdrs.MAX_FORWARDS, * hdrs.ORIGIN, * hdrs.PRAGMA, # <<<<<<<<<<<<<< * hdrs.PROXY_AUTHENTICATE, * hdrs.PROXY_AUTHORIZATION, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 55, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_51 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_PRAGMA); if (unlikely(!__pyx_t_51)) __PYX_ERR(5, 55, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_51); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":56 * hdrs.ORIGIN, * hdrs.PRAGMA, * hdrs.PROXY_AUTHENTICATE, # <<<<<<<<<<<<<< * hdrs.PROXY_AUTHORIZATION, * hdrs.RANGE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 56, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_52 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_PROXY_AUTHENTICATE); if (unlikely(!__pyx_t_52)) __PYX_ERR(5, 56, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_52); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":57 * hdrs.PRAGMA, * hdrs.PROXY_AUTHENTICATE, * hdrs.PROXY_AUTHORIZATION, # <<<<<<<<<<<<<< * hdrs.RANGE, * hdrs.REFERER, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 57, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_53 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_PROXY_AUTHORIZATION); if (unlikely(!__pyx_t_53)) __PYX_ERR(5, 57, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_53); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":58 * hdrs.PROXY_AUTHENTICATE, * hdrs.PROXY_AUTHORIZATION, * hdrs.RANGE, # <<<<<<<<<<<<<< * hdrs.REFERER, * hdrs.RETRY_AFTER, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 58, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_54 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_RANGE); if (unlikely(!__pyx_t_54)) __PYX_ERR(5, 58, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_54); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":59 * hdrs.PROXY_AUTHORIZATION, * hdrs.RANGE, * hdrs.REFERER, # <<<<<<<<<<<<<< * hdrs.RETRY_AFTER, * hdrs.SEC_WEBSOCKET_ACCEPT, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 59, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_55 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_REFERER); if (unlikely(!__pyx_t_55)) __PYX_ERR(5, 59, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_55); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":60 * hdrs.RANGE, * hdrs.REFERER, * hdrs.RETRY_AFTER, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_ACCEPT, * hdrs.SEC_WEBSOCKET_EXTENSIONS, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 60, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_56 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_RETRY_AFTER); if (unlikely(!__pyx_t_56)) __PYX_ERR(5, 60, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_56); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":61 * hdrs.REFERER, * hdrs.RETRY_AFTER, * hdrs.SEC_WEBSOCKET_ACCEPT, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_EXTENSIONS, * hdrs.SEC_WEBSOCKET_KEY, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 61, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_57 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_ACCEPT); if (unlikely(!__pyx_t_57)) __PYX_ERR(5, 61, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_57); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":62 * hdrs.RETRY_AFTER, * hdrs.SEC_WEBSOCKET_ACCEPT, * hdrs.SEC_WEBSOCKET_EXTENSIONS, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_KEY, * hdrs.SEC_WEBSOCKET_KEY1, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_58 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_EXTENSIONS); if (unlikely(!__pyx_t_58)) __PYX_ERR(5, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_58); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":63 * hdrs.SEC_WEBSOCKET_ACCEPT, * hdrs.SEC_WEBSOCKET_EXTENSIONS, * hdrs.SEC_WEBSOCKET_KEY, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_KEY1, * hdrs.SEC_WEBSOCKET_PROTOCOL, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_59 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_KEY); if (unlikely(!__pyx_t_59)) __PYX_ERR(5, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_59); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":64 * hdrs.SEC_WEBSOCKET_EXTENSIONS, * hdrs.SEC_WEBSOCKET_KEY, * hdrs.SEC_WEBSOCKET_KEY1, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_PROTOCOL, * hdrs.SEC_WEBSOCKET_VERSION, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 64, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_60 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_KEY1); if (unlikely(!__pyx_t_60)) __PYX_ERR(5, 64, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_60); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":65 * hdrs.SEC_WEBSOCKET_KEY, * hdrs.SEC_WEBSOCKET_KEY1, * hdrs.SEC_WEBSOCKET_PROTOCOL, # <<<<<<<<<<<<<< * hdrs.SEC_WEBSOCKET_VERSION, * hdrs.SERVER, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 65, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_61 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_PROTOCOL); if (unlikely(!__pyx_t_61)) __PYX_ERR(5, 65, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_61); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":66 * hdrs.SEC_WEBSOCKET_KEY1, * hdrs.SEC_WEBSOCKET_PROTOCOL, * hdrs.SEC_WEBSOCKET_VERSION, # <<<<<<<<<<<<<< * hdrs.SERVER, * hdrs.SET_COOKIE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_62 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_VERSION); if (unlikely(!__pyx_t_62)) __PYX_ERR(5, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_62); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":67 * hdrs.SEC_WEBSOCKET_PROTOCOL, * hdrs.SEC_WEBSOCKET_VERSION, * hdrs.SERVER, # <<<<<<<<<<<<<< * hdrs.SET_COOKIE, * hdrs.TE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 67, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_63 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SERVER); if (unlikely(!__pyx_t_63)) __PYX_ERR(5, 67, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_63); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":68 * hdrs.SEC_WEBSOCKET_VERSION, * hdrs.SERVER, * hdrs.SET_COOKIE, # <<<<<<<<<<<<<< * hdrs.TE, * hdrs.TRAILER, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_64 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SET_COOKIE); if (unlikely(!__pyx_t_64)) __PYX_ERR(5, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_64); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":69 * hdrs.SERVER, * hdrs.SET_COOKIE, * hdrs.TE, # <<<<<<<<<<<<<< * hdrs.TRAILER, * hdrs.TRANSFER_ENCODING, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 69, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_65 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_TE); if (unlikely(!__pyx_t_65)) __PYX_ERR(5, 69, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_65); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":70 * hdrs.SET_COOKIE, * hdrs.TE, * hdrs.TRAILER, # <<<<<<<<<<<<<< * hdrs.TRANSFER_ENCODING, * hdrs.URI, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 70, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_66 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_TRAILER); if (unlikely(!__pyx_t_66)) __PYX_ERR(5, 70, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_66); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":71 * hdrs.TE, * hdrs.TRAILER, * hdrs.TRANSFER_ENCODING, # <<<<<<<<<<<<<< * hdrs.URI, * hdrs.UPGRADE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 71, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_67 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_TRANSFER_ENCODING); if (unlikely(!__pyx_t_67)) __PYX_ERR(5, 71, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_67); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":72 * hdrs.TRAILER, * hdrs.TRANSFER_ENCODING, * hdrs.URI, # <<<<<<<<<<<<<< * hdrs.UPGRADE, * hdrs.USER_AGENT, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_68 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_URI); if (unlikely(!__pyx_t_68)) __PYX_ERR(5, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_68); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":73 * hdrs.TRANSFER_ENCODING, * hdrs.URI, * hdrs.UPGRADE, # <<<<<<<<<<<<<< * hdrs.USER_AGENT, * hdrs.VARY, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_69 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_UPGRADE); if (unlikely(!__pyx_t_69)) __PYX_ERR(5, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_69); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":74 * hdrs.URI, * hdrs.UPGRADE, * hdrs.USER_AGENT, # <<<<<<<<<<<<<< * hdrs.VARY, * hdrs.VIA, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 74, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_70 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_USER_AGENT); if (unlikely(!__pyx_t_70)) __PYX_ERR(5, 74, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_70); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":75 * hdrs.UPGRADE, * hdrs.USER_AGENT, * hdrs.VARY, # <<<<<<<<<<<<<< * hdrs.VIA, * hdrs.WWW_AUTHENTICATE, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 75, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_71 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_VARY); if (unlikely(!__pyx_t_71)) __PYX_ERR(5, 75, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_71); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":76 * hdrs.USER_AGENT, * hdrs.VARY, * hdrs.VIA, # <<<<<<<<<<<<<< * hdrs.WWW_AUTHENTICATE, * hdrs.WANT_DIGEST, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 76, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_72 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_VIA); if (unlikely(!__pyx_t_72)) __PYX_ERR(5, 76, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_72); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":77 * hdrs.VARY, * hdrs.VIA, * hdrs.WWW_AUTHENTICATE, # <<<<<<<<<<<<<< * hdrs.WANT_DIGEST, * hdrs.WARNING, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 77, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_73 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_WWW_AUTHENTICATE); if (unlikely(!__pyx_t_73)) __PYX_ERR(5, 77, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_73); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":78 * hdrs.VIA, * hdrs.WWW_AUTHENTICATE, * hdrs.WANT_DIGEST, # <<<<<<<<<<<<<< * hdrs.WARNING, * hdrs.X_FORWARDED_FOR, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 78, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_74 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_WANT_DIGEST); if (unlikely(!__pyx_t_74)) __PYX_ERR(5, 78, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_74); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":79 * hdrs.WWW_AUTHENTICATE, * hdrs.WANT_DIGEST, * hdrs.WARNING, # <<<<<<<<<<<<<< * hdrs.X_FORWARDED_FOR, * hdrs.X_FORWARDED_HOST, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 79, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_75 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_WARNING); if (unlikely(!__pyx_t_75)) __PYX_ERR(5, 79, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_75); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":80 * hdrs.WANT_DIGEST, * hdrs.WARNING, * hdrs.X_FORWARDED_FOR, # <<<<<<<<<<<<<< * hdrs.X_FORWARDED_HOST, * hdrs.X_FORWARDED_PROTO, */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 80, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_76 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_X_FORWARDED_FOR); if (unlikely(!__pyx_t_76)) __PYX_ERR(5, 80, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_76); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":81 * hdrs.WARNING, * hdrs.X_FORWARDED_FOR, * hdrs.X_FORWARDED_HOST, # <<<<<<<<<<<<<< * hdrs.X_FORWARDED_PROTO, * ) */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 81, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_77 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_X_FORWARDED_HOST); if (unlikely(!__pyx_t_77)) __PYX_ERR(5, 81, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_77); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":82 * hdrs.X_FORWARDED_FOR, * hdrs.X_FORWARDED_HOST, * hdrs.X_FORWARDED_PROTO, # <<<<<<<<<<<<<< * ) */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 82, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_78 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_X_FORWARDED_PROTO); if (unlikely(!__pyx_t_78)) __PYX_ERR(5, 82, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_78); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_headers.pxi":6 * from . import hdrs * cdef tuple headers = ( * hdrs.ACCEPT, # <<<<<<<<<<<<<< * hdrs.ACCEPT_CHARSET, * hdrs.ACCEPT_ENCODING, */ __pyx_t_1 = PyTuple_New(77); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 6, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_1, 7, __pyx_t_9); __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_1, 8, __pyx_t_10); __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_1, 9, __pyx_t_11); __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_1, 10, __pyx_t_12); __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_1, 11, __pyx_t_13); __Pyx_GIVEREF(__pyx_t_14); PyTuple_SET_ITEM(__pyx_t_1, 12, __pyx_t_14); __Pyx_GIVEREF(__pyx_t_15); PyTuple_SET_ITEM(__pyx_t_1, 13, __pyx_t_15); __Pyx_GIVEREF(__pyx_t_16); PyTuple_SET_ITEM(__pyx_t_1, 14, __pyx_t_16); __Pyx_GIVEREF(__pyx_t_17); PyTuple_SET_ITEM(__pyx_t_1, 15, __pyx_t_17); __Pyx_GIVEREF(__pyx_t_18); PyTuple_SET_ITEM(__pyx_t_1, 16, __pyx_t_18); __Pyx_GIVEREF(__pyx_t_19); PyTuple_SET_ITEM(__pyx_t_1, 17, __pyx_t_19); __Pyx_GIVEREF(__pyx_t_20); PyTuple_SET_ITEM(__pyx_t_1, 18, __pyx_t_20); __Pyx_GIVEREF(__pyx_t_21); PyTuple_SET_ITEM(__pyx_t_1, 19, __pyx_t_21); __Pyx_GIVEREF(__pyx_t_22); PyTuple_SET_ITEM(__pyx_t_1, 20, __pyx_t_22); __Pyx_GIVEREF(__pyx_t_23); PyTuple_SET_ITEM(__pyx_t_1, 21, __pyx_t_23); __Pyx_GIVEREF(__pyx_t_24); PyTuple_SET_ITEM(__pyx_t_1, 22, __pyx_t_24); __Pyx_GIVEREF(__pyx_t_25); PyTuple_SET_ITEM(__pyx_t_1, 23, __pyx_t_25); __Pyx_GIVEREF(__pyx_t_26); PyTuple_SET_ITEM(__pyx_t_1, 24, __pyx_t_26); __Pyx_GIVEREF(__pyx_t_27); PyTuple_SET_ITEM(__pyx_t_1, 25, __pyx_t_27); __Pyx_GIVEREF(__pyx_t_28); PyTuple_SET_ITEM(__pyx_t_1, 26, __pyx_t_28); __Pyx_GIVEREF(__pyx_t_29); PyTuple_SET_ITEM(__pyx_t_1, 27, __pyx_t_29); __Pyx_GIVEREF(__pyx_t_30); PyTuple_SET_ITEM(__pyx_t_1, 28, __pyx_t_30); __Pyx_GIVEREF(__pyx_t_31); PyTuple_SET_ITEM(__pyx_t_1, 29, __pyx_t_31); __Pyx_GIVEREF(__pyx_t_32); PyTuple_SET_ITEM(__pyx_t_1, 30, __pyx_t_32); __Pyx_GIVEREF(__pyx_t_33); PyTuple_SET_ITEM(__pyx_t_1, 31, __pyx_t_33); __Pyx_GIVEREF(__pyx_t_34); PyTuple_SET_ITEM(__pyx_t_1, 32, __pyx_t_34); __Pyx_GIVEREF(__pyx_t_35); PyTuple_SET_ITEM(__pyx_t_1, 33, __pyx_t_35); __Pyx_GIVEREF(__pyx_t_36); PyTuple_SET_ITEM(__pyx_t_1, 34, __pyx_t_36); __Pyx_GIVEREF(__pyx_t_37); PyTuple_SET_ITEM(__pyx_t_1, 35, __pyx_t_37); __Pyx_GIVEREF(__pyx_t_38); PyTuple_SET_ITEM(__pyx_t_1, 36, __pyx_t_38); __Pyx_GIVEREF(__pyx_t_39); PyTuple_SET_ITEM(__pyx_t_1, 37, __pyx_t_39); __Pyx_GIVEREF(__pyx_t_40); PyTuple_SET_ITEM(__pyx_t_1, 38, __pyx_t_40); __Pyx_GIVEREF(__pyx_t_41); PyTuple_SET_ITEM(__pyx_t_1, 39, __pyx_t_41); __Pyx_GIVEREF(__pyx_t_42); PyTuple_SET_ITEM(__pyx_t_1, 40, __pyx_t_42); __Pyx_GIVEREF(__pyx_t_43); PyTuple_SET_ITEM(__pyx_t_1, 41, __pyx_t_43); __Pyx_GIVEREF(__pyx_t_44); PyTuple_SET_ITEM(__pyx_t_1, 42, __pyx_t_44); __Pyx_GIVEREF(__pyx_t_45); PyTuple_SET_ITEM(__pyx_t_1, 43, __pyx_t_45); __Pyx_GIVEREF(__pyx_t_46); PyTuple_SET_ITEM(__pyx_t_1, 44, __pyx_t_46); __Pyx_GIVEREF(__pyx_t_47); PyTuple_SET_ITEM(__pyx_t_1, 45, __pyx_t_47); __Pyx_GIVEREF(__pyx_t_48); PyTuple_SET_ITEM(__pyx_t_1, 46, __pyx_t_48); __Pyx_GIVEREF(__pyx_t_49); PyTuple_SET_ITEM(__pyx_t_1, 47, __pyx_t_49); __Pyx_GIVEREF(__pyx_t_50); PyTuple_SET_ITEM(__pyx_t_1, 48, __pyx_t_50); __Pyx_GIVEREF(__pyx_t_51); PyTuple_SET_ITEM(__pyx_t_1, 49, __pyx_t_51); __Pyx_GIVEREF(__pyx_t_52); PyTuple_SET_ITEM(__pyx_t_1, 50, __pyx_t_52); __Pyx_GIVEREF(__pyx_t_53); PyTuple_SET_ITEM(__pyx_t_1, 51, __pyx_t_53); __Pyx_GIVEREF(__pyx_t_54); PyTuple_SET_ITEM(__pyx_t_1, 52, __pyx_t_54); __Pyx_GIVEREF(__pyx_t_55); PyTuple_SET_ITEM(__pyx_t_1, 53, __pyx_t_55); __Pyx_GIVEREF(__pyx_t_56); PyTuple_SET_ITEM(__pyx_t_1, 54, __pyx_t_56); __Pyx_GIVEREF(__pyx_t_57); PyTuple_SET_ITEM(__pyx_t_1, 55, __pyx_t_57); __Pyx_GIVEREF(__pyx_t_58); PyTuple_SET_ITEM(__pyx_t_1, 56, __pyx_t_58); __Pyx_GIVEREF(__pyx_t_59); PyTuple_SET_ITEM(__pyx_t_1, 57, __pyx_t_59); __Pyx_GIVEREF(__pyx_t_60); PyTuple_SET_ITEM(__pyx_t_1, 58, __pyx_t_60); __Pyx_GIVEREF(__pyx_t_61); PyTuple_SET_ITEM(__pyx_t_1, 59, __pyx_t_61); __Pyx_GIVEREF(__pyx_t_62); PyTuple_SET_ITEM(__pyx_t_1, 60, __pyx_t_62); __Pyx_GIVEREF(__pyx_t_63); PyTuple_SET_ITEM(__pyx_t_1, 61, __pyx_t_63); __Pyx_GIVEREF(__pyx_t_64); PyTuple_SET_ITEM(__pyx_t_1, 62, __pyx_t_64); __Pyx_GIVEREF(__pyx_t_65); PyTuple_SET_ITEM(__pyx_t_1, 63, __pyx_t_65); __Pyx_GIVEREF(__pyx_t_66); PyTuple_SET_ITEM(__pyx_t_1, 64, __pyx_t_66); __Pyx_GIVEREF(__pyx_t_67); PyTuple_SET_ITEM(__pyx_t_1, 65, __pyx_t_67); __Pyx_GIVEREF(__pyx_t_68); PyTuple_SET_ITEM(__pyx_t_1, 66, __pyx_t_68); __Pyx_GIVEREF(__pyx_t_69); PyTuple_SET_ITEM(__pyx_t_1, 67, __pyx_t_69); __Pyx_GIVEREF(__pyx_t_70); PyTuple_SET_ITEM(__pyx_t_1, 68, __pyx_t_70); __Pyx_GIVEREF(__pyx_t_71); PyTuple_SET_ITEM(__pyx_t_1, 69, __pyx_t_71); __Pyx_GIVEREF(__pyx_t_72); PyTuple_SET_ITEM(__pyx_t_1, 70, __pyx_t_72); __Pyx_GIVEREF(__pyx_t_73); PyTuple_SET_ITEM(__pyx_t_1, 71, __pyx_t_73); __Pyx_GIVEREF(__pyx_t_74); PyTuple_SET_ITEM(__pyx_t_1, 72, __pyx_t_74); __Pyx_GIVEREF(__pyx_t_75); PyTuple_SET_ITEM(__pyx_t_1, 73, __pyx_t_75); __Pyx_GIVEREF(__pyx_t_76); PyTuple_SET_ITEM(__pyx_t_1, 74, __pyx_t_76); __Pyx_GIVEREF(__pyx_t_77); PyTuple_SET_ITEM(__pyx_t_1, 75, __pyx_t_77); __Pyx_GIVEREF(__pyx_t_78); PyTuple_SET_ITEM(__pyx_t_1, 76, __pyx_t_78); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0; __pyx_t_24 = 0; __pyx_t_25 = 0; __pyx_t_26 = 0; __pyx_t_27 = 0; __pyx_t_28 = 0; __pyx_t_29 = 0; __pyx_t_30 = 0; __pyx_t_31 = 0; __pyx_t_32 = 0; __pyx_t_33 = 0; __pyx_t_34 = 0; __pyx_t_35 = 0; __pyx_t_36 = 0; __pyx_t_37 = 0; __pyx_t_38 = 0; __pyx_t_39 = 0; __pyx_t_40 = 0; __pyx_t_41 = 0; __pyx_t_42 = 0; __pyx_t_43 = 0; __pyx_t_44 = 0; __pyx_t_45 = 0; __pyx_t_46 = 0; __pyx_t_47 = 0; __pyx_t_48 = 0; __pyx_t_49 = 0; __pyx_t_50 = 0; __pyx_t_51 = 0; __pyx_t_52 = 0; __pyx_t_53 = 0; __pyx_t_54 = 0; __pyx_t_55 = 0; __pyx_t_56 = 0; __pyx_t_57 = 0; __pyx_t_58 = 0; __pyx_t_59 = 0; __pyx_t_60 = 0; __pyx_t_61 = 0; __pyx_t_62 = 0; __pyx_t_63 = 0; __pyx_t_64 = 0; __pyx_t_65 = 0; __pyx_t_66 = 0; __pyx_t_67 = 0; __pyx_t_68 = 0; __pyx_t_69 = 0; __pyx_t_70 = 0; __pyx_t_71 = 0; __pyx_t_72 = 0; __pyx_t_73 = 0; __pyx_t_74 = 0; __pyx_t_75 = 0; __pyx_t_76 = 0; __pyx_t_77 = 0; __pyx_t_78 = 0; __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_headers); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_headers, ((PyObject*)__pyx_t_1)); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":57 * char* PyByteArray_AsString(object) * * __all__ = ('HttpRequestParser', 'HttpResponseParser', # <<<<<<<<<<<<<< * 'RawRequestMessage', 'RawResponseMessage') * */ if (PyDict_SetItem(__pyx_d, __pyx_n_s_all, __pyx_tuple__13) < 0) __PYX_ERR(0, 57, __pyx_L1_error) /* "aiohttp/_http_parser.pyx":60 * 'RawRequestMessage', 'RawResponseMessage') * * cdef object URL = _URL # <<<<<<<<<<<<<< * cdef object URL_build = URL.build * cdef object CIMultiDict = _CIMultiDict */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_URL_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 60, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_URL); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":61 * * cdef object URL = _URL * cdef object URL_build = URL.build # <<<<<<<<<<<<<< * cdef object CIMultiDict = _CIMultiDict * cdef object CIMultiDictProxy = _CIMultiDictProxy */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_n_s_build); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_URL_build); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_URL_build, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":62 * cdef object URL = _URL * cdef object URL_build = URL.build * cdef object CIMultiDict = _CIMultiDict # <<<<<<<<<<<<<< * cdef object CIMultiDictProxy = _CIMultiDictProxy * cdef object HttpVersion = _HttpVersion */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_CIMultiDict_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDict); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CIMultiDict, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":63 * cdef object URL_build = URL.build * cdef object CIMultiDict = _CIMultiDict * cdef object CIMultiDictProxy = _CIMultiDictProxy # <<<<<<<<<<<<<< * cdef object HttpVersion = _HttpVersion * cdef object HttpVersion10 = _HttpVersion10 */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_CIMultiDictProxy_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":64 * cdef object CIMultiDict = _CIMultiDict * cdef object CIMultiDictProxy = _CIMultiDictProxy * cdef object HttpVersion = _HttpVersion # <<<<<<<<<<<<<< * cdef object HttpVersion10 = _HttpVersion10 * cdef object HttpVersion11 = _HttpVersion11 */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_HttpVersion_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 64, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":65 * cdef object CIMultiDictProxy = _CIMultiDictProxy * cdef object HttpVersion = _HttpVersion * cdef object HttpVersion10 = _HttpVersion10 # <<<<<<<<<<<<<< * cdef object HttpVersion11 = _HttpVersion11 * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_HttpVersion10_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 65, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion10); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion10, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":66 * cdef object HttpVersion = _HttpVersion * cdef object HttpVersion10 = _HttpVersion10 * cdef object HttpVersion11 = _HttpVersion11 # <<<<<<<<<<<<<< * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_HttpVersion11_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion11); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion11, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":67 * cdef object HttpVersion10 = _HttpVersion10 * cdef object HttpVersion11 = _HttpVersion11 * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 # <<<<<<<<<<<<<< * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_78 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_KEY1); if (unlikely(!__pyx_t_78)) __PYX_ERR(0, 67, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_78); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1, __pyx_t_78); __Pyx_GIVEREF(__pyx_t_78); __pyx_t_78 = 0; /* "aiohttp/_http_parser.pyx":68 * cdef object HttpVersion11 = _HttpVersion11 * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING # <<<<<<<<<<<<<< * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD * cdef object StreamReader = _StreamReader */ __Pyx_GetModuleGlobalName(__pyx_t_78, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_78)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_78); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_78, __pyx_n_s_CONTENT_ENCODING); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_78); __pyx_t_78 = 0; __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":69 * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD # <<<<<<<<<<<<<< * cdef object StreamReader = _StreamReader * cdef object DeflateBuffer = _DeflateBuffer */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_PAYLOAD_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 69, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":70 * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD * cdef object StreamReader = _StreamReader # <<<<<<<<<<<<<< * cdef object DeflateBuffer = _DeflateBuffer * */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_StreamReader_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 70, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_StreamReader); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_StreamReader, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":71 * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD * cdef object StreamReader = _StreamReader * cdef object DeflateBuffer = _DeflateBuffer # <<<<<<<<<<<<<< * * */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DeflateBuffer_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 71, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":85 * DEF METHODS_COUNT = 46; * * cdef list _http_method = [] # <<<<<<<<<<<<<< * * for i in range(METHODS_COUNT): */ __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 85, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser__http_method); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser__http_method, ((PyObject*)__pyx_t_1)); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":87 * cdef list _http_method = [] * * for i in range(METHODS_COUNT): # <<<<<<<<<<<<<< * _http_method.append( * cparser.llhttp_method_name( i).decode('ascii')) */ for (__pyx_t_79 = 0; __pyx_t_79 < 46; __pyx_t_79+=1) { __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_t_79); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 87, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_i, __pyx_t_1) < 0) __PYX_ERR(0, 87, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":88 * * for i in range(METHODS_COUNT): * _http_method.append( # <<<<<<<<<<<<<< * cparser.llhttp_method_name( i).decode('ascii')) * */ if (unlikely(__pyx_v_7aiohttp_12_http_parser__http_method == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); __PYX_ERR(0, 88, __pyx_L1_error) } /* "aiohttp/_http_parser.pyx":89 * for i in range(METHODS_COUNT): * _http_method.append( * cparser.llhttp_method_name( i).decode('ascii')) # <<<<<<<<<<<<<< * * */ __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_80 = ((enum llhttp_method)__Pyx_PyInt_As_enum__llhttp_method(__pyx_t_1)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 89, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_81 = llhttp_method_name(((llhttp_method_t)__pyx_t_80)); __pyx_t_1 = __Pyx_decode_c_string(__pyx_t_81, 0, strlen(__pyx_t_81), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); /* "aiohttp/_http_parser.pyx":88 * * for i in range(METHODS_COUNT): * _http_method.append( # <<<<<<<<<<<<<< * cparser.llhttp_method_name( i).decode('ascii')) * */ __pyx_t_82 = __Pyx_PyList_Append(__pyx_v_7aiohttp_12_http_parser__http_method, __pyx_t_1); if (unlikely(__pyx_t_82 == ((int)-1))) __PYX_ERR(0, 88, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "(tree fragment)":1 * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage, NULL, __pyx_n_s_aiohttp__http_parser); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_RawRequestMessage, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "(tree fragment)":11 * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) * return __pyx_result * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage, NULL, __pyx_n_s_aiohttp__http_parser); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_RawResponseMessag, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_parser.pyx":1 * #cython: language_level=3 # <<<<<<<<<<<<<< * # * # Based on https://github.com/MagicStack/httptools */ __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_XDECREF(__pyx_t_12); __Pyx_XDECREF(__pyx_t_13); __Pyx_XDECREF(__pyx_t_14); __Pyx_XDECREF(__pyx_t_15); __Pyx_XDECREF(__pyx_t_16); __Pyx_XDECREF(__pyx_t_17); __Pyx_XDECREF(__pyx_t_18); __Pyx_XDECREF(__pyx_t_19); __Pyx_XDECREF(__pyx_t_20); __Pyx_XDECREF(__pyx_t_21); __Pyx_XDECREF(__pyx_t_22); __Pyx_XDECREF(__pyx_t_23); __Pyx_XDECREF(__pyx_t_24); __Pyx_XDECREF(__pyx_t_25); __Pyx_XDECREF(__pyx_t_26); __Pyx_XDECREF(__pyx_t_27); __Pyx_XDECREF(__pyx_t_28); __Pyx_XDECREF(__pyx_t_29); __Pyx_XDECREF(__pyx_t_30); __Pyx_XDECREF(__pyx_t_31); __Pyx_XDECREF(__pyx_t_32); __Pyx_XDECREF(__pyx_t_33); __Pyx_XDECREF(__pyx_t_34); __Pyx_XDECREF(__pyx_t_35); __Pyx_XDECREF(__pyx_t_36); __Pyx_XDECREF(__pyx_t_37); __Pyx_XDECREF(__pyx_t_38); __Pyx_XDECREF(__pyx_t_39); __Pyx_XDECREF(__pyx_t_40); __Pyx_XDECREF(__pyx_t_41); __Pyx_XDECREF(__pyx_t_42); __Pyx_XDECREF(__pyx_t_43); __Pyx_XDECREF(__pyx_t_44); __Pyx_XDECREF(__pyx_t_45); __Pyx_XDECREF(__pyx_t_46); __Pyx_XDECREF(__pyx_t_47); __Pyx_XDECREF(__pyx_t_48); __Pyx_XDECREF(__pyx_t_49); __Pyx_XDECREF(__pyx_t_50); __Pyx_XDECREF(__pyx_t_51); __Pyx_XDECREF(__pyx_t_52); __Pyx_XDECREF(__pyx_t_53); __Pyx_XDECREF(__pyx_t_54); __Pyx_XDECREF(__pyx_t_55); __Pyx_XDECREF(__pyx_t_56); __Pyx_XDECREF(__pyx_t_57); __Pyx_XDECREF(__pyx_t_58); __Pyx_XDECREF(__pyx_t_59); __Pyx_XDECREF(__pyx_t_60); __Pyx_XDECREF(__pyx_t_61); __Pyx_XDECREF(__pyx_t_62); __Pyx_XDECREF(__pyx_t_63); __Pyx_XDECREF(__pyx_t_64); __Pyx_XDECREF(__pyx_t_65); __Pyx_XDECREF(__pyx_t_66); __Pyx_XDECREF(__pyx_t_67); __Pyx_XDECREF(__pyx_t_68); __Pyx_XDECREF(__pyx_t_69); __Pyx_XDECREF(__pyx_t_70); __Pyx_XDECREF(__pyx_t_71); __Pyx_XDECREF(__pyx_t_72); __Pyx_XDECREF(__pyx_t_73); __Pyx_XDECREF(__pyx_t_74); __Pyx_XDECREF(__pyx_t_75); __Pyx_XDECREF(__pyx_t_76); __Pyx_XDECREF(__pyx_t_77); __Pyx_XDECREF(__pyx_t_78); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init aiohttp._http_parser", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_CLEAR(__pyx_m); } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init aiohttp._http_parser"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* GetItemInt */ static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyList_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyTuple_GET_SIZE(o); } if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS if (is_list || PyList_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; if (likely(m && m->sq_item)) { if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { Py_ssize_t l = m->sq_length(o); if (likely(l >= 0)) { i += l; } else { if (!PyErr_ExceptionMatches(PyExc_OverflowError)) return NULL; PyErr_Clear(); } } return m->sq_item(o, i); } } #else if (is_list || PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } /* decode_c_bytes */ static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { if (unlikely((start < 0) | (stop < 0))) { if (start < 0) { start += length; if (start < 0) start = 0; } if (stop < 0) stop += length; } if (stop > length) stop = length; if (unlikely(stop <= start)) return __Pyx_NewRef(__pyx_empty_unicode); length = stop - start; cstring += start; if (decode_func) { return decode_func(cstring, length, errors); } else { return PyUnicode_Decode(cstring, length, encoding, errors); } } /* RaiseArgTupleInvalid */ static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } /* RaiseDoubleKeywords */ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } /* None */ static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) { PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname); } /* RaiseTooManyValuesToUnpack */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } /* RaiseNeedMoreValuesToUnpack */ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", index, (index == 1) ? "" : "s"); } /* IterFinish */ static CYTHON_INLINE int __Pyx_IterFinish(void) { #if CYTHON_FAST_THREAD_STATE PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* exc_type = tstate->curexc_type; if (unlikely(exc_type)) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) { PyObject *exc_value, *exc_tb; exc_value = tstate->curexc_value; exc_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; Py_DECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb); return 0; } else { return -1; } } return 0; #else if (unlikely(PyErr_Occurred())) { if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { PyErr_Clear(); return 0; } else { return -1; } } return 0; #endif } /* UnpackItemEndCheck */ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { if (unlikely(retval)) { Py_DECREF(retval); __Pyx_RaiseTooManyValuesError(expected); return -1; } else { return __Pyx_IterFinish(); } return 0; } /* KeywordStringCheck */ static int __Pyx_CheckKeywordStrings( PyObject *kwdict, const char* function_name, int kw_allowed) { PyObject* key = 0; Py_ssize_t pos = 0; #if CYTHON_COMPILING_IN_PYPY if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0)) goto invalid_keyword; return 1; #else while (PyDict_Next(kwdict, &pos, &key, 0)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyString_Check(key))) #endif if (unlikely(!PyUnicode_Check(key))) goto invalid_keyword_type; } if ((!kw_allowed) && unlikely(key)) goto invalid_keyword; return 1; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); return 0; #endif invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif return 0; } /* ExtTypeTest */ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } if (likely(__Pyx_TypeCheck(obj, type))) return 1; PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", Py_TYPE(obj)->tp_name, type->tp_name); return 0; } /* DictGetItem */ #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { PyObject *value; value = PyDict_GetItemWithError(d, key); if (unlikely(!value)) { if (!PyErr_Occurred()) { if (unlikely(PyTuple_Check(key))) { PyObject* args = PyTuple_Pack(1, key); if (likely(args)) { PyErr_SetObject(PyExc_KeyError, args); Py_DECREF(args); } } else { PyErr_SetObject(PyExc_KeyError, key); } } return NULL; } Py_INCREF(value); return value; } #endif /* PyErrExceptionMatches */ #if CYTHON_FAST_THREAD_STATE static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; icurexc_type; if (exc_type == err) return 1; if (unlikely(!exc_type)) return 0; if (unlikely(PyTuple_Check(err))) return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); } #endif /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #endif /* GetAttr */ static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { #if CYTHON_USE_TYPE_SLOTS #if PY_MAJOR_VERSION >= 3 if (likely(PyUnicode_Check(n))) #else if (likely(PyString_Check(n))) #endif return __Pyx_PyObject_GetAttrStr(o, n); #endif return PyObject_GetAttr(o, n); } /* GetAttr3 */ static PyObject *__Pyx_GetAttr3Default(PyObject *d) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) return NULL; __Pyx_PyErr_Clear(); Py_INCREF(d); return d; } static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { PyObject *r = __Pyx_GetAttr(o, n); return (likely(r)) ? r : __Pyx_GetAttr3Default(d); } /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* GetModuleGlobalName */ #if CYTHON_USE_DICT_VERSIONS static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) #else static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) #endif { PyObject *result; #if !CYTHON_AVOID_BORROWED_REFS #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } else if (unlikely(PyErr_Occurred())) { return NULL; } #else result = PyDict_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } #endif #else result = PyObject_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } PyErr_Clear(); #endif return __Pyx_GetBuiltinName(name); } /* PyFunctionFastCall */ #if CYTHON_FAST_PYCALL static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, PyObject *globals) { PyFrameObject *f; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject **fastlocals; Py_ssize_t i; PyObject *result; assert(globals != NULL); /* XXX Perhaps we should create a specialized PyFrame_New() that doesn't take locals, but does take builtins without sanity checking them. */ assert(tstate != NULL); f = PyFrame_New(tstate, co, globals, NULL); if (f == NULL) { return NULL; } fastlocals = __Pyx_PyFrame_GetLocalsplus(f); for (i = 0; i < na; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } result = PyEval_EvalFrameEx(f,0); ++tstate->recursion_depth; Py_DECREF(f); --tstate->recursion_depth; return result; } #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *closure; #if PY_MAJOR_VERSION >= 3 PyObject *kwdefs; #endif PyObject *kwtuple, **k; PyObject **d; Py_ssize_t nd; Py_ssize_t nk; PyObject *result; assert(kwargs == NULL || PyDict_Check(kwargs)); nk = kwargs ? PyDict_Size(kwargs) : 0; if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { return NULL; } if ( #if PY_MAJOR_VERSION >= 3 co->co_kwonlyargcount == 0 && #endif likely(kwargs == NULL || nk == 0) && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); goto done; } else if (nargs == 0 && argdefs != NULL && co->co_argcount == Py_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = &PyTuple_GET_ITEM(argdefs, 0); result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); goto done; } } if (kwargs != NULL) { Py_ssize_t pos, i; kwtuple = PyTuple_New(2 * nk); if (kwtuple == NULL) { result = NULL; goto done; } k = &PyTuple_GET_ITEM(kwtuple, 0); pos = i = 0; while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { Py_INCREF(k[i]); Py_INCREF(k[i+1]); i += 2; } nk = i / 2; } else { kwtuple = NULL; k = NULL; } closure = PyFunction_GET_CLOSURE(func); #if PY_MAJOR_VERSION >= 3 kwdefs = PyFunction_GET_KW_DEFAULTS(func); #endif if (argdefs != NULL) { d = &PyTuple_GET_ITEM(argdefs, 0); nd = Py_SIZE(argdefs); } else { d = NULL; nd = 0; } #if PY_MAJOR_VERSION >= 3 result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, kwdefs, closure); #else result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, closure); #endif Py_XDECREF(kwtuple); done: Py_LeaveRecursiveCall(); return result; } #endif #endif /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = Py_TYPE(func)->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallMethO */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { PyObject *self, *result; PyCFunction cfunc; cfunc = PyCFunction_GET_FUNCTION(func); self = PyCFunction_GET_SELF(func); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = cfunc(self, arg); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallNoArg */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCall(func, NULL, 0); } #endif #ifdef __Pyx_CyFunction_USED if (likely(PyCFunction_Check(func) || __Pyx_CyFunction_Check(func))) #else if (likely(PyCFunction_Check(func))) #endif { if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { return __Pyx_PyObject_CallMethO(func, NULL); } } return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL); } #endif /* PyCFunctionFastCall */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { PyCFunctionObject *func = (PyCFunctionObject*)func_obj; PyCFunction meth = PyCFunction_GET_FUNCTION(func); PyObject *self = PyCFunction_GET_SELF(func); int flags = PyCFunction_GET_FLAGS(func); assert(PyCFunction_Check(func)); assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); assert(nargs >= 0); assert(nargs == 0 || args != NULL); /* _PyCFunction_FastCallDict() must not be called with an exception set, because it may clear it (directly or indirectly) and so the caller loses its exception */ assert(!PyErr_Occurred()); if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); } else { return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); } } #endif /* PyObjectCallOneArg */ #if CYTHON_COMPILING_IN_CPYTHON static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_New(1); if (unlikely(!args)) return NULL; Py_INCREF(arg); PyTuple_SET_ITEM(args, 0, arg); result = __Pyx_PyObject_Call(func, args, NULL); Py_DECREF(args); return result; } static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCall(func, &arg, 1); } #endif if (likely(PyCFunction_Check(func))) { if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { return __Pyx_PyObject_CallMethO(func, arg); #if CYTHON_FAST_PYCCALL } else if (__Pyx_PyFastCFunction_Check(func)) { return __Pyx_PyCFunction_FastCall(func, &arg, 1); #endif } } return __Pyx__PyObject_CallOneArg(func, arg); } #else static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_Pack(1, arg); if (unlikely(!args)) return NULL; result = __Pyx_PyObject_Call(func, args, NULL); Py_DECREF(args); return result; } #endif /* PyObjectCall2Args */ static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { PyObject *args, *result = NULL; #if CYTHON_FAST_PYCALL if (PyFunction_Check(function)) { PyObject *args[2] = {arg1, arg2}; return __Pyx_PyFunction_FastCall(function, args, 2); } #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(function)) { PyObject *args[2] = {arg1, arg2}; return __Pyx_PyCFunction_FastCall(function, args, 2); } #endif args = PyTuple_New(2); if (unlikely(!args)) goto done; Py_INCREF(arg1); PyTuple_SET_ITEM(args, 0, arg1); Py_INCREF(arg2); PyTuple_SET_ITEM(args, 1, arg2); Py_INCREF(function); result = __Pyx_PyObject_Call(function, args, NULL); Py_DECREF(args); Py_DECREF(function); done: return result; } /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, CYTHON_UNUSED PyObject *cause) { __Pyx_PyThreadState_declare Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if CYTHON_COMPILING_IN_PYPY PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #else PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* BytesEquals */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY return PyObject_RichCompareBool(s1, s2, equals); #else if (s1 == s2) { return (equals == Py_EQ); } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { const char *ps1, *ps2; Py_ssize_t length = PyBytes_GET_SIZE(s1); if (length != PyBytes_GET_SIZE(s2)) return (equals == Py_NE); ps1 = PyBytes_AS_STRING(s1); ps2 = PyBytes_AS_STRING(s2); if (ps1[0] != ps2[0]) { return (equals == Py_NE); } else if (length == 1) { return (equals == Py_EQ); } else { int result; #if CYTHON_USE_UNICODE_INTERNALS Py_hash_t hash1, hash2; hash1 = ((PyBytesObject*)s1)->ob_shash; hash2 = ((PyBytesObject*)s2)->ob_shash; if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { return (equals == Py_NE); } #endif result = memcmp(ps1, ps2, (size_t)length); return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { return (equals == Py_NE); } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { return (equals == Py_NE); } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } #endif } /* UnicodeEquals */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY return PyObject_RichCompareBool(s1, s2, equals); #else #if PY_MAJOR_VERSION < 3 PyObject* owned_ref = NULL; #endif int s1_is_unicode, s2_is_unicode; if (s1 == s2) { goto return_eq; } s1_is_unicode = PyUnicode_CheckExact(s1); s2_is_unicode = PyUnicode_CheckExact(s2); #if PY_MAJOR_VERSION < 3 if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { owned_ref = PyUnicode_FromObject(s2); if (unlikely(!owned_ref)) return -1; s2 = owned_ref; s2_is_unicode = 1; } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { owned_ref = PyUnicode_FromObject(s1); if (unlikely(!owned_ref)) return -1; s1 = owned_ref; s1_is_unicode = 1; } else if (((!s2_is_unicode) & (!s1_is_unicode))) { return __Pyx_PyBytes_Equals(s1, s2, equals); } #endif if (s1_is_unicode & s2_is_unicode) { Py_ssize_t length; int kind; void *data1, *data2; if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) return -1; length = __Pyx_PyUnicode_GET_LENGTH(s1); if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { goto return_ne; } #if CYTHON_USE_UNICODE_INTERNALS { Py_hash_t hash1, hash2; #if CYTHON_PEP393_ENABLED hash1 = ((PyASCIIObject*)s1)->hash; hash2 = ((PyASCIIObject*)s2)->hash; #else hash1 = ((PyUnicodeObject*)s1)->hash; hash2 = ((PyUnicodeObject*)s2)->hash; #endif if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { goto return_ne; } } #endif kind = __Pyx_PyUnicode_KIND(s1); if (kind != __Pyx_PyUnicode_KIND(s2)) { goto return_ne; } data1 = __Pyx_PyUnicode_DATA(s1); data2 = __Pyx_PyUnicode_DATA(s2); if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { goto return_ne; } else if (length == 1) { goto return_eq; } else { int result = memcmp(data1, data2, (size_t)(length * kind)); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & s2_is_unicode) { goto return_ne; } else if ((s2 == Py_None) & s1_is_unicode) { goto return_ne; } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } return_eq: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ); return_ne: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_NE); #endif } /* SliceObject */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) { #if CYTHON_USE_TYPE_SLOTS PyMappingMethods* mp; #if PY_MAJOR_VERSION < 3 PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; if (likely(ms && ms->sq_slice)) { if (!has_cstart) { if (_py_start && (*_py_start != Py_None)) { cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; } else cstart = 0; } if (!has_cstop) { if (_py_stop && (*_py_stop != Py_None)) { cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; } else cstop = PY_SSIZE_T_MAX; } if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { Py_ssize_t l = ms->sq_length(obj); if (likely(l >= 0)) { if (cstop < 0) { cstop += l; if (cstop < 0) cstop = 0; } if (cstart < 0) { cstart += l; if (cstart < 0) cstart = 0; } } else { if (!PyErr_ExceptionMatches(PyExc_OverflowError)) goto bad; PyErr_Clear(); } } return ms->sq_slice(obj, cstart, cstop); } #endif mp = Py_TYPE(obj)->tp_as_mapping; if (likely(mp && mp->mp_subscript)) #endif { PyObject* result; PyObject *py_slice, *py_start, *py_stop; if (_py_slice) { py_slice = *_py_slice; } else { PyObject* owned_start = NULL; PyObject* owned_stop = NULL; if (_py_start) { py_start = *_py_start; } else { if (has_cstart) { owned_start = py_start = PyInt_FromSsize_t(cstart); if (unlikely(!py_start)) goto bad; } else py_start = Py_None; } if (_py_stop) { py_stop = *_py_stop; } else { if (has_cstop) { owned_stop = py_stop = PyInt_FromSsize_t(cstop); if (unlikely(!py_stop)) { Py_XDECREF(owned_start); goto bad; } } else py_stop = Py_None; } py_slice = PySlice_New(py_start, py_stop, Py_None); Py_XDECREF(owned_start); Py_XDECREF(owned_stop); if (unlikely(!py_slice)) goto bad; } #if CYTHON_USE_TYPE_SLOTS result = mp->mp_subscript(obj, py_slice); #else result = PyObject_GetItem(obj, py_slice); #endif if (!_py_slice) { Py_DECREF(py_slice); } return result; } PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name); bad: return NULL; } /* PyUnicode_Substring */ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( PyObject* text, Py_ssize_t start, Py_ssize_t stop) { Py_ssize_t length; if (unlikely(__Pyx_PyUnicode_READY(text) == -1)) return NULL; length = __Pyx_PyUnicode_GET_LENGTH(text); if (start < 0) { start += length; if (start < 0) start = 0; } if (stop < 0) stop += length; else if (stop > length) stop = length; if (stop <= start) return __Pyx_NewRef(__pyx_empty_unicode); #if CYTHON_PEP393_ENABLED return PyUnicode_FromKindAndData(PyUnicode_KIND(text), PyUnicode_1BYTE_DATA(text) + start*PyUnicode_KIND(text), stop-start); #else return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(text)+start, stop-start); #endif } /* GetException */ #if CYTHON_FAST_THREAD_STATE static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) #endif { PyObject *local_type, *local_value, *local_tb; #if CYTHON_FAST_THREAD_STATE PyObject *tmp_type, *tmp_value, *tmp_tb; local_type = tstate->curexc_type; local_value = tstate->curexc_value; local_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(&local_type, &local_value, &local_tb); #endif PyErr_NormalizeException(&local_type, &local_value, &local_tb); #if CYTHON_FAST_THREAD_STATE if (unlikely(tstate->curexc_type)) #else if (unlikely(PyErr_Occurred())) #endif goto bad; #if PY_MAJOR_VERSION >= 3 if (local_tb) { if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) goto bad; } #endif Py_XINCREF(local_tb); Py_XINCREF(local_type); Py_XINCREF(local_value); *type = local_type; *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE #if CYTHON_USE_EXC_INFO_STACK { _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = local_type; exc_info->exc_value = local_value; exc_info->exc_traceback = local_tb; } #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(local_type, local_value, local_tb); #endif return 0; bad: *type = 0; *value = 0; *tb = 0; Py_XDECREF(local_type); Py_XDECREF(local_value); Py_XDECREF(local_tb); return -1; } /* SwapException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = *type; exc_info->exc_value = *value; exc_info->exc_traceback = *tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = *type; tstate->exc_value = *value; tstate->exc_traceback = *tb; #endif *type = tmp_type; *value = tmp_value; *tb = tmp_tb; } #else static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); PyErr_SetExcInfo(*type, *value, *tb); *type = tmp_type; *value = tmp_value; *tb = tmp_tb; } #endif /* GetTopmostException */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate) { _PyErr_StackItem *exc_info = tstate->exc_info; while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && exc_info->previous_item != NULL) { exc_info = exc_info->previous_item; } return exc_info; } #endif /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); *type = exc_info->exc_type; *value = exc_info->exc_value; *tb = exc_info->exc_traceback; #else *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; #endif Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = type; exc_info->exc_value = value; exc_info->exc_traceback = tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } #endif /* Import */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; #if PY_MAJOR_VERSION < 3 PyObject *py_import; py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); if (!py_import) goto bad; #endif if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, 1); if (!module) { if (!PyErr_ExceptionMatches(PyExc_ImportError)) goto bad; PyErr_Clear(); } } level = 0; } #endif if (!module) { #if PY_MAJOR_VERSION < 3 PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, level); #endif } } bad: #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_import); #endif Py_XDECREF(empty_list); Py_XDECREF(empty_dict); return module; } /* ImportFrom */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Format(PyExc_ImportError, #if PY_MAJOR_VERSION < 3 "cannot import name %.230s", PyString_AS_STRING(name)); #else "cannot import name %S", name); #endif } return value; } /* HasAttr */ static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { PyObject *r; if (unlikely(!__Pyx_PyBaseString_Check(n))) { PyErr_SetString(PyExc_TypeError, "hasattr(): attribute name must be string"); return -1; } r = __Pyx_GetAttr(o, n); if (unlikely(!r)) { PyErr_Clear(); return 0; } else { Py_DECREF(r); return 1; } } /* PyObject_GenericGetAttrNoDict */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'%.50s' object has no attribute '%U'", tp->tp_name, attr_name); #else "'%.50s' object has no attribute '%.400s'", tp->tp_name, PyString_AS_STRING(attr_name)); #endif return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { PyObject *descr; PyTypeObject *tp = Py_TYPE(obj); if (unlikely(!PyString_Check(attr_name))) { return PyObject_GenericGetAttr(obj, attr_name); } assert(!tp->tp_dictoffset); descr = _PyType_Lookup(tp, attr_name); if (unlikely(!descr)) { return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); } Py_INCREF(descr); #if PY_MAJOR_VERSION < 3 if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) #endif { descrgetfunc f = Py_TYPE(descr)->tp_descr_get; if (unlikely(f)) { PyObject *res = f(descr, obj, (PyObject *)tp); Py_DECREF(descr); return res; } } return descr; } #endif /* PyObject_GenericGetAttr */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { return PyObject_GenericGetAttr(obj, attr_name); } return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); } #endif /* PyObjectGetAttrStrNoError */ static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) __Pyx_PyErr_Clear(); } static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { PyObject *result; #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); } #endif result = __Pyx_PyObject_GetAttrStr(obj, attr_name); if (unlikely(!result)) { __Pyx_PyObject_GetAttrStr_ClearAttributeError(); } return result; } /* SetupReduce */ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { int ret; PyObject *name_attr; name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name); if (likely(name_attr)) { ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); } else { ret = -1; } if (unlikely(ret < 0)) { PyErr_Clear(); ret = 0; } Py_XDECREF(name_attr); return ret; } static int __Pyx_setup_reduce(PyObject* type_obj) { int ret = 0; PyObject *object_reduce = NULL; PyObject *object_reduce_ex = NULL; PyObject *reduce = NULL; PyObject *reduce_ex = NULL; PyObject *reduce_cython = NULL; PyObject *setstate = NULL; PyObject *setstate_cython = NULL; #if CYTHON_USE_PYTYPE_LOOKUP if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; #else if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; #endif #if CYTHON_USE_PYTYPE_LOOKUP object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #else object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #endif reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; if (reduce_ex == object_reduce_ex) { #if CYTHON_USE_PYTYPE_LOOKUP object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #else object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #endif reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); if (likely(reduce_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (reduce == object_reduce || PyErr_Occurred()) { goto __PYX_BAD; } setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); if (!setstate) PyErr_Clear(); if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); if (likely(setstate_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (!setstate || PyErr_Occurred()) { goto __PYX_BAD; } } PyType_Modified((PyTypeObject*)type_obj); } } goto __PYX_GOOD; __PYX_BAD: if (!PyErr_Occurred()) PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); ret = -1; __PYX_GOOD: #if !CYTHON_USE_PYTYPE_LOOKUP Py_XDECREF(object_reduce); Py_XDECREF(object_reduce_ex); #endif Py_XDECREF(reduce); Py_XDECREF(reduce_ex); Py_XDECREF(reduce_cython); Py_XDECREF(setstate); Py_XDECREF(setstate_cython); return ret; } /* SetVTable */ static int __Pyx_SetVtable(PyObject *dict, void *vtable) { #if PY_VERSION_HEX >= 0x02070000 PyObject *ob = PyCapsule_New(vtable, 0, 0); #else PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); #endif if (!ob) goto bad; if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0) goto bad; Py_DECREF(ob); return 0; bad: Py_XDECREF(ob); return -1; } /* TypeImport */ #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size) { PyObject *result = 0; char warning[200]; Py_ssize_t basicsize; #ifdef Py_LIMITED_API PyObject *py_basicsize; #endif result = PyObject_GetAttrString(module, class_name); if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%.200s.%.200s is not a type object", module_name, class_name); goto bad; } #ifndef Py_LIMITED_API basicsize = ((PyTypeObject *)result)->tp_basicsize; #else py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); if (!py_basicsize) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; #endif if ((size_t)basicsize < size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(result); return NULL; } #endif /* decode_c_string */ static CYTHON_INLINE PyObject* __Pyx_decode_c_string( const char* cstring, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { Py_ssize_t length; if (unlikely((start < 0) | (stop < 0))) { size_t slen = strlen(cstring); if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) { PyErr_SetString(PyExc_OverflowError, "c-string too long to convert to Python"); return NULL; } length = (Py_ssize_t) slen; if (start < 0) { start += length; if (start < 0) start = 0; } if (stop < 0) stop += length; } if (unlikely(stop <= start)) return __Pyx_NewRef(__pyx_empty_unicode); length = stop - start; cstring += start; if (decode_func) { return decode_func(cstring, length, errors); } else { return PyUnicode_Decode(cstring, length, encoding, errors); } } /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(int) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(int), little, !is_unsigned); } } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) case -2: if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* CIntFromPy */ static CYTHON_INLINE enum llhttp_method __Pyx_PyInt_As_enum__llhttp_method(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const enum llhttp_method neg_one = (enum llhttp_method) -1, const_zero = (enum llhttp_method) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(enum llhttp_method) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (enum llhttp_method) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (enum llhttp_method) 0; case 1: __PYX_VERIFY_RETURN_INT(enum llhttp_method, digit, digits[0]) case 2: if (8 * sizeof(enum llhttp_method) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(enum llhttp_method) >= 2 * PyLong_SHIFT) { return (enum llhttp_method) (((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); } } break; case 3: if (8 * sizeof(enum llhttp_method) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(enum llhttp_method) >= 3 * PyLong_SHIFT) { return (enum llhttp_method) (((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); } } break; case 4: if (8 * sizeof(enum llhttp_method) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(enum llhttp_method) >= 4 * PyLong_SHIFT) { return (enum llhttp_method) (((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (enum llhttp_method) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(enum llhttp_method) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(enum llhttp_method) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (enum llhttp_method) 0; case -1: __PYX_VERIFY_RETURN_INT(enum llhttp_method, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(enum llhttp_method, digit, +digits[0]) case -2: if (8 * sizeof(enum llhttp_method) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT) { return (enum llhttp_method) (((enum llhttp_method)-1)*(((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; case 2: if (8 * sizeof(enum llhttp_method) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT) { return (enum llhttp_method) ((((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; case -3: if (8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT) { return (enum llhttp_method) (((enum llhttp_method)-1)*(((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; case 3: if (8 * sizeof(enum llhttp_method) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT) { return (enum llhttp_method) ((((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; case -4: if (8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(enum llhttp_method) - 1 > 4 * PyLong_SHIFT) { return (enum llhttp_method) (((enum llhttp_method)-1)*(((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; case 4: if (8 * sizeof(enum llhttp_method) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(enum llhttp_method) - 1 > 4 * PyLong_SHIFT) { return (enum llhttp_method) ((((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); } } break; } #endif if (sizeof(enum llhttp_method) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(enum llhttp_method) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else enum llhttp_method val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (enum llhttp_method) -1; } } else { enum llhttp_method val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (enum llhttp_method) -1; val = __Pyx_PyInt_As_enum__llhttp_method(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to enum llhttp_method"); return (enum llhttp_method) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to enum llhttp_method"); return (enum llhttp_method) -1; } /* CIntFromPy */ static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(size_t) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (size_t) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (size_t) 0; case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, digits[0]) case 2: if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(size_t) >= 2 * PyLong_SHIFT) { return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } } break; case 3: if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(size_t) >= 3 * PyLong_SHIFT) { return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } } break; case 4: if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(size_t) >= 4 * PyLong_SHIFT) { return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (size_t) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(size_t) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (size_t) 0; case -1: __PYX_VERIFY_RETURN_INT(size_t, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, +digits[0]) case -2: if (8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case 2: if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case -3: if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case 3: if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case -4: if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; case 4: if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); } } break; } #endif if (sizeof(size_t) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(size_t) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else size_t val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (size_t) -1; } } else { size_t val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (size_t) -1; val = __Pyx_PyInt_As_size_t(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to size_t"); return (size_t) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to size_t"); return (size_t) -1; } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) case -2: if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint8_t(uint8_t value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const uint8_t neg_one = (uint8_t) -1, const_zero = (uint8_t) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(uint8_t) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(uint8_t) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(uint8_t) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(uint8_t) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(uint8_t) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(uint8_t), little, !is_unsigned); } } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = a->tp_base; if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; if (!res) { res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } return res; } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; itp_name); if (cached_type) { if (!PyType_Check((PyObject*)cached_type)) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s is not a type object", type->tp_name); goto bad; } if (cached_type->tp_basicsize != type->tp_basicsize) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s has the wrong size, try recompiling", type->tp_name); goto bad; } } else { if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; PyErr_Clear(); if (PyType_Ready(type) < 0) goto bad; if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0) goto bad; Py_INCREF(type); cached_type = type; } done: Py_DECREF(fake_module); return cached_type; bad: Py_XDECREF(cached_type); cached_type = NULL; goto done; } /* PyObjectGetMethod */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { PyObject *attr; #if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP PyTypeObject *tp = Py_TYPE(obj); PyObject *descr; descrgetfunc f = NULL; PyObject **dictptr, *dict; int meth_found = 0; assert (*method == NULL); if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; } if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { return 0; } descr = _PyType_Lookup(tp, name); if (likely(descr != NULL)) { Py_INCREF(descr); #if PY_MAJOR_VERSION >= 3 #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type))) #endif #else #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr))) #endif #endif { meth_found = 1; } else { f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } } } dictptr = _PyObject_GetDictPtr(obj); if (dictptr != NULL && (dict = *dictptr) != NULL) { Py_INCREF(dict); attr = __Pyx_PyDict_GetItemStr(dict, name); if (attr != NULL) { Py_INCREF(attr); Py_DECREF(dict); Py_XDECREF(descr); goto try_unpack; } Py_DECREF(dict); } if (meth_found) { *method = descr; return 1; } if (f != NULL) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } if (descr != NULL) { *method = descr; return 0; } PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'%.50s' object has no attribute '%U'", tp->tp_name, name); #else "'%.50s' object has no attribute '%.400s'", tp->tp_name, PyString_AS_STRING(name)); #endif return 0; #else attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; #endif try_unpack: #if CYTHON_UNPACK_METHODS if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { PyObject *function = PyMethod_GET_FUNCTION(attr); Py_INCREF(function); Py_DECREF(attr); *method = function; return 1; } #endif *method = attr; return 0; } /* PyObjectCallMethod1 */ static PyObject* __Pyx__PyObject_CallMethod1(PyObject* method, PyObject* arg) { PyObject *result = __Pyx_PyObject_CallOneArg(method, arg); Py_DECREF(method); return result; } static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) { PyObject *method = NULL, *result; int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); if (likely(is_method)) { result = __Pyx_PyObject_Call2Args(method, obj, arg); Py_DECREF(method); return result; } if (unlikely(!method)) return NULL; return __Pyx__PyObject_CallMethod1(method, arg); } /* CoroutineBase */ #include #include #define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom) static int __Pyx_PyGen__FetchStopIterationValue(CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject **pvalue) { PyObject *et, *ev, *tb; PyObject *value = NULL; __Pyx_ErrFetch(&et, &ev, &tb); if (!et) { Py_XDECREF(tb); Py_XDECREF(ev); Py_INCREF(Py_None); *pvalue = Py_None; return 0; } if (likely(et == PyExc_StopIteration)) { if (!ev) { Py_INCREF(Py_None); value = Py_None; } #if PY_VERSION_HEX >= 0x030300A0 else if (Py_TYPE(ev) == (PyTypeObject*)PyExc_StopIteration) { value = ((PyStopIterationObject *)ev)->value; Py_INCREF(value); Py_DECREF(ev); } #endif else if (unlikely(PyTuple_Check(ev))) { if (PyTuple_GET_SIZE(ev) >= 1) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS value = PyTuple_GET_ITEM(ev, 0); Py_INCREF(value); #else value = PySequence_ITEM(ev, 0); #endif } else { Py_INCREF(Py_None); value = Py_None; } Py_DECREF(ev); } else if (!__Pyx_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration)) { value = ev; } if (likely(value)) { Py_XDECREF(tb); Py_DECREF(et); *pvalue = value; return 0; } } else if (!__Pyx_PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) { __Pyx_ErrRestore(et, ev, tb); return -1; } PyErr_NormalizeException(&et, &ev, &tb); if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration))) { __Pyx_ErrRestore(et, ev, tb); return -1; } Py_XDECREF(tb); Py_DECREF(et); #if PY_VERSION_HEX >= 0x030300A0 value = ((PyStopIterationObject *)ev)->value; Py_INCREF(value); Py_DECREF(ev); #else { PyObject* args = __Pyx_PyObject_GetAttrStr(ev, __pyx_n_s_args); Py_DECREF(ev); if (likely(args)) { value = PySequence_GetItem(args, 0); Py_DECREF(args); } if (unlikely(!value)) { __Pyx_ErrRestore(NULL, NULL, NULL); Py_INCREF(Py_None); value = Py_None; } } #endif *pvalue = value; return 0; } static CYTHON_INLINE void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *exc_state) { PyObject *t, *v, *tb; t = exc_state->exc_type; v = exc_state->exc_value; tb = exc_state->exc_traceback; exc_state->exc_type = NULL; exc_state->exc_value = NULL; exc_state->exc_traceback = NULL; Py_XDECREF(t); Py_XDECREF(v); Py_XDECREF(tb); } #define __Pyx_Coroutine_AlreadyRunningError(gen) (__Pyx__Coroutine_AlreadyRunningError(gen), (PyObject*)NULL) static void __Pyx__Coroutine_AlreadyRunningError(CYTHON_UNUSED __pyx_CoroutineObject *gen) { const char *msg; if ((0)) { #ifdef __Pyx_Coroutine_USED } else if (__Pyx_Coroutine_Check((PyObject*)gen)) { msg = "coroutine already executing"; #endif #ifdef __Pyx_AsyncGen_USED } else if (__Pyx_AsyncGen_CheckExact((PyObject*)gen)) { msg = "async generator already executing"; #endif } else { msg = "generator already executing"; } PyErr_SetString(PyExc_ValueError, msg); } #define __Pyx_Coroutine_NotStartedError(gen) (__Pyx__Coroutine_NotStartedError(gen), (PyObject*)NULL) static void __Pyx__Coroutine_NotStartedError(CYTHON_UNUSED PyObject *gen) { const char *msg; if ((0)) { #ifdef __Pyx_Coroutine_USED } else if (__Pyx_Coroutine_Check(gen)) { msg = "can't send non-None value to a just-started coroutine"; #endif #ifdef __Pyx_AsyncGen_USED } else if (__Pyx_AsyncGen_CheckExact(gen)) { msg = "can't send non-None value to a just-started async generator"; #endif } else { msg = "can't send non-None value to a just-started generator"; } PyErr_SetString(PyExc_TypeError, msg); } #define __Pyx_Coroutine_AlreadyTerminatedError(gen, value, closing) (__Pyx__Coroutine_AlreadyTerminatedError(gen, value, closing), (PyObject*)NULL) static void __Pyx__Coroutine_AlreadyTerminatedError(CYTHON_UNUSED PyObject *gen, PyObject *value, CYTHON_UNUSED int closing) { #ifdef __Pyx_Coroutine_USED if (!closing && __Pyx_Coroutine_Check(gen)) { PyErr_SetString(PyExc_RuntimeError, "cannot reuse already awaited coroutine"); } else #endif if (value) { #ifdef __Pyx_AsyncGen_USED if (__Pyx_AsyncGen_CheckExact(gen)) PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration); else #endif PyErr_SetNone(PyExc_StopIteration); } } static PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, int closing) { __Pyx_PyThreadState_declare PyThreadState *tstate; __Pyx_ExcInfoStruct *exc_state; PyObject *retval; assert(!self->is_running); if (unlikely(self->resume_label == 0)) { if (unlikely(value && value != Py_None)) { return __Pyx_Coroutine_NotStartedError((PyObject*)self); } } if (unlikely(self->resume_label == -1)) { return __Pyx_Coroutine_AlreadyTerminatedError((PyObject*)self, value, closing); } #if CYTHON_FAST_THREAD_STATE __Pyx_PyThreadState_assign tstate = __pyx_tstate; #else tstate = __Pyx_PyThreadState_Current; #endif exc_state = &self->gi_exc_state; if (exc_state->exc_type) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON #else if (exc_state->exc_traceback) { PyTracebackObject *tb = (PyTracebackObject *) exc_state->exc_traceback; PyFrameObject *f = tb->tb_frame; Py_XINCREF(tstate->frame); assert(f->f_back == NULL); f->f_back = tstate->frame; } #endif } #if CYTHON_USE_EXC_INFO_STACK exc_state->previous_item = tstate->exc_info; tstate->exc_info = exc_state; #else if (exc_state->exc_type) { __Pyx_ExceptionSwap(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback); } else { __Pyx_Coroutine_ExceptionClear(exc_state); __Pyx_ExceptionSave(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback); } #endif self->is_running = 1; retval = self->body((PyObject *) self, tstate, value); self->is_running = 0; #if CYTHON_USE_EXC_INFO_STACK exc_state = &self->gi_exc_state; tstate->exc_info = exc_state->previous_item; exc_state->previous_item = NULL; __Pyx_Coroutine_ResetFrameBackpointer(exc_state); #endif return retval; } static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state) { PyObject *exc_tb = exc_state->exc_traceback; if (likely(exc_tb)) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON #else PyTracebackObject *tb = (PyTracebackObject *) exc_tb; PyFrameObject *f = tb->tb_frame; Py_CLEAR(f->f_back); #endif } } static CYTHON_INLINE PyObject *__Pyx_Coroutine_MethodReturn(CYTHON_UNUSED PyObject* gen, PyObject *retval) { if (unlikely(!retval)) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (!__Pyx_PyErr_Occurred()) { PyObject *exc = PyExc_StopIteration; #ifdef __Pyx_AsyncGen_USED if (__Pyx_AsyncGen_CheckExact(gen)) exc = __Pyx_PyExc_StopAsyncIteration; #endif __Pyx_PyErr_SetNone(exc); } } return retval; } #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) static CYTHON_INLINE PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) { #if PY_VERSION_HEX <= 0x030A00A1 return _PyGen_Send(gen, arg); #else PyObject *result; if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) { if (PyAsyncGen_CheckExact(gen)) { assert(result == Py_None); PyErr_SetNone(PyExc_StopAsyncIteration); } else if (result == Py_None) { PyErr_SetNone(PyExc_StopIteration); } else { _PyGen_SetStopIterationValue(result); } Py_CLEAR(result); } return result; #endif } #endif static CYTHON_INLINE PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { PyObject *ret; PyObject *val = NULL; __Pyx_Coroutine_Undelegate(gen); __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, &val); ret = __Pyx_Coroutine_SendEx(gen, val, 0); Py_XDECREF(val); return ret; } static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { PyObject *retval; __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; PyObject *yf = gen->yieldfrom; if (unlikely(gen->is_running)) return __Pyx_Coroutine_AlreadyRunningError(gen); if (yf) { PyObject *ret; gen->is_running = 1; #ifdef __Pyx_Generator_USED if (__Pyx_Generator_CheckExact(yf)) { ret = __Pyx_Coroutine_Send(yf, value); } else #endif #ifdef __Pyx_Coroutine_USED if (__Pyx_Coroutine_Check(yf)) { ret = __Pyx_Coroutine_Send(yf, value); } else #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_PyAsyncGenASend_CheckExact(yf)) { ret = __Pyx_async_gen_asend_send(yf, value); } else #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) if (PyGen_CheckExact(yf)) { ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); } else #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) if (PyCoro_CheckExact(yf)) { ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); } else #endif { if (value == Py_None) ret = Py_TYPE(yf)->tp_iternext(yf); else ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value); } gen->is_running = 0; if (likely(ret)) { return ret; } retval = __Pyx_Coroutine_FinishDelegation(gen); } else { retval = __Pyx_Coroutine_SendEx(gen, value, 0); } return __Pyx_Coroutine_MethodReturn(self, retval); } static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) { PyObject *retval = NULL; int err = 0; #ifdef __Pyx_Generator_USED if (__Pyx_Generator_CheckExact(yf)) { retval = __Pyx_Coroutine_Close(yf); if (!retval) return -1; } else #endif #ifdef __Pyx_Coroutine_USED if (__Pyx_Coroutine_Check(yf)) { retval = __Pyx_Coroutine_Close(yf); if (!retval) return -1; } else if (__Pyx_CoroutineAwait_CheckExact(yf)) { retval = __Pyx_CoroutineAwait_Close((__pyx_CoroutineAwaitObject*)yf, NULL); if (!retval) return -1; } else #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_PyAsyncGenASend_CheckExact(yf)) { retval = __Pyx_async_gen_asend_close(yf, NULL); } else if (__pyx_PyAsyncGenAThrow_CheckExact(yf)) { retval = __Pyx_async_gen_athrow_close(yf, NULL); } else #endif { PyObject *meth; gen->is_running = 1; meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_close); if (unlikely(!meth)) { if (!PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_WriteUnraisable(yf); } PyErr_Clear(); } else { retval = PyObject_CallFunction(meth, NULL); Py_DECREF(meth); if (!retval) err = -1; } gen->is_running = 0; } Py_XDECREF(retval); return err; } static PyObject *__Pyx_Generator_Next(PyObject *self) { __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; PyObject *yf = gen->yieldfrom; if (unlikely(gen->is_running)) return __Pyx_Coroutine_AlreadyRunningError(gen); if (yf) { PyObject *ret; gen->is_running = 1; #ifdef __Pyx_Generator_USED if (__Pyx_Generator_CheckExact(yf)) { ret = __Pyx_Generator_Next(yf); } else #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) if (PyGen_CheckExact(yf)) { ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL); } else #endif #ifdef __Pyx_Coroutine_USED if (__Pyx_Coroutine_Check(yf)) { ret = __Pyx_Coroutine_Send(yf, Py_None); } else #endif ret = Py_TYPE(yf)->tp_iternext(yf); gen->is_running = 0; if (likely(ret)) { return ret; } return __Pyx_Coroutine_FinishDelegation(gen); } return __Pyx_Coroutine_SendEx(gen, Py_None, 0); } static PyObject *__Pyx_Coroutine_Close_Method(PyObject *self, CYTHON_UNUSED PyObject *arg) { return __Pyx_Coroutine_Close(self); } static PyObject *__Pyx_Coroutine_Close(PyObject *self) { __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; PyObject *retval, *raised_exception; PyObject *yf = gen->yieldfrom; int err = 0; if (unlikely(gen->is_running)) return __Pyx_Coroutine_AlreadyRunningError(gen); if (yf) { Py_INCREF(yf); err = __Pyx_Coroutine_CloseIter(gen, yf); __Pyx_Coroutine_Undelegate(gen); Py_DECREF(yf); } if (err == 0) PyErr_SetNone(PyExc_GeneratorExit); retval = __Pyx_Coroutine_SendEx(gen, NULL, 1); if (unlikely(retval)) { const char *msg; Py_DECREF(retval); if ((0)) { #ifdef __Pyx_Coroutine_USED } else if (__Pyx_Coroutine_Check(self)) { msg = "coroutine ignored GeneratorExit"; #endif #ifdef __Pyx_AsyncGen_USED } else if (__Pyx_AsyncGen_CheckExact(self)) { #if PY_VERSION_HEX < 0x03060000 msg = "async generator ignored GeneratorExit - might require Python 3.6+ finalisation (PEP 525)"; #else msg = "async generator ignored GeneratorExit"; #endif #endif } else { msg = "generator ignored GeneratorExit"; } PyErr_SetString(PyExc_RuntimeError, msg); return NULL; } raised_exception = PyErr_Occurred(); if (likely(!raised_exception || __Pyx_PyErr_GivenExceptionMatches2(raised_exception, PyExc_GeneratorExit, PyExc_StopIteration))) { if (raised_exception) PyErr_Clear(); Py_INCREF(Py_None); return Py_None; } return NULL; } static PyObject *__Pyx__Coroutine_Throw(PyObject *self, PyObject *typ, PyObject *val, PyObject *tb, PyObject *args, int close_on_genexit) { __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; PyObject *yf = gen->yieldfrom; if (unlikely(gen->is_running)) return __Pyx_Coroutine_AlreadyRunningError(gen); if (yf) { PyObject *ret; Py_INCREF(yf); if (__Pyx_PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit) && close_on_genexit) { int err = __Pyx_Coroutine_CloseIter(gen, yf); Py_DECREF(yf); __Pyx_Coroutine_Undelegate(gen); if (err < 0) return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0)); goto throw_here; } gen->is_running = 1; if (0 #ifdef __Pyx_Generator_USED || __Pyx_Generator_CheckExact(yf) #endif #ifdef __Pyx_Coroutine_USED || __Pyx_Coroutine_Check(yf) #endif ) { ret = __Pyx__Coroutine_Throw(yf, typ, val, tb, args, close_on_genexit); #ifdef __Pyx_Coroutine_USED } else if (__Pyx_CoroutineAwait_CheckExact(yf)) { ret = __Pyx__Coroutine_Throw(((__pyx_CoroutineAwaitObject*)yf)->coroutine, typ, val, tb, args, close_on_genexit); #endif } else { PyObject *meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_throw); if (unlikely(!meth)) { Py_DECREF(yf); if (!PyErr_ExceptionMatches(PyExc_AttributeError)) { gen->is_running = 0; return NULL; } PyErr_Clear(); __Pyx_Coroutine_Undelegate(gen); gen->is_running = 0; goto throw_here; } if (likely(args)) { ret = PyObject_CallObject(meth, args); } else { ret = PyObject_CallFunctionObjArgs(meth, typ, val, tb, NULL); } Py_DECREF(meth); } gen->is_running = 0; Py_DECREF(yf); if (!ret) { ret = __Pyx_Coroutine_FinishDelegation(gen); } return __Pyx_Coroutine_MethodReturn(self, ret); } throw_here: __Pyx_Raise(typ, val, tb, NULL); return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0)); } static PyObject *__Pyx_Coroutine_Throw(PyObject *self, PyObject *args) { PyObject *typ; PyObject *val = NULL; PyObject *tb = NULL; if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb)) return NULL; return __Pyx__Coroutine_Throw(self, typ, val, tb, args, 1); } static CYTHON_INLINE int __Pyx_Coroutine_traverse_excstate(__Pyx_ExcInfoStruct *exc_state, visitproc visit, void *arg) { Py_VISIT(exc_state->exc_type); Py_VISIT(exc_state->exc_value); Py_VISIT(exc_state->exc_traceback); return 0; } static int __Pyx_Coroutine_traverse(__pyx_CoroutineObject *gen, visitproc visit, void *arg) { Py_VISIT(gen->closure); Py_VISIT(gen->classobj); Py_VISIT(gen->yieldfrom); return __Pyx_Coroutine_traverse_excstate(&gen->gi_exc_state, visit, arg); } static int __Pyx_Coroutine_clear(PyObject *self) { __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; Py_CLEAR(gen->closure); Py_CLEAR(gen->classobj); Py_CLEAR(gen->yieldfrom); __Pyx_Coroutine_ExceptionClear(&gen->gi_exc_state); #ifdef __Pyx_AsyncGen_USED if (__Pyx_AsyncGen_CheckExact(self)) { Py_CLEAR(((__pyx_PyAsyncGenObject*)gen)->ag_finalizer); } #endif Py_CLEAR(gen->gi_code); Py_CLEAR(gen->gi_frame); Py_CLEAR(gen->gi_name); Py_CLEAR(gen->gi_qualname); Py_CLEAR(gen->gi_modulename); return 0; } static void __Pyx_Coroutine_dealloc(PyObject *self) { __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; PyObject_GC_UnTrack(gen); if (gen->gi_weakreflist != NULL) PyObject_ClearWeakRefs(self); if (gen->resume_label >= 0) { PyObject_GC_Track(self); #if PY_VERSION_HEX >= 0x030400a1 && CYTHON_USE_TP_FINALIZE if (PyObject_CallFinalizerFromDealloc(self)) #else Py_TYPE(gen)->tp_del(self); if (Py_REFCNT(self) > 0) #endif { return; } PyObject_GC_UnTrack(self); } #ifdef __Pyx_AsyncGen_USED if (__Pyx_AsyncGen_CheckExact(self)) { /* We have to handle this case for asynchronous generators right here, because this code has to be between UNTRACK and GC_Del. */ Py_CLEAR(((__pyx_PyAsyncGenObject*)self)->ag_finalizer); } #endif __Pyx_Coroutine_clear(self); PyObject_GC_Del(gen); } static void __Pyx_Coroutine_del(PyObject *self) { PyObject *error_type, *error_value, *error_traceback; __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; __Pyx_PyThreadState_declare if (gen->resume_label < 0) { return; } #if !CYTHON_USE_TP_FINALIZE assert(self->ob_refcnt == 0); __Pyx_SET_REFCNT(self, 1); #endif __Pyx_PyThreadState_assign __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); #ifdef __Pyx_AsyncGen_USED if (__Pyx_AsyncGen_CheckExact(self)) { __pyx_PyAsyncGenObject *agen = (__pyx_PyAsyncGenObject*)self; PyObject *finalizer = agen->ag_finalizer; if (finalizer && !agen->ag_closed) { PyObject *res = __Pyx_PyObject_CallOneArg(finalizer, self); if (unlikely(!res)) { PyErr_WriteUnraisable(self); } else { Py_DECREF(res); } __Pyx_ErrRestore(error_type, error_value, error_traceback); return; } } #endif if (unlikely(gen->resume_label == 0 && !error_value)) { #ifdef __Pyx_Coroutine_USED #ifdef __Pyx_Generator_USED if (!__Pyx_Generator_CheckExact(self)) #endif { PyObject_GC_UnTrack(self); #if PY_MAJOR_VERSION >= 3 || defined(PyErr_WarnFormat) if (unlikely(PyErr_WarnFormat(PyExc_RuntimeWarning, 1, "coroutine '%.50S' was never awaited", gen->gi_qualname) < 0)) PyErr_WriteUnraisable(self); #else {PyObject *msg; char *cmsg; #if CYTHON_COMPILING_IN_PYPY msg = NULL; cmsg = (char*) "coroutine was never awaited"; #else char *cname; PyObject *qualname; qualname = gen->gi_qualname; cname = PyString_AS_STRING(qualname); msg = PyString_FromFormat("coroutine '%.50s' was never awaited", cname); if (unlikely(!msg)) { PyErr_Clear(); cmsg = (char*) "coroutine was never awaited"; } else { cmsg = PyString_AS_STRING(msg); } #endif if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, cmsg, 1) < 0)) PyErr_WriteUnraisable(self); Py_XDECREF(msg);} #endif PyObject_GC_Track(self); } #endif } else { PyObject *res = __Pyx_Coroutine_Close(self); if (unlikely(!res)) { if (PyErr_Occurred()) PyErr_WriteUnraisable(self); } else { Py_DECREF(res); } } __Pyx_ErrRestore(error_type, error_value, error_traceback); #if !CYTHON_USE_TP_FINALIZE assert(Py_REFCNT(self) > 0); if (--self->ob_refcnt == 0) { return; } { Py_ssize_t refcnt = Py_REFCNT(self); _Py_NewReference(self); __Pyx_SET_REFCNT(self, refcnt); } #if CYTHON_COMPILING_IN_CPYTHON assert(PyType_IS_GC(Py_TYPE(self)) && _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); _Py_DEC_REFTOTAL; #endif #ifdef COUNT_ALLOCS --Py_TYPE(self)->tp_frees; --Py_TYPE(self)->tp_allocs; #endif #endif } static PyObject * __Pyx_Coroutine_get_name(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) { PyObject *name = self->gi_name; if (unlikely(!name)) name = Py_None; Py_INCREF(name); return name; } static int __Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value, CYTHON_UNUSED void *context) { PyObject *tmp; #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__name__ must be set to a string object"); return -1; } tmp = self->gi_name; Py_INCREF(value); self->gi_name = value; Py_XDECREF(tmp); return 0; } static PyObject * __Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) { PyObject *name = self->gi_qualname; if (unlikely(!name)) name = Py_None; Py_INCREF(name); return name; } static int __Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, CYTHON_UNUSED void *context) { PyObject *tmp; #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__qualname__ must be set to a string object"); return -1; } tmp = self->gi_qualname; Py_INCREF(value); self->gi_qualname = value; Py_XDECREF(tmp); return 0; } static PyObject * __Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) { PyObject *frame = self->gi_frame; if (!frame) { if (unlikely(!self->gi_code)) { Py_RETURN_NONE; } frame = (PyObject *) PyFrame_New( PyThreadState_Get(), /*PyThreadState *tstate,*/ (PyCodeObject*) self->gi_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (unlikely(!frame)) return NULL; self->gi_frame = frame; } Py_INCREF(frame); return frame; } static __pyx_CoroutineObject *__Pyx__Coroutine_New( PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, PyObject *name, PyObject *qualname, PyObject *module_name) { __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type); if (unlikely(!gen)) return NULL; return __Pyx__Coroutine_NewInit(gen, body, code, closure, name, qualname, module_name); } static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, PyObject *name, PyObject *qualname, PyObject *module_name) { gen->body = body; gen->closure = closure; Py_XINCREF(closure); gen->is_running = 0; gen->resume_label = 0; gen->classobj = NULL; gen->yieldfrom = NULL; gen->gi_exc_state.exc_type = NULL; gen->gi_exc_state.exc_value = NULL; gen->gi_exc_state.exc_traceback = NULL; #if CYTHON_USE_EXC_INFO_STACK gen->gi_exc_state.previous_item = NULL; #endif gen->gi_weakreflist = NULL; Py_XINCREF(qualname); gen->gi_qualname = qualname; Py_XINCREF(name); gen->gi_name = name; Py_XINCREF(module_name); gen->gi_modulename = module_name; Py_XINCREF(code); gen->gi_code = code; gen->gi_frame = NULL; PyObject_GC_Track(gen); return gen; } /* PatchModuleWithCoroutine */ static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) { #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) int result; PyObject *globals, *result_obj; globals = PyDict_New(); if (unlikely(!globals)) goto ignore; result = PyDict_SetItemString(globals, "_cython_coroutine_type", #ifdef __Pyx_Coroutine_USED (PyObject*)__pyx_CoroutineType); #else Py_None); #endif if (unlikely(result < 0)) goto ignore; result = PyDict_SetItemString(globals, "_cython_generator_type", #ifdef __Pyx_Generator_USED (PyObject*)__pyx_GeneratorType); #else Py_None); #endif if (unlikely(result < 0)) goto ignore; if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore; if (unlikely(PyDict_SetItemString(globals, "__builtins__", __pyx_b) < 0)) goto ignore; result_obj = PyRun_String(py_code, Py_file_input, globals, globals); if (unlikely(!result_obj)) goto ignore; Py_DECREF(result_obj); Py_DECREF(globals); return module; ignore: Py_XDECREF(globals); PyErr_WriteUnraisable(module); if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) { Py_DECREF(module); module = NULL; } #else py_code++; #endif return module; } /* PatchGeneratorABC */ #ifndef CYTHON_REGISTER_ABCS #define CYTHON_REGISTER_ABCS 1 #endif #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) static PyObject* __Pyx_patch_abc_module(PyObject *module); static PyObject* __Pyx_patch_abc_module(PyObject *module) { module = __Pyx_Coroutine_patch_module( module, "" "if _cython_generator_type is not None:\n" " try: Generator = _module.Generator\n" " except AttributeError: pass\n" " else: Generator.register(_cython_generator_type)\n" "if _cython_coroutine_type is not None:\n" " try: Coroutine = _module.Coroutine\n" " except AttributeError: pass\n" " else: Coroutine.register(_cython_coroutine_type)\n" ); return module; } #endif static int __Pyx_patch_abc(void) { #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) static int abc_patched = 0; if (CYTHON_REGISTER_ABCS && !abc_patched) { PyObject *module; module = PyImport_ImportModule((PY_MAJOR_VERSION >= 3) ? "collections.abc" : "collections"); if (!module) { PyErr_WriteUnraisable(NULL); if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, ((PY_MAJOR_VERSION >= 3) ? "Cython module failed to register with collections.abc module" : "Cython module failed to register with collections module"), 1) < 0)) { return -1; } } else { module = __Pyx_patch_abc_module(module); abc_patched = 1; if (unlikely(!module)) return -1; Py_DECREF(module); } module = PyImport_ImportModule("backports_abc"); if (module) { module = __Pyx_patch_abc_module(module); Py_XDECREF(module); } if (!module) { PyErr_Clear(); } } #else if ((0)) __Pyx_Coroutine_patch_module(NULL, NULL); #endif return 0; } /* Generator */ static PyMethodDef __pyx_Generator_methods[] = { {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O, (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")}, {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS, (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")}, {"close", (PyCFunction) __Pyx_Coroutine_Close_Method, METH_NOARGS, (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")}, {0, 0, 0, 0} }; static PyMemberDef __pyx_Generator_memberlist[] = { {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL}, {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY, (char*) PyDoc_STR("object being iterated by 'yield from', or None")}, {(char*) "gi_code", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_code), READONLY, NULL}, {0, 0, 0, 0, 0} }; static PyGetSetDef __pyx_Generator_getsets[] = { {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name, (char*) PyDoc_STR("name of the generator"), 0}, {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, (char*) PyDoc_STR("qualified name of the generator"), 0}, {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL, (char*) PyDoc_STR("Frame of the generator"), 0}, {0, 0, 0, 0, 0} }; static PyTypeObject __pyx_GeneratorType_type = { PyVarObject_HEAD_INIT(0, 0) "generator", sizeof(__pyx_CoroutineObject), 0, (destructor) __Pyx_Coroutine_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, 0, (traverseproc) __Pyx_Coroutine_traverse, 0, 0, offsetof(__pyx_CoroutineObject, gi_weakreflist), 0, (iternextfunc) __Pyx_Generator_Next, __pyx_Generator_methods, __pyx_Generator_memberlist, __pyx_Generator_getsets, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #if CYTHON_USE_TP_FINALIZE 0, #else __Pyx_Coroutine_del, #endif 0, #if CYTHON_USE_TP_FINALIZE __Pyx_Coroutine_del, #elif PY_VERSION_HEX >= 0x030400a1 0, #endif #if PY_VERSION_HEX >= 0x030800b1 0, #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, #endif }; static int __pyx_Generator_init(void) { __pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter; __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type); if (unlikely(!__pyx_GeneratorType)) { return -1; } return 0; } /* CheckBinaryVersion */ static int __Pyx_check_binary_version(void) { char ctversion[4], rtversion[4]; PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { char message[200]; PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", ctversion, __Pyx_MODULE_NAME, rtversion); return PyErr_WarnEx(NULL, message, 1); } return 0; } /* InitStrings */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", type_name, type_name, Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)b)->ob_digit; const Py_ssize_t size = Py_SIZE(b); if (likely(__Pyx_sst_abs(size) <= 1)) { ival = likely(size) ? digits[0] : 0; if (size == -1) ival = -ival; return ival; } else { switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/_http_parser.pyx0000644000175100001710000006371300000000000017451 0ustar00runnerdocker#cython: language_level=3 # # Based on https://github.com/MagicStack/httptools # from __future__ import absolute_import, print_function from cpython cimport ( Py_buffer, PyBUF_SIMPLE, PyBuffer_Release, PyBytes_AsString, PyBytes_AsStringAndSize, PyObject_GetBuffer, ) from cpython.mem cimport PyMem_Free, PyMem_Malloc from libc.limits cimport ULLONG_MAX from libc.string cimport memcpy from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy from yarl import URL as _URL from aiohttp import hdrs from .http_exceptions import ( BadHttpMessage, BadStatusLine, ContentLengthError, InvalidHeader, InvalidURLError, LineTooLong, PayloadEncodingError, TransferEncodingError, ) from .http_parser import DeflateBuffer as _DeflateBuffer from .http_writer import ( HttpVersion as _HttpVersion, HttpVersion10 as _HttpVersion10, HttpVersion11 as _HttpVersion11, ) from .streams import EMPTY_PAYLOAD as _EMPTY_PAYLOAD, StreamReader as _StreamReader cimport cython from aiohttp cimport _cparser as cparser include "_headers.pxi" from aiohttp cimport _find_header DEF DEFAULT_FREELIST_SIZE = 250 cdef extern from "Python.h": int PyByteArray_Resize(object, Py_ssize_t) except -1 Py_ssize_t PyByteArray_Size(object) except -1 char* PyByteArray_AsString(object) __all__ = ('HttpRequestParser', 'HttpResponseParser', 'RawRequestMessage', 'RawResponseMessage') cdef object URL = _URL cdef object URL_build = URL.build cdef object CIMultiDict = _CIMultiDict cdef object CIMultiDictProxy = _CIMultiDictProxy cdef object HttpVersion = _HttpVersion cdef object HttpVersion10 = _HttpVersion10 cdef object HttpVersion11 = _HttpVersion11 cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD cdef object StreamReader = _StreamReader cdef object DeflateBuffer = _DeflateBuffer cdef inline object extend(object buf, const char* at, size_t length): cdef Py_ssize_t s cdef char* ptr s = PyByteArray_Size(buf) PyByteArray_Resize(buf, s + length) ptr = PyByteArray_AsString(buf) memcpy(ptr + s, at, length) DEF METHODS_COUNT = 46; cdef list _http_method = [] for i in range(METHODS_COUNT): _http_method.append( cparser.llhttp_method_name( i).decode('ascii')) cdef inline str http_method_str(int i): if i < METHODS_COUNT: return _http_method[i] else: return "" cdef inline object find_header(bytes raw_header): cdef Py_ssize_t size cdef char *buf cdef int idx PyBytes_AsStringAndSize(raw_header, &buf, &size) idx = _find_header.find_header(buf, size) if idx == -1: return raw_header.decode('utf-8', 'surrogateescape') return headers[idx] @cython.freelist(DEFAULT_FREELIST_SIZE) cdef class RawRequestMessage: cdef readonly str method cdef readonly str path cdef readonly object version # HttpVersion cdef readonly object headers # CIMultiDict cdef readonly object raw_headers # tuple cdef readonly object should_close cdef readonly object compression cdef readonly object upgrade cdef readonly object chunked cdef readonly object url # yarl.URL def __init__(self, method, path, version, headers, raw_headers, should_close, compression, upgrade, chunked, url): self.method = method self.path = path self.version = version self.headers = headers self.raw_headers = raw_headers self.should_close = should_close self.compression = compression self.upgrade = upgrade self.chunked = chunked self.url = url def __repr__(self): info = [] info.append(("method", self.method)) info.append(("path", self.path)) info.append(("version", self.version)) info.append(("headers", self.headers)) info.append(("raw_headers", self.raw_headers)) info.append(("should_close", self.should_close)) info.append(("compression", self.compression)) info.append(("upgrade", self.upgrade)) info.append(("chunked", self.chunked)) info.append(("url", self.url)) sinfo = ', '.join(name + '=' + repr(val) for name, val in info) return '' def _replace(self, **dct): cdef RawRequestMessage ret ret = _new_request_message(self.method, self.path, self.version, self.headers, self.raw_headers, self.should_close, self.compression, self.upgrade, self.chunked, self.url) if "method" in dct: ret.method = dct["method"] if "path" in dct: ret.path = dct["path"] if "version" in dct: ret.version = dct["version"] if "headers" in dct: ret.headers = dct["headers"] if "raw_headers" in dct: ret.raw_headers = dct["raw_headers"] if "should_close" in dct: ret.should_close = dct["should_close"] if "compression" in dct: ret.compression = dct["compression"] if "upgrade" in dct: ret.upgrade = dct["upgrade"] if "chunked" in dct: ret.chunked = dct["chunked"] if "url" in dct: ret.url = dct["url"] return ret cdef _new_request_message(str method, str path, object version, object headers, object raw_headers, bint should_close, object compression, bint upgrade, bint chunked, object url): cdef RawRequestMessage ret ret = RawRequestMessage.__new__(RawRequestMessage) ret.method = method ret.path = path ret.version = version ret.headers = headers ret.raw_headers = raw_headers ret.should_close = should_close ret.compression = compression ret.upgrade = upgrade ret.chunked = chunked ret.url = url return ret @cython.freelist(DEFAULT_FREELIST_SIZE) cdef class RawResponseMessage: cdef readonly object version # HttpVersion cdef readonly int code cdef readonly str reason cdef readonly object headers # CIMultiDict cdef readonly object raw_headers # tuple cdef readonly object should_close cdef readonly object compression cdef readonly object upgrade cdef readonly object chunked def __init__(self, version, code, reason, headers, raw_headers, should_close, compression, upgrade, chunked): self.version = version self.code = code self.reason = reason self.headers = headers self.raw_headers = raw_headers self.should_close = should_close self.compression = compression self.upgrade = upgrade self.chunked = chunked def __repr__(self): info = [] info.append(("version", self.version)) info.append(("code", self.code)) info.append(("reason", self.reason)) info.append(("headers", self.headers)) info.append(("raw_headers", self.raw_headers)) info.append(("should_close", self.should_close)) info.append(("compression", self.compression)) info.append(("upgrade", self.upgrade)) info.append(("chunked", self.chunked)) sinfo = ', '.join(name + '=' + repr(val) for name, val in info) return '' cdef _new_response_message(object version, int code, str reason, object headers, object raw_headers, bint should_close, object compression, bint upgrade, bint chunked): cdef RawResponseMessage ret ret = RawResponseMessage.__new__(RawResponseMessage) ret.version = version ret.code = code ret.reason = reason ret.headers = headers ret.raw_headers = raw_headers ret.should_close = should_close ret.compression = compression ret.upgrade = upgrade ret.chunked = chunked return ret @cython.internal cdef class HttpParser: cdef: cparser.llhttp_t* _cparser cparser.llhttp_settings_t* _csettings bytearray _raw_name bytearray _raw_value bint _has_value object _protocol object _loop object _timer size_t _max_line_size size_t _max_field_size size_t _max_headers bint _response_with_body bint _read_until_eof bint _started object _url bytearray _buf str _path str _reason object _headers list _raw_headers bint _upgraded list _messages object _payload bint _payload_error object _payload_exception object _last_error bint _auto_decompress int _limit str _content_encoding Py_buffer py_buf def __cinit__(self): self._cparser = \ PyMem_Malloc(sizeof(cparser.llhttp_t)) if self._cparser is NULL: raise MemoryError() self._csettings = \ PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) if self._csettings is NULL: raise MemoryError() def __dealloc__(self): PyMem_Free(self._cparser) PyMem_Free(self._csettings) cdef _init( self, cparser.llhttp_type mode, object protocol, object loop, int limit, object timer=None, size_t max_line_size=8190, size_t max_headers=32768, size_t max_field_size=8190, payload_exception=None, bint response_with_body=True, bint read_until_eof=False, bint auto_decompress=True, ): cparser.llhttp_settings_init(self._csettings) cparser.llhttp_init(self._cparser, mode, self._csettings) self._cparser.data = self self._cparser.content_length = 0 self._protocol = protocol self._loop = loop self._timer = timer self._buf = bytearray() self._payload = None self._payload_error = 0 self._payload_exception = payload_exception self._messages = [] self._raw_name = bytearray() self._raw_value = bytearray() self._has_value = False self._max_line_size = max_line_size self._max_headers = max_headers self._max_field_size = max_field_size self._response_with_body = response_with_body self._read_until_eof = read_until_eof self._upgraded = False self._auto_decompress = auto_decompress self._content_encoding = None self._csettings.on_url = cb_on_url self._csettings.on_status = cb_on_status self._csettings.on_header_field = cb_on_header_field self._csettings.on_header_value = cb_on_header_value self._csettings.on_headers_complete = cb_on_headers_complete self._csettings.on_body = cb_on_body self._csettings.on_message_begin = cb_on_message_begin self._csettings.on_message_complete = cb_on_message_complete self._csettings.on_chunk_header = cb_on_chunk_header self._csettings.on_chunk_complete = cb_on_chunk_complete self._last_error = None self._limit = limit cdef _process_header(self): if self._raw_name: raw_name = bytes(self._raw_name) raw_value = bytes(self._raw_value) name = find_header(raw_name) value = raw_value.decode('utf-8', 'surrogateescape') self._headers.add(name, value) if name is CONTENT_ENCODING: self._content_encoding = value PyByteArray_Resize(self._raw_name, 0) PyByteArray_Resize(self._raw_value, 0) self._has_value = False self._raw_headers.append((raw_name, raw_value)) cdef _on_header_field(self, char* at, size_t length): cdef Py_ssize_t size cdef char *buf if self._has_value: self._process_header() size = PyByteArray_Size(self._raw_name) PyByteArray_Resize(self._raw_name, size + length) buf = PyByteArray_AsString(self._raw_name) memcpy(buf + size, at, length) cdef _on_header_value(self, char* at, size_t length): cdef Py_ssize_t size cdef char *buf size = PyByteArray_Size(self._raw_value) PyByteArray_Resize(self._raw_value, size + length) buf = PyByteArray_AsString(self._raw_value) memcpy(buf + size, at, length) self._has_value = True cdef _on_headers_complete(self): self._process_header() method = http_method_str(self._cparser.method) should_close = not cparser.llhttp_should_keep_alive(self._cparser) upgrade = self._cparser.upgrade chunked = self._cparser.flags & cparser.F_CHUNKED raw_headers = tuple(self._raw_headers) headers = CIMultiDictProxy(self._headers) if upgrade or self._cparser.method == 5: # cparser.CONNECT: self._upgraded = True # do not support old websocket spec if SEC_WEBSOCKET_KEY1 in headers: raise InvalidHeader(SEC_WEBSOCKET_KEY1) encoding = None enc = self._content_encoding if enc is not None: self._content_encoding = None enc = enc.lower() if enc in ('gzip', 'deflate', 'br'): encoding = enc if self._cparser.type == cparser.HTTP_REQUEST: msg = _new_request_message( method, self._path, self.http_version(), headers, raw_headers, should_close, encoding, upgrade, chunked, self._url) else: msg = _new_response_message( self.http_version(), self._cparser.status_code, self._reason, headers, raw_headers, should_close, encoding, upgrade, chunked) if ( ULLONG_MAX > self._cparser.content_length > 0 or chunked or self._cparser.method == 5 or # CONNECT: 5 (self._cparser.status_code >= 199 and self._cparser.content_length == 0 and self._read_until_eof) ): payload = StreamReader( self._protocol, timer=self._timer, loop=self._loop, limit=self._limit) else: payload = EMPTY_PAYLOAD self._payload = payload if encoding is not None and self._auto_decompress: self._payload = DeflateBuffer(payload, encoding) if not self._response_with_body: payload = EMPTY_PAYLOAD self._messages.append((msg, payload)) cdef _on_message_complete(self): self._payload.feed_eof() self._payload = None cdef _on_chunk_header(self): self._payload.begin_http_chunk_receiving() cdef _on_chunk_complete(self): self._payload.end_http_chunk_receiving() cdef object _on_status_complete(self): pass cdef inline http_version(self): cdef cparser.llhttp_t* parser = self._cparser if parser.http_major == 1: if parser.http_minor == 0: return HttpVersion10 elif parser.http_minor == 1: return HttpVersion11 return HttpVersion(parser.http_major, parser.http_minor) ### Public API ### def feed_eof(self): cdef bytes desc if self._payload is not None: if self._cparser.flags & cparser.F_CHUNKED: raise TransferEncodingError( "Not enough data for satisfy transfer length header.") elif self._cparser.flags & cparser.F_CONTENT_LENGTH: raise ContentLengthError( "Not enough data for satisfy content length header.") elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: desc = cparser.llhttp_get_error_reason(self._cparser) raise PayloadEncodingError(desc.decode('latin-1')) else: self._payload.feed_eof() elif self._started: self._on_headers_complete() if self._messages: return self._messages[-1][0] def feed_data(self, data): cdef: size_t data_len size_t nb cdef cparser.llhttp_errno_t errno PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) data_len = self.py_buf.len errno = cparser.llhttp_execute( self._cparser, self.py_buf.buf, data_len) if errno is cparser.HPE_PAUSED_UPGRADE: cparser.llhttp_resume_after_upgrade(self._cparser) nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf PyBuffer_Release(&self.py_buf) if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): if self._payload_error == 0: if self._last_error is not None: ex = self._last_error self._last_error = None else: ex = parser_error_from_errno(self._cparser) self._payload = None raise ex if self._messages: messages = self._messages self._messages = [] else: messages = () if self._upgraded: return messages, True, data[nb:] else: return messages, False, b'' def set_upgraded(self, val): self._upgraded = val cdef class HttpRequestParser(HttpParser): def __init__( self, protocol, loop, int limit, timer=None, size_t max_line_size=8190, size_t max_headers=32768, size_t max_field_size=8190, payload_exception=None, bint response_with_body=True, bint read_until_eof=False, bint auto_decompress=True, ): self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, max_line_size, max_headers, max_field_size, payload_exception, response_with_body, read_until_eof, auto_decompress) cdef object _on_status_complete(self): cdef int idx1, idx2 if not self._buf: return self._path = self._buf.decode('utf-8', 'surrogateescape') try: idx3 = len(self._path) idx1 = self._path.find("?") if idx1 == -1: query = "" idx2 = self._path.find("#") if idx2 == -1: path = self._path fragment = "" else: path = self._path[0: idx2] fragment = self._path[idx2+1:] else: path = self._path[0:idx1] idx1 += 1 idx2 = self._path.find("#", idx1+1) if idx2 == -1: query = self._path[idx1:] fragment = "" else: query = self._path[idx1: idx2] fragment = self._path[idx2+1:] self._url = URL.build( path=path, query_string=query, fragment=fragment, encoded=True, ) finally: PyByteArray_Resize(self._buf, 0) cdef class HttpResponseParser(HttpParser): def __init__( self, protocol, loop, int limit, timer=None, size_t max_line_size=8190, size_t max_headers=32768, size_t max_field_size=8190, payload_exception=None, bint response_with_body=True, bint read_until_eof=False, bint auto_decompress=True ): self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, max_line_size, max_headers, max_field_size, payload_exception, response_with_body, read_until_eof, auto_decompress) cdef object _on_status_complete(self): if self._buf: self._reason = self._buf.decode('utf-8', 'surrogateescape') PyByteArray_Resize(self._buf, 0) else: self._reason = self._reason or '' cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: cdef HttpParser pyparser = parser.data pyparser._started = True pyparser._headers = CIMultiDict() pyparser._raw_headers = [] PyByteArray_Resize(pyparser._buf, 0) pyparser._path = None pyparser._reason = None return 0 cdef int cb_on_url(cparser.llhttp_t* parser, const char *at, size_t length) except -1: cdef HttpParser pyparser = parser.data try: if length > pyparser._max_line_size: raise LineTooLong( 'Status line is too long', pyparser._max_line_size, length) extend(pyparser._buf, at, length) except BaseException as ex: pyparser._last_error = ex return -1 else: return 0 cdef int cb_on_status(cparser.llhttp_t* parser, const char *at, size_t length) except -1: cdef HttpParser pyparser = parser.data cdef str reason try: if length > pyparser._max_line_size: raise LineTooLong( 'Status line is too long', pyparser._max_line_size, length) extend(pyparser._buf, at, length) except BaseException as ex: pyparser._last_error = ex return -1 else: return 0 cdef int cb_on_header_field(cparser.llhttp_t* parser, const char *at, size_t length) except -1: cdef HttpParser pyparser = parser.data cdef Py_ssize_t size try: pyparser._on_status_complete() size = len(pyparser._raw_name) + length if size > pyparser._max_field_size: raise LineTooLong( 'Header name is too long', pyparser._max_field_size, size) pyparser._on_header_field(at, length) except BaseException as ex: pyparser._last_error = ex return -1 else: return 0 cdef int cb_on_header_value(cparser.llhttp_t* parser, const char *at, size_t length) except -1: cdef HttpParser pyparser = parser.data cdef Py_ssize_t size try: size = len(pyparser._raw_value) + length if size > pyparser._max_field_size: raise LineTooLong( 'Header value is too long', pyparser._max_field_size, size) pyparser._on_header_value(at, length) except BaseException as ex: pyparser._last_error = ex return -1 else: return 0 cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: cdef HttpParser pyparser = parser.data try: pyparser._on_status_complete() pyparser._on_headers_complete() except BaseException as exc: pyparser._last_error = exc return -1 else: if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT return 2 else: return 0 cdef int cb_on_body(cparser.llhttp_t* parser, const char *at, size_t length) except -1: cdef HttpParser pyparser = parser.data cdef bytes body = at[:length] try: pyparser._payload.feed_data(body, length) except BaseException as exc: if pyparser._payload_exception is not None: pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) else: pyparser._payload.set_exception(exc) pyparser._payload_error = 1 return -1 else: return 0 cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: cdef HttpParser pyparser = parser.data try: pyparser._started = False pyparser._on_message_complete() except BaseException as exc: pyparser._last_error = exc return -1 else: return 0 cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: cdef HttpParser pyparser = parser.data try: pyparser._on_chunk_header() except BaseException as exc: pyparser._last_error = exc return -1 else: return 0 cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: cdef HttpParser pyparser = parser.data try: pyparser._on_chunk_complete() except BaseException as exc: pyparser._last_error = exc return -1 else: return 0 cdef parser_error_from_errno(cparser.llhttp_t* parser): cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) cdef bytes desc = cparser.llhttp_get_error_reason(parser) if errno in (cparser.HPE_CB_MESSAGE_BEGIN, cparser.HPE_CB_HEADERS_COMPLETE, cparser.HPE_CB_MESSAGE_COMPLETE, cparser.HPE_CB_CHUNK_HEADER, cparser.HPE_CB_CHUNK_COMPLETE, cparser.HPE_INVALID_CONSTANT, cparser.HPE_INVALID_HEADER_TOKEN, cparser.HPE_INVALID_CONTENT_LENGTH, cparser.HPE_INVALID_CHUNK_SIZE, cparser.HPE_INVALID_EOF_STATE, cparser.HPE_INVALID_TRANSFER_ENCODING): cls = BadHttpMessage elif errno == cparser.HPE_INVALID_STATUS: cls = BadStatusLine elif errno == cparser.HPE_INVALID_METHOD: cls = BadStatusLine elif errno == cparser.HPE_INVALID_VERSION: cls = BadStatusLine elif errno == cparser.HPE_INVALID_URL: cls = InvalidURLError else: cls = BadHttpMessage return cls(desc.decode('latin-1')) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920314.0 aiohttp-3.8.1/aiohttp/_http_writer.c0000644000175100001710000066012600000000000017074 0ustar00runnerdocker/* Generated by Cython 0.29.24 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* PY_SSIZE_T_CLEAN */ #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else #define CYTHON_ABI "0_29_24" #define CYTHON_HEX_VERSION 0x001D18F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #if PY_VERSION_HEX >= 0x02070000 #define HAVE_LONG_LONG #endif #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #elif !defined(CYTHON_USE_PYLONG_INTERNALS) #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) #endif #ifndef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) #endif #ifndef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } # else # define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; #endif #endif #else #include #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) && __cplusplus >= 201103L #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #elif __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__ ) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #define __Pyx_DefaultClassType PyType_Type #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_FAST_PYCCALL #define __Pyx_PyFastCFunction_Check(func)\ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) #else #define __Pyx_PyFastCFunction_Check(func) 0 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 #define PyMem_RawMalloc(n) PyMem_Malloc(n) #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) #define PyMem_RawFree(p) PyMem_Free(p) #endif #if CYTHON_COMPILING_IN_PYSTON #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) #else #define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #if defined(PyUnicode_IS_READY) #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #else #define __Pyx_PyUnicode_READY(op) (0) #endif #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #endif #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #if PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #else #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__aiohttp___http_writer #define __PYX_HAVE_API__aiohttp___http_writer /* Early includes */ #include #include #include #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "aiohttp/_http_writer.pyx", "type.pxd", }; /*--- Type declarations ---*/ struct __pyx_t_7aiohttp_12_http_writer_Writer; /* "aiohttp/_http_writer.pyx":18 * # ----------------- writer --------------------------- * * cdef struct Writer: # <<<<<<<<<<<<<< * char *buf * Py_ssize_t size */ struct __pyx_t_7aiohttp_12_http_writer_Writer { char *buf; Py_ssize_t size; Py_ssize_t pos; }; /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* WriteUnraisableException.proto */ static void __Pyx_WriteUnraisable(const char *name, int clineno, int lineno, const char *filename, int full_traceback, int nogil); /* unicode_iter.proto */ static CYTHON_INLINE int __Pyx_init_unicode_iteration( PyObject* ustring, Py_ssize_t *length, void** data, int *kind); /* PyCFunctionFastCall.proto */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); #else #define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) #endif /* PyFunctionFastCall.proto */ #if CYTHON_FAST_PYCALL #define __Pyx_PyFunction_FastCall(func, args, nargs)\ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); #else #define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) #endif #define __Pyx_BUILD_ASSERT_EXPR(cond)\ (sizeof(char [1 - 2*!(cond)]) - 1) #ifndef Py_MEMBER_SIZE #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) #endif static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" #define __Pxy_PyFrame_Initialize_Offsets()\ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) #define __Pyx_PyFrame_GetLocalsplus(frame)\ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* PyObjectCall2Args.proto */ static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); /* PyObjectCallMethO.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif /* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* PyUnicodeContains.proto */ static CYTHON_INLINE int __Pyx_PyUnicode_ContainsTF(PyObject* substring, PyObject* text, int eq) { int result = PyUnicode_Contains(text, substring); return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); } /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ const char* function_name); /* ArgTypeTest.proto */ #define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ __Pyx__ArgTypeTest(obj, type, name, exact)) static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); /* IterFinish.proto */ static CYTHON_INLINE int __Pyx_IterFinish(void); /* PyObjectCallNoArg.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); #else #define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) #endif /* PyObjectGetMethod.proto */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); /* PyObjectCallMethod0.proto */ static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); /* RaiseNeedMoreValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); /* RaiseTooManyValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); /* UnpackItemEndCheck.proto */ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /* RaiseNoneIterError.proto */ static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); /* UnpackTupleError.proto */ static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /* UnpackTuple2.proto */ #define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ (likely(is_tuple || PyTuple_Check(tuple)) ?\ (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); static int __Pyx_unpack_tuple2_generic( PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); /* dict_iter.proto */ static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, Py_ssize_t* p_orig_length, int* p_is_dict); static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); /* GetTopmostException.proto */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); #endif /* ReRaiseException.proto */ static CYTHON_INLINE void __Pyx_ReraiseException(void); /* GetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); #endif /* SwapException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); #endif /* SaveResetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); #else #define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) #define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) #endif /* TypeImport.proto */ #ifndef __PYX_HAVE_RT_ImportType_proto #define __PYX_HAVE_RT_ImportType_proto enum __Pyx_ImportType_CheckSize { __Pyx_ImportType_CheckSize_Error = 0, __Pyx_ImportType_CheckSize_Warn = 1, __Pyx_ImportType_CheckSize_Ignore = 2 }; static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); #endif /* Import.proto */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /* ImportFrom.proto */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* GetModuleGlobalName.proto */ #if CYTHON_USE_DICT_VERSIONS #define __Pyx_GetModuleGlobalName(var, name) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } #define __Pyx_GetModuleGlobalNameUncached(var, name) {\ PY_UINT64_T __pyx_dict_version;\ PyObject *__pyx_dict_cached_value;\ (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ } static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); #else #define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) #define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); #endif /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* GCCDiagnostics.proto */ #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* Module declarations from 'libc.string' */ /* Module declarations from 'libc.stdio' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.type' */ static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; /* Module declarations from 'cpython' */ /* Module declarations from 'cpython.object' */ /* Module declarations from 'cpython.bytes' */ /* Module declarations from 'cpython.exc' */ /* Module declarations from 'cpython.mem' */ /* Module declarations from 'libc.stdint' */ /* Module declarations from 'aiohttp._http_writer' */ static char __pyx_v_7aiohttp_12_http_writer_BUFFER[0x4000]; static PyObject *__pyx_v_7aiohttp_12_http_writer__istr = 0; static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__init_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *); /*proto*/ static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__release_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *); /*proto*/ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_byte(struct __pyx_t_7aiohttp_12_http_writer_Writer *, uint8_t); /*proto*/ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_utf8(struct __pyx_t_7aiohttp_12_http_writer_Writer *, Py_UCS4); /*proto*/ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_str(struct __pyx_t_7aiohttp_12_http_writer_Writer *, PyObject *); /*proto*/ static PyObject *__pyx_f_7aiohttp_12_http_writer_to_str(PyObject *); /*proto*/ static void __pyx_f_7aiohttp_12_http_writer__safe_header(PyObject *); /*proto*/ #define __Pyx_MODULE_NAME "aiohttp._http_writer" extern int __pyx_module_is_main_aiohttp___http_writer; int __pyx_module_is_main_aiohttp___http_writer = 0; /* Implementation of 'aiohttp._http_writer' */ static PyObject *__pyx_builtin_TypeError; static PyObject *__pyx_builtin_ValueError; static const char __pyx_k_[] = "\r"; static const char __pyx_k__2[] = "\n"; static const char __pyx_k_key[] = "key"; static const char __pyx_k_ret[] = "ret"; static const char __pyx_k_val[] = "val"; static const char __pyx_k_istr[] = "istr"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_items[] = "items"; static const char __pyx_k_format[] = "format"; static const char __pyx_k_import[] = "__import__"; static const char __pyx_k_writer[] = "writer"; static const char __pyx_k_headers[] = "headers"; static const char __pyx_k_TypeError[] = "TypeError"; static const char __pyx_k_multidict[] = "multidict"; static const char __pyx_k_ValueError[] = "ValueError"; static const char __pyx_k_status_line[] = "status_line"; static const char __pyx_k_serialize_headers[] = "_serialize_headers"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_aiohttp__http_writer[] = "aiohttp._http_writer"; static const char __pyx_k_aiohttp__http_writer_pyx[] = "aiohttp/_http_writer.pyx"; static const char __pyx_k_Cannot_serialize_non_str_key_r[] = "Cannot serialize non-str key {!r}"; static const char __pyx_k_Newline_or_carriage_return_chara[] = "Newline or carriage return character detected in HTTP status message or header. This is a potential security issue."; static PyObject *__pyx_kp_u_; static PyObject *__pyx_kp_u_Cannot_serialize_non_str_key_r; static PyObject *__pyx_kp_u_Newline_or_carriage_return_chara; static PyObject *__pyx_n_s_TypeError; static PyObject *__pyx_n_s_ValueError; static PyObject *__pyx_kp_u__2; static PyObject *__pyx_n_s_aiohttp__http_writer; static PyObject *__pyx_kp_s_aiohttp__http_writer_pyx; static PyObject *__pyx_n_s_cline_in_traceback; static PyObject *__pyx_n_s_format; static PyObject *__pyx_n_s_headers; static PyObject *__pyx_n_s_import; static PyObject *__pyx_n_s_istr; static PyObject *__pyx_n_s_items; static PyObject *__pyx_n_s_key; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_multidict; static PyObject *__pyx_n_s_name; static PyObject *__pyx_n_s_ret; static PyObject *__pyx_n_s_serialize_headers; static PyObject *__pyx_n_s_status_line; static PyObject *__pyx_n_s_test; static PyObject *__pyx_n_s_val; static PyObject *__pyx_n_s_writer; static PyObject *__pyx_pf_7aiohttp_12_http_writer__serialize_headers(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_status_line, PyObject *__pyx_v_headers); /* proto */ static PyObject *__pyx_tuple__3; static PyObject *__pyx_tuple__4; static PyObject *__pyx_codeobj__5; /* Late includes */ /* "aiohttp/_http_writer.pyx":24 * * * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE */ static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__init_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_init_writer", 0); /* "aiohttp/_http_writer.pyx":25 * * cdef inline void _init_writer(Writer* writer): * writer.buf = &BUFFER[0] # <<<<<<<<<<<<<< * writer.size = BUF_SIZE * writer.pos = 0 */ __pyx_v_writer->buf = (&(__pyx_v_7aiohttp_12_http_writer_BUFFER[0])); /* "aiohttp/_http_writer.pyx":26 * cdef inline void _init_writer(Writer* writer): * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE # <<<<<<<<<<<<<< * writer.pos = 0 * */ __pyx_v_writer->size = 0x4000; /* "aiohttp/_http_writer.pyx":27 * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE * writer.pos = 0 # <<<<<<<<<<<<<< * * */ __pyx_v_writer->pos = 0; /* "aiohttp/_http_writer.pyx":24 * * * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< * writer.buf = &BUFFER[0] * writer.size = BUF_SIZE */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "aiohttp/_http_writer.pyx":30 * * * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< * if writer.buf != BUFFER: * PyMem_Free(writer.buf) */ static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__release_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer) { __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("_release_writer", 0); /* "aiohttp/_http_writer.pyx":31 * * cdef inline void _release_writer(Writer* writer): * if writer.buf != BUFFER: # <<<<<<<<<<<<<< * PyMem_Free(writer.buf) * */ __pyx_t_1 = ((__pyx_v_writer->buf != __pyx_v_7aiohttp_12_http_writer_BUFFER) != 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":32 * cdef inline void _release_writer(Writer* writer): * if writer.buf != BUFFER: * PyMem_Free(writer.buf) # <<<<<<<<<<<<<< * * */ PyMem_Free(__pyx_v_writer->buf); /* "aiohttp/_http_writer.pyx":31 * * cdef inline void _release_writer(Writer* writer): * if writer.buf != BUFFER: # <<<<<<<<<<<<<< * PyMem_Free(writer.buf) * */ } /* "aiohttp/_http_writer.pyx":30 * * * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< * if writer.buf != BUFFER: * PyMem_Free(writer.buf) */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "aiohttp/_http_writer.pyx":35 * * * cdef inline int _write_byte(Writer* writer, uint8_t ch): # <<<<<<<<<<<<<< * cdef char * buf * cdef Py_ssize_t size */ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_byte(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, uint8_t __pyx_v_ch) { char *__pyx_v_buf; Py_ssize_t __pyx_v_size; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_write_byte", 0); /* "aiohttp/_http_writer.pyx":39 * cdef Py_ssize_t size * * if writer.pos == writer.size: # <<<<<<<<<<<<<< * # reallocate * size = writer.size + BUF_SIZE */ __pyx_t_1 = ((__pyx_v_writer->pos == __pyx_v_writer->size) != 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":41 * if writer.pos == writer.size: * # reallocate * size = writer.size + BUF_SIZE # <<<<<<<<<<<<<< * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) */ __pyx_v_size = (__pyx_v_writer->size + 0x4000); /* "aiohttp/_http_writer.pyx":42 * # reallocate * size = writer.size + BUF_SIZE * if writer.buf == BUFFER: # <<<<<<<<<<<<<< * buf = PyMem_Malloc(size) * if buf == NULL: */ __pyx_t_1 = ((__pyx_v_writer->buf == __pyx_v_7aiohttp_12_http_writer_BUFFER) != 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":43 * size = writer.size + BUF_SIZE * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) # <<<<<<<<<<<<<< * if buf == NULL: * PyErr_NoMemory() */ __pyx_v_buf = ((char *)PyMem_Malloc(__pyx_v_size)); /* "aiohttp/_http_writer.pyx":44 * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":45 * buf = PyMem_Malloc(size) * if buf == NULL: * PyErr_NoMemory() # <<<<<<<<<<<<<< * return -1 * memcpy(buf, writer.buf, writer.size) */ __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 45, __pyx_L1_error) /* "aiohttp/_http_writer.pyx":46 * if buf == NULL: * PyErr_NoMemory() * return -1 # <<<<<<<<<<<<<< * memcpy(buf, writer.buf, writer.size) * else: */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":44 * if writer.buf == BUFFER: * buf = PyMem_Malloc(size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ } /* "aiohttp/_http_writer.pyx":47 * PyErr_NoMemory() * return -1 * memcpy(buf, writer.buf, writer.size) # <<<<<<<<<<<<<< * else: * buf = PyMem_Realloc(writer.buf, size) */ (void)(memcpy(__pyx_v_buf, __pyx_v_writer->buf, __pyx_v_writer->size)); /* "aiohttp/_http_writer.pyx":42 * # reallocate * size = writer.size + BUF_SIZE * if writer.buf == BUFFER: # <<<<<<<<<<<<<< * buf = PyMem_Malloc(size) * if buf == NULL: */ goto __pyx_L4; } /* "aiohttp/_http_writer.pyx":49 * memcpy(buf, writer.buf, writer.size) * else: * buf = PyMem_Realloc(writer.buf, size) # <<<<<<<<<<<<<< * if buf == NULL: * PyErr_NoMemory() */ /*else*/ { __pyx_v_buf = ((char *)PyMem_Realloc(__pyx_v_writer->buf, __pyx_v_size)); /* "aiohttp/_http_writer.pyx":50 * else: * buf = PyMem_Realloc(writer.buf, size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":51 * buf = PyMem_Realloc(writer.buf, size) * if buf == NULL: * PyErr_NoMemory() # <<<<<<<<<<<<<< * return -1 * writer.buf = buf */ __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 51, __pyx_L1_error) /* "aiohttp/_http_writer.pyx":52 * if buf == NULL: * PyErr_NoMemory() * return -1 # <<<<<<<<<<<<<< * writer.buf = buf * writer.size = size */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":50 * else: * buf = PyMem_Realloc(writer.buf, size) * if buf == NULL: # <<<<<<<<<<<<<< * PyErr_NoMemory() * return -1 */ } } __pyx_L4:; /* "aiohttp/_http_writer.pyx":53 * PyErr_NoMemory() * return -1 * writer.buf = buf # <<<<<<<<<<<<<< * writer.size = size * writer.buf[writer.pos] = ch */ __pyx_v_writer->buf = __pyx_v_buf; /* "aiohttp/_http_writer.pyx":54 * return -1 * writer.buf = buf * writer.size = size # <<<<<<<<<<<<<< * writer.buf[writer.pos] = ch * writer.pos += 1 */ __pyx_v_writer->size = __pyx_v_size; /* "aiohttp/_http_writer.pyx":39 * cdef Py_ssize_t size * * if writer.pos == writer.size: # <<<<<<<<<<<<<< * # reallocate * size = writer.size + BUF_SIZE */ } /* "aiohttp/_http_writer.pyx":55 * writer.buf = buf * writer.size = size * writer.buf[writer.pos] = ch # <<<<<<<<<<<<<< * writer.pos += 1 * return 0 */ (__pyx_v_writer->buf[__pyx_v_writer->pos]) = ((char)__pyx_v_ch); /* "aiohttp/_http_writer.pyx":56 * writer.size = size * writer.buf[writer.pos] = ch * writer.pos += 1 # <<<<<<<<<<<<<< * return 0 * */ __pyx_v_writer->pos = (__pyx_v_writer->pos + 1); /* "aiohttp/_http_writer.pyx":57 * writer.buf[writer.pos] = ch * writer.pos += 1 * return 0 # <<<<<<<<<<<<<< * * */ __pyx_r = 0; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":35 * * * cdef inline int _write_byte(Writer* writer, uint8_t ch): # <<<<<<<<<<<<<< * cdef char * buf * cdef Py_ssize_t size */ /* function exit code */ __pyx_L1_error:; __Pyx_WriteUnraisable("aiohttp._http_writer._write_byte", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_writer.pyx":60 * * * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<< * cdef uint64_t utf = symbol * */ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_utf8(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_symbol) { uint64_t __pyx_v_utf; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; __Pyx_RefNannySetupContext("_write_utf8", 0); /* "aiohttp/_http_writer.pyx":61 * * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): * cdef uint64_t utf = symbol # <<<<<<<<<<<<<< * * if utf < 0x80: */ __pyx_v_utf = ((uint64_t)__pyx_v_symbol); /* "aiohttp/_http_writer.pyx":63 * cdef uint64_t utf = symbol * * if utf < 0x80: # <<<<<<<<<<<<<< * return _write_byte(writer, utf) * elif utf < 0x800: */ __pyx_t_1 = ((__pyx_v_utf < 0x80) != 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":64 * * if utf < 0x80: * return _write_byte(writer, utf) # <<<<<<<<<<<<<< * elif utf < 0x800: * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: */ __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)__pyx_v_utf)); goto __pyx_L0; /* "aiohttp/_http_writer.pyx":63 * cdef uint64_t utf = symbol * * if utf < 0x80: # <<<<<<<<<<<<<< * return _write_byte(writer, utf) * elif utf < 0x800: */ } /* "aiohttp/_http_writer.pyx":65 * if utf < 0x80: * return _write_byte(writer, utf) * elif utf < 0x800: # <<<<<<<<<<<<<< * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: * return -1 */ __pyx_t_1 = ((__pyx_v_utf < 0x800) != 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":66 * return _write_byte(writer, utf) * elif utf < 0x800: * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) */ __pyx_t_1 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xc0 | (__pyx_v_utf >> 6)))) < 0) != 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":67 * elif utf < 0x800: * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif 0xD800 <= utf <= 0xDFFF: */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":66 * return _write_byte(writer, utf) * elif utf < 0x800: * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) */ } /* "aiohttp/_http_writer.pyx":68 * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< * elif 0xD800 <= utf <= 0xDFFF: * # surogate pair, ignored */ __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); goto __pyx_L0; /* "aiohttp/_http_writer.pyx":65 * if utf < 0x80: * return _write_byte(writer, utf) * elif utf < 0x800: # <<<<<<<<<<<<<< * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: * return -1 */ } /* "aiohttp/_http_writer.pyx":69 * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<< * # surogate pair, ignored * return 0 */ __pyx_t_1 = (0xD800 <= __pyx_v_utf); if (__pyx_t_1) { __pyx_t_1 = (__pyx_v_utf <= 0xDFFF); } __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { /* "aiohttp/_http_writer.pyx":71 * elif 0xD800 <= utf <= 0xDFFF: * # surogate pair, ignored * return 0 # <<<<<<<<<<<<<< * elif utf < 0x10000: * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: */ __pyx_r = 0; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":69 * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<< * # surogate pair, ignored * return 0 */ } /* "aiohttp/_http_writer.pyx":72 * # surogate pair, ignored * return 0 * elif utf < 0x10000: # <<<<<<<<<<<<<< * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: * return -1 */ __pyx_t_2 = ((__pyx_v_utf < 0x10000) != 0); if (__pyx_t_2) { /* "aiohttp/_http_writer.pyx":73 * return 0 * elif utf < 0x10000: * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: */ __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xe0 | (__pyx_v_utf >> 12)))) < 0) != 0); if (__pyx_t_2) { /* "aiohttp/_http_writer.pyx":74 * elif utf < 0x10000: * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":73 * return 0 * elif utf < 0x10000: * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: */ } /* "aiohttp/_http_writer.pyx":75 * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: * return -1 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) */ __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f)))) < 0) != 0); if (__pyx_t_2) { /* "aiohttp/_http_writer.pyx":76 * return -1 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif utf > 0x10FFFF: */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":75 * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: * return -1 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) */ } /* "aiohttp/_http_writer.pyx":77 * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< * elif utf > 0x10FFFF: * # symbol is too large */ __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); goto __pyx_L0; /* "aiohttp/_http_writer.pyx":72 * # surogate pair, ignored * return 0 * elif utf < 0x10000: # <<<<<<<<<<<<<< * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: * return -1 */ } /* "aiohttp/_http_writer.pyx":78 * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif utf > 0x10FFFF: # <<<<<<<<<<<<<< * # symbol is too large * return 0 */ __pyx_t_2 = ((__pyx_v_utf > 0x10FFFF) != 0); if (__pyx_t_2) { /* "aiohttp/_http_writer.pyx":80 * elif utf > 0x10FFFF: * # symbol is too large * return 0 # <<<<<<<<<<<<<< * else: * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: */ __pyx_r = 0; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":78 * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) * elif utf > 0x10FFFF: # <<<<<<<<<<<<<< * # symbol is too large * return 0 */ } /* "aiohttp/_http_writer.pyx":82 * return 0 * else: * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_byte(writer, */ /*else*/ { __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xf0 | (__pyx_v_utf >> 18)))) < 0) != 0); if (__pyx_t_2) { /* "aiohttp/_http_writer.pyx":83 * else: * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_byte(writer, * (0x80 | ((utf >> 12) & 0x3f))) < 0: */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":82 * return 0 * else: * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_byte(writer, */ } /* "aiohttp/_http_writer.pyx":85 * return -1 * if _write_byte(writer, * (0x80 | ((utf >> 12) & 0x3f))) < 0: # <<<<<<<<<<<<<< * return -1 * if _write_byte(writer, */ __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 12) & 0x3f)))) < 0) != 0); /* "aiohttp/_http_writer.pyx":84 * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: * return -1 * if _write_byte(writer, # <<<<<<<<<<<<<< * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 */ if (__pyx_t_2) { /* "aiohttp/_http_writer.pyx":86 * if _write_byte(writer, * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 # <<<<<<<<<<<<<< * if _write_byte(writer, * (0x80 | ((utf >> 6) & 0x3f))) < 0: */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":84 * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: * return -1 * if _write_byte(writer, # <<<<<<<<<<<<<< * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 */ } /* "aiohttp/_http_writer.pyx":88 * return -1 * if _write_byte(writer, * (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) */ __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f)))) < 0) != 0); /* "aiohttp/_http_writer.pyx":87 * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 * if _write_byte(writer, # <<<<<<<<<<<<<< * (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 */ if (__pyx_t_2) { /* "aiohttp/_http_writer.pyx":89 * if _write_byte(writer, * (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 # <<<<<<<<<<<<<< * return _write_byte(writer, (0x80 | (utf & 0x3f))) * */ __pyx_r = -1; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":87 * (0x80 | ((utf >> 12) & 0x3f))) < 0: * return -1 * if _write_byte(writer, # <<<<<<<<<<<<<< * (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 */ } /* "aiohttp/_http_writer.pyx":90 * (0x80 | ((utf >> 6) & 0x3f))) < 0: * return -1 * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); goto __pyx_L0; } /* "aiohttp/_http_writer.pyx":60 * * * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<< * cdef uint64_t utf = symbol * */ /* function exit code */ __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_writer.pyx":93 * * * cdef inline int _write_str(Writer* writer, str s): # <<<<<<<<<<<<<< * cdef Py_UCS4 ch * for ch in s: */ static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_str(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, PyObject *__pyx_v_s) { Py_UCS4 __pyx_v_ch; int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; Py_ssize_t __pyx_t_3; void *__pyx_t_4; int __pyx_t_5; int __pyx_t_6; Py_ssize_t __pyx_t_7; int __pyx_t_8; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_write_str", 0); /* "aiohttp/_http_writer.pyx":95 * cdef inline int _write_str(Writer* writer, str s): * cdef Py_UCS4 ch * for ch in s: # <<<<<<<<<<<<<< * if _write_utf8(writer, ch) < 0: * return -1 */ if (unlikely(__pyx_v_s == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); __PYX_ERR(0, 95, __pyx_L1_error) } __Pyx_INCREF(__pyx_v_s); __pyx_t_1 = __pyx_v_s; __pyx_t_6 = __Pyx_init_unicode_iteration(__pyx_t_1, (&__pyx_t_3), (&__pyx_t_4), (&__pyx_t_5)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 95, __pyx_L1_error) for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_3; __pyx_t_7++) { __pyx_t_2 = __pyx_t_7; __pyx_v_ch = __Pyx_PyUnicode_READ(__pyx_t_5, __pyx_t_4, __pyx_t_2); /* "aiohttp/_http_writer.pyx":96 * cdef Py_UCS4 ch * for ch in s: * if _write_utf8(writer, ch) < 0: # <<<<<<<<<<<<<< * return -1 * */ __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_utf8(__pyx_v_writer, __pyx_v_ch) < 0) != 0); if (__pyx_t_8) { /* "aiohttp/_http_writer.pyx":97 * for ch in s: * if _write_utf8(writer, ch) < 0: * return -1 # <<<<<<<<<<<<<< * * */ __pyx_r = -1; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":96 * cdef Py_UCS4 ch * for ch in s: * if _write_utf8(writer, ch) < 0: # <<<<<<<<<<<<<< * return -1 * */ } } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_writer.pyx":93 * * * cdef inline int _write_str(Writer* writer, str s): # <<<<<<<<<<<<<< * cdef Py_UCS4 ch * for ch in s: */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_WriteUnraisable("aiohttp._http_writer._write_str", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_writer.pyx":102 * # --------------- _serialize_headers ---------------------- * * cdef str to_str(object s): # <<<<<<<<<<<<<< * typ = type(s) * if typ is str: */ static PyObject *__pyx_f_7aiohttp_12_http_writer_to_str(PyObject *__pyx_v_s) { PyTypeObject *__pyx_v_typ = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("to_str", 0); /* "aiohttp/_http_writer.pyx":103 * * cdef str to_str(object s): * typ = type(s) # <<<<<<<<<<<<<< * if typ is str: * return s */ __Pyx_INCREF(((PyObject *)Py_TYPE(__pyx_v_s))); __pyx_v_typ = ((PyTypeObject*)((PyObject *)Py_TYPE(__pyx_v_s))); /* "aiohttp/_http_writer.pyx":104 * cdef str to_str(object s): * typ = type(s) * if typ is str: # <<<<<<<<<<<<<< * return s * elif typ is _istr: */ __pyx_t_1 = (__pyx_v_typ == (&PyUnicode_Type)); __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { /* "aiohttp/_http_writer.pyx":105 * typ = type(s) * if typ is str: * return s # <<<<<<<<<<<<<< * elif typ is _istr: * return PyObject_Str(s) */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject*)__pyx_v_s)); __pyx_r = ((PyObject*)__pyx_v_s); goto __pyx_L0; /* "aiohttp/_http_writer.pyx":104 * cdef str to_str(object s): * typ = type(s) * if typ is str: # <<<<<<<<<<<<<< * return s * elif typ is _istr: */ } /* "aiohttp/_http_writer.pyx":106 * if typ is str: * return s * elif typ is _istr: # <<<<<<<<<<<<<< * return PyObject_Str(s) * elif not isinstance(s, str): */ __pyx_t_2 = (__pyx_v_typ == ((PyTypeObject*)__pyx_v_7aiohttp_12_http_writer__istr)); __pyx_t_1 = (__pyx_t_2 != 0); if (__pyx_t_1) { /* "aiohttp/_http_writer.pyx":107 * return s * elif typ is _istr: * return PyObject_Str(s) # <<<<<<<<<<<<<< * elif not isinstance(s, str): * raise TypeError("Cannot serialize non-str key {!r}".format(s)) */ __Pyx_XDECREF(__pyx_r); __pyx_t_3 = PyObject_Str(__pyx_v_s); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 107, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (!(likely(PyUnicode_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(0, 107, __pyx_L1_error) __pyx_r = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L0; /* "aiohttp/_http_writer.pyx":106 * if typ is str: * return s * elif typ is _istr: # <<<<<<<<<<<<<< * return PyObject_Str(s) * elif not isinstance(s, str): */ } /* "aiohttp/_http_writer.pyx":108 * elif typ is _istr: * return PyObject_Str(s) * elif not isinstance(s, str): # <<<<<<<<<<<<<< * raise TypeError("Cannot serialize non-str key {!r}".format(s)) * else: */ __pyx_t_1 = PyUnicode_Check(__pyx_v_s); __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); if (unlikely(__pyx_t_2)) { /* "aiohttp/_http_writer.pyx":109 * return PyObject_Str(s) * elif not isinstance(s, str): * raise TypeError("Cannot serialize non-str key {!r}".format(s)) # <<<<<<<<<<<<<< * else: * return str(s) */ __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_Cannot_serialize_non_str_key_r, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 109, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_v_s) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_s); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 109, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 109, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(0, 109, __pyx_L1_error) /* "aiohttp/_http_writer.pyx":108 * elif typ is _istr: * return PyObject_Str(s) * elif not isinstance(s, str): # <<<<<<<<<<<<<< * raise TypeError("Cannot serialize non-str key {!r}".format(s)) * else: */ } /* "aiohttp/_http_writer.pyx":111 * raise TypeError("Cannot serialize non-str key {!r}".format(s)) * else: * return str(s) # <<<<<<<<<<<<<< * * */ /*else*/ { __Pyx_XDECREF(__pyx_r); __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_s); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 111, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = ((PyObject*)__pyx_t_4); __pyx_t_4 = 0; goto __pyx_L0; } /* "aiohttp/_http_writer.pyx":102 * # --------------- _serialize_headers ---------------------- * * cdef str to_str(object s): # <<<<<<<<<<<<<< * typ = type(s) * if typ is str: */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("aiohttp._http_writer.to_str", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_typ); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "aiohttp/_http_writer.pyx":114 * * * cdef void _safe_header(str string) except *: # <<<<<<<<<<<<<< * if "\r" in string or "\n" in string: * raise ValueError( */ static void __pyx_f_7aiohttp_12_http_writer__safe_header(PyObject *__pyx_v_string) { __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_safe_header", 0); /* "aiohttp/_http_writer.pyx":115 * * cdef void _safe_header(str string) except *: * if "\r" in string or "\n" in string: # <<<<<<<<<<<<<< * raise ValueError( * "Newline or carriage return character detected in HTTP status message or " */ if (unlikely(__pyx_v_string == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 115, __pyx_L1_error) } __pyx_t_2 = (__Pyx_PyUnicode_ContainsTF(__pyx_kp_u_, __pyx_v_string, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 115, __pyx_L1_error) __pyx_t_3 = (__pyx_t_2 != 0); if (!__pyx_t_3) { } else { __pyx_t_1 = __pyx_t_3; goto __pyx_L4_bool_binop_done; } if (unlikely(__pyx_v_string == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(0, 115, __pyx_L1_error) } __pyx_t_3 = (__Pyx_PyUnicode_ContainsTF(__pyx_kp_u__2, __pyx_v_string, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 115, __pyx_L1_error) __pyx_t_2 = (__pyx_t_3 != 0); __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; if (unlikely(__pyx_t_1)) { /* "aiohttp/_http_writer.pyx":116 * cdef void _safe_header(str string) except *: * if "\r" in string or "\n" in string: * raise ValueError( # <<<<<<<<<<<<<< * "Newline or carriage return character detected in HTTP status message or " * "header. This is a potential security issue." */ __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 116, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(0, 116, __pyx_L1_error) /* "aiohttp/_http_writer.pyx":115 * * cdef void _safe_header(str string) except *: * if "\r" in string or "\n" in string: # <<<<<<<<<<<<<< * raise ValueError( * "Newline or carriage return character detected in HTTP status message or " */ } /* "aiohttp/_http_writer.pyx":114 * * * cdef void _safe_header(str string) except *: # <<<<<<<<<<<<<< * if "\r" in string or "\n" in string: * raise ValueError( */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("aiohttp._http_writer._safe_header", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "aiohttp/_http_writer.pyx":122 * * * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< * cdef Writer writer * cdef object key */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7aiohttp_12_http_writer_1_serialize_headers = {"_serialize_headers", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_status_line = 0; PyObject *__pyx_v_headers = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_serialize_headers (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_status_line,&__pyx_n_s_headers,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_status_line)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_headers)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_serialize_headers", 1, 2, 2, 1); __PYX_ERR(0, 122, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_serialize_headers") < 0)) __PYX_ERR(0, 122, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_status_line = ((PyObject*)values[0]); __pyx_v_headers = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("_serialize_headers", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 122, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("aiohttp._http_writer._serialize_headers", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_status_line), (&PyUnicode_Type), 1, "status_line", 1))) __PYX_ERR(0, 122, __pyx_L1_error) __pyx_r = __pyx_pf_7aiohttp_12_http_writer__serialize_headers(__pyx_self, __pyx_v_status_line, __pyx_v_headers); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_12_http_writer__serialize_headers(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_status_line, PyObject *__pyx_v_headers) { struct __pyx_t_7aiohttp_12_http_writer_Writer __pyx_v_writer; PyObject *__pyx_v_key = 0; PyObject *__pyx_v_val = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; Py_ssize_t __pyx_t_3; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; int __pyx_t_7; int __pyx_t_8; char const *__pyx_t_9; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; PyObject *__pyx_t_14 = NULL; PyObject *__pyx_t_15 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_serialize_headers", 0); /* "aiohttp/_http_writer.pyx":128 * cdef bytes ret * * _init_writer(&writer) # <<<<<<<<<<<<<< * * for key, val in headers.items(): */ __pyx_f_7aiohttp_12_http_writer__init_writer((&__pyx_v_writer)); /* "aiohttp/_http_writer.pyx":130 * _init_writer(&writer) * * for key, val in headers.items(): # <<<<<<<<<<<<<< * _safe_header(to_str(key)) * _safe_header(to_str(val)) */ __pyx_t_2 = 0; if (unlikely(__pyx_v_headers == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); __PYX_ERR(0, 130, __pyx_L1_error) } __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_headers, 0, __pyx_n_s_items, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 130, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = __pyx_t_5; __pyx_t_5 = 0; while (1) { __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_3, &__pyx_t_2, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4); if (unlikely(__pyx_t_7 == 0)) break; if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 130, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_5); __pyx_t_5 = 0; __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_writer.pyx":131 * * for key, val in headers.items(): * _safe_header(to_str(key)) # <<<<<<<<<<<<<< * _safe_header(to_str(val)) * */ __pyx_t_6 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_key); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 131, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_f_7aiohttp_12_http_writer__safe_header(((PyObject*)__pyx_t_6)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 131, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; /* "aiohttp/_http_writer.pyx":132 * for key, val in headers.items(): * _safe_header(to_str(key)) * _safe_header(to_str(val)) # <<<<<<<<<<<<<< * * try: */ __pyx_t_6 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_val); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_f_7aiohttp_12_http_writer__safe_header(((PyObject*)__pyx_t_6)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_writer.pyx":134 * _safe_header(to_str(val)) * * try: # <<<<<<<<<<<<<< * if _write_str(&writer, status_line) < 0: * raise */ /*try:*/ { /* "aiohttp/_http_writer.pyx":135 * * try: * if _write_str(&writer, status_line) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\r') < 0: */ __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), __pyx_v_status_line) < 0) != 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":136 * try: * if _write_str(&writer, status_line) < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b'\r') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 136, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":135 * * try: * if _write_str(&writer, status_line) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\r') < 0: */ } /* "aiohttp/_http_writer.pyx":137 * if _write_str(&writer, status_line) < 0: * raise * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r') < 0) != 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":138 * raise * if _write_byte(&writer, b'\r') < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b'\n') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 138, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":137 * if _write_str(&writer, status_line) < 0: * raise * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ } /* "aiohttp/_http_writer.pyx":139 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n') < 0) != 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":140 * raise * if _write_byte(&writer, b'\n') < 0: * raise # <<<<<<<<<<<<<< * * for key, val in headers.items(): */ __Pyx_ReraiseException(); __PYX_ERR(0, 140, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":139 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ } /* "aiohttp/_http_writer.pyx":142 * raise * * for key, val in headers.items(): # <<<<<<<<<<<<<< * if _write_str(&writer, to_str(key)) < 0: * raise */ __pyx_t_3 = 0; if (unlikely(__pyx_v_headers == Py_None)) { PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); __PYX_ERR(0, 142, __pyx_L6_error) } __pyx_t_6 = __Pyx_dict_iterator(__pyx_v_headers, 0, __pyx_n_s_items, (&__pyx_t_2), (&__pyx_t_4)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 142, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = __pyx_t_6; __pyx_t_6 = 0; while (1) { __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_2, &__pyx_t_3, &__pyx_t_6, &__pyx_t_5, NULL, __pyx_t_4); if (unlikely(__pyx_t_7 == 0)) break; if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 142, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_5); __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_6); __pyx_t_6 = 0; __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_5); __pyx_t_5 = 0; /* "aiohttp/_http_writer.pyx":143 * * for key, val in headers.items(): * if _write_str(&writer, to_str(key)) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b':') < 0: */ __pyx_t_5 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_key); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 143, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), ((PyObject*)__pyx_t_5)) < 0) != 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":144 * for key, val in headers.items(): * if _write_str(&writer, to_str(key)) < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b':') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 144, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":143 * * for key, val in headers.items(): * if _write_str(&writer, to_str(key)) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b':') < 0: */ } /* "aiohttp/_http_writer.pyx":145 * if _write_str(&writer, to_str(key)) < 0: * raise * if _write_byte(&writer, b':') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b' ') < 0: */ __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), ':') < 0) != 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":146 * raise * if _write_byte(&writer, b':') < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b' ') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 146, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":145 * if _write_str(&writer, to_str(key)) < 0: * raise * if _write_byte(&writer, b':') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b' ') < 0: */ } /* "aiohttp/_http_writer.pyx":147 * if _write_byte(&writer, b':') < 0: * raise * if _write_byte(&writer, b' ') < 0: # <<<<<<<<<<<<<< * raise * if _write_str(&writer, to_str(val)) < 0: */ __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), ' ') < 0) != 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":148 * raise * if _write_byte(&writer, b' ') < 0: * raise # <<<<<<<<<<<<<< * if _write_str(&writer, to_str(val)) < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 148, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":147 * if _write_byte(&writer, b':') < 0: * raise * if _write_byte(&writer, b' ') < 0: # <<<<<<<<<<<<<< * raise * if _write_str(&writer, to_str(val)) < 0: */ } /* "aiohttp/_http_writer.pyx":149 * if _write_byte(&writer, b' ') < 0: * raise * if _write_str(&writer, to_str(val)) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\r') < 0: */ __pyx_t_5 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 149, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), ((PyObject*)__pyx_t_5)) < 0) != 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":150 * raise * if _write_str(&writer, to_str(val)) < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b'\r') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 150, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":149 * if _write_byte(&writer, b' ') < 0: * raise * if _write_str(&writer, to_str(val)) < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\r') < 0: */ } /* "aiohttp/_http_writer.pyx":151 * if _write_str(&writer, to_str(val)) < 0: * raise * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r') < 0) != 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":152 * raise * if _write_byte(&writer, b'\r') < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b'\n') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 152, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":151 * if _write_str(&writer, to_str(val)) < 0: * raise * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ } /* "aiohttp/_http_writer.pyx":153 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n') < 0) != 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":154 * raise * if _write_byte(&writer, b'\n') < 0: * raise # <<<<<<<<<<<<<< * * if _write_byte(&writer, b'\r') < 0: */ __Pyx_ReraiseException(); __PYX_ERR(0, 154, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":153 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ } } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_http_writer.pyx":156 * raise * * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r') < 0) != 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":157 * * if _write_byte(&writer, b'\r') < 0: * raise # <<<<<<<<<<<<<< * if _write_byte(&writer, b'\n') < 0: * raise */ __Pyx_ReraiseException(); __PYX_ERR(0, 157, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":156 * raise * * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< * raise * if _write_byte(&writer, b'\n') < 0: */ } /* "aiohttp/_http_writer.pyx":158 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n') < 0) != 0); if (unlikely(__pyx_t_8)) { /* "aiohttp/_http_writer.pyx":159 * raise * if _write_byte(&writer, b'\n') < 0: * raise # <<<<<<<<<<<<<< * * return PyBytes_FromStringAndSize(writer.buf, writer.pos) */ __Pyx_ReraiseException(); __PYX_ERR(0, 159, __pyx_L6_error) /* "aiohttp/_http_writer.pyx":158 * if _write_byte(&writer, b'\r') < 0: * raise * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< * raise * */ } /* "aiohttp/_http_writer.pyx":161 * raise * * return PyBytes_FromStringAndSize(writer.buf, writer.pos) # <<<<<<<<<<<<<< * finally: * _release_writer(&writer) */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyBytes_FromStringAndSize(__pyx_v_writer.buf, __pyx_v_writer.pos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L5_return; } /* "aiohttp/_http_writer.pyx":163 * return PyBytes_FromStringAndSize(writer.buf, writer.pos) * finally: * _release_writer(&writer) # <<<<<<<<<<<<<< */ /*finally:*/ { __pyx_L6_error:; /*exception exit:*/{ __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_13, &__pyx_t_14, &__pyx_t_15); if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12) < 0)) __Pyx_ErrFetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); __Pyx_XGOTREF(__pyx_t_10); __Pyx_XGOTREF(__pyx_t_11); __Pyx_XGOTREF(__pyx_t_12); __Pyx_XGOTREF(__pyx_t_13); __Pyx_XGOTREF(__pyx_t_14); __Pyx_XGOTREF(__pyx_t_15); __pyx_t_4 = __pyx_lineno; __pyx_t_7 = __pyx_clineno; __pyx_t_9 = __pyx_filename; { __pyx_f_7aiohttp_12_http_writer__release_writer((&__pyx_v_writer)); } if (PY_MAJOR_VERSION >= 3) { __Pyx_XGIVEREF(__pyx_t_13); __Pyx_XGIVEREF(__pyx_t_14); __Pyx_XGIVEREF(__pyx_t_15); __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_14, __pyx_t_15); } __Pyx_XGIVEREF(__pyx_t_10); __Pyx_XGIVEREF(__pyx_t_11); __Pyx_XGIVEREF(__pyx_t_12); __Pyx_ErrRestore(__pyx_t_10, __pyx_t_11, __pyx_t_12); __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_7; __pyx_filename = __pyx_t_9; goto __pyx_L1_error; } __pyx_L5_return: { __pyx_t_15 = __pyx_r; __pyx_r = 0; __pyx_f_7aiohttp_12_http_writer__release_writer((&__pyx_v_writer)); __pyx_r = __pyx_t_15; __pyx_t_15 = 0; goto __pyx_L0; } } /* "aiohttp/_http_writer.pyx":122 * * * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< * cdef Writer writer * cdef object key */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("aiohttp._http_writer._serialize_headers", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_key); __Pyx_XDECREF(__pyx_v_val); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec__http_writer(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec__http_writer}, {0, NULL} }; #endif static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, "_http_writer", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, {&__pyx_kp_u_Cannot_serialize_non_str_key_r, __pyx_k_Cannot_serialize_non_str_key_r, sizeof(__pyx_k_Cannot_serialize_non_str_key_r), 0, 1, 0, 0}, {&__pyx_kp_u_Newline_or_carriage_return_chara, __pyx_k_Newline_or_carriage_return_chara, sizeof(__pyx_k_Newline_or_carriage_return_chara), 0, 1, 0, 0}, {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, {&__pyx_n_s_aiohttp__http_writer, __pyx_k_aiohttp__http_writer, sizeof(__pyx_k_aiohttp__http_writer), 0, 0, 1, 1}, {&__pyx_kp_s_aiohttp__http_writer_pyx, __pyx_k_aiohttp__http_writer_pyx, sizeof(__pyx_k_aiohttp__http_writer_pyx), 0, 0, 1, 0}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, {&__pyx_n_s_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_n_s_istr, __pyx_k_istr, sizeof(__pyx_k_istr), 0, 0, 1, 1}, {&__pyx_n_s_items, __pyx_k_items, sizeof(__pyx_k_items), 0, 0, 1, 1}, {&__pyx_n_s_key, __pyx_k_key, sizeof(__pyx_k_key), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_multidict, __pyx_k_multidict, sizeof(__pyx_k_multidict), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_ret, __pyx_k_ret, sizeof(__pyx_k_ret), 0, 0, 1, 1}, {&__pyx_n_s_serialize_headers, __pyx_k_serialize_headers, sizeof(__pyx_k_serialize_headers), 0, 0, 1, 1}, {&__pyx_n_s_status_line, __pyx_k_status_line, sizeof(__pyx_k_status_line), 0, 0, 1, 1}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_val, __pyx_k_val, sizeof(__pyx_k_val), 0, 0, 1, 1}, {&__pyx_n_s_writer, __pyx_k_writer, sizeof(__pyx_k_writer), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 109, __pyx_L1_error) __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 116, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "aiohttp/_http_writer.pyx":116 * cdef void _safe_header(str string) except *: * if "\r" in string or "\n" in string: * raise ValueError( # <<<<<<<<<<<<<< * "Newline or carriage return character detected in HTTP status message or " * "header. This is a potential security issue." */ __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Newline_or_carriage_return_chara); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 116, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); /* "aiohttp/_http_writer.pyx":122 * * * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< * cdef Writer writer * cdef object key */ __pyx_tuple__4 = PyTuple_Pack(6, __pyx_n_s_status_line, __pyx_n_s_headers, __pyx_n_s_writer, __pyx_n_s_key, __pyx_n_s_val, __pyx_n_s_ret); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 122, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); __pyx_codeobj__5 = (PyObject*)__Pyx_PyCode_New(2, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__4, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__http_writer_pyx, __pyx_n_s_serialize_headers, 122, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__5)) __PYX_ERR(0, 122, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __pyx_v_7aiohttp_12_http_writer__istr = Py_None; Py_INCREF(Py_None); __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 sizeof(PyTypeObject), #else sizeof(PyHeapTypeObject), #endif __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC init_http_writer(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC init_http_writer(void) #else __Pyx_PyMODINIT_FUNC PyInit__http_writer(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit__http_writer(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { result = PyDict_SetItemString(moddict, to_name, value); } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec__http_writer(PyObject *__pyx_pyinit_module) #endif #endif { PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module '_http_writer' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__http_writer(void)", 0); if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS PyEval_InitThreads(); #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_http_writer", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_b); __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_cython_runtime); if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_aiohttp___http_writer) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "aiohttp._http_writer")) { if (unlikely(PyDict_SetItemString(modules, "aiohttp._http_writer", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); (void)__Pyx_modinit_type_init_code(); if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "aiohttp/_http_writer.pyx":8 * from libc.string cimport memcpy * * from multidict import istr # <<<<<<<<<<<<<< * * DEF BUF_SIZE = 16 * 1024 # 16KiB */ __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_istr); __Pyx_GIVEREF(__pyx_n_s_istr); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_istr); __pyx_t_2 = __Pyx_Import(__pyx_n_s_multidict, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_istr); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_istr, __pyx_t_1) < 0) __PYX_ERR(0, 8, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_writer.pyx":13 * cdef char BUFFER[BUF_SIZE] * * cdef object _istr = istr # <<<<<<<<<<<<<< * * */ __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_istr); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_writer__istr); __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_writer__istr, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_writer.pyx":122 * * * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< * cdef Writer writer * cdef object key */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_12_http_writer_1_serialize_headers, NULL, __pyx_n_s_aiohttp__http_writer); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 122, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_serialize_headers, __pyx_t_2) < 0) __PYX_ERR(0, 122, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "aiohttp/_http_writer.pyx":1 * from cpython.bytes cimport PyBytes_FromStringAndSize # <<<<<<<<<<<<<< * from cpython.exc cimport PyErr_NoMemory * from cpython.mem cimport PyMem_Free, PyMem_Malloc, PyMem_Realloc */ __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init aiohttp._http_writer", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_CLEAR(__pyx_m); } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init aiohttp._http_writer"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #endif /* WriteUnraisableException */ static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename, int full_traceback, CYTHON_UNUSED int nogil) { PyObject *old_exc, *old_val, *old_tb; PyObject *ctx; __Pyx_PyThreadState_declare #ifdef WITH_THREAD PyGILState_STATE state; if (nogil) state = PyGILState_Ensure(); #ifdef _MSC_VER else state = (PyGILState_STATE)-1; #endif #endif __Pyx_PyThreadState_assign __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); if (full_traceback) { Py_XINCREF(old_exc); Py_XINCREF(old_val); Py_XINCREF(old_tb); __Pyx_ErrRestore(old_exc, old_val, old_tb); PyErr_PrintEx(1); } #if PY_MAJOR_VERSION < 3 ctx = PyString_FromString(name); #else ctx = PyUnicode_FromString(name); #endif __Pyx_ErrRestore(old_exc, old_val, old_tb); if (!ctx) { PyErr_WriteUnraisable(Py_None); } else { PyErr_WriteUnraisable(ctx); Py_DECREF(ctx); } #ifdef WITH_THREAD if (nogil) PyGILState_Release(state); #endif } /* unicode_iter */ static CYTHON_INLINE int __Pyx_init_unicode_iteration( PyObject* ustring, Py_ssize_t *length, void** data, int *kind) { #if CYTHON_PEP393_ENABLED if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return -1; *kind = PyUnicode_KIND(ustring); *length = PyUnicode_GET_LENGTH(ustring); *data = PyUnicode_DATA(ustring); #else *kind = 0; *length = PyUnicode_GET_SIZE(ustring); *data = (void*)PyUnicode_AS_UNICODE(ustring); #endif return 0; } /* PyCFunctionFastCall */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { PyCFunctionObject *func = (PyCFunctionObject*)func_obj; PyCFunction meth = PyCFunction_GET_FUNCTION(func); PyObject *self = PyCFunction_GET_SELF(func); int flags = PyCFunction_GET_FLAGS(func); assert(PyCFunction_Check(func)); assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); assert(nargs >= 0); assert(nargs == 0 || args != NULL); /* _PyCFunction_FastCallDict() must not be called with an exception set, because it may clear it (directly or indirectly) and so the caller loses its exception */ assert(!PyErr_Occurred()); if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); } else { return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); } } #endif /* PyFunctionFastCall */ #if CYTHON_FAST_PYCALL static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, PyObject *globals) { PyFrameObject *f; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject **fastlocals; Py_ssize_t i; PyObject *result; assert(globals != NULL); /* XXX Perhaps we should create a specialized PyFrame_New() that doesn't take locals, but does take builtins without sanity checking them. */ assert(tstate != NULL); f = PyFrame_New(tstate, co, globals, NULL); if (f == NULL) { return NULL; } fastlocals = __Pyx_PyFrame_GetLocalsplus(f); for (i = 0; i < na; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } result = PyEval_EvalFrameEx(f,0); ++tstate->recursion_depth; Py_DECREF(f); --tstate->recursion_depth; return result; } #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *closure; #if PY_MAJOR_VERSION >= 3 PyObject *kwdefs; #endif PyObject *kwtuple, **k; PyObject **d; Py_ssize_t nd; Py_ssize_t nk; PyObject *result; assert(kwargs == NULL || PyDict_Check(kwargs)); nk = kwargs ? PyDict_Size(kwargs) : 0; if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { return NULL; } if ( #if PY_MAJOR_VERSION >= 3 co->co_kwonlyargcount == 0 && #endif likely(kwargs == NULL || nk == 0) && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); goto done; } else if (nargs == 0 && argdefs != NULL && co->co_argcount == Py_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = &PyTuple_GET_ITEM(argdefs, 0); result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); goto done; } } if (kwargs != NULL) { Py_ssize_t pos, i; kwtuple = PyTuple_New(2 * nk); if (kwtuple == NULL) { result = NULL; goto done; } k = &PyTuple_GET_ITEM(kwtuple, 0); pos = i = 0; while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { Py_INCREF(k[i]); Py_INCREF(k[i+1]); i += 2; } nk = i / 2; } else { kwtuple = NULL; k = NULL; } closure = PyFunction_GET_CLOSURE(func); #if PY_MAJOR_VERSION >= 3 kwdefs = PyFunction_GET_KW_DEFAULTS(func); #endif if (argdefs != NULL) { d = &PyTuple_GET_ITEM(argdefs, 0); nd = Py_SIZE(argdefs); } else { d = NULL; nd = 0; } #if PY_MAJOR_VERSION >= 3 result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, kwdefs, closure); #else result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, closure); #endif Py_XDECREF(kwtuple); done: Py_LeaveRecursiveCall(); return result; } #endif #endif /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = Py_TYPE(func)->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCall2Args */ static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { PyObject *args, *result = NULL; #if CYTHON_FAST_PYCALL if (PyFunction_Check(function)) { PyObject *args[2] = {arg1, arg2}; return __Pyx_PyFunction_FastCall(function, args, 2); } #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(function)) { PyObject *args[2] = {arg1, arg2}; return __Pyx_PyCFunction_FastCall(function, args, 2); } #endif args = PyTuple_New(2); if (unlikely(!args)) goto done; Py_INCREF(arg1); PyTuple_SET_ITEM(args, 0, arg1); Py_INCREF(arg2); PyTuple_SET_ITEM(args, 1, arg2); Py_INCREF(function); result = __Pyx_PyObject_Call(function, args, NULL); Py_DECREF(args); Py_DECREF(function); done: return result; } /* PyObjectCallMethO */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { PyObject *self, *result; PyCFunction cfunc; cfunc = PyCFunction_GET_FUNCTION(func); self = PyCFunction_GET_SELF(func); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = cfunc(self, arg); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallOneArg */ #if CYTHON_COMPILING_IN_CPYTHON static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_New(1); if (unlikely(!args)) return NULL; Py_INCREF(arg); PyTuple_SET_ITEM(args, 0, arg); result = __Pyx_PyObject_Call(func, args, NULL); Py_DECREF(args); return result; } static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCall(func, &arg, 1); } #endif if (likely(PyCFunction_Check(func))) { if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { return __Pyx_PyObject_CallMethO(func, arg); #if CYTHON_FAST_PYCCALL } else if (__Pyx_PyFastCFunction_Check(func)) { return __Pyx_PyCFunction_FastCall(func, &arg, 1); #endif } } return __Pyx__PyObject_CallOneArg(func, arg); } #else static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_Pack(1, arg); if (unlikely(!args)) return NULL; result = __Pyx_PyObject_Call(func, args, NULL); Py_DECREF(args); return result; } #endif /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, CYTHON_UNUSED PyObject *cause) { __Pyx_PyThreadState_declare Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if CYTHON_COMPILING_IN_PYPY PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #else PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* RaiseArgTupleInvalid */ static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } /* RaiseDoubleKeywords */ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } /* ArgTypeTest */ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) { if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } else if (exact) { #if PY_MAJOR_VERSION == 2 if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; #endif } else { if (likely(__Pyx_TypeCheck(obj, type))) return 1; } PyErr_Format(PyExc_TypeError, "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", name, type->tp_name, Py_TYPE(obj)->tp_name); return 0; } /* IterFinish */ static CYTHON_INLINE int __Pyx_IterFinish(void) { #if CYTHON_FAST_THREAD_STATE PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* exc_type = tstate->curexc_type; if (unlikely(exc_type)) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) { PyObject *exc_value, *exc_tb; exc_value = tstate->curexc_value; exc_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; Py_DECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb); return 0; } else { return -1; } } return 0; #else if (unlikely(PyErr_Occurred())) { if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { PyErr_Clear(); return 0; } else { return -1; } } return 0; #endif } /* PyObjectCallNoArg */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCall(func, NULL, 0); } #endif #ifdef __Pyx_CyFunction_USED if (likely(PyCFunction_Check(func) || __Pyx_CyFunction_Check(func))) #else if (likely(PyCFunction_Check(func))) #endif { if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { return __Pyx_PyObject_CallMethO(func, NULL); } } return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL); } #endif /* PyObjectGetMethod */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { PyObject *attr; #if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP PyTypeObject *tp = Py_TYPE(obj); PyObject *descr; descrgetfunc f = NULL; PyObject **dictptr, *dict; int meth_found = 0; assert (*method == NULL); if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; } if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { return 0; } descr = _PyType_Lookup(tp, name); if (likely(descr != NULL)) { Py_INCREF(descr); #if PY_MAJOR_VERSION >= 3 #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type))) #endif #else #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr))) #endif #endif { meth_found = 1; } else { f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } } } dictptr = _PyObject_GetDictPtr(obj); if (dictptr != NULL && (dict = *dictptr) != NULL) { Py_INCREF(dict); attr = __Pyx_PyDict_GetItemStr(dict, name); if (attr != NULL) { Py_INCREF(attr); Py_DECREF(dict); Py_XDECREF(descr); goto try_unpack; } Py_DECREF(dict); } if (meth_found) { *method = descr; return 1; } if (f != NULL) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } if (descr != NULL) { *method = descr; return 0; } PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'%.50s' object has no attribute '%U'", tp->tp_name, name); #else "'%.50s' object has no attribute '%.400s'", tp->tp_name, PyString_AS_STRING(name)); #endif return 0; #else attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; #endif try_unpack: #if CYTHON_UNPACK_METHODS if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { PyObject *function = PyMethod_GET_FUNCTION(attr); Py_INCREF(function); Py_DECREF(attr); *method = function; return 1; } #endif *method = attr; return 0; } /* PyObjectCallMethod0 */ static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { PyObject *method = NULL, *result = NULL; int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); if (likely(is_method)) { result = __Pyx_PyObject_CallOneArg(method, obj); Py_DECREF(method); return result; } if (unlikely(!method)) goto bad; result = __Pyx_PyObject_CallNoArg(method); Py_DECREF(method); bad: return result; } /* RaiseNeedMoreValuesToUnpack */ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", index, (index == 1) ? "" : "s"); } /* RaiseTooManyValuesToUnpack */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } /* UnpackItemEndCheck */ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { if (unlikely(retval)) { Py_DECREF(retval); __Pyx_RaiseTooManyValuesError(expected); return -1; } else { return __Pyx_IterFinish(); } return 0; } /* RaiseNoneIterError */ static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); } /* UnpackTupleError */ static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { if (t == Py_None) { __Pyx_RaiseNoneNotIterableError(); } else if (PyTuple_GET_SIZE(t) < index) { __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); } else { __Pyx_RaiseTooManyValuesError(index); } } /* UnpackTuple2 */ static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { PyObject *value1 = NULL, *value2 = NULL; #if CYTHON_COMPILING_IN_PYPY value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; #else value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); #endif if (decref_tuple) { Py_DECREF(tuple); } *pvalue1 = value1; *pvalue2 = value2; return 0; #if CYTHON_COMPILING_IN_PYPY bad: Py_XDECREF(value1); Py_XDECREF(value2); if (decref_tuple) { Py_XDECREF(tuple); } return -1; #endif } static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int has_known_size, int decref_tuple) { Py_ssize_t index; PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; iternextfunc iternext; iter = PyObject_GetIter(tuple); if (unlikely(!iter)) goto bad; if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } iternext = Py_TYPE(iter)->tp_iternext; value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; Py_DECREF(iter); *pvalue1 = value1; *pvalue2 = value2; return 0; unpacking_failed: if (!has_known_size && __Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); bad: Py_XDECREF(iter); Py_XDECREF(value1); Py_XDECREF(value2); if (decref_tuple) { Py_XDECREF(tuple); } return -1; } /* dict_iter */ static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, Py_ssize_t* p_orig_length, int* p_source_is_dict) { is_dict = is_dict || likely(PyDict_CheckExact(iterable)); *p_source_is_dict = is_dict; if (is_dict) { #if !CYTHON_COMPILING_IN_PYPY *p_orig_length = PyDict_Size(iterable); Py_INCREF(iterable); return iterable; #elif PY_MAJOR_VERSION >= 3 static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; PyObject **pp = NULL; if (method_name) { const char *name = PyUnicode_AsUTF8(method_name); if (strcmp(name, "iteritems") == 0) pp = &py_items; else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; else if (strcmp(name, "itervalues") == 0) pp = &py_values; if (pp) { if (!*pp) { *pp = PyUnicode_FromString(name + 4); if (!*pp) return NULL; } method_name = *pp; } } #endif } *p_orig_length = 0; if (method_name) { PyObject* iter; iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); if (!iterable) return NULL; #if !CYTHON_COMPILING_IN_PYPY if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) return iterable; #endif iter = PyObject_GetIter(iterable); Py_DECREF(iterable); return iter; } return PyObject_GetIter(iterable); } static CYTHON_INLINE int __Pyx_dict_iter_next( PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { PyObject* next_item; #if !CYTHON_COMPILING_IN_PYPY if (source_is_dict) { PyObject *key, *value; if (unlikely(orig_length != PyDict_Size(iter_obj))) { PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); return -1; } if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { return 0; } if (pitem) { PyObject* tuple = PyTuple_New(2); if (unlikely(!tuple)) { return -1; } Py_INCREF(key); Py_INCREF(value); PyTuple_SET_ITEM(tuple, 0, key); PyTuple_SET_ITEM(tuple, 1, value); *pitem = tuple; } else { if (pkey) { Py_INCREF(key); *pkey = key; } if (pvalue) { Py_INCREF(value); *pvalue = value; } } return 1; } else if (PyTuple_CheckExact(iter_obj)) { Py_ssize_t pos = *ppos; if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; *ppos = pos + 1; next_item = PyTuple_GET_ITEM(iter_obj, pos); Py_INCREF(next_item); } else if (PyList_CheckExact(iter_obj)) { Py_ssize_t pos = *ppos; if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; *ppos = pos + 1; next_item = PyList_GET_ITEM(iter_obj, pos); Py_INCREF(next_item); } else #endif { next_item = PyIter_Next(iter_obj); if (unlikely(!next_item)) { return __Pyx_IterFinish(); } } if (pitem) { *pitem = next_item; } else if (pkey && pvalue) { if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) return -1; } else if (pkey) { *pkey = next_item; } else { *pvalue = next_item; } return 1; } /* GetTopmostException */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate) { _PyErr_StackItem *exc_info = tstate->exc_info; while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && exc_info->previous_item != NULL) { exc_info = exc_info->previous_item; } return exc_info; } #endif /* ReRaiseException */ static CYTHON_INLINE void __Pyx_ReraiseException(void) { PyObject *type = NULL, *value = NULL, *tb = NULL; #if CYTHON_FAST_THREAD_STATE PyThreadState *tstate = PyThreadState_GET(); #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); type = exc_info->exc_type; value = exc_info->exc_value; tb = exc_info->exc_traceback; #else type = tstate->exc_type; value = tstate->exc_value; tb = tstate->exc_traceback; #endif #else PyErr_GetExcInfo(&type, &value, &tb); #endif if (!type || type == Py_None) { #if !CYTHON_FAST_THREAD_STATE Py_XDECREF(type); Py_XDECREF(value); Py_XDECREF(tb); #endif PyErr_SetString(PyExc_RuntimeError, "No active exception to reraise"); } else { #if CYTHON_FAST_THREAD_STATE Py_INCREF(type); Py_XINCREF(value); Py_XINCREF(tb); #endif PyErr_Restore(type, value, tb); } } /* GetException */ #if CYTHON_FAST_THREAD_STATE static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) #endif { PyObject *local_type, *local_value, *local_tb; #if CYTHON_FAST_THREAD_STATE PyObject *tmp_type, *tmp_value, *tmp_tb; local_type = tstate->curexc_type; local_value = tstate->curexc_value; local_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(&local_type, &local_value, &local_tb); #endif PyErr_NormalizeException(&local_type, &local_value, &local_tb); #if CYTHON_FAST_THREAD_STATE if (unlikely(tstate->curexc_type)) #else if (unlikely(PyErr_Occurred())) #endif goto bad; #if PY_MAJOR_VERSION >= 3 if (local_tb) { if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) goto bad; } #endif Py_XINCREF(local_tb); Py_XINCREF(local_type); Py_XINCREF(local_value); *type = local_type; *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE #if CYTHON_USE_EXC_INFO_STACK { _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = local_type; exc_info->exc_value = local_value; exc_info->exc_traceback = local_tb; } #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(local_type, local_value, local_tb); #endif return 0; bad: *type = 0; *value = 0; *tb = 0; Py_XDECREF(local_type); Py_XDECREF(local_value); Py_XDECREF(local_tb); return -1; } /* SwapException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = *type; exc_info->exc_value = *value; exc_info->exc_traceback = *tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = *type; tstate->exc_value = *value; tstate->exc_traceback = *tb; #endif *type = tmp_type; *value = tmp_value; *tb = tmp_tb; } #else static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); PyErr_SetExcInfo(*type, *value, *tb); *type = tmp_type; *value = tmp_value; *tb = tmp_tb; } #endif /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); *type = exc_info->exc_type; *value = exc_info->exc_value; *tb = exc_info->exc_traceback; #else *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; #endif Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; #if CYTHON_USE_EXC_INFO_STACK _PyErr_StackItem *exc_info = tstate->exc_info; tmp_type = exc_info->exc_type; tmp_value = exc_info->exc_value; tmp_tb = exc_info->exc_traceback; exc_info->exc_type = type; exc_info->exc_value = value; exc_info->exc_traceback = tb; #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } #endif /* TypeImport */ #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size) { PyObject *result = 0; char warning[200]; Py_ssize_t basicsize; #ifdef Py_LIMITED_API PyObject *py_basicsize; #endif result = PyObject_GetAttrString(module, class_name); if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%.200s.%.200s is not a type object", module_name, class_name); goto bad; } #ifndef Py_LIMITED_API basicsize = ((PyTypeObject *)result)->tp_basicsize; #else py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); if (!py_basicsize) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; #endif if ((size_t)basicsize < size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(result); return NULL; } #endif /* Import */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; #if PY_MAJOR_VERSION < 3 PyObject *py_import; py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); if (!py_import) goto bad; #endif if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, 1); if (!module) { if (!PyErr_ExceptionMatches(PyExc_ImportError)) goto bad; PyErr_Clear(); } } level = 0; } #endif if (!module) { #if PY_MAJOR_VERSION < 3 PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, level); #endif } } bad: #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_import); #endif Py_XDECREF(empty_list); Py_XDECREF(empty_dict); return module; } /* ImportFrom */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Format(PyExc_ImportError, #if PY_MAJOR_VERSION < 3 "cannot import name %.230s", PyString_AS_STRING(name)); #else "cannot import name %S", name); #endif } return value; } /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* GetModuleGlobalName */ #if CYTHON_USE_DICT_VERSIONS static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) #else static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) #endif { PyObject *result; #if !CYTHON_AVOID_BORROWED_REFS #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } else if (unlikely(PyErr_Occurred())) { return NULL; } #else result = PyDict_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } #endif #else result = PyObject_GetItem(__pyx_d, name); __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) if (likely(result)) { return __Pyx_NewRef(result); } PyErr_Clear(); #endif return __Pyx_GetBuiltinName(name); } /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) case -2: if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) case -2: if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = a->tp_base; if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; if (!res) { res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } return res; } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; ip) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", type_name, type_name, Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)b)->ob_digit; const Py_ssize_t size = Py_SIZE(b); if (likely(__Pyx_sst_abs(size) <= 1)) { ival = likely(size) ? digits[0] : 0; if (size == -1) ival = -ival; return ival; } else { switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/_http_writer.pyx0000644000175100001710000001073700000000000017467 0ustar00runnerdockerfrom cpython.bytes cimport PyBytes_FromStringAndSize from cpython.exc cimport PyErr_NoMemory from cpython.mem cimport PyMem_Free, PyMem_Malloc, PyMem_Realloc from cpython.object cimport PyObject_Str from libc.stdint cimport uint8_t, uint64_t from libc.string cimport memcpy from multidict import istr DEF BUF_SIZE = 16 * 1024 # 16KiB cdef char BUFFER[BUF_SIZE] cdef object _istr = istr # ----------------- writer --------------------------- cdef struct Writer: char *buf Py_ssize_t size Py_ssize_t pos cdef inline void _init_writer(Writer* writer): writer.buf = &BUFFER[0] writer.size = BUF_SIZE writer.pos = 0 cdef inline void _release_writer(Writer* writer): if writer.buf != BUFFER: PyMem_Free(writer.buf) cdef inline int _write_byte(Writer* writer, uint8_t ch): cdef char * buf cdef Py_ssize_t size if writer.pos == writer.size: # reallocate size = writer.size + BUF_SIZE if writer.buf == BUFFER: buf = PyMem_Malloc(size) if buf == NULL: PyErr_NoMemory() return -1 memcpy(buf, writer.buf, writer.size) else: buf = PyMem_Realloc(writer.buf, size) if buf == NULL: PyErr_NoMemory() return -1 writer.buf = buf writer.size = size writer.buf[writer.pos] = ch writer.pos += 1 return 0 cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): cdef uint64_t utf = symbol if utf < 0x80: return _write_byte(writer, utf) elif utf < 0x800: if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: return -1 return _write_byte(writer, (0x80 | (utf & 0x3f))) elif 0xD800 <= utf <= 0xDFFF: # surogate pair, ignored return 0 elif utf < 0x10000: if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: return -1 if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: return -1 return _write_byte(writer, (0x80 | (utf & 0x3f))) elif utf > 0x10FFFF: # symbol is too large return 0 else: if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: return -1 if _write_byte(writer, (0x80 | ((utf >> 12) & 0x3f))) < 0: return -1 if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: return -1 return _write_byte(writer, (0x80 | (utf & 0x3f))) cdef inline int _write_str(Writer* writer, str s): cdef Py_UCS4 ch for ch in s: if _write_utf8(writer, ch) < 0: return -1 # --------------- _serialize_headers ---------------------- cdef str to_str(object s): typ = type(s) if typ is str: return s elif typ is _istr: return PyObject_Str(s) elif not isinstance(s, str): raise TypeError("Cannot serialize non-str key {!r}".format(s)) else: return str(s) cdef void _safe_header(str string) except *: if "\r" in string or "\n" in string: raise ValueError( "Newline or carriage return character detected in HTTP status message or " "header. This is a potential security issue." ) def _serialize_headers(str status_line, headers): cdef Writer writer cdef object key cdef object val cdef bytes ret _init_writer(&writer) for key, val in headers.items(): _safe_header(to_str(key)) _safe_header(to_str(val)) try: if _write_str(&writer, status_line) < 0: raise if _write_byte(&writer, b'\r') < 0: raise if _write_byte(&writer, b'\n') < 0: raise for key, val in headers.items(): if _write_str(&writer, to_str(key)) < 0: raise if _write_byte(&writer, b':') < 0: raise if _write_byte(&writer, b' ') < 0: raise if _write_str(&writer, to_str(val)) < 0: raise if _write_byte(&writer, b'\r') < 0: raise if _write_byte(&writer, b'\n') < 0: raise if _write_byte(&writer, b'\r') < 0: raise if _write_byte(&writer, b'\n') < 0: raise return PyBytes_FromStringAndSize(writer.buf, writer.pos) finally: _release_writer(&writer) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920315.0 aiohttp-3.8.1/aiohttp/_websocket.c0000644000175100001710000041626400000000000016511 0ustar00runnerdocker/* Generated by Cython 0.29.24 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* PY_SSIZE_T_CLEAN */ #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else #define CYTHON_ABI "0_29_24" #define CYTHON_HEX_VERSION 0x001D18F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #if PY_VERSION_HEX >= 0x02070000 #define HAVE_LONG_LONG #endif #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #elif !defined(CYTHON_USE_PYLONG_INTERNALS) #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) #endif #ifndef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) #endif #ifndef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } # else # define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; #endif #endif #else #include #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) && __cplusplus >= 201103L #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #elif __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__ ) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #define __Pyx_DefaultClassType PyType_Type #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_FAST_PYCCALL #define __Pyx_PyFastCFunction_Check(func)\ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) #else #define __Pyx_PyFastCFunction_Check(func) 0 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 #define PyMem_RawMalloc(n) PyMem_Malloc(n) #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) #define PyMem_RawFree(p) PyMem_Free(p) #endif #if CYTHON_COMPILING_IN_PYSTON #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) #else #define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #if defined(PyUnicode_IS_READY) #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #else #define __Pyx_PyUnicode_READY(op) (0) #endif #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #endif #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #if PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #else #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__aiohttp___websocket #define __PYX_HAVE_API__aiohttp___websocket /* Early includes */ #include #include #include "pythread.h" #include #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "aiohttp/_websocket.pyx", "type.pxd", "bool.pxd", "complex.pxd", }; /*--- Type declarations ---*/ /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ const char* function_name); /* PyCFunctionFastCall.proto */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); #else #define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) #endif /* PyFunctionFastCall.proto */ #if CYTHON_FAST_PYCALL #define __Pyx_PyFunction_FastCall(func, args, nargs)\ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); #else #define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) #endif #define __Pyx_BUILD_ASSERT_EXPR(cond)\ (sizeof(char [1 - 2*!(cond)]) - 1) #ifndef Py_MEMBER_SIZE #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) #endif static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" #define __Pxy_PyFrame_Initialize_Offsets()\ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) #define __Pyx_PyFrame_GetLocalsplus(frame)\ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* PyObjectCallMethO.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif /* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); /* TypeImport.proto */ #ifndef __PYX_HAVE_RT_ImportType_proto #define __PYX_HAVE_RT_ImportType_proto enum __Pyx_ImportType_CheckSize { __Pyx_ImportType_CheckSize_Error = 0, __Pyx_ImportType_CheckSize_Warn = 1, __Pyx_ImportType_CheckSize_Ignore = 2 }; static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); #endif /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* GCCDiagnostics.proto */ #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* Module declarations from 'cpython.version' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.type' */ static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; /* Module declarations from 'libc.string' */ /* Module declarations from 'libc.stdio' */ /* Module declarations from 'cpython.object' */ /* Module declarations from 'cpython.ref' */ /* Module declarations from 'cpython.exc' */ /* Module declarations from 'cpython.module' */ /* Module declarations from 'cpython.mem' */ /* Module declarations from 'cpython.tuple' */ /* Module declarations from 'cpython.list' */ /* Module declarations from 'cpython.sequence' */ /* Module declarations from 'cpython.mapping' */ /* Module declarations from 'cpython.iterator' */ /* Module declarations from 'cpython.number' */ /* Module declarations from 'cpython.int' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.bool' */ static PyTypeObject *__pyx_ptype_7cpython_4bool_bool = 0; /* Module declarations from 'cpython.long' */ /* Module declarations from 'cpython.float' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.complex' */ static PyTypeObject *__pyx_ptype_7cpython_7complex_complex = 0; /* Module declarations from 'cpython.string' */ /* Module declarations from 'cpython.unicode' */ /* Module declarations from 'cpython.dict' */ /* Module declarations from 'cpython.instance' */ /* Module declarations from 'cpython.function' */ /* Module declarations from 'cpython.method' */ /* Module declarations from 'cpython.weakref' */ /* Module declarations from 'cpython.getargs' */ /* Module declarations from 'cpython.pythread' */ /* Module declarations from 'cpython.pystate' */ /* Module declarations from 'cpython.cobject' */ /* Module declarations from 'cpython.oldbuffer' */ /* Module declarations from 'cpython.set' */ /* Module declarations from 'cpython.buffer' */ /* Module declarations from 'cpython.bytes' */ /* Module declarations from 'cpython.pycapsule' */ /* Module declarations from 'cpython' */ /* Module declarations from 'libc.stdint' */ /* Module declarations from 'aiohttp._websocket' */ #define __Pyx_MODULE_NAME "aiohttp._websocket" extern int __pyx_module_is_main_aiohttp___websocket; int __pyx_module_is_main_aiohttp___websocket = 0; /* Implementation of 'aiohttp._websocket' */ static PyObject *__pyx_builtin_range; static const char __pyx_k_i[] = "i"; static const char __pyx_k_data[] = "data"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_mask[] = "mask"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_range[] = "range"; static const char __pyx_k_in_buf[] = "in_buf"; static const char __pyx_k_data_len[] = "data_len"; static const char __pyx_k_mask_buf[] = "mask_buf"; static const char __pyx_k_uint32_msk[] = "uint32_msk"; static const char __pyx_k_uint64_msk[] = "uint64_msk"; static const char __pyx_k_aiohttp__websocket[] = "aiohttp._websocket"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_websocket_mask_cython[] = "_websocket_mask_cython"; static const char __pyx_k_aiohttp__websocket_pyx[] = "aiohttp/_websocket.pyx"; static PyObject *__pyx_n_s_aiohttp__websocket; static PyObject *__pyx_kp_s_aiohttp__websocket_pyx; static PyObject *__pyx_n_s_cline_in_traceback; static PyObject *__pyx_n_s_data; static PyObject *__pyx_n_s_data_len; static PyObject *__pyx_n_s_i; static PyObject *__pyx_n_s_in_buf; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_mask; static PyObject *__pyx_n_s_mask_buf; static PyObject *__pyx_n_s_name; static PyObject *__pyx_n_s_range; static PyObject *__pyx_n_s_test; static PyObject *__pyx_n_s_uint32_msk; static PyObject *__pyx_n_s_uint64_msk; static PyObject *__pyx_n_s_websocket_mask_cython; static PyObject *__pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_mask, PyObject *__pyx_v_data); /* proto */ static PyObject *__pyx_tuple_; static PyObject *__pyx_codeobj__2; /* Late includes */ /* "aiohttp/_websocket.pyx":11 * * * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< * """Note, this function mutates its `data` argument * """ */ /* Python wrapper */ static PyObject *__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_7aiohttp_10_websocket__websocket_mask_cython[] = "Note, this function mutates its `data` argument\n "; static PyMethodDef __pyx_mdef_7aiohttp_10_websocket_1_websocket_mask_cython = {"_websocket_mask_cython", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython, METH_VARARGS|METH_KEYWORDS, __pyx_doc_7aiohttp_10_websocket__websocket_mask_cython}; static PyObject *__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_mask = 0; PyObject *__pyx_v_data = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_websocket_mask_cython (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_mask,&__pyx_n_s_data,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mask)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_data)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_websocket_mask_cython", 1, 2, 2, 1); __PYX_ERR(0, 11, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_websocket_mask_cython") < 0)) __PYX_ERR(0, 11, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_mask = values[0]; __pyx_v_data = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("_websocket_mask_cython", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 11, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("aiohttp._websocket._websocket_mask_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(__pyx_self, __pyx_v_mask, __pyx_v_data); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_mask, PyObject *__pyx_v_data) { Py_ssize_t __pyx_v_data_len; Py_ssize_t __pyx_v_i; unsigned char *__pyx_v_in_buf; unsigned char const *__pyx_v_mask_buf; uint32_t __pyx_v_uint32_msk; uint64_t __pyx_v_uint64_msk; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations Py_ssize_t __pyx_t_1; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; char *__pyx_t_5; uint64_t *__pyx_t_6; long __pyx_t_7; uint32_t *__pyx_t_8; Py_ssize_t __pyx_t_9; Py_ssize_t __pyx_t_10; Py_ssize_t __pyx_t_11; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_websocket_mask_cython", 0); __Pyx_INCREF(__pyx_v_mask); __Pyx_INCREF(__pyx_v_data); /* "aiohttp/_websocket.pyx":22 * uint64_t uint64_msk * * assert len(mask) == 4 # <<<<<<<<<<<<<< * * if not isinstance(mask, bytes): */ #ifndef CYTHON_WITHOUT_ASSERTIONS if (unlikely(!Py_OptimizeFlag)) { __pyx_t_1 = PyObject_Length(__pyx_v_mask); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 22, __pyx_L1_error) if (unlikely(!((__pyx_t_1 == 4) != 0))) { PyErr_SetNone(PyExc_AssertionError); __PYX_ERR(0, 22, __pyx_L1_error) } } #endif /* "aiohttp/_websocket.pyx":24 * assert len(mask) == 4 * * if not isinstance(mask, bytes): # <<<<<<<<<<<<<< * mask = bytes(mask) * */ __pyx_t_2 = PyBytes_Check(__pyx_v_mask); __pyx_t_3 = ((!(__pyx_t_2 != 0)) != 0); if (__pyx_t_3) { /* "aiohttp/_websocket.pyx":25 * * if not isinstance(mask, bytes): * mask = bytes(mask) # <<<<<<<<<<<<<< * * if isinstance(data, bytearray): */ __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_mask); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 25, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF_SET(__pyx_v_mask, __pyx_t_4); __pyx_t_4 = 0; /* "aiohttp/_websocket.pyx":24 * assert len(mask) == 4 * * if not isinstance(mask, bytes): # <<<<<<<<<<<<<< * mask = bytes(mask) * */ } /* "aiohttp/_websocket.pyx":27 * mask = bytes(mask) * * if isinstance(data, bytearray): # <<<<<<<<<<<<<< * data = data * else: */ __pyx_t_3 = PyByteArray_Check(__pyx_v_data); __pyx_t_2 = (__pyx_t_3 != 0); if (__pyx_t_2) { /* "aiohttp/_websocket.pyx":28 * * if isinstance(data, bytearray): * data = data # <<<<<<<<<<<<<< * else: * data = bytearray(data) */ __pyx_t_4 = __pyx_v_data; __Pyx_INCREF(__pyx_t_4); __Pyx_DECREF_SET(__pyx_v_data, __pyx_t_4); __pyx_t_4 = 0; /* "aiohttp/_websocket.pyx":27 * mask = bytes(mask) * * if isinstance(data, bytearray): # <<<<<<<<<<<<<< * data = data * else: */ goto __pyx_L4; } /* "aiohttp/_websocket.pyx":30 * data = data * else: * data = bytearray(data) # <<<<<<<<<<<<<< * * data_len = len(data) */ /*else*/ { __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyByteArray_Type)), __pyx_v_data); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF_SET(__pyx_v_data, __pyx_t_4); __pyx_t_4 = 0; } __pyx_L4:; /* "aiohttp/_websocket.pyx":32 * data = bytearray(data) * * data_len = len(data) # <<<<<<<<<<<<<< * in_buf = PyByteArray_AsString(data) * mask_buf = PyBytes_AsString(mask) */ __pyx_t_1 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 32, __pyx_L1_error) __pyx_v_data_len = __pyx_t_1; /* "aiohttp/_websocket.pyx":33 * * data_len = len(data) * in_buf = PyByteArray_AsString(data) # <<<<<<<<<<<<<< * mask_buf = PyBytes_AsString(mask) * uint32_msk = (mask_buf)[0] */ if (!(likely(PyByteArray_CheckExact(__pyx_v_data))||((__pyx_v_data) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytearray", Py_TYPE(__pyx_v_data)->tp_name), 0))) __PYX_ERR(0, 33, __pyx_L1_error) __pyx_t_5 = PyByteArray_AsString(((PyObject*)__pyx_v_data)); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(0, 33, __pyx_L1_error) __pyx_v_in_buf = ((unsigned char *)__pyx_t_5); /* "aiohttp/_websocket.pyx":34 * data_len = len(data) * in_buf = PyByteArray_AsString(data) * mask_buf = PyBytes_AsString(mask) # <<<<<<<<<<<<<< * uint32_msk = (mask_buf)[0] * */ __pyx_t_5 = PyBytes_AsString(__pyx_v_mask); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(0, 34, __pyx_L1_error) __pyx_v_mask_buf = ((unsigned char const *)__pyx_t_5); /* "aiohttp/_websocket.pyx":35 * in_buf = PyByteArray_AsString(data) * mask_buf = PyBytes_AsString(mask) * uint32_msk = (mask_buf)[0] # <<<<<<<<<<<<<< * * # TODO: align in_data ptr to achieve even faster speeds */ __pyx_v_uint32_msk = (((uint32_t *)__pyx_v_mask_buf)[0]); /* "aiohttp/_websocket.pyx":40 * # does it need in python ?! malloc() always aligns to sizeof(long) bytes * * if sizeof(size_t) >= 8: # <<<<<<<<<<<<<< * uint64_msk = uint32_msk * uint64_msk = (uint64_msk << 32) | uint32_msk */ __pyx_t_2 = (((sizeof(size_t)) >= 8) != 0); if (__pyx_t_2) { /* "aiohttp/_websocket.pyx":41 * * if sizeof(size_t) >= 8: * uint64_msk = uint32_msk # <<<<<<<<<<<<<< * uint64_msk = (uint64_msk << 32) | uint32_msk * */ __pyx_v_uint64_msk = __pyx_v_uint32_msk; /* "aiohttp/_websocket.pyx":42 * if sizeof(size_t) >= 8: * uint64_msk = uint32_msk * uint64_msk = (uint64_msk << 32) | uint32_msk # <<<<<<<<<<<<<< * * while data_len >= 8: */ __pyx_v_uint64_msk = ((__pyx_v_uint64_msk << 32) | __pyx_v_uint32_msk); /* "aiohttp/_websocket.pyx":44 * uint64_msk = (uint64_msk << 32) | uint32_msk * * while data_len >= 8: # <<<<<<<<<<<<<< * (in_buf)[0] ^= uint64_msk * in_buf += 8 */ while (1) { __pyx_t_2 = ((__pyx_v_data_len >= 8) != 0); if (!__pyx_t_2) break; /* "aiohttp/_websocket.pyx":45 * * while data_len >= 8: * (in_buf)[0] ^= uint64_msk # <<<<<<<<<<<<<< * in_buf += 8 * data_len -= 8 */ __pyx_t_6 = ((uint64_t *)__pyx_v_in_buf); __pyx_t_7 = 0; (__pyx_t_6[__pyx_t_7]) = ((__pyx_t_6[__pyx_t_7]) ^ __pyx_v_uint64_msk); /* "aiohttp/_websocket.pyx":46 * while data_len >= 8: * (in_buf)[0] ^= uint64_msk * in_buf += 8 # <<<<<<<<<<<<<< * data_len -= 8 * */ __pyx_v_in_buf = (__pyx_v_in_buf + 8); /* "aiohttp/_websocket.pyx":47 * (in_buf)[0] ^= uint64_msk * in_buf += 8 * data_len -= 8 # <<<<<<<<<<<<<< * * */ __pyx_v_data_len = (__pyx_v_data_len - 8); } /* "aiohttp/_websocket.pyx":40 * # does it need in python ?! malloc() always aligns to sizeof(long) bytes * * if sizeof(size_t) >= 8: # <<<<<<<<<<<<<< * uint64_msk = uint32_msk * uint64_msk = (uint64_msk << 32) | uint32_msk */ } /* "aiohttp/_websocket.pyx":50 * * * while data_len >= 4: # <<<<<<<<<<<<<< * (in_buf)[0] ^= uint32_msk * in_buf += 4 */ while (1) { __pyx_t_2 = ((__pyx_v_data_len >= 4) != 0); if (!__pyx_t_2) break; /* "aiohttp/_websocket.pyx":51 * * while data_len >= 4: * (in_buf)[0] ^= uint32_msk # <<<<<<<<<<<<<< * in_buf += 4 * data_len -= 4 */ __pyx_t_8 = ((uint32_t *)__pyx_v_in_buf); __pyx_t_7 = 0; (__pyx_t_8[__pyx_t_7]) = ((__pyx_t_8[__pyx_t_7]) ^ __pyx_v_uint32_msk); /* "aiohttp/_websocket.pyx":52 * while data_len >= 4: * (in_buf)[0] ^= uint32_msk * in_buf += 4 # <<<<<<<<<<<<<< * data_len -= 4 * */ __pyx_v_in_buf = (__pyx_v_in_buf + 4); /* "aiohttp/_websocket.pyx":53 * (in_buf)[0] ^= uint32_msk * in_buf += 4 * data_len -= 4 # <<<<<<<<<<<<<< * * for i in range(0, data_len): */ __pyx_v_data_len = (__pyx_v_data_len - 4); } /* "aiohttp/_websocket.pyx":55 * data_len -= 4 * * for i in range(0, data_len): # <<<<<<<<<<<<<< * in_buf[i] ^= mask_buf[i] */ __pyx_t_1 = __pyx_v_data_len; __pyx_t_9 = __pyx_t_1; for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { __pyx_v_i = __pyx_t_10; /* "aiohttp/_websocket.pyx":56 * * for i in range(0, data_len): * in_buf[i] ^= mask_buf[i] # <<<<<<<<<<<<<< */ __pyx_t_11 = __pyx_v_i; (__pyx_v_in_buf[__pyx_t_11]) = ((__pyx_v_in_buf[__pyx_t_11]) ^ (__pyx_v_mask_buf[__pyx_v_i])); } /* "aiohttp/_websocket.pyx":11 * * * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< * """Note, this function mutates its `data` argument * """ */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("aiohttp._websocket._websocket_mask_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_mask); __Pyx_XDECREF(__pyx_v_data); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec__websocket(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec__websocket}, {0, NULL} }; #endif static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, "_websocket", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_aiohttp__websocket, __pyx_k_aiohttp__websocket, sizeof(__pyx_k_aiohttp__websocket), 0, 0, 1, 1}, {&__pyx_kp_s_aiohttp__websocket_pyx, __pyx_k_aiohttp__websocket_pyx, sizeof(__pyx_k_aiohttp__websocket_pyx), 0, 0, 1, 0}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, {&__pyx_n_s_data_len, __pyx_k_data_len, sizeof(__pyx_k_data_len), 0, 0, 1, 1}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_in_buf, __pyx_k_in_buf, sizeof(__pyx_k_in_buf), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_mask, __pyx_k_mask, sizeof(__pyx_k_mask), 0, 0, 1, 1}, {&__pyx_n_s_mask_buf, __pyx_k_mask_buf, sizeof(__pyx_k_mask_buf), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_uint32_msk, __pyx_k_uint32_msk, sizeof(__pyx_k_uint32_msk), 0, 0, 1, 1}, {&__pyx_n_s_uint64_msk, __pyx_k_uint64_msk, sizeof(__pyx_k_uint64_msk), 0, 0, 1, 1}, {&__pyx_n_s_websocket_mask_cython, __pyx_k_websocket_mask_cython, sizeof(__pyx_k_websocket_mask_cython), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 55, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "aiohttp/_websocket.pyx":11 * * * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< * """Note, this function mutates its `data` argument * """ */ __pyx_tuple_ = PyTuple_Pack(8, __pyx_n_s_mask, __pyx_n_s_data, __pyx_n_s_data_len, __pyx_n_s_i, __pyx_n_s_in_buf, __pyx_n_s_mask_buf, __pyx_n_s_uint32_msk, __pyx_n_s_uint64_msk); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 11, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(2, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__websocket_pyx, __pyx_n_s_websocket_mask_cython, 11, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) __PYX_ERR(0, 11, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); return 0; __pyx_L1_error:; return -1; } static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 sizeof(PyTypeObject), #else sizeof(PyHeapTypeObject), #endif __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(1, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(2, 8, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(3, 15, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC init_websocket(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC init_websocket(void) #else __Pyx_PyMODINIT_FUNC PyInit__websocket(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit__websocket(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { result = PyDict_SetItemString(moddict, to_name, value); } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec__websocket(PyObject *__pyx_pyinit_module) #endif #endif { PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module '_websocket' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__websocket(void)", 0); if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS PyEval_InitThreads(); #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_websocket", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_b); __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_cython_runtime); if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_aiohttp___websocket) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "aiohttp._websocket")) { if (unlikely(PyDict_SetItemString(modules, "aiohttp._websocket", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); (void)__Pyx_modinit_type_init_code(); if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "aiohttp/_websocket.pyx":11 * * * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< * """Note, this function mutates its `data` argument * """ */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_10_websocket_1_websocket_mask_cython, NULL, __pyx_n_s_aiohttp__websocket); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_websocket_mask_cython, __pyx_t_1) < 0) __PYX_ERR(0, 11, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "aiohttp/_websocket.pyx":1 * from cpython cimport PyBytes_AsString # <<<<<<<<<<<<<< * * */ __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init aiohttp._websocket", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_CLEAR(__pyx_m); } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init aiohttp._websocket"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* RaiseArgTupleInvalid */ static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } /* RaiseDoubleKeywords */ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } /* PyCFunctionFastCall */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { PyCFunctionObject *func = (PyCFunctionObject*)func_obj; PyCFunction meth = PyCFunction_GET_FUNCTION(func); PyObject *self = PyCFunction_GET_SELF(func); int flags = PyCFunction_GET_FLAGS(func); assert(PyCFunction_Check(func)); assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); assert(nargs >= 0); assert(nargs == 0 || args != NULL); /* _PyCFunction_FastCallDict() must not be called with an exception set, because it may clear it (directly or indirectly) and so the caller loses its exception */ assert(!PyErr_Occurred()); if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); } else { return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); } } #endif /* PyFunctionFastCall */ #if CYTHON_FAST_PYCALL static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, PyObject *globals) { PyFrameObject *f; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject **fastlocals; Py_ssize_t i; PyObject *result; assert(globals != NULL); /* XXX Perhaps we should create a specialized PyFrame_New() that doesn't take locals, but does take builtins without sanity checking them. */ assert(tstate != NULL); f = PyFrame_New(tstate, co, globals, NULL); if (f == NULL) { return NULL; } fastlocals = __Pyx_PyFrame_GetLocalsplus(f); for (i = 0; i < na; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } result = PyEval_EvalFrameEx(f,0); ++tstate->recursion_depth; Py_DECREF(f); --tstate->recursion_depth; return result; } #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *closure; #if PY_MAJOR_VERSION >= 3 PyObject *kwdefs; #endif PyObject *kwtuple, **k; PyObject **d; Py_ssize_t nd; Py_ssize_t nk; PyObject *result; assert(kwargs == NULL || PyDict_Check(kwargs)); nk = kwargs ? PyDict_Size(kwargs) : 0; if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { return NULL; } if ( #if PY_MAJOR_VERSION >= 3 co->co_kwonlyargcount == 0 && #endif likely(kwargs == NULL || nk == 0) && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); goto done; } else if (nargs == 0 && argdefs != NULL && co->co_argcount == Py_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = &PyTuple_GET_ITEM(argdefs, 0); result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); goto done; } } if (kwargs != NULL) { Py_ssize_t pos, i; kwtuple = PyTuple_New(2 * nk); if (kwtuple == NULL) { result = NULL; goto done; } k = &PyTuple_GET_ITEM(kwtuple, 0); pos = i = 0; while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { Py_INCREF(k[i]); Py_INCREF(k[i+1]); i += 2; } nk = i / 2; } else { kwtuple = NULL; k = NULL; } closure = PyFunction_GET_CLOSURE(func); #if PY_MAJOR_VERSION >= 3 kwdefs = PyFunction_GET_KW_DEFAULTS(func); #endif if (argdefs != NULL) { d = &PyTuple_GET_ITEM(argdefs, 0); nd = Py_SIZE(argdefs); } else { d = NULL; nd = 0; } #if PY_MAJOR_VERSION >= 3 result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, kwdefs, closure); #else result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, closure); #endif Py_XDECREF(kwtuple); done: Py_LeaveRecursiveCall(); return result; } #endif #endif /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = Py_TYPE(func)->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallMethO */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { PyObject *self, *result; PyCFunction cfunc; cfunc = PyCFunction_GET_FUNCTION(func); self = PyCFunction_GET_SELF(func); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = cfunc(self, arg); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallOneArg */ #if CYTHON_COMPILING_IN_CPYTHON static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_New(1); if (unlikely(!args)) return NULL; Py_INCREF(arg); PyTuple_SET_ITEM(args, 0, arg); result = __Pyx_PyObject_Call(func, args, NULL); Py_DECREF(args); return result; } static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCall(func, &arg, 1); } #endif if (likely(PyCFunction_Check(func))) { if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { return __Pyx_PyObject_CallMethO(func, arg); #if CYTHON_FAST_PYCCALL } else if (__Pyx_PyFastCFunction_Check(func)) { return __Pyx_PyCFunction_FastCall(func, &arg, 1); #endif } } return __Pyx__PyObject_CallOneArg(func, arg); } #else static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_Pack(1, arg); if (unlikely(!args)) return NULL; result = __Pyx_PyObject_Call(func, args, NULL); Py_DECREF(args); return result; } #endif /* TypeImport */ #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size) { PyObject *result = 0; char warning[200]; Py_ssize_t basicsize; #ifdef Py_LIMITED_API PyObject *py_basicsize; #endif result = PyObject_GetAttrString(module, class_name); if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%.200s.%.200s is not a type object", module_name, class_name); goto bad; } #ifndef Py_LIMITED_API basicsize = ((PyTypeObject *)result)->tp_basicsize; #else py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); if (!py_basicsize) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; #endif if ((size_t)basicsize < size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); goto bad; } else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", module_name, class_name, size, basicsize); if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(result); return NULL; } #endif /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #endif /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) case -2: if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) case -2: if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = a->tp_base; if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; if (!res) { res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } return res; } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; ip) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", type_name, type_name, Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)b)->ob_digit; const Py_ssize_t size = Py_SIZE(b); if (likely(__Pyx_sst_abs(size) <= 1)) { ival = likely(size) ? digits[0] : 0; if (size == -1) ival = -ival; return ival; } else { switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/_websocket.pyx0000644000175100001710000000303100000000000017067 0ustar00runnerdockerfrom cpython cimport PyBytes_AsString #from cpython cimport PyByteArray_AsString # cython still not exports that cdef extern from "Python.h": char* PyByteArray_AsString(bytearray ba) except NULL from libc.stdint cimport uint32_t, uint64_t, uintmax_t def _websocket_mask_cython(object mask, object data): """Note, this function mutates its `data` argument """ cdef: Py_ssize_t data_len, i # bit operations on signed integers are implementation-specific unsigned char * in_buf const unsigned char * mask_buf uint32_t uint32_msk uint64_t uint64_msk assert len(mask) == 4 if not isinstance(mask, bytes): mask = bytes(mask) if isinstance(data, bytearray): data = data else: data = bytearray(data) data_len = len(data) in_buf = PyByteArray_AsString(data) mask_buf = PyBytes_AsString(mask) uint32_msk = (mask_buf)[0] # TODO: align in_data ptr to achieve even faster speeds # does it need in python ?! malloc() always aligns to sizeof(long) bytes if sizeof(size_t) >= 8: uint64_msk = uint32_msk uint64_msk = (uint64_msk << 32) | uint32_msk while data_len >= 8: (in_buf)[0] ^= uint64_msk in_buf += 8 data_len -= 8 while data_len >= 4: (in_buf)[0] ^= uint32_msk in_buf += 4 data_len -= 4 for i in range(0, data_len): in_buf[i] ^= mask_buf[i] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/abc.py0000644000175100001710000001261100000000000015303 0ustar00runnerdockerimport asyncio import logging from abc import ABC, abstractmethod from collections.abc import Sized from http.cookies import BaseCookie, Morsel from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, Dict, Generator, Iterable, List, Optional, Tuple, ) from multidict import CIMultiDict from yarl import URL from .helpers import get_running_loop from .typedefs import LooseCookies if TYPE_CHECKING: # pragma: no cover from .web_app import Application from .web_exceptions import HTTPException from .web_request import BaseRequest, Request from .web_response import StreamResponse else: BaseRequest = Request = Application = StreamResponse = None HTTPException = None class AbstractRouter(ABC): def __init__(self) -> None: self._frozen = False def post_init(self, app: Application) -> None: """Post init stage. Not an abstract method for sake of backward compatibility, but if the router wants to be aware of the application it can override this. """ @property def frozen(self) -> bool: return self._frozen def freeze(self) -> None: """Freeze router.""" self._frozen = True @abstractmethod async def resolve(self, request: Request) -> "AbstractMatchInfo": """Return MATCH_INFO for given request""" class AbstractMatchInfo(ABC): @property # pragma: no branch @abstractmethod def handler(self) -> Callable[[Request], Awaitable[StreamResponse]]: """Execute matched request handler""" @property @abstractmethod def expect_handler(self) -> Callable[[Request], Awaitable[None]]: """Expect handler for 100-continue processing""" @property # pragma: no branch @abstractmethod def http_exception(self) -> Optional[HTTPException]: """HTTPException instance raised on router's resolving, or None""" @abstractmethod # pragma: no branch def get_info(self) -> Dict[str, Any]: """Return a dict with additional info useful for introspection""" @property # pragma: no branch @abstractmethod def apps(self) -> Tuple[Application, ...]: """Stack of nested applications. Top level application is left-most element. """ @abstractmethod def add_app(self, app: Application) -> None: """Add application to the nested apps stack.""" @abstractmethod def freeze(self) -> None: """Freeze the match info. The method is called after route resolution. After the call .add_app() is forbidden. """ class AbstractView(ABC): """Abstract class based view.""" def __init__(self, request: Request) -> None: self._request = request @property def request(self) -> Request: """Request instance.""" return self._request @abstractmethod def __await__(self) -> Generator[Any, None, StreamResponse]: """Execute the view handler.""" class AbstractResolver(ABC): """Abstract DNS resolver.""" @abstractmethod async def resolve(self, host: str, port: int, family: int) -> List[Dict[str, Any]]: """Return IP address for given hostname""" @abstractmethod async def close(self) -> None: """Release resolver""" if TYPE_CHECKING: # pragma: no cover IterableBase = Iterable[Morsel[str]] else: IterableBase = Iterable ClearCookiePredicate = Callable[["Morsel[str]"], bool] class AbstractCookieJar(Sized, IterableBase): """Abstract Cookie Jar.""" def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: self._loop = get_running_loop(loop) @abstractmethod def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: """Clear all cookies if no predicate is passed.""" @abstractmethod def clear_domain(self, domain: str) -> None: """Clear all cookies for domain and all subdomains.""" @abstractmethod def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: """Update cookies.""" @abstractmethod def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": """Return the jar's cookies filtered by their attributes.""" class AbstractStreamWriter(ABC): """Abstract stream writer.""" buffer_size = 0 output_size = 0 length = 0 # type: Optional[int] @abstractmethod async def write(self, chunk: bytes) -> None: """Write chunk into stream.""" @abstractmethod async def write_eof(self, chunk: bytes = b"") -> None: """Write last chunk.""" @abstractmethod async def drain(self) -> None: """Flush the write buffer.""" @abstractmethod def enable_compression(self, encoding: str = "deflate") -> None: """Enable HTTP body compression""" @abstractmethod def enable_chunking(self) -> None: """Enable HTTP chunked mode""" @abstractmethod async def write_headers( self, status_line: str, headers: "CIMultiDict[str]" ) -> None: """Write HTTP headers""" class AbstractAccessLogger(ABC): """Abstract writer to access log.""" def __init__(self, logger: logging.Logger, log_format: str) -> None: self.logger = logger self.log_format = log_format @abstractmethod def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: """Emit log to logger.""" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/base_protocol.py0000644000175100001710000000521400000000000017412 0ustar00runnerdockerimport asyncio from typing import Optional, cast from .tcp_helpers import tcp_nodelay class BaseProtocol(asyncio.Protocol): __slots__ = ( "_loop", "_paused", "_drain_waiter", "_connection_lost", "_reading_paused", "transport", ) def __init__(self, loop: asyncio.AbstractEventLoop) -> None: self._loop = loop # type: asyncio.AbstractEventLoop self._paused = False self._drain_waiter = None # type: Optional[asyncio.Future[None]] self._connection_lost = False self._reading_paused = False self.transport = None # type: Optional[asyncio.Transport] def pause_writing(self) -> None: assert not self._paused self._paused = True def resume_writing(self) -> None: assert self._paused self._paused = False waiter = self._drain_waiter if waiter is not None: self._drain_waiter = None if not waiter.done(): waiter.set_result(None) def pause_reading(self) -> None: if not self._reading_paused and self.transport is not None: try: self.transport.pause_reading() except (AttributeError, NotImplementedError, RuntimeError): pass self._reading_paused = True def resume_reading(self) -> None: if self._reading_paused and self.transport is not None: try: self.transport.resume_reading() except (AttributeError, NotImplementedError, RuntimeError): pass self._reading_paused = False def connection_made(self, transport: asyncio.BaseTransport) -> None: tr = cast(asyncio.Transport, transport) tcp_nodelay(tr, True) self.transport = tr def connection_lost(self, exc: Optional[BaseException]) -> None: self._connection_lost = True # Wake up the writer if currently paused. self.transport = None if not self._paused: return waiter = self._drain_waiter if waiter is None: return self._drain_waiter = None if waiter.done(): return if exc is None: waiter.set_result(None) else: waiter.set_exception(exc) async def _drain_helper(self) -> None: if self._connection_lost: raise ConnectionResetError("Connection lost") if not self._paused: return waiter = self._drain_waiter if waiter is None: waiter = self._loop.create_future() self._drain_waiter = waiter await asyncio.shield(waiter) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/client.py0000644000175100001710000012757600000000000016055 0ustar00runnerdocker"""HTTP Client for asyncio.""" import asyncio import base64 import hashlib import json import os import sys import traceback import warnings from contextlib import suppress from types import SimpleNamespace, TracebackType from typing import ( Any, Awaitable, Callable, Coroutine, FrozenSet, Generator, Generic, Iterable, List, Mapping, Optional, Set, Tuple, Type, TypeVar, Union, ) import attr from multidict import CIMultiDict, MultiDict, MultiDictProxy, istr from yarl import URL from . import hdrs, http, payload from .abc import AbstractCookieJar from .client_exceptions import ( ClientConnectionError as ClientConnectionError, ClientConnectorCertificateError as ClientConnectorCertificateError, ClientConnectorError as ClientConnectorError, ClientConnectorSSLError as ClientConnectorSSLError, ClientError as ClientError, ClientHttpProxyError as ClientHttpProxyError, ClientOSError as ClientOSError, ClientPayloadError as ClientPayloadError, ClientProxyConnectionError as ClientProxyConnectionError, ClientResponseError as ClientResponseError, ClientSSLError as ClientSSLError, ContentTypeError as ContentTypeError, InvalidURL as InvalidURL, ServerConnectionError as ServerConnectionError, ServerDisconnectedError as ServerDisconnectedError, ServerFingerprintMismatch as ServerFingerprintMismatch, ServerTimeoutError as ServerTimeoutError, TooManyRedirects as TooManyRedirects, WSServerHandshakeError as WSServerHandshakeError, ) from .client_reqrep import ( ClientRequest as ClientRequest, ClientResponse as ClientResponse, Fingerprint as Fingerprint, RequestInfo as RequestInfo, _merge_ssl_params, ) from .client_ws import ClientWebSocketResponse as ClientWebSocketResponse from .connector import ( BaseConnector as BaseConnector, NamedPipeConnector as NamedPipeConnector, TCPConnector as TCPConnector, UnixConnector as UnixConnector, ) from .cookiejar import CookieJar from .helpers import ( DEBUG, PY_36, BasicAuth, TimeoutHandle, ceil_timeout, get_env_proxy_for_url, get_running_loop, sentinel, strip_auth_from_url, ) from .http import WS_KEY, HttpVersion, WebSocketReader, WebSocketWriter from .http_websocket import WSHandshakeError, WSMessage, ws_ext_gen, ws_ext_parse from .streams import FlowControlDataQueue from .tracing import Trace, TraceConfig from .typedefs import Final, JSONEncoder, LooseCookies, LooseHeaders, StrOrURL __all__ = ( # client_exceptions "ClientConnectionError", "ClientConnectorCertificateError", "ClientConnectorError", "ClientConnectorSSLError", "ClientError", "ClientHttpProxyError", "ClientOSError", "ClientPayloadError", "ClientProxyConnectionError", "ClientResponseError", "ClientSSLError", "ContentTypeError", "InvalidURL", "ServerConnectionError", "ServerDisconnectedError", "ServerFingerprintMismatch", "ServerTimeoutError", "TooManyRedirects", "WSServerHandshakeError", # client_reqrep "ClientRequest", "ClientResponse", "Fingerprint", "RequestInfo", # connector "BaseConnector", "TCPConnector", "UnixConnector", "NamedPipeConnector", # client_ws "ClientWebSocketResponse", # client "ClientSession", "ClientTimeout", "request", ) try: from ssl import SSLContext except ImportError: # pragma: no cover SSLContext = object # type: ignore[misc,assignment] @attr.s(auto_attribs=True, frozen=True, slots=True) class ClientTimeout: total: Optional[float] = None connect: Optional[float] = None sock_read: Optional[float] = None sock_connect: Optional[float] = None # pool_queue_timeout: Optional[float] = None # dns_resolution_timeout: Optional[float] = None # socket_connect_timeout: Optional[float] = None # connection_acquiring_timeout: Optional[float] = None # new_connection_timeout: Optional[float] = None # http_header_timeout: Optional[float] = None # response_body_timeout: Optional[float] = None # to create a timeout specific for a single request, either # - create a completely new one to overwrite the default # - or use http://www.attrs.org/en/stable/api.html#attr.evolve # to overwrite the defaults # 5 Minute default read timeout DEFAULT_TIMEOUT: Final[ClientTimeout] = ClientTimeout(total=5 * 60) _RetType = TypeVar("_RetType") class ClientSession: """First-class interface for making HTTP requests.""" ATTRS = frozenset( [ "_base_url", "_source_traceback", "_connector", "requote_redirect_url", "_loop", "_cookie_jar", "_connector_owner", "_default_auth", "_version", "_json_serialize", "_requote_redirect_url", "_timeout", "_raise_for_status", "_auto_decompress", "_trust_env", "_default_headers", "_skip_auto_headers", "_request_class", "_response_class", "_ws_response_class", "_trace_configs", "_read_bufsize", ] ) _source_traceback = None def __init__( self, base_url: Optional[StrOrURL] = None, *, connector: Optional[BaseConnector] = None, loop: Optional[asyncio.AbstractEventLoop] = None, cookies: Optional[LooseCookies] = None, headers: Optional[LooseHeaders] = None, skip_auto_headers: Optional[Iterable[str]] = None, auth: Optional[BasicAuth] = None, json_serialize: JSONEncoder = json.dumps, request_class: Type[ClientRequest] = ClientRequest, response_class: Type[ClientResponse] = ClientResponse, ws_response_class: Type[ClientWebSocketResponse] = ClientWebSocketResponse, version: HttpVersion = http.HttpVersion11, cookie_jar: Optional[AbstractCookieJar] = None, connector_owner: bool = True, raise_for_status: bool = False, read_timeout: Union[float, object] = sentinel, conn_timeout: Optional[float] = None, timeout: Union[object, ClientTimeout] = sentinel, auto_decompress: bool = True, trust_env: bool = False, requote_redirect_url: bool = True, trace_configs: Optional[List[TraceConfig]] = None, read_bufsize: int = 2 ** 16, ) -> None: if loop is None: if connector is not None: loop = connector._loop loop = get_running_loop(loop) if base_url is None or isinstance(base_url, URL): self._base_url: Optional[URL] = base_url else: self._base_url = URL(base_url) assert ( self._base_url.origin() == self._base_url ), "Only absolute URLs without path part are supported" if connector is None: connector = TCPConnector(loop=loop) if connector._loop is not loop: raise RuntimeError("Session and connector has to use same event loop") self._loop = loop if loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1)) if cookie_jar is None: cookie_jar = CookieJar(loop=loop) self._cookie_jar = cookie_jar if cookies is not None: self._cookie_jar.update_cookies(cookies) self._connector = connector # type: Optional[BaseConnector] self._connector_owner = connector_owner self._default_auth = auth self._version = version self._json_serialize = json_serialize if timeout is sentinel: self._timeout = DEFAULT_TIMEOUT if read_timeout is not sentinel: warnings.warn( "read_timeout is deprecated, " "use timeout argument instead", DeprecationWarning, stacklevel=2, ) self._timeout = attr.evolve(self._timeout, total=read_timeout) if conn_timeout is not None: self._timeout = attr.evolve(self._timeout, connect=conn_timeout) warnings.warn( "conn_timeout is deprecated, " "use timeout argument instead", DeprecationWarning, stacklevel=2, ) else: self._timeout = timeout # type: ignore[assignment] if read_timeout is not sentinel: raise ValueError( "read_timeout and timeout parameters " "conflict, please setup " "timeout.read" ) if conn_timeout is not None: raise ValueError( "conn_timeout and timeout parameters " "conflict, please setup " "timeout.connect" ) self._raise_for_status = raise_for_status self._auto_decompress = auto_decompress self._trust_env = trust_env self._requote_redirect_url = requote_redirect_url self._read_bufsize = read_bufsize # Convert to list of tuples if headers: real_headers = CIMultiDict(headers) # type: CIMultiDict[str] else: real_headers = CIMultiDict() self._default_headers = real_headers # type: CIMultiDict[str] if skip_auto_headers is not None: self._skip_auto_headers = frozenset(istr(i) for i in skip_auto_headers) else: self._skip_auto_headers = frozenset() self._request_class = request_class self._response_class = response_class self._ws_response_class = ws_response_class self._trace_configs = trace_configs or [] for trace_config in self._trace_configs: trace_config.freeze() def __init_subclass__(cls: Type["ClientSession"]) -> None: warnings.warn( "Inheritance class {} from ClientSession " "is discouraged".format(cls.__name__), DeprecationWarning, stacklevel=2, ) if DEBUG: def __setattr__(self, name: str, val: Any) -> None: if name not in self.ATTRS: warnings.warn( "Setting custom ClientSession.{} attribute " "is discouraged".format(name), DeprecationWarning, stacklevel=2, ) super().__setattr__(name, val) def __del__(self, _warnings: Any = warnings) -> None: if not self.closed: if PY_36: kwargs = {"source": self} else: kwargs = {} _warnings.warn( f"Unclosed client session {self!r}", ResourceWarning, **kwargs ) context = {"client_session": self, "message": "Unclosed client session"} if self._source_traceback is not None: context["source_traceback"] = self._source_traceback self._loop.call_exception_handler(context) def request( self, method: str, url: StrOrURL, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP request.""" return _RequestContextManager(self._request(method, url, **kwargs)) def _build_url(self, str_or_url: StrOrURL) -> URL: url = URL(str_or_url) if self._base_url is None: return url else: assert not url.is_absolute() and url.path.startswith("/") return self._base_url.join(url) async def _request( self, method: str, str_or_url: StrOrURL, *, params: Optional[Mapping[str, str]] = None, data: Any = None, json: Any = None, cookies: Optional[LooseCookies] = None, headers: Optional[LooseHeaders] = None, skip_auto_headers: Optional[Iterable[str]] = None, auth: Optional[BasicAuth] = None, allow_redirects: bool = True, max_redirects: int = 10, compress: Optional[str] = None, chunked: Optional[bool] = None, expect100: bool = False, raise_for_status: Optional[bool] = None, read_until_eof: bool = True, proxy: Optional[StrOrURL] = None, proxy_auth: Optional[BasicAuth] = None, timeout: Union[ClientTimeout, object] = sentinel, verify_ssl: Optional[bool] = None, fingerprint: Optional[bytes] = None, ssl_context: Optional[SSLContext] = None, ssl: Optional[Union[SSLContext, bool, Fingerprint]] = None, proxy_headers: Optional[LooseHeaders] = None, trace_request_ctx: Optional[SimpleNamespace] = None, read_bufsize: Optional[int] = None, ) -> ClientResponse: # NOTE: timeout clamps existing connect and read timeouts. We cannot # set the default to None because we need to detect if the user wants # to use the existing timeouts by setting timeout to None. if self.closed: raise RuntimeError("Session is closed") ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) if data is not None and json is not None: raise ValueError( "data and json parameters can not be used at the same time" ) elif json is not None: data = payload.JsonPayload(json, dumps=self._json_serialize) if not isinstance(chunked, bool) and chunked is not None: warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) redirects = 0 history = [] version = self._version # Merge with default headers and transform to CIMultiDict headers = self._prepare_headers(headers) proxy_headers = self._prepare_headers(proxy_headers) try: url = self._build_url(str_or_url) except ValueError as e: raise InvalidURL(str_or_url) from e skip_headers = set(self._skip_auto_headers) if skip_auto_headers is not None: for i in skip_auto_headers: skip_headers.add(istr(i)) if proxy is not None: try: proxy = URL(proxy) except ValueError as e: raise InvalidURL(proxy) from e if timeout is sentinel: real_timeout = self._timeout # type: ClientTimeout else: if not isinstance(timeout, ClientTimeout): real_timeout = ClientTimeout(total=timeout) # type: ignore[arg-type] else: real_timeout = timeout # timeout is cumulative for all request operations # (request, redirects, responses, data consuming) tm = TimeoutHandle(self._loop, real_timeout.total) handle = tm.start() if read_bufsize is None: read_bufsize = self._read_bufsize traces = [ Trace( self, trace_config, trace_config.trace_config_ctx(trace_request_ctx=trace_request_ctx), ) for trace_config in self._trace_configs ] for trace in traces: await trace.send_request_start(method, url.update_query(params), headers) timer = tm.timer() try: with timer: while True: url, auth_from_url = strip_auth_from_url(url) if auth and auth_from_url: raise ValueError( "Cannot combine AUTH argument with " "credentials encoded in URL" ) if auth is None: auth = auth_from_url if auth is None: auth = self._default_auth # It would be confusing if we support explicit # Authorization header with auth argument if ( headers is not None and auth is not None and hdrs.AUTHORIZATION in headers ): raise ValueError( "Cannot combine AUTHORIZATION header " "with AUTH argument or credentials " "encoded in URL" ) all_cookies = self._cookie_jar.filter_cookies(url) if cookies is not None: tmp_cookie_jar = CookieJar() tmp_cookie_jar.update_cookies(cookies) req_cookies = tmp_cookie_jar.filter_cookies(url) if req_cookies: all_cookies.load(req_cookies) if proxy is not None: proxy = URL(proxy) elif self._trust_env: with suppress(LookupError): proxy, proxy_auth = get_env_proxy_for_url(url) req = self._request_class( method, url, params=params, headers=headers, skip_auto_headers=skip_headers, data=data, cookies=all_cookies, auth=auth, version=version, compress=compress, chunked=chunked, expect100=expect100, loop=self._loop, response_class=self._response_class, proxy=proxy, proxy_auth=proxy_auth, timer=timer, session=self, ssl=ssl, proxy_headers=proxy_headers, traces=traces, ) # connection timeout try: async with ceil_timeout(real_timeout.connect): assert self._connector is not None conn = await self._connector.connect( req, traces=traces, timeout=real_timeout ) except asyncio.TimeoutError as exc: raise ServerTimeoutError( "Connection timeout " "to host {}".format(url) ) from exc assert conn.transport is not None assert conn.protocol is not None conn.protocol.set_response_params( timer=timer, skip_payload=method.upper() == "HEAD", read_until_eof=read_until_eof, auto_decompress=self._auto_decompress, read_timeout=real_timeout.sock_read, read_bufsize=read_bufsize, ) try: try: resp = await req.send(conn) try: await resp.start(conn) except BaseException: resp.close() raise except BaseException: conn.close() raise except ClientError: raise except OSError as exc: raise ClientOSError(*exc.args) from exc self._cookie_jar.update_cookies(resp.cookies, resp.url) # redirects if resp.status in (301, 302, 303, 307, 308) and allow_redirects: for trace in traces: await trace.send_request_redirect( method, url.update_query(params), headers, resp ) redirects += 1 history.append(resp) if max_redirects and redirects >= max_redirects: resp.close() raise TooManyRedirects( history[0].request_info, tuple(history) ) # For 301 and 302, mimic IE, now changed in RFC # https://github.com/kennethreitz/requests/pull/269 if (resp.status == 303 and resp.method != hdrs.METH_HEAD) or ( resp.status in (301, 302) and resp.method == hdrs.METH_POST ): method = hdrs.METH_GET data = None if headers.get(hdrs.CONTENT_LENGTH): headers.pop(hdrs.CONTENT_LENGTH) r_url = resp.headers.get(hdrs.LOCATION) or resp.headers.get( hdrs.URI ) if r_url is None: # see github.com/aio-libs/aiohttp/issues/2022 break else: # reading from correct redirection # response is forbidden resp.release() try: parsed_url = URL( r_url, encoded=not self._requote_redirect_url ) except ValueError as e: raise InvalidURL(r_url) from e scheme = parsed_url.scheme if scheme not in ("http", "https", ""): resp.close() raise ValueError("Can redirect only to http or https") elif not scheme: parsed_url = url.join(parsed_url) if url.origin() != parsed_url.origin(): auth = None headers.pop(hdrs.AUTHORIZATION, None) url = parsed_url params = None resp.release() continue break # check response status if raise_for_status is None: raise_for_status = self._raise_for_status if raise_for_status: resp.raise_for_status() # register connection if handle is not None: if resp.connection is not None: resp.connection.add_callback(handle.cancel) else: handle.cancel() resp._history = tuple(history) for trace in traces: await trace.send_request_end( method, url.update_query(params), headers, resp ) return resp except BaseException as e: # cleanup timer tm.close() if handle: handle.cancel() handle = None for trace in traces: await trace.send_request_exception( method, url.update_query(params), headers, e ) raise def ws_connect( self, url: StrOrURL, *, method: str = hdrs.METH_GET, protocols: Iterable[str] = (), timeout: float = 10.0, receive_timeout: Optional[float] = None, autoclose: bool = True, autoping: bool = True, heartbeat: Optional[float] = None, auth: Optional[BasicAuth] = None, origin: Optional[str] = None, params: Optional[Mapping[str, str]] = None, headers: Optional[LooseHeaders] = None, proxy: Optional[StrOrURL] = None, proxy_auth: Optional[BasicAuth] = None, ssl: Union[SSLContext, bool, None, Fingerprint] = None, verify_ssl: Optional[bool] = None, fingerprint: Optional[bytes] = None, ssl_context: Optional[SSLContext] = None, proxy_headers: Optional[LooseHeaders] = None, compress: int = 0, max_msg_size: int = 4 * 1024 * 1024, ) -> "_WSRequestContextManager": """Initiate websocket connection.""" return _WSRequestContextManager( self._ws_connect( url, method=method, protocols=protocols, timeout=timeout, receive_timeout=receive_timeout, autoclose=autoclose, autoping=autoping, heartbeat=heartbeat, auth=auth, origin=origin, params=params, headers=headers, proxy=proxy, proxy_auth=proxy_auth, ssl=ssl, verify_ssl=verify_ssl, fingerprint=fingerprint, ssl_context=ssl_context, proxy_headers=proxy_headers, compress=compress, max_msg_size=max_msg_size, ) ) async def _ws_connect( self, url: StrOrURL, *, method: str = hdrs.METH_GET, protocols: Iterable[str] = (), timeout: float = 10.0, receive_timeout: Optional[float] = None, autoclose: bool = True, autoping: bool = True, heartbeat: Optional[float] = None, auth: Optional[BasicAuth] = None, origin: Optional[str] = None, params: Optional[Mapping[str, str]] = None, headers: Optional[LooseHeaders] = None, proxy: Optional[StrOrURL] = None, proxy_auth: Optional[BasicAuth] = None, ssl: Union[SSLContext, bool, None, Fingerprint] = None, verify_ssl: Optional[bool] = None, fingerprint: Optional[bytes] = None, ssl_context: Optional[SSLContext] = None, proxy_headers: Optional[LooseHeaders] = None, compress: int = 0, max_msg_size: int = 4 * 1024 * 1024, ) -> ClientWebSocketResponse: if headers is None: real_headers = CIMultiDict() # type: CIMultiDict[str] else: real_headers = CIMultiDict(headers) default_headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_VERSION: "13", } for key, value in default_headers.items(): real_headers.setdefault(key, value) sec_key = base64.b64encode(os.urandom(16)) real_headers[hdrs.SEC_WEBSOCKET_KEY] = sec_key.decode() if protocols: real_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = ",".join(protocols) if origin is not None: real_headers[hdrs.ORIGIN] = origin if compress: extstr = ws_ext_gen(compress=compress) real_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = extstr ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) # send request resp = await self.request( method, url, params=params, headers=real_headers, read_until_eof=False, auth=auth, proxy=proxy, proxy_auth=proxy_auth, ssl=ssl, proxy_headers=proxy_headers, ) try: # check handshake if resp.status != 101: raise WSServerHandshakeError( resp.request_info, resp.history, message="Invalid response status", status=resp.status, headers=resp.headers, ) if resp.headers.get(hdrs.UPGRADE, "").lower() != "websocket": raise WSServerHandshakeError( resp.request_info, resp.history, message="Invalid upgrade header", status=resp.status, headers=resp.headers, ) if resp.headers.get(hdrs.CONNECTION, "").lower() != "upgrade": raise WSServerHandshakeError( resp.request_info, resp.history, message="Invalid connection header", status=resp.status, headers=resp.headers, ) # key calculation r_key = resp.headers.get(hdrs.SEC_WEBSOCKET_ACCEPT, "") match = base64.b64encode(hashlib.sha1(sec_key + WS_KEY).digest()).decode() if r_key != match: raise WSServerHandshakeError( resp.request_info, resp.history, message="Invalid challenge response", status=resp.status, headers=resp.headers, ) # websocket protocol protocol = None if protocols and hdrs.SEC_WEBSOCKET_PROTOCOL in resp.headers: resp_protocols = [ proto.strip() for proto in resp.headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") ] for proto in resp_protocols: if proto in protocols: protocol = proto break # websocket compress notakeover = False if compress: compress_hdrs = resp.headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) if compress_hdrs: try: compress, notakeover = ws_ext_parse(compress_hdrs) except WSHandshakeError as exc: raise WSServerHandshakeError( resp.request_info, resp.history, message=exc.args[0], status=resp.status, headers=resp.headers, ) from exc else: compress = 0 notakeover = False conn = resp.connection assert conn is not None conn_proto = conn.protocol assert conn_proto is not None transport = conn.transport assert transport is not None reader = FlowControlDataQueue( conn_proto, 2 ** 16, loop=self._loop ) # type: FlowControlDataQueue[WSMessage] conn_proto.set_parser(WebSocketReader(reader, max_msg_size), reader) writer = WebSocketWriter( conn_proto, transport, use_mask=True, compress=compress, notakeover=notakeover, ) except BaseException: resp.close() raise else: return self._ws_response_class( reader, writer, protocol, resp, timeout, autoclose, autoping, self._loop, receive_timeout=receive_timeout, heartbeat=heartbeat, compress=compress, client_notakeover=notakeover, ) def _prepare_headers(self, headers: Optional[LooseHeaders]) -> "CIMultiDict[str]": """Add default headers and transform it to CIMultiDict""" # Convert headers to MultiDict result = CIMultiDict(self._default_headers) if headers: if not isinstance(headers, (MultiDictProxy, MultiDict)): headers = CIMultiDict(headers) added_names = set() # type: Set[str] for key, value in headers.items(): if key in added_names: result.add(key, value) else: result[key] = value added_names.add(key) return result def get( self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP GET request.""" return _RequestContextManager( self._request(hdrs.METH_GET, url, allow_redirects=allow_redirects, **kwargs) ) def options( self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP OPTIONS request.""" return _RequestContextManager( self._request( hdrs.METH_OPTIONS, url, allow_redirects=allow_redirects, **kwargs ) ) def head( self, url: StrOrURL, *, allow_redirects: bool = False, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP HEAD request.""" return _RequestContextManager( self._request( hdrs.METH_HEAD, url, allow_redirects=allow_redirects, **kwargs ) ) def post( self, url: StrOrURL, *, data: Any = None, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP POST request.""" return _RequestContextManager( self._request(hdrs.METH_POST, url, data=data, **kwargs) ) def put( self, url: StrOrURL, *, data: Any = None, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP PUT request.""" return _RequestContextManager( self._request(hdrs.METH_PUT, url, data=data, **kwargs) ) def patch( self, url: StrOrURL, *, data: Any = None, **kwargs: Any ) -> "_RequestContextManager": """Perform HTTP PATCH request.""" return _RequestContextManager( self._request(hdrs.METH_PATCH, url, data=data, **kwargs) ) def delete(self, url: StrOrURL, **kwargs: Any) -> "_RequestContextManager": """Perform HTTP DELETE request.""" return _RequestContextManager(self._request(hdrs.METH_DELETE, url, **kwargs)) async def close(self) -> None: """Close underlying connector. Release all acquired resources. """ if not self.closed: if self._connector is not None and self._connector_owner: await self._connector.close() self._connector = None @property def closed(self) -> bool: """Is client session closed. A readonly property. """ return self._connector is None or self._connector.closed @property def connector(self) -> Optional[BaseConnector]: """Connector instance used for the session.""" return self._connector @property def cookie_jar(self) -> AbstractCookieJar: """The session cookies.""" return self._cookie_jar @property def version(self) -> Tuple[int, int]: """The session HTTP protocol version.""" return self._version @property def requote_redirect_url(self) -> bool: """Do URL requoting on redirection handling.""" return self._requote_redirect_url @requote_redirect_url.setter def requote_redirect_url(self, val: bool) -> None: """Do URL requoting on redirection handling.""" warnings.warn( "session.requote_redirect_url modification " "is deprecated #2778", DeprecationWarning, stacklevel=2, ) self._requote_redirect_url = val @property def loop(self) -> asyncio.AbstractEventLoop: """Session's loop.""" warnings.warn( "client.loop property is deprecated", DeprecationWarning, stacklevel=2 ) return self._loop @property def timeout(self) -> Union[object, ClientTimeout]: """Timeout for the session.""" return self._timeout @property def headers(self) -> "CIMultiDict[str]": """The default headers of the client session.""" return self._default_headers @property def skip_auto_headers(self) -> FrozenSet[istr]: """Headers for which autogeneration should be skipped""" return self._skip_auto_headers @property def auth(self) -> Optional[BasicAuth]: """An object that represents HTTP Basic Authorization""" return self._default_auth @property def json_serialize(self) -> JSONEncoder: """Json serializer callable""" return self._json_serialize @property def connector_owner(self) -> bool: """Should connector be closed on session closing""" return self._connector_owner @property def raise_for_status( self, ) -> Union[bool, Callable[[ClientResponse], Awaitable[None]]]: """Should `ClientResponse.raise_for_status()` be called for each response.""" return self._raise_for_status @property def auto_decompress(self) -> bool: """Should the body response be automatically decompressed.""" return self._auto_decompress @property def trust_env(self) -> bool: """ Should proxies information from environment or netrc be trusted. Information is from HTTP_PROXY / HTTPS_PROXY environment variables or ~/.netrc file if present. """ return self._trust_env @property def trace_configs(self) -> List[TraceConfig]: """A list of TraceConfig instances used for client tracing""" return self._trace_configs def detach(self) -> None: """Detach connector from session without closing the former. Session is switched to closed state anyway. """ self._connector = None def __enter__(self) -> None: raise TypeError("Use async with instead") def __exit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> None: # __exit__ should exist in pair with __enter__ but never executed pass # pragma: no cover async def __aenter__(self) -> "ClientSession": return self async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> None: await self.close() class _BaseRequestContextManager(Coroutine[Any, Any, _RetType], Generic[_RetType]): __slots__ = ("_coro", "_resp") def __init__(self, coro: Coroutine["asyncio.Future[Any]", None, _RetType]) -> None: self._coro = coro def send(self, arg: None) -> "asyncio.Future[Any]": return self._coro.send(arg) def throw(self, arg: BaseException) -> None: # type: ignore[arg-type,override] self._coro.throw(arg) def close(self) -> None: return self._coro.close() def __await__(self) -> Generator[Any, None, _RetType]: ret = self._coro.__await__() return ret def __iter__(self) -> Generator[Any, None, _RetType]: return self.__await__() async def __aenter__(self) -> _RetType: self._resp = await self._coro return self._resp class _RequestContextManager(_BaseRequestContextManager[ClientResponse]): __slots__ = () async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc: Optional[BaseException], tb: Optional[TracebackType], ) -> None: # We're basing behavior on the exception as it can be caused by # user code unrelated to the status of the connection. If you # would like to close a connection you must do that # explicitly. Otherwise connection error handling should kick in # and close/recycle the connection as required. self._resp.release() class _WSRequestContextManager(_BaseRequestContextManager[ClientWebSocketResponse]): __slots__ = () async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc: Optional[BaseException], tb: Optional[TracebackType], ) -> None: await self._resp.close() class _SessionRequestContextManager: __slots__ = ("_coro", "_resp", "_session") def __init__( self, coro: Coroutine["asyncio.Future[Any]", None, ClientResponse], session: ClientSession, ) -> None: self._coro = coro self._resp = None # type: Optional[ClientResponse] self._session = session async def __aenter__(self) -> ClientResponse: try: self._resp = await self._coro except BaseException: await self._session.close() raise else: return self._resp async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc: Optional[BaseException], tb: Optional[TracebackType], ) -> None: assert self._resp is not None self._resp.close() await self._session.close() def request( method: str, url: StrOrURL, *, params: Optional[Mapping[str, str]] = None, data: Any = None, json: Any = None, headers: Optional[LooseHeaders] = None, skip_auto_headers: Optional[Iterable[str]] = None, auth: Optional[BasicAuth] = None, allow_redirects: bool = True, max_redirects: int = 10, compress: Optional[str] = None, chunked: Optional[bool] = None, expect100: bool = False, raise_for_status: Optional[bool] = None, read_until_eof: bool = True, proxy: Optional[StrOrURL] = None, proxy_auth: Optional[BasicAuth] = None, timeout: Union[ClientTimeout, object] = sentinel, cookies: Optional[LooseCookies] = None, version: HttpVersion = http.HttpVersion11, connector: Optional[BaseConnector] = None, read_bufsize: Optional[int] = None, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> _SessionRequestContextManager: """Constructs and sends a request. Returns response object. method - HTTP method url - request url params - (optional) Dictionary or bytes to be sent in the query string of the new request data - (optional) Dictionary, bytes, or file-like object to send in the body of the request json - (optional) Any json compatible python object headers - (optional) Dictionary of HTTP Headers to send with the request cookies - (optional) Dict object to send with the request auth - (optional) BasicAuth named tuple represent HTTP Basic Auth auth - aiohttp.helpers.BasicAuth allow_redirects - (optional) If set to False, do not follow redirects version - Request HTTP version. compress - Set to True if request has to be compressed with deflate encoding. chunked - Set to chunk size for chunked transfer encoding. expect100 - Expect 100-continue response from server. connector - BaseConnector sub-class instance to support connection pooling. read_until_eof - Read response until eof if response does not have Content-Length header. loop - Optional event loop. timeout - Optional ClientTimeout settings structure, 5min total timeout by default. Usage:: >>> import aiohttp >>> resp = await aiohttp.request('GET', 'http://python.org/') >>> resp >>> data = await resp.read() """ connector_owner = False if connector is None: connector_owner = True connector = TCPConnector(loop=loop, force_close=True) session = ClientSession( loop=loop, cookies=cookies, version=version, timeout=timeout, connector=connector, connector_owner=connector_owner, ) return _SessionRequestContextManager( session._request( method, url, params=params, data=data, json=json, headers=headers, skip_auto_headers=skip_auto_headers, auth=auth, allow_redirects=allow_redirects, max_redirects=max_redirects, compress=compress, chunked=chunked, expect100=expect100, raise_for_status=raise_for_status, read_until_eof=read_until_eof, proxy=proxy, proxy_auth=proxy_auth, read_bufsize=read_bufsize, ), session, ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/client_exceptions.py0000644000175100001710000002207500000000000020302 0ustar00runnerdocker"""HTTP related errors.""" import asyncio import warnings from typing import TYPE_CHECKING, Any, Optional, Tuple, Union from .http_parser import RawResponseMessage from .typedefs import LooseHeaders try: import ssl SSLContext = ssl.SSLContext except ImportError: # pragma: no cover ssl = SSLContext = None # type: ignore[assignment] if TYPE_CHECKING: # pragma: no cover from .client_reqrep import ClientResponse, ConnectionKey, Fingerprint, RequestInfo else: RequestInfo = ClientResponse = ConnectionKey = None __all__ = ( "ClientError", "ClientConnectionError", "ClientOSError", "ClientConnectorError", "ClientProxyConnectionError", "ClientSSLError", "ClientConnectorSSLError", "ClientConnectorCertificateError", "ServerConnectionError", "ServerTimeoutError", "ServerDisconnectedError", "ServerFingerprintMismatch", "ClientResponseError", "ClientHttpProxyError", "WSServerHandshakeError", "ContentTypeError", "ClientPayloadError", "InvalidURL", ) class ClientError(Exception): """Base class for client connection errors.""" class ClientResponseError(ClientError): """Connection error during reading response. request_info: instance of RequestInfo """ def __init__( self, request_info: RequestInfo, history: Tuple[ClientResponse, ...], *, code: Optional[int] = None, status: Optional[int] = None, message: str = "", headers: Optional[LooseHeaders] = None, ) -> None: self.request_info = request_info if code is not None: if status is not None: raise ValueError( "Both code and status arguments are provided; " "code is deprecated, use status instead" ) warnings.warn( "code argument is deprecated, use status instead", DeprecationWarning, stacklevel=2, ) if status is not None: self.status = status elif code is not None: self.status = code else: self.status = 0 self.message = message self.headers = headers self.history = history self.args = (request_info, history) def __str__(self) -> str: return "{}, message={!r}, url={!r}".format( self.status, self.message, self.request_info.real_url, ) def __repr__(self) -> str: args = f"{self.request_info!r}, {self.history!r}" if self.status != 0: args += f", status={self.status!r}" if self.message != "": args += f", message={self.message!r}" if self.headers is not None: args += f", headers={self.headers!r}" return f"{type(self).__name__}({args})" @property def code(self) -> int: warnings.warn( "code property is deprecated, use status instead", DeprecationWarning, stacklevel=2, ) return self.status @code.setter def code(self, value: int) -> None: warnings.warn( "code property is deprecated, use status instead", DeprecationWarning, stacklevel=2, ) self.status = value class ContentTypeError(ClientResponseError): """ContentType found is not valid.""" class WSServerHandshakeError(ClientResponseError): """websocket server handshake error.""" class ClientHttpProxyError(ClientResponseError): """HTTP proxy error. Raised in :class:`aiohttp.connector.TCPConnector` if proxy responds with status other than ``200 OK`` on ``CONNECT`` request. """ class TooManyRedirects(ClientResponseError): """Client was redirected too many times.""" class ClientConnectionError(ClientError): """Base class for client socket errors.""" class ClientOSError(ClientConnectionError, OSError): """OSError error.""" class ClientConnectorError(ClientOSError): """Client connector error. Raised in :class:`aiohttp.connector.TCPConnector` if connection to proxy can not be established. """ def __init__(self, connection_key: ConnectionKey, os_error: OSError) -> None: self._conn_key = connection_key self._os_error = os_error super().__init__(os_error.errno, os_error.strerror) self.args = (connection_key, os_error) @property def os_error(self) -> OSError: return self._os_error @property def host(self) -> str: return self._conn_key.host @property def port(self) -> Optional[int]: return self._conn_key.port @property def ssl(self) -> Union[SSLContext, None, bool, "Fingerprint"]: return self._conn_key.ssl def __str__(self) -> str: return "Cannot connect to host {0.host}:{0.port} ssl:{1} [{2}]".format( self, self.ssl if self.ssl is not None else "default", self.strerror ) # OSError.__reduce__ does too much black magick __reduce__ = BaseException.__reduce__ class ClientProxyConnectionError(ClientConnectorError): """Proxy connection error. Raised in :class:`aiohttp.connector.TCPConnector` if connection to proxy can not be established. """ class UnixClientConnectorError(ClientConnectorError): """Unix connector error. Raised in :py:class:`aiohttp.connector.UnixConnector` if connection to unix socket can not be established. """ def __init__( self, path: str, connection_key: ConnectionKey, os_error: OSError ) -> None: self._path = path super().__init__(connection_key, os_error) @property def path(self) -> str: return self._path def __str__(self) -> str: return "Cannot connect to unix socket {0.path} ssl:{1} [{2}]".format( self, self.ssl if self.ssl is not None else "default", self.strerror ) class ServerConnectionError(ClientConnectionError): """Server connection errors.""" class ServerDisconnectedError(ServerConnectionError): """Server disconnected.""" def __init__(self, message: Union[RawResponseMessage, str, None] = None) -> None: if message is None: message = "Server disconnected" self.args = (message,) self.message = message class ServerTimeoutError(ServerConnectionError, asyncio.TimeoutError): """Server timeout error.""" class ServerFingerprintMismatch(ServerConnectionError): """SSL certificate does not match expected fingerprint.""" def __init__(self, expected: bytes, got: bytes, host: str, port: int) -> None: self.expected = expected self.got = got self.host = host self.port = port self.args = (expected, got, host, port) def __repr__(self) -> str: return "<{} expected={!r} got={!r} host={!r} port={!r}>".format( self.__class__.__name__, self.expected, self.got, self.host, self.port ) class ClientPayloadError(ClientError): """Response payload error.""" class InvalidURL(ClientError, ValueError): """Invalid URL. URL used for fetching is malformed, e.g. it doesn't contains host part. """ # Derive from ValueError for backward compatibility def __init__(self, url: Any) -> None: # The type of url is not yarl.URL because the exception can be raised # on URL(url) call super().__init__(url) @property def url(self) -> Any: return self.args[0] def __repr__(self) -> str: return f"<{self.__class__.__name__} {self.url}>" class ClientSSLError(ClientConnectorError): """Base error for ssl.*Errors.""" if ssl is not None: cert_errors = (ssl.CertificateError,) cert_errors_bases = ( ClientSSLError, ssl.CertificateError, ) ssl_errors = (ssl.SSLError,) ssl_error_bases = (ClientSSLError, ssl.SSLError) else: # pragma: no cover cert_errors = tuple() cert_errors_bases = ( ClientSSLError, ValueError, ) ssl_errors = tuple() ssl_error_bases = (ClientSSLError,) class ClientConnectorSSLError(*ssl_error_bases): # type: ignore[misc] """Response ssl error.""" class ClientConnectorCertificateError(*cert_errors_bases): # type: ignore[misc] """Response certificate error.""" def __init__( self, connection_key: ConnectionKey, certificate_error: Exception ) -> None: self._conn_key = connection_key self._certificate_error = certificate_error self.args = (connection_key, certificate_error) @property def certificate_error(self) -> Exception: return self._certificate_error @property def host(self) -> str: return self._conn_key.host @property def port(self) -> Optional[int]: return self._conn_key.port @property def ssl(self) -> bool: return self._conn_key.is_ssl def __str__(self) -> str: return ( "Cannot connect to host {0.host}:{0.port} ssl:{0.ssl} " "[{0.certificate_error.__class__.__name__}: " "{0.certificate_error.args}]".format(self) ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/client_proto.py0000644000175100001710000002000400000000000017252 0ustar00runnerdockerimport asyncio from contextlib import suppress from typing import Any, Optional, Tuple from .base_protocol import BaseProtocol from .client_exceptions import ( ClientOSError, ClientPayloadError, ServerDisconnectedError, ServerTimeoutError, ) from .helpers import BaseTimerContext from .http import HttpResponseParser, RawResponseMessage from .streams import EMPTY_PAYLOAD, DataQueue, StreamReader class ResponseHandler(BaseProtocol, DataQueue[Tuple[RawResponseMessage, StreamReader]]): """Helper class to adapt between Protocol and StreamReader.""" def __init__(self, loop: asyncio.AbstractEventLoop) -> None: BaseProtocol.__init__(self, loop=loop) DataQueue.__init__(self, loop) self._should_close = False self._payload: Optional[StreamReader] = None self._skip_payload = False self._payload_parser = None self._timer = None self._tail = b"" self._upgraded = False self._parser = None # type: Optional[HttpResponseParser] self._read_timeout = None # type: Optional[float] self._read_timeout_handle = None # type: Optional[asyncio.TimerHandle] @property def upgraded(self) -> bool: return self._upgraded @property def should_close(self) -> bool: if self._payload is not None and not self._payload.is_eof() or self._upgraded: return True return ( self._should_close or self._upgraded or self.exception() is not None or self._payload_parser is not None or len(self) > 0 or bool(self._tail) ) def force_close(self) -> None: self._should_close = True def close(self) -> None: transport = self.transport if transport is not None: transport.close() self.transport = None self._payload = None self._drop_timeout() def is_connected(self) -> bool: return self.transport is not None and not self.transport.is_closing() def connection_lost(self, exc: Optional[BaseException]) -> None: self._drop_timeout() if self._payload_parser is not None: with suppress(Exception): self._payload_parser.feed_eof() uncompleted = None if self._parser is not None: try: uncompleted = self._parser.feed_eof() except Exception: if self._payload is not None: self._payload.set_exception( ClientPayloadError("Response payload is not completed") ) if not self.is_eof(): if isinstance(exc, OSError): exc = ClientOSError(*exc.args) if exc is None: exc = ServerDisconnectedError(uncompleted) # assigns self._should_close to True as side effect, # we do it anyway below self.set_exception(exc) self._should_close = True self._parser = None self._payload = None self._payload_parser = None self._reading_paused = False super().connection_lost(exc) def eof_received(self) -> None: # should call parser.feed_eof() most likely self._drop_timeout() def pause_reading(self) -> None: super().pause_reading() self._drop_timeout() def resume_reading(self) -> None: super().resume_reading() self._reschedule_timeout() def set_exception(self, exc: BaseException) -> None: self._should_close = True self._drop_timeout() super().set_exception(exc) def set_parser(self, parser: Any, payload: Any) -> None: # TODO: actual types are: # parser: WebSocketReader # payload: FlowControlDataQueue # but they are not generi enough # Need an ABC for both types self._payload = payload self._payload_parser = parser self._drop_timeout() if self._tail: data, self._tail = self._tail, b"" self.data_received(data) def set_response_params( self, *, timer: Optional[BaseTimerContext] = None, skip_payload: bool = False, read_until_eof: bool = False, auto_decompress: bool = True, read_timeout: Optional[float] = None, read_bufsize: int = 2 ** 16, ) -> None: self._skip_payload = skip_payload self._read_timeout = read_timeout self._reschedule_timeout() self._parser = HttpResponseParser( self, self._loop, read_bufsize, timer=timer, payload_exception=ClientPayloadError, response_with_body=not skip_payload, read_until_eof=read_until_eof, auto_decompress=auto_decompress, ) if self._tail: data, self._tail = self._tail, b"" self.data_received(data) def _drop_timeout(self) -> None: if self._read_timeout_handle is not None: self._read_timeout_handle.cancel() self._read_timeout_handle = None def _reschedule_timeout(self) -> None: timeout = self._read_timeout if self._read_timeout_handle is not None: self._read_timeout_handle.cancel() if timeout: self._read_timeout_handle = self._loop.call_later( timeout, self._on_read_timeout ) else: self._read_timeout_handle = None def _on_read_timeout(self) -> None: exc = ServerTimeoutError("Timeout on reading data from socket") self.set_exception(exc) if self._payload is not None: self._payload.set_exception(exc) def data_received(self, data: bytes) -> None: self._reschedule_timeout() if not data: return # custom payload parser if self._payload_parser is not None: eof, tail = self._payload_parser.feed_data(data) if eof: self._payload = None self._payload_parser = None if tail: self.data_received(tail) return else: if self._upgraded or self._parser is None: # i.e. websocket connection, websocket parser is not set yet self._tail += data else: # parse http messages try: messages, upgraded, tail = self._parser.feed_data(data) except BaseException as exc: if self.transport is not None: # connection.release() could be called BEFORE # data_received(), the transport is already # closed in this case self.transport.close() # should_close is True after the call self.set_exception(exc) return self._upgraded = upgraded payload: Optional[StreamReader] = None for message, payload in messages: if message.should_close: self._should_close = True self._payload = payload if self._skip_payload or message.code in (204, 304): self.feed_data((message, EMPTY_PAYLOAD), 0) else: self.feed_data((message, payload), 0) if payload is not None: # new message(s) was processed # register timeout handler unsubscribing # either on end-of-stream or immediately for # EMPTY_PAYLOAD if payload is not EMPTY_PAYLOAD: payload.on_eof(self._drop_timeout) else: self._drop_timeout() if tail: if upgraded: self.data_received(tail) else: self._tail = tail ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/client_reqrep.py0000644000175100001710000011002600000000000017411 0ustar00runnerdockerimport asyncio import codecs import functools import io import re import sys import traceback import warnings from hashlib import md5, sha1, sha256 from http.cookies import CookieError, Morsel, SimpleCookie from types import MappingProxyType, TracebackType from typing import ( TYPE_CHECKING, Any, Dict, Iterable, List, Mapping, Optional, Tuple, Type, Union, cast, ) import attr from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy from yarl import URL from . import hdrs, helpers, http, multipart, payload from .abc import AbstractStreamWriter from .client_exceptions import ( ClientConnectionError, ClientOSError, ClientResponseError, ContentTypeError, InvalidURL, ServerFingerprintMismatch, ) from .formdata import FormData from .helpers import ( PY_36, BaseTimerContext, BasicAuth, HeadersMixin, TimerNoop, noop, reify, set_result, ) from .http import SERVER_SOFTWARE, HttpVersion10, HttpVersion11, StreamWriter from .log import client_logger from .streams import StreamReader from .typedefs import ( DEFAULT_JSON_DECODER, JSONDecoder, LooseCookies, LooseHeaders, RawHeaders, ) try: import ssl from ssl import SSLContext except ImportError: # pragma: no cover ssl = None # type: ignore[assignment] SSLContext = object # type: ignore[misc,assignment] try: import cchardet as chardet except ImportError: # pragma: no cover import charset_normalizer as chardet # type: ignore[no-redef] __all__ = ("ClientRequest", "ClientResponse", "RequestInfo", "Fingerprint") if TYPE_CHECKING: # pragma: no cover from .client import ClientSession from .connector import Connection from .tracing import Trace json_re = re.compile(r"^application/(?:[\w.+-]+?\+)?json") @attr.s(auto_attribs=True, frozen=True, slots=True) class ContentDisposition: type: Optional[str] parameters: "MappingProxyType[str, str]" filename: Optional[str] @attr.s(auto_attribs=True, frozen=True, slots=True) class RequestInfo: url: URL method: str headers: "CIMultiDictProxy[str]" real_url: URL = attr.ib() @real_url.default def real_url_default(self) -> URL: return self.url class Fingerprint: HASHFUNC_BY_DIGESTLEN = { 16: md5, 20: sha1, 32: sha256, } def __init__(self, fingerprint: bytes) -> None: digestlen = len(fingerprint) hashfunc = self.HASHFUNC_BY_DIGESTLEN.get(digestlen) if not hashfunc: raise ValueError("fingerprint has invalid length") elif hashfunc is md5 or hashfunc is sha1: raise ValueError( "md5 and sha1 are insecure and " "not supported. Use sha256." ) self._hashfunc = hashfunc self._fingerprint = fingerprint @property def fingerprint(self) -> bytes: return self._fingerprint def check(self, transport: asyncio.Transport) -> None: if not transport.get_extra_info("sslcontext"): return sslobj = transport.get_extra_info("ssl_object") cert = sslobj.getpeercert(binary_form=True) got = self._hashfunc(cert).digest() if got != self._fingerprint: host, port, *_ = transport.get_extra_info("peername") raise ServerFingerprintMismatch(self._fingerprint, got, host, port) if ssl is not None: SSL_ALLOWED_TYPES = (ssl.SSLContext, bool, Fingerprint, type(None)) else: # pragma: no cover SSL_ALLOWED_TYPES = type(None) def _merge_ssl_params( ssl: Union["SSLContext", bool, Fingerprint, None], verify_ssl: Optional[bool], ssl_context: Optional["SSLContext"], fingerprint: Optional[bytes], ) -> Union["SSLContext", bool, Fingerprint, None]: if verify_ssl is not None and not verify_ssl: warnings.warn( "verify_ssl is deprecated, use ssl=False instead", DeprecationWarning, stacklevel=3, ) if ssl is not None: raise ValueError( "verify_ssl, ssl_context, fingerprint and ssl " "parameters are mutually exclusive" ) else: ssl = False if ssl_context is not None: warnings.warn( "ssl_context is deprecated, use ssl=context instead", DeprecationWarning, stacklevel=3, ) if ssl is not None: raise ValueError( "verify_ssl, ssl_context, fingerprint and ssl " "parameters are mutually exclusive" ) else: ssl = ssl_context if fingerprint is not None: warnings.warn( "fingerprint is deprecated, " "use ssl=Fingerprint(fingerprint) instead", DeprecationWarning, stacklevel=3, ) if ssl is not None: raise ValueError( "verify_ssl, ssl_context, fingerprint and ssl " "parameters are mutually exclusive" ) else: ssl = Fingerprint(fingerprint) if not isinstance(ssl, SSL_ALLOWED_TYPES): raise TypeError( "ssl should be SSLContext, bool, Fingerprint or None, " "got {!r} instead.".format(ssl) ) return ssl @attr.s(auto_attribs=True, slots=True, frozen=True) class ConnectionKey: # the key should contain an information about used proxy / TLS # to prevent reusing wrong connections from a pool host: str port: Optional[int] is_ssl: bool ssl: Union[SSLContext, None, bool, Fingerprint] proxy: Optional[URL] proxy_auth: Optional[BasicAuth] proxy_headers_hash: Optional[int] # hash(CIMultiDict) def _is_expected_content_type( response_content_type: str, expected_content_type: str ) -> bool: if expected_content_type == "application/json": return json_re.match(response_content_type) is not None return expected_content_type in response_content_type class ClientRequest: GET_METHODS = { hdrs.METH_GET, hdrs.METH_HEAD, hdrs.METH_OPTIONS, hdrs.METH_TRACE, } POST_METHODS = {hdrs.METH_PATCH, hdrs.METH_POST, hdrs.METH_PUT} ALL_METHODS = GET_METHODS.union(POST_METHODS).union({hdrs.METH_DELETE}) DEFAULT_HEADERS = { hdrs.ACCEPT: "*/*", hdrs.ACCEPT_ENCODING: "gzip, deflate", } body = b"" auth = None response = None _writer = None # async task for streaming data _continue = None # waiter future for '100 Continue' response # N.B. # Adding __del__ method with self._writer closing doesn't make sense # because _writer is instance method, thus it keeps a reference to self. # Until writer has finished finalizer will not be called. def __init__( self, method: str, url: URL, *, params: Optional[Mapping[str, str]] = None, headers: Optional[LooseHeaders] = None, skip_auto_headers: Iterable[str] = frozenset(), data: Any = None, cookies: Optional[LooseCookies] = None, auth: Optional[BasicAuth] = None, version: http.HttpVersion = http.HttpVersion11, compress: Optional[str] = None, chunked: Optional[bool] = None, expect100: bool = False, loop: Optional[asyncio.AbstractEventLoop] = None, response_class: Optional[Type["ClientResponse"]] = None, proxy: Optional[URL] = None, proxy_auth: Optional[BasicAuth] = None, timer: Optional[BaseTimerContext] = None, session: Optional["ClientSession"] = None, ssl: Union[SSLContext, bool, Fingerprint, None] = None, proxy_headers: Optional[LooseHeaders] = None, traces: Optional[List["Trace"]] = None, ): if loop is None: loop = asyncio.get_event_loop() assert isinstance(url, URL), url assert isinstance(proxy, (URL, type(None))), proxy # FIXME: session is None in tests only, need to fix tests # assert session is not None self._session = cast("ClientSession", session) if params: q = MultiDict(url.query) url2 = url.with_query(params) q.extend(url2.query) url = url.with_query(q) self.original_url = url self.url = url.with_fragment(None) self.method = method.upper() self.chunked = chunked self.compress = compress self.loop = loop self.length = None if response_class is None: real_response_class = ClientResponse else: real_response_class = response_class self.response_class = real_response_class # type: Type[ClientResponse] self._timer = timer if timer is not None else TimerNoop() self._ssl = ssl if loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1)) self.update_version(version) self.update_host(url) self.update_headers(headers) self.update_auto_headers(skip_auto_headers) self.update_cookies(cookies) self.update_content_encoding(data) self.update_auth(auth) self.update_proxy(proxy, proxy_auth, proxy_headers) self.update_body_from_data(data) if data is not None or self.method not in self.GET_METHODS: self.update_transfer_encoding() self.update_expect_continue(expect100) if traces is None: traces = [] self._traces = traces def is_ssl(self) -> bool: return self.url.scheme in ("https", "wss") @property def ssl(self) -> Union["SSLContext", None, bool, Fingerprint]: return self._ssl @property def connection_key(self) -> ConnectionKey: proxy_headers = self.proxy_headers if proxy_headers: h = hash( tuple((k, v) for k, v in proxy_headers.items()) ) # type: Optional[int] else: h = None return ConnectionKey( self.host, self.port, self.is_ssl(), self.ssl, self.proxy, self.proxy_auth, h, ) @property def host(self) -> str: ret = self.url.raw_host assert ret is not None return ret @property def port(self) -> Optional[int]: return self.url.port @property def request_info(self) -> RequestInfo: headers = CIMultiDictProxy(self.headers) # type: CIMultiDictProxy[str] return RequestInfo(self.url, self.method, headers, self.original_url) def update_host(self, url: URL) -> None: """Update destination host, port and connection type (ssl).""" # get host/port if not url.raw_host: raise InvalidURL(url) # basic auth info username, password = url.user, url.password if username: self.auth = helpers.BasicAuth(username, password or "") def update_version(self, version: Union[http.HttpVersion, str]) -> None: """Convert request version to two elements tuple. parser HTTP version '1.1' => (1, 1) """ if isinstance(version, str): v = [part.strip() for part in version.split(".", 1)] try: version = http.HttpVersion(int(v[0]), int(v[1])) except ValueError: raise ValueError( f"Can not parse http version number: {version}" ) from None self.version = version def update_headers(self, headers: Optional[LooseHeaders]) -> None: """Update request headers.""" self.headers = CIMultiDict() # type: CIMultiDict[str] # add host netloc = cast(str, self.url.raw_host) if helpers.is_ipv6_address(netloc): netloc = f"[{netloc}]" if self.url.port is not None and not self.url.is_default_port(): netloc += ":" + str(self.url.port) self.headers[hdrs.HOST] = netloc if headers: if isinstance(headers, (dict, MultiDictProxy, MultiDict)): headers = headers.items() # type: ignore[assignment] for key, value in headers: # type: ignore[misc] # A special case for Host header if key.lower() == "host": self.headers[key] = value else: self.headers.add(key, value) def update_auto_headers(self, skip_auto_headers: Iterable[str]) -> None: self.skip_auto_headers = CIMultiDict( (hdr, None) for hdr in sorted(skip_auto_headers) ) used_headers = self.headers.copy() used_headers.extend(self.skip_auto_headers) # type: ignore[arg-type] for hdr, val in self.DEFAULT_HEADERS.items(): if hdr not in used_headers: self.headers.add(hdr, val) if hdrs.USER_AGENT not in used_headers: self.headers[hdrs.USER_AGENT] = SERVER_SOFTWARE def update_cookies(self, cookies: Optional[LooseCookies]) -> None: """Update request cookies header.""" if not cookies: return c = SimpleCookie() # type: SimpleCookie[str] if hdrs.COOKIE in self.headers: c.load(self.headers.get(hdrs.COOKIE, "")) del self.headers[hdrs.COOKIE] if isinstance(cookies, Mapping): iter_cookies = cookies.items() else: iter_cookies = cookies # type: ignore[assignment] for name, value in iter_cookies: if isinstance(value, Morsel): # Preserve coded_value mrsl_val = value.get(value.key, Morsel()) mrsl_val.set(value.key, value.value, value.coded_value) c[name] = mrsl_val else: c[name] = value # type: ignore[assignment] self.headers[hdrs.COOKIE] = c.output(header="", sep=";").strip() def update_content_encoding(self, data: Any) -> None: """Set request content encoding.""" if data is None: return enc = self.headers.get(hdrs.CONTENT_ENCODING, "").lower() if enc: if self.compress: raise ValueError( "compress can not be set " "if Content-Encoding header is set" ) elif self.compress: if not isinstance(self.compress, str): self.compress = "deflate" self.headers[hdrs.CONTENT_ENCODING] = self.compress self.chunked = True # enable chunked, no need to deal with length def update_transfer_encoding(self) -> None: """Analyze transfer-encoding header.""" te = self.headers.get(hdrs.TRANSFER_ENCODING, "").lower() if "chunked" in te: if self.chunked: raise ValueError( "chunked can not be set " 'if "Transfer-Encoding: chunked" header is set' ) elif self.chunked: if hdrs.CONTENT_LENGTH in self.headers: raise ValueError( "chunked can not be set " "if Content-Length header is set" ) self.headers[hdrs.TRANSFER_ENCODING] = "chunked" else: if hdrs.CONTENT_LENGTH not in self.headers: self.headers[hdrs.CONTENT_LENGTH] = str(len(self.body)) def update_auth(self, auth: Optional[BasicAuth]) -> None: """Set basic auth.""" if auth is None: auth = self.auth if auth is None: return if not isinstance(auth, helpers.BasicAuth): raise TypeError("BasicAuth() tuple is required instead") self.headers[hdrs.AUTHORIZATION] = auth.encode() def update_body_from_data(self, body: Any) -> None: if body is None: return # FormData if isinstance(body, FormData): body = body() try: body = payload.PAYLOAD_REGISTRY.get(body, disposition=None) except payload.LookupError: body = FormData(body)() self.body = body # enable chunked encoding if needed if not self.chunked: if hdrs.CONTENT_LENGTH not in self.headers: size = body.size if size is None: self.chunked = True else: if hdrs.CONTENT_LENGTH not in self.headers: self.headers[hdrs.CONTENT_LENGTH] = str(size) # copy payload headers assert body.headers for (key, value) in body.headers.items(): if key in self.headers: continue if key in self.skip_auto_headers: continue self.headers[key] = value def update_expect_continue(self, expect: bool = False) -> None: if expect: self.headers[hdrs.EXPECT] = "100-continue" elif self.headers.get(hdrs.EXPECT, "").lower() == "100-continue": expect = True if expect: self._continue = self.loop.create_future() def update_proxy( self, proxy: Optional[URL], proxy_auth: Optional[BasicAuth], proxy_headers: Optional[LooseHeaders], ) -> None: if proxy_auth and not isinstance(proxy_auth, helpers.BasicAuth): raise ValueError("proxy_auth must be None or BasicAuth() tuple") self.proxy = proxy self.proxy_auth = proxy_auth self.proxy_headers = proxy_headers def keep_alive(self) -> bool: if self.version < HttpVersion10: # keep alive not supported at all return False if self.version == HttpVersion10: if self.headers.get(hdrs.CONNECTION) == "keep-alive": return True else: # no headers means we close for Http 1.0 return False elif self.headers.get(hdrs.CONNECTION) == "close": return False return True async def write_bytes( self, writer: AbstractStreamWriter, conn: "Connection" ) -> None: """Support coroutines that yields bytes objects.""" # 100 response if self._continue is not None: await writer.drain() await self._continue protocol = conn.protocol assert protocol is not None try: if isinstance(self.body, payload.Payload): await self.body.write(writer) else: if isinstance(self.body, (bytes, bytearray)): self.body = (self.body,) # type: ignore[assignment] for chunk in self.body: await writer.write(chunk) # type: ignore[arg-type] await writer.write_eof() except OSError as exc: new_exc = ClientOSError( exc.errno, "Can not write request body for %s" % self.url ) new_exc.__context__ = exc new_exc.__cause__ = exc protocol.set_exception(new_exc) except asyncio.CancelledError as exc: if not conn.closed: protocol.set_exception(exc) except Exception as exc: protocol.set_exception(exc) finally: self._writer = None async def send(self, conn: "Connection") -> "ClientResponse": # Specify request target: # - CONNECT request must send authority form URI # - not CONNECT proxy must send absolute form URI # - most common is origin form URI if self.method == hdrs.METH_CONNECT: connect_host = self.url.raw_host assert connect_host is not None if helpers.is_ipv6_address(connect_host): connect_host = f"[{connect_host}]" path = f"{connect_host}:{self.url.port}" elif self.proxy and not self.is_ssl(): path = str(self.url) else: path = self.url.raw_path if self.url.raw_query_string: path += "?" + self.url.raw_query_string protocol = conn.protocol assert protocol is not None writer = StreamWriter( protocol, self.loop, on_chunk_sent=functools.partial( self._on_chunk_request_sent, self.method, self.url ), on_headers_sent=functools.partial( self._on_headers_request_sent, self.method, self.url ), ) if self.compress: writer.enable_compression(self.compress) if self.chunked is not None: writer.enable_chunking() # set default content-type if ( self.method in self.POST_METHODS and hdrs.CONTENT_TYPE not in self.skip_auto_headers and hdrs.CONTENT_TYPE not in self.headers ): self.headers[hdrs.CONTENT_TYPE] = "application/octet-stream" # set the connection header connection = self.headers.get(hdrs.CONNECTION) if not connection: if self.keep_alive(): if self.version == HttpVersion10: connection = "keep-alive" else: if self.version == HttpVersion11: connection = "close" if connection is not None: self.headers[hdrs.CONNECTION] = connection # status + headers status_line = "{0} {1} HTTP/{2[0]}.{2[1]}".format( self.method, path, self.version ) await writer.write_headers(status_line, self.headers) self._writer = self.loop.create_task(self.write_bytes(writer, conn)) response_class = self.response_class assert response_class is not None self.response = response_class( self.method, self.original_url, writer=self._writer, continue100=self._continue, timer=self._timer, request_info=self.request_info, traces=self._traces, loop=self.loop, session=self._session, ) return self.response async def close(self) -> None: if self._writer is not None: try: await self._writer finally: self._writer = None def terminate(self) -> None: if self._writer is not None: if not self.loop.is_closed(): self._writer.cancel() self._writer = None async def _on_chunk_request_sent(self, method: str, url: URL, chunk: bytes) -> None: for trace in self._traces: await trace.send_request_chunk_sent(method, url, chunk) async def _on_headers_request_sent( self, method: str, url: URL, headers: "CIMultiDict[str]" ) -> None: for trace in self._traces: await trace.send_request_headers(method, url, headers) class ClientResponse(HeadersMixin): # from the Status-Line of the response version = None # HTTP-Version status = None # type: int # Status-Code reason = None # Reason-Phrase content = None # type: StreamReader # Payload stream _headers = None # type: CIMultiDictProxy[str] # Response headers _raw_headers = None # type: RawHeaders # Response raw headers _connection = None # current connection _source_traceback = None # setted up by ClientRequest after ClientResponse object creation # post-init stage allows to not change ctor signature _closed = True # to allow __del__ for non-initialized properly response _released = False def __init__( self, method: str, url: URL, *, writer: "asyncio.Task[None]", continue100: Optional["asyncio.Future[bool]"], timer: BaseTimerContext, request_info: RequestInfo, traces: List["Trace"], loop: asyncio.AbstractEventLoop, session: "ClientSession", ) -> None: assert isinstance(url, URL) self.method = method self.cookies = SimpleCookie() # type: SimpleCookie[str] self._real_url = url self._url = url.with_fragment(None) self._body = None # type: Any self._writer = writer # type: Optional[asyncio.Task[None]] self._continue = continue100 # None by default self._closed = True self._history = () # type: Tuple[ClientResponse, ...] self._request_info = request_info self._timer = timer if timer is not None else TimerNoop() self._cache = {} # type: Dict[str, Any] self._traces = traces self._loop = loop # store a reference to session #1985 self._session = session # type: Optional[ClientSession] if loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1)) @reify def url(self) -> URL: return self._url @reify def url_obj(self) -> URL: warnings.warn("Deprecated, use .url #1654", DeprecationWarning, stacklevel=2) return self._url @reify def real_url(self) -> URL: return self._real_url @reify def host(self) -> str: assert self._url.host is not None return self._url.host @reify def headers(self) -> "CIMultiDictProxy[str]": return self._headers @reify def raw_headers(self) -> RawHeaders: return self._raw_headers @reify def request_info(self) -> RequestInfo: return self._request_info @reify def content_disposition(self) -> Optional[ContentDisposition]: raw = self._headers.get(hdrs.CONTENT_DISPOSITION) if raw is None: return None disposition_type, params_dct = multipart.parse_content_disposition(raw) params = MappingProxyType(params_dct) filename = multipart.content_disposition_filename(params) return ContentDisposition(disposition_type, params, filename) def __del__(self, _warnings: Any = warnings) -> None: if self._closed: return if self._connection is not None: self._connection.release() self._cleanup_writer() if self._loop.get_debug(): if PY_36: kwargs = {"source": self} else: kwargs = {} _warnings.warn(f"Unclosed response {self!r}", ResourceWarning, **kwargs) context = {"client_response": self, "message": "Unclosed response"} if self._source_traceback: context["source_traceback"] = self._source_traceback self._loop.call_exception_handler(context) def __repr__(self) -> str: out = io.StringIO() ascii_encodable_url = str(self.url) if self.reason: ascii_encodable_reason = self.reason.encode( "ascii", "backslashreplace" ).decode("ascii") else: ascii_encodable_reason = self.reason print( "".format( ascii_encodable_url, self.status, ascii_encodable_reason ), file=out, ) print(self.headers, file=out) return out.getvalue() @property def connection(self) -> Optional["Connection"]: return self._connection @reify def history(self) -> Tuple["ClientResponse", ...]: """A sequence of of responses, if redirects occurred.""" return self._history @reify def links(self) -> "MultiDictProxy[MultiDictProxy[Union[str, URL]]]": links_str = ", ".join(self.headers.getall("link", [])) if not links_str: return MultiDictProxy(MultiDict()) links = MultiDict() # type: MultiDict[MultiDictProxy[Union[str, URL]]] for val in re.split(r",(?=\s*<)", links_str): match = re.match(r"\s*<(.*)>(.*)", val) if match is None: # pragma: no cover # the check exists to suppress mypy error continue url, params_str = match.groups() params = params_str.split(";")[1:] link = MultiDict() # type: MultiDict[Union[str, URL]] for param in params: match = re.match(r"^\s*(\S*)\s*=\s*(['\"]?)(.*?)(\2)\s*$", param, re.M) if match is None: # pragma: no cover # the check exists to suppress mypy error continue key, _, value, _ = match.groups() link.add(key, value) key = link.get("rel", url) # type: ignore[assignment] link.add("url", self.url.join(URL(url))) links.add(key, MultiDictProxy(link)) return MultiDictProxy(links) async def start(self, connection: "Connection") -> "ClientResponse": """Start response processing.""" self._closed = False self._protocol = connection.protocol self._connection = connection with self._timer: while True: # read response try: protocol = self._protocol message, payload = await protocol.read() # type: ignore[union-attr] except http.HttpProcessingError as exc: raise ClientResponseError( self.request_info, self.history, status=exc.code, message=exc.message, headers=exc.headers, ) from exc if message.code < 100 or message.code > 199 or message.code == 101: break if self._continue is not None: set_result(self._continue, True) self._continue = None # payload eof handler payload.on_eof(self._response_eof) # response status self.version = message.version self.status = message.code self.reason = message.reason # headers self._headers = message.headers # type is CIMultiDictProxy self._raw_headers = message.raw_headers # type is Tuple[bytes, bytes] # payload self.content = payload # cookies for hdr in self.headers.getall(hdrs.SET_COOKIE, ()): try: self.cookies.load(hdr) except CookieError as exc: client_logger.warning("Can not load response cookies: %s", exc) return self def _response_eof(self) -> None: if self._closed: return if self._connection is not None: # websocket, protocol could be None because # connection could be detached if ( self._connection.protocol is not None and self._connection.protocol.upgraded ): return self._connection.release() self._connection = None self._closed = True self._cleanup_writer() @property def closed(self) -> bool: return self._closed def close(self) -> None: if not self._released: self._notify_content() if self._closed: return self._closed = True if self._loop is None or self._loop.is_closed(): return if self._connection is not None: self._connection.close() self._connection = None self._cleanup_writer() def release(self) -> Any: if not self._released: self._notify_content() if self._closed: return noop() self._closed = True if self._connection is not None: self._connection.release() self._connection = None self._cleanup_writer() return noop() @property def ok(self) -> bool: """Returns ``True`` if ``status`` is less than ``400``, ``False`` if not. This is **not** a check for ``200 OK`` but a check that the response status is under 400. """ return 400 > self.status def raise_for_status(self) -> None: if not self.ok: # reason should always be not None for a started response assert self.reason is not None self.release() raise ClientResponseError( self.request_info, self.history, status=self.status, message=self.reason, headers=self.headers, ) def _cleanup_writer(self) -> None: if self._writer is not None: self._writer.cancel() self._writer = None self._session = None def _notify_content(self) -> None: content = self.content if content and content.exception() is None: content.set_exception(ClientConnectionError("Connection closed")) self._released = True async def wait_for_close(self) -> None: if self._writer is not None: try: await self._writer finally: self._writer = None self.release() async def read(self) -> bytes: """Read response payload.""" if self._body is None: try: self._body = await self.content.read() for trace in self._traces: await trace.send_response_chunk_received( self.method, self.url, self._body ) except BaseException: self.close() raise elif self._released: raise ClientConnectionError("Connection closed") return self._body # type: ignore[no-any-return] def get_encoding(self) -> str: ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() mimetype = helpers.parse_mimetype(ctype) encoding = mimetype.parameters.get("charset") if encoding: try: codecs.lookup(encoding) except LookupError: encoding = None if not encoding: if mimetype.type == "application" and ( mimetype.subtype == "json" or mimetype.subtype == "rdap" ): # RFC 7159 states that the default encoding is UTF-8. # RFC 7483 defines application/rdap+json encoding = "utf-8" elif self._body is None: raise RuntimeError( "Cannot guess the encoding of " "a not yet read body" ) else: encoding = chardet.detect(self._body)["encoding"] if not encoding: encoding = "utf-8" return encoding async def text(self, encoding: Optional[str] = None, errors: str = "strict") -> str: """Read response payload and decode.""" if self._body is None: await self.read() if encoding is None: encoding = self.get_encoding() return self._body.decode( # type: ignore[no-any-return,union-attr] encoding, errors=errors ) async def json( self, *, encoding: Optional[str] = None, loads: JSONDecoder = DEFAULT_JSON_DECODER, content_type: Optional[str] = "application/json", ) -> Any: """Read and decodes JSON response.""" if self._body is None: await self.read() if content_type: ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() if not _is_expected_content_type(ctype, content_type): raise ContentTypeError( self.request_info, self.history, message=( "Attempt to decode JSON with " "unexpected mimetype: %s" % ctype ), headers=self.headers, ) stripped = self._body.strip() # type: ignore[union-attr] if not stripped: return None if encoding is None: encoding = self.get_encoding() return loads(stripped.decode(encoding)) async def __aenter__(self) -> "ClientResponse": return self async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> None: # similar to _RequestContextManager, we do not need to check # for exceptions, response object can close connection # if state is broken self.release() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/client_ws.py0000644000175100001710000002445400000000000016555 0ustar00runnerdocker"""WebSocket client for asyncio.""" import asyncio from typing import Any, Optional, cast import async_timeout from .client_exceptions import ClientError from .client_reqrep import ClientResponse from .helpers import call_later, set_result from .http import ( WS_CLOSED_MESSAGE, WS_CLOSING_MESSAGE, WebSocketError, WSCloseCode, WSMessage, WSMsgType, ) from .http_websocket import WebSocketWriter # WSMessage from .streams import EofStream, FlowControlDataQueue from .typedefs import ( DEFAULT_JSON_DECODER, DEFAULT_JSON_ENCODER, JSONDecoder, JSONEncoder, ) class ClientWebSocketResponse: def __init__( self, reader: "FlowControlDataQueue[WSMessage]", writer: WebSocketWriter, protocol: Optional[str], response: ClientResponse, timeout: float, autoclose: bool, autoping: bool, loop: asyncio.AbstractEventLoop, *, receive_timeout: Optional[float] = None, heartbeat: Optional[float] = None, compress: int = 0, client_notakeover: bool = False, ) -> None: self._response = response self._conn = response.connection self._writer = writer self._reader = reader self._protocol = protocol self._closed = False self._closing = False self._close_code = None # type: Optional[int] self._timeout = timeout self._receive_timeout = receive_timeout self._autoclose = autoclose self._autoping = autoping self._heartbeat = heartbeat self._heartbeat_cb: Optional[asyncio.TimerHandle] = None if heartbeat is not None: self._pong_heartbeat = heartbeat / 2.0 self._pong_response_cb: Optional[asyncio.TimerHandle] = None self._loop = loop self._waiting = None # type: Optional[asyncio.Future[bool]] self._exception = None # type: Optional[BaseException] self._compress = compress self._client_notakeover = client_notakeover self._reset_heartbeat() def _cancel_heartbeat(self) -> None: if self._pong_response_cb is not None: self._pong_response_cb.cancel() self._pong_response_cb = None if self._heartbeat_cb is not None: self._heartbeat_cb.cancel() self._heartbeat_cb = None def _reset_heartbeat(self) -> None: self._cancel_heartbeat() if self._heartbeat is not None: self._heartbeat_cb = call_later( self._send_heartbeat, self._heartbeat, self._loop ) def _send_heartbeat(self) -> None: if self._heartbeat is not None and not self._closed: # fire-and-forget a task is not perfect but maybe ok for # sending ping. Otherwise we need a long-living heartbeat # task in the class. self._loop.create_task(self._writer.ping()) if self._pong_response_cb is not None: self._pong_response_cb.cancel() self._pong_response_cb = call_later( self._pong_not_received, self._pong_heartbeat, self._loop ) def _pong_not_received(self) -> None: if not self._closed: self._closed = True self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._exception = asyncio.TimeoutError() self._response.close() @property def closed(self) -> bool: return self._closed @property def close_code(self) -> Optional[int]: return self._close_code @property def protocol(self) -> Optional[str]: return self._protocol @property def compress(self) -> int: return self._compress @property def client_notakeover(self) -> bool: return self._client_notakeover def get_extra_info(self, name: str, default: Any = None) -> Any: """extra info from connection transport""" conn = self._response.connection if conn is None: return default transport = conn.transport if transport is None: return default return transport.get_extra_info(name, default) def exception(self) -> Optional[BaseException]: return self._exception async def ping(self, message: bytes = b"") -> None: await self._writer.ping(message) async def pong(self, message: bytes = b"") -> None: await self._writer.pong(message) async def send_str(self, data: str, compress: Optional[int] = None) -> None: if not isinstance(data, str): raise TypeError("data argument must be str (%r)" % type(data)) await self._writer.send(data, binary=False, compress=compress) async def send_bytes(self, data: bytes, compress: Optional[int] = None) -> None: if not isinstance(data, (bytes, bytearray, memoryview)): raise TypeError("data argument must be byte-ish (%r)" % type(data)) await self._writer.send(data, binary=True, compress=compress) async def send_json( self, data: Any, compress: Optional[int] = None, *, dumps: JSONEncoder = DEFAULT_JSON_ENCODER, ) -> None: await self.send_str(dumps(data), compress=compress) async def close(self, *, code: int = WSCloseCode.OK, message: bytes = b"") -> bool: # we need to break `receive()` cycle first, # `close()` may be called from different task if self._waiting is not None and not self._closed: self._reader.feed_data(WS_CLOSING_MESSAGE, 0) await self._waiting if not self._closed: self._cancel_heartbeat() self._closed = True try: await self._writer.close(code, message) except asyncio.CancelledError: self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._response.close() raise except Exception as exc: self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._exception = exc self._response.close() return True if self._closing: self._response.close() return True while True: try: async with async_timeout.timeout(self._timeout): msg = await self._reader.read() except asyncio.CancelledError: self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._response.close() raise except Exception as exc: self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._exception = exc self._response.close() return True if msg.type == WSMsgType.CLOSE: self._close_code = msg.data self._response.close() return True else: return False async def receive(self, timeout: Optional[float] = None) -> WSMessage: while True: if self._waiting is not None: raise RuntimeError("Concurrent call to receive() is not allowed") if self._closed: return WS_CLOSED_MESSAGE elif self._closing: await self.close() return WS_CLOSED_MESSAGE try: self._waiting = self._loop.create_future() try: async with async_timeout.timeout(timeout or self._receive_timeout): msg = await self._reader.read() self._reset_heartbeat() finally: waiter = self._waiting self._waiting = None set_result(waiter, True) except (asyncio.CancelledError, asyncio.TimeoutError): self._close_code = WSCloseCode.ABNORMAL_CLOSURE raise except EofStream: self._close_code = WSCloseCode.OK await self.close() return WSMessage(WSMsgType.CLOSED, None, None) except ClientError: self._closed = True self._close_code = WSCloseCode.ABNORMAL_CLOSURE return WS_CLOSED_MESSAGE except WebSocketError as exc: self._close_code = exc.code await self.close(code=exc.code) return WSMessage(WSMsgType.ERROR, exc, None) except Exception as exc: self._exception = exc self._closing = True self._close_code = WSCloseCode.ABNORMAL_CLOSURE await self.close() return WSMessage(WSMsgType.ERROR, exc, None) if msg.type == WSMsgType.CLOSE: self._closing = True self._close_code = msg.data if not self._closed and self._autoclose: await self.close() elif msg.type == WSMsgType.CLOSING: self._closing = True elif msg.type == WSMsgType.PING and self._autoping: await self.pong(msg.data) continue elif msg.type == WSMsgType.PONG and self._autoping: continue return msg async def receive_str(self, *, timeout: Optional[float] = None) -> str: msg = await self.receive(timeout) if msg.type != WSMsgType.TEXT: raise TypeError(f"Received message {msg.type}:{msg.data!r} is not str") return cast(str, msg.data) async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: msg = await self.receive(timeout) if msg.type != WSMsgType.BINARY: raise TypeError(f"Received message {msg.type}:{msg.data!r} is not bytes") return cast(bytes, msg.data) async def receive_json( self, *, loads: JSONDecoder = DEFAULT_JSON_DECODER, timeout: Optional[float] = None, ) -> Any: data = await self.receive_str(timeout=timeout) return loads(data) def __aiter__(self) -> "ClientWebSocketResponse": return self async def __anext__(self) -> WSMessage: msg = await self.receive() if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): raise StopAsyncIteration return msg ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/connector.py0000644000175100001710000014324600000000000016561 0ustar00runnerdockerimport asyncio import functools import random import sys import traceback import warnings from collections import defaultdict, deque from contextlib import suppress from http.cookies import SimpleCookie from itertools import cycle, islice from time import monotonic from types import TracebackType from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, DefaultDict, Dict, Iterator, List, Optional, Set, Tuple, Type, Union, cast, ) import attr from . import hdrs, helpers from .abc import AbstractResolver from .client_exceptions import ( ClientConnectionError, ClientConnectorCertificateError, ClientConnectorError, ClientConnectorSSLError, ClientHttpProxyError, ClientProxyConnectionError, ServerFingerprintMismatch, UnixClientConnectorError, cert_errors, ssl_errors, ) from .client_proto import ResponseHandler from .client_reqrep import ClientRequest, Fingerprint, _merge_ssl_params from .helpers import ( PY_36, ceil_timeout, get_running_loop, is_ip_address, noop, sentinel, ) from .http import RESPONSES from .locks import EventResultOrError from .resolver import DefaultResolver try: import ssl SSLContext = ssl.SSLContext except ImportError: # pragma: no cover ssl = None # type: ignore[assignment] SSLContext = object # type: ignore[misc,assignment] __all__ = ("BaseConnector", "TCPConnector", "UnixConnector", "NamedPipeConnector") if TYPE_CHECKING: # pragma: no cover from .client import ClientTimeout from .client_reqrep import ConnectionKey from .tracing import Trace class _DeprecationWaiter: __slots__ = ("_awaitable", "_awaited") def __init__(self, awaitable: Awaitable[Any]) -> None: self._awaitable = awaitable self._awaited = False def __await__(self) -> Any: self._awaited = True return self._awaitable.__await__() def __del__(self) -> None: if not self._awaited: warnings.warn( "Connector.close() is a coroutine, " "please use await connector.close()", DeprecationWarning, ) class Connection: _source_traceback = None _transport = None def __init__( self, connector: "BaseConnector", key: "ConnectionKey", protocol: ResponseHandler, loop: asyncio.AbstractEventLoop, ) -> None: self._key = key self._connector = connector self._loop = loop self._protocol = protocol # type: Optional[ResponseHandler] self._callbacks = [] # type: List[Callable[[], None]] if loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1)) def __repr__(self) -> str: return f"Connection<{self._key}>" def __del__(self, _warnings: Any = warnings) -> None: if self._protocol is not None: if PY_36: kwargs = {"source": self} else: kwargs = {} _warnings.warn(f"Unclosed connection {self!r}", ResourceWarning, **kwargs) if self._loop.is_closed(): return self._connector._release(self._key, self._protocol, should_close=True) context = {"client_connection": self, "message": "Unclosed connection"} if self._source_traceback is not None: context["source_traceback"] = self._source_traceback self._loop.call_exception_handler(context) @property def loop(self) -> asyncio.AbstractEventLoop: warnings.warn( "connector.loop property is deprecated", DeprecationWarning, stacklevel=2 ) return self._loop @property def transport(self) -> Optional[asyncio.Transport]: if self._protocol is None: return None return self._protocol.transport @property def protocol(self) -> Optional[ResponseHandler]: return self._protocol def add_callback(self, callback: Callable[[], None]) -> None: if callback is not None: self._callbacks.append(callback) def _notify_release(self) -> None: callbacks, self._callbacks = self._callbacks[:], [] for cb in callbacks: with suppress(Exception): cb() def close(self) -> None: self._notify_release() if self._protocol is not None: self._connector._release(self._key, self._protocol, should_close=True) self._protocol = None def release(self) -> None: self._notify_release() if self._protocol is not None: self._connector._release( self._key, self._protocol, should_close=self._protocol.should_close ) self._protocol = None @property def closed(self) -> bool: return self._protocol is None or not self._protocol.is_connected() class _TransportPlaceholder: """placeholder for BaseConnector.connect function""" def close(self) -> None: pass class BaseConnector: """Base connector class. keepalive_timeout - (optional) Keep-alive timeout. force_close - Set to True to force close and do reconnect after each request (and between redirects). limit - The total number of simultaneous connections. limit_per_host - Number of simultaneous connections to one host. enable_cleanup_closed - Enables clean-up closed ssl transports. Disabled by default. loop - Optional event loop. """ _closed = True # prevent AttributeError in __del__ if ctor was failed _source_traceback = None # abort transport after 2 seconds (cleanup broken connections) _cleanup_closed_period = 2.0 def __init__( self, *, keepalive_timeout: Union[object, None, float] = sentinel, force_close: bool = False, limit: int = 100, limit_per_host: int = 0, enable_cleanup_closed: bool = False, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: if force_close: if keepalive_timeout is not None and keepalive_timeout is not sentinel: raise ValueError( "keepalive_timeout cannot " "be set if force_close is True" ) else: if keepalive_timeout is sentinel: keepalive_timeout = 15.0 loop = get_running_loop(loop) self._closed = False if loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1)) self._conns = ( {} ) # type: Dict[ConnectionKey, List[Tuple[ResponseHandler, float]]] self._limit = limit self._limit_per_host = limit_per_host self._acquired = set() # type: Set[ResponseHandler] self._acquired_per_host = defaultdict( set ) # type: DefaultDict[ConnectionKey, Set[ResponseHandler]] self._keepalive_timeout = cast(float, keepalive_timeout) self._force_close = force_close # {host_key: FIFO list of waiters} self._waiters = defaultdict(deque) # type: ignore[var-annotated] self._loop = loop self._factory = functools.partial(ResponseHandler, loop=loop) self.cookies = SimpleCookie() # type: SimpleCookie[str] # start keep-alive connection cleanup task self._cleanup_handle: Optional[asyncio.TimerHandle] = None # start cleanup closed transports task self._cleanup_closed_handle: Optional[asyncio.TimerHandle] = None self._cleanup_closed_disabled = not enable_cleanup_closed self._cleanup_closed_transports = [] # type: List[Optional[asyncio.Transport]] self._cleanup_closed() def __del__(self, _warnings: Any = warnings) -> None: if self._closed: return if not self._conns: return conns = [repr(c) for c in self._conns.values()] self._close() if PY_36: kwargs = {"source": self} else: kwargs = {} _warnings.warn(f"Unclosed connector {self!r}", ResourceWarning, **kwargs) context = { "connector": self, "connections": conns, "message": "Unclosed connector", } if self._source_traceback is not None: context["source_traceback"] = self._source_traceback self._loop.call_exception_handler(context) def __enter__(self) -> "BaseConnector": warnings.warn( '"witn Connector():" is deprecated, ' 'use "async with Connector():" instead', DeprecationWarning, ) return self def __exit__(self, *exc: Any) -> None: self.close() async def __aenter__(self) -> "BaseConnector": return self async def __aexit__( self, exc_type: Optional[Type[BaseException]] = None, exc_value: Optional[BaseException] = None, exc_traceback: Optional[TracebackType] = None, ) -> None: await self.close() @property def force_close(self) -> bool: """Ultimately close connection on releasing if True.""" return self._force_close @property def limit(self) -> int: """The total number for simultaneous connections. If limit is 0 the connector has no limit. The default limit size is 100. """ return self._limit @property def limit_per_host(self) -> int: """The limit for simultaneous connections to the same endpoint. Endpoints are the same if they are have equal (host, port, is_ssl) triple. """ return self._limit_per_host def _cleanup(self) -> None: """Cleanup unused transports.""" if self._cleanup_handle: self._cleanup_handle.cancel() # _cleanup_handle should be unset, otherwise _release() will not # recreate it ever! self._cleanup_handle = None now = self._loop.time() timeout = self._keepalive_timeout if self._conns: connections = {} deadline = now - timeout for key, conns in self._conns.items(): alive = [] for proto, use_time in conns: if proto.is_connected(): if use_time - deadline < 0: transport = proto.transport proto.close() if key.is_ssl and not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transport) else: alive.append((proto, use_time)) else: transport = proto.transport proto.close() if key.is_ssl and not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transport) if alive: connections[key] = alive self._conns = connections if self._conns: self._cleanup_handle = helpers.weakref_handle( self, "_cleanup", timeout, self._loop ) def _drop_acquired_per_host( self, key: "ConnectionKey", val: ResponseHandler ) -> None: acquired_per_host = self._acquired_per_host if key not in acquired_per_host: return conns = acquired_per_host[key] conns.remove(val) if not conns: del self._acquired_per_host[key] def _cleanup_closed(self) -> None: """Double confirmation for transport close. Some broken ssl servers may leave socket open without proper close. """ if self._cleanup_closed_handle: self._cleanup_closed_handle.cancel() for transport in self._cleanup_closed_transports: if transport is not None: transport.abort() self._cleanup_closed_transports = [] if not self._cleanup_closed_disabled: self._cleanup_closed_handle = helpers.weakref_handle( self, "_cleanup_closed", self._cleanup_closed_period, self._loop ) def close(self) -> Awaitable[None]: """Close all opened transports.""" self._close() return _DeprecationWaiter(noop()) def _close(self) -> None: if self._closed: return self._closed = True try: if self._loop.is_closed(): return # cancel cleanup task if self._cleanup_handle: self._cleanup_handle.cancel() # cancel cleanup close task if self._cleanup_closed_handle: self._cleanup_closed_handle.cancel() for data in self._conns.values(): for proto, t0 in data: proto.close() for proto in self._acquired: proto.close() for transport in self._cleanup_closed_transports: if transport is not None: transport.abort() finally: self._conns.clear() self._acquired.clear() self._waiters.clear() self._cleanup_handle = None self._cleanup_closed_transports.clear() self._cleanup_closed_handle = None @property def closed(self) -> bool: """Is connector closed. A readonly property. """ return self._closed def _available_connections(self, key: "ConnectionKey") -> int: """ Return number of available connections. The limit, limit_per_host and the connection key are taken into account. If it returns less than 1 means that there are no connections available. """ if self._limit: # total calc available connections available = self._limit - len(self._acquired) # check limit per host if ( self._limit_per_host and available > 0 and key in self._acquired_per_host ): acquired = self._acquired_per_host.get(key) assert acquired is not None available = self._limit_per_host - len(acquired) elif self._limit_per_host and key in self._acquired_per_host: # check limit per host acquired = self._acquired_per_host.get(key) assert acquired is not None available = self._limit_per_host - len(acquired) else: available = 1 return available async def connect( self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" ) -> Connection: """Get from pool or create new connection.""" key = req.connection_key available = self._available_connections(key) # Wait if there are no available connections or if there are/were # waiters (i.e. don't steal connection from a waiter about to wake up) if available <= 0 or key in self._waiters: fut = self._loop.create_future() # This connection will now count towards the limit. self._waiters[key].append(fut) if traces: for trace in traces: await trace.send_connection_queued_start() try: await fut except BaseException as e: if key in self._waiters: # remove a waiter even if it was cancelled, normally it's # removed when it's notified try: self._waiters[key].remove(fut) except ValueError: # fut may no longer be in list pass raise e finally: if key in self._waiters and not self._waiters[key]: del self._waiters[key] if traces: for trace in traces: await trace.send_connection_queued_end() proto = self._get(key) if proto is None: placeholder = cast(ResponseHandler, _TransportPlaceholder()) self._acquired.add(placeholder) self._acquired_per_host[key].add(placeholder) if traces: for trace in traces: await trace.send_connection_create_start() try: proto = await self._create_connection(req, traces, timeout) if self._closed: proto.close() raise ClientConnectionError("Connector is closed.") except BaseException: if not self._closed: self._acquired.remove(placeholder) self._drop_acquired_per_host(key, placeholder) self._release_waiter() raise else: if not self._closed: self._acquired.remove(placeholder) self._drop_acquired_per_host(key, placeholder) if traces: for trace in traces: await trace.send_connection_create_end() else: if traces: # Acquire the connection to prevent race conditions with limits placeholder = cast(ResponseHandler, _TransportPlaceholder()) self._acquired.add(placeholder) self._acquired_per_host[key].add(placeholder) for trace in traces: await trace.send_connection_reuseconn() self._acquired.remove(placeholder) self._drop_acquired_per_host(key, placeholder) self._acquired.add(proto) self._acquired_per_host[key].add(proto) return Connection(self, key, proto, self._loop) def _get(self, key: "ConnectionKey") -> Optional[ResponseHandler]: try: conns = self._conns[key] except KeyError: return None t1 = self._loop.time() while conns: proto, t0 = conns.pop() if proto.is_connected(): if t1 - t0 > self._keepalive_timeout: transport = proto.transport proto.close() # only for SSL transports if key.is_ssl and not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transport) else: if not conns: # The very last connection was reclaimed: drop the key del self._conns[key] return proto else: transport = proto.transport proto.close() if key.is_ssl and not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transport) # No more connections: drop the key del self._conns[key] return None def _release_waiter(self) -> None: """ Iterates over all waiters until one to be released is found. The one to be released is not finsihed and belongs to a host that has available connections. """ if not self._waiters: return # Having the dict keys ordered this avoids to iterate # at the same order at each call. queues = list(self._waiters.keys()) random.shuffle(queues) for key in queues: if self._available_connections(key) < 1: continue waiters = self._waiters[key] while waiters: waiter = waiters.popleft() if not waiter.done(): waiter.set_result(None) return def _release_acquired(self, key: "ConnectionKey", proto: ResponseHandler) -> None: if self._closed: # acquired connection is already released on connector closing return try: self._acquired.remove(proto) self._drop_acquired_per_host(key, proto) except KeyError: # pragma: no cover # this may be result of undetermenistic order of objects # finalization due garbage collection. pass else: self._release_waiter() def _release( self, key: "ConnectionKey", protocol: ResponseHandler, *, should_close: bool = False, ) -> None: if self._closed: # acquired connection is already released on connector closing return self._release_acquired(key, protocol) if self._force_close: should_close = True if should_close or protocol.should_close: transport = protocol.transport protocol.close() if key.is_ssl and not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transport) else: conns = self._conns.get(key) if conns is None: conns = self._conns[key] = [] conns.append((protocol, self._loop.time())) if self._cleanup_handle is None: self._cleanup_handle = helpers.weakref_handle( self, "_cleanup", self._keepalive_timeout, self._loop ) async def _create_connection( self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" ) -> ResponseHandler: raise NotImplementedError() class _DNSCacheTable: def __init__(self, ttl: Optional[float] = None) -> None: self._addrs_rr = ( {} ) # type: Dict[Tuple[str, int], Tuple[Iterator[Dict[str, Any]], int]] self._timestamps = {} # type: Dict[Tuple[str, int], float] self._ttl = ttl def __contains__(self, host: object) -> bool: return host in self._addrs_rr def add(self, key: Tuple[str, int], addrs: List[Dict[str, Any]]) -> None: self._addrs_rr[key] = (cycle(addrs), len(addrs)) if self._ttl: self._timestamps[key] = monotonic() def remove(self, key: Tuple[str, int]) -> None: self._addrs_rr.pop(key, None) if self._ttl: self._timestamps.pop(key, None) def clear(self) -> None: self._addrs_rr.clear() self._timestamps.clear() def next_addrs(self, key: Tuple[str, int]) -> List[Dict[str, Any]]: loop, length = self._addrs_rr[key] addrs = list(islice(loop, length)) # Consume one more element to shift internal state of `cycle` next(loop) return addrs def expired(self, key: Tuple[str, int]) -> bool: if self._ttl is None: return False return self._timestamps[key] + self._ttl < monotonic() class TCPConnector(BaseConnector): """TCP connector. verify_ssl - Set to True to check ssl certifications. fingerprint - Pass the binary sha256 digest of the expected certificate in DER format to verify that the certificate the server presents matches. See also https://en.wikipedia.org/wiki/Transport_Layer_Security#Certificate_pinning resolver - Enable DNS lookups and use this resolver use_dns_cache - Use memory cache for DNS lookups. ttl_dns_cache - Max seconds having cached a DNS entry, None forever. family - socket address family local_addr - local tuple of (host, port) to bind socket to keepalive_timeout - (optional) Keep-alive timeout. force_close - Set to True to force close and do reconnect after each request (and between redirects). limit - The total number of simultaneous connections. limit_per_host - Number of simultaneous connections to one host. enable_cleanup_closed - Enables clean-up closed ssl transports. Disabled by default. loop - Optional event loop. """ def __init__( self, *, verify_ssl: bool = True, fingerprint: Optional[bytes] = None, use_dns_cache: bool = True, ttl_dns_cache: Optional[int] = 10, family: int = 0, ssl_context: Optional[SSLContext] = None, ssl: Union[None, bool, Fingerprint, SSLContext] = None, local_addr: Optional[Tuple[str, int]] = None, resolver: Optional[AbstractResolver] = None, keepalive_timeout: Union[None, float, object] = sentinel, force_close: bool = False, limit: int = 100, limit_per_host: int = 0, enable_cleanup_closed: bool = False, loop: Optional[asyncio.AbstractEventLoop] = None, ): super().__init__( keepalive_timeout=keepalive_timeout, force_close=force_close, limit=limit, limit_per_host=limit_per_host, enable_cleanup_closed=enable_cleanup_closed, loop=loop, ) self._ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) if resolver is None: resolver = DefaultResolver(loop=self._loop) self._resolver = resolver self._use_dns_cache = use_dns_cache self._cached_hosts = _DNSCacheTable(ttl=ttl_dns_cache) self._throttle_dns_events = ( {} ) # type: Dict[Tuple[str, int], EventResultOrError] self._family = family self._local_addr = local_addr def close(self) -> Awaitable[None]: """Close all ongoing DNS calls.""" for ev in self._throttle_dns_events.values(): ev.cancel() return super().close() @property def family(self) -> int: """Socket family like AF_INET.""" return self._family @property def use_dns_cache(self) -> bool: """True if local DNS caching is enabled.""" return self._use_dns_cache def clear_dns_cache( self, host: Optional[str] = None, port: Optional[int] = None ) -> None: """Remove specified host/port or clear all dns local cache.""" if host is not None and port is not None: self._cached_hosts.remove((host, port)) elif host is not None or port is not None: raise ValueError("either both host and port " "or none of them are allowed") else: self._cached_hosts.clear() async def _resolve_host( self, host: str, port: int, traces: Optional[List["Trace"]] = None ) -> List[Dict[str, Any]]: if is_ip_address(host): return [ { "hostname": host, "host": host, "port": port, "family": self._family, "proto": 0, "flags": 0, } ] if not self._use_dns_cache: if traces: for trace in traces: await trace.send_dns_resolvehost_start(host) res = await self._resolver.resolve(host, port, family=self._family) if traces: for trace in traces: await trace.send_dns_resolvehost_end(host) return res key = (host, port) if (key in self._cached_hosts) and (not self._cached_hosts.expired(key)): # get result early, before any await (#4014) result = self._cached_hosts.next_addrs(key) if traces: for trace in traces: await trace.send_dns_cache_hit(host) return result if key in self._throttle_dns_events: # get event early, before any await (#4014) event = self._throttle_dns_events[key] if traces: for trace in traces: await trace.send_dns_cache_hit(host) await event.wait() else: # update dict early, before any await (#4014) self._throttle_dns_events[key] = EventResultOrError(self._loop) if traces: for trace in traces: await trace.send_dns_cache_miss(host) try: if traces: for trace in traces: await trace.send_dns_resolvehost_start(host) addrs = await self._resolver.resolve(host, port, family=self._family) if traces: for trace in traces: await trace.send_dns_resolvehost_end(host) self._cached_hosts.add(key, addrs) self._throttle_dns_events[key].set() except BaseException as e: # any DNS exception, independently of the implementation # is set for the waiters to raise the same exception. self._throttle_dns_events[key].set(exc=e) raise finally: self._throttle_dns_events.pop(key) return self._cached_hosts.next_addrs(key) async def _create_connection( self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" ) -> ResponseHandler: """Create connection. Has same keyword arguments as BaseEventLoop.create_connection. """ if req.proxy: _, proto = await self._create_proxy_connection(req, traces, timeout) else: _, proto = await self._create_direct_connection(req, traces, timeout) return proto @staticmethod @functools.lru_cache(None) def _make_ssl_context(verified: bool) -> SSLContext: if verified: return ssl.create_default_context() else: sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) sslcontext.options |= ssl.OP_NO_SSLv2 sslcontext.options |= ssl.OP_NO_SSLv3 sslcontext.check_hostname = False sslcontext.verify_mode = ssl.CERT_NONE try: sslcontext.options |= ssl.OP_NO_COMPRESSION except AttributeError as attr_err: warnings.warn( "{!s}: The Python interpreter is compiled " "against OpenSSL < 1.0.0. Ref: " "https://docs.python.org/3/library/ssl.html" "#ssl.OP_NO_COMPRESSION".format(attr_err), ) sslcontext.set_default_verify_paths() return sslcontext def _get_ssl_context(self, req: "ClientRequest") -> Optional[SSLContext]: """Logic to get the correct SSL context 0. if req.ssl is false, return None 1. if ssl_context is specified in req, use it 2. if _ssl_context is specified in self, use it 3. otherwise: 1. if verify_ssl is not specified in req, use self.ssl_context (will generate a default context according to self.verify_ssl) 2. if verify_ssl is True in req, generate a default SSL context 3. if verify_ssl is False in req, generate a SSL context that won't verify """ if req.is_ssl(): if ssl is None: # pragma: no cover raise RuntimeError("SSL is not supported.") sslcontext = req.ssl if isinstance(sslcontext, ssl.SSLContext): return sslcontext if sslcontext is not None: # not verified or fingerprinted return self._make_ssl_context(False) sslcontext = self._ssl if isinstance(sslcontext, ssl.SSLContext): return sslcontext if sslcontext is not None: # not verified or fingerprinted return self._make_ssl_context(False) return self._make_ssl_context(True) else: return None def _get_fingerprint(self, req: "ClientRequest") -> Optional["Fingerprint"]: ret = req.ssl if isinstance(ret, Fingerprint): return ret ret = self._ssl if isinstance(ret, Fingerprint): return ret return None async def _wrap_create_connection( self, *args: Any, req: "ClientRequest", timeout: "ClientTimeout", client_error: Type[Exception] = ClientConnectorError, **kwargs: Any, ) -> Tuple[asyncio.Transport, ResponseHandler]: try: async with ceil_timeout(timeout.sock_connect): return await self._loop.create_connection(*args, **kwargs) # type: ignore[return-value] # noqa except cert_errors as exc: raise ClientConnectorCertificateError(req.connection_key, exc) from exc except ssl_errors as exc: raise ClientConnectorSSLError(req.connection_key, exc) from exc except OSError as exc: raise client_error(req.connection_key, exc) from exc def _fail_on_no_start_tls(self, req: "ClientRequest") -> None: """Raise a :py:exc:`RuntimeError` on missing ``start_tls()``. One case is that :py:meth:`asyncio.loop.start_tls` is not yet implemented under Python 3.6. It is necessary for TLS-in-TLS so that it is possible to send HTTPS queries through HTTPS proxies. This doesn't affect regular HTTP requests, though. """ if not req.is_ssl(): return proxy_url = req.proxy assert proxy_url is not None if proxy_url.scheme != "https": return self._check_loop_for_start_tls() def _check_loop_for_start_tls(self) -> None: try: self._loop.start_tls except AttributeError as attr_exc: raise RuntimeError( "An HTTPS request is being sent through an HTTPS proxy. " "This needs support for TLS in TLS but it is not implemented " "in your runtime for the stdlib asyncio.\n\n" "Please upgrade to Python 3.7 or higher. For more details, " "please see:\n" "* https://bugs.python.org/issue37179\n" "* https://github.com/python/cpython/pull/28073\n" "* https://docs.aiohttp.org/en/stable/" "client_advanced.html#proxy-support\n" "* https://github.com/aio-libs/aiohttp/discussions/6044\n", ) from attr_exc def _loop_supports_start_tls(self) -> bool: try: self._check_loop_for_start_tls() except RuntimeError: return False else: return True def _warn_about_tls_in_tls( self, underlying_transport: asyncio.Transport, req: "ClientRequest", ) -> None: """Issue a warning if the requested URL has HTTPS scheme.""" if req.request_info.url.scheme != "https": return asyncio_supports_tls_in_tls = getattr( underlying_transport, "_start_tls_compatible", False, ) if asyncio_supports_tls_in_tls: return warnings.warn( "An HTTPS request is being sent through an HTTPS proxy. " "This support for TLS in TLS is known to be disabled " "in the stdlib asyncio. This is why you'll probably see " "an error in the log below.\n\n" "It is possible to enable it via monkeypatching under " "Python 3.7 or higher. For more details, see:\n" "* https://bugs.python.org/issue37179\n" "* https://github.com/python/cpython/pull/28073\n\n" "You can temporarily patch this as follows:\n" "* https://docs.aiohttp.org/en/stable/client_advanced.html#proxy-support\n" "* https://github.com/aio-libs/aiohttp/discussions/6044\n", RuntimeWarning, source=self, # Why `4`? At least 3 of the calls in the stack originate # from the methods in this class. stacklevel=3, ) async def _start_tls_connection( self, underlying_transport: asyncio.Transport, req: "ClientRequest", timeout: "ClientTimeout", client_error: Type[Exception] = ClientConnectorError, ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: """Wrap the raw TCP transport with TLS.""" tls_proto = self._factory() # Create a brand new proto for TLS # Safety of the `cast()` call here is based on the fact that # internally `_get_ssl_context()` only returns `None` when # `req.is_ssl()` evaluates to `False` which is never gonna happen # in this code path. Of course, it's rather fragile # maintainability-wise but this is to be solved separately. sslcontext = cast(ssl.SSLContext, self._get_ssl_context(req)) try: async with ceil_timeout(timeout.sock_connect): try: tls_transport = await self._loop.start_tls( underlying_transport, tls_proto, sslcontext, server_hostname=req.host, ssl_handshake_timeout=timeout.total, ) except BaseException: # We need to close the underlying transport since # `start_tls()` probably failed before it had a # chance to do this: underlying_transport.close() raise except cert_errors as exc: raise ClientConnectorCertificateError(req.connection_key, exc) from exc except ssl_errors as exc: raise ClientConnectorSSLError(req.connection_key, exc) from exc except OSError as exc: raise client_error(req.connection_key, exc) from exc except TypeError as type_err: # Example cause looks like this: # TypeError: transport is not supported by start_tls() raise ClientConnectionError( "Cannot initialize a TLS-in-TLS connection to host " f"{req.host!s}:{req.port:d} through an underlying connection " f"to an HTTPS proxy {req.proxy!s} ssl:{req.ssl or 'default'} " f"[{type_err!s}]" ) from type_err else: tls_proto.connection_made( tls_transport ) # Kick the state machine of the new TLS protocol return tls_transport, tls_proto async def _create_direct_connection( self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout", *, client_error: Type[Exception] = ClientConnectorError, ) -> Tuple[asyncio.Transport, ResponseHandler]: sslcontext = self._get_ssl_context(req) fingerprint = self._get_fingerprint(req) host = req.url.raw_host assert host is not None port = req.port assert port is not None host_resolved = asyncio.ensure_future( self._resolve_host(host, port, traces=traces), loop=self._loop ) try: # Cancelling this lookup should not cancel the underlying lookup # or else the cancel event will get broadcast to all the waiters # across all connections. hosts = await asyncio.shield(host_resolved) except asyncio.CancelledError: def drop_exception(fut: "asyncio.Future[List[Dict[str, Any]]]") -> None: with suppress(Exception, asyncio.CancelledError): fut.result() host_resolved.add_done_callback(drop_exception) raise except OSError as exc: # in case of proxy it is not ClientProxyConnectionError # it is problem of resolving proxy ip itself raise ClientConnectorError(req.connection_key, exc) from exc last_exc = None # type: Optional[Exception] for hinfo in hosts: host = hinfo["host"] port = hinfo["port"] try: transp, proto = await self._wrap_create_connection( self._factory, host, port, timeout=timeout, ssl=sslcontext, family=hinfo["family"], proto=hinfo["proto"], flags=hinfo["flags"], server_hostname=hinfo["hostname"] if sslcontext else None, local_addr=self._local_addr, req=req, client_error=client_error, ) except ClientConnectorError as exc: last_exc = exc continue if req.is_ssl() and fingerprint: try: fingerprint.check(transp) except ServerFingerprintMismatch as exc: transp.close() if not self._cleanup_closed_disabled: self._cleanup_closed_transports.append(transp) last_exc = exc continue return transp, proto else: assert last_exc is not None raise last_exc async def _create_proxy_connection( self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: self._fail_on_no_start_tls(req) runtime_has_start_tls = self._loop_supports_start_tls() headers = {} # type: Dict[str, str] if req.proxy_headers is not None: headers = req.proxy_headers # type: ignore[assignment] headers[hdrs.HOST] = req.headers[hdrs.HOST] url = req.proxy assert url is not None proxy_req = ClientRequest( hdrs.METH_GET, url, headers=headers, auth=req.proxy_auth, loop=self._loop, ssl=req.ssl, ) # create connection to proxy server transport, proto = await self._create_direct_connection( proxy_req, [], timeout, client_error=ClientProxyConnectionError ) # Many HTTP proxies has buggy keepalive support. Let's not # reuse connection but close it after processing every # response. proto.force_close() auth = proxy_req.headers.pop(hdrs.AUTHORIZATION, None) if auth is not None: if not req.is_ssl(): req.headers[hdrs.PROXY_AUTHORIZATION] = auth else: proxy_req.headers[hdrs.PROXY_AUTHORIZATION] = auth if req.is_ssl(): if runtime_has_start_tls: self._warn_about_tls_in_tls(transport, req) # For HTTPS requests over HTTP proxy # we must notify proxy to tunnel connection # so we send CONNECT command: # CONNECT www.python.org:443 HTTP/1.1 # Host: www.python.org # # next we must do TLS handshake and so on # to do this we must wrap raw socket into secure one # asyncio handles this perfectly proxy_req.method = hdrs.METH_CONNECT proxy_req.url = req.url key = attr.evolve( req.connection_key, proxy=None, proxy_auth=None, proxy_headers_hash=None ) conn = Connection(self, key, proto, self._loop) proxy_resp = await proxy_req.send(conn) try: protocol = conn._protocol assert protocol is not None # read_until_eof=True will ensure the connection isn't closed # once the response is received and processed allowing # START_TLS to work on the connection below. protocol.set_response_params(read_until_eof=runtime_has_start_tls) resp = await proxy_resp.start(conn) except BaseException: proxy_resp.close() conn.close() raise else: conn._protocol = None conn._transport = None try: if resp.status != 200: message = resp.reason if message is None: message = RESPONSES[resp.status][0] raise ClientHttpProxyError( proxy_resp.request_info, resp.history, status=resp.status, message=message, headers=resp.headers, ) if not runtime_has_start_tls: rawsock = transport.get_extra_info("socket", default=None) if rawsock is None: raise RuntimeError( "Transport does not expose socket instance" ) # Duplicate the socket, so now we can close proxy transport rawsock = rawsock.dup() except BaseException: # It shouldn't be closed in `finally` because it's fed to # `loop.start_tls()` and the docs say not to touch it after # passing there. transport.close() raise finally: if not runtime_has_start_tls: transport.close() if not runtime_has_start_tls: # HTTP proxy with support for upgrade to HTTPS sslcontext = self._get_ssl_context(req) return await self._wrap_create_connection( self._factory, timeout=timeout, ssl=sslcontext, sock=rawsock, server_hostname=req.host, req=req, ) return await self._start_tls_connection( # Access the old transport for the last time before it's # closed and forgotten forever: transport, req=req, timeout=timeout, ) finally: proxy_resp.close() return transport, proto class UnixConnector(BaseConnector): """Unix socket connector. path - Unix socket path. keepalive_timeout - (optional) Keep-alive timeout. force_close - Set to True to force close and do reconnect after each request (and between redirects). limit - The total number of simultaneous connections. limit_per_host - Number of simultaneous connections to one host. loop - Optional event loop. """ def __init__( self, path: str, force_close: bool = False, keepalive_timeout: Union[object, float, None] = sentinel, limit: int = 100, limit_per_host: int = 0, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: super().__init__( force_close=force_close, keepalive_timeout=keepalive_timeout, limit=limit, limit_per_host=limit_per_host, loop=loop, ) self._path = path @property def path(self) -> str: """Path to unix socket.""" return self._path async def _create_connection( self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" ) -> ResponseHandler: try: async with ceil_timeout(timeout.sock_connect): _, proto = await self._loop.create_unix_connection( self._factory, self._path ) except OSError as exc: raise UnixClientConnectorError(self.path, req.connection_key, exc) from exc return cast(ResponseHandler, proto) class NamedPipeConnector(BaseConnector): """Named pipe connector. Only supported by the proactor event loop. See also: https://docs.python.org/3.7/library/asyncio-eventloop.html path - Windows named pipe path. keepalive_timeout - (optional) Keep-alive timeout. force_close - Set to True to force close and do reconnect after each request (and between redirects). limit - The total number of simultaneous connections. limit_per_host - Number of simultaneous connections to one host. loop - Optional event loop. """ def __init__( self, path: str, force_close: bool = False, keepalive_timeout: Union[object, float, None] = sentinel, limit: int = 100, limit_per_host: int = 0, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: super().__init__( force_close=force_close, keepalive_timeout=keepalive_timeout, limit=limit, limit_per_host=limit_per_host, loop=loop, ) if not isinstance( self._loop, asyncio.ProactorEventLoop # type: ignore[attr-defined] ): raise RuntimeError( "Named Pipes only available in proactor " "loop under windows" ) self._path = path @property def path(self) -> str: """Path to the named pipe.""" return self._path async def _create_connection( self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" ) -> ResponseHandler: try: async with ceil_timeout(timeout.sock_connect): _, proto = await self._loop.create_pipe_connection( # type: ignore[attr-defined] # noqa: E501 self._factory, self._path ) # the drain is required so that the connection_made is called # and transport is set otherwise it is not set before the # `assert conn.transport is not None` # in client.py's _request method await asyncio.sleep(0) # other option is to manually set transport like # `proto.transport = trans` except OSError as exc: raise ClientConnectorError(req.connection_key, exc) from exc return cast(ResponseHandler, proto) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/cookiejar.py0000644000175100001710000003240200000000000016524 0ustar00runnerdockerimport asyncio import contextlib import datetime import os # noqa import pathlib import pickle import re from collections import defaultdict from http.cookies import BaseCookie, Morsel, SimpleCookie from typing import ( # noqa DefaultDict, Dict, Iterable, Iterator, List, Mapping, Optional, Set, Tuple, Union, cast, ) from yarl import URL from .abc import AbstractCookieJar, ClearCookiePredicate from .helpers import is_ip_address, next_whole_second from .typedefs import LooseCookies, PathLike, StrOrURL __all__ = ("CookieJar", "DummyCookieJar") CookieItem = Union[str, "Morsel[str]"] class CookieJar(AbstractCookieJar): """Implements cookie storage adhering to RFC 6265.""" DATE_TOKENS_RE = re.compile( r"[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]*" r"(?P[\x00-\x08\x0A-\x1F\d:a-zA-Z\x7F-\xFF]+)" ) DATE_HMS_TIME_RE = re.compile(r"(\d{1,2}):(\d{1,2}):(\d{1,2})") DATE_DAY_OF_MONTH_RE = re.compile(r"(\d{1,2})") DATE_MONTH_RE = re.compile( "(jan)|(feb)|(mar)|(apr)|(may)|(jun)|(jul)|" "(aug)|(sep)|(oct)|(nov)|(dec)", re.I, ) DATE_YEAR_RE = re.compile(r"(\d{2,4})") MAX_TIME = datetime.datetime.max.replace(tzinfo=datetime.timezone.utc) MAX_32BIT_TIME = datetime.datetime.utcfromtimestamp(2 ** 31 - 1) def __init__( self, *, unsafe: bool = False, quote_cookie: bool = True, treat_as_secure_origin: Union[StrOrURL, List[StrOrURL], None] = None, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: super().__init__(loop=loop) self._cookies = defaultdict( SimpleCookie ) # type: DefaultDict[str, SimpleCookie[str]] self._host_only_cookies = set() # type: Set[Tuple[str, str]] self._unsafe = unsafe self._quote_cookie = quote_cookie if treat_as_secure_origin is None: treat_as_secure_origin = [] elif isinstance(treat_as_secure_origin, URL): treat_as_secure_origin = [treat_as_secure_origin.origin()] elif isinstance(treat_as_secure_origin, str): treat_as_secure_origin = [URL(treat_as_secure_origin).origin()] else: treat_as_secure_origin = [ URL(url).origin() if isinstance(url, str) else url.origin() for url in treat_as_secure_origin ] self._treat_as_secure_origin = treat_as_secure_origin self._next_expiration = next_whole_second() self._expirations = {} # type: Dict[Tuple[str, str], datetime.datetime] # #4515: datetime.max may not be representable on 32-bit platforms self._max_time = self.MAX_TIME try: self._max_time.timestamp() except OverflowError: self._max_time = self.MAX_32BIT_TIME def save(self, file_path: PathLike) -> None: file_path = pathlib.Path(file_path) with file_path.open(mode="wb") as f: pickle.dump(self._cookies, f, pickle.HIGHEST_PROTOCOL) def load(self, file_path: PathLike) -> None: file_path = pathlib.Path(file_path) with file_path.open(mode="rb") as f: self._cookies = pickle.load(f) def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: if predicate is None: self._next_expiration = next_whole_second() self._cookies.clear() self._host_only_cookies.clear() self._expirations.clear() return to_del = [] now = datetime.datetime.now(datetime.timezone.utc) for domain, cookie in self._cookies.items(): for name, morsel in cookie.items(): key = (domain, name) if ( key in self._expirations and self._expirations[key] <= now ) or predicate(morsel): to_del.append(key) for domain, name in to_del: key = (domain, name) self._host_only_cookies.discard(key) if key in self._expirations: del self._expirations[(domain, name)] self._cookies[domain].pop(name, None) next_expiration = min(self._expirations.values(), default=self._max_time) try: self._next_expiration = next_expiration.replace( microsecond=0 ) + datetime.timedelta(seconds=1) except OverflowError: self._next_expiration = self._max_time def clear_domain(self, domain: str) -> None: self.clear(lambda x: self._is_domain_match(domain, x["domain"])) def __iter__(self) -> "Iterator[Morsel[str]]": self._do_expiration() for val in self._cookies.values(): yield from val.values() def __len__(self) -> int: return sum(1 for i in self) def _do_expiration(self) -> None: self.clear(lambda x: False) def _expire_cookie(self, when: datetime.datetime, domain: str, name: str) -> None: self._next_expiration = min(self._next_expiration, when) self._expirations[(domain, name)] = when def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: """Update cookies.""" hostname = response_url.raw_host if not self._unsafe and is_ip_address(hostname): # Don't accept cookies from IPs return if isinstance(cookies, Mapping): cookies = cookies.items() for name, cookie in cookies: if not isinstance(cookie, Morsel): tmp = SimpleCookie() # type: SimpleCookie[str] tmp[name] = cookie # type: ignore[assignment] cookie = tmp[name] domain = cookie["domain"] # ignore domains with trailing dots if domain.endswith("."): domain = "" del cookie["domain"] if not domain and hostname is not None: # Set the cookie's domain to the response hostname # and set its host-only-flag self._host_only_cookies.add((hostname, name)) domain = cookie["domain"] = hostname if domain.startswith("."): # Remove leading dot domain = domain[1:] cookie["domain"] = domain if hostname and not self._is_domain_match(domain, hostname): # Setting cookies for different domains is not allowed continue path = cookie["path"] if not path or not path.startswith("/"): # Set the cookie's path to the response path path = response_url.path if not path.startswith("/"): path = "/" else: # Cut everything from the last slash to the end path = "/" + path[1 : path.rfind("/")] cookie["path"] = path max_age = cookie["max-age"] if max_age: try: delta_seconds = int(max_age) try: max_age_expiration = datetime.datetime.now( datetime.timezone.utc ) + datetime.timedelta(seconds=delta_seconds) except OverflowError: max_age_expiration = self._max_time self._expire_cookie(max_age_expiration, domain, name) except ValueError: cookie["max-age"] = "" else: expires = cookie["expires"] if expires: expire_time = self._parse_date(expires) if expire_time: self._expire_cookie(expire_time, domain, name) else: cookie["expires"] = "" self._cookies[domain][name] = cookie self._do_expiration() def filter_cookies( self, request_url: URL = URL() ) -> Union["BaseCookie[str]", "SimpleCookie[str]"]: """Returns this jar's cookies filtered by their attributes.""" self._do_expiration() request_url = URL(request_url) filtered: Union["SimpleCookie[str]", "BaseCookie[str]"] = ( SimpleCookie() if self._quote_cookie else BaseCookie() ) hostname = request_url.raw_host or "" request_origin = URL() with contextlib.suppress(ValueError): request_origin = request_url.origin() is_not_secure = ( request_url.scheme not in ("https", "wss") and request_origin not in self._treat_as_secure_origin ) for cookie in self: name = cookie.key domain = cookie["domain"] # Send shared cookies if not domain: filtered[name] = cookie.value continue if not self._unsafe and is_ip_address(hostname): continue if (domain, name) in self._host_only_cookies: if domain != hostname: continue elif not self._is_domain_match(domain, hostname): continue if not self._is_path_match(request_url.path, cookie["path"]): continue if is_not_secure and cookie["secure"]: continue # It's critical we use the Morsel so the coded_value # (based on cookie version) is preserved mrsl_val = cast("Morsel[str]", cookie.get(cookie.key, Morsel())) mrsl_val.set(cookie.key, cookie.value, cookie.coded_value) filtered[name] = mrsl_val return filtered @staticmethod def _is_domain_match(domain: str, hostname: str) -> bool: """Implements domain matching adhering to RFC 6265.""" if hostname == domain: return True if not hostname.endswith(domain): return False non_matching = hostname[: -len(domain)] if not non_matching.endswith("."): return False return not is_ip_address(hostname) @staticmethod def _is_path_match(req_path: str, cookie_path: str) -> bool: """Implements path matching adhering to RFC 6265.""" if not req_path.startswith("/"): req_path = "/" if req_path == cookie_path: return True if not req_path.startswith(cookie_path): return False if cookie_path.endswith("/"): return True non_matching = req_path[len(cookie_path) :] return non_matching.startswith("/") @classmethod def _parse_date(cls, date_str: str) -> Optional[datetime.datetime]: """Implements date string parsing adhering to RFC 6265.""" if not date_str: return None found_time = False found_day = False found_month = False found_year = False hour = minute = second = 0 day = 0 month = 0 year = 0 for token_match in cls.DATE_TOKENS_RE.finditer(date_str): token = token_match.group("token") if not found_time: time_match = cls.DATE_HMS_TIME_RE.match(token) if time_match: found_time = True hour, minute, second = (int(s) for s in time_match.groups()) continue if not found_day: day_match = cls.DATE_DAY_OF_MONTH_RE.match(token) if day_match: found_day = True day = int(day_match.group()) continue if not found_month: month_match = cls.DATE_MONTH_RE.match(token) if month_match: found_month = True assert month_match.lastindex is not None month = month_match.lastindex continue if not found_year: year_match = cls.DATE_YEAR_RE.match(token) if year_match: found_year = True year = int(year_match.group()) if 70 <= year <= 99: year += 1900 elif 0 <= year <= 69: year += 2000 if False in (found_day, found_month, found_year, found_time): return None if not 1 <= day <= 31: return None if year < 1601 or hour > 23 or minute > 59 or second > 59: return None return datetime.datetime( year, month, day, hour, minute, second, tzinfo=datetime.timezone.utc ) class DummyCookieJar(AbstractCookieJar): """Implements a dummy cookie storage. It can be used with the ClientSession when no cookie processing is needed. """ def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: super().__init__(loop=loop) def __iter__(self) -> "Iterator[Morsel[str]]": while False: yield None def __len__(self) -> int: return 0 def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: pass def clear_domain(self, domain: str) -> None: pass def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: pass def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": return SimpleCookie() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/formdata.py0000644000175100001710000001375200000000000016362 0ustar00runnerdockerimport io from typing import Any, Iterable, List, Optional from urllib.parse import urlencode from multidict import MultiDict, MultiDictProxy from . import hdrs, multipart, payload from .helpers import guess_filename from .payload import Payload __all__ = ("FormData",) class FormData: """Helper class for form body generation. Supports multipart/form-data and application/x-www-form-urlencoded. """ def __init__( self, fields: Iterable[Any] = (), quote_fields: bool = True, charset: Optional[str] = None, ) -> None: self._writer = multipart.MultipartWriter("form-data") self._fields = [] # type: List[Any] self._is_multipart = False self._is_processed = False self._quote_fields = quote_fields self._charset = charset if isinstance(fields, dict): fields = list(fields.items()) elif not isinstance(fields, (list, tuple)): fields = (fields,) self.add_fields(*fields) @property def is_multipart(self) -> bool: return self._is_multipart def add_field( self, name: str, value: Any, *, content_type: Optional[str] = None, filename: Optional[str] = None, content_transfer_encoding: Optional[str] = None, ) -> None: if isinstance(value, io.IOBase): self._is_multipart = True elif isinstance(value, (bytes, bytearray, memoryview)): if filename is None and content_transfer_encoding is None: filename = name type_options = MultiDict({"name": name}) # type: MultiDict[str] if filename is not None and not isinstance(filename, str): raise TypeError( "filename must be an instance of str. " "Got: %s" % filename ) if filename is None and isinstance(value, io.IOBase): filename = guess_filename(value, name) if filename is not None: type_options["filename"] = filename self._is_multipart = True headers = {} if content_type is not None: if not isinstance(content_type, str): raise TypeError( "content_type must be an instance of str. " "Got: %s" % content_type ) headers[hdrs.CONTENT_TYPE] = content_type self._is_multipart = True if content_transfer_encoding is not None: if not isinstance(content_transfer_encoding, str): raise TypeError( "content_transfer_encoding must be an instance" " of str. Got: %s" % content_transfer_encoding ) headers[hdrs.CONTENT_TRANSFER_ENCODING] = content_transfer_encoding self._is_multipart = True self._fields.append((type_options, headers, value)) def add_fields(self, *fields: Any) -> None: to_add = list(fields) while to_add: rec = to_add.pop(0) if isinstance(rec, io.IOBase): k = guess_filename(rec, "unknown") self.add_field(k, rec) # type: ignore[arg-type] elif isinstance(rec, (MultiDictProxy, MultiDict)): to_add.extend(rec.items()) elif isinstance(rec, (list, tuple)) and len(rec) == 2: k, fp = rec self.add_field(k, fp) # type: ignore[arg-type] else: raise TypeError( "Only io.IOBase, multidict and (name, file) " "pairs allowed, use .add_field() for passing " "more complex parameters, got {!r}".format(rec) ) def _gen_form_urlencoded(self) -> payload.BytesPayload: # form data (x-www-form-urlencoded) data = [] for type_options, _, value in self._fields: data.append((type_options["name"], value)) charset = self._charset if self._charset is not None else "utf-8" if charset == "utf-8": content_type = "application/x-www-form-urlencoded" else: content_type = "application/x-www-form-urlencoded; " "charset=%s" % charset return payload.BytesPayload( urlencode(data, doseq=True, encoding=charset).encode(), content_type=content_type, ) def _gen_form_data(self) -> multipart.MultipartWriter: """Encode a list of fields using the multipart/form-data MIME format""" if self._is_processed: raise RuntimeError("Form data has been processed already") for dispparams, headers, value in self._fields: try: if hdrs.CONTENT_TYPE in headers: part = payload.get_payload( value, content_type=headers[hdrs.CONTENT_TYPE], headers=headers, encoding=self._charset, ) else: part = payload.get_payload( value, headers=headers, encoding=self._charset ) except Exception as exc: raise TypeError( "Can not serialize value type: %r\n " "headers: %r\n value: %r" % (type(value), headers, value) ) from exc if dispparams: part.set_content_disposition( "form-data", quote_fields=self._quote_fields, **dispparams ) # FIXME cgi.FieldStorage doesn't likes body parts with # Content-Length which were sent via chunked transfer encoding assert part.headers is not None part.headers.popall(hdrs.CONTENT_LENGTH, None) self._writer.append_payload(part) self._is_processed = True return self._writer def __call__(self) -> Payload: if self._is_multipart: return self._gen_form_data() else: return self._gen_form_urlencoded() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/hdrs.py0000644000175100001710000001116400000000000015520 0ustar00runnerdocker"""HTTP Headers constants.""" # After changing the file content call ./tools/gen.py # to regenerate the headers parser import sys from typing import Set from multidict import istr if sys.version_info >= (3, 8): from typing import Final else: from typing_extensions import Final METH_ANY: Final[str] = "*" METH_CONNECT: Final[str] = "CONNECT" METH_HEAD: Final[str] = "HEAD" METH_GET: Final[str] = "GET" METH_DELETE: Final[str] = "DELETE" METH_OPTIONS: Final[str] = "OPTIONS" METH_PATCH: Final[str] = "PATCH" METH_POST: Final[str] = "POST" METH_PUT: Final[str] = "PUT" METH_TRACE: Final[str] = "TRACE" METH_ALL: Final[Set[str]] = { METH_CONNECT, METH_HEAD, METH_GET, METH_DELETE, METH_OPTIONS, METH_PATCH, METH_POST, METH_PUT, METH_TRACE, } ACCEPT: Final[istr] = istr("Accept") ACCEPT_CHARSET: Final[istr] = istr("Accept-Charset") ACCEPT_ENCODING: Final[istr] = istr("Accept-Encoding") ACCEPT_LANGUAGE: Final[istr] = istr("Accept-Language") ACCEPT_RANGES: Final[istr] = istr("Accept-Ranges") ACCESS_CONTROL_MAX_AGE: Final[istr] = istr("Access-Control-Max-Age") ACCESS_CONTROL_ALLOW_CREDENTIALS: Final[istr] = istr("Access-Control-Allow-Credentials") ACCESS_CONTROL_ALLOW_HEADERS: Final[istr] = istr("Access-Control-Allow-Headers") ACCESS_CONTROL_ALLOW_METHODS: Final[istr] = istr("Access-Control-Allow-Methods") ACCESS_CONTROL_ALLOW_ORIGIN: Final[istr] = istr("Access-Control-Allow-Origin") ACCESS_CONTROL_EXPOSE_HEADERS: Final[istr] = istr("Access-Control-Expose-Headers") ACCESS_CONTROL_REQUEST_HEADERS: Final[istr] = istr("Access-Control-Request-Headers") ACCESS_CONTROL_REQUEST_METHOD: Final[istr] = istr("Access-Control-Request-Method") AGE: Final[istr] = istr("Age") ALLOW: Final[istr] = istr("Allow") AUTHORIZATION: Final[istr] = istr("Authorization") CACHE_CONTROL: Final[istr] = istr("Cache-Control") CONNECTION: Final[istr] = istr("Connection") CONTENT_DISPOSITION: Final[istr] = istr("Content-Disposition") CONTENT_ENCODING: Final[istr] = istr("Content-Encoding") CONTENT_LANGUAGE: Final[istr] = istr("Content-Language") CONTENT_LENGTH: Final[istr] = istr("Content-Length") CONTENT_LOCATION: Final[istr] = istr("Content-Location") CONTENT_MD5: Final[istr] = istr("Content-MD5") CONTENT_RANGE: Final[istr] = istr("Content-Range") CONTENT_TRANSFER_ENCODING: Final[istr] = istr("Content-Transfer-Encoding") CONTENT_TYPE: Final[istr] = istr("Content-Type") COOKIE: Final[istr] = istr("Cookie") DATE: Final[istr] = istr("Date") DESTINATION: Final[istr] = istr("Destination") DIGEST: Final[istr] = istr("Digest") ETAG: Final[istr] = istr("Etag") EXPECT: Final[istr] = istr("Expect") EXPIRES: Final[istr] = istr("Expires") FORWARDED: Final[istr] = istr("Forwarded") FROM: Final[istr] = istr("From") HOST: Final[istr] = istr("Host") IF_MATCH: Final[istr] = istr("If-Match") IF_MODIFIED_SINCE: Final[istr] = istr("If-Modified-Since") IF_NONE_MATCH: Final[istr] = istr("If-None-Match") IF_RANGE: Final[istr] = istr("If-Range") IF_UNMODIFIED_SINCE: Final[istr] = istr("If-Unmodified-Since") KEEP_ALIVE: Final[istr] = istr("Keep-Alive") LAST_EVENT_ID: Final[istr] = istr("Last-Event-ID") LAST_MODIFIED: Final[istr] = istr("Last-Modified") LINK: Final[istr] = istr("Link") LOCATION: Final[istr] = istr("Location") MAX_FORWARDS: Final[istr] = istr("Max-Forwards") ORIGIN: Final[istr] = istr("Origin") PRAGMA: Final[istr] = istr("Pragma") PROXY_AUTHENTICATE: Final[istr] = istr("Proxy-Authenticate") PROXY_AUTHORIZATION: Final[istr] = istr("Proxy-Authorization") RANGE: Final[istr] = istr("Range") REFERER: Final[istr] = istr("Referer") RETRY_AFTER: Final[istr] = istr("Retry-After") SEC_WEBSOCKET_ACCEPT: Final[istr] = istr("Sec-WebSocket-Accept") SEC_WEBSOCKET_VERSION: Final[istr] = istr("Sec-WebSocket-Version") SEC_WEBSOCKET_PROTOCOL: Final[istr] = istr("Sec-WebSocket-Protocol") SEC_WEBSOCKET_EXTENSIONS: Final[istr] = istr("Sec-WebSocket-Extensions") SEC_WEBSOCKET_KEY: Final[istr] = istr("Sec-WebSocket-Key") SEC_WEBSOCKET_KEY1: Final[istr] = istr("Sec-WebSocket-Key1") SERVER: Final[istr] = istr("Server") SET_COOKIE: Final[istr] = istr("Set-Cookie") TE: Final[istr] = istr("TE") TRAILER: Final[istr] = istr("Trailer") TRANSFER_ENCODING: Final[istr] = istr("Transfer-Encoding") UPGRADE: Final[istr] = istr("Upgrade") URI: Final[istr] = istr("URI") USER_AGENT: Final[istr] = istr("User-Agent") VARY: Final[istr] = istr("Vary") VIA: Final[istr] = istr("Via") WANT_DIGEST: Final[istr] = istr("Want-Digest") WARNING: Final[istr] = istr("Warning") WWW_AUTHENTICATE: Final[istr] = istr("WWW-Authenticate") X_FORWARDED_FOR: Final[istr] = istr("X-Forwarded-For") X_FORWARDED_HOST: Final[istr] = istr("X-Forwarded-Host") X_FORWARDED_PROTO: Final[istr] = istr("X-Forwarded-Proto") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/helpers.py0000644000175100001710000006320300000000000016223 0ustar00runnerdocker"""Various helper functions""" import asyncio import base64 import binascii import cgi import datetime import functools import inspect import netrc import os import platform import re import sys import time import warnings import weakref from collections import namedtuple from contextlib import suppress from email.utils import parsedate from math import ceil from pathlib import Path from types import TracebackType from typing import ( Any, Callable, ContextManager, Dict, Generator, Generic, Iterable, Iterator, List, Mapping, Optional, Pattern, Set, Tuple, Type, TypeVar, Union, cast, ) from urllib.parse import quote from urllib.request import getproxies, proxy_bypass import async_timeout import attr from multidict import MultiDict, MultiDictProxy from yarl import URL from . import hdrs from .log import client_logger, internal_logger from .typedefs import PathLike, Protocol # noqa __all__ = ("BasicAuth", "ChainMapProxy", "ETag") IS_MACOS = platform.system() == "Darwin" IS_WINDOWS = platform.system() == "Windows" PY_36 = sys.version_info >= (3, 6) PY_37 = sys.version_info >= (3, 7) PY_38 = sys.version_info >= (3, 8) PY_310 = sys.version_info >= (3, 10) if sys.version_info < (3, 7): import idna_ssl idna_ssl.patch_match_hostname() def all_tasks( loop: Optional[asyncio.AbstractEventLoop] = None, ) -> Set["asyncio.Task[Any]"]: tasks = list(asyncio.Task.all_tasks(loop)) return {t for t in tasks if not t.done()} else: all_tasks = asyncio.all_tasks _T = TypeVar("_T") _S = TypeVar("_S") sentinel = object() # type: Any NO_EXTENSIONS = bool(os.environ.get("AIOHTTP_NO_EXTENSIONS")) # type: bool # N.B. sys.flags.dev_mode is available on Python 3.7+, use getattr # for compatibility with older versions DEBUG = getattr(sys.flags, "dev_mode", False) or ( not sys.flags.ignore_environment and bool(os.environ.get("PYTHONASYNCIODEBUG")) ) # type: bool CHAR = {chr(i) for i in range(0, 128)} CTL = {chr(i) for i in range(0, 32)} | { chr(127), } SEPARATORS = { "(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}", " ", chr(9), } TOKEN = CHAR ^ CTL ^ SEPARATORS class noop: def __await__(self) -> Generator[None, None, None]: yield class BasicAuth(namedtuple("BasicAuth", ["login", "password", "encoding"])): """Http basic authentication helper.""" def __new__( cls, login: str, password: str = "", encoding: str = "latin1" ) -> "BasicAuth": if login is None: raise ValueError("None is not allowed as login value") if password is None: raise ValueError("None is not allowed as password value") if ":" in login: raise ValueError('A ":" is not allowed in login (RFC 1945#section-11.1)') return super().__new__(cls, login, password, encoding) @classmethod def decode(cls, auth_header: str, encoding: str = "latin1") -> "BasicAuth": """Create a BasicAuth object from an Authorization HTTP header.""" try: auth_type, encoded_credentials = auth_header.split(" ", 1) except ValueError: raise ValueError("Could not parse authorization header.") if auth_type.lower() != "basic": raise ValueError("Unknown authorization method %s" % auth_type) try: decoded = base64.b64decode( encoded_credentials.encode("ascii"), validate=True ).decode(encoding) except binascii.Error: raise ValueError("Invalid base64 encoding.") try: # RFC 2617 HTTP Authentication # https://www.ietf.org/rfc/rfc2617.txt # the colon must be present, but the username and password may be # otherwise blank. username, password = decoded.split(":", 1) except ValueError: raise ValueError("Invalid credentials.") return cls(username, password, encoding=encoding) @classmethod def from_url(cls, url: URL, *, encoding: str = "latin1") -> Optional["BasicAuth"]: """Create BasicAuth from url.""" if not isinstance(url, URL): raise TypeError("url should be yarl.URL instance") if url.user is None: return None return cls(url.user, url.password or "", encoding=encoding) def encode(self) -> str: """Encode credentials.""" creds = (f"{self.login}:{self.password}").encode(self.encoding) return "Basic %s" % base64.b64encode(creds).decode(self.encoding) def strip_auth_from_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: auth = BasicAuth.from_url(url) if auth is None: return url, None else: return url.with_user(None), auth def netrc_from_env() -> Optional[netrc.netrc]: """Load netrc from file. Attempt to load it from the path specified by the env-var NETRC or in the default location in the user's home directory. Returns None if it couldn't be found or fails to parse. """ netrc_env = os.environ.get("NETRC") if netrc_env is not None: netrc_path = Path(netrc_env) else: try: home_dir = Path.home() except RuntimeError as e: # pragma: no cover # if pathlib can't resolve home, it may raise a RuntimeError client_logger.debug( "Could not resolve home directory when " "trying to look for .netrc file: %s", e, ) return None netrc_path = home_dir / ("_netrc" if IS_WINDOWS else ".netrc") try: return netrc.netrc(str(netrc_path)) except netrc.NetrcParseError as e: client_logger.warning("Could not parse .netrc file: %s", e) except OSError as e: # we couldn't read the file (doesn't exist, permissions, etc.) if netrc_env or netrc_path.is_file(): # only warn if the environment wanted us to load it, # or it appears like the default file does actually exist client_logger.warning("Could not read .netrc file: %s", e) return None @attr.s(auto_attribs=True, frozen=True, slots=True) class ProxyInfo: proxy: URL proxy_auth: Optional[BasicAuth] def proxies_from_env() -> Dict[str, ProxyInfo]: proxy_urls = { k: URL(v) for k, v in getproxies().items() if k in ("http", "https", "ws", "wss") } netrc_obj = netrc_from_env() stripped = {k: strip_auth_from_url(v) for k, v in proxy_urls.items()} ret = {} for proto, val in stripped.items(): proxy, auth = val if proxy.scheme in ("https", "wss"): client_logger.warning( "%s proxies %s are not supported, ignoring", proxy.scheme.upper(), proxy ) continue if netrc_obj and auth is None: auth_from_netrc = None if proxy.host is not None: auth_from_netrc = netrc_obj.authenticators(proxy.host) if auth_from_netrc is not None: # auth_from_netrc is a (`user`, `account`, `password`) tuple, # `user` and `account` both can be username, # if `user` is None, use `account` *logins, password = auth_from_netrc login = logins[0] if logins[0] else logins[-1] auth = BasicAuth(cast(str, login), cast(str, password)) ret[proto] = ProxyInfo(proxy, auth) return ret def current_task( loop: Optional[asyncio.AbstractEventLoop] = None, ) -> "Optional[asyncio.Task[Any]]": if sys.version_info >= (3, 7): return asyncio.current_task(loop=loop) else: return asyncio.Task.current_task(loop=loop) def get_running_loop( loop: Optional[asyncio.AbstractEventLoop] = None, ) -> asyncio.AbstractEventLoop: if loop is None: loop = asyncio.get_event_loop() if not loop.is_running(): warnings.warn( "The object should be created within an async function", DeprecationWarning, stacklevel=3, ) if loop.get_debug(): internal_logger.warning( "The object should be created within an async function", stack_info=True ) return loop def isasyncgenfunction(obj: Any) -> bool: func = getattr(inspect, "isasyncgenfunction", None) if func is not None: return func(obj) # type: ignore[no-any-return] else: return False def get_env_proxy_for_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: """Get a permitted proxy for the given URL from the env.""" if url.host is not None and proxy_bypass(url.host): raise LookupError(f"Proxying is disallowed for `{url.host!r}`") proxies_in_env = proxies_from_env() try: proxy_info = proxies_in_env[url.scheme] except KeyError: raise LookupError(f"No proxies found for `{url!s}` in the env") else: return proxy_info.proxy, proxy_info.proxy_auth @attr.s(auto_attribs=True, frozen=True, slots=True) class MimeType: type: str subtype: str suffix: str parameters: "MultiDictProxy[str]" @functools.lru_cache(maxsize=56) def parse_mimetype(mimetype: str) -> MimeType: """Parses a MIME type into its components. mimetype is a MIME type string. Returns a MimeType object. Example: >>> parse_mimetype('text/html; charset=utf-8') MimeType(type='text', subtype='html', suffix='', parameters={'charset': 'utf-8'}) """ if not mimetype: return MimeType( type="", subtype="", suffix="", parameters=MultiDictProxy(MultiDict()) ) parts = mimetype.split(";") params = MultiDict() # type: MultiDict[str] for item in parts[1:]: if not item: continue key, value = cast( Tuple[str, str], item.split("=", 1) if "=" in item else (item, "") ) params.add(key.lower().strip(), value.strip(' "')) fulltype = parts[0].strip().lower() if fulltype == "*": fulltype = "*/*" mtype, stype = ( cast(Tuple[str, str], fulltype.split("/", 1)) if "/" in fulltype else (fulltype, "") ) stype, suffix = ( cast(Tuple[str, str], stype.split("+", 1)) if "+" in stype else (stype, "") ) return MimeType( type=mtype, subtype=stype, suffix=suffix, parameters=MultiDictProxy(params) ) def guess_filename(obj: Any, default: Optional[str] = None) -> Optional[str]: name = getattr(obj, "name", None) if name and isinstance(name, str) and name[0] != "<" and name[-1] != ">": return Path(name).name return default not_qtext_re = re.compile(r"[^\041\043-\133\135-\176]") QCONTENT = {chr(i) for i in range(0x20, 0x7F)} | {"\t"} def quoted_string(content: str) -> str: """Return 7-bit content as quoted-string. Format content into a quoted-string as defined in RFC5322 for Internet Message Format. Notice that this is not the 8-bit HTTP format, but the 7-bit email format. Content must be in usascii or a ValueError is raised. """ if not (QCONTENT > set(content)): raise ValueError(f"bad content for quoted-string {content!r}") return not_qtext_re.sub(lambda x: "\\" + x.group(0), content) def content_disposition_header( disptype: str, quote_fields: bool = True, _charset: str = "utf-8", **params: str ) -> str: """Sets ``Content-Disposition`` header for MIME. This is the MIME payload Content-Disposition header from RFC 2183 and RFC 7579 section 4.2, not the HTTP Content-Disposition from RFC 6266. disptype is a disposition type: inline, attachment, form-data. Should be valid extension token (see RFC 2183) quote_fields performs value quoting to 7-bit MIME headers according to RFC 7578. Set to quote_fields to False if recipient can take 8-bit file names and field values. _charset specifies the charset to use when quote_fields is True. params is a dict with disposition params. """ if not disptype or not (TOKEN > set(disptype)): raise ValueError("bad content disposition type {!r}" "".format(disptype)) value = disptype if params: lparams = [] for key, val in params.items(): if not key or not (TOKEN > set(key)): raise ValueError( "bad content disposition parameter" " {!r}={!r}".format(key, val) ) if quote_fields: if key.lower() == "filename": qval = quote(val, "", encoding=_charset) lparams.append((key, '"%s"' % qval)) else: try: qval = quoted_string(val) except ValueError: qval = "".join( (_charset, "''", quote(val, "", encoding=_charset)) ) lparams.append((key + "*", qval)) else: lparams.append((key, '"%s"' % qval)) else: qval = val.replace("\\", "\\\\").replace('"', '\\"') lparams.append((key, '"%s"' % qval)) sparams = "; ".join("=".join(pair) for pair in lparams) value = "; ".join((value, sparams)) return value class _TSelf(Protocol, Generic[_T]): _cache: Dict[str, _T] class reify(Generic[_T]): """Use as a class method decorator. It operates almost exactly like the Python `@property` decorator, but it puts the result of the method it decorates into the instance dict after the first call, effectively replacing the function it decorates with an instance variable. It is, in Python parlance, a data descriptor. """ def __init__(self, wrapped: Callable[..., _T]) -> None: self.wrapped = wrapped self.__doc__ = wrapped.__doc__ self.name = wrapped.__name__ def __get__(self, inst: _TSelf[_T], owner: Optional[Type[Any]] = None) -> _T: try: try: return inst._cache[self.name] except KeyError: val = self.wrapped(inst) inst._cache[self.name] = val return val except AttributeError: if inst is None: return self raise def __set__(self, inst: _TSelf[_T], value: _T) -> None: raise AttributeError("reified property is read-only") reify_py = reify try: from ._helpers import reify as reify_c if not NO_EXTENSIONS: reify = reify_c # type: ignore[misc,assignment] except ImportError: pass _ipv4_pattern = ( r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}" r"(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" ) _ipv6_pattern = ( r"^(?:(?:(?:[A-F0-9]{1,4}:){6}|(?=(?:[A-F0-9]{0,4}:){0,6}" r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}$)(([0-9A-F]{1,4}:){0,5}|:)" r"((:[0-9A-F]{1,4}){1,5}:|:)|::(?:[A-F0-9]{1,4}:){5})" r"(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}" r"(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])|(?:[A-F0-9]{1,4}:){7}" r"[A-F0-9]{1,4}|(?=(?:[A-F0-9]{0,4}:){0,7}[A-F0-9]{0,4}$)" r"(([0-9A-F]{1,4}:){1,7}|:)((:[0-9A-F]{1,4}){1,7}|:)|(?:[A-F0-9]{1,4}:){7}" r":|:(:[A-F0-9]{1,4}){7})$" ) _ipv4_regex = re.compile(_ipv4_pattern) _ipv6_regex = re.compile(_ipv6_pattern, flags=re.IGNORECASE) _ipv4_regexb = re.compile(_ipv4_pattern.encode("ascii")) _ipv6_regexb = re.compile(_ipv6_pattern.encode("ascii"), flags=re.IGNORECASE) def _is_ip_address( regex: Pattern[str], regexb: Pattern[bytes], host: Optional[Union[str, bytes]] ) -> bool: if host is None: return False if isinstance(host, str): return bool(regex.match(host)) elif isinstance(host, (bytes, bytearray, memoryview)): return bool(regexb.match(host)) else: raise TypeError(f"{host} [{type(host)}] is not a str or bytes") is_ipv4_address = functools.partial(_is_ip_address, _ipv4_regex, _ipv4_regexb) is_ipv6_address = functools.partial(_is_ip_address, _ipv6_regex, _ipv6_regexb) def is_ip_address(host: Optional[Union[str, bytes, bytearray, memoryview]]) -> bool: return is_ipv4_address(host) or is_ipv6_address(host) def next_whole_second() -> datetime.datetime: """Return current time rounded up to the next whole second.""" return datetime.datetime.now(datetime.timezone.utc).replace( microsecond=0 ) + datetime.timedelta(seconds=0) _cached_current_datetime = None # type: Optional[int] _cached_formatted_datetime = "" def rfc822_formatted_time() -> str: global _cached_current_datetime global _cached_formatted_datetime now = int(time.time()) if now != _cached_current_datetime: # Weekday and month names for HTTP date/time formatting; # always English! # Tuples are constants stored in codeobject! _weekdayname = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") _monthname = ( "", # Dummy so we can use 1-based month numbers "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ) year, month, day, hh, mm, ss, wd, *tail = time.gmtime(now) _cached_formatted_datetime = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( _weekdayname[wd], day, _monthname[month], year, hh, mm, ss, ) _cached_current_datetime = now return _cached_formatted_datetime def _weakref_handle(info: "Tuple[weakref.ref[object], str]") -> None: ref, name = info ob = ref() if ob is not None: with suppress(Exception): getattr(ob, name)() def weakref_handle( ob: object, name: str, timeout: float, loop: asyncio.AbstractEventLoop ) -> Optional[asyncio.TimerHandle]: if timeout is not None and timeout > 0: when = loop.time() + timeout if timeout >= 5: when = ceil(when) return loop.call_at(when, _weakref_handle, (weakref.ref(ob), name)) return None def call_later( cb: Callable[[], Any], timeout: float, loop: asyncio.AbstractEventLoop ) -> Optional[asyncio.TimerHandle]: if timeout is not None and timeout > 0: when = loop.time() + timeout if timeout > 5: when = ceil(when) return loop.call_at(when, cb) return None class TimeoutHandle: """Timeout handle""" def __init__( self, loop: asyncio.AbstractEventLoop, timeout: Optional[float] ) -> None: self._timeout = timeout self._loop = loop self._callbacks = ( [] ) # type: List[Tuple[Callable[..., None], Tuple[Any, ...], Dict[str, Any]]] def register( self, callback: Callable[..., None], *args: Any, **kwargs: Any ) -> None: self._callbacks.append((callback, args, kwargs)) def close(self) -> None: self._callbacks.clear() def start(self) -> Optional[asyncio.Handle]: timeout = self._timeout if timeout is not None and timeout > 0: when = self._loop.time() + timeout if timeout >= 5: when = ceil(when) return self._loop.call_at(when, self.__call__) else: return None def timer(self) -> "BaseTimerContext": if self._timeout is not None and self._timeout > 0: timer = TimerContext(self._loop) self.register(timer.timeout) return timer else: return TimerNoop() def __call__(self) -> None: for cb, args, kwargs in self._callbacks: with suppress(Exception): cb(*args, **kwargs) self._callbacks.clear() class BaseTimerContext(ContextManager["BaseTimerContext"]): pass class TimerNoop(BaseTimerContext): def __enter__(self) -> BaseTimerContext: return self def __exit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> None: return class TimerContext(BaseTimerContext): """Low resolution timeout context manager""" def __init__(self, loop: asyncio.AbstractEventLoop) -> None: self._loop = loop self._tasks = [] # type: List[asyncio.Task[Any]] self._cancelled = False def __enter__(self) -> BaseTimerContext: task = current_task(loop=self._loop) if task is None: raise RuntimeError( "Timeout context manager should be used " "inside a task" ) if self._cancelled: raise asyncio.TimeoutError from None self._tasks.append(task) return self def __exit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> Optional[bool]: if self._tasks: self._tasks.pop() if exc_type is asyncio.CancelledError and self._cancelled: raise asyncio.TimeoutError from None return None def timeout(self) -> None: if not self._cancelled: for task in set(self._tasks): task.cancel() self._cancelled = True def ceil_timeout(delay: Optional[float]) -> async_timeout.Timeout: if delay is None or delay <= 0: return async_timeout.timeout(None) loop = get_running_loop() now = loop.time() when = now + delay if delay > 5: when = ceil(when) return async_timeout.timeout_at(when) class HeadersMixin: ATTRS = frozenset(["_content_type", "_content_dict", "_stored_content_type"]) _content_type = None # type: Optional[str] _content_dict = None # type: Optional[Dict[str, str]] _stored_content_type = sentinel def _parse_content_type(self, raw: str) -> None: self._stored_content_type = raw if raw is None: # default value according to RFC 2616 self._content_type = "application/octet-stream" self._content_dict = {} else: self._content_type, self._content_dict = cgi.parse_header(raw) @property def content_type(self) -> str: """The value of content part for Content-Type HTTP header.""" raw = self._headers.get(hdrs.CONTENT_TYPE) # type: ignore[attr-defined] if self._stored_content_type != raw: self._parse_content_type(raw) return self._content_type # type: ignore[return-value] @property def charset(self) -> Optional[str]: """The value of charset part for Content-Type HTTP header.""" raw = self._headers.get(hdrs.CONTENT_TYPE) # type: ignore[attr-defined] if self._stored_content_type != raw: self._parse_content_type(raw) return self._content_dict.get("charset") # type: ignore[union-attr] @property def content_length(self) -> Optional[int]: """The value of Content-Length HTTP header.""" content_length = self._headers.get( # type: ignore[attr-defined] hdrs.CONTENT_LENGTH ) if content_length is not None: return int(content_length) else: return None def set_result(fut: "asyncio.Future[_T]", result: _T) -> None: if not fut.done(): fut.set_result(result) def set_exception(fut: "asyncio.Future[_T]", exc: BaseException) -> None: if not fut.done(): fut.set_exception(exc) class ChainMapProxy(Mapping[str, Any]): __slots__ = ("_maps",) def __init__(self, maps: Iterable[Mapping[str, Any]]) -> None: self._maps = tuple(maps) def __init_subclass__(cls) -> None: raise TypeError( "Inheritance class {} from ChainMapProxy " "is forbidden".format(cls.__name__) ) def __getitem__(self, key: str) -> Any: for mapping in self._maps: try: return mapping[key] except KeyError: pass raise KeyError(key) def get(self, key: str, default: Any = None) -> Any: return self[key] if key in self else default def __len__(self) -> int: # reuses stored hash values if possible return len(set().union(*self._maps)) # type: ignore[arg-type] def __iter__(self) -> Iterator[str]: d = {} # type: Dict[str, Any] for mapping in reversed(self._maps): # reuses stored hash values if possible d.update(mapping) return iter(d) def __contains__(self, key: object) -> bool: return any(key in m for m in self._maps) def __bool__(self) -> bool: return any(self._maps) def __repr__(self) -> str: content = ", ".join(map(repr, self._maps)) return f"ChainMapProxy({content})" # https://tools.ietf.org/html/rfc7232#section-2.3 _ETAGC = r"[!#-}\x80-\xff]+" _ETAGC_RE = re.compile(_ETAGC) _QUOTED_ETAG = fr'(W/)?"({_ETAGC})"' QUOTED_ETAG_RE = re.compile(_QUOTED_ETAG) LIST_QUOTED_ETAG_RE = re.compile(fr"({_QUOTED_ETAG})(?:\s*,\s*|$)|(.)") ETAG_ANY = "*" @attr.s(auto_attribs=True, frozen=True, slots=True) class ETag: value: str is_weak: bool = False def validate_etag_value(value: str) -> None: if value != ETAG_ANY and not _ETAGC_RE.fullmatch(value): raise ValueError( f"Value {value!r} is not a valid etag. Maybe it contains '\"'?" ) def parse_http_date(date_str: Optional[str]) -> Optional[datetime.datetime]: """Process a date string, return a datetime object""" if date_str is not None: timetuple = parsedate(date_str) if timetuple is not None: with suppress(ValueError): return datetime.datetime(*timetuple[:6], tzinfo=datetime.timezone.utc) return None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/http.py0000644000175100001710000000344000000000000015535 0ustar00runnerdockerimport http.server import sys from typing import Mapping, Tuple from . import __version__ from .http_exceptions import HttpProcessingError as HttpProcessingError from .http_parser import ( HeadersParser as HeadersParser, HttpParser as HttpParser, HttpRequestParser as HttpRequestParser, HttpResponseParser as HttpResponseParser, RawRequestMessage as RawRequestMessage, RawResponseMessage as RawResponseMessage, ) from .http_websocket import ( WS_CLOSED_MESSAGE as WS_CLOSED_MESSAGE, WS_CLOSING_MESSAGE as WS_CLOSING_MESSAGE, WS_KEY as WS_KEY, WebSocketError as WebSocketError, WebSocketReader as WebSocketReader, WebSocketWriter as WebSocketWriter, WSCloseCode as WSCloseCode, WSMessage as WSMessage, WSMsgType as WSMsgType, ws_ext_gen as ws_ext_gen, ws_ext_parse as ws_ext_parse, ) from .http_writer import ( HttpVersion as HttpVersion, HttpVersion10 as HttpVersion10, HttpVersion11 as HttpVersion11, StreamWriter as StreamWriter, ) __all__ = ( "HttpProcessingError", "RESPONSES", "SERVER_SOFTWARE", # .http_writer "StreamWriter", "HttpVersion", "HttpVersion10", "HttpVersion11", # .http_parser "HeadersParser", "HttpParser", "HttpRequestParser", "HttpResponseParser", "RawRequestMessage", "RawResponseMessage", # .http_websocket "WS_CLOSED_MESSAGE", "WS_CLOSING_MESSAGE", "WS_KEY", "WebSocketReader", "WebSocketWriter", "ws_ext_gen", "ws_ext_parse", "WSMessage", "WebSocketError", "WSMsgType", "WSCloseCode", ) SERVER_SOFTWARE = "Python/{0[0]}.{0[1]} aiohttp/{1}".format( sys.version_info, __version__ ) # type: str RESPONSES = ( http.server.BaseHTTPRequestHandler.responses ) # type: Mapping[int, Tuple[str, str]] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/http_exceptions.py0000644000175100001710000000503200000000000017775 0ustar00runnerdocker"""Low-level http related exceptions.""" from typing import Optional, Union from .typedefs import _CIMultiDict __all__ = ("HttpProcessingError",) class HttpProcessingError(Exception): """HTTP error. Shortcut for raising HTTP errors with custom code, message and headers. code: HTTP Error code. message: (optional) Error message. headers: (optional) Headers to be sent in response, a list of pairs """ code = 0 message = "" headers = None def __init__( self, *, code: Optional[int] = None, message: str = "", headers: Optional[_CIMultiDict] = None, ) -> None: if code is not None: self.code = code self.headers = headers self.message = message def __str__(self) -> str: return f"{self.code}, message={self.message!r}" def __repr__(self) -> str: return f"<{self.__class__.__name__}: {self}>" class BadHttpMessage(HttpProcessingError): code = 400 message = "Bad Request" def __init__(self, message: str, *, headers: Optional[_CIMultiDict] = None) -> None: super().__init__(message=message, headers=headers) self.args = (message,) class HttpBadRequest(BadHttpMessage): code = 400 message = "Bad Request" class PayloadEncodingError(BadHttpMessage): """Base class for payload errors""" class ContentEncodingError(PayloadEncodingError): """Content encoding error.""" class TransferEncodingError(PayloadEncodingError): """transfer encoding error.""" class ContentLengthError(PayloadEncodingError): """Not enough data for satisfy content length header.""" class LineTooLong(BadHttpMessage): def __init__( self, line: str, limit: str = "Unknown", actual_size: str = "Unknown" ) -> None: super().__init__( f"Got more than {limit} bytes ({actual_size}) when reading {line}." ) self.args = (line, limit, actual_size) class InvalidHeader(BadHttpMessage): def __init__(self, hdr: Union[bytes, str]) -> None: if isinstance(hdr, bytes): hdr = hdr.decode("utf-8", "surrogateescape") super().__init__(f"Invalid HTTP Header: {hdr}") self.hdr = hdr self.args = (hdr,) class BadStatusLine(BadHttpMessage): def __init__(self, line: str = "") -> None: if not isinstance(line, str): line = repr(line) super().__init__(f"Bad status line {line!r}") self.args = (line,) self.line = line class InvalidURLError(BadHttpMessage): pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/http_parser.py0000644000175100001710000007751600000000000017130 0ustar00runnerdockerimport abc import asyncio import collections import re import string import zlib from contextlib import suppress from enum import IntEnum from typing import ( Any, Generic, List, NamedTuple, Optional, Pattern, Set, Tuple, Type, TypeVar, Union, cast, ) from multidict import CIMultiDict, CIMultiDictProxy, istr from yarl import URL from . import hdrs from .base_protocol import BaseProtocol from .helpers import NO_EXTENSIONS, BaseTimerContext from .http_exceptions import ( BadHttpMessage, BadStatusLine, ContentEncodingError, ContentLengthError, InvalidHeader, LineTooLong, TransferEncodingError, ) from .http_writer import HttpVersion, HttpVersion10 from .log import internal_logger from .streams import EMPTY_PAYLOAD, StreamReader from .typedefs import Final, RawHeaders try: import brotli HAS_BROTLI = True except ImportError: # pragma: no cover HAS_BROTLI = False __all__ = ( "HeadersParser", "HttpParser", "HttpRequestParser", "HttpResponseParser", "RawRequestMessage", "RawResponseMessage", ) ASCIISET: Final[Set[str]] = set(string.printable) # See https://tools.ietf.org/html/rfc7230#section-3.1.1 # and https://tools.ietf.org/html/rfc7230#appendix-B # # method = token # tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / # "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA # token = 1*tchar METHRE: Final[Pattern[str]] = re.compile(r"[!#$%&'*+\-.^_`|~0-9A-Za-z]+") VERSRE: Final[Pattern[str]] = re.compile(r"HTTP/(\d+).(\d+)") HDRRE: Final[Pattern[bytes]] = re.compile(rb"[\x00-\x1F\x7F()<>@,;:\[\]={} \t\\\\\"]") class RawRequestMessage(NamedTuple): method: str path: str version: HttpVersion headers: "CIMultiDictProxy[str]" raw_headers: RawHeaders should_close: bool compression: Optional[str] upgrade: bool chunked: bool url: URL RawResponseMessage = collections.namedtuple( "RawResponseMessage", [ "version", "code", "reason", "headers", "raw_headers", "should_close", "compression", "upgrade", "chunked", ], ) _MsgT = TypeVar("_MsgT", RawRequestMessage, RawResponseMessage) class ParseState(IntEnum): PARSE_NONE = 0 PARSE_LENGTH = 1 PARSE_CHUNKED = 2 PARSE_UNTIL_EOF = 3 class ChunkState(IntEnum): PARSE_CHUNKED_SIZE = 0 PARSE_CHUNKED_CHUNK = 1 PARSE_CHUNKED_CHUNK_EOF = 2 PARSE_MAYBE_TRAILERS = 3 PARSE_TRAILERS = 4 class HeadersParser: def __init__( self, max_line_size: int = 8190, max_headers: int = 32768, max_field_size: int = 8190, ) -> None: self.max_line_size = max_line_size self.max_headers = max_headers self.max_field_size = max_field_size def parse_headers( self, lines: List[bytes] ) -> Tuple["CIMultiDictProxy[str]", RawHeaders]: headers = CIMultiDict() # type: CIMultiDict[str] raw_headers = [] lines_idx = 1 line = lines[1] line_count = len(lines) while line: # Parse initial header name : value pair. try: bname, bvalue = line.split(b":", 1) except ValueError: raise InvalidHeader(line) from None bname = bname.strip(b" \t") bvalue = bvalue.lstrip() if HDRRE.search(bname): raise InvalidHeader(bname) if len(bname) > self.max_field_size: raise LineTooLong( "request header name {}".format( bname.decode("utf8", "xmlcharrefreplace") ), str(self.max_field_size), str(len(bname)), ) header_length = len(bvalue) # next line lines_idx += 1 line = lines[lines_idx] # consume continuation lines continuation = line and line[0] in (32, 9) # (' ', '\t') if continuation: bvalue_lst = [bvalue] while continuation: header_length += len(line) if header_length > self.max_field_size: raise LineTooLong( "request header field {}".format( bname.decode("utf8", "xmlcharrefreplace") ), str(self.max_field_size), str(header_length), ) bvalue_lst.append(line) # next line lines_idx += 1 if lines_idx < line_count: line = lines[lines_idx] if line: continuation = line[0] in (32, 9) # (' ', '\t') else: line = b"" break bvalue = b"".join(bvalue_lst) else: if header_length > self.max_field_size: raise LineTooLong( "request header field {}".format( bname.decode("utf8", "xmlcharrefreplace") ), str(self.max_field_size), str(header_length), ) bvalue = bvalue.strip() name = bname.decode("utf-8", "surrogateescape") value = bvalue.decode("utf-8", "surrogateescape") headers.add(name, value) raw_headers.append((bname, bvalue)) return (CIMultiDictProxy(headers), tuple(raw_headers)) class HttpParser(abc.ABC, Generic[_MsgT]): def __init__( self, protocol: Optional[BaseProtocol] = None, loop: Optional[asyncio.AbstractEventLoop] = None, limit: int = 2 ** 16, max_line_size: int = 8190, max_headers: int = 32768, max_field_size: int = 8190, timer: Optional[BaseTimerContext] = None, code: Optional[int] = None, method: Optional[str] = None, readall: bool = False, payload_exception: Optional[Type[BaseException]] = None, response_with_body: bool = True, read_until_eof: bool = False, auto_decompress: bool = True, ) -> None: self.protocol = protocol self.loop = loop self.max_line_size = max_line_size self.max_headers = max_headers self.max_field_size = max_field_size self.timer = timer self.code = code self.method = method self.readall = readall self.payload_exception = payload_exception self.response_with_body = response_with_body self.read_until_eof = read_until_eof self._lines = [] # type: List[bytes] self._tail = b"" self._upgraded = False self._payload = None self._payload_parser = None # type: Optional[HttpPayloadParser] self._auto_decompress = auto_decompress self._limit = limit self._headers_parser = HeadersParser(max_line_size, max_headers, max_field_size) @abc.abstractmethod def parse_message(self, lines: List[bytes]) -> _MsgT: pass def feed_eof(self) -> Optional[_MsgT]: if self._payload_parser is not None: self._payload_parser.feed_eof() self._payload_parser = None else: # try to extract partial message if self._tail: self._lines.append(self._tail) if self._lines: if self._lines[-1] != "\r\n": self._lines.append(b"") with suppress(Exception): return self.parse_message(self._lines) return None def feed_data( self, data: bytes, SEP: bytes = b"\r\n", EMPTY: bytes = b"", CONTENT_LENGTH: istr = hdrs.CONTENT_LENGTH, METH_CONNECT: str = hdrs.METH_CONNECT, SEC_WEBSOCKET_KEY1: istr = hdrs.SEC_WEBSOCKET_KEY1, ) -> Tuple[List[Tuple[_MsgT, StreamReader]], bool, bytes]: messages = [] if self._tail: data, self._tail = self._tail + data, b"" data_len = len(data) start_pos = 0 loop = self.loop while start_pos < data_len: # read HTTP message (request/response line + headers), \r\n\r\n # and split by lines if self._payload_parser is None and not self._upgraded: pos = data.find(SEP, start_pos) # consume \r\n if pos == start_pos and not self._lines: start_pos = pos + 2 continue if pos >= start_pos: # line found self._lines.append(data[start_pos:pos]) start_pos = pos + 2 # \r\n\r\n found if self._lines[-1] == EMPTY: try: msg: _MsgT = self.parse_message(self._lines) finally: self._lines.clear() def get_content_length() -> Optional[int]: # payload length length_hdr = msg.headers.get(CONTENT_LENGTH) if length_hdr is None: return None try: length = int(length_hdr) except ValueError: raise InvalidHeader(CONTENT_LENGTH) if length < 0: raise InvalidHeader(CONTENT_LENGTH) return length length = get_content_length() # do not support old websocket spec if SEC_WEBSOCKET_KEY1 in msg.headers: raise InvalidHeader(SEC_WEBSOCKET_KEY1) self._upgraded = msg.upgrade method = getattr(msg, "method", self.method) assert self.protocol is not None # calculate payload if ( (length is not None and length > 0) or msg.chunked and not msg.upgrade ): payload = StreamReader( self.protocol, timer=self.timer, loop=loop, limit=self._limit, ) payload_parser = HttpPayloadParser( payload, length=length, chunked=msg.chunked, method=method, compression=msg.compression, code=self.code, readall=self.readall, response_with_body=self.response_with_body, auto_decompress=self._auto_decompress, ) if not payload_parser.done: self._payload_parser = payload_parser elif method == METH_CONNECT: assert isinstance(msg, RawRequestMessage) payload = StreamReader( self.protocol, timer=self.timer, loop=loop, limit=self._limit, ) self._upgraded = True self._payload_parser = HttpPayloadParser( payload, method=msg.method, compression=msg.compression, readall=True, auto_decompress=self._auto_decompress, ) else: if ( getattr(msg, "code", 100) >= 199 and length is None and self.read_until_eof ): payload = StreamReader( self.protocol, timer=self.timer, loop=loop, limit=self._limit, ) payload_parser = HttpPayloadParser( payload, length=length, chunked=msg.chunked, method=method, compression=msg.compression, code=self.code, readall=True, response_with_body=self.response_with_body, auto_decompress=self._auto_decompress, ) if not payload_parser.done: self._payload_parser = payload_parser else: payload = EMPTY_PAYLOAD messages.append((msg, payload)) else: self._tail = data[start_pos:] data = EMPTY break # no parser, just store elif self._payload_parser is None and self._upgraded: assert not self._lines break # feed payload elif data and start_pos < data_len: assert not self._lines assert self._payload_parser is not None try: eof, data = self._payload_parser.feed_data(data[start_pos:]) except BaseException as exc: if self.payload_exception is not None: self._payload_parser.payload.set_exception( self.payload_exception(str(exc)) ) else: self._payload_parser.payload.set_exception(exc) eof = True data = b"" if eof: start_pos = 0 data_len = len(data) self._payload_parser = None continue else: break if data and start_pos < data_len: data = data[start_pos:] else: data = EMPTY return messages, self._upgraded, data def parse_headers( self, lines: List[bytes] ) -> Tuple[ "CIMultiDictProxy[str]", RawHeaders, Optional[bool], Optional[str], bool, bool ]: """Parses RFC 5322 headers from a stream. Line continuations are supported. Returns list of header name and value pairs. Header name is in upper case. """ headers, raw_headers = self._headers_parser.parse_headers(lines) close_conn = None encoding = None upgrade = False chunked = False # keep-alive conn = headers.get(hdrs.CONNECTION) if conn: v = conn.lower() if v == "close": close_conn = True elif v == "keep-alive": close_conn = False elif v == "upgrade": upgrade = True # encoding enc = headers.get(hdrs.CONTENT_ENCODING) if enc: enc = enc.lower() if enc in ("gzip", "deflate", "br"): encoding = enc # chunking te = headers.get(hdrs.TRANSFER_ENCODING) if te is not None: if "chunked" == te.lower(): chunked = True else: raise BadHttpMessage("Request has invalid `Transfer-Encoding`") if hdrs.CONTENT_LENGTH in headers: raise BadHttpMessage( "Content-Length can't be present with Transfer-Encoding", ) return (headers, raw_headers, close_conn, encoding, upgrade, chunked) def set_upgraded(self, val: bool) -> None: """Set connection upgraded (to websocket) mode. :param bool val: new state. """ self._upgraded = val class HttpRequestParser(HttpParser[RawRequestMessage]): """Read request status line. Exception .http_exceptions.BadStatusLine could be raised in case of any errors in status line. Returns RawRequestMessage. """ def parse_message(self, lines: List[bytes]) -> RawRequestMessage: # request line line = lines[0].decode("utf-8", "surrogateescape") try: method, path, version = line.split(None, 2) except ValueError: raise BadStatusLine(line) from None if len(path) > self.max_line_size: raise LineTooLong( "Status line is too long", str(self.max_line_size), str(len(path)) ) path_part, _hash_separator, url_fragment = path.partition("#") path_part, _question_mark_separator, qs_part = path_part.partition("?") # method if not METHRE.match(method): raise BadStatusLine(method) # version try: if version.startswith("HTTP/"): n1, n2 = version[5:].split(".", 1) version_o = HttpVersion(int(n1), int(n2)) else: raise BadStatusLine(version) except Exception: raise BadStatusLine(version) # read headers ( headers, raw_headers, close, compression, upgrade, chunked, ) = self.parse_headers(lines) if close is None: # then the headers weren't set in the request if version_o <= HttpVersion10: # HTTP 1.0 must asks to not close close = True else: # HTTP 1.1 must ask to close. close = False return RawRequestMessage( method, path, version_o, headers, raw_headers, close, compression, upgrade, chunked, # NOTE: `yarl.URL.build()` is used to mimic what the Cython-based # NOTE: parser does, otherwise it results into the same # NOTE: HTTP Request-Line input producing different # NOTE: `yarl.URL()` objects URL.build( path=path_part, query_string=qs_part, fragment=url_fragment, encoded=True, ), ) class HttpResponseParser(HttpParser[RawResponseMessage]): """Read response status line and headers. BadStatusLine could be raised in case of any errors in status line. Returns RawResponseMessage. """ def parse_message(self, lines: List[bytes]) -> RawResponseMessage: line = lines[0].decode("utf-8", "surrogateescape") try: version, status = line.split(None, 1) except ValueError: raise BadStatusLine(line) from None try: status, reason = status.split(None, 1) except ValueError: reason = "" if len(reason) > self.max_line_size: raise LineTooLong( "Status line is too long", str(self.max_line_size), str(len(reason)) ) # version match = VERSRE.match(version) if match is None: raise BadStatusLine(line) version_o = HttpVersion(int(match.group(1)), int(match.group(2))) # The status code is a three-digit number try: status_i = int(status) except ValueError: raise BadStatusLine(line) from None if status_i > 999: raise BadStatusLine(line) # read headers ( headers, raw_headers, close, compression, upgrade, chunked, ) = self.parse_headers(lines) if close is None: close = version_o <= HttpVersion10 return RawResponseMessage( version_o, status_i, reason.strip(), headers, raw_headers, close, compression, upgrade, chunked, ) class HttpPayloadParser: def __init__( self, payload: StreamReader, length: Optional[int] = None, chunked: bool = False, compression: Optional[str] = None, code: Optional[int] = None, method: Optional[str] = None, readall: bool = False, response_with_body: bool = True, auto_decompress: bool = True, ) -> None: self._length = 0 self._type = ParseState.PARSE_NONE self._chunk = ChunkState.PARSE_CHUNKED_SIZE self._chunk_size = 0 self._chunk_tail = b"" self._auto_decompress = auto_decompress self.done = False # payload decompression wrapper if response_with_body and compression and self._auto_decompress: real_payload = DeflateBuffer( payload, compression ) # type: Union[StreamReader, DeflateBuffer] else: real_payload = payload # payload parser if not response_with_body: # don't parse payload if it's not expected to be received self._type = ParseState.PARSE_NONE real_payload.feed_eof() self.done = True elif chunked: self._type = ParseState.PARSE_CHUNKED elif length is not None: self._type = ParseState.PARSE_LENGTH self._length = length if self._length == 0: real_payload.feed_eof() self.done = True else: if readall and code != 204: self._type = ParseState.PARSE_UNTIL_EOF elif method in ("PUT", "POST"): internal_logger.warning( # pragma: no cover "Content-Length or Transfer-Encoding header is required" ) self._type = ParseState.PARSE_NONE real_payload.feed_eof() self.done = True self.payload = real_payload def feed_eof(self) -> None: if self._type == ParseState.PARSE_UNTIL_EOF: self.payload.feed_eof() elif self._type == ParseState.PARSE_LENGTH: raise ContentLengthError( "Not enough data for satisfy content length header." ) elif self._type == ParseState.PARSE_CHUNKED: raise TransferEncodingError( "Not enough data for satisfy transfer length header." ) def feed_data( self, chunk: bytes, SEP: bytes = b"\r\n", CHUNK_EXT: bytes = b";" ) -> Tuple[bool, bytes]: # Read specified amount of bytes if self._type == ParseState.PARSE_LENGTH: required = self._length chunk_len = len(chunk) if required >= chunk_len: self._length = required - chunk_len self.payload.feed_data(chunk, chunk_len) if self._length == 0: self.payload.feed_eof() return True, b"" else: self._length = 0 self.payload.feed_data(chunk[:required], required) self.payload.feed_eof() return True, chunk[required:] # Chunked transfer encoding parser elif self._type == ParseState.PARSE_CHUNKED: if self._chunk_tail: chunk = self._chunk_tail + chunk self._chunk_tail = b"" while chunk: # read next chunk size if self._chunk == ChunkState.PARSE_CHUNKED_SIZE: pos = chunk.find(SEP) if pos >= 0: i = chunk.find(CHUNK_EXT, 0, pos) if i >= 0: size_b = chunk[:i] # strip chunk-extensions else: size_b = chunk[:pos] try: size = int(bytes(size_b), 16) except ValueError: exc = TransferEncodingError( chunk[:pos].decode("ascii", "surrogateescape") ) self.payload.set_exception(exc) raise exc from None chunk = chunk[pos + 2 :] if size == 0: # eof marker self._chunk = ChunkState.PARSE_MAYBE_TRAILERS else: self._chunk = ChunkState.PARSE_CHUNKED_CHUNK self._chunk_size = size self.payload.begin_http_chunk_receiving() else: self._chunk_tail = chunk return False, b"" # read chunk and feed buffer if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK: required = self._chunk_size chunk_len = len(chunk) if required > chunk_len: self._chunk_size = required - chunk_len self.payload.feed_data(chunk, chunk_len) return False, b"" else: self._chunk_size = 0 self.payload.feed_data(chunk[:required], required) chunk = chunk[required:] self._chunk = ChunkState.PARSE_CHUNKED_CHUNK_EOF self.payload.end_http_chunk_receiving() # toss the CRLF at the end of the chunk if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK_EOF: if chunk[:2] == SEP: chunk = chunk[2:] self._chunk = ChunkState.PARSE_CHUNKED_SIZE else: self._chunk_tail = chunk return False, b"" # if stream does not contain trailer, after 0\r\n # we should get another \r\n otherwise # trailers needs to be skiped until \r\n\r\n if self._chunk == ChunkState.PARSE_MAYBE_TRAILERS: head = chunk[:2] if head == SEP: # end of stream self.payload.feed_eof() return True, chunk[2:] # Both CR and LF, or only LF may not be received yet. It is # expected that CRLF or LF will be shown at the very first # byte next time, otherwise trailers should come. The last # CRLF which marks the end of response might not be # contained in the same TCP segment which delivered the # size indicator. if not head: return False, b"" if head == SEP[:1]: self._chunk_tail = head return False, b"" self._chunk = ChunkState.PARSE_TRAILERS # read and discard trailer up to the CRLF terminator if self._chunk == ChunkState.PARSE_TRAILERS: pos = chunk.find(SEP) if pos >= 0: chunk = chunk[pos + 2 :] self._chunk = ChunkState.PARSE_MAYBE_TRAILERS else: self._chunk_tail = chunk return False, b"" # Read all bytes until eof elif self._type == ParseState.PARSE_UNTIL_EOF: self.payload.feed_data(chunk, len(chunk)) return False, b"" class DeflateBuffer: """DeflateStream decompress stream and feed data into specified stream.""" decompressor: Any def __init__(self, out: StreamReader, encoding: Optional[str]) -> None: self.out = out self.size = 0 self.encoding = encoding self._started_decoding = False if encoding == "br": if not HAS_BROTLI: # pragma: no cover raise ContentEncodingError( "Can not decode content-encoding: brotli (br). " "Please install `Brotli`" ) class BrotliDecoder: # Supports both 'brotlipy' and 'Brotli' packages # since they share an import name. The top branches # are for 'brotlipy' and bottom branches for 'Brotli' def __init__(self) -> None: self._obj = brotli.Decompressor() def decompress(self, data: bytes) -> bytes: if hasattr(self._obj, "decompress"): return cast(bytes, self._obj.decompress(data)) return cast(bytes, self._obj.process(data)) def flush(self) -> bytes: if hasattr(self._obj, "flush"): return cast(bytes, self._obj.flush()) return b"" self.decompressor = BrotliDecoder() else: zlib_mode = 16 + zlib.MAX_WBITS if encoding == "gzip" else zlib.MAX_WBITS self.decompressor = zlib.decompressobj(wbits=zlib_mode) def set_exception(self, exc: BaseException) -> None: self.out.set_exception(exc) def feed_data(self, chunk: bytes, size: int) -> None: if not size: return self.size += size # RFC1950 # bits 0..3 = CM = 0b1000 = 8 = "deflate" # bits 4..7 = CINFO = 1..7 = windows size. if ( not self._started_decoding and self.encoding == "deflate" and chunk[0] & 0xF != 8 ): # Change the decoder to decompress incorrectly compressed data # Actually we should issue a warning about non-RFC-compliant data. self.decompressor = zlib.decompressobj(wbits=-zlib.MAX_WBITS) try: chunk = self.decompressor.decompress(chunk) except Exception: raise ContentEncodingError( "Can not decode content-encoding: %s" % self.encoding ) self._started_decoding = True if chunk: self.out.feed_data(chunk, len(chunk)) def feed_eof(self) -> None: chunk = self.decompressor.flush() if chunk or self.size > 0: self.out.feed_data(chunk, len(chunk)) if self.encoding == "deflate" and not self.decompressor.eof: raise ContentEncodingError("deflate") self.out.feed_eof() def begin_http_chunk_receiving(self) -> None: self.out.begin_http_chunk_receiving() def end_http_chunk_receiving(self) -> None: self.out.end_http_chunk_receiving() HttpRequestParserPy = HttpRequestParser HttpResponseParserPy = HttpResponseParser RawRequestMessagePy = RawRequestMessage RawResponseMessagePy = RawResponseMessage try: if not NO_EXTENSIONS: from ._http_parser import ( # type: ignore[import,no-redef] HttpRequestParser, HttpResponseParser, RawRequestMessage, RawResponseMessage, ) HttpRequestParserC = HttpRequestParser HttpResponseParserC = HttpResponseParser RawRequestMessageC = RawRequestMessage RawResponseMessageC = RawResponseMessage except ImportError: # pragma: no cover pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/http_websocket.py0000644000175100001710000006141700000000000017613 0ustar00runnerdocker"""WebSocket protocol versions 13 and 8.""" import asyncio import collections import json import random import re import sys import zlib from enum import IntEnum from struct import Struct from typing import Any, Callable, List, Optional, Pattern, Set, Tuple, Union, cast from .base_protocol import BaseProtocol from .helpers import NO_EXTENSIONS from .streams import DataQueue from .typedefs import Final __all__ = ( "WS_CLOSED_MESSAGE", "WS_CLOSING_MESSAGE", "WS_KEY", "WebSocketReader", "WebSocketWriter", "WSMessage", "WebSocketError", "WSMsgType", "WSCloseCode", ) class WSCloseCode(IntEnum): OK = 1000 GOING_AWAY = 1001 PROTOCOL_ERROR = 1002 UNSUPPORTED_DATA = 1003 ABNORMAL_CLOSURE = 1006 INVALID_TEXT = 1007 POLICY_VIOLATION = 1008 MESSAGE_TOO_BIG = 1009 MANDATORY_EXTENSION = 1010 INTERNAL_ERROR = 1011 SERVICE_RESTART = 1012 TRY_AGAIN_LATER = 1013 BAD_GATEWAY = 1014 ALLOWED_CLOSE_CODES: Final[Set[int]] = {int(i) for i in WSCloseCode} class WSMsgType(IntEnum): # websocket spec types CONTINUATION = 0x0 TEXT = 0x1 BINARY = 0x2 PING = 0x9 PONG = 0xA CLOSE = 0x8 # aiohttp specific types CLOSING = 0x100 CLOSED = 0x101 ERROR = 0x102 text = TEXT binary = BINARY ping = PING pong = PONG close = CLOSE closing = CLOSING closed = CLOSED error = ERROR WS_KEY: Final[bytes] = b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11" UNPACK_LEN2 = Struct("!H").unpack_from UNPACK_LEN3 = Struct("!Q").unpack_from UNPACK_CLOSE_CODE = Struct("!H").unpack PACK_LEN1 = Struct("!BB").pack PACK_LEN2 = Struct("!BBH").pack PACK_LEN3 = Struct("!BBQ").pack PACK_CLOSE_CODE = Struct("!H").pack MSG_SIZE: Final[int] = 2 ** 14 DEFAULT_LIMIT: Final[int] = 2 ** 16 _WSMessageBase = collections.namedtuple("_WSMessageBase", ["type", "data", "extra"]) class WSMessage(_WSMessageBase): def json(self, *, loads: Callable[[Any], Any] = json.loads) -> Any: """Return parsed JSON data. .. versionadded:: 0.22 """ return loads(self.data) WS_CLOSED_MESSAGE = WSMessage(WSMsgType.CLOSED, None, None) WS_CLOSING_MESSAGE = WSMessage(WSMsgType.CLOSING, None, None) class WebSocketError(Exception): """WebSocket protocol parser error.""" def __init__(self, code: int, message: str) -> None: self.code = code super().__init__(code, message) def __str__(self) -> str: return cast(str, self.args[1]) class WSHandshakeError(Exception): """WebSocket protocol handshake error.""" native_byteorder: Final[str] = sys.byteorder # Used by _websocket_mask_python _XOR_TABLE: Final[List[bytes]] = [bytes(a ^ b for a in range(256)) for b in range(256)] def _websocket_mask_python(mask: bytes, data: bytearray) -> None: """Websocket masking function. `mask` is a `bytes` object of length 4; `data` is a `bytearray` object of any length. The contents of `data` are masked with `mask`, as specified in section 5.3 of RFC 6455. Note that this function mutates the `data` argument. This pure-python implementation may be replaced by an optimized version when available. """ assert isinstance(data, bytearray), data assert len(mask) == 4, mask if data: a, b, c, d = (_XOR_TABLE[n] for n in mask) data[::4] = data[::4].translate(a) data[1::4] = data[1::4].translate(b) data[2::4] = data[2::4].translate(c) data[3::4] = data[3::4].translate(d) if NO_EXTENSIONS: # pragma: no cover _websocket_mask = _websocket_mask_python else: try: from ._websocket import _websocket_mask_cython # type: ignore[import] _websocket_mask = _websocket_mask_cython except ImportError: # pragma: no cover _websocket_mask = _websocket_mask_python _WS_DEFLATE_TRAILING: Final[bytes] = bytes([0x00, 0x00, 0xFF, 0xFF]) _WS_EXT_RE: Final[Pattern[str]] = re.compile( r"^(?:;\s*(?:" r"(server_no_context_takeover)|" r"(client_no_context_takeover)|" r"(server_max_window_bits(?:=(\d+))?)|" r"(client_max_window_bits(?:=(\d+))?)))*$" ) _WS_EXT_RE_SPLIT: Final[Pattern[str]] = re.compile(r"permessage-deflate([^,]+)?") def ws_ext_parse(extstr: Optional[str], isserver: bool = False) -> Tuple[int, bool]: if not extstr: return 0, False compress = 0 notakeover = False for ext in _WS_EXT_RE_SPLIT.finditer(extstr): defext = ext.group(1) # Return compress = 15 when get `permessage-deflate` if not defext: compress = 15 break match = _WS_EXT_RE.match(defext) if match: compress = 15 if isserver: # Server never fail to detect compress handshake. # Server does not need to send max wbit to client if match.group(4): compress = int(match.group(4)) # Group3 must match if group4 matches # Compress wbit 8 does not support in zlib # If compress level not support, # CONTINUE to next extension if compress > 15 or compress < 9: compress = 0 continue if match.group(1): notakeover = True # Ignore regex group 5 & 6 for client_max_window_bits break else: if match.group(6): compress = int(match.group(6)) # Group5 must match if group6 matches # Compress wbit 8 does not support in zlib # If compress level not support, # FAIL the parse progress if compress > 15 or compress < 9: raise WSHandshakeError("Invalid window size") if match.group(2): notakeover = True # Ignore regex group 5 & 6 for client_max_window_bits break # Return Fail if client side and not match elif not isserver: raise WSHandshakeError("Extension for deflate not supported" + ext.group(1)) return compress, notakeover def ws_ext_gen( compress: int = 15, isserver: bool = False, server_notakeover: bool = False ) -> str: # client_notakeover=False not used for server # compress wbit 8 does not support in zlib if compress < 9 or compress > 15: raise ValueError( "Compress wbits must between 9 and 15, " "zlib does not support wbits=8" ) enabledext = ["permessage-deflate"] if not isserver: enabledext.append("client_max_window_bits") if compress < 15: enabledext.append("server_max_window_bits=" + str(compress)) if server_notakeover: enabledext.append("server_no_context_takeover") # if client_notakeover: # enabledext.append('client_no_context_takeover') return "; ".join(enabledext) class WSParserState(IntEnum): READ_HEADER = 1 READ_PAYLOAD_LENGTH = 2 READ_PAYLOAD_MASK = 3 READ_PAYLOAD = 4 class WebSocketReader: def __init__( self, queue: DataQueue[WSMessage], max_msg_size: int, compress: bool = True ) -> None: self.queue = queue self._max_msg_size = max_msg_size self._exc = None # type: Optional[BaseException] self._partial = bytearray() self._state = WSParserState.READ_HEADER self._opcode = None # type: Optional[int] self._frame_fin = False self._frame_opcode = None # type: Optional[int] self._frame_payload = bytearray() self._tail = b"" self._has_mask = False self._frame_mask = None # type: Optional[bytes] self._payload_length = 0 self._payload_length_flag = 0 self._compressed = None # type: Optional[bool] self._decompressobj = None # type: Any # zlib.decompressobj actually self._compress = compress def feed_eof(self) -> None: self.queue.feed_eof() def feed_data(self, data: bytes) -> Tuple[bool, bytes]: if self._exc: return True, data try: return self._feed_data(data) except Exception as exc: self._exc = exc self.queue.set_exception(exc) return True, b"" def _feed_data(self, data: bytes) -> Tuple[bool, bytes]: for fin, opcode, payload, compressed in self.parse_frame(data): if compressed and not self._decompressobj: self._decompressobj = zlib.decompressobj(wbits=-zlib.MAX_WBITS) if opcode == WSMsgType.CLOSE: if len(payload) >= 2: close_code = UNPACK_CLOSE_CODE(payload[:2])[0] if close_code < 3000 and close_code not in ALLOWED_CLOSE_CODES: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, f"Invalid close code: {close_code}", ) try: close_message = payload[2:].decode("utf-8") except UnicodeDecodeError as exc: raise WebSocketError( WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" ) from exc msg = WSMessage(WSMsgType.CLOSE, close_code, close_message) elif payload: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, f"Invalid close frame: {fin} {opcode} {payload!r}", ) else: msg = WSMessage(WSMsgType.CLOSE, 0, "") self.queue.feed_data(msg, 0) elif opcode == WSMsgType.PING: self.queue.feed_data( WSMessage(WSMsgType.PING, payload, ""), len(payload) ) elif opcode == WSMsgType.PONG: self.queue.feed_data( WSMessage(WSMsgType.PONG, payload, ""), len(payload) ) elif ( opcode not in (WSMsgType.TEXT, WSMsgType.BINARY) and self._opcode is None ): raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, f"Unexpected opcode={opcode!r}" ) else: # load text/binary if not fin: # got partial frame payload if opcode != WSMsgType.CONTINUATION: self._opcode = opcode self._partial.extend(payload) if self._max_msg_size and len(self._partial) >= self._max_msg_size: raise WebSocketError( WSCloseCode.MESSAGE_TOO_BIG, "Message size {} exceeds limit {}".format( len(self._partial), self._max_msg_size ), ) else: # previous frame was non finished # we should get continuation opcode if self._partial: if opcode != WSMsgType.CONTINUATION: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, "The opcode in non-fin frame is expected " "to be zero, got {!r}".format(opcode), ) if opcode == WSMsgType.CONTINUATION: assert self._opcode is not None opcode = self._opcode self._opcode = None self._partial.extend(payload) if self._max_msg_size and len(self._partial) >= self._max_msg_size: raise WebSocketError( WSCloseCode.MESSAGE_TOO_BIG, "Message size {} exceeds limit {}".format( len(self._partial), self._max_msg_size ), ) # Decompress process must to be done after all packets # received. if compressed: self._partial.extend(_WS_DEFLATE_TRAILING) payload_merged = self._decompressobj.decompress( self._partial, self._max_msg_size ) if self._decompressobj.unconsumed_tail: left = len(self._decompressobj.unconsumed_tail) raise WebSocketError( WSCloseCode.MESSAGE_TOO_BIG, "Decompressed message size {} exceeds limit {}".format( self._max_msg_size + left, self._max_msg_size ), ) else: payload_merged = bytes(self._partial) self._partial.clear() if opcode == WSMsgType.TEXT: try: text = payload_merged.decode("utf-8") self.queue.feed_data( WSMessage(WSMsgType.TEXT, text, ""), len(text) ) except UnicodeDecodeError as exc: raise WebSocketError( WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" ) from exc else: self.queue.feed_data( WSMessage(WSMsgType.BINARY, payload_merged, ""), len(payload_merged), ) return False, b"" def parse_frame( self, buf: bytes ) -> List[Tuple[bool, Optional[int], bytearray, Optional[bool]]]: """Return the next frame from the socket.""" frames = [] if self._tail: buf, self._tail = self._tail + buf, b"" start_pos = 0 buf_length = len(buf) while True: # read header if self._state == WSParserState.READ_HEADER: if buf_length - start_pos >= 2: data = buf[start_pos : start_pos + 2] start_pos += 2 first_byte, second_byte = data fin = (first_byte >> 7) & 1 rsv1 = (first_byte >> 6) & 1 rsv2 = (first_byte >> 5) & 1 rsv3 = (first_byte >> 4) & 1 opcode = first_byte & 0xF # frame-fin = %x0 ; more frames of this message follow # / %x1 ; final frame of this message # frame-rsv1 = %x0 ; # 1 bit, MUST be 0 unless negotiated otherwise # frame-rsv2 = %x0 ; # 1 bit, MUST be 0 unless negotiated otherwise # frame-rsv3 = %x0 ; # 1 bit, MUST be 0 unless negotiated otherwise # # Remove rsv1 from this test for deflate development if rsv2 or rsv3 or (rsv1 and not self._compress): raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, "Received frame with non-zero reserved bits", ) if opcode > 0x7 and fin == 0: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, "Received fragmented control frame", ) has_mask = (second_byte >> 7) & 1 length = second_byte & 0x7F # Control frames MUST have a payload # length of 125 bytes or less if opcode > 0x7 and length > 125: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, "Control frame payload cannot be " "larger than 125 bytes", ) # Set compress status if last package is FIN # OR set compress status if this is first fragment # Raise error if not first fragment with rsv1 = 0x1 if self._frame_fin or self._compressed is None: self._compressed = True if rsv1 else False elif rsv1: raise WebSocketError( WSCloseCode.PROTOCOL_ERROR, "Received frame with non-zero reserved bits", ) self._frame_fin = bool(fin) self._frame_opcode = opcode self._has_mask = bool(has_mask) self._payload_length_flag = length self._state = WSParserState.READ_PAYLOAD_LENGTH else: break # read payload length if self._state == WSParserState.READ_PAYLOAD_LENGTH: length = self._payload_length_flag if length == 126: if buf_length - start_pos >= 2: data = buf[start_pos : start_pos + 2] start_pos += 2 length = UNPACK_LEN2(data)[0] self._payload_length = length self._state = ( WSParserState.READ_PAYLOAD_MASK if self._has_mask else WSParserState.READ_PAYLOAD ) else: break elif length > 126: if buf_length - start_pos >= 8: data = buf[start_pos : start_pos + 8] start_pos += 8 length = UNPACK_LEN3(data)[0] self._payload_length = length self._state = ( WSParserState.READ_PAYLOAD_MASK if self._has_mask else WSParserState.READ_PAYLOAD ) else: break else: self._payload_length = length self._state = ( WSParserState.READ_PAYLOAD_MASK if self._has_mask else WSParserState.READ_PAYLOAD ) # read payload mask if self._state == WSParserState.READ_PAYLOAD_MASK: if buf_length - start_pos >= 4: self._frame_mask = buf[start_pos : start_pos + 4] start_pos += 4 self._state = WSParserState.READ_PAYLOAD else: break if self._state == WSParserState.READ_PAYLOAD: length = self._payload_length payload = self._frame_payload chunk_len = buf_length - start_pos if length >= chunk_len: self._payload_length = length - chunk_len payload.extend(buf[start_pos:]) start_pos = buf_length else: self._payload_length = 0 payload.extend(buf[start_pos : start_pos + length]) start_pos = start_pos + length if self._payload_length == 0: if self._has_mask: assert self._frame_mask is not None _websocket_mask(self._frame_mask, payload) frames.append( (self._frame_fin, self._frame_opcode, payload, self._compressed) ) self._frame_payload = bytearray() self._state = WSParserState.READ_HEADER else: break self._tail = buf[start_pos:] return frames class WebSocketWriter: def __init__( self, protocol: BaseProtocol, transport: asyncio.Transport, *, use_mask: bool = False, limit: int = DEFAULT_LIMIT, random: Any = random.Random(), compress: int = 0, notakeover: bool = False, ) -> None: self.protocol = protocol self.transport = transport self.use_mask = use_mask self.randrange = random.randrange self.compress = compress self.notakeover = notakeover self._closing = False self._limit = limit self._output_size = 0 self._compressobj = None # type: Any # actually compressobj async def _send_frame( self, message: bytes, opcode: int, compress: Optional[int] = None ) -> None: """Send a frame over the websocket with message as its payload.""" if self._closing and not (opcode & WSMsgType.CLOSE): raise ConnectionResetError("Cannot write to closing transport") rsv = 0 # Only compress larger packets (disabled) # Does small packet needs to be compressed? # if self.compress and opcode < 8 and len(message) > 124: if (compress or self.compress) and opcode < 8: if compress: # Do not set self._compress if compressing is for this frame compressobj = zlib.compressobj(level=zlib.Z_BEST_SPEED, wbits=-compress) else: # self.compress if not self._compressobj: self._compressobj = zlib.compressobj( level=zlib.Z_BEST_SPEED, wbits=-self.compress ) compressobj = self._compressobj message = compressobj.compress(message) message = message + compressobj.flush( zlib.Z_FULL_FLUSH if self.notakeover else zlib.Z_SYNC_FLUSH ) if message.endswith(_WS_DEFLATE_TRAILING): message = message[:-4] rsv = rsv | 0x40 msg_length = len(message) use_mask = self.use_mask if use_mask: mask_bit = 0x80 else: mask_bit = 0 if msg_length < 126: header = PACK_LEN1(0x80 | rsv | opcode, msg_length | mask_bit) elif msg_length < (1 << 16): header = PACK_LEN2(0x80 | rsv | opcode, 126 | mask_bit, msg_length) else: header = PACK_LEN3(0x80 | rsv | opcode, 127 | mask_bit, msg_length) if use_mask: mask = self.randrange(0, 0xFFFFFFFF) mask = mask.to_bytes(4, "big") message = bytearray(message) _websocket_mask(mask, message) self._write(header + mask + message) self._output_size += len(header) + len(mask) + len(message) else: if len(message) > MSG_SIZE: self._write(header) self._write(message) else: self._write(header + message) self._output_size += len(header) + len(message) if self._output_size > self._limit: self._output_size = 0 await self.protocol._drain_helper() def _write(self, data: bytes) -> None: if self.transport is None or self.transport.is_closing(): raise ConnectionResetError("Cannot write to closing transport") self.transport.write(data) async def pong(self, message: bytes = b"") -> None: """Send pong message.""" if isinstance(message, str): message = message.encode("utf-8") await self._send_frame(message, WSMsgType.PONG) async def ping(self, message: bytes = b"") -> None: """Send ping message.""" if isinstance(message, str): message = message.encode("utf-8") await self._send_frame(message, WSMsgType.PING) async def send( self, message: Union[str, bytes], binary: bool = False, compress: Optional[int] = None, ) -> None: """Send a frame over the websocket with message as its payload.""" if isinstance(message, str): message = message.encode("utf-8") if binary: await self._send_frame(message, WSMsgType.BINARY, compress) else: await self._send_frame(message, WSMsgType.TEXT, compress) async def close(self, code: int = 1000, message: bytes = b"") -> None: """Close the websocket, sending the specified code and message.""" if isinstance(message, str): message = message.encode("utf-8") try: await self._send_frame( PACK_CLOSE_CODE(code) + message, opcode=WSMsgType.CLOSE ) finally: self._closing = True ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/http_writer.py0000644000175100001710000001353000000000000017132 0ustar00runnerdocker"""Http related parsers and protocol.""" import asyncio import zlib from typing import Any, Awaitable, Callable, NamedTuple, Optional, Union # noqa from multidict import CIMultiDict from .abc import AbstractStreamWriter from .base_protocol import BaseProtocol from .helpers import NO_EXTENSIONS __all__ = ("StreamWriter", "HttpVersion", "HttpVersion10", "HttpVersion11") class HttpVersion(NamedTuple): major: int minor: int HttpVersion10 = HttpVersion(1, 0) HttpVersion11 = HttpVersion(1, 1) _T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] _T_OnHeadersSent = Optional[Callable[["CIMultiDict[str]"], Awaitable[None]]] class StreamWriter(AbstractStreamWriter): def __init__( self, protocol: BaseProtocol, loop: asyncio.AbstractEventLoop, on_chunk_sent: _T_OnChunkSent = None, on_headers_sent: _T_OnHeadersSent = None, ) -> None: self._protocol = protocol self._transport = protocol.transport self.loop = loop self.length = None self.chunked = False self.buffer_size = 0 self.output_size = 0 self._eof = False self._compress = None # type: Any self._drain_waiter = None self._on_chunk_sent = on_chunk_sent # type: _T_OnChunkSent self._on_headers_sent = on_headers_sent # type: _T_OnHeadersSent @property def transport(self) -> Optional[asyncio.Transport]: return self._transport @property def protocol(self) -> BaseProtocol: return self._protocol def enable_chunking(self) -> None: self.chunked = True def enable_compression( self, encoding: str = "deflate", strategy: int = zlib.Z_DEFAULT_STRATEGY ) -> None: zlib_mode = 16 + zlib.MAX_WBITS if encoding == "gzip" else zlib.MAX_WBITS self._compress = zlib.compressobj(wbits=zlib_mode, strategy=strategy) def _write(self, chunk: bytes) -> None: size = len(chunk) self.buffer_size += size self.output_size += size if self._transport is None or self._transport.is_closing(): raise ConnectionResetError("Cannot write to closing transport") self._transport.write(chunk) async def write( self, chunk: bytes, *, drain: bool = True, LIMIT: int = 0x10000 ) -> None: """Writes chunk of data to a stream. write_eof() indicates end of stream. writer can't be used after write_eof() method being called. write() return drain future. """ if self._on_chunk_sent is not None: await self._on_chunk_sent(chunk) if isinstance(chunk, memoryview): if chunk.nbytes != len(chunk): # just reshape it chunk = chunk.cast("c") if self._compress is not None: chunk = self._compress.compress(chunk) if not chunk: return if self.length is not None: chunk_len = len(chunk) if self.length >= chunk_len: self.length = self.length - chunk_len else: chunk = chunk[: self.length] self.length = 0 if not chunk: return if chunk: if self.chunked: chunk_len_pre = ("%x\r\n" % len(chunk)).encode("ascii") chunk = chunk_len_pre + chunk + b"\r\n" self._write(chunk) if self.buffer_size > LIMIT and drain: self.buffer_size = 0 await self.drain() async def write_headers( self, status_line: str, headers: "CIMultiDict[str]" ) -> None: """Write request/response status and headers.""" if self._on_headers_sent is not None: await self._on_headers_sent(headers) # status + headers buf = _serialize_headers(status_line, headers) self._write(buf) async def write_eof(self, chunk: bytes = b"") -> None: if self._eof: return if chunk and self._on_chunk_sent is not None: await self._on_chunk_sent(chunk) if self._compress: if chunk: chunk = self._compress.compress(chunk) chunk = chunk + self._compress.flush() if chunk and self.chunked: chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" else: if self.chunked: if chunk: chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" else: chunk = b"0\r\n\r\n" if chunk: self._write(chunk) await self.drain() self._eof = True self._transport = None async def drain(self) -> None: """Flush the write buffer. The intended use is to write await w.write(data) await w.drain() """ if self._protocol.transport is not None: await self._protocol._drain_helper() def _safe_header(string: str) -> str: if "\r" in string or "\n" in string: raise ValueError( "Newline or carriage return detected in headers. " "Potential header injection attack." ) return string def _py_serialize_headers(status_line: str, headers: "CIMultiDict[str]") -> bytes: headers_gen = (_safe_header(k) + ": " + _safe_header(v) for k, v in headers.items()) line = status_line + "\r\n" + "\r\n".join(headers_gen) + "\r\n\r\n" return line.encode("utf-8") _serialize_headers = _py_serialize_headers try: import aiohttp._http_writer as _http_writer # type: ignore[import] _c_serialize_headers = _http_writer._serialize_headers if not NO_EXTENSIONS: _serialize_headers = _c_serialize_headers except ImportError: pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/locks.py0000644000175100001710000000220000000000000015662 0ustar00runnerdockerimport asyncio import collections from typing import Any, Deque, Optional class EventResultOrError: """Event asyncio lock helper class. Wraps the Event asyncio lock allowing either to awake the locked Tasks without any error or raising an exception. thanks to @vorpalsmith for the simple design. """ def __init__(self, loop: asyncio.AbstractEventLoop) -> None: self._loop = loop self._exc = None # type: Optional[BaseException] self._event = asyncio.Event() self._waiters = collections.deque() # type: Deque[asyncio.Future[Any]] def set(self, exc: Optional[BaseException] = None) -> None: self._exc = exc self._event.set() async def wait(self) -> Any: waiter = self._loop.create_task(self._event.wait()) self._waiters.append(waiter) try: val = await waiter finally: self._waiters.remove(waiter) if self._exc is not None: raise self._exc return val def cancel(self) -> None: """Cancel all waiters""" for waiter in self._waiters: waiter.cancel() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/log.py0000644000175100001710000000050500000000000015336 0ustar00runnerdockerimport logging access_logger = logging.getLogger("aiohttp.access") client_logger = logging.getLogger("aiohttp.client") internal_logger = logging.getLogger("aiohttp.internal") server_logger = logging.getLogger("aiohttp.server") web_logger = logging.getLogger("aiohttp.web") ws_logger = logging.getLogger("aiohttp.websocket") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/multipart.py0000644000175100001710000007726500000000000016617 0ustar00runnerdockerimport base64 import binascii import json import re import uuid import warnings import zlib from collections import deque from types import TracebackType from typing import ( TYPE_CHECKING, Any, AsyncIterator, Deque, Dict, Iterator, List, Mapping, Optional, Sequence, Tuple, Type, Union, cast, ) from urllib.parse import parse_qsl, unquote, urlencode from multidict import CIMultiDict, CIMultiDictProxy, MultiMapping from .hdrs import ( CONTENT_DISPOSITION, CONTENT_ENCODING, CONTENT_LENGTH, CONTENT_TRANSFER_ENCODING, CONTENT_TYPE, ) from .helpers import CHAR, TOKEN, parse_mimetype, reify from .http import HeadersParser from .payload import ( JsonPayload, LookupError, Order, Payload, StringPayload, get_payload, payload_type, ) from .streams import StreamReader __all__ = ( "MultipartReader", "MultipartWriter", "BodyPartReader", "BadContentDispositionHeader", "BadContentDispositionParam", "parse_content_disposition", "content_disposition_filename", ) if TYPE_CHECKING: # pragma: no cover from .client_reqrep import ClientResponse class BadContentDispositionHeader(RuntimeWarning): pass class BadContentDispositionParam(RuntimeWarning): pass def parse_content_disposition( header: Optional[str], ) -> Tuple[Optional[str], Dict[str, str]]: def is_token(string: str) -> bool: return bool(string) and TOKEN >= set(string) def is_quoted(string: str) -> bool: return string[0] == string[-1] == '"' def is_rfc5987(string: str) -> bool: return is_token(string) and string.count("'") == 2 def is_extended_param(string: str) -> bool: return string.endswith("*") def is_continuous_param(string: str) -> bool: pos = string.find("*") + 1 if not pos: return False substring = string[pos:-1] if string.endswith("*") else string[pos:] return substring.isdigit() def unescape(text: str, *, chars: str = "".join(map(re.escape, CHAR))) -> str: return re.sub(f"\\\\([{chars}])", "\\1", text) if not header: return None, {} disptype, *parts = header.split(";") if not is_token(disptype): warnings.warn(BadContentDispositionHeader(header)) return None, {} params = {} # type: Dict[str, str] while parts: item = parts.pop(0) if "=" not in item: warnings.warn(BadContentDispositionHeader(header)) return None, {} key, value = item.split("=", 1) key = key.lower().strip() value = value.lstrip() if key in params: warnings.warn(BadContentDispositionHeader(header)) return None, {} if not is_token(key): warnings.warn(BadContentDispositionParam(item)) continue elif is_continuous_param(key): if is_quoted(value): value = unescape(value[1:-1]) elif not is_token(value): warnings.warn(BadContentDispositionParam(item)) continue elif is_extended_param(key): if is_rfc5987(value): encoding, _, value = value.split("'", 2) encoding = encoding or "utf-8" else: warnings.warn(BadContentDispositionParam(item)) continue try: value = unquote(value, encoding, "strict") except UnicodeDecodeError: # pragma: nocover warnings.warn(BadContentDispositionParam(item)) continue else: failed = True if is_quoted(value): failed = False value = unescape(value[1:-1].lstrip("\\/")) elif is_token(value): failed = False elif parts: # maybe just ; in filename, in any case this is just # one case fix, for proper fix we need to redesign parser _value = f"{value};{parts[0]}" if is_quoted(_value): parts.pop(0) value = unescape(_value[1:-1].lstrip("\\/")) failed = False if failed: warnings.warn(BadContentDispositionHeader(header)) return None, {} params[key] = value return disptype.lower(), params def content_disposition_filename( params: Mapping[str, str], name: str = "filename" ) -> Optional[str]: name_suf = "%s*" % name if not params: return None elif name_suf in params: return params[name_suf] elif name in params: return params[name] else: parts = [] fnparams = sorted( (key, value) for key, value in params.items() if key.startswith(name_suf) ) for num, (key, value) in enumerate(fnparams): _, tail = key.split("*", 1) if tail.endswith("*"): tail = tail[:-1] if tail == str(num): parts.append(value) else: break if not parts: return None value = "".join(parts) if "'" in value: encoding, _, value = value.split("'", 2) encoding = encoding or "utf-8" return unquote(value, encoding, "strict") return value class MultipartResponseWrapper: """Wrapper around the MultipartReader. It takes care about underlying connection and close it when it needs in. """ def __init__( self, resp: "ClientResponse", stream: "MultipartReader", ) -> None: self.resp = resp self.stream = stream def __aiter__(self) -> "MultipartResponseWrapper": return self async def __anext__( self, ) -> Union["MultipartReader", "BodyPartReader"]: part = await self.next() if part is None: raise StopAsyncIteration return part def at_eof(self) -> bool: """Returns True when all response data had been read.""" return self.resp.content.at_eof() async def next( self, ) -> Optional[Union["MultipartReader", "BodyPartReader"]]: """Emits next multipart reader object.""" item = await self.stream.next() if self.stream.at_eof(): await self.release() return item async def release(self) -> None: """Release the connection gracefully. All remaining content is read to the void. """ await self.resp.release() class BodyPartReader: """Multipart reader for single body part.""" chunk_size = 8192 def __init__( self, boundary: bytes, headers: "CIMultiDictProxy[str]", content: StreamReader ) -> None: self.headers = headers self._boundary = boundary self._content = content self._at_eof = False length = self.headers.get(CONTENT_LENGTH, None) self._length = int(length) if length is not None else None self._read_bytes = 0 # TODO: typeing.Deque is not supported by Python 3.5 self._unread: Deque[bytes] = deque() self._prev_chunk = None # type: Optional[bytes] self._content_eof = 0 self._cache = {} # type: Dict[str, Any] def __aiter__(self) -> AsyncIterator["BodyPartReader"]: return self # type: ignore[return-value] async def __anext__(self) -> bytes: part = await self.next() if part is None: raise StopAsyncIteration return part async def next(self) -> Optional[bytes]: item = await self.read() if not item: return None return item async def read(self, *, decode: bool = False) -> bytes: """Reads body part data. decode: Decodes data following by encoding method from Content-Encoding header. If it missed data remains untouched """ if self._at_eof: return b"" data = bytearray() while not self._at_eof: data.extend(await self.read_chunk(self.chunk_size)) if decode: return self.decode(data) return data async def read_chunk(self, size: int = chunk_size) -> bytes: """Reads body part content chunk of the specified size. size: chunk size """ if self._at_eof: return b"" if self._length: chunk = await self._read_chunk_from_length(size) else: chunk = await self._read_chunk_from_stream(size) self._read_bytes += len(chunk) if self._read_bytes == self._length: self._at_eof = True if self._at_eof: clrf = await self._content.readline() assert ( b"\r\n" == clrf ), "reader did not read all the data or it is malformed" return chunk async def _read_chunk_from_length(self, size: int) -> bytes: # Reads body part content chunk of the specified size. # The body part must has Content-Length header with proper value. assert self._length is not None, "Content-Length required for chunked read" chunk_size = min(size, self._length - self._read_bytes) chunk = await self._content.read(chunk_size) return chunk async def _read_chunk_from_stream(self, size: int) -> bytes: # Reads content chunk of body part with unknown length. # The Content-Length header for body part is not necessary. assert ( size >= len(self._boundary) + 2 ), "Chunk size must be greater or equal than boundary length + 2" first_chunk = self._prev_chunk is None if first_chunk: self._prev_chunk = await self._content.read(size) chunk = await self._content.read(size) self._content_eof += int(self._content.at_eof()) assert self._content_eof < 3, "Reading after EOF" assert self._prev_chunk is not None window = self._prev_chunk + chunk sub = b"\r\n" + self._boundary if first_chunk: idx = window.find(sub) else: idx = window.find(sub, max(0, len(self._prev_chunk) - len(sub))) if idx >= 0: # pushing boundary back to content with warnings.catch_warnings(): warnings.filterwarnings("ignore", category=DeprecationWarning) self._content.unread_data(window[idx:]) if size > idx: self._prev_chunk = self._prev_chunk[:idx] chunk = window[len(self._prev_chunk) : idx] if not chunk: self._at_eof = True result = self._prev_chunk self._prev_chunk = chunk return result async def readline(self) -> bytes: """Reads body part by line by line.""" if self._at_eof: return b"" if self._unread: line = self._unread.popleft() else: line = await self._content.readline() if line.startswith(self._boundary): # the very last boundary may not come with \r\n, # so set single rules for everyone sline = line.rstrip(b"\r\n") boundary = self._boundary last_boundary = self._boundary + b"--" # ensure that we read exactly the boundary, not something alike if sline == boundary or sline == last_boundary: self._at_eof = True self._unread.append(line) return b"" else: next_line = await self._content.readline() if next_line.startswith(self._boundary): line = line[:-2] # strip CRLF but only once self._unread.append(next_line) return line async def release(self) -> None: """Like read(), but reads all the data to the void.""" if self._at_eof: return while not self._at_eof: await self.read_chunk(self.chunk_size) async def text(self, *, encoding: Optional[str] = None) -> str: """Like read(), but assumes that body part contains text data.""" data = await self.read(decode=True) # see https://www.w3.org/TR/html5/forms.html#multipart/form-data-encoding-algorithm # NOQA # and https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-send # NOQA encoding = encoding or self.get_charset(default="utf-8") return data.decode(encoding) async def json(self, *, encoding: Optional[str] = None) -> Optional[Dict[str, Any]]: """Like read(), but assumes that body parts contains JSON data.""" data = await self.read(decode=True) if not data: return None encoding = encoding or self.get_charset(default="utf-8") return cast(Dict[str, Any], json.loads(data.decode(encoding))) async def form(self, *, encoding: Optional[str] = None) -> List[Tuple[str, str]]: """Like read(), but assumes that body parts contain form urlencoded data.""" data = await self.read(decode=True) if not data: return [] if encoding is not None: real_encoding = encoding else: real_encoding = self.get_charset(default="utf-8") return parse_qsl( data.rstrip().decode(real_encoding), keep_blank_values=True, encoding=real_encoding, ) def at_eof(self) -> bool: """Returns True if the boundary was reached or False otherwise.""" return self._at_eof def decode(self, data: bytes) -> bytes: """Decodes data. Decoding is done according the specified Content-Encoding or Content-Transfer-Encoding headers value. """ if CONTENT_TRANSFER_ENCODING in self.headers: data = self._decode_content_transfer(data) if CONTENT_ENCODING in self.headers: return self._decode_content(data) return data def _decode_content(self, data: bytes) -> bytes: encoding = self.headers.get(CONTENT_ENCODING, "").lower() if encoding == "deflate": return zlib.decompress(data, -zlib.MAX_WBITS) elif encoding == "gzip": return zlib.decompress(data, 16 + zlib.MAX_WBITS) elif encoding == "identity": return data else: raise RuntimeError(f"unknown content encoding: {encoding}") def _decode_content_transfer(self, data: bytes) -> bytes: encoding = self.headers.get(CONTENT_TRANSFER_ENCODING, "").lower() if encoding == "base64": return base64.b64decode(data) elif encoding == "quoted-printable": return binascii.a2b_qp(data) elif encoding in ("binary", "8bit", "7bit"): return data else: raise RuntimeError( "unknown content transfer encoding: {}" "".format(encoding) ) def get_charset(self, default: str) -> str: """Returns charset parameter from Content-Type header or default.""" ctype = self.headers.get(CONTENT_TYPE, "") mimetype = parse_mimetype(ctype) return mimetype.parameters.get("charset", default) @reify def name(self) -> Optional[str]: """Returns name specified in Content-Disposition header. If the header is missing or malformed, returns None. """ _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) return content_disposition_filename(params, "name") @reify def filename(self) -> Optional[str]: """Returns filename specified in Content-Disposition header. Returns None if the header is missing or malformed. """ _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) return content_disposition_filename(params, "filename") @payload_type(BodyPartReader, order=Order.try_first) class BodyPartReaderPayload(Payload): def __init__(self, value: BodyPartReader, *args: Any, **kwargs: Any) -> None: super().__init__(value, *args, **kwargs) params = {} # type: Dict[str, str] if value.name is not None: params["name"] = value.name if value.filename is not None: params["filename"] = value.filename if params: self.set_content_disposition("attachment", True, **params) async def write(self, writer: Any) -> None: field = self._value chunk = await field.read_chunk(size=2 ** 16) while chunk: await writer.write(field.decode(chunk)) chunk = await field.read_chunk(size=2 ** 16) class MultipartReader: """Multipart body reader.""" #: Response wrapper, used when multipart readers constructs from response. response_wrapper_cls = MultipartResponseWrapper #: Multipart reader class, used to handle multipart/* body parts. #: None points to type(self) multipart_reader_cls = None #: Body part reader class for non multipart/* content types. part_reader_cls = BodyPartReader def __init__(self, headers: Mapping[str, str], content: StreamReader) -> None: self.headers = headers self._boundary = ("--" + self._get_boundary()).encode() self._content = content self._last_part = ( None ) # type: Optional[Union['MultipartReader', BodyPartReader]] self._at_eof = False self._at_bof = True self._unread = [] # type: List[bytes] def __aiter__( self, ) -> AsyncIterator["BodyPartReader"]: return self # type: ignore[return-value] async def __anext__( self, ) -> Optional[Union["MultipartReader", BodyPartReader]]: part = await self.next() if part is None: raise StopAsyncIteration return part @classmethod def from_response( cls, response: "ClientResponse", ) -> MultipartResponseWrapper: """Constructs reader instance from HTTP response. :param response: :class:`~aiohttp.client.ClientResponse` instance """ obj = cls.response_wrapper_cls( response, cls(response.headers, response.content) ) return obj def at_eof(self) -> bool: """Returns True if the final boundary was reached, false otherwise.""" return self._at_eof async def next( self, ) -> Optional[Union["MultipartReader", BodyPartReader]]: """Emits the next multipart body part.""" # So, if we're at BOF, we need to skip till the boundary. if self._at_eof: return None await self._maybe_release_last_part() if self._at_bof: await self._read_until_first_boundary() self._at_bof = False else: await self._read_boundary() if self._at_eof: # we just read the last boundary, nothing to do there return None self._last_part = await self.fetch_next_part() return self._last_part async def release(self) -> None: """Reads all the body parts to the void till the final boundary.""" while not self._at_eof: item = await self.next() if item is None: break await item.release() async def fetch_next_part( self, ) -> Union["MultipartReader", BodyPartReader]: """Returns the next body part reader.""" headers = await self._read_headers() return self._get_part_reader(headers) def _get_part_reader( self, headers: "CIMultiDictProxy[str]", ) -> Union["MultipartReader", BodyPartReader]: """Dispatches the response by the `Content-Type` header. Returns a suitable reader instance. :param dict headers: Response headers """ ctype = headers.get(CONTENT_TYPE, "") mimetype = parse_mimetype(ctype) if mimetype.type == "multipart": if self.multipart_reader_cls is None: return type(self)(headers, self._content) return self.multipart_reader_cls(headers, self._content) else: return self.part_reader_cls(self._boundary, headers, self._content) def _get_boundary(self) -> str: mimetype = parse_mimetype(self.headers[CONTENT_TYPE]) assert mimetype.type == "multipart", "multipart/* content type expected" if "boundary" not in mimetype.parameters: raise ValueError( "boundary missed for Content-Type: %s" % self.headers[CONTENT_TYPE] ) boundary = mimetype.parameters["boundary"] if len(boundary) > 70: raise ValueError("boundary %r is too long (70 chars max)" % boundary) return boundary async def _readline(self) -> bytes: if self._unread: return self._unread.pop() return await self._content.readline() async def _read_until_first_boundary(self) -> None: while True: chunk = await self._readline() if chunk == b"": raise ValueError( "Could not find starting boundary %r" % (self._boundary) ) chunk = chunk.rstrip() if chunk == self._boundary: return elif chunk == self._boundary + b"--": self._at_eof = True return async def _read_boundary(self) -> None: chunk = (await self._readline()).rstrip() if chunk == self._boundary: pass elif chunk == self._boundary + b"--": self._at_eof = True epilogue = await self._readline() next_line = await self._readline() # the epilogue is expected and then either the end of input or the # parent multipart boundary, if the parent boundary is found then # it should be marked as unread and handed to the parent for # processing if next_line[:2] == b"--": self._unread.append(next_line) # otherwise the request is likely missing an epilogue and both # lines should be passed to the parent for processing # (this handles the old behavior gracefully) else: self._unread.extend([next_line, epilogue]) else: raise ValueError(f"Invalid boundary {chunk!r}, expected {self._boundary!r}") async def _read_headers(self) -> "CIMultiDictProxy[str]": lines = [b""] while True: chunk = await self._content.readline() chunk = chunk.strip() lines.append(chunk) if not chunk: break parser = HeadersParser() headers, raw_headers = parser.parse_headers(lines) return headers async def _maybe_release_last_part(self) -> None: """Ensures that the last read body part is read completely.""" if self._last_part is not None: if not self._last_part.at_eof(): await self._last_part.release() self._unread.extend(self._last_part._unread) self._last_part = None _Part = Tuple[Payload, str, str] class MultipartWriter(Payload): """Multipart body writer.""" def __init__(self, subtype: str = "mixed", boundary: Optional[str] = None) -> None: boundary = boundary if boundary is not None else uuid.uuid4().hex # The underlying Payload API demands a str (utf-8), not bytes, # so we need to ensure we don't lose anything during conversion. # As a result, require the boundary to be ASCII only. # In both situations. try: self._boundary = boundary.encode("ascii") except UnicodeEncodeError: raise ValueError("boundary should contain ASCII only chars") from None ctype = f"multipart/{subtype}; boundary={self._boundary_value}" super().__init__(None, content_type=ctype) self._parts = [] # type: List[_Part] def __enter__(self) -> "MultipartWriter": return self def __exit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> None: pass def __iter__(self) -> Iterator[_Part]: return iter(self._parts) def __len__(self) -> int: return len(self._parts) def __bool__(self) -> bool: return True _valid_tchar_regex = re.compile(br"\A[!#$%&'*+\-.^_`|~\w]+\Z") _invalid_qdtext_char_regex = re.compile(br"[\x00-\x08\x0A-\x1F\x7F]") @property def _boundary_value(self) -> str: """Wrap boundary parameter value in quotes, if necessary. Reads self.boundary and returns a unicode sting. """ # Refer to RFCs 7231, 7230, 5234. # # parameter = token "=" ( token / quoted-string ) # token = 1*tchar # quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE # qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text # obs-text = %x80-FF # quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) # tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" # / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" # / DIGIT / ALPHA # ; any VCHAR, except delimiters # VCHAR = %x21-7E value = self._boundary if re.match(self._valid_tchar_regex, value): return value.decode("ascii") # cannot fail if re.search(self._invalid_qdtext_char_regex, value): raise ValueError("boundary value contains invalid characters") # escape %x5C and %x22 quoted_value_content = value.replace(b"\\", b"\\\\") quoted_value_content = quoted_value_content.replace(b'"', b'\\"') return '"' + quoted_value_content.decode("ascii") + '"' @property def boundary(self) -> str: return self._boundary.decode("ascii") def append(self, obj: Any, headers: Optional[MultiMapping[str]] = None) -> Payload: if headers is None: headers = CIMultiDict() if isinstance(obj, Payload): obj.headers.update(headers) return self.append_payload(obj) else: try: payload = get_payload(obj, headers=headers) except LookupError: raise TypeError("Cannot create payload from %r" % obj) else: return self.append_payload(payload) def append_payload(self, payload: Payload) -> Payload: """Adds a new body part to multipart writer.""" # compression encoding = payload.headers.get( CONTENT_ENCODING, "", ).lower() # type: Optional[str] if encoding and encoding not in ("deflate", "gzip", "identity"): raise RuntimeError(f"unknown content encoding: {encoding}") if encoding == "identity": encoding = None # te encoding te_encoding = payload.headers.get( CONTENT_TRANSFER_ENCODING, "", ).lower() # type: Optional[str] if te_encoding not in ("", "base64", "quoted-printable", "binary"): raise RuntimeError( "unknown content transfer encoding: {}" "".format(te_encoding) ) if te_encoding == "binary": te_encoding = None # size size = payload.size if size is not None and not (encoding or te_encoding): payload.headers[CONTENT_LENGTH] = str(size) self._parts.append((payload, encoding, te_encoding)) # type: ignore[arg-type] return payload def append_json( self, obj: Any, headers: Optional[MultiMapping[str]] = None ) -> Payload: """Helper to append JSON part.""" if headers is None: headers = CIMultiDict() return self.append_payload(JsonPayload(obj, headers=headers)) def append_form( self, obj: Union[Sequence[Tuple[str, str]], Mapping[str, str]], headers: Optional[MultiMapping[str]] = None, ) -> Payload: """Helper to append form urlencoded part.""" assert isinstance(obj, (Sequence, Mapping)) if headers is None: headers = CIMultiDict() if isinstance(obj, Mapping): obj = list(obj.items()) data = urlencode(obj, doseq=True) return self.append_payload( StringPayload( data, headers=headers, content_type="application/x-www-form-urlencoded" ) ) @property def size(self) -> Optional[int]: """Size of the payload.""" total = 0 for part, encoding, te_encoding in self._parts: if encoding or te_encoding or part.size is None: return None total += int( 2 + len(self._boundary) + 2 + part.size # b'--'+self._boundary+b'\r\n' + len(part._binary_headers) + 2 # b'\r\n' ) total += 2 + len(self._boundary) + 4 # b'--'+self._boundary+b'--\r\n' return total async def write(self, writer: Any, close_boundary: bool = True) -> None: """Write body.""" for part, encoding, te_encoding in self._parts: await writer.write(b"--" + self._boundary + b"\r\n") await writer.write(part._binary_headers) if encoding or te_encoding: w = MultipartPayloadWriter(writer) if encoding: w.enable_compression(encoding) if te_encoding: w.enable_encoding(te_encoding) await part.write(w) # type: ignore[arg-type] await w.write_eof() else: await part.write(writer) await writer.write(b"\r\n") if close_boundary: await writer.write(b"--" + self._boundary + b"--\r\n") class MultipartPayloadWriter: def __init__(self, writer: Any) -> None: self._writer = writer self._encoding = None # type: Optional[str] self._compress = None # type: Any self._encoding_buffer = None # type: Optional[bytearray] def enable_encoding(self, encoding: str) -> None: if encoding == "base64": self._encoding = encoding self._encoding_buffer = bytearray() elif encoding == "quoted-printable": self._encoding = "quoted-printable" def enable_compression( self, encoding: str = "deflate", strategy: int = zlib.Z_DEFAULT_STRATEGY ) -> None: zlib_mode = 16 + zlib.MAX_WBITS if encoding == "gzip" else -zlib.MAX_WBITS self._compress = zlib.compressobj(wbits=zlib_mode, strategy=strategy) async def write_eof(self) -> None: if self._compress is not None: chunk = self._compress.flush() if chunk: self._compress = None await self.write(chunk) if self._encoding == "base64": if self._encoding_buffer: await self._writer.write(base64.b64encode(self._encoding_buffer)) async def write(self, chunk: bytes) -> None: if self._compress is not None: if chunk: chunk = self._compress.compress(chunk) if not chunk: return if self._encoding == "base64": buf = self._encoding_buffer assert buf is not None buf.extend(chunk) if buf: div, mod = divmod(len(buf), 3) enc_chunk, self._encoding_buffer = (buf[: div * 3], buf[div * 3 :]) if enc_chunk: b64chunk = base64.b64encode(enc_chunk) await self._writer.write(b64chunk) elif self._encoding == "quoted-printable": await self._writer.write(binascii.b2a_qp(chunk)) else: await self._writer.write(chunk) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/payload.py0000644000175100001710000003260400000000000016213 0ustar00runnerdockerimport asyncio import enum import io import json import mimetypes import os import warnings from abc import ABC, abstractmethod from itertools import chain from typing import ( IO, TYPE_CHECKING, Any, ByteString, Dict, Iterable, Optional, TextIO, Tuple, Type, Union, ) from multidict import CIMultiDict from . import hdrs from .abc import AbstractStreamWriter from .helpers import ( PY_36, content_disposition_header, guess_filename, parse_mimetype, sentinel, ) from .streams import StreamReader from .typedefs import Final, JSONEncoder, _CIMultiDict __all__ = ( "PAYLOAD_REGISTRY", "get_payload", "payload_type", "Payload", "BytesPayload", "StringPayload", "IOBasePayload", "BytesIOPayload", "BufferedReaderPayload", "TextIOPayload", "StringIOPayload", "JsonPayload", "AsyncIterablePayload", ) TOO_LARGE_BYTES_BODY: Final[int] = 2 ** 20 # 1 MB if TYPE_CHECKING: # pragma: no cover from typing import List class LookupError(Exception): pass class Order(str, enum.Enum): normal = "normal" try_first = "try_first" try_last = "try_last" def get_payload(data: Any, *args: Any, **kwargs: Any) -> "Payload": return PAYLOAD_REGISTRY.get(data, *args, **kwargs) def register_payload( factory: Type["Payload"], type: Any, *, order: Order = Order.normal ) -> None: PAYLOAD_REGISTRY.register(factory, type, order=order) class payload_type: def __init__(self, type: Any, *, order: Order = Order.normal) -> None: self.type = type self.order = order def __call__(self, factory: Type["Payload"]) -> Type["Payload"]: register_payload(factory, self.type, order=self.order) return factory PayloadType = Type["Payload"] _PayloadRegistryItem = Tuple[PayloadType, Any] class PayloadRegistry: """Payload registry. note: we need zope.interface for more efficient adapter search """ def __init__(self) -> None: self._first = [] # type: List[_PayloadRegistryItem] self._normal = [] # type: List[_PayloadRegistryItem] self._last = [] # type: List[_PayloadRegistryItem] def get( self, data: Any, *args: Any, _CHAIN: "Type[chain[_PayloadRegistryItem]]" = chain, **kwargs: Any, ) -> "Payload": if isinstance(data, Payload): return data for factory, type in _CHAIN(self._first, self._normal, self._last): if isinstance(data, type): return factory(data, *args, **kwargs) raise LookupError() def register( self, factory: PayloadType, type: Any, *, order: Order = Order.normal ) -> None: if order is Order.try_first: self._first.append((factory, type)) elif order is Order.normal: self._normal.append((factory, type)) elif order is Order.try_last: self._last.append((factory, type)) else: raise ValueError(f"Unsupported order {order!r}") class Payload(ABC): _default_content_type = "application/octet-stream" # type: str _size = None # type: Optional[int] def __init__( self, value: Any, headers: Optional[ Union[_CIMultiDict, Dict[str, str], Iterable[Tuple[str, str]]] ] = None, content_type: Optional[str] = sentinel, filename: Optional[str] = None, encoding: Optional[str] = None, **kwargs: Any, ) -> None: self._encoding = encoding self._filename = filename self._headers = CIMultiDict() # type: _CIMultiDict self._value = value if content_type is not sentinel and content_type is not None: self._headers[hdrs.CONTENT_TYPE] = content_type elif self._filename is not None: content_type = mimetypes.guess_type(self._filename)[0] if content_type is None: content_type = self._default_content_type self._headers[hdrs.CONTENT_TYPE] = content_type else: self._headers[hdrs.CONTENT_TYPE] = self._default_content_type self._headers.update(headers or {}) @property def size(self) -> Optional[int]: """Size of the payload.""" return self._size @property def filename(self) -> Optional[str]: """Filename of the payload.""" return self._filename @property def headers(self) -> _CIMultiDict: """Custom item headers""" return self._headers @property def _binary_headers(self) -> bytes: return ( "".join([k + ": " + v + "\r\n" for k, v in self.headers.items()]).encode( "utf-8" ) + b"\r\n" ) @property def encoding(self) -> Optional[str]: """Payload encoding""" return self._encoding @property def content_type(self) -> str: """Content type""" return self._headers[hdrs.CONTENT_TYPE] def set_content_disposition( self, disptype: str, quote_fields: bool = True, _charset: str = "utf-8", **params: Any, ) -> None: """Sets ``Content-Disposition`` header.""" self._headers[hdrs.CONTENT_DISPOSITION] = content_disposition_header( disptype, quote_fields=quote_fields, _charset=_charset, **params ) @abstractmethod async def write(self, writer: AbstractStreamWriter) -> None: """Write payload. writer is an AbstractStreamWriter instance: """ class BytesPayload(Payload): def __init__(self, value: ByteString, *args: Any, **kwargs: Any) -> None: if not isinstance(value, (bytes, bytearray, memoryview)): raise TypeError(f"value argument must be byte-ish, not {type(value)!r}") if "content_type" not in kwargs: kwargs["content_type"] = "application/octet-stream" super().__init__(value, *args, **kwargs) if isinstance(value, memoryview): self._size = value.nbytes else: self._size = len(value) if self._size > TOO_LARGE_BYTES_BODY: if PY_36: kwargs = {"source": self} else: kwargs = {} warnings.warn( "Sending a large body directly with raw bytes might" " lock the event loop. You should probably pass an " "io.BytesIO object instead", ResourceWarning, **kwargs, ) async def write(self, writer: AbstractStreamWriter) -> None: await writer.write(self._value) class StringPayload(BytesPayload): def __init__( self, value: str, *args: Any, encoding: Optional[str] = None, content_type: Optional[str] = None, **kwargs: Any, ) -> None: if encoding is None: if content_type is None: real_encoding = "utf-8" content_type = "text/plain; charset=utf-8" else: mimetype = parse_mimetype(content_type) real_encoding = mimetype.parameters.get("charset", "utf-8") else: if content_type is None: content_type = "text/plain; charset=%s" % encoding real_encoding = encoding super().__init__( value.encode(real_encoding), encoding=real_encoding, content_type=content_type, *args, **kwargs, ) class StringIOPayload(StringPayload): def __init__(self, value: IO[str], *args: Any, **kwargs: Any) -> None: super().__init__(value.read(), *args, **kwargs) class IOBasePayload(Payload): _value: IO[Any] def __init__( self, value: IO[Any], disposition: str = "attachment", *args: Any, **kwargs: Any ) -> None: if "filename" not in kwargs: kwargs["filename"] = guess_filename(value) super().__init__(value, *args, **kwargs) if self._filename is not None and disposition is not None: if hdrs.CONTENT_DISPOSITION not in self.headers: self.set_content_disposition(disposition, filename=self._filename) async def write(self, writer: AbstractStreamWriter) -> None: loop = asyncio.get_event_loop() try: chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) while chunk: await writer.write(chunk) chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) finally: await loop.run_in_executor(None, self._value.close) class TextIOPayload(IOBasePayload): _value: TextIO def __init__( self, value: TextIO, *args: Any, encoding: Optional[str] = None, content_type: Optional[str] = None, **kwargs: Any, ) -> None: if encoding is None: if content_type is None: encoding = "utf-8" content_type = "text/plain; charset=utf-8" else: mimetype = parse_mimetype(content_type) encoding = mimetype.parameters.get("charset", "utf-8") else: if content_type is None: content_type = "text/plain; charset=%s" % encoding super().__init__( value, content_type=content_type, encoding=encoding, *args, **kwargs, ) @property def size(self) -> Optional[int]: try: return os.fstat(self._value.fileno()).st_size - self._value.tell() except OSError: return None async def write(self, writer: AbstractStreamWriter) -> None: loop = asyncio.get_event_loop() try: chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) while chunk: data = ( chunk.encode(encoding=self._encoding) if self._encoding else chunk.encode() ) await writer.write(data) chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) finally: await loop.run_in_executor(None, self._value.close) class BytesIOPayload(IOBasePayload): @property def size(self) -> int: position = self._value.tell() end = self._value.seek(0, os.SEEK_END) self._value.seek(position) return end - position class BufferedReaderPayload(IOBasePayload): @property def size(self) -> Optional[int]: try: return os.fstat(self._value.fileno()).st_size - self._value.tell() except OSError: # data.fileno() is not supported, e.g. # io.BufferedReader(io.BytesIO(b'data')) return None class JsonPayload(BytesPayload): def __init__( self, value: Any, encoding: str = "utf-8", content_type: str = "application/json", dumps: JSONEncoder = json.dumps, *args: Any, **kwargs: Any, ) -> None: super().__init__( dumps(value).encode(encoding), content_type=content_type, encoding=encoding, *args, **kwargs, ) if TYPE_CHECKING: # pragma: no cover from typing import AsyncIterable, AsyncIterator _AsyncIterator = AsyncIterator[bytes] _AsyncIterable = AsyncIterable[bytes] else: from collections.abc import AsyncIterable, AsyncIterator _AsyncIterator = AsyncIterator _AsyncIterable = AsyncIterable class AsyncIterablePayload(Payload): _iter = None # type: Optional[_AsyncIterator] def __init__(self, value: _AsyncIterable, *args: Any, **kwargs: Any) -> None: if not isinstance(value, AsyncIterable): raise TypeError( "value argument must support " "collections.abc.AsyncIterablebe interface, " "got {!r}".format(type(value)) ) if "content_type" not in kwargs: kwargs["content_type"] = "application/octet-stream" super().__init__(value, *args, **kwargs) self._iter = value.__aiter__() async def write(self, writer: AbstractStreamWriter) -> None: if self._iter: try: # iter is not None check prevents rare cases # when the case iterable is used twice while True: chunk = await self._iter.__anext__() await writer.write(chunk) except StopAsyncIteration: self._iter = None class StreamReaderPayload(AsyncIterablePayload): def __init__(self, value: StreamReader, *args: Any, **kwargs: Any) -> None: super().__init__(value.iter_any(), *args, **kwargs) PAYLOAD_REGISTRY = PayloadRegistry() PAYLOAD_REGISTRY.register(BytesPayload, (bytes, bytearray, memoryview)) PAYLOAD_REGISTRY.register(StringPayload, str) PAYLOAD_REGISTRY.register(StringIOPayload, io.StringIO) PAYLOAD_REGISTRY.register(TextIOPayload, io.TextIOBase) PAYLOAD_REGISTRY.register(BytesIOPayload, io.BytesIO) PAYLOAD_REGISTRY.register(BufferedReaderPayload, (io.BufferedReader, io.BufferedRandom)) PAYLOAD_REGISTRY.register(IOBasePayload, io.IOBase) PAYLOAD_REGISTRY.register(StreamReaderPayload, StreamReader) # try_last for giving a chance to more specialized async interables like # multidict.BodyPartReaderPayload override the default PAYLOAD_REGISTRY.register(AsyncIterablePayload, AsyncIterable, order=Order.try_last) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/payload_streamer.py0000644000175100001710000000410000000000000020103 0ustar00runnerdocker""" Payload implemenation for coroutines as data provider. As a simple case, you can upload data from file:: @aiohttp.streamer async def file_sender(writer, file_name=None): with open(file_name, 'rb') as f: chunk = f.read(2**16) while chunk: await writer.write(chunk) chunk = f.read(2**16) Then you can use `file_sender` like this: async with session.post('http://httpbin.org/post', data=file_sender(file_name='huge_file')) as resp: print(await resp.text()) ..note:: Coroutine must accept `writer` as first argument """ import types import warnings from typing import Any, Awaitable, Callable, Dict, Tuple from .abc import AbstractStreamWriter from .payload import Payload, payload_type __all__ = ("streamer",) class _stream_wrapper: def __init__( self, coro: Callable[..., Awaitable[None]], args: Tuple[Any, ...], kwargs: Dict[str, Any], ) -> None: self.coro = types.coroutine(coro) self.args = args self.kwargs = kwargs async def __call__(self, writer: AbstractStreamWriter) -> None: await self.coro(writer, *self.args, **self.kwargs) # type: ignore[operator] class streamer: def __init__(self, coro: Callable[..., Awaitable[None]]) -> None: warnings.warn( "@streamer is deprecated, use async generators instead", DeprecationWarning, stacklevel=2, ) self.coro = coro def __call__(self, *args: Any, **kwargs: Any) -> _stream_wrapper: return _stream_wrapper(self.coro, args, kwargs) @payload_type(_stream_wrapper) class StreamWrapperPayload(Payload): async def write(self, writer: AbstractStreamWriter) -> None: await self._value(writer) @payload_type(streamer) class StreamPayload(StreamWrapperPayload): def __init__(self, value: Any, *args: Any, **kwargs: Any) -> None: super().__init__(value(), *args, **kwargs) async def write(self, writer: AbstractStreamWriter) -> None: await self._value(writer) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/py.typed0000644000175100001710000000000700000000000015677 0ustar00runnerdockerMarker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/pytest_plugin.py0000644000175100001710000002677400000000000017503 0ustar00runnerdockerimport asyncio import contextlib import warnings from collections.abc import Callable from typing import Any, Awaitable, Callable, Dict, Generator, Optional, Union import pytest from aiohttp.helpers import PY_37, isasyncgenfunction from aiohttp.web import Application from .test_utils import ( BaseTestServer, RawTestServer, TestClient, TestServer, loop_context, setup_test_loop, teardown_test_loop, unused_port as _unused_port, ) try: import uvloop except ImportError: # pragma: no cover uvloop = None try: import tokio except ImportError: # pragma: no cover tokio = None AiohttpClient = Callable[[Union[Application, BaseTestServer]], Awaitable[TestClient]] def pytest_addoption(parser): # type: ignore[no-untyped-def] parser.addoption( "--aiohttp-fast", action="store_true", default=False, help="run tests faster by disabling extra checks", ) parser.addoption( "--aiohttp-loop", action="store", default="pyloop", help="run tests with specific loop: pyloop, uvloop, tokio or all", ) parser.addoption( "--aiohttp-enable-loop-debug", action="store_true", default=False, help="enable event loop debug mode", ) def pytest_fixture_setup(fixturedef): # type: ignore[no-untyped-def] """Set up pytest fixture. Allow fixtures to be coroutines. Run coroutine fixtures in an event loop. """ func = fixturedef.func if isasyncgenfunction(func): # async generator fixture is_async_gen = True elif asyncio.iscoroutinefunction(func): # regular async fixture is_async_gen = False else: # not an async fixture, nothing to do return strip_request = False if "request" not in fixturedef.argnames: fixturedef.argnames += ("request",) strip_request = True def wrapper(*args, **kwargs): # type: ignore[no-untyped-def] request = kwargs["request"] if strip_request: del kwargs["request"] # if neither the fixture nor the test use the 'loop' fixture, # 'getfixturevalue' will fail because the test is not parameterized # (this can be removed someday if 'loop' is no longer parameterized) if "loop" not in request.fixturenames: raise Exception( "Asynchronous fixtures must depend on the 'loop' fixture or " "be used in tests depending from it." ) _loop = request.getfixturevalue("loop") if is_async_gen: # for async generators, we need to advance the generator once, # then advance it again in a finalizer gen = func(*args, **kwargs) def finalizer(): # type: ignore[no-untyped-def] try: return _loop.run_until_complete(gen.__anext__()) except StopAsyncIteration: pass request.addfinalizer(finalizer) return _loop.run_until_complete(gen.__anext__()) else: return _loop.run_until_complete(func(*args, **kwargs)) fixturedef.func = wrapper @pytest.fixture def fast(request): # type: ignore[no-untyped-def] """--fast config option""" return request.config.getoption("--aiohttp-fast") @pytest.fixture def loop_debug(request): # type: ignore[no-untyped-def] """--enable-loop-debug config option""" return request.config.getoption("--aiohttp-enable-loop-debug") @contextlib.contextmanager def _runtime_warning_context(): # type: ignore[no-untyped-def] """Context manager which checks for RuntimeWarnings. This exists specifically to avoid "coroutine 'X' was never awaited" warnings being missed. If RuntimeWarnings occur in the context a RuntimeError is raised. """ with warnings.catch_warnings(record=True) as _warnings: yield rw = [ "{w.filename}:{w.lineno}:{w.message}".format(w=w) for w in _warnings if w.category == RuntimeWarning ] if rw: raise RuntimeError( "{} Runtime Warning{},\n{}".format( len(rw), "" if len(rw) == 1 else "s", "\n".join(rw) ) ) @contextlib.contextmanager def _passthrough_loop_context(loop, fast=False): # type: ignore[no-untyped-def] """Passthrough loop context. Sets up and tears down a loop unless one is passed in via the loop argument when it's passed straight through. """ if loop: # loop already exists, pass it straight through yield loop else: # this shadows loop_context's standard behavior loop = setup_test_loop() yield loop teardown_test_loop(loop, fast=fast) def pytest_pycollect_makeitem(collector, name, obj): # type: ignore[no-untyped-def] """Fix pytest collecting for coroutines.""" if collector.funcnamefilter(name) and asyncio.iscoroutinefunction(obj): return list(collector._genfunctions(name, obj)) def pytest_pyfunc_call(pyfuncitem): # type: ignore[no-untyped-def] """Run coroutines in an event loop instead of a normal function call.""" fast = pyfuncitem.config.getoption("--aiohttp-fast") if asyncio.iscoroutinefunction(pyfuncitem.function): existing_loop = pyfuncitem.funcargs.get( "proactor_loop" ) or pyfuncitem.funcargs.get("loop", None) with _runtime_warning_context(): with _passthrough_loop_context(existing_loop, fast=fast) as _loop: testargs = { arg: pyfuncitem.funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames } _loop.run_until_complete(pyfuncitem.obj(**testargs)) return True def pytest_generate_tests(metafunc): # type: ignore[no-untyped-def] if "loop_factory" not in metafunc.fixturenames: return loops = metafunc.config.option.aiohttp_loop avail_factories = {"pyloop": asyncio.DefaultEventLoopPolicy} if uvloop is not None: # pragma: no cover avail_factories["uvloop"] = uvloop.EventLoopPolicy if tokio is not None: # pragma: no cover avail_factories["tokio"] = tokio.EventLoopPolicy if loops == "all": loops = "pyloop,uvloop?,tokio?" factories = {} # type: ignore[var-annotated] for name in loops.split(","): required = not name.endswith("?") name = name.strip(" ?") if name not in avail_factories: # pragma: no cover if required: raise ValueError( "Unknown loop '%s', available loops: %s" % (name, list(factories.keys())) ) else: continue factories[name] = avail_factories[name] metafunc.parametrize( "loop_factory", list(factories.values()), ids=list(factories.keys()) ) @pytest.fixture def loop(loop_factory, fast, loop_debug): # type: ignore[no-untyped-def] """Return an instance of the event loop.""" policy = loop_factory() asyncio.set_event_loop_policy(policy) with loop_context(fast=fast) as _loop: if loop_debug: _loop.set_debug(True) # pragma: no cover asyncio.set_event_loop(_loop) yield _loop @pytest.fixture def proactor_loop(): # type: ignore[no-untyped-def] if not PY_37: policy = asyncio.get_event_loop_policy() policy._loop_factory = asyncio.ProactorEventLoop # type: ignore[attr-defined] else: policy = asyncio.WindowsProactorEventLoopPolicy() # type: ignore[attr-defined] asyncio.set_event_loop_policy(policy) with loop_context(policy.new_event_loop) as _loop: asyncio.set_event_loop(_loop) yield _loop @pytest.fixture def unused_port(aiohttp_unused_port): # type: ignore[no-untyped-def] # pragma: no cover warnings.warn( "Deprecated, use aiohttp_unused_port fixture instead", DeprecationWarning, stacklevel=2, ) return aiohttp_unused_port @pytest.fixture def aiohttp_unused_port(): # type: ignore[no-untyped-def] """Return a port that is unused on the current host.""" return _unused_port @pytest.fixture def aiohttp_server(loop): # type: ignore[no-untyped-def] """Factory to create a TestServer instance, given an app. aiohttp_server(app, **kwargs) """ servers = [] async def go(app, *, port=None, **kwargs): # type: ignore[no-untyped-def] server = TestServer(app, port=port) await server.start_server(loop=loop, **kwargs) servers.append(server) return server yield go async def finalize() -> None: while servers: await servers.pop().close() loop.run_until_complete(finalize()) @pytest.fixture def test_server(aiohttp_server): # type: ignore[no-untyped-def] # pragma: no cover warnings.warn( "Deprecated, use aiohttp_server fixture instead", DeprecationWarning, stacklevel=2, ) return aiohttp_server @pytest.fixture def aiohttp_raw_server(loop): # type: ignore[no-untyped-def] """Factory to create a RawTestServer instance, given a web handler. aiohttp_raw_server(handler, **kwargs) """ servers = [] async def go(handler, *, port=None, **kwargs): # type: ignore[no-untyped-def] server = RawTestServer(handler, port=port) await server.start_server(loop=loop, **kwargs) servers.append(server) return server yield go async def finalize() -> None: while servers: await servers.pop().close() loop.run_until_complete(finalize()) @pytest.fixture def raw_test_server( # type: ignore[no-untyped-def] # pragma: no cover aiohttp_raw_server, ): warnings.warn( "Deprecated, use aiohttp_raw_server fixture instead", DeprecationWarning, stacklevel=2, ) return aiohttp_raw_server @pytest.fixture def aiohttp_client( loop: asyncio.AbstractEventLoop, ) -> Generator[AiohttpClient, None, None]: """Factory to create a TestClient instance. aiohttp_client(app, **kwargs) aiohttp_client(server, **kwargs) aiohttp_client(raw_server, **kwargs) """ clients = [] async def go( __param: Union[Application, BaseTestServer], *args: Any, server_kwargs: Optional[Dict[str, Any]] = None, **kwargs: Any ) -> TestClient: if isinstance(__param, Callable) and not isinstance( # type: ignore[arg-type] __param, (Application, BaseTestServer) ): __param = __param(loop, *args, **kwargs) kwargs = {} else: assert not args, "args should be empty" if isinstance(__param, Application): server_kwargs = server_kwargs or {} server = TestServer(__param, loop=loop, **server_kwargs) client = TestClient(server, loop=loop, **kwargs) elif isinstance(__param, BaseTestServer): client = TestClient(__param, loop=loop, **kwargs) else: raise ValueError("Unknown argument type: %r" % type(__param)) await client.start_server() clients.append(client) return client yield go async def finalize() -> None: while clients: await clients.pop().close() loop.run_until_complete(finalize()) @pytest.fixture def test_client(aiohttp_client): # type: ignore[no-untyped-def] # pragma: no cover warnings.warn( "Deprecated, use aiohttp_client fixture instead", DeprecationWarning, stacklevel=2, ) return aiohttp_client ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/resolver.py0000644000175100001710000001174400000000000016425 0ustar00runnerdockerimport asyncio import socket from typing import Any, Dict, List, Optional, Type, Union from .abc import AbstractResolver from .helpers import get_running_loop __all__ = ("ThreadedResolver", "AsyncResolver", "DefaultResolver") try: import aiodns # aiodns_default = hasattr(aiodns.DNSResolver, 'gethostbyname') except ImportError: # pragma: no cover aiodns = None aiodns_default = False class ThreadedResolver(AbstractResolver): """Threaded resolver. Uses an Executor for synchronous getaddrinfo() calls. concurrent.futures.ThreadPoolExecutor is used by default. """ def __init__(self, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: self._loop = get_running_loop(loop) async def resolve( self, hostname: str, port: int = 0, family: int = socket.AF_INET ) -> List[Dict[str, Any]]: infos = await self._loop.getaddrinfo( hostname, port, type=socket.SOCK_STREAM, family=family, flags=socket.AI_ADDRCONFIG, ) hosts = [] for family, _, proto, _, address in infos: if family == socket.AF_INET6: if len(address) < 3: # IPv6 is not supported by Python build, # or IPv6 is not enabled in the host continue if address[3]: # type: ignore[misc] # This is essential for link-local IPv6 addresses. # LL IPv6 is a VERY rare case. Strictly speaking, we should use # getnameinfo() unconditionally, but performance makes sense. host, _port = socket.getnameinfo( address, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV ) port = int(_port) else: host, port = address[:2] else: # IPv4 assert family == socket.AF_INET host, port = address # type: ignore[misc] hosts.append( { "hostname": hostname, "host": host, "port": port, "family": family, "proto": proto, "flags": socket.AI_NUMERICHOST | socket.AI_NUMERICSERV, } ) return hosts async def close(self) -> None: pass class AsyncResolver(AbstractResolver): """Use the `aiodns` package to make asynchronous DNS lookups""" def __init__( self, loop: Optional[asyncio.AbstractEventLoop] = None, *args: Any, **kwargs: Any ) -> None: if aiodns is None: raise RuntimeError("Resolver requires aiodns library") self._loop = get_running_loop(loop) self._resolver = aiodns.DNSResolver(*args, loop=loop, **kwargs) if not hasattr(self._resolver, "gethostbyname"): # aiodns 1.1 is not available, fallback to DNSResolver.query self.resolve = self._resolve_with_query # type: ignore async def resolve( self, host: str, port: int = 0, family: int = socket.AF_INET ) -> List[Dict[str, Any]]: try: resp = await self._resolver.gethostbyname(host, family) except aiodns.error.DNSError as exc: msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" raise OSError(msg) from exc hosts = [] for address in resp.addresses: hosts.append( { "hostname": host, "host": address, "port": port, "family": family, "proto": 0, "flags": socket.AI_NUMERICHOST | socket.AI_NUMERICSERV, } ) if not hosts: raise OSError("DNS lookup failed") return hosts async def _resolve_with_query( self, host: str, port: int = 0, family: int = socket.AF_INET ) -> List[Dict[str, Any]]: if family == socket.AF_INET6: qtype = "AAAA" else: qtype = "A" try: resp = await self._resolver.query(host, qtype) except aiodns.error.DNSError as exc: msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" raise OSError(msg) from exc hosts = [] for rr in resp: hosts.append( { "hostname": host, "host": rr.host, "port": port, "family": family, "proto": 0, "flags": socket.AI_NUMERICHOST, } ) if not hosts: raise OSError("DNS lookup failed") return hosts async def close(self) -> None: self._resolver.cancel() _DefaultType = Type[Union[AsyncResolver, ThreadedResolver]] DefaultResolver: _DefaultType = AsyncResolver if aiodns_default else ThreadedResolver ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/streams.py0000644000175100001710000005055000000000000016240 0ustar00runnerdockerimport asyncio import collections import warnings from typing import Awaitable, Callable, Deque, Generic, List, Optional, Tuple, TypeVar from .base_protocol import BaseProtocol from .helpers import BaseTimerContext, set_exception, set_result from .log import internal_logger from .typedefs import Final __all__ = ( "EMPTY_PAYLOAD", "EofStream", "StreamReader", "DataQueue", "FlowControlDataQueue", ) _T = TypeVar("_T") class EofStream(Exception): """eof stream indication.""" class AsyncStreamIterator(Generic[_T]): def __init__(self, read_func: Callable[[], Awaitable[_T]]) -> None: self.read_func = read_func def __aiter__(self) -> "AsyncStreamIterator[_T]": return self async def __anext__(self) -> _T: try: rv = await self.read_func() except EofStream: raise StopAsyncIteration if rv == b"": raise StopAsyncIteration return rv class ChunkTupleAsyncStreamIterator: def __init__(self, stream: "StreamReader") -> None: self._stream = stream def __aiter__(self) -> "ChunkTupleAsyncStreamIterator": return self async def __anext__(self) -> Tuple[bytes, bool]: rv = await self._stream.readchunk() if rv == (b"", False): raise StopAsyncIteration return rv class AsyncStreamReaderMixin: def __aiter__(self) -> AsyncStreamIterator[bytes]: return AsyncStreamIterator(self.readline) # type: ignore[attr-defined] def iter_chunked(self, n: int) -> AsyncStreamIterator[bytes]: """Returns an asynchronous iterator that yields chunks of size n. Python-3.5 available for Python 3.5+ only """ return AsyncStreamIterator( lambda: self.read(n) # type: ignore[attr-defined,no-any-return] ) def iter_any(self) -> AsyncStreamIterator[bytes]: """Yield all available data as soon as it is received. Python-3.5 available for Python 3.5+ only """ return AsyncStreamIterator(self.readany) # type: ignore[attr-defined] def iter_chunks(self) -> ChunkTupleAsyncStreamIterator: """Yield chunks of data as they are received by the server. The yielded objects are tuples of (bytes, bool) as returned by the StreamReader.readchunk method. Python-3.5 available for Python 3.5+ only """ return ChunkTupleAsyncStreamIterator(self) # type: ignore[arg-type] class StreamReader(AsyncStreamReaderMixin): """An enhancement of asyncio.StreamReader. Supports asynchronous iteration by line, chunk or as available:: async for line in reader: ... async for chunk in reader.iter_chunked(1024): ... async for slice in reader.iter_any(): ... """ total_bytes = 0 def __init__( self, protocol: BaseProtocol, limit: int, *, timer: Optional[BaseTimerContext] = None, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: self._protocol = protocol self._low_water = limit self._high_water = limit * 2 if loop is None: loop = asyncio.get_event_loop() self._loop = loop self._size = 0 self._cursor = 0 self._http_chunk_splits = None # type: Optional[List[int]] self._buffer = collections.deque() # type: Deque[bytes] self._buffer_offset = 0 self._eof = False self._waiter = None # type: Optional[asyncio.Future[None]] self._eof_waiter = None # type: Optional[asyncio.Future[None]] self._exception = None # type: Optional[BaseException] self._timer = timer self._eof_callbacks = [] # type: List[Callable[[], None]] def __repr__(self) -> str: info = [self.__class__.__name__] if self._size: info.append("%d bytes" % self._size) if self._eof: info.append("eof") if self._low_water != 2 ** 16: # default limit info.append("low=%d high=%d" % (self._low_water, self._high_water)) if self._waiter: info.append("w=%r" % self._waiter) if self._exception: info.append("e=%r" % self._exception) return "<%s>" % " ".join(info) def get_read_buffer_limits(self) -> Tuple[int, int]: return (self._low_water, self._high_water) def exception(self) -> Optional[BaseException]: return self._exception def set_exception(self, exc: BaseException) -> None: self._exception = exc self._eof_callbacks.clear() waiter = self._waiter if waiter is not None: self._waiter = None set_exception(waiter, exc) waiter = self._eof_waiter if waiter is not None: self._eof_waiter = None set_exception(waiter, exc) def on_eof(self, callback: Callable[[], None]) -> None: if self._eof: try: callback() except Exception: internal_logger.exception("Exception in eof callback") else: self._eof_callbacks.append(callback) def feed_eof(self) -> None: self._eof = True waiter = self._waiter if waiter is not None: self._waiter = None set_result(waiter, None) waiter = self._eof_waiter if waiter is not None: self._eof_waiter = None set_result(waiter, None) for cb in self._eof_callbacks: try: cb() except Exception: internal_logger.exception("Exception in eof callback") self._eof_callbacks.clear() def is_eof(self) -> bool: """Return True if 'feed_eof' was called.""" return self._eof def at_eof(self) -> bool: """Return True if the buffer is empty and 'feed_eof' was called.""" return self._eof and not self._buffer async def wait_eof(self) -> None: if self._eof: return assert self._eof_waiter is None self._eof_waiter = self._loop.create_future() try: await self._eof_waiter finally: self._eof_waiter = None def unread_data(self, data: bytes) -> None: """rollback reading some data from stream, inserting it to buffer head.""" warnings.warn( "unread_data() is deprecated " "and will be removed in future releases (#3260)", DeprecationWarning, stacklevel=2, ) if not data: return if self._buffer_offset: self._buffer[0] = self._buffer[0][self._buffer_offset :] self._buffer_offset = 0 self._size += len(data) self._cursor -= len(data) self._buffer.appendleft(data) self._eof_counter = 0 # TODO: size is ignored, remove the param later def feed_data(self, data: bytes, size: int = 0) -> None: assert not self._eof, "feed_data after feed_eof" if not data: return self._size += len(data) self._buffer.append(data) self.total_bytes += len(data) waiter = self._waiter if waiter is not None: self._waiter = None set_result(waiter, None) if self._size > self._high_water and not self._protocol._reading_paused: self._protocol.pause_reading() def begin_http_chunk_receiving(self) -> None: if self._http_chunk_splits is None: if self.total_bytes: raise RuntimeError( "Called begin_http_chunk_receiving when" "some data was already fed" ) self._http_chunk_splits = [] def end_http_chunk_receiving(self) -> None: if self._http_chunk_splits is None: raise RuntimeError( "Called end_chunk_receiving without calling " "begin_chunk_receiving first" ) # self._http_chunk_splits contains logical byte offsets from start of # the body transfer. Each offset is the offset of the end of a chunk. # "Logical" means bytes, accessible for a user. # If no chunks containig logical data were received, current position # is difinitely zero. pos = self._http_chunk_splits[-1] if self._http_chunk_splits else 0 if self.total_bytes == pos: # We should not add empty chunks here. So we check for that. # Note, when chunked + gzip is used, we can receive a chunk # of compressed data, but that data may not be enough for gzip FSM # to yield any uncompressed data. That's why current position may # not change after receiving a chunk. return self._http_chunk_splits.append(self.total_bytes) # wake up readchunk when end of http chunk received waiter = self._waiter if waiter is not None: self._waiter = None set_result(waiter, None) async def _wait(self, func_name: str) -> None: # StreamReader uses a future to link the protocol feed_data() method # to a read coroutine. Running two read coroutines at the same time # would have an unexpected behaviour. It would not possible to know # which coroutine would get the next data. if self._waiter is not None: raise RuntimeError( "%s() called while another coroutine is " "already waiting for incoming data" % func_name ) waiter = self._waiter = self._loop.create_future() try: if self._timer: with self._timer: await waiter else: await waiter finally: self._waiter = None async def readline(self) -> bytes: return await self.readuntil() async def readuntil(self, separator: bytes = b"\n") -> bytes: seplen = len(separator) if seplen == 0: raise ValueError("Separator should be at least one-byte string") if self._exception is not None: raise self._exception chunk = b"" chunk_size = 0 not_enough = True while not_enough: while self._buffer and not_enough: offset = self._buffer_offset ichar = self._buffer[0].find(separator, offset) + 1 # Read from current offset to found separator or to the end. data = self._read_nowait_chunk(ichar - offset if ichar else -1) chunk += data chunk_size += len(data) if ichar: not_enough = False if chunk_size > self._high_water: raise ValueError("Chunk too big") if self._eof: break if not_enough: await self._wait("readuntil") return chunk async def read(self, n: int = -1) -> bytes: if self._exception is not None: raise self._exception # migration problem; with DataQueue you have to catch # EofStream exception, so common way is to run payload.read() inside # infinite loop. what can cause real infinite loop with StreamReader # lets keep this code one major release. if __debug__: if self._eof and not self._buffer: self._eof_counter = getattr(self, "_eof_counter", 0) + 1 if self._eof_counter > 5: internal_logger.warning( "Multiple access to StreamReader in eof state, " "might be infinite loop.", stack_info=True, ) if not n: return b"" if n < 0: # This used to just loop creating a new waiter hoping to # collect everything in self._buffer, but that would # deadlock if the subprocess sends more than self.limit # bytes. So just call self.readany() until EOF. blocks = [] while True: block = await self.readany() if not block: break blocks.append(block) return b"".join(blocks) # TODO: should be `if` instead of `while` # because waiter maybe triggered on chunk end, # without feeding any data while not self._buffer and not self._eof: await self._wait("read") return self._read_nowait(n) async def readany(self) -> bytes: if self._exception is not None: raise self._exception # TODO: should be `if` instead of `while` # because waiter maybe triggered on chunk end, # without feeding any data while not self._buffer and not self._eof: await self._wait("readany") return self._read_nowait(-1) async def readchunk(self) -> Tuple[bytes, bool]: """Returns a tuple of (data, end_of_http_chunk). When chunked transfer encoding is used, end_of_http_chunk is a boolean indicating if the end of the data corresponds to the end of a HTTP chunk , otherwise it is always False. """ while True: if self._exception is not None: raise self._exception while self._http_chunk_splits: pos = self._http_chunk_splits.pop(0) if pos == self._cursor: return (b"", True) if pos > self._cursor: return (self._read_nowait(pos - self._cursor), True) internal_logger.warning( "Skipping HTTP chunk end due to data " "consumption beyond chunk boundary" ) if self._buffer: return (self._read_nowait_chunk(-1), False) # return (self._read_nowait(-1), False) if self._eof: # Special case for signifying EOF. # (b'', True) is not a final return value actually. return (b"", False) await self._wait("readchunk") async def readexactly(self, n: int) -> bytes: if self._exception is not None: raise self._exception blocks = [] # type: List[bytes] while n > 0: block = await self.read(n) if not block: partial = b"".join(blocks) raise asyncio.IncompleteReadError(partial, len(partial) + n) blocks.append(block) n -= len(block) return b"".join(blocks) def read_nowait(self, n: int = -1) -> bytes: # default was changed to be consistent with .read(-1) # # I believe the most users don't know about the method and # they are not affected. if self._exception is not None: raise self._exception if self._waiter and not self._waiter.done(): raise RuntimeError( "Called while some coroutine is waiting for incoming data." ) return self._read_nowait(n) def _read_nowait_chunk(self, n: int) -> bytes: first_buffer = self._buffer[0] offset = self._buffer_offset if n != -1 and len(first_buffer) - offset > n: data = first_buffer[offset : offset + n] self._buffer_offset += n elif offset: self._buffer.popleft() data = first_buffer[offset:] self._buffer_offset = 0 else: data = self._buffer.popleft() self._size -= len(data) self._cursor += len(data) chunk_splits = self._http_chunk_splits # Prevent memory leak: drop useless chunk splits while chunk_splits and chunk_splits[0] < self._cursor: chunk_splits.pop(0) if self._size < self._low_water and self._protocol._reading_paused: self._protocol.resume_reading() return data def _read_nowait(self, n: int) -> bytes: """Read not more than n bytes, or whole buffer if n == -1""" chunks = [] while self._buffer: chunk = self._read_nowait_chunk(n) chunks.append(chunk) if n != -1: n -= len(chunk) if n == 0: break return b"".join(chunks) if chunks else b"" class EmptyStreamReader(StreamReader): # lgtm [py/missing-call-to-init] def __init__(self) -> None: pass def exception(self) -> Optional[BaseException]: return None def set_exception(self, exc: BaseException) -> None: pass def on_eof(self, callback: Callable[[], None]) -> None: try: callback() except Exception: internal_logger.exception("Exception in eof callback") def feed_eof(self) -> None: pass def is_eof(self) -> bool: return True def at_eof(self) -> bool: return True async def wait_eof(self) -> None: return def feed_data(self, data: bytes, n: int = 0) -> None: pass async def readline(self) -> bytes: return b"" async def read(self, n: int = -1) -> bytes: return b"" # TODO add async def readuntil async def readany(self) -> bytes: return b"" async def readchunk(self) -> Tuple[bytes, bool]: return (b"", True) async def readexactly(self, n: int) -> bytes: raise asyncio.IncompleteReadError(b"", n) def read_nowait(self, n: int = -1) -> bytes: return b"" EMPTY_PAYLOAD: Final[StreamReader] = EmptyStreamReader() class DataQueue(Generic[_T]): """DataQueue is a general-purpose blocking queue with one reader.""" def __init__(self, loop: asyncio.AbstractEventLoop) -> None: self._loop = loop self._eof = False self._waiter = None # type: Optional[asyncio.Future[None]] self._exception = None # type: Optional[BaseException] self._size = 0 self._buffer = collections.deque() # type: Deque[Tuple[_T, int]] def __len__(self) -> int: return len(self._buffer) def is_eof(self) -> bool: return self._eof def at_eof(self) -> bool: return self._eof and not self._buffer def exception(self) -> Optional[BaseException]: return self._exception def set_exception(self, exc: BaseException) -> None: self._eof = True self._exception = exc waiter = self._waiter if waiter is not None: self._waiter = None set_exception(waiter, exc) def feed_data(self, data: _T, size: int = 0) -> None: self._size += size self._buffer.append((data, size)) waiter = self._waiter if waiter is not None: self._waiter = None set_result(waiter, None) def feed_eof(self) -> None: self._eof = True waiter = self._waiter if waiter is not None: self._waiter = None set_result(waiter, None) async def read(self) -> _T: if not self._buffer and not self._eof: assert not self._waiter self._waiter = self._loop.create_future() try: await self._waiter except (asyncio.CancelledError, asyncio.TimeoutError): self._waiter = None raise if self._buffer: data, size = self._buffer.popleft() self._size -= size return data else: if self._exception is not None: raise self._exception else: raise EofStream def __aiter__(self) -> AsyncStreamIterator[_T]: return AsyncStreamIterator(self.read) class FlowControlDataQueue(DataQueue[_T]): """FlowControlDataQueue resumes and pauses an underlying stream. It is a destination for parsed data. """ def __init__( self, protocol: BaseProtocol, limit: int, *, loop: asyncio.AbstractEventLoop ) -> None: super().__init__(loop=loop) self._protocol = protocol self._limit = limit * 2 def feed_data(self, data: _T, size: int = 0) -> None: super().feed_data(data, size) if self._size > self._limit and not self._protocol._reading_paused: self._protocol.pause_reading() async def read(self) -> _T: try: return await super().read() finally: if self._size < self._limit and self._protocol._reading_paused: self._protocol.resume_reading() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/tcp_helpers.py0000644000175100001710000000170200000000000017065 0ustar00runnerdocker"""Helper methods to tune a TCP connection""" import asyncio import socket from contextlib import suppress from typing import Optional # noqa __all__ = ("tcp_keepalive", "tcp_nodelay") if hasattr(socket, "SO_KEEPALIVE"): def tcp_keepalive(transport: asyncio.Transport) -> None: sock = transport.get_extra_info("socket") if sock is not None: sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) else: def tcp_keepalive(transport: asyncio.Transport) -> None: # pragma: no cover pass def tcp_nodelay(transport: asyncio.Transport, value: bool) -> None: sock = transport.get_extra_info("socket") if sock is None: return if sock.family not in (socket.AF_INET, socket.AF_INET6): return value = bool(value) # socket may be closed already, on windows OSError get raised with suppress(OSError): sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, value) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/test_utils.py0000644000175100001710000005134300000000000016762 0ustar00runnerdocker"""Utilities shared by tests.""" import asyncio import contextlib import gc import inspect import ipaddress import os import socket import sys import warnings from abc import ABC, abstractmethod from types import TracebackType from typing import ( TYPE_CHECKING, Any, Callable, Iterator, List, Optional, Type, Union, cast, ) from unittest import mock from aiosignal import Signal from multidict import CIMultiDict, CIMultiDictProxy from yarl import URL import aiohttp from aiohttp.client import _RequestContextManager, _WSRequestContextManager from . import ClientSession, hdrs from .abc import AbstractCookieJar from .client_reqrep import ClientResponse from .client_ws import ClientWebSocketResponse from .helpers import PY_38, sentinel from .http import HttpVersion, RawRequestMessage from .web import ( Application, AppRunner, BaseRunner, Request, Server, ServerRunner, SockSite, UrlMappingMatchInfo, ) from .web_protocol import _RequestHandler if TYPE_CHECKING: # pragma: no cover from ssl import SSLContext else: SSLContext = None if PY_38: from unittest import IsolatedAsyncioTestCase as TestCase else: from asynctest import TestCase # type: ignore[no-redef] REUSE_ADDRESS = os.name == "posix" and sys.platform != "cygwin" def get_unused_port_socket( host: str, family: socket.AddressFamily = socket.AF_INET ) -> socket.socket: return get_port_socket(host, 0, family) def get_port_socket( host: str, port: int, family: socket.AddressFamily ) -> socket.socket: s = socket.socket(family, socket.SOCK_STREAM) if REUSE_ADDRESS: # Windows has different semantics for SO_REUSEADDR, # so don't set it. Ref: # https://docs.microsoft.com/en-us/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((host, port)) return s def unused_port() -> int: """Return a port that is unused on the current host.""" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(("127.0.0.1", 0)) return cast(int, s.getsockname()[1]) class BaseTestServer(ABC): __test__ = False def __init__( self, *, scheme: Union[str, object] = sentinel, loop: Optional[asyncio.AbstractEventLoop] = None, host: str = "127.0.0.1", port: Optional[int] = None, skip_url_asserts: bool = False, socket_factory: Callable[ [str, int, socket.AddressFamily], socket.socket ] = get_port_socket, **kwargs: Any, ) -> None: self._loop = loop self.runner = None # type: Optional[BaseRunner] self._root = None # type: Optional[URL] self.host = host self.port = port self._closed = False self.scheme = scheme self.skip_url_asserts = skip_url_asserts self.socket_factory = socket_factory async def start_server( self, loop: Optional[asyncio.AbstractEventLoop] = None, **kwargs: Any ) -> None: if self.runner: return self._loop = loop self._ssl = kwargs.pop("ssl", None) self.runner = await self._make_runner(**kwargs) await self.runner.setup() if not self.port: self.port = 0 try: version = ipaddress.ip_address(self.host).version except ValueError: version = 4 family = socket.AF_INET6 if version == 6 else socket.AF_INET _sock = self.socket_factory(self.host, self.port, family) self.host, self.port = _sock.getsockname()[:2] site = SockSite(self.runner, sock=_sock, ssl_context=self._ssl) await site.start() server = site._server assert server is not None sockets = server.sockets assert sockets is not None self.port = sockets[0].getsockname()[1] if self.scheme is sentinel: if self._ssl: scheme = "https" else: scheme = "http" self.scheme = scheme self._root = URL(f"{self.scheme}://{self.host}:{self.port}") @abstractmethod # pragma: no cover async def _make_runner(self, **kwargs: Any) -> BaseRunner: pass def make_url(self, path: str) -> URL: assert self._root is not None url = URL(path) if not self.skip_url_asserts: assert not url.is_absolute() return self._root.join(url) else: return URL(str(self._root) + path) @property def started(self) -> bool: return self.runner is not None @property def closed(self) -> bool: return self._closed @property def handler(self) -> Server: # for backward compatibility # web.Server instance runner = self.runner assert runner is not None assert runner.server is not None return runner.server async def close(self) -> None: """Close all fixtures created by the test client. After that point, the TestClient is no longer usable. This is an idempotent function: running close multiple times will not have any additional effects. close is also run when the object is garbage collected, and on exit when used as a context manager. """ if self.started and not self.closed: assert self.runner is not None await self.runner.cleanup() self._root = None self.port = None self._closed = True def __enter__(self) -> None: raise TypeError("Use async with instead") def __exit__( self, exc_type: Optional[Type[BaseException]], exc_value: Optional[BaseException], traceback: Optional[TracebackType], ) -> None: # __exit__ should exist in pair with __enter__ but never executed pass # pragma: no cover async def __aenter__(self) -> "BaseTestServer": await self.start_server(loop=self._loop) return self async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc_value: Optional[BaseException], traceback: Optional[TracebackType], ) -> None: await self.close() class TestServer(BaseTestServer): def __init__( self, app: Application, *, scheme: Union[str, object] = sentinel, host: str = "127.0.0.1", port: Optional[int] = None, **kwargs: Any, ): self.app = app super().__init__(scheme=scheme, host=host, port=port, **kwargs) async def _make_runner(self, **kwargs: Any) -> BaseRunner: return AppRunner(self.app, **kwargs) class RawTestServer(BaseTestServer): def __init__( self, handler: _RequestHandler, *, scheme: Union[str, object] = sentinel, host: str = "127.0.0.1", port: Optional[int] = None, **kwargs: Any, ) -> None: self._handler = handler super().__init__(scheme=scheme, host=host, port=port, **kwargs) async def _make_runner(self, debug: bool = True, **kwargs: Any) -> ServerRunner: srv = Server(self._handler, loop=self._loop, debug=debug, **kwargs) return ServerRunner(srv, debug=debug, **kwargs) class TestClient: """ A test client implementation. To write functional tests for aiohttp based servers. """ __test__ = False def __init__( self, server: BaseTestServer, *, cookie_jar: Optional[AbstractCookieJar] = None, loop: Optional[asyncio.AbstractEventLoop] = None, **kwargs: Any, ) -> None: if not isinstance(server, BaseTestServer): raise TypeError( "server must be TestServer " "instance, found type: %r" % type(server) ) self._server = server self._loop = loop if cookie_jar is None: cookie_jar = aiohttp.CookieJar(unsafe=True, loop=loop) self._session = ClientSession(loop=loop, cookie_jar=cookie_jar, **kwargs) self._closed = False self._responses = [] # type: List[ClientResponse] self._websockets = [] # type: List[ClientWebSocketResponse] async def start_server(self) -> None: await self._server.start_server(loop=self._loop) @property def host(self) -> str: return self._server.host @property def port(self) -> Optional[int]: return self._server.port @property def server(self) -> BaseTestServer: return self._server @property def app(self) -> Optional[Application]: return cast(Optional[Application], getattr(self._server, "app", None)) @property def session(self) -> ClientSession: """An internal aiohttp.ClientSession. Unlike the methods on the TestClient, client session requests do not automatically include the host in the url queried, and will require an absolute path to the resource. """ return self._session def make_url(self, path: str) -> URL: return self._server.make_url(path) async def _request(self, method: str, path: str, **kwargs: Any) -> ClientResponse: resp = await self._session.request(method, self.make_url(path), **kwargs) # save it to close later self._responses.append(resp) return resp def request(self, method: str, path: str, **kwargs: Any) -> _RequestContextManager: """Routes a request to tested http server. The interface is identical to aiohttp.ClientSession.request, except the loop kwarg is overridden by the instance used by the test server. """ return _RequestContextManager(self._request(method, path, **kwargs)) def get(self, path: str, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP GET request.""" return _RequestContextManager(self._request(hdrs.METH_GET, path, **kwargs)) def post(self, path: str, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP POST request.""" return _RequestContextManager(self._request(hdrs.METH_POST, path, **kwargs)) def options(self, path: str, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP OPTIONS request.""" return _RequestContextManager(self._request(hdrs.METH_OPTIONS, path, **kwargs)) def head(self, path: str, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP HEAD request.""" return _RequestContextManager(self._request(hdrs.METH_HEAD, path, **kwargs)) def put(self, path: str, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP PUT request.""" return _RequestContextManager(self._request(hdrs.METH_PUT, path, **kwargs)) def patch(self, path: str, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP PATCH request.""" return _RequestContextManager(self._request(hdrs.METH_PATCH, path, **kwargs)) def delete(self, path: str, **kwargs: Any) -> _RequestContextManager: """Perform an HTTP PATCH request.""" return _RequestContextManager(self._request(hdrs.METH_DELETE, path, **kwargs)) def ws_connect(self, path: str, **kwargs: Any) -> _WSRequestContextManager: """Initiate websocket connection. The api corresponds to aiohttp.ClientSession.ws_connect. """ return _WSRequestContextManager(self._ws_connect(path, **kwargs)) async def _ws_connect(self, path: str, **kwargs: Any) -> ClientWebSocketResponse: ws = await self._session.ws_connect(self.make_url(path), **kwargs) self._websockets.append(ws) return ws async def close(self) -> None: """Close all fixtures created by the test client. After that point, the TestClient is no longer usable. This is an idempotent function: running close multiple times will not have any additional effects. close is also run on exit when used as a(n) (asynchronous) context manager. """ if not self._closed: for resp in self._responses: resp.close() for ws in self._websockets: await ws.close() await self._session.close() await self._server.close() self._closed = True def __enter__(self) -> None: raise TypeError("Use async with instead") def __exit__( self, exc_type: Optional[Type[BaseException]], exc: Optional[BaseException], tb: Optional[TracebackType], ) -> None: # __exit__ should exist in pair with __enter__ but never executed pass # pragma: no cover async def __aenter__(self) -> "TestClient": await self.start_server() return self async def __aexit__( self, exc_type: Optional[Type[BaseException]], exc: Optional[BaseException], tb: Optional[TracebackType], ) -> None: await self.close() class AioHTTPTestCase(TestCase): """A base class to allow for unittest web applications using aiohttp. Provides the following: * self.client (aiohttp.test_utils.TestClient): an aiohttp test client. * self.loop (asyncio.BaseEventLoop): the event loop in which the application and server are running. * self.app (aiohttp.web.Application): the application returned by self.get_application() Note that the TestClient's methods are asynchronous: you have to execute function on the test client using asynchronous methods. """ async def get_application(self) -> Application: """Get application. This method should be overridden to return the aiohttp.web.Application object to test. """ return self.get_app() def get_app(self) -> Application: """Obsolete method used to constructing web application. Use .get_application() coroutine instead. """ raise RuntimeError("Did you forget to define get_application()?") def setUp(self) -> None: try: self.loop = asyncio.get_running_loop() except (AttributeError, RuntimeError): # AttributeError->py36 self.loop = asyncio.get_event_loop_policy().get_event_loop() self.loop.run_until_complete(self.setUpAsync()) async def setUpAsync(self) -> None: self.app = await self.get_application() self.server = await self.get_server(self.app) self.client = await self.get_client(self.server) await self.client.start_server() def tearDown(self) -> None: self.loop.run_until_complete(self.tearDownAsync()) async def tearDownAsync(self) -> None: await self.client.close() async def get_server(self, app: Application) -> TestServer: """Return a TestServer instance.""" return TestServer(app, loop=self.loop) async def get_client(self, server: TestServer) -> TestClient: """Return a TestClient instance.""" return TestClient(server, loop=self.loop) def unittest_run_loop(func: Any, *args: Any, **kwargs: Any) -> Any: """ A decorator dedicated to use with asynchronous AioHTTPTestCase test methods. In 3.8+, this does nothing. """ warnings.warn( "Decorator `@unittest_run_loop` is no longer needed in aiohttp 3.8+", DeprecationWarning, stacklevel=2, ) return func _LOOP_FACTORY = Callable[[], asyncio.AbstractEventLoop] @contextlib.contextmanager def loop_context( loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, fast: bool = False ) -> Iterator[asyncio.AbstractEventLoop]: """A contextmanager that creates an event_loop, for test purposes. Handles the creation and cleanup of a test loop. """ loop = setup_test_loop(loop_factory) yield loop teardown_test_loop(loop, fast=fast) def setup_test_loop( loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, ) -> asyncio.AbstractEventLoop: """Create and return an asyncio.BaseEventLoop instance. The caller should also call teardown_test_loop, once they are done with the loop. """ loop = loop_factory() try: module = loop.__class__.__module__ skip_watcher = "uvloop" in module except AttributeError: # pragma: no cover # Just in case skip_watcher = True asyncio.set_event_loop(loop) if sys.platform != "win32" and not skip_watcher: policy = asyncio.get_event_loop_policy() watcher: asyncio.AbstractChildWatcher try: # Python >= 3.8 # Refs: # * https://github.com/pytest-dev/pytest-xdist/issues/620 # * https://stackoverflow.com/a/58614689/595220 # * https://bugs.python.org/issue35621 # * https://github.com/python/cpython/pull/14344 watcher = asyncio.ThreadedChildWatcher() except AttributeError: # Python < 3.8 watcher = asyncio.SafeChildWatcher() watcher.attach_loop(loop) with contextlib.suppress(NotImplementedError): policy.set_child_watcher(watcher) return loop def teardown_test_loop(loop: asyncio.AbstractEventLoop, fast: bool = False) -> None: """Teardown and cleanup an event_loop created by setup_test_loop.""" closed = loop.is_closed() if not closed: loop.call_soon(loop.stop) loop.run_forever() loop.close() if not fast: gc.collect() asyncio.set_event_loop(None) def _create_app_mock() -> mock.MagicMock: def get_dict(app: Any, key: str) -> Any: return app.__app_dict[key] def set_dict(app: Any, key: str, value: Any) -> None: app.__app_dict[key] = value app = mock.MagicMock() app.__app_dict = {} app.__getitem__ = get_dict app.__setitem__ = set_dict app._debug = False app.on_response_prepare = Signal(app) app.on_response_prepare.freeze() return app def _create_transport(sslcontext: Optional[SSLContext] = None) -> mock.Mock: transport = mock.Mock() def get_extra_info(key: str) -> Optional[SSLContext]: if key == "sslcontext": return sslcontext else: return None transport.get_extra_info.side_effect = get_extra_info return transport def make_mocked_request( method: str, path: str, headers: Any = None, *, match_info: Any = sentinel, version: HttpVersion = HttpVersion(1, 1), closing: bool = False, app: Any = None, writer: Any = sentinel, protocol: Any = sentinel, transport: Any = sentinel, payload: Any = sentinel, sslcontext: Optional[SSLContext] = None, client_max_size: int = 1024 ** 2, loop: Any = ..., ) -> Request: """Creates mocked web.Request testing purposes. Useful in unit tests, when spinning full web server is overkill or specific conditions and errors are hard to trigger. """ task = mock.Mock() if loop is ...: loop = mock.Mock() loop.create_future.return_value = () if version < HttpVersion(1, 1): closing = True if headers: headers = CIMultiDictProxy(CIMultiDict(headers)) raw_hdrs = tuple( (k.encode("utf-8"), v.encode("utf-8")) for k, v in headers.items() ) else: headers = CIMultiDictProxy(CIMultiDict()) raw_hdrs = () chunked = "chunked" in headers.get(hdrs.TRANSFER_ENCODING, "").lower() message = RawRequestMessage( method, path, version, headers, raw_hdrs, closing, None, False, chunked, URL(path), ) if app is None: app = _create_app_mock() if transport is sentinel: transport = _create_transport(sslcontext) if protocol is sentinel: protocol = mock.Mock() protocol.transport = transport if writer is sentinel: writer = mock.Mock() writer.write_headers = make_mocked_coro(None) writer.write = make_mocked_coro(None) writer.write_eof = make_mocked_coro(None) writer.drain = make_mocked_coro(None) writer.transport = transport protocol.transport = transport protocol.writer = writer if payload is sentinel: payload = mock.Mock() req = Request( message, payload, protocol, writer, task, loop, client_max_size=client_max_size ) match_info = UrlMappingMatchInfo( {} if match_info is sentinel else match_info, mock.Mock() ) match_info.add_app(app) req._match_info = match_info return req def make_mocked_coro( return_value: Any = sentinel, raise_exception: Any = sentinel ) -> Any: """Creates a coroutine mock.""" async def mock_coro(*args: Any, **kwargs: Any) -> Any: if raise_exception is not sentinel: raise raise_exception if not inspect.isawaitable(return_value): return return_value await return_value return mock.Mock(wraps=mock_coro) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/tracing.py0000644000175100001710000003571100000000000016213 0ustar00runnerdockerfrom types import SimpleNamespace from typing import TYPE_CHECKING, Awaitable, Optional, Type, TypeVar import attr from aiosignal import Signal from multidict import CIMultiDict from yarl import URL from .client_reqrep import ClientResponse if TYPE_CHECKING: # pragma: no cover from .client import ClientSession from .typedefs import Protocol _ParamT_contra = TypeVar("_ParamT_contra", contravariant=True) class _SignalCallback(Protocol[_ParamT_contra]): def __call__( self, __client_session: ClientSession, __trace_config_ctx: SimpleNamespace, __params: _ParamT_contra, ) -> Awaitable[None]: ... __all__ = ( "TraceConfig", "TraceRequestStartParams", "TraceRequestEndParams", "TraceRequestExceptionParams", "TraceConnectionQueuedStartParams", "TraceConnectionQueuedEndParams", "TraceConnectionCreateStartParams", "TraceConnectionCreateEndParams", "TraceConnectionReuseconnParams", "TraceDnsResolveHostStartParams", "TraceDnsResolveHostEndParams", "TraceDnsCacheHitParams", "TraceDnsCacheMissParams", "TraceRequestRedirectParams", "TraceRequestChunkSentParams", "TraceResponseChunkReceivedParams", "TraceRequestHeadersSentParams", ) class TraceConfig: """First-class used to trace requests launched via ClientSession objects.""" def __init__( self, trace_config_ctx_factory: Type[SimpleNamespace] = SimpleNamespace ) -> None: self._on_request_start = Signal( self ) # type: Signal[_SignalCallback[TraceRequestStartParams]] self._on_request_chunk_sent = Signal( self ) # type: Signal[_SignalCallback[TraceRequestChunkSentParams]] self._on_response_chunk_received = Signal( self ) # type: Signal[_SignalCallback[TraceResponseChunkReceivedParams]] self._on_request_end = Signal( self ) # type: Signal[_SignalCallback[TraceRequestEndParams]] self._on_request_exception = Signal( self ) # type: Signal[_SignalCallback[TraceRequestExceptionParams]] self._on_request_redirect = Signal( self ) # type: Signal[_SignalCallback[TraceRequestRedirectParams]] self._on_connection_queued_start = Signal( self ) # type: Signal[_SignalCallback[TraceConnectionQueuedStartParams]] self._on_connection_queued_end = Signal( self ) # type: Signal[_SignalCallback[TraceConnectionQueuedEndParams]] self._on_connection_create_start = Signal( self ) # type: Signal[_SignalCallback[TraceConnectionCreateStartParams]] self._on_connection_create_end = Signal( self ) # type: Signal[_SignalCallback[TraceConnectionCreateEndParams]] self._on_connection_reuseconn = Signal( self ) # type: Signal[_SignalCallback[TraceConnectionReuseconnParams]] self._on_dns_resolvehost_start = Signal( self ) # type: Signal[_SignalCallback[TraceDnsResolveHostStartParams]] self._on_dns_resolvehost_end = Signal( self ) # type: Signal[_SignalCallback[TraceDnsResolveHostEndParams]] self._on_dns_cache_hit = Signal( self ) # type: Signal[_SignalCallback[TraceDnsCacheHitParams]] self._on_dns_cache_miss = Signal( self ) # type: Signal[_SignalCallback[TraceDnsCacheMissParams]] self._on_request_headers_sent = Signal( self ) # type: Signal[_SignalCallback[TraceRequestHeadersSentParams]] self._trace_config_ctx_factory = trace_config_ctx_factory def trace_config_ctx( self, trace_request_ctx: Optional[SimpleNamespace] = None ) -> SimpleNamespace: """Return a new trace_config_ctx instance""" return self._trace_config_ctx_factory(trace_request_ctx=trace_request_ctx) def freeze(self) -> None: self._on_request_start.freeze() self._on_request_chunk_sent.freeze() self._on_response_chunk_received.freeze() self._on_request_end.freeze() self._on_request_exception.freeze() self._on_request_redirect.freeze() self._on_connection_queued_start.freeze() self._on_connection_queued_end.freeze() self._on_connection_create_start.freeze() self._on_connection_create_end.freeze() self._on_connection_reuseconn.freeze() self._on_dns_resolvehost_start.freeze() self._on_dns_resolvehost_end.freeze() self._on_dns_cache_hit.freeze() self._on_dns_cache_miss.freeze() self._on_request_headers_sent.freeze() @property def on_request_start(self) -> "Signal[_SignalCallback[TraceRequestStartParams]]": return self._on_request_start @property def on_request_chunk_sent( self, ) -> "Signal[_SignalCallback[TraceRequestChunkSentParams]]": return self._on_request_chunk_sent @property def on_response_chunk_received( self, ) -> "Signal[_SignalCallback[TraceResponseChunkReceivedParams]]": return self._on_response_chunk_received @property def on_request_end(self) -> "Signal[_SignalCallback[TraceRequestEndParams]]": return self._on_request_end @property def on_request_exception( self, ) -> "Signal[_SignalCallback[TraceRequestExceptionParams]]": return self._on_request_exception @property def on_request_redirect( self, ) -> "Signal[_SignalCallback[TraceRequestRedirectParams]]": return self._on_request_redirect @property def on_connection_queued_start( self, ) -> "Signal[_SignalCallback[TraceConnectionQueuedStartParams]]": return self._on_connection_queued_start @property def on_connection_queued_end( self, ) -> "Signal[_SignalCallback[TraceConnectionQueuedEndParams]]": return self._on_connection_queued_end @property def on_connection_create_start( self, ) -> "Signal[_SignalCallback[TraceConnectionCreateStartParams]]": return self._on_connection_create_start @property def on_connection_create_end( self, ) -> "Signal[_SignalCallback[TraceConnectionCreateEndParams]]": return self._on_connection_create_end @property def on_connection_reuseconn( self, ) -> "Signal[_SignalCallback[TraceConnectionReuseconnParams]]": return self._on_connection_reuseconn @property def on_dns_resolvehost_start( self, ) -> "Signal[_SignalCallback[TraceDnsResolveHostStartParams]]": return self._on_dns_resolvehost_start @property def on_dns_resolvehost_end( self, ) -> "Signal[_SignalCallback[TraceDnsResolveHostEndParams]]": return self._on_dns_resolvehost_end @property def on_dns_cache_hit(self) -> "Signal[_SignalCallback[TraceDnsCacheHitParams]]": return self._on_dns_cache_hit @property def on_dns_cache_miss(self) -> "Signal[_SignalCallback[TraceDnsCacheMissParams]]": return self._on_dns_cache_miss @property def on_request_headers_sent( self, ) -> "Signal[_SignalCallback[TraceRequestHeadersSentParams]]": return self._on_request_headers_sent @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestStartParams: """Parameters sent by the `on_request_start` signal""" method: str url: URL headers: "CIMultiDict[str]" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestChunkSentParams: """Parameters sent by the `on_request_chunk_sent` signal""" method: str url: URL chunk: bytes @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceResponseChunkReceivedParams: """Parameters sent by the `on_response_chunk_received` signal""" method: str url: URL chunk: bytes @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestEndParams: """Parameters sent by the `on_request_end` signal""" method: str url: URL headers: "CIMultiDict[str]" response: ClientResponse @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestExceptionParams: """Parameters sent by the `on_request_exception` signal""" method: str url: URL headers: "CIMultiDict[str]" exception: BaseException @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestRedirectParams: """Parameters sent by the `on_request_redirect` signal""" method: str url: URL headers: "CIMultiDict[str]" response: ClientResponse @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceConnectionQueuedStartParams: """Parameters sent by the `on_connection_queued_start` signal""" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceConnectionQueuedEndParams: """Parameters sent by the `on_connection_queued_end` signal""" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceConnectionCreateStartParams: """Parameters sent by the `on_connection_create_start` signal""" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceConnectionCreateEndParams: """Parameters sent by the `on_connection_create_end` signal""" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceConnectionReuseconnParams: """Parameters sent by the `on_connection_reuseconn` signal""" @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceDnsResolveHostStartParams: """Parameters sent by the `on_dns_resolvehost_start` signal""" host: str @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceDnsResolveHostEndParams: """Parameters sent by the `on_dns_resolvehost_end` signal""" host: str @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceDnsCacheHitParams: """Parameters sent by the `on_dns_cache_hit` signal""" host: str @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceDnsCacheMissParams: """Parameters sent by the `on_dns_cache_miss` signal""" host: str @attr.s(auto_attribs=True, frozen=True, slots=True) class TraceRequestHeadersSentParams: """Parameters sent by the `on_request_headers_sent` signal""" method: str url: URL headers: "CIMultiDict[str]" class Trace: """Internal dependency holder class. Used to keep together the main dependencies used at the moment of send a signal. """ def __init__( self, session: "ClientSession", trace_config: TraceConfig, trace_config_ctx: SimpleNamespace, ) -> None: self._trace_config = trace_config self._trace_config_ctx = trace_config_ctx self._session = session async def send_request_start( self, method: str, url: URL, headers: "CIMultiDict[str]" ) -> None: return await self._trace_config.on_request_start.send( self._session, self._trace_config_ctx, TraceRequestStartParams(method, url, headers), ) async def send_request_chunk_sent( self, method: str, url: URL, chunk: bytes ) -> None: return await self._trace_config.on_request_chunk_sent.send( self._session, self._trace_config_ctx, TraceRequestChunkSentParams(method, url, chunk), ) async def send_response_chunk_received( self, method: str, url: URL, chunk: bytes ) -> None: return await self._trace_config.on_response_chunk_received.send( self._session, self._trace_config_ctx, TraceResponseChunkReceivedParams(method, url, chunk), ) async def send_request_end( self, method: str, url: URL, headers: "CIMultiDict[str]", response: ClientResponse, ) -> None: return await self._trace_config.on_request_end.send( self._session, self._trace_config_ctx, TraceRequestEndParams(method, url, headers, response), ) async def send_request_exception( self, method: str, url: URL, headers: "CIMultiDict[str]", exception: BaseException, ) -> None: return await self._trace_config.on_request_exception.send( self._session, self._trace_config_ctx, TraceRequestExceptionParams(method, url, headers, exception), ) async def send_request_redirect( self, method: str, url: URL, headers: "CIMultiDict[str]", response: ClientResponse, ) -> None: return await self._trace_config._on_request_redirect.send( self._session, self._trace_config_ctx, TraceRequestRedirectParams(method, url, headers, response), ) async def send_connection_queued_start(self) -> None: return await self._trace_config.on_connection_queued_start.send( self._session, self._trace_config_ctx, TraceConnectionQueuedStartParams() ) async def send_connection_queued_end(self) -> None: return await self._trace_config.on_connection_queued_end.send( self._session, self._trace_config_ctx, TraceConnectionQueuedEndParams() ) async def send_connection_create_start(self) -> None: return await self._trace_config.on_connection_create_start.send( self._session, self._trace_config_ctx, TraceConnectionCreateStartParams() ) async def send_connection_create_end(self) -> None: return await self._trace_config.on_connection_create_end.send( self._session, self._trace_config_ctx, TraceConnectionCreateEndParams() ) async def send_connection_reuseconn(self) -> None: return await self._trace_config.on_connection_reuseconn.send( self._session, self._trace_config_ctx, TraceConnectionReuseconnParams() ) async def send_dns_resolvehost_start(self, host: str) -> None: return await self._trace_config.on_dns_resolvehost_start.send( self._session, self._trace_config_ctx, TraceDnsResolveHostStartParams(host) ) async def send_dns_resolvehost_end(self, host: str) -> None: return await self._trace_config.on_dns_resolvehost_end.send( self._session, self._trace_config_ctx, TraceDnsResolveHostEndParams(host) ) async def send_dns_cache_hit(self, host: str) -> None: return await self._trace_config.on_dns_cache_hit.send( self._session, self._trace_config_ctx, TraceDnsCacheHitParams(host) ) async def send_dns_cache_miss(self, host: str) -> None: return await self._trace_config.on_dns_cache_miss.send( self._session, self._trace_config_ctx, TraceDnsCacheMissParams(host) ) async def send_request_headers( self, method: str, url: URL, headers: "CIMultiDict[str]" ) -> None: return await self._trace_config._on_request_headers_sent.send( self._session, self._trace_config_ctx, TraceRequestHeadersSentParams(method, url, headers), ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/typedefs.py0000644000175100001710000000334600000000000016406 0ustar00runnerdockerimport json import os import sys from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, Iterable, Mapping, Tuple, Union, ) from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy, istr from yarl import URL # These are for other modules to use (to avoid repeating the conditional import). if sys.version_info >= (3, 8): from typing import Final as Final, Protocol as Protocol, TypedDict as TypedDict else: from typing_extensions import ( # noqa: F401 Final, Protocol as Protocol, TypedDict as TypedDict, ) DEFAULT_JSON_ENCODER = json.dumps DEFAULT_JSON_DECODER = json.loads if TYPE_CHECKING: # pragma: no cover _CIMultiDict = CIMultiDict[str] _CIMultiDictProxy = CIMultiDictProxy[str] _MultiDict = MultiDict[str] _MultiDictProxy = MultiDictProxy[str] from http.cookies import BaseCookie, Morsel from .web import Request, StreamResponse else: _CIMultiDict = CIMultiDict _CIMultiDictProxy = CIMultiDictProxy _MultiDict = MultiDict _MultiDictProxy = MultiDictProxy Byteish = Union[bytes, bytearray, memoryview] JSONEncoder = Callable[[Any], str] JSONDecoder = Callable[[str], Any] LooseHeaders = Union[Mapping[Union[str, istr], str], _CIMultiDict, _CIMultiDictProxy] RawHeaders = Tuple[Tuple[bytes, bytes], ...] StrOrURL = Union[str, URL] LooseCookiesMappings = Mapping[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] LooseCookiesIterables = Iterable[ Tuple[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] ] LooseCookies = Union[ LooseCookiesMappings, LooseCookiesIterables, "BaseCookie[str]", ] Handler = Callable[["Request"], Awaitable["StreamResponse"]] PathLike = Union[str, "os.PathLike[str]"] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web.py0000644000175100001710000004301100000000000015331 0ustar00runnerdockerimport asyncio import logging import socket import sys from argparse import ArgumentParser from collections.abc import Iterable from importlib import import_module from typing import ( Any, Awaitable, Callable, Iterable as TypingIterable, List, Optional, Set, Type, Union, cast, ) from .abc import AbstractAccessLogger from .helpers import all_tasks from .log import access_logger from .web_app import Application as Application, CleanupError as CleanupError from .web_exceptions import ( HTTPAccepted as HTTPAccepted, HTTPBadGateway as HTTPBadGateway, HTTPBadRequest as HTTPBadRequest, HTTPClientError as HTTPClientError, HTTPConflict as HTTPConflict, HTTPCreated as HTTPCreated, HTTPError as HTTPError, HTTPException as HTTPException, HTTPExpectationFailed as HTTPExpectationFailed, HTTPFailedDependency as HTTPFailedDependency, HTTPForbidden as HTTPForbidden, HTTPFound as HTTPFound, HTTPGatewayTimeout as HTTPGatewayTimeout, HTTPGone as HTTPGone, HTTPInsufficientStorage as HTTPInsufficientStorage, HTTPInternalServerError as HTTPInternalServerError, HTTPLengthRequired as HTTPLengthRequired, HTTPMethodNotAllowed as HTTPMethodNotAllowed, HTTPMisdirectedRequest as HTTPMisdirectedRequest, HTTPMovedPermanently as HTTPMovedPermanently, HTTPMultipleChoices as HTTPMultipleChoices, HTTPNetworkAuthenticationRequired as HTTPNetworkAuthenticationRequired, HTTPNoContent as HTTPNoContent, HTTPNonAuthoritativeInformation as HTTPNonAuthoritativeInformation, HTTPNotAcceptable as HTTPNotAcceptable, HTTPNotExtended as HTTPNotExtended, HTTPNotFound as HTTPNotFound, HTTPNotImplemented as HTTPNotImplemented, HTTPNotModified as HTTPNotModified, HTTPOk as HTTPOk, HTTPPartialContent as HTTPPartialContent, HTTPPaymentRequired as HTTPPaymentRequired, HTTPPermanentRedirect as HTTPPermanentRedirect, HTTPPreconditionFailed as HTTPPreconditionFailed, HTTPPreconditionRequired as HTTPPreconditionRequired, HTTPProxyAuthenticationRequired as HTTPProxyAuthenticationRequired, HTTPRedirection as HTTPRedirection, HTTPRequestEntityTooLarge as HTTPRequestEntityTooLarge, HTTPRequestHeaderFieldsTooLarge as HTTPRequestHeaderFieldsTooLarge, HTTPRequestRangeNotSatisfiable as HTTPRequestRangeNotSatisfiable, HTTPRequestTimeout as HTTPRequestTimeout, HTTPRequestURITooLong as HTTPRequestURITooLong, HTTPResetContent as HTTPResetContent, HTTPSeeOther as HTTPSeeOther, HTTPServerError as HTTPServerError, HTTPServiceUnavailable as HTTPServiceUnavailable, HTTPSuccessful as HTTPSuccessful, HTTPTemporaryRedirect as HTTPTemporaryRedirect, HTTPTooManyRequests as HTTPTooManyRequests, HTTPUnauthorized as HTTPUnauthorized, HTTPUnavailableForLegalReasons as HTTPUnavailableForLegalReasons, HTTPUnprocessableEntity as HTTPUnprocessableEntity, HTTPUnsupportedMediaType as HTTPUnsupportedMediaType, HTTPUpgradeRequired as HTTPUpgradeRequired, HTTPUseProxy as HTTPUseProxy, HTTPVariantAlsoNegotiates as HTTPVariantAlsoNegotiates, HTTPVersionNotSupported as HTTPVersionNotSupported, ) from .web_fileresponse import FileResponse as FileResponse from .web_log import AccessLogger from .web_middlewares import ( middleware as middleware, normalize_path_middleware as normalize_path_middleware, ) from .web_protocol import ( PayloadAccessError as PayloadAccessError, RequestHandler as RequestHandler, RequestPayloadError as RequestPayloadError, ) from .web_request import ( BaseRequest as BaseRequest, FileField as FileField, Request as Request, ) from .web_response import ( ContentCoding as ContentCoding, Response as Response, StreamResponse as StreamResponse, json_response as json_response, ) from .web_routedef import ( AbstractRouteDef as AbstractRouteDef, RouteDef as RouteDef, RouteTableDef as RouteTableDef, StaticDef as StaticDef, delete as delete, get as get, head as head, options as options, patch as patch, post as post, put as put, route as route, static as static, view as view, ) from .web_runner import ( AppRunner as AppRunner, BaseRunner as BaseRunner, BaseSite as BaseSite, GracefulExit as GracefulExit, NamedPipeSite as NamedPipeSite, ServerRunner as ServerRunner, SockSite as SockSite, TCPSite as TCPSite, UnixSite as UnixSite, ) from .web_server import Server as Server from .web_urldispatcher import ( AbstractResource as AbstractResource, AbstractRoute as AbstractRoute, DynamicResource as DynamicResource, PlainResource as PlainResource, Resource as Resource, ResourceRoute as ResourceRoute, StaticResource as StaticResource, UrlDispatcher as UrlDispatcher, UrlMappingMatchInfo as UrlMappingMatchInfo, View as View, ) from .web_ws import ( WebSocketReady as WebSocketReady, WebSocketResponse as WebSocketResponse, WSMsgType as WSMsgType, ) __all__ = ( # web_app "Application", "CleanupError", # web_exceptions "HTTPAccepted", "HTTPBadGateway", "HTTPBadRequest", "HTTPClientError", "HTTPConflict", "HTTPCreated", "HTTPError", "HTTPException", "HTTPExpectationFailed", "HTTPFailedDependency", "HTTPForbidden", "HTTPFound", "HTTPGatewayTimeout", "HTTPGone", "HTTPInsufficientStorage", "HTTPInternalServerError", "HTTPLengthRequired", "HTTPMethodNotAllowed", "HTTPMisdirectedRequest", "HTTPMovedPermanently", "HTTPMultipleChoices", "HTTPNetworkAuthenticationRequired", "HTTPNoContent", "HTTPNonAuthoritativeInformation", "HTTPNotAcceptable", "HTTPNotExtended", "HTTPNotFound", "HTTPNotImplemented", "HTTPNotModified", "HTTPOk", "HTTPPartialContent", "HTTPPaymentRequired", "HTTPPermanentRedirect", "HTTPPreconditionFailed", "HTTPPreconditionRequired", "HTTPProxyAuthenticationRequired", "HTTPRedirection", "HTTPRequestEntityTooLarge", "HTTPRequestHeaderFieldsTooLarge", "HTTPRequestRangeNotSatisfiable", "HTTPRequestTimeout", "HTTPRequestURITooLong", "HTTPResetContent", "HTTPSeeOther", "HTTPServerError", "HTTPServiceUnavailable", "HTTPSuccessful", "HTTPTemporaryRedirect", "HTTPTooManyRequests", "HTTPUnauthorized", "HTTPUnavailableForLegalReasons", "HTTPUnprocessableEntity", "HTTPUnsupportedMediaType", "HTTPUpgradeRequired", "HTTPUseProxy", "HTTPVariantAlsoNegotiates", "HTTPVersionNotSupported", # web_fileresponse "FileResponse", # web_middlewares "middleware", "normalize_path_middleware", # web_protocol "PayloadAccessError", "RequestHandler", "RequestPayloadError", # web_request "BaseRequest", "FileField", "Request", # web_response "ContentCoding", "Response", "StreamResponse", "json_response", # web_routedef "AbstractRouteDef", "RouteDef", "RouteTableDef", "StaticDef", "delete", "get", "head", "options", "patch", "post", "put", "route", "static", "view", # web_runner "AppRunner", "BaseRunner", "BaseSite", "GracefulExit", "ServerRunner", "SockSite", "TCPSite", "UnixSite", "NamedPipeSite", # web_server "Server", # web_urldispatcher "AbstractResource", "AbstractRoute", "DynamicResource", "PlainResource", "Resource", "ResourceRoute", "StaticResource", "UrlDispatcher", "UrlMappingMatchInfo", "View", # web_ws "WebSocketReady", "WebSocketResponse", "WSMsgType", # web "run_app", ) try: from ssl import SSLContext except ImportError: # pragma: no cover SSLContext = Any # type: ignore[misc,assignment] HostSequence = TypingIterable[str] async def _run_app( app: Union[Application, Awaitable[Application]], *, host: Optional[Union[str, HostSequence]] = None, port: Optional[int] = None, path: Optional[str] = None, sock: Optional[socket.socket] = None, shutdown_timeout: float = 60.0, keepalive_timeout: float = 75.0, ssl_context: Optional[SSLContext] = None, print: Callable[..., None] = print, backlog: int = 128, access_log_class: Type[AbstractAccessLogger] = AccessLogger, access_log_format: str = AccessLogger.LOG_FORMAT, access_log: Optional[logging.Logger] = access_logger, handle_signals: bool = True, reuse_address: Optional[bool] = None, reuse_port: Optional[bool] = None, ) -> None: # A internal functio to actually do all dirty job for application running if asyncio.iscoroutine(app): app = await app # type: ignore[misc] app = cast(Application, app) runner = AppRunner( app, handle_signals=handle_signals, access_log_class=access_log_class, access_log_format=access_log_format, access_log=access_log, keepalive_timeout=keepalive_timeout, ) await runner.setup() sites = [] # type: List[BaseSite] try: if host is not None: if isinstance(host, (str, bytes, bytearray, memoryview)): sites.append( TCPSite( runner, host, port, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, reuse_address=reuse_address, reuse_port=reuse_port, ) ) else: for h in host: sites.append( TCPSite( runner, h, port, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, reuse_address=reuse_address, reuse_port=reuse_port, ) ) elif path is None and sock is None or port is not None: sites.append( TCPSite( runner, port=port, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, reuse_address=reuse_address, reuse_port=reuse_port, ) ) if path is not None: if isinstance(path, (str, bytes, bytearray, memoryview)): sites.append( UnixSite( runner, path, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, ) ) else: for p in path: sites.append( UnixSite( runner, p, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, ) ) if sock is not None: if not isinstance(sock, Iterable): sites.append( SockSite( runner, sock, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, ) ) else: for s in sock: sites.append( SockSite( runner, s, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, ) ) for site in sites: await site.start() if print: # pragma: no branch names = sorted(str(s.name) for s in runner.sites) print( "======== Running on {} ========\n" "(Press CTRL+C to quit)".format(", ".join(names)) ) # sleep forever by 1 hour intervals, # on Windows before Python 3.8 wake up every 1 second to handle # Ctrl+C smoothly if sys.platform == "win32" and sys.version_info < (3, 8): delay = 1 else: delay = 3600 while True: await asyncio.sleep(delay) finally: await runner.cleanup() def _cancel_tasks( to_cancel: Set["asyncio.Task[Any]"], loop: asyncio.AbstractEventLoop ) -> None: if not to_cancel: return for task in to_cancel: task.cancel() loop.run_until_complete(asyncio.gather(*to_cancel, return_exceptions=True)) for task in to_cancel: if task.cancelled(): continue if task.exception() is not None: loop.call_exception_handler( { "message": "unhandled exception during asyncio.run() shutdown", "exception": task.exception(), "task": task, } ) def run_app( app: Union[Application, Awaitable[Application]], *, host: Optional[Union[str, HostSequence]] = None, port: Optional[int] = None, path: Optional[str] = None, sock: Optional[socket.socket] = None, shutdown_timeout: float = 60.0, keepalive_timeout: float = 75.0, ssl_context: Optional[SSLContext] = None, print: Callable[..., None] = print, backlog: int = 128, access_log_class: Type[AbstractAccessLogger] = AccessLogger, access_log_format: str = AccessLogger.LOG_FORMAT, access_log: Optional[logging.Logger] = access_logger, handle_signals: bool = True, reuse_address: Optional[bool] = None, reuse_port: Optional[bool] = None, loop: Optional[asyncio.AbstractEventLoop] = None, ) -> None: """Run an app locally""" if loop is None: loop = asyncio.new_event_loop() # Configure if and only if in debugging mode and using the default logger if loop.get_debug() and access_log and access_log.name == "aiohttp.access": if access_log.level == logging.NOTSET: access_log.setLevel(logging.DEBUG) if not access_log.hasHandlers(): access_log.addHandler(logging.StreamHandler()) main_task = loop.create_task( _run_app( app, host=host, port=port, path=path, sock=sock, shutdown_timeout=shutdown_timeout, keepalive_timeout=keepalive_timeout, ssl_context=ssl_context, print=print, backlog=backlog, access_log_class=access_log_class, access_log_format=access_log_format, access_log=access_log, handle_signals=handle_signals, reuse_address=reuse_address, reuse_port=reuse_port, ) ) try: asyncio.set_event_loop(loop) loop.run_until_complete(main_task) except (GracefulExit, KeyboardInterrupt): # pragma: no cover pass finally: _cancel_tasks({main_task}, loop) _cancel_tasks(all_tasks(loop), loop) loop.run_until_complete(loop.shutdown_asyncgens()) loop.close() def main(argv: List[str]) -> None: arg_parser = ArgumentParser( description="aiohttp.web Application server", prog="aiohttp.web" ) arg_parser.add_argument( "entry_func", help=( "Callable returning the `aiohttp.web.Application` instance to " "run. Should be specified in the 'module:function' syntax." ), metavar="entry-func", ) arg_parser.add_argument( "-H", "--hostname", help="TCP/IP hostname to serve on (default: %(default)r)", default="localhost", ) arg_parser.add_argument( "-P", "--port", help="TCP/IP port to serve on (default: %(default)r)", type=int, default="8080", ) arg_parser.add_argument( "-U", "--path", help="Unix file system path to serve on. Specifying a path will cause " "hostname and port arguments to be ignored.", ) args, extra_argv = arg_parser.parse_known_args(argv) # Import logic mod_str, _, func_str = args.entry_func.partition(":") if not func_str or not mod_str: arg_parser.error("'entry-func' not in 'module:function' syntax") if mod_str.startswith("."): arg_parser.error("relative module names not supported") try: module = import_module(mod_str) except ImportError as ex: arg_parser.error(f"unable to import {mod_str}: {ex}") try: func = getattr(module, func_str) except AttributeError: arg_parser.error(f"module {mod_str!r} has no attribute {func_str!r}") # Compatibility logic if args.path is not None and not hasattr(socket, "AF_UNIX"): arg_parser.error( "file system paths not supported by your operating" " environment" ) logging.basicConfig(level=logging.DEBUG) app = func(extra_argv) run_app(app, host=args.hostname, port=args.port, path=args.path) arg_parser.exit(message="Stopped\n") if __name__ == "__main__": # pragma: no branch main(sys.argv[1:]) # pragma: no cover ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_app.py0000644000175100001710000004156400000000000016204 0ustar00runnerdockerimport asyncio import logging import warnings from functools import partial, update_wrapper from typing import ( TYPE_CHECKING, Any, AsyncIterator, Awaitable, Callable, Dict, Iterable, Iterator, List, Mapping, MutableMapping, Optional, Sequence, Tuple, Type, Union, cast, ) from aiosignal import Signal from frozenlist import FrozenList from . import hdrs from .abc import ( AbstractAccessLogger, AbstractMatchInfo, AbstractRouter, AbstractStreamWriter, ) from .helpers import DEBUG from .http_parser import RawRequestMessage from .log import web_logger from .streams import StreamReader from .web_log import AccessLogger from .web_middlewares import _fix_request_current_app from .web_protocol import RequestHandler from .web_request import Request from .web_response import StreamResponse from .web_routedef import AbstractRouteDef from .web_server import Server from .web_urldispatcher import ( AbstractResource, AbstractRoute, Domain, MaskDomain, MatchedSubAppResource, PrefixedSubAppResource, UrlDispatcher, ) __all__ = ("Application", "CleanupError") if TYPE_CHECKING: # pragma: no cover from .typedefs import Handler _AppSignal = Signal[Callable[["Application"], Awaitable[None]]] _RespPrepareSignal = Signal[Callable[[Request, StreamResponse], Awaitable[None]]] _Middleware = Union[ Callable[[Request, Handler], Awaitable[StreamResponse]], Callable[["Application", Handler], Awaitable[Handler]], # old-style ] _Middlewares = FrozenList[_Middleware] _MiddlewaresHandlers = Optional[Sequence[Tuple[_Middleware, bool]]] _Subapps = List["Application"] else: # No type checker mode, skip types _AppSignal = Signal _RespPrepareSignal = Signal _Middleware = Callable _Middlewares = FrozenList _MiddlewaresHandlers = Optional[Sequence] _Subapps = List class Application(MutableMapping[str, Any]): ATTRS = frozenset( [ "logger", "_debug", "_router", "_loop", "_handler_args", "_middlewares", "_middlewares_handlers", "_run_middlewares", "_state", "_frozen", "_pre_frozen", "_subapps", "_on_response_prepare", "_on_startup", "_on_shutdown", "_on_cleanup", "_client_max_size", "_cleanup_ctx", ] ) def __init__( self, *, logger: logging.Logger = web_logger, router: Optional[UrlDispatcher] = None, middlewares: Iterable[_Middleware] = (), handler_args: Optional[Mapping[str, Any]] = None, client_max_size: int = 1024 ** 2, loop: Optional[asyncio.AbstractEventLoop] = None, debug: Any = ..., # mypy doesn't support ellipsis ) -> None: if router is None: router = UrlDispatcher() else: warnings.warn( "router argument is deprecated", DeprecationWarning, stacklevel=2 ) assert isinstance(router, AbstractRouter), router if loop is not None: warnings.warn( "loop argument is deprecated", DeprecationWarning, stacklevel=2 ) if debug is not ...: warnings.warn( "debug argument is deprecated", DeprecationWarning, stacklevel=2 ) self._debug = debug self._router = router # type: UrlDispatcher self._loop = loop self._handler_args = handler_args self.logger = logger self._middlewares = FrozenList(middlewares) # type: _Middlewares # initialized on freezing self._middlewares_handlers = None # type: _MiddlewaresHandlers # initialized on freezing self._run_middlewares = None # type: Optional[bool] self._state = {} # type: Dict[str, Any] self._frozen = False self._pre_frozen = False self._subapps = [] # type: _Subapps self._on_response_prepare = Signal(self) # type: _RespPrepareSignal self._on_startup = Signal(self) # type: _AppSignal self._on_shutdown = Signal(self) # type: _AppSignal self._on_cleanup = Signal(self) # type: _AppSignal self._cleanup_ctx = CleanupContext() self._on_startup.append(self._cleanup_ctx._on_startup) self._on_cleanup.append(self._cleanup_ctx._on_cleanup) self._client_max_size = client_max_size def __init_subclass__(cls: Type["Application"]) -> None: warnings.warn( "Inheritance class {} from web.Application " "is discouraged".format(cls.__name__), DeprecationWarning, stacklevel=2, ) if DEBUG: # pragma: no cover def __setattr__(self, name: str, val: Any) -> None: if name not in self.ATTRS: warnings.warn( "Setting custom web.Application.{} attribute " "is discouraged".format(name), DeprecationWarning, stacklevel=2, ) super().__setattr__(name, val) # MutableMapping API def __eq__(self, other: object) -> bool: return self is other def __getitem__(self, key: str) -> Any: return self._state[key] def _check_frozen(self) -> None: if self._frozen: warnings.warn( "Changing state of started or joined " "application is deprecated", DeprecationWarning, stacklevel=3, ) def __setitem__(self, key: str, value: Any) -> None: self._check_frozen() self._state[key] = value def __delitem__(self, key: str) -> None: self._check_frozen() del self._state[key] def __len__(self) -> int: return len(self._state) def __iter__(self) -> Iterator[str]: return iter(self._state) ######## @property def loop(self) -> asyncio.AbstractEventLoop: # Technically the loop can be None # but we mask it by explicit type cast # to provide more convinient type annotation warnings.warn("loop property is deprecated", DeprecationWarning, stacklevel=2) return cast(asyncio.AbstractEventLoop, self._loop) def _set_loop(self, loop: Optional[asyncio.AbstractEventLoop]) -> None: if loop is None: loop = asyncio.get_event_loop() if self._loop is not None and self._loop is not loop: raise RuntimeError( "web.Application instance initialized with different loop" ) self._loop = loop # set loop debug if self._debug is ...: self._debug = loop.get_debug() # set loop to sub applications for subapp in self._subapps: subapp._set_loop(loop) @property def pre_frozen(self) -> bool: return self._pre_frozen def pre_freeze(self) -> None: if self._pre_frozen: return self._pre_frozen = True self._middlewares.freeze() self._router.freeze() self._on_response_prepare.freeze() self._cleanup_ctx.freeze() self._on_startup.freeze() self._on_shutdown.freeze() self._on_cleanup.freeze() self._middlewares_handlers = tuple(self._prepare_middleware()) # If current app and any subapp do not have middlewares avoid run all # of the code footprint that it implies, which have a middleware # hardcoded per app that sets up the current_app attribute. If no # middlewares are configured the handler will receive the proper # current_app without needing all of this code. self._run_middlewares = True if self.middlewares else False for subapp in self._subapps: subapp.pre_freeze() self._run_middlewares = self._run_middlewares or subapp._run_middlewares @property def frozen(self) -> bool: return self._frozen def freeze(self) -> None: if self._frozen: return self.pre_freeze() self._frozen = True for subapp in self._subapps: subapp.freeze() @property def debug(self) -> bool: warnings.warn("debug property is deprecated", DeprecationWarning, stacklevel=2) return self._debug # type: ignore[no-any-return] def _reg_subapp_signals(self, subapp: "Application") -> None: def reg_handler(signame: str) -> None: subsig = getattr(subapp, signame) async def handler(app: "Application") -> None: await subsig.send(subapp) appsig = getattr(self, signame) appsig.append(handler) reg_handler("on_startup") reg_handler("on_shutdown") reg_handler("on_cleanup") def add_subapp(self, prefix: str, subapp: "Application") -> AbstractResource: if not isinstance(prefix, str): raise TypeError("Prefix must be str") prefix = prefix.rstrip("/") if not prefix: raise ValueError("Prefix cannot be empty") factory = partial(PrefixedSubAppResource, prefix, subapp) return self._add_subapp(factory, subapp) def _add_subapp( self, resource_factory: Callable[[], AbstractResource], subapp: "Application" ) -> AbstractResource: if self.frozen: raise RuntimeError("Cannot add sub application to frozen application") if subapp.frozen: raise RuntimeError("Cannot add frozen application") resource = resource_factory() self.router.register_resource(resource) self._reg_subapp_signals(subapp) self._subapps.append(subapp) subapp.pre_freeze() if self._loop is not None: subapp._set_loop(self._loop) return resource def add_domain(self, domain: str, subapp: "Application") -> AbstractResource: if not isinstance(domain, str): raise TypeError("Domain must be str") elif "*" in domain: rule = MaskDomain(domain) # type: Domain else: rule = Domain(domain) factory = partial(MatchedSubAppResource, rule, subapp) return self._add_subapp(factory, subapp) def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: return self.router.add_routes(routes) @property def on_response_prepare(self) -> _RespPrepareSignal: return self._on_response_prepare @property def on_startup(self) -> _AppSignal: return self._on_startup @property def on_shutdown(self) -> _AppSignal: return self._on_shutdown @property def on_cleanup(self) -> _AppSignal: return self._on_cleanup @property def cleanup_ctx(self) -> "CleanupContext": return self._cleanup_ctx @property def router(self) -> UrlDispatcher: return self._router @property def middlewares(self) -> _Middlewares: return self._middlewares def _make_handler( self, *, loop: Optional[asyncio.AbstractEventLoop] = None, access_log_class: Type[AbstractAccessLogger] = AccessLogger, **kwargs: Any, ) -> Server: if not issubclass(access_log_class, AbstractAccessLogger): raise TypeError( "access_log_class must be subclass of " "aiohttp.abc.AbstractAccessLogger, got {}".format(access_log_class) ) self._set_loop(loop) self.freeze() kwargs["debug"] = self._debug kwargs["access_log_class"] = access_log_class if self._handler_args: for k, v in self._handler_args.items(): kwargs[k] = v return Server( self._handle, # type: ignore[arg-type] request_factory=self._make_request, loop=self._loop, **kwargs, ) def make_handler( self, *, loop: Optional[asyncio.AbstractEventLoop] = None, access_log_class: Type[AbstractAccessLogger] = AccessLogger, **kwargs: Any, ) -> Server: warnings.warn( "Application.make_handler(...) is deprecated, " "use AppRunner API instead", DeprecationWarning, stacklevel=2, ) return self._make_handler( loop=loop, access_log_class=access_log_class, **kwargs ) async def startup(self) -> None: """Causes on_startup signal Should be called in the event loop along with the request handler. """ await self.on_startup.send(self) async def shutdown(self) -> None: """Causes on_shutdown signal Should be called before cleanup() """ await self.on_shutdown.send(self) async def cleanup(self) -> None: """Causes on_cleanup signal Should be called after shutdown() """ if self.on_cleanup.frozen: await self.on_cleanup.send(self) else: # If an exception occurs in startup, ensure cleanup contexts are completed. await self._cleanup_ctx._on_cleanup(self) def _make_request( self, message: RawRequestMessage, payload: StreamReader, protocol: RequestHandler, writer: AbstractStreamWriter, task: "asyncio.Task[None]", _cls: Type[Request] = Request, ) -> Request: return _cls( message, payload, protocol, writer, task, self._loop, client_max_size=self._client_max_size, ) def _prepare_middleware(self) -> Iterator[Tuple[_Middleware, bool]]: for m in reversed(self._middlewares): if getattr(m, "__middleware_version__", None) == 1: yield m, True else: warnings.warn( 'old-style middleware "{!r}" deprecated, ' "see #2252".format(m), DeprecationWarning, stacklevel=2, ) yield m, False yield _fix_request_current_app(self), True async def _handle(self, request: Request) -> StreamResponse: loop = asyncio.get_event_loop() debug = loop.get_debug() match_info = await self._router.resolve(request) if debug: # pragma: no cover if not isinstance(match_info, AbstractMatchInfo): raise TypeError( "match_info should be AbstractMatchInfo " "instance, not {!r}".format(match_info) ) match_info.add_app(self) match_info.freeze() resp = None request._match_info = match_info expect = request.headers.get(hdrs.EXPECT) if expect: resp = await match_info.expect_handler(request) await request.writer.drain() if resp is None: handler = match_info.handler if self._run_middlewares: for app in match_info.apps[::-1]: for m, new_style in app._middlewares_handlers: # type: ignore[union-attr] # noqa if new_style: handler = update_wrapper( partial(m, handler=handler), handler ) else: handler = await m(app, handler) # type: ignore[arg-type] resp = await handler(request) return resp def __call__(self) -> "Application": """gunicorn compatibility""" return self def __repr__(self) -> str: return f"" def __bool__(self) -> bool: return True class CleanupError(RuntimeError): @property def exceptions(self) -> List[BaseException]: return cast(List[BaseException], self.args[1]) if TYPE_CHECKING: # pragma: no cover _CleanupContextBase = FrozenList[Callable[[Application], AsyncIterator[None]]] else: _CleanupContextBase = FrozenList class CleanupContext(_CleanupContextBase): def __init__(self) -> None: super().__init__() self._exits = [] # type: List[AsyncIterator[None]] async def _on_startup(self, app: Application) -> None: for cb in self: it = cb(app).__aiter__() await it.__anext__() self._exits.append(it) async def _on_cleanup(self, app: Application) -> None: errors = [] for it in reversed(self._exits): try: await it.__anext__() except StopAsyncIteration: pass except Exception as exc: errors.append(exc) else: errors.append(RuntimeError(f"{it!r} has more than one 'yield'")) if errors: if len(errors) == 1: raise errors[0] else: raise CleanupError("Multiple errors on cleanup stage", errors) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_exceptions.py0000644000175100001710000002357200000000000017604 0ustar00runnerdockerimport warnings from typing import Any, Dict, Iterable, List, Optional, Set # noqa from yarl import URL from .typedefs import LooseHeaders, StrOrURL from .web_response import Response __all__ = ( "HTTPException", "HTTPError", "HTTPRedirection", "HTTPSuccessful", "HTTPOk", "HTTPCreated", "HTTPAccepted", "HTTPNonAuthoritativeInformation", "HTTPNoContent", "HTTPResetContent", "HTTPPartialContent", "HTTPMultipleChoices", "HTTPMovedPermanently", "HTTPFound", "HTTPSeeOther", "HTTPNotModified", "HTTPUseProxy", "HTTPTemporaryRedirect", "HTTPPermanentRedirect", "HTTPClientError", "HTTPBadRequest", "HTTPUnauthorized", "HTTPPaymentRequired", "HTTPForbidden", "HTTPNotFound", "HTTPMethodNotAllowed", "HTTPNotAcceptable", "HTTPProxyAuthenticationRequired", "HTTPRequestTimeout", "HTTPConflict", "HTTPGone", "HTTPLengthRequired", "HTTPPreconditionFailed", "HTTPRequestEntityTooLarge", "HTTPRequestURITooLong", "HTTPUnsupportedMediaType", "HTTPRequestRangeNotSatisfiable", "HTTPExpectationFailed", "HTTPMisdirectedRequest", "HTTPUnprocessableEntity", "HTTPFailedDependency", "HTTPUpgradeRequired", "HTTPPreconditionRequired", "HTTPTooManyRequests", "HTTPRequestHeaderFieldsTooLarge", "HTTPUnavailableForLegalReasons", "HTTPServerError", "HTTPInternalServerError", "HTTPNotImplemented", "HTTPBadGateway", "HTTPServiceUnavailable", "HTTPGatewayTimeout", "HTTPVersionNotSupported", "HTTPVariantAlsoNegotiates", "HTTPInsufficientStorage", "HTTPNotExtended", "HTTPNetworkAuthenticationRequired", ) ############################################################ # HTTP Exceptions ############################################################ class HTTPException(Response, Exception): # You should set in subclasses: # status = 200 status_code = -1 empty_body = False __http_exception__ = True def __init__( self, *, headers: Optional[LooseHeaders] = None, reason: Optional[str] = None, body: Any = None, text: Optional[str] = None, content_type: Optional[str] = None, ) -> None: if body is not None: warnings.warn( "body argument is deprecated for http web exceptions", DeprecationWarning, ) Response.__init__( self, status=self.status_code, headers=headers, reason=reason, body=body, text=text, content_type=content_type, ) Exception.__init__(self, self.reason) if self.body is None and not self.empty_body: self.text = f"{self.status}: {self.reason}" def __bool__(self) -> bool: return True class HTTPError(HTTPException): """Base class for exceptions with status codes in the 400s and 500s.""" class HTTPRedirection(HTTPException): """Base class for exceptions with status codes in the 300s.""" class HTTPSuccessful(HTTPException): """Base class for exceptions with status codes in the 200s.""" class HTTPOk(HTTPSuccessful): status_code = 200 class HTTPCreated(HTTPSuccessful): status_code = 201 class HTTPAccepted(HTTPSuccessful): status_code = 202 class HTTPNonAuthoritativeInformation(HTTPSuccessful): status_code = 203 class HTTPNoContent(HTTPSuccessful): status_code = 204 empty_body = True class HTTPResetContent(HTTPSuccessful): status_code = 205 empty_body = True class HTTPPartialContent(HTTPSuccessful): status_code = 206 ############################################################ # 3xx redirection ############################################################ class _HTTPMove(HTTPRedirection): def __init__( self, location: StrOrURL, *, headers: Optional[LooseHeaders] = None, reason: Optional[str] = None, body: Any = None, text: Optional[str] = None, content_type: Optional[str] = None, ) -> None: if not location: raise ValueError("HTTP redirects need a location to redirect to.") super().__init__( headers=headers, reason=reason, body=body, text=text, content_type=content_type, ) self.headers["Location"] = str(URL(location)) self.location = location class HTTPMultipleChoices(_HTTPMove): status_code = 300 class HTTPMovedPermanently(_HTTPMove): status_code = 301 class HTTPFound(_HTTPMove): status_code = 302 # This one is safe after a POST (the redirected location will be # retrieved with GET): class HTTPSeeOther(_HTTPMove): status_code = 303 class HTTPNotModified(HTTPRedirection): # FIXME: this should include a date or etag header status_code = 304 empty_body = True class HTTPUseProxy(_HTTPMove): # Not a move, but looks a little like one status_code = 305 class HTTPTemporaryRedirect(_HTTPMove): status_code = 307 class HTTPPermanentRedirect(_HTTPMove): status_code = 308 ############################################################ # 4xx client error ############################################################ class HTTPClientError(HTTPError): pass class HTTPBadRequest(HTTPClientError): status_code = 400 class HTTPUnauthorized(HTTPClientError): status_code = 401 class HTTPPaymentRequired(HTTPClientError): status_code = 402 class HTTPForbidden(HTTPClientError): status_code = 403 class HTTPNotFound(HTTPClientError): status_code = 404 class HTTPMethodNotAllowed(HTTPClientError): status_code = 405 def __init__( self, method: str, allowed_methods: Iterable[str], *, headers: Optional[LooseHeaders] = None, reason: Optional[str] = None, body: Any = None, text: Optional[str] = None, content_type: Optional[str] = None, ) -> None: allow = ",".join(sorted(allowed_methods)) super().__init__( headers=headers, reason=reason, body=body, text=text, content_type=content_type, ) self.headers["Allow"] = allow self.allowed_methods = set(allowed_methods) # type: Set[str] self.method = method.upper() class HTTPNotAcceptable(HTTPClientError): status_code = 406 class HTTPProxyAuthenticationRequired(HTTPClientError): status_code = 407 class HTTPRequestTimeout(HTTPClientError): status_code = 408 class HTTPConflict(HTTPClientError): status_code = 409 class HTTPGone(HTTPClientError): status_code = 410 class HTTPLengthRequired(HTTPClientError): status_code = 411 class HTTPPreconditionFailed(HTTPClientError): status_code = 412 class HTTPRequestEntityTooLarge(HTTPClientError): status_code = 413 def __init__(self, max_size: float, actual_size: float, **kwargs: Any) -> None: kwargs.setdefault( "text", "Maximum request body size {} exceeded, " "actual body size {}".format(max_size, actual_size), ) super().__init__(**kwargs) class HTTPRequestURITooLong(HTTPClientError): status_code = 414 class HTTPUnsupportedMediaType(HTTPClientError): status_code = 415 class HTTPRequestRangeNotSatisfiable(HTTPClientError): status_code = 416 class HTTPExpectationFailed(HTTPClientError): status_code = 417 class HTTPMisdirectedRequest(HTTPClientError): status_code = 421 class HTTPUnprocessableEntity(HTTPClientError): status_code = 422 class HTTPFailedDependency(HTTPClientError): status_code = 424 class HTTPUpgradeRequired(HTTPClientError): status_code = 426 class HTTPPreconditionRequired(HTTPClientError): status_code = 428 class HTTPTooManyRequests(HTTPClientError): status_code = 429 class HTTPRequestHeaderFieldsTooLarge(HTTPClientError): status_code = 431 class HTTPUnavailableForLegalReasons(HTTPClientError): status_code = 451 def __init__( self, link: str, *, headers: Optional[LooseHeaders] = None, reason: Optional[str] = None, body: Any = None, text: Optional[str] = None, content_type: Optional[str] = None, ) -> None: super().__init__( headers=headers, reason=reason, body=body, text=text, content_type=content_type, ) self.headers["Link"] = '<%s>; rel="blocked-by"' % link self.link = link ############################################################ # 5xx Server Error ############################################################ # Response status codes beginning with the digit "5" indicate cases in # which the server is aware that it has erred or is incapable of # performing the request. Except when responding to a HEAD request, the # server SHOULD include an entity containing an explanation of the error # situation, and whether it is a temporary or permanent condition. User # agents SHOULD display any included entity to the user. These response # codes are applicable to any request method. class HTTPServerError(HTTPError): pass class HTTPInternalServerError(HTTPServerError): status_code = 500 class HTTPNotImplemented(HTTPServerError): status_code = 501 class HTTPBadGateway(HTTPServerError): status_code = 502 class HTTPServiceUnavailable(HTTPServerError): status_code = 503 class HTTPGatewayTimeout(HTTPServerError): status_code = 504 class HTTPVersionNotSupported(HTTPServerError): status_code = 505 class HTTPVariantAlsoNegotiates(HTTPServerError): status_code = 506 class HTTPInsufficientStorage(HTTPServerError): status_code = 507 class HTTPNotExtended(HTTPServerError): status_code = 510 class HTTPNetworkAuthenticationRequired(HTTPServerError): status_code = 511 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_fileresponse.py0000644000175100001710000002504000000000000020111 0ustar00runnerdockerimport asyncio import mimetypes import os import pathlib import sys from typing import ( # noqa IO, TYPE_CHECKING, Any, Awaitable, Callable, Iterator, List, Optional, Tuple, Union, cast, ) from . import hdrs from .abc import AbstractStreamWriter from .helpers import ETAG_ANY, ETag from .typedefs import Final, LooseHeaders from .web_exceptions import ( HTTPNotModified, HTTPPartialContent, HTTPPreconditionFailed, HTTPRequestRangeNotSatisfiable, ) from .web_response import StreamResponse __all__ = ("FileResponse",) if TYPE_CHECKING: # pragma: no cover from .web_request import BaseRequest _T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] NOSENDFILE: Final[bool] = bool(os.environ.get("AIOHTTP_NOSENDFILE")) class FileResponse(StreamResponse): """A response object can be used to send files.""" def __init__( self, path: Union[str, pathlib.Path], chunk_size: int = 256 * 1024, status: int = 200, reason: Optional[str] = None, headers: Optional[LooseHeaders] = None, ) -> None: super().__init__(status=status, reason=reason, headers=headers) if isinstance(path, str): path = pathlib.Path(path) self._path = path self._chunk_size = chunk_size async def _sendfile_fallback( self, writer: AbstractStreamWriter, fobj: IO[Any], offset: int, count: int ) -> AbstractStreamWriter: # To keep memory usage low,fobj is transferred in chunks # controlled by the constructor's chunk_size argument. chunk_size = self._chunk_size loop = asyncio.get_event_loop() await loop.run_in_executor(None, fobj.seek, offset) chunk = await loop.run_in_executor(None, fobj.read, chunk_size) while chunk: await writer.write(chunk) count = count - chunk_size if count <= 0: break chunk = await loop.run_in_executor(None, fobj.read, min(chunk_size, count)) await writer.drain() return writer async def _sendfile( self, request: "BaseRequest", fobj: IO[Any], offset: int, count: int ) -> AbstractStreamWriter: writer = await super().prepare(request) assert writer is not None if NOSENDFILE or sys.version_info < (3, 7) or self.compression: return await self._sendfile_fallback(writer, fobj, offset, count) loop = request._loop transport = request.transport assert transport is not None try: await loop.sendfile(transport, fobj, offset, count) except NotImplementedError: return await self._sendfile_fallback(writer, fobj, offset, count) await super().write_eof() return writer @staticmethod def _strong_etag_match(etag_value: str, etags: Tuple[ETag, ...]) -> bool: if len(etags) == 1 and etags[0].value == ETAG_ANY: return True return any(etag.value == etag_value for etag in etags if not etag.is_weak) async def _not_modified( self, request: "BaseRequest", etag_value: str, last_modified: float ) -> Optional[AbstractStreamWriter]: self.set_status(HTTPNotModified.status_code) self._length_check = False self.etag = etag_value # type: ignore[assignment] self.last_modified = last_modified # type: ignore[assignment] # Delete any Content-Length headers provided by user. HTTP 304 # should always have empty response body return await super().prepare(request) async def _precondition_failed( self, request: "BaseRequest" ) -> Optional[AbstractStreamWriter]: self.set_status(HTTPPreconditionFailed.status_code) self.content_length = 0 return await super().prepare(request) async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: filepath = self._path gzip = False if "gzip" in request.headers.get(hdrs.ACCEPT_ENCODING, ""): gzip_path = filepath.with_name(filepath.name + ".gz") if gzip_path.is_file(): filepath = gzip_path gzip = True loop = asyncio.get_event_loop() st: os.stat_result = await loop.run_in_executor(None, filepath.stat) etag_value = f"{st.st_mtime_ns:x}-{st.st_size:x}" last_modified = st.st_mtime # https://tools.ietf.org/html/rfc7232#section-6 ifmatch = request.if_match if ifmatch is not None and not self._strong_etag_match(etag_value, ifmatch): return await self._precondition_failed(request) unmodsince = request.if_unmodified_since if ( unmodsince is not None and ifmatch is None and st.st_mtime > unmodsince.timestamp() ): return await self._precondition_failed(request) ifnonematch = request.if_none_match if ifnonematch is not None and self._strong_etag_match(etag_value, ifnonematch): return await self._not_modified(request, etag_value, last_modified) modsince = request.if_modified_since if ( modsince is not None and ifnonematch is None and st.st_mtime <= modsince.timestamp() ): return await self._not_modified(request, etag_value, last_modified) if hdrs.CONTENT_TYPE not in self.headers: ct, encoding = mimetypes.guess_type(str(filepath)) if not ct: ct = "application/octet-stream" should_set_ct = True else: encoding = "gzip" if gzip else None should_set_ct = False status = self._status file_size = st.st_size count = file_size start = None ifrange = request.if_range if ifrange is None or st.st_mtime <= ifrange.timestamp(): # If-Range header check: # condition = cached date >= last modification date # return 206 if True else 200. # if False: # Range header would not be processed, return 200 # if True but Range header missing # return 200 try: rng = request.http_range start = rng.start end = rng.stop except ValueError: # https://tools.ietf.org/html/rfc7233: # A server generating a 416 (Range Not Satisfiable) response to # a byte-range request SHOULD send a Content-Range header field # with an unsatisfied-range value. # The complete-length in a 416 response indicates the current # length of the selected representation. # # Will do the same below. Many servers ignore this and do not # send a Content-Range header with HTTP 416 self.headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" self.set_status(HTTPRequestRangeNotSatisfiable.status_code) return await super().prepare(request) # If a range request has been made, convert start, end slice # notation into file pointer offset and count if start is not None or end is not None: if start < 0 and end is None: # return tail of file start += file_size if start < 0: # if Range:bytes=-1000 in request header but file size # is only 200, there would be trouble without this start = 0 count = file_size - start else: # rfc7233:If the last-byte-pos value is # absent, or if the value is greater than or equal to # the current length of the representation data, # the byte range is interpreted as the remainder # of the representation (i.e., the server replaces the # value of last-byte-pos with a value that is one less than # the current length of the selected representation). count = ( min(end if end is not None else file_size, file_size) - start ) if start >= file_size: # HTTP 416 should be returned in this case. # # According to https://tools.ietf.org/html/rfc7233: # If a valid byte-range-set includes at least one # byte-range-spec with a first-byte-pos that is less than # the current length of the representation, or at least one # suffix-byte-range-spec with a non-zero suffix-length, # then the byte-range-set is satisfiable. Otherwise, the # byte-range-set is unsatisfiable. self.headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" self.set_status(HTTPRequestRangeNotSatisfiable.status_code) return await super().prepare(request) status = HTTPPartialContent.status_code # Even though you are sending the whole file, you should still # return a HTTP 206 for a Range request. self.set_status(status) if should_set_ct: self.content_type = ct # type: ignore[assignment] if encoding: self.headers[hdrs.CONTENT_ENCODING] = encoding if gzip: self.headers[hdrs.VARY] = hdrs.ACCEPT_ENCODING self.etag = etag_value # type: ignore[assignment] self.last_modified = st.st_mtime # type: ignore[assignment] self.content_length = count self.headers[hdrs.ACCEPT_RANGES] = "bytes" real_start = cast(int, start) if status == HTTPPartialContent.status_code: self.headers[hdrs.CONTENT_RANGE] = "bytes {}-{}/{}".format( real_start, real_start + count - 1, file_size ) # If we are sending 0 bytes calling sendfile() will throw a ValueError if count == 0 or request.method == hdrs.METH_HEAD or self.status in [204, 304]: return await super().prepare(request) fobj = await loop.run_in_executor(None, filepath.open, "rb") if start: # be aware that start could be None or int=0 here. offset = start else: offset = 0 try: return await self._sendfile(request, fobj, offset, count) finally: await loop.run_in_executor(None, fobj.close) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_log.py0000644000175100001710000001661500000000000016204 0ustar00runnerdockerimport datetime import functools import logging import os import re from collections import namedtuple from typing import Any, Callable, Dict, Iterable, List, Tuple # noqa from .abc import AbstractAccessLogger from .web_request import BaseRequest from .web_response import StreamResponse KeyMethod = namedtuple("KeyMethod", "key method") class AccessLogger(AbstractAccessLogger): """Helper object to log access. Usage: log = logging.getLogger("spam") log_format = "%a %{User-Agent}i" access_logger = AccessLogger(log, log_format) access_logger.log(request, response, time) Format: %% The percent sign %a Remote IP-address (IP-address of proxy if using reverse proxy) %t Time when the request was started to process %P The process ID of the child that serviced the request %r First line of request %s Response status code %b Size of response in bytes, including HTTP headers %T Time taken to serve the request, in seconds %Tf Time taken to serve the request, in seconds with floating fraction in .06f format %D Time taken to serve the request, in microseconds %{FOO}i request.headers['FOO'] %{FOO}o response.headers['FOO'] %{FOO}e os.environ['FOO'] """ LOG_FORMAT_MAP = { "a": "remote_address", "t": "request_start_time", "P": "process_id", "r": "first_request_line", "s": "response_status", "b": "response_size", "T": "request_time", "Tf": "request_time_frac", "D": "request_time_micro", "i": "request_header", "o": "response_header", } LOG_FORMAT = '%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' FORMAT_RE = re.compile(r"%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrsbOD]|Tf?)") CLEANUP_RE = re.compile(r"(%[^s])") _FORMAT_CACHE = {} # type: Dict[str, Tuple[str, List[KeyMethod]]] def __init__(self, logger: logging.Logger, log_format: str = LOG_FORMAT) -> None: """Initialise the logger. logger is a logger object to be used for logging. log_format is a string with apache compatible log format description. """ super().__init__(logger, log_format=log_format) _compiled_format = AccessLogger._FORMAT_CACHE.get(log_format) if not _compiled_format: _compiled_format = self.compile_format(log_format) AccessLogger._FORMAT_CACHE[log_format] = _compiled_format self._log_format, self._methods = _compiled_format def compile_format(self, log_format: str) -> Tuple[str, List[KeyMethod]]: """Translate log_format into form usable by modulo formatting All known atoms will be replaced with %s Also methods for formatting of those atoms will be added to _methods in appropriate order For example we have log_format = "%a %t" This format will be translated to "%s %s" Also contents of _methods will be [self._format_a, self._format_t] These method will be called and results will be passed to translated string format. Each _format_* method receive 'args' which is list of arguments given to self.log Exceptions are _format_e, _format_i and _format_o methods which also receive key name (by functools.partial) """ # list of (key, method) tuples, we don't use an OrderedDict as users # can repeat the same key more than once methods = list() for atom in self.FORMAT_RE.findall(log_format): if atom[1] == "": format_key1 = self.LOG_FORMAT_MAP[atom[0]] m = getattr(AccessLogger, "_format_%s" % atom[0]) key_method = KeyMethod(format_key1, m) else: format_key2 = (self.LOG_FORMAT_MAP[atom[2]], atom[1]) m = getattr(AccessLogger, "_format_%s" % atom[2]) key_method = KeyMethod(format_key2, functools.partial(m, atom[1])) methods.append(key_method) log_format = self.FORMAT_RE.sub(r"%s", log_format) log_format = self.CLEANUP_RE.sub(r"%\1", log_format) return log_format, methods @staticmethod def _format_i( key: str, request: BaseRequest, response: StreamResponse, time: float ) -> str: if request is None: return "(no headers)" # suboptimal, make istr(key) once return request.headers.get(key, "-") @staticmethod def _format_o( key: str, request: BaseRequest, response: StreamResponse, time: float ) -> str: # suboptimal, make istr(key) once return response.headers.get(key, "-") @staticmethod def _format_a(request: BaseRequest, response: StreamResponse, time: float) -> str: if request is None: return "-" ip = request.remote return ip if ip is not None else "-" @staticmethod def _format_t(request: BaseRequest, response: StreamResponse, time: float) -> str: now = datetime.datetime.utcnow() start_time = now - datetime.timedelta(seconds=time) return start_time.strftime("[%d/%b/%Y:%H:%M:%S +0000]") @staticmethod def _format_P(request: BaseRequest, response: StreamResponse, time: float) -> str: return "<%s>" % os.getpid() @staticmethod def _format_r(request: BaseRequest, response: StreamResponse, time: float) -> str: if request is None: return "-" return "{} {} HTTP/{}.{}".format( request.method, request.path_qs, request.version.major, request.version.minor, ) @staticmethod def _format_s(request: BaseRequest, response: StreamResponse, time: float) -> int: return response.status @staticmethod def _format_b(request: BaseRequest, response: StreamResponse, time: float) -> int: return response.body_length @staticmethod def _format_T(request: BaseRequest, response: StreamResponse, time: float) -> str: return str(round(time)) @staticmethod def _format_Tf(request: BaseRequest, response: StreamResponse, time: float) -> str: return "%06f" % time @staticmethod def _format_D(request: BaseRequest, response: StreamResponse, time: float) -> str: return str(round(time * 1000000)) def _format_line( self, request: BaseRequest, response: StreamResponse, time: float ) -> Iterable[Tuple[str, Callable[[BaseRequest, StreamResponse, float], str]]]: return [(key, method(request, response, time)) for key, method in self._methods] def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: try: fmt_info = self._format_line(request, response, time) values = list() extra = dict() for key, value in fmt_info: values.append(value) if key.__class__ is str: extra[key] = value else: k1, k2 = key # type: ignore[misc] dct = extra.get(k1, {}) # type: ignore[var-annotated,has-type] dct[k2] = value # type: ignore[index,has-type] extra[k1] = dct # type: ignore[has-type,assignment] self.logger.info(self._log_format % tuple(values), extra=extra) except Exception: self.logger.exception("Error in logging") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_middlewares.py0000644000175100001710000001005100000000000017707 0ustar00runnerdockerimport re from typing import TYPE_CHECKING, Awaitable, Callable, Tuple, Type, TypeVar from .typedefs import Handler from .web_exceptions import HTTPPermanentRedirect, _HTTPMove from .web_request import Request from .web_response import StreamResponse from .web_urldispatcher import SystemRoute __all__ = ( "middleware", "normalize_path_middleware", ) if TYPE_CHECKING: # pragma: no cover from .web_app import Application _Func = TypeVar("_Func") async def _check_request_resolves(request: Request, path: str) -> Tuple[bool, Request]: alt_request = request.clone(rel_url=path) match_info = await request.app.router.resolve(alt_request) alt_request._match_info = match_info if match_info.http_exception is None: return True, alt_request return False, request def middleware(f: _Func) -> _Func: f.__middleware_version__ = 1 # type: ignore[attr-defined] return f _Middleware = Callable[[Request, Handler], Awaitable[StreamResponse]] def normalize_path_middleware( *, append_slash: bool = True, remove_slash: bool = False, merge_slashes: bool = True, redirect_class: Type[_HTTPMove] = HTTPPermanentRedirect, ) -> _Middleware: """Factory for producing a middleware that normalizes the path of a request. Normalizing means: - Add or remove a trailing slash to the path. - Double slashes are replaced by one. The middleware returns as soon as it finds a path that resolves correctly. The order if both merge and append/remove are enabled is 1) merge slashes 2) append/remove slash 3) both merge slashes and append/remove slash. If the path resolves with at least one of those conditions, it will redirect to the new path. Only one of `append_slash` and `remove_slash` can be enabled. If both are `True` the factory will raise an assertion error If `append_slash` is `True` the middleware will append a slash when needed. If a resource is defined with trailing slash and the request comes without it, it will append it automatically. If `remove_slash` is `True`, `append_slash` must be `False`. When enabled the middleware will remove trailing slashes and redirect if the resource is defined If merge_slashes is True, merge multiple consecutive slashes in the path into one. """ correct_configuration = not (append_slash and remove_slash) assert correct_configuration, "Cannot both remove and append slash" @middleware async def impl(request: Request, handler: Handler) -> StreamResponse: if isinstance(request.match_info.route, SystemRoute): paths_to_check = [] if "?" in request.raw_path: path, query = request.raw_path.split("?", 1) query = "?" + query else: query = "" path = request.raw_path if merge_slashes: paths_to_check.append(re.sub("//+", "/", path)) if append_slash and not request.path.endswith("/"): paths_to_check.append(path + "/") if remove_slash and request.path.endswith("/"): paths_to_check.append(path[:-1]) if merge_slashes and append_slash: paths_to_check.append(re.sub("//+", "/", path + "/")) if merge_slashes and remove_slash: merged_slashes = re.sub("//+", "/", path) paths_to_check.append(merged_slashes[:-1]) for path in paths_to_check: path = re.sub("^//+", "/", path) # SECURITY: GHSA-v6wp-4m6f-gcjg resolves, request = await _check_request_resolves(request, path) if resolves: raise redirect_class(request.raw_path + query) return await handler(request) return impl def _fix_request_current_app(app: "Application") -> _Middleware: @middleware async def impl(request: Request, handler: Handler) -> StreamResponse: with request.match_info.set_current_app(app): return await handler(request) return impl ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_protocol.py0000644000175100001710000005402400000000000017260 0ustar00runnerdockerimport asyncio import asyncio.streams import traceback import warnings from collections import deque from contextlib import suppress from html import escape as html_escape from http import HTTPStatus from logging import Logger from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, Deque, Optional, Sequence, Tuple, Type, Union, cast, ) import attr import yarl from .abc import AbstractAccessLogger, AbstractStreamWriter from .base_protocol import BaseProtocol from .helpers import ceil_timeout from .http import ( HttpProcessingError, HttpRequestParser, HttpVersion10, RawRequestMessage, StreamWriter, ) from .log import access_logger, server_logger from .streams import EMPTY_PAYLOAD, StreamReader from .tcp_helpers import tcp_keepalive from .web_exceptions import HTTPException from .web_log import AccessLogger from .web_request import BaseRequest from .web_response import Response, StreamResponse __all__ = ("RequestHandler", "RequestPayloadError", "PayloadAccessError") if TYPE_CHECKING: # pragma: no cover from .web_server import Server _RequestFactory = Callable[ [ RawRequestMessage, StreamReader, "RequestHandler", AbstractStreamWriter, "asyncio.Task[None]", ], BaseRequest, ] _RequestHandler = Callable[[BaseRequest], Awaitable[StreamResponse]] ERROR = RawRequestMessage( "UNKNOWN", "/", HttpVersion10, {}, # type: ignore[arg-type] {}, # type: ignore[arg-type] True, None, False, False, yarl.URL("/"), ) class RequestPayloadError(Exception): """Payload parsing error.""" class PayloadAccessError(Exception): """Payload was accessed after response was sent.""" @attr.s(auto_attribs=True, frozen=True, slots=True) class _ErrInfo: status: int exc: BaseException message: str _MsgType = Tuple[Union[RawRequestMessage, _ErrInfo], StreamReader] class RequestHandler(BaseProtocol): """HTTP protocol implementation. RequestHandler handles incoming HTTP request. It reads request line, request headers and request payload and calls handle_request() method. By default it always returns with 404 response. RequestHandler handles errors in incoming request, like bad status line, bad headers or incomplete payload. If any error occurs, connection gets closed. keepalive_timeout -- number of seconds before closing keep-alive connection tcp_keepalive -- TCP keep-alive is on, default is on debug -- enable debug mode logger -- custom logger object access_log_class -- custom class for access_logger access_log -- custom logging object access_log_format -- access log format string loop -- Optional event loop max_line_size -- Optional maximum header line size max_field_size -- Optional maximum header field size max_headers -- Optional maximum header size """ KEEPALIVE_RESCHEDULE_DELAY = 1 __slots__ = ( "_request_count", "_keepalive", "_manager", "_request_handler", "_request_factory", "_tcp_keepalive", "_keepalive_time", "_keepalive_handle", "_keepalive_timeout", "_lingering_time", "_messages", "_message_tail", "_waiter", "_task_handler", "_upgrade", "_payload_parser", "_request_parser", "_reading_paused", "logger", "debug", "access_log", "access_logger", "_close", "_force_close", "_current_request", ) def __init__( self, manager: "Server", *, loop: asyncio.AbstractEventLoop, keepalive_timeout: float = 75.0, # NGINX default is 75 secs tcp_keepalive: bool = True, logger: Logger = server_logger, access_log_class: Type[AbstractAccessLogger] = AccessLogger, access_log: Logger = access_logger, access_log_format: str = AccessLogger.LOG_FORMAT, debug: bool = False, max_line_size: int = 8190, max_headers: int = 32768, max_field_size: int = 8190, lingering_time: float = 10.0, read_bufsize: int = 2 ** 16, auto_decompress: bool = True, ): super().__init__(loop) self._request_count = 0 self._keepalive = False self._current_request = None # type: Optional[BaseRequest] self._manager = manager # type: Optional[Server] self._request_handler: Optional[_RequestHandler] = manager.request_handler self._request_factory: Optional[_RequestFactory] = manager.request_factory self._tcp_keepalive = tcp_keepalive # placeholder to be replaced on keepalive timeout setup self._keepalive_time = 0.0 self._keepalive_handle = None # type: Optional[asyncio.Handle] self._keepalive_timeout = keepalive_timeout self._lingering_time = float(lingering_time) self._messages: Deque[_MsgType] = deque() self._message_tail = b"" self._waiter = None # type: Optional[asyncio.Future[None]] self._task_handler = None # type: Optional[asyncio.Task[None]] self._upgrade = False self._payload_parser = None # type: Any self._request_parser = HttpRequestParser( self, loop, read_bufsize, max_line_size=max_line_size, max_field_size=max_field_size, max_headers=max_headers, payload_exception=RequestPayloadError, auto_decompress=auto_decompress, ) # type: Optional[HttpRequestParser] self.logger = logger self.debug = debug self.access_log = access_log if access_log: self.access_logger = access_log_class( access_log, access_log_format ) # type: Optional[AbstractAccessLogger] else: self.access_logger = None self._close = False self._force_close = False def __repr__(self) -> str: return "<{} {}>".format( self.__class__.__name__, "connected" if self.transport is not None else "disconnected", ) @property def keepalive_timeout(self) -> float: return self._keepalive_timeout async def shutdown(self, timeout: Optional[float] = 15.0) -> None: """Do worker process exit preparations. We need to clean up everything and stop accepting requests. It is especially important for keep-alive connections. """ self._force_close = True if self._keepalive_handle is not None: self._keepalive_handle.cancel() if self._waiter: self._waiter.cancel() # wait for handlers with suppress(asyncio.CancelledError, asyncio.TimeoutError): async with ceil_timeout(timeout): if self._current_request is not None: self._current_request._cancel(asyncio.CancelledError()) if self._task_handler is not None and not self._task_handler.done(): await self._task_handler # force-close non-idle handler if self._task_handler is not None: self._task_handler.cancel() if self.transport is not None: self.transport.close() self.transport = None def connection_made(self, transport: asyncio.BaseTransport) -> None: super().connection_made(transport) real_transport = cast(asyncio.Transport, transport) if self._tcp_keepalive: tcp_keepalive(real_transport) self._task_handler = self._loop.create_task(self.start()) assert self._manager is not None self._manager.connection_made(self, real_transport) def connection_lost(self, exc: Optional[BaseException]) -> None: if self._manager is None: return self._manager.connection_lost(self, exc) super().connection_lost(exc) self._manager = None self._force_close = True self._request_factory = None self._request_handler = None self._request_parser = None if self._keepalive_handle is not None: self._keepalive_handle.cancel() if self._current_request is not None: if exc is None: exc = ConnectionResetError("Connection lost") self._current_request._cancel(exc) if self._task_handler is not None: self._task_handler.cancel() if self._waiter is not None: self._waiter.cancel() self._task_handler = None if self._payload_parser is not None: self._payload_parser.feed_eof() self._payload_parser = None def set_parser(self, parser: Any) -> None: # Actual type is WebReader assert self._payload_parser is None self._payload_parser = parser if self._message_tail: self._payload_parser.feed_data(self._message_tail) self._message_tail = b"" def eof_received(self) -> None: pass def data_received(self, data: bytes) -> None: if self._force_close or self._close: return # parse http messages messages: Sequence[_MsgType] if self._payload_parser is None and not self._upgrade: assert self._request_parser is not None try: messages, upgraded, tail = self._request_parser.feed_data(data) except HttpProcessingError as exc: messages = [ (_ErrInfo(status=400, exc=exc, message=exc.message), EMPTY_PAYLOAD) ] upgraded = False tail = b"" for msg, payload in messages or (): self._request_count += 1 self._messages.append((msg, payload)) waiter = self._waiter if messages and waiter is not None and not waiter.done(): # don't set result twice waiter.set_result(None) self._upgrade = upgraded if upgraded and tail: self._message_tail = tail # no parser, just store elif self._payload_parser is None and self._upgrade and data: self._message_tail += data # feed payload elif data: eof, tail = self._payload_parser.feed_data(data) if eof: self.close() def keep_alive(self, val: bool) -> None: """Set keep-alive connection mode. :param bool val: new state. """ self._keepalive = val if self._keepalive_handle: self._keepalive_handle.cancel() self._keepalive_handle = None def close(self) -> None: """Close connection. Stop accepting new pipelining messages and close connection when handlers done processing messages. """ self._close = True if self._waiter: self._waiter.cancel() def force_close(self) -> None: """Forcefully close connection.""" self._force_close = True if self._waiter: self._waiter.cancel() if self.transport is not None: self.transport.close() self.transport = None def log_access( self, request: BaseRequest, response: StreamResponse, time: float ) -> None: if self.access_logger is not None: self.access_logger.log(request, response, self._loop.time() - time) def log_debug(self, *args: Any, **kw: Any) -> None: if self.debug: self.logger.debug(*args, **kw) def log_exception(self, *args: Any, **kw: Any) -> None: self.logger.exception(*args, **kw) def _process_keepalive(self) -> None: if self._force_close or not self._keepalive: return next = self._keepalive_time + self._keepalive_timeout # handler in idle state if self._waiter: if self._loop.time() > next: self.force_close() return # not all request handlers are done, # reschedule itself to next second self._keepalive_handle = self._loop.call_later( self.KEEPALIVE_RESCHEDULE_DELAY, self._process_keepalive ) async def _handle_request( self, request: BaseRequest, start_time: float, request_handler: Callable[[BaseRequest], Awaitable[StreamResponse]], ) -> Tuple[StreamResponse, bool]: assert self._request_handler is not None try: try: self._current_request = request resp = await request_handler(request) finally: self._current_request = None except HTTPException as exc: resp = exc reset = await self.finish_response(request, resp, start_time) except asyncio.CancelledError: raise except asyncio.TimeoutError as exc: self.log_debug("Request handler timed out.", exc_info=exc) resp = self.handle_error(request, 504) reset = await self.finish_response(request, resp, start_time) except Exception as exc: resp = self.handle_error(request, 500, exc) reset = await self.finish_response(request, resp, start_time) else: # Deprecation warning (See #2415) if getattr(resp, "__http_exception__", False): warnings.warn( "returning HTTPException object is deprecated " "(#2415) and will be removed, " "please raise the exception instead", DeprecationWarning, ) reset = await self.finish_response(request, resp, start_time) return resp, reset async def start(self) -> None: """Process incoming request. It reads request line, request headers and request payload, then calls handle_request() method. Subclass has to override handle_request(). start() handles various exceptions in request or response handling. Connection is being closed always unless keep_alive(True) specified. """ loop = self._loop handler = self._task_handler assert handler is not None manager = self._manager assert manager is not None keepalive_timeout = self._keepalive_timeout resp = None assert self._request_factory is not None assert self._request_handler is not None while not self._force_close: if not self._messages: try: # wait for next request self._waiter = loop.create_future() await self._waiter except asyncio.CancelledError: break finally: self._waiter = None message, payload = self._messages.popleft() start = loop.time() manager.requests_count += 1 writer = StreamWriter(self, loop) if isinstance(message, _ErrInfo): # make request_factory work request_handler = self._make_error_handler(message) message = ERROR else: request_handler = self._request_handler request = self._request_factory(message, payload, self, writer, handler) try: # a new task is used for copy context vars (#3406) task = self._loop.create_task( self._handle_request(request, start, request_handler) ) try: resp, reset = await task except (asyncio.CancelledError, ConnectionError): self.log_debug("Ignored premature client disconnection") break # Drop the processed task from asyncio.Task.all_tasks() early del task if reset: self.log_debug("Ignored premature client disconnection 2") break # notify server about keep-alive self._keepalive = bool(resp.keep_alive) # check payload if not payload.is_eof(): lingering_time = self._lingering_time if not self._force_close and lingering_time: self.log_debug( "Start lingering close timer for %s sec.", lingering_time ) now = loop.time() end_t = now + lingering_time with suppress(asyncio.TimeoutError, asyncio.CancelledError): while not payload.is_eof() and now < end_t: async with ceil_timeout(end_t - now): # read and ignore await payload.readany() now = loop.time() # if payload still uncompleted if not payload.is_eof() and not self._force_close: self.log_debug("Uncompleted request.") self.close() payload.set_exception(PayloadAccessError()) except asyncio.CancelledError: self.log_debug("Ignored premature client disconnection ") break except RuntimeError as exc: if self.debug: self.log_exception("Unhandled runtime exception", exc_info=exc) self.force_close() except Exception as exc: self.log_exception("Unhandled exception", exc_info=exc) self.force_close() finally: if self.transport is None and resp is not None: self.log_debug("Ignored premature client disconnection.") elif not self._force_close: if self._keepalive and not self._close: # start keep-alive timer if keepalive_timeout is not None: now = self._loop.time() self._keepalive_time = now if self._keepalive_handle is None: self._keepalive_handle = loop.call_at( now + keepalive_timeout, self._process_keepalive ) else: break # remove handler, close transport if no handlers left if not self._force_close: self._task_handler = None if self.transport is not None: self.transport.close() async def finish_response( self, request: BaseRequest, resp: StreamResponse, start_time: float ) -> bool: """Prepare the response and write_eof, then log access. This has to be called within the context of any exception so the access logger can get exception information. Returns True if the client disconnects prematurely. """ if self._request_parser is not None: self._request_parser.set_upgraded(False) self._upgrade = False if self._message_tail: self._request_parser.feed_data(self._message_tail) self._message_tail = b"" try: prepare_meth = resp.prepare except AttributeError: if resp is None: raise RuntimeError("Missing return " "statement on request handler") else: raise RuntimeError( "Web-handler should return " "a response instance, " "got {!r}".format(resp) ) try: await prepare_meth(request) await resp.write_eof() except ConnectionError: self.log_access(request, resp, start_time) return True else: self.log_access(request, resp, start_time) return False def handle_error( self, request: BaseRequest, status: int = 500, exc: Optional[BaseException] = None, message: Optional[str] = None, ) -> StreamResponse: """Handle errors. Returns HTTP response with specific status code. Logs additional information. It always closes current connection. """ self.log_exception("Error handling request", exc_info=exc) # some data already got sent, connection is broken if request.writer.output_size > 0: raise ConnectionError( "Response is sent already, cannot send another response " "with the error message" ) ct = "text/plain" if status == HTTPStatus.INTERNAL_SERVER_ERROR: title = "{0.value} {0.phrase}".format(HTTPStatus.INTERNAL_SERVER_ERROR) msg = HTTPStatus.INTERNAL_SERVER_ERROR.description tb = None if self.debug: with suppress(Exception): tb = traceback.format_exc() if "text/html" in request.headers.get("Accept", ""): if tb: tb = html_escape(tb) msg = f"

Traceback:

\n
{tb}
" message = ( "" "{title}" "\n

{title}

" "\n{msg}\n\n" ).format(title=title, msg=msg) ct = "text/html" else: if tb: msg = tb message = title + "\n\n" + msg resp = Response(status=status, text=message, content_type=ct) resp.force_close() return resp def _make_error_handler( self, err_info: _ErrInfo ) -> Callable[[BaseRequest], Awaitable[StreamResponse]]: async def handler(request: BaseRequest) -> StreamResponse: return self.handle_error( request, err_info.status, err_info.exc, err_info.message ) return handler ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_request.py0000644000175100001710000006636000000000000017115 0ustar00runnerdockerimport asyncio import datetime import io import re import socket import string import tempfile import types import warnings from http.cookies import SimpleCookie from types import MappingProxyType from typing import ( TYPE_CHECKING, Any, Dict, Iterator, Mapping, MutableMapping, Optional, Pattern, Tuple, Union, cast, ) from urllib.parse import parse_qsl import attr from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy from yarl import URL from . import hdrs from .abc import AbstractStreamWriter from .helpers import ( DEBUG, ETAG_ANY, LIST_QUOTED_ETAG_RE, ChainMapProxy, ETag, HeadersMixin, parse_http_date, reify, sentinel, ) from .http_parser import RawRequestMessage from .http_writer import HttpVersion from .multipart import BodyPartReader, MultipartReader from .streams import EmptyStreamReader, StreamReader from .typedefs import ( DEFAULT_JSON_DECODER, Final, JSONDecoder, LooseHeaders, RawHeaders, StrOrURL, ) from .web_exceptions import HTTPRequestEntityTooLarge from .web_response import StreamResponse __all__ = ("BaseRequest", "FileField", "Request") if TYPE_CHECKING: # pragma: no cover from .web_app import Application from .web_protocol import RequestHandler from .web_urldispatcher import UrlMappingMatchInfo @attr.s(auto_attribs=True, frozen=True, slots=True) class FileField: name: str filename: str file: io.BufferedReader content_type: str headers: "CIMultiDictProxy[str]" _TCHAR: Final[str] = string.digits + string.ascii_letters + r"!#$%&'*+.^_`|~-" # '-' at the end to prevent interpretation as range in a char class _TOKEN: Final[str] = fr"[{_TCHAR}]+" _QDTEXT: Final[str] = r"[{}]".format( r"".join(chr(c) for c in (0x09, 0x20, 0x21) + tuple(range(0x23, 0x7F))) ) # qdtext includes 0x5C to escape 0x5D ('\]') # qdtext excludes obs-text (because obsoleted, and encoding not specified) _QUOTED_PAIR: Final[str] = r"\\[\t !-~]" _QUOTED_STRING: Final[str] = r'"(?:{quoted_pair}|{qdtext})*"'.format( qdtext=_QDTEXT, quoted_pair=_QUOTED_PAIR ) _FORWARDED_PAIR: Final[ str ] = r"({token})=({token}|{quoted_string})(:\d{{1,4}})?".format( token=_TOKEN, quoted_string=_QUOTED_STRING ) _QUOTED_PAIR_REPLACE_RE: Final[Pattern[str]] = re.compile(r"\\([\t !-~])") # same pattern as _QUOTED_PAIR but contains a capture group _FORWARDED_PAIR_RE: Final[Pattern[str]] = re.compile(_FORWARDED_PAIR) ############################################################ # HTTP Request ############################################################ class BaseRequest(MutableMapping[str, Any], HeadersMixin): POST_METHODS = { hdrs.METH_PATCH, hdrs.METH_POST, hdrs.METH_PUT, hdrs.METH_TRACE, hdrs.METH_DELETE, } ATTRS = HeadersMixin.ATTRS | frozenset( [ "_message", "_protocol", "_payload_writer", "_payload", "_headers", "_method", "_version", "_rel_url", "_post", "_read_bytes", "_state", "_cache", "_task", "_client_max_size", "_loop", "_transport_sslcontext", "_transport_peername", ] ) def __init__( self, message: RawRequestMessage, payload: StreamReader, protocol: "RequestHandler", payload_writer: AbstractStreamWriter, task: "asyncio.Task[None]", loop: asyncio.AbstractEventLoop, *, client_max_size: int = 1024 ** 2, state: Optional[Dict[str, Any]] = None, scheme: Optional[str] = None, host: Optional[str] = None, remote: Optional[str] = None, ) -> None: if state is None: state = {} self._message = message self._protocol = protocol self._payload_writer = payload_writer self._payload = payload self._headers = message.headers self._method = message.method self._version = message.version self._rel_url = message.url self._post = ( None ) # type: Optional[MultiDictProxy[Union[str, bytes, FileField]]] self._read_bytes = None # type: Optional[bytes] self._state = state self._cache = {} # type: Dict[str, Any] self._task = task self._client_max_size = client_max_size self._loop = loop transport = self._protocol.transport assert transport is not None self._transport_sslcontext = transport.get_extra_info("sslcontext") self._transport_peername = transport.get_extra_info("peername") if scheme is not None: self._cache["scheme"] = scheme if host is not None: self._cache["host"] = host if remote is not None: self._cache["remote"] = remote def clone( self, *, method: str = sentinel, rel_url: StrOrURL = sentinel, headers: LooseHeaders = sentinel, scheme: str = sentinel, host: str = sentinel, remote: str = sentinel, ) -> "BaseRequest": """Clone itself with replacement some attributes. Creates and returns a new instance of Request object. If no parameters are given, an exact copy is returned. If a parameter is not passed, it will reuse the one from the current request object. """ if self._read_bytes: raise RuntimeError("Cannot clone request " "after reading its content") dct = {} # type: Dict[str, Any] if method is not sentinel: dct["method"] = method if rel_url is not sentinel: new_url = URL(rel_url) dct["url"] = new_url dct["path"] = str(new_url) if headers is not sentinel: # a copy semantic dct["headers"] = CIMultiDictProxy(CIMultiDict(headers)) dct["raw_headers"] = tuple( (k.encode("utf-8"), v.encode("utf-8")) for k, v in headers.items() ) message = self._message._replace(**dct) kwargs = {} if scheme is not sentinel: kwargs["scheme"] = scheme if host is not sentinel: kwargs["host"] = host if remote is not sentinel: kwargs["remote"] = remote return self.__class__( message, self._payload, self._protocol, self._payload_writer, self._task, self._loop, client_max_size=self._client_max_size, state=self._state.copy(), **kwargs, ) @property def task(self) -> "asyncio.Task[None]": return self._task @property def protocol(self) -> "RequestHandler": return self._protocol @property def transport(self) -> Optional[asyncio.Transport]: if self._protocol is None: return None return self._protocol.transport @property def writer(self) -> AbstractStreamWriter: return self._payload_writer @reify def message(self) -> RawRequestMessage: warnings.warn("Request.message is deprecated", DeprecationWarning, stacklevel=3) return self._message @reify def rel_url(self) -> URL: return self._rel_url @reify def loop(self) -> asyncio.AbstractEventLoop: warnings.warn( "request.loop property is deprecated", DeprecationWarning, stacklevel=2 ) return self._loop # MutableMapping API def __getitem__(self, key: str) -> Any: return self._state[key] def __setitem__(self, key: str, value: Any) -> None: self._state[key] = value def __delitem__(self, key: str) -> None: del self._state[key] def __len__(self) -> int: return len(self._state) def __iter__(self) -> Iterator[str]: return iter(self._state) ######## @reify def secure(self) -> bool: """A bool indicating if the request is handled with SSL.""" return self.scheme == "https" @reify def forwarded(self) -> Tuple[Mapping[str, str], ...]: """A tuple containing all parsed Forwarded header(s). Makes an effort to parse Forwarded headers as specified by RFC 7239: - It adds one (immutable) dictionary per Forwarded 'field-value', ie per proxy. The element corresponds to the data in the Forwarded field-value added by the first proxy encountered by the client. Each subsequent item corresponds to those added by later proxies. - It checks that every value has valid syntax in general as specified in section 4: either a 'token' or a 'quoted-string'. - It un-escapes found escape sequences. - It does NOT validate 'by' and 'for' contents as specified in section 6. - It does NOT validate 'host' contents (Host ABNF). - It does NOT validate 'proto' contents for valid URI scheme names. Returns a tuple containing one or more immutable dicts """ elems = [] for field_value in self._message.headers.getall(hdrs.FORWARDED, ()): length = len(field_value) pos = 0 need_separator = False elem = {} # type: Dict[str, str] elems.append(types.MappingProxyType(elem)) while 0 <= pos < length: match = _FORWARDED_PAIR_RE.match(field_value, pos) if match is not None: # got a valid forwarded-pair if need_separator: # bad syntax here, skip to next comma pos = field_value.find(",", pos) else: name, value, port = match.groups() if value[0] == '"': # quoted string: remove quotes and unescape value = _QUOTED_PAIR_REPLACE_RE.sub(r"\1", value[1:-1]) if port: value += port elem[name.lower()] = value pos += len(match.group(0)) need_separator = True elif field_value[pos] == ",": # next forwarded-element need_separator = False elem = {} elems.append(types.MappingProxyType(elem)) pos += 1 elif field_value[pos] == ";": # next forwarded-pair need_separator = False pos += 1 elif field_value[pos] in " \t": # Allow whitespace even between forwarded-pairs, though # RFC 7239 doesn't. This simplifies code and is in line # with Postel's law. pos += 1 else: # bad syntax here, skip to next comma pos = field_value.find(",", pos) return tuple(elems) @reify def scheme(self) -> str: """A string representing the scheme of the request. Hostname is resolved in this order: - overridden value by .clone(scheme=new_scheme) call. - type of connection to peer: HTTPS if socket is SSL, HTTP otherwise. 'http' or 'https'. """ if self._transport_sslcontext: return "https" else: return "http" @reify def method(self) -> str: """Read only property for getting HTTP method. The value is upper-cased str like 'GET', 'POST', 'PUT' etc. """ return self._method @reify def version(self) -> HttpVersion: """Read only property for getting HTTP version of request. Returns aiohttp.protocol.HttpVersion instance. """ return self._version @reify def host(self) -> str: """Hostname of the request. Hostname is resolved in this order: - overridden value by .clone(host=new_host) call. - HOST HTTP header - socket.getfqdn() value """ host = self._message.headers.get(hdrs.HOST) if host is not None: return host return socket.getfqdn() @reify def remote(self) -> Optional[str]: """Remote IP of client initiated HTTP request. The IP is resolved in this order: - overridden value by .clone(remote=new_remote) call. - peername of opened socket """ if self._transport_peername is None: return None if isinstance(self._transport_peername, (list, tuple)): return str(self._transport_peername[0]) return str(self._transport_peername) @reify def url(self) -> URL: url = URL.build(scheme=self.scheme, host=self.host) return url.join(self._rel_url) @reify def path(self) -> str: """The URL including *PATH INFO* without the host or scheme. E.g., ``/app/blog`` """ return self._rel_url.path @reify def path_qs(self) -> str: """The URL including PATH_INFO and the query string. E.g, /app/blog?id=10 """ return str(self._rel_url) @reify def raw_path(self) -> str: """The URL including raw *PATH INFO* without the host or scheme. Warning, the path is unquoted and may contains non valid URL characters E.g., ``/my%2Fpath%7Cwith%21some%25strange%24characters`` """ return self._message.path @reify def query(self) -> "MultiDictProxy[str]": """A multidict with all the variables in the query string.""" return MultiDictProxy(self._rel_url.query) @reify def query_string(self) -> str: """The query string in the URL. E.g., id=10 """ return self._rel_url.query_string @reify def headers(self) -> "CIMultiDictProxy[str]": """A case-insensitive multidict proxy with all headers.""" return self._headers @reify def raw_headers(self) -> RawHeaders: """A sequence of pairs for all headers.""" return self._message.raw_headers @reify def if_modified_since(self) -> Optional[datetime.datetime]: """The value of If-Modified-Since HTTP header, or None. This header is represented as a `datetime` object. """ return parse_http_date(self.headers.get(hdrs.IF_MODIFIED_SINCE)) @reify def if_unmodified_since(self) -> Optional[datetime.datetime]: """The value of If-Unmodified-Since HTTP header, or None. This header is represented as a `datetime` object. """ return parse_http_date(self.headers.get(hdrs.IF_UNMODIFIED_SINCE)) @staticmethod def _etag_values(etag_header: str) -> Iterator[ETag]: """Extract `ETag` objects from raw header.""" if etag_header == ETAG_ANY: yield ETag( is_weak=False, value=ETAG_ANY, ) else: for match in LIST_QUOTED_ETAG_RE.finditer(etag_header): is_weak, value, garbage = match.group(2, 3, 4) # Any symbol captured by 4th group means # that the following sequence is invalid. if garbage: break yield ETag( is_weak=bool(is_weak), value=value, ) @classmethod def _if_match_or_none_impl( cls, header_value: Optional[str] ) -> Optional[Tuple[ETag, ...]]: if not header_value: return None return tuple(cls._etag_values(header_value)) @reify def if_match(self) -> Optional[Tuple[ETag, ...]]: """The value of If-Match HTTP header, or None. This header is represented as a `tuple` of `ETag` objects. """ return self._if_match_or_none_impl(self.headers.get(hdrs.IF_MATCH)) @reify def if_none_match(self) -> Optional[Tuple[ETag, ...]]: """The value of If-None-Match HTTP header, or None. This header is represented as a `tuple` of `ETag` objects. """ return self._if_match_or_none_impl(self.headers.get(hdrs.IF_NONE_MATCH)) @reify def if_range(self) -> Optional[datetime.datetime]: """The value of If-Range HTTP header, or None. This header is represented as a `datetime` object. """ return parse_http_date(self.headers.get(hdrs.IF_RANGE)) @reify def keep_alive(self) -> bool: """Is keepalive enabled by client?""" return not self._message.should_close @reify def cookies(self) -> Mapping[str, str]: """Return request cookies. A read-only dictionary-like object. """ raw = self.headers.get(hdrs.COOKIE, "") parsed = SimpleCookie(raw) # type: SimpleCookie[str] return MappingProxyType({key: val.value for key, val in parsed.items()}) @reify def http_range(self) -> slice: """The content of Range HTTP header. Return a slice instance. """ rng = self._headers.get(hdrs.RANGE) start, end = None, None if rng is not None: try: pattern = r"^bytes=(\d*)-(\d*)$" start, end = re.findall(pattern, rng)[0] except IndexError: # pattern was not found in header raise ValueError("range not in acceptable format") end = int(end) if end else None start = int(start) if start else None if start is None and end is not None: # end with no start is to return tail of content start = -end end = None if start is not None and end is not None: # end is inclusive in range header, exclusive for slice end += 1 if start >= end: raise ValueError("start cannot be after end") if start is end is None: # No valid range supplied raise ValueError("No start or end of range specified") return slice(start, end, 1) @reify def content(self) -> StreamReader: """Return raw payload stream.""" return self._payload @property def has_body(self) -> bool: """Return True if request's HTTP BODY can be read, False otherwise.""" warnings.warn( "Deprecated, use .can_read_body #2005", DeprecationWarning, stacklevel=2 ) return not self._payload.at_eof() @property def can_read_body(self) -> bool: """Return True if request's HTTP BODY can be read, False otherwise.""" return not self._payload.at_eof() @reify def body_exists(self) -> bool: """Return True if request has HTTP BODY, False otherwise.""" return type(self._payload) is not EmptyStreamReader async def release(self) -> None: """Release request. Eat unread part of HTTP BODY if present. """ while not self._payload.at_eof(): await self._payload.readany() async def read(self) -> bytes: """Read request body if present. Returns bytes object with full request content. """ if self._read_bytes is None: body = bytearray() while True: chunk = await self._payload.readany() body.extend(chunk) if self._client_max_size: body_size = len(body) if body_size >= self._client_max_size: raise HTTPRequestEntityTooLarge( max_size=self._client_max_size, actual_size=body_size ) if not chunk: break self._read_bytes = bytes(body) return self._read_bytes async def text(self) -> str: """Return BODY as text using encoding from .charset.""" bytes_body = await self.read() encoding = self.charset or "utf-8" return bytes_body.decode(encoding) async def json(self, *, loads: JSONDecoder = DEFAULT_JSON_DECODER) -> Any: """Return BODY as JSON.""" body = await self.text() return loads(body) async def multipart(self) -> MultipartReader: """Return async iterator to process BODY as multipart.""" return MultipartReader(self._headers, self._payload) async def post(self) -> "MultiDictProxy[Union[str, bytes, FileField]]": """Return POST parameters.""" if self._post is not None: return self._post if self._method not in self.POST_METHODS: self._post = MultiDictProxy(MultiDict()) return self._post content_type = self.content_type if content_type not in ( "", "application/x-www-form-urlencoded", "multipart/form-data", ): self._post = MultiDictProxy(MultiDict()) return self._post out = MultiDict() # type: MultiDict[Union[str, bytes, FileField]] if content_type == "multipart/form-data": multipart = await self.multipart() max_size = self._client_max_size field = await multipart.next() while field is not None: size = 0 field_ct = field.headers.get(hdrs.CONTENT_TYPE) if isinstance(field, BodyPartReader): assert field.name is not None # Note that according to RFC 7578, the Content-Type header # is optional, even for files, so we can't assume it's # present. # https://tools.ietf.org/html/rfc7578#section-4.4 if field.filename: # store file in temp file tmp = tempfile.TemporaryFile() chunk = await field.read_chunk(size=2 ** 16) while chunk: chunk = field.decode(chunk) tmp.write(chunk) size += len(chunk) if 0 < max_size < size: tmp.close() raise HTTPRequestEntityTooLarge( max_size=max_size, actual_size=size ) chunk = await field.read_chunk(size=2 ** 16) tmp.seek(0) if field_ct is None: field_ct = "application/octet-stream" ff = FileField( field.name, field.filename, cast(io.BufferedReader, tmp), field_ct, field.headers, ) out.add(field.name, ff) else: # deal with ordinary data value = await field.read(decode=True) if field_ct is None or field_ct.startswith("text/"): charset = field.get_charset(default="utf-8") out.add(field.name, value.decode(charset)) else: out.add(field.name, value) size += len(value) if 0 < max_size < size: raise HTTPRequestEntityTooLarge( max_size=max_size, actual_size=size ) else: raise ValueError( "To decode nested multipart you need " "to use custom reader", ) field = await multipart.next() else: data = await self.read() if data: charset = self.charset or "utf-8" out.extend( parse_qsl( data.rstrip().decode(charset), keep_blank_values=True, encoding=charset, ) ) self._post = MultiDictProxy(out) return self._post def get_extra_info(self, name: str, default: Any = None) -> Any: """Extra info from protocol transport""" protocol = self._protocol if protocol is None: return default transport = protocol.transport if transport is None: return default return transport.get_extra_info(name, default) def __repr__(self) -> str: ascii_encodable_path = self.path.encode("ascii", "backslashreplace").decode( "ascii" ) return "<{} {} {} >".format( self.__class__.__name__, self._method, ascii_encodable_path ) def __eq__(self, other: object) -> bool: return id(self) == id(other) def __bool__(self) -> bool: return True async def _prepare_hook(self, response: StreamResponse) -> None: return def _cancel(self, exc: BaseException) -> None: self._payload.set_exception(exc) class Request(BaseRequest): ATTRS = BaseRequest.ATTRS | frozenset(["_match_info"]) def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) # matchdict, route_name, handler # or information about traversal lookup # initialized after route resolving self._match_info = None # type: Optional[UrlMappingMatchInfo] if DEBUG: def __setattr__(self, name: str, val: Any) -> None: if name not in self.ATTRS: warnings.warn( "Setting custom {}.{} attribute " "is discouraged".format(self.__class__.__name__, name), DeprecationWarning, stacklevel=2, ) super().__setattr__(name, val) def clone( self, *, method: str = sentinel, rel_url: StrOrURL = sentinel, headers: LooseHeaders = sentinel, scheme: str = sentinel, host: str = sentinel, remote: str = sentinel, ) -> "Request": ret = super().clone( method=method, rel_url=rel_url, headers=headers, scheme=scheme, host=host, remote=remote, ) new_ret = cast(Request, ret) new_ret._match_info = self._match_info return new_ret @reify def match_info(self) -> "UrlMappingMatchInfo": """Result of route resolving.""" match_info = self._match_info assert match_info is not None return match_info @property def app(self) -> "Application": """Application instance.""" match_info = self._match_info assert match_info is not None return match_info.current_app @property def config_dict(self) -> ChainMapProxy: match_info = self._match_info assert match_info is not None lst = match_info.apps app = self.app idx = lst.index(app) sublist = list(reversed(lst[: idx + 1])) return ChainMapProxy(sublist) async def _prepare_hook(self, response: StreamResponse) -> None: match_info = self._match_info if match_info is None: return for app in match_info._apps: await app.on_response_prepare.send(self, response) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_response.py0000644000175100001710000006565700000000000017273 0ustar00runnerdockerimport asyncio import collections.abc import datetime import enum import json import math import time import warnings import zlib from concurrent.futures import Executor from http.cookies import Morsel, SimpleCookie from typing import ( TYPE_CHECKING, Any, Dict, Iterator, Mapping, MutableMapping, Optional, Tuple, Union, cast, ) from multidict import CIMultiDict, istr from . import hdrs, payload from .abc import AbstractStreamWriter from .helpers import ( ETAG_ANY, PY_38, QUOTED_ETAG_RE, ETag, HeadersMixin, parse_http_date, rfc822_formatted_time, sentinel, validate_etag_value, ) from .http import RESPONSES, SERVER_SOFTWARE, HttpVersion10, HttpVersion11 from .payload import Payload from .typedefs import JSONEncoder, LooseHeaders __all__ = ("ContentCoding", "StreamResponse", "Response", "json_response") if TYPE_CHECKING: # pragma: no cover from .web_request import BaseRequest BaseClass = MutableMapping[str, Any] else: BaseClass = collections.abc.MutableMapping if not PY_38: # allow samesite to be used in python < 3.8 # already permitted in python 3.8, see https://bugs.python.org/issue29613 Morsel._reserved["samesite"] = "SameSite" # type: ignore[attr-defined] class ContentCoding(enum.Enum): # The content codings that we have support for. # # Additional registered codings are listed at: # https://www.iana.org/assignments/http-parameters/http-parameters.xhtml#content-coding deflate = "deflate" gzip = "gzip" identity = "identity" ############################################################ # HTTP Response classes ############################################################ class StreamResponse(BaseClass, HeadersMixin): _length_check = True def __init__( self, *, status: int = 200, reason: Optional[str] = None, headers: Optional[LooseHeaders] = None, ) -> None: self._body = None self._keep_alive = None # type: Optional[bool] self._chunked = False self._compression = False self._compression_force = None # type: Optional[ContentCoding] self._cookies = SimpleCookie() # type: SimpleCookie[str] self._req = None # type: Optional[BaseRequest] self._payload_writer = None # type: Optional[AbstractStreamWriter] self._eof_sent = False self._body_length = 0 self._state = {} # type: Dict[str, Any] if headers is not None: self._headers = CIMultiDict(headers) # type: CIMultiDict[str] else: self._headers = CIMultiDict() self.set_status(status, reason) @property def prepared(self) -> bool: return self._payload_writer is not None @property def task(self) -> "Optional[asyncio.Task[None]]": if self._req: return self._req.task else: return None @property def status(self) -> int: return self._status @property def chunked(self) -> bool: return self._chunked @property def compression(self) -> bool: return self._compression @property def reason(self) -> str: return self._reason def set_status( self, status: int, reason: Optional[str] = None, _RESPONSES: Mapping[int, Tuple[str, str]] = RESPONSES, ) -> None: assert not self.prepared, ( "Cannot change the response status code after " "the headers have been sent" ) self._status = int(status) if reason is None: try: reason = _RESPONSES[self._status][0] except Exception: reason = "" self._reason = reason @property def keep_alive(self) -> Optional[bool]: return self._keep_alive def force_close(self) -> None: self._keep_alive = False @property def body_length(self) -> int: return self._body_length @property def output_length(self) -> int: warnings.warn("output_length is deprecated", DeprecationWarning) assert self._payload_writer return self._payload_writer.buffer_size def enable_chunked_encoding(self, chunk_size: Optional[int] = None) -> None: """Enables automatic chunked transfer encoding.""" self._chunked = True if hdrs.CONTENT_LENGTH in self._headers: raise RuntimeError( "You can't enable chunked encoding when " "a content length is set" ) if chunk_size is not None: warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) def enable_compression( self, force: Optional[Union[bool, ContentCoding]] = None ) -> None: """Enables response compression encoding.""" # Backwards compatibility for when force was a bool <0.17. if type(force) == bool: force = ContentCoding.deflate if force else ContentCoding.identity warnings.warn( "Using boolean for force is deprecated #3318", DeprecationWarning ) elif force is not None: assert isinstance(force, ContentCoding), ( "force should one of " "None, bool or " "ContentEncoding" ) self._compression = True self._compression_force = force @property def headers(self) -> "CIMultiDict[str]": return self._headers @property def cookies(self) -> "SimpleCookie[str]": return self._cookies def set_cookie( self, name: str, value: str, *, expires: Optional[str] = None, domain: Optional[str] = None, max_age: Optional[Union[int, str]] = None, path: str = "/", secure: Optional[bool] = None, httponly: Optional[bool] = None, version: Optional[str] = None, samesite: Optional[str] = None, ) -> None: """Set or update response cookie. Sets new cookie or updates existent with new value. Also updates only those params which are not None. """ old = self._cookies.get(name) if old is not None and old.coded_value == "": # deleted cookie self._cookies.pop(name, None) self._cookies[name] = value c = self._cookies[name] if expires is not None: c["expires"] = expires elif c.get("expires") == "Thu, 01 Jan 1970 00:00:00 GMT": del c["expires"] if domain is not None: c["domain"] = domain if max_age is not None: c["max-age"] = str(max_age) elif "max-age" in c: del c["max-age"] c["path"] = path if secure is not None: c["secure"] = secure if httponly is not None: c["httponly"] = httponly if version is not None: c["version"] = version if samesite is not None: c["samesite"] = samesite def del_cookie( self, name: str, *, domain: Optional[str] = None, path: str = "/" ) -> None: """Delete cookie. Creates new empty expired cookie. """ # TODO: do we need domain/path here? self._cookies.pop(name, None) self.set_cookie( name, "", max_age=0, expires="Thu, 01 Jan 1970 00:00:00 GMT", domain=domain, path=path, ) @property def content_length(self) -> Optional[int]: # Just a placeholder for adding setter return super().content_length @content_length.setter def content_length(self, value: Optional[int]) -> None: if value is not None: value = int(value) if self._chunked: raise RuntimeError( "You can't set content length when " "chunked encoding is enable" ) self._headers[hdrs.CONTENT_LENGTH] = str(value) else: self._headers.pop(hdrs.CONTENT_LENGTH, None) @property def content_type(self) -> str: # Just a placeholder for adding setter return super().content_type @content_type.setter def content_type(self, value: str) -> None: self.content_type # read header values if needed self._content_type = str(value) self._generate_content_type_header() @property def charset(self) -> Optional[str]: # Just a placeholder for adding setter return super().charset @charset.setter def charset(self, value: Optional[str]) -> None: ctype = self.content_type # read header values if needed if ctype == "application/octet-stream": raise RuntimeError( "Setting charset for application/octet-stream " "doesn't make sense, setup content_type first" ) assert self._content_dict is not None if value is None: self._content_dict.pop("charset", None) else: self._content_dict["charset"] = str(value).lower() self._generate_content_type_header() @property def last_modified(self) -> Optional[datetime.datetime]: """The value of Last-Modified HTTP header, or None. This header is represented as a `datetime` object. """ return parse_http_date(self._headers.get(hdrs.LAST_MODIFIED)) @last_modified.setter def last_modified( self, value: Optional[Union[int, float, datetime.datetime, str]] ) -> None: if value is None: self._headers.pop(hdrs.LAST_MODIFIED, None) elif isinstance(value, (int, float)): self._headers[hdrs.LAST_MODIFIED] = time.strftime( "%a, %d %b %Y %H:%M:%S GMT", time.gmtime(math.ceil(value)) ) elif isinstance(value, datetime.datetime): self._headers[hdrs.LAST_MODIFIED] = time.strftime( "%a, %d %b %Y %H:%M:%S GMT", value.utctimetuple() ) elif isinstance(value, str): self._headers[hdrs.LAST_MODIFIED] = value @property def etag(self) -> Optional[ETag]: quoted_value = self._headers.get(hdrs.ETAG) if not quoted_value: return None elif quoted_value == ETAG_ANY: return ETag(value=ETAG_ANY) match = QUOTED_ETAG_RE.fullmatch(quoted_value) if not match: return None is_weak, value = match.group(1, 2) return ETag( is_weak=bool(is_weak), value=value, ) @etag.setter def etag(self, value: Optional[Union[ETag, str]]) -> None: if value is None: self._headers.pop(hdrs.ETAG, None) elif (isinstance(value, str) and value == ETAG_ANY) or ( isinstance(value, ETag) and value.value == ETAG_ANY ): self._headers[hdrs.ETAG] = ETAG_ANY elif isinstance(value, str): validate_etag_value(value) self._headers[hdrs.ETAG] = f'"{value}"' elif isinstance(value, ETag) and isinstance(value.value, str): validate_etag_value(value.value) hdr_value = f'W/"{value.value}"' if value.is_weak else f'"{value.value}"' self._headers[hdrs.ETAG] = hdr_value else: raise ValueError( f"Unsupported etag type: {type(value)}. " f"etag must be str, ETag or None" ) def _generate_content_type_header( self, CONTENT_TYPE: istr = hdrs.CONTENT_TYPE ) -> None: assert self._content_dict is not None assert self._content_type is not None params = "; ".join(f"{k}={v}" for k, v in self._content_dict.items()) if params: ctype = self._content_type + "; " + params else: ctype = self._content_type self._headers[CONTENT_TYPE] = ctype async def _do_start_compression(self, coding: ContentCoding) -> None: if coding != ContentCoding.identity: assert self._payload_writer is not None self._headers[hdrs.CONTENT_ENCODING] = coding.value self._payload_writer.enable_compression(coding.value) # Compressed payload may have different content length, # remove the header self._headers.popall(hdrs.CONTENT_LENGTH, None) async def _start_compression(self, request: "BaseRequest") -> None: if self._compression_force: await self._do_start_compression(self._compression_force) else: accept_encoding = request.headers.get(hdrs.ACCEPT_ENCODING, "").lower() for coding in ContentCoding: if coding.value in accept_encoding: await self._do_start_compression(coding) return async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: if self._eof_sent: return None if self._payload_writer is not None: return self._payload_writer return await self._start(request) async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: self._req = request writer = self._payload_writer = request._payload_writer await self._prepare_headers() await request._prepare_hook(self) await self._write_headers() return writer async def _prepare_headers(self) -> None: request = self._req assert request is not None writer = self._payload_writer assert writer is not None keep_alive = self._keep_alive if keep_alive is None: keep_alive = request.keep_alive self._keep_alive = keep_alive version = request.version headers = self._headers for cookie in self._cookies.values(): value = cookie.output(header="")[1:] headers.add(hdrs.SET_COOKIE, value) if self._compression: await self._start_compression(request) if self._chunked: if version != HttpVersion11: raise RuntimeError( "Using chunked encoding is forbidden " "for HTTP/{0.major}.{0.minor}".format(request.version) ) writer.enable_chunking() headers[hdrs.TRANSFER_ENCODING] = "chunked" if hdrs.CONTENT_LENGTH in headers: del headers[hdrs.CONTENT_LENGTH] elif self._length_check: writer.length = self.content_length if writer.length is None: if version >= HttpVersion11 and self.status != 204: writer.enable_chunking() headers[hdrs.TRANSFER_ENCODING] = "chunked" if hdrs.CONTENT_LENGTH in headers: del headers[hdrs.CONTENT_LENGTH] else: keep_alive = False # HTTP 1.1: https://tools.ietf.org/html/rfc7230#section-3.3.2 # HTTP 1.0: https://tools.ietf.org/html/rfc1945#section-10.4 elif version >= HttpVersion11 and self.status in (100, 101, 102, 103, 204): del headers[hdrs.CONTENT_LENGTH] if self.status not in (204, 304): headers.setdefault(hdrs.CONTENT_TYPE, "application/octet-stream") headers.setdefault(hdrs.DATE, rfc822_formatted_time()) headers.setdefault(hdrs.SERVER, SERVER_SOFTWARE) # connection header if hdrs.CONNECTION not in headers: if keep_alive: if version == HttpVersion10: headers[hdrs.CONNECTION] = "keep-alive" else: if version == HttpVersion11: headers[hdrs.CONNECTION] = "close" async def _write_headers(self) -> None: request = self._req assert request is not None writer = self._payload_writer assert writer is not None # status line version = request.version status_line = "HTTP/{}.{} {} {}".format( version[0], version[1], self._status, self._reason ) await writer.write_headers(status_line, self._headers) async def write(self, data: bytes) -> None: assert isinstance( data, (bytes, bytearray, memoryview) ), "data argument must be byte-ish (%r)" % type(data) if self._eof_sent: raise RuntimeError("Cannot call write() after write_eof()") if self._payload_writer is None: raise RuntimeError("Cannot call write() before prepare()") await self._payload_writer.write(data) async def drain(self) -> None: assert not self._eof_sent, "EOF has already been sent" assert self._payload_writer is not None, "Response has not been started" warnings.warn( "drain method is deprecated, use await resp.write()", DeprecationWarning, stacklevel=2, ) await self._payload_writer.drain() async def write_eof(self, data: bytes = b"") -> None: assert isinstance( data, (bytes, bytearray, memoryview) ), "data argument must be byte-ish (%r)" % type(data) if self._eof_sent: return assert self._payload_writer is not None, "Response has not been started" await self._payload_writer.write_eof(data) self._eof_sent = True self._req = None self._body_length = self._payload_writer.output_size self._payload_writer = None def __repr__(self) -> str: if self._eof_sent: info = "eof" elif self.prepared: assert self._req is not None info = f"{self._req.method} {self._req.path} " else: info = "not prepared" return f"<{self.__class__.__name__} {self.reason} {info}>" def __getitem__(self, key: str) -> Any: return self._state[key] def __setitem__(self, key: str, value: Any) -> None: self._state[key] = value def __delitem__(self, key: str) -> None: del self._state[key] def __len__(self) -> int: return len(self._state) def __iter__(self) -> Iterator[str]: return iter(self._state) def __hash__(self) -> int: return hash(id(self)) def __eq__(self, other: object) -> bool: return self is other class Response(StreamResponse): def __init__( self, *, body: Any = None, status: int = 200, reason: Optional[str] = None, text: Optional[str] = None, headers: Optional[LooseHeaders] = None, content_type: Optional[str] = None, charset: Optional[str] = None, zlib_executor_size: Optional[int] = None, zlib_executor: Optional[Executor] = None, ) -> None: if body is not None and text is not None: raise ValueError("body and text are not allowed together") if headers is None: real_headers = CIMultiDict() # type: CIMultiDict[str] elif not isinstance(headers, CIMultiDict): real_headers = CIMultiDict(headers) else: real_headers = headers # = cast('CIMultiDict[str]', headers) if content_type is not None and "charset" in content_type: raise ValueError("charset must not be in content_type " "argument") if text is not None: if hdrs.CONTENT_TYPE in real_headers: if content_type or charset: raise ValueError( "passing both Content-Type header and " "content_type or charset params " "is forbidden" ) else: # fast path for filling headers if not isinstance(text, str): raise TypeError("text argument must be str (%r)" % type(text)) if content_type is None: content_type = "text/plain" if charset is None: charset = "utf-8" real_headers[hdrs.CONTENT_TYPE] = content_type + "; charset=" + charset body = text.encode(charset) text = None else: if hdrs.CONTENT_TYPE in real_headers: if content_type is not None or charset is not None: raise ValueError( "passing both Content-Type header and " "content_type or charset params " "is forbidden" ) else: if content_type is not None: if charset is not None: content_type += "; charset=" + charset real_headers[hdrs.CONTENT_TYPE] = content_type super().__init__(status=status, reason=reason, headers=real_headers) if text is not None: self.text = text else: self.body = body self._compressed_body = None # type: Optional[bytes] self._zlib_executor_size = zlib_executor_size self._zlib_executor = zlib_executor @property def body(self) -> Optional[Union[bytes, Payload]]: return self._body @body.setter def body( self, body: bytes, CONTENT_TYPE: istr = hdrs.CONTENT_TYPE, CONTENT_LENGTH: istr = hdrs.CONTENT_LENGTH, ) -> None: if body is None: self._body = None # type: Optional[bytes] self._body_payload = False # type: bool elif isinstance(body, (bytes, bytearray)): self._body = body self._body_payload = False else: try: self._body = body = payload.PAYLOAD_REGISTRY.get(body) except payload.LookupError: raise ValueError("Unsupported body type %r" % type(body)) self._body_payload = True headers = self._headers # set content-length header if needed if not self._chunked and CONTENT_LENGTH not in headers: size = body.size if size is not None: headers[CONTENT_LENGTH] = str(size) # set content-type if CONTENT_TYPE not in headers: headers[CONTENT_TYPE] = body.content_type # copy payload headers if body.headers: for (key, value) in body.headers.items(): if key not in headers: headers[key] = value self._compressed_body = None @property def text(self) -> Optional[str]: if self._body is None: return None return self._body.decode(self.charset or "utf-8") @text.setter def text(self, text: str) -> None: assert text is None or isinstance( text, str ), "text argument must be str (%r)" % type(text) if self.content_type == "application/octet-stream": self.content_type = "text/plain" if self.charset is None: self.charset = "utf-8" self._body = text.encode(self.charset) self._body_payload = False self._compressed_body = None @property def content_length(self) -> Optional[int]: if self._chunked: return None if hdrs.CONTENT_LENGTH in self._headers: return super().content_length if self._compressed_body is not None: # Return length of the compressed body return len(self._compressed_body) elif self._body_payload: # A payload without content length, or a compressed payload return None elif self._body is not None: return len(self._body) else: return 0 @content_length.setter def content_length(self, value: Optional[int]) -> None: raise RuntimeError("Content length is set automatically") async def write_eof(self, data: bytes = b"") -> None: if self._eof_sent: return if self._compressed_body is None: body = self._body # type: Optional[Union[bytes, Payload]] else: body = self._compressed_body assert not data, f"data arg is not supported, got {data!r}" assert self._req is not None assert self._payload_writer is not None if body is not None: if self._req._method == hdrs.METH_HEAD or self._status in [204, 304]: await super().write_eof() elif self._body_payload: payload = cast(Payload, body) await payload.write(self._payload_writer) await super().write_eof() else: await super().write_eof(cast(bytes, body)) else: await super().write_eof() async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: if not self._chunked and hdrs.CONTENT_LENGTH not in self._headers: if not self._body_payload: if self._body is not None: self._headers[hdrs.CONTENT_LENGTH] = str(len(self._body)) else: self._headers[hdrs.CONTENT_LENGTH] = "0" return await super()._start(request) def _compress_body(self, zlib_mode: int) -> None: assert zlib_mode > 0 compressobj = zlib.compressobj(wbits=zlib_mode) body_in = self._body assert body_in is not None self._compressed_body = compressobj.compress(body_in) + compressobj.flush() async def _do_start_compression(self, coding: ContentCoding) -> None: if self._body_payload or self._chunked: return await super()._do_start_compression(coding) if coding != ContentCoding.identity: # Instead of using _payload_writer.enable_compression, # compress the whole body zlib_mode = ( 16 + zlib.MAX_WBITS if coding == ContentCoding.gzip else zlib.MAX_WBITS ) body_in = self._body assert body_in is not None if ( self._zlib_executor_size is not None and len(body_in) > self._zlib_executor_size ): await asyncio.get_event_loop().run_in_executor( self._zlib_executor, self._compress_body, zlib_mode ) else: self._compress_body(zlib_mode) body_out = self._compressed_body assert body_out is not None self._headers[hdrs.CONTENT_ENCODING] = coding.value self._headers[hdrs.CONTENT_LENGTH] = str(len(body_out)) def json_response( data: Any = sentinel, *, text: Optional[str] = None, body: Optional[bytes] = None, status: int = 200, reason: Optional[str] = None, headers: Optional[LooseHeaders] = None, content_type: str = "application/json", dumps: JSONEncoder = json.dumps, ) -> Response: if data is not sentinel: if text or body: raise ValueError("only one of data, text, or body should be specified") else: text = dumps(data) return Response( text=text, body=body, status=status, reason=reason, headers=headers, content_type=content_type, ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_routedef.py0000644000175100001710000001363000000000000017232 0ustar00runnerdockerimport abc import os # noqa from typing import ( TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Sequence, Type, Union, overload, ) import attr from . import hdrs from .abc import AbstractView from .typedefs import Handler, PathLike if TYPE_CHECKING: # pragma: no cover from .web_request import Request from .web_response import StreamResponse from .web_urldispatcher import AbstractRoute, UrlDispatcher else: Request = StreamResponse = UrlDispatcher = AbstractRoute = None __all__ = ( "AbstractRouteDef", "RouteDef", "StaticDef", "RouteTableDef", "head", "options", "get", "post", "patch", "put", "delete", "route", "view", "static", ) class AbstractRouteDef(abc.ABC): @abc.abstractmethod def register(self, router: UrlDispatcher) -> List[AbstractRoute]: pass # pragma: no cover _HandlerType = Union[Type[AbstractView], Handler] @attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) class RouteDef(AbstractRouteDef): method: str path: str handler: _HandlerType kwargs: Dict[str, Any] def __repr__(self) -> str: info = [] for name, value in sorted(self.kwargs.items()): info.append(f", {name}={value!r}") return " {handler.__name__!r}" "{info}>".format( method=self.method, path=self.path, handler=self.handler, info="".join(info) ) def register(self, router: UrlDispatcher) -> List[AbstractRoute]: if self.method in hdrs.METH_ALL: reg = getattr(router, "add_" + self.method.lower()) return [reg(self.path, self.handler, **self.kwargs)] else: return [ router.add_route(self.method, self.path, self.handler, **self.kwargs) ] @attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) class StaticDef(AbstractRouteDef): prefix: str path: PathLike kwargs: Dict[str, Any] def __repr__(self) -> str: info = [] for name, value in sorted(self.kwargs.items()): info.append(f", {name}={value!r}") return " {path}" "{info}>".format( prefix=self.prefix, path=self.path, info="".join(info) ) def register(self, router: UrlDispatcher) -> List[AbstractRoute]: resource = router.add_static(self.prefix, self.path, **self.kwargs) routes = resource.get_info().get("routes", {}) return list(routes.values()) def route(method: str, path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return RouteDef(method, path, handler, kwargs) def head(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_HEAD, path, handler, **kwargs) def options(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_OPTIONS, path, handler, **kwargs) def get( path: str, handler: _HandlerType, *, name: Optional[str] = None, allow_head: bool = True, **kwargs: Any, ) -> RouteDef: return route( hdrs.METH_GET, path, handler, name=name, allow_head=allow_head, **kwargs ) def post(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_POST, path, handler, **kwargs) def put(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_PUT, path, handler, **kwargs) def patch(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_PATCH, path, handler, **kwargs) def delete(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: return route(hdrs.METH_DELETE, path, handler, **kwargs) def view(path: str, handler: Type[AbstractView], **kwargs: Any) -> RouteDef: return route(hdrs.METH_ANY, path, handler, **kwargs) def static(prefix: str, path: PathLike, **kwargs: Any) -> StaticDef: return StaticDef(prefix, path, kwargs) _Deco = Callable[[_HandlerType], _HandlerType] class RouteTableDef(Sequence[AbstractRouteDef]): """Route definition table""" def __init__(self) -> None: self._items = [] # type: List[AbstractRouteDef] def __repr__(self) -> str: return f"" @overload def __getitem__(self, index: int) -> AbstractRouteDef: ... @overload def __getitem__(self, index: slice) -> List[AbstractRouteDef]: ... def __getitem__(self, index): # type: ignore[no-untyped-def] return self._items[index] def __iter__(self) -> Iterator[AbstractRouteDef]: return iter(self._items) def __len__(self) -> int: return len(self._items) def __contains__(self, item: object) -> bool: return item in self._items def route(self, method: str, path: str, **kwargs: Any) -> _Deco: def inner(handler: _HandlerType) -> _HandlerType: self._items.append(RouteDef(method, path, handler, kwargs)) return handler return inner def head(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_HEAD, path, **kwargs) def get(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_GET, path, **kwargs) def post(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_POST, path, **kwargs) def put(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_PUT, path, **kwargs) def patch(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_PATCH, path, **kwargs) def delete(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_DELETE, path, **kwargs) def view(self, path: str, **kwargs: Any) -> _Deco: return self.route(hdrs.METH_ANY, path, **kwargs) def static(self, prefix: str, path: PathLike, **kwargs: Any) -> None: self._items.append(StaticDef(prefix, path, kwargs)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_runner.py0000644000175100001710000002566500000000000016741 0ustar00runnerdockerimport asyncio import signal import socket from abc import ABC, abstractmethod from typing import Any, List, Optional, Set from yarl import URL from .web_app import Application from .web_server import Server try: from ssl import SSLContext except ImportError: SSLContext = object # type: ignore[misc,assignment] __all__ = ( "BaseSite", "TCPSite", "UnixSite", "NamedPipeSite", "SockSite", "BaseRunner", "AppRunner", "ServerRunner", "GracefulExit", ) class GracefulExit(SystemExit): code = 1 def _raise_graceful_exit() -> None: raise GracefulExit() class BaseSite(ABC): __slots__ = ("_runner", "_shutdown_timeout", "_ssl_context", "_backlog", "_server") def __init__( self, runner: "BaseRunner", *, shutdown_timeout: float = 60.0, ssl_context: Optional[SSLContext] = None, backlog: int = 128, ) -> None: if runner.server is None: raise RuntimeError("Call runner.setup() before making a site") self._runner = runner self._shutdown_timeout = shutdown_timeout self._ssl_context = ssl_context self._backlog = backlog self._server = None # type: Optional[asyncio.AbstractServer] @property @abstractmethod def name(self) -> str: pass # pragma: no cover @abstractmethod async def start(self) -> None: self._runner._reg_site(self) async def stop(self) -> None: self._runner._check_site(self) if self._server is None: self._runner._unreg_site(self) return # not started yet self._server.close() # named pipes do not have wait_closed property if hasattr(self._server, "wait_closed"): await self._server.wait_closed() await self._runner.shutdown() assert self._runner.server await self._runner.server.shutdown(self._shutdown_timeout) self._runner._unreg_site(self) class TCPSite(BaseSite): __slots__ = ("_host", "_port", "_reuse_address", "_reuse_port") def __init__( self, runner: "BaseRunner", host: Optional[str] = None, port: Optional[int] = None, *, shutdown_timeout: float = 60.0, ssl_context: Optional[SSLContext] = None, backlog: int = 128, reuse_address: Optional[bool] = None, reuse_port: Optional[bool] = None, ) -> None: super().__init__( runner, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, ) self._host = host if port is None: port = 8443 if self._ssl_context else 8080 self._port = port self._reuse_address = reuse_address self._reuse_port = reuse_port @property def name(self) -> str: scheme = "https" if self._ssl_context else "http" host = "0.0.0.0" if self._host is None else self._host return str(URL.build(scheme=scheme, host=host, port=self._port)) async def start(self) -> None: await super().start() loop = asyncio.get_event_loop() server = self._runner.server assert server is not None self._server = await loop.create_server( server, self._host, self._port, ssl=self._ssl_context, backlog=self._backlog, reuse_address=self._reuse_address, reuse_port=self._reuse_port, ) class UnixSite(BaseSite): __slots__ = ("_path",) def __init__( self, runner: "BaseRunner", path: str, *, shutdown_timeout: float = 60.0, ssl_context: Optional[SSLContext] = None, backlog: int = 128, ) -> None: super().__init__( runner, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, ) self._path = path @property def name(self) -> str: scheme = "https" if self._ssl_context else "http" return f"{scheme}://unix:{self._path}:" async def start(self) -> None: await super().start() loop = asyncio.get_event_loop() server = self._runner.server assert server is not None self._server = await loop.create_unix_server( server, self._path, ssl=self._ssl_context, backlog=self._backlog ) class NamedPipeSite(BaseSite): __slots__ = ("_path",) def __init__( self, runner: "BaseRunner", path: str, *, shutdown_timeout: float = 60.0 ) -> None: loop = asyncio.get_event_loop() if not isinstance( loop, asyncio.ProactorEventLoop # type: ignore[attr-defined] ): raise RuntimeError( "Named Pipes only available in proactor" "loop under windows" ) super().__init__(runner, shutdown_timeout=shutdown_timeout) self._path = path @property def name(self) -> str: return self._path async def start(self) -> None: await super().start() loop = asyncio.get_event_loop() server = self._runner.server assert server is not None _server = await loop.start_serving_pipe( # type: ignore[attr-defined] server, self._path ) self._server = _server[0] class SockSite(BaseSite): __slots__ = ("_sock", "_name") def __init__( self, runner: "BaseRunner", sock: socket.socket, *, shutdown_timeout: float = 60.0, ssl_context: Optional[SSLContext] = None, backlog: int = 128, ) -> None: super().__init__( runner, shutdown_timeout=shutdown_timeout, ssl_context=ssl_context, backlog=backlog, ) self._sock = sock scheme = "https" if self._ssl_context else "http" if hasattr(socket, "AF_UNIX") and sock.family == socket.AF_UNIX: name = f"{scheme}://unix:{sock.getsockname()}:" else: host, port = sock.getsockname()[:2] name = str(URL.build(scheme=scheme, host=host, port=port)) self._name = name @property def name(self) -> str: return self._name async def start(self) -> None: await super().start() loop = asyncio.get_event_loop() server = self._runner.server assert server is not None self._server = await loop.create_server( server, sock=self._sock, ssl=self._ssl_context, backlog=self._backlog ) class BaseRunner(ABC): __slots__ = ("_handle_signals", "_kwargs", "_server", "_sites") def __init__(self, *, handle_signals: bool = False, **kwargs: Any) -> None: self._handle_signals = handle_signals self._kwargs = kwargs self._server = None # type: Optional[Server] self._sites = [] # type: List[BaseSite] @property def server(self) -> Optional[Server]: return self._server @property def addresses(self) -> List[Any]: ret = [] # type: List[Any] for site in self._sites: server = site._server if server is not None: sockets = server.sockets if sockets is not None: for sock in sockets: ret.append(sock.getsockname()) return ret @property def sites(self) -> Set[BaseSite]: return set(self._sites) async def setup(self) -> None: loop = asyncio.get_event_loop() if self._handle_signals: try: loop.add_signal_handler(signal.SIGINT, _raise_graceful_exit) loop.add_signal_handler(signal.SIGTERM, _raise_graceful_exit) except NotImplementedError: # pragma: no cover # add_signal_handler is not implemented on Windows pass self._server = await self._make_server() @abstractmethod async def shutdown(self) -> None: pass # pragma: no cover async def cleanup(self) -> None: loop = asyncio.get_event_loop() # The loop over sites is intentional, an exception on gather() # leaves self._sites in unpredictable state. # The loop guaranties that a site is either deleted on success or # still present on failure for site in list(self._sites): await site.stop() await self._cleanup_server() self._server = None if self._handle_signals: try: loop.remove_signal_handler(signal.SIGINT) loop.remove_signal_handler(signal.SIGTERM) except NotImplementedError: # pragma: no cover # remove_signal_handler is not implemented on Windows pass @abstractmethod async def _make_server(self) -> Server: pass # pragma: no cover @abstractmethod async def _cleanup_server(self) -> None: pass # pragma: no cover def _reg_site(self, site: BaseSite) -> None: if site in self._sites: raise RuntimeError(f"Site {site} is already registered in runner {self}") self._sites.append(site) def _check_site(self, site: BaseSite) -> None: if site not in self._sites: raise RuntimeError(f"Site {site} is not registered in runner {self}") def _unreg_site(self, site: BaseSite) -> None: if site not in self._sites: raise RuntimeError(f"Site {site} is not registered in runner {self}") self._sites.remove(site) class ServerRunner(BaseRunner): """Low-level web server runner""" __slots__ = ("_web_server",) def __init__( self, web_server: Server, *, handle_signals: bool = False, **kwargs: Any ) -> None: super().__init__(handle_signals=handle_signals, **kwargs) self._web_server = web_server async def shutdown(self) -> None: pass async def _make_server(self) -> Server: return self._web_server async def _cleanup_server(self) -> None: pass class AppRunner(BaseRunner): """Web Application runner""" __slots__ = ("_app",) def __init__( self, app: Application, *, handle_signals: bool = False, **kwargs: Any ) -> None: super().__init__(handle_signals=handle_signals, **kwargs) if not isinstance(app, Application): raise TypeError( "The first argument should be web.Application " "instance, got {!r}".format(app) ) self._app = app @property def app(self) -> Application: return self._app async def shutdown(self) -> None: await self._app.shutdown() async def _make_server(self) -> Server: loop = asyncio.get_event_loop() self._app._set_loop(loop) self._app.on_startup.freeze() await self._app.startup() self._app.freeze() return self._app._make_handler(loop=loop, **self._kwargs) async def _cleanup_server(self) -> None: await self._app.cleanup() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_server.py0000644000175100001710000000401200000000000016715 0ustar00runnerdocker"""Low level HTTP server.""" import asyncio from typing import Any, Awaitable, Callable, Dict, List, Optional # noqa from .abc import AbstractStreamWriter from .helpers import get_running_loop from .http_parser import RawRequestMessage from .streams import StreamReader from .web_protocol import RequestHandler, _RequestFactory, _RequestHandler from .web_request import BaseRequest __all__ = ("Server",) class Server: def __init__( self, handler: _RequestHandler, *, request_factory: Optional[_RequestFactory] = None, loop: Optional[asyncio.AbstractEventLoop] = None, **kwargs: Any ) -> None: self._loop = get_running_loop(loop) self._connections = {} # type: Dict[RequestHandler, asyncio.Transport] self._kwargs = kwargs self.requests_count = 0 self.request_handler = handler self.request_factory = request_factory or self._make_request @property def connections(self) -> List[RequestHandler]: return list(self._connections.keys()) def connection_made( self, handler: RequestHandler, transport: asyncio.Transport ) -> None: self._connections[handler] = transport def connection_lost( self, handler: RequestHandler, exc: Optional[BaseException] = None ) -> None: if handler in self._connections: del self._connections[handler] def _make_request( self, message: RawRequestMessage, payload: StreamReader, protocol: RequestHandler, writer: AbstractStreamWriter, task: "asyncio.Task[None]", ) -> BaseRequest: return BaseRequest(message, payload, protocol, writer, task, self._loop) async def shutdown(self, timeout: Optional[float] = None) -> None: coros = [conn.shutdown(timeout) for conn in self._connections] await asyncio.gather(*coros) self._connections.clear() def __call__(self) -> RequestHandler: return RequestHandler(self, loop=self._loop, **self._kwargs) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_urldispatcher.py0000644000175100001710000011517300000000000020273 0ustar00runnerdockerimport abc import asyncio import base64 import hashlib import inspect import keyword import os import re import warnings from contextlib import contextmanager from functools import wraps from pathlib import Path from types import MappingProxyType from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, Container, Dict, Generator, Iterable, Iterator, List, Mapping, Optional, Pattern, Set, Sized, Tuple, Type, Union, cast, ) from yarl import URL, __version__ as yarl_version # type: ignore[attr-defined] from . import hdrs from .abc import AbstractMatchInfo, AbstractRouter, AbstractView from .helpers import DEBUG from .http import HttpVersion11 from .typedefs import Final, Handler, PathLike, TypedDict from .web_exceptions import ( HTTPException, HTTPExpectationFailed, HTTPForbidden, HTTPMethodNotAllowed, HTTPNotFound, ) from .web_fileresponse import FileResponse from .web_request import Request from .web_response import Response, StreamResponse from .web_routedef import AbstractRouteDef __all__ = ( "UrlDispatcher", "UrlMappingMatchInfo", "AbstractResource", "Resource", "PlainResource", "DynamicResource", "AbstractRoute", "ResourceRoute", "StaticResource", "View", ) if TYPE_CHECKING: # pragma: no cover from .web_app import Application BaseDict = Dict[str, str] else: BaseDict = dict YARL_VERSION: Final[Tuple[int, ...]] = tuple(map(int, yarl_version.split(".")[:2])) HTTP_METHOD_RE: Final[Pattern[str]] = re.compile( r"^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$" ) ROUTE_RE: Final[Pattern[str]] = re.compile( r"(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})" ) PATH_SEP: Final[str] = re.escape("/") _ExpectHandler = Callable[[Request], Awaitable[None]] _Resolve = Tuple[Optional["UrlMappingMatchInfo"], Set[str]] class _InfoDict(TypedDict, total=False): path: str formatter: str pattern: Pattern[str] directory: Path prefix: str routes: Mapping[str, "AbstractRoute"] app: "Application" domain: str rule: "AbstractRuleMatching" http_exception: HTTPException class AbstractResource(Sized, Iterable["AbstractRoute"]): def __init__(self, *, name: Optional[str] = None) -> None: self._name = name @property def name(self) -> Optional[str]: return self._name @property @abc.abstractmethod def canonical(self) -> str: """Exposes the resource's canonical path. For example '/foo/bar/{name}' """ @abc.abstractmethod # pragma: no branch def url_for(self, **kwargs: str) -> URL: """Construct url for resource with additional params.""" @abc.abstractmethod # pragma: no branch async def resolve(self, request: Request) -> _Resolve: """Resolve resource. Return (UrlMappingMatchInfo, allowed_methods) pair. """ @abc.abstractmethod def add_prefix(self, prefix: str) -> None: """Add a prefix to processed URLs. Required for subapplications support. """ @abc.abstractmethod def get_info(self) -> _InfoDict: """Return a dict with additional info useful for introspection""" def freeze(self) -> None: pass @abc.abstractmethod def raw_match(self, path: str) -> bool: """Perform a raw match against path""" class AbstractRoute(abc.ABC): def __init__( self, method: str, handler: Union[Handler, Type[AbstractView]], *, expect_handler: Optional[_ExpectHandler] = None, resource: Optional[AbstractResource] = None, ) -> None: if expect_handler is None: expect_handler = _default_expect_handler assert asyncio.iscoroutinefunction( expect_handler ), f"Coroutine is expected, got {expect_handler!r}" method = method.upper() if not HTTP_METHOD_RE.match(method): raise ValueError(f"{method} is not allowed HTTP method") assert callable(handler), handler if asyncio.iscoroutinefunction(handler): pass elif inspect.isgeneratorfunction(handler): warnings.warn( "Bare generators are deprecated, " "use @coroutine wrapper", DeprecationWarning, ) elif isinstance(handler, type) and issubclass(handler, AbstractView): pass else: warnings.warn( "Bare functions are deprecated, " "use async ones", DeprecationWarning ) @wraps(handler) async def handler_wrapper(request: Request) -> StreamResponse: result = old_handler(request) if asyncio.iscoroutine(result): return await result return result # type: ignore[return-value] old_handler = handler handler = handler_wrapper self._method = method self._handler = handler self._expect_handler = expect_handler self._resource = resource @property def method(self) -> str: return self._method @property def handler(self) -> Handler: return self._handler @property @abc.abstractmethod def name(self) -> Optional[str]: """Optional route's name, always equals to resource's name.""" @property def resource(self) -> Optional[AbstractResource]: return self._resource @abc.abstractmethod def get_info(self) -> _InfoDict: """Return a dict with additional info useful for introspection""" @abc.abstractmethod # pragma: no branch def url_for(self, *args: str, **kwargs: str) -> URL: """Construct url for route with additional params.""" async def handle_expect_header(self, request: Request) -> None: await self._expect_handler(request) class UrlMappingMatchInfo(BaseDict, AbstractMatchInfo): def __init__(self, match_dict: Dict[str, str], route: AbstractRoute): super().__init__(match_dict) self._route = route self._apps = [] # type: List[Application] self._current_app = None # type: Optional[Application] self._frozen = False @property def handler(self) -> Handler: return self._route.handler @property def route(self) -> AbstractRoute: return self._route @property def expect_handler(self) -> _ExpectHandler: return self._route.handle_expect_header @property def http_exception(self) -> Optional[HTTPException]: return None def get_info(self) -> _InfoDict: # type: ignore[override] return self._route.get_info() @property def apps(self) -> Tuple["Application", ...]: return tuple(self._apps) def add_app(self, app: "Application") -> None: if self._frozen: raise RuntimeError("Cannot change apps stack after .freeze() call") if self._current_app is None: self._current_app = app self._apps.insert(0, app) @property def current_app(self) -> "Application": app = self._current_app assert app is not None return app @contextmanager def set_current_app(self, app: "Application") -> Generator[None, None, None]: if DEBUG: # pragma: no cover if app not in self._apps: raise RuntimeError( "Expected one of the following apps {!r}, got {!r}".format( self._apps, app ) ) prev = self._current_app self._current_app = app try: yield finally: self._current_app = prev def freeze(self) -> None: self._frozen = True def __repr__(self) -> str: return f"" class MatchInfoError(UrlMappingMatchInfo): def __init__(self, http_exception: HTTPException) -> None: self._exception = http_exception super().__init__({}, SystemRoute(self._exception)) @property def http_exception(self) -> HTTPException: return self._exception def __repr__(self) -> str: return "".format( self._exception.status, self._exception.reason ) async def _default_expect_handler(request: Request) -> None: """Default handler for Expect header. Just send "100 Continue" to client. raise HTTPExpectationFailed if value of header is not "100-continue" """ expect = request.headers.get(hdrs.EXPECT, "") if request.version == HttpVersion11: if expect.lower() == "100-continue": await request.writer.write(b"HTTP/1.1 100 Continue\r\n\r\n") else: raise HTTPExpectationFailed(text="Unknown Expect: %s" % expect) class Resource(AbstractResource): def __init__(self, *, name: Optional[str] = None) -> None: super().__init__(name=name) self._routes = [] # type: List[ResourceRoute] def add_route( self, method: str, handler: Union[Type[AbstractView], Handler], *, expect_handler: Optional[_ExpectHandler] = None, ) -> "ResourceRoute": for route_obj in self._routes: if route_obj.method == method or route_obj.method == hdrs.METH_ANY: raise RuntimeError( "Added route will never be executed, " "method {route.method} is already " "registered".format(route=route_obj) ) route_obj = ResourceRoute(method, handler, self, expect_handler=expect_handler) self.register_route(route_obj) return route_obj def register_route(self, route: "ResourceRoute") -> None: assert isinstance( route, ResourceRoute ), f"Instance of Route class is required, got {route!r}" self._routes.append(route) async def resolve(self, request: Request) -> _Resolve: allowed_methods = set() # type: Set[str] match_dict = self._match(request.rel_url.raw_path) if match_dict is None: return None, allowed_methods for route_obj in self._routes: route_method = route_obj.method allowed_methods.add(route_method) if route_method == request.method or route_method == hdrs.METH_ANY: return (UrlMappingMatchInfo(match_dict, route_obj), allowed_methods) else: return None, allowed_methods @abc.abstractmethod def _match(self, path: str) -> Optional[Dict[str, str]]: pass # pragma: no cover def __len__(self) -> int: return len(self._routes) def __iter__(self) -> Iterator[AbstractRoute]: return iter(self._routes) # TODO: implement all abstract methods class PlainResource(Resource): def __init__(self, path: str, *, name: Optional[str] = None) -> None: super().__init__(name=name) assert not path or path.startswith("/") self._path = path @property def canonical(self) -> str: return self._path def freeze(self) -> None: if not self._path: self._path = "/" def add_prefix(self, prefix: str) -> None: assert prefix.startswith("/") assert not prefix.endswith("/") assert len(prefix) > 1 self._path = prefix + self._path def _match(self, path: str) -> Optional[Dict[str, str]]: # string comparison is about 10 times faster than regexp matching if self._path == path: return {} else: return None def raw_match(self, path: str) -> bool: return self._path == path def get_info(self) -> _InfoDict: return {"path": self._path} def url_for(self) -> URL: # type: ignore[override] return URL.build(path=self._path, encoded=True) def __repr__(self) -> str: name = "'" + self.name + "' " if self.name is not None else "" return f"" class DynamicResource(Resource): DYN = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*)\}") DYN_WITH_RE = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*):(?P.+)\}") GOOD = r"[^{}/]+" def __init__(self, path: str, *, name: Optional[str] = None) -> None: super().__init__(name=name) pattern = "" formatter = "" for part in ROUTE_RE.split(path): match = self.DYN.fullmatch(part) if match: pattern += "(?P<{}>{})".format(match.group("var"), self.GOOD) formatter += "{" + match.group("var") + "}" continue match = self.DYN_WITH_RE.fullmatch(part) if match: pattern += "(?P<{var}>{re})".format(**match.groupdict()) formatter += "{" + match.group("var") + "}" continue if "{" in part or "}" in part: raise ValueError(f"Invalid path '{path}'['{part}']") part = _requote_path(part) formatter += part pattern += re.escape(part) try: compiled = re.compile(pattern) except re.error as exc: raise ValueError(f"Bad pattern '{pattern}': {exc}") from None assert compiled.pattern.startswith(PATH_SEP) assert formatter.startswith("/") self._pattern = compiled self._formatter = formatter @property def canonical(self) -> str: return self._formatter def add_prefix(self, prefix: str) -> None: assert prefix.startswith("/") assert not prefix.endswith("/") assert len(prefix) > 1 self._pattern = re.compile(re.escape(prefix) + self._pattern.pattern) self._formatter = prefix + self._formatter def _match(self, path: str) -> Optional[Dict[str, str]]: match = self._pattern.fullmatch(path) if match is None: return None else: return { key: _unquote_path(value) for key, value in match.groupdict().items() } def raw_match(self, path: str) -> bool: return self._formatter == path def get_info(self) -> _InfoDict: return {"formatter": self._formatter, "pattern": self._pattern} def url_for(self, **parts: str) -> URL: url = self._formatter.format_map({k: _quote_path(v) for k, v in parts.items()}) return URL.build(path=url, encoded=True) def __repr__(self) -> str: name = "'" + self.name + "' " if self.name is not None else "" return "".format( name=name, formatter=self._formatter ) class PrefixResource(AbstractResource): def __init__(self, prefix: str, *, name: Optional[str] = None) -> None: assert not prefix or prefix.startswith("/"), prefix assert prefix in ("", "/") or not prefix.endswith("/"), prefix super().__init__(name=name) self._prefix = _requote_path(prefix) self._prefix2 = self._prefix + "/" @property def canonical(self) -> str: return self._prefix def add_prefix(self, prefix: str) -> None: assert prefix.startswith("/") assert not prefix.endswith("/") assert len(prefix) > 1 self._prefix = prefix + self._prefix self._prefix2 = self._prefix + "/" def raw_match(self, prefix: str) -> bool: return False # TODO: impl missing abstract methods class StaticResource(PrefixResource): VERSION_KEY = "v" def __init__( self, prefix: str, directory: PathLike, *, name: Optional[str] = None, expect_handler: Optional[_ExpectHandler] = None, chunk_size: int = 256 * 1024, show_index: bool = False, follow_symlinks: bool = False, append_version: bool = False, ) -> None: super().__init__(prefix, name=name) try: directory = Path(directory) if str(directory).startswith("~"): directory = Path(os.path.expanduser(str(directory))) directory = directory.resolve() if not directory.is_dir(): raise ValueError("Not a directory") except (FileNotFoundError, ValueError) as error: raise ValueError(f"No directory exists at '{directory}'") from error self._directory = directory self._show_index = show_index self._chunk_size = chunk_size self._follow_symlinks = follow_symlinks self._expect_handler = expect_handler self._append_version = append_version self._routes = { "GET": ResourceRoute( "GET", self._handle, self, expect_handler=expect_handler ), "HEAD": ResourceRoute( "HEAD", self._handle, self, expect_handler=expect_handler ), } def url_for( # type: ignore[override] self, *, filename: Union[str, Path], append_version: Optional[bool] = None, ) -> URL: if append_version is None: append_version = self._append_version if isinstance(filename, Path): filename = str(filename) filename = filename.lstrip("/") url = URL.build(path=self._prefix, encoded=True) # filename is not encoded if YARL_VERSION < (1, 6): url = url / filename.replace("%", "%25") else: url = url / filename if append_version: try: filepath = self._directory.joinpath(filename).resolve() if not self._follow_symlinks: filepath.relative_to(self._directory) except (ValueError, FileNotFoundError): # ValueError for case when path point to symlink # with follow_symlinks is False return url # relatively safe if filepath.is_file(): # TODO cache file content # with file watcher for cache invalidation with filepath.open("rb") as f: file_bytes = f.read() h = self._get_file_hash(file_bytes) url = url.with_query({self.VERSION_KEY: h}) return url return url @staticmethod def _get_file_hash(byte_array: bytes) -> str: m = hashlib.sha256() # todo sha256 can be configurable param m.update(byte_array) b64 = base64.urlsafe_b64encode(m.digest()) return b64.decode("ascii") def get_info(self) -> _InfoDict: return { "directory": self._directory, "prefix": self._prefix, "routes": self._routes, } def set_options_route(self, handler: Handler) -> None: if "OPTIONS" in self._routes: raise RuntimeError("OPTIONS route was set already") self._routes["OPTIONS"] = ResourceRoute( "OPTIONS", handler, self, expect_handler=self._expect_handler ) async def resolve(self, request: Request) -> _Resolve: path = request.rel_url.raw_path method = request.method allowed_methods = set(self._routes) if not path.startswith(self._prefix2) and path != self._prefix: return None, set() if method not in allowed_methods: return None, allowed_methods match_dict = {"filename": _unquote_path(path[len(self._prefix) + 1 :])} return (UrlMappingMatchInfo(match_dict, self._routes[method]), allowed_methods) def __len__(self) -> int: return len(self._routes) def __iter__(self) -> Iterator[AbstractRoute]: return iter(self._routes.values()) async def _handle(self, request: Request) -> StreamResponse: rel_url = request.match_info["filename"] try: filename = Path(rel_url) if filename.anchor: # rel_url is an absolute name like # /static/\\machine_name\c$ or /static/D:\path # where the static dir is totally different raise HTTPForbidden() filepath = self._directory.joinpath(filename).resolve() if not self._follow_symlinks: filepath.relative_to(self._directory) except (ValueError, FileNotFoundError) as error: # relatively safe raise HTTPNotFound() from error except HTTPForbidden: raise except Exception as error: # perm error or other kind! request.app.logger.exception(error) raise HTTPNotFound() from error # on opening a dir, load its contents if allowed if filepath.is_dir(): if self._show_index: try: return Response( text=self._directory_as_html(filepath), content_type="text/html" ) except PermissionError: raise HTTPForbidden() else: raise HTTPForbidden() elif filepath.is_file(): return FileResponse(filepath, chunk_size=self._chunk_size) else: raise HTTPNotFound def _directory_as_html(self, filepath: Path) -> str: # returns directory's index as html # sanity check assert filepath.is_dir() relative_path_to_dir = filepath.relative_to(self._directory).as_posix() index_of = f"Index of /{relative_path_to_dir}" h1 = f"

{index_of}

" index_list = [] dir_index = filepath.iterdir() for _file in sorted(dir_index): # show file url as relative to static path rel_path = _file.relative_to(self._directory).as_posix() file_url = self._prefix + "/" + rel_path # if file is a directory, add '/' to the end of the name if _file.is_dir(): file_name = f"{_file.name}/" else: file_name = _file.name index_list.append( '
  • {name}
  • '.format( url=file_url, name=file_name ) ) ul = "
      \n{}\n
    ".format("\n".join(index_list)) body = f"\n{h1}\n{ul}\n" head_str = f"\n{index_of}\n" html = f"\n{head_str}\n{body}\n" return html def __repr__(self) -> str: name = "'" + self.name + "'" if self.name is not None else "" return " {directory!r}>".format( name=name, path=self._prefix, directory=self._directory ) class PrefixedSubAppResource(PrefixResource): def __init__(self, prefix: str, app: "Application") -> None: super().__init__(prefix) self._app = app for resource in app.router.resources(): resource.add_prefix(prefix) def add_prefix(self, prefix: str) -> None: super().add_prefix(prefix) for resource in self._app.router.resources(): resource.add_prefix(prefix) def url_for(self, *args: str, **kwargs: str) -> URL: raise RuntimeError(".url_for() is not supported " "by sub-application root") def get_info(self) -> _InfoDict: return {"app": self._app, "prefix": self._prefix} async def resolve(self, request: Request) -> _Resolve: if ( not request.url.raw_path.startswith(self._prefix2) and request.url.raw_path != self._prefix ): return None, set() match_info = await self._app.router.resolve(request) match_info.add_app(self._app) if isinstance(match_info.http_exception, HTTPMethodNotAllowed): methods = match_info.http_exception.allowed_methods else: methods = set() return match_info, methods def __len__(self) -> int: return len(self._app.router.routes()) def __iter__(self) -> Iterator[AbstractRoute]: return iter(self._app.router.routes()) def __repr__(self) -> str: return " {app!r}>".format( prefix=self._prefix, app=self._app ) class AbstractRuleMatching(abc.ABC): @abc.abstractmethod # pragma: no branch async def match(self, request: Request) -> bool: """Return bool if the request satisfies the criteria""" @abc.abstractmethod # pragma: no branch def get_info(self) -> _InfoDict: """Return a dict with additional info useful for introspection""" @property @abc.abstractmethod # pragma: no branch def canonical(self) -> str: """Return a str""" class Domain(AbstractRuleMatching): re_part = re.compile(r"(?!-)[a-z\d-]{1,63}(? None: super().__init__() self._domain = self.validation(domain) @property def canonical(self) -> str: return self._domain def validation(self, domain: str) -> str: if not isinstance(domain, str): raise TypeError("Domain must be str") domain = domain.rstrip(".").lower() if not domain: raise ValueError("Domain cannot be empty") elif "://" in domain: raise ValueError("Scheme not supported") url = URL("http://" + domain) assert url.raw_host is not None if not all(self.re_part.fullmatch(x) for x in url.raw_host.split(".")): raise ValueError("Domain not valid") if url.port == 80: return url.raw_host return f"{url.raw_host}:{url.port}" async def match(self, request: Request) -> bool: host = request.headers.get(hdrs.HOST) if not host: return False return self.match_domain(host) def match_domain(self, host: str) -> bool: return host.lower() == self._domain def get_info(self) -> _InfoDict: return {"domain": self._domain} class MaskDomain(Domain): re_part = re.compile(r"(?!-)[a-z\d\*-]{1,63}(? None: super().__init__(domain) mask = self._domain.replace(".", r"\.").replace("*", ".*") self._mask = re.compile(mask) @property def canonical(self) -> str: return self._mask.pattern def match_domain(self, host: str) -> bool: return self._mask.fullmatch(host) is not None class MatchedSubAppResource(PrefixedSubAppResource): def __init__(self, rule: AbstractRuleMatching, app: "Application") -> None: AbstractResource.__init__(self) self._prefix = "" self._app = app self._rule = rule @property def canonical(self) -> str: return self._rule.canonical def get_info(self) -> _InfoDict: return {"app": self._app, "rule": self._rule} async def resolve(self, request: Request) -> _Resolve: if not await self._rule.match(request): return None, set() match_info = await self._app.router.resolve(request) match_info.add_app(self._app) if isinstance(match_info.http_exception, HTTPMethodNotAllowed): methods = match_info.http_exception.allowed_methods else: methods = set() return match_info, methods def __repr__(self) -> str: return " {app!r}>" "".format(app=self._app) class ResourceRoute(AbstractRoute): """A route with resource""" def __init__( self, method: str, handler: Union[Handler, Type[AbstractView]], resource: AbstractResource, *, expect_handler: Optional[_ExpectHandler] = None, ) -> None: super().__init__( method, handler, expect_handler=expect_handler, resource=resource ) def __repr__(self) -> str: return " {handler!r}".format( method=self.method, resource=self._resource, handler=self.handler ) @property def name(self) -> Optional[str]: if self._resource is None: return None return self._resource.name def url_for(self, *args: str, **kwargs: str) -> URL: """Construct url for route with additional params.""" assert self._resource is not None return self._resource.url_for(*args, **kwargs) def get_info(self) -> _InfoDict: assert self._resource is not None return self._resource.get_info() class SystemRoute(AbstractRoute): def __init__(self, http_exception: HTTPException) -> None: super().__init__(hdrs.METH_ANY, self._handle) self._http_exception = http_exception def url_for(self, *args: str, **kwargs: str) -> URL: raise RuntimeError(".url_for() is not allowed for SystemRoute") @property def name(self) -> Optional[str]: return None def get_info(self) -> _InfoDict: return {"http_exception": self._http_exception} async def _handle(self, request: Request) -> StreamResponse: raise self._http_exception @property def status(self) -> int: return self._http_exception.status @property def reason(self) -> str: return self._http_exception.reason def __repr__(self) -> str: return "".format(self=self) class View(AbstractView): async def _iter(self) -> StreamResponse: if self.request.method not in hdrs.METH_ALL: self._raise_allowed_methods() method: Callable[[], Awaitable[StreamResponse]] = getattr( self, self.request.method.lower(), None ) if method is None: self._raise_allowed_methods() resp = await method() return resp def __await__(self) -> Generator[Any, None, StreamResponse]: return self._iter().__await__() def _raise_allowed_methods(self) -> None: allowed_methods = {m for m in hdrs.METH_ALL if hasattr(self, m.lower())} raise HTTPMethodNotAllowed(self.request.method, allowed_methods) class ResourcesView(Sized, Iterable[AbstractResource], Container[AbstractResource]): def __init__(self, resources: List[AbstractResource]) -> None: self._resources = resources def __len__(self) -> int: return len(self._resources) def __iter__(self) -> Iterator[AbstractResource]: yield from self._resources def __contains__(self, resource: object) -> bool: return resource in self._resources class RoutesView(Sized, Iterable[AbstractRoute], Container[AbstractRoute]): def __init__(self, resources: List[AbstractResource]): self._routes = [] # type: List[AbstractRoute] for resource in resources: for route in resource: self._routes.append(route) def __len__(self) -> int: return len(self._routes) def __iter__(self) -> Iterator[AbstractRoute]: yield from self._routes def __contains__(self, route: object) -> bool: return route in self._routes class UrlDispatcher(AbstractRouter, Mapping[str, AbstractResource]): NAME_SPLIT_RE = re.compile(r"[.:-]") def __init__(self) -> None: super().__init__() self._resources = [] # type: List[AbstractResource] self._named_resources = {} # type: Dict[str, AbstractResource] async def resolve(self, request: Request) -> UrlMappingMatchInfo: method = request.method allowed_methods = set() # type: Set[str] for resource in self._resources: match_dict, allowed = await resource.resolve(request) if match_dict is not None: return match_dict else: allowed_methods |= allowed if allowed_methods: return MatchInfoError(HTTPMethodNotAllowed(method, allowed_methods)) else: return MatchInfoError(HTTPNotFound()) def __iter__(self) -> Iterator[str]: return iter(self._named_resources) def __len__(self) -> int: return len(self._named_resources) def __contains__(self, resource: object) -> bool: return resource in self._named_resources def __getitem__(self, name: str) -> AbstractResource: return self._named_resources[name] def resources(self) -> ResourcesView: return ResourcesView(self._resources) def routes(self) -> RoutesView: return RoutesView(self._resources) def named_resources(self) -> Mapping[str, AbstractResource]: return MappingProxyType(self._named_resources) def register_resource(self, resource: AbstractResource) -> None: assert isinstance( resource, AbstractResource ), f"Instance of AbstractResource class is required, got {resource!r}" if self.frozen: raise RuntimeError("Cannot register a resource into frozen router.") name = resource.name if name is not None: parts = self.NAME_SPLIT_RE.split(name) for part in parts: if keyword.iskeyword(part): raise ValueError( f"Incorrect route name {name!r}, " "python keywords cannot be used " "for route name" ) if not part.isidentifier(): raise ValueError( "Incorrect route name {!r}, " "the name should be a sequence of " "python identifiers separated " "by dash, dot or column".format(name) ) if name in self._named_resources: raise ValueError( "Duplicate {!r}, " "already handled by {!r}".format(name, self._named_resources[name]) ) self._named_resources[name] = resource self._resources.append(resource) def add_resource(self, path: str, *, name: Optional[str] = None) -> Resource: if path and not path.startswith("/"): raise ValueError("path should be started with / or be empty") # Reuse last added resource if path and name are the same if self._resources: resource = self._resources[-1] if resource.name == name and resource.raw_match(path): return cast(Resource, resource) if not ("{" in path or "}" in path or ROUTE_RE.search(path)): resource = PlainResource(_requote_path(path), name=name) self.register_resource(resource) return resource resource = DynamicResource(path, name=name) self.register_resource(resource) return resource def add_route( self, method: str, path: str, handler: Union[Handler, Type[AbstractView]], *, name: Optional[str] = None, expect_handler: Optional[_ExpectHandler] = None, ) -> AbstractRoute: resource = self.add_resource(path, name=name) return resource.add_route(method, handler, expect_handler=expect_handler) def add_static( self, prefix: str, path: PathLike, *, name: Optional[str] = None, expect_handler: Optional[_ExpectHandler] = None, chunk_size: int = 256 * 1024, show_index: bool = False, follow_symlinks: bool = False, append_version: bool = False, ) -> AbstractResource: """Add static files view. prefix - url prefix path - folder with files """ assert prefix.startswith("/") if prefix.endswith("/"): prefix = prefix[:-1] resource = StaticResource( prefix, path, name=name, expect_handler=expect_handler, chunk_size=chunk_size, show_index=show_index, follow_symlinks=follow_symlinks, append_version=append_version, ) self.register_resource(resource) return resource def add_head(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method HEAD.""" return self.add_route(hdrs.METH_HEAD, path, handler, **kwargs) def add_options(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method OPTIONS.""" return self.add_route(hdrs.METH_OPTIONS, path, handler, **kwargs) def add_get( self, path: str, handler: Handler, *, name: Optional[str] = None, allow_head: bool = True, **kwargs: Any, ) -> AbstractRoute: """Shortcut for add_route with method GET. If allow_head is true, another route is added allowing head requests to the same endpoint. """ resource = self.add_resource(path, name=name) if allow_head: resource.add_route(hdrs.METH_HEAD, handler, **kwargs) return resource.add_route(hdrs.METH_GET, handler, **kwargs) def add_post(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method POST.""" return self.add_route(hdrs.METH_POST, path, handler, **kwargs) def add_put(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method PUT.""" return self.add_route(hdrs.METH_PUT, path, handler, **kwargs) def add_patch(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method PATCH.""" return self.add_route(hdrs.METH_PATCH, path, handler, **kwargs) def add_delete(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: """Shortcut for add_route with method DELETE.""" return self.add_route(hdrs.METH_DELETE, path, handler, **kwargs) def add_view( self, path: str, handler: Type[AbstractView], **kwargs: Any ) -> AbstractRoute: """Shortcut for add_route with ANY methods for a class-based view.""" return self.add_route(hdrs.METH_ANY, path, handler, **kwargs) def freeze(self) -> None: super().freeze() for resource in self._resources: resource.freeze() def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: """Append routes to route table. Parameter should be a sequence of RouteDef objects. Returns a list of registered AbstractRoute instances. """ registered_routes = [] for route_def in routes: registered_routes.extend(route_def.register(self)) return registered_routes def _quote_path(value: str) -> str: if YARL_VERSION < (1, 6): value = value.replace("%", "%25") return URL.build(path=value, encoded=False).raw_path def _unquote_path(value: str) -> str: return URL.build(path=value, encoded=True).path def _requote_path(value: str) -> str: # Quote non-ascii characters and other characters which must be quoted, # but preserve existing %-sequences. result = _quote_path(value) if "%" in value: result = result.replace("%25", "%") return result ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/web_ws.py0000644000175100001710000004155300000000000016053 0ustar00runnerdockerimport asyncio import base64 import binascii import hashlib import json from typing import Any, Iterable, Optional, Tuple, cast import async_timeout import attr from multidict import CIMultiDict from . import hdrs from .abc import AbstractStreamWriter from .helpers import call_later, set_result from .http import ( WS_CLOSED_MESSAGE, WS_CLOSING_MESSAGE, WS_KEY, WebSocketError, WebSocketReader, WebSocketWriter, WSCloseCode, WSMessage, WSMsgType as WSMsgType, ws_ext_gen, ws_ext_parse, ) from .log import ws_logger from .streams import EofStream, FlowControlDataQueue from .typedefs import Final, JSONDecoder, JSONEncoder from .web_exceptions import HTTPBadRequest, HTTPException from .web_request import BaseRequest from .web_response import StreamResponse __all__ = ( "WebSocketResponse", "WebSocketReady", "WSMsgType", ) THRESHOLD_CONNLOST_ACCESS: Final[int] = 5 @attr.s(auto_attribs=True, frozen=True, slots=True) class WebSocketReady: ok: bool protocol: Optional[str] def __bool__(self) -> bool: return self.ok class WebSocketResponse(StreamResponse): _length_check = False def __init__( self, *, timeout: float = 10.0, receive_timeout: Optional[float] = None, autoclose: bool = True, autoping: bool = True, heartbeat: Optional[float] = None, protocols: Iterable[str] = (), compress: bool = True, max_msg_size: int = 4 * 1024 * 1024, ) -> None: super().__init__(status=101) self._protocols = protocols self._ws_protocol = None # type: Optional[str] self._writer = None # type: Optional[WebSocketWriter] self._reader = None # type: Optional[FlowControlDataQueue[WSMessage]] self._closed = False self._closing = False self._conn_lost = 0 self._close_code = None # type: Optional[int] self._loop = None # type: Optional[asyncio.AbstractEventLoop] self._waiting = None # type: Optional[asyncio.Future[bool]] self._exception = None # type: Optional[BaseException] self._timeout = timeout self._receive_timeout = receive_timeout self._autoclose = autoclose self._autoping = autoping self._heartbeat = heartbeat self._heartbeat_cb: Optional[asyncio.TimerHandle] = None if heartbeat is not None: self._pong_heartbeat = heartbeat / 2.0 self._pong_response_cb: Optional[asyncio.TimerHandle] = None self._compress = compress self._max_msg_size = max_msg_size def _cancel_heartbeat(self) -> None: if self._pong_response_cb is not None: self._pong_response_cb.cancel() self._pong_response_cb = None if self._heartbeat_cb is not None: self._heartbeat_cb.cancel() self._heartbeat_cb = None def _reset_heartbeat(self) -> None: self._cancel_heartbeat() if self._heartbeat is not None: assert self._loop is not None self._heartbeat_cb = call_later( self._send_heartbeat, self._heartbeat, self._loop ) def _send_heartbeat(self) -> None: if self._heartbeat is not None and not self._closed: assert self._loop is not None # fire-and-forget a task is not perfect but maybe ok for # sending ping. Otherwise we need a long-living heartbeat # task in the class. self._loop.create_task(self._writer.ping()) # type: ignore[union-attr] if self._pong_response_cb is not None: self._pong_response_cb.cancel() self._pong_response_cb = call_later( self._pong_not_received, self._pong_heartbeat, self._loop ) def _pong_not_received(self) -> None: if self._req is not None and self._req.transport is not None: self._closed = True self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._exception = asyncio.TimeoutError() self._req.transport.close() async def prepare(self, request: BaseRequest) -> AbstractStreamWriter: # make pre-check to don't hide it by do_handshake() exceptions if self._payload_writer is not None: return self._payload_writer protocol, writer = self._pre_start(request) payload_writer = await super().prepare(request) assert payload_writer is not None self._post_start(request, protocol, writer) await payload_writer.drain() return payload_writer def _handshake( self, request: BaseRequest ) -> Tuple["CIMultiDict[str]", str, bool, bool]: headers = request.headers if "websocket" != headers.get(hdrs.UPGRADE, "").lower().strip(): raise HTTPBadRequest( text=( "No WebSocket UPGRADE hdr: {}\n Can " '"Upgrade" only to "WebSocket".' ).format(headers.get(hdrs.UPGRADE)) ) if "upgrade" not in headers.get(hdrs.CONNECTION, "").lower(): raise HTTPBadRequest( text="No CONNECTION upgrade hdr: {}".format( headers.get(hdrs.CONNECTION) ) ) # find common sub-protocol between client and server protocol = None if hdrs.SEC_WEBSOCKET_PROTOCOL in headers: req_protocols = [ str(proto.strip()) for proto in headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") ] for proto in req_protocols: if proto in self._protocols: protocol = proto break else: # No overlap found: Return no protocol as per spec ws_logger.warning( "Client protocols %r don’t overlap server-known ones %r", req_protocols, self._protocols, ) # check supported version version = headers.get(hdrs.SEC_WEBSOCKET_VERSION, "") if version not in ("13", "8", "7"): raise HTTPBadRequest(text=f"Unsupported version: {version}") # check client handshake for validity key = headers.get(hdrs.SEC_WEBSOCKET_KEY) try: if not key or len(base64.b64decode(key)) != 16: raise HTTPBadRequest(text=f"Handshake error: {key!r}") except binascii.Error: raise HTTPBadRequest(text=f"Handshake error: {key!r}") from None accept_val = base64.b64encode( hashlib.sha1(key.encode() + WS_KEY).digest() ).decode() response_headers = CIMultiDict( # type: ignore[var-annotated] { hdrs.UPGRADE: "websocket", # type: ignore[arg-type] hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: accept_val, } ) notakeover = False compress = 0 if self._compress: extensions = headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) # Server side always get return with no exception. # If something happened, just drop compress extension compress, notakeover = ws_ext_parse(extensions, isserver=True) if compress: enabledext = ws_ext_gen( compress=compress, isserver=True, server_notakeover=notakeover ) response_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = enabledext if protocol: response_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = protocol return ( response_headers, protocol, compress, notakeover, ) # type: ignore[return-value] def _pre_start(self, request: BaseRequest) -> Tuple[str, WebSocketWriter]: self._loop = request._loop headers, protocol, compress, notakeover = self._handshake(request) self.set_status(101) self.headers.update(headers) self.force_close() self._compress = compress transport = request._protocol.transport assert transport is not None writer = WebSocketWriter( request._protocol, transport, compress=compress, notakeover=notakeover ) return protocol, writer def _post_start( self, request: BaseRequest, protocol: str, writer: WebSocketWriter ) -> None: self._ws_protocol = protocol self._writer = writer self._reset_heartbeat() loop = self._loop assert loop is not None self._reader = FlowControlDataQueue(request._protocol, 2 ** 16, loop=loop) request.protocol.set_parser( WebSocketReader(self._reader, self._max_msg_size, compress=self._compress) ) # disable HTTP keepalive for WebSocket request.protocol.keep_alive(False) def can_prepare(self, request: BaseRequest) -> WebSocketReady: if self._writer is not None: raise RuntimeError("Already started") try: _, protocol, _, _ = self._handshake(request) except HTTPException: return WebSocketReady(False, None) else: return WebSocketReady(True, protocol) @property def closed(self) -> bool: return self._closed @property def close_code(self) -> Optional[int]: return self._close_code @property def ws_protocol(self) -> Optional[str]: return self._ws_protocol @property def compress(self) -> bool: return self._compress def exception(self) -> Optional[BaseException]: return self._exception async def ping(self, message: bytes = b"") -> None: if self._writer is None: raise RuntimeError("Call .prepare() first") await self._writer.ping(message) async def pong(self, message: bytes = b"") -> None: # unsolicited pong if self._writer is None: raise RuntimeError("Call .prepare() first") await self._writer.pong(message) async def send_str(self, data: str, compress: Optional[bool] = None) -> None: if self._writer is None: raise RuntimeError("Call .prepare() first") if not isinstance(data, str): raise TypeError("data argument must be str (%r)" % type(data)) await self._writer.send(data, binary=False, compress=compress) async def send_bytes(self, data: bytes, compress: Optional[bool] = None) -> None: if self._writer is None: raise RuntimeError("Call .prepare() first") if not isinstance(data, (bytes, bytearray, memoryview)): raise TypeError("data argument must be byte-ish (%r)" % type(data)) await self._writer.send(data, binary=True, compress=compress) async def send_json( self, data: Any, compress: Optional[bool] = None, *, dumps: JSONEncoder = json.dumps, ) -> None: await self.send_str(dumps(data), compress=compress) async def write_eof(self) -> None: # type: ignore[override] if self._eof_sent: return if self._payload_writer is None: raise RuntimeError("Response has not been started") await self.close() self._eof_sent = True async def close(self, *, code: int = WSCloseCode.OK, message: bytes = b"") -> bool: if self._writer is None: raise RuntimeError("Call .prepare() first") self._cancel_heartbeat() reader = self._reader assert reader is not None # we need to break `receive()` cycle first, # `close()` may be called from different task if self._waiting is not None and not self._closed: reader.feed_data(WS_CLOSING_MESSAGE, 0) await self._waiting if not self._closed: self._closed = True try: await self._writer.close(code, message) writer = self._payload_writer assert writer is not None await writer.drain() except (asyncio.CancelledError, asyncio.TimeoutError): self._close_code = WSCloseCode.ABNORMAL_CLOSURE raise except Exception as exc: self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._exception = exc return True if self._closing: return True reader = self._reader assert reader is not None try: async with async_timeout.timeout(self._timeout): msg = await reader.read() except asyncio.CancelledError: self._close_code = WSCloseCode.ABNORMAL_CLOSURE raise except Exception as exc: self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._exception = exc return True if msg.type == WSMsgType.CLOSE: self._close_code = msg.data return True self._close_code = WSCloseCode.ABNORMAL_CLOSURE self._exception = asyncio.TimeoutError() return True else: return False async def receive(self, timeout: Optional[float] = None) -> WSMessage: if self._reader is None: raise RuntimeError("Call .prepare() first") loop = self._loop assert loop is not None while True: if self._waiting is not None: raise RuntimeError("Concurrent call to receive() is not allowed") if self._closed: self._conn_lost += 1 if self._conn_lost >= THRESHOLD_CONNLOST_ACCESS: raise RuntimeError("WebSocket connection is closed.") return WS_CLOSED_MESSAGE elif self._closing: return WS_CLOSING_MESSAGE try: self._waiting = loop.create_future() try: async with async_timeout.timeout(timeout or self._receive_timeout): msg = await self._reader.read() self._reset_heartbeat() finally: waiter = self._waiting set_result(waiter, True) self._waiting = None except (asyncio.CancelledError, asyncio.TimeoutError): self._close_code = WSCloseCode.ABNORMAL_CLOSURE raise except EofStream: self._close_code = WSCloseCode.OK await self.close() return WSMessage(WSMsgType.CLOSED, None, None) except WebSocketError as exc: self._close_code = exc.code await self.close(code=exc.code) return WSMessage(WSMsgType.ERROR, exc, None) except Exception as exc: self._exception = exc self._closing = True self._close_code = WSCloseCode.ABNORMAL_CLOSURE await self.close() return WSMessage(WSMsgType.ERROR, exc, None) if msg.type == WSMsgType.CLOSE: self._closing = True self._close_code = msg.data if not self._closed and self._autoclose: await self.close() elif msg.type == WSMsgType.CLOSING: self._closing = True elif msg.type == WSMsgType.PING and self._autoping: await self.pong(msg.data) continue elif msg.type == WSMsgType.PONG and self._autoping: continue return msg async def receive_str(self, *, timeout: Optional[float] = None) -> str: msg = await self.receive(timeout) if msg.type != WSMsgType.TEXT: raise TypeError( "Received message {}:{!r} is not WSMsgType.TEXT".format( msg.type, msg.data ) ) return cast(str, msg.data) async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: msg = await self.receive(timeout) if msg.type != WSMsgType.BINARY: raise TypeError(f"Received message {msg.type}:{msg.data!r} is not bytes") return cast(bytes, msg.data) async def receive_json( self, *, loads: JSONDecoder = json.loads, timeout: Optional[float] = None ) -> Any: data = await self.receive_str(timeout=timeout) return loads(data) async def write(self, data: bytes) -> None: raise RuntimeError("Cannot call .write() for websocket") def __aiter__(self) -> "WebSocketResponse": return self async def __anext__(self) -> WSMessage: msg = await self.receive() if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): raise StopAsyncIteration return msg def _cancel(self, exc: BaseException) -> None: if self._reader is not None: self._reader.set_exception(exc) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/aiohttp/worker.py0000644000175100001710000002111300000000000016064 0ustar00runnerdocker"""Async gunicorn worker for aiohttp.web""" import asyncio import os import re import signal import sys from types import FrameType from typing import Any, Awaitable, Callable, Optional, Union # noqa from gunicorn.config import AccessLogFormat as GunicornAccessLogFormat from gunicorn.workers import base from aiohttp import web from .helpers import set_result from .web_app import Application from .web_log import AccessLogger try: import ssl SSLContext = ssl.SSLContext except ImportError: # pragma: no cover ssl = None # type: ignore[assignment] SSLContext = object # type: ignore[misc,assignment] __all__ = ("GunicornWebWorker", "GunicornUVLoopWebWorker", "GunicornTokioWebWorker") class GunicornWebWorker(base.Worker): # type: ignore[misc,no-any-unimported] DEFAULT_AIOHTTP_LOG_FORMAT = AccessLogger.LOG_FORMAT DEFAULT_GUNICORN_LOG_FORMAT = GunicornAccessLogFormat.default def __init__(self, *args: Any, **kw: Any) -> None: # pragma: no cover super().__init__(*args, **kw) self._task = None # type: Optional[asyncio.Task[None]] self.exit_code = 0 self._notify_waiter = None # type: Optional[asyncio.Future[bool]] def init_process(self) -> None: # create new event_loop after fork asyncio.get_event_loop().close() self.loop = asyncio.new_event_loop() asyncio.set_event_loop(self.loop) super().init_process() def run(self) -> None: self._task = self.loop.create_task(self._run()) try: # ignore all finalization problems self.loop.run_until_complete(self._task) except Exception: self.log.exception("Exception in gunicorn worker") self.loop.run_until_complete(self.loop.shutdown_asyncgens()) self.loop.close() sys.exit(self.exit_code) async def _run(self) -> None: runner = None if isinstance(self.wsgi, Application): app = self.wsgi elif asyncio.iscoroutinefunction(self.wsgi): wsgi = await self.wsgi() if isinstance(wsgi, web.AppRunner): runner = wsgi app = runner.app else: app = wsgi else: raise RuntimeError( "wsgi app should be either Application or " "async function returning Application, got {}".format(self.wsgi) ) if runner is None: access_log = self.log.access_log if self.cfg.accesslog else None runner = web.AppRunner( app, logger=self.log, keepalive_timeout=self.cfg.keepalive, access_log=access_log, access_log_format=self._get_valid_log_format( self.cfg.access_log_format ), ) await runner.setup() ctx = self._create_ssl_context(self.cfg) if self.cfg.is_ssl else None runner = runner assert runner is not None server = runner.server assert server is not None for sock in self.sockets: site = web.SockSite( runner, sock, ssl_context=ctx, shutdown_timeout=self.cfg.graceful_timeout / 100 * 95, ) await site.start() # If our parent changed then we shut down. pid = os.getpid() try: while self.alive: # type: ignore[has-type] self.notify() cnt = server.requests_count if self.cfg.max_requests and cnt > self.cfg.max_requests: self.alive = False self.log.info("Max requests, shutting down: %s", self) elif pid == os.getpid() and self.ppid != os.getppid(): self.alive = False self.log.info("Parent changed, shutting down: %s", self) else: await self._wait_next_notify() except BaseException: pass await runner.cleanup() def _wait_next_notify(self) -> "asyncio.Future[bool]": self._notify_waiter_done() loop = self.loop assert loop is not None self._notify_waiter = waiter = loop.create_future() self.loop.call_later(1.0, self._notify_waiter_done, waiter) return waiter def _notify_waiter_done( self, waiter: Optional["asyncio.Future[bool]"] = None ) -> None: if waiter is None: waiter = self._notify_waiter if waiter is not None: set_result(waiter, True) if waiter is self._notify_waiter: self._notify_waiter = None def init_signals(self) -> None: # Set up signals through the event loop API. self.loop.add_signal_handler( signal.SIGQUIT, self.handle_quit, signal.SIGQUIT, None ) self.loop.add_signal_handler( signal.SIGTERM, self.handle_exit, signal.SIGTERM, None ) self.loop.add_signal_handler( signal.SIGINT, self.handle_quit, signal.SIGINT, None ) self.loop.add_signal_handler( signal.SIGWINCH, self.handle_winch, signal.SIGWINCH, None ) self.loop.add_signal_handler( signal.SIGUSR1, self.handle_usr1, signal.SIGUSR1, None ) self.loop.add_signal_handler( signal.SIGABRT, self.handle_abort, signal.SIGABRT, None ) # Don't let SIGTERM and SIGUSR1 disturb active requests # by interrupting system calls signal.siginterrupt(signal.SIGTERM, False) signal.siginterrupt(signal.SIGUSR1, False) # Reset signals so Gunicorn doesn't swallow subprocess return codes # See: https://github.com/aio-libs/aiohttp/issues/6130 if sys.version_info < (3, 8): # Starting from Python 3.8, # the default child watcher is ThreadedChildWatcher. # The watcher doesn't depend on SIGCHLD signal, # there is no need to reset it. signal.signal(signal.SIGCHLD, signal.SIG_DFL) def handle_quit(self, sig: int, frame: FrameType) -> None: self.alive = False # worker_int callback self.cfg.worker_int(self) # wakeup closing process self._notify_waiter_done() def handle_abort(self, sig: int, frame: FrameType) -> None: self.alive = False self.exit_code = 1 self.cfg.worker_abort(self) sys.exit(1) @staticmethod def _create_ssl_context(cfg: Any) -> "SSLContext": """Creates SSLContext instance for usage in asyncio.create_server. See ssl.SSLSocket.__init__ for more details. """ if ssl is None: # pragma: no cover raise RuntimeError("SSL is not supported.") ctx = ssl.SSLContext(cfg.ssl_version) ctx.load_cert_chain(cfg.certfile, cfg.keyfile) ctx.verify_mode = cfg.cert_reqs if cfg.ca_certs: ctx.load_verify_locations(cfg.ca_certs) if cfg.ciphers: ctx.set_ciphers(cfg.ciphers) return ctx def _get_valid_log_format(self, source_format: str) -> str: if source_format == self.DEFAULT_GUNICORN_LOG_FORMAT: return self.DEFAULT_AIOHTTP_LOG_FORMAT elif re.search(r"%\([^\)]+\)", source_format): raise ValueError( "Gunicorn's style options in form of `%(name)s` are not " "supported for the log formatting. Please use aiohttp's " "format specification to configure access log formatting: " "http://docs.aiohttp.org/en/stable/logging.html" "#format-specification" ) else: return source_format class GunicornUVLoopWebWorker(GunicornWebWorker): def init_process(self) -> None: import uvloop # Close any existing event loop before setting a # new policy. asyncio.get_event_loop().close() # Setup uvloop policy, so that every # asyncio.get_event_loop() will create an instance # of uvloop event loop. asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) super().init_process() class GunicornTokioWebWorker(GunicornWebWorker): def init_process(self) -> None: # pragma: no cover import tokio # Close any existing event loop before setting a # new policy. asyncio.get_event_loop().close() # Setup tokio policy, so that every # asyncio.get_event_loop() will create an instance # of tokio event loop. asyncio.set_event_loop_policy(tokio.EventLoopPolicy()) super().init_process() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0064514 aiohttp-3.8.1/aiohttp.egg-info/0000755000175100001710000000000000000000000015675 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920322.0 aiohttp-3.8.1/aiohttp.egg-info/PKG-INFO0000644000175100001710000001511700000000000016777 0ustar00runnerdockerMetadata-Version: 2.1 Name: aiohttp Version: 3.8.1 Summary: Async http client/server framework (asyncio) Home-page: https://github.com/aio-libs/aiohttp Maintainer: aiohttp team Maintainer-email: team@aiohttp.org License: Apache 2 Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp Project-URL: Docs: Changelog, https://docs.aiohttp.org/en/stable/changes.html Project-URL: Docs: RTD, https://docs.aiohttp.org Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: AsyncIO Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Apache Software License Classifier: Operating System :: POSIX Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft :: Windows Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Topic :: Internet :: WWW/HTTP Requires-Python: >=3.6 Description-Content-Type: text/x-rst Provides-Extra: speedups License-File: LICENSE.txt ================================== Async http client/server framework ================================== .. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg :height: 64px :width: 64px :alt: aiohttp logo | .. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI :alt: GitHub Actions status for master branch .. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg :target: https://codecov.io/gh/aio-libs/aiohttp :alt: codecov.io status for master branch .. image:: https://badge.fury.io/py/aiohttp.svg :target: https://pypi.org/project/aiohttp :alt: Latest PyPI package version .. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest :target: https://docs.aiohttp.org/ :alt: Latest Read The Docs .. image:: https://img.shields.io/discourse/status?server=https%3A%2F%2Faio-libs.discourse.group :target: https://aio-libs.discourse.group :alt: Discourse status .. image:: https://badges.gitter.im/Join%20Chat.svg :target: https://gitter.im/aio-libs/Lobby :alt: Chat on Gitter Key Features ============ - Supports both client and server side of HTTP protocol. - Supports both client and server Web-Sockets out-of-the-box and avoids Callback Hell. - Provides Web-server with middlewares and plugable routing. Getting started =============== Client ------ To get something from the web: .. code-block:: python import aiohttp import asyncio async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: print("Status:", response.status) print("Content-type:", response.headers['content-type']) html = await response.text() print("Body:", html[:15], "...") loop = asyncio.get_event_loop() loop.run_until_complete(main()) This prints: .. code-block:: Status: 200 Content-type: text/html; charset=utf-8 Body: ... Coming from `requests `_ ? Read `why we need so many lines `_. Server ------ An example using a simple server: .. code-block:: python # examples/server_simple.py from aiohttp import web async def handle(request): name = request.match_info.get('name', "Anonymous") text = "Hello, " + name return web.Response(text=text) async def wshandle(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: if msg.type == web.WSMsgType.text: await ws.send_str("Hello, {}".format(msg.data)) elif msg.type == web.WSMsgType.binary: await ws.send_bytes(msg.data) elif msg.type == web.WSMsgType.close: break return ws app = web.Application() app.add_routes([web.get('/', handle), web.get('/echo', wshandle), web.get('/{name}', handle)]) if __name__ == '__main__': web.run_app(app) Documentation ============= https://aiohttp.readthedocs.io/ Demos ===== https://github.com/aio-libs/aiohttp-demos External links ============== * `Third party libraries `_ * `Built with aiohttp `_ * `Powered by aiohttp `_ Feel free to make a Pull Request for adding your link to these pages! Communication channels ====================== *aio-libs discourse group*: https://aio-libs.discourse.group *gitter chat* https://gitter.im/aio-libs/Lobby We support `Stack Overflow `_. Please add *aiohttp* tag to your question there. Requirements ============ - Python >= 3.6 - async-timeout_ - attrs_ - charset-normalizer_ - multidict_ - yarl_ Optionally you may install the cChardet_ and aiodns_ libraries (highly recommended for sake of speed). .. _charset-normalizer: https://pypi.org/project/charset-normalizer .. _aiodns: https://pypi.python.org/pypi/aiodns .. _attrs: https://github.com/python-attrs/attrs .. _multidict: https://pypi.python.org/pypi/multidict .. _yarl: https://pypi.python.org/pypi/yarl .. _async-timeout: https://pypi.python.org/pypi/async_timeout .. _cChardet: https://pypi.python.org/pypi/cchardet License ======= ``aiohttp`` is offered under the Apache 2 license. Keepsafe ======== The aiohttp community would like to thank Keepsafe (https://www.getkeepsafe.com) for its support in the early days of the project. Source code =========== The latest developer version is available in a GitHub repository: https://github.com/aio-libs/aiohttp Benchmarks ========== If you are interested in efficiency, the AsyncIO community maintains a list of benchmarks on the official wiki: https://github.com/python/asyncio/wiki/Benchmarks ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920322.0 aiohttp-3.8.1/aiohttp.egg-info/SOURCES.txt0000644000175100001710000001575000000000000017571 0ustar00runnerdockerCHANGES.rst CONTRIBUTORS.txt LICENSE.txt MANIFEST.in Makefile README.rst pyproject.toml setup.cfg setup.py aiohttp/__init__.py aiohttp/_cparser.pxd aiohttp/_find_header.c aiohttp/_find_header.h aiohttp/_find_header.pxd aiohttp/_headers.pxi aiohttp/_helpers.c aiohttp/_helpers.pyi aiohttp/_helpers.pyx aiohttp/_http_parser.c aiohttp/_http_parser.pyx aiohttp/_http_writer.c aiohttp/_http_writer.pyx aiohttp/_websocket.c aiohttp/_websocket.pyx aiohttp/abc.py aiohttp/base_protocol.py aiohttp/client.py aiohttp/client_exceptions.py aiohttp/client_proto.py aiohttp/client_reqrep.py aiohttp/client_ws.py aiohttp/connector.py aiohttp/cookiejar.py aiohttp/formdata.py aiohttp/hdrs.py aiohttp/helpers.py aiohttp/http.py aiohttp/http_exceptions.py aiohttp/http_parser.py aiohttp/http_websocket.py aiohttp/http_writer.py aiohttp/locks.py aiohttp/log.py aiohttp/multipart.py aiohttp/payload.py aiohttp/payload_streamer.py aiohttp/py.typed aiohttp/pytest_plugin.py aiohttp/resolver.py aiohttp/streams.py aiohttp/tcp_helpers.py aiohttp/test_utils.py aiohttp/tracing.py aiohttp/typedefs.py aiohttp/web.py aiohttp/web_app.py aiohttp/web_exceptions.py aiohttp/web_fileresponse.py aiohttp/web_log.py aiohttp/web_middlewares.py aiohttp/web_protocol.py aiohttp/web_request.py aiohttp/web_response.py aiohttp/web_routedef.py aiohttp/web_runner.py aiohttp/web_server.py aiohttp/web_urldispatcher.py aiohttp/web_ws.py aiohttp/worker.py aiohttp.egg-info/PKG-INFO aiohttp.egg-info/SOURCES.txt aiohttp.egg-info/dependency_links.txt aiohttp.egg-info/not-zip-safe aiohttp.egg-info/requires.txt aiohttp.egg-info/top_level.txt aiohttp/.hash/_cparser.pxd.hash aiohttp/.hash/_find_header.pxd.hash aiohttp/.hash/_helpers.pyi.hash aiohttp/.hash/_helpers.pyx.hash aiohttp/.hash/_http_parser.pyx.hash aiohttp/.hash/_http_writer.pyx.hash aiohttp/.hash/_websocket.pyx.hash aiohttp/.hash/hdrs.py.hash docs/Makefile docs/abc.rst docs/aiohttp-icon.svg docs/aiohttp-plain.svg docs/built_with.rst docs/changes.rst docs/client.rst docs/client_advanced.rst docs/client_quickstart.rst docs/client_reference.rst docs/conf.py docs/contributing.rst docs/deployment.rst docs/essays.rst docs/external.rst docs/faq.rst docs/favicon.ico docs/glossary.rst docs/http_request_lifecycle.rst docs/index.rst docs/logging.rst docs/make.bat docs/migration_to_2xx.rst docs/misc.rst docs/multipart.rst docs/multipart_reference.rst docs/new_router.rst docs/old-logo.png docs/old-logo.svg docs/powered_by.rst docs/spelling_wordlist.txt docs/streams.rst docs/structures.rst docs/testing.rst docs/third_party.rst docs/tracing_reference.rst docs/utilities.rst docs/web.rst docs/web_advanced.rst docs/web_lowlevel.rst docs/web_quickstart.rst docs/web_reference.rst docs/websocket_utilities.rst docs/whats_new_1_1.rst docs/whats_new_3_0.rst docs/_static/css/logo-adjustments.css examples/__init__.py examples/background_tasks.py examples/cli_app.py examples/client_auth.py examples/client_json.py examples/client_ws.py examples/curl.py examples/fake_server.py examples/lowlevel_srv.py examples/server.crt examples/server.csr examples/server.key examples/server_simple.py examples/static_files.py examples/web_classview.py examples/web_cookies.py examples/web_rewrite_headers_middleware.py examples/web_srv.py examples/web_srv_route_deco.py examples/web_srv_route_table.py examples/web_ws.py examples/websocket.html tests/aiohttp.jpg tests/aiohttp.png tests/conftest.py tests/data.unknown_mime_type tests/data.zero_bytes tests/hello.txt.gz tests/sample.txt tests/test___all__.py tests/test_base_protocol.py tests/test_classbasedview.py tests/test_client_connection.py tests/test_client_exceptions.py tests/test_client_fingerprint.py tests/test_client_functional.py tests/test_client_proto.py tests/test_client_request.py tests/test_client_response.py tests/test_client_session.py tests/test_client_ws.py tests/test_client_ws_functional.py tests/test_connector.py tests/test_cookiejar.py tests/test_flowcontrol_streams.py tests/test_formdata.py tests/test_helpers.py tests/test_http_exceptions.py tests/test_http_parser.py tests/test_http_writer.py tests/test_locks.py tests/test_loop.py tests/test_multipart.py tests/test_multipart_helpers.py tests/test_payload.py tests/test_proxy.py tests/test_proxy_functional.py tests/test_pytest_plugin.py tests/test_resolver.py tests/test_route_def.py tests/test_run_app.py tests/test_streams.py tests/test_tcp_helpers.py tests/test_test_utils.py tests/test_tracing.py tests/test_urldispatch.py tests/test_web_app.py tests/test_web_cli.py tests/test_web_exceptions.py tests/test_web_functional.py tests/test_web_log.py tests/test_web_middleware.py tests/test_web_request.py tests/test_web_request_handler.py tests/test_web_response.py tests/test_web_runner.py tests/test_web_sendfile.py tests/test_web_sendfile_functional.py tests/test_web_server.py tests/test_web_urldispatcher.py tests/test_web_websocket.py tests/test_web_websocket_functional.py tests/test_websocket_handshake.py tests/test_websocket_parser.py tests/test_websocket_writer.py tests/test_worker.py tests/autobahn/Dockerfile.aiohttp tests/autobahn/Dockerfile.autobahn tests/autobahn/test_autobahn.py tests/autobahn/client/client.py tests/autobahn/client/fuzzingserver.json tests/autobahn/server/fuzzingclient.json tests/autobahn/server/server.py vendor/llhttp/.dockerignore vendor/llhttp/.eslintrc.js vendor/llhttp/.git vendor/llhttp/.gitignore vendor/llhttp/CMakeLists.txt vendor/llhttp/CNAME vendor/llhttp/CODE_OF_CONDUCT.md vendor/llhttp/Dockerfile vendor/llhttp/LICENSE-MIT vendor/llhttp/Makefile vendor/llhttp/README.md vendor/llhttp/_config.yml vendor/llhttp/package-lock.json vendor/llhttp/package.json vendor/llhttp/tsconfig.json vendor/llhttp/tslint.json vendor/llhttp/.github/workflows/ci.yaml vendor/llhttp/bench/index.ts vendor/llhttp/bin/build_wasm.ts vendor/llhttp/bin/generate.ts vendor/llhttp/build/llhttp.h vendor/llhttp/build/c/llhttp.c vendor/llhttp/examples/wasm.ts vendor/llhttp/images/http-loose-none.png vendor/llhttp/images/http-strict-none.png vendor/llhttp/src/common.gypi vendor/llhttp/src/llhttp.gyp vendor/llhttp/src/llhttp.ts vendor/llhttp/src/llhttp/c-headers.ts vendor/llhttp/src/llhttp/constants.ts vendor/llhttp/src/llhttp/http.ts vendor/llhttp/src/llhttp/url.ts vendor/llhttp/src/llhttp/utils.ts vendor/llhttp/src/native/api.c vendor/llhttp/src/native/api.h vendor/llhttp/src/native/http.c vendor/llhttp/test/md-test.ts vendor/llhttp/test/url.md vendor/llhttp/test/fixtures/extra.c vendor/llhttp/test/fixtures/index.ts vendor/llhttp/test/fuzzers/fuzz_parser.c vendor/llhttp/test/request/connection.md vendor/llhttp/test/request/content-length.md vendor/llhttp/test/request/finish.md vendor/llhttp/test/request/invalid.md vendor/llhttp/test/request/lenient-headers.md vendor/llhttp/test/request/method.md vendor/llhttp/test/request/sample.md vendor/llhttp/test/request/transfer-encoding.md vendor/llhttp/test/request/uri.md vendor/llhttp/test/response/connection.md vendor/llhttp/test/response/content-length.md vendor/llhttp/test/response/finish.md vendor/llhttp/test/response/invalid.md vendor/llhttp/test/response/sample.md vendor/llhttp/test/response/transfer-encoding.md././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920322.0 aiohttp-3.8.1/aiohttp.egg-info/dependency_links.txt0000644000175100001710000000000100000000000021743 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920322.0 aiohttp-3.8.1/aiohttp.egg-info/not-zip-safe0000644000175100001710000000000100000000000020123 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920322.0 aiohttp-3.8.1/aiohttp.egg-info/requires.txt0000644000175100001710000000043700000000000020301 0ustar00runnerdockerattrs>=17.3.0 charset-normalizer<3.0,>=2.0 multidict<7.0,>=4.5 async_timeout<5.0,>=4.0.0a3 yarl<2.0,>=1.0 frozenlist>=1.1.1 aiosignal>=1.1.2 [:python_version < "3.7"] idna-ssl>=1.0 [:python_version < "3.8"] asynctest==0.13.0 typing_extensions>=3.7.4 [speedups] aiodns Brotli cchardet ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920322.0 aiohttp-3.8.1/aiohttp.egg-info/top_level.txt0000644000175100001710000000001000000000000020416 0ustar00runnerdockeraiohttp ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0144515 aiohttp-3.8.1/docs/0000755000175100001710000000000000000000000013463 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/Makefile0000644000175100001710000001535600000000000015135 0ustar00runnerdocker# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = -W --keep-going -n SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/aiohttp.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/aiohttp.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/aiohttp" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/aiohttp" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." spelling: $(SPHINXBUILD) -b spelling $(ALLSPHINXOPTS) $(BUILDDIR)/spelling @echo @echo "Build finished." ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920322.9864511 aiohttp-3.8.1/docs/_static/0000755000175100001710000000000000000000000015111 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0184517 aiohttp-3.8.1/docs/_static/css/0000755000175100001710000000000000000000000015701 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/_static/css/logo-adjustments.css0000644000175100001710000000015600000000000021714 0ustar00runnerdocker.sphinxsidebarwrapper>h1.logo { display: none; } .sphinxsidebarwrapper>p.logo>a>img.logo { width: 65%; } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/abc.rst0000644000175100001710000001324600000000000014750 0ustar00runnerdocker.. _aiohttp-abc: Abstract Base Classes ===================== .. module:: aiohttp.abc Abstract routing ---------------- aiohttp has abstract classes for managing web interfaces. The most part of :mod:`aiohttp.web` is not intended to be inherited but few of them are. aiohttp.web is built on top of few concepts: *application*, *router*, *request* and *response*. *router* is a *plugable* part: a library user may build a *router* from scratch, all other parts should work with new router seamlessly. :class:`aiohttp.abc.AbstractRouter` has the only mandatory method: :meth:`aiohttp.abc.AbstractRouter.resolve` coroutine. It must return an :class:`aiohttp.abc.AbstractMatchInfo` instance. If the requested URL handler is found :meth:`aiohttp.abc.AbstractMatchInfo.handler` is a :term:`web-handler` for requested URL and :attr:`aiohttp.abc.AbstractMatchInfo.http_exception` is ``None``. Otherwise :attr:`aiohttp.abc.AbstractMatchInfo.http_exception` is an instance of :exc:`~aiohttp.web.HTTPException` like *404: NotFound* or *405: Method Not Allowed*. :meth:`aiohttp.abc.AbstractMatchInfo.handler` raises :attr:`~aiohttp.abc.AbstractMatchInfo.http_exception` on call. .. class:: AbstractRouter Abstract router, :class:`aiohttp.web.Application` accepts it as *router* parameter and returns as :attr:`aiohttp.web.Application.router`. .. coroutinemethod:: resolve(request) Performs URL resolving. It's an abstract method, should be overridden in *router* implementation. :param request: :class:`aiohttp.web.Request` instance for resolving, the request has :attr:`aiohttp.web.Request.match_info` equals to ``None`` at resolving stage. :return: :class:`aiohttp.abc.AbstractMatchInfo` instance. .. class:: AbstractMatchInfo Abstract *match info*, returned by :meth:`aiohttp.abc.AbstractRouter.resolve` call. .. attribute:: http_exception :exc:`aiohttp.web.HTTPException` if no match was found, ``None`` otherwise. .. coroutinemethod:: handler(request) Abstract method performing :term:`web-handler` processing. :param request: :class:`aiohttp.web.Request` instance for resolving, the request has :attr:`aiohttp.web.Request.match_info` equals to ``None`` at resolving stage. :return: :class:`aiohttp.web.StreamResponse` or descendants. :raise: :class:`aiohttp.web.HTTPException` on error .. coroutinemethod:: expect_handler(request) Abstract method for handling *100-continue* processing. Abstract Class Based Views -------------------------- For *class based view* support aiohttp has abstract :class:`AbstractView` class which is *awaitable* (may be uses like ``await Cls()`` or ``yield from Cls()`` and has a *request* as an attribute. .. class:: AbstractView An abstract class, base for all *class based views* implementations. Methods ``__iter__`` and ``__await__`` should be overridden. .. attribute:: request :class:`aiohttp.web.Request` instance for performing the request. Abstract Cookie Jar ------------------- .. class:: AbstractCookieJar The cookie jar instance is available as :attr:`aiohttp.ClientSession.cookie_jar`. The jar contains :class:`~http.cookies.Morsel` items for storing internal cookie data. API provides a count of saved cookies:: len(session.cookie_jar) These cookies may be iterated over:: for cookie in session.cookie_jar: print(cookie.key) print(cookie["domain"]) An abstract class for cookie storage. Implements :class:`collections.abc.Iterable` and :class:`collections.abc.Sized`. .. method:: update_cookies(cookies, response_url=None) Update cookies returned by server in ``Set-Cookie`` header. :param cookies: a :class:`collections.abc.Mapping` (e.g. :class:`dict`, :class:`~http.cookies.SimpleCookie`) or *iterable* of *pairs* with cookies returned by server's response. :param str response_url: URL of response, ``None`` for *shared cookies*. Regular cookies are coupled with server's URL and are sent only to this server, shared ones are sent in every client request. .. method:: filter_cookies(request_url) Return jar's cookies acceptable for URL and available in ``Cookie`` header for sending client requests for given URL. :param str response_url: request's URL for which cookies are asked. :return: :class:`http.cookies.SimpleCookie` with filtered cookies for given URL. .. method:: clear(predicate=None) Removes all cookies from the jar if the predicate is ``None``. Otherwise remove only those :class:`~http.cookies.Morsel` that ``predicate(morsel)`` returns ``True``. :param predicate: callable that gets :class:`~http.cookies.Morsel` as a parameter and returns ``True`` if this :class:`~http.cookies.Morsel` must be deleted from the jar. .. versionadded:: 3.8 .. method:: clear_domain(domain) Remove all cookies from the jar that belongs to the specified domain or its subdomains. :param str domain: domain for which cookies must be deleted from the jar. .. versionadded:: 3.8 Abstract Access Logger ------------------------------- .. class:: AbstractAccessLogger An abstract class, base for all :class:`aiohttp.web.RequestHandler` ``access_logger`` implementations Method ``log`` should be overridden. .. method:: log(request, response, time) :param request: :class:`aiohttp.web.Request` object. :param response: :class:`aiohttp.web.Response` object. :param float time: Time taken to serve the request. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/aiohttp-icon.svg0000644000175100001710000000453700000000000016613 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/aiohttp-plain.svg0000644000175100001710000000453500000000000016764 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/built_with.rst0000644000175100001710000000247300000000000016375 0ustar00runnerdocker.. _aiohttp-built-with: Built with aiohttp ================== aiohttp is used to build useful libraries built on top of it, and there's a page dedicated to list them: :ref:`aiohttp-3rd-party`. There are also projects that leverage the power of aiohttp to provide end-user tools, like command lines or software with full user interfaces. This page aims to list those projects. If you are using aiohttp in your software and if it's playing a central role, you can add it here in this list. You can also add a **Built with aiohttp** link somewhere in your project, pointing to ``_. * `Pulp `_ Platform for managing repositories of software packages and making them available to consumers. * `Molotov `_ Load testing tool. * `Arsenic `_ Async WebDriver. * `Home Assistant `_ Home Automation Platform. * `Backend.AI `_ Code execution API service. * `doh-proxy `_ DNS Over HTTPS Proxy. * `Mariner `_ Command-line torrent searcher. * `DEEPaaS API `_ REST API for Machine learning, Deep learning and artificial intelligence applications. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/changes.rst0000644000175100001710000000044700000000000015632 0ustar00runnerdocker.. _aiohttp_changes: ========= Changelog ========= To be included in v\ |release| (if present) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. towncrier-draft-entries:: |release| [UNRELEASED DRAFT] Released versions ^^^^^^^^^^^^^^^^^ .. include:: ../CHANGES.rst .. include:: ../HISTORY.rst ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/client.rst0000644000175100001710000000054600000000000015500 0ustar00runnerdocker.. _aiohttp-client: Client ====== .. currentmodule:: aiohttp The page contains all information about aiohttp Client API: .. toctree:: :name: client Quickstart Advanced Usage Reference Tracing Reference The aiohttp Request Lifecycle ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/client_advanced.rst0000644000175100001710000005365400000000000017335 0ustar00runnerdocker.. _aiohttp-client-advanced: Advanced Client Usage ===================== .. currentmodule:: aiohttp .. _aiohttp-client-session: Client Session -------------- :class:`ClientSession` is the heart and the main entry point for all client API operations. Create the session first, use the instance for performing HTTP requests and initiating WebSocket connections. The session contains a cookie storage and connection pool, thus cookies and connections are shared between HTTP requests sent by the same session. Custom Request Headers ---------------------- If you need to add HTTP headers to a request, pass them in a :class:`dict` to the *headers* parameter. For example, if you want to specify the content-type directly:: url = 'http://example.com/image' payload = b'GIF89a\x01\x00\x01\x00\x00\xff\x00,\x00\x00' b'\x00\x00\x01\x00\x01\x00\x00\x02\x00;' headers = {'content-type': 'image/gif'} await session.post(url, data=payload, headers=headers) You also can set default headers for all session requests:: headers={"Authorization": "Basic bG9naW46cGFzcw=="} async with aiohttp.ClientSession(headers=headers) as session: async with session.get("http://httpbin.org/headers") as r: json_body = await r.json() assert json_body['headers']['Authorization'] == \ 'Basic bG9naW46cGFzcw==' Typical use case is sending JSON body. You can specify content type directly as shown above, but it is more convenient to use special keyword ``json``:: await session.post(url, json={'example': 'text'}) For *text/plain* :: await session.post(url, data='Привет, Мир!') .. note:: ``Authorization`` header will be removed if you get redirected to a different host or protocol. Custom Cookies -------------- To send your own cookies to the server, you can use the *cookies* parameter of :class:`ClientSession` constructor:: url = 'http://httpbin.org/cookies' cookies = {'cookies_are': 'working'} async with ClientSession(cookies=cookies) as session: async with session.get(url) as resp: assert await resp.json() == { "cookies": {"cookies_are": "working"}} .. note:: ``httpbin.org/cookies`` endpoint returns request cookies in JSON-encoded body. To access session cookies see :attr:`ClientSession.cookie_jar`. :class:`~aiohttp.ClientSession` may be used for sharing cookies between multiple requests:: async with aiohttp.ClientSession() as session: await session.get( 'http://httpbin.org/cookies/set?my_cookie=my_value') filtered = session.cookie_jar.filter_cookies( 'http://httpbin.org') assert filtered['my_cookie'].value == 'my_value' async with session.get('http://httpbin.org/cookies') as r: json_body = await r.json() assert json_body['cookies']['my_cookie'] == 'my_value' Response Headers and Cookies ---------------------------- We can view the server's response :attr:`ClientResponse.headers` using a :class:`~multidict.CIMultiDictProxy`:: assert resp.headers == { 'ACCESS-CONTROL-ALLOW-ORIGIN': '*', 'CONTENT-TYPE': 'application/json', 'DATE': 'Tue, 15 Jul 2014 16:49:51 GMT', 'SERVER': 'gunicorn/18.0', 'CONTENT-LENGTH': '331', 'CONNECTION': 'keep-alive'} The dictionary is special, though: it's made just for HTTP headers. According to `RFC 7230 `_, HTTP Header names are case-insensitive. It also supports multiple values for the same key as HTTP protocol does. So, we can access the headers using any capitalization we want:: assert resp.headers['Content-Type'] == 'application/json' assert resp.headers.get('content-type') == 'application/json' All headers are converted from binary data using UTF-8 with ``surrogateescape`` option. That works fine on most cases but sometimes unconverted data is needed if a server uses nonstandard encoding. While these headers are malformed from :rfc:`7230` perspective they may be retrieved by using :attr:`ClientResponse.raw_headers` property:: assert resp.raw_headers == ( (b'SERVER', b'nginx'), (b'DATE', b'Sat, 09 Jan 2016 20:28:40 GMT'), (b'CONTENT-TYPE', b'text/html; charset=utf-8'), (b'CONTENT-LENGTH', b'12150'), (b'CONNECTION', b'keep-alive')) If a response contains some *HTTP Cookies*, you can quickly access them:: url = 'http://example.com/some/cookie/setting/url' async with session.get(url) as resp: print(resp.cookies['example_cookie_name']) .. note:: Response cookies contain only values, that were in ``Set-Cookie`` headers of the **last** request in redirection chain. To gather cookies between all redirection requests please use :ref:`aiohttp.ClientSession ` object. Redirection History ------------------- If a request was redirected, it is possible to view previous responses using the :attr:`~ClientResponse.history` attribute:: resp = await session.get('http://example.com/some/redirect/') assert resp.status == 200 assert resp.url = URL('http://example.com/some/other/url/') assert len(resp.history) == 1 assert resp.history[0].status == 301 assert resp.history[0].url = URL( 'http://example.com/some/redirect/') If no redirects occurred or ``allow_redirects`` is set to ``False``, history will be an empty sequence. Cookie Jar ---------- .. _aiohttp-client-cookie-safety: Cookie Safety ^^^^^^^^^^^^^ By default :class:`~aiohttp.ClientSession` uses strict version of :class:`aiohttp.CookieJar`. :rfc:`2109` explicitly forbids cookie accepting from URLs with IP address instead of DNS name (e.g. ``http://127.0.0.1:80/cookie``). It's good but sometimes for testing we need to enable support for such cookies. It should be done by passing ``unsafe=True`` to :class:`aiohttp.CookieJar` constructor:: jar = aiohttp.CookieJar(unsafe=True) session = aiohttp.ClientSession(cookie_jar=jar) .. _aiohttp-client-cookie-quoting-routine: Cookie Quoting Routine ^^^^^^^^^^^^^^^^^^^^^^ The client uses the :class:`~aiohttp.SimpleCookie` quoting routines conform to the :rfc:`2109`, which in turn references the character definitions from :rfc:`2068`. They provide a two-way quoting algorithm where any non-text character is translated into a 4 character sequence: a forward-slash followed by the three-digit octal equivalent of the character. Any ``\`` or ``"`` is quoted with a preceding ``\`` slash. Because of the way browsers really handle cookies (as opposed to what the RFC says) we also encode ``,`` and ``;``. Some backend systems does not support quoted cookies. You can skip this quotation routine by passing ``quote_cookie=False`` to the :class:`~aiohttp.CookieJar` constructor:: jar = aiohttp.CookieJar(quote_cookie=False) session = aiohttp.ClientSession(cookie_jar=jar) .. _aiohttp-client-dummy-cookie-jar: Dummy Cookie Jar ^^^^^^^^^^^^^^^^ Sometimes cookie processing is not desirable. For this purpose it's possible to pass :class:`aiohttp.DummyCookieJar` instance into client session:: jar = aiohttp.DummyCookieJar() session = aiohttp.ClientSession(cookie_jar=jar) Uploading pre-compressed data ----------------------------- To upload data that is already compressed before passing it to aiohttp, call the request function with the used compression algorithm name (usually ``deflate`` or ``gzip``) as the value of the ``Content-Encoding`` header:: async def my_coroutine(session, headers, my_data): data = zlib.compress(my_data) headers = {'Content-Encoding': 'deflate'} async with session.post('http://httpbin.org/post', data=data, headers=headers) pass Disabling content type validation for JSON responses ---------------------------------------------------- The standard explicitly restricts JSON ``Content-Type`` HTTP header to ``application/json`` or any extended form, e.g. ``application/vnd.custom-type+json``. Unfortunately, some servers send a wrong type, like ``text/html``. This can be worked around in two ways: 1. Pass the expected type explicitly (in this case checking will be strict, without the extended form support, so ``custom/xxx+type`` won't be accepted): ``await resp.json(content_type='custom/type')``. 2. Disable the check entirely: ``await resp.json(content_type=None)``. .. _aiohttp-client-tracing: Client Tracing -------------- The execution flow of a specific request can be followed attaching listeners coroutines to the signals provided by the :class:`TraceConfig` instance, this instance will be used as a parameter for the :class:`ClientSession` constructor having as a result a client that triggers the different signals supported by the :class:`TraceConfig`. By default any instance of :class:`ClientSession` class comes with the signals ability disabled. The following snippet shows how the start and the end signals of a request flow can be followed:: async def on_request_start( session, trace_config_ctx, params): print("Starting request") async def on_request_end(session, trace_config_ctx, params): print("Ending request") trace_config = aiohttp.TraceConfig() trace_config.on_request_start.append(on_request_start) trace_config.on_request_end.append(on_request_end) async with aiohttp.ClientSession( trace_configs=[trace_config]) as client: client.get('http://example.com/some/redirect/') The ``trace_configs`` is a list that can contain instances of :class:`TraceConfig` class that allow run the signals handlers coming from different :class:`TraceConfig` instances. The following example shows how two different :class:`TraceConfig` that have a different nature are installed to perform their job in each signal handle:: from mylib.traceconfig import AuditRequest from mylib.traceconfig import XRay async with aiohttp.ClientSession( trace_configs=[AuditRequest(), XRay()]) as client: client.get('http://example.com/some/redirect/') All signals take as a parameters first, the :class:`ClientSession` instance used by the specific request related to that signals and second, a :class:`~types.SimpleNamespace` instance called ``trace_config_ctx``. The ``trace_config_ctx`` object can be used to share the state through to the different signals that belong to the same request and to the same :class:`TraceConfig` class, perhaps:: async def on_request_start( session, trace_config_ctx, params): trace_config_ctx.start = asyncio.get_event_loop().time() async def on_request_end(session, trace_config_ctx, params): elapsed = asyncio.get_event_loop().time() - trace_config_ctx.start print("Request took {}".format(elapsed)) The ``trace_config_ctx`` param is by default a :class:`~types.SimpleNamespace` that is initialized at the beginning of the request flow. However, the factory used to create this object can be overwritten using the ``trace_config_ctx_factory`` constructor param of the :class:`TraceConfig` class. The ``trace_request_ctx`` param can given at the beginning of the request execution, accepted by all of the HTTP verbs, and will be passed as a keyword argument for the ``trace_config_ctx_factory`` factory. This param is useful to pass data that is only available at request time, perhaps:: async def on_request_start( session, trace_config_ctx, params): print(trace_config_ctx.trace_request_ctx) session.get('http://example.com/some/redirect/', trace_request_ctx={'foo': 'bar'}) .. seealso:: :ref:`aiohttp-client-tracing-reference` section for more information about the different signals supported. Connectors ---------- To tweak or change *transport* layer of requests you can pass a custom *connector* to :class:`~aiohttp.ClientSession` and family. For example:: conn = aiohttp.TCPConnector() session = aiohttp.ClientSession(connector=conn) .. note:: By default *session* object takes the ownership of the connector, among other things closing the connections once the *session* is closed. If you are keen on share the same *connector* through different *session* instances you must give the *connector_owner* parameter as **False** for each *session* instance. .. seealso:: :ref:`aiohttp-client-reference-connectors` section for more information about different connector types and configuration options. Limiting connection pool size ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To limit amount of simultaneously opened connections you can pass *limit* parameter to *connector*:: conn = aiohttp.TCPConnector(limit=30) The example limits total amount of parallel connections to `30`. The default is `100`. If you explicitly want not to have limits, pass `0`. For example:: conn = aiohttp.TCPConnector(limit=0) To limit amount of simultaneously opened connection to the same endpoint (``(host, port, is_ssl)`` triple) you can pass *limit_per_host* parameter to *connector*:: conn = aiohttp.TCPConnector(limit_per_host=30) The example limits amount of parallel connections to the same to `30`. The default is `0` (no limit on per host bases). Tuning the DNS cache ^^^^^^^^^^^^^^^^^^^^ By default :class:`~aiohttp.TCPConnector` comes with the DNS cache table enabled, and resolutions will be cached by default for `10` seconds. This behavior can be changed either to change of the TTL for a resolution, as can be seen in the following example:: conn = aiohttp.TCPConnector(ttl_dns_cache=300) or disabling the use of the DNS cache table, meaning that all requests will end up making a DNS resolution, as the following example shows:: conn = aiohttp.TCPConnector(use_dns_cache=False) Resolving using custom nameservers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In order to specify the nameservers to when resolving the hostnames, :term:`aiodns` is required:: from aiohttp.resolver import AsyncResolver resolver = AsyncResolver(nameservers=["8.8.8.8", "8.8.4.4"]) conn = aiohttp.TCPConnector(resolver=resolver) Unix domain sockets ^^^^^^^^^^^^^^^^^^^ If your HTTP server uses UNIX domain sockets you can use :class:`~aiohttp.UnixConnector`:: conn = aiohttp.UnixConnector(path='/path/to/socket') session = aiohttp.ClientSession(connector=conn) Named pipes in Windows ^^^^^^^^^^^^^^^^^^^^^^ If your HTTP server uses Named pipes you can use :class:`~aiohttp.NamedPipeConnector`:: conn = aiohttp.NamedPipeConnector(path=r'\\.\pipe\') session = aiohttp.ClientSession(connector=conn) It will only work with the ProactorEventLoop SSL control for TCP sockets --------------------------- By default *aiohttp* uses strict checks for HTTPS protocol. Certification checks can be relaxed by setting *ssl* to ``False``:: r = await session.get('https://example.com', ssl=False) If you need to setup custom ssl parameters (use own certification files for example) you can create a :class:`ssl.SSLContext` instance and pass it into the proper :class:`ClientSession` method:: sslcontext = ssl.create_default_context( cafile='/path/to/ca-bundle.crt') r = await session.get('https://example.com', ssl=sslcontext) If you need to verify *self-signed* certificates, you can do the same thing as the previous example, but add another call to :meth:`ssl.SSLContext.load_cert_chain` with the key pair:: sslcontext = ssl.create_default_context( cafile='/path/to/ca-bundle.crt') sslcontext.load_cert_chain('/path/to/client/public/device.pem', '/path/to/client/private/device.key') r = await session.get('https://example.com', ssl=sslcontext) There is explicit errors when ssl verification fails :class:`aiohttp.ClientConnectorSSLError`:: try: await session.get('https://expired.badssl.com/') except aiohttp.ClientConnectorSSLError as e: assert isinstance(e, ssl.SSLError) :class:`aiohttp.ClientConnectorCertificateError`:: try: await session.get('https://wrong.host.badssl.com/') except aiohttp.ClientConnectorCertificateError as e: assert isinstance(e, ssl.CertificateError) If you need to skip both ssl related errors :class:`aiohttp.ClientSSLError`:: try: await session.get('https://expired.badssl.com/') except aiohttp.ClientSSLError as e: assert isinstance(e, ssl.SSLError) try: await session.get('https://wrong.host.badssl.com/') except aiohttp.ClientSSLError as e: assert isinstance(e, ssl.CertificateError) You may also verify certificates via *SHA256* fingerprint:: # Attempt to connect to https://www.python.org # with a pin to a bogus certificate: bad_fp = b'0'*64 exc = None try: r = await session.get('https://www.python.org', ssl=aiohttp.Fingerprint(bad_fp)) except aiohttp.FingerprintMismatch as e: exc = e assert exc is not None assert exc.expected == bad_fp # www.python.org cert's actual fingerprint assert exc.got == b'...' Note that this is the fingerprint of the DER-encoded certificate. If you have the certificate in PEM format, you can convert it to DER with e.g:: openssl x509 -in crt.pem -inform PEM -outform DER > crt.der .. note:: Tip: to convert from a hexadecimal digest to a binary byte-string, you can use :func:`binascii.unhexlify`. *ssl* parameter could be passed to :class:`TCPConnector` as default, the value from :meth:`ClientSession.get` and others override default. Proxy support ------------- aiohttp supports plain HTTP proxies and HTTP proxies that can be upgraded to HTTPS via the HTTP CONNECT method. aiohttp has a limited support for proxies that must be connected to via ``https://`` — see the info box below for more details. To connect, use the *proxy* parameter:: async with aiohttp.ClientSession() as session: async with session.get("http://python.org", proxy="http://proxy.com") as resp: print(resp.status) It also supports proxy authorization:: async with aiohttp.ClientSession() as session: proxy_auth = aiohttp.BasicAuth('user', 'pass') async with session.get("http://python.org", proxy="http://proxy.com", proxy_auth=proxy_auth) as resp: print(resp.status) Authentication credentials can be passed in proxy URL:: session.get("http://python.org", proxy="http://user:pass@some.proxy.com") Contrary to the ``requests`` library, it won't read environment variables by default. But you can do so by passing ``trust_env=True`` into :class:`aiohttp.ClientSession` constructor for extracting proxy configuration from *HTTP_PROXY*, *HTTPS_PROXY*, *WS_PROXY* or *WSS_PROXY* *environment variables* (all are case insensitive):: async with aiohttp.ClientSession(trust_env=True) as session: async with session.get("http://python.org") as resp: print(resp.status) .. versionadded:: 3.8 *WS_PROXY* and *WSS_PROXY* are supported since aiohttp v3.8. Proxy credentials are given from ``~/.netrc`` file if present (see :class:`aiohttp.ClientSession` for more details). .. attention:: CPython has introduced the support for TLS in TLS around Python 3.7. But, as of now (Python 3.10), it's disabled for the transports that :py:mod:`asyncio` uses. If the further release of Python (say v3.11) toggles one attribute, it'll *just work™*. aiohttp v3.8 and higher is ready for this to happen and has code in place supports TLS-in-TLS, hence sending HTTPS requests over HTTPS proxy tunnels. ⚠️ For as long as your Python runtime doesn't declare the support for TLS-in-TLS, please don't file bugs with aiohttp but rather try to help the CPython upstream enable this feature. Meanwhile, if you *really* need this to work, there's a patch that may help you make it happen, include it into your app's code base: https://github.com/aio-libs/aiohttp/discussions/6044#discussioncomment-1432443. .. important:: When supplying a custom :py:class:`ssl.SSLContext` instance, bear in mind that it will be used not only to establish a TLS session with the HTTPS endpoint you're hitting but also to establish a TLS tunnel to the HTTPS proxy. To avoid surprises, make sure to set up the trust chain that would recognize TLS certificates used by both the endpoint and the proxy. Graceful Shutdown ----------------- When :class:`ClientSession` closes at the end of an ``async with`` block (or through a direct :meth:`ClientSession.close()` call), the underlying connection remains open due to asyncio internal details. In practice, the underlying connection will close after a short while. However, if the event loop is stopped before the underlying connection is closed, a ``ResourceWarning: unclosed transport`` warning is emitted (when warnings are enabled). To avoid this situation, a small delay must be added before closing the event loop to allow any open underlying connections to close. For a :class:`ClientSession` without SSL, a simple zero-sleep (``await asyncio.sleep(0)``) will suffice:: async def read_website(): async with aiohttp.ClientSession() as session: async with session.get('http://example.org/') as resp: await resp.read() loop = asyncio.get_event_loop() loop.run_until_complete(read_website()) # Zero-sleep to allow underlying connections to close loop.run_until_complete(asyncio.sleep(0)) loop.close() For a :class:`ClientSession` with SSL, the application must wait a short duration before closing:: ... # Wait 250 ms for the underlying SSL connections to close loop.run_until_complete(asyncio.sleep(0.250)) loop.close() Note that the appropriate amount of time to wait will vary from application to application. All if this will eventually become obsolete when the asyncio internals are changed so that aiohttp itself can wait on the underlying connection to close. Please follow issue `#1925 `_ for the progress on this. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/client_quickstart.rst0000644000175100001710000003616500000000000017760 0ustar00runnerdocker.. _aiohttp-client-quickstart: =================== Client Quickstart =================== .. currentmodule:: aiohttp Eager to get started? This page gives a good introduction in how to get started with aiohttp client API. First, make sure that aiohttp is :ref:`installed ` and *up-to-date* Let's get started with some simple examples. Make a Request ============== Begin by importing the aiohttp module, and asyncio:: import aiohttp import asyncio Now, let's try to get a web-page. For example let's query ``http://httpbin.org/get``:: async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://httpbin.org/get') as resp: print(resp.status) print(await resp.text()) asyncio.run(main) Now, we have a :class:`ClientSession` called ``session`` and a :class:`ClientResponse` object called ``resp``. We can get all the information we need from the response. The mandatory parameter of :meth:`ClientSession.get` coroutine is an HTTP *url* (:class:`str` or class:`yarl.URL` instance). In order to make an HTTP POST request use :meth:`ClientSession.post` coroutine:: session.post('http://httpbin.org/post', data=b'data') Other HTTP methods are available as well:: session.put('http://httpbin.org/put', data=b'data') session.delete('http://httpbin.org/delete') session.head('http://httpbin.org/get') session.options('http://httpbin.org/get') session.patch('http://httpbin.org/patch', data=b'data') To make several requests to the same site more simple, the parameter ``base_url`` of :class:`ClientSession` constructor can be used. For example to request different endpoints of ``http://httpbin.org`` can be used the following code:: async with aiohttp.ClientSession('http://httpbin.org') as session: async with session.get('/get'): pass async with session.post('/post', data=b'data'): pass async with session.put('/put', data=b'data'): pass .. note:: Don't create a session per request. Most likely you need a session per application which performs all requests altogether. More complex cases may require a session per site, e.g. one for Github and other one for Facebook APIs. Anyway making a session for every request is a **very bad** idea. A session contains a connection pool inside. Connection reusage and keep-alives (both are on by default) may speed up total performance. A session context manager usage is not mandatory but ``await session.close()`` method should be called in this case, e.g.:: session = aiohttp.ClientSession() async with session.get('...'): # ... await session.close() Passing Parameters In URLs ========================== You often want to send some sort of data in the URL's query string. If you were constructing the URL by hand, this data would be given as key/value pairs in the URL after a question mark, e.g. ``httpbin.org/get?key=val``. Requests allows you to provide these arguments as a :class:`dict`, using the ``params`` keyword argument. As an example, if you wanted to pass ``key1=value1`` and ``key2=value2`` to ``httpbin.org/get``, you would use the following code:: params = {'key1': 'value1', 'key2': 'value2'} async with session.get('http://httpbin.org/get', params=params) as resp: expect = 'http://httpbin.org/get?key1=value1&key2=value2' assert str(resp.url) == expect You can see that the URL has been correctly encoded by printing the URL. For sending data with multiple values for the same key :class:`~multidict.MultiDict` may be used; the library support nested lists (``{'key': ['value1', 'value2']}``) alternative as well. It is also possible to pass a list of 2 item tuples as parameters, in that case you can specify multiple values for each key:: params = [('key', 'value1'), ('key', 'value2')] async with session.get('http://httpbin.org/get', params=params) as r: expect = 'http://httpbin.org/get?key=value2&key=value1' assert str(r.url) == expect You can also pass :class:`str` content as param, but beware -- content is not encoded by library. Note that ``+`` is not encoded:: async with session.get('http://httpbin.org/get', params='key=value+1') as r: assert str(r.url) == 'http://httpbin.org/get?key=value+1' .. note:: *aiohttp* internally performs URL canonicalization before sending request. Canonicalization encodes *host* part by :term:`IDNA` codec and applies :term:`requoting` to *path* and *query* parts. For example ``URL('http://example.com/путь/%30?a=%31')`` is converted to ``URL('http://example.com/%D0%BF%D1%83%D1%82%D1%8C/0?a=1')``. Sometimes canonicalization is not desirable if server accepts exact representation and does not requote URL itself. To disable canonicalization use ``encoded=True`` parameter for URL construction:: await session.get( URL('http://example.com/%30', encoded=True)) .. warning:: Passing *params* overrides ``encoded=True``, never use both options. Response Content and Status Code ================================ We can read the content of the server's response and its status code. Consider the GitHub time-line again:: async with session.get('https://api.github.com/events') as resp: print(resp.status) print(await resp.text()) prints out something like:: 200 '[{"created_at":"2015-06-12T14:06:22Z","public":true,"actor":{... ``aiohttp`` automatically decodes the content from the server. You can specify custom encoding for the :meth:`~ClientResponse.text` method:: await resp.text(encoding='windows-1251') Binary Response Content ======================= You can also access the response body as bytes, for non-text requests:: print(await resp.read()) :: b'[{"created_at":"2015-06-12T14:06:22Z","public":true,"actor":{... The ``gzip`` and ``deflate`` transfer-encodings are automatically decoded for you. You can enable ``brotli`` transfer-encodings support, just install `brotli `_. JSON Request ============ Any of session's request methods like :func:`request`, :meth:`ClientSession.get`, :meth:`ClientSession.post` etc. accept `json` parameter:: async with aiohttp.ClientSession() as session: async with session.post(url, json={'test': 'object'}) By default session uses python's standard :mod:`json` module for serialization. But it is possible to use different ``serializer``. :class:`ClientSession` accepts ``json_serialize`` parameter:: import ujson async with aiohttp.ClientSession( json_serialize=ujson.dumps) as session: await session.post(url, json={'test': 'object'}) .. note:: ``ujson`` library is faster than standard :mod:`json` but slightly incompatible. JSON Response Content ===================== There's also a built-in JSON decoder, in case you're dealing with JSON data:: async with session.get('https://api.github.com/events') as resp: print(await resp.json()) In case that JSON decoding fails, :meth:`~ClientResponse.json` will raise an exception. It is possible to specify custom encoding and decoder functions for the :meth:`~ClientResponse.json` call. .. note:: The methods above reads the whole response body into memory. If you are planning on reading lots of data, consider using the streaming response method documented below. Streaming Response Content ========================== While methods :meth:`~ClientResponse.read`, :meth:`~ClientResponse.json` and :meth:`~ClientResponse.text` are very convenient you should use them carefully. All these methods load the whole response in memory. For example if you want to download several gigabyte sized files, these methods will load all the data in memory. Instead you can use the :attr:`~ClientResponse.content` attribute. It is an instance of the :class:`aiohttp.StreamReader` class. The ``gzip`` and ``deflate`` transfer-encodings are automatically decoded for you:: async with session.get('https://api.github.com/events') as resp: await resp.content.read(10) In general, however, you should use a pattern like this to save what is being streamed to a file:: with open(filename, 'wb') as fd: async for chunk in resp.content.iter_chunked(chunk_size): fd.write(chunk) It is not possible to use :meth:`~ClientResponse.read`, :meth:`~ClientResponse.json` and :meth:`~ClientResponse.text` after explicit reading from :attr:`~ClientResponse.content`. More complicated POST requests ============================== Typically, you want to send some form-encoded data -- much like an HTML form. To do this, simply pass a dictionary to the *data* argument. Your dictionary of data will automatically be form-encoded when the request is made:: payload = {'key1': 'value1', 'key2': 'value2'} async with session.post('http://httpbin.org/post', data=payload) as resp: print(await resp.text()) :: { ... "form": { "key2": "value2", "key1": "value1" }, ... } If you want to send data that is not form-encoded you can do it by passing a :class:`bytes` instead of a :class:`dict`. This data will be posted directly and content-type set to 'application/octet-stream' by default:: async with session.post(url, data=b'\x00Binary-data\x00') as resp: ... If you want to send JSON data:: async with session.post(url, json={'example': 'test'}) as resp: ... To send text with appropriate content-type just use ``data`` argument:: async with session.post(url, data='Тест') as resp: ... POST a Multipart-Encoded File ============================= To upload Multipart-encoded files:: url = 'http://httpbin.org/post' files = {'file': open('report.xls', 'rb')} await session.post(url, data=files) You can set the ``filename`` and ``content_type`` explicitly:: url = 'http://httpbin.org/post' data = FormData() data.add_field('file', open('report.xls', 'rb'), filename='report.xls', content_type='application/vnd.ms-excel') await session.post(url, data=data) If you pass a file object as data parameter, aiohttp will stream it to the server automatically. Check :class:`~aiohttp.StreamReader` for supported format information. .. seealso:: :ref:`aiohttp-multipart` Streaming uploads ================= :mod:`aiohttp` supports multiple types of streaming uploads, which allows you to send large files without reading them into memory. As a simple case, simply provide a file-like object for your body:: with open('massive-body', 'rb') as f: await session.post('http://httpbin.org/post', data=f) Or you can use *asynchronous generator*:: async def file_sender(file_name=None): async with aiofiles.open(file_name, 'rb') as f: chunk = await f.read(64*1024) while chunk: yield chunk chunk = await f.read(64*1024) # Then you can use file_sender as a data provider: async with session.post('http://httpbin.org/post', data=file_sender(file_name='huge_file')) as resp: print(await resp.text()) Because the :attr:`~aiohttp.ClientResponse.content` attribute is a :class:`~aiohttp.StreamReader` (provides async iterator protocol), you can chain get and post requests together:: resp = await session.get('http://python.org') await session.post('http://httpbin.org/post', data=resp.content) .. note:: Python 3.5 has no native support for asynchronous generators, use ``async_generator`` library as workaround. .. deprecated:: 3.1 ``aiohttp`` still supports ``aiohttp.streamer`` decorator but this approach is deprecated in favor of *asynchronous generators* as shown above. .. _aiohttp-client-websockets: WebSockets ========== :mod:`aiohttp` works with client websockets out-of-the-box. You have to use the :meth:`aiohttp.ClientSession.ws_connect` coroutine for client websocket connection. It accepts a *url* as a first parameter and returns :class:`ClientWebSocketResponse`, with that object you can communicate with websocket server using response's methods:: async with session.ws_connect('http://example.org/ws') as ws: async for msg in ws: if msg.type == aiohttp.WSMsgType.TEXT: if msg.data == 'close cmd': await ws.close() break else: await ws.send_str(msg.data + '/answer') elif msg.type == aiohttp.WSMsgType.ERROR: break You **must** use the only websocket task for both reading (e.g. ``await ws.receive()`` or ``async for msg in ws:``) and writing but may have multiple writer tasks which can only send data asynchronously (by ``await ws.send_str('data')`` for example). .. _aiohttp-client-timeouts: Timeouts ======== Timeout settings are stored in :class:`ClientTimeout` data structure. By default *aiohttp* uses a *total* 300 seconds (5min) timeout, it means that the whole operation should finish in 5 minutes. The value could be overridden by *timeout* parameter for the session (specified in seconds):: timeout = aiohttp.ClientTimeout(total=60) async with aiohttp.ClientSession(timeout=timeout) as session: ... Timeout could be overridden for a request like :meth:`ClientSession.get`:: async with session.get(url, timeout=timeout) as resp: ... Supported :class:`ClientTimeout` fields are: ``total`` The maximal number of seconds for the whole operation including connection establishment, request sending and response reading. ``connect`` The maximal number of seconds for connection establishment of a new connection or for waiting for a free connection from a pool if pool connection limits are exceeded. ``sock_connect`` The maximal number of seconds for connecting to a peer for a new connection, not given from a pool. ``sock_read`` The maximal number of seconds allowed for period between reading a new data portion from a peer. All fields are floats, ``None`` or ``0`` disables a particular timeout check, see the :class:`ClientTimeout` reference for defaults and additional details. Thus the default timeout is:: aiohttp.ClientTimeout(total=5*60, connect=None, sock_connect=None, sock_read=None) .. note:: *aiohttp* **ceils** timeout if the value is equal or greater than 5 seconds. The timeout expires at the next integer second greater than ``current_time + timeout``. The ceiling is done for the sake of optimization, when many concurrent tasks are scheduled to wake-up at the almost same but different absolute times. It leads to very many event loop wakeups, which kills performance. The optimization shifts absolute wakeup times by scheduling them to exactly the same time as other neighbors, the loop wakes up once-per-second for timeout expiration. Smaller timeouts are not rounded to help testing; in the real life network timeouts usually greater than tens of seconds. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/client_reference.rst0000644000175100001710000022051400000000000017515 0ustar00runnerdocker.. _aiohttp-client-reference: Client Reference ================ .. currentmodule:: aiohttp Client Session -------------- Client session is the recommended interface for making HTTP requests. Session encapsulates a *connection pool* (*connector* instance) and supports keepalives by default. Unless you are connecting to a large, unknown number of different servers over the lifetime of your application, it is suggested you use a single session for the lifetime of your application to benefit from connection pooling. Usage example:: import aiohttp import asyncio async def fetch(client): async with client.get('http://python.org') as resp: assert resp.status == 200 return await resp.text() async def main(): async with aiohttp.ClientSession() as client: html = await fetch(client) print(html) loop = asyncio.get_event_loop() loop.run_until_complete(main()) The client session supports the context manager protocol for self closing. .. class:: ClientSession(base_url=None, *, \ connector=None, cookies=None, \ headers=None, skip_auto_headers=None, \ auth=None, json_serialize=json.dumps, \ version=aiohttp.HttpVersion11, \ cookie_jar=None, read_timeout=None, \ conn_timeout=None, \ timeout=sentinel, \ raise_for_status=False, \ connector_owner=True, \ auto_decompress=True, \ read_bufsize=2**16, \ requote_redirect_url=False, \ trust_env=False, \ trace_configs=None) The class for creating client sessions and making requests. :param base_url: Base part of the URL (optional) If set it allows to skip the base part in request calls. .. versionadded:: 3.8 :param aiohttp.BaseConnector connector: BaseConnector sub-class instance to support connection pooling. :param loop: :ref:`event loop` used for processing HTTP requests. If *loop* is ``None`` the constructor borrows it from *connector* if specified. :func:`asyncio.get_event_loop` is used for getting default event loop otherwise. .. deprecated:: 2.0 :param dict cookies: Cookies to send with the request (optional) :param headers: HTTP Headers to send with every request (optional). May be either *iterable of key-value pairs* or :class:`~collections.abc.Mapping` (e.g. :class:`dict`, :class:`~multidict.CIMultiDict`). :param skip_auto_headers: set of headers for which autogeneration should be skipped. *aiohttp* autogenerates headers like ``User-Agent`` or ``Content-Type`` if these headers are not explicitly passed. Using ``skip_auto_headers`` parameter allows to skip that generation. Note that ``Content-Length`` autogeneration can't be skipped. Iterable of :class:`str` or :class:`~multidict.istr` (optional) :param aiohttp.BasicAuth auth: an object that represents HTTP Basic Authorization (optional) :param version: supported HTTP version, ``HTTP 1.1`` by default. :param cookie_jar: Cookie Jar, :class:`~aiohttp.abc.AbstractCookieJar` instance. By default every session instance has own private cookie jar for automatic cookies processing but user may redefine this behavior by providing own jar implementation. One example is not processing cookies at all when working in proxy mode. If no cookie processing is needed, a :class:`aiohttp.DummyCookieJar` instance can be provided. :param collections.abc.Callable json_serialize: Json *serializer* callable. By default :func:`json.dumps` function. :param bool raise_for_status: Automatically call :meth:`ClientResponse.raise_for_status()` for each response, ``False`` by default. This parameter can be overridden when you making a request, e.g.:: client_session = aiohttp.ClientSession(raise_for_status=True) resp = await client_session.get(url, raise_for_status=False) async with resp: assert resp.status == 200 Set the parameter to ``True`` if you need ``raise_for_status`` for most of cases but override ``raise_for_status`` for those requests where you need to handle responses with status 400 or higher. :param timeout: a :class:`ClientTimeout` settings structure, 300 seconds (5min) total timeout by default. .. versionadded:: 3.3 :param float read_timeout: Request operations timeout. ``read_timeout`` is cumulative for all request operations (request, redirects, responses, data consuming). By default, the read timeout is 5*60 seconds. Use ``None`` or ``0`` to disable timeout checks. .. deprecated:: 3.3 Use ``timeout`` parameter instead. :param float conn_timeout: timeout for connection establishing (optional). Values ``0`` or ``None`` mean no timeout. .. deprecated:: 3.3 Use ``timeout`` parameter instead. :param bool connector_owner: Close connector instance on session closing. Setting the parameter to ``False`` allows to share connection pool between sessions without sharing session state: cookies etc. :param bool auto_decompress: Automatically decompress response body, ``True`` by default .. versionadded:: 2.3 :param int read_bufsize: Size of the read buffer (:attr:`ClientResponse.content`). 64 KiB by default. .. versionadded:: 3.7 :param bool trust_env: Get proxies information from *HTTP_PROXY* / *HTTPS_PROXY* environment variables if the parameter is ``True`` (``False`` by default). Get proxy credentials from ``~/.netrc`` file if present. .. seealso:: ``.netrc`` documentation: https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html .. versionadded:: 2.3 .. versionchanged:: 3.0 Added support for ``~/.netrc`` file. :param bool requote_redirect_url: Apply *URL requoting* for redirection URLs if automatic redirection is enabled (``True`` by default). .. versionadded:: 3.5 :param trace_configs: A list of :class:`TraceConfig` instances used for client tracing. ``None`` (default) is used for request tracing disabling. See :ref:`aiohttp-client-tracing-reference` for more information. .. attribute:: closed ``True`` if the session has been closed, ``False`` otherwise. A read-only property. .. attribute:: connector :class:`aiohttp.BaseConnector` derived instance used for the session. A read-only property. .. attribute:: cookie_jar The session cookies, :class:`~aiohttp.abc.AbstractCookieJar` instance. Gives access to cookie jar's content and modifiers. A read-only property. .. attribute:: requote_redirect_url aiohttp re quote's redirect urls by default, but some servers require exact url from location header. To disable *re-quote* system set :attr:`requote_redirect_url` attribute to ``False``. .. versionadded:: 2.1 .. note:: This parameter affects all subsequent requests. .. deprecated:: 3.5 The attribute modification is deprecated. .. attribute:: loop A loop instance used for session creation. A read-only property. .. deprecated:: 3.5 .. attribute:: timeout Default client timeouts, :class:`ClientTimeout` instance. The value can be tuned by passing *timeout* parameter to :class:`ClientSession` constructor. .. versionadded:: 3.7 .. attribute:: headers HTTP Headers that sent with every request May be either *iterable of key-value pairs* or :class:`~collections.abc.Mapping` (e.g. :class:`dict`, :class:`~multidict.CIMultiDict`). .. versionadded:: 3.7 .. attribute:: skip_auto_headers Set of headers for which autogeneration skipped. :class:`frozenset` of :class:`str` or :class:`~multidict.istr` (optional) .. versionadded:: 3.7 .. attribute:: auth An object that represents HTTP Basic Authorization. :class:`~aiohttp.BasicAuth` (optional) .. versionadded:: 3.7 .. attribute:: json_serialize Json serializer callable. By default :func:`json.dumps` function. .. versionadded:: 3.7 .. attribute:: connector_owner Should connector be closed on session closing :class:`bool` (optional) .. versionadded:: 3.7 .. attribute:: raise_for_status Should :meth:`ClientResponse.raise_for_status()` be called for each response Either :class:`bool` or :class:`collections.abc.Callable` .. versionadded:: 3.7 .. attribute:: auto_decompress Should the body response be automatically decompressed :class:`bool` default is ``True`` .. versionadded:: 3.7 .. attribute:: trust_env Should get proxies information from HTTP_PROXY / HTTPS_PROXY environment variables or ~/.netrc file if present :class:`bool` default is ``False`` .. versionadded:: 3.7 .. attribute:: trace_config A list of :class:`TraceConfig` instances used for client tracing. ``None`` (default) is used for request tracing disabling. See :ref:`aiohttp-client-tracing-reference` for more information. .. versionadded:: 3.7 .. comethod:: request(method, url, *, params=None, data=None, json=None,\ cookies=None, headers=None, skip_auto_headers=None, \ auth=None, allow_redirects=True,\ max_redirects=10,\ compress=None, chunked=None, expect100=False, raise_for_status=None,\ read_until_eof=True, \ read_bufsize=None, \ proxy=None, proxy_auth=None,\ timeout=sentinel, ssl=None, \ verify_ssl=None, fingerprint=None, \ ssl_context=None, proxy_headers=None) :async-with: :coroutine: :noindex: Performs an asynchronous HTTP request. Returns a response object. :param str method: HTTP method :param url: Request URL, :class:`str` or :class:`~yarl.URL`. :param params: Mapping, iterable of tuple of *key*/*value* pairs or string to be sent as parameters in the query string of the new request. Ignored for subsequent redirected requests (optional) Allowed values are: - :class:`collections.abc.Mapping` e.g. :class:`dict`, :class:`multidict.MultiDict` or :class:`multidict.MultiDictProxy` - :class:`collections.abc.Iterable` e.g. :class:`tuple` or :class:`list` - :class:`str` with preferably url-encoded content (**Warning:** content will not be encoded by *aiohttp*) :param data: The data to send in the body of the request. This can be a :class:`FormData` object or anything that can be passed into :class:`FormData`, e.g. a dictionary, bytes, or file-like object. (optional) :param json: Any json compatible python object (optional). *json* and *data* parameters could not be used at the same time. :param dict cookies: HTTP Cookies to send with the request (optional) Global session cookies and the explicitly set cookies will be merged when sending the request. .. versionadded:: 3.5 :param dict headers: HTTP Headers to send with the request (optional) :param skip_auto_headers: set of headers for which autogeneration should be skipped. *aiohttp* autogenerates headers like ``User-Agent`` or ``Content-Type`` if these headers are not explicitly passed. Using ``skip_auto_headers`` parameter allows to skip that generation. Iterable of :class:`str` or :class:`~multidict.istr` (optional) :param aiohttp.BasicAuth auth: an object that represents HTTP Basic Authorization (optional) :param bool allow_redirects: If set to ``False``, do not follow redirects. ``True`` by default (optional). :param int max_redirects: Maximum number of redirects to follow. ``10`` by default. :param bool compress: Set to ``True`` if request has to be compressed with deflate encoding. If `compress` can not be combined with a *Content-Encoding* and *Content-Length* headers. ``None`` by default (optional). :param int chunked: Enable chunked transfer encoding. It is up to the developer to decide how to chunk data streams. If chunking is enabled, aiohttp encodes the provided chunks in the "Transfer-encoding: chunked" format. If *chunked* is set, then the *Transfer-encoding* and *content-length* headers are disallowed. ``None`` by default (optional). :param bool expect100: Expect 100-continue response from server. ``False`` by default (optional). :param bool raise_for_status: Automatically call :meth:`ClientResponse.raise_for_status()` for response if set to ``True``. If set to ``None`` value from ``ClientSession`` will be used. ``None`` by default (optional). .. versionadded:: 3.4 :param bool read_until_eof: Read response until EOF if response does not have Content-Length header. ``True`` by default (optional). :param int read_bufsize: Size of the read buffer (:attr:`ClientResponse.content`). ``None`` by default, it means that the session global value is used. .. versionadded:: 3.7 :param proxy: Proxy URL, :class:`str` or :class:`~yarl.URL` (optional) :param aiohttp.BasicAuth proxy_auth: an object that represents proxy HTTP Basic Authorization (optional) :param int timeout: override the session's timeout. .. versionchanged:: 3.3 The parameter is :class:`ClientTimeout` instance, :class:`float` is still supported for sake of backward compatibility. If :class:`float` is passed it is a *total* timeout (in seconds). :param ssl: SSL validation mode. ``None`` for default SSL check (:func:`ssl.create_default_context` is used), ``False`` for skip SSL certificate validation, :class:`aiohttp.Fingerprint` for fingerprint validation, :class:`ssl.SSLContext` for custom SSL certificate validation. Supersedes *verify_ssl*, *ssl_context* and *fingerprint* parameters. .. versionadded:: 3.0 :param bool verify_ssl: Perform SSL certificate validation for *HTTPS* requests (enabled by default). May be disabled to skip validation for sites with invalid certificates. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=False`` :param bytes fingerprint: Pass the SHA256 digest of the expected certificate in DER format to verify that the certificate the server presents matches. Useful for `certificate pinning `_. Warning: use of MD5 or SHA1 digests is insecure and removed. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=aiohttp.Fingerprint(digest)`` :param ssl.SSLContext ssl_context: ssl context used for processing *HTTPS* requests (optional). *ssl_context* may be used for configuring certification authority channel, supported SSL options etc. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=ssl_context`` :param collections.abc.Mapping proxy_headers: HTTP headers to send to the proxy if the parameter proxy has been provided. .. versionadded:: 2.3 :param trace_request_ctx: Object used to give as a kw param for each new :class:`TraceConfig` object instantiated, used to give information to the tracers that is only available at request time. .. versionadded:: 3.0 :return ClientResponse: a :class:`client response ` object. .. comethod:: get(url, *, allow_redirects=True, **kwargs) :async-with: :coroutine: Perform a ``GET`` request. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param bool allow_redirects: If set to ``False``, do not follow redirects. ``True`` by default (optional). :return ClientResponse: a :class:`client response ` object. .. comethod:: post(url, *, data=None, **kwargs) :async-with: :coroutine: Perform a ``POST`` request. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param data: Data to send in the body of the request; see :meth:`request` for details (optional) :return ClientResponse: a :class:`client response ` object. .. comethod:: put(url, *, data=None, **kwargs) :async-with: :coroutine: Perform a ``PUT`` request. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param data: Data to send in the body of the request; see :meth:`request` for details (optional) :return ClientResponse: a :class:`client response ` object. .. comethod:: delete(url, **kwargs) :async-with: :coroutine: Perform a ``DELETE`` request. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :return ClientResponse: a :class:`client response ` object. .. comethod:: head(url, *, allow_redirects=False, **kwargs) :async-with: :coroutine: Perform a ``HEAD`` request. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param bool allow_redirects: If set to ``False``, do not follow redirects. ``False`` by default (optional). :return ClientResponse: a :class:`client response ` object. .. comethod:: options(url, *, allow_redirects=True, **kwargs) :async-with: :coroutine: Perform an ``OPTIONS`` request. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param bool allow_redirects: If set to ``False``, do not follow redirects. ``True`` by default (optional). :return ClientResponse: a :class:`client response ` object. .. comethod:: patch(url, *, data=None, **kwargs) :async-with: :coroutine: Perform a ``PATCH`` request. In order to modify inner :meth:`request` parameters, provide `kwargs`. :param url: Request URL, :class:`str` or :class:`~yarl.URL` :param data: Data to send in the body of the request; see :meth:`request` for details (optional) :return ClientResponse: a :class:`client response ` object. .. comethod:: ws_connect(url, *, method='GET', \ protocols=(), timeout=10.0,\ receive_timeout=None,\ auth=None,\ autoclose=True,\ autoping=True,\ heartbeat=None,\ origin=None, \ params=None, \ headers=None, \ proxy=None, proxy_auth=None, ssl=None, \ verify_ssl=None, fingerprint=None, \ ssl_context=None, proxy_headers=None, \ compress=0, max_msg_size=4194304) :async-with: :coroutine: Create a websocket connection. Returns a :class:`ClientWebSocketResponse` object. :param url: Websocket server url, :class:`str` or :class:`~yarl.URL` :param tuple protocols: Websocket protocols :param float timeout: Timeout for websocket to close. ``10`` seconds by default :param float receive_timeout: Timeout for websocket to receive complete message. ``None`` (unlimited) seconds by default :param aiohttp.BasicAuth auth: an object that represents HTTP Basic Authorization (optional) :param bool autoclose: Automatically close websocket connection on close message from server. If *autoclose* is False then close procedure has to be handled manually. ``True`` by default :param bool autoping: automatically send *pong* on *ping* message from server. ``True`` by default :param float heartbeat: Send *ping* message every *heartbeat* seconds and wait *pong* response, if *pong* response is not received then close connection. The timer is reset on any data reception.(optional) :param str origin: Origin header to send to server(optional) :param params: Mapping, iterable of tuple of *key*/*value* pairs or string to be sent as parameters in the query string of the new request. Ignored for subsequent redirected requests (optional) Allowed values are: - :class:`collections.abc.Mapping` e.g. :class:`dict`, :class:`multidict.MultiDict` or :class:`multidict.MultiDictProxy` - :class:`collections.abc.Iterable` e.g. :class:`tuple` or :class:`list` - :class:`str` with preferably url-encoded content (**Warning:** content will not be encoded by *aiohttp*) :param dict headers: HTTP Headers to send with the request (optional) :param str proxy: Proxy URL, :class:`str` or :class:`~yarl.URL` (optional) :param aiohttp.BasicAuth proxy_auth: an object that represents proxy HTTP Basic Authorization (optional) :param ssl: SSL validation mode. ``None`` for default SSL check (:func:`ssl.create_default_context` is used), ``False`` for skip SSL certificate validation, :class:`aiohttp.Fingerprint` for fingerprint validation, :class:`ssl.SSLContext` for custom SSL certificate validation. Supersedes *verify_ssl*, *ssl_context* and *fingerprint* parameters. .. versionadded:: 3.0 :param bool verify_ssl: Perform SSL certificate validation for *HTTPS* requests (enabled by default). May be disabled to skip validation for sites with invalid certificates. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=False`` :param bytes fingerprint: Pass the SHA256 digest of the expected certificate in DER format to verify that the certificate the server presents matches. Useful for `certificate pinning `_. Note: use of MD5 or SHA1 digests is insecure and deprecated. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=aiohttp.Fingerprint(digest)`` :param ssl.SSLContext ssl_context: ssl context used for processing *HTTPS* requests (optional). *ssl_context* may be used for configuring certification authority channel, supported SSL options etc. .. versionadded:: 2.3 .. deprecated:: 3.0 Use ``ssl=ssl_context`` :param dict proxy_headers: HTTP headers to send to the proxy if the parameter proxy has been provided. .. versionadded:: 2.3 :param int compress: Enable Per-Message Compress Extension support. 0 for disable, 9 to 15 for window bit support. Default value is 0. .. versionadded:: 2.3 :param int max_msg_size: maximum size of read websocket message, 4 MB by default. To disable the size limit use ``0``. .. versionadded:: 3.3 :param str method: HTTP method to establish WebSocket connection, ``'GET'`` by default. .. versionadded:: 3.5 .. comethod:: close() Close underlying connector. Release all acquired resources. .. method:: detach() Detach connector from session without closing the former. Session is switched to closed state anyway. Basic API --------- While we encourage :class:`ClientSession` usage we also provide simple coroutines for making HTTP requests. Basic API is good for performing simple HTTP requests without keepaliving, cookies and complex connection stuff like properly configured SSL certification chaining. .. cofunction:: request(method, url, *, params=None, data=None, \ json=None,\ headers=None, cookies=None, auth=None, \ allow_redirects=True, max_redirects=10, \ encoding='utf-8', \ version=HttpVersion(major=1, minor=1), \ compress=None, chunked=None, expect100=False, raise_for_status=False, \ read_bufsize=None, \ connector=None, loop=None,\ read_until_eof=True, timeout=sentinel) :async-with: Asynchronous context manager for performing an asynchronous HTTP request. Returns a :class:`ClientResponse` response object. :param str method: HTTP method :param url: Requested URL, :class:`str` or :class:`~yarl.URL` :param dict params: Parameters to be sent in the query string of the new request (optional) :param data: The data to send in the body of the request. This can be a :class:`FormData` object or anything that can be passed into :class:`FormData`, e.g. a dictionary, bytes, or file-like object. (optional) :param json: Any json compatible python object (optional). *json* and *data* parameters could not be used at the same time. :param dict headers: HTTP Headers to send with the request (optional) :param dict cookies: Cookies to send with the request (optional) :param aiohttp.BasicAuth auth: an object that represents HTTP Basic Authorization (optional) :param bool allow_redirects: If set to ``False``, do not follow redirects. ``True`` by default (optional). :param aiohttp.protocol.HttpVersion version: Request HTTP version (optional) :param bool compress: Set to ``True`` if request has to be compressed with deflate encoding. ``False`` instructs aiohttp to not compress data. ``None`` by default (optional). :param int chunked: Enables chunked transfer encoding. ``None`` by default (optional). :param bool expect100: Expect 100-continue response from server. ``False`` by default (optional). :param bool raise_for_status: Automatically call :meth:`ClientResponse.raise_for_status()` for response if set to ``True``. If set to ``None`` value from ``ClientSession`` will be used. ``None`` by default (optional). .. versionadded:: 3.4 :param aiohttp.BaseConnector connector: BaseConnector sub-class instance to support connection pooling. :param bool read_until_eof: Read response until EOF if response does not have Content-Length header. ``True`` by default (optional). :param int read_bufsize: Size of the read buffer (:attr:`ClientResponse.content`). ``None`` by default, it means that the session global value is used. .. versionadded:: 3.7 :param timeout: a :class:`ClientTimeout` settings structure, 300 seconds (5min) total timeout by default. :param loop: :ref:`event loop` used for processing HTTP requests. If param is ``None``, :func:`asyncio.get_event_loop` is used for getting default event loop. .. deprecated:: 2.0 :return ClientResponse: a :class:`client response ` object. Usage:: import aiohttp async def fetch(): async with aiohttp.request('GET', 'http://python.org/') as resp: assert resp.status == 200 print(await resp.text()) .. _aiohttp-client-reference-connectors: Connectors ---------- Connectors are transports for aiohttp client API. There are standard connectors: 1. :class:`TCPConnector` for regular *TCP sockets* (both *HTTP* and *HTTPS* schemes supported). 2. :class:`UnixConnector` for connecting via UNIX socket (it's used mostly for testing purposes). All connector classes should be derived from :class:`BaseConnector`. By default all *connectors* support *keep-alive connections* (behavior is controlled by *force_close* constructor's parameter). BaseConnector ^^^^^^^^^^^^^ .. class:: BaseConnector(*, keepalive_timeout=15, \ force_close=False, limit=100, limit_per_host=0, \ enable_cleanup_closed=False, loop=None) Base class for all connectors. :param float keepalive_timeout: timeout for connection reusing after releasing (optional). Values ``0``. For disabling *keep-alive* feature use ``force_close=True`` flag. :param int limit: total number simultaneous connections. If *limit* is ``None`` the connector has no limit (default: 100). :param int limit_per_host: limit simultaneous connections to the same endpoint. Endpoints are the same if they are have equal ``(host, port, is_ssl)`` triple. If *limit* is ``0`` the connector has no limit (default: 0). :param bool force_close: close underlying sockets after connection releasing (optional). :param bool enable_cleanup_closed: some SSL servers do not properly complete SSL shutdown process, in that case asyncio leaks ssl connections. If this parameter is set to True, aiohttp additionally aborts underlining transport after 2 seconds. It is off by default. :param loop: :ref:`event loop` used for handling connections. If param is ``None``, :func:`asyncio.get_event_loop` is used for getting default event loop. .. deprecated:: 2.0 .. attribute:: closed Read-only property, ``True`` if connector is closed. .. attribute:: force_close Read-only property, ``True`` if connector should ultimately close connections on releasing. .. attribute:: limit The total number for simultaneous connections. If limit is 0 the connector has no limit. The default limit size is 100. .. attribute:: limit_per_host The limit for simultaneous connections to the same endpoint. Endpoints are the same if they are have equal ``(host, port, is_ssl)`` triple. If *limit_per_host* is ``None`` the connector has no limit per host. Read-only property. .. comethod:: close() Close all opened connections. .. comethod:: connect(request) Get a free connection from pool or create new one if connection is absent in the pool. The call may be paused if :attr:`limit` is exhausted until used connections returns to pool. :param aiohttp.ClientRequest request: request object which is connection initiator. :return: :class:`Connection` object. .. comethod:: _create_connection(req) Abstract method for actual connection establishing, should be overridden in subclasses. TCPConnector ^^^^^^^^^^^^ .. class:: TCPConnector(*, ssl=None, verify_ssl=True, fingerprint=None, \ use_dns_cache=True, ttl_dns_cache=10, \ family=0, ssl_context=None, local_addr=None, \ resolver=None, keepalive_timeout=sentinel, \ force_close=False, limit=100, limit_per_host=0, \ enable_cleanup_closed=False, loop=None) Connector for working with *HTTP* and *HTTPS* via *TCP* sockets. The most common transport. When you don't know what connector type to use, use a :class:`TCPConnector` instance. :class:`TCPConnector` inherits from :class:`BaseConnector`. Constructor accepts all parameters suitable for :class:`BaseConnector` plus several TCP-specific ones: :param ssl: SSL validation mode. ``None`` for default SSL check (:func:`ssl.create_default_context` is used), ``False`` for skip SSL certificate validation, :class:`aiohttp.Fingerprint` for fingerprint validation, :class:`ssl.SSLContext` for custom SSL certificate validation. Supersedes *verify_ssl*, *ssl_context* and *fingerprint* parameters. .. versionadded:: 3.0 :param bool verify_ssl: perform SSL certificate validation for *HTTPS* requests (enabled by default). May be disabled to skip validation for sites with invalid certificates. .. deprecated:: 2.3 Pass *verify_ssl* to ``ClientSession.get()`` etc. :param bytes fingerprint: pass the SHA256 digest of the expected certificate in DER format to verify that the certificate the server presents matches. Useful for `certificate pinning `_. Note: use of MD5 or SHA1 digests is insecure and deprecated. .. deprecated:: 2.3 Pass *verify_ssl* to ``ClientSession.get()`` etc. :param bool use_dns_cache: use internal cache for DNS lookups, ``True`` by default. Enabling an option *may* speedup connection establishing a bit but may introduce some *side effects* also. :param int ttl_dns_cache: expire after some seconds the DNS entries, ``None`` means cached forever. By default 10 seconds (optional). In some environments the IP addresses related to a specific HOST can change after a specific time. Use this option to keep the DNS cache updated refreshing each entry after N seconds. :param int limit: total number simultaneous connections. If *limit* is ``None`` the connector has no limit (default: 100). :param int limit_per_host: limit simultaneous connections to the same endpoint. Endpoints are the same if they are have equal ``(host, port, is_ssl)`` triple. If *limit* is ``0`` the connector has no limit (default: 0). :param aiohttp.abc.AbstractResolver resolver: custom resolver instance to use. ``aiohttp.DefaultResolver`` by default (asynchronous if ``aiodns>=1.1`` is installed). Custom resolvers allow to resolve hostnames differently than the way the host is configured. The resolver is ``aiohttp.ThreadedResolver`` by default, asynchronous version is pretty robust but might fail in very rare cases. :param int family: TCP socket family, both IPv4 and IPv6 by default. For *IPv4* only use :data:`socket.AF_INET`, for *IPv6* only -- :data:`socket.AF_INET6`. *family* is ``0`` by default, that means both IPv4 and IPv6 are accepted. To specify only concrete version please pass :data:`socket.AF_INET` or :data:`socket.AF_INET6` explicitly. :param ssl.SSLContext ssl_context: SSL context used for processing *HTTPS* requests (optional). *ssl_context* may be used for configuring certification authority channel, supported SSL options etc. :param tuple local_addr: tuple of ``(local_host, local_port)`` used to bind socket locally if specified. :param bool force_close: close underlying sockets after connection releasing (optional). :param bool enable_cleanup_closed: Some ssl servers do not properly complete SSL shutdown process, in that case asyncio leaks SSL connections. If this parameter is set to True, aiohttp additionally aborts underlining transport after 2 seconds. It is off by default. .. attribute:: family *TCP* socket family e.g. :data:`socket.AF_INET` or :data:`socket.AF_INET6` Read-only property. .. attribute:: dns_cache Use quick lookup in internal *DNS* cache for host names if ``True``. Read-only :class:`bool` property. .. attribute:: cached_hosts The cache of resolved hosts if :attr:`dns_cache` is enabled. Read-only :class:`types.MappingProxyType` property. .. method:: clear_dns_cache(self, host=None, port=None) Clear internal *DNS* cache. Remove specific entry if both *host* and *port* are specified, clear all cache otherwise. UnixConnector ^^^^^^^^^^^^^ .. class:: UnixConnector(path, *, conn_timeout=None, \ keepalive_timeout=30, limit=100, \ force_close=False, loop=None) Unix socket connector. Use :class:`UnixConnector` for sending *HTTP/HTTPS* requests through *UNIX Sockets* as underlying transport. UNIX sockets are handy for writing tests and making very fast connections between processes on the same host. :class:`UnixConnector` is inherited from :class:`BaseConnector`. Usage:: conn = UnixConnector(path='/path/to/socket') session = ClientSession(connector=conn) async with session.get('http://python.org') as resp: ... Constructor accepts all parameters suitable for :class:`BaseConnector` plus UNIX-specific one: :param str path: Unix socket path .. attribute:: path Path to *UNIX socket*, read-only :class:`str` property. Connection ^^^^^^^^^^ .. class:: Connection Encapsulates single connection in connector object. End user should never create :class:`Connection` instances manually but get it by :meth:`BaseConnector.connect` coroutine. .. attribute:: closed :class:`bool` read-only property, ``True`` if connection was closed, released or detached. .. attribute:: loop Event loop used for connection .. deprecated:: 3.5 .. attribute:: transport Connection transport .. method:: close() Close connection with forcibly closing underlying socket. .. method:: release() Release connection back to connector. Underlying socket is not closed, the connection may be reused later if timeout (30 seconds by default) for connection was not expired. Response object --------------- .. class:: ClientResponse Client response returned by :meth:`aiohttp.ClientSession.request` and family. User never creates the instance of ClientResponse class but gets it from API calls. :class:`ClientResponse` supports async context manager protocol, e.g.:: resp = await client_session.get(url) async with resp: assert resp.status == 200 After exiting from ``async with`` block response object will be *released* (see :meth:`release` coroutine). .. attribute:: version Response's version, :class:`~aiohttp.protocol.HttpVersion` instance. .. attribute:: status HTTP status code of response (:class:`int`), e.g. ``200``. .. attribute:: reason HTTP status reason of response (:class:`str`), e.g. ``"OK"``. .. attribute:: ok Boolean representation of HTTP status code (:class:`bool`). ``True`` if ``status`` is less than ``400``; otherwise, ``False``. .. attribute:: method Request's method (:class:`str`). .. attribute:: url URL of request (:class:`~yarl.URL`). .. attribute:: real_url Unmodified URL of request with URL fragment unstripped (:class:`~yarl.URL`). .. versionadded:: 3.2 .. attribute:: connection :class:`Connection` used for handling response. .. attribute:: content Payload stream, which contains response's BODY (:class:`StreamReader`). It supports various reading methods depending on the expected format. When chunked transfer encoding is used by the server, allows retrieving the actual http chunks. Reading from the stream may raise :exc:`aiohttp.ClientPayloadError` if the response object is closed before response receives all data or in case if any transfer encoding related errors like misformed chunked encoding of broken compression data. .. attribute:: cookies HTTP cookies of response (*Set-Cookie* HTTP header, :class:`~http.cookies.SimpleCookie`). .. attribute:: headers A case-insensitive multidict proxy with HTTP headers of response, :class:`~multidict.CIMultiDictProxy`. .. attribute:: raw_headers Unmodified HTTP headers of response as unconverted bytes, a sequence of ``(key, value)`` pairs. .. attribute:: links Link HTTP header parsed into a :class:`~multidict.MultiDictProxy`. For each link, key is link param `rel` when it exists, or link url as :class:`str` otherwise, and value is :class:`~multidict.MultiDictProxy` of link params and url at key `url` as :class:`~yarl.URL` instance. .. versionadded:: 3.2 .. attribute:: content_type Read-only property with *content* part of *Content-Type* header. .. note:: Returns value is ``'application/octet-stream'`` if no Content-Type header present in HTTP headers according to :rfc:`2616`. To make sure Content-Type header is not present in the server reply, use :attr:`headers` or :attr:`raw_headers`, e.g. ``'CONTENT-TYPE' not in resp.headers``. .. attribute:: charset Read-only property that specifies the *encoding* for the request's BODY. The value is parsed from the *Content-Type* HTTP header. Returns :class:`str` like ``'utf-8'`` or ``None`` if no *Content-Type* header present in HTTP headers or it has no charset information. .. attribute:: content_disposition Read-only property that specified the *Content-Disposition* HTTP header. Instance of :class:`ContentDisposition` or ``None`` if no *Content-Disposition* header present in HTTP headers. .. attribute:: history A :class:`~collections.abc.Sequence` of :class:`ClientResponse` objects of preceding requests (earliest request first) if there were redirects, an empty sequence otherwise. .. method:: close() Close response and underlying connection. For :term:`keep-alive` support see :meth:`release`. .. comethod:: read() Read the whole response's body as :class:`bytes`. Close underlying connection if data reading gets an error, release connection otherwise. Raise an :exc:`aiohttp.ClientResponseError` if the data can't be read. :return bytes: read *BODY*. .. seealso:: :meth:`close`, :meth:`release`. .. comethod:: release() It is not required to call `release` on the response object. When the client fully receives the payload, the underlying connection automatically returns back to pool. If the payload is not fully read, the connection is closed .. method:: raise_for_status() Raise an :exc:`aiohttp.ClientResponseError` if the response status is 400 or higher. Do nothing for success responses (less than 400). .. comethod:: text(encoding=None) Read response's body and return decoded :class:`str` using specified *encoding* parameter. If *encoding* is ``None`` content encoding is autocalculated using ``Content-Type`` HTTP header and *charset-normalizer* tool if the header is not provided by server. :term:`cchardet` is used with fallback to :term:`charset-normalizer` if *cchardet* is not available. Close underlying connection if data reading gets an error, release connection otherwise. :param str encoding: text encoding used for *BODY* decoding, or ``None`` for encoding autodetection (default). :return str: decoded *BODY* :raise LookupError: if the encoding detected by cchardet is unknown by Python (e.g. VISCII). .. note:: If response has no ``charset`` info in ``Content-Type`` HTTP header :term:`cchardet` / :term:`charset-normalizer` is used for content encoding autodetection. It may hurt performance. If page encoding is known passing explicit *encoding* parameter might help:: await resp.text('ISO-8859-1') .. comethod:: json(*, encoding=None, loads=json.loads, \ content_type='application/json') Read response's body as *JSON*, return :class:`dict` using specified *encoding* and *loader*. If data is not still available a ``read`` call will be done, If *encoding* is ``None`` content encoding is autocalculated using :term:`cchardet` or :term:`charset-normalizer` as fallback if *cchardet* is not available. if response's `content-type` does not match `content_type` parameter :exc:`aiohttp.ContentTypeError` get raised. To disable content type check pass ``None`` value. :param str encoding: text encoding used for *BODY* decoding, or ``None`` for encoding autodetection (default). By the standard JSON encoding should be ``UTF-8`` but practice beats purity: some servers return non-UTF responses. Autodetection works pretty fine anyway. :param collections.abc.Callable loads: :term:`callable` used for loading *JSON* data, :func:`json.loads` by default. :param str content_type: specify response's content-type, if content type does not match raise :exc:`aiohttp.ClientResponseError`. To disable `content-type` check, pass ``None`` as value. (default: `application/json`). :return: *BODY* as *JSON* data parsed by *loads* parameter or ``None`` if *BODY* is empty or contains white-spaces only. .. attribute:: request_info A namedtuple with request URL and headers from :class:`~aiohttp.ClientRequest` object, :class:`aiohttp.RequestInfo` instance. .. method:: get_encoding() Automatically detect content encoding using ``charset`` info in ``Content-Type`` HTTP header. If this info is not exists or there are no appropriate codecs for encoding then :term:`cchardet` / :term:`charset-normalizer` is used. Beware that it is not always safe to use the result of this function to decode a response. Some encodings detected by cchardet are not known by Python (e.g. VISCII). *charset-normalizer* is not concerned by that issue. :raise RuntimeError: if called before the body has been read, for :term:`cchardet` usage .. versionadded:: 3.0 ClientWebSocketResponse ----------------------- To connect to a websocket server :func:`aiohttp.ws_connect` or :meth:`aiohttp.ClientSession.ws_connect` coroutines should be used, do not create an instance of class :class:`ClientWebSocketResponse` manually. .. class:: ClientWebSocketResponse() Class for handling client-side websockets. .. attribute:: closed Read-only property, ``True`` if :meth:`close` has been called or :const:`~aiohttp.WSMsgType.CLOSE` message has been received from peer. .. attribute:: protocol Websocket *subprotocol* chosen after :meth:`start` call. May be ``None`` if server and client protocols are not overlapping. .. method:: get_extra_info(name, default=None) Reads extra info from connection's transport .. method:: exception() Returns exception if any occurs or returns None. .. comethod:: ping(message=b'') Send :const:`~aiohttp.WSMsgType.PING` to peer. :param message: optional payload of *ping* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. .. versionchanged:: 3.0 The method is converted into :term:`coroutine` .. comethod:: pong(message=b'') Send :const:`~aiohttp.WSMsgType.PONG` to peer. :param message: optional payload of *pong* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. .. versionchanged:: 3.0 The method is converted into :term:`coroutine` .. comethod:: send_str(data, compress=None) Send *data* to peer as :const:`~aiohttp.WSMsgType.TEXT` message. :param str data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :raise TypeError: if data is not :class:`str` .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. comethod:: send_bytes(data, compress=None) Send *data* to peer as :const:`~aiohttp.WSMsgType.BINARY` message. :param data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :raise TypeError: if data is not :class:`bytes`, :class:`bytearray` or :class:`memoryview`. .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. comethod:: send_json(data, compress=None, *, dumps=json.dumps) Send *data* to peer as JSON string. :param data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :param collections.abc.Callable dumps: any :term:`callable` that accepts an object and returns a JSON string (:func:`json.dumps` by default). :raise RuntimeError: if connection is not started or closing :raise ValueError: if data is not serializable object :raise TypeError: if value returned by ``dumps(data)`` is not :class:`str` .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. comethod:: close(*, code=WSCloseCode.OK, message=b'') A :ref:`coroutine` that initiates closing handshake by sending :const:`~aiohttp.WSMsgType.CLOSE` message. It waits for close response from server. To add a timeout to `close()` call just wrap the call with `asyncio.wait()` or `asyncio.wait_for()`. :param int code: closing code. See also :class:`~aiohttp.WSCloseCode`. :param message: optional payload of *close* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. .. comethod:: receive() A :ref:`coroutine` that waits upcoming *data* message from peer and returns it. The coroutine implicitly handles :const:`~aiohttp.WSMsgType.PING`, :const:`~aiohttp.WSMsgType.PONG` and :const:`~aiohttp.WSMsgType.CLOSE` without returning the message. It process *ping-pong game* and performs *closing handshake* internally. :return: :class:`~aiohttp.WSMessage` .. coroutinemethod:: receive_str() A :ref:`coroutine` that calls :meth:`receive` but also asserts the message type is :const:`~aiohttp.WSMsgType.TEXT`. :return str: peer's message content. :raise TypeError: if message is :const:`~aiohttp.WSMsgType.BINARY`. .. coroutinemethod:: receive_bytes() A :ref:`coroutine` that calls :meth:`receive` but also asserts the message type is :const:`~aiohttp.WSMsgType.BINARY`. :return bytes: peer's message content. :raise TypeError: if message is :const:`~aiohttp.WSMsgType.TEXT`. .. coroutinemethod:: receive_json(*, loads=json.loads) A :ref:`coroutine` that calls :meth:`receive_str` and loads the JSON string to a Python dict. :param collections.abc.Callable loads: any :term:`callable` that accepts :class:`str` and returns :class:`dict` with parsed JSON (:func:`json.loads` by default). :return dict: loaded JSON content :raise TypeError: if message is :const:`~aiohttp.WSMsgType.BINARY`. :raise ValueError: if message is not valid JSON. Utilities --------- ClientTimeout ^^^^^^^^^^^^^ .. class:: ClientTimeout(*, total=None, connect=None, \ sock_connect=None, sock_read=None) A data class for client timeout settings. See :ref:`aiohttp-client-timeouts` for usage examples. .. attribute:: total Total number of seconds for the whole request. :class:`float`, ``None`` by default. .. attribute:: connect Maximal number of seconds for acquiring a connection from pool. The time consists connection establishment for a new connection or waiting for a free connection from a pool if pool connection limits are exceeded. For pure socket connection establishment time use :attr:`sock_connect`. :class:`float`, ``None`` by default. .. attribute:: sock_connect Maximal number of seconds for connecting to a peer for a new connection, not given from a pool. See also :attr:`connect`. :class:`float`, ``None`` by default. .. attribute:: sock_read Maximal number of seconds for reading a portion of data from a peer. :class:`float`, ``None`` by default. .. versionadded:: 3.3 .. note:: Timeouts larger than 5 seconds are rounded for scheduling on the next second boundary (an absolute time where microseconds part is zero) for the sake of performance. E.g., assume a timeout is ``10``, absolute time when timeout should expire is ``loop.time() + 5``, and it points to ``12345.67 + 10`` which is equal to ``12355.67``. The absolute time for the timeout cancellation is ``12356``. It leads to grouping all close scheduled timeout expirations to exactly the same time to reduce amount of loop wakeups. .. versionchanged:: 3.7 Rounding to the next seconds boundary is disabled for timeouts smaller than 5 seconds for the sake of easy debugging. In turn, tiny timeouts can lead to significant performance degradation on production environment. ETag ^^^^ .. class:: ETag(name, is_weak=False) Represents `ETag` identifier. .. attribute:: value Value of corresponding etag without quotes. .. attribute:: is_weak Flag indicates that etag is weak (has `W/` prefix). .. versionadded:: 3.8 RequestInfo ^^^^^^^^^^^ .. class:: RequestInfo() A data class with request URL and headers from :class:`~aiohttp.ClientRequest` object, available as :attr:`ClientResponse.request_info` attribute. .. attribute:: url Requested *url*, :class:`yarl.URL` instance. .. attribute:: method Request HTTP method like ``'GET'`` or ``'POST'``, :class:`str`. .. attribute:: headers HTTP headers for request, :class:`multidict.CIMultiDict` instance. .. attribute:: real_url Requested *url* with URL fragment unstripped, :class:`yarl.URL` instance. .. versionadded:: 3.2 BasicAuth ^^^^^^^^^ .. class:: BasicAuth(login, password='', encoding='latin1') HTTP basic authentication helper. :param str login: login :param str password: password :param str encoding: encoding (``'latin1'`` by default) Should be used for specifying authorization data in client API, e.g. *auth* parameter for :meth:`ClientSession.request() `. .. classmethod:: decode(auth_header, encoding='latin1') Decode HTTP basic authentication credentials. :param str auth_header: The ``Authorization`` header to decode. :param str encoding: (optional) encoding ('latin1' by default) :return: decoded authentication data, :class:`BasicAuth`. .. classmethod:: from_url(url) Constructed credentials info from url's *user* and *password* parts. :return: credentials data, :class:`BasicAuth` or ``None`` is credentials are not provided. .. versionadded:: 2.3 .. method:: encode() Encode credentials into string suitable for ``Authorization`` header etc. :return: encoded authentication data, :class:`str`. CookieJar ^^^^^^^^^ .. class:: CookieJar(*, unsafe=False, quote_cookie=True, treat_as_secure_origin = []) The cookie jar instance is available as :attr:`ClientSession.cookie_jar`. The jar contains :class:`~http.cookies.Morsel` items for storing internal cookie data. API provides a count of saved cookies:: len(session.cookie_jar) These cookies may be iterated over:: for cookie in session.cookie_jar: print(cookie.key) print(cookie["domain"]) The class implements :class:`collections.abc.Iterable`, :class:`collections.abc.Sized` and :class:`aiohttp.abc.AbstractCookieJar` interfaces. Implements cookie storage adhering to RFC 6265. :param bool unsafe: (optional) Whether to accept cookies from IPs. :param bool quote_cookie: (optional) Whether to quote cookies according to :rfc:`2109`. Some backend systems (not compatible with RFC mentioned above) does not support quoted cookies. .. versionadded:: 3.7 :param treat_as_secure_origin: (optional) Mark origins as secure for cookies marked as Secured. Possible types are Possible types are: - :class:`tuple` or :class:`list` of :class:`str` or :class:`yarl.URL` - :class:`str` - :class:`yarl.URL` .. versionadded:: 3.8 .. method:: update_cookies(cookies, response_url=None) Update cookies returned by server in ``Set-Cookie`` header. :param cookies: a :class:`collections.abc.Mapping` (e.g. :class:`dict`, :class:`~http.cookies.SimpleCookie`) or *iterable* of *pairs* with cookies returned by server's response. :param ~yarl.URL response_url: URL of response, ``None`` for *shared cookies*. Regular cookies are coupled with server's URL and are sent only to this server, shared ones are sent in every client request. .. method:: filter_cookies(request_url) Return jar's cookies acceptable for URL and available in ``Cookie`` header for sending client requests for given URL. :param ~yarl.URL response_url: request's URL for which cookies are asked. :return: :class:`http.cookies.SimpleCookie` with filtered cookies for given URL. .. method:: save(file_path) Write a pickled representation of cookies into the file at provided path. :param file_path: Path to file where cookies will be serialized, :class:`str` or :class:`pathlib.Path` instance. .. method:: load(file_path) Load a pickled representation of cookies from the file at provided path. :param file_path: Path to file from where cookies will be imported, :class:`str` or :class:`pathlib.Path` instance. .. method:: clear(predicate=None) Removes all cookies from the jar if the predicate is ``None``. Otherwise remove only those :class:`~http.cookies.Morsel` that ``predicate(morsel)`` returns ``True``. :param predicate: callable that gets :class:`~http.cookies.Morsel` as a parameter and returns ``True`` if this :class:`~http.cookies.Morsel` must be deleted from the jar. .. versionadded:: 4.0 .. method:: clear_domain(domain) Remove all cookies from the jar that belongs to the specified domain or its subdomains. :param str domain: domain for which cookies must be deleted from the jar. .. versionadded:: 4.0 .. class:: DummyCookieJar(*, loop=None) Dummy cookie jar which does not store cookies but ignores them. Could be useful e.g. for web crawlers to iterate over Internet without blowing up with saved cookies information. To install dummy cookie jar pass it into session instance:: jar = aiohttp.DummyCookieJar() session = aiohttp.ClientSession(cookie_jar=DummyCookieJar()) .. class:: Fingerprint(digest) Fingerprint helper for checking SSL certificates by *SHA256* digest. :param bytes digest: *SHA256* digest for certificate in DER-encoded binary form (see :meth:`ssl.SSLSocket.getpeercert`). To check fingerprint pass the object into :meth:`ClientSession.get` call, e.g.:: import hashlib with open(path_to_cert, 'rb') as f: digest = hashlib.sha256(f.read()).digest() await session.get(url, ssl=aiohttp.Fingerprint(digest)) .. versionadded:: 3.0 FormData ^^^^^^^^ A :class:`FormData` object contains the form data and also handles encoding it into a body that is either ``multipart/form-data`` or ``application/x-www-form-urlencoded``. ``multipart/form-data`` is used if at least one field is an :class:`io.IOBase` object or was added with at least one optional argument to :meth:`add_field` (``content_type``, ``filename``, or ``content_transfer_encoding``). Otherwise, ``application/x-www-form-urlencoded`` is used. :class:`FormData` instances are callable and return a :class:`aiohttp.payload.Payload` on being called. .. class:: FormData(fields, quote_fields=True, charset=None) Helper class for multipart/form-data and application/x-www-form-urlencoded body generation. :param fields: A container for the key/value pairs of this form. Possible types are: - :class:`dict` - :class:`tuple` or :class:`list` - :class:`io.IOBase`, e.g. a file-like object - :class:`multidict.MultiDict` or :class:`multidict.MultiDictProxy` If it is a :class:`tuple` or :class:`list`, it must be a valid argument for :meth:`add_fields`. For :class:`dict`, :class:`multidict.MultiDict`, and :class:`multidict.MultiDictProxy`, the keys and values must be valid `name` and `value` arguments to :meth:`add_field`, respectively. .. method:: add_field(name, value, content_type=None, filename=None,\ content_transfer_encoding=None) Add a field to the form. :param str name: Name of the field :param value: Value of the field Possible types are: - :class:`str` - :class:`bytes`, :class:`bytearray`, or :class:`memoryview` - :class:`io.IOBase`, e.g. a file-like object :param str content_type: The field's content-type header (optional) :param str filename: The field's filename (optional) If this is not set and ``value`` is a :class:`bytes`, :class:`bytearray`, or :class:`memoryview` object, the `name` argument is used as the filename unless ``content_transfer_encoding`` is specified. If ``filename`` is not set and ``value`` is an :class:`io.IOBase` object, the filename is extracted from the object if possible. :param str content_transfer_encoding: The field's content-transfer-encoding header (optional) .. method:: add_fields(fields) Add one or more fields to the form. :param fields: An iterable containing: - :class:`io.IOBase`, e.g. a file-like object - :class:`multidict.MultiDict` or :class:`multidict.MultiDictProxy` - :class:`tuple` or :class:`list` of length two, containing a name-value pair Client exceptions ----------------- Exception hierarchy has been significantly modified in version 2.0. aiohttp defines only exceptions that covers connection handling and server response misbehaviors. For developer specific mistakes, aiohttp uses python standard exceptions like :exc:`ValueError` or :exc:`TypeError`. Reading a response content may raise a :exc:`ClientPayloadError` exception. This exception indicates errors specific to the payload encoding. Such as invalid compressed data, malformed chunked-encoded chunks or not enough data that satisfy the content-length header. All exceptions are available as members of *aiohttp* module. .. exception:: ClientError Base class for all client specific exceptions. Derived from :exc:`Exception` .. class:: ClientPayloadError This exception can only be raised while reading the response payload if one of these errors occurs: 1. invalid compression 2. malformed chunked encoding 3. not enough data that satisfy ``Content-Length`` HTTP header. Derived from :exc:`ClientError` .. exception:: InvalidURL URL used for fetching is malformed, e.g. it does not contain host part. Derived from :exc:`ClientError` and :exc:`ValueError` .. attribute:: url Invalid URL, :class:`yarl.URL` instance. .. class:: ContentDisposition Represent Content-Disposition header .. attribute:: value A :class:`str` instance. Value of Content-Disposition header itself, e.g. ``attachment``. .. attribute:: filename A :class:`str` instance. Content filename extracted from parameters. May be ``None``. .. attribute:: parameters Read-only mapping contains all parameters. Response errors ^^^^^^^^^^^^^^^ .. exception:: ClientResponseError These exceptions could happen after we get response from server. Derived from :exc:`ClientError` .. attribute:: request_info Instance of :class:`RequestInfo` object, contains information about request. .. attribute:: status HTTP status code of response (:class:`int`), e.g. ``400``. .. attribute:: message Message of response (:class:`str`), e.g. ``"OK"``. .. attribute:: headers Headers in response, a list of pairs. .. attribute:: history History from failed response, if available, else empty tuple. A :class:`tuple` of :class:`ClientResponse` objects used for handle redirection responses. .. attribute:: code HTTP status code of response (:class:`int`), e.g. ``400``. .. deprecated:: 3.1 .. class:: WSServerHandshakeError Web socket server response error. Derived from :exc:`ClientResponseError` .. class:: ContentTypeError Invalid content type. Derived from :exc:`ClientResponseError` .. versionadded:: 2.3 .. class:: TooManyRedirects Client was redirected too many times. Maximum number of redirects can be configured by using parameter ``max_redirects`` in :meth:`request`. Derived from :exc:`ClientResponseError` .. versionadded:: 3.2 Connection errors ^^^^^^^^^^^^^^^^^ .. class:: ClientConnectionError These exceptions related to low-level connection problems. Derived from :exc:`ClientError` .. class:: ClientOSError Subset of connection errors that are initiated by an :exc:`OSError` exception. Derived from :exc:`ClientConnectionError` and :exc:`OSError` .. class:: ClientConnectorError Connector related exceptions. Derived from :exc:`ClientOSError` .. class:: ClientProxyConnectionError Derived from :exc:`ClientConnectorError` .. class:: UnixClientConnectorError Derived from :exc:`ClientConnectorError` .. class:: ServerConnectionError Derived from :exc:`ClientConnectionError` .. class:: ClientSSLError Derived from :exc:`ClientConnectorError` .. class:: ClientConnectorSSLError Response ssl error. Derived from :exc:`ClientSSLError` and :exc:`ssl.SSLError` .. class:: ClientConnectorCertificateError Response certificate error. Derived from :exc:`ClientSSLError` and :exc:`ssl.CertificateError` .. class:: ServerDisconnectedError Server disconnected. Derived from :exc:`~aiohttp.ServerConnectionError` .. attribute:: message Partially parsed HTTP message (optional). .. class:: ServerTimeoutError Server operation timeout: read timeout, etc. Derived from :exc:`ServerConnectionError` and :exc:`asyncio.TimeoutError` .. class:: ServerFingerprintMismatch Server fingerprint mismatch. Derived from :exc:`ServerConnectionError` Hierarchy of exceptions ^^^^^^^^^^^^^^^^^^^^^^^ * :exc:`ClientError` * :exc:`ClientResponseError` * :exc:`ContentTypeError` * :exc:`WSServerHandshakeError` * :exc:`~aiohttp.ClientHttpProxyError` * :exc:`ClientConnectionError` * :exc:`ClientOSError` * :exc:`ClientConnectorError` * :exc:`ClientSSLError` * :exc:`ClientConnectorCertificateError` * :exc:`ClientConnectorSSLError` * :exc:`ClientProxyConnectionError` * :exc:`ServerConnectionError` * :exc:`ServerDisconnectedError` * :exc:`ServerTimeoutError` * :exc:`ServerFingerprintMismatch` * :exc:`ClientPayloadError` * :exc:`InvalidURL` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/conf.py0000644000175100001710000003702700000000000014773 0ustar00runnerdocker#!/usr/bin/env python3 # # aiohttp documentation build configuration file, created by # sphinx-quickstart on Wed Mar 5 12:35:35 2014. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import io import os import re from pathlib import Path PROJECT_ROOT_DIR = Path(__file__).parents[1].resolve() _docs_path = os.path.dirname(__file__) _version_path = os.path.abspath( os.path.join(_docs_path, "..", "aiohttp", "__init__.py") ) with open(_version_path, encoding="latin1") as fp: try: _version_info = re.search( r'^__version__ = "' r"(?P\d+)" r"\.(?P\d+)" r"\.(?P\d+)" r'(?P.*)?"$', fp.read(), re.M, ).groupdict() except IndexError: raise RuntimeError("Unable to determine version.") # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ # stdlib-party extensions: "sphinx.ext.extlinks", "sphinx.ext.intersphinx", "sphinx.ext.viewcode", # Third-party extensions: "sphinxcontrib.asyncio", "sphinxcontrib.blockdiag", "sphinxcontrib.towncrier", # provides `towncrier-draft-entries` directive ] try: import sphinxcontrib.spelling # noqa extensions.append("sphinxcontrib.spelling") except ImportError: pass intersphinx_mapping = { "python": ("http://docs.python.org/3", None), "multidict": ("https://multidict.readthedocs.io/en/stable/", None), "yarl": ("https://yarl.readthedocs.io/en/stable/", None), "aiosignal": ("https://aiosignal.readthedocs.io/en/stable/", None), "aiohttpjinja2": ("https://aiohttp-jinja2.readthedocs.io/en/stable/", None), "aiohttpremotes": ("https://aiohttp-remotes.readthedocs.io/en/stable/", None), "aiohttpsession": ("https://aiohttp-session.readthedocs.io/en/stable/", None), "aiohttpdemos": ("https://aiohttp-demos.readthedocs.io/en/latest/", None), } # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix of source filenames. source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = "index" # -- Project information ----------------------------------------------------- github_url = "https://github.com" github_repo_org = "aio-libs" github_repo_name = "aiohttp" github_repo_slug = f"{github_repo_org}/{github_repo_name}" github_repo_url = f"{github_url}/{github_repo_slug}" github_sponsors_url = f"{github_url}/sponsors" project = github_repo_name copyright = f"2013-2020, {project} maintainers" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = "{major}.{minor}".format(**_version_info) # The full version, including alpha/beta/rc tags. release = "{major}.{minor}.{patch}{tag}".format(**_version_info) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ["_build"] # The reST default role (used for this markup: `text`) to use for all # documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. # pygments_style = 'sphinx' # The default language to highlight source code in. highlight_language = "python3" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # -- Extension configuration ------------------------------------------------- # -- Options for extlinks extension --------------------------------------- extlinks = { "issue": (f"{github_repo_url}/issues/%s", "#"), "pr": (f"{github_repo_url}/pull/%s", "PR #"), "commit": (f"{github_repo_url}/commit/%s", ""), "gh": (f"{github_url}/%s", "GitHub: "), "user": (f"{github_sponsors_url}/%s", "@"), } # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = "aiohttp_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. html_theme_options = { "description": "Async HTTP client/server for asyncio and Python", "canonical_url": "http://docs.aiohttp.org/en/stable/", "github_user": github_repo_org, "github_repo": github_repo_name, "github_button": True, "github_type": "star", "github_banner": True, "badges": [ { "image": f"{github_repo_url}/workflows/CI/badge.svg", "target": f"{github_repo_url}/actions?query=workflow%3ACI", "height": "20", "alt": "Azure Pipelines CI status", }, { "image": f"https://codecov.io/github/{github_repo_slug}/coverage.svg?branch=master", "target": f"https://codecov.io/github/{github_repo_slug}", "height": "20", "alt": "Code coverage status", }, { "image": f"https://badge.fury.io/py/{project}.svg", "target": f"https://badge.fury.io/py/{project}", "height": "20", "alt": "Latest PyPI package version", }, { "image": f"https://img.shields.io/discourse/status?server=https%3A%2F%2F{github_repo_org}.discourse.group", "target": f"https://{github_repo_org}.discourse.group", "height": "20", "alt": "Discourse status", }, { "image": "https://badges.gitter.im/Join%20Chat.svg", "target": f"https://gitter.im/{github_repo_org}/Lobby", "height": "20", "alt": "Chat on Gitter", }, ], } html_css_files = [ "css/logo-adjustments.css", ] # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [alabaster.get_path()] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = "aiohttp-plain.svg" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = "favicon.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. html_sidebars = { "**": [ "about.html", "navigation.html", "searchbox.html", ] } # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = f"{project}doc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # 'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ( "index", f"{project}.tex", f"{project} Documentation", f"{project} contributors", "manual", ), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [("index", project, f"{project} Documentation", [project], 1)] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( "index", project, f"{project} Documentation", "Aiohttp contributors", project, "One line description of project.", "Miscellaneous", ), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. # texinfo_no_detailmenu = False # ------------------------------------------------------------------------- nitpicky = True nitpick_ignore = [ ("py:mod", "aiohttp"), # undocumented, no `.. currentmodule:: aiohttp` in docs ("py:class", "aiohttp.SimpleCookie"), # undocumented ("py:class", "aiohttp.web.RequestHandler"), # undocumented ("py:class", "aiohttp.NamedPipeConnector"), # undocumented ("py:meth", "aiohttp.ClientSession.request"), # undocumented ("py:class", "aiohttp.protocol.HttpVersion"), # undocumented ("py:class", "aiohttp.ClientRequest"), # undocumented ("py:class", "aiohttp.payload.Payload"), # undocumented ("py:class", "aiohttp.abc.AbstractResolver"), # undocumented ("py:func", "aiohttp.ws_connect"), # undocumented ("py:meth", "start"), # undocumented ("py:exc", "aiohttp.ClientHttpProxyError"), # undocumented ("py:class", "asyncio.AbstractServer"), # undocumented ("py:mod", "aiohttp.test_tools"), # undocumented ("py:class", "list of pairs"), # undocumented ("py:class", "aiohttp.protocol.HttpVersion"), # undocumented ("py:meth", "aiohttp.ClientSession.request"), # undocumented ("py:class", "aiohttp.StreamWriter"), # undocumented ("py:attr", "aiohttp.StreamResponse.body"), # undocumented ("py:class", "aiohttp.payload.StringPayload"), # undocumented ("py:meth", "aiohttp.web.Application.copy"), # undocumented ("py:meth", "asyncio.AbstractEventLoop.create_server"), # undocumented ("py:data", "aiohttp.log.server_logger"), # undocumented ("py:data", "aiohttp.log.access_logger"), # undocumented ("py:data", "aiohttp.helpers.AccessLogger"), # undocumented ("py:attr", "helpers.AccessLogger.LOG_FORMAT"), # undocumented ("py:meth", "aiohttp.web.AbstractRoute.url"), # undocumented ("py:class", "aiohttp.web.MatchedSubAppResource"), # undocumented ("py:attr", "body"), # undocumented ("py:class", "socket.socket"), # undocumented ("py:class", "socket.AddressFamily"), # undocumented ("py:obj", "logging.DEBUG"), # undocumented ("py:class", "aiohttp.abc.AbstractAsyncAccessLogger"), # undocumented ("py:meth", "aiohttp.web.Response.write_eof"), # undocumented ("py:meth", "aiohttp.payload.Payload.set_content_disposition"), # undocumented ("py:class", "cgi.FieldStorage"), # undocumented ("py:meth", "aiohttp.web.UrlDispatcher.register_resource"), # undocumented ("py:func", "aiohttp_debugtoolbar.setup"), # undocumented ("py:exc", "HTTPInternalServerError"), # undocumented ("py:exc", "HTTPForbidden"), # undocumented ("py:exc", "HTTPExpectationFailed"), # undocumented ("py:class", "HTTPFound"), # undocumented ("py:class", "HTTPMultipleChoices"), # undocumented ("py:class", "HTTPMovedPermanently"), # undocumented ("py:class", "HTTPSeeOther"), # undocumented ("py:class", "HTTPUseProxy"), # undocumented ("py:class", "HTTPTemporaryRedirect"), # undocumented ("py:class", "HTTPMethodNotAllowed"), # undocumented ("py:class", "FileResponse"), # undocumented ("py:exc", "HTTPNotFound"), # undocumented ("py:exc", "HTTPMethodNotAllowed"), # undocumented ("py:class", "HTTPMethodNotAllowed"), # undocumented ] # -- Options for towncrier_draft extension ----------------------------------- towncrier_draft_autoversion_mode = "draft" # or: 'sphinx-version', 'sphinx-release' towncrier_draft_include_empty = True towncrier_draft_working_directory = PROJECT_ROOT_DIR # Not yet supported: towncrier_draft_config_path = 'pyproject.toml' # relative to cwd ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/contributing.rst0000644000175100001710000002426100000000000016731 0ustar00runnerdocker.. _aiohttp-contributing: Contributing ============ Instructions for contributors ----------------------------- In order to make a clone of the GitHub_ repo: open the link and press the "Fork" button on the upper-right menu of the web page. I hope everybody knows how to work with git and github nowadays :) Workflow is pretty straightforward: 0. Make sure you are reading the latest version of this document. It can be found in the GitHub_ repo in the ``docs`` subdirectory. 1. Clone the GitHub_ repo using the ``--recurse-submodules`` argument 2. Setup your machine with the required development environment 3. Make a change 4. Make sure all tests passed 5. Add a file into the ``CHANGES`` folder (see `Changelog update`_ for how). 6. Commit changes to your own aiohttp clone 7. Make a pull request from the github page of your clone against the master branch 8. Optionally make backport Pull Request(s) for landing a bug fix into released aiohttp versions. .. note:: The project uses *Squash-and-Merge* strategy for *GitHub Merge* button. Basically it means that there is **no need to rebase** a Pull Request against *master* branch. Just ``git merge`` *master* into your working copy (a fork) if needed. The Pull Request is automatically squashed into the single commit once the PR is accepted. .. note:: GitHub issue and pull request threads are automatically locked when there has not been any recent activity for one year. Please open a `new issue `_ for related bugs. If you feel like there are important points in the locked discussions, please include those excerpts into that new issue. Preconditions for running aiohttp test suite -------------------------------------------- We expect you to use a python virtual environment to run our tests. There are several ways to make a virtual environment. If you like to use *virtualenv* please run: .. code-block:: shell $ cd aiohttp $ virtualenv --python=`which python3` venv $ . venv/bin/activate For standard python *venv*: .. code-block:: shell $ cd aiohttp $ python3 -m venv venv $ . venv/bin/activate For *virtualenvwrapper*: .. code-block:: shell $ cd aiohttp $ mkvirtualenv --python=`which python3` aiohttp There are other tools like *pyvenv* but you know the rule of thumb now: create a python3 virtual environment and activate it. After that please install libraries required for development: .. code-block:: shell $ pip install -r requirements/dev.txt .. note:: For now, the development tooling depends on ``make`` and assumes an Unix OS If you wish to contribute to aiohttp from a Windows machine, the easiest way is probably to `configure the WSL `_ so you can use the same instructions. If it's not possible for you or if it doesn't work, please contact us so we can find a solution together. Install pre-commit hooks: .. code-block:: shell $ pre-commit install .. warning:: If you plan to use temporary ``print()``, ``pdb`` or ``ipdb`` within the test suite, execute it with ``-s``: .. code-block:: shell $ pytest tests -s in order to run the tests without output capturing. Congratulations, you are ready to run the test suite! Run autoformatter ----------------- The project uses black_ + isort_ formatters to keep the source code style. Please run `make fmt` after every change before starting tests. .. code-block:: shell $ make fmt Run aiohttp test suite ---------------------- After all the preconditions are met you can run tests typing the next command: .. code-block:: shell $ make test The command at first will run the *linters* (sorry, we don't accept pull requests with pyflakes, black, isort, or mypy errors). On *lint* success the tests will be run. Please take a look on the produced output. Any extra texts (print statements and so on) should be removed. .. note:: If you see that CI build is failing on a specific Python version and you don't have this version on your computer, you can use the helper to run it (only if you have docker):: make test-[-no-extensions] For example, if you want to run tests for python3.7 without extensions, you can run this command:: make test-3.7-no-extensions Tests coverage -------------- We are trying hard to have good test coverage; please don't make it worse. Use: .. code-block:: shell $ make cov-dev to run test suite and collect coverage information. Once the command has finished check your coverage at the file that appears in the last line of the output: ``open file:///.../aiohttp/htmlcov/index.html`` Please go to the link and make sure that your code change is covered. The project uses *codecov.io* for storing coverage results. Visit https://codecov.io/gh/aio-libs/aiohttp for looking on coverage of master branch, history, pull requests etc. The browser extension https://docs.codecov.io/docs/browser-extension is highly recommended for analyzing the coverage just in *Files Changed* tab on *GitHub Pull Request* review page. Documentation ------------- We encourage documentation improvements. Please before making a Pull Request about documentation changes run: .. code-block:: shell $ make doc Once it finishes it will output the index html page ``open file:///.../aiohttp/docs/_build/html/index.html``. Go to the link and make sure your doc changes looks good. Spell checking -------------- We use ``pyenchant`` and ``sphinxcontrib-spelling`` for running spell checker for documentation: .. code-block:: shell $ make doc-spelling Unfortunately there are problems with running spell checker on MacOS X. To run spell checker on Linux box you should install it first: .. code-block:: shell $ sudo apt-get install enchant $ pip install sphinxcontrib-spelling Changelog update ---------------- The ``CHANGES.rst`` file is managed using `towncrier `_ tool and all non trivial changes must be accompanied by a news entry. To add an entry to the news file, first you need to have created an issue describing the change you want to make. A Pull Request itself *may* function as such, but it is preferred to have a dedicated issue (for example, in case the PR ends up rejected due to code quality reasons). Once you have an issue or pull request, you take the number and you create a file inside of the ``CHANGES/`` directory named after that issue number with an extension of ``.removal``, ``.feature``, ``.bugfix``, or ``.doc``. Thus if your issue or PR number is ``1234`` and this change is fixing a bug, then you would create a file ``CHANGES/1234.bugfix``. PRs can span multiple categories by creating multiple files (for instance, if you added a feature and deprecated/removed the old feature at the same time, you would create ``CHANGES/NNNN.feature`` and ``CHANGES/NNNN.removal``). Likewise if a PR touches multiple issues/PRs you may create a file for each of them with the exact same contents and *Towncrier* will deduplicate them. The contents of this file are *reStructuredText* formatted text that will be used as the content of the news file entry. You do not need to reference the issue or PR numbers here as *towncrier* will automatically add a reference to all of the affected issues when rendering the news file. Making a Pull Request --------------------- After finishing all steps make a GitHub_ Pull Request with *master* base branch. Backporting ----------- All Pull Requests are created against *master* git branch. If the Pull Request is not a new functionality but bug fixing *backport* to maintenance branch would be desirable. *aiohttp* project committer may ask for making a *backport* of the PR into maintained branch(es), in this case he or she adds a github label like *needs backport to 3.1*. *Backporting* is performed *after* main PR merging into master. Please do the following steps: 1. Find *Pull Request's commit* for cherry-picking. *aiohttp* does *squashing* PRs on merging, so open your PR page on github and scroll down to message like ``asvetlov merged commit f7b8921 into master 9 days ago``. ``f7b8921`` is the required commit number. 2. Run `cherry_picker `_ tool for making backport PR (the tool is already pre-installed from ``./requirements/dev.txt``), e.g. ``cherry_picker f7b8921 3.1``. 3. In case of conflicts fix them and continue cherry-picking by ``cherry_picker --continue``. ``cherry_picker --abort`` stops the process. ``cherry_picker --status`` shows current cherry-picking status (like ``git status``) 4. After all conflicts are done the tool opens a New Pull Request page in a browser with pre-filed information. Create a backport Pull Request and wait for review/merging. 5. *aiohttp* *committer* should remove *backport Git label* after merging the backport. How to become an aiohttp committer ---------------------------------- Contribute! The easiest way is providing Pull Requests for issues in our bug tracker. But if you have a great idea for the library improvement -- please make an issue and Pull Request. The rules for committers are simple: 1. No wild commits! Everything should go through PRs. 2. Take a part in reviews. It's very important part of maintainer's activity. 3. Pickup issues created by others, especially if they are simple. 4. Keep test suite comprehensive. In practice it means leveling up coverage. 97% is not bad but we wish to have 100% someday. Well, 99% is good target too. 5. Don't hesitate to improve our docs. Documentation is very important thing, it's the key for project success. The documentation should not only cover our public API but help newbies to start using the project and shed a light on non-obvious gotchas. After positive answer aiohttp committer creates an issue on github with the proposal for nomination. If the proposal will collect only positive votes and no strong objection -- you'll be a new member in our team. .. _GitHub: https://github.com/aio-libs/aiohttp .. _ipdb: https://pypi.python.org/pypi/ipdb .. _black: https://pypi.python.org/pypi/black .. _isort: https://pypi.python.org/pypi/isort ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/deployment.rst0000644000175100001710000003040100000000000016373 0ustar00runnerdocker.. _aiohttp-deployment: ================= Server Deployment ================= There are several options for aiohttp server deployment: * Standalone server * Running a pool of backend servers behind of :term:`nginx`, HAProxy or other *reverse proxy server* * Using :term:`gunicorn` behind of *reverse proxy* Every method has own benefits and disadvantages. .. _aiohttp-deployment-standalone: Standalone ========== Just call :func:`aiohttp.web.run_app` function passing :class:`aiohttp.web.Application` instance. The method is very simple and could be the best solution in some trivial cases. But it does not utilize all CPU cores. For running multiple aiohttp server instances use *reverse proxies*. .. _aiohttp-deployment-nginx-supervisord: Nginx+supervisord ================= Running aiohttp servers behind :term:`nginx` makes several advantages. First, nginx is the perfect frontend server. It may prevent many attacks based on malformed http protocol etc. Second, running several aiohttp instances behind nginx allows to utilize all CPU cores. Third, nginx serves static files much faster than built-in aiohttp static file support. But this way requires more complex configuration. Nginx configuration -------------------- Here is short example of an Nginx configuration file. It does not cover all available Nginx options. For full details, read `Nginx tutorial `_ and `official Nginx documentation `_. First configure HTTP server itself: .. code-block:: nginx http { server { listen 80; client_max_body_size 4G; server_name example.com; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; proxy_buffering off; proxy_pass http://aiohttp; } location /static { # path for static files root /path/to/app/static; } } } This config listens on port ``80`` for a server named ``example.com`` and redirects everything to the ``aiohttp`` backend group. Also it serves static files from ``/path/to/app/static`` path as ``example.com/static``. Next we need to configure *aiohttp upstream group*: .. code-block:: nginx http { upstream aiohttp { # fail_timeout=0 means we always retry an upstream even if it failed # to return a good HTTP response # Unix domain servers server unix:/tmp/example_1.sock fail_timeout=0; server unix:/tmp/example_2.sock fail_timeout=0; server unix:/tmp/example_3.sock fail_timeout=0; server unix:/tmp/example_4.sock fail_timeout=0; # Unix domain sockets are used in this example due to their high performance, # but TCP/IP sockets could be used instead: # server 127.0.0.1:8081 fail_timeout=0; # server 127.0.0.1:8082 fail_timeout=0; # server 127.0.0.1:8083 fail_timeout=0; # server 127.0.0.1:8084 fail_timeout=0; } } All HTTP requests for ``http://example.com`` except ones for ``http://example.com/static`` will be redirected to ``example1.sock``, ``example2.sock``, ``example3.sock`` or ``example4.sock`` backend servers. By default, Nginx uses round-robin algorithm for backend selection. .. note:: Nginx is not the only existing *reverse proxy server*, but it's the most popular one. Alternatives like HAProxy may be used as well. Supervisord ----------- After configuring Nginx we need to start our aiohttp backends. It's best to use some tool for starting them automatically after a system reboot or backend crash. There are many ways to do it: Supervisord, Upstart, Systemd, Gaffer, Circus, Runit etc. Here we'll use `Supervisord `_ as an example: .. code-block:: cfg [program:aiohttp] numprocs = 4 numprocs_start = 1 process_name = example_%(process_num)s ; Unix socket paths are specified by command line. command=/path/to/aiohttp_example.py --path=/tmp/example_%(process_num)s.sock ; We can just as easily pass TCP port numbers: ; command=/path/to/aiohttp_example.py --port=808%(process_num)s user=nobody autostart=true autorestart=true aiohttp server -------------- The last step is preparing the aiohttp server to work with supervisord. Assuming we have properly configured :class:`aiohttp.web.Application` and port is specified by command line, the task is trivial: .. code-block:: python3 # aiohttp_example.py import argparse from aiohttp import web parser = argparse.ArgumentParser(description="aiohttp server example") parser.add_argument('--path') parser.add_argument('--port') if __name__ == '__main__': app = web.Application() # configure app args = parser.parse_args() web.run_app(app, path=args.path, port=args.port) For real use cases we perhaps need to configure other things like logging etc., but it's out of scope of the topic. .. _aiohttp-deployment-gunicorn: Nginx+Gunicorn ============== aiohttp can be deployed using `Gunicorn `_, which is based on a pre-fork worker model. Gunicorn launches your app as worker processes for handling incoming requests. As opposed to deployment with :ref:`bare Nginx `, this solution does not need to manually run several aiohttp processes and use a tool like supervisord to monitor them. But nothing is free: running aiohttp application under gunicorn is slightly slower. Prepare environment ------------------- You first need to setup your deployment environment. This example is based on `Ubuntu `_ 16.04. Create a directory for your application:: >> mkdir myapp >> cd myapp Create a Python virtual environment:: >> python3 -m venv venv >> source venv/bin/activate Now that the virtual environment is ready, we'll proceed to install aiohttp and gunicorn:: >> pip install gunicorn >> pip install aiohttp Application ----------- Lets write a simple application, which we will save to file. We'll name this file *my_app_module.py*:: from aiohttp import web async def index(request): return web.Response(text="Welcome home!") my_web_app = web.Application() my_web_app.router.add_get('/', index) Application factory ------------------- As an option an entry point could be a coroutine that accepts no parameters and returns an application instance:: from aiohttp import web async def index(request): return web.Response(text="Welcome home!") async def my_web_app(): app = web.Application() app.router.add_get('/', index) return app Start Gunicorn -------------- When `Running Gunicorn `_, you provide the name of the module, i.e. *my_app_module*, and the name of the app or application factory, i.e. *my_web_app*, along with other `Gunicorn Settings `_ provided as command line flags or in your config file. In this case, we will use: * the ``--bind`` flag to set the server's socket address; * the ``--worker-class`` flag to tell Gunicorn that we want to use a custom worker subclass instead of one of the Gunicorn default worker types; * you may also want to use the ``--workers`` flag to tell Gunicorn how many worker processes to use for handling requests. (See the documentation for recommendations on `How Many Workers? `_) * you may also want to use the ``--accesslog`` flag to enable the access log to be populated. (See :ref:`logging ` for more information.) The custom worker subclass is defined in ``aiohttp.GunicornWebWorker``:: >> gunicorn my_app_module:my_web_app --bind localhost:8080 --worker-class aiohttp.GunicornWebWorker [2017-03-11 18:27:21 +0000] [1249] [INFO] Starting gunicorn 19.7.1 [2017-03-11 18:27:21 +0000] [1249] [INFO] Listening at: http://127.0.0.1:8080 (1249) [2017-03-11 18:27:21 +0000] [1249] [INFO] Using worker: aiohttp.worker.GunicornWebWorker [2015-03-11 18:27:21 +0000] [1253] [INFO] Booting worker with pid: 1253 Gunicorn is now running and ready to serve requests to your app's worker processes. .. note:: If you want to use an alternative asyncio event loop `uvloop `_, you can use the ``aiohttp.GunicornUVLoopWebWorker`` worker class. Proxy through NGINX ---------------------- We can proxy our gunicorn workers through NGINX with a configuration like this: .. code-block:: nginx worker_processes 1; user nobody nogroup; events { worker_connections 1024; } http { ## Main Server Block server { ## Open by default. listen 80 default_server; server_name main; client_max_body_size 200M; ## Main site location. location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; } } } Since gunicorn listens for requests at our localhost address on port 8080, we can use the `proxy_pass `_ directive to send web traffic to our workers. If everything is configured correctly, we should reach our application at the ip address of our web server. Proxy through NGINX + SSL ---------------------------- Here is an example NGINX configuration setup to accept SSL connections: .. code-block:: nginx worker_processes 1; user nobody nogroup; events { worker_connections 1024; } http { ## SSL Redirect server { listen 80 default; return 301 https://$host$request_uri; } ## Main Server Block server { # Open by default. listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name main; client_max_body_size 200M; ssl_certificate /etc/secrets/cert.pem; ssl_certificate_key /etc/secrets/key.pem; ## Main site location. location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; } } } The first server block accepts regular http connections on port 80 and redirects them to our secure SSL connection. The second block matches our previous example except we need to change our open port to https and specify where our SSL certificates are being stored with the ``ssl_certificate`` and ``ssl_certificate_key`` directives. During development, you may want to `create your own self-signed certificates for testing purposes `_ and use another service like `Let's Encrypt `_ when you are ready to move to production. More information ---------------- See the `official documentation `_ for more information about suggested nginx configuration. You can also find out more about `configuring for secure https connections as well. `_ Logging configuration --------------------- ``aiohttp`` and ``gunicorn`` use different format for specifying access log. By default aiohttp uses own defaults:: '%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' For more information please read :ref:`Format Specification for Access Log `. Proxy through Apache at your own risk ------------------------------------- Issues have been reported using Apache2 in front of aiohttp server: `#2687 Intermittent 502 proxy errors when running behind Apache `. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/essays.rst0000644000175100001710000000014200000000000015521 0ustar00runnerdockerEssays ====== .. toctree:: new_router whats_new_1_1 migration_to_2xx whats_new_3_0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/external.rst0000644000175100001710000000061000000000000016034 0ustar00runnerdockerWho uses aiohttp? ================= The list of *aiohttp* users: both libraries, big projects and web sites. Please don't hesitate to add your awesome project to the list by making a Pull Request on GitHub_. If you like the project -- please go to GitHub_ and press *Star* button! .. toctree:: third_party built_with powered_by .. _GitHub: https://github.com/aio-libs/aiohttp ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/faq.rst0000644000175100001710000003153000000000000014766 0ustar00runnerdockerFAQ === .. contents:: :local: Are there plans for an @app.route decorator like in Flask? ---------------------------------------------------------- As of aiohttp 2.3, :class:`~aiohttp.web.RouteTableDef` provides an API similar to Flask's ``@app.route``. See :ref:`aiohttp-web-alternative-routes-definition`. Unlike Flask's ``@app.route``, :class:`~aiohttp.web.RouteTableDef` does not require an ``app`` in the module namespace (which often leads to circular imports). Instead, a :class:`~aiohttp.web.RouteTableDef` is decoupled from an application instance:: routes = web.RouteTableDef() @routes.get('/get') async def handle_get(request): ... @routes.post('/post') async def handle_post(request): ... app.router.add_routes(routes) Does aiohttp have a concept like Flask's "blueprint" or Django's "app"? ----------------------------------------------------------------------- If you're writing a large application, you may want to consider using :ref:`nested applications `, which are similar to Flask's "blueprints" or Django's "apps". See: :ref:`aiohttp-web-nested-applications`. How do I create a route that matches urls with a given prefix? -------------------------------------------------------------- You can do something like the following: :: app.router.add_route('*', '/path/to/{tail:.+}', sink_handler) The first argument, ``*``, matches any HTTP method (*GET, POST, OPTIONS*, etc). The second argument matches URLS with the desired prefix. The third argument is the handler function. Where do I put my database connection so handlers can access it? ---------------------------------------------------------------- :class:`aiohttp.web.Application` object supports the :class:`dict` interface and provides a place to store your database connections or any other resource you want to share between handlers. :: async def go(request): db = request.app['db'] cursor = await db.cursor() await cursor.execute('SELECT 42') # ... return web.Response(status=200, text='ok') async def init_app(loop): app = Application(loop=loop) db = await create_connection(user='user', password='123') app['db'] = db app.router.add_get('/', go) return app How can middleware store data for web handlers to use? ------------------------------------------------------ Both :class:`aiohttp.web.Request` and :class:`aiohttp.web.Application` support the :class:`dict` interface. Therefore, data may be stored inside a request object. :: async def handler(request): request['unique_key'] = data See https://github.com/aio-libs/aiohttp_session code for an example. The ``aiohttp_session.get_session(request)`` method uses ``SESSION_KEY`` for saving request-specific session information. As of aiohttp 3.0, all response objects are dict-like structures as well. .. _aiohttp_faq_parallel_event_sources: Can a handler receive incoming events from different sources in parallel? ------------------------------------------------------------------------- Yes. As an example, we may have two event sources: 1. WebSocket for events from an end user 2. Redis PubSub for events from other parts of the application The most native way to handle this is to create a separate task for PubSub handling. Parallel :meth:`aiohttp.web.WebSocketResponse.receive` calls are forbidden; a single task should perform WebSocket reading. However, other tasks may use the same WebSocket object for sending data to peers. :: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) task = request.app.loop.create_task( read_subscription(ws, request.app['redis'])) try: async for msg in ws: # handle incoming messages # use ws.send_str() to send data back ... finally: task.cancel() async def read_subscription(ws, redis): channel, = await redis.subscribe('channel:1') try: async for msg in channel.iter(): answer = process_the_message(msg) # your function here await ws.send_str(answer) finally: await redis.unsubscribe('channel:1') .. _aiohttp_faq_terminating_websockets: How do I programmatically close a WebSocket server-side? -------------------------------------------------------- Let's say we have an application with two endpoints: 1. ``/echo`` a WebSocket echo server that authenticates the user 2. ``/logout_user`` that, when invoked, closes all open WebSockets for that user. One simple solution is to keep a shared registry of WebSocket responses for a user in the :class:`aiohttp.web.Application` instance and call :meth:`aiohttp.web.WebSocketResponse.close` on all of them in ``/logout_user`` handler:: async def echo_handler(request): ws = web.WebSocketResponse() user_id = authenticate_user(request) await ws.prepare(request) request.app['websockets'][user_id].add(ws) try: async for msg in ws: ws.send_str(msg.data) finally: request.app['websockets'][user_id].remove(ws) return ws async def logout_handler(request): user_id = authenticate_user(request) ws_closers = [ws.close() for ws in request.app['websockets'][user_id] if not ws.closed] # Watch out, this will keep us from returing the response # until all are closed ws_closers and await asyncio.gather(*ws_closers) return web.Response(text='OK') def main(): loop = asyncio.get_event_loop() app = web.Application(loop=loop) app.router.add_route('GET', '/echo', echo_handler) app.router.add_route('POST', '/logout', logout_handler) app['websockets'] = defaultdict(set) web.run_app(app, host='localhost', port=8080) How do I make a request from a specific IP address? --------------------------------------------------- If your system has several IP interfaces, you may choose one which will be used used to bind a socket locally:: conn = aiohttp.TCPConnector(local_addr=('127.0.0.1', 0), loop=loop) async with aiohttp.ClientSession(connector=conn) as session: ... .. seealso:: :class:`aiohttp.TCPConnector` and ``local_addr`` parameter. What is the API stability and deprecation policy? ------------------------------------------------- *aiohttp* follows strong `Semantic Versioning `_ (SemVer). Obsolete attributes and methods are marked as *deprecated* in the documentation and raise :class:`DeprecationWarning` upon usage. Assume aiohttp ``X.Y.Z`` where ``X`` is major version, ``Y`` is minor version and ``Z`` is bugfix number. For example, if the latest released version is ``aiohttp==3.0.6``: ``3.0.7`` fixes some bugs but have no new features. ``3.1.0`` introduces new features and can deprecate some API but never remove it, also all bug fixes from previous release are merged. ``4.0.0`` removes all deprecations collected from ``3.Y`` versions **except** deprecations from the **last** ``3.Y`` release. These deprecations will be removed by ``5.0.0``. Unfortunately we may have to break these rules when a **security vulnerability** is found. If a security problem cannot be fixed without breaking backward compatibility, a bugfix release may break compatibility. This is unlikely, but possible. All backward incompatible changes are explicitly marked in :ref:`the changelog `. How do I enable gzip compression globally for my entire application? -------------------------------------------------------------------- It's impossible. Choosing what to compress and what not to compress is is a tricky matter. If you need global compression, write a custom middleware. Or enable compression in NGINX (you are deploying aiohttp behind reverse proxy, right?). How do I manage a ClientSession within a web server? ---------------------------------------------------- :class:`aiohttp.ClientSession` should be created once for the lifetime of the server in order to benefit from connection pooling. Sessions save cookies internally. If you don't need cookie processing, use :class:`aiohttp.DummyCookieJar`. If you need separate cookies for different http calls but process them in logical chains, use a single :class:`aiohttp.TCPConnector` with separate client sessions and ``connector_owner=False``. How do I access database connections from a subapplication? ----------------------------------------------------------- Restricting access from subapplication to main (or outer) app is a deliberate choice. A subapplication is an isolated unit by design. If you need to share a database object, do it explicitly:: subapp['db'] = mainapp['db'] mainapp.add_subapp('/prefix', subapp) How do I perform operations in a request handler after sending the response? ---------------------------------------------------------------------------- Middlewares can be written to handle post-response operations, but they run after every request. You can explicitly send the response by calling :meth:`aiohttp.web.Response.write_eof`, which starts sending before the handler returns, giving you a chance to execute follow-up operations:: def ping_handler(request): """Send PONG and increase DB counter.""" # explicitly send the response resp = web.json_response({'message': 'PONG'}) await resp.prepare(request) await resp.write_eof() # increase the pong count APP['db'].inc_pong() return resp A :class:`aiohttp.web.Response` object must be returned. This is required by aiohttp web contracts, even though the response already been sent. How do I make sure my custom middleware response will behave correctly? ------------------------------------------------------------------------ Sometimes your middleware handlers might need to send a custom response. This is just fine as long as you always create a new :class:`aiohttp.web.Response` object when required. The response object is a Finite State Machine. Once it has been dispatched by the server, it will reach its final state and cannot be used again. The following middleware will make the server hang, once it serves the second response:: from aiohttp import web def misbehaved_middleware(): # don't do this! cached = web.Response(status=200, text='Hi, I am cached!') @web.middleware async def middleware(request, handler): # ignoring response for the sake of this example _res = handler(request) return cached return middleware The rule of thumb is *one request, one response*. Why is creating a ClientSession outside of an event loop dangerous? ------------------------------------------------------------------- Short answer is: life-cycle of all asyncio objects should be shorter than life-cycle of event loop. Full explanation is longer. All asyncio object should be correctly finished/disconnected/closed before event loop shutdown. Otherwise user can get unexpected behavior. In the best case it is a warning about unclosed resource, in the worst case the program just hangs, awaiting for coroutine is never resumed etc. Consider the following code from ``mod.py``:: import aiohttp session = aiohttp.ClientSession() async def fetch(url): async with session.get(url) as resp: return await resp.text() The session grabs current event loop instance and stores it in a private variable. The main module imports the module and installs ``uvloop`` (an alternative fast event loop implementation). ``main.py``:: import asyncio import uvloop import mod asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) asyncio.run(main()) The code is broken: ``session`` is bound to default ``asyncio`` loop on import time but the loop is changed **after the import** by ``set_event_loop()``. As result ``fetch()`` call hangs. To avoid import dependency hell *aiohttp* encourages creation of ``ClientSession`` from async function. The same policy works for ``web.Application`` too. Another use case is unit test writing. Very many test libraries (*aiohttp test tools* first) creates a new loop instance for every test function execution. It's done for sake of tests isolation. Otherwise pending activity (timers, network packets etc.) from previous test may interfere with current one producing very cryptic and unstable test failure. Note: *class variables* are hidden globals actually. The following code has the same problem as ``mod.py`` example, ``session`` variable is the hidden global object:: class A: session = aiohttp.ClientSession() async def fetch(self, url): async with session.get(url) as resp: return await resp.text() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/favicon.ico0000644000175100001710000001027600000000000015612 0ustar00runnerdocker  ( @ [,[,[,([,l[,[,ܴ[,[,[,[,[,ܴ[,[,l[,([,[,[,[,[,5[,[,ݴ[,[,[,[,m[,^[,^[,m[,[,[,[,޴[,[,5[,[,Z+[,[,[,[,[,ʴ[,m[,'[,\,[,[-Z([,[,'[,m[,ʴ[,[,[,[,[-[,[,[,3[,´[,[,x[,\,Z,\,Z,[,[,m[,޴[,[,3[,[,[,[,[,?[,ٴ[,[,r[,#[,[,[,[,E[,ڴ[,ش[,?[,[,[,[,[,4[,ش[,[,)[,[,R[,[,[,[,[,C[,[,X[,[,ش[,3[,Z-[,[,[,´[,[,[,4[,[,[,[,[,[,[,[,[,H[,[,[,[,[,[,[,[,[,ݴ[,2[,[, [,n[,^[,[-[,[,[,S[,][, [,[,2[,޴[,[,[,[,[,6[,[,n[,[,[,[,[,U[,[,[,[,*[,[,2[,Z,[,[,[,[,Y[,[,[,[,[,p[,[,6[,[,[,[,ȴ[,[,[,[,[,U[,[,[,[,[,[,[,[,[,G[,.[,[,[,̴[,|[,[, [,6[,I[,d[,۴[,[,[,)[,ܴ[,n[,[,Z,[,[,M[,a[,[,[,,[,U[,R[,4[,M[,![,#[,>[,~[,[,[,[,f[,K[,8[,"[, [,o[,ܴ[,([,l[,ߴ[,'[,[,[,[,[,[,[,[,d[,G[,[,[,[/[,[,0[,[,[,[,[,Z,[,[,([,ߴ[,l[,[,[,![,&[,4[,A[,J[,r[,[,[,[,8[,[,[,[,[,[,q[,*[,[,[,[,[,[,[,۴[,[,N[,E[,8[,+[,[,[,[,[,[,[,[,[-[,O[,*[,Z*[,[,[,[,ܴ[,[,m[,[+Z,[,[, [,![,G[,>[,[,[,[,%[,S[,[,[,[,n[,[,[,^[,[,[,[,X[,"[,[,[,[,Z[,[,[,[,^[,[,[,^[,[,[,[,\[, [,\,[,[,7[,E[,[,[,[,^[,[,[,m[,R9\,[,[,4[,KZ,\+Y/[,[,\[,[,[,[,n[,[,ܴ[,[,[,[,[,[,O[,l[,[,[,[,:[,[,Z-[,[,[,ܴ[,[,[,[,[,Z-[,w[,[,[,[,[,[,[,[,[,[,[,[,m[,[,([,[,[,%[,ߴ[,[,[,[,[,[,9[,[,[,([,ߴ[,l[,)[,ݴ[,o[,[,[,[,D[,[,[,[,[,[,[,_[,[,[,[,n[,ܴ[,([,[,[,ɴ[,[,[,[,2[,[,[,[,[,[,[,}[,$[, R[,[,[,[,ȴ[,[,[,[,6[,[,n[-[,[,[, [,[,[,[,[,[,[,0[,H[,Z[,G[,R[,[,[,[,[,n[,[,6[,[,[,[,[,ݴ[,2[,[,[,\,[,7[,^[,[,д[,Դ[,[,"[,Z+[, [,&[,[,[,y[,[,5[,ݴ[,[-[,[,[,[,´[,[,[,Z-[,[-[,:[,S[,[,[,[,[,[,[,[,[,[,M[,.[,c[,ִ[,[,[,[-[,[,4[,ش[,[,[,[,Z-[,;[,R[,[,Z-[,[,[,[,ش[,4[,[,[,[,[,?[,ٴ[,[,1[+[,;[,P[,[,[,T#[,1[,[,ٴ[,?[,[,[,[,[,4[,ô[,޴[,[,][,[,\,Z,[,[,n[,[,ô[,4[,[,Z,[,[,[,[,[,̴[,m[,'[,Y*[-\-U%[,[,'[,n[,ʴ[,[,[,[,\-[,[,[,5[,[,ݴ[,[,[,[,m[,^[,^[,m[,[,[,[,޴[,[,5[,[,[,[,[,([,l[,[,ܴ[,[,[,[,[,ݴ[,[,m[,([,[,???!>8q8x?????1>?././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/glossary.rst0000644000175100001710000000710300000000000016061 0ustar00runnerdocker.. _aiohttp-glossary: ========== Glossary ========== .. if you add new entries, keep the alphabetical sorting! .. glossary:: :sorted: aiodns DNS resolver for asyncio. https://pypi.python.org/pypi/aiodns asyncio The library for writing single-threaded concurrent code using coroutines, multiplexing I/O access over sockets and other resources, running network clients and servers, and other related primitives. Reference implementation of :pep:`3156` https://pypi.python.org/pypi/asyncio/ callable Any object that can be called. Use :func:`callable` to check that. charset-normalizer The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. https://pypi.org/project/charset-normalizer/ cchardet cChardet is high speed universal character encoding detector - binding to charsetdetect. https://pypi.python.org/pypi/cchardet/ gunicorn Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. http://gunicorn.org/ IDNA An Internationalized Domain Name in Applications (IDNA) is an industry standard for encoding Internet Domain Names that contain in whole or in part, in a language-specific script or alphabet, such as Arabic, Chinese, Cyrillic, Tamil, Hebrew or the Latin alphabet-based characters with diacritics or ligatures, such as French. These writing systems are encoded by computers in multi-byte Unicode. Internationalized domain names are stored in the Domain Name System as ASCII strings using Punycode transcription. keep-alive A technique for communicating between HTTP client and server when connection is not closed after sending response but kept open for sending next request through the same socket. It makes communication faster by getting rid of connection establishment for every request. nginx Nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server. https://nginx.org/en/ percent-encoding A mechanism for encoding information in a Uniform Resource Locator (URL) if URL parts don't fit in safe characters space. requests Currently the most popular synchronous library to make HTTP requests in Python. https://requests.readthedocs.io requoting Applying :term:`percent-encoding` to non-safe symbols and decode percent encoded safe symbols back. According to :rfc:`3986` allowed path symbols are:: allowed = unreserved / pct-encoded / sub-delims / ":" / "@" / "/" pct-encoded = "%" HEXDIG HEXDIG unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" resource A concept reflects the HTTP **path**, every resource corresponds to *URI*. May have a unique name. Contains :term:`route`\'s for different HTTP methods. route A part of :term:`resource`, resource's *path* coupled with HTTP method. web-handler An endpoint that returns HTTP response. websocket A protocol providing full-duplex communication channels over a single TCP connection. The WebSocket protocol was standardized by the IETF as :rfc:`6455` yarl A library for operating with URL objects. https://pypi.python.org/pypi/yarl ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/http_request_lifecycle.rst0000644000175100001710000001300600000000000020763 0ustar00runnerdocker .. _aiohttp-request-lifecycle: The aiohttp Request Lifecycle ============================= Why is aiohttp client API that way? -------------------------------------- The first time you use aiohttp, you'll notice that a simple HTTP request is performed not with one, but with up to three steps: .. code-block:: python async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: print(await response.text()) It's especially unexpected when coming from other libraries such as the very popular :term:`requests`, where the "hello world" looks like this: .. code-block:: python response = requests.get('http://python.org') print(response.text) So why is the aiohttp snippet so verbose? Because aiohttp is asynchronous, its API is designed to make the most out of non-blocking network operations. In code like this, requests will block three times, and does it transparently, while aiohttp gives the event loop three opportunities to switch context: - When doing the ``.get()``, both libraries send a GET request to the remote server. For aiohttp, this means asynchronous I/O, which is marked here with an ``async with`` that gives you the guarantee that not only it doesn't block, but that it's cleanly finalized. - When doing ``response.text`` in requests, you just read an attribute. The call to ``.get()`` already preloaded and decoded the entire response payload, in a blocking manner. aiohttp loads only the headers when ``.get()`` is executed, letting you decide to pay the cost of loading the body afterward, in a second asynchronous operation. Hence the ``await response.text()``. - ``async with aiohttp.ClientSession()`` does not perform I/O when entering the block, but at the end of it, it will ensure all remaining resources are closed correctly. Again, this is done asynchronously and must be marked as such. The session is also a performance tool, as it manages a pool of connections for you, allowing you to reuse them instead of opening and closing a new one at each request. You can even `manage the pool size by passing a connector object `_. Using a session as a best practice ----------------------------------- The requests library does in fact also provides a session system. Indeed, it lets you do: .. code-block:: python with requests.Session() as session: response = session.get('http://python.org') print(response.text) It's just not the default behavior, nor is it advertised early in the documentation. Because of this, most users take a hit in performance, but can quickly start hacking. And for requests, it's an understandable trade-off, since its goal is to be "HTTP for humans" and simplicity has always been more important than performance in this context. However, if one uses aiohttp, one chooses asynchronous programming, a paradigm that makes the opposite trade-off: more verbosity for better performance. And so the library default behavior reflects this, encouraging you to use performant best practices from the start. How to use the ClientSession ? ------------------------------- By default the :class:`aiohttp.ClientSession` object will hold a connector with a maximum of 100 connections, putting the rest in a queue. This is quite a big number, this means you must be connected to a hundred different servers (not pages!) concurrently before even having to consider if your task needs resource adjustment. In fact, you can picture the session object as a user starting and closing a browser: it wouldn't make sense to do that every time you want to load a new tab. So you are expected to reuse a session object and make many requests from it. For most scripts and average-sized software, this means you can create a single session, and reuse it for the entire execution of the program. You can even pass the session around as a parameter in functions. For example, the typical "hello world": .. code-block:: python import aiohttp import asyncio async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: html = await response.text() print(html) loop = asyncio.get_event_loop() loop.run_until_complete(main()) Can become this: .. code-block:: python import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(): async with aiohttp.ClientSession() as session: html = await fetch(session, 'http://python.org') print(html) loop = asyncio.get_event_loop() loop.run_until_complete(main()) On more complex code bases, you can even create a central registry to hold the session object from anywhere in the code, or a higher level ``Client`` class that holds a reference to it. When to create more than one session object then? It arises when you want more granularity with your resources management: - you want to group connections by a common configuration. e.g: sessions can set cookies, headers, timeout values, etc. that are shared for all connections they hold. - you need several threads and want to avoid sharing a mutable object between them. - you want several connection pools to benefit from different queues and assign priorities. e.g: one session never uses the queue and is for high priority requests, the other one has a small concurrency limit and a very long queue, for non important requests. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/index.rst0000644000175100001710000001243000000000000015324 0ustar00runnerdocker.. aiohttp documentation master file, created by sphinx-quickstart on Wed Mar 5 12:35:35 2014. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. ================== Welcome to AIOHTTP ================== Asynchronous HTTP Client/Server for :term:`asyncio` and Python. Current version is |release|. .. _GitHub: https://github.com/aio-libs/aiohttp Key Features ============ - Supports both :ref:`aiohttp-client` and :ref:`HTTP Server `. - Supports both :ref:`Server WebSockets ` and :ref:`Client WebSockets ` out-of-the-box without the Callback Hell. - Web-server has :ref:`aiohttp-web-middlewares`, :ref:`aiohttp-web-signals` and plugable routing. .. _aiohttp-installation: Library Installation ==================== .. code-block:: bash $ pip install aiohttp You may want to install *optional* :term:`cchardet` library as faster replacement for :term:`charset-normalizer`: .. code-block:: bash $ pip install cchardet For speeding up DNS resolving by client API you may install :term:`aiodns` as well. This option is highly recommended: .. code-block:: bash $ pip install aiodns Installing speedups altogether ------------------------------ The following will get you ``aiohttp`` along with :term:`charset-normalizer`, :term:`aiodns` and ``Brotli`` in one bundle. No need to type separate commands anymore! .. code-block:: bash $ pip install aiohttp[speedups] Getting Started =============== Client example -------------- .. code-block:: python import aiohttp import asyncio async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://python.org') as response: print("Status:", response.status) print("Content-type:", response.headers['content-type']) html = await response.text() print("Body:", html[:15], "...") loop = asyncio.get_event_loop() loop.run_until_complete(main()) This prints: .. code-block:: text Status: 200 Content-type: text/html; charset=utf-8 Body: ... Coming from :term:`requests` ? Read :ref:`why we need so many lines `. Server example: ---------------- .. code-block:: python from aiohttp import web async def handle(request): name = request.match_info.get('name', "Anonymous") text = "Hello, " + name return web.Response(text=text) app = web.Application() app.add_routes([web.get('/', handle), web.get('/{name}', handle)]) if __name__ == '__main__': web.run_app(app) For more information please visit :ref:`aiohttp-client` and :ref:`aiohttp-web` pages. What's new in aiohttp 3? ======================== Go to :ref:`aiohttp_whats_new_3_0` page for aiohttp 3.0 major release changes. Tutorial ======== :ref:`Polls tutorial ` Source code =========== The project is hosted on GitHub_ Please feel free to file an issue on the `bug tracker `_ if you have found a bug or have some suggestion in order to improve the library. The library uses `Azure Pipelines `_ for Continuous Integration. Dependencies ============ - Python 3.6+ - *async_timeout* - *attrs* - *charset-normalizer* - *multidict* - *yarl* - *Optional* :term:`cchardet` as faster replacement for :term:`charset-normalizer`. Install it explicitly via: .. code-block:: bash $ pip install cchardet - *Optional* :term:`aiodns` for fast DNS resolving. The library is highly recommended. .. code-block:: bash $ pip install aiodns Communication channels ====================== *aio-libs discourse group*: https://aio-libs.discourse.group Feel free to post your questions and ideas here. *gitter chat* https://gitter.im/aio-libs/Lobby We support `Stack Overflow `_. Please add *aiohttp* tag to your question there. Contributing ============ Please read the :ref:`instructions for contributors` before making a Pull Request. Authors and License =================== The ``aiohttp`` package is written mostly by Nikolay Kim and Andrew Svetlov. It's *Apache 2* licensed and freely available. Feel free to improve this package and send a pull request to GitHub_. .. _aiohttp-backward-compatibility-policy: Policy for Backward Incompatible Changes ======================================== *aiohttp* keeps backward compatibility. After deprecating some *Public API* (method, class, function argument, etc.) the library guaranties the usage of *deprecated API* is still allowed at least for a year and half after publishing new release with deprecation. All deprecations are reflected in documentation and raises :exc:`DeprecationWarning`. Sometimes we are forced to break the own rule for sake of very strong reason. Most likely the reason is a critical bug which cannot be solved without major API change, but we are working hard for keeping these changes as rare as possible. Table Of Contents ================= .. toctree:: :name: mastertoc :maxdepth: 2 client web utilities faq misc external contributing ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/logging.rst0000644000175100001710000001314100000000000015643 0ustar00runnerdocker.. _aiohttp-logging: Logging ======= .. currentmodule:: aiohttp *aiohttp* uses standard :mod:`logging` for tracking the library activity. We have the following loggers enumerated by names: - ``'aiohttp.access'`` - ``'aiohttp.client'`` - ``'aiohttp.internal'`` - ``'aiohttp.server'`` - ``'aiohttp.web'`` - ``'aiohttp.websocket'`` You may subscribe to these loggers for getting logging messages. The page does not provide instructions for logging subscribing while the most friendly method is :func:`logging.config.dictConfig` for configuring whole loggers in your application. Logging does not work out of the box. It requires at least minimal ``'logging'`` configuration. Example of minimal working logger setup:: import logging from aiohttp import web app = web.Application() logging.basicConfig(level=logging.DEBUG) web.run_app(app, port=5000) .. versionadded:: 4.0.0 Access logs ----------- Access logs are enabled by default. If the `debug` flag is set, and the default logger ``'aiohttp.access'`` is used, access logs will be output to :obj:`~sys.stderr` if no handlers are attached. Furthermore, if the default logger has no log level set, the log level will be set to :obj:`logging.DEBUG`. This logging may be controlled by :meth:`aiohttp.web.AppRunner` and :func:`aiohttp.web.run_app`. To override the default logger, pass an instance of :class:`logging.Logger` to override the default logger. .. note:: Use ``web.run_app(app, access_log=None)`` to disable access logs. In addition, *access_log_format* may be used to specify the log format. .. _aiohttp-logging-access-log-format-spec: Format specification ^^^^^^^^^^^^^^^^^^^^ The library provides custom micro-language to specifying info about request and response: +--------------+---------------------------------------------------------+ | Option | Meaning | +==============+=========================================================+ | ``%%`` | The percent sign | +--------------+---------------------------------------------------------+ | ``%a`` | Remote IP-address | | | (IP-address of proxy if using reverse proxy) | +--------------+---------------------------------------------------------+ | ``%t`` | Time when the request was started to process | +--------------+---------------------------------------------------------+ | ``%P`` | The process ID of the child that serviced the request | +--------------+---------------------------------------------------------+ | ``%r`` | First line of request | +--------------+---------------------------------------------------------+ | ``%s`` | Response status code | +--------------+---------------------------------------------------------+ | ``%b`` | Size of response in bytes, including HTTP headers | +--------------+---------------------------------------------------------+ | ``%T`` | The time taken to serve the request, in seconds | +--------------+---------------------------------------------------------+ | ``%Tf`` | The time taken to serve the request, in seconds | | | with fraction in %.06f format | +--------------+---------------------------------------------------------+ | ``%D`` | The time taken to serve the request, in microseconds | +--------------+---------------------------------------------------------+ | ``%{FOO}i`` | ``request.headers['FOO']`` | +--------------+---------------------------------------------------------+ | ``%{FOO}o`` | ``response.headers['FOO']`` | +--------------+---------------------------------------------------------+ The default access log format is:: '%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' .. versionadded:: 2.3.0 *access_log_class* introduced. Example of a drop-in replacement for the default access logger:: from aiohttp.abc import AbstractAccessLogger class AccessLogger(AbstractAccessLogger): def log(self, request, response, time): self.logger.info(f'{request.remote} ' f'"{request.method} {request.path} ' f'done in {time}s: {response.status}') .. _gunicorn-accesslog: Gunicorn access logs ^^^^^^^^^^^^^^^^^^^^ When `Gunicorn `_ is used for :ref:`deployment `, its default access log format will be automatically replaced with the default aiohttp's access log format. If Gunicorn's option access_logformat_ is specified explicitly, it should use aiohttp's format specification. Gunicorn's access log works only if accesslog_ is specified explicitly in your config or as a command line option. This configuration can be either a path or ``'-'``. If the application uses a custom logging setup intercepting the ``'gunicorn.access'`` logger, accesslog_ should be set to ``'-'`` to prevent Gunicorn to create an empty access log file upon every startup. Error logs ---------- :mod:`aiohttp.web` uses a logger named ``'aiohttp.server'`` to store errors given on web requests handling. This log is enabled by default. To use a different logger name, pass *logger* (:class:`logging.Logger` instance) to the :meth:`aiohttp.web.AppRunner` constructor. .. _access_logformat: http://docs.gunicorn.org/en/stable/settings.html#access-log-format .. _accesslog: http://docs.gunicorn.org/en/stable/settings.html#accesslog ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/make.bat0000644000175100001710000001505700000000000015100 0ustar00runnerdocker@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\aiohttp.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\aiohttp.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdf" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdfja" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf-ja cd %BUILDDIR%/.. echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) if "%1" == "xml" ( %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml if errorlevel 1 exit /b 1 echo. echo.Build finished. The XML files are in %BUILDDIR%/xml. goto end ) if "%1" == "pseudoxml" ( %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml if errorlevel 1 exit /b 1 echo. echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. goto end ) :end ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/migration_to_2xx.rst0000644000175100001710000001601000000000000017507 0ustar00runnerdocker.. _aiohttp-migration: Migration to 2.x ================ Client ------ chunking ^^^^^^^^ aiohttp does not support custom chunking sizes. It is up to the developer to decide how to chunk data streams. If chunking is enabled, aiohttp encodes the provided chunks in the "Transfer-encoding: chunked" format. aiohttp does not enable chunked encoding automatically even if a *transfer-encoding* header is supplied: *chunked* has to be set explicitly. If *chunked* is set, then the *Transfer-encoding* and *content-length* headers are disallowed. compression ^^^^^^^^^^^ Compression has to be enabled explicitly with the *compress* parameter. If compression is enabled, adding a *content-encoding* header is not allowed. Compression also enables the *chunked* transfer-encoding. Compression can not be combined with a *Content-Length* header. Client Connector ^^^^^^^^^^^^^^^^ 1. By default a connector object manages a total number of concurrent connections. This limit was a per host rule in version 1.x. In 2.x, the `limit` parameter defines how many concurrent connection connector can open and a new `limit_per_host` parameter defines the limit per host. By default there is no per-host limit. 2. BaseConnector.close is now a normal function as opposed to coroutine in version 1.x 3. BaseConnector.conn_timeout was moved to ClientSession ClientResponse.release ^^^^^^^^^^^^^^^^^^^^^^ Internal implementation was significantly redesigned. It is not required to call `release` on the response object. When the client fully receives the payload, the underlying connection automatically returns back to pool. If the payload is not fully read, the connection is closed Client exceptions ^^^^^^^^^^^^^^^^^ Exception hierarchy has been significantly modified. aiohttp now defines only exceptions that covers connection handling and server response misbehaviors. For developer specific mistakes, aiohttp uses python standard exceptions like ValueError or TypeError. Reading a response content may raise a ClientPayloadError exception. This exception indicates errors specific to the payload encoding. Such as invalid compressed data, malformed chunked-encoded chunks or not enough data that satisfy the content-length header. All exceptions are moved from `aiohttp.errors` module to top level `aiohttp` module. New hierarchy of exceptions: * `ClientError` - Base class for all client specific exceptions - `ClientResponseError` - exceptions that could happen after we get response from server * `WSServerHandshakeError` - web socket server response error - `ClientHttpProxyError` - proxy response - `ClientConnectionError` - exceptions related to low-level connection problems * `ClientOSError` - subset of connection errors that are initiated by an OSError exception - `ClientConnectorError` - connector related exceptions * `ClientProxyConnectionError` - proxy connection initialization error - `ServerConnectionError` - server connection related errors * `ServerDisconnectedError` - server disconnected * `ServerTimeoutError` - server operation timeout, (read timeout, etc) * `ServerFingerprintMismatch` - server fingerprint mismatch - `ClientPayloadError` - This exception can only be raised while reading the response payload if one of these errors occurs: invalid compression, malformed chunked encoding or not enough data that satisfy content-length header. Client payload (form-data) ^^^^^^^^^^^^^^^^^^^^^^^^^^ To unify form-data/payload handling a new `Payload` system was introduced. It handles customized handling of existing types and provide implementation for user-defined types. 1. FormData.__call__ does not take an encoding arg anymore and its return value changes from an iterator or bytes to a Payload instance. aiohttp provides payload adapters for some standard types like `str`, `byte`, `io.IOBase`, `StreamReader` or `DataQueue`. 2. a generator is not supported as data provider anymore, `streamer` can be used instead. For example, to upload data from file:: @aiohttp.streamer def file_sender(writer, file_name=None): with open(file_name, 'rb') as f: chunk = f.read(2**16) while chunk: yield from writer.write(chunk) chunk = f.read(2**16) # Then you can use `file_sender` like this: async with session.post('http://httpbin.org/post', data=file_sender(file_name='huge_file')) as resp: print(await resp.text()) Various ^^^^^^^ 1. the `encoding` parameter is deprecated in `ClientSession.request()`. Payload encoding is controlled at the payload level. It is possible to specify an encoding for each payload instance. 2. the `version` parameter is removed in `ClientSession.request()` client version can be specified in the `ClientSession` constructor. 3. `aiohttp.MsgType` dropped, use `aiohttp.WSMsgType` instead. 4. `ClientResponse.url` is an instance of `yarl.URL` class (`url_obj` is deprecated) 5. `ClientResponse.raise_for_status()` raises :exc:`aiohttp.ClientResponseError` exception 6. `ClientResponse.json()` is strict about response's content type. if content type does not match, it raises :exc:`aiohttp.ClientResponseError` exception. To disable content type check you can pass ``None`` as `content_type` parameter. Server ------ ServerHttpProtocol and low-level details ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Internal implementation was significantly redesigned to provide better performance and support HTTP pipelining. ServerHttpProtocol is dropped, implementation is merged with RequestHandler a lot of low-level api's are dropped. Application ^^^^^^^^^^^ 1. Constructor parameter `loop` is deprecated. Loop is get configured by application runner, `run_app` function for any of gunicorn workers. 2. `Application.router.add_subapp` is dropped, use `Application.add_subapp` instead 3. `Application.finished` is dropped, use `Application.cleanup` instead WebRequest and WebResponse ^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. the `GET` and `POST` attributes no longer exist. Use the `query` attribute instead of `GET` 2. Custom chunking size is not support `WebResponse.chunked` - developer is responsible for actual chunking. 3. Payloads are supported as body. So it is possible to use client response's content object as body parameter for `WebResponse` 4. `FileSender` api is dropped, it is replaced with more general `FileResponse` class:: async def handle(request): return web.FileResponse('path-to-file.txt') 5. `WebSocketResponse.protocol` is renamed to `WebSocketResponse.ws_protocol`. `WebSocketResponse.protocol` is instance of `RequestHandler` class. RequestPayloadError ^^^^^^^^^^^^^^^^^^^ Reading request's payload may raise a `RequestPayloadError` exception. The behavior is similar to `ClientPayloadError`. WSGI ^^^^ *WSGI* support has been dropped, as well as gunicorn wsgi support. We still provide default and uvloop gunicorn workers for `web.Application` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/misc.rst0000644000175100001710000000037100000000000015151 0ustar00runnerdocker.. _aiohttp-misc: Miscellaneous ============= Helpful pages. .. toctree:: :name: misc essays glossary .. toctree:: :titlesonly: changes Indices and tables ------------------ * :ref:`genindex` * :ref:`modindex` * :ref:`search` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/multipart.rst0000644000175100001710000002731500000000000016246 0ustar00runnerdocker.. currentmodule:: aiohttp .. _aiohttp-multipart: Working with Multipart ====================== ``aiohttp`` supports a full featured multipart reader and writer. Both are designed with streaming processing in mind to avoid unwanted footprint which may be significant if you're dealing with large payloads, but this also means that most I/O operation are only possible to be executed a single time. Reading Multipart Responses --------------------------- Assume you made a request, as usual, and want to process the response multipart data:: async with aiohttp.request(...) as resp: pass First, you need to wrap the response with a :meth:`MultipartReader.from_response`. This needs to keep the implementation of :class:`MultipartReader` separated from the response and the connection routines which makes it more portable:: reader = aiohttp.MultipartReader.from_response(resp) Let's assume with this response you'd received some JSON document and multiple files for it, but you don't need all of them, just a specific one. So first you need to enter into a loop where the multipart body will be processed:: metadata = None filedata = None while True: part = await reader.next() The returned type depends on what the next part is: if it's a simple body part then you'll get :class:`BodyPartReader` instance here, otherwise, it will be another :class:`MultipartReader` instance for the nested multipart. Remember, that multipart format is recursive and supports multiple levels of nested body parts. When there are no more parts left to fetch, ``None`` value will be returned - that's the signal to break the loop:: if part is None: break Both :class:`BodyPartReader` and :class:`MultipartReader` provides access to body part headers: this allows you to filter parts by their attributes:: if part.headers[aiohttp.hdrs.CONTENT_TYPE] == 'application/json': metadata = await part.json() continue Nor :class:`BodyPartReader` or :class:`MultipartReader` instances does not read the whole body part data without explicitly asking for. :class:`BodyPartReader` provides a set of helpers methods to fetch popular content types in friendly way: - :meth:`BodyPartReader.text` for plain text data; - :meth:`BodyPartReader.json` for JSON; - :meth:`BodyPartReader.form` for `application/www-urlform-encode` Each of these methods automatically recognizes if content is compressed by using `gzip` and `deflate` encoding (while it respects `identity` one), or if transfer encoding is base64 or `quoted-printable` - in each case the result will get automatically decoded. But in case you need to access to raw binary data as it is, there are :meth:`BodyPartReader.read` and :meth:`BodyPartReader.read_chunk` coroutine methods as well to read raw binary data as it is all-in-single-shot or by chunks respectively. When you have to deal with multipart files, the :attr:`BodyPartReader.filename` property comes to help. It's a very smart helper which handles `Content-Disposition` handler right and extracts the right filename attribute from it:: if part.filename != 'secret.txt': continue If current body part does not matches your expectation and you want to skip it - just continue a loop to start a next iteration of it. Here is where magic happens. Before fetching the next body part ``await reader.next()`` it ensures that the previous one was read completely. If it was not, all its content sends to the void in term to fetch the next part. So you don't have to care about cleanup routines while you're within a loop. Once you'd found a part for the file you'd searched for, just read it. Let's handle it as it is without applying any decoding magic:: filedata = await part.read(decode=False) Later you may decide to decode the data. It's still simple and possible to do:: filedata = part.decode(filedata) Once you are done with multipart processing, just break a loop:: break Sending Multipart Requests -------------------------- :class:`MultipartWriter` provides an interface to build multipart payload from the Python data and serialize it into chunked binary stream. Since multipart format is recursive and supports deeply nesting, you can use ``with`` statement to design your multipart data closer to how it will be:: with aiohttp.MultipartWriter('mixed') as mpwriter: ... with aiohttp.MultipartWriter('related') as subwriter: ... mpwriter.append(subwriter) with aiohttp.MultipartWriter('related') as subwriter: ... with aiohttp.MultipartWriter('related') as subsubwriter: ... subwriter.append(subsubwriter) mpwriter.append(subwriter) with aiohttp.MultipartWriter('related') as subwriter: ... mpwriter.append(subwriter) The :meth:`MultipartWriter.append` is used to join new body parts into a single stream. It accepts various inputs and determines what default headers should be used for. For text data default `Content-Type` is :mimetype:`text/plain; charset=utf-8`:: mpwriter.append('hello') For binary data :mimetype:`application/octet-stream` is used:: mpwriter.append(b'aiohttp') You can always override these default by passing your own headers with the second argument:: mpwriter.append(io.BytesIO(b'GIF89a...'), {'CONTENT-TYPE': 'image/gif'}) For file objects `Content-Type` will be determined by using Python's mod:`mimetypes` module and additionally `Content-Disposition` header will include the file's basename:: part = root.append(open(__file__, 'rb')) If you want to send a file with a different name, just handle the :class:`~aiohttp.payload.Payload` instance which :meth:`MultipartWriter.append` will always return and set `Content-Disposition` explicitly by using the :meth:`Payload.set_content_disposition() ` helper:: part.set_content_disposition('attachment', filename='secret.txt') Additionally, you may want to set other headers here:: part.headers[aiohttp.hdrs.CONTENT_ID] = 'X-12345' If you'd set `Content-Encoding`, it will be automatically applied to the data on serialization (see below):: part.headers[aiohttp.hdrs.CONTENT_ENCODING] = 'gzip' There are also :meth:`MultipartWriter.append_json` and :meth:`MultipartWriter.append_form` helpers which are useful to work with JSON and form urlencoded data, so you don't have to encode it every time manually:: mpwriter.append_json({'test': 'passed'}) mpwriter.append_form([('key', 'value')]) When it's done, to make a request just pass a root :class:`MultipartWriter` instance as :meth:`aiohttp.ClientSession.request` ``data`` argument:: await session.post('http://example.com', data=mpwriter) Behind the scenes :meth:`MultipartWriter.write` will yield chunks of every part and if body part has `Content-Encoding` or `Content-Transfer-Encoding` they will be applied on streaming content. Please note, that on :meth:`MultipartWriter.write` all the file objects will be read until the end and there is no way to repeat a request without rewinding their pointers to the start. Example MJPEG Streaming ``multipart/x-mixed-replace``. By default :meth:`MultipartWriter.write` appends closing ``--boundary--`` and breaks your content. Providing `close_boundary = False` prevents this.:: my_boundary = 'some-boundary' response = web.StreamResponse( status=200, reason='OK', headers={ 'Content-Type': 'multipart/x-mixed-replace;boundary={}'.format(my_boundary) } ) while True: frame = get_jpeg_frame() with MultipartWriter('image/jpeg', boundary=my_boundary) as mpwriter: mpwriter.append(frame, { 'Content-Type': 'image/jpeg' }) await mpwriter.write(response, close_boundary=False) await response.drain() Hacking Multipart ----------------- The Internet is full of terror and sometimes you may find a server which implements multipart support in strange ways when an oblivious solution does not work. For instance, is server used :class:`cgi.FieldStorage` then you have to ensure that no body part contains a `Content-Length` header:: for part in mpwriter: part.headers.pop(aiohttp.hdrs.CONTENT_LENGTH, None) On the other hand, some server may require to specify `Content-Length` for the whole multipart request. `aiohttp` does not do that since it sends multipart using chunked transfer encoding by default. To overcome this issue, you have to serialize a :class:`MultipartWriter` by our own in the way to calculate its size:: class Writer: def __init__(self): self.buffer = bytearray() async def write(self, data): self.buffer.extend(data) writer = Writer() await mpwriter.write(writer) await aiohttp.post('http://example.com', data=writer.buffer, headers=mpwriter.headers) Sometimes the server response may not be well formed: it may or may not contains nested parts. For instance, we request a resource which returns JSON documents with the files attached to it. If the document has any attachments, they are returned as a nested multipart. If it has not it responds as plain body parts: .. code-block:: none CONTENT-TYPE: multipart/mixed; boundary=--: --: CONTENT-TYPE: application/json {"_id": "foo"} --: CONTENT-TYPE: multipart/related; boundary=----: ----: CONTENT-TYPE: application/json {"_id": "bar"} ----: CONTENT-TYPE: text/plain CONTENT-DISPOSITION: attachment; filename=bar.txt bar! bar! bar! ----:-- --: CONTENT-TYPE: application/json {"_id": "boo"} --: CONTENT-TYPE: multipart/related; boundary=----: ----: CONTENT-TYPE: application/json {"_id": "baz"} ----: CONTENT-TYPE: text/plain CONTENT-DISPOSITION: attachment; filename=baz.txt baz! baz! baz! ----:-- --:-- Reading such kind of data in single stream is possible, but is not clean at all:: result = [] while True: part = await reader.next() if part is None: break if isinstance(part, aiohttp.MultipartReader): # Fetching files while True: filepart = await part.next() if filepart is None: break result[-1].append((await filepart.read())) else: # Fetching document result.append([(await part.json())]) Let's hack a reader in the way to return pairs of document and reader of the related files on each iteration:: class PairsMultipartReader(aiohttp.MultipartReader): # keep reference on the original reader multipart_reader_cls = aiohttp.MultipartReader async def next(self): """Emits a tuple of document object (:class:`dict`) and multipart reader of the followed attachments (if any). :rtype: tuple """ reader = await super().next() if self._at_eof: return None, None if isinstance(reader, self.multipart_reader_cls): part = await reader.next() doc = await part.json() else: doc = await reader.json() return doc, reader And this gives us a more cleaner solution:: reader = PairsMultipartReader.from_response(resp) result = [] while True: doc, files_reader = await reader.next() if doc is None: break files = [] while True: filepart = await files_reader.next() if file.part is None: break files.append((await filepart.read())) result.append((doc, files)) .. seealso:: :ref:`aiohttp-multipart-reference` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/multipart_reference.rst0000644000175100001710000001155200000000000020260 0ustar00runnerdocker.. currentmodule:: aiohttp .. _aiohttp-multipart-reference: Multipart reference =================== .. class:: MultipartResponseWrapper(resp, stream) Wrapper around the :class:`MultipartReader` to take care about underlying connection and close it when it needs in. .. method:: at_eof() Returns ``True`` when all response data had been read. :rtype: bool .. comethod:: next() Emits next multipart reader object. .. comethod:: release() Releases the connection gracefully, reading all the content to the void. .. class:: BodyPartReader(boundary, headers, content) Multipart reader for single body part. .. comethod:: read(*, decode=False) Reads body part data. :param bool decode: Decodes data following by encoding method from ``Content-Encoding`` header. If it missed data remains untouched :rtype: bytearray .. comethod:: read_chunk(size=chunk_size) Reads body part content chunk of the specified size. :param int size: chunk size :rtype: bytearray .. comethod:: readline() Reads body part by line by line. :rtype: bytearray .. comethod:: release() Like :meth:`read`, but reads all the data to the void. :rtype: None .. comethod:: text(*, encoding=None) Like :meth:`read`, but assumes that body part contains text data. :param str encoding: Custom text encoding. Overrides specified in charset param of ``Content-Type`` header :rtype: str .. comethod:: json(*, encoding=None) Like :meth:`read`, but assumes that body parts contains JSON data. :param str encoding: Custom JSON encoding. Overrides specified in charset param of ``Content-Type`` header .. comethod:: form(*, encoding=None) Like :meth:`read`, but assumes that body parts contains form urlencoded data. :param str encoding: Custom form encoding. Overrides specified in charset param of ``Content-Type`` header .. method:: at_eof() Returns ``True`` if the boundary was reached or ``False`` otherwise. :rtype: bool .. method:: decode(data) Decodes data according the specified ``Content-Encoding`` or ``Content-Transfer-Encoding`` headers value. Supports ``gzip``, ``deflate`` and ``identity`` encodings for ``Content-Encoding`` header. Supports ``base64``, ``quoted-printable``, ``binary`` encodings for ``Content-Transfer-Encoding`` header. :param bytearray data: Data to decode. :raises: :exc:`RuntimeError` - if encoding is unknown. :rtype: bytes .. method:: get_charset(default=None) Returns charset parameter from ``Content-Type`` header or default. .. attribute:: name A field *name* specified in ``Content-Disposition`` header or ``None`` if missed or header is malformed. Readonly :class:`str` property. .. attribute:: filename A field *filename* specified in ``Content-Disposition`` header or ``None`` if missed or header is malformed. Readonly :class:`str` property. .. class:: MultipartReader(headers, content) Multipart body reader. .. classmethod:: from_response(cls, response) Constructs reader instance from HTTP response. :param response: :class:`~aiohttp.ClientResponse` instance .. method:: at_eof() Returns ``True`` if the final boundary was reached or ``False`` otherwise. :rtype: bool .. comethod:: next() Emits the next multipart body part. .. comethod:: release() Reads all the body parts to the void till the final boundary. .. comethod:: fetch_next_part() Returns the next body part reader. .. class:: MultipartWriter(subtype='mixed', boundary=None, close_boundary=True) Multipart body writer. ``boundary`` may be an ASCII-only string. .. attribute:: boundary The string (:class:`str`) representation of the boundary. .. versionchanged:: 3.0 Property type was changed from :class:`bytes` to :class:`str`. .. method:: append(obj, headers=None) Append an object to writer. .. method:: append_payload(payload) Adds a new body part to multipart writer. .. method:: append_json(obj, headers=None) Helper to append JSON part. .. method:: append_form(obj, headers=None) Helper to append form urlencoded part. .. attribute:: size Size of the payload. .. comethod:: write(writer, close_boundary=True) Write body. :param bool close_boundary: The (:class:`bool`) that will emit boundary closing. You may want to disable when streaming (``multipart/x-mixed-replace``) .. versionadded:: 3.4 Support ``close_boundary`` argument. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/new_router.rst0000644000175100001710000000547400000000000016420 0ustar00runnerdocker.. _aiohttp-router-refactoring-021: Router refactoring in 0.21 ========================== Rationale --------- First generation (v1) of router has mapped ``(method, path)`` pair to :term:`web-handler`. Mapping is named **route**. Routes used to have unique names if any. The main mistake with the design is coupling the **route** to ``(method, path)`` pair while really URL construction operates with **resources** (**location** is a synonym). HTTP method is not part of URI but applied on sending HTTP request only. Having different **route names** for the same path is confusing. Moreover **named routes** constructed for the same path should have unique non overlapping names which is cumbersome is certain situations. From other side sometimes it's desirable to bind several HTTP methods to the same web handler. For *v1* router it can be solved by passing '*' as HTTP method. Class based views require '*' method also usually. Implementation -------------- The change introduces **resource** as first class citizen:: resource = router.add_resource('/path/{to}', name='name') *Resource* has a **path** (dynamic or constant) and optional **name**. The name is **unique** in router context. *Resource* has **routes**. *Route* corresponds to *HTTP method* and :term:`web-handler` for the method:: route = resource.add_route('GET', handler) User still may use wildcard for accepting all HTTP methods (maybe we will add something like ``resource.add_wildcard(handler)`` later). Since **names** belongs to **resources** now ``app.router['name']`` returns a **resource** instance instead of :class:`aiohttp.web.AbstractRoute`. **resource** has ``.url()`` method, so ``app.router['name'].url(parts={'a': 'b'}, query={'arg': 'param'})`` still works as usual. The change allows to rewrite static file handling and implement nested applications as well. Decoupling of *HTTP location* and *HTTP method* makes life easier. Backward compatibility ---------------------- The refactoring is 99% compatible with previous implementation. 99% means all example and the most of current code works without modifications but we have subtle API backward incompatibles. ``app.router['name']`` returns a :class:`aiohttp.web.AbstractResource` instance instead of :class:`aiohttp.web.AbstractRoute` but resource has the same ``resource.url(...)`` most useful method, so end user should feel no difference. ``route.match(...)`` is **not** supported anymore, use :meth:`aiohttp.web.AbstractResource.resolve` instead. ``app.router.add_route(method, path, handler, name='name')`` now is just shortcut for:: resource = app.router.add_resource(path, name=name) route = resource.add_route(method, handler) return route ``app.router.register_route(...)`` is still supported, it creates ``aiohttp.web.ResourceAdapter`` for every call (but it's deprecated now). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/old-logo.png0000644000175100001710000076546100000000000015730 0ustar00runnerdockerPNG  IHDR<<~jgAMA a cHRMz&u0`:pQ<bKGDIDATxwT~{Mb")fE7%&tJ7x]AҶ]eiƈH,Da+{crǙ=3s̙~>Gnna3f  BOa^ZAAAI Q%H   F"2    BnDQB    gBJ!   "^jBlaüA!   Rng P!AAA ȍpNb$AAA#b#ſNMC    lLAL)"   hoW@ AAA$8JnRf Oi"$   ؘCDdgEs!^b_D^@K AAA$8&8|)6v_|Eɂ{PY A..W&tD!    oņrD;aE>*_|-qY%g&%    o:-ȈI.K/Hg"_?MgD7B"$AAAD\lJjx"3D'_YC~RSarLAJ"!*A   "VrZnL[ÝԐ+4DeBJ|M}Ã˓ݟSy(Jȑ' E<!BAA _ o7BS!G\|]0wo{Xa>x|KHLQJ|Yq%D!! $?  Z oGQ GАD+y!WVx#$5% 6o\iJx*F{ved@K AAADD/6<RR2+!}`.WV8;UV;f;wn{キ?~ڵklhhxqg{{{Vggg^__r``zhh*=N^5mF`0 vβc0?k4^hl:SJCCCgyY;^v?{MΝ[QZZcǎV;^ "W$ߒ#_w!E&*C\W!A $@   {CpUJlԸÅR2;2addd433s'{kjjںh``zddMF^3Lǩp2LzN|822@uwwwQkk?{effNMMwINx"EdȐo%D@%@   &,9&*8!7Ćܘ$"7ĆBC&2LrSO='N,>vrddV"/ %I&[~222r`mm|'N,x'=eʔd)!"!"3S;j   >Rtm/rΌKΝ[qڵ?g TTC²N"F;.]z/<}x D\Ǯ/31 $@  +JCj,jŝpթaS~ݟ9kjkk.{`0pg %"<66vϯ̜~fCD "S LB   HrUrBpuo8fn7$ĆX _ /^|^Jzd2u0c=%fԡR.*^|w7&(B:BA< Rb  !AAA$9dIo8|%8np܀"ձa8|pK6:IjA!fsJ]xڵ?VWW/={dw $$ ""1ouAAIuqx*8S\uop%7\ݟGbc FWqJLdAAAU OƔVWW/}v``"ddd|kk .ۺuϽ b Rv$?  "B%GǗ] WDZQ… wGDK?ÇK_r%Aa\u|I??H~AAIYc*FT<Rߑ/^|JȲ-z%,{KR]lkk;nؾ}NHaHHG_  !.W!Ww3 sT 0sܹo~`c\we _)@+AAADIOT&"8D7~ϥK6wwwj4葔 I7 T_v.Fa]  v   08TCFwy罥uuuϏA)] FFFZ[[\qqqʝwy/ו3K G_H~AADJo8܍SL:244tez$8Jh{ @3@[`'$>  "$XUrHeqHx,8wgYv ""V\8rܹ/c #AAAAtqT:N<RԴSR8== DT JzqGqqqɓa3@NC  X@rx:*Grxq70SnK.mS>z#B,dhhkOOeWኍ%A]AAI#]V!!w1 sY~|ܹY:Sz#S C{__ҥK.\3FzEzn   ߋ_x#9qHvq|K_RTTܼG\`5 |I|Դ+???p}  $@Io $] _Ν[]h2y  T_tisllOb/bAAAȊ%XӨ#ƣ//\{nDG(AAE7FV6HD$=&i,;l?F~|}##/$>  usJIt .fYv"1:44t?~L$T$"?y DAAALHtC8"Gr9!%9>:44t8 =pz19=qy fAA#Pv 5>ی}7=oiio0q 7LE >x!6AA$:!5">?tz,!/zeݻg1 3ōp.t]$>  HtMtHusƸpˑO>5ez  Fʕ+HLLwFȋ?>H|AAp):<[WvsY)--M)Q 2:{ܹ&M"?>ƌdË.$>  "Prx+:9>ø޴m7ǔnlla0Z鱂 "1LY?tyEjˋԆ0AAA ؊w1 s~\tiy&z ;ر>ǦN#~E݆w!  s؊I===e,ˎҳAD)ənǿ   I>gy!_bgsغ9ޣ F}zڵ?:t}v}|t܅r>  "Tt:ӱn;vjoo2ͷ ">F{zz:Hw}xrꯜAAQ": :c2bɓ=w K6GW~"1Faނq zh;.[CT#W+1|e\w~}C_=M0ko/"޻t}{37X] >.AADO9\غ9o&DP?U6`鄾:4-`)|Ts9tT<ҕh_GpP*$~<Ƣfxe6j]sD_+QkƢ~<$p*ђyt#zN?1Q F{4 ֠o"lkooz駧2]]s>H|AANc+'O\244:h χ$נy#1K;:l-@uū~_ {cVXJy KE$4/EG"t݀O`P];07cǚN8a{Ƿ-9`<,㟀SAA!$:6|΅M[%CH~ҥK5sg0 At#`ϡsP7/PxվKկP+FTX8ʄps_fKd{U_>w~uxi:׼ x?y}tF>,-fF&&Nqէ~_>܍|L4AADOHm[a)<-c+=tE' ơvƭ_Ю؈쥨(3_%^usivϰrDxL@DruLpg'6A{^[k^I5ў zǭBU-(ƒqwÌbr>H|AADLa7Sqs Ɓc-O~o|yҶ7N5n~A(F 3P4=; 5Ovg`:Kף042CHaəxA  "dG E|m+gϞ}6a6@} #Wh+YtԼdlRnw&ao2qo nKET4j{m-"R{soѵoxퟁnq %r]Vnhҕ9 _{G9";"AK3qh|~:e!uNC3SdHÎ,CobR:?g6h4/];/,#AAo_6 mtՎގ }oG/4]IN.%3 -ih=]"2Qdt﷯L;0}y)j0u*Hu[~_W$+5s|=_oWbDwːh}yZ^ghzq2QB8vYު1h/5j4Z[> ֫W?񵶮$>  #:)1tJrrOkkk5ͽty(4-0AtoHlv02~(JGp%2CaEzWEi]JI30xHk*W 19;g},,2DM>i~+ce%K8#>>#O$>  ?y~㊔ "ݼy/ZZZ,;JW8Uy s&7n25$vW2vհ7 4[d%3] 52DFCבyΚo9iev5t[ѼٕtQQZ8T^kf}=._LCOlA9ŗU2/1ZU4<=7g$5&"e]]]EO  Pt/̮"tuTlW   X.sղ+)tO̍Y;]"rCJl8uk:#*4dȶ/HirR@mR@[t!V^%Gs|}]))2.Dfc 3;^"D(CBDnw y`4^pk9_QQ1?DI  HtKt+T*N#'Bs2K_:7rñkCNdž\1Cp` c$KJd?τ:{&49͙TY }xJ$7a\r&W_0)N.wkzrDJ8 $ǰ21\ɐ]!:BA R 5OOESQt4OFaC%LÝtD*SN-w  UUUU*%w{%R oĆUjpx5VV9BC(3\ ]}D*wC͂4I$˜Pf+cge*KPybʀ>o#:Ĉ"G1v(c0z01r`"Qx*BIq\tuB+ 1 slI|Au_&(:&":G1bOLǮ$IFAƾ4e)3 ͙ih9փ|KuR} їy50XC1T,5Rh[YJUVR4K-L:g&4͝e+]}7Ӯ ((CLn̟c\i0)ҝXuW0~M"gTT8V.;q] Dh$@m)x[kRČGd2п?/TϞHsйk6:^h1 ;] j|a,UtԽ05OoV*˸#u+:jt Ľ^:ATQѸ/7 OĆUjXņd 4[SڲЖ.reT`_09`X00(Vn+_7p|3E^OybD΂.7,^|XK}8Ne\ G Ҵ+MUOGhllDCCPWWܸq&@Ss}$>>+!>E`S  NvL$C(:nFt={AF ]i YOXYBiD'bC[6^:Kƫ ޭА.$)Zʜo_lqEXB*X7)b)^wzn'R4NſrD"g'BŗRZAy#B&"A@-@Ǜ9hoi@kk+Z[[҂&455͛:/VP fW.\nҤIRkeq1  Htw!:eدt ]8]O ܃ٕʚo7&*7<KmeQ Ʋ;!n ;[0\ ,ER$TutpcccwX| 6%AADHWV!yEJt|a): kih` aC%: Wiyf*j, 4ohyySȨԈpսs]׆ gaV.\r1Xpno"ëiWFʎҤFߋ!}6;8?j"DLy{nB@VCVCRall cccvddd&@j/bqPA]h9fܼ?Rlv7/@j$ j###92">o:k$ć/MI|A3@RYIOGu>})tq%Sޖgu,휅v'e  Wc)wm8wl \qMj>;>DJfȩY/= gu{!sfǁˎ6;&?D) RûNNV V FcOQT70R] QtJGEj@tHuw 凵fWs@ߛ{謹64`>33,2ć.s! _9V1Y :+W=8{ğа#nT:űc\pt2]ݻgO {!vox*7 G*]e gH!P%I! fŀˎ6R2DK RaR h4h4`0JCIF-hTASScSUJAOXZW|۸Zy6!fhZ.QS_D2oܸNZeKc.AAHN@R;ٹsqjg--cQJ]㒣gOmf>ˆq(woH W]NqaZ )-[l!YJ#Mx$[S91`cWVb!V"Q<Z%z5fL&as-X2 DJoG[˺=G ?:aˍW!3c\~p$?} ?e7 >h̅  er:c#p'Oˏ~ZGrh/|_%*9GU3]?k4x47gè\fOp߹kCJlpeZ`_sa`y£8!|^pGH^=d˲8,ڕ1t1T,waN$o>n.Pb[זK(?b/܏(߂Xr Jv|ٻ~y']\R|ADs:1iٳgt4pa؍Yu/L-9GU3v]1gk9o[9v8%R "8DGStnlBml~o.Y KpS6iwGqr?l)(St~ԝʗX68 Tg*@ĺ?䌾x*?$Gͮ$G`:zl7z._Ie=s! CI(2s:+w1 38M|LW@mPt~ Y*CjTEšXbS춦Op.mhKXJ-8wÙ5 p\|rA@[a$H~2S><.?c֡C7c/U{mvw2:ʷ@Uw.=:ӣG.`1|c.BAA]W̌|_Y|wuu`\؉Wr9)9܍uqVa K` RFTBQpDBPdPPiPk6ړ` c|pދL|[Yx<<"@49/m/7:6_aP8bÆ `{| u{Auux52fիO,{y~9&ϣP4\жs\tBrU 8mYqXp >"##-UBAi9ÏG^tA~]~FĻ?F_|)?Cۡ ٕV0r8Do4dg|wkl1BA]_9uR^_GW;ߣoBk/!{%/GKrۮp=bN;d8X N£`F 0 0ןz86̋+kb'"Q3+탈厾~LT~}IFT^}} 2^{a{|wc.{ AuuxyK}߾"_۷ Dc9) y YqˑpnWp?b/9LAXPcqZˎȓև * \nbDg0g²YaTO0qۋU| ;mܗƃА @͡h*Zꩧ2m.10c._Sۃ  CY9]+woܸq6X?AcC; Yf*4BK΃h1KȊr$XQ.69T!-<˟ƒ-?.khǙ5@[Wz{$]tpGˉ\#ihx/RrԪ[#/h]U&?rVm; ʗR---ӟ7PS  ( %q|W_}u`h+Ϯ~P|]ǟ@ݑDGsCh[5hL%9FVʑFUtqI+<#ZvpyB8(JqaEU]1P˹Cj*?Lv%O~He~8ȒG- ZV9!;Qshʷ[># CөS1ÛPS  pJ*5rҥKW|I} d1ws7GjF{tEWރ.jCl\E*ݨOK`P鼈nA8U@Abh#sD-hE<؋Ԫ[]+QkК-y>;0)W [z/,B8*3~AAdլT(ʤI|fnwnCgPRTtA{tCW:l@w\r9|-9UrC#V.F&˟j \8\Vh R+{qv*9=%UE^(>@'Fol>eّW>5iҤ{CM}–AA~MWǔW^ye%flcv!][==tdGIjۚڹ#]+dףxSׇU|y5Vt#ZсBMۃ  qTWǯ~8@ׯ |be`r_#t6`@ ^CȊ*"9,DF[Eț"]ɡ(hI|ّCm/غ>aP}elCNͼN61z`w{{{ CMq$= "-{N:L7}k7m7rVJG0TC =pv*H~vGQBK?(.4_e p]=[2DB #]SǑµp1XC1|Dp 9;g~'j믯dCM_aMmr! [5;ɡCjJaÆ_ +h4r3~l*9c+VF WlĈr[ɡ1BVlJHP 0-#LKB5)K>-z::CqSK^B8SU>ɏd1!6"qCy '0_rʟ3n;t{Ln ߮vy:f枋/n1Ct.CU-Qsȋ9 6cr3Fdz> 9< >t̊z hKyc+ـIA:(a& Viɼ]x*&?mzyY|l3Fn]V!kX}Q9Nͪ["?lD$C8"R#/TmrM~X><quRM^222r u{ADˎPvcOj>9Ƽ5n9܍8- mvG\ȊS.GH*]Ї(DePi&ϟ`Ãb#P{ b_a!;凧y.>ʖg-Cj]{!XX= gѫW>nHzA$:|L:Ѭ)۶m7a;A[!gflNtToJn9#+a-9Y~_)*-N$%Q#`O^&4P)/ZJ#?\]C\UT|wq +1p ̺QzeWRAAv ,eÓ+c}9'Zn':ĂH])ɡVCld%s9BxM-(E`<ĠRZtA 4 LLChz1vէ&MMHzAD:]󟧍]AySP+ u{lD۱K7Mt m0ex1#+5p <>(eMjq֙0 ٠R(_m0j>.GKj^yf*j0 wSOMQzX=@S jWg=kҤI\zO,˪:$Wt cO jw'nO2)3 mEEc+qa:S[Q7Ur,9?(Խc)TLN tz(x^~"Xv؋lȋOg6ŇC4b44/@sQ4u{>?2e{Ј AAQvHuu &ظq/GFFޤ+w^ :Z`:ڏCWZp[q=dM+Q!?!h>$54pdr *- |0zoo!4dst~ϻ>l=N|>.rs>zJ6h wǡu,<Ӆ7j}_ZAD_uuX~S0=&|=>0 _f2ss7{dNTusHx.   ټsf@}.p2FVGaZkևl+~ԅzmm9]kׇ+ѓݻhećWAf;.A7@S_v{ :Z:..0SΝr #E?fw,ѓ=} џekmm@t2wzS[ۀ؍DꦕP 0E3eɁټrA>pfh9q> *rنV܉GnLa}#O|<7 [`7r [xZ=AA$;a8zbN73z#!GEGB /HrANc+VpVX !àX > *yA>wCv8&_y* F|X7X VXpgIHn2п?I|tuMG3SQtV=fhL]'O\aۃ  {!w-T?lmmҵƅ0j1l]Bt*\-^Mz;!!ENmP7GLQA# * ~e,8 QN>M0Rw}z=[ć|֮;\C9^g͊?d@Sa5> AADtW9rdN{k{yߗ,cK*Y u2]V(9d-rItx`;і$/Ę>?(hplAxfQPićr pz<?}sR: vcPB|H 3szw^oOsqhJ#.AD_ں:&O|occ+t}2G}fMt4앗Rt.t)eKa8Z4nlQt_HtLbQL"ePit>TANs5uO /Q&>P?O븋XAڬDh$@}$aA >^ctP__ɓt{| \)I ",d?GXH>ÿ}+.V}z:4EF :teKW,^`>)$:^|J$,|&՛_򁤍l^._ v KG!a>J>+DL@|4,>wcj`ll۶m 㼾;Afva$#Lzٕf)h;?As ;qsʚP,AFRt-:NoSS4$ * f%w<ؼ2bټicL*M'Y-O3fޅ0,1+DćXG ;| tAl6o[˸4C#.AD_NԔI #jvۋ&1ԝ0*\ r)L%0/W~UrӊSS`<,Fܔr۝bc $`Ύ=N|M^gՎBFs}ǎsk)AQ!;܍HW#,w1 s˗8NM@ҡPgټRyPK1&T`K*)ZBtXJDLQBr_% ~ *_c^N?]^\)~ GfŁ͎ 7:`/>z؉R]cl*A ˪?Ǚ@S#.n +;Dǿ dm"]#,qqq??IWv+f'{DIIt5Eɇ%.lWd>$'#= 縐9>XLrs?'ɎxkU|HntK={OWrG\(׃ i-,w1 sOQQQ`h=:rbU,:%Kl"e /%HJ[x0-')"EyaW83_WXL%7ԃ">جXćv.\ZCw-]40 yyy},4BAu^uˌ]3s:"jv' $u%:F֭+ވKoZnjA\Sy$$!;4s9%koq"A$$%=<<#sfňQ.Cv 3*[`Ӛ禡|{8Mr7n<Lj|r24Gć0tFaG|GK3qR!#.'Onq7?#.A3)vtG7܃S/ens:\m^ftBb7C)_CޣIB|MmGI*=|MqQ2?[48o^c%wyLb[] C!wTGӾ$h[.хD8Z7W~NG1pwYNT0/eA|XMC >:{4gց?dG\\\ "×+ga.0Sx≩ ]xZ-n޼i갊]]]A__188!`tt~>r94g mB/DR_͂#oL+Y_=pNW*S[ kOU (;(h_в"啋d=/%0*yoP2^kJNUR/H=XП} ѓ=]Yqxe@:2и/u{Q+ MY..4ͧg  Jv6rf ]ec7rM&:mc``6166Z FFN^@ uI :xqvItK#,#e 7UE*W$)b^ XI>q;Va/>bKmC >%KlcT >ң?o!zs[ >Z@:nOE^^|ؕ߁ի"ÏzV3[\#.B͈ I §+g4iҽMMM{3v$V 4_CSC*:mCRA@BՎF& ff,˂ӎ-Gt.xky1 }`KH=R^@-s5gUqBC_L!ßB;a˝l39c\|X=ե|U| ćۣ;at{Ot^ {&Mt/3յ$= Htx-;ՅAv|aɌH^ٳ:44:p's@3SQt40M/D3t,GWSy}c###6ѡVmCىhfٕ h{x0PnN ( ,G"wy }ZQ󰭰|iáC&9$!U;kPU|h:2Z ŇؘۣfWZ8N>ܹsƈzLz+CaADeX^7^zi^oKǚ0WPt=7 /gh1 F9=}2{! 64Ó1kËm[XvW_}q^](=&1#. > 'Q__@T4؊LuuXWZwB&:c:oP<++~JVL9sa>/~ܭf~Ql ǎ .N͐Ri;R\dY*+ yW_CLH ^4_W$ϻ;\|&Q߻;B_lF|o\vc.sO`ڨ3\ 3% pRǼ0y_QvĠ晩޹sxWm|Eaj D!+aʊl]l^)H^}\4з:4 \͑Z[)ԏzlҝ$ J__.f|lׁn0MTzl%Ut1WzJ' (@R~?`پbVM+~p!,-EI$&%;B*Ó1kGP7g~ #?׃L Hv]vXIy6OLh4ף5j[8ju갎t _D#ՑeͬUtYq`$VfUk疧h8 pqީsA\:ҹ0̅dX 0׿n] ӥC0 *@G(9;(y-p$(|]YsJ"bc.X= 5N_2AzXs=܅#׃ "!!'Ԛq0:ujlo7Q3Pҗfh9 AמtA8CfcPF'`H"TGJ&+DBc\aI9'^v Xp᪲cu}@ӛn) j#f˟ .*PkR)), $J`,Ti +Z㉭0_7 N@_0ZTE0--Mrfzz3P6tBY3J~ϱ*8"pJPe._b0W,|`P.^ z*ASƗt)J`d n-`b/B"-DwteGyh=鸙}ݓ4G|1Z#ż(=9 НG<@Ӂt4OEݞNBG}^]aw2aV9A$:&N*VaNo}h~ w1 v]eavu$غ:EIWwv+65}T@Yg]FbEKѡ/ ]Q"+`+Bw& ס?ީCL|ny׏+bf$*|wHXx@A]>{ȟ@E@61Ft{˖u{ -nn}i~&=:::1zAXᤎcٳ:<|1 @'?rXGÓ*Vt?hc`ozspGC@@kª\Eb²cVQLb²#(I &>XX=\Ԃ1nE=:+q0bddsq3#fJ\ Hv- |*;}t '4]vuW]#]#KWG@W|Q9quG܉߂ځU+lMvJEdGY:Lۡ937NCX$=_϶Q':l b $OrHZx?.ƒ˟Ƈ-,tۘt]HsGnPE&NWOLHXrLi Adf?ߘYt]PRaW0Ԙ>+%V*`F;[AClҤ:'@A?[0~M*gB灳PvX8zݑ>ammGq\蜭n\1Wnan߁5jRzLys7\HzADp.Iy-E;*wţi^uuĺ:W+&:MPfї( q]@_6Sa %bNtPeǂwwP]bfuf_ gd|7r n*a.[SisWǛ;5П!ǁ![k *JENn (Kτw`:;[1PSH7 XsTzL/ mp! vUvlbOkoFsf jz7]bf]}P?ݳ4*ez! %BWgu{1L7NCW H2%4;ac+Ib THb<{]> [9\~/?ҔQ{?0;0S9_HzADt&RD V&jӮUPRRl>4\ ]t W rQuv,tCwt) c-刋[/9n^b p=JP$ˉ%V-3sa|WjjD=j`¨ %:F|V/Zzu|jvuXdGIMv+IzrF\\z_wj͍V|/I&R 0 ?dPS_w{[=MKäugNk?"=b78JHzA`[7'333d2uGۛ[ߓ`[7kh9 ,֮U|GGhUDw`V F_ca%?et>s-J:@3‚vBBzpZޯ pjw2[2oc<4F!ab&=ñۣ0a`Mѷd2eee0 s@z|C  BLvxvz˲cʱf4jwǠ~OSWG9Q1T7˿]WvnTtТ.;<>=nGs|Aþ8̌Gx`L^vxfT'u-Mq{ę-RBLZgKlevJPwv\ﻠ aA Xǹ vmj(űIn"TJz%ǒ u{=h1hɀq%F9pҥ2=AR#,B1N^FݾxEþ84H@DIB%C82t0.T]!jU؅˟(<;0_pTb{y/A"&;%- ]J@3DRCFnjtahlC Vbb>[&PF&@s [nuR˖ad FKx1T$hh:}qqRuM;%pm$Akk BLtTvL4޶ܨj4}1AݞX4eGD$dD}W cxٵ)2j>Ém/mq4)ԓ[n Zt: @pGWHw_8A",J+l=^v{t礣+; G/=ңfw :ׁ5j|(abYe$;U^<Ɏp>ücp1 ??=9IFǑ$JDDC)FR 3Nf|m/I _ٻ2k֬Mo#KP;Vde.:xїT Vad0>{.Y|W/;7}Wm \v-U㻋hJ^~]L}# 5W!B١+Ma276hF^-O`B@J)T@PdQi!!b[=Ma KAwN2:n=XU8@z|ADt/Z$j#I.JHq:Tw]l ,lmk +Ie .^~ h!0ЦFeEW<tx Gb"]]z=Z-z=tbZQ,<OvX< 8#B t{X7˗v{$F\1\f'=zrѕdpq l]||_2kk;IzA76K.dǦM~ޡV4;aO`a0ZUie$Jvusm]\Ndtu! /W0?쎭;?9xIŇ*M(=Q%&vls+^hVJz( 8i=n􌳤]xpd~#*Fn|ۃ=AU^z )#.7Ңj^cMAa*;yY-ZGk8maX:,Cc)]<[0箎Y1 bٵ Ŵj!~D*4*Yy)Nc2>suFQ:#LBCvDki4~_aXú֠\:h\lJ30Vtrp5R/ڳQs ^z)FBzL 0ّd2b5Qdz^vK3.M, `K1;`R6R:b)E]ټ^POWjxLJDG^r;ԅ"Y ;йKCGvDkik&DߏcXxQt.m{ ·x|\fjUww ]am)N\APB922v0)nW[\Z%9zWך/_$0,wkAA&";&]r%*dI5쐵,t# \yXE 8e y C3[ud`NFZ&!o3-NmGHKMrI !/;l҃:}^ )S;Fy2##.5cМ3?Zr=O?Y/ǿ A'کh;?FC^pU^Et-]22%e7씋7 zZ* dDz?=ySӱNnNm .(ݳ%0kh haf2n诃*a4EP$B}QABs)hmaX c-7Syi:( !gZ׹ވC҃ " :;D?aWA!|%ڌ0Z>+ ;a(]|h S0'edink986;^xO~['[\ os=AFğmmmk$= ,;&Mt_GGGI ZA^G@vxaTZOM<`p 4=Y%+UAFtyV.h7T=AG0 0'nS)a~;[\s9eG  (4i S Hx-7IͶph;6Y'y`W03B.Saݑ)uvCsk .p%5bt{^w1"VNGD[G^>̴cXsKb_eA$;5;xX m+DI;&!aa)*J ؈ڪ$9l8%@֋d9=rz3pl%_vw<|)S;Èյr=:L5cR fh2ҙ hAe5& 3;L#hJ '9yb+gAпĀ+y8xmXCs< Sa`+rt/| F\rz8EZ#]zI Hvx';\vv455OYG~yr:LGX9.BRve mY ũ&b,?yTd=Bh:XKmkR 0?Jq5ޯL\20 A_ʎڗ# fjjƊp1d^нBUEsm, 6cǷX@Ų #VvOO *=d 7ا"aNA쐐Ȏ˕ׯ_!QGzpR9yެS`Vd_vC0^xB[8.GY#^xO(K%VJzKmL6#=:=>O҃ Heǝn$G8mbi?2WRvH^zRP]0/)!(_uAD vvLb+ ;f澷zk3s$kz{c` '=l9ɵlbc4 h2Ud@Ȁ^cy0Y>;UU+OLnǃˎ nƂ+`j4>N0h*¬SY Iυ0 Su2 !y#>a~K3U\Rp-e mb:F/y 'H[f/a,OSKS߹FK1Rbb 3MFWN2EzC^~mi3b"}qrdpA҃ Ȏ/Ȏo1 zӧ8h8ȿ1fˎ$;1P,;ԥZDUv3le[ʋ`+R~E(Z(&ƒUڄV nǰ@xA(ONAԟr!Pߋ{[ߕ*ƥ<&=J^zKӡ*XiMz K$'Q}_m6;wn-0Z߱IzCFȎt1q lyuOdG.N&0(3`Po H!i"w-ˮPD1fEIЗ̅x.TNC!TU._Vtb#ؓWx T>D zeQs!8.=qa?@2(apq1\n'=Gc&ǫM{>qڊqLY҃6),ˎD Ɏ/?Nv du*;㲃ȀՑʷldt ]x gD+ N H#ERx ƁܙT\yFp`D?zP#DlE:HcДeؤǨOǥGEf7 ˎeee "dǿȔ_=\d7я3.;Z%QvUٸ9ɎV ;BîJ\C]k _ȎȎ{S| ye쉱&)kg]nb OG\R+c0ZRC qoj sqf3P# VH26HJږC\jĠ獗pޡh͙3?-AD? X3==q";䮝 M,&=3b;6&Z#_x~*:W!Ebңq<1::'?f$=O"%dǿ9Ȏ]Ȏ)wqE0Q {m{n,[aŃd]v (¹~t/ڝ0^'* /qfPc!(:# `W\fVIh+^֤|aH;eJHzA\v|Av|rM555;#OvhR {RаoMvtd%9Ɏt;anb1*Xdع nsP--+edB%|ӑZ*0R:Y[kȀQiE+bёdsQ'-y+^rD7,_<+gIz $d nF_ˎ];E$KAuWY?KXx2Au)'zǙ従ʅ$2?JdmZңa_ j9g9X*⦼-n 1 Aj 6 ï츷r9q5h֍9IAþ44HɎn1*CvdGS>eg)Ofpv;Uυ0&Mxh+#-sTg$J- ua"F-£/'dXx._ U|º%Rfz;(:JYW#q(Nz<&]dtHuA(ۍ,ٮɎ'? dBّn/; eYv3Hv TO=얻s:eo@!Ȍ] ]z=XnSKov(!$4@ٚ⴦փr:ʲvңFGGhllQ-;(01[×j)Ĕ Hvx$; gsssq١mcq9^"f&T4x`GAu KyP~dRTJ?TY9H"Cz'.=]FSֈZYqhc[ZźZe,nd<#[ Zʶ~d2F0\Ȏ61X&*;J KB"çkġH,}5d=7Јն ,ue.Bȣ>u)=i؇ࠨhƼue0Tc2C[d#Y,a.a1ctH9YmGQ' eBdȒe:o?Sp]H`W{B^@wD8( }M?TK+jCVcllLTzt6\Ckz-m` hjf̘ bz)A[dc\:;?<h91 ?vbY0 >詈5QX,x";pɎ@0P`W1K1!6[`Md#@oo/z{pVo 0?|{%fFQTzvUy[,xEkђ&=:=.+?0j"SzPA%;>ȓdǷǏ` aFWNd=z`) c< \EɎV~*zX NItOߏܕT* FGGVja0`24BZ@a:xIznu@\]\hsN*+G0[1X}%Gpjk秌mq<"Je'!w1 sϤI6Rա٢lMv: r1b';te$;UEϦ`ULp3TźhΆ,fĭ}3пgwMGw#0d'|lԢ===1Ch˂X2柣w \~"tOsqEc{]ǁ큹AsB,=Vr:&=z6Kws#} 3bzC!A PHi]]H9L/;ɎN1X# Pe%BSNv+w**K7pxt.31l?twcpp {W_FFFRjml6[MlGjZn<:Jxy;(=00&”,=AU%K0RIztH^uƍ Fv@d}O^ "j_G}J4BKjˎMNeG6_:`IvSt|s|"<]Cǻ<bc@OO:;;RC5t=R٧jFN7>b6a5\) :JxWaApV͍,=U,FK1ZITzң1gVbe>{:1,01bJQ72r;>a`܎瞋cYv4"fכ.>gWٕURʎ0'B\5&E4@x׿ o]P]ׇneYe1W8zKVcl n)bb=46@~:Ż;.<C!8f:r-;'ײC{ \6'lN0-N u/=T0ZERz4FCJg滑b:%b+]A!R!9sNk >k,١>cGe>#2U,3\v SS>_vү< ncccz{{Յ2Л{SK>a8L'7q1Xxw/i=A뤿`J?T?Et\96aT+nb+] U2*h;DĻ^_ v0 )6#)x="h} +єK1v| T#7;/!*q&^Ů@IUx~FZjB??rnNζOFYk1\롭|tb#'6h_{h|]n2%rGqnO? qq>HrPw9r쥇r1LĥbƎoq)=nCC6G{&M~S!7o< q78ɎgnHfMCҲ#7E$;0N@vt,_?qᑟ4 ea2`4hRG[jCTtCקd/<=]F|aF'77khOo? ^ 5oYAR6`J?Tv1c/\q:̖.b)9cǷ`r3nINң1o5/Ĕ p';>8 s;0 sٳgyA 6Z]1P ;o:7ETvrxّ6/\p3^S>qvAuR5 \^IJE@-8˲00L0 tPhJgƢgtt$Zb4ڇ򭢣,J(Evp6 x?99}"lJ<-tO?^vx0j]Xg5pa׿NN,Ŗ0U,b'=7W0J֣xZ ؤGSz :sf&;t9saI\N,Y@eʬLotʆpf؁?{gwtt2;;.QjԢ!,n;'p򾐑v'{CT"pIɎeŸI*OIJC2Ic\J;Q՟?q<ArCJ߶0:;;pne=(_vM|hsˎ`.]V}T ųIV,.׿`an1sƒ P̙o-{\d\vp֥hlK?RuJe2Tpiful>*ZUK_ RǗ~\`'Wl,-w| U.cϊ4p`~#<#Jcݮ橁3=@2V LQ BK=go{!Gz r;np )wy4dhoV莮q);'1`7.K`Р:Jݟ~՜97#s`8<C98 ң [ XYK?!FY\ի[e|1M莹TS^:)`SV;6 UV-Te y_y<!~=#3[ͮ橁>% )LvXVKµUnV,[HJ#?~ C*g 1%3R*1a^xxeRU[ZƜU6!~&;Nl6/ť`sZ'X$p$EĚBTq)r5Y10HkPz혆(i=pʲs!40\x6&yAto_"y`+yBcb2kjc dGduGۅz91b/=nV =նFc*gh_?e5;wL`\Ό~Nh Dd,rr;!Nw3?m'Yh_m[?JvOn^wǃ{+S?+Me&Q8_$o}ȥnxUa:2#s?4CmySLꕵZt)6aHr;;/d~6gn|Qtto/7RVd\ȏ u| ʅ`+2Z:AD?#r,F.~Nj/[l+J5П&Kz4FCJg;3u:]~1 s/cb<ftdzN4歶md+; '6d/<`Lv޸)Au '|ٵɣіIz}8PPg<kh1 m;f`l؁+h;d0T2/J>̰,gaX cRʗңNl-=joq'Ny|<r;߻rʳafРhMvAgztw1Ʋ(Y}6/;L0&d/[vX[:*%: .? h"џ#Ga8,_z< }GV;àFϢ@2+{[1d'4%>mu3ݿ?ƀ-KW °!#F-|l ,&@?7Ԟq}}ZEi̟^z-N`XCR˗At'AwBZztGgzI ` ?裏dAQ1UnG^^| gDZlC*trFm0_}v"s'.;lo`)OaRe$1a`?[rcu{Kq(#Vvh[?BGhʎ#J`Ɋa"0"3$ի_g-n#ZlRzkhWIW8ݽȏ.\U>y|_DA?3X e0T?l-#ݮ88O?tPR$aƟ_.~=4pˣRlx*Ap4C/V N4\ yj}.h<ƻ8VNzKGrOmXze=7v^o3g:y| tyDdv&'Tn#Wdu`xIvsă͉^xP̠TwY" ^0]{@߫|Te:P-᮪p'<*-O73HWk7ExwsWPO"`CLXSۜu×^zg~7yF[HzDGY\v|N$:"25UEدu%;܎00uZ?>gKZp߄W0 b ^ۣPF?T3k(^cʎTˎт A]4%;a@;$ϯ>q驇w(ƏM(=<૗ؐ`+_7ok`-c/w<8|nvX/Wlغ`:S۠;.ÕhYP7] {q F[yy4B~rFYv0}&`𵗡4tdnO D[bfu8vud`0jЗ·t굡!j*r.gO0tMX~%Guygw,F~|1Tpy a%>p|`Ժh/WȻ_`o,҃p擏ؤj4ͧO,yw F[(σ B|]nvu 3kFrَu.Ɏa,L`sS֎(\L 0uepR Gy0 Uhyi*_#0n.Ad8Ԋ[h5'@pա.m|J`0W, _v]z-W':*,\`i~vUo@\eɘ*[+[o.*VpP.4.+=|-A?[7X0.KztGG:umma%׏y4BAev={v0#:YtzSNm,GANv&VYItN: T/{_S(%=G\=Gfhݗ?`æ!.`ͽh_IhEcWʡNv(_ڲ1ԴC*a$+UtpKVwb-U,lυH2߿n^xXd]EpcPUHPuBaXʇ_}EBLln}}GypΝ!5By, Z܎zfy O[`Oo)? DYOJI|w ia;-^7+8~Jn1au)! {U{P׾ }'0< V; F5Վ< C_=tW}tUlCk"JautQtHuuDUv  qf3!ן}]GGTJ@t]!p'֍WEj`$]uyDؐ]VERlQ:ؼy@5r;9`sNxD{bAdS${9tcr럟ෟ-Ga]_+֎֮G! mb-k1 mg )a #]qZ!a;xr}I3U7ߞr5N ~6@v+ڀzۃ}(]6 rKWpO+]+QE`6'7y2bƱ7naDheǗEr;fÇgpg ߐRZrz;3`*LFv+@q)ΥpTG3`VQkRt\w|#kmQ҉>e3* g1Jaik&p)|<8ΐ.mh+A]Q/r;Ht aRzg+;تz k)14ٻM,Z7 >r.VapBb V"zPpHIkDˣzuJ vyoCC'1񎎅`-w/:N{|e$cUEz`b/G7q5&=^pst7;#<ZUK!4+ho}PHTjΛk W(" (A`j *?r ύ >F3UEU?aCp%:%7xu+PS l><<AxlR2}nVDWGr)>|&*?R-rć?F]pf;4-&(s ޽՚.wf+̧M,ǢiU-+όw+hUUU끤mhY5h/Z U% t e `,[cB¬U,W?UZ=¼y2riHp;`-[V`OWJ{l /='\B%ŕJ[<\~ZaM܉fwh w| W{QNovM6ߊc1tt7WJ6hZנ!{WAI8;رc2jd[UJQƻQ {n0$2iИ ٫ДmY=eO+6 񭒲'7lerBBv)\C0d/;)_@)?,m''MJ|8w} q(Ae!b:U|[ Uph*9cayrCdHO=jt{ :X"pG=#XzmH~0e{==%.[Q<l\h u?8ˎY^l7]&Q= [1Zn`&)AO,ـuhyaR0 qqq-m`VDFYՃQ w:|CJhx&;Z ֺ|;vN?jv%,q"mQ£hNwxϖZ`ÿY~ 0D|8)" 2D mRC(7e!26O*rzub~sKG|A|f%QNm{Z&=ڔ9nmF[G,XAoùϬeYCJGYdvQف5ВOB e+;(K:C?{y{'qd[8vlّlَSn}Ofo IeY%۲za+J(QAIe{lߝق-33Nyv~X|`: BxF 89M=k܎)د?$(U&vѰT:nx];jW22GX!)Y r`l`Kޏ8T|\}.S-.聆BB[A#X:ĉψDEɯ,,VXY*h[$ ;vF7cPFO`\$&5OBW v8= gA6= YiUtTe|>(U+M;A9g&MG 4~S\M, 93@Up$3}!!g|8pȋ0;;`5IOUˁ@S5'^Z#{TUnƯkf͌CF: UAC(4K@4Ѱ*g-)U (rP kJ#πjza3, t)LjĸI(17vF*ALmܸgZ_kWkpG,_ UA]H_W~jOODwztXʍ[MvmV#G*YdO-ǁydibצ_~C>pzvR%WqF@jHR?jG G~mE ݎp#[pppkFkOd郎 VqtlkV\${Xk Ξ@A%Χ|TwヨsY+˃6GdsC[zܓ<՛W֡l={ZW&k6Pǟ Gb,D777>>~=$i|gGhm"옞/w}?g8Vv<;P;8W^u[9z&Щ 57к75jas{6l?[4n=I}IO*A*A֮E; ơX g]d0qpG_q%8>ę?8wټΖ2mUK@\sCↆ.[gKw83W8<'88kW{ws z,!-6 OvA*s2wWy ="]=[w}? -!XYce|oy1އ<цb`f遣W-௺# ‡QC2دjڰT|:x:z5C8Wqt+_q##VB*GLCV jbh #E !\2qQyo?K 1$ϣQN_-[pA}`mQ1-+H$gG?ɯRƙ[(y;5|@6f~#rY[Tɷ}';=c2ްNJa3Ȇ͜~}M78h!g$ c뉛HA]L{5;A|#OQS5Iрw87& *l3mw<z-4=r~i(nJB*vnk4;\5gQiǙWɩٴ 0--`ʊvp3wS뿧nVdĪ:C4hz ęG(8`A59%5B Zp~/ ~=TVzӠFf1R^X_KI,[H_UR8tDy<ʟEcccG`mL#,_c9s|de$q( ʂiSȖpy6Jq]ZZɏ_Ay;vzļuohI/8{`dæDF9,ӿV5`jەq{9=!HXV tji,x"C̰CR–,ϊzRy4lC<-vrgX-LkpV.Y}DS=bŊ"b%R ڈr;oU0-a oEg-~NE8]C;y: 8&GEH[8TY5M$EVeh’A&t881" `֖*0K{<_! @G9qh ` 7@dhaՃj|9#zH AU冇iGS.< ŭO`e.VDa3|_n=?l<38,x9`*JkAU..쐺7ijفſSWHG`C^5k7ժ޼P:6Ь;ٮ.39BGX\cmE $miOD*󡗃Q( vpY *-.~6=pd"=`P`-Dn3pIY=CdƤacӹAp#`kAFҦJ v1s'4T.gR;ЃŇWن,Y(zd*=FnzTӳyz<;U[]aW|uPkp#v+_EbeSUb"dmBv4= :7,~Ŏ9<&ox^(c^9AU-NA@Jm wt rqxuDXYtx|Zqe/c#0_ 1m&tu @"'"#v448H~ioҤk!G2<6rxԮIӀi4.P)7cUP^ Q6î)q%X G#4Lkd")ӪyGA?*@|8Y8HYq r\LCq%tMKVU/Z[}./Gwwk[ᶶD`*H;uG(+>VD_l|-XA˖dh bQfW]"g8]g;K 4~󍶃Rd/瀅|QH`zx 7q>ptU춸&5WuxKhXj[alcpJL͕Szថ; L#,h/>mfexJ X83jwהy=σ|+/j).k|-X[=SH۠PK,VodRDw} |$vYYďVІʎ#OA;S;\#]zqt `ղxw?%IGQU]ȀR5*-VowN΋q@Vu)dAo$riv[d?(!H;p4p> ;L j7Nz~=Ⱥ }k3e]뵶4=`mBUgx0 -uپ`m[k˗Bp+"+;/^-H:EOv[Yr;<|4,\ 0Ue.@)N6檳6Q*+ca7\k"c<0CKʎM1x6+<:t#7RleD?a fᴃADXp +K1cey TUnFÎf<$sS;νNj%mHT 2x2E6pMz'رd(ʘaG̠=ip+U͑h"GN>p~fT<*{H=ÎGC@RF=4z =تjCY[cAhWX_!L`OkpV *=G9r-% ZvyT:OTmp"ɰGE>Ҷ z 2N)*Xo!a)Y7lLT.&aWyih GgZ#$8*VA6mi70:5 zhV{%?X*7џ}Ǒ<تj֖Ochh& LB=pdTPiaJ0]YA;!iV|:|%ɕ2fdPiLV.w/`dJJ`f!Wj%;([Hb5Flx4ya3H@\8=<*#0 ÏHU  "z8AhGX!/ RSAM+2zJ yC2VՆ"U[[.ӿL#J%meyP$=6$^v#z2ʍ[\AknSA{7D%KGe9̒e%vCan8p<ZR悸{AxOaQiZ#օt2H遺>*ثjV{j{*6DǵB{޿}k_E =S}PWYJxw5tnG(+KG>&IB=&RQ%v}~ ͙}`J!4LഄU("dRVQs26UaG,\γQSGNN|8 7 zPY҃TeeVl@ul|֖ׯcm `U!T8HDPO=,̼i>2be [A{i@'TFH `i 0Ugo6иJ8Us`*64 hS}у-F|QKa، v AhE.<2a~I-bnaG\t:p8BBÎ Q>/'czs:KUm(k˄bw$I?>`BpYJݰ)E"ƎR% #Ot7dJ[+`ZS 7lAP8kˢ[չ`)AiT]uvP(,ZPvؐvRVUG})W tn[3Oݑ( = p-QK(J$zP[2zasKcd֖[<4F`e!T8%eoȟr|JF@T0-U=KTTqԖ7o.P\V,}UHaM[T?N r71Q$pUJ^=B^ Wv4lZ ;K%լp󶕰Sj^h.ӔZjrɃS^!+Q)&`Gdz{lPm eț 0U(E"B~'X[SePi$Vojv7u][Ys;h,-;W"'F`4odf:Y+m6v "K8!U !4o`?#A R&,jvԮbVu4Ѽ;y{>Q}61w`C[Y:8.B)F`#80 P]%TXbT.T-@@ APa ZիWIz؃mٵMriWPR`DIʉcPBa@})C7Y)P99IL~Ք14e>{AŅ(P So3iHUi\`~ U]SU#-Ҵ[QXXVl`q_הCI!C ̹6dz4lLoYCDkmۑg31zw ۥwYAD *㝕 :>\KRٻ U뢷Ž#OusiaJ tLq1m= J,$3T*ftaGAJL!A])+Qiz~ ~&ˁc Z˂`G`J&x-4n6*X ZX,4p| {M\a?6YiCR:|oLc#HeIzCO~QY[*Vslt5 ōǽ{v}#7BpSP}>VߠD۷?+2tníe_bDneqW6MBPLN">ճ"<äT!hdSS[6_*Mii{X7<\3p zu xZY R`Sپx`lULoohyf3,g`LSyԭx灬^\=X+ I.'CC].&gj? ¶#RUG@ 1\ c ELclAf0?azMz\GZ^ڃ27&Q<zx-U1y{ץ Ծ;hl~貶>籶t9òw/eBMpePv0JI'z/G<:t2ahe1ƪJ0)^|mVi+5UBPi*G2?v| llwp=e AfU#a 0vxynT"Ʈ*s>yPuD 7|!bh/sS2,ejLNJpk`k=#zܹlXa=ڥp{Q|Ԯ9&&GͪUyY[Uܓbt' =?-=oB3qk[vP39SV8xTAjhgHF+'N *Uc: d+`{BA2 L 6ԬL_^#>þ,fyTnkzL8};͛7? 0N@i,5E88ꎇEt:&qs{:[YF]cJz +aRqV@TE9g a`pR`ZL044([RR9pWʊA^ =&@6<`Zm/#,,?qY .{ L L<2O0X',a>/@uFaUZa"ѦGWBH-`@Ҵֽ<sgC/ =4p<|-oͷf©Wz)I6lsH0CPS+PwŽp5x\C{G)2heq;̊RXp=Qws^keQ A 0l9NT7iNN&. 4O~}x`l԰7cA:lâyAn 8wGda9R%u0: 58Q!#y28Nm?`u:/UF@>ndFYklG pXj]\B:.#fQu뿯9C0<|-S_kK*>Ƞ 0jj#hJ}3;~}|2,w.ýV)rd+`YQ 6e)O(;zT|N$z) է *LaN,D,У"5°L px KPi,K#`KLЃpRa?"!aU@@XõFXc q4n"21{l(]9õhn/I&0_ɠg+l#T{xG z4W^?{dCibz X˲a> zUnk=bh >\QkjC8bVwDSC.穡Dcٌ(p+e*"_u) ^qY+S@,,aSM7R$++K pK4*4n53HvPaY"Ͱq TBÎO_<.pc` # >v0m*LݟB,X`G\-/-Rs;n& lUgУf(Ѓ]ó?3gA(QہlXdô?2remzgHWC՞Dkj) ]SEPyGگ> mjjzoXr׸-=owPiU &|JM(JaS®)) *$dAP Dl/c?(s4(DPi$!J7e@HiVt!irBb pX>=uB] t[Fd3s(ѿfU0wv @$HC=p4HzmxC!4ipeQ {Y6le94L^C߻^ǰ444l~۵Wt[[ y [Co@IȗRӣX qFaǶRR,Yg^ya2hHiS6$j"ȆF?䱗A'CNSym p^] Gh?3+)csg \%zˠTF\C`#t.C.{_|&x|u{}A׵lkަGk pyogf86hϐh(א @A*I@:PY Ȇ"s`)ˆ,^eB 혏7gwg{V/ƥ`r5Ѩ<!;BΛ71rtl[]Kл{)[F[Y*\Vrd+`~{:ޘ홽Nsg? *D _;뮡u^ [ڹ;|Jz嘒SwXUJ8+AR]ȋ𐪑,aOѶf2 u- 󖲙*I|i,xL vGda]pK8;"vCWv_[a^ my3E%2!j-ǹm|zPУ4O-YdE,8ʳhQ沶<{0۫`Lt= Y+ٹçI!jjBT;jh^rGO7| n9=oy>b죅KWzad^Nӈl4*w}W/>jK\.La`p)￯Yԭ]ʦ,g&MDMK {^;|}lvVX`i;3ZjT8X7CL> cT+Zj^+kxKnMq~|_5mW`oW"[s a!)-S' ) ~z@.v뿺z9H  \6xV[Jd+0)YVc p{2Zs1k^$ EEEŢT;2}#^7~{zߝ;y9c-͂a?.dvY{y6pĖ(ekQ6x(lAR)e6D;zF+T /%U!%ﷰd$~q7ShafQHA㽼EҢ1c6 2#000ل]K >԰]S" =[CKz9(xS-ުIAC) cE8P;{wRtZm_pm-*T‘ uWQw^CQGQt;C7 t VwѡC xY ^i@1T^ܑU((SObQyT7uGA~;~0{{Aϫ8i+ Yb ݋]:47@PY(@d0+ Mp,Fm1;(J/p ^)ϤMK*è(G&onG1Ȇydt\0S;,fzܾ :Wja}i@_ݑ~*L6z Zjt^q' zX50++2Fa?,g%]FW]z <z%l*ŭp[[*GKѹ#]僴*2gjjC~+ _*H\!Hq>u5ϡy{ދ-Qq0#+)A!\WwCCTӍf~(^#AEL3%;EbJYοR0I١հ9ϫWGG@?VGR;lWkakÎ*[`^n<4pn$\a8v ,":[[Hv$ fklУE =>MZ ֖SBS`j0Uy ] C ^AR&pZw>w#&*otT$zJo1b'&lBa;#Pv<#9p>!4AʲͩuḸ'v\]vԮiz0uJcYSE am! '3[\,w[|iP] Kz|VqAʠ'TVHu}c@!n-EF٥xصC8pꎣGnQ8O* UCTj/f *؂4PQG&;T1gvP@a{jV >^*vx:[4\SaZSo7aX[,~J%=-b;١Si%Tf ;?㘼㭰u= =jaңE=u/*.]CmtLjjLjj/y򨯯(<HdƛZoFAC;JA2R{&,0uVE{i :h9 Ts|LbnvmУ 6嚐#RZӸl,5!kj?yW*"臮wT+<#U)pzt *J(`R(Pe$ z ;(UAJ0}J"* =y*"AuYZYצ )m ;Wkc>L1y'aG<+haw9B~0ڨ`G0PrEz8!yQL; ;i|M?t]Ҭ,!_ *6pgztI;=`q$$옼e5L@t8MS LS ̺i Ý Z&+ ҢzcTwTzL5> 1Mv7t)'GBW0UyX-V>5=sG*JR2v0 0hܛqYpG@a7Lav$~o&& ZKm14zDTChm/v&)JEӄSokK5UޚڻnpLQ__7wEUtvv֭[c`CCCƄ橈jhɊڊijU,F5 ; y ߗ8Lʂ2 :/C0lpSwԮJœqmFA;W*aR Sk-P:r+40록T)L:4~<`ê9X ǂ q6C1}6ZBAve܀z`nG=<&|6Pᮩ[̮ءT**Hk>t6_uG3_n݅JtH;iu0ǡ]Er`.;ڜZWm|@,^aH{ v| ,C}>׸8tbq3ª;Y?/Fؠ[IkT%I *naۑ^Q۵z찶*BE NVILNқtp>XhG=6ͫ=sc̕[o0?Ginǽ֛VX'a1ݏBBxpXYL{}jm`lp1 ;CKkEEGV9lGa.)CJzȊc2 <04[˽55 4ԬC 6JZQVyѽk):BZ/Qy|MPy#ꎺ wt7oD2ܹsǣt: m 0q;r`/ρ<l,[<,(%+ gs|agk6^wjV%vf6&pSI;% kפTakx 67`xX5T'vxbvhZ8 ;o|3R_ӺY_@?BJ?[0OA&HtXY,Ŀ^!L550(alU$ z[A= 8/MZRyxJ^ *<=fP] V*M[qGѽT=HC1u7}DK|a&N|7fY۞V bttVwh0L0(;?رx$|d6F2?9?`ǧN+ 0 G;a~ᗉQ_N5|@B&Řt+KN7m!?ahUТE0aiUBC'*.;TAɊH[S[S ԫPyUFE)tRyYQy+ jg]*Ž?Ic|YHoϦb@CC~ v6JFuR0t׽)p#ʢK/78"02$ ~g 5yI!oO v+K:aV16WxE+ho|t:#p8=AJ/,/'GGW`T|",Vaс$fa3&ut=C۬<=*XZ[[ԛRbmI#%Oc Y򰩽*<ʣ룥 @{ *HoÄy4IDAT;?u׽yܾgu`f3l6Ql?u ;\I[YJ:\/_Yύ;'~e ikGV@0 x :L'?#!AuRde񄔶"Nhr5YwOtؙ7 ht9B*9Z.\Y3pS<,U0^H>HMrGmkee~ؚ@, = 8UR2kK`G GJ,R8ԥ~*]SUyVVy1::z4㫮;G5&u믿 MBm1sa5zbnZ:7,Hby:#NhzLȟ7;VJ0NVwYYNŒQK"][={N=={eG85'cMazi9/_Iy~0L-TɃ֖ q)$M`Y BfUD* ʣww>:w<_k-bQy|GׂCPwSw,_ ;cpp/wH/L= ߟUwZaJ )u x6HZvTdy)X|43v( Sw|08vfUak(M;TWwx*KiBhe94kCv/4)R1yI+pjl0ÑH@yj+0GtͦGaޱ> ip |i3ئ4ͪB+Ȭ--RؔBZ[xHpjJaW¦Lé),a*_N|4O0O0O1هfz[ fPR?VQy,8ΏMoڴiH$A *A+,GB[qMuC70|_Cq]#AEkeYۛ⺍6pagl횵ӵ aaL˅/`~7`W4ՠ,Apڣ ;c%IҠ%[-qYiAi"SyLI*`Wx9FT&<2[eu߅Rw,^H4Efxua6Lr`Uob `7R,wPJGСT*͍Ӛ5XZbdGVP`ZrAhYoFЦX4hemUbi'4cap D\G(UGu)^~EKaX`Z頭.T&xI^dA2?hmxVIqܭ-<*s <ëpjbSytlυC7̏M4.\@Rz@>ϢTwC㇝;Nq lXr`P!~%^Γ%8se֬ZovYVM`*4\`dæԩ;>biS&\ ;t*he2?&a =b́tX[Ĉu| aҳ6 vxG须 =`bkUT ~sWAoM[aVF=C*TqOXuި;ѫ;le9p瀨 ;̂!47E߉i@p1z,Jqx L!'aCJڍqPi2YܰcYB?vL Zv3; 6c\T'`zT04dKd0O4bz$U?R],ɲiN,8<7*K.ʠk/+<2X;"dxf\Uw8*rQ *#+FuǷ]E";4_ߐꙘlxT傚 '_΂xNj7ko{gJP)c˚ꎥ0O_:uDž=,Au$(4\Hu9 pOV) AMaa490o*d=lq&C=|[sR<$WbywR Kc|X-oTz¥gמ,*bQy/AU_D;EED?p;Rw8˳h\8d掴-L![7󟊍ps 1rT=FF4lHcuG!wa"K_Q4`\qsjMϳOPis;|aX#2k aւi5GЃbytHع~Fjqvx<>cSyDfmqaSoHʃ?WA*�<8kN;'~䲵|ϵwGүTyOh<|_cRwKBN_d]`ݍZTi`,+`sۀP93c TySzeZ~|>֟(*5IWwXk]ꎋRTʞ!ixc*BaJYa3ٛ0R =~+;&2QP)sZ뒒a"(~=X Lʍxl'Ui1MGǶ\z7*> E*>/¨Fz B[XN-p x >$%Q,1هK҄yD`hêޔG@EmXzdc``G`W#/Ti(?(--EQ6^;jGSwP"P$6(.K(v(ۍ,ӗF0j~{ JfMUG\6%KY *ezD ; 0etpn{-,#0`ZQ \uaV<9>p|-O:G<]>;^k֬+4_ *Qwm㛁pI|Y1;zu 7޺;W2'MG1 ˻7H`FjL6ˁ[\E3,7i;A?r+[_utpfC6u끩^# y/~<icu2kma[y0a <<30;ZIL6+@<" 0mbq`Z`Za6a{&B瞇ZЃL ̓ LlK%R] KeU1XF*$V~ $ Ty4aHxxi ^(  4+=*:rǭsGv/E:y=R(*jTKPy_AHH$|Ε;&fE"TۙPW=OàR?-[ , Z x~ViK)4(KT$B^Jì0)*I C{E 1::+ည|K*jӳKV>䓳Q`!:ߜ[;vD iA/tfovԯOឺ\:]vuWaPwPY*ϊ^Gg':$9,E m4?3 $o;J"~n2(T~Cb!Gł]\2,c/3;jai'\ݡUwS߹Ž`; w{`ّA=,c2y< ӝ(<GLY\ԽXڽTED*'w=e 4+ l|4vv~(ui|T`I*L>4l;a >a/UpuGe,ALaM?UvkHzҿiDOҠi!-0eSyN / N_ʥ @V/qY[VTy}TSA*{g\ p8Foԥ~@EI!.σ.#ǏnqFV:7 }| ҅>wޟ˨0,e9pTgw@he#)A)2SU"iuhKaGuBPi*tT*GL;_mF8dA[@PiITwa0~Vݘv|)L6  fF?!`եzFo&EaiQW^,0% e<r)QSmlЍ-e)JcBܣ /ݝKб=|`kG^z[KBx)ϪhXEW͇xH n;?ЇQwnuGC f P♜ 0[Aճ3xPճeӆ̀aŐh>~!+< zkQ܂x?dÆ䇕~RqjhTkMRax CG̏m6b0^oqb=|G2!ӄԶ`iZkOjx)i =s;_aUyUzYʣGqs{*[nUT~ǵ{6}JmXAZ_Հηg͙uǽm=ꎉ=*@u#E(~CϾΡlyv[hmb2vp1T]qRdAƨ;<#ٸ9aw+8wg>z3%êE; }0 ,¼"C}0MNvaB5cMmܲ<|LC~VK5 Uy U gdʃR,Uy Ry+j'\᥁*y=yAO!KBx)wJc +/^mOmc`u̫pgtʬ*֩Oڪ^Sea(tC,<lkVep )倲#F m7~C2TauḪ T'_Vt+0 ~L0°{ط{*kԵIQyșKŰC< <%.ؑJR273x(eHJ5.[ ]QpWԎ ɓ'_ ^mE^;_0/+K}wXhl#D>!W-Y|L#sPrgѓ@ ~*GtxieEq~ۨ~ߵ Ty+u*j#Ua۷oӵ=ꎾUV YƮ1[߸[),\>W5U65k3vxLצxg.pgyHrS۱03U3@*&%\WPi",L,c<),,!'O |agV:R1RRs`bTyN sUAKU^ug3xgR, Ry+jz *=^/T|(K:Rzp8Cx``@ɇ|s&n3ۣ0Vw8]Ad" !đt;Kc2l=@+ Ix4mSՒ*vVFzm*:?IvGVVZk8%ӝKIWwйE?o {aB[[ν-pǁeW(3@*\-*"X1\Q"W޵7:t᥺GRHQX!JD{~Unuo!D;(YoT9SC eaJ2v4`.`TmRr:TS `)wYy`G0~v?NʢgM0)vb; ՘ -Jy['`~ 尵y3pk1 R? ҪIQ EQQ{M`"p3.좕ǟYJ2'(Tx*j}UfG`EB{5B駟>ﲵ<"KL/妝>vưRNwS?7f Tw}D"@xugs{?»لKAuMO$6(c 0},ASg.A/JLjgUbo' xfw;ԝ;c0-l慉RڒlSw%Qyt `;Sy:6 !=t (UKXSSd%0w\qzxHbg_זRE?ӛoxaSyc֖D5: SWAuahLSc0#p PW?V{O>{8.z v:lZ%pC tM@)Sm`@l<&&&066! Agg'޽ S]]'Bxi~V:44tcGp.whw/Ծ,Rwʽ2d;<#ǛA-?e'_b]U[]pQfD:KX&HjIx~R2 v<5%1kl40nWiqUPuGW1>ǻST?~Tظ 3=O0l0n099.RyjG`crz;'ނo<O©YB^_QjE \{Xn<~''x,PlhZG/HސT7`(2,l6fCb||ݻwTv~ϵ7G!4u#R;KR_]g?!I sWtX;qG1B,nu٥De6qHl♩]j59v[ 2?~C,3aG:΄@<bY`GZbD;k;Ԃ#gvT/`G ҹBa]Lmgq빝_]p; SX1xZ񫗄M07xX m`abb"6@}߅y6\ La<XaU [9 X?{X%I`!+3Ptn ԋ4 9MZp p3HHA娸U:=*!KZ^#a+!H .yO@;s,7w>{{{i;,rUw̧f_dcO̝ͺtNG1 yNT%~^4mFsdK; #ZzI;zH°vf@,>R8ڥ%xx,Nqca.L|T*Xpp: dZZetSK) .*ڕcnWܮ*=kjZapX# QRG<l jJu`;6^S':Ɂn{KAoo/:;;ŋܓ/eWxC?/r3/JVH$hl$ +u;|JM!Jiؑ8<(25ϕ3q*ͼ͆bd:cjDpn XaC`G0R`  PfG <uh5#,;twaͺ0`4=%h,b>w`v+=_@yk`lcx v,[ VIaTVwD6u ;wAO_A8\`LZt S.XK*دiKKc1ZB;4&$K~\Xg^e^f#ZH$ԯJS9(J3[2C(v:DV;q'âYK8RlglK%H1r_6$&Q;nV8lz8Bv055Wp*`lpȂm-lA7,eAHfPK0ZU"[?C:/pxtww /k!l-_l-RwY%r|I]*t\[pg_chעa9 AJp.4fy|@@ifRGTCKIfgBG/ɛs%BPijj0"1 D h?haՍnH<0O%x\ުbGXRߊZypjJ# /=wv =|_Uya゚Z;M!$2Yr9stl_]л' w`<eK†RYMrn*\YBPק]?TY 0$r<4J-- չy kWﰪJ`v7 06We>XG;V¦\Z*@;r{0O % x{0rck ӅLvM 5 54Tmk ^?gΎwFǻ ~У^:[=V av>{E/c"Uy?9Td.JCnd~DN[WU <2rCB w*J$zjVL2JZfr70wԬE&YgK `|qq,a!,÷azYaS.LbgLChaӏzG i# 0^S~] 빝0GP"zQSdVFxW΁S2Nr=3ѿRyt_wUDakCPy$;?D>CF~=Re2cK0%z,R"9R"B[\󘁇t~=/n?be WyXT1̞^~_i!3Px,-5?%lƅI.ym-TyL5&v3P/;䦖RB2,^궵K'+a|, fΎև=gsx8Ω|\f|Ep;˃n;ˑ#GEgsVڻ' cVw@+ˇAVj-w;$AH"4Fyܸ[U$Jq%f\0X ; 0"i넠TBb!4ټBaMP~v50r`Q%54T~DҀirkg8 lƅIck1M&xoIQjXj6x8Upr<܌VxJ©* /5HA[>gct, U^j{Уq[˃ ~Y~ ~<::1/{5[qseU/x t|`XV*Y@;xV4i}Rn±; P3#(MYz&|L+#[ӭzE@X" =*CTX*_7AO>ȃ%^qpcKwX&25|_$lƅIN[˯_T l-)_sH KUKc!AṡR9?gahpZnYsP.K` ]L*3qekFZn ނ$I`kᗝ,/N&/Uy,}{J]v|L`^{b8%hٙ x\X9aA}{WYJU|>0|As A AJS J-;R6Yt 9؁2;éʃ~ `W&Yl'^Nm`鹊YkM0IZF.R\zMjV"/UV2<bkQfg6)ҹpJ*My0U̓b.YҾ?Zt8㏟ akG֒;˗,_s\/w},cccrB\Ν pkwpXEY6e!l8%s@W~gu o<(@ #7?godIG@*Mq)ԍj '@ Ջ9/E9&.+1uE ]j`j֘]cZ:Xv_f,a[{*8WkR^G֌zo,Yf8K`- $e9Ծ,^ 0c~8A۳LZ_?D"#>o4l-I#^v/Gbg㏟:U8 sR޷  1TQѪcJlQ=Y6,8@,Y J|5 k 8wt(P v-{#]{~BP5xHE:[쪥IGsuBHM xҸ +*e-=Uh 8mב=?iX-MA5Z$rwQ xpraW¦\< Ǹ x ,m;æej!G05|OoaRqcLðhG`ӏ%xXz0|Nr_Py0nTCBd.9U90@?{yTsq|kvq288X/ZxhgyG$I/.x/nlEݓ,cLh;̇C2jvt]eP|h_` NB8bkUVi ɮiYHf> #x\Zoqp /P"-fFH:Y^Rm+ͷ0)IN&xn5]-_ "Չ5˂l-Y fH)rH.keE/ciZt37ޘ XAzlkT;p~eUpHzJI@v\ͬs{-ϑ-/B0MȖP"V-LG]q|5,c)G~ <2v()4}7aZQx ;]aLz$iM-Gv1? <p6I Og*j^. x90Ehkk4p:ܑhgV (Y VEGӒ*B2t6-A+J !' ;?拵2O(u_#!4qߠRG%Q7A6c9]*iC5nOz`Tya-LJgb҃K'ZYMkZ[ %0(0UCh;AUXJeB8'TQHmP!4S J2;'׀,efYLN6EZ]gX:%4X҃Ku'6x>-LOSx8UK<&DPx?KfbTmkڗ屵okzomqm֒|;ט,81._LƮ=v,eYcfZء CT<Ev ʃg:|jo祸5fY߄7 *]9< "ޣȍ|DB aE|GJ<pƦX%I*ʋx*X[?gH:@]ZIuBiѿnBi,xi_q}VEJ*iMw[X`/t naRr`&B6$JajZZXZWK+ Yz. @%8hAry?EJGKTDI]%G] "nA_d'AG<.] {4i]I;t ֡7?xOt ZIojtaԯ%! 6y]x5miiX P}l-dve,U`tAl"wӰM k+ɻI{`x¦[_`_SKC;pan[yEx-d&H#z em-j6n8ەhkk/IǟHK/Y,un;"Ǘ.]z,d0W)f",`_d>ߋ)r;8`ZLFs"$hX/XG3( "kWdOTx4xuA#,hծ{`G"ȩr ,S{/c=0=&w+մv JjK *[<= l-?.?DG?)prv0Wϋ;}{w) *ey܁w3? 4=͍CP)sj`D;e{-yHBPi&ISxF G`k1V΅"/[ |l-֒;oeһ' 1X`gZ7;K:҇'s9p:Th[PvT$Q#FT qv_,fD <d@i܀f+wIl~ѱm71YyW̉|az,LDw(b l*X ȳiIuk4_!qى_eO-fx$![ZIBGBK1X#Z* BKGz01ԗ44x*`+h9$<bx$D9U,b؇orx\zuO}ipͿ<|Ui vw~OFc+/c{nH;˄9 ʣY2-L}P)#HN)> NLj'6p1nnNk-Ԇ*-J# .4Rak $ppb-/E<ړ; 0PV*b!ts`S" t.ҹ AJg% J2#E>ۣ}ҹ;Ql:P!>~*)IԖ?-P|d?iΥ!e%88ԹraU¢pilͻakF)<<}Nt ZIv`-;~õŰ]EV%9Թ5y[Fy~k =Lk%XYS}ٴyt&(, es{7T=ƪyUd|8ޛηgo2N?#2 z%T~G(;o3\P;RGY!+0Z]h+@_9y0WυMⲳH炐)3]i~U#=$d%nCYwb%^!_ &m@{&5W=?idcaUD#,˻"U0<w< ~Yt 1[Zځ6uH <.QG #gBFz/gvʹVXYFw/>ALf-G}}l-QO:@;. oO޽E2uYvY 1TYL7),b&qHiY!B:l6x +'+ݙ)3AU-Lfmbs0k;@iɬY}RGLuvRsR1+5OFa%vD= `+x?) J6t68$n3UσMѽYE̥Ǜ3$4핸G[KFӆ"ϣf`H$zIv\Lfx9W,J }҇.YEV 6IWE2 Ҁ~)+ RDZxS˖d<"'uOdaG$zȁGKeFki+lIh?|?鵴iҚ[ xXϽ;}QWX#؁mk??QO| kg3<3Ӿ'҉;sWzcÕ?0S崝XEKvU# G ǘVB:8`: M­IN7Mg.8hꁗ:Uԯ?iᱜx vB@a/Q?2P|E_@{^#haӒ|o&cޤU `<Prue90eʃdA#gжB:]ʹ*17;·s> [ܙ>u?h;j.b7 ,&; Mⴀ/Tzuw@a <JQ-!;CF6WJJqgQ1/ah8(GL-]x|Xt x49p9؀GvUx|b|& < x$t&H <ҹ=j.t.16fc`ٸL4i144PO CGFӲH;&!HS |qt)+/)Uݡ yg0 IIP)[aǙw/>~[jgr * LzKȨgX$4LC׀YqGLieiibx?-lI^>{0D1udf҈xLفGQZ} /e,۵"N9q}s< svڵk9/ Xnl-[00:mgr+8E;e6c)7<[2<ePp/͜Rb?iuEAީ 5y #[v/`.uonbSxL^1~1icjz0} u00rFҁh[x\R`Y0)ŽR7p-' <0mGb?:Tfct, YWO{͙pqz{9q޵gjPyī7|,\~};/ScGeLV;_~t6DY|GK/ĉf3sr8!#L?ƹk"jjt]CѸ;<\0{ RSLctNwty ljMqbq\8q/[$W[."EIZ]uMoV]bo($EERD!z3?̀߅] xx(an_R奜/>5CQka x+Tɫ)wQi* 46.|Cd҂9ygYkp赖ftZG[ܾ}ZWg/0ZnfYg f]M1RDtGEdquPQ/Ll8jIK`7mLRJ1fHC=Wc?"lP.~po.x4>HA` xLex8 `~_R,xzu?!Xj8-KiWgmvGUHՖ9yg%5~]0a;U])ha6/sx<>f<ퟱxG׾B>t}ۊ0cCcVJ,D# "R>1"ءk'ˢuaGde^j7^ ov?o(JyB`gtGy6p-$Q wG}Jqcny x4CЏt*?j?~9A〇C{xS Rģͭ+7#T3 h$jg'l"XYP>WP|P(0]PC"?<x8jױoQ׭1,.՞݋{xj4CTx]:|K2=t$-kE xx1)puTgx:Q xDzR&Tl Eȡ(R)ΆfaGi zc޽,O[l;E:KOOBG~7Gc>Ʒ?pVΆzv:tG$GJCI̦<"麛y_"O P`*_)|A LK x4.C{8ؑ `Ny2>Lu^<~!*֦WìNI\*Ukwbr|f( <"R:c"HQT ^} x0;2j] ;q"v4(cFpzw|E&}cϞ=kL]T?x@q(LԎ(Ԕڟī?p<@T-0$~q Mwӥ *-t\,m" ss<S`ںB#wi<`d0lt6 $)@~qnmɡA*poMAۚղ]h/pM0ߔڡS{ .մaGBqk5 [IKYJQ$-x}A=kg#PK<ճ񴏄ZbxeLJ ϧYܺur!/=Cx{ hwRR1;FXZF$~io£~nfH?h~gSfE vJ7<5:b RT*SI->ϳ<QC4åpA I$I zI=ØדT٭ߙ:KKs?Zn)Tа7qOhy$cCN xAxX=w0do9n^q0cG 슨)CzKŠ&!|h]#T!h4OR0o(`9RTh^ *]>aG4,CU\Z7;RR <3)@ A]DaDafۢèUI;BRe'!h{0I3tsyVF7pMu=aAA7<`LJ3w|F&}.<刿CןlUM;ޣwȷNCG8u.&NR8,"9N|@{y:-5 f,>?qp̅Bʗ\!yYťCO<\pݬOH#%MZA ~ ^$&b)F\1#G#NXz|wΉwL0eKnKIDAT8yV=M4䈒inҐh] z r>;@AjSЕ7(-Q'/HgSQ)$#0}.\^o1L+sxW3UT* <+.)k-[p\K2~HMu)Nu =6vJ!SܔGD^W`bڣûTsw?nzâ}rZg >dی q,ks9 KG_ nvYcxo d_+G_9 na>s!8^ Lgs@䈽'KrwICPĥtt*tǤp&~AݸuӵOw$rV桴 x+(D[,_KA\#iK?$d`ZkBыc} xhw>H K;Z! Y)ovE?aS3@~`!-@̮qUj_w@`4/?STKҼ LnW T4K>͇4ǣn|{y^kF=Z C)KIa9@ɦ<4W.F /Uja4W/$pt<cYa7g,p-ʩ`;t/ $TA?xxxƯ x ĥz<>") KcY>w|` K!ɾ B@#VXJg)GmKӚstAG Q' DɻJ#6r 0DI`#As$!Ϲ8?'xsf5k-k0{ZPS1RRTOMy#QSJyR*)MwF&Uu\ۛuνi~ZiB~ǃ#XHRS\:s,ְ13=~E&}瞛#䝥5}?1n4᭦v"҂w0Gx!MQQnv+_*~$$h᱃h^&3.Ad(@T?.ᱜ8#k-ms<*IMyX`ҍarr:PհZ,Sl,әЌB}gR%,3B}VT2K)=:_^gZ ӕ=]g9\gtzC`_SLq? <<qC M:A{<6l0;F\4ĥxH<>lK:/n{D KqRPG!EҙV=@HɟPΌ<?KHt>x*|s/FR*JCU%T;!%17C<bVn1|yU ^ld$z=Z-j5 9fӝHLljR%&pNwDݧY.&.7@}_^^Y8G>ǭѽF!xr c0qZgR ݼ;gKAN!/G1 2 xܿqK2 q <KDXj0 haiKXwP,aGlTAQ1@ "ଡ଼EMd zds%O顧$G)T,?eGܜ{<[kkl6f3F#֢h()eAF`ptQS~L b:[REg1y CЍFOw8)eU唬r-waeChƹ^gbGxuDy49Î@ Ax k5dX&AtY.FfQE$!𨛝xZ{bxo*pQe`蹎=.Mw$pQS`74ZA:KE :=ZTj 0tG0vjJVz+a?:ިu\;ȺYBx$F<qi[C?yiKV  ,KU&}!*]%,H ,wқ`? ӣ?JL36HceYIC$?YDp쭵n+ ;kʃmel>Q:KE.Ц5ݑjZVT鎸u3f/q ճ2ZgbZKwH\:#.W$Lh} ȦCB 2 bjmF;d>>h[ꢢ&/Gf-eS[1GU`$*H`:/Ֆڇ%x!?ٴ k-Odrn}_u7L`P}О݋S1zb'ܚMw0GzƤӱ._teя1v#gaG21ףJzCq7wVVzy]C_ĥG"qض)qi'L]]݆$ҿ#SaWe27}s.vDXͰz5̗`XÅ h8,RsiL)AB"xOt؏R 5\NNAC(] 8nVvc?,Wj`T5>򘸗usʃM`ʖڢio|3ۡkkKeFJS@g+>_ ݥ:/tc/g#6!/6q7 qJFs!.q駄..P~!,L&5YJR UJӯQ>鯶<*J9Ѳ6}P*lUbITZ?x<8J pR-8tƮy[~s?׫))Ȟؒag")[j}v +]#6%]Qifk-hn `+Up4~EuK)KGRÑ_ x qd2?,.#,ZRT]YJ;NMx:KT5Cp>\.h\z*Ly科p!J=!0m(AlW4;JB$?)ܯj}5V=ljIYˬ^+"#2aZ#cCsf=*K2iՖ߃7$0S$xc}who*K:B=tG =ݑsYƘ:ť_3HE\:VTȧ׿+.#G& -a7B}>0ma)Qpa K3VY\{W!gi!JBTTشVJRT5 $@4Eb*_k-ƨ)&&.'\[ @zjʣ+SsU F^G:-n܆׿@Xw'*KTiW-3Ưȧvew tG!M\x$+S[eaٞ <%.|LtBٳg;t%ai|M **pHis6告kʣmCrࡒDJRPE>q.Dra3wP;aV9a뿔U– =Էo(D_zJex# ȳ \Xtt쵋ਝZgt,$.zoJ\J͂=ÜG<#U~ViyLk k-qң/K/r$pnHxbjcW<'wa^y߼ ?A/B}2Ns:;_NY\G~*+5.{(Y9qO-,uL-pNroiaHak Kc^CQÜ;{`f8|?S DxJt7hZ*A Gm?M JmM^j/cV}/$` vP_:R^ {r窠>_ jh/LwO4?Ҧ9YgJMKճ9ť1҉=xLqi,ǃO+,WLtBKF%p K#),%YҸ_GbFE7Lw8Qh9+)女y`ʒ;8Y,\UkR;["x<͋~MxNx^x<(n]/\]u:dNyXrjeyc}L)v (Ž_9$IJXeR;qUI0_ݛJ#+{4#_LRwtt딸t`ÂRWK<%x|8 a_0 -+,B2ɀw G K#]XT1oiMw0Y\{s þpRDm,S4SGz BM.VAs9[ se^#=lQ-1W$X7.Gf"Ma_]HxEs ;VYLf3;Jyճr"/q飜R͎YQ!/˫Z#.Bϖ$#V\aXa) -؄č(ai$MXI$,fV:8~C[Up_KLߘ*:鎜2,0=,u$3u@y?ok-r"/=N'^o<0O}WO(AŘ<!'dߎgl% YFZ.ɾzB-ZUFf)(TEPQRU*j Tq$ `>uLǑALv# ")I o P`B[G=7vc.OУ6ۚR ;ܓ9[sU*˥JTpM0ߔ>vX6&NFU^Z L¨E7Wt܄шR5t+aV z֩ti=VmtGUs'A(׀JiZKK<&+WBo9v/ebIj I-Yx|DŽO1Z(3CEVPY\ cx8C {PPCx4:E{glܜ]m>CØ0@7 p`+O?#Ag1q(1:: Z z~&`ҎvG:0|^e]Txuw4|x4|J(uE(_Pr0PDkxVcdW<+O#3LKKs,I-0#C~4r%|#k2]]]Yn5" |@STֺ5p6H K#Zg e]|T #.a+JabYavT6vK$ 7Ht+I@B?wҍG^;X_yܪp*7NMy\x)m\h[0_\m9Ɂ@Y Q81zz^㫿So;w0221C@I;^ AI76 a\ʢTXe`V= 3G6aGtwxDyR RB9%.)qZT{)1<]͂=ܼy0Zx+ >q -J^cw[1`tw82,,[{C8E^b-ʵւPZTk8<+gX> {>2BWDi|_gRX`,E@{G@sRX 4!^TT%)KQD[T<&OG^u \rTUTkAoa-SiײŽ)Dm[ko&7¥IX`S=mE4W09 v-ٍ9svn+I]jZe]Ye=tGw ;<]rT[`oC$\p7oe|?mA$+ޥZo&/AťZi+«X ;8G&Nؑ !/R2ZOI%]MkG <&Qcpn+xó=ØLK ĥa$m$2;>O+脖0۳1YUOY)A'DZ {>y;+^n];Ӆыg5 _ci ޡSXƇz^`djn;’{a(ءT˹25&Uyh^?!/Hj * 鑯U+ٿ0:-ܤ׫dSRˇw1 -4W"HZ>(R.1 < ࡈ|ܜB ס-i[x[~XpB)W8-[0_R =4gՖѓ;1||=2iء bX֟v ܦAG$E;z&fj` ۑa3Z.WpZeU&P2a?MwpC1<02z2 ,E%~!1&/|9ǒ{<<Z"̄_EBb~ Ѳ?iN;F΂8LԁkӲ)j"=Yh,VǵZ.sff(z5lp'vx) "# p0|*vaJ5,w&*V[s9ݑM <6S},R!KIjA0ĥ>%.u5ZP ڊp YF.?Œa \f$-$ -7o)XʅZ<" -4`&DLMhAۆ]6$ކp-f)Ue_ _:Kϩj xx <(DѴJfvLc.Eưc2 X}v>B!B!Vr@{5$ٔGd"צMxBMvyqwl%izc.pn4 s&|cgN` :Tn ɉY;"1̄;Y1z.Q+IlJOJOw8Us>AsC$_HI-DkjWG%b$\'س̵k^dߊHjϑ护nӶۊ1cIt$mM|$-3%, -TEE׋ xQKCE)tJAص] R*(] w}zc=ڜJA4,q-TH?_Sdf"Ivc_#]a*6sr-M)jZu`q$Ѓ-Ņa^VD4`w';B[_Rߋ[W1X]TݠèˬJaq`{Ay#ar+iݾ%_@v~+t -w+Lwf|C2鎺L,q.=ݑ_! L2Zrl`WA|6CJx LSV洦<Ҵ&=ӈσKb:z^X^GsŢh$z}4`8>;1pbr68` ߾H:+Q7La z,۴")Zm)EͰTTهMf[w)GlR 36Ԣ\2V`3\L4XtZ4#tg$|C&} 6vgHڨ0ZiA -hYy%/vR\&Jh/ KO%aG܌aǔTU)VP?S6ݡps`ZTcj- p{;ՖTWYRynEA Y\5։@6GdnbSfs4PO9>#g;݉=q~? ;c(1wƮۢ"]Y:/5Îq#cS\,oĉJs=MiRRK@MIjaFӎYʈ].\3̈Y -Hڏ}c B~A^P(.baIh0'7wdtXZUj|#z8:` &Mz<52t:p8`ۣQ3 X-7ߍ;0|"&`x _zYp0& ~r0e#2&]_aŽⱁAز6 ;hIe v$ܪUUTڼOw %%2W&$Di{ C\dM>Z%+2웫VzXPu5ВJ$L5Hxxp/Ğ&D;;],\#Q)g5, FDT$A;f E<fua鍚;0|2ԭJws3E_=wB֌W0ݕr09 :0<̝ ^lH;%)M\4WY^ZeKT}!r hR|L.P)& B O,Z8$-MY8q6e1rz|@5Kzb5i8 4P5;Jhj*0=x֟疧\7OA[/_1}hj*1vNa( 8AڊI;1 t0W` =79 ;1^g+0\kvp|-ϫ,[|LwBs4mlRKѴ˂=߼KcihL"iZ&}IHC$H;ѳuITT)͎mL)%v|uО|{JX;RYgɆQWT-0/JW$P?oA$ @j@y!S,@D-)Ie =_8qj9?+/@ƇC=xcw+DDFnT!G$u%[# z$e }θu$0<ܔbJ?Ĥab}^ 1"0$pU쟏|~LF &H9b9:N)?߷p OO ;,7x*v8/ |Cʫ,Mw(Wv <67GӎY]ѻmF* xh4#2Ѵ, -X2c>]޷q4P0\}.w s@p. 豻+l]BÎ0UV]g:9:ч9`V9ڇ$0*K, Fվ%H{>C0obQl~xy̸ZZNY;tl;&.AشA?A{XS]ҁLBAu0aQ3f@d"_ϤK `L!G# z}b;7`&;atgSJJܨE),-'aH4-x-Ю`.v.,l2;, i<2H$L&n drI{oGmUi`F"i 7"<ϣj-Ƈ{199 $b<*vD`G* 3%KU_HNUŽHL tЫ,yUe@|+S c%M9[mrX[6U[A =N u}?8A A lcGaՏ¢+D#b3̯x8R|psEyah1v \eDF`[M9;MURKk9KeICW Gl4%Œ*Gy: <|>V&}M|FN7%UL~ !ċ0{c>#Pr1 H`FÑ0(DGKy]4jKvLLL@VC~wan#+x;R]e )s?AW| vTvDJ. LCT??M2P( <JڢxV*X>ϝBI>h; #'v2SKe͝Bm2A..i8] DRؿN&- 7bG!Gj;K9m ع*_`2vPc;*T,19a|Rj B TMt4mJh+޷4x AN# ?O{x|5ѴyK# 6<>!O= %G.{cA)(AZC ȉ(0YmyX`:+ t:h4j`0yHȎ"*Ğ)z;bWY95r)=?Q?Grwi}g~܉ ǣS+@x2S6*X8xs =z\s{1~z7 1xl;A8\L;H#@|6=6.MULFA{~]]OH8r 9n 甓.p0ݘ9DuX+aW*b,'pvNc?NkGVX44D#*b%BB"jcF>w{$,휉C1V6#E ίI6f{Z8?H:jKz0W[ږrWáU Ve9wxnfmJ#6<{@;$@\Ff1aHlA bԿk$`1d2appCCCyuIcaS;`UêXr5 h^qFǃ <(1g!vC϶90Gȑ#?&dKXj$DǍ7Ҷms1s>F,EUPSKWմnZWCP.<6QM nFVߴ#?n}h+V`b^]%YQga>{BЦ$`0 GYD3A}ѝ%UK0g {K_ CEYXPep-~9 +oZ@JZB>ݞ T1gfU];.T*e9׎%npkwҟX)ٶ dSqEdX6m[h-nu -k CjM[Knqu=l([<3OL-܂L3{k3n3.#kBT7ன$X%0zP0FFF062 vX;(aÎ[5~P 7ӲޖBF~w3l}d(2TQgJ:c޸%0Ԕ@WY9Bcׯ<#<"/ _ms1kF,b1 < K`o,i- <)A(cWZ ˅j.g5zj/(RhC#;1y Q522c9,u\tCHOQ=4t9A4|X'Rnv5ˢ}`=Ki%&&&011FCu(a(wx#;`r{t/*|Q3Op.Œ‡B v#gdͻ3kpC df^Uh/G< z[⡇E?nSn&=:YGl #?Z5\,Bt9S1t]USZz0N Iw°C{q ?~b`e k;PƨUl@<xT̕0PW28(a}0k> < Y$g,ɾN sIAy4V RSl^G xWGn;lX`.m'BC=<tp.ʲ(gfz=]c&Бl#젦;( L ycpG̳;|+Oj 0z._Srަ<l_=< F+KnU =RYq: \H+:Kv;BeTFbҞ0a6a=GI#ީ)qQáv#оͼOwmEl\uia^JÏ@ceL^L&f3F}4䰱Ltxb:VX8aD\Ņ ;j v1 xc  H6G_H =gz7h_`"VMnWq9&nѕl%i`L%] \&u?:gLwi]\h}TG$nvB5%&ڄI8&''a0haZa3`jRե-i+~qװWYau ;h/ѾUպ5f7H%,ҏDF؀G( x]4ٽ,TW<|2vP+- kbG0!v\wrE{#t:1Ue81t^R›r?20y'e&OmY =[-hؑ.HL-p#"0M=XW\L{0\~8$Xg $eOy'1~5tMuaѫa6UvG°C[qUvD'$DZ70ݱA<Ж+ぇ.x 옏s8-X?I-<>k(o,k2[JP/f z͍:7R<@Dvh!rRW]Q1L?"$^7|v# + G,Hm#ӷR4=j6!_BN0$~7 /M)rm-7ǹhM{0p/G;N'Upn-8aTmʮC6,bzT˺j-(hf:a,x饗, <>+'<`d_d:rȏzams1ぇx"ZMݴ"Eۓir-rXJqб@f#  ^}?TZD,0E;hiQS+ǀ/ɧ=>kl%(_mӴGDT ='/AD$K>fLG:I-JhIx % 3V&xLV| x7)*EHL7黸/Yy{NT-]AY&^S&񮶠naGxʣq; WXTY6M{%2=C}*lED[ЃMAH\-+83x6=]k#6ɅmE~tכj111ZMб<GaL>5ֶ;2Z` F24#vzig҃C`:i8wzZgنS0y~HwkFף޸i6\]a+1k甇[כ]q#? vLMzlNl^;r"Bj <hc{о%ua0 R D߅_3_FfI;FsHo|}<,CQ AU2jCh./Np9\|8 oiwID)0] cP'< Tps7k]pch}2GQ)oУxj= L30&099 ^ >:ө.c1>#vp d%G1 =й(][ad :`G #ܫ-}G;ja=,#k#>W!T*?{Dّ =xLNNf@x4Gr <<\<>?# xlN!^< [C)' T53Hvb]=@/L}*HT#0BO+ Aq'|Q5 x>b8GR0$1_M ;xӆrnGR[up_ߞ}D`6P߇jlld`a^\m$%2=  zS eL4oS ýcP_4̕i庩ii<舂wªZrKxd;hŚJ3Q^ia81ߟ2$Z7τ' idodz<!^U=< 5Tb) <NLe, Fo`mu#=cEb[`@uK('G5Sm`MnQKLC7HzؕSìXw =Rrv6- |R]ba`>'bV G{Cv`r=&u \X \܃ .}X@ԗ0xr;F;Xs#9b9bVR <,pQ ;߁Yveѳ魶lH;UrI$*D`Ie$xU,)1[ x\^L0`LxD<>A4m"i <>'ɾߒdB(>(1< .RD+/\Z4;Չ9Fk۠AA\ຜBw˚(a CSS862IG)8ha2|I]Pَ`6*A4}A#7 ~QmZ=v-6 Q#p{ /x$]1q c֨!}Eϡ[Vݟ>舚u)ѫiI8[XᵭnY;옂فG%{tj U)j*,x d 3Ì x'$B(:;s]<+&P.Du ~ xmgw?(ˑaPHҼ L* xrr$]d'ϡ'hؑኁV*VzY;2푮4=p:p:ckլ.nhĹ?3ۣH0Љh„!@$3l ܊S{Pَ;t GvVWb+fj㎂;n^sX>Onj$u|"v<QhR?#~8a;{G/ xH<>$6Hb~@Hq ``|Y*%5ާ*¯Z DsRKj.AHUUP-GHJPǁ?Gh~}L˕wRqI#T9GPy͚E B*4Ϡ_uE@w+pY*z(V 8CX+"_ KpؙՔ@;D >zO'LvK_݅]^Ia ĂTw~ߏ?v@st҂pQ/C繧<&n'7vҼ!.v֡ v0~C6<ȃO8$}!vH٫=#\y ReW-WI8e5\b誊0F,6nԧW ' f<%</^Pfz>17xX`؞U9zo.A:KU4VaC^_x|8iOs{oP/\ Z <\,hdO.+ֺV& yL%vCC^]ϢD#<<Ud#|i?;8ԩ$sJky:;c:d_ JotfTE)?f W;f/I`fg2*Gz9[z^|ucS=9\.y߬fl7'  0a0++0&ۿ~p 8,?~nV:9xQEjn3txkdMq(#9S!U 5֔Qs3GT@`ʂcؿנdBbj$+. ]iBW[rD:T ;ꨊX0!H,a"-$~Ff҃15\)afnqs^} a vD~~& vS` `Nx &?<w. 2})޷: 2UeE&gD"*1dWT)0z*9],2{P`9uy4ΕDgJ*4 zoA`TEuS?eztW\i p^ =Ýtʣ.x ]N xY;R-.v%R]u9\R#r8O'XNnj#;-{$4 *k<π?=QƏj 63;j%Q)g);<&NOzl#يK:z9oM>:Ly?Ľ՜:Hq#0p[?`&[a=CVqV*؇.Ӱ#"1z}6g+,aǒ`< 0M<ȖpJKYo\\$Xq=a Ia`P/Hߎ1ڪGZ< D$*0Txѳr%AwH;ΘZ-< LS?o!ؙgݳ dtg1iSxU|ȹc,4;jxΚLwS]L5TGl劁>~?G;"i,?íXxKG cQ(i>/̭ 3STԛ`iH^YriVIT~)J+&s f ^+SKtZ8DkC\Zc%YtwHҴ<fg!Jg\O;OsnOOz,Ѻ<#iNq` ކN<iau);$QiSLAG3KxK@4.ycdBx]fAz-x|9Oy_qO#`撌֑*?)&3~1AhsEFq%\:A`:icӢ,I;շ9#1O~dDu@ #m#ٚ ۪Y{<<O4=y-|GӴ!GwU]WaV= :Mu&{;H$6;f<ۄ ḝx|o'n{@çfxTŔftWDop"hʛ(JO`5tIL$*ͰBH\[{ ~cu. 2ӁA9Mw%= t( >Է=lCfXp%rx6Q ۉ_¬Xt0X^; IW^~j c=K9 <\.Wx|'Bߒdx̪00Ͱlp:= OG}`w<&-pinX&@G#v} vkAceAeINZ$c=K?eW-%ë$xF˝C0U,b p|𣳆%ATS]Mp\xLM85'utހ< =>m_SN[QRO xeqLoaBd_. .v `*b[IDAT(QbXZ}s ?$謊~n9+(*=`١ jVrAy2 _ǚWX/&бYA@ xtǟsNxA G߉GOQDIp6L\;(0ڔ!쏥SITʧt$*j7'^, ݦJyz k덊u܀ 2ث`*R\0,E/u|*B u؏0.~i䈀kl pEMspdt0ƭSS*2c1pZ(= [1/ 3{ xPex?pК,0ZDHU h8@΍?J7>5sZKTk $xNvtAU)ȃk >~~|>|>|xn쇫v)5epL{ul.f5 ` 0U/~ m[8mbH Lٯmo`9%ky - `68Tlgi\ib3#OrJ1R6<} <9 '& .ċa>x؛<*- Q[pwu~GN0VJ]>A:eY"J*0},*Kt)i>p7BGP-%)8,?@48#x]pEڅ.-\L@,-`?#8/wGEV H&/gꨤ&8NK&Na^@څ7,x'jY9r :WݯV KaG=K?g{D  RA$] <, TӋq4/FO$Vth߸Xz(JXD˥{3gy[g]'r.*T,Fyiާ=bѵ`Yǩór Ki] wRYp-L~0v1̊5|y8 $`o›xg`VVTbNp*˧ Gp< O)Ms :;tBB1),Ӟ5(gx؛vg!O^!^ մGPU;ST88ʼn$g BY(οY[У FP`JK,y% ]f.qP_hU ADc-_JOc1 nXW"~@ z, 4?ۡa?s8+}k+d6Io וw8{OC8̌ . pDYymi> okyZ#y8A׽*th`q@$IwLJ^ YfN+.aiT< 2I4ǥW\oX_2mZ obxӸ(e@R 4 +E ?~'p5F.w\>No^1;?\߂8k؏?)XZ6"_K] n&䈼f0zӼ ֍nmCާ9*dHM &%: _AU)'4$wTP<%x| '<: PKT4 ZG8DEpiHI!_0*2|iF ~ s>ȑIzKP,F@~TtH" BH20Nq}m#{'XQa)6M\9&S!i{_a)xXoBY&Ȍתƃxa(Ʒ>0˞[pW,rU^` PrGO%NdiN=RDZ7=ȳe%'^;@,E=G*$U$"* l7R1R6r$DRt$r@T/db{ހK O##jiFaõХEWwo<(%PRMV(%R1[J!ו*ݺM*V8i^#;0 SkD$Ă6EHT\f{S !GNA#qQY`Wa6S픣y7}AV<QKeoKU=qM憣c7p $ Ai@jBd>70|'JQQ&75S?Fڵ(Q)W=P44!j$G֋@ NkȌե z>#A<˩?ZM(K@Zu w\"JTWt!X1wZ'~.=3TC < g<><|>^:K#Ke~6s6FD**Z:o,50-yQ t(]򅩿u$@7-)f{eA%et.Vr`G S59|A~֤+WdA,Nt$T z9vٵU͟Y_*Ui- p\$|B<4BqCA~j?OeڻkvGNV#'8'\$ƽZa{J`*MydmEU_#dOTsݯ*e&?N2H |(V"RΙ;GRN:CTbQ)WѴD}c:#6~~fWc gTx1<×S\LxȗZ9\|/SߤMV2O$X5Q_VTq qjB+@h <\8$I n JW}&[I"[H9Q(Q0rdtL\,ٛzJ x-QLoaB_ xFy17VHET-0ڒ0yڟZ FʢҥOH,JKӜ/νz($-Y ڞy1!ye7Nc?錛h_7ן1r4.Qy<r?+/fG #HxQKK xAircGDEB]{Ua{!|xC\`FUȴܡՖJdZaS?\:~%=fC f7qk4 xXG R":tH-9rՒVX|qU_*vScJN7 x\' x8{4ʅYِߠ}C$|_5gF珼z$ʽ+/- L3/{IO r /+) W@DT$P!G*`;NA Vƃ4GV;`~^zzpT"@Ve <6Aj2t:oxy&j r(hdtDEw%pYCŠ4lS <d/ !n9w&פ,\1cG"AV:A baB(HST~ڐ#rsp$@ta)mdc K%?=<\Az=L<>ӿYߍ`"kf!X />hY.A,JS !X1/i^A.emZ7VJD5 Z R<!zx0xLOBV>l O/|Yt"-ޛk97ޜfg- LS|uS6 h_~W G f^/O=BnVY# ~<B yփ<$#FP/@hU!!:`>ݩ"XU_s<%ѳXk/xU:cllY#izaXZ>@c ɃOfA&|wZʳFjamRu_S,~%jZa;T7 h4_72UA~P_$yJcYtI*)? iȖi~+'8À^d׊PcSr Dr<g_å)ѷ i&hIHϵr>{<ξ; x?\ e2̪4X4ăeBAo~V"FTxpA1E@)fH~LQg??xXHzvCnn"x|'9`_?K.!4nC-rz?yd!Y P* fu&,Y YH(X~,ՙHB<ǀáÃpGsMېWe: O<\$ԩS yv/xw;'NC iݹ)ɝ ,uv>jwA͆Ep XTaQg`D3fMMQKj! %ko̅mU0apCvaQN4K{}! ǁŵKB}ZS;}&Xqر<>; o }^ѵ1j ;< C ɿBGy D:)M,rK;E2SU䐆_ J?WeQGZ <Mxt+7Ǘy?x <]x|EquzBv= xp <gPa`t]h:NQ"AA[ > (.tGiDm) _-fj.PFuv8iz4Zg4-h8Xܘ)䐄G#m"W'j`TopxH<"xZ*G&bURr"Z'*Լ? qS9?vY]60*QVkdJdOGߍJm[P4*M$gBv@qHlz!5 Q>5>-yaW5ŭDXS%S$pHHqF$@f?ʱj**)ِ3e˖snsx|2qqqsI=!g)C/aU& B% ! %F(yOᙖ.cr9{Lx| _ <C;~-$cdGk )bE xҨH5Q_&Y)@K)M7e)O@67K RE,yB^B`I?ߥk"_E|LzǺ@m9haZEЫaL砿4YD 4mOCxZ.I;,ˈL&{ T}6a0I<)OPl8xm < FAnQY(, QZ'OC@H.=`Q>pE=`I^|8swyzH뿤!׭~@à 7Y .mߠ]]O |}% kKFp.8ݡL$KbI`ɻK<`Z`ՍAT}wO[.G  gYf̚bF 铀iHjd2L& <>?2쁑+DOxZf=C8;0)%D$B- )##; LQ`L_F|0s/`A!(<|u@˫w?XV߭ S'ZE=.LRS"ixTS4R'txSǘruP%Xֶx|cx|ޛno _555)H=1bQ-kWxLZCQyIwRbFE}!ry_(ߔ$Qi .ȃdXѷ|aQ]mn--Ǽ;*Q] Y?D?J$sEfM`~T8IH xgفGK. -n}꽠3e͏bS>(<Mxtc׮]d2ُx[+coϺ<clG6,'f]1 +ym8GLڝqSGI"`9Lw?Dȥ#v^"K"^(U.Q@%bkYFu{Km:(a̞g|'zegKOE&ojS<&2JԨ?aZ0xh˧,hؒ I8Xy槝;y6 x|7DSI=1gPl45<%b0;<|f#$?xb\)0 $hxZuS8 ԋ`,Ef$:dpq, |<1/<wI70 u̱1q|Tx yI- Ncz\SfYV.ۡ[$rqA]l1%v L~sf}/滂`K$?z?I?v='^7{pvyP+;< ЗcLp MI۔LGooI'.}<>?Cu>hkkM >+XѲ6; W?6q…]179Ѿ!<bm3#xL OPλ25-[La"9Ů21.oV.ƺDhT<>EF8T&ȓι`bVNz${?#-0ØoCq-1@ 4n`"`d&?s#:Jjڔsи* [#c1q^3h`T--+Jo{T]C r,gTWKqh`]7čJnE@/`wP% _w„)cd#BD4nMEd4-&xtttC,e@4 x?dH=QOc]sО-x ّ؍K,L[w/!hߋB?^ɻ1FKbՉ/?˞ fw`ޢvZ迨aTC^%b_w5?L!R0IkO<kS47Dymnr|9I{l.*ފ … kH=Qݚ?vܜ4 X ܭ50:O8R[txG)Q'Qyv[nEf*72Z'6?:N _ޥO?7J0ЃGÚ?x"ixo+ <:7Nz'xXbL&%xZ <> 9/;i,~&~N2uz}7ֶT <iMjhQiʊ7UH.P9}亁] x4=IXF$_Si`"KO? gV;bGXXlxx|c|Rǿ9_>DǏlc֬Y1 c L1 j6&~s NhZ>0MeI4&z|/I[K;Qv{5s{y/qF1c;8j`l/qSB从S"1xP!֘?6 Z@Jv/v^5*U/FDxXJ Qf`ՍwnTCG+&GSAhtyPI$ xtmF(4GˎN796`qK<᭄/9[47y|q-'kvc2nrC ѴC:&FQQYOCb=om. LW<[QvD{רԙ(v}q%!h/w"imY$Mxt@,yB&=HZ>D/^pyd\pa-ѴfCti ]{?e zQp~^97?AlR#f,sbo)ʦW|PQ/tFuN*A iyaFK?5ցN$-S7Hgcx<NjH$,o' <Mhڟd_[F%Mk]%b v˯z}S爼i*5* GSܳӿKchUN?D^ƵT|{¬SDhtyPw+ţH&bǫ%Iw/Jx<Ѵ ɴVxآimI-hZǤ~4Zpș/z^p]>\m EZ:]xI$o/e2h aW^MPemS>(zCXɀ\\)|C?43,|__]TNhqBF2VRy"imx|E-.wd .RZ Ѵ#MjRZ7-G22~L%RO\K i&iѴN͒.o  >"h>-QR)Q]@ b\0KU V3p`y!R20D1T/b!*~Qώ'؀?}䄖'x?m|51Kx _YNh4mss.RO\vc2LMAZ@.sbTLatKĽTY,0shqˢ[d"'vE^U_$uD}JE[u!eTC^'EҊ%؁/ymV,}{J,u떚A4hZ!+W6z/M tڢir0XKjQ/A&"X*RVXX: ʍRN>߮'ï L67=,=kYʒOyn1 wũb-2&|N󨲦u&-UtP'ӽ[7(M}SKZnHŽP⾏|8wY9TCN_^>86kA47 kQ<̅c*hU8QV$SG?Cvh;&|{j QͻUzTCxX# v1&ZZEquj?k Ø?"ia\:M{L&`h'>o͹ihDW|dcWAyhZ ޭ1E:Ϻ ؋RKa8X b؋K7 FZ?lyro@I>*@E$vNZY܋YJmv?K##joj W^~?{j#Or+8\KBX*a'S/χ _ltG[^rа%0tUE,𨮮%= g6o"cF,Jj]$֖ѣG!E2WA=&ڪ b 8BX[^l:C?$߭v2l!<z[[PO"z r`Wwc20jX]"h 1R*d;sps+ <+^!9E&z1ӄZE:&<1'{`qifqR#l3.zn\ZXEZ.)v%1٪,0[ KYi_F "_[Zv%O-xcG_:E"=tTtSw@=3,jL2,!RlLɍ2!_xx|KѴBI-sI-ŤȱCKI-ƥ)ƥ\Xg ^y:?|EgT'VZRW>|*^7þ_׋)Ow jo Ŀ7Pq)GRDŽحS$'s6CD~S!xM{'i 'vnvb\]D@?"6jFO 40B; ?-|dTxk[{{峷{Ů<=M |oQA!?έywjpI޹V@ Zl76$"HqZ~(q2֟Ѵ{xƥdZz$ԯ7.Z c=2.Y(80@S ^aQؚ}1Q)v~4t}UK8WB_^_FuNޒXϻ;)FT _Pj\)|{G_چ6!dXڲ#nXZ%Gd{ ZqHh h$LKgM{/f\sLaVROfII- Kg`z4"N)x.(&NĠ2}E{O$] .@+ݥb;Q$ 9|h&PIx/(/S!Rfݰİ=?saikD'?oΰwy9|CELE?VՓtArk_5xpP'gP1*|xAj%jX*hX3,?Xڡx]us-Ro%tuu!\xŸݱt]@ -x͜Fp,g"fXB\~{h);n]B2MwQ ,B,f`5PZ6^X/=2>ȅPVo xtttIh{FBW K=5. Ljr&buƥǸ@#Pf@wFI=KD.q?%yɴ`Ůmv0suiEB;dT;ǡ =TV#2TaSRhŋLhx8&|rcRKii2j?7cRkQƥ#N%jT$Q͗vyPn>E-fvU:q;FM <;3.xu2ڌ3NYhwRJ}8}{CN}TT*\3,ݜBaiAAK" -6oq)?Ѹn$\&*&&&ڼ-UZK]Vy`1YA`vbQXic>_M݊X_K&Չ}no=(v|tw줐?9=>|R(|4C?(':y}q^G? KmaiSsZ~.rHB˗aXꎏZ-"~m0zI=Uod\:q).oVEYbWbt'y o*ËA (w'&ָ*K}<ƥxc=i}+ -<~(|:w"ʽK+xLVT6;W(OpvA>-{;1,W-rٰT[GlO:z+ŧCq7n#Ztvծ&ȸ-!4FE1yE7)v./M ^zAMZ>TW.]OSTN7KQ$ fݿC̰h>: Xait K+**^%3,'%YWKc4I-6K,YOm+|zqiRGWKF~vIxiۍRviA5Q/vv=Q h'/T 2*k~?VQ0,wLgXږ1ɰUGNNNa|S7ǿ;IjCR]I-|ߘfbwA ָCȸa3.e cŁG>hӢXr8**CZh1D-}j`**صtEW1"k,bXBA2)R P\'S1ĀBX*N3,w4pgreP&Ft/yoK]Mjf\:44t<|n\zkT!RcAk>tVۂ֨H(RZ[=Oŕց^2^}x:VyTX~\Uk>NP|:SOص=MFu$0=\BkTDqSFBC; |_U+['ux,rRGOq: 2톥uQ1X)GMMMaxc:Ywx|I-ƥUUU$yfis$v'>Kx^iUMy\κ ~wpw*j`:aT8zI7̸!b:Xʧ(OQKsZTF LQppfzA4Ix K;'hFolX̸>GVVV4'5|xL2.Rx0EqS|֢ RЕ+PHpa H=KD\} 2[U_r\D_`J(/+w?CPGk9QkY;Ͱu'kXjt`0tiXꭄxxfCn+yUaN}>Ox Mp3(!NKJVa}U"9b?SFWI] ع8LJv˳`*π<-cy} AkVV `vMc'O~A?)?:=OQW'vJqEd$z꿤;m <~RwZ3.qw|`,"%gv/\#m؟f3P\Չ-e&Hr< ,_KLi0`ov&-`5ˤdj0ar~LG&{ 1a bbjSQ)Z+ℿ,FTݑJ.)1yQb?W!xc\Kxj֬Y1ätC-ǭ5xXj `&~yLirhrSE_W{+OQݳI>8JXnXZ<00L0L0,0a=d`ksyr>!@ww >$vH1"Jzr;w~Lx\ꆥx~Km>9E,(}<`h5Q_=K/} Q]t_W/xhJt;9 Y+`,j0w`X`2`0r>"dx:- >A?Fd?>}?lŒJ@/?nr/ awo!z===1,xLq2/'CGXXi\ FJ@lF1wT$R9ۥ}/H9*07IXlh|?Ai`J?o]TpKvx[!b`1)NOѿàvӿChqܹU< wHΰtG;|x`.7v &׷SlQ,` sGDtװ3XSNL&{^q K?q~S2Wwq,ԓo컉 Q_9YQ>F0f%'xx\&|qwgee(rKWZJ,0Yʂ 93͇aK E^W|R#To? sTIaPx>pG__9-[h^m̍hOj1;+Sf4ݓނ2BJ¨Qsʓ%)`T $YY[eRX Cy6O\ ${0X5Ы2a(O< &ebG2d<%M?p=D^W;8=7 ?oKg\Kb+QV#0 _ޒtf`>sѸ- uQ~;~ oHBƥx6oK]re Azj7ŠmX58$0 hOwy|Z*S:Wǔ LzR¸ʒWdK,n-Fȯ":0'G~Cy1kat.Z= nQHx00E^y:XQ'U5 aֿÊ/[bxe97 [RPQt(#xzLgxGۤbX/;Mgz2cƍKH)P! д68Xm|<;z<06pob$,v\VwC8?C'WI풔־;løg)2 ^Cy/ M扎1h!Ȑ0<^?Yzc1L'x1Zg ;3є^0F*V\$ϰTȿN Kg1Rw|<;jH,C-h\Q-\<-;֢u6y LQ\Jb%/vo2_zD^wKتzR$;ߏLXy CnkI_$|TCP} ;%;t\.b?0kY&hc|qltGL4nMBGQaXƇ-},;gX];f9gW;|!<}<~"~nDr|+/ Ѹ-k#nk|k%&R(οƥE`‚OJQe`=wc)QpLvB~FXv/3ډP?.>;i\ Kaz >xJoPQ9H >NSًKhT :f!,t<q}EtZg;~︛<${e2>{ M04zc47v=oaxxt<#,%%Z?' FEFW _m\0Fu4{c!;Y{=l).Xq(aɏ&ӃJ _6SF50+8x$HGwG%CQa0"D<2o{;pE7; CCCWH{[vS4nnEsn<ڶĢks nFFF066Nǎ0X '_<CRehjۊLr 'ص=ua8Wh#/Sb(Kzpu2j%R8ZǶH4m| q.m.]oAa>cxwp>+W|׈G8L@mA__䱖R`䀇0ayE*R} jTHNROY\KF9h\>+~p,ow2o?8@axxnb!ߖhhޑOՅ> attMkX}A 0&R41x<4yQja nTj!(o!p)xz;tgA;NW.GLdA5*%}ac("Qh|yD5OR'A5 p,G04ozfnGn~Uy`֬Yu;@g>+c$_{<Oى^X(+x~  0oEBbgJQD!2!4CuN,zv\]aNB$vF=vIA5Tg,!;偁)ųkZY,% ѩZCD 4|tww]ttt 5@xĉ$6Wa}d_tǃ?cnd}'ۉnaqƍFtf$)*NHok)J(xX83b4 RyVȞPUOtbKbkSu\.OT2lɳ۽ `L앉OcL}qӍ(S\Lq "B]׷.|X`Q r1LOYqbT1\T煡oG:E9h}w.S CC}w4_51X=񴿒duV$ZF8% ibE$E)KoY\XՙaVM^ ݲ,\#҂VЫXeW`l>u(aUc4:E 1qwK49`4)j=J\؃"fgVR/N4>/uZ kBX\'`|ЩaL# 0Ta,D(7oެh?p^ ]>?x(7H/nPo%ǡyGXKF3倇 FRXKYTC>0̞L\SEKD9Vubo *U bviü9A_,TK#FUYlk]eԨ-6Q5-fG>Ԩ!7cW;qz~fSZίwɄW.K"c1 kCbYFJ1.:Rn%JII+< w*:/nxGѓ|tvvvg6ƢiG4xo%\6a-CR ̚veڿffžQX*aqWE5{wr.n_ʣۻي/[ ChxXcRz ֡&J _xC<%eԨnF #g"|^Fnwyh\(I,s8ԟ[{w GXX`r} P#],p:βE,6,իѵIww h;pǃOxSN}@KƢvsXˈ2c ZPR9e"L 0v_P{h9L]&|b`yYZNag1]=K;:<&(`,KXK0' F߇kDfsTy}J+Aؓ \Y\1P1 _S02&OHaquë&>8N88Gtx|~>c-6>֒KԹulv>֢̀0ic-AjT$:Ά*y`FZ֎âLFWӬy`TԨO,S~JtOty'X=jT<0*b6 /O6SrS#SjTJSB-"HZw!q1襂 ^nxӍT,hQԴ,]I/K,g oxO{mE6&c-#t3g<yLȀI8X9==}a9 8;0Rႁ]Fu/ТՅqYVFCC* C[qE"Dq3( =h-|/xAJ=~{21QFIr4{ 0z86X/,dFL;΢k:AtM2::Zg!n8Z!YOX=O?k*ӡ+I~JQ3a0TRSXa"eJׇs2/v=IjR@E0ǻjTEpv3tsj`*;)i 0>(|[J|@/Pm;P'-#nE mq ,?'p1Ͽ;q!!=xiOjժ%e.cbX(LqBFu:$i5zs|Lk`~ueZ`eН'o%&ec-rjTUqCFO/Quh bQ? L|\\Q'<´lUKBq8EL;Q|7b>/psRwiR :ւfЗF|=uXX`),j  =怩HuèZpr&0% WnQ{8WW69P43@e:0P 7ga0&/q+~5L,]{g|| U罞~ؿWSYt_HK(qׂ C2d cOk '4ۥ`Subp?]N!Ԩ7hP_Vy$p@~4Pq7bݵx8XI4lwY*<PތL&L&{(??)m?4֢Ȁ<x x0qv!u:1_vڇk9*Rc.z 3;;m@ups/zC7YhfxauZ[bהTLi!Ljr2 i5 61ZX,0Lt( RWc\* xqQBch}ԙC|H '(46ⰻh'GN T@!jq8*HYnz+D fyo,ފu!)x{x 'ZJR0uyc-0 Xb(v gC_< ˏ0WB_<==]b80|0il6h4Bcll ###D1vzT$XU)CA 4āEWeț?5* :Qt $| jEV{nX{?"鈋 ˁV1 X,v1>>VazA%>lHF,zUAoT:PHn g00Ş)jTHQ.8ȫzw|'my:cY +21^b,իF߁A qq䍳8jѺO/2iZ~ċ}[f_ n5֢WgToQDqc$A vGX 40#-!U:s҈|=4lƥlcYi~ ;D!1 -'06* u2"(2Ch' "oiv<SB+D@/'>Rrp/Rغg_j#q8U|<E7vw+C_] 8&l;7SڝqWh2)1y/:< ~~4nmNZlà̜(OU|<`xW-tw]1^( fsM k:eIXقA i(ݗ#=)(ep?D Ի0]K;Rk7 )eEqƥ$X`JKۨZ%ffP?μ-|6 Wj1Uh@-ǵ"k +?lbڎ'H\uwXa*aG΁QHqnu ;RgC\ ,bq_ 8@~]&ŝX,qeGQ) uyiNv()c-.:fy<,Xٶ6һ<=;tviZ32 8" 7ڎc]n6Z"Pd;}?Z Cz/q2Y mKҼFO/RX EqƥvNQ>j)qQ8/'`cQi LAJy=u2VvL$:2}wcäH<I,vwtlͳѸ1ԭ}իe-o8Yra%$h]diZk:Nz\$j7T4HG[~&[ /ĨrtW/AfM&̚ X*aѤL`nUˢfVI0(1H~`|>L;2r1wD°3 Ƽ(`)[y)?J`ƙuVzؿ2LQ,Zz x _Ca4Zy&à̂"u60l] G P֒puIQ?/l"|*#:-wn:=mnT032fMLLKS1^]A"F03}л-][bж1 "qsu8j?=8uY>/;>+exY<o9kٻw[_hCޘ-)ּLtf$}e9T,ĈrTS-Acy̕TfZkeT" ]em;}qh%ށ% Wc_-zkA߀/MUT-cZ>&a$]x(GҖ@-Ey8 7-|T;R 4@-G{\{l''ǺnN~>dLbT٪2 +3`T c KxnEXtnF(ZUa^1#/=j<g 8Zoxxu|aqk\=j6%vs yG:m]9C[c,K#a(I&*HSB40U`2ց:s1varz$ٙK?\>z ۩1bW2 IMf< {Be <e9v[5~_d^svyalTMdDJ\Q#Pm|Y CX5iUݡʀ4H@uw `Gזskjғ>΢u2:d?k0}"HES 4 8@ ?j֓<؛zq˿r%x Б"GZGy hc!_ہ\TK;ziZ0UxSRqZgSZoga;āY3+hAҤqhuhX梣|Y9"<g\rXKEE~Z.Zc-SRveTJ"/,X*3`LS2 V`E2 D 0 >CoBBc^L1~֋[t\q{ h;vm_0噾/+24-D]3AMKɹ S̉QOA*⦚{',|z#p`:g9)O O S"Le*qڃB#;rq%]4nLaaOU:,i8KE2eJG 'tlbYװ,7V́"uGYYkӌq?0=o}[e6GHgNkᛗ`t%,a4FXAXo vz&x0b|r_CaX,Z` %Z>.m 4Ůaj`t{ҡ&AaVf\2[8IJ T_ub^b`>$~~4C=v[ Ԗ.;s` F?/QԬa] 52tw,w9B^kijjMsl 7&Zq*`NJ#c-ƲHY/z0"ۡH }XAAh4l6O@=} 8W0d慩G2Ho$RFz;<ʢā"zG:/:ShER4OPU45B /[ vEpa0P=/~|ȋTםL2+UX C1V> D?? =&Jm,+`7oTqucEÛc-_rs'ܗH>ToLBѲ3UaLj#b¼T ϼ l3ӧo7z t0 C0qař'Od (!0uPI̽|z 0*`*-<wJE? LadTCΨtCx hP/f8X?ӎJ- vR8Haѷ3 ]m7+[9́ycÆ 9ąqq|Ad+n;Κ5􋯹YnNATXKgn8v?/ Å,YE$YKUFKUdt^=N8 L&h qy+c*verpUZ ev9t0σx6,sDS6y7(Gh|MZܨ)qǀ\@7Wb`U" mV" &yݬTW"8Kvs%|Rٙ;UNfg?8;,qpy0esϱWEވi4,FvwLoV:el4nx Ep{ꈯ7._d,8 9c-?pkygMYϘ[)]nnx ͛'<7/Eke_KŌJGK`O3e1-HwDJˣ(5:j`` x,.xy|\@OQ: <`F.Uh_JJ8{@z5RQ8:"(t3Lmnw?,:h Q(81Y8 v#hKB 2!8ˏgf:BX1mP9< ~;<<|qRW=uкeSR}yE*n^k봻C Xi_ŀdIwyx {0_nÕ,=;>FFFV U`,q gCCCWqg*g!wc-d裏I<~QqԮy\y˃o^*U͏ LwF$Cjd8j~QyիFG5/9*"`Q&ż11R@}wG lwy&wym7C$-`yЃqM۫|.z0F?Y1>FLt]ν Fz[C Y?(ico _mRfx\%J0-'t_NÑ9?ߤĬԢLE1ɬTĬuͬ'k :vg=/4eZWk!ײc3/mkkfXtZyE:VZq[2؞L1bhG[L\c-pxǁiBRK_zjA?FFF066^V Q^ \Z]>nJ'&|6k>XZ?؊aMj9tG,:fW{R27++7+uwYC-{x,HYcXmc-۶m{I pNּaNK6R<(.7]B,çI&@RCc-EѾiZH \4.+{8gFGGa2`X&Śة7"lk)%qzEڰ,8.Vgjg&Cխ`v?B/t¿ 2hcjYv#h-LDaÆx,?獳CYkd2c-?̚5wzs%RyY":gBfڲ :Ndն6Ԅmn4/%Ϩ4wo_=K KsZ #ˁ [zaط =K1ZZEoC3еQ$`@ aāǤ:|}|+bBi9z;¥-֍2/Skg G_,up̞'~vOW Tm_ *V%dVD;J#+hq"0fgiƋ]˚_k\|yL&8˽.|Yd8ZXZɉ`!";^0?͏utra*HQJXaG((u40UcC $Cwv%p})Zr6aܿ{b$ [ѽ) ݹI@olErǠl?ɇY㼻C[CK"b"ƧQ򄯩O R5H(X;u0@5`*hΑD^PͯLf`UâGB_Žj0}6ܹh:MGGQa$I8g"g}tc-q7kuy<(~w2ڍOhЖaGػ<,0^wICE"'`4i&f7G@0EO<ohDW~t`9U`d[gs:7rz J~AGлQ x #yaqfX2fd|i2R;9U*P"aGLЖLh;75yZgV8J=g IX˿uy򰍵ǵJ&f߾}@smeO3/mZb(XIl1xLxnжpm G0tV|}XM.JAGП(v>ǡ+ٰ́lup=`h&y1FY"<y8b sa= [<VY<@0̀^O[:X#YϿG*h{w "0/e#jYaKl"/ѧR;' xڨNdU2 cHXK0ˣ }0گ,.IEGзg|8K8𰯊hϺ>K+οP1LI,rT{`yØw1q֏o+|<ξ-2p%;ifyq^wpѷsoVڼ#QFCCgy{囕q kS`o^w}w.ѫ yMu+/6o¼Tˍ8vyX˹.U];>^IhHy|DxFuvO,`ȋnDGּcr;apk89ƥާ =.CxG0^7CEm~XCȬ3+zwgqݶB,p 1*M<찯2GuK+TQt^|})yÅXY:d7E.jCCj*"'Eں;FѮyV(<<Rqc9c-|8>(~[WWBܥ~iRD-QEԚ伈ZE8k4.gq ݢO6 G@KK٫G^ !W80EÕ.tXLJ)6j]'.Wc}g"1*uf`G{a) 2V  e-zq//[t ~iuw\p-Yw?uwtW"3+}"f3g<x|ߘ~Aļ+"]w 3/Ͳe?e껉Un@GDͼT˃)ԉn3ҁ80c醐p"KiT'oߒ)x59sjG0?m7zL?&ڷ<<)#o=SFnߓ\ UһQ >6%bG|>Z w$>@Q""{DO0O_\NiT긔N:mTTY|jwA>1Z,c}vСxm[e2* `lN@?&hF]y)~UOQ2'fĀZ"pgt.' еMZi/Z'#yΚں;W?ݒ=]ozhVJ]bc-BwKļי HMqs.[D."P% <$qAMK&<Q ][A? 4 =GB]b-X?΢Œe }gҡSۣa/U š+ywc` ^U`# 1.|>+Oi8nf2Z֝" ǖvM^VUE0q^wp͏60Hĸݜ`VzYyfwLcV8G]Ӎغ<#`^j]ggI)\ۻ.:k5oS>6*`w! 0TX;<4!xkHIË+f$wwS`eiD;t'WKm;EYYiǵ= ~{ȑK"t]ú7ntäac LMҢ^JI!bMKcaTvθ5~:?)zmK ZCw5ڊeG2RеI&v.E{UՀ˽20{Bبԉicj1.lR(3Kt'x\*75?F\ǺUk̺;7k4.:dppϲQRo~ҟ"jo}K2lh8Z3pb`4=% ;3[}HZC>ͯvx'B+^c@xhs#0ӷCFuorˤW^9pz4`Տ?0{]4&MT(?ڝٚ0նQ]a}K *(Ҩtut؍JsՔ]i"-F6[PT0M0)fݱX%Q\t)!g3Y)5/uf^jf r9W?/uy0p) g_c zw;t.uwԬy.MMMyQBftwP0/o,p.]KQuyـYcEƕ)]܀с 8Z,HKh*(lT'vIU@b z n Gߖpto CyF\Z6`R)! В?Kg;17gZa<tvc(Y떿#x&~F@?ߣU\ 8 ˅VρGy7ގ>{QtWI'xY)?v&fbf^~nz}$SbCO OmDK;{u:K30\XL TV>Ŷw-+cgT5`<TCBW pm`ͭ9rTS -QNjI-~ovp0OfRwx'E{Q+5+/y)˃Qۓ'Oowyydj^1=ݝNCȓص^"ШBØBnGѴ%ahh&iJ*%)w*Ցy&}aA߻}2:Cw5tje[fX t} :r[hϱ>FWACX|S찷D'w].w"''?v-?v _Lru4;bߥNbh" K%S?~3fV#(;pլxD͵X,ZityOIlqr` jn1f ð>&=Щ20Zxš #gSc.wxl׏hooG[[Z[[Ѫ3LZ=%Ђ[['-7G;,p:F,)C_C)]A ;s_ovgŀ1A<A?_T->x~!\w0idݱ$QfC=4Q!j^nDyc`DmMM\J]իvc$xmZV0 # =a> /OVx ǡ0e-MD&vW:q 0&&q| [pm G_G3zzzݍ =ielAsn}@hVˎebfF_21:ƕaȂI`A;"*;}9h`*6QUQ5/.`o\Z8<%@tcqe6@ ~'TMyc%.uwT~XR~i4QBfFRRw;Dں<~0A$p.ݑ?0 dc ̙a$ìN" ze" )`Iå 044c{;Zy~|?E՞7lpp:@!谍@" ,C ;g|וo6gl'$iN8NbYHQIERͪV&q67mY]^@HRdrg{$@t``̠m{>fW&`~9y7ޏ7G_m N~R嫘u^zm@H䕙A#k4 3N,i׏eZVjQi9gTsl;1iczzzL&{č_ٌ%#ZUAAbff o<*RY%cWM} mGGy= o`ddcccFqQyX,XtSy<Tbx,]PPokT^Qap~&.Mgќp;Kq2@@#xx>T]h4`0@C17М~pӧөSq*fXN >pj΂z-Et.pIJxj(30M܃ׇAb||.*KMǁU=\fCWbSy2bC9Aw0" cY8uG IJQ[ Cw^+ ]#KdCf_.50S1sܞ|CHxQkAW.'X:HkJ KI E L|o93M"Zn|D+AfY XyvfV#3π=7=am05Lvè!$ᇤq2_oꞌ}׊S7?Rv/UaCI1SwĨ;Z_ʬ9}uWPwh p@WL111TԘ6tvv M̢5t azA- 踰~0 u$$W"zj\"RpדZRy[+ 0Zwꎶ# @Khw9;F:;(Q/"m-ު<>p?dNOO E355&æXχ݉BMWScʃf[[\KT}yKaxP?q.!RWn{6GpxsIQZ\<83|2KE&(1  ءw%n]{{T%Kt3E9|iPu~\:a֮0,Uk]G@WVa!GB&Z뿨Q]VdQbQMQfWwpch'/vQwt;LUw{~[Dqù;ȈZ|}B*%ݦB_o_??SqPC[oSyKa.<8Pq+4xŰ֤Rʕ0W@W*Nx2 $c|ʳAԄV֗ŠP S1~:S9`:K~"KA,e|ɢdՌaI7\P6Fe:O~P3kDX R KZX'UZKl&$r1he/1~Mx);~y@5UjO+0.|"La<Ǥ~X[5ä Lb,*4WuXޭˀ^ACׁK@+ọCXAW,NePƳ%9gBt/1>w.n_8q.u}"G1+8*IQh*tN/E[K0]MQ谔,d `*^S :`Гѻ A!_#Vq0m~ \|J{I0*Q\ѡ~n5?w(<r嫩,ƲVݑMQ< 1q~ `" ^O|CR:-QwQDyN*o8s1xb.FO=3073BwUw0Fdt轲;p+v嫄'M.MgNd5{ˇ]K_nY2X0dڤp2G 0]>|J 5W ս_GǞBC[E©;LNc윫ƻ2I'OPw|I;((TyST;,q{Uy|(ء_8:ǟ@68O-wPy*tm,Vw(2 T|ut;.=3V'!Z{}W6n.4Ak]=j+&iPC˰ɻ̨n]=-P o=#\ Y;emqM1SwZ໒jSSSw@p<~ ~TTT_JGh~~.Od]-yy'8<%ZFAUʱeLe8^B1 t/-uhe<;s1s~>OTl`{轴c ۢ[Qxyᇼ~nUêL0=V^UZF_=>T;܂ AL6EgV5>L ?hs GQ/? 3q)WHN_$|FP_ĎuTwlm]1=h~~.rbU fD*<>bL\ʣI1UgSyTxxıcjYQġ30jm[ I9E;­,CWs.^K,EIĨ4vڨv0m~??KK7˗Rڜet# yL䀎 нdC_Ѓ(s7XT[{o!߻\*tLz$J5EvRNSw0υE/%uǬ ; uQSN*y())9(cpa41y vTyLۼ<U|S2A!2p> yK14Cib7ek{|`+6"l-Y꿺 хxvЅK!73ShFS(VoU$zgCJay- $k[ 590Tq"_|T' hG[}aRy 2KO3*)fZYꎁӌ󘽕e3*]O~Uw u WyǿAdF Z0%cӘZk'ER]Z[S[p~f-9 +6EO`d@-#FaSydW{uOJ"I*%d`\TaT~_iX\zUǵHx$:Gp~X#+Y3 >Խ\C;fTCzd>(tARwx3;b\SyY`#6GQc"~L-U8Hz`kGoR o53BhyE;fSvv[Y80* "`vx+WƁ|6P&zeĨ.)ORS {`o6y :[0mwR{~0/~߫@3;;&B|u}Y̘z4*]Tyk`(1^%F y F40W63} w-,0TBDadN52k15Rs4p3l"lTj,Kp0*f LrGN$56*T<ޖB:-/x?V_8VV8yp&K1zq |'\{o s|C ;&ôæVQi:Ry\SQ4W ?t'uZYFL1OmL0dVwVŽAmqv+4y| VnQ u3*-eގmya.zWI ƪ;~Sw<uEǿJ&dnf4??/z?P0QBW9y8B:7g@aDa:_DǼ&ö锸ySlcH?P5ucT: s]`ݾK/):Aoai<Ȍ%ڰa|<?6^6H$EDd hpݨw mZhDgorW^;"Ry7^2"ʽcj,S30SGq"4c:o&iz Ca}-j\[;nv t `T Ĩ4R Lb r7v 64tc`WZ`s!lj30-6qLE.Ŷ0#8=&z sjx'+ ԷϣB ?Ì;^&.r:TVeF/]2 .MqNi]x]^_jƀOd䬾, mB"mkCw2fhSp1 ׳BV=ꝌJ'x,焣Q;9;;ʃ=5k֤PeL)_ᯁ)3Ҧ*V8 ̜6z8=C^h>Zʌ& lgvL`7Ĩ4*KM WB0׾U@xVJPke9"d+ zR bf:[ao c֒RW>~ BSlTyf+E׭[v(u *TQGKKBJ8˘Z LK LEkG"ۛ/a=Z\/=K1YCW5f>2tͫupCW`=+;|@'ڈ#\5eX},?Д&}'ϿrQA4(ufZחj'T!ҡfzթ}VdPAϊ<{BPF%FVoJ9uq]Iՙ;;paQy$&&&ZV|wS;pQx20*d@L=Z\6q:㍿q,rޜxs::^Ϊ~ vggWHt3X]W P(Qi@Sj8f& `#4A*cf'=ݨwX7(H~j! N/bT:|nTʩ;/VUp87ꎯ1;bxD>8/ŨFUh9S}6}0X#0VoLetsa΁:X99Al] o]lXaVdTZ+-LK`8E-pj _sЗ3>i輙^LMMl6s3O`nGTtNC4IG_^:έU_ e`85)[myY0TfXm=\ TOL;EJ_m,f,I__Qaa2`0@ׁ6 E`{d5y 0K|",,Ŧz/ tԃ%/HM^%,ZtAT:P5+kr`a\9́Z1V#0X}}6VxZêTm}YuN/IAQyxTy|EL/X,RZcETHG@Z fcxKcb#4h 0VT sM,%˗^RBTt6a7YmhII#`b=("@AAW7Q _ Ak2%m|s&gџ]@: ;2Q4B;NŊ;l^"rV K|&9Z qq`< ޹;V+RCAw.=nj0SU xth_{h/X#f;lếE˪;;NkSwLmh]{n fIFynZRիDA"Tߗd|3yLuIia>Fӱ4HCǙD_~1Zce1Yhrb[[jr`ɁE*T& p xh<v#ukGu6U0)¨X CZYVdAS5*DI&Vw0<bdG~lҺ.T\kK@k 򰷶j80x~Qq)uR:$Z-fffh/f@2R6Mr9!94avu* & t Uwĉ8ʵq.\\><{neh!\\+<)a>'l Zâ^ }f>ljA1\?|Rݞ?+l;xT~,V~^+ P7Krg?f?`b_'''= Ka:סe̵ z< AI ժ_reL&o x,DA"TsDTfI<RyyR'nshmq00e[[8~W|MӧkܡzYXVXVX,f05y~p665eop|%# 6{b`,O&G>GӀ@n] ";|;VmE/P N@U&^mb}kϾ pꎫar {l~+@ZsleuJru>᣺?;EsPw? *P<˩<xaTR]y.-|Ӊ PWm!UyX9qR볬([DC AaX:{pAЂu솟[/'"PΨT,WG~Ⴂ=T¨T,}ۡ|Lei:zݯX kiH |_o7*e] WCԊ,,ցRw|7ꎯuhPy|ɓի&{MR*©oPG;|G/xYb2m?*+[ O<|2SW?[[#0mTt >h ߧFw/fWݶ0C^<uS6us+K44K~}Jnw/YA;c*~&K/~4gΜf-_Z[:d8ɷbn4@w <ᱵvh|Bu8}X?G prbTJ L ;Pw RQB+Y,%L h;ih?]gYG:)„jCsဏ-A+04\%gSt3RwwިTtL[IA7*ŠkR&V(fT'SzU#eF 'ȍ?cf3)НKhLN{?JIAk6a"ʢp1ڇ1S,Z,tDiƨT&(QjU&C0o 1_浲;"$Z[ϵtvv^j``ڝރq^L[[.bvZWȈ۸ٷUouGE,`O,G^b`QݎY^Hie15U> C_ WyDavs /,`vU{1\m,CA[[}^+ Qwz <bߏ-\?GqZwaH=|jmCv{މˆ?F]4p,yְSHWgDAt]w1ןÎ30;vIsMUC[Ma.G}?${ wOZheWH )v_ ֢d:aWR%Fw=Ψch$Uϲ<g` !W_}E-lʬGIpzv`r`Lck uMfkm~h7knzo6S?".@c! OèOxEOb`=phe)_KO‘yt_L>!?4IߵoVVvoeaSEr" '3@1*o J??3*Rw3Qw}Pyx31qgjNɵ޹Yh/ڊ'[@[[8?Nqa{wVså 6+S ڨ4)`ÖUi<,zKvoMb`Q.EBFŴO R˅ UU V_je1\nef`Got>h>MuUF|1V}u/ch=;DA*UqӘx*e2ُ=S'@ktoCwٷ4p1c ؽt҂ᧁ.I&@S,]$|1蚵?^,&\TlLmx L5 K$U}/CGP$˺M"Ek+ ߷S+KwvtoCk ]$?$xx}M` /G$BWUbcjd?h^ nE[t<9Nd`Q :BhTJ LkT*n`"o׬v8b[iHJE LGc| tWIn$܆~ fp10|60M!0q s);VoO,%O` 2${zz.Zo0*%Ry'T"cj70MMM]fZ%ڵ%KkppkkkèZiS\/< XEFSTcch10M!`C,Kg;֋ɔ ٱ"` 7 uUyHGZRmBg=^+ xx~+KKft"5oSJ-bT)V!u?uHPy| LԾg֖ZK-W;4Ȭ/VAS7*.(_ 4*Xݴ};,E[Z׏C5u,~|R|{[|jm1]=C­-pLJgy\Ȁ]PJ]G#\+ խ P* Pfr'h˖<"/Vت O ^oA+bzHr~3toIRuȑ"FތR ]M1ʒ͞Mb`jOyRa7p4kkg!e$fT=t#w %Oax㯁hN+ b/\,ZVV$xWWWRou50G!4o`5G-˴䐧ՌhcLՉ5j8hlgIO+@%atEk&jF@VgFδŤQk@(Zuy6h N !'  2Vr?IЀǕ"F4oqO#hVob/h*V52ܹsүd{dRRy;V|PymjZ[8?~kl6bؠ>\{,5ǰiEv8^-rw;Sw\~$Swf#v ݁3/Rwf!vVf*n};fx楳jkHة ?u0vGvoCk\jNke Qi0A"(-SUGd2OHRXn3*QnJZ1_deP_aIB-qqqeRCw[[[l~WIhZz L&fP]‹CUUD)*"xDJ Aʇ{+Ӣt}d>5_e| ek`xInk SRCx|U@Ӡ?wvGn_'a6'xV;W4*,[YZa`Nz20OnspULOOC@B1èu !$R1i"-zaGyRۘ5C{p˷{G).=KۂQ'9y|.z%VEP_y0ݹLn$f9ͷ8wa1j2oG_N1r$^^g[Yhe_fjw;HD]^~5yЩiii-ˌ$ZftDk^imFWWz{{100`-נpKa|+-<vRn4Qi4\]jd\u"2ֆn~`L!.nⶀwLd2Fn$+~y?A8`g6a .,j/|;vʢNIIYƪ;,w :ÎieCJIHoB``ʵ30uimihhdzw---hooGWW֖!L\5A#=Clk!uQ蘶$bT\ &+rf0輸MFu R1*70e`;JV# S#4FUWg AӴt0L0\|;hDdK~릕%Fd - I pcʽPt~h.!~WRm$2C›=J-H0`)EUic?hz{QdHبtawڿcZI%i>TRw.A6:*;Xa|;LJ};4m yˋVQߑVb`*)/[[㵶|%?d?\aZgZdGOw#{0ڋ}P_8ŃUjmeɒܘB:#؋[Dzî* )D]a9~{K# ;HK+ 6aa^p# Zu֥wZYheŨQ)h50"-x=ihii;wv0- = E<ʑ".JB@է~L俉_v;zGÞY8Nn$ڛ4H'aPmêWb0,F#t:Z-f;ߎ=)dgCCgAB2b-.E7-㷶 !bc6ڊftT=e;/߅=w~|A]J# S(2*Ma˪?tw [}Ͽ pqk./lu ;8!dXI%ORSy ?Qw䀾(At|;S f͈dk>|G!F$Xk˗=$&&&[,IɾjrU[$zw`zp~b&ta!Pks"C~%KAW,>QtboFx},Ͽ $oT*6VԝaDI&͜DPZɼyA4.a1)U 4u<;j5o{ߎ%uiX٩,zhe,PwVQi`>:|˹) F^;h/fG (vazT{1YǶ\:C0^= S!X0àUv#ڍY⺈J2@R2QL>< t¨LTVe%H[.UFsep@tudR SZkgA]%0Mn$>Nbfvr˶d Zkީ{le㦕;HS^k->#KFd)nA!M5>ͨ<U 6Uyl`$}ծ͞50T!nQL bwVGawݢ\ f͜DP:<% `. W*Iagξ,rA_avw4Q g=;lNVXS]a?b^+<;HZ[^z]R-FZm[[[&ja~4@w "ЃЫ6D*+7{ۦXy,IQ;lޚuG-_y\^5+m&7sA:Ԍc<#\@aȁ6.x mm(t>-h- GR^Աc9S!S_Z[~$~$rEz؆؉n W?1>L\<C0\9 07< ˵YCZ 6moQr#Թ*sBɠ"'+vX8@ Z.dRVzcW SHkTz`ld~@er=5`^cU6k1S5+m֑94ϛ)XcBKZTytI369_; ˵anxƫarڏV155exSފ*ݎmhߌw^|A)#?ZYJ?);Hdk'7-w km| F%4twnd~/̥CгskӠue xu051ٳY929`+B ДUKMme@+}~|",DA"& Lgr/[2!~k[ouRnw٠GONЃb֫`Q:@J1٫@+Wx@ʤ+ 2¯h { #_t_]M`ƒ\PW9ÕCvq &oq]]h II[9<ăwHie!imqjmOv <,뮻}Wʅ0܌-h+܊N?~TӠ.ng+-!Ȏ͞ITѷ#9va^mME|~USy~K./nq --$ < !!¹BRi,4 ;:xX/lgMJ};tAs cƟZYގw`+ CKz=gΜ,|SV$$'''I)U21R4dC*7|Z4LCdzqA /?{Q><RmfLUcĴDF5P$Gs-uA5`v?.;с64~k%,dJJ2VoH+ /nmǏd2ُ %MiyV|y7,`Q8Ln *P!}8 LDa7[|1|[xkBo`;<.p츰!qm?,uMKMo9zXMKCUm9 eaI,|'[?BKK ZZZ`4Z[n]ŽGZY3^ ie!A+r_㵶8quu~͸SUσ=Tc< )l3"m;sϗ6]h X0OaRm[1܋0؍ފ*ݎ֏Ass3ZכJzA˵|Mv|1V *oZ[f3㫬\2Q2짽W^Ԧޫhb*6|q'̪MnyXU8+bTYY<ST$qLap ^מ$ϽØ5A4*N;Ѱ.CI%tOEbgoȁ5ෙ6|qYΤ voCW111!Uv{7Lx?,ި;Qw -Om"Mg?oۋz}ԋH90LU8"FSP",wieKF !Qxj}E]hZ =.QC'ҰVR xDžW-w1 .6혩+Cn$umc YR^.>mnfa(KN",P?mF d'o4k/;^ÎS[imڲX,;vdvxA0vAx/<}gR/SVx5z\}M[ABQrT<@پZ6{XKs0*I`,j F2y$K30y.RG?@ Y6=eήNDɷK[LPJ۲%,$HoPy|ҩśQ~mmmUP n z'[B6ـTx)Qid~حu|a5 Ls@&2|x).t.fc\uI,"_ F#Pd? ;(I+@ϛ2Uvr,*\&MOvxRw-ie!A"-~y}'&&>8z\]u. 5Ud.я7|?(j# a`=d=kmƥPd.m֑[:BjoIO2 a]u.y ;Z `¯b]MOO7}|;oie!A"[[f32Z~YYYieZ ʂ>!nu =/A]ȅ o74JI+K:݇{Fk8{k}0*FF &\܃ݘTH%7u cM#iPI2k=\;ax}ՇASh\j '!g6#hI+ ϨZ!?oٳg|uL:tﲍ.ہ>q ՛]v+[ utgQZGEs hew^g_xLvaj;fn:w׈Or6#tjP`vNC[EaG|'vve 5//Ϸ|;Z$b?snZ[<d?}wECh^ zp[m[G.hr7UysM6`-ۨ@ve0NxL^%G-X 6>~VvTBWvȍo=v2v !o<;?M66(K1|3Uäj ,6AK"[g:26`lUL vPU# ;,0;fr1hߌWbY,Wv|%?};H+ QeP8y|񓼼4M[jp mE[s΁&Fe&!2pDi# F8@퓔0𸰖<<*jиxVeҐ[; Obm'aTfP }MtTȅ~NVltӅh iӧoǗo ‡έ-y8-4?}7NFˁdjovW+=U;ar5z2D1+xRf* X"p`gT xm>ۡIn$ G:=cgY<|$;t)12Ӫ?~%3WD:zW&? I`y|K?odUoxY6*7@؀@*FULXraUn# TA׮8מTfRS:PfL0TV?. vʕir) `iF Jșe-]KG&.UIɛ=vXxl _2>å$kEWo`A2Fa$W@_ɨ;SwXIvHi6_vlAoaД%jϵkvbRo};H+ mmu555UF/؆Kw|z'# G5XTbϿt{^\r5K1cimS֓R'1R>jޠRtz aUwhu4Y|$a]qn vAw~&JaGAPSԬ?Tf7)`/& $"?LL9?u] 5T=VwNH<&ءGjzеvTt1PCr"BNq+<(<} v9t]Pi-3u1U'`b_%yn* 1\Ĩ;˘v}JISIzae)δÎ8 wέEkt˟e6Du]w=. I?(7?<11}hhyn1ڞ_ =Jz=̵Z@oa2[5^`v⟿;Lu/'!QB|mӠjObtFN.An$hSf\;*;D J9qn h;ieEͺh4ܛF|;H?oc~LL9=0=*~jժFq,jـ#%JE1yKIkKSn pƛԥAWRA L<8ҙ:Sq>GՓUw';r,* Y 8 |vT<Λ7)oMJ7ķ@kﰅ31ɳ>i}c~ ǖŸ(zQH힃Q_" <^LWðy5re'2/Un6/3 *~P(~衛BDZedK=uzg6hy]t-Qyèv0Š˒]/ / b@+=VZqe/ ˠ;cb] }{#ߓp}5'cU!vStg`OEӲ~)~*s™> 7)u+ ,$HD(ǧy~ޘ~K&0孷ʋlьKɮ#/YLVyq LW@^_!l L#`RfUЫ$cF}_34pnX T*[Oy7?jX;,%~Ž\w23Uk ;&b2MJ}; A"J~쥟'S-C{JqUzLA_;( zuAv{b.(X0d?K{Jjx5 VxЕa)\ sR*IfFm?ƃ@JuGJ.M=8gW930kj͌sww&,&vv !A?`rClrˏd2O~,h4QMڌLm[V{.\Cͨtoiyvh^81KRb`ļ$$XUyp[Tɍ?c/E'HN,;S=;򲢮Ev?,,|R$,&_dML9񰌝ܒ`0DBlj;x)=Xx\<Ĩ΍,; /pQ)10 R]TQ$AL&y*sc4tWw>e24;Wa*v NÎcNg¢b0F/_Bf0vMJefRJ QTzp&b[O?zŢ*衟Bvqz%gؠPZ衩r&UЃ Na^?+`>*&`CLQ .]x8gSAEјH^0X(QwGsRP%)9ء)pCh:N+;eGYX,'pD/y;I) z;2LL}urˣ2GCQTTS&N#gWzDu>lqc$*ߍV/Mn^,nȨTX _S";<<%bU?# Z&G /RNG4toe.8HQ^xaLx;Y>[MJ A|;H ~nMLAJKK`n֡L:[@+zXj7:@nqèT4bN<7^(m*8J3/l"׬p}+20}if>! FBT^^+ ߨTW*i;]vPw'yHzzD&=vƍu>'|zFavRzpck z@&-6k#c=I_"B"5k*10:;<8K40?D'Q4*,Qw)Q<;%a-]srء`ǝ|2 =ś@ Q^^y啣2Y`/Y; A"J<|B~b[>$Mnd555)zГMšt zd@ z衭v&U,ui}z2>.b`7?n\x" ƨT,S/JQB_30巶 }ohIp,6|K+Q$;V,a ATa$T XKC[#=hWvWdh)\ƃDdϊMdw?a A@'Aqsy!EVzs|t[1#OpDQ KwJ4B`T'_-8F'tU' ԓCԹ" M@4v4a* Ψ4A2?‡F'1;FϺ/Ad,QZou]seaYI) zxmbw!q|0=,/Gh>j]\^ӝtpY¬`}j]-Ce硾s(wΡ|TEZe);Ks ءc:Î3%;h ( җ;vBg9ExADB B $З\"V`5cgCW;;ŽSI?vu1㯜ʵj͛TƌuϊMd4)%ADy{\-=˃d4 ѸLSh9= CwckĐhy<10u2's_ ДpWi 5١[k9p8%]wpڒ MW011Qa25hZW;ĦH%!toE;ˇ9);;ŽE~dT0`wE`Ǘe%&$HGYp7QL۷g扨}\z9spZovdōM%˚м3GeFlÎ < ˋ[[ S|3338FFF088>l"JE݇5n};$)ni;s,]/% Kb4=Sˢr[Y;H C- AǏe2O_X,MTJ@4Ѓ[Anqqld&ȗ~ ś`U я,!!VPt$&a}4GmŘ>:׊Ţկ~?~ i" 1)%A"ơ'?@MnC{@ǟE JAnl-= .ulm$OpAJEjJ ]T+v;B`T*n`Y6Qցw`6a4_A}Y0Ovo_֭I};B]]SZXL`` vL;ŽSI;Z뵨\+4M!7/aG '$b xbr =>!}\O̙3hhX'ddm =ck|[+:%R2;-b`J+CY%_+.츺3`%UjCP=j5Zn0W_VB"u_oC_q 2)T+KPq,8l> t!Ln0vpY4a%gN*6Eh=;z':h h]._dس#n`ǽ?ADkr˿'AǕ+We֣d OL::VY*YlVø|ڀ)sSnAcmL0RKkfZzm])>օ>"#Uikc,i!ѩ~~9R*óWw7V^r50½'A8Sq:J䯆N u =) (HP2f"Ki ˗CS0Tz%5(SaURR}.SN] teJS`-]KrXJW\0xtEL&cga2 N)vtq%hbt^ ʠB]x,x;vv,1)%ADXqb;l|-?d]z/ =hʂh:=`$Kzhk6 C\XY3ӰC@:p-]C#=,?Z.KQDkׁ[\;~ ϛ"pu;@kGI'B{.Az,AttKh֤b5+#^k @MJx> ?ŀ<9fj2#vpkukN^v&;R sR B{> R1rנLZBu?.c$Ev;W !vU]l9mT;<ءqgvCᚧzܸqE=' 2 "=>'= uhQ.d֞JÝyn53Gy zL+C[craυ=vG]TwزejzV!;*VD찭k{v4XLw ܩU kRX (LA0O *6smc0JaG E/Mf*K]amrvgmX:_ǝ寋"L<k7<츟;,;>' YH 1kl^B:Ao @dhX4Mh>jyPZ\obzXsBQ.omJ x>&o@FC*}v_:@`ߩe.VI,Mb9f*+;"{k`__9$>hbMe"{「OAHzAqBy㣏>*Rf=zwx5œ'_i.R5i8lq+xԬay>M9ƣ*#a5 J;61zLdJP*T _XfF3V+FFFՅ^71tfFĹ.Nқa?uKuL^;MMM }x='ෲ̑,$Hgy ">/GEtۄ'xaf:33 j%sزFcTFV9M)O"咁Qi`zm,`f@?\¥C@-YU.-.=] j"`zz===f`G?0z1c* h `F2j`G$sV?T_ō_p_$c .XV5KY2 Q=z̙3gn[[[U*p03u"dfǬGV-܁ UKȨ49r>Wt%DfDž(2*vo Sg}C e+]mS{p-.+ m흋-JGOE__0<Lh;233z̪ť2^.2N-gT>C#l +10*Z~z4Y=|h \ ,cb||SSSP՘vzia)YcBRVUt1*uc ^:up|.F닉0}K?.z ;> gI K-C^`ddnvT,UA_[vhzn˷,Q;yv A@L4l^; zwfz̺EFYLJzp-.Zk-uZ\6+[l*@ ?Qy@5=vIv\wX=hOqbTdP:>\<Nu.~ MXcҁA|X: rt{tnԬ>EWi_1`6@QVW6a/׏BWspC ppJr89=:܂))>ts}aTu8۹LSrZXO[X~mΝ;̃vpg1$HD?ǿ=>z| ~'-:6:zJ6|=Y#Ʈ?/"4֛Se z$CL43K]):tTL?#ti]H1< 9A ҄wCFCLL&闾}}}AF\KK@XQ2& 0B =,0T$Ȫ=JZQ>iBFuU h!hE20Uf<)-OsZ`˒tI Ѝ>A `۔'C`08hA$7g1[jޟHY@1); Y;WhX1U8,h),ǖ4S{w;({}=r# zD>3go.0X`KoA&0X`,? .4Ņ34uV{[\$Pè.Mڣ} ".f󖇽 U00`TA-6y? QA cB*9m c&ɖfƽp#dù.'7*Pª:1^8_s1p* [XbZ[[kyNn`W`DA 1=d2ܗ_~*6͙}gc0o1c,]: q:ۥ£iJHJA@|߸}}a|+K( LUoKb৳:Kk{,-V+><&D%RCȏX 1g3{2I` K z#2Rv Ai@owGYYPe23-.g}j, =Q{pdY:i]ܻBh`F*!40Un^pcM+RvV;t b ^iΊ (r\FHI˔јSuX*U1c(o1BtZh?UGtXct4m|V&ovRA $z|=/ӟl6c[|2 'p-gv?7L#Pã n^.,zTvpE[7ND Nc"/IHJ@aBաR1X@8^ Xu1;ZmU`_" $=>S{=uwGFFA Vq tdGߙNr=hEK@ץŨQC,~(,w.]?eUjxc`z@PJrWmQ#^j~KLP7t |٠+f<{A;~=2E:<):RT޾"4U1BY h;#1x{?pM'qSv ADA  z|=~n0?җr,nvt-CӋsd}R{X>5+Y=$TyxTe wzCTfa30 ³ZUf3+jTu`;kH5ז::YUGKtL#-1 ;:;;/| _X c:~"8f;>I` $HD7*+_zpf?f7_~6fhzh~= jɍ `/7jӣvEͽ)4*]N@F8 Lq^O,Qg1;a`]EµmYZ ŕhubGU+Jf/sД5Y}"}evsRgq?{ W;H A"|=>z|]-&7q\4Mbq6}qhzqY1C+0 =a4KN}Qazϳ]k%BnJ39Ӂ;nobv$. ܚzU;{Hd)U*@֢f8U ,f68'vL:h֗;u$x"v A|A_A{<@=3[ XLnV3F.N=j<js ѩ勀|)1* 'ngxbv LtM}1Lgz9rTGx+NMJ+4j,wQup+Vu8U;A[1 ;f>p9;{x "߽;$HǗfij1h=a|/jڃ55=R7Kis:__hf dg34QiY 0s8k֭-]Of"דZF5$/ܾi,_ա«CH!Bv9VSh4]YYYe?`Ϡb`$!/v ADlBo 7[VkI[S+2֝cU75.)jVF-勀kۄY^!py.>apM]ͪ {"#Fn&2xԭ᪴bMI}`@{UlEx%2oA z =8_>xp\89s<~"phTh}i[$)'PaT*a36YԃJ_BJæX4v4>}83Cu#oWKiIDAT >pv/{h_dJWuLiR 5wu|} wسN  $p =>=83Sg!6e˗BӴ9V7nʬðr^xܣڃjO#l#ͥ*]$D?J3 &߁Guv{}ʴ!z#V'wE߮p׾br,_zoeP,i̻I,Y!q7$H A'y}2 aK/X,ӱBq m =z|SSN!fjosLs!|(c~ %bXē_wUgIz4v\a.^yi `Aݑ5cȨ1ݯ=#zŀ+b+|SRN7%:zETG@r1Ufy^&'srqeX A B=isלǷek5kVX)ê}h~q4m3jS sz!.%:q+xa<&0]ui"4eЖ'B[}E" Q2fR+aQ$ªHU(> qK\rqhRnt]aN ?(y]q˖1JwY֓ d^<L,(aLU>h˽*aW3\ Gqy{WeNj!W8힁Dž\{ 0A+2!\;Rͺ{WdΟ#^}HtjinsT~rf)c`tIxc疠?o1z,Bit9>Gz,'xYoB$oΆv-$H !]oF!y'qxDhhhxi Q{EWG#Φ*=f#_+`GW%⁏=-ߪ@\);8 H]GA7Î@/] hG ~r@Ϻ4]욥L,:´%_":*#Vty ;P&bsQut:k2ct4m}7[X&{`E`ǧx A؃s/&L\\L_|}e*nADpV{]dS{\tvQ.bUl624m.Y&~YSv{ci7*_xNrqZ 2j/pi'ES2t}"xh[ E&4"+ke t8pA):k_dAy5UE}N_Yo&8gU$H ! ȱBf @YYYju{4W^@KmjO`S6HzˇU;0.L\ \zL#@"TУq+h|90I3.f =CV?.f4%>b"{yfo8::O.@;O!jjM 7ͅ6gƦ4W\ ܩ~TĨ4*vqy "w_;M@E ߾ Ϻw=z,5׆>\"qV+6Sң 0q59а~);:_IyCl $H oB=&|Y懙Ir<(#~&v)ͅ?eosqp66eM5e /J]'IUصʼSqDs}!""+³FՑx[̈(: I}:cfgxCl }B#cjg̏uL={կߑv/o AȀ=&'zp-.L禧OLL4cc6=̕ Ʀ]u@IcvЕ nFu Vv~tY ȪUre־bOE~z8Q;*!>W0p\ؘ(555Mޯ|\:Mbv$H !]=[+ffz_~ >ry@cZh;wf#/Y-Xµ,Yu)ۀъ ؈L*rʅ:35S2WnA M0nn3u`k=u傾 t}.96wVYKO<4KۂU.p+eFX>D{(#n]Pfnq~_M01{ *fMTB]IE&*s0V0RC%0X}k[Yĝh;'|r5&^>`ء _BׯÛI,ތvsR$H2O"CllEfb7>X,Zrv`_1|7h:Svf52y>mc|L+rmC>m=rAm|md%f N!_M~ojFR^NCaDžo@;%LE[托vJn볭u@UMBόZV:r;/ʶshDۙh9 M'1XKX jr@)VNPZ&L&;sΟ;K` $HDZ_L|=޽;[tc=LwS|tetgp-H1 |X7.MLv1oJYv@*!B5 @^%HVo7sx}%"nZ9~^="R'1p#e0XŌ;? ]נt0a}`tn۶-K2[_&;Y$H 'ዙ}22G_dG9q.HNzDӉ4^eks:2PksaǸ|0@mM.t6ͼVWAGqA`,-_pߍ c!+VH&ݸ遗ND06iЪSw~IK-ς>SkAޛUy睙w;f:0<ZZ:@K!$dq PJ :S,qȻ'!NHX/xmي7ICή#Y/H>ߟ?=y~9APh∎Kr2]@-#g&t{2}2Bv"2S^=F˲ln-8w"M{pŇ/>t^:_'vg.P~dD 3n!3w%q{EJE':EGkƊ !QKuOnxpj}aF3Gu[N #֪-3\qy7f\ZMT{`~bpŇS=&f? _Q`p~_N Ȏd́doGid)1]B"Ҳ#wIy FH%'$U?T/!WH*1>E}pn׽ꫫ`WX)'ı0̥G8'zǭL _zˑ;ch@ae1,S!Tl*$>Ot.#T•ޢ:S/[0S=OtLw,(0ҿmh,Ȋ8t L=Iz_o]b)nB_T*"ebY:Dt;:DTôwuWBd?&xE•r}rR=Oba"="uPC/=inwaߌBTrVߣ|{pG-6">gNo-~+5y ="tvvVȜhBvOpDECpeԨQ.^BDܒh!bS]7ol%ljgn῿H@Nbؼ3!(RєG=l8J|t|AFt>7xAQGG"THZm.^$gW nDrF1禛n(_aˎۘu@Ĥ2Snrt?maIII/96ܛ\FiOH%>O[ Q`6 #8H~W_#W,;c aΤ5]Etو-.Єg)]ÉDnǾxsp}!!J.|`_!'#&: IS|7batݻw]aKjE鑳b!&;I!;#jeri=z=dW\L|)ңT{ekXt(H$ɗ&b}7xcppKy?+atw,P-<)VY*$MtyAVD.(sjAYqh<ҶYDۥE[ ?D_ kuEY!aڳʋpC bv̙m+,~o2C*ՁXĄPSfrt~2bĈ_~vep"[ls.Zܴr} Oyof=x+FɆp -V*R\Qv,Q@ixmҿvS;wEEԧ;~t/ziDkyth{#g }6O;h;$/:N^6@;}#FfWXsˈׁXDTzD̔J[ncK/˄ qȸc.G92DΓoR|qz#AU"ɀ-*ĦπP#;NNQ"*tO"6)ąҥ J%޲zE-g{DNޏ˲D NBs+:'_d]9!%:X l^{m- ?qKnE]z{\?3?bz(]q =nBS/'%>Nj=ʷϓ )K~9rm㛨FU >S]7x[WjX! Ea_#)ŲS+IDDMgTrP`9ݑGn5u<`+ ?]&rm$4eI d8{A/09?'0᭰u +'aʎHpLQ^fѵw0o{Ya=OZO}HF͢Gk ^C]^&g^1D|pS`#Oa"y W`%y V]QX #kUȎeaDv:;Cc`Zّ8lt%C9ACQŗ݄ Le&cQk76b hOdMP;J%~zG䤦z_pU{4$:\.9Nr],DtxeG8]?ϩeI,i>5l&W7lSBMM͉{7N"q#Ou2}{i8jW\ M0{t:Q&>EeIGa Hm/ŀ<2u{Y=MU.L$w*r I}x V`d>'D)Lw,/y3D\x·Pț[O.9i]HUi tR__Qog3xEPtt{:rDG35Ej:F67 J>]9bR=VXׁrRJ={=?o]ˊ˭ oLaa:u,%n{t˨1YjYO-yKCI&r^CDhsSUo7 /< >Q*y }{tO&6ch) R7/ ux yNm"ϗCNg_r8Gs|SPCLt=OM91YK^&):'gW >r~֬YsywOI*]aJu(]a([aA9)A!=P3Fx%$QTTvq \|+Q PCԘ5嬧P~xCד \GPpbк>}jD{TJQ`PvWjQ]/ݔ3 BCtVdGvד5i {86Ht&gA"y?k5$n'N6l'DG AÒ5DGsԐ,ڴDթѣGKup*&Q1򅦿I7 <?i,>v.uTd<%(>ß+|/?QP~ DB"x YiӉ|lɡlM]]]D6CHtdR=O#7z?-9=%񔦂IWvItAn&6vdt%@nDT&DxHu\?!qҊl'9zŅO +[{:::, ssԘCOSuHYKgΝ;_&ա|ZXaA9)A!=ć^W\n}`.4M{\2u;JU=$>LiOć?!%>D]^&Gj& X\yK _YeRRn0~D'DKDMx)DGk"ob= W +IsE=7yɼce;L---D2'DGutqU ,jHu(-&cEI_U^ MŎL{iR]q3R.B~Yn9C.!+/t%1D5UQtO/ވޗɝE.%Ʒ躲6#φ MdijJꨶh踖4]CǍQ 444"(?V,8/0͚7eGz'K jXAmV5+/N_[#NV9# .<؂ĦU\V@ѱ;3[9J3\xqHI¯BA!T H!v^kXAmE#a4<>xz/^r뭷NR#VX ;ĄУCˊ?>I{v%---+Sl烿=֖/?2QdI_NԚBUC{Gе`Q16ǀ廒W0901'6a"9s"c7)ٮFQɡCi+9-S I=V֘J daZ_~@~?oEb}:VK=#lq+>}m5\.y.Rsrj:,D|pSW^bG~P7ɘ;£`>y"SEZ+vp&d.R٥ *XSU%9982{D{ڊ1e-5A}m&|SJ^XX#HC ^GBvp1+.~/qSi{E>"BVW\v| S:jHYJ|`K}ȝU~Gݪ T"|q,cHx#JK%_LITDaTT:#} 8G ;jD!C ɡ~eE0qژꓗPa:3T:ZA.@dMM͉'D7qoqJI҃?<0/2H# Ì裏^(5yݥ15*(9I}/ޔK%+/R}rC4kR~ׄ/ bJzYsFIK&`ˎ܅y [`9 1n(k nwگ)WV$DG%TJy*ݷj^#z V9ƻ^AT/}(wE(ՁBS-iȤ=DKMO>vq˦cZ'ޅTo1[H~W^>n*W_ WD^B_l-? L@"rd'lU~_Կ"p!YOk&E.N'ߤIrH$ڞET}4Gud9N[[ŋ)7|DFx}E.Hbz dڃ+>=>=6 >LXslɩ_~T*w- TwQhHY}(]{ 9E u-Q0(g}}z~:t L)g sH?]Q/9{%%Ck/_t4, {iBܵ*/Hk6۟p(+3f̘WGwMua;0Ձ>+.bcВxw0?>aĽ\JNr}L]Kɫɸ3;ST{L}H}#? W~-\IT&q>[0PǞ#vewehR,0_2x2Κ d_W+C%T/\/9|øc>L4ɿP[_QSJTbR-L{9r\aa.vk1QnGRT3!ǻR`E>Oe/A/Ɯy= cOx D&Vb m̡''D+:aW~T04|Gi8i\6o޼j/6[,>;BCԭ՗b ,U-\@b S0?& ]'+E7e ᱌(sZL%8Gf S̜B)UGU N줎joo'kWC/9;˒SCFWGZ߽kkJRB+.J M՜r#'q3'~q;- a/5]s1bĘ0o TJ\yO W"|=p,%W|xS 0l S:7 3_#P9opfNYqΌ#wTrgN%WTr-LqOVᗎ# 9ڨZ[[B-YO+++Sm:긜I%33#FHùwo/%ˎ[9ǜR? #q =V\b5! W||\.cG;]?SPɶ}ZQjV_/N>t4&5.X@…. p?;ђ M#gQDTL/KqQ_(.C\@piJ}|V8䎏=BJjk4y%B---DfO~JrlKU{nB4xbm6':d__TH{P#Rk.7.h4,~h]o Oɴw>4Qreԛ(0Άє.nLE*XHBw ~SLyY Z.{p&QA,;|)[`Jd;s/,88F}{3YDSr'/~H T__Ou$P(]k5?Ze,6LM?fVD^C,I.\!qǘ/ohh8}KƝ BNn5cK葷+Ȟ[D}׎t:>B΂E*M"r_K%ǟGX)$׉^Jth栗/y_ȍ)r_ppWTB^=#;id^&•Jjjj*ɴe(6;9䨿7(cX.+LpO1Tw}ETHhBvPP+==Zs;%߃a1;vxnrd>KWɸ#AT~(9EKc u,$[B.wzzz_~t6P_"_X ~  $AW`JśϹ+jㆈH5m%<In7S dK#{TOSɖ1S0XU9YEteT[UWWd"DTQQAoK 1wdR"fۻw|!3FH:`ेkH{ղK^#cȑ u:VJp_&?v-T,?/?V_άǩ#kuf/ԕ+?'f#9\K H " " B (H$rğK۽;Ì!#;;;˦6U#7 z䊊K.tMqaX$•N3%Gy9Qii)9VXHzntOǽѡ)ftGChEa_2… Plk/ UbXNmzjZ@^@ Wl6vp8~Ӑ! A'A] b_*)B [@ĺW?gMAltb3 =aLlA( BRrC*Hoh=5Ƒ5e %Ǒ%Gs' zJKKF#566ݎrl_޻+':}v tJRXab8*TGydw}xzq_xʕ;CC0Z%c>Y2S!X ^q):;;+@O b+@%T2P+B(og'm}Ɲ;ȟ7@ؓˉ-\N߿SlQMmOLKn F8= 8Ӻ L}%u`tjBؙ@NWܳj 9bh4L:u61+5# ʹ\GG-~O&a̝;wD>z@RE>kɫtZ} N,s|`.5y+?,FV:::+@Z3wi L }*%T+BO\bsp& 2D'!B_EI8>K chL\ pE=KȓؐԆR!ԽBZ_r4DM{&y$j38'%GyTHmşt.txB_>DG*IufaP{5|7<~bcŊ M&a"Q1頮BjIKuɳ.y6է̦sCȡTOZ[[- @} +@$T +AB:Awb '}ysff`2DLxGJ:$["̩C[v&e=HYBr/8:ӤVT =~靚q!)Uʒ>9~s܎[{CCÙu-aB I` IN~" !NG4\MQaƼKpmlW_<2I=3z_ե?M$o1j-_!)_tSjDGKI 1ڎUN_|<1𸩧ZOKRicT fP$mTSMM Q}}}@4f?r(2D]B}iy?~!!)#Ixƒ;{~IOl֔x*+J"0+ <ƼCNd w8 W`9sRC[ne􊊔H򿎦򿎦ҏҏqԜuNv 0EGirrP[H$!Q =^CCM~ŦGre;u?棯i<*6MX|{L&L&ʏ;a`!uN` /ADɘGfSԗ?΃ޑ"δYRz ˲?~Arhv葦LaE|S !%1 p Dr&R_'9Il%7yohzaG8j8:.':Pr 'r=N_gFQz`=ZsWEi:KD/jvj0#_***ⱐ VdHbrΦӛƙ%qZHrvrv,3Hx⽝HpF 'Е=[8@deMO~8VRO VlhJS tV7%:rJq#ңfq 0HiRSk.z{w1G 1qu4Rtj,o*--r1Sžk{ŋPR j$Z—!""{88Õ!RB/E\Ut$IΦ+L/G si-vI 0.Cho)4L%W!%2d_h윱${AFl#7 kID;8'c>u1z=8XE_CtDȊa[jW]4 nyq餎jll*-N;qo f 3L{S?{%Hm,KMi807MӒ1/0Ckf]Z@׳8"$:s!]lN3ޱ IQoo/Nu[$LS_洐q L_S6Z>AAhfPoJ-\śĐ)X4ƖȞly+ӝԕ>_l#-.0s7)ԖdLd?M{'Q^;L~5jwzwLIcɔ4R1Tu ?M埌2@Hp@tȉ[8R+Zz:"]JT0G$bZ\*6ZG-n@墎]K^DeRߔJI0 rm_ 1mKʐv \D)3]ӝ*,DRĞmp8zzzQ?$sW :?+, R"CLf řΜ^A AR]@j {'_nܨ:? hcz j{.$wW3`?lssy ~ZW" CN#RSZsQRlk9CޖRjr=s$+@)1 OJ4DH I k]?ړ#:ŤH\K6-0v#sȖ1lޮqCl+8mqd˘J/2dF@h=Yɚ ˨-%N@j(Kl6vMJPzzOd7 ݇7l6[o=Atucf RZᖚDʕ+z<^'=܎v*?Lߢǩ| UD, "$B!2$#,{gM"ɳbuvv+0u0!81>ӧWPxA #L#ػ r"/3Fjˡi=0STj%6?qm8UrTw-u*|Y3<#:~PZH1ZKI >tM{h=EKB#..nŋS\.W7nלg?'%A*wH4P"Dh5& CgSӮԲ{f`,{x"mP[[+j%JNmjy*X H GMʃ('ס#kq ˂%.* 7!0Ćlr㓱Toy"gk~m/++˝5k|?r>}cJM{#>~xa1w}mF_z:Vuڊ?rϜ@IgR՞x272ϢflMMu)s.eէ&e.5N;c9#0MeLjI]L:#Y,immeoXSSđ5;L vH6G#M?N_|cyH*ChZ2Ҡ1Oo,qT{"HuSszwmOqdJGUIrX6*z1TɘOԘN*ю_alxb<0':቎_3rGFCk)) =–zQlx'>Fz뭓bpk=\;Al3QWIz3$ӾyAB"/C"DPM5[Q]c? }Bd 2_fs455QSS5/F<,2rs]@>p(y>N)Ԓ6OʌH]ٿjċJ K )atGy/Q%ySv{ݱcǶ|͓Ȉ_hzF{}~hLj#n߾}H[ۀ8娗ө[T!b2jO<=FOI]t*UoF[Q gj? >0 aoB Bid";jBF*8Ic |Q+4|S!U_H- ^OUIC\Qɘ Qh6SPRkDۉ_8@Dޣe_1b ’jJMR|kǯx{ha<3rY7q_ kT֛ 9=hE/B;fTTqdJ^C 2Ld2ڵkT]]kר3rd45-BQkb`? {YIKqsM!+2Bdo, T;*vq<*6ETj?G{fQád='.+ gk䪯tƍwm+:∎ :GO@PCMCM_|Ӌ(Hk;fz%/$TAS$*d&{h4REEE`*++ň/%b6-6qmJjvO 2@`$BG)!hdA!(38Scn?Isɸk>UAi˩ejq@9N R'L0#:\0E-t ]G\*6C|_|02=|0oƉmZ[t咫AB+'L&F*--*--/r^1?@OQTlXOG$3׶ _D{?]+Z/:! "$inK d8զ?MMy5uՌ76oɌp)_t+ :R!:MRH +ć5H{DK|.#>a2 3 eMP_o٫QlZ 6 T UNIX*S*=Ɣ%!a"4|(|,˿%OQe$>3_ skz~!J QMz\xHlٲe=0e>ϱ;}mRFBtD+U|GG4OUӧ=wna<P9tz͗~s.ڿIOOmE9yjafȑ#o߾}cCC"B nyg#Jζ*k)'G헁SwYA\=DKNC!vv_K99U[Wb\2 o5jxPspEm*D=Dx#=J{-6)-8|#v%W^p\.++MLL\„9k+őbzU%G̪)$EOлTQZ .Zwy#?ef7<`0mX.`HYUTT> =mElm/"勎|~鹺г1)>! !0̘7&\.|-,++yW1i%k+RrA":#}m$ŇS~ꃿM}>nɯ744 /0(X,K 9%ń9a{~Bt%} w页CKi$Q >z>Ԭ>f͚5xfmv{ R Ìe9VRtsڞĴ.ሏJ]JN Ì{UVVq8?bm9iĈ|ُ2Bpr\!v@t#":uԇغ`㮻ZXXgjAA{?OuB%Z9Ԉ2SEW0Ň~j{>]~JRb'ffEoZf]p!uڵKGГVĎJ#҉@|İPSpo+/~ FC0̸ 6$;wnj-%"BbVw *HpVVne9"hY!.>^P&W~HJ}ǤIpXeMQQчsI 1b++z904Ň=ZNwQкZ}5jno.@WUZ*r dhI4WrWt/h|hP)`8/mmmWXu+@G_[[/r/aUjOZ#͡g)DćP4=Eʋ^~xX};&%%mzjFgggPhߗ]}af)S +++ꨯE-dSrއ$=L*RHh9 : >1T| V!"1bĸwO={vGKK%e{UaٳgkNTKq%XCkC|To-wW|h9E˺ԇ /R+/zQZV_?eFo>Y\\ Ս =<b\pBjRR&NF{/9I!9垲"%!WBfm%"Ra(>CCCT/!&@ we 0coᆉ6lH,** م >nb\:w-[p7N0S1*B}zIdS##pV^•r/wKnK9rW_}uS> * @t:gN:/zĈU ))qxTOɡW7D#%+/ђWD~M 0_zjj-x<} @T76HAA{6lH8~Έ8nOEJrE":Hs]G$]"E~Hu~H"G8fԨQ56p.7f7n߿!V2VpHwqȭh=]E{ei0hG8<CMCvpKPaxk0 Ì:uW\9Vɍo/_|099yԩS2 #Wp(KqĚ&>!itE,K$H|||BRRҦmHПܸpB`x{Æ "r/8fBOQ*8k*b]ZVUbaN}E~(9VkCH\;# w-[ U,:U 16 .&''>iҤ9<1FJoT#8~\Vr ʊ4D0NCʋ1[/b>F:V'mذ!`0}=rTel6sʕCOyS'7)b %0?|1ВCNt[iȏG4Sѐzh w{e)9 !c"dժUK_Rl\z5'6Rb rCJpT7šTrHɡ# ,w#T#՗p_  JYr7O^~Ϝ9d4󛛛u8fez4J 0777_4gΜٶo߾ׯ_o, 6Rbk)br> ?gBKFz ~C/9~(䈤Tk+ CG,5Jz%@LB rŨjDXaƏ5jڵkڵ뷟_KJJf6k=6뒒'Ou׮]]zQFMH % Ԇ\rCMzCh=E௩hMqYUQ"9r #CI/r(Y}!TIHIui"DH<* CBd0ĭZjiRRҦϟ?bp8YuA ބvvvVQVV{=7|#Fg5b?rC,CJp2T$G$`G凒^~~hI ! "sB "!/)#BR!BQ!2r zS>oӪ566~mZ{zzZXb^*pXƯ^p!ԩS y #GxZx@Fl(YKJZܚ>p%h9 :@̈H-?Nh] \ # "$B!JdX2DLIaf]w5mK{)))o?~'dL"|JWW׵erGKgg絶+fd**))>|rQQG)))o{W^""CxP#57Un(Mo J8RJ%* Sr fCOCMCO&"$A z2!"%EĈ >bŊ%7o^u֗~⤳g|+WdVVV.l6X,:::*:;;vp4stv\n˲lt:;=n訰X,f/*++\rpgϞS\\TTTavv;iiiغuK7o^bŊ%=L5\11F:?@f(BR?%3F~-'t1z )*bI-Z%`HˏpS ?DJȥ@Ē b w!jdW'ˮD3J䈘$y1FbfȌЈyK1yBHJb<,dP"6-7Ԭ(jSH(? Q+AaAD "?aWeWH $\YTRDZɋ_\3pFFjhbk)J@ H8 9C՗p_$4T"D Q*D#B+J"5wˌҟ~P^I !Tf&:*5ĆXjC/dTTc$DnJ~"&@t(Ih !B2DQ#E䈜 {d~qC]ĐJGl6R䆒Z5hJ9C.uEQ*Aʉ2DQ+F!Y"&MHJm*$ƿK>`=dHPq 6@DI W1s ; +dWG"dIX|.H ` ʤ%tEXtdate:create2018-12-15T21:55:18+00:00{f%tEXtdate:modify2018-12-15T21:55:18+00:00 FIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/old-logo.svg0000644000175100001710000014174700000000000015736 0ustar00runnerdocker aiohttp-icon Created with Sketch. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/powered_by.rst0000644000175100001710000000330400000000000016354 0ustar00runnerdocker.. _aiohttp-powered-by: Powered by aiohttp ================== Web sites powered by aiohttp. Feel free to fork documentation on github, add a link to your site and make a Pull Request! * `Farmer Business Network `_ * `Home Assistant `_ * `KeepSafe `_ * `Skyscanner Hotels `_ * `Ocean S.A. `_ * `GNS3 `_ * `TutorCruncher socket `_ * `Morpheus messaging microservice `_ * `Eyepea - Custom telephony solutions `_ * `ALLOcloud - Telephony in the cloud `_ * `helpmanual - comprehensive help and man page database `_ * `bedevere `_ - CPython's GitHub bot, helps maintain and identify issues with a CPython pull request. * `miss-islington `_ - CPython's GitHub bot, backports and merge CPython's pull requests * `noa technologies - Bike-sharing management platform `_ - SSE endpoint, pushes real time updates of bikes location. * `Wargaming: World of Tanks `_ * `Yandex `_ * `Rambler `_ * `Escargot `_ - Chat server * `Prom.ua `_ - Online trading platform * `globo.com `_ - (some parts) Brazilian largest media portal * `Glose `_ - Social reader for E-Books * `Emoji Generator `_ - Text icon generator ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/spelling_wordlist.txt0000644000175100001710000000600000000000000017764 0ustar00runnerdockerabc addons aiodns aioes aiohttp aiohttpdemo aiohttp’s aiopg alives api api’s app app’s apps arg Arsenic async asyncio auth autocalculated autodetection autoformatter autoformatters autogenerates autogeneration awaitable backend backends backport Backport Backporting backports BaseEventLoop basename BasicAuth BodyPartReader boolean botocore brotli brotlipy bugfix Bugfixes builtin BytesIO callables cancelled canonicalization canonicalize cchardet cChardet ceil Changelog chardet Chardet charset charsetdetect chunked chunking CIMultiDict ClientSession cls cmd codec Codings committer committers config Config configs conjunction contextmanager CookieJar coroutine Coroutine coroutines cpu CPython css ctor Ctrl cython Cython Cythonize cythonized de deduplicate # de-facto: deprecations DER dev Dev dict Dict Discord django Django dns DNSResolver docstring docstrings Dup elasticsearch encodings env environ eof epoll etag ETag expirations Facebook facto fallback fallbacks filename finalizers formatter formatters frontend getall gethostbyname github google gunicorn gunicorn’s gzipped hackish highlevel hostnames HTTPException HttpProcessingError httpretty https impl incapsulates Indices infos initializer inline intaking io ip IP ipdb ipv IPv ish isort iterable iterables javascript Jinja json keepalive keepalived keepalives keepaliving kib KiB kwarg latin lifecycle linux localhost Locator login lookup lookups lossless lowercased Mako manylinux metadata microservice middleware middlewares miltidict misbehaviors misformed Mixcloud Mongo Mongo msg MsgType multi multidict multidict’s multidicts Multidicts multipart Multipart mypy Nagle Nagle’s namedtuple nameservers namespace netrc nginx Nginx Nikolay noop normalizer nowait OAuth Online optimizations os outcoming Overridable Paolini param params parsers pathlib peername performant pickleable ping pipelining plugable plugin poller pong Postgres pre preloaded proactor programmatically proxied PRs pubsub Punycode py pydantic pyenv pyflakes pytest Pytest Quickstart quote’s readonly readpayload rebase redirections Redis refactor refactored refactoring referenceable regex regexps regexs reloader renderer renderers repo repr repr’s RequestContextManager request’s Request’s requote requoting resolvehost resolvers reusage reuseconn Runit runtime runtimes sa Satisfiable schemas sendfile serializable serializer shourtcuts skipuntil Skyscanner SocketSocketTransport softwares ssl SSLContext startup subapplication subclasses subdirectory submodules subpackage subprotocol subprotocols subtype supervisord Supervisord Svetlov symlink symlinks syscall syscalls Systemd tarball TCP teardown Teardown TestClient Testsuite Tf timestamps TLS toolbar toplevel towncrier tp tuples UI un unawaited unclosed unhandled unicode unittest Unittest unix unsets unstripped uppercased upstr url urldispatcher urlencoded url’s urls utf utils uvloop uWSGI vcvarsall waituntil wakeup wakeups webapp websocket websocket’s websockets Websockets wildcard Workflow ws wsgi WSMessage WSMsgType wss www xxx yarl ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/streams.rst0000644000175100001710000001176700000000000015707 0ustar00runnerdocker.. _aiohttp-streams: Streaming API ============= .. currentmodule:: aiohttp ``aiohttp`` uses streams for retrieving *BODIES*: :attr:`aiohttp.web.BaseRequest.content` and :attr:`aiohttp.ClientResponse.content` are properties with stream API. .. class:: StreamReader The reader from incoming stream. User should never instantiate streams manually but use existing :attr:`aiohttp.web.BaseRequest.content` and :attr:`aiohttp.ClientResponse.content` properties for accessing raw BODY data. Reading Methods --------------- .. comethod:: StreamReader.read(n=-1) Read up to *n* bytes. If *n* is not provided, or set to ``-1``, read until EOF and return all read bytes. If the EOF was received and the internal buffer is empty, return an empty bytes object. :param int n: how many bytes to read, ``-1`` for the whole stream. :return bytes: the given data .. comethod:: StreamReader.readany() Read next data portion for the stream. Returns immediately if internal buffer has a data. :return bytes: the given data .. comethod:: StreamReader.readexactly(n) Read exactly *n* bytes. Raise an :exc:`asyncio.IncompleteReadError` if the end of the stream is reached before *n* can be read, the :attr:`asyncio.IncompleteReadError.partial` attribute of the exception contains the partial read bytes. :param int n: how many bytes to read. :return bytes: the given data .. comethod:: StreamReader.readline() Read one line, where “line” is a sequence of bytes ending with ``\n``. If EOF is received, and ``\n`` was not found, the method will return the partial read bytes. If the EOF was received and the internal buffer is empty, return an empty bytes object. :return bytes: the given line .. comethod:: StreamReader.readuntil(separator="\n") Read until separator, where `separator` is a sequence of bytes. If EOF is received, and `separator` was not found, the method will return the partial read bytes. If the EOF was received and the internal buffer is empty, return an empty bytes object. .. versionadded:: 3.8 :return bytes: the given data .. comethod:: StreamReader.readchunk() Read a chunk of data as it was received by the server. Returns a tuple of (data, end_of_HTTP_chunk). When chunked transfer encoding is used, end_of_HTTP_chunk is a :class:`bool` indicating if the end of the data corresponds to the end of a HTTP chunk, otherwise it is always ``False``. :return tuple[bytes, bool]: a chunk of data and a :class:`bool` that is ``True`` when the end of the returned chunk corresponds to the end of a HTTP chunk. Asynchronous Iteration Support ------------------------------ Stream reader supports asynchronous iteration over BODY. By default it iterates over lines:: async for line in response.content: print(line) Also there are methods for iterating over data chunks with maximum size limit and over any available data. .. comethod:: StreamReader.iter_chunked(n) :async-for: Iterates over data chunks with maximum size limit:: async for data in response.content.iter_chunked(1024): print(data) .. comethod:: StreamReader.iter_any() :async-for: Iterates over data chunks in order of intaking them into the stream:: async for data in response.content.iter_any(): print(data) .. comethod:: StreamReader.iter_chunks() :async-for: Iterates over data chunks as received from the server:: async for data, _ in response.content.iter_chunks(): print(data) If chunked transfer encoding is used, the original http chunks formatting can be retrieved by reading the second element of returned tuples:: buffer = b"" async for data, end_of_http_chunk in response.content.iter_chunks(): buffer += data if end_of_http_chunk: print(buffer) buffer = b"" Helpers ------- .. method:: StreamReader.exception() Get the exception occurred on data reading. .. method:: is_eof() Return ``True`` if EOF was reached. Internal buffer may be not empty at the moment. .. seealso:: :meth:`StreamReader.at_eof()` .. method:: StreamReader.at_eof() Return ``True`` if the buffer is empty and EOF was reached. .. method:: StreamReader.read_nowait(n=None) Returns data from internal buffer if any, empty bytes object otherwise. Raises :exc:`RuntimeError` if other coroutine is waiting for stream. :param int n: how many bytes to read, ``-1`` for the whole internal buffer. :return bytes: the given data .. method:: StreamReader.unread_data(data) Rollback reading some data from stream, inserting it to buffer head. :param bytes data: data to push back into the stream. .. warning:: The method does not wake up waiters. E.g. :meth:`~StreamReader.read()` will not be resumed. .. comethod:: wait_eof() Wait for EOF. The given data may be accessible by upcoming read calls. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/structures.rst0000644000175100001710000000234400000000000016443 0ustar00runnerdocker.. _aiohttp-structures: Common data structures ====================== .. module:: aiohttp .. currentmodule:: aiohttp Common data structures used by *aiohttp* internally. FrozenList ---------- A list-like structure which implements :class:`collections.abc.MutableSequence`. The list is *mutable* unless :meth:`FrozenList.freeze` is called, after that the list modification raises :exc:`RuntimeError`. .. class:: FrozenList(items) Construct a new *non-frozen* list from *items* iterable. The list implements all :class:`collections.abc.MutableSequence` methods plus two additional APIs. .. attribute:: frozen A read-only property, ``True`` is the list is *frozen* (modifications are forbidden). .. method:: freeze() Freeze the list. There is no way to *thaw* it back. ChainMapProxy ------------- An *immutable* version of :class:`collections.ChainMap`. Internally the proxy is a list of mappings (dictionaries), if the requested key is not present in the first mapping the second is looked up and so on. The class supports :class:`collections.abc.Mapping` interface. .. class:: ChainMapProxy(maps) Create a new chained mapping proxy from a list of mappings (*maps*). .. versionadded:: 3.2 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/testing.rst0000644000175100001710000005710500000000000015702 0ustar00runnerdocker.. module:: aiohttp.test_utils .. _aiohttp-testing: Testing ======= Testing aiohttp web servers --------------------------- aiohttp provides plugin for *pytest* making writing web server tests extremely easy, it also provides :ref:`test framework agnostic utilities ` for testing with other frameworks such as :ref:`unittest `. Before starting to write your tests, you may also be interested on reading :ref:`how to write testable services` that interact with the loop. For using pytest plugin please install pytest-aiohttp_ library: .. code-block:: shell $ pip install pytest-aiohttp If you don't want to install *pytest-aiohttp* for some reason you may insert ``pytest_plugins = 'aiohttp.pytest_plugin'`` line into ``conftest.py`` instead for the same functionality. Provisional Status ~~~~~~~~~~~~~~~~~~ The module is a **provisional**. *aiohttp* has a year and half period for removing deprecated API (:ref:`aiohttp-backward-compatibility-policy`). But for :mod:`aiohttp.test_tools` the deprecation period could be reduced. Moreover we may break *backward compatibility* without *deprecation period* for some very strong reason. The Test Client and Servers ~~~~~~~~~~~~~~~~~~~~~~~~~~~ *aiohttp* test utils provides a scaffolding for testing aiohttp-based web servers. They are consist of two parts: running test server and making HTTP requests to this server. :class:`~aiohttp.test_utils.TestServer` runs :class:`aiohttp.web.Application` based server, :class:`~aiohttp.test_utils.RawTestServer` starts :class:`aiohttp.web.Server` low level server. For performing HTTP requests to these servers you have to create a test client: :class:`~aiohttp.test_utils.TestClient` instance. The client incapsulates :class:`aiohttp.ClientSession` by providing proxy methods to the client for common operations such as *ws_connect*, *get*, *post*, etc. Pytest ~~~~~~ .. currentmodule:: pytest_aiohttp The :data:`aiohttp_client` fixture available from pytest-aiohttp_ plugin allows you to create a client to make requests to test your app. A simple would be:: from aiohttp import web async def hello(request): return web.Response(text='Hello, world') async def test_hello(aiohttp_client, loop): app = web.Application() app.router.add_get('/', hello) client = await aiohttp_client(app) resp = await client.get('/') assert resp.status == 200 text = await resp.text() assert 'Hello, world' in text It also provides access to the app instance allowing tests to check the state of the app. Tests can be made even more succinct with a fixture to create an app test client:: import pytest from aiohttp import web async def previous(request): if request.method == 'POST': request.app['value'] = (await request.post())['value'] return web.Response(body=b'thanks for the data') return web.Response( body='value: {}'.format(request.app['value']).encode('utf-8')) @pytest.fixture def cli(loop, aiohttp_client): app = web.Application() app.router.add_get('/', previous) app.router.add_post('/', previous) return loop.run_until_complete(aiohttp_client(app)) async def test_set_value(cli): resp = await cli.post('/', data={'value': 'foo'}) assert resp.status == 200 assert await resp.text() == 'thanks for the data' assert cli.server.app['value'] == 'foo' async def test_get_value(cli): cli.server.app['value'] = 'bar' resp = await cli.get('/') assert resp.status == 200 assert await resp.text() == 'value: bar' Pytest tooling has the following fixtures: .. data:: aiohttp_server(app, *, port=None, **kwargs) A fixture factory that creates :class:`~aiohttp.test_utils.TestServer`:: async def test_f(aiohttp_server): app = web.Application() # fill route table server = await aiohttp_server(app) The server will be destroyed on exit from test function. *app* is the :class:`aiohttp.web.Application` used to start server. *port* optional, port the server is run at, if not provided a random unused port is used. .. versionadded:: 3.0 *kwargs* are parameters passed to :meth:`aiohttp.web.Application.make_handler` .. versionchanged:: 3.0 .. deprecated:: 3.2 The fixture was renamed from ``test_server`` to ``aiohttp_server``. .. data:: aiohttp_client(app, server_kwargs=None, **kwargs) aiohttp_client(server, **kwargs) aiohttp_client(raw_server, **kwargs) A fixture factory that creates :class:`~aiohttp.test_utils.TestClient` for access to tested server:: async def test_f(aiohttp_client): app = web.Application() # fill route table client = await aiohttp_client(app) resp = await client.get('/') *client* and responses are cleaned up after test function finishing. The fixture accepts :class:`aiohttp.web.Application`, :class:`aiohttp.test_utils.TestServer` or :class:`aiohttp.test_utils.RawTestServer` instance. *server_kwargs* are parameters passed to the test server if an app is passed, else ignored. *kwargs* are parameters passed to :class:`aiohttp.test_utils.TestClient` constructor. .. versionchanged:: 3.0 The fixture was renamed from ``test_client`` to ``aiohttp_client``. .. data:: aiohttp_raw_server(handler, *, port=None, **kwargs) A fixture factory that creates :class:`~aiohttp.test_utils.RawTestServer` instance from given web handler.:: async def test_f(aiohttp_raw_server, aiohttp_client): async def handler(request): return web.Response(text="OK") raw_server = await aiohttp_raw_server(handler) client = await aiohttp_client(raw_server) resp = await client.get('/') *handler* should be a coroutine which accepts a request and returns response, e.g. *port* optional, port the server is run at, if not provided a random unused port is used. .. versionadded:: 3.0 .. data:: aiohttp_unused_port() Function to return an unused port number for IPv4 TCP protocol:: async def test_f(aiohttp_client, aiohttp_unused_port): port = aiohttp_unused_port() app = web.Application() # fill route table client = await aiohttp_client(app, server_kwargs={'port': port}) ... .. versionchanged:: 3.0 The fixture was renamed from ``unused_port`` to ``aiohttp_unused_port``. .. _aiohttp-testing-unittest-example: .. _aiohttp-testing-unittest-style: Unittest ~~~~~~~~ .. currentmodule:: aiohttp.test_utils To test applications with the standard library's unittest or unittest-based functionality, the AioHTTPTestCase is provided:: from aiohttp.test_utils import AioHTTPTestCase from aiohttp import web class MyAppTestCase(AioHTTPTestCase): async def get_application(self): """ Override the get_app method to return your application. """ async def hello(request): return web.Response(text='Hello, world') app = web.Application() app.router.add_get('/', hello) return app async def test_example(self): async with self.client.request("GET", "/") as resp: self.assertEqual(resp.status, 200) text = await resp.text() self.assertIn("Hello, world", text) .. class:: AioHTTPTestCase A base class to allow for unittest web applications using aiohttp. Derived from :class:`unittest.TestCase` Provides the following: .. attribute:: client an aiohttp test client, :class:`TestClient` instance. .. attribute:: server an aiohttp test server, :class:`TestServer` instance. .. versionadded:: 2.3 .. attribute:: loop The event loop in which the application and server are running. .. deprecated:: 3.5 .. attribute:: app The application returned by :meth:`~aiohttp.test_utils.AioHTTPTestCase.get_application` (:class:`aiohttp.web.Application` instance). .. comethod:: get_client() This async method can be overridden to return the :class:`TestClient` object used in the test. :return: :class:`TestClient` instance. .. versionadded:: 2.3 .. comethod:: get_server() This async method can be overridden to return the :class:`TestServer` object used in the test. :return: :class:`TestServer` instance. .. versionadded:: 2.3 .. comethod:: get_application() This async method should be overridden to return the :class:`aiohttp.web.Application` object to test. :return: :class:`aiohttp.web.Application` instance. .. comethod:: setUpAsync() This async method do nothing by default and can be overridden to execute asynchronous code during the ``setUp`` stage of the ``TestCase``. .. versionadded:: 2.3 .. comethod:: tearDownAsync() This async method do nothing by default and can be overridden to execute asynchronous code during the ``tearDown`` stage of the ``TestCase``. .. versionadded:: 2.3 .. method:: setUp() Standard test initialization method. .. method:: tearDown() Standard test finalization method. .. note:: The ``TestClient``'s methods are asynchronous: you have to execute functions on the test client using asynchronous methods.:: class TestA(AioHTTPTestCase): async def test_f(self): async with self.client.get('/') as resp: body = await resp.text() .. decorator:: unittest_run_loop: A decorator dedicated to use with asynchronous methods of an :class:`AioHTTPTestCase`. Handles executing an asynchronous function, using the :attr:`AioHTTPTestCase.loop` of the :class:`AioHTTPTestCase`. .. deprecated:: 3.8 In 3.8+ :class:`AioHTTPTestCase` inherits from :class:`unittest.IsolatedAsyncioTestCase` making this decorator unneeded. It is now a no-op. Faking request object --------------------- aiohttp provides test utility for creating fake :class:`aiohttp.web.Request` objects: :func:`aiohttp.test_utils.make_mocked_request`, it could be useful in case of simple unit tests, like handler tests, or simulate error conditions that hard to reproduce on real server:: from aiohttp import web from aiohttp.test_utils import make_mocked_request def handler(request): assert request.headers.get('token') == 'x' return web.Response(body=b'data') def test_handler(): req = make_mocked_request('GET', '/', headers={'token': 'x'}) resp = handler(req) assert resp.body == b'data' .. warning:: We don't recommend to apply :func:`~aiohttp.test_utils.make_mocked_request` everywhere for testing web-handler's business object -- please use test client and real networking via 'localhost' as shown in examples before. :func:`~aiohttp.test_utils.make_mocked_request` exists only for testing complex cases (e.g. emulating network errors) which are extremely hard or even impossible to test by conventional way. .. function:: make_mocked_request(method, path, headers=None, *, \ version=HttpVersion(1, 1), \ closing=False, \ app=None, \ match_info=sentinel, \ reader=sentinel, \ writer=sentinel, \ transport=sentinel, \ payload=sentinel, \ sslcontext=None, \ loop=...) Creates mocked web.Request testing purposes. Useful in unit tests, when spinning full web server is overkill or specific conditions and errors are hard to trigger. :param method: str, that represents HTTP method, like; GET, POST. :type method: str :param path: str, The URL including *PATH INFO* without the host or scheme :type path: str :param headers: mapping containing the headers. Can be anything accepted by the multidict.CIMultiDict constructor. :type headers: dict, multidict.CIMultiDict, list of pairs :param match_info: mapping containing the info to match with url parameters. :type match_info: dict :param version: namedtuple with encoded HTTP version :type version: aiohttp.protocol.HttpVersion :param closing: flag indicates that connection should be closed after response. :type closing: bool :param app: the aiohttp.web application attached for fake request :type app: aiohttp.web.Application :param writer: object for managing outcoming data :type writer: aiohttp.StreamWriter :param transport: asyncio transport instance :type transport: asyncio.Transport :param payload: raw payload reader object :type payload: aiohttp.StreamReader :param sslcontext: ssl.SSLContext object, for HTTPS connection :type sslcontext: ssl.SSLContext :param loop: An event loop instance, mocked loop by default. :type loop: :class:`asyncio.AbstractEventLoop` :return: :class:`aiohttp.web.Request` object. .. versionadded:: 2.3 *match_info* parameter. .. _aiohttp-testing-writing-testable-services: .. _aiohttp-testing-framework-agnostic-utilities: Framework Agnostic Utilities ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ High level test creation:: from aiohttp.test_utils import TestClient, TestServer, loop_context from aiohttp import request # loop_context is provided as a utility. You can use any # asyncio.BaseEventLoop class in its place. with loop_context() as loop: app = _create_example_app() with TestClient(TestServer(app), loop=loop) as client: async def test_get_route(): nonlocal client resp = await client.get("/") assert resp.status == 200 text = await resp.text() assert "Hello, world" in text loop.run_until_complete(test_get_route()) If it's preferred to handle the creation / teardown on a more granular basis, the TestClient object can be used directly:: from aiohttp.test_utils import TestClient, TestServer with loop_context() as loop: app = _create_example_app() client = TestClient(TestServer(app), loop=loop) loop.run_until_complete(client.start_server()) root = "http://127.0.0.1:{}".format(port) async def test_get_route(): resp = await client.get("/") assert resp.status == 200 text = await resp.text() assert "Hello, world" in text loop.run_until_complete(test_get_route()) loop.run_until_complete(client.close()) A full list of the utilities provided can be found at the :mod:`api reference ` Testing API Reference --------------------- Test server ~~~~~~~~~~~ Runs given :class:`aiohttp.web.Application` instance on random TCP port. After creation the server is not started yet, use :meth:`~aiohttp.test_utils.BaseTestServer.start_server` for actual server starting and :meth:`~aiohttp.test_utils.BaseTestServer.close` for stopping/cleanup. Test server usually works in conjunction with :class:`aiohttp.test_utils.TestClient` which provides handy client methods for accessing to the server. .. class:: BaseTestServer(*, scheme='http', host='127.0.0.1', port=None, socket_factory=get_port_socket) Base class for test servers. :param str scheme: HTTP scheme, non-protected ``"http"`` by default. :param str host: a host for TCP socket, IPv4 *local host* (``'127.0.0.1'``) by default. :param int port: optional port for TCP socket, if not provided a random unused port is used. .. versionadded:: 3.0 :param collections.abc.Callable[[str,int,socket.AddressFamily],socket.socket] socket_factory: optional Factory to create a socket for the server. By default creates a TCP socket and binds it to ``host`` and ``port``. .. versionadded:: 3.8 .. attribute:: scheme A *scheme* for tested application, ``'http'`` for non-protected run and ``'https'`` for TLS encrypted server. .. attribute:: host *host* used to start a test server. .. attribute:: port *port* used to start the test server. .. attribute:: handler :class:`aiohttp.web.Server` used for HTTP requests serving. .. attribute:: server :class:`asyncio.AbstractServer` used for managing accepted connections. .. attribute:: socket_factory *socket_factory* used to create and bind a server socket. .. versionadded:: 3.8 .. comethod:: start_server(loop=None, **kwargs) :param loop: the event_loop to use :type loop: asyncio.AbstractEventLoop Start a test server. .. comethod:: close() Stop and finish executed test server. .. method:: make_url(path) Return an *absolute* :class:`~yarl.URL` for given *path*. .. class:: RawTestServer(handler, *, scheme="http", host='127.0.0.1') Low-level test server (derived from :class:`BaseTestServer`). :param handler: a coroutine for handling web requests. The handler should accept :class:`aiohttp.web.BaseRequest` and return a response instance, e.g. :class:`~aiohttp.web.StreamResponse` or :class:`~aiohttp.web.Response`. The handler could raise :class:`~aiohttp.web.HTTPException` as a signal for non-200 HTTP response. :param str scheme: HTTP scheme, non-protected ``"http"`` by default. :param str host: a host for TCP socket, IPv4 *local host* (``'127.0.0.1'``) by default. :param int port: optional port for TCP socket, if not provided a random unused port is used. .. versionadded:: 3.0 .. class:: TestServer(app, *, scheme="http", host='127.0.0.1') Test server (derived from :class:`BaseTestServer`) for starting :class:`~aiohttp.web.Application`. :param app: :class:`aiohttp.web.Application` instance to run. :param str scheme: HTTP scheme, non-protected ``"http"`` by default. :param str host: a host for TCP socket, IPv4 *local host* (``'127.0.0.1'``) by default. :param int port: optional port for TCP socket, if not provided a random unused port is used. .. versionadded:: 3.0 .. attribute:: app :class:`aiohttp.web.Application` instance to run. Test Client ~~~~~~~~~~~ .. class:: TestClient(app_or_server, *, loop=None, \ scheme='http', host='127.0.0.1', \ cookie_jar=None, **kwargs) A test client used for making calls to tested server. :param app_or_server: :class:`BaseTestServer` instance for making client requests to it. In order to pass a :class:`aiohttp.web.Application` you need to convert it first to :class:`TestServer` first with ``TestServer(app)``. :param cookie_jar: an optional :class:`aiohttp.CookieJar` instance, may be useful with ``CookieJar(unsafe=True, treat_as_secure_origin="http://127.0.0.1")`` option. :param str scheme: HTTP scheme, non-protected ``"http"`` by default. :param asyncio.AbstractEventLoop loop: the event_loop to use :param str host: a host for TCP socket, IPv4 *local host* (``'127.0.0.1'``) by default. .. attribute:: scheme A *scheme* for tested application, ``'http'`` for non-protected run and ``'https'`` for TLS encrypted server. .. attribute:: host *host* used to start a test server. .. attribute:: port *port* used to start the server .. attribute:: server :class:`BaseTestServer` test server instance used in conjunction with client. .. attribute:: app An alias for ``self.server.app``. return ``None`` if ``self.server`` is not :class:`TestServer` instance(e.g. :class:`RawTestServer` instance for test low-level server). .. attribute:: session An internal :class:`aiohttp.ClientSession`. Unlike the methods on the :class:`TestClient`, client session requests do not automatically include the host in the url queried, and will require an absolute path to the resource. .. comethod:: start_server(**kwargs) Start a test server. .. comethod:: close() Stop and finish executed test server. .. method:: make_url(path) Return an *absolute* :class:`~yarl.URL` for given *path*. .. comethod:: request(method, path, *args, **kwargs) Routes a request to tested http server. The interface is identical to :meth:`aiohttp.ClientSession.request`, except the loop kwarg is overridden by the instance used by the test server. .. comethod:: get(path, *args, **kwargs) Perform an HTTP GET request. .. comethod:: post(path, *args, **kwargs) Perform an HTTP POST request. .. comethod:: options(path, *args, **kwargs) Perform an HTTP OPTIONS request. .. comethod:: head(path, *args, **kwargs) Perform an HTTP HEAD request. .. comethod:: put(path, *args, **kwargs) Perform an HTTP PUT request. .. comethod:: patch(path, *args, **kwargs) Perform an HTTP PATCH request. .. comethod:: delete(path, *args, **kwargs) Perform an HTTP DELETE request. .. comethod:: ws_connect(path, *args, **kwargs) Initiate websocket connection. The api corresponds to :meth:`aiohttp.ClientSession.ws_connect`. Utilities ~~~~~~~~~ .. function:: make_mocked_coro(return_value) Creates a coroutine mock. Behaves like a coroutine which returns *return_value*. But it is also a mock object, you might test it as usual :class:`~unittest.mock.Mock`:: mocked = make_mocked_coro(1) assert 1 == await mocked(1, 2) mocked.assert_called_with(1, 2) :param return_value: A value that the the mock object will return when called. :returns: A mock object that behaves as a coroutine which returns *return_value* when called. .. function:: unused_port() Return an unused port number for IPv4 TCP protocol. :return int: ephemeral port number which could be reused by test server. .. function:: loop_context(loop_factory=) A contextmanager that creates an event_loop, for test purposes. Handles the creation and cleanup of a test loop. .. function:: setup_test_loop(loop_factory=) Create and return an :class:`asyncio.AbstractEventLoop` instance. The caller should also call teardown_test_loop, once they are done with the loop. .. note:: As side effect the function changes asyncio *default loop* by :func:`asyncio.set_event_loop` call. Previous default loop is not restored. It should not be a problem for test suite: every test expects a new test loop instance anyway. .. versionchanged:: 3.1 The function installs a created event loop as *default*. .. function:: teardown_test_loop(loop) Teardown and cleanup an event_loop created by setup_test_loop. :param loop: the loop to teardown :type loop: asyncio.AbstractEventLoop .. _pytest: http://pytest.org/latest/ .. _pytest-aiohttp: https://pypi.python.org/pypi/pytest-aiohttp ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/third_party.rst0000644000175100001710000002417000000000000016552 0ustar00runnerdocker.. _aiohttp-3rd-party: Third-Party libraries ===================== aiohttp is not just a library for making HTTP requests and creating web servers. It is the foundation for libraries built *on top* of aiohttp. This page is a list of these tools. Please feel free to add your open source library if it's not listed yet by making a pull request to https://github.com/aio-libs/aiohttp/ * Why would you want to include your awesome library in this list? * Because the list increases your library visibility. People will have an easy way to find it. Officially supported -------------------- This list contains libraries which are supported by the *aio-libs* team and located on https://github.com/aio-libs aiohttp extensions ^^^^^^^^^^^^^^^^^^ - `aiohttp-session `_ provides sessions for :mod:`aiohttp.web`. - `aiohttp-debugtoolbar `_ is a library for *debug toolbar* support for :mod:`aiohttp.web`. - `aiohttp-security `_ auth and permissions for :mod:`aiohttp.web`. - `aiohttp-devtools `_ provides development tools for :mod:`aiohttp.web` applications. - `aiohttp-cors `_ CORS support for aiohttp. - `aiohttp-sse `_ Server-sent events support for aiohttp. - `pytest-aiohttp `_ pytest plugin for aiohttp support. - `aiohttp-mako `_ Mako template renderer for aiohttp.web. - `aiohttp-jinja2 `_ Jinja2 template renderer for aiohttp.web. - `aiozipkin `_ distributed tracing instrumentation for `aiohttp` client and server. Database drivers ^^^^^^^^^^^^^^^^ - `aiopg `_ PostgreSQL async driver. - `aiomysql `_ MySQL async driver. - `aioredis `_ Redis async driver. Other tools ^^^^^^^^^^^ - `aiodocker `_ Python Docker API client based on asyncio and aiohttp. - `aiobotocore `_ asyncio support for botocore library using aiohttp. Approved third-party libraries ------------------------------ These libraries are not part of ``aio-libs`` but they have proven to be very well written and highly recommended for usage. - `uvloop `_ Ultra fast implementation of asyncio event loop on top of ``libuv``. We highly recommend to use this instead of standard ``asyncio``. Database drivers ^^^^^^^^^^^^^^^^ - `asyncpg `_ Another PostgreSQL async driver. It's much faster than ``aiopg`` but is not a drop-in replacement -- the API is different. But, please take a look at it -- the driver is incredibly fast. OpenAPI / Swagger extensions ---------------------------- Extensions bringing `OpenAPI `_ support to aiohttp web servers. - `aiohttp-apispec `_ Build and document REST APIs with ``aiohttp`` and ``apispec``. - `aiohttp_apiset `_ Package to build routes using swagger specification. - `aiohttp-pydantic `_ An ``aiohttp.View`` to validate the HTTP request's body, query-string, and headers regarding function annotations and generate OpenAPI doc. Python 3.8+ required. - `aiohttp-swagger `_ Swagger API Documentation builder for aiohttp server. - `aiohttp-swagger3 `_ Library for Swagger documentation builder and validating aiohttp requests using swagger specification 3.0. - `aiohttp-swaggerify `_ Library to automatically generate swagger2.0 definition for aiohttp endpoints. - `aio-openapi `_ Asynchronous web middleware for aiohttp and serving Rest APIs with OpenAPI v3 specification and with optional PostgreSQL database bindings. - `rororo `_ Implement ``aiohttp.web`` OpenAPI 3 server applications with schema first approach. Python 3.6+ required. Others ------ Here is a list of other known libraries that do not belong in the former categories. We cannot vouch for the quality of these libraries, use them at your own risk. Please add your library reference here first and after some time ask to raise the status. - `aiohttp-cache `_ A cache system for aiohttp server. - `aiocache `_ Caching for asyncio with multiple backends (framework agnostic) - `gain `_ Web crawling framework based on asyncio for everyone. - `aiohttp-validate `_ Simple library that helps you validate your API endpoints requests/responses with json schema. - `raven-aiohttp `_ An aiohttp transport for raven-python (Sentry client). - `webargs `_ A friendly library for parsing HTTP request arguments, with built-in support for popular web frameworks, including Flask, Django, Bottle, Tornado, Pyramid, webapp2, Falcon, and aiohttp. - `aioauth-client `_ OAuth client for aiohttp. - `aiohttpretty `_ A simple asyncio compatible httpretty mock using aiohttp. - `aioresponses `_ a helper for mock/fake web requests in python aiohttp package. - `aiohttp-transmute `_ A transmute implementation for aiohttp. - `aiohttp-login `_ Registration and authorization (including social) for aiohttp applications. - `aiohttp_utils `_ Handy utilities for building aiohttp.web applications. - `aiohttpproxy `_ Simple aiohttp HTTP proxy. - `aiohttp_traversal `_ Traversal based router for aiohttp.web. - `aiohttp_autoreload `_ Makes aiohttp server auto-reload on source code change. - `gidgethub `_ An async GitHub API library for Python. - `aiohttp_jrpc `_ aiohttp JSON-RPC service. - `fbemissary `_ A bot framework for the Facebook Messenger platform, built on asyncio and aiohttp. - `aioslacker `_ slacker wrapper for asyncio. - `aioreloader `_ Port of tornado reloader to asyncio. - `aiohttp_babel `_ Babel localization support for aiohttp. - `python-mocket `_ a socket mock framework - for all kinds of socket animals, web-clients included. - `aioraft `_ asyncio RAFT algorithm based on aiohttp. - `home-assistant `_ Open-source home automation platform running on Python 3. - `discord.py `_ Discord client library. - `aiogram `_ A fully asynchronous library for Telegram Bot API written with asyncio and aiohttp. - `aiohttp-graphql `_ GraphQL and GraphIQL interface for aiohttp. - `aiohttp-sentry `_ An aiohttp middleware for reporting errors to Sentry. Python 3.5+ is required. - `aiohttp-datadog `_ An aiohttp middleware for reporting metrics to DataDog. Python 3.5+ is required. - `async-v20 `_ Asynchronous FOREX client for OANDA's v20 API. Python 3.6+ - `aiohttp-jwt `_ An aiohttp middleware for JWT(JSON Web Token) support. Python 3.5+ is required. - `AWS Xray Python SDK `_ Native tracing support for Aiohttp applications. - `GINO `_ An asyncio ORM on top of SQLAlchemy core, delivered with an aiohttp extension. - `eider-py `_ Python implementation of the `Eider RPC protocol `_. - `asynapplicationinsights `_ A client for `Azure Application Insights `_ implemented using ``aiohttp`` client, including a middleware for ``aiohttp`` servers to collect web apps telemetry. - `aiogmaps `_ Asynchronous client for Google Maps API Web Services. Python 3.6+ required. - `DBGR `_ Terminal based tool to test and debug HTTP APIs with ``aiohttp``. - `aiohttp-middlewares `_ Collection of useful middlewares for ``aiohttp.web`` applications. Python 3.6+ required. - `aiohttp-tus `_ `tus.io `_ protocol implementation for ``aiohttp.web`` applications. Python 3.6+ required. - `aiohttp-sse-client `_ A Server-Sent Event python client base on aiohttp. Python 3.6+ required. - `aiohttp-retry `_ Wrapper for aiohttp client for retrying requests. Python 3.6+ required. - `aiohttp-socks `_ SOCKS proxy connector for aiohttp. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/tracing_reference.rst0000644000175100001710000003142400000000000017666 0ustar00runnerdocker.. _aiohttp-client-tracing-reference: Tracing Reference ================= .. currentmodule:: aiohttp .. versionadded:: 3.0 A reference for client tracing API. .. seealso:: :ref:`aiohttp-client-tracing` for tracing usage instructions. Request life cycle ------------------ A request goes through the following stages and corresponding fallbacks. Overview ^^^^^^^^ .. blockdiag:: :desctable: blockdiag { orientation = portrait; start[shape=beginpoint, description="on_request_start"]; redirect[description="on_request_redirect"]; end[shape=endpoint, description="on_request_end"]; exception[shape=flowchart.terminator, description="on_request_exception"]; acquire_connection[description="Connection acquiring"]; headers_received; headers_sent[description="on_request_headers_sent"]; chunk_sent[description="on_request_chunk_sent"]; chunk_received[description="on_response_chunk_received"]; start -> acquire_connection; acquire_connection -> headers_sent; headers_sent -> headers_received; headers_sent -> chunk_sent; chunk_sent -> chunk_sent; chunk_sent -> headers_received; headers_received -> chunk_received; chunk_received -> chunk_received; chunk_received -> end; headers_received -> redirect; headers_received -> end; redirect -> headers_sent; chunk_received -> exception; chunk_sent -> exception; headers_sent -> exception; } Connection acquiring ^^^^^^^^^^^^^^^^^^^^ .. blockdiag:: :desctable: blockdiag { orientation = portrait; begin[shape=beginpoint]; end[shape=endpoint]; exception[shape=flowchart.terminator, description="Exception raised"]; queued_start[description="on_connection_queued_start"]; queued_end[description="on_connection_queued_end"]; create_start[description="on_connection_create_start"]; create_end[description="on_connection_create_end"]; reuseconn[description="on_connection_reuseconn"]; resolve_dns[description="DNS resolving"]; sock_connect[description="Connection establishment"]; begin -> reuseconn; begin -> create_start; create_start -> resolve_dns; resolve_dns -> exception; resolve_dns -> sock_connect; sock_connect -> exception; sock_connect -> create_end -> end; begin -> queued_start; queued_start -> queued_end; queued_end -> reuseconn; queued_end -> create_start; reuseconn -> end; } DNS resolving ^^^^^^^^^^^^^ .. blockdiag:: :desctable: blockdiag { orientation = portrait; begin[shape=beginpoint]; end[shape=endpoint]; exception[shape=flowchart.terminator, description="Exception raised"]; resolve_start[description="on_dns_resolvehost_start"]; resolve_end[description="on_dns_resolvehost_end"]; cache_hit[description="on_dns_cache_hit"]; cache_miss[description="on_dns_cache_miss"]; begin -> cache_hit -> end; begin -> cache_miss -> resolve_start; resolve_start -> resolve_end -> end; resolve_start -> exception; } TraceConfig ----------- .. class:: TraceConfig(trace_config_ctx_factory=SimpleNamespace) Trace config is the configuration object used to trace requests launched by a :class:`ClientSession` object using different events related to different parts of the request flow. :param trace_config_ctx_factory: factory used to create trace contexts, default class used :class:`types.SimpleNamespace` .. method:: trace_config_ctx(trace_request_ctx=None) :param trace_request_ctx: Will be used to pass as a kw for the ``trace_config_ctx_factory``. Build a new trace context from the config. Every signal handler should have the following signature:: async def on_signal(session, context, params): ... where ``session`` is :class:`ClientSession` instance, ``context`` is an object returned by :meth:`trace_config_ctx` call and ``params`` is a data class with signal parameters. The type of ``params`` depends on subscribed signal and described below. .. attribute:: on_request_start Property that gives access to the signals that will be executed when a request starts. ``params`` is :class:`aiohttp.TraceRequestStartParams` instance. .. attribute:: on_request_chunk_sent Property that gives access to the signals that will be executed when a chunk of request body is sent. ``params`` is :class:`aiohttp.TraceRequestChunkSentParams` instance. .. versionadded:: 3.1 .. attribute:: on_response_chunk_received Property that gives access to the signals that will be executed when a chunk of response body is received. ``params`` is :class:`aiohttp.TraceResponseChunkReceivedParams` instance. .. versionadded:: 3.1 .. attribute:: on_request_redirect Property that gives access to the signals that will be executed when a redirect happens during a request flow. ``params`` is :class:`aiohttp.TraceRequestRedirectParams` instance. .. attribute:: on_request_end Property that gives access to the signals that will be executed when a request ends. ``params`` is :class:`aiohttp.TraceRequestEndParams` instance. .. attribute:: on_request_exception Property that gives access to the signals that will be executed when a request finishes with an exception. ``params`` is :class:`aiohttp.TraceRequestExceptionParams` instance. .. attribute:: on_connection_queued_start Property that gives access to the signals that will be executed when a request has been queued waiting for an available connection. ``params`` is :class:`aiohttp.TraceConnectionQueuedStartParams` instance. .. attribute:: on_connection_queued_end Property that gives access to the signals that will be executed when a request that was queued already has an available connection. ``params`` is :class:`aiohttp.TraceConnectionQueuedEndParams` instance. .. attribute:: on_connection_create_start Property that gives access to the signals that will be executed when a request creates a new connection. ``params`` is :class:`aiohttp.TraceConnectionCreateStartParams` instance. .. attribute:: on_connection_create_end Property that gives access to the signals that will be executed when a request that created a new connection finishes its creation. ``params`` is :class:`aiohttp.TraceConnectionCreateEndParams` instance. .. attribute:: on_connection_reuseconn Property that gives access to the signals that will be executed when a request reuses a connection. ``params`` is :class:`aiohttp.TraceConnectionReuseconnParams` instance. .. attribute:: on_dns_resolvehost_start Property that gives access to the signals that will be executed when a request starts to resolve the domain related with the request. ``params`` is :class:`aiohttp.TraceDnsResolveHostStartParams` instance. .. attribute:: on_dns_resolvehost_end Property that gives access to the signals that will be executed when a request finishes to resolve the domain related with the request. ``params`` is :class:`aiohttp.TraceDnsResolveHostEndParams` instance. .. attribute:: on_dns_cache_hit Property that gives access to the signals that will be executed when a request was able to use a cached DNS resolution for the domain related with the request. ``params`` is :class:`aiohttp.TraceDnsCacheHitParams` instance. .. attribute:: on_dns_cache_miss Property that gives access to the signals that will be executed when a request was not able to use a cached DNS resolution for the domain related with the request. ``params`` is :class:`aiohttp.TraceDnsCacheMissParams` instance. .. attribute:: on_request_headers_sent Property that gives access to the signals that will be executed when request headers are sent. ``params`` is :class:`aiohttp.TraceRequestHeadersSentParams` instance. .. versionadded:: 3.8 TraceRequestStartParams ----------------------- .. class:: TraceRequestStartParams See :attr:`TraceConfig.on_request_start` for details. .. attribute:: method Method that will be used to make the request. .. attribute:: url URL that will be used for the request. .. attribute:: headers Headers that will be used for the request, can be mutated. TraceRequestChunkSentParams --------------------------- .. class:: TraceRequestChunkSentParams .. versionadded:: 3.1 See :attr:`TraceConfig.on_request_chunk_sent` for details. .. attribute:: method Method that will be used to make the request. .. attribute:: url URL that will be used for the request. .. attribute:: chunk Bytes of chunk sent TraceResponseChunkReceivedParams -------------------------------- .. class:: TraceResponseChunkReceivedParams .. versionadded:: 3.1 See :attr:`TraceConfig.on_response_chunk_received` for details. .. attribute:: method Method that will be used to make the request. .. attribute:: url URL that will be used for the request. .. attribute:: chunk Bytes of chunk received TraceRequestEndParams --------------------- .. class:: TraceRequestEndParams See :attr:`TraceConfig.on_request_end` for details. .. attribute:: method Method used to make the request. .. attribute:: url URL used for the request. .. attribute:: headers Headers used for the request. .. attribute:: response Response :class:`ClientResponse`. TraceRequestExceptionParams --------------------------- .. class:: TraceRequestExceptionParams See :attr:`TraceConfig.on_request_exception` for details. .. attribute:: method Method used to make the request. .. attribute:: url URL used for the request. .. attribute:: headers Headers used for the request. .. attribute:: exception Exception raised during the request. TraceRequestRedirectParams -------------------------- .. class:: TraceRequestRedirectParams See :attr:`TraceConfig.on_request_redirect` for details. .. attribute:: method Method used to get this redirect request. .. attribute:: url URL used for this redirect request. .. attribute:: headers Headers used for this redirect. .. attribute:: response Response :class:`ClientResponse` got from the redirect. TraceConnectionQueuedStartParams -------------------------------- .. class:: TraceConnectionQueuedStartParams See :attr:`TraceConfig.on_connection_queued_start` for details. There are no attributes right now. TraceConnectionQueuedEndParams ------------------------------ .. class:: TraceConnectionQueuedEndParams See :attr:`TraceConfig.on_connection_queued_end` for details. There are no attributes right now. TraceConnectionCreateStartParams -------------------------------- .. class:: TraceConnectionCreateStartParams See :attr:`TraceConfig.on_connection_create_start` for details. There are no attributes right now. TraceConnectionCreateEndParams ------------------------------ .. class:: TraceConnectionCreateEndParams See :attr:`TraceConfig.on_connection_create_end` for details. There are no attributes right now. TraceConnectionReuseconnParams ------------------------------ .. class:: TraceConnectionReuseconnParams See :attr:`TraceConfig.on_connection_reuseconn` for details. There are no attributes right now. TraceDnsResolveHostStartParams ------------------------------ .. class:: TraceDnsResolveHostStartParams See :attr:`TraceConfig.on_dns_resolvehost_start` for details. .. attribute:: host Host that will be resolved. TraceDnsResolveHostEndParams ---------------------------- .. class:: TraceDnsResolveHostEndParams See :attr:`TraceConfig.on_dns_resolvehost_end` for details. .. attribute:: host Host that has been resolved. TraceDnsCacheHitParams ---------------------- .. class:: TraceDnsCacheHitParams See :attr:`TraceConfig.on_dns_cache_hit` for details. .. attribute:: host Host found in the cache. TraceDnsCacheMissParams ----------------------- .. class:: TraceDnsCacheMissParams See :attr:`TraceConfig.on_dns_cache_miss` for details. .. attribute:: host Host didn't find the cache. TraceRequestHeadersSentParams ----------------------------- .. class:: TraceRequestHeadersSentParams See :attr:`TraceConfig.on_request_headers_sent` for details. .. versionadded:: 3.8 .. attribute:: method Method that will be used to make the request. .. attribute:: url URL that will be used for the request. .. attribute:: headers Headers that will be used for the request. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/utilities.rst0000644000175100001710000000037400000000000016234 0ustar00runnerdocker.. _aiohttp-utilities: Utilities ========= Miscellaneous API Shared between Client And Server. .. currentmodule:: aiohttp .. toctree:: :name: utilities abc multipart multipart_reference streams structures websocket_utilities ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/web.rst0000644000175100001710000000057500000000000015001 0ustar00runnerdocker.. _aiohttp-web: Server ====== .. module:: aiohttp.web The page contains all information about aiohttp Server API: .. toctree:: :name: server Tutorial Quickstart Advanced Usage Low Level Reference Logging Testing Deployment ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/web_advanced.rst0000644000175100001710000010005300000000000016616 0ustar00runnerdocker.. _aiohttp-web-advanced: Web Server Advanced =================== .. currentmodule:: aiohttp.web Unicode support --------------- *aiohttp* does :term:`requoting` of incoming request path. Unicode (non-ASCII) symbols are processed transparently on both *route adding* and *resolving* (internally everything is converted to :term:`percent-encoding` form by :term:`yarl` library). But in case of custom regular expressions for :ref:`aiohttp-web-variable-handler` please take care that URL is *percent encoded*: if you pass Unicode patterns they don't match to *requoted* path. Peer disconnection ------------------ When a client peer is gone a subsequent reading or writing raises :exc:`OSError` or more specific exception like :exc:`ConnectionResetError`. The reason for disconnection is vary; it can be a network issue or explicit socket closing on the peer side without reading the whole server response. *aiohttp* handles disconnection properly but you can handle it explicitly, e.g.:: async def handler(request): try: text = await request.text() except OSError: # disconnected Passing a coroutine into run_app and Gunicorn --------------------------------------------- :func:`run_app` accepts either application instance or a coroutine for making an application. The coroutine based approach allows to perform async IO before making an app:: async def app_factory(): await pre_init() app = web.Application() app.router.add_get(...) return app web.run_app(app_factory()) Gunicorn worker supports a factory as well. For Gunicorn the factory should accept zero parameters:: async def my_web_app(): app = web.Application() app.router.add_get(...) return app Start gunicorn: .. code-block:: shell $ gunicorn my_app_module:my_web_app --bind localhost:8080 --worker-class aiohttp.GunicornWebWorker .. versionadded:: 3.1 Custom Routing Criteria ----------------------- Sometimes you need to register :ref:`handlers ` on more complex criteria than simply a *HTTP method* and *path* pair. Although :class:`UrlDispatcher` does not support any extra criteria, routing based on custom conditions can be accomplished by implementing a second layer of routing in your application. The following example shows custom routing based on the *HTTP Accept* header:: class AcceptChooser: def __init__(self): self._accepts = {} async def do_route(self, request): for accept in request.headers.getall('ACCEPT', []): acceptor = self._accepts.get(accept) if acceptor is not None: return (await acceptor(request)) raise HTTPNotAcceptable() def reg_acceptor(self, accept, handler): self._accepts[accept] = handler async def handle_json(request): # do json handling async def handle_xml(request): # do xml handling chooser = AcceptChooser() app.add_routes([web.get('/', chooser.do_route)]) chooser.reg_acceptor('application/json', handle_json) chooser.reg_acceptor('application/xml', handle_xml) .. _aiohttp-web-static-file-handling: Static file handling -------------------- The best way to handle static files (images, JavaScripts, CSS files etc.) is using `Reverse Proxy`_ like `nginx`_ or `CDN`_ services. .. _Reverse Proxy: https://en.wikipedia.org/wiki/Reverse_proxy .. _nginx: https://nginx.org/ .. _CDN: https://en.wikipedia.org/wiki/Content_delivery_network But for development it's very convenient to handle static files by aiohttp server itself. To do it just register a new static route by :meth:`RouteTableDef.static` or :func:`static` calls:: app.add_routes([web.static('/prefix', path_to_static_folder)]) routes.static('/prefix', path_to_static_folder) When a directory is accessed within a static route then the server responses to client with ``HTTP/403 Forbidden`` by default. Displaying folder index instead could be enabled with ``show_index`` parameter set to ``True``:: web.static('/prefix', path_to_static_folder, show_index=True) When a symlink from the static directory is accessed, the server responses to client with ``HTTP/404 Not Found`` by default. To allow the server to follow symlinks, parameter ``follow_symlinks`` should be set to ``True``:: web.static('/prefix', path_to_static_folder, follow_symlinks=True) When you want to enable cache busting, parameter ``append_version`` can be set to ``True`` Cache busting is the process of appending some form of file version hash to the filename of resources like JavaScript and CSS files. The performance advantage of doing this is that we can tell the browser to cache these files indefinitely without worrying about the client not getting the latest version when the file changes:: web.static('/prefix', path_to_static_folder, append_version=True) Template Rendering ------------------ :mod:`aiohttp.web` does not support template rendering out-of-the-box. However, there is a third-party library, :mod:`aiohttp_jinja2`, which is supported by the *aiohttp* authors. Using it is rather simple. First, setup a *jinja2 environment* with a call to :func:`aiohttp_jinja2.setup`:: app = web.Application() aiohttp_jinja2.setup(app, loader=jinja2.FileSystemLoader('/path/to/templates/folder')) After that you may use the template engine in your :ref:`handlers `. The most convenient way is to simply wrap your handlers with the :func:`aiohttp_jinja2.template` decorator:: @aiohttp_jinja2.template('tmpl.jinja2') async def handler(request): return {'name': 'Andrew', 'surname': 'Svetlov'} If you prefer the `Mako`_ template engine, please take a look at the `aiohttp_mako`_ library. .. warning:: :func:`aiohttp_jinja2.template` should be applied **before** :meth:`RouteTableDef.get` decorator and family, e.g. it must be the *first* (most *down* decorator in the chain):: @routes.get('/path') @aiohttp_jinja2.template('tmpl.jinja2') async def handler(request): return {'name': 'Andrew', 'surname': 'Svetlov'} .. _Mako: http://www.makotemplates.org/ .. _aiohttp_mako: https://github.com/aio-libs/aiohttp_mako .. _aiohttp-web-websocket-read-same-task: Reading from the same task in WebSockets ---------------------------------------- Reading from the *WebSocket* (``await ws.receive()``) **must only** be done inside the request handler *task*; however, writing (``ws.send_str(...)``) to the *WebSocket*, closing (``await ws.close()``) and canceling the handler task may be delegated to other tasks. See also :ref:`FAQ section `. :mod:`aiohttp.web` creates an implicit :class:`asyncio.Task` for handling every incoming request. .. note:: While :mod:`aiohttp.web` itself only supports *WebSockets* without downgrading to *LONG-POLLING*, etc., our team supports SockJS_, an aiohttp-based library for implementing SockJS-compatible server code. .. _SockJS: https://github.com/aio-libs/sockjs .. warning:: Parallel reads from websocket are forbidden, there is no possibility to call :meth:`WebSocketResponse.receive` from two tasks. See :ref:`FAQ section ` for instructions how to solve the problem. .. _aiohttp-web-data-sharing: Data Sharing aka No Singletons Please ------------------------------------- :mod:`aiohttp.web` discourages the use of *global variables*, aka *singletons*. Every variable should have its own context that is *not global*. So, :class:`Application` and :class:`Request` support a :class:`collections.abc.MutableMapping` interface (i.e. they are dict-like objects), allowing them to be used as data stores. .. _aiohttp-web-data-sharing-app-config: Application's config ^^^^^^^^^^^^^^^^^^^^ For storing *global-like* variables, feel free to save them in an :class:`Application` instance:: app['my_private_key'] = data and get it back in the :term:`web-handler`:: async def handler(request): data = request.app['my_private_key'] In case of :ref:`nested applications ` the desired lookup strategy could be the following: 1. Search the key in the current nested application. 2. If the key is not found continue searching in the parent application(s). For this please use :attr:`Request.config_dict` read-only property:: async def handler(request): data = request.config_dict['my_private_key'] Request's storage ^^^^^^^^^^^^^^^^^ Variables that are only needed for the lifetime of a :class:`Request`, can be stored in a :class:`Request`:: async def handler(request): request['my_private_key'] = "data" ... This is mostly useful for :ref:`aiohttp-web-middlewares` and :ref:`aiohttp-web-signals` handlers to store data for further processing by the next handlers in the chain. Response's storage ^^^^^^^^^^^^^^^^^^ :class:`StreamResponse` and :class:`Response` objects also support :class:`collections.abc.MutableMapping` interface. This is useful when you want to share data with signals and middlewares once all the work in the handler is done:: async def handler(request): [ do all the work ] response['my_metric'] = 123 return response Naming hint ^^^^^^^^^^^ To avoid clashing with other *aiohttp* users and third-party libraries, please choose a unique key name for storing data. If your code is published on PyPI, then the project name is most likely unique and safe to use as the key. Otherwise, something based on your company name/url would be satisfactory (i.e. ``org.company.app``). .. _aiohttp-web-contextvars: ContextVars support ------------------- Starting from Python 3.7 asyncio has :mod:`Context Variables ` as a context-local storage (a generalization of thread-local concept that works with asyncio tasks also). *aiohttp* server supports it in the following way: * A server inherits the current task's context used when creating it. :func:`aiohttp.web.run_app()` runs a task for handling all underlying jobs running the app, but alternatively :ref:`aiohttp-web-app-runners` can be used. * Application initialization / finalization events (:attr:`Application.cleanup_ctx`, :attr:`Application.on_startup` and :attr:`Application.on_shutdown`, :attr:`Application.on_cleanup`) are executed inside the same context. E.g. all context modifications made on application startup are visible on teardown. * On every request handling *aiohttp* creates a context copy. :term:`web-handler` has all variables installed on initialization stage. But the context modification made by a handler or middleware is invisible to another HTTP request handling call. An example of context vars usage:: from contextvars import ContextVar from aiohttp import web VAR = ContextVar('VAR', default='default') async def coro(): return VAR.get() async def handler(request): var = VAR.get() VAR.set('handler') ret = await coro() return web.Response(text='\n'.join([var, ret])) async def on_startup(app): print('on_startup', VAR.get()) VAR.set('on_startup') async def on_cleanup(app): print('on_cleanup', VAR.get()) VAR.set('on_cleanup') async def init(): print('init', VAR.get()) VAR.set('init') app = web.Application() app.router.add_get('/', handler) app.on_startup.append(on_startup) app.on_cleanup.append(on_cleanup) return app web.run_app(init()) print('done', VAR.get()) .. versionadded:: 3.5 .. _aiohttp-web-middlewares: Middlewares ----------- :mod:`aiohttp.web` provides a powerful mechanism for customizing :ref:`request handlers` via *middlewares*. A *middleware* is a coroutine that can modify either the request or response. For example, here's a simple *middleware* which appends ``' wink'`` to the response:: from aiohttp.web import middleware @middleware async def middleware(request, handler): resp = await handler(request) resp.text = resp.text + ' wink' return resp .. note:: The example won't work with streamed responses or websockets Every *middleware* should accept two parameters, a :class:`request ` instance and a *handler*, and return the response or raise an exception. If the exception is not an instance of :exc:`HTTPException` it is converted to ``500`` :exc:`HTTPInternalServerError` after processing the middlewares chain. .. warning:: Second argument should be named *handler* exactly. When creating an :class:`Application`, these *middlewares* are passed to the keyword-only ``middlewares`` parameter:: app = web.Application(middlewares=[middleware_1, middleware_2]) Internally, a single :ref:`request handler ` is constructed by applying the middleware chain to the original handler in reverse order, and is called by the :class:`~aiohttp.web.RequestHandler` as a regular *handler*. Since *middlewares* are themselves coroutines, they may perform extra ``await`` calls when creating a new handler, e.g. call database etc. *Middlewares* usually call the handler, but they may choose to ignore it, e.g. displaying *403 Forbidden page* or raising :exc:`HTTPForbidden` exception if the user does not have permissions to access the underlying resource. They may also render errors raised by the handler, perform some pre- or post-processing like handling *CORS* and so on. The following code demonstrates middlewares execution order:: from aiohttp import web async def test(request): print('Handler function called') return web.Response(text="Hello") @web.middleware async def middleware1(request, handler): print('Middleware 1 called') response = await handler(request) print('Middleware 1 finished') return response @web.middleware async def middleware2(request, handler): print('Middleware 2 called') response = await handler(request) print('Middleware 2 finished') return response app = web.Application(middlewares=[middleware1, middleware2]) app.router.add_get('/', test) web.run_app(app) Produced output:: Middleware 1 called Middleware 2 called Handler function called Middleware 2 finished Middleware 1 finished Example ^^^^^^^ A common use of middlewares is to implement custom error pages. The following example will render 404 errors using a JSON response, as might be appropriate a JSON REST service:: from aiohttp import web @web.middleware async def error_middleware(request, handler): try: response = await handler(request) if response.status != 404: return response message = response.message except web.HTTPException as ex: if ex.status != 404: raise message = ex.reason return web.json_response({'error': message}) app = web.Application(middlewares=[error_middleware]) Middleware Factory ^^^^^^^^^^^^^^^^^^ A *middleware factory* is a function that creates a middleware with passed arguments. For example, here's a trivial *middleware factory*:: def middleware_factory(text): @middleware async def sample_middleware(request, handler): resp = await handler(request) resp.text = resp.text + text return resp return sample_middleware Remember that contrary to regular middlewares you need the result of a middleware factory not the function itself. So when passing a middleware factory to an app you actually need to call it:: app = web.Application(middlewares=[middleware_factory(' wink')]) .. _aiohttp-web-signals: Signals ------- Although :ref:`middlewares ` can customize :ref:`request handlers` before or after a :class:`Response` has been prepared, they can't customize a :class:`Response` **while** it's being prepared. For this :mod:`aiohttp.web` provides *signals*. For example, a middleware can only change HTTP headers for *unprepared* responses (see :meth:`StreamResponse.prepare`), but sometimes we need a hook for changing HTTP headers for streamed responses and WebSockets. This can be accomplished by subscribing to the :attr:`Application.on_response_prepare` signal, which is called after default headers have been computed and directly before headers are sent:: async def on_prepare(request, response): response.headers['My-Header'] = 'value' app.on_response_prepare.append(on_prepare) Additionally, the :attr:`Application.on_startup` and :attr:`Application.on_cleanup` signals can be subscribed to for application component setup and tear down accordingly. The following example will properly initialize and dispose an aiopg connection engine:: from aiopg.sa import create_engine async def create_aiopg(app): app['pg_engine'] = await create_engine( user='postgre', database='postgre', host='localhost', port=5432, password='' ) async def dispose_aiopg(app): app['pg_engine'].close() await app['pg_engine'].wait_closed() app.on_startup.append(create_aiopg) app.on_cleanup.append(dispose_aiopg) Signal handlers should not return a value but may modify incoming mutable parameters. Signal handlers will be run sequentially, in order they were added. All handlers must be asynchronous since *aiohttp* 3.0. .. _aiohttp-web-cleanup-ctx: Cleanup Context --------------- Bare :attr:`Application.on_startup` / :attr:`Application.on_cleanup` pair still has a pitfall: signals handlers are independent on each other. E.g. we have ``[create_pg, create_redis]`` in *startup* signal and ``[dispose_pg, dispose_redis]`` in *cleanup*. If, for example, ``create_pg(app)`` call fails ``create_redis(app)`` is not called. But on application cleanup both ``dispose_pg(app)`` and ``dispose_redis(app)`` are still called: *cleanup signal* has no knowledge about startup/cleanup pairs and their execution state. The solution is :attr:`Application.cleanup_ctx` usage:: async def pg_engine(app): app['pg_engine'] = await create_engine( user='postgre', database='postgre', host='localhost', port=5432, password='' ) yield app['pg_engine'].close() await app['pg_engine'].wait_closed() app.cleanup_ctx.append(pg_engine) The attribute is a list of *asynchronous generators*, a code *before* ``yield`` is an initialization stage (called on *startup*), a code *after* ``yield`` is executed on *cleanup*. The generator must have only one ``yield``. *aiohttp* guarantees that *cleanup code* is called if and only if *startup code* was successfully finished. Asynchronous generators are supported by Python 3.6+, on Python 3.5 please use `async_generator `_ library. .. versionadded:: 3.1 .. _aiohttp-web-nested-applications: Nested applications ------------------- Sub applications are designed for solving the problem of the big monolithic code base. Let's assume we have a project with own business logic and tools like administration panel and debug toolbar. Administration panel is a separate application by its own nature but all toolbar URLs are served by prefix like ``/admin``. Thus we'll create a totally separate application named ``admin`` and connect it to main app with prefix by :meth:`Application.add_subapp`:: admin = web.Application() # setup admin routes, signals and middlewares app.add_subapp('/admin/', admin) Middlewares and signals from ``app`` and ``admin`` are chained. It means that if URL is ``'/admin/something'`` middlewares from ``app`` are applied first and ``admin.middlewares`` are the next in the call chain. The same is going for :attr:`Application.on_response_prepare` signal -- the signal is delivered to both top level ``app`` and ``admin`` if processing URL is routed to ``admin`` sub-application. Common signals like :attr:`Application.on_startup`, :attr:`Application.on_shutdown` and :attr:`Application.on_cleanup` are delivered to all registered sub-applications. The passed parameter is sub-application instance, not top-level application. Third level sub-applications can be nested into second level ones -- there are no limitation for nesting level. Url reversing for sub-applications should generate urls with proper prefix. But for getting URL sub-application's router should be used:: admin = web.Application() admin.add_routes([web.get('/resource', handler, name='name')]) app.add_subapp('/admin/', admin) url = admin.router['name'].url_for() The generated ``url`` from example will have a value ``URL('/admin/resource')``. If main application should do URL reversing for sub-application it could use the following explicit technique:: admin = web.Application() admin.add_routes([web.get('/resource', handler, name='name')]) app.add_subapp('/admin/', admin) app['admin'] = admin async def handler(request): # main application's handler admin = request.app['admin'] url = admin.router['name'].url_for() .. _aiohttp-web-expect-header: *Expect* Header --------------- :mod:`aiohttp.web` supports *Expect* header. By default it sends ``HTTP/1.1 100 Continue`` line to client, or raises :exc:`HTTPExpectationFailed` if header value is not equal to "100-continue". It is possible to specify custom *Expect* header handler on per route basis. This handler gets called if *Expect* header exist in request after receiving all headers and before processing application's :ref:`aiohttp-web-middlewares` and route handler. Handler can return *None*, in that case the request processing continues as usual. If handler returns an instance of class :class:`StreamResponse`, *request handler* uses it as response. Also handler can raise a subclass of :exc:`HTTPException`. In this case all further processing will not happen and client will receive appropriate http response. .. note:: A server that does not understand or is unable to comply with any of the expectation values in the Expect field of a request MUST respond with appropriate error status. The server MUST respond with a 417 (Expectation Failed) status if any of the expectations cannot be met or, if there are other problems with the request, some other 4xx status. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.20 If all checks pass, the custom handler *must* write a *HTTP/1.1 100 Continue* status code before returning. The following example shows how to setup a custom handler for the *Expect* header:: async def check_auth(request): if request.version != aiohttp.HttpVersion11: return if request.headers.get('EXPECT') != '100-continue': raise HTTPExpectationFailed(text="Unknown Expect: %s" % expect) if request.headers.get('AUTHORIZATION') is None: raise HTTPForbidden() request.transport.write(b"HTTP/1.1 100 Continue\r\n\r\n") async def hello(request): return web.Response(body=b"Hello, world") app = web.Application() app.add_routes([web.add_get('/', hello, expect_handler=check_auth)]) .. _aiohttp-web-custom-resource: Custom resource implementation ------------------------------ To register custom resource use :meth:`~aiohttp.web.UrlDispatcher.register_resource`. Resource instance must implement `AbstractResource` interface. .. _aiohttp-web-app-runners: Application runners ------------------- :func:`run_app` provides a simple *blocking* API for running an :class:`Application`. For starting the application *asynchronously* or serving on multiple HOST/PORT :class:`AppRunner` exists. The simple startup code for serving HTTP site on ``'localhost'``, port ``8080`` looks like:: runner = web.AppRunner(app) await runner.setup() site = web.TCPSite(runner, 'localhost', 8080) await site.start() while True: await asyncio.sleep(3600) # sleep forever To stop serving call :meth:`AppRunner.cleanup`:: await runner.cleanup() .. versionadded:: 3.0 .. _aiohttp-web-graceful-shutdown: Graceful shutdown ------------------ Stopping *aiohttp web server* by just closing all connections is not always satisfactory. The problem is: if application supports :term:`websocket`\s or *data streaming* it most likely has open connections at server shutdown time. The *library* has no knowledge how to close them gracefully but developer can help by registering :attr:`Application.on_shutdown` signal handler and call the signal on *web server* closing. Developer should keep a list of opened connections (:class:`Application` is a good candidate). The following :term:`websocket` snippet shows an example for websocket handler:: from aiohttp import web import weakref app = web.Application() app['websockets'] = weakref.WeakSet() async def websocket_handler(request): ws = web.WebSocketResponse() await ws.prepare(request) request.app['websockets'].add(ws) try: async for msg in ws: ... finally: request.app['websockets'].discard(ws) return ws Signal handler may look like:: from aiohttp import WSCloseCode async def on_shutdown(app): for ws in set(app['websockets']): await ws.close(code=WSCloseCode.GOING_AWAY, message='Server shutdown') app.on_shutdown.append(on_shutdown) Both :func:`run_app` and :meth:`AppRunner.cleanup` call shutdown signal handlers. .. _aiohttp-web-background-tasks: Background tasks ----------------- Sometimes there's a need to perform some asynchronous operations just after application start-up. Even more, in some sophisticated systems there could be a need to run some background tasks in the event loop along with the application's request handler. Such as listening to message queue or other network message/event sources (e.g. ZeroMQ, Redis Pub/Sub, AMQP, etc.) to react to received messages within the application. For example the background task could listen to ZeroMQ on ``zmq.SUB`` socket, process and forward retrieved messages to clients connected via WebSocket that are stored somewhere in the application (e.g. in the ``application['websockets']`` list). To run such short and long running background tasks aiohttp provides an ability to register :attr:`Application.on_startup` signal handler(s) that will run along with the application's request handler. For example there's a need to run one quick task and two long running tasks that will live till the application is alive. The appropriate background tasks could be registered as an :attr:`Application.on_startup` signal handlers as shown in the example below:: async def listen_to_redis(app): try: sub = await aioredis.create_redis(('localhost', 6379)) ch, *_ = await sub.subscribe('news') async for msg in ch.iter(encoding='utf-8'): # Forward message to all connected websockets: for ws in app['websockets']: ws.send_str('{}: {}'.format(ch.name, msg)) except asyncio.CancelledError: pass finally: await sub.unsubscribe(ch.name) await sub.quit() async def start_background_tasks(app): app['redis_listener'] = asyncio.create_task(listen_to_redis(app)) async def cleanup_background_tasks(app): app['redis_listener'].cancel() await app['redis_listener'] app = web.Application() app.on_startup.append(start_background_tasks) app.on_cleanup.append(cleanup_background_tasks) web.run_app(app) The task ``listen_to_redis`` will run forever. To shut it down correctly :attr:`Application.on_cleanup` signal handler may be used to send a cancellation to it. .. _aiohttp-web-complex-applications: Complex Applications ^^^^^^^^^^^^^^^^^^^^ Sometimes aiohttp is not the sole part of an application and additional tasks/processes may need to be run alongside the aiohttp :class:`Application`. Generally, the best way to achieve this is to use :func:`aiohttp.web.run_app` as the entry point for the program. Other tasks can then be run via :attr:`Application.startup` and :attr:`Application.on_cleanup`. By having the :class:`Application` control the lifecycle of the entire program, the code will be more robust and ensure that the tasks are started and stopped along with the application. For example, running a long-lived task alongside the :class:`Application` can be done with a :ref:`aiohttp-web-cleanup-ctx` function like:: async def run_other_task(_app): task = asyncio.create_task(other_long_task()) yield task.cancel() with suppress(asyncio.CancelledError): await task # Ensure any exceptions etc. are raised. app.cleanup_ctx.append(run_other_task) Or a separate process can be run with something like:: async def run_process(_app): proc = await asyncio.create_subprocess_exec(path) yield if proc.returncode is None: proc.terminate() await proc.wait() app.cleanup_ctx.append(run_process) Handling error pages -------------------- Pages like *404 Not Found* and *500 Internal Error* could be handled by custom middleware, see :ref:`polls demo ` for example. .. _aiohttp-web-forwarded-support: Deploying behind a Proxy ------------------------ As discussed in :ref:`aiohttp-deployment` the preferable way is deploying *aiohttp* web server behind a *Reverse Proxy Server* like :term:`nginx` for production usage. In this way properties like :attr:`BaseRequest.scheme` :attr:`BaseRequest.host` and :attr:`BaseRequest.remote` are incorrect. Real values should be given from proxy server, usually either ``Forwarded`` or old-fashion ``X-Forwarded-For``, ``X-Forwarded-Host``, ``X-Forwarded-Proto`` HTTP headers are used. *aiohttp* does not take *forwarded* headers into account by default because it produces *security issue*: HTTP client might add these headers too, pushing non-trusted data values. That's why *aiohttp server* should setup *forwarded* headers in custom middleware in tight conjunction with *reverse proxy configuration*. For changing :attr:`BaseRequest.scheme` :attr:`BaseRequest.host` and :attr:`BaseRequest.remote` the middleware might use :meth:`BaseRequest.clone`. .. seealso:: https://github.com/aio-libs/aiohttp-remotes provides secure helpers for modifying *scheme*, *host* and *remote* attributes according to ``Forwarded`` and ``X-Forwarded-*`` HTTP headers. Swagger support --------------- `aiohttp-swagger `_ is a library that allow to add Swagger documentation and embed the Swagger-UI into your :mod:`aiohttp.web` project. CORS support ------------ :mod:`aiohttp.web` itself does not support `Cross-Origin Resource Sharing `_, but there is an aiohttp plugin for it: `aiohttp_cors `_. Debug Toolbar ------------- `aiohttp-debugtoolbar`_ is a very useful library that provides a debugging toolbar while you're developing an :mod:`aiohttp.web` application. Install it with ``pip``: .. code-block:: shell $ pip install aiohttp_debugtoolbar Just call :func:`aiohttp_debugtoolbar.setup`:: import aiohttp_debugtoolbar from aiohttp_debugtoolbar import toolbar_middleware_factory app = web.Application() aiohttp_debugtoolbar.setup(app) The toolbar is ready to use. Enjoy!!! .. _aiohttp-debugtoolbar: https://github.com/aio-libs/aiohttp_debugtoolbar Dev Tools --------- `aiohttp-devtools`_ provides a couple of tools to simplify development of :mod:`aiohttp.web` applications. Install with ``pip``: .. code-block:: shell $ pip install aiohttp-devtools * ``runserver`` provides a development server with auto-reload, live-reload, static file serving and `aiohttp-debugtoolbar`_ integration. * ``start`` is a `cookiecutter command which does the donkey work of creating new :mod:`aiohttp.web` Applications. Documentation and a complete tutorial of creating and running an app locally are available at `aiohttp-devtools`_. .. _aiohttp-devtools: https://github.com/aio-libs/aiohttp-devtools ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/web_lowlevel.rst0000644000175100001710000000520200000000000016702 0ustar00runnerdocker.. _aiohttp-web-lowlevel: Low Level Server ================ .. currentmodule:: aiohttp.web This topic describes :mod:`aiohttp.web` based *low level* API. Abstract -------- Sometimes user don't need high-level concepts introduced in :ref:`aiohttp-web`: applications, routers, middlewares and signals. All what is needed is supporting asynchronous callable which accepts a request and returns a response object. This is done by introducing :class:`aiohttp.web.Server` class which serves a *protocol factory* role for :meth:`asyncio.loop.create_server` and bridges data stream to *web handler* and sends result back. Low level *web handler* should accept the single :class:`BaseRequest` parameter and performs one of the following actions: 1. Return a :class:`Response` with the whole HTTP body stored in memory. 2. Create a :class:`StreamResponse`, send headers by :meth:`StreamResponse.prepare` call, send data chunks by :meth:`StreamResponse.write` and return finished response. 3. Raise :class:`HTTPException` derived exception (see :ref:`aiohttp-web-exceptions` section). All other exceptions not derived from :class:`HTTPException` leads to *500 Internal Server Error* response. 4. Initiate and process Web-Socket connection by :class:`WebSocketResponse` using (see :ref:`aiohttp-web-websockets`). Run a Basic Low-Level Server ---------------------------- The following code demonstrates very trivial usage example:: import asyncio from aiohttp import web async def handler(request): return web.Response(text="OK") async def main(): server = web.Server(handler) runner = web.ServerRunner(server) await runner.setup() site = web.TCPSite(runner, 'localhost', 8080) await site.start() print("======= Serving on http://127.0.0.1:8080/ ======") # pause here for very long time by serving HTTP requests and # waiting for keyboard interruption await asyncio.sleep(100*3600) loop = asyncio.get_event_loop() try: loop.run_until_complete(main()) except KeyboardInterrupt: pass loop.close() In the snippet we have ``handler`` which returns a regular :class:`Response` with ``"OK"`` in BODY. This *handler* is processed by ``server`` (:class:`Server` which acts as *protocol factory*). Network communication is created by :ref:`runners API ` to serve ``http://127.0.0.1:8080/``. The handler should process every request for every *path*, e.g. ``GET``, ``POST``, Web-Socket. The example is very basic: it always return ``200 OK`` response, real life code is much more complex usually. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/web_quickstart.rst0000644000175100001710000005462300000000000017256 0ustar00runnerdocker.. _aiohttp-web-quickstart: Web Server Quickstart ===================== .. currentmodule:: aiohttp.web Run a Simple Web Server ----------------------- In order to implement a web server, first create a :ref:`request handler `. A request handler must be a :ref:`coroutine ` that accepts a :class:`Request` instance as its only parameter and returns a :class:`Response` instance:: from aiohttp import web async def hello(request): return web.Response(text="Hello, world") Next, create an :class:`Application` instance and register the request handler on a particular *HTTP method* and *path*:: app = web.Application() app.add_routes([web.get('/', hello)]) After that, run the application by :func:`run_app` call:: web.run_app(app) That's it. Now, head over to ``http://localhost:8080/`` to see the results. Alternatively if you prefer *route decorators* create a *route table* and register a :term:`web-handler`:: routes = web.RouteTableDef() @routes.get('/') async def hello(request): return web.Response(text="Hello, world") app = web.Application() app.add_routes(routes) web.run_app(app) Both ways essentially do the same work, the difference is only in your taste: do you prefer *Django style* with famous ``urls.py`` or *Flask* with shiny route decorators. *aiohttp* server documentation uses both ways in code snippets to emphasize their equality, switching from one style to another is very trivial. .. seealso:: :ref:`aiohttp-web-graceful-shutdown` section explains what :func:`run_app` does and how to implement complex server initialization/finalization from scratch. :ref:`aiohttp-web-app-runners` for more handling more complex cases like *asynchronous* web application serving and multiple hosts support. .. _aiohttp-web-cli: Command Line Interface (CLI) ---------------------------- :mod:`aiohttp.web` implements a basic CLI for quickly serving an :class:`Application` in *development* over TCP/IP: .. code-block:: shell $ python -m aiohttp.web -H localhost -P 8080 package.module:init_func ``package.module:init_func`` should be an importable :term:`callable` that accepts a list of any non-parsed command-line arguments and returns an :class:`Application` instance after setting it up:: def init_func(argv): app = web.Application() app.router.add_get("/", index_handler) return app .. _aiohttp-web-handler: Handler ------- A request handler must be a :ref:`coroutine` that accepts a :class:`Request` instance as its only argument and returns a :class:`StreamResponse` derived (e.g. :class:`Response`) instance:: async def handler(request): return web.Response() Handlers are setup to handle requests by registering them with the :meth:`Application.add_routes` on a particular route (*HTTP method* and *path* pair) using helpers like :func:`get` and :func:`post`:: app.add_routes([web.get('/', handler), web.post('/post', post_handler), web.put('/put', put_handler)]) Or use *route decorators*:: routes = web.RouteTableDef() @routes.get('/') async def get_handler(request): ... @routes.post('/post') async def post_handler(request): ... @routes.put('/put') async def put_handler(request): ... app.add_routes(routes) Wildcard *HTTP method* is also supported by :func:`route` or :meth:`RouteTableDef.route`, allowing a handler to serve incoming requests on a *path* having **any** *HTTP method*:: app.add_routes([web.route('*', '/path', all_handler)]) The *HTTP method* can be queried later in the request handler using the :attr:`aiohttp.web.BaseRequest.method` property. By default endpoints added with ``GET`` method will accept ``HEAD`` requests and return the same response headers as they would for a ``GET`` request. You can also deny ``HEAD`` requests on a route:: web.get('/', handler, allow_head=False) Here ``handler`` won't be called on ``HEAD`` request and the server will respond with ``405: Method Not Allowed``. .. _aiohttp-web-resource-and-route: Resources and Routes -------------------- Internally routes are served by :attr:`Application.router` (:class:`UrlDispatcher` instance). The *router* is a list of *resources*. Resource is an entry in *route table* which corresponds to requested URL. Resource in turn has at least one *route*. Route corresponds to handling *HTTP method* by calling *web handler*. Thus when you add a *route* the *resouce* object is created under the hood. The library implementation **merges** all subsequent route additions for the same path adding the only resource for all HTTP methods. Consider two examples:: app.add_routes([web.get('/path1', get_1), web.post('/path1', post_1), web.get('/path2', get_2), web.post('/path2', post_2)] and:: app.add_routes([web.get('/path1', get_1), web.get('/path2', get_2), web.post('/path2', post_2), web.post('/path1', post_1)] First one is *optimized*. You have got the idea. .. _aiohttp-web-variable-handler: Variable Resources ^^^^^^^^^^^^^^^^^^ Resource may have *variable path* also. For instance, a resource with the path ``'/a/{name}/c'`` would match all incoming requests with paths such as ``'/a/b/c'``, ``'/a/1/c'``, and ``'/a/etc/c'``. A variable *part* is specified in the form ``{identifier}``, where the ``identifier`` can be used later in a :ref:`request handler ` to access the matched value for that *part*. This is done by looking up the ``identifier`` in the :attr:`Request.match_info` mapping:: @routes.get('/{name}') async def variable_handler(request): return web.Response( text="Hello, {}".format(request.match_info['name'])) By default, each *part* matches the regular expression ``[^{}/]+``. You can also specify a custom regex in the form ``{identifier:regex}``:: web.get(r'/{name:\d+}', handler) .. _aiohttp-web-named-routes: Reverse URL Constructing using Named Resources ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Routes can also be given a *name*:: @routes.get('/root', name='root') async def handler(request): ... Which can then be used to access and build a *URL* for that resource later (e.g. in a :ref:`request handler `):: url = request.app.router['root'].url_for().with_query({"a": "b", "c": "d"}) assert url == URL('/root?a=b&c=d') A more interesting example is building *URLs* for :ref:`variable resources `:: app.router.add_resource(r'/{user}/info', name='user-info') In this case you can also pass in the *parts* of the route:: url = request.app.router['user-info'].url_for(user='john_doe') url_with_qs = url.with_query("a=b") assert url_with_qs == '/john_doe/info?a=b' Organizing Handlers in Classes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As discussed above, :ref:`handlers ` can be first-class coroutines:: async def hello(request): return web.Response(text="Hello, world") app.router.add_get('/', hello) But sometimes it's convenient to group logically similar handlers into a Python *class*. Since :mod:`aiohttp.web` does not dictate any implementation details, application developers can organize handlers in classes if they so wish:: class Handler: def __init__(self): pass async def handle_intro(self, request): return web.Response(text="Hello, world") async def handle_greeting(self, request): name = request.match_info.get('name', "Anonymous") txt = "Hello, {}".format(name) return web.Response(text=txt) handler = Handler() app.add_routes([web.get('/intro', handler.handle_intro), web.get('/greet/{name}', handler.handle_greeting)]) .. _aiohttp-web-class-based-views: Class Based Views ^^^^^^^^^^^^^^^^^ :mod:`aiohttp.web` has support for *class based views*. You can derive from :class:`View` and define methods for handling http requests:: class MyView(web.View): async def get(self): return await get_resp(self.request) async def post(self): return await post_resp(self.request) Handlers should be coroutines accepting *self* only and returning response object as regular :term:`web-handler`. Request object can be retrieved by :attr:`View.request` property. After implementing the view (``MyView`` from example above) should be registered in application's router:: web.view('/path/to', MyView) or:: @routes.view('/path/to') class MyView(web.View): ... Example will process GET and POST requests for */path/to* but raise *405 Method not allowed* exception for unimplemented HTTP methods. Resource Views ^^^^^^^^^^^^^^ *All* registered resources in a router can be viewed using the :meth:`UrlDispatcher.resources` method:: for resource in app.router.resources(): print(resource) A *subset* of the resources that were registered with a *name* can be viewed using the :meth:`UrlDispatcher.named_resources` method:: for name, resource in app.router.named_resources().items(): print(name, resource) .. _aiohttp-web-alternative-routes-definition: Alternative ways for registering routes --------------------------------------- Code examples shown above use *imperative* style for adding new routes: they call ``app.router.add_get(...)`` etc. There are two alternatives: route tables and route decorators. Route tables look like Django way:: async def handle_get(request): ... async def handle_post(request): ... app.router.add_routes([web.get('/get', handle_get), web.post('/post', handle_post), The snippet calls :meth:`~aiohttp.web.UrlDispatcher.add_routes` to register a list of *route definitions* (:class:`aiohttp.web.RouteDef` instances) created by :func:`aiohttp.web.get` or :func:`aiohttp.web.post` functions. .. seealso:: :ref:`aiohttp-web-route-def` reference. Route decorators are closer to Flask approach:: routes = web.RouteTableDef() @routes.get('/get') async def handle_get(request): ... @routes.post('/post') async def handle_post(request): ... app.router.add_routes(routes) It is also possible to use decorators with class-based views:: routes = web.RouteTableDef() @routes.view("/view") class MyView(web.View): async def get(self): ... async def post(self): ... app.router.add_routes(routes) The example creates a :class:`aiohttp.web.RouteTableDef` container first. The container is a list-like object with additional decorators :meth:`aiohttp.web.RouteTableDef.get`, :meth:`aiohttp.web.RouteTableDef.post` etc. for registering new routes. After filling the container :meth:`~aiohttp.web.UrlDispatcher.add_routes` is used for adding registered *route definitions* into application's router. .. seealso:: :ref:`aiohttp-web-route-table-def` reference. All tree ways (imperative calls, route tables and decorators) are equivalent, you could use what do you prefer or even mix them on your own. .. versionadded:: 2.3 JSON Response ------------- It is a common case to return JSON data in response, :mod:`aiohttp.web` provides a shortcut for returning JSON -- :func:`aiohttp.web.json_response`:: async def handler(request): data = {'some': 'data'} return web.json_response(data) The shortcut method returns :class:`aiohttp.web.Response` instance so you can for example set cookies before returning it from handler. User Sessions ------------- Often you need a container for storing user data across requests. The concept is usually called a *session*. :mod:`aiohttp.web` has no built-in concept of a *session*, however, there is a third-party library, :mod:`aiohttp_session`, that adds *session* support:: import asyncio import time import base64 from cryptography import fernet from aiohttp import web from aiohttp_session import setup, get_session, session_middleware from aiohttp_session.cookie_storage import EncryptedCookieStorage async def handler(request): session = await get_session(request) last_visit = session['last_visit'] if 'last_visit' in session else None text = 'Last visited: {}'.format(last_visit) return web.Response(text=text) async def make_app(): app = web.Application() # secret_key must be 32 url-safe base64-encoded bytes fernet_key = fernet.Fernet.generate_key() secret_key = base64.urlsafe_b64decode(fernet_key) setup(app, EncryptedCookieStorage(secret_key)) app.add_routes([web.get('/', handler)]) return app web.run_app(make_app()) .. _aiohttp-web-forms: HTTP Forms ---------- HTTP Forms are supported out of the box. If form's method is ``"GET"`` (``
    ``) use :attr:`aiohttp.web.BaseRequest.query` for getting form data. To access form data with ``"POST"`` method use :meth:`aiohttp.web.BaseRequest.post` or :meth:`aiohttp.web.BaseRequest.multipart`. :meth:`aiohttp.web.BaseRequest.post` accepts both ``'application/x-www-form-urlencoded'`` and ``'multipart/form-data'`` form's data encoding (e.g. ````). It stores files data in temporary directory. If `client_max_size` is specified `post` raises `ValueError` exception. For efficiency use :meth:`aiohttp.web.BaseRequest.multipart`, It is especially effective for uploading large files (:ref:`aiohttp-web-file-upload`). Values submitted by the following form: .. code-block:: html
    could be accessed as:: async def do_login(request): data = await request.post() login = data['login'] password = data['password'] .. _aiohttp-web-file-upload: File Uploads ------------ :mod:`aiohttp.web` has built-in support for handling files uploaded from the browser. First, make sure that the HTML ``
    `` element has its *enctype* attribute set to ``enctype="multipart/form-data"``. As an example, here is a form that accepts an MP3 file: .. code-block:: html
    Then, in the :ref:`request handler ` you can access the file input field as a :class:`FileField` instance. :class:`FileField` is simply a container for the file as well as some of its metadata:: async def store_mp3_handler(request): # WARNING: don't do that if you plan to receive large files! data = await request.post() mp3 = data['mp3'] # .filename contains the name of the file in string format. filename = mp3.filename # .file contains the actual file data that needs to be stored somewhere. mp3_file = data['mp3'].file content = mp3_file.read() return web.Response(body=content, headers=MultiDict( {'CONTENT-DISPOSITION': mp3_file})) You might have noticed a big warning in the example above. The general issue is that :meth:`aiohttp.web.BaseRequest.post` reads the whole payload in memory, resulting in possible :abbr:`OOM (Out Of Memory)` errors. To avoid this, for multipart uploads, you should use :meth:`aiohttp.web.BaseRequest.multipart` which returns a :ref:`multipart reader `:: async def store_mp3_handler(request): reader = await request.multipart() # /!\ Don't forget to validate your inputs /!\ # reader.next() will `yield` the fields of your form field = await reader.next() assert field.name == 'name' name = await field.read(decode=True) field = await reader.next() assert field.name == 'mp3' filename = field.filename # You cannot rely on Content-Length if transfer is chunked. size = 0 with open(os.path.join('/spool/yarrr-media/mp3/', filename), 'wb') as f: while True: chunk = await field.read_chunk() # 8192 bytes by default. if not chunk: break size += len(chunk) f.write(chunk) return web.Response(text='{} sized of {} successfully stored' ''.format(filename, size)) .. _aiohttp-web-websockets: WebSockets ---------- :mod:`aiohttp.web` supports *WebSockets* out-of-the-box. To setup a *WebSocket*, create a :class:`WebSocketResponse` in a :ref:`request handler ` and then use it to communicate with the peer:: async def websocket_handler(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: if msg.type == aiohttp.WSMsgType.TEXT: if msg.data == 'close': await ws.close() else: await ws.send_str(msg.data + '/answer') elif msg.type == aiohttp.WSMsgType.ERROR: print('ws connection closed with exception %s' % ws.exception()) print('websocket connection closed') return ws The handler should be registered as HTTP GET processor:: app.add_routes([web.get('/ws', websocket_handler)]) .. _aiohttp-web-redirects: Redirects --------- To redirect user to another endpoint - raise :class:`HTTPFound` with an absolute URL, relative URL or view name (the argument from router):: raise web.HTTPFound('/redirect') The following example shows redirect to view named 'login' in routes:: async def handler(request): location = request.app.router['login'].url_for() raise web.HTTPFound(location=location) router.add_get('/handler', handler) router.add_get('/login', login_handler, name='login') Example with login validation:: @aiohttp_jinja2.template('login.html') async def login(request): if request.method == 'POST': form = await request.post() error = validate_login(form) if error: return {'error': error} else: # login form is valid location = request.app.router['index'].url_for() raise web.HTTPFound(location=location) return {} app.router.add_get('/', index, name='index') app.router.add_get('/login', login, name='login') app.router.add_post('/login', login, name='login') .. _aiohttp-web-exceptions: Exceptions ---------- :mod:`aiohttp.web` defines a set of exceptions for every *HTTP status code*. Each exception is a subclass of :class:`~HTTPException` and relates to a single HTTP status code:: async def handler(request): raise aiohttp.web.HTTPFound('/redirect') .. warning:: Returning :class:`~HTTPException` or its subclasses is deprecated and will be removed in subsequent aiohttp versions. Each exception class has a status code according to :rfc:`2068`: codes with 100-300 are not really errors; 400s are client errors, and 500s are server errors. HTTP Exception hierarchy chart:: Exception HTTPException HTTPSuccessful * 200 - HTTPOk * 201 - HTTPCreated * 202 - HTTPAccepted * 203 - HTTPNonAuthoritativeInformation * 204 - HTTPNoContent * 205 - HTTPResetContent * 206 - HTTPPartialContent HTTPRedirection * 300 - HTTPMultipleChoices * 301 - HTTPMovedPermanently * 302 - HTTPFound * 303 - HTTPSeeOther * 304 - HTTPNotModified * 305 - HTTPUseProxy * 307 - HTTPTemporaryRedirect * 308 - HTTPPermanentRedirect HTTPError HTTPClientError * 400 - HTTPBadRequest * 401 - HTTPUnauthorized * 402 - HTTPPaymentRequired * 403 - HTTPForbidden * 404 - HTTPNotFound * 405 - HTTPMethodNotAllowed * 406 - HTTPNotAcceptable * 407 - HTTPProxyAuthenticationRequired * 408 - HTTPRequestTimeout * 409 - HTTPConflict * 410 - HTTPGone * 411 - HTTPLengthRequired * 412 - HTTPPreconditionFailed * 413 - HTTPRequestEntityTooLarge * 414 - HTTPRequestURITooLong * 415 - HTTPUnsupportedMediaType * 416 - HTTPRequestRangeNotSatisfiable * 417 - HTTPExpectationFailed * 421 - HTTPMisdirectedRequest * 422 - HTTPUnprocessableEntity * 424 - HTTPFailedDependency * 426 - HTTPUpgradeRequired * 428 - HTTPPreconditionRequired * 429 - HTTPTooManyRequests * 431 - HTTPRequestHeaderFieldsTooLarge * 451 - HTTPUnavailableForLegalReasons HTTPServerError * 500 - HTTPInternalServerError * 501 - HTTPNotImplemented * 502 - HTTPBadGateway * 503 - HTTPServiceUnavailable * 504 - HTTPGatewayTimeout * 505 - HTTPVersionNotSupported * 506 - HTTPVariantAlsoNegotiates * 507 - HTTPInsufficientStorage * 510 - HTTPNotExtended * 511 - HTTPNetworkAuthenticationRequired All HTTP exceptions have the same constructor signature:: HTTPNotFound(*, headers=None, reason=None, body=None, text=None, content_type=None) If not directly specified, *headers* will be added to the *default response headers*. Classes :class:`HTTPMultipleChoices`, :class:`HTTPMovedPermanently`, :class:`HTTPFound`, :class:`HTTPSeeOther`, :class:`HTTPUseProxy`, :class:`HTTPTemporaryRedirect` have the following constructor signature:: HTTPFound(location, *, headers=None, reason=None, body=None, text=None, content_type=None) where *location* is value for *Location HTTP header*. :class:`HTTPMethodNotAllowed` is constructed by providing the incoming unsupported method and list of allowed methods:: HTTPMethodNotAllowed(method, allowed_methods, *, headers=None, reason=None, body=None, text=None, content_type=None) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/web_reference.rst0000644000175100001710000027403200000000000017020 0ustar00runnerdocker.. _aiohttp-web-reference: Server Reference ================ .. currentmodule:: aiohttp.web .. _aiohttp-web-request: Request and Base Request ------------------------ The Request object contains all the information about an incoming HTTP request. :class:`BaseRequest` is used for :ref:`Low-Level Servers` (which have no applications, routers, signals and middlewares). :class:`Request` has an :attr:`Request.app` and :attr:`Request.match_info` attributes. A :class:`BaseRequest` / :class:`Request` are :obj:`dict` like objects, allowing them to be used for :ref:`sharing data` among :ref:`aiohttp-web-middlewares` and :ref:`aiohttp-web-signals` handlers. .. class:: BaseRequest .. attribute:: version *HTTP version* of request, Read-only property. Returns :class:`aiohttp.protocol.HttpVersion` instance. .. attribute:: method *HTTP method*, read-only property. The value is upper-cased :class:`str` like ``"GET"``, ``"POST"``, ``"PUT"`` etc. .. attribute:: url A :class:`~yarl.URL` instance with absolute URL to resource (*scheme*, *host* and *port* are included). .. note:: In case of malformed request (e.g. without ``"HOST"`` HTTP header) the absolute url may be unavailable. .. attribute:: rel_url A :class:`~yarl.URL` instance with relative URL to resource (contains *path*, *query* and *fragment* parts only, *scheme*, *host* and *port* are excluded). The property is equal to ``.url.relative()`` but is always present. .. seealso:: A note from :attr:`url`. .. attribute:: scheme A string representing the scheme of the request. The scheme is ``'https'`` if transport for request handling is *SSL*, ``'http'`` otherwise. The value could be overridden by :meth:`~BaseRequest.clone`. Read-only :class:`str` property. .. versionchanged:: 2.3 *Forwarded* and *X-Forwarded-Proto* are not used anymore. Call ``.clone(scheme=new_scheme)`` for setting up the value explicitly. .. seealso:: :ref:`aiohttp-web-forwarded-support` .. attribute:: secure Shorthand for ``request.url.scheme == 'https'`` Read-only :class:`bool` property. .. seealso:: :attr:`scheme` .. attribute:: forwarded A tuple containing all parsed Forwarded header(s). Makes an effort to parse Forwarded headers as specified by :rfc:`7239`: - It adds one (immutable) dictionary per Forwarded ``field-value``, i.e. per proxy. The element corresponds to the data in the Forwarded ``field-value`` added by the first proxy encountered by the client. Each subsequent item corresponds to those added by later proxies. - It checks that every value has valid syntax in general as specified in :rfc:`7239#section-4`: either a ``token`` or a ``quoted-string``. - It un-escapes ``quoted-pairs``. - It does NOT validate 'by' and 'for' contents as specified in :rfc:`7239#section-6`. - It does NOT validate ``host`` contents (Host ABNF). - It does NOT validate ``proto`` contents for valid URI scheme names. Returns a tuple containing one or more ``MappingProxy`` objects .. seealso:: :attr:`scheme` .. seealso:: :attr:`host` .. attribute:: host Host name of the request, resolved in this order: - Overridden value by :meth:`~BaseRequest.clone` call. - *Host* HTTP header - :func:`socket.getfqdn` Read-only :class:`str` property. .. versionchanged:: 2.3 *Forwarded* and *X-Forwarded-Host* are not used anymore. Call ``.clone(host=new_host)`` for setting up the value explicitly. .. seealso:: :ref:`aiohttp-web-forwarded-support` .. attribute:: remote Originating IP address of a client initiated HTTP request. The IP is resolved through the following headers, in this order: - Overridden value by :meth:`~BaseRequest.clone` call. - Peer name of opened socket. Read-only :class:`str` property. Call ``.clone(remote=new_remote)`` for setting up the value explicitly. .. versionadded:: 2.3 .. seealso:: :ref:`aiohttp-web-forwarded-support` .. attribute:: path_qs The URL including PATH_INFO and the query string. e.g., ``/app/blog?id=10`` Read-only :class:`str` property. .. attribute:: path The URL including *PATH INFO* without the host or scheme. e.g., ``/app/blog``. The path is URL-decoded. For raw path info see :attr:`raw_path`. Read-only :class:`str` property. .. attribute:: raw_path The URL including raw *PATH INFO* without the host or scheme. Warning, the path may be URL-encoded and may contain invalid URL characters, e.g. ``/my%2Fpath%7Cwith%21some%25strange%24characters``. For URL-decoded version please take a look on :attr:`path`. Read-only :class:`str` property. .. attribute:: query A multidict with all the variables in the query string. Read-only :class:`~multidict.MultiDictProxy` lazy property. .. attribute:: query_string The query string in the URL, e.g., ``id=10`` Read-only :class:`str` property. .. attribute:: headers A case-insensitive multidict proxy with all headers. Read-only :class:`~multidict.CIMultiDictProxy` property. .. attribute:: raw_headers HTTP headers of response as unconverted bytes, a sequence of ``(key, value)`` pairs. .. attribute:: keep_alive ``True`` if keep-alive connection enabled by HTTP client and protocol version supports it, otherwise ``False``. Read-only :class:`bool` property. .. attribute:: transport A :ref:`transport` used to process request. Read-only property. The property can be used, for example, for getting IP address of client's peer:: peername = request.transport.get_extra_info('peername') if peername is not None: host, port = peername .. attribute:: loop An event loop instance used by HTTP request handling. Read-only :class:`asyncio.AbstractEventLoop` property. .. deprecated:: 3.5 .. attribute:: cookies A read-only dictionary-like object containing the request's cookies. Read-only :class:`~types.MappingProxyType` property. .. attribute:: content A :class:`~aiohttp.StreamReader` instance, input stream for reading request's *BODY*. Read-only property. .. attribute:: body_exists Return ``True`` if request has *HTTP BODY*, ``False`` otherwise. Read-only :class:`bool` property. .. versionadded:: 2.3 .. attribute:: can_read_body Return ``True`` if request's *HTTP BODY* can be read, ``False`` otherwise. Read-only :class:`bool` property. .. versionadded:: 2.3 .. attribute:: has_body Return ``True`` if request's *HTTP BODY* can be read, ``False`` otherwise. Read-only :class:`bool` property. .. deprecated:: 2.3 Use :meth:`can_read_body` instead. .. attribute:: content_type Read-only property with *content* part of *Content-Type* header. Returns :class:`str` like ``'text/html'`` .. note:: Returns value is ``'application/octet-stream'`` if no Content-Type header present in HTTP headers according to :rfc:`2616` .. attribute:: charset Read-only property that specifies the *encoding* for the request's BODY. The value is parsed from the *Content-Type* HTTP header. Returns :class:`str` like ``'utf-8'`` or ``None`` if *Content-Type* has no charset information. .. attribute:: content_length Read-only property that returns length of the request's BODY. The value is parsed from the *Content-Length* HTTP header. Returns :class:`int` or ``None`` if *Content-Length* is absent. .. attribute:: http_range Read-only property that returns information about *Range* HTTP header. Returns a :class:`slice` where ``.start`` is *left inclusive bound*, ``.stop`` is *right exclusive bound* and ``.step`` is ``1``. The property might be used in two manners: 1. Attribute-access style (example assumes that both left and right borders are set, the real logic for case of open bounds is more complex):: rng = request.http_range with open(filename, 'rb') as f: f.seek(rng.start) return f.read(rng.stop-rng.start) 2. Slice-style:: return buffer[request.http_range] .. attribute:: if_modified_since Read-only property that returns the date specified in the *If-Modified-Since* header. Returns :class:`datetime.datetime` or ``None`` if *If-Modified-Since* header is absent or is not a valid HTTP date. .. attribute:: if_unmodified_since Read-only property that returns the date specified in the *If-Unmodified-Since* header. Returns :class:`datetime.datetime` or ``None`` if *If-Unmodified-Since* header is absent or is not a valid HTTP date. .. versionadded:: 3.1 .. attribute:: if_match Read-only property that returns :class:`~aiohttp.ETag` objects specified in the *If-Match* header. Returns :class:`tuple` of :class:`~aiohttp.ETag` or ``None`` if *If-Match* header is absent. .. versionadded:: 3.8 .. attribute:: if_none_match Read-only property that returns :class:`~aiohttp.ETag` objects specified *If-None-Match* header. Returns :class:`tuple` of :class:`~aiohttp.ETag` or ``None`` if *If-None-Match* header is absent. .. versionadded:: 3.8 .. attribute:: if_range Read-only property that returns the date specified in the *If-Range* header. Returns :class:`datetime.datetime` or ``None`` if *If-Range* header is absent or is not a valid HTTP date. .. versionadded:: 3.1 .. method:: clone(*, method=..., rel_url=..., headers=...) Clone itself with replacement some attributes. Creates and returns a new instance of Request object. If no parameters are given, an exact copy is returned. If a parameter is not passed, it will reuse the one from the current request object. :param str method: http method :param rel_url: url to use, :class:`str` or :class:`~yarl.URL` :param headers: :class:`~multidict.CIMultiDict` or compatible headers container. :return: a cloned :class:`Request` instance. .. method:: get_extra_info(name, default=None) Reads extra information from the protocol's transport. If no value associated with ``name`` is found, ``default`` is returned. :param str name: The key to look up in the transport extra information. :param default: Default value to be used when no value for ``name`` is found (default is ``None``). .. versionadded:: 3.7 .. comethod:: read() Read request body, returns :class:`bytes` object with body content. .. note:: The method **does** store read data internally, subsequent :meth:`~aiohttp.web.BaseRequest.read` call will return the same value. .. comethod:: text() Read request body, decode it using :attr:`charset` encoding or ``UTF-8`` if no encoding was specified in *MIME-type*. Returns :class:`str` with body content. .. note:: The method **does** store read data internally, subsequent :meth:`~aiohttp.web.BaseRequest.text` call will return the same value. .. comethod:: json(*, loads=json.loads) Read request body decoded as *json*. The method is just a boilerplate :ref:`coroutine ` implemented as:: async def json(self, *, loads=json.loads): body = await self.text() return loads(body) :param collections.abc.Callable loads: any :term:`callable` that accepts :class:`str` and returns :class:`dict` with parsed JSON (:func:`json.loads` by default). .. note:: The method **does** store read data internally, subsequent :meth:`~aiohttp.web.BaseRequest.json` call will return the same value. .. comethod:: multipart() Returns :class:`aiohttp.MultipartReader` which processes incoming *multipart* request. The method is just a boilerplate :ref:`coroutine ` implemented as:: async def multipart(self, *, reader=aiohttp.multipart.MultipartReader): return reader(self.headers, self._payload) This method is a coroutine for consistency with the else reader methods. .. warning:: The method **does not** store read data internally. That means once you exhausts multipart reader, you cannot get the request payload one more time. .. seealso:: :ref:`aiohttp-multipart` .. versionchanged:: 3.4 Dropped *reader* parameter. .. comethod:: post() A :ref:`coroutine ` that reads POST parameters from request body. Returns :class:`~multidict.MultiDictProxy` instance filled with parsed data. If :attr:`method` is not *POST*, *PUT*, *PATCH*, *TRACE* or *DELETE* or :attr:`content_type` is not empty or *application/x-www-form-urlencoded* or *multipart/form-data* returns empty multidict. .. note:: The method **does** store read data internally, subsequent :meth:`~aiohttp.web.BaseRequest.post` call will return the same value. .. comethod:: release() Release request. Eat unread part of HTTP BODY if present. .. note:: User code may never call :meth:`~aiohttp.web.BaseRequest.release`, all required work will be processed by :mod:`aiohttp.web` internal machinery. .. class:: Request A request used for receiving request's information by *web handler*. Every :ref:`handler` accepts a request instance as the first positional parameter. The class in derived from :class:`BaseRequest`, shares all parent's attributes and methods but has a couple of additional properties: .. attribute:: match_info Read-only property with :class:`~aiohttp.abc.AbstractMatchInfo` instance for result of route resolving. .. note:: Exact type of property depends on used router. If ``app.router`` is :class:`UrlDispatcher` the property contains :class:`UrlMappingMatchInfo` instance. .. attribute:: app An :class:`Application` instance used to call :ref:`request handler `, Read-only property. .. attribute:: config_dict A :class:`aiohttp.ChainMapProxy` instance for mapping all properties from the current application returned by :attr:`app` property and all its parents. .. seealso:: :ref:`aiohttp-web-data-sharing-app-config` .. versionadded:: 3.2 .. note:: You should never create the :class:`Request` instance manually -- :mod:`aiohttp.web` does it for you. But :meth:`~BaseRequest.clone` may be used for cloning *modified* request copy with changed *path*, *method* etc. .. _aiohttp-web-response: Response classes ---------------- For now, :mod:`aiohttp.web` has three classes for the *HTTP response*: :class:`StreamResponse`, :class:`Response` and :class:`FileResponse`. Usually you need to use the second one. :class:`StreamResponse` is intended for streaming data, while :class:`Response` contains *HTTP BODY* as an attribute and sends own content as single piece with the correct *Content-Length HTTP header*. For sake of design decisions :class:`Response` is derived from :class:`StreamResponse` parent class. The response supports *keep-alive* handling out-of-the-box if *request* supports it. You can disable *keep-alive* by :meth:`~StreamResponse.force_close` though. The common case for sending an answer from :ref:`web-handler` is returning a :class:`Response` instance:: async def handler(request): return Response(text="All right!") Response classes are :obj:`dict` like objects, allowing them to be used for :ref:`sharing data` among :ref:`aiohttp-web-middlewares` and :ref:`aiohttp-web-signals` handlers:: resp['key'] = value .. versionadded:: 3.0 Dict-like interface support. StreamResponse ^^^^^^^^^^^^^^ .. class:: StreamResponse(*, status=200, reason=None) The base class for the *HTTP response* handling. Contains methods for setting *HTTP response headers*, *cookies*, *response status code*, writing *HTTP response BODY* and so on. The most important thing you should know about *response* --- it is *Finite State Machine*. That means you can do any manipulations with *headers*, *cookies* and *status code* only before :meth:`prepare` coroutine is called. Once you call :meth:`prepare` any change of the *HTTP header* part will raise :exc:`RuntimeError` exception. Any :meth:`write` call after :meth:`write_eof` is also forbidden. :param int status: HTTP status code, ``200`` by default. :param str reason: HTTP reason. If param is ``None`` reason will be calculated basing on *status* parameter. Otherwise pass :class:`str` with arbitrary *status* explanation.. .. attribute:: prepared Read-only :class:`bool` property, ``True`` if :meth:`prepare` has been called, ``False`` otherwise. .. attribute:: task A task that serves HTTP request handling. May be useful for graceful shutdown of long-running requests (streaming, long polling or web-socket). .. attribute:: status Read-only property for *HTTP response status code*, :class:`int`. ``200`` (OK) by default. .. attribute:: reason Read-only property for *HTTP response reason*, :class:`str`. .. method:: set_status(status, reason=None) Set :attr:`status` and :attr:`reason`. *reason* value is auto calculated if not specified (``None``). .. attribute:: keep_alive Read-only property, copy of :attr:`aiohttp.web.BaseRequest.keep_alive` by default. Can be switched to ``False`` by :meth:`force_close` call. .. method:: force_close Disable :attr:`keep_alive` for connection. There are no ways to enable it back. .. attribute:: compression Read-only :class:`bool` property, ``True`` if compression is enabled. ``False`` by default. .. seealso:: :meth:`enable_compression` .. method:: enable_compression(force=None) Enable compression. When *force* is unset compression encoding is selected based on the request's *Accept-Encoding* header. *Accept-Encoding* is not checked if *force* is set to a :class:`ContentCoding`. .. seealso:: :attr:`compression` .. attribute:: chunked Read-only property, indicates if chunked encoding is on. Can be enabled by :meth:`enable_chunked_encoding` call. .. seealso:: :attr:`enable_chunked_encoding` .. method:: enable_chunked_encoding Enables :attr:`chunked` encoding for response. There are no ways to disable it back. With enabled :attr:`chunked` encoding each :meth:`write` operation encoded in separate chunk. .. warning:: chunked encoding can be enabled for ``HTTP/1.1`` only. Setting up both :attr:`content_length` and chunked encoding is mutually exclusive. .. seealso:: :attr:`chunked` .. attribute:: headers :class:`~multidict.CIMultiDict` instance for *outgoing* *HTTP headers*. .. attribute:: cookies An instance of :class:`http.cookies.SimpleCookie` for *outgoing* cookies. .. warning:: Direct setting up *Set-Cookie* header may be overwritten by explicit calls to cookie manipulation. We are encourage using of :attr:`cookies` and :meth:`set_cookie`, :meth:`del_cookie` for cookie manipulations. .. method:: set_cookie(name, value, *, path='/', expires=None, \ domain=None, max_age=None, \ secure=None, httponly=None, version=None, \ samesite=None) Convenient way for setting :attr:`cookies`, allows to specify some additional properties like *max_age* in a single call. :param str name: cookie name :param str value: cookie value (will be converted to :class:`str` if value has another type). :param expires: expiration date (optional) :param str domain: cookie domain (optional) :param int max_age: defines the lifetime of the cookie, in seconds. The delta-seconds value is a decimal non- negative integer. After delta-seconds seconds elapse, the client should discard the cookie. A value of zero means the cookie should be discarded immediately. (optional) :param str path: specifies the subset of URLs to which this cookie applies. (optional, ``'/'`` by default) :param bool secure: attribute (with no value) directs the user agent to use only (unspecified) secure means to contact the origin server whenever it sends back this cookie. The user agent (possibly under the user's control) may determine what level of security it considers appropriate for "secure" cookies. The *secure* should be considered security advice from the server to the user agent, indicating that it is in the session's interest to protect the cookie contents. (optional) :param bool httponly: ``True`` if the cookie HTTP only (optional) :param int version: a decimal integer, identifies to which version of the state management specification the cookie conforms. (optional) :param str samesite: Asserts that a cookie must not be sent with cross-origin requests, providing some protection against cross-site request forgery attacks. Generally the value should be one of: ``None``, ``Lax`` or ``Strict``. (optional) .. versionadded:: 3.7 .. warning:: In HTTP version 1.1, ``expires`` was deprecated and replaced with the easier-to-use ``max-age``, but Internet Explorer (IE6, IE7, and IE8) **does not** support ``max-age``. .. method:: del_cookie(name, *, path='/', domain=None) Deletes cookie. :param str name: cookie name :param str domain: optional cookie domain :param str path: optional cookie path, ``'/'`` by default .. attribute:: content_length *Content-Length* for outgoing response. .. attribute:: content_type *Content* part of *Content-Type* for outgoing response. .. attribute:: charset *Charset* aka *encoding* part of *Content-Type* for outgoing response. The value converted to lower-case on attribute assigning. .. attribute:: last_modified *Last-Modified* header for outgoing response. This property accepts raw :class:`str` values, :class:`datetime.datetime` objects, Unix timestamps specified as an :class:`int` or a :class:`float` object, and the value ``None`` to unset the header. .. attribute:: etag *ETag* header for outgoing response. This property accepts raw :class:`str` values, :class:`~aiohttp.ETag` objects and the value ``None`` to unset the header. In case of :class:`str` input, etag is considered as strong by default. **Do not** use double quotes ``"`` in the etag value, they will be added automatically. .. versionadded:: 3.8 .. comethod:: prepare(request) :param aiohttp.web.Request request: HTTP request object, that the response answers. Send *HTTP header*. You should not change any header data after calling this method. The coroutine calls :attr:`~aiohttp.web.Application.on_response_prepare` signal handlers after default headers have been computed and directly before headers are sent. .. comethod:: write(data) Send byte-ish data as the part of *response BODY*:: await resp.write(data) :meth:`prepare` must be invoked before the call. Raises :exc:`TypeError` if data is not :class:`bytes`, :class:`bytearray` or :class:`memoryview` instance. Raises :exc:`RuntimeError` if :meth:`prepare` has not been called. Raises :exc:`RuntimeError` if :meth:`write_eof` has been called. .. comethod:: write_eof() A :ref:`coroutine` *may* be called as a mark of the *HTTP response* processing finish. *Internal machinery* will call this method at the end of the request processing if needed. After :meth:`write_eof` call any manipulations with the *response* object are forbidden. Response ^^^^^^^^ .. class:: Response(*, body=None, status=200, reason=None, text=None, \ headers=None, content_type=None, charset=None, \ zlib_executor_size=sentinel, zlib_executor=None) The most usable response class, inherited from :class:`StreamResponse`. Accepts *body* argument for setting the *HTTP response BODY*. The actual :attr:`body` sending happens in overridden :meth:`~StreamResponse.write_eof`. :param bytes body: response's BODY :param int status: HTTP status code, 200 OK by default. :param collections.abc.Mapping headers: HTTP headers that should be added to response's ones. :param str text: response's BODY :param str content_type: response's content type. ``'text/plain'`` if *text* is passed also, ``'application/octet-stream'`` otherwise. :param str charset: response's charset. ``'utf-8'`` if *text* is passed also, ``None`` otherwise. :param int zlib_executor_size: length in bytes which will trigger zlib compression of body to happen in an executor .. versionadded:: 3.5 :param int zlib_executor: executor to use for zlib compression .. versionadded:: 3.5 .. attribute:: body Read-write attribute for storing response's content aka BODY, :class:`bytes`. Setting :attr:`body` also recalculates :attr:`~StreamResponse.content_length` value. Assigning :class:`str` to :attr:`body` will make the :attr:`body` type of :class:`aiohttp.payload.StringPayload`, which tries to encode the given data based on *Content-Type* HTTP header, while defaulting to ``UTF-8``. Resetting :attr:`body` (assigning ``None``) sets :attr:`~StreamResponse.content_length` to ``None`` too, dropping *Content-Length* HTTP header. .. attribute:: text Read-write attribute for storing response's content, represented as string, :class:`str`. Setting :attr:`text` also recalculates :attr:`~StreamResponse.content_length` value and :attr:`~aiohttp.StreamResponse.body` value Resetting :attr:`text` (assigning ``None``) sets :attr:`~StreamResponse.content_length` to ``None`` too, dropping *Content-Length* HTTP header. WebSocketResponse ^^^^^^^^^^^^^^^^^ .. class:: WebSocketResponse(*, timeout=10.0, receive_timeout=None, \ autoclose=True, autoping=True, heartbeat=None, \ protocols=(), compress=True, max_msg_size=4194304) Class for handling server-side websockets, inherited from :class:`StreamResponse`. After starting (by :meth:`prepare` call) the response you cannot use :meth:`~StreamResponse.write` method but should to communicate with websocket client by :meth:`send_str`, :meth:`receive` and others. To enable back-pressure from slow websocket clients treat methods :meth:`ping()`, :meth:`pong()`, :meth:`send_str()`, :meth:`send_bytes()`, :meth:`send_json()` as coroutines. By default write buffer size is set to 64k. :param bool autoping: Automatically send :const:`~aiohttp.WSMsgType.PONG` on :const:`~aiohttp.WSMsgType.PING` message from client, and handle :const:`~aiohttp.WSMsgType.PONG` responses from client. Note that server does not send :const:`~aiohttp.WSMsgType.PING` requests, you need to do this explicitly using :meth:`ping` method. :param float heartbeat: Send `ping` message every `heartbeat` seconds and wait `pong` response, close connection if `pong` response is not received. The timer is reset on any data reception. :param float receive_timeout: Timeout value for `receive` operations. Default value is None (no timeout for receive operation) :param bool compress: Enable per-message deflate extension support. False for disabled, default value is True. :param int max_msg_size: maximum size of read websocket message, 4 MB by default. To disable the size limit use ``0``. .. versionadded:: 3.3 The class supports ``async for`` statement for iterating over incoming messages:: ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: print(msg.data) .. comethod:: prepare(request) Starts websocket. After the call you can use websocket methods. :param aiohttp.web.Request request: HTTP request object, that the response answers. :raises HTTPException: if websocket handshake has failed. .. method:: can_prepare(request) Performs checks for *request* data to figure out if websocket can be started on the request. If :meth:`can_prepare` call is success then :meth:`prepare` will success too. :param aiohttp.web.Request request: HTTP request object, that the response answers. :return: :class:`WebSocketReady` instance. :attr:`WebSocketReady.ok` is ``True`` on success, :attr:`WebSocketReady.protocol` is websocket subprotocol which is passed by client and accepted by server (one of *protocols* sequence from :class:`WebSocketResponse` ctor). :attr:`WebSocketReady.protocol` may be ``None`` if client and server subprotocols are not overlapping. .. note:: The method never raises exception. .. attribute:: closed Read-only property, ``True`` if connection has been closed or in process of closing. :const:`~aiohttp.WSMsgType.CLOSE` message has been received from peer. .. attribute:: close_code Read-only property, close code from peer. It is set to ``None`` on opened connection. .. attribute:: ws_protocol Websocket *subprotocol* chosen after :meth:`start` call. May be ``None`` if server and client protocols are not overlapping. .. method:: exception() Returns last occurred exception or None. .. comethod:: ping(message=b'') Send :const:`~aiohttp.WSMsgType.PING` to peer. :param message: optional payload of *ping* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. :raise RuntimeError: if connections is not started or closing. .. versionchanged:: 3.0 The method is converted into :term:`coroutine` .. comethod:: pong(message=b'') Send *unsolicited* :const:`~aiohttp.WSMsgType.PONG` to peer. :param message: optional payload of *pong* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. :raise RuntimeError: if connections is not started or closing. .. versionchanged:: 3.0 The method is converted into :term:`coroutine` .. comethod:: send_str(data, compress=None) Send *data* to peer as :const:`~aiohttp.WSMsgType.TEXT` message. :param str data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :raise RuntimeError: if connection is not started or closing :raise TypeError: if data is not :class:`str` .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. comethod:: send_bytes(data, compress=None) Send *data* to peer as :const:`~aiohttp.WSMsgType.BINARY` message. :param data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :raise RuntimeError: if connection is not started or closing :raise TypeError: if data is not :class:`bytes`, :class:`bytearray` or :class:`memoryview`. .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. comethod:: send_json(data, compress=None, *, dumps=json.dumps) Send *data* to peer as JSON string. :param data: data to send. :param int compress: sets specific level of compression for single message, ``None`` for not overriding per-socket setting. :param collections.abc.Callable dumps: any :term:`callable` that accepts an object and returns a JSON string (:func:`json.dumps` by default). :raise RuntimeError: if connection is not started or closing :raise ValueError: if data is not serializable object :raise TypeError: if value returned by ``dumps`` param is not :class:`str` .. versionchanged:: 3.0 The method is converted into :term:`coroutine`, *compress* parameter added. .. comethod:: close(*, code=WSCloseCode.OK, message=b'') A :ref:`coroutine` that initiates closing handshake by sending :const:`~aiohttp.WSMsgType.CLOSE` message. It is safe to call `close()` from different task. :param int code: closing code. See also :class:`~aiohttp.WSCloseCode`. :param message: optional payload of *close* message, :class:`str` (converted to *UTF-8* encoded bytes) or :class:`bytes`. :raise RuntimeError: if connection is not started .. comethod:: receive(timeout=None) A :ref:`coroutine` that waits upcoming *data* message from peer and returns it. The coroutine implicitly handles :const:`~aiohttp.WSMsgType.PING`, :const:`~aiohttp.WSMsgType.PONG` and :const:`~aiohttp.WSMsgType.CLOSE` without returning the message. It process *ping-pong game* and performs *closing handshake* internally. .. note:: Can only be called by the request handling task. :param timeout: timeout for `receive` operation. timeout value overrides response`s receive_timeout attribute. :return: :class:`~aiohttp.WSMessage` :raise RuntimeError: if connection is not started .. comethod:: receive_str(*, timeout=None) A :ref:`coroutine` that calls :meth:`receive` but also asserts the message type is :const:`~aiohttp.WSMsgType.TEXT`. .. note:: Can only be called by the request handling task. :param timeout: timeout for `receive` operation. timeout value overrides response`s receive_timeout attribute. :return str: peer's message content. :raise TypeError: if message is :const:`~aiohttp.WSMsgType.BINARY`. .. comethod:: receive_bytes(*, timeout=None) A :ref:`coroutine` that calls :meth:`receive` but also asserts the message type is :const:`~aiohttp.WSMsgType.BINARY`. .. note:: Can only be called by the request handling task. :param timeout: timeout for `receive` operation. timeout value overrides response`s receive_timeout attribute. :return bytes: peer's message content. :raise TypeError: if message is :const:`~aiohttp.WSMsgType.TEXT`. .. comethod:: receive_json(*, loads=json.loads, timeout=None) A :ref:`coroutine` that calls :meth:`receive_str` and loads the JSON string to a Python dict. .. note:: Can only be called by the request handling task. :param collections.abc.Callable loads: any :term:`callable` that accepts :class:`str` and returns :class:`dict` with parsed JSON (:func:`json.loads` by default). :param timeout: timeout for `receive` operation. timeout value overrides response`s receive_timeout attribute. :return dict: loaded JSON content :raise TypeError: if message is :const:`~aiohttp.WSMsgType.BINARY`. :raise ValueError: if message is not valid JSON. .. seealso:: :ref:`WebSockets handling` WebSocketReady ^^^^^^^^^^^^^^ .. class:: WebSocketReady A named tuple for returning result from :meth:`WebSocketResponse.can_prepare`. Has :class:`bool` check implemented, e.g.:: if not await ws.can_prepare(...): cannot_start_websocket() .. attribute:: ok ``True`` if websocket connection can be established, ``False`` otherwise. .. attribute:: protocol :class:`str` represented selected websocket sub-protocol. .. seealso:: :meth:`WebSocketResponse.can_prepare` json_response ^^^^^^^^^^^^^ .. function:: json_response([data], *, text=None, body=None, \ status=200, reason=None, headers=None, \ content_type='application/json', \ dumps=json.dumps) Return :class:`Response` with predefined ``'application/json'`` content type and *data* encoded by ``dumps`` parameter (:func:`json.dumps` by default). HTTP Exceptions ^^^^^^^^^^^^^^^ Errors can also be returned by raising a HTTP exception instance from within the handler. .. class:: HTTPException(*, headers=None, reason=None, text=None, content_type=None) Low-level HTTP failure. :param headers: headers for the response :type headers: dict or multidict.CIMultiDict :param str reason: reason included in the response :param str text: response's body :param str content_type: response's content type. This is passed through to the :class:`Response` initializer. Sub-classes of ``HTTPException`` exist for the standard HTTP response codes as described in :ref:`aiohttp-web-exceptions` and the expected usage is to simply raise the appropriate exception type to respond with a specific HTTP response code. Since ``HTTPException`` is a sub-class of :class:`Response`, it contains the methods and properties that allow you to directly manipulate details of the response. .. attribute:: status_code HTTP status code for this exception class. This attribute is usually defined at the class level. ``self.status_code`` is passed to the :class:`Response` initializer. .. _aiohttp-web-app-and-router: Application and Router ---------------------- Application ^^^^^^^^^^^ Application is a synonym for web-server. To get fully working example, you have to make *application*, register supported urls in *router* and pass it to :func:`aiohttp.web.run_app` or :class:`aiohttp.web.AppRunner`. *Application* contains a *router* instance and a list of callbacks that will be called during application finishing. :class:`Application` is a :obj:`dict`-like object, so you can use it for :ref:`sharing data` globally by storing arbitrary properties for later access from a :ref:`handler` via the :attr:`Request.app` property:: app = Application() app['database'] = await aiopg.create_engine(**db_config) async def handler(request): with (await request.app['database']) as conn: conn.execute("DELETE * FROM table") Although :class:`Application` is a :obj:`dict`-like object, it can't be duplicated like one using :meth:`~aiohttp.web.Application.copy`. .. class:: Application(*, logger=, router=None,middlewares=(), \ handler_args=None, client_max_size=1024**2, \ loop=None, debug=...) The class inherits :class:`dict`. :param logger: :class:`logging.Logger` instance for storing application logs. By default the value is ``logging.getLogger("aiohttp.web")`` :param router: :class:`aiohttp.abc.AbstractRouter` instance, the system creates :class:`UrlDispatcher` by default if *router* is ``None``. .. deprecated:: 3.3 The custom routers support is deprecated, the parameter will be removed in 4.0. :param middlewares: :class:`list` of middleware factories, see :ref:`aiohttp-web-middlewares` for details. :param handler_args: dict-like object that overrides keyword arguments of :meth:`Application.make_handler` :param client_max_size: client's maximum size in a request, in bytes. If a POST request exceeds this value, it raises an `HTTPRequestEntityTooLarge` exception. :param loop: event loop .. deprecated:: 2.0 The parameter is deprecated. Loop is get set during freeze stage. :param debug: Switches debug mode. .. deprecated:: 3.5 Use asyncio :ref:`asyncio-debug-mode` instead. .. attribute:: router Read-only property that returns *router instance*. .. attribute:: logger :class:`logging.Logger` instance for storing application logs. .. attribute:: loop :ref:`event loop` used for processing HTTP requests. .. deprecated:: 3.5 .. attribute:: debug Boolean value indicating whether the debug mode is turned on or off. .. deprecated:: 3.5 Use asyncio :ref:`asyncio-debug-mode` instead. .. attribute:: on_response_prepare A :class:`~aiosignal.Signal` that is fired near the end of :meth:`StreamResponse.prepare` with parameters *request* and *response*. It can be used, for example, to add custom headers to each response, or to modify the default headers computed by the application, directly before sending the headers to the client. Signal handlers should have the following signature:: async def on_prepare(request, response): pass .. attribute:: on_startup A :class:`~aiosignal.Signal` that is fired on application start-up. Subscribers may use the signal to run background tasks in the event loop along with the application's request handler just after the application start-up. Signal handlers should have the following signature:: async def on_startup(app): pass .. seealso:: :ref:`aiohttp-web-signals`. .. attribute:: on_shutdown A :class:`~aiosignal.Signal` that is fired on application shutdown. Subscribers may use the signal for gracefully closing long running connections, e.g. websockets and data streaming. Signal handlers should have the following signature:: async def on_shutdown(app): pass It's up to end user to figure out which :term:`web-handler`\s are still alive and how to finish them properly. We suggest keeping a list of long running handlers in :class:`Application` dictionary. .. seealso:: :ref:`aiohttp-web-graceful-shutdown` and :attr:`on_cleanup`. .. attribute:: on_cleanup A :class:`~aiosignal.Signal` that is fired on application cleanup. Subscribers may use the signal for gracefully closing connections to database server etc. Signal handlers should have the following signature:: async def on_cleanup(app): pass .. seealso:: :ref:`aiohttp-web-signals` and :attr:`on_shutdown`. .. attribute:: cleanup_ctx A list of *context generators* for *startup*/*cleanup* handling. Signal handlers should have the following signature:: async def context(app): # do startup stuff yield # do cleanup .. versionadded:: 3.1 .. seealso:: :ref:`aiohttp-web-cleanup-ctx`. .. method:: add_subapp(prefix, subapp) Register nested sub-application under given path *prefix*. In resolving process if request's path starts with *prefix* then further resolving is passed to *subapp*. :param str prefix: path's prefix for the resource. :param Application subapp: nested application attached under *prefix*. :returns: a :class:`PrefixedSubAppResource` instance. .. method:: add_domain(domain, subapp) Register nested sub-application that serves the domain name or domain name mask. In resolving process if request.headers['host'] matches the pattern *domain* then further resolving is passed to *subapp*. :param str domain: domain or mask of domain for the resource. :param Application subapp: nested application. :returns: a :class:`~aiohttp.web.MatchedSubAppResource` instance. .. method:: add_routes(routes_table) Register route definitions from *routes_table*. The table is a :class:`list` of :class:`RouteDef` items or :class:`RouteTableDef`. :returns: :class:`list` of registered :class:`AbstractRoute` instances. The method is a shortcut for ``app.router.add_routes(routes_table)``, see also :meth:`UrlDispatcher.add_routes`. .. versionadded:: 3.1 .. versionchanged:: 3.7 Return value updated from ``None`` to :class:`list` of :class:`AbstractRoute` instances. .. method:: make_handler(loop=None, **kwargs) Creates HTTP protocol factory for handling requests. :param loop: :ref:`event loop` used for processing HTTP requests. If param is ``None`` :func:`asyncio.get_event_loop` used for getting default event loop. .. deprecated:: 2.0 :param bool tcp_keepalive: Enable TCP Keep-Alive. Default: ``True``. :param int keepalive_timeout: Number of seconds before closing Keep-Alive connection. Default: ``75`` seconds (NGINX's default value). :param logger: Custom logger object. Default: :data:`aiohttp.log.server_logger`. :param access_log: Custom logging object. Default: :data:`aiohttp.log.access_logger`. :param access_log_class: Class for `access_logger`. Default: :data:`aiohttp.helpers.AccessLogger`. Must to be a subclass of :class:`aiohttp.abc.AbstractAccessLogger`. :param str access_log_format: Access log format string. Default: :attr:`helpers.AccessLogger.LOG_FORMAT`. :param int max_line_size: Optional maximum header line size. Default: ``8190``. :param int max_headers: Optional maximum header size. Default: ``32768``. :param int max_field_size: Optional maximum header field size. Default: ``8190``. :param float lingering_time: Maximum time during which the server reads and ignores additional data coming from the client when lingering close is on. Use ``0`` to disable lingering on server channel closing. You should pass result of the method as *protocol_factory* to :meth:`~asyncio.AbstractEventLoop.create_server`, e.g.:: loop = asyncio.get_event_loop() app = Application() # setup route table # app.router.add_route(...) await loop.create_server(app.make_handler(), '0.0.0.0', 8080) .. deprecated:: 3.2 The method is deprecated and will be removed in future aiohttp versions. Please use :ref:`aiohttp-web-app-runners` instead. .. comethod:: startup() A :ref:`coroutine` that will be called along with the application's request handler. The purpose of the method is calling :attr:`on_startup` signal handlers. .. comethod:: shutdown() A :ref:`coroutine` that should be called on server stopping but before :meth:`cleanup()`. The purpose of the method is calling :attr:`on_shutdown` signal handlers. .. comethod:: cleanup() A :ref:`coroutine` that should be called on server stopping but after :meth:`shutdown`. The purpose of the method is calling :attr:`on_cleanup` signal handlers. .. note:: Application object has :attr:`router` attribute but has no ``add_route()`` method. The reason is: we want to support different router implementations (even maybe not url-matching based but traversal ones). For sake of that fact we have very trivial ABC for :class:`~aiohttp.abc.AbstractRouter`: it should have only :meth:`aiohttp.abc.AbstractRouter.resolve` coroutine. No methods for adding routes or route reversing (getting URL by route name). All those are router implementation details (but, sure, you need to deal with that methods after choosing the router for your application). Server ^^^^^^ A protocol factory compatible with :meth:`~asyncio.AbstractEventLoop.create_server`. .. class:: Server The class is responsible for creating HTTP protocol objects that can handle HTTP connections. .. attribute:: connections List of all currently opened connections. .. attribute:: requests_count Amount of processed requests. .. comethod:: Server.shutdown(timeout) A :ref:`coroutine` that should be called to close all opened connections. Router ^^^^^^ For dispatching URLs to :ref:`handlers` :mod:`aiohttp.web` uses *routers*. Router is any object that implements :class:`~aiohttp.abc.AbstractRouter` interface. :mod:`aiohttp.web` provides an implementation called :class:`UrlDispatcher`. :class:`Application` uses :class:`UrlDispatcher` as :meth:`~aiohttp.web.Application.router` by default. .. class:: UrlDispatcher() Straightforward url-matching router, implements :class:`collections.abc.Mapping` for access to *named routes*. Before running :class:`Application` you should fill *route table* first by calling :meth:`add_route` and :meth:`add_static`. :ref:`Handler` lookup is performed by iterating on added *routes* in FIFO order. The first matching *route* will be used to call corresponding *handler*. If on route creation you specify *name* parameter the result is *named route*. *Named route* can be retrieved by ``app.router[name]`` call, checked for existence by ``name in app.router`` etc. .. seealso:: :ref:`Route classes ` .. method:: add_resource(path, *, name=None) Append a :term:`resource` to the end of route table. *path* may be either *constant* string like ``'/a/b/c'`` or *variable rule* like ``'/a/{var}'`` (see :ref:`handling variable paths `) :param str path: resource path spec. :param str name: optional resource name. :return: created resource instance (:class:`PlainResource` or :class:`DynamicResource`). .. method:: add_route(method, path, handler, *, \ name=None, expect_handler=None) Append :ref:`handler` to the end of route table. *path* may be either *constant* string like ``'/a/b/c'`` or *variable rule* like ``'/a/{var}'`` (see :ref:`handling variable paths `) Pay attention please: *handler* is converted to coroutine internally when it is a regular function. :param str method: HTTP method for route. Should be one of ``'GET'``, ``'POST'``, ``'PUT'``, ``'DELETE'``, ``'PATCH'``, ``'HEAD'``, ``'OPTIONS'`` or ``'*'`` for any method. The parameter is case-insensitive, e.g. you can push ``'get'`` as well as ``'GET'``. :param str path: route path. Should be started with slash (``'/'``). :param collections.abc.Callable handler: route handler. :param str name: optional route name. :param collections.abc.Coroutine expect_handler: optional *expect* header handler. :returns: new :class:`AbstractRoute` instance. .. method:: add_routes(routes_table) Register route definitions from *routes_table*. The table is a :class:`list` of :class:`RouteDef` items or :class:`RouteTableDef`. :returns: :class:`list` of registered :class:`AbstractRoute` instances. .. versionadded:: 2.3 .. versionchanged:: 3.7 Return value updated from ``None`` to :class:`list` of :class:`AbstractRoute` instances. .. method:: add_get(path, handler, *, name=None, allow_head=True, **kwargs) Shortcut for adding a GET handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'GET'``. If *allow_head* is ``True`` (default) the route for method HEAD is added with the same handler as for GET. If *name* is provided the name for HEAD route is suffixed with ``'-head'``. For example ``router.add_get(path, handler, name='route')`` call adds two routes: first for GET with name ``'route'`` and second for HEAD with name ``'route-head'``. .. method:: add_post(path, handler, **kwargs) Shortcut for adding a POST handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'POST'``. .. method:: add_head(path, handler, **kwargs) Shortcut for adding a HEAD handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'HEAD'``. .. method:: add_put(path, handler, **kwargs) Shortcut for adding a PUT handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'PUT'``. .. method:: add_patch(path, handler, **kwargs) Shortcut for adding a PATCH handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'PATCH'``. .. method:: add_delete(path, handler, **kwargs) Shortcut for adding a DELETE handler. Calls the :meth:`add_route` with \ ``method`` equals to ``'DELETE'``. .. method:: add_view(path, handler, **kwargs) Shortcut for adding a class-based view handler. Calls the \ :meth:`add_route` with ``method`` equals to ``'*'``. .. versionadded:: 3.0 .. method:: add_static(prefix, path, *, name=None, expect_handler=None, \ chunk_size=256*1024, \ response_factory=StreamResponse, \ show_index=False, \ follow_symlinks=False, \ append_version=False) Adds a router and a handler for returning static files. Useful for serving static content like images, javascript and css files. On platforms that support it, the handler will transfer files more efficiently using the ``sendfile`` system call. In some situations it might be necessary to avoid using the ``sendfile`` system call even if the platform supports it. This can be accomplished by by setting environment variable ``AIOHTTP_NOSENDFILE=1``. If a gzip version of the static content exists at file path + ``.gz``, it will be used for the response. .. warning:: Use :meth:`add_static` for development only. In production, static content should be processed by web servers like *nginx* or *apache*. :param str prefix: URL path prefix for handled static files :param path: path to the folder in file system that contains handled static files, :class:`str` or :class:`pathlib.Path`. :param str name: optional route name. :param collections.abc.Coroutine expect_handler: optional *expect* header handler. :param int chunk_size: size of single chunk for file downloading, 256Kb by default. Increasing *chunk_size* parameter to, say, 1Mb may increase file downloading speed but consumes more memory. :param bool show_index: flag for allowing to show indexes of a directory, by default it's not allowed and HTTP/403 will be returned on directory access. :param bool follow_symlinks: flag for allowing to follow symlinks from a directory, by default it's not allowed and HTTP/404 will be returned on access. :param bool append_version: flag for adding file version (hash) to the url query string, this value will be used as default when you call to :meth:`~aiohttp.web.AbstractRoute.url` and :meth:`~aiohttp.web.AbstractRoute.url_for` methods. :returns: new :class:`~aiohttp.web.AbstractRoute` instance. .. comethod:: resolve(request) A :ref:`coroutine` that returns :class:`~aiohttp.abc.AbstractMatchInfo` for *request*. The method never raises exception, but returns :class:`~aiohttp.abc.AbstractMatchInfo` instance with: 1. :attr:`~aiohttp.abc.AbstractMatchInfo.http_exception` assigned to :exc:`HTTPException` instance. 2. :meth:`~aiohttp.abc.AbstractMatchInfo.handler` which raises :exc:`HTTPNotFound` or :exc:`HTTPMethodNotAllowed` on handler's execution if there is no registered route for *request*. *Middlewares* can process that exceptions to render pretty-looking error page for example. Used by internal machinery, end user unlikely need to call the method. .. note:: The method uses :attr:`aiohttp.web.BaseRequest.raw_path` for pattern matching against registered routes. .. method:: resources() The method returns a *view* for *all* registered resources. The view is an object that allows to: 1. Get size of the router table:: len(app.router.resources()) 2. Iterate over registered resources:: for resource in app.router.resources(): print(resource) 3. Make a check if the resources is registered in the router table:: route in app.router.resources() .. method:: routes() The method returns a *view* for *all* registered routes. .. method:: named_resources() Returns a :obj:`dict`-like :class:`types.MappingProxyType` *view* over *all* named **resources**. The view maps every named resource's **name** to the :class:`AbstractResource` instance. It supports the usual :obj:`dict`-like operations, except for any mutable operations (i.e. it's **read-only**):: len(app.router.named_resources()) for name, resource in app.router.named_resources().items(): print(name, resource) "name" in app.router.named_resources() app.router.named_resources()["name"] .. _aiohttp-web-resource: Resource ^^^^^^^^ Default router :class:`UrlDispatcher` operates with :term:`resource`\s. Resource is an item in *routing table* which has a *path*, an optional unique *name* and at least one :term:`route`. :term:`web-handler` lookup is performed in the following way: 1. Router iterates over *resources* one-by-one. 2. If *resource* matches to requested URL the resource iterates over own *routes*. 3. If route matches to requested HTTP method (or ``'*'`` wildcard) the route's handler is used as found :term:`web-handler`. The lookup is finished. 4. Otherwise router tries next resource from the *routing table*. 5. If the end of *routing table* is reached and no *resource* / *route* pair found the *router* returns special :class:`~aiohttp.abc.AbstractMatchInfo` instance with :attr:`aiohttp.abc.AbstractMatchInfo.http_exception` is not ``None`` but :exc:`HTTPException` with either *HTTP 404 Not Found* or *HTTP 405 Method Not Allowed* status code. Registered :meth:`~aiohttp.abc.AbstractMatchInfo.handler` raises this exception on call. User should never instantiate resource classes but give it by :meth:`UrlDispatcher.add_resource` call. After that he may add a :term:`route` by calling :meth:`Resource.add_route`. :meth:`UrlDispatcher.add_route` is just shortcut for:: router.add_resource(path).add_route(method, handler) Resource with a *name* is called *named resource*. The main purpose of *named resource* is constructing URL by route name for passing it into *template engine* for example:: url = app.router['resource_name'].url_for().with_query({'a': 1, 'b': 2}) Resource classes hierarchy:: AbstractResource Resource PlainResource DynamicResource StaticResource .. class:: AbstractResource A base class for all resources. Inherited from :class:`collections.abc.Sized` and :class:`collections.abc.Iterable`. ``len(resource)`` returns amount of :term:`route`\s belongs to the resource, ``for route in resource`` allows to iterate over these routes. .. attribute:: name Read-only *name* of resource or ``None``. .. attribute:: canonical Read-only *canonical path* associate with the resource. For example ``/path/to`` or ``/path/{to}`` .. versionadded:: 3.3 .. comethod:: resolve(request) Resolve resource by finding appropriate :term:`web-handler` for ``(method, path)`` combination. :return: (*match_info*, *allowed_methods*) pair. *allowed_methods* is a :class:`set` or HTTP methods accepted by resource. *match_info* is either :class:`UrlMappingMatchInfo` if request is resolved or ``None`` if no :term:`route` is found. .. method:: get_info() A resource description, e.g. ``{'path': '/path/to'}`` or ``{'formatter': '/path/{to}', 'pattern': re.compile(r'^/path/(?P[a-zA-Z][_a-zA-Z0-9]+)$`` .. method:: url_for(*args, **kwargs) Construct an URL for route with additional params. *args* and **kwargs** depend on a parameters list accepted by inherited resource class. :return: :class:`~yarl.URL` -- resulting URL instance. .. class:: Resource A base class for new-style resources, inherits :class:`AbstractResource`. .. method:: add_route(method, handler, *, expect_handler=None) Add a :term:`web-handler` to resource. :param str method: HTTP method for route. Should be one of ``'GET'``, ``'POST'``, ``'PUT'``, ``'DELETE'``, ``'PATCH'``, ``'HEAD'``, ``'OPTIONS'`` or ``'*'`` for any method. The parameter is case-insensitive, e.g. you can push ``'get'`` as well as ``'GET'``. The method should be unique for resource. :param collections.abc.Callable handler: route handler. :param collections.abc.Coroutine expect_handler: optional *expect* header handler. :returns: new :class:`ResourceRoute` instance. .. class:: PlainResource A resource, inherited from :class:`Resource`. The class corresponds to resources with plain-text matching, ``'/path/to'`` for example. .. attribute:: canonical Read-only *canonical path* associate with the resource. Returns the path used to create the PlainResource. For example ``/path/to`` .. versionadded:: 3.3 .. method:: url_for() Returns a :class:`~yarl.URL` for the resource. .. class:: DynamicResource A resource, inherited from :class:`Resource`. The class corresponds to resources with :ref:`variable ` matching, e.g. ``'/path/{to}/{param}'`` etc. .. attribute:: canonical Read-only *canonical path* associate with the resource. Returns the formatter obtained from the path used to create the DynamicResource. For example, from a path ``/get/{num:^\d+}``, it returns ``/get/{num}`` .. versionadded:: 3.3 .. method:: url_for(**params) Returns a :class:`~yarl.URL` for the resource. :param params: -- a variable substitutions for dynamic resource. E.g. for ``'/path/{to}/{param}'`` pattern the method should be called as ``resource.url_for(to='val1', param='val2')`` .. class:: StaticResource A resource, inherited from :class:`Resource`. The class corresponds to resources for :ref:`static file serving `. .. attribute:: canonical Read-only *canonical path* associate with the resource. Returns the prefix used to create the StaticResource. For example ``/prefix`` .. versionadded:: 3.3 .. method:: url_for(filename, append_version=None) Returns a :class:`~yarl.URL` for file path under resource prefix. :param filename: -- a file name substitution for static file handler. Accepts both :class:`str` and :class:`pathlib.Path`. E.g. an URL for ``'/prefix/dir/file.txt'`` should be generated as ``resource.url_for(filename='dir/file.txt')`` :param bool append_version: -- a flag for adding file version (hash) to the url query string for cache boosting By default has value from a constructor (``False`` by default) When set to ``True`` - ``v=FILE_HASH`` query string param will be added When set to ``False`` has no impact if file not found has no impact .. class:: PrefixedSubAppResource A resource for serving nested applications. The class instance is returned by :class:`~aiohttp.web.Application.add_subapp` call. .. attribute:: canonical Read-only *canonical path* associate with the resource. Returns the prefix used to create the PrefixedSubAppResource. For example ``/prefix`` .. versionadded:: 3.3 .. method:: url_for(**kwargs) The call is not allowed, it raises :exc:`RuntimeError`. .. _aiohttp-web-route: Route ^^^^^ Route has *HTTP method* (wildcard ``'*'`` is an option), :term:`web-handler` and optional *expect handler*. Every route belong to some resource. Route classes hierarchy:: AbstractRoute ResourceRoute SystemRoute :class:`ResourceRoute` is the route used for resources, :class:`SystemRoute` serves URL resolving errors like *404 Not Found* and *405 Method Not Allowed*. .. class:: AbstractRoute Base class for routes served by :class:`UrlDispatcher`. .. attribute:: method HTTP method handled by the route, e.g. *GET*, *POST* etc. .. attribute:: handler :ref:`handler` that processes the route. .. attribute:: name Name of the route, always equals to name of resource which owns the route. .. attribute:: resource Resource instance which holds the route, ``None`` for :class:`SystemRoute`. .. method:: url_for(*args, **kwargs) Abstract method for constructing url handled by the route. Actually it's a shortcut for ``route.resource.url_for(...)``. .. comethod:: handle_expect_header(request) ``100-continue`` handler. .. class:: ResourceRoute The route class for handling different HTTP methods for :class:`Resource`. .. class:: SystemRoute The route class for handling URL resolution errors like like *404 Not Found* and *405 Method Not Allowed*. .. attribute:: status HTTP status code .. attribute:: reason HTTP status reason .. _aiohttp-web-route-def: RouteDef and StaticDef ^^^^^^^^^^^^^^^^^^^^^^ Route definition, a description for not registered yet route. Could be used for filing route table by providing a list of route definitions (Django style). The definition is created by functions like :func:`get` or :func:`post`, list of definitions could be added to router by :meth:`UrlDispatcher.add_routes` call:: from aiohttp import web async def handle_get(request): ... async def handle_post(request): ... app.router.add_routes([web.get('/get', handle_get), web.post('/post', handle_post), .. class:: AbstractRouteDef A base class for route definitions. Inherited from :class:`abc.ABC`. .. versionadded:: 3.1 .. method:: register(router) Register itself into :class:`UrlDispatcher`. Abstract method, should be overridden by subclasses. :returns: :class:`list` of registered :class:`AbstractRoute` objects. .. versionchanged:: 3.7 Return value updated from ``None`` to :class:`list` of :class:`AbstractRoute` instances. .. class:: RouteDef A definition of not registered yet route. Implements :class:`AbstractRouteDef`. .. versionadded:: 2.3 .. versionchanged:: 3.1 The class implements :class:`AbstractRouteDef` interface. .. attribute:: method HTTP method (``GET``, ``POST`` etc.) (:class:`str`). .. attribute:: path Path to resource, e.g. ``/path/to``. Could contain ``{}`` brackets for :ref:`variable resources ` (:class:`str`). .. attribute:: handler An async function to handle HTTP request. .. attribute:: kwargs A :class:`dict` of additional arguments. .. class:: StaticDef A definition of static file resource. Implements :class:`AbstractRouteDef`. .. versionadded:: 3.1 .. attribute:: prefix A prefix used for static file handling, e.g. ``/static``. .. attribute:: path File system directory to serve, :class:`str` or :class:`pathlib.Path` (e.g. ``'/home/web-service/path/to/static'``. .. attribute:: kwargs A :class:`dict` of additional arguments, see :meth:`UrlDispatcher.add_static` for a list of supported options. .. function:: get(path, handler, *, name=None, allow_head=True, \ expect_handler=None) Return :class:`RouteDef` for processing ``GET`` requests. See :meth:`UrlDispatcher.add_get` for information about parameters. .. versionadded:: 2.3 .. function:: post(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``POST`` requests. See :meth:`UrlDispatcher.add_post` for information about parameters. .. versionadded:: 2.3 .. function:: head(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``HEAD`` requests. See :meth:`UrlDispatcher.add_head` for information about parameters. .. versionadded:: 2.3 .. function:: put(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``PUT`` requests. See :meth:`UrlDispatcher.add_put` for information about parameters. .. versionadded:: 2.3 .. function:: patch(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``PATCH`` requests. See :meth:`UrlDispatcher.add_patch` for information about parameters. .. versionadded:: 2.3 .. function:: delete(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``DELETE`` requests. See :meth:`UrlDispatcher.add_delete` for information about parameters. .. versionadded:: 2.3 .. function:: view(path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing ``ANY`` requests. See :meth:`UrlDispatcher.add_view` for information about parameters. .. versionadded:: 3.0 .. function:: static(prefix, path, *, name=None, expect_handler=None, \ chunk_size=256*1024, \ show_index=False, follow_symlinks=False, \ append_version=False) Return :class:`StaticDef` for processing static files. See :meth:`UrlDispatcher.add_static` for information about supported parameters. .. versionadded:: 3.1 .. function:: route(method, path, handler, *, name=None, expect_handler=None) Return :class:`RouteDef` for processing requests that decided by ``method``. See :meth:`UrlDispatcher.add_route` for information about parameters. .. versionadded:: 2.3 .. _aiohttp-web-route-table-def: RouteTableDef ^^^^^^^^^^^^^ A routes table definition used for describing routes by decorators (Flask style):: from aiohttp import web routes = web.RouteTableDef() @routes.get('/get') async def handle_get(request): ... @routes.post('/post') async def handle_post(request): ... app.router.add_routes(routes) @routes.view("/view") class MyView(web.View): async def get(self): ... async def post(self): ... .. class:: RouteTableDef() A sequence of :class:`RouteDef` instances (implements :class:`collections.abc.Sequence` protocol). In addition to all standard :class:`list` methods the class provides also methods like ``get()`` and ``post()`` for adding new route definition. .. versionadded:: 2.3 .. decoratormethod:: get(path, *, allow_head=True, \ name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``GET`` web-handler. See :meth:`UrlDispatcher.add_get` for information about parameters. .. decoratormethod:: post(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``POST`` web-handler. See :meth:`UrlDispatcher.add_post` for information about parameters. .. decoratormethod:: head(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``HEAD`` web-handler. See :meth:`UrlDispatcher.add_head` for information about parameters. .. decoratormethod:: put(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``PUT`` web-handler. See :meth:`UrlDispatcher.add_put` for information about parameters. .. decoratormethod:: patch(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``PATCH`` web-handler. See :meth:`UrlDispatcher.add_patch` for information about parameters. .. decoratormethod:: delete(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``DELETE`` web-handler. See :meth:`UrlDispatcher.add_delete` for information about parameters. .. decoratormethod:: view(path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering ``ANY`` methods against a class-based view. See :meth:`UrlDispatcher.add_view` for information about parameters. .. versionadded:: 3.0 .. method:: static(prefix, path, *, name=None, expect_handler=None, \ chunk_size=256*1024, \ show_index=False, follow_symlinks=False, \ append_version=False) Add a new :class:`StaticDef` item for registering static files processor. See :meth:`UrlDispatcher.add_static` for information about supported parameters. .. versionadded:: 3.1 .. decoratormethod:: route(method, path, *, name=None, expect_handler=None) Add a new :class:`RouteDef` item for registering a web-handler for arbitrary HTTP method. See :meth:`UrlDispatcher.add_route` for information about parameters. MatchInfo ^^^^^^^^^ After route matching web application calls found handler if any. Matching result can be accessible from handler as :attr:`Request.match_info` attribute. In general the result may be any object derived from :class:`~aiohttp.abc.AbstractMatchInfo` (:class:`UrlMappingMatchInfo` for default :class:`UrlDispatcher` router). .. class:: UrlMappingMatchInfo Inherited from :class:`dict` and :class:`~aiohttp.abc.AbstractMatchInfo`. Dict items are filled by matching info and is :term:`resource`\-specific. .. attribute:: expect_handler A coroutine for handling ``100-continue``. .. attribute:: handler A coroutine for handling request. .. attribute:: route :class:`AbstractRoute` instance for url matching. View ^^^^ .. class:: View(request) Inherited from :class:`~aiohttp.abc.AbstractView`. Base class for class based views. Implementations should derive from :class:`View` and override methods for handling HTTP verbs like ``get()`` or ``post()``:: class MyView(View): async def get(self): resp = await get_response(self.request) return resp async def post(self): resp = await post_response(self.request) return resp app.router.add_view('/view', MyView) The view raises *405 Method Not allowed* (:class:`HTTPMethodNotAllowed`) if requested web verb is not supported. :param request: instance of :class:`Request` that has initiated a view processing. .. attribute:: request Request sent to view's constructor, read-only property. Overridable coroutine methods: ``connect()``, ``delete()``, ``get()``, ``head()``, ``options()``, ``patch()``, ``post()``, ``put()``, ``trace()``. .. seealso:: :ref:`aiohttp-web-class-based-views` .. _aiohttp-web-app-runners-reference: Running Applications -------------------- To start web application there is ``AppRunner`` and site classes. Runner is a storage for running application, sites are for running application on specific TCP or Unix socket, e.g.:: runner = web.AppRunner(app) await runner.setup() site = web.TCPSite(runner, 'localhost', 8080) await site.start() # wait for finish signal await runner.cleanup() .. versionadded:: 3.0 :class:`AppRunner` / :class:`ServerRunner` and :class:`TCPSite` / :class:`UnixSite` / :class:`SockSite` are added in aiohttp 3.0 .. class:: BaseRunner A base class for runners. Use :class:`AppRunner` for serving :class:`Application`, :class:`ServerRunner` for low-level :class:`Server`. .. attribute:: server Low-level web :class:`Server` for handling HTTP requests, read-only attribute. .. attribute:: addresses A :class:`list` of served sockets addresses. See :meth:`socket.getsockname() ` for items type. .. versionadded:: 3.3 .. attribute:: sites A read-only :class:`set` of served sites (:class:`TCPSite` / :class:`UnixSite` / :class:`NamedPipeSite` / :class:`SockSite` instances). .. comethod:: setup() Initialize the server. Should be called before adding sites. .. comethod:: cleanup() Stop handling all registered sites and cleanup used resources. .. class:: AppRunner(app, *, handle_signals=False, **kwargs) A runner for :class:`Application`. Used with conjunction with sites to serve on specific port. Inherited from :class:`BaseRunner`. :param Application app: web application instance to serve. :param bool handle_signals: add signal handlers for :data:`signal.SIGINT` and :data:`signal.SIGTERM` (``False`` by default). :param kwargs: named parameters to pass into web protocol. Supported *kwargs*: :param bool tcp_keepalive: Enable TCP Keep-Alive. Default: ``True``. :param int keepalive_timeout: Number of seconds before closing Keep-Alive connection. Default: ``75`` seconds (NGINX's default value). :param logger: Custom logger object. Default: :data:`aiohttp.log.server_logger`. :param access_log: Custom logging object. Default: :data:`aiohttp.log.access_logger`. :param access_log_class: Class for `access_logger`. Default: :data:`aiohttp.helpers.AccessLogger`. Must to be a subclass of :class:`aiohttp.abc.AbstractAccessLogger`. :param str access_log_format: Access log format string. Default: :attr:`helpers.AccessLogger.LOG_FORMAT`. :param int max_line_size: Optional maximum header line size. Default: ``8190``. :param int max_headers: Optional maximum header size. Default: ``32768``. :param int max_field_size: Optional maximum header field size. Default: ``8190``. :param float lingering_time: Maximum time during which the server reads and ignores additional data coming from the client when lingering close is on. Use ``0`` to disable lingering on server channel closing. :param int read_bufsize: Size of the read buffer (:attr:`BaseRequest.content`). ``None`` by default, it means that the session global value is used. .. versionadded:: 3.7 :param bool auto_decompress: Automatically decompress request body, ``True`` by default. .. versionadded:: 3.8 .. attribute:: app Read-only attribute for accessing to :class:`Application` served instance. .. comethod:: setup() Initialize application. Should be called before adding sites. The method calls :attr:`Application.on_startup` registered signals. .. comethod:: cleanup() Stop handling all registered sites and cleanup used resources. :attr:`Application.on_shutdown` and :attr:`Application.on_cleanup` signals are called internally. .. class:: ServerRunner(web_server, *, handle_signals=False, **kwargs) A runner for low-level :class:`Server`. Used with conjunction with sites to serve on specific port. Inherited from :class:`BaseRunner`. :param Server web_server: low-level web server instance to serve. :param bool handle_signals: add signal handlers for :data:`signal.SIGINT` and :data:`signal.SIGTERM` (``False`` by default). :param kwargs: named parameters to pass into web protocol. .. seealso:: :ref:`aiohttp-web-lowlevel` demonstrates low-level server usage .. class:: BaseSite An abstract class for handled sites. .. attribute:: name An identifier for site, read-only :class:`str` property. Could be a handled URL or UNIX socket path. .. comethod:: start() Start handling a site. .. comethod:: stop() Stop handling a site. .. class:: TCPSite(runner, host=None, port=None, *, \ shutdown_timeout=60.0, ssl_context=None, \ backlog=128, reuse_address=None, \ reuse_port=None) Serve a runner on TCP socket. :param runner: a runner to serve. :param str host: HOST to listen on, all interfaces if ``None`` (default). :param int port: PORT to listed on, ``8080`` if ``None`` (default). :param float shutdown_timeout: a timeout for closing opened connections on :meth:`BaseSite.stop` call. :param ssl_context: a :class:`ssl.SSLContext` instance for serving SSL/TLS secure server, ``None`` for plain HTTP server (default). :param int backlog: a number of unaccepted connections that the system will allow before refusing new connections, see :meth:`socket.socket.listen` for details. ``128`` by default. :param bool reuse_address: tells the kernel to reuse a local socket in TIME_WAIT state, without waiting for its natural timeout to expire. If not specified will automatically be set to True on UNIX. :param bool reuse_port: tells the kernel to allow this endpoint to be bound to the same port as other existing endpoints are bound to, so long as they all set this flag when being created. This option is not supported on Windows. .. class:: UnixSite(runner, path, *, \ shutdown_timeout=60.0, ssl_context=None, \ backlog=128) Serve a runner on UNIX socket. :param runner: a runner to serve. :param str path: PATH to UNIX socket to listen. :param float shutdown_timeout: a timeout for closing opened connections on :meth:`BaseSite.stop` call. :param ssl_context: a :class:`ssl.SSLContext` instance for serving SSL/TLS secure server, ``None`` for plain HTTP server (default). :param int backlog: a number of unaccepted connections that the system will allow before refusing new connections, see :meth:`socket.socket.listen` for details. ``128`` by default. .. class:: NamedPipeSite(runner, path, *, shutdown_timeout=60.0) Serve a runner on Named Pipe in Windows. :param runner: a runner to serve. :param str path: PATH of named pipe to listen. :param float shutdown_timeout: a timeout for closing opened connections on :meth:`BaseSite.stop` call. .. class:: SockSite(runner, sock, *, \ shutdown_timeout=60.0, ssl_context=None, \ backlog=128) Serve a runner on UNIX socket. :param runner: a runner to serve. :param sock: A :ref:`socket instance ` to listen to. :param float shutdown_timeout: a timeout for closing opened connections on :meth:`BaseSite.stop` call. :param ssl_context: a :class:`ssl.SSLContext` instance for serving SSL/TLS secure server, ``None`` for plain HTTP server (default). :param int backlog: a number of unaccepted connections that the system will allow before refusing new connections, see :meth:`socket.socket.listen` for details. ``128`` by default. Utilities --------- .. class:: FileField A :mod:`dataclass ` instance that is returned as multidict value by :meth:`aiohttp.web.BaseRequest.post` if field is uploaded file. .. attribute:: name Field name .. attribute:: filename File name as specified by uploading (client) side. .. attribute:: file An :class:`io.IOBase` instance with content of uploaded file. .. attribute:: content_type *MIME type* of uploaded file, ``'text/plain'`` by default. .. seealso:: :ref:`aiohttp-web-file-upload` .. function:: run_app(app, *, host=None, port=None, path=None, \ sock=None, shutdown_timeout=60.0, \ keepalive_timeout=75.0, \ ssl_context=None, print=print, backlog=128, \ access_log_class=aiohttp.helpers.AccessLogger, \ access_log_format=aiohttp.helpers.AccessLogger.LOG_FORMAT, \ access_log=aiohttp.log.access_logger, \ handle_signals=True, \ reuse_address=None, \ reuse_port=None) A high-level function for running an application, serving it until keyboard interrupt and performing a :ref:`aiohttp-web-graceful-shutdown`. This is a high-level function very similar to :func:`asyncio.run` and should be used as the main entry point for an application. The :class:`Application` object essentially becomes our `main()` function. If additional tasks need to be run in parallel, see :ref:`aiohttp-web-complex-applications`. The server will listen on any host or Unix domain socket path you supply. If no hosts or paths are supplied, or only a port is supplied, a TCP server listening on 0.0.0.0 (all hosts) will be launched. Distributing HTTP traffic to multiple hosts or paths on the same application process provides no performance benefit as the requests are handled on the same event loop. See :doc:`deployment` for ways of distributing work for increased performance. :param app: :class:`Application` instance to run or a *coroutine* that returns an application. :param str host: TCP/IP host or a sequence of hosts for HTTP server. Default is ``'0.0.0.0'`` if *port* has been specified or if *path* is not supplied. :param int port: TCP/IP port for HTTP server. Default is ``8080`` for plain text HTTP and ``8443`` for HTTP via SSL (when *ssl_context* parameter is specified). :param str path: file system path for HTTP server Unix domain socket. A sequence of file system paths can be used to bind multiple domain sockets. Listening on Unix domain sockets is not supported by all operating systems. :param socket.socket sock: a preexisting socket object to accept connections on. A sequence of socket objects can be passed. :param int shutdown_timeout: a delay to wait for graceful server shutdown before disconnecting all open client sockets hard way. A system with properly :ref:`aiohttp-web-graceful-shutdown` implemented never waits for this timeout but closes a server in a few milliseconds. :param float keepalive_timeout: a delay before a TCP connection is closed after a HTTP request. The delay allows for reuse of a TCP connection. .. versionadded:: 3.8 :param ssl_context: :class:`ssl.SSLContext` for HTTPS server, ``None`` for HTTP connection. :param print: a callable compatible with :func:`print`. May be used to override STDOUT output or suppress it. Passing `None` disables output. :param int backlog: the number of unaccepted connections that the system will allow before refusing new connections (``128`` by default). :param access_log_class: class for `access_logger`. Default: :data:`aiohttp.helpers.AccessLogger`. Must to be a subclass of :class:`aiohttp.abc.AbstractAccessLogger`. :param access_log: :class:`logging.Logger` instance used for saving access logs. Use ``None`` for disabling logs for sake of speedup. :param access_log_format: access log format, see :ref:`aiohttp-logging-access-log-format-spec` for details. :param bool handle_signals: override signal TERM handling to gracefully exit the application. :param bool reuse_address: tells the kernel to reuse a local socket in TIME_WAIT state, without waiting for its natural timeout to expire. If not specified will automatically be set to True on UNIX. :param bool reuse_port: tells the kernel to allow this endpoint to be bound to the same port as other existing endpoints are bound to, so long as they all set this flag when being created. This option is not supported on Windows. .. versionadded:: 3.0 Support *access_log_class* parameter. Support *reuse_address*, *reuse_port* parameter. .. versionadded:: 3.1 Accept a coroutine as *app* parameter. Constants --------- .. class:: ContentCoding An :class:`enum.Enum` class of available Content Codings. .. attribute:: deflate *DEFLATE compression* .. attribute:: gzip *GZIP compression* .. attribute:: identity *no compression* Middlewares ----------- Normalize path middleware ^^^^^^^^^^^^^^^^^^^^^^^^^ .. function:: normalize_path_middleware(*, \ append_slash=True, \ remove_slash=False, \ merge_slashes=True, \ redirect_class=HTTPPermanentRedirect) Middleware factory which produces a middleware that normalizes the path of a request. By normalizing it means: - Add or remove a trailing slash to the path. - Double slashes are replaced by one. The middleware returns as soon as it finds a path that resolves correctly. The order if both merge and append/remove are enabled is: 1. *merge_slashes* 2. *append_slash* or *remove_slash* 3. both *merge_slashes* and *append_slash* or *remove_slash* If the path resolves with at least one of those conditions, it will redirect to the new path. Only one of *append_slash* and *remove_slash* can be enabled. If both are ``True`` the factory will raise an ``AssertionError`` If *append_slash* is ``True`` the middleware will append a slash when needed. If a resource is defined with trailing slash and the request comes without it, it will append it automatically. If *remove_slash* is ``True``, *append_slash* must be ``False``. When enabled the middleware will remove trailing slashes and redirect if the resource is defined. If *merge_slashes* is ``True``, merge multiple consecutive slashes in the path into one. .. versionadded:: 3.4 Support for *remove_slash* ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/websocket_utilities.rst0000644000175100001710000001132200000000000020275 0ustar00runnerdockerWebSocket utilities =================== .. currentmodule:: aiohttp .. class:: WSCloseCode An :class:`~enum.IntEnum` for keeping close message code. .. attribute:: OK A normal closure, meaning that the purpose for which the connection was established has been fulfilled. .. attribute:: GOING_AWAY An endpoint is "going away", such as a server going down or a browser having navigated away from a page. .. attribute:: PROTOCOL_ERROR An endpoint is terminating the connection due to a protocol error. .. attribute:: UNSUPPORTED_DATA An endpoint is terminating the connection because it has received a type of data it cannot accept (e.g., an endpoint that understands only text data MAY send this if it receives a binary message). .. attribute:: INVALID_TEXT An endpoint is terminating the connection because it has received data within a message that was not consistent with the type of the message (e.g., non-UTF-8 :rfc:`3629` data within a text message). .. attribute:: POLICY_VIOLATION An endpoint is terminating the connection because it has received a message that violates its policy. This is a generic status code that can be returned when there is no other more suitable status code (e.g., :attr:`~aiohttp.WSCloseCode.UNSUPPORTED_DATA` or :attr:`~aiohttp.WSCloseCode.MESSAGE_TOO_BIG`) or if there is a need to hide specific details about the policy. .. attribute:: MESSAGE_TOO_BIG An endpoint is terminating the connection because it has received a message that is too big for it to process. .. attribute:: MANDATORY_EXTENSION An endpoint (client) is terminating the connection because it has expected the server to negotiate one or more extension, but the server did not return them in the response message of the WebSocket handshake. The list of extensions that are needed should appear in the /reason/ part of the Close frame. Note that this status code is not used by the server, because it can fail the WebSocket handshake instead. .. attribute:: INTERNAL_ERROR A server is terminating the connection because it encountered an unexpected condition that prevented it from fulfilling the request. .. attribute:: SERVICE_RESTART The service is restarted. a client may reconnect, and if it chooses to do, should reconnect using a randomized delay of 5-30s. .. attribute:: TRY_AGAIN_LATER The service is experiencing overload. A client should only connect to a different IP (when there are multiple for the target) or reconnect to the same IP upon user action. .. attribute:: ABNORMAL_CLOSURE Used to indicate that a connection was closed abnormally (that is, with no close frame being sent) when a status code is expected. .. attribute:: BAD_GATEWAY The server was acting as a gateway or proxy and received an invalid response from the upstream server. This is similar to 502 HTTP Status Code. .. class:: WSMsgType An :class:`~enum.IntEnum` for describing :class:`WSMessage` type. .. attribute:: CONTINUATION A mark for continuation frame, user will never get the message with this type. .. attribute:: TEXT Text message, the value has :class:`str` type. .. attribute:: BINARY Binary message, the value has :class:`bytes` type. .. attribute:: PING Ping frame (sent by client peer). .. attribute:: PONG Pong frame, answer on ping. Sent by server peer. .. attribute:: CLOSE Close frame. .. attribute:: CLOSED FRAME Actually not frame but a flag indicating that websocket was closed. .. attribute:: ERROR Actually not frame but a flag indicating that websocket was received an error. .. class:: WSMessage Websocket message, returned by ``.receive()`` calls. .. attribute:: type Message type, :class:`WSMsgType` instance. .. attribute:: data Message payload. 1. :class:`str` for :attr:`WSMsgType.TEXT` messages. 2. :class:`bytes` for :attr:`WSMsgType.BINARY` messages. 3. :class:`WSCloseCode` for :attr:`WSMsgType.CLOSE` messages. 4. :class:`bytes` for :attr:`WSMsgType.PING` messages. 5. :class:`bytes` for :attr:`WSMsgType.PONG` messages. .. attribute:: extra Additional info, :class:`str`. Makes sense only for :attr:`WSMsgType.CLOSE` messages, contains optional message description. .. method:: json(*, loads=json.loads) Returns parsed JSON data. :param loads: optional JSON decoder function. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/whats_new_1_1.rst0000644000175100001710000001046600000000000016663 0ustar00runnerdocker========================= What's new in aiohttp 1.1 ========================= YARL and URL encoding ====================== Since aiohttp 1.1 the library uses :term:`yarl` for URL processing. New API ------- :class:`yarl.URL` gives handy methods for URL operations etc. Client API still accepts :class:`str` everywhere *url* is used, e.g. ``session.get('http://example.com')`` works as well as ``session.get(yarl.URL('http://example.com'))``. Internal API has been switched to :class:`yarl.URL`. :class:`aiohttp.CookieJar` accepts :class:`~yarl.URL` instances only. On server side has added :attr:`aiohttp.web.BaseRequest.url` and :attr:`aiohttp.web.BaseRequest.rel_url` properties for representing relative and absolute request's URL. URL using is the recommended way, already existed properties for retrieving URL parts are deprecated and will be eventually removed. Redirection web exceptions accepts :class:`yarl.URL` as *location* parameter. :class:`str` is still supported and will be supported forever. Reverse URL processing for *router* has been changed. The main API is ``aiohttp.web.Request.url_for`` which returns a :class:`yarl.URL` instance for named resource. It does not support *query args* but adding *args* is trivial: ``request.url_for('named_resource', param='a').with_query(arg='val')``. The method returns a *relative* URL, absolute URL may be constructed by ``request.url.join(request.url_for(...)`` call. URL encoding ------------ YARL encodes all non-ASCII symbols on :class:`yarl.URL` creation. Thus ``URL('https://www.python.org/путь')`` becomes ``'https://www.python.org/%D0%BF%D1%83%D1%82%D1%8C'``. On filling route table it's possible to use both non-ASCII and percent encoded paths:: app.router.add_get('/путь', handler) and:: app.router.add_get('/%D0%BF%D1%83%D1%82%D1%8C', handler) are the same. Internally ``'/путь'`` is converted into percent-encoding representation. Route matching also accepts both URL forms: raw and encoded by converting the route pattern to *canonical* (encoded) form on route registration. Sub-Applications ================ Sub applications are designed for solving the problem of the big monolithic code base. Let's assume we have a project with own business logic and tools like administration panel and debug toolbar. Administration panel is a separate application by its own nature but all toolbar URLs are served by prefix like ``/admin``. Thus we'll create a totally separate application named ``admin`` and connect it to main app with prefix:: admin = web.Application() # setup admin routes, signals and middlewares app.add_subapp('/admin/', admin) Middlewares and signals from ``app`` and ``admin`` are chained. It means that if URL is ``'/admin/something'`` middlewares from ``app`` are applied first and ``admin.middlewares`` are the next in the call chain. The same is going for :attr:`~aiohttp.web.Application.on_response_prepare` signal -- the signal is delivered to both top level ``app`` and ``admin`` if processing URL is routed to ``admin`` sub-application. Common signals like :attr:`~aiohttp.web.Application.on_startup`, :attr:`~aiohttp.web.Application.on_shutdown` and :attr:`~aiohttp.web.Application.on_cleanup` are delivered to all registered sub-applications. The passed parameter is sub-application instance, not top-level application. Third level sub-applications can be nested into second level ones -- there are no limitation for nesting level. Url reversing ------------- Url reversing for sub-applications should generate urls with proper prefix. But for getting URL sub-application's router should be used:: admin = web.Application() admin.add_get('/resource', handler, name='name') app.add_subapp('/admin/', admin) url = admin.router['name'].url_for() The generated ``url`` from example will have a value ``URL('/admin/resource')``. Application freezing ==================== Application can be used either as main app (``app.make_handler()``) or as sub-application -- not both cases at the same time. After connecting application by ``.add_subapp()`` call or starting serving web-server as toplevel application the application is **frozen**. It means that registering new routes, signals and middlewares is forbidden. Changing state (``app['name'] = 'value'``) of frozen application is deprecated and will be eventually removed. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/docs/whats_new_3_0.rst0000644000175100001710000000461400000000000016662 0ustar00runnerdocker.. _aiohttp_whats_new_3_0: ========================= What's new in aiohttp 3.0 ========================= async/await everywhere ====================== The main change is dropping ``yield from`` support and using ``async``/``await`` everywhere. Farewell, Python 3.4. The minimal supported Python version is **3.5.3** now. Why not *3.5.0*? Because *3.5.3* has a crucial change: :func:`asyncio.get_event_loop()` returns the running loop instead of *default*, which may be different, e.g.:: loop = asyncio.new_event_loop() loop.run_until_complete(f()) Note, :func:`asyncio.set_event_loop` was not called and default loop is not equal to actually executed one. Application Runners =================== People constantly asked about ability to run aiohttp servers together with other asyncio code, but :func:`aiohttp.web.run_app` is blocking synchronous call. aiohttp had support for starting the application without ``run_app`` but the API was very low-level and cumbersome. Now application runners solve the task in a few lines of code, see :ref:`aiohttp-web-app-runners` for details. Client Tracing ============== Other long awaited feature is tracing client request life cycle to figure out when and why client request spends a time waiting for connection establishment, getting server response headers etc. Now it is possible by registering special signal handlers on every request processing stage. :ref:`aiohttp-client-tracing` provides more info about the feature. HTTPS support ============= Unfortunately asyncio has a bug with checking SSL certificates for non-ASCII site DNS names, e.g. `https://историк.рф `_ or `https://雜草工作室.香港 `_. The bug has been fixed in upcoming Python 3.7 only (the change requires breaking backward compatibility in :mod:`ssl` API). aiohttp installs a fix for older Python versions (3.5 and 3.6). Dropped obsolete API ==================== A switch to new major version is a great chance for dropping already deprecated features. The release dropped a lot, see :ref:`aiohttp_changes` for details. All removals was already marked as deprecated or related to very low level implementation details. If user code did not raise :exc:`DeprecationWarning` it is compatible with aiohttp 3.0 most likely. Summary ======= Enjoy aiohttp 3.0 release! The full change log is here: :ref:`aiohttp_changes`. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0224516 aiohttp-3.8.1/examples/0000755000175100001710000000000000000000000014351 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/__init__.py0000644000175100001710000000000000000000000016450 0ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/background_tasks.py0000755000175100001710000000343200000000000020254 0ustar00runnerdocker#!/usr/bin/env python3 """Example of aiohttp.web.Application.on_startup signal handler""" import asyncio import aioredis from aiohttp import web async def websocket_handler(request): ws = web.WebSocketResponse() await ws.prepare(request) request.app["websockets"].append(ws) try: async for msg in ws: print(msg) await asyncio.sleep(1) finally: request.app["websockets"].remove(ws) return ws async def on_shutdown(app): for ws in app["websockets"]: await ws.close(code=999, message="Server shutdown") async def listen_to_redis(app): try: sub = await aioredis.create_redis(("localhost", 6379), loop=app.loop) ch, *_ = await sub.subscribe("news") async for msg in ch.iter(encoding="utf-8"): # Forward message to all connected websockets: for ws in app["websockets"]: await ws.send_str(f"{ch.name}: {msg}") print(f"message in {ch.name}: {msg}") except asyncio.CancelledError: pass finally: print("Cancel Redis listener: close connection...") await sub.unsubscribe(ch.name) await sub.quit() print("Redis connection closed.") async def start_background_tasks(app: web.Application) -> None: app["redis_listener"] = asyncio.create_task(listen_to_redis(app)) async def cleanup_background_tasks(app): print("cleanup background tasks...") app["redis_listener"].cancel() await app["redis_listener"] def init(): app = web.Application() app["websockets"] = [] app.router.add_get("/news", websocket_handler) app.on_startup.append(start_background_tasks) app.on_cleanup.append(cleanup_background_tasks) app.on_shutdown.append(on_shutdown) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/cli_app.py0000755000175100001710000000256100000000000016341 0ustar00runnerdocker#!/usr/bin/env python3 """ Example of serving an Application using the `aiohttp.web` CLI. Serve this app using:: $ python -m aiohttp.web -H localhost -P 8080 --repeat 10 cli_app:init \ > "Hello World" Here ``--repeat`` & ``"Hello World"`` are application specific command-line arguments. `aiohttp.web` only parses & consumes the command-line arguments it needs (i.e. ``-H``, ``-P`` & ``entry-func``) and passes on any additional arguments to the `cli_app:init` function for processing. """ from argparse import ArgumentParser from aiohttp import web def display_message(req): args = req.app["args"] text = "\n".join([args.message] * args.repeat) return web.Response(text=text) def init(argv): arg_parser = ArgumentParser( prog="aiohttp.web ...", description="Application CLI", add_help=False ) # Positional argument arg_parser.add_argument("message", help="message to print") # Optional argument arg_parser.add_argument( "--repeat", help="number of times to repeat message", type=int, default="1" ) # Avoid conflict with -h from `aiohttp.web` CLI parser arg_parser.add_argument( "--app-help", help="show this message and exit", action="help" ) args = arg_parser.parse_args(argv) app = web.Application() app["args"] = args app.router.add_get("/", display_message) return app ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/client_auth.py0000755000175100001710000000104700000000000017227 0ustar00runnerdocker#!/usr/bin/env python3 import asyncio import aiohttp async def fetch(session): print("Query http://httpbin.org/basic-auth/andrew/password") async with session.get("http://httpbin.org/basic-auth/andrew/password") as resp: print(resp.status) body = await resp.text() print(body) async def go(loop): async with aiohttp.ClientSession( auth=aiohttp.BasicAuth("andrew", "password"), loop=loop ) as session: await fetch(session) loop = asyncio.get_event_loop() loop.run_until_complete(go(loop)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/client_json.py0000755000175100001710000000075100000000000017240 0ustar00runnerdocker#!/usr/bin/env python3 import asyncio import aiohttp async def fetch(session: aiohttp.ClientSession) -> None: print("Query http://httpbin.org/get") async with session.get("http://httpbin.org/get") as resp: print(resp.status) data = await resp.json() print(data) async def go(loop): async with aiohttp.ClientSession(loop=loop) as session: await fetch(session) loop = asyncio.get_event_loop() loop.run_until_complete(go(loop)) loop.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/client_ws.py0000755000175100001710000000415200000000000016717 0ustar00runnerdocker#!/usr/bin/env python3 """websocket cmd client for wssrv.py example.""" import argparse import asyncio import signal import sys import aiohttp async def start_client(loop, url): name = input("Please enter your name: ") # input reader def stdin_callback(): line = sys.stdin.buffer.readline().decode("utf-8") if not line: loop.stop() else: ws.send_str(name + ": " + line) loop.add_reader(sys.stdin.fileno(), stdin_callback) async def dispatch(): while True: msg = await ws.receive() if msg.type == aiohttp.WSMsgType.TEXT: print("Text: ", msg.data.strip()) elif msg.type == aiohttp.WSMsgType.BINARY: print("Binary: ", msg.data) elif msg.type == aiohttp.WSMsgType.PING: ws.pong() elif msg.type == aiohttp.WSMsgType.PONG: print("Pong received") else: if msg.type == aiohttp.WSMsgType.CLOSE: await ws.close() elif msg.type == aiohttp.WSMsgType.ERROR: print("Error during receive %s" % ws.exception()) elif msg.type == aiohttp.WSMsgType.CLOSED: pass break # send request async with aiohttp.ClientSession() as session: async with session.ws_connect(url, autoclose=False, autoping=False) as ws: await dispatch() ARGS = argparse.ArgumentParser( description="websocket console client for wssrv.py example." ) ARGS.add_argument( "--host", action="store", dest="host", default="127.0.0.1", help="Host name" ) ARGS.add_argument( "--port", action="store", dest="port", default=8080, type=int, help="Port number" ) if __name__ == "__main__": args = ARGS.parse_args() if ":" in args.host: args.host, port = args.host.split(":", 1) args.port = int(port) url = f"http://{args.host}:{args.port}" loop = asyncio.get_event_loop() loop.add_signal_handler(signal.SIGINT, loop.stop) loop.create_task(start_client(loop, url)) loop.run_forever() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/curl.py0000755000175100001710000000164500000000000015701 0ustar00runnerdocker#!/usr/bin/env python3 import argparse import asyncio import aiohttp async def curl(url): async with aiohttp.ClientSession() as session: async with session.request("GET", url) as response: print(repr(response)) chunk = await response.content.read() print("Downloaded: %s" % len(chunk)) if __name__ == "__main__": ARGS = argparse.ArgumentParser(description="GET url example") ARGS.add_argument("url", nargs=1, metavar="URL", help="URL to download") ARGS.add_argument( "--iocp", default=False, action="store_true", help="Use ProactorEventLoop on Windows", ) options = ARGS.parse_args() if options.iocp: from asyncio import events, windows_events el = windows_events.ProactorEventLoop() events.set_event_loop(el) loop = asyncio.get_event_loop() loop.run_until_complete(curl(options.url[0])) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/fake_server.py0000755000175100001710000000746000000000000017231 0ustar00runnerdocker#!/usr/bin/env python3 import asyncio import pathlib import socket import ssl import aiohttp from aiohttp import web from aiohttp.abc import AbstractResolver from aiohttp.resolver import DefaultResolver from aiohttp.test_utils import unused_port class FakeResolver(AbstractResolver): _LOCAL_HOST = {0: "127.0.0.1", socket.AF_INET: "127.0.0.1", socket.AF_INET6: "::1"} def __init__(self, fakes, *, loop): """fakes -- dns -> port dict""" self._fakes = fakes self._resolver = DefaultResolver(loop=loop) async def resolve(self, host, port=0, family=socket.AF_INET): fake_port = self._fakes.get(host) if fake_port is not None: return [ { "hostname": host, "host": self._LOCAL_HOST[family], "port": fake_port, "family": family, "proto": 0, "flags": socket.AI_NUMERICHOST, } ] else: return await self._resolver.resolve(host, port, family) async def close(self) -> None: self._resolver.close() class FakeFacebook: def __init__(self, *, loop): self.loop = loop self.app = web.Application(loop=loop) self.app.router.add_routes( [ web.get("/v2.7/me", self.on_me), web.get("/v2.7/me/friends", self.on_my_friends), ] ) self.runner = web.AppRunner(self.app) here = pathlib.Path(__file__) ssl_cert = here.parent / "server.crt" ssl_key = here.parent / "server.key" self.ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) self.ssl_context.load_cert_chain(str(ssl_cert), str(ssl_key)) async def start(self): port = unused_port() self.runner = web.AppRunner(self.app) await self.runner.setup() site = web.TCPSite(self.runner, "127.0.0.1", port, ssl_context=self.ssl_context) await site.start() return {"graph.facebook.com": port} async def stop(self): await self.runner.cleanup() async def on_me(self, request): return web.json_response({"name": "John Doe", "id": "12345678901234567"}) async def on_my_friends(self, request): return web.json_response( { "data": [ {"name": "Bill Doe", "id": "233242342342"}, {"name": "Mary Doe", "id": "2342342343222"}, {"name": "Alex Smith", "id": "234234234344"}, ], "paging": { "cursors": { "before": "QVFIUjRtc2c5NEl0ajN", "after": "QVFIUlpFQWM0TmVuaDRad0dt", }, "next": ( "https://graph.facebook.com/v2.7/12345678901234567/" "friends?access_token=EAACEdEose0cB" ), }, "summary": {"total_count": 3}, } ) async def main(loop): token = "ER34gsSGGS34XCBKd7u" fake_facebook = FakeFacebook(loop=loop) info = await fake_facebook.start() resolver = FakeResolver(info, loop=loop) connector = aiohttp.TCPConnector(loop=loop, resolver=resolver, verify_ssl=False) async with aiohttp.ClientSession(connector=connector, loop=loop) as session: async with session.get( "https://graph.facebook.com/v2.7/me", params={"access_token": token} ) as resp: print(await resp.json()) async with session.get( "https://graph.facebook.com/v2.7/me/friends", params={"access_token": token} ) as resp: print(await resp.json()) await fake_facebook.stop() loop = asyncio.get_event_loop() loop.run_until_complete(main(loop)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/lowlevel_srv.py0000644000175100001710000000104600000000000017447 0ustar00runnerdockerimport asyncio from aiohttp import web async def handler(request): return web.Response(text="OK") async def main(loop): server = web.Server(handler) await loop.create_server(server, "127.0.0.1", 8080) print("======= Serving on http://127.0.0.1:8080/ ======") # pause here for very long time by serving HTTP requests and # waiting for keyboard interruption await asyncio.sleep(100 * 3600) loop = asyncio.get_event_loop() try: loop.run_until_complete(main(loop)) except KeyboardInterrupt: pass loop.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/server.crt0000644000175100001710000000211700000000000016372 0ustar00runnerdocker-----BEGIN CERTIFICATE----- MIIDADCCAegCCQCgevpPMuTTLzANBgkqhkiG9w0BAQsFADBCMQswCQYDVQQGEwJV QTEQMA4GA1UECAwHVWtyYWluZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ dHkgTHRkMB4XDTE2MDgwNzIzMTMwOFoXDTI2MDgwNTIzMTMwOFowQjELMAkGA1UE BhMCVUExEDAOBgNVBAgMB1VrcmFpbmUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp dHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOUgkn3j X/sdg6GGueGDHCM+snIUVY3fM6D4jXjyBhnT3TqKG1lJwCGYR11AD+2SJYppU+w4 QaF6YZwMeZBKy+mVQ9+CrVYyKQE7j9H8XgNEHV9BQzoragT8lia8eC5aOQzUeX8A xCSSbsnyT/X+S1IKdd0txLOeZOD6pWwJoc3dpDELglk2b1tzhyN2GjQv3aRHj55P x7127MeZyRXwODFpXrpbnwih4OqkA4EYtmqFbZttGEzMhd4Y5mkbyuRbGM+IE99o QJMvnIkjAfUo0aKnDrcAIkWCkwLIci9TIG6u3R1P2Tn+HYVntzQZ4BnxanbFNQ5S 9ARd3529EmO3BzUCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAXyiw1+YUnTEDI3C/ vq1Vn9pnwZALVQPiPlTqEGkl/nbq0suMmeZZG7pwrOJp3wr+sGwRAv9sPTro6srf Vj12wTo4LrTRKEDuS+AUJl0Mut7cPGIUKo+MGeZmmnDjMqcjljN3AO47ef4eWYo5 XGe4r4NDABEk5auOD/vQW5IiIMdmWsaMJ+0mZNpAV2NhAD/6ia28VvSL/yuaNqDW TYTUYHWLH08H6M6qrQ7FdoIDyYR5siqBukQzeqlnuq45bQ3ViYttNIkzZN4jbWJV /MFYLuJQ/fNoalDIC+ec0EIa9NbrfpoocJ8h6HlmWOqkES4QpBSOrkVid64Cdy3P JgiEWg== -----END CERTIFICATE----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/server.csr0000644000175100001710000000167000000000000016374 0ustar00runnerdocker-----BEGIN CERTIFICATE REQUEST----- MIIChzCCAW8CAQAwQjELMAkGA1UEBhMCVUExEDAOBgNVBAgMB1VrcmFpbmUxITAf BgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAOUgkn3jX/sdg6GGueGDHCM+snIUVY3fM6D4jXjyBhnT 3TqKG1lJwCGYR11AD+2SJYppU+w4QaF6YZwMeZBKy+mVQ9+CrVYyKQE7j9H8XgNE HV9BQzoragT8lia8eC5aOQzUeX8AxCSSbsnyT/X+S1IKdd0txLOeZOD6pWwJoc3d pDELglk2b1tzhyN2GjQv3aRHj55Px7127MeZyRXwODFpXrpbnwih4OqkA4EYtmqF bZttGEzMhd4Y5mkbyuRbGM+IE99oQJMvnIkjAfUo0aKnDrcAIkWCkwLIci9TIG6u 3R1P2Tn+HYVntzQZ4BnxanbFNQ5S9ARd3529EmO3BzUCAwEAAaAAMA0GCSqGSIb3 DQEBCwUAA4IBAQDO/PSd29KgisTdGXhntg7yBEhBAjsDW7uQCrdrPSZtFyN6wUHy /1yrrWe56ZuW8jpuP5tG0eTZ+0bT2RXIRot8a2Cc3eBhpoe8M3d84yXjKAoHutGE 5IK+TViQdvT3pT3a7pTmjlf8Ojq9tx+U2ckiz8Ccnjd9yM47M9NgMhrS1aBpVZSt gOD+zzrqMML4xks9id94H7bi9Tgs3AbEJIyDpBpoK6i4OvK7KTidCngCg80qmdTy bcScLapoy1Ped2BKKuxWdOOlP+mDJatc/pcfBLE13AncQjJgMerS9M5RWCBjmRow A+aB6fBEU8bOTrqCryfBeTiV6xzyDDcIXtc6 -----END CERTIFICATE REQUEST----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/server.key0000644000175100001710000000321300000000000016370 0ustar00runnerdocker-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEA5SCSfeNf+x2DoYa54YMcIz6ychRVjd8zoPiNePIGGdPdOoob WUnAIZhHXUAP7ZIlimlT7DhBoXphnAx5kErL6ZVD34KtVjIpATuP0fxeA0QdX0FD OitqBPyWJrx4Llo5DNR5fwDEJJJuyfJP9f5LUgp13S3Es55k4PqlbAmhzd2kMQuC WTZvW3OHI3YaNC/dpEePnk/HvXbsx5nJFfA4MWleulufCKHg6qQDgRi2aoVtm20Y TMyF3hjmaRvK5FsYz4gT32hAky+ciSMB9SjRoqcOtwAiRYKTAshyL1Mgbq7dHU/Z Of4dhWe3NBngGfFqdsU1DlL0BF3fnb0SY7cHNQIDAQABAoIBAG9BJ6B03VADfrzZ vDwh+3Gpqd/2u6wNqvYIejk123yDATLBiJIMW3x0goJm7tT+V7gjeJqEnmmYEPlC nWxQxT6AOdq3iw8FgB+XGjhuAAA5/MEZ4VjHZ81QEGBytzBaosT2DqB6cMMJTz5D qEvb1Brb9WsWJCLLUFRloBkbfDOG9lMvt34ixYTTmqjsVj5WByD5BhzKH51OJ72L 00IYpvrsEOtSev1hNV4199CHPYE90T/YQVooRBiHtTcfN+/KNVJu6Rf/zcaJ3WMS 1l3MBI8HwMimjKKkbddpoMHyFMtSNmS9Yq+4a9w7XZo1F5rt88hYSCtAF8HRAarX 0VBCJmkCgYEA9HenBBnmfDoN857femzoTHdWQQrZQ4YPAKHvKPlcgudizE5tQbs0 iTpwm+IsecgJS2Rio7zY+P7A5nKFz3N5c0IX3smYo0J2PoakkLAm25KMxFZYBuz4 MFWVdfByAU7d28BdNfyOVbA2kU2eal9lJ0yPLpMLbH8+bbvw5uBS808CgYEA7++p ftwib3DvKWMpl6G5eA1C2xprdbE0jm2fSr3LYp/vZ4QN2V6kK2YIlyUqQvhYCnxX oIP3v2MWDRHKKwJtBWR4+t23PaDaSXS2Ifm0qhRxwSm/oqpAJQXbR7VzxXp4/4FP 1SgkLe51bubc4h+cDngqBLcplCanvj52CqhqzDsCgYAEIhG8zANNjl22BLWaiETV Jh9bMifCMH4IcLRuaOjbfbX55kmKlvOobkiBGi3OUUd28teIFSVF8GiqfL0uaLFg 9XkZ1yaxe+or3HLjz1aY171xhFQwqcj4aDoCqHIE+6Rclr/8raxqXnRNuJY5DivT okO5cdr7lpsjl83W2WwNmQKBgCPXi1xWChbXqgJmu8nY8NnMMVaFpdPY+t7j5U3G +GDtP1gZU/BKwP9yqInblWqXqp82X+isjg/a/2pIZAj0vdB2Z9Qh1sOwCau7cZG1 uZVGpI+UavojsJ1XOKCHrJmtZ/HTIVfYPT9XRdehSRHGYwuOS8iUi/ODqr8ymXOS IRINAoGBAMEmhTihgFz6Y8ezRK3QTubguehHZG1zIvtgVhOk+8hRUTSJPI9nBJPC 4gOZsPx4g2oLK6PiudPR79bhxRxPACCMnXkdwZ/8FaIdmvRHsWVs8T80wID0wthI r5hW4uqi9CcKZrGWH7mx9cVJktspeGUczvKyzNMfCaojwzA/49Z1 -----END RSA PRIVATE KEY----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/server_simple.py0000644000175100001710000000131600000000000017603 0ustar00runnerdocker# server_simple.py from aiohttp import web async def handle(request): name = request.match_info.get("name", "Anonymous") text = "Hello, " + name return web.Response(text=text) async def wshandle(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: if msg.type == web.WSMsgType.text: await ws.send_str(f"Hello, {msg.data}") elif msg.type == web.WSMsgType.binary: await ws.send_bytes(msg.data) elif msg.type == web.WSMsgType.close: break return ws app = web.Application() app.add_routes( [web.get("/", handle), web.get("/echo", wshandle), web.get("/{name}", handle)] ) web.run_app(app) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/static_files.py0000755000175100001710000000026500000000000017402 0ustar00runnerdocker#!/usr/bin/env python3 import pathlib from aiohttp import web app = web.Application() app.router.add_static("/", pathlib.Path(__file__).parent, show_index=True) web.run_app(app) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/web_classview.py0000755000175100001710000000274100000000000017567 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web class based views.""" import functools import json from aiohttp import web class MyView(web.View): async def get(self): return web.json_response( { "method": "get", "args": dict(self.request.query), "headers": dict(self.request.headers), }, dumps=functools.partial(json.dumps, indent=4), ) async def post(self): data = await self.request.post() return web.json_response( { "method": "post", "args": dict(self.request.query), "data": dict(data), "headers": dict(self.request.headers), }, dumps=functools.partial(json.dumps, indent=4), ) async def index(request): txt = """ Class based view example

    Class based view example

    • / This page
    • /get Returns GET data.
    • /post Returns POST data.
    """ return web.Response(text=txt, content_type="text/html") def init(): app = web.Application() app.router.add_get("/", index) app.router.add_get("/get", MyView) app.router.add_post("/post", MyView) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/web_cookies.py0000755000175100001710000000165000000000000017221 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web basic server with cookies.""" from pprint import pformat from typing import NoReturn from aiohttp import web tmpl = """\ Login
    Logout
    {}
    """ async def root(request): resp = web.Response(content_type="text/html") resp.text = tmpl.format(pformat(request.cookies)) return resp async def login(request: web.Request) -> NoReturn: exc = web.HTTPFound(location="/") exc.set_cookie("AUTH", "secret") raise exc async def logout(request: web.Request) -> NoReturn: exc = web.HTTPFound(location="/") exc.del_cookie("AUTH") raise exc def init(): app = web.Application() app.router.add_get("/", root) app.router.add_get("/login", login) app.router.add_get("/logout", logout) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/web_rewrite_headers_middleware.py0000755000175100001710000000125700000000000023141 0ustar00runnerdocker#!/usr/bin/env python3 """Example for rewriting response headers by middleware.""" from aiohttp import web from aiohttp.typedefs import Handler async def handler(request): return web.Response(text="Everything is fine") @web.middleware async def middleware(request: web.Request, handler: Handler) -> web.StreamResponse: try: response = await handler(request) except web.HTTPException as exc: raise exc if not response.prepared: response.headers["SERVER"] = "Secured Server Software" return response def init(): app = web.Application(middlewares=[middleware]) app.router.add_get("/", handler) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/web_srv.py0000755000175100001710000000255000000000000016377 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web basic server.""" import textwrap from aiohttp import web async def intro(request): txt = textwrap.dedent( """\ Type {url}/hello/John {url}/simple or {url}/change_body in browser url bar """ ).format(url="127.0.0.1:8080") binary = txt.encode("utf8") resp = web.StreamResponse() resp.content_length = len(binary) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(binary) return resp async def simple(request): return web.Response(text="Simple answer") async def change_body(request): resp = web.Response() resp.body = b"Body changed" resp.content_type = "text/plain" return resp async def hello(request): resp = web.StreamResponse() name = request.match_info.get("name", "Anonymous") answer = ("Hello, " + name).encode("utf8") resp.content_length = len(answer) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(answer) await resp.write_eof() return resp def init(): app = web.Application() app.router.add_get("/", intro) app.router.add_get("/simple", simple) app.router.add_get("/change_body", change_body) app.router.add_get("/hello/{name}", hello) app.router.add_get("/hello", hello) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/web_srv_route_deco.py0000644000175100001710000000251700000000000020607 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web basic server with decorator definition for routes.""" import textwrap from aiohttp import web routes = web.RouteTableDef() @routes.get("/") async def intro(request): txt = textwrap.dedent( """\ Type {url}/hello/John {url}/simple or {url}/change_body in browser url bar """ ).format(url="127.0.0.1:8080") binary = txt.encode("utf8") resp = web.StreamResponse() resp.content_length = len(binary) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(binary) return resp @routes.get("/simple") async def simple(request): return web.Response(text="Simple answer") @routes.get("/change_body") async def change_body(request): resp = web.Response() resp.body = b"Body changed" resp.content_type = "text/plain" return resp @routes.get("/hello") async def hello(request): resp = web.StreamResponse() name = request.match_info.get("name", "Anonymous") answer = ("Hello, " + name).encode("utf8") resp.content_length = len(answer) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(answer) await resp.write_eof() return resp def init(): app = web.Application() app.router.add_routes(routes) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/web_srv_route_table.py0000644000175100001710000000266400000000000020767 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web basic server with table definition for routes.""" import textwrap from aiohttp import web async def intro(request): txt = textwrap.dedent( """\ Type {url}/hello/John {url}/simple or {url}/change_body in browser url bar """ ).format(url="127.0.0.1:8080") binary = txt.encode("utf8") resp = web.StreamResponse() resp.content_length = len(binary) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(binary) return resp async def simple(request): return web.Response(text="Simple answer") async def change_body(request): resp = web.Response() resp.body = b"Body changed" resp.content_type = "text/plain" return resp async def hello(request): resp = web.StreamResponse() name = request.match_info.get("name", "Anonymous") answer = ("Hello, " + name).encode("utf8") resp.content_length = len(answer) resp.content_type = "text/plain" await resp.prepare(request) await resp.write(answer) await resp.write_eof() return resp def init(): app = web.Application() app.router.add_routes( [ web.get("/", intro), web.get("/simple", simple), web.get("/change_body", change_body), web.get("/hello/{name}", hello), web.get("/hello", hello), ] ) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/web_ws.py0000755000175100001710000000261100000000000016214 0ustar00runnerdocker#!/usr/bin/env python3 """Example for aiohttp.web websocket server.""" import os from aiohttp import web WS_FILE = os.path.join(os.path.dirname(__file__), "websocket.html") async def wshandler(request): resp = web.WebSocketResponse() available = resp.can_prepare(request) if not available: with open(WS_FILE, "rb") as fp: return web.Response(body=fp.read(), content_type="text/html") await resp.prepare(request) await resp.send_str("Welcome!!!") try: print("Someone joined.") for ws in request.app["sockets"]: await ws.send_str("Someone joined") request.app["sockets"].append(resp) async for msg in resp: if msg.type == web.WSMsgType.TEXT: for ws in request.app["sockets"]: if ws is not resp: await ws.send_str(msg.data) else: return resp return resp finally: request.app["sockets"].remove(resp) print("Someone disconnected.") for ws in request.app["sockets"]: await ws.send_str("Someone disconnected.") async def on_shutdown(app): for ws in app["sockets"]: await ws.close() def init(): app = web.Application() app["sockets"] = [] app.router.add_get("/", wshandler) app.on_shutdown.append(on_shutdown) return app web.run_app(init()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/examples/websocket.html0000644000175100001710000000447300000000000017235 0ustar00runnerdocker

    Chat!

     | Status: disconnected
    ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/pyproject.toml0000644000175100001710000000070500000000000015451 0ustar00runnerdocker[build-system] requires = [ "setuptools >= 46.4.0", ] build-backend = "setuptools.build_meta" [tool.towncrier] package = "aiohttp" filename = "CHANGES.rst" directory = "CHANGES/" title_format = "{version} ({project_date})" template = "CHANGES/.TEMPLATE.rst" issue_format = "`#{issue} `_" [tool.cibuildwheel] test-command = "" # don't build PyPy wheels, install from source instead skip = "pp*" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0784526 aiohttp-3.8.1/setup.cfg0000644000175100001710000000743000000000000014360 0ustar00runnerdocker[metadata] name = aiohttp version = attr: aiohttp.__version__ url = https://github.com/aio-libs/aiohttp project_urls = Chat: Gitter = https://gitter.im/aio-libs/Lobby CI: GitHub Actions = https://github.com/aio-libs/aiohttp/actions?query=workflow%%3ACI Coverage: codecov = https://codecov.io/github/aio-libs/aiohttp Docs: Changelog = https://docs.aiohttp.org/en/stable/changes.html Docs: RTD = https://docs.aiohttp.org GitHub: issues = https://github.com/aio-libs/aiohttp/issues GitHub: repo = https://github.com/aio-libs/aiohttp description = Async http client/server framework (asyncio) long_description = file: README.rst long_description_content_type = text/x-rst maintainer = aiohttp team maintainer_email = team@aiohttp.org license = Apache 2 license_files = LICENSE.txt classifiers = Development Status :: 5 - Production/Stable Framework :: AsyncIO Intended Audience :: Developers License :: OSI Approved :: Apache Software License Operating System :: POSIX Operating System :: MacOS :: MacOS X Operating System :: Microsoft :: Windows Programming Language :: Python Programming Language :: Python :: 3 Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Topic :: Internet :: WWW/HTTP [options] python_requires = >=3.6 packages = find: zip_safe = False include_package_data = True install_requires = attrs >= 17.3.0 charset-normalizer >=2.0, < 3.0 multidict >=4.5, < 7.0 async_timeout >= 4.0.0a3, < 5.0 asynctest == 0.13.0; python_version<"3.8" yarl >= 1.0, < 2.0 idna-ssl >= 1.0; python_version<"3.7" typing_extensions >= 3.7.4; python_version<"3.8" frozenlist >= 1.1.1 aiosignal >= 1.1.2 [options.extras_require] speedups = aiodns Brotli cchardet [options.packages.find] exclude = examples [options.package_data] * = *.so [pep8] max-line-length = 79 [easy_install] zip_ok = false [flake8] ignore = N801,N802,N803,E203,E226,E305,W504,E252,E301,E302,E704,W503,W504,F811,D1,D4 max-line-length = 88 [isort] line_length = 88 include_trailing_comma = True multi_line_output = 3 force_grid_wrap = 0 combine_as_imports = True known_third_party = jinja2,pytest,multidict,yarl,gunicorn,freezegun,async_generator known_first_party = aiohttp,aiohttp_jinja2,aiopg [report] exclude_lines = @abc.abstractmethod @abstractmethod [coverage:run] branch = True source = aiohttp, tests omit = site-packages [tool:pytest] addopts = --durations=10 -v -ra --showlocals --cov=aiohttp --cov=tests/ filterwarnings = error ignore:module 'ssl' has no attribute 'OP_NO_COMPRESSION'. The Python interpreter is compiled against OpenSSL < 1.0.0. Ref. https.//docs.python.org/3/library/ssl.html#ssl.OP_NO_COMPRESSION:UserWarning ignore:Exception ignored in. :pytest.PytestUnraisableExceptionWarning:_pytest.unraisableexception ignore:The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.:DeprecationWarning:asyncio junit_suite_name = aiohttp_test_suite norecursedirs = dist docs build .tox .eggs minversion = 3.8.2 testpaths = tests/ junit_family = xunit2 xfail_strict = true [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/setup.py0000644000175100001710000000310700000000000014246 0ustar00runnerdockerimport os import pathlib import sys from setuptools import Extension, setup if sys.version_info < (3, 6): raise RuntimeError("aiohttp 3.x requires Python 3.6+") NO_EXTENSIONS = bool(os.environ.get("AIOHTTP_NO_EXTENSIONS")) # type: bool HERE = pathlib.Path(__file__).parent IS_GIT_REPO = (HERE / ".git").exists() if sys.implementation.name != "cpython": NO_EXTENSIONS = True if IS_GIT_REPO and not (HERE / "vendor/llhttp/README.md").exists(): print("Install submodules when building from git clone", file=sys.stderr) print("Hint:", file=sys.stderr) print(" git submodule update --init", file=sys.stderr) sys.exit(2) # NOTE: makefile cythonizes all Cython modules extensions = [ Extension("aiohttp._websocket", ["aiohttp/_websocket.c"]), Extension( "aiohttp._http_parser", [ "aiohttp/_http_parser.c", "aiohttp/_find_header.c", "vendor/llhttp/build/c/llhttp.c", "vendor/llhttp/src/native/api.c", "vendor/llhttp/src/native/http.c", ], define_macros=[("LLHTTP_STRICT_MODE", 0)], include_dirs=["vendor/llhttp/build"], ), Extension("aiohttp._helpers", ["aiohttp/_helpers.c"]), Extension("aiohttp._http_writer", ["aiohttp/_http_writer.c"]), ] build_type = "Pure" if NO_EXTENSIONS else "Accelerated" setup_kwargs = {} if NO_EXTENSIONS else {"ext_modules": extensions} print("*********************", file=sys.stderr) print("* {build_type} build *".format_map(locals()), file=sys.stderr) print("*********************", file=sys.stderr) setup(**setup_kwargs) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1636920323.038452 aiohttp-3.8.1/tests/0000755000175100001710000000000000000000000013675 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/aiohttp.jpg0000644000175100001710000001476000000000000016057 0ustar00runnerdockerJFIFHHXExifMM*i&8Photoshop 3.08BIM8BIM%ُ B~C C  " @!1AQa"2qBRb#3Cr$%47 !1AQaq"B2Rbr ?і6=ec C!q3g╂<7>Ԟ?,S5ȴHXKקX)6U?~F= ]kLCMm:JodaqoIR(JʗR*~ùbLfD%X}ϓNcگFӱJEHupYf*Ϙ=EeI;4 )9^xxBsnTL7,&T~}ҧM!,ë4l EHX8A!Nmduzg>2hi3!$ 4cݾ?)s'/,@vI\flXŅG pErF}ĭ5b :H/mxPj*OO*}qlC; xĘinB3lv_3a  ob5'Jx(:( z}-$2Ht9%*%Mqvv'+N~ղ*\34eHLȪ$xP{70=iNujyr0Xzk,i9QZ!A L^.+'ncB۹ Lأ(@!KéَYR?ċ[VsxLw.fr>L*vDǩqXۍ x[Ja;5O1pO=0h*Ǒ\5=V'EIY# ̬:F[(|hFF|0epQ<_.G4Cۯf@/Е;9fiM m.I=os~8 ՚@rxQcn:`n#S>'rmrkb]%+I+|@Ow;tjLnTԝO^dl{iT\cP? NAaa+R9MʋpU7)X"y\(']Mb=~ XⴒZ33Βo]k`b;\QQiԒesd:~ l~&{߄yglLNrvƪz3Tfi 0,xkΐS7okszjqWQsesmڝz4[$cL㩿}<cDzgEԿhLkS4 m5)w&bZ4YQIM? q!qAQl78YTOE]5^h+c,#U^ xَ!Wߩ7';fC4܀$l uLT87(T0l|13l҂FT'Sb  <<>5cJ]-a,jzP tk}?6XӨqifuutYY#VU1(<%hXsF`P r"#p<Զ`o`<>, 70jt ?6k&{\7Y{M#YcY0ئjtcFbH?Cd?-ɦ?W[qm;Bԡ`5WVб9ՒO(TbzPdxr;7;;s6?2Ϝj2"ZB~gQ~AZNڒ8,$qB+ Rp2{O Cپ>QyY&"4XpG~cjbK攙6S!xY%y _i#4`˫٢OPF}C.o< bX*}Sƈ(I *:$߇٩rY{6aGWۓV028^=fM:J,O}jVIO+<,DB!YW_91wG߱R}[~d, c_bV",vY2Z 5>qҺ9"&HMnQ]$jhڏX;A8`RM4Md?]Ӟmܗ7Ҍ)dp+S7cHARUμ|m\XO bb#hEͅ}QٖUCU$+K (#c u. \#uy*T*"з@`a'l/SO)kVQZNm΃NTVx QS|O9ip ͻĶIPV)gFgI"o$2擛1E ә"S44W⹩(R=t3OZQxψ'熕3I;xz}Ky]G u8eQL)1u[ߝ[N!nhHe>0J?JԊc 2`ክZ_%*߅~( orYNb-.PSJ"<8TlSݻM5fi7j;yQD>`KкnUZfTu86dF?]ћ=qڅ+l ɽ:}ӿu'㟣1W.$.1GQY׎ 5C։`%60)RVHQ9>BǑ=&G4T9Zt76-XI9n͚IQ~Ĝ@vёY\Z(`z:@\J+n {&ϵGf0B(:>煐 fۭFֺ7rDk!%x1ݍjw?쨓- Jd\WfV!\){QU$ōpDH*TB8`[_b\y:rRO$OP9D7^Ina-"1 E_8UMxpfnɯRUj[9Xeaԭ+~ĩ`i@hE wd{J3䕪^~2ޘ7MW4g杤Eܲ6 uCh])z &[!JGrb׹cwg8+B$B  W5üISboΘ$+Scb >c:8 y:)f;]@kxƞ-v%,PKNKx{~%GhQgs!ati2 !/ 0FOmώƂ4[e$IʜRj7'(y33G۠{uA,ʕgxFX"nKfOMKhs:KmfU? TSO%-Tm I"qfF43\`-$gٕ|=تj-vNj!>b<1UN :R$XxqҧK A )F3C\TIY@G=ǨJ}Xs[:Tq7 OKw9╪ͪ) ;>M{ezV tOK?l|xm#Ji$#i|qaנۭM4KԉPyH!Ď+uX9K+I)ƷU;M'm۴ʟ/ѹRFiRwf~'iS.;b֧9I(m92 IWZiVJެ1>a}S蝧:{.p8xP)SR@jevbZKF<Q)N6cI$QQQC$HAvf= z_!Cq`Y9Nj샻Һ3!O!xyݍwO|/O4LE{ݾLً5~9u<9sebf+hK:g9MU*C ,W,*T)Ȇ~#FϘ:vZgiV>b0/+3Ngiҵv:w !TG*ȡ+Z_.Nt@/sJ78dp'~9XEǛ_Ae?/,0[0,0C[ʇIcxdاǣ5vMJ&KZ"q#H*O_3Ofړ2itYd7WDZya I=SKZE,A5\ы!1t-)P"G )e"r? bÔvOjj֦h`O0feq#9MIF?հ5[U,z*-%tP_IDATxuײ.jd|-  ,AA xH  !ø~ݫ~MBdsϽ^/n p‰(TRUTFeTF4A@ ԜgKAT@T@~G~"8P82 6nv_ܓ{rO ~%o[^NNb\q=Ne1@)B)@ ;((elDDDBPI'tzI/%ݤt!:yy}A_}QQyyox`08Tގ؎QQY$+XKRT~H+Ҋ>m3|UXU&7EqQ\$\L4L"O >zy,V}Iq"'r"<4ɐ~ZH irQ\eDQFTSc8F9(堓tNjZMX5P?>TzWxX܎q;Ygb^,rjh5Z]ܕrWH|J)RJq+n-oEl!&&,¬,em\\0 0VYeU+ߕnXED+JXu:|L;NSݤnR7)ZJ-REB5Gaf`FB3Àq=Ѓf$AVmUud*d2̆59~%xRZ57jݠbJ==iȍ\7܋kU*X|p_hmc>r*|2g Z[-^L/C/?)#vfh ԕ'Z|\Rg<奞 ]( ?HAy[|"d9Ua6+QJ94Q@ E{XKM_LQODe{zd;`߫uZ?,u̕hp*%gkjupJTv ߻Fԕ`ދzNx8MΥFz\@WaEDtI#䂧{ IUkh- G!W`Qf%dnc<_S2/j"ZyNWd岏p'p(e2J hE"mZ% $C"*?7 2,`0 x{{[w]G]G]G]nnn\e\^!.9]׸Eϓڹr׋΅j]]^TX>\ύ!ԐgKGd/ٍ( |MU5M_ثE01kp?3hO6cK& W)3HmI.h!uy*Ӝ])Q̉ ϯ_Jǯ'VEkDwR"KQ}^0q;R:G#9J,"A{”+9b ҵl0Tsk9'HGFg8P4CoUa@LޯC[`g,ᤩ?ز_ | h14. Ԗb>){JN۬⭟lk#KwSdwꢀ9#PhAvp9]NjmhZmS99=Y3_b(ʊhF[===3{gCgCgCzz dҮ _$g;0vPxpr GlB@0kPp]k: {7?YenFL`/N/> SWse\boJ%o|ruN~d6&_ѿ=c}k;g0ItX'l/J1{#6r$\rv6i|W#~ďo7%BNh'lll2]Y`7((Yuhv4;fꚸ+&M@rX9G o&5cG7m<(D;8%?M]GQ+\W*x]z `h4HtOC $`#0h5}H tXX_ ֋`P-% ng-/f_L ٔ dC9 IHN `Nկ!#>o8)zIzW,g$Β^pYn~af2!nquw@irXTkj̐qC}}}&bX+f!Po3@/=d#Sq+nŭznF~QgL8uUAʝ?oyݽ:1""!Ab!)m䳍4~"[HfM6Ai*! E0kP@|rWPLsL%h7 uޭf>J#h/1$:.s bZiտJ9>şEO>~ %C}@-!/j-kjnou#$fvr-"Bzk '1ޱ`ha.'T)g١B翋<(&gC&*uuuc18w|^"Ldkf4h**oMb-vvvwZNi9TP [\ |VV|WVw\u>5{LSJhgW.(r Q HTΝX;j̀oo6r7giA[HA%"yq(Oů3D3> o@ 4:xGO݇fY,/AVx{3UE#$^ќDFyz]#8R8Rp}tFhڀP444QQQ&&&^F/OȤ_HS8S^s\ y Gz sS{K^I~~SՕöD)tìǔgq*`=9ԏO36)KWstA_jyoad]^_x4@+I6N^A ̇(~jboI LbL{xM4slA=ɏoaIɟ@fb @Ew.)LSvSfZ{2?_;!G5/Vjw3&JS?XA EN/^,X&^^^XX%P% aKd2?0?0?p777={P'7ߓ5 #ͻ62w[vqMpǓC 4S~to9Nbl5ՃBiv` גCٲ؇d,Uq_Q_A [y4,[JZDǯxiw넡rҹS3&;~+lDd79Q #{X+Vm= ʑً ' %,`1"\@ϥ#ltINTy>gC>`  jإ  s U aߣ@9ydE0ZnKTgX=,-Ve*,iom>0{HiiZew]Ⲹ,.gf!p x,fwݭ5f5E= zR[chvJ+W4t5UZmҁo.<Ū F r0Fۜm Ƞld)гުby Jv^-[XNHNdYͅ|sQȩhvo鿼wpۭףO=n/i $^v8Q l("CWv ROA>c| g 6(Ieo#g_e0RO/&Nڎn&(\rq`(r5MVn{YdFw#vJPdAJ~Q \h&&& , ST$%$ʠ,,˦;3,>@!$W}ηTXYޜG:Ab, pE)qP6}7T뷻nD'_k쇼,yh)Ýar:p |Vv~)ACv$eFz`,Z`5y ;F!%ќ4fUbVzD~ B + l٫nH9 X `!"%}d6eB!"_:MOUf^خ|4`n07N˝666@YTVfOe#נdL˴L\\\o9o9o?$ɗ:Pԉ*wD Xo͇tcX@BBpQSnCdL'Ptp H\m(YS>6Th:"}_^_^_^rrrYYYے7%}2:$|B<9;@zZ{ ?!!ˆA ݖ͎,)/q0Г LHWwf9P]-^47m5ϥ\`o`!?}af}`!(LePVtb $^־j E<RXz`G*"D.Aښ3x*`(_.H8֪mޠy4N#O݈YYyp~ﵣPOsss7͙f6[ͦrTeUCo{{eYAV0Oͧz#YYaN5Mita~9*z7sRutVڱIh߃~V¹pɕnzy@T#_ \0s+:qm|&u;e9/\F/rDŽf땖Cj L{%]L_t)xCRAk4ih[0Ksk]BoqU- ױoQ}NHB %t HA?R4:$bǹ=B RiRil`EC0oYlWKh Mt/UB1wҫ$Y9$:'@k?G~G~G~SSSw[w[w[FhzM^T "A1A o-Ŋ8%%%tEWt -`[/赻 rNvwU83Q/a B qn+`d#57VaTiz - L\\ȃFd Ƈj~q>se?+R,[r 7/wm6O?mX\m-Roا6_}iYt27ީ^5Y~Jo. +c~Jc]ݏ} 󀹯o$L^=#՚G3L$Q) >"V6͒݋0]S/b+rh /.Q,&Ṟ\`pIa Gm]JgU΂eUW~< < Άt6Ў3˾VnQ&'=E飣Nhs .Z`޸G(T۟"EJ 'OxTf*3qq HDk5{nvt QMW~Ғ?>³FuZ]u<LCٰރ!NyGl.j8/7iڷ]^ktE({xCo\-\B)zW3.?] "X!^9̳{xKʓR'ۇ١MrsϙF7 81lۿ sG9qWp(\U@T!Km4_\&qUKxdB:^A@ ِaT}PҼ*xOq"2i"luWt,e6Ϣiby\-"lޫtN*VAK DsbjBmmmɬgnn$?g&]ͮfWEEE~3AcqW=ofݝ.JDyL`HXI5sCWD:Pf'`RB Sd r^=&5PqC"^{4);A\)ԣz^α2=٩XLk s7he{\+Us? Fϝs;]WYI[G% H zU,|=.|u$4]v~߭W4[~$ND6}9%m LS@*-X.:k_cxWWt<k%ϸ4s] <]\U&9qDA0:(htE8牔 sh.W=?BBj'9Fw E'u_E9dNq3h: M![ȣ ]ϯVZI{엳-V5Q8;;{|^iTZj[-ږ"_ȁY1 /swn6F3ve؅!C&LFl׸yDo.x}燘T5H̷FAj@ @*b>G}~rvn}k1VyW/a~[(2jAG {B0XPvBT9Zd󻟯NZI+@0~EYf-<*$6 p xAEi&U !R_rna9JNBsvx:$+dt9:Υq{[6rw{ft4[6Mߩ3yh;|]nBt_]]U챼Q.GMR'!CTP! t4ѷ2K|펌MўV 6tvK>7B^'R¤(AʌU|`|^X6^}Nu+Տf o_(]f^!e}s+s,3+~2+93٬F٪W9i9s};wZ74W鷹跘 ̠5&?wR`>86'ێ߅zF̯EqPczB{ C+ݷӲ95z[UX_ѿEo5{euY]V6lr P0&lba;;;)cwfYk^69+h>~)bZ2nW~gԈs&)fPAHC9?ebtmRWqgmy/]tU;e= px4 /?ATͧ-",JA`\VnhhT[DCf쁣 & M}߶ 䘚#n4_&8 Aqt7!זEɬJq\Nf~?%LtnNƱZ([JoO'Pw;jeE:@&L|y|a,7FAҷkÂ)G^I :巫zf\Luy2 C'|4?.-_g~©o輐xħ)YhZS~ǻQi# JZSN'9|YVOv>%iն%Usa}u#HT{l,/$ Eh+PJh϶zK4$n$ [ၿ=gM]2Q-?:3Xֲ -~D? `៸%@`1L~,3T?E6>l9[F8xݨI"^>4MoEwN9 .;Qy[ }G|+5rΒҙ*i1ퟄDxqL#Z\MnX yv.<;9 9 9@U*988dI_VMeڻi尿,Y`3{={={~&[]q7f$ZZY}64_uM`G9s) _\r9ʥ|tZj -s:S5g$F+& A;GPi(?ᨨv6]/~ u17qx!qWhU򏥺t1r;N>W m( ~g8oՐ+*hs~4R*{K ?Dk5'R qs=M9䧲t؅GOb:@t[Vi_2)i`Y/T&32Dۭ<C -KVxD54>,ed\еU0wݜCQ^c?dȘ1 zބڃȎT d c9c|V>+ggg@f)666C=Z/hYxg֤LȏPNE[6qB3|r? =OT F`*KD m,j<һo#:1͉ ;CwFdEÅ^:/eӋГ| &zRK[Jl5gAiqžN"4\LfvtOPO[! ("o,elV˜ ]gbYK;vyV}n ȍ9 ^}ʏ#Gޏ27 _+DP]n1٠r=)VFdS9GGx%<#6Y'쒥<[HV#+aFaA;(>Uh/tj#)o m/H_@x!B`o5@T͜$a.(;H1b/MH b:'h' 9X)ס!Ԃy48M΁A%z?Ox;/>=Vok^+9l0zd|Q "9iA*u="]@ jqd(ۨq3Tu(Yo{{8Jeܓg0kq9=:\f8x^2NKDy\a!;|Rmt$̓XʮjDV:u1cxTg(e򶷉Z]VPPr,d5Y杔]λlPk#$qSrM ?kGm^Ԅ֫TPP{'j3_רZ 'JP?0 c3`bmʪE r'TU+DƋ+BNpgH`łhu7*y?A?d-+Qq~ɾZ-<-eI+>*[v1^4Jc S?!* : DͧI\RT_֤ƣ]t@[g 4$j% 7lӘR N42wq=A5 T)lj:Ps!^50@"[53*Mꔀɮ^ﬔu=J{fY{=YYY=VZZ|s9_3LJDJD(Baq.ą)gʙqqqJMRvvN8>MZuwVy9T8:demJmش dȎ>LGF .r{RȔNlB=`ofMa.D̪DS̾BFܛ9& K#"1~ʯ} f).Wr/ph6g)nfȇS 0z 9ӷ3wXDIe y-W^Ҏ]N%} qHsnxz=-{H t38ڂb)xyhRdc [_M8[Tl\x])(ےQX=AřUTJj w2|C X`0g^wAl(>GVLFw0<@_L%. T6RQ7@چk\{ ;F->͏6-* .|,аLV=ulQHSz"een;41=1R$G`8N: A(%ϟN|&wtV μX[iu,[!5p:\+גZk':AG2 BB*8AK F]{$3 ylW1%p{V1n!/b;zUꥒTJ!ƀC/P RŹ8J>2ZLA_Sȶ=a3;8vz']<#9@p!oxRY\2z?2ϽFmg^KKlfUJY>0`ܨp"lHb ^u[ףEJ >J[!KNAG2rωH͞FC'(' u޷+Yl>Q3 gcg0Jrac`a[#yux59>ڒ!qKN_Wu" [gmqȶ!~_a7Gq1Fi% q^l<ǒ|сSyFW>6uR2@GOǬ1),=@ W#Ljwr\Jm-gSmL_+--(4Wz-]Zv/_VUUUլKll9o7Ifx3f7J:CpkCww0/;aqG%nwQZ qگs&76t~ON H q_bpsI̩_ё]N1b6nTH_1C%i>ο N>zfsyY5d .cXXL%x I)?<ޫ W\x8238(N"z??W 豜>`Qj ' vB'QEz1#t"S"xy\Cԅ:l:r}n\~Uj:3EF_Y}3&q)y4r̒3M.1 [D^שD$ߐb6pUB sJI"A(B !?#(/Tmyޓ7'dItl(:}}}wʗ)_|Yg6-%S2%# {pGl9[6G/k.ͥ!JF-|MaS9ar?|vr+uJb>>ӅJ jk| {}(+㯸05ԧ~깐Wdǫ2dt햣, \_Wg F<}UxI%c6c(0/@W{kk0k3ԝd 7P戳(Vp vV4 _YJ)=9ZV 4~)g\&\ը]%% Sej@֬AS8>+٭" GE^rmŗto 2;kmArϨʈ(A8= e"XœSR:¸Y}4 '&fCѦ ( 2 5SͩlS)21$"Š!g^444zFk bW/ŏWCK{VO2؀ʘixu訃9sPHދV Qak˘!ٮ67$(U${Q>:NSS`c)(P X]ţ)(^|Qt@YNV3=*%s(q_֤(Pd#ٕSdzVpsL$Baq/&3&b6˯9҆ bR2G9[\_hߨϔ|XBx/{ցY_?111W{98)n/%d;c1O jsw=P0cx0O!p _ hYSǗTqg;?xJ!*.agj b1T:TŔ}kOe;溚| 5h"\Kz2GxsYس vA_A@ r y]ƫ@ƮXU~@gҬRذZ#> t wYe,H뵫R*1A`;97@$ ㇱ/wW!ŇR4=00r=ޡ4ojdG1c{o)5iB} %I ^.?tҘ6VȆ2,^Mࠦ4S;1ܛ`C לS'5,͆3,$!f̪2+k'I60a?8+ SR>`CwLx. 0gKsqc8?{FnT;J5 W6Y B$ }p#'TӬEpWBQêXܼg tΧ gY?v uI|Sc=~I]Tw96Cg5}&3.|O :SŌbc1_יMߤ=<`ɒ!wfbl  *k*1y~Ҳu#1= D=Ʌ!;4}V ,z*Oz\JĹm?o0܏ y:{؋4\L(w38OG}-BT_/uss#9lg?7,\~/%U*3wi7݊zhiЋr[ =cC6JB{ktNt(TNy*qثq6QtvM|иl8\^|l} +fBkEI}~XtHh Mz I;khՖpS59%tVBs{x~na_lXӍL)H%]|iI`ځa5"ZBu03Jj`ɸZ=!7rS_/Q7GhFh5ߜ*\ L6^\L,ԠY,\F6Go*TX< 1|c{T@^B<){hѬ`?4QZ "PD]됃oYut~ݱt5[ 9(Τ. 7P0Z掤yۉFk2!sr\eaP5{*Py ,ꂰS6gtǟW->eg )F޲}N澿Ý]k 4V'k P} 8oe畾9 8xys&oCvr+" @v!qkLqO*aMPowiRPfP02T=dUR*"a6CE/3`F'c=?$!^HEn6E2iǾ'*VJsN ٪UtJ1^xG!(Pd3FT5!or`ovh5x gsw2`7\( KZ|R/2bfusVD@(󕠀i'r%qOA;&ɨpXC_ 2 'u5ޠ䅨~ؤ<{x.UH}e*,MÔ}5'Wf}|ޅTTV@)g( op4W)t#mzܜŮ1ߔhPSѓb##=4帼i'ͪIxFmųYT;tyVT A惤m06s6F?bN4&fThc1xV&at@KRHlOy=J) gRS,6ds٬ZF (P+Ory."Py&lL-JCŵp1JT8Jg+}o͂Lﺙ%_m@E) ^6?*XZpgNG{!DYsKƾw_'iuItO]XP 4[!wp gI1˸{;QM] MD*arK| |JxT!qzܼc1j^ͫ1Ӊ">7M^ yAـg:b .ޣ^=Zii`9$,!* Z㸃1='r#QI%b*o;x8cI3'4_\4[3#+`>C9u'P4 dJOwU_U}x{MC\TtB[0lvHC:DPſZ-V*Wl>neMn嘕=hpTE>X4b}IO"Uy7B 3tyI+rO_~9'r!?ե2JlT޷]A>s{+ob PX]|W%|^?p YgZ'։P2.2W\]/K#y@m6xC$< fWhF| ͉`4Ljߙ\7b*.; VegwWA`E/Xw+-xEGa@4scc/wOE./ RqCgcچDfo o%rg a7ϰC $H+*MsBCמʳ?8vX7\+У" z}NEJ!4h-C\ɻS/h{"zi{HyİҡyG^.\|h7/6UCm>Ar`"~G=;Hr UerZOtR}YƗ Ozbҳ]gHO)JTSmG7J5>Kŏ8b+rgs 滅VIBbpB~T9ם=) nqM4"bi2wkې E^b=՞jOKd YU܀ S)soH$v) 7Al zFQ.S`voz)O=.- t딦ְɺbbAhN:Gj#}H2tur=K8%fyfoH`-y8(پswYiyUۡa%}IC}*fPÇLӾԯq`X`浯D2T[Y|\V}_>0"|34'|)6WlMDRg53>Z nn8\+rzZi<_I4}r{L,Ğk23 һ4bDжbq7"]mĀ;Ji%wJ./aK𴫯YbUy (-ବAS<,y%S'zL[kqߓ pvVnR CqH4T 3] M MBɢaQZs웑@}ޥRve pyxA^+y2JF(BChHfRTQVd3MS0h(d%vuރ:GJT{س#auW&eC N٤VV>?~4O<ٿ>@Ȁ)*ރ ?VX0ew^Pð1ɐc[HU^8kWW|r( l0Pd"P'!?Mkk^O3HjOi]8V!u?Ξ"*]aZќFS^n6 J|-k+bRݠ-+ߺ=|9 ga'?<V&(6HDyMNcd̤"HIP]eITM#(͟py+ɧIOK̗ྟK!LcVb7o*ݡuOljȴvé1ATO]Fro"(ޡz VÇL)0;3u;=2krg*Kr 4&2 lm-gYyli4[K/t.ѥ~§DwM?O~ujFE]͡]Jn]enb O9Q]Nh/a]y-*͊t&+kk]aF@”r6`H^'dV6_ QXOyE;X9!iC-B%=Q2VkLv3ie9S_-C){Q\c!Rr8\+g(EDC+ <ZÁH (r6 5=mJ~nNb0*2MYg=q_x*#QsNS)*[?*b&A4peLajˏ:ڶIBTR=6@)o[/}^v'm|Sp:_`@P.fUs}`\QlUj,c39nZܴi|||J@`+bkf؋pC8lVym+o>$,2"!`TNs9`B_n|lb-j.P_dxZɑ4Oq{ӂf_HhUh ahґt(M4tIPMH|`DG쓷=P͟{ @ ;,[,b`" &:~0.D` nNZѺR9-y 6D5M Қ.@>6r+45i>[5JB14v4_ 2 ۸uzEXnPڮjB_gCJ#S=~b}j篖peKIoFzevIy|]zo𪸫XG^,>4ӗ{5m0ˤP*DBK~)#שvYy dGBϢ?꒿fxcM%J_IT<Я2kW3担?*mVu5]kx1<6n=\$ETRY,zMTYjDio+*=,fNXvv& !X@@W"VϨZiHmhdY3g{j&]Gm Ż}hnE2ԑ@j1Z2 me0?U?fP`#Y-e>KSkOQ{F^_ "P%LV'{"&$dTIi:}}T̉ԓޚMAuTFȦ~ oݬV~2,ȆhHA~][:*(M܃B׷S:jr^+W W݉#>pTxpKn-VhzǼHF#fڇI}+ ^$~ү UJkvE4J #U݄ o ?զ .supxY6XljrljyW'0 VN̞߱ZB;>hMa/4i, jNzT>U͞sQZб 󚍢p4ؓ9*nɕTRPޞ/2nQqtpZ{j^4Ң^Ky,ntf 6'x*KB } j B+Yb*8qpD`8Q=* J h5@U:Hs}KzV(g91UFb|UZj]GiwiXTޥuo7}r{_؇htPYDc~.Dzz NRDLLE$#OsGk mM4d'Vc5Vg6v!u: BSRRp$Hqc8?_6)n.(I~ߋ4ǬTۨ [@,,.,QϢU⒕ţ*Ovꐎ&g{Skp3yD˰twhfǣ8rMVnoTQZF} $"P,@5P^Uo! 2DiFcJw?i.>/EYU|v!)^t"{ Q SI 4~=\?qiF 9ZjtM:fnjI>!1nVFM~Jת&p'X+֊ iL[:t88),2C}ۃʷ:mV6r3 {-_Ҵ./Ùn"syEAj*_.<)wV擴;(r<"3~&@k57`EJ(+e}I,鯂T&*rVzz9?~flh&^a}z<g—O<< TNnRz_mה.#_0s9 n j8n-QHԋ&ߊZXAyO}fǎ˧]}&q-{ jg]-0WE yY:统@eIUs-w 4/]Vcڟ}t(ػDو }'|FD78?NysZԳ_\cP0rfar"LxBEIpFt|"@TjAoBr>mEP!Z?XE wqwqWq +`60o"wR&@,zZ*@٠BVaKE|/%=[iq@0C=#O c35l -ײjD|۞} o4; Ճ!R!V"Vjҵ/*r-<.37{dK BKk:Ga~Miv@b#L\Lh}'L%&HG48-KF@|7F`Q.8hbZBhy/HK6w 歧4T*6j6p".ť*/#[ C LnNDSe6i`-c#]|A^%uH&?t| o!  ''Үqw'ZŌ(߅e>ID?#fy3gIkC6oE,B+BQl* ʺCߓNuqC1$U'_`$8ew&lkcSoe4b&mbbOtJ[DxF$Rs6YЄ>A}:+~HYeZ)go:VKچ4, t3R΀ +4DB@GN$lmdw@lD,('P&P_k/7}7=2J-ъ=}%.N^ 5,*]$ОBX‹?dC |?X}y-'ɮOp4=TGݐ&)o8W QfbCE!BaƓy2OSQJ۝B#TʓLiɨ4-6`}훲p5!&ﺋƥ@kة+DO%|xEs{2> d͍BPTvRsņӻTm,{]xߥk $cT{x AVw oY uCkWD.vjSMTﻎrtFLP~Qxlb~[Dy;Tsm.{Tife#˺8|Vlw> Jq6mJn;> Pc(G ǯ` '#Қ9h*g 9Qow VSt,~bnZgSh~D*S$~o09C:zag4TNXzFQQ)j}4Y77;jCgn[Rk%"c+ >{ hR q7]e?c? pGŨ((hƴvn9ENS2;@>D:Sۣy^)hxեK`)Fqgx_ r^CcSAȃi(f:dKghc+c/Q;nHގʯ@H){eQh L+2:AA!+P}e ``u6JyQw3+=?riF솉ضv8sibsTd$( I "@3PAQs9t>'P}yw{-T]Zk)Eh1 {KY.D8p4kuټ!2ٌ~ەZ'x=5}]P $$|8Oi|> ܟpns?RV/w +uQH| W"WSb{޽ց/^Z ,(##gw2}…NBx75gdWs4T4 ?eP}fnW0]"Ԍ-{! P7`v'bb,$źɵLCE3BE~ Arh#RT:9դuJ>C}!_xbG.BEm>6a0,\lهIC t|M#~ wU.GkGH@%VL뼌LtDF&atj1yMMG8R.0qMyt rQN"ASC/Biޯ^^caH(@P:rGlWA̐ U%>L r*P+1(USf/kVD6Q"2Ա|/Q@YUtDGt烠<ʣ<^͇GR}O ZZFCQj0T;jAղD8Fz|uȉ4M$,9ao?zz'>t_ (odxj@EeQ_ + lΒ@HDc7כ'uvHNQWA\83MeeC2SdI: hhBCުa^iwxͱ1M s8'*Om7¡f?ĥd%DQ)@"+MF'. $6,89̈́ `d yb-dߛt"[*w\&b5{[$i - + *ukӺV@_,Dž?͝lw kR[׫;qby껝'ڼ Ӈwon~n=yswaeg3b$Ϳ;E9yл=uײ=7{ܳfٳYQEͩ95nԍ'TA1S3iQs9 Q;:V\.;@g`)`"cd^iΞCE_U`&|\rN- h,o> 1KEHD):Ra, Hto/Bȥ¼<1H̷Zt޴ڇ!9.D@{^SfPu@ ~gAR1KDF4T??j\.ʊ/_hub&)b(1e< pB^a ϋ10~`;+/?B$nxNx\/t_ È߳q.ՖxGPJ,`sz+Ȅn%NDe ̿ d6:o K;5k;ҴJ‰hJF5[ Kv`]$ o>{7M*ij[A*{BHhE\6ҡ?E'H>[/Mr_UBs}y@0#xA=v zE#,>̛FEt NhCyJ HH16>Ei15UxIDAT;ˌ:x#QReo̥ k8~HON|qVw:I-/&MU606X ;]+tT_"*"ͧ4tPJ(%ffb&f `>'(2>oG;+te(ΕPAAQp+\0X*O:U6#llÏ4KB"U\֖u9TePӮǶ F%] 1>,uh&:Qhm5#1Z^ދnt%b@?NOXQTxJ.'5U[y #Uhb WՌ%G2x9{ &PM./Bi4/u3 ۹\ ~O^kFCRZ -{PB QߵC8Mju*Ũ?b=G&j=IY0zzqPȇ`cTh*,HYopF:=/ n@kJL(!̖MXԉM{'+0 (#\Xk|ڱSkKWzv=}۾W+)5߿p%RA`>7n~}-\r^ErŅ>:{/YgC zF !sQlĦPR5!kTqQM~Jt7Cn! "=:o `*"ʻ PETN Pk4a wpTM%2h>-łqKzx|%7j ވy-%>P?o::,^ Wɢ:U%qM'⑯H$EvInh2PqL9,-QS q*AɈ5c!„Ggdž-%m 8t"k#ש6\!'f#8G 2U6w+=wpbAu=%I&6= @ npHį)@kdU=2ݙs'(N%K,f q갸dS1#ʂ؇STX~Y=IW1WJd&h_s9.C;|$]t5x)x)x'fxR?B>6yq8챚3.(F.̪ΒZ/-@+U53>3B4QO{ܵ +#pJ̻H]$OOnEXvUOq; ڥGH"#ӫTQ;'U|"~e$US7駨VU.#O8E6ֿ~UZ&"E8xH_ ,C.dVi||Й5yMZxM(9l>'oò/{wanc;τn= @JP3XKQG:vsPJL>#r}Mj8^():Nn.1&L ΩW=΀JJԔ* 0BUu2"4~3RVU}rFo񵀮1f\>`P6dld{T6DӜ;|kע}ѯR0p_hzz@i4P)ՔjT Q{ꋾKң2ILhu:EEE؄M"WVʖ`p+!S"ЗnJy,96" NMH=+EvI_u8y~w8cONujF| :L= SW6yg3Ns5nD#뼉<۱7U阏 a=_CYPQ<O4H?wPH WKUEۈ,^|  }L\9z-|d}# hA qżFH=@>:7K@=)8e @__8duPz-!]fQв}N91r@:"4g>yoc@)y*[XHjc#A*L*R@:rؠ Uفm ŔEZ5fQ F6 ˁe:E*6A=-OShG2˅5S4Y^VCCCD5QM"ZD|Ci.uQu)R)U<.kw;#ڈ6:V~4h! N(C 41ANDEH\&{Y<-Pk% n.ܑyy({9rLT Yջty;!\F.Jqꮽ։@6Av+laAmщZrmR7|ٳݞz @HԱ2i"*Rjs a\%U4pYowfʿ:GS=6K˯J_aӺ3>  CheGtzsu /5c`n`2ܨ\~!TS(z7POz^&n&>DWS. }:>J>3~"]1zb'ӓdXHBH\_Rldy'KAE'?<[DףH.{g/LP7xۘmx%<6+V >}}| qN!_ IH"y#*\>j&T&T&TT}RK]UM*'KBzf8| \m\!y9:\:Vmg6Mvsx\ϏvxF3'q9GEWu[|FjSǡӸ-ϦiW'O[zV]#v%=5dU3L52ZV}@F@?(Qs|O=$( USżR%YvE<4TlQ $ i^>+qZ;ޤVN;oݏ@EdR{_ӗ?_q:Bk0}^(쥢;{MM~bzFDY3!>dESH0?kxFE)^.^ŋb('8[TŦ E8t i gf)Q-#Tȃ*SQe3[CPK2^y'@جL` {_a*Qjkn ,gS|@o8[mA+R;@ĢJ3ZqdaY$L:7VR/1~8nv-Q)z*^ZFx7)_U۫Kq).xAP#p pQtx%^oہցց}@[5.'}}ݻ\ s\񊮬p8D!L1vt'jFjTK>L&Ź=a#\>dZK S5ژ|O%9GgEi"~>ig_/XU|)_yžj'?i1^v*jhE m#?qs0weۮ>( y"q(KǝqLG!ԓ@A«TY TP ή!F:pn_ 0B~W1zTq|QPt}awZrxM ^nnN4i}Nl k -m> ([C_ }嚥<<nRJו(;މ#l]ʿ<5ښ1h[A.،p:DPm0,M>?ͼ??٤LTNAL3`y?"(^'NkVOAs *Fhxa f&YzFD C4⢎4cO`}˯Dr[+!MqQb]QEJQ`(ώOKRRXa Q[ ?Zex)#p,O>0:Ɵcd%p |W|W|Wc1:O[_᫻? x⺸Rg> 3d28R\nF6`76R~"?yx[較u' Ar9! x^9|ӗGќ!ILLjJW@Q%዁Jgy}YNE=N̛*/<8yF **.Dl\ded&։h4<ܙY(_kea~wj{h+,G&a&UR8}9eװC_R1;þNIh*b~Zh.4bB1333ţxQD`(1JMߦoW |@DHW..MjfpPhXj%`1q2T ߩu2v\2 \E*>U hB.N(o}dBGϾ$R|C|'hosL{V۩?L!䟿<ڝ.X3iR;s.˕7o<#M=.ߩ딨ج~=Q jtDAJ|* I.XJMVmkvg,@4 .0 h 6='p!;.S2ep!Iur"\=%"&j |˽R;'3U%59P_x"RnG:4OKR1T C:]?(P6ݦʛʛʛpu::J^* }P~X2JΡT^2d(pv&6|Vm/Mٺ_y_xZ FósE{]VgQ| P3Vz_<J&D v0&hJ\p?Ӯ}鹹[Og2a m<'§8T(ؑTB--[5,D"_ T&c-}u2\p_Q(G*1@ax5nR71G=c~^heow8c|_m[ nse33s`hpj,|xa ,Kj/9p ? \(VwZ_]z7.% ̂* P.?rHap5yKs+2-*Eym)!{!g͡x+`NZ-97R]|u"Ee?d>,wBK2 Oy%IG2s{0ɨimBtp@=1C71ozg΁k A$%7!k@rK` ޯb P\>f'`4930L,! 7D4E[Ccv1UᓍrTe9^qxEM^?#+(,ʈ2)qÎӞӞ"fE`Q^2"K[VxwM)MZdZ"#WνQ4Ot2 j[}2oT%W M1"/^&SVb`Rs\1p*<>HˊafnR$hi@H~vl (l}.3h\xRx2>a!?1n*ҭe,u=2'kIO-ݴ<*6|TҢ_-߸ֲ8w&4̤r$OV6J׶OoWS웦ˑŇi~Üywbٝ 6n{l'bt׈+ˎR[is䜔j\=^>w}g5 @6%V L05R0c8 k h/mn¯$84 ƻH:N:?mDZS͆fn 1om(&kZ6|***u: }G~0jxp@.b6l 444"/:DuGR9)"+/]hDa;}=XHB 4¼׶R6Wh}לGGdcxxHFMπ~BZZ׎Rys 訍!}*?ڴ2jEJ%iɏΖ׏- 6ڂ\WZՌ}z % Z$h$iZ@BcXڇ(Ixj$s_oɉt#lՃnVM9'q\J5FD況yo[[=MfԋGyGdzg9+ەVg3ՙ;8-3me[mmm7so޴>>>*%EIV^ʳZ.[^yAi{ϝuccFkDǵ_xfZy0b@1/~?3wriw_NV*|u`sڌ8C_PN('^>GK1m)b5صٵٵ99ȁgggklJlJ}]j]{Hs]'Ec]ݢ8T/xjj u=1FcݧG#n|Jm~-I)L-D3G .g'A%!c18'h/TT !E_M~=v /ک }iɢ L% riP߇#@I?gȯ@Fdp^~3T :)8.wב0sp[X%y+}E[err0tT. TWPjme&R #m{% *I_RcL2'rSrSrS\\\ǴfZ3Y#/s|ۏ/N6Rt|BBBBf̆ H" hMtyuo,v9`%yze+[>JM>.bb(熏܍Ɏ&%/oxZ\q})5/։}c*7Yv8,(wiHc-g @c*UF]@w*AT->g8j9|'#.Q>js :.)>ŧٮlWKuE]2225IMRqGAODϿ>DMp1\Y,U www y6x3ތp&H^\nfY_]}qBk\쀠tMG!Aϙ|& *q>Qt5C}4F9@B;qs$AG䴺x&Aѧ'g( g)BtROك hN͙l`-G&5H8q^P&Pp4)`]\_ Tt @r%'b-M#]Ctv-`u` Ute6 _CňaGI yV~0/%ʮ5i]^q˾˾#G.֚hM&jejSm _ <2,2e2Jvj;mmm3eL˘f[u;v^)O(&Q5vB ґ*KB0L8 )R) m! *$9!36I%8},=Φ,{44x Ãۈ"QH_\ۂPzRg l$fx bFk"v(KG=a:1yOGwa.DG9]]AĻ'lȈtŽ ,S F(B'`w11ӤLB^dPQI>55DHt)me= mGY`V+W,G#K^R/ bؐp7ʗC}2D /nŭ*Sejƙ3g0JuGρ G%]SaPC@SW 6"VF'q)$DQ2L F ,[>6 ':ZHTFnǣJ{=9 xϛPDu(;2Uv)M!ȷ1RPpi_ ] xЂB@%\]FY6PQ^4*tyZpV)+=C磖KkߝUlO?e/qǵL-ST>W>W>OHHQDEPmh#lXٰyyy=/z^|J+u\o:(_jjer@AUR>2C,H83vVA#p4;I'WD9< .!P΁nF n3Bʙ Kd(&8BaJ/@‚c|1Y*3मb&Ll>#?e/nxAţr0tE9Y` ` pgH\@ 9VmCMN7\w}s7?o~|_}_}_a{z|: 4%Q%iРC5qM\kZ {¼n^7g(QޑHw;]N>b Gd*|uco~O}]Da ՆD3@sg?]2 ҧ u8fc99 k h= ? P^!@];I8qRvG D91wI~kB[6)Fqr&0"uQ,Ìqv+J7Q/_dX/ 79}&fblf KG 1`POD,/G4M mIXac:gH91'[zk0287(і[h  UX ~ JS]eF{壡l0aɅmԘbEs_9\Twr>5>?eJ_$}z]^w.ݥkYZ|||@I_:5ذhD[E"c1w~Ku.@^V?oŸ-#a $O;5snsrY<)lh%I 0f?kOpnZ2lUҭ?i&CccqSaaq|TJ͗Fq+ ktś⵿7ZMccfƅ;(BsȻnPTiiNbRxVZIQA4b\]ZN.Y=vHj)Fc-t_ / wb܉ U U Uz>-zE @6_0gqgdeQutuu{ٽ^r7nJ3g01ajGH4o~,oљ߭BՔ+ً;8 q:(Ѥ˟lۗ'2` @Od_3MFʟaED]z4$p{w8O>gޠ6r](v)UُS4@oI&^cB ؁Bt:#k<.qܜ(%|=H%͚aV7p7 04E|53^Xe?G%O5IP4I<'3 g,H$#H䗸iݵZw Mhs{CuP%AO'HtH26LΙ3vu=vO=-̡ȧ˧wh 36o_ Sx|]mp156p+`CAJBŧdN7X\zU3PJw=[(P:Z4$-؆ByBC q3iZNZr*밵͕%1gbDHː4mxqK$Tr ֓Y\vvIS_ucިwcкA;x a# 6"hBNo!o%`A"| ?P_:Pa!tTr >.j7RG5O'lllb,&6WP4Vkl5[v|;ǝ K K Kh$IN9,O;>"חYj^j{Qs ''R"Dc#GAB :٪oDS+vCHK  <>A+%pK|Ծۼt $E6K`BʣFϪs3H}z>? *%?#ўў+Wf k.+ JDS P ~a@w?P{=o7ӂi4ooollāFn:k8yD/8l͎OJ h/.r=9lʖ$ AAгDv!"ܣ8NyۄCV| ;xYkeqD3F 6U^E&6M" 1#\/4UUO➦4Unbwto6NȓY\KKր:%7)}gvkND*Qܘ:ȭzQkPM~f5#5#5#5,#,#,#,",",w5j|# ;&,X (v]\k lllUUU+~ů$lKؖ-bŘNRj1\z.G=iA1q9gkaKW>I" WaA- 9ES}n6E| W@;r 6;y)~XyL=r?S+t\sD4%]!\Q}8x\Oaw`0b<}?yn$ _[" .yzI)YCoh'2;E =o>aKSyq_UکLX2]\իէOS 5I[\7fWِcZ=ӥ%J5|H⤣|"t wFcԶ=TȢpTB _,vEΪ,調*ڨqh%)q++r*T̩9?s~Ia& VӑHq].jA7z/ٶ 5$*J"(9> djaȹr7>n|| ν鳢S^q>]$ؕwWw?g|Nj*6`gIݮ`@e^K6/Vsydn893@CSR  B]p~I{2|Mi(2A|ڪXg Z\kQpsܥ@+%cɍԳU-C}n6&~u8yJQ˹Sr a׸垲f,CTatؐ:YX<:Ki׆w+1 A_EWHl$!.) |H'JTh=OXX3JSZVhr~A~YeOϞ==Jؕ+sssʎʎj Bd,ogZr6la1kB-B-B-|_UWCѡP+$BKF;Wrƽ޾ǟG/S{!vi:*8EB_J$ؠ+a{z!DB#9)e (yZҔ/,]բ&On}8ɋȡ*"y8Mr=4aEY\r#}KlS(z$[D+ojVg.^lOkDj_K2';.ynq / 8aV9K)P},0`+v5J9eC.>W_yJNd2a;v k2[I"I$a"&b"KL3Y8/΋z "o A8|9eJ41i}(L<?[ m]fs%ZzI#ɮKqXgB(V?jw c>'HKQi<+T;!!:) Kԯ)5X ğ 5$~|\x儞u?8u3G)aaK4&( R&waQv'O'^Q^P/GxonqqYyXyXy8_#6MbxH<$ k;3!J))>?|Rh\vt3֧-~0=<+5FWrC[A3'+xbQ 7x膝X5|Sw]!h %o"`Eɶi]!][P֝]۲xpFаfKe"y2052aR} OEJ4$d T0_dÍ |]ϣ}o^l]a>k 3r v/+bk:ƕ+|]Tm:?dvϔd-Vb#?4Syyy~N?Pz(=EqQ\5=y a)xmMnnnnԻQ:88ywfOOOЧUdž"o斷KG\^4*,j=8Bp H:$ |V3r;K p1Ma;Z#(rELrJQ\4ms6Sn1vM t ^*[*%"-ݼڱy |[jrO7i{d'` ?Ep DqJ]Xh'L!vTMKE\BF@kQ1cnU}ꏧiu֑[G2dɘ|._?wwqwqwqxzCGq$__la<º`].fŇłłżc>Nh(Qȑ#բ?eF_o)+;fV>VxpqGWܙ H WjS4jwYAei C9#MpJP Y3q [W,JycR‹r&Y(\$T#(7Cƌ9ABGߩmiwěEod> _3de>ofBˢcG:TިM+ܓREd:'D^Vy2ftaaÇwpp[-Z֣K2(2&'ȷ؏R9J̭Vs2BF(bЋ> v'N Q(g)xE;>`&22V^}`;vzg_gc|R%'Q)@rz#> V+"jroo M,* XWZϣ*-kog2k<^4Z@oD5G*a?Y@ڐ&OXC oAΡ࢒tؼ ^tJ[+)G]Wb y9&έ{ iR IS7CIKtEi~ 7'50O·T]vpQ33*GW,)~1;IK _&5&#+"v?[vx[{% ֪iմjfɚ5ǓIϫϫϻ?uyyyJWuUWQ(mr^9-z C1CLBBb`/奼4?jdy-5ǙqCt t tD')fH̐!jC/ůщ{"v8(|f"BFQsϱaXU~g|r|.w ! [)r4nuRުL\Bʄk8_+^HjAD)Ѻh]y~ٜ9gy,Η/;_v˻,+v!s9ߜo2{B-C-C-o %^W=ўhO={ggg5 u`'h${ 0,oU ^]qӈRtօbfigy[ҩT!4 3IEe$1A\GE9|E5ӛ$&w‹QS4}Qܲqzf Cbp vs[6d3jjjTTT)))PkKW>Q>Q>Q4FUW:39?b~k|ɫjw;Cs9&z۴VꈪU#F>}999PjA9[n iBUN}k`2yQ;]5o`W=3xOXW5F\VSh}<[WcZt$آs|BgJkG^R8twxMO N8N^{='='='V[s8sdg3Yo7՛jZTR)}bX/c/b/ʢ,Os{-xx^ūxk}JkҼj^5F it.p.p.Y'N!CV}}`)CI \pͭ-KQ&*?nggge/=L3!q%Bp;G8vFQc8DYd-ڢviF`ռھl_/~ovit~e)YJar{rY.e~i~i~iX)Vhn4M M M1)M_i\1W{{{^kW)u[XXnǃL L L 4 4 44 B:VF+m6h-mLm6S7JD*=JOKsi.O~C?+H_/p#阌ɘov.ʾ}>kXVqUܺf]-͖fKsl&f}>b--ůJkrqqg3ZUVU+u:JQJYztJtGh} y xx3xF }>i7ϛ 1٘lLί5ov;]]jw*UJVohk5F?c1R,ʧWq%S? uNp@2[fly2^~%_nv7mm}>o k"f5YVGcC:x 0[UTD5JU*uԝn-UPN:/żq9.x ί&}O~H1?+AbEݢnQO|u:_tU*JJ%%VUbs92]L D@l[VJ]+ePeuna9c9A<.[V8'ʆT"|p_-{K +$I' *ʛy3opp='b.dFazZO]zQ/%9b8)NsRD!EHEEQQ4JU(!J"M4~x*GSt oMh;N oVlTLTŽ\6ï6^kx\"%W xS|}c'q'q n-x 17p7 psQ,ųMi7(D!JJTjR[jKmE7Mt+XPjSO_pjߍ؝/8WFeTlͷg$ߖo˷;α}>k#p\f.35͚fMq8_ai@ B)R(R**8%P%PP_L,£#D%tEXtdate:create2018-10-06T12:06:20+00:00Gj%tEXtdate:modify2018-10-06T12:06:20+00:006GtEXtsvg:base-urifile:///home/andrew/projects/aiohttp/docs/aiohttp-icon.svg!hIENDB`././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1636920323.038452 aiohttp-3.8.1/tests/autobahn/0000755000175100001710000000000000000000000015476 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/autobahn/Dockerfile.aiohttp0000644000175100001710000000010100000000000021127 0ustar00runnerdockerFROM python:3.9.5 COPY ./ /src WORKDIR /src RUN pip install . ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/autobahn/Dockerfile.autobahn0000644000175100001710000000032700000000000021272 0ustar00runnerdockerFROM crossbario/autobahn-testsuite:0.8.2 RUN apt-get update && apt-get install python3 python3-pip -y RUN pip3 install wait-for-it CMD ["wstest", "--mode", "fuzzingserver", "--spec", "/config/fuzzingserver.json"] ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1636920323.038452 aiohttp-3.8.1/tests/autobahn/client/0000755000175100001710000000000000000000000016754 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/autobahn/client/client.py0000644000175100001710000000236300000000000020610 0ustar00runnerdocker#!/usr/bin/env python3 import asyncio import aiohttp async def client(url: str, name: str) -> None: async with aiohttp.ClientSession() as session: async with session.ws_connect(url + "/getCaseCount") as ws: num_tests = int((await ws.receive()).data) print("running %d cases" % num_tests) for i in range(1, num_tests + 1): print("running test case:", i) text_url = url + "/runCase?case=%d&agent=%s" % (i, name) async with session.ws_connect(text_url) as ws: async for msg in ws: if msg.type == aiohttp.WSMsgType.TEXT: await ws.send_str(msg.data) elif msg.type == aiohttp.WSMsgType.BINARY: await ws.send_bytes(msg.data) else: break url = url + "/updateReports?agent=%s" % name async with session.ws_connect(url) as ws: print("finally requesting %s" % url) async def run(url: str, name: str) -> None: try: await client(url, name) except Exception: import traceback traceback.print_exc() if __name__ == "__main__": asyncio.run(run("http://localhost:9001", "aiohttp")) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/autobahn/client/fuzzingserver.json0000644000175100001710000000033100000000000022567 0ustar00runnerdocker { "url": "ws://localhost:9001", "options": {"failByDrop": false}, "outdir": "./reports/clients", "webport": 8080, "cases": ["*"], "exclude-cases": ["12.*", "13.*"], "exclude-agent-cases": {} } ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1636920323.038452 aiohttp-3.8.1/tests/autobahn/server/0000755000175100001710000000000000000000000017004 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/autobahn/server/fuzzingclient.json0000644000175100001710000000054000000000000022571 0ustar00runnerdocker{ "options": { "failByDrop": false }, "outdir": "./reports/servers", "servers": [ { "agent": "AutobahnServer", "url": "ws://localhost:9001", "options": { "version": 18 } } ], "cases": ["*"], "exclude-cases": ["12.*", "13.*"], "exclude-agent-cases": {} } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/autobahn/server/server.py0000644000175100001710000000243000000000000020663 0ustar00runnerdocker#!/usr/bin/env python3 import logging from aiohttp import WSCloseCode, web async def wshandler(request: web.Request) -> web.WebSocketResponse: ws = web.WebSocketResponse(autoclose=False) is_ws = ws.can_prepare(request) if not is_ws: raise web.HTTPBadRequest() await ws.prepare(request) request.app["websockets"].append(ws) while True: msg = await ws.receive() if msg.type == web.WSMsgType.TEXT: await ws.send_str(msg.data) elif msg.type == web.WSMsgType.BINARY: await ws.send_bytes(msg.data) elif msg.type == web.WSMsgType.CLOSE: await ws.close() break else: break return ws async def on_shutdown(app: web.Application) -> None: for ws in set(app["websockets"]): await ws.close(code=WSCloseCode.GOING_AWAY, message="Server shutdown") if __name__ == "__main__": logging.basicConfig( level=logging.DEBUG, format="%(asctime)s %(levelname)s %(message)s" ) app = web.Application() app["websockets"] = [] app.router.add_route("GET", "/", wshandler) app.on_shutdown.append(on_shutdown) try: web.run_app(app, port=9001) except KeyboardInterrupt: print("Server stopped at http://127.0.0.1:9001") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/autobahn/test_autobahn.py0000644000175100001710000001030700000000000020711 0ustar00runnerdockerimport json import subprocess import sys from pathlib import Path from typing import Any, Dict, Generator, List import pytest from pytest import TempPathFactory python_on_whales = pytest.importorskip( "python_on_whales", reason="'python-on-whales' requires Python 3.7+", ) @pytest.fixture(scope="session") def report_dir(tmp_path_factory: TempPathFactory) -> Path: return tmp_path_factory.mktemp("reports") @pytest.fixture(scope="session", autouse=True) def build_autobahn_testsuite() -> Generator[None, None, None]: try: python_on_whales.docker.build( file="tests/autobahn/Dockerfile.autobahn", tags=["autobahn-testsuite"], context_path=".", ) except python_on_whales.DockerException: pytest.skip(msg="The docker daemon is not running.") try: yield finally: python_on_whales.docker.image.remove(x="autobahn-testsuite") def get_failed_tests(report_path: str, name: str) -> List[Dict[str, Any]]: path = Path(report_path) result_summary = json.loads((path / "index.json").read_text())[name] failed_messages = [] PASS = {"OK", "INFORMATIONAL"} entry_fields = {"case", "description", "expectation", "expected", "received"} for results in result_summary.values(): if results["behavior"] in PASS and results["behaviorClose"] in PASS: continue report = json.loads((path / results["reportfile"]).read_text()) failed_messages.append({field: report[field] for field in entry_fields}) return failed_messages @pytest.mark.skipif(sys.platform == "darwin", reason="Don't run on macOS") @pytest.mark.xfail def test_client(report_dir: Path, request: Any) -> None: try: print("Starting autobahn-testsuite server") autobahn_container = python_on_whales.docker.run( detach=True, image="autobahn-testsuite", name="autobahn", publish=[(9001, 9001)], remove=True, volumes=[ (f"{request.fspath.dirname}/client", "/config"), (f"{report_dir}", "/reports"), ], ) print("Running aiohttp test client") client = subprocess.Popen( ["wait-for-it", "-s", "localhost:9001", "--"] + [sys.executable] + ["tests/autobahn/client/client.py"] ) client.wait() finally: print("Stopping client and server") client.terminate() client.wait() autobahn_container.stop() failed_messages = get_failed_tests(f"{report_dir}/clients", "aiohttp") assert not failed_messages, "\n".join( "\n\t".join( f"{field}: {msg[field]}" for field in ("case", "description", "expectation", "expected", "received") ) for msg in failed_messages ) @pytest.mark.skipif(sys.platform == "darwin", reason="Don't run on macOS") @pytest.mark.xfail def test_server(report_dir: Path, request: Any) -> None: try: print("Starting aiohttp test server") server = subprocess.Popen( [sys.executable] + ["tests/autobahn/server/server.py"] ) print("Starting autobahn-testsuite client") python_on_whales.docker.run( image="autobahn-testsuite", name="autobahn", remove=True, volumes=[ (f"{request.fspath.dirname}/server", "/config"), (f"{report_dir}", "/reports"), ], networks=["host"], command=[ "wait-for-it", "-s", "localhost:9001", "--", "wstest", "--mode", "fuzzingclient", "--spec", "/config/fuzzingclient.json", ], ) finally: print("Stopping client and server") server.terminate() server.wait() failed_messages = get_failed_tests(f"{report_dir}/servers", "AutobahnServer") assert not failed_messages, "\n".join( "\n\t".join( f"{field}: {msg[field]}" for field in ("case", "description", "expectation", "expected", "received") ) for msg in failed_messages ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/conftest.py0000644000175100001710000000531300000000000016076 0ustar00runnerdockerimport asyncio import hashlib import pathlib import shutil import ssl import sys import tempfile import uuid import pytest from aiohttp.test_utils import loop_context try: import trustme # Check if the CA is available in runtime, MacOS on Py3.10 fails somehow trustme.CA() TRUSTME: bool = True except ImportError: TRUSTME = False pytest_plugins = ["aiohttp.pytest_plugin", "pytester"] @pytest.fixture def shorttmpdir(): # Provides a temporary directory with a shorter file system path than the # tmpdir fixture. tmpdir = pathlib.Path(tempfile.mkdtemp()) yield tmpdir # str(tmpdir) is required, Python 3.5 doesn't have __fspath__ # concept shutil.rmtree(str(tmpdir), ignore_errors=True) @pytest.fixture def tls_certificate_authority(): if not TRUSTME: pytest.xfail("trustme is not supported") return trustme.CA() @pytest.fixture def tls_certificate(tls_certificate_authority): return tls_certificate_authority.issue_cert( "localhost", "127.0.0.1", "::1", ) @pytest.fixture def ssl_ctx(tls_certificate): ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) tls_certificate.configure_cert(ssl_ctx) return ssl_ctx @pytest.fixture def client_ssl_ctx(tls_certificate_authority): ssl_ctx = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH) tls_certificate_authority.configure_trust(ssl_ctx) return ssl_ctx @pytest.fixture def tls_ca_certificate_pem_path(tls_certificate_authority): with tls_certificate_authority.cert_pem.tempfile() as ca_cert_pem: yield ca_cert_pem @pytest.fixture def tls_certificate_pem_path(tls_certificate): with tls_certificate.private_key_and_cert_chain_pem.tempfile() as cert_pem: yield cert_pem @pytest.fixture def tls_certificate_pem_bytes(tls_certificate): return tls_certificate.cert_chain_pems[0].bytes() @pytest.fixture def tls_certificate_fingerprint_sha256(tls_certificate_pem_bytes): tls_cert_der = ssl.PEM_cert_to_DER_cert(tls_certificate_pem_bytes.decode()) return hashlib.sha256(tls_cert_der).digest() @pytest.fixture def pipe_name(): name = fr"\\.\pipe\{uuid.uuid4().hex}" return name @pytest.fixture def selector_loop(): if sys.version_info < (3, 7): policy = asyncio.get_event_loop_policy() policy._loop_factory = asyncio.SelectorEventLoop # type: ignore else: if sys.version_info >= (3, 8): policy = asyncio.WindowsSelectorEventLoopPolicy() # type: ignore else: policy = asyncio.DefaultEventLoopPolicy() asyncio.set_event_loop_policy(policy) with loop_context(policy.new_event_loop) as _loop: asyncio.set_event_loop(_loop) yield _loop ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/data.unknown_mime_type0000644000175100001710000000001500000000000020273 0ustar00runnerdockerfile content ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/data.zero_bytes0000644000175100001710000000000000000000000016703 0ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/hello.txt.gz0000644000175100001710000000005400000000000016157 0ustar00runnerdocker1%Uhello.txtHWH())6././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/sample.txt0000644000175100001710000002613600000000000015727 0ustar00runnerdocker 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. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test___all__.py0000644000175100001710000000103700000000000016653 0ustar00runnerdockerfrom typing import Any def test___all__(pytester: Any) -> None: """See https://github.com/aio-libs/aiohttp/issues/6197""" pytester.makepyfile( test_a=""" from aiohttp import * """ ) result = pytester.runpytest("-vv") result.assert_outcomes(passed=0, errors=0) def test_web___all__(pytester: Any) -> None: pytester.makepyfile( test_b=""" from aiohttp.web import * """ ) result = pytester.runpytest("-vv") result.assert_outcomes(passed=0, errors=0) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_base_protocol.py0000644000175100001710000001147000000000000020144 0ustar00runnerdockerimport asyncio from contextlib import suppress from unittest import mock import pytest from aiohttp.base_protocol import BaseProtocol async def test_loop() -> None: loop = asyncio.get_event_loop() asyncio.set_event_loop(None) pr = BaseProtocol(loop) assert pr._loop is loop async def test_pause_writing() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop) assert not pr._paused pr.pause_writing() assert pr._paused async def test_resume_writing_no_waiters() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) pr.pause_writing() assert pr._paused pr.resume_writing() assert not pr._paused async def test_connection_made() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() assert pr.transport is None pr.connection_made(tr) assert pr.transport is not None async def test_connection_lost_not_paused() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) assert not pr._connection_lost pr.connection_lost(None) assert pr.transport is None assert pr._connection_lost async def test_connection_lost_paused_without_waiter() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) assert not pr._connection_lost pr.pause_writing() pr.connection_lost(None) assert pr.transport is None assert pr._connection_lost async def test_drain_lost() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.connection_lost(None) with pytest.raises(ConnectionResetError): await pr._drain_helper() async def test_drain_not_paused() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) assert pr._drain_waiter is None await pr._drain_helper() assert pr._drain_waiter is None async def test_resume_drain_waited() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() t = loop.create_task(pr._drain_helper()) await asyncio.sleep(0) assert pr._drain_waiter is not None pr.resume_writing() assert (await t) is None assert pr._drain_waiter is None async def test_lost_drain_waited_ok() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() t = loop.create_task(pr._drain_helper()) await asyncio.sleep(0) assert pr._drain_waiter is not None pr.connection_lost(None) assert (await t) is None assert pr._drain_waiter is None async def test_lost_drain_waited_exception() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() t = loop.create_task(pr._drain_helper()) await asyncio.sleep(0) assert pr._drain_waiter is not None exc = RuntimeError() pr.connection_lost(exc) with pytest.raises(RuntimeError) as cm: await t assert cm.value is exc assert pr._drain_waiter is None async def test_lost_drain_cancelled() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() fut = loop.create_future() async def wait(): fut.set_result(None) await pr._drain_helper() t = loop.create_task(wait()) await fut t.cancel() assert pr._drain_waiter is not None pr.connection_lost(None) with suppress(asyncio.CancelledError): await t assert pr._drain_waiter is None async def test_resume_drain_cancelled() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() fut = loop.create_future() async def wait(): fut.set_result(None) await pr._drain_helper() t = loop.create_task(wait()) await fut t.cancel() assert pr._drain_waiter is not None pr.resume_writing() with suppress(asyncio.CancelledError): await t assert pr._drain_waiter is None async def test_parallel_drain_race_condition() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() ts = [loop.create_task(pr._drain_helper()) for _ in range(5)] assert not (await asyncio.wait(ts, timeout=0.5))[ 0 ], "All draining tasks must be pending" assert pr._drain_waiter is not None pr.resume_writing() await asyncio.gather(*ts) assert pr._drain_waiter is None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_classbasedview.py0000644000175100001710000000243700000000000020313 0ustar00runnerdockerfrom unittest import mock import pytest from aiohttp import web from aiohttp.web_urldispatcher import View def test_ctor() -> None: request = mock.Mock() view = View(request) assert view.request is request async def test_render_ok() -> None: resp = web.Response(text="OK") class MyView(View): async def get(self): return resp request = mock.Mock() request.method = "GET" resp2 = await MyView(request) assert resp is resp2 async def test_render_unknown_method() -> None: class MyView(View): async def get(self): return web.Response(text="OK") options = get request = mock.Mock() request.method = "UNKNOWN" with pytest.raises(web.HTTPMethodNotAllowed) as ctx: await MyView(request) assert ctx.value.headers["allow"] == "GET,OPTIONS" assert ctx.value.status == 405 async def test_render_unsupported_method() -> None: class MyView(View): async def get(self): return web.Response(text="OK") options = delete = get request = mock.Mock() request.method = "POST" with pytest.raises(web.HTTPMethodNotAllowed) as ctx: await MyView(request) assert ctx.value.headers["allow"] == "DELETE,GET,OPTIONS" assert ctx.value.status == 405 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_client_connection.py0000644000175100001710000000655000000000000021011 0ustar00runnerdockerimport gc from unittest import mock import pytest from aiohttp.connector import Connection @pytest.fixture def key(): return object() @pytest.fixture def loop(): return mock.Mock() @pytest.fixture def connector(): return mock.Mock() @pytest.fixture def protocol(): return mock.Mock(should_close=False) def test_ctor(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) with pytest.warns(DeprecationWarning): assert conn.loop is loop assert conn.protocol is protocol conn.close() def test_callbacks_on_close(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) notified = False def cb(): nonlocal notified notified = True conn.add_callback(cb) conn.close() assert notified def test_callbacks_on_release(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) notified = False def cb(): nonlocal notified notified = True conn.add_callback(cb) conn.release() assert notified def test_callbacks_exception(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) notified = False def cb1(): raise Exception def cb2(): nonlocal notified notified = True conn.add_callback(cb1) conn.add_callback(cb2) conn.close() assert notified def test_del(connector, key, protocol, loop) -> None: loop.is_closed.return_value = False conn = Connection(connector, key, protocol, loop) exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) with pytest.warns(ResourceWarning): del conn gc.collect() connector._release.assert_called_with(key, protocol, should_close=True) msg = { "client_connection": mock.ANY, # conn was deleted "message": "Unclosed connection", } if loop.get_debug(): msg["source_traceback"] = mock.ANY loop.call_exception_handler.assert_called_with(msg) def test_close(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) assert not conn.closed conn.close() assert conn._protocol is None connector._release.assert_called_with(key, protocol, should_close=True) assert conn.closed def test_release(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) assert not conn.closed conn.release() assert not protocol.transport.close.called assert conn._protocol is None connector._release.assert_called_with(key, protocol, should_close=False) assert conn.closed def test_release_proto_should_close(connector, key, protocol, loop) -> None: protocol.should_close = True conn = Connection(connector, key, protocol, loop) assert not conn.closed conn.release() assert not protocol.transport.close.called assert conn._protocol is None connector._release.assert_called_with(key, protocol, should_close=True) assert conn.closed def test_release_released(connector, key, protocol, loop) -> None: conn = Connection(connector, key, protocol, loop) conn.release() connector._release.reset_mock() conn.release() assert not protocol.transport.close.called assert conn._protocol is None assert not connector._release.called ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_client_exceptions.py0000644000175100001710000002577100000000000021041 0ustar00runnerdocker# Tests for client_exceptions.py import errno import pickle import sys from unittest import mock import pytest from aiohttp import client, client_reqrep class TestClientResponseError: request_info = client.RequestInfo( url="http://example.com", method="GET", headers={}, real_url="http://example.com", ) def test_default_status(self) -> None: err = client.ClientResponseError(history=(), request_info=self.request_info) assert err.status == 0 def test_status(self) -> None: err = client.ClientResponseError( status=400, history=(), request_info=self.request_info ) assert err.status == 400 def test_pickle(self) -> None: err = client.ClientResponseError(request_info=self.request_info, history=()) for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.request_info == self.request_info assert err2.history == () assert err2.status == 0 assert err2.message == "" assert err2.headers is None err = client.ClientResponseError( request_info=self.request_info, history=(), status=400, message="Something wrong", headers={}, ) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.request_info == self.request_info assert err2.history == () assert err2.status == 400 assert err2.message == "Something wrong" assert err2.headers == {} assert err2.foo == "bar" def test_repr(self) -> None: err = client.ClientResponseError(request_info=self.request_info, history=()) assert repr(err) == (f"ClientResponseError({self.request_info!r}, ())") err = client.ClientResponseError( request_info=self.request_info, history=(), status=400, message="Something wrong", headers={}, ) assert repr(err) == ( "ClientResponseError(%r, (), status=400, " "message='Something wrong', headers={})" % (self.request_info,) ) def test_str(self) -> None: err = client.ClientResponseError( request_info=self.request_info, history=(), status=400, message="Something wrong", headers={}, ) assert str(err) == ( "400, message='Something wrong', " "url='http://example.com'" ) def test_response_status() -> None: request_info = mock.Mock(real_url="http://example.com") err = client.ClientResponseError( status=400, history=None, request_info=request_info ) assert err.status == 400 def test_response_deprecated_code_property() -> None: request_info = mock.Mock(real_url="http://example.com") with pytest.warns(DeprecationWarning): err = client.ClientResponseError( code=400, history=None, request_info=request_info ) with pytest.warns(DeprecationWarning): assert err.code == err.status with pytest.warns(DeprecationWarning): err.code = "404" with pytest.warns(DeprecationWarning): assert err.code == err.status def test_response_both_code_and_status() -> None: with pytest.raises(ValueError): client.ClientResponseError( code=400, status=400, history=None, request_info=None ) class TestClientConnectorError: connection_key = client_reqrep.ConnectionKey( host="example.com", port=8080, is_ssl=False, ssl=None, proxy=None, proxy_auth=None, proxy_headers_hash=None, ) def test_ctor(self) -> None: err = client.ClientConnectorError( connection_key=self.connection_key, os_error=OSError(errno.ENOENT, "No such file"), ) assert err.errno == errno.ENOENT assert err.strerror == "No such file" assert err.os_error.errno == errno.ENOENT assert err.os_error.strerror == "No such file" assert err.host == "example.com" assert err.port == 8080 assert err.ssl is None def test_pickle(self) -> None: err = client.ClientConnectorError( connection_key=self.connection_key, os_error=OSError(errno.ENOENT, "No such file"), ) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.errno == errno.ENOENT assert err2.strerror == "No such file" assert err2.os_error.errno == errno.ENOENT assert err2.os_error.strerror == "No such file" assert err2.host == "example.com" assert err2.port == 8080 assert err2.ssl is None assert err2.foo == "bar" def test_repr(self) -> None: os_error = OSError(errno.ENOENT, "No such file") err = client.ClientConnectorError( connection_key=self.connection_key, os_error=os_error ) assert repr(err) == ( f"ClientConnectorError({self.connection_key!r}, {os_error!r})" ) def test_str(self) -> None: err = client.ClientConnectorError( connection_key=self.connection_key, os_error=OSError(errno.ENOENT, "No such file"), ) assert str(err) == ( "Cannot connect to host example.com:8080 ssl:" "default [No such file]" ) class TestClientConnectorCertificateError: connection_key = client_reqrep.ConnectionKey( host="example.com", port=8080, is_ssl=False, ssl=None, proxy=None, proxy_auth=None, proxy_headers_hash=None, ) def test_ctor(self) -> None: certificate_error = Exception("Bad certificate") err = client.ClientConnectorCertificateError( connection_key=self.connection_key, certificate_error=certificate_error ) assert err.certificate_error == certificate_error assert err.host == "example.com" assert err.port == 8080 assert err.ssl is False def test_pickle(self) -> None: certificate_error = Exception("Bad certificate") err = client.ClientConnectorCertificateError( connection_key=self.connection_key, certificate_error=certificate_error ) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.certificate_error.args == ("Bad certificate",) assert err2.host == "example.com" assert err2.port == 8080 assert err2.ssl is False assert err2.foo == "bar" def test_repr(self) -> None: certificate_error = Exception("Bad certificate") err = client.ClientConnectorCertificateError( connection_key=self.connection_key, certificate_error=certificate_error ) assert repr(err) == ( "ClientConnectorCertificateError(%r, %r)" % (self.connection_key, certificate_error) ) def test_str(self) -> None: certificate_error = Exception("Bad certificate") err = client.ClientConnectorCertificateError( connection_key=self.connection_key, certificate_error=certificate_error ) assert str(err) == ( "Cannot connect to host example.com:8080 ssl:False" " [Exception: ('Bad certificate',)]" ) class TestServerDisconnectedError: def test_ctor(self) -> None: err = client.ServerDisconnectedError() assert err.message == "Server disconnected" err = client.ServerDisconnectedError(message="No connection") assert err.message == "No connection" def test_pickle(self) -> None: err = client.ServerDisconnectedError(message="No connection") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.message == "No connection" assert err2.foo == "bar" def test_repr(self) -> None: err = client.ServerDisconnectedError() if sys.version_info < (3, 7): assert repr(err) == ("ServerDisconnectedError" "('Server disconnected',)") else: assert repr(err) == ("ServerDisconnectedError" "('Server disconnected')") err = client.ServerDisconnectedError(message="No connection") if sys.version_info < (3, 7): assert repr(err) == "ServerDisconnectedError('No connection',)" else: assert repr(err) == "ServerDisconnectedError('No connection')" def test_str(self) -> None: err = client.ServerDisconnectedError() assert str(err) == "Server disconnected" err = client.ServerDisconnectedError(message="No connection") assert str(err) == "No connection" class TestServerFingerprintMismatch: def test_ctor(self) -> None: err = client.ServerFingerprintMismatch( expected=b"exp", got=b"got", host="example.com", port=8080 ) assert err.expected == b"exp" assert err.got == b"got" assert err.host == "example.com" assert err.port == 8080 def test_pickle(self) -> None: err = client.ServerFingerprintMismatch( expected=b"exp", got=b"got", host="example.com", port=8080 ) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.expected == b"exp" assert err2.got == b"got" assert err2.host == "example.com" assert err2.port == 8080 assert err2.foo == "bar" def test_repr(self) -> None: err = client.ServerFingerprintMismatch(b"exp", b"got", "example.com", 8080) assert repr(err) == ( "" ) class TestInvalidURL: def test_ctor(self) -> None: err = client.InvalidURL(url=":wrong:url:") assert err.url == ":wrong:url:" def test_pickle(self) -> None: err = client.InvalidURL(url=":wrong:url:") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.url == ":wrong:url:" assert err2.foo == "bar" def test_repr(self) -> None: err = client.InvalidURL(url=":wrong:url:") assert repr(err) == "" def test_str(self) -> None: err = client.InvalidURL(url=":wrong:url:") assert str(err) == ":wrong:url:" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_client_fingerprint.py0000644000175100001710000000515300000000000021177 0ustar00runnerdockerimport hashlib from unittest import mock import pytest import aiohttp from aiohttp.client_reqrep import _merge_ssl_params ssl = pytest.importorskip("ssl") def test_fingerprint_sha256() -> None: sha256 = hashlib.sha256(b"12345678" * 64).digest() fp = aiohttp.Fingerprint(sha256) assert fp.fingerprint == sha256 def test_fingerprint_sha1() -> None: sha1 = hashlib.sha1(b"12345678" * 64).digest() with pytest.raises(ValueError): aiohttp.Fingerprint(sha1) def test_fingerprint_md5() -> None: md5 = hashlib.md5(b"12345678" * 64).digest() with pytest.raises(ValueError): aiohttp.Fingerprint(md5) def test_fingerprint_check_no_ssl() -> None: sha256 = hashlib.sha256(b"12345678" * 64).digest() fp = aiohttp.Fingerprint(sha256) transport = mock.Mock() transport.get_extra_info.return_value = None assert fp.check(transport) is None def test__merge_ssl_params_verify_ssl() -> None: with pytest.warns(DeprecationWarning): assert _merge_ssl_params(None, False, None, None) is False def test__merge_ssl_params_verify_ssl_conflict() -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) with pytest.warns(DeprecationWarning): with pytest.raises(ValueError): _merge_ssl_params(ctx, False, None, None) def test__merge_ssl_params_ssl_context() -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) with pytest.warns(DeprecationWarning): assert _merge_ssl_params(None, None, ctx, None) is ctx def test__merge_ssl_params_ssl_context_conflict() -> None: ctx1 = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ctx2 = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) with pytest.warns(DeprecationWarning): with pytest.raises(ValueError): _merge_ssl_params(ctx1, None, ctx2, None) def test__merge_ssl_params_fingerprint() -> None: digest = hashlib.sha256(b"123").digest() with pytest.warns(DeprecationWarning): ret = _merge_ssl_params(None, None, None, digest) assert ret.fingerprint == digest def test__merge_ssl_params_fingerprint_conflict() -> None: fingerprint = aiohttp.Fingerprint(hashlib.sha256(b"123").digest()) ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) with pytest.warns(DeprecationWarning): with pytest.raises(ValueError): _merge_ssl_params(ctx, None, None, fingerprint) def test__merge_ssl_params_ssl() -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) assert ctx is _merge_ssl_params(ctx, None, None, None) def test__merge_ssl_params_invlid() -> None: with pytest.raises(TypeError): _merge_ssl_params(object(), None, None, None) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_client_functional.py0000644000175100001710000025525600000000000021025 0ustar00runnerdocker# HTTP client functional tests against aiohttp.web server import asyncio import datetime import http.cookies import io import json import pathlib import socket import ssl from unittest import mock import pytest from async_generator import async_generator, yield_ from multidict import MultiDict from yarl import URL import aiohttp from aiohttp import Fingerprint, ServerFingerprintMismatch, hdrs, web from aiohttp.abc import AbstractResolver from aiohttp.client_exceptions import TooManyRedirects from aiohttp.test_utils import unused_port @pytest.fixture def here(): return pathlib.Path(__file__).parent @pytest.fixture def fname(here): return here / "conftest.py" async def test_keepalive_two_requests_success(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(body=b"OK") app = web.Application() app.router.add_route("GET", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client(app, connector=connector) resp1 = await client.get("/") await resp1.read() resp2 = await client.get("/") await resp2.read() assert 1 == len(client._session.connector._conns) async def test_keepalive_after_head_requests_success(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(body=b"OK") cnt_conn_reuse = 0 async def on_reuseconn(session, ctx, params): nonlocal cnt_conn_reuse cnt_conn_reuse += 1 trace_config = aiohttp.TraceConfig() trace_config._on_connection_reuseconn.append(on_reuseconn) app = web.Application() app.router.add_route("GET", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client( app, connector=connector, trace_configs=[trace_config] ) resp1 = await client.head("/") await resp1.read() resp2 = await client.get("/") await resp2.read() assert 1 == cnt_conn_reuse async def test_keepalive_response_released(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(body=b"OK") app = web.Application() app.router.add_route("GET", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client(app, connector=connector) resp1 = await client.get("/") resp1.release() resp2 = await client.get("/") resp2.release() assert 1 == len(client._session.connector._conns) async def test_keepalive_server_force_close_connection(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body response = web.Response(body=b"OK") response.force_close() return response app = web.Application() app.router.add_route("GET", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client(app, connector=connector) resp1 = await client.get("/") resp1.close() resp2 = await client.get("/") resp2.close() assert 0 == len(client._session.connector._conns) async def test_release_early(aiohttp_client) -> None: async def handler(request): await request.read() return web.Response(body=b"OK") app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.closed assert 1 == len(client._session.connector._conns) async def test_HTTP_304(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(status=304) app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 304 content = await resp.read() assert content == b"" async def test_HTTP_304_WITH_BODY(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(body=b"test", status=304) app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 304 content = await resp.read() assert content == b"" async def test_auto_header_user_agent(aiohttp_client) -> None: async def handler(request): assert "aiohttp" in request.headers["user-agent"] return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status async def test_skip_auto_headers_user_agent(aiohttp_client) -> None: async def handler(request): assert hdrs.USER_AGENT not in request.headers return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/", skip_auto_headers=["user-agent"]) assert 200 == resp.status async def test_skip_default_auto_headers_user_agent(aiohttp_client) -> None: async def handler(request): assert hdrs.USER_AGENT not in request.headers return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app, skip_auto_headers=["user-agent"]) resp = await client.get("/") assert 200 == resp.status async def test_skip_auto_headers_content_type(aiohttp_client) -> None: async def handler(request): assert hdrs.CONTENT_TYPE not in request.headers return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/", skip_auto_headers=["content-type"]) assert 200 == resp.status async def test_post_data_bytesio(aiohttp_client) -> None: data = b"some buffer" async def handler(request): assert len(data) == request.content_length val = await request.read() assert data == val return web.Response() app = web.Application() app.router.add_route("POST", "/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=io.BytesIO(data)) assert 200 == resp.status async def test_post_data_with_bytesio_file(aiohttp_client) -> None: data = b"some buffer" async def handler(request): post_data = await request.post() assert ["file"] == list(post_data.keys()) assert data == post_data["file"].file.read() return web.Response() app = web.Application() app.router.add_route("POST", "/", handler) client = await aiohttp_client(app) resp = await client.post("/", data={"file": io.BytesIO(data)}) assert 200 == resp.status async def test_post_data_stringio(aiohttp_client) -> None: data = "some buffer" async def handler(request): assert len(data) == request.content_length assert request.headers["CONTENT-TYPE"] == "text/plain; charset=utf-8" val = await request.text() assert data == val return web.Response() app = web.Application() app.router.add_route("POST", "/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=io.StringIO(data)) assert 200 == resp.status async def test_post_data_textio_encoding(aiohttp_client) -> None: data = "текст" async def handler(request): assert request.headers["CONTENT-TYPE"] == "text/plain; charset=koi8-r" val = await request.text() assert data == val return web.Response() app = web.Application() app.router.add_route("POST", "/", handler) client = await aiohttp_client(app) pl = aiohttp.TextIOPayload(io.StringIO(data), encoding="koi8-r") resp = await client.post("/", data=pl) assert 200 == resp.status async def test_ssl_client( aiohttp_server, ssl_ctx, aiohttp_client, client_ssl_ctx, ) -> None: connector = aiohttp.TCPConnector(ssl=client_ssl_ctx) async def handler(request): return web.Response(text="Test message") app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app, ssl=ssl_ctx) client = await aiohttp_client(server, connector=connector) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "Test message" async def test_tcp_connector_fingerprint_ok( aiohttp_server, aiohttp_client, ssl_ctx, tls_certificate_fingerprint_sha256, ): tls_fingerprint = Fingerprint(tls_certificate_fingerprint_sha256) async def handler(request): return web.Response(text="Test message") connector = aiohttp.TCPConnector(ssl=tls_fingerprint) app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app, ssl=ssl_ctx) client = await aiohttp_client(server, connector=connector) resp = await client.get("/") assert resp.status == 200 resp.close() async def test_tcp_connector_fingerprint_fail( aiohttp_server, aiohttp_client, ssl_ctx, tls_certificate_fingerprint_sha256, ): async def handler(request): return web.Response(text="Test message") bad_fingerprint = b"\x00" * len(tls_certificate_fingerprint_sha256) connector = aiohttp.TCPConnector(ssl=Fingerprint(bad_fingerprint)) app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app, ssl=ssl_ctx) client = await aiohttp_client(server, connector=connector) with pytest.raises(ServerFingerprintMismatch) as cm: await client.get("/") exc = cm.value assert exc.expected == bad_fingerprint assert exc.got == tls_certificate_fingerprint_sha256 async def test_format_task_get(aiohttp_server) -> None: loop = asyncio.get_event_loop() async def handler(request): return web.Response(body=b"OK") app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) client = aiohttp.ClientSession() task = loop.create_task(client.get(server.make_url("/"))) assert f"{task}".startswith(" None: async def handler(request): assert "q=t est" in request.rel_url.query_string return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/", params="q=t+est") assert 200 == resp.status async def test_drop_params_on_redirect(aiohttp_client) -> None: async def handler_redirect(request): return web.Response(status=301, headers={"Location": "/ok?a=redirect"}) async def handler_ok(request): assert request.rel_url.query_string == "a=redirect" return web.Response(status=200) app = web.Application() app.router.add_route("GET", "/ok", handler_ok) app.router.add_route("GET", "/redirect", handler_redirect) client = await aiohttp_client(app) resp = await client.get("/redirect", params={"a": "initial"}) assert resp.status == 200 async def test_drop_fragment_on_redirect(aiohttp_client) -> None: async def handler_redirect(request): return web.Response(status=301, headers={"Location": "/ok#fragment"}) async def handler_ok(request): return web.Response(status=200) app = web.Application() app.router.add_route("GET", "/ok", handler_ok) app.router.add_route("GET", "/redirect", handler_redirect) client = await aiohttp_client(app) resp = await client.get("/redirect") assert resp.status == 200 assert resp.url.path == "/ok" async def test_drop_fragment(aiohttp_client) -> None: async def handler_ok(request): return web.Response(status=200) app = web.Application() app.router.add_route("GET", "/ok", handler_ok) client = await aiohttp_client(app) resp = await client.get("/ok#fragment") assert resp.status == 200 assert resp.url.path == "/ok" async def test_history(aiohttp_client) -> None: async def handler_redirect(request): return web.Response(status=301, headers={"Location": "/ok"}) async def handler_ok(request): return web.Response(status=200) app = web.Application() app.router.add_route("GET", "/ok", handler_ok) app.router.add_route("GET", "/redirect", handler_redirect) client = await aiohttp_client(app) resp = await client.get("/ok") assert len(resp.history) == 0 assert resp.status == 200 resp_redirect = await client.get("/redirect") assert len(resp_redirect.history) == 1 assert resp_redirect.history[0].status == 301 assert resp_redirect.status == 200 async def test_keepalive_closed_by_server(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body resp = web.Response(body=b"OK") resp.force_close() return resp app = web.Application() app.router.add_route("GET", "/", handler) connector = aiohttp.TCPConnector(limit=1) client = await aiohttp_client(app, connector=connector) resp1 = await client.get("/") val1 = await resp1.read() assert val1 == b"OK" resp2 = await client.get("/") val2 = await resp2.read() assert val2 == b"OK" assert 0 == len(client._session.connector._conns) async def test_wait_for(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await asyncio.wait_for(client.get("/"), 10) assert resp.status == 200 txt = await resp.text() assert txt == "OK" async def test_raw_headers(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 raw_headers = tuple((bytes(h), bytes(v)) for h, v in resp.raw_headers) assert raw_headers == ( (b"Content-Length", b"0"), (b"Content-Type", b"application/octet-stream"), (b"Date", mock.ANY), (b"Server", mock.ANY), ) resp.close() async def test_host_header_first(aiohttp_client) -> None: async def handler(request): assert list(request.headers)[0] == hdrs.HOST return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 async def test_empty_header_values(aiohttp_client) -> None: async def handler(request): resp = web.Response() resp.headers["X-Empty"] = "" return resp app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 raw_headers = tuple((bytes(h), bytes(v)) for h, v in resp.raw_headers) assert raw_headers == ( (b"X-Empty", b""), (b"Content-Length", b"0"), (b"Content-Type", b"application/octet-stream"), (b"Date", mock.ANY), (b"Server", mock.ANY), ) resp.close() async def test_204_with_gzipped_content_encoding(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse(status=204) resp.content_length = 0 resp.content_type = "application/json" # resp.enable_compression(web.ContentCoding.gzip) resp.headers["Content-Encoding"] = "gzip" await resp.prepare(request) return resp app = web.Application() app.router.add_route("DELETE", "/", handler) client = await aiohttp_client(app) resp = await client.delete("/") assert resp.status == 204 assert resp.closed async def test_timeout_on_reading_headers(aiohttp_client, mocker) -> None: async def handler(request): resp = web.StreamResponse() await asyncio.sleep(0.1) await resp.prepare(request) return resp app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) with pytest.raises(asyncio.TimeoutError): await client.get("/", timeout=0.01) async def test_timeout_on_conn_reading_headers(aiohttp_client, mocker) -> None: # tests case where user did not set a connection timeout async def handler(request): resp = web.StreamResponse() await asyncio.sleep(0.1) await resp.prepare(request) return resp app = web.Application() app.router.add_route("GET", "/", handler) conn = aiohttp.TCPConnector() client = await aiohttp_client(app, connector=conn) with pytest.raises(asyncio.TimeoutError): await client.get("/", timeout=0.01) async def test_timeout_on_session_read_timeout(aiohttp_client, mocker) -> None: async def handler(request): resp = web.StreamResponse() await asyncio.sleep(0.1) await resp.prepare(request) return resp app = web.Application() app.router.add_route("GET", "/", handler) conn = aiohttp.TCPConnector() client = await aiohttp_client( app, connector=conn, timeout=aiohttp.ClientTimeout(sock_read=0.01) ) with pytest.raises(asyncio.TimeoutError): await client.get("/") async def test_read_timeout_between_chunks(aiohttp_client, mocker) -> None: async def handler(request): resp = aiohttp.web.StreamResponse() await resp.prepare(request) # write data 4 times, with pauses. Total time 2 seconds. for _ in range(4): await asyncio.sleep(0.5) await resp.write(b"data\n") return resp app = web.Application() app.add_routes([web.get("/", handler)]) # A timeout of 0.2 seconds should apply per read. timeout = aiohttp.ClientTimeout(sock_read=1) client = await aiohttp_client(app, timeout=timeout) res = b"" async with await client.get("/") as resp: res += await resp.read() assert res == b"data\n" * 4 async def test_read_timeout_on_reading_chunks(aiohttp_client, mocker) -> None: async def handler(request): resp = aiohttp.web.StreamResponse() await resp.prepare(request) await resp.write(b"data\n") await asyncio.sleep(1) await resp.write(b"data\n") return resp app = web.Application() app.add_routes([web.get("/", handler)]) # A timeout of 0.2 seconds should apply per read. timeout = aiohttp.ClientTimeout(sock_read=0.2) client = await aiohttp_client(app, timeout=timeout) async with await client.get("/") as resp: assert (await resp.content.read(5)) == b"data\n" with pytest.raises(asyncio.TimeoutError): await resp.content.read() async def test_timeout_on_reading_data(aiohttp_client, mocker) -> None: loop = asyncio.get_event_loop() fut = loop.create_future() async def handler(request): resp = web.StreamResponse(headers={"content-length": "100"}) await resp.prepare(request) fut.set_result(None) await asyncio.sleep(0.2) return resp app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/", timeout=1) await fut with pytest.raises(asyncio.TimeoutError): await resp.read() async def test_timeout_none(aiohttp_client, mocker) -> None: async def handler(request): resp = web.StreamResponse() await resp.prepare(request) return resp app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/", timeout=None) assert resp.status == 200 async def test_readline_error_on_conn_close(aiohttp_client) -> None: loop = asyncio.get_event_loop() async def handler(request): resp_ = web.StreamResponse() await resp_.prepare(request) # make sure connection is closed by client. with pytest.raises(aiohttp.ServerDisconnectedError): for _ in range(10): await resp_.write(b"data\n") await asyncio.sleep(0.5) return resp_ app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_client(app) session = aiohttp.ClientSession() try: timer_started = False url, headers = server.make_url("/"), {"Connection": "Keep-alive"} resp = await session.get(url, headers=headers) with pytest.raises(aiohttp.ClientConnectionError): while True: data = await resp.content.readline() data = data.strip() if not data: break assert data == b"data" if not timer_started: def do_release(): loop.create_task(resp.release()) loop.call_later(1.0, do_release) timer_started = True finally: await session.close() async def test_no_error_on_conn_close_if_eof(aiohttp_client) -> None: async def handler(request): resp_ = web.StreamResponse() await resp_.prepare(request) await resp_.write(b"data\n") await asyncio.sleep(0.5) return resp_ app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_client(app) session = aiohttp.ClientSession() try: url, headers = server.make_url("/"), {"Connection": "Keep-alive"} resp = await session.get(url, headers=headers) while True: data = await resp.content.readline() data = data.strip() if not data: break assert data == b"data" assert resp.content.exception() is None finally: await session.close() async def test_error_not_overwrote_on_conn_close(aiohttp_client) -> None: async def handler(request): resp_ = web.StreamResponse() await resp_.prepare(request) return resp_ app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_client(app) session = aiohttp.ClientSession() try: url, headers = server.make_url("/"), {"Connection": "Keep-alive"} resp = await session.get(url, headers=headers) resp.content.set_exception(ValueError()) finally: await session.close() assert isinstance(resp.content.exception(), ValueError) async def test_HTTP_200_OK_METHOD(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) app = web.Application() for meth in ("get", "post", "put", "delete", "head", "patch", "options"): app.router.add_route(meth.upper(), "/", handler) client = await aiohttp_client(app) for meth in ("get", "post", "put", "delete", "head", "patch", "options"): resp = await client.request(meth, "/") assert resp.status == 200 assert len(resp.history) == 0 content1 = await resp.read() content2 = await resp.read() assert content1 == content2 content = await resp.text() if meth == "head": assert b"" == content1 else: assert meth.upper() == content async def test_HTTP_200_OK_METHOD_connector(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) conn = aiohttp.TCPConnector() conn.clear_dns_cache() app = web.Application() for meth in ("get", "post", "put", "delete", "head"): app.router.add_route(meth.upper(), "/", handler) client = await aiohttp_client(app, connector=conn) for meth in ("get", "post", "put", "delete", "head"): resp = await client.request(meth, "/") content1 = await resp.read() content2 = await resp.read() assert content1 == content2 content = await resp.text() assert resp.status == 200 if meth == "head": assert b"" == content1 else: assert meth.upper() == content async def test_HTTP_302_REDIRECT_GET(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): raise web.HTTPFound(location="/") app = web.Application() app.router.add_get("/", handler) app.router.add_get("/redirect", redirect) client = await aiohttp_client(app) resp = await client.get("/redirect") assert 200 == resp.status assert 1 == len(resp.history) resp.close() async def test_HTTP_302_REDIRECT_HEAD(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): raise web.HTTPFound(location="/") app = web.Application() app.router.add_get("/", handler) app.router.add_get("/redirect", redirect) app.router.add_head("/", handler) app.router.add_head("/redirect", redirect) client = await aiohttp_client(app) resp = await client.request("head", "/redirect") assert 200 == resp.status assert 1 == len(resp.history) assert resp.method == "HEAD" resp.close() async def test_HTTP_302_REDIRECT_NON_HTTP(aiohttp_client) -> None: async def redirect(request): raise web.HTTPFound(location="ftp://127.0.0.1/test/") app = web.Application() app.router.add_get("/redirect", redirect) client = await aiohttp_client(app) with pytest.raises(ValueError): await client.get("/redirect") async def test_HTTP_302_REDIRECT_POST(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): raise web.HTTPFound(location="/") app = web.Application() app.router.add_get("/", handler) app.router.add_post("/redirect", redirect) client = await aiohttp_client(app) resp = await client.post("/redirect") assert 200 == resp.status assert 1 == len(resp.history) txt = await resp.text() assert txt == "GET" resp.close() async def test_HTTP_302_REDIRECT_POST_with_content_length_hdr(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): await request.read() raise web.HTTPFound(location="/") data = json.dumps({"some": "data"}) app = web.Application() app.router.add_get("/", handler) app.router.add_post("/redirect", redirect) client = await aiohttp_client(app) resp = await client.post( "/redirect", data=data, headers={"Content-Length": str(len(data))} ) assert 200 == resp.status assert 1 == len(resp.history) txt = await resp.text() assert txt == "GET" resp.close() async def test_HTTP_307_REDIRECT_POST(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): await request.read() raise web.HTTPTemporaryRedirect(location="/") app = web.Application() app.router.add_post("/", handler) app.router.add_post("/redirect", redirect) client = await aiohttp_client(app) resp = await client.post("/redirect", data={"some": "data"}) assert 200 == resp.status assert 1 == len(resp.history) txt = await resp.text() assert txt == "POST" resp.close() async def test_HTTP_308_PERMANENT_REDIRECT_POST(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): await request.read() raise web.HTTPPermanentRedirect(location="/") app = web.Application() app.router.add_post("/", handler) app.router.add_post("/redirect", redirect) client = await aiohttp_client(app) resp = await client.post("/redirect", data={"some": "data"}) assert 200 == resp.status assert 1 == len(resp.history) txt = await resp.text() assert txt == "POST" resp.close() async def test_HTTP_302_max_redirects(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): count = int(request.match_info["count"]) if count: raise web.HTTPFound(location=f"/redirect/{count - 1}") else: raise web.HTTPFound(location="/") app = web.Application() app.router.add_get("/", handler) app.router.add_get(r"/redirect/{count:\d+}", redirect) client = await aiohttp_client(app) with pytest.raises(TooManyRedirects) as ctx: await client.get("/redirect/5", max_redirects=2) assert 2 == len(ctx.value.history) assert ctx.value.request_info.url.path == "/redirect/5" assert ctx.value.request_info.method == "GET" async def test_HTTP_200_GET_WITH_PARAMS(aiohttp_client) -> None: async def handler(request): return web.Response( text="&".join(k + "=" + v for k, v in request.query.items()) ) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/", params={"q": "test"}) assert 200 == resp.status txt = await resp.text() assert txt == "q=test" resp.close() async def test_HTTP_200_GET_WITH_MultiDict_PARAMS(aiohttp_client) -> None: async def handler(request): return web.Response( text="&".join(k + "=" + v for k, v in request.query.items()) ) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/", params=MultiDict([("q", "test"), ("q", "test2")])) assert 200 == resp.status txt = await resp.text() assert txt == "q=test&q=test2" resp.close() async def test_HTTP_200_GET_WITH_MIXED_PARAMS(aiohttp_client) -> None: async def handler(request): return web.Response( text="&".join(k + "=" + v for k, v in request.query.items()) ) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/?test=true", params={"q": "test"}) assert 200 == resp.status txt = await resp.text() assert txt == "test=true&q=test" resp.close() async def test_POST_DATA(aiohttp_client) -> None: async def handler(request): data = await request.post() return web.json_response(dict(data)) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data={"some": "data"}) assert 200 == resp.status content = await resp.json() assert content == {"some": "data"} resp.close() async def test_POST_DATA_with_explicit_formdata(aiohttp_client) -> None: async def handler(request): data = await request.post() return web.json_response(dict(data)) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) form = aiohttp.FormData() form.add_field("name", "text") resp = await client.post("/", data=form) assert 200 == resp.status content = await resp.json() assert content == {"name": "text"} resp.close() async def test_POST_DATA_with_charset(aiohttp_client) -> None: async def handler(request): mp = await request.multipart() part = await mp.next() text = await part.text() return web.Response(text=text) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) form = aiohttp.FormData() form.add_field("name", "текст", content_type="text/plain; charset=koi8-r") resp = await client.post("/", data=form) assert 200 == resp.status content = await resp.text() assert content == "текст" resp.close() async def test_POST_DATA_formdats_with_charset(aiohttp_client) -> None: async def handler(request): mp = await request.post() assert "name" in mp return web.Response(text=mp["name"]) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) form = aiohttp.FormData(charset="koi8-r") form.add_field("name", "текст") resp = await client.post("/", data=form) assert 200 == resp.status content = await resp.text() assert content == "текст" resp.close() async def test_POST_DATA_with_charset_post(aiohttp_client) -> None: async def handler(request): data = await request.post() return web.Response(text=data["name"]) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) form = aiohttp.FormData() form.add_field("name", "текст", content_type="text/plain; charset=koi8-r") resp = await client.post("/", data=form) assert 200 == resp.status content = await resp.text() assert content == "текст" resp.close() async def test_POST_DATA_with_context_transfer_encoding(aiohttp_client) -> None: async def handler(request): data = await request.post() assert data["name"] == "text" return web.Response(text=data["name"]) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) form = aiohttp.FormData() form.add_field("name", "text", content_transfer_encoding="base64") resp = await client.post("/", data=form) assert 200 == resp.status content = await resp.text() assert content == "text" resp.close() async def test_POST_DATA_with_content_type_context_transfer_encoding(aiohttp_client): async def handler(request): data = await request.post() assert data["name"] == "text" return web.Response(body=data["name"]) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) form = aiohttp.FormData() form.add_field( "name", "text", content_type="text/plain", content_transfer_encoding="base64" ) resp = await client.post("/", data=form) assert 200 == resp.status content = await resp.text() assert content == "text" resp.close() async def test_POST_MultiDict(aiohttp_client) -> None: async def handler(request): data = await request.post() assert data == MultiDict([("q", "test1"), ("q", "test2")]) return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=MultiDict([("q", "test1"), ("q", "test2")])) assert 200 == resp.status resp.close() async def test_POST_DATA_DEFLATE(aiohttp_client) -> None: async def handler(request): data = await request.post() return web.json_response(dict(data)) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data={"some": "data"}, compress=True) assert 200 == resp.status content = await resp.json() assert content == {"some": "data"} resp.close() async def test_POST_FILES(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() assert data["some"].filename == fname.name with fname.open("rb") as f: content1 = f.read() content2 = data["some"].file.read() assert content1 == content2 assert data["test"].file.read() == b"data" return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: resp = await client.post("/", data={"some": f, "test": b"data"}, chunked=True) assert 200 == resp.status resp.close() async def test_POST_FILES_DEFLATE(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() assert data["some"].filename == fname.name with fname.open("rb") as f: content1 = f.read() content2 = data["some"].file.read() assert content1 == content2 return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: resp = await client.post( "/", data={"some": f}, chunked=True, compress="deflate" ) assert 200 == resp.status resp.close() async def test_POST_bytes(aiohttp_client) -> None: body = b"0" * 12345 async def handler(request): data = await request.read() assert body == data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=body) assert 200 == resp.status resp.close() async def test_POST_bytes_too_large(aiohttp_client) -> None: body = b"0" * (2 ** 20 + 1) async def handler(request): data = await request.content.read() assert body == data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with pytest.warns(ResourceWarning): resp = await client.post("/", data=body) assert 200 == resp.status resp.close() async def test_POST_FILES_STR(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() with fname.open("rb") as f: content1 = f.read().decode() content2 = data["some"] assert content1 == content2 return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: resp = await client.post("/", data={"some": f.read().decode()}) assert 200 == resp.status resp.close() async def test_POST_FILES_STR_SIMPLE(aiohttp_client, fname) -> None: async def handler(request): data = await request.read() with fname.open("rb") as f: content = f.read() assert content == data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: resp = await client.post("/", data=f.read()) assert 200 == resp.status resp.close() async def test_POST_FILES_LIST(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() assert fname.name == data["some"].filename with fname.open("rb") as f: content = f.read() assert content == data["some"].file.read() return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: resp = await client.post("/", data=[("some", f)]) assert 200 == resp.status resp.close() async def test_POST_FILES_CT(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() assert fname.name == data["some"].filename assert "text/plain" == data["some"].content_type with fname.open("rb") as f: content = f.read() assert content == data["some"].file.read() return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: form = aiohttp.FormData() form.add_field("some", f, content_type="text/plain") resp = await client.post("/", data=form) assert 200 == resp.status resp.close() async def test_POST_FILES_SINGLE(aiohttp_client, fname) -> None: async def handler(request): data = await request.text() with fname.open("rb") as f: content = f.read().decode() assert content == data # if system cannot determine 'text/x-python' MIME type # then use 'application/octet-stream' default assert request.content_type in [ "text/plain", "application/octet-stream", "text/x-python", ] assert "content-disposition" not in request.headers return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: resp = await client.post("/", data=f) assert 200 == resp.status resp.close() async def test_POST_FILES_SINGLE_content_disposition(aiohttp_client, fname) -> None: async def handler(request): data = await request.text() with fname.open("rb") as f: content = f.read().decode() assert content == data # if system cannot determine 'application/pgp-keys' MIME type # then use 'application/octet-stream' default assert request.content_type in [ "text/plain", "application/octet-stream", "text/x-python", ] assert request.headers["content-disposition"] == ( 'inline; filename="conftest.py"' ) return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: resp = await client.post("/", data=aiohttp.get_payload(f, disposition="inline")) assert 200 == resp.status resp.close() async def test_POST_FILES_SINGLE_BINARY(aiohttp_client, fname) -> None: async def handler(request): data = await request.read() with fname.open("rb") as f: content = f.read() assert content == data # if system cannot determine 'application/pgp-keys' MIME type # then use 'application/octet-stream' default assert request.content_type in [ "application/pgp-keys", "text/plain", "text/x-python", "application/octet-stream", ] return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: resp = await client.post("/", data=f) assert 200 == resp.status resp.close() async def test_POST_FILES_IO(aiohttp_client) -> None: async def handler(request): data = await request.post() assert b"data" == data["unknown"].file.read() assert data["unknown"].content_type == "application/octet-stream" assert data["unknown"].filename == "unknown" return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) data = io.BytesIO(b"data") resp = await client.post("/", data=[data]) assert 200 == resp.status resp.close() async def test_POST_FILES_IO_WITH_PARAMS(aiohttp_client) -> None: async def handler(request): data = await request.post() assert data["test"] == "true" assert data["unknown"].content_type == "application/octet-stream" assert data["unknown"].filename == "unknown" assert data["unknown"].file.read() == b"data" assert data.getall("q") == ["t1", "t2"] return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) data = io.BytesIO(b"data") resp = await client.post( "/", data=(("test", "true"), MultiDict([("q", "t1"), ("q", "t2")]), data) ) assert 200 == resp.status resp.close() async def test_POST_FILES_WITH_DATA(aiohttp_client, fname) -> None: async def handler(request): data = await request.post() assert data["test"] == "true" assert data["some"].content_type in [ "text/x-python", "text/plain", "application/octet-stream", ] assert data["some"].filename == fname.name with fname.open("rb") as f: assert data["some"].file.read() == f.read() return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: resp = await client.post("/", data={"test": "true", "some": f}) assert 200 == resp.status resp.close() async def test_POST_STREAM_DATA(aiohttp_client, fname) -> None: async def handler(request): assert request.content_type == "application/octet-stream" content = await request.read() with fname.open("rb") as f: expected = f.read() assert request.content_length == len(expected) assert content == expected return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: data_size = len(f.read()) with pytest.warns(DeprecationWarning): @aiohttp.streamer async def stream(writer, fname): with fname.open("rb") as f: data = f.read(100) while data: await writer.write(data) data = f.read(100) resp = await client.post( "/", data=stream(fname), headers={"Content-Length": str(data_size)} ) assert 200 == resp.status resp.close() async def test_POST_STREAM_DATA_no_params(aiohttp_client, fname) -> None: async def handler(request): assert request.content_type == "application/octet-stream" content = await request.read() with fname.open("rb") as f: expected = f.read() assert request.content_length == len(expected) assert content == expected return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: data_size = len(f.read()) with pytest.warns(DeprecationWarning): @aiohttp.streamer async def stream(writer): with fname.open("rb") as f: data = f.read(100) while data: await writer.write(data) data = f.read(100) resp = await client.post( "/", data=stream, headers={"Content-Length": str(data_size)} ) assert 200 == resp.status resp.close() async def test_json(aiohttp_client) -> None: async def handler(request): assert request.content_type == "application/json" data = await request.json() return web.Response(body=aiohttp.JsonPayload(data)) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", json={"some": "data"}) assert 200 == resp.status content = await resp.json() assert content == {"some": "data"} resp.close() with pytest.raises(ValueError): await client.post("/", data="some data", json={"some": "data"}) async def test_json_custom(aiohttp_client) -> None: async def handler(request): assert request.content_type == "application/json" data = await request.json() return web.Response(body=aiohttp.JsonPayload(data)) used = False def dumps(obj): nonlocal used used = True return json.dumps(obj) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app, json_serialize=dumps) resp = await client.post("/", json={"some": "data"}) assert 200 == resp.status assert used content = await resp.json() assert content == {"some": "data"} resp.close() with pytest.raises(ValueError): await client.post("/", data="some data", json={"some": "data"}) async def test_expect_continue(aiohttp_client) -> None: expect_called = False async def handler(request): data = await request.post() assert data == {"some": "data"} return web.Response() async def expect_handler(request): nonlocal expect_called expect = request.headers.get(hdrs.EXPECT) if expect.lower() == "100-continue": request.transport.write(b"HTTP/1.1 100 Continue\r\n\r\n") expect_called = True app = web.Application() app.router.add_post("/", handler, expect_handler=expect_handler) client = await aiohttp_client(app) resp = await client.post("/", data={"some": "data"}, expect100=True) assert 200 == resp.status resp.close() assert expect_called async def test_encoding_deflate(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.enable_chunked_encoding() resp.enable_compression(web.ContentCoding.deflate) return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "text" resp.close() async def test_encoding_deflate_nochunk(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.enable_compression(web.ContentCoding.deflate) return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "text" resp.close() async def test_encoding_gzip(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.enable_chunked_encoding() resp.enable_compression(web.ContentCoding.gzip) return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "text" resp.close() async def test_encoding_gzip_write_by_chunks(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse() resp.enable_compression(web.ContentCoding.gzip) await resp.prepare(request) await resp.write(b"0") await resp.write(b"0") return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "00" resp.close() async def test_encoding_gzip_nochunk(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.enable_compression(web.ContentCoding.gzip) return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert txt == "text" resp.close() async def test_bad_payload_compression(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.headers["Content-Encoding"] = "gzip" return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status with pytest.raises(aiohttp.ClientPayloadError): await resp.read() resp.close() async def test_bad_payload_chunked_encoding(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse() resp.force_close() resp._length_check = False resp.headers["Transfer-Encoding"] = "chunked" writer = await resp.prepare(request) await writer.write(b"9\r\n\r\n") await writer.write_eof() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status with pytest.raises(aiohttp.ClientPayloadError): await resp.read() resp.close() async def test_bad_payload_content_length(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.headers["Content-Length"] = "10000" resp.force_close() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status with pytest.raises(aiohttp.ClientPayloadError): await resp.read() resp.close() async def test_payload_content_length_by_chunks(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse(headers={"content-length": "3"}) await resp.prepare(request) await resp.write(b"answer") await resp.write(b"two") request.transport.close() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") data = await resp.read() assert data == b"ans" resp.close() async def test_chunked(aiohttp_client) -> None: async def handler(request): resp = web.Response(text="text") resp.enable_chunked_encoding() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status assert resp.headers["Transfer-Encoding"] == "chunked" txt = await resp.text() assert txt == "text" resp.close() async def test_shortcuts(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) app = web.Application() for meth in ("get", "post", "put", "delete", "head", "patch", "options"): app.router.add_route(meth.upper(), "/", handler) client = await aiohttp_client(app) for meth in ("get", "post", "put", "delete", "head", "patch", "options"): coro = getattr(client.session, meth) resp = await coro(client.make_url("/")) assert resp.status == 200 assert len(resp.history) == 0 content1 = await resp.read() content2 = await resp.read() assert content1 == content2 content = await resp.text() if meth == "head": assert b"" == content1 else: assert meth.upper() == content async def test_cookies(aiohttp_client) -> None: async def handler(request): assert request.cookies.keys() == {"test1", "test3"} assert request.cookies["test1"] == "123" assert request.cookies["test3"] == "456" return web.Response() c = http.cookies.Morsel() c.set("test3", "456", "456") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, cookies={"test1": "123", "test2": c}) resp = await client.get("/") assert 200 == resp.status resp.close() async def test_cookies_per_request(aiohttp_client) -> None: async def handler(request): assert request.cookies.keys() == {"test1", "test3", "test4", "test6"} assert request.cookies["test1"] == "123" assert request.cookies["test3"] == "456" assert request.cookies["test4"] == "789" assert request.cookies["test6"] == "abc" return web.Response() c = http.cookies.Morsel() c.set("test3", "456", "456") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, cookies={"test1": "123", "test2": c}) rc = http.cookies.Morsel() rc.set("test6", "abc", "abc") resp = await client.get("/", cookies={"test4": "789", "test5": rc}) assert 200 == resp.status resp.close() async def test_cookies_redirect(aiohttp_client) -> None: async def redirect1(request): ret = web.Response(status=301, headers={"Location": "/redirect2"}) ret.set_cookie("c", "1") return ret async def redirect2(request): ret = web.Response(status=301, headers={"Location": "/"}) ret.set_cookie("c", "2") return ret async def handler(request): assert request.cookies.keys() == {"c"} assert request.cookies["c"] == "2" return web.Response() app = web.Application() app.router.add_get("/redirect1", redirect1) app.router.add_get("/redirect2", redirect2) app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/redirect1") assert 200 == resp.status resp.close() async def test_cookies_on_empty_session_jar(aiohttp_client) -> None: async def handler(request): assert "custom-cookie" in request.cookies assert request.cookies["custom-cookie"] == "abc" return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, cookies=None) resp = await client.get("/", cookies={"custom-cookie": "abc"}) assert 200 == resp.status resp.close() async def test_morsel_with_attributes(aiohttp_client) -> None: # A comment from original test: # # No cookie attribute should pass here # they are only used as filters # whether to send particular cookie or not. # E.g. if cookie expires it just becomes thrown away. # Server who sent the cookie with some attributes # already knows them, no need to send this back again and again async def handler(request): assert request.cookies.keys() == {"test3"} assert request.cookies["test3"] == "456" return web.Response() c = http.cookies.Morsel() c.set("test3", "456", "456") c["httponly"] = True c["secure"] = True c["max-age"] = 1000 app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, cookies={"test2": c}) resp = await client.get("/") assert 200 == resp.status resp.close() async def test_set_cookies(aiohttp_client) -> None: async def handler(request): ret = web.Response() ret.set_cookie("c1", "cookie1") ret.set_cookie("c2", "cookie2") ret.headers.add( "Set-Cookie", "ISAWPLB{A7F52349-3531-4DA9-8776-F74BC6F4F1BB}=" "{925EC0B8-CB17-4BEB-8A35-1033813B0523}; " "HttpOnly; Path=/", ) return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with mock.patch("aiohttp.client_reqrep.client_logger") as m_log: resp = await client.get("/") assert 200 == resp.status cookie_names = {c.key for c in client.session.cookie_jar} assert cookie_names == {"c1", "c2"} resp.close() m_log.warning.assert_called_with("Can not load response cookies: %s", mock.ANY) async def test_set_cookies_expired(aiohttp_client) -> None: async def handler(request): ret = web.Response() ret.set_cookie("c1", "cookie1") ret.set_cookie("c2", "cookie2") ret.headers.add( "Set-Cookie", "c3=cookie3; " "HttpOnly; Path=/" " Expires=Tue, 1 Jan 1980 12:00:00 GMT; ", ) return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status cookie_names = {c.key for c in client.session.cookie_jar} assert cookie_names == {"c1", "c2"} resp.close() async def test_set_cookies_max_age(aiohttp_client) -> None: async def handler(request): ret = web.Response() ret.set_cookie("c1", "cookie1") ret.set_cookie("c2", "cookie2") ret.headers.add("Set-Cookie", "c3=cookie3; " "HttpOnly; Path=/" " Max-Age=1; ") return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status cookie_names = {c.key for c in client.session.cookie_jar} assert cookie_names == {"c1", "c2", "c3"} await asyncio.sleep(2) cookie_names = {c.key for c in client.session.cookie_jar} assert cookie_names == {"c1", "c2"} resp.close() async def test_set_cookies_max_age_overflow(aiohttp_client) -> None: async def handler(request): ret = web.Response() ret.headers.add( "Set-Cookie", "overflow=overflow; " "HttpOnly; Path=/" " Max-Age=" + str(overflow) + "; ", ) return ret overflow = int( datetime.datetime.max.replace(tzinfo=datetime.timezone.utc).timestamp() ) empty = None try: empty = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta( seconds=overflow ) except OverflowError as ex: assert isinstance(ex, OverflowError) assert not isinstance(empty, datetime.datetime) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status for cookie in client.session.cookie_jar: if cookie.key == "overflow": assert int(cookie["max-age"]) == int(overflow) resp.close() async def test_request_conn_error() -> None: client = aiohttp.ClientSession() with pytest.raises(aiohttp.ClientConnectionError): await client.get("http://0.0.0.0:1") await client.close() @pytest.mark.xfail async def test_broken_connection(aiohttp_client) -> None: async def handler(request): request.transport.close() return web.Response(text="answer" * 1000) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with pytest.raises(aiohttp.ClientResponseError): await client.get("/") async def test_broken_connection_2(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse(headers={"content-length": "1000"}) await resp.prepare(request) await resp.write(b"answer") request.transport.close() return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") with pytest.raises(aiohttp.ClientPayloadError): await resp.read() resp.close() async def test_custom_headers(aiohttp_client) -> None: async def handler(request): assert request.headers["x-api-key"] == "foo" return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post( "/", headers={"Content-Type": "application/json", "x-api-key": "foo"} ) assert resp.status == 200 async def test_redirect_to_absolute_url(aiohttp_client) -> None: async def handler(request): return web.Response(text=request.method) async def redirect(request): raise web.HTTPFound(location=client.make_url("/")) app = web.Application() app.router.add_get("/", handler) app.router.add_get("/redirect", redirect) client = await aiohttp_client(app) resp = await client.get("/redirect") assert 200 == resp.status resp.close() async def test_redirect_without_location_header(aiohttp_client) -> None: body = b"redirect" async def handler_redirect(request): return web.Response(status=301, body=body) app = web.Application() app.router.add_route("GET", "/redirect", handler_redirect) client = await aiohttp_client(app) resp = await client.get("/redirect") data = await resp.read() assert data == body async def test_chunked_deprecated(aiohttp_client) -> None: async def handler_redirect(request): return web.Response(status=301) app = web.Application() app.router.add_route("GET", "/redirect", handler_redirect) client = await aiohttp_client(app) with pytest.warns(DeprecationWarning): await client.post("/", chunked=1024) @pytest.mark.parametrize( ("status", "expected_ok"), ( (200, True), (201, True), (301, True), (400, False), (403, False), (500, False), ), ) async def test_ok_from_status(aiohttp_client, status, expected_ok) -> None: async def handler(request): return web.Response(status=status, body=b"") app = web.Application() app.router.add_route("GET", "/endpoint", handler) client = await aiohttp_client(app, raise_for_status=False) resp = await client.get("/endpoint") assert resp.ok is expected_ok async def test_raise_for_status(aiohttp_client) -> None: async def handler_redirect(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_route("GET", "/", handler_redirect) client = await aiohttp_client(app, raise_for_status=True) with pytest.raises(aiohttp.ClientResponseError): await client.get("/") async def test_raise_for_status_per_request(aiohttp_client) -> None: async def handler_redirect(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_route("GET", "/", handler_redirect) client = await aiohttp_client(app) with pytest.raises(aiohttp.ClientResponseError): await client.get("/", raise_for_status=True) async def test_raise_for_status_disable_per_request(aiohttp_client) -> None: async def handler_redirect(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_route("GET", "/", handler_redirect) client = await aiohttp_client(app, raise_for_status=True) resp = await client.get("/", raise_for_status=False) assert 400 == resp.status resp.close() async def test_request_raise_for_status_default(aiohttp_server) -> None: async def handler(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) async with aiohttp.request("GET", server.make_url("/")) as resp: assert resp.status == 400 async def test_request_raise_for_status_disabled(aiohttp_server) -> None: async def handler(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) url = server.make_url("/") async with aiohttp.request("GET", url, raise_for_status=False) as resp: assert resp.status == 400 async def test_request_raise_for_status_enabled(aiohttp_server) -> None: async def handler(request): raise web.HTTPBadRequest() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) url = server.make_url("/") with pytest.raises(aiohttp.ClientResponseError): async with aiohttp.request("GET", url, raise_for_status=True): assert False, "never executed" # pragma: no cover async def test_invalid_idna() -> None: session = aiohttp.ClientSession() try: with pytest.raises(aiohttp.InvalidURL): await session.get("http://\u2061owhefopw.com") finally: await session.close() async def test_creds_in_auth_and_url() -> None: session = aiohttp.ClientSession() try: with pytest.raises(ValueError): await session.get( "http://user:pass@example.com", auth=aiohttp.BasicAuth("user2", "pass2") ) finally: await session.close() @pytest.fixture def create_server_for_url_and_handler(aiohttp_server, tls_certificate_authority): def create(url, srv): app = web.Application() app.router.add_route("GET", url.path, srv) kwargs = {} if url.scheme == "https": cert = tls_certificate_authority.issue_cert( url.host, "localhost", "127.0.0.1" ) ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) cert.configure_cert(ssl_ctx) kwargs["ssl"] = ssl_ctx return aiohttp_server(app, **kwargs) return create @pytest.mark.parametrize( ["url_from", "url_to"], [ ["http://host1.com/path1", "http://host2.com/path2"], ["http://host1.com/path1", "https://host1.com/path1"], ["https://host1.com/path1", "http://host1.com/path2"], ], ids=( "entirely different hosts", "http -> https", "https -> http", ), ) async def test_drop_auth_on_redirect_to_other_host( create_server_for_url_and_handler, url_from, url_to, ) -> None: url_from, url_to = URL(url_from), URL(url_to) async def srv_from(request): assert request.host == url_from.host assert request.headers["Authorization"] == "Basic dXNlcjpwYXNz" raise web.HTTPFound(url_to) async def srv_to(request): assert request.host == url_to.host assert "Authorization" not in request.headers, "Header wasn't dropped" return web.Response() server_from = await create_server_for_url_and_handler(url_from, srv_from) server_to = await create_server_for_url_and_handler(url_to, srv_to) assert ( url_from.host != url_to.host or server_from.scheme != server_to.scheme ), "Invalid test case, host or scheme must differ" protocol_port_map = { "http": 80, "https": 443, } etc_hosts = { (url_from.host, protocol_port_map[server_from.scheme]): server_from, (url_to.host, protocol_port_map[server_to.scheme]): server_to, } class FakeResolver(AbstractResolver): async def resolve(self, host, port=0, family=socket.AF_INET): server = etc_hosts[(host, port)] return [ { "hostname": host, "host": server.host, "port": server.port, "family": socket.AF_INET, "proto": 0, "flags": socket.AI_NUMERICHOST, } ] async def close(self): pass connector = aiohttp.TCPConnector(resolver=FakeResolver(), ssl=False) async with aiohttp.ClientSession(connector=connector) as client: resp = await client.get( url_from, auth=aiohttp.BasicAuth("user", "pass"), ) assert resp.status == 200 resp = await client.get( url_from, headers={"Authorization": "Basic dXNlcjpwYXNz"}, ) assert resp.status == 200 async def test_async_with_session() -> None: with pytest.warns(None) as cm: async with aiohttp.ClientSession() as session: pass assert len(cm.list) == 0 assert session.closed async def test_session_close_awaitable() -> None: session = aiohttp.ClientSession() with pytest.warns(None) as cm: await session.close() assert len(cm.list) == 0 assert session.closed async def test_close_run_until_complete_not_deprecated() -> None: session = aiohttp.ClientSession() with pytest.warns(None) as cm: await session.close() assert len(cm.list) == 0 async def test_close_resp_on_error_async_with_session(aiohttp_server) -> None: async def handler(request): resp = web.StreamResponse(headers={"content-length": "100"}) await resp.prepare(request) await asyncio.sleep(0.1) return resp app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: with pytest.raises(RuntimeError): async with session.get(server.make_url("/")) as resp: resp.content.set_exception(RuntimeError()) await resp.read() assert len(session._connector._conns) == 0 async def test_release_resp_on_normal_exit_from_cm(aiohttp_server) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: async with session.get(server.make_url("/")) as resp: await resp.read() assert len(session._connector._conns) == 1 async def test_non_close_detached_session_on_error_cm(aiohttp_server) -> None: async def handler(request): resp = web.StreamResponse(headers={"content-length": "100"}) await resp.prepare(request) await asyncio.sleep(0.1) return resp app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) session = aiohttp.ClientSession() cm = session.get(server.make_url("/")) assert not session.closed with pytest.raises(RuntimeError): async with cm as resp: resp.content.set_exception(RuntimeError()) await resp.read() assert not session.closed async def test_close_detached_session_on_non_existing_addr() -> None: class FakeResolver(AbstractResolver): async def resolve(host, port=0, family=socket.AF_INET): return {} async def close(self): pass connector = aiohttp.TCPConnector(resolver=FakeResolver()) session = aiohttp.ClientSession(connector=connector) async with session: cm = session.get("http://non-existing.example.com") assert not session.closed with pytest.raises(Exception): await cm assert session.closed async def test_aiohttp_request_context_manager(aiohttp_server) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) async with aiohttp.request("GET", server.make_url("/")) as resp: await resp.read() assert resp.status == 200 async def test_aiohttp_request_ctx_manager_close_sess_on_error( ssl_ctx, aiohttp_server ) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app, ssl=ssl_ctx) cm = aiohttp.request("GET", server.make_url("/")) with pytest.raises(aiohttp.ClientConnectionError): async with cm: pass assert cm._session.closed async def test_aiohttp_request_ctx_manager_not_found() -> None: with pytest.raises(aiohttp.ClientConnectionError): async with aiohttp.request("GET", "http://wrong-dns-name.com"): assert False, "never executed" # pragma: no cover async def test_aiohttp_request_coroutine(aiohttp_server) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app) with pytest.raises(TypeError): await aiohttp.request("GET", server.make_url("/")) server.close() async def test_yield_from_in_session_request(aiohttp_client) -> None: # a test for backward compatibility with yield from syntax async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 async def test_close_context_manager(aiohttp_client) -> None: # a test for backward compatibility with yield from syntax async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ctx = client.get("/") ctx.close() assert not ctx._coro.cr_running async def test_session_auth(aiohttp_client) -> None: async def handler(request): return web.json_response({"headers": dict(request.headers)}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, auth=aiohttp.BasicAuth("login", "pass")) r = await client.get("/") assert r.status == 200 content = await r.json() assert content["headers"]["Authorization"] == "Basic bG9naW46cGFzcw==" async def test_session_auth_override(aiohttp_client) -> None: async def handler(request): return web.json_response({"headers": dict(request.headers)}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, auth=aiohttp.BasicAuth("login", "pass")) r = await client.get("/", auth=aiohttp.BasicAuth("other_login", "pass")) assert r.status == 200 content = await r.json() val = content["headers"]["Authorization"] assert val == "Basic b3RoZXJfbG9naW46cGFzcw==" async def test_session_auth_header_conflict(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, auth=aiohttp.BasicAuth("login", "pass")) headers = {"Authorization": "Basic b3RoZXJfbG9naW46cGFzcw=="} with pytest.raises(ValueError): await client.get("/", headers=headers) async def test_session_headers(aiohttp_client) -> None: async def handler(request): return web.json_response({"headers": dict(request.headers)}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, headers={"X-Real-IP": "192.168.0.1"}) r = await client.get("/") assert r.status == 200 content = await r.json() assert content["headers"]["X-Real-IP"] == "192.168.0.1" async def test_session_headers_merge(aiohttp_client) -> None: async def handler(request): return web.json_response({"headers": dict(request.headers)}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client( app, headers=[("X-Real-IP", "192.168.0.1"), ("X-Sent-By", "requests")] ) r = await client.get("/", headers={"X-Sent-By": "aiohttp"}) assert r.status == 200 content = await r.json() assert content["headers"]["X-Real-IP"] == "192.168.0.1" assert content["headers"]["X-Sent-By"] == "aiohttp" async def test_multidict_headers(aiohttp_client) -> None: async def handler(request): assert await request.read() == data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) data = b"sample data" r = await client.post( "/", data=data, headers=MultiDict({"Content-Length": str(len(data))}) ) assert r.status == 200 async def test_request_conn_closed(aiohttp_client) -> None: async def handler(request): request.transport.close() return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with pytest.raises(aiohttp.ServerDisconnectedError) as excinfo: resp = await client.get("/") await resp.read() assert str(excinfo.value) != "" async def test_dont_close_explicit_connector(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) r = await client.get("/") await r.read() assert 1 == len(client.session.connector._conns) async def test_server_close_keepalive_connection() -> None: loop = asyncio.get_event_loop() class Proto(asyncio.Protocol): def connection_made(self, transport): self.transp = transport self.data = b"" def data_received(self, data): self.data += data if data.endswith(b"\r\n\r\n"): self.transp.write( b"HTTP/1.1 200 OK\r\n" b"CONTENT-LENGTH: 2\r\n" b"CONNECTION: close\r\n" b"\r\n" b"ok" ) self.transp.close() def connection_lost(self, exc): self.transp = None server = await loop.create_server(Proto, "127.0.0.1", unused_port()) addr = server.sockets[0].getsockname() connector = aiohttp.TCPConnector(limit=1) session = aiohttp.ClientSession(connector=connector) url = "http://{}:{}/".format(*addr) for i in range(2): r = await session.request("GET", url) await r.read() assert 0 == len(connector._conns) await session.close() await connector.close() server.close() await server.wait_closed() async def test_handle_keepalive_on_closed_connection() -> None: loop = asyncio.get_event_loop() class Proto(asyncio.Protocol): def connection_made(self, transport): self.transp = transport self.data = b"" def data_received(self, data): self.data += data if data.endswith(b"\r\n\r\n"): self.transp.write( b"HTTP/1.1 200 OK\r\n" b"CONTENT-LENGTH: 2\r\n" b"\r\n" b"ok" ) self.transp.close() def connection_lost(self, exc): self.transp = None server = await loop.create_server(Proto, "127.0.0.1", unused_port()) addr = server.sockets[0].getsockname() connector = aiohttp.TCPConnector(limit=1) session = aiohttp.ClientSession(connector=connector) url = "http://{}:{}/".format(*addr) r = await session.request("GET", url) await r.read() assert 1 == len(connector._conns) with pytest.raises(aiohttp.ClientConnectionError): await session.request("GET", url) assert 0 == len(connector._conns) await session.close() await connector.close() server.close() await server.wait_closed() async def test_error_in_performing_request(ssl_ctx, aiohttp_client, aiohttp_server): async def handler(request): return web.Response() def exception_handler(loop, context): # skip log messages about destroyed but pending tasks pass loop = asyncio.get_event_loop() loop.set_exception_handler(exception_handler) app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app, ssl=ssl_ctx) conn = aiohttp.TCPConnector(limit=1) client = await aiohttp_client(server, connector=conn) with pytest.raises(aiohttp.ClientConnectionError): await client.get("/") # second try should not hang with pytest.raises(aiohttp.ClientConnectionError): await client.get("/") async def test_await_after_cancelling(aiohttp_client) -> None: loop = asyncio.get_event_loop() async def handler(request): return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) fut1 = loop.create_future() fut2 = loop.create_future() async def fetch1(): resp = await client.get("/") assert resp.status == 200 fut1.set_result(None) with pytest.raises(asyncio.CancelledError): await fut2 resp.release() async def fetch2(): await fut1 resp = await client.get("/") assert resp.status == 200 async def canceller(): await fut1 fut2.cancel() await asyncio.gather(fetch1(), fetch2(), canceller()) async def test_async_payload_generator(aiohttp_client) -> None: async def handler(request): data = await request.read() assert data == b"1234567890" * 100 return web.Response() app = web.Application() app.add_routes([web.post("/", handler)]) client = await aiohttp_client(app) @async_generator async def gen(): for i in range(100): await yield_(b"1234567890") resp = await client.post("/", data=gen()) assert resp.status == 200 async def test_read_from_closed_response(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"data") app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with client.get("/") as resp: assert resp.status == 200 with pytest.raises(aiohttp.ClientConnectionError): await resp.read() async def test_read_from_closed_response2(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"data") app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with client.get("/") as resp: assert resp.status == 200 await resp.read() with pytest.raises(aiohttp.ClientConnectionError): await resp.read() async def test_read_from_closed_content(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"data") app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with client.get("/") as resp: assert resp.status == 200 with pytest.raises(aiohttp.ClientConnectionError): await resp.content.readline() async def test_read_timeout(aiohttp_client) -> None: async def handler(request): await asyncio.sleep(5) return web.Response() app = web.Application() app.add_routes([web.get("/", handler)]) timeout = aiohttp.ClientTimeout(sock_read=0.1) client = await aiohttp_client(app, timeout=timeout) with pytest.raises(aiohttp.ServerTimeoutError): await client.get("/") async def test_read_timeout_on_prepared_response(aiohttp_client) -> None: async def handler(request): resp = aiohttp.web.StreamResponse() await resp.prepare(request) await asyncio.sleep(5) await resp.drain() return resp app = web.Application() app.add_routes([web.get("/", handler)]) timeout = aiohttp.ClientTimeout(sock_read=0.1) client = await aiohttp_client(app, timeout=timeout) with pytest.raises(aiohttp.ServerTimeoutError): async with await client.get("/") as resp: await resp.read() async def test_read_bufsize_session_default(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"1234567") app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app, read_bufsize=2) async with await client.get("/") as resp: assert resp.content.get_read_buffer_limits() == (2, 4) async def test_read_bufsize_explicit(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"1234567") app = web.Application() app.add_routes([web.get("/", handler)]) client = await aiohttp_client(app) async with await client.get("/", read_bufsize=4) as resp: assert resp.content.get_read_buffer_limits() == (4, 8) async def test_http_empty_data_text(aiohttp_client) -> None: async def handler(request): data = await request.read() ret = "ok" if data == b"" else "fail" resp = web.Response(text=ret) resp.headers["Content-Type"] = request.headers["Content-Type"] return resp app = web.Application() app.add_routes([web.post("/", handler)]) client = await aiohttp_client(app) async with await client.post("/", data="") as resp: assert resp.status == 200 assert await resp.text() == "ok" assert resp.headers["Content-Type"] == "text/plain; charset=utf-8" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_client_proto.py0000644000175100001710000000742000000000000020012 0ustar00runnerdockerfrom unittest import mock from yarl import URL from aiohttp import http from aiohttp.client_exceptions import ClientOSError, ServerDisconnectedError from aiohttp.client_proto import ResponseHandler from aiohttp.client_reqrep import ClientResponse from aiohttp.helpers import TimerNoop async def test_oserror(loop) -> None: proto = ResponseHandler(loop=loop) transport = mock.Mock() proto.connection_made(transport) proto.connection_lost(OSError()) assert proto.should_close assert isinstance(proto.exception(), ClientOSError) async def test_pause_resume_on_error(loop) -> None: proto = ResponseHandler(loop=loop) transport = mock.Mock() proto.connection_made(transport) proto.pause_reading() assert proto._reading_paused proto.resume_reading() assert not proto._reading_paused async def test_client_proto_bad_message(loop) -> None: proto = ResponseHandler(loop=loop) transport = mock.Mock() proto.connection_made(transport) proto.set_response_params() proto.data_received(b"HTTP\r\n\r\n") assert proto.should_close assert transport.close.called assert isinstance(proto.exception(), http.HttpProcessingError) async def test_uncompleted_message(loop) -> None: proto = ResponseHandler(loop=loop) transport = mock.Mock() proto.connection_made(transport) proto.set_response_params(read_until_eof=True) proto.data_received( b"HTTP/1.1 301 Moved Permanently\r\n" b"Location: http://python.org/" ) proto.connection_lost(None) exc = proto.exception() assert isinstance(exc, ServerDisconnectedError) assert exc.message.code == 301 assert dict(exc.message.headers) == {"Location": "http://python.org/"} async def test_client_protocol_readuntil_eof(loop) -> None: proto = ResponseHandler(loop=loop) transport = mock.Mock() proto.connection_made(transport) conn = mock.Mock() conn.protocol = proto proto.data_received(b"HTTP/1.1 200 Ok\r\n\r\n") response = ClientResponse( "get", URL("http://def-cl-resp.org"), writer=mock.Mock(), continue100=None, timer=TimerNoop(), request_info=mock.Mock(), traces=[], loop=loop, session=mock.Mock(), ) proto.set_response_params(read_until_eof=True) await response.start(conn) assert not response.content.is_eof() proto.data_received(b"0000") data = await response.content.readany() assert data == b"0000" proto.data_received(b"1111") data = await response.content.readany() assert data == b"1111" proto.connection_lost(None) assert response.content.is_eof() async def test_empty_data(loop) -> None: proto = ResponseHandler(loop=loop) proto.data_received(b"") # do nothing async def test_schedule_timeout(loop) -> None: proto = ResponseHandler(loop=loop) proto.set_response_params(read_timeout=1) assert proto._read_timeout_handle is not None async def test_drop_timeout(loop) -> None: proto = ResponseHandler(loop=loop) proto.set_response_params(read_timeout=1) assert proto._read_timeout_handle is not None proto._drop_timeout() assert proto._read_timeout_handle is None async def test_reschedule_timeout(loop) -> None: proto = ResponseHandler(loop=loop) proto.set_response_params(read_timeout=1) assert proto._read_timeout_handle is not None h = proto._read_timeout_handle proto._reschedule_timeout() assert proto._read_timeout_handle is not None assert proto._read_timeout_handle is not h async def test_eof_received(loop) -> None: proto = ResponseHandler(loop=loop) proto.set_response_params(read_timeout=1) assert proto._read_timeout_handle is not None proto.eof_received() assert proto._read_timeout_handle is None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_client_request.py0000644000175100001710000011230700000000000020340 0ustar00runnerdockerimport asyncio import hashlib import io import os.path import urllib.parse import zlib from http.cookies import BaseCookie, Morsel, SimpleCookie from unittest import mock import pytest from async_generator import async_generator, yield_ from multidict import CIMultiDict, CIMultiDictProxy, istr from yarl import URL import aiohttp from aiohttp import BaseConnector, hdrs, payload from aiohttp.client_reqrep import ( ClientRequest, ClientResponse, Fingerprint, _merge_ssl_params, ) from aiohttp.helpers import PY_310 from aiohttp.test_utils import make_mocked_coro @pytest.fixture def make_request(loop): request = None def maker(method, url, *args, **kwargs): nonlocal request request = ClientRequest(method, URL(url), *args, loop=loop, **kwargs) return request yield maker if request is not None: loop.run_until_complete(request.close()) @pytest.fixture def buf(): return bytearray() @pytest.fixture def protocol(loop, transport): protocol = mock.Mock() protocol.transport = transport protocol._drain_helper.return_value = loop.create_future() protocol._drain_helper.return_value.set_result(None) return protocol @pytest.fixture def transport(buf): transport = mock.Mock() def write(chunk): buf.extend(chunk) async def write_eof(): pass transport.write.side_effect = write transport.write_eof.side_effect = write_eof transport.is_closing.return_value = False return transport @pytest.fixture def conn(transport, protocol): return mock.Mock(transport=transport, protocol=protocol) def test_method1(make_request) -> None: req = make_request("get", "http://python.org/") assert req.method == "GET" def test_method2(make_request) -> None: req = make_request("head", "http://python.org/") assert req.method == "HEAD" def test_method3(make_request) -> None: req = make_request("HEAD", "http://python.org/") assert req.method == "HEAD" def test_version_1_0(make_request) -> None: req = make_request("get", "http://python.org/", version="1.0") assert req.version == (1, 0) def test_version_default(make_request) -> None: req = make_request("get", "http://python.org/") assert req.version == (1, 1) def test_request_info(make_request) -> None: req = make_request("get", "http://python.org/") assert req.request_info == aiohttp.RequestInfo( URL("http://python.org/"), "GET", req.headers ) def test_request_info_with_fragment(make_request) -> None: req = make_request("get", "http://python.org/#urlfragment") assert req.request_info == aiohttp.RequestInfo( URL("http://python.org/"), "GET", req.headers, URL("http://python.org/#urlfragment"), ) def test_version_err(make_request) -> None: with pytest.raises(ValueError): make_request("get", "http://python.org/", version="1.c") def test_keep_alive(make_request) -> None: req = make_request("get", "http://python.org/", version=(0, 9)) assert not req.keep_alive() req = make_request("get", "http://python.org/", version=(1, 0)) assert not req.keep_alive() req = make_request( "get", "http://python.org/", version=(1, 0), headers={"connection": "keep-alive"}, ) assert req.keep_alive() req = make_request("get", "http://python.org/", version=(1, 1)) assert req.keep_alive() req = make_request( "get", "http://python.org/", version=(1, 1), headers={"connection": "close"} ) assert not req.keep_alive() def test_host_port_default_http(make_request) -> None: req = make_request("get", "http://python.org/") assert req.host == "python.org" assert req.port == 80 assert not req.ssl def test_host_port_default_https(make_request) -> None: req = make_request("get", "https://python.org/") assert req.host == "python.org" assert req.port == 443 assert req.is_ssl() def test_host_port_nondefault_http(make_request) -> None: req = make_request("get", "http://python.org:960/") assert req.host == "python.org" assert req.port == 960 assert not req.is_ssl() def test_host_port_nondefault_https(make_request) -> None: req = make_request("get", "https://python.org:960/") assert req.host == "python.org" assert req.port == 960 assert req.is_ssl() def test_host_port_default_ws(make_request) -> None: req = make_request("get", "ws://python.org/") assert req.host == "python.org" assert req.port == 80 assert not req.is_ssl() def test_host_port_default_wss(make_request) -> None: req = make_request("get", "wss://python.org/") assert req.host == "python.org" assert req.port == 443 assert req.is_ssl() def test_host_port_nondefault_ws(make_request) -> None: req = make_request("get", "ws://python.org:960/") assert req.host == "python.org" assert req.port == 960 assert not req.is_ssl() def test_host_port_nondefault_wss(make_request) -> None: req = make_request("get", "wss://python.org:960/") assert req.host == "python.org" assert req.port == 960 assert req.is_ssl() def test_host_port_none_port(make_request) -> None: req = make_request("get", "unix://localhost/path") assert req.headers["Host"] == "localhost" def test_host_port_err(make_request) -> None: with pytest.raises(ValueError): make_request("get", "http://python.org:123e/") def test_hostname_err(make_request) -> None: with pytest.raises(ValueError): make_request("get", "http://:8080/") def test_host_header_host_first(make_request) -> None: req = make_request("get", "http://python.org/") assert list(req.headers)[0] == "Host" def test_host_header_host_without_port(make_request) -> None: req = make_request("get", "http://python.org/") assert req.headers["HOST"] == "python.org" def test_host_header_host_with_default_port(make_request) -> None: req = make_request("get", "http://python.org:80/") assert req.headers["HOST"] == "python.org" def test_host_header_host_with_nondefault_port(make_request) -> None: req = make_request("get", "http://python.org:99/") assert req.headers["HOST"] == "python.org:99" def test_host_header_host_idna_encode(make_request) -> None: req = make_request("get", "http://xn--9caa.com") assert req.headers["HOST"] == "xn--9caa.com" def test_host_header_host_unicode(make_request) -> None: req = make_request("get", "http://éé.com") assert req.headers["HOST"] == "xn--9caa.com" def test_host_header_explicit_host(make_request) -> None: req = make_request("get", "http://python.org/", headers={"host": "example.com"}) assert req.headers["HOST"] == "example.com" def test_host_header_explicit_host_with_port(make_request) -> None: req = make_request("get", "http://python.org/", headers={"host": "example.com:99"}) assert req.headers["HOST"] == "example.com:99" def test_host_header_ipv4(make_request) -> None: req = make_request("get", "http://127.0.0.2") assert req.headers["HOST"] == "127.0.0.2" def test_host_header_ipv6(make_request) -> None: req = make_request("get", "http://[::2]") assert req.headers["HOST"] == "[::2]" def test_host_header_ipv4_with_port(make_request) -> None: req = make_request("get", "http://127.0.0.2:99") assert req.headers["HOST"] == "127.0.0.2:99" def test_host_header_ipv6_with_port(make_request) -> None: req = make_request("get", "http://[::2]:99") assert req.headers["HOST"] == "[::2]:99" @pytest.mark.xfail( PY_310, reason="No idea why ClientRequest() is constructed out of loop but " "it calls `asyncio.get_event_loop()`", raises=DeprecationWarning, ) def test_default_loop(loop) -> None: asyncio.set_event_loop(loop) req = ClientRequest("get", URL("http://python.org/")) assert req.loop is loop loop.run_until_complete(req.close()) def test_default_headers_useragent(make_request) -> None: req = make_request("get", "http://python.org/") assert "SERVER" not in req.headers assert "USER-AGENT" in req.headers def test_default_headers_useragent_custom(make_request) -> None: req = make_request( "get", "http://python.org/", headers={"user-agent": "my custom agent"} ) assert "USER-Agent" in req.headers assert "my custom agent" == req.headers["User-Agent"] def test_skip_default_useragent_header(make_request) -> None: req = make_request( "get", "http://python.org/", skip_auto_headers={istr("user-agent")} ) assert "User-Agent" not in req.headers def test_headers(make_request) -> None: req = make_request( "post", "http://python.org/", headers={"Content-Type": "text/plain"} ) assert "CONTENT-TYPE" in req.headers assert req.headers["CONTENT-TYPE"] == "text/plain" assert req.headers["ACCEPT-ENCODING"] == "gzip, deflate" def test_headers_list(make_request) -> None: req = make_request( "post", "http://python.org/", headers=[("Content-Type", "text/plain")] ) assert "CONTENT-TYPE" in req.headers assert req.headers["CONTENT-TYPE"] == "text/plain" def test_headers_default(make_request) -> None: req = make_request( "get", "http://python.org/", headers={"ACCEPT-ENCODING": "deflate"} ) assert req.headers["ACCEPT-ENCODING"] == "deflate" def test_invalid_url(make_request) -> None: with pytest.raises(aiohttp.InvalidURL): make_request("get", "hiwpefhipowhefopw") def test_no_path(make_request) -> None: req = make_request("get", "http://python.org") assert "/" == req.url.path def test_ipv6_default_http_port(make_request) -> None: req = make_request("get", "http://[2001:db8::1]/") assert req.host == "2001:db8::1" assert req.port == 80 assert not req.ssl def test_ipv6_default_https_port(make_request) -> None: req = make_request("get", "https://[2001:db8::1]/") assert req.host == "2001:db8::1" assert req.port == 443 assert req.is_ssl() def test_ipv6_nondefault_http_port(make_request) -> None: req = make_request("get", "http://[2001:db8::1]:960/") assert req.host == "2001:db8::1" assert req.port == 960 assert not req.is_ssl() def test_ipv6_nondefault_https_port(make_request) -> None: req = make_request("get", "https://[2001:db8::1]:960/") assert req.host == "2001:db8::1" assert req.port == 960 assert req.is_ssl() def test_basic_auth(make_request) -> None: req = make_request( "get", "http://python.org", auth=aiohttp.BasicAuth("nkim", "1234") ) assert "AUTHORIZATION" in req.headers assert "Basic bmtpbToxMjM0" == req.headers["AUTHORIZATION"] def test_basic_auth_utf8(make_request) -> None: req = make_request( "get", "http://python.org", auth=aiohttp.BasicAuth("nkim", "секрет", "utf-8") ) assert "AUTHORIZATION" in req.headers assert "Basic bmtpbTrRgdC10LrRgNC10YI=" == req.headers["AUTHORIZATION"] def test_basic_auth_tuple_forbidden(make_request) -> None: with pytest.raises(TypeError): make_request("get", "http://python.org", auth=("nkim", "1234")) def test_basic_auth_from_url(make_request) -> None: req = make_request("get", "http://nkim:1234@python.org") assert "AUTHORIZATION" in req.headers assert "Basic bmtpbToxMjM0" == req.headers["AUTHORIZATION"] assert "python.org" == req.host def test_basic_auth_from_url_overridden(make_request) -> None: req = make_request( "get", "http://garbage@python.org", auth=aiohttp.BasicAuth("nkim", "1234") ) assert "AUTHORIZATION" in req.headers assert "Basic bmtpbToxMjM0" == req.headers["AUTHORIZATION"] assert "python.org" == req.host def test_path_is_not_double_encoded1(make_request) -> None: req = make_request("get", "http://0.0.0.0/get/test case") assert req.url.raw_path == "/get/test%20case" def test_path_is_not_double_encoded2(make_request) -> None: req = make_request("get", "http://0.0.0.0/get/test%2fcase") assert req.url.raw_path == "/get/test%2Fcase" def test_path_is_not_double_encoded3(make_request) -> None: req = make_request("get", "http://0.0.0.0/get/test%20case") assert req.url.raw_path == "/get/test%20case" def test_path_safe_chars_preserved(make_request) -> None: req = make_request("get", "http://0.0.0.0/get/:=+/%2B/") assert req.url.path == "/get/:=+/+/" def test_params_are_added_before_fragment1(make_request) -> None: req = make_request("GET", "http://example.com/path#fragment", params={"a": "b"}) assert str(req.url) == "http://example.com/path?a=b" def test_params_are_added_before_fragment2(make_request) -> None: req = make_request( "GET", "http://example.com/path?key=value#fragment", params={"a": "b"} ) assert str(req.url) == "http://example.com/path?key=value&a=b" def test_path_not_contain_fragment1(make_request) -> None: req = make_request("GET", "http://example.com/path#fragment") assert req.url.path == "/path" def test_path_not_contain_fragment2(make_request) -> None: req = make_request("GET", "http://example.com/path?key=value#fragment") assert str(req.url) == "http://example.com/path?key=value" def test_cookies(make_request) -> None: req = make_request("get", "http://test.com/path", cookies={"cookie1": "val1"}) assert "COOKIE" in req.headers assert "cookie1=val1" == req.headers["COOKIE"] def test_cookies_is_quoted_with_special_characters(make_request) -> None: req = make_request("get", "http://test.com/path", cookies={"cookie1": "val/one"}) assert "COOKIE" in req.headers assert 'cookie1="val/one"' == req.headers["COOKIE"] def test_cookies_merge_with_headers(make_request) -> None: req = make_request( "get", "http://test.com/path", headers={"cookie": "cookie1=val1"}, cookies={"cookie2": "val2"}, ) assert "cookie1=val1; cookie2=val2" == req.headers["COOKIE"] def test_unicode_get1(make_request) -> None: req = make_request("get", "http://python.org", params={"foo": "f\xf8\xf8"}) assert "http://python.org/?foo=f%C3%B8%C3%B8" == str(req.url) def test_unicode_get2(make_request) -> None: req = make_request("", "http://python.org", params={"f\xf8\xf8": "f\xf8\xf8"}) assert "http://python.org/?f%C3%B8%C3%B8=f%C3%B8%C3%B8" == str(req.url) def test_unicode_get3(make_request) -> None: req = make_request("", "http://python.org", params={"foo": "foo"}) assert "http://python.org/?foo=foo" == str(req.url) def test_unicode_get4(make_request) -> None: def join(*suffix): return urllib.parse.urljoin("http://python.org/", "/".join(suffix)) req = make_request("", join("\xf8"), params={"foo": "foo"}) assert "http://python.org/%C3%B8?foo=foo" == str(req.url) def test_query_multivalued_param(make_request) -> None: for meth in ClientRequest.ALL_METHODS: req = make_request( meth, "http://python.org", params=(("test", "foo"), ("test", "baz")) ) assert str(req.url) == "http://python.org/?test=foo&test=baz" def test_query_str_param(make_request) -> None: for meth in ClientRequest.ALL_METHODS: req = make_request(meth, "http://python.org", params="test=foo") assert str(req.url) == "http://python.org/?test=foo" def test_query_bytes_param_raises(make_request) -> None: for meth in ClientRequest.ALL_METHODS: with pytest.raises(TypeError): make_request(meth, "http://python.org", params=b"test=foo") def test_query_str_param_is_not_encoded(make_request) -> None: for meth in ClientRequest.ALL_METHODS: req = make_request(meth, "http://python.org", params="test=f+oo") assert str(req.url) == "http://python.org/?test=f+oo" def test_params_update_path_and_url(make_request) -> None: req = make_request( "get", "http://python.org", params=(("test", "foo"), ("test", "baz")) ) assert str(req.url) == "http://python.org/?test=foo&test=baz" def test_params_empty_path_and_url(make_request) -> None: req_empty = make_request("get", "http://python.org", params={}) assert str(req_empty.url) == "http://python.org" req_none = make_request("get", "http://python.org") assert str(req_none.url) == "http://python.org" def test_gen_netloc_all(make_request) -> None: req = make_request( "get", "https://aiohttp:pwpwpw@" + "12345678901234567890123456789" + "012345678901234567890:8080", ) assert ( req.headers["HOST"] == "12345678901234567890123456789" + "012345678901234567890:8080" ) def test_gen_netloc_no_port(make_request) -> None: req = make_request( "get", "https://aiohttp:pwpwpw@" + "12345678901234567890123456789" + "012345678901234567890/", ) assert ( req.headers["HOST"] == "12345678901234567890123456789" + "012345678901234567890" ) async def test_connection_header(loop, conn) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) req.keep_alive = mock.Mock() req.headers.clear() req.keep_alive.return_value = True req.version = (1, 1) req.headers.clear() await req.send(conn) assert req.headers.get("CONNECTION") is None req.version = (1, 0) req.headers.clear() await req.send(conn) assert req.headers.get("CONNECTION") == "keep-alive" req.keep_alive.return_value = False req.version = (1, 1) req.headers.clear() await req.send(conn) assert req.headers.get("CONNECTION") == "close" await req.close() async def test_no_content_length(loop, conn) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) resp = await req.send(conn) assert req.headers.get("CONTENT-LENGTH") is None await req.close() resp.close() async def test_no_content_length_head(loop, conn) -> None: req = ClientRequest("head", URL("http://python.org"), loop=loop) resp = await req.send(conn) assert req.headers.get("CONTENT-LENGTH") is None await req.close() resp.close() async def test_content_type_auto_header_get(loop, conn) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) resp = await req.send(conn) assert "CONTENT-TYPE" not in req.headers resp.close() await req.close() async def test_content_type_auto_header_form(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org"), data={"hey": "you"}, loop=loop ) resp = await req.send(conn) assert "application/x-www-form-urlencoded" == req.headers.get("CONTENT-TYPE") resp.close() await req.close() async def test_content_type_auto_header_bytes(loop, conn) -> None: req = ClientRequest("post", URL("http://python.org"), data=b"hey you", loop=loop) resp = await req.send(conn) assert "application/octet-stream" == req.headers.get("CONTENT-TYPE") resp.close() await req.close() async def test_content_type_skip_auto_header_bytes(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org"), data=b"hey you", skip_auto_headers={"Content-Type"}, loop=loop, ) resp = await req.send(conn) assert "CONTENT-TYPE" not in req.headers resp.close() await req.close() async def test_content_type_skip_auto_header_form(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org"), data={"hey": "you"}, loop=loop, skip_auto_headers={"Content-Type"}, ) resp = await req.send(conn) assert "CONTENT-TYPE" not in req.headers resp.close() await req.close() async def test_content_type_auto_header_content_length_no_skip(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org"), data=io.BytesIO(b"hey"), skip_auto_headers={"Content-Length"}, loop=loop, ) resp = await req.send(conn) assert req.headers.get("CONTENT-LENGTH") == "3" resp.close() await req.close() async def test_urlencoded_formdata_charset(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org"), data=aiohttp.FormData({"hey": "you"}, charset="koi8-r"), loop=loop, ) await req.send(conn) assert "application/x-www-form-urlencoded; charset=koi8-r" == req.headers.get( "CONTENT-TYPE" ) await req.close() async def test_post_data(loop, conn) -> None: for meth in ClientRequest.POST_METHODS: req = ClientRequest( meth, URL("http://python.org/"), data={"life": "42"}, loop=loop ) resp = await req.send(conn) assert "/" == req.url.path assert b"life=42" == req.body._value assert "application/x-www-form-urlencoded" == req.headers["CONTENT-TYPE"] await req.close() resp.close() async def test_pass_falsy_data(loop) -> None: with mock.patch("aiohttp.client_reqrep.ClientRequest.update_body_from_data"): req = ClientRequest("post", URL("http://python.org/"), data={}, loop=loop) req.update_body_from_data.assert_called_once_with({}) await req.close() async def test_pass_falsy_data_file(loop, tmpdir) -> None: testfile = tmpdir.join("tmpfile").open("w+b") testfile.write(b"data") testfile.seek(0) skip = frozenset([hdrs.CONTENT_TYPE]) req = ClientRequest( "post", URL("http://python.org/"), data=testfile, skip_auto_headers=skip, loop=loop, ) assert req.headers.get("CONTENT-LENGTH", None) is not None await req.close() testfile.close() # Elasticsearch API requires to send request body with GET-requests async def test_get_with_data(loop) -> None: for meth in ClientRequest.GET_METHODS: req = ClientRequest( meth, URL("http://python.org/"), data={"life": "42"}, loop=loop ) assert "/" == req.url.path assert b"life=42" == req.body._value await req.close() async def test_bytes_data(loop, conn) -> None: for meth in ClientRequest.POST_METHODS: req = ClientRequest( meth, URL("http://python.org/"), data=b"binary data", loop=loop ) resp = await req.send(conn) assert "/" == req.url.path assert isinstance(req.body, payload.BytesPayload) assert b"binary data" == req.body._value assert "application/octet-stream" == req.headers["CONTENT-TYPE"] await req.close() resp.close() async def test_content_encoding(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org/"), data="foo", compress="deflate", loop=loop ) with mock.patch("aiohttp.client_reqrep.StreamWriter") as m_writer: m_writer.return_value.write_headers = make_mocked_coro() resp = await req.send(conn) assert req.headers["TRANSFER-ENCODING"] == "chunked" assert req.headers["CONTENT-ENCODING"] == "deflate" m_writer.return_value.enable_compression.assert_called_with("deflate") await req.close() resp.close() async def test_content_encoding_dont_set_headers_if_no_body(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org/"), compress="deflate", loop=loop ) with mock.patch("aiohttp.client_reqrep.http"): resp = await req.send(conn) assert "TRANSFER-ENCODING" not in req.headers assert "CONTENT-ENCODING" not in req.headers await req.close() resp.close() async def test_content_encoding_header(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org/"), data="foo", headers={"Content-Encoding": "deflate"}, loop=loop, ) with mock.patch("aiohttp.client_reqrep.StreamWriter") as m_writer: m_writer.return_value.write_headers = make_mocked_coro() resp = await req.send(conn) assert not m_writer.return_value.enable_compression.called assert not m_writer.return_value.enable_chunking.called await req.close() resp.close() async def test_compress_and_content_encoding(loop, conn) -> None: with pytest.raises(ValueError): ClientRequest( "post", URL("http://python.org/"), data="foo", headers={"content-encoding": "deflate"}, compress="deflate", loop=loop, ) async def test_chunked(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org/"), headers={"TRANSFER-ENCODING": "gzip"}, loop=loop, ) resp = await req.send(conn) assert "gzip" == req.headers["TRANSFER-ENCODING"] await req.close() resp.close() async def test_chunked2(loop, conn) -> None: req = ClientRequest( "post", URL("http://python.org/"), headers={"Transfer-encoding": "chunked"}, loop=loop, ) resp = await req.send(conn) assert "chunked" == req.headers["TRANSFER-ENCODING"] await req.close() resp.close() async def test_chunked_explicit(loop, conn) -> None: req = ClientRequest("post", URL("http://python.org/"), chunked=True, loop=loop) with mock.patch("aiohttp.client_reqrep.StreamWriter") as m_writer: m_writer.return_value.write_headers = make_mocked_coro() resp = await req.send(conn) assert "chunked" == req.headers["TRANSFER-ENCODING"] m_writer.return_value.enable_chunking.assert_called_with() await req.close() resp.close() async def test_chunked_length(loop, conn) -> None: with pytest.raises(ValueError): ClientRequest( "post", URL("http://python.org/"), headers={"CONTENT-LENGTH": "1000"}, chunked=True, loop=loop, ) async def test_chunked_transfer_encoding(loop, conn) -> None: with pytest.raises(ValueError): ClientRequest( "post", URL("http://python.org/"), headers={"TRANSFER-ENCODING": "chunked"}, chunked=True, loop=loop, ) async def test_file_upload_not_chunked(loop) -> None: here = os.path.dirname(__file__) fname = os.path.join(here, "aiohttp.png") with open(fname, "rb") as f: req = ClientRequest("post", URL("http://python.org/"), data=f, loop=loop) assert not req.chunked assert req.headers["CONTENT-LENGTH"] == str(os.path.getsize(fname)) await req.close() async def test_precompressed_data_stays_intact(loop) -> None: data = zlib.compress(b"foobar") req = ClientRequest( "post", URL("http://python.org/"), data=data, headers={"CONTENT-ENCODING": "deflate"}, compress=False, loop=loop, ) assert not req.compress assert not req.chunked assert req.headers["CONTENT-ENCODING"] == "deflate" await req.close() async def test_file_upload_not_chunked_seek(loop) -> None: here = os.path.dirname(__file__) fname = os.path.join(here, "aiohttp.png") with open(fname, "rb") as f: f.seek(100) req = ClientRequest("post", URL("http://python.org/"), data=f, loop=loop) assert req.headers["CONTENT-LENGTH"] == str(os.path.getsize(fname) - 100) await req.close() async def test_file_upload_force_chunked(loop) -> None: here = os.path.dirname(__file__) fname = os.path.join(here, "aiohttp.png") with open(fname, "rb") as f: req = ClientRequest( "post", URL("http://python.org/"), data=f, chunked=True, loop=loop ) assert req.chunked assert "CONTENT-LENGTH" not in req.headers await req.close() async def test_expect100(loop, conn) -> None: req = ClientRequest("get", URL("http://python.org/"), expect100=True, loop=loop) resp = await req.send(conn) assert "100-continue" == req.headers["EXPECT"] assert req._continue is not None req.terminate() resp.close() await req.close() async def test_expect_100_continue_header(loop, conn) -> None: req = ClientRequest( "get", URL("http://python.org/"), headers={"expect": "100-continue"}, loop=loop ) resp = await req.send(conn) assert "100-continue" == req.headers["EXPECT"] assert req._continue is not None req.terminate() resp.close() await req.close() async def test_data_stream(loop, buf, conn) -> None: @async_generator async def gen(): await yield_(b"binary data") await yield_(b" result") req = ClientRequest("POST", URL("http://python.org/"), data=gen(), loop=loop) assert req.chunked assert req.headers["TRANSFER-ENCODING"] == "chunked" resp = await req.send(conn) assert asyncio.isfuture(req._writer) await resp.wait_for_close() assert req._writer is None assert ( buf.split(b"\r\n\r\n", 1)[1] == b"b\r\nbinary data\r\n7\r\n result\r\n0\r\n\r\n" ) await req.close() async def test_data_stream_deprecated(loop, buf, conn) -> None: with pytest.warns(DeprecationWarning): @aiohttp.streamer async def gen(writer): await writer.write(b"binary data") await writer.write(b" result") req = ClientRequest("POST", URL("http://python.org/"), data=gen(), loop=loop) assert req.chunked assert req.headers["TRANSFER-ENCODING"] == "chunked" resp = await req.send(conn) assert asyncio.isfuture(req._writer) await resp.wait_for_close() assert req._writer is None assert ( buf.split(b"\r\n\r\n", 1)[1] == b"b\r\nbinary data\r\n7\r\n result\r\n0\r\n\r\n" ) await req.close() async def test_data_file(loop, buf, conn) -> None: req = ClientRequest( "POST", URL("http://python.org/"), data=io.BufferedReader(io.BytesIO(b"*" * 2)), loop=loop, ) assert req.chunked assert isinstance(req.body, payload.BufferedReaderPayload) assert req.headers["TRANSFER-ENCODING"] == "chunked" resp = await req.send(conn) assert asyncio.isfuture(req._writer) await resp.wait_for_close() assert req._writer is None assert buf.split(b"\r\n\r\n", 1)[1] == b"2\r\n" + b"*" * 2 + b"\r\n0\r\n\r\n" await req.close() async def test_data_stream_exc(loop, conn) -> None: fut = loop.create_future() @async_generator async def gen(): await yield_(b"binary data") await fut req = ClientRequest("POST", URL("http://python.org/"), data=gen(), loop=loop) assert req.chunked assert req.headers["TRANSFER-ENCODING"] == "chunked" async def throw_exc(): await asyncio.sleep(0.01) fut.set_exception(ValueError) loop.create_task(throw_exc()) await req.send(conn) await req._writer # assert conn.close.called assert conn.protocol.set_exception.called await req.close() async def test_data_stream_exc_chain(loop, conn) -> None: fut = loop.create_future() @async_generator async def gen(): await fut req = ClientRequest("POST", URL("http://python.org/"), data=gen(), loop=loop) inner_exc = ValueError() async def throw_exc(): await asyncio.sleep(0.01) fut.set_exception(inner_exc) loop.create_task(throw_exc()) await req.send(conn) await req._writer # assert connection.close.called assert conn.protocol.set_exception.called outer_exc = conn.protocol.set_exception.call_args[0][0] assert isinstance(outer_exc, ValueError) assert inner_exc is outer_exc assert inner_exc is outer_exc await req.close() async def test_data_stream_continue(loop, buf, conn) -> None: @async_generator async def gen(): await yield_(b"binary data") await yield_(b" result") req = ClientRequest( "POST", URL("http://python.org/"), data=gen(), expect100=True, loop=loop ) assert req.chunked async def coro(): await asyncio.sleep(0.0001) req._continue.set_result(1) loop.create_task(coro()) resp = await req.send(conn) await req._writer assert ( buf.split(b"\r\n\r\n", 1)[1] == b"b\r\nbinary data\r\n7\r\n result\r\n0\r\n\r\n" ) await req.close() resp.close() async def test_data_continue(loop, buf, conn) -> None: req = ClientRequest( "POST", URL("http://python.org/"), data=b"data", expect100=True, loop=loop ) async def coro(): await asyncio.sleep(0.0001) req._continue.set_result(1) loop.create_task(coro()) resp = await req.send(conn) await req._writer assert buf.split(b"\r\n\r\n", 1)[1] == b"data" await req.close() resp.close() async def test_close(loop, buf, conn) -> None: @async_generator async def gen(): await asyncio.sleep(0.00001) await yield_(b"result") req = ClientRequest("POST", URL("http://python.org/"), data=gen(), loop=loop) resp = await req.send(conn) await req.close() assert buf.split(b"\r\n\r\n", 1)[1] == b"6\r\nresult\r\n0\r\n\r\n" await req.close() resp.close() async def test_custom_response_class(loop, conn) -> None: class CustomResponse(ClientResponse): def read(self, decode=False): return "customized!" req = ClientRequest( "GET", URL("http://python.org/"), response_class=CustomResponse, loop=loop ) resp = await req.send(conn) assert "customized!" == resp.read() await req.close() resp.close() async def test_oserror_on_write_bytes(loop, conn) -> None: req = ClientRequest("POST", URL("http://python.org/"), loop=loop) writer = mock.Mock() writer.write.side_effect = OSError await req.write_bytes(writer, conn) assert conn.protocol.set_exception.called exc = conn.protocol.set_exception.call_args[0][0] assert isinstance(exc, aiohttp.ClientOSError) await req.close() async def test_terminate(loop, conn) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) resp = await req.send(conn) assert req._writer is not None writer = req._writer = mock.Mock() req.terminate() assert req._writer is None writer.cancel.assert_called_with() resp.close() await req.close() def test_terminate_with_closed_loop(loop, conn) -> None: req = resp = writer = None async def go(): nonlocal req, resp, writer req = ClientRequest("get", URL("http://python.org")) resp = await req.send(conn) assert req._writer is not None writer = req._writer = mock.Mock() await asyncio.sleep(0.05) loop.run_until_complete(go()) loop.run_until_complete(req.close()) loop.close() req.terminate() assert req._writer is None assert not writer.cancel.called resp.close() def test_terminate_without_writer(loop) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) assert req._writer is None req.terminate() assert req._writer is None loop.run_until_complete(req.close()) async def test_custom_req_rep(loop) -> None: conn = None class CustomResponse(ClientResponse): async def start(self, connection, read_until_eof=False): nonlocal conn conn = connection self.status = 123 self.reason = "Test OK" self._headers = CIMultiDictProxy(CIMultiDict()) self.cookies = SimpleCookie() return called = False class CustomRequest(ClientRequest): async def send(self, conn): resp = self.response_class( self.method, self.url, writer=self._writer, continue100=self._continue, timer=self._timer, request_info=self.request_info, traces=self._traces, loop=self.loop, session=self._session, ) self.response = resp nonlocal called called = True return resp async def create_connection(req, traces, timeout): assert isinstance(req, CustomRequest) return mock.Mock() connector = BaseConnector(loop=loop) connector._create_connection = create_connection session = aiohttp.ClientSession( request_class=CustomRequest, response_class=CustomResponse, connector=connector, loop=loop, ) resp = await session.request("get", URL("http://example.com/path/to")) assert isinstance(resp, CustomResponse) assert called resp.close() await session.close() conn.close() def test_verify_ssl_false_with_ssl_context(loop, ssl_ctx) -> None: with pytest.warns(DeprecationWarning): with pytest.raises(ValueError): _merge_ssl_params( None, verify_ssl=False, ssl_context=ssl_ctx, fingerprint=None ) def test_bad_fingerprint(loop) -> None: with pytest.raises(ValueError): Fingerprint(b"invalid") def test_insecure_fingerprint_md5(loop) -> None: with pytest.raises(ValueError): Fingerprint(hashlib.md5(b"foo").digest()) def test_insecure_fingerprint_sha1(loop) -> None: with pytest.raises(ValueError): Fingerprint(hashlib.sha1(b"foo").digest()) def test_loose_cookies_types(loop) -> None: req = ClientRequest("get", URL("http://python.org"), loop=loop) morsel = Morsel() morsel.set(key="string", val="Another string", coded_val="really") accepted_types = [ [("str", BaseCookie())], [("str", morsel)], [ ("str", "str"), ], {"str": BaseCookie()}, {"str": morsel}, {"str": "str"}, SimpleCookie(), ] for loose_cookies_type in accepted_types: req.update_cookies(cookies=loose_cookies_type) loop.run_until_complete(req.close()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_client_response.py0000644000175100001710000010407200000000000020506 0ustar00runnerdocker# Tests for aiohttp/client.py import gc import sys from unittest import mock import pytest from multidict import CIMultiDict from yarl import URL import aiohttp from aiohttp import http from aiohttp.client_reqrep import ClientResponse, RequestInfo from aiohttp.helpers import TimerNoop from aiohttp.test_utils import make_mocked_coro @pytest.fixture def session(): return mock.Mock() async def test_http_processing_error(session) -> None: loop = mock.Mock() request_info = mock.Mock() response = ClientResponse( "get", URL("http://del-cl-resp.org"), request_info=request_info, writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) loop.get_debug = mock.Mock() loop.get_debug.return_value = True connection = mock.Mock() connection.protocol = aiohttp.DataQueue(loop) connection.protocol.set_response_params = mock.Mock() connection.protocol.set_exception(http.HttpProcessingError()) with pytest.raises(aiohttp.ClientResponseError) as info: await response.start(connection) assert info.value.request_info is request_info response.close() def test_del(session) -> None: loop = mock.Mock() response = ClientResponse( "get", URL("http://del-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) loop.get_debug = mock.Mock() loop.get_debug.return_value = True connection = mock.Mock() response._closed = False response._connection = connection loop.set_exception_handler(lambda loop, ctx: None) with pytest.warns(ResourceWarning): del response gc.collect() connection.release.assert_called_with() def test_close(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._closed = False response._connection = mock.Mock() response.close() assert response.connection is None response.close() response.close() def test_wait_for_100_1(loop, session) -> None: response = ClientResponse( "get", URL("http://python.org"), continue100=object(), request_info=mock.Mock(), writer=mock.Mock(), timer=TimerNoop(), traces=[], loop=loop, session=session, ) assert response._continue is not None response.close() def test_wait_for_100_2(loop, session) -> None: response = ClientResponse( "get", URL("http://python.org"), request_info=mock.Mock(), continue100=None, writer=mock.Mock(), timer=TimerNoop(), traces=[], loop=loop, session=session, ) assert response._continue is None response.close() def test_repr(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response.status = 200 response.reason = "Ok" assert "" in repr(response) def test_repr_non_ascii_url() -> None: response = ClientResponse( "get", URL("http://fake-host.org/\u03bb"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) assert "" in repr(response) def test_repr_non_ascii_reason() -> None: response = ClientResponse( "get", URL("http://fake-host.org/path"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.reason = "\u03bb" assert "" in repr( response ) def test_url_obj_deprecated() -> None: response = ClientResponse( "get", URL("http://fake-host.org/"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) with pytest.warns(DeprecationWarning): response.url_obj async def test_read_and_release_connection(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result(b"payload") return fut content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.read() assert res == b"payload" assert response._connection is None async def test_read_and_release_connection_with_error(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) content = response.content = mock.Mock() content.read.return_value = loop.create_future() content.read.return_value.set_exception(ValueError) with pytest.raises(ValueError): await response.read() assert response._closed async def test_release(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) fut = loop.create_future() fut.set_result(b"") content = response.content = mock.Mock() content.readany.return_value = fut response.release() assert response._connection is None @pytest.mark.skipif( sys.implementation.name != "cpython", reason="Other implementations has different GC strategies", ) async def test_release_on_del(loop, session) -> None: connection = mock.Mock() connection.protocol.upgraded = False def run(conn): response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._closed = False response._connection = conn run(connection) assert connection.release.called async def test_response_eof(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._closed = False conn = response._connection = mock.Mock() conn.protocol.upgraded = False response._response_eof() assert conn.release.called assert response._connection is None async def test_response_eof_upgraded(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) conn = response._connection = mock.Mock() conn.protocol.upgraded = True response._response_eof() assert not conn.release.called assert response._connection is conn async def test_response_eof_after_connection_detach(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._closed = False conn = response._connection = mock.Mock() conn.protocol = None response._response_eof() assert conn.release.called assert response._connection is None async def test_text(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "application/json;charset=cp1251"} content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.text() assert res == '{"тест": "пройден"}' assert response._connection is None async def test_text_bad_encoding(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тестkey": "пройденvalue"}'.encode("cp1251")) return fut # lie about the encoding response._headers = {"Content-Type": "application/json;charset=utf-8"} content = response.content = mock.Mock() content.read.side_effect = side_effect with pytest.raises(UnicodeDecodeError): await response.text() # only the valid utf-8 characters will be returned res = await response.text(errors="ignore") assert res == '{"key": "value"}' assert response._connection is None async def test_text_custom_encoding(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "application/json"} content = response.content = mock.Mock() content.read.side_effect = side_effect response.get_encoding = mock.Mock() res = await response.text(encoding="cp1251") assert res == '{"тест": "пройден"}' assert response._connection is None assert not response.get_encoding.called async def test_text_detect_encoding(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "text/plain"} content = response.content = mock.Mock() content.read.side_effect = side_effect await response.read() res = await response.text() assert res == '{"тест": "пройден"}' assert response._connection is None async def test_text_detect_encoding_if_invalid_charset(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "text/plain;charset=invalid"} content = response.content = mock.Mock() content.read.side_effect = side_effect await response.read() res = await response.text() assert res == '{"тест": "пройден"}' assert response._connection is None assert response.get_encoding().lower() in ("windows-1251", "maccyrillic") async def test_get_encoding_body_none(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"encoding": "test"}') return fut response._headers = {"Content-Type": "text/html"} content = response.content = mock.Mock() content.read.side_effect = side_effect with pytest.raises( RuntimeError, match="^Cannot guess the encoding of a not yet read body$", ): response.get_encoding() assert response.closed async def test_text_after_read(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "application/json;charset=cp1251"} content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.text() assert res == '{"тест": "пройден"}' assert response._connection is None async def test_json(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "application/json;charset=cp1251"} content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.json() assert res == {"тест": "пройден"} assert response._connection is None async def test_json_extended_content_type(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = { "Content-Type": "application/this.is-1_content+subtype+json;charset=cp1251" } content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.json() assert res == {"тест": "пройден"} assert response._connection is None async def test_json_custom_content_type(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "custom/type;charset=cp1251"} content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.json(content_type="custom/type") assert res == {"тест": "пройден"} assert response._connection is None async def test_json_custom_loader(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "application/json;charset=cp1251"} response._body = b"data" def custom(content): return content + "-custom" res = await response.json(loads=custom) assert res == "data-custom" async def test_json_invalid_content_type(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "data/octet-stream"} response._body = b"" with pytest.raises(aiohttp.ContentTypeError) as info: await response.json() assert info.value.request_info == response.request_info async def test_json_no_content(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "data/octet-stream"} response._body = b"" res = await response.json(content_type=None) assert res is None async def test_json_override_encoding(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result('{"тест": "пройден"}'.encode("cp1251")) return fut response._headers = {"Content-Type": "application/json;charset=utf8"} content = response.content = mock.Mock() content.read.side_effect = side_effect response.get_encoding = mock.Mock() res = await response.json(encoding="cp1251") assert res == {"тест": "пройден"} assert response._connection is None assert not response.get_encoding.called def test_get_encoding_unknown(loop, session) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "application/json"} with mock.patch("aiohttp.client_reqrep.chardet") as m_chardet: m_chardet.detect.return_value = {"encoding": None} assert response.get_encoding() == "utf-8" def test_raise_for_status_2xx() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 200 response.reason = "OK" response.raise_for_status() # should not raise def test_raise_for_status_4xx() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 409 response.reason = "CONFLICT" with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert str(cm.value.status) == "409" assert str(cm.value.message) == "CONFLICT" assert response.closed def test_raise_for_status_4xx_without_reason() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 404 response.reason = "" with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert str(cm.value.status) == "404" assert str(cm.value.message) == "" assert response.closed def test_resp_host() -> None: response = ClientResponse( "get", URL("http://del-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) assert "del-cl-resp.org" == response.host def test_content_type() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {"Content-Type": "application/json;charset=cp1251"} assert "application/json" == response.content_type def test_content_type_no_header() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {} assert "application/octet-stream" == response.content_type def test_charset() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {"Content-Type": "application/json;charset=cp1251"} assert "cp1251" == response.charset def test_charset_no_header() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {} assert response.charset is None def test_charset_no_charset() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {"Content-Type": "application/json"} assert response.charset is None def test_content_disposition_full() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = { "Content-Disposition": 'attachment; filename="archive.tar.gz"; foo=bar' } assert "attachment" == response.content_disposition.type assert "bar" == response.content_disposition.parameters["foo"] assert "archive.tar.gz" == response.content_disposition.filename with pytest.raises(TypeError): response.content_disposition.parameters["foo"] = "baz" def test_content_disposition_no_parameters() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {"Content-Disposition": "attachment"} assert "attachment" == response.content_disposition.type assert response.content_disposition.filename is None assert {} == response.content_disposition.parameters def test_content_disposition_no_header() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {} assert response.content_disposition is None def test_response_request_info() -> None: url = "http://def-cl-resp.org" headers = {"Content-Type": "application/json;charset=cp1251"} response = ClientResponse( "get", URL(url), request_info=RequestInfo(url, "get", headers), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) assert url == response.request_info.url assert "get" == response.request_info.method assert headers == response.request_info.headers def test_request_info_in_exception() -> None: url = "http://def-cl-resp.org" headers = {"Content-Type": "application/json;charset=cp1251"} response = ClientResponse( "get", URL(url), request_info=RequestInfo(url, "get", headers), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 409 response.reason = "CONFLICT" with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert cm.value.request_info == response.request_info def test_no_redirect_history_in_exception() -> None: url = "http://def-cl-resp.org" headers = {"Content-Type": "application/json;charset=cp1251"} response = ClientResponse( "get", URL(url), request_info=RequestInfo(url, "get", headers), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 409 response.reason = "CONFLICT" with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert () == cm.value.history def test_redirect_history_in_exception() -> None: hist_url = "http://def-cl-resp.org" url = "http://def-cl-resp.org/index.htm" hist_headers = {"Content-Type": "application/json;charset=cp1251", "Location": url} headers = {"Content-Type": "application/json;charset=cp1251"} response = ClientResponse( "get", URL(url), request_info=RequestInfo(url, "get", headers), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 409 response.reason = "CONFLICT" hist_response = ClientResponse( "get", URL(hist_url), request_info=RequestInfo(url, "get", headers), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) hist_response._headers = hist_headers hist_response.status = 301 hist_response.reason = "REDIRECT" response._history = [hist_response] with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert [hist_response] == cm.value.history async def test_response_read_triggers_callback(loop, session) -> None: trace = mock.Mock() trace.send_response_chunk_received = make_mocked_coro() response_method = "get" response_url = URL("http://def-cl-resp.org") response_body = b"This is response" response = ClientResponse( response_method, response_url, request_info=mock.Mock, writer=mock.Mock(), continue100=None, timer=TimerNoop(), loop=loop, session=session, traces=[trace], ) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result(response_body) return fut response._headers = {"Content-Type": "application/json;charset=cp1251"} content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.read() assert res == response_body assert response._connection is None assert trace.send_response_chunk_received.called assert trace.send_response_chunk_received.call_args == mock.call( response_method, response_url, response_body ) def test_response_real_url(loop, session) -> None: url = URL("http://def-cl-resp.org/#urlfragment") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) assert response.url == url.with_fragment(None) assert response.real_url == url def test_response_links_comma_separated(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict( [ ( "Link", ( "; rel=next, " "; rel=home" ), ) ] ) assert response.links == { "next": {"url": URL("http://example.com/page/1.html"), "rel": "next"}, "home": {"url": URL("http://example.com/"), "rel": "home"}, } def test_response_links_multiple_headers(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict( [ ("Link", "; rel=next"), ("Link", "; rel=home"), ] ) assert response.links == { "next": {"url": URL("http://example.com/page/1.html"), "rel": "next"}, "home": {"url": URL("http://example.com/"), "rel": "home"}, } def test_response_links_no_rel(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict([("Link", "")]) assert response.links == { "http://example.com/": {"url": URL("http://example.com/")} } def test_response_links_quoted(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict( [ ("Link", '; rel="home-page"'), ] ) assert response.links == { "home-page": {"url": URL("http://example.com/"), "rel": "home-page"} } def test_response_links_relative(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict( [ ("Link", "; rel=rel"), ] ) assert response.links == { "rel": {"url": URL("http://def-cl-resp.org/relative/path"), "rel": "rel"} } def test_response_links_empty(loop, session) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict() assert response.links == {} def test_response_not_closed_after_get_ok(mocker) -> None: response = ClientResponse( "get", URL("http://del-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 400 response.reason = "Bad Request" response._closed = False spy = mocker.spy(response, "raise_for_status") assert not response.ok assert not response.closed assert spy.call_count == 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_client_session.py0000644000175100001710000007104100000000000020332 0ustar00runnerdockerimport asyncio import contextlib import gc import json import sys from http.cookies import SimpleCookie from io import BytesIO from typing import Any, List from unittest import mock import pytest from multidict import CIMultiDict, MultiDict from re_assert import Matches from yarl import URL import aiohttp from aiohttp import client, hdrs, web from aiohttp.client import ClientSession from aiohttp.client_reqrep import ClientRequest from aiohttp.connector import BaseConnector, TCPConnector from aiohttp.helpers import DEBUG, PY_36 from aiohttp.test_utils import make_mocked_coro @pytest.fixture def connector(loop): async def make_conn(): return BaseConnector(loop=loop) conn = loop.run_until_complete(make_conn()) proto = mock.Mock() conn._conns["a"] = [(proto, 123)] yield conn loop.run_until_complete(conn.close()) @pytest.fixture def create_session(loop): session = None async def maker(*args, **kwargs): nonlocal session session = ClientSession(*args, loop=loop, **kwargs) return session yield maker if session is not None: loop.run_until_complete(session.close()) @pytest.fixture def session(create_session, loop): return loop.run_until_complete(create_session()) @pytest.fixture def params(): return dict( headers={"Authorization": "Basic ..."}, max_redirects=2, encoding="latin1", version=aiohttp.HttpVersion10, compress="deflate", chunked=True, expect100=True, read_until_eof=False, ) async def test_close_coro(create_session) -> None: session = await create_session() await session.close() async def test_init_headers_simple_dict(create_session) -> None: session = await create_session(headers={"h1": "header1", "h2": "header2"}) assert sorted(session.headers.items()) == ([("h1", "header1"), ("h2", "header2")]) async def test_init_headers_list_of_tuples(create_session) -> None: session = await create_session( headers=[("h1", "header1"), ("h2", "header2"), ("h3", "header3")] ) assert session.headers == CIMultiDict( [("h1", "header1"), ("h2", "header2"), ("h3", "header3")] ) async def test_init_headers_MultiDict(create_session) -> None: session = await create_session( headers=MultiDict([("h1", "header1"), ("h2", "header2"), ("h3", "header3")]) ) assert session.headers == CIMultiDict( [("H1", "header1"), ("H2", "header2"), ("H3", "header3")] ) async def test_init_headers_list_of_tuples_with_duplicates(create_session) -> None: session = await create_session( headers=[("h1", "header11"), ("h2", "header21"), ("h1", "header12")] ) assert session.headers == CIMultiDict( [("H1", "header11"), ("H2", "header21"), ("H1", "header12")] ) async def test_init_cookies_with_simple_dict(create_session) -> None: session = await create_session(cookies={"c1": "cookie1", "c2": "cookie2"}) cookies = session.cookie_jar.filter_cookies() assert set(cookies) == {"c1", "c2"} assert cookies["c1"].value == "cookie1" assert cookies["c2"].value == "cookie2" async def test_init_cookies_with_list_of_tuples(create_session) -> None: session = await create_session(cookies=[("c1", "cookie1"), ("c2", "cookie2")]) cookies = session.cookie_jar.filter_cookies() assert set(cookies) == {"c1", "c2"} assert cookies["c1"].value == "cookie1" assert cookies["c2"].value == "cookie2" async def test_merge_headers(create_session) -> None: # Check incoming simple dict session = await create_session(headers={"h1": "header1", "h2": "header2"}) headers = session._prepare_headers({"h1": "h1"}) assert isinstance(headers, CIMultiDict) assert headers == {"h1": "h1", "h2": "header2"} async def test_merge_headers_with_multi_dict(create_session) -> None: session = await create_session(headers={"h1": "header1", "h2": "header2"}) headers = session._prepare_headers(MultiDict([("h1", "h1")])) assert isinstance(headers, CIMultiDict) assert headers == {"h1": "h1", "h2": "header2"} async def test_merge_headers_with_list_of_tuples(create_session) -> None: session = await create_session(headers={"h1": "header1", "h2": "header2"}) headers = session._prepare_headers([("h1", "h1")]) assert isinstance(headers, CIMultiDict) assert headers == {"h1": "h1", "h2": "header2"} async def test_merge_headers_with_list_of_tuples_duplicated_names( create_session, ) -> None: session = await create_session(headers={"h1": "header1", "h2": "header2"}) headers = session._prepare_headers([("h1", "v1"), ("h1", "v2")]) assert isinstance(headers, CIMultiDict) assert list(sorted(headers.items())) == [ ("h1", "v1"), ("h1", "v2"), ("h2", "header2"), ] def test_http_GET(session, params) -> None: # Python 3.8 will auto use mock.AsyncMock, it has different behavior with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.get("http://test.example.com", params={"x": 1}, **params) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "GET", "http://test.example.com", ), dict(params={"x": 1}, allow_redirects=True, **params), ] def test_http_OPTIONS(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.options("http://opt.example.com", params={"x": 2}, **params) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "OPTIONS", "http://opt.example.com", ), dict(params={"x": 2}, allow_redirects=True, **params), ] def test_http_HEAD(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.head("http://head.example.com", params={"x": 2}, **params) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "HEAD", "http://head.example.com", ), dict(params={"x": 2}, allow_redirects=False, **params), ] def test_http_POST(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.post( "http://post.example.com", params={"x": 2}, data="Some_data", **params ) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "POST", "http://post.example.com", ), dict(params={"x": 2}, data="Some_data", **params), ] def test_http_PUT(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.put( "http://put.example.com", params={"x": 2}, data="Some_data", **params ) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "PUT", "http://put.example.com", ), dict(params={"x": 2}, data="Some_data", **params), ] def test_http_PATCH(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.patch( "http://patch.example.com", params={"x": 2}, data="Some_data", **params ) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "PATCH", "http://patch.example.com", ), dict(params={"x": 2}, data="Some_data", **params), ] def test_http_DELETE(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.delete("http://delete.example.com", params={"x": 2}, **params) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "DELETE", "http://delete.example.com", ), dict(params={"x": 2}, **params), ] async def test_close(create_session, connector) -> None: session = await create_session(connector=connector) await session.close() assert session.connector is None assert connector.closed async def test_closed(session) -> None: assert not session.closed await session.close() assert session.closed async def test_connector(create_session, loop, mocker) -> None: connector = TCPConnector(loop=loop) mocker.spy(connector, "close") session = await create_session(connector=connector) assert session.connector is connector await session.close() assert connector.close.called await connector.close() async def test_create_connector(create_session, loop, mocker) -> None: session = await create_session() connector = session.connector mocker.spy(session.connector, "close") await session.close() assert connector.close.called def test_connector_loop(loop) -> None: with contextlib.ExitStack() as stack: another_loop = asyncio.new_event_loop() stack.enter_context(contextlib.closing(another_loop)) async def make_connector(): return TCPConnector() connector = another_loop.run_until_complete(make_connector()) with pytest.raises(RuntimeError) as ctx: async def make_sess(): return ClientSession(connector=connector, loop=loop) loop.run_until_complete(make_sess()) assert ( Matches("Session and connector has to use same event loop") == str(ctx.value).strip() ) # Cannot use `AsyncExitStack` as it's Python 3.7+: another_loop.run_until_complete(connector.close()) def test_detach(loop, session) -> None: conn = session.connector try: assert not conn.closed session.detach() assert session.connector is None assert session.closed assert not conn.closed finally: loop.run_until_complete(conn.close()) async def test_request_closed_session(session) -> None: await session.close() with pytest.raises(RuntimeError): await session.request("get", "/") def test_close_flag_for_closed_connector(loop, session) -> None: conn = session.connector assert not session.closed loop.run_until_complete(conn.close()) assert session.closed async def test_double_close(connector, create_session) -> None: session = await create_session(connector=connector) await session.close() assert session.connector is None await session.close() assert session.closed assert connector.closed async def test_del(connector, loop) -> None: loop.set_debug(False) # N.B. don't use session fixture, it stores extra reference internally session = ClientSession(connector=connector, loop=loop) logs = [] loop.set_exception_handler(lambda loop, ctx: logs.append(ctx)) with pytest.warns(ResourceWarning): del session gc.collect() assert len(logs) == 1 expected = {"client_session": mock.ANY, "message": "Unclosed client session"} assert logs[0] == expected async def test_del_debug(connector, loop) -> None: loop.set_debug(True) # N.B. don't use session fixture, it stores extra reference internally session = ClientSession(connector=connector, loop=loop) logs = [] loop.set_exception_handler(lambda loop, ctx: logs.append(ctx)) with pytest.warns(ResourceWarning): del session gc.collect() assert len(logs) == 1 expected = { "client_session": mock.ANY, "message": "Unclosed client session", "source_traceback": mock.ANY, } assert logs[0] == expected async def test_context_manager(connector, loop) -> None: with pytest.raises(TypeError): with ClientSession(loop=loop, connector=connector) as session: pass assert session.closed async def test_borrow_connector_loop(connector, create_session, loop) -> None: session = ClientSession(connector=connector, loop=None) try: assert session._loop, loop finally: await session.close() async def test_reraise_os_error(create_session) -> None: err = OSError(1, "permission error") req = mock.Mock() req_factory = mock.Mock(return_value=req) req.send = mock.Mock(side_effect=err) session = await create_session(request_class=req_factory) async def create_connection(req, traces, timeout): # return self.transport, self.protocol return mock.Mock() session._connector._create_connection = create_connection session._connector._release = mock.Mock() with pytest.raises(aiohttp.ClientOSError) as ctx: await session.request("get", "http://example.com") e = ctx.value assert e.errno == err.errno assert e.strerror == err.strerror async def test_close_conn_on_error(create_session) -> None: class UnexpectedException(BaseException): pass err = UnexpectedException("permission error") req = mock.Mock() req_factory = mock.Mock(return_value=req) req.send = mock.Mock(side_effect=err) session = await create_session(request_class=req_factory) connections = [] original_connect = session._connector.connect async def connect(req, traces, timeout): conn = await original_connect(req, traces, timeout) connections.append(conn) return conn async def create_connection(req, traces, timeout): # return self.transport, self.protocol conn = mock.Mock() return conn session._connector.connect = connect session._connector._create_connection = create_connection session._connector._release = mock.Mock() with pytest.raises(UnexpectedException): async with session.request("get", "http://example.com") as resp: await resp.text() # normally called during garbage collection. triggers an exception # if the connection wasn't already closed for c in connections: c.__del__() async def test_cookie_jar_usage(loop, aiohttp_client) -> None: req_url = None jar = mock.Mock() jar.filter_cookies.return_value = None async def handler(request): nonlocal req_url req_url = "http://%s/" % request.host resp = web.Response() resp.set_cookie("response", "resp_value") return resp app = web.Application() app.router.add_route("GET", "/", handler) session = await aiohttp_client( app, cookies={"request": "req_value"}, cookie_jar=jar ) # Updating the cookie jar with initial user defined cookies jar.update_cookies.assert_called_with({"request": "req_value"}) jar.update_cookies.reset_mock() resp = await session.get("/") await resp.release() # Filtering the cookie jar before sending the request, # getting the request URL as only parameter jar.filter_cookies.assert_called_with(URL(req_url)) # Updating the cookie jar with the response cookies assert jar.update_cookies.called resp_cookies = jar.update_cookies.call_args[0][0] assert isinstance(resp_cookies, SimpleCookie) assert "response" in resp_cookies assert resp_cookies["response"].value == "resp_value" async def test_session_default_version(loop) -> None: session = aiohttp.ClientSession(loop=loop) assert session.version == aiohttp.HttpVersion11 await session.close() async def test_session_loop(loop) -> None: session = aiohttp.ClientSession(loop=loop) with pytest.warns(DeprecationWarning): assert session.loop is loop await session.close() def test_proxy_str(session, params) -> None: with mock.patch( "aiohttp.client.ClientSession._request", new_callable=mock.MagicMock ) as patched: session.get("http://test.example.com", proxy="http://proxy.com", **params) assert patched.called, "`ClientSession._request` not called" assert list(patched.call_args) == [ ( "GET", "http://test.example.com", ), dict(allow_redirects=True, proxy="http://proxy.com", **params), ] async def test_request_tracing(loop, aiohttp_client) -> None: async def handler(request): return web.json_response({"ok": True}) app = web.Application() app.router.add_post("/", handler) trace_config_ctx = mock.Mock() trace_request_ctx = {} body = "This is request body" gathered_req_body = BytesIO() gathered_res_body = BytesIO() gathered_req_headers = CIMultiDict() on_request_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_request_redirect = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_request_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) async def on_request_chunk_sent(session, context, params): gathered_req_body.write(params.chunk) async def on_response_chunk_received(session, context, params): gathered_res_body.write(params.chunk) async def on_request_headers_sent(session, context, params): gathered_req_headers.extend(**params.headers) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_request_start.append(on_request_start) trace_config.on_request_end.append(on_request_end) trace_config.on_request_chunk_sent.append(on_request_chunk_sent) trace_config.on_response_chunk_received.append(on_response_chunk_received) trace_config.on_request_redirect.append(on_request_redirect) trace_config.on_request_headers_sent.append(on_request_headers_sent) headers = CIMultiDict({"Custom-Header": "Custom value"}) session = await aiohttp_client(app, trace_configs=[trace_config], headers=headers) async with session.post( "/", data=body, trace_request_ctx=trace_request_ctx ) as resp: await resp.json() on_request_start.assert_called_once_with( session.session, trace_config_ctx, aiohttp.TraceRequestStartParams( hdrs.METH_POST, session.make_url("/"), headers ), ) on_request_end.assert_called_once_with( session.session, trace_config_ctx, aiohttp.TraceRequestEndParams( hdrs.METH_POST, session.make_url("/"), headers, resp ), ) assert not on_request_redirect.called assert gathered_req_body.getvalue() == body.encode("utf8") assert gathered_res_body.getvalue() == json.dumps({"ok": True}).encode("utf8") assert gathered_req_headers["Custom-Header"] == "Custom value" async def test_request_tracing_url_params(loop: Any, aiohttp_client: Any) -> None: async def root_handler(request): return web.Response() async def redirect_handler(request): raise web.HTTPFound("/") app = web.Application() app.router.add_get("/", root_handler) app.router.add_get("/redirect", redirect_handler) mocks = [mock.Mock(side_effect=make_mocked_coro(mock.Mock())) for _ in range(7)] ( on_request_start, on_request_redirect, on_request_end, on_request_exception, on_request_chunk_sent, on_response_chunk_received, on_request_headers_sent, ) = mocks trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=mock.Mock()) ) trace_config.on_request_start.append(on_request_start) trace_config.on_request_redirect.append(on_request_redirect) trace_config.on_request_end.append(on_request_end) trace_config.on_request_exception.append(on_request_exception) trace_config.on_request_chunk_sent.append(on_request_chunk_sent) trace_config.on_response_chunk_received.append(on_response_chunk_received) trace_config.on_request_headers_sent.append(on_request_headers_sent) session = await aiohttp_client(app, trace_configs=[trace_config]) def reset_mocks() -> None: for m in mocks: m.reset_mock() def to_trace_urls(mock_func: mock.Mock) -> List[URL]: return [call_args[0][-1].url for call_args in mock_func.call_args_list] def to_url(path: str) -> URL: return session.make_url(path) # Standard for req in [ lambda: session.get("/?x=0"), lambda: session.get("/", params=dict(x=0)), ]: reset_mocks() async with req() as resp: await resp.text() assert to_trace_urls(on_request_start) == [to_url("/?x=0")] assert to_trace_urls(on_request_redirect) == [] assert to_trace_urls(on_request_end) == [to_url("/?x=0")] assert to_trace_urls(on_request_exception) == [] assert to_trace_urls(on_request_chunk_sent) == [to_url("/?x=0")] assert to_trace_urls(on_response_chunk_received) == [to_url("/?x=0")] assert to_trace_urls(on_request_headers_sent) == [to_url("/?x=0")] # Redirect for req in [ lambda: session.get("/redirect?x=0"), lambda: session.get("/redirect", params=dict(x=0)), ]: reset_mocks() async with req() as resp: await resp.text() assert to_trace_urls(on_request_start) == [to_url("/redirect?x=0")] assert to_trace_urls(on_request_redirect) == [to_url("/redirect?x=0")] assert to_trace_urls(on_request_end) == [to_url("/")] assert to_trace_urls(on_request_exception) == [] assert to_trace_urls(on_request_chunk_sent) == [ to_url("/redirect?x=0"), to_url("/"), ] assert to_trace_urls(on_response_chunk_received) == [to_url("/")] assert to_trace_urls(on_request_headers_sent) == [ to_url("/redirect?x=0"), to_url("/"), ] # Exception with mock.patch("aiohttp.client.TCPConnector.connect") as connect_patched: error = Exception() if sys.version_info >= (3, 8, 1): connect_patched.side_effect = error else: loop = asyncio.get_event_loop() f = loop.create_future() f.set_exception(error) connect_patched.return_value = f for req in [ lambda: session.get("/?x=0"), lambda: session.get("/", params=dict(x=0)), ]: reset_mocks() with contextlib.suppress(Exception): await req() assert to_trace_urls(on_request_start) == [to_url("/?x=0")] assert to_trace_urls(on_request_redirect) == [] assert to_trace_urls(on_request_end) == [] assert to_trace_urls(on_request_exception) == [to_url("?x=0")] assert to_trace_urls(on_request_chunk_sent) == [] assert to_trace_urls(on_response_chunk_received) == [] assert to_trace_urls(on_request_headers_sent) == [] async def test_request_tracing_exception() -> None: loop = asyncio.get_event_loop() on_request_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_request_exception = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig() trace_config.on_request_end.append(on_request_end) trace_config.on_request_exception.append(on_request_exception) with mock.patch("aiohttp.client.TCPConnector.connect") as connect_patched: error = Exception() if sys.version_info >= (3, 8, 1): connect_patched.side_effect = error else: loop = asyncio.get_event_loop() f = loop.create_future() f.set_exception(error) connect_patched.return_value = f session = aiohttp.ClientSession(loop=loop, trace_configs=[trace_config]) try: await session.get("http://example.com") except Exception: pass on_request_exception.assert_called_once_with( session, mock.ANY, aiohttp.TraceRequestExceptionParams( hdrs.METH_GET, URL("http://example.com"), CIMultiDict(), error ), ) assert not on_request_end.called await session.close() async def test_request_tracing_interpose_headers(loop, aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) class MyClientRequest(ClientRequest): headers = None def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) MyClientRequest.headers = self.headers async def new_headers(session, trace_config_ctx, data): data.headers["foo"] = "bar" trace_config = aiohttp.TraceConfig() trace_config.on_request_start.append(new_headers) session = await aiohttp_client( app, request_class=MyClientRequest, trace_configs=[trace_config] ) await session.get("/") assert MyClientRequest.headers["foo"] == "bar" @pytest.mark.skipif(not PY_36, reason="Python 3.6+ required") def test_client_session_inheritance() -> None: with pytest.warns(DeprecationWarning): class A(ClientSession): pass @pytest.mark.skipif(not DEBUG, reason="The check is applied in DEBUG mode only") async def test_client_session_custom_attr(loop) -> None: session = ClientSession(loop=loop) with pytest.warns(DeprecationWarning): session.custom = None await session.close() async def test_client_session_timeout_args(loop) -> None: session1 = ClientSession(loop=loop) assert session1._timeout == client.DEFAULT_TIMEOUT with pytest.warns(DeprecationWarning): session2 = ClientSession(loop=loop, read_timeout=20 * 60, conn_timeout=30 * 60) assert session2._timeout == client.ClientTimeout(total=20 * 60, connect=30 * 60) with pytest.raises(ValueError): ClientSession( loop=loop, timeout=client.ClientTimeout(total=10 * 60), read_timeout=20 * 60 ) with pytest.raises(ValueError): ClientSession( loop=loop, timeout=client.ClientTimeout(total=10 * 60), conn_timeout=30 * 60 ) await session1.close() await session2.close() async def test_client_session_timeout_default_args(loop) -> None: session1 = ClientSession() assert session1.timeout == client.DEFAULT_TIMEOUT await session1.close() async def test_client_session_timeout_argument() -> None: session = ClientSession(timeout=500) assert session.timeout == 500 await session.close() async def test_client_session_timeout_zero() -> None: timeout = client.ClientTimeout(total=10, connect=0, sock_connect=0, sock_read=0) try: async with ClientSession(timeout=timeout) as session: await session.get("http://example.com") except asyncio.TimeoutError: pytest.fail("0 should disable timeout.") async def test_requote_redirect_url_default() -> None: session = ClientSession() assert session.requote_redirect_url await session.close() async def test_requote_redirect_url_default_disable() -> None: session = ClientSession(requote_redirect_url=False) assert not session.requote_redirect_url await session.close() async def test_requote_redirect_setter() -> None: session = ClientSession() assert session.requote_redirect_url with pytest.warns(DeprecationWarning): session.requote_redirect_url = False assert not session.requote_redirect_url await session.close() @pytest.mark.parametrize( ("base_url", "url", "expected_url"), [ pytest.param( None, "http://example.com/test", URL("http://example.com/test"), id="base_url=None url='http://example.com/test'", ), pytest.param( None, URL("http://example.com/test"), URL("http://example.com/test"), id="base_url=None url=URL('http://example.com/test')", ), pytest.param( "http://example.com", "/test", URL("http://example.com/test"), id="base_url='http://example.com' url='/test'", ), pytest.param( URL("http://example.com"), "/test", URL("http://example.com/test"), id="base_url=URL('http://example.com') url='/test'", ), ], ) async def test_build_url_returns_expected_url( create_session, base_url, url, expected_url ) -> None: session = await create_session(base_url) assert session._build_url(url) == expected_url ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_client_ws.py0000644000175100001710000006266200000000000017311 0ustar00runnerdockerimport asyncio import base64 import hashlib import os from unittest import mock import pytest import aiohttp from aiohttp import client, hdrs from aiohttp.http import WS_KEY from aiohttp.streams import EofStream from aiohttp.test_utils import make_mocked_coro @pytest.fixture def key_data(): return os.urandom(16) @pytest.fixture def key(key_data): return base64.b64encode(key_data) @pytest.fixture def ws_key(key): return base64.b64encode(hashlib.sha1(key + WS_KEY).digest()).decode() async def test_ws_connect(ws_key, loop, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_PROTOCOL: "chat", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert isinstance(res, client.ClientWebSocketResponse) assert res.protocol == "chat" assert hdrs.ORIGIN not in m_req.call_args[1]["headers"] async def test_ws_connect_with_origin(key_data, loop) -> None: resp = mock.Mock() resp.status = 403 with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) origin = "https://example.org/page.html" with pytest.raises(client.WSServerHandshakeError): await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", origin=origin ) assert hdrs.ORIGIN in m_req.call_args[1]["headers"] assert m_req.call_args[1]["headers"][hdrs.ORIGIN] == origin async def test_ws_connect_with_params(ws_key, loop, key_data) -> None: params = {"key1": "value1", "key2": "value2"} resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_PROTOCOL: "chat", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) await aiohttp.ClientSession().ws_connect( "http://test.org", protocols=("t1", "t2", "chat"), params=params ) assert m_req.call_args[1]["params"] == params async def test_ws_connect_custom_response(loop, ws_key, key_data) -> None: class CustomResponse(client.ClientWebSocketResponse): def read(self, decode=False): return "customized!" resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession( ws_response_class=CustomResponse, loop=loop ).ws_connect("http://test.org") assert res.read() == "customized!" async def test_ws_connect_err_status(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 500 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError) as ctx: await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert ctx.value.message == "Invalid response status" async def test_ws_connect_err_upgrade(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "test", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError) as ctx: await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert ctx.value.message == "Invalid upgrade header" async def test_ws_connect_err_conn(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "close", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError) as ctx: await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert ctx.value.message == "Invalid connection header" async def test_ws_connect_err_challenge(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: "asdfasdfasdfasdfasdfasdf", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError) as ctx: await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert ctx.value.message == "Invalid challenge response" async def test_ws_connect_common_headers(ws_key, loop, key_data) -> None: # Emulate a headers dict being reused for a second ws_connect. # In this scenario, we need to ensure that the newly generated secret key # is sent to the server, not the stale key. headers = {} async def test_connection() -> None: async def mock_get(*args, **kwargs): resp = mock.Mock() resp.status = 101 key = kwargs.get("headers").get(hdrs.SEC_WEBSOCKET_KEY) accept = base64.b64encode( hashlib.sha1(base64.b64encode(base64.b64decode(key)) + WS_KEY).digest() ).decode() resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: accept, hdrs.SEC_WEBSOCKET_PROTOCOL: "chat", } return resp with mock.patch("aiohttp.client.os") as m_os: with mock.patch( "aiohttp.client.ClientSession.request", side_effect=mock_get ) as m_req: m_os.urandom.return_value = key_data res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat"), headers=headers ) assert isinstance(res, client.ClientWebSocketResponse) assert res.protocol == "chat" assert hdrs.ORIGIN not in m_req.call_args[1]["headers"] await test_connection() # Generate a new ws key key_data = os.urandom(16) await test_connection() async def test_close(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) writer = mock.Mock() WebSocketWriter.return_value = writer writer.close = make_mocked_coro() session = aiohttp.ClientSession(loop=loop) resp = await session.ws_connect("http://test.org") assert not resp.closed resp._reader.feed_data( aiohttp.WSMessage(aiohttp.WSMsgType.CLOSE, b"", b""), 0 ) res = await resp.close() writer.close.assert_called_with(1000, b"") assert resp.closed assert res assert resp.exception() is None # idempotent res = await resp.close() assert not res assert writer.close.call_count == 1 await session.close() async def test_close_eofstream(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) writer = WebSocketWriter.return_value = mock.Mock() session = aiohttp.ClientSession(loop=loop) resp = await session.ws_connect("http://test.org") assert not resp.closed exc = EofStream() resp._reader.set_exception(exc) await resp.receive() writer.close.assert_called_with(1000, b"") assert resp.closed await session.close() async def test_close_exc(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) writer = mock.Mock() WebSocketWriter.return_value = writer writer.close = make_mocked_coro() session = aiohttp.ClientSession(loop=loop) resp = await session.ws_connect("http://test.org") assert not resp.closed exc = ValueError() resp._reader.set_exception(exc) await resp.close() assert resp.closed assert resp.exception() is exc await session.close() async def test_close_exc2(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) writer = WebSocketWriter.return_value = mock.Mock() resp = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org" ) assert not resp.closed exc = ValueError() writer.close.side_effect = exc await resp.close() assert resp.closed assert resp.exception() is exc resp._closed = False writer.close.side_effect = asyncio.CancelledError() with pytest.raises(asyncio.CancelledError): await resp.close() async def test_send_data_after_close(ws_key, key_data, loop) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) resp = await aiohttp.ClientSession(loop=loop).ws_connect("http://test.org") resp._writer._closing = True for meth, args in ( (resp.ping, ()), (resp.pong, ()), (resp.send_str, ("s",)), (resp.send_bytes, (b"b",)), (resp.send_json, ({},)), ): with pytest.raises(ConnectionResetError): await meth(*args) async def test_send_data_type_errors(ws_key, key_data, loop) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) WebSocketWriter.return_value = mock.Mock() resp = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org" ) with pytest.raises(TypeError): await resp.send_str(b"s") with pytest.raises(TypeError): await resp.send_bytes("b") with pytest.raises(TypeError): await resp.send_json(set()) async def test_reader_read_exception(ws_key, key_data, loop) -> None: hresp = mock.Mock() hresp.status = 101 hresp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(hresp) writer = mock.Mock() WebSocketWriter.return_value = writer writer.close = make_mocked_coro() session = aiohttp.ClientSession(loop=loop) resp = await session.ws_connect("http://test.org") exc = ValueError() resp._reader.set_exception(exc) msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.ERROR assert resp.exception() is exc await session.close() async def test_receive_runtime_err(loop) -> None: resp = client.ClientWebSocketResponse( mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock(), 10.0, True, True, loop ) resp._waiting = True with pytest.raises(RuntimeError): await resp.receive() async def test_ws_connect_close_resp_on_err(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 500 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError): await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) resp.close.assert_called_with() async def test_ws_connect_non_overlapped_protocols(ws_key, loop, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_PROTOCOL: "other,another", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", protocols=("t1", "t2", "chat") ) assert res.protocol is None async def test_ws_connect_non_overlapped_protocols_2(ws_key, loop, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_PROTOCOL: "other,another", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) connector = aiohttp.TCPConnector(loop=loop, force_close=True) res = await aiohttp.ClientSession( connector=connector, loop=loop ).ws_connect("http://test.org", protocols=("t1", "t2", "chat")) assert res.protocol is None del res async def test_ws_connect_deflate(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) assert res.compress == 15 assert res.client_notakeover is False async def test_ws_connect_deflate_per_message(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate", } with mock.patch("aiohttp.client.WebSocketWriter") as WebSocketWriter: with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) writer = WebSocketWriter.return_value = mock.Mock() send = writer.send = make_mocked_coro() session = aiohttp.ClientSession(loop=loop) resp = await session.ws_connect("http://test.org") await resp.send_str("string", compress=-1) send.assert_called_with("string", binary=False, compress=-1) await resp.send_bytes(b"bytes", compress=15) send.assert_called_with(b"bytes", binary=True, compress=15) await resp.send_json([{}], compress=-9) send.assert_called_with("[{}]", binary=False, compress=-9) await session.close() async def test_ws_connect_deflate_server_not_support(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) assert res.compress == 0 assert res.client_notakeover is False async def test_ws_connect_deflate_notakeover(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate; " "client_no_context_takeover", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) assert res.compress == 15 assert res.client_notakeover is True async def test_ws_connect_deflate_client_wbits(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate; " "client_max_window_bits=10", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) res = await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) assert res.compress == 10 assert res.client_notakeover is False async def test_ws_connect_deflate_client_wbits_bad(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate; " "client_max_window_bits=6", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError): await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) async def test_ws_connect_deflate_server_ext_bad(loop, ws_key, key_data) -> None: resp = mock.Mock() resp.status = 101 resp.headers = { hdrs.UPGRADE: "websocket", hdrs.CONNECTION: "upgrade", hdrs.SEC_WEBSOCKET_ACCEPT: ws_key, hdrs.SEC_WEBSOCKET_EXTENSIONS: "permessage-deflate; bad", } with mock.patch("aiohttp.client.os") as m_os: with mock.patch("aiohttp.client.ClientSession.request") as m_req: m_os.urandom.return_value = key_data m_req.return_value = loop.create_future() m_req.return_value.set_result(resp) with pytest.raises(client.WSServerHandshakeError): await aiohttp.ClientSession(loop=loop).ws_connect( "http://test.org", compress=15 ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_client_ws_functional.py0000644000175100001710000005151200000000000021523 0ustar00runnerdockerimport asyncio import async_timeout import pytest import aiohttp from aiohttp import hdrs, web async def test_send_recv_text(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() await ws.send_str(msg + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") assert resp.get_extra_info("socket") is not None data = await resp.receive_str() assert data == "ask/answer" await resp.close() assert resp.get_extra_info("socket") is None async def test_send_recv_bytes_bad_type(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() await ws.send_str(msg + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") with pytest.raises(TypeError): await resp.receive_bytes() await resp.close() async def test_send_recv_bytes(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.send_bytes(msg + b"/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_bytes(b"ask") data = await resp.receive_bytes() assert data == b"ask/answer" await resp.close() async def test_send_recv_text_bad_type(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.send_bytes(msg + b"/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_bytes(b"ask") with pytest.raises(TypeError): await resp.receive_str() await resp.close() async def test_send_recv_json(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) data = await ws.receive_json() await ws.send_json({"response": data["request"]}) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") payload = {"request": "test"} await resp.send_json(payload) data = await resp.receive_json() assert data["response"] == payload["request"] await resp.close() async def test_ping_pong(aiohttp_client) -> None: loop = asyncio.get_event_loop() closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.ping() await ws.send_bytes(msg + b"/answer") try: await ws.close() finally: closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.ping() await resp.send_bytes(b"ask") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.BINARY assert msg.data == b"ask/answer" msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSE await resp.close() await closed async def test_ping_pong_manual(aiohttp_client) -> None: loop = asyncio.get_event_loop() closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.ping() await ws.send_bytes(msg + b"/answer") try: await ws.close() finally: closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", autoping=False) await resp.ping() await resp.send_bytes(b"ask") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.PONG msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.PING await resp.pong() msg = await resp.receive() assert msg.data == b"ask/answer" msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSE await closed async def test_close(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_bytes() await ws.send_str("test") await ws.receive() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_bytes(b"ask") closed = await resp.close() assert closed assert resp.closed assert resp.close_code == 1000 msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSED async def test_concurrent_close(aiohttp_client) -> None: client_ws = None async def handler(request): nonlocal client_ws ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_bytes() await ws.send_str("test") await client_ws.close() msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSE return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = client_ws = await client.ws_connect("/") await ws.send_bytes(b"ask") msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSING await asyncio.sleep(0.01) msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSED async def test_close_from_server(aiohttp_client) -> None: loop = asyncio.get_event_loop() closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) try: await ws.receive_bytes() await ws.close() finally: closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_bytes(b"ask") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSE assert resp.closed msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSED await closed async def test_close_manual(aiohttp_client) -> None: loop = asyncio.get_event_loop() closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_bytes() await ws.send_str("test") try: await ws.close() finally: closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", autoclose=False) await resp.send_bytes(b"ask") msg = await resp.receive() assert msg.data == "test" msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSE assert msg.data == 1000 assert msg.extra == "" assert not resp.closed await resp.close() await closed assert resp.closed async def test_close_timeout(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_bytes() await ws.send_str("test") await asyncio.sleep(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", timeout=0.2, autoclose=False) await resp.send_bytes(b"ask") msg = await resp.receive() assert msg.data == "test" assert msg.type == aiohttp.WSMsgType.TEXT msg = await resp.close() assert resp.closed assert isinstance(resp.exception(), asyncio.TimeoutError) async def test_close_cancel(aiohttp_client) -> None: loop = asyncio.get_event_loop() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_bytes() await ws.send_str("test") await asyncio.sleep(10) app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", autoclose=False) await resp.send_bytes(b"ask") text = await resp.receive() assert text.data == "test" t = loop.create_task(resp.close()) await asyncio.sleep(0.1) t.cancel() await asyncio.sleep(0.1) assert resp.closed assert resp.exception() is None async def test_override_default_headers(aiohttp_client) -> None: async def handler(request): assert request.headers[hdrs.SEC_WEBSOCKET_VERSION] == "8" ws = web.WebSocketResponse() await ws.prepare(request) await ws.send_str("answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) headers = {hdrs.SEC_WEBSOCKET_VERSION: "8"} client = await aiohttp_client(app) resp = await client.ws_connect("/", headers=headers) msg = await resp.receive() assert msg.data == "answer" await resp.close() async def test_additional_headers(aiohttp_client) -> None: async def handler(request): assert request.headers["x-hdr"] == "xtra" ws = web.WebSocketResponse() await ws.prepare(request) await ws.send_str("answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", headers={"x-hdr": "xtra"}) msg = await resp.receive() assert msg.data == "answer" await resp.close() async def test_recv_protocol_error(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_str() ws._writer.transport.write(b"01234" * 100) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.ERROR assert type(msg.data) is aiohttp.WebSocketError assert msg.data.code == aiohttp.WSCloseCode.PROTOCOL_ERROR assert str(msg.data) == "Received frame with non-zero reserved bits" assert msg.extra is None await resp.close() async def test_recv_timeout(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive_str() await asyncio.sleep(0.1) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") with pytest.raises(asyncio.TimeoutError): async with async_timeout.timeout(0.01): await resp.receive() await resp.close() async def test_receive_timeout(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive() await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", receive_timeout=0.1) with pytest.raises(asyncio.TimeoutError): await resp.receive(0.05) await resp.close() async def test_custom_receive_timeout(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive() await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") with pytest.raises(asyncio.TimeoutError): await resp.receive(0.05) await resp.close() async def test_heartbeat(aiohttp_client) -> None: ping_received = False async def handler(request): nonlocal ping_received ws = web.WebSocketResponse(autoping=False) await ws.prepare(request) msg = await ws.receive() if msg.type == aiohttp.WSMsgType.ping: ping_received = True await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", heartbeat=0.01) await asyncio.sleep(0.1) await resp.receive() await resp.close() assert ping_received async def test_heartbeat_no_pong(aiohttp_client) -> None: ping_received = False async def handler(request): nonlocal ping_received ws = web.WebSocketResponse(autoping=False) await ws.prepare(request) msg = await ws.receive() if msg.type == aiohttp.WSMsgType.ping: ping_received = True await ws.receive() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", heartbeat=0.05) await resp.receive() await resp.receive() assert ping_received async def test_send_recv_compress(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() await ws.send_str(msg + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", compress=15) await resp.send_str("ask") assert resp.compress == 15 data = await resp.receive_str() assert data == "ask/answer" await resp.close() assert resp.get_extra_info("socket") is None async def test_send_recv_compress_wbits(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() await ws.send_str(msg + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/", compress=9) await resp.send_str("ask") # Client indicates supports wbits 15 # Server supports wbit 15 for decode assert resp.compress == 15 data = await resp.receive_str() assert data == "ask/answer" await resp.close() assert resp.get_extra_info("socket") is None async def test_send_recv_compress_wbit_error(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.send_bytes(msg + b"/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) with pytest.raises(ValueError): await client.ws_connect("/", compress=1) async def test_ws_client_async_for(aiohttp_client) -> None: items = ["q1", "q2", "q3"] async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) for i in items: await ws.send_str(i) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") it = iter(items) async for msg in resp: assert msg.data == next(it) with pytest.raises(StopIteration): next(it) assert resp.closed async def test_ws_async_with(aiohttp_server) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive() await ws.send_str(msg.data + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as client: async with client.ws_connect(server.make_url("/")) as ws: await ws.send_str("request") msg = await ws.receive() assert msg.data == "request/answer" assert ws.closed async def test_ws_async_with_send(aiohttp_server) -> None: # send_xxx methods have to return awaitable objects async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive() await ws.send_str(msg.data + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as client: async with client.ws_connect(server.make_url("/")) as ws: await ws.send_str("request") msg = await ws.receive() assert msg.data == "request/answer" assert ws.closed async def test_ws_async_with_shortcut(aiohttp_server) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive() await ws.send_str(msg.data + "/answer") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as client: async with client.ws_connect(server.make_url("/")) as ws: await ws.send_str("request") msg = await ws.receive() assert msg.data == "request/answer" assert ws.closed async def test_closed_async_for(aiohttp_client) -> None: loop = asyncio.get_event_loop() closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) try: await ws.send_bytes(b"started") await ws.receive_bytes() finally: closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") messages = [] async for msg in resp: messages.append(msg) if b"started" == msg.data: await resp.send_bytes(b"ask") await resp.close() assert 1 == len(messages) assert messages[0].type == aiohttp.WSMsgType.BINARY assert messages[0].data == b"started" assert resp.closed await closed async def test_peer_connection_lost(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() assert msg == "ask" await ws.send_str("answer") request.transport.close() await asyncio.sleep(10) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") assert "answer" == await resp.receive_str() msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSED await resp.close() async def test_peer_connection_lost_iter(aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() assert msg == "ask" await ws.send_str("answer") request.transport.close() await asyncio.sleep(100) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.ws_connect("/") await resp.send_str("ask") async for msg in resp: assert "answer" == msg.data await resp.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_connector.py0000644000175100001710000021117100000000000017303 0ustar00runnerdocker# Tests of http client with custom Connector import asyncio import gc import hashlib import platform import socket import ssl import sys import uuid from collections import deque from unittest import mock import pytest from yarl import URL import aiohttp from aiohttp import client, web from aiohttp.client import ClientRequest, ClientTimeout from aiohttp.client_reqrep import ConnectionKey from aiohttp.connector import Connection, TCPConnector, _DNSCacheTable from aiohttp.helpers import PY_37 from aiohttp.locks import EventResultOrError from aiohttp.test_utils import make_mocked_coro, unused_port from aiohttp.tracing import Trace @pytest.fixture() def key(): # Connection key return ConnectionKey("localhost", 80, False, None, None, None, None) @pytest.fixture def key2(): # Connection key return ConnectionKey("localhost", 80, False, None, None, None, None) @pytest.fixture def ssl_key(): # Connection key return ConnectionKey("localhost", 80, True, None, None, None, None) @pytest.fixture def unix_sockname(shorttmpdir): sock_path = shorttmpdir / "socket.sock" return str(sock_path) @pytest.fixture def unix_server(loop, unix_sockname): runners = [] async def go(app): runner = web.AppRunner(app) runners.append(runner) await runner.setup() site = web.UnixSite(runner, unix_sockname) await site.start() yield go for runner in runners: loop.run_until_complete(runner.cleanup()) @pytest.fixture def named_pipe_server(proactor_loop, pipe_name): runners = [] async def go(app): runner = web.AppRunner(app) runners.append(runner) await runner.setup() site = web.NamedPipeSite(runner, pipe_name) await site.start() yield go for runner in runners: proactor_loop.run_until_complete(runner.cleanup()) def create_mocked_conn(conn_closing_result=None, **kwargs): try: loop = asyncio.get_running_loop() except (AttributeError, RuntimeError): # AttributeError->py36 loop = asyncio.get_event_loop_policy().get_event_loop() proto = mock.Mock(**kwargs) proto.closed = loop.create_future() proto.closed.set_result(conn_closing_result) return proto def test_connection_del(loop) -> None: connector = mock.Mock() key = mock.Mock() protocol = mock.Mock() loop.set_debug(0) conn = Connection(connector, key, protocol, loop=loop) exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) with pytest.warns(ResourceWarning): del conn gc.collect() connector._release.assert_called_with(key, protocol, should_close=True) msg = { "message": mock.ANY, "client_connection": mock.ANY, } exc_handler.assert_called_with(loop, msg) def test_connection_del_loop_debug(loop) -> None: connector = mock.Mock() key = mock.Mock() protocol = mock.Mock() loop.set_debug(1) conn = Connection(connector, key, protocol, loop=loop) exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) with pytest.warns(ResourceWarning): del conn gc.collect() msg = { "message": mock.ANY, "client_connection": mock.ANY, "source_traceback": mock.ANY, } exc_handler.assert_called_with(loop, msg) def test_connection_del_loop_closed(loop) -> None: connector = mock.Mock() key = mock.Mock() protocol = mock.Mock() loop.set_debug(1) conn = Connection(connector, key, protocol, loop=loop) exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) loop.close() with pytest.warns(ResourceWarning): del conn gc.collect() assert not connector._release.called assert not exc_handler.called async def test_del(loop) -> None: conn = aiohttp.BaseConnector() proto = mock.Mock(should_close=False) conn._release("a", proto) conns_impl = conn._conns exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) with pytest.warns(ResourceWarning): del conn gc.collect() assert not conns_impl proto.close.assert_called_with() msg = { "connector": mock.ANY, # conn was deleted "connections": mock.ANY, "message": "Unclosed connector", } if loop.get_debug(): msg["source_traceback"] = mock.ANY exc_handler.assert_called_with(loop, msg) @pytest.mark.xfail async def test_del_with_scheduled_cleanup(loop) -> None: loop.set_debug(True) conn = aiohttp.BaseConnector(loop=loop, keepalive_timeout=0.01) transp = mock.Mock() conn._conns["a"] = [(transp, 123)] conns_impl = conn._conns exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) with pytest.warns(ResourceWarning): # obviously doesn't deletion because loop has a strong # reference to connector's instance method, isn't it? del conn await asyncio.sleep(0.01) gc.collect() assert not conns_impl transp.close.assert_called_with() msg = {"connector": mock.ANY, "message": "Unclosed connector"} # conn was deleted if loop.get_debug(): msg["source_traceback"] = mock.ANY exc_handler.assert_called_with(loop, msg) @pytest.mark.skipif( sys.implementation.name != "cpython", reason="CPython GC is required for the test" ) def test_del_with_closed_loop(loop) -> None: async def make_conn(): return aiohttp.BaseConnector() conn = loop.run_until_complete(make_conn()) transp = mock.Mock() conn._conns["a"] = [(transp, 123)] conns_impl = conn._conns exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) loop.close() with pytest.warns(ResourceWarning): del conn gc.collect() assert not conns_impl assert not transp.close.called assert exc_handler.called async def test_del_empty_connector(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) exc_handler = mock.Mock() loop.set_exception_handler(exc_handler) del conn assert not exc_handler.called async def test_create_conn(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) with pytest.raises(NotImplementedError): await conn._create_connection(object(), [], object()) async def test_context_manager(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) with pytest.warns(DeprecationWarning): with conn as c: assert conn is c assert conn.closed async def test_async_context_manager(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) async with conn as c: assert conn is c assert conn.closed async def test_close(loop) -> None: proto = mock.Mock() conn = aiohttp.BaseConnector(loop=loop) assert not conn.closed conn._conns[("host", 8080, False)] = [(proto, object())] await conn.close() assert not conn._conns assert proto.close.called assert conn.closed async def test_get(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) assert conn._get(1) is None proto = mock.Mock() conn._conns[1] = [(proto, loop.time())] assert conn._get(1) == proto await conn.close() async def test_get_unconnected_proto(loop) -> None: conn = aiohttp.BaseConnector() key = ConnectionKey("localhost", 80, False, None, None, None, None) assert conn._get(key) is None proto = create_mocked_conn(loop) conn._conns[key] = [(proto, loop.time())] assert conn._get(key) == proto assert conn._get(key) is None conn._conns[key] = [(proto, loop.time())] proto.is_connected = lambda *args: False assert conn._get(key) is None await conn.close() async def test_get_unconnected_proto_ssl(loop) -> None: conn = aiohttp.BaseConnector() key = ConnectionKey("localhost", 80, True, None, None, None, None) assert conn._get(key) is None proto = create_mocked_conn(loop) conn._conns[key] = [(proto, loop.time())] assert conn._get(key) == proto assert conn._get(key) is None conn._conns[key] = [(proto, loop.time())] proto.is_connected = lambda *args: False assert conn._get(key) is None await conn.close() async def test_get_expired(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) key = ConnectionKey("localhost", 80, False, None, None, None, None) assert conn._get(key) is None proto = mock.Mock() conn._conns[key] = [(proto, loop.time() - 1000)] assert conn._get(key) is None assert not conn._conns await conn.close() async def test_get_expired_ssl(loop) -> None: conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=True) key = ConnectionKey("localhost", 80, True, None, None, None, None) assert conn._get(key) is None proto = mock.Mock() transport = proto.transport conn._conns[key] = [(proto, loop.time() - 1000)] assert conn._get(key) is None assert not conn._conns assert conn._cleanup_closed_transports == [transport] await conn.close() async def test_release_acquired(loop, key) -> None: proto = mock.Mock() conn = aiohttp.BaseConnector(loop=loop, limit=5) conn._release_waiter = mock.Mock() conn._acquired.add(proto) conn._acquired_per_host[key].add(proto) conn._release_acquired(key, proto) assert 0 == len(conn._acquired) assert 0 == len(conn._acquired_per_host) assert conn._release_waiter.called conn._release_acquired(key, proto) assert 0 == len(conn._acquired) assert 0 == len(conn._acquired_per_host) await conn.close() async def test_release_acquired_closed(loop, key) -> None: proto = mock.Mock() conn = aiohttp.BaseConnector(loop=loop, limit=5) conn._release_waiter = mock.Mock() conn._acquired.add(proto) conn._acquired_per_host[key].add(proto) conn._closed = True conn._release_acquired(key, proto) assert 1 == len(conn._acquired) assert 1 == len(conn._acquired_per_host[key]) assert not conn._release_waiter.called await conn.close() async def test_release(loop, key) -> None: conn = aiohttp.BaseConnector(loop=loop) conn._release_waiter = mock.Mock() proto = mock.Mock(should_close=False) conn._acquired.add(proto) conn._acquired_per_host[key].add(proto) conn._release(key, proto) assert conn._release_waiter.called assert conn._cleanup_handle is not None assert conn._conns[key][0][0] == proto assert conn._conns[key][0][1] == pytest.approx(loop.time(), abs=0.1) assert not conn._cleanup_closed_transports await conn.close() async def test_release_ssl_transport(loop, ssl_key) -> None: conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=True) conn._release_waiter = mock.Mock() proto = mock.Mock() transport = proto.transport conn._acquired.add(proto) conn._acquired_per_host[ssl_key].add(proto) conn._release(ssl_key, proto, should_close=True) assert conn._cleanup_closed_transports == [transport] await conn.close() async def test_release_already_closed(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) proto = mock.Mock() key = 1 conn._acquired.add(proto) await conn.close() conn._release_waiters = mock.Mock() conn._release_acquired = mock.Mock() conn._release(key, proto) assert not conn._release_waiters.called assert not conn._release_acquired.called async def test_release_waiter_no_limit(loop, key, key2) -> None: # limit is 0 conn = aiohttp.BaseConnector(limit=0, loop=loop) w = mock.Mock() w.done.return_value = False conn._waiters[key].append(w) conn._release_waiter() assert len(conn._waiters[key]) == 0 assert w.done.called await conn.close() async def test_release_waiter_first_available(loop, key, key2) -> None: conn = aiohttp.BaseConnector(loop=loop) w1, w2 = mock.Mock(), mock.Mock() w1.done.return_value = False w2.done.return_value = False conn._waiters[key].append(w2) conn._waiters[key2].append(w1) conn._release_waiter() assert ( w1.set_result.called and not w2.set_result.called or not w1.set_result.called and w2.set_result.called ) await conn.close() async def test_release_waiter_release_first(loop, key, key2) -> None: conn = aiohttp.BaseConnector(loop=loop, limit=1) w1, w2 = mock.Mock(), mock.Mock() w1.done.return_value = False w2.done.return_value = False conn._waiters[key] = deque([w1, w2]) conn._release_waiter() assert w1.set_result.called assert not w2.set_result.called await conn.close() async def test_release_waiter_skip_done_waiter(loop, key, key2) -> None: conn = aiohttp.BaseConnector(loop=loop, limit=1) w1, w2 = mock.Mock(), mock.Mock() w1.done.return_value = True w2.done.return_value = False conn._waiters[key] = deque([w1, w2]) conn._release_waiter() assert not w1.set_result.called assert w2.set_result.called await conn.close() async def test_release_waiter_per_host(loop, key, key2) -> None: # no limit conn = aiohttp.BaseConnector(loop=loop, limit=0, limit_per_host=2) w1, w2 = mock.Mock(), mock.Mock() w1.done.return_value = False w2.done.return_value = False conn._waiters[key] = deque([w1]) conn._waiters[key2] = deque([w2]) conn._release_waiter() assert (w1.set_result.called and not w2.set_result.called) or ( not w1.set_result.called and w2.set_result.called ) await conn.close() async def test_release_waiter_no_available(loop, key, key2) -> None: # limit is 0 conn = aiohttp.BaseConnector(limit=0, loop=loop) w = mock.Mock() w.done.return_value = False conn._waiters[key].append(w) conn._available_connections = mock.Mock(return_value=0) conn._release_waiter() assert len(conn._waiters) == 1 assert not w.done.called await conn.close() async def test_release_close(loop, key) -> None: conn = aiohttp.BaseConnector(loop=loop) proto = mock.Mock(should_close=True) conn._acquired.add(proto) conn._release(key, proto) assert not conn._conns assert proto.close.called async def test__drop_acquire_per_host1(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) conn._drop_acquired_per_host(123, 456) assert len(conn._acquired_per_host) == 0 async def test__drop_acquire_per_host2(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) conn._acquired_per_host[123].add(456) conn._drop_acquired_per_host(123, 456) assert len(conn._acquired_per_host) == 0 async def test__drop_acquire_per_host3(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) conn._acquired_per_host[123].add(456) conn._acquired_per_host[123].add(789) conn._drop_acquired_per_host(123, 456) assert len(conn._acquired_per_host) == 1 assert conn._acquired_per_host[123] == {789} async def test_tcp_connector_certificate_error(loop) -> None: req = ClientRequest("GET", URL("https://127.0.0.1:443"), loop=loop) async def certificate_error(*args, **kwargs): raise ssl.CertificateError conn = aiohttp.TCPConnector(loop=loop) conn._loop.create_connection = certificate_error with pytest.raises(aiohttp.ClientConnectorCertificateError) as ctx: await conn.connect(req, [], ClientTimeout()) assert isinstance(ctx.value, ssl.CertificateError) assert isinstance(ctx.value.certificate_error, ssl.CertificateError) assert isinstance(ctx.value, aiohttp.ClientSSLError) async def test_tcp_connector_multiple_hosts_errors(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) ip1 = "192.168.1.1" ip2 = "192.168.1.2" ip3 = "192.168.1.3" ip4 = "192.168.1.4" ip5 = "192.168.1.5" ips = [ip1, ip2, ip3, ip4, ip5] ips_tried = [] fingerprint = hashlib.sha256(b"foo").digest() req = ClientRequest( "GET", URL("https://mocked.host"), ssl=aiohttp.Fingerprint(fingerprint), loop=loop, ) async def _resolve_host(host, port, traces=None): return [ { "hostname": host, "host": ip, "port": port, "family": socket.AF_INET, "proto": 0, "flags": socket.AI_NUMERICHOST, } for ip in ips ] conn._resolve_host = _resolve_host os_error = certificate_error = ssl_error = fingerprint_error = False connected = False async def create_connection(*args, **kwargs): nonlocal os_error, certificate_error, ssl_error, fingerprint_error nonlocal connected ip = args[1] ips_tried.append(ip) if ip == ip1: os_error = True raise OSError if ip == ip2: certificate_error = True raise ssl.CertificateError if ip == ip3: ssl_error = True raise ssl.SSLError if ip == ip4: fingerprint_error = True tr, pr = mock.Mock(), mock.Mock() def get_extra_info(param): if param == "sslcontext": return True if param == "ssl_object": s = mock.Mock() s.getpeercert.return_value = b"not foo" return s if param == "peername": return ("192.168.1.5", 12345) assert False, param tr.get_extra_info = get_extra_info return tr, pr if ip == ip5: connected = True tr, pr = mock.Mock(), mock.Mock() def get_extra_info(param): if param == "sslcontext": return True if param == "ssl_object": s = mock.Mock() s.getpeercert.return_value = b"foo" return s assert False tr.get_extra_info = get_extra_info return tr, pr assert False conn._loop.create_connection = create_connection established_connection = await conn.connect(req, [], ClientTimeout()) assert ips == ips_tried assert os_error assert certificate_error assert ssl_error assert fingerprint_error assert connected established_connection.close() async def test_tcp_connector_resolve_host(loop) -> None: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True) res = await conn._resolve_host("localhost", 8080) assert res for rec in res: if rec["family"] == socket.AF_INET: assert rec["host"] == "127.0.0.1" assert rec["hostname"] == "localhost" assert rec["port"] == 8080 elif rec["family"] == socket.AF_INET6: assert rec["hostname"] == "localhost" assert rec["port"] == 8080 if platform.system() == "Darwin": assert rec["host"] in ("::1", "fe80::1", "fe80::1%lo0") else: assert rec["host"] == "::1" @pytest.fixture def dns_response(loop): async def coro(): # simulates a network operation await asyncio.sleep(0) return ["127.0.0.1"] return coro async def test_tcp_connector_dns_cache_not_expired(loop, dns_response) -> None: with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() await conn._resolve_host("localhost", 8080) await conn._resolve_host("localhost", 8080) m_resolver().resolve.assert_called_once_with("localhost", 8080, family=0) async def test_tcp_connector_dns_cache_forever(loop, dns_response) -> None: with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() await conn._resolve_host("localhost", 8080) await conn._resolve_host("localhost", 8080) m_resolver().resolve.assert_called_once_with("localhost", 8080, family=0) async def test_tcp_connector_use_dns_cache_disabled(loop, dns_response) -> None: with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=False) m_resolver().resolve.side_effect = [dns_response(), dns_response()] await conn._resolve_host("localhost", 8080) await conn._resolve_host("localhost", 8080) m_resolver().resolve.assert_has_calls( [ mock.call("localhost", 8080, family=0), mock.call("localhost", 8080, family=0), ] ) async def test_tcp_connector_dns_throttle_requests(loop, dns_response) -> None: with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() loop.create_task(conn._resolve_host("localhost", 8080)) loop.create_task(conn._resolve_host("localhost", 8080)) await asyncio.sleep(0) m_resolver().resolve.assert_called_once_with("localhost", 8080, family=0) async def test_tcp_connector_dns_throttle_requests_exception_spread(loop) -> None: with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) e = Exception() m_resolver().resolve.side_effect = e r1 = loop.create_task(conn._resolve_host("localhost", 8080)) r2 = loop.create_task(conn._resolve_host("localhost", 8080)) await asyncio.sleep(0) assert r1.exception() == e assert r2.exception() == e async def test_tcp_connector_dns_throttle_requests_cancelled_when_close( loop, dns_response ): with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() loop.create_task(conn._resolve_host("localhost", 8080)) f = loop.create_task(conn._resolve_host("localhost", 8080)) await asyncio.sleep(0) await conn.close() with pytest.raises(asyncio.CancelledError): await f @pytest.fixture def dns_response_error(loop): async def coro(): # simulates a network operation await asyncio.sleep(0) raise socket.gaierror(-3, "Temporary failure in name resolution") return coro async def test_tcp_connector_cancel_dns_error_captured( loop, dns_response_error ) -> None: exception_handler_called = False def exception_handler(loop, context): nonlocal exception_handler_called exception_handler_called = True loop.set_exception_handler(mock.Mock(side_effect=exception_handler)) with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: req = ClientRequest( method="GET", url=URL("http://temporary-failure:80"), loop=loop ) conn = aiohttp.TCPConnector( use_dns_cache=False, ) m_resolver().resolve.return_value = dns_response_error() f = loop.create_task(conn._create_direct_connection(req, [], ClientTimeout(0))) await asyncio.sleep(0) f.cancel() with pytest.raises(asyncio.CancelledError): await f gc.collect() assert exception_handler_called is False async def test_tcp_connector_dns_tracing(loop, dns_response) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_dns_resolvehost_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_resolvehost_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_cache_hit = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_cache_miss = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_dns_resolvehost_start.append(on_dns_resolvehost_start) trace_config.on_dns_resolvehost_end.append(on_dns_resolvehost_end) trace_config.on_dns_cache_hit.append(on_dns_cache_hit) trace_config.on_dns_cache_miss.append(on_dns_cache_miss) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() await conn._resolve_host("localhost", 8080, traces=traces) on_dns_resolvehost_start.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsResolveHostStartParams("localhost"), ) on_dns_resolvehost_end.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsResolveHostEndParams("localhost") ) on_dns_cache_miss.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsCacheMissParams("localhost") ) assert not on_dns_cache_hit.called await conn._resolve_host("localhost", 8080, traces=traces) on_dns_cache_hit.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsCacheHitParams("localhost") ) async def test_tcp_connector_dns_tracing_cache_disabled(loop, dns_response) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_dns_resolvehost_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_resolvehost_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_dns_resolvehost_start.append(on_dns_resolvehost_start) trace_config.on_dns_resolvehost_end.append(on_dns_resolvehost_end) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=False) m_resolver().resolve.side_effect = [dns_response(), dns_response()] await conn._resolve_host("localhost", 8080, traces=traces) await conn._resolve_host("localhost", 8080, traces=traces) on_dns_resolvehost_start.assert_has_calls( [ mock.call( session, trace_config_ctx, aiohttp.TraceDnsResolveHostStartParams("localhost"), ), mock.call( session, trace_config_ctx, aiohttp.TraceDnsResolveHostStartParams("localhost"), ), ] ) on_dns_resolvehost_end.assert_has_calls( [ mock.call( session, trace_config_ctx, aiohttp.TraceDnsResolveHostEndParams("localhost"), ), mock.call( session, trace_config_ctx, aiohttp.TraceDnsResolveHostEndParams("localhost"), ), ] ) async def test_tcp_connector_dns_tracing_throttle_requests(loop, dns_response) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_dns_cache_hit = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_cache_miss = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_dns_cache_hit.append(on_dns_cache_hit) trace_config.on_dns_cache_miss.append(on_dns_cache_miss) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] with mock.patch("aiohttp.connector.DefaultResolver") as m_resolver: conn = aiohttp.TCPConnector(loop=loop, use_dns_cache=True, ttl_dns_cache=10) m_resolver().resolve.return_value = dns_response() loop.create_task(conn._resolve_host("localhost", 8080, traces=traces)) loop.create_task(conn._resolve_host("localhost", 8080, traces=traces)) await asyncio.sleep(0) on_dns_cache_hit.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsCacheHitParams("localhost") ) on_dns_cache_miss.assert_called_once_with( session, trace_config_ctx, aiohttp.TraceDnsCacheMissParams("localhost") ) async def test_dns_error(loop) -> None: connector = aiohttp.TCPConnector(loop=loop) connector._resolve_host = make_mocked_coro( raise_exception=OSError("dont take it serious") ) req = ClientRequest("GET", URL("http://www.python.org"), loop=loop) with pytest.raises(aiohttp.ClientConnectorError): await connector.connect(req, [], ClientTimeout()) async def test_get_pop_empty_conns(loop) -> None: # see issue #473 conn = aiohttp.BaseConnector(loop=loop) key = ("127.0.0.1", 80, False) conn._conns[key] = [] proto = conn._get(key) assert proto is None assert not conn._conns async def test_release_close_do_not_add_to_pool(loop, key) -> None: # see issue #473 conn = aiohttp.BaseConnector(loop=loop) proto = mock.Mock(should_close=True) conn._acquired.add(proto) conn._release(key, proto) assert not conn._conns async def test_release_close_do_not_delete_existing_connections(key) -> None: proto1 = mock.Mock() conn = aiohttp.BaseConnector() conn._conns[key] = [(proto1, 1)] proto = mock.Mock(should_close=True) conn._acquired.add(proto) conn._release(key, proto) assert conn._conns[key] == [(proto1, 1)] assert proto.close.called await conn.close() async def test_release_not_started(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) proto = mock.Mock(should_close=False) key = 1 conn._acquired.add(proto) conn._release(key, proto) # assert conn._conns == {1: [(proto, 10)]} rec = conn._conns[1] assert rec[0][0] == proto assert rec[0][1] == pytest.approx(loop.time(), abs=0.05) assert not proto.close.called await conn.close() async def test_release_not_opened(loop, key) -> None: conn = aiohttp.BaseConnector(loop=loop) proto = mock.Mock() conn._acquired.add(proto) conn._release(key, proto) assert proto.close.called async def test_connect(loop, key) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://localhost:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) connection = await conn.connect(req, [], ClientTimeout()) assert not conn._create_connection.called assert connection._protocol is proto assert connection.transport is proto.transport assert isinstance(connection, Connection) connection.close() async def test_connect_tracing(loop) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_connection_create_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_connection_create_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_connection_create_start.append(on_connection_create_start) trace_config.on_connection_create_end.append(on_connection_create_end) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop) conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) conn2 = await conn.connect(req, traces, ClientTimeout()) conn2.release() on_connection_create_start.assert_called_with( session, trace_config_ctx, aiohttp.TraceConnectionCreateStartParams() ) on_connection_create_end.assert_called_with( session, trace_config_ctx, aiohttp.TraceConnectionCreateEndParams() ) async def test_close_during_connect(loop) -> None: proto = mock.Mock() proto.is_connected.return_value = True fut = loop.create_future() req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop) conn._create_connection = mock.Mock() conn._create_connection.return_value = fut task = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) await conn.close() fut.set_result(proto) with pytest.raises(aiohttp.ClientConnectionError): await task assert proto.close.called async def test_ctor_cleanup() -> None: loop = mock.Mock() loop.time.return_value = 1.5 conn = aiohttp.BaseConnector( loop=loop, keepalive_timeout=10, enable_cleanup_closed=True ) assert conn._cleanup_handle is None assert conn._cleanup_closed_handle is not None async def test_cleanup(key) -> None: testset = { key: [(mock.Mock(), 10), (mock.Mock(), 300)], } testset[key][0][0].is_connected.return_value = True testset[key][1][0].is_connected.return_value = False loop = mock.Mock() loop.time.return_value = 300 conn = aiohttp.BaseConnector(loop=loop) conn._conns = testset existing_handle = conn._cleanup_handle = mock.Mock() conn._cleanup() assert existing_handle.cancel.called assert conn._conns == {} assert conn._cleanup_handle is None async def test_cleanup_close_ssl_transport(ssl_key) -> None: proto = mock.Mock() transport = proto.transport testset = {ssl_key: [(proto, 10)]} loop = mock.Mock() loop.time.return_value = 300 conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=True) conn._conns = testset existing_handle = conn._cleanup_handle = mock.Mock() conn._cleanup() assert existing_handle.cancel.called assert conn._conns == {} assert conn._cleanup_closed_transports == [transport] async def test_cleanup2() -> None: testset = {1: [(mock.Mock(), 300)]} testset[1][0][0].is_connected.return_value = True loop = mock.Mock() loop.time.return_value = 300 conn = aiohttp.BaseConnector(loop=loop, keepalive_timeout=10) conn._conns = testset conn._cleanup() assert conn._conns == testset assert conn._cleanup_handle is not None loop.call_at.assert_called_with(310, mock.ANY, mock.ANY) await conn.close() async def test_cleanup3(key) -> None: testset = {key: [(mock.Mock(), 290.1), (mock.Mock(), 305.1)]} testset[key][0][0].is_connected.return_value = True loop = mock.Mock() loop.time.return_value = 308.5 conn = aiohttp.BaseConnector(loop=loop, keepalive_timeout=10) conn._conns = testset conn._cleanup() assert conn._conns == {key: [testset[key][1]]} assert conn._cleanup_handle is not None loop.call_at.assert_called_with(319, mock.ANY, mock.ANY) await conn.close() async def test_cleanup_closed(loop, mocker) -> None: if not hasattr(loop, "__dict__"): pytest.skip("can not override loop attributes") mocker.spy(loop, "call_at") conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=True) tr = mock.Mock() conn._cleanup_closed_handle = cleanup_closed_handle = mock.Mock() conn._cleanup_closed_transports = [tr] conn._cleanup_closed() assert tr.abort.called assert not conn._cleanup_closed_transports assert loop.call_at.called assert cleanup_closed_handle.cancel.called async def test_cleanup_closed_disabled(loop, mocker) -> None: conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=False) tr = mock.Mock() conn._cleanup_closed_transports = [tr] conn._cleanup_closed() assert tr.abort.called assert not conn._cleanup_closed_transports async def test_tcp_connector_ctor(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) assert conn._ssl is None assert conn.use_dns_cache assert conn.family == 0 async def test_tcp_connector_ctor_fingerprint_valid(loop) -> None: valid = aiohttp.Fingerprint(hashlib.sha256(b"foo").digest()) conn = aiohttp.TCPConnector(ssl=valid, loop=loop) assert conn._ssl is valid async def test_insecure_fingerprint_md5(loop) -> None: with pytest.raises(ValueError): aiohttp.TCPConnector( ssl=aiohttp.Fingerprint(hashlib.md5(b"foo").digest()), loop=loop ) async def test_insecure_fingerprint_sha1(loop) -> None: with pytest.raises(ValueError): aiohttp.TCPConnector( ssl=aiohttp.Fingerprint(hashlib.sha1(b"foo").digest()), loop=loop ) async def test_tcp_connector_clear_dns_cache(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) hosts = ["a", "b"] conn._cached_hosts.add(("localhost", 123), hosts) conn._cached_hosts.add(("localhost", 124), hosts) conn.clear_dns_cache("localhost", 123) with pytest.raises(KeyError): conn._cached_hosts.next_addrs(("localhost", 123)) assert conn._cached_hosts.next_addrs(("localhost", 124)) == hosts # Remove removed element is OK conn.clear_dns_cache("localhost", 123) with pytest.raises(KeyError): conn._cached_hosts.next_addrs(("localhost", 123)) conn.clear_dns_cache() with pytest.raises(KeyError): conn._cached_hosts.next_addrs(("localhost", 124)) async def test_tcp_connector_clear_dns_cache_bad_args(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) with pytest.raises(ValueError): conn.clear_dns_cache("localhost") async def test_dont_recreate_ssl_context(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) ctx = conn._make_ssl_context(True) assert ctx is conn._make_ssl_context(True) async def test_dont_recreate_ssl_context2(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) ctx = conn._make_ssl_context(False) assert ctx is conn._make_ssl_context(False) async def test___get_ssl_context1(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) req = mock.Mock() req.is_ssl.return_value = False assert conn._get_ssl_context(req) is None async def test___get_ssl_context2(loop) -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) conn = aiohttp.TCPConnector(loop=loop) req = mock.Mock() req.is_ssl.return_value = True req.ssl = ctx assert conn._get_ssl_context(req) is ctx async def test___get_ssl_context3(loop) -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) conn = aiohttp.TCPConnector(loop=loop, ssl=ctx) req = mock.Mock() req.is_ssl.return_value = True req.ssl = None assert conn._get_ssl_context(req) is ctx async def test___get_ssl_context4(loop) -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) conn = aiohttp.TCPConnector(loop=loop, ssl=ctx) req = mock.Mock() req.is_ssl.return_value = True req.ssl = False assert conn._get_ssl_context(req) is conn._make_ssl_context(False) async def test___get_ssl_context5(loop) -> None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) conn = aiohttp.TCPConnector(loop=loop, ssl=ctx) req = mock.Mock() req.is_ssl.return_value = True req.ssl = aiohttp.Fingerprint(hashlib.sha256(b"1").digest()) assert conn._get_ssl_context(req) is conn._make_ssl_context(False) async def test___get_ssl_context6(loop) -> None: conn = aiohttp.TCPConnector(loop=loop) req = mock.Mock() req.is_ssl.return_value = True req.ssl = None assert conn._get_ssl_context(req) is conn._make_ssl_context(True) async def test_close_twice(loop) -> None: proto = mock.Mock() conn = aiohttp.BaseConnector(loop=loop) conn._conns[1] = [(proto, object())] await conn.close() assert not conn._conns assert proto.close.called assert conn.closed conn._conns = "Invalid" # fill with garbage await conn.close() assert conn.closed async def test_close_cancels_cleanup_handle(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) conn._release(1, mock.Mock(should_close=False)) assert conn._cleanup_handle is not None await conn.close() assert conn._cleanup_handle is None async def test_close_abort_closed_transports(loop) -> None: tr = mock.Mock() conn = aiohttp.BaseConnector(loop=loop) conn._cleanup_closed_transports.append(tr) await conn.close() assert not conn._cleanup_closed_transports assert tr.abort.called assert conn.closed async def test_close_cancels_cleanup_closed_handle(loop) -> None: conn = aiohttp.BaseConnector(loop=loop, enable_cleanup_closed=True) assert conn._cleanup_closed_handle is not None await conn.close() assert conn._cleanup_closed_handle is None async def test_ctor_with_default_loop(loop) -> None: conn = aiohttp.BaseConnector() assert loop is conn._loop async def test_connect_with_limit(loop, key) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest( "GET", URL("http://localhost:80"), loop=loop, response_class=mock.Mock() ) conn = aiohttp.BaseConnector(loop=loop, limit=1) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) connection1 = await conn.connect(req, None, ClientTimeout()) assert connection1._protocol == proto assert 1 == len(conn._acquired) assert proto in conn._acquired assert key in conn._acquired_per_host assert proto in conn._acquired_per_host[key] acquired = False async def f(): nonlocal acquired connection2 = await conn.connect(req, None, ClientTimeout()) acquired = True assert 1 == len(conn._acquired) assert 1 == len(conn._acquired_per_host[key]) connection2.release() task = loop.create_task(f()) await asyncio.sleep(0.01) assert not acquired connection1.release() await asyncio.sleep(0) assert acquired await task await conn.close() async def test_connect_queued_operation_tracing(loop, key) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_connection_queued_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_connection_queued_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_connection_queued_start.append(on_connection_queued_start) trace_config.on_connection_queued_end.append(on_connection_queued_end) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest( "GET", URL("http://localhost1:80"), loop=loop, response_class=mock.Mock() ) conn = aiohttp.BaseConnector(loop=loop, limit=1) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) connection1 = await conn.connect(req, traces, ClientTimeout()) async def f(): connection2 = await conn.connect(req, traces, ClientTimeout()) on_connection_queued_start.assert_called_with( session, trace_config_ctx, aiohttp.TraceConnectionQueuedStartParams() ) on_connection_queued_end.assert_called_with( session, trace_config_ctx, aiohttp.TraceConnectionQueuedEndParams() ) connection2.release() task = asyncio.ensure_future(f(), loop=loop) await asyncio.sleep(0.01) connection1.release() await task await conn.close() async def test_connect_reuseconn_tracing(loop, key) -> None: session = mock.Mock() trace_config_ctx = mock.Mock() on_connection_reuseconn = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) trace_config = aiohttp.TraceConfig( trace_config_ctx_factory=mock.Mock(return_value=trace_config_ctx) ) trace_config.on_connection_reuseconn.append(on_connection_reuseconn) trace_config.freeze() traces = [Trace(session, trace_config, trace_config.trace_config_ctx())] proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest( "GET", URL("http://localhost:80"), loop=loop, response_class=mock.Mock() ) conn = aiohttp.BaseConnector(loop=loop, limit=1) conn._conns[key] = [(proto, loop.time())] conn2 = await conn.connect(req, traces, ClientTimeout()) conn2.release() on_connection_reuseconn.assert_called_with( session, trace_config_ctx, aiohttp.TraceConnectionReuseconnParams() ) await conn.close() async def test_connect_with_limit_and_limit_per_host(loop, key) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://localhost:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=1000, limit_per_host=1) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) acquired = False connection1 = await conn.connect(req, None, ClientTimeout()) async def f(): nonlocal acquired connection2 = await conn.connect(req, None, ClientTimeout()) acquired = True assert 1 == len(conn._acquired) assert 1 == len(conn._acquired_per_host[key]) connection2.release() task = loop.create_task(f()) await asyncio.sleep(0.01) assert not acquired connection1.release() await asyncio.sleep(0) assert acquired await task await conn.close() async def test_connect_with_no_limit_and_limit_per_host(loop, key) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://localhost1:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=0, limit_per_host=1) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) acquired = False connection1 = await conn.connect(req, None, ClientTimeout()) async def f(): nonlocal acquired connection2 = await conn.connect(req, None, ClientTimeout()) acquired = True connection2.release() task = loop.create_task(f()) await asyncio.sleep(0.01) assert not acquired connection1.release() await asyncio.sleep(0) assert acquired await task await conn.close() async def test_connect_with_no_limits(loop, key) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://localhost:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=0, limit_per_host=0) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) acquired = False connection1 = await conn.connect(req, None, ClientTimeout()) async def f(): nonlocal acquired connection2 = await conn.connect(req, None, ClientTimeout()) acquired = True assert 1 == len(conn._acquired) assert 1 == len(conn._acquired_per_host[key]) connection2.release() task = loop.create_task(f()) await asyncio.sleep(0.01) assert acquired connection1.release() await task await conn.close() async def test_connect_with_limit_cancelled(loop) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=1) key = ("host", 80, False) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) connection = await conn.connect(req, None, ClientTimeout()) assert connection._protocol == proto assert connection.transport == proto.transport assert 1 == len(conn._acquired) with pytest.raises(asyncio.TimeoutError): # limit exhausted await asyncio.wait_for(conn.connect(req, None, ClientTimeout()), 0.01) connection.close() await conn.close() async def test_connect_with_capacity_release_waiters(loop) -> None: def check_with_exc(err): conn = aiohttp.BaseConnector(limit=1, loop=loop) conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_exception(err) with pytest.raises(Exception): req = mock.Mock() yield from conn.connect(req, None, ClientTimeout()) assert not conn._waiters check_with_exc(OSError(1, "permission error")) check_with_exc(RuntimeError()) check_with_exc(asyncio.TimeoutError()) async def test_connect_with_limit_concurrent(loop) -> None: proto = mock.Mock() proto.should_close = False proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) max_connections = 2 num_connections = 0 conn = aiohttp.BaseConnector(limit=max_connections, loop=loop) # Use a real coroutine for _create_connection; a mock would mask # problems that only happen when the method yields. async def create_connection(req, traces, timeout): nonlocal num_connections num_connections += 1 await asyncio.sleep(0) # Make a new transport mock each time because acquired # transports are stored in a set. Reusing the same object # messes with the count. proto = mock.Mock(should_close=False) proto.is_connected.return_value = True return proto conn._create_connection = create_connection # Simulate something like a crawler. It opens a connection, does # something with it, closes it, then creates tasks that make more # connections and waits for them to finish. The crawler is started # with multiple concurrent requests and stops when it hits a # predefined maximum number of requests. max_requests = 50 num_requests = 0 start_requests = max_connections + 1 async def f(start=True): nonlocal num_requests if num_requests == max_requests: return num_requests += 1 if not start: connection = await conn.connect(req, None, ClientTimeout()) await asyncio.sleep(0) connection.release() await asyncio.sleep(0) tasks = [loop.create_task(f(start=False)) for i in range(start_requests)] await asyncio.wait(tasks) await f() await conn.close() assert max_connections == num_connections async def test_connect_waiters_cleanup(loop) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=1) conn._available_connections = mock.Mock(return_value=0) t = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) assert conn._waiters.keys() t.cancel() await asyncio.sleep(0) assert not conn._waiters.keys() async def test_connect_waiters_cleanup_key_error(loop) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=1) conn._available_connections = mock.Mock(return_value=0) t = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) assert conn._waiters.keys() # we delete the entry explicitly before the # canceled connection grabs the loop again, we # must expect a none failure termination conn._waiters.clear() t.cancel() await asyncio.sleep(0) assert not conn._waiters.keys() == [] async def test_close_with_acquired_connection(loop) -> None: proto = mock.Mock() proto.is_connected.return_value = True req = ClientRequest("GET", URL("http://host:80"), loop=loop) conn = aiohttp.BaseConnector(loop=loop, limit=1) key = ("host", 80, False) conn._conns[key] = [(proto, loop.time())] conn._create_connection = mock.Mock() conn._create_connection.return_value = loop.create_future() conn._create_connection.return_value.set_result(proto) connection = await conn.connect(req, None, ClientTimeout()) assert 1 == len(conn._acquired) await conn.close() assert 0 == len(conn._acquired) assert conn.closed proto.close.assert_called_with() assert not connection.closed connection.close() assert connection.closed async def test_default_force_close(loop) -> None: connector = aiohttp.BaseConnector(loop=loop) assert not connector.force_close async def test_limit_property(loop) -> None: conn = aiohttp.BaseConnector(loop=loop, limit=15) assert 15 == conn.limit await conn.close() async def test_limit_per_host_property(loop) -> None: conn = aiohttp.BaseConnector(loop=loop, limit_per_host=15) assert 15 == conn.limit_per_host await conn.close() async def test_limit_property_default(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) assert conn.limit == 100 await conn.close() async def test_limit_per_host_property_default(loop) -> None: conn = aiohttp.BaseConnector(loop=loop) assert conn.limit_per_host == 0 await conn.close() async def test_force_close_and_explicit_keep_alive(loop) -> None: with pytest.raises(ValueError): aiohttp.BaseConnector(loop=loop, keepalive_timeout=30, force_close=True) conn = aiohttp.BaseConnector(loop=loop, force_close=True, keepalive_timeout=None) assert conn conn = aiohttp.BaseConnector(loop=loop, force_close=True) assert conn async def test_error_on_connection(loop, key) -> None: conn = aiohttp.BaseConnector(limit=1, loop=loop) req = mock.Mock() req.connection_key = key proto = mock.Mock() i = 0 fut = loop.create_future() exc = OSError() async def create_connection(req, traces, timeout): nonlocal i i += 1 if i == 1: await fut raise exc elif i == 2: return proto conn._create_connection = create_connection t1 = loop.create_task(conn.connect(req, None, ClientTimeout())) t2 = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) assert not t1.done() assert not t2.done() assert len(conn._acquired_per_host[key]) == 1 fut.set_result(None) with pytest.raises(OSError): await t1 ret = await t2 assert len(conn._acquired_per_host[key]) == 1 assert ret._key == key assert ret.protocol == proto assert proto in conn._acquired ret.release() async def test_cancelled_waiter(loop) -> None: conn = aiohttp.BaseConnector(limit=1, loop=loop) req = mock.Mock() req.connection_key = "key" proto = mock.Mock() async def create_connection(req, traces=None): await asyncio.sleep(1) return proto conn._create_connection = create_connection conn._acquired.add(proto) conn2 = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) conn2.cancel() with pytest.raises(asyncio.CancelledError): await conn2 async def test_error_on_connection_with_cancelled_waiter(loop, key) -> None: conn = aiohttp.BaseConnector(limit=1, loop=loop) req = mock.Mock() req.connection_key = key proto = mock.Mock() i = 0 fut1 = loop.create_future() fut2 = loop.create_future() exc = OSError() async def create_connection(req, traces, timeout): nonlocal i i += 1 if i == 1: await fut1 raise exc if i == 2: await fut2 elif i == 3: return proto conn._create_connection = create_connection t1 = loop.create_task(conn.connect(req, None, ClientTimeout())) t2 = loop.create_task(conn.connect(req, None, ClientTimeout())) t3 = loop.create_task(conn.connect(req, None, ClientTimeout())) await asyncio.sleep(0) assert not t1.done() assert not t2.done() assert len(conn._acquired_per_host[key]) == 1 fut1.set_result(None) fut2.cancel() with pytest.raises(OSError): await t1 with pytest.raises(asyncio.CancelledError): await t2 ret = await t3 assert len(conn._acquired_per_host[key]) == 1 assert ret._key == key assert ret.protocol == proto assert proto in conn._acquired ret.release() async def test_tcp_connector(aiohttp_client, loop) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) r = await client.get("/") assert r.status == 200 @pytest.mark.skipif(not hasattr(socket, "AF_UNIX"), reason="requires unix socket") async def test_unix_connector_not_found(loop) -> None: connector = aiohttp.UnixConnector("/" + uuid.uuid4().hex, loop=loop) req = ClientRequest("GET", URL("http://www.python.org"), loop=loop) with pytest.raises(aiohttp.ClientConnectorError): await connector.connect(req, None, ClientTimeout()) @pytest.mark.skipif(not hasattr(socket, "AF_UNIX"), reason="requires unix socket") async def test_unix_connector_permission(loop) -> None: loop.create_unix_connection = make_mocked_coro(raise_exception=PermissionError()) connector = aiohttp.UnixConnector("/" + uuid.uuid4().hex, loop=loop) req = ClientRequest("GET", URL("http://www.python.org"), loop=loop) with pytest.raises(aiohttp.ClientConnectorError): await connector.connect(req, None, ClientTimeout()) @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_connector_wrong_loop(selector_loop, pipe_name) -> None: with pytest.raises(RuntimeError): aiohttp.NamedPipeConnector(pipe_name, loop=asyncio.get_event_loop()) @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_connector_not_found(proactor_loop, pipe_name) -> None: connector = aiohttp.NamedPipeConnector(pipe_name, loop=proactor_loop) req = ClientRequest("GET", URL("http://www.python.org"), loop=proactor_loop) with pytest.raises(aiohttp.ClientConnectorError): await connector.connect(req, None, ClientTimeout()) @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_connector_permission(proactor_loop, pipe_name) -> None: proactor_loop.create_pipe_connection = make_mocked_coro( raise_exception=PermissionError() ) connector = aiohttp.NamedPipeConnector(pipe_name, loop=proactor_loop) req = ClientRequest("GET", URL("http://www.python.org"), loop=proactor_loop) with pytest.raises(aiohttp.ClientConnectorError): await connector.connect(req, None, ClientTimeout()) async def test_default_use_dns_cache() -> None: conn = aiohttp.TCPConnector() assert conn.use_dns_cache async def test_resolver_not_called_with_address_is_ip(loop) -> None: resolver = mock.MagicMock() connector = aiohttp.TCPConnector(resolver=resolver) req = ClientRequest( "GET", URL(f"http://127.0.0.1:{unused_port()}"), loop=loop, response_class=mock.Mock(), ) with pytest.raises(OSError): await connector.connect(req, None, ClientTimeout()) resolver.resolve.assert_not_called() async def test_tcp_connector_raise_connector_ssl_error( aiohttp_server, ssl_ctx, ) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) srv = await aiohttp_server(app, ssl=ssl_ctx) port = unused_port() conn = aiohttp.TCPConnector(local_addr=("127.0.0.1", port)) session = aiohttp.ClientSession(connector=conn) url = srv.make_url("/") if PY_37: err = aiohttp.ClientConnectorCertificateError else: err = aiohttp.ClientConnectorSSLError with pytest.raises(err) as ctx: await session.get(url) if PY_37: assert isinstance(ctx.value, aiohttp.ClientConnectorCertificateError) assert isinstance(ctx.value.certificate_error, ssl.SSLError) else: assert isinstance(ctx.value, aiohttp.ClientSSLError) assert isinstance(ctx.value.os_error, ssl.SSLError) await session.close() async def test_tcp_connector_do_not_raise_connector_ssl_error( aiohttp_server, ssl_ctx, client_ssl_ctx, ) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) srv = await aiohttp_server(app, ssl=ssl_ctx) port = unused_port() conn = aiohttp.TCPConnector(local_addr=("127.0.0.1", port)) session = aiohttp.ClientSession(connector=conn) url = srv.make_url("/") r = await session.get(url, ssl=client_ssl_ctx) r.release() first_conn = next(iter(conn._conns.values()))[0][0] try: _sslcontext = first_conn.transport._ssl_protocol._sslcontext except AttributeError: _sslcontext = first_conn.transport._sslcontext assert _sslcontext is client_ssl_ctx r.close() await session.close() await conn.close() async def test_tcp_connector_uses_provided_local_addr(aiohttp_server) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) srv = await aiohttp_server(app) port = unused_port() conn = aiohttp.TCPConnector(local_addr=("127.0.0.1", port)) session = aiohttp.ClientSession(connector=conn) url = srv.make_url("/") r = await session.get(url) r.release() first_conn = next(iter(conn._conns.values()))[0][0] assert first_conn.transport.get_extra_info("sockname") == ("127.0.0.1", port) r.close() await session.close() await conn.close() @pytest.mark.skipif(not hasattr(socket, "AF_UNIX"), reason="requires UNIX sockets") async def test_unix_connector(unix_server, unix_sockname) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) await unix_server(app) url = "http://127.0.0.1/" connector = aiohttp.UnixConnector(unix_sockname) assert unix_sockname == connector.path session = client.ClientSession(connector=connector) r = await session.get(url) assert r.status == 200 r.close() await session.close() @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_connector( proactor_loop, named_pipe_server, pipe_name ) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) await named_pipe_server(app) url = "http://this-does-not-matter.com" connector = aiohttp.NamedPipeConnector(pipe_name) assert pipe_name == connector.path session = client.ClientSession(connector=connector) r = await session.get(url) assert r.status == 200 r.close() await session.close() class TestDNSCacheTable: @pytest.fixture def dns_cache_table(self): return _DNSCacheTable() def test_next_addrs_basic(self, dns_cache_table) -> None: dns_cache_table.add("localhost", ["127.0.0.1"]) dns_cache_table.add("foo", ["127.0.0.2"]) addrs = dns_cache_table.next_addrs("localhost") assert addrs == ["127.0.0.1"] addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.2"] with pytest.raises(KeyError): dns_cache_table.next_addrs("no-such-host") def test_remove(self, dns_cache_table) -> None: dns_cache_table.add("localhost", ["127.0.0.1"]) dns_cache_table.remove("localhost") with pytest.raises(KeyError): dns_cache_table.next_addrs("localhost") def test_clear(self, dns_cache_table) -> None: dns_cache_table.add("localhost", ["127.0.0.1"]) dns_cache_table.clear() with pytest.raises(KeyError): dns_cache_table.next_addrs("localhost") def test_not_expired_ttl_None(self, dns_cache_table) -> None: dns_cache_table.add("localhost", ["127.0.0.1"]) assert not dns_cache_table.expired("localhost") def test_not_expired_ttl(self) -> None: dns_cache_table = _DNSCacheTable(ttl=0.1) dns_cache_table.add("localhost", ["127.0.0.1"]) assert not dns_cache_table.expired("localhost") async def test_expired_ttl(self, loop) -> None: dns_cache_table = _DNSCacheTable(ttl=0.01) dns_cache_table.add("localhost", ["127.0.0.1"]) await asyncio.sleep(0.02) assert dns_cache_table.expired("localhost") def test_next_addrs(self, dns_cache_table) -> None: dns_cache_table.add("foo", ["127.0.0.1", "127.0.0.2", "127.0.0.3"]) # Each calls to next_addrs return the hosts using # a round robin strategy. addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.1", "127.0.0.2", "127.0.0.3"] addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.2", "127.0.0.3", "127.0.0.1"] addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.3", "127.0.0.1", "127.0.0.2"] addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.1", "127.0.0.2", "127.0.0.3"] def test_next_addrs_single(self, dns_cache_table) -> None: dns_cache_table.add("foo", ["127.0.0.1"]) addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.1"] addrs = dns_cache_table.next_addrs("foo") assert addrs == ["127.0.0.1"] async def test_connector_cache_trace_race(): class DummyTracer: async def send_dns_cache_hit(self, *args, **kwargs): connector._cached_hosts.remove(("", 0)) token = object() connector = TCPConnector() connector._cached_hosts.add(("", 0), [token]) traces = [DummyTracer()] assert await connector._resolve_host("", 0, traces) == [token] async def test_connector_throttle_trace_race(loop): key = ("", 0) token = object() class DummyTracer: async def send_dns_cache_hit(self, *args, **kwargs): event = connector._throttle_dns_events.pop(key) event.set() connector._cached_hosts.add(key, [token]) connector = TCPConnector() connector._throttle_dns_events[key] = EventResultOrError(loop) traces = [DummyTracer()] assert await connector._resolve_host("", 0, traces) == [token] async def test_connector_does_not_remove_needed_waiters(loop, key) -> None: proto = create_mocked_conn(loop) proto.is_connected.return_value = True req = ClientRequest("GET", URL("https://localhost:80"), loop=loop) connection_key = req.connection_key connector = aiohttp.BaseConnector() connector._available_connections = mock.Mock(return_value=0) connector._conns[key] = [(proto, loop.time())] connector._create_connection = create_mocked_conn(loop) connector._create_connection.return_value = loop.create_future() connector._create_connection.return_value.set_result(proto) dummy_waiter = loop.create_future() async def await_connection_and_check_waiters(): connection = await connector.connect(req, [], ClientTimeout()) try: assert connection_key in connector._waiters assert dummy_waiter in connector._waiters[connection_key] finally: connection.close() async def allow_connection_and_add_dummy_waiter(): # `asyncio.gather` may execute coroutines not in order. # Skip one event loop run cycle in such a case. if connection_key not in connector._waiters: await asyncio.sleep(0) connector._waiters[connection_key].popleft().set_result(None) del connector._waiters[connection_key] connector._waiters[connection_key].append(dummy_waiter) await asyncio.gather( await_connection_and_check_waiters(), allow_connection_and_add_dummy_waiter(), ) await connector.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_cookiejar.py0000644000175100001710000006243500000000000017266 0ustar00runnerdockerimport asyncio import datetime import itertools import os import tempfile import unittest from http.cookies import BaseCookie, Morsel, SimpleCookie from unittest import mock import pytest from freezegun import freeze_time from yarl import URL from aiohttp import CookieJar, DummyCookieJar @pytest.fixture def cookies_to_send(): return SimpleCookie( "shared-cookie=first; " "domain-cookie=second; Domain=example.com; " "subdomain1-cookie=third; Domain=test1.example.com; " "subdomain2-cookie=fourth; Domain=test2.example.com; " "dotted-domain-cookie=fifth; Domain=.example.com; " "different-domain-cookie=sixth; Domain=different.org; " "secure-cookie=seventh; Domain=secure.com; Secure; " "no-path-cookie=eighth; Domain=pathtest.com; " "path1-cookie=ninth; Domain=pathtest.com; Path=/; " "path2-cookie=tenth; Domain=pathtest.com; Path=/one; " "path3-cookie=eleventh; Domain=pathtest.com; Path=/one/two; " "path4-cookie=twelfth; Domain=pathtest.com; Path=/one/two/; " "expires-cookie=thirteenth; Domain=expirestest.com; Path=/;" " Expires=Tue, 1 Jan 2039 12:00:00 GMT; " "max-age-cookie=fourteenth; Domain=maxagetest.com; Path=/;" " Max-Age=60; " "invalid-max-age-cookie=fifteenth; Domain=invalid-values.com; " " Max-Age=string; " "invalid-expires-cookie=sixteenth; Domain=invalid-values.com; " " Expires=string;" ) @pytest.fixture def cookies_to_send_with_expired(): return SimpleCookie( "shared-cookie=first; " "domain-cookie=second; Domain=example.com; " "subdomain1-cookie=third; Domain=test1.example.com; " "subdomain2-cookie=fourth; Domain=test2.example.com; " "dotted-domain-cookie=fifth; Domain=.example.com; " "different-domain-cookie=sixth; Domain=different.org; " "secure-cookie=seventh; Domain=secure.com; Secure; " "no-path-cookie=eighth; Domain=pathtest.com; " "path1-cookie=ninth; Domain=pathtest.com; Path=/; " "path2-cookie=tenth; Domain=pathtest.com; Path=/one; " "path3-cookie=eleventh; Domain=pathtest.com; Path=/one/two; " "path4-cookie=twelfth; Domain=pathtest.com; Path=/one/two/; " "expires-cookie=thirteenth; Domain=expirestest.com; Path=/;" " Expires=Tue, 1 Jan 1980 12:00:00 GMT; " "max-age-cookie=fourteenth; Domain=maxagetest.com; Path=/;" " Max-Age=60; " "invalid-max-age-cookie=fifteenth; Domain=invalid-values.com; " " Max-Age=string; " "invalid-expires-cookie=sixteenth; Domain=invalid-values.com; " " Expires=string;" ) @pytest.fixture def cookies_to_receive(): return SimpleCookie( "unconstrained-cookie=first; Path=/; " "domain-cookie=second; Domain=example.com; Path=/; " "subdomain1-cookie=third; Domain=test1.example.com; Path=/; " "subdomain2-cookie=fourth; Domain=test2.example.com; Path=/; " "dotted-domain-cookie=fifth; Domain=.example.com; Path=/; " "different-domain-cookie=sixth; Domain=different.org; Path=/; " "no-path-cookie=seventh; Domain=pathtest.com; " "path-cookie=eighth; Domain=pathtest.com; Path=/somepath; " "wrong-path-cookie=ninth; Domain=pathtest.com; Path=somepath;" ) def test_date_parsing() -> None: parse_func = CookieJar._parse_date utc = datetime.timezone.utc assert parse_func("") is None # 70 -> 1970 assert parse_func("Tue, 1 Jan 70 00:00:00 GMT") == datetime.datetime( 1970, 1, 1, tzinfo=utc ) # 10 -> 2010 assert parse_func("Tue, 1 Jan 10 00:00:00 GMT") == datetime.datetime( 2010, 1, 1, tzinfo=utc ) # No day of week string assert parse_func("1 Jan 1970 00:00:00 GMT") == datetime.datetime( 1970, 1, 1, tzinfo=utc ) # No timezone string assert parse_func("Tue, 1 Jan 1970 00:00:00") == datetime.datetime( 1970, 1, 1, tzinfo=utc ) # No year assert parse_func("Tue, 1 Jan 00:00:00 GMT") is None # No month assert parse_func("Tue, 1 1970 00:00:00 GMT") is None # No day of month assert parse_func("Tue, Jan 1970 00:00:00 GMT") is None # No time assert parse_func("Tue, 1 Jan 1970 GMT") is None # Invalid day of month assert parse_func("Tue, 0 Jan 1970 00:00:00 GMT") is None # Invalid year assert parse_func("Tue, 1 Jan 1500 00:00:00 GMT") is None # Invalid time assert parse_func("Tue, 1 Jan 1970 77:88:99 GMT") is None def test_domain_matching() -> None: test_func = CookieJar._is_domain_match assert test_func("test.com", "test.com") assert test_func("test.com", "sub.test.com") assert not test_func("test.com", "") assert not test_func("test.com", "test.org") assert not test_func("diff-test.com", "test.com") assert not test_func("test.com", "diff-test.com") assert not test_func("test.com", "127.0.0.1") def test_path_matching() -> None: test_func = CookieJar._is_path_match assert test_func("/", "") assert test_func("", "/") assert test_func("/file", "") assert test_func("/folder/file", "") assert test_func("/", "/") assert test_func("/file", "/") assert test_func("/file", "/file") assert test_func("/folder/", "/folder/") assert test_func("/folder/", "/") assert test_func("/folder/file", "/") assert not test_func("/", "/file") assert not test_func("/", "/folder/") assert not test_func("/file", "/folder/file") assert not test_func("/folder/", "/folder/file") assert not test_func("/different-file", "/file") assert not test_func("/different-folder/", "/folder/") async def test_constructor(loop, cookies_to_send, cookies_to_receive) -> None: jar = CookieJar(loop=loop) jar.update_cookies(cookies_to_send) jar_cookies = SimpleCookie() for cookie in jar: dict.__setitem__(jar_cookies, cookie.key, cookie) expected_cookies = cookies_to_send assert jar_cookies == expected_cookies assert jar._loop is loop async def test_constructor_with_expired( loop, cookies_to_send_with_expired, cookies_to_receive ) -> None: jar = CookieJar() jar.update_cookies(cookies_to_send_with_expired) jar_cookies = SimpleCookie() for cookie in jar: dict.__setitem__(jar_cookies, cookie.key, cookie) expected_cookies = cookies_to_send_with_expired assert jar_cookies != expected_cookies assert jar._loop is loop async def test_save_load(loop, cookies_to_send, cookies_to_receive) -> None: file_path = tempfile.mkdtemp() + "/aiohttp.test.cookie" # export cookie jar jar_save = CookieJar(loop=loop) jar_save.update_cookies(cookies_to_receive) jar_save.save(file_path=file_path) jar_load = CookieJar(loop=loop) jar_load.load(file_path=file_path) jar_test = SimpleCookie() for cookie in jar_load: jar_test[cookie.key] = cookie os.unlink(file_path) assert jar_test == cookies_to_receive async def test_update_cookie_with_unicode_domain(loop) -> None: cookies = ( "idna-domain-first=first; Domain=xn--9caa.com; Path=/;", "idna-domain-second=second; Domain=xn--9caa.com; Path=/;", ) jar = CookieJar(loop=loop) jar.update_cookies(SimpleCookie(cookies[0]), URL("http://éé.com/")) jar.update_cookies(SimpleCookie(cookies[1]), URL("http://xn--9caa.com/")) jar_test = SimpleCookie() for cookie in jar: jar_test[cookie.key] = cookie assert jar_test == SimpleCookie(" ".join(cookies)) async def test_filter_cookie_with_unicode_domain(loop) -> None: jar = CookieJar() jar.update_cookies( SimpleCookie("idna-domain-first=first; Domain=xn--9caa.com; Path=/; ") ) assert len(jar.filter_cookies(URL("http://éé.com"))) == 1 assert len(jar.filter_cookies(URL("http://xn--9caa.com"))) == 1 async def test_domain_filter_ip_cookie_send(loop) -> None: jar = CookieJar(loop=loop) cookies = SimpleCookie( "shared-cookie=first; " "domain-cookie=second; Domain=example.com; " "subdomain1-cookie=third; Domain=test1.example.com; " "subdomain2-cookie=fourth; Domain=test2.example.com; " "dotted-domain-cookie=fifth; Domain=.example.com; " "different-domain-cookie=sixth; Domain=different.org; " "secure-cookie=seventh; Domain=secure.com; Secure; " "no-path-cookie=eighth; Domain=pathtest.com; " "path1-cookie=ninth; Domain=pathtest.com; Path=/; " "path2-cookie=tenth; Domain=pathtest.com; Path=/one; " "path3-cookie=eleventh; Domain=pathtest.com; Path=/one/two; " "path4-cookie=twelfth; Domain=pathtest.com; Path=/one/two/; " "expires-cookie=thirteenth; Domain=expirestest.com; Path=/;" " Expires=Tue, 1 Jan 1980 12:00:00 GMT; " "max-age-cookie=fourteenth; Domain=maxagetest.com; Path=/;" " Max-Age=60; " "invalid-max-age-cookie=fifteenth; Domain=invalid-values.com; " " Max-Age=string; " "invalid-expires-cookie=sixteenth; Domain=invalid-values.com; " " Expires=string;" ) jar.update_cookies(cookies) cookies_sent = jar.filter_cookies(URL("http://1.2.3.4/")).output(header="Cookie:") assert cookies_sent == "Cookie: shared-cookie=first" async def test_domain_filter_ip_cookie_receive(cookies_to_receive) -> None: jar = CookieJar() jar.update_cookies(cookies_to_receive, URL("http://1.2.3.4/")) assert len(jar) == 0 @pytest.mark.parametrize( ("cookies", "expected", "quote_bool"), [ ( "shared-cookie=first; ip-cookie=second; Domain=127.0.0.1;", "Cookie: ip-cookie=second\r\nCookie: shared-cookie=first", True, ), ('ip-cookie="second"; Domain=127.0.0.1;', 'Cookie: ip-cookie="second"', True), ("custom-cookie=value/one;", 'Cookie: custom-cookie="value/one"', True), ("custom-cookie=value1;", "Cookie: custom-cookie=value1", True), ("custom-cookie=value/one;", "Cookie: custom-cookie=value/one", False), ], ids=( "IP domain preserved", "no shared cookie", "quoted cookie with special char", "quoted cookie w/o special char", "unquoted cookie with special char", ), ) async def test_quotes_correctly_based_on_input( loop, cookies, expected, quote_bool ) -> None: jar = CookieJar(unsafe=True, quote_cookie=quote_bool) jar.update_cookies(SimpleCookie(cookies)) cookies_sent = jar.filter_cookies(URL("http://127.0.0.1/")).output(header="Cookie:") assert cookies_sent == expected async def test_ignore_domain_ending_with_dot(loop) -> None: jar = CookieJar(loop=loop, unsafe=True) jar.update_cookies( SimpleCookie("cookie=val; Domain=example.com.;"), URL("http://www.example.com") ) cookies_sent = jar.filter_cookies(URL("http://www.example.com/")) assert cookies_sent.output(header="Cookie:") == "Cookie: cookie=val" cookies_sent = jar.filter_cookies(URL("http://example.com/")) assert cookies_sent.output(header="Cookie:") == "" class TestCookieJarBase(unittest.TestCase): def setUp(self): self.loop = asyncio.new_event_loop() asyncio.set_event_loop(None) # N.B. those need to be overridden in child test cases async def make_jar(): return CookieJar() self.jar = self.loop.run_until_complete(make_jar()) def tearDown(self): self.loop.close() def request_reply_with_same_url(self, url): self.jar.update_cookies(self.cookies_to_send) cookies_sent = self.jar.filter_cookies(URL(url)) self.jar.clear() self.jar.update_cookies(self.cookies_to_receive, URL(url)) cookies_received = SimpleCookie() for cookie in self.jar: dict.__setitem__(cookies_received, cookie.key, cookie) self.jar.clear() return cookies_sent, cookies_received class TestCookieJarSafe(TestCookieJarBase): def setUp(self): super().setUp() self.cookies_to_send = SimpleCookie( "shared-cookie=first; " "domain-cookie=second; Domain=example.com; " "subdomain1-cookie=third; Domain=test1.example.com; " "subdomain2-cookie=fourth; Domain=test2.example.com; " "dotted-domain-cookie=fifth; Domain=.example.com; " "different-domain-cookie=sixth; Domain=different.org; " "secure-cookie=seventh; Domain=secure.com; Secure; " "no-path-cookie=eighth; Domain=pathtest.com; " "path1-cookie=ninth; Domain=pathtest.com; Path=/; " "path2-cookie=tenth; Domain=pathtest.com; Path=/one; " "path3-cookie=eleventh; Domain=pathtest.com; Path=/one/two; " "path4-cookie=twelfth; Domain=pathtest.com; Path=/one/two/; " "expires-cookie=thirteenth; Domain=expirestest.com; Path=/;" " Expires=Tue, 1 Jan 1980 12:00:00 GMT; " "max-age-cookie=fourteenth; Domain=maxagetest.com; Path=/;" " Max-Age=60; " "invalid-max-age-cookie=fifteenth; Domain=invalid-values.com; " " Max-Age=string; " "invalid-expires-cookie=sixteenth; Domain=invalid-values.com; " " Expires=string;" ) self.cookies_to_receive = SimpleCookie( "unconstrained-cookie=first; Path=/; " "domain-cookie=second; Domain=example.com; Path=/; " "subdomain1-cookie=third; Domain=test1.example.com; Path=/; " "subdomain2-cookie=fourth; Domain=test2.example.com; Path=/; " "dotted-domain-cookie=fifth; Domain=.example.com; Path=/; " "different-domain-cookie=sixth; Domain=different.org; Path=/; " "no-path-cookie=seventh; Domain=pathtest.com; " "path-cookie=eighth; Domain=pathtest.com; Path=/somepath; " "wrong-path-cookie=ninth; Domain=pathtest.com; Path=somepath;" ) async def make_jar(): return CookieJar() self.jar = self.loop.run_until_complete(make_jar()) def timed_request(self, url, update_time, send_time): if isinstance(update_time, int): update_time = datetime.timedelta(seconds=update_time) elif isinstance(update_time, float): update_time = datetime.datetime.fromtimestamp(update_time) if isinstance(send_time, int): send_time = datetime.timedelta(seconds=send_time) elif isinstance(send_time, float): send_time = datetime.datetime.fromtimestamp(send_time) with freeze_time(update_time): self.jar.update_cookies(self.cookies_to_send) with freeze_time(send_time): cookies_sent = self.jar.filter_cookies(URL(url)) self.jar.clear() return cookies_sent def test_domain_filter_same_host(self) -> None: cookies_sent, cookies_received = self.request_reply_with_same_url( "http://example.com/" ) self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "domain-cookie", "dotted-domain-cookie"}, ) self.assertEqual( set(cookies_received.keys()), {"unconstrained-cookie", "domain-cookie", "dotted-domain-cookie"}, ) def test_domain_filter_same_host_and_subdomain(self) -> None: cookies_sent, cookies_received = self.request_reply_with_same_url( "http://test1.example.com/" ) self.assertEqual( set(cookies_sent.keys()), { "shared-cookie", "domain-cookie", "subdomain1-cookie", "dotted-domain-cookie", }, ) self.assertEqual( set(cookies_received.keys()), { "unconstrained-cookie", "domain-cookie", "subdomain1-cookie", "dotted-domain-cookie", }, ) def test_domain_filter_same_host_diff_subdomain(self) -> None: cookies_sent, cookies_received = self.request_reply_with_same_url( "http://different.example.com/" ) self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "domain-cookie", "dotted-domain-cookie"}, ) self.assertEqual( set(cookies_received.keys()), {"unconstrained-cookie", "domain-cookie", "dotted-domain-cookie"}, ) def test_domain_filter_diff_host(self) -> None: cookies_sent, cookies_received = self.request_reply_with_same_url( "http://different.org/" ) self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "different-domain-cookie"} ) self.assertEqual( set(cookies_received.keys()), {"unconstrained-cookie", "different-domain-cookie"}, ) def test_domain_filter_host_only(self) -> None: self.jar.update_cookies(self.cookies_to_receive, URL("http://example.com/")) cookies_sent = self.jar.filter_cookies(URL("http://example.com/")) self.assertIn("unconstrained-cookie", set(cookies_sent.keys())) cookies_sent = self.jar.filter_cookies(URL("http://different.org/")) self.assertNotIn("unconstrained-cookie", set(cookies_sent.keys())) def test_secure_filter(self) -> None: cookies_sent, _ = self.request_reply_with_same_url("http://secure.com/") self.assertEqual(set(cookies_sent.keys()), {"shared-cookie"}) cookies_sent, _ = self.request_reply_with_same_url("https://secure.com/") self.assertEqual(set(cookies_sent.keys()), {"shared-cookie", "secure-cookie"}) def test_path_filter_root(self) -> None: cookies_sent, _ = self.request_reply_with_same_url("http://pathtest.com/") self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "no-path-cookie", "path1-cookie"}, ) def test_path_filter_folder(self) -> None: cookies_sent, _ = self.request_reply_with_same_url("http://pathtest.com/one/") self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "no-path-cookie", "path1-cookie", "path2-cookie"}, ) def test_path_filter_file(self) -> None: cookies_sent, _ = self.request_reply_with_same_url( "http://pathtest.com/one/two" ) self.assertEqual( set(cookies_sent.keys()), { "shared-cookie", "no-path-cookie", "path1-cookie", "path2-cookie", "path3-cookie", }, ) def test_path_filter_subfolder(self) -> None: cookies_sent, _ = self.request_reply_with_same_url( "http://pathtest.com/one/two/" ) self.assertEqual( set(cookies_sent.keys()), { "shared-cookie", "no-path-cookie", "path1-cookie", "path2-cookie", "path3-cookie", "path4-cookie", }, ) def test_path_filter_subsubfolder(self) -> None: cookies_sent, _ = self.request_reply_with_same_url( "http://pathtest.com/one/two/three/" ) self.assertEqual( set(cookies_sent.keys()), { "shared-cookie", "no-path-cookie", "path1-cookie", "path2-cookie", "path3-cookie", "path4-cookie", }, ) def test_path_filter_different_folder(self) -> None: cookies_sent, _ = self.request_reply_with_same_url( "http://pathtest.com/hundred/" ) self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "no-path-cookie", "path1-cookie"}, ) def test_path_value(self) -> None: _, cookies_received = self.request_reply_with_same_url("http://pathtest.com/") self.assertEqual( set(cookies_received.keys()), { "unconstrained-cookie", "no-path-cookie", "path-cookie", "wrong-path-cookie", }, ) self.assertEqual(cookies_received["no-path-cookie"]["path"], "/") self.assertEqual(cookies_received["path-cookie"]["path"], "/somepath") self.assertEqual(cookies_received["wrong-path-cookie"]["path"], "/") def test_expires(self) -> None: ts_before = datetime.datetime( 1975, 1, 1, tzinfo=datetime.timezone.utc ).timestamp() ts_after = datetime.datetime( 2030, 1, 1, tzinfo=datetime.timezone.utc ).timestamp() cookies_sent = self.timed_request( "http://expirestest.com/", ts_before, ts_before ) self.assertEqual(set(cookies_sent.keys()), {"shared-cookie", "expires-cookie"}) cookies_sent = self.timed_request( "http://expirestest.com/", ts_before, ts_after ) self.assertEqual(set(cookies_sent.keys()), {"shared-cookie"}) def test_max_age(self) -> None: cookies_sent = self.timed_request("http://maxagetest.com/", 1000, 1000) self.assertEqual(set(cookies_sent.keys()), {"shared-cookie", "max-age-cookie"}) cookies_sent = self.timed_request("http://maxagetest.com/", 1000, 2000) self.assertEqual(set(cookies_sent.keys()), {"shared-cookie"}) def test_invalid_values(self) -> None: cookies_sent, cookies_received = self.request_reply_with_same_url( "http://invalid-values.com/" ) self.assertEqual( set(cookies_sent.keys()), {"shared-cookie", "invalid-max-age-cookie", "invalid-expires-cookie"}, ) cookie = cookies_sent["invalid-max-age-cookie"] self.assertEqual(cookie["max-age"], "") cookie = cookies_sent["invalid-expires-cookie"] self.assertEqual(cookie["expires"], "") def test_cookie_not_expired_when_added_after_removal(self) -> None: # Test case for https://github.com/aio-libs/aiohttp/issues/2084 timestamps = [ 533588.993, 533588.993, 533588.993, 533588.993, 533589.093, 533589.093, ] loop = mock.Mock() loop.time.side_effect = itertools.chain( timestamps, itertools.cycle([timestamps[-1]]) ) async def make_jar(): return CookieJar(unsafe=True) jar = self.loop.run_until_complete(make_jar()) # Remove `foo` cookie. jar.update_cookies(SimpleCookie('foo=""; Max-Age=0')) # Set `foo` cookie to `bar`. jar.update_cookies(SimpleCookie('foo="bar"')) # Assert that there is a cookie. assert len(jar) == 1 async def test_dummy_cookie_jar() -> None: cookie = SimpleCookie("foo=bar; Domain=example.com;") dummy_jar = DummyCookieJar() assert len(dummy_jar) == 0 dummy_jar.update_cookies(cookie) assert len(dummy_jar) == 0 with pytest.raises(StopIteration): next(iter(dummy_jar)) assert not dummy_jar.filter_cookies(URL("http://example.com/")) dummy_jar.clear() async def test_loose_cookies_types() -> None: jar = CookieJar() accepted_types = [ [("str", BaseCookie())], [("str", Morsel())], [ ("str", "str"), ], {"str": BaseCookie()}, {"str": Morsel()}, {"str": "str"}, SimpleCookie(), ] for loose_cookies_type in accepted_types: jar.update_cookies(cookies=loose_cookies_type) async def test_cookie_jar_clear_all(): sut = CookieJar() cookie = SimpleCookie() cookie["foo"] = "bar" sut.update_cookies(cookie) sut.clear() assert len(sut) == 0 async def test_cookie_jar_clear_expired(): sut = CookieJar() cookie = SimpleCookie() cookie["foo"] = "bar" cookie["foo"]["expires"] = "Tue, 1 Jan 1990 12:00:00 GMT" with freeze_time("1980-01-01"): sut.update_cookies(cookie) sut.clear(lambda x: False) with freeze_time("1980-01-01"): assert len(sut) == 0 async def test_cookie_jar_clear_domain(): sut = CookieJar() cookie = SimpleCookie() cookie["foo"] = "bar" cookie["domain_cookie"] = "value" cookie["domain_cookie"]["domain"] = "example.com" cookie["subdomain_cookie"] = "value" cookie["subdomain_cookie"]["domain"] = "test.example.com" sut.update_cookies(cookie) sut.clear_domain("example.com") iterator = iter(sut) morsel = next(iterator) assert morsel.key == "foo" assert morsel.value == "bar" with pytest.raises(StopIteration): next(iterator) @pytest.mark.parametrize( "url", [ "http://127.0.0.1/index.html", URL("http://127.0.0.1/index.html"), ["http://127.0.0.1/index.html"], [URL("http://127.0.0.1/index.html")], ], ) async def test_treat_as_secure_origin_init(url) -> None: jar = CookieJar(unsafe=True, treat_as_secure_origin=url) assert jar._treat_as_secure_origin == [URL("http://127.0.0.1")] async def test_treat_as_secure_origin() -> None: endpoint = URL("http://127.0.0.1/") jar = CookieJar(unsafe=True, treat_as_secure_origin=[endpoint]) secure_cookie = SimpleCookie( "cookie-key=cookie-value; HttpOnly; Path=/; Secure", ) jar.update_cookies( secure_cookie, endpoint, ) assert len(jar) == 1 filtered_cookies = jar.filter_cookies(request_url=endpoint) assert len(filtered_cookies) == 1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_flowcontrol_streams.py0000644000175100001710000001012700000000000021415 0ustar00runnerdockerfrom unittest import mock import pytest from aiohttp import streams @pytest.fixture def protocol(): return mock.Mock(_reading_paused=False) @pytest.fixture def stream(loop, protocol): out = streams.StreamReader(protocol, limit=1, loop=loop) out._allow_pause = True return out @pytest.fixture def buffer(loop, protocol): out = streams.FlowControlDataQueue(protocol, limit=1, loop=loop) out._allow_pause = True return out class TestFlowControlStreamReader: async def test_read(self, stream) -> None: stream.feed_data(b"da", 2) res = await stream.read(1) assert res == b"d" assert not stream._protocol.resume_reading.called async def test_read_resume_paused(self, stream) -> None: stream.feed_data(b"test", 4) stream._protocol._reading_paused = True res = await stream.read(1) assert res == b"t" assert stream._protocol.pause_reading.called async def test_readline(self, stream) -> None: stream.feed_data(b"d\n", 5) res = await stream.readline() assert res == b"d\n" assert not stream._protocol.resume_reading.called async def test_readline_resume_paused(self, stream) -> None: stream._protocol._reading_paused = True stream.feed_data(b"d\n", 5) res = await stream.readline() assert res == b"d\n" assert stream._protocol.resume_reading.called async def test_readany(self, stream) -> None: stream.feed_data(b"data", 4) res = await stream.readany() assert res == b"data" assert not stream._protocol.resume_reading.called async def test_readany_resume_paused(self, stream) -> None: stream._protocol._reading_paused = True stream.feed_data(b"data", 4) res = await stream.readany() assert res == b"data" assert stream._protocol.resume_reading.called async def test_readchunk(self, stream) -> None: stream.feed_data(b"data", 4) res, end_of_http_chunk = await stream.readchunk() assert res == b"data" assert not end_of_http_chunk assert not stream._protocol.resume_reading.called async def test_readchunk_resume_paused(self, stream) -> None: stream._protocol._reading_paused = True stream.feed_data(b"data", 4) res, end_of_http_chunk = await stream.readchunk() assert res == b"data" assert not end_of_http_chunk assert stream._protocol.resume_reading.called async def test_readexactly(self, stream) -> None: stream.feed_data(b"data", 4) res = await stream.readexactly(3) assert res == b"dat" assert not stream._protocol.resume_reading.called async def test_feed_data(self, stream) -> None: stream._protocol._reading_paused = False stream.feed_data(b"datadata", 8) assert stream._protocol.pause_reading.called async def test_read_nowait(self, stream) -> None: stream._protocol._reading_paused = True stream.feed_data(b"data1", 5) stream.feed_data(b"data2", 5) stream.feed_data(b"data3", 5) res = await stream.read(5) assert res == b"data1" assert stream._protocol.resume_reading.call_count == 0 res = stream.read_nowait(5) assert res == b"data2" assert stream._protocol.resume_reading.call_count == 0 res = stream.read_nowait(5) assert res == b"data3" assert stream._protocol.resume_reading.call_count == 1 stream._protocol._reading_paused = False res = stream.read_nowait(5) assert res == b"" assert stream._protocol.resume_reading.call_count == 1 class TestFlowControlDataQueue: def test_feed_pause(self, buffer) -> None: buffer._protocol._reading_paused = False buffer.feed_data(object(), 100) assert buffer._protocol.pause_reading.called async def test_resume_on_read(self, buffer) -> None: buffer.feed_data(object(), 100) buffer._protocol._reading_paused = True await buffer.read() assert buffer._protocol.resume_reading.called ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_formdata.py0000644000175100001710000000537700000000000017117 0ustar00runnerdockerfrom unittest import mock import pytest from aiohttp import FormData, web @pytest.fixture def buf(): return bytearray() @pytest.fixture def writer(buf): writer = mock.Mock() async def write(chunk): buf.extend(chunk) writer.write.side_effect = write return writer def test_formdata_multipart(buf, writer) -> None: form = FormData() assert not form.is_multipart form.add_field("test", b"test", filename="test.txt") assert form.is_multipart def test_invalid_formdata_payload() -> None: form = FormData() form.add_field("test", object(), filename="test.txt") with pytest.raises(TypeError): form() def test_invalid_formdata_params() -> None: with pytest.raises(TypeError): FormData("asdasf") def test_invalid_formdata_params2() -> None: with pytest.raises(TypeError): FormData("as") # 2-char str is not allowed def test_invalid_formdata_content_type() -> None: form = FormData() invalid_vals = [0, 0.1, {}, [], b"foo"] for invalid_val in invalid_vals: with pytest.raises(TypeError): form.add_field("foo", "bar", content_type=invalid_val) def test_invalid_formdata_filename() -> None: form = FormData() invalid_vals = [0, 0.1, {}, [], b"foo"] for invalid_val in invalid_vals: with pytest.raises(TypeError): form.add_field("foo", "bar", filename=invalid_val) def test_invalid_formdata_content_transfer_encoding() -> None: form = FormData() invalid_vals = [0, 0.1, {}, [], b"foo"] for invalid_val in invalid_vals: with pytest.raises(TypeError): form.add_field("foo", "bar", content_transfer_encoding=invalid_val) async def test_formdata_field_name_is_quoted(buf, writer) -> None: form = FormData(charset="ascii") form.add_field("email 1", "xxx@x.co", content_type="multipart/form-data") payload = form() await payload.write(writer) assert b'name="email\\ 1"' in buf async def test_formdata_field_name_is_not_quoted(buf, writer) -> None: form = FormData(quote_fields=False, charset="ascii") form.add_field("email 1", "xxx@x.co", content_type="multipart/form-data") payload = form() await payload.write(writer) assert b'name="email 1"' in buf async def test_mark_formdata_as_processed(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.add_routes([web.post("/", handler)]) client = await aiohttp_client(app) data = FormData() data.add_field("test", "test_value", content_type="application/json") resp = await client.post("/", data=data) assert len(data._writer._parts) == 1 with pytest.raises(RuntimeError): await client.post("/", data=data) resp.release() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_helpers.py0000644000175100001710000005415300000000000016760 0ustar00runnerdockerimport asyncio import base64 import datetime import gc import platform import tempfile from math import isclose, modf from unittest import mock from urllib.request import getproxies_environment import pytest from multidict import MultiDict from yarl import URL from aiohttp import helpers from aiohttp.helpers import parse_http_date IS_PYPY = platform.python_implementation() == "PyPy" # ------------------- parse_mimetype ---------------------------------- @pytest.mark.parametrize( "mimetype, expected", [ ("", helpers.MimeType("", "", "", MultiDict())), ("*", helpers.MimeType("*", "*", "", MultiDict())), ("application/json", helpers.MimeType("application", "json", "", MultiDict())), ( "application/json; charset=utf-8", helpers.MimeType( "application", "json", "", MultiDict({"charset": "utf-8"}) ), ), ( """application/json; charset=utf-8;""", helpers.MimeType( "application", "json", "", MultiDict({"charset": "utf-8"}) ), ), ( 'ApPlIcAtIoN/JSON;ChaRseT="UTF-8"', helpers.MimeType( "application", "json", "", MultiDict({"charset": "UTF-8"}) ), ), ( "application/rss+xml", helpers.MimeType("application", "rss", "xml", MultiDict()), ), ( "text/plain;base64", helpers.MimeType("text", "plain", "", MultiDict({"base64": ""})), ), ], ) def test_parse_mimetype(mimetype, expected) -> None: result = helpers.parse_mimetype(mimetype) assert isinstance(result, helpers.MimeType) assert result == expected # ------------------- guess_filename ---------------------------------- def test_guess_filename_with_tempfile() -> None: with tempfile.TemporaryFile() as fp: assert helpers.guess_filename(fp, "no-throw") is not None # ------------------- BasicAuth ----------------------------------- def test_basic_auth1() -> None: # missing password here with pytest.raises(ValueError): helpers.BasicAuth(None) def test_basic_auth2() -> None: with pytest.raises(ValueError): helpers.BasicAuth("nkim", None) def test_basic_with_auth_colon_in_login() -> None: with pytest.raises(ValueError): helpers.BasicAuth("nkim:1", "pwd") def test_basic_auth3() -> None: auth = helpers.BasicAuth("nkim") assert auth.login == "nkim" assert auth.password == "" def test_basic_auth4() -> None: auth = helpers.BasicAuth("nkim", "pwd") assert auth.login == "nkim" assert auth.password == "pwd" assert auth.encode() == "Basic bmtpbTpwd2Q=" @pytest.mark.parametrize( "header", ( "Basic bmtpbTpwd2Q=", "basic bmtpbTpwd2Q=", ), ) def test_basic_auth_decode(header) -> None: auth = helpers.BasicAuth.decode(header) assert auth.login == "nkim" assert auth.password == "pwd" def test_basic_auth_invalid() -> None: with pytest.raises(ValueError): helpers.BasicAuth.decode("bmtpbTpwd2Q=") def test_basic_auth_decode_not_basic() -> None: with pytest.raises(ValueError): helpers.BasicAuth.decode("Complex bmtpbTpwd2Q=") def test_basic_auth_decode_bad_base64() -> None: with pytest.raises(ValueError): helpers.BasicAuth.decode("Basic bmtpbTpwd2Q") @pytest.mark.parametrize("header", ("Basic ???", "Basic ")) def test_basic_auth_decode_illegal_chars_base64(header) -> None: with pytest.raises(ValueError, match="Invalid base64 encoding."): helpers.BasicAuth.decode(header) def test_basic_auth_decode_invalid_credentials() -> None: with pytest.raises(ValueError, match="Invalid credentials."): header = "Basic {}".format(base64.b64encode(b"username").decode()) helpers.BasicAuth.decode(header) @pytest.mark.parametrize( "credentials, expected_auth", ( (":", helpers.BasicAuth(login="", password="", encoding="latin1")), ( "username:", helpers.BasicAuth(login="username", password="", encoding="latin1"), ), ( ":password", helpers.BasicAuth(login="", password="password", encoding="latin1"), ), ( "username:password", helpers.BasicAuth(login="username", password="password", encoding="latin1"), ), ), ) def test_basic_auth_decode_blank_username(credentials, expected_auth) -> None: header = f"Basic {base64.b64encode(credentials.encode()).decode()}" assert helpers.BasicAuth.decode(header) == expected_auth def test_basic_auth_from_url() -> None: url = URL("http://user:pass@example.com") auth = helpers.BasicAuth.from_url(url) assert auth.login == "user" assert auth.password == "pass" def test_basic_auth_from_not_url() -> None: with pytest.raises(TypeError): helpers.BasicAuth.from_url("http://user:pass@example.com") class ReifyMixin: reify = NotImplemented def test_reify(self) -> None: class A: def __init__(self): self._cache = {} @self.reify def prop(self): return 1 a = A() assert 1 == a.prop def test_reify_class(self) -> None: class A: def __init__(self): self._cache = {} @self.reify def prop(self): """Docstring.""" return 1 assert isinstance(A.prop, self.reify) assert "Docstring." == A.prop.__doc__ def test_reify_assignment(self) -> None: class A: def __init__(self): self._cache = {} @self.reify def prop(self): return 1 a = A() with pytest.raises(AttributeError): a.prop = 123 class TestPyReify(ReifyMixin): reify = helpers.reify_py if not helpers.NO_EXTENSIONS and not IS_PYPY and hasattr(helpers, "reify_c"): class TestCReify(ReifyMixin): reify = helpers.reify_c # ----------------------------------- is_ip_address() ---------------------- def test_is_ip_address() -> None: assert helpers.is_ip_address("127.0.0.1") assert helpers.is_ip_address("::1") assert helpers.is_ip_address("FE80:0000:0000:0000:0202:B3FF:FE1E:8329") # Hostnames assert not helpers.is_ip_address("localhost") assert not helpers.is_ip_address("www.example.com") # Out of range assert not helpers.is_ip_address("999.999.999.999") # Contain a port assert not helpers.is_ip_address("127.0.0.1:80") assert not helpers.is_ip_address("[2001:db8:0:1]:80") # Too many "::" assert not helpers.is_ip_address("1200::AB00:1234::2552:7777:1313") def test_is_ip_address_bytes() -> None: assert helpers.is_ip_address(b"127.0.0.1") assert helpers.is_ip_address(b"::1") assert helpers.is_ip_address(b"FE80:0000:0000:0000:0202:B3FF:FE1E:8329") # Hostnames assert not helpers.is_ip_address(b"localhost") assert not helpers.is_ip_address(b"www.example.com") # Out of range assert not helpers.is_ip_address(b"999.999.999.999") # Contain a port assert not helpers.is_ip_address(b"127.0.0.1:80") assert not helpers.is_ip_address(b"[2001:db8:0:1]:80") # Too many "::" assert not helpers.is_ip_address(b"1200::AB00:1234::2552:7777:1313") def test_ipv4_addresses() -> None: ip_addresses = [ "0.0.0.0", "127.0.0.1", "255.255.255.255", ] for address in ip_addresses: assert helpers.is_ipv4_address(address) assert not helpers.is_ipv6_address(address) assert helpers.is_ip_address(address) def test_ipv6_addresses() -> None: ip_addresses = [ "0:0:0:0:0:0:0:0", "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF", "00AB:0002:3008:8CFD:00AB:0002:3008:8CFD", "00ab:0002:3008:8cfd:00ab:0002:3008:8cfd", "AB:02:3008:8CFD:AB:02:3008:8CFD", "AB:02:3008:8CFD::02:3008:8CFD", "::", "1::1", ] for address in ip_addresses: assert not helpers.is_ipv4_address(address) assert helpers.is_ipv6_address(address) assert helpers.is_ip_address(address) def test_host_addresses() -> None: hosts = [ "www.four.part.host" "www.python.org", "foo.bar", "localhost", ] for host in hosts: assert not helpers.is_ip_address(host) def test_is_ip_address_invalid_type() -> None: with pytest.raises(TypeError): helpers.is_ip_address(123) with pytest.raises(TypeError): helpers.is_ip_address(object()) # ----------------------------------- TimeoutHandle ------------------- def test_timeout_handle(loop) -> None: handle = helpers.TimeoutHandle(loop, 10.2) cb = mock.Mock() handle.register(cb) assert cb == handle._callbacks[0][0] handle.close() assert not handle._callbacks def test_when_timeout_smaller_second(loop) -> None: timeout = 0.1 timer = loop.time() + timeout handle = helpers.TimeoutHandle(loop, timeout) when = handle.start()._when handle.close() assert isinstance(when, float) assert isclose(when - timer, 0, abs_tol=0.001) def test_timeout_handle_cb_exc(loop) -> None: handle = helpers.TimeoutHandle(loop, 10.2) cb = mock.Mock() handle.register(cb) cb.side_effect = ValueError() handle() assert cb.called assert not handle._callbacks def test_timer_context_not_cancelled() -> None: with mock.patch("aiohttp.helpers.asyncio") as m_asyncio: m_asyncio.TimeoutError = asyncio.TimeoutError loop = mock.Mock() ctx = helpers.TimerContext(loop) ctx.timeout() with pytest.raises(asyncio.TimeoutError): with ctx: pass if helpers.PY_37: assert not m_asyncio.current_task.return_value.cancel.called else: assert not m_asyncio.Task.current_task.return_value.cancel.called def test_timer_context_no_task(loop) -> None: with pytest.raises(RuntimeError): with helpers.TimerContext(loop): pass # -------------------------------- CeilTimeout -------------------------- async def test_weakref_handle(loop) -> None: cb = mock.Mock() helpers.weakref_handle(cb, "test", 0.01, loop) await asyncio.sleep(0.1) assert cb.test.called async def test_weakref_handle_weak(loop) -> None: cb = mock.Mock() helpers.weakref_handle(cb, "test", 0.01, loop) del cb gc.collect() await asyncio.sleep(0.1) async def test_ceil_timeout() -> None: async with helpers.ceil_timeout(None) as timeout: assert timeout.deadline is None async def test_ceil_timeout_round() -> None: async with helpers.ceil_timeout(7.5) as cm: assert cm.deadline is not None frac, integer = modf(cm.deadline) assert frac == 0 async def test_ceil_timeout_small() -> None: async with helpers.ceil_timeout(1.1) as cm: assert cm.deadline is not None frac, integer = modf(cm.deadline) # a chance for exact integer with zero fraction is negligible assert frac != 0 # -------------------------------- ContentDisposition ------------------- @pytest.mark.parametrize( "kwargs, result", [ (dict(foo="bar"), 'attachment; foo="bar"'), (dict(foo="bar[]"), 'attachment; foo="bar[]"'), (dict(foo=' a""b\\'), 'attachment; foo="\\ a\\"\\"b\\\\"'), (dict(foo="bär"), "attachment; foo*=utf-8''b%C3%A4r"), (dict(foo='bär "\\', quote_fields=False), 'attachment; foo="bär \\"\\\\"'), (dict(foo="bär", _charset="latin-1"), "attachment; foo*=latin-1''b%E4r"), (dict(filename="bär"), 'attachment; filename="b%C3%A4r"'), (dict(filename="bär", _charset="latin-1"), 'attachment; filename="b%E4r"'), ( dict(filename='bär "\\', quote_fields=False), 'attachment; filename="bär \\"\\\\"', ), ], ) def test_content_disposition(kwargs, result) -> None: assert helpers.content_disposition_header("attachment", **kwargs) == result def test_content_disposition_bad_type() -> None: with pytest.raises(ValueError): helpers.content_disposition_header("foo bar") with pytest.raises(ValueError): helpers.content_disposition_header("—Ç–µ—Å—Ç") with pytest.raises(ValueError): helpers.content_disposition_header("foo\x00bar") with pytest.raises(ValueError): helpers.content_disposition_header("") def test_set_content_disposition_bad_param() -> None: with pytest.raises(ValueError): helpers.content_disposition_header("inline", **{"foo bar": "baz"}) with pytest.raises(ValueError): helpers.content_disposition_header("inline", **{"—Ç–µ—Å—Ç": "baz"}) with pytest.raises(ValueError): helpers.content_disposition_header("inline", **{"": "baz"}) with pytest.raises(ValueError): helpers.content_disposition_header("inline", **{"foo\x00bar": "baz"}) # --------------------- proxies_from_env ------------------------------ @pytest.mark.parametrize( ("proxy_env_vars", "url_input", "expected_scheme"), ( ({"http_proxy": "http://aiohttp.io/path"}, "http://aiohttp.io/path", "http"), ({"https_proxy": "http://aiohttp.io/path"}, "http://aiohttp.io/path", "https"), ({"ws_proxy": "http://aiohttp.io/path"}, "http://aiohttp.io/path", "ws"), ({"wss_proxy": "http://aiohttp.io/path"}, "http://aiohttp.io/path", "wss"), ), indirect=["proxy_env_vars"], ids=("http", "https", "ws", "wss"), ) @pytest.mark.usefixtures("proxy_env_vars") def test_proxies_from_env(url_input, expected_scheme) -> None: url = URL(url_input) ret = helpers.proxies_from_env() assert ret.keys() == {expected_scheme} assert ret[expected_scheme].proxy == url assert ret[expected_scheme].proxy_auth is None @pytest.mark.parametrize( ("proxy_env_vars", "url_input", "expected_scheme"), ( ( {"https_proxy": "https://aiohttp.io/path"}, "https://aiohttp.io/path", "https", ), ({"wss_proxy": "wss://aiohttp.io/path"}, "wss://aiohttp.io/path", "wss"), ), indirect=["proxy_env_vars"], ids=("https", "wss"), ) @pytest.mark.usefixtures("proxy_env_vars") def test_proxies_from_env_skipped(caplog, url_input, expected_scheme) -> None: url = URL(url_input) assert helpers.proxies_from_env() == {} assert len(caplog.records) == 1 log_message = "{proto!s} proxies {url!s} are not supported, ignoring".format( proto=expected_scheme.upper(), url=url ) assert caplog.record_tuples == [("aiohttp.client", 30, log_message)] @pytest.mark.parametrize( ("proxy_env_vars", "url_input", "expected_scheme"), ( ( {"http_proxy": "http://user:pass@aiohttp.io/path"}, "http://user:pass@aiohttp.io/path", "http", ), ), indirect=["proxy_env_vars"], ids=("http",), ) @pytest.mark.usefixtures("proxy_env_vars") def test_proxies_from_env_http_with_auth(url_input, expected_scheme) -> None: url = URL("http://user:pass@aiohttp.io/path") ret = helpers.proxies_from_env() assert ret.keys() == {expected_scheme} assert ret[expected_scheme].proxy == url.with_user(None) proxy_auth = ret[expected_scheme].proxy_auth assert proxy_auth.login == "user" assert proxy_auth.password == "pass" assert proxy_auth.encoding == "latin1" # ------------ get_running_loop --------------------------------- def test_get_running_loop_not_running(loop) -> None: with pytest.warns(DeprecationWarning): helpers.get_running_loop() async def test_get_running_loop_ok(loop) -> None: assert helpers.get_running_loop() is loop # --------------------- get_env_proxy_for_url ------------------------------ @pytest.fixture def proxy_env_vars(monkeypatch, request): for schema in getproxies_environment().keys(): monkeypatch.delenv(f"{schema}_proxy", False) for proxy_type, proxy_list in request.param.items(): monkeypatch.setenv(proxy_type, proxy_list) return request.param @pytest.mark.parametrize( ("proxy_env_vars", "url_input", "expected_err_msg"), ( ( {"no_proxy": "aiohttp.io"}, "http://aiohttp.io/path", r"Proxying is disallowed for `'aiohttp.io'`", ), ( {"no_proxy": "aiohttp.io,proxy.com"}, "http://aiohttp.io/path", r"Proxying is disallowed for `'aiohttp.io'`", ), ( {"http_proxy": "http://example.com"}, "https://aiohttp.io/path", r"No proxies found for `https://aiohttp.io/path` in the env", ), ( {"https_proxy": "https://example.com"}, "http://aiohttp.io/path", r"No proxies found for `http://aiohttp.io/path` in the env", ), ( {}, "https://aiohttp.io/path", r"No proxies found for `https://aiohttp.io/path` in the env", ), ( {"https_proxy": "https://example.com"}, "", r"No proxies found for `` in the env", ), ), indirect=["proxy_env_vars"], ids=( "url_matches_the_no_proxy_list", "url_matches_the_no_proxy_list_multiple", "url_scheme_does_not_match_http_proxy_list", "url_scheme_does_not_match_https_proxy_list", "no_proxies_are_set", "url_is_empty", ), ) @pytest.mark.usefixtures("proxy_env_vars") def test_get_env_proxy_for_url_negative(url_input, expected_err_msg) -> None: url = URL(url_input) with pytest.raises(LookupError, match=expected_err_msg): helpers.get_env_proxy_for_url(url) @pytest.mark.parametrize( ("proxy_env_vars", "url_input"), ( ({"http_proxy": "http://example.com"}, "http://aiohttp.io/path"), ({"https_proxy": "http://example.com"}, "https://aiohttp.io/path"), ( {"http_proxy": "http://example.com,http://proxy.org"}, "http://aiohttp.io/path", ), ), indirect=["proxy_env_vars"], ids=( "url_scheme_match_http_proxy_list", "url_scheme_match_https_proxy_list", "url_scheme_match_http_proxy_list_multiple", ), ) def test_get_env_proxy_for_url(proxy_env_vars, url_input) -> None: url = URL(url_input) proxy, proxy_auth = helpers.get_env_proxy_for_url(url) proxy_list = proxy_env_vars[url.scheme + "_proxy"] assert proxy == URL(proxy_list) assert proxy_auth is None # ------------- set_result / set_exception ---------------------- async def test_set_result(loop) -> None: fut = loop.create_future() helpers.set_result(fut, 123) assert 123 == await fut async def test_set_result_cancelled(loop) -> None: fut = loop.create_future() fut.cancel() helpers.set_result(fut, 123) with pytest.raises(asyncio.CancelledError): await fut async def test_set_exception(loop) -> None: fut = loop.create_future() helpers.set_exception(fut, RuntimeError()) with pytest.raises(RuntimeError): await fut async def test_set_exception_cancelled(loop) -> None: fut = loop.create_future() fut.cancel() helpers.set_exception(fut, RuntimeError()) with pytest.raises(asyncio.CancelledError): await fut # ----------- ChainMapProxy -------------------------- class TestChainMapProxy: @pytest.mark.skipif(not helpers.PY_36, reason="Requires Python 3.6+") def test_inheritance(self) -> None: with pytest.raises(TypeError): class A(helpers.ChainMapProxy): pass def test_getitem(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert cp["a"] == 2 assert cp["b"] == 3 def test_getitem_not_found(self) -> None: d = {"a": 1} cp = helpers.ChainMapProxy([d]) with pytest.raises(KeyError): cp["b"] def test_get(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert cp.get("a") == 2 def test_get_default(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert cp.get("c", 4) == 4 def test_get_non_default(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert cp.get("a", 4) == 2 def test_len(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert len(cp) == 2 def test_iter(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert set(cp) == {"a", "b"} def test_contains(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) assert "a" in cp assert "b" in cp assert "c" not in cp def test_bool(self) -> None: assert helpers.ChainMapProxy([{"a": 1}]) assert not helpers.ChainMapProxy([{}, {}]) assert not helpers.ChainMapProxy([]) def test_repr(self) -> None: d1 = {"a": 2, "b": 3} d2 = {"a": 1} cp = helpers.ChainMapProxy([d1, d2]) expected = f"ChainMapProxy({d1!r}, {d2!r})" assert expected == repr(cp) @pytest.mark.parametrize( ["value", "expected"], [ # email.utils.parsedate returns None pytest.param("xxyyzz", None), # datetime.datetime fails with ValueError("year 4446413 is out of range") pytest.param("Tue, 08 Oct 4446413 00:56:40 GMT", None), # datetime.datetime fails with ValueError("second must be in 0..59") pytest.param("Tue, 08 Oct 2000 00:56:80 GMT", None), # OK pytest.param( "Tue, 08 Oct 2000 00:56:40 GMT", datetime.datetime(2000, 10, 8, 0, 56, 40, tzinfo=datetime.timezone.utc), ), # OK (ignore timezone and overwrite to UTC) pytest.param( "Tue, 08 Oct 2000 00:56:40 +0900", datetime.datetime(2000, 10, 8, 0, 56, 40, tzinfo=datetime.timezone.utc), ), ], ) def test_parse_http_date(value, expected): assert parse_http_date(value) == expected ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_http_exceptions.py0000644000175100001710000001251600000000000020533 0ustar00runnerdocker# Tests for http_exceptions.py import pickle from aiohttp import http_exceptions class TestHttpProcessingError: def test_ctor(self) -> None: err = http_exceptions.HttpProcessingError( code=500, message="Internal error", headers={} ) assert err.code == 500 assert err.message == "Internal error" assert err.headers == {} def test_pickle(self) -> None: err = http_exceptions.HttpProcessingError( code=500, message="Internal error", headers={} ) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.code == 500 assert err2.message == "Internal error" assert err2.headers == {} assert err2.foo == "bar" def test_str(self) -> None: err = http_exceptions.HttpProcessingError( code=500, message="Internal error", headers={} ) assert str(err) == "500, message='Internal error'" def test_repr(self) -> None: err = http_exceptions.HttpProcessingError( code=500, message="Internal error", headers={} ) assert repr(err) == ("") class TestBadHttpMessage: def test_ctor(self) -> None: err = http_exceptions.BadHttpMessage("Bad HTTP message", headers={}) assert err.code == 400 assert err.message == "Bad HTTP message" assert err.headers == {} def test_pickle(self) -> None: err = http_exceptions.BadHttpMessage(message="Bad HTTP message", headers={}) err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.code == 400 assert err2.message == "Bad HTTP message" assert err2.headers == {} assert err2.foo == "bar" def test_str(self) -> None: err = http_exceptions.BadHttpMessage(message="Bad HTTP message", headers={}) assert str(err) == "400, message='Bad HTTP message'" def test_repr(self) -> None: err = http_exceptions.BadHttpMessage(message="Bad HTTP message", headers={}) assert repr(err) == "" class TestLineTooLong: def test_ctor(self) -> None: err = http_exceptions.LineTooLong("spam", "10", "12") assert err.code == 400 assert err.message == "Got more than 10 bytes (12) when reading spam." assert err.headers is None def test_pickle(self) -> None: err = http_exceptions.LineTooLong(line="spam", limit="10", actual_size="12") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.code == 400 assert err2.message == ("Got more than 10 bytes (12) " "when reading spam.") assert err2.headers is None assert err2.foo == "bar" def test_str(self) -> None: err = http_exceptions.LineTooLong(line="spam", limit="10", actual_size="12") assert str(err) == ( "400, message='Got more than 10 bytes (12) " "when reading spam.'" ) def test_repr(self) -> None: err = http_exceptions.LineTooLong(line="spam", limit="10", actual_size="12") assert repr(err) == ( "" ) class TestInvalidHeader: def test_ctor(self) -> None: err = http_exceptions.InvalidHeader("X-Spam") assert err.code == 400 assert err.message == "Invalid HTTP Header: X-Spam" assert err.headers is None def test_pickle(self) -> None: err = http_exceptions.InvalidHeader(hdr="X-Spam") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.code == 400 assert err2.message == "Invalid HTTP Header: X-Spam" assert err2.headers is None assert err2.foo == "bar" def test_str(self) -> None: err = http_exceptions.InvalidHeader(hdr="X-Spam") assert str(err) == "400, message='Invalid HTTP Header: X-Spam'" def test_repr(self) -> None: err = http_exceptions.InvalidHeader(hdr="X-Spam") assert repr(err) == ( "" ) class TestBadStatusLine: def test_ctor(self) -> None: err = http_exceptions.BadStatusLine("Test") assert err.line == "Test" assert str(err) == "400, message=\"Bad status line 'Test'\"" def test_ctor2(self) -> None: err = http_exceptions.BadStatusLine(b"") assert err.line == "b''" assert str(err) == "400, message='Bad status line \"b\\'\\'\"'" def test_pickle(self) -> None: err = http_exceptions.BadStatusLine("Test") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.line == "Test" assert err2.foo == "bar" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_http_parser.py0000644000175100001710000011220000000000000017635 0ustar00runnerdocker# Tests for aiohttp/protocol.py import asyncio from typing import Any, List from unittest import mock from urllib.parse import quote import pytest from multidict import CIMultiDict from yarl import URL import aiohttp from aiohttp import http_exceptions, streams from aiohttp.http_parser import ( NO_EXTENSIONS, DeflateBuffer, HttpPayloadParser, HttpRequestParserPy, HttpResponseParserPy, ) try: import brotli except ImportError: brotli = None REQUEST_PARSERS = [HttpRequestParserPy] RESPONSE_PARSERS = [HttpResponseParserPy] try: from aiohttp.http_parser import HttpRequestParserC, HttpResponseParserC REQUEST_PARSERS.append(HttpRequestParserC) RESPONSE_PARSERS.append(HttpResponseParserC) except ImportError: # pragma: no cover pass @pytest.fixture def protocol(): return mock.Mock() def _gen_ids(parsers: List[Any]) -> List[str]: return [ "py-parser" if parser.__module__ == "aiohttp.http_parser" else "c-parser" for parser in parsers ] @pytest.fixture(params=REQUEST_PARSERS, ids=_gen_ids(REQUEST_PARSERS)) def parser(loop: Any, protocol: Any, request: Any): # Parser implementations return request.param( protocol, loop, 2 ** 16, max_line_size=8190, max_headers=32768, max_field_size=8190, ) @pytest.fixture(params=REQUEST_PARSERS, ids=_gen_ids(REQUEST_PARSERS)) def request_cls(request: Any): # Request Parser class return request.param @pytest.fixture(params=RESPONSE_PARSERS, ids=_gen_ids(RESPONSE_PARSERS)) def response(loop: Any, protocol: Any, request: Any): # Parser implementations return request.param( protocol, loop, 2 ** 16, max_line_size=8190, max_headers=32768, max_field_size=8190, ) @pytest.fixture(params=RESPONSE_PARSERS, ids=_gen_ids(RESPONSE_PARSERS)) def response_cls(request: Any): # Parser implementations return request.param @pytest.fixture def stream(): return mock.Mock() @pytest.mark.skipif(NO_EXTENSIONS, reason="Extentions available but not imported") def test_c_parser_loaded(): assert "HttpRequestParserC" in dir(aiohttp.http_parser) assert "HttpResponseParserC" in dir(aiohttp.http_parser) assert "RawRequestMessageC" in dir(aiohttp.http_parser) assert "RawResponseMessageC" in dir(aiohttp.http_parser) def test_parse_headers(parser: Any) -> None: text = b"""GET /test HTTP/1.1\r test: line\r continue\r test2: data\r \r """ messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 1 msg = messages[0][0] assert list(msg.headers.items()) == [("test", "line continue"), ("test2", "data")] assert msg.raw_headers == ((b"test", b"line continue"), (b"test2", b"data")) assert not msg.should_close assert msg.compression is None assert not msg.upgrade def test_parse(parser) -> None: text = b"GET /test HTTP/1.1\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 1 msg, _ = messages[0] assert msg.compression is None assert not msg.upgrade assert msg.method == "GET" assert msg.path == "/test" assert msg.version == (1, 1) async def test_parse_body(parser) -> None: text = b"GET /test HTTP/1.1\r\nContent-Length: 4\r\n\r\nbody" messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 1 _, payload = messages[0] body = await payload.read(4) assert body == b"body" async def test_parse_body_with_CRLF(parser) -> None: text = b"\r\nGET /test HTTP/1.1\r\nContent-Length: 4\r\n\r\nbody" messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 1 _, payload = messages[0] body = await payload.read(4) assert body == b"body" def test_parse_delayed(parser) -> None: text = b"GET /test HTTP/1.1\r\n" messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 0 assert not upgrade messages, upgrade, tail = parser.feed_data(b"\r\n") assert len(messages) == 1 msg = messages[0][0] assert msg.method == "GET" def test_headers_multi_feed(parser) -> None: text1 = b"GET /test HTTP/1.1\r\n" text2 = b"test: line\r" text3 = b"\n continue\r\n\r\n" messages, upgrade, tail = parser.feed_data(text1) assert len(messages) == 0 messages, upgrade, tail = parser.feed_data(text2) assert len(messages) == 0 messages, upgrade, tail = parser.feed_data(text3) assert len(messages) == 1 msg = messages[0][0] assert list(msg.headers.items()) == [("test", "line continue")] assert msg.raw_headers == ((b"test", b"line continue"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade def test_headers_split_field(parser) -> None: text1 = b"GET /test HTTP/1.1\r\n" text2 = b"t" text3 = b"es" text4 = b"t: value\r\n\r\n" messages, upgrade, tail = parser.feed_data(text1) messages, upgrade, tail = parser.feed_data(text2) messages, upgrade, tail = parser.feed_data(text3) assert len(messages) == 0 messages, upgrade, tail = parser.feed_data(text4) assert len(messages) == 1 msg = messages[0][0] assert list(msg.headers.items()) == [("test", "value")] assert msg.raw_headers == ((b"test", b"value"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade def test_parse_headers_multi(parser) -> None: text = ( b"GET /test HTTP/1.1\r\n" b"Set-Cookie: c1=cookie1\r\n" b"Set-Cookie: c2=cookie2\r\n\r\n" ) messages, upgrade, tail = parser.feed_data(text) assert len(messages) == 1 msg = messages[0][0] assert list(msg.headers.items()) == [ ("Set-Cookie", "c1=cookie1"), ("Set-Cookie", "c2=cookie2"), ] assert msg.raw_headers == ( (b"Set-Cookie", b"c1=cookie1"), (b"Set-Cookie", b"c2=cookie2"), ) assert not msg.should_close assert msg.compression is None def test_conn_default_1_0(parser) -> None: text = b"GET /test HTTP/1.0\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.should_close def test_conn_default_1_1(parser) -> None: text = b"GET /test HTTP/1.1\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close def test_conn_close(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"connection: close\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.should_close def test_conn_close_1_0(parser) -> None: text = b"GET /test HTTP/1.0\r\n" b"connection: close\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.should_close def test_conn_keep_alive_1_0(parser) -> None: text = b"GET /test HTTP/1.0\r\n" b"connection: keep-alive\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close def test_conn_keep_alive_1_1(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"connection: keep-alive\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close def test_conn_other_1_0(parser) -> None: text = b"GET /test HTTP/1.0\r\n" b"connection: test\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.should_close def test_conn_other_1_1(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"connection: test\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close def test_request_chunked(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg, payload = messages[0] assert msg.chunked assert not upgrade assert isinstance(payload, streams.StreamReader) def test_request_te_chunked_with_content_length(parser: Any) -> None: text = ( b"GET /test HTTP/1.1\r\n" b"content-length: 1234\r\n" b"transfer-encoding: chunked\r\n\r\n" ) with pytest.raises( http_exceptions.BadHttpMessage, match="Content-Length can't be present with Transfer-Encoding", ): parser.feed_data(text) def test_request_te_chunked123(parser: Any) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked123\r\n\r\n" with pytest.raises( http_exceptions.BadHttpMessage, match="Request has invalid `Transfer-Encoding`", ): parser.feed_data(text) def test_conn_upgrade(parser: Any) -> None: text = ( b"GET /test HTTP/1.1\r\n" b"connection: upgrade\r\n" b"upgrade: websocket\r\n\r\n" ) messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close assert msg.upgrade assert upgrade def test_compression_empty(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-encoding: \r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.compression is None def test_compression_deflate(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-encoding: deflate\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.compression == "deflate" def test_compression_gzip(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-encoding: gzip\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.compression == "gzip" @pytest.mark.skipif(brotli is None, reason="brotli is not installed") def test_compression_brotli(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-encoding: br\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.compression == "br" def test_compression_unknown(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-encoding: compress\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.compression is None def test_headers_connect(parser) -> None: text = b"CONNECT www.google.com HTTP/1.1\r\n" b"content-length: 0\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg, payload = messages[0] assert upgrade assert isinstance(payload, streams.StreamReader) def test_headers_old_websocket_key1(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"SEC-WEBSOCKET-KEY1: line\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_headers_content_length_err_1(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-length: line\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_headers_content_length_err_2(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"content-length: -1\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_invalid_header(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"test line\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) def test_invalid_name(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"test[]: line\r\n\r\n" with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(text) @pytest.mark.parametrize("size", [40960, 8191]) def test_max_header_field_size(parser, size) -> None: name = b"t" * size text = b"GET /test HTTP/1.1\r\n" + name + b":data\r\n\r\n" match = f"400, message='Got more than 8190 bytes \\({size}\\) when reading" with pytest.raises(http_exceptions.LineTooLong, match=match): parser.feed_data(text) def test_max_header_field_size_under_limit(parser) -> None: name = b"t" * 8190 text = b"GET /test HTTP/1.1\r\n" + name + b":data\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/test" assert msg.version == (1, 1) assert msg.headers == CIMultiDict({name.decode(): "data"}) assert msg.raw_headers == ((name, b"data"),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/test") @pytest.mark.parametrize("size", [40960, 8191]) def test_max_header_value_size(parser, size) -> None: name = b"t" * size text = b"GET /test HTTP/1.1\r\n" b"data:" + name + b"\r\n\r\n" match = f"400, message='Got more than 8190 bytes \\({size}\\) when reading" with pytest.raises(http_exceptions.LineTooLong, match=match): parser.feed_data(text) def test_max_header_value_size_under_limit(parser) -> None: value = b"A" * 8190 text = b"GET /test HTTP/1.1\r\n" b"data:" + value + b"\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/test" assert msg.version == (1, 1) assert msg.headers == CIMultiDict({"data": value.decode()}) assert msg.raw_headers == ((b"data", value),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/test") @pytest.mark.parametrize("size", [40965, 8191]) def test_max_header_value_size_continuation(parser, size) -> None: name = b"T" * (size - 5) text = b"GET /test HTTP/1.1\r\n" b"data: test\r\n " + name + b"\r\n\r\n" match = f"400, message='Got more than 8190 bytes \\({size}\\) when reading" with pytest.raises(http_exceptions.LineTooLong, match=match): parser.feed_data(text) def test_max_header_value_size_continuation_under_limit(parser) -> None: value = b"A" * 8185 text = b"GET /test HTTP/1.1\r\n" b"data: test\r\n " + value + b"\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/test" assert msg.version == (1, 1) assert msg.headers == CIMultiDict({"data": "test " + value.decode()}) assert msg.raw_headers == ((b"data", b"test " + value),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/test") def test_http_request_parser(parser) -> None: text = b"GET /path HTTP/1.1\r\n\r\n" messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/path" assert msg.version == (1, 1) assert msg.headers == CIMultiDict() assert msg.raw_headers == () assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/path") def test_http_request_bad_status_line(parser) -> None: text = b"getpath \r\n\r\n" with pytest.raises(http_exceptions.BadStatusLine): parser.feed_data(text) def test_http_request_upgrade(parser) -> None: text = ( b"GET /test HTTP/1.1\r\n" b"connection: upgrade\r\n" b"upgrade: websocket\r\n\r\n" b"some raw data" ) messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert not msg.should_close assert msg.upgrade assert upgrade assert tail == b"some raw data" def test_http_request_parser_utf8(parser) -> None: text = "GET /path HTTP/1.1\r\nx-test:тест\r\n\r\n".encode() messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/path" assert msg.version == (1, 1) assert msg.headers == CIMultiDict([("X-TEST", "тест")]) assert msg.raw_headers == ((b"x-test", "тест".encode()),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/path") def test_http_request_parser_non_utf8(parser) -> None: text = "GET /path HTTP/1.1\r\nx-test:тест\r\n\r\n".encode("cp1251") msg = parser.feed_data(text)[0][0][0] assert msg.method == "GET" assert msg.path == "/path" assert msg.version == (1, 1) assert msg.headers == CIMultiDict( [("X-TEST", "тест".encode("cp1251").decode("utf8", "surrogateescape"))] ) assert msg.raw_headers == ((b"x-test", "тест".encode("cp1251")),) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/path") def test_http_request_parser_two_slashes(parser) -> None: text = b"GET //path HTTP/1.1\r\n\r\n" msg = parser.feed_data(text)[0][0][0] assert msg.method == "GET" assert msg.path == "//path" assert msg.url.path == "//path" assert msg.version == (1, 1) assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked def test_http_request_parser_bad_method(parser) -> None: with pytest.raises(http_exceptions.BadStatusLine): parser.feed_data(b'=":(e),[T];?" /get HTTP/1.1\r\n\r\n') def test_http_request_parser_bad_version(parser) -> None: with pytest.raises(http_exceptions.BadHttpMessage): parser.feed_data(b"GET //get HT/11\r\n\r\n") @pytest.mark.parametrize("size", [40965, 8191]) def test_http_request_max_status_line(parser, size) -> None: path = b"t" * (size - 5) match = f"400, message='Got more than 8190 bytes \\({size}\\) when reading" with pytest.raises(http_exceptions.LineTooLong, match=match): parser.feed_data(b"GET /path" + path + b" HTTP/1.1\r\n\r\n") def test_http_request_max_status_line_under_limit(parser) -> None: path = b"t" * (8190 - 5) messages, upgraded, tail = parser.feed_data( b"GET /path" + path + b" HTTP/1.1\r\n\r\n" ) msg = messages[0][0] assert msg.method == "GET" assert msg.path == "/path" + path.decode() assert msg.version == (1, 1) assert msg.headers == CIMultiDict() assert msg.raw_headers == () assert not msg.should_close assert msg.compression is None assert not msg.upgrade assert not msg.chunked assert msg.url == URL("/path" + path.decode()) def test_http_response_parser_utf8(response) -> None: text = "HTTP/1.1 200 Ok\r\nx-test:тест\r\n\r\n".encode() messages, upgraded, tail = response.feed_data(text) assert len(messages) == 1 msg = messages[0][0] assert msg.version == (1, 1) assert msg.code == 200 assert msg.reason == "Ok" assert msg.headers == CIMultiDict([("X-TEST", "тест")]) assert msg.raw_headers == ((b"x-test", "тест".encode()),) assert not upgraded assert not tail @pytest.mark.parametrize("size", [40962, 8191]) def test_http_response_parser_bad_status_line_too_long(response, size) -> None: reason = b"t" * (size - 2) match = f"400, message='Got more than 8190 bytes \\({size}\\) when reading" with pytest.raises(http_exceptions.LineTooLong, match=match): response.feed_data(b"HTTP/1.1 200 Ok" + reason + b"\r\n\r\n") def test_http_response_parser_status_line_under_limit(response) -> None: reason = b"O" * 8190 messages, upgraded, tail = response.feed_data( b"HTTP/1.1 200 " + reason + b"\r\n\r\n" ) msg = messages[0][0] assert msg.version == (1, 1) assert msg.code == 200 assert msg.reason == reason.decode() def test_http_response_parser_bad_version(response) -> None: with pytest.raises(http_exceptions.BadHttpMessage): response.feed_data(b"HT/11 200 Ok\r\n\r\n") def test_http_response_parser_no_reason(response) -> None: msg = response.feed_data(b"HTTP/1.1 200\r\n\r\n")[0][0][0] assert msg.version == (1, 1) assert msg.code == 200 assert msg.reason == "" def test_http_response_parser_bad(response) -> None: with pytest.raises(http_exceptions.BadHttpMessage): response.feed_data(b"HTT/1\r\n\r\n") def test_http_response_parser_code_under_100(response) -> None: msg = response.feed_data(b"HTTP/1.1 99 test\r\n\r\n")[0][0][0] assert msg.code == 99 def test_http_response_parser_code_above_999(response) -> None: with pytest.raises(http_exceptions.BadHttpMessage): response.feed_data(b"HTTP/1.1 9999 test\r\n\r\n") def test_http_response_parser_code_not_int(response) -> None: with pytest.raises(http_exceptions.BadHttpMessage): response.feed_data(b"HTTP/1.1 ttt test\r\n\r\n") def test_http_request_chunked_payload(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] assert msg.chunked assert not payload.is_eof() assert isinstance(payload, streams.StreamReader) parser.feed_data(b"4\r\ndata\r\n4\r\nline\r\n0\r\n\r\n") assert b"dataline" == b"".join(d for d in payload._buffer) assert [4, 8] == payload._http_chunk_splits assert payload.is_eof() def test_http_request_chunked_payload_and_next_message(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] messages, upgraded, tail = parser.feed_data( b"4\r\ndata\r\n4\r\nline\r\n0\r\n\r\n" b"POST /test2 HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" ) assert b"dataline" == b"".join(d for d in payload._buffer) assert [4, 8] == payload._http_chunk_splits assert payload.is_eof() assert len(messages) == 1 msg2, payload2 = messages[0] assert msg2.method == "POST" assert msg2.chunked assert not payload2.is_eof() def test_http_request_chunked_payload_chunks(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] parser.feed_data(b"4\r\ndata\r") parser.feed_data(b"\n4") parser.feed_data(b"\r") parser.feed_data(b"\n") parser.feed_data(b"li") parser.feed_data(b"ne\r\n0\r\n") parser.feed_data(b"test: test\r\n") assert b"dataline" == b"".join(d for d in payload._buffer) assert [4, 8] == payload._http_chunk_splits assert not payload.is_eof() parser.feed_data(b"\r\n") assert b"dataline" == b"".join(d for d in payload._buffer) assert [4, 8] == payload._http_chunk_splits assert payload.is_eof() def test_parse_chunked_payload_chunk_extension(parser) -> None: text = b"GET /test HTTP/1.1\r\n" b"transfer-encoding: chunked\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] parser.feed_data(b"4;test\r\ndata\r\n4\r\nline\r\n0\r\ntest: test\r\n\r\n") assert b"dataline" == b"".join(d for d in payload._buffer) assert [4, 8] == payload._http_chunk_splits assert payload.is_eof() def _test_parse_no_length_or_te_on_post(loop, protocol, request_cls): parser = request_cls(protocol, loop, readall=True) text = b"POST /test HTTP/1.1\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] assert payload.is_eof() def test_parse_payload_response_without_body(loop, protocol, response_cls) -> None: parser = response_cls(protocol, loop, 2 ** 16, response_with_body=False) text = b"HTTP/1.1 200 Ok\r\n" b"content-length: 10\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] assert payload.is_eof() def test_parse_length_payload(response) -> None: text = b"HTTP/1.1 200 Ok\r\n" b"content-length: 4\r\n\r\n" msg, payload = response.feed_data(text)[0][0] assert not payload.is_eof() response.feed_data(b"da") response.feed_data(b"t") response.feed_data(b"aHT") assert payload.is_eof() assert b"data" == b"".join(d for d in payload._buffer) def test_parse_no_length_payload(parser) -> None: text = b"PUT / HTTP/1.1\r\n\r\n" msg, payload = parser.feed_data(text)[0][0] assert payload.is_eof() def test_partial_url(parser) -> None: messages, upgrade, tail = parser.feed_data(b"GET /te") assert len(messages) == 0 messages, upgrade, tail = parser.feed_data(b"st HTTP/1.1\r\n\r\n") assert len(messages) == 1 msg, payload = messages[0] assert msg.method == "GET" assert msg.path == "/test" assert msg.version == (1, 1) assert payload.is_eof() def test_url_parse_non_strict_mode(parser) -> None: payload = "GET /test/тест HTTP/1.1\r\n\r\n".encode() messages, upgrade, tail = parser.feed_data(payload) assert len(messages) == 1 msg, payload = messages[0] assert msg.method == "GET" assert msg.path == "/test/тест" assert msg.version == (1, 1) assert payload.is_eof() @pytest.mark.parametrize( ("uri", "path", "query", "fragment"), [ ("/path%23frag", "/path#frag", {}, ""), ("/path%2523frag", "/path%23frag", {}, ""), ("/path?key=value%23frag", "/path", {"key": "value#frag"}, ""), ("/path?key=value%2523frag", "/path", {"key": "value%23frag"}, ""), ("/path#frag%20", "/path", {}, "frag "), ("/path#frag%2520", "/path", {}, "frag%20"), ], ) def test_parse_uri_percent_encoded(parser, uri, path, query, fragment) -> None: text = (f"GET {uri} HTTP/1.1\r\n\r\n").encode() messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.path == uri assert msg.url == URL(uri) assert msg.url.path == path assert msg.url.query == query assert msg.url.fragment == fragment def test_parse_uri_utf8(parser) -> None: text = ("GET /путь?ключ=знач#фраг HTTP/1.1\r\n\r\n").encode() messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.path == "/путь?ключ=знач#фраг" assert msg.url.path == "/путь" assert msg.url.query == {"ключ": "знач"} assert msg.url.fragment == "фраг" def test_parse_uri_utf8_percent_encoded(parser) -> None: text = ( "GET %s HTTP/1.1\r\n\r\n" % quote("/путь?ключ=знач#фраг", safe="/?=#") ).encode() messages, upgrade, tail = parser.feed_data(text) msg = messages[0][0] assert msg.path == quote("/путь?ключ=знач#фраг", safe="/?=#") assert msg.url == URL("/путь?ключ=знач#фраг") assert msg.url.path == "/путь" assert msg.url.query == {"ключ": "знач"} assert msg.url.fragment == "фраг" @pytest.mark.skipif( "HttpRequestParserC" not in dir(aiohttp.http_parser), reason="C based HTTP parser not available", ) def test_parse_bad_method_for_c_parser_raises(loop, protocol): payload = b"GET1 /test HTTP/1.1\r\n\r\n" parser = HttpRequestParserC( protocol, loop, 2 ** 16, max_line_size=8190, max_headers=32768, max_field_size=8190, ) with pytest.raises(aiohttp.http_exceptions.BadStatusLine): messages, upgrade, tail = parser.feed_data(payload) class TestParsePayload: async def test_parse_eof_payload(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, readall=True) p.feed_data(b"data") p.feed_eof() assert out.is_eof() assert [(bytearray(b"data"), 4)] == list(out._buffer) async def test_parse_no_body(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, method="PUT") assert out.is_eof() assert p.done async def test_parse_length_payload_eof(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=4) p.feed_data(b"da") with pytest.raises(http_exceptions.ContentLengthError): p.feed_eof() async def test_parse_chunked_payload_size_error(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, chunked=True) with pytest.raises(http_exceptions.TransferEncodingError): p.feed_data(b"blah\r\n") assert isinstance(out.exception(), http_exceptions.TransferEncodingError) async def test_parse_chunked_payload_split_end(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2 ** 16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\n") p.feed_data(b"\r\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_parse_chunked_payload_split_end2(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2 ** 16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\n\r") p.feed_data(b"\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_parse_chunked_payload_split_end_trailers(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2 ** 16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\n") p.feed_data(b"Content-MD5: 912ec803b2ce49e4a541068d495ab570\r\n") p.feed_data(b"\r\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_parse_chunked_payload_split_end_trailers2(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2 ** 16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\n") p.feed_data(b"Content-MD5: 912ec803b2ce49e4a541068d495ab570\r\n\r") p.feed_data(b"\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_parse_chunked_payload_split_end_trailers3(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2 ** 16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\nContent-MD5: ") p.feed_data(b"912ec803b2ce49e4a541068d495ab570\r\n\r\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_parse_chunked_payload_split_end_trailers4(self, protocol) -> None: out = aiohttp.StreamReader(protocol, 2 ** 16, loop=None) p = HttpPayloadParser(out, chunked=True) p.feed_data(b"4\r\nasdf\r\n0\r\n" b"C") p.feed_data(b"ontent-MD5: 912ec803b2ce49e4a541068d495ab570\r\n\r\n") assert out.is_eof() assert b"asdf" == b"".join(out._buffer) async def test_http_payload_parser_length(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=2) eof, tail = p.feed_data(b"1245") assert eof assert b"12" == b"".join(d for d, _ in out._buffer) assert b"45" == tail async def test_http_payload_parser_deflate(self, stream) -> None: # c=compressobj(wbits=15); b''.join([c.compress(b'data'), c.flush()]) COMPRESSED = b"x\x9cKI,I\x04\x00\x04\x00\x01\x9b" length = len(COMPRESSED) out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=length, compression="deflate") p.feed_data(COMPRESSED) assert b"data" == b"".join(d for d, _ in out._buffer) assert out.is_eof() async def test_http_payload_parser_deflate_no_hdrs(self, stream: Any) -> None: """Tests incorrectly formed data (no zlib headers).""" # c=compressobj(wbits=-15); b''.join([c.compress(b'data'), c.flush()]) COMPRESSED = b"KI,I\x04\x00" length = len(COMPRESSED) out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=length, compression="deflate") p.feed_data(COMPRESSED) assert b"data" == b"".join(d for d, _ in out._buffer) assert out.is_eof() async def test_http_payload_parser_deflate_light(self, stream) -> None: # c=compressobj(wbits=9); b''.join([c.compress(b'data'), c.flush()]) COMPRESSED = b"\x18\x95KI,I\x04\x00\x04\x00\x01\x9b" length = len(COMPRESSED) out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=length, compression="deflate") p.feed_data(COMPRESSED) assert b"data" == b"".join(d for d, _ in out._buffer) assert out.is_eof() async def test_http_payload_parser_deflate_split(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, compression="deflate", readall=True) # Feeding one correct byte should be enough to choose exact # deflate decompressor p.feed_data(b"x", 1) p.feed_data(b"\x9cKI,I\x04\x00\x04\x00\x01\x9b", 11) p.feed_eof() assert b"data" == b"".join(d for d, _ in out._buffer) async def test_http_payload_parser_deflate_split_err(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, compression="deflate", readall=True) # Feeding one wrong byte should be enough to choose exact # deflate decompressor p.feed_data(b"K", 1) p.feed_data(b"I,I\x04\x00", 5) p.feed_eof() assert b"data" == b"".join(d for d, _ in out._buffer) async def test_http_payload_parser_length_zero(self, stream) -> None: out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=0) assert p.done assert out.is_eof() @pytest.mark.skipif(brotli is None, reason="brotli is not installed") async def test_http_payload_brotli(self, stream) -> None: compressed = brotli.compress(b"brotli data") out = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) p = HttpPayloadParser(out, length=len(compressed), compression="br") p.feed_data(compressed) assert b"brotli data" == b"".join(d for d, _ in out._buffer) assert out.is_eof() class TestDeflateBuffer: async def test_feed_data(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "deflate") dbuf.decompressor = mock.Mock() dbuf.decompressor.decompress.return_value = b"line" # First byte should be b'x' in order code not to change the decoder. dbuf.feed_data(b"xxxx", 4) assert [b"line"] == list(d for d, _ in buf._buffer) async def test_feed_data_err(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "deflate") exc = ValueError() dbuf.decompressor = mock.Mock() dbuf.decompressor.decompress.side_effect = exc with pytest.raises(http_exceptions.ContentEncodingError): # Should be more than 4 bytes to trigger deflate FSM error. # Should start with b'x', otherwise code switch mocked decoder. dbuf.feed_data(b"xsomedata", 9) async def test_feed_eof(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "deflate") dbuf.decompressor = mock.Mock() dbuf.decompressor.flush.return_value = b"line" dbuf.feed_eof() assert [b"line"] == list(d for d, _ in buf._buffer) assert buf._eof async def test_feed_eof_err_deflate(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "deflate") dbuf.decompressor = mock.Mock() dbuf.decompressor.flush.return_value = b"line" dbuf.decompressor.eof = False with pytest.raises(http_exceptions.ContentEncodingError): dbuf.feed_eof() async def test_feed_eof_no_err_gzip(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "gzip") dbuf.decompressor = mock.Mock() dbuf.decompressor.flush.return_value = b"line" dbuf.decompressor.eof = False dbuf.feed_eof() assert [b"line"] == list(d for d, _ in buf._buffer) async def test_feed_eof_no_err_brotli(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "br") dbuf.decompressor = mock.Mock() dbuf.decompressor.flush.return_value = b"line" dbuf.decompressor.eof = False dbuf.feed_eof() assert [b"line"] == list(d for d, _ in buf._buffer) async def test_empty_body(self, stream) -> None: buf = aiohttp.FlowControlDataQueue( stream, 2 ** 16, loop=asyncio.get_event_loop() ) dbuf = DeflateBuffer(buf, "deflate") dbuf.feed_eof() assert buf.at_eof() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_http_writer.py0000644000175100001710000001651400000000000017670 0ustar00runnerdocker# Tests for aiohttp/http_writer.py import array from unittest import mock import pytest from multidict import CIMultiDict from aiohttp import http from aiohttp.test_utils import make_mocked_coro @pytest.fixture def buf(): return bytearray() @pytest.fixture def transport(buf): transport = mock.Mock() def write(chunk): buf.extend(chunk) transport.write.side_effect = write transport.is_closing.return_value = False return transport @pytest.fixture def protocol(loop, transport): protocol = mock.Mock(transport=transport) protocol._drain_helper = make_mocked_coro() return protocol def test_payloadwriter_properties(transport, protocol, loop) -> None: writer = http.StreamWriter(protocol, loop) assert writer.protocol == protocol assert writer.transport == transport async def test_write_payload_eof(transport, protocol, loop) -> None: write = transport.write = mock.Mock() msg = http.StreamWriter(protocol, loop) await msg.write(b"data1") await msg.write(b"data2") await msg.write_eof() content = b"".join([c[1][0] for c in list(write.mock_calls)]) assert b"data1data2" == content.split(b"\r\n\r\n", 1)[-1] async def test_write_payload_chunked(buf, protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) msg.enable_chunking() await msg.write(b"data") await msg.write_eof() assert b"4\r\ndata\r\n0\r\n\r\n" == buf async def test_write_payload_chunked_multiple(buf, protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) msg.enable_chunking() await msg.write(b"data1") await msg.write(b"data2") await msg.write_eof() assert b"5\r\ndata1\r\n5\r\ndata2\r\n0\r\n\r\n" == buf async def test_write_payload_length(protocol, transport, loop) -> None: write = transport.write = mock.Mock() msg = http.StreamWriter(protocol, loop) msg.length = 2 await msg.write(b"d") await msg.write(b"ata") await msg.write_eof() content = b"".join([c[1][0] for c in list(write.mock_calls)]) assert b"da" == content.split(b"\r\n\r\n", 1)[-1] async def test_write_payload_chunked_filter(protocol, transport, loop) -> None: write = transport.write = mock.Mock() msg = http.StreamWriter(protocol, loop) msg.enable_chunking() await msg.write(b"da") await msg.write(b"ta") await msg.write_eof() content = b"".join([c[1][0] for c in list(write.mock_calls)]) assert content.endswith(b"2\r\nda\r\n2\r\nta\r\n0\r\n\r\n") async def test_write_payload_chunked_filter_mutiple_chunks(protocol, transport, loop): write = transport.write = mock.Mock() msg = http.StreamWriter(protocol, loop) msg.enable_chunking() await msg.write(b"da") await msg.write(b"ta") await msg.write(b"1d") await msg.write(b"at") await msg.write(b"a2") await msg.write_eof() content = b"".join([c[1][0] for c in list(write.mock_calls)]) assert content.endswith( b"2\r\nda\r\n2\r\nta\r\n2\r\n1d\r\n2\r\nat\r\n" b"2\r\na2\r\n0\r\n\r\n" ) async def test_write_payload_deflate_compression(protocol, transport, loop) -> None: COMPRESSED = b"x\x9cKI,I\x04\x00\x04\x00\x01\x9b" write = transport.write = mock.Mock() msg = http.StreamWriter(protocol, loop) msg.enable_compression("deflate") await msg.write(b"data") await msg.write_eof() chunks = [c[1][0] for c in list(write.mock_calls)] assert all(chunks) content = b"".join(chunks) assert COMPRESSED == content.split(b"\r\n\r\n", 1)[-1] async def test_write_payload_deflate_and_chunked(buf, protocol, transport, loop): msg = http.StreamWriter(protocol, loop) msg.enable_compression("deflate") msg.enable_chunking() await msg.write(b"da") await msg.write(b"ta") await msg.write_eof() thing = b"2\r\nx\x9c\r\n" b"a\r\nKI,I\x04\x00\x04\x00\x01\x9b\r\n" b"0\r\n\r\n" assert thing == buf async def test_write_payload_bytes_memoryview(buf, protocol, transport, loop): msg = http.StreamWriter(protocol, loop) mv = memoryview(b"abcd") await msg.write(mv) await msg.write_eof() thing = b"abcd" assert thing == buf async def test_write_payload_short_ints_memoryview(buf, protocol, transport, loop): msg = http.StreamWriter(protocol, loop) msg.enable_chunking() payload = memoryview(array.array("H", [65, 66, 67])) await msg.write(payload) await msg.write_eof() endians = ( (b"6\r\n" b"\x00A\x00B\x00C\r\n" b"0\r\n\r\n"), (b"6\r\n" b"A\x00B\x00C\x00\r\n" b"0\r\n\r\n"), ) assert buf in endians async def test_write_payload_2d_shape_memoryview(buf, protocol, transport, loop): msg = http.StreamWriter(protocol, loop) msg.enable_chunking() mv = memoryview(b"ABCDEF") payload = mv.cast("c", [3, 2]) await msg.write(payload) await msg.write_eof() thing = b"6\r\n" b"ABCDEF\r\n" b"0\r\n\r\n" assert thing == buf async def test_write_payload_slicing_long_memoryview(buf, protocol, transport, loop): msg = http.StreamWriter(protocol, loop) msg.length = 4 mv = memoryview(b"ABCDEF") payload = mv.cast("c", [3, 2]) await msg.write(payload) await msg.write_eof() thing = b"ABCD" assert thing == buf async def test_write_drain(protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) msg.drain = make_mocked_coro() await msg.write(b"1" * (64 * 1024 * 2), drain=False) assert not msg.drain.called await msg.write(b"1", drain=True) assert msg.drain.called assert msg.buffer_size == 0 async def test_write_calls_callback(protocol, transport, loop) -> None: on_chunk_sent = make_mocked_coro() msg = http.StreamWriter(protocol, loop, on_chunk_sent=on_chunk_sent) chunk = b"1" await msg.write(chunk) assert on_chunk_sent.called assert on_chunk_sent.call_args == mock.call(chunk) async def test_write_eof_calls_callback(protocol, transport, loop) -> None: on_chunk_sent = make_mocked_coro() msg = http.StreamWriter(protocol, loop, on_chunk_sent=on_chunk_sent) chunk = b"1" await msg.write_eof(chunk=chunk) assert on_chunk_sent.called assert on_chunk_sent.call_args == mock.call(chunk) async def test_write_to_closing_transport(protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) await msg.write(b"Before closing") transport.is_closing.return_value = True with pytest.raises(ConnectionResetError): await msg.write(b"After closing") async def test_drain(protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) await msg.drain() assert protocol._drain_helper.called async def test_drain_no_transport(protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) msg._protocol.transport = None await msg.drain() assert not protocol._drain_helper.called async def test_write_headers_prevents_injection(protocol, transport, loop) -> None: msg = http.StreamWriter(protocol, loop) status_line = "HTTP/1.1 200 OK" wrong_headers = CIMultiDict({"Set-Cookie: abc=123\r\nContent-Length": "256"}) with pytest.raises(ValueError): await msg.write_headers(status_line, wrong_headers) wrong_headers = CIMultiDict({"Content-Length": "256\r\nSet-Cookie: abc=123"}) with pytest.raises(ValueError): await msg.write_headers(status_line, wrong_headers) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_locks.py0000644000175100001710000000235500000000000016426 0ustar00runnerdocker# Tests of custom aiohttp locks implementations import asyncio import pytest from aiohttp.locks import EventResultOrError class TestEventResultOrError: async def test_set_exception(self, loop) -> None: ev = EventResultOrError(loop=loop) async def c(): try: await ev.wait() except Exception as e: return e return 1 t = loop.create_task(c()) await asyncio.sleep(0) e = Exception() ev.set(exc=e) assert (await t) == e async def test_set(self, loop) -> None: ev = EventResultOrError(loop=loop) async def c(): await ev.wait() return 1 t = loop.create_task(c()) await asyncio.sleep(0) ev.set() assert (await t) == 1 async def test_cancel_waiters(self, loop) -> None: ev = EventResultOrError(loop=loop) async def c(): await ev.wait() t1 = loop.create_task(c()) t2 = loop.create_task(c()) await asyncio.sleep(0) ev.cancel() ev.set() with pytest.raises(asyncio.CancelledError): await t1 with pytest.raises(asyncio.CancelledError): await t2 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_loop.py0000644000175100001710000000352600000000000016265 0ustar00runnerdockerimport asyncio import platform import threading import pytest from aiohttp import web from aiohttp.helpers import PY_38 from aiohttp.test_utils import AioHTTPTestCase, loop_context @pytest.mark.skipif( platform.system() == "Windows", reason="the test is not valid for Windows" ) async def test_subprocess_co(loop) -> None: assert PY_38 or isinstance(threading.current_thread(), threading._MainThread) proc = await asyncio.create_subprocess_shell( "exit 0", stdin=asyncio.subprocess.DEVNULL, stdout=asyncio.subprocess.DEVNULL, stderr=asyncio.subprocess.DEVNULL, ) await proc.wait() class TestCase(AioHTTPTestCase): async def get_application(self): app = web.Application() app.on_startup.append(self.on_startup_hook) return app async def on_startup_hook(self, app): self.on_startup_called = True async def test_on_startup_hook(self) -> None: self.assertTrue(self.on_startup_called) def test_default_loop(self) -> None: self.assertIs(self.loop, asyncio.get_event_loop_policy().get_event_loop()) def test_default_loop(loop) -> None: assert asyncio.get_event_loop_policy().get_event_loop() is loop @pytest.mark.xfail(not PY_38, reason="ThreadedChildWatcher is only available in 3.8+") def test_setup_loop_non_main_thread() -> None: child_exc = None def target() -> None: try: with loop_context() as loop: assert asyncio.get_event_loop_policy().get_event_loop() is loop loop.run_until_complete(test_subprocess_co(loop)) except Exception as exc: nonlocal child_exc child_exc = exc # Ensures setup_test_loop can be called by pytest-xdist in non-main thread. t = threading.Thread(target=target) t.start() t.join() assert child_exc is None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_multipart.py0000644000175100001710000012470200000000000017335 0ustar00runnerdockerimport asyncio import io import json import sys import zlib from unittest import mock import pytest import aiohttp from aiohttp import payload from aiohttp.hdrs import ( CONTENT_DISPOSITION, CONTENT_ENCODING, CONTENT_TRANSFER_ENCODING, CONTENT_TYPE, ) from aiohttp.helpers import parse_mimetype from aiohttp.multipart import MultipartResponseWrapper from aiohttp.streams import StreamReader from aiohttp.test_utils import make_mocked_coro BOUNDARY = b"--:" @pytest.fixture def buf(): return bytearray() @pytest.fixture def stream(buf): writer = mock.Mock() async def write(chunk): buf.extend(chunk) writer.write.side_effect = write return writer @pytest.fixture def writer(): return aiohttp.MultipartWriter(boundary=":") class Response: def __init__(self, headers, content): self.headers = headers self.content = content class Stream: def __init__(self, content): self.content = io.BytesIO(content) async def read(self, size=None): return self.content.read(size) def at_eof(self): return self.content.tell() == len(self.content.getbuffer()) async def readline(self): return self.content.readline() def unread_data(self, data): self.content = io.BytesIO(data + self.content.read()) class StreamWithShortenRead(Stream): def __init__(self, content): self._first = True super().__init__(content) async def read(self, size=None): if size is not None and self._first: self._first = False size = size // 2 return await super().read(size) class TestMultipartResponseWrapper: def test_at_eof(self) -> None: wrapper = MultipartResponseWrapper(mock.Mock(), mock.Mock()) wrapper.at_eof() assert wrapper.resp.content.at_eof.called async def test_next(self) -> None: wrapper = MultipartResponseWrapper(mock.Mock(), mock.Mock()) wrapper.stream.next = make_mocked_coro(b"") wrapper.stream.at_eof.return_value = False await wrapper.next() assert wrapper.stream.next.called async def test_release(self) -> None: wrapper = MultipartResponseWrapper(mock.Mock(), mock.Mock()) wrapper.resp.release = make_mocked_coro(None) await wrapper.release() assert wrapper.resp.release.called async def test_release_when_stream_at_eof(self) -> None: wrapper = MultipartResponseWrapper(mock.Mock(), mock.Mock()) wrapper.resp.release = make_mocked_coro(None) wrapper.stream.next = make_mocked_coro(b"") wrapper.stream.at_eof.return_value = True await wrapper.next() assert wrapper.stream.next.called assert wrapper.resp.release.called class TestPartReader: async def test_next(self) -> None: obj = aiohttp.BodyPartReader(BOUNDARY, {}, Stream(b"Hello, world!\r\n--:")) result = await obj.next() assert b"Hello, world!" == result assert obj.at_eof() async def test_next_next(self) -> None: obj = aiohttp.BodyPartReader(BOUNDARY, {}, Stream(b"Hello, world!\r\n--:")) result = await obj.next() assert b"Hello, world!" == result assert obj.at_eof() result = await obj.next() assert result is None async def test_read(self) -> None: obj = aiohttp.BodyPartReader(BOUNDARY, {}, Stream(b"Hello, world!\r\n--:")) result = await obj.read() assert b"Hello, world!" == result assert obj.at_eof() async def test_read_chunk_at_eof(self) -> None: obj = aiohttp.BodyPartReader(BOUNDARY, {}, Stream(b"--:")) obj._at_eof = True result = await obj.read_chunk() assert b"" == result async def test_read_chunk_without_content_length(self) -> None: obj = aiohttp.BodyPartReader(BOUNDARY, {}, Stream(b"Hello, world!\r\n--:")) c1 = await obj.read_chunk(8) c2 = await obj.read_chunk(8) c3 = await obj.read_chunk(8) assert c1 + c2 == b"Hello, world!" assert c3 == b"" async def test_read_incomplete_chunk(self) -> None: stream = Stream(b"") if sys.version_info >= (3, 8, 1): # Workaround for a weird behavior of patch.object def prepare(data): return data else: async def prepare(data): return data with mock.patch.object( stream, "read", side_effect=[ prepare(b"Hello, "), prepare(b"World"), prepare(b"!\r\n--:"), prepare(b""), ], ): obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) c1 = await obj.read_chunk(8) assert c1 == b"Hello, " c2 = await obj.read_chunk(8) assert c2 == b"World" c3 = await obj.read_chunk(8) assert c3 == b"!" async def test_read_all_at_once(self) -> None: stream = Stream(b"Hello, World!\r\n--:--\r\n") obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = await obj.read_chunk() assert b"Hello, World!" == result result = await obj.read_chunk() assert b"" == result assert obj.at_eof() async def test_read_incomplete_body_chunked(self) -> None: stream = Stream(b"Hello, World!\r\n-") obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = b"" with pytest.raises(AssertionError): for _ in range(4): result += await obj.read_chunk(7) assert b"Hello, World!\r\n-" == result async def test_read_boundary_with_incomplete_chunk(self) -> None: stream = Stream(b"") if sys.version_info >= (3, 8, 1): # Workaround for weird 3.8.1 patch.object() behavior def prepare(data): return data else: async def prepare(data): return data with mock.patch.object( stream, "read", side_effect=[ prepare(b"Hello, World"), prepare(b"!\r\n"), prepare(b"--:"), prepare(b""), ], ): obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) c1 = await obj.read_chunk(12) assert c1 == b"Hello, World" c2 = await obj.read_chunk(8) assert c2 == b"!" c3 = await obj.read_chunk(8) assert c3 == b"" async def test_multi_read_chunk(self) -> None: stream = Stream(b"Hello,\r\n--:\r\n\r\nworld!\r\n--:--") obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = await obj.read_chunk(8) assert b"Hello," == result result = await obj.read_chunk(8) assert b"" == result assert obj.at_eof() async def test_read_chunk_properly_counts_read_bytes(self) -> None: expected = b"." * 10 size = len(expected) obj = aiohttp.BodyPartReader( BOUNDARY, {"CONTENT-LENGTH": size}, StreamWithShortenRead(expected + b"\r\n--:--"), ) result = bytearray() while True: chunk = await obj.read_chunk() if not chunk: break result.extend(chunk) assert size == len(result) assert b"." * size == result assert obj.at_eof() async def test_read_does_not_read_boundary(self) -> None: stream = Stream(b"Hello, world!\r\n--:") obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) result = await obj.read() assert b"Hello, world!" == result assert b"--:" == (await stream.read()) async def test_multiread(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {}, Stream(b"Hello,\r\n--:\r\n\r\nworld!\r\n--:--") ) result = await obj.read() assert b"Hello," == result result = await obj.read() assert b"" == result assert obj.at_eof() async def test_read_multiline(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {}, Stream(b"Hello\n,\r\nworld!\r\n--:--") ) result = await obj.read() assert b"Hello\n,\r\nworld!" == result result = await obj.read() assert b"" == result assert obj.at_eof() async def test_read_respects_content_length(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {"CONTENT-LENGTH": 100500}, Stream(b"." * 100500 + b"\r\n--:--") ) result = await obj.read() assert b"." * 100500 == result assert obj.at_eof() async def test_read_with_content_encoding_gzip(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "gzip"}, Stream( b"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x0b\xc9\xccMU" b"(\xc9W\x08J\xcdI\xacP\x04\x00$\xfb\x9eV\x0e\x00\x00\x00" b"\r\n--:--" ), ) result = await obj.read(decode=True) assert b"Time to Relax!" == result async def test_read_with_content_encoding_deflate(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "deflate"}, Stream(b"\x0b\xc9\xccMU(\xc9W\x08J\xcdI\xacP\x04\x00\r\n--:--"), ) result = await obj.read(decode=True) assert b"Time to Relax!" == result async def test_read_with_content_encoding_identity(self) -> None: thing = ( b"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x0b\xc9\xccMU" b"(\xc9W\x08J\xcdI\xacP\x04\x00$\xfb\x9eV\x0e\x00\x00\x00" b"\r\n" ) obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "identity"}, Stream(thing + b"--:--") ) result = await obj.read(decode=True) assert thing[:-2] == result async def test_read_with_content_encoding_unknown(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "snappy"}, Stream(b"\x0e4Time to Relax!\r\n--:--"), ) with pytest.raises(RuntimeError): await obj.read(decode=True) async def test_read_with_content_transfer_encoding_base64(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TRANSFER_ENCODING: "base64"}, Stream(b"VGltZSB0byBSZWxheCE=\r\n--:--"), ) result = await obj.read(decode=True) assert b"Time to Relax!" == result async def test_read_with_content_transfer_encoding_quoted_printable(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TRANSFER_ENCODING: "quoted-printable"}, Stream( b"=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82," b" =D0=BC=D0=B8=D1=80!\r\n--:--" ), ) result = await obj.read(decode=True) expected = ( b"\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82," b" \xd0\xbc\xd0\xb8\xd1\x80!" ) assert result == expected @pytest.mark.parametrize("encoding", ("binary", "8bit", "7bit")) async def test_read_with_content_transfer_encoding_binary(self, encoding) -> None: data = ( b"\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82," b" \xd0\xbc\xd0\xb8\xd1\x80!" ) obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TRANSFER_ENCODING: encoding}, Stream(data + b"\r\n--:--") ) result = await obj.read(decode=True) assert data == result async def test_read_with_content_transfer_encoding_unknown(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TRANSFER_ENCODING: "unknown"}, Stream(b"\x0e4Time to Relax!\r\n--:--"), ) with pytest.raises(RuntimeError): await obj.read(decode=True) async def test_read_text(self) -> None: obj = aiohttp.BodyPartReader(BOUNDARY, {}, Stream(b"Hello, world!\r\n--:--")) result = await obj.text() assert "Hello, world!" == result async def test_read_text_default_encoding(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {}, Stream("Привет, Мир!\r\n--:--".encode()) ) result = await obj.text() assert "Привет, Мир!" == result async def test_read_text_encoding(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {}, Stream("Привет, Мир!\r\n--:--".encode("cp1251")) ) result = await obj.text(encoding="cp1251") assert "Привет, Мир!" == result async def test_read_text_guess_encoding(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "text/plain;charset=cp1251"}, Stream("Привет, Мир!\r\n--:--".encode("cp1251")), ) result = await obj.text() assert "Привет, Мир!" == result async def test_read_text_compressed(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "deflate", CONTENT_TYPE: "text/plain"}, Stream(b"\x0b\xc9\xccMU(\xc9W\x08J\xcdI\xacP\x04\x00\r\n--:--"), ) result = await obj.text() assert "Time to Relax!" == result async def test_read_text_while_closed(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "text/plain"}, Stream(b"") ) obj._at_eof = True result = await obj.text() assert "" == result async def test_read_json(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/json"}, Stream(b'{"test": "passed"}\r\n--:--'), ) result = await obj.json() assert {"test": "passed"} == result async def test_read_json_encoding(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/json"}, Stream('{"тест": "пассед"}\r\n--:--'.encode("cp1251")), ) result = await obj.json(encoding="cp1251") assert {"тест": "пассед"} == result async def test_read_json_guess_encoding(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/json; charset=cp1251"}, Stream('{"тест": "пассед"}\r\n--:--'.encode("cp1251")), ) result = await obj.json() assert {"тест": "пассед"} == result async def test_read_json_compressed(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_ENCODING: "deflate", CONTENT_TYPE: "application/json"}, Stream(b"\xabV*I-.Q\xb2RP*H,.NMQ\xaa\x05\x00\r\n--:--"), ) result = await obj.json() assert {"test": "passed"} == result async def test_read_json_while_closed(self) -> None: stream = Stream(b"") obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/json"}, stream ) obj._at_eof = True result = await obj.json() assert result is None async def test_read_form(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/x-www-form-urlencoded"}, Stream(b"foo=bar&foo=baz&boo=\r\n--:--"), ) result = await obj.form() assert [("foo", "bar"), ("foo", "baz"), ("boo", "")] == result async def test_read_form_encoding(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/x-www-form-urlencoded"}, Stream("foo=bar&foo=baz&boo=\r\n--:--".encode("cp1251")), ) result = await obj.form(encoding="cp1251") assert [("foo", "bar"), ("foo", "baz"), ("boo", "")] == result async def test_read_form_guess_encoding(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/x-www-form-urlencoded; charset=utf-8"}, Stream(b"foo=bar&foo=baz&boo=\r\n--:--"), ) result = await obj.form() assert [("foo", "bar"), ("foo", "baz"), ("boo", "")] == result async def test_read_form_while_closed(self) -> None: stream = Stream(b"") obj = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_TYPE: "application/x-www-form-urlencoded"}, stream ) obj._at_eof = True result = await obj.form() assert not result async def test_readline(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {}, Stream(b"Hello\n,\r\nworld!\r\n--:--") ) result = await obj.readline() assert b"Hello\n" == result result = await obj.readline() assert b",\r\n" == result result = await obj.readline() assert b"world!" == result result = await obj.readline() assert b"" == result assert obj.at_eof() async def test_release(self) -> None: stream = Stream(b"Hello,\r\n--:\r\n\r\nworld!\r\n--:--") obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) await obj.release() assert obj.at_eof() assert b"--:\r\n\r\nworld!\r\n--:--" == stream.content.read() async def test_release_respects_content_length(self) -> None: obj = aiohttp.BodyPartReader( BOUNDARY, {"CONTENT-LENGTH": 100500}, Stream(b"." * 100500 + b"\r\n--:--") ) result = await obj.release() assert result is None assert obj.at_eof() async def test_release_release(self) -> None: stream = Stream(b"Hello,\r\n--:\r\n\r\nworld!\r\n--:--") obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) await obj.release() await obj.release() assert b"--:\r\n\r\nworld!\r\n--:--" == stream.content.read() async def test_filename(self) -> None: part = aiohttp.BodyPartReader( BOUNDARY, {CONTENT_DISPOSITION: "attachment; filename=foo.html"}, None ) assert "foo.html" == part.filename async def test_reading_long_part(self) -> None: size = 2 * 2 ** 16 protocol = mock.Mock(_reading_paused=False) stream = StreamReader(protocol, 2 ** 16, loop=asyncio.get_event_loop()) stream.feed_data(b"0" * size + b"\r\n--:--") stream.feed_eof() obj = aiohttp.BodyPartReader(BOUNDARY, {}, stream) data = await obj.read() assert len(data) == size class TestMultipartReader: def test_from_response(self) -> None: resp = Response( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream(b"--:\r\n\r\nhello\r\n--:--"), ) res = aiohttp.MultipartReader.from_response(resp) assert isinstance(res, MultipartResponseWrapper) assert isinstance(res.stream, aiohttp.MultipartReader) def test_bad_boundary(self) -> None: resp = Response( {CONTENT_TYPE: "multipart/related;boundary=" + "a" * 80}, Stream(b"") ) with pytest.raises(ValueError): aiohttp.MultipartReader.from_response(resp) def test_dispatch(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream(b"--:\r\n\r\necho\r\n--:--"), ) res = reader._get_part_reader({CONTENT_TYPE: "text/plain"}) assert isinstance(res, reader.part_reader_cls) def test_dispatch_bodypart(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream(b"--:\r\n\r\necho\r\n--:--"), ) res = reader._get_part_reader({CONTENT_TYPE: "text/plain"}) assert isinstance(res, reader.part_reader_cls) def test_dispatch_multipart(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream( b"----:--\r\n" b"\r\n" b"test\r\n" b"----:--\r\n" b"\r\n" b"passed\r\n" b"----:----\r\n" b"--:--" ), ) res = reader._get_part_reader( {CONTENT_TYPE: "multipart/related;boundary=--:--"} ) assert isinstance(res, reader.__class__) def test_dispatch_custom_multipart_reader(self) -> None: class CustomReader(aiohttp.MultipartReader): pass reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream( b"----:--\r\n" b"\r\n" b"test\r\n" b"----:--\r\n" b"\r\n" b"passed\r\n" b"----:----\r\n" b"--:--" ), ) reader.multipart_reader_cls = CustomReader res = reader._get_part_reader( {CONTENT_TYPE: "multipart/related;boundary=--:--"} ) assert isinstance(res, CustomReader) async def test_emit_next(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream(b"--:\r\n\r\necho\r\n--:--"), ) res = await reader.next() assert isinstance(res, reader.part_reader_cls) async def test_invalid_boundary(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream(b"---:\r\n\r\necho\r\n---:--"), ) with pytest.raises(ValueError): await reader.next() async def test_release(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/mixed;boundary=":"'}, Stream( b"--:\r\n" b"Content-Type: multipart/related;boundary=--:--\r\n" b"\r\n" b"----:--\r\n" b"\r\n" b"test\r\n" b"----:--\r\n" b"\r\n" b"passed\r\n" b"----:----\r\n" b"\r\n" b"--:--" ), ) await reader.release() assert reader.at_eof() async def test_release_release(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream(b"--:\r\n\r\necho\r\n--:--"), ) await reader.release() assert reader.at_eof() await reader.release() assert reader.at_eof() async def test_release_next(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream(b"--:\r\n\r\necho\r\n--:--"), ) await reader.release() assert reader.at_eof() res = await reader.next() assert res is None async def test_second_next_releases_previous_object(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream( b"--:\r\n" b"\r\n" b"test\r\n" b"--:\r\n" b"\r\n" b"passed\r\n" b"--:--" ), ) first = await reader.next() assert isinstance(first, aiohttp.BodyPartReader) second = await reader.next() assert first.at_eof() assert not second.at_eof() async def test_release_without_read_the_last_object(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream( b"--:\r\n" b"\r\n" b"test\r\n" b"--:\r\n" b"\r\n" b"passed\r\n" b"--:--" ), ) first = await reader.next() second = await reader.next() third = await reader.next() assert first.at_eof() assert second.at_eof() assert second.at_eof() assert third is None async def test_read_chunk_by_length_doesnt_breaks_reader(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream( b"--:\r\n" b"Content-Length: 4\r\n\r\n" b"test" b"\r\n--:\r\n" b"Content-Length: 6\r\n\r\n" b"passed" b"\r\n--:--" ), ) body_parts = [] while True: read_part = b"" part = await reader.next() if part is None: break while not part.at_eof(): read_part += await part.read_chunk(3) body_parts.append(read_part) assert body_parts == [b"test", b"passed"] async def test_read_chunk_from_stream_doesnt_breaks_reader(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream( b"--:\r\n" b"\r\n" b"chunk" b"\r\n--:\r\n" b"\r\n" b"two_chunks" b"\r\n--:--" ), ) body_parts = [] while True: read_part = b"" part = await reader.next() if part is None: break while not part.at_eof(): chunk = await part.read_chunk(5) assert chunk read_part += chunk body_parts.append(read_part) assert body_parts == [b"chunk", b"two_chunks"] async def test_reading_skips_prelude(self) -> None: reader = aiohttp.MultipartReader( {CONTENT_TYPE: 'multipart/related;boundary=":"'}, Stream( b"Multi-part data is not supported.\r\n" b"\r\n" b"--:\r\n" b"\r\n" b"test\r\n" b"--:\r\n" b"\r\n" b"passed\r\n" b"--:--" ), ) first = await reader.next() assert isinstance(first, aiohttp.BodyPartReader) second = await reader.next() assert first.at_eof() assert not second.at_eof() async def test_writer(writer) -> None: assert writer.size == 7 assert writer.boundary == ":" async def test_writer_serialize_io_chunk(buf, stream, writer) -> None: flo = io.BytesIO(b"foobarbaz") writer.append(flo) await writer.write(stream) assert ( buf == b"--:\r\nContent-Type: application/octet-stream" b"\r\nContent-Length: 9\r\n\r\nfoobarbaz\r\n--:--\r\n" ) async def test_writer_serialize_json(buf, stream, writer) -> None: writer.append_json({"привет": "мир"}) await writer.write(stream) assert ( b'{"\\u043f\\u0440\\u0438\\u0432\\u0435\\u0442":' b' "\\u043c\\u0438\\u0440"}' in buf ) async def test_writer_serialize_form(buf, stream, writer) -> None: data = [("foo", "bar"), ("foo", "baz"), ("boo", "zoo")] writer.append_form(data) await writer.write(stream) assert b"foo=bar&foo=baz&boo=zoo" in buf async def test_writer_serialize_form_dict(buf, stream, writer) -> None: data = {"hello": "мир"} writer.append_form(data) await writer.write(stream) assert b"hello=%D0%BC%D0%B8%D1%80" in buf async def test_writer_write(buf, stream, writer) -> None: writer.append("foo-bar-baz") writer.append_json({"test": "passed"}) writer.append_form({"test": "passed"}) writer.append_form([("one", 1), ("two", 2)]) sub_multipart = aiohttp.MultipartWriter(boundary="::") sub_multipart.append("nested content") sub_multipart.headers["X-CUSTOM"] = "test" writer.append(sub_multipart) await writer.write(stream) assert ( b"--:\r\n" b"Content-Type: text/plain; charset=utf-8\r\n" b"Content-Length: 11\r\n\r\n" b"foo-bar-baz" b"\r\n" b"--:\r\n" b"Content-Type: application/json\r\n" b"Content-Length: 18\r\n\r\n" b'{"test": "passed"}' b"\r\n" b"--:\r\n" b"Content-Type: application/x-www-form-urlencoded\r\n" b"Content-Length: 11\r\n\r\n" b"test=passed" b"\r\n" b"--:\r\n" b"Content-Type: application/x-www-form-urlencoded\r\n" b"Content-Length: 11\r\n\r\n" b"one=1&two=2" b"\r\n" b"--:\r\n" b'Content-Type: multipart/mixed; boundary="::"\r\n' b"X-CUSTOM: test\r\nContent-Length: 93\r\n\r\n" b"--::\r\n" b"Content-Type: text/plain; charset=utf-8\r\n" b"Content-Length: 14\r\n\r\n" b"nested content\r\n" b"--::--\r\n" b"\r\n" b"--:--\r\n" ) == bytes(buf) async def test_writer_write_no_close_boundary(buf, stream) -> None: writer = aiohttp.MultipartWriter(boundary=":") writer.append("foo-bar-baz") writer.append_json({"test": "passed"}) writer.append_form({"test": "passed"}) writer.append_form([("one", 1), ("two", 2)]) await writer.write(stream, close_boundary=False) assert ( b"--:\r\n" b"Content-Type: text/plain; charset=utf-8\r\n" b"Content-Length: 11\r\n\r\n" b"foo-bar-baz" b"\r\n" b"--:\r\n" b"Content-Type: application/json\r\n" b"Content-Length: 18\r\n\r\n" b'{"test": "passed"}' b"\r\n" b"--:\r\n" b"Content-Type: application/x-www-form-urlencoded\r\n" b"Content-Length: 11\r\n\r\n" b"test=passed" b"\r\n" b"--:\r\n" b"Content-Type: application/x-www-form-urlencoded\r\n" b"Content-Length: 11\r\n\r\n" b"one=1&two=2" b"\r\n" ) == bytes(buf) async def test_writer_write_no_parts(buf, stream, writer) -> None: await writer.write(stream) assert b"--:--\r\n" == bytes(buf) async def test_writer_serialize_with_content_encoding_gzip(buf, stream, writer): writer.append("Time to Relax!", {CONTENT_ENCODING: "gzip"}) await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert ( b"--:\r\nContent-Type: text/plain; charset=utf-8\r\n" b"Content-Encoding: gzip" == headers ) decompressor = zlib.decompressobj(wbits=16 + zlib.MAX_WBITS) data = decompressor.decompress(message.split(b"\r\n")[0]) data += decompressor.flush() assert b"Time to Relax!" == data async def test_writer_serialize_with_content_encoding_deflate(buf, stream, writer): writer.append("Time to Relax!", {CONTENT_ENCODING: "deflate"}) await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert ( b"--:\r\nContent-Type: text/plain; charset=utf-8\r\n" b"Content-Encoding: deflate" == headers ) thing = b"\x0b\xc9\xccMU(\xc9W\x08J\xcdI\xacP\x04\x00\r\n--:--\r\n" assert thing == message async def test_writer_serialize_with_content_encoding_identity(buf, stream, writer): thing = b"\x0b\xc9\xccMU(\xc9W\x08J\xcdI\xacP\x04\x00" writer.append(thing, {CONTENT_ENCODING: "identity"}) await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert ( b"--:\r\nContent-Type: application/octet-stream\r\n" b"Content-Encoding: identity\r\n" b"Content-Length: 16" == headers ) assert thing == message.split(b"\r\n")[0] def test_writer_serialize_with_content_encoding_unknown(buf, stream, writer): with pytest.raises(RuntimeError): writer.append("Time to Relax!", {CONTENT_ENCODING: "snappy"}) async def test_writer_with_content_transfer_encoding_base64(buf, stream, writer): writer.append("Time to Relax!", {CONTENT_TRANSFER_ENCODING: "base64"}) await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert ( b"--:\r\nContent-Type: text/plain; charset=utf-8\r\n" b"Content-Transfer-Encoding: base64" == headers ) assert b"VGltZSB0byBSZWxheCE=" == message.split(b"\r\n")[0] async def test_writer_content_transfer_encoding_quote_printable(buf, stream, writer): writer.append("Привет, мир!", {CONTENT_TRANSFER_ENCODING: "quoted-printable"}) await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert ( b"--:\r\nContent-Type: text/plain; charset=utf-8\r\n" b"Content-Transfer-Encoding: quoted-printable" == headers ) assert ( b"=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82," b" =D0=BC=D0=B8=D1=80!" == message.split(b"\r\n")[0] ) def test_writer_content_transfer_encoding_unknown(buf, stream, writer) -> None: with pytest.raises(RuntimeError): writer.append("Time to Relax!", {CONTENT_TRANSFER_ENCODING: "unknown"}) class TestMultipartWriter: def test_default_subtype(self, writer) -> None: mimetype = parse_mimetype(writer.headers.get(CONTENT_TYPE)) assert "multipart" == mimetype.type assert "mixed" == mimetype.subtype def test_unquoted_boundary(self) -> None: writer = aiohttp.MultipartWriter(boundary="abc123") expected = {CONTENT_TYPE: "multipart/mixed; boundary=abc123"} assert expected == writer.headers def test_quoted_boundary(self) -> None: writer = aiohttp.MultipartWriter(boundary=R"\"") expected = {CONTENT_TYPE: R'multipart/mixed; boundary="\\\""'} assert expected == writer.headers def test_bad_boundary(self) -> None: with pytest.raises(ValueError): aiohttp.MultipartWriter(boundary="тест") with pytest.raises(ValueError): aiohttp.MultipartWriter(boundary="test\n") def test_default_headers(self, writer) -> None: expected = {CONTENT_TYPE: 'multipart/mixed; boundary=":"'} assert expected == writer.headers def test_iter_parts(self, writer) -> None: writer.append("foo") writer.append("bar") writer.append("baz") assert 3 == len(list(writer)) def test_append(self, writer) -> None: assert 0 == len(writer) writer.append("hello, world!") assert 1 == len(writer) assert isinstance(writer._parts[0][0], payload.Payload) def test_append_with_headers(self, writer) -> None: writer.append("hello, world!", {"x-foo": "bar"}) assert 1 == len(writer) assert "x-foo" in writer._parts[0][0].headers assert writer._parts[0][0].headers["x-foo"] == "bar" def test_append_json(self, writer) -> None: writer.append_json({"foo": "bar"}) assert 1 == len(writer) part = writer._parts[0][0] assert part.headers[CONTENT_TYPE] == "application/json" def test_append_part(self, writer) -> None: part = payload.get_payload("test", headers={CONTENT_TYPE: "text/plain"}) writer.append(part, {CONTENT_TYPE: "test/passed"}) assert 1 == len(writer) part = writer._parts[0][0] assert part.headers[CONTENT_TYPE] == "test/passed" def test_append_json_overrides_content_type(self, writer) -> None: writer.append_json({"foo": "bar"}, {CONTENT_TYPE: "test/passed"}) assert 1 == len(writer) part = writer._parts[0][0] assert part.headers[CONTENT_TYPE] == "test/passed" def test_append_form(self, writer) -> None: writer.append_form({"foo": "bar"}, {CONTENT_TYPE: "test/passed"}) assert 1 == len(writer) part = writer._parts[0][0] assert part.headers[CONTENT_TYPE] == "test/passed" def test_append_multipart(self, writer) -> None: subwriter = aiohttp.MultipartWriter(boundary=":") subwriter.append_json({"foo": "bar"}) writer.append(subwriter, {CONTENT_TYPE: "test/passed"}) assert 1 == len(writer) part = writer._parts[0][0] assert part.headers[CONTENT_TYPE] == "test/passed" def test_with(self) -> None: with aiohttp.MultipartWriter(boundary=":") as writer: writer.append("foo") writer.append(b"bar") writer.append_json({"baz": True}) assert 3 == len(writer) def test_append_int_not_allowed(self) -> None: with pytest.raises(TypeError): with aiohttp.MultipartWriter(boundary=":") as writer: writer.append(1) def test_append_float_not_allowed(self) -> None: with pytest.raises(TypeError): with aiohttp.MultipartWriter(boundary=":") as writer: writer.append(1.1) def test_append_none_not_allowed(self) -> None: with pytest.raises(TypeError): with aiohttp.MultipartWriter(boundary=":") as writer: writer.append(None) async def test_write_preserves_content_disposition(self, buf, stream) -> None: with aiohttp.MultipartWriter(boundary=":") as writer: part = writer.append(b"foo", headers={CONTENT_TYPE: "test/passed"}) part.set_content_disposition("form-data", filename="bug") await writer.write(stream) headers, message = bytes(buf).split(b"\r\n\r\n", 1) assert headers == ( b"--:\r\n" b"Content-Type: test/passed\r\n" b"Content-Length: 3\r\n" b"Content-Disposition:" b' form-data; filename="bug"' ) assert message == b"foo\r\n--:--\r\n" async def test_preserve_content_disposition_header(self, buf, stream): # https://github.com/aio-libs/aiohttp/pull/3475#issuecomment-451072381 with open(__file__, "rb") as fobj: with aiohttp.MultipartWriter("form-data", boundary=":") as writer: part = writer.append( fobj, headers={ CONTENT_DISPOSITION: 'attachments; filename="bug.py"', CONTENT_TYPE: "text/python", }, ) content_length = part.size await writer.write(stream) assert part.headers[CONTENT_TYPE] == "text/python" assert part.headers[CONTENT_DISPOSITION] == ('attachments; filename="bug.py"') headers, _ = bytes(buf).split(b"\r\n\r\n", 1) assert headers == ( b"--:\r\n" b"Content-Type: text/python\r\n" b'Content-Disposition: attachments; filename="bug.py"\r\n' b"Content-Length: %s" b"" % (str(content_length).encode(),) ) async def test_set_content_disposition_override(self, buf, stream): # https://github.com/aio-libs/aiohttp/pull/3475#issuecomment-451072381 with open(__file__, "rb") as fobj: with aiohttp.MultipartWriter("form-data", boundary=":") as writer: part = writer.append( fobj, headers={ CONTENT_DISPOSITION: 'attachments; filename="bug.py"', CONTENT_TYPE: "text/python", }, ) content_length = part.size await writer.write(stream) assert part.headers[CONTENT_TYPE] == "text/python" assert part.headers[CONTENT_DISPOSITION] == ('attachments; filename="bug.py"') headers, _ = bytes(buf).split(b"\r\n\r\n", 1) assert headers == ( b"--:\r\n" b"Content-Type: text/python\r\n" b'Content-Disposition: attachments; filename="bug.py"\r\n' b"Content-Length: %s" b"" % (str(content_length).encode(),) ) async def test_reset_content_disposition_header(self, buf, stream): # https://github.com/aio-libs/aiohttp/pull/3475#issuecomment-451072381 with open(__file__, "rb") as fobj: with aiohttp.MultipartWriter("form-data", boundary=":") as writer: part = writer.append( fobj, headers={CONTENT_TYPE: "text/plain"}, ) content_length = part.size assert CONTENT_DISPOSITION in part.headers part.set_content_disposition("attachments", filename="bug.py") await writer.write(stream) headers, _ = bytes(buf).split(b"\r\n\r\n", 1) assert headers == ( b"--:\r\n" b"Content-Type: text/plain\r\n" b"Content-Disposition:" b' attachments; filename="bug.py"\r\n' b"Content-Length: %s" b"" % (str(content_length).encode(),) ) async def test_async_for_reader() -> None: data = [{"test": "passed"}, 42, b"plain text", b"aiohttp\n", b"no epilogue"] reader = aiohttp.MultipartReader( headers={CONTENT_TYPE: 'multipart/mixed; boundary=":"'}, content=Stream( b"\r\n".join( [ b"--:", b"Content-Type: application/json", b"", json.dumps(data[0]).encode(), b"--:", b"Content-Type: application/json", b"", json.dumps(data[1]).encode(), b"--:", b'Content-Type: multipart/related; boundary="::"', b"", b"--::", b"Content-Type: text/plain", b"", data[2], b"--::", b'Content-Disposition: attachment; filename="aiohttp"', b"Content-Type: text/plain", b"Content-Length: 28", b"Content-Encoding: gzip", b"", b"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03K\xcc\xcc\xcf())" b"\xe0\x02\x00\xd6\x90\xe2O\x08\x00\x00\x00", b"--::", b'Content-Type: multipart/related; boundary=":::"', b"", b"--:::", b"Content-Type: text/plain", b"", data[4], b"--:::--", b"--::--", b"", b"--:--", b"", ] ) ), ) idata = iter(data) async def check(reader): async for part in reader: if isinstance(part, aiohttp.BodyPartReader): if part.headers[CONTENT_TYPE] == "application/json": assert next(idata) == (await part.json()) else: assert next(idata) == await part.read(decode=True) else: await check(part) await check(reader) async def test_async_for_bodypart() -> None: part = aiohttp.BodyPartReader( boundary=b"--:", headers={}, content=Stream(b"foobarbaz\r\n--:--") ) async for data in part: assert data == b"foobarbaz" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_multipart_helpers.py0000644000175100001710000006563400000000000021067 0ustar00runnerdockerimport pytest import aiohttp from aiohttp import content_disposition_filename, parse_content_disposition class TestParseContentDisposition: # http://greenbytes.de/tech/tc2231/ def test_parse_empty(self) -> None: disptype, params = parse_content_disposition(None) assert disptype is None assert {} == params def test_inlonly(self) -> None: disptype, params = parse_content_disposition("inline") assert "inline" == disptype assert {} == params def test_inlonlyquoted(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition('"inline"') assert disptype is None assert {} == params def test_semicolon(self) -> None: disptype, params = parse_content_disposition( 'form-data; name="data"; filename="file ; name.mp4"' ) assert disptype == "form-data" assert params == {"name": "data", "filename": "file ; name.mp4"} def test_inlwithasciifilename(self) -> None: disptype, params = parse_content_disposition('inline; filename="foo.html"') assert "inline" == disptype assert {"filename": "foo.html"} == params def test_inlwithfnattach(self) -> None: disptype, params = parse_content_disposition( 'inline; filename="Not an attachment!"' ) assert "inline" == disptype assert {"filename": "Not an attachment!"} == params def test_attonly(self) -> None: disptype, params = parse_content_disposition("attachment") assert "attachment" == disptype assert {} == params def test_attonlyquoted(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition('"attachment"') assert disptype is None assert {} == params def test_attonlyucase(self) -> None: disptype, params = parse_content_disposition("ATTACHMENT") assert "attachment" == disptype assert {} == params def test_attwithasciifilename(self) -> None: disptype, params = parse_content_disposition('attachment; filename="foo.html"') assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_inlwithasciifilenamepdf(self) -> None: disptype, params = parse_content_disposition('attachment; filename="foo.pdf"') assert "attachment" == disptype assert {"filename": "foo.pdf"} == params def test_attwithasciifilename25(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="0000000000111111111122222"' ) assert "attachment" == disptype assert {"filename": "0000000000111111111122222"} == params def test_attwithasciifilename35(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="00000000001111111111222222222233333"' ) assert "attachment" == disptype assert {"filename": "00000000001111111111222222222233333"} == params def test_attwithasciifnescapedchar(self) -> None: disptype, params = parse_content_disposition( r'attachment; filename="f\oo.html"' ) assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attwithasciifnescapedquote(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename=""quoting" tested.html"' ) assert "attachment" == disptype assert {"filename": '"quoting" tested.html'} == params @pytest.mark.skip("need more smart parser which respects quoted text") def test_attwithquotedsemicolon(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="Here\'s a semicolon;.html"' ) assert "attachment" == disptype assert {"filename": "Here's a semicolon;.html"} == params def test_attwithfilenameandextparam(self) -> None: disptype, params = parse_content_disposition( 'attachment; foo="bar"; filename="foo.html"' ) assert "attachment" == disptype assert {"filename": "foo.html", "foo": "bar"} == params def test_attwithfilenameandextparamescaped(self) -> None: disptype, params = parse_content_disposition( 'attachment; foo=""\\";filename="foo.html"' ) assert "attachment" == disptype assert {"filename": "foo.html", "foo": '"\\'} == params def test_attwithasciifilenameucase(self) -> None: disptype, params = parse_content_disposition('attachment; FILENAME="foo.html"') assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attwithasciifilenamenq(self) -> None: disptype, params = parse_content_disposition("attachment; filename=foo.html") assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attwithtokfncommanq(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo,bar.html" ) assert disptype is None assert {} == params def test_attwithasciifilenamenqs(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo.html ;" ) assert disptype is None assert {} == params def test_attemptyparam(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition("attachment; ;filename=foo") assert disptype is None assert {} == params def test_attwithasciifilenamenqws(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo bar.html" ) assert disptype is None assert {} == params def test_attwithfntokensq(self) -> None: disptype, params = parse_content_disposition("attachment; filename='foo.html'") assert "attachment" == disptype assert {"filename": "'foo.html'"} == params def test_attwithisofnplain(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-ä.html"' ) assert "attachment" == disptype assert {"filename": "foo-ä.html"} == params def test_attwithutf8fnplain(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-ä.html"' ) assert "attachment" == disptype assert {"filename": "foo-ä.html"} == params def test_attwithfnrawpctenca(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-%41.html"' ) assert "attachment" == disptype assert {"filename": "foo-%41.html"} == params def test_attwithfnusingpct(self) -> None: disptype, params = parse_content_disposition('attachment; filename="50%.html"') assert "attachment" == disptype assert {"filename": "50%.html"} == params def test_attwithfnrawpctencaq(self) -> None: disptype, params = parse_content_disposition( r'attachment; filename="foo-%\41.html"' ) assert "attachment" == disptype assert {"filename": r"foo-%41.html"} == params def test_attwithnamepct(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-%41.html"' ) assert "attachment" == disptype assert {"filename": "foo-%41.html"} == params def test_attwithfilenamepctandiso(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="ä-%41.html"' ) assert "attachment" == disptype assert {"filename": "ä-%41.html"} == params def test_attwithfnrawpctenclong(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-%c3%a4-%e2%82%ac.html"' ) assert "attachment" == disptype assert {"filename": "foo-%c3%a4-%e2%82%ac.html"} == params def test_attwithasciifilenamews1(self) -> None: disptype, params = parse_content_disposition('attachment; filename ="foo.html"') assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attwith2filenames(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( 'attachment; filename="foo.html"; filename="bar.html"' ) assert disptype is None assert {} == params def test_attfnbrokentoken(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo[1](2).html" ) assert disptype is None assert {} == params def test_attfnbrokentokeniso(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo-ä.html" ) assert disptype is None assert {} == params def test_attfnbrokentokenutf(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo-ä.html" ) assert disptype is None assert {} == params def test_attmissingdisposition(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition("filename=foo.html") assert disptype is None assert {} == params def test_attmissingdisposition2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition("x=y; filename=foo.html") assert disptype is None assert {} == params def test_attmissingdisposition3(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( '"foo; filename=bar;baz"; filename=qux' ) assert disptype is None assert {} == params def test_attmissingdisposition4(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "filename=foo.html, filename=bar.html" ) assert disptype is None assert {} == params def test_emptydisposition(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition("; filename=foo.html") assert disptype is None assert {} == params def test_doublecolon(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( ": inline; attachment; filename=foo.html" ) assert disptype is None assert {} == params def test_attandinline(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "inline; attachment; filename=foo.html" ) assert disptype is None assert {} == params def test_attandinline2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; inline; filename=foo.html" ) assert disptype is None assert {} == params def test_attbrokenquotedfn(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( 'attachment; filename="foo.html".txt' ) assert disptype is None assert {} == params def test_attbrokenquotedfn2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition('attachment; filename="bar') assert disptype is None assert {} == params def test_attbrokenquotedfn3(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( 'attachment; filename=foo"bar;baz"qux' ) assert disptype is None assert {} == params def test_attmultinstances(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=foo.html, attachment; filename=bar.html" ) assert disptype is None assert {} == params def test_attmissingdelim(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; foo=foo filename=bar" ) assert disptype is None assert {} == params def test_attmissingdelim2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename=bar foo=foo" ) assert disptype is None assert {} == params def test_attmissingdelim3(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition("attachment filename=bar") assert disptype is None assert {} == params def test_attreversed(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "filename=foo.html; attachment" ) assert disptype is None assert {} == params def test_attconfusedparam(self) -> None: disptype, params = parse_content_disposition("attachment; xfilename=foo.html") assert "attachment" == disptype assert {"xfilename": "foo.html"} == params def test_attabspath(self) -> None: disptype, params = parse_content_disposition('attachment; filename="/foo.html"') assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attabspathwin(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="\\foo.html"' ) assert "attachment" == disptype assert {"filename": "foo.html"} == params def test_attcdate(self) -> None: disptype, params = parse_content_disposition( 'attachment; creation-date="Wed, 12 Feb 1997 16:29:51 -0500"' ) assert "attachment" == disptype assert {"creation-date": "Wed, 12 Feb 1997 16:29:51 -0500"} == params def test_attmdate(self) -> None: disptype, params = parse_content_disposition( 'attachment; modification-date="Wed, 12 Feb 1997 16:29:51 -0500"' ) assert "attachment" == disptype assert {"modification-date": "Wed, 12 Feb 1997 16:29:51 -0500"} == params def test_dispext(self) -> None: disptype, params = parse_content_disposition("foobar") assert "foobar" == disptype assert {} == params def test_dispextbadfn(self) -> None: disptype, params = parse_content_disposition( 'attachment; example="filename=example.txt"' ) assert "attachment" == disptype assert {"example": "filename=example.txt"} == params def test_attwithisofn2231iso(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=iso-8859-1''foo-%E4.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä.html"} == params def test_attwithfn2231utf8(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''foo-%c3%a4-%e2%82%ac.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä-€.html"} == params def test_attwithfn2231noc(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=''foo-%c3%a4-%e2%82%ac.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä-€.html"} == params def test_attwithfn2231utf8comp(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''foo-a%cc%88.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä.html"} == params @pytest.mark.skip("should raise decoding error: %82 is invalid for latin1") def test_attwithfn2231utf8_bad(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=iso-8859-1''foo-%c3%a4-%e2%82%ac.html" ) assert "attachment" == disptype assert {} == params @pytest.mark.skip("should raise decoding error: %E4 is invalid for utf-8") def test_attwithfn2231iso_bad(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=utf-8''foo-%E4.html" ) assert "attachment" == disptype assert {} == params def test_attwithfn2231ws1(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename *=UTF-8''foo-%c3%a4.html" ) assert "attachment" == disptype assert {} == params def test_attwithfn2231ws2(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*= UTF-8''foo-%c3%a4.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä.html"} == params def test_attwithfn2231ws3(self) -> None: disptype, params = parse_content_disposition( "attachment; filename* =UTF-8''foo-%c3%a4.html" ) assert "attachment" == disptype assert {"filename*": "foo-ä.html"} == params def test_attwithfn2231quot(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=\"UTF-8''foo-%c3%a4.html\"" ) assert "attachment" == disptype assert {} == params def test_attwithfn2231quot2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( 'attachment; filename*="foo%20bar.html"' ) assert "attachment" == disptype assert {} == params def test_attwithfn2231singleqmissing(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=UTF-8'foo-%c3%a4.html" ) assert "attachment" == disptype assert {} == params @pytest.mark.skip("urllib.parse.unquote is tolerate to standalone % chars") def test_attwithfn2231nbadpct1(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''foo%" ) assert "attachment" == disptype assert {} == params @pytest.mark.skip("urllib.parse.unquote is tolerate to standalone % chars") def test_attwithfn2231nbadpct2(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''f%oo.html" ) assert "attachment" == disptype assert {} == params def test_attwithfn2231dpct(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''A-%2541.html" ) assert "attachment" == disptype assert {"filename*": "A-%41.html"} == params def test_attwithfn2231abspathdisguised(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''%5cfoo.html" ) assert "attachment" == disptype assert {"filename*": "\\foo.html"} == params def test_attfncont(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename*0="foo."; filename*1="html"' ) assert "attachment" == disptype assert {"filename*0": "foo.", "filename*1": "html"} == params def test_attfncontqs(self) -> None: disptype, params = parse_content_disposition( r'attachment; filename*0="foo"; filename*1="\b\a\r.html"' ) assert "attachment" == disptype assert {"filename*0": "foo", "filename*1": "bar.html"} == params def test_attfncontenc(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*0*=UTF-8" 'foo-%c3%a4; filename*1=".html"' ) assert "attachment" == disptype assert {"filename*0*": "UTF-8" "foo-%c3%a4", "filename*1": ".html"} == params def test_attfncontlz(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename*0="foo"; filename*01="bar"' ) assert "attachment" == disptype assert {"filename*0": "foo", "filename*01": "bar"} == params def test_attfncontnc(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename*0="foo"; filename*2="bar"' ) assert "attachment" == disptype assert {"filename*0": "foo", "filename*2": "bar"} == params def test_attfnconts1(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename*0="foo."; filename*2="html"' ) assert "attachment" == disptype assert {"filename*0": "foo.", "filename*2": "html"} == params def test_attfncontord(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename*1="bar"; filename*0="foo"' ) assert "attachment" == disptype assert {"filename*0": "foo", "filename*1": "bar"} == params def test_attfnboth(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="foo-ae.html";' " filename*=UTF-8''foo-%c3%a4.html" ) assert "attachment" == disptype assert {"filename": "foo-ae.html", "filename*": "foo-ä.html"} == params def test_attfnboth2(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*=UTF-8''foo-%c3%a4.html;" ' filename="foo-ae.html"' ) assert "attachment" == disptype assert {"filename": "foo-ae.html", "filename*": "foo-ä.html"} == params def test_attfnboth3(self) -> None: disptype, params = parse_content_disposition( "attachment; filename*0*=ISO-8859-15''euro-sign%3d%a4;" " filename*=ISO-8859-1''currency-sign%3d%a4" ) assert "attachment" == disptype assert { "filename*": "currency-sign=¤", "filename*0*": "ISO-8859-15''euro-sign%3d%a4", } == params def test_attnewandfn(self) -> None: disptype, params = parse_content_disposition( 'attachment; foobar=x; filename="foo.html"' ) assert "attachment" == disptype assert {"foobar": "x", "filename": "foo.html"} == params def test_attrfc2047token(self) -> None: with pytest.warns(aiohttp.BadContentDispositionHeader): disptype, params = parse_content_disposition( "attachment; filename==?ISO-8859-1?Q?foo-=E4.html?=" ) assert disptype is None assert {} == params def test_attrfc2047quoted(self) -> None: disptype, params = parse_content_disposition( 'attachment; filename="=?ISO-8859-1?Q?foo-=E4.html?="' ) assert "attachment" == disptype assert {"filename": "=?ISO-8859-1?Q?foo-=E4.html?="} == params def test_bad_continuous_param(self) -> None: with pytest.warns(aiohttp.BadContentDispositionParam): disptype, params = parse_content_disposition( "attachment; filename*0=foo bar" ) assert "attachment" == disptype assert {} == params class TestContentDispositionFilename: # http://greenbytes.de/tech/tc2231/ def test_no_filename(self) -> None: assert content_disposition_filename({}) is None assert content_disposition_filename({"foo": "bar"}) is None def test_filename(self) -> None: params = {"filename": "foo.html"} assert "foo.html" == content_disposition_filename(params) def test_filename_ext(self) -> None: params = {"filename*": "файл.html"} assert "файл.html" == content_disposition_filename(params) def test_attfncont(self) -> None: params = {"filename*0": "foo.", "filename*1": "html"} assert "foo.html" == content_disposition_filename(params) def test_attfncontqs(self) -> None: params = {"filename*0": "foo", "filename*1": "bar.html"} assert "foobar.html" == content_disposition_filename(params) def test_attfncontenc(self) -> None: params = {"filename*0*": "UTF-8''foo-%c3%a4", "filename*1": ".html"} assert "foo-ä.html" == content_disposition_filename(params) def test_attfncontlz(self) -> None: params = {"filename*0": "foo", "filename*01": "bar"} assert "foo" == content_disposition_filename(params) def test_attfncontnc(self) -> None: params = {"filename*0": "foo", "filename*2": "bar"} assert "foo" == content_disposition_filename(params) def test_attfnconts1(self) -> None: params = {"filename*1": "foo", "filename*2": "bar"} assert content_disposition_filename(params) is None def test_attfnboth(self) -> None: params = {"filename": "foo-ae.html", "filename*": "foo-ä.html"} assert "foo-ä.html" == content_disposition_filename(params) def test_attfnboth3(self) -> None: params = { "filename*0*": "ISO-8859-15''euro-sign%3d%a4", "filename*": "currency-sign=¤", } assert "currency-sign=¤" == content_disposition_filename(params) def test_attrfc2047quoted(self) -> None: params = {"filename": "=?ISO-8859-1?Q?foo-=E4.html?="} assert "=?ISO-8859-1?Q?foo-=E4.html?=" == content_disposition_filename(params) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_payload.py0000644000175100001710000000742100000000000016743 0ustar00runnerdockerimport array import asyncio from io import StringIO from unittest import mock import pytest from async_generator import async_generator from aiohttp import payload, streams @pytest.fixture def registry(): old = payload.PAYLOAD_REGISTRY reg = payload.PAYLOAD_REGISTRY = payload.PayloadRegistry() yield reg payload.PAYLOAD_REGISTRY = old class Payload(payload.Payload): async def write(self, writer): pass def test_register_type(registry) -> None: class TestProvider: pass payload.register_payload(Payload, TestProvider) p = payload.get_payload(TestProvider()) assert isinstance(p, Payload) def test_register_unsupported_order(registry) -> None: class TestProvider: pass with pytest.raises(ValueError): payload.register_payload( Payload, TestProvider, order=object() # type: ignore[arg-type] ) def test_payload_ctor() -> None: p = Payload("test", encoding="utf-8", filename="test.txt") assert p._value == "test" assert p._encoding == "utf-8" assert p.size is None assert p.filename == "test.txt" assert p.content_type == "text/plain" def test_payload_content_type() -> None: p = Payload("test", headers={"content-type": "application/json"}) assert p.content_type == "application/json" def test_bytes_payload_default_content_type() -> None: p = payload.BytesPayload(b"data") assert p.content_type == "application/octet-stream" def test_bytes_payload_explicit_content_type() -> None: p = payload.BytesPayload(b"data", content_type="application/custom") assert p.content_type == "application/custom" def test_bytes_payload_bad_type() -> None: with pytest.raises(TypeError): payload.BytesPayload(object()) # type: ignore[arg-type] def test_bytes_payload_memoryview_correct_size() -> None: mv = memoryview(array.array("H", [1, 2, 3])) p = payload.BytesPayload(mv) assert p.size == 6 def test_string_payload() -> None: p = payload.StringPayload("test") assert p.encoding == "utf-8" assert p.content_type == "text/plain; charset=utf-8" p = payload.StringPayload("test", encoding="koi8-r") assert p.encoding == "koi8-r" assert p.content_type == "text/plain; charset=koi8-r" p = payload.StringPayload("test", content_type="text/plain; charset=koi8-r") assert p.encoding == "koi8-r" assert p.content_type == "text/plain; charset=koi8-r" def test_string_io_payload() -> None: s = StringIO("ű" * 5000) p = payload.StringIOPayload(s) assert p.encoding == "utf-8" assert p.content_type == "text/plain; charset=utf-8" assert p.size == 10000 def test_async_iterable_payload_default_content_type() -> None: @async_generator async def gen(): pass p = payload.AsyncIterablePayload(gen()) assert p.content_type == "application/octet-stream" def test_async_iterable_payload_explicit_content_type() -> None: @async_generator async def gen(): pass p = payload.AsyncIterablePayload(gen(), content_type="application/custom") assert p.content_type == "application/custom" def test_async_iterable_payload_not_async_iterable() -> None: with pytest.raises(TypeError): payload.AsyncIterablePayload(object()) async def test_stream_reader_long_lines() -> None: loop = asyncio.get_event_loop() DATA = b"0" * 1024 ** 3 stream = streams.StreamReader(mock.Mock(), 2 ** 16, loop=loop) stream.feed_data(DATA) stream.feed_eof() body = payload.get_payload(stream) writer = mock.Mock() writer.write.return_value = loop.create_future() writer.write.return_value.set_result(None) await body.write(writer) writer.write.assert_called_once_with(mock.ANY) (chunk,), _ = writer.write.call_args assert len(chunk) == len(DATA) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_proxy.py0000644000175100001710000005772400000000000016506 0ustar00runnerdockerimport asyncio import gc import socket import ssl import unittest from unittest import mock import pytest from yarl import URL import aiohttp from aiohttp.client_reqrep import ClientRequest, ClientResponse from aiohttp.helpers import PY_37, TimerNoop from aiohttp.test_utils import make_mocked_coro class TestProxy(unittest.TestCase): response_mock_attrs = { "status": 200, } mocked_response = mock.Mock(**response_mock_attrs) clientrequest_mock_attrs = { "return_value.send.return_value.start": make_mocked_coro(mocked_response), } def setUp(self): self.loop = asyncio.new_event_loop() asyncio.set_event_loop(None) def tearDown(self): # just in case if we have transport close callbacks self.loop.stop() self.loop.run_forever() self.loop.close() gc.collect() @mock.patch("aiohttp.connector.ClientRequest") def test_connect(self, ClientRequestMock) -> None: req = ClientRequest( "GET", URL("http://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.assertEqual(str(req.proxy), "http://proxy.example.com") # mock all the things! async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro([mock.MagicMock()]) proto = mock.Mock( **{ "transport.get_extra_info.return_value": False, } ) self.loop.create_connection = make_mocked_coro((proto.transport, proto)) conn = self.loop.run_until_complete( connector.connect(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url, URL("http://www.python.org")) self.assertIs(conn._protocol, proto) self.assertIs(conn.transport, proto.transport) ClientRequestMock.assert_called_with( "GET", URL("http://proxy.example.com"), auth=None, headers={"Host": "www.python.org"}, loop=self.loop, ssl=None, ) conn.close() @mock.patch("aiohttp.connector.ClientRequest") def test_proxy_headers(self, ClientRequestMock) -> None: req = ClientRequest( "GET", URL("http://www.python.org"), proxy=URL("http://proxy.example.com"), proxy_headers={"Foo": "Bar"}, loop=self.loop, ) self.assertEqual(str(req.proxy), "http://proxy.example.com") # mock all the things! async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro([mock.MagicMock()]) proto = mock.Mock( **{ "transport.get_extra_info.return_value": False, } ) self.loop.create_connection = make_mocked_coro((proto.transport, proto)) conn = self.loop.run_until_complete( connector.connect(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url, URL("http://www.python.org")) self.assertIs(conn._protocol, proto) self.assertIs(conn.transport, proto.transport) ClientRequestMock.assert_called_with( "GET", URL("http://proxy.example.com"), auth=None, headers={"Host": "www.python.org", "Foo": "Bar"}, loop=self.loop, ssl=None, ) conn.close() def test_proxy_auth(self) -> None: with self.assertRaises(ValueError) as ctx: ClientRequest( "GET", URL("http://python.org"), proxy=URL("http://proxy.example.com"), proxy_auth=("user", "pass"), loop=mock.Mock(), ) self.assertEqual( ctx.exception.args[0], "proxy_auth must be None or BasicAuth() tuple", ) def test_proxy_dns_error(self) -> None: async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( raise_exception=OSError("dont take it serious") ) req = ClientRequest( "GET", URL("http://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) expected_headers = dict(req.headers) with self.assertRaises(aiohttp.ClientConnectorError): self.loop.run_until_complete( connector.connect(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url.path, "/") self.assertEqual(dict(req.headers), expected_headers) def test_proxy_connection_error(self) -> None: async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "www.python.org", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": socket.AI_NUMERICHOST, } ] ) connector._loop.create_connection = make_mocked_coro( raise_exception=OSError("dont take it serious") ) req = ClientRequest( "GET", URL("http://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) with self.assertRaises(aiohttp.ClientProxyConnectionError): self.loop.run_until_complete( connector.connect(req, None, aiohttp.ClientTimeout()) ) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() self.loop.create_connection = make_mocked_coro((tr, proto)) self.loop.start_tls = make_mocked_coro(mock.Mock()) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url.path, "/") self.assertEqual(proxy_req.method, "CONNECT") self.assertEqual(proxy_req.url, URL("https://www.python.org")) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close()) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect_certificate_error(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) # Called on connection to http://proxy.example.com self.loop.create_connection = make_mocked_coro((mock.Mock(), mock.Mock())) # Called on connection to https://www.python.org self.loop.start_tls = make_mocked_coro(raise_exception=ssl.CertificateError) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) with self.assertRaises(aiohttp.ClientConnectorCertificateError): self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect_ssl_error(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) # Called on connection to http://proxy.example.com self.loop.create_connection = make_mocked_coro( (mock.Mock(), mock.Mock()), ) # Called on connection to https://www.python.org self.loop.start_tls = make_mocked_coro(raise_exception=ssl.SSLError) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) with self.assertRaises(aiohttp.ClientConnectorSSLError): self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) @pytest.mark.skipif( PY_37, reason="The tested code path is only reachable below Python 3.7 because those " "versions don't yet have `asyncio.loop.start_tls()` implemeneted", ) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect_runtime_error(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() tr.get_extra_info.return_value = None self.loop.create_connection = make_mocked_coro((tr, proto)) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) with self.assertRaisesRegex( RuntimeError, "Transport does not expose socket instance" ): self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close()) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect_http_proxy_error(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=400, reason="bad request")) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() tr.get_extra_info.return_value = None self.loop.create_connection = make_mocked_coro((tr, proto)) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) with self.assertRaisesRegex( aiohttp.ClientHttpProxyError, "400, message='bad request'" ): self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close()) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect_resp_start_error(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(raise_exception=OSError("error message")) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() tr.get_extra_info.return_value = None self.loop.create_connection = make_mocked_coro((tr, proto)) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) with self.assertRaisesRegex(OSError, "error message"): self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) @mock.patch("aiohttp.connector.ClientRequest") def test_request_port(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() tr.get_extra_info.return_value = None self.loop.create_connection = make_mocked_coro((tr, proto)) req = ClientRequest( "GET", URL("http://localhost:1234/path"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url, URL("http://localhost:1234/path")) def test_proxy_auth_property(self) -> None: req = aiohttp.ClientRequest( "GET", URL("http://localhost:1234/path"), proxy=URL("http://proxy.example.com"), proxy_auth=aiohttp.helpers.BasicAuth("user", "pass"), loop=self.loop, ) self.assertEqual(("user", "pass", "latin1"), req.proxy_auth) def test_proxy_auth_property_default(self) -> None: req = aiohttp.ClientRequest( "GET", URL("http://localhost:1234/path"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.assertIsNone(req.proxy_auth) @mock.patch("aiohttp.connector.ClientRequest") def test_https_connect_pass_ssl_context(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), loop=self.loop ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() self.loop.create_connection = make_mocked_coro((tr, proto)) self.loop.start_tls = make_mocked_coro(mock.Mock()) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.loop.start_tls.assert_called_with( mock.ANY, mock.ANY, connector._make_ssl_context(True), server_hostname="www.python.org", ssl_handshake_timeout=mock.ANY, ) self.assertEqual(req.url.path, "/") self.assertEqual(proxy_req.method, "CONNECT") self.assertEqual(proxy_req.url, URL("https://www.python.org")) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close()) @mock.patch("aiohttp.connector.ClientRequest") def test_https_auth(self, ClientRequestMock) -> None: proxy_req = ClientRequest( "GET", URL("http://proxy.example.com"), auth=aiohttp.helpers.BasicAuth("user", "pass"), loop=self.loop, ) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse( "get", URL("http://proxy.example.com"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock(), ) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) async def make_conn(): return aiohttp.TCPConnector() connector = self.loop.run_until_complete(make_conn()) connector._resolve_host = make_mocked_coro( [ { "hostname": "hostname", "host": "127.0.0.1", "port": 80, "family": socket.AF_INET, "proto": 0, "flags": 0, } ] ) tr, proto = mock.Mock(), mock.Mock() self.loop.create_connection = make_mocked_coro((tr, proto)) self.loop.start_tls = make_mocked_coro(mock.Mock()) self.assertIn("AUTHORIZATION", proxy_req.headers) self.assertNotIn("PROXY-AUTHORIZATION", proxy_req.headers) req = ClientRequest( "GET", URL("https://www.python.org"), proxy=URL("http://proxy.example.com"), loop=self.loop, ) self.assertNotIn("AUTHORIZATION", req.headers) self.assertNotIn("PROXY-AUTHORIZATION", req.headers) self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()) ) self.assertEqual(req.url.path, "/") self.assertNotIn("AUTHORIZATION", req.headers) self.assertNotIn("PROXY-AUTHORIZATION", req.headers) self.assertNotIn("AUTHORIZATION", proxy_req.headers) self.assertIn("PROXY-AUTHORIZATION", proxy_req.headers) connector._resolve_host.assert_called_with( "proxy.example.com", 80, traces=mock.ANY ) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_proxy_functional.py0000644000175100001710000007040300000000000020715 0ustar00runnerdockerimport asyncio import functools import os import pathlib import platform from re import match as match_regex from unittest import mock from uuid import uuid4 import proxy import pytest from yarl import URL import aiohttp from aiohttp import web from aiohttp.client_exceptions import ClientConnectionError, ClientProxyConnectionError from aiohttp.helpers import IS_MACOS, IS_WINDOWS, PY_37, PY_310 secure_proxy_xfail_under_py310_linux = functools.partial( pytest.mark.xfail, PY_310 and platform.system() == "Linux", reason=( "The secure proxy fixture does not seem to work " "under Python 3.10 on Linux. " "See https://github.com/abhinavsingh/proxy.py/issues/622." ), ) ASYNCIO_SUPPORTS_TLS_IN_TLS = hasattr( asyncio.sslproto._SSLProtocolTransport, "_start_tls_compatible", ) @pytest.fixture def secure_proxy_url(monkeypatch, tls_certificate_pem_path): """Return the URL of an instance of a running secure proxy. This fixture also spawns that instance and tears it down after the test. """ proxypy_args = [ "--num-workers", "1", # the tests only send one query anyway "--hostname", "127.0.0.1", # network interface to listen to "--port", 0, # ephemeral port, so that kernel allocates a free one "--cert-file", tls_certificate_pem_path, # contains both key and cert "--key-file", tls_certificate_pem_path, # contains both key and cert ] if not IS_MACOS and not IS_WINDOWS: proxypy_args.append("--threadless") # use asyncio class PatchedAccetorPool(proxy.core.acceptor.AcceptorPool): def listen(self): super().listen() self.socket_host, self.socket_port = self.socket.getsockname()[:2] monkeypatch.setattr(proxy.proxy, "AcceptorPool", PatchedAccetorPool) with proxy.Proxy(input_args=proxypy_args) as proxy_instance: yield URL.build( scheme="https", host=proxy_instance.acceptors.socket_host, port=proxy_instance.acceptors.socket_port, ) @pytest.fixture def web_server_endpoint_payload(): return str(uuid4()) @pytest.fixture(params=("http", "https")) def web_server_endpoint_type(request): return request.param @pytest.fixture async def web_server_endpoint_url( aiohttp_server, ssl_ctx, web_server_endpoint_payload, web_server_endpoint_type, ): server_kwargs = ( { "ssl": ssl_ctx, } if web_server_endpoint_type == "https" else {} ) async def handler(*args, **kwargs): return web.Response(text=web_server_endpoint_payload) app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app, **server_kwargs) return URL.build( scheme=web_server_endpoint_type, host=server.host, port=server.port, ) @pytest.fixture def _pretend_asyncio_supports_tls_in_tls( monkeypatch, web_server_endpoint_type, ): if web_server_endpoint_type != "https" or ASYNCIO_SUPPORTS_TLS_IN_TLS: return # for https://github.com/python/cpython/pull/28073 # and https://bugs.python.org/issue37179 monkeypatch.setattr( asyncio.sslproto._SSLProtocolTransport, "_start_tls_compatible", True, raising=False, ) @secure_proxy_xfail_under_py310_linux(raises=ClientProxyConnectionError) @pytest.mark.parametrize( "web_server_endpoint_type", ( "http", pytest.param( "https", marks=pytest.mark.xfail( not PY_37, raises=RuntimeError, reason="`asyncio.loop.start_tls()` is only implemeneted in Python 3.7", ), ), ), ) @pytest.mark.usefixtures("_pretend_asyncio_supports_tls_in_tls", "loop") async def test_secure_https_proxy_absolute_path( client_ssl_ctx, secure_proxy_url, web_server_endpoint_url, web_server_endpoint_payload, ) -> None: """Ensure HTTP(S) sites are accessible through a secure proxy.""" conn = aiohttp.TCPConnector() sess = aiohttp.ClientSession(connector=conn) response = await sess.get( web_server_endpoint_url, proxy=secure_proxy_url, ssl=client_ssl_ctx, # used for both proxy and endpoint connections ) assert response.status == 200 assert await response.text() == web_server_endpoint_payload response.close() await sess.close() await conn.close() # https://docs.aiohttp.org/en/v3.8.0/client_advanced.html#graceful-shutdown await asyncio.sleep(0.1) @secure_proxy_xfail_under_py310_linux(raises=AssertionError) @pytest.mark.xfail( not PY_37, raises=RuntimeError, reason="`asyncio.loop.start_tls()` is only implemeneted in Python 3.7", ) @pytest.mark.parametrize("web_server_endpoint_type", ("https",)) @pytest.mark.usefixtures("loop") async def test_https_proxy_unsupported_tls_in_tls( client_ssl_ctx, secure_proxy_url, web_server_endpoint_type, ) -> None: """Ensure connecting to TLS endpoints w/ HTTPS proxy needs patching. This also checks that a helpful warning on how to patch the env is displayed. """ url = URL.build(scheme=web_server_endpoint_type, host="python.org") escaped_host_port = ":".join((url.host.replace(".", r"\."), str(url.port))) escaped_proxy_url = str(secure_proxy_url).replace(".", r"\.") conn = aiohttp.TCPConnector() sess = aiohttp.ClientSession(connector=conn) expected_warning_text = ( r"^" r"An HTTPS request is being sent through an HTTPS proxy\. " "This support for TLS in TLS is known to be disabled " r"in the stdlib asyncio\. This is why you'll probably see " r"an error in the log below\.\n\n" "It is possible to enable it via monkeypatching under " r"Python 3\.7 or higher\. For more details, see:\n" r"\* https://bugs\.python\.org/issue37179\n" r"\* https://github\.com/python/cpython/pull/28073\n\n" r"You can temporarily patch this as follows:\n" r"\* https://docs\.aiohttp\.org/en/stable/client_advanced\.html#proxy-support\n" r"\* https://github\.com/aio-libs/aiohttp/discussions/6044\n$" ) type_err = ( r"transport is not supported by start_tls\(\)" ) expected_exception_reason = ( r"^" "Cannot initialize a TLS-in-TLS connection to host " f"{escaped_host_port!s} through an underlying connection " f"to an HTTPS proxy {escaped_proxy_url!s} ssl:{client_ssl_ctx!s} " f"[{type_err!s}]" r"$" ) with pytest.warns(RuntimeWarning, match=expected_warning_text,), pytest.raises( ClientConnectionError, match=expected_exception_reason, ) as conn_err: await sess.get(url, proxy=secure_proxy_url, ssl=client_ssl_ctx) assert type(conn_err.value.__cause__) == TypeError assert match_regex(f"^{type_err!s}$", str(conn_err.value.__cause__)) await sess.close() await conn.close() @pytest.mark.skipif( PY_37, reason="This test checks an error we emit below Python 3.7", ) @pytest.mark.usefixtures("loop") async def test_https_proxy_missing_start_tls() -> None: """Ensure error is raised for TLS-in-TLS w/ no ``start_tls()``.""" conn = aiohttp.TCPConnector() sess = aiohttp.ClientSession(connector=conn) expected_exception_reason = ( r"^" r"An HTTPS request is being sent through an HTTPS proxy\. " "This needs support for TLS in TLS but it is not implemented " r"in your runtime for the stdlib asyncio\.\n\n" r"Please upgrade to Python 3\.7 or higher\. For more details, " r"please see:\n" r"\* https://bugs\.python\.org/issue37179\n" r"\* https://github\.com/python/cpython/pull/28073\n" r"\* https://docs\.aiohttp\.org/en/stable/client_advanced\.html#proxy-support\n" r"\* https://github\.com/aio-libs/aiohttp/discussions/6044\n" r"$" ) with pytest.raises( RuntimeError, match=expected_exception_reason, ) as runtime_err: await sess.get("https://python.org", proxy="https://proxy") await sess.close() await conn.close() assert type(runtime_err.value.__cause__) is AttributeError selector_event_loop_type = "Windows" if IS_WINDOWS else "Unix" attr_err = ( f"^'_{selector_event_loop_type}SelectorEventLoop' object " "has no attribute 'start_tls'$" ) assert match_regex(attr_err, str(runtime_err.value.__cause__)) @pytest.fixture def proxy_test_server(aiohttp_raw_server, loop, monkeypatch): # Handle all proxy requests and imitate remote server response. _patch_ssl_transport(monkeypatch) default_response = dict(status=200, headers=None, body=None) proxy_mock = mock.Mock() async def proxy_handler(request): proxy_mock.request = request proxy_mock.requests_list.append(request) response = default_response.copy() if isinstance(proxy_mock.return_value, dict): response.update(proxy_mock.return_value) headers = response["headers"] if not headers: headers = {} if request.method == "CONNECT": response["body"] = None response["headers"] = headers resp = web.Response(**response) await resp.prepare(request) await resp.write_eof() return resp async def proxy_server(): proxy_mock.request = None proxy_mock.auth = None proxy_mock.requests_list = [] server = await aiohttp_raw_server(proxy_handler) proxy_mock.server = server proxy_mock.url = server.make_url("/") return proxy_mock return proxy_server @pytest.fixture() def get_request(loop): async def _request(method="GET", *, url, trust_env=False, **kwargs): connector = aiohttp.TCPConnector(ssl=False, loop=loop) client = aiohttp.ClientSession(connector=connector, trust_env=trust_env) try: resp = await client.request(method, url, **kwargs) await resp.release() return resp finally: await client.close() return _request async def test_proxy_http_absolute_path(proxy_test_server, get_request) -> None: url = "http://aiohttp.io/path?query=yes" proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "http://aiohttp.io/path?query=yes" async def test_proxy_http_raw_path(proxy_test_server, get_request) -> None: url = "http://aiohttp.io:2561/space sheep?q=can:fly" raw_url = "http://aiohttp.io:2561/space%20sheep?q=can:fly" proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) assert proxy.request.host == "aiohttp.io:2561" assert proxy.request.path_qs == raw_url async def test_proxy_http_idna_support(proxy_test_server, get_request) -> None: url = "http://éé.com/" raw_url = "http://xn--9caa.com/" proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) assert proxy.request.host == "xn--9caa.com" assert proxy.request.path_qs == raw_url async def test_proxy_http_connection_error(get_request) -> None: url = "http://aiohttp.io/path" proxy_url = "http://localhost:2242/" with pytest.raises(aiohttp.ClientConnectorError): await get_request(url=url, proxy=proxy_url) async def test_proxy_http_bad_response(proxy_test_server, get_request) -> None: url = "http://aiohttp.io/path" proxy = await proxy_test_server() proxy.return_value = dict(status=502, headers={"Proxy-Agent": "TestProxy"}) resp = await get_request(url=url, proxy=proxy.url) assert resp.status == 502 assert resp.headers["Proxy-Agent"] == "TestProxy" async def test_proxy_http_auth(proxy_test_server, get_request) -> None: url = "http://aiohttp.io/path" proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) assert "Authorization" not in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers auth = aiohttp.BasicAuth("user", "pass") await get_request(url=url, auth=auth, proxy=proxy.url) assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers await get_request(url=url, proxy_auth=auth, proxy=proxy.url) assert "Authorization" not in proxy.request.headers assert "Proxy-Authorization" in proxy.request.headers await get_request(url=url, auth=auth, proxy_auth=auth, proxy=proxy.url) assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" in proxy.request.headers async def test_proxy_http_auth_utf8(proxy_test_server, get_request) -> None: url = "http://aiohttp.io/path" auth = aiohttp.BasicAuth("юзер", "пасс", "utf-8") proxy = await proxy_test_server() await get_request(url=url, auth=auth, proxy=proxy.url) assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers async def test_proxy_http_auth_from_url(proxy_test_server, get_request) -> None: url = "http://aiohttp.io/path" proxy = await proxy_test_server() auth_url = URL(url).with_user("user").with_password("pass") await get_request(url=auth_url, proxy=proxy.url) assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers proxy_url = URL(proxy.url).with_user("user").with_password("pass") await get_request(url=url, proxy=proxy_url) assert "Authorization" not in proxy.request.headers assert "Proxy-Authorization" in proxy.request.headers async def test_proxy_http_acquired_cleanup(proxy_test_server, loop) -> None: url = "http://aiohttp.io/path" conn = aiohttp.TCPConnector(loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() assert 0 == len(conn._acquired) resp = await sess.get(url, proxy=proxy.url) assert resp.closed assert 0 == len(conn._acquired) await sess.close() @pytest.mark.skip("we need to reconsider how we test this") async def test_proxy_http_acquired_cleanup_force(proxy_test_server, loop) -> None: url = "http://aiohttp.io/path" conn = aiohttp.TCPConnector(force_close=True, loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() assert 0 == len(conn._acquired) async def request(): resp = await sess.get(url, proxy=proxy.url) assert 1 == len(conn._acquired) await resp.release() await request() assert 0 == len(conn._acquired) await sess.close() @pytest.mark.skip("we need to reconsider how we test this") async def test_proxy_http_multi_conn_limit(proxy_test_server, loop) -> None: url = "http://aiohttp.io/path" limit, multi_conn_num = 1, 5 conn = aiohttp.TCPConnector(limit=limit, loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() current_pid = None async def request(pid): # process requests only one by one nonlocal current_pid resp = await sess.get(url, proxy=proxy.url) current_pid = pid await asyncio.sleep(0.2, loop=loop) assert current_pid == pid await resp.release() return resp requests = [request(pid) for pid in range(multi_conn_num)] responses = await asyncio.gather(*requests, loop=loop) assert len(responses) == multi_conn_num assert {resp.status for resp in responses} == {200} await sess.close() @pytest.mark.xfail async def xtest_proxy_https_connect(proxy_test_server, get_request): proxy = await proxy_test_server() url = "https://www.google.com.ua/search?q=aiohttp proxy" await get_request(url=url, proxy=proxy.url) connect = proxy.requests_list[0] assert connect.method == "CONNECT" assert connect.path == "www.google.com.ua:443" assert connect.host == "www.google.com.ua" assert proxy.request.host == "www.google.com.ua" assert proxy.request.path_qs == "/search?q=aiohttp+proxy" @pytest.mark.xfail async def xtest_proxy_https_connect_with_port(proxy_test_server, get_request): proxy = await proxy_test_server() url = "https://secure.aiohttp.io:2242/path" await get_request(url=url, proxy=proxy.url) connect = proxy.requests_list[0] assert connect.method == "CONNECT" assert connect.path == "secure.aiohttp.io:2242" assert connect.host == "secure.aiohttp.io:2242" assert proxy.request.host == "secure.aiohttp.io:2242" assert proxy.request.path_qs == "/path" @pytest.mark.xfail async def xtest_proxy_https_send_body(proxy_test_server, loop): sess = aiohttp.ClientSession(loop=loop) proxy = await proxy_test_server() proxy.return_value = {"status": 200, "body": b"1" * (2 ** 20)} url = "https://www.google.com.ua/search?q=aiohttp proxy" resp = await sess.get(url, proxy=proxy.url) body = await resp.read() await resp.release() await sess.close() assert body == b"1" * (2 ** 20) @pytest.mark.xfail async def xtest_proxy_https_idna_support(proxy_test_server, get_request): url = "https://éé.com/" proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) connect = proxy.requests_list[0] assert connect.method == "CONNECT" assert connect.path == "xn--9caa.com:443" assert connect.host == "xn--9caa.com" async def test_proxy_https_connection_error(get_request) -> None: url = "https://secure.aiohttp.io/path" proxy_url = "http://localhost:2242/" with pytest.raises(aiohttp.ClientConnectorError): await get_request(url=url, proxy=proxy_url) async def test_proxy_https_bad_response(proxy_test_server, get_request) -> None: url = "https://secure.aiohttp.io/path" proxy = await proxy_test_server() proxy.return_value = dict(status=502, headers={"Proxy-Agent": "TestProxy"}) with pytest.raises(aiohttp.ClientHttpProxyError): await get_request(url=url, proxy=proxy.url) assert len(proxy.requests_list) == 1 assert proxy.request.method == "CONNECT" # The following check fails on MacOS # assert proxy.request.path == 'secure.aiohttp.io:443' @pytest.mark.xfail async def xtest_proxy_https_auth(proxy_test_server, get_request): url = "https://secure.aiohttp.io/path" auth = aiohttp.BasicAuth("user", "pass") proxy = await proxy_test_server() await get_request(url=url, proxy=proxy.url) connect = proxy.requests_list[0] assert "Authorization" not in connect.headers assert "Proxy-Authorization" not in connect.headers assert "Authorization" not in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers proxy = await proxy_test_server() await get_request(url=url, auth=auth, proxy=proxy.url) connect = proxy.requests_list[0] assert "Authorization" not in connect.headers assert "Proxy-Authorization" not in connect.headers assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers proxy = await proxy_test_server() await get_request(url=url, proxy_auth=auth, proxy=proxy.url) connect = proxy.requests_list[0] assert "Authorization" not in connect.headers assert "Proxy-Authorization" in connect.headers assert "Authorization" not in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers proxy = await proxy_test_server() await get_request(url=url, auth=auth, proxy_auth=auth, proxy=proxy.url) connect = proxy.requests_list[0] assert "Authorization" not in connect.headers assert "Proxy-Authorization" in connect.headers assert "Authorization" in proxy.request.headers assert "Proxy-Authorization" not in proxy.request.headers @pytest.mark.xfail async def xtest_proxy_https_acquired_cleanup(proxy_test_server, loop): url = "https://secure.aiohttp.io/path" conn = aiohttp.TCPConnector(loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() assert 0 == len(conn._acquired) async def request(): resp = await sess.get(url, proxy=proxy.url) assert 1 == len(conn._acquired) await resp.release() await request() assert 0 == len(conn._acquired) await sess.close() @pytest.mark.xfail async def xtest_proxy_https_acquired_cleanup_force(proxy_test_server, loop): url = "https://secure.aiohttp.io/path" conn = aiohttp.TCPConnector(force_close=True, loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() assert 0 == len(conn._acquired) async def request(): resp = await sess.get(url, proxy=proxy.url) assert 1 == len(conn._acquired) await resp.release() await request() assert 0 == len(conn._acquired) await sess.close() @pytest.mark.xfail async def xtest_proxy_https_multi_conn_limit(proxy_test_server, loop): url = "https://secure.aiohttp.io/path" limit, multi_conn_num = 1, 5 conn = aiohttp.TCPConnector(limit=limit, loop=loop) sess = aiohttp.ClientSession(connector=conn, loop=loop) proxy = await proxy_test_server() current_pid = None async def request(pid): # process requests only one by one nonlocal current_pid resp = await sess.get(url, proxy=proxy.url) current_pid = pid await asyncio.sleep(0.2, loop=loop) assert current_pid == pid await resp.release() return resp requests = [request(pid) for pid in range(multi_conn_num)] responses = await asyncio.gather(*requests, loop=loop) assert len(responses) == multi_conn_num assert {resp.status for resp in responses} == {200} await sess.close() def _patch_ssl_transport(monkeypatch): # Make ssl transport substitution to prevent ssl handshake. def _make_ssl_transport_dummy( self, rawsock, protocol, sslcontext, waiter=None, **kwargs ): return self._make_socket_transport( rawsock, protocol, waiter, extra=kwargs.get("extra"), server=kwargs.get("server"), ) monkeypatch.setattr( "asyncio.selector_events.BaseSelectorEventLoop._make_ssl_transport", _make_ssl_transport_dummy, ) original_is_file = pathlib.Path.is_file def mock_is_file(self): # make real netrc file invisible in home dir if self.name in ["_netrc", ".netrc"] and self.parent == self.home(): return False else: return original_is_file(self) async def test_proxy_from_env_http(proxy_test_server, get_request, mocker) -> None: url = "http://aiohttp.io/path" proxy = await proxy_test_server() mocker.patch.dict(os.environ, {"http_proxy": str(proxy.url)}) mocker.patch("pathlib.Path.is_file", mock_is_file) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "http://aiohttp.io/path" assert "Proxy-Authorization" not in proxy.request.headers async def test_proxy_from_env_http_with_auth(proxy_test_server, get_request, mocker): url = "http://aiohttp.io/path" proxy = await proxy_test_server() auth = aiohttp.BasicAuth("user", "pass") mocker.patch.dict( os.environ, { "http_proxy": str( proxy.url.with_user(auth.login).with_password(auth.password) ) }, ) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "http://aiohttp.io/path" assert proxy.request.headers["Proxy-Authorization"] == auth.encode() async def test_proxy_from_env_http_with_auth_from_netrc( proxy_test_server, get_request, tmpdir, mocker ): url = "http://aiohttp.io/path" proxy = await proxy_test_server() auth = aiohttp.BasicAuth("user", "pass") netrc_file = tmpdir.join("test_netrc") netrc_file_data = "machine 127.0.0.1 login {} password {}".format( auth.login, auth.password, ) with open(str(netrc_file), "w") as f: f.write(netrc_file_data) mocker.patch.dict( os.environ, {"http_proxy": str(proxy.url), "NETRC": str(netrc_file)} ) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "http://aiohttp.io/path" assert proxy.request.headers["Proxy-Authorization"] == auth.encode() async def test_proxy_from_env_http_without_auth_from_netrc( proxy_test_server, get_request, tmpdir, mocker ): url = "http://aiohttp.io/path" proxy = await proxy_test_server() auth = aiohttp.BasicAuth("user", "pass") netrc_file = tmpdir.join("test_netrc") netrc_file_data = "machine 127.0.0.2 login {} password {}".format( auth.login, auth.password, ) with open(str(netrc_file), "w") as f: f.write(netrc_file_data) mocker.patch.dict( os.environ, {"http_proxy": str(proxy.url), "NETRC": str(netrc_file)} ) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "http://aiohttp.io/path" assert "Proxy-Authorization" not in proxy.request.headers async def test_proxy_from_env_http_without_auth_from_wrong_netrc( proxy_test_server, get_request, tmpdir, mocker ): url = "http://aiohttp.io/path" proxy = await proxy_test_server() auth = aiohttp.BasicAuth("user", "pass") netrc_file = tmpdir.join("test_netrc") invalid_data = f"machine 127.0.0.1 {auth.login} pass {auth.password}" with open(str(netrc_file), "w") as f: f.write(invalid_data) mocker.patch.dict( os.environ, {"http_proxy": str(proxy.url), "NETRC": str(netrc_file)} ) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 1 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "http://aiohttp.io/path" assert "Proxy-Authorization" not in proxy.request.headers @pytest.mark.xfail async def xtest_proxy_from_env_https(proxy_test_server, get_request, mocker): url = "https://aiohttp.io/path" proxy = await proxy_test_server() mocker.patch.dict(os.environ, {"https_proxy": str(proxy.url)}) mock.patch("pathlib.Path.is_file", mock_is_file) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 2 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "https://aiohttp.io/path" assert "Proxy-Authorization" not in proxy.request.headers @pytest.mark.xfail async def xtest_proxy_from_env_https_with_auth(proxy_test_server, get_request, mocker): url = "https://aiohttp.io/path" proxy = await proxy_test_server() auth = aiohttp.BasicAuth("user", "pass") mocker.patch.dict( os.environ, { "https_proxy": str( proxy.url.with_user(auth.login).with_password(auth.password) ) }, ) await get_request(url=url, trust_env=True) assert len(proxy.requests_list) == 2 assert proxy.request.method == "GET" assert proxy.request.host == "aiohttp.io" assert proxy.request.path_qs == "/path" assert "Proxy-Authorization" not in proxy.request.headers r2 = proxy.requests_list[0] assert r2.method == "CONNECT" assert r2.host == "aiohttp.io" assert r2.path_qs == "/path" assert r2.headers["Proxy-Authorization"] == auth.encode() async def test_proxy_auth() -> None: async with aiohttp.ClientSession() as session: with pytest.raises( ValueError, match=r"proxy_auth must be None or BasicAuth\(\) tuple" ): await session.get( "http://python.org", proxy="http://proxy.example.com", proxy_auth=("user", "pass"), ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_pytest_plugin.py0000644000175100001710000001500400000000000020214 0ustar00runnerdockerimport os import platform import sys import pytest pytest_plugins = "pytester" CONFTEST = """ pytest_plugins = 'aiohttp.pytest_plugin' """ IS_PYPY = platform.python_implementation() == "PyPy" def test_aiohttp_plugin(testdir) -> None: testdir.makepyfile( """\ import pytest from unittest import mock from aiohttp import web async def hello(request): return web.Response(body=b'Hello, world') def create_app(loop=None): app = web.Application() app.router.add_route('GET', '/', hello) return app async def test_hello(aiohttp_client) -> None: client = await aiohttp_client(create_app) resp = await client.get('/') assert resp.status == 200 text = await resp.text() assert 'Hello, world' in text async def test_hello_from_app(aiohttp_client, loop) -> None: app = web.Application() app.router.add_get('/', hello) client = await aiohttp_client(app) resp = await client.get('/') assert resp.status == 200 text = await resp.text() assert 'Hello, world' in text async def test_hello_with_loop(aiohttp_client, loop) -> None: client = await aiohttp_client(create_app) resp = await client.get('/') assert resp.status == 200 text = await resp.text() assert 'Hello, world' in text async def test_set_args(aiohttp_client, loop) -> None: with pytest.raises(AssertionError): app = web.Application() await aiohttp_client(app, 1, 2, 3) async def test_set_keyword_args(aiohttp_client, loop) -> None: app = web.Application() with pytest.raises(TypeError): await aiohttp_client(app, param=1) async def test_noop() -> None: pass async def previous(request): if request.method == 'POST': with pytest.warns(DeprecationWarning): request.app['value'] = (await request.post())['value'] return web.Response(body=b'thanks for the data') else: v = request.app.get('value', 'unknown') return web.Response(body='value: {}'.format(v).encode()) def create_stateful_app(loop): app = web.Application() app.router.add_route('*', '/', previous) return app @pytest.fixture def cli(loop, aiohttp_client): return loop.run_until_complete(aiohttp_client(create_stateful_app)) async def test_set_value(cli) -> None: resp = await cli.post('/', data={'value': 'foo'}) assert resp.status == 200 text = await resp.text() assert text == 'thanks for the data' assert cli.server.app['value'] == 'foo' async def test_get_value(cli) -> None: resp = await cli.get('/') assert resp.status == 200 text = await resp.text() assert text == 'value: unknown' with pytest.warns(DeprecationWarning): cli.server.app['value'] = 'bar' resp = await cli.get('/') assert resp.status == 200 text = await resp.text() assert text == 'value: bar' def test_noncoro() -> None: assert True async def test_failed_to_create_client(aiohttp_client) -> None: def make_app(loop): raise RuntimeError() with pytest.raises(RuntimeError): await aiohttp_client(make_app) async def test_custom_port_aiohttp_client(aiohttp_client, aiohttp_unused_port): port = aiohttp_unused_port() client = await aiohttp_client(create_app, server_kwargs={'port': port}) assert client.port == port resp = await client.get('/') assert resp.status == 200 text = await resp.text() assert 'Hello, world' in text async def test_custom_port_test_server(aiohttp_server, aiohttp_unused_port): app = create_app() port = aiohttp_unused_port() server = await aiohttp_server(app, port=port) assert server.port == port """ ) testdir.makeconftest(CONFTEST) result = testdir.runpytest("-p", "no:sugar", "--aiohttp-loop=pyloop") result.assert_outcomes(passed=12) def test_warning_checks(testdir) -> None: testdir.makepyfile( """\ async def foobar(): return 123 async def test_good() -> None: v = await foobar() assert v == 123 async def test_bad() -> None: foobar() """ ) testdir.makeconftest(CONFTEST) result = testdir.runpytest( "-p", "no:sugar", "-s", "-W", "default", "--aiohttp-loop=pyloop" ) expected_outcomes = ( {"failed": 0, "passed": 2} if IS_PYPY and bool(os.environ.get("PYTHONASYNCIODEBUG")) else {"failed": 1, "passed": 1} ) # Under PyPy "coroutine 'foobar' was never awaited" does not happen. result.assert_outcomes(**expected_outcomes) def test_aiohttp_plugin_async_fixture(testdir, capsys) -> None: testdir.makepyfile( """\ import pytest from aiohttp import web async def hello(request): return web.Response(body=b'Hello, world') def create_app(): app = web.Application() app.router.add_route('GET', '/', hello) return app @pytest.fixture async def cli(aiohttp_client, loop): client = await aiohttp_client(create_app()) return client @pytest.fixture async def foo(): return 42 @pytest.fixture async def bar(request): # request should be accessible in async fixtures if needed return request.function async def test_hello(cli, loop) -> None: resp = await cli.get('/') assert resp.status == 200 def test_foo(loop, foo) -> None: assert foo == 42 def test_foo_without_loop(foo) -> None: # will raise an error because there is no loop pass def test_bar(loop, bar) -> None: assert bar is test_bar """ ) testdir.makeconftest(CONFTEST) result = testdir.runpytest("-p", "no:sugar", "--aiohttp-loop=pyloop") result.assert_outcomes(passed=3, errors=1) result.stdout.fnmatch_lines( "*Asynchronous fixtures must depend on the 'loop' fixture " "or be used in tests depending from it." ) @pytest.mark.skipif(sys.version_info < (3, 6), reason="old python") def test_aiohttp_plugin_async_gen_fixture(testdir) -> None: testdir.makepyfile( """\ import pytest from unittest import mock from aiohttp import web canary = mock.Mock() async def hello(request): return web.Response(body=b'Hello, world') def create_app(loop): app = web.Application() app.router.add_route('GET', '/', hello) return app @pytest.fixture async def cli(aiohttp_client): yield await aiohttp_client(create_app) canary() async def test_hello(cli) -> None: resp = await cli.get('/') assert resp.status == 200 def test_finalized() -> None: assert canary.called is True """ ) testdir.makeconftest(CONFTEST) result = testdir.runpytest("-p", "no:sugar", "--aiohttp-loop=pyloop") result.assert_outcomes(passed=2) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_resolver.py0000644000175100001710000002167300000000000017160 0ustar00runnerdockerimport asyncio import ipaddress import socket from typing import Any, List from unittest.mock import Mock, patch import pytest from aiohttp.resolver import AsyncResolver, DefaultResolver, ThreadedResolver try: import aiodns gethostbyname = hasattr(aiodns.DNSResolver, "gethostbyname") except ImportError: aiodns = None gethostbyname = False class FakeResult: def __init__(self, addresses): self.addresses = addresses class FakeQueryResult: def __init__(self, host): self.host = host async def fake_result(addresses): return FakeResult(addresses=tuple(addresses)) async def fake_query_result(result): return [FakeQueryResult(host=h) for h in result] def fake_addrinfo(hosts): async def fake(*args, **kwargs): if not hosts: raise socket.gaierror return [(socket.AF_INET, None, socket.SOCK_STREAM, None, [h, 0]) for h in hosts] return fake @pytest.mark.skipif(not gethostbyname, reason="aiodns 1.1 required") async def test_async_resolver_positive_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: mock().gethostbyname.return_value = fake_result(["127.0.0.1"]) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.python.org") ipaddress.ip_address(real[0]["host"]) mock().gethostbyname.assert_called_with("www.python.org", socket.AF_INET) @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_async_resolver_query_positive_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: del mock().gethostbyname mock().query.return_value = fake_query_result(["127.0.0.1"]) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.python.org") ipaddress.ip_address(real[0]["host"]) mock().query.assert_called_with("www.python.org", "A") @pytest.mark.skipif(not gethostbyname, reason="aiodns 1.1 required") async def test_async_resolver_multiple_replies(loop) -> None: with patch("aiodns.DNSResolver") as mock: ips = ["127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4"] mock().gethostbyname.return_value = fake_result(ips) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.google.com") ips = [ipaddress.ip_address(x["host"]) for x in real] assert len(ips) > 3, "Expecting multiple addresses" @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_async_resolver_query_multiple_replies(loop) -> None: with patch("aiodns.DNSResolver") as mock: del mock().gethostbyname ips = ["127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4"] mock().query.return_value = fake_query_result(ips) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.google.com") ips = [ipaddress.ip_address(x["host"]) for x in real] @pytest.mark.skipif(not gethostbyname, reason="aiodns 1.1 required") async def test_async_resolver_negative_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: mock().gethostbyname.side_effect = aiodns.error.DNSError() resolver = AsyncResolver(loop=loop) with pytest.raises(OSError): await resolver.resolve("doesnotexist.bla") @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_async_resolver_query_negative_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: del mock().gethostbyname mock().query.side_effect = aiodns.error.DNSError() resolver = AsyncResolver(loop=loop) with pytest.raises(OSError): await resolver.resolve("doesnotexist.bla") @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_async_resolver_no_hosts_in_query(loop) -> None: with patch("aiodns.DNSResolver") as mock: del mock().gethostbyname mock().query.return_value = fake_query_result([]) resolver = AsyncResolver(loop=loop) with pytest.raises(OSError): await resolver.resolve("doesnotexist.bla") @pytest.mark.skipif(not gethostbyname, reason="aiodns 1.1 required") async def test_async_resolver_no_hosts_in_gethostbyname(loop) -> None: with patch("aiodns.DNSResolver") as mock: mock().gethostbyname.return_value = fake_result([]) resolver = AsyncResolver(loop=loop) with pytest.raises(OSError): await resolver.resolve("doesnotexist.bla") async def test_threaded_resolver_positive_lookup() -> None: loop = Mock() loop.getaddrinfo = fake_addrinfo(["127.0.0.1"]) resolver = ThreadedResolver(loop=loop) real = await resolver.resolve("www.python.org") assert real[0]["hostname"] == "www.python.org" ipaddress.ip_address(real[0]["host"]) async def test_threaded_resolver_multiple_replies() -> None: loop = Mock() ips = ["127.0.0.1", "127.0.0.2", "127.0.0.3", "127.0.0.4"] loop.getaddrinfo = fake_addrinfo(ips) resolver = ThreadedResolver(loop=loop) real = await resolver.resolve("www.google.com") ips = [ipaddress.ip_address(x["host"]) for x in real] assert len(ips) > 3, "Expecting multiple addresses" async def test_threaded_negative_lookup() -> None: loop = Mock() ips = [] loop.getaddrinfo = fake_addrinfo(ips) resolver = ThreadedResolver(loop=loop) with pytest.raises(socket.gaierror): await resolver.resolve("doesnotexist.bla") async def test_threaded_negative_lookup_with_unknown_result() -> None: loop = Mock() # If compile CPython with `--disable-ipv6` option, # we will get an (int, bytes) tuple, instead of a Exception. async def unknown_addrinfo(*args: Any, **kwargs: Any) -> List[Any]: return [ ( socket.AF_INET6, socket.SOCK_STREAM, 6, "", (10, b"\x01\xbb\x00\x00\x00\x00*\x04NB\x00\x1a\x00\x00"), ) ] loop.getaddrinfo = unknown_addrinfo resolver = ThreadedResolver() resolver._loop = loop with patch("socket.has_ipv6", False): res = await resolver.resolve("www.python.org") assert len(res) == 0 async def test_close_for_threaded_resolver(loop) -> None: resolver = ThreadedResolver(loop=loop) await resolver.close() async def test_threaded_negative_lookup_with_unknown_result() -> None: loop = Mock() # If compile CPython with `--disable-ipv6` option, # we will get an (int, bytes) tuple, instead of a Exception. async def unknown_addrinfo(*args: Any, **kwargs: Any) -> List[Any]: return [ ( socket.AF_INET6, socket.SOCK_STREAM, 6, "", (10, b"\x01\xbb\x00\x00\x00\x00*\x04NB\x00\x1a\x00\x00"), ) ] loop.getaddrinfo = unknown_addrinfo resolver = ThreadedResolver() resolver._loop = loop with patch("socket.has_ipv6", False): res = await resolver.resolve("www.python.org") assert len(res) == 0 await resolver.close() @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_close_for_async_resolver(loop) -> None: resolver = AsyncResolver(loop=loop) await resolver.close() async def test_default_loop_for_threaded_resolver(loop) -> None: asyncio.set_event_loop(loop) resolver = ThreadedResolver() assert resolver._loop is loop @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_default_loop_for_async_resolver(loop) -> None: asyncio.set_event_loop(loop) resolver = AsyncResolver() assert resolver._loop is loop @pytest.mark.skipif(not gethostbyname, reason="aiodns 1.1 required") async def test_async_resolver_ipv6_positive_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: mock().gethostbyname.return_value = fake_result(["::1"]) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.python.org", family=socket.AF_INET6) ipaddress.ip_address(real[0]["host"]) mock().gethostbyname.assert_called_with("www.python.org", socket.AF_INET6) @pytest.mark.skipif(aiodns is None, reason="aiodns required") async def test_async_resolver_query_ipv6_positive_lookup(loop) -> None: with patch("aiodns.DNSResolver") as mock: del mock().gethostbyname mock().query.return_value = fake_query_result(["::1"]) resolver = AsyncResolver(loop=loop) real = await resolver.resolve("www.python.org", family=socket.AF_INET6) ipaddress.ip_address(real[0]["host"]) mock().query.assert_called_with("www.python.org", "AAAA") async def test_async_resolver_aiodns_not_present(loop, monkeypatch) -> None: monkeypatch.setattr("aiohttp.resolver.aiodns", None) with pytest.raises(RuntimeError): AsyncResolver(loop=loop) def test_default_resolver() -> None: # if gethostbyname: # assert DefaultResolver is AsyncResolver # else: # assert DefaultResolver is ThreadedResolver assert DefaultResolver is ThreadedResolver ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_route_def.py0000644000175100001710000001532700000000000017272 0ustar00runnerdockerimport pathlib import pytest from yarl import URL from aiohttp import web from aiohttp.web_urldispatcher import UrlDispatcher @pytest.fixture def router(): return UrlDispatcher() def test_get(router) -> None: async def handler(request): pass router.add_routes([web.get("/", handler)]) assert len(router.routes()) == 2 # GET and HEAD route = list(router.routes())[1] assert route.handler is handler assert route.method == "GET" assert str(route.url_for()) == "/" route2 = list(router.routes())[0] assert route2.handler is handler assert route2.method == "HEAD" def test_head(router) -> None: async def handler(request): pass router.add_routes([web.head("/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "HEAD" assert str(route.url_for()) == "/" def test_options(router) -> None: async def handler(request): pass router.add_routes([web.options("/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "OPTIONS" assert str(route.url_for()) == "/" def test_post(router) -> None: async def handler(request): pass router.add_routes([web.post("/", handler)]) route = list(router.routes())[0] assert route.handler is handler assert route.method == "POST" assert str(route.url_for()) == "/" def test_put(router) -> None: async def handler(request): pass router.add_routes([web.put("/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "PUT" assert str(route.url_for()) == "/" def test_patch(router) -> None: async def handler(request): pass router.add_routes([web.patch("/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "PATCH" assert str(route.url_for()) == "/" def test_delete(router) -> None: async def handler(request): pass router.add_routes([web.delete("/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "DELETE" assert str(route.url_for()) == "/" def test_route(router) -> None: async def handler(request): pass router.add_routes([web.route("OTHER", "/", handler)]) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.handler is handler assert route.method == "OTHER" assert str(route.url_for()) == "/" def test_static(router) -> None: folder = pathlib.Path(__file__).parent router.add_routes([web.static("/prefix", folder)]) assert len(router.resources()) == 1 # 2 routes: for HEAD and GET resource = list(router.resources())[0] info = resource.get_info() assert info["prefix"] == "/prefix" assert info["directory"] == folder url = resource.url_for(filename="aiohttp.png") assert url == URL("/prefix/aiohttp.png") def test_head_deco(router) -> None: routes = web.RouteTableDef() @routes.head("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "HEAD" assert str(route.url_for()) == "/path" def test_get_deco(router) -> None: routes = web.RouteTableDef() @routes.get("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 2 route1 = list(router.routes())[0] assert route1.method == "HEAD" assert str(route1.url_for()) == "/path" route2 = list(router.routes())[1] assert route2.method == "GET" assert str(route2.url_for()) == "/path" def test_post_deco(router) -> None: routes = web.RouteTableDef() @routes.post("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "POST" assert str(route.url_for()) == "/path" def test_put_deco(router) -> None: routes = web.RouteTableDef() @routes.put("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "PUT" assert str(route.url_for()) == "/path" def test_patch_deco(router) -> None: routes = web.RouteTableDef() @routes.patch("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "PATCH" assert str(route.url_for()) == "/path" def test_delete_deco(router) -> None: routes = web.RouteTableDef() @routes.delete("/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "DELETE" assert str(route.url_for()) == "/path" def test_route_deco(router) -> None: routes = web.RouteTableDef() @routes.route("OTHER", "/path") async def handler(request): pass router.add_routes(routes) assert len(router.routes()) == 1 route = list(router.routes())[0] assert route.method == "OTHER" assert str(route.url_for()) == "/path" def test_routedef_sequence_protocol() -> None: routes = web.RouteTableDef() @routes.delete("/path") async def handler(request): pass assert len(routes) == 1 info = routes[0] assert isinstance(info, web.RouteDef) assert info in routes assert list(routes)[0] is info def test_repr_route_def() -> None: routes = web.RouteTableDef() @routes.get("/path") async def handler(request): pass rd = routes[0] assert repr(rd) == " 'handler'>" def test_repr_route_def_with_extra_info() -> None: routes = web.RouteTableDef() @routes.get("/path", extra="info") async def handler(request): pass rd = routes[0] assert repr(rd) == " 'handler', extra='info'>" def test_repr_static_def() -> None: routes = web.RouteTableDef() routes.static("/prefix", "/path", name="name") rd = routes[0] assert repr(rd) == " /path, name='name'>" def test_repr_route_table_def() -> None: routes = web.RouteTableDef() @routes.get("/path") async def handler(request): pass assert repr(routes) == "" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_run_app.py0000644000175100001710000006170500000000000016763 0ustar00runnerdockerimport asyncio import contextlib import logging import os import platform import signal import socket import ssl import subprocess import sys from unittest import mock from uuid import uuid4 import pytest from aiohttp import web from aiohttp.helpers import PY_37 from aiohttp.test_utils import make_mocked_coro from aiohttp.web_runner import BaseRunner # Test for features of OS' socket support _has_unix_domain_socks = hasattr(socket, "AF_UNIX") if _has_unix_domain_socks: _abstract_path_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) try: _abstract_path_sock.bind(b"\x00" + uuid4().hex.encode("ascii")) # type: ignore except FileNotFoundError: _abstract_path_failed = True else: _abstract_path_failed = False finally: _abstract_path_sock.close() del _abstract_path_sock else: _abstract_path_failed = True skip_if_no_abstract_paths = pytest.mark.skipif( _abstract_path_failed, reason="Linux-style abstract paths are not supported." ) skip_if_no_unix_socks = pytest.mark.skipif( not _has_unix_domain_socks, reason="Unix domain sockets are not supported" ) del _has_unix_domain_socks, _abstract_path_failed HAS_IPV6 = socket.has_ipv6 if HAS_IPV6: # The socket.has_ipv6 flag may be True if Python was built with IPv6 # support, but the target system still may not have it. # So let's ensure that we really have IPv6 support. try: socket.socket(socket.AF_INET6, socket.SOCK_STREAM) except OSError: HAS_IPV6 = False # tokio event loop does not allow to override attributes def skip_if_no_dict(loop): if not hasattr(loop, "__dict__"): pytest.skip("can not override loop attributes") def skip_if_on_windows(): if platform.system() == "Windows": pytest.skip("the test is not valid for Windows") @pytest.fixture def patched_loop(loop): skip_if_no_dict(loop) server = mock.Mock() server.wait_closed = make_mocked_coro(None) loop.create_server = make_mocked_coro(server) unix_server = mock.Mock() unix_server.wait_closed = make_mocked_coro(None) loop.create_unix_server = make_mocked_coro(unix_server) asyncio.set_event_loop(loop) return loop def stopper(loop): def raiser(): raise KeyboardInterrupt def f(*args): loop.call_soon(raiser) return f def test_run_app_http(patched_loop) -> None: app = web.Application() startup_handler = make_mocked_coro() app.on_startup.append(startup_handler) cleanup_handler = make_mocked_coro() app.on_cleanup.append(cleanup_handler) web.run_app(app, print=stopper(patched_loop), loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None ) startup_handler.assert_called_once_with(app) cleanup_handler.assert_called_once_with(app) def test_run_app_close_loop(patched_loop) -> None: app = web.Application() web.run_app(app, print=stopper(patched_loop), loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None ) assert patched_loop.is_closed() mock_unix_server_single = [ mock.call(mock.ANY, "/tmp/testsock1.sock", ssl=None, backlog=128), ] mock_unix_server_multi = [ mock.call(mock.ANY, "/tmp/testsock1.sock", ssl=None, backlog=128), mock.call(mock.ANY, "/tmp/testsock2.sock", ssl=None, backlog=128), ] mock_server_single = [ mock.call( mock.ANY, "127.0.0.1", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), ] mock_server_multi = [ mock.call( mock.ANY, "127.0.0.1", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), mock.call( mock.ANY, "192.168.1.1", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), ] mock_server_default_8989 = [ mock.call( mock.ANY, None, 8989, ssl=None, backlog=128, reuse_address=None, reuse_port=None ) ] mock_socket = mock.Mock(getsockname=lambda: ("mock-socket", 123)) mixed_bindings_tests = ( ( # type: ignore "Nothing Specified", {}, [ mock.call( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ) ], [], ), ("Port Only", {"port": 8989}, mock_server_default_8989, []), ("Multiple Hosts", {"host": ("127.0.0.1", "192.168.1.1")}, mock_server_multi, []), ( "Multiple Paths", {"path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock")}, [], mock_unix_server_multi, ), ( "Multiple Paths, Port", {"path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock"), "port": 8989}, mock_server_default_8989, mock_unix_server_multi, ), ( "Multiple Paths, Single Host", {"path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock"), "host": "127.0.0.1"}, mock_server_single, mock_unix_server_multi, ), ( "Single Path, Single Host", {"path": "/tmp/testsock1.sock", "host": "127.0.0.1"}, mock_server_single, mock_unix_server_single, ), ( "Single Path, Multiple Hosts", {"path": "/tmp/testsock1.sock", "host": ("127.0.0.1", "192.168.1.1")}, mock_server_multi, mock_unix_server_single, ), ( "Single Path, Port", {"path": "/tmp/testsock1.sock", "port": 8989}, mock_server_default_8989, mock_unix_server_single, ), ( "Multiple Paths, Multiple Hosts, Port", { "path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock"), "host": ("127.0.0.1", "192.168.1.1"), "port": 8000, }, [ mock.call( mock.ANY, "127.0.0.1", 8000, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), mock.call( mock.ANY, "192.168.1.1", 8000, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), ], mock_unix_server_multi, ), ( "Only socket", {"sock": [mock_socket]}, [mock.call(mock.ANY, ssl=None, sock=mock_socket, backlog=128)], [], ), ( "Socket, port", {"sock": [mock_socket], "port": 8765}, [ mock.call( mock.ANY, None, 8765, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), mock.call(mock.ANY, sock=mock_socket, ssl=None, backlog=128), ], [], ), ( "Socket, Host, No port", {"sock": [mock_socket], "host": "localhost"}, [ mock.call( mock.ANY, "localhost", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), mock.call(mock.ANY, sock=mock_socket, ssl=None, backlog=128), ], [], ), ( "reuse_port", {"reuse_port": True}, [ mock.call( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=True, ) ], [], ), ( "reuse_address", {"reuse_address": False}, [ mock.call( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=False, reuse_port=None, ) ], [], ), ( "reuse_port, reuse_address", {"reuse_address": True, "reuse_port": True}, [ mock.call( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=True, reuse_port=True, ) ], [], ), ( "Port, reuse_port", {"port": 8989, "reuse_port": True}, [ mock.call( mock.ANY, None, 8989, ssl=None, backlog=128, reuse_address=None, reuse_port=True, ) ], [], ), ( "Multiple Hosts, reuse_port", {"host": ("127.0.0.1", "192.168.1.1"), "reuse_port": True}, [ mock.call( mock.ANY, "127.0.0.1", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=True, ), mock.call( mock.ANY, "192.168.1.1", 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=True, ), ], [], ), ( "Multiple Paths, Port, reuse_address", { "path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock"), "port": 8989, "reuse_address": False, }, [ mock.call( mock.ANY, None, 8989, ssl=None, backlog=128, reuse_address=False, reuse_port=None, ) ], mock_unix_server_multi, ), ( "Multiple Paths, Single Host, reuse_address, reuse_port", { "path": ("/tmp/testsock1.sock", "/tmp/testsock2.sock"), "host": "127.0.0.1", "reuse_address": True, "reuse_port": True, }, [ mock.call( mock.ANY, "127.0.0.1", 8080, ssl=None, backlog=128, reuse_address=True, reuse_port=True, ), ], mock_unix_server_multi, ), ) mixed_bindings_test_ids = [test[0] for test in mixed_bindings_tests] mixed_bindings_test_params = [test[1:] for test in mixed_bindings_tests] @pytest.mark.parametrize( "run_app_kwargs, expected_server_calls, expected_unix_server_calls", mixed_bindings_test_params, ids=mixed_bindings_test_ids, ) def test_run_app_mixed_bindings( run_app_kwargs, expected_server_calls, expected_unix_server_calls, patched_loop ): app = web.Application() web.run_app(app, print=stopper(patched_loop), **run_app_kwargs, loop=patched_loop) assert patched_loop.create_unix_server.mock_calls == expected_unix_server_calls assert patched_loop.create_server.mock_calls == expected_server_calls def test_run_app_https(patched_loop) -> None: app = web.Application() ssl_context = ssl.create_default_context() web.run_app( app, ssl_context=ssl_context, print=stopper(patched_loop), loop=patched_loop ) patched_loop.create_server.assert_called_with( mock.ANY, None, 8443, ssl=ssl_context, backlog=128, reuse_address=None, reuse_port=None, ) def test_run_app_nondefault_host_port(patched_loop, aiohttp_unused_port) -> None: port = aiohttp_unused_port() host = "127.0.0.1" app = web.Application() web.run_app( app, host=host, port=port, print=stopper(patched_loop), loop=patched_loop ) patched_loop.create_server.assert_called_with( mock.ANY, host, port, ssl=None, backlog=128, reuse_address=None, reuse_port=None ) def test_run_app_multiple_hosts(patched_loop) -> None: hosts = ("127.0.0.1", "127.0.0.2") app = web.Application() web.run_app(app, host=hosts, print=stopper(patched_loop), loop=patched_loop) calls = map( lambda h: mock.call( mock.ANY, h, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None, ), hosts, ) patched_loop.create_server.assert_has_calls(calls) def test_run_app_custom_backlog(patched_loop) -> None: app = web.Application() web.run_app(app, backlog=10, print=stopper(patched_loop), loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, None, 8080, ssl=None, backlog=10, reuse_address=None, reuse_port=None ) def test_run_app_custom_backlog_unix(patched_loop) -> None: app = web.Application() web.run_app( app, path="/tmp/tmpsock.sock", backlog=10, print=stopper(patched_loop), loop=patched_loop, ) patched_loop.create_unix_server.assert_called_with( mock.ANY, "/tmp/tmpsock.sock", ssl=None, backlog=10 ) @skip_if_no_unix_socks def test_run_app_http_unix_socket(patched_loop, shorttmpdir) -> None: app = web.Application() sock_path = str(shorttmpdir / "socket.sock") printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app(app, path=sock_path, print=printer, loop=patched_loop) patched_loop.create_unix_server.assert_called_with( mock.ANY, sock_path, ssl=None, backlog=128 ) assert f"http://unix:{sock_path}:" in printer.call_args[0][0] @skip_if_no_unix_socks def test_run_app_https_unix_socket(patched_loop, shorttmpdir) -> None: app = web.Application() sock_path = str(shorttmpdir / "socket.sock") ssl_context = ssl.create_default_context() printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app( app, path=sock_path, ssl_context=ssl_context, print=printer, loop=patched_loop ) patched_loop.create_unix_server.assert_called_with( mock.ANY, sock_path, ssl=ssl_context, backlog=128 ) assert f"https://unix:{sock_path}:" in printer.call_args[0][0] @skip_if_no_unix_socks @skip_if_no_abstract_paths def test_run_app_abstract_linux_socket(patched_loop) -> None: sock_path = b"\x00" + uuid4().hex.encode("ascii") app = web.Application() web.run_app( app, path=sock_path.decode("ascii", "ignore"), print=stopper(patched_loop), loop=patched_loop, ) patched_loop.create_unix_server.assert_called_with( mock.ANY, sock_path.decode("ascii"), ssl=None, backlog=128 ) def test_run_app_preexisting_inet_socket(patched_loop, mocker) -> None: app = web.Application() sock = socket.socket() with contextlib.closing(sock): sock.bind(("0.0.0.0", 0)) _, port = sock.getsockname() printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app(app, sock=sock, print=printer, loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, sock=sock, backlog=128, ssl=None ) assert f"http://0.0.0.0:{port}" in printer.call_args[0][0] @pytest.mark.skipif(not HAS_IPV6, reason="IPv6 is not available") def test_run_app_preexisting_inet6_socket(patched_loop) -> None: app = web.Application() sock = socket.socket(socket.AF_INET6) with contextlib.closing(sock): sock.bind(("::", 0)) port = sock.getsockname()[1] printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app(app, sock=sock, print=printer, loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, sock=sock, backlog=128, ssl=None ) assert f"http://[::]:{port}" in printer.call_args[0][0] @skip_if_no_unix_socks def test_run_app_preexisting_unix_socket(patched_loop, mocker) -> None: app = web.Application() sock_path = "/tmp/test_preexisting_sock1" sock = socket.socket(socket.AF_UNIX) with contextlib.closing(sock): sock.bind(sock_path) os.unlink(sock_path) printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app(app, sock=sock, print=printer, loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, sock=sock, backlog=128, ssl=None ) assert f"http://unix:{sock_path}:" in printer.call_args[0][0] def test_run_app_multiple_preexisting_sockets(patched_loop) -> None: app = web.Application() sock1 = socket.socket() sock2 = socket.socket() with contextlib.closing(sock1), contextlib.closing(sock2): sock1.bind(("0.0.0.0", 0)) _, port1 = sock1.getsockname() sock2.bind(("0.0.0.0", 0)) _, port2 = sock2.getsockname() printer = mock.Mock(wraps=stopper(patched_loop)) web.run_app(app, sock=(sock1, sock2), print=printer, loop=patched_loop) patched_loop.create_server.assert_has_calls( [ mock.call(mock.ANY, sock=sock1, backlog=128, ssl=None), mock.call(mock.ANY, sock=sock2, backlog=128, ssl=None), ] ) assert f"http://0.0.0.0:{port1}" in printer.call_args[0][0] assert f"http://0.0.0.0:{port2}" in printer.call_args[0][0] _script_test_signal = """ from aiohttp import web app = web.Application() web.run_app(app, host=()) """ def test_sigint() -> None: skip_if_on_windows() with subprocess.Popen( [sys.executable, "-u", "-c", _script_test_signal], stdout=subprocess.PIPE, ) as proc: for line in proc.stdout: if line.startswith(b"======== Running on"): break proc.send_signal(signal.SIGINT) assert proc.wait() == 0 def test_sigterm() -> None: skip_if_on_windows() with subprocess.Popen( [sys.executable, "-u", "-c", _script_test_signal], stdout=subprocess.PIPE, ) as proc: for line in proc.stdout: if line.startswith(b"======== Running on"): break proc.terminate() assert proc.wait() == 0 def test_startup_cleanup_signals_even_on_failure(patched_loop) -> None: patched_loop.create_server = mock.Mock(side_effect=RuntimeError()) app = web.Application() startup_handler = make_mocked_coro() app.on_startup.append(startup_handler) cleanup_handler = make_mocked_coro() app.on_cleanup.append(cleanup_handler) with pytest.raises(RuntimeError): web.run_app(app, print=stopper(patched_loop), loop=patched_loop) startup_handler.assert_called_once_with(app) cleanup_handler.assert_called_once_with(app) def test_run_app_coro(patched_loop) -> None: startup_handler = cleanup_handler = None async def make_app(): nonlocal startup_handler, cleanup_handler app = web.Application() startup_handler = make_mocked_coro() app.on_startup.append(startup_handler) cleanup_handler = make_mocked_coro() app.on_cleanup.append(cleanup_handler) return app web.run_app(make_app(), print=stopper(patched_loop), loop=patched_loop) patched_loop.create_server.assert_called_with( mock.ANY, None, 8080, ssl=None, backlog=128, reuse_address=None, reuse_port=None ) startup_handler.assert_called_once_with(mock.ANY) cleanup_handler.assert_called_once_with(mock.ANY) def test_run_app_default_logger(monkeypatch, patched_loop): patched_loop.set_debug(True) logger = web.access_logger attrs = { "hasHandlers.return_value": False, "level": logging.NOTSET, "name": "aiohttp.access", } mock_logger = mock.create_autospec(logger, name="mock_access_logger") mock_logger.configure_mock(**attrs) app = web.Application() web.run_app( app, print=stopper(patched_loop), access_log=mock_logger, loop=patched_loop, ) mock_logger.setLevel.assert_any_call(logging.DEBUG) mock_logger.hasHandlers.assert_called_with() assert isinstance(mock_logger.addHandler.call_args[0][0], logging.StreamHandler) def test_run_app_default_logger_setup_requires_debug(patched_loop): patched_loop.set_debug(False) logger = web.access_logger attrs = { "hasHandlers.return_value": False, "level": logging.NOTSET, "name": "aiohttp.access", } mock_logger = mock.create_autospec(logger, name="mock_access_logger") mock_logger.configure_mock(**attrs) app = web.Application() web.run_app( app, print=stopper(patched_loop), access_log=mock_logger, loop=patched_loop, ) mock_logger.setLevel.assert_not_called() mock_logger.hasHandlers.assert_not_called() mock_logger.addHandler.assert_not_called() def test_run_app_default_logger_setup_requires_default_logger(patched_loop): patched_loop.set_debug(True) logger = web.access_logger attrs = { "hasHandlers.return_value": False, "level": logging.NOTSET, "name": None, } mock_logger = mock.create_autospec(logger, name="mock_access_logger") mock_logger.configure_mock(**attrs) app = web.Application() web.run_app( app, print=stopper(patched_loop), access_log=mock_logger, loop=patched_loop, ) mock_logger.setLevel.assert_not_called() mock_logger.hasHandlers.assert_not_called() mock_logger.addHandler.assert_not_called() def test_run_app_default_logger_setup_only_if_unconfigured(patched_loop): patched_loop.set_debug(True) logger = web.access_logger attrs = { "hasHandlers.return_value": True, "level": None, "name": "aiohttp.access", } mock_logger = mock.create_autospec(logger, name="mock_access_logger") mock_logger.configure_mock(**attrs) app = web.Application() web.run_app( app, print=stopper(patched_loop), access_log=mock_logger, loop=patched_loop, ) mock_logger.setLevel.assert_not_called() mock_logger.hasHandlers.assert_called_with() mock_logger.addHandler.assert_not_called() def test_run_app_cancels_all_pending_tasks(patched_loop): app = web.Application() task = None async def on_startup(app): nonlocal task loop = asyncio.get_event_loop() task = loop.create_task(asyncio.sleep(1000)) app.on_startup.append(on_startup) web.run_app(app, print=stopper(patched_loop), loop=patched_loop) assert task.cancelled() def test_run_app_cancels_done_tasks(patched_loop): app = web.Application() task = None async def coro(): return 123 async def on_startup(app): nonlocal task loop = asyncio.get_event_loop() task = loop.create_task(coro()) app.on_startup.append(on_startup) web.run_app(app, print=stopper(patched_loop), loop=patched_loop) assert task.done() def test_run_app_cancels_failed_tasks(patched_loop): app = web.Application() task = None exc = RuntimeError("FAIL") async def fail(): try: await asyncio.sleep(1000) except asyncio.CancelledError: raise exc async def on_startup(app): nonlocal task loop = asyncio.get_event_loop() task = loop.create_task(fail()) await asyncio.sleep(0.01) app.on_startup.append(on_startup) exc_handler = mock.Mock() patched_loop.set_exception_handler(exc_handler) web.run_app(app, print=stopper(patched_loop), loop=patched_loop) assert task.done() msg = { "message": "unhandled exception during asyncio.run() shutdown", "exception": exc, "task": task, } exc_handler.assert_called_with(patched_loop, msg) def test_run_app_keepalive_timeout(patched_loop, mocker, monkeypatch): new_timeout = 1234 base_runner_init_orig = BaseRunner.__init__ def base_runner_init_spy(self, *args, **kwargs): assert kwargs["keepalive_timeout"] == new_timeout base_runner_init_orig(self, *args, **kwargs) app = web.Application() monkeypatch.setattr(BaseRunner, "__init__", base_runner_init_spy) web.run_app( app, keepalive_timeout=new_timeout, print=stopper(patched_loop), loop=patched_loop, ) @pytest.mark.skipif(not PY_37, reason="contextvars support is required") def test_run_app_context_vars(patched_loop): from contextvars import ContextVar count = 0 VAR = ContextVar("VAR", default="default") async def on_startup(app): nonlocal count assert "init" == VAR.get() VAR.set("on_startup") count += 1 async def on_cleanup(app): nonlocal count assert "on_startup" == VAR.get() count += 1 async def init(): nonlocal count assert "default" == VAR.get() VAR.set("init") app = web.Application() app.on_startup.append(on_startup) app.on_cleanup.append(on_cleanup) count += 1 return app web.run_app(init(), print=stopper(patched_loop), loop=patched_loop) assert count == 3 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_streams.py0000644000175100001710000012661500000000000016777 0ustar00runnerdocker# Tests for streams.py import abc import asyncio import gc import types from collections import defaultdict from itertools import groupby from unittest import mock import pytest from re_assert import Matches from aiohttp import streams from aiohttp.helpers import PY_310 DATA = b"line1\nline2\nline3\n" def chunkify(seq, n): for i in range(0, len(seq), n): yield seq[i : i + n] async def create_stream(): loop = asyncio.get_event_loop() protocol = mock.Mock(_reading_paused=False) stream = streams.StreamReader(protocol, 2 ** 16, loop=loop) stream.feed_data(DATA) stream.feed_eof() return stream @pytest.fixture def protocol(): return mock.Mock(_reading_paused=False) MEMLEAK_SKIP_TYPES = ( *(getattr(types, name) for name in types.__all__ if name.endswith("Type")), mock.Mock, abc.ABCMeta, ) def get_memory_usage(obj): objs = [obj] # Memory leak may be caused by leaked links to same objects. # Without link counting, [1,2,3] is indistiguishable from [1,2,3,3,3,3,3,3] known = defaultdict(int) known[id(obj)] += 1 while objs: refs = gc.get_referents(*objs) objs = [] for obj in refs: if isinstance(obj, MEMLEAK_SKIP_TYPES): continue i = id(obj) known[i] += 1 if known[i] == 1: objs.append(obj) # Make list of unhashable objects uniq objs.sort(key=id) objs = [next(g) for (i, g) in groupby(objs, id)] return sum(known.values()) class TestStreamReader: DATA = b"line1\nline2\nline3\n" def _make_one(self, *args, **kwargs): kwargs.setdefault("limit", 2 ** 16) return streams.StreamReader(mock.Mock(_reading_paused=False), *args, **kwargs) async def test_create_waiter(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one(loop=loop) stream._waiter = loop.create_future with pytest.raises(RuntimeError): await stream._wait("test") @pytest.mark.xfail( PY_310, reason="No idea why ClientRequest() is constructed out of loop but " "it calls `asyncio.get_event_loop()`", raises=DeprecationWarning, ) def test_ctor_global_loop(self) -> None: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) try: stream = streams.StreamReader(mock.Mock(_reading_paused=False), 2 ** 16) assert stream._loop is loop finally: # Otherwise an unstopped/unclosed loop affects the next test # Cleanup, leaks into `test_at_eof` otherwise: loop.stop() loop.run_forever() loop.close() gc.collect() async def test_at_eof(self) -> None: stream = self._make_one() assert not stream.at_eof() stream.feed_data(b"some data\n") assert not stream.at_eof() await stream.readline() assert not stream.at_eof() stream.feed_data(b"some data\n") stream.feed_eof() await stream.readline() assert stream.at_eof() async def test_wait_eof(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() wait_task = loop.create_task(stream.wait_eof()) async def cb(): await asyncio.sleep(0.1) stream.feed_eof() loop.create_task(cb()) await wait_task assert stream.is_eof() assert stream._eof_waiter is None async def test_wait_eof_eof(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() stream.feed_eof() wait_task = loop.create_task(stream.wait_eof()) await wait_task assert stream.is_eof() async def test_feed_empty_data(self) -> None: stream = self._make_one() stream.feed_data(b"") stream.feed_eof() data = await stream.read() assert b"" == data async def test_feed_nonempty_data(self) -> None: stream = self._make_one() stream.feed_data(self.DATA) stream.feed_eof() data = await stream.read() assert self.DATA == data async def test_read_zero(self) -> None: # Read zero bytes. stream = self._make_one() stream.feed_data(self.DATA) data = await stream.read(0) assert b"" == data stream.feed_eof() data = await stream.read() assert self.DATA == data async def test_read(self) -> None: loop = asyncio.get_event_loop() # Read bytes. stream = self._make_one() read_task = loop.create_task(stream.read(30)) def cb(): stream.feed_data(self.DATA) loop.call_soon(cb) data = await read_task assert self.DATA == data stream.feed_eof() data = await stream.read() assert b"" == data async def test_read_line_breaks(self) -> None: # Read bytes without line breaks. stream = self._make_one() stream.feed_data(b"line1") stream.feed_data(b"line2") data = await stream.read(5) assert b"line1" == data data = await stream.read(5) assert b"line2" == data async def test_read_all(self) -> None: # Read all available buffered bytes stream = self._make_one() stream.feed_data(b"line1") stream.feed_data(b"line2") stream.feed_eof() data = await stream.read() assert b"line1line2" == data async def test_read_up_to(self) -> None: # Read available buffered bytes up to requested amount stream = self._make_one() stream.feed_data(b"line1") stream.feed_data(b"line2") data = await stream.read(8) assert b"line1lin" == data data = await stream.read(8) assert b"e2" == data async def test_read_eof(self) -> None: loop = asyncio.get_event_loop() # Read bytes, stop at eof. stream = self._make_one() read_task = loop.create_task(stream.read(1024)) def cb(): stream.feed_eof() loop.call_soon(cb) data = await read_task assert b"" == data data = await stream.read() assert data == b"" async def test_read_eof_infinite(self) -> None: # Read bytes. stream = self._make_one() stream.feed_eof() with mock.patch("aiohttp.streams.internal_logger") as internal_logger: await stream.read() await stream.read() await stream.read() await stream.read() await stream.read() await stream.read() assert internal_logger.warning.called async def test_read_eof_unread_data_no_warning(self) -> None: # Read bytes. stream = self._make_one() stream.feed_eof() with mock.patch("aiohttp.streams.internal_logger") as internal_logger: await stream.read() await stream.read() await stream.read() await stream.read() await stream.read() with pytest.warns(DeprecationWarning): stream.unread_data(b"data") await stream.read() await stream.read() assert not internal_logger.warning.called async def test_read_until_eof(self) -> None: loop = asyncio.get_event_loop() # Read all bytes until eof. stream = self._make_one() read_task = loop.create_task(stream.read(-1)) def cb(): stream.feed_data(b"chunk1\n") stream.feed_data(b"chunk2") stream.feed_eof() loop.call_soon(cb) data = await read_task assert b"chunk1\nchunk2" == data data = await stream.read() assert b"" == data async def test_read_exception(self) -> None: stream = self._make_one() stream.feed_data(b"line\n") data = await stream.read(2) assert b"li" == data stream.set_exception(ValueError()) with pytest.raises(ValueError): await stream.read(2) async def test_readline(self) -> None: loop = asyncio.get_event_loop() # Read one line. 'readline' will need to wait for the data # to come from 'cb' stream = self._make_one() stream.feed_data(b"chunk1 ") read_task = loop.create_task(stream.readline()) def cb(): stream.feed_data(b"chunk2 ") stream.feed_data(b"chunk3 ") stream.feed_data(b"\n chunk4") loop.call_soon(cb) line = await read_task assert b"chunk1 chunk2 chunk3 \n" == line stream.feed_eof() data = await stream.read() assert b" chunk4" == data async def test_readline_limit_with_existing_data(self) -> None: # Read one line. The data is in StreamReader's buffer # before the event loop is run. stream = self._make_one(limit=2) stream.feed_data(b"li") stream.feed_data(b"ne1\nline2\n") with pytest.raises(ValueError): await stream.readline() # The buffer should contain the remaining data after exception stream.feed_eof() data = await stream.read() assert b"line2\n" == data async def test_readline_limit(self) -> None: loop = asyncio.get_event_loop() # Read one line. StreamReaders are fed with data after # their 'readline' methods are called. stream = self._make_one(limit=4) def cb(): stream.feed_data(b"chunk1") stream.feed_data(b"chunk2\n") stream.feed_data(b"chunk3\n") stream.feed_eof() loop.call_soon(cb) with pytest.raises(ValueError): await stream.readline() data = await stream.read() assert b"chunk3\n" == data async def test_readline_nolimit_nowait(self) -> None: # All needed data for the first 'readline' call will be # in the buffer. stream = self._make_one() stream.feed_data(self.DATA[:6]) stream.feed_data(self.DATA[6:]) line = await stream.readline() assert b"line1\n" == line stream.feed_eof() data = await stream.read() assert b"line2\nline3\n" == data async def test_readline_eof(self) -> None: stream = self._make_one() stream.feed_data(b"some data") stream.feed_eof() line = await stream.readline() assert b"some data" == line async def test_readline_empty_eof(self) -> None: stream = self._make_one() stream.feed_eof() line = await stream.readline() assert b"" == line async def test_readline_read_byte_count(self) -> None: stream = self._make_one() stream.feed_data(self.DATA) await stream.readline() data = await stream.read(7) assert b"line2\nl" == data stream.feed_eof() data = await stream.read() assert b"ine3\n" == data async def test_readline_exception(self) -> None: stream = self._make_one() stream.feed_data(b"line\n") data = await stream.readline() assert b"line\n" == data stream.set_exception(ValueError()) with pytest.raises(ValueError): await stream.readline() async def test_readuntil(self) -> None: loop = asyncio.get_event_loop() # Read one chunk. 'readuntil' will need to wait for the data # to come from 'cb' stream = self._make_one() stream.feed_data(b"chunk1 ") read_task = loop.create_task(stream.readuntil(b"*")) def cb(): stream.feed_data(b"chunk2 ") stream.feed_data(b"chunk3 ") stream.feed_data(b"* chunk4") loop.call_soon(cb) line = await read_task assert b"chunk1 chunk2 chunk3 *" == line stream.feed_eof() data = await stream.read() assert b" chunk4" == data async def test_readuntil_limit_with_existing_data(self) -> None: # Read one chunk. The data is in StreamReader's buffer # before the event loop is run. stream = self._make_one(limit=2) stream.feed_data(b"li") stream.feed_data(b"ne1&line2&") with pytest.raises(ValueError): await stream.readuntil(b"&") # The buffer should contain the remaining data after exception stream.feed_eof() data = await stream.read() assert b"line2&" == data async def test_readuntil_limit(self) -> None: loop = asyncio.get_event_loop() # Read one chunk. StreamReaders are fed with data after # their 'readuntil' methods are called. stream = self._make_one(limit=4) def cb(): stream.feed_data(b"chunk1") stream.feed_data(b"chunk2$") stream.feed_data(b"chunk3#") stream.feed_eof() loop.call_soon(cb) with pytest.raises(ValueError): await stream.readuntil(b"$") data = await stream.read() assert b"chunk3#" == data async def test_readuntil_nolimit_nowait(self) -> None: # All needed data for the first 'readuntil' call will be # in the buffer. stream = self._make_one() data = b"line1!line2!line3!" stream.feed_data(data[:6]) stream.feed_data(data[6:]) line = await stream.readuntil(b"!") assert b"line1!" == line stream.feed_eof() data = await stream.read() assert b"line2!line3!" == data async def test_readuntil_eof(self) -> None: stream = self._make_one() stream.feed_data(b"some data") stream.feed_eof() line = await stream.readuntil(b"@") assert b"some data" == line async def test_readuntil_empty_eof(self) -> None: stream = self._make_one() stream.feed_eof() line = await stream.readuntil(b"@") assert b"" == line async def test_readuntil_read_byte_count(self) -> None: stream = self._make_one() data = b"line1!line2!line3!" stream.feed_data(data) await stream.readuntil(b"!") data = await stream.read(7) assert b"line2!l" == data stream.feed_eof() data = await stream.read() assert b"ine3!" == data async def test_readuntil_exception(self) -> None: stream = self._make_one() stream.feed_data(b"line#") data = await stream.readuntil(b"#") assert b"line#" == data stream.set_exception(ValueError()) with pytest.raises(ValueError): await stream.readuntil(b"#") async def test_readexactly_zero_or_less(self) -> None: # Read exact number of bytes (zero or less). stream = self._make_one() stream.feed_data(self.DATA) data = await stream.readexactly(0) assert b"" == data stream.feed_eof() data = await stream.read() assert self.DATA == data stream = self._make_one() stream.feed_data(self.DATA) data = await stream.readexactly(-1) assert b"" == data stream.feed_eof() data = await stream.read() assert self.DATA == data async def test_readexactly(self) -> None: loop = asyncio.get_event_loop() # Read exact number of bytes. stream = self._make_one() n = 2 * len(self.DATA) read_task = loop.create_task(stream.readexactly(n)) def cb(): stream.feed_data(self.DATA) stream.feed_data(self.DATA) stream.feed_data(self.DATA) loop.call_soon(cb) data = await read_task assert self.DATA + self.DATA == data stream.feed_eof() data = await stream.read() assert self.DATA == data async def test_readexactly_eof(self) -> None: loop = asyncio.get_event_loop() # Read exact number of bytes (eof). stream = self._make_one(loop=loop) n = 2 * len(self.DATA) read_task = loop.create_task(stream.readexactly(n)) def cb(): stream.feed_data(self.DATA) stream.feed_eof() loop.call_soon(cb) with pytest.raises(asyncio.IncompleteReadError) as cm: await read_task assert cm.value.partial == self.DATA assert cm.value.expected == n assert str(cm.value) == "18 bytes read on a total of 36 expected bytes" data = await stream.read() assert b"" == data async def test_readexactly_exception(self) -> None: stream = self._make_one() stream.feed_data(b"line\n") data = await stream.readexactly(2) assert b"li" == data stream.set_exception(ValueError()) with pytest.raises(ValueError): await stream.readexactly(2) async def test_unread_data(self) -> None: stream = self._make_one() stream.feed_data(b"line1") stream.feed_data(b"line2") stream.feed_data(b"onemoreline") data = await stream.read(5) assert b"line1" == data with pytest.warns(DeprecationWarning): stream.unread_data(data) data = await stream.read(5) assert b"line1" == data data = await stream.read(4) assert b"line" == data with pytest.warns(DeprecationWarning): stream.unread_data(b"line1line") data = b"" while len(data) < 10: data += await stream.read(10) assert b"line1line2" == data data = await stream.read(7) assert b"onemore" == data with pytest.warns(DeprecationWarning): stream.unread_data(data) data = b"" while len(data) < 11: data += await stream.read(11) assert b"onemoreline" == data with pytest.warns(DeprecationWarning): stream.unread_data(b"line") data = await stream.read(4) assert b"line" == data stream.feed_eof() with pytest.warns(DeprecationWarning): stream.unread_data(b"at_eof") data = await stream.read(6) assert b"at_eof" == data async def test_exception(self) -> None: stream = self._make_one() assert stream.exception() is None exc = ValueError() stream.set_exception(exc) assert stream.exception() is exc async def test_exception_waiter(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() async def set_err(): stream.set_exception(ValueError()) t1 = loop.create_task(stream.readline()) t2 = loop.create_task(set_err()) await asyncio.wait([t1, t2]) with pytest.raises(ValueError): t1.result() async def test_exception_cancel(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() async def read_a_line(): await stream.readline() t = loop.create_task(read_a_line()) await asyncio.sleep(0) t.cancel() await asyncio.sleep(0) # The following line fails if set_exception() isn't careful. stream.set_exception(RuntimeError("message")) await asyncio.sleep(0) assert stream._waiter is None async def test_readany_eof(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() read_task = loop.create_task(stream.readany()) loop.call_soon(stream.feed_data, b"chunk1\n") data = await read_task assert b"chunk1\n" == data stream.feed_eof() data = await stream.read() assert b"" == data async def test_readany_empty_eof(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() stream.feed_eof() read_task = loop.create_task(stream.readany()) data = await read_task assert b"" == data async def test_readany_exception(self) -> None: stream = self._make_one() stream.feed_data(b"line\n") data = await stream.readany() assert b"line\n" == data stream.set_exception(ValueError()) with pytest.raises(ValueError): await stream.readany() async def test_read_nowait(self) -> None: stream = self._make_one() stream.feed_data(b"line1\nline2\n") assert stream.read_nowait() == b"line1\nline2\n" assert stream.read_nowait() == b"" stream.feed_eof() data = await stream.read() assert b"" == data async def test_read_nowait_n(self) -> None: stream = self._make_one() stream.feed_data(b"line1\nline2\n") assert stream.read_nowait(4) == b"line" assert stream.read_nowait() == b"1\nline2\n" assert stream.read_nowait() == b"" stream.feed_eof() data = await stream.read() assert b"" == data async def test_read_nowait_exception(self) -> None: stream = self._make_one() stream.feed_data(b"line\n") stream.set_exception(ValueError()) with pytest.raises(ValueError): stream.read_nowait() async def test_read_nowait_waiter(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() stream.feed_data(b"line\n") stream._waiter = loop.create_future() with pytest.raises(RuntimeError): stream.read_nowait() async def test_readchunk(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() def cb(): stream.feed_data(b"chunk1") stream.feed_data(b"chunk2") stream.feed_eof() loop.call_soon(cb) data, end_of_chunk = await stream.readchunk() assert b"chunk1" == data assert not end_of_chunk data, end_of_chunk = await stream.readchunk() assert b"chunk2" == data assert not end_of_chunk data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk async def test_readchunk_wait_eof(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() async def cb(): await asyncio.sleep(0.1) stream.feed_eof() loop.create_task(cb()) data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk assert stream.is_eof() async def test_begin_and_end_chunk_receiving(self) -> None: stream = self._make_one() stream.begin_http_chunk_receiving() stream.feed_data(b"part1") stream.feed_data(b"part2") stream.end_http_chunk_receiving() data, end_of_chunk = await stream.readchunk() assert b"part1part2" == data assert end_of_chunk stream.begin_http_chunk_receiving() stream.feed_data(b"part3") data, end_of_chunk = await stream.readchunk() assert b"part3" == data assert not end_of_chunk stream.end_http_chunk_receiving() data, end_of_chunk = await stream.readchunk() assert b"" == data assert end_of_chunk stream.feed_eof() data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk async def test_readany_chunk_end_race(self) -> None: stream = self._make_one() stream.begin_http_chunk_receiving() stream.feed_data(b"part1") data = await stream.readany() assert data == b"part1" loop = asyncio.get_event_loop() task = loop.create_task(stream.readany()) # Give a chance for task to create waiter and start waiting for it. await asyncio.sleep(0.1) assert stream._waiter is not None assert not task.done() # Just for sure. # This will trigger waiter, but without feeding any data. # The stream should re-create waiter again. stream.end_http_chunk_receiving() # Give a chance for task to resolve. # If everything is OK, previous action SHOULD NOT resolve the task. await asyncio.sleep(0.1) assert not task.done() # The actual test. stream.begin_http_chunk_receiving() # This SHOULD unblock the task actually. stream.feed_data(b"part2") stream.end_http_chunk_receiving() data = await task assert data == b"part2" async def test_end_chunk_receiving_without_begin(self) -> None: stream = self._make_one() with pytest.raises(RuntimeError): stream.end_http_chunk_receiving() async def test_readchunk_with_unread(self) -> None: # Test that stream.unread does not break controlled chunk receiving. stream = self._make_one() # Send 2 chunks stream.begin_http_chunk_receiving() stream.feed_data(b"part1") stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b"part2") stream.end_http_chunk_receiving() # Read only one chunk data, end_of_chunk = await stream.readchunk() # Try to unread a part of the first chunk with pytest.warns(DeprecationWarning): stream.unread_data(b"rt1") # The end_of_chunk signal was already received for the first chunk, # so we receive up to the second one data, end_of_chunk = await stream.readchunk() assert b"rt1part2" == data assert end_of_chunk # Unread a part of the second chunk with pytest.warns(DeprecationWarning): stream.unread_data(b"rt2") data, end_of_chunk = await stream.readchunk() assert b"rt2" == data # end_of_chunk was already received for this chunk assert not end_of_chunk stream.feed_eof() data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk async def test_readchunk_with_other_read_calls(self) -> None: # Test that stream.readchunk works when other read calls are made on # the stream. stream = self._make_one() stream.begin_http_chunk_receiving() stream.feed_data(b"part1") stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b"part2") stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b"part3") stream.end_http_chunk_receiving() data = await stream.read(7) assert b"part1pa" == data data, end_of_chunk = await stream.readchunk() assert b"rt2" == data assert end_of_chunk # Corner case between read/readchunk data = await stream.read(5) assert b"part3" == data data, end_of_chunk = await stream.readchunk() assert b"" == data assert end_of_chunk stream.feed_eof() data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk async def test_chunksplits_memory_leak(self) -> None: # Test for memory leak on chunksplits stream = self._make_one() N = 500 # Warm-up variables stream.begin_http_chunk_receiving() stream.feed_data(b"Y" * N) stream.end_http_chunk_receiving() await stream.read(N) N = 300 before = get_memory_usage(stream) for _ in range(N): stream.begin_http_chunk_receiving() stream.feed_data(b"X") stream.end_http_chunk_receiving() await stream.read(N) after = get_memory_usage(stream) assert abs(after - before) == 0 async def test_read_empty_chunks(self) -> None: # Test that feeding empty chunks does not break stream stream = self._make_one() # Simulate empty first chunk. This is significant special case stream.begin_http_chunk_receiving() stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b"ungzipped") stream.end_http_chunk_receiving() # Possible when compression is enabled. stream.begin_http_chunk_receiving() stream.end_http_chunk_receiving() # is also possible stream.begin_http_chunk_receiving() stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b" data") stream.end_http_chunk_receiving() stream.feed_eof() data = await stream.read() assert data == b"ungzipped data" async def test_readchunk_separate_http_chunk_tail(self) -> None: # Test that stream.readchunk returns (b'', True) when end of # http chunk received after body loop = asyncio.get_event_loop() stream = self._make_one() stream.begin_http_chunk_receiving() stream.feed_data(b"part1") data, end_of_chunk = await stream.readchunk() assert b"part1" == data assert not end_of_chunk async def cb(): await asyncio.sleep(0.1) stream.end_http_chunk_receiving() loop.create_task(cb()) data, end_of_chunk = await stream.readchunk() assert b"" == data assert end_of_chunk stream.begin_http_chunk_receiving() stream.feed_data(b"part2") data, end_of_chunk = await stream.readchunk() assert b"part2" == data assert not end_of_chunk stream.end_http_chunk_receiving() stream.begin_http_chunk_receiving() stream.feed_data(b"part3") stream.end_http_chunk_receiving() data, end_of_chunk = await stream.readchunk() assert b"" == data assert end_of_chunk data, end_of_chunk = await stream.readchunk() assert b"part3" == data assert end_of_chunk stream.begin_http_chunk_receiving() stream.feed_data(b"part4") data, end_of_chunk = await stream.readchunk() assert b"part4" == data assert not end_of_chunk async def cb(): await asyncio.sleep(0.1) stream.end_http_chunk_receiving() stream.feed_eof() loop.create_task(cb()) data, end_of_chunk = await stream.readchunk() assert b"" == data assert end_of_chunk data, end_of_chunk = await stream.readchunk() assert b"" == data assert not end_of_chunk async def test___repr__(self) -> None: stream = self._make_one() assert "" == repr(stream) async def test___repr__nondefault_limit(self) -> None: stream = self._make_one(limit=123) assert "" == repr(stream) async def test___repr__eof(self) -> None: stream = self._make_one() stream.feed_eof() assert "" == repr(stream) async def test___repr__data(self) -> None: stream = self._make_one() stream.feed_data(b"data") assert "" == repr(stream) async def test___repr__exception(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one(loop=loop) exc = RuntimeError() stream.set_exception(exc) assert "" == repr(stream) async def test___repr__waiter(self) -> None: loop = asyncio.get_event_loop() stream = self._make_one() stream._waiter = loop.create_future() assert Matches(r">") == repr(stream) stream._waiter.set_result(None) await stream._waiter stream._waiter = None assert "" == repr(stream) async def test_unread_empty(self) -> None: stream = self._make_one() stream.feed_data(b"line1") stream.feed_eof() with pytest.warns(DeprecationWarning): stream.unread_data(b"") data = await stream.read(5) assert b"line1" == data assert stream.at_eof() async def test_empty_stream_reader() -> None: s = streams.EmptyStreamReader() assert s.set_exception(ValueError()) is None assert s.exception() is None assert s.feed_eof() is None assert s.feed_data(b"data") is None assert s.at_eof() assert (await s.wait_eof()) is None assert await s.read() == b"" assert await s.readline() == b"" assert await s.readany() == b"" assert await s.readchunk() == (b"", True) with pytest.raises(asyncio.IncompleteReadError): await s.readexactly(10) assert s.read_nowait() == b"" @pytest.fixture async def buffer(loop): return streams.DataQueue(loop) class TestDataQueue: def test_is_eof(self, buffer) -> None: assert not buffer.is_eof() buffer.feed_eof() assert buffer.is_eof() def test_at_eof(self, buffer) -> None: assert not buffer.at_eof() buffer.feed_eof() assert buffer.at_eof() buffer._buffer.append(object()) assert not buffer.at_eof() def test_feed_data(self, buffer) -> None: item = object() buffer.feed_data(item, 1) assert [(item, 1)] == list(buffer._buffer) def test_feed_eof(self, buffer) -> None: buffer.feed_eof() assert buffer._eof async def test_read(self, buffer) -> None: loop = asyncio.get_event_loop() item = object() def cb(): buffer.feed_data(item, 1) loop.call_soon(cb) data = await buffer.read() assert item is data async def test_read_eof(self, buffer) -> None: loop = asyncio.get_event_loop() def cb(): buffer.feed_eof() loop.call_soon(cb) with pytest.raises(streams.EofStream): await buffer.read() async def test_read_cancelled(self, buffer) -> None: loop = asyncio.get_event_loop() read_task = loop.create_task(buffer.read()) await asyncio.sleep(0) waiter = buffer._waiter assert asyncio.isfuture(waiter) read_task.cancel() with pytest.raises(asyncio.CancelledError): await read_task assert waiter.cancelled() assert buffer._waiter is None buffer.feed_data(b"test", 4) assert buffer._waiter is None async def test_read_until_eof(self, buffer) -> None: item = object() buffer.feed_data(item, 1) buffer.feed_eof() data = await buffer.read() assert data is item with pytest.raises(streams.EofStream): await buffer.read() async def test_read_exc(self, buffer) -> None: item = object() buffer.feed_data(item) buffer.set_exception(ValueError) data = await buffer.read() assert item is data with pytest.raises(ValueError): await buffer.read() async def test_read_exception(self, buffer) -> None: buffer.set_exception(ValueError()) with pytest.raises(ValueError): await buffer.read() async def test_read_exception_with_data(self, buffer) -> None: val = object() buffer.feed_data(val, 1) buffer.set_exception(ValueError()) assert val is (await buffer.read()) with pytest.raises(ValueError): await buffer.read() async def test_read_exception_on_wait(self, buffer) -> None: loop = asyncio.get_event_loop() read_task = loop.create_task(buffer.read()) await asyncio.sleep(0) assert asyncio.isfuture(buffer._waiter) buffer.feed_eof() buffer.set_exception(ValueError()) with pytest.raises(ValueError): await read_task def test_exception(self, buffer) -> None: assert buffer.exception() is None exc = ValueError() buffer.set_exception(exc) assert buffer.exception() is exc async def test_exception_waiter(self, buffer) -> None: loop = asyncio.get_event_loop() async def set_err(): buffer.set_exception(ValueError()) t1 = loop.create_task(buffer.read()) t2 = loop.create_task(set_err()) await asyncio.wait([t1, t2]) with pytest.raises(ValueError): t1.result() async def test_feed_data_waiters(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2 ** 16, loop=loop) waiter = reader._waiter = loop.create_future() eof_waiter = reader._eof_waiter = loop.create_future() reader.feed_data(b"1") assert list(reader._buffer) == [b"1"] assert reader._size == 1 assert reader.total_bytes == 1 assert waiter.done() assert not eof_waiter.done() assert reader._waiter is None assert reader._eof_waiter is eof_waiter async def test_feed_data_completed_waiters(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2 ** 16, loop=loop) waiter = reader._waiter = loop.create_future() waiter.set_result(1) reader.feed_data(b"1") assert reader._waiter is None async def test_feed_eof_waiters(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2 ** 16, loop=loop) waiter = reader._waiter = loop.create_future() eof_waiter = reader._eof_waiter = loop.create_future() reader.feed_eof() assert reader._eof assert waiter.done() assert eof_waiter.done() assert reader._waiter is None assert reader._eof_waiter is None async def test_feed_eof_cancelled(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2 ** 16, loop=loop) waiter = reader._waiter = loop.create_future() eof_waiter = reader._eof_waiter = loop.create_future() waiter.set_result(1) eof_waiter.set_result(1) reader.feed_eof() assert waiter.done() assert eof_waiter.done() assert reader._waiter is None assert reader._eof_waiter is None async def test_on_eof(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2 ** 16, loop=loop) on_eof = mock.Mock() reader.on_eof(on_eof) assert not on_eof.called reader.feed_eof() assert on_eof.called async def test_on_eof_empty_reader() -> None: reader = streams.EmptyStreamReader() on_eof = mock.Mock() reader.on_eof(on_eof) assert on_eof.called async def test_on_eof_exc_in_callback(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2 ** 16, loop=loop) on_eof = mock.Mock() on_eof.side_effect = ValueError reader.on_eof(on_eof) assert not on_eof.called reader.feed_eof() assert on_eof.called assert not reader._eof_callbacks async def test_on_eof_exc_in_callback_empty_stream_reader() -> None: reader = streams.EmptyStreamReader() on_eof = mock.Mock() on_eof.side_effect = ValueError reader.on_eof(on_eof) assert on_eof.called async def test_on_eof_eof_is_set(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2 ** 16, loop=loop) reader.feed_eof() on_eof = mock.Mock() reader.on_eof(on_eof) assert on_eof.called assert not reader._eof_callbacks async def test_on_eof_eof_is_set_exception(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2 ** 16, loop=loop) reader.feed_eof() on_eof = mock.Mock() on_eof.side_effect = ValueError reader.on_eof(on_eof) assert on_eof.called assert not reader._eof_callbacks async def test_set_exception(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2 ** 16, loop=loop) waiter = reader._waiter = loop.create_future() eof_waiter = reader._eof_waiter = loop.create_future() exc = ValueError() reader.set_exception(exc) assert waiter.exception() is exc assert eof_waiter.exception() is exc assert reader._waiter is None assert reader._eof_waiter is None async def test_set_exception_cancelled(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2 ** 16, loop=loop) waiter = reader._waiter = loop.create_future() eof_waiter = reader._eof_waiter = loop.create_future() waiter.set_result(1) eof_waiter.set_result(1) exc = ValueError() reader.set_exception(exc) assert waiter.exception() is None assert eof_waiter.exception() is None assert reader._waiter is None assert reader._eof_waiter is None async def test_set_exception_eof_callbacks(protocol) -> None: loop = asyncio.get_event_loop() reader = streams.StreamReader(protocol, 2 ** 16, loop=loop) on_eof = mock.Mock() reader.on_eof(on_eof) reader.set_exception(ValueError()) assert not on_eof.called assert not reader._eof_callbacks async def test_stream_reader_lines() -> None: line_iter = iter(DATA.splitlines(keepends=True)) async for line in await create_stream(): assert line == next(line_iter, None) pytest.raises(StopIteration, next, line_iter) async def test_stream_reader_chunks_complete() -> None: # Tests if chunked iteration works if the chunking works out # (i.e. the data is divisible by the chunk size) chunk_iter = chunkify(DATA, 9) async for data in (await create_stream()).iter_chunked(9): assert data == next(chunk_iter, None) pytest.raises(StopIteration, next, chunk_iter) async def test_stream_reader_chunks_incomplete() -> None: # Tests if chunked iteration works if the last chunk is incomplete chunk_iter = chunkify(DATA, 8) async for data in (await create_stream()).iter_chunked(8): assert data == next(chunk_iter, None) pytest.raises(StopIteration, next, chunk_iter) async def test_data_queue_empty() -> None: # Tests that async looping yields nothing if nothing is there loop = asyncio.get_event_loop() buffer = streams.DataQueue(loop) buffer.feed_eof() async for _ in buffer: assert False async def test_data_queue_items() -> None: # Tests that async looping yields objects identically loop = asyncio.get_event_loop() buffer = streams.DataQueue(loop) items = [object(), object()] buffer.feed_data(items[0], 1) buffer.feed_data(items[1], 1) buffer.feed_eof() item_iter = iter(items) async for item in buffer: assert item is next(item_iter, None) pytest.raises(StopIteration, next, item_iter) async def test_stream_reader_iter_any() -> None: it = iter([b"line1\nline2\nline3\n"]) async for raw in (await create_stream()).iter_any(): assert raw == next(it) pytest.raises(StopIteration, next, it) async def test_stream_reader_iter() -> None: it = iter([b"line1\n", b"line2\n", b"line3\n"]) async for raw in await create_stream(): assert raw == next(it) pytest.raises(StopIteration, next, it) async def test_stream_reader_iter_chunks_no_chunked_encoding() -> None: it = iter([b"line1\nline2\nline3\n"]) async for data, end_of_chunk in (await create_stream()).iter_chunks(): assert (data, end_of_chunk) == (next(it), False) pytest.raises(StopIteration, next, it) async def test_stream_reader_iter_chunks_chunked_encoding(protocol) -> None: loop = asyncio.get_event_loop() stream = streams.StreamReader(protocol, 2 ** 16, loop=loop) for line in DATA.splitlines(keepends=True): stream.begin_http_chunk_receiving() stream.feed_data(line) stream.end_http_chunk_receiving() stream.feed_eof() it = iter([b"line1\n", b"line2\n", b"line3\n"]) async for data, end_of_chunk in stream.iter_chunks(): assert (data, end_of_chunk) == (next(it), True) pytest.raises(StopIteration, next, it) def test_isinstance_check() -> None: assert isinstance(streams.EMPTY_PAYLOAD, streams.StreamReader) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_tcp_helpers.py0000644000175100001710000000455100000000000017623 0ustar00runnerdockerimport socket from unittest import mock import pytest from aiohttp.tcp_helpers import tcp_nodelay has_ipv6 = socket.has_ipv6 if has_ipv6: # The socket.has_ipv6 flag may be True if Python was built with IPv6 # support, but the target system still may not have it. # So let's ensure that we really have IPv6 support. try: socket.socket(socket.AF_INET6, socket.SOCK_STREAM) except OSError: has_ipv6 = False # nodelay def test_tcp_nodelay_exception() -> None: transport = mock.Mock() s = mock.Mock() s.setsockopt = mock.Mock() s.family = socket.AF_INET s.setsockopt.side_effect = OSError transport.get_extra_info.return_value = s tcp_nodelay(transport, True) s.setsockopt.assert_called_with(socket.IPPROTO_TCP, socket.TCP_NODELAY, True) def test_tcp_nodelay_enable() -> None: transport = mock.Mock() with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: transport.get_extra_info.return_value = s tcp_nodelay(transport, True) assert s.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) def test_tcp_nodelay_enable_and_disable() -> None: transport = mock.Mock() with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: transport.get_extra_info.return_value = s tcp_nodelay(transport, True) assert s.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) tcp_nodelay(transport, False) assert not s.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) @pytest.mark.skipif(not has_ipv6, reason="IPv6 is not available") def test_tcp_nodelay_enable_ipv6() -> None: transport = mock.Mock() with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s: transport.get_extra_info.return_value = s tcp_nodelay(transport, True) assert s.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY) @pytest.mark.skipif(not hasattr(socket, "AF_UNIX"), reason="requires unix sockets") def test_tcp_nodelay_enable_unix() -> None: # do not set nodelay for unix socket transport = mock.Mock() s = mock.Mock(family=socket.AF_UNIX, type=socket.SOCK_STREAM) transport.get_extra_info.return_value = s tcp_nodelay(transport, True) assert not s.setsockopt.called def test_tcp_nodelay_enable_no_socket() -> None: transport = mock.Mock() transport.get_extra_info.return_value = None tcp_nodelay(transport, True) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_test_utils.py0000644000175100001710000002511500000000000017511 0ustar00runnerdockerimport gzip from socket import socket from typing import Any from unittest import mock import pytest from multidict import CIMultiDict, CIMultiDictProxy from yarl import URL import aiohttp from aiohttp import web from aiohttp.test_utils import ( AioHTTPTestCase, RawTestServer as _RawTestServer, TestClient as _TestClient, TestServer as _TestServer, get_port_socket, loop_context, make_mocked_request, unittest_run_loop, ) _hello_world_str = "Hello, world" _hello_world_bytes = _hello_world_str.encode("utf-8") _hello_world_gz = gzip.compress(_hello_world_bytes) def _create_example_app(): async def hello(request): return web.Response(body=_hello_world_bytes) async def websocket_handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive() if msg.type == aiohttp.WSMsgType.TEXT: if msg.data == "close": await ws.close() else: await ws.send_str(msg.data + "/answer") return ws async def cookie_handler(request): resp = web.Response(body=_hello_world_bytes) resp.set_cookie("cookie", "val") return resp app = web.Application() app.router.add_route("*", "/", hello) app.router.add_route("*", "/websocket", websocket_handler) app.router.add_route("*", "/cookie", cookie_handler) return app # these exist to test the pytest scenario @pytest.fixture def loop(): with loop_context() as loop: yield loop @pytest.fixture def app(): return _create_example_app() @pytest.fixture def test_client(loop, app) -> None: async def make_client(): return _TestClient(_TestServer(app, loop=loop), loop=loop) client = loop.run_until_complete(make_client()) loop.run_until_complete(client.start_server()) yield client loop.run_until_complete(client.close()) def test_with_test_server_fails(loop) -> None: app = _create_example_app() with pytest.raises(TypeError): with _TestServer(app, loop=loop): pass async def test_with_client_fails(loop) -> None: app = _create_example_app() with pytest.raises(TypeError): with _TestClient(_TestServer(app, loop=loop), loop=loop): pass async def test_aiohttp_client_close_is_idempotent() -> None: # a test client, called multiple times, should # not attempt to close the server again. app = _create_example_app() client = _TestClient(_TestServer(app)) await client.close() await client.close() class TestAioHTTPTestCase(AioHTTPTestCase): def get_app(self): return _create_example_app() async def test_example_with_loop(self) -> None: request = await self.client.request("GET", "/") assert request.status == 200 text = await request.text() assert _hello_world_str == text def test_inner_example(self) -> None: async def test_get_route() -> None: resp = await self.client.request("GET", "/") assert resp.status == 200 text = await resp.text() assert _hello_world_str == text self.loop.run_until_complete(test_get_route()) async def test_example_without_explicit_loop(self) -> None: request = await self.client.request("GET", "/") assert request.status == 200 text = await request.text() assert _hello_world_str == text async def test_inner_example_without_explicit_loop(self) -> None: async def test_get_route() -> None: resp = await self.client.request("GET", "/") assert resp.status == 200 text = await resp.text() assert _hello_world_str == text await test_get_route() def test_unittest_run_loop() -> None: with pytest.warns( DeprecationWarning, match=r"Decorator `@unittest_run_loop` is no longer needed in aiohttp 3\.8\+", ): @unittest_run_loop def foo(): pass def test_get_route(loop, test_client) -> None: async def test_get_route() -> None: resp = await test_client.request("GET", "/") assert resp.status == 200 text = await resp.text() assert _hello_world_str == text loop.run_until_complete(test_get_route()) async def test_client_websocket(loop, test_client) -> None: resp = await test_client.ws_connect("/websocket") await resp.send_str("foo") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.TEXT assert "foo" in msg.data await resp.send_str("close") msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.CLOSE async def test_client_cookie(loop, test_client) -> None: assert not test_client.session.cookie_jar await test_client.get("/cookie") cookies = list(test_client.session.cookie_jar) assert cookies[0].key == "cookie" assert cookies[0].value == "val" @pytest.mark.parametrize( "method", ["get", "post", "options", "post", "put", "patch", "delete"] ) async def test_test_client_methods(method, loop, test_client) -> None: resp = await getattr(test_client, method)("/") assert resp.status == 200 text = await resp.text() assert _hello_world_str == text async def test_test_client_head(loop, test_client) -> None: resp = await test_client.head("/") assert resp.status == 200 @pytest.mark.parametrize("headers", [{"token": "x"}, CIMultiDict({"token": "x"}), {}]) def test_make_mocked_request(headers) -> None: req = make_mocked_request("GET", "/", headers=headers) assert req.method == "GET" assert req.path == "/" assert isinstance(req, web.Request) assert isinstance(req.headers, CIMultiDictProxy) def test_make_mocked_request_sslcontext() -> None: req = make_mocked_request("GET", "/") assert req.transport.get_extra_info("sslcontext") is None def test_make_mocked_request_unknown_extra_info() -> None: req = make_mocked_request("GET", "/") assert req.transport.get_extra_info("unknown_extra_info") is None def test_make_mocked_request_app() -> None: app = mock.Mock() req = make_mocked_request("GET", "/", app=app) assert req.app is app def test_make_mocked_request_app_can_store_values() -> None: req = make_mocked_request("GET", "/") req.app["a_field"] = "a_value" assert req.app["a_field"] == "a_value" def test_make_mocked_request_match_info() -> None: req = make_mocked_request("GET", "/", match_info={"a": "1", "b": "2"}) assert req.match_info == {"a": "1", "b": "2"} def test_make_mocked_request_content() -> None: payload = mock.Mock() req = make_mocked_request("GET", "/", payload=payload) assert req.content is payload def test_make_mocked_request_transport() -> None: transport = mock.Mock() req = make_mocked_request("GET", "/", transport=transport) assert req.transport is transport async def test_test_client_props(loop) -> None: app = _create_example_app() client = _TestClient(_TestServer(app, host="127.0.0.1", loop=loop), loop=loop) assert client.host == "127.0.0.1" assert client.port is None async with client: assert isinstance(client.port, int) assert client.server is not None assert client.app is not None assert client.port is None async def test_test_client_raw_server_props(loop) -> None: async def hello(request): return web.Response(body=_hello_world_bytes) client = _TestClient(_RawTestServer(hello, host="127.0.0.1", loop=loop), loop=loop) assert client.host == "127.0.0.1" assert client.port is None async with client: assert isinstance(client.port, int) assert client.server is not None assert client.app is None assert client.port is None async def test_test_server_context_manager(loop) -> None: app = _create_example_app() async with _TestServer(app, loop=loop) as server: client = aiohttp.ClientSession(loop=loop) resp = await client.head(server.make_url("/")) assert resp.status == 200 resp.close() await client.close() def test_client_unsupported_arg() -> None: with pytest.raises(TypeError) as e: _TestClient("string") assert ( str(e.value) == "server must be TestServer instance, found type: " ) async def test_server_make_url_yarl_compatibility(loop) -> None: app = _create_example_app() async with _TestServer(app, loop=loop) as server: make_url = server.make_url assert make_url(URL("/foo")) == make_url("/foo") with pytest.raises(AssertionError): make_url("http://foo.com") with pytest.raises(AssertionError): make_url(URL("http://foo.com")) def test_testcase_no_app(testdir, loop) -> None: testdir.makepyfile( """ from aiohttp.test_utils import AioHTTPTestCase class InvalidTestCase(AioHTTPTestCase): def test_noop(self) -> None: pass """ ) result = testdir.runpytest() result.stdout.fnmatch_lines(["*RuntimeError*"]) async def test_server_context_manager(app, loop) -> None: async with _TestServer(app, loop=loop) as server: async with aiohttp.ClientSession(loop=loop) as client: async with client.head(server.make_url("/")) as resp: assert resp.status == 200 @pytest.mark.parametrize( "method", ["head", "get", "post", "options", "post", "put", "patch", "delete"] ) async def test_client_context_manager_response(method, app, loop) -> None: async with _TestClient(_TestServer(app), loop=loop) as client: async with getattr(client, method)("/") as resp: assert resp.status == 200 if method != "head": text = await resp.text() assert "Hello, world" in text async def test_custom_port(loop, app, aiohttp_unused_port) -> None: port = aiohttp_unused_port() client = _TestClient(_TestServer(app, loop=loop, port=port), loop=loop) await client.start_server() assert client.server.port == port resp = await client.get("/") assert resp.status == 200 text = await resp.text() assert _hello_world_str == text await client.close() @pytest.mark.parametrize("test_server_cls", [_TestServer, _RawTestServer]) async def test_base_test_server_socket_factory( test_server_cls: type, app: Any, loop: Any ) -> None: factory_called = False def factory(*args, **kwargs) -> socket: nonlocal factory_called factory_called = True return get_port_socket(*args, **kwargs) server = test_server_cls(app, loop=loop, socket_factory=factory) async with server: pass assert factory_called ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_tracing.py0000644000175100001710000001114600000000000016740 0ustar00runnerdockerfrom types import SimpleNamespace from unittest.mock import Mock import pytest from aiohttp.test_utils import make_mocked_coro from aiohttp.tracing import ( Trace, TraceConfig, TraceConnectionCreateEndParams, TraceConnectionCreateStartParams, TraceConnectionQueuedEndParams, TraceConnectionQueuedStartParams, TraceConnectionReuseconnParams, TraceDnsCacheHitParams, TraceDnsCacheMissParams, TraceDnsResolveHostEndParams, TraceDnsResolveHostStartParams, TraceRequestChunkSentParams, TraceRequestEndParams, TraceRequestExceptionParams, TraceRequestRedirectParams, TraceRequestStartParams, TraceResponseChunkReceivedParams, ) class TestTraceConfig: def test_trace_config_ctx_default(self) -> None: trace_config = TraceConfig() assert isinstance(trace_config.trace_config_ctx(), SimpleNamespace) def test_trace_config_ctx_factory(self) -> None: trace_config = TraceConfig(trace_config_ctx_factory=dict) assert isinstance(trace_config.trace_config_ctx(), dict) def test_trace_config_ctx_request_ctx(self) -> None: trace_request_ctx = Mock() trace_config = TraceConfig() trace_config_ctx = trace_config.trace_config_ctx( trace_request_ctx=trace_request_ctx ) assert trace_config_ctx.trace_request_ctx is trace_request_ctx def test_freeze(self) -> None: trace_config = TraceConfig() trace_config.freeze() assert trace_config.on_request_start.frozen assert trace_config.on_request_chunk_sent.frozen assert trace_config.on_response_chunk_received.frozen assert trace_config.on_request_end.frozen assert trace_config.on_request_exception.frozen assert trace_config.on_request_redirect.frozen assert trace_config.on_connection_queued_start.frozen assert trace_config.on_connection_queued_end.frozen assert trace_config.on_connection_create_start.frozen assert trace_config.on_connection_create_end.frozen assert trace_config.on_connection_reuseconn.frozen assert trace_config.on_dns_resolvehost_start.frozen assert trace_config.on_dns_resolvehost_end.frozen assert trace_config.on_dns_cache_hit.frozen assert trace_config.on_dns_cache_miss.frozen assert trace_config.on_request_headers_sent.frozen class TestTrace: @pytest.mark.parametrize( "signal,params,param_obj", [ ("request_start", (Mock(), Mock(), Mock()), TraceRequestStartParams), ( "request_chunk_sent", (Mock(), Mock(), Mock()), TraceRequestChunkSentParams, ), ( "response_chunk_received", (Mock(), Mock(), Mock()), TraceResponseChunkReceivedParams, ), ("request_end", (Mock(), Mock(), Mock(), Mock()), TraceRequestEndParams), ( "request_exception", (Mock(), Mock(), Mock(), Mock()), TraceRequestExceptionParams, ), ( "request_redirect", (Mock(), Mock(), Mock(), Mock()), TraceRequestRedirectParams, ), ("connection_queued_start", (), TraceConnectionQueuedStartParams), ("connection_queued_end", (), TraceConnectionQueuedEndParams), ("connection_create_start", (), TraceConnectionCreateStartParams), ("connection_create_end", (), TraceConnectionCreateEndParams), ("connection_reuseconn", (), TraceConnectionReuseconnParams), ("dns_resolvehost_start", (Mock(),), TraceDnsResolveHostStartParams), ("dns_resolvehost_end", (Mock(),), TraceDnsResolveHostEndParams), ("dns_cache_hit", (Mock(),), TraceDnsCacheHitParams), ("dns_cache_miss", (Mock(),), TraceDnsCacheMissParams), ], ) async def test_send(self, signal, params, param_obj) -> None: session = Mock() trace_request_ctx = Mock() callback = Mock(side_effect=make_mocked_coro(Mock())) trace_config = TraceConfig() getattr(trace_config, "on_%s" % signal).append(callback) trace_config.freeze() trace = Trace( session, trace_config, trace_config.trace_config_ctx(trace_request_ctx=trace_request_ctx), ) await getattr(trace, "send_%s" % signal)(*params) callback.assert_called_once_with( session, SimpleNamespace(trace_request_ctx=trace_request_ctx), param_obj(*params), ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_urldispatch.py0000644000175100001710000011741700000000000017643 0ustar00runnerdockerimport os import pathlib import re from collections.abc import Container, Iterable, Mapping, MutableMapping, Sized from urllib.parse import unquote import pytest from re_assert import Matches from yarl import URL import aiohttp from aiohttp import hdrs, web from aiohttp.test_utils import make_mocked_request from aiohttp.web import HTTPMethodNotAllowed, HTTPNotFound, Response from aiohttp.web_urldispatcher import ( PATH_SEP, AbstractResource, Domain, DynamicResource, MaskDomain, PlainResource, ResourceRoute, StaticResource, SystemRoute, View, _default_expect_handler, ) def make_handler(): async def handler(request): return Response(request) # pragma: no cover return handler @pytest.fixture def app(): return web.Application() @pytest.fixture def router(app): return app.router @pytest.fixture def fill_routes(router): def go(): route1 = router.add_route("GET", "/plain", make_handler()) route2 = router.add_route("GET", "/variable/{name}", make_handler()) resource = router.add_static("/static", os.path.dirname(aiohttp.__file__)) return [route1, route2] + list(resource) return go def test_register_uncommon_http_methods(router) -> None: uncommon_http_methods = { "PROPFIND", "PROPPATCH", "COPY", "LOCK", "UNLOCK", "MOVE", "SUBSCRIBE", "UNSUBSCRIBE", "NOTIFY", } for method in uncommon_http_methods: router.add_route(method, "/handler/to/path", make_handler()) async def test_add_route_root(router) -> None: handler = make_handler() router.add_route("GET", "/", handler) req = make_mocked_request("GET", "/") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_simple(router) -> None: handler = make_handler() router.add_route("GET", "/handler/to/path", handler) req = make_mocked_request("GET", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_with_matchdict(router) -> None: handler = make_handler() router.add_route("GET", "/handler/{to}", handler) req = make_mocked_request("GET", "/handler/tail") info = await router.resolve(req) assert info is not None assert {"to": "tail"} == info assert handler is info.handler assert info.route.name is None async def test_add_with_matchdict_with_colon(router) -> None: handler = make_handler() router.add_route("GET", "/handler/{to}", handler) req = make_mocked_request("GET", "/handler/1:2:3") info = await router.resolve(req) assert info is not None assert {"to": "1:2:3"} == info assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_get_shortcut(router) -> None: handler = make_handler() router.add_get("/handler/to/path", handler) req = make_mocked_request("GET", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_post_shortcut(router) -> None: handler = make_handler() router.add_post("/handler/to/path", handler) req = make_mocked_request("POST", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_put_shortcut(router) -> None: handler = make_handler() router.add_put("/handler/to/path", handler) req = make_mocked_request("PUT", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_patch_shortcut(router) -> None: handler = make_handler() router.add_patch("/handler/to/path", handler) req = make_mocked_request("PATCH", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_delete_shortcut(router) -> None: handler = make_handler() router.add_delete("/handler/to/path", handler) req = make_mocked_request("DELETE", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_route_with_add_head_shortcut(router) -> None: handler = make_handler() router.add_head("/handler/to/path", handler) req = make_mocked_request("HEAD", "/handler/to/path") info = await router.resolve(req) assert info is not None assert 0 == len(info) assert handler is info.handler assert info.route.name is None async def test_add_with_name(router) -> None: handler = make_handler() router.add_route("GET", "/handler/to/path", handler, name="name") req = make_mocked_request("GET", "/handler/to/path") info = await router.resolve(req) assert info is not None assert "name" == info.route.name async def test_add_with_tailing_slash(router) -> None: handler = make_handler() router.add_route("GET", "/handler/to/path/", handler) req = make_mocked_request("GET", "/handler/to/path/") info = await router.resolve(req) assert info is not None assert {} == info assert handler is info.handler def test_add_invalid_path(router) -> None: handler = make_handler() with pytest.raises(ValueError): router.add_route("GET", "/{/", handler) def test_add_url_invalid1(router) -> None: handler = make_handler() with pytest.raises(ValueError): router.add_route("post", "/post/{id", handler) def test_add_url_invalid2(router) -> None: handler = make_handler() with pytest.raises(ValueError): router.add_route("post", "/post/{id{}}", handler) def test_add_url_invalid3(router) -> None: handler = make_handler() with pytest.raises(ValueError): router.add_route("post", "/post/{id{}", handler) def test_add_url_invalid4(router) -> None: handler = make_handler() with pytest.raises(ValueError): router.add_route("post", '/post/{id"}', handler) async def test_add_url_escaping(router) -> None: handler = make_handler() router.add_route("GET", "/+$", handler) req = make_mocked_request("GET", "/+$") info = await router.resolve(req) assert info is not None assert handler is info.handler async def test_any_method(router) -> None: handler = make_handler() route = router.add_route(hdrs.METH_ANY, "/", handler) req = make_mocked_request("GET", "/") info1 = await router.resolve(req) assert info1 is not None assert route is info1.route req = make_mocked_request("POST", "/") info2 = await router.resolve(req) assert info2 is not None assert info1.route is info2.route async def test_match_second_result_in_table(router) -> None: handler1 = make_handler() handler2 = make_handler() router.add_route("GET", "/h1", handler1) router.add_route("POST", "/h2", handler2) req = make_mocked_request("POST", "/h2") info = await router.resolve(req) assert info is not None assert {} == info assert handler2 is info.handler async def test_raise_method_not_allowed(router) -> None: handler1 = make_handler() handler2 = make_handler() router.add_route("GET", "/", handler1) router.add_route("POST", "/", handler2) req = make_mocked_request("PUT", "/") match_info = await router.resolve(req) assert isinstance(match_info.route, SystemRoute) assert {} == match_info with pytest.raises(HTTPMethodNotAllowed) as ctx: await match_info.handler(req) exc = ctx.value assert "PUT" == exc.method assert 405 == exc.status assert {"POST", "GET"} == exc.allowed_methods async def test_raise_method_not_found(router) -> None: handler = make_handler() router.add_route("GET", "/a", handler) req = make_mocked_request("GET", "/b") match_info = await router.resolve(req) assert isinstance(match_info.route, SystemRoute) assert {} == match_info with pytest.raises(HTTPNotFound) as ctx: await match_info.handler(req) exc = ctx.value assert 404 == exc.status def test_double_add_url_with_the_same_name(router) -> None: handler1 = make_handler() handler2 = make_handler() router.add_route("GET", "/get", handler1, name="name") regexp = "Duplicate 'name', already handled by" with pytest.raises(ValueError) as ctx: router.add_route("GET", "/get_other", handler2, name="name") assert Matches(regexp) == str(ctx.value) def test_route_plain(router) -> None: handler = make_handler() route = router.add_route("GET", "/get", handler, name="name") route2 = next(iter(router["name"])) url = route2.url_for() assert "/get" == str(url) assert route is route2 def test_route_unknown_route_name(router) -> None: with pytest.raises(KeyError): router["unknown"] def test_route_dynamic(router) -> None: handler = make_handler() route = router.add_route("GET", "/get/{name}", handler, name="name") route2 = next(iter(router["name"])) url = route2.url_for(name="John") assert "/get/John" == str(url) assert route is route2 def test_add_static(router) -> None: resource = router.add_static( "/st", os.path.dirname(aiohttp.__file__), name="static" ) assert router["static"] is resource url = resource.url_for(filename="/dir/a.txt") assert "/st/dir/a.txt" == str(url) assert len(resource) == 2 def test_add_static_append_version(router) -> None: resource = router.add_static("/st", os.path.dirname(__file__), name="static") url = resource.url_for(filename="/data.unknown_mime_type", append_version=True) expect_url = ( "/st/data.unknown_mime_type?" "v=aUsn8CHEhhszc81d28QmlcBW0KQpfS2F4trgQKhOYd8%3D" ) assert expect_url == str(url) def test_add_static_append_version_set_from_constructor(router) -> None: resource = router.add_static( "/st", os.path.dirname(__file__), append_version=True, name="static" ) url = resource.url_for(filename="/data.unknown_mime_type") expect_url = ( "/st/data.unknown_mime_type?" "v=aUsn8CHEhhszc81d28QmlcBW0KQpfS2F4trgQKhOYd8%3D" ) assert expect_url == str(url) def test_add_static_append_version_override_constructor(router) -> None: resource = router.add_static( "/st", os.path.dirname(__file__), append_version=True, name="static" ) url = resource.url_for(filename="/data.unknown_mime_type", append_version=False) expect_url = "/st/data.unknown_mime_type" assert expect_url == str(url) def test_add_static_append_version_filename_without_slash(router) -> None: resource = router.add_static("/st", os.path.dirname(__file__), name="static") url = resource.url_for(filename="data.unknown_mime_type", append_version=True) expect_url = ( "/st/data.unknown_mime_type?" "v=aUsn8CHEhhszc81d28QmlcBW0KQpfS2F4trgQKhOYd8%3D" ) assert expect_url == str(url) def test_add_static_append_version_non_exists_file(router) -> None: resource = router.add_static("/st", os.path.dirname(__file__), name="static") url = resource.url_for(filename="/non_exists_file", append_version=True) assert "/st/non_exists_file" == str(url) def test_add_static_append_version_non_exists_file_without_slash(router) -> None: resource = router.add_static("/st", os.path.dirname(__file__), name="static") url = resource.url_for(filename="non_exists_file", append_version=True) assert "/st/non_exists_file" == str(url) def test_add_static_append_version_follow_symlink(router, tmpdir) -> None: # Tests the access to a symlink, in static folder with apeend_version tmp_dir_path = str(tmpdir) symlink_path = os.path.join(tmp_dir_path, "append_version_symlink") symlink_target_path = os.path.dirname(__file__) os.symlink(symlink_target_path, symlink_path, True) # Register global static route: resource = router.add_static( "/st", tmp_dir_path, follow_symlinks=True, append_version=True ) url = resource.url_for(filename="/append_version_symlink/data.unknown_mime_type") expect_url = ( "/st/append_version_symlink/data.unknown_mime_type?" "v=aUsn8CHEhhszc81d28QmlcBW0KQpfS2F4trgQKhOYd8%3D" ) assert expect_url == str(url) def test_add_static_append_version_not_follow_symlink(router, tmpdir) -> None: # Tests the access to a symlink, in static folder with apeend_version tmp_dir_path = str(tmpdir) symlink_path = os.path.join(tmp_dir_path, "append_version_symlink") symlink_target_path = os.path.dirname(__file__) os.symlink(symlink_target_path, symlink_path, True) # Register global static route: resource = router.add_static( "/st", tmp_dir_path, follow_symlinks=False, append_version=True ) filename = "/append_version_symlink/data.unknown_mime_type" url = resource.url_for(filename=filename) assert "/st/append_version_symlink/data.unknown_mime_type" == str(url) def test_add_static_quoting(router) -> None: resource = router.add_static( "/пре %2Fфикс", pathlib.Path(aiohttp.__file__).parent, name="static" ) assert router["static"] is resource url = resource.url_for(filename="/1 2/файл%2F.txt") assert url.path == "/пре /фикс/1 2/файл%2F.txt" assert str(url) == ( "/%D0%BF%D1%80%D0%B5%20%2F%D1%84%D0%B8%D0%BA%D1%81" "/1%202/%D1%84%D0%B0%D0%B9%D0%BB%252F.txt" ) assert len(resource) == 2 def test_plain_not_match(router) -> None: handler = make_handler() router.add_route("GET", "/get/path", handler, name="name") route = router["name"] assert route._match("/another/path") is None def test_dynamic_not_match(router) -> None: handler = make_handler() router.add_route("GET", "/get/{name}", handler, name="name") route = router["name"] assert route._match("/another/path") is None async def test_static_not_match(router) -> None: router.add_static("/pre", os.path.dirname(aiohttp.__file__), name="name") resource = router["name"] ret = await resource.resolve(make_mocked_request("GET", "/another/path")) assert (None, set()) == ret def test_dynamic_with_trailing_slash(router) -> None: handler = make_handler() router.add_route("GET", "/get/{name}/", handler, name="name") route = router["name"] assert {"name": "John"} == route._match("/get/John/") def test_len(router) -> None: handler = make_handler() router.add_route("GET", "/get1", handler, name="name1") router.add_route("GET", "/get2", handler, name="name2") assert 2 == len(router) def test_iter(router) -> None: handler = make_handler() router.add_route("GET", "/get1", handler, name="name1") router.add_route("GET", "/get2", handler, name="name2") assert {"name1", "name2"} == set(iter(router)) def test_contains(router) -> None: handler = make_handler() router.add_route("GET", "/get1", handler, name="name1") router.add_route("GET", "/get2", handler, name="name2") assert "name1" in router assert "name3" not in router def test_static_repr(router) -> None: router.add_static("/get", os.path.dirname(aiohttp.__file__), name="name") assert Matches(r" None: route = router.add_static("/prefix", os.path.dirname(aiohttp.__file__)) assert "/prefix" == route._prefix def test_static_remove_trailing_slash(router) -> None: route = router.add_static("/prefix/", os.path.dirname(aiohttp.__file__)) assert "/prefix" == route._prefix async def test_add_route_with_re(router) -> None: handler = make_handler() router.add_route("GET", r"/handler/{to:\d+}", handler) req = make_mocked_request("GET", "/handler/1234") info = await router.resolve(req) assert info is not None assert {"to": "1234"} == info router.add_route("GET", r"/handler/{name}.html", handler) req = make_mocked_request("GET", "/handler/test.html") info = await router.resolve(req) assert {"name": "test"} == info async def test_add_route_with_re_and_slashes(router) -> None: handler = make_handler() router.add_route("GET", r"/handler/{to:[^/]+/?}", handler) req = make_mocked_request("GET", "/handler/1234/") info = await router.resolve(req) assert info is not None assert {"to": "1234/"} == info router.add_route("GET", r"/handler/{to:.+}", handler) req = make_mocked_request("GET", "/handler/1234/5/6/7") info = await router.resolve(req) assert info is not None assert {"to": "1234/5/6/7"} == info async def test_add_route_with_re_not_match(router) -> None: handler = make_handler() router.add_route("GET", r"/handler/{to:\d+}", handler) req = make_mocked_request("GET", "/handler/tail") match_info = await router.resolve(req) assert isinstance(match_info.route, SystemRoute) assert {} == match_info with pytest.raises(HTTPNotFound): await match_info.handler(req) async def test_add_route_with_re_including_slashes(router) -> None: handler = make_handler() router.add_route("GET", r"/handler/{to:.+}/tail", handler) req = make_mocked_request("GET", "/handler/re/with/slashes/tail") info = await router.resolve(req) assert info is not None assert {"to": "re/with/slashes"} == info def test_add_route_with_invalid_re(router) -> None: handler = make_handler() with pytest.raises(ValueError) as ctx: router.add_route("GET", r"/handler/{to:+++}", handler) s = str(ctx.value) assert s.startswith( "Bad pattern '" + PATH_SEP + "handler" + PATH_SEP + "(?P+++)': nothing to repeat" ) assert ctx.value.__cause__ is None def test_route_dynamic_with_regex_spec(router) -> None: handler = make_handler() route = router.add_route("GET", r"/get/{num:^\d+}", handler, name="name") url = route.url_for(num="123") assert "/get/123" == str(url) def test_route_dynamic_with_regex_spec_and_trailing_slash(router) -> None: handler = make_handler() route = router.add_route("GET", r"/get/{num:^\d+}/", handler, name="name") url = route.url_for(num="123") assert "/get/123/" == str(url) def test_route_dynamic_with_regex(router) -> None: handler = make_handler() route = router.add_route("GET", r"/{one}/{two:.+}", handler) url = route.url_for(one="1", two="2") assert "/1/2" == str(url) def test_route_dynamic_quoting(router) -> None: handler = make_handler() route = router.add_route("GET", r"/пре %2Fфикс/{arg}", handler) url = route.url_for(arg="1 2/текст%2F") assert url.path == "/пре /фикс/1 2/текст%2F" assert str(url) == ( "/%D0%BF%D1%80%D0%B5%20%2F%D1%84%D0%B8%D0%BA%D1%81" "/1%202/%D1%82%D0%B5%D0%BA%D1%81%D1%82%252F" ) async def test_regular_match_info(router) -> None: handler = make_handler() router.add_route("GET", "/get/{name}", handler) req = make_mocked_request("GET", "/get/john") match_info = await router.resolve(req) assert {"name": "john"} == match_info assert Matches(">") == repr(match_info) async def test_match_info_with_plus(router) -> None: handler = make_handler() router.add_route("GET", "/get/{version}", handler) req = make_mocked_request("GET", "/get/1.0+test") match_info = await router.resolve(req) assert {"version": "1.0+test"} == match_info async def test_not_found_repr(router) -> None: req = make_mocked_request("POST", "/path/to") match_info = await router.resolve(req) assert "" == repr(match_info) async def test_not_allowed_repr(router) -> None: handler = make_handler() router.add_route("GET", "/path/to", handler) handler2 = make_handler() router.add_route("POST", "/path/to", handler2) req = make_mocked_request("PUT", "/path/to") match_info = await router.resolve(req) assert "" == repr(match_info) def test_default_expect_handler(router) -> None: route = router.add_route("GET", "/", make_handler()) assert route._expect_handler is _default_expect_handler def test_custom_expect_handler_plain(router) -> None: async def handler(request): pass route = router.add_route("GET", "/", make_handler(), expect_handler=handler) assert route._expect_handler is handler assert isinstance(route, ResourceRoute) def test_custom_expect_handler_dynamic(router) -> None: async def handler(request): pass route = router.add_route( "GET", "/get/{name}", make_handler(), expect_handler=handler ) assert route._expect_handler is handler assert isinstance(route, ResourceRoute) def test_expect_handler_non_coroutine(router) -> None: def handler(request): pass with pytest.raises(AssertionError): router.add_route("GET", "/", make_handler(), expect_handler=handler) async def test_dynamic_match_non_ascii(router) -> None: handler = make_handler() router.add_route("GET", "/{var}", handler) req = make_mocked_request( "GET", "/%D1%80%D1%83%D1%81%20%D1%82%D0%B5%D0%BA%D1%81%D1%82" ) match_info = await router.resolve(req) assert {"var": "рус текст"} == match_info async def test_dynamic_match_with_static_part(router) -> None: handler = make_handler() router.add_route("GET", "/{name}.html", handler) req = make_mocked_request("GET", "/file.html") match_info = await router.resolve(req) assert {"name": "file"} == match_info async def test_dynamic_match_two_part2(router) -> None: handler = make_handler() router.add_route("GET", "/{name}.{ext}", handler) req = make_mocked_request("GET", "/file.html") match_info = await router.resolve(req) assert {"name": "file", "ext": "html"} == match_info async def test_dynamic_match_unquoted_path(router) -> None: handler = make_handler() router.add_route("GET", "/{path}/{subpath}", handler) resource_id = "my%2Fpath%7Cwith%21some%25strange%24characters" req = make_mocked_request("GET", f"/path/{resource_id}") match_info = await router.resolve(req) assert match_info == {"path": "path", "subpath": unquote(resource_id)} def test_add_route_not_started_with_slash(router) -> None: with pytest.raises(ValueError): handler = make_handler() router.add_route("GET", "invalid_path", handler) def test_add_route_invalid_method(router) -> None: sample_bad_methods = { "BAD METHOD", "B@D_METHOD", "[BAD_METHOD]", "{BAD_METHOD}", "(BAD_METHOD)", "B?D_METHOD", } for bad_method in sample_bad_methods: with pytest.raises(ValueError): handler = make_handler() router.add_route(bad_method, "/path", handler) def test_routes_view_len(router, fill_routes) -> None: fill_routes() assert 4 == len(router.routes()) def test_routes_view_iter(router, fill_routes) -> None: routes = fill_routes() assert list(routes) == list(router.routes()) def test_routes_view_contains(router, fill_routes) -> None: routes = fill_routes() for route in routes: assert route in router.routes() def test_routes_abc(router) -> None: assert isinstance(router.routes(), Sized) assert isinstance(router.routes(), Iterable) assert isinstance(router.routes(), Container) def test_named_resources_abc(router) -> None: assert isinstance(router.named_resources(), Mapping) assert not isinstance(router.named_resources(), MutableMapping) def test_named_resources(router) -> None: route1 = router.add_route("GET", "/plain", make_handler(), name="route1") route2 = router.add_route("GET", "/variable/{name}", make_handler(), name="route2") route3 = router.add_static( "/static", os.path.dirname(aiohttp.__file__), name="route3" ) names = {route1.name, route2.name, route3.name} assert 3 == len(router.named_resources()) for name in names: assert name in router.named_resources() assert isinstance(router.named_resources()[name], AbstractResource) def test_resource_iter(router) -> None: async def handler(request): pass resource = router.add_resource("/path") r1 = resource.add_route("GET", handler) r2 = resource.add_route("POST", handler) assert 2 == len(resource) assert [r1, r2] == list(resource) def test_deprecate_bare_generators(router) -> None: resource = router.add_resource("/path") def gen(request): yield with pytest.warns(DeprecationWarning): resource.add_route("GET", gen) def test_view_route(router) -> None: resource = router.add_resource("/path") route = resource.add_route("GET", View) assert View is route.handler def test_resource_route_match(router) -> None: async def handler(request): pass resource = router.add_resource("/path") route = resource.add_route("GET", handler) assert {} == route.resource._match("/path") def test_error_on_double_route_adding(router) -> None: async def handler(request): pass resource = router.add_resource("/path") resource.add_route("GET", handler) with pytest.raises(RuntimeError): resource.add_route("GET", handler) def test_error_on_adding_route_after_wildcard(router) -> None: async def handler(request): pass resource = router.add_resource("/path") resource.add_route("*", handler) with pytest.raises(RuntimeError): resource.add_route("GET", handler) async def test_http_exception_is_none_when_resolved(router) -> None: handler = make_handler() router.add_route("GET", "/", handler) req = make_mocked_request("GET", "/") info = await router.resolve(req) assert info.http_exception is None async def test_http_exception_is_not_none_when_not_resolved(router) -> None: handler = make_handler() router.add_route("GET", "/", handler) req = make_mocked_request("GET", "/abc") info = await router.resolve(req) assert info.http_exception.status == 404 async def test_match_info_get_info_plain(router) -> None: handler = make_handler() router.add_route("GET", "/", handler) req = make_mocked_request("GET", "/") info = await router.resolve(req) assert info.get_info() == {"path": "/"} async def test_match_info_get_info_dynamic(router) -> None: handler = make_handler() router.add_route("GET", "/{a}", handler) req = make_mocked_request("GET", "/value") info = await router.resolve(req) assert info.get_info() == { "pattern": re.compile(PATH_SEP + "(?P[^{}/]+)"), "formatter": "/{a}", } async def test_match_info_get_info_dynamic2(router) -> None: handler = make_handler() router.add_route("GET", "/{a}/{b}", handler) req = make_mocked_request("GET", "/path/to") info = await router.resolve(req) assert info.get_info() == { "pattern": re.compile( PATH_SEP + "(?P[^{}/]+)" + PATH_SEP + "(?P[^{}/]+)" ), "formatter": "/{a}/{b}", } def test_static_resource_get_info(router) -> None: directory = pathlib.Path(aiohttp.__file__).parent.resolve() resource = router.add_static("/st", directory) info = resource.get_info() assert len(info) == 3 assert info["directory"] == directory assert info["prefix"] == "/st" assert all([type(r) is ResourceRoute for r in info["routes"].values()]) async def test_system_route_get_info(router) -> None: handler = make_handler() router.add_route("GET", "/", handler) req = make_mocked_request("GET", "/abc") info = await router.resolve(req) assert info.get_info()["http_exception"].status == 404 def test_resources_view_len(router) -> None: router.add_resource("/plain") router.add_resource("/variable/{name}") assert 2 == len(router.resources()) def test_resources_view_iter(router) -> None: resource1 = router.add_resource("/plain") resource2 = router.add_resource("/variable/{name}") resources = [resource1, resource2] assert list(resources) == list(router.resources()) def test_resources_view_contains(router) -> None: resource1 = router.add_resource("/plain") resource2 = router.add_resource("/variable/{name}") resources = [resource1, resource2] for resource in resources: assert resource in router.resources() def test_resources_abc(router) -> None: assert isinstance(router.resources(), Sized) assert isinstance(router.resources(), Iterable) assert isinstance(router.resources(), Container) def test_static_route_user_home(router) -> None: here = pathlib.Path(aiohttp.__file__).parent home = pathlib.Path(os.path.expanduser("~")) if not str(here).startswith(str(home)): # pragma: no cover pytest.skip("aiohttp folder is not placed in user's HOME") static_dir = "~/" + str(here.relative_to(home)) route = router.add_static("/st", static_dir) assert here == route.get_info()["directory"] def test_static_route_points_to_file(router) -> None: here = pathlib.Path(aiohttp.__file__).parent / "__init__.py" with pytest.raises(ValueError): router.add_static("/st", here) async def test_404_for_static_resource(router) -> None: resource = router.add_static("/st", os.path.dirname(aiohttp.__file__)) ret = await resource.resolve(make_mocked_request("GET", "/unknown/path")) assert (None, set()) == ret async def test_405_for_resource_adapter(router) -> None: resource = router.add_static("/st", os.path.dirname(aiohttp.__file__)) ret = await resource.resolve(make_mocked_request("POST", "/st/abc.py")) assert (None, {"HEAD", "GET"}) == ret async def test_check_allowed_method_for_found_resource(router) -> None: handler = make_handler() resource = router.add_resource("/") resource.add_route("GET", handler) ret = await resource.resolve(make_mocked_request("GET", "/")) assert ret[0] is not None assert {"GET"} == ret[1] def test_url_for_in_static_resource(router) -> None: resource = router.add_static("/static", os.path.dirname(aiohttp.__file__)) assert URL("/static/file.txt") == resource.url_for(filename="file.txt") def test_url_for_in_static_resource_pathlib(router) -> None: resource = router.add_static("/static", os.path.dirname(aiohttp.__file__)) assert URL("/static/file.txt") == resource.url_for( filename=pathlib.Path("file.txt") ) def test_url_for_in_resource_route(router) -> None: route = router.add_route("GET", "/get/{name}", make_handler(), name="name") assert URL("/get/John") == route.url_for(name="John") def test_subapp_get_info(app) -> None: subapp = web.Application() resource = subapp.add_subapp("/pre", subapp) assert resource.get_info() == {"prefix": "/pre", "app": subapp} @pytest.mark.parametrize( "domain,error", [ (None, TypeError), ("", ValueError), ("http://dom", ValueError), ("*.example.com", ValueError), ("example$com", ValueError), ], ) def test_domain_validation_error(domain, error): with pytest.raises(error): Domain(domain) def test_domain_valid(): assert Domain("example.com:81").canonical == "example.com:81" assert MaskDomain("*.example.com").canonical == r".*\.example\.com" assert Domain("пуни.код").canonical == "xn--h1ajfq.xn--d1alm" @pytest.mark.parametrize( "a,b,result", [ ("example.com", "example.com", True), ("example.com:81", "example.com:81", True), ("example.com:81", "example.com", False), ("пуникод", "xn--d1ahgkhc2a", True), ("*.example.com", "jpg.example.com", True), ("*.example.com", "a.example.com", True), ("*.example.com", "example.com", False), ], ) def test_match_domain(a, b, result): if "*" in a: rule = MaskDomain(a) else: rule = Domain(a) assert rule.match_domain(b) is result def test_add_subapp_errors(app): with pytest.raises(TypeError): app.add_subapp(1, web.Application()) def test_subapp_rule_resource(app): subapp = web.Application() subapp.router.add_get("/", make_handler()) rule = Domain("example.com") assert rule.get_info() == {"domain": "example.com"} resource = app.add_domain("example.com", subapp) assert resource.canonical == "example.com" assert resource.get_info() == {"rule": resource._rule, "app": subapp} resource.add_prefix("/a") resource.raw_match("/b") assert len(resource) assert list(resource) assert repr(resource).startswith(" None: subapp = web.Application() resource = app.add_subapp("/pre", subapp) with pytest.raises(RuntimeError): resource.url_for() def test_subapp_repr(app) -> None: subapp = web.Application() resource = app.add_subapp("/pre", subapp) assert repr(resource).startswith(" None: subapp = web.Application() subapp.router.add_get("/", make_handler(), allow_head=False) subapp.router.add_post("/", make_handler()) resource = app.add_subapp("/pre", subapp) assert len(resource) == 2 def test_subapp_iter(app) -> None: subapp = web.Application() r1 = subapp.router.add_get("/", make_handler(), allow_head=False) r2 = subapp.router.add_post("/", make_handler()) resource = app.add_subapp("/pre", subapp) assert list(resource) == [r1, r2] def test_invalid_route_name(router) -> None: with pytest.raises(ValueError): router.add_get("/", make_handler(), name="invalid name") def test_invalid_route_name(router) -> None: with pytest.raises(ValueError): router.add_get("/", make_handler(), name="class") # identifier def test_frozen_router(router) -> None: router.freeze() with pytest.raises(RuntimeError): router.add_get("/", make_handler()) def test_frozen_router_subapp(app) -> None: subapp = web.Application() subapp.freeze() with pytest.raises(RuntimeError): app.add_subapp("/pre", subapp) def test_frozen_app_on_subapp(app) -> None: app.freeze() subapp = web.Application() with pytest.raises(RuntimeError): app.add_subapp("/pre", subapp) def test_set_options_route(router) -> None: resource = router.add_static("/static", os.path.dirname(aiohttp.__file__)) options = None for route in resource: if route.method == "OPTIONS": options = route assert options is None resource.set_options_route(make_handler()) for route in resource: if route.method == "OPTIONS": options = route assert options is not None with pytest.raises(RuntimeError): resource.set_options_route(make_handler()) def test_dynamic_url_with_name_started_from_underscore(router) -> None: route = router.add_route("GET", "/get/{_name}", make_handler()) assert URL("/get/John") == route.url_for(_name="John") def test_cannot_add_subapp_with_empty_prefix(app) -> None: subapp = web.Application() with pytest.raises(ValueError): app.add_subapp("", subapp) def test_cannot_add_subapp_with_slash_prefix(app) -> None: subapp = web.Application() with pytest.raises(ValueError): app.add_subapp("/", subapp) async def test_convert_empty_path_to_slash_on_freezing(router) -> None: handler = make_handler() route = router.add_get("", handler) resource = route.resource assert resource.get_info() == {"path": ""} router.freeze() assert resource.get_info() == {"path": "/"} def test_deprecate_non_coroutine(router) -> None: def handler(request): pass with pytest.warns(DeprecationWarning): router.add_route("GET", "/handler", handler) def test_plain_resource_canonical() -> None: canonical = "/plain/path" res = PlainResource(path=canonical) assert res.canonical == canonical def test_dynamic_resource_canonical() -> None: canonicals = { "/get/{name}": "/get/{name}", r"/get/{num:^\d+}": "/get/{num}", r"/handler/{to:\d+}": r"/handler/{to}", r"/{one}/{two:.+}": r"/{one}/{two}", } for pattern, canonical in canonicals.items(): res = DynamicResource(path=pattern) assert res.canonical == canonical def test_static_resource_canonical() -> None: prefix = "/prefix" directory = str(os.path.dirname(aiohttp.__file__)) canonical = prefix res = StaticResource(prefix=prefix, directory=directory) assert res.canonical == canonical def test_prefixed_subapp_resource_canonical(app) -> None: canonical = "/prefix" subapp = web.Application() res = subapp.add_subapp(canonical, subapp) assert res.canonical == canonical async def test_prefixed_subapp_overlap(app) -> None: # Subapp should not overshadow other subapps with overlapping prefixes subapp1 = web.Application() handler1 = make_handler() subapp1.router.add_get("/a", handler1) app.add_subapp("/s", subapp1) subapp2 = web.Application() handler2 = make_handler() subapp2.router.add_get("/b", handler2) app.add_subapp("/ss", subapp2) match_info = await app.router.resolve(make_mocked_request("GET", "/s/a")) assert match_info.route.handler is handler1 match_info = await app.router.resolve(make_mocked_request("GET", "/ss/b")) assert match_info.route.handler is handler2 async def test_prefixed_subapp_empty_route(app) -> None: subapp = web.Application() handler = make_handler() subapp.router.add_get("", handler) app.add_subapp("/s", subapp) match_info = await app.router.resolve(make_mocked_request("GET", "/s")) assert match_info.route.handler is handler match_info = await app.router.resolve(make_mocked_request("GET", "/s/")) assert "" == repr(match_info) async def test_prefixed_subapp_root_route(app) -> None: subapp = web.Application() handler = make_handler() subapp.router.add_get("/", handler) app.add_subapp("/s", subapp) match_info = await app.router.resolve(make_mocked_request("GET", "/s/")) assert match_info.route.handler is handler match_info = await app.router.resolve(make_mocked_request("GET", "/s")) assert "" == repr(match_info) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_app.py0000644000175100001710000003677200000000000016742 0ustar00runnerdockerimport asyncio import gc from unittest import mock import pytest from async_generator import async_generator, yield_ from aiohttp import log, web from aiohttp.abc import AbstractAccessLogger, AbstractRouter from aiohttp.helpers import DEBUG, PY_36, PY_310 from aiohttp.test_utils import make_mocked_coro from aiohttp.typedefs import Handler async def test_app_ctor() -> None: loop = asyncio.get_event_loop() with pytest.warns(DeprecationWarning): app = web.Application(loop=loop) with pytest.warns(DeprecationWarning): assert loop is app.loop assert app.logger is log.web_logger def test_app_call() -> None: app = web.Application() assert app is app() def test_app_default_loop() -> None: app = web.Application() with pytest.warns(DeprecationWarning): assert app.loop is None async def test_set_loop() -> None: loop = asyncio.get_event_loop() app = web.Application() app._set_loop(loop) with pytest.warns(DeprecationWarning): assert app.loop is loop @pytest.mark.xfail( PY_310, reason="No idea why _set_loop() is constructed out of loop " "but it calls `asyncio.get_event_loop()`", raises=DeprecationWarning, ) def test_set_loop_default_loop() -> None: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) app = web.Application() try: app._set_loop(None) with pytest.warns(DeprecationWarning): assert app.loop is loop asyncio.set_event_loop(None) finally: # Cleanup, leaks into `test_app_make_handler_debug_exc[True]` otherwise: loop.stop() loop.run_forever() loop.close() gc.collect() def test_set_loop_with_different_loops() -> None: loop = asyncio.new_event_loop() app = web.Application() app._set_loop(loop) with pytest.warns(DeprecationWarning): assert app.loop is loop with pytest.raises(RuntimeError): app._set_loop(loop=object()) # Cleanup, leaks into `test_app_make_handler_debug_exc[True]` otherwise: loop.stop() loop.run_forever() loop.close() gc.collect() @pytest.mark.parametrize("debug", [True, False]) async def test_app_make_handler_debug_exc(mocker, debug) -> None: with pytest.warns(DeprecationWarning): app = web.Application(debug=debug) srv = mocker.patch("aiohttp.web_app.Server") with pytest.warns(DeprecationWarning): assert app.debug == debug app._make_handler() srv.assert_called_with( app._handle, request_factory=app._make_request, access_log_class=mock.ANY, loop=asyncio.get_event_loop(), debug=debug, ) async def test_app_make_handler_args(mocker) -> None: app = web.Application(handler_args={"test": True}) srv = mocker.patch("aiohttp.web_app.Server") app._make_handler() srv.assert_called_with( app._handle, request_factory=app._make_request, access_log_class=mock.ANY, loop=asyncio.get_event_loop(), debug=mock.ANY, test=True, ) async def test_app_make_handler_access_log_class(mocker) -> None: class Logger: pass app = web.Application() with pytest.raises(TypeError): app._make_handler(access_log_class=Logger) class Logger(AbstractAccessLogger): def log(self, request, response, time): self.logger.info("msg") srv = mocker.patch("aiohttp.web_app.Server") app._make_handler(access_log_class=Logger) srv.assert_called_with( app._handle, access_log_class=Logger, request_factory=app._make_request, loop=asyncio.get_event_loop(), debug=mock.ANY, ) app = web.Application(handler_args={"access_log_class": Logger}) app._make_handler(access_log_class=Logger) srv.assert_called_with( app._handle, access_log_class=Logger, request_factory=app._make_request, loop=asyncio.get_event_loop(), debug=mock.ANY, ) async def test_app_make_handler_raises_deprecation_warning() -> None: app = web.Application() with pytest.warns(DeprecationWarning): app.make_handler() async def test_app_register_on_finish() -> None: app = web.Application() cb1 = make_mocked_coro(None) cb2 = make_mocked_coro(None) app.on_cleanup.append(cb1) app.on_cleanup.append(cb2) app.freeze() await app.cleanup() cb1.assert_called_once_with(app) cb2.assert_called_once_with(app) async def test_app_register_coro() -> None: app = web.Application() fut = asyncio.get_event_loop().create_future() async def cb(app): await asyncio.sleep(0.001) fut.set_result(123) app.on_cleanup.append(cb) app.freeze() await app.cleanup() assert fut.done() assert 123 == fut.result() def test_non_default_router() -> None: router = mock.Mock(spec=AbstractRouter) with pytest.warns(DeprecationWarning): app = web.Application(router=router) assert router is app.router def test_logging() -> None: logger = mock.Mock() app = web.Application() app.logger = logger assert app.logger is logger async def test_on_shutdown() -> None: app = web.Application() called = False async def on_shutdown(app_param): nonlocal called assert app is app_param called = True app.on_shutdown.append(on_shutdown) app.freeze() await app.shutdown() assert called async def test_on_startup() -> None: app = web.Application() long_running1_called = False long_running2_called = False all_long_running_called = False async def long_running1(app_param): nonlocal long_running1_called assert app is app_param long_running1_called = True async def long_running2(app_param): nonlocal long_running2_called assert app is app_param long_running2_called = True async def on_startup_all_long_running(app_param): nonlocal all_long_running_called assert app is app_param all_long_running_called = True return await asyncio.gather(long_running1(app_param), long_running2(app_param)) app.on_startup.append(on_startup_all_long_running) app.freeze() await app.startup() assert long_running1_called assert long_running2_called assert all_long_running_called def test_app_delitem() -> None: app = web.Application() app["key"] = "value" assert len(app) == 1 del app["key"] assert len(app) == 0 def test_app_freeze() -> None: app = web.Application() subapp = mock.Mock() subapp._middlewares = () app._subapps.append(subapp) app.freeze() assert subapp.freeze.called app.freeze() assert len(subapp.freeze.call_args_list) == 1 def test_equality() -> None: app1 = web.Application() app2 = web.Application() assert app1 == app1 assert app1 != app2 def test_app_run_middlewares() -> None: root = web.Application() sub = web.Application() root.add_subapp("/sub", sub) root.freeze() assert root._run_middlewares is False @web.middleware async def middleware(request, handler: Handler): return await handler(request) root = web.Application(middlewares=[middleware]) sub = web.Application() root.add_subapp("/sub", sub) root.freeze() assert root._run_middlewares is True root = web.Application() sub = web.Application(middlewares=[middleware]) root.add_subapp("/sub", sub) root.freeze() assert root._run_middlewares is True def test_subapp_pre_frozen_after_adding() -> None: app = web.Application() subapp = web.Application() app.add_subapp("/prefix", subapp) assert subapp.pre_frozen assert not subapp.frozen @pytest.mark.skipif(not PY_36, reason="Python 3.6+ required") def test_app_inheritance() -> None: with pytest.warns(DeprecationWarning): class A(web.Application): pass @pytest.mark.skipif(not DEBUG, reason="The check is applied in DEBUG mode only") def test_app_custom_attr() -> None: app = web.Application() with pytest.warns(DeprecationWarning): app.custom = None async def test_cleanup_ctx() -> None: app = web.Application() out = [] def f(num): @async_generator async def inner(app): out.append("pre_" + str(num)) await yield_(None) out.append("post_" + str(num)) return inner app.cleanup_ctx.append(f(1)) app.cleanup_ctx.append(f(2)) app.freeze() await app.startup() assert out == ["pre_1", "pre_2"] await app.cleanup() assert out == ["pre_1", "pre_2", "post_2", "post_1"] async def test_cleanup_ctx_exception_on_startup() -> None: app = web.Application() out = [] exc = Exception("fail") def f(num, fail=False): @async_generator async def inner(app): out.append("pre_" + str(num)) if fail: raise exc await yield_(None) out.append("post_" + str(num)) return inner app.cleanup_ctx.append(f(1)) app.cleanup_ctx.append(f(2, True)) app.cleanup_ctx.append(f(3)) app.freeze() with pytest.raises(Exception) as ctx: await app.startup() assert ctx.value is exc assert out == ["pre_1", "pre_2"] await app.cleanup() assert out == ["pre_1", "pre_2", "post_1"] async def test_cleanup_ctx_exception_on_cleanup() -> None: app = web.Application() out = [] exc = Exception("fail") def f(num, fail=False): @async_generator async def inner(app): out.append("pre_" + str(num)) await yield_(None) out.append("post_" + str(num)) if fail: raise exc return inner app.cleanup_ctx.append(f(1)) app.cleanup_ctx.append(f(2, True)) app.cleanup_ctx.append(f(3)) app.freeze() await app.startup() assert out == ["pre_1", "pre_2", "pre_3"] with pytest.raises(Exception) as ctx: await app.cleanup() assert ctx.value is exc assert out == ["pre_1", "pre_2", "pre_3", "post_3", "post_2", "post_1"] async def test_cleanup_ctx_cleanup_after_exception() -> None: app = web.Application() ctx_state = None async def success_ctx(app): nonlocal ctx_state ctx_state = "START" yield ctx_state = "CLEAN" async def fail_ctx(app): raise Exception() yield app.cleanup_ctx.append(success_ctx) app.cleanup_ctx.append(fail_ctx) runner = web.AppRunner(app) try: with pytest.raises(Exception): await runner.setup() finally: await runner.cleanup() assert ctx_state == "CLEAN" async def test_cleanup_ctx_exception_on_cleanup_multiple() -> None: app = web.Application() out = [] def f(num, fail=False): @async_generator async def inner(app): out.append("pre_" + str(num)) await yield_(None) out.append("post_" + str(num)) if fail: raise Exception("fail_" + str(num)) return inner app.cleanup_ctx.append(f(1)) app.cleanup_ctx.append(f(2, True)) app.cleanup_ctx.append(f(3, True)) app.freeze() await app.startup() assert out == ["pre_1", "pre_2", "pre_3"] with pytest.raises(web.CleanupError) as ctx: await app.cleanup() exc = ctx.value assert len(exc.exceptions) == 2 assert str(exc.exceptions[0]) == "fail_3" assert str(exc.exceptions[1]) == "fail_2" assert out == ["pre_1", "pre_2", "pre_3", "post_3", "post_2", "post_1"] async def test_cleanup_ctx_multiple_yields() -> None: app = web.Application() out = [] def f(num): @async_generator async def inner(app): out.append("pre_" + str(num)) await yield_(None) out.append("post_" + str(num)) await yield_(None) return inner app.cleanup_ctx.append(f(1)) app.freeze() await app.startup() assert out == ["pre_1"] with pytest.raises(RuntimeError) as ctx: await app.cleanup() assert "has more than one 'yield'" in str(ctx.value) assert out == ["pre_1", "post_1"] async def test_subapp_chained_config_dict_visibility(aiohttp_client) -> None: async def main_handler(request): assert request.config_dict["key1"] == "val1" assert "key2" not in request.config_dict return web.Response(status=200) root = web.Application() root["key1"] = "val1" root.add_routes([web.get("/", main_handler)]) async def sub_handler(request): assert request.config_dict["key1"] == "val1" assert request.config_dict["key2"] == "val2" return web.Response(status=201) sub = web.Application() sub["key2"] = "val2" sub.add_routes([web.get("/", sub_handler)]) root.add_subapp("/sub", sub) client = await aiohttp_client(root) resp = await client.get("/") assert resp.status == 200 resp = await client.get("/sub/") assert resp.status == 201 async def test_subapp_chained_config_dict_overriding(aiohttp_client) -> None: async def main_handler(request): assert request.config_dict["key"] == "val1" return web.Response(status=200) root = web.Application() root["key"] = "val1" root.add_routes([web.get("/", main_handler)]) async def sub_handler(request): assert request.config_dict["key"] == "val2" return web.Response(status=201) sub = web.Application() sub["key"] = "val2" sub.add_routes([web.get("/", sub_handler)]) root.add_subapp("/sub", sub) client = await aiohttp_client(root) resp = await client.get("/") assert resp.status == 200 resp = await client.get("/sub/") assert resp.status == 201 async def test_subapp_on_startup(aiohttp_client) -> None: subapp = web.Application() startup_called = False async def on_startup(app): nonlocal startup_called startup_called = True app["startup"] = True subapp.on_startup.append(on_startup) ctx_pre_called = False ctx_post_called = False @async_generator async def cleanup_ctx(app): nonlocal ctx_pre_called, ctx_post_called ctx_pre_called = True app["cleanup"] = True await yield_(None) ctx_post_called = True subapp.cleanup_ctx.append(cleanup_ctx) shutdown_called = False async def on_shutdown(app): nonlocal shutdown_called shutdown_called = True subapp.on_shutdown.append(on_shutdown) cleanup_called = False async def on_cleanup(app): nonlocal cleanup_called cleanup_called = True subapp.on_cleanup.append(on_cleanup) app = web.Application() app.add_subapp("/subapp", subapp) assert not startup_called assert not ctx_pre_called assert not ctx_post_called assert not shutdown_called assert not cleanup_called assert subapp.on_startup.frozen assert subapp.cleanup_ctx.frozen assert subapp.on_shutdown.frozen assert subapp.on_cleanup.frozen assert subapp.router.frozen client = await aiohttp_client(app) assert startup_called assert ctx_pre_called assert not ctx_post_called assert not shutdown_called assert not cleanup_called await client.close() assert startup_called assert ctx_pre_called assert ctx_post_called assert shutdown_called assert cleanup_called def test_app_iter(): app = web.Application() app["a"] = "1" app["b"] = "2" assert sorted(list(app)) == ["a", "b"] def test_app_boolean() -> None: app = web.Application() assert app ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_cli.py0000644000175100001710000000766200000000000016725 0ustar00runnerdockerimport pytest from aiohttp import web def test_entry_func_empty(mocker) -> None: error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) argv = [""] with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("'entry-func' not in 'module:function' syntax") def test_entry_func_only_module(mocker) -> None: argv = ["test"] error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("'entry-func' not in 'module:function' syntax") def test_entry_func_only_function(mocker) -> None: argv = [":test"] error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("'entry-func' not in 'module:function' syntax") def test_entry_func_only_separator(mocker) -> None: argv = [":"] error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("'entry-func' not in 'module:function' syntax") def test_entry_func_relative_module(mocker) -> None: argv = [".a.b:c"] error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("relative module names not supported") def test_entry_func_non_existent_module(mocker) -> None: argv = ["alpha.beta:func"] mocker.patch("aiohttp.web.import_module", side_effect=ImportError("Test Error")) error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with("unable to import alpha.beta: Test Error") def test_entry_func_non_existent_attribute(mocker) -> None: argv = ["alpha.beta:func"] import_module = mocker.patch("aiohttp.web.import_module") error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) module = import_module("alpha.beta") del module.func with pytest.raises(SystemExit): web.main(argv) error.assert_called_with( "module {!r} has no attribute {!r}".format("alpha.beta", "func") ) def test_path_when_unsupported(mocker, monkeypatch) -> None: argv = "--path=test_path.sock alpha.beta:func".split() mocker.patch("aiohttp.web.import_module") monkeypatch.delattr("socket.AF_UNIX", raising=False) error = mocker.patch("aiohttp.web.ArgumentParser.error", side_effect=SystemExit) with pytest.raises(SystemExit): web.main(argv) error.assert_called_with( "file system paths not supported by your" " operating environment" ) def test_entry_func_call(mocker) -> None: mocker.patch("aiohttp.web.run_app") import_module = mocker.patch("aiohttp.web.import_module") argv = ( "-H testhost -P 6666 --extra-optional-eins alpha.beta:func " "--extra-optional-zwei extra positional args" ).split() module = import_module("alpha.beta") with pytest.raises(SystemExit): web.main(argv) module.func.assert_called_with( ("--extra-optional-eins --extra-optional-zwei extra positional " "args").split() ) def test_running_application(mocker) -> None: run_app = mocker.patch("aiohttp.web.run_app") import_module = mocker.patch("aiohttp.web.import_module") exit = mocker.patch("aiohttp.web.ArgumentParser.exit", side_effect=SystemExit) argv = ( "-H testhost -P 6666 --extra-optional-eins alpha.beta:func " "--extra-optional-zwei extra positional args" ).split() module = import_module("alpha.beta") app = module.func() with pytest.raises(SystemExit): web.main(argv) run_app.assert_called_with(app, host="testhost", port=6666, path=None) exit.assert_called_with(message="Stopped\n") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_exceptions.py0000644000175100001710000001535700000000000020337 0ustar00runnerdockerimport collections import re from traceback import format_exception from unittest import mock import aiosignal import pytest from aiohttp import helpers, web from aiohttp.test_utils import make_mocked_request @pytest.fixture def buf(): return bytearray() @pytest.fixture def http_request(buf): method = "GET" path = "/" writer = mock.Mock() writer.drain.return_value = () def append(data=b""): buf.extend(data) return helpers.noop() async def write_headers(status_line, headers): headers = ( status_line + "\r\n" + "".join([k + ": " + v + "\r\n" for k, v in headers.items()]) ) headers = headers.encode("utf-8") + b"\r\n" buf.extend(headers) writer.buffer_data.side_effect = append writer.write.side_effect = append writer.write_eof.side_effect = append writer.write_headers.side_effect = write_headers app = mock.Mock() app._debug = False app.on_response_prepare = aiosignal.Signal(app) app.on_response_prepare.freeze() req = make_mocked_request(method, path, app=app, writer=writer) return req def test_all_http_exceptions_exported() -> None: assert "HTTPException" in web.__all__ for name in dir(web): if name.startswith("_"): continue obj = getattr(web, name) if isinstance(obj, type) and issubclass(obj, web.HTTPException): assert name in web.__all__ async def test_HTTPOk(buf, http_request) -> None: resp = web.HTTPOk() await resp.prepare(http_request) await resp.write_eof() txt = buf.decode("utf8") assert re.match( ( "HTTP/1.1 200 OK\r\n" "Content-Type: text/plain; charset=utf-8\r\n" "Content-Length: 7\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" "200: OK" ), txt, ) def test_terminal_classes_has_status_code() -> None: terminals = set() for name in dir(web): obj = getattr(web, name) if isinstance(obj, type) and issubclass(obj, web.HTTPException): terminals.add(obj) dup = frozenset(terminals) for cls1 in dup: for cls2 in dup: if cls1 in cls2.__bases__: terminals.discard(cls1) for cls in terminals: assert cls.status_code is not None codes = collections.Counter(cls.status_code for cls in terminals) assert None not in codes assert 1 == codes.most_common(1)[0][1] async def test_HTTPFound(buf, http_request) -> None: resp = web.HTTPFound(location="/redirect") assert "/redirect" == resp.location assert "/redirect" == resp.headers["location"] await resp.prepare(http_request) await resp.write_eof() txt = buf.decode("utf8") assert re.match( "HTTP/1.1 302 Found\r\n" "Content-Type: text/plain; charset=utf-8\r\n" "Location: /redirect\r\n" "Content-Length: 10\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" "302: Found", txt, ) def test_HTTPFound_empty_location() -> None: with pytest.raises(ValueError): web.HTTPFound(location="") with pytest.raises(ValueError): web.HTTPFound(location=None) def test_HTTPFound_location_CRLF() -> None: exc = web.HTTPFound(location="/redirect\r\n") assert "\r\n" not in exc.headers["Location"] async def test_HTTPMethodNotAllowed(buf, http_request) -> None: resp = web.HTTPMethodNotAllowed("get", ["POST", "PUT"]) assert "GET" == resp.method assert {"POST", "PUT"} == resp.allowed_methods assert "POST,PUT" == resp.headers["allow"] await resp.prepare(http_request) await resp.write_eof() txt = buf.decode("utf8") assert re.match( "HTTP/1.1 405 Method Not Allowed\r\n" "Content-Type: text/plain; charset=utf-8\r\n" "Allow: POST,PUT\r\n" "Content-Length: 23\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" "405: Method Not Allowed", txt, ) def test_override_body_with_text() -> None: resp = web.HTTPNotFound(text="Page not found") assert 404 == resp.status assert b"Page not found" == resp.body assert "Page not found" == resp.text assert "text/plain" == resp.content_type assert "utf-8" == resp.charset def test_override_body_with_binary() -> None: txt = "Page not found" with pytest.warns(DeprecationWarning): resp = web.HTTPNotFound(body=txt.encode("utf-8"), content_type="text/html") assert 404 == resp.status assert txt.encode("utf-8") == resp.body assert txt == resp.text assert "text/html" == resp.content_type assert resp.charset is None def test_default_body() -> None: resp = web.HTTPOk() assert b"200: OK" == resp.body def test_empty_body_204() -> None: resp = web.HTTPNoContent() assert resp.body is None def test_empty_body_205() -> None: resp = web.HTTPNoContent() assert resp.body is None def test_empty_body_304() -> None: resp = web.HTTPNoContent() resp.body is None def test_link_header_451(buf) -> None: resp = web.HTTPUnavailableForLegalReasons(link="http://warning.or.kr/") assert "http://warning.or.kr/" == resp.link assert '; rel="blocked-by"' == resp.headers["Link"] def test_HTTPException_retains_cause() -> None: with pytest.raises(web.HTTPException) as ei: try: raise Exception("CustomException") except Exception as exc: raise web.HTTPException() from exc tb = "".join(format_exception(ei.type, ei.value, ei.tb)) assert "CustomException" in tb assert "direct cause" in tb async def test_HTTPException_retains_cookie(aiohttp_client): @web.middleware async def middleware(request, handler): try: return await handler(request) except web.HTTPException as exc: exc.set_cookie("foo", request["foo"]) raise exc async def save(request): request["foo"] = "works" raise web.HTTPFound("/show") async def show(request): return web.Response(text=request.cookies["foo"]) app = web.Application(middlewares=[middleware]) app.router.add_route("GET", "/save", save) app.router.add_route("GET", "/show", show) client = await aiohttp_client(app) resp = await client.get("/save") assert resp.status == 200 assert str(resp.url)[-5:] == "/show" text = await resp.text() assert text == "works" def test_unicode_text_body_unauthorized() -> None: """Test that HTTPUnauthorized can be initialized with a string.""" with pytest.warns( DeprecationWarning, match="body argument is deprecated for http web exceptions" ): resp = web.HTTPUnauthorized(body="text") assert resp.status == 401 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_functional.py0000644000175100001710000016711200000000000020315 0ustar00runnerdockerimport asyncio import io import json import pathlib import socket import zlib from unittest import mock import pytest from async_generator import async_generator, yield_ from multidict import CIMultiDictProxy, MultiDict from yarl import URL import aiohttp from aiohttp import FormData, HttpVersion10, HttpVersion11, TraceConfig, multipart, web from aiohttp.hdrs import CONTENT_LENGTH, CONTENT_TYPE, TRANSFER_ENCODING from aiohttp.test_utils import make_mocked_coro from aiohttp.typedefs import Handler try: import ssl except ImportError: ssl = None # type: ignore @pytest.fixture def here(): return pathlib.Path(__file__).parent @pytest.fixture def fname(here): return here / "conftest.py" def new_dummy_form(): form = FormData() form.add_field("name", b"123", content_transfer_encoding="base64") return form async def test_simple_get(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(body=b"OK") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert "OK" == txt async def test_simple_get_with_text(aiohttp_client) -> None: async def handler(request): body = await request.read() assert b"" == body return web.Response(text="OK", headers={"content-type": "text/plain"}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert "OK" == txt async def test_handler_returns_not_response(aiohttp_server, aiohttp_client) -> None: asyncio.get_event_loop().set_debug(True) logger = mock.Mock() async def handler(request): return "abc" app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app, logger=logger) client = await aiohttp_client(server) with pytest.raises(aiohttp.ServerDisconnectedError): await client.get("/") logger.exception.assert_called_with( "Unhandled runtime exception", exc_info=mock.ANY ) async def test_handler_returns_none(aiohttp_server, aiohttp_client) -> None: asyncio.get_event_loop().set_debug(True) logger = mock.Mock() async def handler(request): return None app = web.Application() app.router.add_get("/", handler) server = await aiohttp_server(app, logger=logger) client = await aiohttp_client(server) with pytest.raises(aiohttp.ServerDisconnectedError): await client.get("/") # Actual error text is placed in exc_info logger.exception.assert_called_with( "Unhandled runtime exception", exc_info=mock.ANY ) async def test_head_returns_empty_body(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"test") app = web.Application() app.router.add_head("/", handler) client = await aiohttp_client(app, version=HttpVersion11) resp = await client.head("/") assert 200 == resp.status txt = await resp.text() assert "" == txt async def test_response_before_complete(aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) data = b"0" * 1024 * 1024 resp = await client.post("/", data=data) assert 200 == resp.status text = await resp.text() assert "OK" == text async def test_post_form(aiohttp_client) -> None: async def handler(request): data = await request.post() assert {"a": "1", "b": "2", "c": ""} == data return web.Response(body=b"OK") app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data={"a": 1, "b": 2, "c": ""}) assert 200 == resp.status txt = await resp.text() assert "OK" == txt async def test_post_text(aiohttp_client) -> None: async def handler(request): data = await request.text() assert "русский" == data data2 = await request.text() assert data == data2 return web.Response(text=data) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data="русский") assert 200 == resp.status txt = await resp.text() assert "русский" == txt async def test_post_json(aiohttp_client) -> None: dct = {"key": "текст"} async def handler(request): data = await request.json() assert dct == data data2 = await request.json(loads=json.loads) assert data == data2 resp = web.Response() resp.content_type = "application/json" resp.body = json.dumps(data).encode("utf8") return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) headers = {"Content-Type": "application/json"} resp = await client.post("/", data=json.dumps(dct), headers=headers) assert 200 == resp.status data = await resp.json() assert dct == data async def test_multipart(aiohttp_client) -> None: with multipart.MultipartWriter() as writer: writer.append("test") writer.append_json({"passed": True}) async def handler(request): reader = await request.multipart() assert isinstance(reader, multipart.MultipartReader) part = await reader.next() assert isinstance(part, multipart.BodyPartReader) thing = await part.text() assert thing == "test" part = await reader.next() assert isinstance(part, multipart.BodyPartReader) assert part.headers["Content-Type"] == "application/json" thing = await part.json() assert thing == {"passed": True} resp = web.Response() resp.content_type = "application/json" resp.body = b"" return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=writer) assert 200 == resp.status await resp.release() async def test_multipart_empty(aiohttp_client) -> None: with multipart.MultipartWriter() as writer: pass async def handler(request): reader = await request.multipart() assert isinstance(reader, multipart.MultipartReader) async for part in reader: assert False, f"Unexpected part found in reader: {part!r}" return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=writer) assert 200 == resp.status await resp.release() async def test_multipart_content_transfer_encoding(aiohttp_client) -> None: # For issue #1168 with multipart.MultipartWriter() as writer: writer.append(b"\x00" * 10, headers={"Content-Transfer-Encoding": "binary"}) async def handler(request): reader = await request.multipart() assert isinstance(reader, multipart.MultipartReader) part = await reader.next() assert isinstance(part, multipart.BodyPartReader) assert part.headers["Content-Transfer-Encoding"] == "binary" thing = await part.read() assert thing == b"\x00" * 10 resp = web.Response() resp.content_type = "application/json" resp.body = b"" return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=writer) assert 200 == resp.status await resp.release() async def test_render_redirect(aiohttp_client) -> None: async def handler(request): raise web.HTTPMovedPermanently(location="/path") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/", allow_redirects=False) assert 301 == resp.status txt = await resp.text() assert "301: Moved Permanently" == txt assert "/path" == resp.headers["location"] async def test_post_single_file(aiohttp_client) -> None: here = pathlib.Path(__file__).parent def check_file(fs): fullname = here / fs.filename with fullname.open("rb") as f: test_data = f.read() data = fs.file.read() assert test_data == data async def handler(request): data = await request.post() assert ["data.unknown_mime_type"] == list(data.keys()) for fs in data.values(): check_file(fs) fs.file.close() resp = web.Response(body=b"OK") return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) fname = here / "data.unknown_mime_type" with fname.open("rb") as fd: resp = await client.post("/", data=[fd]) assert 200 == resp.status async def test_files_upload_with_same_key(aiohttp_client) -> None: async def handler(request): data = await request.post() files = data.getall("file") file_names = set() for _file in files: assert not _file.file.closed if _file.filename == "test1.jpeg": assert _file.file.read() == b"binary data 1" if _file.filename == "test2.jpeg": assert _file.file.read() == b"binary data 2" file_names.add(_file.filename) assert len(files) == 2 assert file_names == {"test1.jpeg", "test2.jpeg"} resp = web.Response(body=b"OK") return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) data = FormData() data.add_field( "file", b"binary data 1", content_type="image/jpeg", filename="test1.jpeg" ) data.add_field( "file", b"binary data 2", content_type="image/jpeg", filename="test2.jpeg" ) resp = await client.post("/", data=data) assert 200 == resp.status async def test_post_files(aiohttp_client) -> None: here = pathlib.Path(__file__).parent def check_file(fs): fullname = here / fs.filename with fullname.open("rb") as f: test_data = f.read() data = fs.file.read() assert test_data == data async def handler(request): data = await request.post() assert ["data.unknown_mime_type", "conftest.py"] == list(data.keys()) for fs in data.values(): check_file(fs) fs.file.close() resp = web.Response(body=b"OK") return resp app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with (here / "data.unknown_mime_type").open("rb") as f1: with (here / "conftest.py").open("rb") as f2: resp = await client.post("/", data=[f1, f2]) assert 200 == resp.status async def test_release_post_data(aiohttp_client) -> None: async def handler(request): await request.release() chunk = await request.content.readany() assert chunk == b"" return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data="post text") assert 200 == resp.status async def test_POST_DATA_with_content_transfer_encoding(aiohttp_client) -> None: async def handler(request): data = await request.post() assert b"123" == data["name"] return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) form = FormData() form.add_field("name", b"123", content_transfer_encoding="base64") resp = await client.post("/", data=form) assert 200 == resp.status async def test_post_form_with_duplicate_keys(aiohttp_client) -> None: async def handler(request): data = await request.post() lst = list(data.items()) assert [("a", "1"), ("a", "2")] == lst return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=MultiDict([("a", 1), ("a", 2)])) assert 200 == resp.status def test_repr_for_application() -> None: app = web.Application() assert f"" == repr(app) async def test_expect_default_handler_unknown(aiohttp_client) -> None: # Test default Expect handler for unknown Expect value. # A server that does not understand or is unable to comply with any of # the expectation values in the Expect field of a request MUST respond # with appropriate error status. The server MUST respond with a 417 # (Expectation Failed) status if any of the expectations cannot be met # or, if there are other problems with the request, some other 4xx # status. # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.20 async def handler(request): await request.post() pytest.xfail( "Handler should not proceed to this point in case of " "unknown Expect header" ) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", headers={"Expect": "SPAM"}) assert 417 == resp.status async def test_100_continue(aiohttp_client) -> None: async def handler(request): data = await request.post() assert b"123" == data["name"] return web.Response() form = FormData() form.add_field("name", b"123", content_transfer_encoding="base64") app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=form, expect100=True) assert 200 == resp.status async def test_100_continue_custom(aiohttp_client) -> None: expect_received = False async def handler(request): data = await request.post() assert b"123" == data["name"] return web.Response() async def expect_handler(request): nonlocal expect_received expect_received = True if request.version == HttpVersion11: await request.writer.write(b"HTTP/1.1 100 Continue\r\n\r\n") app = web.Application() app.router.add_post("/", handler, expect_handler=expect_handler) client = await aiohttp_client(app) resp = await client.post("/", data=new_dummy_form(), expect100=True) assert 200 == resp.status assert expect_received async def test_100_continue_custom_response(aiohttp_client) -> None: async def handler(request): data = await request.post() assert b"123", data["name"] return web.Response() async def expect_handler(request): if request.version == HttpVersion11: if auth_err: raise web.HTTPForbidden() await request.writer.write(b"HTTP/1.1 100 Continue\r\n\r\n") app = web.Application() app.router.add_post("/", handler, expect_handler=expect_handler) client = await aiohttp_client(app) auth_err = False resp = await client.post("/", data=new_dummy_form(), expect100=True) assert 200 == resp.status auth_err = True resp = await client.post("/", data=new_dummy_form(), expect100=True) assert 403 == resp.status async def test_100_continue_for_not_found(aiohttp_client) -> None: app = web.Application() client = await aiohttp_client(app) resp = await client.post("/not_found", data="data", expect100=True) assert 404 == resp.status async def test_100_continue_for_not_allowed(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.get("/", expect100=True) assert 405 == resp.status async def test_http11_keep_alive_default(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, version=HttpVersion11) resp = await client.get("/") assert 200 == resp.status assert resp.version == HttpVersion11 assert "Connection" not in resp.headers @pytest.mark.xfail async def test_http10_keep_alive_default(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, version=HttpVersion10) resp = await client.get("/") assert 200 == resp.status assert resp.version == HttpVersion10 assert resp.headers["Connection"] == "keep-alive" async def test_http10_keep_alive_with_headers_close(aiohttp_client) -> None: async def handler(request): await request.read() return web.Response(body=b"OK") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, version=HttpVersion10) headers = {"Connection": "close"} resp = await client.get("/", headers=headers) assert 200 == resp.status assert resp.version == HttpVersion10 assert "Connection" not in resp.headers async def test_http10_keep_alive_with_headers(aiohttp_client) -> None: async def handler(request): await request.read() return web.Response(body=b"OK") app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, version=HttpVersion10) headers = {"Connection": "keep-alive"} resp = await client.get("/", headers=headers) assert 200 == resp.status assert resp.version == HttpVersion10 assert resp.headers["Connection"] == "keep-alive" async def test_upload_file(aiohttp_client) -> None: here = pathlib.Path(__file__).parent fname = here / "aiohttp.png" with fname.open("rb") as f: data = f.read() async def handler(request): form = await request.post() raw_data = form["file"].file.read() assert data == raw_data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data={"file": data}) assert 200 == resp.status async def test_upload_file_object(aiohttp_client) -> None: here = pathlib.Path(__file__).parent fname = here / "aiohttp.png" with fname.open("rb") as f: data = f.read() async def handler(request): form = await request.post() raw_data = form["file"].file.read() assert data == raw_data return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) with fname.open("rb") as f: resp = await client.post("/", data={"file": f}) assert 200 == resp.status @pytest.mark.parametrize( "method", ["get", "post", "options", "post", "put", "patch", "delete"] ) async def test_empty_content_for_query_without_body(method, aiohttp_client) -> None: async def handler(request): assert not request.body_exists assert not request.can_read_body with pytest.warns(DeprecationWarning): assert not request.has_body return web.Response() app = web.Application() app.router.add_route(method, "/", handler) client = await aiohttp_client(app) resp = await client.request(method, "/") assert 200 == resp.status async def test_empty_content_for_query_with_body(aiohttp_client) -> None: async def handler(request): assert request.body_exists assert request.can_read_body with pytest.warns(DeprecationWarning): assert request.has_body body = await request.read() return web.Response(body=body) app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=b"data") assert 200 == resp.status async def test_get_with_empty_arg(aiohttp_client) -> None: async def handler(request): assert "arg" in request.query assert "" == request.query["arg"] return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/?arg") assert 200 == resp.status async def test_large_header(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) headers = {"Long-Header": "ab" * 8129} resp = await client.get("/", headers=headers) assert 400 == resp.status async def test_large_header_allowed(aiohttp_client, aiohttp_server) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_post("/", handler) server = await aiohttp_server(app, max_field_size=81920) client = await aiohttp_client(server) headers = {"Long-Header": "ab" * 8129} resp = await client.post("/", headers=headers) assert 200 == resp.status async def test_get_with_empty_arg_with_equal(aiohttp_client) -> None: async def handler(request): assert "arg" in request.query assert "" == request.query["arg"] return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/?arg=") assert 200 == resp.status async def test_response_with_async_gen(aiohttp_client, fname) -> None: with fname.open("rb") as f: data = f.read() data_size = len(data) @async_generator async def stream(f_name): with f_name.open("rb") as f: data = f.read(100) while data: await yield_(data) data = f.read(100) async def handler(request): headers = {"Content-Length": str(data_size)} return web.Response(body=stream(fname), headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == data assert resp.headers.get("Content-Length") == str(len(resp_data)) async def test_response_with_streamer(aiohttp_client, fname) -> None: with fname.open("rb") as f: data = f.read() data_size = len(data) with pytest.warns(DeprecationWarning): @aiohttp.streamer async def stream(writer, f_name): with f_name.open("rb") as f: data = f.read(100) while data: await writer.write(data) data = f.read(100) async def handler(request): headers = {"Content-Length": str(data_size)} return web.Response(body=stream(fname), headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == data assert resp.headers.get("Content-Length") == str(len(resp_data)) async def test_response_with_async_gen_no_params(aiohttp_client, fname) -> None: with fname.open("rb") as f: data = f.read() data_size = len(data) @async_generator async def stream(): with fname.open("rb") as f: data = f.read(100) while data: await yield_(data) data = f.read(100) async def handler(request): headers = {"Content-Length": str(data_size)} return web.Response(body=stream(), headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == data assert resp.headers.get("Content-Length") == str(len(resp_data)) async def test_response_with_streamer_no_params(aiohttp_client, fname) -> None: with fname.open("rb") as f: data = f.read() data_size = len(data) with pytest.warns(DeprecationWarning): @aiohttp.streamer async def stream(writer): with fname.open("rb") as f: data = f.read(100) while data: await writer.write(data) data = f.read(100) async def handler(request): headers = {"Content-Length": str(data_size)} return web.Response(body=stream, headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == data assert resp.headers.get("Content-Length") == str(len(resp_data)) async def test_response_with_file(aiohttp_client, fname) -> None: outer_file_descriptor = None with fname.open("rb") as f: data = f.read() async def handler(request): nonlocal outer_file_descriptor outer_file_descriptor = fname.open("rb") return web.Response(body=outer_file_descriptor) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() expected_content_disposition = 'attachment; filename="conftest.py"' assert resp_data == data assert resp.headers.get("Content-Type") in ( "application/octet-stream", "text/x-python", "text/plain", ) assert resp.headers.get("Content-Length") == str(len(resp_data)) assert resp.headers.get("Content-Disposition") == expected_content_disposition outer_file_descriptor.close() async def test_response_with_file_ctype(aiohttp_client, fname) -> None: outer_file_descriptor = None with fname.open("rb") as f: data = f.read() async def handler(request): nonlocal outer_file_descriptor outer_file_descriptor = fname.open("rb") return web.Response( body=outer_file_descriptor, headers={"content-type": "text/binary"} ) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() expected_content_disposition = 'attachment; filename="conftest.py"' assert resp_data == data assert resp.headers.get("Content-Type") == "text/binary" assert resp.headers.get("Content-Length") == str(len(resp_data)) assert resp.headers.get("Content-Disposition") == expected_content_disposition outer_file_descriptor.close() async def test_response_with_payload_disp(aiohttp_client, fname) -> None: outer_file_descriptor = None with fname.open("rb") as f: data = f.read() async def handler(request): nonlocal outer_file_descriptor outer_file_descriptor = fname.open("rb") pl = aiohttp.get_payload(outer_file_descriptor) pl.set_content_disposition("inline", filename="test.txt") return web.Response(body=pl, headers={"content-type": "text/binary"}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == data assert resp.headers.get("Content-Type") == "text/binary" assert resp.headers.get("Content-Length") == str(len(resp_data)) assert resp.headers.get("Content-Disposition") == 'inline; filename="test.txt"' outer_file_descriptor.close() async def test_response_with_payload_stringio(aiohttp_client, fname) -> None: async def handler(request): return web.Response(body=io.StringIO("test")) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status resp_data = await resp.read() assert resp_data == b"test" async def test_response_with_precompressed_body_gzip(aiohttp_client) -> None: async def handler(request): headers = {"Content-Encoding": "gzip"} zcomp = zlib.compressobj(wbits=16 + zlib.MAX_WBITS) data = zcomp.compress(b"mydata") + zcomp.flush() return web.Response(body=data, headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status data = await resp.read() assert b"mydata" == data assert resp.headers.get("Content-Encoding") == "gzip" async def test_response_with_precompressed_body_deflate(aiohttp_client) -> None: async def handler(request): headers = {"Content-Encoding": "deflate"} zcomp = zlib.compressobj(wbits=zlib.MAX_WBITS) data = zcomp.compress(b"mydata") + zcomp.flush() return web.Response(body=data, headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status data = await resp.read() assert b"mydata" == data assert resp.headers.get("Content-Encoding") == "deflate" async def test_response_with_precompressed_body_deflate_no_hdrs(aiohttp_client) -> None: async def handler(request): headers = {"Content-Encoding": "deflate"} # Actually, wrong compression format, but # should be supported for some legacy cases. zcomp = zlib.compressobj(wbits=-zlib.MAX_WBITS) data = zcomp.compress(b"mydata") + zcomp.flush() return web.Response(body=data, headers=headers) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status data = await resp.read() assert b"mydata" == data assert resp.headers.get("Content-Encoding") == "deflate" async def test_bad_request_payload(aiohttp_client) -> None: async def handler(request): assert request.method == "POST" with pytest.raises(aiohttp.web.RequestPayloadError): await request.content.read() return web.Response() app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=b"test", headers={"content-encoding": "gzip"}) assert 200 == resp.status async def test_stream_response_multiple_chunks(aiohttp_client) -> None: async def handler(request): resp = web.StreamResponse() resp.enable_chunked_encoding() await resp.prepare(request) await resp.write(b"x") await resp.write(b"y") await resp.write(b"z") return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status data = await resp.read() assert b"xyz" == data async def test_start_without_routes(aiohttp_client) -> None: app = web.Application() client = await aiohttp_client(app) resp = await client.get("/") assert 404 == resp.status async def test_requests_count(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) assert client.server.handler.requests_count == 0 resp = await client.get("/") assert 200 == resp.status assert client.server.handler.requests_count == 1 resp = await client.get("/") assert 200 == resp.status assert client.server.handler.requests_count == 2 resp = await client.get("/") assert 200 == resp.status assert client.server.handler.requests_count == 3 async def test_redirect_url(aiohttp_client) -> None: async def redirector(request): raise web.HTTPFound(location=URL("/redirected")) async def redirected(request): return web.Response() app = web.Application() app.router.add_get("/redirector", redirector) app.router.add_get("/redirected", redirected) client = await aiohttp_client(app) resp = await client.get("/redirector") assert resp.status == 200 async def test_simple_subapp(aiohttp_client) -> None: async def handler(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.status == 200 txt = await resp.text() assert "OK" == txt async def test_subapp_reverse_url(aiohttp_client) -> None: async def handler(request): raise web.HTTPMovedPermanently(location=subapp.router["name"].url_for()) async def handler2(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) subapp.router.add_get("/final", handler2, name="name") app.add_subapp("/path", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.status == 200 txt = await resp.text() assert "OK" == txt assert resp.url.path == "/path/final" async def test_subapp_reverse_variable_url(aiohttp_client) -> None: async def handler(request): raise web.HTTPMovedPermanently( location=subapp.router["name"].url_for(part="final") ) async def handler2(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) subapp.router.add_get("/{part}", handler2, name="name") app.add_subapp("/path", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.status == 200 txt = await resp.text() assert "OK" == txt assert resp.url.path == "/path/final" async def test_subapp_reverse_static_url(aiohttp_client) -> None: fname = "aiohttp.png" async def handler(request): raise web.HTTPMovedPermanently( location=subapp.router["name"].url_for(filename=fname) ) app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) here = pathlib.Path(__file__).parent subapp.router.add_static("/static", here, name="name") app.add_subapp("/path", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.url.path == "/path/static/" + fname assert resp.status == 200 body = await resp.read() with (here / fname).open("rb") as f: assert body == f.read() async def test_subapp_app(aiohttp_client) -> None: async def handler(request): assert request.app is subapp return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path/", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.status == 200 txt = await resp.text() assert "OK" == txt async def test_subapp_not_found(aiohttp_client) -> None: async def handler(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path/", subapp) client = await aiohttp_client(app) resp = await client.get("/path/other") assert resp.status == 404 async def test_subapp_not_found2(aiohttp_client) -> None: async def handler(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path/", subapp) client = await aiohttp_client(app) resp = await client.get("/invalid/other") assert resp.status == 404 async def test_subapp_not_allowed(aiohttp_client) -> None: async def handler(request): return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path/", subapp) client = await aiohttp_client(app) resp = await client.post("/path/to") assert resp.status == 405 assert resp.headers["Allow"] == "GET,HEAD" async def test_subapp_cannot_add_app_in_handler(aiohttp_client) -> None: async def handler(request): request.match_info.add_app(app) return web.Response(text="OK") app = web.Application() subapp = web.Application() subapp.router.add_get("/to", handler) app.add_subapp("/path/", subapp) client = await aiohttp_client(app) resp = await client.get("/path/to") assert resp.status == 500 async def test_subapp_middlewares(aiohttp_client) -> None: order = [] async def handler(request): return web.Response(text="OK") async def middleware_factory(app, handler: Handler): async def middleware(request): order.append((1, app)) resp = await handler(request) assert 200 == resp.status order.append((2, app)) return resp return middleware app = web.Application(middlewares=[middleware_factory]) subapp1 = web.Application(middlewares=[middleware_factory]) subapp2 = web.Application(middlewares=[middleware_factory]) subapp2.router.add_get("/to", handler) with pytest.warns(DeprecationWarning): subapp1.add_subapp("/b/", subapp2) app.add_subapp("/a/", subapp1) client = await aiohttp_client(app) resp = await client.get("/a/b/to") assert resp.status == 200 assert [ (1, app), (1, subapp1), (1, subapp2), (2, subapp2), (2, subapp1), (2, app), ] == order async def test_subapp_on_response_prepare(aiohttp_client) -> None: order = [] async def handler(request): return web.Response(text="OK") def make_signal(app): async def on_response(request, response): order.append(app) return on_response app = web.Application() app.on_response_prepare.append(make_signal(app)) subapp1 = web.Application() subapp1.on_response_prepare.append(make_signal(subapp1)) subapp2 = web.Application() subapp2.on_response_prepare.append(make_signal(subapp2)) subapp2.router.add_get("/to", handler) subapp1.add_subapp("/b/", subapp2) app.add_subapp("/a/", subapp1) client = await aiohttp_client(app) resp = await client.get("/a/b/to") assert resp.status == 200 assert [app, subapp1, subapp2] == order async def test_subapp_on_startup(aiohttp_server) -> None: order = [] async def on_signal(app): order.append(app) app = web.Application() app.on_startup.append(on_signal) subapp1 = web.Application() subapp1.on_startup.append(on_signal) subapp2 = web.Application() subapp2.on_startup.append(on_signal) subapp1.add_subapp("/b/", subapp2) app.add_subapp("/a/", subapp1) await aiohttp_server(app) assert [app, subapp1, subapp2] == order async def test_subapp_on_shutdown(aiohttp_server) -> None: order = [] async def on_signal(app): order.append(app) app = web.Application() app.on_shutdown.append(on_signal) subapp1 = web.Application() subapp1.on_shutdown.append(on_signal) subapp2 = web.Application() subapp2.on_shutdown.append(on_signal) subapp1.add_subapp("/b/", subapp2) app.add_subapp("/a/", subapp1) server = await aiohttp_server(app) await server.close() assert [app, subapp1, subapp2] == order async def test_subapp_on_cleanup(aiohttp_server) -> None: order = [] async def on_signal(app): order.append(app) app = web.Application() app.on_cleanup.append(on_signal) subapp1 = web.Application() subapp1.on_cleanup.append(on_signal) subapp2 = web.Application() subapp2.on_cleanup.append(on_signal) subapp1.add_subapp("/b/", subapp2) app.add_subapp("/a/", subapp1) server = await aiohttp_server(app) await server.close() assert [app, subapp1, subapp2] == order @pytest.mark.parametrize( "route,expected,middlewares", [ ("/sub/", ["A: root", "C: sub", "D: sub"], "AC"), ("/", ["A: root", "B: root"], "AC"), ("/sub/", ["A: root", "D: sub"], "A"), ("/", ["A: root", "B: root"], "A"), ("/sub/", ["C: sub", "D: sub"], "C"), ("/", ["B: root"], "C"), ("/sub/", ["D: sub"], ""), ("/", ["B: root"], ""), ], ) async def test_subapp_middleware_context(aiohttp_client, route, expected, middlewares): values = [] def show_app_context(appname): @web.middleware async def middleware(request, handler: Handler): values.append("{}: {}".format(appname, request.app["my_value"])) return await handler(request) return middleware def make_handler(appname): async def handler(request): values.append("{}: {}".format(appname, request.app["my_value"])) return web.Response(text="Ok") return handler app = web.Application() app["my_value"] = "root" if "A" in middlewares: app.middlewares.append(show_app_context("A")) app.router.add_get("/", make_handler("B")) subapp = web.Application() subapp["my_value"] = "sub" if "C" in middlewares: subapp.middlewares.append(show_app_context("C")) subapp.router.add_get("/", make_handler("D")) app.add_subapp("/sub/", subapp) client = await aiohttp_client(app) resp = await client.get(route) assert 200 == resp.status assert "Ok" == await resp.text() assert expected == values async def test_custom_date_header(aiohttp_client) -> None: async def handler(request): return web.Response(headers={"Date": "Sun, 30 Oct 2016 03:13:52 GMT"}) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status assert resp.headers["Date"] == "Sun, 30 Oct 2016 03:13:52 GMT" async def test_response_prepared_with_clone(aiohttp_client) -> None: async def handler(request): cloned = request.clone() resp = web.StreamResponse() await resp.prepare(cloned) return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status async def test_app_max_client_size(aiohttp_client) -> None: async def handler(request): await request.post() return web.Response(body=b"ok") max_size = 1024 ** 2 app = web.Application() app.router.add_post("/", handler) client = await aiohttp_client(app) data = {"long_string": max_size * "x" + "xxx"} with pytest.warns(ResourceWarning): resp = await client.post("/", data=data) assert 413 == resp.status resp_text = await resp.text() assert ( "Maximum request body size 1048576 exceeded, " "actual body size" in resp_text ) # Maximum request body size X exceeded, actual body size X body_size = int(resp_text.split()[-1]) assert body_size >= max_size async def test_app_max_client_size_adjusted(aiohttp_client) -> None: async def handler(request): await request.post() return web.Response(body=b"ok") default_max_size = 1024 ** 2 custom_max_size = default_max_size * 2 app = web.Application(client_max_size=custom_max_size) app.router.add_post("/", handler) client = await aiohttp_client(app) data = {"long_string": default_max_size * "x" + "xxx"} with pytest.warns(ResourceWarning): resp = await client.post("/", data=data) assert 200 == resp.status resp_text = await resp.text() assert "ok" == resp_text too_large_data = {"log_string": custom_max_size * "x" + "xxx"} with pytest.warns(ResourceWarning): resp = await client.post("/", data=too_large_data) assert 413 == resp.status resp_text = await resp.text() assert ( "Maximum request body size 2097152 exceeded, " "actual body size" in resp_text ) # Maximum request body size X exceeded, actual body size X body_size = int(resp_text.split()[-1]) assert body_size >= custom_max_size async def test_app_max_client_size_none(aiohttp_client) -> None: async def handler(request): await request.post() return web.Response(body=b"ok") default_max_size = 1024 ** 2 custom_max_size = None app = web.Application(client_max_size=custom_max_size) app.router.add_post("/", handler) client = await aiohttp_client(app) data = {"long_string": default_max_size * "x" + "xxx"} with pytest.warns(ResourceWarning): resp = await client.post("/", data=data) assert 200 == resp.status resp_text = await resp.text() assert "ok" == resp_text too_large_data = {"log_string": default_max_size * 2 * "x"} with pytest.warns(ResourceWarning): resp = await client.post("/", data=too_large_data) assert 200 == resp.status resp_text = await resp.text() assert resp_text == "ok" async def test_post_max_client_size(aiohttp_client) -> None: async def handler(request): await request.post() return web.Response() app = web.Application(client_max_size=10) app.router.add_post("/", handler) client = await aiohttp_client(app) data = {"long_string": 1024 * "x", "file": io.BytesIO(b"test")} resp = await client.post("/", data=data) assert 413 == resp.status resp_text = await resp.text() assert ( "Maximum request body size 10 exceeded, " "actual body size 1024" in resp_text ) data["file"].close() async def test_post_max_client_size_for_file(aiohttp_client) -> None: async def handler(request): await request.post() return web.Response() app = web.Application(client_max_size=2) app.router.add_post("/", handler) client = await aiohttp_client(app) data = {"file": io.BytesIO(b"test")} resp = await client.post("/", data=data) assert 413 == resp.status async def test_response_with_bodypart(aiohttp_client) -> None: async def handler(request): reader = await request.multipart() part = await reader.next() return web.Response(body=part) app = web.Application(client_max_size=2) app.router.add_post("/", handler) client = await aiohttp_client(app) data = {"file": io.BytesIO(b"test")} resp = await client.post("/", data=data) assert 200 == resp.status body = await resp.read() assert body == b"test" disp = multipart.parse_content_disposition(resp.headers["content-disposition"]) assert disp == ("attachment", {"name": "file", "filename": "file"}) async def test_response_with_bodypart_named(aiohttp_client, tmpdir) -> None: async def handler(request): reader = await request.multipart() part = await reader.next() return web.Response(body=part) app = web.Application(client_max_size=2) app.router.add_post("/", handler) client = await aiohttp_client(app) f = tmpdir.join("foobar.txt") f.write_text("test", encoding="utf8") with open(str(f), "rb") as fd: data = {"file": fd} resp = await client.post("/", data=data) assert 200 == resp.status body = await resp.read() assert body == b"test" disp = multipart.parse_content_disposition(resp.headers["content-disposition"]) assert disp == ("attachment", {"name": "file", "filename": "foobar.txt"}) async def test_response_with_bodypart_invalid_name(aiohttp_client) -> None: async def handler(request): reader = await request.multipart() part = await reader.next() return web.Response(body=part) app = web.Application(client_max_size=2) app.router.add_post("/", handler) client = await aiohttp_client(app) with aiohttp.MultipartWriter() as mpwriter: mpwriter.append(b"test") resp = await client.post("/", data=mpwriter) assert 200 == resp.status body = await resp.read() assert body == b"test" assert "content-disposition" not in resp.headers async def test_request_clone(aiohttp_client) -> None: async def handler(request): r2 = request.clone(method="POST") assert r2.method == "POST" assert r2.match_info is request.match_info return web.Response() app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status async def test_await(aiohttp_server) -> None: async def handler(request): resp = web.StreamResponse(headers={"content-length": str(4)}) await resp.prepare(request) with pytest.warns(DeprecationWarning): await resp.drain() await asyncio.sleep(0.01) await resp.write(b"test") await asyncio.sleep(0.01) await resp.write_eof() return resp app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: resp = await session.get(server.make_url("/")) assert resp.status == 200 assert resp.connection is not None await resp.read() await resp.release() assert resp.connection is None async def test_response_context_manager(aiohttp_server) -> None: async def handler(request): return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) session = aiohttp.ClientSession() resp = await session.get(server.make_url("/")) async with resp: assert resp.status == 200 assert resp.connection is None assert resp.connection is None await session.close() async def test_response_context_manager_error(aiohttp_server) -> None: async def handler(request): return web.Response(text="some text") app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) session = aiohttp.ClientSession() cm = session.get(server.make_url("/")) resp = await cm with pytest.raises(RuntimeError): async with resp: assert resp.status == 200 resp.content.set_exception(RuntimeError()) await resp.read() assert resp.closed assert len(session._connector._conns) == 1 await session.close() async def aiohttp_client_api_context_manager(aiohttp_server): async def handler(request): return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: async with session.get(server.make_url("/")) as resp: assert resp.status == 200 assert resp.connection is None assert resp.connection is None async def test_context_manager_close_on_release(aiohttp_server, mocker) -> None: async def handler(request): resp = web.StreamResponse() await resp.prepare(request) with pytest.warns(DeprecationWarning): await resp.drain() await asyncio.sleep(10) return resp app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: resp = await session.get(server.make_url("/")) proto = resp.connection._protocol mocker.spy(proto, "close") async with resp: assert resp.status == 200 assert resp.connection is not None assert resp.connection is None assert proto.close.called async def test_iter_any(aiohttp_server) -> None: data = b"0123456789" * 1024 async def handler(request): buf = [] async for raw in request.content.iter_any(): buf.append(raw) assert b"".join(buf) == data return web.Response() app = web.Application() app.router.add_route("POST", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as session: async with session.post(server.make_url("/"), data=data) as resp: assert resp.status == 200 async def test_request_tracing(aiohttp_server) -> None: on_request_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_request_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_resolvehost_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_dns_resolvehost_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_request_redirect = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_connection_create_start = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) on_connection_create_end = mock.Mock(side_effect=make_mocked_coro(mock.Mock())) async def redirector(request): raise web.HTTPFound(location=URL("/redirected")) async def redirected(request): return web.Response() trace_config = TraceConfig() trace_config.on_request_start.append(on_request_start) trace_config.on_request_end.append(on_request_end) trace_config.on_request_redirect.append(on_request_redirect) trace_config.on_connection_create_start.append(on_connection_create_start) trace_config.on_connection_create_end.append(on_connection_create_end) trace_config.on_dns_resolvehost_start.append(on_dns_resolvehost_start) trace_config.on_dns_resolvehost_end.append(on_dns_resolvehost_end) app = web.Application() app.router.add_get("/redirector", redirector) app.router.add_get("/redirected", redirected) server = await aiohttp_server(app) class FakeResolver: _LOCAL_HOST = {0: "127.0.0.1", socket.AF_INET: "127.0.0.1"} def __init__(self, fakes): # fakes -- dns -> port dict self._fakes = fakes self._resolver = aiohttp.DefaultResolver() async def resolve(self, host, port=0, family=socket.AF_INET): fake_port = self._fakes.get(host) if fake_port is not None: return [ { "hostname": host, "host": self._LOCAL_HOST[family], "port": fake_port, "family": socket.AF_INET, "proto": 0, "flags": socket.AI_NUMERICHOST, } ] else: return await self._resolver.resolve(host, port, family) resolver = FakeResolver({"example.com": server.port}) connector = aiohttp.TCPConnector(resolver=resolver) client = aiohttp.ClientSession(connector=connector, trace_configs=[trace_config]) await client.get("http://example.com/redirector", data="foo") assert on_request_start.called assert on_request_end.called assert on_dns_resolvehost_start.called assert on_dns_resolvehost_end.called assert on_request_redirect.called assert on_connection_create_start.called assert on_connection_create_end.called await client.close() async def test_return_http_exception_deprecated(aiohttp_client) -> None: async def handler(request): return web.HTTPForbidden() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) with pytest.warns(DeprecationWarning): await client.get("/") async def test_request_path(aiohttp_client) -> None: async def handler(request): assert request.path_qs == "/path%20to?a=1" assert request.path == "/path to" assert request.raw_path == "/path%20to?a=1" return web.Response(body=b"OK") app = web.Application() app.router.add_get("/path to", handler) client = await aiohttp_client(app) resp = await client.get("/path to", params={"a": "1"}) assert 200 == resp.status txt = await resp.text() assert "OK" == txt async def test_app_add_routes(aiohttp_client) -> None: async def handler(request): return web.Response() app = web.Application() app.add_routes([web.get("/get", handler)]) client = await aiohttp_client(app) resp = await client.get("/get") assert resp.status == 200 async def test_request_headers_type(aiohttp_client) -> None: async def handler(request): assert isinstance(request.headers, CIMultiDictProxy) return web.Response() app = web.Application() app.add_routes([web.get("/get", handler)]) client = await aiohttp_client(app) resp = await client.get("/get") assert resp.status == 200 async def test_signal_on_error_handler(aiohttp_client) -> None: async def on_prepare(request, response): response.headers["X-Custom"] = "val" app = web.Application() app.on_response_prepare.append(on_prepare) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 404 assert resp.headers["X-Custom"] == "val" @pytest.mark.skipif( "HttpRequestParserC" not in dir(aiohttp.http_parser), reason="C based HTTP parser not available", ) async def test_bad_method_for_c_http_parser_not_hangs(aiohttp_client) -> None: app = web.Application() timeout = aiohttp.ClientTimeout(sock_read=0.2) client = await aiohttp_client(app, timeout=timeout) resp = await client.request("GET1", "/") assert 400 == resp.status async def test_read_bufsize(aiohttp_client) -> None: async def handler(request): ret = request.content.get_read_buffer_limits() data = await request.text() # read posted data return web.Response(text=f"{data} {ret!r}") app = web.Application(handler_args={"read_bufsize": 2}) app.router.add_post("/", handler) client = await aiohttp_client(app) resp = await client.post("/", data=b"data") assert resp.status == 200 assert await resp.text() == "data (2, 4)" @pytest.mark.parametrize( "auto_decompress,len_of", [(True, "uncompressed"), (False, "compressed")] ) async def test_auto_decompress( aiohttp_client, auto_decompress, len_of, ) -> None: async def handler(request): data = await request.read() return web.Response(text=str(len(data))) app = web.Application(handler_args={"auto_decompress": auto_decompress}) app.router.add_post("/", handler) client = await aiohttp_client(app) uncompressed = b"dataaaaaaaaaaaaaaaaaaaaaaaaa" compressor = zlib.compressobj(wbits=16 + zlib.MAX_WBITS) compressed = compressor.compress(uncompressed) + compressor.flush() assert len(compressed) != len(uncompressed) headers = {"content-encoding": "gzip"} resp = await client.post("/", data=compressed, headers=headers) assert resp.status == 200 assert await resp.text() == str(len(locals()[len_of])) @pytest.mark.parametrize( "status", [101, 204], ) async def test_response_101_204_no_content_length_http11( status, aiohttp_client ) -> None: async def handler(_): return web.Response(status=status) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, version="1.1") resp = await client.get("/") assert CONTENT_LENGTH not in resp.headers assert TRANSFER_ENCODING not in resp.headers async def test_stream_response_headers_204(aiohttp_client): async def handler(_): return web.StreamResponse(status=204) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert CONTENT_TYPE not in resp.headers assert TRANSFER_ENCODING not in resp.headers ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_log.py0000644000175100001710000001457200000000000016735 0ustar00runnerdockerimport datetime import platform from unittest import mock import pytest import aiohttp from aiohttp import web from aiohttp.abc import AbstractAccessLogger from aiohttp.helpers import PY_37 from aiohttp.typedefs import Handler from aiohttp.web_log import AccessLogger try: from contextvars import ContextVar except ImportError: ContextVar = None IS_PYPY = platform.python_implementation() == "PyPy" def test_access_logger_format() -> None: log_format = '%T "%{ETag}o" %X {X} %%P' mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, log_format) expected = '%s "%s" %%X {X} %%%s' assert expected == access_logger._log_format @pytest.mark.skipif( IS_PYPY, reason=""" Because of patching :py:class:`datetime.datetime`, under PyPy it fails in :py:func:`isinstance` call in :py:meth:`datetime.datetime.__sub__` (called from :py:meth:`aiohttp.AccessLogger._format_t`): *** TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types (Pdb) from datetime import datetime (Pdb) isinstance(now, datetime) *** TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types (Pdb) datetime.__class__ (Pdb) isinstance(now, datetime.__class__) False Ref: https://bitbucket.org/pypy/pypy/issues/1187/call-to-isinstance-in-__sub__-self-other Ref: https://github.com/celery/celery/issues/811 Ref: https://stackoverflow.com/a/46102240/595220 """, # noqa: E501 ) def test_access_logger_atoms(mocker) -> None: utcnow = datetime.datetime(1843, 1, 1, 0, 30) mock_datetime = mocker.patch("datetime.datetime") mock_getpid = mocker.patch("os.getpid") mock_datetime.utcnow.return_value = utcnow mock_getpid.return_value = 42 log_format = '%a %t %P %r %s %b %T %Tf %D "%{H1}i" "%{H2}i"' mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, log_format) request = mock.Mock( headers={"H1": "a", "H2": "b"}, method="GET", path_qs="/path", version=aiohttp.HttpVersion(1, 1), remote="127.0.0.2", ) response = mock.Mock(headers={}, body_length=42, status=200) access_logger.log(request, response, 3.1415926) assert not mock_logger.exception.called expected = ( "127.0.0.2 [01/Jan/1843:00:29:56 +0000] <42> " 'GET /path HTTP/1.1 200 42 3 3.141593 3141593 "a" "b"' ) extra = { "first_request_line": "GET /path HTTP/1.1", "process_id": "<42>", "remote_address": "127.0.0.2", "request_start_time": "[01/Jan/1843:00:29:56 +0000]", "request_time": "3", "request_time_frac": "3.141593", "request_time_micro": "3141593", "response_size": 42, "response_status": 200, "request_header": {"H1": "a", "H2": "b"}, } mock_logger.info.assert_called_with(expected, extra=extra) def test_access_logger_dicts() -> None: log_format = "%{User-Agent}i %{Content-Length}o %{None}i" mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, log_format) request = mock.Mock( headers={"User-Agent": "Mock/1.0"}, version=(1, 1), remote="127.0.0.2" ) response = mock.Mock(headers={"Content-Length": 123}) access_logger.log(request, response, 0.0) assert not mock_logger.error.called expected = "Mock/1.0 123 -" extra = { "request_header": {"User-Agent": "Mock/1.0", "None": "-"}, "response_header": {"Content-Length": 123}, } mock_logger.info.assert_called_with(expected, extra=extra) def test_access_logger_unix_socket() -> None: log_format = "|%a|" mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, log_format) request = mock.Mock(headers={"User-Agent": "Mock/1.0"}, version=(1, 1), remote="") response = mock.Mock() access_logger.log(request, response, 0.0) assert not mock_logger.error.called expected = "||" mock_logger.info.assert_called_with(expected, extra={"remote_address": ""}) def test_logger_no_message() -> None: mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, "%r %{content-type}i") extra_dict = { "first_request_line": "-", "request_header": {"content-type": "(no headers)"}, } access_logger.log(None, None, 0.0) mock_logger.info.assert_called_with("- (no headers)", extra=extra_dict) def test_logger_internal_error() -> None: mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, "%D") access_logger.log(None, None, "invalid") mock_logger.exception.assert_called_with("Error in logging") def test_logger_no_transport() -> None: mock_logger = mock.Mock() access_logger = AccessLogger(mock_logger, "%a") access_logger.log(None, None, 0) mock_logger.info.assert_called_with("-", extra={"remote_address": "-"}) def test_logger_abc() -> None: class Logger(AbstractAccessLogger): def log(self, request, response, time): 1 / 0 mock_logger = mock.Mock() access_logger = Logger(mock_logger, None) with pytest.raises(ZeroDivisionError): access_logger.log(None, None, None) class Logger(AbstractAccessLogger): def log(self, request, response, time): self.logger.info( self.log_format.format(request=request, response=response, time=time) ) mock_logger = mock.Mock() access_logger = Logger(mock_logger, "{request} {response} {time}") access_logger.log("request", "response", 1) mock_logger.info.assert_called_with("request response 1") @pytest.mark.skipif(not PY_37, reason="contextvars support is required") async def test_contextvars_logger(aiohttp_server, aiohttp_client): VAR = ContextVar("VAR") async def handler(request): return web.Response() @web.middleware async def middleware(request, handler: Handler): VAR.set("uuid") return await handler(request) msg = None class Logger(AbstractAccessLogger): def log(self, request, response, time): nonlocal msg msg = f"contextvars: {VAR.get()}" app = web.Application(middlewares=[middleware]) app.router.add_get("/", handler) server = await aiohttp_server(app, access_log_class=Logger) client = await aiohttp_client(server) resp = await client.get("/") assert 200 == resp.status assert msg == "contextvars: uuid" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_middleware.py0000644000175100001710000004176000000000000020270 0ustar00runnerdockerimport re from typing import Any import pytest from yarl import URL from aiohttp import web from aiohttp.typedefs import Handler async def test_middleware_modifies_response(loop, aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") @web.middleware async def middleware(request, handler: Handler): resp = await handler(request) assert 200 == resp.status resp.set_status(201) resp.text = resp.text + "[MIDDLEWARE]" return resp app = web.Application() app.middlewares.append(middleware) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 201 == resp.status txt = await resp.text() assert "OK[MIDDLEWARE]" == txt async def test_middleware_handles_exception(loop, aiohttp_client) -> None: async def handler(request): raise RuntimeError("Error text") @web.middleware async def middleware(request, handler: Handler): with pytest.raises(RuntimeError) as ctx: await handler(request) return web.Response(status=501, text=str(ctx.value) + "[MIDDLEWARE]") app = web.Application() app.middlewares.append(middleware) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 501 == resp.status txt = await resp.text() assert "Error text[MIDDLEWARE]" == txt async def test_middleware_chain(loop, aiohttp_client) -> None: async def handler(request): return web.Response(text="OK") handler.annotation = "annotation_value" async def handler2(request): return web.Response(text="OK") middleware_annotation_seen_values = [] def make_middleware(num): @web.middleware async def middleware(request, handler: Handler): middleware_annotation_seen_values.append( getattr(handler, "annotation", None) ) resp = await handler(request) resp.text = resp.text + f"[{num}]" return resp return middleware app = web.Application() app.middlewares.append(make_middleware(1)) app.middlewares.append(make_middleware(2)) app.router.add_route("GET", "/", handler) app.router.add_route("GET", "/r2", handler2) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status txt = await resp.text() assert "OK[2][1]" == txt assert middleware_annotation_seen_values == ["annotation_value", "annotation_value"] # check that attributes from handler are not applied to handler2 resp = await client.get("/r2") assert 200 == resp.status assert middleware_annotation_seen_values == [ "annotation_value", "annotation_value", None, None, ] async def test_middleware_subapp(loop, aiohttp_client) -> None: async def sub_handler(request): return web.Response(text="OK") sub_handler.annotation = "annotation_value" async def handler(request): return web.Response(text="OK") middleware_annotation_seen_values = [] def make_middleware(num): @web.middleware async def middleware(request, handler: Handler): annotation = getattr(handler, "annotation", None) if annotation is not None: middleware_annotation_seen_values.append(f"{annotation}/{num}") return await handler(request) return middleware app = web.Application() app.middlewares.append(make_middleware(1)) app.router.add_route("GET", "/r2", handler) subapp = web.Application() subapp.middlewares.append(make_middleware(2)) subapp.router.add_route("GET", "/", sub_handler) app.add_subapp("/sub", subapp) client = await aiohttp_client(app) resp = await client.get("/sub/") assert 200 == resp.status await resp.text() assert middleware_annotation_seen_values == [ "annotation_value/1", "annotation_value/2", ] # check that attributes from sub_handler are not applied to handler del middleware_annotation_seen_values[:] resp = await client.get("/r2") assert 200 == resp.status assert middleware_annotation_seen_values == [] @pytest.fixture def cli(loop, aiohttp_client): async def handler(request): return web.Response(text="OK") def wrapper(extra_middlewares): app = web.Application() app.router.add_route("GET", "/resource1", handler) app.router.add_route("GET", "/resource2/", handler) app.router.add_route("GET", "/resource1/a/b", handler) app.router.add_route("GET", "/resource2/a/b/", handler) app.router.add_route("GET", "/resource2/a/b%2Fc/", handler) app.middlewares.extend(extra_middlewares) return aiohttp_client(app, server_kwargs={"skip_url_asserts": True}) return wrapper class TestNormalizePathMiddleware: @pytest.mark.parametrize( "path, status", [ ("/resource1", 200), ("/resource1/", 404), ("/resource2", 200), ("/resource2/", 200), ("/resource1?p1=1&p2=2", 200), ("/resource1/?p1=1&p2=2", 404), ("/resource2?p1=1&p2=2", 200), ("/resource2/?p1=1&p2=2", 200), ("/resource2/a/b%2Fc", 200), ("/resource2/a/b%2Fc/", 200), ], ) async def test_add_trailing_when_necessary(self, path, status, cli): extra_middlewares = [web.normalize_path_middleware(merge_slashes=False)] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query @pytest.mark.parametrize( "path, status", [ ("/resource1", 200), ("/resource1/", 200), ("/resource2", 404), ("/resource2/", 200), ("/resource1?p1=1&p2=2", 200), ("/resource1/?p1=1&p2=2", 200), ("/resource2?p1=1&p2=2", 404), ("/resource2/?p1=1&p2=2", 200), ("/resource2/a/b%2Fc", 404), ("/resource2/a/b%2Fc/", 200), ], ) async def test_remove_trailing_when_necessary(self, path, status, cli) -> None: extra_middlewares = [ web.normalize_path_middleware( append_slash=False, remove_slash=True, merge_slashes=False ) ] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query @pytest.mark.parametrize( "path, status", [ ("/resource1", 200), ("/resource1/", 404), ("/resource2", 404), ("/resource2/", 200), ("/resource1?p1=1&p2=2", 200), ("/resource1/?p1=1&p2=2", 404), ("/resource2?p1=1&p2=2", 404), ("/resource2/?p1=1&p2=2", 200), ("/resource2/a/b%2Fc", 404), ("/resource2/a/b%2Fc/", 200), ], ) async def test_no_trailing_slash_when_disabled(self, path, status, cli): extra_middlewares = [ web.normalize_path_middleware(append_slash=False, merge_slashes=False) ] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query @pytest.mark.parametrize( "path, status", [ ("/resource1/a/b", 200), ("//resource1//a//b", 200), ("//resource1//a//b/", 404), ("///resource1//a//b", 200), ("/////resource1/a///b", 200), ("/////resource1/a//b/", 404), ("/resource1/a/b?p=1", 200), ("//resource1//a//b?p=1", 200), ("//resource1//a//b/?p=1", 404), ("///resource1//a//b?p=1", 200), ("/////resource1/a///b?p=1", 200), ("/////resource1/a//b/?p=1", 404), ], ) async def test_merge_slash(self, path, status, cli) -> None: extra_middlewares = [web.normalize_path_middleware(append_slash=False)] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query @pytest.mark.parametrize( "path, status", [ ("/resource1/a/b", 200), ("/resource1/a/b/", 404), ("//resource2//a//b", 200), ("//resource2//a//b/", 200), ("///resource1//a//b", 200), ("///resource1//a//b/", 404), ("/////resource1/a///b", 200), ("/////resource1/a///b/", 404), ("/resource2/a/b", 200), ("//resource2//a//b", 200), ("//resource2//a//b/", 200), ("///resource2//a//b", 200), ("///resource2//a//b/", 200), ("/////resource2/a///b", 200), ("/////resource2/a///b/", 200), ("/resource1/a/b?p=1", 200), ("/resource1/a/b/?p=1", 404), ("//resource2//a//b?p=1", 200), ("//resource2//a//b/?p=1", 200), ("///resource1//a//b?p=1", 200), ("///resource1//a//b/?p=1", 404), ("/////resource1/a///b?p=1", 200), ("/////resource1/a///b/?p=1", 404), ("/resource2/a/b?p=1", 200), ("//resource2//a//b?p=1", 200), ("//resource2//a//b/?p=1", 200), ("///resource2//a//b?p=1", 200), ("///resource2//a//b/?p=1", 200), ("/////resource2/a///b?p=1", 200), ("/////resource2/a///b/?p=1", 200), ], ) async def test_append_and_merge_slash(self, path, status, cli) -> None: extra_middlewares = [web.normalize_path_middleware()] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query @pytest.mark.parametrize( "path, status", [ ("/resource1/a/b", 200), ("/resource1/a/b/", 200), ("//resource2//a//b", 404), ("//resource2//a//b/", 200), ("///resource1//a//b", 200), ("///resource1//a//b/", 200), ("/////resource1/a///b", 200), ("/////resource1/a///b/", 200), ("/////resource1/a///b///", 200), ("/resource2/a/b", 404), ("//resource2//a//b", 404), ("//resource2//a//b/", 200), ("///resource2//a//b", 404), ("///resource2//a//b/", 200), ("/////resource2/a///b", 404), ("/////resource2/a///b/", 200), ("/resource1/a/b?p=1", 200), ("/resource1/a/b/?p=1", 200), ("//resource2//a//b?p=1", 404), ("//resource2//a//b/?p=1", 200), ("///resource1//a//b?p=1", 200), ("///resource1//a//b/?p=1", 200), ("/////resource1/a///b?p=1", 200), ("/////resource1/a///b/?p=1", 200), ("/resource2/a/b?p=1", 404), ("//resource2//a//b?p=1", 404), ("//resource2//a//b/?p=1", 200), ("///resource2//a//b?p=1", 404), ("///resource2//a//b/?p=1", 200), ("/////resource2/a///b?p=1", 404), ("/////resource2/a///b/?p=1", 200), ], ) async def test_remove_and_merge_slash(self, path, status, cli) -> None: extra_middlewares = [ web.normalize_path_middleware(append_slash=False, remove_slash=True) ] client = await cli(extra_middlewares) resp = await client.get(path) assert resp.status == status assert resp.url.query == URL(path).query async def test_cannot_remove_and_add_slash(self) -> None: with pytest.raises(AssertionError): web.normalize_path_middleware(append_slash=True, remove_slash=True) @pytest.mark.parametrize( ["append_slash", "remove_slash"], [ (True, False), (False, True), (False, False), ], ) async def test_open_redirects( self, append_slash: bool, remove_slash: bool, aiohttp_client: Any ) -> None: async def handle(request: web.Request) -> web.StreamResponse: pytest.fail( msg="Security advisory 'GHSA-v6wp-4m6f-gcjg' test handler " "matched unexpectedly", pytrace=False, ) app = web.Application( middlewares=[ web.normalize_path_middleware( append_slash=append_slash, remove_slash=remove_slash ) ] ) app.add_routes([web.get("/", handle), web.get("/google.com", handle)]) client = await aiohttp_client(app, server_kwargs={"skip_url_asserts": True}) resp = await client.get("//google.com", allow_redirects=False) assert resp.status == 308 assert resp.headers["Location"] == "/google.com" assert resp.url.query == URL("//google.com").query async def test_old_style_middleware(loop, aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") async def middleware_factory(app, handler: Handler): async def middleware(request): resp = await handler(request) assert 200 == resp.status resp.set_status(201) resp.text = resp.text + "[old style middleware]" return resp return middleware with pytest.warns(DeprecationWarning) as warning_checker: app = web.Application() app.middlewares.append(middleware_factory) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 201 == resp.status txt = await resp.text() assert "OK[old style middleware]" == txt found = False for obj in warning_checker.list: msg = str(obj.message) if "old-style" not in msg: continue assert re.match( "^old-style middleware " '".' 'middleware_factory at 0x[0-9a-fA-F]+>" ' "deprecated, see #2252$", msg, ) found = True assert found async def test_old_style_middleware_class(loop, aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") class Middleware: async def __call__(self, app, handler: Handler): async def middleware(request): resp = await handler(request) assert 200 == resp.status resp.set_status(201) resp.text = resp.text + "[old style middleware]" return resp return middleware with pytest.warns(DeprecationWarning) as warning_checker: app = web.Application() app.middlewares.append(Middleware()) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 201 == resp.status txt = await resp.text() assert "OK[old style middleware]" == txt found = False for obj in warning_checker.list: msg = str(obj.message) if "old-style" not in msg: continue assert re.match( "^old-style middleware " '".Middleware object " 'at 0x[0-9a-fA-F]+>" deprecated, see #2252$', msg, ) found = True assert found async def test_new_style_middleware_class(loop, aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") @web.middleware class Middleware: async def __call__(self, request, handler: Handler): resp = await handler(request) assert 200 == resp.status resp.set_status(201) resp.text = resp.text + "[new style middleware]" return resp app = web.Application() app.middlewares.append(Middleware()) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 201 == resp.status txt = await resp.text() assert "OK[new style middleware]" == txt async def test_new_style_middleware_method(loop, aiohttp_client) -> None: async def handler(request): return web.Response(body=b"OK") class Middleware: @web.middleware async def call(self, request, handler: Handler): resp = await handler(request) assert 200 == resp.status resp.set_status(201) resp.text = resp.text + "[new style middleware]" return resp app = web.Application() app.middlewares.append(Middleware().call) app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 201 == resp.status txt = await resp.text() assert "OK[new style middleware]" == txt ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_request.py0000644000175100001710000006316100000000000017642 0ustar00runnerdockerimport asyncio import datetime import socket from collections.abc import MutableMapping from typing import Any from unittest import mock import pytest from multidict import CIMultiDict, CIMultiDictProxy, MultiDict from yarl import URL from aiohttp import HttpVersion from aiohttp.helpers import DEBUG from aiohttp.http_parser import RawRequestMessage from aiohttp.streams import StreamReader from aiohttp.test_utils import make_mocked_request from aiohttp.web import BaseRequest, HTTPRequestEntityTooLarge from aiohttp.web_request import ETag @pytest.fixture def protocol(): return mock.Mock(_reading_paused=False) def test_base_ctor() -> None: message = RawRequestMessage( "GET", "/path/to?a=1&b=2", HttpVersion(1, 1), CIMultiDictProxy(CIMultiDict()), (), False, False, False, False, URL("/path/to?a=1&b=2"), ) req = BaseRequest( message, mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock() ) assert "GET" == req.method assert HttpVersion(1, 1) == req.version assert req.host == socket.getfqdn() assert "/path/to?a=1&b=2" == req.path_qs assert "/path/to" == req.path assert "a=1&b=2" == req.query_string assert CIMultiDict() == req.headers assert () == req.raw_headers get = req.query assert MultiDict([("a", "1"), ("b", "2")]) == get # second call should return the same object assert get is req.query assert req.keep_alive assert req def test_ctor() -> None: req = make_mocked_request("GET", "/path/to?a=1&b=2") assert "GET" == req.method assert HttpVersion(1, 1) == req.version # MacOS may return CamelCased host name, need .lower() assert req.host.lower() == socket.getfqdn().lower() assert "/path/to?a=1&b=2" == req.path_qs assert "/path/to" == req.path assert "a=1&b=2" == req.query_string assert CIMultiDict() == req.headers assert () == req.raw_headers get = req.query assert MultiDict([("a", "1"), ("b", "2")]) == get # second call should return the same object assert get is req.query assert req.keep_alive # just make sure that all lines of make_mocked_request covered headers = CIMultiDict(FOO="bar") payload = mock.Mock() protocol = mock.Mock() app = mock.Mock() req = make_mocked_request( "GET", "/path/to?a=1&b=2", headers=headers, protocol=protocol, payload=payload, app=app, ) assert req.app is app assert req.content is payload assert req.protocol is protocol assert req.transport is protocol.transport assert req.headers == headers assert req.raw_headers == ((b"FOO", b"bar"),) assert req.task is req._task def test_deprecated_message() -> None: req = make_mocked_request("GET", "/path/to?a=1&b=2") with pytest.warns(DeprecationWarning): assert req.message == req._message def test_doubleslashes() -> None: # NB: //foo/bar is an absolute URL with foo netloc and /bar path req = make_mocked_request("GET", "/bar//foo/") assert "/bar//foo/" == req.path def test_content_type_not_specified() -> None: req = make_mocked_request("Get", "/") assert "application/octet-stream" == req.content_type def test_content_type_from_spec() -> None: req = make_mocked_request( "Get", "/", CIMultiDict([("CONTENT-TYPE", "application/json")]) ) assert "application/json" == req.content_type def test_content_type_from_spec_with_charset() -> None: req = make_mocked_request( "Get", "/", CIMultiDict([("CONTENT-TYPE", "text/html; charset=UTF-8")]) ) assert "text/html" == req.content_type assert "UTF-8" == req.charset def test_calc_content_type_on_getting_charset() -> None: req = make_mocked_request( "Get", "/", CIMultiDict([("CONTENT-TYPE", "text/html; charset=UTF-8")]) ) assert "UTF-8" == req.charset assert "text/html" == req.content_type def test_urlencoded_querystring() -> None: req = make_mocked_request("GET", "/yandsearch?text=%D1%82%D0%B5%D0%BA%D1%81%D1%82") assert {"text": "текст"} == req.query def test_non_ascii_path() -> None: req = make_mocked_request("GET", "/путь") assert "/путь" == req.path def test_non_ascii_raw_path() -> None: req = make_mocked_request("GET", "/путь") assert "/путь" == req.raw_path def test_content_length() -> None: req = make_mocked_request("Get", "/", CIMultiDict([("CONTENT-LENGTH", "123")])) assert 123 == req.content_length def test_range_to_slice_head() -> None: def bytes_gen(size): for i in range(size): yield i % 256 payload = bytearray(bytes_gen(10000)) req = make_mocked_request( "GET", "/", headers=CIMultiDict([("RANGE", "bytes=0-499")]), payload=payload ) assert isinstance(req.http_range, slice) assert req.content[req.http_range] == payload[:500] def test_range_to_slice_mid() -> None: def bytes_gen(size): for i in range(size): yield i % 256 payload = bytearray(bytes_gen(10000)) req = make_mocked_request( "GET", "/", headers=CIMultiDict([("RANGE", "bytes=500-999")]), payload=payload ) assert isinstance(req.http_range, slice) assert req.content[req.http_range] == payload[500:1000] def test_range_to_slice_tail_start() -> None: def bytes_gen(size): for i in range(size): yield i % 256 payload = bytearray(bytes_gen(10000)) req = make_mocked_request( "GET", "/", headers=CIMultiDict([("RANGE", "bytes=9500-")]), payload=payload ) assert isinstance(req.http_range, slice) assert req.content[req.http_range] == payload[-500:] def test_range_to_slice_tail_stop() -> None: def bytes_gen(size): for i in range(size): yield i % 256 payload = bytearray(bytes_gen(10000)) req = make_mocked_request( "GET", "/", headers=CIMultiDict([("RANGE", "bytes=-500")]), payload=payload ) assert isinstance(req.http_range, slice) assert req.content[req.http_range] == payload[-500:] def test_non_keepalive_on_http10() -> None: req = make_mocked_request("GET", "/", version=HttpVersion(1, 0)) assert not req.keep_alive def test_non_keepalive_on_closing() -> None: req = make_mocked_request("GET", "/", closing=True) assert not req.keep_alive async def test_call_POST_on_GET_request() -> None: req = make_mocked_request("GET", "/") ret = await req.post() assert CIMultiDict() == ret async def test_call_POST_on_weird_content_type() -> None: req = make_mocked_request( "POST", "/", headers=CIMultiDict({"CONTENT-TYPE": "something/weird"}) ) ret = await req.post() assert CIMultiDict() == ret async def test_call_POST_twice() -> None: req = make_mocked_request("GET", "/") ret1 = await req.post() ret2 = await req.post() assert ret1 is ret2 def test_no_request_cookies() -> None: req = make_mocked_request("GET", "/") assert req.cookies == {} cookies = req.cookies assert cookies is req.cookies def test_request_cookie() -> None: headers = CIMultiDict(COOKIE="cookie1=value1; cookie2=value2") req = make_mocked_request("GET", "/", headers=headers) assert req.cookies == {"cookie1": "value1", "cookie2": "value2"} def test_request_cookie__set_item() -> None: headers = CIMultiDict(COOKIE="name=value") req = make_mocked_request("GET", "/", headers=headers) assert req.cookies == {"name": "value"} with pytest.raises(TypeError): req.cookies["my"] = "value" def test_match_info() -> None: req = make_mocked_request("GET", "/") assert req._match_info is req.match_info def test_request_is_mutable_mapping() -> None: req = make_mocked_request("GET", "/") assert isinstance(req, MutableMapping) req["key"] = "value" assert "value" == req["key"] def test_request_delitem() -> None: req = make_mocked_request("GET", "/") req["key"] = "value" assert "value" == req["key"] del req["key"] assert "key" not in req def test_request_len() -> None: req = make_mocked_request("GET", "/") assert len(req) == 0 req["key"] = "value" assert len(req) == 1 def test_request_iter() -> None: req = make_mocked_request("GET", "/") req["key"] = "value" req["key2"] = "value2" assert set(req) == {"key", "key2"} def test___repr__() -> None: req = make_mocked_request("GET", "/path/to") assert "" == repr(req) def test___repr___non_ascii_path() -> None: req = make_mocked_request("GET", "/path/\U0001f415\U0001f308") assert "" == repr(req) def test_http_scheme() -> None: req = make_mocked_request("GET", "/", headers={"Host": "example.com"}) assert "http" == req.scheme assert req.secure is False def test_https_scheme_by_ssl_transport() -> None: req = make_mocked_request( "GET", "/", headers={"Host": "example.com"}, sslcontext=True ) assert "https" == req.scheme assert req.secure is True def test_single_forwarded_header() -> None: header = "by=identifier;for=identifier;host=identifier;proto=identifier" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["by"] == "identifier" assert req.forwarded[0]["for"] == "identifier" assert req.forwarded[0]["host"] == "identifier" assert req.forwarded[0]["proto"] == "identifier" @pytest.mark.parametrize( "forward_for_in, forward_for_out", [ ("1.2.3.4:1234", "1.2.3.4:1234"), ("1.2.3.4", "1.2.3.4"), ('"[2001:db8:cafe::17]:1234"', "[2001:db8:cafe::17]:1234"), ('"[2001:db8:cafe::17]"', "[2001:db8:cafe::17]"), ], ) def test_forwarded_node_identifier(forward_for_in, forward_for_out) -> None: header = f"for={forward_for_in}" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded == ({"for": forward_for_out},) def test_single_forwarded_header_camelcase() -> None: header = "bY=identifier;fOr=identifier;HOst=identifier;pRoTO=identifier" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["by"] == "identifier" assert req.forwarded[0]["for"] == "identifier" assert req.forwarded[0]["host"] == "identifier" assert req.forwarded[0]["proto"] == "identifier" def test_single_forwarded_header_single_param() -> None: header = "BY=identifier" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["by"] == "identifier" def test_single_forwarded_header_multiple_param() -> None: header = "By=identifier1,BY=identifier2, By=identifier3 , BY=identifier4" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert len(req.forwarded) == 4 assert req.forwarded[0]["by"] == "identifier1" assert req.forwarded[1]["by"] == "identifier2" assert req.forwarded[2]["by"] == "identifier3" assert req.forwarded[3]["by"] == "identifier4" def test_single_forwarded_header_quoted_escaped() -> None: header = r'BY=identifier;pROTO="\lala lan\d\~ 123\!&"' req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["by"] == "identifier" assert req.forwarded[0]["proto"] == "lala land~ 123!&" def test_single_forwarded_header_custom_param() -> None: header = r'BY=identifier;PROTO=https;SOME="other, \"value\""' req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert len(req.forwarded) == 1 assert req.forwarded[0]["by"] == "identifier" assert req.forwarded[0]["proto"] == "https" assert req.forwarded[0]["some"] == 'other, "value"' def test_single_forwarded_header_empty_params() -> None: # This is allowed by the grammar given in RFC 7239 header = ";For=identifier;;PROTO=https;;;" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["for"] == "identifier" assert req.forwarded[0]["proto"] == "https" def test_single_forwarded_header_bad_separator() -> None: header = "BY=identifier PROTO=https" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert "proto" not in req.forwarded[0] def test_single_forwarded_header_injection1() -> None: # We might receive a header like this if we're sitting behind a reverse # proxy that blindly appends a forwarded-element without checking # the syntax of existing field-values. We should be able to recover # the appended element anyway. header = 'for=_injected;by=", for=_real' req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert len(req.forwarded) == 2 assert "by" not in req.forwarded[0] assert req.forwarded[1]["for"] == "_real" def test_single_forwarded_header_injection2() -> None: header = "very bad syntax, for=_real" req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert len(req.forwarded) == 2 assert "for" not in req.forwarded[0] assert req.forwarded[1]["for"] == "_real" def test_single_forwarded_header_long_quoted_string() -> None: header = 'for="' + "\\\\" * 5000 + '"' req = make_mocked_request("GET", "/", headers=CIMultiDict({"Forwarded": header})) assert req.forwarded[0]["for"] == "\\" * 5000 def test_multiple_forwarded_headers() -> None: headers = CIMultiDict() headers.add("Forwarded", "By=identifier1;for=identifier2, BY=identifier3") headers.add("Forwarded", "By=identifier4;fOr=identifier5") req = make_mocked_request("GET", "/", headers=headers) assert len(req.forwarded) == 3 assert req.forwarded[0]["by"] == "identifier1" assert req.forwarded[0]["for"] == "identifier2" assert req.forwarded[1]["by"] == "identifier3" assert req.forwarded[2]["by"] == "identifier4" assert req.forwarded[2]["for"] == "identifier5" def test_multiple_forwarded_headers_bad_syntax() -> None: headers = CIMultiDict() headers.add("Forwarded", "for=_1;by=_2") headers.add("Forwarded", "invalid value") headers.add("Forwarded", "") headers.add("Forwarded", "for=_3;by=_4") req = make_mocked_request("GET", "/", headers=headers) assert len(req.forwarded) == 4 assert req.forwarded[0]["for"] == "_1" assert "for" not in req.forwarded[1] assert "for" not in req.forwarded[2] assert req.forwarded[3]["by"] == "_4" def test_multiple_forwarded_headers_injection() -> None: headers = CIMultiDict() # This could be sent by an attacker, hoping to "shadow" the second header. headers.add("Forwarded", 'for=_injected;by="') # This is added by our trusted reverse proxy. headers.add("Forwarded", "for=_real;by=_actual_proxy") req = make_mocked_request("GET", "/", headers=headers) assert len(req.forwarded) == 2 assert "by" not in req.forwarded[0] assert req.forwarded[1]["for"] == "_real" assert req.forwarded[1]["by"] == "_actual_proxy" def test_host_by_host_header() -> None: req = make_mocked_request("GET", "/", headers=CIMultiDict({"Host": "example.com"})) assert req.host == "example.com" def test_raw_headers() -> None: req = make_mocked_request("GET", "/", headers=CIMultiDict({"X-HEADER": "aaa"})) assert req.raw_headers == ((b"X-HEADER", b"aaa"),) def test_rel_url() -> None: req = make_mocked_request("GET", "/path") assert URL("/path") == req.rel_url def test_url_url() -> None: req = make_mocked_request("GET", "/path", headers={"HOST": "example.com"}) assert URL("http://example.com/path") == req.url def test_clone() -> None: req = make_mocked_request("GET", "/path") req2 = req.clone() assert req2.method == "GET" assert req2.rel_url == URL("/path") def test_clone_client_max_size() -> None: req = make_mocked_request("GET", "/path", client_max_size=1024) req2 = req.clone() assert req._client_max_size == req2._client_max_size assert req2._client_max_size == 1024 def test_clone_method() -> None: req = make_mocked_request("GET", "/path") req2 = req.clone(method="POST") assert req2.method == "POST" assert req2.rel_url == URL("/path") def test_clone_rel_url() -> None: req = make_mocked_request("GET", "/path") req2 = req.clone(rel_url=URL("/path2")) assert req2.rel_url == URL("/path2") def test_clone_rel_url_str() -> None: req = make_mocked_request("GET", "/path") req2 = req.clone(rel_url="/path2") assert req2.rel_url == URL("/path2") def test_clone_headers() -> None: req = make_mocked_request("GET", "/path", headers={"A": "B"}) req2 = req.clone(headers=CIMultiDict({"B": "C"})) assert req2.headers == CIMultiDict({"B": "C"}) assert req2.raw_headers == ((b"B", b"C"),) def test_clone_headers_dict() -> None: req = make_mocked_request("GET", "/path", headers={"A": "B"}) req2 = req.clone(headers={"B": "C"}) assert req2.headers == CIMultiDict({"B": "C"}) assert req2.raw_headers == ((b"B", b"C"),) async def test_cannot_clone_after_read(protocol) -> None: payload = StreamReader(protocol, 2 ** 16, loop=asyncio.get_event_loop()) payload.feed_data(b"data") payload.feed_eof() req = make_mocked_request("GET", "/path", payload=payload) await req.read() with pytest.raises(RuntimeError): req.clone() async def test_make_too_big_request(protocol) -> None: payload = StreamReader(protocol, 2 ** 16, loop=asyncio.get_event_loop()) large_file = 1024 ** 2 * b"x" too_large_file = large_file + b"x" payload.feed_data(too_large_file) payload.feed_eof() req = make_mocked_request("POST", "/", payload=payload) with pytest.raises(HTTPRequestEntityTooLarge) as err: await req.read() assert err.value.status_code == 413 async def test_make_too_big_request_adjust_limit(protocol) -> None: payload = StreamReader(protocol, 2 ** 16, loop=asyncio.get_event_loop()) large_file = 1024 ** 2 * b"x" too_large_file = large_file + b"x" payload.feed_data(too_large_file) payload.feed_eof() max_size = 1024 ** 2 + 2 req = make_mocked_request("POST", "/", payload=payload, client_max_size=max_size) txt = await req.read() assert len(txt) == 1024 ** 2 + 1 async def test_multipart_formdata(protocol) -> None: payload = StreamReader(protocol, 2 ** 16, loop=asyncio.get_event_loop()) payload.feed_data( b"-----------------------------326931944431359\r\n" b'Content-Disposition: form-data; name="a"\r\n' b"\r\n" b"b\r\n" b"-----------------------------326931944431359\r\n" b'Content-Disposition: form-data; name="c"\r\n' b"\r\n" b"d\r\n" b"-----------------------------326931944431359--\r\n" ) content_type = ( "multipart/form-data; boundary=" "---------------------------326931944431359" ) payload.feed_eof() req = make_mocked_request( "POST", "/", headers={"CONTENT-TYPE": content_type}, payload=payload ) result = await req.post() assert dict(result) == {"a": "b", "c": "d"} async def test_multipart_formdata_file(protocol) -> None: # Make sure file uploads work, even without a content type payload = StreamReader(protocol, 2 ** 16, loop=asyncio.get_event_loop()) payload.feed_data( b"-----------------------------326931944431359\r\n" b'Content-Disposition: form-data; name="a_file"; filename="binary"\r\n' b"\r\n" b"\ff\r\n" b"-----------------------------326931944431359--\r\n" ) content_type = ( "multipart/form-data; boundary=" "---------------------------326931944431359" ) payload.feed_eof() req = make_mocked_request( "POST", "/", headers={"CONTENT-TYPE": content_type}, payload=payload ) result = await req.post() assert hasattr(result["a_file"], "file") content = result["a_file"].file.read() assert content == b"\ff" async def test_make_too_big_request_limit_None(protocol) -> None: payload = StreamReader(protocol, 2 ** 16, loop=asyncio.get_event_loop()) large_file = 1024 ** 2 * b"x" too_large_file = large_file + b"x" payload.feed_data(too_large_file) payload.feed_eof() max_size = None req = make_mocked_request("POST", "/", payload=payload, client_max_size=max_size) txt = await req.read() assert len(txt) == 1024 ** 2 + 1 def test_remote_peername_tcp() -> None: transp = mock.Mock() transp.get_extra_info.return_value = ("10.10.10.10", 1234) req = make_mocked_request("GET", "/", transport=transp) assert req.remote == "10.10.10.10" def test_remote_peername_unix() -> None: transp = mock.Mock() transp.get_extra_info.return_value = "/path/to/sock" req = make_mocked_request("GET", "/", transport=transp) assert req.remote == "/path/to/sock" def test_save_state_on_clone() -> None: req = make_mocked_request("GET", "/") req["key"] = "val" req2 = req.clone() req2["key"] = "val2" assert req["key"] == "val" assert req2["key"] == "val2" def test_clone_scheme() -> None: req = make_mocked_request("GET", "/") req2 = req.clone(scheme="https") assert req2.scheme == "https" def test_clone_host() -> None: req = make_mocked_request("GET", "/") req2 = req.clone(host="example.com") assert req2.host == "example.com" def test_clone_remote() -> None: req = make_mocked_request("GET", "/") req2 = req.clone(remote="11.11.11.11") assert req2.remote == "11.11.11.11" @pytest.mark.skipif(not DEBUG, reason="The check is applied in DEBUG mode only") def test_request_custom_attr() -> None: req = make_mocked_request("GET", "/") with pytest.warns(DeprecationWarning): req.custom = None def test_remote_with_closed_transport() -> None: transp = mock.Mock() transp.get_extra_info.return_value = ("10.10.10.10", 1234) req = make_mocked_request("GET", "/", transport=transp) req._protocol = None assert req.remote == "10.10.10.10" def test_url_http_with_closed_transport() -> None: req = make_mocked_request("GET", "/") req._protocol = None assert str(req.url).startswith("http://") def test_url_https_with_closed_transport() -> None: req = make_mocked_request("GET", "/", sslcontext=True) req._protocol = None assert str(req.url).startswith("https://") async def test_get_extra_info() -> None: valid_key = "test" valid_value = "existent" default_value = "default" def get_extra_info(name: str, default: Any = None): return {valid_key: valid_value}.get(name, default) transp = mock.Mock() transp.get_extra_info.side_effect = get_extra_info req = make_mocked_request("GET", "/", transport=transp) req_extra_info = req.get_extra_info(valid_key, default_value) transp_extra_info = req._protocol.transport.get_extra_info(valid_key, default_value) assert req_extra_info == transp_extra_info req._protocol.transport = None extra_info = req.get_extra_info(valid_key, default_value) assert extra_info == default_value req._protocol = None extra_info = req.get_extra_info(valid_key, default_value) assert extra_info == default_value def test_eq() -> None: req1 = make_mocked_request("GET", "/path/to?a=1&b=2") req2 = make_mocked_request("GET", "/path/to?a=1&b=2") assert req1 != req2 assert req1 == req1 async def test_loop_prop() -> None: loop = asyncio.get_event_loop() req = make_mocked_request("GET", "/path", loop=loop) with pytest.warns(DeprecationWarning): assert req.loop is loop @pytest.mark.parametrize( ["header", "header_attr"], [ pytest.param("If-Match", "if_match"), pytest.param("If-None-Match", "if_none_match"), ], ) @pytest.mark.parametrize( ["header_val", "expected"], [ pytest.param( '"67ab43", W/"54ed21", "7892,dd"', ( ETag(is_weak=False, value="67ab43"), ETag(is_weak=True, value="54ed21"), ETag(is_weak=False, value="7892,dd"), ), ), pytest.param( '"bfc1ef-5b2c2730249c88ca92d82d"', (ETag(is_weak=False, value="bfc1ef-5b2c2730249c88ca92d82d"),), ), pytest.param( '"valid-tag", "also-valid-tag",somegarbage"last-tag"', ( ETag(is_weak=False, value="valid-tag"), ETag(is_weak=False, value="also-valid-tag"), ), ), pytest.param( '"ascii", "это точно не ascii", "ascii again"', (ETag(is_weak=False, value="ascii"),), ), pytest.param( "*", (ETag(is_weak=False, value="*"),), ), ], ) def test_etag_headers(header, header_attr, header_val, expected) -> None: req = make_mocked_request("GET", "/", headers={header: header_val}) assert getattr(req, header_attr) == expected @pytest.mark.parametrize( ["header", "header_attr"], [ pytest.param("If-Modified-Since", "if_modified_since"), pytest.param("If-Unmodified-Since", "if_unmodified_since"), pytest.param("If-Range", "if_range"), ], ) @pytest.mark.parametrize( ["header_val", "expected"], [ pytest.param("xxyyzz", None), pytest.param("Tue, 08 Oct 4446413 00:56:40 GMT", None), pytest.param("Tue, 08 Oct 2000 00:56:80 GMT", None), pytest.param( "Tue, 08 Oct 2000 00:56:40 GMT", datetime.datetime(2000, 10, 8, 0, 56, 40, tzinfo=datetime.timezone.utc), ), ], ) def test_datetime_headers(header, header_attr, header_val, expected) -> None: req = make_mocked_request("GET", "/", headers={header: header_val}) assert getattr(req, header_attr) == expected ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_request_handler.py0000644000175100001710000000275600000000000021342 0ustar00runnerdockerfrom unittest import mock from aiohttp import web from aiohttp.test_utils import make_mocked_coro async def serve(request): return web.Response() async def test_repr() -> None: manager = web.Server(serve) handler = manager() assert "" == repr(handler) handler.transport = object() assert "" == repr(handler) async def test_connections() -> None: manager = web.Server(serve) assert manager.connections == [] handler = object() transport = object() manager.connection_made(handler, transport) assert manager.connections == [handler] manager.connection_lost(handler, None) assert manager.connections == [] async def test_shutdown_no_timeout() -> None: manager = web.Server(serve) handler = mock.Mock() handler.shutdown = make_mocked_coro(mock.Mock()) transport = mock.Mock() manager.connection_made(handler, transport) await manager.shutdown() manager.connection_lost(handler, None) assert manager.connections == [] handler.shutdown.assert_called_with(None) async def test_shutdown_timeout() -> None: manager = web.Server(serve) handler = mock.Mock() handler.shutdown = make_mocked_coro(mock.Mock()) transport = mock.Mock() manager.connection_made(handler, transport) await manager.shutdown(timeout=0.1) manager.connection_lost(handler, None) assert manager.connections == [] handler.shutdown.assert_called_with(0.1) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_response.py0000644000175100001710000010716300000000000020011 0ustar00runnerdockerimport collections.abc import datetime import gzip import json from concurrent.futures import ThreadPoolExecutor from unittest import mock import aiosignal import pytest from multidict import CIMultiDict, CIMultiDictProxy from re_assert import Matches from aiohttp import HttpVersion, HttpVersion10, HttpVersion11, hdrs from aiohttp.helpers import ETag from aiohttp.http_writer import _serialize_headers from aiohttp.payload import BytesPayload from aiohttp.test_utils import make_mocked_coro, make_mocked_request from aiohttp.web import ContentCoding, Response, StreamResponse, json_response def make_request( method, path, headers=CIMultiDict(), version=HttpVersion11, on_response_prepare=None, **kwargs, ): app = kwargs.pop("app", None) or mock.Mock() app._debug = False if on_response_prepare is None: on_response_prepare = aiosignal.Signal(app) app.on_response_prepare = on_response_prepare app.on_response_prepare.freeze() protocol = kwargs.pop("protocol", None) or mock.Mock() return make_mocked_request( method, path, headers, version=version, protocol=protocol, app=app, **kwargs ) @pytest.fixture def buf(): return bytearray() @pytest.fixture def writer(buf): writer = mock.Mock() def acquire(cb): cb(writer.transport) def buffer_data(chunk): buf.extend(chunk) def write(chunk): buf.extend(chunk) async def write_headers(status_line, headers): headers = _serialize_headers(status_line, headers) buf.extend(headers) async def write_eof(chunk=b""): buf.extend(chunk) writer.acquire.side_effect = acquire writer.transport.write.side_effect = write writer.write.side_effect = write writer.write_eof.side_effect = write_eof writer.write_headers.side_effect = write_headers writer.buffer_data.side_effect = buffer_data writer.drain.return_value = () return writer def test_stream_response_ctor() -> None: resp = StreamResponse() assert 200 == resp.status assert resp.keep_alive is None assert resp.task is None req = mock.Mock() resp._req = req assert resp.task is req.task def test_stream_response_hashable() -> None: # should not raise exception hash(StreamResponse()) def test_stream_response_eq() -> None: resp1 = StreamResponse() resp2 = StreamResponse() assert resp1 == resp1 assert not resp1 == resp2 def test_stream_response_is_mutable_mapping() -> None: resp = StreamResponse() assert isinstance(resp, collections.abc.MutableMapping) resp["key"] = "value" assert "value" == resp["key"] def test_stream_response_delitem() -> None: resp = StreamResponse() resp["key"] = "value" del resp["key"] assert "key" not in resp def test_stream_response_len() -> None: resp = StreamResponse() assert len(resp) == 0 resp["key"] = "value" assert len(resp) == 1 def test_request_iter() -> None: resp = StreamResponse() resp["key"] = "value" resp["key2"] = "value2" assert set(resp) == {"key", "key2"} def test_content_length() -> None: resp = StreamResponse() assert resp.content_length is None def test_content_length_setter() -> None: resp = StreamResponse() resp.content_length = 234 assert 234 == resp.content_length def test_content_length_setter_with_enable_chunked_encoding() -> None: resp = StreamResponse() resp.enable_chunked_encoding() with pytest.raises(RuntimeError): resp.content_length = 234 def test_drop_content_length_header_on_setting_len_to_None() -> None: resp = StreamResponse() resp.content_length = 1 assert "1" == resp.headers["Content-Length"] resp.content_length = None assert "Content-Length" not in resp.headers def test_set_content_length_to_None_on_non_set() -> None: resp = StreamResponse() resp.content_length = None assert "Content-Length" not in resp.headers resp.content_length = None assert "Content-Length" not in resp.headers def test_setting_content_type() -> None: resp = StreamResponse() resp.content_type = "text/html" assert "text/html" == resp.headers["content-type"] def test_setting_charset() -> None: resp = StreamResponse() resp.content_type = "text/html" resp.charset = "koi8-r" assert "text/html; charset=koi8-r" == resp.headers["content-type"] def test_default_charset() -> None: resp = StreamResponse() assert resp.charset is None def test_reset_charset() -> None: resp = StreamResponse() resp.content_type = "text/html" resp.charset = None assert resp.charset is None def test_reset_charset_after_setting() -> None: resp = StreamResponse() resp.content_type = "text/html" resp.charset = "koi8-r" resp.charset = None assert resp.charset is None def test_charset_without_content_type() -> None: resp = StreamResponse() with pytest.raises(RuntimeError): resp.charset = "koi8-r" def test_last_modified_initial() -> None: resp = StreamResponse() assert resp.last_modified is None def test_last_modified_string() -> None: resp = StreamResponse() dt = datetime.datetime(1990, 1, 2, 3, 4, 5, 0, datetime.timezone.utc) resp.last_modified = "Mon, 2 Jan 1990 03:04:05 GMT" assert resp.last_modified == dt def test_last_modified_timestamp() -> None: resp = StreamResponse() dt = datetime.datetime(1970, 1, 1, 0, 0, 0, 0, datetime.timezone.utc) resp.last_modified = 0 assert resp.last_modified == dt resp.last_modified = 0.0 assert resp.last_modified == dt def test_last_modified_datetime() -> None: resp = StreamResponse() dt = datetime.datetime(2001, 2, 3, 4, 5, 6, 0, datetime.timezone.utc) resp.last_modified = dt assert resp.last_modified == dt def test_last_modified_reset() -> None: resp = StreamResponse() resp.last_modified = 0 resp.last_modified = None assert resp.last_modified is None @pytest.mark.parametrize( ["header_val", "expected"], [ pytest.param("xxyyzz", None), pytest.param("Tue, 08 Oct 4446413 00:56:40 GMT", None), pytest.param("Tue, 08 Oct 2000 00:56:80 GMT", None), ], ) def test_last_modified_string_invalid(header_val, expected) -> None: resp = StreamResponse(headers={"Last-Modified": header_val}) assert resp.last_modified == expected def test_etag_initial() -> None: resp = StreamResponse() assert resp.etag is None def test_etag_string() -> None: resp = StreamResponse() value = "0123-kotik" resp.etag = value assert resp.etag == ETag(value=value) assert resp.headers[hdrs.ETAG] == f'"{value}"' @pytest.mark.parametrize( ["etag", "expected_header"], ( (ETag(value="0123-weak-kotik", is_weak=True), 'W/"0123-weak-kotik"'), (ETag(value="0123-strong-kotik", is_weak=False), '"0123-strong-kotik"'), ), ) def test_etag_class(etag, expected_header) -> None: resp = StreamResponse() resp.etag = etag assert resp.etag == etag assert resp.headers[hdrs.ETAG] == expected_header def test_etag_any() -> None: resp = StreamResponse() resp.etag = "*" assert resp.etag == ETag(value="*") assert resp.headers[hdrs.ETAG] == "*" @pytest.mark.parametrize( "invalid_value", ( '"invalid"', "повинен бути ascii", ETag(value='"invalid"', is_weak=True), ETag(value="bad ©®"), ), ) def test_etag_invalid_value_set(invalid_value) -> None: resp = StreamResponse() with pytest.raises(ValueError, match="is not a valid etag"): resp.etag = invalid_value @pytest.mark.parametrize( "header", ( "forgotten quotes", '"∀ x ∉ ascii"', ), ) def test_etag_invalid_value_get(header) -> None: resp = StreamResponse() resp.headers["ETag"] = header assert resp.etag is None @pytest.mark.parametrize("invalid", (123, ETag(value=123, is_weak=True))) def test_etag_invalid_value_class(invalid) -> None: resp = StreamResponse() with pytest.raises(ValueError, match="Unsupported etag type"): resp.etag = invalid def test_etag_reset() -> None: resp = StreamResponse() resp.etag = "*" resp.etag = None assert resp.etag is None async def test_start() -> None: req = make_request("GET", "/") resp = StreamResponse() assert resp.keep_alive is None msg = await resp.prepare(req) assert msg.write_headers.called msg2 = await resp.prepare(req) assert msg is msg2 assert resp.keep_alive req2 = make_request("GET", "/") # with pytest.raises(RuntimeError): msg3 = await resp.prepare(req2) assert msg is msg3 async def test_chunked_encoding() -> None: req = make_request("GET", "/") resp = StreamResponse() assert not resp.chunked resp.enable_chunked_encoding() assert resp.chunked msg = await resp.prepare(req) assert msg.chunked def test_enable_chunked_encoding_with_content_length() -> None: resp = StreamResponse() resp.content_length = 234 with pytest.raises(RuntimeError): resp.enable_chunked_encoding() async def test_chunk_size() -> None: req = make_request("GET", "/") resp = StreamResponse() assert not resp.chunked with pytest.warns(DeprecationWarning): resp.enable_chunked_encoding(chunk_size=8192) assert resp.chunked msg = await resp.prepare(req) assert msg.chunked assert msg.enable_chunking.called assert msg.filter is not None async def test_chunked_encoding_forbidden_for_http_10() -> None: req = make_request("GET", "/", version=HttpVersion10) resp = StreamResponse() resp.enable_chunked_encoding() with pytest.raises(RuntimeError) as ctx: await resp.prepare(req) assert Matches("Using chunked encoding is forbidden for HTTP/1.0") == str(ctx.value) async def test_compression_no_accept() -> None: req = make_request("GET", "/") resp = StreamResponse() assert not resp.chunked assert not resp.compression resp.enable_compression() assert resp.compression msg = await resp.prepare(req) assert not msg.enable_compression.called async def test_force_compression_no_accept_backwards_compat() -> None: req = make_request("GET", "/") resp = StreamResponse() assert not resp.chunked assert not resp.compression with pytest.warns(DeprecationWarning): resp.enable_compression(force=True) assert resp.compression msg = await resp.prepare(req) assert msg.enable_compression.called assert msg.filter is not None async def test_force_compression_false_backwards_compat() -> None: req = make_request("GET", "/") resp = StreamResponse() assert not resp.compression with pytest.warns(DeprecationWarning): resp.enable_compression(force=False) assert resp.compression msg = await resp.prepare(req) assert not msg.enable_compression.called async def test_compression_default_coding() -> None: req = make_request( "GET", "/", headers=CIMultiDict({hdrs.ACCEPT_ENCODING: "gzip, deflate"}) ) resp = StreamResponse() assert not resp.chunked assert not resp.compression resp.enable_compression() assert resp.compression msg = await resp.prepare(req) msg.enable_compression.assert_called_with("deflate") assert "deflate" == resp.headers.get(hdrs.CONTENT_ENCODING) assert msg.filter is not None async def test_force_compression_deflate() -> None: req = make_request( "GET", "/", headers=CIMultiDict({hdrs.ACCEPT_ENCODING: "gzip, deflate"}) ) resp = StreamResponse() resp.enable_compression(ContentCoding.deflate) assert resp.compression msg = await resp.prepare(req) msg.enable_compression.assert_called_with("deflate") assert "deflate" == resp.headers.get(hdrs.CONTENT_ENCODING) async def test_force_compression_no_accept_deflate() -> None: req = make_request("GET", "/") resp = StreamResponse() resp.enable_compression(ContentCoding.deflate) assert resp.compression msg = await resp.prepare(req) msg.enable_compression.assert_called_with("deflate") assert "deflate" == resp.headers.get(hdrs.CONTENT_ENCODING) async def test_force_compression_gzip() -> None: req = make_request( "GET", "/", headers=CIMultiDict({hdrs.ACCEPT_ENCODING: "gzip, deflate"}) ) resp = StreamResponse() resp.enable_compression(ContentCoding.gzip) assert resp.compression msg = await resp.prepare(req) msg.enable_compression.assert_called_with("gzip") assert "gzip" == resp.headers.get(hdrs.CONTENT_ENCODING) async def test_force_compression_no_accept_gzip() -> None: req = make_request("GET", "/") resp = StreamResponse() resp.enable_compression(ContentCoding.gzip) assert resp.compression msg = await resp.prepare(req) msg.enable_compression.assert_called_with("gzip") assert "gzip" == resp.headers.get(hdrs.CONTENT_ENCODING) async def test_change_content_threaded_compression_enabled() -> None: req = make_request("GET", "/") body_thread_size = 1024 body = b"answer" * body_thread_size resp = Response(body=body, zlib_executor_size=body_thread_size) resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert gzip.decompress(resp._compressed_body) == body async def test_change_content_threaded_compression_enabled_explicit() -> None: req = make_request("GET", "/") body_thread_size = 1024 body = b"answer" * body_thread_size with ThreadPoolExecutor(1) as executor: resp = Response( body=body, zlib_executor_size=body_thread_size, zlib_executor=executor ) resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert gzip.decompress(resp._compressed_body) == body async def test_change_content_length_if_compression_enabled() -> None: req = make_request("GET", "/") resp = Response(body=b"answer") resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length is not None and resp.content_length != len(b"answer") async def test_set_content_length_if_compression_enabled() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH in headers assert headers[hdrs.CONTENT_LENGTH] == "26" assert hdrs.TRANSFER_ENCODING not in headers writer.write_headers.side_effect = write_headers req = make_request("GET", "/", writer=writer) resp = Response(body=b"answer") resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length == 26 del resp.headers[hdrs.CONTENT_LENGTH] assert resp.content_length == 26 async def test_remove_content_length_if_compression_enabled_http11() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH not in headers assert headers.get(hdrs.TRANSFER_ENCODING, "") == "chunked" writer.write_headers.side_effect = write_headers req = make_request("GET", "/", writer=writer) resp = StreamResponse() resp.content_length = 123 resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length is None async def test_remove_content_length_if_compression_enabled_http10() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH not in headers assert hdrs.TRANSFER_ENCODING not in headers writer.write_headers.side_effect = write_headers req = make_request("GET", "/", version=HttpVersion10, writer=writer) resp = StreamResponse() resp.content_length = 123 resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length is None async def test_force_compression_identity() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH in headers assert hdrs.TRANSFER_ENCODING not in headers writer.write_headers.side_effect = write_headers req = make_request("GET", "/", writer=writer) resp = StreamResponse() resp.content_length = 123 resp.enable_compression(ContentCoding.identity) await resp.prepare(req) assert resp.content_length == 123 async def test_force_compression_identity_response() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert headers[hdrs.CONTENT_LENGTH] == "6" assert hdrs.TRANSFER_ENCODING not in headers writer.write_headers.side_effect = write_headers req = make_request("GET", "/", writer=writer) resp = Response(body=b"answer") resp.enable_compression(ContentCoding.identity) await resp.prepare(req) assert resp.content_length == 6 async def test_rm_content_length_if_compression_http11() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH not in headers assert headers.get(hdrs.TRANSFER_ENCODING, "") == "chunked" writer.write_headers.side_effect = write_headers req = make_request("GET", "/", writer=writer) payload = BytesPayload(b"answer", headers={"X-Test-Header": "test"}) resp = Response(body=payload) assert resp.content_length == 6 resp.body = payload resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length is None async def test_rm_content_length_if_compression_http10() -> None: writer = mock.Mock() async def write_headers(status_line, headers): assert hdrs.CONTENT_LENGTH not in headers assert hdrs.TRANSFER_ENCODING not in headers writer.write_headers.side_effect = write_headers req = make_request("GET", "/", version=HttpVersion10, writer=writer) resp = Response(body=BytesPayload(b"answer")) resp.enable_compression(ContentCoding.gzip) await resp.prepare(req) assert resp.content_length is None async def test_content_length_on_chunked() -> None: req = make_request("GET", "/") resp = Response(body=b"answer") assert resp.content_length == 6 resp.enable_chunked_encoding() assert resp.content_length is None await resp.prepare(req) async def test_write_non_byteish() -> None: resp = StreamResponse() await resp.prepare(make_request("GET", "/")) with pytest.raises(AssertionError): await resp.write(123) async def test_write_before_start() -> None: resp = StreamResponse() with pytest.raises(RuntimeError): await resp.write(b"data") async def test_cannot_write_after_eof() -> None: resp = StreamResponse() req = make_request("GET", "/") await resp.prepare(req) await resp.write(b"data") await resp.write_eof() req.writer.write.reset_mock() with pytest.raises(RuntimeError): await resp.write(b"next data") assert not req.writer.write.called async def test___repr___after_eof() -> None: resp = StreamResponse() await resp.prepare(make_request("GET", "/")) assert resp.prepared await resp.write(b"data") await resp.write_eof() assert not resp.prepared resp_repr = repr(resp) assert resp_repr == "" async def test_cannot_write_eof_before_headers() -> None: resp = StreamResponse() with pytest.raises(AssertionError): await resp.write_eof() async def test_cannot_write_eof_twice() -> None: resp = StreamResponse() writer = mock.Mock() resp_impl = await resp.prepare(make_request("GET", "/")) resp_impl.write = make_mocked_coro(None) resp_impl.write_eof = make_mocked_coro(None) await resp.write(b"data") assert resp_impl.write.called await resp.write_eof() resp_impl.write.reset_mock() await resp.write_eof() assert not writer.write.called def test_force_close() -> None: resp = StreamResponse() assert resp.keep_alive is None resp.force_close() assert resp.keep_alive is False async def test_response_output_length() -> None: resp = StreamResponse() await resp.prepare(make_request("GET", "/")) with pytest.warns(DeprecationWarning): assert resp.output_length def test_response_cookies() -> None: resp = StreamResponse() assert resp.cookies == {} assert str(resp.cookies) == "" resp.set_cookie("name", "value") assert str(resp.cookies) == "Set-Cookie: name=value; Path=/" resp.set_cookie("name", "other_value") assert str(resp.cookies) == "Set-Cookie: name=other_value; Path=/" resp.cookies["name"] = "another_other_value" resp.cookies["name"]["max-age"] = 10 assert ( str(resp.cookies) == "Set-Cookie: name=another_other_value; Max-Age=10; Path=/" ) resp.del_cookie("name") expected = ( 'Set-Cookie: name=("")?; ' "expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/" ) assert Matches(expected) == str(resp.cookies) resp.set_cookie("name", "value", domain="local.host") expected = "Set-Cookie: name=value; Domain=local.host; Path=/" assert str(resp.cookies) == expected def test_response_cookie_path() -> None: resp = StreamResponse() assert resp.cookies == {} resp.set_cookie("name", "value", path="/some/path") assert str(resp.cookies) == "Set-Cookie: name=value; Path=/some/path" resp.set_cookie("name", "value", expires="123") assert str(resp.cookies) == "Set-Cookie: name=value; expires=123; Path=/" resp.set_cookie( "name", "value", domain="example.com", path="/home", expires="123", max_age="10", secure=True, httponly=True, version="2.0", samesite="lax", ) assert ( str(resp.cookies).lower() == "set-cookie: name=value; " "domain=example.com; " "expires=123; " "httponly; " "max-age=10; " "path=/home; " "samesite=lax; " "secure; " "version=2.0" ) def test_response_cookie__issue_del_cookie() -> None: resp = StreamResponse() assert resp.cookies == {} assert str(resp.cookies) == "" resp.del_cookie("name") expected = ( 'Set-Cookie: name=("")?; ' "expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/" ) assert Matches(expected) == str(resp.cookies) def test_cookie_set_after_del() -> None: resp = StreamResponse() resp.del_cookie("name") resp.set_cookie("name", "val") # check for Max-Age dropped expected = "Set-Cookie: name=val; Path=/" assert str(resp.cookies) == expected def test_set_status_with_reason() -> None: resp = StreamResponse() resp.set_status(200, "Everithing is fine!") assert 200 == resp.status assert "Everithing is fine!" == resp.reason async def test_start_force_close() -> None: req = make_request("GET", "/") resp = StreamResponse() resp.force_close() assert not resp.keep_alive await resp.prepare(req) assert not resp.keep_alive async def test___repr__() -> None: req = make_request("GET", "/path/to") resp = StreamResponse(reason=301) await resp.prepare(req) assert "" == repr(resp) def test___repr___not_prepared() -> None: resp = StreamResponse(reason=301) assert "" == repr(resp) async def test_keep_alive_http10_default() -> None: req = make_request("GET", "/", version=HttpVersion10) resp = StreamResponse() await resp.prepare(req) assert not resp.keep_alive async def test_keep_alive_http10_switched_on() -> None: headers = CIMultiDict(Connection="keep-alive") req = make_request("GET", "/", version=HttpVersion10, headers=headers) req._message = req._message._replace(should_close=False) resp = StreamResponse() await resp.prepare(req) assert resp.keep_alive async def test_keep_alive_http09() -> None: headers = CIMultiDict(Connection="keep-alive") req = make_request("GET", "/", version=HttpVersion(0, 9), headers=headers) resp = StreamResponse() await resp.prepare(req) assert not resp.keep_alive async def test_prepare_twice() -> None: req = make_request("GET", "/") resp = StreamResponse() impl1 = await resp.prepare(req) impl2 = await resp.prepare(req) assert impl1 is impl2 async def test_prepare_calls_signal() -> None: app = mock.Mock() sig = make_mocked_coro() on_response_prepare = aiosignal.Signal(app) on_response_prepare.append(sig) req = make_request("GET", "/", app=app, on_response_prepare=on_response_prepare) resp = StreamResponse() await resp.prepare(req) sig.assert_called_with(req, resp) # Response class def test_response_ctor() -> None: resp = Response() assert 200 == resp.status assert "OK" == resp.reason assert resp.body is None assert resp.content_length == 0 assert "CONTENT-LENGTH" not in resp.headers async def test_ctor_with_headers_and_status() -> None: resp = Response(body=b"body", status=201, headers={"Age": "12", "DATE": "date"}) assert 201 == resp.status assert b"body" == resp.body assert resp.headers["AGE"] == "12" req = make_mocked_request("GET", "/") await resp._start(req) assert 4 == resp.content_length assert resp.headers["CONTENT-LENGTH"] == "4" def test_ctor_content_type() -> None: resp = Response(content_type="application/json") assert 200 == resp.status assert "OK" == resp.reason assert 0 == resp.content_length assert CIMultiDict([("CONTENT-TYPE", "application/json")]) == resp.headers def test_ctor_text_body_combined() -> None: with pytest.raises(ValueError): Response(body=b"123", text="test text") async def test_ctor_text() -> None: resp = Response(text="test text") assert 200 == resp.status assert "OK" == resp.reason assert 9 == resp.content_length assert CIMultiDict([("CONTENT-TYPE", "text/plain; charset=utf-8")]) == resp.headers assert resp.body == b"test text" assert resp.text == "test text" resp.headers["DATE"] = "date" req = make_mocked_request("GET", "/", version=HttpVersion11) await resp._start(req) assert resp.headers["CONTENT-LENGTH"] == "9" def test_ctor_charset() -> None: resp = Response(text="текст", charset="koi8-r") assert "текст".encode("koi8-r") == resp.body assert "koi8-r" == resp.charset def test_ctor_charset_default_utf8() -> None: resp = Response(text="test test", charset=None) assert "utf-8" == resp.charset def test_ctor_charset_in_content_type() -> None: with pytest.raises(ValueError): Response(text="test test", content_type="text/plain; charset=utf-8") def test_ctor_charset_without_text() -> None: resp = Response(content_type="text/plain", charset="koi8-r") assert "koi8-r" == resp.charset def test_ctor_content_type_with_extra() -> None: resp = Response(text="test test", content_type="text/plain; version=0.0.4") assert resp.content_type == "text/plain" assert resp.headers["content-type"] == "text/plain; version=0.0.4; charset=utf-8" def test_ctor_both_content_type_param_and_header_with_text() -> None: with pytest.raises(ValueError): Response( headers={"Content-Type": "application/json"}, content_type="text/html", text="text", ) def test_ctor_both_charset_param_and_header_with_text() -> None: with pytest.raises(ValueError): Response( headers={"Content-Type": "application/json"}, charset="koi8-r", text="text" ) def test_ctor_both_content_type_param_and_header() -> None: with pytest.raises(ValueError): Response(headers={"Content-Type": "application/json"}, content_type="text/html") def test_ctor_both_charset_param_and_header() -> None: with pytest.raises(ValueError): Response(headers={"Content-Type": "application/json"}, charset="koi8-r") async def test_assign_nonbyteish_body() -> None: resp = Response(body=b"data") with pytest.raises(ValueError): resp.body = 123 assert b"data" == resp.body assert 4 == resp.content_length resp.headers["DATE"] = "date" req = make_mocked_request("GET", "/", version=HttpVersion11) await resp._start(req) assert resp.headers["CONTENT-LENGTH"] == "4" assert 4 == resp.content_length def test_assign_nonstr_text() -> None: resp = Response(text="test") with pytest.raises(AssertionError): resp.text = b"123" assert b"test" == resp.body assert 4 == resp.content_length def test_response_set_content_length() -> None: resp = Response() with pytest.raises(RuntimeError): resp.content_length = 1 async def test_send_headers_for_empty_body(buf, writer) -> None: req = make_request("GET", "/", writer=writer) resp = Response() await resp.prepare(req) await resp.write_eof() txt = buf.decode("utf8") assert ( Matches( "HTTP/1.1 200 OK\r\n" "Content-Length: 0\r\n" "Content-Type: application/octet-stream\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" ) == txt ) async def test_render_with_body(buf, writer) -> None: req = make_request("GET", "/", writer=writer) resp = Response(body=b"data") await resp.prepare(req) await resp.write_eof() txt = buf.decode("utf8") assert ( Matches( "HTTP/1.1 200 OK\r\n" "Content-Length: 4\r\n" "Content-Type: application/octet-stream\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" "data" ) == txt ) async def test_send_set_cookie_header(buf, writer) -> None: resp = Response() resp.cookies["name"] = "value" req = make_request("GET", "/", writer=writer) await resp.prepare(req) await resp.write_eof() txt = buf.decode("utf8") assert ( Matches( "HTTP/1.1 200 OK\r\n" "Content-Length: 0\r\n" "Set-Cookie: name=value\r\n" "Content-Type: application/octet-stream\r\n" "Date: .+\r\n" "Server: .+\r\n\r\n" ) == txt ) async def test_consecutive_write_eof() -> None: writer = mock.Mock() writer.write_eof = make_mocked_coro() writer.write_headers = make_mocked_coro() req = make_request("GET", "/", writer=writer) data = b"data" resp = Response(body=data) await resp.prepare(req) await resp.write_eof() await resp.write_eof() writer.write_eof.assert_called_once_with(data) def test_set_text_with_content_type() -> None: resp = Response() resp.content_type = "text/html" resp.text = "text" assert "text" == resp.text assert b"text" == resp.body assert "text/html" == resp.content_type def test_set_text_with_charset() -> None: resp = Response() resp.content_type = "text/plain" resp.charset = "KOI8-R" resp.text = "текст" assert "текст" == resp.text assert "текст".encode("koi8-r") == resp.body assert "koi8-r" == resp.charset def test_default_content_type_in_stream_response() -> None: resp = StreamResponse() assert resp.content_type == "application/octet-stream" def test_default_content_type_in_response() -> None: resp = Response() assert resp.content_type == "application/octet-stream" def test_content_type_with_set_text() -> None: resp = Response(text="text") assert resp.content_type == "text/plain" def test_content_type_with_set_body() -> None: resp = Response(body=b"body") assert resp.content_type == "application/octet-stream" def test_started_when_not_started() -> None: resp = StreamResponse() assert not resp.prepared async def test_started_when_started() -> None: resp = StreamResponse() await resp.prepare(make_request("GET", "/")) assert resp.prepared async def test_drain_before_start() -> None: resp = StreamResponse() with pytest.raises(AssertionError): await resp.drain() async def test_changing_status_after_prepare_raises() -> None: resp = StreamResponse() await resp.prepare(make_request("GET", "/")) with pytest.raises(AssertionError): resp.set_status(400) def test_nonstr_text_in_ctor() -> None: with pytest.raises(TypeError): Response(text=b"data") def test_text_in_ctor_with_content_type() -> None: resp = Response(text="data", content_type="text/html") assert "data" == resp.text assert "text/html" == resp.content_type def test_text_in_ctor_with_content_type_header() -> None: resp = Response(text="текст", headers={"Content-Type": "text/html; charset=koi8-r"}) assert "текст".encode("koi8-r") == resp.body assert "text/html" == resp.content_type assert "koi8-r" == resp.charset def test_text_in_ctor_with_content_type_header_multidict() -> None: headers = CIMultiDict({"Content-Type": "text/html; charset=koi8-r"}) resp = Response(text="текст", headers=headers) assert "текст".encode("koi8-r") == resp.body assert "text/html" == resp.content_type assert "koi8-r" == resp.charset def test_body_in_ctor_with_content_type_header_multidict() -> None: headers = CIMultiDict({"Content-Type": "text/html; charset=koi8-r"}) resp = Response(body="текст".encode("koi8-r"), headers=headers) assert "текст".encode("koi8-r") == resp.body assert "text/html" == resp.content_type assert "koi8-r" == resp.charset def test_text_with_empty_payload() -> None: resp = Response(status=200) assert resp.body is None assert resp.text is None def test_response_with_content_length_header_without_body() -> None: resp = Response(headers={"Content-Length": 123}) assert resp.content_length == 123 def test_response_with_immutable_headers() -> None: resp = Response( text="text", headers=CIMultiDictProxy(CIMultiDict({"Header": "Value"})) ) assert resp.headers == { "Header": "Value", "Content-Type": "text/plain; charset=utf-8", } async def test_response_prepared_after_header_preparation() -> None: req = make_request("GET", "/") resp = StreamResponse() await resp.prepare(req) assert type(resp.headers["Server"]) is str async def _strip_server(req, res): assert "Server" in res.headers if "Server" in res.headers: del res.headers["Server"] app = mock.Mock() sig = aiosignal.Signal(app) sig.append(_strip_server) req = make_request("GET", "/", on_response_prepare=sig, app=app) resp = StreamResponse() await resp.prepare(req) assert "Server" not in resp.headers class TestJSONResponse: def test_content_type_is_application_json_by_default(self) -> None: resp = json_response("") assert "application/json" == resp.content_type def test_passing_text_only(self) -> None: resp = json_response(text=json.dumps("jaysawn")) assert resp.text == json.dumps("jaysawn") def test_data_and_text_raises_value_error(self) -> None: with pytest.raises(ValueError) as excinfo: json_response(data="foo", text="bar") expected_message = "only one of data, text, or body should be specified" assert expected_message == excinfo.value.args[0] def test_data_and_body_raises_value_error(self) -> None: with pytest.raises(ValueError) as excinfo: json_response(data="foo", body=b"bar") expected_message = "only one of data, text, or body should be specified" assert expected_message == excinfo.value.args[0] def test_text_is_json_encoded(self) -> None: resp = json_response({"foo": 42}) assert json.dumps({"foo": 42}) == resp.text def test_content_type_is_overrideable(self) -> None: resp = json_response({"foo": 42}, content_type="application/vnd.json+api") assert "application/vnd.json+api" == resp.content_type ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_runner.py0000644000175100001710000001213100000000000017452 0ustar00runnerdockerimport asyncio import platform import signal import sys from unittest.mock import patch import pytest from aiohttp import web from aiohttp.test_utils import get_unused_port_socket @pytest.fixture def app(): return web.Application() @pytest.fixture def make_runner(loop, app): asyncio.set_event_loop(loop) runners = [] def go(**kwargs): runner = web.AppRunner(app, **kwargs) runners.append(runner) return runner yield go for runner in runners: loop.run_until_complete(runner.cleanup()) async def test_site_for_nonfrozen_app(make_runner) -> None: runner = make_runner() with pytest.raises(RuntimeError): web.TCPSite(runner) assert len(runner.sites) == 0 @pytest.mark.skipif( platform.system() == "Windows", reason="the test is not valid for Windows" ) async def test_runner_setup_handle_signals(make_runner) -> None: runner = make_runner(handle_signals=True) await runner.setup() assert signal.getsignal(signal.SIGTERM) is not signal.SIG_DFL await runner.cleanup() assert signal.getsignal(signal.SIGTERM) is signal.SIG_DFL @pytest.mark.skipif( platform.system() == "Windows", reason="the test is not valid for Windows" ) async def test_runner_setup_without_signal_handling(make_runner) -> None: runner = make_runner(handle_signals=False) await runner.setup() assert signal.getsignal(signal.SIGTERM) is signal.SIG_DFL await runner.cleanup() assert signal.getsignal(signal.SIGTERM) is signal.SIG_DFL async def test_site_double_added(make_runner) -> None: _sock = get_unused_port_socket("127.0.0.1") runner = make_runner() await runner.setup() site = web.SockSite(runner, _sock) await site.start() with pytest.raises(RuntimeError): await site.start() assert len(runner.sites) == 1 async def test_site_stop_not_started(make_runner) -> None: runner = make_runner() await runner.setup() site = web.TCPSite(runner) with pytest.raises(RuntimeError): await site.stop() assert len(runner.sites) == 0 async def test_custom_log_format(make_runner) -> None: runner = make_runner(access_log_format="abc") await runner.setup() assert runner.server._kwargs["access_log_format"] == "abc" async def test_unreg_site(make_runner) -> None: runner = make_runner() await runner.setup() site = web.TCPSite(runner) with pytest.raises(RuntimeError): runner._unreg_site(site) async def test_app_property(make_runner, app) -> None: runner = make_runner() assert runner.app is app def test_non_app() -> None: with pytest.raises(TypeError): web.AppRunner(object()) @pytest.mark.skipif( platform.system() == "Windows", reason="Unix socket support is required" ) async def test_addresses(make_runner, shorttmpdir) -> None: _sock = get_unused_port_socket("127.0.0.1") runner = make_runner() await runner.setup() tcp = web.SockSite(runner, _sock) await tcp.start() path = str(shorttmpdir / "tmp.sock") unix = web.UnixSite(runner, path) await unix.start() actual_addrs = runner.addresses expected_host, expected_post = _sock.getsockname()[:2] assert actual_addrs == [(expected_host, expected_post), path] @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_runner_wrong_loop(app, selector_loop, pipe_name) -> None: runner = web.AppRunner(app) await runner.setup() with pytest.raises(RuntimeError): web.NamedPipeSite(runner, pipe_name) @pytest.mark.skipif( platform.system() != "Windows", reason="Proactor Event loop present only in Windows" ) async def test_named_pipe_runner_proactor_loop(proactor_loop, app, pipe_name) -> None: runner = web.AppRunner(app) await runner.setup() pipe = web.NamedPipeSite(runner, pipe_name) await pipe.start() await runner.cleanup() async def test_tcpsite_default_host(make_runner): runner = make_runner() await runner.setup() site = web.TCPSite(runner) assert site.name == "http://0.0.0.0:8080" calls = [] async def mock_create_server(*args, **kwargs): calls.append((args, kwargs)) with patch("asyncio.get_event_loop") as mock_get_loop: mock_get_loop.return_value.create_server = mock_create_server await site.start() assert len(calls) == 1 server, host, port = calls[0][0] assert server is runner.server assert host is None assert port == 8080 @pytest.mark.skipif(sys.version_info < (3, 7), reason="Requires asyncio.run()") def test_run_after_asyncio_run() -> None: async def nothing(): pass def spy(): spy.called = True spy.called = False async def shutdown(): spy() raise web.GracefulExit() # asyncio.run() creates a new loop and closes it. asyncio.run(nothing()) app = web.Application() # create_task() will delay the function until app is run. app.on_startup.append(lambda a: asyncio.create_task(shutdown())) web.run_app(app) assert spy.called, "run_app() should work after asyncio.run()." ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_sendfile.py0000644000175100001710000001016300000000000017735 0ustar00runnerdockerfrom unittest import mock from aiohttp import hdrs from aiohttp.test_utils import make_mocked_coro, make_mocked_request from aiohttp.web_fileresponse import FileResponse def test_using_gzip_if_header_present_and_file_available(loop) -> None: request = make_mocked_request( "GET", "http://python.org/logo.png", headers={hdrs.ACCEPT_ENCODING: "gzip"} ) gz_filepath = mock.Mock() gz_filepath.open = mock.mock_open() gz_filepath.is_file.return_value = True gz_filepath.stat.return_value = mock.MagicMock() gz_filepath.stat.return_value.st_size = 1024 gz_filepath.stat.return_value.st_mtime_ns = 1603733507222449291 filepath = mock.Mock() filepath.name = "logo.png" filepath.open = mock.mock_open() filepath.with_name.return_value = gz_filepath file_sender = FileResponse(filepath) file_sender._sendfile = make_mocked_coro(None) # type: ignore[assignment] loop.run_until_complete(file_sender.prepare(request)) assert not filepath.open.called assert gz_filepath.open.called def test_gzip_if_header_not_present_and_file_available(loop) -> None: request = make_mocked_request("GET", "http://python.org/logo.png", headers={}) gz_filepath = mock.Mock() gz_filepath.open = mock.mock_open() gz_filepath.is_file.return_value = True filepath = mock.Mock() filepath.name = "logo.png" filepath.open = mock.mock_open() filepath.with_name.return_value = gz_filepath filepath.stat.return_value = mock.MagicMock() filepath.stat.return_value.st_size = 1024 filepath.stat.return_value.st_mtime_ns = 1603733507222449291 file_sender = FileResponse(filepath) file_sender._sendfile = make_mocked_coro(None) # type: ignore[assignment] loop.run_until_complete(file_sender.prepare(request)) assert filepath.open.called assert not gz_filepath.open.called def test_gzip_if_header_not_present_and_file_not_available(loop) -> None: request = make_mocked_request("GET", "http://python.org/logo.png", headers={}) gz_filepath = mock.Mock() gz_filepath.open = mock.mock_open() gz_filepath.is_file.return_value = False filepath = mock.Mock() filepath.name = "logo.png" filepath.open = mock.mock_open() filepath.with_name.return_value = gz_filepath filepath.stat.return_value = mock.MagicMock() filepath.stat.return_value.st_size = 1024 filepath.stat.return_value.st_mtime_ns = 1603733507222449291 file_sender = FileResponse(filepath) file_sender._sendfile = make_mocked_coro(None) # type: ignore[assignment] loop.run_until_complete(file_sender.prepare(request)) assert filepath.open.called assert not gz_filepath.open.called def test_gzip_if_header_present_and_file_not_available(loop) -> None: request = make_mocked_request( "GET", "http://python.org/logo.png", headers={hdrs.ACCEPT_ENCODING: "gzip"} ) gz_filepath = mock.Mock() gz_filepath.open = mock.mock_open() gz_filepath.is_file.return_value = False filepath = mock.Mock() filepath.name = "logo.png" filepath.open = mock.mock_open() filepath.with_name.return_value = gz_filepath filepath.stat.return_value = mock.MagicMock() filepath.stat.return_value.st_size = 1024 filepath.stat.return_value.st_mtime_ns = 1603733507222449291 file_sender = FileResponse(filepath) file_sender._sendfile = make_mocked_coro(None) # type: ignore[assignment] loop.run_until_complete(file_sender.prepare(request)) assert filepath.open.called assert not gz_filepath.open.called def test_status_controlled_by_user(loop) -> None: request = make_mocked_request("GET", "http://python.org/logo.png", headers={}) filepath = mock.Mock() filepath.name = "logo.png" filepath.open = mock.mock_open() filepath.stat.return_value = mock.MagicMock() filepath.stat.return_value.st_size = 1024 filepath.stat.return_value.st_mtime_ns = 1603733507222449291 file_sender = FileResponse(filepath, status=203) file_sender._sendfile = make_mocked_coro(None) # type: ignore[assignment] loop.run_until_complete(file_sender.prepare(request)) assert file_sender._status == 203 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_sendfile_functional.py0000644000175100001710000006560700000000000022174 0ustar00runnerdockerimport asyncio import os import pathlib import socket import zlib from typing import Any, Iterable import pytest import aiohttp from aiohttp import web try: import ssl except ImportError: ssl = None # type: ignore @pytest.fixture def loop_without_sendfile(loop): def sendfile(*args, **kwargs): raise NotImplementedError loop.sendfile = sendfile return loop @pytest.fixture def loop_with_mocked_native_sendfile(loop: Any): def sendfile(transport, fobj, offset, count): if count == 0: raise ValueError("count must be a positive integer (got 0)") raise NotImplementedError loop.sendfile = sendfile return loop @pytest.fixture(params=["sendfile", "no_sendfile"], ids=["sendfile", "no_sendfile"]) def sender(request, loop_without_sendfile): def maker(*args, **kwargs): ret = web.FileResponse(*args, **kwargs) if request.param == "no_sendfile": asyncio.set_event_loop(loop_without_sendfile) return ret return maker @pytest.fixture def app_with_static_route(sender): filename = "data.unknown_mime_type" filepath = pathlib.Path(__file__).parent / filename async def handler(request): return sender(filepath) app = web.Application() app.router.add_get("/", handler) return app async def test_static_file_ok( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.get("/") assert resp.status == 200 txt = await resp.text() assert "file content" == txt.rstrip() assert "application/octet-stream" == resp.headers["Content-Type"] assert resp.headers.get("Content-Encoding") is None await resp.release() async def test_zero_bytes_file_ok(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "data.zero_bytes" async def handler(request): return sender(filepath) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) # Run the request multiple times to ensure # that an untrapped exception is not hidden # because there is no read of the zero bytes for i in range(2): resp = await client.get("/") assert resp.status == 200 txt = await resp.text() assert "" == txt.rstrip() assert "application/octet-stream" == resp.headers["Content-Type"] assert resp.headers.get("Content-Encoding") is None await resp.release() async def test_zero_bytes_file_mocked_native_sendfile( aiohttp_client: Any, loop_with_mocked_native_sendfile: Any ) -> None: filepath = pathlib.Path(__file__).parent / "data.zero_bytes" async def handler(request): asyncio.set_event_loop(loop_with_mocked_native_sendfile) return web.FileResponse(filepath) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) # Run the request multiple times to ensure # that an untrapped exception is not hidden # because there is no read of the zero bytes for i in range(2): resp = await client.get("/") assert resp.status == 200 txt = await resp.text() assert "" == txt.rstrip() assert "application/octet-stream" == resp.headers["Content-Type"] assert resp.headers.get("Content-Encoding") is None assert resp.headers.get("Content-Length") == "0" await resp.release() async def test_static_file_ok_string_path( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.get("/") assert resp.status == 200 txt = await resp.text() assert "file content" == txt.rstrip() assert "application/octet-stream" == resp.headers["Content-Type"] assert resp.headers.get("Content-Encoding") is None await resp.release() async def test_static_file_not_exists(aiohttp_client) -> None: app = web.Application() client = await aiohttp_client(app) resp = await client.get("/fake") assert resp.status == 404 await resp.release() async def test_static_file_name_too_long(aiohttp_client) -> None: app = web.Application() client = await aiohttp_client(app) resp = await client.get("/x*500") assert resp.status == 404 await resp.release() async def test_static_file_upper_directory(aiohttp_client) -> None: app = web.Application() client = await aiohttp_client(app) resp = await client.get("/../../") assert resp.status == 404 await resp.release() async def test_static_file_with_content_type(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "aiohttp.jpg" async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 body = await resp.read() with filepath.open("rb") as f: content = f.read() assert content == body assert resp.headers["Content-Type"] == "image/jpeg" assert resp.headers.get("Content-Encoding") is None resp.close() async def test_static_file_custom_content_type(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "hello.txt.gz" async def handler(request): resp = sender(filepath, chunk_size=16) resp.content_type = "application/pdf" return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 body = await resp.read() with filepath.open("rb") as f: content = f.read() assert content == body assert resp.headers["Content-Type"] == "application/pdf" assert resp.headers.get("Content-Encoding") is None resp.close() async def test_static_file_custom_content_type_compress(aiohttp_client, sender): filepath = pathlib.Path(__file__).parent / "hello.txt" async def handler(request): resp = sender(filepath, chunk_size=16) resp.content_type = "application/pdf" return resp app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 body = await resp.read() assert b"hello aiohttp\n" == body assert resp.headers["Content-Type"] == "application/pdf" assert resp.headers.get("Content-Encoding") == "gzip" resp.close() async def test_static_file_with_content_encoding(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "hello.txt.gz" async def handler(request): return sender(filepath) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert 200 == resp.status body = await resp.read() assert b"hello aiohttp\n" == body ct = resp.headers["CONTENT-TYPE"] assert "text/plain" == ct encoding = resp.headers["CONTENT-ENCODING"] assert "gzip" == encoding resp.close() async def test_static_file_if_modified_since( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.get("/") assert 200 == resp.status lastmod = resp.headers.get("Last-Modified") assert lastmod is not None resp.close() resp = await client.get("/", headers={"If-Modified-Since": lastmod}) body = await resp.read() assert 304 == resp.status assert resp.headers.get("Content-Length") is None assert resp.headers.get("Last-Modified") == lastmod assert b"" == body resp.close() async def test_static_file_if_modified_since_past_date( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Mon, 1 Jan 1990 01:01:01 GMT" resp = await client.get("/", headers={"If-Modified-Since": lastmod}) assert 200 == resp.status resp.close() async def test_static_file_if_modified_since_invalid_date( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "not a valid HTTP-date" resp = await client.get("/", headers={"If-Modified-Since": lastmod}) assert 200 == resp.status resp.close() async def test_static_file_if_modified_since_future_date( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Fri, 31 Dec 9999 23:59:59 GMT" resp = await client.get("/", headers={"If-Modified-Since": lastmod}) body = await resp.read() assert 304 == resp.status assert resp.headers.get("Content-Length") is None assert resp.headers.get("Last-Modified") assert b"" == body resp.close() @pytest.mark.parametrize("if_unmodified_since", ("", "Fri, 31 Dec 0000 23:59:59 GMT")) async def test_static_file_if_match( aiohttp_client: Any, app_with_static_route: web.Application, if_unmodified_since: str, ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.get("/") assert 200 == resp.status original_etag = resp.headers.get("ETag") assert original_etag is not None resp.close() headers = {"If-Match": original_etag, "If-Unmodified-Since": if_unmodified_since} resp = await client.head("/", headers=headers) body = await resp.read() assert 200 == resp.status assert resp.headers.get("ETag") assert resp.headers.get("Last-Modified") assert b"" == body resp.close() @pytest.mark.parametrize("if_unmodified_since", ("", "Fri, 31 Dec 0000 23:59:59 GMT")) @pytest.mark.parametrize( "etags,expected_status", [ (("*",), 200), (('"example-tag"', 'W/"weak-tag"'), 412), ], ) async def test_static_file_if_match_custom_tags( aiohttp_client: Any, app_with_static_route: web.Application, if_unmodified_since: str, etags: Iterable[str], expected_status: Iterable[int], ) -> None: client = await aiohttp_client(app_with_static_route) if_match = ", ".join(etags) headers = {"If-Match": if_match, "If-Unmodified-Since": if_unmodified_since} resp = await client.head("/", headers=headers) body = await resp.read() assert expected_status == resp.status assert b"" == body resp.close() @pytest.mark.parametrize("if_modified_since", ("", "Fri, 31 Dec 9999 23:59:59 GMT")) @pytest.mark.parametrize( "additional_etags", ( (), ('"some-other-strong-etag"', 'W/"weak-tag"', "invalid-tag"), ), ) async def test_static_file_if_none_match( aiohttp_client: Any, app_with_static_route: web.Application, if_modified_since: str, additional_etags: Iterable[str], ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.get("/") assert 200 == resp.status original_etag = resp.headers.get("ETag") assert resp.headers.get("Last-Modified") is not None assert original_etag is not None resp.close() etag = ",".join((original_etag, *additional_etags)) resp = await client.get( "/", headers={"If-None-Match": etag, "If-Modified-Since": if_modified_since} ) body = await resp.read() assert 304 == resp.status assert resp.headers.get("Content-Length") is None assert resp.headers.get("ETag") == original_etag assert b"" == body resp.close() async def test_static_file_if_none_match_star( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) resp = await client.head("/", headers={"If-None-Match": "*"}) body = await resp.read() assert 304 == resp.status assert resp.headers.get("Content-Length") is None assert resp.headers.get("ETag") assert resp.headers.get("Last-Modified") assert b"" == body resp.close() @pytest.mark.skipif(not ssl, reason="ssl not supported") async def test_static_file_ssl( aiohttp_server, ssl_ctx, aiohttp_client, client_ssl_ctx, ) -> None: dirname = os.path.dirname(__file__) filename = "data.unknown_mime_type" app = web.Application() app.router.add_static("/static", dirname) server = await aiohttp_server(app, ssl=ssl_ctx) conn = aiohttp.TCPConnector(ssl=client_ssl_ctx) client = await aiohttp_client(server, connector=conn) resp = await client.get("/static/" + filename) assert 200 == resp.status txt = await resp.text() assert "file content" == txt.rstrip() ct = resp.headers["CONTENT-TYPE"] assert "application/octet-stream" == ct assert resp.headers.get("CONTENT-ENCODING") is None async def test_static_file_directory_traversal_attack(aiohttp_client) -> None: dirname = os.path.dirname(__file__) relpath = "../README.rst" assert os.path.isfile(os.path.join(dirname, relpath)) app = web.Application() app.router.add_static("/static", dirname) client = await aiohttp_client(app) resp = await client.get("/static/" + relpath) assert 404 == resp.status url_relpath2 = "/static/dir/../" + relpath resp = await client.get(url_relpath2) assert 404 == resp.status url_abspath = "/static/" + os.path.abspath(os.path.join(dirname, relpath)) resp = await client.get(url_abspath) assert 403 == resp.status def test_static_route_path_existence_check() -> None: directory = os.path.dirname(__file__) web.StaticResource("/", directory) nodirectory = os.path.join(directory, "nonexistent-uPNiOEAg5d") with pytest.raises(ValueError): web.StaticResource("/", nodirectory) async def test_static_file_huge(aiohttp_client, tmpdir) -> None: filename = "huge_data.unknown_mime_type" # fill 20MB file with tmpdir.join(filename).open("wb") as f: for i in range(1024 * 20): f.write((chr(i % 64 + 0x20) * 1024).encode()) file_st = os.stat(str(tmpdir.join(filename))) app = web.Application() app.router.add_static("/static", str(tmpdir)) client = await aiohttp_client(app) resp = await client.get("/static/" + filename) assert 200 == resp.status ct = resp.headers["CONTENT-TYPE"] assert "application/octet-stream" == ct assert resp.headers.get("CONTENT-ENCODING") is None assert int(resp.headers.get("CONTENT-LENGTH")) == file_st.st_size f = tmpdir.join(filename).open("rb") off = 0 cnt = 0 while off < file_st.st_size: chunk = await resp.content.readany() expected = f.read(len(chunk)) assert chunk == expected off += len(chunk) cnt += 1 f.close() async def test_static_file_range(aiohttp_client: Any, sender: Any) -> None: filepath = pathlib.Path(__file__).parent / "sample.txt" filesize = filepath.stat().st_size async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with filepath.open("rb") as f: content = f.read() # Ensure the whole file requested in parts is correct responses = await asyncio.gather( client.get("/", headers={"Range": "bytes=0-999"}), client.get("/", headers={"Range": "bytes=1000-1999"}), client.get("/", headers={"Range": "bytes=2000-"}), ) assert len(responses) == 3 assert responses[0].status == 206, "failed 'bytes=0-999': %s" % responses[0].reason assert responses[0].headers["Content-Range"] == "bytes 0-999/{}".format( filesize ), "failed: Content-Range Error" assert responses[1].status == 206, ( "failed 'bytes=1000-1999': %s" % responses[1].reason ) assert responses[1].headers["Content-Range"] == "bytes 1000-1999/{}".format( filesize ), "failed: Content-Range Error" assert responses[2].status == 206, "failed 'bytes=2000-': %s" % responses[2].reason assert responses[2].headers["Content-Range"] == "bytes 2000-{}/{}".format( filesize - 1, filesize ), "failed: Content-Range Error" body = await asyncio.gather( *(resp.read() for resp in responses), ) assert len(body[0]) == 1000, "failed 'bytes=0-999', received %d bytes" % len( body[0] ) assert len(body[1]) == 1000, "failed 'bytes=1000-1999', received %d bytes" % len( body[1] ) responses[0].close() responses[1].close() responses[2].close() assert content == b"".join(body) async def test_static_file_range_end_bigger_than_size(aiohttp_client, sender): filepath = pathlib.Path(__file__).parent / "aiohttp.png" async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with filepath.open("rb") as f: content = f.read() # Ensure the whole file requested in parts is correct response = await client.get("/", headers={"Range": "bytes=54000-55000"}) assert response.status == 206, ( "failed 'bytes=54000-55000': %s" % response.reason ) assert ( response.headers["Content-Range"] == "bytes 54000-54996/54997" ), "failed: Content-Range Error" body = await response.read() assert len(body) == 997, "failed 'bytes=54000-55000', received %d bytes" % len( body ) assert content[54000:] == body async def test_static_file_range_beyond_eof(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "aiohttp.png" async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) # Ensure the whole file requested in parts is correct response = await client.get("/", headers={"Range": "bytes=1000000-1200000"}) assert response.status == 416, ( "failed 'bytes=1000000-1200000': %s" % response.reason ) async def test_static_file_range_tail(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "aiohttp.png" async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) with filepath.open("rb") as f: content = f.read() # Ensure the tail of the file is correct resp = await client.get("/", headers={"Range": "bytes=-500"}) assert resp.status == 206, resp.reason assert ( resp.headers["Content-Range"] == "bytes 54497-54996/54997" ), "failed: Content-Range Error" body4 = await resp.read() resp.close() assert content[-500:] == body4 # Ensure out-of-range tails could be handled resp2 = await client.get("/", headers={"Range": "bytes=-99999999999999"}) assert resp2.status == 206, resp.reason assert ( resp2.headers["Content-Range"] == "bytes 0-54996/54997" ), "failed: Content-Range Error" async def test_static_file_invalid_range(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "aiohttp.png" async def handler(request): return sender(filepath, chunk_size=16) app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) # range must be in bytes resp = await client.get("/", headers={"Range": "blocks=0-10"}) assert resp.status == 416, "Range must be in bytes" resp.close() # start > end resp = await client.get("/", headers={"Range": "bytes=100-0"}) assert resp.status == 416, "Range start can't be greater than end" resp.close() # start > end resp = await client.get("/", headers={"Range": "bytes=10-9"}) assert resp.status == 416, "Range start can't be greater than end" resp.close() # non-number range resp = await client.get("/", headers={"Range": "bytes=a-f"}) assert resp.status == 416, "Range must be integers" resp.close() # double dash range resp = await client.get("/", headers={"Range": "bytes=0--10"}) assert resp.status == 416, "double dash in range" resp.close() # no range resp = await client.get("/", headers={"Range": "bytes=-"}) assert resp.status == 416, "no range given" resp.close() async def test_static_file_if_unmodified_since_past_with_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Mon, 1 Jan 1990 01:01:01 GMT" resp = await client.get( "/", headers={"If-Unmodified-Since": lastmod, "Range": "bytes=2-"} ) assert 412 == resp.status resp.close() async def test_static_file_if_unmodified_since_future_with_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Fri, 31 Dec 9999 23:59:59 GMT" resp = await client.get( "/", headers={"If-Unmodified-Since": lastmod, "Range": "bytes=2-"} ) assert 206 == resp.status assert resp.headers["Content-Range"] == "bytes 2-12/13" assert resp.headers["Content-Length"] == "11" resp.close() async def test_static_file_if_range_past_with_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Mon, 1 Jan 1990 01:01:01 GMT" resp = await client.get("/", headers={"If-Range": lastmod, "Range": "bytes=2-"}) assert 200 == resp.status assert resp.headers["Content-Length"] == "13" resp.close() async def test_static_file_if_range_future_with_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Fri, 31 Dec 9999 23:59:59 GMT" resp = await client.get("/", headers={"If-Range": lastmod, "Range": "bytes=2-"}) assert 206 == resp.status assert resp.headers["Content-Range"] == "bytes 2-12/13" assert resp.headers["Content-Length"] == "11" resp.close() async def test_static_file_if_unmodified_since_past_without_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Mon, 1 Jan 1990 01:01:01 GMT" resp = await client.get("/", headers={"If-Unmodified-Since": lastmod}) assert 412 == resp.status resp.close() async def test_static_file_if_unmodified_since_future_without_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Fri, 31 Dec 9999 23:59:59 GMT" resp = await client.get("/", headers={"If-Unmodified-Since": lastmod}) assert 200 == resp.status assert resp.headers["Content-Length"] == "13" resp.close() async def test_static_file_if_range_past_without_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Mon, 1 Jan 1990 01:01:01 GMT" resp = await client.get("/", headers={"If-Range": lastmod}) assert 200 == resp.status assert resp.headers["Content-Length"] == "13" resp.close() async def test_static_file_if_range_future_without_range( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "Fri, 31 Dec 9999 23:59:59 GMT" resp = await client.get("/", headers={"If-Range": lastmod}) assert 200 == resp.status assert resp.headers["Content-Length"] == "13" resp.close() async def test_static_file_if_unmodified_since_invalid_date( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "not a valid HTTP-date" resp = await client.get("/", headers={"If-Unmodified-Since": lastmod}) assert 200 == resp.status resp.close() async def test_static_file_if_range_invalid_date( aiohttp_client: Any, app_with_static_route: web.Application, ) -> None: client = await aiohttp_client(app_with_static_route) lastmod = "not a valid HTTP-date" resp = await client.get("/", headers={"If-Range": lastmod}) assert 200 == resp.status resp.close() async def test_static_file_compression(aiohttp_client, sender) -> None: filepath = pathlib.Path(__file__).parent / "data.unknown_mime_type" async def handler(request): ret = sender(filepath) ret.enable_compression() return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app, auto_decompress=False) resp = await client.get("/") assert resp.status == 200 zcomp = zlib.compressobj(wbits=zlib.MAX_WBITS) expected_body = zcomp.compress(b"file content\n") + zcomp.flush() assert expected_body == await resp.read() assert "application/octet-stream" == resp.headers["Content-Type"] assert resp.headers.get("Content-Encoding") == "deflate" await resp.release() async def test_static_file_huge_cancel(aiohttp_client, tmpdir) -> None: filename = "huge_data.unknown_mime_type" # fill 100MB file with tmpdir.join(filename).open("wb") as f: for i in range(1024 * 20): f.write((chr(i % 64 + 0x20) * 1024).encode()) task = None async def handler(request): nonlocal task task = request.task # reduce send buffer size tr = request.transport sock = tr.get_extra_info("socket") sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024) ret = web.FileResponse(pathlib.Path(str(tmpdir.join(filename)))) return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 task.cancel() await asyncio.sleep(0) data = b"" while True: try: data += await resp.content.read(1024) except aiohttp.ClientPayloadError: break assert len(data) < 1024 * 1024 * 20 async def test_static_file_huge_error(aiohttp_client, tmpdir) -> None: filename = "huge_data.unknown_mime_type" # fill 20MB file with tmpdir.join(filename).open("wb") as f: f.seek(20 * 1024 * 1024) f.write(b"1") async def handler(request): # reduce send buffer size tr = request.transport sock = tr.get_extra_info("socket") sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024) ret = web.FileResponse(pathlib.Path(str(tmpdir.join(filename)))) return ret app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 200 # raise an exception on server side resp.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_server.py0000644000175100001710000001147400000000000017460 0ustar00runnerdockerimport asyncio from unittest import mock import pytest from aiohttp import client, web async def test_simple_server(aiohttp_raw_server, aiohttp_client) -> None: async def handler(request): return web.Response(text=str(request.rel_url)) server = await aiohttp_raw_server(handler) cli = await aiohttp_client(server) resp = await cli.get("/path/to") assert resp.status == 200 txt = await resp.text() assert txt == "/path/to" async def test_raw_server_not_http_exception(aiohttp_raw_server, aiohttp_client): exc = RuntimeError("custom runtime error") async def handler(request): raise exc logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger, debug=False) cli = await aiohttp_client(server) resp = await cli.get("/path/to") assert resp.status == 500 assert resp.headers["Content-Type"].startswith("text/plain") txt = await resp.text() assert txt.startswith("500 Internal Server Error") assert "Traceback" not in txt logger.exception.assert_called_with("Error handling request", exc_info=exc) async def test_raw_server_handler_timeout(aiohttp_raw_server, aiohttp_client) -> None: exc = asyncio.TimeoutError("error") async def handler(request): raise exc logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger) cli = await aiohttp_client(server) resp = await cli.get("/path/to") assert resp.status == 504 await resp.text() logger.debug.assert_called_with("Request handler timed out.", exc_info=exc) async def test_raw_server_do_not_swallow_exceptions(aiohttp_raw_server, aiohttp_client): async def handler(request): raise asyncio.CancelledError() logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger) cli = await aiohttp_client(server) with pytest.raises(client.ServerDisconnectedError): await cli.get("/path/to") logger.debug.assert_called_with("Ignored premature client disconnection") async def test_raw_server_cancelled_in_write_eof(aiohttp_raw_server, aiohttp_client): async def handler(request): resp = web.Response(text=str(request.rel_url)) resp.write_eof = mock.Mock(side_effect=asyncio.CancelledError("error")) return resp logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger) cli = await aiohttp_client(server) resp = await cli.get("/path/to") with pytest.raises(client.ClientPayloadError): await resp.read() logger.debug.assert_called_with("Ignored premature client disconnection") async def test_raw_server_not_http_exception_debug(aiohttp_raw_server, aiohttp_client): exc = RuntimeError("custom runtime error") async def handler(request): raise exc logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger, debug=True) cli = await aiohttp_client(server) resp = await cli.get("/path/to") assert resp.status == 500 assert resp.headers["Content-Type"].startswith("text/plain") txt = await resp.text() assert "Traceback (most recent call last):\n" in txt logger.exception.assert_called_with("Error handling request", exc_info=exc) async def test_raw_server_html_exception(aiohttp_raw_server, aiohttp_client): exc = RuntimeError("custom runtime error") async def handler(request): raise exc logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger, debug=False) cli = await aiohttp_client(server) resp = await cli.get("/path/to", headers={"Accept": "text/html"}) assert resp.status == 500 assert resp.headers["Content-Type"].startswith("text/html") txt = await resp.text() assert txt == ( "500 Internal Server Error\n" "

    500 Internal Server Error

    \n" "Server got itself in trouble\n" "\n" ) logger.exception.assert_called_with("Error handling request", exc_info=exc) async def test_raw_server_html_exception_debug(aiohttp_raw_server, aiohttp_client): exc = RuntimeError("custom runtime error") async def handler(request): raise exc logger = mock.Mock() server = await aiohttp_raw_server(handler, logger=logger, debug=True) cli = await aiohttp_client(server) resp = await cli.get("/path/to", headers={"Accept": "text/html"}) assert resp.status == 500 assert resp.headers["Content-Type"].startswith("text/html") txt = await resp.text() assert txt.startswith( "500 Internal Server Error\n" "

    500 Internal Server Error

    \n" "

    Traceback:

    \n" "
    Traceback (most recent call last):\n"
        )
    
        logger.exception.assert_called_with("Error handling request", exc_info=exc)
    ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0
    aiohttp-3.8.1/tests/test_web_urldispatcher.py0000644000175100001710000003731400000000000021024 0ustar00runnerdockerimport asyncio
    import functools
    import os
    import pathlib
    import shutil
    import sys
    import tempfile
    from typing import Any
    from unittest import mock
    from unittest.mock import MagicMock
    
    import pytest
    import yarl
    
    from aiohttp import abc, web
    from aiohttp.web_urldispatcher import SystemRoute
    
    
    @pytest.fixture(scope="function")
    def tmp_dir_path(request):
        """
        Give a path for a temporary directory
    
        The directory is destroyed at the end of the test.
        """
        # Temporary directory.
        tmp_dir = tempfile.mkdtemp()
    
        def teardown():
            # Delete the whole directory:
            shutil.rmtree(tmp_dir)
    
        request.addfinalizer(teardown)
        return tmp_dir
    
    
    @pytest.mark.parametrize(
        "show_index,status,prefix,data",
        [
            pytest.param(False, 403, "/", None, id="index_forbidden"),
            pytest.param(
                True,
                200,
                "/",
                b"\n\nIndex of /.\n"
                b"\n\n

    Index of /.

    \n
    \n\n", id="index_root", ), pytest.param( True, 200, "/static", b"\n\nIndex of /.\n" b"\n\n

    Index of /.

    \n\n\n", id="index_static", ), ], ) async def test_access_root_of_static_handler( tmp_dir_path, aiohttp_client, show_index, status, prefix, data ) -> None: # Tests the operation of static file server. # Try to access the root of static file server, and make # sure that correct HTTP statuses are returned depending if we directory # index should be shown or not. # Put a file inside tmp_dir_path: my_file_path = os.path.join(tmp_dir_path, "my_file") with open(my_file_path, "w") as fw: fw.write("hello") my_dir_path = os.path.join(tmp_dir_path, "my_dir") os.mkdir(my_dir_path) my_file_path = os.path.join(my_dir_path, "my_file_in_dir") with open(my_file_path, "w") as fw: fw.write("world") app = web.Application() # Register global static route: app.router.add_static(prefix, tmp_dir_path, show_index=show_index) client = await aiohttp_client(app) # Request the root of the static directory. r = await client.get(prefix) assert r.status == status if data: assert r.headers["Content-Type"] == "text/html; charset=utf-8" read_ = await r.read() assert read_ == data async def test_follow_symlink(tmp_dir_path, aiohttp_client) -> None: # Tests the access to a symlink, in static folder data = "hello world" my_dir_path = os.path.join(tmp_dir_path, "my_dir") os.mkdir(my_dir_path) my_file_path = os.path.join(my_dir_path, "my_file_in_dir") with open(my_file_path, "w") as fw: fw.write(data) my_symlink_path = os.path.join(tmp_dir_path, "my_symlink") os.symlink(my_dir_path, my_symlink_path) app = web.Application() # Register global static route: app.router.add_static("/", tmp_dir_path, follow_symlinks=True) client = await aiohttp_client(app) # Request the root of the static directory. r = await client.get("/my_symlink/my_file_in_dir") assert r.status == 200 assert (await r.text()) == data @pytest.mark.parametrize( "dir_name,filename,data", [ ("", "test file.txt", "test text"), ("test dir name", "test dir file .txt", "test text file folder"), ], ) async def test_access_to_the_file_with_spaces( tmp_dir_path, aiohttp_client, dir_name, filename, data ): # Checks operation of static files with spaces my_dir_path = os.path.join(tmp_dir_path, dir_name) if dir_name: os.mkdir(my_dir_path) my_file_path = os.path.join(my_dir_path, filename) with open(my_file_path, "w") as fw: fw.write(data) app = web.Application() url = os.path.join("/", dir_name, filename) app.router.add_static("/", tmp_dir_path) client = await aiohttp_client(app) r = await client.get(url) assert r.status == 200 assert (await r.text()) == data await r.release() async def test_access_non_existing_resource(tmp_dir_path, aiohttp_client) -> None: # Tests accessing non-existing resource # Try to access a non-exiting resource and make sure that 404 HTTP status # returned. app = web.Application() # Register global static route: app.router.add_static("/", tmp_dir_path, show_index=True) client = await aiohttp_client(app) # Request the root of the static directory. r = await client.get("/non_existing_resource") assert r.status == 404 @pytest.mark.parametrize( "registered_path,request_url", [ ("/a:b", "/a:b"), ("/a@b", "/a@b"), ("/a:b", "/a%3Ab"), ], ) async def test_url_escaping(aiohttp_client, registered_path, request_url) -> None: # Tests accessing a resource with app = web.Application() async def handler(request): return web.Response() app.router.add_get(registered_path, handler) client = await aiohttp_client(app) r = await client.get(request_url) assert r.status == 200 async def test_handler_metadata_persistence() -> None: """Tests accessing metadata of a handler after registering it on the app router.""" app = web.Application() async def async_handler(request): """Doc""" return web.Response() def sync_handler(request): """Doc""" return web.Response() app.router.add_get("/async", async_handler) with pytest.warns(DeprecationWarning): app.router.add_get("/sync", sync_handler) for resource in app.router.resources(): for route in resource: assert route.handler.__doc__ == "Doc" async def test_unauthorized_folder_access(tmp_dir_path, aiohttp_client) -> None: # Tests the unauthorized access to a folder of static file server. # Try to list a folder content of static file server when server does not # have permissions to do so for the folder. my_dir_path = os.path.join(tmp_dir_path, "my_dir") os.mkdir(my_dir_path) app = web.Application() with mock.patch("pathlib.Path.__new__") as path_constructor: path = MagicMock() path.joinpath.return_value = path path.resolve.return_value = path path.iterdir.return_value.__iter__.side_effect = PermissionError() path_constructor.return_value = path # Register global static route: app.router.add_static("/", tmp_dir_path, show_index=True) client = await aiohttp_client(app) # Request the root of the static directory. r = await client.get("/my_dir") assert r.status == 403 async def test_access_symlink_loop(tmp_dir_path, aiohttp_client) -> None: # Tests the access to a looped symlink, which could not be resolved. my_dir_path = os.path.join(tmp_dir_path, "my_symlink") os.symlink(my_dir_path, my_dir_path) app = web.Application() # Register global static route: app.router.add_static("/", tmp_dir_path, show_index=True) client = await aiohttp_client(app) # Request the root of the static directory. r = await client.get("/my_symlink") assert r.status == 404 async def test_access_special_resource(tmp_dir_path, aiohttp_client) -> None: # Tests the access to a resource that is neither a file nor a directory. # Checks that if a special resource is accessed (f.e. named pipe or UNIX # domain socket) then 404 HTTP status returned. app = web.Application() with mock.patch("pathlib.Path.__new__") as path_constructor: special = MagicMock() special.is_dir.return_value = False special.is_file.return_value = False path = MagicMock() path.joinpath.side_effect = lambda p: (special if p == "special" else path) path.resolve.return_value = path special.resolve.return_value = special path_constructor.return_value = path # Register global static route: app.router.add_static("/", tmp_dir_path, show_index=True) client = await aiohttp_client(app) # Request the root of the static directory. r = await client.get("/special") assert r.status == 403 async def test_partially_applied_handler(aiohttp_client) -> None: app = web.Application() async def handler(data, request): return web.Response(body=data) if sys.version_info >= (3, 8): app.router.add_route("GET", "/", functools.partial(handler, b"hello")) else: with pytest.warns(DeprecationWarning): app.router.add_route("GET", "/", functools.partial(handler, b"hello")) client = await aiohttp_client(app) r = await client.get("/") data = await r.read() assert data == b"hello" async def test_static_head(tmp_path, aiohttp_client) -> None: # Test HEAD on static route my_file_path = tmp_path / "test.txt" with my_file_path.open("wb") as fw: fw.write(b"should_not_see_this\n") app = web.Application() app.router.add_static("/", str(tmp_path)) client = await aiohttp_client(app) r = await client.head("/test.txt") assert r.status == 200 # Check that there is no content sent (see #4809). This can't easily be # done with aiohttp_client because the buffering can consume the content. reader, writer = await asyncio.open_connection(client.host, client.port) writer.write(b"HEAD /test.txt HTTP/1.1\r\n") writer.write(b"Host: localhost\r\n") writer.write(b"Connection: close\r\n") writer.write(b"\r\n") while await reader.readline() != b"\r\n": pass content = await reader.read() writer.close() assert content == b"" def test_system_route() -> None: route = SystemRoute(web.HTTPCreated(reason="test")) with pytest.raises(RuntimeError): route.url_for() assert route.name is None assert route.resource is None assert "" == repr(route) assert 201 == route.status assert "test" == route.reason async def test_412_is_returned(aiohttp_client) -> None: class MyRouter(abc.AbstractRouter): async def resolve(self, request): raise web.HTTPPreconditionFailed() with pytest.warns(DeprecationWarning): app = web.Application(router=MyRouter()) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 412 async def test_allow_head(aiohttp_client) -> None: # Test allow_head on routes. app = web.Application() async def handler(_): return web.Response() app.router.add_get("/a", handler, name="a") app.router.add_get("/b", handler, allow_head=False, name="b") client = await aiohttp_client(app) r = await client.get("/a") assert r.status == 200 await r.release() r = await client.head("/a") assert r.status == 200 await r.release() r = await client.get("/b") assert r.status == 200 await r.release() r = await client.head("/b") assert r.status == 405 await r.release() @pytest.mark.parametrize( "path", [ "/a", "/{a}", ], ) def test_reuse_last_added_resource(path) -> None: # Test that adding a route with the same name and path of the last added # resource doesn't create a new resource. app = web.Application() async def handler(request): return web.Response() app.router.add_get(path, handler, name="a") app.router.add_post(path, handler, name="a") assert len(app.router.resources()) == 1 def test_resource_raw_match() -> None: app = web.Application() async def handler(request): return web.Response() route = app.router.add_get("/a", handler, name="a") assert route.resource.raw_match("/a") route = app.router.add_get("/{b}", handler, name="b") assert route.resource.raw_match("/{b}") resource = app.router.add_static("/static", ".") assert not resource.raw_match("/static") async def test_add_view(aiohttp_client) -> None: app = web.Application() class MyView(web.View): async def get(self): return web.Response() async def post(self): return web.Response() app.router.add_view("/a", MyView) client = await aiohttp_client(app) r = await client.get("/a") assert r.status == 200 await r.release() r = await client.post("/a") assert r.status == 200 await r.release() r = await client.put("/a") assert r.status == 405 await r.release() async def test_decorate_view(aiohttp_client) -> None: routes = web.RouteTableDef() @routes.view("/a") class MyView(web.View): async def get(self): return web.Response() async def post(self): return web.Response() app = web.Application() app.router.add_routes(routes) client = await aiohttp_client(app) r = await client.get("/a") assert r.status == 200 await r.release() r = await client.post("/a") assert r.status == 200 await r.release() r = await client.put("/a") assert r.status == 405 await r.release() async def test_web_view(aiohttp_client) -> None: app = web.Application() class MyView(web.View): async def get(self): return web.Response() async def post(self): return web.Response() app.router.add_routes([web.view("/a", MyView)]) client = await aiohttp_client(app) r = await client.get("/a") assert r.status == 200 await r.release() r = await client.post("/a") assert r.status == 200 await r.release() r = await client.put("/a") assert r.status == 405 await r.release() async def test_static_absolute_url(aiohttp_client, tmpdir) -> None: # requested url is an absolute name like # /static/\\machine_name\c$ or /static/D:\path # where the static dir is totally different app = web.Application() fname = tmpdir / "file.txt" fname.write_text("sample text", "ascii") here = pathlib.Path(__file__).parent app.router.add_static("/static", here) client = await aiohttp_client(app) resp = await client.get("/static/" + str(fname)) assert resp.status == 403 async def test_for_issue_5250(aiohttp_client: Any, tmp_path: Any) -> None: app = web.Application() app.router.add_static("/foo", tmp_path) async def get_foobar(request): return web.Response(body="success!") app.router.add_get("/foobar", get_foobar) client = await aiohttp_client(app) async with await client.get("/foobar") as resp: assert resp.status == 200 assert (await resp.text()) == "success!" @pytest.mark.xfail( raises=AssertionError, reason="Regression in v3.7: https://github.com/aio-libs/aiohttp/issues/5621", ) @pytest.mark.parametrize( ("route_definition", "urlencoded_path", "expected_http_resp_status"), ( ("/467,802,24834/hello", "/467%2C802%2C24834/hello", 200), ("/{user_ids:([0-9]+)(,([0-9]+))*}/hello", "/467%2C802%2C24834/hello", 200), ("/1%2C3/hello", "/1%2C3/hello", 404), ), ids=("urldecoded_route", "urldecoded_route_with_regex", "urlencoded_route"), ) async def test_decoded_url_match( aiohttp_client, route_definition, urlencoded_path, expected_http_resp_status, ) -> None: app = web.Application() async def handler(_): return web.Response() app.router.add_get(route_definition, handler) client = await aiohttp_client(app) r = await client.get(yarl.URL(urlencoded_path, encoded=True)) assert r.status == expected_http_resp_status await r.release() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_websocket.py0000644000175100001710000002716100000000000020140 0ustar00runnerdockerimport asyncio from unittest import mock import aiosignal import pytest from multidict import CIMultiDict from aiohttp import WSMessage, WSMsgType from aiohttp.streams import EofStream from aiohttp.test_utils import make_mocked_coro, make_mocked_request from aiohttp.web import HTTPBadRequest, WebSocketResponse from aiohttp.web_ws import WS_CLOSED_MESSAGE, WebSocketReady @pytest.fixture def app(loop): ret = mock.Mock() ret.loop = loop ret._debug = False ret.on_response_prepare = aiosignal.Signal(ret) ret.on_response_prepare.freeze() return ret @pytest.fixture def protocol(): ret = mock.Mock() ret.set_parser.return_value = ret return ret @pytest.fixture def make_request(app, protocol): def maker(method, path, headers=None, protocols=False): if headers is None: headers = CIMultiDict( { "HOST": "server.example.com", "UPGRADE": "websocket", "CONNECTION": "Upgrade", "SEC-WEBSOCKET-KEY": "dGhlIHNhbXBsZSBub25jZQ==", "ORIGIN": "http://example.com", "SEC-WEBSOCKET-VERSION": "13", } ) if protocols: headers["SEC-WEBSOCKET-PROTOCOL"] = "chat, superchat" return make_mocked_request( method, path, headers, app=app, protocol=protocol, loop=app.loop ) return maker async def test_nonstarted_ping() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.ping() async def test_nonstarted_pong() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.pong() async def test_nonstarted_send_str() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.send_str("string") async def test_nonstarted_send_bytes() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.send_bytes(b"bytes") async def test_nonstarted_send_json() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.send_json({"type": "json"}) async def test_nonstarted_close() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.close() async def test_nonstarted_receive_str() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.receive_str() async def test_nonstarted_receive_bytes() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.receive_bytes() async def test_nonstarted_receive_json() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.receive_json() async def test_receive_str_nonstring(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) async def receive(): return WSMessage(WSMsgType.BINARY, b"data", b"") ws.receive = receive with pytest.raises(TypeError): await ws.receive_str() async def test_receive_bytes_nonsbytes(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) async def receive(): return WSMessage(WSMsgType.TEXT, "data", b"") ws.receive = receive with pytest.raises(TypeError): await ws.receive_bytes() async def test_send_str_nonstring(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) with pytest.raises(TypeError): await ws.send_str(b"bytes") async def test_send_bytes_nonbytes(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) with pytest.raises(TypeError): await ws.send_bytes("string") async def test_send_json_nonjson(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) with pytest.raises(TypeError): await ws.send_json(set()) async def test_write_non_prepared() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.write(b"data") def test_websocket_ready() -> None: websocket_ready = WebSocketReady(True, "chat") assert websocket_ready.ok is True assert websocket_ready.protocol == "chat" def test_websocket_not_ready() -> None: websocket_ready = WebSocketReady(False, None) assert websocket_ready.ok is False assert websocket_ready.protocol is None def test_websocket_ready_unknown_protocol() -> None: websocket_ready = WebSocketReady(True, None) assert websocket_ready.ok is True assert websocket_ready.protocol is None def test_bool_websocket_ready() -> None: websocket_ready = WebSocketReady(True, None) assert bool(websocket_ready) is True def test_bool_websocket_not_ready() -> None: websocket_ready = WebSocketReady(False, None) assert bool(websocket_ready) is False def test_can_prepare_ok(make_request) -> None: req = make_request("GET", "/", protocols=True) ws = WebSocketResponse(protocols=("chat",)) assert WebSocketReady(True, "chat") == ws.can_prepare(req) def test_can_prepare_unknown_protocol(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() assert WebSocketReady(True, None) == ws.can_prepare(req) def test_can_prepare_without_upgrade(make_request) -> None: req = make_request("GET", "/", headers=CIMultiDict({})) ws = WebSocketResponse() assert WebSocketReady(False, None) == ws.can_prepare(req) async def test_can_prepare_started(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) with pytest.raises(RuntimeError) as ctx: ws.can_prepare(req) assert "Already started" in str(ctx.value) def test_closed_after_ctor() -> None: ws = WebSocketResponse() assert not ws.closed assert ws.close_code is None async def test_send_str_closed(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() with pytest.raises(ConnectionError): await ws.send_str("string") async def test_send_bytes_closed(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() with pytest.raises(ConnectionError): await ws.send_bytes(b"bytes") async def test_send_json_closed(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() with pytest.raises(ConnectionError): await ws.send_json({"type": "json"}) async def test_ping_closed(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() with pytest.raises(ConnectionError): await ws.ping() async def test_pong_closed(make_request, mocker) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() with pytest.raises(ConnectionError): await ws.pong() async def test_close_idempotent(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) assert await ws.close(code=1, message="message1") assert ws.closed assert not (await ws.close(code=2, message="message2")) async def test_prepare_post_method_ok(make_request) -> None: req = make_request("POST", "/") ws = WebSocketResponse() await ws.prepare(req) assert ws.prepared async def test_prepare_without_upgrade(make_request) -> None: req = make_request("GET", "/", headers=CIMultiDict({})) ws = WebSocketResponse() with pytest.raises(HTTPBadRequest): await ws.prepare(req) async def test_wait_closed_before_start() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.close() async def test_write_eof_not_started() -> None: ws = WebSocketResponse() with pytest.raises(RuntimeError): await ws.write_eof() async def test_write_eof_idempotent(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() await ws.write_eof() await ws.write_eof() await ws.write_eof() async def test_receive_eofstream_in_reader(make_request, loop) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader = mock.Mock() exc = EofStream() res = loop.create_future() res.set_exception(exc) ws._reader.read = make_mocked_coro(res) ws._payload_writer.drain = mock.Mock() ws._payload_writer.drain.return_value = loop.create_future() ws._payload_writer.drain.return_value.set_result(True) msg = await ws.receive() assert msg.type == WSMsgType.CLOSED assert ws.closed async def test_receive_timeouterror(make_request, loop) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader = mock.Mock() res = loop.create_future() res.set_exception(asyncio.TimeoutError()) ws._reader.read = make_mocked_coro(res) with pytest.raises(asyncio.TimeoutError): await ws.receive() async def test_multiple_receive_on_close_connection(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._reader.feed_data(WS_CLOSED_MESSAGE, 0) await ws.close() await ws.receive() await ws.receive() await ws.receive() await ws.receive() with pytest.raises(RuntimeError): await ws.receive() async def test_concurrent_receive(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) ws._waiting = True with pytest.raises(RuntimeError): await ws.receive() async def test_close_exc(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) exc = ValueError() ws._writer = mock.Mock() ws._writer.close.side_effect = exc await ws.close() assert ws.closed assert ws.exception() is exc ws._closed = False ws._writer.close.side_effect = asyncio.CancelledError() with pytest.raises(asyncio.CancelledError): await ws.close() async def test_prepare_twice_idempotent(make_request) -> None: req = make_request("GET", "/") ws = WebSocketResponse() impl1 = await ws.prepare(req) impl2 = await ws.prepare(req) assert impl1 is impl2 async def test_send_with_per_message_deflate(make_request, mocker) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws.prepare(req) writer_send = ws._writer.send = make_mocked_coro() await ws.send_str("string", compress=15) writer_send.assert_called_with("string", binary=False, compress=15) await ws.send_bytes(b"bytes", compress=0) writer_send.assert_called_with(b"bytes", binary=True, compress=0) await ws.send_json("[{}]", compress=9) writer_send.assert_called_with('"[{}]"', binary=False, compress=9) async def test_no_transfer_encoding_header(make_request, mocker) -> None: req = make_request("GET", "/") ws = WebSocketResponse() await ws._start(req) assert "Transfer-Encoding" not in ws.headers ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_web_websocket_functional.py0000644000175100001710000004727100000000000022366 0ustar00runnerdocker# HTTP websocket server functional tests import asyncio import pytest import aiohttp from aiohttp import web from aiohttp.http import WSCloseCode, WSMsgType async def test_websocket_can_prepare(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() if not ws.can_prepare(request): raise web.HTTPUpgradeRequired() return web.Response() app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") assert resp.status == 426 async def test_websocket_json(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() if not ws.can_prepare(request): return web.HTTPUpgradeRequired() await ws.prepare(request) msg = await ws.receive() msg_json = msg.json() answer = msg_json["test"] await ws.send_str(answer) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") expected_value = "value" payload = '{"test": "%s"}' % expected_value await ws.send_str(payload) resp = await ws.receive() assert resp.data == expected_value async def test_websocket_json_invalid_message(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) try: await ws.receive_json() except ValueError: await ws.send_str("ValueError was raised") else: raise Exception("No Exception") finally: await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") payload = "NOT A VALID JSON STRING" await ws.send_str(payload) data = await ws.receive_str() assert "ValueError was raised" in data async def test_websocket_send_json(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) data = await ws.receive_json() await ws.send_json(data) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") expected_value = "value" await ws.send_json({"test": expected_value}) data = await ws.receive_json() assert data["test"] == expected_value async def test_websocket_receive_json(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) data = await ws.receive_json() answer = data["test"] await ws.send_str(answer) await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") expected_value = "value" payload = '{"test": "%s"}' % expected_value await ws.send_str(payload) resp = await ws.receive() assert resp.data == expected_value async def test_send_recv_text(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_str() await ws.send_str(msg + "/answer") await ws.close() closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.send_str("ask") msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.TEXT assert "ask/answer" == msg.data msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "" assert ws.closed assert ws.close_code == WSCloseCode.OK await closed async def test_send_recv_bytes(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) msg = await ws.receive_bytes() await ws.send_bytes(msg + b"/answer") await ws.close() closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.send_bytes(b"ask") msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.BINARY assert b"ask/answer" == msg.data msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "" assert ws.closed assert ws.close_code == WSCloseCode.OK await closed async def test_send_recv_json(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) data = await ws.receive_json() await ws.send_json({"response": data["request"]}) await ws.close() closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.send_str('{"request": "test"}') msg = await ws.receive() data = msg.json() assert msg.type == aiohttp.WSMsgType.TEXT assert data["response"] == "test" msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "" await ws.close() await closed async def test_close_timeout(loop, aiohttp_client) -> None: aborted = loop.create_future() elapsed = 1e10 # something big async def handler(request): nonlocal elapsed ws = web.WebSocketResponse(timeout=0.1) await ws.prepare(request) assert "request" == (await ws.receive_str()) await ws.send_str("reply") begin = ws._loop.time() assert await ws.close() elapsed = ws._loop.time() - begin assert ws.close_code == WSCloseCode.ABNORMAL_CLOSURE assert isinstance(ws.exception(), asyncio.TimeoutError) aborted.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.send_str("request") assert "reply" == (await ws.receive_str()) # The server closes here. Then the client sends bogus messages with an # internval shorter than server-side close timeout, to make the server # hanging indefinitely. await asyncio.sleep(0.08) msg = await ws._reader.read() assert msg.type == WSMsgType.CLOSE await asyncio.sleep(0.08) assert await aborted assert elapsed < 0.25, "close() should have returned before " "at most 2x timeout." await ws.close() async def test_concurrent_close(loop, aiohttp_client) -> None: srv_ws = None async def handler(request): nonlocal srv_ws ws = srv_ws = web.WebSocketResponse(autoclose=False, protocols=("foo", "bar")) await ws.prepare(request) msg = await ws.receive() assert msg.type == WSMsgType.CLOSING msg = await ws.receive() assert msg.type == WSMsgType.CLOSING await asyncio.sleep(0) msg = await ws.receive() assert msg.type == WSMsgType.CLOSED return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoclose=False, protocols=("eggs", "bar")) await srv_ws.close(code=WSCloseCode.INVALID_TEXT) msg = await ws.receive() assert msg.type == WSMsgType.CLOSE await asyncio.sleep(0) msg = await ws.receive() assert msg.type == WSMsgType.CLOSED async def test_auto_pong_with_closing_by_peer(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive() msg = await ws.receive() assert msg.type == WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "exit message" closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoclose=False, autoping=False) await ws.ping() await ws.send_str("ask") msg = await ws.receive() assert msg.type == WSMsgType.PONG await ws.close(code=WSCloseCode.OK, message="exit message") await closed async def test_ping(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.ping("data") await ws.receive() closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) msg = await ws.receive() assert msg.type == WSMsgType.PING assert msg.data == b"data" await ws.pong() await ws.close() await closed async def aiohttp_client_ping(loop, aiohttp_client): closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) await ws.receive() closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) await ws.ping("data") msg = await ws.receive() assert msg.type == WSMsgType.PONG assert msg.data == b"data" await ws.pong() await ws.close() async def test_pong(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse(autoping=False) await ws.prepare(request) msg = await ws.receive() assert msg.type == WSMsgType.PING await ws.pong("data") msg = await ws.receive() assert msg.type == WSMsgType.CLOSE assert msg.data == WSCloseCode.OK assert msg.extra == "exit message" closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) await ws.ping("data") msg = await ws.receive() assert msg.type == WSMsgType.PONG assert msg.data == b"data" await ws.close(code=WSCloseCode.OK, message="exit message") await closed async def test_change_status(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() ws.set_status(200) assert 200 == ws.status await ws.prepare(request) assert 101 == ws.status await ws.close() closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) await ws.close() await closed await ws.close() async def test_handle_protocol(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse(protocols=("foo", "bar")) await ws.prepare(request) await ws.close() assert "bar" == ws.ws_protocol closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", protocols=("eggs", "bar")) await ws.close() await closed async def test_server_close_handshake(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse(protocols=("foo", "bar")) await ws.prepare(request) await ws.close() closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoclose=False, protocols=("eggs", "bar")) msg = await ws.receive() assert msg.type == WSMsgType.CLOSE await ws.close() await closed async def aiohttp_client_close_handshake(loop, aiohttp_client): closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse(autoclose=False, protocols=("foo", "bar")) await ws.prepare(request) msg = await ws.receive() assert msg.type == WSMsgType.CLOSE assert not ws.closed await ws.close() assert ws.closed assert ws.close_code == WSCloseCode.INVALID_TEXT msg = await ws.receive() assert msg.type == WSMsgType.CLOSED closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoclose=False, protocols=("eggs", "bar")) await ws.close(code=WSCloseCode.INVALID_TEXT) msg = await ws.receive() assert msg.type == WSMsgType.CLOSED await closed async def test_server_close_handshake_server_eats_client_messages(loop, aiohttp_client): closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse(protocols=("foo", "bar")) await ws.prepare(request) await ws.close() closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect( "/", autoclose=False, autoping=False, protocols=("eggs", "bar") ) msg = await ws.receive() assert msg.type == WSMsgType.CLOSE await ws.send_str("text") await ws.send_bytes(b"bytes") await ws.ping() await ws.close() await closed async def test_receive_timeout(loop, aiohttp_client) -> None: raised = False async def handler(request): ws = web.WebSocketResponse(receive_timeout=0.1) await ws.prepare(request) try: await ws.receive() except asyncio.TimeoutError: nonlocal raised raised = True await ws.close() return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.receive() await ws.close() assert raised async def test_custom_receive_timeout(loop, aiohttp_client) -> None: raised = False async def handler(request): ws = web.WebSocketResponse(receive_timeout=None) await ws.prepare(request) try: await ws.receive(0.1) except asyncio.TimeoutError: nonlocal raised raised = True await ws.close() return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.receive() await ws.close() assert raised async def test_heartbeat(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse(heartbeat=0.05) await ws.prepare(request) await ws.receive() await ws.close() return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.ping await ws.close() async def test_heartbeat_no_pong(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse(heartbeat=0.05) await ws.prepare(request) await ws.receive() return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/", autoping=False) msg = await ws.receive() assert msg.type == aiohttp.WSMsgType.ping await ws.close() async def test_server_ws_async_for(loop, aiohttp_server) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) async for msg in ws: assert msg.type == aiohttp.WSMsgType.TEXT s = msg.data await ws.send_str(s + "/answer") await ws.close() closed.set_result(1) return ws app = web.Application() app.router.add_route("GET", "/", handler) server = await aiohttp_server(app) async with aiohttp.ClientSession() as sm: async with sm.ws_connect(server.make_url("/")) as resp: items = ["q1", "q2", "q3"] for item in items: await resp.send_str(item) msg = await resp.receive() assert msg.type == aiohttp.WSMsgType.TEXT assert item + "/answer" == msg.data await resp.close() await closed async def test_closed_async_for(loop, aiohttp_client) -> None: closed = loop.create_future() async def handler(request): ws = web.WebSocketResponse() await ws.prepare(request) messages = [] async for msg in ws: messages.append(msg) if "stop" == msg.data: await ws.send_str("stopping") await ws.close() assert 1 == len(messages) assert messages[0].type == WSMsgType.TEXT assert messages[0].data == "stop" closed.set_result(None) return ws app = web.Application() app.router.add_get("/", handler) client = await aiohttp_client(app) ws = await client.ws_connect("/") await ws.send_str("stop") msg = await ws.receive() assert msg.type == WSMsgType.TEXT assert msg.data == "stopping" await ws.close() await closed async def test_websocket_disable_keepalive(loop, aiohttp_client) -> None: async def handler(request): ws = web.WebSocketResponse() if not ws.can_prepare(request): return web.Response(text="OK") assert request.protocol._keepalive await ws.prepare(request) assert not request.protocol._keepalive assert not request.protocol._keepalive_handle await ws.send_str("OK") await ws.close() return ws app = web.Application() app.router.add_route("GET", "/", handler) client = await aiohttp_client(app) resp = await client.get("/") txt = await resp.text() assert txt == "OK" ws = await client.ws_connect("/") data = await ws.receive_str() assert data == "OK" async def test_bug3380(loop, aiohttp_client) -> None: async def handle_null(request): return aiohttp.web.json_response({"err": None}) async def ws_handler(request): return web.Response(status=401) app = web.Application() app.router.add_route("GET", "/ws", ws_handler) app.router.add_route("GET", "/api/null", handle_null) client = await aiohttp_client(app) resp = await client.get("/api/null") assert (await resp.json()) == {"err": None} resp.close() with pytest.raises(aiohttp.WSServerHandshakeError): await client.ws_connect("/ws") resp = await client.get("/api/null", timeout=1) assert (await resp.json()) == {"err": None} resp.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_websocket_handshake.py0000644000175100001710000002013100000000000021277 0ustar00runnerdocker# Tests for http/websocket.py import base64 import os import pytest from aiohttp import web from aiohttp.test_utils import make_mocked_request def gen_ws_headers( protocols="", compress=0, extension_text="", server_notakeover=False, client_notakeover=False, ): key = base64.b64encode(os.urandom(16)).decode() hdrs = [ ("Upgrade", "websocket"), ("Connection", "upgrade"), ("Sec-Websocket-Version", "13"), ("Sec-Websocket-Key", key), ] if protocols: hdrs += [("Sec-Websocket-Protocol", protocols)] if compress: params = "permessage-deflate" if compress < 15: params += "; server_max_window_bits=" + str(compress) if server_notakeover: params += "; server_no_context_takeover" if client_notakeover: params += "; client_no_context_takeover" if extension_text: params += "; " + extension_text hdrs += [("Sec-Websocket-Extensions", params)] return hdrs, key async def test_no_upgrade() -> None: ws = web.WebSocketResponse() req = make_mocked_request("GET", "/") with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_no_connection() -> None: ws = web.WebSocketResponse() req = make_mocked_request( "GET", "/", headers={"Upgrade": "websocket", "Connection": "keep-alive"} ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_protocol_version_unset() -> None: ws = web.WebSocketResponse() req = make_mocked_request( "GET", "/", headers={"Upgrade": "websocket", "Connection": "upgrade"} ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_protocol_version_not_supported() -> None: ws = web.WebSocketResponse() req = make_mocked_request( "GET", "/", headers={ "Upgrade": "websocket", "Connection": "upgrade", "Sec-Websocket-Version": "1", }, ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_protocol_key_not_present() -> None: ws = web.WebSocketResponse() req = make_mocked_request( "GET", "/", headers={ "Upgrade": "websocket", "Connection": "upgrade", "Sec-Websocket-Version": "13", }, ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_protocol_key_invalid() -> None: ws = web.WebSocketResponse() req = make_mocked_request( "GET", "/", headers={ "Upgrade": "websocket", "Connection": "upgrade", "Sec-Websocket-Version": "13", "Sec-Websocket-Key": "123", }, ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_protocol_key_bad_size() -> None: ws = web.WebSocketResponse() sec_key = base64.b64encode(os.urandom(2)) val = sec_key.decode() req = make_mocked_request( "GET", "/", headers={ "Upgrade": "websocket", "Connection": "upgrade", "Sec-Websocket-Version": "13", "Sec-Websocket-Key": val, }, ) with pytest.raises(web.HTTPBadRequest): await ws.prepare(req) async def test_handshake_ok() -> None: hdrs, sec_key = gen_ws_headers() ws = web.WebSocketResponse() req = make_mocked_request("GET", "/", headers=hdrs) await ws.prepare(req) assert ws.ws_protocol is None async def test_handshake_protocol() -> None: # Tests if one protocol is returned by handshake proto = "chat" ws = web.WebSocketResponse(protocols={"chat"}) req = make_mocked_request("GET", "/", headers=gen_ws_headers(proto)[0]) await ws.prepare(req) assert ws.ws_protocol == proto async def test_handshake_protocol_agreement() -> None: # Tests if the right protocol is selected given multiple best_proto = "worse_proto" wanted_protos = ["best", "chat", "worse_proto"] server_protos = "worse_proto,chat" ws = web.WebSocketResponse(protocols=wanted_protos) req = make_mocked_request("GET", "/", headers=gen_ws_headers(server_protos)[0]) await ws.prepare(req) assert ws.ws_protocol == best_proto async def test_handshake_protocol_unsupported(caplog) -> None: # Tests if a protocol mismatch handshake warns and returns None proto = "chat" req = make_mocked_request("GET", "/", headers=gen_ws_headers("test")[0]) ws = web.WebSocketResponse(protocols=[proto]) await ws.prepare(req) assert ( caplog.records[-1].msg == "Client protocols %r don’t overlap server-known ones %r" ) assert ws.ws_protocol is None async def test_handshake_compress() -> None: hdrs, sec_key = gen_ws_headers(compress=15) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() await ws.prepare(req) assert ws.compress == 15 def test_handshake_compress_server_notakeover() -> None: hdrs, sec_key = gen_ws_headers(compress=15, server_notakeover=True) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert compress == 15 assert notakeover is True assert "Sec-Websocket-Extensions" in headers assert headers["Sec-Websocket-Extensions"] == ( "permessage-deflate; server_no_context_takeover" ) def test_handshake_compress_client_notakeover() -> None: hdrs, sec_key = gen_ws_headers(compress=15, client_notakeover=True) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" in headers assert headers["Sec-Websocket-Extensions"] == ("permessage-deflate"), hdrs assert compress == 15 def test_handshake_compress_wbits() -> None: hdrs, sec_key = gen_ws_headers(compress=9) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" in headers assert headers["Sec-Websocket-Extensions"] == ( "permessage-deflate; server_max_window_bits=9" ) assert compress == 9 def test_handshake_compress_wbits_error() -> None: hdrs, sec_key = gen_ws_headers(compress=6) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" not in headers assert compress == 0 def test_handshake_compress_bad_ext() -> None: hdrs, sec_key = gen_ws_headers(compress=15, extension_text="bad") req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" not in headers assert compress == 0 def test_handshake_compress_multi_ext_bad() -> None: hdrs, sec_key = gen_ws_headers( compress=15, extension_text="bad, permessage-deflate" ) req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" in headers assert headers["Sec-Websocket-Extensions"] == "permessage-deflate" def test_handshake_compress_multi_ext_wbits() -> None: hdrs, sec_key = gen_ws_headers(compress=6, extension_text=", permessage-deflate") req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Sec-Websocket-Extensions" in headers assert headers["Sec-Websocket-Extensions"] == "permessage-deflate" assert compress == 15 def test_handshake_no_transfer_encoding() -> None: hdrs, sec_key = gen_ws_headers() req = make_mocked_request("GET", "/", headers=hdrs) ws = web.WebSocketResponse() headers, _, compress, notakeover = ws._handshake(req) assert "Transfer-Encoding" not in headers ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_websocket_parser.py0000644000175100001710000004016200000000000020653 0ustar00runnerdockerimport pickle import random import struct import zlib from unittest import mock import pytest import aiohttp from aiohttp import http_websocket from aiohttp.http import WebSocketError, WSCloseCode, WSMessage, WSMsgType from aiohttp.http_websocket import ( _WS_DEFLATE_TRAILING, PACK_CLOSE_CODE, PACK_LEN1, PACK_LEN2, PACK_LEN3, WebSocketReader, _websocket_mask, ) def build_frame( message, opcode, use_mask=False, noheader=False, is_fin=True, compress=False ): # Send a frame over the websocket with message as its payload. if compress: compressobj = zlib.compressobj(wbits=-9) message = compressobj.compress(message) message = message + compressobj.flush(zlib.Z_SYNC_FLUSH) if message.endswith(_WS_DEFLATE_TRAILING): message = message[:-4] msg_length = len(message) if use_mask: # pragma: no cover mask_bit = 0x80 else: mask_bit = 0 if is_fin: header_first_byte = 0x80 | opcode else: header_first_byte = opcode if compress: header_first_byte |= 0x40 if msg_length < 126: header = PACK_LEN1(header_first_byte, msg_length | mask_bit) elif msg_length < (1 << 16): # pragma: no cover header = PACK_LEN2(header_first_byte, 126 | mask_bit, msg_length) else: header = PACK_LEN3(header_first_byte, 127 | mask_bit, msg_length) if use_mask: # pragma: no cover mask = random.randrange(0, 0xFFFFFFFF) mask = mask.to_bytes(4, "big") message = bytearray(message) _websocket_mask(mask, message) if noheader: return message else: return header + mask + message else: if noheader: return message else: return header + message def build_close_frame(code=1000, message=b"", noheader=False): # Close the websocket, sending the specified code and message. if isinstance(message, str): # pragma: no cover message = message.encode("utf-8") return build_frame( PACK_CLOSE_CODE(code) + message, opcode=WSMsgType.CLOSE, noheader=noheader ) @pytest.fixture() def out(loop): return aiohttp.DataQueue(loop) @pytest.fixture() def parser(out): return WebSocketReader(out, 4 * 1024 * 1024) def test_parse_frame(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b00000001, 0b00000001)) res = parser.parse_frame(b"1") fin, opcode, payload, compress = res[0] assert (0, 1, b"1", False) == (fin, opcode, payload, not not compress) def test_parse_frame_length0(parser) -> None: fin, opcode, payload, compress = parser.parse_frame( struct.pack("!BB", 0b00000001, 0b00000000) )[0] assert (0, 1, b"", False) == (fin, opcode, payload, not not compress) def test_parse_frame_length2(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b00000001, 126)) parser.parse_frame(struct.pack("!H", 4)) res = parser.parse_frame(b"1234") fin, opcode, payload, compress = res[0] assert (0, 1, b"1234", False) == (fin, opcode, payload, not not compress) def test_parse_frame_length4(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b00000001, 127)) parser.parse_frame(struct.pack("!Q", 4)) fin, opcode, payload, compress = parser.parse_frame(b"1234")[0] assert (0, 1, b"1234", False) == (fin, opcode, payload, not not compress) def test_parse_frame_mask(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b00000001, 0b10000001)) parser.parse_frame(b"0001") fin, opcode, payload, compress = parser.parse_frame(b"1")[0] assert (0, 1, b"\x01", False) == (fin, opcode, payload, not not compress) def test_parse_frame_header_reversed_bits(out, parser) -> None: with pytest.raises(WebSocketError): parser.parse_frame(struct.pack("!BB", 0b01100000, 0b00000000)) raise out.exception() def test_parse_frame_header_control_frame(out, parser) -> None: with pytest.raises(WebSocketError): parser.parse_frame(struct.pack("!BB", 0b00001000, 0b00000000)) raise out.exception() def _test_parse_frame_header_new_data_err(out, parser): with pytest.raises(WebSocketError): parser.parse_frame(struct.pack("!BB", 0b000000000, 0b00000000)) raise out.exception() def test_parse_frame_header_payload_size(out, parser) -> None: with pytest.raises(WebSocketError): parser.parse_frame(struct.pack("!BB", 0b10001000, 0b01111110)) raise out.exception() def test_ping_frame(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.PING, b"data", False)] parser.feed_data(b"") res = out._buffer[0] assert res == ((WSMsgType.PING, b"data", ""), 4) def test_pong_frame(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.PONG, b"data", False)] parser.feed_data(b"") res = out._buffer[0] assert res == ((WSMsgType.PONG, b"data", ""), 4) def test_close_frame(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.CLOSE, b"", False)] parser.feed_data(b"") res = out._buffer[0] assert res == ((WSMsgType.CLOSE, 0, ""), 0) def test_close_frame_info(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.CLOSE, b"0112345", False)] parser.feed_data(b"") res = out._buffer[0] assert res == (WSMessage(WSMsgType.CLOSE, 12337, "12345"), 0) def test_close_frame_invalid(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.CLOSE, b"1", False)] parser.feed_data(b"") assert isinstance(out.exception(), WebSocketError) assert out.exception().code == WSCloseCode.PROTOCOL_ERROR def test_close_frame_invalid_2(out, parser) -> None: data = build_close_frame(code=1) with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.PROTOCOL_ERROR def test_close_frame_unicode_err(parser) -> None: data = build_close_frame(code=1000, message=b"\xf4\x90\x80\x80") with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.INVALID_TEXT def test_unknown_frame(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.CONTINUATION, b"", False)] with pytest.raises(WebSocketError): parser.feed_data(b"") raise out.exception() def test_simple_text(out, parser) -> None: data = build_frame(b"text", WSMsgType.TEXT) parser._feed_data(data) res = out._buffer[0] assert res == ((WSMsgType.TEXT, "text", ""), 4) def test_simple_text_unicode_err(parser) -> None: data = build_frame(b"\xf4\x90\x80\x80", WSMsgType.TEXT) with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.INVALID_TEXT def test_simple_binary(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [(1, WSMsgType.BINARY, b"binary", False)] parser.feed_data(b"") res = out._buffer[0] assert res == ((WSMsgType.BINARY, b"binary", ""), 6) def test_fragmentation_header(out, parser) -> None: data = build_frame(b"a", WSMsgType.TEXT) parser._feed_data(data[:1]) parser._feed_data(data[1:]) res = out._buffer[0] assert res == (WSMessage(WSMsgType.TEXT, "a", ""), 1) def test_continuation(out, parser) -> None: data1 = build_frame(b"line1", WSMsgType.TEXT, is_fin=False) parser._feed_data(data1) data2 = build_frame(b"line2", WSMsgType.CONTINUATION) parser._feed_data(data2) res = out._buffer[0] assert res == (WSMessage(WSMsgType.TEXT, "line1line2", ""), 10) def test_continuation_with_ping(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (0, WSMsgType.PING, b"", False), (1, WSMsgType.CONTINUATION, b"line2", False), ] data1 = build_frame(b"line1", WSMsgType.TEXT, is_fin=False) parser._feed_data(data1) data2 = build_frame(b"", WSMsgType.PING) parser._feed_data(data2) data3 = build_frame(b"line2", WSMsgType.CONTINUATION) parser._feed_data(data3) res = out._buffer[0] assert res == (WSMessage(WSMsgType.PING, b"", ""), 0) res = out._buffer[1] assert res == (WSMessage(WSMsgType.TEXT, "line1line2", ""), 10) def test_continuation_err(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (1, WSMsgType.TEXT, b"line2", False), ] with pytest.raises(WebSocketError): parser._feed_data(b"") def test_continuation_with_close(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (0, WSMsgType.CLOSE, build_close_frame(1002, b"test", noheader=True), False), (1, WSMsgType.CONTINUATION, b"line2", False), ] parser.feed_data(b"") res = out._buffer[0] assert res, (WSMessage(WSMsgType.CLOSE, 1002, "test"), 0) res = out._buffer[1] assert res == (WSMessage(WSMsgType.TEXT, "line1line2", ""), 10) def test_continuation_with_close_unicode_err(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), ( 0, WSMsgType.CLOSE, build_close_frame(1000, b"\xf4\x90\x80\x80", noheader=True), False, ), (1, WSMsgType.CONTINUATION, b"line2", False), ] with pytest.raises(WebSocketError) as ctx: parser._feed_data(b"") assert ctx.value.code == WSCloseCode.INVALID_TEXT def test_continuation_with_close_bad_code(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (0, WSMsgType.CLOSE, build_close_frame(1, b"test", noheader=True), False), (1, WSMsgType.CONTINUATION, b"line2", False), ] with pytest.raises(WebSocketError) as ctx: parser._feed_data(b"") assert ctx.value.code == WSCloseCode.PROTOCOL_ERROR def test_continuation_with_close_bad_payload(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (0, WSMsgType.CLOSE, b"1", False), (1, WSMsgType.CONTINUATION, b"line2", False), ] with pytest.raises(WebSocketError) as ctx: parser._feed_data(b"") assert ctx.value.code, WSCloseCode.PROTOCOL_ERROR def test_continuation_with_close_empty(out, parser) -> None: parser.parse_frame = mock.Mock() parser.parse_frame.return_value = [ (0, WSMsgType.TEXT, b"line1", False), (0, WSMsgType.CLOSE, b"", False), (1, WSMsgType.CONTINUATION, b"line2", False), ] parser.feed_data(b"") res = out._buffer[0] assert res, (WSMessage(WSMsgType.CLOSE, 0, ""), 0) res = out._buffer[1] assert res == (WSMessage(WSMsgType.TEXT, "line1line2", ""), 10) websocket_mask_data = b"some very long data for masking by websocket" websocket_mask_mask = b"1234" websocket_mask_masked = ( b"B]^Q\x11DVFH\x12_[_U\x13PPFR\x14W]A\x14\\S@_X" b"\\T\x14SK\x13CTP@[RYV@" ) def test_websocket_mask_python() -> None: message = bytearray(websocket_mask_data) http_websocket._websocket_mask_python(websocket_mask_mask, message) assert message == websocket_mask_masked @pytest.mark.skipif( not hasattr(http_websocket, "_websocket_mask_cython"), reason="Requires Cython" ) def test_websocket_mask_cython() -> None: message = bytearray(websocket_mask_data) http_websocket._websocket_mask_cython(websocket_mask_mask, message) assert message == websocket_mask_masked def test_websocket_mask_python_empty() -> None: message = bytearray() http_websocket._websocket_mask_python(websocket_mask_mask, message) assert message == bytearray() @pytest.mark.skipif( not hasattr(http_websocket, "_websocket_mask_cython"), reason="Requires Cython" ) def test_websocket_mask_cython_empty() -> None: message = bytearray() http_websocket._websocket_mask_cython(websocket_mask_mask, message) assert message == bytearray() def test_msgtype_aliases() -> None: assert aiohttp.WSMsgType.TEXT == aiohttp.WSMsgType.text assert aiohttp.WSMsgType.BINARY == aiohttp.WSMsgType.binary assert aiohttp.WSMsgType.PING == aiohttp.WSMsgType.ping assert aiohttp.WSMsgType.PONG == aiohttp.WSMsgType.pong assert aiohttp.WSMsgType.CLOSE == aiohttp.WSMsgType.close assert aiohttp.WSMsgType.CLOSED == aiohttp.WSMsgType.closed assert aiohttp.WSMsgType.ERROR == aiohttp.WSMsgType.error def test_parse_compress_frame_single(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b11000001, 0b00000001)) res = parser.parse_frame(b"1") fin, opcode, payload, compress = res[0] assert (1, 1, b"1", True) == (fin, opcode, payload, not not compress) def test_parse_compress_frame_multi(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b01000001, 126)) parser.parse_frame(struct.pack("!H", 4)) res = parser.parse_frame(b"1234") fin, opcode, payload, compress = res[0] assert (0, 1, b"1234", True) == (fin, opcode, payload, not not compress) parser.parse_frame(struct.pack("!BB", 0b10000001, 126)) parser.parse_frame(struct.pack("!H", 4)) res = parser.parse_frame(b"1234") fin, opcode, payload, compress = res[0] assert (1, 1, b"1234", True) == (fin, opcode, payload, not not compress) parser.parse_frame(struct.pack("!BB", 0b10000001, 126)) parser.parse_frame(struct.pack("!H", 4)) res = parser.parse_frame(b"1234") fin, opcode, payload, compress = res[0] assert (1, 1, b"1234", False) == (fin, opcode, payload, not not compress) def test_parse_compress_error_frame(parser) -> None: parser.parse_frame(struct.pack("!BB", 0b01000001, 0b00000001)) parser.parse_frame(b"1") with pytest.raises(WebSocketError) as ctx: parser.parse_frame(struct.pack("!BB", 0b11000001, 0b00000001)) parser.parse_frame(b"1") assert ctx.value.code == WSCloseCode.PROTOCOL_ERROR def test_parse_no_compress_frame_single() -> None: parser_no_compress = WebSocketReader(out, 0, compress=False) with pytest.raises(WebSocketError) as ctx: parser_no_compress.parse_frame(struct.pack("!BB", 0b11000001, 0b00000001)) parser_no_compress.parse_frame(b"1") assert ctx.value.code == WSCloseCode.PROTOCOL_ERROR def test_msg_too_large(out) -> None: parser = WebSocketReader(out, 256, compress=False) data = build_frame(b"text" * 256, WSMsgType.TEXT) with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.MESSAGE_TOO_BIG def test_msg_too_large_not_fin(out) -> None: parser = WebSocketReader(out, 256, compress=False) data = build_frame(b"text" * 256, WSMsgType.TEXT, is_fin=False) with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.MESSAGE_TOO_BIG def test_compressed_msg_too_large(out) -> None: parser = WebSocketReader(out, 256, compress=True) data = build_frame(b"aaa" * 256, WSMsgType.TEXT, compress=True) with pytest.raises(WebSocketError) as ctx: parser._feed_data(data) assert ctx.value.code == WSCloseCode.MESSAGE_TOO_BIG class TestWebSocketError: def test_ctor(self) -> None: err = WebSocketError(WSCloseCode.PROTOCOL_ERROR, "Something invalid") assert err.code == WSCloseCode.PROTOCOL_ERROR assert str(err) == "Something invalid" def test_pickle(self) -> None: err = WebSocketError(WSCloseCode.PROTOCOL_ERROR, "Something invalid") err.foo = "bar" for proto in range(pickle.HIGHEST_PROTOCOL + 1): pickled = pickle.dumps(err, proto) err2 = pickle.loads(pickled) assert err2.code == WSCloseCode.PROTOCOL_ERROR assert str(err2) == "Something invalid" assert err2.foo == "bar" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_websocket_writer.py0000644000175100001710000000643400000000000020677 0ustar00runnerdockerimport random from unittest import mock import pytest from aiohttp.http import WebSocketWriter from aiohttp.test_utils import make_mocked_coro @pytest.fixture def protocol(): ret = mock.Mock() ret._drain_helper = make_mocked_coro() return ret @pytest.fixture def transport(): ret = mock.Mock() ret.is_closing.return_value = False return ret @pytest.fixture def writer(protocol, transport): return WebSocketWriter(protocol, transport, use_mask=False) async def test_pong(writer) -> None: await writer.pong() writer.transport.write.assert_called_with(b"\x8a\x00") async def test_ping(writer) -> None: await writer.ping() writer.transport.write.assert_called_with(b"\x89\x00") async def test_send_text(writer) -> None: await writer.send(b"text") writer.transport.write.assert_called_with(b"\x81\x04text") async def test_send_binary(writer) -> None: await writer.send("binary", True) writer.transport.write.assert_called_with(b"\x82\x06binary") async def test_send_binary_long(writer) -> None: await writer.send(b"b" * 127, True) assert writer.transport.write.call_args[0][0].startswith(b"\x82~\x00\x7fb") async def test_send_binary_very_long(writer) -> None: await writer.send(b"b" * 65537, True) assert ( writer.transport.write.call_args_list[0][0][0] == b"\x82\x7f\x00\x00\x00\x00\x00\x01\x00\x01" ) assert writer.transport.write.call_args_list[1][0][0] == b"b" * 65537 async def test_close(writer) -> None: await writer.close(1001, "msg") writer.transport.write.assert_called_with(b"\x88\x05\x03\xe9msg") await writer.close(1001, b"msg") writer.transport.write.assert_called_with(b"\x88\x05\x03\xe9msg") # Test that Service Restart close code is also supported await writer.close(1012, b"msg") writer.transport.write.assert_called_with(b"\x88\x05\x03\xf4msg") async def test_send_text_masked(protocol, transport) -> None: writer = WebSocketWriter( protocol, transport, use_mask=True, random=random.Random(123) ) await writer.send(b"text") writer.transport.write.assert_called_with(b"\x81\x84\rg\xb3fy\x02\xcb\x12") async def test_send_compress_text(protocol, transport) -> None: writer = WebSocketWriter(protocol, transport, compress=15) await writer.send(b"text") writer.transport.write.assert_called_with(b"\xc1\x06*I\xad(\x01\x00") await writer.send(b"text") writer.transport.write.assert_called_with(b"\xc1\x05*\x01b\x00\x00") async def test_send_compress_text_notakeover(protocol, transport) -> None: writer = WebSocketWriter(protocol, transport, compress=15, notakeover=True) await writer.send(b"text") writer.transport.write.assert_called_with(b"\xc1\x06*I\xad(\x01\x00") await writer.send(b"text") writer.transport.write.assert_called_with(b"\xc1\x06*I\xad(\x01\x00") async def test_send_compress_text_per_message(protocol, transport) -> None: writer = WebSocketWriter(protocol, transport) await writer.send(b"text", compress=15) writer.transport.write.assert_called_with(b"\xc1\x06*I\xad(\x01\x00") await writer.send(b"text") writer.transport.write.assert_called_with(b"\x81\x04text") await writer.send(b"text", compress=15) writer.transport.write.assert_called_with(b"\xc1\x06*I\xad(\x01\x00") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920300.0 aiohttp-3.8.1/tests/test_worker.py0000644000175100001710000001735400000000000016631 0ustar00runnerdocker# Tests for aiohttp/worker.py import asyncio import os import socket import ssl from unittest import mock import pytest from aiohttp import web base_worker = pytest.importorskip("aiohttp.worker") try: import uvloop except ImportError: uvloop = None WRONG_LOG_FORMAT = '%a "%{Referrer}i" %(h)s %(l)s %s' ACCEPTABLE_LOG_FORMAT = '%a "%{Referrer}i" %s' # tokio event loop does not allow to override attributes def skip_if_no_dict(loop): if not hasattr(loop, "__dict__"): pytest.skip("can not override loop attributes") class BaseTestWorker: def __init__(self): self.servers = {} self.exit_code = 0 self._notify_waiter = None self.cfg = mock.Mock() self.cfg.graceful_timeout = 100 self.pid = "pid" self.wsgi = web.Application() class AsyncioWorker(BaseTestWorker, base_worker.GunicornWebWorker): # type: ignore pass PARAMS = [AsyncioWorker] if uvloop is not None: class UvloopWorker( BaseTestWorker, base_worker.GunicornUVLoopWebWorker # type: ignore ): pass PARAMS.append(UvloopWorker) @pytest.fixture(params=PARAMS) def worker(request, loop): asyncio.set_event_loop(loop) ret = request.param() ret.notify = mock.Mock() return ret def test_init_process(worker) -> None: with mock.patch("aiohttp.worker.asyncio") as m_asyncio: try: worker.init_process() except TypeError: pass assert m_asyncio.get_event_loop.return_value.close.called assert m_asyncio.new_event_loop.called assert m_asyncio.set_event_loop.called def test_run(worker, loop) -> None: worker.log = mock.Mock() worker.cfg = mock.Mock() worker.cfg.access_log_format = ACCEPTABLE_LOG_FORMAT worker.cfg.is_ssl = False worker.sockets = [] worker.loop = loop with pytest.raises(SystemExit): worker.run() worker.log.exception.assert_not_called() assert loop.is_closed() def test_run_async_factory(worker, loop) -> None: worker.log = mock.Mock() worker.cfg = mock.Mock() worker.cfg.access_log_format = ACCEPTABLE_LOG_FORMAT worker.cfg.is_ssl = False worker.sockets = [] app = worker.wsgi async def make_app(): return app worker.wsgi = make_app worker.loop = loop worker.alive = False with pytest.raises(SystemExit): worker.run() worker.log.exception.assert_not_called() assert loop.is_closed() def test_run_not_app(worker, loop) -> None: worker.log = mock.Mock() worker.cfg = mock.Mock() worker.cfg.access_log_format = ACCEPTABLE_LOG_FORMAT worker.loop = loop worker.wsgi = "not-app" worker.alive = False with pytest.raises(SystemExit): worker.run() worker.log.exception.assert_called_with("Exception in gunicorn worker") assert loop.is_closed() def test_handle_quit(worker, loop) -> None: worker.loop = mock.Mock() worker.handle_quit(object(), object()) assert not worker.alive assert worker.exit_code == 0 worker.loop.call_later.asset_called_with(0.1, worker._notify_waiter_done) def test_handle_abort(worker) -> None: with mock.patch("aiohttp.worker.sys") as m_sys: worker.handle_abort(object(), object()) assert not worker.alive assert worker.exit_code == 1 m_sys.exit.assert_called_with(1) def test__wait_next_notify(worker) -> None: worker.loop = mock.Mock() worker._notify_waiter_done = mock.Mock() fut = worker._wait_next_notify() assert worker._notify_waiter == fut worker.loop.call_later.assert_called_with(1.0, worker._notify_waiter_done, fut) def test__notify_waiter_done(worker) -> None: worker._notify_waiter = None worker._notify_waiter_done() assert worker._notify_waiter is None waiter = worker._notify_waiter = mock.Mock() worker._notify_waiter.done.return_value = False worker._notify_waiter_done() assert worker._notify_waiter is None waiter.set_result.assert_called_with(True) def test__notify_waiter_done_explicit_waiter(worker) -> None: worker._notify_waiter = None assert worker._notify_waiter is None waiter = worker._notify_waiter = mock.Mock() waiter.done.return_value = False waiter2 = worker._notify_waiter = mock.Mock() worker._notify_waiter_done(waiter) assert worker._notify_waiter is waiter2 waiter.set_result.assert_called_with(True) assert not waiter2.set_result.called def test_init_signals(worker) -> None: worker.loop = mock.Mock() worker.init_signals() assert worker.loop.add_signal_handler.called @pytest.mark.parametrize( "source,result", [ (ACCEPTABLE_LOG_FORMAT, ACCEPTABLE_LOG_FORMAT), ( AsyncioWorker.DEFAULT_GUNICORN_LOG_FORMAT, AsyncioWorker.DEFAULT_AIOHTTP_LOG_FORMAT, ), ], ) def test__get_valid_log_format_ok(worker, source, result) -> None: assert result == worker._get_valid_log_format(source) def test__get_valid_log_format_exc(worker) -> None: with pytest.raises(ValueError) as exc: worker._get_valid_log_format(WRONG_LOG_FORMAT) assert "%(name)s" in str(exc.value) async def test__run_ok_parent_changed(worker, loop, aiohttp_unused_port) -> None: skip_if_no_dict(loop) worker.ppid = 0 worker.alive = True sock = socket.socket() addr = ("localhost", aiohttp_unused_port()) sock.bind(addr) worker.sockets = [sock] worker.log = mock.Mock() worker.loop = loop worker.cfg.access_log_format = ACCEPTABLE_LOG_FORMAT worker.cfg.max_requests = 0 worker.cfg.is_ssl = False await worker._run() worker.notify.assert_called_with() worker.log.info.assert_called_with("Parent changed, shutting down: %s", worker) async def test__run_exc(worker, loop, aiohttp_unused_port) -> None: skip_if_no_dict(loop) worker.ppid = os.getppid() worker.alive = True sock = socket.socket() addr = ("localhost", aiohttp_unused_port()) sock.bind(addr) worker.sockets = [sock] worker.log = mock.Mock() worker.loop = loop worker.cfg.access_log_format = ACCEPTABLE_LOG_FORMAT worker.cfg.max_requests = 0 worker.cfg.is_ssl = False def raiser(): waiter = worker._notify_waiter worker.alive = False waiter.set_exception(RuntimeError()) loop.call_later(0.1, raiser) await worker._run() worker.notify.assert_called_with() def test__create_ssl_context_without_certs_and_ciphers( worker, tls_certificate_pem_path, ) -> None: worker.cfg.ssl_version = ssl.PROTOCOL_TLS_CLIENT worker.cfg.cert_reqs = ssl.CERT_OPTIONAL worker.cfg.certfile = tls_certificate_pem_path worker.cfg.keyfile = tls_certificate_pem_path worker.cfg.ca_certs = None worker.cfg.ciphers = None ctx = worker._create_ssl_context(worker.cfg) assert isinstance(ctx, ssl.SSLContext) def test__create_ssl_context_with_ciphers( worker, tls_certificate_pem_path, ) -> None: worker.cfg.ssl_version = ssl.PROTOCOL_TLS_CLIENT worker.cfg.cert_reqs = ssl.CERT_OPTIONAL worker.cfg.certfile = tls_certificate_pem_path worker.cfg.keyfile = tls_certificate_pem_path worker.cfg.ca_certs = None worker.cfg.ciphers = "3DES PSK" ctx = worker._create_ssl_context(worker.cfg) assert isinstance(ctx, ssl.SSLContext) def test__create_ssl_context_with_ca_certs( worker, tls_ca_certificate_pem_path, tls_certificate_pem_path, ) -> None: worker.cfg.ssl_version = ssl.PROTOCOL_TLS_CLIENT worker.cfg.cert_reqs = ssl.CERT_OPTIONAL worker.cfg.certfile = tls_certificate_pem_path worker.cfg.keyfile = tls_certificate_pem_path worker.cfg.ca_certs = tls_ca_certificate_pem_path worker.cfg.ciphers = None ctx = worker._create_ssl_context(worker.cfg) assert isinstance(ctx, ssl.SSLContext) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920322.9864511 aiohttp-3.8.1/vendor/0000755000175100001710000000000000000000000014030 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1636920323.038452 aiohttp-3.8.1/vendor/llhttp/0000755000175100001710000000000000000000000015337 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/.dockerignore0000644000175100001710000000007400000000000020014 0ustar00runnerdocker* !package.json !package-lock.json !tsconfig.json !bin !src ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/.eslintrc.js0000644000175100001710000000070700000000000017602 0ustar00runnerdockermodule.exports = { 'env': { 'browser': false, 'commonjs': true, 'es6': true, 'node': true }, 'extends': 'eslint:recommended', 'rules': { 'max-len': [ 2, { 'code': 80, 'ignoreComments': true } ], 'indent': [ 'error', 2 ], 'linebreak-style': [ 'error', 'unix' ], 'quotes': [ 'error', 'single' ], 'semi': [ 'error', 'always' ] } }; ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/.git0000644000175100001710000000005100000000000016117 0ustar00runnerdockergitdir: ../../.git/modules/vendor/llhttp ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920322.9864511 aiohttp-3.8.1/vendor/llhttp/.github/0000755000175100001710000000000000000000000016677 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1636920323.038452 aiohttp-3.8.1/vendor/llhttp/.github/workflows/0000755000175100001710000000000000000000000020734 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/.github/workflows/ci.yaml0000644000175100001710000000573700000000000022227 0ustar00runnerdockername: CI on: [push, pull_request] env: CI: true jobs: build: name: Build libllhttp.a runs-on: ${{ matrix.os }} strategy: matrix: os: - macos-latest - ubuntu-latest - windows-latest steps: - name: Install clang for Windows if: runner.os == 'Windows' run: | Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh') scoop install llvm --global # Scoop modifies the PATH so we make the modified PATH global. echo $env:PATH >> $env:GITHUB_PATH - name: Fetch code uses: actions/checkout@v2 with: fetch-depth: 1 # Skip macOS & Windows, cache there is slower - name: Restore node_modules cache for Linux uses: actions/cache@v1 if: runner.os == 'Linux' with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: Install dependencies run: npm install --ignore-scripts - name: Build libllhttp.a shell: bash run: | make build/libllhttp.a test: name: Run tests runs-on: ${{ matrix.os }} strategy: matrix: os: - macos-latest - ubuntu-latest - windows-latest steps: - name: Install clang for Windows if: runner.os == 'Windows' run: | Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh') scoop install llvm --global # Scoop modifies the PATH so we make the modified PATH global. echo $env:PATH >> $env:GITHUB_PATH - name: Fetch code uses: actions/checkout@v2 with: fetch-depth: 1 # Skip macOS & Windows, cache there is slower - name: Restore node_modules cache for Linux uses: actions/cache@v1 if: runner.os == 'Linux' with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: Install dependencies run: npm install --ignore-scripts # Custom script, because progress looks not good in CI - name: Run tests env: CFLAGS: -O0 run: npx mocha --timeout 30000 -r ts-node/register/type-check test/*-test.ts lint: name: Run TSLint runs-on: ubuntu-latest steps: - name: Fetch code uses: actions/checkout@v2 with: fetch-depth: 1 - name: Restore node_modules cache uses: actions/cache@v1 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: Install dependencies run: npm install --ignore-scripts - name: Run lint command run: npm run lint ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/.gitignore0000644000175100001710000000007300000000000017327 0ustar00runnerdockernode_modules/ npm-debug.log test/tmp/ lib/ build/ release/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/CMakeLists.txt0000644000175100001710000000216300000000000020101 0ustar00runnerdockercmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0069 NEW) project(llhttp C) set(CMAKE_C_STANDARD 99) # # Options # # Generic option option(BUILD_SHARED_LIBS "Build shared libraries (.dll/.so) instead of static ones (.lib/.a)" OFF) # Source code set(LLHTTP_SOURCES src/llhttp.c src/http.c src/api.c ) set(LLHTTP_HEADERS include/llhttp.h ) add_library(llhttp) add_library(llhttp::llhttp ALIAS llhttp) target_sources(llhttp PRIVATE ${LLHTTP_SOURCES} ${LLHTTP_HEADERS}) # On windows with Visual Studio, add a debug postfix so that release # and debug libraries can coexist. if(MSVC) set(CMAKE_DEBUG_POSTFIX "d") endif() target_include_directories(llhttp PUBLIC $ $ ) set_target_properties(llhttp PROPERTIES PUBLIC_HEADER ${LLHTTP_HEADERS}) install(TARGETS llhttp EXPORT llhttp ARCHIVE DESTINATION lib PUBLIC_HEADER DESTINATION include/ ) # This is required to work with FetchContent install(EXPORT llhttp FILE llhttp-config.cmake NAMESPACE llhttp:: DESTINATION lib/cmake/llhttp) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/CNAME0000644000175100001710000000001200000000000016076 0ustar00runnerdockerllhttp.org././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/CODE_OF_CONDUCT.md0000644000175100001710000000031300000000000020133 0ustar00runnerdocker# Code of Conduct * [Node.js Code of Conduct](https://github.com/nodejs/admin/blob/main/CODE_OF_CONDUCT.md) * [Node.js Moderation Policy](https://github.com/nodejs/admin/blob/main/Moderation-Policy.md) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/Dockerfile0000644000175100001710000000103400000000000017327 0ustar00runnerdockerFROM node:14.16.0-buster ARG UID=1000 ARG GID=1000 ARG WASI_SDK_VERSION_MAJOR=12 ARG WASI_SDK_VERSION_MINOR=0 ENV WASI_ROOT=/home/node/wasi-sdk-12.0 RUN wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VERSION_MAJOR}/wasi-sdk-${WASI_SDK_VERSION_MAJOR}.${WASI_SDK_VERSION_MINOR}-linux.tar.gz -P /tmp RUN tar xvf /tmp/wasi-sdk-${WASI_SDK_VERSION_MAJOR}.${WASI_SDK_VERSION_MINOR}-linux.tar.gz --directory /home/node RUN mkdir /home/node/llhttp WORKDIR /home/node/llhttp COPY . . RUN npm ci USER node ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/LICENSE-MIT0000644000175100001710000000212100000000000016767 0ustar00runnerdockerThis software is licensed under the MIT License. Copyright Fedor Indutny, 2018. 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. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/Makefile0000644000175100001710000000350200000000000016777 0ustar00runnerdockerCLANG ?= clang CFLAGS ?= OS ?= CFLAGS += -Os -g3 -Wall -Wextra -Wno-unused-parameter ifneq ($(OS),Windows_NT) # NOTE: clang on windows does not support fPIC CFLAGS += -fPIC endif INCLUDES += -Ibuild/ INSTALL ?= install PREFIX ?= /usr/local LIBDIR = $(PREFIX)/lib INCLUDEDIR = $(PREFIX)/include all: build/libllhttp.a build/libllhttp.so clean: rm -rf release/ rm -rf build/ build/libllhttp.so: build/c/llhttp.o build/native/api.o \ build/native/http.o $(CLANG) -shared $^ -o $@ build/libllhttp.a: build/c/llhttp.o build/native/api.o \ build/native/http.o $(AR) rcs $@ build/c/llhttp.o build/native/api.o build/native/http.o build/c/llhttp.o: build/c/llhttp.c $(CLANG) $(CFLAGS) $(INCLUDES) -c $< -o $@ build/native/%.o: src/native/%.c build/llhttp.h src/native/api.h \ build/native $(CLANG) $(CFLAGS) $(INCLUDES) -c $< -o $@ build/llhttp.h: generate build/c/llhttp.c: generate build/native: mkdir -p build/native release: generate mkdir -p release/src mkdir -p release/include cp -rf build/llhttp.h release/include/ cp -rf build/c/llhttp.c release/src/ cp -rf src/native/*.c release/src/ cp -rf src/llhttp.gyp release/ cp -rf src/common.gypi release/ cp -rf CMakeLists.txt release/ cp -rf README.md release/ cp -rf LICENSE-MIT release/ postversion: release git push git checkout release -- cp -rf release/* ./ rm -rf release git add include src *.gyp *.gypi CMakeLists.txt README.md LICENSE-MIT git commit -a -m "release: $(TAG)" git tag "release/v$(TAG)" git push && git push --tags git checkout main generate: npx ts-node bin/generate.ts install: build/libllhttp.a build/libllhttp.so $(INSTALL) build/llhttp.h $(DESTDIR)$(INCLUDEDIR)/llhttp.h $(INSTALL) build/libllhttp.a $(DESTDIR)$(LIBDIR)/libllhttp.a $(INSTALL) build/libllhttp.so $(DESTDIR)$(LIBDIR)/libllhttp.so .PHONY: all generate clean release ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/README.md0000644000175100001710000001230300000000000016615 0ustar00runnerdocker# llhttp [![CI](https://github.com/nodejs/llhttp/workflows/CI/badge.svg)](https://github.com/nodejs/llhttp/actions?query=workflow%3ACI) Port of [http_parser][0] to [llparse][1]. ## Why? Let's face it, [http_parser][0] is practically unmaintainable. Even introduction of a single new method results in a significant code churn. This project aims to: * Make it maintainable * Verifiable * Improving benchmarks where possible More details in [Fedor Indutny's talk at JSConf EU 2019](https://youtu.be/x3k_5Mi66sY) ## How? Over time, different approaches for improving [http_parser][0]'s code base were tried. However, all of them failed due to resulting significant performance degradation. This project is a port of [http_parser][0] to TypeScript. [llparse][1] is used to generate the output C source file, which could be compiled and linked with the embedder's program (like [Node.js][7]). ## Performance So far llhttp outperforms http_parser: | | input size | bandwidth | reqs/sec | time | |:----------------|-----------:|-------------:|-----------:|--------:| | **llhttp** | 8192.00 mb | 1777.24 mb/s | 3583799.39 req/sec | 4.61 s | | **http_parser** | 8192.00 mb | 694.66 mb/s | 1406180.33 req/sec | 11.79 s | llhttp is faster by approximately **156%**. ## Maintenance llhttp project has about 1400 lines of TypeScript code describing the parser itself and around 450 lines of C code and headers providing the helper methods. The whole [http_parser][0] is implemented in approximately 2500 lines of C, and 436 lines of headers. All optimizations and multi-character matching in llhttp are generated automatically, and thus doesn't add any extra maintenance cost. On the contrary, most of http_parser's code is hand-optimized and unrolled. Instead describing "how" it should parse the HTTP requests/responses, a maintainer should implement the new features in [http_parser][0] cautiously, considering possible performance degradation and manually optimizing the new code. ## Verification The state machine graph is encoded explicitly in llhttp. The [llparse][1] automatically checks the graph for absence of loops and correct reporting of the input ranges (spans) like header names and values. In the future, additional checks could be performed to get even stricter verification of the llhttp. ## Usage ```C #include "llhttp.h" llhttp_t parser; llhttp_settings_t settings; /* Initialize user callbacks and settings */ llhttp_settings_init(&settings); /* Set user callback */ settings.on_message_complete = handle_on_message_complete; /* Initialize the parser in HTTP_BOTH mode, meaning that it will select between * HTTP_REQUEST and HTTP_RESPONSE parsing automatically while reading the first * input. */ llhttp_init(&parser, HTTP_BOTH, &settings); /* Parse request! */ const char* request = "GET / HTTP/1.1\r\n\r\n"; int request_len = strlen(request); enum llhttp_errno err = llhttp_execute(&parser, request, request_len); if (err == HPE_OK) { /* Successfully parsed! */ } else { fprintf(stderr, "Parse error: %s %s\n", llhttp_errno_name(err), parser.reason); } ``` For more information on API usage, please refer to [src/native/api.h](https://github.com/nodejs/llhttp/blob/main/src/native/api.h). --- ### Bindings to other languages * Python: [pallas/pyllhttp][8] * Ruby: [metabahn/llhttp][9] ### Using with CMake If you want to use this library in a CMake project you can use the snippet below. ``` FetchContent_Declare(llhttp URL "https://github.com/nodejs/llhttp/releases/download/v6.0.5/llhttp-release-v6.0.5.tar.gz") # Using version 6.0.5 FetchContent_MakeAvailable(llhttp) target_link_libraries(${EXAMPLE_PROJECT_NAME} ${PROJECT_LIBRARIES} llhttp ${PROJECT_NAME}) ``` #### LICENSE This software is licensed under the MIT License. Copyright Fedor Indutny, 2018. 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. [0]: https://github.com/nodejs/http-parser [1]: https://github.com/nodejs/llparse [2]: https://en.wikipedia.org/wiki/Register_allocation#Spilling [3]: https://en.wikipedia.org/wiki/Tail_call [4]: https://llvm.org/docs/LangRef.html [5]: https://llvm.org/docs/LangRef.html#call-instruction [6]: https://clang.llvm.org/ [7]: https://github.com/nodejs/node [8]: https://github.com/pallas/pyllhttp [9]: https://github.com/metabahn/llhttp ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/_config.yml0000644000175100001710000000003400000000000017463 0ustar00runnerdockertheme: jekyll-theme-midnight././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1636920323.038452 aiohttp-3.8.1/vendor/llhttp/bench/0000755000175100001710000000000000000000000016416 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/bench/index.ts0000644000175100001710000000553400000000000020104 0ustar00runnerdocker// NOTE: run `npm test` to build `./test/tmp/http-loose-request` import * as assert from 'assert'; import { spawnSync } from 'child_process'; const isURL = !process.argv[2] || process.argv[2] === 'url'; const isHTTP = !process.argv[2] || process.argv[2] === 'http'; const requests: Map = new Map(); requests.set('seanmonstar/httparse', 'GET /wp-content/uploads/2010/03/hello-kitty-darth-vader-pink.jpg HTTP/1.1\r\n' + 'Host: www.kittyhell.com\r\n' + 'User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ja-JP-mac; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 Pathtraq/0.9\r\n' + 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n' + 'Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\n' + 'Accept-Encoding: gzip,deflate\r\n' + 'Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7\r\n' + 'Keep-Alive: 115\r\n' + 'Connection: keep-alive\r\n' + 'Cookie: wp_ozh_wsa_visits=2; wp_ozh_wsa_visit_lasttime=xxxxxxxxxx; __utma=xxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.xxxxxxxxxx.x; __utmz=xxxxxxxxx.xxxxxxxxxx.x.x.utmccn=(referral)|utmcsr=reader.livedoor.com|utmcct=/reader/|utmcmd=referral\r\n\r\n'); requests.set('nodejs/http-parser', 'POST /joyent/http-parser HTTP/1.1\r\n' + 'Host: github.com\r\n' + 'DNT: 1\r\n' + 'Accept-Encoding: gzip, deflate, sdch\r\n' + 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n' + 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) ' + 'AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/39.0.2171.65 Safari/537.36\r\n' + 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,' + 'image/webp,*/*;q=0.8\r\n' + 'Referer: https://github.com/joyent/http-parser\r\n' + 'Connection: keep-alive\r\n' + 'Transfer-Encoding: chunked\r\n' + 'Cache-Control: max-age=0\r\n\r\nb\r\nhello world\r\n0\r\n\r\n'); if (process.argv[2] === 'loop') { const reqName = process.argv[3]; assert(requests.has(reqName), `Unknown request name: "${reqName}"`); const request = requests.get(reqName)!; spawnSync('./test/tmp/http-loose-request', [ 'loop', request ], { stdio: 'inherit' }); process.exit(0); } if (isURL) { console.log('url loose (C)'); spawnSync('./test/tmp/url-loose-url-c', [ 'bench', 'http://example.com/path/to/file?query=value#fragment' ], { stdio: 'inherit' }); console.log('url strict (C)'); spawnSync('./test/tmp/url-strict-url-c', [ 'bench', 'http://example.com/path/to/file?query=value#fragment' ], { stdio: 'inherit' }); } if (isHTTP) { requests.forEach((request, name) => { console.log('http loose: "%s" (C)', name); spawnSync('./test/tmp/http-loose-request-c', [ 'bench', request ], { stdio: 'inherit' }); console.log('http strict: "%s" (C)', name); spawnSync('./test/tmp/http-strict-request-c', [ 'bench', request ], { stdio: 'inherit' }); }); } ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1636920323.042452 aiohttp-3.8.1/vendor/llhttp/bin/0000755000175100001710000000000000000000000016107 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/bin/build_wasm.ts0000644000175100001710000000502300000000000020605 0ustar00runnerdockerimport { execSync } from 'child_process'; import { copyFileSync, mkdirSync, writeFileSync } from 'fs'; import { stringify } from 'javascript-stringify'; import { join, resolve } from 'path'; import { constants } from '..'; const { WASI_ROOT } = process.env; const WASM_OUT = resolve(__dirname, '../build/wasm'); const WASM_SRC = resolve(__dirname, '../'); if (process.argv[2] === '--setup') { try { mkdirSync(join(WASM_SRC, 'build')); process.exit(0); } catch (error) { if (error.code !== 'EEXIST') { throw error; } process.exit(0); } } if (process.argv[2] === '--docker') { let cmd = 'docker run --rm -it'; // Try to avoid root permission problems on compiled assets // when running on linux. // It will work flawessly if uid === gid === 1000 // there will be some warnings otherwise. if (process.platform === 'linux') { cmd += ` --user ${process.getuid()}:${process.getegid()}`; } cmd += ` --mount type=bind,source=${WASM_SRC}/build,target=/home/node/llhttp/build llhttp_wasm_builder npm run wasm`; execSync(cmd, { cwd: WASM_SRC, stdio: 'inherit' }); process.exit(0); } if (!WASI_ROOT) { throw new Error('Please setup the WASI_ROOT env variable.'); } try { mkdirSync(WASM_OUT); } catch (error) { if (error.code !== 'EEXIST') { throw error; } } // Build ts execSync('npm run build', { cwd: WASM_SRC, stdio: 'inherit' }); // Build wasm binary execSync(`${WASI_ROOT}/bin/clang \ --sysroot=${WASI_ROOT}/share/wasi-sysroot \ -target wasm32-unknown-wasi \ -Ofast \ -fno-exceptions \ -fvisibility=hidden \ -mexec-model=reactor \ -Wl,-error-limit=0 \ -Wl,-O3 \ -Wl,--lto-O3 \ -Wl,--strip-all \ -Wl,--allow-undefined \ -Wl,--export-dynamic \ -Wl,--export-table \ -Wl,--export=malloc \ -Wl,--export=free \ ${join(WASM_SRC, 'build', 'c')}/*.c \ ${join(WASM_SRC, 'src', 'native')}/*.c \ -I${join(WASM_SRC, 'build')} \ -o ${join(WASM_OUT, 'llhttp.wasm')}`, { stdio: 'inherit' }); // Copy constants for `.js` and `.ts` users. copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'constants.js'), join(WASM_OUT, 'constants.js')); copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'constants.js.map'), join(WASM_OUT, 'constants.js.map')); copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'constants.d.ts'), join(WASM_OUT, 'constants.d.ts')); copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'utils.js'), join(WASM_OUT, 'utils.js')); copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'utils.js.map'), join(WASM_OUT, 'utils.js.map')); copyFileSync(join(WASM_SRC, 'lib', 'llhttp', 'utils.d.ts'), join(WASM_OUT, 'utils.d.ts')); ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/bin/generate.ts0000755000175100001710000000457100000000000020263 0ustar00runnerdocker#!/usr/bin/env -S npx ts-node import * as fs from 'fs'; import { LLParse } from 'llparse'; import * as path from 'path'; import * as semver from 'semver'; import * as llhttp from '../src/llhttp'; const pkgFile = path.join(__dirname, '..', 'package.json'); const pkg = JSON.parse(fs.readFileSync(pkgFile).toString()); const BUILD_DIR = path.join(__dirname, '..', 'build'); const C_DIR = path.join(BUILD_DIR, 'c'); const SRC_DIR = path.join(__dirname, '..', 'src'); const C_FILE = path.join(C_DIR, 'llhttp.c'); const HEADER_FILE = path.join(BUILD_DIR, 'llhttp.h'); for (const dir of [ BUILD_DIR, C_DIR ]) { try { fs.mkdirSync(dir); } catch (e) { // no-op } } function build(mode: 'strict' | 'loose') { const llparse = new LLParse('llhttp__internal'); const instance = new llhttp.HTTP(llparse, mode); return llparse.build(instance.build().entry, { c: { header: 'llhttp', }, debug: process.env.LLPARSE_DEBUG ? 'llhttp__debug' : undefined, headerGuard: 'INCLUDE_LLHTTP_ITSELF_H_', }); } function guard(strict: string, loose: string): string { let out = ''; if (strict === loose) { return strict; } out += '#if LLHTTP_STRICT_MODE\n'; out += '\n'; out += strict + '\n'; out += '\n'; out += '#else /* !LLHTTP_STRICT_MODE */\n'; out += '\n'; out += loose + '\n'; out += '\n'; out += '#endif /* LLHTTP_STRICT_MODE */\n'; return out; } const artifacts = { loose: build('loose'), strict: build('strict'), }; let headers = ''; headers += '#ifndef INCLUDE_LLHTTP_H_\n'; headers += '#define INCLUDE_LLHTTP_H_\n'; headers += '\n'; const version = semver.parse(pkg.version)!; headers += `#define LLHTTP_VERSION_MAJOR ${version.major}\n`; headers += `#define LLHTTP_VERSION_MINOR ${version.minor}\n`; headers += `#define LLHTTP_VERSION_PATCH ${version.patch}\n`; headers += '\n'; headers += '#ifndef LLHTTP_STRICT_MODE\n'; headers += '# define LLHTTP_STRICT_MODE 0\n'; headers += '#endif\n'; headers += '\n'; const cHeaders = new llhttp.CHeaders(); headers += guard(artifacts.strict.header, artifacts.loose.header); headers += '\n'; headers += cHeaders.build(); headers += '\n'; headers += fs.readFileSync(path.join(SRC_DIR, 'native', 'api.h')); headers += '\n'; headers += '#endif /* INCLUDE_LLHTTP_H_ */\n'; fs.writeFileSync(C_FILE, guard(artifacts.strict.c || '', artifacts.loose.c || '')); fs.writeFileSync(HEADER_FILE, headers); ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1636920323.050452 aiohttp-3.8.1/vendor/llhttp/build/0000755000175100001710000000000000000000000016436 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1636920323.050452 aiohttp-3.8.1/vendor/llhttp/build/c/0000755000175100001710000000000000000000000016660 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920312.0 aiohttp-3.8.1/vendor/llhttp/build/c/llhttp.c0000644000175100001710000154445200000000000020352 0ustar00runnerdocker#if LLHTTP_STRICT_MODE #include #include #include #ifdef __SSE4_2__ #ifdef _MSC_VER #include #else /* !_MSC_VER */ #include #endif /* _MSC_VER */ #endif /* __SSE4_2__ */ #ifdef _MSC_VER #define ALIGN(n) _declspec(align(n)) #else /* !_MSC_VER */ #define ALIGN(n) __attribute__((aligned(n))) #endif /* _MSC_VER */ #include "llhttp.h" typedef int (*llhttp__internal__span_cb)( llhttp__internal_t*, const char*, const char*); static const unsigned char llparse_blob0[] = { 0xd, 0xa }; static const unsigned char llparse_blob1[] = { 'o', 'n' }; static const unsigned char llparse_blob2[] = { 'e', 'c', 't', 'i', 'o', 'n' }; static const unsigned char llparse_blob3[] = { 'l', 'o', 's', 'e' }; static const unsigned char llparse_blob4[] = { 'e', 'e', 'p', '-', 'a', 'l', 'i', 'v', 'e' }; static const unsigned char llparse_blob5[] = { 'p', 'g', 'r', 'a', 'd', 'e' }; static const unsigned char llparse_blob6[] = { 'c', 'h', 'u', 'n', 'k', 'e', 'd' }; #ifdef __SSE4_2__ static const unsigned char ALIGN(16) llparse_blob7[] = { 0x9, 0x9, ' ', '~', 0x80, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; #endif /* __SSE4_2__ */ #ifdef __SSE4_2__ static const unsigned char ALIGN(16) llparse_blob8[] = { '!', '!', '#', '\'', '*', '+', '-', '.', '0', '9', 'A', 'Z', '^', 'z', '|', '|' }; #endif /* __SSE4_2__ */ #ifdef __SSE4_2__ static const unsigned char ALIGN(16) llparse_blob9[] = { '~', '~', 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; #endif /* __SSE4_2__ */ static const unsigned char llparse_blob10[] = { 'e', 'n', 't', '-', 'l', 'e', 'n', 'g', 't', 'h' }; static const unsigned char llparse_blob11[] = { 'r', 'o', 'x', 'y', '-', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n' }; static const unsigned char llparse_blob12[] = { 'r', 'a', 'n', 's', 'f', 'e', 'r', '-', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g' }; static const unsigned char llparse_blob13[] = { 'p', 'g', 'r', 'a', 'd', 'e' }; static const unsigned char llparse_blob14[] = { 'T', 'T', 'P', '/' }; static const unsigned char llparse_blob15[] = { 0xd, 0xa, 0xd, 0xa, 'S', 'M', 0xd, 0xa, 0xd, 0xa }; static const unsigned char llparse_blob16[] = { 'C', 'E', '/' }; static const unsigned char llparse_blob17[] = { 'T', 'S', 'P', '/' }; static const unsigned char llparse_blob18[] = { 'N', 'O', 'U', 'N', 'C', 'E' }; static const unsigned char llparse_blob19[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob20[] = { 'E', 'C', 'K', 'O', 'U', 'T' }; static const unsigned char llparse_blob21[] = { 'N', 'E', 'C', 'T' }; static const unsigned char llparse_blob22[] = { 'E', 'T', 'E' }; static const unsigned char llparse_blob23[] = { 'C', 'R', 'I', 'B', 'E' }; static const unsigned char llparse_blob24[] = { 'L', 'U', 'S', 'H' }; static const unsigned char llparse_blob25[] = { 'E', 'T' }; static const unsigned char llparse_blob26[] = { 'P', 'A', 'R', 'A', 'M', 'E', 'T', 'E', 'R' }; static const unsigned char llparse_blob27[] = { 'E', 'A', 'D' }; static const unsigned char llparse_blob28[] = { 'N', 'K' }; static const unsigned char llparse_blob29[] = { 'C', 'K' }; static const unsigned char llparse_blob30[] = { 'S', 'E', 'A', 'R', 'C', 'H' }; static const unsigned char llparse_blob31[] = { 'R', 'G', 'E' }; static const unsigned char llparse_blob32[] = { 'C', 'T', 'I', 'V', 'I', 'T', 'Y' }; static const unsigned char llparse_blob33[] = { 'L', 'E', 'N', 'D', 'A', 'R' }; static const unsigned char llparse_blob34[] = { 'V', 'E' }; static const unsigned char llparse_blob35[] = { 'O', 'T', 'I', 'F', 'Y' }; static const unsigned char llparse_blob36[] = { 'P', 'T', 'I', 'O', 'N', 'S' }; static const unsigned char llparse_blob37[] = { 'C', 'H' }; static const unsigned char llparse_blob38[] = { 'S', 'E' }; static const unsigned char llparse_blob39[] = { 'A', 'Y' }; static const unsigned char llparse_blob40[] = { 'S', 'T' }; static const unsigned char llparse_blob41[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob42[] = { 'A', 'T', 'C', 'H' }; static const unsigned char llparse_blob43[] = { 'G', 'E' }; static const unsigned char llparse_blob44[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob45[] = { 'O', 'R', 'D' }; static const unsigned char llparse_blob46[] = { 'I', 'R', 'E', 'C', 'T' }; static const unsigned char llparse_blob47[] = { 'O', 'R', 'T' }; static const unsigned char llparse_blob48[] = { 'R', 'C', 'H' }; static const unsigned char llparse_blob49[] = { 'P', 'A', 'R', 'A', 'M', 'E', 'T', 'E', 'R' }; static const unsigned char llparse_blob50[] = { 'U', 'R', 'C', 'E' }; static const unsigned char llparse_blob51[] = { 'B', 'S', 'C', 'R', 'I', 'B', 'E' }; static const unsigned char llparse_blob52[] = { 'A', 'R', 'D', 'O', 'W', 'N' }; static const unsigned char llparse_blob53[] = { 'A', 'C', 'E' }; static const unsigned char llparse_blob54[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob55[] = { 'N', 'K' }; static const unsigned char llparse_blob56[] = { 'C', 'K' }; static const unsigned char llparse_blob57[] = { 'U', 'B', 'S', 'C', 'R', 'I', 'B', 'E' }; static const unsigned char llparse_blob58[] = { 'H', 'T', 'T', 'P', '/' }; static const unsigned char llparse_blob59[] = { 'A', 'D' }; static const unsigned char llparse_blob60[] = { 'T', 'P', '/' }; enum llparse_match_status_e { kMatchComplete, kMatchPause, kMatchMismatch }; typedef enum llparse_match_status_e llparse_match_status_t; struct llparse_match_s { llparse_match_status_t status; const unsigned char* current; }; typedef struct llparse_match_s llparse_match_t; static llparse_match_t llparse__match_sequence_id( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { uint32_t index; llparse_match_t res; index = s->_index; for (; p != endp; p++) { unsigned char current; current = *p; if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; goto reset; } } else { res.status = kMatchMismatch; goto reset; } } s->_index = index; res.status = kMatchPause; res.current = p; return res; reset: s->_index = 0; res.current = p; return res; } static llparse_match_t llparse__match_sequence_to_lower( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { uint32_t index; llparse_match_t res; index = s->_index; for (; p != endp; p++) { unsigned char current; current = ((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p)); if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; goto reset; } } else { res.status = kMatchMismatch; goto reset; } } s->_index = index; res.status = kMatchPause; res.current = p; return res; reset: s->_index = 0; res.current = p; return res; } static llparse_match_t llparse__match_sequence_to_lower_unsafe( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { uint32_t index; llparse_match_t res; index = s->_index; for (; p != endp; p++) { unsigned char current; current = ((*p) | 0x20); if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; goto reset; } } else { res.status = kMatchMismatch; goto reset; } } s->_index = index; res.status = kMatchPause; res.current = p; return res; reset: s->_index = 0; res.current = p; return res; } enum llparse_state_e { s_error, s_n_llhttp__internal__n_closed, s_n_llhttp__internal__n_invoke_llhttp__after_message_complete, s_n_llhttp__internal__n_pause_1, s_n_llhttp__internal__n_invoke_is_equal_upgrade, s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2, s_n_llhttp__internal__n_chunk_data_almost_done, s_n_llhttp__internal__n_consume_content_length, s_n_llhttp__internal__n_span_start_llhttp__on_body, s_n_llhttp__internal__n_invoke_is_equal_content_length, s_n_llhttp__internal__n_chunk_size_almost_done, s_n_llhttp__internal__n_chunk_parameters, s_n_llhttp__internal__n_chunk_size_otherwise, s_n_llhttp__internal__n_chunk_size, s_n_llhttp__internal__n_chunk_size_digit, s_n_llhttp__internal__n_invoke_update_content_length, s_n_llhttp__internal__n_consume_content_length_1, s_n_llhttp__internal__n_span_start_llhttp__on_body_1, s_n_llhttp__internal__n_eof, s_n_llhttp__internal__n_span_start_llhttp__on_body_2, s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete, s_n_llhttp__internal__n_headers_almost_done, s_n_llhttp__internal__n_header_field_colon_discard_ws, s_n_llhttp__internal__n_error_19, s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete, s_n_llhttp__internal__n_span_start_llhttp__on_header_value, s_n_llhttp__internal__n_header_value_discard_lws, s_n_llhttp__internal__n_header_value_discard_ws_almost_done, s_n_llhttp__internal__n_header_value_lws, s_n_llhttp__internal__n_header_value_almost_done, s_n_llhttp__internal__n_header_value_lenient, s_n_llhttp__internal__n_header_value_otherwise, s_n_llhttp__internal__n_header_value_connection_token, s_n_llhttp__internal__n_header_value_connection_ws, s_n_llhttp__internal__n_header_value_connection_1, s_n_llhttp__internal__n_header_value_connection_2, s_n_llhttp__internal__n_header_value_connection_3, s_n_llhttp__internal__n_header_value_connection, s_n_llhttp__internal__n_error_25, s_n_llhttp__internal__n_error_26, s_n_llhttp__internal__n_header_value_content_length_ws, s_n_llhttp__internal__n_header_value_content_length, s_n_llhttp__internal__n_header_value_te_chunked_last, s_n_llhttp__internal__n_header_value_te_token_ows, s_n_llhttp__internal__n_header_value, s_n_llhttp__internal__n_header_value_te_token, s_n_llhttp__internal__n_header_value_te_chunked, s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1, s_n_llhttp__internal__n_header_value_discard_ws, s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete, s_n_llhttp__internal__n_header_field_general_otherwise, s_n_llhttp__internal__n_header_field_general, s_n_llhttp__internal__n_header_field_colon, s_n_llhttp__internal__n_header_field_3, s_n_llhttp__internal__n_header_field_4, s_n_llhttp__internal__n_header_field_2, s_n_llhttp__internal__n_header_field_1, s_n_llhttp__internal__n_header_field_5, s_n_llhttp__internal__n_header_field_6, s_n_llhttp__internal__n_header_field_7, s_n_llhttp__internal__n_header_field, s_n_llhttp__internal__n_span_start_llhttp__on_header_field, s_n_llhttp__internal__n_header_field_start, s_n_llhttp__internal__n_url_to_http_09, s_n_llhttp__internal__n_url_skip_to_http09, s_n_llhttp__internal__n_url_skip_lf_to_http09_1, s_n_llhttp__internal__n_url_skip_lf_to_http09, s_n_llhttp__internal__n_req_pri_upgrade, s_n_llhttp__internal__n_req_http_complete_1, s_n_llhttp__internal__n_req_http_complete, s_n_llhttp__internal__n_req_http_minor, s_n_llhttp__internal__n_req_http_dot, s_n_llhttp__internal__n_req_http_major, s_n_llhttp__internal__n_req_http_start_1, s_n_llhttp__internal__n_req_http_start_2, s_n_llhttp__internal__n_req_http_start_3, s_n_llhttp__internal__n_req_http_start, s_n_llhttp__internal__n_url_to_http, s_n_llhttp__internal__n_url_skip_to_http, s_n_llhttp__internal__n_url_fragment, s_n_llhttp__internal__n_span_end_stub_query_3, s_n_llhttp__internal__n_url_query, s_n_llhttp__internal__n_url_query_or_fragment, s_n_llhttp__internal__n_url_path, s_n_llhttp__internal__n_span_start_stub_path_2, s_n_llhttp__internal__n_span_start_stub_path, s_n_llhttp__internal__n_span_start_stub_path_1, s_n_llhttp__internal__n_url_server_with_at, s_n_llhttp__internal__n_url_server, s_n_llhttp__internal__n_url_schema_delim_1, s_n_llhttp__internal__n_url_schema_delim, s_n_llhttp__internal__n_span_end_stub_schema, s_n_llhttp__internal__n_url_schema, s_n_llhttp__internal__n_url_start, s_n_llhttp__internal__n_span_start_llhttp__on_url_1, s_n_llhttp__internal__n_url_entry_normal, s_n_llhttp__internal__n_span_start_llhttp__on_url, s_n_llhttp__internal__n_url_entry_connect, s_n_llhttp__internal__n_req_spaces_before_url, s_n_llhttp__internal__n_req_first_space_before_url, s_n_llhttp__internal__n_start_req_2, s_n_llhttp__internal__n_start_req_3, s_n_llhttp__internal__n_start_req_1, s_n_llhttp__internal__n_start_req_4, s_n_llhttp__internal__n_start_req_6, s_n_llhttp__internal__n_start_req_8, s_n_llhttp__internal__n_start_req_9, s_n_llhttp__internal__n_start_req_7, s_n_llhttp__internal__n_start_req_5, s_n_llhttp__internal__n_start_req_12, s_n_llhttp__internal__n_start_req_13, s_n_llhttp__internal__n_start_req_11, s_n_llhttp__internal__n_start_req_10, s_n_llhttp__internal__n_start_req_14, s_n_llhttp__internal__n_start_req_17, s_n_llhttp__internal__n_start_req_16, s_n_llhttp__internal__n_start_req_15, s_n_llhttp__internal__n_start_req_18, s_n_llhttp__internal__n_start_req_20, s_n_llhttp__internal__n_start_req_21, s_n_llhttp__internal__n_start_req_19, s_n_llhttp__internal__n_start_req_23, s_n_llhttp__internal__n_start_req_24, s_n_llhttp__internal__n_start_req_26, s_n_llhttp__internal__n_start_req_28, s_n_llhttp__internal__n_start_req_29, s_n_llhttp__internal__n_start_req_27, s_n_llhttp__internal__n_start_req_25, s_n_llhttp__internal__n_start_req_30, s_n_llhttp__internal__n_start_req_22, s_n_llhttp__internal__n_start_req_31, s_n_llhttp__internal__n_start_req_32, s_n_llhttp__internal__n_start_req_35, s_n_llhttp__internal__n_start_req_36, s_n_llhttp__internal__n_start_req_34, s_n_llhttp__internal__n_start_req_37, s_n_llhttp__internal__n_start_req_38, s_n_llhttp__internal__n_start_req_42, s_n_llhttp__internal__n_start_req_43, s_n_llhttp__internal__n_start_req_41, s_n_llhttp__internal__n_start_req_40, s_n_llhttp__internal__n_start_req_39, s_n_llhttp__internal__n_start_req_45, s_n_llhttp__internal__n_start_req_44, s_n_llhttp__internal__n_start_req_33, s_n_llhttp__internal__n_start_req_48, s_n_llhttp__internal__n_start_req_49, s_n_llhttp__internal__n_start_req_50, s_n_llhttp__internal__n_start_req_51, s_n_llhttp__internal__n_start_req_47, s_n_llhttp__internal__n_start_req_46, s_n_llhttp__internal__n_start_req_54, s_n_llhttp__internal__n_start_req_56, s_n_llhttp__internal__n_start_req_57, s_n_llhttp__internal__n_start_req_55, s_n_llhttp__internal__n_start_req_53, s_n_llhttp__internal__n_start_req_58, s_n_llhttp__internal__n_start_req_59, s_n_llhttp__internal__n_start_req_52, s_n_llhttp__internal__n_start_req_61, s_n_llhttp__internal__n_start_req_62, s_n_llhttp__internal__n_start_req_60, s_n_llhttp__internal__n_start_req_65, s_n_llhttp__internal__n_start_req_67, s_n_llhttp__internal__n_start_req_68, s_n_llhttp__internal__n_start_req_66, s_n_llhttp__internal__n_start_req_69, s_n_llhttp__internal__n_start_req_64, s_n_llhttp__internal__n_start_req_63, s_n_llhttp__internal__n_start_req, s_n_llhttp__internal__n_invoke_llhttp__on_status_complete, s_n_llhttp__internal__n_res_line_almost_done, s_n_llhttp__internal__n_res_status, s_n_llhttp__internal__n_span_start_llhttp__on_status, s_n_llhttp__internal__n_res_status_start, s_n_llhttp__internal__n_res_status_code_otherwise, s_n_llhttp__internal__n_res_status_code, s_n_llhttp__internal__n_res_http_end, s_n_llhttp__internal__n_res_http_minor, s_n_llhttp__internal__n_res_http_dot, s_n_llhttp__internal__n_res_http_major, s_n_llhttp__internal__n_start_res, s_n_llhttp__internal__n_req_or_res_method_2, s_n_llhttp__internal__n_req_or_res_method_3, s_n_llhttp__internal__n_req_or_res_method_1, s_n_llhttp__internal__n_req_or_res_method, s_n_llhttp__internal__n_start_req_or_res, s_n_llhttp__internal__n_invoke_load_type, s_n_llhttp__internal__n_start, }; typedef enum llparse_state_e llparse_state_t; int llhttp__on_url( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_header_field( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_header_value( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_body( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_status( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_finish( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->finish = 2; return 0; } int llhttp__on_message_begin( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_load_type( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->type; } int llhttp__internal__c_store_method( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->method = match; return 0; } int llhttp__internal__c_is_equal_method( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->method == 5; } int llhttp__internal__c_update_http_major( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->http_major = 0; return 0; } int llhttp__internal__c_update_http_minor( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->http_minor = 9; return 0; } int llhttp__on_url_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_test_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->flags & 128) == 128; } int llhttp__on_chunk_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_message_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_is_equal_upgrade( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->upgrade == 1; } int llhttp__after_message_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_finish_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->finish = 0; return 0; } int llhttp__internal__c_test_lenient_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 4) == 4; } int llhttp__internal__c_test_flags_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->flags & 544) == 544; } int llhttp__internal__c_test_lenient_flags_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 2) == 2; } int llhttp__before_headers_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_headers_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__after_headers_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_content_length( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->content_length = 0; return 0; } int llhttp__internal__c_mul_add_content_length( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { /* Multiplication overflow */ if (state->content_length > 0xffffffffffffffffULL / 16) { return 1; } state->content_length *= 16; /* Addition overflow */ if (match >= 0) { if (state->content_length > 0xffffffffffffffffULL - match) { return 1; } } else { if (state->content_length < 0ULL - match) { return 1; } } state->content_length += match; return 0; } int llhttp__on_chunk_header( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_is_equal_content_length( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->content_length == 0; } int llhttp__internal__c_or_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 128; return 0; } int llhttp__internal__c_update_finish_3( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->finish = 1; return 0; } int llhttp__internal__c_or_flags_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 64; return 0; } int llhttp__internal__c_update_upgrade( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->upgrade = 1; return 0; } int llhttp__internal__c_store_header_state( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->header_state = match; return 0; } int llhttp__internal__c_test_lenient_flags_2( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 1) == 1; } int llhttp__on_header_field_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_load_header_state( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->header_state; } int llhttp__internal__c_or_flags_3( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 1; return 0; } int llhttp__internal__c_update_header_state( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 1; return 0; } int llhttp__on_header_value_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_or_flags_4( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 2; return 0; } int llhttp__internal__c_or_flags_5( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 4; return 0; } int llhttp__internal__c_or_flags_6( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 8; return 0; } int llhttp__internal__c_update_header_state_2( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 6; return 0; } int llhttp__internal__c_update_header_state_4( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 0; return 0; } int llhttp__internal__c_update_header_state_5( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 5; return 0; } int llhttp__internal__c_update_header_state_6( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 7; return 0; } int llhttp__internal__c_test_flags_2( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->flags & 32) == 32; } int llhttp__internal__c_mul_add_content_length_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { /* Multiplication overflow */ if (state->content_length > 0xffffffffffffffffULL / 10) { return 1; } state->content_length *= 10; /* Addition overflow */ if (match >= 0) { if (state->content_length > 0xffffffffffffffffULL - match) { return 1; } } else { if (state->content_length < 0ULL - match) { return 1; } } state->content_length += match; return 0; } int llhttp__internal__c_or_flags_15( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 32; return 0; } int llhttp__internal__c_or_flags_16( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 512; return 0; } int llhttp__internal__c_and_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags &= -9; return 0; } int llhttp__internal__c_update_header_state_7( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 8; return 0; } int llhttp__internal__c_or_flags_17( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 16; return 0; } int llhttp__internal__c_load_method( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->method; } int llhttp__internal__c_store_http_major( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->http_major = match; return 0; } int llhttp__internal__c_store_http_minor( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->http_minor = match; return 0; } int llhttp__internal__c_update_status_code( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->status_code = 0; return 0; } int llhttp__internal__c_mul_add_status_code( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { /* Multiplication overflow */ if (state->status_code > 0xffff / 10) { return 1; } state->status_code *= 10; /* Addition overflow */ if (match >= 0) { if (state->status_code > 0xffff - match) { return 1; } } else { if (state->status_code < 0 - match) { return 1; } } state->status_code += match; /* Enforce maximum */ if (state->status_code > 999) { return 1; } return 0; } int llhttp__on_status_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_type( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->type = 1; return 0; } int llhttp__internal__c_update_type_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->type = 2; return 0; } int llhttp__internal_init(llhttp__internal_t* state) { memset(state, 0, sizeof(*state)); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_start; return 0; } static llparse_state_t llhttp__internal__run( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { int match; switch ((llparse_state_t) (intptr_t) state->_current) { case s_n_llhttp__internal__n_closed: s_n_llhttp__internal__n_closed: { if (p == endp) { return s_n_llhttp__internal__n_closed; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_closed; } case 13: { p++; goto s_n_llhttp__internal__n_closed; } default: { p++; goto s_n_llhttp__internal__n_error_4; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__after_message_complete: s_n_llhttp__internal__n_invoke_llhttp__after_message_complete: { switch (llhttp__after_message_complete(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_update_finish_2; default: goto s_n_llhttp__internal__n_invoke_update_finish_1; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_pause_1: s_n_llhttp__internal__n_pause_1: { state->error = 0x16; state->reason = "Pause on CONNECT/Upgrade"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_is_equal_upgrade: s_n_llhttp__internal__n_invoke_is_equal_upgrade: { switch (llhttp__internal__c_is_equal_upgrade(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; default: goto s_n_llhttp__internal__n_pause_1; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2: s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2: { switch (llhttp__on_message_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_is_equal_upgrade; case 21: goto s_n_llhttp__internal__n_pause_5; default: goto s_n_llhttp__internal__n_error_14; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_data_almost_done: s_n_llhttp__internal__n_chunk_data_almost_done: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_chunk_data_almost_done; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob0, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete; } case kMatchPause: { return s_n_llhttp__internal__n_chunk_data_almost_done; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_8; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_consume_content_length: s_n_llhttp__internal__n_consume_content_length: { size_t avail; uint64_t need; avail = endp - p; need = state->content_length; if (avail >= need) { p += need; state->content_length = 0; goto s_n_llhttp__internal__n_span_end_llhttp__on_body; } state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_body: s_n_llhttp__internal__n_span_start_llhttp__on_body: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_body; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_consume_content_length; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_is_equal_content_length: s_n_llhttp__internal__n_invoke_is_equal_content_length: { switch (llhttp__internal__c_is_equal_content_length(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_span_start_llhttp__on_body; default: goto s_n_llhttp__internal__n_invoke_or_flags; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size_almost_done: s_n_llhttp__internal__n_chunk_size_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header; } default: { goto s_n_llhttp__internal__n_error_9; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_parameters: s_n_llhttp__internal__n_chunk_parameters: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_chunk_parameters; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_chunk_parameters; } case 2: { p++; goto s_n_llhttp__internal__n_chunk_size_almost_done; } default: { goto s_n_llhttp__internal__n_error_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size_otherwise: s_n_llhttp__internal__n_chunk_size_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size_otherwise; } switch (*p) { case 13: { p++; goto s_n_llhttp__internal__n_chunk_size_almost_done; } case ' ': { p++; goto s_n_llhttp__internal__n_chunk_parameters; } case ';': { p++; goto s_n_llhttp__internal__n_chunk_parameters; } default: { goto s_n_llhttp__internal__n_error_11; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size: s_n_llhttp__internal__n_chunk_size: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'A': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'B': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'C': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'D': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'E': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'F': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'a': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'b': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'c': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'd': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'e': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'f': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } default: { goto s_n_llhttp__internal__n_chunk_size_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size_digit: s_n_llhttp__internal__n_chunk_size_digit: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size_digit; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'A': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'B': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'C': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'D': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'E': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'F': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'a': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'b': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'c': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'd': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'e': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'f': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } default: { goto s_n_llhttp__internal__n_error_13; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_update_content_length: s_n_llhttp__internal__n_invoke_update_content_length: { switch (llhttp__internal__c_update_content_length(state, p, endp)) { default: goto s_n_llhttp__internal__n_chunk_size_digit; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_consume_content_length_1: s_n_llhttp__internal__n_consume_content_length_1: { size_t avail; uint64_t need; avail = endp - p; need = state->content_length; if (avail >= need) { p += need; state->content_length = 0; goto s_n_llhttp__internal__n_span_end_llhttp__on_body_1; } state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length_1; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_body_1: s_n_llhttp__internal__n_span_start_llhttp__on_body_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_body_1; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_consume_content_length_1; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_eof: s_n_llhttp__internal__n_eof: { if (p == endp) { return s_n_llhttp__internal__n_eof; } p++; goto s_n_llhttp__internal__n_eof; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_body_2: s_n_llhttp__internal__n_span_start_llhttp__on_body_2: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_body_2; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_eof; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete: s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete: { switch (llhttp__after_headers_complete(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_1; case 2: goto s_n_llhttp__internal__n_invoke_update_content_length; case 3: goto s_n_llhttp__internal__n_span_start_llhttp__on_body_1; case 4: goto s_n_llhttp__internal__n_invoke_update_finish_3; case 5: goto s_n_llhttp__internal__n_error_15; default: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_headers_almost_done: s_n_llhttp__internal__n_headers_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_headers_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_test_flags; } default: { goto s_n_llhttp__internal__n_error_18; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_colon_discard_ws: s_n_llhttp__internal__n_header_field_colon_discard_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_field_colon_discard_ws; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_header_field_colon_discard_ws; } default: { goto s_n_llhttp__internal__n_header_field_colon; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_19: s_n_llhttp__internal__n_error_19: { state->error = 0xa; state->reason = "Invalid header field char"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: { switch (llhttp__on_header_value_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_start; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_header_value: s_n_llhttp__internal__n_span_start_llhttp__on_header_value: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_value; goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_discard_lws: s_n_llhttp__internal__n_header_value_discard_lws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_discard_lws; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_header_value_discard_ws; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_discard_ws; } default: { goto s_n_llhttp__internal__n_invoke_load_header_state; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_discard_ws_almost_done: s_n_llhttp__internal__n_header_value_discard_ws_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_header_value_discard_ws_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_header_value_discard_lws; } default: { goto s_n_llhttp__internal__n_error_21; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_lws: s_n_llhttp__internal__n_header_value_lws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_lws; } switch (*p) { case 9: { goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } case ' ': { goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } default: { goto s_n_llhttp__internal__n_invoke_load_header_state_3; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_almost_done: s_n_llhttp__internal__n_header_value_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_header_value_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_header_value_lws; } default: { goto s_n_llhttp__internal__n_error_22; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_lenient: s_n_llhttp__internal__n_header_value_lenient: { if (p == endp) { return s_n_llhttp__internal__n_header_value_lenient; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3; } default: { p++; goto s_n_llhttp__internal__n_header_value_lenient; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_otherwise: s_n_llhttp__internal__n_header_value_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_header_value_otherwise; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2; } default: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_3; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_token: s_n_llhttp__internal__n_header_value_connection_token: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 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, 0, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_token; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_value_connection_token; } case 2: { p++; goto s_n_llhttp__internal__n_header_value_connection; } default: { goto s_n_llhttp__internal__n_header_value_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_ws: s_n_llhttp__internal__n_header_value_connection_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_ws; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_header_value_otherwise; } case 13: { goto s_n_llhttp__internal__n_header_value_otherwise; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_connection_ws; } case ',': { p++; goto s_n_llhttp__internal__n_invoke_load_header_state_4; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_4; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_1: s_n_llhttp__internal__n_header_value_connection_1: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_1; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob3, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_header_state_2; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_connection_1; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_2: s_n_llhttp__internal__n_header_value_connection_2: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_2; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob4, 9); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_header_state_5; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_connection_2; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_3: s_n_llhttp__internal__n_header_value_connection_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_3; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob5, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_header_state_6; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_connection_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection: s_n_llhttp__internal__n_header_value_connection: { if (p == endp) { return s_n_llhttp__internal__n_header_value_connection; } switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { case 9: { p++; goto s_n_llhttp__internal__n_header_value_connection; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_connection; } case 'c': { p++; goto s_n_llhttp__internal__n_header_value_connection_1; } case 'k': { p++; goto s_n_llhttp__internal__n_header_value_connection_2; } case 'u': { p++; goto s_n_llhttp__internal__n_header_value_connection_3; } default: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_25: s_n_llhttp__internal__n_error_25: { state->error = 0xb; state->reason = "Content-Length overflow"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_26: s_n_llhttp__internal__n_error_26: { state->error = 0xb; state->reason = "Invalid character in Content-Length"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_content_length_ws: s_n_llhttp__internal__n_header_value_content_length_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_content_length_ws; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_invoke_or_flags_15; } case 13: { goto s_n_llhttp__internal__n_invoke_or_flags_15; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_content_length_ws; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_content_length: s_n_llhttp__internal__n_header_value_content_length: { if (p == endp) { return s_n_llhttp__internal__n_header_value_content_length; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } default: { goto s_n_llhttp__internal__n_header_value_content_length_ws; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_chunked_last: s_n_llhttp__internal__n_header_value_te_chunked_last: { if (p == endp) { return s_n_llhttp__internal__n_header_value_te_chunked_last; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_invoke_update_header_state_7; } case 13: { goto s_n_llhttp__internal__n_invoke_update_header_state_7; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_te_chunked_last; } default: { goto s_n_llhttp__internal__n_header_value_te_chunked; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_token_ows: s_n_llhttp__internal__n_header_value_te_token_ows: { if (p == endp) { return s_n_llhttp__internal__n_header_value_te_token_ows; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_header_value_te_token_ows; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_te_token_ows; } default: { goto s_n_llhttp__internal__n_header_value_te_chunked; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value: s_n_llhttp__internal__n_header_value: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_header_value; } #ifdef __SSE4_2__ if (endp - p >= 16) { __m128i ranges; __m128i input; int avail; int match_len; /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob7); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 6, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_value; } goto s_n_llhttp__internal__n_header_value_otherwise; } #endif /* __SSE4_2__ */ switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_value; } default: { goto s_n_llhttp__internal__n_header_value_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_token: s_n_llhttp__internal__n_header_value_te_token: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 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, 0, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_header_value_te_token; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_value_te_token; } case 2: { p++; goto s_n_llhttp__internal__n_header_value_te_token_ows; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_8; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_chunked: s_n_llhttp__internal__n_header_value_te_chunked: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_te_chunked; } match_seq = llparse__match_sequence_to_lower_unsafe(state, p, endp, llparse_blob6, 7); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_header_value_te_chunked_last; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_te_chunked; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_te_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1: s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_value; goto s_n_llhttp__internal__n_invoke_load_header_state_2; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_discard_ws: s_n_llhttp__internal__n_header_value_discard_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_discard_ws; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_header_value_discard_ws; } case 10: { p++; goto s_n_llhttp__internal__n_header_value_discard_lws; } case 13: { p++; goto s_n_llhttp__internal__n_header_value_discard_ws_almost_done; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_discard_ws; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: { switch (llhttp__on_header_field_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_discard_ws; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_general_otherwise: s_n_llhttp__internal__n_header_field_general_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_header_field_general_otherwise; } switch (*p) { case ':': { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field_2; } default: { goto s_n_llhttp__internal__n_error_27; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_general: s_n_llhttp__internal__n_header_field_general: { static uint8_t lookup_table[] = { 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, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 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, 0, 1, 0, 1, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_header_field_general; } #ifdef __SSE4_2__ if (endp - p >= 16) { __m128i ranges; __m128i input; int avail; int match_len; /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob8); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 16, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_field_general; } ranges = _mm_loadu_si128((__m128i const*) llparse_blob9); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 2, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_field_general; } goto s_n_llhttp__internal__n_header_field_general_otherwise; } #endif /* __SSE4_2__ */ switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_field_general; } default: { goto s_n_llhttp__internal__n_header_field_general_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_colon: s_n_llhttp__internal__n_header_field_colon: { if (p == endp) { return s_n_llhttp__internal__n_header_field_colon; } switch (*p) { case ' ': { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_2; } case ':': { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_9; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_3: s_n_llhttp__internal__n_header_field_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_3; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob2, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_4: s_n_llhttp__internal__n_header_field_4: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_4; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob10, 10); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_4; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_2: s_n_llhttp__internal__n_header_field_2: { if (p == endp) { return s_n_llhttp__internal__n_header_field_2; } switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { case 'n': { p++; goto s_n_llhttp__internal__n_header_field_3; } case 't': { p++; goto s_n_llhttp__internal__n_header_field_4; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_1: s_n_llhttp__internal__n_header_field_1: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_1; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob1, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_header_field_2; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_1; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_5: s_n_llhttp__internal__n_header_field_5: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_5; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob11, 15); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_5; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_6: s_n_llhttp__internal__n_header_field_6: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_6; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob12, 16); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_6; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_7: s_n_llhttp__internal__n_header_field_7: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_7; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob13, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_7; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field: s_n_llhttp__internal__n_header_field: { if (p == endp) { return s_n_llhttp__internal__n_header_field; } switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { case 'c': { p++; goto s_n_llhttp__internal__n_header_field_1; } case 'p': { p++; goto s_n_llhttp__internal__n_header_field_5; } case 't': { p++; goto s_n_llhttp__internal__n_header_field_6; } case 'u': { p++; goto s_n_llhttp__internal__n_header_field_7; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_header_field: s_n_llhttp__internal__n_span_start_llhttp__on_header_field: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_header_field; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_field; goto s_n_llhttp__internal__n_header_field; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_start: s_n_llhttp__internal__n_header_field_start: { if (p == endp) { return s_n_llhttp__internal__n_header_field_start; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_headers_almost_done; } case 13: { p++; goto s_n_llhttp__internal__n_headers_almost_done; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_header_field; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_to_http_09: s_n_llhttp__internal__n_url_to_http_09: { if (p == endp) { return s_n_llhttp__internal__n_url_to_http_09; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_1; } case 12: { p++; goto s_n_llhttp__internal__n_error_1; } default: { goto s_n_llhttp__internal__n_invoke_update_http_major; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_skip_to_http09: s_n_llhttp__internal__n_url_skip_to_http09: { if (p == endp) { return s_n_llhttp__internal__n_url_skip_to_http09; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_1; } case 12: { p++; goto s_n_llhttp__internal__n_error_1; } default: { p++; goto s_n_llhttp__internal__n_url_to_http_09; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_skip_lf_to_http09_1: s_n_llhttp__internal__n_url_skip_lf_to_http09_1: { if (p == endp) { return s_n_llhttp__internal__n_url_skip_lf_to_http09_1; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_url_to_http_09; } default: { goto s_n_llhttp__internal__n_error_28; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_skip_lf_to_http09: s_n_llhttp__internal__n_url_skip_lf_to_http09: { if (p == endp) { return s_n_llhttp__internal__n_url_skip_lf_to_http09; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_1; } case 12: { p++; goto s_n_llhttp__internal__n_error_1; } case 13: { p++; goto s_n_llhttp__internal__n_url_skip_lf_to_http09_1; } default: { goto s_n_llhttp__internal__n_error_28; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_pri_upgrade: s_n_llhttp__internal__n_req_pri_upgrade: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_pri_upgrade; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob15, 10); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_error_31; } case kMatchPause: { return s_n_llhttp__internal__n_req_pri_upgrade; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_32; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_complete_1: s_n_llhttp__internal__n_req_http_complete_1: { if (p == endp) { return s_n_llhttp__internal__n_req_http_complete_1; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_header_field_start; } default: { goto s_n_llhttp__internal__n_error_30; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_complete: s_n_llhttp__internal__n_req_http_complete: { if (p == endp) { return s_n_llhttp__internal__n_req_http_complete; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_header_field_start; } case 13: { p++; goto s_n_llhttp__internal__n_req_http_complete_1; } default: { goto s_n_llhttp__internal__n_error_30; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_minor: s_n_llhttp__internal__n_req_http_minor: { if (p == endp) { return s_n_llhttp__internal__n_req_http_minor; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_minor; } default: { goto s_n_llhttp__internal__n_error_33; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_dot: s_n_llhttp__internal__n_req_http_dot: { if (p == endp) { return s_n_llhttp__internal__n_req_http_dot; } switch (*p) { case '.': { p++; goto s_n_llhttp__internal__n_req_http_minor; } default: { goto s_n_llhttp__internal__n_error_34; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_major: s_n_llhttp__internal__n_req_http_major: { if (p == endp) { return s_n_llhttp__internal__n_req_http_major; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_major; } default: { goto s_n_llhttp__internal__n_error_35; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start_1: s_n_llhttp__internal__n_req_http_start_1: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_http_start_1; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob14, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_load_method; } case kMatchPause: { return s_n_llhttp__internal__n_req_http_start_1; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_38; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start_2: s_n_llhttp__internal__n_req_http_start_2: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_http_start_2; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob16, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_load_method_2; } case kMatchPause: { return s_n_llhttp__internal__n_req_http_start_2; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_38; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start_3: s_n_llhttp__internal__n_req_http_start_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_http_start_3; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob17, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_load_method_3; } case kMatchPause: { return s_n_llhttp__internal__n_req_http_start_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_38; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start: s_n_llhttp__internal__n_req_http_start: { if (p == endp) { return s_n_llhttp__internal__n_req_http_start; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_req_http_start; } case 'H': { p++; goto s_n_llhttp__internal__n_req_http_start_1; } case 'I': { p++; goto s_n_llhttp__internal__n_req_http_start_2; } case 'R': { p++; goto s_n_llhttp__internal__n_req_http_start_3; } default: { goto s_n_llhttp__internal__n_error_38; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_to_http: s_n_llhttp__internal__n_url_to_http: { if (p == endp) { return s_n_llhttp__internal__n_url_to_http; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_1; } case 12: { p++; goto s_n_llhttp__internal__n_error_1; } default: { goto s_n_llhttp__internal__n_invoke_llhttp__on_url_complete_1; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_skip_to_http: s_n_llhttp__internal__n_url_skip_to_http: { if (p == endp) { return s_n_llhttp__internal__n_url_skip_to_http; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_1; } case 12: { p++; goto s_n_llhttp__internal__n_error_1; } default: { p++; goto s_n_llhttp__internal__n_url_to_http; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_fragment: s_n_llhttp__internal__n_url_fragment: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 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, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_fragment; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_1; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_6; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_7; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_8; } case 5: { p++; goto s_n_llhttp__internal__n_url_fragment; } default: { goto s_n_llhttp__internal__n_error_39; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_end_stub_query_3: s_n_llhttp__internal__n_span_end_stub_query_3: { if (p == endp) { return s_n_llhttp__internal__n_span_end_stub_query_3; } p++; goto s_n_llhttp__internal__n_url_fragment; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_query: s_n_llhttp__internal__n_url_query: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 6, 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, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_query; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_1; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_9; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_10; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_11; } case 5: { p++; goto s_n_llhttp__internal__n_url_query; } case 6: { goto s_n_llhttp__internal__n_span_end_stub_query_3; } default: { goto s_n_llhttp__internal__n_error_40; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_query_or_fragment: s_n_llhttp__internal__n_url_query_or_fragment: { if (p == endp) { return s_n_llhttp__internal__n_url_query_or_fragment; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_1; } case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_3; } case 12: { p++; goto s_n_llhttp__internal__n_error_1; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_4; } case ' ': { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_5; } case '#': { p++; goto s_n_llhttp__internal__n_url_fragment; } case '?': { p++; goto s_n_llhttp__internal__n_url_query; } default: { goto s_n_llhttp__internal__n_error_41; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_path: s_n_llhttp__internal__n_url_path: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 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, 0, 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, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_path; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_1; } case 2: { p++; goto s_n_llhttp__internal__n_url_path; } default: { goto s_n_llhttp__internal__n_url_query_or_fragment; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_stub_path_2: s_n_llhttp__internal__n_span_start_stub_path_2: { if (p == endp) { return s_n_llhttp__internal__n_span_start_stub_path_2; } p++; goto s_n_llhttp__internal__n_url_path; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_stub_path: s_n_llhttp__internal__n_span_start_stub_path: { if (p == endp) { return s_n_llhttp__internal__n_span_start_stub_path; } p++; goto s_n_llhttp__internal__n_url_path; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_stub_path_1: s_n_llhttp__internal__n_span_start_stub_path_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_stub_path_1; } p++; goto s_n_llhttp__internal__n_url_path; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_server_with_at: s_n_llhttp__internal__n_url_server_with_at: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 7, 8, 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, 0, 5, 0, 5, 0, 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, 0, 0, 0, 5, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_server_with_at; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_1; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_12; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_13; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_14; } case 5: { p++; goto s_n_llhttp__internal__n_url_server; } case 6: { goto s_n_llhttp__internal__n_span_start_stub_path_1; } case 7: { p++; goto s_n_llhttp__internal__n_url_query; } case 8: { p++; goto s_n_llhttp__internal__n_error_42; } default: { goto s_n_llhttp__internal__n_error_43; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_server: s_n_llhttp__internal__n_url_server: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 7, 8, 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, 0, 5, 0, 5, 0, 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, 0, 0, 0, 5, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_server; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_1; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_1; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_2; } case 5: { p++; goto s_n_llhttp__internal__n_url_server; } case 6: { goto s_n_llhttp__internal__n_span_start_stub_path; } case 7: { p++; goto s_n_llhttp__internal__n_url_query; } case 8: { p++; goto s_n_llhttp__internal__n_url_server_with_at; } default: { goto s_n_llhttp__internal__n_error_44; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_schema_delim_1: s_n_llhttp__internal__n_url_schema_delim_1: { if (p == endp) { return s_n_llhttp__internal__n_url_schema_delim_1; } switch (*p) { case '/': { p++; goto s_n_llhttp__internal__n_url_server; } default: { goto s_n_llhttp__internal__n_error_46; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_schema_delim: s_n_llhttp__internal__n_url_schema_delim: { if (p == endp) { return s_n_llhttp__internal__n_url_schema_delim; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_1; } case 10: { p++; goto s_n_llhttp__internal__n_error_45; } case 12: { p++; goto s_n_llhttp__internal__n_error_1; } case 13: { p++; goto s_n_llhttp__internal__n_error_45; } case ' ': { p++; goto s_n_llhttp__internal__n_error_45; } case '/': { p++; goto s_n_llhttp__internal__n_url_schema_delim_1; } default: { goto s_n_llhttp__internal__n_error_46; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_end_stub_schema: s_n_llhttp__internal__n_span_end_stub_schema: { if (p == endp) { return s_n_llhttp__internal__n_span_end_stub_schema; } p++; goto s_n_llhttp__internal__n_url_schema_delim; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_schema: s_n_llhttp__internal__n_url_schema: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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, 3, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 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, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_schema; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_1; } case 2: { p++; goto s_n_llhttp__internal__n_error_45; } case 3: { goto s_n_llhttp__internal__n_span_end_stub_schema; } case 4: { p++; goto s_n_llhttp__internal__n_url_schema; } default: { goto s_n_llhttp__internal__n_error_47; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_start: s_n_llhttp__internal__n_url_start: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 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, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_start; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_1; } case 2: { p++; goto s_n_llhttp__internal__n_error_45; } case 3: { goto s_n_llhttp__internal__n_span_start_stub_path_2; } case 4: { goto s_n_llhttp__internal__n_url_schema; } default: { goto s_n_llhttp__internal__n_error_48; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_url_1: s_n_llhttp__internal__n_span_start_llhttp__on_url_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_url_1; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_url; goto s_n_llhttp__internal__n_url_start; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_entry_normal: s_n_llhttp__internal__n_url_entry_normal: { if (p == endp) { return s_n_llhttp__internal__n_url_entry_normal; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_1; } case 12: { p++; goto s_n_llhttp__internal__n_error_1; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_url_1; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_url: s_n_llhttp__internal__n_span_start_llhttp__on_url: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_url; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_url; goto s_n_llhttp__internal__n_url_server; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_entry_connect: s_n_llhttp__internal__n_url_entry_connect: { if (p == endp) { return s_n_llhttp__internal__n_url_entry_connect; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_error_1; } case 12: { p++; goto s_n_llhttp__internal__n_error_1; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_url; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_spaces_before_url: s_n_llhttp__internal__n_req_spaces_before_url: { if (p == endp) { return s_n_llhttp__internal__n_req_spaces_before_url; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_req_spaces_before_url; } default: { goto s_n_llhttp__internal__n_invoke_is_equal_method; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_first_space_before_url: s_n_llhttp__internal__n_req_first_space_before_url: { if (p == endp) { return s_n_llhttp__internal__n_req_first_space_before_url; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_req_spaces_before_url; } default: { goto s_n_llhttp__internal__n_error_49; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_2: s_n_llhttp__internal__n_start_req_2: { if (p == endp) { return s_n_llhttp__internal__n_start_req_2; } switch (*p) { case 'L': { p++; match = 19; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_3: s_n_llhttp__internal__n_start_req_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_3; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob18, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 36; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_1: s_n_llhttp__internal__n_start_req_1: { if (p == endp) { return s_n_llhttp__internal__n_start_req_1; } switch (*p) { case 'C': { p++; goto s_n_llhttp__internal__n_start_req_2; } case 'N': { p++; goto s_n_llhttp__internal__n_start_req_3; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_4: s_n_llhttp__internal__n_start_req_4: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_4; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob19, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 16; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_4; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_6: s_n_llhttp__internal__n_start_req_6: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_6; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob20, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 22; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_6; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_8: s_n_llhttp__internal__n_start_req_8: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_8; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob21, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_8; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_9: s_n_llhttp__internal__n_start_req_9: { if (p == endp) { return s_n_llhttp__internal__n_start_req_9; } switch (*p) { case 'Y': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_7: s_n_llhttp__internal__n_start_req_7: { if (p == endp) { return s_n_llhttp__internal__n_start_req_7; } switch (*p) { case 'N': { p++; goto s_n_llhttp__internal__n_start_req_8; } case 'P': { p++; goto s_n_llhttp__internal__n_start_req_9; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_5: s_n_llhttp__internal__n_start_req_5: { if (p == endp) { return s_n_llhttp__internal__n_start_req_5; } switch (*p) { case 'H': { p++; goto s_n_llhttp__internal__n_start_req_6; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_7; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_12: s_n_llhttp__internal__n_start_req_12: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_12; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob22, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_12; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_13: s_n_llhttp__internal__n_start_req_13: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_13; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob23, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 35; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_13; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_11: s_n_llhttp__internal__n_start_req_11: { if (p == endp) { return s_n_llhttp__internal__n_start_req_11; } switch (*p) { case 'L': { p++; goto s_n_llhttp__internal__n_start_req_12; } case 'S': { p++; goto s_n_llhttp__internal__n_start_req_13; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_10: s_n_llhttp__internal__n_start_req_10: { if (p == endp) { return s_n_llhttp__internal__n_start_req_10; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_start_req_11; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_14: s_n_llhttp__internal__n_start_req_14: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_14; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob24, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 45; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_14; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_17: s_n_llhttp__internal__n_start_req_17: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_17; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob26, 9); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 41; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_17; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_16: s_n_llhttp__internal__n_start_req_16: { if (p == endp) { return s_n_llhttp__internal__n_start_req_16; } switch (*p) { case '_': { p++; goto s_n_llhttp__internal__n_start_req_17; } default: { match = 1; goto s_n_llhttp__internal__n_invoke_store_method_1; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_15: s_n_llhttp__internal__n_start_req_15: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_15; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob25, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_start_req_16; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_15; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_18: s_n_llhttp__internal__n_start_req_18: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_18; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob27, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_18; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_20: s_n_llhttp__internal__n_start_req_20: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_20; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob28, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 31; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_20; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_21: s_n_llhttp__internal__n_start_req_21: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_21; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob29, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_21; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_19: s_n_llhttp__internal__n_start_req_19: { if (p == endp) { return s_n_llhttp__internal__n_start_req_19; } switch (*p) { case 'I': { p++; goto s_n_llhttp__internal__n_start_req_20; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_21; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_23: s_n_llhttp__internal__n_start_req_23: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_23; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob30, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 24; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_23; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_24: s_n_llhttp__internal__n_start_req_24: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_24; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob31, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 23; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_24; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_26: s_n_llhttp__internal__n_start_req_26: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_26; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob32, 7); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 21; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_26; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_28: s_n_llhttp__internal__n_start_req_28: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_28; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob33, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 30; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_28; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_29: s_n_llhttp__internal__n_start_req_29: { if (p == endp) { return s_n_llhttp__internal__n_start_req_29; } switch (*p) { case 'L': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_27: s_n_llhttp__internal__n_start_req_27: { if (p == endp) { return s_n_llhttp__internal__n_start_req_27; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_start_req_28; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_29; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_25: s_n_llhttp__internal__n_start_req_25: { if (p == endp) { return s_n_llhttp__internal__n_start_req_25; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_start_req_26; } case 'C': { p++; goto s_n_llhttp__internal__n_start_req_27; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_30: s_n_llhttp__internal__n_start_req_30: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_30; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob34, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 11; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_30; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_22: s_n_llhttp__internal__n_start_req_22: { if (p == endp) { return s_n_llhttp__internal__n_start_req_22; } switch (*p) { case '-': { p++; goto s_n_llhttp__internal__n_start_req_23; } case 'E': { p++; goto s_n_llhttp__internal__n_start_req_24; } case 'K': { p++; goto s_n_llhttp__internal__n_start_req_25; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_30; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_31: s_n_llhttp__internal__n_start_req_31: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_31; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob35, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 25; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_31; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_32: s_n_llhttp__internal__n_start_req_32: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_32; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob36, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_32; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_35: s_n_llhttp__internal__n_start_req_35: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_35; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob37, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 28; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_35; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_36: s_n_llhttp__internal__n_start_req_36: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_36; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob38, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 39; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_36; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_34: s_n_llhttp__internal__n_start_req_34: { if (p == endp) { return s_n_llhttp__internal__n_start_req_34; } switch (*p) { case 'T': { p++; goto s_n_llhttp__internal__n_start_req_35; } case 'U': { p++; goto s_n_llhttp__internal__n_start_req_36; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_37: s_n_llhttp__internal__n_start_req_37: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_37; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob39, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 38; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_37; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_38: s_n_llhttp__internal__n_start_req_38: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_38; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob40, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_38; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_42: s_n_llhttp__internal__n_start_req_42: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_42; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob41, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 12; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_42; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_43: s_n_llhttp__internal__n_start_req_43: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_43; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob42, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 13; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_43; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_41: s_n_llhttp__internal__n_start_req_41: { if (p == endp) { return s_n_llhttp__internal__n_start_req_41; } switch (*p) { case 'F': { p++; goto s_n_llhttp__internal__n_start_req_42; } case 'P': { p++; goto s_n_llhttp__internal__n_start_req_43; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_40: s_n_llhttp__internal__n_start_req_40: { if (p == endp) { return s_n_llhttp__internal__n_start_req_40; } switch (*p) { case 'P': { p++; goto s_n_llhttp__internal__n_start_req_41; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_39: s_n_llhttp__internal__n_start_req_39: { if (p == endp) { return s_n_llhttp__internal__n_start_req_39; } switch (*p) { case 'I': { p++; match = 34; goto s_n_llhttp__internal__n_invoke_store_method_1; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_40; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_45: s_n_llhttp__internal__n_start_req_45: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_45; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob43, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 29; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_45; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_44: s_n_llhttp__internal__n_start_req_44: { if (p == endp) { return s_n_llhttp__internal__n_start_req_44; } switch (*p) { case 'R': { p++; goto s_n_llhttp__internal__n_start_req_45; } case 'T': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_33: s_n_llhttp__internal__n_start_req_33: { if (p == endp) { return s_n_llhttp__internal__n_start_req_33; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_start_req_34; } case 'L': { p++; goto s_n_llhttp__internal__n_start_req_37; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_38; } case 'R': { p++; goto s_n_llhttp__internal__n_start_req_39; } case 'U': { p++; goto s_n_llhttp__internal__n_start_req_44; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_48: s_n_llhttp__internal__n_start_req_48: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_48; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob44, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 17; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_48; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_49: s_n_llhttp__internal__n_start_req_49: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_49; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob45, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 44; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_49; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_50: s_n_llhttp__internal__n_start_req_50: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_50; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob46, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 43; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_50; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_51: s_n_llhttp__internal__n_start_req_51: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_51; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob47, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 20; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_51; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_47: s_n_llhttp__internal__n_start_req_47: { if (p == endp) { return s_n_llhttp__internal__n_start_req_47; } switch (*p) { case 'B': { p++; goto s_n_llhttp__internal__n_start_req_48; } case 'C': { p++; goto s_n_llhttp__internal__n_start_req_49; } case 'D': { p++; goto s_n_llhttp__internal__n_start_req_50; } case 'P': { p++; goto s_n_llhttp__internal__n_start_req_51; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_46: s_n_llhttp__internal__n_start_req_46: { if (p == endp) { return s_n_llhttp__internal__n_start_req_46; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_start_req_47; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_54: s_n_llhttp__internal__n_start_req_54: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_54; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob48, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 14; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_54; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_56: s_n_llhttp__internal__n_start_req_56: { if (p == endp) { return s_n_llhttp__internal__n_start_req_56; } switch (*p) { case 'P': { p++; match = 37; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_57: s_n_llhttp__internal__n_start_req_57: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_57; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob49, 9); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 42; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_57; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_55: s_n_llhttp__internal__n_start_req_55: { if (p == endp) { return s_n_llhttp__internal__n_start_req_55; } switch (*p) { case 'U': { p++; goto s_n_llhttp__internal__n_start_req_56; } case '_': { p++; goto s_n_llhttp__internal__n_start_req_57; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_53: s_n_llhttp__internal__n_start_req_53: { if (p == endp) { return s_n_llhttp__internal__n_start_req_53; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_start_req_54; } case 'T': { p++; goto s_n_llhttp__internal__n_start_req_55; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_58: s_n_llhttp__internal__n_start_req_58: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_58; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob50, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 33; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_58; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_59: s_n_llhttp__internal__n_start_req_59: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_59; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob51, 7); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 26; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_59; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_52: s_n_llhttp__internal__n_start_req_52: { if (p == endp) { return s_n_llhttp__internal__n_start_req_52; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_start_req_53; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_58; } case 'U': { p++; goto s_n_llhttp__internal__n_start_req_59; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_61: s_n_llhttp__internal__n_start_req_61: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_61; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob52, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 40; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_61; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_62: s_n_llhttp__internal__n_start_req_62: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_62; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob53, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_62; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_60: s_n_llhttp__internal__n_start_req_60: { if (p == endp) { return s_n_llhttp__internal__n_start_req_60; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_start_req_61; } case 'R': { p++; goto s_n_llhttp__internal__n_start_req_62; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_65: s_n_llhttp__internal__n_start_req_65: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_65; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob54, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 18; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_65; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_67: s_n_llhttp__internal__n_start_req_67: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_67; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob55, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 32; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_67; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_68: s_n_llhttp__internal__n_start_req_68: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_68; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob56, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 15; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_68; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_66: s_n_llhttp__internal__n_start_req_66: { if (p == endp) { return s_n_llhttp__internal__n_start_req_66; } switch (*p) { case 'I': { p++; goto s_n_llhttp__internal__n_start_req_67; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_68; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_69: s_n_llhttp__internal__n_start_req_69: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_69; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob57, 8); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 27; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_69; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_64: s_n_llhttp__internal__n_start_req_64: { if (p == endp) { return s_n_llhttp__internal__n_start_req_64; } switch (*p) { case 'B': { p++; goto s_n_llhttp__internal__n_start_req_65; } case 'L': { p++; goto s_n_llhttp__internal__n_start_req_66; } case 'S': { p++; goto s_n_llhttp__internal__n_start_req_69; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_63: s_n_llhttp__internal__n_start_req_63: { if (p == endp) { return s_n_llhttp__internal__n_start_req_63; } switch (*p) { case 'N': { p++; goto s_n_llhttp__internal__n_start_req_64; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req: s_n_llhttp__internal__n_start_req: { if (p == endp) { return s_n_llhttp__internal__n_start_req; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_start_req_1; } case 'B': { p++; goto s_n_llhttp__internal__n_start_req_4; } case 'C': { p++; goto s_n_llhttp__internal__n_start_req_5; } case 'D': { p++; goto s_n_llhttp__internal__n_start_req_10; } case 'F': { p++; goto s_n_llhttp__internal__n_start_req_14; } case 'G': { p++; goto s_n_llhttp__internal__n_start_req_15; } case 'H': { p++; goto s_n_llhttp__internal__n_start_req_18; } case 'L': { p++; goto s_n_llhttp__internal__n_start_req_19; } case 'M': { p++; goto s_n_llhttp__internal__n_start_req_22; } case 'N': { p++; goto s_n_llhttp__internal__n_start_req_31; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_32; } case 'P': { p++; goto s_n_llhttp__internal__n_start_req_33; } case 'R': { p++; goto s_n_llhttp__internal__n_start_req_46; } case 'S': { p++; goto s_n_llhttp__internal__n_start_req_52; } case 'T': { p++; goto s_n_llhttp__internal__n_start_req_60; } case 'U': { p++; goto s_n_llhttp__internal__n_start_req_63; } default: { goto s_n_llhttp__internal__n_error_58; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_status_complete: s_n_llhttp__internal__n_invoke_llhttp__on_status_complete: { switch (llhttp__on_status_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_start; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_line_almost_done: s_n_llhttp__internal__n_res_line_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_res_line_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status: s_n_llhttp__internal__n_res_status: { if (p == endp) { return s_n_llhttp__internal__n_res_status; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_status; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_status_1; } default: { p++; goto s_n_llhttp__internal__n_res_status; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_status: s_n_llhttp__internal__n_span_start_llhttp__on_status: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_status; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_status; goto s_n_llhttp__internal__n_res_status; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status_start: s_n_llhttp__internal__n_res_status_start: { if (p == endp) { return s_n_llhttp__internal__n_res_status_start; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; } case 13: { p++; goto s_n_llhttp__internal__n_res_line_almost_done; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_status; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status_code_otherwise: s_n_llhttp__internal__n_res_status_code_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_res_status_code_otherwise; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_res_status_start; } case 13: { goto s_n_llhttp__internal__n_res_status_start; } case ' ': { p++; goto s_n_llhttp__internal__n_res_status_start; } default: { goto s_n_llhttp__internal__n_error_52; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status_code: s_n_llhttp__internal__n_res_status_code: { if (p == endp) { return s_n_llhttp__internal__n_res_status_code; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } default: { goto s_n_llhttp__internal__n_res_status_code_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_http_end: s_n_llhttp__internal__n_res_http_end: { if (p == endp) { return s_n_llhttp__internal__n_res_http_end; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_invoke_update_status_code; } default: { goto s_n_llhttp__internal__n_error_53; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_http_minor: s_n_llhttp__internal__n_res_http_minor: { if (p == endp) { return s_n_llhttp__internal__n_res_http_minor; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } default: { goto s_n_llhttp__internal__n_error_54; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_http_dot: s_n_llhttp__internal__n_res_http_dot: { if (p == endp) { return s_n_llhttp__internal__n_res_http_dot; } switch (*p) { case '.': { p++; goto s_n_llhttp__internal__n_res_http_minor; } default: { goto s_n_llhttp__internal__n_error_55; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_http_major: s_n_llhttp__internal__n_res_http_major: { if (p == endp) { return s_n_llhttp__internal__n_res_http_major; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } default: { goto s_n_llhttp__internal__n_error_56; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_res: s_n_llhttp__internal__n_start_res: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_res; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob58, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_res_http_major; } case kMatchPause: { return s_n_llhttp__internal__n_start_res; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_59; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method_2: s_n_llhttp__internal__n_req_or_res_method_2: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_2; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob59, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_method; } case kMatchPause: { return s_n_llhttp__internal__n_req_or_res_method_2; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_57; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method_3: s_n_llhttp__internal__n_req_or_res_method_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_3; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob60, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_type_1; } case kMatchPause: { return s_n_llhttp__internal__n_req_or_res_method_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_57; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method_1: s_n_llhttp__internal__n_req_or_res_method_1: { if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_1; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_req_or_res_method_2; } case 'T': { p++; goto s_n_llhttp__internal__n_req_or_res_method_3; } default: { goto s_n_llhttp__internal__n_error_57; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method: s_n_llhttp__internal__n_req_or_res_method: { if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method; } switch (*p) { case 'H': { p++; goto s_n_llhttp__internal__n_req_or_res_method_1; } default: { goto s_n_llhttp__internal__n_error_57; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_or_res: s_n_llhttp__internal__n_start_req_or_res: { if (p == endp) { return s_n_llhttp__internal__n_start_req_or_res; } switch (*p) { case 'H': { goto s_n_llhttp__internal__n_req_or_res_method; } default: { goto s_n_llhttp__internal__n_invoke_update_type_2; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_load_type: s_n_llhttp__internal__n_invoke_load_type: { switch (llhttp__internal__c_load_type(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_start_req; case 2: goto s_n_llhttp__internal__n_start_res; default: goto s_n_llhttp__internal__n_start_req_or_res; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start: s_n_llhttp__internal__n_start: { if (p == endp) { return s_n_llhttp__internal__n_start; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_start; } case 13: { p++; goto s_n_llhttp__internal__n_start; } default: { goto s_n_llhttp__internal__n_invoke_update_finish; } } /* UNREACHABLE */; abort(); } default: /* UNREACHABLE */ abort(); } s_n_llhttp__internal__n_error_1: { state->error = 0x7; state->reason = "Invalid characters in url (strict mode)"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_45: { state->error = 0x7; state->reason = "Invalid characters in url"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_finish_2: { switch (llhttp__internal__c_update_finish_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_start; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_4: { state->error = 0x5; state->reason = "Data after `Connection: close`"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_update_finish_2; default: goto s_n_llhttp__internal__n_closed; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_finish_1: { switch (llhttp__internal__c_update_finish_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_test_lenient_flags; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_5: { state->error = 0x15; state->reason = "on_message_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_is_equal_upgrade; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_14: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_7: { state->error = 0x15; state->reason = "on_chunk_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_17: { state->error = 0x14; state->reason = "`on_chunk_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_1: { switch (llhttp__on_chunk_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; case 21: goto s_n_llhttp__internal__n_pause_7; default: goto s_n_llhttp__internal__n_error_17; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_16: { state->error = 0x4; state->reason = "Content-Length can't be present with Transfer-Encoding"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_2: { state->error = 0x15; state->reason = "on_message_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_pause_1; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_5: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_1: { switch (llhttp__on_message_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_pause_1; case 21: goto s_n_llhttp__internal__n_pause_2; default: goto s_n_llhttp__internal__n_error_5; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_12: { state->error = 0xc; state->reason = "Chunk size overflow"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_3: { state->error = 0x15; state->reason = "on_chunk_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_update_content_length; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_7: { state->error = 0x14; state->reason = "`on_chunk_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete: { switch (llhttp__on_chunk_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_update_content_length; case 21: goto s_n_llhttp__internal__n_pause_3; default: goto s_n_llhttp__internal__n_error_7; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_8: { state->error = 0x2; state->reason = "Expected CRLF after chunk"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_body: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_body(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_data_almost_done; return s_error; } goto s_n_llhttp__internal__n_chunk_data_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags: { switch (llhttp__internal__c_or_flags(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_start; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_4: { state->error = 0x15; state->reason = "on_chunk_header pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_is_equal_content_length; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_6: { state->error = 0x13; state->reason = "`on_chunk_header` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header: { switch (llhttp__on_chunk_header(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_is_equal_content_length; case 21: goto s_n_llhttp__internal__n_pause_4; default: goto s_n_llhttp__internal__n_error_6; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_9: { state->error = 0x2; state->reason = "Expected LF after chunk size"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_10: { state->error = 0x2; state->reason = "Invalid character in chunk parameters"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_11: { state->error = 0xc; state->reason = "Invalid character in chunk size"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_content_length: { switch (llhttp__internal__c_mul_add_content_length(state, p, endp, match)) { case 1: goto s_n_llhttp__internal__n_error_12; default: goto s_n_llhttp__internal__n_chunk_size; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_13: { state->error = 0xc; state->reason = "Invalid character in chunk size"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_body_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_body(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_finish_3: { switch (llhttp__internal__c_update_finish_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_body_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_15: { state->error = 0xf; state->reason = "Request has invalid `Transfer-Encoding`"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause: { state->error = 0x15; state->reason = "on_message_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_3: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_message_complete: { switch (llhttp__on_message_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; case 21: goto s_n_llhttp__internal__n_pause; default: goto s_n_llhttp__internal__n_error_3; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_1: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_2: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_upgrade: { switch (llhttp__internal__c_update_upgrade(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_or_flags_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_6: { state->error = 0x15; state->reason = "Paused by on_headers_complete"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_2: { state->error = 0x11; state->reason = "User callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete: { switch (llhttp__on_headers_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; case 1: goto s_n_llhttp__internal__n_invoke_or_flags_1; case 2: goto s_n_llhttp__internal__n_invoke_update_upgrade; case 21: goto s_n_llhttp__internal__n_pause_6; default: goto s_n_llhttp__internal__n_error_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete: { switch (llhttp__before_headers_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_1: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_error_16; default: goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags_1: { switch (llhttp__internal__c_test_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_1; default: goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags: { switch (llhttp__internal__c_test_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_1; default: goto s_n_llhttp__internal__n_invoke_test_flags_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_18: { state->error = 0x2; state->reason = "Expected LF after headers"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_field: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_19; return s_error; } p++; goto s_n_llhttp__internal__n_error_19; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_2: { switch (llhttp__internal__c_test_lenient_flags_2(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_field_colon_discard_ws; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_20: { state->error = 0xb; state->reason = "Empty Content-Length"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_3: { switch (llhttp__internal__c_or_flags_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_4: { switch (llhttp__internal__c_or_flags_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_5: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_6: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_1: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: goto s_n_llhttp__internal__n_invoke_or_flags_3; case 6: goto s_n_llhttp__internal__n_invoke_or_flags_4; case 7: goto s_n_llhttp__internal__n_invoke_or_flags_5; case 8: goto s_n_llhttp__internal__n_invoke_or_flags_6; default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 2: goto s_n_llhttp__internal__n_error_20; default: goto s_n_llhttp__internal__n_invoke_load_header_state_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_21: { state->error = 0x2; state->reason = "Expected LF after CR"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_1: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_7: { switch (llhttp__internal__c_or_flags_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_8: { switch (llhttp__internal__c_or_flags_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_9: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_10: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_3: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: goto s_n_llhttp__internal__n_invoke_or_flags_7; case 6: goto s_n_llhttp__internal__n_invoke_or_flags_8; case 7: goto s_n_llhttp__internal__n_invoke_or_flags_9; case 8: goto s_n_llhttp__internal__n_invoke_or_flags_10; default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_22: { state->error = 0x3; state->reason = "Missing expected LF after header value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; return s_error; } goto s_n_llhttp__internal__n_header_value_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; return s_error; } p++; goto s_n_llhttp__internal__n_header_value_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; return s_error; } p++; goto s_n_llhttp__internal__n_header_value_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_23: { state->error = 0xa; state->reason = "Invalid header value char"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_3: { switch (llhttp__internal__c_test_lenient_flags_2(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_lenient; default: goto s_n_llhttp__internal__n_error_23; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_3: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_11: { switch (llhttp__internal__c_or_flags_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_3; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_12: { switch (llhttp__internal__c_or_flags_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_3; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_13: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_3; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_14: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_4: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: goto s_n_llhttp__internal__n_invoke_or_flags_11; case 6: goto s_n_llhttp__internal__n_invoke_or_flags_12; case 7: goto s_n_llhttp__internal__n_invoke_or_flags_13; case 8: goto s_n_llhttp__internal__n_invoke_or_flags_14; default: goto s_n_llhttp__internal__n_header_value_connection; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_4: { switch (llhttp__internal__c_update_header_state_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_token; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_2: { switch (llhttp__internal__c_update_header_state_2(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_5: { switch (llhttp__internal__c_update_header_state_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_6: { switch (llhttp__internal__c_update_header_state_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_25; return s_error; } goto s_n_llhttp__internal__n_error_25; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_content_length_1: { switch (llhttp__internal__c_mul_add_content_length_1(state, p, endp, match)) { case 1: goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4; default: goto s_n_llhttp__internal__n_header_value_content_length; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_15: { switch (llhttp__internal__c_or_flags_15(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_otherwise; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_26; return s_error; } goto s_n_llhttp__internal__n_error_26; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_24: { state->error = 0x4; state->reason = "Duplicate Content-Length"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags_2: { switch (llhttp__internal__c_test_flags_2(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_header_value_content_length; default: goto s_n_llhttp__internal__n_error_24; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_7: { switch (llhttp__internal__c_update_header_state_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_otherwise; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_8: { switch (llhttp__internal__c_update_header_state_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_and_flags: { switch (llhttp__internal__c_and_flags(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_te_chunked; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_16: { switch (llhttp__internal__c_or_flags_16(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_and_flags; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_17: { switch (llhttp__internal__c_or_flags_17(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_8; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_2: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_connection; case 2: goto s_n_llhttp__internal__n_invoke_test_flags_2; case 3: goto s_n_llhttp__internal__n_invoke_or_flags_16; case 4: goto s_n_llhttp__internal__n_invoke_or_flags_17; default: goto s_n_llhttp__internal__n_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_field_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_27: { state->error = 0xa; state->reason = "Invalid header token"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_9: { switch (llhttp__internal__c_update_header_state_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_general; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_header_state: { switch (llhttp__internal__c_store_header_state(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_header_field_colon; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_10: { switch (llhttp__internal__c_update_header_state_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_general; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_url_complete: { switch (llhttp__on_url_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_start; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_http_minor: { switch (llhttp__internal__c_update_http_minor(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_url_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_http_major: { switch (llhttp__internal__c_update_http_major(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_http_minor; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_3: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_28: { state->error = 0x7; state->reason = "Expected CRLF"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_4: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_31: { state->error = 0x17; state->reason = "Pause on PRI/Upgrade"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_32: { state->error = 0x9; state->reason = "Expected HTTP/2 Connection Preface"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_30: { state->error = 0x9; state->reason = "Expected CRLF after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_method_1: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 34: goto s_n_llhttp__internal__n_req_pri_upgrade; default: goto s_n_llhttp__internal__n_req_http_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_minor: { switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_invoke_load_method_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_33: { state->error = 0x9; state->reason = "Invalid minor version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_34: { state->error = 0x9; state->reason = "Expected dot"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_major: { switch (llhttp__internal__c_store_http_major(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_req_http_dot; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_35: { state->error = 0x9; state->reason = "Invalid major version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_29: { state->error = 0x8; state->reason = "Invalid method for HTTP/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_method: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_req_http_major; case 1: goto s_n_llhttp__internal__n_req_http_major; case 2: goto s_n_llhttp__internal__n_req_http_major; case 3: goto s_n_llhttp__internal__n_req_http_major; case 4: goto s_n_llhttp__internal__n_req_http_major; case 5: goto s_n_llhttp__internal__n_req_http_major; case 6: goto s_n_llhttp__internal__n_req_http_major; case 7: goto s_n_llhttp__internal__n_req_http_major; case 8: goto s_n_llhttp__internal__n_req_http_major; case 9: goto s_n_llhttp__internal__n_req_http_major; case 10: goto s_n_llhttp__internal__n_req_http_major; case 11: goto s_n_llhttp__internal__n_req_http_major; case 12: goto s_n_llhttp__internal__n_req_http_major; case 13: goto s_n_llhttp__internal__n_req_http_major; case 14: goto s_n_llhttp__internal__n_req_http_major; case 15: goto s_n_llhttp__internal__n_req_http_major; case 16: goto s_n_llhttp__internal__n_req_http_major; case 17: goto s_n_llhttp__internal__n_req_http_major; case 18: goto s_n_llhttp__internal__n_req_http_major; case 19: goto s_n_llhttp__internal__n_req_http_major; case 20: goto s_n_llhttp__internal__n_req_http_major; case 21: goto s_n_llhttp__internal__n_req_http_major; case 22: goto s_n_llhttp__internal__n_req_http_major; case 23: goto s_n_llhttp__internal__n_req_http_major; case 24: goto s_n_llhttp__internal__n_req_http_major; case 25: goto s_n_llhttp__internal__n_req_http_major; case 26: goto s_n_llhttp__internal__n_req_http_major; case 27: goto s_n_llhttp__internal__n_req_http_major; case 28: goto s_n_llhttp__internal__n_req_http_major; case 29: goto s_n_llhttp__internal__n_req_http_major; case 30: goto s_n_llhttp__internal__n_req_http_major; case 31: goto s_n_llhttp__internal__n_req_http_major; case 32: goto s_n_llhttp__internal__n_req_http_major; case 33: goto s_n_llhttp__internal__n_req_http_major; case 34: goto s_n_llhttp__internal__n_req_http_major; default: goto s_n_llhttp__internal__n_error_29; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_38: { state->error = 0x8; state->reason = "Expected HTTP/"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_36: { state->error = 0x8; state->reason = "Expected SOURCE method for ICE/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_method_2: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 33: goto s_n_llhttp__internal__n_req_http_major; default: goto s_n_llhttp__internal__n_error_36; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_37: { state->error = 0x8; state->reason = "Invalid method for RTSP/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_method_3: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_req_http_major; case 3: goto s_n_llhttp__internal__n_req_http_major; case 6: goto s_n_llhttp__internal__n_req_http_major; case 35: goto s_n_llhttp__internal__n_req_http_major; case 36: goto s_n_llhttp__internal__n_req_http_major; case 37: goto s_n_llhttp__internal__n_req_http_major; case 38: goto s_n_llhttp__internal__n_req_http_major; case 39: goto s_n_llhttp__internal__n_req_http_major; case 40: goto s_n_llhttp__internal__n_req_http_major; case 41: goto s_n_llhttp__internal__n_req_http_major; case 42: goto s_n_llhttp__internal__n_req_http_major; case 43: goto s_n_llhttp__internal__n_req_http_major; case 44: goto s_n_llhttp__internal__n_req_http_major; case 45: goto s_n_llhttp__internal__n_req_http_major; default: goto s_n_llhttp__internal__n_error_37; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_url_complete_1: { switch (llhttp__on_url_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_req_http_start; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_5: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_6: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_7: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_8: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_39: { state->error = 0x7; state->reason = "Invalid char in url fragment start"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_9: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_10: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_11: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_40: { state->error = 0x7; state->reason = "Invalid char in url query"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_41: { state->error = 0x7; state->reason = "Invalid char in url path"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_12: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_13: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_14: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_42: { state->error = 0x7; state->reason = "Double @ in url"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_43: { state->error = 0x7; state->reason = "Unexpected char in url server"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_44: { state->error = 0x7; state->reason = "Unexpected char in url server"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_46: { state->error = 0x7; state->reason = "Unexpected char in url schema"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_47: { state->error = 0x7; state->reason = "Unexpected char in url schema"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_48: { state->error = 0x7; state->reason = "Unexpected start char in url"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_is_equal_method: { switch (llhttp__internal__c_is_equal_method(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_url_entry_normal; default: goto s_n_llhttp__internal__n_url_entry_connect; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_49: { state->error = 0x6; state->reason = "Expected space after method"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_method_1: { switch (llhttp__internal__c_store_method(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_req_first_space_before_url; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_58: { state->error = 0x6; state->reason = "Invalid method encountered"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_50: { state->error = 0xd; state->reason = "Response overflow"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_status_code: { switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { case 1: goto s_n_llhttp__internal__n_error_50; default: goto s_n_llhttp__internal__n_res_status_code; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_51: { state->error = 0x2; state->reason = "Expected LF after CR"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_status: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_status(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_status_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_status(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_res_line_almost_done; return s_error; } p++; goto s_n_llhttp__internal__n_res_line_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_52: { state->error = 0xd; state->reason = "Invalid response status"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_status_code: { switch (llhttp__internal__c_update_status_code(state, p, endp)) { default: goto s_n_llhttp__internal__n_res_status_code; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_53: { state->error = 0x9; state->reason = "Expected space after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_minor_1: { switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_res_http_end; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_54: { state->error = 0x9; state->reason = "Invalid minor version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_55: { state->error = 0x9; state->reason = "Expected dot"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_major_1: { switch (llhttp__internal__c_store_http_major(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_res_http_dot; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_56: { state->error = 0x9; state->reason = "Invalid major version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_59: { state->error = 0x8; state->reason = "Expected HTTP/"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_type: { switch (llhttp__internal__c_update_type(state, p, endp)) { default: goto s_n_llhttp__internal__n_req_first_space_before_url; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_method: { switch (llhttp__internal__c_store_method(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_invoke_update_type; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_57: { state->error = 0x8; state->reason = "Invalid word encountered"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_type_1: { switch (llhttp__internal__c_update_type_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_res_http_major; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_type_2: { switch (llhttp__internal__c_update_type(state, p, endp)) { default: goto s_n_llhttp__internal__n_start_req; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_8: { state->error = 0x15; state->reason = "on_message_begin pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_type; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error: { state->error = 0x10; state->reason = "`on_message_begin` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_message_begin: { switch (llhttp__on_message_begin(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_load_type; case 21: goto s_n_llhttp__internal__n_pause_8; default: goto s_n_llhttp__internal__n_error; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_finish: { switch (llhttp__internal__c_update_finish(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_begin; } /* UNREACHABLE */; abort(); } } int llhttp__internal_execute(llhttp__internal_t* state, const char* p, const char* endp) { llparse_state_t next; /* check lingering errors */ if (state->error != 0) { return state->error; } /* restart spans */ if (state->_span_pos0 != NULL) { state->_span_pos0 = (void*) p; } next = llhttp__internal__run(state, (const unsigned char*) p, (const unsigned char*) endp); if (next == s_error) { return state->error; } state->_current = (void*) (intptr_t) next; /* execute spans */ if (state->_span_pos0 != NULL) { int error; error = ((llhttp__internal__span_cb) state->_span_cb0)(state, state->_span_pos0, (const char*) endp); if (error != 0) { state->error = error; state->error_pos = endp; return error; } } return 0; } #else /* !LLHTTP_STRICT_MODE */ #include #include #include #ifdef __SSE4_2__ #ifdef _MSC_VER #include #else /* !_MSC_VER */ #include #endif /* _MSC_VER */ #endif /* __SSE4_2__ */ #ifdef _MSC_VER #define ALIGN(n) _declspec(align(n)) #else /* !_MSC_VER */ #define ALIGN(n) __attribute__((aligned(n))) #endif /* _MSC_VER */ #include "llhttp.h" typedef int (*llhttp__internal__span_cb)( llhttp__internal_t*, const char*, const char*); #ifdef __SSE4_2__ static const unsigned char ALIGN(16) llparse_blob0[] = { 0x9, 0x9, 0xc, 0xc, '!', '"', '$', '>', '@', '~', 0x80, 0xff, 0x0, 0x0, 0x0, 0x0 }; #endif /* __SSE4_2__ */ static const unsigned char llparse_blob1[] = { 'o', 'n' }; static const unsigned char llparse_blob2[] = { 'e', 'c', 't', 'i', 'o', 'n' }; static const unsigned char llparse_blob3[] = { 'l', 'o', 's', 'e' }; static const unsigned char llparse_blob4[] = { 'e', 'e', 'p', '-', 'a', 'l', 'i', 'v', 'e' }; static const unsigned char llparse_blob5[] = { 'p', 'g', 'r', 'a', 'd', 'e' }; static const unsigned char llparse_blob6[] = { 'c', 'h', 'u', 'n', 'k', 'e', 'd' }; #ifdef __SSE4_2__ static const unsigned char ALIGN(16) llparse_blob7[] = { 0x9, 0x9, ' ', '~', 0x80, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; #endif /* __SSE4_2__ */ #ifdef __SSE4_2__ static const unsigned char ALIGN(16) llparse_blob8[] = { ' ', '!', '#', '\'', '*', '+', '-', '.', '0', '9', 'A', 'Z', '^', 'z', '|', '|' }; #endif /* __SSE4_2__ */ #ifdef __SSE4_2__ static const unsigned char ALIGN(16) llparse_blob9[] = { '~', '~', 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; #endif /* __SSE4_2__ */ static const unsigned char llparse_blob10[] = { 'e', 'n', 't', '-', 'l', 'e', 'n', 'g', 't', 'h' }; static const unsigned char llparse_blob11[] = { 'r', 'o', 'x', 'y', '-', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n' }; static const unsigned char llparse_blob12[] = { 'r', 'a', 'n', 's', 'f', 'e', 'r', '-', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g' }; static const unsigned char llparse_blob13[] = { 'p', 'g', 'r', 'a', 'd', 'e' }; static const unsigned char llparse_blob14[] = { 0xd, 0xa }; static const unsigned char llparse_blob15[] = { 'T', 'T', 'P', '/' }; static const unsigned char llparse_blob16[] = { 0xd, 0xa, 0xd, 0xa, 'S', 'M', 0xd, 0xa, 0xd, 0xa }; static const unsigned char llparse_blob17[] = { 'C', 'E', '/' }; static const unsigned char llparse_blob18[] = { 'T', 'S', 'P', '/' }; static const unsigned char llparse_blob19[] = { 'N', 'O', 'U', 'N', 'C', 'E' }; static const unsigned char llparse_blob20[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob21[] = { 'E', 'C', 'K', 'O', 'U', 'T' }; static const unsigned char llparse_blob22[] = { 'N', 'E', 'C', 'T' }; static const unsigned char llparse_blob23[] = { 'E', 'T', 'E' }; static const unsigned char llparse_blob24[] = { 'C', 'R', 'I', 'B', 'E' }; static const unsigned char llparse_blob25[] = { 'L', 'U', 'S', 'H' }; static const unsigned char llparse_blob26[] = { 'E', 'T' }; static const unsigned char llparse_blob27[] = { 'P', 'A', 'R', 'A', 'M', 'E', 'T', 'E', 'R' }; static const unsigned char llparse_blob28[] = { 'E', 'A', 'D' }; static const unsigned char llparse_blob29[] = { 'N', 'K' }; static const unsigned char llparse_blob30[] = { 'C', 'K' }; static const unsigned char llparse_blob31[] = { 'S', 'E', 'A', 'R', 'C', 'H' }; static const unsigned char llparse_blob32[] = { 'R', 'G', 'E' }; static const unsigned char llparse_blob33[] = { 'C', 'T', 'I', 'V', 'I', 'T', 'Y' }; static const unsigned char llparse_blob34[] = { 'L', 'E', 'N', 'D', 'A', 'R' }; static const unsigned char llparse_blob35[] = { 'V', 'E' }; static const unsigned char llparse_blob36[] = { 'O', 'T', 'I', 'F', 'Y' }; static const unsigned char llparse_blob37[] = { 'P', 'T', 'I', 'O', 'N', 'S' }; static const unsigned char llparse_blob38[] = { 'C', 'H' }; static const unsigned char llparse_blob39[] = { 'S', 'E' }; static const unsigned char llparse_blob40[] = { 'A', 'Y' }; static const unsigned char llparse_blob41[] = { 'S', 'T' }; static const unsigned char llparse_blob42[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob43[] = { 'A', 'T', 'C', 'H' }; static const unsigned char llparse_blob44[] = { 'G', 'E' }; static const unsigned char llparse_blob45[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob46[] = { 'O', 'R', 'D' }; static const unsigned char llparse_blob47[] = { 'I', 'R', 'E', 'C', 'T' }; static const unsigned char llparse_blob48[] = { 'O', 'R', 'T' }; static const unsigned char llparse_blob49[] = { 'R', 'C', 'H' }; static const unsigned char llparse_blob50[] = { 'P', 'A', 'R', 'A', 'M', 'E', 'T', 'E', 'R' }; static const unsigned char llparse_blob51[] = { 'U', 'R', 'C', 'E' }; static const unsigned char llparse_blob52[] = { 'B', 'S', 'C', 'R', 'I', 'B', 'E' }; static const unsigned char llparse_blob53[] = { 'A', 'R', 'D', 'O', 'W', 'N' }; static const unsigned char llparse_blob54[] = { 'A', 'C', 'E' }; static const unsigned char llparse_blob55[] = { 'I', 'N', 'D' }; static const unsigned char llparse_blob56[] = { 'N', 'K' }; static const unsigned char llparse_blob57[] = { 'C', 'K' }; static const unsigned char llparse_blob58[] = { 'U', 'B', 'S', 'C', 'R', 'I', 'B', 'E' }; static const unsigned char llparse_blob59[] = { 'H', 'T', 'T', 'P', '/' }; static const unsigned char llparse_blob60[] = { 'A', 'D' }; static const unsigned char llparse_blob61[] = { 'T', 'P', '/' }; enum llparse_match_status_e { kMatchComplete, kMatchPause, kMatchMismatch }; typedef enum llparse_match_status_e llparse_match_status_t; struct llparse_match_s { llparse_match_status_t status; const unsigned char* current; }; typedef struct llparse_match_s llparse_match_t; static llparse_match_t llparse__match_sequence_to_lower( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { uint32_t index; llparse_match_t res; index = s->_index; for (; p != endp; p++) { unsigned char current; current = ((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p)); if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; goto reset; } } else { res.status = kMatchMismatch; goto reset; } } s->_index = index; res.status = kMatchPause; res.current = p; return res; reset: s->_index = 0; res.current = p; return res; } static llparse_match_t llparse__match_sequence_to_lower_unsafe( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { uint32_t index; llparse_match_t res; index = s->_index; for (; p != endp; p++) { unsigned char current; current = ((*p) | 0x20); if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; goto reset; } } else { res.status = kMatchMismatch; goto reset; } } s->_index = index; res.status = kMatchPause; res.current = p; return res; reset: s->_index = 0; res.current = p; return res; } static llparse_match_t llparse__match_sequence_id( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { uint32_t index; llparse_match_t res; index = s->_index; for (; p != endp; p++) { unsigned char current; current = *p; if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; goto reset; } } else { res.status = kMatchMismatch; goto reset; } } s->_index = index; res.status = kMatchPause; res.current = p; return res; reset: s->_index = 0; res.current = p; return res; } enum llparse_state_e { s_error, s_n_llhttp__internal__n_closed, s_n_llhttp__internal__n_invoke_llhttp__after_message_complete, s_n_llhttp__internal__n_pause_1, s_n_llhttp__internal__n_invoke_is_equal_upgrade, s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2, s_n_llhttp__internal__n_chunk_data_almost_done_skip, s_n_llhttp__internal__n_chunk_data_almost_done, s_n_llhttp__internal__n_consume_content_length, s_n_llhttp__internal__n_span_start_llhttp__on_body, s_n_llhttp__internal__n_invoke_is_equal_content_length, s_n_llhttp__internal__n_chunk_size_almost_done, s_n_llhttp__internal__n_chunk_parameters, s_n_llhttp__internal__n_chunk_size_otherwise, s_n_llhttp__internal__n_chunk_size, s_n_llhttp__internal__n_chunk_size_digit, s_n_llhttp__internal__n_invoke_update_content_length, s_n_llhttp__internal__n_consume_content_length_1, s_n_llhttp__internal__n_span_start_llhttp__on_body_1, s_n_llhttp__internal__n_eof, s_n_llhttp__internal__n_span_start_llhttp__on_body_2, s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete, s_n_llhttp__internal__n_headers_almost_done, s_n_llhttp__internal__n_header_field_colon_discard_ws, s_n_llhttp__internal__n_error_14, s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete, s_n_llhttp__internal__n_span_start_llhttp__on_header_value, s_n_llhttp__internal__n_header_value_discard_lws, s_n_llhttp__internal__n_header_value_discard_ws_almost_done, s_n_llhttp__internal__n_header_value_lws, s_n_llhttp__internal__n_header_value_almost_done, s_n_llhttp__internal__n_header_value_lenient, s_n_llhttp__internal__n_header_value_otherwise, s_n_llhttp__internal__n_header_value_connection_token, s_n_llhttp__internal__n_header_value_connection_ws, s_n_llhttp__internal__n_header_value_connection_1, s_n_llhttp__internal__n_header_value_connection_2, s_n_llhttp__internal__n_header_value_connection_3, s_n_llhttp__internal__n_header_value_connection, s_n_llhttp__internal__n_error_19, s_n_llhttp__internal__n_error_20, s_n_llhttp__internal__n_header_value_content_length_ws, s_n_llhttp__internal__n_header_value_content_length, s_n_llhttp__internal__n_header_value_te_chunked_last, s_n_llhttp__internal__n_header_value_te_token_ows, s_n_llhttp__internal__n_header_value, s_n_llhttp__internal__n_header_value_te_token, s_n_llhttp__internal__n_header_value_te_chunked, s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1, s_n_llhttp__internal__n_header_value_discard_ws, s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete, s_n_llhttp__internal__n_header_field_general_otherwise, s_n_llhttp__internal__n_header_field_general, s_n_llhttp__internal__n_header_field_colon, s_n_llhttp__internal__n_header_field_3, s_n_llhttp__internal__n_header_field_4, s_n_llhttp__internal__n_header_field_2, s_n_llhttp__internal__n_header_field_1, s_n_llhttp__internal__n_header_field_5, s_n_llhttp__internal__n_header_field_6, s_n_llhttp__internal__n_header_field_7, s_n_llhttp__internal__n_header_field, s_n_llhttp__internal__n_span_start_llhttp__on_header_field, s_n_llhttp__internal__n_header_field_start, s_n_llhttp__internal__n_url_skip_to_http09, s_n_llhttp__internal__n_url_skip_lf_to_http09, s_n_llhttp__internal__n_req_pri_upgrade, s_n_llhttp__internal__n_req_http_complete_1, s_n_llhttp__internal__n_req_http_complete, s_n_llhttp__internal__n_req_http_minor, s_n_llhttp__internal__n_req_http_dot, s_n_llhttp__internal__n_req_http_major, s_n_llhttp__internal__n_req_http_start_1, s_n_llhttp__internal__n_req_http_start_2, s_n_llhttp__internal__n_req_http_start_3, s_n_llhttp__internal__n_req_http_start, s_n_llhttp__internal__n_url_skip_to_http, s_n_llhttp__internal__n_url_fragment, s_n_llhttp__internal__n_span_end_stub_query_3, s_n_llhttp__internal__n_url_query, s_n_llhttp__internal__n_url_query_or_fragment, s_n_llhttp__internal__n_url_path, s_n_llhttp__internal__n_span_start_stub_path_2, s_n_llhttp__internal__n_span_start_stub_path, s_n_llhttp__internal__n_span_start_stub_path_1, s_n_llhttp__internal__n_url_server_with_at, s_n_llhttp__internal__n_url_server, s_n_llhttp__internal__n_url_schema_delim_1, s_n_llhttp__internal__n_url_schema_delim, s_n_llhttp__internal__n_span_end_stub_schema, s_n_llhttp__internal__n_url_schema, s_n_llhttp__internal__n_url_start, s_n_llhttp__internal__n_span_start_llhttp__on_url_1, s_n_llhttp__internal__n_span_start_llhttp__on_url, s_n_llhttp__internal__n_req_spaces_before_url, s_n_llhttp__internal__n_req_first_space_before_url, s_n_llhttp__internal__n_start_req_2, s_n_llhttp__internal__n_start_req_3, s_n_llhttp__internal__n_start_req_1, s_n_llhttp__internal__n_start_req_4, s_n_llhttp__internal__n_start_req_6, s_n_llhttp__internal__n_start_req_8, s_n_llhttp__internal__n_start_req_9, s_n_llhttp__internal__n_start_req_7, s_n_llhttp__internal__n_start_req_5, s_n_llhttp__internal__n_start_req_12, s_n_llhttp__internal__n_start_req_13, s_n_llhttp__internal__n_start_req_11, s_n_llhttp__internal__n_start_req_10, s_n_llhttp__internal__n_start_req_14, s_n_llhttp__internal__n_start_req_17, s_n_llhttp__internal__n_start_req_16, s_n_llhttp__internal__n_start_req_15, s_n_llhttp__internal__n_start_req_18, s_n_llhttp__internal__n_start_req_20, s_n_llhttp__internal__n_start_req_21, s_n_llhttp__internal__n_start_req_19, s_n_llhttp__internal__n_start_req_23, s_n_llhttp__internal__n_start_req_24, s_n_llhttp__internal__n_start_req_26, s_n_llhttp__internal__n_start_req_28, s_n_llhttp__internal__n_start_req_29, s_n_llhttp__internal__n_start_req_27, s_n_llhttp__internal__n_start_req_25, s_n_llhttp__internal__n_start_req_30, s_n_llhttp__internal__n_start_req_22, s_n_llhttp__internal__n_start_req_31, s_n_llhttp__internal__n_start_req_32, s_n_llhttp__internal__n_start_req_35, s_n_llhttp__internal__n_start_req_36, s_n_llhttp__internal__n_start_req_34, s_n_llhttp__internal__n_start_req_37, s_n_llhttp__internal__n_start_req_38, s_n_llhttp__internal__n_start_req_42, s_n_llhttp__internal__n_start_req_43, s_n_llhttp__internal__n_start_req_41, s_n_llhttp__internal__n_start_req_40, s_n_llhttp__internal__n_start_req_39, s_n_llhttp__internal__n_start_req_45, s_n_llhttp__internal__n_start_req_44, s_n_llhttp__internal__n_start_req_33, s_n_llhttp__internal__n_start_req_48, s_n_llhttp__internal__n_start_req_49, s_n_llhttp__internal__n_start_req_50, s_n_llhttp__internal__n_start_req_51, s_n_llhttp__internal__n_start_req_47, s_n_llhttp__internal__n_start_req_46, s_n_llhttp__internal__n_start_req_54, s_n_llhttp__internal__n_start_req_56, s_n_llhttp__internal__n_start_req_57, s_n_llhttp__internal__n_start_req_55, s_n_llhttp__internal__n_start_req_53, s_n_llhttp__internal__n_start_req_58, s_n_llhttp__internal__n_start_req_59, s_n_llhttp__internal__n_start_req_52, s_n_llhttp__internal__n_start_req_61, s_n_llhttp__internal__n_start_req_62, s_n_llhttp__internal__n_start_req_60, s_n_llhttp__internal__n_start_req_65, s_n_llhttp__internal__n_start_req_67, s_n_llhttp__internal__n_start_req_68, s_n_llhttp__internal__n_start_req_66, s_n_llhttp__internal__n_start_req_69, s_n_llhttp__internal__n_start_req_64, s_n_llhttp__internal__n_start_req_63, s_n_llhttp__internal__n_start_req, s_n_llhttp__internal__n_invoke_llhttp__on_status_complete, s_n_llhttp__internal__n_res_line_almost_done, s_n_llhttp__internal__n_res_status, s_n_llhttp__internal__n_span_start_llhttp__on_status, s_n_llhttp__internal__n_res_status_start, s_n_llhttp__internal__n_res_status_code_otherwise, s_n_llhttp__internal__n_res_status_code, s_n_llhttp__internal__n_res_http_end, s_n_llhttp__internal__n_res_http_minor, s_n_llhttp__internal__n_res_http_dot, s_n_llhttp__internal__n_res_http_major, s_n_llhttp__internal__n_start_res, s_n_llhttp__internal__n_req_or_res_method_2, s_n_llhttp__internal__n_req_or_res_method_3, s_n_llhttp__internal__n_req_or_res_method_1, s_n_llhttp__internal__n_req_or_res_method, s_n_llhttp__internal__n_start_req_or_res, s_n_llhttp__internal__n_invoke_load_type, s_n_llhttp__internal__n_start, }; typedef enum llparse_state_e llparse_state_t; int llhttp__on_url( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_header_field( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_header_value( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_body( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_status( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_finish( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->finish = 2; return 0; } int llhttp__on_message_begin( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_load_type( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->type; } int llhttp__internal__c_store_method( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->method = match; return 0; } int llhttp__internal__c_is_equal_method( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->method == 5; } int llhttp__internal__c_update_http_major( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->http_major = 0; return 0; } int llhttp__internal__c_update_http_minor( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->http_minor = 9; return 0; } int llhttp__on_url_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_test_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->flags & 128) == 128; } int llhttp__on_chunk_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_message_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_is_equal_upgrade( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->upgrade == 1; } int llhttp__after_message_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_finish_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->finish = 0; return 0; } int llhttp__internal__c_test_lenient_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 4) == 4; } int llhttp__internal__c_test_flags_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->flags & 544) == 544; } int llhttp__internal__c_test_lenient_flags_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 2) == 2; } int llhttp__before_headers_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__on_headers_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__after_headers_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_content_length( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->content_length = 0; return 0; } int llhttp__internal__c_mul_add_content_length( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { /* Multiplication overflow */ if (state->content_length > 0xffffffffffffffffULL / 16) { return 1; } state->content_length *= 16; /* Addition overflow */ if (match >= 0) { if (state->content_length > 0xffffffffffffffffULL - match) { return 1; } } else { if (state->content_length < 0ULL - match) { return 1; } } state->content_length += match; return 0; } int llhttp__on_chunk_header( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_is_equal_content_length( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->content_length == 0; } int llhttp__internal__c_or_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 128; return 0; } int llhttp__internal__c_update_finish_3( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->finish = 1; return 0; } int llhttp__internal__c_or_flags_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 64; return 0; } int llhttp__internal__c_update_upgrade( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->upgrade = 1; return 0; } int llhttp__internal__c_store_header_state( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->header_state = match; return 0; } int llhttp__internal__c_test_lenient_flags_2( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 1) == 1; } int llhttp__on_header_field_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_load_header_state( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->header_state; } int llhttp__internal__c_or_flags_3( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 1; return 0; } int llhttp__internal__c_update_header_state( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 1; return 0; } int llhttp__on_header_value_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_or_flags_4( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 2; return 0; } int llhttp__internal__c_or_flags_5( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 4; return 0; } int llhttp__internal__c_or_flags_6( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 8; return 0; } int llhttp__internal__c_update_header_state_2( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 6; return 0; } int llhttp__internal__c_update_header_state_4( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 0; return 0; } int llhttp__internal__c_update_header_state_5( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 5; return 0; } int llhttp__internal__c_update_header_state_6( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 7; return 0; } int llhttp__internal__c_test_flags_2( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->flags & 32) == 32; } int llhttp__internal__c_mul_add_content_length_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { /* Multiplication overflow */ if (state->content_length > 0xffffffffffffffffULL / 10) { return 1; } state->content_length *= 10; /* Addition overflow */ if (match >= 0) { if (state->content_length > 0xffffffffffffffffULL - match) { return 1; } } else { if (state->content_length < 0ULL - match) { return 1; } } state->content_length += match; return 0; } int llhttp__internal__c_or_flags_15( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 32; return 0; } int llhttp__internal__c_or_flags_16( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 512; return 0; } int llhttp__internal__c_and_flags( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags &= -9; return 0; } int llhttp__internal__c_update_header_state_7( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->header_state = 8; return 0; } int llhttp__internal__c_or_flags_17( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->flags |= 16; return 0; } int llhttp__internal__c_load_method( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return state->method; } int llhttp__internal__c_store_http_major( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->http_major = match; return 0; } int llhttp__internal__c_store_http_minor( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { state->http_minor = match; return 0; } int llhttp__internal__c_update_status_code( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->status_code = 0; return 0; } int llhttp__internal__c_mul_add_status_code( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp, int match) { /* Multiplication overflow */ if (state->status_code > 0xffff / 10) { return 1; } state->status_code *= 10; /* Addition overflow */ if (match >= 0) { if (state->status_code > 0xffff - match) { return 1; } } else { if (state->status_code < 0 - match) { return 1; } } state->status_code += match; /* Enforce maximum */ if (state->status_code > 999) { return 1; } return 0; } int llhttp__on_status_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); int llhttp__internal__c_update_type( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->type = 1; return 0; } int llhttp__internal__c_update_type_1( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { state->type = 2; return 0; } int llhttp__internal_init(llhttp__internal_t* state) { memset(state, 0, sizeof(*state)); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_start; return 0; } static llparse_state_t llhttp__internal__run( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { int match; switch ((llparse_state_t) (intptr_t) state->_current) { case s_n_llhttp__internal__n_closed: s_n_llhttp__internal__n_closed: { if (p == endp) { return s_n_llhttp__internal__n_closed; } p++; goto s_n_llhttp__internal__n_closed; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__after_message_complete: s_n_llhttp__internal__n_invoke_llhttp__after_message_complete: { switch (llhttp__after_message_complete(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_update_finish_2; default: goto s_n_llhttp__internal__n_invoke_update_finish_1; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_pause_1: s_n_llhttp__internal__n_pause_1: { state->error = 0x16; state->reason = "Pause on CONNECT/Upgrade"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_is_equal_upgrade: s_n_llhttp__internal__n_invoke_is_equal_upgrade: { switch (llhttp__internal__c_is_equal_upgrade(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; default: goto s_n_llhttp__internal__n_pause_1; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2: s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2: { switch (llhttp__on_message_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_is_equal_upgrade; case 21: goto s_n_llhttp__internal__n_pause_5; default: goto s_n_llhttp__internal__n_error_10; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_data_almost_done_skip: s_n_llhttp__internal__n_chunk_data_almost_done_skip: { if (p == endp) { return s_n_llhttp__internal__n_chunk_data_almost_done_skip; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_data_almost_done: s_n_llhttp__internal__n_chunk_data_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_chunk_data_almost_done; } p++; goto s_n_llhttp__internal__n_chunk_data_almost_done_skip; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_consume_content_length: s_n_llhttp__internal__n_consume_content_length: { size_t avail; uint64_t need; avail = endp - p; need = state->content_length; if (avail >= need) { p += need; state->content_length = 0; goto s_n_llhttp__internal__n_span_end_llhttp__on_body; } state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_body: s_n_llhttp__internal__n_span_start_llhttp__on_body: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_body; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_consume_content_length; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_is_equal_content_length: s_n_llhttp__internal__n_invoke_is_equal_content_length: { switch (llhttp__internal__c_is_equal_content_length(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_span_start_llhttp__on_body; default: goto s_n_llhttp__internal__n_invoke_or_flags; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size_almost_done: s_n_llhttp__internal__n_chunk_size_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size_almost_done; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_parameters: s_n_llhttp__internal__n_chunk_parameters: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_chunk_parameters; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_chunk_parameters; } case 2: { p++; goto s_n_llhttp__internal__n_chunk_size_almost_done; } default: { goto s_n_llhttp__internal__n_error_6; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size_otherwise: s_n_llhttp__internal__n_chunk_size_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size_otherwise; } switch (*p) { case 13: { p++; goto s_n_llhttp__internal__n_chunk_size_almost_done; } case ' ': { p++; goto s_n_llhttp__internal__n_chunk_parameters; } case ';': { p++; goto s_n_llhttp__internal__n_chunk_parameters; } default: { goto s_n_llhttp__internal__n_error_7; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size: s_n_llhttp__internal__n_chunk_size: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'A': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'B': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'C': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'D': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'E': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'F': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'a': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'b': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'c': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'd': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'e': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'f': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } default: { goto s_n_llhttp__internal__n_chunk_size_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_size_digit: s_n_llhttp__internal__n_chunk_size_digit: { if (p == endp) { return s_n_llhttp__internal__n_chunk_size_digit; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'A': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'B': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'C': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'D': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'E': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'F': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'a': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'b': { p++; match = 11; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'c': { p++; match = 12; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'd': { p++; match = 13; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'e': { p++; match = 14; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } case 'f': { p++; match = 15; goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } default: { goto s_n_llhttp__internal__n_error_9; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_update_content_length: s_n_llhttp__internal__n_invoke_update_content_length: { switch (llhttp__internal__c_update_content_length(state, p, endp)) { default: goto s_n_llhttp__internal__n_chunk_size_digit; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_consume_content_length_1: s_n_llhttp__internal__n_consume_content_length_1: { size_t avail; uint64_t need; avail = endp - p; need = state->content_length; if (avail >= need) { p += need; state->content_length = 0; goto s_n_llhttp__internal__n_span_end_llhttp__on_body_1; } state->content_length -= avail; return s_n_llhttp__internal__n_consume_content_length_1; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_body_1: s_n_llhttp__internal__n_span_start_llhttp__on_body_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_body_1; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_consume_content_length_1; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_eof: s_n_llhttp__internal__n_eof: { if (p == endp) { return s_n_llhttp__internal__n_eof; } p++; goto s_n_llhttp__internal__n_eof; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_body_2: s_n_llhttp__internal__n_span_start_llhttp__on_body_2: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_body_2; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_body; goto s_n_llhttp__internal__n_eof; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete: s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete: { switch (llhttp__after_headers_complete(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_1; case 2: goto s_n_llhttp__internal__n_invoke_update_content_length; case 3: goto s_n_llhttp__internal__n_span_start_llhttp__on_body_1; case 4: goto s_n_llhttp__internal__n_invoke_update_finish_3; case 5: goto s_n_llhttp__internal__n_error_11; default: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_headers_almost_done: s_n_llhttp__internal__n_headers_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_headers_almost_done; } p++; goto s_n_llhttp__internal__n_invoke_test_flags; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_colon_discard_ws: s_n_llhttp__internal__n_header_field_colon_discard_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_field_colon_discard_ws; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_header_field_colon_discard_ws; } default: { goto s_n_llhttp__internal__n_header_field_colon; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_14: s_n_llhttp__internal__n_error_14: { state->error = 0xa; state->reason = "Invalid header field char"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: { switch (llhttp__on_header_value_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_start; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_header_value: s_n_llhttp__internal__n_span_start_llhttp__on_header_value: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_value; goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_discard_lws: s_n_llhttp__internal__n_header_value_discard_lws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_discard_lws; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_header_value_discard_ws; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_discard_ws; } default: { goto s_n_llhttp__internal__n_invoke_load_header_state; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_discard_ws_almost_done: s_n_llhttp__internal__n_header_value_discard_ws_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_header_value_discard_ws_almost_done; } p++; goto s_n_llhttp__internal__n_header_value_discard_lws; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_lws: s_n_llhttp__internal__n_header_value_lws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_lws; } switch (*p) { case 9: { goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } case ' ': { goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } default: { goto s_n_llhttp__internal__n_invoke_load_header_state_3; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_almost_done: s_n_llhttp__internal__n_header_value_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_header_value_almost_done; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_header_value_lws; } default: { goto s_n_llhttp__internal__n_error_16; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_lenient: s_n_llhttp__internal__n_header_value_lenient: { if (p == endp) { return s_n_llhttp__internal__n_header_value_lenient; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3; } default: { p++; goto s_n_llhttp__internal__n_header_value_lenient; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_otherwise: s_n_llhttp__internal__n_header_value_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_header_value_otherwise; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2; } default: { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_3; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_token: s_n_llhttp__internal__n_header_value_connection_token: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 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, 0, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_token; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_value_connection_token; } case 2: { p++; goto s_n_llhttp__internal__n_header_value_connection; } default: { goto s_n_llhttp__internal__n_header_value_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_ws: s_n_llhttp__internal__n_header_value_connection_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_ws; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_header_value_otherwise; } case 13: { goto s_n_llhttp__internal__n_header_value_otherwise; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_connection_ws; } case ',': { p++; goto s_n_llhttp__internal__n_invoke_load_header_state_4; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_4; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_1: s_n_llhttp__internal__n_header_value_connection_1: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_1; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob3, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_header_state_2; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_connection_1; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_2: s_n_llhttp__internal__n_header_value_connection_2: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_2; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob4, 9); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_header_state_5; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_connection_2; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection_3: s_n_llhttp__internal__n_header_value_connection_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_3; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob5, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_header_state_6; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_connection_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_connection: s_n_llhttp__internal__n_header_value_connection: { if (p == endp) { return s_n_llhttp__internal__n_header_value_connection; } switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { case 9: { p++; goto s_n_llhttp__internal__n_header_value_connection; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_connection; } case 'c': { p++; goto s_n_llhttp__internal__n_header_value_connection_1; } case 'k': { p++; goto s_n_llhttp__internal__n_header_value_connection_2; } case 'u': { p++; goto s_n_llhttp__internal__n_header_value_connection_3; } default: { goto s_n_llhttp__internal__n_header_value_connection_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_19: s_n_llhttp__internal__n_error_19: { state->error = 0xb; state->reason = "Content-Length overflow"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_error_20: s_n_llhttp__internal__n_error_20: { state->error = 0xb; state->reason = "Invalid character in Content-Length"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_content_length_ws: s_n_llhttp__internal__n_header_value_content_length_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_content_length_ws; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_invoke_or_flags_15; } case 13: { goto s_n_llhttp__internal__n_invoke_or_flags_15; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_content_length_ws; } default: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_content_length: s_n_llhttp__internal__n_header_value_content_length: { if (p == endp) { return s_n_llhttp__internal__n_header_value_content_length; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; } default: { goto s_n_llhttp__internal__n_header_value_content_length_ws; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_chunked_last: s_n_llhttp__internal__n_header_value_te_chunked_last: { if (p == endp) { return s_n_llhttp__internal__n_header_value_te_chunked_last; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_invoke_update_header_state_7; } case 13: { goto s_n_llhttp__internal__n_invoke_update_header_state_7; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_te_chunked_last; } default: { goto s_n_llhttp__internal__n_header_value_te_chunked; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_token_ows: s_n_llhttp__internal__n_header_value_te_token_ows: { if (p == endp) { return s_n_llhttp__internal__n_header_value_te_token_ows; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_header_value_te_token_ows; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_te_token_ows; } default: { goto s_n_llhttp__internal__n_header_value_te_chunked; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value: s_n_llhttp__internal__n_header_value: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_header_value; } #ifdef __SSE4_2__ if (endp - p >= 16) { __m128i ranges; __m128i input; int avail; int match_len; /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob7); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 6, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_value; } goto s_n_llhttp__internal__n_header_value_otherwise; } #endif /* __SSE4_2__ */ switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_value; } default: { goto s_n_llhttp__internal__n_header_value_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_token: s_n_llhttp__internal__n_header_value_te_token: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 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, 0, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_header_value_te_token; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_value_te_token; } case 2: { p++; goto s_n_llhttp__internal__n_header_value_te_token_ows; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_8; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_te_chunked: s_n_llhttp__internal__n_header_value_te_chunked: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_value_te_chunked; } match_seq = llparse__match_sequence_to_lower_unsafe(state, p, endp, llparse_blob6, 7); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_header_value_te_chunked_last; } case kMatchPause: { return s_n_llhttp__internal__n_header_value_te_chunked; } case kMatchMismatch: { goto s_n_llhttp__internal__n_header_value_te_token; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1: s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_value; goto s_n_llhttp__internal__n_invoke_load_header_state_2; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_value_discard_ws: s_n_llhttp__internal__n_header_value_discard_ws: { if (p == endp) { return s_n_llhttp__internal__n_header_value_discard_ws; } switch (*p) { case 9: { p++; goto s_n_llhttp__internal__n_header_value_discard_ws; } case 10: { p++; goto s_n_llhttp__internal__n_header_value_discard_lws; } case 13: { p++; goto s_n_llhttp__internal__n_header_value_discard_ws_almost_done; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_discard_ws; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: { switch (llhttp__on_header_field_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_discard_ws; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_general_otherwise: s_n_llhttp__internal__n_header_field_general_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_header_field_general_otherwise; } switch (*p) { case ':': { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field_2; } default: { goto s_n_llhttp__internal__n_error_21; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_general: s_n_llhttp__internal__n_header_field_general: { static uint8_t lookup_table[] = { 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, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 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, 0, 1, 0, 1, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_header_field_general; } #ifdef __SSE4_2__ if (endp - p >= 16) { __m128i ranges; __m128i input; int avail; int match_len; /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob8); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 16, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_field_general; } ranges = _mm_loadu_si128((__m128i const*) llparse_blob9); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 2, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_header_field_general; } goto s_n_llhttp__internal__n_header_field_general_otherwise; } #endif /* __SSE4_2__ */ switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_header_field_general; } default: { goto s_n_llhttp__internal__n_header_field_general_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_colon: s_n_llhttp__internal__n_header_field_colon: { if (p == endp) { return s_n_llhttp__internal__n_header_field_colon; } switch (*p) { case ' ': { goto s_n_llhttp__internal__n_invoke_test_lenient_flags_2; } case ':': { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_9; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_3: s_n_llhttp__internal__n_header_field_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_3; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob2, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_4: s_n_llhttp__internal__n_header_field_4: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_4; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob10, 10); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_4; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_2: s_n_llhttp__internal__n_header_field_2: { if (p == endp) { return s_n_llhttp__internal__n_header_field_2; } switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { case 'n': { p++; goto s_n_llhttp__internal__n_header_field_3; } case 't': { p++; goto s_n_llhttp__internal__n_header_field_4; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_1: s_n_llhttp__internal__n_header_field_1: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_1; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob1, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_header_field_2; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_1; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_5: s_n_llhttp__internal__n_header_field_5: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_5; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob11, 15); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_5; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_6: s_n_llhttp__internal__n_header_field_6: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_6; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob12, 16); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_6; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_7: s_n_llhttp__internal__n_header_field_7: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_header_field_7; } match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob13, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_header_state; } case kMatchPause: { return s_n_llhttp__internal__n_header_field_7; } case kMatchMismatch: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field: s_n_llhttp__internal__n_header_field: { if (p == endp) { return s_n_llhttp__internal__n_header_field; } switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { case 'c': { p++; goto s_n_llhttp__internal__n_header_field_1; } case 'p': { p++; goto s_n_llhttp__internal__n_header_field_5; } case 't': { p++; goto s_n_llhttp__internal__n_header_field_6; } case 'u': { p++; goto s_n_llhttp__internal__n_header_field_7; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_10; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_header_field: s_n_llhttp__internal__n_span_start_llhttp__on_header_field: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_header_field; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_field; goto s_n_llhttp__internal__n_header_field; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_header_field_start: s_n_llhttp__internal__n_header_field_start: { if (p == endp) { return s_n_llhttp__internal__n_header_field_start; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_headers_almost_done; } case 13: { p++; goto s_n_llhttp__internal__n_headers_almost_done; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_header_field; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_skip_to_http09: s_n_llhttp__internal__n_url_skip_to_http09: { if (p == endp) { return s_n_llhttp__internal__n_url_skip_to_http09; } p++; goto s_n_llhttp__internal__n_invoke_update_http_major; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_skip_lf_to_http09: s_n_llhttp__internal__n_url_skip_lf_to_http09: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_url_skip_lf_to_http09; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob14, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_http_major; } case kMatchPause: { return s_n_llhttp__internal__n_url_skip_lf_to_http09; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_22; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_pri_upgrade: s_n_llhttp__internal__n_req_pri_upgrade: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_pri_upgrade; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob16, 10); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_error_25; } case kMatchPause: { return s_n_llhttp__internal__n_req_pri_upgrade; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_26; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_complete_1: s_n_llhttp__internal__n_req_http_complete_1: { if (p == endp) { return s_n_llhttp__internal__n_req_http_complete_1; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_header_field_start; } default: { goto s_n_llhttp__internal__n_error_24; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_complete: s_n_llhttp__internal__n_req_http_complete: { if (p == endp) { return s_n_llhttp__internal__n_req_http_complete; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_header_field_start; } case 13: { p++; goto s_n_llhttp__internal__n_req_http_complete_1; } default: { goto s_n_llhttp__internal__n_error_24; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_minor: s_n_llhttp__internal__n_req_http_minor: { if (p == endp) { return s_n_llhttp__internal__n_req_http_minor; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_minor; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_minor; } default: { goto s_n_llhttp__internal__n_error_27; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_dot: s_n_llhttp__internal__n_req_http_dot: { if (p == endp) { return s_n_llhttp__internal__n_req_http_dot; } switch (*p) { case '.': { p++; goto s_n_llhttp__internal__n_req_http_minor; } default: { goto s_n_llhttp__internal__n_error_28; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_major: s_n_llhttp__internal__n_req_http_major: { if (p == endp) { return s_n_llhttp__internal__n_req_http_major; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_major; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_major; } default: { goto s_n_llhttp__internal__n_error_29; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start_1: s_n_llhttp__internal__n_req_http_start_1: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_http_start_1; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob15, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_load_method; } case kMatchPause: { return s_n_llhttp__internal__n_req_http_start_1; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_32; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start_2: s_n_llhttp__internal__n_req_http_start_2: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_http_start_2; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob17, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_load_method_2; } case kMatchPause: { return s_n_llhttp__internal__n_req_http_start_2; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_32; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start_3: s_n_llhttp__internal__n_req_http_start_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_http_start_3; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob18, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_load_method_3; } case kMatchPause: { return s_n_llhttp__internal__n_req_http_start_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_32; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_http_start: s_n_llhttp__internal__n_req_http_start: { if (p == endp) { return s_n_llhttp__internal__n_req_http_start; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_req_http_start; } case 'H': { p++; goto s_n_llhttp__internal__n_req_http_start_1; } case 'I': { p++; goto s_n_llhttp__internal__n_req_http_start_2; } case 'R': { p++; goto s_n_llhttp__internal__n_req_http_start_3; } default: { goto s_n_llhttp__internal__n_error_32; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_skip_to_http: s_n_llhttp__internal__n_url_skip_to_http: { if (p == endp) { return s_n_llhttp__internal__n_url_skip_to_http; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_url_complete_1; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_fragment: s_n_llhttp__internal__n_url_fragment: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 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, 0, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_fragment; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_url_fragment; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_6; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_7; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_8; } default: { goto s_n_llhttp__internal__n_error_33; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_end_stub_query_3: s_n_llhttp__internal__n_span_end_stub_query_3: { if (p == endp) { return s_n_llhttp__internal__n_span_end_stub_query_3; } p++; goto s_n_llhttp__internal__n_url_fragment; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_query: s_n_llhttp__internal__n_url_query: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 1, 5, 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, 0, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_query; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_url_query; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_9; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_10; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_11; } case 5: { goto s_n_llhttp__internal__n_span_end_stub_query_3; } default: { goto s_n_llhttp__internal__n_error_34; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_query_or_fragment: s_n_llhttp__internal__n_url_query_or_fragment: { if (p == endp) { return s_n_llhttp__internal__n_url_query_or_fragment; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_3; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_4; } case ' ': { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_5; } case '#': { p++; goto s_n_llhttp__internal__n_url_fragment; } case '?': { p++; goto s_n_llhttp__internal__n_url_query; } default: { goto s_n_llhttp__internal__n_error_35; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_path: s_n_llhttp__internal__n_url_path: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 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, 0, 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, 0, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_path; } #ifdef __SSE4_2__ if (endp - p >= 16) { __m128i ranges; __m128i input; int avail; int match_len; /* Load input */ input = _mm_loadu_si128((__m128i const*) p); ranges = _mm_loadu_si128((__m128i const*) llparse_blob0); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 12, input, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_NEGATIVE_POLARITY); if (match_len != 0) { p += match_len; goto s_n_llhttp__internal__n_url_path; } goto s_n_llhttp__internal__n_url_query_or_fragment; } #endif /* __SSE4_2__ */ switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_url_path; } default: { goto s_n_llhttp__internal__n_url_query_or_fragment; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_stub_path_2: s_n_llhttp__internal__n_span_start_stub_path_2: { if (p == endp) { return s_n_llhttp__internal__n_span_start_stub_path_2; } p++; goto s_n_llhttp__internal__n_url_path; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_stub_path: s_n_llhttp__internal__n_span_start_stub_path: { if (p == endp) { return s_n_llhttp__internal__n_span_start_stub_path; } p++; goto s_n_llhttp__internal__n_url_path; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_stub_path_1: s_n_llhttp__internal__n_span_start_stub_path_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_stub_path_1; } p++; goto s_n_llhttp__internal__n_url_path; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_server_with_at: s_n_llhttp__internal__n_url_server_with_at: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 0, 6, 7, 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, 0, 4, 0, 4, 0, 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, 0, 0, 0, 4, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_server_with_at; } switch (lookup_table[(uint8_t) *p]) { case 1: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_12; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_13; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_14; } case 4: { p++; goto s_n_llhttp__internal__n_url_server; } case 5: { goto s_n_llhttp__internal__n_span_start_stub_path_1; } case 6: { p++; goto s_n_llhttp__internal__n_url_query; } case 7: { p++; goto s_n_llhttp__internal__n_error_36; } default: { goto s_n_llhttp__internal__n_error_37; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_server: s_n_llhttp__internal__n_url_server: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 0, 6, 7, 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, 0, 4, 0, 4, 0, 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, 0, 0, 0, 4, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_server; } switch (lookup_table[(uint8_t) *p]) { case 1: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url; } case 2: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_1; } case 3: { goto s_n_llhttp__internal__n_span_end_llhttp__on_url_2; } case 4: { p++; goto s_n_llhttp__internal__n_url_server; } case 5: { goto s_n_llhttp__internal__n_span_start_stub_path; } case 6: { p++; goto s_n_llhttp__internal__n_url_query; } case 7: { p++; goto s_n_llhttp__internal__n_url_server_with_at; } default: { goto s_n_llhttp__internal__n_error_38; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_schema_delim_1: s_n_llhttp__internal__n_url_schema_delim_1: { if (p == endp) { return s_n_llhttp__internal__n_url_schema_delim_1; } switch (*p) { case '/': { p++; goto s_n_llhttp__internal__n_url_server; } default: { goto s_n_llhttp__internal__n_error_40; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_schema_delim: s_n_llhttp__internal__n_url_schema_delim: { if (p == endp) { return s_n_llhttp__internal__n_url_schema_delim; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_error_39; } case 13: { p++; goto s_n_llhttp__internal__n_error_39; } case ' ': { p++; goto s_n_llhttp__internal__n_error_39; } case '/': { p++; goto s_n_llhttp__internal__n_url_schema_delim_1; } default: { goto s_n_llhttp__internal__n_error_40; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_end_stub_schema: s_n_llhttp__internal__n_span_end_stub_schema: { if (p == endp) { return s_n_llhttp__internal__n_span_end_stub_schema; } p++; goto s_n_llhttp__internal__n_url_schema_delim; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_schema: s_n_llhttp__internal__n_url_schema: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 2, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 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, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_schema; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_39; } case 2: { goto s_n_llhttp__internal__n_span_end_stub_schema; } case 3: { p++; goto s_n_llhttp__internal__n_url_schema; } default: { goto s_n_llhttp__internal__n_error_41; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_url_start: s_n_llhttp__internal__n_url_start: { static uint8_t lookup_table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 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, 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, 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 }; if (p == endp) { return s_n_llhttp__internal__n_url_start; } switch (lookup_table[(uint8_t) *p]) { case 1: { p++; goto s_n_llhttp__internal__n_error_39; } case 2: { goto s_n_llhttp__internal__n_span_start_stub_path_2; } case 3: { goto s_n_llhttp__internal__n_url_schema; } default: { goto s_n_llhttp__internal__n_error_42; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_url_1: s_n_llhttp__internal__n_span_start_llhttp__on_url_1: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_url_1; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_url; goto s_n_llhttp__internal__n_url_start; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_url: s_n_llhttp__internal__n_span_start_llhttp__on_url: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_url; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_url; goto s_n_llhttp__internal__n_url_server; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_spaces_before_url: s_n_llhttp__internal__n_req_spaces_before_url: { if (p == endp) { return s_n_llhttp__internal__n_req_spaces_before_url; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_req_spaces_before_url; } default: { goto s_n_llhttp__internal__n_invoke_is_equal_method; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_first_space_before_url: s_n_llhttp__internal__n_req_first_space_before_url: { if (p == endp) { return s_n_llhttp__internal__n_req_first_space_before_url; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_req_spaces_before_url; } default: { goto s_n_llhttp__internal__n_error_43; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_2: s_n_llhttp__internal__n_start_req_2: { if (p == endp) { return s_n_llhttp__internal__n_start_req_2; } switch (*p) { case 'L': { p++; match = 19; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_3: s_n_llhttp__internal__n_start_req_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_3; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob19, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 36; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_1: s_n_llhttp__internal__n_start_req_1: { if (p == endp) { return s_n_llhttp__internal__n_start_req_1; } switch (*p) { case 'C': { p++; goto s_n_llhttp__internal__n_start_req_2; } case 'N': { p++; goto s_n_llhttp__internal__n_start_req_3; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_4: s_n_llhttp__internal__n_start_req_4: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_4; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob20, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 16; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_4; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_6: s_n_llhttp__internal__n_start_req_6: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_6; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob21, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 22; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_6; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_8: s_n_llhttp__internal__n_start_req_8: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_8; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob22, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_8; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_9: s_n_llhttp__internal__n_start_req_9: { if (p == endp) { return s_n_llhttp__internal__n_start_req_9; } switch (*p) { case 'Y': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_7: s_n_llhttp__internal__n_start_req_7: { if (p == endp) { return s_n_llhttp__internal__n_start_req_7; } switch (*p) { case 'N': { p++; goto s_n_llhttp__internal__n_start_req_8; } case 'P': { p++; goto s_n_llhttp__internal__n_start_req_9; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_5: s_n_llhttp__internal__n_start_req_5: { if (p == endp) { return s_n_llhttp__internal__n_start_req_5; } switch (*p) { case 'H': { p++; goto s_n_llhttp__internal__n_start_req_6; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_7; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_12: s_n_llhttp__internal__n_start_req_12: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_12; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob23, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_12; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_13: s_n_llhttp__internal__n_start_req_13: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_13; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob24, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 35; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_13; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_11: s_n_llhttp__internal__n_start_req_11: { if (p == endp) { return s_n_llhttp__internal__n_start_req_11; } switch (*p) { case 'L': { p++; goto s_n_llhttp__internal__n_start_req_12; } case 'S': { p++; goto s_n_llhttp__internal__n_start_req_13; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_10: s_n_llhttp__internal__n_start_req_10: { if (p == endp) { return s_n_llhttp__internal__n_start_req_10; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_start_req_11; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_14: s_n_llhttp__internal__n_start_req_14: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_14; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob25, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 45; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_14; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_17: s_n_llhttp__internal__n_start_req_17: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_17; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob27, 9); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 41; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_17; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_16: s_n_llhttp__internal__n_start_req_16: { if (p == endp) { return s_n_llhttp__internal__n_start_req_16; } switch (*p) { case '_': { p++; goto s_n_llhttp__internal__n_start_req_17; } default: { match = 1; goto s_n_llhttp__internal__n_invoke_store_method_1; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_15: s_n_llhttp__internal__n_start_req_15: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_15; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob26, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_start_req_16; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_15; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_18: s_n_llhttp__internal__n_start_req_18: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_18; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob28, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_18; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_20: s_n_llhttp__internal__n_start_req_20: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_20; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob29, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 31; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_20; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_21: s_n_llhttp__internal__n_start_req_21: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_21; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob30, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_21; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_19: s_n_llhttp__internal__n_start_req_19: { if (p == endp) { return s_n_llhttp__internal__n_start_req_19; } switch (*p) { case 'I': { p++; goto s_n_llhttp__internal__n_start_req_20; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_21; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_23: s_n_llhttp__internal__n_start_req_23: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_23; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob31, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 24; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_23; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_24: s_n_llhttp__internal__n_start_req_24: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_24; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob32, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 23; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_24; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_26: s_n_llhttp__internal__n_start_req_26: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_26; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob33, 7); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 21; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_26; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_28: s_n_llhttp__internal__n_start_req_28: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_28; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob34, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 30; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_28; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_29: s_n_llhttp__internal__n_start_req_29: { if (p == endp) { return s_n_llhttp__internal__n_start_req_29; } switch (*p) { case 'L': { p++; match = 10; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_27: s_n_llhttp__internal__n_start_req_27: { if (p == endp) { return s_n_llhttp__internal__n_start_req_27; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_start_req_28; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_29; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_25: s_n_llhttp__internal__n_start_req_25: { if (p == endp) { return s_n_llhttp__internal__n_start_req_25; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_start_req_26; } case 'C': { p++; goto s_n_llhttp__internal__n_start_req_27; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_30: s_n_llhttp__internal__n_start_req_30: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_30; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob35, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 11; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_30; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_22: s_n_llhttp__internal__n_start_req_22: { if (p == endp) { return s_n_llhttp__internal__n_start_req_22; } switch (*p) { case '-': { p++; goto s_n_llhttp__internal__n_start_req_23; } case 'E': { p++; goto s_n_llhttp__internal__n_start_req_24; } case 'K': { p++; goto s_n_llhttp__internal__n_start_req_25; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_30; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_31: s_n_llhttp__internal__n_start_req_31: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_31; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob36, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 25; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_31; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_32: s_n_llhttp__internal__n_start_req_32: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_32; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob37, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_32; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_35: s_n_llhttp__internal__n_start_req_35: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_35; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob38, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 28; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_35; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_36: s_n_llhttp__internal__n_start_req_36: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_36; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob39, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 39; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_36; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_34: s_n_llhttp__internal__n_start_req_34: { if (p == endp) { return s_n_llhttp__internal__n_start_req_34; } switch (*p) { case 'T': { p++; goto s_n_llhttp__internal__n_start_req_35; } case 'U': { p++; goto s_n_llhttp__internal__n_start_req_36; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_37: s_n_llhttp__internal__n_start_req_37: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_37; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob40, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 38; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_37; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_38: s_n_llhttp__internal__n_start_req_38: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_38; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob41, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_38; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_42: s_n_llhttp__internal__n_start_req_42: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_42; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob42, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 12; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_42; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_43: s_n_llhttp__internal__n_start_req_43: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_43; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob43, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 13; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_43; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_41: s_n_llhttp__internal__n_start_req_41: { if (p == endp) { return s_n_llhttp__internal__n_start_req_41; } switch (*p) { case 'F': { p++; goto s_n_llhttp__internal__n_start_req_42; } case 'P': { p++; goto s_n_llhttp__internal__n_start_req_43; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_40: s_n_llhttp__internal__n_start_req_40: { if (p == endp) { return s_n_llhttp__internal__n_start_req_40; } switch (*p) { case 'P': { p++; goto s_n_llhttp__internal__n_start_req_41; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_39: s_n_llhttp__internal__n_start_req_39: { if (p == endp) { return s_n_llhttp__internal__n_start_req_39; } switch (*p) { case 'I': { p++; match = 34; goto s_n_llhttp__internal__n_invoke_store_method_1; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_40; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_45: s_n_llhttp__internal__n_start_req_45: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_45; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob44, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 29; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_45; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_44: s_n_llhttp__internal__n_start_req_44: { if (p == endp) { return s_n_llhttp__internal__n_start_req_44; } switch (*p) { case 'R': { p++; goto s_n_llhttp__internal__n_start_req_45; } case 'T': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_33: s_n_llhttp__internal__n_start_req_33: { if (p == endp) { return s_n_llhttp__internal__n_start_req_33; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_start_req_34; } case 'L': { p++; goto s_n_llhttp__internal__n_start_req_37; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_38; } case 'R': { p++; goto s_n_llhttp__internal__n_start_req_39; } case 'U': { p++; goto s_n_llhttp__internal__n_start_req_44; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_48: s_n_llhttp__internal__n_start_req_48: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_48; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob45, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 17; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_48; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_49: s_n_llhttp__internal__n_start_req_49: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_49; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob46, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 44; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_49; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_50: s_n_llhttp__internal__n_start_req_50: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_50; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob47, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 43; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_50; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_51: s_n_llhttp__internal__n_start_req_51: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_51; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob48, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 20; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_51; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_47: s_n_llhttp__internal__n_start_req_47: { if (p == endp) { return s_n_llhttp__internal__n_start_req_47; } switch (*p) { case 'B': { p++; goto s_n_llhttp__internal__n_start_req_48; } case 'C': { p++; goto s_n_llhttp__internal__n_start_req_49; } case 'D': { p++; goto s_n_llhttp__internal__n_start_req_50; } case 'P': { p++; goto s_n_llhttp__internal__n_start_req_51; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_46: s_n_llhttp__internal__n_start_req_46: { if (p == endp) { return s_n_llhttp__internal__n_start_req_46; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_start_req_47; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_54: s_n_llhttp__internal__n_start_req_54: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_54; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob49, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 14; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_54; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_56: s_n_llhttp__internal__n_start_req_56: { if (p == endp) { return s_n_llhttp__internal__n_start_req_56; } switch (*p) { case 'P': { p++; match = 37; goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_57: s_n_llhttp__internal__n_start_req_57: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_57; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob50, 9); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 42; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_57; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_55: s_n_llhttp__internal__n_start_req_55: { if (p == endp) { return s_n_llhttp__internal__n_start_req_55; } switch (*p) { case 'U': { p++; goto s_n_llhttp__internal__n_start_req_56; } case '_': { p++; goto s_n_llhttp__internal__n_start_req_57; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_53: s_n_llhttp__internal__n_start_req_53: { if (p == endp) { return s_n_llhttp__internal__n_start_req_53; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_start_req_54; } case 'T': { p++; goto s_n_llhttp__internal__n_start_req_55; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_58: s_n_llhttp__internal__n_start_req_58: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_58; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob51, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 33; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_58; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_59: s_n_llhttp__internal__n_start_req_59: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_59; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob52, 7); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 26; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_59; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_52: s_n_llhttp__internal__n_start_req_52: { if (p == endp) { return s_n_llhttp__internal__n_start_req_52; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_start_req_53; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_58; } case 'U': { p++; goto s_n_llhttp__internal__n_start_req_59; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_61: s_n_llhttp__internal__n_start_req_61: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_61; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob53, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 40; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_61; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_62: s_n_llhttp__internal__n_start_req_62: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_62; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob54, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_62; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_60: s_n_llhttp__internal__n_start_req_60: { if (p == endp) { return s_n_llhttp__internal__n_start_req_60; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_start_req_61; } case 'R': { p++; goto s_n_llhttp__internal__n_start_req_62; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_65: s_n_llhttp__internal__n_start_req_65: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_65; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob55, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 18; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_65; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_67: s_n_llhttp__internal__n_start_req_67: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_67; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob56, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 32; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_67; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_68: s_n_llhttp__internal__n_start_req_68: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_68; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob57, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 15; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_68; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_66: s_n_llhttp__internal__n_start_req_66: { if (p == endp) { return s_n_llhttp__internal__n_start_req_66; } switch (*p) { case 'I': { p++; goto s_n_llhttp__internal__n_start_req_67; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_68; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_69: s_n_llhttp__internal__n_start_req_69: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_req_69; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob58, 8); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 27; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_start_req_69; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_64: s_n_llhttp__internal__n_start_req_64: { if (p == endp) { return s_n_llhttp__internal__n_start_req_64; } switch (*p) { case 'B': { p++; goto s_n_llhttp__internal__n_start_req_65; } case 'L': { p++; goto s_n_llhttp__internal__n_start_req_66; } case 'S': { p++; goto s_n_llhttp__internal__n_start_req_69; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_63: s_n_llhttp__internal__n_start_req_63: { if (p == endp) { return s_n_llhttp__internal__n_start_req_63; } switch (*p) { case 'N': { p++; goto s_n_llhttp__internal__n_start_req_64; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req: s_n_llhttp__internal__n_start_req: { if (p == endp) { return s_n_llhttp__internal__n_start_req; } switch (*p) { case 'A': { p++; goto s_n_llhttp__internal__n_start_req_1; } case 'B': { p++; goto s_n_llhttp__internal__n_start_req_4; } case 'C': { p++; goto s_n_llhttp__internal__n_start_req_5; } case 'D': { p++; goto s_n_llhttp__internal__n_start_req_10; } case 'F': { p++; goto s_n_llhttp__internal__n_start_req_14; } case 'G': { p++; goto s_n_llhttp__internal__n_start_req_15; } case 'H': { p++; goto s_n_llhttp__internal__n_start_req_18; } case 'L': { p++; goto s_n_llhttp__internal__n_start_req_19; } case 'M': { p++; goto s_n_llhttp__internal__n_start_req_22; } case 'N': { p++; goto s_n_llhttp__internal__n_start_req_31; } case 'O': { p++; goto s_n_llhttp__internal__n_start_req_32; } case 'P': { p++; goto s_n_llhttp__internal__n_start_req_33; } case 'R': { p++; goto s_n_llhttp__internal__n_start_req_46; } case 'S': { p++; goto s_n_llhttp__internal__n_start_req_52; } case 'T': { p++; goto s_n_llhttp__internal__n_start_req_60; } case 'U': { p++; goto s_n_llhttp__internal__n_start_req_63; } default: { goto s_n_llhttp__internal__n_error_51; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_status_complete: s_n_llhttp__internal__n_invoke_llhttp__on_status_complete: { switch (llhttp__on_status_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_start; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_line_almost_done: s_n_llhttp__internal__n_res_line_almost_done: { if (p == endp) { return s_n_llhttp__internal__n_res_line_almost_done; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status: s_n_llhttp__internal__n_res_status: { if (p == endp) { return s_n_llhttp__internal__n_res_status; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_status; } case 13: { goto s_n_llhttp__internal__n_span_end_llhttp__on_status_1; } default: { p++; goto s_n_llhttp__internal__n_res_status; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_span_start_llhttp__on_status: s_n_llhttp__internal__n_span_start_llhttp__on_status: { if (p == endp) { return s_n_llhttp__internal__n_span_start_llhttp__on_status; } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_status; goto s_n_llhttp__internal__n_res_status; /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status_start: s_n_llhttp__internal__n_res_status_start: { if (p == endp) { return s_n_llhttp__internal__n_res_status_start; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; } case 13: { p++; goto s_n_llhttp__internal__n_res_line_almost_done; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_status; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status_code_otherwise: s_n_llhttp__internal__n_res_status_code_otherwise: { if (p == endp) { return s_n_llhttp__internal__n_res_status_code_otherwise; } switch (*p) { case 10: { goto s_n_llhttp__internal__n_res_status_start; } case 13: { goto s_n_llhttp__internal__n_res_status_start; } case ' ': { p++; goto s_n_llhttp__internal__n_res_status_start; } default: { goto s_n_llhttp__internal__n_error_45; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_status_code: s_n_llhttp__internal__n_res_status_code: { if (p == endp) { return s_n_llhttp__internal__n_res_status_code; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } default: { goto s_n_llhttp__internal__n_res_status_code_otherwise; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_http_end: s_n_llhttp__internal__n_res_http_end: { if (p == endp) { return s_n_llhttp__internal__n_res_http_end; } switch (*p) { case ' ': { p++; goto s_n_llhttp__internal__n_invoke_update_status_code; } default: { goto s_n_llhttp__internal__n_error_46; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_http_minor: s_n_llhttp__internal__n_res_http_minor: { if (p == endp) { return s_n_llhttp__internal__n_res_http_minor; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_minor_1; } default: { goto s_n_llhttp__internal__n_error_47; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_http_dot: s_n_llhttp__internal__n_res_http_dot: { if (p == endp) { return s_n_llhttp__internal__n_res_http_dot; } switch (*p) { case '.': { p++; goto s_n_llhttp__internal__n_res_http_minor; } default: { goto s_n_llhttp__internal__n_error_48; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_res_http_major: s_n_llhttp__internal__n_res_http_major: { if (p == endp) { return s_n_llhttp__internal__n_res_http_major; } switch (*p) { case '0': { p++; match = 0; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '1': { p++; match = 1; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '2': { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '3': { p++; match = 3; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '4': { p++; match = 4; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '5': { p++; match = 5; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '6': { p++; match = 6; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '7': { p++; match = 7; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '8': { p++; match = 8; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } case '9': { p++; match = 9; goto s_n_llhttp__internal__n_invoke_store_http_major_1; } default: { goto s_n_llhttp__internal__n_error_49; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_res: s_n_llhttp__internal__n_start_res: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_start_res; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob59, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_res_http_major; } case kMatchPause: { return s_n_llhttp__internal__n_start_res; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_52; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method_2: s_n_llhttp__internal__n_req_or_res_method_2: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_2; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob60, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; match = 2; goto s_n_llhttp__internal__n_invoke_store_method; } case kMatchPause: { return s_n_llhttp__internal__n_req_or_res_method_2; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_50; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method_3: s_n_llhttp__internal__n_req_or_res_method_3: { llparse_match_t match_seq; if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_3; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob61, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; goto s_n_llhttp__internal__n_invoke_update_type_1; } case kMatchPause: { return s_n_llhttp__internal__n_req_or_res_method_3; } case kMatchMismatch: { goto s_n_llhttp__internal__n_error_50; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method_1: s_n_llhttp__internal__n_req_or_res_method_1: { if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method_1; } switch (*p) { case 'E': { p++; goto s_n_llhttp__internal__n_req_or_res_method_2; } case 'T': { p++; goto s_n_llhttp__internal__n_req_or_res_method_3; } default: { goto s_n_llhttp__internal__n_error_50; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_req_or_res_method: s_n_llhttp__internal__n_req_or_res_method: { if (p == endp) { return s_n_llhttp__internal__n_req_or_res_method; } switch (*p) { case 'H': { p++; goto s_n_llhttp__internal__n_req_or_res_method_1; } default: { goto s_n_llhttp__internal__n_error_50; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start_req_or_res: s_n_llhttp__internal__n_start_req_or_res: { if (p == endp) { return s_n_llhttp__internal__n_start_req_or_res; } switch (*p) { case 'H': { goto s_n_llhttp__internal__n_req_or_res_method; } default: { goto s_n_llhttp__internal__n_invoke_update_type_2; } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_load_type: s_n_llhttp__internal__n_invoke_load_type: { switch (llhttp__internal__c_load_type(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_start_req; case 2: goto s_n_llhttp__internal__n_start_res; default: goto s_n_llhttp__internal__n_start_req_or_res; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_start: s_n_llhttp__internal__n_start: { if (p == endp) { return s_n_llhttp__internal__n_start; } switch (*p) { case 10: { p++; goto s_n_llhttp__internal__n_start; } case 13: { p++; goto s_n_llhttp__internal__n_start; } default: { goto s_n_llhttp__internal__n_invoke_update_finish; } } /* UNREACHABLE */; abort(); } default: /* UNREACHABLE */ abort(); } s_n_llhttp__internal__n_error_39: { state->error = 0x7; state->reason = "Invalid characters in url"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_finish_2: { switch (llhttp__internal__c_update_finish_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_start; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_update_finish_2; default: goto s_n_llhttp__internal__n_closed; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_finish_1: { switch (llhttp__internal__c_update_finish_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_test_lenient_flags; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_5: { state->error = 0x15; state->reason = "on_message_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_is_equal_upgrade; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_10: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_7: { state->error = 0x15; state->reason = "on_chunk_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_13: { state->error = 0x14; state->reason = "`on_chunk_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_1: { switch (llhttp__on_chunk_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; case 21: goto s_n_llhttp__internal__n_pause_7; default: goto s_n_llhttp__internal__n_error_13; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_12: { state->error = 0x4; state->reason = "Content-Length can't be present with Transfer-Encoding"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_2: { state->error = 0x15; state->reason = "on_message_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_pause_1; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_3: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_1: { switch (llhttp__on_message_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_pause_1; case 21: goto s_n_llhttp__internal__n_pause_2; default: goto s_n_llhttp__internal__n_error_3; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_8: { state->error = 0xc; state->reason = "Chunk size overflow"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_3: { state->error = 0x15; state->reason = "on_chunk_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_update_content_length; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_5: { state->error = 0x14; state->reason = "`on_chunk_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete: { switch (llhttp__on_chunk_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_update_content_length; case 21: goto s_n_llhttp__internal__n_pause_3; default: goto s_n_llhttp__internal__n_error_5; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_body: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_body(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_data_almost_done; return s_error; } goto s_n_llhttp__internal__n_chunk_data_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags: { switch (llhttp__internal__c_or_flags(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_start; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_4: { state->error = 0x15; state->reason = "on_chunk_header pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_is_equal_content_length; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_4: { state->error = 0x13; state->reason = "`on_chunk_header` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header: { switch (llhttp__on_chunk_header(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_is_equal_content_length; case 21: goto s_n_llhttp__internal__n_pause_4; default: goto s_n_llhttp__internal__n_error_4; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_6: { state->error = 0x2; state->reason = "Invalid character in chunk parameters"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_7: { state->error = 0xc; state->reason = "Invalid character in chunk size"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_content_length: { switch (llhttp__internal__c_mul_add_content_length(state, p, endp, match)) { case 1: goto s_n_llhttp__internal__n_error_8; default: goto s_n_llhttp__internal__n_chunk_size; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_9: { state->error = 0xc; state->reason = "Invalid character in chunk size"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_body_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_body(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_finish_3: { switch (llhttp__internal__c_update_finish_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_body_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_11: { state->error = 0xf; state->reason = "Request has invalid `Transfer-Encoding`"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause: { state->error = 0x15; state->reason = "on_message_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_2: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_message_complete: { switch (llhttp__on_message_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; case 21: goto s_n_llhttp__internal__n_pause; default: goto s_n_llhttp__internal__n_error_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_1: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_2: { switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_upgrade: { switch (llhttp__internal__c_update_upgrade(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_or_flags_2; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_6: { state->error = 0x15; state->reason = "Paused by on_headers_complete"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_1: { state->error = 0x11; state->reason = "User callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete: { switch (llhttp__on_headers_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; case 1: goto s_n_llhttp__internal__n_invoke_or_flags_1; case 2: goto s_n_llhttp__internal__n_invoke_update_upgrade; case 21: goto s_n_llhttp__internal__n_pause_6; default: goto s_n_llhttp__internal__n_error_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete: { switch (llhttp__before_headers_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_1: { switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_error_12; default: goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags_1: { switch (llhttp__internal__c_test_flags_1(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_test_lenient_flags_1; default: goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags: { switch (llhttp__internal__c_test_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_1; default: goto s_n_llhttp__internal__n_invoke_test_flags_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_field: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_14; return s_error; } p++; goto s_n_llhttp__internal__n_error_14; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_2: { switch (llhttp__internal__c_test_lenient_flags_2(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_field_colon_discard_ws; default: goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_15: { state->error = 0xb; state->reason = "Empty Content-Length"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; return s_error; } goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_3: { switch (llhttp__internal__c_or_flags_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_4: { switch (llhttp__internal__c_or_flags_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_5: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_6: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_1: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: goto s_n_llhttp__internal__n_invoke_or_flags_3; case 6: goto s_n_llhttp__internal__n_invoke_or_flags_4; case 7: goto s_n_llhttp__internal__n_invoke_or_flags_5; case 8: goto s_n_llhttp__internal__n_invoke_or_flags_6; default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 2: goto s_n_llhttp__internal__n_error_15; default: goto s_n_llhttp__internal__n_invoke_load_header_state_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_1: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_7: { switch (llhttp__internal__c_or_flags_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_8: { switch (llhttp__internal__c_or_flags_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_9: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_10: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_3: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: goto s_n_llhttp__internal__n_invoke_or_flags_7; case 6: goto s_n_llhttp__internal__n_invoke_or_flags_8; case 7: goto s_n_llhttp__internal__n_invoke_or_flags_9; case 8: goto s_n_llhttp__internal__n_invoke_or_flags_10; default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_16: { state->error = 0x3; state->reason = "Missing expected LF after header value"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; return s_error; } goto s_n_llhttp__internal__n_header_value_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; return s_error; } p++; goto s_n_llhttp__internal__n_header_value_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; return s_error; } p++; goto s_n_llhttp__internal__n_header_value_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_17: { state->error = 0xa; state->reason = "Invalid header value char"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_lenient_flags_3: { switch (llhttp__internal__c_test_lenient_flags_2(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_lenient; default: goto s_n_llhttp__internal__n_error_17; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_3: { switch (llhttp__internal__c_update_header_state(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_11: { switch (llhttp__internal__c_or_flags_3(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_3; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_12: { switch (llhttp__internal__c_or_flags_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_3; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_13: { switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_3; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_14: { switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_4: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: goto s_n_llhttp__internal__n_invoke_or_flags_11; case 6: goto s_n_llhttp__internal__n_invoke_or_flags_12; case 7: goto s_n_llhttp__internal__n_invoke_or_flags_13; case 8: goto s_n_llhttp__internal__n_invoke_or_flags_14; default: goto s_n_llhttp__internal__n_header_value_connection; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_4: { switch (llhttp__internal__c_update_header_state_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_token; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_2: { switch (llhttp__internal__c_update_header_state_2(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_5: { switch (llhttp__internal__c_update_header_state_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_6: { switch (llhttp__internal__c_update_header_state_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection_ws; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_19; return s_error; } goto s_n_llhttp__internal__n_error_19; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_content_length_1: { switch (llhttp__internal__c_mul_add_content_length_1(state, p, endp, match)) { case 1: goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4; default: goto s_n_llhttp__internal__n_header_value_content_length; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_15: { switch (llhttp__internal__c_or_flags_15(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_otherwise; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_20; return s_error; } goto s_n_llhttp__internal__n_error_20; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_18: { state->error = 0x4; state->reason = "Duplicate Content-Length"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_test_flags_2: { switch (llhttp__internal__c_test_flags_2(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_header_value_content_length; default: goto s_n_llhttp__internal__n_error_18; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_7: { switch (llhttp__internal__c_update_header_state_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_otherwise; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_8: { switch (llhttp__internal__c_update_header_state_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_and_flags: { switch (llhttp__internal__c_and_flags(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_te_chunked; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_16: { switch (llhttp__internal__c_or_flags_16(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_and_flags; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_17: { switch (llhttp__internal__c_or_flags_17(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_8; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_header_state_2: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_connection; case 2: goto s_n_llhttp__internal__n_invoke_test_flags_2; case 3: goto s_n_llhttp__internal__n_invoke_or_flags_16; case 4: goto s_n_llhttp__internal__n_invoke_or_flags_17; default: goto s_n_llhttp__internal__n_header_value; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_header_field_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_field(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_21: { state->error = 0xa; state->reason = "Invalid header token"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_9: { switch (llhttp__internal__c_update_header_state_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_general; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_header_state: { switch (llhttp__internal__c_store_header_state(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_header_field_colon; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_header_state_10: { switch (llhttp__internal__c_update_header_state_4(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_general; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_url_complete: { switch (llhttp__on_url_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_field_start; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_http_minor: { switch (llhttp__internal__c_update_http_minor(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_url_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_http_major: { switch (llhttp__internal__c_update_http_major(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_http_minor; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_3: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_22: { state->error = 0x7; state->reason = "Expected CRLF"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_4: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_25: { state->error = 0x17; state->reason = "Pause on PRI/Upgrade"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_26: { state->error = 0x9; state->reason = "Expected HTTP/2 Connection Preface"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_24: { state->error = 0x9; state->reason = "Expected CRLF after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_method_1: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 34: goto s_n_llhttp__internal__n_req_pri_upgrade; default: goto s_n_llhttp__internal__n_req_http_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_minor: { switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_invoke_load_method_1; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_27: { state->error = 0x9; state->reason = "Invalid minor version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_28: { state->error = 0x9; state->reason = "Expected dot"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_major: { switch (llhttp__internal__c_store_http_major(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_req_http_dot; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_29: { state->error = 0x9; state->reason = "Invalid major version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_23: { state->error = 0x8; state->reason = "Invalid method for HTTP/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_method: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_req_http_major; case 1: goto s_n_llhttp__internal__n_req_http_major; case 2: goto s_n_llhttp__internal__n_req_http_major; case 3: goto s_n_llhttp__internal__n_req_http_major; case 4: goto s_n_llhttp__internal__n_req_http_major; case 5: goto s_n_llhttp__internal__n_req_http_major; case 6: goto s_n_llhttp__internal__n_req_http_major; case 7: goto s_n_llhttp__internal__n_req_http_major; case 8: goto s_n_llhttp__internal__n_req_http_major; case 9: goto s_n_llhttp__internal__n_req_http_major; case 10: goto s_n_llhttp__internal__n_req_http_major; case 11: goto s_n_llhttp__internal__n_req_http_major; case 12: goto s_n_llhttp__internal__n_req_http_major; case 13: goto s_n_llhttp__internal__n_req_http_major; case 14: goto s_n_llhttp__internal__n_req_http_major; case 15: goto s_n_llhttp__internal__n_req_http_major; case 16: goto s_n_llhttp__internal__n_req_http_major; case 17: goto s_n_llhttp__internal__n_req_http_major; case 18: goto s_n_llhttp__internal__n_req_http_major; case 19: goto s_n_llhttp__internal__n_req_http_major; case 20: goto s_n_llhttp__internal__n_req_http_major; case 21: goto s_n_llhttp__internal__n_req_http_major; case 22: goto s_n_llhttp__internal__n_req_http_major; case 23: goto s_n_llhttp__internal__n_req_http_major; case 24: goto s_n_llhttp__internal__n_req_http_major; case 25: goto s_n_llhttp__internal__n_req_http_major; case 26: goto s_n_llhttp__internal__n_req_http_major; case 27: goto s_n_llhttp__internal__n_req_http_major; case 28: goto s_n_llhttp__internal__n_req_http_major; case 29: goto s_n_llhttp__internal__n_req_http_major; case 30: goto s_n_llhttp__internal__n_req_http_major; case 31: goto s_n_llhttp__internal__n_req_http_major; case 32: goto s_n_llhttp__internal__n_req_http_major; case 33: goto s_n_llhttp__internal__n_req_http_major; case 34: goto s_n_llhttp__internal__n_req_http_major; default: goto s_n_llhttp__internal__n_error_23; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_32: { state->error = 0x8; state->reason = "Expected HTTP/"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_30: { state->error = 0x8; state->reason = "Expected SOURCE method for ICE/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_method_2: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 33: goto s_n_llhttp__internal__n_req_http_major; default: goto s_n_llhttp__internal__n_error_30; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_31: { state->error = 0x8; state->reason = "Invalid method for RTSP/x.x request"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_load_method_3: { switch (llhttp__internal__c_load_method(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_req_http_major; case 3: goto s_n_llhttp__internal__n_req_http_major; case 6: goto s_n_llhttp__internal__n_req_http_major; case 35: goto s_n_llhttp__internal__n_req_http_major; case 36: goto s_n_llhttp__internal__n_req_http_major; case 37: goto s_n_llhttp__internal__n_req_http_major; case 38: goto s_n_llhttp__internal__n_req_http_major; case 39: goto s_n_llhttp__internal__n_req_http_major; case 40: goto s_n_llhttp__internal__n_req_http_major; case 41: goto s_n_llhttp__internal__n_req_http_major; case 42: goto s_n_llhttp__internal__n_req_http_major; case 43: goto s_n_llhttp__internal__n_req_http_major; case 44: goto s_n_llhttp__internal__n_req_http_major; case 45: goto s_n_llhttp__internal__n_req_http_major; default: goto s_n_llhttp__internal__n_error_31; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_url_complete_1: { switch (llhttp__on_url_complete(state, p, endp)) { default: goto s_n_llhttp__internal__n_req_http_start; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_5: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_6: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_7: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_8: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_33: { state->error = 0x7; state->reason = "Invalid char in url fragment start"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_9: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_10: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_11: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_34: { state->error = 0x7; state->reason = "Invalid char in url query"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_35: { state->error = 0x7; state->reason = "Invalid char in url path"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_2: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_12: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_13: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; return s_error; } goto s_n_llhttp__internal__n_url_skip_lf_to_http09; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_url_14: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_url(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; return s_error; } goto s_n_llhttp__internal__n_url_skip_to_http; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_36: { state->error = 0x7; state->reason = "Double @ in url"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_37: { state->error = 0x7; state->reason = "Unexpected char in url server"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_38: { state->error = 0x7; state->reason = "Unexpected char in url server"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_40: { state->error = 0x7; state->reason = "Unexpected char in url schema"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_41: { state->error = 0x7; state->reason = "Unexpected char in url schema"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_42: { state->error = 0x7; state->reason = "Unexpected start char in url"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_is_equal_method: { switch (llhttp__internal__c_is_equal_method(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_span_start_llhttp__on_url_1; default: goto s_n_llhttp__internal__n_span_start_llhttp__on_url; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_43: { state->error = 0x6; state->reason = "Expected space after method"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_method_1: { switch (llhttp__internal__c_store_method(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_req_first_space_before_url; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_51: { state->error = 0x6; state->reason = "Invalid method encountered"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_44: { state->error = 0xd; state->reason = "Response overflow"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_status_code: { switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { case 1: goto s_n_llhttp__internal__n_error_44; default: goto s_n_llhttp__internal__n_res_status_code; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_status: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_status(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; return s_error; } p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_span_end_llhttp__on_status_1: { const unsigned char* start; int err; start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_status(state, start, p); if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_res_line_almost_done; return s_error; } p++; goto s_n_llhttp__internal__n_res_line_almost_done; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_45: { state->error = 0xd; state->reason = "Invalid response status"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_status_code: { switch (llhttp__internal__c_update_status_code(state, p, endp)) { default: goto s_n_llhttp__internal__n_res_status_code; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_46: { state->error = 0x9; state->reason = "Expected space after version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_minor_1: { switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_res_http_end; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_47: { state->error = 0x9; state->reason = "Invalid minor version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_48: { state->error = 0x9; state->reason = "Expected dot"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_http_major_1: { switch (llhttp__internal__c_store_http_major(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_res_http_dot; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_49: { state->error = 0x9; state->reason = "Invalid major version"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_52: { state->error = 0x8; state->reason = "Expected HTTP/"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_type: { switch (llhttp__internal__c_update_type(state, p, endp)) { default: goto s_n_llhttp__internal__n_req_first_space_before_url; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_store_method: { switch (llhttp__internal__c_store_method(state, p, endp, match)) { default: goto s_n_llhttp__internal__n_invoke_update_type; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error_50: { state->error = 0x8; state->reason = "Invalid word encountered"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_type_1: { switch (llhttp__internal__c_update_type_1(state, p, endp)) { default: goto s_n_llhttp__internal__n_res_http_major; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_type_2: { switch (llhttp__internal__c_update_type(state, p, endp)) { default: goto s_n_llhttp__internal__n_start_req; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_pause_8: { state->error = 0x15; state->reason = "on_message_begin pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_type; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_error: { state->error = 0x10; state->reason = "`on_message_begin` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_llhttp__on_message_begin: { switch (llhttp__on_message_begin(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_load_type; case 21: goto s_n_llhttp__internal__n_pause_8; default: goto s_n_llhttp__internal__n_error; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_update_finish: { switch (llhttp__internal__c_update_finish(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_begin; } /* UNREACHABLE */; abort(); } } int llhttp__internal_execute(llhttp__internal_t* state, const char* p, const char* endp) { llparse_state_t next; /* check lingering errors */ if (state->error != 0) { return state->error; } /* restart spans */ if (state->_span_pos0 != NULL) { state->_span_pos0 = (void*) p; } next = llhttp__internal__run(state, (const unsigned char*) p, (const unsigned char*) endp); if (next == s_error) { return state->error; } state->_current = (void*) (intptr_t) next; /* execute spans */ if (state->_span_pos0 != NULL) { int error; error = ((llhttp__internal__span_cb) state->_span_cb0)(state, state->_span_pos0, (const char*) endp); if (error != 0) { state->error = error; state->error_pos = endp; return error; } } return 0; } #endif /* LLHTTP_STRICT_MODE */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920312.0 aiohttp-3.8.1/vendor/llhttp/build/llhttp.h0000644000175100001710000003665200000000000020132 0ustar00runnerdocker#ifndef INCLUDE_LLHTTP_H_ #define INCLUDE_LLHTTP_H_ #define LLHTTP_VERSION_MAJOR 6 #define LLHTTP_VERSION_MINOR 0 #define LLHTTP_VERSION_PATCH 6 #ifndef LLHTTP_STRICT_MODE # define LLHTTP_STRICT_MODE 0 #endif #ifndef INCLUDE_LLHTTP_ITSELF_H_ #define INCLUDE_LLHTTP_ITSELF_H_ #ifdef __cplusplus extern "C" { #endif #include typedef struct llhttp__internal_s llhttp__internal_t; struct llhttp__internal_s { int32_t _index; void* _span_pos0; void* _span_cb0; int32_t error; const char* reason; const char* error_pos; void* data; void* _current; uint64_t content_length; uint8_t type; uint8_t method; uint8_t http_major; uint8_t http_minor; uint8_t header_state; uint8_t lenient_flags; uint8_t upgrade; uint8_t finish; uint16_t flags; uint16_t status_code; void* settings; }; int llhttp__internal_init(llhttp__internal_t* s); int llhttp__internal_execute(llhttp__internal_t* s, const char* p, const char* endp); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* INCLUDE_LLHTTP_ITSELF_H_ */ #ifndef LLLLHTTP_C_HEADERS_ #define LLLLHTTP_C_HEADERS_ #ifdef __cplusplus extern "C" { #endif enum llhttp_errno { HPE_OK = 0, HPE_INTERNAL = 1, HPE_STRICT = 2, HPE_LF_EXPECTED = 3, HPE_UNEXPECTED_CONTENT_LENGTH = 4, HPE_CLOSED_CONNECTION = 5, HPE_INVALID_METHOD = 6, HPE_INVALID_URL = 7, HPE_INVALID_CONSTANT = 8, HPE_INVALID_VERSION = 9, HPE_INVALID_HEADER_TOKEN = 10, HPE_INVALID_CONTENT_LENGTH = 11, HPE_INVALID_CHUNK_SIZE = 12, HPE_INVALID_STATUS = 13, HPE_INVALID_EOF_STATE = 14, HPE_INVALID_TRANSFER_ENCODING = 15, HPE_CB_MESSAGE_BEGIN = 16, HPE_CB_HEADERS_COMPLETE = 17, HPE_CB_MESSAGE_COMPLETE = 18, HPE_CB_CHUNK_HEADER = 19, HPE_CB_CHUNK_COMPLETE = 20, HPE_PAUSED = 21, HPE_PAUSED_UPGRADE = 22, HPE_PAUSED_H2_UPGRADE = 23, HPE_USER = 24 }; typedef enum llhttp_errno llhttp_errno_t; enum llhttp_flags { F_CONNECTION_KEEP_ALIVE = 0x1, F_CONNECTION_CLOSE = 0x2, F_CONNECTION_UPGRADE = 0x4, F_CHUNKED = 0x8, F_UPGRADE = 0x10, F_CONTENT_LENGTH = 0x20, F_SKIPBODY = 0x40, F_TRAILING = 0x80, F_TRANSFER_ENCODING = 0x200 }; typedef enum llhttp_flags llhttp_flags_t; enum llhttp_lenient_flags { LENIENT_HEADERS = 0x1, LENIENT_CHUNKED_LENGTH = 0x2, LENIENT_KEEP_ALIVE = 0x4 }; typedef enum llhttp_lenient_flags llhttp_lenient_flags_t; enum llhttp_type { HTTP_BOTH = 0, HTTP_REQUEST = 1, HTTP_RESPONSE = 2 }; typedef enum llhttp_type llhttp_type_t; enum llhttp_finish { HTTP_FINISH_SAFE = 0, HTTP_FINISH_SAFE_WITH_CB = 1, HTTP_FINISH_UNSAFE = 2 }; typedef enum llhttp_finish llhttp_finish_t; enum llhttp_method { HTTP_DELETE = 0, HTTP_GET = 1, HTTP_HEAD = 2, HTTP_POST = 3, HTTP_PUT = 4, HTTP_CONNECT = 5, HTTP_OPTIONS = 6, HTTP_TRACE = 7, HTTP_COPY = 8, HTTP_LOCK = 9, HTTP_MKCOL = 10, HTTP_MOVE = 11, HTTP_PROPFIND = 12, HTTP_PROPPATCH = 13, HTTP_SEARCH = 14, HTTP_UNLOCK = 15, HTTP_BIND = 16, HTTP_REBIND = 17, HTTP_UNBIND = 18, HTTP_ACL = 19, HTTP_REPORT = 20, HTTP_MKACTIVITY = 21, HTTP_CHECKOUT = 22, HTTP_MERGE = 23, HTTP_MSEARCH = 24, HTTP_NOTIFY = 25, HTTP_SUBSCRIBE = 26, HTTP_UNSUBSCRIBE = 27, HTTP_PATCH = 28, HTTP_PURGE = 29, HTTP_MKCALENDAR = 30, HTTP_LINK = 31, HTTP_UNLINK = 32, HTTP_SOURCE = 33, HTTP_PRI = 34, HTTP_DESCRIBE = 35, HTTP_ANNOUNCE = 36, HTTP_SETUP = 37, HTTP_PLAY = 38, HTTP_PAUSE = 39, HTTP_TEARDOWN = 40, HTTP_GET_PARAMETER = 41, HTTP_SET_PARAMETER = 42, HTTP_REDIRECT = 43, HTTP_RECORD = 44, HTTP_FLUSH = 45 }; typedef enum llhttp_method llhttp_method_t; #define HTTP_ERRNO_MAP(XX) \ XX(0, OK, OK) \ XX(1, INTERNAL, INTERNAL) \ XX(2, STRICT, STRICT) \ XX(3, LF_EXPECTED, LF_EXPECTED) \ XX(4, UNEXPECTED_CONTENT_LENGTH, UNEXPECTED_CONTENT_LENGTH) \ XX(5, CLOSED_CONNECTION, CLOSED_CONNECTION) \ XX(6, INVALID_METHOD, INVALID_METHOD) \ XX(7, INVALID_URL, INVALID_URL) \ XX(8, INVALID_CONSTANT, INVALID_CONSTANT) \ XX(9, INVALID_VERSION, INVALID_VERSION) \ XX(10, INVALID_HEADER_TOKEN, INVALID_HEADER_TOKEN) \ XX(11, INVALID_CONTENT_LENGTH, INVALID_CONTENT_LENGTH) \ XX(12, INVALID_CHUNK_SIZE, INVALID_CHUNK_SIZE) \ XX(13, INVALID_STATUS, INVALID_STATUS) \ XX(14, INVALID_EOF_STATE, INVALID_EOF_STATE) \ XX(15, INVALID_TRANSFER_ENCODING, INVALID_TRANSFER_ENCODING) \ XX(16, CB_MESSAGE_BEGIN, CB_MESSAGE_BEGIN) \ XX(17, CB_HEADERS_COMPLETE, CB_HEADERS_COMPLETE) \ XX(18, CB_MESSAGE_COMPLETE, CB_MESSAGE_COMPLETE) \ XX(19, CB_CHUNK_HEADER, CB_CHUNK_HEADER) \ XX(20, CB_CHUNK_COMPLETE, CB_CHUNK_COMPLETE) \ XX(21, PAUSED, PAUSED) \ XX(22, PAUSED_UPGRADE, PAUSED_UPGRADE) \ XX(23, PAUSED_H2_UPGRADE, PAUSED_H2_UPGRADE) \ XX(24, USER, USER) \ #define HTTP_METHOD_MAP(XX) \ XX(0, DELETE, DELETE) \ XX(1, GET, GET) \ XX(2, HEAD, HEAD) \ XX(3, POST, POST) \ XX(4, PUT, PUT) \ XX(5, CONNECT, CONNECT) \ XX(6, OPTIONS, OPTIONS) \ XX(7, TRACE, TRACE) \ XX(8, COPY, COPY) \ XX(9, LOCK, LOCK) \ XX(10, MKCOL, MKCOL) \ XX(11, MOVE, MOVE) \ XX(12, PROPFIND, PROPFIND) \ XX(13, PROPPATCH, PROPPATCH) \ XX(14, SEARCH, SEARCH) \ XX(15, UNLOCK, UNLOCK) \ XX(16, BIND, BIND) \ XX(17, REBIND, REBIND) \ XX(18, UNBIND, UNBIND) \ XX(19, ACL, ACL) \ XX(20, REPORT, REPORT) \ XX(21, MKACTIVITY, MKACTIVITY) \ XX(22, CHECKOUT, CHECKOUT) \ XX(23, MERGE, MERGE) \ XX(24, MSEARCH, M-SEARCH) \ XX(25, NOTIFY, NOTIFY) \ XX(26, SUBSCRIBE, SUBSCRIBE) \ XX(27, UNSUBSCRIBE, UNSUBSCRIBE) \ XX(28, PATCH, PATCH) \ XX(29, PURGE, PURGE) \ XX(30, MKCALENDAR, MKCALENDAR) \ XX(31, LINK, LINK) \ XX(32, UNLINK, UNLINK) \ XX(33, SOURCE, SOURCE) \ #define RTSP_METHOD_MAP(XX) \ XX(1, GET, GET) \ XX(3, POST, POST) \ XX(6, OPTIONS, OPTIONS) \ XX(35, DESCRIBE, DESCRIBE) \ XX(36, ANNOUNCE, ANNOUNCE) \ XX(37, SETUP, SETUP) \ XX(38, PLAY, PLAY) \ XX(39, PAUSE, PAUSE) \ XX(40, TEARDOWN, TEARDOWN) \ XX(41, GET_PARAMETER, GET_PARAMETER) \ XX(42, SET_PARAMETER, SET_PARAMETER) \ XX(43, REDIRECT, REDIRECT) \ XX(44, RECORD, RECORD) \ XX(45, FLUSH, FLUSH) \ #define HTTP_ALL_METHOD_MAP(XX) \ XX(0, DELETE, DELETE) \ XX(1, GET, GET) \ XX(2, HEAD, HEAD) \ XX(3, POST, POST) \ XX(4, PUT, PUT) \ XX(5, CONNECT, CONNECT) \ XX(6, OPTIONS, OPTIONS) \ XX(7, TRACE, TRACE) \ XX(8, COPY, COPY) \ XX(9, LOCK, LOCK) \ XX(10, MKCOL, MKCOL) \ XX(11, MOVE, MOVE) \ XX(12, PROPFIND, PROPFIND) \ XX(13, PROPPATCH, PROPPATCH) \ XX(14, SEARCH, SEARCH) \ XX(15, UNLOCK, UNLOCK) \ XX(16, BIND, BIND) \ XX(17, REBIND, REBIND) \ XX(18, UNBIND, UNBIND) \ XX(19, ACL, ACL) \ XX(20, REPORT, REPORT) \ XX(21, MKACTIVITY, MKACTIVITY) \ XX(22, CHECKOUT, CHECKOUT) \ XX(23, MERGE, MERGE) \ XX(24, MSEARCH, M-SEARCH) \ XX(25, NOTIFY, NOTIFY) \ XX(26, SUBSCRIBE, SUBSCRIBE) \ XX(27, UNSUBSCRIBE, UNSUBSCRIBE) \ XX(28, PATCH, PATCH) \ XX(29, PURGE, PURGE) \ XX(30, MKCALENDAR, MKCALENDAR) \ XX(31, LINK, LINK) \ XX(32, UNLINK, UNLINK) \ XX(33, SOURCE, SOURCE) \ XX(34, PRI, PRI) \ XX(35, DESCRIBE, DESCRIBE) \ XX(36, ANNOUNCE, ANNOUNCE) \ XX(37, SETUP, SETUP) \ XX(38, PLAY, PLAY) \ XX(39, PAUSE, PAUSE) \ XX(40, TEARDOWN, TEARDOWN) \ XX(41, GET_PARAMETER, GET_PARAMETER) \ XX(42, SET_PARAMETER, SET_PARAMETER) \ XX(43, REDIRECT, REDIRECT) \ XX(44, RECORD, RECORD) \ XX(45, FLUSH, FLUSH) \ #ifdef __cplusplus } /* extern "C" */ #endif #endif /* LLLLHTTP_C_HEADERS_ */ #ifndef INCLUDE_LLHTTP_API_H_ #define INCLUDE_LLHTTP_API_H_ #ifdef __cplusplus extern "C" { #endif #include #if defined(__wasm__) #define LLHTTP_EXPORT __attribute__((visibility("default"))) #else #define LLHTTP_EXPORT #endif typedef llhttp__internal_t llhttp_t; typedef struct llhttp_settings_s llhttp_settings_t; typedef int (*llhttp_data_cb)(llhttp_t*, const char *at, size_t length); typedef int (*llhttp_cb)(llhttp_t*); struct llhttp_settings_s { /* Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_message_begin; /* Possible return values 0, -1, HPE_USER */ llhttp_data_cb on_url; llhttp_data_cb on_status; llhttp_data_cb on_header_field; llhttp_data_cb on_header_value; /* Possible return values: * 0 - Proceed normally * 1 - Assume that request/response has no body, and proceed to parsing the * next message * 2 - Assume absence of body (as above) and make `llhttp_execute()` return * `HPE_PAUSED_UPGRADE` * -1 - Error * `HPE_PAUSED` */ llhttp_cb on_headers_complete; /* Possible return values 0, -1, HPE_USER */ llhttp_data_cb on_body; /* Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_message_complete; /* When on_chunk_header is called, the current chunk length is stored * in parser->content_length. * Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_chunk_header; llhttp_cb on_chunk_complete; /* Information-only callbacks, return value is ignored */ llhttp_cb on_url_complete; llhttp_cb on_status_complete; llhttp_cb on_header_field_complete; llhttp_cb on_header_value_complete; }; /* Initialize the parser with specific type and user settings. * * NOTE: lifetime of `settings` has to be at least the same as the lifetime of * the `parser` here. In practice, `settings` has to be either a static * variable or be allocated with `malloc`, `new`, etc. */ LLHTTP_EXPORT void llhttp_init(llhttp_t* parser, llhttp_type_t type, const llhttp_settings_t* settings); #if defined(__wasm__) LLHTTP_EXPORT llhttp_t* llhttp_alloc(llhttp_type_t type); LLHTTP_EXPORT void llhttp_free(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_type(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_http_major(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_http_minor(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_method(llhttp_t* parser); LLHTTP_EXPORT int llhttp_get_status_code(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_upgrade(llhttp_t* parser); #endif // defined(__wasm__) /* Reset an already initialized parser back to the start state, preserving the * existing parser type, callback settings, user data, and lenient flags. */ LLHTTP_EXPORT void llhttp_reset(llhttp_t* parser); /* Initialize the settings object */ LLHTTP_EXPORT void llhttp_settings_init(llhttp_settings_t* settings); /* Parse full or partial request/response, invoking user callbacks along the * way. * * If any of `llhttp_data_cb` returns errno not equal to `HPE_OK` - the parsing * interrupts, and such errno is returned from `llhttp_execute()`. If * `HPE_PAUSED` was used as a errno, the execution can be resumed with * `llhttp_resume()` call. * * In a special case of CONNECT/Upgrade request/response `HPE_PAUSED_UPGRADE` * is returned after fully parsing the request/response. If the user wishes to * continue parsing, they need to invoke `llhttp_resume_after_upgrade()`. * * NOTE: if this function ever returns a non-pause type error, it will continue * to return the same error upon each successive call up until `llhttp_init()` * is called. */ LLHTTP_EXPORT llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len); /* This method should be called when the other side has no further bytes to * send (e.g. shutdown of readable side of the TCP connection.) * * Requests without `Content-Length` and other messages might require treating * all incoming bytes as the part of the body, up to the last byte of the * connection. This method will invoke `on_message_complete()` callback if the * request was terminated safely. Otherwise a error code would be returned. */ LLHTTP_EXPORT llhttp_errno_t llhttp_finish(llhttp_t* parser); /* Returns `1` if the incoming message is parsed until the last byte, and has * to be completed by calling `llhttp_finish()` on EOF */ LLHTTP_EXPORT int llhttp_message_needs_eof(const llhttp_t* parser); /* Returns `1` if there might be any other messages following the last that was * successfully parsed. */ LLHTTP_EXPORT int llhttp_should_keep_alive(const llhttp_t* parser); /* Make further calls of `llhttp_execute()` return `HPE_PAUSED` and set * appropriate error reason. * * Important: do not call this from user callbacks! User callbacks must return * `HPE_PAUSED` if pausing is required. */ LLHTTP_EXPORT void llhttp_pause(llhttp_t* parser); /* Might be called to resume the execution after the pause in user's callback. * See `llhttp_execute()` above for details. * * Call this only if `llhttp_execute()` returns `HPE_PAUSED`. */ LLHTTP_EXPORT void llhttp_resume(llhttp_t* parser); /* Might be called to resume the execution after the pause in user's callback. * See `llhttp_execute()` above for details. * * Call this only if `llhttp_execute()` returns `HPE_PAUSED_UPGRADE` */ LLHTTP_EXPORT void llhttp_resume_after_upgrade(llhttp_t* parser); /* Returns the latest return error */ LLHTTP_EXPORT llhttp_errno_t llhttp_get_errno(const llhttp_t* parser); /* Returns the verbal explanation of the latest returned error. * * Note: User callback should set error reason when returning the error. See * `llhttp_set_error_reason()` for details. */ LLHTTP_EXPORT const char* llhttp_get_error_reason(const llhttp_t* parser); /* Assign verbal description to the returned error. Must be called in user * callbacks right before returning the errno. * * Note: `HPE_USER` error code might be useful in user callbacks. */ LLHTTP_EXPORT void llhttp_set_error_reason(llhttp_t* parser, const char* reason); /* Returns the pointer to the last parsed byte before the returned error. The * pointer is relative to the `data` argument of `llhttp_execute()`. * * Note: this method might be useful for counting the number of parsed bytes. */ LLHTTP_EXPORT const char* llhttp_get_error_pos(const llhttp_t* parser); /* Returns textual name of error code */ LLHTTP_EXPORT const char* llhttp_errno_name(llhttp_errno_t err); /* Returns textual name of HTTP method */ LLHTTP_EXPORT const char* llhttp_method_name(llhttp_method_t method); /* Enables/disables lenient header value parsing (disabled by default). * * Lenient parsing disables header value token checks, extending llhttp's * protocol support to highly non-compliant clients/server. No * `HPE_INVALID_HEADER_TOKEN` will be raised for incorrect header values when * lenient parsing is "on". * * **(USE AT YOUR OWN RISK)** */ LLHTTP_EXPORT void llhttp_set_lenient_headers(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of conflicting `Transfer-Encoding` and * `Content-Length` headers (disabled by default). * * Normally `llhttp` would error when `Transfer-Encoding` is present in * conjunction with `Content-Length`. This error is important to prevent HTTP * request smuggling, but may be less desirable for small number of cases * involving legacy servers. * * **(USE AT YOUR OWN RISK)** */ LLHTTP_EXPORT void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of `Connection: close` and HTTP/1.0 * requests responses. * * Normally `llhttp` would error on (in strict mode) or discard (in loose mode) * the HTTP request/response after the request/response with `Connection: close` * and `Content-Length`. This is important to prevent cache poisoning attacks, * but might interact badly with outdated and insecure clients. With this flag * the extra request/response will be parsed normally. * * **(USE AT YOUR OWN RISK)** */ void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* INCLUDE_LLHTTP_API_H_ */ #endif /* INCLUDE_LLHTTP_H_ */ ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0544522 aiohttp-3.8.1/vendor/llhttp/examples/0000755000175100001710000000000000000000000017155 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/examples/wasm.ts0000644000175100001710000001463100000000000020501 0ustar00runnerdocker/** * A minimal Parser that mimicks a small fraction of the Node.js parser * API. * To run: * - `npm run build-wasm` * - `npx ts-node examples/wasm.ts` */ import { readFileSync } from 'fs'; import { resolve } from 'path'; import * as constants from '../build/wasm/constants'; const bin = readFileSync(resolve(__dirname, '../build/wasm/llhttp.wasm')); const mod = new WebAssembly.Module(bin); const REQUEST = constants.TYPE.REQUEST; const RESPONSE = constants.TYPE.RESPONSE; const kOnMessageBegin = 0; const kOnHeaders = 1; const kOnHeadersComplete = 2; const kOnBody = 3; const kOnMessageComplete = 4; const kOnExecute = 5; const kPtr = Symbol('kPtr'); const kUrl = Symbol('kUrl'); const kStatusMessage = Symbol('kStatusMessage'); const kHeadersFields = Symbol('kHeadersFields'); const kHeadersValues = Symbol('kHeadersValues'); const kBody = Symbol('kBody'); const kReset = Symbol('kReset'); const kCheckErr = Symbol('kCheckErr'); const cstr = (ptr: number, len: number): string => Buffer.from(memory.buffer, ptr, len).toString(); const wasm_on_message_begin = (p: number) => { const i = instMap.get(p); i[kReset](); return i[kOnMessageBegin](); }; const wasm_on_url = (p: number, at: number, length: number) => { instMap.get(p)[kUrl] = cstr(at, length); return 0; }; const wasm_on_status = (p: number, at: number, length: number) => { instMap.get(p)[kStatusMessage] = cstr(at, length); return 0; }; const wasm_on_header_field = (p: number, at: number, length: number) => { const i= instMap.get(p) i[kHeadersFields].push(cstr(at, length)); return 0; }; const wasm_on_header_value = (p: number, at: number, length: number) => { const i = instMap.get(p); i[kHeadersValues].push(cstr(at, length)); return 0; }; const wasm_on_headers_complete = (p: number) => { const i = instMap.get(p); const type = get_type(p); const versionMajor = get_version_major(p); const versionMinor = get_version_minor(p); const rawHeaders = []; let method; let url; let statusCode; let statusMessage; const upgrade = get_upgrade(p); const shouldKeepAlive = should_keep_alive(p); for (let c = 0; c < i[kHeadersFields].length; c++) { rawHeaders.push(i[kHeadersFields][c], i[kHeadersValues][c]) } if (type === HTTPParser.REQUEST) { method = constants.METHODS[get_method(p)]; url = i[kUrl]; } else if (type === HTTPParser.RESPONSE) { statusCode = get_status_code(p); statusMessage = i[kStatusMessage]; } return i[kOnHeadersComplete](versionMajor, versionMinor, rawHeaders, method, url, statusCode, statusMessage, upgrade, shouldKeepAlive); }; const wasm_on_body = (p: number, at: number, length: number) => { const i = instMap.get(p); const body = Buffer.from(memory.buffer, at, length); return i[kOnBody](body); }; const wasm_on_message_complete = (p: number) => { return instMap.get(p)[kOnMessageComplete](); }; const instMap = new Map(); const inst = new WebAssembly.Instance(mod, { env: { wasm_on_message_begin, wasm_on_url, wasm_on_status, wasm_on_header_field, wasm_on_header_value, wasm_on_headers_complete, wasm_on_body, wasm_on_message_complete, }, }); const memory = inst.exports.memory as any; const alloc = inst.exports.llhttp_alloc as CallableFunction; const malloc = inst.exports.malloc as CallableFunction; const execute = inst.exports.llhttp_execute as CallableFunction; const get_type = inst.exports.llhttp_get_type as CallableFunction; const get_upgrade = inst.exports.llhttp_get_upgrade as CallableFunction; const should_keep_alive = inst.exports.llhttp_should_keep_alive as CallableFunction; const get_method = inst.exports.llhttp_get_method as CallableFunction; const get_status_code = inst.exports.llhttp_get_status_code as CallableFunction; const get_version_minor = inst.exports.llhttp_get_http_minor as CallableFunction; const get_version_major = inst.exports.llhttp_get_http_major as CallableFunction; const get_error_reason = inst.exports.llhttp_get_error_reason as CallableFunction; const free = inst.exports.free as CallableFunction; const initialize = inst.exports._initialize as CallableFunction; initialize(); // wasi reactor class HTTPParser { static REQUEST = REQUEST; static RESPONSE = RESPONSE; static kOnMessageBegin = kOnMessageBegin; static kOnHeaders = kOnHeaders; static kOnHeadersComplete = kOnHeadersComplete; static kOnBody = kOnBody; static kOnMessageComplete = kOnMessageComplete; static kOnExecute = kOnExecute; [kPtr]: number; [kUrl]: string; [kStatusMessage]: null|string; [kHeadersFields]: []|[string]; [kHeadersValues]: []|[string]; [kBody]: null|Buffer; constructor(type: constants.TYPE) { this[kPtr] = alloc(constants.TYPE[type]); instMap.set(this[kPtr], this); this[kUrl] = ''; this[kStatusMessage] = null; this[kHeadersFields] = []; this[kHeadersValues] = []; this[kBody] = null; } [kReset]() { this[kUrl] = ''; this[kStatusMessage] = null; this[kHeadersFields] = []; this[kHeadersValues] = []; this[kBody] = null; } [kOnMessageBegin]() { return 0; } [kOnHeaders](rawHeaders: [string]) {} [kOnHeadersComplete](versionMajor: number, versionMinor: number, rawHeaders: [string], method: string, url: string, statusCode: number, statusMessage: string, upgrade: boolean, shouldKeepAlive: boolean) { return 0; } [kOnBody](body: Buffer) { this[kBody] = body; return 0; } [kOnMessageComplete]() { return 0; } destroy() { instMap.delete(this[kPtr]); free(this[kPtr]); } execute(data: Buffer) { const ptr = malloc(data.byteLength); const u8 = new Uint8Array(memory.buffer); u8.set(data, ptr); const ret = execute(this[kPtr], ptr, data.length); free(ptr); this[kCheckErr](ret); return ret; } [kCheckErr](n: number) { if (n === constants.ERROR.OK) { return; } const ptr = get_error_reason(this[kPtr]); const u8 = new Uint8Array(memory.buffer); const len = u8.indexOf(0, ptr) - ptr; throw new Error(cstr(ptr, len)); } } { const p = new HTTPParser(HTTPParser.REQUEST); p.execute(Buffer.from([ 'POST /owo HTTP/1.1', 'X: Y', 'Content-Length: 9', '', 'uh, meow?', '', ].join('\r\n'))); console.log(p); p.destroy(); } { const p = new HTTPParser(HTTPParser.RESPONSE); p.execute(Buffer.from([ 'HTTP/1.1 200 OK', 'X: Y', 'Content-Length: 9', '', 'uh, meow?' ].join('\r\n'))); console.log(p); p.destroy(); } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0584521 aiohttp-3.8.1/vendor/llhttp/images/0000755000175100001710000000000000000000000016604 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/images/http-loose-none.png0000644000175100001710001547776600000000000022406 0ustar00runnerdockerPNG  IHDR#`1><sRGB@IDATxwWս/CT ATKQc1&''Mb{QSF(]FED {J =w4qw=Ϟګ|;0~TZ4 @ @ @ @ @ @ @ @ @ @%.Pw @ @ @ @ @ @ @ @ @ @@) ? @ @ @ @ @ @ @ @ @ @@= 'h @ @ @ @ @ @ @ @ @ @4$3gf̘12qL<9SLӳ +EժUm6jC*_- @ @ @ @ @ @ @ @ @ @ |-ASN?~:>lyeduu| +ve6Kǎ˫SN< @ @ @ @ @ @ @ @ @ @@J[҅[1"wqG Çgʔ)iժUr2qM6I۶mkN˖-ӢE4o^}չ馛R6v!{X5UWW'̃>X^E?ӧO @ @ @ @ @ @ @ @ @ @_b4iR\x5jTrtAݻwzz=irAE'|8 |czf @ @ @ @ @ @ @ @ @ @Y@^p9s3q7w\t No1 СC3> S @ @ @ @ @ @ @ @ @ | Ț\|93y?'5\=o~[n%;w矟vء֫0 @ @ @ @ @ @ @ @ @ @`*9rdvix9ow],λvoΓO>VX!]t '?pK @ @ @ @ @ @ @ @ @ ɹ瞛Ν;Yf)!g5֘f 7 2$W\qE m6  @ @ @ @ @ @ @ @ @ @)Шw}7={̄ 2hРtya.5;<z9?9UUԜU @ @ @ @ @ @ @ @ @ @@ 4Y^{YeU裏} ;uw'g 6a1cK& ʹTU @ @ @ @ @ @ @ @ @ @@ 4mk׮iժUYڿ:4={L߾}se-Q? @ @ @ @ @ @ @ @ @ Tɓo;7]wݵ\@&Kn\yկ~ &  @ @ @ @ @ @ @ @ @ @ hTSiu'ꫯΓO> 6`~Co^xa ]Yf8qbN3gWӦMӢEYc5Һu묽СC6pt1+2iP @ @ @ @ @ @ @ @ @ @ 7oϾ뮻.}]tP|Ys5@ƍ*ӦMɓ3iҤ?>ƍѣ˫FA=z^{핵Zkq @ @ @ @ @ @ @ @ @ @`a9}l~s.z丏>(lI:ꨜs9 u3f7O?'x"C͈#RC9pf͚-z @ @ @ @ @ @ @ @ @ @K< ??i^z饬zKI ?r)y嗳~&N;S ּ[kOqM~5M"@ @ @ @ @ @ @ @ @ @/*&{nP(ViӦMoWw 4(oV[mv)<̬5>t֭ jrW(u<崫*+RƌoE0Q7nEX @ @ @ @ @ @ @ @ @ < |a}WwqjSP.8*jjڴi+ӿrm۶͟2rUVIΝsw7.Æ {wZ+~u |geu߾usRřD @ @ @ @ @ @ @ @ @C/ k`-آH3\,͜93{Gf̘X֫[裏Θ1cRe.A<0zJ6m2`EsW'mQ}N @ @ @ @ @ @ @ @ @[` _;?я.\pAfҤI9rd:YAשۧ>q}YN8}_~y9}u @ @ @ @ @ @ @ @ @ @+r5Xc3k8t4iҤ^{k׮s6m[:tn햢̙3V[Yf{3cƌY!W_}uw^+B!_)-[QFZ;w.,kfƍkw9>lN?Y_f (bYZ}\qo[=Cξά0ѣGrb觟~{4ٳ˹ @ @ @ @ @ @ @ @ @ @ +>+J ]w!Ex`3f̘\{s-P7ֵbc=N:e OGmۖϽzJUUU~^tξ֬ p3Z ͵ԩS3a„ ".EۧwUD2{!͛7:S^_fms @ @ @ @ @ @ @ @ @ @d V[t裏OxeF 787|\جY|ar%dk|Xƍm::<923gΜ>S0~j_0_=E @ @ @ @ @ @ @ @ @ @+r5(g3f33ҥK9kV\z饙9sf\Q8uY{})$[M43bbnuu|¥cǎ_z&:4?<AӧO_ycZ @ @ @ @ @ @ @ @ @ @`i+ԩS Xt>(g};\۶m[<&M}~zn?/Go|;vly{ݏb"0X7gaŚ?pvE8n~#8"lM]\veE]4O>5*'L0oQfc^ @ @ @ @ @ @ @ @ @ @@\AE{n-3fXlNZE~uQO~>\-[o'x"}ɞ{_iӦMzX^yYswgI~r92bFs=7߼W?C?~|303<3Ewy W^ɮƍ>s|q^z)vX}zkW,,([hƍW/p(,"r6mڴ <8 ()ŢV[-&L}żo~l&[2lذ2 ~-sB @ @ @ @ @ @ @ @ @,}_YcwO&Mr=,}Z{hrN(wxr饗.˧~ZOΘ1cEIf=|ǹ+ѣGOί~ AA @ @ @ @ @ @ @ @ @ @eLɼ_:ݻwwߝk^Ö38#[N߾}ǿ/y'ҴiL>t=:u,?wuW򪪪GQ@ny @ @ @ @ @ @ @ @ @ @]F56y͛k2?bĈt%KiӦ`,^zeȑy뭷R#k~*Wp 7{m;/'tRS @ @ @ @ @ @ @ @ @ @!7/fmra .h{ W^ye9L~fe'*םkrZvsnҭ[;GqmoܐJR  @ @ @ @ @ @ @ @ @h ,ү_\{9CADa5559s=C*LIFwn=vج# @ @ @ @ @ @ @ @ @ |T-EO~y䑹{4|[3xuy U9Ix*缢r\U!WQn'OS @ @ @ @ @ @ @ @ @ \ 4r[n)w}AS?rA4y>(K>3Ϭ3U<灕9/R6d @ @ @ @ @ @ @ @ @ @?9rF׿5_zkva-cO#8" C Z̨Q㏛V|fk+AU[VWW @ @ @ @ @ @ @ @ @ @ iTSi Q =?1?rYgI& ;=zt=J 80{"/& @ @ @ @ @ @ @ @ @ @ˈ"A֝/lVk}Zj ʱo|ӱcǯ|ӓ#P曓cSY_> @ @ @ @ @ @ @ @ @XY><|0O>d.]}Im4wkC!`ȡCf͒=ʱp F @ @ @ @ @ @ @ @ @4p%?2dHy=Cy!u%m۶e0d˖-ӢE4o}zYBᐭZ*#ve6Kǎb>8PȻN*̤wSqZ4 @ @ @ @ @ @ @ @ @4l50 ߿:iܸa5*ٙdРۓIvJ \\ @ @ @ @ @ @ @ @ @ @/Avfɵ|i LI[oM>(ԩ6t @ @ @ @ @ @ @ @ @ @_kdСIuumIO?ly^ӧ'_ 9xp2fLI޵l8v @ @ @ @ @ @ @ @ @ -򢋒x{96|sРy'p@"rFV$@ @ @ @ @ @ @ @ @ @*5VolY2yv.:_}@1"86גuI@>}nݒ%[  @ @ @ @ @ @ @ @ @ @$uT2}M$~8g%+Pov%}trIk'ZY @ @ @ @ @ @ @ @ @,y$sc~&oK^|1O+i&9[)S. @ @ @ @ @ @ @ @ @ @eEQMaFN6,쳹wlҤ6hKxdРdGVJ';Wz; @ @ @ @ @ @ @ @ @XZ5r=L/a^rMC$M&{_ҪUèS @ @ @ @ @ @ @ @ @ @! [%$;mMF_q7'&GRSQ ٫WҺuéU% @ @ @ @ @ @ @ @ @ @!Kf%}6#m0>$PȻJMKv%ݻj׮a֭* @ @ @ @ @ @ @ @ @ PYsN2lX2ujҴi2}\adʔ,]&%wޙ T9qbҹsҧOm(,]Q- @ @ @ @ @ @ @ @ @X\YWi'睗3f$͚%ŷ}+X/PsO2p`r-Ʉ ɶֆBo  @ @ @ @ @ @ @ @ @ @ kd]Q'['7ޘjw_rȑɫ&_7}YNx6rj { 7:  @ @ @ @ @ @ @ @ @[k qWWQ'&M$͛Ӳ)0sf2lX2hPIE0d.IFٝ @ @ @ @ @ @ @ @ @_%?O0[~|NK |啤]k!w%ix @ @ @ @ @ @ @ @ @ @(AvlErEK#3ԆB>np@m({$M. O @ @ @ @ @ @ @ @ @@ANjmG,CYuxB>xҪUᄉ{해hI @ @ @ @ @ @ @ @ @ @` ȇNv9yd }`'\|o T Y;*B P޲J @ @ @ @ @ @ @ @ @ @`I{W?$￿$cEn 2$i8sPOV[mypN @ @ @ @ @ @ @ @ @X=Mo\ڐƏOn6{3w +iӦ!W6 @ @ @ @ @ @ @ @ @X=uӒdybvkC!32%֭6 @ @ @ @ @ @ @ @ @ @5򥗒6KOvqbX}uW2hPr?Cm(dF-ݬE @ @ @ @ @ @ @ @ @,PAW^{lIf .K`ڴ{oNƏO޺6Od-N!@ @ @ @ @ @ @ @ @ @ (1">|B`I ̘ R yM'n] vK @ @ @ @ @ @ @ @ @ @*PA]$o+s74ᇓAj7L_65iԨU @ @ @ @ @ @ @ @ @XZӓQwC`E;'睗FI~'ݺ%%'w_2cƂ[ZF;6 Ⱦs=]SIѣGgSB @ @ @ @ @ @ @ @ @ 8-駓SvX[n䷿M^|1y٤䡇=HڴI9&dڴŻo}V,ֵ &^ޞI&u3ggƎJ @ @ @ @ @ @ @ @ @ @`Y #UVI6lY#teU`-䩧W^IN=6r}֭O J> {T,g̘Q馛Nhp7nܸbJ^xTU۟  @ @ @ @ @ @ @ @ @]zKZ{dF]L'[v6ڨ6r䭷&=:wjC!:(Oi?555 ,BbkժU%4 @ @ @ @ @ @ @ @ @ @`hR_g1"w>@ɏ\{}a2xp2p`rIo%}$ƒc}\uUyӾR`Ϟ=ӷorHygsLYgg+]w]~w;رc?)FJ˖-sG˹^zi?ϳ>[ }.?|ƶn:*zjMVu-'|rxrN&M sWoxֆUn^r%QC+g˹[U\%ׇ_HNʽV]uY= @ @ @ @ @ @ @ @ @ @TG!'&/C}f'ЦMrqO2fL2`@RU_u7Q $|jKeݻE ZkC9$|pM7ݴ|>+Z1礓NJˠ"\,ovک ,%?de]V~/~ec޽ƻ;[mUy䑲S7_A)_}2X`v+v??+Ԕ{?;찊kU|ߟ3(C(=Jgs9ܹs&O\| @ @ @ @ @ @ @ @ @ Р%'3wlPgW *jI%0ܒ\uU)$%J`aۋo^{ q2~@IDAT5*f@EHb5}z/~ً}^[mh儺 Ǻݺu+_~庮+rրC&jjjR73I'49.Bgo+ɯsmXm,B/?_yy.ү_ 0 E\?zdmc'{hM&={&_~rn%\lu&<uzh ڵ+۴i3a g uY9#s + u]tS?$zh>y䑹"7|w @ @ @ @ @ @ @ @ @|K<rTBߒmϪ JqOFN~89Ov1Yo'?IǙ3Ν;|9<{׮]{Y*VWW1n~/naV^yp 9r䬡3+aoy=^W928qW?SRE.'|rZk\}չK+33xJlm/2pn+?^  @ @ @ @ @ @ @ @ @ `x/&Ӧ l0q4HJNcv)9ד'L]vIڵK?>Tu}'ַ*s^ϠAf}뮻kSO-ڶm[%!]vY%Jd%};S{fedsgT СCvarرc{Q[UUU~k[nnݺeUVI~>?%~i7{_>/\w޹\e˖8p`s\x9r衇C9 @ @ @ @ @ @ @ @ @4$ƕp3dAܓ~{*rIKr'kXv^;#9Ĥod啓RyIڤIzɁz++{%Hyi߾}2stMg 7̺뮛Ȅ oQ%++ӟˈ#Tj'{w>ewQ}衇+SNs"6xr.S|,B&W_}k"c)):=oy0`@暼e~헓N:ov+SO+)/lֳ@ @ @ @ @ @ @ @ @ @"ШҖd1{o2r_O JL wߤwd7-C;t0ȸqRUUU0q'N,C" rQ[k9kZuuu&MUW]uV߼b3f 6(1kVZߋ`K @ @ @ @ @ @ @ @ @ Q`Aۿ%묓\~yC<,L2:4i,3')!"cq=  @ @ @ @ @ @ @ @ @ , ȵJN;-XJML<9Çϐ!CϧfNM`wIƌI5J{Ek۶ +1|y{sG/7uP @ @ @ @ @ @ @ @ @@%Y'c&l$w6e_Emkܸq:th g̙3g!4m,:옉ΓO&OXC92dMҵky]fҤd>}޽_휞 @ @ @ @ @ @ @ @ @-D ??oj `# L81Æ +C!p{,ӦM˺뮟 7)SvsuϧnNjC!`M7]^Ŝ @ @ @ @ @ @ @ @ @'D O8!yd;S`yGgCE꫷juϘ1-ɞ{&͛ML%@ @ @ @wWչ/w(C AQ` (%ʉƀ%%94ORTPcC jBQ)]D((U sgmT gkٿ%@ @ @ @ @ @@( !C" ӈJ*e '/kÆEBDZzE ٳ Ba @ @ @ @ @ @ @ @ @.R 'x3#F,rܸU#w y뗳) @ @ @ @ @ @ @ @ @(PjAիGw_)Vohʔ?!g" "N:iC(d7q2Ub @ @ @ @ @ @ @ @ @ *֌3fDn]Z(_ F Qfď~^]FD @ @ @ @ @ @ @ @ @)(l1MZ.4F7&IO#x"b##>$#8숖-jJ @ @ @ @ @ @ @ @ @.P*A F4m]~aBD={Fa[Ζ_~CҥՆrr @ @ @ @ @ @ @ @ @LjիG qy;Rg  }1bDİacFTѭۆP޽#4X?qWqI @ @ @ @ @ @ @ @ @@aYɶE"֮{hؒ{F )rРLF4i!XB#Vp3&mۈ = @ @ @ @ @ @ @ @ @ P9$6-#O8X~+"{,">>DĚ5ѧOo~pcV*ɉO6 @ @ @ @ @ @ @ @ @;*PAwD˗Gԭy%'jUD7*B>pħ~) #3~/oW_Yvm|'Y_re*\dW.ަ5 yyygl~~~ׯ_ʕ+gRabVժU+QzQFk֬YMuԉڵkg== @ @ @ @ @ @ @ @ @J<r`k#5 P2# U^#FDthѢ/]46˖-+ ]+VDz.;nPXXBvki-:(S/ L)rk-F`Ⱥ+ 㬟m6lF{7Ξ @ @ @ @ @ @ @ @ @U1g%>pCpZɎj4С[L[1~1DrKĀ^C h>pGei S8-2ÍSbӦMq J]v6תUsiR~i|'YOi?m0 .~8,3c6n)2BsϬU5kOM! @ @ @ @ @ @ @ @ @)SPJr.6-JrTc @^{-]s#n- # "5kV̙3Ϟ=;7o^ymРAq aQ0a&M 5j@ld ,YRhѢl?͢\;{」En,; @ @ @ @ @ @ @ @ @J@ă 9gCUeʔxcժUrHk׮zѴi ^W_}jB!88cޢE v @ @ @ @ @ @ @ @ @PD ׯR%bЈjZ2L eڦcƸqb„ 1daGuTt1:tm۶ wY&0)_^z)N&MB"׭[͚5N: ''xb0Ҝ cc @ @ @ @ @ @ @ @ @*PAѰaSOErJE%nv{F*73fL,]45j;w?>9,F;$تիPȉ's=Ǐ%Kat%N=֭[lrc @ @ @ @ @ @ @ @ @ hYQ\1iRđG?  P֮]ƍG}4F3gΌ dy'|rt5:) Q ⭷ފѣG3<~\ܪU83ΈN8!VSv  @ @ @ @ @ @ @ @ @ʫ@ANqѺuy%Q7eI ///FCGy$V\Y4{d3z;vJ*B`֯_SN'x"}Dz:J72lذcLar֭cѿHi @ @ @ @ @ @ @ @ P%yQHjU Wi8vk?nᆸۢ~qgE-̝;7fwlٲ8p`4o|G, @ @ @ @ @ @ @ @ @@) T* s CJrDc ; |~7Zj/Bj7gΜ/B w7om%!o&Ao(}KJߖF @ @ @ @ @ @ @ @ P6J4O") UeG ///׾ӦM#GƤIo߾QrSJͤo'}C[JT֭o,}k @ @ @ @ @ @ @ @ @@( Ȕ7[ʖ)SqNj/ݺu+[E@9HRnKZ4 @ @ @ @ @ @ @ @ @#PAkFTZvʖAsqo}ݩI'zکMGe}+t&QF__"g/8o|1~.o{+cǎ<ڴisJX7= @ @ @ @ @ @ @ @ @lT)2"rsKrDc \s5q 7%Z~}kNFگTDpsĉcq%lzCKk2dH,_//"7$G4]`qUWſڵ._Nwi U?t-*U@͟g1z((((ڟ{}٧x&MD_mo%GՖo=oƉ'GydY-U] @ @ @ @ @ @ @ @ @^D֮Zu7@C+^z7xtn]zu)oԩ1lذ]v3 / . +w]L4)ۯ[novzŐ!C'NB/~h޼yviѷoygׯ_]NN'pBCE ,:DLsmK0aBVg~~~s9ѧOӦM:u+V#<<@tMq]wSO=͚5_Ѯ]ƌzk̚5+?Xxq_O;i#Fd^{^q=)/HoYuꫯQFEr8p`6f \jU{q=DFbٲe1r>|xO|}Ѭ{f~o%]H%4N˖-wѽ{왢? .g{~_GӦM.mm{(qj @ @ @ @ @ @ @ @ @FRIN[#,رc#hѢ,0oe])1;O?4^~߿L<9+;0Ο??{k׮Yd ~7hР8cǎqmE&M??sͮџ:( &lРAĢx7Ƿ,C}ё #8"x׳G,H2KAy) SOwy'Te1Rcj) 2&~:[[c m۶$8묳1gyfxi7 L㥶kTRf԰al>;?#L'D{R_ *u>;O!//Bv_~CN:) X μ袋6eo1} @ @ @ @ @ @ @ @ @v@A]QYY ({)0uQƍw:t(Ӊ8qĸ;㷿m_>ʕ+Ǎ7ޘ:4ۦ?G&ؾ}9sf'?o~Y_}FĐ!C+I!)40>97o]6mZN;w\rIv_ L綵mRhcu?)9{^,Yf~ѫWQF\qQnݍ'|2s;C CsG_,ԩGv% ,c=6 VZ;. <ó8W_^9nܸV҅HsCkY?w_<ѴiH㗕MA @ @ @ @ @ @ @ @H%YUU&7n)0XVl(@q…q;,pΜ9[o5e=PY8T1;YNv^t*N4) /LAgu&eG4gVb[E8$kɆNA{o6o׮]Kn)1Kɓ_|1Rdj~-vgJ{)qV۴iS|)+Vg}V|nJ \xqpGy$ K/IֶmnʕEl  @ @ @ @ @ @ @ @ @*@ ~'@R^ KrJ)TCWD|'xWO&w)@2wy'yWo=uVt:N>=֭SL5k֌+VD Iܼ͚5kSr+ׯ_[loq|0N;K6m|A~a_prݺu1x"QF9wS[Ld65 @ @ @ @ @ @ @ @ @]# r׸@x{-kN?0~_eE:裳qʶSLɶ:u|ʕ{=3cƌ)޾}l?y0aB\uU[) \|y)06zr^]vSO=#iǹ#???駟fۍאB =EuZ7).裏꫑j;vl,]f,a7Mj @ @ @ @ @ @ @ @ @N@䮳73 !pGF 袋(\pW.|ŊsͶ)/̙D 3ѣGh"/IrJ{1|c=+2;xlK!)/)'^ywSN 6,u~wy?x{8w}w~1hРFE,GvS!CM6qDž^M4>[ǻwygL81VZ7xc,X 'xꫯƛ4iR<~fͲpn-O,͛yyy1l'ՕZN[zK,IdmJ _]kذaC9$ׯ{7٦> ;Wvo0@oR#@ @ @ @ @ @ @ @ @u-l%5lsJjD ;t)֬Y^zil2=НB nj͝ 7nW]uUSbZ.e˖E ${K @ @ @ @ @ @ @ @ @߁ T()SD~bq7F߾}+wt)|G[fo|c ,X`mo⡇ u֍ѣGov/< ;#hK @ @ @ @ @ @ @ @(Ule #@`Ht/r\qM7)[nzKzQՋznOߒ%K͛W {mڴzkԨQEqUWe=77"X+ @ @ @ @ @ @ @ @ @ s74thIhvg?0.׿+Wޝ]f֖q}ݱnݺСC?~u|cڴiqf^{A @ @ @ @ @ @ @ @ Atr 7pCvmQ~,/-Zl~Xl&#V^=Rʾܹso&}7=ofѼy_  @ @ @ @ @ @ @ @ @X@d~N ,_<  3fD.]Ϗ>}DzZ!72lذc̘1Ѻu0`@7߆  @ @ @ @ @ @ @ @ @_M@Ws,0a„,rСz8S⬳Ί3<37n\ʳ@XhQ<1bĈx駣FqfᏝ:u*; @ @ @ @ @ @ @ @ @`AnUyyyO<NOhٲe YfUVea^lSc:٠AC9$ m۶m4k֬#X @ @ @ @ @ @ @ @ @@ ,5Z P/^ӧOwy'3gΌSeˊ{D-b}ͶO{jժog |g1o޼Ds΍9sdދZVZEp@S/H)sɒ%7 .>h;H͛7ςעj @ @ @ @ @ @ @ @ @  @ l92G#:u=̗@ @ @ @ @ @ @ @ @ @9' @ 1eJD~~GD"3K?, M @ @ @ @ @ @ @ @ @`+ 2=#/! @ @ @ @ @ @ @ @ @| ,M 1yrGGtRğ @ @ @ @ @ @ @ @ @@ ,DC @@[7bĈ"~ .X|ԮJ @ @ @ @ @ @ @ @ @C@Q ''?x SYa @ @ @ @ @ @ @ @ @AA;q(ݻGL#xU @ @ @ @ @ @ @ @ @/A}JP`#&LsCo" JpC @ @ @ @ @ @ @ @ @Lf  @@Q#⮻":*#&OΈu+ @ @ @ @ @ @ @ @ @$J;i @2-pe>Ge\ @ @ @ @ @ @ @ @ @SA)J^"^z)b=">:K~# @ @ @ @ @ @ @ @ @TlA[=l&^cD|[qU @ @ @ @ @ @ @ @ @W;#:+cLjC#N8a^fM/'ի]vqeEfͲR__|ű>o~.\QFE˖-׿u4mڴEOSL6-ԩN;->gΜ;zټG&Li߾}?|:yq_cƌ?QJ;{0  (rIJe˲{ݻwR}  @ @ @ @ @ @ @ @ @vSVRk; #P,+WFabģFpCď~]tit%7n7|sX";l;rܹsYxcQF8SO~:9h۶m@tgϞS5kVvW\zh?oo?ڴi< -Sd \`A6F7>v5^+^dOj8p`s=nݺXvm /dy睨UV߫W-wEa @ @ @ @ @ @ @ @ ; ߪ5 @NHQʿ}5DF5kn}oۑBgϞ-ZHa'tRn:^͍#<2Nׯ/(rѩS{k֬e˖eg}v4l0nxĉq^{/wl֬Y̜93/^ݷ>u]C BӅTǴib޼yѤIXY٪U1cFԫW/{6TN48rfԯ_?H5_uU!@ @ @ @ @ @ @ @ @vuY(u4x( [x-O[PygE!?>jժ' Ȣ&vam۶m,_< hL!#FaÆGʘk׮FԺwիWzj)rqwdO \n]yٹ+z]NVV-Vc&?xGsq饗f5n1l  @ @ @ @ @ @ @ @ @ ZTSO2% 0x1'| fa*m*UG=;eA7gSK!E(iJ_~xwk)hyk޼y3ƌ=G~~~8xAo߾ѿ={vyqiիMr@ @ @ @ @ @ @ @ @6Mg9 @`g _Ą {G~zuץ`ޠA,>9slr{7mڴA\SfpWZ ,O*#µ\ַ7ߌn!UVxYxnݺHw_u5*9o ӺD @ @ @ @ @ @ @ @( +R # Ag|Fƍ)SFSd~~~PmmZڵk</rcׯΝ[|vN;w}㦛nʂ#:w~WD ZK㣏>}ƫiر0w: @ @}iU{~"0Q9T`%XK$DcԘc1[FMT,Q *(( u;FAf`ʽk^{G @ @ @ @ @ @dA5j xEvS2Rb yŜ9s1cĈ#g?YKL'۷o .n)nxwcر>7.K4yYg]w5.طoҥˢz)SG4h 1=H[lEѪU8ꨣ*>3f A)kZkݻwm۶˭K;A @ @ @ @ @ @ @ @C D]\U#~xUh P;:v8昈'䒈M6EAҹsٳgvmѿx .iB"VZZ=P</ |>y9x}'?I 0 {mQ_|ꫯg~w}.qgԩS#6y͛/.?vaÆl L|pٽi~y46lJq|ꩧb.:uW׸q㲱u @ @ @ @ @ @ @ @ @uQh᢭vGZie#@ ̟q\q9m, V\LSRRÇ?}"7bukRN @ @ @ @ @ @ @ @  VY @8_=:W+ @ @ @ @ @ @ @ @ @ꔀ ::-jiˎQbآ~(*Җf0pE @ @ @ @ @ @ @ @XiF+= @ n:o?#f͚?=' uV!@ @ @ @ @ @ @ @ @5ZG,8 @ 5*=ӦT@ @ @ @ @ @ @ @ @ r W @zF :,x4hVg` @ @ @ @ @ @ @ @ @Yf @_[8y_ٳv&/syE @ @ @ @ @ @ @ @ @( r5⛚TV#ߎ7 .1vb޼/=[o1u.9A @ @ @ @ @ @ @ @ PAր P׏ѣc<^~a7c>9n\ġFL @ @ @ @ @ @ @ @ @@YsޅJ @r;~??&M&z4(b܈CygO/w87 @ @ @ @ @ @ @ @ @bAt @*vux="v%b"z+bţ7X_~"*f3 @ @ @ @ @ @ @ @ @@U *I @U,ЦMc-|ňPZ_sz @ @ @ @ @ @ @ @ @_@* @_[#|r鏧`>bȐ_w @ @ @ @ @ @ @ @ @` \f$@U"0eJAE,\5X_OH6 @ @ @ @ @ @ @ @ @/ r @H1yC,6,\)<@ @ @ @ @ @ @ @ @ P  Ր @R-{tG\%@ @ @ @ @ @ @ @ @~Aol P[m1xpĨQu/qOUR. @ @ @ @ @ @ @ @ @N@䪳6r 78܈wމ1"#6h4C!,0 ⮻ @ @ @ @ @ @ @ @ @@E ܿ[8by @@5 q=)r֭#>(b @ @ @ @ @ @ @ @ @,UR:IҘ={v|epsmܹe¹F1̋1c֏÷.Mkz=[oǘ7o^n ,B(-riTGIIIn~}![:˷Y8.**BK  DÆ s++5j(ܲqWXc(ߚ4iqִief͚Eqqqn9 @ @ @ @ @ @ @ @ @:j!@_!M3f?_j̙QhfR?Kil)ba >LRk?$>|4iE71_+*K WLAB /~ ,u)|`e x\LGsɵbxf8- ٢EHyy_߲ehժUTεn:_O6 @ @ @ @ @ @ @ @ @   @`fϞ|I|e>+)ЦO^ ۴i:t( , }qqqnt\}j)12ݝ%SxdRK-< A)xr„ ea@4N \ږ5\3R0dj~>ZkV8]K6 @ @ @ @ @ @ @ @ @vH I )o1iҤ/NKk)S^!/۷omYYh_!Oah)TEUuť#SPd.Sh -Vя>(0RPe(묳NTl뮻nm6[oOXcC @ @ @ @ @ @ @ @ @P@*6T… s?'Ƅ h\ 3g7o޼,/孿ѣGX{˂ Bc&M#РAB$S '|[ 3MBi7. #SL/1]֭s8dSk׮]ӾC%t@ @ @ @ @ @ @ @ @ ȕ&4T@!w6f̘lBS]!|] wLav@ۮ,m۶e_\\\%*hٲe֩SJ͙~OӦMˡ'OSSXjj~ާ ,(E9r 6(w1:wO5Zl @ @ @ @ @ @ @ @ @@-˾#_JL#GQFS8w܌TTTCS\"- MXy鷙VƎ}ei&Bp.]FmZ i @ @ @ @ @ @ @ @ @_ =b'|GŬYl 6Xp qNr\֤I*piB[ ᭣G)5I[/6dڵk>SkѢE6{ @ @ @ @ @ @ @ @ PoA֛WmHÇ/k#FԦO'm޼yKapFبQ)Ψ!SK>|e-F:tݺu6,b-m۶n @ @ @ @ @ @ @ @ @U! rU(uD`ԩ1dȐxs6lX;1{hРAt)men]v_X++0Ha^-Ǧ'|OAݻw=z[}ӦMWvz @ @ @ @ @ @ @ @ @. r @f L4)^}x7ڸqr;v!m)6lh֬Y\)l6Z MaӧOFٞ={F˿;* @ @ @ @ @ @ @ @ ,Oz*0x_Wn 1cDÆ s[olMnߦMz*eѣGǐ!ChǏ=z>}D޽cw]I @ @ @ @ @ @ @ @*- Tn$@@;wnK / gϞnaleW^Q\\\wn% &īZӧO_?Kѽ{:f !@ @ @ @ @ @ @ @ @! nG @r O>d<91An喱;疂ڷoq@(PZZov 80_|1Ə!kHmmD @ @ @ @ @ @ @ @H@d=zٖJ@X`A Gy$ѣGG׮]c==3v}Xk P0`@<3sӣO>o}+M7ݴ^yX, @ @ @ @ @ @ @ @ A5=U&+]w{oL6-x`p&T<"@@m())^z){܆[mUs1qQGEjrJ @ @ @ @ @ @ @ @X@d-~yJ'@@A>[n%5jTqGơmڴ)fOHA)01bĈ{O?6lȉ @ @ @ @ @ @ @ @T j50_ >^~q뭷lO<1ڵkWuD^?qwܳ>;FqqqYe @ @ @ @ @ @ @ @ @@MhPQ TN`ʔ)qǦn|AUmi /0בnժU\vey)S䚆-[N8l|C5?sOL0!wqyX_~(U<}Ѹ+o=~h߾}^[nY-/_x Zh_p {w(25qmO~4hPfڶmguVt%zR~ٳg{cǎ/ꫯZ;wW\qE~~Y 4wSO=5j}"}6 @ @ @ @ @ @ @ @ u|=GN/ϡv52ѥ_1f̘ wi{?׿tFm|{7| Ki+@^wu뮻F^⦛nX7V矏K.$1jԨar] `8qbq7WjSg}v4m4 *o}[馛~ O<蠃z.[^{i)owޖƙgoOS~LzC O<1V;o?y?~SOQGM TfΚ#SM)59ċ/)1δUw]3`F @ @ @ @ @ @ @ @VF@y@`ƌ1ze]Vl3G]v*;/ /{{$ >{n>!{lΝ;}rK'֥gS]3k?cvSN9%'@]py_]b6lX\941՘<Җ[lEEEtsO>4N L'tR٬+2oy~y6mĿҘBSH+]Azg|0H׸qr(h LAIk (MC L7SY'|2G;J%%%K\a)tuen [cС'v)Q~߈{/U-92yH?Rs1oh"ony;3]{DI]/P-9Hn|ZR2  @ @ @ @ @ @ @ @ @ oF]@#FW&M|f͚sݺu+SܹsΝq 7o ?p̙3,>쓻)0v<,z(xvms;b7axiںw ,r-R]ŭڗ6X[e cǎ[N5ɓ'}eX6tr- MMekNK.SOu}ye]K7$PA0t~رi)Sp·駟;#_?CʾT{OY?zhtPt!;DeJ/'Ps:=_۶߱zնK @ @ @ @ @ @ @ @5L@d {!!@@E 1W^ye;xVK;C:wC&MVJ{ɖ__Kƍ/ 3\{M7|sk.Rh׮]Gc,Za5ֈdv_w}s0q!ދVZ}wK$'Zv)?+3W߾}sb֬Y#FĆn)*[gy&N8ᄪX @ @ @ @ @ @ @ @ PA×n>K/4ΝGuT̛7-`%+N!rzj|q7ƣ>1 î;p©` ~[-ܒ7. iI&Bvbm)IJ4V2+2s̳y%%%ѧOx7裏3fg}6u-uG t<#vKq!Dڟvi0~ӟI'M59SHcmԨQOq˖-3)2s5o˝]Ka…K🳕y)l?qm6θ馛rx?˺9#fu͞=;>x3Έ^z)?Wz3?ϣs/r{I&l@+;W}ÿq;gWc=CBwej[%@ @ @ @ @ @ @ @ @( % @`i)W_ ٣G[ڭ5܌3r]'NM>Be +?<:S_pSp] +l?buԩS4߅^{W{N=&:뮻_W^ye7tm]a?|ɓp~ʔ)رcاqs}:h߾}L7|sK=\GJx-Dnݢ_~U~BL0!_)|+tC]g9@2{B̝v)Ϸk5?;|~xqC ʵKQQQ~ϥp޽{=PѪUֻ2'ޱcy'f䚂)7ogyf>~f喑暘;wn ><:w?s齦ҽ_|E :4R)hqY5n!wjJa;wU;k׮]<1p N|7c6A&M!)T~8θcwn92=s _[nrm 7o=~~{{o|Z\)02?4Rh ;CMiK]jП(_"N8Xkr5L @ @ @ @ @ @ @ @ @@-(Z"?#- @@5 ̙3'RW\)L_~q'jz?ulUE|'1lذԩSw>D@k–ޠANW8 N0!!暱kn}UW[kiiic6e]+;H\~8G?Q4i$R(f xL!n)]wݸ[}>:jHA_gK@dU˚+mn-l0ٳgǨQ?i;+:kg3<.So { @ @ @ @ @ @ @ @ POAosFE )rРAnGzugūo%'O}ws99Do7V I&E۶m4%\?Η?ѴiHA۪juy˺~u駟 Yg%n}g㩧KxP{q L!\K<S8<K<u5j ,X=bU6.c7B5;w#G#Fw߽_{k֬rǩ %%% Sc.]{Ѱah}DFjÒH @ @ @ @ @ @ @ @@@d=xɖHe L:5^|^y2dH̝;7ڵk!{lMn:tXP @RcСߩo_|E:߫f.vmM4Z L @ @ @ @ @ @ @ @VF@yuP`޼y9hmРAꫯ栵{/JJJr[o[mUt=7<렄% &MÆ ߎ7|3̙-Z޽{RK @ @ @ @ @ @ @ @VX@ yO/z+B:4R0[ i9sf4h t[lEtm֦MeTJ`…1v1bDY>|xeԩyG=rٳgֵkN&q @ @ @ @ @ @ @ @ kKQj@ q=ztY()ދYf%m6'6dBqVj2HJ'&L~a|y_2v6,6|ǵZk%f( @ @ @ @ @ @ @ @ k{Qj@ ~;vl1"B[ڧȒ^;tR6pON:Eqqq5P8$0uF-gϞ97oC`Slu-Rc֭ @ @ @ @ @ @ @ @ @@=Y?'@?~裏bȑ_~?cƌrRPd رcާ~b 6ȭ}ѬYuz>,Ə_Rk }L/=Evb6ʡlI߬ @ @ @ @ @ @ @ @+ @#BƌS4WB&N%%%eZe믿~R+oٲe3:… cԩ~S&LBc!1[pΝ;֦Mw^'@ @ @ @ @ @ @ @ @\"7 @@MH!)R7nܸOv' [f͢m۶Ku]7:kvާkYxԞ@X`A|91})1)Sɓҵ򁪍7[,<5o>>vСlߦMo@ @ @ @ @ @ @ @ @ PAֆFX!&MD^8tQF92CZqaߺuH-G-Z(?>J `3fcڴie>,RKAL4asi :M! ԊO*U @ @ @ @ @ @ @ @ @F @Z.NDKRR _zK+oذaLᐩl2Zj\ ,ܗZ:.oڴ/))/Yf̙3|?K?-=6{%iemɭY-ߧ~ m֬M|fvشy&-^< @ @ @ @ @ @ @ @ @O@d{g*&@:&S ̙3s+V $L OgN %%%Qh_s-\dX˟+**-]/W_ML,hРA >SkԨQYkܸ\ cL-=[EqqfmZZ  @ @ @ @ @ @ @ @ @e 4ZE @/pU^qC ӊ A5quc}"_޽&VX5//?\loGخ]mt @ @ @ @ @ @ @ @ @Tf @V7G}vĕWFrb{n"zŞkwoA}EHD5Ru @ @ @ @ @ @ @ @ @!Р~,*  @@ӟ"YgERoԭwYݫa矏x睈= @ @ @ @ @ @ @ @ @A.K5 P>8?O#6߼XM%{DW_]Ma*#&L{3b- @ @ @ @ @ @ @ @pA5)T#ڶWgFsOuU®]#}6b⋪x @ @ @ @ @ @ @ @ @@eAVF= @ qW\Ѵi )jq͛Gx*MDq!աY  @ @ @ @ @ @ @ @% kɋR&HѷoOf"݈뮋?~7<'#RQGE숞'@ @ @ @ @ @ @ @ @VD@hF-⥗"b5Q>I"SKK3sV-ZPYZF  *4YS!lBʒe 3c1a&  H$|{Uڻn>?ǹ{>9z ]¶  @ @ @ @ @ @ @ @ @z* r=8&@'p%싞x-#ڴkZϫ*дi/ U? @ @ @ @ @ @ @ @ eWwq @x晈7\Z{ݕuw߈ac-uG6 Md>c  @ @ @ @ @ @ @ @ @ Z++r=ڶ]د rf/_)^yeǕPz Dw_ 8l!1K0"~;b- q1S @ @ @ @ @ @ @ @ @Q PF>{Tֻhot-k׈>=iZ^-WT=DW1gN1; @ @ @ @ @ @ @ @ @"& ] @%ψf/T?oQrDok=pÈG92 x: @ @ @ @ @ @ @ @ @M @`] ̘q[nY.fP_{G֭ꫯ.5ҤC :DӦMSN1lذ_.hժU\uU1v_ɫP!SA.̯:n[j/X ̥6}DxcĀy  @ @ @ @ @ @ @ @ @A @ _) rSd.qɓ'+O>d̛7oւx]wžC_=nyo4n8y{RJq-Ę1cI&*Ut曈c)d1L2%^x̫^Ϗ#Gƻ鹰J 5O>9ry  @ @ @ @ @ @ @ @ @@Y  @ <`DT\Ђ 5j|&QL:uj\|K/ŸqbرѦM,t2է2qh۶m.?!|utM1}~Y];#"zZVקPryo}qZӽ`?0J.QzDNddS[ @ @ @ @ @ @ @ @OM*fNE֊wE Ѿ}Dr -2&/\0 8`8b}ɦSN#{~~wr)KW\9 |bĈK>t1lX/ٲ^.\a&l 3 7xC#R(B @ @ @ @ @ @ @ @@قl @@A  G5kV|͹`c̙;G׮]f͚}R5\JlV[emJ{5iҤhԨQ\xQJob\n6z}vZ_Ϗ?x.}h$r{+bj'?J-Zc9&kL!^{mܹs]v\y啋M08Cرcwq_utMFJSNܹss!;o1G u]cԨQ 6N8!3={vV״i޽{_Ɣ-[6,'4>.o_͕_#XZ@ @ @ @ @ @ @ @ @ U73\_rrrAPK/42w`$8eʔoZjYiӢ}ѻw4hP~͛[l N81Zji =zСCp?08xGwɂ{vhHe^>GU7.{O{ZԨQ#_,Zn"N9%"e ]s9';\?cп8b1z8bŊ͛BOg}6~c=bر{CK.$4椓NB!|lto6Rc꓂5{7v%9plLsI[t_~R䂔ҡC8\jh׮]`aoɳͷEE;D.T4rwhg @ @ @ @ @ @ @ @ @`uAq @͋\_/\$APdz:+;\@d.!2WR@!CbĈYE?>r->w}wYaj>|x&Dzu9 3qWgu~G/ L!+*]v]jd iK˲)&O/P9}Y #D|駙Sǎsq^{m.x#PJ*E LKǓ4ҥKG LJٽ{li KV7B:S<&L^z) LoGFbԨQ׿5kz뭳yRg2O^z=QJH}QH,:>*SO͛f);#wm2;k @ @ @ @ @ @ @ @ @VZ@JSH֞[oE|m!,\3AN81O[HVᅬ78,X-"?2ul֬YlF1f̘,$20֪U+~ϳ{d)1?(?s?6lg̘߶%˸q뮋G͚5F9eʔ 3gN1wy|x뭑 xb֬Y^{-6EYp Ԙw:>4h L9/2 i8p`SIV&Fu+T6md)1SN9%,ܱSNY]3wܸ{py衇f!Yܟ鐋Yn,|r̿D߾}+EY;DO w!b]# @ @ @ @ @ @ @ @  WI  ^=bBSd*nM!L<9 )RZ-[6sxcذaoiӦ C{=ztT\9J(+V\F˲Sd 8㠃B ?l~!X^E|\C|I'3.ZW9b)07Gqy-ª˔)X:u>AeL towuW:Jwڵ`ޚ@r-ѱcX[܋]xa#D|rċ/E[= @ @ @ @ @`S!@IDAT @ @ @ @*x:Ҫ֟(C#5yre!O} /SVs^㧟~ZϢ6pØ6mZ(h}z;vl̜93ڴiW (+)CqƩWh0aB~V/f͈+ZjY_~yy5jȯ_ ιdJ \̘1#&Md/>KL}k6׿F믿>RnqV$Ͻ+F۷SNYoyV20o="Q{zk'@ @ @ @ @ @ @ @ @V$ rEB  @Zf{)2 @ @ @ @ @ @ @ @ @" rU%@kAO".r?/B˗/"92sѣG:ğs Lc֬YY_|}Q\|ű馛ri~ҹsx#wWdu)DB+U>htAѻw83}ѳgϨPB1|Қqwfw\1;sT\9vimݖL1Fgy&[{6JU+,lSe~}Y 0 \ ZjA͚5Lᖩ佧/2e.'S_~yجY[nnr믿,KΌ)X3}_~4m4h׮ݒCbڴiYݢA'fZޛ4i+QH.tt%:B @ @ @ @ @ @ @ @,SL.eb/pѫ8Pw @ _ <Ƹ馈eVŗ^z),wߍ!CoOu]YxcfWo?Y{/^|A|7|rxfg}dz}wq%VKŊ\ )S:ƌyٙԩ ?~ 80;6l[nes9qS2}Y] L)򫯾"i>Ѳe˸kL2Y`SO=}c 7̌evmݧOlLjK!mYi&k2 L)my뭷ƃ>C]`;/[/o#Ϩ^=ry-  @ @ @ @ @ @ @ @ @U( WVem5; @)?D.0bȟ'Ha5T,dF?wZi޼y?7nF.|={v|Qnݘ1cF - ~i_:{_0Ӿ&Mnk1#N:)+#xt%K ,]tdۊ>O>= aL!) rUKZjժΝ?cTR%nY)2Ow=a„Hαh)Kj{ȅPF¢+y&@ @ @ @ @ @ @ @ @VV@JG֒@){~^:+Rb?9#Ə_Zzk- |C]Q @ @ @ @ @ @ @ @ @ye @EC࣏"o+W.~xo(AV͛7_'NC5#N8܈_ٸvEÆ WGmq-[FljMc @ @ @ @ @ @ @ @( K;8E3#ƍ~w Ν %Ҵi,qyǯVZy1x[,.еkի╫k"vqmn* @ @ @ @ @ @ @ @XR re/k^6UX{EKGԯN+0mڴhܸq.8||x饍b};Dj~}E|YF @ @ @ @ @ @ @ @ @*P۱  @@䓈R"ݶHnoTʕcРA1et⦛ ,z81sfD^kkE @ @ @ @ @ @ @ @ @! xܣS @@1?>FɁ1֭iӞ̽1ƍ[G)Vq9]F @ @ @ @ @ @ @ @ X@d@ ]{Mf06OiӦq}bkk~y P{]}Nj* @ @ @ @ @ @ @ @ PA v<X2NkEy;wC3g坮{R% "z:u<] @ @ @ @ @ @ @ @ @- rm[,G૯"jZNM,Ч)Ȫ<Ԁ8묈2eADw] @ @ @ @ @ @ @ @ @@Y @( |MDժEiG^W8XAu*EtqMӧ*%@ @ @ @ @ @ @ @ @G@dK'!@b o^ RĎЭ[ȑ/P6VLsgG]L @ @ @ @ @ @ @ @ @A"  @>4">O1ujļy˛Iۊ5h$WԾ:mq7ܰ0ru0 @ @ @ @ @ @ @ @R r۶™/C@f//1iRD*+DzҿOڵH[o_ ܼֈ]w8eղb "֍NV_ @ @ @ @ @ @ @ @ PRJԃ;7XQwQ:֭@._iZ8"f͈[n><"jՊӟ"ƌY9Z@<昈nXv- @ @ @ @ @ @ @ @ @@ H :j ϟq+ 4mqCsF+1eʍk{i%@ @ @ @ @ @ @ @ @%Y@dI}g'@u*PFDfJ-{*Ehv-+曈U+_ٳI!,X rĚm(b}#na2 @ @ @ @ @ @ @ @( :;.;r "ڷ(Wn8J%DԬqe'/ }?@)Si=7#>t0 @ @ @ @ @ @ @ @gAvG,{sDwܲ۵Xc#ʗX2qё , \ nQvDޫ? @ @ @ @ @ @ @ @ @8 ,ηl P6 @ @ @ @ @ @ @ @ P*u> PT82e~;Glϟ=@ sL`Ԯ'GjGx @ @ @ @ @ @ @ @ @@qY\oֹ @`h>b[N'^m9DJ-dfwݵfM @ @ @ @ @ @ @ @ vCFl­Pc]/^l+#:w(ĿLY/l2vq}7۶Q @ @ @ @ @ @ @ @ PKD z @"Z-l5IU zkD ,S)gO#p 'F \0 @ @ @ @ @ @ @ @@g>&M^*.5z/x3gN/_>*T*VժUիg3뽗Ea?PG 1~Ĕ)*W_}SN3gf~)ʖ-.k6-"iRe1_:b}":@ @ @ @ @ @ @ @ @J@RPnvLԌ!@C`„ ;ѣ_yL<9f͚CV̽ͽɽ~_ߪTկbm>{F/}_L ܝT=}Q9cƌ__VE QF:|ؠAN;=w/񡝷qّ ;TiY  @ @ @ @ @ @ @ @ @@YrI  @`- 1"}x׳W Lf͚)406|:rn]* L?SJa)믿M^_}U3& cڴiQL_~ѤI8ȵx"T |'_yoI[~%jz8烨W^Ԯ];-"6lXbv'*T9sd3gΌ~!fy|}]/_> w}e˖{GRQAnpʔ}## rfs @ @ @ @ @ @ @ @ @S@yovMEL`SOſxx7հa8C#FEyds}ţ>ovl&~Efr//S|1dȐB'?HmڴGӦM n">ӡF.@3駋Fm @ @ @ @ @ @ @ @Ak P|^y,`1u,e˖ѢE,tTR3f̈^x! |'cرQ^رcS:XxwYHo~xټy` 6b#Ĉ#~qiEN 5 4ᡇ";.rժÍX @ @ @ @ @ @ @ @AEl/9sCd={;;sخ]]v=k<@)SđGw^Evϫ9`_#G? \lӦZ\zk7ʖ-CnݢJ*^2IO&N=u> @ @ @ @ @ @ @ @ @5(3y-[o;wv!|1bD\pE:2]Qƍo &=}Y^ѬY:th!Coh۶mv?^}bq9 7ܐ}Rܹs],z 7h"GL @ @ @ @ @ @ @ @J ȒyNM(пq{Yرcw}gZ7`СC 6, ,W\>>F7;g*1`Z_ڂ @ @ @ @ @ @ @ @ @H ,Ra3 Pf͚'xb~ѭ[,q. [+=.]:>jժ|ꚫ;ٳ]vqm}ʕ+tEn\.]`=|EnxوOL!@ @ @ @ @ @ @ @ @%V@dz'@ L<95k?x 4((WҺۺ*{83㎋ .Hu̙Ѳel>`͚E.du> @ @ @ @ @ @ @ @ @5F| @@qovfr5:GG;3 \ `g' `"?EŊ:uAM/gZEA @ @ @ @ @ @ @ @( ;X`ܹqGǬY_ZjxP qaEn^z?CѧOxqlbJ*SO=3gΌSN9e]ll:bܸ# lJ @ @ @ @ @ @ @ @ @J@zu]6K!pǰa5j) +ݻK/3~8㬳Ί6mڬ‚ժU?{챸;–Vk;J Z "@ @ @ @ @ @ @ @ @@RPhvLԌ!@+ꫯFӦM{;b`9jԨ9rdTPaCo|˗_kŅ=,O?ʕ+-pOE|m3Ϭ @ @ @ @ @ @ @ @ @ .v'r  s΍.]ā(r%n喘8qb\s5+9bͻѷol͒4?-.>AE 1k> @ @ @ @ @ @ @ @ @ $ܲ3 @R|ApCej׮=z믿>NrְWZQFqQGLcn^xa1czy\j FY`A<3ѽ{vm#}.2lذKUVqUWرc cs @ @ @ @ @ @ @ @ @z. r=@'@իWi& [YJO?=J.wyg>M80N;B_k}ZओN3gƣ>>m;5k֌=z;1祗^ʂckc7Bn喘7o^}qG5\ ˥JnbΞǏ~{ح*-yDzפIQFqF*UiӦQ\,n[9>QGUm㦛nL+U:u-Zd|qF ٳgl2<iVgu:f}"]e}!,ٳggCsfڵիgg͚7|sf?s쾺v_iر6(UԢ]by߉:.SO=.ye]3& @ @ @ @ @ @ @ @(I Km;+ =: ̯XÇاOHu#G+ʖ-|wȹ..,;/c,ߖ:ȼ+d)_~Yk^dӬY{~O)W_;)3N;+N֕My'cʔ)Ks>֪Ukj @ @ @ @ @ @ @ @ PA/ @ ӧj,8pԩZիW/<Ĺ;C~0n&pvŭޚ@r-ѱc=ztT\9z뭕n K5-q6E=[t)22e}im|I/-oPӦMǼ5ڗ6oޘ}bM7]|{G.1bذ/r?fnlٲ^&MRʢY۞{?|$QFe~;J,;|H}YER^E= @ @ @ @ @ @ @ @ @@ Y¿O*PN )lnvżym۶1nܸ:thlfqw<{W1" |SNQfp cڴiY ocǎu.V&Rh߁&S,wlZ~2%a)qp2cƌ_-eUտѹs>y5jȯ+97ke0&k ˕+Oǜ9s"}̙3#@/2 LAyeQٳggկJpy]{_wbq9,6fiZl;cY䢿 &dCׯ @ @ @ @ @ @ @ @ @ .vl(;s./BDVb1x,<1@?Ƃ 'ܥgO K%JwիWx Lm=X4l0s%,6﫯]tQVlɱ0K ^%fxwy'vg+{f= ؈z+{/V_\\S L%`rNJ ?СCPм+V}/}ټ)[;&|}M2%t͟~ߋ/86t8ԗ_~9'Ľz̘1#eaN4m4ocyN;sLvmYxdԨQg~mQO @ @ @ @ @ @ @ @ @@( W mۅ3_P3@ ]vҖB n:|y督B Y \ |ᇣF18C駟-"8ó#<2N>RJ\Ra qpkQGH뮻yqlC9$ U]`s.m4˖-c̘1פ̙3'tYHVrJxse)L0\&G"km]\tEYgԩS9hP{/t'׿:oj(ذaø;xu9A.1;v~'Ɗ+fK/4䚂"kժ};F=t9R8cޝf}Sdz^w"*%B^c,pM6Ỵ/ @ @ @ @ @ @ @ @A!pqe}#FXFU $d6mZT\9zϩ~sF {L)y 6ƤT7o޼0aB׿˛4OԞB `zE ?_P.utdyUW]>Z9},<3KVTiU/~~l喑? ;ѨQ2dH4k֬+g͊\ %ѦM0/kx nLyCn|o%Pե*kKɓ'Gѭ ) tҤIQN_ @ @ @ @ @ @ @ @$A Pb[ 80Bf Sx"2Acذa1z_P{}ɂ-7xXbSNoD ,V^1q1j{#9 @ @ @ @ @ @ @ @X@eh @\`]w?>vӧO_~&LX㹊>l7zVB ùgώk}qǟ絺na.vgƆ֋3<017 @ @ @ @ @ @ @ @( 5+뮻.~8V{ ͋N8!zlO>9՞N6mD֭67lo[|'kmݢ[nBL۶m[Z{m2Q?Ͻ*f͚A @ @ @ @ @ @ @ @ PJ-ȕ:V^Q5y @@ {0pÈv>0W17 @ @ @ @ @ @ @ @(e6[RJŭe˖m7vں:^}q 'ĠA-[Eyq-D.]B q=}&M⮻]-Q.'s& @ @ @ @ @ @ @ wWս?Phzl +lHk (&Xn&Dij$7ן^E"zՈ(%vc@ o( :gf֙s>φ> @'hEޟeC=T>M7n\o7ȭޚvکb?̞=;?я2iҤwyi֬YW1"rHvq\wuiٲe}_Qcmer9Ub @ @ @ @ @ @ @ @ @RhIKʠ T~_䦛n_m6#Gl*KOuuu.l6Yq#TTdF|ɹZ{S־j~_r?>elL֧tL @ @ @ @ @ @ @ @ FA+P >ci߾}zSO=5^NRa=3eI'{:TXӧOs=;vlwn× W^{쑳:+sN.체hѢhJx~zE @ @ @ @ @ @ @ @ Ȇs&@.g. <8]t̙3gϽ,'(=lfy׿uZj,BsmvyG" C IӧOlfeEͭ[ȚvQo,ri @ @ @ @ @ @ @ @@M{Zv* @&(ЩSO/\^}֭[fyW+N:F)RWy72t{?-_~dMOԥK]r_r79 @ @ @ @ @ @ @ @,#pO#]sM}h PEwޙ+2Æ ˻ロ7<{Wynv) 1&ձo-ܒɓ'!wR]vDIf%wIީ L:tD0fQ^{m.i׮]xe]Ҷmۥc=o17pCx≬9cҿ~@&?o~3y_m E+ @ @ @ @ @ @ @ @, %ӝ|@:x]weĈsϥE޽{@ȭ:naua|饗2nܸ쓽޻ \'9ԄZ&@19Qu^9rdZl=zdv*gM7-27oSn{1z{ケoE巾r/;ϗ*B?~dRڙu @ @ @ @ @ @ @ @ @F) QnE @@%a>`y?xf̘Qj:tHYCn:Z*Eٳ˳,:ujLRjƏ]qao}ynYywKSNI JLVYeIGZyOMeq;6Efa_u:Ykkث6mڔ{R|PϜ9&,c{QEoY.|5H^;E hUUUT@eI۶GT@AJ @ @ @ @ @ @ @ @ @KA@R@5$X@uM/qƕg9y`Ƿ~ ,ȹsfV ,۵kWY vڵ ., W]uEMYK=RUE3<1cƔ{+ԅ;;)R-[,؏W\ ,B#sϦnZ^9\`>}% @ @ @ @ @ @ @ @ @!lF z+N;.9dcAn{&4FL#@ @ @ @ @ @ @ @ @&,Ь  @XmdȐdݓZu!_?? | @ @ @ @ @ @ @ @ @A6R&X}$O= rݒONfXU t钼Bc[ @ @ @ @ @ @ @ @ @A~hÓ˓-Hs>~2eJK @ @ @ @ @ @ @ @ @ l@T P)%O=tcriɬYR:@. ᅆ  @ @ @ @ @ @ @ @ @O6 @!Z?\|s#?,z%UUY @ @ @ @ @ @ @ @ A6MS2$~7yd=OO̩ ҐڴI\3yᅆTZ  @ @ @ @ @ @ @ @ @ \|+=  @O)H??#yO鬙^zs:yM @ @ @ @ @ @ @ @ q&@&PUpBIv'̙SiY'yJR} @ @ @ @ @ @ @ @ @ bn"@>E`oO??JFΚ ,B`A.E @ @ @ @ @ @ @ @4Ad#-T@UUrɓO&:$oٕTZ*U@d @ @ @ @ @ @ @ @ @>Aև1 @E n&Âs#U#:"W @ @ @ @ @ @ @ @ @F# l @JN8!3&Ysͤgg?KfϮzUY';7y_  @ @ @ @ @ @ @ @ @@} oQ @9 [n<"jlkW8 @ @ @ @ @ @ @ @ @@(բ @@e TU%ɑG&o]5n z2u @ @ @ @ @ @ @ @ @`y \^%@>!P  v[ɰa覡 kFX% @ @ @ @ @ @ @ @ @@܂  @@ >$x`꫕_ O:3 @ @ @ @ @ @ @ @A @XeKoO|2xdРzn@vo4Y @ @ @ @ @ @ @ @4iAMz-Tn-<]wM{VX}uA_N @ @ @ @ @ @ @ @ P +ugE isNCɴiIg'suqڵK>`~7Y @ @ @ @ @ @ @ @4qAM @$УG2rd_$$lݐVX}=N]/#@ @ @ @ @ @ @ @ @ C@d'U @'ТE%?ri%3f jL`5Ӧ5UY  @ @ @ @ @ @ @ @HAW@4H 6H+ӟ?9d+o)SNӻw{UM7ݔu]7zkEUS|  @ @ @ @ @ @ @ @ @" u @&(PU{l3ɶ&{L1"zy &L'V!vD= @ @ @ @ @ @ @ @ P_ K8 @rXcdԄ-&;c^ ><#Gֽ/nnuQs=sW,x(+93mڴܹs-x`^{핢:lӧOFsѷ,*O^~uYrH9O˚S3H޽ӷor=}_ SX @ @ @ @ @ @ @ @ P) +e'AԫV[%='瞛t~ /;=zK.Isa`,VZ)'pBy6#HNO)֭[U>#;;S\veСCMdMdͱze]v)jgdM2f̘\tEo~_*_?ceW\Q;![ƍ/KBYt.$_xᅌ92XP{XUUU9SᄏnI,B&۶m?eĉ1ZhQ6ack:b qgAi, @ @ @ @ @ @ @ @A @@Nɍ7.8" Çg֬Y~h*ڋ0Əni5[/I&+2ˁ޺<`.]dڴieZp8Ebk &{)G 9{̝; nn 6N8o / s @ @ @ @ @ @ @ @HA-"@~%O?sLrIIϞɣ.L?|ٱ6ȱ>[T^-Z(q@QF|gR{i}jn޼G*4hPy=k3oVM曗aeE)jۮ|y=,iԨQ;P^k gϞP{b-.~zO~RY7Ecya?i\s[ʀ}>O8yꩧ}_K.$ӥKJk裏֍S?#K/յ׍ 4 @ @ @ @ @ @ @ @T J  @T*wc=LMb ?^7͚w^__oꫯeZkU^?Ə_/3?ӧM6 3Y}?Esͼy+QWYEvepOZ@wSO}q|M @ @ @ @ @ @ @ @*I@d%Z @:5O.Kv- 7D!g\|qj1r- @ @ @ @ @ @ @ @@&N$@,@vEܬ |w68`~A}rUVImǣud֬zP @ @ @ @ @ @ @ @ @U@ J @T@K}17põ3TWWdɍ(Aj;- @ @ @ @ @ @ @ @O  @8}ws$@ @ @ @ @ @ @ @ @)Ь"R @7oSO=.S>ca&MevayVm(Y/hfZ @ @ @ @ @ @ @ @ pC|W\1+<]w+Yg5ᐷeΜ^( [z @ @ @ @ @ @ @ @ @ !  @Xc5rgԨ'ҥ:4h^ZjAE zu @ @ @ @ @ @ @ @ @E \V @b q};Ӫ՛9-ZnX͛ to @ @ @ @ @ @ @ @ @ l;n @=t0ʚc 喧gUgC*Y/Rj%@ @ @ @ @ @ @ @ @/  @,@UUU:oMe|k]~̻~Xc - @ @ @ @ @ @ @ @ @@xJ @ hݺU 95/<>={?j?>Rd(,5R" @ @ @ @ @ @ @ @,@Uuͱؽ?c> :\st Є~{z^xaHVZg>xMH:eJrI +$-[&-Z$w_~^KN8ԃ @ @ @ @ @ @ @ @T J5 @R`ȐG߾3kuP.7c5ʵ~EuꔼrҼyRU,)kg''-h @ @ @ @ @ @ @ @44f ` @@߾=[wd7ɞ{ngPTu~xҲe2o^2wn 9s,B 㨣ʋ? @ @ @ @ @ @ @ @ @A lۦh @! u73}<԰lqs=1!~ ?kN^>w @ @ @ @ @ @ @ @ @AVh+<_~L^{2dȖ`Ky?gY[o֧wj"{C @ @ @ @ @ @ @ @ ȆKj$@@+~^J/9d͓.3ַoҲ墻̝qĢi%@ @ @ @ @ @ @ @ @ E@dC)u @Z}OJz*-wd睓eϘW۟ݯ=>Ym_z%; @ @ @ @ @ @ @ @ АA6R+ 6 6,y:39dܸE/On%cݧ!n]ҡâ+>Ek%@ @ @ @ @ @ @ @ @ I@dC- @MF`{I!nw\L {,odΜ7Ļoߤe˅/@L @ @ @ @ @ @ @ @h h{'O< |sҵkӟ&3sN2kւϝ}wraɼy >p -Z$҇m @ @ @ @ @ @ @ @ @@C9>}t55q @jfN. J3L,5>dگ޵uھ}~n} @ @ @ @ @ @ @ @4T  @@Ch*9 6HdEe%w *9찤eF zu @ @ @ @ @ @ @ @ @> @*Nwѣy]Zuuryɯ >HZ?)! @ @ @ @ @ @ @ @ @1l h  @@/$~ޢ8#ӟ>WeqdՒ#UE @ @ @ @ @ @ @ @@/o @ر'Ջ7JrI{yw2mڴ9sff̘km۬Y2o޼;wn}m[u~M䪫u_*͛7;[h}6mҶm|ڵx+8R[^eO @ @ @ @ @ @ @ @M@dQ ~C -<&.(#KV^9{]"q9uԼ)oaEcquEp+'Ə9~4x߬Yƽ5j"?~9n\2fL ̙ &k<)Κ?jsُdU/I&W_}5Zx㍲_m-k&kp"$񣡉_iR=m۶_(2&A咎3gΜu!ӧO_(̲6Eem[oGj١C2ruIqvرv)뭷^Mp"t'@ @ @ @ @ @ @ @ @@7ݒ  @'{ՄC>#_9geVyv5kw9ge=j kfbX\}ecSZͫI,1'O\EXfq_giaSL lժU:w_?]v;m-4N @ @ @ @ @ @ @ @4yAM @! 3fL|ȨQr硇*ϗ^z4رcrl馛|l֬Y2jL1cF~<)>}<>}zZh6,m]y~_O׮] @ @ @ @ @ @ @ @MZ@d~'@9soϽ[?Μ93zfm)Ϣgȑysљ={vXc;sod6j VH @ @ @ @ @ @ @ @F* ne @'0v،1"7|sX?ze]ʐ^z[nW@9jԨ_*s=>}z\s{ウ{fV[n5 @ @ @ @ @ @ @ @L@yMXl 7ܐo1&Lꫯ_cܹb#yeѹ;r-Eo8 x`t @ @ @;@IDAT @ @ @ @ @*X@do @'P]]x W]uUڼ|ͳ~e}M=ҬY0W{WBtM)Sd-H߾}saSNY @ @ @ @ @ @ @ @ ДA6ݷv @^y\z<[ouvm̞= 0aB~_ \^,f͚F⊼9묳r7fO~2vG' @ @ @ @ @ @ @ @AojD @ vmjr衇f-3K.$;v&P7C/E]-"G܂UF @ @ @ @ @ @ @ @F$ m @+0cƌr!9Ssg{fmVrׯ_Ǝ7<;C15 @ @ @ @ @ @ @ @ ȦVI,o]w5d7n\>//B~dܹa>}k={v^{=+;vL~衇~zr}훝v)SN矟{,_WrGc}@Kb֬Y"{~Zn~;^{m|xf͚U\6k믿={矟<ݻロn!Æ [o]'pBt钕VZTWWgСYs5ːwqr=\Yhw[^<EklѢEnr۷os9';S@MO믿~][qS12.b1>]FyI'E32bĈsGkرeߥaE|Nbu9&@ @ @ @ @ @ @ @ @%X8hI֟ ЈV]u㎹䪊p? $sM7vZڵkWw}umk]>wa>:kuڶm[ޏ9C2eJ_=(B'M'.G7oΝ[Q( B H .ᆊHj"&٢hZjK*feOPܷ\QC wERB7WPߙA@lr/=׹g3{;rW^Y|ŧ7n\CM=6;3A~y ӿYfe8Ջ/XYc5a9&f3࣏>ʭޚvm6"@ @ @ @ @ @ @ @ @y9/j!@Y;.7pC3@&~sLvy,RSlAM=V 2[Lwׯ_Zn޽{/Ϸo>K.d'N:s(i @ @ @ @ @ @ @ @G@ @`v)={L=;Lsfv?ri~<^{+vZl}٧}_NJ6,EP.;5򪫮7ߜ_Wy'3nܸ2sM7--|r]ÇO߾}#d̘193ziӦM2yK.СC^vGqiժU`ʙm{o>TY}ꩧ!i9걛n)~׿޴ @ @ @ @ @ @ @ @ @@ 4T]%+6* @F0뮻.E_ؼyOSN>|yWG}9蠃R%?#(En8VX Eo;ؔnݺUaE`׾9 J'N_|1~i9@O>$K-Ժ3~.N!ŵE`;SgN+ 6L-jܸqiӦMy䑬jӝ2dH8ya}Y)̸-H"'?I:2(tfc#@ @ @ @ @ @ @ @ @h<%T @,z_s}W^tMsg3 ]db}n|g%l0]"lqw>;=z٩XF2iC f\+Bl-[SN9%7x3)߃btҤIe_Ν;OZ3oʸYN9 ?A7pCC=tAN6 @ @ @ @ @ @ @ @꽀 z@J`%5\?9sUW /z7K,9chѩS9YvutaS4klg?Y\s >< <o>xW-ZdhvK'@ @ @ @ @ @ @ @ @"/`reUv^Uiꪨ @vk9swW^9餓Ҷmќ.j\[nɾ Cݘ_"Æ K(Y?3ҲeWU},_|Ä @ @ @ @ @ @ @ @ ]f @`s1:th<}Yc5湞 _~Fq3]_|52LFn :O=TZk?I&}Rq&M2XZӦMS?NZKsw=+r^x\qB  1' @ @ @ @ @ @ @ @^@d @@ R 2${o@nݺeUV 'ÇՒV"tw6mOnW^y СCΧ @ @ @ @ @ @ @ @̽@ɕm~dU 8g  @oK/4\rIשS{ウ+/j˵Z(P?>P5\~;m]~d=LӦMkaZ"@ @ @ @ @ @ @ @ @@Y @ P.W;Yӭ[|;o .Oyo9zkF 6 =z~v'k%@ @ @ @ @ @ @ @ @@Y'n&  @(0iҤ<rM7W^r-.]dvoVZ..M I`ĉy's;C=XΝg=HRw%@ @ @ @ @ @ @ @ @97J @A`ذaswرc*dV[m-2kf5̤Ģ"_fȐ!䓬 q;k׮iѢŢd @ @ @ @ @ @ @ @ @"/ rHF"GPG} \nfeM7-_:uJq̶ L<9Ç?{|=)+[.BvYk}+$@ @ @ @ @ @ @ @ @"* rE-gȐ!XbP @ @ @ @ @ @ @ @ @\ 4 @Ԩ@V.m]gBVMꪟgV_ , dWLYV]uլS_EbzƍQFW_Ç?h/Gڹ~euz뭗5X#'y U @ @ @ @ @ @ @ @ P7LljU  @k%'%=RңGҳg*!kY%)^/\E +z+&M*/jҤIoaE`dZaҺu/"^z8qb{l=+ ~efXos]rVYeS8"Sc=Y* @ @ @ @ @ @ @ @f# r68N @jRkI2y衤Ed}2i`޺7n\FW_}5E6,B),-X_~ree2,3kc͛7K,f͚ 6g̘1;vl'䣏>>Ȼ[Sר_ ,2hm۶o׮]Xi6כT kV @ @ @ @ @ @ @ @@Ѧ.  @@%07\xEcnUǺv<+/B W[m5ZEpѣowޙX#_I3bĈ?L8qV%S[CNٴi4n85*_O9V!E_&L،SgW&MZNf:'r% s|[9PBgy @ @ @ @ @ @ @ @ @" hKJa*/HtI.$}d%aXbJ+Xɓ'>9j9%qǾ,v0i+jO ^D>9x ($5kVf ,O \2˔"rNydһwBr ̩O  @ @ @ @ @ @ @ @ @ 4Lw4`@uUT 8Yv٪{שӂ\ @ @ @ @ @ @ @ @ PևEZ# @`a br I[$&?Y2bD2xprB ʽ-U>gVgL4\I @ @ @ @ @ @ @ @A @Y7J6(Y{K=Lz*:4UVII"PsuoiuWriɉ'&;F @ @ @ @ @ @ @ @E@伨 0G%{o&%]}%#G&gl 8OݺlddI'otp<" @ @ @ @ @ @ @ @   @yk=LZN8"דKFNd풆531"y\6(y≪{^CMƌY*O @ @ @ @ @ @ @ @XEvZ  &NL'VK>4_&}dt'V|1h޼*,@78yꩅӋY  @ @ @ @ @ @ @ @ @ {L @B2$/WLtI^x!9דN:(YjX=a_v g3IIg''O9 @ @ @ @ @ @ @ @\@]%@嗫\3dےCM^z)y? DUݺU݃߮809㒮]ޚv} @ @ @ @ @ @ @ @ 0 =|"@@,xyɦ&k/.TEsZ.]M[o]4|W[nY} @ @ @ @ @ @ @ @j y_tEԠ'$]Sɉ'&묓}wlI 6d9 4kcrsZcSO%vҭ[rر56 @ @ @ @ @ @ @ @ @#7J @@ xcҽ{ҪUrIUW%G'^Z4بQΫZ [r=ɘ1Ws~+-dwtd-}/i(7=*lo睓ƍN[{'7ܐLX7޳gɒK&:%^X7% @ @ @ @ @ @ @ @T qTX''>X>:2Η5*9䭷[nIzHXb7|( y'yZ,Ze~9&Onݒޛp' @ @ @ @ @ @ @ @ @`h0Uzw4`@uUT?\yeҿkioYs]SV#бc6="/LMt{k1 @ @ @ @ @ @ @ @̽@ùj$ @fFL8#Yd~2n{Y/mРAeV[m^z_ӨY{\w]5]6)-/(d-_^,:,Ff-7]wu3> @ @ @ @ @ @ @ @ @=B' @ |Qr;$m&la2p`2rdrYFV.('tL/4iR\veyWӠA^ziv<yGҷoleugWR \,ThԨQ~C){lyqg8J%YkĉOxdՓ~fm'?q*@ҽ{ "TqJk [^/ /_|~|< @ @ @ @ @ @ @ @ @`~̏k  @@=de߯ ,B>8=H40Æ .쒭:_~y4h0"Eۂ{sGfm){h۶mN8r矟c_,\O:)b}wC2&-ؕW}ݗɓ'OhAN->;,LZjR @ @ @ @ @ @ @ @,X  @ ɕW&W]VҩS$헬œW8nܸ{y2a„|[J=Ҳe^z);wN,7w'#H6m+~{^yly'0wy睗~:_ҫWr C׮]}QmQyy TZ9u7Yv!yO;.9餤W_| . }Tܸ -*oՕL;%wkG=v-s^l @ @ @ @ @ @ @ @YA%,eru޽ҀUQ @`a W׿VK?3YcO>ĺ78gyf~2mwwߝ"rb-;S,e[o5[ney+WYM%r%^)"t钣>_ sϟcE\یe]6?׿u>2׭Jph-klS|%TB[۷>lvY~˰⹛{G@U~4k,mYs=Ygu,.ecɕW^ x5jT:tP<kvYJ=Q-B$^s=sSXowޕ߭~eˀ78_AZl?u; @ @ @ @ @ @ @ @NAթ̵\}uUc%Z%W"l/K2Ro/b%`r{yөSr"L{\}@IDATO?MJ]0WرcӺu2mJ{-ZTylYaR-R嵳sG40}СCӦMٕp}vrꩩ &/^ *S'\x'-MW_}5ڵ+/[&'ȤI-BW ȇz([lEyx&|G=ofOcLx[Pl+bN<Ĝr)ʐxO?7x#-[/g饗./U~AvakSYfe=̜+ C @ @ @ @ @ @ @ @jh\#@@%c17P8p`*aCҨѼ/hV:.QV፻{YM ,li޼yVA<8q~)%ҬYze(\q"+' 6b-1cƔgq9rd< 0@8&G~{njnkJi;.9;?9ęOT|xsE[9W/"hOTPluB`mIV[E9T`w_*I%wu;S!An3>SMy֦|{qmuC_7AN[O>"[nE]G}4rJO>9묳Ҥ|٩S^; "򨣎]wݕ}٧ ,7 @ @ @ @ @ @ @ @ @VwA @%31$%mJZrqȑ'LY(i&__~š}ѹ+dV+ߋナi!CYf;giF$EۤIc۷-k*)O=q< {73jԨپ>ɕ"qα;^h9%(rA;R8|Er㍵'ޚ{nrUi9,="F-L,~E@9眓ѣGg=%EP䜶?}/(Ǿk6lX%2{^Zl|jyL}Gɘ1crga?O˰m6'tRY{뭷.jc'zK. wUK-T9Ɵ-ТEҵk*!O~,ÇO+Aw;[(V3L%2LnK%85Yrɤ6K{6[hbzsa~b"Tr6a„|^/* M6M۱OWgʵߔ:  @ @ @ @ @ @ @ @ 07 F P*g)B*/]w-Zl{'k9ӧv5z!P<@X\-r䠃39R yK "@ @ @ @ @ @ @ @ @2.'@5!0yrC'+|k%gVrUA-{쑽;~MPp@3bZJߐSNI߾*,ނX8 @ @ @ @ @ @ @ @jPV]u^Uiꪨ/Wzdu==W6/bzyn<0W&&NLV\19kr9?#8"luU<ųn#@ @ @ @ @ @ @ @ @@u 4bj @/0jTҿU3$mV?;sMMW,r5> MQ}NJ4:U뮻n\}ݻw^li 8o|{IӦʊ}:t]I @ @ @ @ @ @ @ @Y4\fq+޽. @Zk 4(Yvds"q/W /${oʠj)sꩧsɚk}sݶ /iX% @ @ @ @ @ @ @ @ @ 4ehc"&p)%pAɠA+Wzqqvr5{A;}OȆSO $@ @ @ @ @ @ @ @ @@X%@$%$;m|r%F%glq}VW[JZL.X:a33NA^[+nzm6yrmV? @ @ @ @ @ @ @ @ k=!B/L>{U?N^:d⋓JvZ/m-{Z'1oB ܑG_Je„9/歷澎 @ @ @ @ @ @ @ @ Pɧ@̝Iɽ&\>ɇ&^Xxuɞ{&M]=X8J2h™.ڪ|۷<ƇyYuգr՟e @ @ @ @ @ @ @ @5* FMFuQ'JڶMv!yQ?Yz麸2=뮛lqresձ7sϽ '_[7cLj @ @ @ @ @ @ @ @ @`H^#@ySNI:t aÒ!C#Lڴ#@`a \{mg ;Æ 7|)]{^[n<蘺( @ @ @ @ @ @ @ @ @A) @nNҧOҹsjɟt4ᆤ_{%H#dF 8 ׿_x=,j3OvZUpn.ɥ&ZMO>I]7ss? @ @ @ @ @ @ @ @@Hk$@ |s~Ue?aҤIU'] >EQC!CZWpTpB2hP2lXұcrrao$W;Y @ @ @ @ @ @ @ @ \ @@E``(i:}䭷sϭz馤{Y3\N:tH.ֹO';K%_~Yۯ_2iRҰ"={&|Ps} @ @ @ @ @ @ @ @AV]Z6`@ջ @`a w> @ @ @ @ @ @ @ @ @`Q(]k#@@=xN*YesN|01"9du 0W-Z${\t\ 7h")~Ǚm8F @ @ @ @ @ @ @ @EO@wOF`̘NڴI>:Yi[J.0rˤAzCb̃!$?<<\9 L4%=z~̬v @ @ @ @ @ @ @ @uK@dݺ_%@@0!?HZL<0<9d+]wM7TKmI:tH׹d}[?Xui  @ @ @ @ @ @ @ @ PgA[q/$iӦ*W?!yے=뗉 P}?aү_WS[cIH1'8g  @ @ @ @ @ @ @ @ PA;r COV]5r<1"y?N[n뻒SzJ2)GW@{#$nUՆ ih3oUx:J @ @ @ @ @ @ @ @/`reet^Uiꪨg}#GfԨQ믿?~a>c?;^EaIW)"BE@IRDHQADA*"T&D&$@wM HBvu̚7as]waaaJ*RN}Ǟ)S&e˖M=P1gΜW|죟}3]+(yyů2K}'}oR޼ҳJ&LG@ߙ#s?Oi駟 eˤ7d_ҭ[ݥ ٟ_;Әkpp]fW^hΛs7VJYs~VP9gt)}!C;9gwφ                '@=sfI$`wڥݻwۻ~;1jhs(3@P)yJÊyЫ +R]J'nܐ.O/UԬYdcƲB2l7@ %J֕><%F1L#GuʬUf?uQ{?c֭fVHVpoϟAf}Gl]!$@ȿ뎣 <}L9F&:j3˛7e *… G&H @@@@@@@@@@@@@@@@\G HyVT)(`nݪe˖iҥv9/_>;Pф*V\Yʕ r-""ܾ}] 4s2YdѓO>z ,$S8yR v,-sfd|y{K+WF?Ν+]*Ci++S[8D`i@Y?l 0a{]vi߾}wj1cFEFdɓG?kWBK`nڵkv8Ifgs 4o߾m֬&djҥK˄>pj͆                %@s=A *8sL-\P.]R޼yՠA{Sr |p;kŊZ|֬Yc1^UbԦMkN>hڰAjB L.L@-BdhF?>+?rp@Tҿ*\c .h۶m2Q 0;ȱH"*YPhB ^pa;5fUgy;pӄn}:u]| TLUP!z7|ԩ{rT                !V^ZsεB UJmVM4Q%߁ 07nԂ 4{l?~j߾t kv&I*EDHV?6__O52cCVפ%KdI^^N[fvJߴJ }СCv <"\|yhM#a)ŋva?7vܩk׮ńAVRU'x"@@@@@@@@@@@@@@@@-@d\Y>N:U'NԞ={TR%uAmڴQ|\yj=Jq4^3gw}gϪqѣ}GViHK3'@ػW*UJZPjԩJKbnݺ[jʕ2ɛ7oիW%KUZU?x;w/n%5w\{7&JkY֭z͉N@@@@@@@@@@@@@@@@!@d_:yRʔ)x%}7ꫯm6+Vk۶ʕ+3 ?Yfiܹv ڵkW5n #:e<@@@@@@@@@@@@@@@@\ H'@ u}]9RM1cƨ` ;Xhz+Whj֬Y(??ip\zwڥcjڴiJ::t^xAUTq QSܸqC ,Д)StRϟ_={f5R                ,Q P իWOǏח_~ Pxoڴ~w5o\zwϻi8ɳQ7NpzcVyfhBe˖֭[0ȓ'O#!1iӪ]v駟ta;`t~̙3{@@@@@@@@@@@@@@@@ =Q3Q_`޽ZΞ=k^u'f̘ܜo^7otpU $@^Ҿ}ҲeIgrk.;Zj+믿k׮J>}rM*?~ 2Dǎٳgpzw*L@@@@@@@@@@@@@@@@ۇ "wVڵ7o^mڴI%KtݣL?{˖- t,@(SF[W;ֹ9L^޽裏ڸq,Ybnφ@ KNO}LbŊiڴi)0:C                 ZAZ'ԠA;qҥʖ-=Zq*jԨ+V(00P;vTDDDrI @%-^,:"%x[ti͟?_gʕ+UZ $u{ƍI=}                 Acdx@hhZlٳkʐ!b8+Vhg8AE<@@74n܃=zꩧԢE ܹ^r B ӧ}v]pAʕӪU!                VAd2x{ァhܹʜ98k֬QFONX!%! ^] ҥݛ\oݺviњ={R9N3fLD *UJׯ3z&k ={V?~my{Oي+4hР$Ltjڴ&L=q; VΟOw\=֭ӧ~)Slٲ+䮑z-K*ӧڴiN:@@@@@@@@@@@@@@@@p@ʦ9nn&pBu):GC Kq$)* ;yzj]x1 {+@1~~ҳJ|"ED8( @-[tL5ײ%scǎչs0<                 1(~zU^]ҥ{}9sgոqcZt:5kٳ7ov[z\ržvmjժL[oF!]gcĉv#S_Νy}^A}WiӦ$n@ X?ڵKZ$طo6lؠ>}ֈZ;im Ո#ԢE ծ]^M` yfk_t>|`g1{ѣhWy~s>{{ʗ_~W3!                n;3&n-~=c2GZK/Ɍ!C5kLwVգG 8{|o`B#>lҁTZ5]|Y_:uonw1]pl߾}obi)'Mu?Ԟ={ԳgOھ}6lxa|=[lzGl   -+K+/ Mo{LOh6fh֭iӦ١Ͻz'|'?W޽5qD|gx̙Zrxq(QB&| oq߱\~1&hҥKʚ5s@@@@@@@@@@@@@@@@v0=C2_-MV Crʥrc,XPuԑ9wu^L*J*bŊ١YUvm>d#M`|Ol}ϟ_Æ CLPXnT^=۷>gm~2їMSpppF@zKZJڶ-e+;}cQ);rkC Q``ƌٳdɒvrB:7|S;vT.]dÇVZ5kLbf-6y1!pׄk_>sL\͸                [ 嬘 h4ɱUZU'NT 4zh5o\˗c(//ҥC2d`:M6MЍ7ۘ.lTR5!fw\˽|J' SVz .Eߜy^l ԯ/k]F.f)S5r12W['M$???)R$6K,џa޼yobn5ڵk5gu46lhQ1볫5i6w͆                x{ڄ/@|&dڷoo49rD-Z o;t2fؕ)FVZʘ1J(qGmޑ?>>>wrwQ:ޫ})s_={۷]|׸ 'N?!pz+wWgKG\&8(((ֿfUSNҥKvhr\f[EQԨQ~u=b;~g{7nT\;wS@@@@@@@@@@@@@@@@ =Q3QKRJ2Bɱݾ}[_}f̘!???-[Lm۶caWaaaj׮,Y+WSNJ:%fk+$$D& -*83>~ߺux=Xb>@)`+N쳔+zʓ'⋔Gs-sLs۶m 9so_~ݘ ڜ ykjӦbu@@@@@@@@@@@@@@@@p' i2UEDDDCTQbkV;woB3g_k~v$ٳUhQ{On pԻPFҥ)'UTo1ctGkZJkcn+ӄ(^rEKkb*U]6!_\5?\GU>}j5@@@@@@@@@@4-@IDAT@@@@@@V H}L 0aG+V J-,,Lƍ5&ԩtʚ5c駟PO?T3g͘1C ,m6jܹڹsΝ;g;^ {ٽ{weʔI?z)M8Q={T4j(׸a$88XSLQ׮]} @Wx%GomUm͚ڵk)6p\kǽ2WZMKaZ[ǎkzPM~vP Ìږ,Y9r߶Ok jww믿 ,WS!                ^֖Tk.3GAb0am۶Ֆ-[TR&s=QO>z!>}ZWn;>ETR ŋ;wn 2_U@[nhѢׯ^|E*yweʔpMԦM:u'ꫯTn]{\s^0`&M?SYdI4G\CI_ҦMO<ʕ+G Lǵvk-sv t6m޼ kذa~.]R=0v 0k,,YR .kUV0ary1\ ڵKS:udM'                (@'>u挀 0KJ&Mƍv RL:rqG&ѣ2BBB9sXG_Cl,A_MC쀥B t%hXo۶MUTѣճgXZqp} `AiRn> Z`~8YZ*kc 66AFuvpyN)9 yZJ[VڵX<                .@?a懀 >|X+VT5i$|y96i”u3?LҥKt֚ x_-+WJAzJؽǎS˖-uM>]uIX.Qkc 'y&AXX>#?Q=4j(&                S ԏ@~&l믿VVT@ 0~8MDq֘.]8;kp;ۑ06 "} #NuK!Aaz'/kСʚ5k#9jm;v襗^Ss%p                xEX[RUۮ]dO3g&UO`ĉٳ>Cߌ˗լY3ݻWk֬o`̀@ t.\)'$޹d @nJ*Ub /B'OTlM? ? M/_L+@@@@@@@@@@@@@@@@<@ HxLO0a&53F2uرcv_Kt@8|X*VL2E1%G{7nhĈ#GV-:u)^o)2f{=ӧ5rH}*P>cM;                I!(+~дiTN8qr5/^X+V6mD=A F(THA:T OGڴi{鰕J٪U+*X>#?>zYdQ֬YwB cرcvj?.X@ǏΝ;                 ,@?|; lRxʖ-kB X+Whʔ)Vʗ/?CSN޽{եK$kC@@@@@@@@@@@@@@@@ $Ki.kLwc ׯ_W5n8=\rN^kgiӦ_~}ƏvQ kL*@d0?KlC$P͞=[F-/dC岂|Ծ}{;49r ܺuK˗/w}9sm۶+W.L@@@@@@@@@@@@@@@@ P1#K l޼'ս{w 8Pyu98Sk֬ 7mڤΝ;?V9DjA*cT4ԼJ1QvIWKkJϷΞҧW;tZ[:tHŋW֭ 帢)^e˖Y=$$Djs=gfʔ)(@@@@@@@@@@@@@@@@Y Hg~:ԆI")S>ЩSԥK_ H=˗~֭S 4tPUT@ h!I 57XKc;ф> ,Y5ڵ#%_anݪYfi޼y:prʥFaÆ_r̙zѵvޭKj+MQ jJm۶UZ6ۄ?7iDM6UrL @@@@@@@@@@@@@@@@GuD @Yf?UHu]<=xDD5uTM>]ƪ}zW;>>6wy۶m{is)]t[|I{Ohπ@@@@@@@@@@@@@@@@p} ]2xne!g̘K.J*j۶ڴi#un5Ꮫ7o1gϞǏdɒzեKe˖u&C [иvTf:}Gy9TT>Ya;!w]p 46lC_ӫB Xʗ/oKV4i=mQ<;v~_U{Dp=êZjԨa=RN5                D %ZG㒏OKVoߖ R޲e~m߾]n޼i"EBu /^^c2f̘\%y|AAAڿٵk6i֖={v;w>nU\Yx7@@@@@@@@@@@@@@@@pAg\pZdJZl.]j)LpRժU*ULRT`W``̾yf;(*M4Qz)5jH?:$! ['ժY?'a)jG+W[JaaңX lgZg; ҄B9rĚ5)kC" *… MsmfZlqㆎ?GڦÇePIKbNiv˗r@@@@@@@@@@@@@@@@#@c\HԩSZ|6md(ܹSʕ+ʖ-RJE%JPΜ92;eL ߊMׯ_WLTR%;̲,Vvm;0!2( !V֮]֯h G+V ;^=)G1M` .O8afRR޼y@H sGgϞ]nt8wN>}ɓ:{"""yM)hi@"E>zyyA@@@@@@@@@@@@@@@@]t'˼@ Y._իʕ+ѣlh-}v}4L9Tlٲ顇w9C vUԩ֭[ wلhXIa/^_}.]:KE"n@@@@@@@@@@@@@@@@@tG &iӦڹs6mڤ 1 g%|E3MՅ 'G웗u#ckgBLUΜ9'B'MM%K bCp#ҢEҪU%+OX`jFDDkhPPΞ={G rTḅ NxwdJ?M4&2k֬.eS&}GeenB.@@@@@@@@@@@@@@@@@tg @ :u9shڵPBzrJt5+,44T&Wʡ#+kV`Tj{O*}̜9sthƆ <#Iڽ[ʘQ__V?qci<) yJjۘ7nPXXLHdc񑯯}gs-iMHsn޽]$Psi:Z@@@@@@@@@@@@@@@@@@ >#jذaoL@YvDS@`%K "/JŋKMF?֬)+Zo>'8vLZU*SF2V$                x#6_`ʔ)2dd 5Dp r4 JEVa`5o.){e/=4{ԶmZݥɓw @@@@@@@@@@@@@@@@ 2n" ^ kk׮@ضM7/r߹Sz!qci4Q#)k)#k' $n-y{>Z@Ŋ̙R@T`d{͐                 @|m@#ۧ~ZZ҇~L40i͚->jՒ|mB KFzOeQMHI=zH H?u#                x@"cl~ (@_eJIIѣƍoH~~ 4l*$-\(^-*                 >AOʕ+jٲ)ku@'Oo"eK/(u (DUJڴҠA+HoY]Ma+K~+=T`j`                x͕"PNt9͙3GiM2 S K_|!ժ%.,'5n,m"8 !Q;KEJu h!}4`4ck0@@@@@@@@@@@@@@@@W}@ 6L ,?|Z 8D ,LZT:Uvd …RÆ HCJO?-#UZu2^?LPTH9                  .*d{OUvme#-4p/5m*>-+IyC Z˖RқoFሀ4rd߶ط@@@@@@@@@@@@@@@@p7 2ѣGs{^u@RFidfMxqi4KiZ[7)K%%F5JڸQ5+%Fc W/obŤƍg]jjD@@@@@@@@@@@@@@@@ _)!m۶ĉf^Lpu_^~YʓG3ddejHW1cG_?{ K'-\(Pͥk<π#                Ae^ o}iJ>} / LbJҩSK F%%aPi%#xtԡ\Q                 $N Ĺq7|cMɓUX1e#/oRRқoJeD@%-esL >P:>!w,.e~                xA#{+b֭[ 7oJӧKիK*D?&:%M*=D d'O/?NV8\ki8i(C                 x?#.!p o^KG}5S$ .ǏK&H_~)](l)\)խ.3Lyd "kRɒI/@۶ѣ[oIBc^@@@@@@@@@@@@@@@@O :sFzm'ە*U*` @ l -͙#%)u.ɓʈ;KcF-Z*USgJ #G#UR#3                $wRvF_ 3 ̚5K&Mҗ_~ :cԄ@h4mTT^# "~z;S駟ŋך(`U4=Q9#                A3d Q+쥗^RϞ=պu8Zr @Aå\K*ZTڴI :tRz=޺u6m7ސL&1||3&Mc^3                A%;*o޼O7!-pԷ/4tF^モV^.`'QboH^G-E ϵ`                AԨ%0l0mݺU~ҦM{h ?={]Bӥwߕ*X0K:UҀҐ!ҩS6 %d->{@@@@@@@@@@@@@@@@p1 ]Q.O 00P>#+W.~7psiҤIj֬FT3Y` (e˖9U]uբTi4atۦѣG#F7޸c7o}wjwY; <|WʙS2GGl'Nĉń+'vIKgrv},)͝+YKm8FY^=5m/B@@@@@@@@@@@@@@@p_ 23}Z;v?usϜ9+V,Ytm{K}g;v 4H#FPxxֿYFk׮M.>.\X={m۶Vi0}t`^znq}ڲe2f̨kȑ5;wN~M&$SN2l ;vH#-Z$U&7Aj0~ㆄ (bie U;m$wov9m`~So-S~iկ_?q\kKTׯ룏>҆ {l6//&7:>L YK7 nb\&r̻1߸5]OSk+_:wljԨ>}hNjU.~̻ٳۻ=A@@@@@@@ع(ʽ7EDv,HQ REQDT.TPP"IED {w~O$!eMIuMfwS>;@@@@@@@@@ RsT$#<" zh_~}Y 2ϟ[/Xp?Zjر Y۷2f-D/IB-u.F/;eH fJ3gtkv-#xdiZ=iO?UV?~K/i۶m.}J:O]jlrDI& ? 4͛J+˻C #6'dΜY5kּ~]%V^Hn'$e"=x#@<0k,_^v t3z1GUݺu/ذa={ k\ƶ8q˟ xو4I*TH޳S:x0nv}hsjٲeb{׈]nŋ{c!c7nt!։nI5۳gOs=85b{                 ģAK p(h!X#GT e -o//O#FH&icAW#G\Ydŋ/ZZnlF;%oZ7~xYfsҬY37} {H"kըz=o_}U8q"%i6{ PB^vFt=w@;?wnݺ)M4.юb~{k)^-[*Gw@ޅ+                $6Z@  ǏN6㣡z՞vU[bRN?9ƀ&AiӆM&@mذ-_EkXp|ziȐ!U v]xSŊea1 =z 9r %uA=3۷oLU@7xyzpA޽Lj"hF-ٲeTif ^ɕ+[X7~w_?-ʻmcAtN.t։(`Y^4Jz啰r=ߣ[G|_Q5+Mjڴi,1cf]#w!=@@@@@@@@@@@@@@@@/Ic "$h"o*_|JWkX)(P 8 #}ɜ99" AZluE߫Tjժin9u2,,"c+TfM^ZڵsԩΝg.[*N8={\  7HRnai%{w#/YD g_6m ;=}W_}uQ}>l9s;wŊ:}:,8je =vXj*E[o, ,^ ׃gAu Hl`=Nر֭[C*C Zjto]Jޅ                W @q*$Vu̚4i'ng… #ո|rotk0SLa]NRJO?B~'5ֵ4Yo 0@ ߮3gɦMzN>cʟ?>3}Gp,TRʚ5&M+Wc-j Z%r{U\YwW9##-/G׊EWa[d}ҥ^¶p 0;v, hQ۳hѢʝ;N<Νs~ر#ł( #e-OW@׃5w_6k$z7n^oÝ֯_85.؏                @\A%~Y^{1"dx9kР6oެ)S>c ͛WO~a 馛bu^Z~,i̘1*_ pI;wѢEʜ9TI2]t˵jJիWw,ov'XH_#Gjڸq }~׫WտtRD6K:kҤ "kq :%oV#4|9$sK.Fj5G_ r\ {eA6g ܜns%v-Kz-yuMe=,1k֬9aVZl-jCOws3+67WZ 9v6u`{o,`-=O?m=cװwSwRJxӧO?xH4izװy5j+2i?/ .mv1c5l~ޅ*T௚5                * \mj( @ 4mTrdط$ avZdAQ4YW%:u꨻cnSM\W_ֱe#G)SHS޼yyWsty//Yرc.§,Ē |`Uy!SOI>*/-s믿>6"R^|Q><,mBych>|X5eɒEM6M$VlrUGzu)C$K6S\`ٲeںuȲZ nMz+;9PtiUT)9                @*Wկmj81X5R Y^k?C 3w D_/Xv_S/IN`x_?ɰ0Ȟ=4igϟWڴꪫv8c VO>͛^vvڕq'۷Owy~+)y޻wo[{@@@@@@@@@@@@@@@@ L @;vP2e4h ?Ӓq&Ix$3t:(~dI]H"{px8~5j~۪ÇO?T͚bh "Μ9=zhܸqzו9#]3Fxh*@@@@@@@@@@@@@@@@@ Zne# S…裏` 'OJO?-U(yZD5dɢoVW_]@2ܪGA Z{c/_~y@sa)lD@@@@@@@@@@@@@@@@x 2P/K;0a* 1 )M` |yw_.VMi 7:9rh̙*Z46nlalC \2eƍ%uԺ@@@@@@@@@@@@@@@@Q xĥj@~T^=/UJM @صKjVjD׿޽Լ%_/ẘ7o^-\9a%\㴔$Zj]'??6h͚*Sf5lΡ                 @ !ԎA]PkڨH.Ho-]b4}4qTp?LxB iɒ>>/8a=}Ť%Pre-]Tٳg!k(U. Ѥ5z                @R 2b&p9 0@m۶US.T5k5zHZVj8j0KsuP=ɱ)UD.\nUv5y] FA@@@@@@@@@@@@@@@@x 2`#kӦM#\ޓG~rk༔*={6Y3 ΪM={GFq~Ru7                /@q&ē8/Yh޽z㩅Ш$/XR0c>= :IUJ Dߧ{Z Q[Vj,cي@0 ;V0!5SWJȘQt餆 jդ Ö#sRcD@@@@@@@@@@@@@@@@ xAϒ@ .\А!C{Uh U'z&M}1}A~i6];ȑ}r夹s%RΜ)мRai|EO Oi0iӦ%b}aZ5#B@@@@@@@@@@@@@@@@ ?[jF4i2I)^ޥhKjohwBLS:woX};tHIjRj@ZV@> !0tTXXXLfImHNIC m<hIud@@@@@@@@@@@@@@@@HJn6U# @JQ/. L Q)o^̙ȣPfͤo z6H+JOGۋ/J'ٛȑR 7jU_?Fu b1U*iD6:                @NfiX`Ztsd%[pi#{#on-?o6dTv-!uIo!pabJ]H^Sc> )>"                A@/@6lUڵk(s"9cFy'пvꔴw;wl{mcLc:Yiȋ˜g;                )] Ȕ~0~BD`2e"=Jn4i"eҦZ, +0c4|t|}׹s#VS࣏ n2HH[H;JRo4mZ!                A@/HFRզMga!KmJ҅ ڷOq $%gԮ]X(Zl} b;}$@<Ҹqԩȑ >-&-$ ]RU+謹'& IW                )%#1B RyɇG!7 1aXٳaΙSj 0\;={dc+69#o~a!pSOI}Gԙ*V. -VLy4gm[3A@@@@@@@@@@@@@@@@ >UDK={k׮t^r:}zd͚UsV\1cd d׿9ulGZب컕4^X%u32er{eJZ5y}ߙޭnEjTjX*U PUT4eJ(}3H#GJe޼ <|O>>G7Gf#mi4mrP4O                I_ m#@,}v͚5K'ONpAF7oƍecڱc[]t:tHs횠y3z-!zIKEUUX12eʨ@17.S}^?v}N='N}0 @ bAPH[gΜYٲesKv̙۟O,JϮ^j25jז #\=2",7}/|N~6ۜnyޖ˧mӾ}9PPH~u9ܼos@۾4i:u*RQ;vQ}^Յ -g{toBq`V `-X[?)RD TRyQM!C o >ҫw m߽{[ڿҦM *FU4h *$o Jܾ}6osmѶmwfZ訿X8]fq+ _g @ӔP0~ʔ9ᅃpf!jM[hb [xD*Y mQH,1^UŽڽ?[Hk6C #m|oZFyyɢsB!mC4[[f1$H)dqA0@@@@@@@@@@@@@@@@ HA j@̙7-[+3,g̙5k{faH5kt!իWWj\^a~v-`vÆ n߸qc;ޜ|bBl?:K,!xLHli_s5n-`R87 jB@@@@@@@@@@@@@@@o [@ Fvɂ/^1 KM8Q-RUvmؠAU\YSN{;Ǐׂ \Х].he˖jӦ7n, K^Zk֬[NׯVrBaJRɒ%b_ ojafs-`7 îv׻rʩB X t ћ eNo_WÈ,0ОͶNZe-*Tp V{fXx-6lЅ \8d͚5UV-ԨQ{7~$ӛ޽% y't;;m67/]xIeȐAʕsz 7H { 9B̞mm|. | -ٳg@@@@@@@@@@@@@@@@   ʖ-z@Ƅ_~Y} *]K.*RHBu!ɵ5j( -[6=իWw&9:l .z:{/dN+W;O?. @Q[,LtǎJ.Vܛnɭ3g q ;'5h m.-[&)E`ݺu7o-Z䖝;w{҂U{QڴiW8r ^ݨł-LԩuoV|@@@@@@@@@@@@@@@@U xrN~pAd+VP*U;$۶l٢A?5\'|R۷'pݫ7xC2d!ye̘jիWӬYd!gΜQrT~}dAMŊ X?nߔ>}zxjذ5kB‚ %;$*.-͜)I޽[3fٳ]9s9;[WL2]*C ]{a=*_nV p`Ũr|G@@@@@@@@@@@@@@@F Ȅq СCmذA˖-5O<_|/^\/.N:<ÇkСʗ/;S/}Ν5eM6MWH5n؅0r-*PW\={4w\͙3Dž_.|y{BҦM{sZrXR][S޼\GyZ|N~WZ,Y_ ۳{RJ{\>/gIرc]@_~z[u-tw 5G5                q@ w!3v#f{]t?O>J>}#x%hد_?M0A-[ȑ#U`+2ٜ\g}JP5ԪU+5mT7pC+I kuɒ%ʝ;V۷oRJ"0~]7NS|Yx>ssN)SƅYo:uxHWH;B~wnjժ{GE AC@@@@@@@@@@@@@@@@ <@Rx7k׮]ʒ%KЇp9=ztw' *v0L`.pO\aJٶm>;V fA`d\)HZ޽{ /pE;[n*QD /{JsJjK!]-[4zhYЯ}м6mڸyt!w:@lϟw)S4ydnݺԩxyg?C@@@@@@@@@@@@@@@RA)Wfu][oUn{unZK.u[x %?zA>s4hP7B-̞=[Ç׌3TT)j߾+B+\;\؝mڴI7V>}tm]ZE.\z(dTd^ oш#4gYࣽ_Xoɔ ]?ƍ'ʾkN{Vr                5C-0o<ٳgo߮oQ[n©7B dɒEcƌ￯_|Q;w=6l|.RJjҤ2gάs{@&:ÂLZ9ۮmZ\<.-*5k&>| N>ZVBh"mذAO=!O#KuըQ{n{Zfʗ/F)                W.@R(`A5kT <#vء+cƌ.҂j( /н{w}.$cǎpBw"Z>} ԩ6oެI& #MaÆ6mK/Inݪ-[vڲe|M/^<1C$]v۵o~{ \Xz3ٳgO>ڶm |%A2.SJ*?~6lؠ%J0Ȼ^f               h SH8ѣG+k֬j۶mPҥ83f(W\A.Oo'|7xC_|Ubg3ƅ9rDk֬ш#T`%A aڷ{'*T G()Kre%^Kck׮.X7oެ\YdIă@R4vX/ڵkʗ/>(ZJ@@@@@@@@@@@@@@@@ y _F@H\pAFRN)SO?ԩS]`…Vor[n2e…j߾ԩ~e˖E=䊿}zhϞ=W\_bUpYuݍc7o&aG#GT5tРYf5\#'^ywؽb %h!Կ4eJUZ55|p̙3Ac-ܢf͚%H{Q� jݺx≨Ě P} lIZG{V\Y˗/WժUtvZjsB7`yn>h]qZ[Q|^N} KkA:rT9                @ 2 xuM7L2AkB={.hu&V^'|:tm_` pN m;|_T%nȜ9yNsK<;ر֬Y &x8X⏞\z:J4iҨk׮nωQ,@g:u]DxmiSeKiD%4oaÆС>seɒΡvZ~RN˪W}g0X˕́Q`cΜ9)=|.B 5kg@@@@@@@@@@@@@@@@d)#ɒA!@L8m43C.kG}v)_|u~r=ɓ.jذa qʔ).^zn_b3ϸk){Qܹ'\ԟP믿v5\]o!*SOi޼y|=F K09^ꫯb%XRŊR†C{NҝwZR,SJhΙ3gϞhM6v×3F7W_۶msRJw߹pSD@@@@@@@@@@@@@@@H>@ A, ,O<;֮K^ZZZ?lϞ=Rx ȑCΝӌ3dAÇHY~( ;v2f̨ *4iGyD:;5޽{p®-Zh_~j֬n馋iԨ-"%K9}駟ZY5p@ObGoVZlٲSN^rѢE:t萪U%JȂ{?,u\׮]tM'MxWe˖[( ={x>>/wر 0կ_ K_t|]wĉvY-^H s{9~>)Sҹ*Vۿnr-5kָz/˙3lTtViӦ6\_XBec=JvzaT>/]I5 v o&XQzؼyTR?O[{᤮GjԨBH}^0oݺu[osb\9sb)W2N/˗;wn7F/L͍ h_煎9w+U{Gqvoxa8/l- /Vϼy|݊)ڻ}^Hl>&1q?^ }os$7^<]|ywxhk ɥ y>/ݻdZj^P|>/SyᏮ{V^7f̘EL_r|zvB }Oc6;/lͱ !;m+Y yA}@diұ߾W^ys7 *{f? tq WH=Ů!                 @  /{nyAjA &R^lժU+Wx?Jc{1yB\/PA[ W^4{1q]uԉ񺿨h6\8~z ,hv3f}^PKy!eq#e˖u#/ͱ^DyP^uyĉnmY7./m d> ?wÇBk漈uo5k6G?^ ,߯ǏkȐ!ρ3 +}uyf D7Wc P 0Kmyu믿vUre359q 1Y?               @P}C-`>c!8,*hgQ,HB-xTR:|Vpanժ Zj5rtEM0AdŋYn]yԿ@IDATd@8 Mb`Idv |d!R=RV%bsb@Iѣ:urBKX^PD3"EkW9rC׮@۰_8-( ϲ-Z\(W?a;wnwYZ0۶ms2O؁r])_l}s΀ ov,BB ЇZ]ʻ1f!V|L% 2Dj̴9xPK+z3esS%gϞ@p tRժUK&M($39U?qG ѣG9?hsZl6-מVv`5b}·-؂-ڴ`pk X@rb{m#               ,@d(: $,i&͞=[_}UGav zV dH˗/~ ܳ&MHDB,'jըQCsB;?R1|2e *W 玞1cΞ=6mXi;,‘|Q;1UT 6Ԫ,ӂDw=صbgQ߾}/]\R .wvU!.gVw߭?c ʚ5kMx\`6;Y2OqQl[bZж@׭[ι M޲eUMPw z!T*/ﴅڼc)JL>ݻ>P^zj5o )?YƝga:E<'؟-~7  tL>;" lҤMvQ"Λkĺa |s|Ĉz'4}t[+ↈ] yy͑               @XY(!@5j)f͚^{>, vɜ99ޢmfZrvܩm۶E:|(P KrI,XPǏg}oUcaAmڵ՞?^۷׿o #>X`S}z}ARJΧ~Z>/~I맿΅ F:mʔ)SH;/AYd?w}FSUlY 0 gϪG߃a٪[n0׺j׮5k'v.RJB&yj+W ±:vӧO,ɮ/ZڍOqsz֚5k}`8p jޏ$=M0oϑq]sXxs!C9pn &@Y{oon_l<9/\Oݼ8l02}tkcڴicnSv9<٫W/ٷ/{ҥhGz@_.v|7.ٮEҭ[7YgϮڵkG;HѲe\={. Bv_Zsk Tc#Ƃ-ў ImӦ [ܿo߮  o_kڞ}YfmXpҥfh>f9%ŽK"֭뮿Y,YR2eʘCbό=vOR,`eyy^\yo{tԩ~}衇nHFe 69ɞk ӳnX{o/\PYHfn.mmbclm [-0:o#ߜwщc(+gvA6;dѢE.؂-@q1^o,Y$ h}\ipYhQukbocE-+WS޽]R \;6{J6-;O|m>R@@@@@@@@@@@@@@@@./ |m$sFAXn/vj׮}C,ٳZ`'N粩q֭.@n}'8 ;v p`.7nttg!VXFB^|EYnr\gcrq f! J$ P  ԊZJ'8O:-,-y.$JW',` [s%*fAł6 رc|wAP%['eM8хeDW<3$~\i΋K6s\mmB"Bt=vI7T}9оmn+v>;UTo':.jsYZ e3gθK m.TPD_Ռ?wE ?¨-={gy@@@@@@@@@@@@@@@@ 8 (gyF|6oc Q\uvڵ*S y饗YiBׯooRʂADڵ Ms}ݶmڵk+Wj„ W^\4KA.пԣ7%%hP{NÆ /)RL} ߈9&H/rU>}z͙3':iv͘1CӧO??jg-4-[?X=P*                @j'OjرPD]W{@ogUɒ%e9T2dȠWRrX'+vz-nk֬Q޼y}Y#               B QWbQ/VU4 P@ >CuYwV,YMcǎO4c ըQ#ˉx4`}.D1Zuܸq%%O\zr"_֨QdZ2e믿.{f(\ٳg5f^_-[8 "=MS;A?7xÅ(QBdnO?^ڵӧ~sΩL2zgԺu\6m';9r [ZZd4iܚW                @5@ *TP…]n iժ M8Q 4i,vvF ; b!Ht;(C ڵqO/{E|N4ҦM}S+pQ=ZzܽϽ,Pzi_^{?zk.k|"EԥK5o\Rq/>|RL)[>}ZI$+:;wjذa1bRNj߾RH0؆                  cD+TlY͟?_ժUq\Bh5wDYh.&~I&L0CiС|/^2eʸM*gΜ7:I&iܸqJ*'ԣ>J ?^޻D^Ш4pvnĉu>вe\ofԤI˗U ,,}O<}9rD 6TUV-6B@@@@@@@@@@@@@@@R Ȁlt8zrʥ7xCO?twnѢEjѢ_W6m@)?JJpCGCu!A#GT̙m~/U^]?z!͛7@GECA`׮]/5uT͟?_YfUպuk,Y2L"=ԸGRd~Щ(]Xj>gMߠA~Qj'/p͝;WӦMs={r`mW"               @ W~#G /h޽ʐ!_ٳ ejX_-;q}z饗8qb.x3?fϞ)^8p@eʔѽޫ{1I$qyJB]dfΜoF+VP,Y\]Ft={HG//@WZU*IG q3aaaZ` O/}v˗OSݺuuw+}q|VC n~w}w5k^9q lذyw/͙h@@@@@@@@@@@@@@@@ & ca;ZD*_>X_/_g}V .t6Yt:}Pǂ&O^{M7nTǎէOeʔ)׃9w~'M>-6mRƌUF ժU˅-Z4OK{\"~z4w\:tHz~T^Kؐޫ Ε f̐2gN^\9W\BU-\uѢEJ(ʕ+zNM6q$k.7o˶mtM7_ ={8:                F (QbE 7Zd*Tc1m4Z/xR_TժU[qSNO?U~→yի Y'l٢Yfiٚ3g>YI{,4y~sHgΜѯ v_傿j֬¿ԩB Ұk xnQN-}7o u ۳U _]n Y*URJ^ХtIA l_j $t{Xd)Tre@mAݞ4i8>;!               V JQhݺV^+VD6~7۷/^o]:tP˖-]85~z9RcǎcgϞ9V\8B K*+|*Sn6$ hÆ n^l dBFW.[J$Ia޽Rݺs  ߿?"y{>Ϟ=L29\rn3J(Q`^ǻӧvZkM7G łSL}                  [@ R\4`u1GO_~EÇׄ t5lP7VzB:$g5uTM8Q ,pT+[ls'7ovA-ҥK]ЪJJ%JPɒ%uw߶Θ1ck06ZU?Dힰʕ+RJ*\p&֭J^]@u?Ξ:u-YMe=>}yx.ڂ-4aaaھ} }\flBϝ;`"m[oPнe9               Ap"*`{M_y~=zT~ >矕:ujw}.{Q̙/{|0ܰafΜ?\ .tײAjѢԩĉ0v iOrJYڽk%G*Z+d7|3.@ܹS i&/o }QYX>Z0hRTlY|؅=uܶm~w޺u[>}u-[RxquL(Q 3#޴=ޒz s'tw 0X[\ kΓ'm^-6[ &K,{b`]viǎ=nmծZسomLbj                $@d],? ̟?_wuVXoq ]XYeYؒTP-˗wPIzai)eT0Y6־0A yƾ]l>#m~ϙ3[1?K, 45'Ots6[-&9r$diҤ(7*TȽ 'OQ                '@d]SF@#/6wYp0ڷk.6bރ ޴N}[3@@@@@@@@@@@@@@@@ t kf @!C]vN xymڴIhe˖-:qD,D,H~ ϳdɒ% Q%I$`3gθB,` Y@S"gNFipŋ Jy?|S6L^ؗK˻¯ۧ?J~[a^Z,PB, *U*L2oomb06=#OK}u1ȁ1sjq@L Ŵ@/{r3-<~[h^`F3ӥoss6ٜn/r9{G+6/{[M;:EJ4 Վn޷mv{\p!bΏ;{۷we!{{ﭣ-omE-vn}1}Ⱦ[|s(                \N xw+h޽J&MuBy%ܹSvr˞={"}!@% =o mDQ$-B&of͛-DA &/Ko%!Ruɓ..D򈗴eZ^ ײ-_c`.6,x"|EmE facɨk_0msgQΜ9]Wmg( ^~XZB=Zj?\ok|m|#}son.ѷ־>6{wDmO2.5nRj/z'DΞ=[JA8{V-< T>ӻ8QjL6MzgE@@@@@@@@@@@@@@@@'5 ~I6lPbS: GJ}H nzm Mȍ7j׮]]v͛B߿? @,q`i8ijUt pJmH?.%ـ                @ ܜ TlY.]:R'~ }7c=J>_!*^nFnUMziV)KSXd;A#G͝;W)Sta۷oh!]m@;H.y@@@@@@@@@@@@@@@@nA7 }9M@=~.yԼTdxizըQ#?woŪR7-%_]vuaaaxvNq%P4wg7Hwo:%wcҡCc                AգăI\8[jAcǎլY3>}:@@ \Gu>}ABås ѣBeČ@@@@@@@@@@@@@@@@ L(y΋@:uJӦMSӦMt/kWpa ~F֬y$LZ=Ě$I5vٲeJ(ʖ-{ G'!-Zз~ڵkСC )z$]fM-X@۷oW*U:@g@" 0@ZN*QBjP޳-͟Q5B^x!<@@@@@@@@@@@@@@@@nA7B6I&zʑ#Ga p#9dԫuԹkܟxZxRLJ*_~"ī@9K4iOZ2^Yo_ɛլtL]M49"Ξ,LOS'ߥ=ԩ#iǎj޼[:[:d˗E]\ri*Uwf̘BW"I/)#5m*mc%K&M m"b(K0v@@@@@@@@@@@@@@@@%@䍒]\~ɓ'ՠA G a¤㥢E.]FmۤW_2dO#(O<1b;={СC*YdЌ4]t.HGՃ>.p=ҲeҔ)ڵRR۶.|ߗ{O#B@@@@@@@@@@@@@@@HX ֟#_}ʕ+ܹsm*0}TԲTi4h-[=~ꩧe}J:utZKRJqKS 4iR5J{9o^gϞ 2B[ᇥU1c~nUQڹ3]mZI͚I[K                @B ? _|O{HOUx@*XPZ:<$[b=ZƍSBb{֬Yٳ+sA9ݻ/ĉUvmA9N@( $'բa4l4kTԹ{w(ZFs6LA@@@@@@@@@@@@@@@@ NFA ,Y}\@ |G LLZX:U*V']|z);k ڵku4h h*W~/C &ڵ6m -/7<r׮PO//}4p`!               $A YkJ p6t. \?l)*%+}RŊWFzӧϕYx UD Yg|TJM4;A!`A;J[HHӧBv$C AT$ҿ-/7d8                @ 4@|w}2Ɓ@ R"Ғ%Bucw .y ӄ 8q辎7lؠE.keɒEx =ѣΟ?࣢ U yr'!f }m6@ϞB6k&<(                *SzE ,k.\R5jHݵ@IDATpzO o_`Ai$ii:iS)Qwޚ7o>seΜ9Yȑ#*TP,$MTԘ1c4h ծ][ @ $K&u m, .onR2p)&`͟|"'u`                ~'@]:@ L8u W\ Ύ =+ RҖ-RNwU믿믿\rWulU޶mRAK Һuk-ZH;vP2e#`B>xx_~7Vh<ҨQȑԩA1$                @W_@ o .t/4d7Nov}Qj֬z .Ѽys?>h.!]6}Q7֮][ׯ?'V…*wQs_VΜ9tR7h+ &Mzwυ?%˵mݺUZR۶mվ}{͛7OӦMӌ3aÆkk VZJ* 8kcӥKٳڶ~&O:VJ$$Ԣ}#z*[VWOSV͟zK_bxaC' $ qI{                ? $N'H8 j*͝;nݺΝ;AhѢ{ܾ B̦L͞= y.Z} *TH#FpuҦMB9aÆscSwΜ9|ǎsnj5JŊS4i\d޼yP цY%Jhcsne+'=tƍ{]{ɓ'?~jܾ}ƌ5G… ZzV\)}Ν;<.5T盌3믿+=z0ۃ9\^˜nA;tP7۷O˗wKҥ]zɩ1~6+na NJ+ܜ,Y2O5kVylTˮVFqiLqz H/=#Gxg\&-WB@@@@@@@@@@@@@@@fD^'sM70yu6 6lqYiѢ6mڤ%K-i,{~;~ L%|)RD?$Ieq:z->|XI{5ҹsg7TXg2T/5k'L*UDvM,sկ_^͜;>Z@رc](o-B&EW:v쨑#Gp` M*UtT^=;[nulNС{^ڶmJ4-~ @^֩{x{{wST$^—馅.[Ⱥ}p=               @*=E-`!d)StƼyF"EKB Rt\]_=kBT,/{챮;wnפ|O(:u6Y8͛#vO:Ujr̟?Ecďؾ]^T 7!C ]ȓE}>M7tCC m٨Ϥo jժ.d/yzӧΟ?'Fԩ-[j}nS XĉUpa8p@|It6_ߢV(TLoY}~iW%آ@j a/S{^ߗv#>,+po={$:O@@@@@@@@@@@@@@@@Hݤ YK[prȡ3g\iիc ,1cĺĶDб H_hɓ'P/[z5iPy!yҤIRW?SNy]{aP?D۱cv;S}k]v|Ne.n֬Y*P^}U_i.(Z{)a1vXj}T~} lTRjӦwl[s=sjJ4>cT9KO]Y`~ nݺU l͚59Ds6|9sfM>]Vv?u[.˵qΗ;]޽{kذaV=z m֬4i#۷omm̔);_q9}ĵ7{ϼwlɂ;wzJʒ%H{#ХyZj\Y^}+W.Wپm|MK؂               @`B *-([J#FNnws-ln͚5zE ȱO xYz "u[+[wm!t̙3W4~x-Zԅ%֩SG{VڶmGw߭_Յ0}GUre/2k{߾}.~GUVͅ׿ܶ> E/t&ةS'-[\FK,_;'|RgDž~X;ga_|6nyy`^\\p,+LƂk.]#GPQ r릛nf'Ot}ٳGӶmۢm… 2d76l( ?{B.TTf3.v-}Zˬys@0B Q"y7%zKxZ`;O>Ԏ-                @ $ 2>Y` 0@9rP/9n_)^: ܳ00 oU@}WJ8IF@@@@@@@@@@@@@@@BC ih Q"V\… GYXWtBjɮt]->6dɒE#GT{Ւ%K\P_˗Kݻ ӓ *M")7޿ C̐!CD;hѢZ~6mڤ2eʸ1=EH4l!Re?u~G'q\$IDݥy{ӽ-/j裏BJӦM]1cN:K#۹s;r]srvm7뮻j*=sk1a :+m×t`ƍ?{WH 8Yo}8  6?h` Dغ*U04͚I H^}`w|ŊݼA]gz               ĕ@xrT\F; J.-_\LA6/Be˖uaxw{۶ITttx0ԩqi=̘1 uڽ{vء 6B:urʹAdϞ=b0 H:sٲe7^='|R*ioVZiݺu^J"ED_ۂ,,rĉʝ;f͚ƍ_s|A'N"7z]haŋѣݵMh4iҨW^:uꔻ7|ypYi-3gtUƎ녥UڜX=BUF y!ڵ]}{}BU%Ɲ<ѻ{fQ+|DV7                ZAf(5CZ\tŷ߷\ڈ|^i^?uwx VѢq?R%{OJr [8oŊӀ|rJ*b@ڳe- TڴigycŞ sܹsoSz[nѻ#6l;/,(Js^>5mԅژ͛ <%t9s_/:i|̕^ion^Z[V\Y_iL+y_ӦMs:C۷o;~ZysVOoZ7}0A_.B@@@@@@@@@@@@@@@@  ph..I$A\~h, ʺu:?,̊u|Ǧ ;zЋ{iTgw8uJzMNB1JkȻn-`B{! 82e7lؠ_|х%Zr% 5zhڵuη?y-hgq/@jժ)*_;߶m;.?'vBi}/U*}j֬YC"+_Фz2eRŊ]ٲeb.i`ϧJg|38hI:{=-]T6gZ0gϞ=]bDx-v_޵e˖}cWj׮Y`c)TB4n9KMk+k׮u?O>=+V>.Ҟ|a@֬+y -77H^vZ)/ZjҮGes/>~9@@@@@@@@@@@@@@@@ _ B V^VdIgX蛯X\6m|F裏|*WgϺM֖yEWbSOí2fzQ˴iTHD%`Vɻ.]$˩IJƏB۶mN3d/z饗":ФI똅Y֭͛[{}ޢvEYgm?q {uO>^z]|jzFX E:vN&M6 ~lԨVZ=c_\Y=[Y_ȑ#ݜqE4Ç# 9b2ehɒ%^:t&Nxxƌ*[lnq,ڶ9fŎ{3gΜnη_][nu!W@)}g!ߑ)wc7QIH|PM_}onݺ@@@@@@@@@@@@@@@@ py%[2yr\H; fru_zA^jP7ɓ*]t_I`l{wy# Qq.BiǎS%\]38p'fʔ)+}KﲰȂ *]tW;K,ϝ;,JԩSJ饋ݻWɓ'߱Wӿ]jܹZrVXϩ?7׋/z-ޓER@C)E>WlnO?I^. :vuh@@@@@@@@@@@@@@@HH Rs#'/~G/:&MSaÆ~CW@~t}қoJŋ_ZFo`D ۫R{nn^jΝ;cwuW -DZl2uE/c=^{M7|s @ <(y2DAgo؃޽ޒ/Oo`4eL                @,Wq p=RL'*,,L'Vʕ'Oh50}UX,t{H4fTtxR͚ sYN`խ[WӧOYn^Zl5ydUZU9sh0믿~ĉ*T)RFڈ1կ__2JA ;'}4phTR /,{,0bw4gd޵jII\PA("               @h $3z0͛7p#QDjܸqH@rK[o$+-[&/11k,ʕ=3@^u8|2gάG}4$B N'njuqiӦ>ӎ;+4ԴpttRNR޼7uh_tUV:xLLٲmɓҪU~5:              ΝTTB !&2K <n4TpKRB*TYe<ϙ~8}:kϵw@2@+K6q5 C`z뭷t-Gs@>P?}Oʓ'Mհs&V4i^x!,kvg~9rկz裏Tjլ9`FiXNz}M-{OsU٣f͚_գOTU                 eNl;vh׮]*Y 3J+Qpx\!dS۷oW"Ex@5bmذA-ZМ9sda^xLrrd!%B/V4 dv4˗Oߺg{ͽs] vm*aW@@@@@@@@@@@@@@@@,+@d= [Hd+}f͒57*VϗxC*V,}ڧ ޽[~C@SNѰaôqFlRS:uTB3&|AS wn}{Xi4J{ҥ˜.=1]e9|pgXE'^{sձ Km                Jg p k׮G(Q"+btMR޽rIW_IEjx={O_![nE+P2e_d`h2@͚R=zH80ܢ4z49WzYY۷_~M#@@@@@@@@@@@@@@@@ + .cC ֭S9tꩧbovA :-u&w4y4h4iTntڣ֌ؽ{˗9{`_~6oެ[oULtiw B'GpS|RZT.,VڱCj8Ҷm8%'`a~Wܹ94cFrG                @V 2aƇ@ [nU…}d 38xP.lN*WNGzEi|u7EH;X0%s)RD~o߮{Lvw-s9zJ/@ #r{F'͛']qԣTԥ4gNF.sA֬yekV~Ν@@@@@@@@@@@@@@@@ zAFϖ .PB1W:*W|P&ibܹ8͑wwlPy_={*K}{s‚!ٓq<*Ņ9^-4aTTg'w#TZru[f@@@@@@@@@@@@@@@@Hg l;vP3[O5K2E  ^Nƒfh 0A ĢdN9r֖-[Էo_+VL{^{֬Y9;N@  W?_;V*YRI*]ZMZ<ݻgߏ?P%9lzyt@@@@@@@@@@@@@@@@ :AFǕZ;w`0Y+5}IAώ!T>|X'OԩS5}t͜9ӯUVi޼y.AC!)Ua+]bhlRڕ3P`ҥ{5w\^ZM6=K M#@f8xP:Tz]iXlY;[oN=538}y.5hpHEvR 5Jj86!               d YcU` ];V=KN!O|矗,LN-k֮];n(*Pn(KfzYgoBr۷oוW^J*7Ԗ-[2cd@ΜRҘ1H]'T ?>:,VG k,gױ;垉R&Ғ%'@@@@@@@@@@@@@@@@#@d94FI^(sԶxCRܙt$ں%&S'?e6 lժ~g͙3GSO=RJC_2[dyI.^-^ܻAr!oK۶e`2i^ҿ9}tr!r9F@@@@@@@@@@@@@@@AQbbC  FGeLtR&RKo)|rLtNFIW ~(1)pK~ӧ֮]zK .TÆ e羗K8۴iSLN#@:wMfΔ u nU ut5RR:ҪUС'E@@@@@@@@@@@@@@@N  O(8@\tF`:KZ5if駟!C Ss.qHOB6~zhӦOz"XM6:h[XᒰZj'@vz֨Q#Wׯw!nA%Jmݦ~Da p{|z3O?IիK5kJ~(j~1}K\K&ȅ%[Jӧw~A@@@@@@@@@@@@@@@= cc"*`[͛#Z/ŖK?,B#$ڶo^\9~|C %ҥKvʖ-5KjѢ .ҡϯkZr|I4;GW]uJ,]jر:tPV`h bŤ,{o9<{-zԒ[7C~#2A'-4޿(                YG Ȭs. $`AV֭[wLsP <ԯ\Țtĉq~[*W._Ε613g{8.;f\gh9 X#.yvƌZd |{HSN_RJ/Çg!H_ O?V]fF zuwNOk J|" ")"l                 @L d iWӠAz@ [lQb?hGK ;uJا9ϖe/Ozɸ`{ _^g ͛+WW'… 5Ƚ`okujժ.尉'YqmJ.թ;41F{V&췅^~zm|C@@@@@@@@@@@@@@@Mmz8䓕/_>X"RUROOz둝=tHZH:$iWrRܹ <ɥ-rrSNRS:Ҟ=RROl٤N. jW< X];wqIk<:D>z…6m5j䮳Ӕ#Gew WYQeSΛ7*|)P ,`mmP"ZkL2_W]u:\K\:p@=.(@Eq$v\asG؜ץsG93Ÿٞ>N cFRsGv??sH'bN-3>>\%7?H. }he}{Omm`m_{JMJ~wҍ7ƿ۷o4XvS[۳H"驧ҥK*@@@@@@@@@@@@@@@@"!@d$hݺ ɦ/2G]V˟+Veʕb9A`N…Cv,* x,8+bSgqFR\9UX/s ?-]^jԐ :J=z}~\vY@͛u\_v۶mbQA9&Wl4[`J9c_~W_HC>.yKn~g {,b}PB +gm,[@A[l)~z >܇B㏲^z˗Oz>c.SO˳jE 'l /l lvTG/}"#x.:s!m9` >-Z\X1bQ_] ɓϖnEY.4l(/7HժI}'\t/knT]/\dYtÆ 9tʂǃkΞk3̮}>}azp߇ؽf{i2etB ~H                 @LG umӯƖ-YDSNˌ3|_Y 8 9묳p  8 mb!AYUsDk˅^:㥋/- IK.RKJ%K/{D^ηY/tx т 86 = lf,AЙ]b!*]V#Uǂ,-|K .sx]x]~g-{=B/^܇c(QB|K )#`{ԨQ>Ҟov>-PI&kt饗@Ľ+UlYTrĻfjaƶxٸqWlnkbo&:ﶏ\9|ΰF ,쾷%G,K0 (3},B,dztWnݺGC8 ]u4aB!e`a;KYV?,q岰O zjAu 2f!n'=gze*|0= 崐 B,3(g.Ȟy˔)C[ŵ\o̝;ׇ6j(>~/s9 zbg}V?rȑbl|amZCmċ)Rć`زr[6%69K, 9bcJ;th\({-t}7˽K}$|_w#4vNgL2_6Xb͚5eA>z^]p{ޑunja^j劉.y+n e(@IDAT                P Ȅ|CTJe!YXѣ5l0i5tu饗VZV[@ٟiӦiĉ~|K.U԰aC]s5?ã:v>L:|taʕK  jԐ&$,mٲeZh/^nȖ/ m mm_eAbmFɜ\ڵkf͚}O[>bAB,ʕ-˗W%XGPBGC!-|mK| BƍC7={v6`o#sے%Kb6_XX-m 6O؜aM}I:vC=m>p`m׀#X|̖-[VXgII^f>¯]i8[=wޑ Q?7ٳ=~ghANjmNjO̸]f?~'eA͚5vR@@@@@@@@@@@@@@@@]  `8 +T}]u)K۷OFҗ_~o]|jҤ #G,1ă0 7a.V߹#5.V_ˣG{[ne>BbAOg\eƅt-`7¯YF`Æ >Ϯ[,h-PҊ]i!TP;<Ν;xd@z„ >_~.mKAG T_|Q>,Xp}so.+\Bo2e|a /ljS +Vįm>w Q+iϠs=7~ĖX w9.0_z5 }-qĈꫯԩƍwҚ5k*:tHӧO^>yd޴iSnZKW@@@@@@@@@@@@@@@ȺAfsH@ڵe[o2΋/￯O>DW^=4ӪU+Yp։V,lgo"p6[C]/f'B,qٚ7o~7^z6o޼}Aos9:Si=A,4,rѢE>(FO>.U\/ժUa'Sćiay}ZjO?ؼyΝ avL||0}[tc?~0n;O@k]=N6A};wnUPYxٺlٲ.=lBj5l2?bŊjժ^*3<3V3g,L3%gΜʑ#z)G/_3g_-A@L`sږ380Ԃ_Yfn,Vjs}[8]t[-d lO92賛 ry5z;\! 9O2voi lذAӇ~I/bw}jӦ_AB@@@@@@@@@@@@@@@AY 3>R)`5۷֭[U`T >\>}Lƍ KX{w (~؇ҹOaiyӦM8q&Lɓ'k֬Yڳg,XB,d q˕+W!}v/;oƍz7eP';VƍW9r\u+ `7 x KwmӧO&MҪU|]׍5򋅹 )YBPSma|dþ}dVN9Y`٦Mϟ?|A [οs͜9SSNմidѼy C{~rOKnt\tn{vݺz+U|?=-/Bt_xp 8]@@@@@@@@@@@@@@@@ 2=F jZl_|1jmoD/!fbXr?~۶m7|PT<'jԨQ>tܹʝ;j׮ë6l?rUV:_%9aY- ,v7i/{n_z%oada˖-iSZTh]D zK.Ք)Sbs˼y|pr5tWꪫլ.=wW_hZ_FsN8d1B;vPժU}8Tխ[Wyn>"a3F~^Z -|={ [z7jvÇԩS}>6j/]tr̙ݢ=bJBǏc+ Wmu5SO1%Y ~B/{-ڗm'0go qڴio۶ڵk5kgWҥYfiРA/_y΂4i 0t E,lv|E^r%jӦwX+l_|Q{ekÈB!ܴ֭yTR15:               $%@dR*lCسg+zKv[PX~5kC/ 򣤏U|,L13 eӧ\zȐ!>tQFԩ˗SE~ *'N,X믿^7n7|#               @ 2 D@$,&[l6lX$=/_. ʕ+Fs9cؿt>L~ڶm{EH ^ziKչsgjJBT'`s'WA@?UF(ҨQokѪXڷov3ό1Iݓ0k ҁd!s͌cBcJ fnf>ܹ?,Pꫯcf                ugݡ128͛U,h%#˺uteH"0a!t2r~3t If<>@ʕAu… 5vXtM@&%PLC/õm6]tE>mUw4p>HwZnO?]SLo'xhS7XxzԻwoYF}e ԴiSey-Zp >|dNn2{ sa @@@@@@@@@@@@@@@U co$ЪU+Y^FݻW͚5Scjao}u\r BK3?OiӦzt B5tP 6L|իCӻCTKumXkWFe\a?6oڼAX7WfԳgψwfժU\fSeʔQ~4m4͞=[\p~4xxge_|!Nj-t΍#;W@@@@@@@@@@@@@@@@ 3FH ̓'>th-a>Jm6'7 lҤ,^z%ծ][wW^z뭷CB ;/vC޽-W^8j(q;c>/_a{+VД)S_k֭<>Bl,}ղe˔-[4u)Ѭ;M<fa ;CEE Ҹqc͛7O%J_, KsNk$\hj>v2rؿ/^kܹgAf(ފQ0-[hܸq1bv6lؠ'z3bH=uT~kMRիSҥW6N$Zd]O$scΕ3                 KA٢@|^>}ҩŸf,B}tm76vAZd ɓ'K.гO?4A{;-0XDKΝ}(NFz5l0n.{wo4vUzhTuȑCv?|純1cBAQYw$n:iF^xx -[Vol{F"EhС}.ݻW͚5fRFfjȹ‚oVկ_?5]M}2 1wy뮻ьzر95)6 ?O 9״m/<¦ۻk׮\9                $@d,-@: Xݼy4iҤtk -vffnhz|b϶mguVI?.\lٲ) 3K e"Ywx] jҤIO|3̙3#hٳg--ٮ]ZEԎ/ mݺU~{ 믿oϨv>ꫯu]' jf{|8رcUTh6溙+bJMဤƜO`. Ihc,)A7oA0ѣGw[nErZIUԵ~ֽ{w7.kK˝;?WCң"               :iR5jPjnݺ?nZ[7nԛo9sPBոqcߞX`޼yUJ>|֨QG7o2?C8eY385ZGOqj8̌."TгgOٳ'իGbmLO=Zj$1=>SNavٳeab~ʖ-jٲej֬wxO?$w.]M6-/?Mkժ_~.YD]v6lؠCj͚5;UfkRu_q?~|5ߎ˼[n7߯pVѣOJ߶Xk}Y"ES\w~ʕ+'طRJa|n3Ҿ{:OD~ˮŋGc4\m6}sȮÇ /%JiM ܴ{n{>L6hbvoY9޹XrM2eȞMI[}=~ڲelرyQ,xԩW:k;(GkhcʵkתCY{jv_z%Yh>יXShBwuvŋ+ڋF9łه 3{r{\rzw>]tiSѮ^맽;=UhQlRv;T45\Yx+`               dnPׇBP@ k F h!^r!7Qi˅9眐Ʌ&.ҐC.&4f̘ q?gr!5 /0Ԯ];um!俻0P޽Cs =c"L޴rŊ!w 4hPȅ&\h^({~cU\P(Oٺ:i;[.1:u 7oXV >ꪫBvؽg (Yq &L!l~v\\ڴf {Q]\rI?֊+Zrav/YfեKyٟ?ژX^ B.؟3{qau9\(tȮdػ+ו҇XSl9抎r`Zv읢o߾O.f]tGQ)&w[Mjoq3O MXٜfmع                "Hv HjR/k.dm.Zh1'OJS-[AA֎WdIr컅ٳ'dwX67 :t(4}… }[ O>&W!ڵkE-ZGZ0_ҥ>-ZHrHm0^zE>|8bSAZ/^UT)sNE J|.r-qǎ2d, zR\ g m ~={v 8ǹ.wl~T L Ҕ)SBO=]l8vTx\0 (?WXѯ7l=??5k??54tT]SAӦM $ ( s 6+5{J*raSs=Wmڴ Ҽyk[47 }wrVrmzwB/B >DcAV\{ͅK,Y"'TZ5$?ϙ3Ǐ,<sas-Z^2rTR %+\xk|l݅7oKns_ȅ3ό?~~{ұcGM8Q.T )RÅ)kk׮y%20`[~2 7.wI*O:$lٲY+6G~?\pʪU: msmPjժ?&fOu,)igqg/W{rU^].LZB1{YUP_הmNsɾ >F@@@@@@@@@@@@@@@ @ Y @'x)uoUGpBG1c_,,qŲ,1ɑ#'k%-8K.6ߓ78&k z}ߞ={dtIꪫk.Eڴ, :Sqo }(bI|7o܇ 8Ї};⇗k*8`ܹ㏃M~\{] җ>׼m6͟?MZ8Ux@iW_}U 4!y1Xt" Kesg}nII[)S6?S lZ`}ÒY_x eI&ɂꂰHZj?~|M+l޵<[vkp_7N3g<" 2x gl*Q,‹ 4!gS%Tii?s&ZVp<o>|3"!h+Xvϱ68V^Kh{#ބ/ցܹs˞%5kԇ~&Mѯ`\1G/?x[jz;WvQ@@@@@@@@@@@@@@@@X 2VD /Cz  tɟ?rGT{n_)m'L`RJR~}BT;'%K&qoߵo>U\J ^LXfAf]v]s}7|%TΝue/[o_O4X(\5qģ`mڴѨQ4vX|>*Ph5;hPB;}7 ԩSQwa?~맅HZVbf-*T_ `4+*UJ=#lݺU}:VN~h5!&7WtIUVi <?֭[0H?v^|_ծ];kqx cCx=L紴99̧d)4|饗|^Gػeˑ.i_J7mC|:DzGO?"y[ 1 | ;)ϙgCTwfMA]_+}k.fpPp=gk⺃6m}})O<޽[jBƍhڴV?? 3i$bV,,3Xg·ggN)RD<@ԺQNr->4X}ֱT|zJcA7ODoPH?fNAj=$e Xlx:?\IMǜ\}ῥ9Pti?ٳGa6Z z9V攠ܻwo{>;uŊe^KZk_m۶m}wh%kk öOI/W>xm{vٹ                "@d)@ XKsHE;ƯSFz 7 iذyk_:,լYS7nmZPVofZN9gے:67ŋuUW7ow3f}]zuS۷ol_Ocv|SE)T^=ˇu92 1<Y`޼yڶ]eʔḫWj[iV!ٵzރRk8P>}B5j5h B pͧN:bŊ}M ]˅f\GK*zBo^JвeB g<̐ ?X;|v^^K޲~[oj .]:fC./ ;.g9sCpnO=Tuey̦y! (fS ޱcGYfŋ\X2KRsc\}\ٵ`˥^r \as [-[Byu5iךOA{\OI=t&/- -Z{.4Ըqc' :ڽRzp s6v{nݺF-[s͞ސRa927` q^)=l'{|ڻi ۷.6/R'2ծm{FB:C.6/.of`̙3Ce˖s iO]>C}OJ)]b?vm.aS+عsFA@@@@@@@@@@@@@@@bI uօ4DiW͠AJ@ p!M0A , J~2?\m۶x;w 9#7oެyFΠ$Ʌo< I{$LUXQ:t fd5x`vm]\\(ag]N9唣v3RT+Vxs\3fȅa꥗^ ? W'Ú5kBdד 0 Yv=_뉿+-_\vn`Ϟ=5w\?A !Ԉ#vZccsaGg\.<ߣ.4Uަg{a-Y(_z;w.MB ӳ Qi+…% ” !ձvxgg܇ߛ֧[3HORGsjJs~=ln9:|~Nm[_fSOgϖ 7)iӭt]\H\oD=%8vw{?Lwrι3sι{?z;sf}<3sg~g;ӭ5WCm{ɭZբ|T{N& `G?_3PWX@@@@@@@@@@@@@@@ZCkklm"@XqN8~ӟ֣SxrK:u-LSR@J]=*Mnit ĸ"xgr]{>7VIOh.}ͮTR {~kVjr&_| 8>cl5,R lus=grԶ馛O!b?[%\TX.ݶ*v|U'|m 7!C_KP`kFim_SN-osb5ꫯL͞=\pjVUf￟U@@@@@@@@@@@@@@@h N.BVio4aBz@>߿~>XoڨQ|n͖Zjzm8#쬳fKwK}TT08 P & yaٳ>k ^N;4 ɊG D#F뮻z$eͳ׿СCw߽|Lnv;sn7N>}3HkLe6c~gϞ9s>qb_g}f -P||MuiO+.2{Wm'!Cl*s9ƒ ]vԭ_~m"$&p=  ڪx* [oնv[;vO /ܐlD7I",b]ti2.O? J͛niE@@@@@@@@@@@@@@@h8A6.!A4>Գ{뭷l^z"r-9 oO=]}ն&DSo /D(`o5>)jo]{:^mzf;k,.mƌ6bm|p]@S?^Y_== [om.8p`ç=%gwy}ݞG^@@@@@@@@@@@@@@@@ sr@Mnfb-o1cdV2g. ]vA,.-@xmĉ3m4G?wن r|ryRlxVc&lC5ʺwނ)bS4q>@*YMu6lc뮻uܹq\ǔ< <zo?묳*[$jڼ=}vwڇ /p1ի󫯾SN9N:$gӟ|ۢg3j?Cvqٱk]ti$@@@@@@@@@@@@@@@@ |++ؠA㏷_-o@W]uuYgٚk"nQO>>l . 6ؠ]eY}X`1bmaC= X|gUViYϔ>TpI&K/d={#Go 9|p[l2ho/6uTQ@UUpıc~gwv 'X߾}[#)nf_~J|kI@@@@@@@@@@@@@@@@c cr@'tw'xVZiחv b6n8{Glmc=Yg3߷)y5W߿mwyK.>냾 6V]uU*^a]?G}|A{5\pMz768 H6e<64ScrС6x`0@P n~a6m=h}GUPQFuW^ys1kOS}Wn;S /ifW\q-v)؏VLF@@@@@@@@@@@@@@@'@ ٲf:_~`-26iҤĉOz6tS;m6#p_3{g?.b[h|P8o}]{lԩ>p^͞=ۛ(ț3p,3aq>#>}=c駟yf*\olXݾ/~U}Zkӧ 4-(W_?o?zEAex ԩ#!`!C8#/>c5/ӟkeL5wuWڵk 3                FFwFMfF .kVI7lgyqַo_=Ӗ_~VIO#ntΜ9>΅^hw}۾A6b[3M Oʷ)֓O>i_|-6h [}m5} !m͝ηcgzʗEUF_y%\*U aÆو#_~\1}(pk>q/'@6\zte/)0t(꘹s| <QU,b6M0as9>X {o}m饗n3hv >:rH}v.]D                ЪlU~6@7n]r% B{n͘1K>[vqGnO>ٳ[n 'Nho?;v,A2/ A!O_ݯ{+jf 0իWƭ1{GPYf2i{GfΜi_ЦrkkF*1:BFT ѣ~оT8WZi%QΝ;7VHM9_AJ_zbzEAB}`+hnQp\幑 >~xlѶ۶nk.l#%ou]g^{M<"u]}Pr@@@@@@@@@@@@@@@@$@ Ȏ+uϋAqKV_&L0@Omȑۘ1cl֥Kt+kcs)ӤIn N;uC܍ :o ֧3<)W_}7|}SW\ѾogYw ;>8G/ 8Ne"UpQ}. #E୷*T@Ѿ׹K]n|zBAQ= ly:'|*oQ}+j (^PH/J (kmo6ݶIR_q{i[lԾ[u@@@@@@@@@@@@@@@hHA6n!QM)SFmd]t 9s_~ꫯڢ.jG:tu޽aҜ6! sٴi{vIA6pCr޽{]%P@A mƌŏ@] P[[,~-r>K-u),B7ް_װYfU'ne)S@5(u_mৠUO(>yԩXzM!UWzBuMk]v vKTG}Tʀ>G㏋ѣG1X*hM I έ` Rڏ 6mM`mS}G|ɓ'r:JU?x;m˶H3                [ǝ"n:(;m>Q#fg!w}Zk|? (g}>>SOC=d>}G ڐ!Cl7cڨQlh2*{ 6sL$0C/L;wnqitS`7}T6G"%X\ pE { /}z>0g {)8`A>W V}Sڞڤjs|mRFT(<>ڧqȑ6fQZu{;MmK.XcFiA@@@@@@@@@@@@@@@ZT@-h @5l0nm"ԋ/h<(-~~g)(|mMAtI{QUp$Juf͚U(Ps=*Ȝ<>#Lx+Vа_B!8a.fETVQ@1z^xm0*ӽ{چ6{&PUPO>>cQ 0>lS_ !`iWPe^M)xʹ GuDhZ QS;WЩUc?%H~TuIVd׭[bN'@&W^yŷGM~+Wu:V[m5[i|`XAU^tjZt*:*l@_z%{g}׶TV+6mW, s=G;Ύ>h1A               t4Av=N~h<|pd7Z O8sLQAN|g%xQ yܹs/} +T:;qY! AOk׮ #TBPHPw%S8) iN-vSV}.]OΝK5=LNG_nQK `knS. A1]:Gt8CG"NC2bPoPUo tC/!q?ּ#Yp8#%+c`ɼ( ̨ 7aX3Uw@aXUd>UQFULCp\±~hj^Mt)8ih > ӫW}gu*%\bCM<3"               A@a/P3ϴ:&MdGnO_>^)@V2+hU2= s>}! 駟+X%?!Z5.V2-]QdȅM[ʷQp. }K4njXA_~y߆Gg̘a{キs=׿0]mN@@@@@@@@@@@@@@@@h{ ЎvqG2e=#t @jv2+ @:tN̅vn1= !_k\r91K@@@@@@@@@@@@@@@@ tX DK/%\ҶfOL   W`L~껍jީS'' [o=7n͞=ղ,                l]Dh /M8f͚AΝ;f#  oO +`z]tEv%ZkewuW'"               9@ @[nzve7o^ @@r |٫{-{iO= 86h#;O?mtA@@@@@@@@@@@@@@@@0G[{믷o~ؗ_~   Q7͵V Hq,ravUWka~{X5                lys@` [nm̙!4  -!0k7[ׯ%VmOmM6>o5"                @ V@gtT4iw}ۇ~Q)7  u9Ӭӧʗ^zi0a]{v7ڠAlĉu&+G@@@@@@@@@@@@@@@ZB@-6@(0|p뮻lƌ6rH/Nd@@j"@{uZյJn;{m7vuW{Z5Ml@@@@@@@@@@@@@@@F@,Xs5mڴi"` I  P ~j^K,a_nɓ'۠Akid}@@@@@@@@@@@@@@@@ sT+лwo2e=Ǝkg}vdy@@V`֬2-Ҟz)zmwvz0>                &&vD} îjo~cƍA\>Yr  @ ̜iַo n7袋E]d~=6h ?~| M!                :?F*:udsM4:t=#U@@ ٯ_63f=䓶;nf[mk;@@@@@@@@@@@@@@@څ n$}ѣGۣ>j+9N97o^9@@@1{R -{v]w?o]|-,@@@@@@@@@@@@@@@@l PGe]&Mdzxf̘Q-j@@ڟY_r9ҵg?~6vX{Wx@@@@@@@@@@@@@@@@U٪l:u?~a={v_   PB`oFv@q=O{^u[s5γBPBQ                @ 2TX}mڴi>(qlu׵LB@@ (dϞfK.1=n>zvaنnh/B                 АlB@@ݺuO<qҥ:v1؜9sB@@2 ٷod ,`oO>lgq͛7M@@@@@@@@@@@@@@@hdA6!m V_}u:uuYvy٠AC@@J(d~%&tQk{5ʞ~(A@@@@@@@@@@@@@@@@H{ @YΝ;`>޲v&lbپx6@@@@@@@@@@@@@@@@ dQ!r-gǏSڻkk~b@@6/0sY߾m>5A{A rذac|;@@@@@@@@@@@@@@@hN@ 1R`ֳz;<vg_|ѐ%Q  YfvtbGqM>Yd W͝;me"               @ d}$-йsgw}mƌo Y(:6G@kln篼v]w;묳lС6mڴc:                PAք @k |;߱N:ɞy~`ᄏ 2&Nؚb  Yl_t`N'xzmF#` mM6itF_9ƬO>v 7C]t3&;j%>hIY{;~_dܹskG}Ԟ|I?mW6] ͞= 2Į&uN9ѣGL}n2MY,ߩS'[xmȑ>",R2m6i$裏$l2O?m\pAqjN<8}6Yfs6X}ꫦꪫڰa|d|YgirJ6lc3f̰s=7fp@i?^~&˭J|_r%>?]vņ}O>W_Famݺu+{'o]wݏ{gLv}nرz59t>JK+USmz[Jw޽m5״'{}59t-п0fr[~c2Ք-+/eWMP/Mf_PYEYӖO?}OuǬVk:Fܗ#<Ҵoԩ^8W߸^wSknRDq%T. uMrdMNCѾS}aUsuNc_|a]w=#<ڀ>9^?,T9 ^u[.˝+iiҒ=6Nuwi5K6V=dCKsI\zR?ŋyϡK/o>C+(ֲګ=9c٥^ZjR_}s9v7{'Զ9% ԋsof\<4j 6Kչ묳ox_\}owN)gK7Ys-j}(uծ~gk;TOΚ5+vm7S /KWw_C顯kx |WTu;~3?O?ߋ}Ѿ==6F.M^(y ~gofj[o.*v7?Mݑl+3 ru`a~lh[q_Ms;#5mxrF+Ӫ=+$/qgdtlk5ׅ!.v)wN/еiҶ']kJ3\~ƫYׄZq\z},^?|yzKor1:Sy\0dB >m|m~e*K,ЪʝT]y\1͹Rrx1uP;ζvc*.u^RK-j_k)]#C]{ >}_e)s쓴eԽr@ں6/j]whiGygg &bI둼w|9,}WZMxw;7g9&x Luܦk5N(uYBYymK>w-QG4}fK[χ5Tj_;沴)]E\C[v_VI^k^[WiaqӖ<׭bTq-|H0d,׆f6c􅾮VtA~[aT^|vAd*IH}|/_~Yp/i*w.|+o\l䩛܋hoSg.P]~|@x^߽[Ϛ!|I+7Yʁܺc'aHUT~{.rW}R[<B_R]rv%+5jй졇*@8x׽ǻ@?υ#o}sIX.m=sO-CPwk^ԹPJJ4>$s~8_h^+B;ctlv 鷧k^V]lP~R:v;ATp8Lvi=Iaӹ8/Ny=ꨣ4A{amsN[}Źz鱉p˝_jUMۺuʳQvږ.lEmWȾ8޽AW9u! jnn)SԦʋ.;]tQ_<~ۡ e vn}LE(Χs]y߰uG?odzW6b뗼|{=lhqjˍjG,FO[Òm٬5y(겴'kuCB-}#,e.>RF' e#kYw(iGy)͡ ۊѵetܪ-q~:螋VOmh;JCL ˲_r.GDiGùB>})Ͻm(o[ꗵ=Tne=?e9沴)PʕAMKj&z\kmt;Ҕ< ^]YG\ʡ\ݮixQBxHcpæn. d{i-J,?(w5k_R'RrYMO<ϊd-גmuE%-vڑڱs !!K-'5ۤI| B+F _ ɤu*lW[p/tN\ţ K* FNS_(LNdw^Kz7GgnL+@ƕ'?;N}6PN@ye qa]ʛ&&;Bg}+e)إwNLR]Bkر>I 3*Gk!d.Lv 3bĈi1cߦS9Q%EP&]w/xNQGK>/w`Op_u]W|0lCTZp?xd3vӴlV+mS/ W_FzQ@isOj4g{׋zt^)*ͺ:PSݢ+äB|,%婳?_i^i;4 l&[X}^{O8iZ(kݤeH#~*௺02,&W-7Yˁ6vIJ ާ#G!q(Jyr-ѩӒ52=9-uhiEFZuYe}mjuO0EgK'9>&Yʖå^zɗ=ͣO2ne\3dj[*uq/׋x =.V]uUUj (_~yyU8J_,JNSWYջNOutrZ-}O=z.>tmԲF*(p{%z#@qBKv:^v*ѲtuՖjT:Ӕ޴e.>SF'M]u֙}^]ۊiY8#`:'a*ge9{ӴݴtPU4_ܩK/.@ ~ؽj.pv{9c.ƫ_jZ84\nҴRНx6l05\ q?c'K9t$nRfmf+Uwٳgi mZ3.M6$}_@ryW+l!m{+WԴ\v@S7_~LĴTR-Ϲ$O=~5yJeMLRd=\sۊSqDʏ YCoo.xSq\sBn qQj.dx뭷W]*x\ؗ`HDiZ}!l''K_Lw^$Դj~6psm됞Яu_vҢ}XIbug}\X{衇\hzXGIu jvXqӟ|/Ogyy+O_ n 9MLmY]m .gúu/9 '|\h4xx[a8n#q՜:B\#Lzɲ~eCiz_uTrS-9Z[G(C|󖛖~Ad9h gy' 4t/J ׸kHuB{uG ]rZS#%:C?$55;_S.’~r:i ZorLKstWQj~'ttVRyWnݥZ1 ;%P-e%xuHJ'KyKN ͵򖙐WHk0q׵6¶4 󨟜S)Ֆq~MҰ~Re8xJu_zKi,/!__ w7ov^)L~ȯvҖ2HsoS׸U2]Q~HkkI-193⛵=_ifm[*Z_Ƈ4UjsoyΟJg|ڶ֣.>?$8_@@@@@! @ E.,KCW^yx6fsDhW]uUD:DH/_;rJ_[ncs|i_L-zq}G~nvmMq>ң5~v2q JtsowZ̙3ko)S>J r!øriW@uz5m쮻:Qm(f ·qK,D1ĉVCO/3~c+k8ΪgT裏ǖϪ<+ "cퟸpiyMﺦ/MZvrTJKrݚSӜtyVJ%Ӓ5!mSiZK=%\륓O>O 5\JӚ^֍@neI/*ҴR Kԓa{_cM&+P_kM-NS}N׿ wq^j(Хи !5X#]r8M[mݑ̔L`Α՞)W^lMNevYiyl.aUVM~jQ:J5_jZyړyې}#=^zuu52mQ{QVg_R.νtP?~:߇%0T ~?Ci|:[p\Ws;R+M ˫{i8f?'9/9-q^x=׸ i wk [S\U'}OMO\w;T泶4e*M+Qnzoa|~c2/suǮW_ԪE[ \J7 0\?˽rկT0M\O!< \OO -oή^)rb<,0O5=k%OK\Gq^n0>ԑpnMZO!Y!_iɻ[R6 z$}ϫre65~reB˶띐ז Jۯ1 JҴRԲLu~vV-FZVҞqsrOB?5_6g-[p9,Unz[7@@@@@Z |s翖kd] @ӧ8^FN8E/+`wrCrh[uYǿ<~? /_halv󿂮L6v}wS?t ʨ z9TdĈ>PEnv[ox  ˘ (:'{mm1w=|!S`o0evuFVx0/}h*@AѴDMק_q<0:+`unu(^U:RO~RR\XOƕK)7M\~`< 2kJo +`W_}˷)È@QK~ryxZ^{+nQʽPWq?sTSitkjӤǎkx%R(Guz\ʟh.GmӲZ<ةiȷ^ZOv 2у!|r{2_԰~)}&_Q~Rg}Q X^qiKB d>PrG.ƅ~ia_n Qu>W?|=̓\ɻ^-fݕ´G}'C[nIR]ZܸYgI?n-&*ag*Mf5nq[wJ4RB\P<* ب@3{W\q0$lT4C -ч0ku1M۴ouG2򐧟].]<_yYW*7~FN[wDhTjY湎VnZ^jSMx(U>oՕ~Aw7[߸]6N:8Ԫt @[p\@{*ق{^l-̞=-g#P&'mF{@_>ޥ^p Zoԩ~ڂ^܋{Ѹ^@*˹,~ .p wf|C{ lHATwq=nɯ/{Ww8{8 w߽^4ƃi7S@kn_[^. K.dk,O>)@t]*6Y:%K^˹Yyt՗]=l׫gW.`-6qLs5}+JotuiŰ\{O\j{.HpXWS(> =1lQ*s֨ӛ;C-oڶNz_KӮRP6T۷dy-WgMS_m2PJ*+ ~!u4x.յZkG*3q[wm-3?zc;m+nC뚽uw.7Y뎬״\Ge-7-VM~BBa-[LXwO{2iiO y-n+uY:!uu9jy:UB{DiE0w?S|EHmI\=L_8̨kG`L /,xo~0g9iJyύnWf%u ]%0Ojg"t~L}6 X8ΰ͖:^KѪU~]}Zke.ZcTSFRֲ> #コڊY<+S_|/,Ǥq8 ~X7xcOUUt]],ܳ3&ԪR[O,>46T{?\*oe)ijOYor͵)3gzEme ۯvk;JjL+q5OUsu{s.Muh?sl?+_͕0~ u|~k imުNL̻oT/ټYD86zQ,C;,=Z;fA8Bs Lu{{W9-oh6wávǛQ`Po{/뱇R1{6 tR 8k+\sM?騣2ij:R^R(g{ue-PTZ۽`~d8_7E0|ɼJKfR@2 :G螄Go?0t@gMJم4CֺQv dksORVzy%Yg"n~.ﻗ}_JuL]>w~=6f?ZTgԋy $۷z-sm„ 6bĈ&Iv_| uUg_Ҙ5r^ Ҵ5_u bC uj.q/͙ Y'Vd. _7tNewaO?m7x_4]#KIri;e=GvG=rin|FOSwr\K:J۪Wխ[9Һ_=vYjm(Z^Wbg/P6c&j_)!q?{~ ?a\}\Iu7t>:.MݮQ~r繖Õo@ދT&\A OѺGZ%]'ՖQ;mzkUw(y])i6^944OcR9J[sߐu_2ۍ-WY[oo[-4/KtK淖߳Z;g;R;e&OsT뚥|G%ϴhnw?{wG)o7jԨ:KOiSHKsu=_siLNZ'fiVo'rZ&rvS.͍c:LYPykYިGYJsZ,ڜZ?Kv~že     113DÆ 3SP8.7_d͹jCC .ӼA@ҷ>r;P^,|@G gyf̘aGy7lK.{'8pEѧv߷3xDҬzCR_pEr-.O/Ԅ=>}ֽ{w?@GX0)tί3WӋ׿L ׹?kwy@_zZ /k5BP@!E/71e<)OG!ҩjgq[Ç^\AGR:i{z`2`N0ݯUW&Dp]/5YO $ z!(yhC_/ ¸ZX)ȼ:tUЪr]w28T<U@𩧞O.;\MuY)ȌBYRgeZסӟzli? U?KݤF#jQ֭St/nܹ%xPWYe#x;U՜랇^>裋mӏV=S g)VXԍkAV[meWKuy%ROi<7ףvzeVpow]y^^:t?w+.WK,|BhoΗɜ#J)Icuz^i-^4uv+dKu,ߔ^.L6 +aGnH\Cqio5uG2&iIvr.rzjˍ֟PiI:W3=[-S:,Gt O{2O׿u9vg/ǦrOR{Le˗w}MLL>}VQؿyݮQ:NKū=]*~l!ϼ矼ǫC9Yg8٩َIog>EM]5Fq0p@#_L,?J0~RzviӪ։Yځd>EUzJ~ijDNkZ;.cdMKs LeKq{.kd_e)+WZW\e9VjsVj}̒/Y]5x= #     dY? qS03g7m-yvO2@kL:f%%0QfgzU=Ę0AsE k[n>qE[^9rM>vyg*wiJ|p@/!@e%M}hc 7Ag?m>URo| x6@>S@'=(:ԋ`6J:=4:a„ZtQ/)y:PB])d:,KYѣGZA7z[mnjcuQL2eiaĽW\qEݻ zM-V;7 G?!S_i1HJu*Ӧ}>,5m>xtՔz4innx7*թR>A޴vK+g>6iPAT" ("*6"( rbobW,+,X@RDTQ@DAxOldl瓝3ߙ9sMmBvP_?\N_0Yҥz^n͛n[#պQۨ+Vvٷ~jqS[:te{FR3[\HAz/]B:ctozvՋ.{TL1* 9),Lx%ӶY dO>dTںի̢%bQjwuYvDd$S[wz$S^͓6b:=$;獶L_%ϟQɜ7ꖉD=^&tړi^{mJuda_'lUB' bw,Yb}YxrƆq?Jޘ*Ċ=zT^X '^7ntw,@61D$s4eFݡ2-QSx:\~wpD]-jkj6B_.o)|;[ Ю$o5?._a?__QA\y}Z;yɶ=g2Qtd5֕ pTnH5|7)d°.k*é9~+ySmf؄ZL^˛pD~(;bm}o3Ud_˔l?!œ1{f&\-\I~%L^?Z_~dۜ8nٺ_x]ax@@@@@ AfCu"@?wnǏwzk뮻죏>r[M6z(O;$zB|Vnؿ/B7c'=Q)ԩMj*7Gazp{ȏ 5ʞJhsqRyA!~SK_l_V-j;yg;؋/ooVYfcoF۷a}yb/o~?;QFYaʤu* aРAnwyr-~SWۮjcƌguΨG' 쳏{/\ e,$~|VիW:|~5yjӫ+:Mի~PB/oOœ+d8Sg{~ٰAa/^TбU_nLYA믦AA&v~$Z>4/޺c7^veqs~p?ݲ$$.h]~uR˗SO=0j)26@9v~㝗y .hm ?u[7}}}B( [fRǖ3v~ҹSOj~_}?{oM ĖU]aڈv~x^u/2}/ys#״龎JIL- /:,|x85~Y9~A:Ipߟg_-'Ӱ_6v|:= }Jf-ZgaU7sͳ;͛77}\]gO o-H%ZwDp*_G8.qOuPxɔ)<d}S>{c=ֽU׫?&}O'hu'Ʊ]{j~ɖ'|٨;TTGo2t~D~}>Gͯ߉_k]񎿦=]ߒ+OxtB?D}h/JyKV>1I2䷣u%4w~ϯjmv.m{Τ[3麦r~w>7.YO-[X}.k菏':N c+?_~\}__Pj;0c tT_㫌_9l.KY{O<ӎ:)*S*]:!2}Nat^s77&{u׏7:]~dۜ:n?揽5.ܥs/0     uΌu'A%ՑGc*2G/G"% sˡ/rt#GºqAHG$K lǍ (].TtNocdٲe8m7DW ,+@HժU##?ݤ -3`nW_uN;4t־}HҜDm.@-]TV{S{'_%S/{]辮p vI&Esdu=N_Nvϳ}RqVR5+:=Nm]TK]>:|_&}Euv?2e /ʨk1(?:a?96ϳ^n^ӇtTt=g]%ًN?M:uʗkt^Grބ4mt'alҹO2{ _ԷC qu^WJKuuAvtH+=.c_{[w^$eCdIޏTT_Qv T^_cxoG%yGݴso5w ~3~k(11IU kYwW>괝pSGx=gZ ~*N;EL^$5F~{ڮߑGFg-yS%>=9VSKKK5s&6]s0v_vEZ8y ѤsΦ_I2z'W,};,ij TktTӹgz˨iZ:5f=:w$֓N]36g:-SOY_?h[t     @.o21JV%T`֬YK.ą GuTDpWBwb#P(/`#[Gzٳg$W_}]>?\^=lԠA#r aJ P hڮQPO<fx@_Vbi<Һ }"/j#u/h9 _ru36`DT`mU R[GajN_\jh?]a{j'(t'Ľ> "՞Pu +lժ;74 r-;aN<A*_TJ ^8TTCr*[-%R}876<җI@i&ҫW/zb xxY_rUʮy{gD5jDn={۞jG}oI_~76;>ڎ/#llnV]v4 T_,TΕiӦEw_m^7n9(iӦ.l.:c̀:Ú5k.sS[׋/,VN=nx^Z6YvyA_T^o'`P_? ʢ 2 tL+~uE]X(@?X]KYur5ˬ4k6rqFqVa5ix~?oӭ_}_]/ΫDu_L=o9]wA~#U/h>/)#SO=5@u%t}@c/>b_Dե[t92;Pp&_u=uT谾/yfsEi*ێJ^ l=}wMto5j3e֗q20ov?9߾pPR]۪۵kڥ1"Ll]^LP jN{pHjƌ;, ݷ/̨\{×A }YyRq裏6ӾdN^L鴭(}~O]ksPWu^x{;^)W}]'%>׈^;RvH"/枓lݑ{s&ۈ#ًNy)#<״JV~6vRLl?Q_{/~ܧǾ_j{R&Sƻ>Y{Z_:.Kuu{^5a讥lR9+-;ۦNVij~j;Q[yޜ_j^|ő_~Eu]IL8{jݟݒR{{ EDϾ${Φ?s"W_el;,{vkqL5Dd*:Q?v_.z8SiLjtcrޯLuQ:O?6Sq3*=/     PTw{5Æedu(-6f 4arǂWdJv=HV믿ZA >d?7LOd 0gAlzFcm-Є'?vZS T`M[x* ,}~m?|X݂/XJouG@#i@ף,? nWV'h"[q͍-ynɂ -|݂Au~Q@IDATOdt2Y.YĝQ&m_K. Ȃ03/+ȓ]@@@@@@@@@@@@@@@@ /E® 9)P^=lܹ~g :uXnlذavڜ,;B@(Ax [rQ2VʦMڤIkoѽ./ʘ                @ k4hk3)bUTN8N=T;|yrz(W\qn>.O?epG|}6y +W֬1׶,Z}+cӦM6x`?G?m4kٲe9           ];}n#    I $!z뭭gϞ0Cs=gzժU˅Cjz֭3Yօ@4jt@Pa6lX) V[\( @QQ(ب4Ρ Ⱥu؍7rsMt|PYge'|r-v=غuW^VB{Fַo_kРA3 @@@@@@@@@@ !;biE@@@@2+P.tZePL(kgv/͟?5jd=zp7.ko)>L̵BJ1y?p駛oDG1}]~6b߿8pM0.R8+sb!               P*ʗʽb@*{ڍ7h~M<ٺtbO<5iZje~-XF@ȖEfek7 Rm'Nh+VnݺY nGyZha}Q&7ɺ@@@@@@@@@@@@@@@@ ̱Bq@/=c/ǛyV~}7  @Pdݺezmʔ)6x`=z ׯ)(.V^]"#               @AA$t@ʗ/ot=裶d{Yfv뭷.B!8y@@6m2{zl7]r駟ns̱/ dsε;φ ƍKw,               9*@d'PbE;#'tov7P6mmc[q  O ,Grv 7ٳ]vZFl]wC=9[reIEʎ               ! C "%IRJֹsgu YӬbżyVN>d뮳 ;`F&MثZw=@@@@@@@@@@@@@@@@ ]{4lXz@2)0k,ИiӦٶnkGy}֥K^z&7Ǻp?hvy1.51ìSボRƼxeW{<@mkVYfmhfY߾fдJ⯇)%OvO> \l)(﷝vک%F@@@@@@@@@@@@@@@ Y>e[`6j( M06md۷w c=6{1ENשcOf_B.l0ʖG:mr Sy*\9O=]xayyV ߿7.l[n=C֣Gs               eD AS`7@2*Pn]ׯ/?ojղX I&v|`6l(Jv&Duf+)1C:Llu @i(-GȤ@,שui[o7<åCE6vX{׬f͚rJٳu5@@@@@@@@@@@@@@@@ CD@ lvֽ{wPQGeF;Z q ^~-b N &2T%vݬuDs0 ʢGY}z? \<͛5l ;t @(Ǟ=/жmiȋ/N<SK@JKl…vgڵk]M6hѢ|wk.]O?tF"               @̾1[@J@ O2cǎe˖СCm=Zjek׶:^y[reW ]=*1n=8@X' ȍ<jfͲߦNj{챇 0"Ht'Md ˗ۉ'GqN                @6K(w{ÆrE, }|oѣmʔ)V|yk$yѲeK+W\ ,-$[͚}ePp W@}lcvmzV٢Ef4Ɣ_8 ^N&MXӦMm.RmK/㎲Þ"               #s@ (uvu٤Ilҥ6dmlРAnZZO>6tPBSvfX~} AbE Γx? #`V~m.{E2eoLnlɒ%vWO?dZr>R"6m;FUc@@@@@@@@@@@@@@@Y\$2U^ӰaZ#A(L>~m{뭷\PfyGapUT$e.}oqV`ŋj8@XXu7u' 8Xluɾ0^J7mwl:#@@@@@@@@@@@@@@@@ ;峳Z֊ P(ӪU+>_^~ekӦKֱcG^}ٳ2WwFѮ|iۖ( W#. ʨHk@!nWZ֯_o)}ڵv1_3                - %z@m{Cټy;pa4\s5nիggy/Det 첋Af ]~> _# Sʦ-;gH[o9sF$t6l?|2 @@@@@@@@@@@@@@@!P.tZqiذL vL2ƌc}'.Ev衇ZNCVJNQf逸:l& @͖.5^>;(J,0T͆ )NB`ֲ̙e˸!Dzs@@@@@@@@@@@@@@@ȰAeu XjM0B*򫯾 *B! ~qKᅴYj;fq"@I(iGf[3Zm&ƍE_=X9rdoƍ–[ni} c"               N|gi@2+Z׮]mРA6k,A6x`Сm֥K8pM66mڔB Tj{Mr(e쀲;hU֬Ycׯ 6} op\d@T*UZ炈*V-ҪT6۸`vWnC+T~/ [r{j*WhWn믿Luֹu}Ug$D[5bſaf+Ud[l^ j+z7{Q~x3=ky: #l2[`{|wd8CTu{eŊ̓wHp.pwuOT߮jᄏ{ԩS{caV)Yvܹ6a7n3ƵU:X݉'hÇw}z^}ړ:wU>z?vʦv 龞W+WpW]}]^@@@@@@@@@@@@@@@L )Iփ P %9s?||rSA}^ vKrФBz/^l?~xX `),& h4RyM[ڐ!3 wH#(pR!D>R!CNH=첋ծ]jժO`dX 0ץK9΅GCח57vZip-A MT}>+ҴgmegipN'}2} S~(Vݓb5jpAdY2 (D//5_0=o5~{m8QR8N׌k'hk={=H϶pBwkVׯo͛7-ZDdR.Nyǜ9sܹHU_9UOu}x/vp8 ~ړd^u~{A}^~t               '@d~*C( m>} T8ĉmʕ.cǎAA@{] ^xƌct!0 (̝;=͛g ,pNP JT(4QBpװ2&Oi,W/áx)nݺGÆ MF{ႋea-Y$zs_}]GlpmVC¡V+LaaEe( AS@{~XA><3,w9uu]51c;tLĨGӦM]0A鞔jda|Rݠ?>0J=4Nλ:؁N\:V@uÏtCuVS;P<{ Vza 4p~=|Kc^ǾE؇TpSxzzԬYJ               P,[ǛEʔB>s{?t!. ;AG TS*A6}GyĪUf>r)檐9}6k,ꫯcҥL Q|ׯwm7C35jHiߋmG3˅#)$IX>ou >RBn ңYf֢E s=MtڵkݹW/^-r ER@(~8tP׾GzeO@!>VaaPN?O?EC֯_-L*U\@Bի'â+f + 5j{|gVBkٲ Yl߾~..+OcjGL6FRhTot͎>h;CEN6NP=v]E.\jY8n!>0=@(WeN`C!UNu^W뮮W_ڠ}:sLj5!              "@d ʁ uC*I| m.8aÆ.WCA "ˮO? .O_׮]]%Z!o顐H7 ӧvae2@:gk׵po̙_WOzAt^mo`OWٲeѝi\ߨQ#kXR:@@@@@@@@@@@@@@@'@d;f@ C `1c 0a 短J*[C Qo c8/_n&K2 V~G6i$5kmڴvygVVZYͭ~V\9.k׮ʾ PN +OM6mpEKRWXu> vU:{Mk׮Bcu/) lذA*Raa UxX(L 0V@6mꂂ -!Cl' ^zI'd[.shi9"N;4۷ ̡U/tPի~(\>>.} Zϟph= ~NkCzmHӷgI@@@@@@@@@@@@@@@(, e PbfϞ!'N!UR%`Hp SO@|gJ0_~1c{gǏ7}Dž *Ru&X Z`ƍ.OA` Rp0N:afڵ3ѕ=}.*+=vi #z^ _?;=.ϯG >Fa/uZ.]쨣:ȶv[?;R"pB{wl6vX[f 9Nr@)2gΜi~}Gc&M>B%Qvvɒ%.xԩǧ~j Uq˖-}֮];ׯYfڷV? 08_{HB}wꫯvAs}oL+w„ ʕ+g52{ѦMwj {:<i ߺ]A (U@ڵkF֡C@Z9ֆX@@@@@@@@@@@@@@@ % Sbf@,afm쯿JAap6m;.r{mȐ!`{wlѕ?cƌW^yFi 9\($A}.̝;qo˖-v{*(}ݗ>. ~O4>cn:kܸr!oJ,ӧO7Ξ=.bꪫjժ%sgXj :믿wmgyfX|Vs?*Qa LCjժ_!2I(?w!>zҥN;YN?ԩژ@@@@@@@@@@@@@@@  Qc@2)0uTWX,),sαSO=՚6mG/ }w矷^{͝3r͍cڵ6vX{뭷c;Al YJ9suׯo QFN$jӦMvumfw9Yy?7n=z)bx) ̟?^|E{gM +WwF!              $ 2!@H,>[}ֿ+jժb*) (/{.B-WRܵb}ҤIv]w٫j-[tױ¿UVlebF'~iEX@$CYVl-3f-B$FV6mjo 6^z%w).uɓ'af:t+ĉ>s=9Yxmŋ{uuYK.K|gXzujժeF"2 W\q TpG}-ٳg 'N }!25JF:vh?}wvQG@սmà               X >LE@`3uifo{=kذf1L .tEֶm[{2Rzaڵ:u_mCuv1rH@ɧ~)vĈ.p=닭\p |lm-r |ֹsgWŲk֬/s?W^y@lR$0[oB*hW^vAW@@@@@@@@@@@@@@@ 2" B̦LbguV ,X.\hGh"OW^˗G2M]K}w0TlM\w*hޑ#GZV줓NS&ȦmvO#N,Wѣ{s@@@@@@@@@@@@@@@2#@d9( @aM~akҤIaV.+*hSNqNٳݣbŊ9^ڿwEY׮].EQAf}Gָqlm8)sI8_&ֿl[BcTcTIzl;B0-"g{mp O70[- 37xnڅ=Wu&;gkÆ z CS}5w\ME=$=vJ{;m^궒QF6qDܧOda@@@@@@@@@@@@@@@L}A`e'@J‘ڶmk={,m$v5-Dד߸0PjUӣ$u 9s`TltCoNLW^drn>+H-05pr)yBkN2dsl?yչsgk]S^ mY۾~m;b>VfM;ꨣ>묳#<ZәZgz~W{q;XWVͶnbٶ6KVL ɶٞI^vYNuk_zda@@@@@@@@@@@@@@@ T,{" PH+V믿n/b!ה {gm͛=B.""?[֭+.^؞x 2em6뮻S+VXСC~^zi(owgyթSBƎ?7ԪUvm7κvjW^y%ɏ?ع\~6ydwljԨv}w0ꫯ#YwZVӼ˹kݺum͚5n}o 2$:O>{ξ[yv'Gt3fi@e:c\vWuـk5yMag}+g}f/Ftb>͞=LAx>6l`ʕ=zXy/tQ]A穛)gܸqn S<~Smm޽{s>hK/~Wf՛'S}W-XZje˖-sY| >&LBQw_W?oK:}Z6m Cpq.2y+OG}wsT.Q})-}O>dVvkܹs}YYkYT/~9s;u}Ļ]]7Own\p\$Z͉:u= j9"n T[~^|'*^d[J^G&q=z1µ{ hzsҰB$tz͏1z5 :OL?%9ZW^yojGx}vGX~G] %joޥoOwרߺ /ڟڵ*Ͻ([}vkokZǶ{U]-_kY&             ͒0@IDAT @"=@(MA0K$YG~"ۭcFp?ƍGHJ"A+u]رc? M4s9jժE0HDM7~7.an>e˖ ͕I_InGn]Zqׯ_$U L/;F`<7; µO/Lzn 2ԹAP$qw2=C-"EH}=芲<#Drv;>K,ə2f͚r\f͊pn\iڴi$Yuי y0<-F=踂S߹uuYn 1SFȢEܸ |2{Dt>}G:-׹Y~}dvppZwmNQJs;huu 7]reH.iذa$6LsA-ӧ4.oA^-H| "^xa$u 8 ΕOTkT mOe"7sB6:+Wf|W붫{5u{?9ȗ_~nuO}M]A|_ʠ'5!vza Bo ˪z2 6 F0M:2{ -SOEwGdAy=@+KtG P@^z$!N:E[T~mEM(>믿mYz9t%]gjA{\Hoio'slUd,@@@@@@@@@@@@@@(I 3ɺ@rEgqa]E]+*(E!q Q Qa8IJGua馛E>ꨣ `* Ň~mh=쳏 " 3q }Sڵkٴi] AӾhu=Dիw}EۍS: }{P9=sG>Pq޼y w>͇2;Ve=믻ѹR{̅暁A*/{w?pEVƅ3hiaՌZL4-ySbzgꏶm׬Y3:.-F.ΏK^P_;*A[n<4hFIej_[)N7_i =z/B4hwމS}#sTGJa$AC+VHaϒ^ޕLx)Y6h wO]?}D GƍsPP[o=E*b͛iSNTݻwp ^O(xZ@GAK0qDw:wݝ#G\?"${@2fq#˗/wiضbxIslzP8I!ɿۅ |i2n%N&sݗnjSEa               @ T M  f ,-"@!&Z*{3Zzի-իgA]wu,ڀ_Λ@ӦM|n ] `;J*nZ*e~ZF,g}fΜݿJ pnJf͢snX]r,g">ZnmAQn/ƽkvZ B³Xi|!z֧Ow,'AxseyKի۪U5Ke뭷vu5^nҥK;ւW lڴiFdS)SXHhÇ?܏vnUVͦOƫQݢz@ׂLu~ A>fߗQσ`Kg`Ȑ!Ftdz_J*_l]v6p@ Mty-[Q7x/8cuù]|1 ǼE\O{.,tj׮;U˅^OAś\,cڷoo-Z !=-H< t9VR B-=nݺY:3?I&s*y':n~:]]n}v Ov?.^^q[gY6               PA` 9/|֮]"+`PBmΞ=3u@>`>˗/w6NAs^Խ{wd߆ +Wts*TH{vO<,MR/ۯЫ׋/#F;TLؿƶfϰW CM+'NT :6m%\rŜu]BWlEL-BFBkժiӦyȂ c??GrСN-H"g}w>t_oϏ=\sl?,Slڵ-[VZ$9CGc< Сf̘aÆm۶^[Xbhk蘙y,<)}iL[h}NM\ב[]ڸ̧d[@@@@@@@@@@@@@@Hin# ˗wa%|IX45G:x ޠ]NRڵ]HPNܹwu ~~b|)&c1յj*w8222_|f͚ R S̙T?DpQԇcǎiѺS aSso{Ǐv]HC,K.:|}YH,\{G5ҨQ+X-Xm޹sgI9t\ܹscƼkԩn΂_cZ))כ;wn=Cn fAw}u[ 5;}l\oTxmITTIӳ~!u&4 ۲e6ni5]z.DrÆ QʷݻwrQ'O,jժQ\eXp?ƅOHemϗ/,s}Nb$'O?v~j׮]1\Ђb<-?! u sBMM\ˀ\ultR@@@@@@@@@@@@@@@p 2mA[=zȂ lhj\?@)O?- |'ex'Vւ8yw.{ܙ3gٮxXh9:qmzo2WUOr|gsmN@@@@@@@@@@@@@@@@"@y睺]ڑ#GpŅ{nWȆ (w;v6mw}W]vUN4h wQN&fKݺu6!$klٲ]oCb\ؚM:T+W3m4:t}9 zW]N|[ ASCۻgw?t[?^_|gy_`&L1&MԩSU@gbWI]xz>}Ϥ+m!&Mr~/A)?14L] }7nhA]vЃ> B ?3x-B,pʂ -aÆ8pׯe˪f͚Q냍MXYm6M81h5.s=3g[NÇ׏?Ç7tr>sW.7n~7.9SLN8Z9u].b&Xad>2c;?y}ܞƍpn>I;v螏迵 7!+"!P-`,/?P^{,2)C d!ؚWvy\+rς[v蒐$9K3Zol68kڳTre˗hso%e:/{76Vq3!nl~pl{RʅNT[@@@@@@@@@@@@@@+rO]@V@Ң7|sĉIE/,@ƌzk`׮]:͛evNҥ^~ڵ/h'y@fOA_I}w^{!/p}ڵsr/d7`yLK\IB+7g8:c;慓O^wl,$eϻF~6g5\ٽGg[ܢy̙Qޭzߎ͕1AI xk#                d]^O}3Ō(Q a'Sz4rHyA)F½09yAm> Y[@$k={dϟ?XGc .xzHPyAVEɰx9r>{!mڽp98pz;{Պ+ *E ;yV.bFC4(L+T4 hR W ,my!Xϩu֩|Qc//NyAn|򂲂=\Džm۶1 ɔB E6Ǣ deIV5fZ|lӪU+ݾ}_Rݻ3`CUt&7/mM%)V_%/84?wd&ɜb.^0>͟??ޒXcvvm֭^~eʕ+|Ŵ$srѣG-[6%K~.dKols +62!u%98 ./>@@@@@@@@@@@@@@@ M&n#@HN lٲ˧cǺ@BӧƏg6}89/CuyJ묆x.2~W_uX5j>5mT~iph`5‚B-H[hf XƷ({o=J(lHcN8d=駟\oSuwZ_@@@@@@@@@@@@@@RN $]!5#3/܅uIժUӀ\P ^,+Vg;g޽{e[nj5?Tƍ] ԝwީ-[cCS[n1bz_|mZpM7nVo$(vJ޼y]f|x5 1]\.ǎSJtA\JC / :y΍.طo}] 4Hsչsg%K[vmZfI+˅7|S/ UW] NM:UO.\aÆ={jժqƩhѢQ,ł?C,?.Ղ!^ϟ?4@ &MzK3gT6m\Pk,               q " uԭ[7}.HW^Qdddץ=*[C|~ } ̙3gX%_}y]օ ʖ-[)쟧\{ァ]͛7wA|-ZpY,%@ J7߿?ʵNK[jԨQ.vŊua;_~e+|>Oe˖5qDeɒqcg:ur]vY]@@@@@@@@@@@@@@@G q@t wgՒ%KԾ}{SիWO=-pI;V~~ӧJ*UQ'4c :TǏw&Vw뭷nˀPn(i&M0AGܹsUtiq.Xlٲ(mz]XeE? 6L]tq!fz$Oɓ}` po{j׮DC56nO?3-\PUV=ܣ[l8;               @ 7f!^JU~}=j۶dɒz;E˓E`Ν.pȐ!N:SdddO%Ç5qD5J|,SV\(daB Xh dy6-[LŋM7ݤ;kIuV?ڵk' 3fʕ+ >vz衷~aj Rܽ{,֟~I vqmڴQFMM-BRǍK,;SժUKP               Lw>!A[.8%o޼[W!pq6l0M4I_|>=#*Zhx42B!- r„ :u PMp tCӡ\R3fӧZZloQ5kLU1u֩}Zf㈈NX4{{}vۢ>n޼Ycǎu9s)S&5l7nXUTI{#6kc~ށvءK/Tz뭷ꫯO@               nL7"]O>ѪUTR%uAr.j'?p) :x4i -H-s):I,YB;͛7OǎSŊ](5\:u(2229@ŋ,o֬Yڳg *FWfTxTٿm㴅@k.lꪫ$]w^zwsDid.oʔ).u۶m*P-X0pz\(*i궧lٲōgvo9r~.UVۤ"              @J Rԋ ..\#F͛7`֭[e˖.pXXHԩS5ydY?֪UK۷WǎUH4سG03f~Iv`kV5TfM<]N׬YY6WvѢE.hѢ.΂,rʐ!Cw)QڷtR=裚;w q`r%Ji#G護R={vy=ۇ+W̙3e!z'O`W_} ,oY@rػZ;qFe͚ս4lP7[1@@@@@@@@@@@@@@@ 2i})@,pXƏJ&;wn]{jҤ aMVHXV V˘1,d?o&,Y2'OtJӂ ܺn:u%TZ5^q|򊈈/g@ Xh;rlٲR,Yܳjvdg`Jƍ3<]:uRUjdoTپ}ߖ=7O=z衜9sS3-^g9s渹tvtҺ+ŊKQQ8t萖/_M/^,[W8q"Z]Nխ[׍ٲeKP@@@@@@@@@@@@@@HA S@,Xjԩ4m48pԯ__ZW]@ ػw ;wf͚YǎsjM67V,9lXh[7mT.bo_mՎ p.޽{kРA]>UX/-*\=˛6mr`|>СCQesB\(z]t% eqV  q{SL.<ȶ(dYmCcǺ_. ߿?J,TK?ǂwʖ-VWB%K/^zg%()xVhTh#mYdł,V X ls;̚50icBDDDmL[m\V?6; رcQGQռlMk\^zibWCy$=jrھ-~hpVh`j+8q"p.fȐTep\g 0@L?ژd$bf yHWL(dvĤKW\ iÚm.Bw =,<&###]$t竛v~{߳~ D }B4o=;t8-xx~:V geA@@@@@@@@@@@@@@@|<5A@( ifB'O nY 7k/xlЪЭ[Hp[VZ;CWo][i)*`cC;vLǏn}lPY;7mKBp־Y qV?[l SbS 8QԴPo7^f!m V{ضZ i6>!`=hc?gN]>xʗ?C}yc۷i @@@@@@@@@@@@@@@s \8@E`}{J3_+ׯ4iaÆH"it_ Ԅ gB!V^Ԧ͙Pf|^BH͛ fH=               .W|  P^Z>}4g_^ժUӴiz9!,3Iۥ7ߔnڶL+=ӧ/* @K` iTG󺜋@@@@@@@@@@@@@@@H3A[IG@@ j׮EA]8iRҕK]HfI7J<#-X 5j$*%=xq" H]&h                A)O  6ɣѣG뭷ҫ͛ki ^dIGiiJ{㥫*V^yEZ6A@ l*y&6CT                y\ &裏jΜ9ZfjԨe˖v*@dTIGZNG!CK/j֔ oOP 3oOg                @d (B@Kh"/_^uhA.HV-ɂٶlNREzeD qc飏/ .F{IݺIY               A  I,?~};t7_~I\## ȘQjD:TڹS3F"G…nFIx Xd uz}@@@@@@@@@@@@@@@үAs@HFL2wիW/uY'NHP @֬k/8 RNgB!KSJ'O_g &`;_ʛ@@@@@@@@@@@@@@@0 y@@dxG5yd7Nm۶ּ5@ KiVפkͥbŤG͓0l]6mAh pa9rH:H&H;vHKwK")"?HO_X=\%v4nԳgx                .A˝  J,iӦyai;t뭷ĉH;]$[i&W/iRID 'N;'g7ߔʖ=;                 @@(&M4I?t-J@ w.~MziꫥH饗իԀ/GiE_@@@@@@@@@@@@@@@҄K~t@Ғ@O>kF_@.TL ?KmH~(U$]y4`eYqTKԪ՞0m!B@@@@@@@@@@@@@@@ L{@ @@Zl_իƌs@Ң@қoJ7KӦIW]%+*%]{Ҿ}i !_5kw[(mt^                A&*E" !еkWz}i͚5Q$e B jFH;vHI K?.)"i#}tpD XXɓkU%t@@@@@@@@@@@@@@@ |Ը@H&bŊj׮9LR  >YHmJFIvICZМԹTt҉fZ@zARRkURdz$               $X Sq"  YѣGkzGԈ@\wHSH۶IqԺTCR F)O?=֚1:]r%t@@@@@@@@@@@@@@@ ܸ @H62eO>#G&[T@R׮Ҝ9KO=%͛'5h .-)-]=m _} cǀ6mZȴ9z               @ $@֭GxCR?>lbt_HիK]&~}"G &NVf=z Ȱ[4@@@@@@@@@@@@@@@  @@@袋&lNAҧ@kI6HIKo-]rT4xcG$"/Z\IU"               &LN  ~vޭ{OZҀª'NT2e&Ir̩CjҤI>|xu矪W%oϫe˖۷~w+}KI; SR޽բE z^`8q"xY|eOdH":u΄@n&}TRK,8D'c:7]wunIFJfYyFZvɣ &< D@@@@@@@@@@@@@@@4$@dt@,`aR۷OӧOɓU-\qƍg,&f#4h{Lݺu6K6aٳgΝUVo{rέwyDž4խ[W[l ^4cƌ;ܿj֬ jȑ^3zպuk=z]_3 T3JMJÆI;wJ.oLzH*\XiXyWR E+9\ӧO_~ҥKe,iSUw3Av7^"N@@@@@@@@@@@@@@@HAL@H ?zRBu5,e&i ŋŊӎ;Ծ}{]q.L2}zj 4HS5+oѐ!C\1[]GR [6[/< HτB}ҩSIي +B7nL#un%p]GD.쮇˖I_-L֭[ y~^*@@@@@@@@@@@@@@@ !y @Q;u -X*\RJ%yrǏ)SU}_P!,YRFҟ?x^}@p-,)RժRgg\rI/@@@@@@@@@@@@@@@҉@tO a*𣗰駟j.YfСkըQ#ڵKzm6=CQz2uT}ھ}yQlݹsJSy䯓'Oʮ裏[o֊+Իwo:}2gάgyF3gԬY\ٳgW>}T|yuۮ];Vi}1b, ^ܼy>C-X@rRҥ5``wޭkҥʝ;.A|K&Md>楔5nXYfr0(Q"YJ(W\}0a h˼yK/W^jР;yqmڴI2egɒ}oeZ`y޽gG"Enά#>7?XԱ^]kn>7ֿkQ׼xUWiʕjժvԫWOO>f̘S>T9yd77~ nWF`i=${ww 2Gݎ7ln A@@@@@@@@@@@@@@Ha@@  2D 6LY cBtm}Nłǚ5ks.d'kwlٲE QEC yP[n<֪UKGq[v!7|,oquu-#q8pr,k&x^`HW_ƍ&oWDDkСCS `;vyQ 5?UVʗ/ l/-… ~[+T:xĉ/ ˴L |e˖Ϙ1eOds) ?,nL ϕ(o|MN77m֍V=ܣ6mDiH\sc|ͣ1͍&<|79jl6[΅@Z#Zls_.]xy@ θƸ`섅= >t9[lѱcԯ_Xx~@@@@@@@@@@@@@@@0 2 nM@@ } w!wq P^V 4f 6LVXjUSlY0ʕ+kŊzw]萅L͝;םtRw,B:oc#Fp!vZmذA?,εٳg2d 9s;f~2i:ur~XȢ)S&wn5\<'t}zq N^N%/~ZW◱k.wB-CZgϞ2F/{n|Y\9E/?- U,o2~m {`aL~}4֞=ӣ-8wܲ؂s߼h<Ɵ5jh \gZs'@577w~ x޻Sh׮]v<){ߨ@@@@@@@@@@@@@@@ | {AK@H7 Xx`e=zTk׎f͚_~ex}]}[l⶟~N:nUYXO/_^XhKbot9ʓ':v( W5k;jd;vL'Ota~0}5kVRJ0D eҥ 5n8;6ؾzȵB(ŲOB4$|8q},^x~] yŴᥠY(WvY?yiis}ș3gLq H6 yY^}4qTԣTԢM=:th cƄ;͍KpG|8|pwȂ۴iyܘ;X0;)*0h,/Ca71:l@@@@@@@@@@@@@@@ҫAo@RP) !pN:.p„ +=ƶX"ESdd׫W`,Yge˖-bϜ9  Μ?~> ]ϗ]vYWPA^;wܪXb02zT D@ xCZFv(/$Q^y!m <~:ds-_߼h׆΍ wύ%^3\5elk!C\q͍ c*c+jyYk               &/w  .0gΜ(u/^}.lIZ!KBBNW9tAYT~W^yj֬/­GرceSNvZl:us]wiڴi}V?|V݇żd.-[T OuEJܱ 6Dn֭sʕ?EU;7_~s)s@T-3ԱWҎҍ7 7>JӧKO͂ 27ϼh_ȼc!l$G;wʕ+]0p֬YUF8;x!swe xӾ >}表Eڻ-<UO               i] ȴ~ a.0k֬(-\p|5׸tuر(ZjޅVϛ7/DЭ^YmݦgyF|ضm[}7.`EoO> *#F裏>Nk*_rʥ1chɒ%k{ ڴiSXBvjٚ4iR_JԩS %K(_|0.OX@t(?̙q$֮Nޘ+oN-VZ˄̍x Mb;͚5Sҥˁ.nu[z!7[c~0/ZK?,/9jYdm {F               @ZH˝o  M4ц _j PϞ=ݱbŊ)S0.|j[lq<ܹskرjڴ}]uU:uҠAܹwv[kCL@ׅ͛^u\YQ_QFiǎږ-[mݺu%K=c wޮoWٲeUf͘1 ϺI*Uh۶mʕ+:9sFپ{ʗ/xGΞӧ~!C!Y@%/VO8QQCPAzei͚R6O$tn .`xСqݟωMh6w=n\իQǎvt.scB*@ |tԭ[j-ڞ{nՏO               O :;=f̙ڵK)@Ң7߬ԏ?ѢEqFOk׮ѣUdI{YtR}7}?P \a7/ȎYyy׺Zl&O>c]~.%-hΜ9ʑ#(ܙ3gv7xj4Z;/xw\O׮몫*9R֭unZݻwwnР+1c;5o\}Kj+L2}i۶,BgΜ &;?}6eB,\{ufٸqcׯH^57J-ZHGJDzI.-o^ڴihs׸qV|y*UJ?xsS^24d̘1Ascddߗ]cL|mؼs~i-VgՕ-[XFmΉiZ+?)'pedۥ[no >ydv2%޾l$@@ VhР_Cݫ+V + ZX`=gu떞] ̙35}t͘1Cw1g w}7#e[W^];6qY'               @| k "0~dދNaU'7|o߮+Vո, \ CΝ;W'NPHHڵk:u5iR1]+//vԧbee5xҪU|ښ@@@@@@@@@@@@@@@AY]3S@|F ȴ+WTÆ 5m4 = 7Ο?%KC~TT֭z)<.l]rf@޽9 B@jL*^\1!h                $  @L6UnlӦɣɓ'Fx'OjΜ9>} SppծRٳՆ tXо@#ޗ#g,0cbJ*5i3a               A>  YB y'NT=qFUR%}:@tسg `ș3gjʛ>f"#۩mۊ.{w)td2֭8*M&t@@@@@@@@@@@@@@@` 3= YQ y U׮]O !k֬BΘ1Csә3;w""*(:vNRNR2D:3Vy.               >-@O @ 2[o^xAwVӯczB0siѢE.rZr.\31!mզM; B7ܐ#&$2ÆI>.оtll!               w~7b  l*::Z}YF@ֵ^_~Y˗/֑#j„ׯSS΅;w]s[;vO{]`JRR~;5%.]ÇE                @G  d:AiƍZ`ABH@SvXEF#uMgI5jHKo!ڕy¿^]zAiƽr4ec@@@@@@@@@@@@@@@+p!xɞ=c[7[- =RjVRP_leKi8@Tz?N y z,۷bRƎ&i@  Kݺ)wC:p@s;%>}ɓc31C֭MB--{;               xO HY $!p뭱QI\V`̊k%(TwO?4M< @țW֔)Ҿ}oHvEoΝ{,FӵG x!B $b#@@@@@@@@@@@@@@@HAy@@bKAAIگ_׸KK,͛ d9Eϗo\ZXjZ ~-˱wBɓ                \ Ȕ \w$6"  iF%JИ1cR7# ?>jntK HիK/$mْؓ TɖM1iB骫.u'@@@@@@@@@@@@@@@@ AT@@nIʞI:I g+ݳgO;ֻ  @QCze?Ev>T42Çy,¸+Yd M!               @jIE@./ԵdBKttϰv´z솶@@fһJ{HӦI5kJ='-+m+}tX^{-64:%${A^.3 ;WpT                (! @.?rΜR qv͛7W5vش넖@ ڵ>\:p@7N*P@~dIGix)""i ~EWOZ.{2 J@Ć@+G                = gIK  p)ybǏZ{'OԩStt@Ϝ9#=׳1 G(w LSc/S,H2G.g;wnůyqǶp|m?~(P@m\.;@@@@@@@@@@@@@@@|Afwʌ@tRoZ~6m eMe gT k,TP!W-- (88Xٳgw[ sιjoKGu*yI ܳgOիFY5j P n6:tH3gμ܁ @: |Էo;lVs/?SÇBmYkBښ$B ھ'0~ g?D Qk#:)[l<jXФ}\\t?mT1c8̳x?~gւˋi3m?p) ,5#mgK _                A[c ^Zg֒%KxbرB-pxUW)i07icݷo\J_f,ɂԩMyj UT73f,L t"Mre M14`O'49C[6~͗/! 4S~'Onz7-/{;-2~i%Jpxq%KtkҥK_                $@/ Ƃ @: ߿_SN5c 3qu)SFʕSٲel˗/bŊ               i-@dZ > >&`87n8-X@]Hb۶mU~}ب|8O .-r͚5ʗ/u[oU:tP9?҂>1g@|]ɓfOݶmowء3gMB-<Վ-SK(gA#B"([٣ݻwU;pIOɝ;,j TbEU[?R@@@@@@@@@@@@@@@Aޒ@|Xܹs5rHhA7]t-ܢ;ʎJ pBɓ9{jҤIVaa4~xm޼9; \@DDl٢7jӦMnkxСf-ıRJ.pن(o޼q@Z :uJ;w #@RPuV&Xb\V*nkr鹍-                2YL܄  XG}>LGQΝ5`uЁWo>7N|֮]S߾}L89sԦMvTbE3j@tkݺuz-hMnz5bȑB>ʙ3gwΝ]Xw}i@'+VhѢEZ|{lٲ_j׮j:u\Q@ VR- ך5kvժUڽ{!44T5ryjذa^g@@@@@@@@@@@@@@@H\ ]8 _ 륗^r!!!zu-(00ЯK=z7|SŊ[ooٗ赱X嫯* Z4 ּy\]p~7EFF\rjҤ kР C \Cʕ+]ҥKk.eϞ}hBZrH"W O!              A~(  ̞=[ r-ڵ*V3Dضm[w. RJݻ/ۧ               A) ڵkZj hڴi*^8*$`ݻwM7ݤQF)000Fn̙6mh*_w@4?XfRƍկ_?YD4@ c8 ꫯl2]wu\zn͜93{SzW^2d>8p 7&ҧA 믪_^uW7nܨ[K ӧj5o\=Ο?M*.\iӦGqT4ʕ+գGUTɽӧ]ǝSNiԨQ5aFw}'w{¾3컃               [A`4 M{WZx[jѢE۷^}D)LZj_|Q}Dғ (~J,rժU0@X(ܦMu]6lP~ LmۦbŊe)jcǎ֭[O(00PvRJTpa߿_q[㭷4 /5h ʖ-7Y~j֬+VA4tƊdZB5ki皚UVM-['|̬YԤI͛7ܕ̜9S /p%ggj׮۷ɓϨQ\@}TdIݻWO;Jՠ}֖-[&/l^xbvm^~̙km               ^c< %駟O>@?x|4l0iʕ+͛B B l٢x=zt@8z(-_hQ@2^ ::څ@ܹS .!jƍ Ipu];vuXTTTAPPWlVe涥KN;r ?9P6.޽컅               # @wիo$qGOO8QV8 StyM:UD9|p{Zv>YW_}9sN:;"""k wׇ " rv˖-{ u9=׆ G%8wĉzG]@o& :̕+WuoQSLSO=fӵ@5lPK.ӵo:Cw+~G~WƝĤ6la tu? pΞ=KncǺ{7~z"ׯCsرcTuʕ+M6޽{u}qƮX7pl]ߺja6۷K.z=5w\mڴIM4믿 <m}fjR=Զm۸:tHVZmԡC)ٱ QFiƌY}Yi#ln/͛n}衇:rРAjѢ;gkǯÂmzr.~L_ϸ.={ܚq̘1.XkkޢEq[w}(               '@d3 X| \3hzW_&LpD7߸-.ڵ+;w[ wܡ֭[Xb.<˜B'OZ>X˖-Sr =Sp PE Pk=\ Y[X/vl~dAAAA^j5}iԨO Μ9{9;2ĬYԿD }52=ڭ;,Hv[b_޽kB-$V.5^ W-h1O<.qW ~6l ׯBBB;4-Z(v-HGʕ+UP!/_ޅq[=cA#Fp[[nպuyf5o\'Otv×_~~~-]vZ`sٶm;0N:jrwuWb7:uJ͚5SݚpΜ9R}ӽo[Sy,Y҅nZ۶^{ݚjܺtܸq\?FFFzi}n*gL2.R!C5mZȥΝ@@@@@@@@@@@@@@@L))gŤ@$SxqJ)ZJ .% ~qFw<h!Dh1dł-ȮY?k?Wڵ]_|cǎiȤڽS4^>hܸ4hF,@3::+-]Tl#G=c2eJJ͕*URDD:G|> PP U d… uQqHg[3$.k׮ u X0@ZR[{.Vg#00Ѕ8[H1lRD թS=_bEvm[jofjԨ!-B#G0pYآaVZՅE{у>[l׿zj׾,{`q[YȔ=sLVP;v OkR}͛WTYpa׭7nXEqy/Z0cVdR&wٲes[@yѢEN]3w}X(@@@@@@@@@@@@@@@ e\ PA GJ_+**Jݻwk ݹҥKM7B,NJ 7B,(… .TR.5\,7oB"-zI^(GaÆiÆ ۫\rn†}Y : u99ݤϻ, -̓ 1b2f{=`O >k1cƸ0i (_ (0UxqIjhG~zwdXbJ˥͓'k~w=m[cϞ=]kwn۽=j(zʳot)u%nhu/C}Mn                @ q e,ѣJnظqϯ˗''Db@hذ >|xw1.Ψ?^Ǝ+[L6Mzk\IdrMÍYSSNuwy kv7cV&N'{ٲe/3g;(nƚ+Y`zI15zj[NU gjsg               / Ko  p@&M\ό3.zFz)]p! ;Nyڜ7o^ǖ/_\r]Op $eMݺus5h@uʕ+׃'ܰe˖q缹3}tyB)nzevWNn@">]Cz 5FʕfϞ`"gϞMp^<߯^z 6sȑ#n}a㸒]ݤ6gYuڵ߻vکpӧOǭ+_}N:O?P͛WǏow=::ZΝ;]άYc;vLv_5gk 4mԵ.h]OoͭXPcTT+LY￟Y<@@@@@@@@@@@@@@@ o_G y 7ܠ/ӽ{/_>M0A۷G}_}ߡCv֭ Oo{=EDDgvء 6'TB.nN8xgտ͟?􄇇^c==wykiĉ*QƝ΁4m4|j2ک[ ʰ1 kor޽]($oWܹ/G̙3kٲeW4={m.[vx-gLXfM,XPKvO`k[$\]O qF/n;v&MaÆsA-0\rZf3<]o߾z\= 3ϒ-bŊjܸgZ]ܽO\[*ikӦMkΝ;m۶sT)SNUѢE%ۯKmm=leРA2enV=zT{u?Ӆ+YP6md˗W_iܸq~… I܉M>]|_ɓ'kȐ!z4QBjʅYѣeQ6_OSRy`K7oȑ#-[T6x |1Y[YdsMA 1g }eaw_ [v@@@@@@@@@@@@@@@ d୆{m)OA@/ X brdCMmRXX  fgϪXb( 4 (7nTݺu](R{ٹs [-}:.׷o_{;yp5mn* ڳpˆ 𿈈ȑ#g̙ӅhѢ Pl )딬.ոqcki!O8Ǎc`a6Τ:eYa|J鎅Zn'fLM_ڵk]gŊS4#[YI-_ˬYÅZ(R@@@@@@@@@@@@@@@|C Hx@K [N 4s=aÆ]^xAuC׿޽{_ܹskdeAV^,;? 0ߧ@L#`/z-kN> ,['N,qٗf9bo3Yg5dޔŲe/jzG3ϸ               @d˘n@R"PfMzUNu%% O$p!xk<={ƶ4nZ@/0x`}.u/C?C0W^:{&Nv2 @vءwyG|-;P Rnz?la/&Mn۶+*U*.M:U?]ಅYo믿ŋKto߮QF?ןAʗ/&l@@@@@@@@@@@@@@@L&@d&{L@ s DEE_~4vXu-sOGggaȐ!9rF|tW<{Nbҽ® DH'OoqتU+j޽_);wNgΜI/_>%8Y"""d5~)X`C}ڼy԰aC٧O@@@@@@@@@@@@@@@w@H !ꫯjС Hpi'pY5f̘Libw\ٲeK;PZF5kFرC-ZP׮]թS'ժU˫}ڵkO?iҤIZhʗ/nM{Vڵo                 H# ᆱ_j߾>S(Q"z;w7'L fZ+VQFڴiTi@,l2M8Qn:CզM+V,3O!ٳ5sLM:U;wT͚5u7ꦛnRƍz~ @@@@@@@@@@@@@@AfOGkEo׉'[w!~=)ѣG3hĈ޽F"EH7$s…/QLK !uV{}Μ9:uj׮kV-[5\RJebۧk5k(o޼jݺnuQ*U @@@@@@@@@@@@@@@ I^$@Ⱥ4l0}jذ{=5m4xqzJz] ,_]q28@ DFFjŚ={ `p2׬Y3hҤׯ9rqF ={V.]%KG k͕+7oZ۴i#{̞=e@@@@@@@@@@@@@@@ #F@ Q˗… u7pH p\ **Jƍ+7 _|Q Nyc~}~nk~<  p9sPHSppjժ!4h uQܹ/$@Μ9]+Wt ׮]++U ~-ZQF<@@@@@@@@@@@@@@@/@d@ L4IZb uIO>Zll=z >ܶm飧~ZUV=z({o|& @ ;wԲe\@)9rD Uڵ]`5jrʖ-[J~2e_?YFVEGG@ ʪ>6nX!!!fL@@@@@@@@@@@@@@@ eA̋@~I//^Zj{wܡ kaaa9r+:uJ}հa\UzyG5|-]ǘ@Y`.nԭ[; RW([s Ni'`7o֦M\uU;R+Uu&˗OA2               w# 2+V裏>Ҙ1c\PSu뭷Cʙ3gDwݻWƎ_U+Vtawu/fzSy /СCWO"djpmذAׯ׺uvƍ?\(MH".244Tgճ_tidj#&_.\->Ƕ[Ç݄,>W]ujԨ5kmjՔ+W.4E@@@@@@@@@@@@@@Hw ӝ@'Nh.pʝ;:w, l۶ iʘ_T?k„ ZpͫnݺoW~&O]ɓ@|D **J۶mBnڴI[lqzcǎ`+WN˗!!!*[l\͗/̊ad[޽;ܹ}&siu׮]:w=gV\YUVu"H               @t @F ۷υ!?"FGG~.B!5k)٣sj1c )X:uꤞ={nPΜ93ulWVzjժ8  XHYPm߾UO~GFFM*.L2*Uj%d@qϰ?jk݋},=łs "Pڱ=Z()a-                қ  XάY\XiӴef͚jҤ7vArߵtRW,Y{*[l.ز]vjs"'yL+B4=] R<]v>Zog{ر=ȑCŋVhQW)`PBkb:zI?tgٳg(Ywҥ]pgkʕsрq               @z  ޽[˗/י3g\8d TzuըQCW]uBBB\ɓ'gi?eu su.PT)5m4Ze޼y|l9s:E ڿ8અھ' ,\ ` (nk/_>xkk [eVp:uꔫ'O_-܎-ȑ#n{q73{zO t}Z-Y1               "@ Ɓ DEEiӦME ^-[ϰ-U7|S 2*@@@@@@@@@@@@@@@A 0 @@? O_FRR7<ݺuukРAe˖,,                w'^ymR"Q)*QQhHVP=}fϘ cyfx/ْmP B%(%?m~S:y_}~z= @"ZhgϮIP /Alqƿ/k׮qWK8S @ @ @ @ @ @ @ @! zUj @B+~QF[k׮N[ @ @ @ @ @ @ @ @j) Z>V"@@ͳ̙S:(u:uJrVZq)[o:u>}g_}U`  @ @ @ @ @ @ @ P SX @*&g bN P"jWiժU;Vߊ+C] @@^׵klfqwߝwy7n\< @ @ @ @ @ @ @ @!PcK  @5TC-Z68W; P1 ȜcҤIѾ}ݻw\plٲik @ @ @ @ @ @ @ PAVG  @@ .H2dHԭ[wbt[nJ @' Sj #l2x_^{m3yP @ @ @ @ @ @ @ @j W#q @ |ɱbŊBz^oxj(p N?8qbfݭ[ @ @ @ @ @ @ @ @J' &= @*[l?֭[7+hٲeѷoQ* @L ?;:u:t/bWC!gΝ&@ @ @ @ @ @ @ @.  @W`Ȑ!|&MĮZyU g/;vlL:5v?J!@ @ @ @ @ @ @ @% &K{wlYRSS"$f]S}_:(C%K @ @ @ @ @ @ @ @8!@(C+VҥKcűlٲl;nyiQeX~~~.{ӧGfZjԩS'.u-OlAԫW/[Vp eȣk Pm ^Y+xkkhԨQ 6, <3bqwGΝp @ @ @ @ @ @ @ @lj(!+C>)񫯾/2[:bo6-Zi]tIR_K,)\j׮׏ [ F u.lQܒž6dhܸq:Tj @: ̚Ѻuĸq={V>87ߌ뮻.N>@o @ @ @ @ @ @ @ @uKpK @-|/ snϟ??,Xi]t?.]XZjFmZa:S[nRb I,X4h."~3=,{ݻWI @ @ @ @ @ @ @T AU1)͋>(fΜq̚5ku \5q7曯o֬YӒת@ L 9wu.tΜ9+~glٲ‰׮];l2Zj[mU:mn:ڴina=6 @ LѡCĄ 첾ռ:+VZѲevmCv۷o/$q Py'SI"vܱ ^ K}bQnݸ{gϞJ% @ @ @ @ @ @ @ @@uY9 @j"gɓߎ)S?lBS@^.(/? T Өi_|E` )tO?8j׮ڵ+-;wѰaÚFf o.2 ^ z ̝;7;xg/s=w={t; @ @ @ @ @ @ @X]@& @e,|x hĉo.sFn֬Yt1 KlYd:uʸ:\ .!y(L6--Z) }ѥKڵkNѭ[hӦM嚈j @L&MG;" d++ /0v[4iҤ90 @ @ @ @ @ @ @ Ȳ3 P ovꫯƄ %KDÆ `;fKn޼9;!{ɓ "ӹ!ӲnEϞ=EijoQZ^x! ׏?~UUG @ @ @ @ @ @ @UF@dyT %@UC믿^z)ƎƍӱM6$vu,@g炴]v%n]v՘* To6 [8qb^I&ˣuY {{WNQN*23e @@qWӧGo_9sc>83ק; @ @ @ @ @ @ @ @L@ ^ .1c3<Y]t^zesݻwBkժ^c&x,W_Z_|Ř9sf4j(>?񏳀V?]((Ԋ>fz^zi\r%1p[b7ޓ6; @ @ @ @ @ @ @(SAeʫs P=&M#Fz* K=z>}D޽0 PyRd |cԨQ1ulb}C9$[7o^y'2^y% "f̈hJY >:5kÇN:p&@ @ @ @ @ @ @ @j, ?\S#@%cƌx 裏bw>8իW4lذ 'dO>d<1wmCF+*C @ƍcY"ZZί^LrK `vխ[4hP{ѢE*6# @ bĞ{Fγ2lٲe_*2dH\uUQ^TZ @ @ @ @ @ @ @ @ Hy @ϟzkSsL/7n\J {wqG;qA)ڵkW @+0fL{G̞5ס"f~}']tx ZlYe @ @ @ @ @ @ @Ԗ*ДLB`qYgE֭[nB>9rd}B ]@Ϗɓ']vqGk V(O ?9թSVg4pxWb޼yѭ[R95 @ @ @ @ @ @ @ PA%@r ~atIѩS1cF1"LC7߼:O;S\wubS8 7ܐC^uUxУ[ @`}rA 0{7z/ܗ  @ @ @ @ @ @ @ @ 9L  @JK, ͛Z9s⦛n~ş^nwāX0uD߾}.>`] )N y7FΝcȑe> @ }C wϹ;vVMfJP:KhԨQ >}TAvi^WO޽{k0 ]|k:]Ƿ~83K4n noV ,X:uKEgώfA~l6q7|/"J8HzsΉ'ɓTFe+˭.xM>+MxZ`޿Uoݰau]G[jݲebkXbor @ @ @ @ @ @ @JEj_ӗʔuBjO>?O+/VJ6mTh]IΘ1#>蕂uOyOL%iocԨQbŊˋ;Vx ll&j{o̟??N9!7n@7.xeC1f̘H;{c޼y4u @Z .g$yŽK^/o&MDzUֺu;vl 4(? "pwKa͛7TOqm]狻1 @ @ @ @ @ @ @(Ӎ^ @.0{8c??cȐ!wy',D.-X {xk~8F[mU\ve[cQV;ZljNkB?'OܒaZ>֭[i{'>OR)h*t'g+BzcL81Ram_~s-i@U^aÆy/r[IH?ϣm۶CeK :th6cJgqGsoKo~O)3ՔWӳ/d ?xvK.+];d>⎥"/.LsjРAydY'%sWF߾}Х:*͚5+ź> LaQ)1!NJv{w1f~xL6-><#/ں~O=\~ٞy晑4nj-ZX\0W'+$;9tM^$U)O //i^Aڿ{w}pBO:kYۻ. 7.{xo7ӳ4>_|E_G cTOj°wԩSέ _xx뭷pl)XI&kr]x @ @ @ @ @ @ @ ^ ׋ @1"R]:u*mѩX;,;tg)/83|~e0t2׿ή{Ÿ SQo?nܟ<;vlp` {nZti{_~yv /ݾu K}`~W裏f!g}Vw L4=W3SK!)pC~SSM}WYTz=Xvl]>Xs狞L)4h P6˖-/?}P{hE{=dN#NO׬gm}ꩧfä7ͮ>c)1:7({8Wmi|Ϯ⊸K㎋~;?Ec]w Y: {~8ꨣ4+v2ҝ)uYJ'*N /~x%*M)V ~Y09sHsA[oW]uU}i qyeA޹ִ>묳@~7oKlM1~H)Ogo6Zӭz<'sNbpTwoWmS{ޏuʽӺ$=zծ];wH ]Niv=3 N۫U ӽ_6tHAWZeP[ne5*;#Jae=  @ @ @ @ @ @ @ @]\ZdKխ~ @RH!)$oςvmjJ믏Ƃ bĉYcҤIѭ[Kg6 ѰaZhxnv衇F Nw1ӵOO3%祰r裏믿O=TwNÆ j6mZ)x1Ֆ#^l=h}oȑ#[o5vZl;vlT{zF4СCc6R8S:Ceo>9昬Ut#c˓O>yָ,S@Ԓ%Kbʔ)[g\sMv,=Wol[n 䕂#o,l19u)Rgj4~O[2dH.Mo8$~DeW_Qw^<3ٱׯ_5}@풼7UHPZ L;vXw^zRKZK7.Hu@?8'ڴi{+wY6XI8}^p1~l?h @ @ @ @ @ @ @ P}j( ]OWZ=( BS@I'&6k֬,>ΝkS ,Rdel)+UYg  @ڵYѫ 7źV} 'Yz.\06duxp Xwַ"_|18,<7j{ @ @ @ @ @ @ @XOA v P|2dHgC-6T*ϱ"jK^Ѝ7QF>YQu VvEյZ!:w)sĈŝ.4 'L]vYfrG[}k P>[l]|qhх3QT`̙1`裏>}x:'@ @ @ @ @ @ @ @[1 ]v1cO<ꫯ;.8ҥKe(JзoرZkoРZWɊ/Ȧ;튪+3occ=6f͚vZu~9S皮˂Spg 4M>SLvڭ  @.ulZF붼Zn/Bp qĵ^gyfya< @ @ @ @ @ @ @(cZ+ Zi1pw=w_i @<F\sMֳg8㨣MgƪAO>d򗿌wy'R8A+͛W ^{&L6mđG+EmQD {;bذa7~83ǘtԩ+Vtر{xK/O=_+q_~y-<%ޅ @ @ @ @ @ @ @ ~  @Z ̘1#nlO'ѯ_?Wܤ/^i)ښ4iRtRl@ȍ6ڨRREL:5z衸cĉY0'6lذ1ˋSNy7\͕͚5[XUycnݺ9_* w:u*Tb_]D @ @ @ @ @ @ @- r u@@ 3fLw}Y_|O7:رc˖-_|1x1bDL2%ve8p` 4(ڶm[CeLSk#2+g}ZI&ŀ"}?#ѵkb;]|y|qwǰab^  @ @ @ @ @ @ @T Ȋ* @UB ???Ǝ=c1ufmb>}d˖[nY%H@ =|xgb_Fǎc=#z%<&L-i{zAbQ lҤI;.;v-ܲOLY >1eʔl̚5+VX]ڢE,]vѶmȭv:Wv]&P,Y3f̈> [u LAկ_?ڷo)qY0jΝcǎ!=V @#)a XI6mO=T 2$8∸ϯ$) @ @ @ @ @ @ @$ rM2 @&[FZR -ӧG K{)+ 6M@ӽ;N:СC~ǂMKK Aʿ^Φnݺq7F >s0[n% } @ @ @ @ @ @ @G@d8( D.]eR^ cƌvZ套^ʂ/^\x[PȖ-[F-ɢ-"7ooyl٨|M|駟fa)1)1)S7# QR3 @ @ @ @ @ @ @@4s!@M ޸N;,0:N:uU#S 4 B!zM6ƍnԨQlƑ[ܒRO[dI|poVZRc:W_._~eiY`A=~'E>۵kТ[l=\m @" >]v٘USN/Gz{7>Z @ @ @ @ @ @ @ P# n @j$)tͪSy篶.F駟f\ իB!z 7gl-龴]tB%ԩKunIkժeŊQܒ3VZRbزe"-K.]i/^xu:hѢlI%jO6)Hsͭ*:w\Ι LlYd @@U(xϫRj-l3N=߿\{qYg @ @ @ @ @ @ @ @,K @kHii۶.[!W]Ra C̅ Xq)\2/v.1΅5u Y,[ԾgA@k JֹɴsEC)v Z6jhؠAՂ0s)1lFY @P e$d9kVH_v[t!>6mZ\uUYj;@ @ @ @ @ @ @ @* \ FX] "6m4[V?[G?b(Q @A ȕD*pda|{q=dAګ^g @ @ @ @ @ @ @Ov e$ @ @ϏS4{WuX=zxעW^1s8Ms"@ @ @ @ @ @ @ @@YeB  @ @+ uge{ #^~/Ѥ  @ @ @ @ @ @ @ @@ w @ @[ /Oz#֠zxk׮{ǃ>Xfo @ @ @ @ @ @ @< +ϳP  @ @{ Gԩnqq hܸq92N88#+"O @ @ @ @ @ @ @[C @ @4Rdmo>JFQ =믏.9眘6mZxQ*Q?%@ @ @ @ @ @ @ @_wW  @ @''rkC㣏>x 7n\Q̞ @ @ @ @ @ @ @ P0 @ @@GԩS/ƌ'O^z̙3kM @ @ @ @ @ @ @% K @XOug=ޭ[x嗣VZѣG0a @ @ @ @ @ @ @(Ceط  @ @JI஻"& L3gFXG-Wt,>:bRX75Bu /đG{Ws=ѯ_1w$@ @ @ @ @ @ @ @@y ,oq @ @~Fj7Κ/^y4n883+& R?իWy  @ @ @ @ @ @ @ @`| @ @"v;#u[u P@ݺu[nK/4~9+]:jԨ0`@\+C @ @ @ @ @ @ @%Y2'W @ @*\c# rҹNZi'X7Mu]q 7O~o{'O˗E]+q.$@ @ @ @ @ @ @ @A% @ @QbӹcYyg|dz>cǎ}'xcY7i}.]K @ @ @ @ @ @ @  @ @UD]v*ʳ[o]yG ^zŸq/}7ΝyyyYW Goᆘ6m= @ @ @ @ @ @ @ k7q @ @* {lDݺW~wm6Zj_}UǢVZ_! @ @ @ @ @ @ @ Ar @ P:* Vvs~/j!i s=W @ @ @ @Ҫ@zR$"`ؾ(h^5XW1jZ&kDԠ HQ@APޮwJfk9=g}~>/,֚ @ @ @ ȍњ @ 1 4kѩSDQfWraEԯc_sO,ZhU^=XxJ8A @ @ @ @ @ @ @ { @ @ !pWwbYy4tt?D><u @ @ @ @ @ @ @)Ld7OL @ Pŋ3ڵ#=?( C.7|3N\?f/T5Uk s=s0U =P ƴ?q\'L)1!JQQQ4h R7C t.m`]U)ڭt.IΚ5+mN>=oSf!5k.[Sf .,fJ)q5}n֬Y4m4o֭[| @ @ @ @ @ @ @* Ȋ܌ A7j7"@D୷ފ'x"z:thжX{TZ\6C~E߾}cر9 #8"u5k,chѢ7n\|GFSM&MZRrz뭿(*fmtv~yM6-痂:?Bg 7o^ FF5?.X ϩFv͛G)iӦ*UTNǏ/)4M5JJz[ |'vqhӦM^J!  @ @ @ @ @ @ @^@F@( 18>l\/FFNGѱc <} (sAUVqik.n=ྡCƐ!CrM)rƌy5k!~;CK)/mf#15sm ~ M'OUZ5w9ve⚂D @ @ @ @ @ @ @  ϥ @MA@͑D`…q}u]<x衇F*U֤ 6vmq]wEj⬳ΊgV[U9ˁO0!yxwc?>߲^zѶmH|㎑6m*o]>M.:bĈ 9lذG knݺѾ}СC[NQRMHT  @ @ @ @ @ @ @_A @N@d{dLP/8ƌ'pBѮ]uxs 7y\xqEEZϟov?z뭼 bρ{kI&p4&rٳgG u4hP <8o紆k׮)sιނ^WN  @ @ @ @ @ @ @5d. @lZ 7m bvƿٳg\yѪU7Λ7/nƸkFqW)IH_=wy'H]tN:kݺu7  .Cƿ0`@2Mᐋ-֭[>wk׮ѬY;Q#'@ @ @ @ @ @ @ An @. ?!#@u)`jxUW{7tSniӦůtP~9BOOxoV"@u%׿5~GϞ=#רQc]j:+w>`TV{ɒ% /wO>dTZ5: zD @y8p`<ȑ#K.ѫWu)/4 @ @ @ @ @ @ @T@ws @@Y @@ s=7~_e]Vvo=?=ܹsqby"1cF/'D=rp]nrdyH {7ܹs㏏}'vehРAՋ4-c%@ @ @ @ @ @ @  ךP @[@|͎#?zW_}u\|9aL}ڵkpx\M0!ӧOl$@6jԨLXpadq1DZbʔ)1iҤ8qb)uԩ,u֍>vahӦMt̻[d @ @ @ @ @ @ @ 0  @J@䆒w_X__}Ut)RX *R&y믿>@ѡCjdɒӧO\|ѤIkCYcp3裏WU<9m4h`9yŸqb̘192Rbر"KR{_l @ @ @ @ @ @ @& =!@3Au]/cСѲe2"v8a„~~hѢLRP[ ߿i+lѫW|ygDJV , />lw8p`/?><_+W.w's̉{,~xcƌ{KgyfL:5⓫IsHۃ GÆ W`ݻ1;v\i/7|s{]a՝_E @ @ @ @ @ @ @(v/& @ @)0wܸsȈI&yo}r-ʺ?9|',Wߐ!C"͛7/~ B` [oѣGɜnH5Kv->|x!:={v|3fΜ!P|=#G?ӟϭjvѥK8묳;ȡ)LGSn[:eʔouoF߾}up`u l  @ @ @ @ @ @ @ 5Ӟ @hvo4sZL81>6a7tꚮAžݻw^x!6m}| ϟ9дFQS`a:u&۶m[Vݯ~7n~zif{E7l⪫|0_QkذauQ?1ƍ =zu]͛7.(f͚U϶nbeeuWv @ @ @ @ @ @ @V' ruB @ @<G}t0%C;B׷oOԩS#<2׿F S6ʕ+dϟcǎ*URZ*7t'9mqa\rI<ånqbvW^y%٢EU~߭|B @ @ @ @ @ @ @M^^ @ @ܹsqg?Icǎ_"ի .g}67xc|1tиcѢEq=Dգ]vq 7Dg?Y0[n%|͘7o^>FƍWo&MצӃ:(3pmZ_|qԩS'?GQQJۭ{F+[3}WqM7E~b̙ѩSn"?.4[vyQvu]8p`N:)b-rxٳNn-~{#譨߫ :+빗5kN;: >}zsfIǵ.ۭʕb7gΜذa<ɓ'G MA)rMJ L{?瞋?>R䫯~ѠABLSa COOS_~qw59cذa|'%Ow=b1c"}袋CK/4I@ [L;3bȑQVD_ ֥Kq{ַoΤuWnՎ#[j*VV-[ó=LH6?rۇ~8R'w:Zj%y\sMl;$9pm6Aj )`|S)RfLwuW^S)2=c'] @ @ @ @ @ @ @(kJeݡ @ @A`„ y͚5+4(~氾xv#Fo=S0G})1s=x z|ػw:thy睱. f6sB#WGY+Β}9eV\R_y)+{F)oUk&+z+?o S蚖q*UaR^{핻I)3B`7|3i/a)17*;)3W^yekkΡ+I-Vy~e9N @ @ @ @ @ @ @`u_Z9O @H!q)Ȯ,HxG}tqs΍VZŬYƍQGv}厧pիG u[dIfmb}7jժF!;v[h|tI濲.{ܲc(] <>}:BZ 6!CuJ @ @ @ @ @ @ @`u W'< @ Q ԩS',P_VeĈQn0`JLawT\y6+:>yXп*UDΝ_#GP] هY+5o<p¦MuoEhukfĉ1sHk[Rw|p?1N#mN"3v=~ߠAci'@k*]vYy?z}+<8#f~{s)Sh+wTy>y0e¹UͿ_YlW4w] !e};nܸʺk @ @ @ @ @ @ @(ש%j @ @`(Bjf5k֌ٳgG f3f7s K|I.[m6j=\a}9kH.wygYw]tͼpµEK.1x8ZիW]UÇϧ[nߣ[nq_hӦrT厧)37y/"&M癞݃>i?q.۴T)54ce7b-~-פ$wm oVs1e>˩STz:$@ @ @ @ @ @ @ PA%@҄ @R\ Yfδ}K/4,YRo{.\ҝW^[D5/w8qb`=c4gWk&FNQV6lC ̙ʗ_~Y-6_p[}}ŋ0qN͚5]v%@ɞ={&szOmR{"P^}hժUԮ];y8p`tǏ~'?I|g^^ӧ///޽{ƑUئc;wNX; ҕe~xZ穤TӳIϴ4>;E׮]DzeQyرc^-ZJxY @ @ @ @ @ @ @`뚛 @RXn{뿢N:qm?Nn!kʔ)yG-w루(n?~fܸq@tpe/w|HA|L6K$'}ݷt3<3z1y\nͤggxCO<\rIO!vay{mG L,8I&ŕW^)>BseovשM6!C.,z?׿u?i,o/ZH|:unoÆ s?;sԯ_0mSHs~>)p2euH92_xgQF_"[.};]NIOqƌ3">9rEc(tڥRhS8!>|xwyy>)83`dzZժU+,m߮#@ @ @ @ @ @ @ PZAs @ PN>ׯ_ xg;m&?xWN;ӧOꩧ"ꫯB8[ Kcǎ=3?B_*.~s%o1M%sN{uIlzk3jԨQ>|^{y'yehUkfm#o~GqD| ?XhѢH{nw?ywqu_Įۥ5I'ۤ5V[_\h޼y^~ԪU+^xc=bذa9@2KBSIiyF۶m+,YOzLR8i_z%-)$5cǎ}СCNy)\3Ս#Q^p믿 ) 3=ΙSk |r87߰?N9e]"%=C9$7}g W2a„Rl*w)]ԙޑΦuG?xפ[oE޽8scz<@^i v  @ @ @ @ @ @ @ !P]] /b*I .f, !)w} @ /4i),K'ĖZlk >|x|Ѯ]}nSp` :thif/{nAI̧~+W-2yo1R.\0ZJzim.8`ԩS~}Yl˵I7Z`A5kM}c La)8rEeΜ91zhժUԩSI ^zɪUFFϭNz_N cef}6mZ^͚5-ZJ}4e6m4ϤsYMyO裏I&uxZBI Tmzw>HA)H7N<9?r0waKݺuz> @ @ @ @ @ @ @XUM܃ @ P^8:̆R^Yֶmwкw^xamW Rh/~8Kdsj>}y>`\˲(ɚfmVMigݺu#6,R-*UD,[l7-vѾ}厥)2ƍmGi& ,veX7|oVvzWt1PJE ?~|tI91Թld:I eܹ9ߏ{/N̚5+`v%oEkOWInm  @ @ @ @ @ @ @Hۿ]4"@ @lp@r)__nEӦM7-Ez/^|v}ն))tSÓ\sMYtF}viѭ[z\rIjj)/? O?X@g͚4?K*Uvk:HuR~e?'iqWBi.\qÇ6,a8cƌoXKC @ @ @ @ @ @ @ \ @M\@&LСC-[OZjP6rC=L0!883]v9o߾sG}EEE!,XR>1* @ @ @ @ @ @ @6AS4 @:quMR`ȑѣG/w߽\" j0^xᅸO,ꫯ⩧/y晨QFK!vrHԮ] lŋ[oߟG}4F;v'pBl+ɓ#<LJ~`|0  @ @ @ @ @ @ @T0A. @`} \GA`̙qq믿'?I&+c(cHp?я"A@.]T3s92urM7O5 @ @ @ @ @ @ @ʣ T PAa( ^-ZW]uU\y9İO>Ѻu:xye]7xctA7n\ܘΝ).ݥ:a„<]~"~&0cƌ۷oxWbQFݻw=zDftڅ`Ȇ P} @ @ @ @ @ @ @ݗ PAAVe  '|r1";X⋣^z~%Kă>^ziL6-8*tV;!Cċ//rk1{fmb=3kرcTZu}i@ 5*oF~n)53QZ:"@ @ @ @ @ @ @ P.AbP @# < #!@ '`[+x>QƆT9?7Ѹqr4u;EŻ+'O!ڵw=:uꔃ!wi'q轔ƍx;vƌQzc=b}5֭[wq @ @ @ @ @ @ @I@u@ JAq61Yfo5ka?Ob뭷$"R8>_}޽{\s5.lr+G}oV۹80͛mY0Ǯm۶wy \cO`Μ9{w1s̨TR|;)syu @ @ @ @ @ @ @ Pv RO @R@FXMR`ԩ?)n喘={v{ѫWڵkR[F{7'O;..СCܢEbĈF 4hP 2$L֠A;;mڴ-ZDʕ7ݿ L4)>x;lذ7n\,Y$jԨCI۵k;vp ']v! @ @ @ @ @ @ @X +2Z @zݐ*s(wof4i$N< 62qx'\nmtIqgGf6iny9t>|x)fEc/-[q}䱕.\0Əcƌcѣ~Cj@Sc!\4m6״*UT.b @ @ @ @ @ @ @65A7_ @ \C0  @`H}w}w;,z [hQ 80SO=nԬY3O:H:^ӦM#FĨQrM!i>3g߽QF92r6mt;fHaJXdIL:5&L|I|Lq]MZjvE֭s`hڦ|'/**XFK @ @ @ @ @ @ @`#?`#@ ȵt=l)D1(>9DRJѾ}w}sc=I&?ׯ_ѿ={v4n8?qѵkר^z<9f̘BS8`!$0J LaY[V[m\b-"7\hdnlS3r)SbҤIߪ'NT?X`A(jժC> iۢE⚞b.; @ @ @ @ @ @ @ʽ r  aAnXw'@/^{C ŋGÆ ]vm6Zj͛7aom:xK ;vl 6,{\R~y; ['Obv:o޼0aBLO?tiӦhի#S(dZ 4(ަGjSnmگSNz1d;gΜ:k֬Mi?8}MΙ/Zh9ڵk/ʙ:{X,g @ @ @ @ @ @ @ x @։ uªS؄RXsMAi9\.T\8QF 5UZ5jժE Lr_~e|WΟ?8|. Ǎ).*UD˖-s宻ڬY|ޏMC`…1eʔ\SPac)p@~ZiԬY3BT5j|ra[Xim0l[8ΧpUm IޛMsJDz/swMYQIN),P Lu--2? @ @ @ @ @ @ @ظAn @k- r u@J$Bƌرc>|)1KA|)n Kz).G$Svm-ZȵI&9hDӈ7,X)r9s&e )t1/ k:[lLeQTky # nWz L)Ȳj)5mԩi) @ @ @ @ @ @ @(@6Ԏ @ @` T;unge f嵚,EE=qrM @ @ @ @ @ @ @5旸 @ @ @ @ @ @ @ @ @ @4 K @ @ @ @ @ @ @ @ @ @@)A% @ @ @ @ @ @ @ @ @ @,k @ @ @ @ @ @ @ @ @ @Y 4 @ @ @ @ @ @ @ @ @ @J# 4j!@ @ @ @ @ @ @ @ @ @B@d)\B @ @ @ @ @ @ @ @ @( Ҩ @ @ @ @ @ @ @ @ @ P A@s  @ @ @ @ @ @ @ @ @ @4 K @ @ @ @ @ @ @ @ @ @@)A% @ @ @ @ @ @ @ @ @ @,k @ @ @ @ @ @ @ @ @ @Y 4 @ @ @ @ @ @ @ @ @ @J# 4j!@ @ @ @ @ @ @ @ @ @B@d)\B @ @ @ @ @ @ @ @ @( Ҩ @ @ @ @ @ @ @ @ @ P A@s  @ @ @ @ @ @ @ @ @ @4 K @ @ @ @ @ @ @ @ @ @@)A% @ @ @ @ @ @ @ @ @ @,k @ @ @ @ @ @ @ @ @ @Y 4 @ @ @ @ @ @ @ @ @ @J# 4j!@ @ @ @ @ @ @ @ @ @B@d)\B @ @ @ @ @ @ @ @ @( Ҩ @ @ @ @ @ @ @ @ @ P A@s  @ @ @ @ @ @ @ @ @ @4 K @ @*\pAiӦ\aɒ%ѵk8ո  @ @ @ @ @ @ @R @ @O ,偍;6뮘>}zŋcȐ!QjH*|2 @ @ @ @ @ @ @e$7R7 @ @OxĢE{klʕcԨQ1|p! @ @ @ @ @ @ @Rv] @ @OK.W^y%,YR<XK㰌 @ @ @ @ @ @ @2Y"@ @ @` ̟??nx7c޼yѮ]8sqy )kvZ4i$AN<9xe˖qWV[mU|~ʔ)qM7ŠAN:ѫW֭[>?nܸ{z7pCt=x7r'/tp} . 7|sTR%T#G}4y䑘9sfGrHU @ @ @ @ @ @ @ @ ,wĀ @ @(9c=-"nƘ={vp qmO?{wy䑑GrJԨQcvm۶!~{L81Rc*cƌ:(.8CK/A}͛G6mrcrƤI"Cnvqg|{,_~x|q .IgqF92jժ6,Aj|zj @ @ @ @ @ @ @?%KKY ˪G @lhGH+5n? @ PT\==cǎf͚i+[nCUFNwމŋO=9ƎGydt-͛W}3ܫ9gt(G%qiP`\a03Ӝ8njsg3(b)g%$Ijҕj]ӮhZ]y7 @ @ @ @ @ @ @9! 2'A @ @l@^^(,,>̣:u۵kW_ қ74j(;}7ΎW\߬ӎB%og?Y :4M7xc4h ce΋/ҼƎ'|rWEN @ @ @ @ @ @ @n  @ @ P;s6s=WfI&EAAA7O!֭Xޭ[nѤI1bDL=,,1uv1;ÇǴib%tRXX}{^ y!O,бѵkw}c3fQN81H{G|ѬY8S7}$>䓬$h2XZj6F۶mZf @ @ @ @ @ @ @ @ 'A2( @ @mi=zt̜938믿>~7dȐ,0.7|3 t|wguV{q[o}[ߊ?0 L+V+"zÆ G}49g}6N>`o8H.qgv_pyƍKRI'SNN?xWto~31wme)+ @ @ @ @ @ @ @9'Wa6>u=@Eh @1""Wq?5V @&e=!Xn]lٲӧOlX2ׅ fቭZ**~YXdnݢiӦ~6mڔFQQQ.ټyҾ;Xzu4l0Ν/3N3_q  @ @ @ @ @ @ @>5B @ @[n 8 o&MD߾}p|];???FO!iرc_- @ @ @ @ @ @ @YyF&@ @ @{7QX8P6lXٳzOB @ @ @ @ @ @ @j D @ @ [Y! @ @ @ @ @ @ @5O@d[S3"@ @ P /8Z0US$@ @ @ @ @ @ @ @F ԩQ1 @ @ @ @ @ @ @ @ @ @@ Q @ @ @ @ @ @ @ @ @ PA֬4 @ @ @ @ @ @ @ @ @ @ A( @ @ @ @ @ @ @ @ @Y kz  @ @ @ @ @ @ @ @ @  sxqF @ @ @ @ @ @ @ @ @,A5k=͆ @ @ @ @ @ @ @ @ @aMi @ @#VbʔMk-ZsF @ @ @ @ @ @ @\K @ @6喈#6_l_AAĂe @ @ @ @ @ @ @ @ ZA!@ @ @ٖ7/oN8!q-_K @ @ @ @ @ @ @\++ @ @(0h"N?}$@ @ @ @ @ @ @ @@N ̩P  @ @ 4h1dHDz^yӦGsG @ @ @ @ @ @ @UA2"@ @ @T#֮-=-s"O="< @ @ @ @ @ @ @U(   @ @ vXD[7Dvږ%@ @ @ @ @ @ @ @@ ̵Q @ @ /gQfb" @ @ @ @ @ @ @ @ A⪨ @ @N;-bڲ)rЈ @ @ @ @ @ @ @  sueE @ @@ܹLW "m @ @ @ @ @ @ @. J @ @8묈z {sG @ @ @ @ @ @ @uAB#@ @ @TS#֮4??K/9 @ @ @ @ @ @ @ @@Y-I @ @$w̢("C @ @ @ @ @ @ @ PAVR+ @ @qY!n@ @ @ @ @ @ @ @ PW%@ @ @ VZ+W+Vd-^:J鸤}駱vXfM֭[EEEׯ_eڲe-7.Թ;{XtiiK}'lٲZ ~L)qk[ _L 4,1 Z nqkMc#KRdq&3iRt<[O lҤI4m45kqy-5o޼uѪU= @ @ @ @ @ @ @,A5k=͆ @ @ `yem`… |ͤRc 4L%<㎥)0 6j( CL ǒ} wmʔ}PFqqq@ȒjժH-_!)8se5Sf t_~B!S8;Yk۶mo>k龼MqN @ @ @ @ @ @ @@5YL @ @K`ڵQXX9sDI;wnv\ic d8XcǎѧO,p0PSc x.A}Vw,S-I.]43qhѢl;SPoQO%[z]vY(dSNeZ ܹs% @ @ @ @ @ @ @ { soMTD @ P>Ә9sf>Yfe-=_>I!mڴB{ ȂK۷o6nܸ)TK%Scy?~J?~N2%ƌZ -RN;Tvye]k׮>] @ @ @ @ @ @ @ Pu ޛ  @ @j@ {|w7k^̝;73ޘBRk/ ܹsY~ZfYg -}?}Q̞=;k)D4IbĈ`!Rdnb]w-vmhժU} @ @ @ @ @ @ @AjT @ @Z(rx77ވz~LCѽ{qY _׮]#vءWˋve_~[nŊ1sH3"v}ek׮͞k۶mѳgl{D޽8N @ @ @ @ @ @ @Y@6y @ @@Daaa1yx_Rc wgD=v-7nvH] uLmmݺuY@oӧOZ 41bD,^8=@>}^{핵7tN @ @ @ @ @ @ @`kyTC|v  @H?UO>c @6裏⥗^_|1ۧȅ F^^^.ѷo, /+wu| =y7(mSLzhذa~z^ @ @ @ @ @ @ @|Ao  @A> @ oJ 0aB^xᅘ9sfԩS'z)_~Y{M6mD[bB!_yxcɱrh޼yٿ8もZ.f @ @ @ @ @ @ @ , @`A8%@j@ {g6~XdIi&88>M47)_U`ݺu1mڴ'N;Ջ/ .կ_ @ @ @ @ @ @ @ j|'@T 7 @` ,_<~3fL<1gΜرcr!q衇fmvy#$p˜0aBpԦNY GuҥT @ @ @ @ @ @ @O@dE kқ8q)nԨQ88#gϞ5n&D -Z>1v,wq'fW^TZ @ @ @ @ @ @ @T J50 @fh @ X"~gmq'pB 804hP[i̛@ L2%Fɓ'gagqF֥K*O @ @ @ @ @ @ @*KNe l\ @ @U%BoGv/nݺŸqbΜ9q뭷G-{ @߾}믏W_}5f̘guV<ѵk0`@92x @ @ @ @ @ @ @q kܒ @ @v ǨQ}7͛{o̝;7n߿N&)ꫯ^{-Lz??viկ~|I@y @ @ @ @ @ @ @/ V$@ @Q|0 ;쳳 lm@IDAT3fģ>'pBh"@`K}9sOӸ뮻@믿>/_G @ @ @ @ @ @ @V r) @ @`c)SsN 2$f͚7xc} ~qǴi;#GFco2*&@ @ @ @ @ @ @ ȍ0 @ @Tbw=f̘_}4k֬J&P\\ c95\{g̛7RV6 |SN-[V ,[o5=,+ iǎ?t^[^^^xǰa+#8" $@ @ @ @ @ @ @ A~eB @ @lOŋQGÇz*?D֭g kYHݔ)S"om͚5{ş:uj[RKV6 'ħ~O7.ƌ+V汾聴γf͊;3fΜ)*:uӧOuF~^ʒ @ @ @ @ @ @ @)d =[^X_?38#<Ə{W,\L}~x糿 |KC|n_ <s͛ *3N 7G}tܘo}[إn8Hᘗ_~y4l0 L!%ARj9}ɱm۶YA$ ]5kVU @ @ @ @ @ @ @% \Ln"@ @J8y8C-{v+{2S߿f}W_}u92 mLz=\_n?Ϗ7.Rxd߾}*x,DwqAŝwK.׬YSl:H^> 8p`ԯ_?L/#1RX 9'7> {_ LۑGx猲q衇\=jM[ K/΂S(bAAA6w=Hu]K;mڴ)Of3٤u/\m=ٳgPK<3&[/ĉI&(om}R`gӦM#2&tAw>[ZhQ|͂*9+f͚m;NiK @ @ @ @ @ @ @VvuT @ @rXAU ӖKǧ~陃>8sH)LK.qDž^=СCN%D kܸqYAC%իW=ܓ L)<1m5v)Zj 摂!;w-[vyhذa듂 +Jq `|C)2}vXl#}),3T @ @ @ @ @ @ @:3Q @ @T@ kgl֭ٛ.X~}sk{lvG})$1!nP?zw6@+Y@~h֬YL4[{ŕW^|hѾ}[c]wѣG{9\{M<9-]KӦMK_u_~,]4w,xsРA_uȭ>ixfz ڵkg˻>qiܴ ~C%CEz_yYxgoK @ @ @ @ @ @ @e{:TF @ @Z)pǽ?jO?hѢExmYgl2;.,,>;uꔝk׮Lwk֬N:) ;,بQO"nvmuk_ZbyieIVqRmi{7ʕ1^z92:8Ξ={~١*϶2JL^x SeT= Ni*u'@ @ @ @ @ @ @ P! +  @ @-pgC e˖U)ώ?0 P~۷ovsϕtgI&EAAA~x\wu1cƌ8S#4dQ\\\r{L81/s$D۶m;#RHߨQ5\nݢI&1bĈz7Wq%^O @ @ @ @ @ @ @ oN @ @*xo|`*KBS`a6o޼?.> ;^hQi_:袋" 4(vi2~dRիkiӧ5\-[.\R@^r_^xawGӦM#8"~_vZtMe޹-9s1tֆʮ}{r!ӟ4Ҽ]v}78HO>d\~3deޑ斶;/ƌ'|r,Y$ΝiU @j\H?UO54 @*hذa 2$ x3$^{=ܓ믿{w 6,zW_}5;,0un:&NB#rO|) wމ`~͚5qģ>)N4)vuX|y6fzן׿gyf<ke!)cӧu_[RSeyT_ _L3Y`n!իX;?]5jTYHG}YnݺO?ƍ>9lݻGvb:H)[ncf.)l1n:/f>kۻロ}3f̙̈Ia)1>N:5S3gΌg_>ׯ~8[4n Kc:?K)3\ #Sb2Ia>g=9ZW喼|c=Ve=M @ @ @ @ @ @ @`[7lݿwm @j@ L?UO54 @*H)T1:4~_eAUZT)rYa)sV\YYr=ZFT:/(((J[[0l[jJj޼yŶmn*~qWg!)ltw @ @ @ @ @ @ @@ tb/ @ToA{TOj)S;Nqe]͚5Ӯg?QF}wܸq_xSA6W\zm ܶ\ؖzjӽ)뮻.-Z/sΩMJ @ @ @ @ @ @ Pk|L @ @ 7&L>`wM7ybvE3c9&z|M/6o8C##8"zY}&RP`ѢEOǓO>cǎ9sD޽O+zU gd @ @ @ @ @ @ @.WaǶĐ!?%@~#FD*gb @ ,[, {':vrH"wm7q3"R bY:ujasL}ѥKXW @ @ @ @ @ @ @ A @䬀 Ȝ] @(0}xgB,Ymڴ8 D&M*"Ps֭[ӦM_|1&N~;ի_ 0 ]_~͙ @ @ @ @ @ @ @ G @I@dmZms%@@qqq1a„ 1s̨SN3wׯ_7shڴ)8J(Rx)SW^I&ū+W͛>8;.((U>&K @ @ @ @ @ @ @`k &: @  @G}/bKYKw .e]P>}{zݻGݺu͋7xzhذa; Go=zd/M @ @ @ @ @ @ @@% D\C @j Ț@T@aaa@ɓ'kz̘1#֯_ 4={wmhܸqecL_Z`ݺuoӧO/mӦMŋgYc <۷oޱG~~~  @ @ @ @ @ @ @V[[W޼  @ @;\2|x7⭷=ܓ쥀ȴu!w^ںu]vZ ۳ +V̙3o1{-]6{m۶m=#N:H޽{Gv*,c @ @ @ @ @ @ @ k岛4 @ @@e4j(w߬m<~fmر1w(..noܸqYi"Ν;;vxh磏>ٳggm֬Y> \`AT-"q)dtܣGhժU} @ @ @ @ @ @ @ doWC|6T` @ #"yScNLK @H!3gf̘ڼybYyyyѦMH:u}Ѯ]l_rB%m[(RcR?~9sdtvɦǒ ѴOᢻKt5k-[, @ @ @ @ @ @ @_   @ @(hРA#k%}S_aaaRm1~,p?5vaֺuhժUi+9OM66ixUVҥKcɒ%hѢXxqiK . i?>+ СC79,4: @ @ @ @ @ @ @]A6*#@ @ )k׮Y"+Vd͋ Ls΍Sf)x0ݿVNh֬YPԚ7o`ԟ%I&Ѹq㬥ɍ6ldun=OW.V\y]:N˖-۬}'g%5kl6 Lz*ٶmh߾}Ru @ @ @ @ @ @ @v ݒ) @ @)[nY=)pőB!,YR&pҥ)0f)0 jժX~oғB-v"Sej9Nue/:.VTTi[j)OwP`tS fI8fIXfΝc=(Y)бuٳ @ @ @ @ @ @ @.  @ @؂@ dl߾}ֶp]) rŊrlSK%$|qڵe?;_?|acѮۑKScIcqڧ02WIk)Tr}:82PO=nиe)𱠠 5j?ta#@ @ @ @ @ @ @ @e;}UH @ @ @ @ @ @ @@n uQ @ @-cGģVixcĜ9GLѫW] @ @ @ @ @ @ @@)E% @ @n4(g3㼼 O*%@ @ @ @ @ @ @ @ wAZ @ @@2%b.~m bԨ? 7 @ @ @ @ @ @ @ P  @ @:n;ë[x≈%K"XzC @ @ @ @ @ @ @T ȪqV @ @R#/K;wxW^8= @ @ @ @ @ @ @ An?ko"@ @ P~-"N?SC>V @ @ @ @ @ @ @G@q @ @^`ժ[o jÇG7\3d @ @ @ @ @ @ @T@~ot @ @|&p˖E\tQ9ˆK/)߬Y3 @ @ @ @ @ @ @*V@dz @ @-GEĶmpC5ꪈٳ?OGtP5  @ @ @ @ @ @ @4AFk` @ @J|2⭷""̉8^ٳь @ @ @ @ @ @ @uF @ @ @ tSGUu6kѣGĠAU٨ @ @ @ @ @ @ @YY%@ @ @ x͈c#.D{1-Q{%Q5[TĂ`D""m݇oFȀӮ=9lYknr˕błiRbWꐟ|IT^=yʕ!@ @ @ @ @ @ @ Pjmy !@ @ P~^~9#>xB-[u3ATRc7K/_i}?J~{;DgĨQ4rJ;Se}:tzrԍ9rȒz %@ @ @ @ @ @ @(qA% @ @ @ pCvE4l81[\V}+/͂ )͛{Q8qVjՈGXoKFL2Oz?O1xXpaaY8o8iذaԯ_7Q @ @ @ @ @ @ @e[  @ @O/" 0 b„ Qz3fL\tEgo΅;d[n}C9~:駟ꫯ7|3U T%*ZJ\M7~aԫW/:lE8yo[|xl1bĈl]G~̛7/ֳg8sW^ɞIVw_T9(9?Hu^[X#|Mt-+  @ @ @ @ @ @ @@Y\V3 @ @W l'NǁGyd 1re]@Ǵo=~,\06m4~\ș3gF^>o/;vllKXLA)믿}=ܓ{# /͛7/$ՖS⪶pȅcF.2"/GZ>:t9cr9Z2=쳣f͚Yb L,kޙdMή>)SNɾ5* LwE#ÓO>9=Ь… S~B7}8 Yy%d!'pBp׿5z.zڟ @ @ @ @ @ @ @ʖ@ղUj  @ @(F\uU">쳘6mZ\|ѳgϬs=7^{裏YfYHG)0k&yxGsc3>_C?<6lw\\tE3s9' <餓kWHic=6  I LϥVVe\2eJ8L"^h>⩧"v1S#=zt|իrK6( -v5 l|7c-\Y~0W_}5Riqv-F_~y{믿~6[l~a$S'x"4hw_' (S_}Uv-+=}n6y+X>v0_q'fA @ @ @ @ @ @ @, ~[#@ @ @@@j"h!CD~~~瞅1cƌ\Y89sb*N}0`@yG˖-c 7̾?Raj)1>cE #L)m۶uFꫯٳghѢE6n{6R巶+վ"trg!^:Om„ E2K} ]whӦMy'g!=Pvo k L5! @ @ @ @ @ @ @@YZV3 @ @O e$zk#:;iԨpF}`[Ϟ=_|E wE~3KK.>2RJ Z &Lm֬YLi-͚5[ު\e$-D.3u눣ZrV]O .,YIֹw}x駳A mlРA{qF LRsOzqg.I4@vmqG׏( @ @ @ @ @ @ @(/ ˛ @ @%,).dٗf?߉1cF4i$oqWxe˖:·s΍5j+8]vv\*L5> Px}y'\sM1c,e~.rԩѽ{%/1~|G4o?XE ,>b|SO]wn\~ꫯ-ok6{W[lů GnVGYg>`.hѢEV?BvaqƎmڴY/ @ @ @ @ @ @ @ʂ@P  @ @(7q뮻 Ĝ9s/̚5p),/=zd^{{dȐ!m&Zj7~)R`dAK㧖m۶uƣ4aÆty1nܸrWx}7 &:%[_㏳ ʃ>R}Uq@IDATo䓊H!yyyQ`RŠbq뭷^\7~'tRy)(rE-:s9Ѵiׯ_}{K]v袋b…C[q~wB @ @ @ @ @ @ @, ,KoK @ @J@gLٍgs'OR'|^r%^{c=bw1cĀ ~b׎??Vyq+wWdR`` <30>.,W^ѦM޽{bС+x`s1ŭqϏJ* ')VZ?Vij7riܺu:5.,ڷo_V̙ʘ;77#rQyGd}'RhQN:Yez|ᵫ*N>ըQ# L!֝ӸB?쳨VZv텷n+욂>,3tz_zk4h L)2՜u]4NzǓ˵[/;ݻwN @ @ @ @ @ @ @%Aem P Kݔ @2&0vlDv=(D! 5UVSf)Tw}Çu]7ڴiK] &dgϞ֮]{f۶m[ު|I)pU$Wmh:#j\4ʊ|ۨ\r.<2^{Y,X?cXxq9')3Oa'N 6 [SpѣO @ @ @ @ @ @ @@YYVߜ  @kH@6  @ yfGQ kɓ'|YFvۈ޽#|G @ @ @ @ @ @ @r"ׇɋ  @ @%!qK@Z&NZ*:Ec_q$n @ @ @ @ @ @ @kNꚛL @ @'ȅF{lDˮSOJFVJ6||Ç) @ @ @ @ @ @ @i @ @ [gҏz`%ڷoZ4l8=zǮ~&  @ @ @ @ @ @ @ PjAW @ @eG"unSsYt 5}}Ę1,H @ @ @ @ @ @ @* Ȋ @ @* ѿYgZEVZśoW%F.*[ 1- @ @ @ @ @ @ @EY$& @ @T, ȂUBΞq͚EvZĨQ=|@Z5D߾_]՘ @ @ @ @ @ @ @_k: @ @S.yysFv[[GL9Z"z*zw9sm& @ @ @ @ @ @ @. Vz @ @0~QW0K<Ѵia) ]k瞋4)#,(%+ @ @ @ @ @ @ @@_pL @ @ ȪUR*U" Zrm,z7oq%W  @ @ @ @ @ @ @eA* @ @ -0u򗟂 {,wqd6wqwUzR  @ @ @ @ @ @ @.PX? @ @ LA[/ߕ)p&DzjD{Y:T @ @ @ @ @ @ @$ "mk%@ @ PDɓ?Grʲ])GrH[nYU @ @ @ @ @ @ @.P/ @ @XyS~RsύŸ9+[{1jT٪] @ @ @ @ @ @ @ʛ F @ @@1LhʹA<5D T#ѷoA%V  @ @ @ @ @ @ @TPA[6 @ @ ,X1k֢qzYS'bР==,UV @ @ @ @ @ @ @GjY @ @({ .3gӧO/\|v.o㧟~Z9s"//XKs\{:ORZjTReckz zތqZ#j׮j>yѰahԨQӵzEJ9Q:6xm8䐈#JGm @ @ @ @ @ @ @ PQAV7m @ @kL .N<4iRv7Ĕ)Sbԩ~?/S[͚5 ֭Dc yK39.4QA@/E{&4z>< Ϛ502Q.*Wa׎&Md묳NV-ϴt/о}SOEcĩFy  @ @ @ @ @ @ @, g g @ @$0o޼cǎ-<?~|vXRcAa CdM 7n%6l05jTXF _VΝ[ gӧOiӦ_̑#G/c ɂB S0d֭c֋6m믿~T^(V?8  @ @ @ @ @ @ @( "SH @ PR#?<7n\ac:u"M74s0l SdYjZ|)YfQԧSɓcĉ1!>Y| mp)(ru׍gGSNѹs,@s{GrKĩ. <ꨟ9#@ @ @ @ @ @ @ @` \}F&@ @(#3gΌ>(>O?~![AcǎY6lڵSc&M*K_) qyM:5Ǝp5*|_g6.])^z8pF|BK#v  @ @ @ @ @ @ @[@6> @ @@3gN|Ɛ!CbСY`~~~&lvXt);ZhQPIAr-YIbȑ'd!>``ʕ+g!oylѣG֭[ԬYsq*+0!"^{-b* @ @ @ @ @ @ @XZqMqFz8 @%-Wd~ @ |^7|3>Ø?~4n8wnKK!lATT3fL9lذߏiӦEjբk׮vmz^\U+1|xoG9 @ @ @ @ @ @ @V$ rEB @* ,A3gƫ/bv1" wx㍣gϞ[G=}epuJ^U/2}\oFΝcwΎ>իSrursF.45rae~I@ @ @ @ @ @ @ @T ,EQ @#   @cРAǂ k׮;F޽cm .w*sao㥗^>(V B{GvtС¹LԈ֭#Qf#` @ @ @ @ @ @ @]@j'6 @l ,O @< |ѿxbĈѴimݢo߾뮻ZkUom,w />l<1eʔܹspqF.]y;ȑ O\jDʕKo*#@ @ @ @ @ @ @ PAŷf @MEP`„ ѯ_xbѮ]ob}*X'n:P ???y8p` 0 FoqqqGVV8FYq7\W~ @ @ @ @ @ @ @K@dz!@:A(T83ĝw>l:q衇~b-*y!C?=P|7ѷo8餓bw/r#;oͻ @ @ @ @ @ @ @@y\^f] @ @e[`qmEb}jժO<ƍkVd~e8\{idڛiZAE\w]D.<К @ @ @ @ @ @ @ Ȓq7+ @ @r~駸c 6/8ʥэ;6 {GTRe9OL` `ڋiOhګiϦ[ڙgFuVGG \Vg= @ @ @ @ @ @ @JF@dɸ @ @`) F~CqUWgƍ?ѺuzJdҞL{3ѴWӞM{7ᴗSڈ[t ^Vf- @ @ @ @ @ @ @JF@dɸ @ @`1QFŎ;|y1z8^zrJ =jڳi=rUq}]F1aByYu @ @ @ @ @ @ @(A%nV @ @?niTZ5>䓸+~|)gM{8崧Kը1p`D g('  @ @ @ @ @ @ @% MI @ vZtIqW /ڵCCL =r'xb^/aÈg7< @ @ @ @ @ @ @yAk܌ @ @ /?x衇м3<3*UT] \rIlfqeZ@IӞNi^^ [x晈C#>:bŸ @ @ @ @ @ @ @ P4AEsҋ @ @>xg_߾G^}C͚5+F~a.JrէF.vi=_^Z.DYy)S*=ve]"qEE߾}c=6UW]f͊#GfF?c{q$S(>E c9&jժ }ѹ ѱcǘ7o^v_͓B o 6 Zkav(ZR[hڴilҤI(;참;ms ˳M!i3fSc L)1\VR%ϟt>1iҤ\r曱v=)3/Fnaָ&:%߁n9bĈ^\ @ @ @ @ @ @ @ Pv*UN @ PRxߺ[bewy+U]v]Z~bϮ1cD LA9,$N&Scj_|qwc? 8lڴik=zDz"՜w1~ ^Oz~,tUV1lذH_?Yb_,Jm9|,rM63OWw}qqee$ĭޚIN0!O>d{uԉ/2 LsԻm RcA됒sK.'#:unqgǖSOE.3b#r^#@ @ @ @ @ @ @ @`9 2 @ @@ aÆŬYb1?VJ<_|q%Đ!C#5*ҽ޸K/kxѰaJ/XֵxmSL\&,jժѣGlyVd.S?~Y=<w?o߾G齧嵭VsELq !-+. @ @ @ @ @ @ @M@o4 @ @J^瞕xlw]v̞=;eڅ ozSNB HAG}=J5j)q„ W_-1F˖-묳׋KO>qg;v,u;@ynmD [{'yF @ @ @ @ @ @ @`A'  @ @VRaÆqge]'N\ɧ{Vڌ3 [`Av_x8Oڶmu֍G}4 V8t#q^[I ˋW??3F?)7n#(zѵk׬^{m j*|Yp zD\s5!ϢA @eC -l[ @RJ^qM7s=oԬYsMժU˾YH`~~~vioǖ[nna{3DoDڵ[n-./3gN;?n"pW^y%D߾}kT_,q'dR>,9=1hРh۶mԯ_?N?Hƍ˞ݻwԩSgbZkx衇{]iֱcǬ?y/"3,;_sȑ#{,nڐ!C"`&wF֭cv_~9{W)82^x!>ԩSfm UB-{HA/R4lpF)lYD#7"E @ @ @ @ @ @ @SR׀hyk @D @rc @oH[`d!y"BSbFOd!Eb͚5+F8֫WoHsz7.^{m|ǑBWwq.] \ϟ??ґB;SK6}U꘮Hc ??뮻n+N8!#\jy\5 @ @ @ @ @ @ @X9A+7 @ p܂  @6mZy+u]'xbTTiְM2%=8CWد;_̙;wGs?mӔ -c's9'zoъr>[Ud k'@ @ @ @ @ @ @ !. @UA& P )8o.(6tӸۢk׮0bܹOpئM+N:? 6̂ 4_kraÆi}Q\yqg`;1}0&MV'@ @ @ @ @ @ @ PzAw2 @@Y*^" @@;vluYYa^zik׮B5~xףGG͋{Q{7p, /cʔX{#j. U @ @ @ @ @ @ @@ T.!H @ @`ڴi_|1R^ǎCaÆ`J*kf͊wyGjio=ѣ㥗^pڲMF<\Ę1lW @ @ @ @ @ @ @TA-[# @ @ YxO?&MnݺEϞ=s疡|u)"YidڛioG޽j9G}W_CF۶mc͛駟nH{.^L{2ʹG^Պ.V ӌ+(sz @ @ @ @ @ @ @(/ ˛ @ @@9֭[w}1iҤK㭷ފrIrlA\x… -ҞJ{+ҞK{/ӞL{S[5ֈK.媍) @ @ @ @ @ @ @eUR>x#Uu @,-q|'@ȑ#Gs?|Ѳe;,G޽N:+?'*?gy&|ɘ8qbt!:8âSNި5bР]w-эG @ @ @ @ @ @ @t ,EU @R# Լ  @1bD 0 ~xZjѳgibw-"T]yyy1dȐx㥗^7x#ϟݻw=3ܹsE&Z#k?Ȉ#^}5bȔ&!@ @ @ @ @ @ @ P K @/ # @? L:5{M4)ׯ[ou٫W,v??̞=;{,1>?D-]v%M40&a}#N"_4T @ @ @ @ @ @ @O@52 @\," @@9rd+k'N*Uo=z-2umQT^:Džϛ7/>w}748ڵkm۶5jsѣcԨQ_f>>_]ttlfgjժeaj :ƶF[re, @ @ @ @ @ @ @ʟ N P ` @@8qb >< LA#F/"Lr.UVѦMc׏u]7լYt9gΜ0aBv7.رc t/???+iӦFΝֹG˖-KbT^=b]"N<1P&@ @ @ @ @ @ @ P*ʪE @ @R`:vm%1cF5* 3fLaH᫯Ǐ oҤI6Fͣh֬YthܸqTZ>.yL6-N)H3_uLüBR'@ @X])p7ώς S d:&L&Mʮz+ Ac…K<^nhذa4j(\^zQV]v5kF*UP @IDAT#5|\駟"gΎӵ}̙1}HZ|֬YKRJSf-̍6(;oժU Spfʕx֗%p]qZo @ @ @ @ @ @ @[@d~VG @ Rpa˖-cZ)hqԩGAbg SL_|3f̈q@ƥ$;Y1HAP֩S'R8fAe qL!Y{M4)J@Æ>1o^Wu @ @ @ @ @ @ @~M@G @ @ |iGԩSFlK n3CF}t…Ku @ @ @ @ @ @ @@YF^2  @ @@ yeЗ@%b#.׫B @ @ @ @ @ @w'`^W?:, ( JefKViܻf[>XZW3MSKrK%]\@XU@v9ܙUa73 |]_F) @ @ @ @ @ @ @. _ @ @R҈AnkWq%Nמq) @ @ @ @ @ @ @$P @ @%0yrIJe}ԭy ~[oEPȇ8W @ @ @ @ @ @ @(\;4##@ @ @`kƍ(*{k #pqQoxܯ @ @ @ @ @ @ @)A5%_ @ @H`؈]#JJQ%P  7Gqa3g=뮋0 b;"@ @ @ @ @ @ @ P kR_ @ @@ g4I(ЬYwG4nq oDXq8pC"@ @ @ @ @ @ @ 7q @ @*0n\D߾uuvE`}wwߍ85_ի#jM O:C @ @ @ @ @ @ @AV  @ @l3҈An3` @n{ĴisD ,/|qG @ @ @ @ @ @ @jV@d @ @@ LlYD>Uڬg1ujĪUk(+> @ @ @ @ @ @ @@M )y @ @cFл޽A$P'FOĘ1+W? ǯ @ @ @ @ @ @ @- G @ @` Ȯ]#JJa'&P@?o6jqUG @ @ @ @ @ @ @jN@d @ @@ >}Y (Xw6,bժsŊ?1b  @ @ @ @ @ @ @Y @ @ PME[M@tq/OP%K"! @ @ @ @ @ @ @k9l61y @ @R4bxA4('#+k׈ A^q+  @ @ @ @ @ @ @X ?  @ @˖ES8c2-pQ&D\~yDVA |啈^9{ @ @ @ @ @ @ @[@du @ @67.(wmԁf xӧG{0F >mZ2$@ @ @ @ @ @ @ k5) @ @(0vlD׮%%qL`}V".4bĈcYs}Ŋn?!@ @ @ @ @ @ @ Pщ> @ @)Omߏ Ƽybyqb"~^1eJW=x4,Y/ڊM֕+Wfhذ&kFyѬY\nvo  @ @ @ @ @ @ @@Yޙ @ @ؠqCnҥKwߍ3f̙3+gώ9sT{/@uK jlxѯ`E cycV;׸q`M=6"˯-_|~a̚5ڂ <ϟA'SP;m۶ڵv):tPرc4mڴ  @ @ @ @ @ @ @jH@d  @ @@U #=*[HӦM[[o:wܵBSamڴW!n:${*גFYc4hrB֊hѢ 9o޼|AEf Ü8qb<9(3[$N:ڹsڵZ5H* @ @ @ @ @ @ @^붇 @ @,0eJIJe}Y{}HRKS0aBL4)ɓ'LJ~ rc.]"~9pw:M6jƍy0X 6,]4BΘ1#i;F;3__zunEѽ{ѣG={^z4 @ @ @ @ @ @ @Y5Z!@ @ PcFeE5: XhQk1f̘ز:k֬|OFrngSNǻk.ѤIl@ ڵkkaYYoSdS(g L+Vȏo>{Gׯb) @ @ @ @ @ @ @-e^&@ @ P),-dJ/R92^~5jTjժh֬YY@i8tӧO3uuM/8SMrYreL:5&LƍSO5\K,  ƾ{W!ᐕ @ @ @ @ @ @ @W8&@ @ P RdYBZLO?t|gsH`iiii&s11`\S` Tj@ ,6lXRĉcѹK/4Ν 6a <8E'@ @ @ @ @ @ @lP:I @ @@;6kW!@GgqFt!N:y 7Ĝ9s;o|B =!ѴҚKk/FdZi @ @ @ @ @ @ @Ꚁ ȺF͇ @ @ ѧO o@iii1">OƠA_K.$f̘v[ >|xnݺk'PTTzZ)4}[P @ @ @ @ @ @ @. ߐ @ @؄. B˴i믏 &*U^ѣGGW6,ߓO>{o, ,e˖}ͫUjt uLk>;,} 51:L @ @ @ @ @ @FAՈ+ @ @U)PZ1gNXxP~Q(+'tRU9*iaÆ1qxףA)sco{7vu׍Vp;vrJիF_\c+פeZHB& @ @ @ @ @ @ @@! B~;F @ @`SD\ٱ,qy̝;ww}>Z)to-[,ġĘ{ク袋'?Iׯ ƴ(..Gӧ 'PZe Æ 2}[HD6 @ @ @ @ @ @ @@ _q @ @%cǦvȣ1cFm6.]瞋%KD㬳Ί;R䥗^oFN?i>N?fϞ]w]<뮻D+ϙ3'.=zth"N:8Cw 7DӦMs˗3<0`@|qn @ @ @ @ @ @ @@! ,ķbL @ @6C Av1s] u<蠃r d [`Ap qUW<0>R\foW΁o)/12u>rvzիWyL3g!կrX_ ҥKK!|)L;_|1lذ΋o9o%%%q MF~x;Ha5QRh U|rdϞ=shz)$1SIA /| /0( _=N?x8jԨ\rI,\0_۷o,Z( Sc GM_/ĆC=NSj&RI1G}4oΏm~+ۤuLSwͥ9}_s[7kHA:jyX<z6{z*z豞.9U~O&Mr`f6AV9  @ @ @ @ @ @ @*hPEh @ @jHA{2Х1f̘vׯ_H_}̛7/>._j碋.e]!CľUVɓsύ~M)tST1"כ3>}d4֭[s=,R?)1L3ό晾ԚW^y%X2TIi  @ @ @ @ @ @ @P @ @M e&F߾:t-.~A'NsRʞ{Yqz=G hL;n-8N;-wm],]4:v옟:thKSx|~gV\Y:hժU=M4O;'bܹ9xG<36k|k5TGZl> }:k#3~vk_(--qy=5JfW^y~`TlٲsiP> O>9@9s6XަV^\sML!%rw#C͇~{nܹs]L~7 .aÆҏ#8"~8+Υʖk]ƃ~  @ @ @ @ @ @ PŅ:0"@ @ @`ex1~|ĹF<\ǘ>2dH7|3߶Unt66f&LA/==lj)TW^~w}qWl8R`Eb_sI|,7<8oycecs||g Luy[#[*[{ @ @ @ @ @ @ @ UA̸ @ @ظ@Yc,[ѧODǎ!rovew·۷8am͛7Ͼ m,^8f͚U~*yWǥ^?Ok_Z7.~_F&Mbʕ+sX_HzK_RT6q^Wcǎ~@Gm "[N<ޒOrKr!:nƍ)@rŊkݺdɒX|ym6ꩧֺoy<|w:%k=XE[HD6 @ @ @ @ @ @ @@ ,7c\ @ @6!PEE{Gt!10 ?O/͚5)4*u&wm]1"FUqUroYqnc;zht%.<o}+}/RPG38#fΜÇW_}5֭[}T߅x}⬳ΊEs)1իWƶ*k?agy&~|rm)uw> ng7|%yo }P\U|g~r77pC,\]pxk,+ yH߆B @ @ @ @ @ @(TAf @ @&Ǝ5$"˽9`1K槧OǏad?]{?)ƕJ[m:xmܸq}9ӟt\|ŹO~ѭ[g}r0^z`ʔ)u4h N=F K}G˖-_(,Lay})/6ڵk[:r+|_W(ܳ?dȐT G{K_R9LkG@ʆF/{GHEqmEO?=N8N̟??oӏ={mR?)05cCc78s#`o>>ϕE]77Ϗ^{#C9${~ѦM|:9s=~n<;wZ.8#sp66d/Tӏ+WFRd& @ @ @ @ @ @ @@! 4,틫j#Fi| @:"P yU:c @(˽+ O່iӦ_kr 7zkqĴM!`;#{,~ /g>=P> ~x9rd~_Wvaq饗F ;3cܹBS`\j$%UV*[ꫯ +)d2:s1w6RH^[*ρƳ>;/b]vO}S_Fr;uGcСQG9ߴZyG')ܱGѶm۸+4AwһM矏ҏzO:(+䵜rZL?fSysaNrXѣk(}+[ji.H[ZRpjf駟lԨQ;X+/䒘8qbӸe eܜ9/N;]wB7yYgżybҤI9DܤgF\ӻJVOn=ygoyQSb L˗{.^n3'w 2Xx{cƌtmCTٹLɬ}55'LRY˿WRHf޽ @ @ @ @ @ @ @_@d PA֪e @@=(y"&LzѣGǞ{YOLsC) Ogy&~_ƩUj:'?;s]l2nmt1?q=ܳVO>[Rhe;8ovY> @ @ @ @ @ @ P_D͓ @ @@]<9bٲ>}̨cǎys8fnZ)6]{q_+vG|;j֬Y媫3&MO?~x1lذcРA<+1ѰaØ\_"{, u x:{bqmEΝkL  @ @ @ @ @ @ 0 @ @Z'0vlD׮%%M7{R@-w /+98bȐ!eaeif y0bi}>捫Wx ~_C=zh9rA+ @ @ @ @ @ @ @MA# @ @D`ܸ>});xu1lذm◿e̚5T4iB sS-hZ)3ݴZNkZ!@ @ @ @ @ @ @fA; @ @@;6oz9u{Wz1eʔ8.N:`ȿohѢѺG ||ZLaim5jZi5 @ @ @ @ @ @ @ꂀ Ⱥ́ @ @F/޼m0Ν;~x7o&M'm۶/~q7| z$ZKk.ZLk2ʹFZMkV!@ @ @ @ @ @ @%4s!@ @ P&OX,O>SqG`;cĈo~3V\?< m=$իWǫ>`z*ZkSd $4iRL<9N~cܹ:B!~ڶo>ڶm[Q۴i;C4jԨٺbŊxќ9sΚ5+f̘ScO5AdTy!ݻG=rg T @ @ @ @ @ @ @6Z%@ @ PcFY@[DII7A5&i@IDATS`*K,wy'zxw߭6?~| @ @ @ @ @ @ @zAV^ @ @|l٧nFj@ eTPddVXs΍9smyp↶)P2_hQEc ULmdiԨQE(߉NѳS9M6١<IJ6]k۶mmjC!@ @ @ @ @ @ @(lA~ @ @@qCV!@@ @СCNoniiiE0%K*/_GYÆ ?6n8Re|?=[^:ߎN/}- @ @ @ @ @ @ @@]Yޢ9 @ @y ?>sTM@ -ZZcO=5"N>9GkzD'@ @ @ @ @ @ @*UՐv @ @v'G,[ѧ϶CG1kVah @ @ @ @ @ @ @^@y @ @@ QTѻwu#jX8bĈ&M"=vMl I @ @ @ @ @ @ @U  5A @ @`[ ѵkDIɶI@GĘ1v!X @ @ @ @ @ @ @V@y @ @@5 >}C] P0{GrK 7D\vY @ @ @ @ @ @ @ @R@Vy @ @@u ѷou/ I#.4#Ff, @ @ @ @ @ @ @[* rKO @ @JK#ƏY#PpD|k~'  @ @ @ @ @ @ @`An @ @T˗˖EyG?;⨣">ߌ  @ @ @ @ @ @ @uA.L @ @ٳ#v%K=/bѢ5޽<Z&M"#b}"ネ 5 @ @ @ @ @ @ @Ԅ ȚP' @ @sDSFLFX6mքD& #HCN Pgv)⮻"8܈/S51 @ @ @ @ @ @ @@hP'geR @ @j@߾kzuiʪUk!SO~&,r? oE\}WDmK @ @ @ @ @ @ k3z @ @:(5Ċ"v5S6~+}㎋ˆOxɺ?_3$@ @ @ @ @ @ @AuM @ @@/bOgժ.(.= P?# "Os6K @ @ @ @ @ @ @@mYߠ @ @9=XrJq,K(#:t8ꨈE͖ @ @ @ @ @ @ PAƷf @ @uZ An/U %%GČ'zu}T0g @ @ @ @ @ @ @@Y{ޕ @ @֭#ڶ]~_s-ХKG{oď~T-̞ @ @ @ @ @ @ P  @ @@i^$#2'ocB @ @ @ @ @ @ P  @ @@0 qG~zD>g rJ9D|/U @ @ @ @ @ @ @ ނ1 @ @XG`="V 6&_E q13gn.  @ @ @ @ @ @ @jJ@dM @ @&Xj F\xaD6x%@q͚E|˖!@ @ @ @ @ @ @($A6 @ @ QT @slG}wGz?N @ @ @ @ @ @ @m/ r @ @ 4kѩӚ.4"+=#׈n/I @ @ @ @ @ @ @lKmٸ  @ @+b…kEŋs]dz˖-KFVOR{˗/uqiiFUbɫ(Un/;=N9e@zjD aÆ5ڸq6mM4m͛M6]w$njG!@=4?"8 @ @ @ @ @ @ @꺀 Ⱥ͏ @ PV\~|1o޼͟??,X ShJqqz!)0<4|B[n7JusAnSc*A=v}f0< LRX8e0Qp@aM4![lڪU~U6hS}F@{nĘ1s{WMZ!@ @ @ @ @ @ @:A[) @ @!gϞ9sO^szzlѢEE` ,e]* ӹXSM!V>񉈮]kfT)2C8yY7B$wqhӦMަmڮ]H5w uW]1aBQGE<|DYB @ @ @ @ @ @ PC5[ @ @/Soiƌ1s̊mOU.7a){) nѺuٰaԹ L)35qKiii̛7/ʃ!˃>Κ5+ƌAS:ANvСb;G:u[k9 ~GOqE @ @ @ @ @ @ @Ԅ? u} @ @j@ KӦM7|3Oi?`5h ڷoRx_^⠃KRcZxNHA[2Pٳg0"Z>yMUVU4+S(.RQtkȺ"Za@%_q]G|;]v  @ @ @ @ @ @ @M@dQ @ P/I&ĉvʔ)1uHbŊ<ױcܹs߿O{| KA S@h&BJS@d *}ws([o1c}4j(]w5uiۣGO6o|H6 ?Gw\D~Vm @ @ @ @ @ @ @j ތ @ W7~xs0aBL!zz*:tݻ琼?u5oS࣐ǭ~bSh+)ӦM؎7.1cF~(ɞ={F޽sիW;M]_я":+liǧ?]gd @ @ @ @ @ @ @% v/%@ @lY^u̘1y-ZiӦMK!wvX#YRRE}@! .]亡qob1iҤ\xHms͏oO>ѯ_c=6o~CM:G.(xD 92B~ zG @ @ @ @ @ @SEJUִtUբv @jZ`ĈJWcMH @ L:5^~5jTv̙y:t}Mav)qv fF?~|ձcȴ1cFavƠA*ݤUfreijFlݶM @ @ @ @ @ @ @ %l  @6( r,N @?~qEE|BO @ @ @ @ ٻ(o"YA((`C"lҼQc,h41yhbIlAH,X"` ,AĂ E mߝ 0Caڳ:sOJ?  @ @@@d5$]$@T 6ԩSc/ƿxݺux^ze *G @pQFkǎuf뭷}ƮVZUN'J`;b=".(WZ梏 @ @ @ @ @ @ @. IUHY k| Ts??m̘1QXXK'vyqiӦgPzJ ̚5+^yx饗߹Ľ#GƜ9s{{fƍR!î wqFsLU> @ @ @ @ @ @ @j@;4##@ @T/'Ɛ!C'#FDAAA7?ׯ_lQ9zͪ,uhѢxcYmK,v-<߿t!֕)DviElYD^e @ @ @ @ @ @ @j@\)ayw5=`yը @x衈[ceH @j L0!ʽpӖ6|8蠃b}Ѱaêa!@ϟ/B :4 }#8"֩SroSJX8racDƥ @ @ @ @ @ @ @ \[A @j >G"0{x0_Ҹ뮻w3?8Cb->i#0nܸǏo1hNc=6b3=%@` uc1`6mZtIqyY7,Ծ{07~#&@ @ @ @ @ @ @T@AE7~ @ @@m=ztzѭ[O?0janaV"bZdkGZCZ֔(*B`#x #"ZP' @ @ @ @ @ @ @v o @ @@ |'qGǎ;na;裏ƾuԩUM@M(((֎$)imIkLZk->]eE @ @ @ @ @ @ @@Y  @ @ c- رcklԚj+K`Μ91`8ꨣEY7J;.1".ڵkeuִoW\m]\qϞ=;8cSNAEQQjSQ$)imIkLZkҚ(o8rck_MzktAq 7yEdZ'c8˹f @ @ @ @ @ @ @5M^M @ @*S wq+ĽԊSV:ue[׬Yoz*Rx`*K'NwuWL>=}\a)e_aeb7.Frj ,Z(=/;SƉ'oJVys.]!Cęg=\fMn'P_1~|ge[WJi6lX<ѻwlv^dIѠAH[\f @ @ @ @ @ @ P+Z4نJ @T̙3cO>$ YީqUWKC)k=ŋr}mڴO?=vZLiœN:)zQ|_Yemڴ+"fկ:gĈ{;_}f_4hP[o5ƏrJp ɓ'\ثY}۷n!>}/g}g}v;F>h3guV?]hQ :4n7xc3&t{N;dMWjuunN;gkVZE ;Kqꩧ:tdӡCcĉqA~M7/r̛7/NwyYRw?׿*9L88뮋ѣGfrAt.egάII߳/2k((C'}5kO>d暄LIV<ѭ[\hcqn'P@{֑[s˼u/5{w}7ڵk_uQY=ˮi]OkRiӦeQZ?o$S)k ~wvmO/8,Xu] /W{$ w}w$.pf:\ֻ,,GzmԩѳgϬ( @ @ @ @ @ @ @@fc42 @ @@ `Wx[kK/gqFS@c>*=k) rBSU K{}Q11u]YU :sk & Ks΍7|3 5jjuz8;ȞO)1x'Ʀno߾ѽ{,IJcǎq衇fcI ;llO?t<[[Ye=LJ-ۏ'd)4򪫮_ѨQ,D/格?},3Ej/ 80 L/%}gHaiSenjI߷^zeA)3nRe K\YVY?8;x-[BR\U.i Jߣ&)[ lW0ֈaʧo9vmH{~kG}tyY%[N\pѰa,8 )5y睳5>YSL߿]Ru.2/ӻ"ݓB;'}T~⫯Cgώ<ޑ龴KYt={S0qZ#Soq @ @ @ @ @ @ @@YԈ @ @JH=zWɿYbݺuЬ"`?N;eǷrKRHa K͋Çg׏* LY Ȏ[h/r6_ǒ%K_̮&M_(Sw}@tܪUfmaƕΥPN jРAx{YXz.{M0!ӟ44iuJ!\YnRL.ۏƚ-g]LoFSZ?EgIA)1:&>}D 1cFG)hCɚK4 /VwҸJ47nmSQ|5)ӦMK˖/bKUsZҚ[GRbz|ߏz([cJ[Kڭ[lmJBk^?яG r5$Py==JzϤD_Rc @N!mQܳg+z=:szo55ͿK @ @ @ @ @ @ @5K@d͚O!@ @*I @M2Z_fS_~m] 2$ :s+hܸqv\2p/Rرc{Yfşxcuڵk~Wp馛f!:+ ޺{"K7> W^y%R0X*%צM\ ,,((Ȃ>ue'*菒ݻw3gF ˗Q|6boRe m,xx㍳|}8}k׮۲}oϕsuh֬YH ],\0;նme/Ui-JkB"Ғˀ\fck[#S\SIAiM}GcРA:B>ܹsf{ZCRc MmYI}]hQpN9ڑέziW\V.KҴ^pԿ^P @ @ @ @ @ @ @+ έ @ @Pz(u7uQG''N5o޼V>Bf̘ײeo0eU´Vp;#Znzklfc-WM>1]hРA޽{?VZJֵ܃t^zY)l1_GYϥ}N*ymMSg UI}q^rҬi OTmT̙\o[h}XN5(E(}/" 8؈RSW> /;?뮻f%וUYJgxײ7ߌfְaå^v Iap@ ><{'BSwޙ={7gA~O.]6~hڴiqR?Ǎӟ#@ @ @ @ @ @ @j 2A @T~hܸq'?܎EeVm6y8#VT ZKJA/#<2?|tIY +XËv)z\ر1k֬nR2-O?_RYV]%ϯc*vYKޓBRIU^% O>$&MT{JV:_?lY … cڴiѭ[Wi JkQZ)IGxو.[6h_|q J[WVe+YRZe58N:u˞8묳"vmq5\'xb;q 7zzZ>]m)rG-{g @ @ @ @ @ @ @ Ai( @ @@ 4m4|/s=7LGuT?m6FӧO/aÆeߠA컒|z^F__Z|H̜9ܤ`Ҋ(oqr!YhKY A%=i JkQZ-ȭӫڎ;=Tں.. ܹsC=ofiHaqoh߾}ς#=՟"WVV.KTo{jȑleUN @ @ @ @ @ @TcAxt @Z{g}6n8#VXY=OA7tS| rL!\ݺu͛/ե!CdS]w]vN;8\te]oF,X }xpI&e(p2a?xRe*}mڴO>d0ԕ?p\r%=j\~_Z?JkP>̙}LgSNk6RxcynƘ?~Vuw}7.hѢEv.XWܥs sM4B@||q5d?N͗ϼ_|mS [AAA\wu~+)H*JkNZ{"8ȅF~zDn]+7 СCc 7/8;Uں_Gtc~MYnW]uU۷otرwRKkgՑu]1n[̚5+\2hwY;s }'n8sc[^ @ @ @ @ @ @ @% fͧ @ @,G)|{S`U)/)˂SPU KV%K'%@z1|_~ޑRpV JVS֌3⬳ʪzW#GW\KaX)oUK e]΋O>9~đG=V[6lz~YV kժU64D駟B*ShװaòSe }̗To : qeN9ϳ-ۏƚ7|=zȜRS` '\n4'N) .~_dቩ{.k3GX;.V5 {^0B.SO,8RB @ @ @ @ @ @lA5{~  ךP P~ӟb6 /0?XoL>rԩѲe 5\^a)drذa+"/~.(9昕W7 _\::6a„/y<磲濲-鸶~m 4(n,֔V a8*H @ @ @ @ @ @ @US^^ @ @j@ hk .o9.'|ru֭J 駟VX]v]5j}Yfq%^z\ƪaÆ1Ҫ(>WQY_Y#رc㮻ʶ"{gg믿z@ t ҍ=nRrR@ $>Sʼ @ @ @ @ @ @ P}Jyu#)CO @f3?8餓*G]СC'?IB:꨸+,sE}qbR@ޠAb1f̘{SO;,u7F.8bK.?Oq!~@MA @ @ @ @ @ @ @ 3k\ @rYN!@|q=ăoݺu:ݻwԭ[*Ԍ3aÆ6 ̟??V4o޼GL 5*\x;vlzd.㏏mVnm8̈xȅ/Ǟ{&L;.3 @ @ @ @ @ @ @, O @C@dy(\ a 4(  z)6m{WᄆGNV^;Vw?lذx瞋Yf;?Zͦ.+pac'GjĆ.} lA7s=w> @ @ @ @ @ @ @j >GX[Ak+y ӧOςz?}Yk.[.ѵkרSW *E(}9rd1" țmڴ=3,uׯi@E|eDG b 7=zDnݢ{>7k֬;5L`̙1vl3fL뭷/:uD.]gϞٶ;d5Lp~qUCFH}n' @ @ @ @ @ @ @j@>>#@ @x4ׯ_lv1zH!uov5*HSiӦMt5b}:n׮]ԭ[7_=Z'x}g}y4i$ VzCVvHJ\~jydD.8:w8 r @ @ @ @ @ @ PCJy-T|?  @C}Q~k&F@@&Mcǎn7nܸlKӧOφՠAرct%9ۧiСC4nܸ_  ̝;7&N}Q}Fڧs ,]-2ҖSu۷:uU7/o߈ox刦M#F}G7 @ @ @ @ @ @ @j 0HX AkQ PMQrKx_uH6h,2k.6tӥ-[W2R_|'O?x} BM}ϗ-ZDN6,Jnna6{IO#z3(*Zq\PN @ @ @ @ @ @ PAV; @@ ) P3f&L'N쥐 _~i&ڶmiK7xhݺuԩScӁ#dɒꫯbʔ)}Y|KK[:N… S`i~СCf;v͛7/FW"v-##=,[7  @ @ @ @ @ @ @AVh PAV? Ps̉I&'|RȗK_D ˗zE˖-m6*SPlPB&#O;Ǵ}weڴiE M ͇o&Ѿ}(,,,~UG`O# |OviФII=!@ @ @ @ @ @ @T@ W @ @D u-ŋ@)Sdi?uԥBy ,WU K-Z͛/O6mZ5k֬8=}o:Xso&fϞfʶ3gs3fȶz} }L.[[oH!)$4j*z֭[G ~LtnݺV3D"ƌ8㌈˂^{8Ct @ @ @ @ @ @ ure_#.}' @+Cyk @3gNeӧ/*S`>0NV qƑ+Ӗ?NFeA),qÆ #oРA~V8K!iW^q\K:uJRdWڶdɒH+-Z… #0͒o-u6o޼l?;wnǩ/4| gi\R[##^=r!;wH  @ @ @ @ @ @ @Z+P֎  @ @@>}XSx[>0|:uR!'r窱@- ,?n޼yY283?7}>1O VE Fs'o]C @ @ @ @ @ @  @ @@ID7޸r;^`A@ȴ_paEbőߧ[ \v⊾GE k,k[n,իW/;׏ d\ L{UEiӈ!C"z< {e[ѣG= @ @ @ @ @ @ @T aU) @ @@MHAӟFlFnSS錋 t#=cvrs R$@ @ @ @ @ @ @j@A @ @sDV:B`=M7EE%@ @ @ @ @ @ @TA`t @ @ ̝+ϲ "sύ8̈NVtk @ @ @ @ @ @ @- zϟ @*\ofSh P"&qڬ`ƈ^">8b4" @ @ @ @ @ @ @) fΫQ @M୷յuէ" @΍Ha_sI~S'#.M7V @ @ @ @ @ @ @-3m @ @UV`Μ&N 6 bȐѣ#9g6) @ @ @ @ @ @ @:5C @ @,Ae8O@m={"#O M @ @ @ @ @ @TA5uf @ @6SC#6 "{n6) @ @ @ @ @ @ @@ `` @ @XܹQX;]'@@҈8Ȉ_~KD!@ @ @ @ @ @ @TeAUyv @ @V̙0A֊6HVS#t?b>\ 4iܖBrS\b̛yjޛ S0"fLA&LB&q \6P2MFoZ֭[Dz4G  @ @ @ @ @ @ P> Q- @ @H 5Ak!F`ܹ1y㏳}:O>}QTTTz뭗u!z]&?h" _WE&fxRd L[״ ϒ /~Κ5kR(g6mm۶>k.6tl% @ @ @ @ @ @ @` Wn @ @&0gwUc„ G-/ 4R_ r-֭[g͛7?b_4iik߾*<}NBAKG lذaPڱcǥΝ;G U @ @ @ @ @ @ @A @ @*Q@d%k@ Xxqߏ> 'QTTYfY8_ mݲ֪ؗUSN 1H)4re)rٖF'M?!CdAa-b6.]d[l]voܸqyu]= @ @ @ @ @ @ @ S @ @5Y`FWXXGil@ |L!cƌ)ƍ>.X e˖Y^Νc=O{i!дi֭[V~~ᇑT{oL81w;n&Y(dk뭷ݻV[m^:G @ @ @ @ @ @\@d5@'@ @s|9W{@y ̞=;z=zt~ر SNY@mYd˳"P.뭷^lٶl)4C?>yx[oye;vm6n}۶mg @ @ @ @ @ @ PAVY @ @&lܸxX fAFW_}5R(ޒ%Kb 7=zD~?qlYcFVj 4BMj}Q3& EMwuWL0!uѻwa-ZX @ @ @ @ @ @ @@UYgG @ @j@>  ̚5+Nj/Syb6^z~m2#P+ sv̞=; N}"msO\y&뮻F>}o߾ѡC @ @ @ @ @ @ @& ͈ @ @*YnDFjK| /?Æ {;sqپSN@ @&M/3f̈_~9^zl8p`Ȏ;{G^ѪU# @ @ @ @ @ @ @AV @ @@mHAfc'P&NO}iӦ5oFD7o_/^of1"9,r?8izI @ @ @ @ @ @ H @ @( +&@\ƍ?pl :4~_GV;,}g @ @ @ @ @ @ .AKmm @ @XF`\AːH|1p{m6=и;"+T@zb]wͶ:L?x(&MiN͋>8 Y}ꩧs4o޼: 5GWYfŷ~ig̘usĉ㮻ǯe+ݐ8ǍGbVN8Sb̘1l+zZ63K @ @ @ @ @ @- EG @ @`5f^ qUWe-lq9FkY~uר C{/FZJeeݳ,Y{g,^xU6m駟]v-~sI'=z(Qc-ro߾qꩧVj*~w}cwyJS @ @ @ @ @ @ @z @ @5T`U4iR{Kխ[lUo:F4+2z6lXm۶[+ֲ.欨hWrϔvnUQc]5DiUeqmE~#W @ @ @ @ @ @T3c5 @ @g뭗F^q=Ļڵ/:lx~a_>>{:4㏏N8a鹴M:5z_|q4k,-Zo=?č7cƌ*~ƒ%K~q%Ĉ#^mԨQ\s5ѹs8svS0V Lc{#Aq'OoꫯFaaao>n>N6-?ѣI&qI'e78 Pq}|b7ּGy$z衘1cFt)o̚5+ ] g}6ڴiW\qEl6Y_uvO{;_ z 4(|ĭǏSN9ede(^Zֻw9rd dlٲe}qGf)81N<,d1B/hذaBSb0BS0W xq#{SZ :~: vӧOv>>x5s\'@98p`9M4)߅8㢠 z8;(G;`@)S=7; P)D5zPWK/eػp/Ǽ괪PcIEhK52àfƾf1vb$k_N2bم,I*w9uN,ls/:_),14;67>鳝 {CS`,нJ堃a7pC)5V Ribѿ5jTW}+z=쳱6D.]re K"VRs*v1I)sIw1̛7/TkQ\?K)lCk =3=O4)~go/=csz 6_1wk]vɡBoeƕ~6dtSI)t8_yRge#'}FRB @ @ @ @ @ @G@⨹ @ @@ ̛"Ly/8r!ڷo)$lmG mkӦMlFca@uW RVzWn)Rc aLaf)H.KAV)2;зl0~:W^xy'aa͚5~,HNʮNfG0T:물?~|t).o1A95Κ5+7u%DvzL!)/=ORO<d6l믿~z&SIyʊ+/B>?ܹsg*cQe)|6FFr9sJ(+zN|ѢEHϦ IK\}ՑBClwq7nyE!&_~9&OaUYRcz?P2yIG)2ri4JSOy.tڵEwT;齛  @ @ @ @ @ @Xsk @ @ӧ6Z~3f( r+nͻᄏp(SւK.%vi;B7)P-m&yIAm묳N|׹n۶m:կ_?I-[AnIXk*)m̙1{*_2O?7n\6ڵk)2;s1gmݖ|71t2dH=<BYLvT@֭e7[eͥ/"~ӟƽޛ~_rҁ{ ۴ix#=L]vY[ꤲkFB_V,^ϲ4QFEnbȑ96-=S^*oqIYV(m -O}XU%qjpm&;PpS j~_ҳˢgU$ڛ8qbJKim @ @ @ @ @ @ @@Yn) @ @TOSӸZlXK[ow|҇K,STTRX*oFt|饗7.Ə'|rSAyܘ5\-"&MÆ K GKov6hРXuU㪫:R>=:/kҤIE:NRj ;vlY 7^^.`ɓ'zJ\xᅱF Y-WQC=*[8{NZBvF"sM7k6z)zNnEKpggmꪢqTt^{[_-v LAB;ioy-< J~Qۅ1->=ww{cu= @ @ @ @ @ @ Y^7l @ @ii-^3|x2jԨcĉ9`His]B,~gώ믿>nHφGy$8E6\Rj 'zK$ʢ>+,KϖnyGʄTVVK{J]uR@o*~UUYq1EG_ي1e*)W{~p w @ @ @ @ @ @| r @ @:55ܢ$񩧞*K/r˼.͜9LڵkrgƼyJ?sqꩧ/j#=<0N;Xmb~8LkQO<1VYe[usO:Ѽy&M#Fs{}9GѪU||ZqmgB )`{jgsXe_*ilTf|>2e)o͵1>Ѯ]p +򃏧;wLӦMK+ O_(ܛZ2Jnw}qI'E \k*yj @ @ @ @ @ @ @ Ȳ @ @,5A-i&;;3 x衇uq)Cm۶x RHE]~a>VX>(+_F-bȐ!.ĕW^ ~_~yP^I/|o>ѥ:)2~eqʔ)\;#٥).*RPܶn8sܶf馛~X?OCF>}oY]VtRIAoyl +i{)H1[v)~_D˖-o=R38#^~5kVkV,8YfS=.YV<묳⮻ʁ/Æ KQs*#SAbر~e~|ǹZSޱ3N ºq7tm*Ç_9wĉqgU3+R 套^}SO?=V\qQ M_s[wN M+??_B S;>2-:i._//վuF @ @ @ @ @ @K_g׮  @ @j-0?E|79,-r!9\*4z$k׏6( VZ)><?9|=9|-{_ZtA1bĈN Kaj f͚a'|r4h qsqG~eʼn'SO=5o -2;cFݺu'xbiu~RaϳQ\ c>}zlƞB=*[P,~"4p 9|CvOWAM)|8>;㷿  @ @ @ @ @ @ @+yU5⿵̥o @Z"p D~m%2ACFqⰳw 1cDvbZs/PtovL[{z*ܝ2eJ4m4R\|Ѻun4ٳgG KlԤ:䠺 t5kV/B/r?Kx%Ϙ1#4iq4jh{R`] \~slI>-[,9~ɉQ{yϲ.ҒSIό;Wҳ(=SZj}UƱ\_ztMspeOcu-XM^7P[*_O+b^wPBT~m??v^uU޿  @ @ @ @ @ @E? @ @ xřQT2NVZ)n7RYy +o^z9ls9V:9:tQ(@Ҷm¡r鳖V+* ~ܯt}tUբv @ ' /UqYOI @j#p9Gz PI)S77xc926x۷o>ѩSJR5R]ҤIHRf̘i)]VXaһI;#<+r/Rz뭷F  @ @ @ @ @ @Eu  @ @,+S#7_V#вe0`@^Əzkvmqgĺ{^z[o71]}﵂TҹnŘ1c⡇g}6Zj{W'|2{xGO>[/V[,~  @ @ @ @ @ @ +.Ux>[ΪjQ; @Z*ڸ @@8䐈o6 @B)S~8xwe˖[6l[nel&ѬY*USܹscܸq3< {Xar.={^1 @ @ @ @ @ @TKj9*"@ @ PNh޼L Q~%|1bĈx'bРAqGQQQlѽ{ ,_hРAU3m/0a„x饗/ȑ#믿VZ;ݺuj @ @ @ @ @ @ @, r) @ @@A`ڴ6m {vv4>,}x# ͚5]vr-Wۉ̏@9s[oj3&NRShfmp@lVѩSW^6 @ @ @ @ @ @ @( :c"@ @yoѼyI P*O^sƸqbԨQ1zr-1eʔ_~ZY[oYN1)ދc믿>~mEΝ?izꩱ&Dn݄֘;l @ @ @ @ @ @ E @ @XJ)rRg!@ Bcx͛N_1ceذaqٳ^zkDǎKu]7$6lXmuC .'o7ߌ7x#/̙33ꫯ]tv!;p ~ƍY @ @ @ @ @ @ @@Y'nI @ @TGټyu1 P]R:묓}٧dXfazq-ɓs Ěk]kr0daB"W]uH H{BK zLӧO]Pǵ^;[os=SNѹs^~j8!@ @ @ @ @ @ @V@d5F @ PA;l~@Fb˂|9$ryxx衇?sK6lzLiYc5m۶%jR͛_|EICi裏?,YoUV%᣻[$СCwMi  @ @ @ @ @ @ M7e @ @! z PVZiHof͚|A9/m=ztL0!LRr]zu֑!۴iSy{W:-͚5+F"~91'NXfO'|~4n8NvE׮]:Z+ZlYnM @ @ @ @ @ @, r @ @93fD4o4z 4j(]wݼTd2mڴs(dZ%B_}ռ_ܹs4Ӵi ([jUfYq#-/|^VXar˕i `_ee꫘4iBKw%݇BgZ0ѴNK۶mcW @ @ @ @ @ @ @/ r\I @ @`sr؄.$@` @:eQ]2B?/,<8nܸB S`a ,ԯ_8yhѢdIiR#@!E 4=4 @ @ @ @ @ @ tA.]o @ @ӦE,/ vh8+s @ @ @ @ @ @ P{A֞{i& @ @5H`A5hȆJKAgψ#?Qm)t  @ @ @ @ @ @ @` \:#@ @ 0_ A6oN,,лwĭFx`D^pG @ @ @ @ @ @ @+ ;#'@ @ k3t,ƈCyKS] @ @ @ @ @ @ @KE@Ra  @ @@]><;#7Xn瞋>=bKWY%bU벖 @@A_Y"~ag]8cM @ @ @ @ @ @dA5; @ @@Xmh`=wnĜ9[v ]ߕ=f@ 9f~)] 3'@ @ @ @ @ @ @E@dmA @ Pm:wXc>X@68:NuU93A7uU¼  @ @ @ @ @ @ @@_;a @ @~ENJJ:wZUTqqmĕWe s'@ @ @ @ @ @ @5_O  @ @T=䒊w[yg @I'E̜1`@DF?9 @ @ @ @ @ @ @& w͘  @ @jvE4k1}zC!b?((y0ȣy!3 @ @ @ @ @ @ @@MYSq @ @h #v-bذ9sNA+{HA?? Oj:N @ @ @ @ @ @TGA @ @@kCZ <Ѕ;B*8p~{j:N @ @ @ @ @ @T7A @ @@k ݁F!@_#f͊w~pyE] @ @ @ @ @ @ l/nJ @ @ n&e={vıǖ=fTV"9$b"}WG @ @ @ @ @ @,KAR_ @ @uN`}"O^N"ws &LU$%\{U԰f @ @ @ @ @ @ @%& rj @ @{1{u!}r g!WK @ @ @ @ @ @,mAK[\ @ @uZKmErH0y" "n%b#zx*jX3 @ @ @ @ @ @ @@ rR  @ @X?-[. @)`;"&b]#F @ @ @ @ @ @ @KSO @ @~3?> /i/I&YOf*̞Sqwmmz4j(/-S![jUѦMh׮]ɲjE.?~O"PJ!C"3G#"6ܰ<  @ @ @ @ @ @ @@Y3Q @ @,#8f̘;vly7n\L8dDM65\3VYeH+rz9бy9aÆ%s6 .?9s㫯A&L~'Ĝ9srlAҹshܸqɘl @@Ha"zy'(~M( @ @ @ @ @ @ @@5YMna @ @,{ٳgǿx^VXa9xwޱZkEvҺu<-X{W4孷{oOlԨQt5b޽{^H@qFqw_ĮFSēOFtP7-̚ @ @ @ @ @ @T7A @ @Rx?SL_>6l8sOh۶mk+\QQQIW 9jԨ9rdveib׏zXo6B>#_~9Rn}}7VZi;?'@&0yr"&M?z  @ @ @ @ @ @ @YZ#@:Aq\qǘ1cm۶{[mU4jԨ|9rȐ!Ĝ9sbw>84nܸ @`_FCDqVpzh4i?mꫯsN{q뭷ƸqrxA @@Xm#M#⫯j͈ @ @ @ @ @ @TwA @ @@^~zc_?ƌwygTuRQQQ7ecƆnw\q@:aR5֘9iRĮFLRK'jZ @ @ @ @ @ @ @ 7ư @ @*''mY̜93^xᅸrdZP P^9z[oΝ;ǐ!C U  @'?1aBnELZK&f @ @ @ @ @ @ @7  @ @xbM7k&92B_ ԯ_?>x7c=?_&% @&nӧׄQ# @ @ @ @ @ @ k=4 @ @@ۣ{J+E L)P:d{<@?~|u%X;F`S  @q_qgBߕ;vTo~YǔM @ @ @ @ @ @XF n  @ @*'0tg}b喫KVQQQG~,3Έ#Fļy|=3ZhÆ ["kGxcEEuֲOy]]KvЌ @ @ @ @ @ @@2n  @ @jٳcȑqQGUN<Ę0aBԫW/nx7[6ucqU&Mb6/8zo{L~a\{/Fͣ}o;}Ys=DZniw\yU#@Z PQfEG} /7|s5\3vm۷oweѤw|Ir!q衇>߱=;q֭[r)W>=s /sFÆ N'|2znӦMϏuY' =rs-) }A~q%+Ö?lP8oM @ @ @ @ @ @5_~͟ @ @V88usU>Łc=R;vtlqCǠArS:v|Q~x#mS(d ~L%?va98*,.]ģ>kV>o) j=Vou]4T8ݻwޮ믿~[Uݬ @ qCגW\m]g?ǫJxѧOaEhR( 'SxrzGu]`BS(~7|osާ)Pr#_vRd*i)y[o5_pJEw}7b?3O?{B @ @ @ @ @ @G@dfB @uSLsZa|nEEEѡC2Ѻuc;cxy?_wy'メ:?t#A=ӑOe]w-2oi&6h~HRܹsc 7F@9sĨQr[n%fxƘΝ|ѢEW^n+]-O^-IG䒈SOʑ9C۷!nmj{wealA38͋+tM911woXEӽ+7O%[O<ļOuf͚E~KNo,{@L>:?HsH嬳k? @ @ @ @ @ @ @vk1 @ @eM431c2Y۶ms)1'EҮ]H!)?;/nLS;u#GV\P {」~&N尪%Fƍ@˚$@(pq3gFQ8昪=߽{2 nSOw/9W]Y8إKLi;>(oHAOO?M묳N|XEӖ-[A\sMK ,|?I^xa4h RXe!x25qQ:thZJo_z ߍI? @ @ @ @ @ @ @ ԯ#7p @ @Z/P]|w\SR*)ܩ*J 4hPqUWEbذa 5]:ܪQF1ytMk={.TQ,BVtRBuGओ". b(~UͼǏ* ny7,{͛7/7":K%˸q"{':{) 2[l&M>xN\>=:/ @ @ @ @ @ @ @@Y+nI @ @j@-b֋{LpΜ9ѽ{xW_~1eʔ8ceX:ꮻv-) P;/⤓"77<7SOi襗^[ne^,sA;]vg,N,MӧzjW=SvZj^{?)`އ:Dc1z蒎;,>c6 @ @ @ @ @ @ @f   @ @^#7|3,UdweGpW_{ohswygST uP;#>|vw뭶*۶m<@ો.( guVu]9x*Uzcذa~a 3®RAbر~UKcǎQ窪vC5G88~눃\|z'ΑeCzhݺur)ޕ~a>WX>(+_F-bȐ!\y1`ׯ_\|ŹnE|G \~}QhNᐩ/ aӥC+ШQ8svmsN6Zkni @ @ @ @ @ @ 윪[*{y @kfntwe -̦aÆ{mY>B8/Oe]ǕBӸ,{nOaO_z)o"5-Gzqs;?xtرڠt+dZj{kc??;>]#@h ["8 WGlE7 7<ڵk @ @ @ @ @ @ @. @'@ @DY"FxsE|QD:Eg@E߾C60_{[*+j:thl65ƍy޼yqyŹ瞛:  @` wwDoĮF ӟVOOv%vW^ye!@ @ @ @ @ @ @@O @ @KV/"7S#:eˈݣ8X0bԈcxɓ#^=bРclY|>;CN׿u^er>?18쳩 @h(bȐM7#}awyg̜9s%@ @ @ @ @ @ @5\@d O @oq Gѱc+G0ȴ]@IDATecF|eGyfĎ;FhQ4m4EW$y'GϞ=?j Gy$6p?#F:]2mƍ# wI;GW_uw}Wr @ @ @ @ @ @A&{woSm8s9gX^k}wx>@@HM5k"۵ʕu~MnyNҁOFI=$U,et#]ܷo_}ںu^e 4H(WF Xf۶mu~Zz4hy7 $Vovk[o6m"6/-r̘1W(             A"@dH   JL@ԺTTs҉ғO g-^yEjB*X0eFXn]ZJO= իkڴih$Y௿K/5WX?\&M_ $ @ң@\ܹRR&BcEN_x^4@@@@@@@@@@@@@  2Ho,B@@@S`ZwBYS^XE祕+C9s} lْs={vZnjժm۪F2e E=%w⋺k7`~zl2o@y#B- rΘRy &<@@@@@@@@@@@@@D L@@@HN;ѣRZUO:w."񧟤3jזdI\Z[eʔqQ*WۻW 6<|5WR>{wCm sgz ȟ_Z@ʓG0ݻ gΜjӦƌ{             AAt3     pǎI3g *V (u.gıeˤ#%ժ%eNtjҤI[oUtUWK.Zh.\pTAq17N5B>j޼y0` 4y< @(TH+)$Dtz:uʕ+~züG@@@@@@@@@@@@@ h?c&   9^}UjX*XPN#^,iz9n])K47Tre 6L^uo?{m%JgϞZd.F(Ǐĉu]wH"z^Ѕ@ozꩧ/_ @҂SΟnM:pQ|z̘1             A$/۵<9   zCe ~> @ =*}4wҟ n=bkT*\8_^&Mr7nty TM=0/^<(V^/y9r-{\ dbL@ %5j$/XD=n8m۶M35Kw#            &@dl*C@ 27 K~f͊ؖ,,խ+RRZRLrj2_Uȑٵys>]Y^{nFϩի*U'NhŊZ|-[i_=۽M/>A# ոTWR޼҆ Tre}jҤIB?             D k@z@@@@\ 4c4sdA D>~ԬT`@.:VgU9b -Z)N0A'OTܹUzui!B4Vnֺu"kj:Jլ\gμ} rP3]|$ @(UJ^ԨQZ/J*N:3f Ai.1@@@@@@@@@@@@@t+`v-M\-  @j 5ECS2.S{J @ xki?ʖZOaC)+;Vwo魷ޓvZܹs_|rYFh]P(Qm%Km 6 zܫϕ+%K={V=zTÇݫ߳gvᶝ;wj޽nm9sf)SSVR zq!E )[6i\\c@&qԸTS              "@dI A)K \3ԩ^~NjZNj /pAzi؈}O؂ 7lؠ۷G4ZP48p8Zܹs0ɢEpG_ؤ.]Z*UR9ˌT˖Җ-A7ouN" d|-RB{աCT@@@@@@@@@@@@@@ L.IA@T L @ ] =+-X M$͘!;&ի'i*.A[H'KӦIGĉ:| ggᐶz5rHF (dɓ³sQOfi@XJj$b%K+9sJ_~eG             Z k;?@@@@ \(}4~4e`An]im[5Nӥ3MSF%W\XnC߿_-[LΣ34uԧOD R* @YS^tmRݻUx44J             dK@@@@ 6m^xA*]ZjHZDziVi2驧Ls}I3fHf\dR2D1B8PQ D \w(k|3fܥ5U             A MaH    1>Pj@PA=ZjNZZWo_TispAY=[3Gm1}^ߵkgΔ¤C<5 @Filx/=               A]d    -~XJGD /;^WOK_(=4md7ߜCJ4m*-Y"m&ի'mޜás@hH39:zH^(d9             @ 2]&   &pRZҍ7J?(ĉRfR,6ԙϓOZ4ut뭩3kժRa2@>>TC@@@@@@@@@@@@@ ^F@@@t)uԻtUR-Y"d iA4|4aԢEf X1iBQ#),L?>UA $Jysii5S.             iT kB@@@J!C?WzPf̻J"}ԦMZLΜԩR>RRifx @(-[J~*s-[*Jv@@@@@@@@@@@@@H'A0@@@@ } ̞- $-Y"p4qԺI:eԳhW̙#ʕx"" r()44O wKcH;FAdJ             A/@@b&   xQ6M`U;Nj(#ɘ-\e}fLKu׮RR۶RX4}Tॴ5 }I҃FA{&˔)sE@@@@@@@@@@@@@ 52f   YRZRvRrAvMZ|30}S/MJKH۶II7  @0 <4bԿk1gvtmҾ}1q@@@@@@@@@@@@@ 2#   @P,]*կ@Xz4eTFPL/]LaE |yOLŰ V/\8 ! }Tz-OW 7FzmQ^@@@@@@@@@@@@@H;A{H@@@@  l.m+5h e.\)M&Y%pgJmHOK.bŤ F0i`%sB=!CK1B:p@&iڈYP0S             LAd.    03gʕ_fϖF];`C#?Vf͒,Đr9sJSJա⋗&-  O?.MQCڸQ:w.S?L^i@@@@@@@@@@@@@K @@@2ҥRZҀA-ZdP40qaäѣ#Ÿf=2D1""`cG)<X*Z4#K~ŊI JIaa=" `yH~+=%80A@@@@@@@@@@@@@ AR@@@@ ?/u, ,% PX ߥݥKj,&34uԣԡp @ (JFl}`k!mm|tiPLI             s d    ԾgҜ9҃&xi/J]HeH]Z\<Y2D1B8PQ Oi@ \s<{ d֬Ԗ             @    X-/󥰰t< {I? }LS5"0üˡCp @ h,bZ]dʔI9sTBuLoMRDě ` F X+"By}|a_PJΟ={62p< 0˽{F?y;ǏP}B*Tm |_pa)RDW{_hQe2͒c             @J RJv@@@@ ] t./2gm؃}NIO=.xM>??/{JSJ}Dܳ͛ @ X]ܶsw֞={fQ:Η/_d^y啪RJd f|yU\ x(Jm -ѣHW dM? M۷0J_L 4KvW+Q̛             <A&#    @:3GSWp^H:Ip} yAFkqV:dTd!9jeN  XР-]ԅs5jRJʚH ]pjܸ!v>cV?}ׯRLկ__ 4pU4iFx            " ;<@@@@ I{HÇKI9rD\zY&*Ҽy_K2Lx9S% @͛?zD2?~^@B.тի={N:*_;qF$j֢EȦ߯+Wjٲen۷=QFu-0R>lA@@@@@@@@@@@@t,@d:y @@@.]7G RMHM82g ʕx"" r(y!)!"(<<\}ϟ-ڵk .۸qcխ[W9-@*.\X͛7wuEYF-rk^z5mT~5kSat            \AMH    NF}Vʞ[HA{ֻeˤ Jo vJڶ¤ӥ3} Cѣ={>sxqծ][-[o ([lY;L2Zjn޽~-x nݺԩSgu*_|'F@@@@@@@@@@@@+9N#   @FG ={VQp_#zk 4m*-Y"m&ի'm d7ay*Zzϟ[o={hŊ&Md>#LJ*ٳ 8=x̙ZjiذaP :}״sΌ@@@@@@@@@@@@@ o G@@@ xY1~PZdHHHԃT_s^htUJ˗KGA.^k@ .Xbzᇕ3gN}ڿ>3uC1lbd˖M͚5;C۷{k\(dRtkĉ q-@@@@@@@@@@@@@ @dZ @@@&II=K !2K TԼy {r˴pԨ&#@ Xqt 7nݺڴi ?]]wݥ9r0BAֶm7ꫯv%KTwd&@@@@@@@@@@@@@ 2,i @@@ҁرRRz1kJ1Op$ KcLTV+)S@4$34uԣԡihp HCOְaTlYu] 4І \]N;w44Z@`2yƍkԨQڽ{ɓ'tz'cǎ@@@@@@@@@@@@@8    |K&D6;  ŋh˖7]EV"! (u(ő2&@ /^UbEKvCu?"zD m ׅ͛[N'Nʕ+UB=3:rH|pt@Ȕ)Zje˖iҤI;w pH              ZA<"   @f͒ʗ*Vg;MKiNiv:w>Ҷ@ӦҒ%ҶmRzi{H)aÆf͚*^֯_^xArJh@UV駟փ>mرcA=g&            iS ȴy_   Aq7lAqWw}޽{RJ /I&jѢE;OBFI7$pCA7ֱcz;C;8w 5jH?csVÆ tRw|ܸq.eV/\8eI>+kx/o7kb|ڵK={Lps9c`$u.b\pܥKW|L ZK/QW^UVsIٿ}qzדzyg}V+WƍUN/xz[?E@@@@@@@@@@@@ 28#@@@@o6l2wpY0Lb|.Lw,-^pAVZ%{ˁ̙CE΂[1l2-\0'O²{Yǵb W׸_[=oE69rWoO9bsyARX4~|W}V| :T zߡ(im۷~[֭Sɒ%]HUVhQw͛7sno7ʠbI8ci"ʡĴv@ o=ܣyi۩S'dA )))Z "wڼyKz=t[͙3G&xZ*] ߺukrwA{             @AI @@@&EP~geဉ [oUϟw vY5jԈT:%Kmڴ!fΜ6*hT)kV#Zxi׸qb]uU*^xm۪vڵkʕ++iӦjذ V]׹5khǎ^hh UșSIRҋ/__/ }vܩ3fЬ?wYׄڰVYwܡ w޼;] s nAŲP[vIr08@x7߸P5kfxv6k 0rq}R۵ݓO>A1K[G=Iҫ'uSWʕ $ *UV.0<ڜA@@@@@@@@@@@@O m-!   N ԑgĂ C--2[]x1.byMCscD2eJmv5c7@i/%"~'y7D}*U= ۥ}vY0/Rۉ~崛\j'ܢ_\u?e۷O6             @&@@@@t.`Am? ӧO0e˖ԩS^ d+^k?CꫣX7}*SZ7PE|z뭷j*Y`ΝլY3wBqƌVfw:T͛7µtRWf͚zϺvaÆݻ.\wyGYfu!qT9g?^SN/-ȑ#n-[ڏo|B2wwN:y#?VZ'-μ}B!:gc9sF7p Չ~︽vlb+е7m[),L>]^(bʏ!ρ}F Pu>saG}z+?v/_>_;{~Ξ%=>c?ev0q?~\`b 4H7VVb ;wgyq5_wI&GJĉm6/'r3!gϖhƌ5kbŊ%iqoZ>|ح#[C¤Ķ.gzƻ{nu Q2u-DiAo\d[χ!<䓪_~^m=4vX}WRP(3oe /ms̞3UVuٺukοiΝBtwU|} ;-{dΜY.zzeoPkz9rp M{Gzwkĉhk7qق-?chbke6i;+h%Kt#.S ޮ=?zi+/_>w=y?6v 5p˨QԫW/NnAW_>|{׮][VH"uYv|U\s6פFvo`?             )-@dJ >   Ւe ֪PΞ=K @ _V4h9" _Ⱥ^d# /N9Q_h͛_eF߆}>-XmΜ9*X^-ԂJ- ?ׅ -44wlŊ8 |իHS 6Lpl98Zcn\>}ZŋwZRuWZ7~'5 ;vZl|Eɖ-[{{S^=8p Ƭ3gݻ'j|Q/ `p{jWh…eYp[ZxեiӦu֗r)פ@b!/wJaaY}f,\[skeС nSfg0$}! ^K yG ]%iZB}ߞ~iBp˗/W^yHСCI0jNthύ{̅NWlmd }k" Rl׮ q^f6gNKTihgΜ<Л7iǬ_ 7naÆ0uߞ'T2]v}Y[v-<ְbX3fuo$-> IA@@@@@@@@@@@@RZ Ȕ}@@@Hu_~ϩSda_E _[|cZx|O+Wt?͛7s%JxkΝ낖,>rՇš_߾}{=ڶmZjl;yK͛RٲeU~}YeBł,gBU<{nGdDi򄗽S=0J/a:x *->p u9#I b߳R Ց#GTN9Lb֦Ӟa<%#;j/"-,p*W |M)SU¥>sb[%o\,)RDC Q#/Q؞av]|2;=;_IiRۍ SJg[Z 5_[8u[j>@@@@@@@@@@@@@ q53E@@@ l$U/\m,UW]v-y8!=9-++Vlɓ?}q>c.T_~Y:uҺu+[lNXM8Q6/Rm۶Ur/ގr,UGԱcG͘1Cǎq.臒?}toJI'Q ۺBK,@@@@@@@@@@@@2A3g@@@2Rr Oj/*ZYrrȡ5kca>vMbKٲe;wnM2E?se@ia;v< pko֭[k׮3<# Jt]{U/9}w*Pe/tmGb1g}d2P+[@ WaiL),L:t(zwt-O-"*:sL\+hɒ% q)K,1GǏq< k.nY9q{JB? 1WH ,C:}tLު[nU޽UHL9j(ٚ+ .tAzժUsI}v|Zk7ݷ0`i{&< jilf͚5a[B;7o_$[&_;=mTcРAn}K-            d4 3g   d0Sݻ%/1bagmڴXț/|iڰaDk#-(BFuiΝ߫ڵPY@"5nX p7tJ.:uh-[k?2gάG}Եap_J5lЅ{/_&w}# 6,)hq<p-ZhرW̳aZ&%} 4m*/Z#ꫯbHX!mvEG2kL4ɅG[{lA im|8p[$cVbω-qovg'z3s駟~O_5u/8|ܹp Nl4voFɓDžqښsz]wgϖXojؑ#G֙.jgm> yi޶^@M_`+B>;=mv‹?cUX1            dP 3g   dUL3ʕ+0m^_?|d#dAMݺuڵk]ЦMΝ;{sCiX.]gh-_O?UYft-m۶D{oNoB:t<ܵkW+Wcxw_~q~stiau6PI k| 'ozʒ¤n‹.\BqbR,ʂ'RZ\/ \8&aj,˿XĊ.ZlbAgΜq}b вK rέbŊVɒ%]q}έ=NJ-U ?{ck!.\SO=nԨQC  H+[a&M$fϡGz@ɓճuvUIc_hZ(ile. U\k+;hh!܏? [|뭷"C6e^{WU"RY3ݜ9s 49sW_uX8pl5<ڵVZnkĔ"ZI֤1 4c+y=}6>w-Z=mq9Oh̘1n @@@@@@@@@@@@2@&aWƗ'_b\  zC۹478 @"@rR"_7o^.Bz,رc.?`׊dΜY JXQٲe]P/W\yXd|"ʞ=vޭ(ډ‚"˂, O>qFY&t$ JƿK![TI^nF@5Y@ ׯ=?l?G#`8@B [z{=( x热,Bm++WT:u\AdAʕR&k?YĶv`_[J}Kkb9z]~BV/vmMj@!!!#_B!y%5kָ`ҥKGi!{\4B;-[PƍPO4            .5E@@@C`)Kya }:YVEAVdܹUfX$Pf͚HkB /^ܽ/6-[&5l$Vپ}{;6ł +V8n,_qTy@H/{U="{uַ=?l8H ֗_~7xC;wѣYPU\9,~Xc|ł&5cƌ臣[~;&.>Q:1_}Լys}uqJ/eZp믿;CӧOWѢE/IE@@@@@@@@@@@@.I {Iq    ٳg5l0͚5+K/J*]O~E+tQÇםwJ?o9y w 1xB0Q}7w}W-J\ej+PLo%N"@  ~gԺukY`jd?|1Ktj̦Zh#G1/ |o߾ x'X'*ǔ{ 1(P@'OVVRKF@@@@@@@@@@@@ 2^N"   @z…ŋզM+RVMpC⛺C鯿JEDOkWtim[),L>]*XЯBooV=S*Yj׮G-#)/PK1c;_+V]w+N̛7= K.￯ [ @J 4nX .ŋ5d5lPժU{ʟ?JA7|~((@ϟw|f͚ *Ν;+4448            V s`7@@@@ ǎEWzO kԐM ZUZ\^PZD`߿fͪ^x!T@%pM7i̙ڴi4`}GUo~{"E;]D,R(b=cAHEBAEޤ^)ɷߕo"!0Lߺgu=/UHu]6mN>Rd'-ѷl0:F K.UUD i]3D3gԪUCHGNC@@@@@@@@@@@@ 2y@@@RH sL6V+" c=NAIܹu OƏ\r_￯!A$P\9 ޽{5b>}Zw ohٲeP Xرcu=D- {ڸq,Y\ H3@@@@@@@@@@@@@RP C     @Ο> $R˥ґ#RJ@\ p!y7|,+˞s4M`߾}5o<}Zzr޻ԭުŋ[ԃ            $(@dD   Y9 _Y AtWGlY];iSi4)_.u߯zJmڴQc@ fYܲf͞=[?y/ lԨ4h:u([lA6Ih"ٲpB]V2d}vm.ޫbKmN@@@@@@@@@@@@@ҔAiv2@@@Xy /6Iכ7KYHEd@Lfͤ~nE믥 bkiʔ)zW5p'rʕ+˖{Lk.toذaz]UW]ڵkB!m]Z5Y$ DDDhƍ_ݲtRo:v ZW.5nX#G K             @4B@@@@/RRHHڟ+3L}UJKmDAN&]{my,XP/z)=*_|x"PժU-?|֭޳p,YI&ĉ W\5jд2e!j*XB˗/'OU*UTn]uAYzuFWG@@@@@@@@@@@@҂Ai.2@@@S S&̙8s lʖMAK(RD;WYjT=Z)zz| M/ J{Ͷo$<<\6lڹs;5kVU\-W^y*V([ے={TA8wx_^֭s˪U۵bE.;6r) uf͚V=DC@@@@@@@@@@@@қA3_@@@ҙ@A-̨2e"jA @lҔ)Ҁ7J?eȐAÆ 7߬ZZ [ @ uءC9rDVʕ+zjO?i֭p.\X˗Zziо%JȞ#~hB7oެM6Y|RJʒz PR)             H] u@@@R\ S& S&\PA6jt6R/LK*H<"Yђ=StMj׮j4i"Hyɞ:uJ6l]@o`m߾=*,0,,LŊSɒ%ex*Z[)9r\=8{ݫݻwe׮]ڱcGe۶m{k {Z5\/+ NҘ1Ye{ExRmil             N tw˙0   K K5`AzO4R@>JMJӦIEoRJ2d jD @ fͪիqΟ?/[nՖ-[dႾ~Eydň؆H}fqa el un%J /m޼y/_>h2cE.l}JKٻTF30             ,󯾒e    M GRPD%\@"ܹRRӦRNY[oo?ƍ_J pzhKٲe/'̙3:uTHyGm۾^(,,,j ڶ /ܶ~zkHc#7r_^]wI^& @@@@@@@@@@@@HsA[ʄ@@@@B 8?GHy/zA z >]jTY ^U+ii\)SՓ"c3             X +y    *mxCITIʚU0AڸQ:T[iȩT*f$2J&H 'ik"Cq]ys\G؏ Izil_ťojՒ,            A)}@@@*;4hPduGDHgD ~Ed?V/ ǘU._.]}udPỤA@[W6MZL*SFjV][k@@@@@@@@@@@@@ @@@L _y%B⊄ Wdg޼^HMEHsJ]'5m*OvI͛KǏKzIZKC@ Ԩ!}oRRR6R:̙@@@@@@@@@@@@@LH    w yǸZRƌqe1OLl٤)SG:wȃ#Ҹqc>T @jjiڴ@bŤV"Ú)Έ@@@@@@@@@@@@@ 5 C    &FHTzÇ#͛70+AiF^~Y[WZV:wN5[  5ӥ #иԺ|y`ƣW@@@@@@@@@@@@@B /`@@@Ҍ@R&R 11tU1'pAΖS@mIE:$ D V 9so, sgi:#F@@@@@@@@@@@@ @djKԈ   I:T:>gJ+Ϟ X|"D = .}SYK7<@@fҒ%ҤIRŊҀѣ@@@@@@@@@@@@@ ~=3G@@@ \uԣ!CFD]$g2gX@0 ̘!p?9  KZZz ih|yi0i             $    @P )S*U=8p@ʟ?p3A`r];hkI_~)}}|gq @%1cdpMKO=%YW_jDE@@@@@@@@@@@@&@dz@@@t&PRX?/RDʞl^`~ ,;ԷT@…ϥ]X^5 $}wnTtR˖A@@@@@@@@@@@@)@dڼ @@@.G*ZT YL{…e(A hʔ^}UڳG>]jB 6C%[ƍ{<@H^ҥsݻjդcǒFC@@@@@@@@@@@@#@dڹ@@@ȜYz-)""2t͂[h+`wE$@ I*}cKRR^ .=t`΄@H__/4lIW^) -            G H8    @vRzUŦv풊McJ\}.yFڲE3GgUƌEZ;~\zm~" @ wtϞ҆ wHݺI7(YQ             T*E@@@8}om۶iǎ:p>L{쪗_3gٳn]2edٲfͪy*_|n.^J,RJc W>n>άO ""B'OԱcǼ:t8Ϋ3Ji92 9ȞqNg<׾Zkq{ŷ[=//|~v̙b,Yomg3gNʕ-m@&1B`5'^ʖ-*@@@@@@@@@@@@F P   $(k.ZJk֬իݲn:۷/Z +Q *B˔ KumU}WG ,3[,pH R믿\Ibc}^z^ Œ y)8*U䖋Z0C\~͜9S!+Tf͚iӦ馛\קכ6EΤlٴ2#Μ9\n*[,uǎ YZ`-90`Ђ-fP~j^&do LdO>Cɂ!- m{odxZxqYX-,\T)2lkpΤu iWK{ yGj>Ι!            @LW!   o͚5K&MҌ3tQդIS7p,+5Yf͚n޽+ĉ.s!#G5lPڵӝwR<Ղ rLL#_ ۰a6oެM־e݊pf̘=_,Ϟ3ժUsk_ /1s-.%Kli]cvr!;w- h"M8IOʕ+˻oۂANk@8ڶnQzI $~.%@@@@@@@@@@@@@t&c쇉oى@C@H#M֐!Brȴ @k7nO. I@ĻK-ZPJqAY(i\_ƍ{1wSNʕ+WO..L|ɓ'i~k q`;{6nܨիWk͚5Zn֯_#G\x_ٲeʔ)ҥKh4b8}m断[? }BBB\W^)[*V*U%>@ ̙#?H':I뇫@@@@@@@@@@@@@ m 'A@.@I@Ь?P| jԨ >;dlYجYdA itszڵkZfW飏RZ8AI˗kŊnYj6l %K+ }̐!CJc #R{?bL #P_ ZjԨի%Ocҥ7n3fm۶jذ:u\#_U3F]iEDe˖QSӥKj. >{U] u]믿DZH* @ u +M ;@[3G^`TRU#            @LW!   @ƍS~wyGݻwWhhhWq8>5kj.$GuAy ˑ#G|1/L .F@@@<;S]dkÆ ٳ'!C]0QFi„ Q-Zt=%K:u?=Ç5vX(P 3g @H;>|ia@、(W>fڵK]X1 :TW]uʗ/{L}Ν;r22 % xp/WG^pԥt%w             L7@@@V_UkҥKeoÇW޼yT]WHH>\R+W_aÆݜ,nݠ+$pQ3F-[T…]8]L4bݻ8PM4Q֬YT"v-;ʂnݪUVW^?ԢE ^B]f!^fΔf͒Փ&T@@@@@@@@@@@@@ V cea'   \uuשRJZl &>8,l//}@_zGbni&atNA#ٳgp"Eh*Sf̘}iܸqԩ (45SiEJ*߿~:x`ZRRjieH͛K&>~|.C@@@@@@@@@@@@     p'Nwܡnݺ|]~h7m4}Gڵ! r|)C }#SىGՐ!CtWM6Sj׮]zԴiSe̘1͊rH׽- ל9s\@ss/]쫯Rxxx #@dIi<{wsgOܹt0q            @: 2t   ?f͚兔tV߾}5b{ 矫W^pe`NZ9?sϩTRzw{mΝOԪU+/K!@ X(dϞ=h"PnUZUǏbp@ ,GI?-y~@@@@@@@@@@@@@ n(A@@@ 96lؠ۫K.f}ZtyDb2 C ?=7鮻rK6m{$Ʌ |dTԸ4yr`ǣw@@@@@@@@@@@@H>vY3   iJ`ĈZrƎL2%u2?n6լYSW_}U>*Vbu ,payʒ%^uկ__ǎ*s̘1?v! D Mw:~m7V O?Z2dHLSԦM}駚3g ˜9s*D6Rs׮]{O7nu"C<˥6@ ] IÆICJ>+!;I<            ^ T    /0eYO<AiӦM6m-Zݻĉ7nȑ#zg4o쳚3g"""Rnݪ;&)2,,/N˝G;;ڵk=#\@6~O/7v츌θ@@@@@@@@@@@@RL C    j~Ǩ@Lbz+gΜ0-Z,lرʒ%W!Ce˖ݻ <=z,`qԨQ.ָq\0ZF8~{hAy}w] ̴,83Uۗ={hI&:s~x:ξƏnUʖ-S8ǏQATN|xѶmۦ?XLꪫK vNB/r]gêUB wqP\ܹtuJ|;iž{|I-^ؽ/l}qgdȐAaw_ u='w@WNyGWoT            1i@@@GСC:xTYI?iӦ.lUVz\У>WRu 0kfϖ<             @p D&gmT   A(p1W_7p,aÆ.|ƱnɅkÂ,͂Ə믿[nn@VZՅuYX٠A\ɓGۯ0?,T]v..1  C98`̒yyy^ԬYrTɒ%eA,,t/K,z] }z-WZ >A:uJFh3ftga,m۶n駟֔)S\_B4|??,G/)CO3ͮ_r̩,@0<<\ժUSL\]m|Ͽs&#.… {aRiR|heg+ZD (P >{akZ( :4ƹqqΝzGda7v'p˗G򪫮ʕ+] }FDD{k'c x6g}/;vW-Z]}ݻ㻧v<ؚvZ@_ _>y߳~g!yT            AN@@@@K5kvqM6MSNU:u|ʑ#N>bŊa-Tj2[YYeYم͂Y5ߵNH G'NB=s:w\mۦkҤIQc8O;^3g$ >yT ?~8p (+ϱVfMnԨzjWZxZ-0k֬.@vܸq.Lwߕn߾ݝo?k*Urka>GKh&-@Bl{}i„ .iZmZxbZh|%?_3]~Z k]73gփ>.\։'|➷[[nqzg l m[[abwܹsʅt GŊݦ/0^7`i-{N wd1 @ 66UM            {I~    ,XЅ n޼.Lׯwg Zt[-[7ʎY/+,,,Fk.jܸ;[kΐ!^{55hfnڴ)ڥ'OT6m9͚5v/l, 0@7/ z?M4q}] IR:tнޫ-[n&J[\97֑#GܺPB.:/-f}}炅'~*R}YP_|m3e$nݺ5jZlS8^$4)6wZ vs\j;=o޼._gb}Zl3ft={֭,قH Lɻ xy^t#             A&7!   ,ꫯO?d˖dɒ}_ڻwo Jk ,vj… G^{7}yuIw}wbk….N:aä;7_J_-P|yyzꩧt̙>Ν;1cO?uٳg]v^fw܂׾}{͚5K?u& D-_\;vt6k,N2Ņ[>J__ ŵӤxrr^$wy=c_l;s8{O/+ۿ>#=Ӂ@ `9cJ;GNDC@@@@@@@@@@@@  2o!   [_|8 ˑ#&Oe˖EM?<<\]vնmۢ%v~GdҥuÆ _~E7tT-hٳѣ?,kԨ%JD ܹw3yC>z={CZb 7o:gs7gRTZ5}g.iӦʗ/ɓgI<*TƏѣG;K_h+Zȡ1ڠA>5͚=;j5v<>S_ 4cǎgsI lٲ.1?s{jmzuĉ=Gorws_.Wر&@ޯ^ߕm_             ҿ   @֭ ^0a_)S&]z[okUٲeUn]߿ߍycv[nQ&Md[͚5K SO=vv܄7nTf4l0\{[睵|P3fp֮]/҂,ygyhs ߯%Kf^xAz:u?nC:1;vݻ5/| >p;<%tOI)cժU\ 裏RG\P#~Ԧd4@@@@@@@@@@@@>#{4_=  @J 7YCw!5)] #}w.,[l~+ٳzᇽ10=C:tς-`1,, 7]#FP]ԩSe_q0`@T#G\ 3ghŊʕ+/t[`DBj׮}9 Z Iki󈫭[NW^ye\w.B0f͚>s?K H^n)1Ws}gC?\@Ӻuky;vj֬ӱ}W曕7o^g 6tAٳ`3pZ~uoϔ6^"̙3UhQg${۷̶jJoN:5j>5 7홓PXH{mϛs5 iܹ7]=[:zuw0K[[c\ϩgB->S{VyYT)W=gVihF]жm[kA/{.Ν;/y=;-X2ժUVXQ?,,sϹkG\;V!C\@VVMv_ֶ :- y>h =Tg}7BG>;)U"W} 0jOo             pyA^W# i^ 4  d{RJҥ ~ĉ.|ʙ3g\]jʕ.ЬlٲtmB';wNֿʕ+~|.t,-K rwj 4'OT ӧ, S>}ZYdѮ]\/hjD -@? ۳g*T;v,1.H y/B˕+ 5 ص>ubc/863Kl[nUҥcԿm6hWTuqXLyl'ٿ@c\=M\nz\;8 @`_#Ԯ4od骫3"            yf\ + f % |駺{d:\~/?<2-qΜ9-$N:jذLFj"2Xqf:OmA>\ իW0Ey)0rĈ+#5<ۧ-[&hOgx'ixk׮+⾷-^S"ER. @f'-Z$(@@@@@@@@@@@@/!r&    ]֒%Kԭ[7*TH7xcR[nE*UwYfxr<|Bѣ:|xR!ίZyO\C{VҥSƃvZRs!wgp&,06ZjpL)@;w\ 2D_}n>5k P dYHӧGn HyY            @:ݾ}dO&GA@Hi~&{!_SzJ gp/ K.5m45k#]b=dɒ4IR^R*I"]^4yd"-5~e)ShСZx7ozH)SdfR߾}vZY8k4h P0 A"w^?^|l;W5B@HN; 2eٳ% !            @ Ќ   iA 44TcǎuSgSXrׯӧOk޼y<|XzYGL#,.\_~EŊSnTHu]s瓭nA-ak./|!ɦ@$pܢE /^\vm۶@ݢ@ yJlyl~oKޱ @@@@@@@@@@@@b ӄ=    paaa3f^xSwN8ꨣrgO=Ti +yK/EzkuElYɝ 4m4?xcԩqƴicM74uoƲe˪< ;wn>y~y&} @ @ @ @ @ @ *3N @X7<zvGϞ= .s=7R@vK.e]|IwyqG&M֮õ88,Lxꩵ8!R }?o>SL_ǧ~-Zw=."k%Ije˖رcc1bĈx饗⭷ފ~c}o~ѲeZme n7{GQ{ںh @ @ @ @ @ @LNXlYuAU @z wqXY`q 7oX`AuY9Ī]vwm`qW_Ž=/~]vݠÆEgŭFz=u:"͟_1cİ/W {W6[ou?;SmY.LHπ8rx7r}b̙9wwv-{kM6  @>Rd*m۶m6+ziYmKaKFĤIoQG( @ @ @ @ @ @, r= PAV+h ,(|"x㫯>}_ѬY1 riqȑ#駟_ ^{aoyzZM^=b=#.$+jA߫lٲ8qb|ᇹ>$YnHY jSN9o-Gjǔ)SC&ɓO> &Da9k֬Euk=bm[.igTO?7C"È @ @ @ @ @ @@Y @ֻ N @ z⩧wߍ Dc뮻暂K9sf1/"ڵkWvyP4!.DqY?ŁxUitw, 7޵K!}Y7.ƏB_ Kg.`}[D)82մB"=feVJRu,YӧO?QkLYj͗ @ @ @ @ @ @ᬝ P-AVf) 7('|5-TS0X*5!^:uBMl)-j _kذa)+%Kb….Z(/S[?*)l,M8~%cfmrHe qsds"3嗣8:QdVtΜ9Ǵi2AH/ƍGz&hѢdټyh֬j&M"t32=իkݺuKZOmSXҥK0-Kg[xv^.X ;==S-gkr\E Lẩ%39zY)]v93-SMAWK-ſDvXwk5 @ @ @ @ @ @*W~v7 @ @Hg{g4uxO>oR۪BJVСClVѯ_:ֻw[ou[[]_UuFtS} ȸ6@ iڵkM ELA)2[:,LA)S%AVV@bEdzۥi}\MVLSmٲe~j*gBT@q~~GqXy} @ @ @ @ @ @ 5 @ @ o>R-д–B!S… s]hQ2 e!,?jry䑈ώ/#357^QFZYgOAٖB& ϴ|[dI,]dBIWW_Bt8?֭kz>^Vxvg5;>֩S @`= |EvZMǓ @ @ @ @ @ @@-YK/i @ @(иqb-r_ݜ_}5#~.[]k  ׏͛ZY裈sύ0ׯz P"&k"~4rc%@ @ @ @ @ @ P=Va% @ @5*C"7[M@U(Ε̥ @%о}G7& @ @ @ @ @ @@Y{ @ @1ѻwDԯ, 6_}s'@O":umF @ @ @ @ @ @@G @ @G_V[E}"ʈe˪ @ @ @ @ @ @@ ,@IDATuYݮ @ @A`Ȑ{'Hao V @v ѣ#v;= @ @ @ @ @ @YY!@ @Tq[nw#N8!"46<6 ȍF @J l]1DKV! @ @ @ @ @ @j% Z].%@ @%G\yemEԫ8# \k3%@⊈?TY3A @@5gvɀ  @ @ @ @ @ @@YE/a @ @xڳ|ۼyD<ѾC7Ym @@O~qS @ @ @ @ @ @ @`mA @ @X`ƌ8眲O;G MDze ,O> P9&uofO @ @ @ @ @ @`]Ac  @ @H`Ѣ#4)G"_'^,#v5bM#z+;~kXSAk*==EpBğ~Q @ @ @ @ @ @XsAkn @ @8̈3bɒ>/\'qy\s:m9!5L AΙS&e: @@ q"^zҺ @ @ @ @ @ @Z% V]n%@ @Gq4K#&N#2eyHWDԫWghT5YTTFe< @@U7b"8 @ @ @ @ @ @T/Az- @ P{,>9xpGGFD_oc V A.^`8 @ pB}BMG @ @ @ @ @ ~AW @ @Y`Ԩfƍoc/TYG @E"fώx2c$@ @ @ @ @ @ Py +RO @ @J6-#.Xn-"~ @`m7_~ ȵt:D{Đ!5fH @ @ @ @ @ @AV @ @(8""/.s)R!@@e ,I @-oG+aÆ{Fm];zC˶ - @ڷe#^~Yul!@ @ @ @ @ @ P Ȳ]l%@ @XlY{뭷7ߌ|w#} 4=zDϞ=#|lMڶm GC)4}R-L>=>\ShZw],Z(ԩ]v͡}w1Ҳ[ny_Y}F@Y{ @5cAkz @ @ @ @ @ @j z͛ @J ;;6^{xWrȑQTTu֍ݻ;?яW^ VZ#,)TYxq3&Fow_׿KFⴷv)K^r T k7s WK./w5=Z{ @ @ @ @ @ @O@ EfL @k 0w>|x33fDÆ O>;ׯ_;6mkJ` .ף:=jԨx7r6lX|ͱphӦM`~Y!P;R9cfI@ 1{vćFn}9 @ @ @ @ @ @@mY9 @ @@͛/b<1t1bD,Z(w~n} T_ TE\.Z_ |W^.,wuw}F^ѤIa@YTT'fJ @@ :u"{Od @ @ @ @ @ @F դ @ @`MF?x<1lذX`Azg}sύ;ڷo&]jK 4l0g1uxr}ꫯFEG<8CW^vN@ v@q|t<;~[ @ @ @ @ @ @XQ@> @ @@-XtiCGVt:(N>ַm۶Hb){^ӧdz><}Yqia{^')R kQG~8n|cqƀjI ͛GՆ# P)rI @ @ @ @ @ @j@ݚ?E3$@ @,0mڴozw=|͸Kc /E]$6A̽RRj=t{-sK` ull=#>`c  @ @ @ @ @ @TA:% @[o'tRt)n8cYgo9HVҽt{0݋LB@Y=Q @"PG(*=8 @ @ @ @ @ @T]AU @믿~xN1}x衇b̘1,j!@ҽt/{_~MB@HAsT1 Pu gU1  @ @ @ @ @ @* ^"@ @58qbs11`hժU;1dȐ8蠃N:kԗT@ӽɷ~;ߣ^Mlw@ ,*c3* @ l1}i @ @ @ @ @ @j 1 @X#e˖ٳg|1rȸ{wkԏlto{4ݫMnӽ P5;7Ϫ5.!@fEԫgUs|FE @ @ @ @ @ @* JWX @ @`f͚rH\uUqw?}Y>4]'O?qaeUСC!94s9'ƍWݮU_^Mlw=tO+T͗@Ιvc6mZvmo;d=5dȐҥK< %@OnynNdfL @ @ @ @ @ 6 F1 @ &M{̜93|8c6j-[ViS̾JjMMߛG}4{챘7o^6z鹌?>*e\SNs=7w7tSUJIw=tOk P5Rd*k(8:tC-ܲ g+Rftobɒ%_wqI'2˕O<۷ooʔ)qgnVi}VfGNrӽq/6AgnmuY"e'?I8U=J9'׿Ƨ~]齓ԩS_~qEE˖-cU+2~ҥKAq%Dz6,I&_2uguV>sqý) SOWn,aڴi>|hѢEx٠ߒ!W3 @ @ @ @ @ @]~  @ @@Xv5乤) +B~yn?rPضnYRG+!~2Αm)3ٯ\)+,&URZݪK[V˖-'tR5n=#OB(AEr-;C۵ks Y >á@Haą)H8/:8`7o*1)Pr=#s/R?)24oo;a„r pY w}^Kağ}Yr!%ϒN @Z. L @ @ @ @ @ @ +L! @TT )OSVW^+c…yw mޚ)/9t D^bmJ|=֭[+霿cҥ/}B^xHatA92o>va)FޖBy 6WK,) {s@X:.{}y߅^-Z:uRWEKyMѣ w1ڶm¶‡f3ȴ+ФeEkߞ-}|-RdM//,ЬэQq=vi2dH\2f;l+G&MĨQs̞=;n3fLL8}jJN_ L?ˊjrc:g_CSVj/ҾСCnoo9y6+7ՙmS-G)4/סdjV aU5^nUF}Ms~+VY8-=u+Poӫ/ 5.Ϋ>`aS^D ٳgǧ[m;36|ۢGCl`† F.CZBWYc*+k"kJ){u ]V."s_~e&Hvӽ P΋wy&/jʫ~aaS^y>k{/Ǝ^xap1)8o^^s5nj3-Rn {\UIc^ջ0/d|#GK7nnm'@ @ @ @ @ @ @ P 2Yl$@ @*pF>}⢋.RC\xqu]׿5rx'c1G-]41.Y$ O_:oR:k9SNA[ \U_^c,kѢEn1ץU\etoou/x?b9y / JTڷo5}5m4R eܸq+o~MuD r-ȯ{7ꫯo-ΝSNk @ @ @ @ @ @ @* H @ @@[nq#u]We8>8ߎw13fX{|0@pѦM}Μ9lٲU;Rڵ{7{@ʿBׂ JNq5D JK%-/MkRVgZVϧHᖩsѽ{̹/}]Sٕ]^5y_ӽ}wF6@F˃r €^{y=˵}wf*^z _~9.ou?Rc iҤ(YkV_Qi~to{\!@j4nܶ8E)Pxh۶m\tEySYϳ4hp@@t¯R || 5kVC^~SxU YhI!{Gs90~ӟƠAzv!^8ꨣr(ץ^۷sJ{K.#T{sSe },o:u3όQFvmWUrue(>AG@}'9}{WG;⊊ۤ{7)p4ʥ{[!@ Ȣ?H!) xذaѺuΝ-[W+4*0{dMJ6d:,]4/^)jɱ[-2I;w.ٷhѢH5mH4iL>=ӦMն-4Xij~SgNre.wZIsLc*m^+z]WgW]9}9Դw?)ߪ*2TL+*rZm6GqH1s|_|nlVѵkׯ.ϳtOMi&%3;),JzON.+L^ݻ1/**ݺuˡͥNDs+ž  @ @ @ @ @ @_n{  @ @@HA=\~9Pn_W4@j]fB SСCݤnr ʟWu\!R^ .c=6w޽i+|`Z׏T+RJp򗿌杮k*噖t)P LK.f%5q,: }\1uYlm)GK/4^uUqin19'hѢmLEIM74wߒ+鹼RvZ/띹}q TCcw\p  @ @ @ @ @ @ @@֨K  @ @HMgqF}q5bxEŠAQFv@e/hM<9ڵkWFuԲe˸KVQWf}68âgϞ垢I&_;Pu-kk2Ʋ,Xw_\{1nܸ8/֭[o8'hٲm,XY~VZ׬UV9M܄  @ @ @ @ @ @ @Z@Z9 @@ ϸ n;/?8餓O=zl!/Y$^>SOˁVza~"ժZ*!kYNcYmmcƌ;#XlYmO~m۶qNP`-{GVGiN @ @ @ @ @ @ @@yue5X}-o}}kr @UY8e ̟??޸cĈn 'GuTo߾C˶Yfoƍ#Uz ~SNx xWb]wN;-1/*V}1!?yDQֱ# @B/$  @ @ @ @ @ @*A~%  @ P%R'+8sbʁ~xtuUVouEq? _|СC}?1zbc6͛GU( @ @ @ @ @ @ @j!PZ  @ @: 뮻.>xcvȟzիW\xOL'P;ҽt{(KKVҽ> ͚ W @ @ @ @ @ @ @6@ub%@ @CN:{z7ȑ#cȐ!~hذao}+ge]QFcIJ ,X ^}6lX @ @@-Hu^q1cƌxg⩧;.hܸq9rvDkFSW^ɡ#FG=F~~E6mj#95)85-hРLD  @ @ @ @ @ @ @WAW @ PRsM2eJѽ{_߯5+Rx;vl;[oo \:vSO=5 O[hQiT ʳ @ @ @ @ @ @ @4% @X@ or-4:uj9T7ߌW_K. 6lzʵgϞs=y!YБ%J(**1cć~~=:y…QnHZz;۷Q Px]͙Sfc @ @ @ @ @ @ @ Ȫq @@ ;Cs-Laܹ{ŨQJ?~|L:tC!w[out-״޺uBWV)0s㣏>5;6?N2%tm]^xѻwiӦ A  @ @ @ @ @ @ @$  uC @ )`owε--,Xcƌ> Bhc=~i,[,7dMs+N:Eǎsr-A^-Z'OI&:qĘ0a uyuԉ-"Rh =bm͵GѨQc:lHf͖MTw. @ @ @ @ @ @ @. _a#@ @*#~\WԼy?qs_Z><yIPd k׮]t!B|ͣ}yjӲe˕OF/LsԩgZSL)z0.]ACBz׮]c뭷&MlY955YyY @ @ @ @ @ @ @lhAZ @ @@)ȯw޹;.\'O'ƤIz LcƌaÆ 6lC!۶mnii=֭[GVVX_)pRe"9PǙ3gƬYVX~QӧOiu,]s!3-vy-;F L:*)g^(~m;' @ @ @ @ @ @ @) f^W"@ @&vkyS;wn:uj^iӦE!0~'9pƌ9p_nݺ9 rM6BmѢE4k,oOzӦM#Y6n8/z55=9-4hP*V/t^ֲ4Kƒ%Kza[eZ_hQ^\`A^ƴyJzKsɵW_ٳKjڞοr_~lӦMIf rqsfmC9۷oڵd @ ?AVd| @ @ @ @ @ @ @J@d\K @H]tɵڛ gΜC!ӲtaB0bj3qĒҡi=0V) e˴޺ub̋W5@IDAT, "(E, v4آj"h yX5ѨDPT|a^"(E gpeY`]=5Ϝ99`.sKa0f 4( V#VW` A @ @ @ @ @ @ @V& re: @ @j tlٲ\VhѢH~m̟?:f̘8#.=3Re>Ϗ5j,w--MAk.:[o>]SczAHA歺 @ @ @ @ @ @ @M@dٜ"@ @(_,ʟao߾W{KHs+qJ#@ @ @ @ @ @ @ c slÔK @rQ`qСC@j- ` @ @ @ @ @ @ @.PG4  @ @r-G%I]@de! @ @ @ @ @ @ @@\+X @ @@n L4)7xcԨ"vO+ @ @ @ @ @ @ @ Ph @ @@ FN(OAKj$@ @ @ @ @ @ @%TZ  @ @6mZ|׿5jժ[ū2A> @ @ @ @ @ @ @+P|3 @ @{:ׯz@ 7/JV, @ @ @ @ @ @ @J- Ro @ @@ ̝;783N: @ %; @ @ @ @ @ @ @('4a @ @ 4(ϟ}YEL41?1}zĕW.mOm_~ѪUO] @ @ @ @ @ @ @TVAugE @rX`…Kî޽{o+Q:oxˋQ#so[^ow @ @ @ @ @ @ @]`ɿ @ @wSLs9|6T@V4) "?a} @ @ @ @ @ @ @eYv+=  @ @2 \~ѣGh Sg4qeE7jѡzxF @ @ @ @ @ @ @jv @ @<;-ܲ&{ֱG4i1}zԪq䑥?J @ @ @ @ @ @ @j @ @ \uU>.R$@J#ѧOD-Xqa\ @ @ @ @ @ @ @9A9e &@ @W`cYgUyTRwһծ?J @ @ @ @ @ @ @AH @ @W_}ulqᇗ  @2 hq5k.[]%D'?[wv @ @ @ @ @ @ @( Ȳ[I @D`1dȐ83FJ s @@N pKˋ}6 @ @ @ @ @ @ @X= 7 @ AEޒ^zf%n"5[₂C]/ @ @ @ @ @ @ @VO@yM @"P$k={FK顉rMƒzܧOD͚Wvmow @ @ @ @ @ @ @ 7 @ PBG'ƙgY≟ {G,ZtjEuT.F @ @ @ @ @ @ @* ʱ @ @9-pǁm۶u(h,"j,' ,__ @ @ @ @ @ @ @ ӟ @XFߏ'|2N?e @!ЧOĢEoѱcXU @ @ @ @ @ @ @X5&@ @r_n-ZġT1ŋ̙3cԩ1mڴL}Y̙3';ˢW_… cuKT_<5kjZrܵ^zQ~s 7,oܸqlѴiL 6*&n9 @ @ @ @ @ @ @V- rFz @ @+o[n>;WK3T@ v?,O?4 t,?YB4imQ5iӦ(1:{L?ylUtE)(0,2]SdadΘ1#R gώӧgds4k,br->E: @ @ @ @ @ @ @TEAUqW @%{' :SҌ!@@9sf5*F̙ӑ7|,Lq]. olM6BӵQFQFF<_z߽hѢ,rڴi+uYXd |饗bҤIE 6~sv @ @ @ @ @ @ @  syN @ֱ_Gyd0K1= wމ^{-^}0aBvm$?ͮڵ-ZQcY4)KIM Xڑ"??~|v9f̘x;Ȃ;m۶v-;wuiF @ @ @ @ @ @ @2 & @ G΂.VϏW^y%{xg7ވo&RcNGѹsСClٲr/T"7|oi1rx׳?Y8d:u2}7ҹGڵy @`|+Mڙ, @ @ @ @ @ @rT@dn  @ @$~xdzȹsFVb}={nlMʽ#8"{{e/B 2$ lA:(?lʽ @ W~@dBZ  @ @ @ @ @ @,K @ @V[`1t8}Qs=q}[n1pڵkiӦ:S@n)83~ ><;cǎqG,hs&љ @ @ @ @ @ @ @@Ԩ1 I @Tqz(fΜ'tR_ @ ̙3'nc=b-Bwq6lX|LӧN&dlqNA[ E @ @ @ @ @ @ @u% r]ɛ @k׮ѢE^  PovzѬY8묳b7{,M C9$ԩSETѓm2NSNH{&푃 @ @ @ @ @ @ @G @r\`SOE޽s|%'@@<~.j\ve駟ƝwtPԬYb&6 jժ٧=H{$MڣWi @ @ @ @ @ @ @֖ ȵ%m @ PE lIvaUdEA>|xY`:ugQFůhg`iOޤ=J{:ޥ=t @ @ @ @ @ @ @hA-l| @ Pn8VZUleC5=ztxѭ[h޼y[裏O~5M Qګ#Gf{0eS @ @ @ @ @ @ @YQ%@ @UP^ 'PWgIX=:=e]bܹ1bĈxbw^^iޥ=L{~M{ @ @ @ @ @ @ @ P5{@ @ @UW`С6Dǎ"ex㎋Sƍ7={2Ke}_[n%Æ 38#jԨGÆ A&dyMj#@ @ @ @ @ @ @| +ߞ @TJ wguVOQX[zkW;~h޼ښqwcΜ91s̘5kV|g1uԘ6mZL<9&N3a„ꫯ26,:v;wCӵVZUͪ @ @ @ @ @ @ @$ LL: @ @C=3Zn R_~qWF㎫m)3m6N>obѠAR,^8&Mcƌz+F\sMQ^{ٰaÕ! @ @ @ @ @ @ @@YԊ @ @@ ̝;7~ꪫ}l @ R_׸뮻裏΅X)vq1D-3\)@UVy?~|ԩSQ?7 @ @ @ @ @ @ @U[F^ @ @!#Ă %_=~e]VB SP?ϣaÆk>o1=и+ڼr-obMve)rԩqWǸqsѭ[)E{SLYaUc̜93s1bDʠA⬳Z+Dɱv4Pq YѵX%x% @ @ @ @ @ @ 6AMms @ @{c}F M5XhQr)~9眳fT[s̉o65kVδ_|E2Jx+(C3 @ @ @ @ @ @ @`\+&!@ @+p=ľlI.BX9sK/=zXʈ#㏏c9&e//~< .̛By'Nu->eѿ8蠃g?Y6n^8b>}O?]qO<'|rt5ntg8CcԷH/r򗿌 &wܑ7M;w}Q "9rd5;96l2+G&ҷ>ww^f馛F-Jo/.UW]UjX|dvċ/XԿO | oz~it!.,E)79sfpN:ů;wn+ƕՙO??_emi  @ @ @ @ @ @ @`] \W%@ @9 R`WE GEEΝ+LK.ѱcǸ#͗~Fm{Y[ A<ò:* G>|x5K QFz,/eM+HD6 'o_uL2/͝R8gZscر>e뭷^f~8  .~sue˂:kժUE)>n +bȐ!CfSrUG^^^p YYn> .9^< @ @ @ @ @ @ @ 2 @ @@%H`B*i"@@ t4nܸHo~S;Lw{w֖S] <#:?&N/RԬY3{k׮)'gz=3 y۷o;d} ve)s,^8 iL>/t̮)w}ZW 'k㎋?8u)0(=6mZ֞^HA)qvڵkg?83+f)& Ut_oqݥ}H%{,۷/&t\uU%f馛/[E ݤpɴH!lwO^bR+T8n Loy oV+v]:[j=# L!׏Aec @ @ @ @ @ @ @ցwLlJ @ @ &TbUHr[n6y r~k޼yNݳ@Ǝ;_H|),/M<9.袸;.s΍C=C9$fϞlAQ[~z 58~D N͑۴io2׍6({ :q BSe=}G^D>7zUT)^58Ӳ4/x'+*2y)ho6=H!vX~<_?Kcƌ_?̙~{?>7cUuwy٫*.X hٲ劆N @ @ @ @ @ @45*M% !@ @*@ VzDzJUb jl`W5r)'///ntMovC=̚6l\%C yG͚KR8\ފ &dԩSߥ=UV<v1k֬ԩS 4(:蠬}mHfq 6,-ZurfϞ\[i ˚xW1mڴWnݺe7tSW`YjHD67Rǧ~gyflѨQ冿kgϞ1cg}o˽ O.lh7q>ˮ|rL2e>uXAwSN͞r!u=^zezF]w5.8㏏d&O5㏳t]v7S^?-":uOk ?m.~iᕩ)h4' >Ma5jB ":A61z;MM&͛= @ @ @ @ @ @ @ ->WUK8 @Zs]# Y׵֞K @,h\gR^y䑑 _}hٲe~h_~ . f4oZ~+|ѢE<) 2J0O}o ]\cܹ1a„hӦM|/3i#)I&:u_1pxf͚LKVg jMa1v,OSaS]SeFm4gΜ(XwqU%.вxdq$@ @ @ @ @ @5㢭 @Xc/5lozJ'~{'?}7}|}naј)XpM/8|{]v֯m۶+߸q>+ 6 vyv/sY<,3MB7i$:v=ҷ@YH-Z0|xW_wy'97hРO믿~+L *Y^Wuo @ @ @ @ @ @ @@y M\ޕ @|MTRԣTOA{ 6,:tPJ[C9$fڋ7ԭ[O+9rd)O> /0 7/^7=ؘ2eJ̝;7 ibdŃ?W4=G^ce8s+^˸ @ @ @ @ @ @ @*& m @ @*/F <P'@@dMg{W_zj[c !k/XhQpUq lݺu7R;u)ӻuOv%@ @ @ @ @ @ @: ^Z  @('|2ڷo-Z( B$?\rI~1lذyUi~-SLN8!hذa|QPPP0ZjE׮]PPW^Y @ @ @ @ @ @ @ Ԩ . @ @`W"@@ˋ . cmo`*´i/Ӟ~1bĈ#CvmY8䦛n)G:Wt|g+z @ @ @ @ @ @ @  @ @)jqovOn;,2y睱hѢRzkiޥ=L!iOަ=NGfͲ[n% 0aB\wuqQGE >5k֌5#  Ȍ_ @ @ @ @ @ @ @JY & @ P]^|HAV{gu%n@ڵǾ'xbo>n֘?jH{*Yڻi/SdmڴN;-/wߍ/s̉W_}5N8F_ @ @ @ @ @ @ @j$ m @ @U Ƚ{U<'@i&}Q3daݻwx ϟ75W@O{"@իWWiޕǑkѣ<3 @ @ @ @ @ @ @@Y7Ւ @ @̘1#ƍ{ך(&ЬYKcqmW_}?Ѹѻw>|x,Xn+B 'd裏"IڛGA @ @ @ @ @ @ @`m \ @/bŏ[ ck׎w<6/Ngn{v|ͱFEn8 4icN>=z6lX<1{رcwyq1D-*g"@ @ @ @ @ @ @6 V[( @X /;SL @@Y><ny;b=XGC=={ .s~>d/4վϜ9s⥗^>yxf͚{ƀ#֭[W{' @ @ @ @ @ @ @G@d  @ @u*0bĈ,4karTE"> "[/⦛"N>9"/ť`³:+;xg'G}4⊨QFl뮻fgΝcvw1jԨx^qŢ%k}]?~ĆnX , @ @ @ @ @ @ @ A. @T~N}<  PƎ8唈's"??|)#sԩyS᫯wuW|WQ^qc߾ڬYOO?=zt3&=&zkۘ?%EǎC.(chڴiT @ @ @ @ @ @ @M@duq%@ @[`ܹs)O5 @K%DSěoFê*nGuTv1jԨx׳k G|衇bƌ 6*b-ZzWD5.w3gf6j( l%_y͒p:K LO @ @ @ @ @ @ @`A @ @@Hboqk׮Jb 6sYgEcFavy,iӦE 3fL|Yaòy6h 6m)`2]٤Ih~EnݯQfͨUVvާk:.\^SpOsΙ3'9{>}zz9u:k֬Ӝ)r-v-?h߾}-<Ǝs1b}׺pW @ @ @ @ @ @ @) "uM @rD^N:H$@@((䒈/g%AkPoISG}SL) ^, a|7>+ k믗{<֭[2ٸq,2;E͛7֭[ges1bDWDqCDlmYև @ @ @dl@IDAT @ @ @ @@Y9A @ @` qqǭLN\㏏XW]q&M9\q…Es̉ 0yƞ{ ,δZjeg͚5~_~qGqa={FKĀ}Fg @ @ @ @ @ @ @]bMʾj @ @E3gΌ &DΝ @z(WX4rV7ƍ78; M_XhQyѱcJum>bĈ+?#n%"; @ @ @ @ @ @ @Tf8 @ @/f?  DyfD$ 17#r=rEۑ ѶmuE"(() @ @ @ @ @ @ @@ KeH @@ xc6>R1dH]wE QjCS&l 4ȉ۷1"b#t7.'JW$ @ @ @ @ @ @ @@5Y 7ݒ  @ @@q;orOƌ9bҤa?yUߏm#9riٻ1p`DAAN-C @ @ @ @ @ @ @@@d5dK$@ @+5jT+#D{DKsń r.pgڷ_9`@D]D[ԕ @ @ @ @ @ @ @@ @ @` ,^8F-r퀉 W]q=zD @ @ @ @ @ @ @(M@di* @ @@5?~|k׮2  bΊ:4cDÆ _q*>-ܲJ}#" ?Kc- @ @ @ @ @ @ @ D @ &Lm۶]ӚJ #.;/ %N8Xo*Uk'FVd~"F\:}FrLJ @ @ @ @ @ @ PAVͶT @ P\`1iҤh׮]fV1`@G4nB^zU+.An>.%b§ @ @ @ @ @ @ @_@d @@ *((6mD$@@y l-Z#@@È=">:K"fϞ׿wޕ,p1uhժUENSin>bĈ"%bJ[ @ @ @ @ @ @ @rT@dn  @ @2eJԮ];7nC>rJ#w|~wf7sLNM!-A3??_#v1p`DAAyk @ @ @ @ @ @ @ ;o @ P>h֬YU{ T/&bWo/IbĈ"%bܸU @ @ @ @ @ @ @BA @ @ ̜936lXVmTG%9ѷoi- +np7GnݢyśIUVve]x~~D~#G.}c]"((( @ @ @ @ @ @ @TgAy @%h 4O@ˆŋ#]o =|駣w>ƿL"s5}#" iر1 @ @ @ @ @ @ @R@dv&@ @.0o޼X`A4lذSX?U\`Ĉ_W[n%5jzhW(fϞ_} ȲqϏ/bȥM:D QPP  @ @ @ @ @ @ @eA. @fڠA`$@ \xaD{/Kx2dHxQVeV_SLV޼yj*Öݾ}ĈKCG%b6  @ @ @ @ @<*K ޛjPT@[P(A+*Fuź,QĂ ,E) UH?gLB2!{gr){,>y@@@ȝAʨ@@@HS`xɒ%< u_~f͚ /PY5dsYhs{pڵkΦ z?| 2ĵۙǙ':5Wׯ}Wz y67{lmڴI~{vޭ1cƨK.zӧzꫯ 3O,EDH˖%դ%en!=W_խ@@@@@@@@@@@@@@ KV*E@@@ ;:wb^W\95FgY=WvwLLΦ z]Hc;~mOVz<ǫEԩSn׾}4w\͜9SGM~ZnoܸQ7o-UY)XJ.*l=JȑR˖ҪUHZh7F               Y&@dR1   +pI׹ n'y@RJb -^8#\I^hMl;kS:?>,M(s_A-qڴi߿i7zziРA;  .uǂ +VzERDlYD&RTw2_vNJo+@@@@@@@@@@@@@@-O]=!   @ ĸnw>rʩJ*T|y3&C '>6_VɏvZצt~V{m)6V[4iBBBt7'9yfwR_hZ_{fAU.-\(EFJ#GJ-[JW];_5jpk@@@@@@@@@@@@@@΅AB6@@@0'Oϟ?zFw;vy߮>HzOkŊ8pڶmw}wxI ڰ'|R?KuA/{mZtumj{{IݻK%J]E4x`ZbE͜9wpÆ +k.},]wV O\siuvcǎ1bQ^=5k̷               @ x!   'Otm4@mۺ:C_3f_WuEZ3UE+}$OԮ]B6lp!r٣SV4ydM8Q˗WÆ 5jP6m>o4h_~EGvNX{fhk׮uqҤI.NIs0k֝k!}+_|6l[7o[ڏoƅLW^͛7:BBB~{ZZ_1u]nZI| +RDlYBCOp{ꭷ҈#|k@@@@@@@@@@@@@@ p {C@@@2Ҧ,CbRشiSGn y,T;J**\[H+vrˌHFJ\;}2ZogKe"O?uܡCO  .@w[ٶm[ZW4z%3֪UKtx:Wg+VL={ƍ5|wՊH8qB.;tG}RjUY}g>p>|XӦMԩS}8p럅Pz۾}LR9Y"`yB)2R9RNiժ5UT)&Zlٌ]              *@C8    @^رcGCܹ a3fLmgppps y`֛9tɶ׻˗ȑ#ӧ۾rݺusm% '0y){ڵ.~zjYÇwemVz-R-o>}IE] )>?^*T=Cuq٩=裾ώYVZdS]Y%`S:"BZ,&M$fUԋ              A]    yN"10@SLq\6߳k\۶e˺3fK.ʕ+w kaaa:t,2yٸqc]m75m{ǏԩS?~oy$^zZrzӷo_͙3G?+K-!3Y9vvܩݻw#^d…Rd4rԲ              R seX    -<zkA1118qbu\eOGųgKKJ}rƎ;Կ߁~=O@8qmGFܩ#FPzR(* =~4h?CbŊk_N:yN6LʕӤI4n8O?UZTHM߾$nc=KH_{;wVh/Beʔу>UT-?sYH/[}ޥml۶.N-ZTSNW_ѣGkРAիF=@/^\ժU7쮱pH+VPPY|Gl.St}yԺuk=nlW\qjԨM ̓'CTȑ售Zrƌ%J駟N"             @ҿ.)@@@@r72>>>Au]Zvz/^.$=n?냃Oۗo>he޼y޽/ 057uz;&F'I-ɓ'uo߾ׯ i\I?J,.$5lP?nF.]g>c =3;#_}Uwޗ_~) ={(;6aUXQ={ܹs5׸qvг>}hzmyI5l0>SDD[ǖ{׍ԣGwGz# .O<[PYm~dMe˖%Þ(y<˞k               cyHzU#  dС5jT.}}@ L<م9jB Xhs=Ǐ`|vx˗'@ԠmϚ5K:uҺuTT)9jժQ'f7oVj{nذAYfM<4v:tH R}gٳGeʔmb?p#GhU ~ꭷrc ȑEI'w}k d@* ![N@@@@@@@@@@@@r@971     hł(XB E~7NZR:uTtin:H- 2Ťev.d{O?+=ŊKig'γ(PIZR"EԨQ$!vݻUlY[@pɏղexPÆ%OgBGذ              B<    X7emsHظqs1J-p8}t['OfHC o}}&MZz#;V4H:4;lk׮)d/              @ 4    J)ӧOꫯqZdZI{w'Oңl@ ԨQ#D$0}niС\rڹsg'p@@@@@@@@@@@@@@ eF@@@@  m֍zϞ=:uTHCݰA];C5ԓ۝3;۷k*[lR<Fd$rl)=),xJ͚O>!2`nA@@@@@@@@@@@@@N 4v     u!!!جk$ּiTF|&Md&rO6""eoDⲡ34              ! 3    dN 'Of"N"`I'F:ݫ2eʤlN $piB)2R9RjRZ:zH_@@@@@@@@@@@@@@ \m@@@@P@,l%U1ԩSRٲyoq'Eѣ*QDfl""e:и%eSh@@@@@@@@@@@@@@ M     A@xp))l)Zu8@@@@@@@@@@@@@@ "XE@@@@ %0˗OGI0!aԮԨTTԷ'.ώn-M )YhQO'IkFDH˖% I)**aA30@@@@@@@@@@@@@@ @ C@@@@r@ZѣGs,qFiʄ޽RLL w~-pA/^jpiB)2R9RjRZ*W!             '@d:    -Caf|XEM<'.-\(EFJ#GJ-[JV%0[BXmEGK7ܐsp @@@@@@@@@@@@@8  K@@@@Ȍ@ҥwT.5RWβe aJcS9' '>.[0&MgnUO+\) 1              )tF     2ehϞ=HA`ԩH]&VYpOH."#瞓,,[⤗_>Ի%              @F̈"    kΝ~*nI*Q"ut[ =zTaaa<),p =-l@nUڸ1O0h@@@@@@@@@@@@@@ SAf@@@@ȸ@ cǎ_ ( (}ڵ{yL(/lR9uJ:~\zɔ`              @jA&~@@@@HrʲgQ yڻƜ/tRby 3gp™ks+HKΎ4thp@@@@@@@@@@@@@@t O7a    Y*PJW֭[RyժRNRH,uWFq=zTaaaZroI=XKS|B@@@@@@@@@@@@@)@@@@@ TBOټy9n96w}RllB!)8vAg)#t]R CΗ/!l55} R;~@@@@@@@@@@@@@@!7XG@@@@(\ʗ/ M#5ڇRݺUBE<)?}IxO*..NW|K[/RJ*%K*44]qugW3%Խ{4g7W_%lyocVl]wR 2Ӟh8q[m>96SZt28882}s {G ĖB z22.E@@@@@@@@@@@@@R 2%!    k본]i˖-ںud}i..aC=zj ܂ -L2:TJUZշ_ p~Y ҽTI善cFϏ{W5o^8 <_~ɧv~U׮3e9z9▶ݶg0R ~ B!}aޏZ.V/%JZ[ڹ@@@@@@@@@@@@@{A{Έ@@@@@W^= .ܹSK,˵j*YnN8:hihum۶*] S+Y q *u늫}?~Y`},lλn!u$io]\5kfakW]uU66lؠ%KZ;V111 Ծ}{]}jӦBCC\Hހ RK:kӦM-[<B+,[78N:jժ P;fc)1Z/ZXXcFE;z]{jժ^U斶nTPts@@@@@@@@@@@@@@A@@@@H@&M\0?]uM:U,X .СCծ];5nXAAA9jL;[V-٧gϞnѣG5o<tiaFroݺuSաCZWZɟ?[#N8c ?g!ް? VgJ*AXAJ`Nԭ[7[=۶ms[ʂAcA<|rkڵkOzdwU              9P x2    @P/ sU}'z7](bXXt ;v(έpԩ-͂0LnAvnw- ៊~DGGk_}UViӦMwݫX S Y{زTR=f ^֕}wAޥΚ5K۷owY@ > *ZG2@IDAT@@@@@@@@@@@@@ ׽T@@@@)p%hҥ2결ѣGk񲠱Ν;:(444 wy2dXcj„ jܸ޽{gk8fll#ʟ?vR并wB`W\+VȖ֭sv/֭BnVկ_m۾"E9+_ I^9C{׬Y# "1c^|EYhDsxEQFny\rɫb@@@@@@@@@@@@@ @8    @V \vezGj&KSOiҤIXrYnNl .ԛo?4h .|·enV:z [d/^_mݺ5XjU5lP7p ջ UNOYwG95 mҤ$>c]?ҟ~IolNR lڴ7of͚Zu@@@@@@@@@@@@@RIS@a    Bm۶:x-[& Ieƍzv;vzM]:nb˖-e{N/|I>l0 MG-9I<۷k޼ydgaժUsyyҥKajB pO=|ݻr̘1z]{+P֭]PBV@@@@@@@@@@@@@@@A     M*_Νc ]pVZUn&ebm\rzg^zɹ=Zu7ƺvNˍ߿_|k}Zn ,t㏫yPBn>cdھ}{2رC/֢E`7N'NPݺuզMwUW]%Kz/a             @ 2Ov    (e!r>`t)~X`{n=U@T@,-22>kvMcƌI wg\R}f͚K*$$D-[T>}ԪU+5k̅Azg@^k}ld͟?{eM6Uǎy]tQ^a             |k     9ԩ[:t蜷-+""BW]u5jk׺JB +T?=.B},AZ!%uSNא!CTZ57>]ve. r3gF+)9 , #6W,@!bs1k@@@@@@@@@@@@@Ay.3F@@@@ڵ5s̀}Ԯ];k0aN+d_sKZn+WK.Od,J\ի]յjJ˖-СCaٱ^xA۷WBr0;L;6l.ٜesڃ>莝N              @d6$    ^%KM66mwW,l٢-ZhZx0})\ =z|Ivmcbb\!!!~;Vx go~xx͛}w2dj֬SG(K6lnHs6lN8Q6')             6 se<    9N׬Yt֭[պuk*Tȅ@^pӷԑ;S3g>}(>>ޯÏ! {ȑ#UjU >\W\q֬YB ~2H*`sܳ99is(@@@@@@@@@@@@@"@dn@@@@ XdttOc8x:v쨢Ejܹ*W\@+vꫯ֌34uTPWjЈ#TF M2EQQQڶm{9իW/^HCA6'mnjs             @N 2A    *Vǎc߿ۧ/B%K >N\yz/?G|rREN[ou>;C_~EShhhN }E \9isU0@@@@@@@@@@@@@*@dNs@@@@ W 0@g֦Mu\M+U} :~X^zt_ѧumΜ9kոqcԪUN;';nf{8pvܙԶnݪJzꩧrJ]wu2ʹ﫯ҰaTvl}}:tV"ikw֘1c{^Hz0nܴ9js>e @}m۪sι            dA~     r2˗㳍[Zʶ~R7t>#ժUKԻwo=3I`uQAAA ճ>͛B$]ŋGK9|5jH vwqI%ז-[4qD0Ό*7ov3oXF@(ҏ@H6x 7mn @Ysl[WD +V,g[@@@@@@@@@@@@ 9@@@@򐀅 [? <۶ms!ZvVO?T&MT/BDK/W_/cByaÆ5j:v!Cz״h"EGG{*U䆐VSoΝڱc֬YѣGW\YI\fϞ/X\sM~[/PZ͜9S#FT0 ^؂.ۻpO:>MC>9Xgʔ)'AlmN7h@=ʕ+3oݺՍsɒ%TVM/:o:{\pԮ];q#۷o-rڽKسpB>|/^nw,vڴiޭ~֎{wk׮ 9KsB{wjwAlʊ_nSO%QHg/VX! ۷*H;}?[jkQF}=ywkذaQ}ދmR5i$M2Lͮ1~            y|?\9/=jcH=  -0tdONGNy?:GMq 00 ޲sU,>… Y \ի5h z|r 0@kݫ͛7wS~}c3gڴie˺H իl9c ]ve.T3z-8O]GҥKk֬Yeb}t}# ̪bDv_ٴeϙvt6ukyp= @SNttmٺ {7]੅]z.pn.B~wԢE U{v, TR.tтmX@WӦM<@es,m۶.vȑ ѣGݟ]0~xivy[B~\ g@W ~b`+WTŊu66y?+>jJW]ul|_~z}m?#K.q!>`edfV<~ZI뾼+zg56.{Yx7v;ʗ// om{С.מu뺶=Փv3EAR%??{=s޽>d n;w *͛wϙ}Npg w4{Zߞw@c}Prz.ƒni{N;ehʕ˒+V 2 F @ }&MR֭x-lB.],ΊYНLj/0a z'Nns՛рM 6l_Vi$.BfFi[nJ|_k֬wޝz-͊7/S| x H񅆆ӓ'O:ɗ_~م?ѣ]ռy\%FEE)::XUZUw!gV}bsJɒ%]xO+>>qy޶,{^Zye$\,Xyپӂ@;<)S[o/_>hώZԾKsδb[kkQ˖-igv-h̞ L\4hwXW irbsjA εL >} fXp='V@Tasۜ~Q@ bcX>d,H~oYpw6 },Z}kiN\z2殻rU{7Zp]+}3;ӝcSX=ƻfڵ`t ;\%w͉a@@@@@@@@@@@@ ݡ3r@@@@S`Ĉ.m֬Y笃ǏeEpD ]ЎXxNZtAdJsAhvy[Yh[ʕ]@[ŊexrW K eH+&=HYhYf?Ir-ZHGC=}Mr6[f/YAK1/3v٣ƍ0> 4{|U.\ح7jȷre!SX@1 K}e֭[}{*U^-ъ7wr+i>p+fYؠy8ʙm!b`..\ht{?Yݳy}aҹsgg3h . 6l݊71=x3zUo`mԯ_뷅Zŋ] O|ve:_ :XmgX(Ng!ӦMԩS}+W)Rĵku-žOw6o(wMg y7'u@@@@@@@@@@@@)@d޼@@@@ 7og,\YDeڵ*V~gZ~ڴG+̓,{{~HHʺu{Nz 7x]?xgQ- 6x^fwzU•t?0>{&m7|M6kdsVV{8N+WyjJ K)UV,T5qg<&ޟzz2ZgjYHݻwviǫB 3f,0>sY%Kôcx峽/ϟ튉q ȞMjررcKf~m\qUYgCyY0ҥK"Ѫ!Iqqq4G7g{֬YX:g嫯R죅\ǻPAo=z_|9so߾('Ot3'`,=0[+bK/ʕ+իW/{d{>ӪwqzKJM2Ņ0@oVBFS\ 7es/TubI:^{ZF޳t$uƱcǴs'a! o***JO>#~ /`K_d;w|Vt @@@@@@@@@@@@-@d}t@@@@ \xׯ~a?~<ˇ٬Y3L6{lըQ#W#\获 *""»y?~~*Twq!۷WRG&gV9yܰaCײ=É:ZeFJZ~`'N$BdX8 03mV:vaAÆ Sr4i$7εc;ȑ#?#3}qX8iŞ-+֝x~ؽ{NA(XDJ@˖-q{W{~|,(L%wپ&@@@@@@@@@@@@rA~2@@@@\$OjϞ=*\JN-ZTSNW_ѣGkРAիF۽{[IOmXxЫ ܼy֬Y*Yd&i${̅q~w.,::Z>|A]ve׻1+ڻw7߸~;63{Νꫯt7f" ay8+xsصkW;v, zhW96o\ 4P%onۂ&N*Vαe˖ɓ6m~g4i's油 Њj׮{{_|2eʸwZPj*߻7γ}w\d֭㏻wkԨMRidO=bm/rgϞ?‰&S{ǧݜn@@@@@@@@@@@@@c'ONw@@\"嗫<U!1 @lLy? leaO= +^xwKOc[NVf@P! L믿믿{iƌ{u=23˗^zI_~믅UXw?W,$~ӛo j;-—  <ۺ sn:v쨬Sg2ƞKp?ÅUZ]{m3ϸ-{-f͚ݼ? ֭~׷m 9rʩqgꪛ ~vjK/u~ ^?~ٸ/"z>gb 7/-ZV-͞=[sΕZ v*_ w,;            A)QPx(  D`ɞ0.H' a x,pE,8y4h,\0KV^AAA~m96lpf`g!-qqq.ò` g< K+[lB eyڵkݳ`tbL_|/vOB9x Zx [mǏwARDhSɃt±o,B C%yo'??36n6]vƌL~0f}f^Df! ?Ю+{Q}eSis,y?M Ƶs-l?K>x}l<Vչ?&"JQQAP(bbbnޫѨ1jk/DT좈(* 3 E6;373Yks>_]en)@5/F_uoO#YcΝF~goc `-"q7tKcgoKe .o|E6o<]O @ @ @ @ @  ss]TEA9 !@@ ,WNpѣGA?x`{m+K."Sc_pqu :`,T.֮]{OL;SL4)wU~Ĉ#b٫W+8>IJN&މ\4ǫ:yNkܸq<%픏 ">;68˧c PnA[:"@ @ @ @ @ @ PT @ @j'p '^ѨQ cϞ=뮋;WxdMd=7i$.~898蠃"//ܬ7UVũǏn;΋N:iC)ӵNZ=!nbV^O?t?F~x曱뮻Vz'@`fKԪUk}M7U @ @ @ @ @ @@Ae @ @*SuY`w8cc}rnꫯC?OYWRR ` ;zL{i[lvQ-Kr<裣A1dȐ,-ZTJ!jF|0^{Ha~x\veqF^^^4i$-Z3ԔBһf-'ے%Kb{ŤIbʔ)裏G}˗/.kܸqv_ K}m&:uꔵw@,]4OiӦeyJA/Ȕ֭=O;CvaѣGٳgt=GI @ @ @ @ @ @  @ @JH_bqWW\Q)uB:묬͚5+ CLx≱zu]#B{d!Vςxgg}6fΜM6C9$.8蠃^z99T… sXT NMZ*>䓘:ujWOD K[֭@Ǻ-???ڶm+دuO7(R9sJfDzjߵkܹsԮ]Z; @ @ @ @ @ @ @@ 8[= @ @l}_WqyE~6(Νs9Y/b̘1YX>^{mEϞ=#՟ݺu^+Լybĉ1nܸQXXuɂ-O?4hP6֤I,HrUMYJa}3PcƧ~ܚ[Z6m"GZlZjk`;ZZuٳ~WFi ;t? ?v)Lm @ @ @ @ @ @ @@ 5P @ @r8#1~ҥK[^oYK}Μ937՜ȑ#cɒ%Y86lݻw=z;;vRYÆ ˫3w, Rb ^LG[o5 V+7ϥZhQH4-"RZji?ЭX"Rޚ-R ^ \3/0J\gϞ=⚪ Ȫze=:u7ݕ Sy|+X LSa ]Yw4~ JMAw~kxZv-,yR ejyyyY+_3OҖ~WV^u?t,5#?X[jK.]W_}]܋mە%}l2]+LqZ5I @ @ @ @ @ @TAc͂ @ @@&zӧOtI?9jժU%tRp[ݳn)lnƌ駟f ϟХwy'O!m)mn8d jJ$SZ׮] 2ٱcСCRx[uR(] (hܸq>*gzRdqKa)8$q@5Sdqbq cwq`>ӻr(**Z*8#$+ Lkz뭳 5.g)Lo @ @ @ @ @8@IDAT @ @  @ @flM<1hР+g?YafͲ^zU4i)/U\3TϿRa UM2<?XdIX5 @ @ @ @ @ @ P\ @ @[o:FYWfh޼y^:.\Y5(((cׯ_] @ @ @ @ @ @ Puʵ7 @ @ 3vZL4)N9ҥK/gjSHl2+fܹY^T& 7&W @ @ @ @ @ @ @*A 4$ @ @I뮋8 =И2ef0UI8r޼yUl ȯ8@ @ @ @ @ @ @䨀 ]e @ @(xk׮qAEaaaytj$ -f J l׮] W0} @ @ @ @ @ @ @* F @ @ РAx'#}<8.\ ԫW/6lͫnS3&nkجM @ @ @ @ @ @ ⪩ @ @ 4o<~X`A 2$ Ye˖ א!km @ @ @ @ @ @ @ +~ @ @eСC<3G!/.. W-]4 ϯ5C @ @ @ @ @ @ @ Kh @ @.Э[3fLL2% K,)ͮZsVX(((&) @ @ @ @ @ @ @ :9 @ @=zs=^W_m.mڴٳgWǩS (,,fڮ]2c$@ @ @ @ @ @ @ Ȫzj'@ @ ;c9iҤ?ȞVڶmfͪS1*PPPuԉ֭[P&@ @ @ @ @ @ @ ȪZj%@ @ P;s+1gΜg}"j Ți+=yyڣ: @ @ @ @ @ @ @*_DVו5/ @ @en0ti/].n)@oܹr65!)2??4  @ @ @ @ @ @ @.   @ @l@ O{嗣]v{Ƴ>= ȢϪZ% f#@ @ @ @ @ @ @TAUaH @ @7ocƌ>8k~{\(Л5kV.eHA)F @ @ @ @ @ @  * @ @fW^qeYg~Xb3lhӦMVBaaaeb|%]AE& @ @ @ @ @ @ @AV!  @ @W^#G?1p9sf.r_~4oZ.6@QQQF$@ @ @ @ @ @ @6^@۹ @ @@8bܸqpu]gs5 t1f̘@7o^,_<\ &@ @ @ @ @ @ @j ȚfM @5\`̙5\ (@=0A㢋.rk@NAVeS? 2v @ @ @ @ @ @ @T AUbI @WO?-F@hԨQqm-}w}η&Ocǎ1}L`UT0}cժUѓ[rU AΘ1#WS Dƍ# @ @ @ @ @ @ @UA@dUX%5 @ @m6^z饸+.w=Ə)<RYbʕѝ>l63 @ @ @ @ @ @ @`SAn  @ @ ڵk%\'NƍG~Ϗ/)Tϩv)VZ)TF* JV @ @ @ @ @ @ @  @ @ ;C >~իWop_n ;fL6-7 R2 vڕj @ @ @ @ @ @ @*_@d寁  @ @TYO>9LsLuY뮻Ƴ>[eS o۶m4h >裚`UP0`J&@ @ @ @ @ @ @j ȚM @ @Zh7|s;ѱc4hPtA믗\nmL:us g"PPP \$uB @ @ @ @ @ @l.:k  @ @ Pu?x3&.s=*v}=j2]Apq;__ڵkoL{{3<3>hݺu 1c,X ;kom͚J;X?[oٳ㩧'|2Rizfַ=cqywx.[x NMSY{衇R @ @ @ @ @ @ @\  @ @ַW_~:R`_߾}cnJ kA /|'6~җ+Wƒ%KbŊk1R_z&O~g͚J9P(,,̪/3fDZz(=*;JO @ @ @ @ @ @ PA7u @ @)pرccԨQ|4hP.q=VpbҖR݀GqmmxkS;Fq_Υct~}9{YQ{RT矟Aye>]ty/s=75k 'Ĉ#⮻K.$-[V~]H @ @ @ @ @ @ToA{}͎ @ @@ <8ƌoV3N9رc\veYZm6⋘;wnt9:t萝~GiӦ\[֝5Y5m 4֭[]\渥wFڵM6-N:=۴![z,w ۵ @ @ @ @ @ @ @@Y} @ @nw_|qiŝw]t!Cģ>+Vȩzkb1]vͦfa۷Ͼxe…qQG~i|qfAg...Srv:v칻["=SLI&Ztݳf͚eOq,t4ݘB!ӳcŠA>:uDzkOJ}ϟS)+N3^}8 @ @ @ @ @ @ P AVE5% @ @UA }1z6mZ ><ƌ{Glqe0jScZ[nY^ΝN(~={v<ٱK.$og]tQZn/R}Sr;[w/ݒB!?H!GqD|ך湴M׽/('vQ^O˗/Z)[Vx_"R0mҳ~׮u(۲xz)d^ͥ|1bDYXN;+.\'|rҍC @ @ @ @ @ @ @@5Y  @ @Tu;_?>=и{bv.]ą^cǎիWW|ݻwɓ'ξ}Ʈ_~#=zD ?Q|̟Ѯ]:}SVk[1o޼}Dzų>{7.sHGyZҗ-k6le]JΥڴ%Ǿi'U>ѶmHwۀ"f!} @ @ @ @ @ @ @[@d^_#@ @ Pzկb鑂ێ=xGb:N<ĸ?rs  I&ZgcƌSz>]zϕĺcǴmje5UO`YчrH|ߏiӦGK5'f!wyZ7KN0ʲ?gΜ/bZNׯ_|P\C @ @ @ @ @ @TA`M @ @@u}k?0{1bDfo[=#.xbٲeՕaΫ{Y%K6aâQFqw|\ycW|yeE,^8?ƟϏѣGСC*O/x馛:!_R`իc+m͚58sZToRЭ @ @ @ @ @ @ k:% @ @*/УG b̘1?.}pѴiַW_}u⋂!7rœsQQQL2k=Ԙ/_q`sQuϟ_^tE1{8bĉoCHok׎?ڴi ŧ6Ϯ2dHȴx[nVSK/>Ǐ/9I_ @ @ @ @ @ @ @j) Z.I @ @7>:ncƌqG}ѤI߿'?Gy$ *3Ν;GZ⡇*3<3 |KL-ZTrӳ?؆9ܹs? \d)[nɾ7o<={bSplsB G)1L0!;_dd-^8֭[z^K. dg͚_Wٻu7զߏ/85k @ @ @ @ @ @ @W@d][3#@ @ Pc:t'tR}ݑզMbvQFeom۶m&;HlJ,YuuԉxwJe]vBxgkRq"8N:5;6lذX7 vڥ4F߾}G?Q<ִvcUW` ȕ+WF X<ꨣxwO<guV6ɇ~8{ZnΟ??v}837M?ή{GcĈkSd r-^-bkR0{+VȎߏN;D;>p@\yq饗\g @ @ @ @ @ @zkQ? @-0|_͂`* @@ n{XhQTgoF̝;7R`Ϟ=0>}d)+oՙK^߮L`8s@ק~:<(,,ߖ-[nbC'|2f͚ӤIhѢ&jժR뮻bҥѠAmݢo߾%sΛXAn^hѢ8ã^zYh9TBߕCO A?;S;vlaâYf]{w @ @ @ @ @ @ @ f j: @ @l@^^^t-kwNV\^ 9nܸ3fLtMn:{GY@dÆ 7n+@>cphӦMUHA۷;.RkynEEEY( nS0vmǖ8"@ @ @ @ @ @ @j ȚfM @ @@ԩzکݱtz~ƥ^ڝw9 ZU Q|GC1dȐ1bD\B` F=kS[z"5 @ @ @ @ @ @ @`SAn  @ @QSc6sxW_ڭV.w߬~Ѷm[r3`9_k@AAAW@ӦM+o @ @ @ @ @ @ @5[@d^'@ @ @ڷo{lRw_~e;6^zx㮻+VDϞ=cРAqAe++޽{_1& iΜ9% @ @ @ @ @ @ ^q @ @6J`<0~ǫ ,QFe=\|Ѽy8CoYfm8yS߾}cԩ1F6J 3EEE 7JM @ @ @ @ @ @ @@e 0> @ @^aÆ1xcĉ1s̸馛b-Çgav{Wxٹ\IAi{7s5XK ޮ]B @ @ @ @ @ @  * @ @j%vZ<1o޼xGk׮ӟ4:u /.]ZinժUl61nܸJ'PXXjՊmۮ  @ @ @ @ @ @ @9+ 2gFa @ @w}w̙3'D ~i&N?V)}Y)&hݺult @ @ @ @ @ @ @sK  @ @j@ݺu㨣G}4RUW]z; DZjl@~o].'@ @ @ @ @ @ @䆀 XU @ @ @`-֭[xwb̘1ѢEw;wo1.]%AΙ3'O^@, ΋k6ޘ0aB4i$2" @ @ @ @ @ @ @@. ɥbB @ @_o"O>$n馸K㗿e\pqYgEF~S9ӧOl+DNʡG]p6m?uԉXbEemVѠAz뭣cǎqE7|w @ @ @ @ @ @ @6@fP @ @ ;wn! ?bm뮻./_ =~k#A˥_( {FZbʕs^Y<%Kwbرѻw>  @ @ @ @ @ @ @9+ 2gFa @ @(]uqƴi3ό+"z=P7lѽ;^yM6MQF;Nb83UV:'  @ @ @ @ @ @ @ 2VA  @ @-ZƔ)Sb=c9&6o0`@L4)ϟ_ mV /p}'@ @ @ @ @ @ @䔀 ȜZ @ @ @`:t{orӧOr)ؿW_}u sr{cŊ" ;v, @ @ @ @ @ @ @\k+ @ @l@߾}#692~޽{<ۿnk޼y#^~M6E AoK_|N;N @ @ @ @ @ @9A9$ "@ @ @ wq1iҤ|s1ot ^ziw#Mz뭣SN_N:qae_; @ @ @ @ @ @ @ GA( @ @"ФIg7x#vi=zFucѢEuHkn+W.lC  @ @ @ @ @ @ @9/ 2H @ @x;cYhުU6/^ؠ\L<gXzuIk׎to߾% @ @ @ @ @ @ @ ȪJj$@ @ @&4m4F~{\1hР3gN{lѢE.ϖ(o{ hz嗗0#@ @ @ @ @ @ @T '6 @ @rCOcӣo߾1a„2v, +Bk׮Ѽy뼼իWF @ @ @ @ @ @j ڊ @ @ .ĸqK.ѿxG~z}7jժW/"' @ @ @ @ @ @ @AV8 @ @ [-ZѣGlj'G}t [ne,\Nq뭷F [wKAÇ^{- i߫@ v>}z̘1# SLY/bԫW/ BL!5m4va,81BO 4( LM0!z]W_e .Rߎ0e˖5nƍ@ȶmF#???L;vN:e^k  @ @ @ @ @ @ PAG @ @"u֍c=6j׮rX~ڵk<䓂 ;V\qL:5>裒O>$ \xqI͚5+ 0nbYa6mJ>[jT;JNAƍRxܹsٳg|fA'N>,XP2DÆ @Ν;ǶnCş]t:uUM  @ @ @ @ @ @ PCЦI @ @o8#bȑYd kvː!C kkؼ˖-ɓ'ǻ^1eʔ,qŊY1M6Svԩ35B1SRj)W_;.\ݞ)S(;ݺu={Ǝ;ݻwz!#@ @ @ @ @ @ @ *xJ'@ @ @@y uQq]wI'͛7#F5D 3f̈;uΗ3gNo}`UVE:uk׮ѣG8#P,gkXqUy})`3GjmϏ> Lᝩ=qʕ+vٚ.ڮ֭[֝c @ @ @ @ @ @ @@YL @ @hO<1,X~t!N8ᄒ![mU @ @ @ @ @ @ PAVER" @ @63f̈O>9R9xAӢ|/ /Jo[grJ'k[.Qui|9sK_}Ywm{ウwtѸq @ @ @ @ @ @ @) 27EU @ @tӧ1ƍ.]d5}qܹsUV^gU+`ʕ_xg⭷ފիWG=b}s9's6?@ Moq;6^}5jTpȼݻw 4({Gԩ㯂| @ @ @ @ @ @ @\re%A @ @UVu]{G5j( [nݻwl:v6@:̦p:LθB @ @ @ @ @ @Aը @ @()8n… B qɽ.kS?S\pѠA'#G(Y,3u_ tYNg:tYOg^!@ @ @ @ @ @ @R 8@IDATWJ_O @ @ @ vaq 'Yg۷A= ><5j; kݺuػMtS d:鬧3ξB @ @ @ @ @ @䟀 4 @ @u]JiӦѣ?.{_pa/ZjmڴcQGUdkc@:鬧3~ ߂B @ @ @ @ @ @ ȵ74 @ @@*U[n{.U{o4_裏k6 B zf͊fA~UV]okM:5\]gy&9眨W*!ѷohҤI\r%y|cm̫,7鬧y:7~ 7 @ @ @ @ @ @ @k' r&@ @ @@8CSN`뮻kQH:co1":vX(7s'ӧ5 /Ŀ={zw]O_|?(ƌXxg}'Nt-,%Hc= {N @ @ @ @ @ @(: λ @ @w믿>~嗘4iR<3}u9_瞋vi]Nc׬Y3w 6qW6X O_YBTRy~UK-O\YgAzK=+7~ )36 @ @ @ @ @ @ @`A @ @([mU\zQDHE;67|s \Կtҋ~]/^,Y2guAڵWg6ADm߈B @ @ @ @ @ @5C/ @ @(=z-2}٘:ujW^M4c=vsΉ?ѥKlqGO͛Æ ?<&N{nm6&OVk4iR\tEѮ]ԩS65*N9oO{nyO=Tt-ڴi̫D2oEO6-:tUJ P۷ovmYӵ7~7 @ @ @ @ @ @ @k& r"@ @ @'Pt#]xᅅe1tH!\uUYߟ-AzxdzC9$RG#>1zZv ,Yd<ѽ{0`@xw}wyqq3<}Qn: nkw={78RpdZkJ B'|r6s=㧟~: p׿Q2$6l馛C=4靥$[h7΂Iԩe~ǹW隂+<)3]֨Q#Rc%gѼyUV\p1eʔ,,25-'N_~9i&{/?Oq'ƾ<{Yh;3ѨQx[oYHh iLe̘1Y] [g}VZŸq"՝wyqI'emӾy䑸k׮1yh۶m*R}*)3NQL,qwřg:t)˕+zʕ+gs8sbSO=53JLO>&K]Rem8>6o$+ @ @ @ @ @ @ @ _r~?= @ @ @b){.:Şnj֬ |aeZM<ԩN4).䒸1fso>f̘+VUeƍgI_}*{7R8է?fϞm]6V&KG ۝w9W 6SeZ{ aڷoٳgv~{U/6Rf( @ @ @ @ @ @ @ _~?= @ @ @RgqF<_,TpŎ;w]Xo?~^v3gΌ?>H!J.͝SYpa d)sA;K;S6=fʛ^>}}_ͮ5ݻw\W_}5;ץi++W]uUftQGeMgϞ]Wonw9}gsUu޼yym]TX1zwsqK97~7 @ @ @ @ @ @ @k& r"@ @ @elFq']wݕfaÆqE駟Y~lݻǿԩSW_?N6-k駟..\,)SdO۷o]g֪U+s=o߾q!GM4ik2y.w=SRJ1dȐH{[3]_믳3kss/~mV\RɅg`ʇ~8/pԨQ1tЬ8 W^y%?DŽ "92̙^{mz葅Nl2.EQN}ݳir`ԩy=⋼5o&8췑~#  @ @ @ @ @ @ f~ljYץ{=~  @@x x( ("[ M駟ŒJRXW\)dB ˗/M6/29Hᇩ;G͚5W> =3ʔ)|p61cbQb,24%JvYgeu'N Hwy' Lawygy7?}Ql6Yh7/f)1'!GH7|s<3<;CԸ2eF6m"7gώrZve]֭[g9}g]vqUWemStvRcf)2M>=5 cL!tP#{+';c @ @ @ @ @ @5(f]չ|pgj @ @Ϟ96N&@@HaN)dk;(@͛7B _ʯ| 6,;v\Aֲ_|`zUY`A̛7/ϟJ֭[7J,t)1]pC>,P0͓%9ʕ[Sf bM6SF5c֬YYhf TRϋBСCc:wߝ]}/Ԉ @ @ @ @ @ @EStܖ] @ @ @8sύPmF1hРK#O>9,p}֮];o\a^*\zcuʕ^2edիիW_U}W4Ǫd'WJ.铂۵k^5.]dk֬nY!aŊc]wkWnfϞo۷o\xY @ @ @ @ @ @ Ӟ @ @V*pQGE=']}An /8[n1lذ, 2GÆ Wrʭya&矿mn+mS<Yd |c+۶G @ @ @ @ @ @ ^Af @ @ @x TV- N|G }dͥ > .8[nkR`M6)ΥlٲѩSLJ{go߾1f̘ٳgv_CBW F# @ @ @ @ @ @ %q,C @ @ @<#8"z駟 M Ļ+bܸqQ~h׮]^ǂ p:Lx:B 顰m @ @ @ @ @ @X )  @ @ P|;,駟.rlMs=1vhܸq}Qn,8oʔ)En6T4YMa3r:l3 @ @ @ @ @ @ @F@q5* @ @[l͛7CYz&Mݻ7jՊC9$|;wnݻNt&Lg4tfMg8t @ @ @ @ @ @ @` \F'@ @ @@h׮]w}7ƌN|Wzk׮37onr/E @ @ @ @ @ @,_@m>,1?χ~&LyERwB??>;vl<'į5RJlv٧nݺ6l}j׮*T 皏gώ/"&N}>Owӳ6hݤΎ;FFqƱ;D U @ @ @ @ @ @ @) hW"@ @ @@g}ꫯ.Pk*IAM4>e޼yY B SHaTZ5zjk͚5c-XSzXbKΚ5+MSLY3iҤ/믿ɓ'?6Sf:u"?,^z9KW5yXn @ @ @ @ @ @ @@1 ɋM @ @lHw=N)0VZr)E~,X~쳬~Y _|?~| >< 89sb]Sdjb76,T}6dWT)ʕ+}ʗ/S@9s⧟~>?c̘1#O}w'@Ν;w1ʕ+g>.N>,TvYdR @ @ @ @ @ @ @ \T= @ @&MD%7NW}L>͚5[n_7|_}UtM1z8#c֬YǸq?*Ξ=;.\1S@e Lt-SL*Uj4W_>r)ry% *D Zjz[ouQz} r-}1?իW<Ñ&hԨSO @ @ @ @ @ @sA> @ @և@J~Ya>4Zƺuf#y1~0`@ti.X A9sfO.1w]4qиe6jd@G.+pr}V\9YdmenxG⥗^={.rJ/ \Y  @ @ @ @ @ @ @% xo%@ @ @h֬Y`xGN:ud^z+쟂7d†ksu<5l2FsO\p1xӧO#ʔ)b& @ @ @ @ @ @ @@ ,Ы8 @ @(2K{Ef?Eu#k}qGQGZ,ZɾR fnbY^;C 2dMӇ @ @ @ @ @ @( K% @ @Dw1&O3g,˳&N-Zo= 7ޘTP!.7n\4o<:u_k0. @ @ @ @ @ @ @@QYަ @ @ @ 4j([݇~XWY|6lذhڴi̞=;F]v-ZjŽ#Gݺu*g1 @ @ @ @ @ @ PAe @ @(nm/_>>Byş8Ccǎ1jԨhذa{#F?^z饨_~/̙Wfz @ @ @ @ @ @ @`} \#@ @ @@1(QD0GS/28馛b٧\roEhE;wcF>}k c…EhB @ @ @ @ @ @H@t<#@ @ @|W^|':Lg&MĴi_nݺ@z@ٲeϏGvN=3^yK @ @ @ @ @ @ @ ,|̊  @ @ Ph֭~i]QX /mƁoF4nܸ(la7_o&l-ZΝ;g}Vb @ @ @ @ @ @ @ \u+-  @ @ @`-A%Zv6mZi&ʸ+娺N;>l<;w^̜9sm֟ @ @ @ @ @ @( K$ @ @U9k֬H1bD4i$>Hv]V*СCxꫯo=~߿̟?}5 @ @ @ @ @ @ @ 󮬔 @ @^N:>B´k&h֬Y[ٵ08tѣG0aBt%<իW(Q쿨l~1t'Ov)< @ @ @ @ @ @;A0 @ @6@͚5AWp^{ӧO*Zhg4hժU[q-?Ջ믿>~u=  @ @ @ @ @ @ @|Ϡ#@ @ @ /rō<]#~)urJԯ_?6l'xS(Ydt=>8 .FСC b @ @ @ @ @ @X x@ @ @B`-)SǏ+bرYP` T@J/qfVZŘ1cF @ @ @ @ @ @QX"@ @ @@Al++zGbv2e[oFڵkG.] ~,zfW_9sD <餓V @ @ @ @ @ @ @` `&&@ @ @@V |z͋s=7<ڵk+F]ww^.]:f2LAh޼yk1pxb/<~駂lk#@ @ @ @ @ @ @V@d}6N @ @ #馛 :ZjrKs=ٵlٲ-WݺuˇY QXJ(;6?+aÆ1xXpaaنu @ @ @ @ @ @ @b! Xf$@ @ @@HA3gΌyEKѴiӘ2eJ92=lӦMn-zeʔ)d(W\;ƏtPv67oZ~ o  @ @ @ @ @ @ @ A! @ @ @`U .ӧz'-,o7x#vig]w]TX1N9唼:7S`-;#|(_|ҥK8qbk @ @ @ @ @ @ PAa) @ @()0Yf~!CDʕO7|s}Q\z7[`]w>{,aÆѻwHI!@ @ @ @ @ @ @6 nV @ @[A?mW^q.5 7J38cg*t19+ ,C @ @ @ @ @ @gAt @ @( W{Fߎ-[.5YGyQR 6h8c„ >N;hڴi< @ @ @ @ @ @ @( r=b @ @"A)7o^ץK8餓^-ro_⬳ZstMg{V[Ł;v?xf  @ @ @ @ @ @ @u$ r @ @-PBٳ@m|qm1k֬w}SNɮϤΝ]w]viQZc=6; {ve-6G^,kܳ%K]|6mZ?:t\s }.\Z븫3XÆ w<3駟Fƍ~auYit_}ե\}q,V[Q:B @ @ @ @ @ @ B, @ @EEL2V~嗢|/M6o&F]tocĈQj:lذoӧ9眳JHcym駘3gN=e˖͑x7&7l}|Sb| /d)|t{Ř1c"oҺul)3֫W/nᆘ7o^.+w?裥Mxw^>W~u @ @ @ @ @ @AEY& @ @FmkQR%j*kx7qynV;cz뭙W_ݻw78쳣_~#DʕkT|QFԪU+?3<]w]L2% [ ԩS'cYM}?_Vӥ=KmW|V .^x!.\,RJ^g:wW]uUP;![{o^ttSxgJ[^n @ @ @ @ @ @ @@!Y^ @ @ @( _~(le0a„k駟z*Ra%9n Lzcef}w\^o+b̘1qiEVbyȫXfgi78nEZDL81.m۶# sLk[VYt5yh#GƟ8蠃Nx qK!tIѻwgdܭ[hӦb.iӢO>ѡCҥK>r͛Æ ?<38s#=͑'x&:*k͆x#̞͝;7~xᇳvM&M.(ڵk:u4Ϣ֟g̘|O_~9OM4SO=5NVs,,#8bq[V:B @ @ @ @ @ @ B, @ @EE AEe;k,G2e"8nzc*Ud~s9'ƙg_㦛n"gϞov8z] b=X<>K@佫>Zh^xaVG;cѾKgʞƻ[e˖ѬY;F?!:w5رc6VB"=\3 5jT񑮩|gѼy,T3JN2% cLO%=C"1;wixײfm8S{?|wc6-\0#qGGɒ%'ݻgι}q'g)s=B%smfF?zŕW^?M;ùΟ|I],n~ @ @ @ @ @ @ @0 ,o͚  @ @ PJ(Qwv_`A\tEYPa |WڧOI 4iRvdw1WZ5FsO\qKsRNڵkvK>Ka)qСYVZec/3gΌ4~)rɾgʞ6f}8s1Yc \ꪫbz(,RJW ^L!FezkG5Iϩ{w<=ș4( Lu)1;kSN9%UK/]8[;6Nե֙BWw}w4m4{cĉ/Gҥ6mdkI_ƌ)}' Lcܸqy=7N~_͕.hذa<=U3GE7l\U,n~y @ @ @ @ @ @ @B( 4K&@ @ @@aH|5 rq!ĕW^rKq+}?Ra+W.UVTP!O /{M4EYf;uog\f|rkcܹ^{-6F۶m 0M-[?Y(QxҞ-˪[{ @ @ @ @ @ @ PA7h @ @(5wBy>|xzk.Ha?|L0a㤀µ)iΑ R\qWgMS>ӧɺw}ۏ?8WJ!Kڧ۷ox7ogK=8v@IDATo|/f}d);I)qE%X0 b߿l1tЬK _\r:?l^zh|V[]wG0S81&MZx \Vj 1 @ @ @ @ @ @( KD @ @5W}͛7:|s=׈੧;>Xb_ZVcUQd٬+XJoWW/_>k ,s̉of꥾tӻꪫK/;.>øklٲYR?~Pڵkט9sfYgZc!,}ْU{fͲ@Ӈz(^{hРA\x1{UG4F ̕e垹 @ @ @ @ @ @ @" I @ @ @@!HyWR͛={̂N9x -\*|ˣm۶Y^ LAwyg/{9VeUen5>|bx{]ӹJ}Uvmj@÷~;ۂ 0/"ny7l6que~xzY^zE \YIsNԨQ# wqG5?#㣏>~ 7׏+[&~G#Xɲk  @ @ @ @ @ @( K @ @6ҷFezN[믏ҥK8/R+ѧO\U6Ɛ!Cbʔ)Y3O81V&6mZO?]a֪otPySX`y}}'RJ{~zk~Yh:W$x9~رct=sKgvYヒ,fʲr\  @ @ @ @ @ @ @@QYަ @ @ @Y^!Y-sѬYH!2Ww/,2g0lذ_/?YI'gώ~Ź7K.$,X^x!ڥ%K[nܳ[B\Uv&~ǻロ}of)Hr3<3giOni<ӑ.{liwyglVycoի7N?8O[? 4>˪=s%@ @ @ @ @ @ @EIJ~m̯C z|(sm[2?&гgz4 @HA}& XRHgp@ <8/pmS>t U֪4wk׎:u,o6J,ժU[*f͚&L.*UK=Osofy%7dݤ>A~YdǢ%~C)t2] ry'Pd-UTqŜ9sI&y_V]C7 _\(^E @ @ @ @ @ @`X% @ @ @@_ -[m4c|q9Ŀ| LP_~yYB uH6thٲ2C Sĸ&!oŊc]w]+KU LSc2e\rQ^{n5?g)@5k.y,>nl@ 4X,2) @ @ @ @ @ @ @( ,o՞ @ @ P~lu)(*}GQLڪ @ @ @ @ @ @ @EEdQو} @ @ @@5kVЊ+/c'O-ZĐ!C /p@.cjU@ɒ%[ng鷴;d"Q!@ @ @ @ @ @ @\- @ @{9|h֬Y̞=;F:tXhf P*T\rI7.7o:u/|"s#@ @ @ @ @ @ @( 8u{&@ @ @+VWfSxqƾzlk6^,SVZqȑ#cGn⫯Zf{ @ @ @ @ @ @ @0 ,o͚  @ @ P~ᇨTR*UbܹYYg_|qҿ?)tBҫҤ"MCdqXD@tT&J/H!ͳ=$&߽{.Ϲ,~#...N:3 tY|}}eرG<==e޼yâ             )\ >     nr -[HժUѣG{niѢEbs)^ M42rH9y4o\z-իW?3             A:k@@@@@in߾-YfuWҨQ#SرCJ(}$gܹsˌ3GdbΝ;ٳg             @2pOcbH     "0k,?*TH/CIڴiҥK'OqsssO<ܹse„ 2zhqqqq>&άZ%re;}=޶H6a- ~zYz1Bʔ)#3F2eʔ!             S@@@@@(ZlڴI\]]]$ t@&`1[l'N([N+"'NYZhIdJH~hȚV`߾}$a-e jJ5k&_|G2gگ_? MY3h@@@@@@@@@@@@@k@@@@@Ff͚&M >}j Z Iy?~\j׮mN֭[jժٽ{7!I2 "ի,@6 kZJЀ!CȩS[n2x`X_>e0z@@@@@@@@@@@@@ ҡ!    -.]:PB ~[fu y믿 JZdǎRdɄlK$U/sz K@ra)V4iDZj%%@@@@@@@@@@@@@p f*     <4`1uԑ.88X Xzܽ{7j>}*A| +V` t*Y9@xRJʕ+eÆ '/ |hB!6l(3Z޺u˄AǶ G@@@@@@@@@@@@@ Faln"@@@@@b'PvmGUT:d/9{WȑC}ݐP a⋣)!a(GVZ}v5kڵwN:%m۶gϞŧ)E@@@@@@@@@@@@@ BP}2D@@@@@ uԑ`[=6vXw{~8}L0Hm#00Pܹ#J`J{O]IBէ hŋaMVںu:@@@@@@@@@@@@@ i7J*B@@@@LPB;wnsMT"׏x7" v*ՀKnb9s4h d̦ \rE&Mda#Kcϟ/Ǐ#             ' M     x7.EƍE*_es=Eg 5jT m'88X&L fͲGԁ                   (3j%K֭[۽ͻwʠALddJʜ>LGR@)T,XliӦka΍5J4 2888qm_3gNիC*T$@PP\rŬ!k=]z5ҵsɓpki`\=Z&Mɜ9XkΝ۬k-͛׶~/Ɂfg9s;K!{Wڅ$n߾Wv=C2ed              A>o@@@@@ h؉'ѣr1ϧN2af7jXcMxcMiX{ 1 aM&M$5R۹v gP4ʕK<==lٲf+SxyyI|K~׮]2m4[cΝ;k&# 0Z|#GYK4QCh8]Qרj3tԩhPja L)kI?4R1ow تn߷oh5\2tgS!8wfo_C<@@@@@@@@@@@@p6-KgE@@@@ h0ƍM޺uDCBu]UfB5/Jt!nΜ9Vr纡a]v2ozhAaÆ=ggϞ]CaUT ?~i1{4ib_.\l@?+NגX.ZeɒŬ BmҤ-Z4|w k׮ հ[khVa9rn آ>}zMq)iBY:Ǐg*װN ,6=Y^             @B ԍ    $+WdtRٶm ΪXtA5j$5k֔3&acߴ5hlzӧOO?5]6m*עE ܹ4kLҤC`컗lػwYG4DT֭+ƍ3sQ\9 ԀbŊcǎföÇ`%JgSN&2NLEuvig=C[5Q?5^2V0`|LcB:‡X \]5Vu}lڴɄLŋ%K4ѵy@@@@@@@@@@@@@A[@@@@@$ ȢE?4W-[ٳ'atԩe̘1a*_~ń`oބDiFz!M4 D/pq3g,YDΜ9#E1[Zj'aq*T0СCMŋ˔)SLp[<==|,?}v5ѣO7 ||韇 ?}^ץ?FcOct@U ԭJ*a/_6aϟ70 Եzj"7P}u+SxyyM)             @B {UwM ;@@d"0lR,vd"0@6lXݛsO#GݻWM& . N:If$mڴaMI_4lŊ&Eo!ʕ+%QhϞ=ѬM6nݺIǎjժ1#^gYlrEyeҮ];I*UrvK|||v!}rww7WT)Χ{xfd:Rd>'Oʉ'L5رcr}c;wniVXQʖ-͊ϋ4            _ H  @AFI@itک sk׮'ʎ;\r&^,Y܄BfȐ!|p޽[4HSZ{qqq"E/_iȞ>N;D@P4ѣf;xߟ4A5kkH ʤ =+;vm=^|y_^~eɜ9srzc!2JN"            ` F@@Hc s@ ܿ߄> UꫯF)"F$3f̐cNJ|gңGh1[rQ]V~7ٰaܽ{WJ,)Փ:uHݺuH"ao)D_4?0ݻEc4I&ҼysZj%2,v            ox@      *}vP,\P4`nΝ@Q\  'O! V={:͛7JWlB.5HT?k@ӅH͍ZڪZ{{{k%k:tL0`&2mڴflϟ'N^Cd-:@LLɓM [dʕRZ5YxT^]o~s~yt             @ 4    N/zI2eҧOqqq]%\#YԩSeӦMgzwKeȑʕ+;zj8S9uL8Q|di֬Y;W^ QBiXDȘ1l҄9rDΞ=+GsI۶m%O<ҿٸq&*,!            L@@@@@ [o%C?X~gɝ;wH7/KuʪU1Ԯ][v%7o6a@v޲e9йpc7oԯ__J,iu&&vҤI/ Ǒg9@"EdРA믿~greiڴ+VL&L /^t!7@@@@@@@@@@@@NT    K@C {)s̑Q}qqqWlٲɚ5kW^+ŋcp]ryf= H $ 9qr;v,XP}]X۷O:$cƌOOOG2Afj~cҥK;ȲeL d.]dN?F              g@@@@@$x뭷䧟~kJ6m4*&_ :Tz!SܸqC7n,Yd͛7KɩjsssrM˗eRhQOM .*Ur> R@\Leƍ&N:ҠAٺukJ `            8 Sܔ3`@@@@pdJfΜ)/;rWSL4^Ν;ɓ'b܁ҩS'ѽXf˖);sssұcGO>|Pƍ'ŋYr۷Oz-iӦMn.hEĉRT)iذjJN:            $# d2@@@@pn#GȈ#dĉ&ɹGz?m4)St5Ib:eٹs㏒+Wu ,sssseӦMRlYYd ݺu4m4)B @bD{=*iҤ///4iSE1,N!                 8r2rHQv_F-5k4?}E,%J08_\v-)D             ` H     @|֭['[n/B\]OٱcGYx/^\o.ݻw0qʕ&SNgϞNE{zzeҤIHK(P@}ݤCJs6mZOFAooo9sFvI\%F 0v3f}hiҤISL w}:O֬Y#k׮47|-ٴi1-vڐ>'۷7tY  Ǐs?yc֭GL@ӧY=u!            @" @@@@@N* 6իGt:[hԯ__N<) ,0W2}0afAAA:uD 1bhٲerNܹ#?h?+ v2eh`ڏ?hEx ̟??BȨQ"O6v,?JʄO>5z̴            @r 29*cB@@@@صk<}T5j`駟w&4q̘1r]Ӗѭ^Zڷo/@6bi֬'NO?U/c-;v4YF˗/U:K/WDqWyںuk4V_ժUL2Θ]~u;vjʄM믶#sE֒֡H>ϟ_*V.UTM9_{=ׯ9{9ҹ?]`gsRjUqGpE?~y'uɼ{_2|i۶>}Z>Cy饗D9x`o۶Yz̼iإUkd 8P4h ͳ.~Ŋfkomމڿ:uȵkD߱޽{m1ct̳s}s.gEBdŤj0)SL} P;۫j Ow=C J\j9ߺukYhQӱM0DNb3֘tNoܸ!^^^bOCd3gl[uIFOn!uS@@@@@@@@@@@@@ܝ@@@@H^'N0ASK}&pҤIr1y뭷L_~?v/\ 7o4}a[K6AY_{5Ѡ9snۺu&ӦM3֫WՐ4 ֊i ŋ"E%uѠ0uҠY&uw´Id栝={V7nlZhaDCth^ds޳gO[pf5k!}Q'O;i} ZfرCo.Eג> U?sy֫! 6_~ń*vՄJ5 СCRfMqww7wz+Z_Rn]5kmذa&ѣ}~sՅ JJD=lbiӢU L!0AZB ju}iHm\i'6uZ+Qъ)K, -˛oit]i;vG6oӵZ]v4hcND CmwkݠATRَ'\G"JJĪϛpP xҴiS[_|ajP7jdʔ)zʄGwPԩECI賱n@IDATKEW ?O{406EP777I6{Iss˛4 Q=#u?:(%gEgnQj裇Y GEZpˈ o dҥǛpˈoίG4W=DNP5ׯK4$3|]v-$AS@@@@@@@@@@@@@\@@@@H^,a Q4Nڷo/UV5h/^@/_>tvLؙ^gq i>(P@//y3uԑ 2iZdGɥKRX1p|15JMh?~lnݻwO~GY|m 8Ь3ڌl#:s1YKֽסؔ%K0ȑ#ͭcƌYC5NC\%:ʖ- ٻyfb+ڶ4 Q5Dt{ .ݧ-C Q բ5VawiBŋu'Vx_ͻIY YܸqC*U$V2oVi+m9rj_nY:czGgƶ+mڴ1bm)W???VcNHfΜCB×gϞChEץ>@@@@@@@@@@@@p> o1    $3 `}dǏL2ɞ={l۱cԩS{4Q[SCsֵRF ĉfo]^˗//|СCמ9sƄ̙uǷB]K?{kN?:ڿYGz 3l#:ӵѽqɓ'KZLӧeŊo7 ?i_5IssPzA?SB5z5p֬Y'O>}hPʕ+pss]ԩE?WVMfΜ)͛7~=wQ.]wr9i۶4k!rO?T֭k |ht:|} .&36_z%sQ]9}&$XPbS֬Yz .)_zUo. 6Ln6            Q 8q     `/Um۶٫J[=ӧ@ٳE]ð4OΟ?ss^_ԩcUol믿RJqm{^Ҏ;$0006E{#-w~ڇŶ$ZP@]=2o?,Xlk֬1ѐK=v/uttdȐA( MLvb[f͚r֭yGK6niU:AAA&4R/Zl dׯ|>h1Ҋp" @fϞ--2kfݺuҩS05YuY4HTǤcؔ侘ƶΨ05^%kRLh gϞ]zyykvgԨQRhQiݺ"@@@@@@@@@@@@H< Ϛ@@@@@ ( *TKFx>>+Vhn3f 5̪?sߞ={$]taNˮ]DڴicVӧOeʕҲe˸Uwin޼e^\Pxqɘ1YU|={ .؎CR 1ujYk{Ȑ!X޽c:_:W Ə/ڧ~h%W\&h3!?S۴i9gyM2vGZG\OuA۲eܺu˼'Oت_b lܸd˖ŤoVXclG!:SW5*ݻ!y}*:%JsFumLFׇyJvL8εUtu.4ӑeNlCFi@@@@@@@@@@@@,@dJ}Ǝ    #зo_voaB/_.M4iӦ[oeBἽM[VgΜ vd?3~W_Ǐ=ϟ___5jd͚5z4ɗqƉmݺՄ=zH>y套^z.+P,\Є+!sݥJ:u_|:"Q4Qի'~:ж-*ժU3Ef";ٽ3SNu_E=aVgΜD?,2d_~E:$۷l.u/^؄+ Vcg{ժU> Q3g.]Z] 1;v,[LFik`Za~C=EcStO:ܢ5j///ɒ%˗_vhL2c-ѣe߾}&4sٺ5*SW(58p֬YrQU}X`97ĉMsWK*Ν;':ŋk_4|5>&>c5D Lvuu55֥|kӠAdRvmG@@@@@@@@@@@@@X K0.G@@@@B_~&KYg. +ee 7o^ڵlڴ4k_|޲etRA`$6l0iԨ?^4H+(((zM1G@@̝;W֭+%K-Zkdpx? iܹsgÇfPY@xחPh0ޚ5kdvmBצ 裏dĈR\90aBsZn-Ec2iʁw1π-]*T(&U$5:7\%F)\رC.]dBݛFن+2x`:tPܹs{4lVC42M4fMJ\ܹsˌ36o<)Ryiu.m۶|`i!ƴhW^1πjXlY)_iLhƍM=j𮇇 gdD]ODŴQy9rDʔ)#ӧ7ߗ7|Ӽ7&O,9s47n0.]V\jƍXc7_C&mѺѽb;V뾨:uJ*IfDt:wI]n߾-ݻw7+VI'G@@@@@@@@@@@@ N-Y8@@W`ذY΋A@d$]޼ߓќ2H7!,O6A`Ŋ3֯A\ǎ{ 2ķ0߹sG1ێK[WbEWh]\\RkIt"[lɛ7okج^zՄAa ʕ+Ae M8Q~( 4Q4)38:aTa3f ]7n;-I~ $:            $7n"    䥗^f͚Yګ$'s2rhQjhI 4`W^A E,Y"M4Çg} ݎqu-\\R֭[d!/E7&M2ۻ+odϞ=P޼yT}ҥ t5ԲeK)]tҥ|BtGG7 ??&_8p@4U@R#             {swK)  D`ذYDa -AV޼ߝ{=$c/JݺuE40.W\x=4o߾kN͛'p[ttU d~]\\]M=tP:u,\P:uƨOٳ8tB1ߞi^߾}e +W!C V{C]8ϙ3Gf̘!Y;bw#^) '@@@@@@@@@@@@#\c5L    $O ʖ-[ѣGRF 9|pJøZl)CRΝt!ʫ-iӦq<|Փ_\א΁΅#@vԩ7ߔcǎɊ+֭[&dɒ2a9qDM|ru}lذS&ZhDs lذ)RD{'}Ӆ@&2!            A:y@@@@H m۶`( Pn\<>}Ȁ>ٳg9kر_ބV^]=Cq~k΁΅i޼ZJ.^(}K/_ބB8p %K M6ۤSNZh!r2J۷ˡCdȐ!ᑘ]-@@@@@@@@@@@@H &@@@@@dϞ݄ 4vA\[&WBYzƍǚ:uȾ}L^*UO?d2ڪZk8Kɛ79҄>|XڵkgB!+V( 7|S~'{ ~"d>А?PU&3W}Z &gΜ1ϋ֬YSƎ+֭;07v _|!m۶}N^|EY|իWe֬YҬY3y             < Sޜ3b@@@@pB :| 4̕+WN,Y"8E۷eRtiٱc,[LV\)y{|5J<( ƍKwStMMRMV'RX1:t_^nݺ%?ԪUKV^mf*իW7a~pBr:@ R>>r Yt ۶mkʗ/kN&N(k׮W&gƖ=z$۷oSJ>}^059sHΜ98q„?.X\@@@@@@@@@@@@-RBΝw%{@@I`ذ!ŎHã/ @6l bGd"pI4ihT޼y_~ҷo_ɟ?2^ӧO%!!C.odȐ9QW6A}jXNy7cǎ6mZ'EuDzl21clݺUWnD[jxphϞ=c߽{9sZC*T ˗m*U*KI/^CɁf;~ǪUJj_V-ɕ+WJtyq4@@@@@@@@@@@@@ Aa8  ^ "|GAc ` ;wNM&f͒[nI˖-O>ҬY3B\bgΜ)J*ɀG>}z}ƍo+W̞={*U"w^?̝;Wݻ'm۶J DŽ^]J,)e˖5[2eTRfV  !kOJO8!rQۦϸ WX4rRxN d1 @@@@@@@@@@@@ Ld@@Y Hg=D.@d6AYӧ|roe˖-&UVұcGi޼y =3˖-m۶I @V^ݙ9Qw}'gϖӧOKѢECP\\\IHppڵKtuYA} i=r4Ok!K(!Ŋ3sA|9[lNoVf=iࣾϬMuiܹsKҥ\re6;/F@@@@@@@@@@@HAܹg  @!N'@MFb-A~^tR?%uRvmiԨ*U$Qox~zСC![!T͚54i8j_{5HגiXZÆ qf-(Pi!]K6lWN:nUTm\ =u?~l'O4~zˢ!Z9/R.\ض/X-_|*U8[A@E[k;v9gZ/Ydj42s0d#A?Et@@@@@@@@@@@@At  3C@ ??FM@C!W[Hk${RV-^m˚5 Ӳk.ܹS#Ϟ=rʙ&MH%mڴN3&g訏of-i'OTRRfM:P uhlkiǎr vٴiSX3 'ѣGrYi_… & \r@H ̛7m˓'95TC%)!ϦVA]r%̦{*:jjH/^YײO ƕZ@@@@@@@@@@@@AoN  `W Ie 0SAG@Dp4 ۴ih蝆(?CCL2RlYL2%z?A;v̶=zT:$7owww)_ԨQÄZ6j%IgS`֭[:ڽ{ܽ{ׄ(:֐+&RJ) =s֓~>r ˜9TVͬ:uHݺu%]tIWŋr%.@}XiLc52G&0kpn%K>Ӈ/'s/oߖ;w֭[r >wY]^:5 Խn 0ᏺgA&?#           8t"    WE*Vh6W ?vZM@^Z mee˖ahS6aM4O}`0 M_.fmMm l׮TZU*WLX5IנĦMMN___ٵk Ԡ3fȅ 9WWWz-i[55X/M4ϭ%mCN赤Ct^Kg# ] 2!/ 2DW.K6 GGuVf…gi:}~)             @r 2$@@@@@(A[mڴ1UiکSLw ټy-x/P45 ӐIOOOiܸ > >R[@C4SE4 ٳamf4޽{&,2}[r^tKӢE|T@BL#-- ;յjjiПpD Եo&ZP g+U8DŽWjeˬY i}րW:ݻG 5_ԋ            !߲ry     @ Iɒ%U|fiӧO3אTRIԩm{1cF`IIWJE6J]':{=@T "(D+bF`o`DT4bQJ}j,h *jШώ R0ah3^r}g`  @ @ @ @ @j թ @ @ @T@߾?APy6 @ @ @ @ @ @ PAVG @ @ @~gD̛q?A0 @ @ @ @ @ @"A) @ @ @ @`>0޽ }"΍{*  @ @ @ @ @ @ PmAVG @ @ @*_3 <唈~8_Ì @ @ @ @ @ @J t @ @ @Ao O>0?q9l’ @ @ @ @ @ @XIA$6  @ @ @}D*N=;W @ @ @ @ @ @ goe @ @ @UJwUV8؈#.Ja @ @ @ @ @ @ P) +$ @ @ @$=#V]5#~ 6 @ @ @ @ @ @ M @ @ @@tPD]wEzkD-3Y)&!@ @ @ @ @ @ @`(X @ @ @h]F 1{C!@ @ @ @ @ @ @|ܭJ @ @ @ kSOE<\{G̘Q @ @ @ @ @ @P@dD: @ @ @ ;1lX;D[W_-L @ @ @ @ @ @ @j) @ @ @[ns&Et1a U#@ @ @ @ @ @ @Rԉ-@ @ @ @FBD͚:Dń @ @ @ @ @ @S@d|NM @ @ @` hsED/̷`A @ @ @ @ @ @,wA @ @ @#ФIēOFtn=V} @ @ @ @ @ @H  @ @ @ LՋxok.o1 @ @ @ @ @ @,WZuu @ @ @ P-j֌馈֊8Ȉ#9ZR84 @ @ @ @ @ @L@d5{K @ @ @`E袈V"ko1WGd/ @ @ @ @ @ @TBUɠ#@ @ @ @ 1aB}E4lЛ @ @ @ @ @ @+ ȕI' @X&M{, mڴK.,X[ԫW/[jR*ƍ+e.,j_a,, @@5bݹscDl8eʔxGw9N;巙=,o  @ @ @ @ @ @,g弾  @ @P`K/e'|M;?~oF^rwmݖuoժUL0!1bDѨQx駳3g. @ luD̙QlBs믿g}6 1cFz/{r߸  @ @ @ @ @ @ P$P @ @m]xחkRf;vldr;5p{'vmAF۶mO훅BΚ5+6l7% @UYu^-cLju8,v%zH:mQqw/ 3Е @ @ @ @ @ @,P7= @ ԪhM4B#17|u]Ҵi8cr;j$@ @ fС]~E\z?xgcE,{؊x{"@ @ @ @ @ @ P]-ѡ87 @&Ln!^~hРAnݺ0`gy&?~rǶnC o=,qڴiǽ_~yzSOE-sύ-"[ڿYYfUW]/R̜93O>ٜ2> @|qnqqu~qJzߏu]7s8Rd={:^xaex≸뮻?;,?)SW\of4l0h4m4RHJ?"B0 dcS, ׿u3&R`I СC|GeQZ_m];/[;( 46D @UHo߈Gx]w(\kv) _L͚5:(w͵~Fm]}iLԭ[7 OA)P?;f]iҤI^{_o޴gFC7<^|Ŭ>I{Ǎ@wyꫯ ӧ~RezW;"oY~ @ @ @ @ @ @ lA.[o @ @JBӦc, 50pe,8o[pk-۷/6+v!k#6>3fL7 @U\`#z*G8( 9,ƍ:|ԩSVNQF'+lM#s=7^}oDZ3խ[7[;>u]7{6lX6BSA\sMJwYwGF/;˛V @ @ @ @ @ @KI@R5- @Xva9rdr!YGذ-[fkVz7 @Tmڵ$[##t23Y?_Si?IW^y%:/XdE yL?%85jT\zQNfmJ+v?0 !K>d{ @ @ @ @ @ @ el  @ zѬYô\l5k֌;#7ovZ 6XK?o5N:t萵8w~Q~iӦM4h x7w8>m{F֭/ς#uzF~鑂"+*)[]@IDATб;U~s qgV4v @ @ @ @ @ @ ȥjJ @ }1iҤlƎ;f_~ef!wygyȑ#8mڴ캴~8k1cF|ͱGϞ=.>?U}02p5kVV'g}v4mڴ  @[FaH|fEW]ӻN.]?xO<kFqY]-M7ŨQb„ Y[;L81K)N$wi:v9[ovmSLɾJ8c9R0ctMSNѨQ8KzKs7l0}k?>90`Bs @ @ @ @ @ @ @` \V @ @+yCѧO8ꨣSNݻG pݻw|0o֬Y:_ga&)4⭷zk;k o~:uİaâvE}R]vYV /{)%WRC=qѷo,΋~&@ @ l!C01 #:( c{ea_~9FQ.ޅR}zzw#{D>h\tE1|,>U>cY`} L)ϏN;0r 0f~)hdѣGrmzW]u\Uz[}cС.~|i -[ @ @ @ @ @ @e'PcAa mTVf4 @0{Tl\G> 0ٳ#|YHAAFtڵ0eH>7n)|dIJ{ӧO-"Pd^c  @:9 D}w[?W_}Nj*[o⍅w)1j UTwŸqM6ѰaÊ/Ԟ^c5ΝK#/.{|AvB'See_\٢#@ @ @ @ @ @ @X`UV:m۶΋#(5k֌6۬22 @UTK# !K"N>æv駊WA%*mP>ٮ] աڵjB_޽*zKK//  @ @ @ @ @ @X@dFz @ @*+p.3&o[o~>n} @ PZ+⡇f1<}΍n8œF 6`,KR @ @ @ @ @ @H3 @ݻw_;3iu]7Əױ @+@uZW_}5zXywڧO+#@ @ @ @ @ @ P  @TSw1; ?|MfΜYkYd5!vl @o>Fj5,6u{2fάwZd?H  @ @ @ @ @ @,AKՔ @ @: 4i$?u֭N @r(((>9>zwgwei @ @ @ @ @ @  @ @ @@˖-Wnx8fz.vmoT; @ @ @ @ @ @+  @ @ @.г1eʨiᇏM;ǃ[또 @ @ @ @ @ @ ,OG @ @ @UJaUcذbWF9[CgVs:  @ @ @ @ @ @+  @ @ @KI`7߼e1bUUW=V3- @ @ @ @ @ @~+ @ @ @@Z}ߋƍ>}_/ @ @ @ @ @ @ A.kq @ @ @ B t"8Gbmۍg,X`ڧ @ @ @ @ @ @ P5AV @ @ @,@vcߍ6m+8!5ÆJ @ @ @ @ @ @A.l @ @ @j*Цͪ1f+_i.=8;f̘YMEJ?Ao?}FH'U @ @ @ @ @ @I@O @ @ @ e| ѥˀxkb6z:w=:b؟>_|>uO @ @ @ @ @ @ ȟ,\ @ @ @ @HAxgދF>}mޛTԧ^mѮ]ŧO}R_ @ @ @ @ @ @Ad @ @ @ 1e=ѷM78=ژ?ժ##j*ȩ-Q @ @ @ @ @ @(. ; @ @ @*pe{ĉ[;o⋥v1o^GMmB @ @ @ @ @ @@qA= @ @ @ @L+߾35!C0 !Ua#:u((oS]jK} @ @ @ @ @ @ OrwpG @ @ @64x^h .9x~weGi!@ @ @ @ @ @ PAVg @ @ @,%n"Fӟ".4b##b 6DΩ.) @ @ @ @ @ @,,P?Y @ @ @(]N3ό3&K~#J_/K֬?@niD>'/<GZI'E pPut @ @ @ @ @ @JYZ @ @ @,{FqѦMG|ݏ.Xq[۞=#g\.׏-V?:) @ @ @ @ @ @. t @ @ @Xb5#~q~ }0@y]FE̟2)C" Ye1wt @ @ @ @ @ @ P@ @ @ @ @@eԯ?Fq}F4nQPݗ Ln"eXr[}f͚?CgQbg'k.ԭ[𼍋>jy2f!@ @ @ @ @ @X뚕3 @ @ @+G\~yDV?A.XP~޼xوv(^w_~e7.&N}Yϋ,qƌ5Y]aUW]5 lڴiѢEt:D۶mc5֨p. @ @ @ @ @ @l W'f @ @ @sF PϏ3'׿xv(- %SoFc}NMQFXs5[n;cjY`c&MƍgՋڵkRlv8:~b3gf~mM_uQ[o]O2%ҞSInEM6$j,$2Y!@ @ @ @ @ @ 2 \= @ @ @ rKĄ QvXRdavbKċ/Flq}K>^,qȑwEAAA;vGydضmhժUԪd}_5D:uJnk&e?> LgI!;̮4h r,}ѩS, @ @ @ @ @ @KqK @ @ @ @`e3's̝i޼( pi^Xo\Kz+=\4iRĸV[EvϾ7|_~xWFL)_ᅬ~;|+_gώ͛GΝNh[lEn @ @ @ @ @ @( W'a @ @ @Ty^Xg<۟*G̝S]J_Sdi;}2dH|ѤIСC|ѩSvm0Ⳮw)r>ӤgAӟbԩѲeg}k׮n-^| @ @ @ @ @ @XA @ @ @*A`#^~ljMq~~1c"Li9aBV[M-]v@í:z왅n6QPPӠjtUN,2`uYW_B2{챸P.]ā_4lذ 9* @ @ @ @ @ @& rE{"C @ @ @@h(;)yYR8xbc1yz[#Zk @._dwuWuQ*G}tQF n @ @ @ @ @ @@2]b @ @ @ PikDnş.j׾0qvLeWѻB ,ޘ3{O>d|qǸqK.Fŀ"+ @ @ @ @ @ @ e%m @ @ @#0y83UVw=~x饗⤓NXݢ6PdLm2N<٧g @ @ @ @ @ @X  @ @ @ P~guVz+'N*6lrFjZdu2OgB @ @ @ @ @ @`i \Z%@ @ @ @@9Ϗk&ڴi7xc\x駟7.gH<٧gE۶mk @ @ @ @ @ @- EG @ @ @ {СC|ѳgCԫW@O ==zI'= @ @ @ @ @ @) 25E @ @ @ h߾}[oFU0JH"=#Gf(= @ @ @ @ @ @%P&2 @ @ @-0k֬ٳg}qYg =B/?|\tEq'5\׏zE:uaÆYgƍcVZ+5k-Z֭[g5jXG6 @ @ @ @ @ @ * r}0E @ @ @@:uj1jԨxcw:')((~Eǎk׮ѤI{c1}4iR3&˘QfbS*gb 7ӦMW_}5{>|xG ѣGQnݒÖG7pC+ @ @ @ @ @ @F`,c @ @ @T?Yߐ!CV.n8iӦ,Sgz)1=۟S5jkwy3ė_~wqGԯ_?[K1lذ>3g, ,ٖZn2֨Q# LkoF1wlc&EiS=͛B.,3L[nY0駟wqYhfnΒer%9 {uKꫯ~:zguV4nܸTG <bqWA\'%Wu1;\}vS{~[EߋNJN @ @ @ @ @UK@dzNC @ @ @ "ڷo)nE*-Zc9&6xi[+^3jk_|q3&va{ /̦nٲe[y%+O~[ MԩSZk{l :iҤ7o^Ѻe͗:TKOYf=^{eA)rСEI(lEq嵥'L3f__j͑>%ϝE͛GZ}^%H!natܹ؞J['ס\)yR]I~?g4寙ƤR&@ @ @ @ @ @/ ?c'$@ @ @ @` 7. {nԨQch˥p8e3Mg]Y%Bu]1pg.Gfbu-Z&]=׭z:^M<9 :gcuMiW^{~[ L!O)4k6U˒yQ/eRO_Es^s5YbUWpƧH}*:wE,({HsƔז?G^Ҝ/--,K @ @ @ @ @Su @ @ @ Xs5c^*;8SO?=zt\pYk͝;7x≸G.; 7ܐ-&L/G uq饗M7xH/"ڷogqF4n8kO_Wԭ[7b0`@^G/FW_}Eei7ߜ/'|r62IN8=:2N8! k<3<sN:ѢEhժU* SPx?>G믿̟?I'Tt?&U qyeկ~% EyܿҥKQeΒc=g9ƤE9cǎ~Y*sdyזmƕ6{SO=rH5*޽{/ʹe%5ז>Ɨ.oLɶo&>|x3&n,4J|̙3'3.w駟+˶n=zXh~%o+zqǕ76 @ @ @ @ @XyA  @ @ @XARX.R,خ2ڿh޼y|W 7h,-2l2 <#;Ȗ?~|71+B=mC\ys=^xa{Ro/buQ$7x,-]O4)^{СC8hР,2OSha*;Yfӳ^N[n%ڵk4iҤ2)T.?2 |nJyӜ)1g% ll Uˢsq=dg Sޒ̟-~IA~}dAqu*mѷolGg}v,^~nM?GE.6M<%uk)]ޘ3gưaâSNQv,1KᲹ dAsB SVYeHʆSN(?K\~lMa)$20Dlc~ @ @ @ @ @ P=AV @ @ @,E\V~¢MݢEo,XpmYejժU&L\pAyYn-͛ݺu+=cƌhӦM|Y]n?)xnݺ+s%mYpd lݺup qqe]t:qzK|si'<l&' wL)ߎwy'Y)9jG_ƍgS%Ҳe˒MY_ ,n5ְaH(8%{%;va1`SͽCik(u)wߍUW]5 McǎYf.]ٖ O;+ ֽ SVC9iW_ͺlqg{4N˚C= @ @ @ @ @TOA;5 @ @ @KQiӦW_-mꂂc͚5m@jԨ7tS|queuW_}ub7zhԨQQ ZiSUN8!=ظ㏏#GF׮]*c$ug믿^f]͗(29=zSOy?쳱 >}7uY>UW]- {ԢNYf?9))p7\"SF޽A &@ @ @ @ @ @) j>W"@ @ @ @`9 l&KR_͋v! LalwqGyѢE_~L6-R`FmTl>([obuzqgdajNߩT$u).=Q]voV^Q"nEZlw^9xefA|~a~E)Sbm-V,nfΜV^{z[?<xObu-֖~og"/bm&ӽ{?~|CVtSnH^+sgW4U/"gXo]v8+TtƬuS*wuW??믿)11Ŏ?d?RfiaӧOMгgϸO?4~'|OvWJ[͛:t>}QGrJt=V_}:thh" SK{zDz-[#<=z&>|x\ _!׿^zWW&]̛ٿX7Y/)L- [IaXww(Y( <0X/~hӦM$#FdǏjGSNv Sۘ1cbܹY]_ e]bG۶mcԨQ6DC La`l?ɓ'gB]O~n|, s=3;׭ޚD.4YaEEI{M*VSi9_ytMcڴiq饗F T/)\5M;s9'J sw]>S2ȟҟ)t6y\MW\qE?9 ^͟'=ٳggdK?),4ve&%GYZ  @ @ @ @ @ 3j_ ۞sO~k @Yo{c?]a P\ J/ |U'! DzRY"*6uuuq-꺊 * ޑ{}ɽ0s9ron' xo7V׮]of֬YhϞ=^_Vm̂,x -P^zGϚK,c_G[l٢e˦nf^+Bxbs(YjٲJL/jBjFLs?'MF9ڷo]B}?WnJ܆?V%$$r*W*U5jxTpVZUApJV4uT.\8Ei&U`zYxhy,Z]vw-F^, _v4tt+ fwz!dzO<H9g5ixʔu-DBv:nCZ5-?           d@\6o!      N`6p]Kzԡ3[dkժ=C7n\R;)X7|N8!ż楸B -0b~jmgd3Nm߾ͭI[/]zՍ.4pR(djՒƃHyGyS,@J{l-B)_}U;6MoۉmvS:βwޣnaÆ :];_r D@ב0 @@@@@@@@@@@J R@@@@@@@ _a=[2 e9vIuJ֭tmW|+rG^ԨQ4Vh4o 뮻N?&Nx:HX6w.,qu]x.g-_͛81^v.p%zuJsƍ "^ڻ *%+dž] .lw_o߾>|8oTu'&G CGNcmnڳ'N[ӦMA-KhJ޴͛!?BKޯe;î rڽo/[\eQF9nt^ "׻ ԭ٧reJªX*TকWr&"?5j?v@@@@@@@@@@@8. @@@@@@@ $&JWC-qٲ X8XԡCj$[&ˠAԠAOSLѨQ԰a e Էo_͟?_/^9s#!ƹăin͖7nrͬGfF $VVq"nXr&sy"EڵV-0GHhQ 8ZY7Vv4wԚ5\ڱ#AǺ*zj-{unkg SJ^8ÇhqӦMGLˉ n2)ڮ]=\K SH/sQ"c\c:wN#-4#-[\x][ͅq?$cE[\']]([eB[kLP%\XdYlYmJXQ@@@@@@@@@@@@ E@@@@@@ ? $&K$zG ^=ر??V{NOֿ=_^}qwyg~ W:  /_^\rWeKLW_/֭[]a,KVܸqcѳFTB!G?22(ٟ{]Uekڷ/Ծ]d[gn͙Yt^P%4}z1MRVPyplRbbX*Sf*VLt.,YjLR JJZ@@@@@@@@@@@@ W+@@@@@@@XP:Z ц˗˅%J;w&NpafAw&Hŋ"Ebձc=m.@o.r)2d8㌼c8tP㏺˼PZjkVrIgvz M8  nVͯtMZ0eu4޻_B'B'ԱkBgOZJɛ߲e \3k[k҆ 11[`+<42> LT͚q.2Fi!6 mZ(            @V ´      @X.ycd>YZzrprA0xWw풾~~bcvK/w ,-- 8PSkٳ=\KuM/_O>Dk*THso ̡COMv B"mkS/PȠFDPHk֬I yiZ[,!!@7V&MԴiS֨q6m!- 2y6TʖX`dɒI0           yT ;'1/CjJV-(w2+V,wX*ނge7X`jaz8x`/3`T6*`aV)tD ҆ Hc_q! aK^sTWƾ}~Mf͒ K[[bŊIvnZ7vBznNB~`92 2wٱI)Y2H3H aѢuC@@@@@@@@@@@ r|M=:<1@@-0p=teƼ B@|"0fq?s'@@7۶#m݌C,1(o82uGL ?N*ٴ&M=]*fꆳ1ۏ[n O*^=i8w\Nj.!4h k׮MU][7鯦*W֥֭X ~\,Ҧϰ5<*U*D%pl iV.ڝ^Ex\ȣ̻qƤ`H :{l߿_ N-28[h)צM{AH ׯl?Rl` 2ZXb*@@@@@@@@@@@R 25# xAr" S y\+@@!`[h7o!.NU+XTHל͜~4Iڽ[ryGݻe9ϣٶK#GJݺIԨQ[8p,X1ZȢ%H|`E ,_ ,2e$-Z e`jw^m߾ݫ\i0mۂ+Rȥٶ-2 m,\)sg8 2 "\iJC7o"C\g̘]3omz]vjٲz̊b 5kjA6F{uQ+ D`}            P,ЇG@ 2}#@Ayg@@$~}8ey0Ȼ+\X[{ z<N )G'`ko-[$ [ ѬZ0^>\݋DĵPƵ.ͪoݺF q}4.Y*22/K@Ie˖Bm뮻N*U҇~:d@ V zCVgw?Wt&L?ZZɒR.ͥ\c|ӟ,M.z>Sc?QFij B iĈ3mB Xpܹ~@+$ tYƍU*9E3fL!Wto@ŊS6mt''jeȺkL),r*@ZavP!y8d -AѢ~أt)tS8ran;[J|~ „So۷oAm_w:u 5=GdӦM*_|v|M:tȅ_Y&MK/eh \(PY \ CΛ'5]pjM6|,rJ^={~_>Շkz;vTΝղeK/t5r[Y=^\&MRߒ@{FZ`|B=^n^*22^\a @@@@@@@@@@@@4!G@@@@@7a'}\D -d~}8C..hAS=f`h~>I'I\?Zhq I"uZkҕW澽ۼy*TڵF1c믿>PÆ 3@A֭J8{4g_G5upM_O?JZkگi۶*Q =v'+BW-1pmсaVbc0Hkۂ!l̤q{]T<"           Af0#     ֭rX~E~x ,vga[ha¡{hf?~2E.LjX]el٬KNla ?d nEzAtIܴiVGD.]ơC%v)xz4 @|Դ_#-,8=;ײe[ qܽe JE2EŭS6mԭ[7Z@d1{c̥LɪVc##W~E.d֟n5^C>@@@@@@@@@@@^ Ȭ7f        {w8q䡏7HHԑ \ƕǚ5 {̆Ôl4s4awҮ]C?҂8sپ]>-s[d3SJaÆv- %\'pu;  }ٻW7O=;ƅDu5.Z(\V\g*TAkWT={Cz*RHr=S+=~dul I Jr~X}n /Q"X!           ) L.LE@@@@@ȅĴthd].THUKpV>}q 0(O9ŋo\ʗ  ,Ҏ]A)FIw)Yً/J@R ,o.Kw=Z>#F~￯j=g'PtI~li6B!ܰՔ)!MR?<ݽwWf:j۷ZhLVkv)[ttP#fl2ePc #            @ {@@@@@ȕI˗Kh5}ʕ~`^L\\8W/ɂ-@~})!!WZ!YhՎaR~c˖y#03Y-H'K#RٲmkK<+VXoK ȔC.}]C) p\Xإ_BX-[f1ԩ/4sfIWcc{?Å+oWǎt թS)R%Zfje˖pXURPYX}+THiի9g @@@@@@@@@@@  '{      D?):^/]*Y]Ah5 2m l&}zeW:H]?xA ڹS2D1B@~ڴ9>X*\poK!wsN={׍7ޘڢLGczzֈ_5kV>h 6֬׷PYƑjI           {̽dž!     y^`:iB)2/wL?}eKQrM~vOK;i*o-~2sK]oذ R+-[vKպz衺FvءQ>رK\}ʼn6.е7RZI l/pmՂS*~a9ud8~;j Y30VlJ[b           @N G#     y\`#]+^~j@:pi Βtw''k?%U\YN?dx9#P%6rK/g!S]Z?ቚ7v%K%ubŤ-"m6mM% 5,2Vk)kڵ~XʕU ,%H L֨!ǧ-"          d>li@@@@@7x`AZ֭nZ&\~cϞ7XZ(p; Ig'NvWzkJr B}ACϦLR Jf~r'!D%D-2( B!/,KA\'R O9>D/һꭚ6mJNnr.ցM5cF!gTPȠZ8$Gf ;v~cÆy?rƌø,'+]m8pT|%u ~Xd:u4`z裏tee׮8}x4vX{O)޽{xGCZt`H l֌pȌmȯ)-o֯,$2M, ##g@!           1 3R      @عSZЯa6mn7˔,;u>)o(ؑ?, ʂƏRbRҝwZƮEk_?Ǥ3fY&!!l=oڴJ.f5h 2D]"ٳ0Ȟ={B YC,Ro6Z(;C7|S/իZO`H 5b͛I:Hlv>6#US{@H j63G3ij!8j"- N𸽮YS>v          T+}-Y-  @N 8FO?G1w#81cƨA;  ,DG ׮;>^.|)hhRkÞI۷K'- ï',YyDzI?SOyt"._UW]%{W֭߱c,$K(}뭷3yW`̙zohƍ=nF]p}ɽ1QCN&M.ٽxqm[=, )Y+`>SFD0'DEFFq           I ȂtW@@<4VAAy E@@ 7-1|\X:porpch XطOZ-[4H9tc(i A9ҽhnx_Bˤ+|eCU[o͆%ĕoܹsUT3yy^`ժUz饗W7nԅ^nMzj{`H A+CڰukpaΝcd!6 ɠ+Ⱥu&:b          yE .t~"     ]`i#-'1Qj۴ ?֬F_gK&'J۷KU?<j&=,f]y"Eh޽9_jҤ/(.G:F@ j7C{رce|ǎu'뮻>E)ťΝްAp8k ҶȓNN9ů32n)(PԼ_Sڬ{6\4Izu)2(­!u0B)           @n 27      ^`׮pcd裍<+K-aC6h b4~hKeH]J??6nTf |t~ԣq%JΝ;37Cwi_#Fe]/\ݺuz,yK >>޻:IW^8O<]r >ZȥK`N=N ʻ{nASrRjY۷3ݳ0S`H 2EڲE*RDjVpH !ӎ;b GyɽB!y-D2&&ۺ͆@@@@@@@@@@@G )      "xq8121)[Vjȯ={-d )&`'lդIRBRR߾~R%$3C'}TS=3ZmTs)k׮ѝxԤI{zꩧr/lGiӦz7t}y!Nڵk'|R;w>N(UF,ۂ-g~H0[Q>DH1g%KJ-Z5Mm "-h+?DDgCA@@@@@@@@@@V V@@@@@@ XHL9ÇX?aC"*8.v,p ~Zί3TL ]{( &u"Y%{>\_ g۹}+UVկݴ> >soХ^:h8d@C뭷ҠAŽAZ(B֬Y;,w~s۷KSՓ'K.%+'Y0sٶTqwA|yɪbkH 9}{g Rb82 5j?+K/            2l     ` {Ƞ`܂ /.YcFW4_2*`!7~_-Tj^~}@UZ;Vr!j4`tŒsfBXft-״QZ52s\wuzտ/2!!!{@ ;Zj/R ƍkС>@ Ԯ.-q_a{1C{_gpp p%2+4 nVO; g˥%K!{R:; ybŎl)           P0bBd֮4ztfH;  9-0p=teƜ% ƌ>y  P,eB?q<)6m~_yaYkԐbb Ys熃'NmTwzճgO,YR_}dSOI=$U.=l8+[:6{wڷor:|qKj֬!E)}?aÆe˖z8a.N$}_/ Z,jRr)6#% 422G>Y8dd@ '+V̑Q@@@@@@@@@@&  yU ȼz7 Ai0@-~G }\BJLj8\ߣ )+W'L,tikW? 6 oj:UfM}.(N֎/rd{; 8mg͚-Z~Ss|Wyq6mׯ@R9s5\c}0@ !ݭ+N?X8d9E6{C"p (e˂$A(EF[@}l"          @ 2o7z dAF͆@l 2[ d@($Zudࣅ?noxqapУ>ZcR||v M>ZU )RD~CjF*THYguGIT)kH.KTvo'xAw7W_}U}Kt ;wvY4ewpx/dC]O> ϪXbٵTu ĉ̙}mLpn2eRm\ŋϑY2r|.pan]?>2 !:&          @>'n      @>pycZHyzn+U-5kJ11]Q poIRveNia=i. ԩS'*ZhZ3/\FO{q+. MĻ$݆.ew֬Ybc݅7rHjJÇנAr_W_}^z%%$$X0] ..N?tkF?ƍ,%/Kٲ~[ٶM4I`H ~skg tB,H je#"NzKڸ_ڰH~}ΧhS^#          SR@@^xA{|ɬ1N:/VC@@ {3ߖO[j+iT嗥[]K{ifBQ\o 2N0W@}s_NchBs9lUۄݤ-4-.u]O>ӻO) 1b]uUGLШQ#.!C`JI~iذaIkEoKRv˽1}'.`ٵ}n06y6ox޳yΝ;+/׵^FFgDsz}n?:6'O|0i`~?;vZIv[s+IKj/z^z=^gd"Km<۷OL>{o=S5󎢤<ܹ.b;.O&?})SF.Z.VҦMҘ1rE{tg k+L>ȣ\ʒ;{4tHGiv_Kn֕.Fݩ>ȽoHիK&/sv J tNz#e@@@@@@@@@@ onK@@$\fѢr??A$^74-FZNS`|}U˝ۺUTI].TMC[7y%JT&TV [е.CxKBu 7?.ͩFsLÇP,B?߂*받n:sA\zq'Ԩ.EjKYfKjn[t'{!|N?ulڻ%ur dP?~M+q_ߞy%\jیlcuos<;os1Wzft_uZNv?\m} "m;3<3ly+>-oZ5ZsEf!%6ly[&cgJ*^k%墷a!V,/Զ̳aJJze-~4mlZNi6-#}\x^]vZ GMDo믿֢EԴiSo}Q3FK;}IUbl>|rt~uYgy=lEȝ~ҁr8MZ8yuyZ\._ޒO8Y-G('?Z_Go[Ho~F@@@@@@@@@ѥ՞fD3Ii͏ Vu rzJZ߂g-҂g-2rFi?js˴Kklvns > {蝣I [6ej'ynPNFڲaZ5/ ȶ3Ldim?ymDm]_kbN >5k[Blm۶y "=F$tdA}-jW|ԥt~y=JkkV@d!. UGZ B!#6n!ܔһ7?-          @n 2 b)S7:,]z^,Ynݺz7n7ߜlowܓaJ]uUzVׯ_/{prРA*]lݑ#G,(azOx]ƻ'-衇T~}aN%\U>C7p*K/駟~R%Tvm=I}ܸq3fdɒkd@@@ X`>Ι|cPb8Áի$%5 l,}h J K. CjnO,ʂ{뮻ᩧR2e,_dLKmvѸLp_Sڱc-ϊ};6\Q;; \2G;4/:2%[lQ޽,׬Y d]ve^pdգ=C\￯?Oςfv7jժ% ^&i?Fv[䯿|2X[o F8~p n6W6VIk~0Ͼ䒘{BiɾoO\m/#{%ٽ̬^DּELk߿~>֧Odmۋ62G4DŽvIk^lzˤ7?h'|[j̘1w aRD/ofߡ%Xf׮]^j0=rhR{O 5/X&ᱮg籅B/vHDnp-Q,X"Ecǎ5gZv }j>*?ny<"~G@XP\kWNv-z~)~ɽUI~uɊsʕr ~uy[o!Vj% <s!Qo&9Lo~䲌#         ~ s1  @x5`?|缇AѣG{{Hꫯ^lO}b!Ad{aÆå6v4i{8͛7 nO믿^oSctOmvi `gڃm{y֭G0odþZi?{k+%=؃P_l2~޾s9>lo!V    \hVwJ?r\N6 +TOK~ؽ[{?qx? $i#Y`?\.e)}@QF&~ b^yosMu(r :sJ2g{ / ^rl$R93/13=.[־K{ ;wb!dΝB0DYRZKomk޹bV֘Mdn?_C&AFn0`}jjժjIJ*yAGs,2XH?}Nt G[hF҆ Y3<=׭Z,XMHm" mٲnJ)2;>" ôD"i#rڋg/]ԅ{ΉSN9}]/f혿^?F.n:/`S&M0W#JvVM㟴E.=y齾uإٽB!-otʂ! 뾤^JjSJ֫O>}V*^F>X.]y.^:4iޛ *?oSO=va!e=ޙg- /xN;4{k۷o(Q"NZ7 YHvI?S`˽?p2zJwwS'McK.׻>W@|PhP8zPkBvB,kjPϞЭB#ڤIЖ-ZD 3.2$)&MB!`ܸPh۶bm?"roL:.,2wސ jk3XW6NAЮ]ibwŅՅ|$04tEyB5&cV;1ڵkCmڴƏ\r!Tn3W]uo Iuڵk\X\yaCej mذ!EҜnvV^l#Fx] myMvļW^}# &֧;v$XSf0?J*mgԩ")3.kk)aSgԮαȶ22Z{{ ԐHIʹm6X^G?rD)z x≤y]vv[Ҵf}aʔ)!{1X'5rꘚp@+@UǴ~vd~q sN'9`ca~/q: -Y }y(Ϛ׈CϢUB;'CaB: ~-ڽ&          @sP@@HW`߾}:䓓-wS~$#͚5{{iV7ސ [^?wV½\J^yu=0ŅSj=+\Ȥɚ~[=4_.@3fYO=M@@@ 7 $&J˗KsHs͓{\ԴԱt x&r? =O$s|LixNd-HkK=zH7,u.U|~uM7ĉ5rH-o}PFBi&圥nqw…rxI ~7WN1}gXR%&ƑJSҥ3už3o+.Ͼs2j(q3l0}G_1cƤٔ]=҅i;)aЬYlTKFNʔў U72dɒ3:X%!!!rG+Vc.VJ=sz駓MwJiEu xr!Z[Oi\hnJifxwx|y5h@_א6u-)!]ҝJ 6 _\Xuu-VEUUlDJDADV7{iƛWO8nMOIW_          D@dP@@t̗/O) |!ҥԽ-Z$ :_L|xcɢ BOo.hB_ҩ]A7{_ҝwޙ|  D}Z>~C >"0r}/gG},cB lwD~t&m,/G{@pҩ[n.RS֋WmڴIUdbh:ԏ@t}-|v{mtTGlߛZH M6̙3 n{}xp޾ӧa_݋J\dTR{2!H[gرcuYr (2lΝ;M"E\7e\7f/˞g+vtA>~0Q\-8νqbCHI/n_~뭷2t[XўW,믿z!e{nq:dK>__BwNu$q5j( E/hO7dm[X,KK/49q/][@o<@ևti>iٲHLҚ5E7,#񡝞?3&Y           NBf]  @ ӧѭM%KqҎW&oɗ          dt&@@&'/@7l; eL 6.ȑ#G?;tM^oP7Zr̘1^`ҾyɂwuJ({ҫ}߾]}+@ޗgZY5x_ N@@~"YrQ0\HE8P.|${N2EںUH75K_ -H-~uTTԷc7˅SR9Ƹ -\0\>o7|?-RYMSܝbu:u?ih늬UVСCS{K/{\ 6 5 k^${ϩ%S] xνHK ԥ6Y$~\&zc~Dƞ+N4߿DIr Yoo$7͞= Y0D}-jժ饗^#[_]]Km:vvh=™߸7IMv&?|~x}/OC=txZ|'G\u^y2XGNWUP,\tE޽{gZLuz5`ԛ1Cr"wiSPzӾCQ.\Ϳ/K 2垏Ʈ}f:U]]}8, 8C.Z,r}W:          Mdڜ  ˗˾ LEN;M{wR+Y$Ҿ\m_)8㫭FW2)X>c}zWu7+}Ӧ M-7R,yꩧz_Ծ˼X&[~I_]rwȑ#|1[n\a%w:7yoڴiJ*/FoF2!  ')`{&NL$\E:55,&I6I E^>`:Y `}.אr? !y>``q=3}blj5쾞3g 4 ܸq:tEN# \̏Rdυufe>ۿcK^c"/)}ӧyTc{vÇ{?Ƚ}^]el޼yK(®Ysk.Yi{ԨQ,:+IY[n NNrhKדO>xGj;q'  )L'E ʖ-GR?Wݲ W;]Oiv,ԗ+W.mqY\JӉ;Dix#F>sq_-8'Y۶m;fwqt? ZMAjkrȑKQ爔⮉f *xħƍ/sŷ>O6G9_UѻD)R_u''.)?[Tܽ}wcױߐPvqdsX)          @ dmaS@@2QlūܷzE틻طTvmy/b,) /B p_Ο˼|饗ٗ-$i_ ?/&i_/^^~0aBx˗O\s_BZԷo{]wy„x-]EwqzgG[}!_n01Ƅ  C`v駟7ސ S;k️X4~G/F/}nCEc\pM)MX. R.K͛K}$O I;˅"l#RZWؼy&O/h"oߊ]\*A2pR2~uИ~)9OT.?ȇ mE2&`ݛ$|Ic0ƍ~d-[{lv?Ԓ|'*k={Lܹ3ɢlhB<`cwp޽~7܋{ժU5|=Srĉ^1lCqS6lJm}Ӊ/wN|OmǻNBLmy݋=u~/7l_x e>W<3K;|z駽ǏBmzӦM¡ŋO~qƖxm_d\}͚5]$N~]s}F.>r}Rd}_J/~TgB҂~r2 Ғ'P/D^.F,v־ߠK226Q          D@6?gpkxEp5@@QzGi_l;w*T}Q>p틞*V_'ޚ.sߪʖ-Te08/-߼+WvѿS;b/B[ ҾiO K/7V8tnC[ 7! v׆#0LT\ GW?7a*+D ,/Rg IK;MCaNdŊԩr؅ENN`6?kѝf늅d<ٺu&o~3% XP~§A`xK٣O?EK!9Šyʉ&ۗhDIц5m4ɓ焗O`7dZ1ܷO4|MYd~0'VmSw{->']Ngߓx=wi.X kyJУmERuʕRR۶~cGA"u̙:sauŏ\(UW]=zdڱq5 'M"Y@'"EBmEB˗/b֛]]wuid^/mݦ׻8Xȑ#S0yծ];C~G5'O\vgg834Uti VMM\Q/[q6m8M6aut/Nj.&^!W_vmRZ*y!غU8я>'Y5wnys`iL.+vFi,K/IK?,ʜٳNjvfwݻw׮]dAŋVZq%詧~{]y޼y_~č3R^nKzUZ5ٜѩfpEk/3hٲe5kJ,[,O t%5rH>}ʛ skT ljƟp'RIz=_ںu ovr:tTd?.8i˳Ǖ4˗dq          Eَ)T_҇j,@@ F}^5f~@{'@p'/\7gx^ߜEȣEM eEJLI?Θ/aC?رԦ 1|t]ҀR߾n0݈?-ZrEܦ>Wr K?2!3 PIKs2Q  <(M~'i>?4bG۷p,*ϗŵE +}+('D6^qTjU޽=MW\"r V~SӦMϻpaL;v^|qƌE첹H݅j֬nݲ+G(@@,lٱHFn$_>s[ -?˪@@@@@@@@@@R * g  !H @l ەB,z<8wk\hDT)!-@t{ES̑Ə㏓&I;vHe h3!p2;wJ=&#CENf\7&Lb5b3҆vQF*Y~W=z#n "CzWpB*U*2ţضm}w K-)Q^tT|oCG l{E!C;nH ~r5 v>          @xAǙ  Q+@2jo:Wqy8@ J}L<]oi|[Wʟ?J6a"&q~rhQ]EBoN?M7Iٳj,'nF}'%Jyc1cZlkĉ9sjժqd@ wV:uԢE Y?"W{azwseT^oӅ 쏡ۚMZۇb8dphHGdK2G"|_@@@@@@@@@@  %KB@bRdLެl B @M⎉cvܢ2ȝ[YS_?\tm%E <4~ԣMcÆskZ/nE;W/駥 ޶vjPjW_}lٲEAtwZj*\L¤I#b@D=zױԱcQl 0`~S>My^ /Jxn[$% Bq‘ʽ*TsR%@@@@@@@@@.Bu{1Z@@  N @ 3+AȀ=ܹF7oVlأ][Jre`e\8ضM4)!8oi?v 5oGU㄄ OHJjICH-[y.N64+qY6/3o?9X /5gwEzLغu^~y^ye֮Q^+_^Gz馛)gLY- Ed˖HC&sMIU          @ S@@'@  cve@hXJ5ˏ>ڡKHKKu$>֫'-m[x޽Ҕ)~ѵͼU~cGm[qѱxSzNzQ_?)GxS`{ ~=/W֭#dӦMj$ (U \WTRč!@ \҅kȞ׈Ɔ;wawo#ԩSowt݅3ւ_4 D"Ӥl\YJ9fq         ĥ!ȸh@@  n%@h McE_`i޼ٳ-[m;t?hbR*Rѿl8tHq㏒ U:tvXX8F:-w믥yF*U x8j@]tN3fL2G߫}*Yj׮.Ȁ@ 2_]܋]… {cqPa;VO?=Lv[\>}z;S*k>E9CKHD֪ #;ɬ"         %@2n/F ]dY! Baaf% @\ Y#[%K=ZSOK*6;W??N(m.VK?v(/RdH"HO=HڶТR lwOT͚5S4i$1{Էo!AH*\߫W/ 8Ҏ;ꫯ7p3W;cTM1L[Ns?"PAM^V;VupȘkJ)qr?ioW!kO˓'cZ          @$ [!  @2nd!L@e @ 8 YM| ǫV t@~ݏ> -QtYrXY)ҭJ7J<ϙ3+Gĺ#M`ҥjѢZj}Ad18|{NY 7;e˄$Jwu&OO?T/v]B Lv ,ꡇ駟qݷuKYke J-[ dX_a{XRB A,hPe!          ^oֆ D!Ȩ0 &BibB ؼY.Aq|i~)ONb vpa@d> /ZN?6nL\dn,TzmgIr-%Ŗ?飗_~96nڵ}M۷O۷ѣ#n ^`j޼,-[6Zl{O={tz#jʸu纸g1b ) fB~d% tСc\,(KL?!Wn֯zK^}K]&˗Ca "u9"mZ i$O$QODqH;REʕ˿ E@@@@@@@@@Z 7j:ᇡZ"A@j]Fl)tzX? ؗ-"DŻ͓fÏAbtV͏>6h6JdD=/M.;JmJ FF03Fi:顇;$w latuiR\o JC{=ܣAZxN;,DH>(پo @IժR8:x$          N\B@@@@} BlG"KW]%5j 8Y#,`_ÏISH{HUn:te-Vn]/J– ݻ@IDATvܩޏIK.qϝN:I O>&Lٳg-1bD8V:@ B, ۵kW/Z҆+W.]6B"府7JÇKCJ WH6l1*PԪ?'FhQB- (/} C|NO,q@@@@@@@@@!Pj,@@@@@ >Z1?i6(]Dzu){v|??!8iuT||e?HSbh,< s;wLo2FoY9rnٲEO0#:  (0jdB11!'0=tO!-l1 F}yF]IwKrIs =ܸԠT`ȪS% >Z$.N9ŏt(| m׻ȑra>?TbLl#Wުd˗/סC2+Ο?_UtE y/dX%D8Mjڴi)lj+`?0tާo_sg){7#C ؏X ҽ==V'0dCMyL          @ @2@@ EB)p"  &d@ v,h3پL~?T~cݺk#1!@v?Zql? Ӥ}@vÍ*2UAi _J^|Q-SWr{9sE4iev}ž={TF YcǪSNJQ C?fe˖ի9C"oc4yTtL;:nCF@V ڕL\L.rHDI.5kJ dըY/         d!Ȭg  @!" 4d֭~Ѣ3f%KÇEIKիѹL D~)!ϒ,ڱ?uTP W$Tuԯd_:(U6m׮~dW_}U7pC fI]+r,XPk֬Q|2"^{uȑcJ;7GW`"?9|a\XG:|{ޮp ؾŋH؋E"m{yE!ϵjI {@@@@@@@@@)@2ڬ @BBQx1d@  ӀE@ X4‚*-hgH*x,N(`֙3? -U~A*QℋDwK'u&TrmRmŵkСCnNٲeSLfϺݺ袋gX6Dwܡ^x!I r˖-.E+n_|G!]yt/_L @m! Jv,]:iB,^lIg DtISGaB@@@@@@@@@ y #B@"JdD !ȐQ 3ɓWkܼbʖMREg)5j$.g@l.(i4aBBq)OeK?رԤ#G!!I%{4|ԹRj2@,_?{I5 y+,qOŋO3v;wjǎ]dcڽ{&N'|Eu긘j?t;}СCi-&ýhΕ+MuΗ/w,X y\&Hǽ=9dO7|ū]-NJ);wAj \`c hH魷ʕZ[^chJF3F*Sė%roW^텏7V@C{|َ۔}вvŊi1rDփ@lؐ4"ׯ aH;bEy5 E@@@@@@@@@ AF p@@H iAB#@24,b[ >4c?ۗW*_m< /zDL ӥɓ&#}B+Ä@ ^yEzA0s%[jX#]Uk^-gΜȚMv /i woO/be!+7blْd޶m`& ]Yt-1q \P\-&m[vM6.f)R$\hQ/ea.-isRd1!G X͛7k֭Ax۟} cb vhMr\tϯʕ+ &<&~'><<@}{ Ⰵݯ$y|A/8^dI)cKÆ5kS.{25jYol1 \fb+sլY4g-_\+VDa 8dph!e{\nקO?]*U's@uγ0!@h\͛4i~O@dts @@@@@@@@@4BF˂@@ #[$ \@ \H| ӥugG8CjX.#5jH;wO?|l?Y*p4ujBq4NA~lf@Y9Y,`~?ҝwJ=G?xX XL*B~^BlzHUVi+nټzjYϭwK<ɓ'IhL N蕅ނ"pY=p/xAw)XZO|EO*Q,Sʕ+ezXʗ//3dB =qnq{w Z9=vء&"qnsz i[q+786AҞ)E/-1ylɞc-iQHK.-{>9О3Rر~ҽ|yq/N:,]{A0L?vMy'{… {џ ZxbVh B*T^3d&{Mמ+W MZprɒ%^r+[0jժjڴڴim۪f͚'ZġHMe=}+ "q"ǩ,@@@@@@@@@@  M@@ _7[#@2~nkزE1Ï>Z⏮CM*ńIcX$@2dzlFLʬY Gؑk0UBCU&E#EGj^zeV(4HԲe˴h"/\5˽X-yN;-@,bVʽ(ŋ=,g9kڡ,ZNTzؠ*T۽E]eލj.-,xӂ@_Uzu u\jժ)G7H5[\ .f.]Ի/ٳێ\ryk lA sf1W\j7^Aܹs7ٳ{ٞju͚5ӳ*:^c6w|i&?vSC8Pr,O>є)S묳R.]ԦM5nX9sL2}avLvoF&M"Z҅^"Wxp!ۋDZf E"Nv#        DdHY   ce@ A#KfI?,MϮ+BRɒ &MvZF/Bw V`ijmG?֫gQЮ!+"|4st#X>#,8U~7mw8gYΦ… vG#"ܧXՔ)"7[͉d[H2w^AjذâEF61Qxx0["u6Ybaٲe M%Kg0[s}| d=>lxMXLСݺI#FH?\Æ _y .P=tgPBǽ~ioV}>SY4k׮ݻL ~"]ܽϗ ˅^?^ֈ         @ [  &@2nHd Y d,H>Zqlb,شdʅvO?^z%/j%4S_&$]#Ţ-xΙ3>}j*`Czuuki`nݴ^!z-teSPto޴Y Ң|u\.SLT`Ν Z,&|y}{5k;N3Ko n_\_ňgzQPZ8^x͚5u{̐v^"`EByÆ Ftиqc5jHgqL}s\U(=3EӾF*Un۶M^|Eԩ/iXv GI?U7t'v 1!@ HݺC޳{=ǹs{[(2!         / f;@@  WC"\d@ w?hGҌ댸\ =ZեlَYDHOݻ֭[1cƄt, xpCBu5_Ա?[5@ z-ZUW\ 8pM8= 7oE,UV-p!ŭYƽgbjviժڶmE͋.^{㏚6mc%6l(VNTbNqh~l1QYPl*݇{h/ǥO%,^\ۄȷt ௻} t{1 *x1t+Wz7xûp ߿+C[ɦ ;i D ^\Re@@@@@@@@@ AFӭX@@, !0 Ȱ-~ѵDdG;t=/le_أk@xIDd <^5C *\{<NjL?k'xʛAgk&X~ңJŃbq%0{lVcǎՔ)S]J.Zl͛{!Xv El2/ O?iɚ3g8_Ew9眣6mxq,bܮvM0m,ڙUhC-Bw0l۽XEb-6j{s :tne'˴طmȑ5o^Ҷ>WdӾ;d1ȧzJbv1x[I)"Ε{K]՛ '![6(6*@@@@@@@@@H )@@"Td0 8IB' @ dU|%K#GO͚KH *g}֋-Dx&`YK;wJ']EeD#m+HZ9dԠA􌟑Fݻ/ҋr,YҋYm۶Zjn #(-?wiY|pw7+W.+ټyy믽C qn{6l\r&Q |r/9i$M8QK.,۵kWoQFok޽!>rAutw@ij\r9p@oMѢEkK.ql")??! iHEYo=֮?1!           Vb  @ B|Vd!Le \AӦ%-i1HQ&IÏ%J,=cժUP&O֭[gXX9$`qyiFX1}cj4bƂ@ .{ z)wo)[FU~oFT˖-խ[7/T^=wNdbcǎ"cƌ֭[ugK/UϞ=]L,܂+VO>\.gΜ9眣N:~ʞ={U#T`+Y(oK+W\ /{{Y՞=k-{v<ߛ6믿 qV޽)M$?Szޥo߾^~ԃ bC~u{@dݺͥK         #@2vnK@BB@, 7@ .lSJ6y;ԠԬYBpL.]i&-Z4.nK6~tpJ)~mۄ=֣屝6r&0gԯ4etO1H' Ç{~[~Q] .VDI-כ׮]-ZW^˸]zF>@ʔ)={:(o޼i\C k_9s.ϼsɒ%HW\͛g3ٳg޽{5d/pE,n{7SNѣm\BĉN]֛Lj(d:R0/'@l&         @ ! %@2nFJd$YI vx: Tɏ>Zs n CqMc vXT>E@@@@@@@@@dA G@b\dlĭ!ȸp2$p4sO ʕRRZ~ysX;=֭[+Y8 Xp] M~Ǽ(zuS'C}{hXjX@Or 3/hb"w,z.\| \ysbM]d<8}J*ztEc q+V';Cʕ+ח~ի ?q$p3<_h:s"J_M7ݤ'|RD-[?ꫯna I{ܤHn?d?PN6~SNɤX@@@@@@@@@ce@@@@Ș f̐o{WjRjD*T(ckYL/M`x9sIҎRٲRǎҵ7O`NGASM÷~?7oBHCUv4ydj*~Ҹ]>nH]yjР38# 6lE̠{1ս{n6zW.]yzꩧqâlGOd&<~Č˗/]fZX$D@ 瞛%Ky"|#C*9rȅPJN/H!        $~}34SϞr>04c)  Y/0jdB1뷉 H|O"@ k֬O?I.e.fZHkԐ\3!Ytiǵ˗qkhQ}=֙@ kl?̝wJvI?.t5a,0rHr-*Qy}ٱlGV\{W}!{X9b{ x@~;sbeB* C>bX>$edQ 6T=4lذ,Aw>Y^2~-EP <(-]!M8rY2\C}[<@@@@@@@@@ AFƘ@@0  #6B(@2ج ؼُ>4e4}{TԬYBю*aX+Ydɒ0"?,'ʗOj&!:#^K\Lŋ|wII]R♹F{uћ~̙3^98=G 𢐵jՊ5k誫̙35`x+3!q~gp }z뭷ԥK^>3δ`U4c b632={qƪPƌp=@ U} 0y ?1%CeS]$g         ĠMB@@@@ XH vpE5VZj֔e aJ/y/pkҤIʑ#GJ=i LزmrM?hGy\~kcRܡ^3CX'%keqN$awy^zԩ^DwܩO>D_|[mٲ%?r5ؗ_~>̻BSN4g] hBgwE7Ͻ,KI(7=ƎEF%KYAۢ6{wM7|s=yiӦ_{>a^ўwn"^{MbZ*U\45i$^ތ֭[{y=zHdD O~|ē;7!i=uK.4YwѢq@@@@@@@@@X +$ہ    {JӧE7m Hg)S~`XJ7ϟUza ol94`B ~uKtԠԥ3R6RX@P |t֭c_?p(HbΝ={v~q/pf۾}ۧZ;vF7 ?vd Xkذaڼyspv&^+(T{W_}vڅk!_τ Խ{w[/b!T-W+W?\=xL!իW{HowᤆnIm\+̙EPsWϿ˼gCU{ _魷u]kڵ>{Ov_>CBs͞dXY@5kω/jo!ȑr1|ReA YT/_p@@@@@@@@@ m#g    Ĺƍђ:*m+x@6Mr  HD 3v)[iѢmmZ-}s :?|RQ*RDI5JjPiiLi@kW"`*deҹJ^Z.nd-uWj7n\D fL}U͚5V p%KhI"vxGW^.*a?LVcM,fh-ZEo& <d݈ x('Lvt4N\ebzm 6&^ynE_z%/8>c w}wf,>UI&y+V\POfnv0!Y)Po曥!Ct]g$qT߲4i",(U&>V?-a         yIQo#H΂( HDPAPSSπgĈJF#()(I "$$# Ie,NyvWu,vVWD@D@D@D@D@D@D@D@D P5mZr8ʼ%&%ZeZR1K>ӝ@VZ83qwc͚5;kϪUf]I)cmo !O=5̅*;ؿߓ2ma/H@*~]C&a&6p ygp%J_E=pM7Xn]̃>W~.ٲg-oRh e-Z0l@ܹSV'/?L4s1bŊ.{έ/^8ʠq]6l|ΐ^3f|ׯk}A}_uobРAN _`ذa5jwy]=7vm87nLt„ Ne˖7cƌI:z+.b0DF 6m~O> .t}œ xoDZNо}{رc6J7 }/>g]ty뮻W_}EiFc@Vb_Xzj4h[ݘrE1=~#I 7'a:ݘc0|pݻ={DYJ3X7 {nL; J[{nٙxn |'Gom۶H]8oꫯﻱJy ۡCbF^;ʤo(8%8u ^e–2Hzu/^vYri5.MCRi+"!) Dm@eUWx9 " " " " Ay5BD@bʿ0,HTqI0s7 gPм9`.7d9^eP(D_/k׮ 'dWfMԮ]7nt;RHAfΜ=z$ E59-W¤I^q*`Ah 'k@&(vμKv ^z &AK,a$@Yc@RĹINÇ;!mےAׯ_奈˗wsIv!̐,Σ(42ܔ46 1OYmժkQ5~x\uUؾ}9\xu>ĉ^UT))C$7$s匏?JQ`l,}qby湶d^aPFIlKge/f\IxL:>̱>ܧ٦)z$oƝ7̓ɓ';eӧǁދ~K,q+?ý %?|X~]vuz~#be1(ϵ+V8Y/bs=N@)ܤĐ;xr}F [JXfEI%T/Բ(46mڀV9 roψ߬Y\H,4j(ӱySF{饗D&/8O6͍"ʸ1N2e@džLF#)%ŷr3y\#'( g8kBJC(arG <7[Jn77 /[nia,ko׮]馛X;]RRMi#F0Y/}kdsbHJ"y!n<"VD@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@9W0 p90)pҥa̭[ab ࡇ`I 8sN-ZI [ou>FN.]?QF9I''nC$>Le[a뫯~ vn.n0JZo&(y5?${Hc˖-C|P17o^TV-Ej@E[ dUfF4XUߙe3o >'+܋bG {1'sK>y1Y]-Pxڵk$W2? (=Pmč뎷|ͮS5J?y)mdE(4hzu99*@yG}^FQ_VGqM:t_ٳgT~V Ǿxa,cJs:Ν# /'d^}U'2Eܥ\޽ׯ79akz Ű? R2}YwQnjYQK/)h\XbY7#~!^4W\s(ckp%xp\h JY  ُSK.N\wuj[ZpϱSJ#(o] fQُT( qb` }{gŊ]uFkz-ׯxF"/DSD@r@lL"l{It0U~=`Hr]O^AD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ^˜8-ރ1)x@IDAT `LT&gJDK(5i 4p"]JRPfMJDӵ ?ZH͘&M 4o^>L>` "(z8aF `b]jD@r\6R"GYN; )v\nz)pYR|6f V1 Ev~eT-[^zNZG$EX pp5tPߥ^ʏ.Pvw>g_0ܑ<)b`>xu i~;7`.v0JȏRP 6ĬYܙ1 @ӦM=ŏ\r.\[l~oz/@( e ,)w^Rqؒ!O.첤Or]~쬄ƅ"E$cr)s<^?DF~rgt-6RI25ϙ /нcѸk3f]^'_<@mm>y9M콤j"/Ŀ{ ؋5`r`؜'9["$%H'%" " " " " " " " Y"i'|4N,=8ԭ y0ʖR9 ,XV5[pmaʕZjmg}͍&7zs_XNA駟~YRJeIfnFAB93}0(Hf3(S\=cJ]o\In+aI2s$n`^|8/<Ĥ, " " " " " " " " " " " " " " " " " "i46h@6l S=aBa`v`l޼WpXD ǖsA ј?ˣ2uXzuU[o,_~xq58/q!N\pl@ q7:i&iHVY魛5kcweKT޽]{#ֱ4N)6^yGr$٧~G$S" "zyw̘Lxho >  w"YD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@"C@"pU" " " " " " " " qN`Z`&*T>pW_;v /x2J7" fL-b?0IԴ 찣W/\9vmǽz Xظ6 zbŠ/kQD nLԭ ^o.nJ Tlٲk/H䜊B (TIfefߕ駟J*N&j7S߁Hq-/ vP~}裏g!塇?wJbEduKF-<(2DBA%W^骲w^`tv&4zPZT}h I߾}i&w.\S ɓ'- 2;_Na'cA _Kx>eu|ˌ d_j$ ~m~G,Xm?,? 0)>-UVȉeC*}cZǗ7o1/A#yᇓ9tPu.ies CNBD@@b@fqx5ض 0/46^i(\6  >1" " " " " " " " " " " " " " " " " "[D@D@D@D@D@D@D@D@D@2'oЍ~8/wع0 {h&<_,Y*Zɕlݺ|pݮ]믿tUYv1r$'\;v́;/kѢ|;Tsſ/'SOYgTVZۜȰC8N^UhQ7?d~m'ѣ^~eߖO0ܹs(`k$e˖(fFo2N_vYFk @Q ֭Kz\R!|Qc=QF% ~|g&NL {w {ޑΐ@NO./ynsR@a%J <hMp n]f E ioe$t_ '1 8R6;m4L}VD@"KС@?  *W><)w^A=\نuqSO=57nhժUa1cL綛,еkWWO.䒤7YaHL0W / s=IL>0yenf򶀉ҬOZ-`Bã6͘1#`2WX68Պ7xT9aȐ!>}]j"_ns\NMmRCX˭3e`ѢEv&qiҤI,LΙ">7.Pl v3u̙T7?3i^^X}3yHmy= Ç\ LKbԀ)ȹϫ *L0b>/.qo/^<`Ĥ2[h _B.k)Ƌۻ 6tΝ;3۞?}>lR7e6<LC^L&9 ^NY8ƕ)S&P~}7^ل]s[zdW6ބU.0etw-q޽ٷU0`@RL*O޽&5`rROz&e{4N+79'Q9v̀'-8@bu94(;7ϜJpGWg\D@D@D@D@ry^f9&@D@D?௰>? |8ʗ/m-ڿ] $ȗ/_sر# 'xQ|9 ǹxx`vp't)43~̄}XRR5agGޥK??iGROO<^x kLdc,J(СCt󪫮to 7܀"E`ԨQUVNT#"eR|ګW/?o9"ϬVAn޼9˒Pˊs3XwҪ{qLk߾=֭[9s$r3RmDbSd9~jk+VCRzrSȋ/28yQD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@@l=UTX"p0kVҷh(Q"Zf%KqƠH7\@K• e0iLxW_ƂO!#""(x oP$L<tMW#@1p@'۝_Fvbt׬Y3bmŋwsmaڵxo߾NKzl˗/I6}7qzѯ_?P0a۶mx*O$<!hOZceIZf'G$gϞuTR>K{_6zO!5)0aB} dxxQ FryTl!}vLO>$Zh-en7ntw}CѨQFe{?]?oҤ yt1[񗙕o 6 FÆ qwwZ& XIR : qg-?O<Tf{~{ƍ d5QD@`ѢHQҥUuzn@AdŊ8aO5\D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rD9]E@,2*" 2tV3P^(]8d#SO۶'&yHz ~y1!$V/|<7jՎ7W}_23>c=z4Zl rWD K,qrCJ*. ի3π»ʕ+o߾NXhliΝ;SS@0*@vKqƏos7@bӦM,}] ˣ[oų>~8}1ky'~q7g[D@D .?,(/[{A*Ⱦ)同|D&D@D@D@D HgT HS!^0eJ6& l嗧։@0_~1bʗ/o_=N9mZ8ĦMƳ>=tb}sqFOt ![nl3QIVZe4h[D.Rs=h֬Y>ѶooG>}+ o޼VŘÇqw\)%W&7Q p̸kWJɂH!)C E" " " " " " " " " " " " " " " " " "5Af# dr5XD AH :_  x9 2&@8t`q$o8?m ŋ'<*+}z'Pp2Ю"g6mڄ{QwM{Y9hOsMCyPrxW:W&M⧡aj1f 0[n+83хa¬lru0j(|ǘ5kVn^{-N>]hgի접ʔ)W [lǸ9sDΝSlȈ&!)r oS|QG "uΈ2E@D@D@D@" QHBD@₀Dqq{o;SO??2Cu s: F`OHw{+z6m4F v\~۶? >pyojEUC.GB_c}ѱcG(Q"rD Mw=z5k޽{; 4rtG1bΝrʹ>ީS' wV@4v޼y7nƎe:i=дihvuZh) ߏ7|Ӊ3vH"@m>}PL]ԭ[7iD@D@DX 8S rHJ"ˑWX7D}OD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ^ HGV02L D 쀨:)sd#wU+ ))0}8#bEqd`vOJI[۶^R%戀d+Jf y&^z =[D ٳljF 5o_|/4Eʕ+ڥ M6aԨ0adL{\Jv$ZzJר(իAi̙37o^s9N{ܹsGQUD'aL4Ƅ .nʕ+K.NkU(RHؚEy/ďJ;ǖ%" " O*ȵkK~ޱ`u3a/[9D? " " " "$Q*\D@"F@"ȈU!<N %ڷb !fD@b|\8ѓ?!|f`(/6iTTY('}h{>ʫ@LXh& J(>}:݋SN97oMAJ/1sL|wXhrP(mo7u꜃+ ..N{W-!sٲ@Æ瘾 Rok`ɒ%&p䤜<6[lq:NQJ`u9s`٘5kv3nI_Z}82ڵII!QڊWkxWsϹv?C馛 F{=#஻2 |Z" "v:Z{=P'DVRD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@H@"," " " "h$L#$  HGW;JғsNqEaa誳j#"pM󤏔?ΛI/~`/K9@j}!`~7xEW{@2ޏ?)Sm߾I(Q jܿjժeR7blذIx7ɑK-PUV{s@&<1$)?;-"n-sYpٞ3΀ K7s+Vp~E9r't5jdbժUMX#cMTwOq5 `rʙȵɐ:֯?? 䰞$rz%J?˭[7NKwޙp2ֵk^sH/7|@x" " qGc^ "}ώ{+W3pw AˑT;D@D@D@D B$Xe+" 9L@"> Rԩ_xGsDX1 1p%g9T2i'%1R eJ`tsRqsғDRԋl.0ew )QmjTQuErv9Sc5~mf&❁{vk3^bRJ>@sv|1$ :1DX"" " " " " " " " " " " " " " " " I@"@2ޏ'"$L#޹и'y+`nAOұ#иpNW#>o~LE0>;Ye1D@D ' O<:а!@F9Y#-M<nj/ɘM ,/(%|!}BH?Em 汿LIl6߿ߍLِ4uX;v8#FnBMhˌ?r|oU,[I!y/eƟS^kՁ5Z5: .e֘o}Y?`ʕNsL3VP=O3-E˼OyvM*(}m%M49c/heN0D@D@D@"BsʰS "MLR99TD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D A H^P H*)'" E@":^9U[*ϼ8uW {]s " qBӓŏsx _?YhI  0bp}s7(1u\X5"Уf('佁LyFUӬ hQ />;tjɦh~"5& RzB h"Z*Im~9+<(E\5˔ קJ6Q8YԩSs"X\@<ަ)c7JkN),Ҝ " " " " " " " " " " " " " " " " " @@"c@"2*"H$L0z'z;& :t:w.&Z~[D : ٳŏ3g$ @G(:Z$6K})S<#%z< >|?޻'s`v)YبQxˉ܆nWIR׃6 )nϞ=I"6_R_1(?JZw '$I') O/s\1HqơO>_GV}} bs(_V?2i$5S☀yxqqT&I?AAD@9S+x&ФIVW"k@# D7k\z'R%ne)୷^x0b(-GK=C-kG7Rΰ|r :5fLꫯvbrʅˋod9$EPN9dժ}:rs{x(4OiR(SƓQ(!}sezOD@Ev'\쿌 l!~ワ}gO/{@t\f”e˼mj>ZZ1k" " " "($L#v$ 툧l#qhaJ.b$ " M`ժdI-@R@5b@ Jf8G_-[>'z*/ܓŸtRJΙ|׬񤋔ΜWj< }~_5z2ٻヒN:–̒6nd b͑&@܍mۢw&,  [Yѐ%!>罬2 5Ղ͛{ i(=;RHɜ/`cE ; <_[J^r ~ȓrקٯ|)#s@fɒey~}/VMyt@2ю+" " " Y$ diwAȁ c5 [03DԪ,l0)+!@ 91RvD9$Pe9R=*" D¶o&^x(S昲җD@oy|P ׾'ED5xQ &r:ē,wڅ  u]^{ EfI_u椐7Wـ˗{rH!vP*JE@RG2R"$"OLC. 0Rg.Qbd~Z86,^,(rBoOO)9+Uh[" " " " " " " " " " " " " " " " H@"h<*D `*" "FAfeEiȑ~׭^=*ꈀLӁI])LmpPeJ%!eiEG^ɔID@D@Dhkd)≬9>3GFkD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D }AF[D@D@D@D@D: D@D > Hu,`OI1xFkZ$@௿'NeժmxG(@<w|%Ыxxh AQ{Pԥ'?|D SW]yL("H>b~'ηpȐ!&3_6f7?~< c"o޼Ny;9d6T!*ر#YK"WbHJ")Z؄D)/cK渼o_J\?8n~%JxJ N>LHQ,S.3R٧3~_?esOD@D@D@=`)\z2LnZJ8Qy/rox?RD# MCH?qX<.vz2(36iߔ->0w\Vu]޽{ ػ<$E`.M'RCRYflAR*Er9̒R9} yLX"ESP`0/~N?h$쳾$2}Dcg" " "[;ʕrH_ɗe0}bH.oy4 s|rAFRD@D Hyk|p飏`"  +z QPEUAD ֬ďqfOTк5@#ĮY]E@bwɟ/o' lΝ=$܈&L^xFÖDAv~dk[nɑC B6̤c;о}{'l(, IDŽ ŐD.Z<*ԯ!8ȉk&K!}9]L?_G=p"̤ZȝH_fJydcg?͟x "p4s;Ǚ 짾FNk9\VjDFK!<< EF*@v2<1ASuE@D DA*Jvμ&L, t[0 J!!w`dUedcÆ# " "(½.`X{wॗrjO#S=1Y.D͞ tPEIff;;H"Hߔ# 0h Xef69qWp9RX)[,] P !)R7u&!)<- !)cG3~7i:ׅ*;R8iziB``2?]dsW؏vNIRf6ʪ EF"H^Ͼ " " "p(>8.[YbH (tVp21 i"  M@"=&Æ[ \}5еPp\5  7f𤏓&g|؟mV$Ww7?N8!1Y"%(1sO:Ю',H#@M7'(0"H+VK.1)ޟgo>GF@ I60`ƌcr|ѣB6n8k;އ_ɔs!y_DC&2&5bH9KQBKٗ[)E1=ρsA^ۂ#vg v(c ^Lq^w8*@484җH'x=%v:*#~? I/s;? ^vݛV+D@D@?RIQVzjSE@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@DnjN_ dbgRD H]ǜG?{]s+V6" ) Pj1w'~8>&TڴďL˔I=}D"np/8r2: wJeGxdžý9W1Hd$;xEaӇ qNn۶ vR%KԣIGoBϞ=Me-,!ѓD!)Lҏg͛"s8x02<_]p\bNIvN>9Yض- kED ~ucn)ʗxh.~گX21Xh JS7A@>>ʕͶ&GСC۷/}+;`Θ1FvUW[o5ia㨫k,UBRDV^kr玥$@ $ex;ޗ1g9^}@hɒ޼/r(]:en+[ۖ'OpZ!@d$2xU~^z/Q!3J)l) " " "Kxm CrG57_>vm {9TR@$6@2ݯ||!nЪp@׮@9W/,">k=/ܸ{Puk6mA[D@D <0л70pin/p }QSkD l   ,\T kL,Ym{S<,@P \?ē?Nm“?r~3?38 !JѫW/'SN8vuL!gR~z7D2VmUͣ;wlM.)X0Y "zw20%HWIoQV˩#/,U[ /z (x ," ")ɑĐڵa1PUYD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D dAJ;@b21Z-"$̞ċy}0ظ[5w̙yy3Yf@@2% 1cN:$kw믿BE,RScSO74)Typ .rԠM! /Đ_|}9$ZP;%OJ )\'K3}H!k%頃- " o?)Frq/nɌP1$+Te >ssF," "@-ŐHޗe^2Tɾ*$ |)" " " "P$,p: ҁ_{ Xh 3`O1O?~ 0s&m/JsgR%8 :u+͘+OKgHv6?F(i@rH>G!Yg O? {n'J59sDZ'& 2fE5j]OcÆ 8SpUWYjBX2(ԺHysਣN HW'G )4vvm^GݺH.s*[6jC2(Ȭ&;moJe+?/U*c,," "*~͗C~ ".(gN Y3u@2~ύR&" " " qA@"ȸ8 JDDCȑ@{I6;b'yoP:e iʕ}#叜(DP%*,?p/g։@`ۅxoǜ~:p~{?x=_Y*@F'23;d;{eh8Kk.mgFƍqWO>(]t${8vi99$|a%z2룏8QY|r]INl] \ ZO/`d^=~}_ " F "lh7sPR%9mYJP" "\v_A9d0}-*%%-ZKk@HlA&SE@D@D@D Hu  }t`p୷_ x`V "j~~Asf/cee:ΝfrT&@S}V"~x_z5Ц/mh;}O%K>xS"Ȝ_|;:u2)(\p;ߘBW^yEvꫯ61>]b9s+T5hK!Ysjv ::DF~(A;S8CRq$g"+nbH #ׯ+ ]OWf@:R$j." "XPN1$<_}/jҋ!)4\N,[+s/~hJpXjȎG^"(ܰ!wg֋@ؽ<=o޽a27C/?b9ǗQ>ۯ_<2i2RP4pQ~N!˖M+GC`XY^|9})FĶ~yRK9D"|q$-s]FqdѢ吼O̹3cHD:VT'})$%.ry;, B|>{S?A[," " " IA@"Ȥ8ʄC@"}db6_2l?@3Zv7})" >(tdpƎ=7nfŏ|N+T8H_ع/g-^SRPtis+_^ <,+&_5PCR頃Cu_! D@D f"p!C,j+ $!Ƨ|{ݡ'Т$0 )" " " "P$,:< gA,O&s˷pÆ nFƍfڼy6mڔ6ď9f3 X_ʲyZ-#v6/02ye6:e21 )s FRu8AHp,L˗w˜W GS'G2;eU7p3`6(}Թ?X8" Meꔠ A:%OeEW(x)ꕠ. Tdo<ȬɬaZbcc Xp `/7c:i+͚B۶}bh𛶁D Phʏa~zcLAn:wɷ?z> wII9b4hQoGG{/x'矏뮻ifOS{_O?%ϲ*lv?!@ X7 BE?/4+ׅu@lP"~}ȵkNrs֥A (2EVpQß- &r ")\v?(Wsbm܆3τeح z>ǓUFD@D@D@D@D@D@D@D@D@D@D@D@D@D@DV@r29Σr!"  Hyg`x/6kPQµFsr_nݺtz3!f B)*UTЊ˜( &J9PEqWլ2t932I(SʕMHQ%TjUtAn"h 0(x|)_AYsW?+W/-^D <̮N A@y9* 9bz%OyB2">X%rFr \--l&2eyk]^uJJ'_Bʈ)PVx$6;>e"\ލo"3)Dgä @Q?DBD(dN%#7nf͚͛.8ދ/Çcٲe޽;z_!aӧCΜɺ`}{C_I1 BHvQɦ@I7/ԭK!)0F`'"@v{;M * D\ϰbg8bȌȃ얅@>[?ߗC 2&M ";,g  G?_dǀL2z= \?HeAWE@D@D@D AI@2I[~` &_?D0ve[ O?1mlub#4CEAEQyy3#PUX6#\B@)礀3TIyƍM6rbȃml͚5Ln[z(IAD ul۶)A}ZNF)d]Qjz:ˬS]og{.\.?Na]'s# o4ZjNQFZ-SxD ѣ}5e+=|=܃W^y$E 2Y)qaÀAQA"ܝy1Ǜ{}嗮{/~m<&H!9眃?Co#Ϙ{yv|)$-[>k$-;y& D\XW֪K!585m ")RH=X !)ė{g-~(a36R2ʾy[ NDR{rlQآ/ Hr`F_AW|(3?I,_+VpUV!nݚvX ( @ H 'ʟ(xK!> |jF B'=)de luIׯNب+s9ȑ@00+79ݟgZ/"(+A}9EANrPUa$@q)zu tҨ]vZR^:uR…#cm .rA{/^~e,Y$O `z0SI('ni<}QҿD`޼yN{9k]{&Ͽ?%&>&|yOi۶@ǎ$1db_:Eo"@ wKH?jBR H")=(&}/[v" *?w!9,uEU-E@D oBJ!A$|a#^^y챰{)g?_}n|<sx>$jX2g@8' d %OD@rI Edrsn ࠑT h,QՔpZx ^$pԵe:S]MMF0QXFBHI ~z`UJB)o6:w8/{#R`eʋ"D ܹ!Kzs pѢE쏢˵l}%TH &~FYh}:eʕNBi&ǡx}4lz(5jƍ|)J; `p5@޾p+3[1clٲֺ̾ gGAn~AΟ?mڴW\z(/Q%̾ >GTǀPJɃ5V9SӦrHsj!;uŐGoR2 NCrn]'*Qh$ H{O#e˾H>78Q n'n9$D7qٚf " " $@9o $)< pK|್bŊĨEHO@"(Xb61+ ٳ /X;n?&u,(Q!a<ďtr[Y("w("Fe~k?ؠNB 9#u ){ȉ hxŊN0JQu ݾ}۽ZjV_4CSp~ᇛ B.'Q:ȁl[t \{-Э[[9'ʼx |ر@y/2g_6koǙg$ +ȑ#Aqr>}p 7A %3qRH!9/lΗBvH Im mL/$)佦'~.Y^E@D #ː@ Ce7{67bڵ.s% ;%UWﱰPmGR|F >G|27o-Zh**" " " " " " " " " " " " " "h$L3@p" "P@RM~=`.<$P p$AA-=~;wuQk.+V 7v$J(KTF'Q2 "v2%&$]Ew*IlvA~cU Wvu 9ިc#ڃ$SXxH|<1d‰"R-Z6BhѢmsGe˖hݺ`)9d] YhVaڵYg7fǾ bG"R/X{n ;J.d݋ݯ =5+k]J1cvSO= BVR Cuɒb}9NΝa" RPF"{{\e.1K2D֨VHD@HU{g9^Ou_.]Z0E@D@2#0t(p=+*to?0({.oaF@ xU`s< !)s N # dsXD@D@D@"" dD$ TAn"ÇLwm0L0*o5kfΜ> 08L2#460zÊW@~ؼy3ϟ&͛eߨTҶm[kL$3E`A0-?72YpPNkD XxSW|W`]m6m\ºrl!TcHH+puF~6|ԨQXre;k|/7\-N9 LH \b裏v"`]RQg/4!`g'ڵk.jD!*:[CrC_ I9df0y{H!` ~_rH{`ҧ$5Ckɲ'n!)S 6+" H/w8&w:Yۆo@~L=N=u*:uY71"1Ê@2O&" " " @@"x8 JD@ m%0<&`d賌ElT?eL6 ˗/G…Ѽyss1NѲeK4lh,Α{۷o^Ql:{lN뺓,(6.1d9kOP-ڵ 5kt3Zj%Jv\gVKzΜ9Z u Aǎ]º I#G_}50p`ބ> x Z*!2> XՁz6)g74%ޙaYOYuo*O> !?cdРA8Q/He6ɞ amz>bEX{CZ7%;OrOmʌrH6hh_A=E nbΝ>+ \T$;:u |?x6Ͻo uW7 Q&4mZW 'Է!z>O"D:[JDDgE@D@D@D HTS4*o瀻 eӲ w̙3{iNwG;ѱ֭[TR ?%Zr"vZ̚5ˉObѢEN پ}{tMzhN{ ,^8N1c?6n:tpJ۶mqA$%[/~ ")DmڴiZҮ];)R$)Lgp_|Od4d={1l:k^e>{ɓ'gϞظqS$.^x]t(B7C oaRzސѧO׏Ju6={`/X}15}j|)$"CR "5cٲ}vv8hŸ\Vq{/l߉H{\ gʞ)ܚ~vO##i_tM;jl9~3+Ve28f=JYtxt8*HA&YRE@D@D@D $!|ZD@@2 m[nV.vR|Qo޼|M'뢴M|qǡk׮hӦ +ϩP"6l/~!>#O]6N;4zꩠPBxJb@` Pu e@|>aҥKTqHA;wg}+_}kS4:OD2eRLfyv&8<Z`~a1fPȑ9M[L6[ʕM9=z1T@"O?÷~+xKx 7K.Aɒ%cS &,)upŐUm0+qU:a}` + rHt*N# Ku?DRVd t)fGn]_ !){*THج+" )B x>>idضmȹW6s&93" " " " " " " " " " " " " "$L3t@@0" "PIi^+t0gpY}0(n뭷0vX=Nr 'H%Ί&,\vcvgYЫW/}ɗaH$ &{S&MŒE@jowu|"uvJ(Z@(^<,6\x#P\9l0 >ɦ{rHc@0p5/(\S!= 'M6u/Pxeı@=y'<8p J 3 G]hS^|9{7W ٱct%ˑP[@زŗCR !)oT)D)d h˧R,"m󅐔Br E{\0O?7d{^2Hz> gYyz>TĆDᮣ@2aN*" H$ L t  l/O?qa?|Nbwq9d$T  n:L8щf̘:u_~ PU#Z *y%믿^ѣj*o)gqT赿J ?CWLf9眃K/ڝ L3y`&fE#9JZ;eJ# d: " " " "D$DAnu0j?0n޽I fAUNYxgT)G7KNrJPwףUk@IDATV\ID`ܹxᇝnݺN~ڻwoԨQ#Ojg޽xM ?p]DE2 \TLx/9|ڵu1<~lK/-z~N9%k&Mm{Gr02Nz>}\Y6e˖Ϳ%p̛6mr2HJ!=蠃8WJzXS!/tW Ii]:!gt^9_ 쿿/"VΛ7((u(" Kީ䐔BN槣bE_!9ĶLM&"<|}:N̜9=zW_Ν;ﻡֈDիO`(U K.E1R="q(j(_~07v ԩ})T&ONo%̿qF4n't+HmO㡇{_o5kL)Q#O{ֵڵ0*б#SFQ;"#y_~ ̛Ͽ ؼsP9dfGaRE@ w s./\l'V-_IY'ԯx %)O@SaE@D@D@D@D@D@D@D@D@D@D@D@D@D BAFL@2θ+"*M<WnJNꫯ[n`QdˈR, L{YO1cLZÇG&M8GJzXhZL6 }u"z*[bB򬧞zɳ(8sύIZ ]wv-=c&Qp(8?7>|Qst0OB Pĉqg;u/HHwڏСCMVd:ŋ}1#M@{]UÁ!/O/k௿6erH")T"rދ&$r|/rس._!)(2C+J@S+D@l(-" " " " " " " " " " " " " "/B_~ m }6Юl&1c}Νqeiʕ$LH1=36@u)ʕ+-Z\&P| @*Y^y-2ΞҘl(fm6~ ؽx~}ׁ'&6H|?3y\(8+VmwG×@2ʷ).V$pgG߿{CA;UX1jY(9:u*6l>}f"Ii? \u%γg^ k]T拠wlɿ(fHVF7hwL L'@~{Ap[W\hgOQD@bAR:66p+s[{{W p!3>㣏C,үc<=/x:dE@dz"" " " " " " " " " " " " " "$TXbj!{Ad/ԨQ,;ɺѸub#/ OdR7P}~g<8稣$+XZ7X6Cvy ZV(xk֬q$.ς:BB BN2e N9gt(|<l*GwMa a2d`? V"ȿd{YfI.MKV^TH&ιeJ|<;xv{bS{kE:xL=yWD@D@D@D@D@D@D@D@D@D@D@D@D@'`" " " " " " " " A`.h#W$b뮻@rɓ'ZjH={lb&1MD({ǬG.oɮl, SNub}6Hʱz/2X9D~; ЦM̜93E +6y6l]vbGrYfzB")g%KObŊyJK)=tD`{Ȑ!w3-(1 l뱮cۏ-&`G_uaKgOA}kG׮]ʕ+ll;6lp,f(ovUYg]5*zBv\F͛cΜ96mZKCiط67}r9֡VZ;l}d]tG`N߬[]\~N$l8;6f[p!^}U,XIq>lχ/3m۶Xs1N7E;vݻU6pvJa`_`hP&{ X,uܴw}@c5[M <(6_V|êET |/_KV'1rSOaJ{$ℏ?^rgN8/"N P&x^ʥIє;y0¼7y|<*" - VϣC&q'eC|X2x," " " " " " " " " " " " " "/wP=siS;`"8ا+){񠍶}q饗6%X58K.DFYAE#PJqWD#O#9-Zm[(mƩ/FnW_['k&Q^fbK>4mXvi9Ka݀Lcv0];qF{OJqAn| >UzuIr%Lظdw}+Yf餎YqlO<&P{fsѠguMz!yYS,XG)_(}N|mڵ+gGy$Y]ig|C)rK|l!^M4qeElgesUIR8<`g~:&tB=@@Om$}u]Pff v 7dn381!z,_$wD=?0g9s>#h {ǂ'Vu?_ wհ>S5QN07t(?TZ 蝏H[nvtwsU|%Sz>3㋀^S " " " " " " " ";+V$I'%w ,4~!N>:ukt?(p뭷bԩcVĚ5k[of~m:?pO>˖-C֭]y:a&o~>|mҥ ӕk2aʼnA|n&'nb1k,)Rե<~J$l[pL2%:F̿d?M4w$t.Ґ]¸XXdȺ:2Z_~իSh`^z)rjg2? X' KW[q /h纸 >weu'3k_{B1cwرcAY`З̬.`! ?f9ӜoupdYfxG]kAs4h:؍֗_3d"A.;Ok:LLJvX$}2C [PN6c*~rI`g4 {iw(2}X h" <$ñ|\||_2}UP!|>uٍqt2$`|гqRH&بwUH*;!1ӤIW)yÆy1KJ<ܸym|{;wzW^ygR/ȧH`$e]1^txLXcԬYm d_3K`<" &tq<$] l{x&F-@"^&)+_a^.]\n¼8: Zgb%M~nӦ++MX.2qD83 +y'fnyfD4Xz&LDHp&K.=ժUse=&6mvéSO<{3g0w< +k%ZuI/=-㚐2Ch]OﴰзgmϮK>bt7+瞴M, uUEG 5U++0E65q\2rYbcm~ ӶOvɟ{.6zV}ŤIxN:&PNC]O>`>5֑OLPL}knz94}=Rz}L oG?qdcDc*VI_+5?%^\ ƍmLt1QbcfXߵ oLya׾=]2^DJlQ<}*Yl[zbG! B :t($EQ!Vy{/َ۷^^7r͝Y>3BI)JYMvKқ1x[I )ύ%Y݋YAVeC82Rx𛰗'x z>ogDH%o AFbx! d CD@K V"Hd=s6*B =ayr&J BEb'xbZ۶mQX:ŋw"~ɻ68'TtT,2+Wvs8lNA\[!cQNVlYs vq2H"Aįe˖nFځlMD, @ Ԃ@a) 7u?n'|A7 sg2eۆ26 >skp)mHd%6OJ ^.rbŊNtͰQC qI N"eiӲINՖ-[ ʵY]]Fa`(dܣhSm(>Y)HD)géSF(YO۱cwG4FRnS@yth8cy:k%u [Gux8Erm;6d11?; (9wʥ`}ʪ XMnbpk,4\{Y2AJS%<Y#ARٗBN}@H2qb;uֹmgTAAhݺ+dvuAN ֜bɔ:&}]Ye+?m֏zcy/| ,H8Љ.k:)2炎fkrMݻϳ[[EfldWWD鐊&{]ϻ;8-iաՁm<-ˡ+"(,<{g瑔Ә1'jpF}2ƨz>:gC|<%wǗ[x;#J@*(dD@D@D@D@D@D@D@D _ ~;Ь//TUY&ԩX$ꫯ)U[61 L 4h: &ܾ&G?O=$!i(Q-7j(m]ƍard0m]v l&N\^z0LjvXߦMЩSqfvyL"qH =駟OF5\.\>܅MP!֬YcC=?&ۃf%t``bg$$d{*,LbʏUyHjwݵ 8V>ǚh0хIa,e:u¹;Ke77[kdEaKPpa3}XξnKֱgm'4dUx|뭷h\EǾ-C;31/Ϭ>BM6s2yꩧ$xױd sαz* &رca`5As6O~mRਣ^A2 /#߱ENvuE,ҧcƞkݻw |qn?e p@Zowا_)H^  ̛g]euvm\| }f\-$4O$9݋Yx_k!!$ `/P8K#" " " " " " " " " " " " " IKUZAD@D@D@D@D@D@D@Y5i+()F/㨲8 sϙx*FI'O1uu9"ŸEyV0zhk}Dn9/tE+VpL)'*kѢEn >d頔pEg1_>^H*8h4VId 9 dN^m4-|gnj "K9,7Lg .W)oߞ!u Cʕ݀c=։~C%YEZgMK.E2e-^3n9X,CYh<, ͏:#?Jv>Z<ev-^}-b,xb;9Vq@׮u2{J̿cW̼.3J%ylSgBˏz+yLp<4L?h֮]%vޱOY eqv}캥NpN+SϻdQLaXv! eonc<裠:HGeȔ_RɸX hU*T֧^9ΗPKAi^>I皢T > H\a E+"7bJ<&c{'"+Yg/I\G|akr4q`qSGH=l/XS뿠Jlo V}J ,^pP4 yV|<="# =#%||2>8_qID(" " " " " " " " " " " " " )I@"Ȕ<ʴ?xଳ`@#`%'d's8cаaCvrg͚ _8=hܣ<@7e͚5OWSJ'v$k%Vϖ-[lS <kf(g!~!zmBgY#}E.bDp~+(VZqU:e޼yعsgۄ2:qE!u Tg9sB ZV^ۛi^4imB FL@]w ,X@N6={v^clmֈ agܸ?(LPA؟Ҽ!a ;#A`*+Hh(y9{lC=fwӧ(`FbKڜ YH_6;wޙ6Y}f͚x&CqI'g (H"۲.z=3]W^WVƍ~Vmx?2S'vܘ1& tv)o՗ SRz>&C{'VtܽJ:tn4 JYRH>gMԮ `0uF%뾸ձΗ'{i Qc?Y4>3 h@BxVd[{$ =[sds9Kû( x+=/`:d d (" " " " " " "71& ̗D0[̉7C9>,y睸H4% _=*WcǺQlofiӦ9Ef֭͜[ݾD3ԫWKkv|iQ3PNh޼죏>J9%$I}mCNxɆqaw6m V}NGUEҒQt,Q>2ҠW_l8SAE36%\y_]ߺcJBIfk׮(_h)8((a &0#Ef:.T|9롇M9:%>w;ᨣreV@zݵ V_sήŬ)*&d0o"ÝǏ[8LhI -3BwrxBW2:, . 2,e;uBt&.BJ]3+O6:75vO4V]V-3 sRN; ]v;fI1U]tSxw;c θMVy&L>1"O[xvS=|p*>… Hm) 5yVK}*$ޒh.>_拝kk/K8\X}Kb R흂`c䞀Nyx۔~`k`X ڶlH|q5={!n1vsomV32`_g]/I)H}fĄ?Z'!DsqG ܲ.7m)OL#_{lY]px֑D@D@D@D@D@D@D@D@D@D@D@D@D@D 3= 3"Z'" " " " " " "k?n t?#D0؊b: C.Oi{\o6.\dɒ{Xz5q(0C ܍B9-@;v[nE, 9ۼ@qFgDv{ġ̆>%(@<k&ѬdVя=;$^6iʕKKFvuJZ,7p뭷⫯.ꔍ;'Nqz W\q;<'gb:©X0\|N`4dr8"-g#S( GPʔ eSؖ+W PYbEWr]v OH<>(O>q/m@&d0ق5`.]eˀn̯ⲬիGxLRٕU ͚|YsՉ(*^*C=~{ /~%SN9uuq,YժUs},֕ >^;{Syu(%N-|{9FNt,3A7 扷$п?fa9})|ρi_d=ݽHK#p˺H0p vӜ+w/‰/̠3xVN<Y+" " " " " " " " " " " " " Q ={z'!0aq8]AD@D Ln!D-O[xuy^žw챞xqԢNNnxFi>/_3wUWyݺuZoϞ=.]su왼3WB i~뭷*UxEl 7oܹӳ)X5kLNӶ1ygjb2ij᯿==az3f̈U2t\ȖM^Vy2Dѳj .޽7k,p9,YΛ`ĕ[#FpYư\3++ 0]X-[3nfϞـe/UgJuzqիgIW4ܖ9)<5ƍ{&bt{AN"SLs9۷gR-` ݵ:L:<<?/25iǍ~Lۂ gշ{<];4ɖC??l߱ݛU0y+ f4ʪ&y yK5o_Wޛ(3-2 ʯ)rk'x9щ#c#Ժuk uk׮[5ҙgo7I'2 Knn3p"裏vҗ.|`"gVmsLleOvu![oqi +5y\yV=ZZyr͚W4g6z>z>yחb*iioxʉ@aZ脳0!:)x5c'@D@Dx m6oxb`D9 `:uSO=jժ_Ą0L&{ BҎoRBp˥sȐ!0Lnn{n7 /:6ͅ-[`ŊWLM$a0 LQ\9cd&tʗ/.n@؛3PmΤ)&VK]~|uxb0m&\slㄓWnHmk$'SNrb~hذa"%_iM16( &:w3LX رcL&Ӓnr/H￷6~<7UXf LJ ,z1RΆS0 ܎Rڵ]IW^11,X8.qewp)ll^CǎŲ `gn16Ld1Сa@ժrϞrW_E޽]-.DXqnF.xQXٝ ]aBHr).vo,SMwtLiU=EV}y[ء=[>Vvw9&c &̴2*L~azժU`mbŊ} +=\s 0nLJ FTl,qO]bʱn}\Z1KPJx F=܃7|3)s񖞌y{Wn瞻X c@Q7g>(6 (J$GQQITQ3Q #&9@ƃT$Q HD@aXveÄٙgkoFY]lIMEr飧~Zg} f{t,k)S )BΞz)YUƍꫯA)-Ko%Nʅ"Jw)]\KHY-[nA8__p99R\]rL%hРAflߛD" !'>|puQSNUFr( ,K}^z>.Hx$],lB!-i {9뮱' cBXZ8Q4Nf4P.?|@(qk[@߮]d9UZU 6UO?.LTI.N:lȑj֬Yb)]t[9f9O>d*U*g=XuE'tǕ.CU޼Y)cepY"E%^{+?3cwUƌ5mT˗yat X5s~ҪUҗ_PH/WOԦo3… >(p=gL䄀"vg{-[)S|0CsnTt R> IXN93oul-%W\9KU`A҂С~"u3}(gJUu͙u 6Lv!|4wg}oh-5ʓ DaRSǓS1@@@@@@@ zrvSfǍ&Ƅ  6َ21>\ hbA7骫_%7V)۷o׫Yx_. :dI-905*?,ףn4{2er4%Y'`a:ԍlѢ %ޑ5#=ǏW߾}5qDqպuy$B?ST@IDAT?V7wP /^sE+2J[PA>ҬY;]E7n\Y(S&LS_3]رC ;wn c?vpJG`c iss9 lN_?矻< %vm&V@ ospH940#2z֟a:6qWduX?DS[OrA8mZ>s.p6ܵ,;/ oo1 Bxx) @@@@@@@l 2y@@ V-G@`Af NbEץMSM]|zJ3fP6mԣG`UlLlٺul=?@ zw[oi:׍[tql(8) ߿>UREݻ_.rAGL6%IYa > ڔ1cƸAn˗/JjaYv+O`"! Bݳy Xetuԩf YK ,_] |.k&jUV;3iefE)_җ_ѣ?,PB!m>T)ںc9Fv.ٸqp:a\'r$yZM'-գ{Z~  %辳ҧJ.ח+ۅ?^X78cǎÆ SݺuMy1@ }&~(3S\[ 3 N;4(P 3ߊu!V >t:܈ʕ+}AjٲeT0qlа:o;6͛Eڔ3ԲM ?T1ňAѳ{=]zZpS X߾}5h իWO=ڷoP\dIph7*/;ݻi|(Qw*plNj0{BRR)W^yE_|qjq/qğ8v&t;^YOJ_W o߮JkMv9D +}<+uYw< x\}$>J6mRF\Hila^Ʉ@" XH nKR/] RWIg}:u$ ɝ;w"P@ w\x ʟocR8zwB &m\dT:r)gO zo)ӦMS"EGkS:tbŊM@|-UOL⦒ PB}P{nT:HdtmԧzJ} -J(]4 |;5v RÆ [.l]/b<@ X࿅qceK iŋgooyKdBg ,͟/\!-f̯>S+MJƴ xڜX*1}<1;F@@@@@@ 213D@2,@dx! )A!=0t1Q](ۃ/ 9rfϞ A'褓NrM[ZĄ@< ,_\&M5n87zdO<1hjfxĤN*`%>q"kau8[z>AvkaG!76>ύ$f vVZjժUЮ4oܽ{S&PµL<  ܺuԩ)m۶ UQo%==;㩖Q=}6#1j$2ƍUwuWtҤ(0f̘ T׮]裏Nq.M!8|[[.o.#Z -6mBɳT^d'L .w קg gwSpHw-զ{^z̄)^5hҲeR>s̫~K.qUh[9kB >4^W>W        *O" gO g͒z\6Ty㍙:9SUnT;6[`ɣM6uAUzut&bH`˖-1c~Y8ɓ>պuk5k,DQ8 iBk!ajN_% y-XQ33@g3kSm`YB{fw`@ ʙBdP`.sw̙3rU?Ybmw^-Ϻrg]nJKo!ٹڣ\۱x$#AfD-k_sw%;bGO> <񫮺J}Im{+?pc4ܡN#Fȅ 9 l^];s >SuY^ڲO9 tݛA]h]]ffh)]c鉇NH0]_}(~۷\ztyRf\+:"ACQG`T7}<e;X~?XA^      ĶA(=  Af91o@dG7ߔlp"SFN4 4٠O *V5jc=6Ț5k*o޼S9J6lrl۩.`Μ9vLK͛EAa,qqʭY]nhAad1G)}Gv_.ÂXMeKY*imGm:b im0! vs֦X)ӦM5~4l0̶6ږ2eDC ?$=4pjB-Yq ̝+u"X<3 ߌUgAF7Zr*Ug}6L Y0*X<ᅠ]:C+_5Զm[==D_IGK iv^Br>Yh}@ !Ahr}-rސ  LnlX*$OFyGry*P\v};t.(έ{(ɫPdzUgg)/+G@@@@@@bR Șl@> ϚwBS ={.X.4Axβ^/j֬YAxyY Fpjժ:u^e]ʕ+ p,g9={_UwV%. G3Ʉ@v L]Y…{}IlJU |GۀxlBlmwnTv۔zA^֦-s]R޶m۔}Qڔ;.hS֭||᳸>dرr|>{wP,~sVe.L_/+ Xq ׇJ;gf+]`7?>֧lѣ>}ݺkc+Zw}&MDk5(C,rH>RVR~NZH袋rGt]IPHw!3:jo(C"]sziN-&HH X]uK[\HֻduKV~YgelE ll$ibb!@@@@@@@'@$@@TL'@ԵkXۅHo1[- ~3f!da+VD tjժFnX`FJ*jT;=\*ҥK]`?l*K,='Osf\W^ bŊy+E .0{kcm7l0*U|-!as r }\о]):sNΝ[lSv|qAeD`žhѢ]lSsfO6s6n< LH˥W_ڵk'iE.XظQS4H6ܟ7oՂ&@dj:9 [[2j(~9W,րTlY=֭z?X/>`䔀]B!mK.^`q:PȖ-}PdZg}3 „'c.!-B"7mk$[(oǍ)MOo÷An֖D+ ܔ?~g_96%lO쾅G.]:>03a$#oLYoi6na|XP%aR˥a,Y A@"(!]~︘b\e% 0~]0OV W.Ν}sPOVb_`)x?Էo_w]V-\RW\qYozQѤI}0N=Շ>o/qDEڵk>/e#A ;udn i}-ͮda8nݧg#Ô˒NRa؀3.]v֭{_L=nZj=m&Z` 2lvlchːsR% H۷Z_خ{-XnGiS~6lٲgiLQ)`Ǘ>me˖iSma  A#{J}o7cԉ'J={JgA{^ r\pApb?` +ݻ Pƍkjڴi|TZ !`#F`H ~ڲEj. !cyO D ;wJӧK|!'LAC!]nZ&O~Is_$ #@ EևtRfi/.U /T-dKτ@< x~K^7oB!)?{Jf%K#튵)I-`)c;]ĺukO}6ڑvߥH `ϤmJŊpynp_}opJ\-)>L_.l"oHS|ԒZD ]Gׯ_t~B~㒵:u꤇zH5k<Q>!ݵ]\?ԶԱtر})"eB EOf[ץtkduq@ֿ4x Ҵi>(!w;MO:UgqF/;lذw[ǣ{xtoJ       A)     /@wޑ4G$gR \r>!QeepȰJŊ »,ŋ oE "Eo!  f_@pQyˍ)e˖`޴i6n̑ׯ_6sx,1m]I' w ҒYZٲe. 2S&S>8w 80nG)lh6'צXaئDF4h'vkIk_kS}lSl]sW۶mۧM%6%lO6lS6lO֞K:Ycئ$ z Pa xN Xȇ{'Hn];ء7o-wKJZEwy)]9Y}꥗^ .|`S >\wq;~{AhuՔ!Wε-}5a\4uj-}t{n sZ~'j.؝I' +!27$C B~\oɩ.ѥI~C q9@`H~O !      $A "  p0AErV <\/A9mx,+ ZvmFeA!U}{$رcFde0032Gnԯe!\y||G݂'sxIr_A}TG GI3}[bHؖD/aa؞ح֦$ܶOrd[٦X~D޷ɤv#lcRzڽȶ$l[1 >Pw^"hm'mO̰-l_G{SX> pRqc}HkҙL[<6m>pB$tuo5T^nݺEwa)]kK{WxݻwpޝBbDkhi.i;j{d.)vq( `mz9E}7Kիcڵ+wwԹsHU}<O"      $A (  1 3ƫ@kK7ߔڶݷDA_/`W6vAaEζ\f٭4[)Nv X'[\Wp/f C6oAbRt..u0!+`4k4{}ۅ }ˠSjR~?|1rzRK٦Xٖ _kG)Bkc1 Nkb˥ԦX0e.\>m Wh[\ԽōRX,=trZ;~( M2wyZr&N Tk'x̂!{s%UM` 2E6L>\1CB: پtQ DA^w~+` $ -]CZ(CZ ~J[oIO=-),H6=o&"\p }w$!@ diKtYWi-dz@@@@@@@F ȸٔT@ ƕ"Y%ƭ뮻':u^yE:ߍ Mx Xh}yKe觟|?y[IU:u$-zu0r @w>,Y3#رEI.\KMc-Ӂp&H\ :Tz @|iSOB,ot3~~ x 8xUW/ɝ23!       @@' ikRw ߺBߤgzHAl3$Pn]vYJK8-̙m;׫'ժ%..HUK~(M rtHmHyuM,rR~ҹJ6xX >X V0{^_F n# 8aJ%K ܥA&zբEDE,4n0i}ϥJ@( Dߦé]v8q-ZE 9 iE n6o;7P@@@@@@@N Ȩ$@@@ XLҭJw%'U׳$M` Aibo|RBF X1ys; O_f̐6n~Iz]zTLlՙ"Y)l4`tI?ڱ|4H:,@,&?ח֮L:JGY@ 5ݻkݺu2dHj\ 4jȅݏqY#`:uku!C UK8G`7ߔJOVMYE;v$(F 敚5[;C~ԵuD*[VrM^Xx$Ŀ;$ۀ;Ku@Ȱb 0aB v…"T@@@@@@@( 2J7 B@@@@ÇKn\~En@ԧ'ρ^ ,̉ XزE[g>/~XZF: Bo㥧z!VDzeGF`b[i?H飏ի}J eغUN$? 8O;4[=c "Ю];?ÅVZU6Y ,P[<~ԡ4tgFt&%Ǥ@R҃J&Ek5yty_GRhH&m\gPX l_VP֥Ŏw?&䮌ҦM{iZ/ !@ ةo"_NJ       @ [r#  $\ԱtrѥM#-+VHy  {4oWKIŊI͚ɅG'Ғ%>ah_??裥\2 S~χ>.J_|p]pj͟,W_ >xRKD5jV\P#;wn]veZ`_ժUsWs)@ XYVOHvd/ Z%]rT|q|W!@2EHO?3ZdRw-+mۖ̊xb^V-aCN>fδ~nu]}R6o&       Y)@dVn@@@2Y`,qcwwޑ9$߄!~y}`B j֯,VZP A]'͙p%/J:I*Dm( 57-HXkB3ƇܼtRQSl |챒N.~DL8묳\!zϒ]^۹yZp=\wuիaÆ% D TtW{C+V}TY￑>Ă;Zrwڵ}@)SOyDGi׮XeD 4lc~"r tÒ VWC 6m7Ѹ](       @0t=~%5A@@s_?{͜)uzDA+E(8 և,)m+ (.-Y?H6H'JO>)]p[@ m6OK.'$!u,}t\͛uT X(]qH&H+o}"P`A7|3QL= Pڝt pWs\~MjwK>5mڴ4EH,ť.]EQ_hð IJċ]D΅^yE.,YZğ+)#=tqaI#Rs[KSH|okԐn+4j(9RBW bTȋSl@@@@@@@b@ H@@@ l ^q㤊ۄ#˗KG!Eo02 KӥSO>XZ~=n4n,˷z @ u ڵ}P,^,~7OzI)Wų#` JKGK>J8[5P;U7=cǁ/УG͝;u7mtod̘VZj\cMR6oKeT(l6r?;[Y8:T<_%5j(5j  >܅ϙBQ'w?u뭷nS"EhذArW ")]&HUX1qޓ SƏ,ڭo܂/HryZ>U$D:مn[7Ns;0L,{TdNukW!~%KJ>+M/dնmiծ=V[Uvk@شI[>J       @ 0"!ַ G@@;eˤ /Nz)㮊TX\:∘+6Ea cm ]k\VC1P mFIsJ7ߜ[Ba%r< XMϞҎ){>{%]~v;wTܹ[+9}(Pz/ !{. jӦ H ǃ$[@ù^vWRE__Gv" QgGdI/HKH/ -/f_?|פ~SUBͳ `߯zqC|Zwlզ^čMAƤ"       Q)@dTn    h.W@ Ƃa"?&E V"2Nl&NKMJCI|{IݺIKF(% ;wJ~+{>{wi"?A˗Ko)7\*^<kAA˥u|I:wlMKMࡁߖ/Ѯ]/e!PXh҇j׮=)=M5jСCW_i;WZ^:bnݺU\p9 4مx(Q ,=?eKw㏗֬FNQ#)W$+Or[K&{T4}JRD U'fAL%P`A>Dv+ n\֭[kԩzW][VGyTSO;v sivL @|R6ҀoI3fH\#مs;Wo;7`BC2;߿i(K_v!>}|]gJ@ o%֯r'j˖4gzD&J͛"Eh @@@@@@@ȵMU.]>0z@@rZB8/sF? ].O@^|V)Gn3[ { λ ݼɓ-cJ`i@7|@>(kWZ ER`:믥 AZIg2! ][Iy[ox@LdD %;ȩpa鯿#~XYgbq,د 3!ͮyǃKz՝8ZJUTq8[YC=;#kgQ0eˤC}ȷCԼt~>@ ֮g0fx38$S}pl:Vk@ L"]tZ]=GMӧ~vn(9q(`K}&}vV*!        @@@0rA?@ L8l*A X!)CA2͓N:Hwoco>}D,ض͇8yԤtayI?/\a.0lJ@f٦ڵ7;ڀk!29KA& ̗Lcv/yK sNW%67I\_a۷o_/jݺ HM6յ^\Ov;݁ÇE4 XMϞȑҚ5>R%Gե5o&MX b_dIlҢE~_u [W:⋥wޑ/:SbY㥙3Kꪫ֭C3r(;q'iR"qW5*       @$?R!jGA@@@?K-W_}Wzu?-jJ ,W.>B-2_|>[][0ܦ@IDATAn@Kr!~w H;ᇥSOJN9E#Q#b!.CRV1!p=&Y4/\K;wp@N;M*^|YޛD2E>͛+|Ʉ@piToNi?wm; J2]$'UhQs}۪URҧJ-ZHeJ]&6oNZ.gyN#2!@T"]}SXڟ]rs>uH"-m=e$$@B /רQoիLJs|gt AFvt       -;O@@@-HְapvEU~J@" ,_.\&;W: IiziH駟bCC @  ~<iL%K _- )0ctr!)2,(HȨ@޼rRdn`xuȓ'>cP\Bs, ̞R.$РA޽[YKn ;j=c مsr/qa.reVlX,y@ˤ ^@ [J]v^w}ҤIi[HN X ] "ܷ^c9(P%g Hx ٚ\t0MJIgb!m}S^g@ ,|-^zI*]MwݥwM{0l6i3uĊ[kΝj#VO9K0R       Q"@dl   66Ӥ^|?f'@dmӌB|ԑxVj2ku @bXYҀ9HJI J=R|.Z%}@ozİ!pΝɗǂlʛW:gc@FZ,& cCy. ʕkO C l߾]p}>WɭB"W\.Dp6oޜ"<)20/[ cun_$2}n?6/pd@ 8BC4H>S} D^q__K$@JӨQҚK.:u+y"Tڸ_7ѧN\ '%y+@@@@@@@ 269F@@N}ͯJ'KW_{!@f,_. P8P:D?<[ @Jr!YҙgJ&ի'sG1CZZ?jNim<@ C}@\zKIuIGb-`#}HcE&vg).A{(AgyFK.u.uAΞ=[vuyFP!3^B1vA.]/Z,4򢋤GbP}=B$X bK5zƎ֮N>Jڶ|_"ÆIawD2!@.d.\[R}tf&vM[.o"       0v)jkզ?  }5eQcP@ ~sR[oIWfr|w"Y_hضM*X>(ovLܵt-ңJ6 X6Fmܸ1lٲϼuVms;۷w%YLZnm̹sNmU@%-vƅ\ G\؍<,R-߹9zt\, N0A>ZA(ܲT>LQ,`paHL}-gsZ r\BcO$E>O Ac[ߗgs}?P۴V\Kk֬ n~gŊ5bCU 5iŞv>߇΃R.0kKV .-e`ܾҌWdn!8?>'g-7My…5sLM:UӧOV/k56^{0`@)| E@ CI_\O+J(}ۄEoI+K/|tReܹu*UZrf k %%׹ 6g(K[6X:B񤃱1{ۑ#cJ`q@n/6YdVX1\x[V%à%KH=b_z!+VHef6v;iGY$ իgl*O;}iYX# Ii?>¾?MnG$O6aMC9ęLNwm:YVm] '>nP>B!$8ϯZ*l駟40v q8w&XH6vܸո]'>H~FYR%w~R}^cW^p߾cL'k=k7"mcۯ3mپaM֞>!g̘~AK64?}jРAmp> | 79UG;q_T' YSS;E3$;/Gp>b½]gjw,<;uvH2Yaa?Ax!qCdݷ}KX܁&; +Z 1_Wg`VO;o?T!Bxٷ}l} LY'pUckmtR\+Y3 K^}!!       @L3 " )@dbnwj6MYn@բEו$2+uYw< |Ԭ~pf<ՍX`&?wnsE_|ف_CV\˗kKСի`7m#'4$20lms޷@*6 ;'Ayfmr_0.o#Aa ^dPBlm?|\r.0XVnK}|gnw24-^,Mg 3=[nTƾbP`! )#,,* D'v"v?/9?ح(Fdpކ0+_SQMVUMU?}ʌO$ra0L2#l`͒)>,4dʔ)0aB0O>=.Z]ST'`uPH;n-Ƭlv[@vw"jKG[vԭہ_"H@Ow`O@V7^gַr=]wId縩عleI';Ϗ3~c~d_A> 7}C!ǒN~9YҾ>;_8 X~wޑB^ ~W_> D1!       @5@ fSR7ߔVj\4Hr Q;E'pW ԎQ,Ri0;`F2!F ?d-]}{i[ȣ;À1 ۭ ے%Kr~v`0[^xkm`x8@mmaoGuTc;*TWX1x:sr;VJ1ieqcu_2 :uGW5pd :?D g7q"hI##,!?- B" v }O"ea?-,S #Fᅲڶ<4izsN.gtΜ99s 6'j֬YApt͚5uꩧ3 c%8> lN 4G $@DX:#O=%vO{ܓe粜dvtme]D UK(g٧޷~e˖h}U)}v'}vk}~}E/;ֳ>o1iAdX?FŰO1>NL  ?^]r`Axi)0!       @ E@ eKRJ W^n]z!oEDd4oM='ܠh*eZ>LzͳdaN^v5C.\ /֯cǎ6݁ /mpopEP7n  %-278㉼;W6܅6B5n@ /fև       A   , "{\;O7Oz-S=OE zP(.i(*Er __nP4tԾ}{@7x#ߛ7>d.Dȶ`6tmq-FfL/`6"g @m),zQj֬bŊp_Y[.@ rea%j }l{(v l~عsgŋ#l01)y"V^+@P9 n"nτ>"m_a Jr ~˝Ϛ5+h;w;kaα9}>Oa#윫kWsm.PlYSׯtA^l]9P!~.78\jӱ@oyg[dEInYz)~@bkɕ[nqmp:XGS˖?_P1Z?Qҥy-ţ]4ߧ o.X`6ɓ'|XAدh}\'%dYd:A&69#`wlƌy@@@@@@@D 22uD@B ȃ _-TgrSe cg[QҜ2.iԨ-=&{\`JL&z嗳 [ [ f_gaPg֜9sqƠ,\1yIQ]$AA( A%*b0kD5 ׫ *E"Hf:2;ӳ;{Lު뛭ӵjپA"TuP(ve(|rP,|ŋG"ѠA#L7Fɒ%#>>pE"xٿ!ssQ}O`}7nhϦp#aT#?D F͕+V%~=?O4lM4 [ȢEW^ЪU٧㭷޲/^{XoݻweRwfnx~| 4W8+OK@TnG|H&~rev۷c۶&޳i~  8A#W*C1> "~k+!cd0 *c0Xc>&͒ ˡ}{Y3`8:YUof12AD@D@D@D@D@D@D@D@D@D@D@D@D@D@Ҕ ӴaU- AƋH7O? u!#$!H_5M!Ν^{-FCS{CEviVd^H-*,(2(}7o`YZT)\ իWKNQ=Wغu]b)@"m6˥ZjVN)b87s019{|~яͭGP"JW޽{QP!'8Uzp¢w_{a@*| B|wGI"@@Pڵkm̀q ?l\1 6!'7`qϞ=(XM61E (|8Nvg#GŒ" 7|Lađ SY@:d:$";vW^ |cw$ԝ+!ԱW"ШpY#nY}={/̢IlCl|Q,Gɟvٲe5kfϞ˗/Y*U_qhd>)W_=.\hG(Bm,_6#9,>*&s鴴>x?O̙3 8PhD#֭$ }v#'(TYRotim"i>PV-hεN:ږ| t^ h>`|pbܲe P13c J" ,]4[d̀&eo~\r^0;f c>]'D pΝر.ddHL6V E@'`w k\)!H*y4FZ(I`>Z5?sfpg?Qjfb)9ftC07C3fůe\|$k:O!2^ΝkJ*mۚk=( t$d-C@󁜷%9bl>c޽\G1H}>0H'r$2?z_I-2i~~cMIq)^3`@\T&" @@bȑ!" " " " " " " " " " " " " " "(LY+" " " iB@BiҐ@  \~9P@Ŋ92H2UOP4P!ǤFˡZuHɎ`=I$uVL<&MBU`pj6m@yzz$9#pA+~Jɓc֬ FoeD _D=:*gel͚5 ~}-^kѢrYjV*@_1{lPtXd|խ[7jߣo߾Fv9~a 0JO:ƻ2 oij>+2E-?o(Ծ| ;tNZ?c P>ԩ:wlK..UČL'8 .]ifZqk:^|A`ΝV`@$QO<`̠u33cLsY3egt0_-cE@D@D@D@D@D@D@D@D@D@D@D@D@D@DW$撱" " " "|L>s("-FS> #Xl̎55_T |вen}ˆfoDQ>}f2cƌ/.N-R]ݱcGiVg})SܻdKsAB4nT2B@:kl߾,F՝\޴iS BT}V\H_|a}}zs[jU{ѣ(g!C`8Sꫯz깰We}<7\5m^@ܰ.k׮EJlLq:L2n1"vك9sc}!֭J(z_z)~ =i0:8d|dLL技@ H2U\|10KUWyɺ"!Ȝٹ7͛k:Z{졅L\5+}K 6`ԨQxwpB+Zug{FԮlN攐UL`޽1cƍgB7"{FŊӦdGI&YN:~k׮qHVEMc<ի_-ZĻ~|f~'OO6 ={׈?؈'ov%D048IH@ec(c|կ_?&"` pL8 &O Ev 8v&$cyX|;_b^Lv? +#_VH$E@D@D@D $B*ZD ~ 8CD>h2Ľp A2LCF=zwÈHaU >B`T n֌;-i(Z1vX 6 SN '`(PդI١D ],X ph߾=o{=|+:|#FmE(KѱcG+.mz@2lڴ 0QfΜjժꫯF߾}Q|d2v;[oYtR?l9oS* 6K>x}UJh_b#@lt6~Dj'Ͼ>|yi ?|p t %(94颋.f͚'_4m gY'P&p=]UCH*X劀W L4o, =*w%^#믇%鵖I=_~ 4n|$KHSrH`4h*VhRrXr%{1@F"5 r q,qLqlQccci߾}9r$N:$sk׮СCA }CCF_iӦBqW]uFJ*Yqyy[ȹsKscGa[R֬]6ڵk˗Pzu">pI |cKt~d,Psi8sy$9m 2?1cL9c. y+9j0dH*-Q"-z" " " " " " " " " " " " " " "er6xQ{w `tn  @6>)-Pg@:| sp9 }0pNù $"1ǘcs1VLJ0v^RN,Y*+TΝ@bj " " " " " " " " " " " " " " ^& !H/lH{Ϟ=PPҊWA" $ !H6JLںX4k!H.V,P@JWoqQ-Zc~@QhCYD 8888899&96FZjG1 o Ojժ^1Qv@h߾J͚5qgcǎSZ#FW_;#O>9k̊qKZMoq}3ND]G@VI"W^܄sU8g܅J" %ct1fcx*wƍ/L*WM$" " " " " " " " " " " " " " ~ !H?lH(5k-iӀ> Hhq\D'~88+3sD`ɒC7j>}`wjk|GS&L~={6:wj> "$&RVZezjzMe\KzxWJɒ%ѤIyسgOҙP`⦛nߎ>;˖-ѣGcʔ)>|xRM f[H*7s4LDE u4H{,~ ËsI87V%4cv9q<2/[A.]剀 GT D@D@D@D@D@D@D@D@D@D@D@D@D@D@M@BnY'" " " " " "`_|4kp!'@e/"7*d-[`С8묳Og?8Vn✳["JׁB 3V},Z]tIJ*$#;vmQ=_~K/+$M>֋^O&Mf6õ^99&96{m*lȑ#QGen.\8fGxQo߾h۶-35jժɓyv& =C,eqov\mmik=܃۷5p}S!oroѢc;صk)똬C"|| Nn5pC)>OsϡgϞ Jr|U#"pn9 mSJ> 2ޯ>c7 DgQ9I~/B[{*|cwq2v`/ɄSO_}UΝ/V" " " " " " " " " " " " " " "uz >0kЩб#`4PJŠR" >$!H..tҶm_b„ 鬔qvpB@!Zs;f9v|A\yVT?6"9PiNiZN:T\'(jBNf"GZV?OJ{]vh,ܬYbϪU@1Gy JJ~)Yr1|psknt  ȤHO.W9s/F"uվN4pHx=~Dr}| ܳ?}_NocOѣ;tN{(p.Yؼyu1/cʕ92>o`<14ϩ<4Kv2I01M꫁{]p~ޖP NRD@D@D@D@D@D 㪫n}5 (Z4(+EnΈM Csvڸg#ˇ+V`ҥțWAb7ZsV-|U @_|Ep!WM L5H]vK.\ WJ KjN:x>M͛7/5vX\gNƍCɒ%勂tplkذ!(1˱1㩧¤IпDHgkvBv|hӦ z2eʠQ28/f8._/nE2Ν;K *V={&,?Ns\C& f="OǍ9ҊSmdړzO/wʉ]Xh#2`ϢYgUZuzåb>97`6mPJ-M.F;<} 85j1?#FϷٳgjT'M%;YHa.Y剀 l e?h?IVĉ-0B:Fgw@ZX~/m渮=܃/2G;6&ʁ+QDrmg6۷n/X`)֧O(yжʕ+-eb6m?K.2;TP:B|%%c(yi-٭+sBjFc?y?qrofeiΔ)SCvY򎑀|D2~!!aRmQ*0YNޱɓ1 3;v5(f{Lƥ` ]r%xgjXz$LTAjd:(*UB˖-]S2ڗ6k>_~eN,9Y<;ts '2i>H9[>"g;`+Wʕ^N|s 98`,%D9k{sǃDNMI#uR ^{5ԪU -y3ݺuC…1ǘg}2B~{ GgE@"عb"}" " " " " " " " " " " " " " " 9%?| ~wY81nr)"l[RK#iZkXl(ѹsg\xv?UW]+Gߝ?=z46nhY.Rg P/[ѭW_}=^x,^'t,Ybhܸ1km޽{֭[nôi9oa*'L` AcoPxqpO?m⟱c7mԖuGó@VZe(DV+ F<0+Y|.t>x h]w݅ӧcƌ"EࡇBq۾d?9rׯ=>ZOm1Ypo'OFٲec83~GF,}8}Cwt ۷o7gyo]zqGÆ }W3fLp,]{8o5ڵ+~ W\qB}B0("I,eOpYM4Y #wލ_~Ŗ3j(?R-S el;iV^|Ÿ袋2 #@af0EDX>"crBJpl,ǝx4zꩀ?\@IDAT \ve# i۷osHM6#,hc9&34[#0O?0=FѲ2 ##0"]X#`[p>#1ΪŢ2ٮLF2Ю];}mC{ր @ 1{oH} Z? fM7hԨˣsg A#s{,`t!`DmFp,PpaˬZj޽{ڶmk+V,@>Lly^={7pC _|#-[8;N <Lj<&eF6`Euk=.p>tҶ, tմw}X3aލX,!X1njYhmʕ+vb2Z`Q>Wwyv|zQLnaD$wrx)e'PFx4☁+~6# lG#j,m1? CJƄ"xp>sk\6>)>wHu~IKZF)`ݜcd׻D%ې;e羌}6qa{L_Ds[?^ˍX|z6qL0t7<.Aٿo dη&}ih>~&ۗV4pg4{pC7/3=yH@0˜y,zLk /En}bDv5k ӗ(Q"!S,>{B?=nFA0"#gUOcYnbD1\qEp\Mnb+oI<&U]yNvJ1;vdہ\Ӝ̭]2XD@D@D@D@D@D@D@D@D@D@D@D@D@D@D SVpG@B8(ox챀Y 0mkdH:4`\}Ձ+Wrt M܈#f͚YcŁ;w8pz7G`s \uU̙csa(Eq?g޼y):$AM6M\I?9$p)!H[2ųݺu/X ٭[.x>x6\TP\($7} R4 X1`g 8q3\`&ni0(xz׺82yО2eE,u̙\r%6k;e,)pSV<}D4~|͎,GDsm_m{˅l(;a„XNOڱܲeKBʤ58*$'ex!Ei(*qϗ~CsS7 TZ xĐs&XXm^b=j dVٶ|Q;Hl_ګ _~?i>83| rv@d~_?8-*9 8RJ|s ֙ex)E*T>ƩF5 =E77 IҞyPDb#ͣ B͘1rܽ{w$yߒ"pu v?py9xVCLE}+L>L.?6i1Y*" " " " " " " " " " " " " "Wy?])@ZسRg  H˪R" q&q#PذaƎ 8F C)F~裏͂'x"=g&c̘1auu]իÈryza̯_~0Rx7~Ǜoi[޽;Y4,B͛1j({؁ hҬF0C>~bf7bv޽{]dxY# ޽{c͚50Y]ߌ9F#(#*gO,}m? fF M4q`p 7kSX1qm3L .nZѴiS̝;C ۍ}/R}7Bʯ^zvǝMܔqqܮ]`8cN:j=>ݍʊƏdGduv#51Bر#]􉼗Z"/?ܗ9kF4F^?xWr|ƿ/7cھN;/08`D`rz!hε^Y^{u> _oyek{ŢY^^,[\q%O>F(~fKɯ0t-t#8Gg<0i3il}SV#s|< 0$*11G0Xtycb\܈_}}OV>y-)R_qln]4̃`ޝMz!c01J" Yعlf=" " " " " " " " " " " " " " "E!" " " " " "9f} N; `D`@ϙ(D@&.ڵ+MfϙhE)8b{(cR1R^{ ˗c5klO駟@A>/]ԖwwD7Nrp_E}ǻa씝|}_y~O<-[b۶mٖڬR>ඟfwgΜ9vlۅ^}bڵV\bvhO*U?q ?s!ѥKsg6vRv$sYK,EQH(4?Dǡ~晹dڲeK?GqR@oNfM]:;իA!r L<8x nV+|#(lHDҥKlszl[N˜G8r{ml_'O}b| <:i$Nݽg}õE8cml_& Fk}yO=2| UM]'b/Ix:)qE$7}%VCᅬ:x7߮c 0Ui<* TxΝ0qH) E@D@D@D@D@D@D@D@D@D@D@D@D@D@D$" " " " " " |us,"ɰ[_D@D_?ШQ#{Ό32;|Yƅy\E|nSQxqpQނ QXb(:WJ<3V8s5\cO;@hv,gb^}U+n7vX4n؞~ZI' ׿~-,h^7}ź5袋p]wB 8s0yd+0ٵkWeO3:S,}37p~7\xV6N>Ke,җ_~it;?0\%gt& 6fe%EGRtBLD?lQF\lsq3Í"E٩`6@t钍s l~vxŻ$^x9bf.#"HyM6 jРlfύ>"H>⯿ "vT7ueb_uפkyC[5)I(|"{_זT/"2v^ulv[{3O`tsbsվdF(ݻgon_ȱ@K DR˳582v踹GWubb0tk֭[:1\B,+)!>#'E 8d[D@҅ƍ@jmu3իŘN2e;ﴛ;8( ^{5pl ֯_o9Bq0gBN; >tJjp'c<ڐ9͛׊1 3{%JwޙO MV;vZyuQА!CpףO>xgۏ om0'ŝty>C8R`<裭(#0戀2nihn>?8cA1ӭ[9%p ep5r,,Y2Cƍ߹_7upUWm|APB=qpH 0_ܴ E-"uWXX.֦/[r%|M|Ǭ57zB{/_hq kLl#wcώWfZCb:>SUVcc]ÉL>^zYD6אַSL`ǎv<7 fU9m4"]ҍpSV<}ˋ/ܸiٲ>9[x衇>;6K>6E+ _h :tŸy)S%松By"矏QFYrrr_k x-82K db]} vq{9[S2ڗ6k>p4xD@Y(oBid׸и1k'c%O>dp'_[R!5Xw=8a٩Nbc/`,i6.v=XO>h̘1" b-O806JQK'h>yΣc:@n|qE淤H}{к 1q~ѣG g%Py3ǘcN 8D<MID >h0;ID@D@D@D@D@D@D@D@D@D@D@D@D@D@D ?-$" " " ">{&ҧ>@zػ7@ o@ҳ{CU~" lljY0d#(RH/qŀ `HQ׭>}zF6bŊ}рY a߀Y0 %kef!f̂@[n쾚5k"`#0B,6/g[o0Wn&FPHТE+V x#0fa=DkϫRJ\%|s p)kc&zQ>gϞW\9`D3wV}%gm` ,~Wn݀s6w#`g ,0Q@~!ʁ֭[[{-Z=܈Z{2ХKٳmƧSbŀ EcƏ0f!ko TZn-`]mf͟ma<F WdժUF`D:uߛ6m0U?3)v4~}$Y8hР-RJaÆ5kh۶-{#40G5i$`Ď5>֕a Y4#B([lqҗ^듙]vV8۲`إ6nNM1J<@"ÖZ9o޼`_5J./Gbƌ|Df_0Bd\pի[pBW'N3`s3gLdQɚ~܈ACv/Bl͛7͉ob fO?dƽwsndIlg}2b9=FdquL|`u^q'җ;e@ؙ{S{d" 2県xX|y!)+ʹ ІTH"7>{99|؈GrbV2t3`1Nmx?S\_l f7mGd53`FX3P^y3]wu7Xbn~KW[[y\!sq,c{+y)qje~ ,X%dxM7 [d3+{yPMw]E@D@D@D@OLToyѣnݼeWy8^1,ժ.M@:u* #8K/cĆxb?1#6L0 5QT#E۰c\FFX%Ggf1cpY;wˆIeǛŦ_`zOa`*~KzI돬g};ˆYYM#{-9e}vR`ƙEpGnOi?T{n 8o&nvp&t(\0 ̂ uY0a*PFpDZlDx mDkmp̍Əe#׭[#i :B آ5pҥ0"0-#;f;x-`{x!?v|^ve0"v$6# HڵÐ!CPBdoˊ'2 =Z[}D4~8d?4c%Zs#ԕd~%kך{0˜ܔdaͭ~wQvt#`#ЎB ŭ\xF$ddA̹Kj csDdS{| {ܢg'j>ͦT|hxDl"3̼ƚI2JTXY# 06jbcI` t}p#h7z{<yy6l`3alee*+*d r-Px]VՌej\ > T.]9-i8BZl"nzS,wnq^'\Ez!;6ܮ6.BT$?0O?m݆ 42ElnP^I/RZ=a zaf)^oK<C3FիgE%w%/9sM6VꫯN8m/Hz2ؘnHkkd3l|!]iN5d}̾sϡGx'>9>G:1Y' ^>xЬY3+AhYƍSionyet#?*3gV FP!w[H<ARbE4z/ا%ԬY,ʸ:u@X fAbƆطoQ̟_Ԍt}gnWL;5{2:L¬?8x ~X`ׯЄo? $F,kw˖-袋бcG$CԾ$/y(h>+A^C {:j>JmdGspX84p =/rڵkϼz![}^~`C!C駟F1tФ<)?;ݻz@|t'@+uSD@D@D@D@D@D@D@D@D@D@D@D@D@D@DKLAz╣H5xTH勀ނ: EӡVɭ2>aV@@ 0p cѣG'4g=`uE?t-a_rIƪg^xaƍ@QPͰ'_(Yu9bPl8ESp?p9r$BʁIpa.~A+V+}݇?sܻw/^y+DG)wףjժ)B9r^O$L46%T"`P>bhݺ5N~OMdN3M0|*U*S&w7\4GED 4>_NgIN><f͚e`b3IB<@`ڵx饗0|p#W>s9A!̳OJ" yÆ @" H2t AA# "F(J;h0p0/@7}g  ]arN; 2d(Fq}e˖q/+Rg݅ _J"̙_]}o}>,.\hE#=ܤݻwTdЯ,%aXz5?|vm[Xs1w\L<͚5-s(eıd+SVMr/oi>@|h>s䜡r."8o< <~!N8WKQbŬNv#U"=f3Ѹqc (!Kr nСя"j{.7Vudثd Ad U1.#嗁NX%%08 px10}zTFUpM꫁+%@@;Æ ԩS={W^hҤIQq" ,{Rح}߿?za XC;+=zc#:vB JYRFkJ9s&UV˗/2L;LJ4-~ _~2jT/o&7k>D"2%@!Çǚ5kЦMWTD`Ϟ=2e|vE]~yLpڵ0!:@ҞvEn#}UUAH) A H@n 0B.e0b@v։ Wю1"X0BRYn ȟ?sutr lذF;# jժ8쳭[۶m}+b\*-xҌ30n8?,f^fg>}лwoTX1mڵ֓>bҤIVSNOteʔI""O?_+Shٲem4Px{T\95UƯ ؾnk[R:N|@ýAD q3ϤSThN<?8hGkWZ cƌ/Vq駟;3DݺubXt)>3L2{@"zs=իWOM.p0aܹs'6mj} *lTxE⋠X~Wv|D֭7o^Oؚ# Sꫯ Nٽ{1k,3;v}hFJq:an@꘴$@G: )ȸbnPDyL>4.-+JKqCW\D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@E@B¦D@D@D@D dikTH૯sUƏ=֋V& AdurTx㡅-)QxYҥn ɆX lݺ'OƧ~j6olif_mڴA}-j+{PGh;sLL>ݾ6mڄrY.FYSNGK޽{!'/^… [qLmSNY.m.U;~W̞=.Y|}bx1`ϟ?t'K^G뇍7gŕW^ʩ}co?o45.4ޒDg#қ@nڢe/7oԫW>tqVZ㎋5[/ |71cP"'g1^@H>0qtO&|Nk{mU?LdI੧`bE^dlH{L&VE>⊎QE=k/ /MF'@ # *p%I(PExL)dL6`(ԩS틋mۆ%JyV͚5By(B@J Pt;w.0۷oGRavо}{+~'O)_ZAQ+V _|hԨ-Z>vCʊ]pB̛7S֭[gxs|ĩjQ'۷<qTZ>(;tZ\l2s=3f:t(*U2Uڅ?J\5}h>| w h>Q-2v !+W ΣZlO>7F"Er^r$O?d_m?pj֬iOWdZʍ 5k`1scUg8Lگsx>ğ T9@ZdZ5*#!0x0p 7?}c }T24nʔ>!Ʌ>8F0 h q#ŭK.ٳ1k,+|rp;EpI&v6E |78֯_.Ʀw}gis kժeM[nVZnݺ-fRL\`(@٦M⤓N rΟ?6Ki"_obGٲeq)X@?]a´vZ+t8zh7>t5L=S1bի'|;w]Qotim"@rCpV)'@ˑ 37Fn˖-66P~} B2c J" 0.3`|)l˕+Snh (@$`b*G\@dP ' AdM7/ #Dz_k}%6!@Æ%0bZA 0I@NC%'ip `)f[xR/h.OHKNq*%WjԈ ŋۏ?EqZNkRjl RحYf(YddJ3+]07{`ݻ >|ZjKF2(O?Eڵq-.uӦM35k]w݅/s!4/Ϝ@N x| Ds31` lj8VaV0.>ؕb̀={16ŘA P@hYZ^y%"Ps97Sga" " " " " " " " " " " " " " "`L0`e/" " " ~' !Hࢋ>~8|GK%V ,45V2JT^#`4psy2ٓ Yp!{+mر_LԩS GqvZPF p (RH2LT>'k.^+W˭ݖ-[֮xAR.nԨ7n,G=`~"|߸q~j~>zPh<[bŊ >˗3 PBUTO?#GhѢիlժUQ}mpy7uuѽ{w @fn)2sfnx~| 4W8mj)׭[UVA"m=yE9o 0Aʕܟ-}?`l1E'~ *XG ;`\0cl}U\G_fN=5U_dRq0 AdMYgk-[YBj/Y<o\w@qZI` `E@|(V*,KsD`˖-5kؾB{O8¢~Bą ʑ :0^)[aW(2ca?~<ƎiӦTRӧ틦MԾiڰIIⲚSI7pk>mK@Xz={lи ;wu/X #|1'^ό-[6r OP1'^΃e/{0cNܠ^zvw8G}.31:<//k#p #(zr Ad S_E@.!`=kW@`Dq\RWSB)nY= #YeX ,^ 4h̚j” l߾݊yp6_r_aʛ7/*TJ*WŊAqHG}|/^sva[6nh)B 6"e=znݺ"31}sc'Κ$J|K[4G;x(XR`iQrshHp`<14 ˛Z͏J$@q[3`lщ+?D0f "߹MD9 FE.4/yXg͔a" " " " " " " " " " " " " " "$ͨJ@H2ql8н;P`tMD@BIb|G`@X@/F^=3矏[(8p]Ļnݺ \K!0mٲ\$.=c`w Qe~*U Gus޳AƶmbM6yPѾJ#{?x1EN@p 3 Tbc@zO /y8lPvjlP"*_}uyF*+T @IDATZ@ H2t@c};F,6rvǕ S=U@JÆqy^y pofoS }"aQm;/}(Q}9)FVxqPhg )Rľ9ڗwe_Lq;vؗoߎ˾;8lf%gs{'Uuw "M bŮ(-*QXbh`IŊRTPE#bgg]Νy޻3w=}g<7tn۶-AΉ *|Vm/!@P42Hۃ8l8l/ a6QF!HTD.h;?]yDm򪜴= 4*vBۆg9C@A ~m{0e[T.l֥Kܹ)( &S 09s0{lӠ@3g4ͣߪЯ_?Q*Վ2`f\xjT͋ _なC!c]Ԑ蜁sA#C2-P".f?Y" f0>8,@ (Aw<ִދ:+k)D@`oaZ'àݚN6{J PA5k깎?XNCX%UR!=Nô:^v˖-#a=Uyu>:6!l+´> ƴPpm¶!4hrPy{l!l#Ǖ0+~ ڨ%]ۉ"lX Fh[`Pp 4s IAѠUִ~j[o=TI ݺuvzp%xʘ[(kYL{kƇ1}(ի7r6}7б3t@\A E3Hʲ:qw8A-GC>Dk>׈? zMWˮunT  t![yp@Q#%龩Y̝.Q# <՘{(Vx@@@@@@@!@ l(  P,KȓW]ٵךiAǝF_K2藕V`6m:vI@U|Rt!tk:g ӍU,^}<6b)|]5orzM* ?jXP`}86B eI]/[@{_Gj!dB&*o#6y~S=>@f <_آEʃ(؊ᷣ~3^GѴo֡Cw_o~Yzry<7N>}F}*qT=Os2@ mۖ`Ѣ|嗲dٸq@KM@Ʃ/       @>O}  ̙f}ٛosW!@A ,\XV >o6cg1SBS ȉ֬@@ ]@ {.ZP~!tdv}Q-!B\ iSlɒ`Ft ZE 쫒#       ؅W@@@)Cf?QGdc  a,2unvM.$EC d6  @ii+? @Vڬ_?jd"@Ha)f :@BV4kڴjJ@@@@@@@ȿ (   P4bv fovfMը…fڕ@Eb:ϛW23P ֭K1o!  @N5ڕEz%Q8Dओʂo)( JKm[Anm?쩧6,PW ]@\͚z-(?       !@ XO@@W]pٟd)p ($AڪݲrYf7Pqf_?L@ 2@@@ z ٫WE@ 1G',Q#H-@w #09ˆ[o5;H-͖, jO`*A֞6KB@@@@@@(uA7#  sщg\@fmxfE/ ]rٝwuk?m1SGQ*@a iffV  A]jK@>kk,"Ц٢EQ) (U?7>l3 /4{)o1kժTew \iִi֎z!       -AFk}P@@@ !SxW bv}f?nv?@.4k߾JLYkS3Z0;DnlݺLV%aY@:f{E X@@V23A⺧K^z/Uhۖ@pgf^@ʮ u*)Q,f֬YebP H}I        {Aޘ%   -fٚ5fMTVo58l貎w^դ P}g-ڕ8O*e^}Lmڵe֯oF Ȥl@J:Ӫ, @@ K֯'da5J@a :TFf#Gv=(=TMMLU4s#P}/(CmVeI*@ Ȩʅ       P,ƵJ@@@, zٲee*>}I^{eqdA`²2_GթC ȈBa~GE @@ ͚um^D.m=`ֳ&C@۶e.p!)ZQ cvfꥮ^֩] Q`*M @@@@@@@ d3J  Ԛߚ]sMY-t:3}f˗M`֫W!9X,s2.@K/5yg*+Vygy 츣Ye   %SͶά.wEiP^ʮM͝[U Ri1M/7v[/%X,ր#       P8܎]8늒"  .𷿙vj8@XWV[J}s1լNyQy ԫgֿ? *  P ޽]FJ'pAf-[W7jڴ){}Ѣ*hbKQ4@a 0F@@@@@@(LAz   @֭pQ x>-_A3a]Ζڪiy;v44ɬo_3KV2;7ٻ d*C@@ ꚡ\r}ȑ]Oj? lq um@>H| Q7<bN@=AMn       ? е' @@@'3,>3;+ @a,X`֮]aR֮cv;|AbUP Hm_IB@@?쫯ԶСfS}im/!@hoɒ|-"`vfooV~EX@E?͚Cm        d%D@@j]`<[n1Stwn9\D[`B]FJ?ƍ}aCiǫ Z`]{.  DG`Բ2Q(}) 5rdԙ"P[-]Z ? 9b?'O@$I`ժ*uA@@@@@@ v(   '?qN EQG6.<]@P v ܔ37dmLu A06|W@ )wߝ@x@@ a[niֲeJFy@3;(G)RG-Y~{k1@Aq\YVMF@@@@@@@h ݎR:@@@SLA:4ԩc֪UW͟ovf={4 P,R_t)(r~;4,0@ű&  @azJm'DQ`P393L m[4۹U޽ˮO2H0.Yb@@@@@@@@ t   @ \qYz?-V{@we!/ P o_#GTh3?kg,bP Y3n@@bP H!!{o֭FW X.Ԧ~MqL@ׄ|/@ _@@@@@@@YX"  9P^uS  1;qI'5l"9 PV}YvhX{e6qbYs֙}IW#Gw7S7c!X4  d$sӧ2#,fB (QG=HA ![$B(%-УuD@ ȟ,*];Wjڴl_@@@@@@@ȭZIB@@իmʕb ?rwD o͚5azڵ~z]k+ơXm}6YfּysXȧڎ;ov, F@@t\ ޽ @n5>lLsײr,rG nmti~ G Рk;hе0Aut{9t}'\Y6fmv}M;;3_ײu ':N&:O_ x4niu &DB g㓮ݐ@@@@@@@@ ̽1K@@@ |w_aOo)?US2 M|T*~:t<c !eXԉ᧴ᆫ]LJstL@Q-Z76h#?M7вeK?qV\p0S Q F ȈjK-[jC;C_yv^՞JjN6j4ߞ~zM6_B^_?t>k١=O4^ |:2aeWdM|MW[A$j"Я_Y Țg@@@ S{Y_K@R `ZOXKyy [`3wܹ® O-;{4tM'~ttG턠鮋gC6.O{9*_ szަLCXgTďu_It)\ѽa0k;tG{½ʇTֺK~(m j       @vY   ԒnW.Eŋ+ K.-+'j[nm[ou@ ԬY34)L&MQ8a5. $IbpyG2T'bΜ9AC3*'u*PPH rlӦMm۶־}{?ȑԶ…f_6Y^Uƫ _VK,)k:PgIAա-5Դ.]TcuS;=2\>{ɽmȐ_"3V>2tS8t cΘ1<:[*d} T{땫6?aE[ՠD@@fFgx@@if=z$2!PjSua,N}KSn]"KӠPkg#ܷ8A?K/*'&\Xk:uwBC]ѵ]k< Ul~^ yp'Xr̝;_ zInuAxhнz(tH        PK%h  /M *>n: ![la;Sy`Pc̮PHP*IB=y@uP5k>xW_}e :hh)0V[me:t0AB)@DXBle%/u`S[]CxWB_~ 6سgOƇAm7*ې!ʽfN5O9Sca9uTkӾ{[noXI#'f'oԛ"  PhPz*RS^(VCs皊 ~ܩgAF{:8? NtoB|@A]j@(?LrnZKBl-eݺuݻ!L뺏hO2alZ!)p֕BA`Sy:5<Ԣ?ϖr(!       @Гx%5A@@(tӸ=Μ9>SlC|GtMva;C}@!Ҡk﫡@SrאIV'^ 9~x߱@&CR'Ν;[oi֭[ y1F$@n=jΝp +vw KS m| VH >IRguTAB[裏ׯY*0ǎMwj!ۥwY\k  AWV+*pxf6j9j-(7 ]L:R- ᛺~]pXA⡏3XÄ]te(X}tGVXQgFC@ P eڏƺ5rOZUP@@@@@@@JD@%&  Q}M>}'>dCAB L=H-РA`*QG S'5<uDQwB!vGֽ{wS HKrkUPfj ԱLwmPB?T@* TA{ꕴb jA뾃iOl޼OT?h}Ĥđ "_L   @ ͬw% 1|28'UCqȪ;NdF Ȭ]3f:;/zTpƎ;hvXyP?=Su6l‘[dBH݇*}w>0CG8=pTA! m_?5DMap{]]&KC@@@@@@@Yk#  P  {gӦM>.\N8G7ww,6|s?wu@QuRQǔx{{Soノm!/ @ Iԩ] }W߷j5(`_,]u T:,߶}W9-YPV4Q m}:bSHwoCh!TZ~fW]en;bn]Fl@@̦N-S $fÆ-_nQ*eAl ŶdI6s,V^~ ] γ]CiӽV`> [.,j5-ZXϞ=(S}B`Yf*W^Ç>!`ΣAt߇)繼w%G@@@@@@@ : #  @G~m(Ԛ5kQFoݔ}*3Ju7뻴Wx~ALAH5Vٳg@e a]w!!@i ({VR[mKyҤImG}djX{]z[](ذaê,yH+j}TA}7w>~㎶N;.7n\9+ϣ@eAjtە<E#  @BڵK6/"y4PAF?Wu0aYtAPs@(oA?1?QD.bQF: *t~Э[3]5kfnC Zgq  d$I @6l}͝!d eA Hq|ĉM?Ο?ѡC0>ӹpT0H ]հ}xa?lz^zޤwvm7?(8$*f0jUٵ fe@@@@@@@ȂQXH  ŋm̘16zh;v)Pn֍ sZ߾}{VNRa(`{B{{|g6>|]~>`21FV6+ .թA,ԮkPp/Қ6m<Ю SΝ;Wg| (@U5ħٳg;c vAc6^.ӊf`fge;  T]wG9>Z.=]!@KcYk~;$]ҥkӧٲe E]p~}~D4i5i_!zv}wg뮻Zfͪ-"P0 ,phƍ>T'C9=z(6Y<-=9 gM+bרK/_Hڵ+PzFBD֮]kӦM~HpBSgY>:Hyf?l6cF@ oʽ1K@@ כhav-fܹf:,/>" z+E͛ga:e]y\,<(t>? lx]znaGv~wT|@@@@@@@@ 7̍+" E#@YWog}֞|Iq{N;x{XF2Ώ(&/wQ]o/lGyVn݂2 b5QZxMs\lDjZX`M]˧zFnfNN r׭[֯_;vMwq>X:A!v]y]v}1]I.   PsS͝K0nE @.~3#  [D Va=Q(Ivˠ{5tƣ>j^zɎ?xkܸq/[e]f|⋦>ظq㪟1D ,XP ׭[;ӎ9ӶGAgLb]tm6^d 跦ߜ~{ 귨ߤ~wJ@~f']17  N@ {]TCYSI>@4Riٲq!չCZNg+-Z?l?̚5iڴifȦ@׮];!7dӧZQH 7l.ogΜi￿ 6NS֩S' 5F(fluVVԨ>Qa>zΛ@]v1s`H PdMip1#|Iٳ;E.r='Hngӟ]C=馛ꫯ;d eʲ{ :n97|@@@@@@@r!@ \'  y`v7j(k׮]KT_~}v=؜9sN:YŨj`yٳ>k=}5*W_}ecƌ w(j}+b{챇)(ꭷj3gδ,w_:um6|oF>ò(I4K]}%\p]x>ѶgwU}IVl6?٘'8ko76tP/~18f߬~ ߲~m ( (=~X4Sm=t`ܹE;:3 @i̙LO?Y 6\1` :>6m{p- E Y(r"PU6n Hwc=.rӵ޽{W̟F ~2ͬЪ9!LO>6d@A\mfƍ"jUǟFTy7rFzN&eydڰaCӽPQM-[."m**פ۴if[2[̅       ^Ώ;KE@@ '/]uU6rHw}s 2:f_ncƌqA\*lf^@'pB^*?Y\|yoF>oi~P' o2dy䑦 $ ˖@Ç{ӧv`Jh)m_UmN_xV;ʙn;T`;vmg */r+߲~mG\Q yg &N 0FRH~dȕgr5" 7?lh-[vr DdzQm7dӹc{&E J @TA|v}+$:?Te;PDT#*sml௞={"+в:N^h?A6kYƉQ>s̗:e.@@@@@@@_d    O&˪J_|u]o[ͭcǎv7,Lo:ud=͙3~o[ 7O0x<~_ag'~ڶrKm۶U)-]{Y-SNVyYcǎ={_U5%_|vZ窯z>X }?T%}?Gz){mO;N ~.t~I'T?`׿쭷޲zmi݇}ld~,X`s.I=W^nFvء{[n=zuv,pRmCmviH<򈩌]t?>`o}ۢo/_y~(H7n͘1vuW߮i_Awޱ{;zv'|bzjϜOuڗTk׮5y즛n2m?z};ℶKSNfW:|om{V|S5o3]Zf2Lsw}mڴJikj|[Hoi@~hokq@Ax$(b'>6}tj1kHu,t@ŋ>%\ۆdm. mK>kۤI ڵ{c`È#L  틄::a @>>cn;x6891`6R{l;pй>8̚5kqvqG6lJ{]|Ŧ:1ʳ>G}Dcu啪|zW9@^rdȾ@Ae]D^Kd㼿p6(D_&_ d~~8SҥdkzN(:Uu4iR+5ok=:N;45ko3s;clX]yC]#-jUYC Tn}Ss~wvO裏|!q̗\rx1       Yp73g- i ! ȑ"/oue1$)Rekb./7馛i225wnW=\??Un=[zu΋t7\(϶nsc.ء<9Ć?~|l}}>.u@ 12jժW_iڴiʣcݻw3&\-Z0w7: pA5XΝc_aÆ5s:b.aώ)_26qDͲeb._ԩSc tHhѢ :T_IwB'<쮃]߹(%*cJF lHmb-[FW?mF17Rt[˘ s}coTHt80ژ?>6`fbjk\Xnb.C?t{=6q=/'p|jnye6T2.ȵ_N6gRT1f]G%69lTvsj_1ס3{}״>>߶~wqG]nEt j"7vt<7 s6V'k?h۞XTy1ѷ:VO֦1)'r:O.8Mt|ںukL\W\qEpXu)5KFh[B.)Oq:(PGuT|2axy+Cu|].;w;fr61U߯{@^,[|*k߳K$@@@@@@@%Ոj!@@ :c~tJDI z> P8Fl iРAa2`z1UPR KRG4ҍw+!?)XdH Ġ:UI~y7}ڵ+-ݲk7‡`Bej t~}r4VM@zM7g2RஐFQٿrq{uR3;w_FQ`&LWװT*IT T{ I .K.A$dE+M\ܹ&EVP_Z-__)bH!/^U`5$ jӶzoO?i\b=g})9DuڗL=^Toٷ&MDms╿4Qᄏ/Cy&nB?AfO^UtvDCR'.dnؕS޽{'OVw)@{a"X{E`(H>w!w헑Xtʔ)B| `PJo?tBC 8K3p|{^K/y1 @\ ?|})29fr T0fzRk ±iCo/^9p믿Ϯ AR+_yL @ m&\0ؼ#@ H%:th D6gzʜj+_ M$/3M[s4Sx^Afr_IMέAp }D g}B2ABC -xd\K3:w;ɹL~u̗-E@@@@@@@]wc4 @@ȉ@M0ts7ے%K=|Y͚5.8թSOo6:J *h| d;M8цs:iҤvm_ٳΜ j3 {1s7*屮]Z?nY aowc}yH3OniJRnF|_?L'~{[SJ6LTk/9s_ϙUj}7dH#>Ey\μ P >y%sP=a\cӧ=S:yWоi_@3jk\PgV`־=HԶgն+i"TEeMM"y䑾ӾChV)t:sJhӭW-';͗.;찃Iڧ>Z&vfn^ێ (p3r5?V;܃. ۏdǢ5tnu*.?wqdm0o͞=^{5?o8/0baڵL B|ZE2=Q!CA@ SSc6'ft7ǀ wA=Xʟm3<܃{ Ej>o:'%bv<ٱz&+_0 7N]4=:oE` -͖/AEer6'jz=GIB߷zSoLt=Gyjδ:y/stqA>㳭[ܚ hկL?R\ Gӹ9Ó,/?ddn3=J1_s&(Eʆ       PXeQ: ̔@@(pβelƌ KmnvQtԨQi ӥK?:6lw,e]쮻C9$5:zV%7x:"aLge@^J[T~}q5T.c|5n3j}u㶒!X{~7} VZ,X@[]RT[jժHcaÆٜ9s#0kScǎ-PۮԺukl>r|0dŷzuڗL=BLUmTLLoe5;!Or6Ŋ̦vM7o\AUI\xS\oE,P=Ozr':c|?cgM-N?_b{챇}Wst.&A~JTdEBsb@ LS H-Hlo(T6\ŷ㙴p!:Cmر|ph}}W2&';VϤ|5}#dDr+s2CnTwyg0axWʬK$+@u>>2=RY HT PDn3W/~ٕ):K{L#       PSAT#  ~YoHw}߷N8})ѣSQuf>0ug3 2$o6mԿ3iҤ Pŋoz֬Y_?~|ںu,_&7Tg-ZY垭K{޼y6w n6md]j}{1k֬ ˞?z>QÇ۩blJJ`Bv[C)8Aڵk}zȴ-饗lȐ!) ׯm7^7P\LR-7}G|^)lj׫]6긍h|uS(̷vL O3~kO(7xBeߨj|u2Wiٕ_uC)Ծi J/@ȢzY^f:u9PlM+Ttw9_s5v'JFo߾ Ɏir"P HSX2ţP P Գe$=8Kԃ RHVO_U^OGe67dәV5dսvNܚ~9s/W H^=8phwݺ@M4EmU81_sM)/       @~_  @tc-bgZ5H.bkݺ[eS'|2ecǎ:Υ|'M|{Ϭtt6S׮]y#ؔ)SʳVyA?/-D޽/riAyU%:IpR?fz뭳z3{㎾,Zy41ydz?3 I l,>V[mmƿ?"KY @I D=&Gww}72γEyԩ~;>n8ꫯQmҠAoa\r}v}[oeVo~ON% #+w=-Zz]s5>gyƂ^>}zX=6g[^z寧/,a͛_ cuU*U %C˿LgU$)y睶`9K6|pk֬Y&tCu>w_ARՉp{[\0/&KP`SN9:t T[WKwsQڶn;(=cuFm_衇LYƞx 6mZC=UDUm_2Xt_ԬY*,2Q\a$3MJgq>d[|o2m~(z٩Jƚ'G^Knݺ?|֛nGՁ4*IAǵ$HTʝr캫̙fQܝ/ @1 pTCR VZcjmFkfYg叏{11k'pG,Ytr7*¶[݉O!@s$dz">@m[76f%o&fL&: w+~kI WZ ub=%? (+ɎL%l^@Zh֬G3wE"s^x weyTjTzN/]Jt~(Moj:iڼܚ6mbयEʌOWskm]ck!?̺&)o,?٭[fټ0km±^BU=g~^6Os&}       @V!Cb1 $@@9E(S9RA \uU1Y2vܮChݔsc/c׿D\fsV[mҥKllb.xay~X6mb 4@wy'֩SX&Mb&_?|vaĉc\^g}b_~ey~&\ Ps7 ϻ>/,e1*>`N;sdc_uboĈ1Q믏c.Sߌu]7f̘gkc&t2.ˋ/r-(;TˎG\c1sAb.HS/HpܙXt„ 1߷j;vsTmz݄)tNGO.P?h_=·k΋U>_@ȇ;sӯ~{ ?9_Tx6{cTmc-Yab…mV^!1:E>ڟgW;詎SBy8Xl^ Y=\og),faE> kY\DJw/]QRU>?R]o;,Deδ}==P_K \ILw_fƹ5]CԹL)/`܄ ɩN:v'XuS pkԨck,s(RS鷝ɹۚ='א#       @nJ:,#  D@G̴TDns9\;>|k׮knj7M6|sSCA\PBs|9? e h.hkfUV+VO??E-2 \*sQuU+2sA.B.wX~.fyj RQ\l* mr2Qy] #!Tcw#-^\T{cƌ1?ֽ{Z[u,0j*;f}ޛ?N;{^#R5 &FFM[cIQ&Fc]ш M U)Gg2r\ٻ2>s;;;>gwfng=5Zz}. 34mZ.뛶s.xZjqg/o̅) zc=Y~۟zC5TwR}U2S.^o܅o;__2.j=oWE~P+wYW^1w̲FcX9]{5ה3@ r]wmƌͅ?՞l?\`i[%ԯJ>'Sk\zi&/%w0@j"pf;=`T_~iۭRo(5Ff¦MoW%zMWYxj.rٚ55S@ [gw_ ?]pwc \qS=%QWy>Tyy+oz卯ᕙjLQt?CwR:t}'~^zŗD+okolڴi#͚~wt73j.~2یR?'c'AzeݖO5&%}oˉ0       A@@P yBN>ߝ_7A4UE''낋̗nB+>҃zӟ8㌽c@ +2Xp?I-[TdFd25V^x]oߜH4c޼yvG}dZSpJpwh;R[¾BZJ3_RVaBÇ=z/OP=|o`4@ W " ڙ]qevKTFY7}Q&!Xo~2;W!@BVǞyMMIi?GO?ݮZ TYr{ TطWUq뮻~[kYԱgjؚ5kL|衇OTu"?#n5͠ P)e ԯ_r  p r700`w`xt!0fkժxhڬW/w%23K"\c;k&wɞإ^\ov%{~՝sveݭ*~c[xyߤr֧֭O[~5ko- wi'ot>?^uU8Q&5ӧϨ'Uƃ J.       @ rw,f~y$LI  B@k?/y{hVNVb۶m?~RrΝ3/O~={)Ns.5X(# g9'0V@=6j(C͸WNu+$,6Q"ྊB>ʻ5Ν;|38~СC3RQG.*2d)sH}irXUsWD1A<36p@;3ϴ&MdT,z{;0{G})?'}*痲Mxܹ0|S@Wf[9 Nwc̶%=?я,^R'@@@@@@@rR Ȝ\4@H\ ĭ2PO;lԩI'dO[3lbKf ,]}Q{衇 'l_~iAYT$C^h1 |wڄ EwE JgYnӾE:/9O&r/o?S;]% :(UVoՄ6o6wQc O-!/  vn3sP@H &o1W/M 6۫`q,[?ok׮;tc9ƭһw}~Sc0V7/7Nͫ6md 6u-O=ׇ~h#G7Mn}M'A;wK\       -ͧ  @:u϶ɓ'ۤIl}u?]`m۶5F=u֔(J]g HW_}es=xoK,'x"T!)d`DF`r#S +>ڇA*|Ng3fjpJv] LzfrY)}wM9}T0@V! o段   @M30 M3c6 @ >ܱO'3a 6Jݓ*m:vh]w-^؞}Y[?Guvꩧ_W׶=oUy~~/O&3VzY秥Q "_Fƍٳg|`ǏH}0\~ LG        䣀  @ n?`;BSN9y[zu t*9sr-vAY;]JѻkϷ+ڵkWDx2"bmFfҙvٯ.\ho No7tXIk]۵kWJ6}g>#wI᏿կwL5}t nnfL@@> ȽUQڵ`w膂Y A Ȁ_A|Gq=cj*{衇L7袋 9G E7n7˽⋭G֫W/ ~\h?ΪR̕eM;@@@@@@@#P;d!.F9rd>Sˁ_@6a[d|ַe7|颜<%I 0Sd+QV-;}wwڇ~h=au-[1cafƍݻg/-Cͳ'kfo}ַo_;#Fk8nTocYml  Νff]rIp2wy a4hlٲi۷|ܮk/9=z ` @ۛo|8 c>}T}YwdQh        s%Y<)=Tt@@2-ಂLyktUm/4x^3fXC=_p0|pkذaU&˸DF`{[o/~[|vG.( TOYT]̅qFy,^؇پ+>n͚5._ivAY]IkpӧOw\*.1E6vX;#}0zaaa"e ldsA G {S  )3sAf|b6xpJg@uٵךB) q/7;٤IoH_tInT-s 77) n߱ s ,7Sq @U(OV9iGeگmv@@@@@@@R+@dj}:  y.̏"Lj+{7Eo͛7m>rȑ6l0իժU+fbZ`6uTc|b)Q1c (]T@Ԩ Mڵ3j.ظ&S{wTL]w}V^m~ݧm.":tu% W`….PpOrW VTTdZQFѣ}ٯ F!.0u P}~oD@ O>ivf7L#d @*>is91mHכof ε8BfϞCux`=h !sÑU|O\q A8n?!^ӦMs\שcfgY8       15@@fm駟;sʕF)8-[X&MlȐ!dj]d>}X ͟(m駟nʔ)>j̙ckݺ > ]/3C]Hsh>s vZK/WXA U+׏͛7w]D׻woR\ضmvڴi%}]vZoگ_?1b{$VW.L Av1Q1@@,pBYϞ@f J;f Gh (o݆־k׮n~8}~4Uwwزek>Rro?t;xuFA ܎3f.8Cu#[ԍ>oFGUJlon&6>c!       @rHaI#SA@@ 'ڴic'tݝ<}t裏'NS^=۷@;A׹sgUVN (tΜ9%,\b)Lfv]uU>RI dA/_;sZN:ok]w`PTi\LX3&W@ 15kVIZ]w> )?]1a]K\>  (P@p)}n0qY,@N {R 4u:έ.(S@O?mrᗎ( R7ի?cc{vW&n1]~v.FBİ.%  |lh m@v a6iiӦb]u".6PЅpxl~j*'u@}@m|E9眒 DV^l&m P:tu/m.,m׃P^|Mmƍ~TDj;lڧm:C`_j9g7{}3U       @n ˝V#  q-ZQ7N!@/4o_X u_d e˖VV-C&_'?ҥKK. -[ԼM6%|!P RNA*X¬}(oKjSW|WB]TW_}_P\앗gm۶5]tZw -c_Z8c}׶};m:}Fv)jN~cnJ:}F('bU+?&2>-F@Hs*ut͞ )1܍̦N5c DSKWYe>}4tnԤ_u>F+í~ӏ?g]vxAנAҳy֮]뗿q) P- V7+ &,}q.6^}uv=l׵o絭v>ܺukv^zmmcm/i{lJ_}%! ~ /+= # xFe$@@ y  !C'@E"+BdDiyA7ҥ*;蜍། TPuX7OJu tэu5u :)^AHxtavYn?5=޾}lR襂.(+ȩt{t. +/,,, 3uQ:-BE%$ty+2EK۾lm V *+):~j[6?#P9ms+*.ڞ-s/~[ݏ?Al\]QѼuQ. A_u޽$@3T?P{9PHСf7lnŽ#@@@ O7<8Lk@ w⫯N{i)(&XF]667mqcPH1 ;rc;gѢE{7츈8:s7c;ypqN:L1u~G\|cB58c}hvi@ XS}ѱ5Jn A        Q 4b3+@@@p{.]U9x(BQ:t⃙:?P' 66}6d_vM>ȩvG_p,0=E ,)Qd}NG7!@HfۇT+iuw՝v^z]@AbpQ^|_ymۃ{Eൠo1ڵkWv?o/Pc.v>k_@T 3l6e!D@@hwAsN4K-@ (;l)f|=bP\榮E!:Q_u;q ۈ?<.Npu@@@@@@@HAigv   @UYXXw0. @E+Vھ}EcR7YTTي0wB*0lrT @@ (KF"T o6`ٔ)K z Cr ? ÒAf         2r #  @. KK"@:Yt̍y P} o;_`Py6lB@@) HQ@l4 l^-7qcnVFK@A۶E@`&}@@@@@@@HAf>   @5oA*Xܬ} F%B" ͛76Tp bMzQ@@.0}:AQ_*8L; DWQ#nݥ5W֭FZ l0{G@@@@@@@Aa]2 @@pA1@+bAejSر#UgDZS'->$͠  J@"7ϬPU Ilz%K>i&iPƍiA uY.F @QA![$T@@@@@@@ G̑M3@@@ zv*՝#a 2Kz'4 j־}p7$գR 'Цkqyx`@HB L933@g6kVH*C5@]Pe&PYp<2lu>T&v)        ^ @@@YX茈 PJ{w-K ,tN.5@@Ayy|EAB*fST ? ڵN>y@$bfiȰ@߾f|c|y+@Z *#Zt) Tٶ_$PTDduE@@@@@@$ΞeIK@@@ ̲Js@ #cǚ=k >젃~dR@A}x3Y1@ !2D PI'O7jwQf͚U8^D@ LV<R4&LG ͛QHH Ȅ)A֭i53D         2 @@HX Ȅ(W`r_;~_2)}@6ˀy_``3h}NAp 4ibvAcwj @6 hC- -о}qт#͛S_j;u YRA6lM--       DC+%  %f9p$QCUˬGK̘IPd~~~Ȥ>A/3'FF=Zeٸi @t9`@tKM@dtf6~24@  mb{ A@QAZb@@@@@@@ [̖%I;@@@ V,x ȬZ42 ЯY&eIA [Ucը:vmO? MT p1f{]k{@HA•i"@w'2K!P~_P )I 0- RԕmUø        Pu n;@@@ ,^\< SN @ x!fy~k34/7o D TT ԭk֧Avf$K@Y:{Nqs@@ } 3 'Μ@ ,AeIP.t^TTR)Anۖʹ0m/iS46L"       T,PGU@@@(Re:g~f1c 7!f= ̨qf$23 (QaSiS#c@H9f ?se^ @`AA @AP E*A;7:A.AYf@@@@@@@ {̞eIK@@@ ٶYp@5 i8P;vVC@@@@@@@,߆W@@@ (0cg @V d.PI 5ʪ&Ҙ,^UdW[eْ9P6–i" |.o7;T̉i" @ {91 uΝ[Qo G c>EEvZn 닂@ Ȇ #Um*       @VF   @ mK @&8tA5s]rI&kü\o#5iҤPʧ8Hմm[Q_gj @6 (rln!mCgZ̖,)u"@x/a{]FZ r۶\Qu        Q 2K#  @ (r}y4 HرųZN!UXnYfUz##mژkGd..{]0رD5@ LNd"-@ԫW[ҥy7AL eKqE Ȱ, QUMQPPw2>       TvM'@@@/ O)"رcm޼يJ[y[nuK?޾}ݶmJksrX,fujսkmҟYgZjtV^WvmSNIW]P]}?e4hP(T&@deBM0!@qF۰aڵd-49Ŗ-M ;%%byyy%\aڿRqYϵָqckԨw"d5~+1?I@lɒ^e8U4;DA TAjqP*A VM       I02@@@ y`eJ 'ʔ@ (|.֯_o|N@6+BJ?ޘh X:h1xaK?V=6kծąSLS[JSf.Ѣ6 &j讦 7i$5k̂N& 7o}E@@A/ 3I",}UV믿5.)m ~T}VVuJ8C7]nsH탕 !!z~" ٴiSi_J}-[Z-,ߦMkݺȃ@ŵ0 ʭ @:u"z %|q *s9qCU-*@ގwґ@@@@@@@*@dR9   Ps%Kb1 k.M[(gKUի}O|OxڵN+ć ۶mkݺuC JC )',k沎\ϸOZ ‰ D3_}͟?M-"U,`@uAQ|j)H+^}/t*Pw_\[n3QP _~ڲe+VXi?">H|>}7yǎ}?H kNn?}dg1;xRrԩkKP Ay~ ŋԩSK2'!վ}{k׮뱺}w @M3[}՜"P~}"BeFMd`nfi5        2K#  \/^)5kl>G@ G;vê( ݻwAkNG;fKqMJIQbj)TEAxBNQܹs}?x`HuF(KaSHL`1?0aP… mѢE/|_aK`B)[Apk.lA'XYӲݭL}jk}>d_<~?KA(dΝm}ߥKZؖAMx? @i  .ݞ>W[O;,c s : CHP ̢h1         ó,    ٠@@ bQO򣠟e˖t w5n裠)o%?AOWH% R 6ϘŒJwA4 =ڵkW,ׯ?_;vԩ+t9#Ԩ,)26ˬN LL2)97o-XwK.5hc= j{ jJr긕%Rov->k_ ;޵kW֭zi L)@L(rL̙y"p?pԅZ @ sԠ : CHPEEA&(       D Ȕ2Q@@@ ty"|p’nѢEB]֬Y3=Œ3$OEB4% UΝ;}XG)(x̙3Mu֕LJFv:wzNR5r&@U)36)HA*@X8{l1c~jNުh]=vam:~S/4jY+ R=~~۴iB={m~   *Ot@ K<~Y&/5DQa3۶-\u6T&) *@@@@@@@@ ABi"  5 x ]̙ϟo3խU G1b+D/5jV0\Phv|7dȐr96n! N>3{饗|x.%J]Aݽ{wt͛;\~/\6TU jP'|b'OSڧ~jfr|o z۷z֧O ٳF&L)ڷR:. ݞ;w?BN0/xL8 ?C—9 @u\6 %6Ӿ4U6m[Dd~hwdts"℔fCw        d@ 3K@@@"/0QXr͘1w kQٳMU꺫{zC==\X)D]@ RWVQn`N<G*mܕ t~Ns,_܆* (6ހ@t&Mdhlcǎ>O۸zUy>!7:vhJDYƦM;v֭[ M￿pv Z$]mjMKI3A@ 2[WUA'| DH@۶oPj3:JdV-N       1 #.  df]`ǎ>gԩ6eSmuUV>Nu'tzi;w7!RwgsN[h͝;̙;>Ӷzj?zkwv6p@5h YvnMR@ q(P}z&Mc"Pv(7|z-}7n?x|)$C@G]0=}Hɓ_;ӴoQF zOa@*PB *@V2SNs*;H"+@dd]NW s@@@@@@@@2*WNg#  UXĬjal]|B~>#ǭ[ l?.@:>wmڴLy79*n.iBGʕ+m̙){=]}T^=}V>},//oiDڵk]z \v/.#<0gY&mф W^wyo ?ir׿#Gleb̺q ۷qF om_~mذ:t`vyvᇛB) P-52wj7E @A tnP6m2k0@@@@@@@.@dI    P}]hy3A$&pI&w}ׇ?jXflȐ!6f~f ݻg]\bJ@N(u6uTt4ydf֭ƍPQFA䃹4,/ܹsAH['v¿x ׿e/-]ڵk=z4Y\b>ꮺ*۹sM2&Nhwye:tp v'/@@ (r꽗w!$tw DL-BJmˡԬP$̊EI#@@@@@@@"(@dUF@@XmFZ@&6+@u GU8ug˳={SO#b1[`t瞳n4|6vX) aÆeO8C-ZkV@H ۬[~fӧ+l |ۑ./؎=XoVe@6l0]qom/=#֥K;SN!N@R@!n. 8+G@* lifM mPJ ,H;RI@@@@@@@N Ȭ[4@@, HtVPw!0sLm/To@F- . (ȵ{;}PȷzwwyڵyG1B\J\˼ycǎ֠Aה!>LdKj4i${'-[nw}p ֢E՗ !Pzϸ>lO?۬W^>֡C̊"DL` s7S0wU")hlÆLI"@JjwH,8Sj f3G@@@@@@@ gr4@@ ۴1sY {=ˬsζ~c=fC ^x֭[gop va!UftB.﴾뻮^Zh]u ZGh]uFzƪQ'B/r)%{o <@;wʞyG^l Bc\}6e=8Sډ'hZ&!%0mYFf]*@ 27| gifWKm[vd@Q'@@@@@@@0 {R@@@" H@A*|O_7u9c M9xԇ %}V6[ʬu(՜J`@q?׳s=o t钪Y2]"#УG뮳7x>;cL_gaJՠ d ^VV6F!U J\@hjw Mu%um^DBK "QU*       @ e]h   a #zZ6nh}x۰aLir\^z% Laf_@Z7huZwh HSntQzj0") HY]`}מymɒ%v7!e r `cǎ'|-Zdw]|֫W/~#C@"- "*$M ȤQ2!*{Vrf@:f۶%82!A6lP @@@@@@@rL [4@@-@d˼+.!϶e˖ٿo?~5i$ z+кCKNQX1Zd(r͚5Afyf@f͚͜͡[n>tvZݺu9Eކ@tp+[oվ ;3Ϸ#Gڔ)Sr"9"0}:A9i&$ 6$0" @cGDerv0@QAZb@@@@@@@ ̦I[@@@ AF~Ҁ ^.ڵM6ۜ9sg?i&Ese Zh]u-Zh]u=,A9[@V k6kVV5$(d;v/>SOZj%8FC@iӦv 7gϞ6|p] }@ K]Kd!uG 4nLdrE]l̋ P:u̶m; (T]AAf@@@@@@@U sun@@.+W޲/z]Ẋ{):f}v?ӧ>㯽qȴmK{㎳o9zoܸ}Q;Ӭy}e [jw}~o>#VO@!\s <خMĽkٲe.\4֯_C?p;ꨣf֭{Zhu9 >:Ht-;Z֭˝ݗ_~i_O+K/M# \~^Ƞ@ ü zs6a„ Jk'N!C>̯UIjQmNF+Söi۶oǸqlʕ@ KQ-uDR/Уχ9 @rA5ej[8T/9Sc*^`Ӧy4ly1@@@@@@@[ ȽM  dD`sASUZh=C6gΜڵjM:@" ;;#o#o ><2N{avVj;*綾^uږ5l͚5o @m`S@a Һ:n_4ֽ{wo^|ٰaxv뭷4:+UW]a6h]ϞҺHT7|ӺuVl/^l&Mvrǭ{OХS/q;(wuֵkWkҤ԰͛7;^@ S5 U / Mg=2/>h;W_a[T|UdO/WUqgϞmm$Bu²?S) PdNf͚E H@v%ӓi!.ZwNܘ ԩv%q- @Mdu@@@@@@@E sqf@@( Κp4nܸs95b~~͛7hܣ<}^Fauܕ23gδo}[QnN}Ȑ!6~x>}-:taM{.yKYze]tQ8=(>Ըe hB}=j3,_~ȑ#˜M7QW6[o>|SjݣuEZ'iݔʢ`UVTRyeU4^;>Svw_C05A|^zv 7ػCٖ-[*# nA\ZsYU.]{}UUyF5| j8]O?ݴ曍5jL-*q%YEeyӦM8qi+;v@z 0z] @6 (kǎllmB ,R+۶V1?        @HH-SF@@$7\p٪wUWo.r}KUQFT`T&M0%&_ѣGۘ1c瞳-Zd{#ݾ p)W1kk]>,k^3dx'6ui1R}g7-O<чiAk)uEZ'iݤuT*Zq='Tmomرo޼sMYx$ (Re֬~xg}a&ڴON;͇?vaJQ5Q}jKo[gL?_1 @¢ L}{ZfL@ yCI2Bfu] N@ٰa@@@@@@@@@{_m    @FZawrJ?-[{4iY0`G?:q뭷?l}n?M &X׮]omۖ@IDATj*;mԩָqc;sJF#.;>ڶmfƠA{]q~5.r{76U=>_$Tu:p vGWT??VϷΝ;۟JXxʔ)OOآE㎳%Zv[6w\>|^7j7yOs1>DoΜ9߾Vg5u 2d6mڴJR-bթSw_ZjU>U}/-WXag}vAYCLtTn_SNO>/+U.;}xRYK/f5}'v0#8žyk߾}0(}2i H l_SYdGy7}~ߔ9ۉ'uŮ]gqVzۻ~z_wm{ov{GW_kƴװDʯk?ZeD8$S@YnA]Ӓ}{fϞk:(",X^?a{mP0Ry;v>#Ϙ1îZH[mOJo'٠AvE}Z+Rm~ NRl_>B /ySWvU}^ڧ vJv /?ϷYX-˴{e~_l2>7>_Zjŋ6^~Y6mGq"TMd{*d^Tд}Iќ, @*ϻn;iTLi"pa) #rڮh@TkJdTD@@@@@@:wQ|)b(  #S:u>{CKybu붍u]:ֿرccӦM1s lbzrQva~ vi1c.DN/\L{0 㸀믿ԩ޻w pc6m0I… 4oa+z1s:\(o~ $kѢEl1z7n\̅R*3Ir+x-3gzsRg\ȢoGc.45vX.Xi.4֣G YM4Gp=.yyy1S2D򗿌{ kC :4-c.&guum%R= ?0WzɅ.oB~b~kYòUeש&+['{9k=*/0b?U^y=_s:hUYO~}uc.(QCzyrKvq!p1_\]_7o7>O;:_"悭0P?}-.]\`dCjذaLE ;N_M @ Çb^{Fs_/d?.Xя_\A@EX觫\boc+h컻t?L 'hzW_}u83uZL>H~ c0eyQ]s̅;/j)R?z֭[cs!1XM/gZUglқwEmPo*'Mh$)Aυ#$[`c>)6Uez @}T6;fIp?cIA bT 0Dw       s7Q@@@B xYAAksMlƌ :\膭[ξ #FXƍͅ r?ɞx 8qFsz%/_~=.P\|5bc. y܅ 2c/_@1[oalپa5kֺuk{? 1 b.\ho^~g|`.\`Xg؅- ۷}'ϺK.5j.\ȫUӸ={4>I~U 2_KԩS\ą Ht^.&Ol.\ "~Hj< EJ~G+Y>,kX˦ƕ@eݻ'm9kZEFZ2u|Hizmc=f^z4͵f6S{Znm]8mٲŦOne? |{]R(J(bk/W,د]vEAIw!=ωn6dl|&3;;swvg$u52V?o&*k / ]t+{?Z1a2n8_v^noP<ٲvZ5j >|u*'N}l+'$$M('`l>aQ4jϞ=Ү];ol87lۘ[C ͛ )Ϩ񫯾Ns=N~,;n̜A\cL:._ 6L֯_ ^4~ [׸G]λ>[Y7?Z!Zf̘aOٖ}@ hd˖zߙ5Y]3ar{|ٳO䱻Y05%*+3P@@@@@@@@ v"   AVVi`x,P~}j*g_N蟆69>2w\;f?:Gtӧu{0U9K.D*ٰawya h@\Ȓdǃ ܹSz-YҬY3믳lrI0] A og "9yڷLEjq}Nv;snx_:unwom¸q9f߾}}} x슶9s973JՐm čMœ^/x׈N:Ʉ _~΢vk\/<4?\ݻwz:O󼯩ssO h&@ i  A@ UNAaҥP1U"       _AB   @pLԮ]lhÖ-[dƍ6\NFFk_=gLREçr+XohXͣ>*W^y,[L~i)Qt1jN8a#?c/6`i_I+AZ B뮻d"2ٽszi uKOOCɓ姟~#FJ4ʻ_{Ǐ͛'ǎLg:竝WR%r粛4?^lx^SԾ__0l0Wa9@ 2B@@Yg cid2o        @d4%ڈ  1/iS.6hP]TȶmIII}ܹRT)oiҤ-[V&N({5 0MNcd ȳ>k#/킣G ̭|ͲcKd/",Um H=6."]w}}G5o߾l<}t_iF ٷo_\]8/S3f̐ۯխ[׶ȑ#´CY|}ˮ&e:_=y;5DPˁ܋D1i^/&MdkۨaB|EzNs]N*g} ʪ^,]TOt>?6񫯾ʴ"Eȇ~(5k֔;Su? eu}n ;K㘁@6M @9RDnN[^Î|AwK/TUwy2eܿ~hsv@nqRpaphzQG_' k޻i>kW}^|ivWZ}nZsCfܯ_{5՟~vð[o k(h&@<XL"  @@whT@P */#       A   |'{ijk./ lܸQVX!{ Ky[oɲed{[lёkpmf1z%?^=QFҩS'ٽ{]~ݺuvCW:4DNz꩒(˗aÆy"N4/]NC4GЫڗrfY kԨa4DeSbw<+dX{+*s!XWw)=P+Z>cod̘12|9~|嗲xbx@K^\Z\9astMres=g`V-9m뮻\{iuh@ݴi촿?mfu9{^n4g[·9tle1ۖ]cz]xWGwZx:;z-oqlY֬Y#gy }+&uZĢ5=9i ZsT k :h8=F|4v.G;L@~G6jȐ!6l>i~x_{: zmؾ}S~W ,PHÆb"ӧ9OCٜ2ydZ86'Vi5|]\thd lкk,ٝ3{M׻~:MwFv]W X>ٳ믿W}nn%'S_WϹ9҆N_|^@H9o a0a~1B~JvTi36y种Z'55U *@UK= !0'   @42--HS-A0ҥP1U"       &0$`].(  #&aNc( T]j\?e\iii.&aUsmմiS mt@ w[LЗ]^5j8LPyߊsήիWLLeZV7!3.`ۢE [G"E\]tL@(Wƍm]μ{e圇vlB\&ʶSեK q: p ~RRR:9/S<ȷ x…#+ko߾.r2\51|*UL({;^6TYNO<۾6W}44'S 'UDW6mx Wǎ]>eMUV.:묳loF{/O|XL@{^vG%K}5-q)hzgؿTTI~G1a.Y9k &<7nಈh]Nav*&QL;VL0W^n9g{?v? 4b_q~5Rbńԉ Tu|q=n9Y:cokrw ˕G}TLq/ApE{ݜoS:Y~pTغu}>e2i$1lT[C.PcY9n}Sd޽{eɒ%b5Ä/ 1^coB2ڞv^ߋ93bom­K.LmOOGSП׋wI͗kN6⫾Ti&1Aڭ}U͞ԾU5ջ8}ls8 @p6m#SkDeRMgĨnż8jwE@LٰAَ       D@i@@@Z@?kha wAE֭[hĘ>,[m3vѢE 5RKڵ׏WX(QE|6_Kw.wuhxZ8?amրsVigM5E=5E[5HRg@]_~Vwʰar]. xt}_zS=N[O՗Wp_=7gN$!GO>@F :5Tж;︫Y̚5K}%Yw,鼏=fk |mC`MͭW_mSKdW}!)z_ 3boݻwo? kժh[n=?D[0׋מJ{Jk>S_~/~հW 累_r/ٿrz/N5޹sh?`<=\mf  ,Z$Kg@@@l;T(DWe:Q\       @ S1!   OVm_|!+W o"xgy8aoر#3~x{婧/X#G?իW-w^[u -Z不RJ| Ps=Vٱc\ L5 ~5\ ֱϮ^ &s^+ dn@omxU֪UK6o,Bj*[o;ۥ[ +0D)4pРAՓ~ɞϵ+iQ:Ur{]aB/_зȋ籍_ywy W={k./U, @ ,[&&,;Fs@@1 ԢJweTOB$Aeʄhcl@@@@@@@ren>g ⧟VC@8͟~^z4SGOtI ɒft"ݺug}6vСC6^3b_&}K/T?|)_|XgOYbh%\"ƍX +r>7α'\ vAꫯ?SڀnA⊐Ɲ}<_5 zȐ!D䢋0A t\py핔>(t –,X t۷o[l>`3HhjѣGERbEχLIc&֭[ooF~'\ +m۶!o~2t/l(Ī@r"='2rd!ݻk9yWDr5?iԨQnyaJb險?/R5k&{ 6L)4 @ sj*wy5@{lٳ 2o4ݔ)"+bLw"]{wND>[J@@@@@@@M[   =[<)& *zLKcC@p~g4M~Zf̘!_|;VnFIHH>=zIjD F4|Kq?-Z$ 4cƌnݺI…i|ECbXP@(RG4 4m*fM4ZZjO}'K2n8ի >_$*TfpSD,\SW^-aƍ2`O>1w!@sKl~ 䵀  @؂~!(h8|XLhh)mD@@@@@@@ 6Id@@@< lڔ Ayc lRVXQZ"gu tKLLg}V6l K,?sε&֢?>L6M'( 3y 4s}9A zsE8C wޑK/T/3ǀA 4Q0b-#7php)"'5jԐAo-C \ڷoo|\wub믿&2_ ijAK   @AA 0J*B@@@@@@@ _Ie%@@@hdbBHPU  ҚF{)fD&M]bg }>Ə/'O »[eȑҭ[7"A­[֨ ;vL̹p֬Y#5/X&L`!B * 4   YX 8 Q=HM)]:@Q        Y <   X >IGA Eb1S9;?ȥD{v^ŊmJǎCҶm[iڴ.\س:@ 'O -Z`̛7OΝ+ϗKrs2x`7n y^^z%6󇘐XSޚK4;|9{ZjYg%}38C4h;KF ==]~wz6m9z+=!!!n[VZIՃ6*E v%K.âEDŋKjjh`;u$W\qkmn޼YkyPDY31Ej&H 5_~vxWuhʔ)?M7dCM[Ϟ=G6xXv Cs8l>03f̐$;椧!&LA3gKпY0CF@@@@@@@ ADu@@@Dȷ-X ʊsꩧ᪫u [#uꫯdU@H l޼{hР)R$Vh..7n+We˖{Ӱ"=?upkN4鹀*tK6HvȐ!([B N6ի ӗ@w5J'5ho/ѣNܹsgرtA6lm" kqI7o̝;Wf͚ekJAw._}]ĨmڵksXfk^hغuk;X,r}Ibbq'"JV-2eĜwDzј(0f9yΘ1}O+Wƍc/;lq%hij$۷O..\h8v9 >묳﷯ڵkGBi @ h@@B @dDΨJBA@@@@@@@w  4dQA>w^RJXmՀ޽{b Yr [z/Gvj%kVN[l)F١qƢWȟ)/~R\9H@ DMhcl&Oj9))~o&ٿGrKϞ=ElH%KlҥKO?}BjY lb^ΠNVzlbڵkc Aõ)SƆdkX9#[ 4&@  P=  X y!D@jjFkKVV@@@@@@@bK :   DM 6!"PreT3c x4OO?=V\.ڵBn2'4lOV\)? ;z{… p Q ұ1snB w5ܹSv!xϞ=rISɒ%mHڷo_W:hhim{%&| }L}m6Y` 0'lƩxRJOqJbŊvP/_!1S8MrR߿Gi}ݻW8YOUZj&D`ZjH}P .ӧzJƌ#> @7C=zMNNv?jJ[li4̷W^=~֧w9v올_^6&4LPNj-I&=yl;cppk@^oNJiii/}j vgg;q{4 l֬ gEb?"[njD@@alA."H 551AFA)       q'@drv@@"I@ M&.I-&pomO}ܣFֹ|rrj`bF^. >wH"!C lٲvi}\ڜt(UTqɒ%E%J: Et8z{ө3G4yáC9BCAdcAr;S?jB3h3z!{㎠m@^3}1T1107~4/))tR{lӦ ~ߞ={0P(iEv= 6oٲEnj5RRR,ڧ> k@ױN?Oδ};/YwE]:~XVڇҾ3vB`mgcz>kjfΝXuS3Q@4'- B{@@bW cҞ_,Qe_@@@@@@@M h;b@@bJ@ ׏]bgPo߾6fʔ)2lذ()Nhd=qZPHk0D5GB  0i 9DO7f CCt(^+V=x>.Zh3iA;A7 ރ_8--ǏwO<}@f٩lfhLM ԬQ4iĆnj錝& A (-b䭷޲ZZZ@ 4nO։m{M`/WZeڵs9Gx ѣG.\Xj׮m\kv x4T DtyYq}.9!ڗsh^gZޏ q |iVڷr/ yBB; Ա?j@h Hs   @̟mm '|#@@@@@@@$@d,   7+!(&M"2#l-p !E4ȑ#+ɨQeȐD qu+:c`Fϰ  z!_A:;H-I{S:NHbc rc_7| k+Çgo ĜE֯'2BIHvL6lӝ:u2}!ҫW/޽hs';iyAiXsዾ<93ϖ]ݜ>g,i9+cwk 1%A]S   Ο͟0)Ds[x񍥁       Ĩ<n!  @tl$b2H(]`2vX+ *a;e˖./o)["W_]Tx%99Yf͚eGcK"KJZ"EVhMp/_)q۶m6K.2bL^ YZj  DhիE"4@@p wQxÇ|a7"       Ae@@@ 4rȐHo% =zH=a (-@IDAT ?.r"_-g" R=&~;7Ϥ>G9q&иqq'Oŋd&t]nfŋǁ dXL$= *E֯gDA ~WyWwߵeq#a̙a9 ?~9dSRRСCRZ5ٳ<#6Q .k}, ěAj%&$;E@@ | _ JA  KV>@@@@@@@b[ >  DM_?IJ.{W&M$\pA\;;;D$brYK-DѣGk~R@  8}d'*fͲ2sLsjڵmSO=e[l]G@ ȄL"  @H'2$lYL+au@@@@@@@(Ace@@@ FSH͚5@ݺu3ΐ @I][i^NR۷˴iri"Q@MƠ#Rj$0>tAIIIIII2w\IKKFG ի4i$>k@@9p`+au@@ȳAy5V@ A "       E ,$@@@B#AVPhVG@wnFٻwTRşUXٸ1#dI[^+!fvE \Voፍm۶˖-3!LQ=W3Ǝyή  @84qz6mDʖhc qD&  @ ﯀ÇEʔR@@@@@@@bQ X<  DAQq⮑e_s5+ѣ~J@6Ve@֬)"+g  ݾ}y/h`EFdIEM z>ΰf)ZtA/cǎD@@ #ҭ[Fuu=*%o_k @@r?8B<@̯eƌG ,]ZDX@v:OBA@@@@@@@ :k  d P.H[矗/R.HkKEiPdd "a40L6M^|Eyw^zahDA榔/_}-[H%OK/TziS@@'Ь/$qDnٶMX1E7Gw$2dH~k 5#  /[IOGXB볶D&N{_c        @ 1[@@@| hP4FeAF,Y"һH"&+! A`߾}rUW6R˜e_;P@@@@@@@@ 4|:/4l@@$iS3#pIر_:bEC+fMFdӦ"}Gdx[ˤId6-D@?s9r̚5өRfMq֭PB! DAN*rx {@@A \tȲe"滠|u>b&       I R-   A9\<2p@?o>RE;$~H"uHٲajE B~w뮻Dϕ* hΝ8ŋgT?x𠤤ΝkBKÆ mS5k?()  -[8{ N |?\@@A ,+\XEZ+2n\F>a&q'l=曒w#kulZ~$%%Irr^Z)bC {-=WUZ6W^rgH>}BX  P t9t{HMM#Gsѣrq9vXqZZ 9)Z<%Mʌ/u\+Ҫ$;9ŋK%̲%K4PڤI:eʔeA*T@F  @ 9A~z=zC:ӞcWnJݦa+e͚dذ^OA!s|J{:ϹLsڹt<@@@@@@@x 2^<  a H  mÆ >@F) .m@{ |ȝw<Wd}9ģ뮓۞р}F 4d)-[)q֭C;wCnݺIr岴aʔ)vݔ,1@@ 'N={a߾}agrA>|vJ АE;X3F_cy Nhd3BdÆ 9g>hNEA`HҘ *bŊRR%;T\=Rh>OdN<    &#~{_=zX@ y-Z}ߨacF]ϙNf9iSsOf t!>;hRyQzT:Z?E۩ sxNcރ~Ge@@@@@@@"E H9@@F@ ׏eGcPW_SO=Uy{_4cȈ".׾d'b <B53cHӦ.6_{#jM7d5ҟ2p@u)  @۷˶mxܹ3Ӱ{nEqN5XBk׮)QC)<'B,<`!h_]o54DKCL4rP/YޡHBVVMjԨ!5MG]δoD@@ g]kfh]Dt;{N3}|HN:a%Kڿ!x51IC?f4,RC! M5{OOgZaY7~WQ_'R ^zYzuhR@@@@@@@Ag{   AK ի'cǎ5%\"m۶}XVD=WgUF _Zh!yx@T l[LO ;q̙CADgϞ ~2og]ń_~HPi%))IΝ+iii6|F}YѣlJ},yIyeСla ķ@jjYFV^mu?Ӣ! džjHM|P Jiܸ_ [n4cڴivNFMJfL{SiРAL8@@ z ̱{A>g#8c ,8cǎ6O*Up%Jp׼6ѣP',k3f̰Et;% YN;//p:/B       y 2f  H@ /P@ 5=MNy饗&"\ b> "R$*p19Zj*@ +&b2h|^/۲}v?.YD\.hB4oܡeʕ_f6@@b]@b˖-+V}$ > ZА? ֭ lhB5A(+PreѡuÇeƍaw NO>]&L /^ܾN/X5  @OV6{5qϞ=_=UVu/)Sƽ$_v|DNs; BH/0YdĉOܿH t~g%; }P@@@@@@@?y   !8xP CHΦ(РAydذar9ȠA5׊,X  N'Oed?{B@ 7j|x֬Y)qڵ6Xd$֭cyO7モ)S@P@ 6K/iӒMP ܾ}*UJ:w,]vCvҀ &Ȗ-[䡇Mx @ZpB={̙3/_\4 tw0x`;>SvqmLFx}i̒%KtR8q<6|FH5}@4  @^Lfcu^^V\o}k p; ~gi:Cʕ#`J(!7/;EB~'yСCv * C݉R@@@@@@@bO˔@С5}ij@@p k }+"<(R\x3zvaÆ6Dpz,W"^("_ʩ(5jKˠAt/h68v̝;>&''KJJ8p@(}v={;J}UyGME]$/Bз@@` ڵ5c Y`hbŊҡCҰ=N9H>"ԟ@jj}b6jժ6RC%54SNRdܪy2Q&s 5ؿQFE :͛uǎ>/s޽Vτ;       AFq   kAe<#F-ZHV&? F}S C⨁'KΞpO< ~L,T1wnCB 0`@hTZ   ֫WOru#^8 ~cInMdB@BLܹs2|4i̜9X7iD f ,b5:V@^;W^-fͲK/$Ŋ3g>^|V! U M -+W?,YD_*]~}ym𣞌a)B%R2g,} @D`vAիWx@"rd]@6tƍ3 Lcǎcu)* aM@~ۘ}3J֗@@"s'?X5z.-ȤIeƌ2aYp-ZT4_뮻NҧOʱgCɜ9sd֬YW_.С.ML !*      __qߘ=   V佘+= D@Z?;S/.FP Old1!C Aٰ ݻ׆>?\pAʔ)cO$ܹ]^}~e]Ё~V`L/͛WzݳO@@ ϊm^j*VZuR.PlYym7ߔRJ{Nyl  |5ko-SL^Dv [zJ~i5j!زe|ұcG)Y*THYl4jHM&͛7˘1c@*xDpOymRLS  +VHݺu]vҸqcٶm?p^I }6^<(ʕݻˁWE@@0 5~RN9v|}vyWE>CoA3H"ҩS'_ðUT@@@@@@}_Ej  D"\O)X02C+F <( jذ7N*>HL𖘓{DKEAl@Wz-7n &BRܹsvZYxvˤvrJ lPlقچ̙/Tc@]2`ݡCϤ@B@z䫯c>}H2e^?Ʉ   /E/={c?"-@ dϞ]uf+W/,+V֭[ˋ/(W]uUP@@@@@@@H 2Mڂ  !-A Kդr\`Ĉoի|xQ`1K˖ ϟ]ʤI#ڶmŠA@Ã/_tR+׷B2dC R^[3gR^FJeĉRF y'Is84iDd"s̉ox~-ꫯz" DuM66mZVZdڗBΟ?߆.\P֬Y’,17iƻ+=zޣG`'VgC3fٳ믗G}4 Ak֬YһwoM&>@A{%z8Z֬Y;D[k./ߛ<^T^ڷmygx,}aұcl>'͓C:Ξ>}lݺ5ݻeذaү_ ZYL6]*_jmLRF        &@@@)}HѢe#i̙.V^=馛dÆ Y0թSbDʖ><CHӧ宻)SNd*,W@O(OڵkK\lP@kƍEכ9s=N:!q Ϟu[>k4%/\ ׯk׊vm_ K ]tѣGɓ2ժU:1o'<kKNij뱬[n$. *de)Zy}?gѣ VL>MmXi5,Y*?@@@@@@@ ?0Mc@@@ xsZYdٳgKѢEn'3gUWH A '5_U{P@ i=mڵ[oI۶mEOh+Q ؼyy2g9x[N~mpIk':򩧞ZjIӦMRɕ+ȑëuݕ*V(7vw;wn{brN< D@mSN~  ?U' v4S {|*V%5ot̙3idF 񽧆{~Ä x~WW_o|cr =KoM>%w7}.Z/DzT6B97o^P-V*YHV "#cƌ>报ƍCT@@@@@@K).5   @ fO@嫯믿cvEu1yҪU* csT@=4$SI pIY|,^K.#Gjj޽k5jHLPRR%{%;=YXSN`e˖.^z2ٌ@@ L "zrTX11bޚ5kdʔ)ORxqOd۶mr-?nF%K>s=r뭷2>,_|̘1CF)8ɕW^)C G~{Wm&7t >|-s΢C--[@p]O:iDŽ }_?Cm}#=zۍ'!^4\k?Һuks< 6ntLP^X{ hT˗gyFk8s}>t,^zؿٽ{19'Ozxm=/rwuϩzQjժc=&S|+Ww{< K4iҰaCy'haD'M$zq YfJ{W{N~vݻW>i߾+sNoa/رax}ʐ! 8PE/^^RݯkA-hd׮] }^?٩ s~k>@ xz& R:uW/M(KRJmcO/Se9@IDATAX:XVI}6$O;Oh\XQ/vXo7yĊlO%74h<       8>Zv@@"G`TɈ%pKs0'i;+Vt 9:*fv)Vq7*Nu p㘓sJ"G@_Guj׮혓OfAwq~gDŽDNi[&R*2A9͖bNtLHӸqcVcҥ8&y'㘀Cv]ٳv=' u]gΚ5k{>nml8pŴ^{۞r@WF9&yCqK&sL}UTqLXod¶zw1ӧO;={tLc.`7a \s5 :tLJ&N1?P:&ۖa+2erN['*U1ƍ9r8&>7ؾGf%m\r eu/7$deWA[ҭ[7{ !٥ P,Xi/ۙ@s,QG/b-,jf}߼y \ŝ 䘐Do3fĉNB}]L[]`uiӦ au0 u v5?Q!зT:3ftƎbDŽMuH=U?E߫ʖ-tݎMc.c neh9Yzۄ;&:{vF}1g~?~1vܯeCڵɗ/qbN$`>3Ŝ%`1bN vrS4Wm1᏶h &PFɢʄ߈ b7xCL8|ϕ4rH1.`E F Ç\=ۏ?lذAƍgÇSNbB,@@ L胘~D(8nɄ& iU3~b m(W>%&BL(=Zve~ .(&\V\i}'oMȠ,1Vǣ{{L0MФ +uɞ=[% n"&d[Lh;J.-K. l!&xĶRJ~h˻+I_Z/I`7=M2EL(0z}j?_&oG;Vѱ}hy\y啱k׮^zI&N(ڇ5OmB@} ~2`[ޚ5kxт G}Ci2!#nݺPuA 'w F;/Mf 0˗cm{Ǔz2:A?ZliL=ޠrwi=te XAbZg&~6kt2v?  jO:0>/&yc>_G駟8 */;w5o%IXA[Q;^:nձN؀=&`0=JL7ƓΣ~'@@@@@@@@ yi:k#  D ȔM Izbb… z;|{sH߾bN~;D RF![!h%KHi@k p SiӦ*THJ,iO߼y ?, PhL&s I \`"7+D]J ;eʔ)]5kV{g@ƠNDA> Evغu pg Rڠɓ'hx]AYkHñ4<[5pK;wڥ5|Ý4DBO>ޕRqTZUf͚e{k;zWqM4wޱ+Ϻi]' ԀK ;ٝ6]P:in pԩK͚50zs=B 1:iNy0c`2 Tv? 4ֺo.ѭ[7{BbG>LOڣG!b   $yҘ?oƗFcSZ :X&qˏqs~3nq;r5hЭ{aƓ!       )@@@@? hjbB\rTR&zING1Qw7IǎbBD (8{tՆij LDo^6m*9Zzuu1zr3IǬ]-g˖-^NJ  'ɟ?,[,d*_p@=&4s$wWuߓ1cFe͚5߷I`VH.7Zm۶LGٶmlR4BޞS 5W ~XB[irˍo_z_COhXٳ>_֘_hVw޴io2`[|b1co>EԶ%.]*+WNj5G !n>89Tcc)_4|p{ ~Д۾~:u͚5Ub&@ 腅͛Jx>o<c|yE<ܥc':wLw-u }/ϲ<=m>܇/je/tlSL        䛱   l LܫdD@嫯*UHÆ mU$m9RE&Ns?@}h'|"74+J}dү_?U ,iҤ te4hPO0={ HPLJ9QY̩S/K:ud6F! 9uI5j$SL7|dU/\`0wܢ'ڵKok… ۿX :^^u=cqKq링:ip䧟~jdž]tXqnϝ;'ƍP+iJ֭ckӦ=֥mҶiper&[䖛оsjG\$g>zfkFNgܻ.[CÖA6}6-jV_ 6<}OMWjl~|cF2dljF%nXg=o'yiʕ'N=Fń \Ϙ1#Ib}$i0|;+POrĚw_ ;ew|+BG2eH-BR@@@@@@# ɢ   AsG#'Y̙30y9"O=%2h9 غu W~[44z6o,|hH(P,\Pj׮-&M;wʶmm=B zѣxKOx,G5|FOՀ J:t jZ)]tGaokCom4 R'qb=ADxNV,}1n# @x <6,J(0% 6>j%n)n]T\ibŊ2|ppmՎ?nq=qH={Emq׺ʢ<%OJ;8i 6vKjK{eObA$7w^:%,oIjm9[`buz!Ǵi95)!       mwN  J Tqh(" sQ5{wym\V-ɑ#Xp~2{3gɚ#Fo]'e˖ %پ}=_d4DO뭷lPȔrhNDɜ9e$6$6wQxzK Ѡɓ'PVZɺubvo Z5k]OƏok4(&g{޽{>$ וH褯; #}t2r}6܁ )+W.pqƉ Ӕ)Sl vKn4lPuP}ɋ/(z o>ק~jðt=/Μ9SoƔt8`o]UC5|:*Tjرcm]>4lpբ>L֯_/UڇǤe_Dy;%f_u֕ٳ0NQ^/lݷ;5^';r`0wĖ0ҵkW}'ZW}&ԴiS{W.]EcZnmMoz{{C:/kxٳgm{(,'4w *QJnNzl/{{.u]venR9sbŊń!k8NZ~-$yzLJ?6lh 9W]uV@ 0^q!}ań>o<Ca^@Ɨn_Ag.dc?>X`?;fsRWv2k;_n;y~J:{oxSOρusI옄7{to؋&@@@@@@@ /}6n8:3! DԩWO&H@K**嘓ĝ;Q;nM8˖%!Y~.]:}ɓ'#q&>@DŽ8]w%K3'wU.nر-u֘ք8͚5sk3&ƩR}MxӧOgƍ peȐi׮cB!m?H_uqVZe+lNUT1Ḏ uL cN s2ӦMzh9Ggܹ3's:&IXdIDŽC9&!z !0|9&:c+/EDŽJ9?pJ\y)\}Վ ,t똠˜'bW\hot~'9}!C8Ç U\M@-WF_ccK솹Xc.J`&i޼?lGپׯs9Gm&)\3tPgȑoǙEkuѱ]wp[ӧ]GXhQ'I&T.souֺiЄAMS\9DŽ9M4uѣsĉĪtc&̹b}^L{1bŊ~} =کQC@2dDŽĔi"c>nB1;179׋Be_mݫWP@ *jS8htLcth` v/~sM)U}O٩Ǎ^zLO̅E=9c9 rcR&~fv٦}W6?);=Ct|wL&|I}y;Ա tL<~^-OzA]qfܱ)«xRR}ݩYmWrz-^)S~\`,g       @ /}2isS}R  i"]1Ehd,2~=x0Ŝ!-[?PaܚWEʖi^7R_% NsĜd%>hW!K`bNHs2]nذẢtRtiiРAlNW୷D /bN(&QLx}[nE̙#{ $G1H*ۄMȦMѣbBĜ0@B[`ݺux?c-&\:> ޽ S &lP fmU>ٳgEgdh۠e߾>~c !&3*iM >1Ĺ>:0^#2]$T.wv?!2Adqj%4bB+.y;/k-Ą )&R^zXEرCLݗ}]IiBANnE' &Emmywń&RecQ_im҈=cBy ]B{%+sGj߿E?<߫9ϧB9voRD 1!cqoBFH?X޹,̓BEb{?SL@@@ۗ4 I}ބژ}|g%>etw<3P˄.qDz›6&䬓x39eEۺ&UL8Jꩧ$SL@{@@@@@@@ y   KjNBsX$*T)5lPfΜ) Lb}_?1']^ V2. hŝw)=Yf b!"n?j_Z5瞓K|B-^9sc?Owydž<36$ Ť!<*TEQ a PreYz ׾iLH)P@j} TI4H3Ls]k{`O^tvz?Otu… :z*)wBe:*HZ5~ _h׮;!Src647<<2RR?oi;a* . xpOO+yұo۶MFeOJ^tAHhJ=5=O}9乍{` RK@q_|!_~ c{塇~٦z?=/1jJPBwYopAHm}ݱޗT.7uƛ'})-#^r7;[7vPW@@@@@@@ T|z!  !.c z5z_/˗/[nEjժ%f͒UNT#1"Yh ̟?XhƪUDA E acǎ' e˖\rIݺuɖ]YdI  yy>|ԩSG-ZmٲŖ9~x`a;7|@  | N:# 0 I8p>s5$`s)L`5\+~ɓ'QXe>}Zʖ-+gq[Ŋ[dh`ɂ چĪ4 @B! 6r3g[o˵Y @ -Z{t=>am~tU4i"BJSa &Mt,_pD_rk{S'_mXjn9k׮ϛҠAG]/_>N P9aMLPk?Pb"EdhK@h?fӦMv,ֻwoVZ*౧J+7om۶A&Pxl0gM>]|M{a6˷{NJ*܇o~Ӯ ( { *S((R۝;ry<5B~չsgsaʏD-zL@ SIjܹsm)W\q ҥ˗/ u`'       @4 :mF@!@d2X^yE䭷$w#WzA>}wޑʐ!C$mڴ^m+!"7\}u8#Ccǎ_G^G _~7Q۶m3L0o?*Tϵx_ y_b{N3g@@_ ,X͛'5jԐN:ٰ\rjIs)s =m d]6}-[6Ԕ~qɚ5 6;vL8Q;foiUW]@ |D|v@*L] An;c 0a,\P-*vlRZ>x'|~|Uϙ3GB!֪ vWI&ҚL{@@@@@@@8B !  Hz&Ho0=zիeɒ'OT+sb/ gV`ٲeҶm[Ά쥶LG 9'N+Vȏ?hK={vS )mРԮ]; $ɩ;&_9] )G@ n~1cE5kfl=®#u0gΜ̀.v:uL2ìV?u=رK@@%}y2sL>}eɒE5j$M6s%UX2RDH=~eY#q6iD2f:P8       @l4bߕB )=[" '0m|ko/܇@d l)$i?v:)j*iժKNf̘!UT ND.ټY$s!0W_}Ux 62aov{Mʮ5kȹsH"6~vYR%9Rrs*%{>Z J@ϗI& 0 [` zњYfYǙŊ ~{|F@ }x>+1?d1ΝS#/ Bǎ ܹssNsaӢҰaØdɒaN@ >gϊfѢEvF?.z-Zعf͚6m6>@@@@@@@>   ;vtSTx|.PF cmJݺueȑҭ[7'G}GұcG{ً/(=I?;Ԩp/1/?W4h` +JHQX B }Ҽys;ɓ'L5&*U3V+\ Py'!5 D6m*&Ly@4cɒ%1'%YFΝ;'Ez.]T틍#C`A1'  @Yp|7veI>k@ݺuf͚RdII&MJ6Lcʕv̩۷S}=7nX4ib_ʄ-Q(Rw*ݖG:$/֋pR/.+Ws |RT)ɐ!C>9 08br/ƍu٥?ѐZjYeO4UF@@@@@@ 2jz x'/9 l$R99|!'kΞas={E/ysT"2yrw]~A ">( ~B/\ ׯm6{Ф4ӠA.YHǎ)-@@evk׊ʕˆT^bҥKKڴi+'lVlcϳg XԮ]ێ7Zj9sf׉ @`>< _ +I@$A>K Ӌ腺4R 5Rʔ)#:e9+@w_&3 uCKXJժUbŊ%K@@@@@@@ ҇c3   .;v\iѢRc@ *TH[yGsʸq$_|aը?7ٳêT3w.痥K~0!ѣGe?e˖ɑ#GINuԑN:G-[6od(аeb^CQA@@? ;ﴳ̙3"9l^KyWm@e]f.Qᒹ`~!EGfmذiRn*z 뮻^VZRDh  $(㾦M]I~\l5O?}p Yש@6$R%Kms-";9%,L%HP@Cz%t|}h l߾=&Q5I+^ԯ__ f=mڴ $(`ޖs&@@d̘Qj֬igwNkڥgΜ)h 5\3.]چhPH֬YbX"}lhh͛RC 5&M4rUWㆭ[jժ} @@/c?FgI/߲ek|…sNʮg7^|'zWH;k$uOYni z1s۶m1fΜَCX=R'@@@@@@@Aϖ@@@^.  h`غuGҢE ٳ >\B=DyG|)d0cǎٳ[nezkECu޳gdȐAV*5z@rShcB4,PCB,X`C5A)ၞ _~xιs&8҅KR͏9"̢A \9s&f/2d pO u5ŋ*fn   @D XPG9vܷw^оUbB_0~*W\e /s:ܥv9sГq+^`B@@@@@@@AB2@@@4x@ `c/Rƌ#9sرcVZCb;2'/t.椁1BOܹs2|pZF Yv.]:*J&p YbELҥKTYd5kwaCd)= ` =zqٲ@@ҥbŊ95\PCAvmf Awҋh;kȑ#2hzYfHg 1ɜ9sHkN5To1&@@@@@@@-@d  D%$i2 E vjYo.]HݺuO> /.YyIiN20 `$_`Æ ұcGٸq :T'%%_"a,Y3[Ξ'Pi3A -= Hlipa'7/_>&0S6 7`CC4 wLL@@@_XhQ;'g:s53kxE 3ԥ4 IuE+7g5IRwoK;,1?lo;q;ٽcJCnͤt1=3`MK84KGg3!       .A3E=@@@ Kɴb~DvUD@eȣ>*=Z4ivs%d01"  d I>Ç^W.k׮2e$6}=ykղtҘG=yMO&\ |`Rl5H" j.5D t# rLC   qn/EcDw'jPdX \86ɖ4l8^ f it/>'&!PɸASf$Rǚ:Ա;7ݥ>Ƅ       @ ~r@@@ ~sJ/))m@@@@@@@@  '   @hdڴ" GNh &P`A1cL>]z%gϖ_~نI^}UU+7@N>-CaÆIjdڵRLȖA8ϱ-0@IDATrʉ>jh@\> [都S  /MY   Ǐ`=hdxԙZ"       @A&m   @4P!RFRIbeРAҵkW7n5Jʗ/j,Z$O"P8Xd^ݻwݻwåw&ؤ3dٲe6qɒ%b 9nˑ#ԩSGڷooCvΜ9êmToNɜٛ5Y@@ ȪUC~ @@@O?-rlJD@@@@@@@ G<{  .AEFx#i$AhotQ|AsB}U۷pK5l plذ>.].lb\tiW}vY\9=𜰋 9#)SA @@H"_@@@ V[ɟ?jN]@@@@@@@@ ) q@@@ A@jdٲe$䩧I&/,{Okm_Lb)  |'ҧOI&L2EZn)˗%KȊ+ѣ6ȶVZ[ԩSG P"a A3AE"  H|C   #pHnb.&ҹs4        䥀  I@ oOS,U mڴCI6m':ȨQ䭷ޒUdߣG\qH˖>)BۥGW_I׮]e+W.OAplذ.]Ԇ?nٲEǑRJ>j.+T ҥKN)Г%O$M@@X !/b  D;_/v EQi*       Q"@d<4@@/AE~|'p9~Il|W^RF ҥ ?YcEwIљ;oΜ9##F!CHbᅲ v'"Ą>.[LVX!GlٲIZUV6N:& 4!QTT&@@ZA dO#G@@طOgD}TlY6a%@@@@@@@3    z(bBDҤX'D {)V,^X&M$O<|'v٧Oɜ9s 1{D׮ޔ W_}%{ݻwˠA1cFB8w_>V֭[FKwu]VPAҥKx<z;@@0ؿbE 'j"  0@$gNJE!l       !-@dH?=T@@A@d*U9xP`AEqILH@"ED.,ZD@ >4?{UV+ȋ/(Krw %Ʒqƌf+"`۷K߾}>oFS+qʕr$JȑCjժ%m۶kזy^@@@ C:wqɿ   )"'E&Qd>Ǵ @@@@@@@    uEfٹ.HƌbDΟoU^-&0%p9g]ʠA7xC^~eiذaٵKdBO?MrUV@oO#FСCM _KӦM? (pYv ~\l]6HlٲRNrIڴiC@@@ F :1$@@@"N@gԳM7qG5!       AD@@R*Рȗ_={Qg[n΄@,wB رcwc_/͛7aÆIJlĉ"s|s~;w}ݻW~iׯ /6L>رcG& ZC8#kז;G3gN@@@"K@ u!Cd   '"[L}B@@@@@̉mC/ҫ MR7Q^!"`ᵢ bAT,ҥHQQt'_6dw˖$?וd$gf3{@@ >Z!  @ 4o!-xq^JUzٌ3O?!CX/Ç[JYW^1RDU`ʕ6`S%\b/_>]fg[paGmȑÅ6kUhXWF wFnJQ@@R uY)Q@@@bJl@UcT@@@@@@@R!@d*И@@hм'CB}aC~8}@ 9?M2ņ fիW뮻=/S[ V2{__ vvaw}=Vvm9sj*vV kz>.[;8d+_~ۨQ#˟?UB ( ȬYc@@ m3+Y2ֈuA@@o9+k  ,:u/z? ?ٲe]_l/6~x۷ 2 ,ib֤I3kcڽkqٵ^kٳgJGi9w\3g͛7v< X֭;p*TҵZ +8    ,Q"vO@@@XM%_{ͼ%>C@@@@@@@@ ~mɚ   @& uf^V#f'7/@ r酿kƞy1buu>[bqZ4L6hk׮СC`P4.]}TO?]repf͚Yz,( U  Pda@@@ 3kKc|E>       D,@dT  $-pfOq/!yK@@bH@AjP*   @D'͞m6o^D3       ĉAq!Y @@|͎IX]*?@ k ϟN8a+n){G'o߾6p@+]tam\`ڵvwkf584_Npݶ`G=6ol9rڵkǞ={n5,[lNdO@@bN`vbbT@@@ }n쪫;כĈ B@@@@@@@ 26)+  %PYɒf[ r23ȺӦuTl7|7~a{ꩧw.Nʺ@y{ ;*T`&M.]j^6ÇmŊ.qΜ9|rS}֚6mjs 6ZO7B1Ŕ^3`ٳ %  1 cY1PQ   wISOˆ        'AɆd5@@@ :м>VVM~r^}UK/YNlȐ!֨Q*n .RƏos6p@*Z@dpׯlٲ٩u溵k׶Jg @J [@@ &v4;rĬx>F@@#u}$)        : ntV@@O4˞JLe1gA*RaJܹgϞ֣G{mȑָqc;]_MF8㏽}ƍb {!\9|M4@YƮz뮻TRF~ZUV%}A+] {TjӦMPBq _f'veN  dGRXF,e   w ^xM1@@@@@@@F qP'@@Yrzief^x[̮G42 K~ٽK.=>=zujժe +"Ѡ( .8`/]wu y:u }\r{L>*W`xzo%}\`^j>kРiXbxZuY` P$@@Xؾh -G}@@@)OY쪫/       ĿAYC@@Z޽{}?c~7¶O;tPr%t6/Px Wk#G>rz鑹r ;]_7믿neʔqs̱;K/BjW}Ŋ.qܹޅ/.]ښ4ib_ lܸ.\8VWz#@ ,xb޿@@bN@A|cT@@@ DZ6!d/@@@@@@@@ K 67+  @ (Ja[l[ڶmlЭ C+1\Q`A/%8P\pʕ+'1Ta~W?0 R*^ޘd3B۷/Uؙ~8fp~nWNmpEB aCl #y%dɒVT)7(du/4;LOlٲ6rHꫯژ1cl֢E ٹsgn)ӧO)S3fXÍ.vߚ ,X`VrmX\9;Sݓ 4=FkߴaÆ@ं'WhRF kԨ5k̚7oҲ=OK߿ۇoϟ-GuqÆ sαaÆHrR@E?  i/}}e   +0uyͻq^.!       @ }ۄ!   qܴioaLPܹs'T@`*U\PP… G;K)T(}D!d CQ;?} ?R\ri'x{(N *fکӧ{̜9Bvn6ݻ{\}Yq{YVGI+W>>6D 4pa7tլY=4EA~xmj.Na+VpKz̳W^yjPv\v&L*R >|`n3  ~ܼyy5m.2Sv=kNM@ tMdm5  { ,@@@bYaCͺu3呂&@@@@@@@B wѵ9MVsd>  -0e㼴;j5ʺס֭[mݺu~zcƍ@RxJ.%K}dDWr<:=E|۶mvXn( N'tRQ|yӣB 0)Ēz_YZL=7n=s.K.1-~.\rϜv}ykҤRpSN?_{g[+/pRճ\r2j&ZŋP/>3I:umF^s57>V3QL>*qժUn^kҤ{h7^*P@ @z ryf/  #}c˖)}\@)Y(_ׯ˱5o =}mӴ\W_5̻Usf^        9c@@ (_~5kk׮u?&T@Wzukݺu O|z(x/Gix@R $S:#>I._ڵ+0|xBV53g۶c׫W/k׮5n8! z`M]Ϸ3fشi\fb/K/KeD6P?*}G=pLG.\=^tE2edxX  pռr   1'}Y1Wm*   fkvU@@@@@@@@@َx%0iZI2@@ zL1q^5FϺjMvi?ZxO?ӭB䨰nbzg!ݻw@H`B#PB Y*Uܣjժ[F SiѢEM[o\3g ThÕlٲYΝW_y~ /`O?ְaC֭us {=,M4.\h+V>}XϞ=~֡C;]YIh(sDÔ͛7[z.j~W! Th&M+%3<Tk  cލr̻1 i)d^d@Y~[(KB B~O!Tn;Xe@@@@@@@8F cH  ,/|˖-߻NJ+.QUr*W p .~D?P(*J2zVfM]{?xq s){֬Y֪UG̙իgӧOO^:IFr緫z>[f h~g_{` sዾmL/\;OmW\hQ5kָ)XiӦ[ڤIvB>GAe˖uO>ʗ/o*Tp]=#o޼i4?o={m߾ RF#,˗/Oj+۸qck\+V,93 [ [u  H`ǎ7A@@@ }ּ߂Wwj       '@E2g@@PϟU?m UvmHZj™( rV\=:t`[lqh A[t͞=۞yۻwɓDž)I&.M s Lm`fJ?lʔ)T_1o;cg}m޼ن b&Lp'AvٲeOF72v窫r! wnӦ 66lh  3e^ ,뮻E9r$0!ڷox_~ k̛7-ZڸN8ա]vEFuۼbŊ[c@@X`NExY5@@@ Nx74׼JZ        * SD  D&_ٜ9s\_ԯH"֠Akݺ 4իgUT!h.2VB>~QPի]h.\hoڵ ,8 kѢ5k󧥋@8~8͔-W\nz&\1A+صkW6m_i>zMdVK.mVcǎv}٥^jpA*hVz(QA :ԅԪv˝;; 4L+QϷmf9st Tf͚n9ɯc ){n  @ x_w wf   >k݈1WUC@@@@@@@T *6&B@@ ={L{|w.8N:ּys¤ʕ+dتU SQ?][{pׯomڴqD*@Uf^^rJpߌ{^D ;]BүC&NB?3+P@U:nݺygÇwOњ*3(߷˗5kָ:Pa\WT|'9 5oߗ@@1x_Uz7툱S]@@@ f{w,#       1ACB@@R&ӧۇ~B &ۈ#\$q)3elE@nUTqݻj)l С{VVhYꑉW|YS.].r0aլYӫ{&U>Jx 5ju9oݺ'n:S(,~Hv,X`֭z٠A\dbŒ@.'KA@@ v:Z] cjQY@@@Ə7۾ݼ       +^A@@6{l۬RJVvmS`VÆ >]_~ r:sȤ4@ 3϶Yg^}j &mPBm%k _oVBlM?|R8o<;,gΜ0TJ 4kVXB:oVObŊ /ؕW^i?s TpB60`-Z(Ȋ8>x0+9  ;w}Ѣ@@Zw@=ʖZ"       @dAFX  ؒ%K\[r϶+Wڐ!ClÆ nѣm۶7o^@ 3Ͼj6P[6CFZ ,_>{C=dǏg?L톬eޯ_?+S3Ǝ9⅓ENkֶlb ,}]Jɷz ؖ,bO wVkn)  Ĕw/WjSY@@@ K xM <       $!@d8 B@@`6n8[5jVZe#GtK~N:$@ j#Ц6Cm%jSԶP_  `:|p{lQl 4h`gqV@S_risNn\l޼yK4kذ=zj/\d׮]]*x2#Y^@!Am@@ 6D-@@@_!#̮ҬB/]@@@@@@@@ A =x  ؼyvm.ݻƍmvUWYBBP[6Cm%jS6Fm %~Mm]w}ޓ=zފqZnm j|'lϞ=6e駟?1cX~sVvm+X`۷~^uY6uTdɒֲeK[MS@k E@@عӼHy   ĀIfbv1PY       &O3# Dm{ZhڵkUN cJAnj3졇SN9Ů:뮻D1FT7)Ӭxʼa &Uc^oμd'ml2رak֬.unݚifjk^z%ϟBi)4 ?^XiuѳUIg7o   Uv2_YO@@ѣͺv5R%ֆu@@@@@@@@Ȟ^3f  Ē#G쩧jժ Yf٧~hS,[v<ŊEz^Heq{'i.dABD&RpaW]|6`9rdb_s5ڵksα={aO>]yvga L:3a;l˖-I/{.saoV6W6;<{öyZkt >}x7߄^Wׯw+:u L:ơ4_?}n'OlOt~>uh]<zɷ&M!C\` 6Ν;}L•兎2{=Zl>xImw}:,>}zy!FBOs{>:F. UlhI:s=sTBkmRbC#%uHHdJ@@ @@@ ^2Pn:oѦMw^$iS9-^l6p`t֏Z!       @=ۂ  dof\m̙֤IL 'ٳgPH4)?.])H;v%? ˍȟpa}%2y`+Wz?z_pgUT1cƘZ.JUrevW$ ?^QGalj&Qb_kV\76VH_ S`(I:v!-<㭃mҲԮ]ַo_79s_|񴏝6mZE@:V޽{n^+Q1h ڵn m޼,XO.$NБ]/ x۶mCJ|.]#צ[PbSxaŊ]flLxÇի;pӸA%I믿 _oԨ ,' 2}Yر̙~+T%xIm{MÇi_y'1I/~:_^^V_~=cn(F [S>)>ۻ0Y}iG1-  @#EdβY*  ;2P~Z7yt= @ m^ybw9       dAR@@T@BM6\r.Қfj)`誫r9rlٲ֫W/zOn$϶@pIxgڵ^jM6f͚ĉUVϷ¨t¢yTO]HTۣ6Hm$՝8_Xh`ƍ[Z.Պ|gкj{6Fi]Vj/ N2e_fM{駏Yd?1#{=. {ot?p@\H֭[׆ b*Ur UԖS&:rʹQK*ez"{+[az_^`XvONj@@ t7, D |Gf-yw$f@4 x3Q'@@@@@@@6~)m[  dZnmi] /t)BCKhH&j3gL(_xP ?Ф_կ_tqNÎ!m7oIJevh6Hm$YĮ}G/_tmSNu!U3sY_.@!-wyǴҺtڴic|ɁvT3֮]`oB)S; JH!OKSC *B [[dIJ]'7: ]F|TRB窮_BSVpa_\pߓO>i6l֬YcӦM~ضmO`=[?xݺun}zRnX޼ySN 7|u_xϓoZc}^w^?K vj{zݭ\r9֭f%K@@ ݶzk{o lSg}n.:>ѱUSjժ垾Vn]|a{髯2ڷoo]v suϓ'G7jnripM_K;Xpd~]BiXhw}vگ%t~u g}f&Lƍ:cy'( Zk_ڬ#FYgOt:MG6C41i>: y<@IDAT-Rww۝wi-[t:p&eܱ歺_}զO뮻tn[FmM6uu1>:nSdy{Z~yizZ%: C W@@2C@A޿@@0:?uNXߵ\AnܘMRtn7 毒y ڊ+8ճkfBT8 0`}\n/?{7 co: ݀/I>.dw4Fw͘@@@@@@@} c  Џ@`*fa(Ep pTtTvm.0hѢ ] fcǺz*_~˗O?d͛7˅i^ 4 T{5jHWX9 cRXʕ+M> ֬YѲT֭[[2e CDZHS85 )>^ ر C2f~rtDRHٱc Tt嗻iӦ#i8w\z RBŞ}Yk׮ -(E!]Ԣږ{)Irذa.K!TP|#]g͚5c1D,ڂ v⤓N 񽌤]88Nq*֭۷}\Jk6}.S.ThUW]e [zRR9m#RmմUJ"EǏ{0'>QТ}whQ࣎?B:ӭ]օT7jȴ,ؼpa$ *ұ;B u%ݻwLm.V;.6Py-Zp'2tAK4qPᕺ@Uj]=SkGFnɒ%"Vm)Oa CU// h4=^:OqtL,Q:@Ԯ]ۦNꪠ꼌oyI;0|+w!33/@ }t5~EA@@@@@@@"X  @ (EO D+X]BQt!BjU_Aq-r̙3Dž(Oa /\ȑ4`dׯ{@Me>.(믿v"xb1bBzBeD,--\yĤ={FRG: zݺٳg*`0J]EmA3P/Z:u\K/dv=zX*Ul;kږE& RxG* XRHΕQE*dNA򈅢 LMMn_N;UAayj@5Ljߐz'7Uz… [B |֫?p7Ot7E~-^⴯~CC /؅xGEӹA LԾOC?+4Q(1A LǿRo10}qt>TNSLqS0xN Vp兮{Z~?.zVQxx'ߍxCǦy猘@@ ך޳ @@8xp{GnMu<Z%uH}t޽Mo[{uծz7nX}n Q:\_Ι3sJrp#2Lyw6Z02X       X) @@@ 5kf۶m{!(0EJ* NхrH QP̄ \SO=e?_ލ?~Ly/ş_9'Z]Ġ.LPJ]J$7n ѺEN*zӺ0?QOp W~cR&x\a&M2e$:3VPV$Si˖-zb+W=BK{mܸі,Ybr[Ǝ^c$BWKۆ.ȵW1#G#6}\#7BWA} .XCA%Gp&U0*$PEAo*Q˖-s/?N< S0M =}Shd`f>9s}嵎o)qɦcp@$uš^z vWXuABCC[1?ϪSE;Ͻ޽{}駁K3Or::tΝ; {Cf#G4/mZnڴ)|*+]8L#jyO>݅0{РAVRpEL>]EOU0d(>@;c{Q"]^={23$Y뚑]/Օ\Ҍ\G\%^ w̑# w+i<ǽ 㼣X4^OEI;?bLⶃ\7p(RE{TR<7<ߌz]or̨%@@_@I2 <~J q&={F6;G>^޽{M7IsLH5ʆnW]u?lRFqL:p嗻c{~+-~ |ySoxFD@@@@@@@A@@s=gk׮뮻D+č7h {6~ҥ.g֬YcǎD'<)v!m۶bŊi.8Htp|76x`erʹz*) bE%9t Dt_-&\m' &_`˗/0HY@Z4Zڅ6}?6)mm(< Q,T1W8 , Ŕʔ)c]tQ-~ѱL9sK/d~]={=`۷{ࢋ-{ nlٲVxq۹sԎjDn*VУe_]Z.$\xm97ﭷrr{-E *|5lЅQ0&Md>{{Gu!I-'д:޹;p'5s=v'ڠA\`eR*(2\Qإ9轩 |ywQ\@ 2'4kԼpg,@@@@@@@@ җ  3g3GFcƌqUPcSõjղ"Eݻk]AO'N{φj-rOSNe˖IMޥ@"\V`A0Ԯ];{n/C%oݍ۳gOTG.hOHlڴɍu$֯_]ذawBS Ǐ+V&$mqҢGt˓ޯfmj*;hѢGZi[kaܸq6|p7iLcfoٲa/پ}{I.k쫯rJ#G4Zh`hzϚ&mJ,+L]bO@o S8YZH-3xۅ[?0}wӧBtծ>_Zmm%W?Ѕ]m6/Kl:ׅٳgwm?c=]l.kz)˛7V{Y+[B3fcN8wwZL|nXR]Z5kժU8pcD'8:ӱ_kZG-n{խGBUm>l+|/N61DxTaw۞\wN97EM:9sɭGz)dQiQve%JHvV Pձwh&["}K@:iܸ tTTOJHK_LlDpVuTBF>?կ3`R@@2A L@g  yqAE/єw|jZ܏-c=묳L7ҹ3<ӝ*0}OP{ZݬI[`H.27υknsw$H0s^ @lhn9]fL@@@@@@@@  ! $-PjU;w)F?W`*O= :}> [~. F1W^y[mۚ. eTx? ӧWo;EDI(?v k۷ zNr/,k6h ۼyn]QbEWի[pn%KtOF\*ҥK"c_uWH̙>_LX~zo!T T5j5i$*Vz߾}.iӦM.hDz-X7n\x{w]y*IA=AlذN>dr(). qbU 헒mI+[oMt@\W-7˗/QcE/_>vPBAZܹs'8F ] T0prI>nP^8t͚5n-+O8\otҦv$JqxrH_m.1;FKnyI{Z}#Y˚ N7?޹1=  '{?5˒@"gz"R`y?X޾}}\-=ߡ戫Wʕ+W;ס߱꼆%uӟ䊾^\7wՅ ?#1cMhsW]eV{        3*A@@lx֭[7쬳β-Zvej_l$롐БC?y^}Xjlڴi$7ԶM$\ xԔH/# uر1rÂIxC8OjŋTU]@Ʌp{%tZr!gy5i.Kׯ_> 4hZlg!Juh7onʕ ke{o   1' H@z@@@ {nGӪUWex 螋gmMnF@@@@@@@@ lGɈӵѱ&OdlA@)StvG_ݻw~VXam۶K/."+T >#߿)INݺuQFE]Xe&d"6 zWi+kĉ'X͚5O>.Эަĭ@?GuPڣG*S#Gtӧ;n9rw|dW_}e |뭷\֭['Na6mJЏ @ Lv\rIyY"f?n^Y0  &ylÆL FZ VϏ! zGZ( Fp:ODx?U֯qK=f'lf})        @rj*&B@@ (o߾xb{W\`_omڴ /.SRFVZٷ~`EnBtMoLƍ߷{>s+V }^zZ7@AlϞ=ֳgO۱c 0 t~#^7O|Zh=\UVVacT[ojժ_n ,p 9ĉnpٲe_-Ll.]ڶlFf͚m۶JL ٻ]x!  ĦAݨ5  įwP[ڬG]G @@@@@@@2F Ȍqf)  q,7= d ??|ASS:u\ B!Tre?YX5Bȑ#?ۜ9s\ -[f_~}kӦ :}^yr[>*Of[~{W3ϨnݺO駟 bccuȑ;p@x w=  A BN1F@@Ti8#a@@@@@@@ [ }@@=zj4b ͛7Osմi/СCW-ԲeKW7oMrm( ]viٲe㏲dTRءC 0@lҤ Aq#h3(,;W\|PדO>GyD#2w Ǐ}q-]T_z)/k|=3gPqާvءB!3! |teR 7$u@@ FBh @@c>%5ׄ$       },2j:B@@@.HYf:h Gb!PpB-ZO>Dwv+V!-iO_Sbbb`E\ӵi&Z_/_.{qWUTɅ>wyզMX\TIX8f=ztUW_Æ W_H\SSS:Ϻ獹{kyFYӭ[7W_z%Pȕ+Wze%d2 h  @V//8q6  $/Rٲ4"Ƃ  DJTJ0s@@@@@@@(8 Β@@8% yjѢ7p]viҥ.[̅IM0AJɒ%uYgڠA];oT.qݺu k׮U;nrjܸS]8>|~iz뭺{4p@r-}u"71…g+tnki۶Z5qD7Ns?!HaL/ E@@ 2t#G@@طO{zF@@PK,X~gYԪU\ݚ5k4c G)))ɝիnݺYjZe˖ luRSΛ7o׍7*n۶Mn쉉pnQF.B A9?@( Xرcϻ9^xo^W]u >;TydA~ϟ:uא!CTRӢ_nW}D@ _y#   !+@d:  a&GRlH @@@@@@@( F@@(: ԩ{ݽ{֯_ 6dsqAz_R|y(F֨QÅGںZULLV((tՂ֭[ݶ/q.K*^4פIKsN7t+ pB{=.믿￯zms9ݻ.bu!쾆سk޼y:u>s͝;Wgq.rgpEyac6VbE 0 Yf֭͒>~@@5 LHQ3^@@@  {ˌ@@@@@@@(. K~@@( ڱcZ?vv!'Y= [jMZOUZUUT/}d_&iT]$$''pG x^wܩ;vȷܳg222LKv@=zڵkjZTreEEEaWFtW_}U_~>c9R>,p؎wU{Zjt>{?r/^, T>}jӞW6|2p: #FHImڄ4  N 5%^   @q x? {=G@@@@@@@p 2&sA@@gaV۷os۷og!~۶mӢE\ȟ=z4K;%Kԙg38e \(+WN*SL(*))Ipagx?gY޽{}y,.Q P q@і-[EmZj.^3] Bի6+Vhʔ):uy ׶mۺ-ZiӦK._%K? H]:ur٤IнY[U'0Y  9ezL@@z R޽~ @@@@@@@BH Y @@@>͛7?awǎs_yoՂ!-W}!k֬$hA[9YBm>jՂ"m;>>ո,K Z lá:tHV-̷fY> vav/,Wm;===G& ϳ>iV+V( ~j@JADwuŪU4{l͙3G3f믿Y&SV-5nXuQڵ]}5kt{׈)l`[em޼Y?6mʕ+>þ-4yС.QFOv I/c>@@ @@@ 8y?#a        >$Ͻd&  D&&&Z?(j%}i5jT#O@ ,_9 ?/f ?=͛ok  Az7  ĉE٤psA@@@@@@@`~7%@@@T3䇽OU@q?zA(zs-W@@(  C6@@@ I_|!]vYޯL@@@@@@@@ AU@@@2w&$p] A#пP{/h@@ XǤsΑv-i@@b @@U`tnַ/$        @ Y𦴈  $,E{*S&&T@(WNJi,]w  @8 Jqq83  2モ:w122@@@@@@@ >2 @@(&d)1:[@Sh@U9B@"C)66kGGJ))RY  @8 IKӌ    I@^ce        Ac   PIIRBB1@NI`Pϥ;Nr.B(d #G(==s!P@@7 2@@o8Cj4F@@@@@@@@  @@@ ,@Sg1!Y޽'⭷?q  &@d1Ƌ   0gԩa        Aal   GJ7!'(]Z:i!@bC)66K_>8  @ wq#  @( |Աc(π#       @*wq"  @ $'gl٠Bȣ!̙y@D #Cz}ȑܻCZJ)**8  @ wq#  @ %m(sN΀q#       @( Jw"  @P Kp `@| n-k'8@f͒=%rwߕ&Mj<   .A˝d   *sf) C1N@@@@@@@B[ о@@Q bħk@ƍ(Fi @&2/\ZVXC@@ \ ;˼@@@ X,ח*T2.@@@@@@@' n2@@(R_dBBvKg ,p ^7Ls $!3ȑK*W>LbSj@@9ÇRBn @@YE֭Cv @@@@@@@BL a @@G 99s,eϘ  @ʕR92r @ ̚%+EEe}R>-"  I%K   ^٦Mx͉        @ ޡ12@@@ ~%s|A}bt @^ t=[ ANرcJMMUJJJ!/jZZ[n9rDV>얾m2==]Ռ Y(/1%J(&&&+%4ߺoiJ.w9mJR5|utX6R\\RJM'@@Av^|[ t  )q#_7I#       PLA<"  @ XqqCV2@@;K JFI/  p矵v̶m/7V2pY装?ZT,0{0+WjԨq\ǻC[*Uʅ>ҷnሡ\ll9oաC7L @Lv?/m_NavnqZ{93P g3<ӿu_T|B4)  Ù-zߦR@@@@` yO#ժU        D^   ) $'g)^e A&0p4|4aԿ @ Xر#ǺsN  Z,_|UiӦYBjAA^TEYY}u,҂"-[/s۶mZd'KTT YreUREzzn_LLL#  /d\O   @ Xd& M!       ' $@F@@r es;~@PrԻ4r$Av/^Z͛O?X-/$&&>_߹B,/{=3s ^NŊ]-Dr9V :w\C# X5\pZjZvmYc# +J   ˗!!       Aer   PA.m##0tԷnԠA^@)))Z~6l7nt6mR`cҥUfMW-`uֲZK;qEW 9^۷owA۶mS`4qDرC9 dݺu]WEkA@q#G2'@NxH  !#zԹs "       @7)   @XdBBM #гT4z">5khʕnik׮uՂ|B nݺu ʫU+Wb(_6i$x ?޼yhjV,X NKKsz)@ yYgaÆnygq5k?@@- C~1Z@@mG~]d       Aw1  @rTl a @L4hcIMAHMM˵tRW- . Y kԨz +11G;֩S՜{l3Fw' ٴiS5oU{DGG4@@XY @@@ \ߔ:@@@@@@@(2~\Ȩ@@M_ {|@}0Aؼy-Z %K~zeddtnY]Æ ev"YQU\pŮ]zjZ+V護r"![l֭[M6jժAI@.G3S@@@ Y/+W,dhG@@@@@@@,Af`@@ȻAV9@ 44vF$24 F۷k޼y;w?ݫhh!t RլY3>Ug( ʕ+jȔ\R˖-.^X&MΝ;ek߾9W۶mKj@(4#G2&Јi@@ l(%$Hg         PA:1   @ x**S&\gǼ@:T8PڱCZ5-='HOO׏?oVfw}͛7+K+vک_~jӦێ?YG;Z ,vҢE`W_~em>-ZwՂ%kժx)  E(@db  D֭R       AE Nw   >>w Y.\1cz-"] ##C/ִi\oڵkSN6l=\nZJt.@ T\Y_|ݻWsٳ];v[n| G@(t_d ~Э@@        ?.^  a!@dXF&(PtuAΈؽ{LI&iԩи&Ms1btիG F \}g-cԭ[7;Wqj ̙3G۷_=Zvᛚbe^:u & _~EcǎW_ P\pyiF=kjƌƍi9 O[ r|޼yz3ڂ]s;/Nj yg +hӦMjѢtkϞ=3# !ea   @ xJٲ:Bƅ       *@dY  *p`fd&*3#A!йtҨQ?}믿/4e[',Ya.SBSvU\r֬YbH j觟~o7****OcKJJҡC4yd߿DX½w}k_j <'}Y??6;w]wBA^+uI .plْbݮT^x-[̽[jiӦ@_6|j Sb   @P Ƞ= @@@@@@@ 2o/C@@sYX´һJii7. }޽]5^pPKhb(?'k6sa]}1bf̘'|RqqqE::;׆ƍ+?իW_˅^> 8P—W󟳜Ӿ,'0+۶mmݦs=7dzwء|PuՋ/#m0 ^CszBIq @ N0@@w 3?@@@@@@@WOnad    $CC(0/;M҄ ֤z!}:KvO[-/_^'?3R.\9scǎA9F? \=%J_rڗ̦MԿP5Ӿ:dGp6mkժY|~gtMٳgkaÆsc?~|0  A%[(    @! f6Q+DdF@@@@@@@dh@@@ PYL^@UjUwoiHyhy_ʕ+]%\]l!O?[2dj֬'x"K_|}m߾]_ ?{nZhdA־Gʮ5j^xZtڵk˗sZnAÇݾ .sM>]cfcƌqA}]}G͛7{#5w\-[Vuѳ>ڲ?>Wwܩmۺʕ+?J;V'NԂ r +^SIIIO5n8=9}嗪^ylw}?[u饗f`szիFUVo7vӗ콴aYߞ={day]vڥzKSNU׿UUTѺutEɎx۶md ${Qn]ڸqx(ȹ 6M>i;pc~߯?^p9|g9O=P+0+RSO=垻vwީ;/g,&Mrͷh"K7͚5soժUcq} Ur`cA@B Ƞ @@"@UWr[0{       )]7    PFȯС慤^{M]tqhW\s*we]Fu ۷oF{GKvvhV,,SN.%wء={jkw~fA[8eYXٳ~;ǂ-[v v{CJNN]{c 뮻Nњk_j}Q޽]}ݧļ{7kڴi@3[lڶ0M{NXf}ϻl?,l-ڷȂ,hF up[{3uy{au0\Μ93_ñy lݺu.̵,go߶x`[}}b   Ao@@@0, UD@@@@@@@D$A@@**g @x H l\'|4pK.ĭN0A7V,t-::l݊YHǻG qԠA-[kV^04kγ;xpG_>dxV,o߾*W*Uʿn+kזY䭷B${=wο/']gZ?>2eʸSC|>jŶ-ԂK{j7ol hZj'4//C_߉'."+vZ`aVZ猍XrG>}H>sB X |Vs _^xk֬oܸ4ٽpCJn܂j?vʗ/vK`9r۬QFn@@BP ۷z!8 +q% !1W|F       $@dN*C@@N"baB'9 a'0x}4yrS[v; ryիWv;rX)Qka_ky͟?Յ cKvbtz5&Mr[oS_{5x]u |=zV#FaÆ8q;mժUJLLƹb }ݗ) QCf4eʔB`>k*ԩNN)YlC9rzۥ#'X0{Z|;~YN5 _b &q/[wo?m 봠J׆cǎnwo|oLG1Zx᝾m_iiB+M;/X@@@"LO'?Ft@@@@@@@@@@,"hA@@HM%2(A&РԵ4jTWT5kVjԨᶫTߟ@5J||ۜ7o^nܹwz뭲P7xCO?qp Pg}VJR_e;T瞫ŋJJJ]Ѷ-2{ٰaC]l<qs9k*q[_FF "s>#]r%:t|M5n8KOkAmvoOkn-6 /[@@@'( ,;@         DA{9  Aup) @( xs;r}ǎ݁3gf9ansK SGf9D $ʲejܸqZpT ó0ǟ~ɿ/ ʫSy^r;S^,qذa\}]/s OԺuk?'}d0`.2]zڼysvNʭݻ[Zj}Aӂ,>l /2<{&{8/СCa0Uvmh"ۑS,Y5..{zOZ9p]nsc/c U r 6&Lz}%@@@K &&g /         +@d{f  !"yY3@r)!A3&[(o~_^t+UbEnW]P(=Z˗/mٲŝoK B;]].]?:^xᅪW:tݽ{[h|ͮ ff͚ .Pbb()) 04L_NƏ/Xnv_?k/0{i})k*O?mZoƍkȐ!n/o裏sĉPM6sy#/C{D}x.Lu֬YvZ;3gRo6{9֚19۶msvoi3m'+&MZplNIӦM/6-vΝ_Ys bi@ʗ_~YiiiI+Wԟ'UP;޽{u]bٞڷZXPEw ?o-`B.?=+Ujժ-0gnN9t. KP+e ,֭[O>{-+Y_nwE'Ov   @ dNU           PQǼRP=zv EA@(n/ #P0^n #y9]@8~Gv;-ڴ(u,llҥ]իw܉38c'adl֠AY\~]bEeGuʕm'| : ygG rmI)~ ]Z`8,B,Bujˑ#GdԶⲟZ ۧ> b۶mV V\wؖvO6mڤ:u͟?_:tpO=vء:~a ޞ=^+l O^K*TpK{H yaܹSjErݻO_wHA'  @ K!x2o׮MF~BDWìU+7oC%߿BN1N@@@@@@@ODM!  /*/P@hZjN5ATץK\'q:AXe˖Uk)}(Q…9 },Y;Br*۱g_{Qދ/qs=V_tuۜ:qX ,y5{~K[6os#ay}=4S9q0@=}[oSN^x u1)@@@b(]:k?           PylQ@@@qF !"С^ҥKbŊB3nذiXAqn& 8PcƌqAmÇWu7M6=߻w۷u,Aǝx;yo|-o {VƍO\\1ޗW^BZZZNM<˵#ʑ#G駟7W_}K.D_~?".@@@ȿVNOo+@@@@@@@@@@y #  9 H5jt} "pA'zk-\oΜ9BpJ;L/=R%KtCTS l{Wt9QF{_s5jРA3==]C 8lwy ,聕*UJW^yeA7{ZmVV|,oO?%3MmZ\'##C3g{+**J7p{3N   /~ W { @@@@@@@@@5 C1^@@ T)..( @I\9yqȑA˗/w!׽{b" mѣwvancǎժU+vڹpW^pJiߧ};X@׮]5{,}/_>6+@?S}gJJJR^4j( 33@@@S@@@@@@@@@(J R@@@ l`a3& pCH]HIhխ[Wݺu;ָ TNW7nܨǻOȎY`_UV-.X$9 7[^p1-YDSNuoQ%ԳgOKݻʖ-c   +oiik@@@@@@@@@@x,wzE@@HI| 0|@Y:l7xayc?AQQQ""<l:l0Wwޭ)ShҤIw^5i BիW38- 8c ͜9U{4nXz%K<~@@@ⷃ{$         &@dq  "*>V  @ ,=G y0pN$PR%]Z@ŋ5m4Wo%''vԩjJJ:QC p׹sjٮzRR{_wM=lYF 1@@@@`ʔbb=`ڣ@@@@@@@@@@ AU@@@)..` +0p?MVqY #F ::ZmڴquذaJOO׏?Yfouq7oVllhvک}|ێ'M;b^+L48vڥE~`mܸ Q-tkrlK x     ~Iϒ!         @ lw   @H7A"E PteohϞ7@ ,< ywn߾]ܹs]㏵w^YdÆ ժU+lE6kLwǂovHW\e˖iɒ%Zx;wTTT{YHo;tB[ j @@@N] NzD@@5Cv@IDAT@@@@@@@NE SQ@@x ,]:@U`o ZNjVOcZh.\o֯_ jܸ6mꖍ5U $'vڥիWkժUXB˗/׆ t1ũI&.w.Xsn   D999&t@@@@@@@@@@,[@@@  x@Sr4zm#jՒK/?TXtRY]ry`}5k@^ʪճ:-ׯO_p0;vxa\]v oj7x5k-Z+L@@@8-))鴚b@@@@@@@@@@ A曌 @@@ 2Jt   ~[z1ɶ) pr8k:$ `5kָUV?׶mVPAuRԩ'-tRJsYA X=[jͮnڴI7nWN/!W Dԩ >ۅ?kS)    ?rw g#         +@ r=  DAw˙0 'Mo-mjڵ?{GY I& W"("#U<_EVDEr"JJ@JJ*)N.l뚝{f)믿^Muy:ݡCxZj@ji5֨:um_ @ @{ @ @ @ @ @K@d:FK @@#lDU @ |ɱ&_|kmtE # A;>r`G>cU` ,ӧOg-\zYM%|.ʴ˦G6_\s}eY|ynҽNp&Mɵ=eʔXL4)s'L225\džSw^8κ0gȐ!~'%n٭yyZF @Z@A' @ @ @ @ V @ @`L Eڥv zS P`ĈdCM3y_N:wn @ @KK`Uf$rik @ @ @ @(  @XLYz:uZmNFW @ Xk%GlE2}zrウQ4ݭ&@ @h"]VHA6j  @ @ @ @ @y ' @@ m!@E`ذA@{(?yzɟ\tQ2|xY  @ @-K`UA#7 @ @ @ @ @ l  @hdA :QvvmtEBn%:49 _H|2  @ @*\ܚ"@ @ @ @ @j  @XLٵbdsh|r%rM Br?v,\%1p @ @@X}䥗Ztu @ @ @ @hc 5 @^`TAM K~;3}`ٗF@k4)wGINl# @ @@/3m @ @ @ @ @% e!@ @ nZAGu]`Ւ|$ofueԨ[JV_=9f Ј]~$W#6* @ @&Wd᪘ @ @ @ @@y. @+0eJҵ|W[AfO*ᄂKwߞm3_hW?}w&nꪭt0M @h%WiӒM @ @ @ @@ǥۜ @ N @z(9Òf ,eYs? h%sZzB [k @ @ ̘1+ [? @ @ @ @ tA.g @ ІJdnmh@B*puС_2ydY7lhҤ|&@L|ɠA-$^f' @ @}Z2f̜k|'@ @ @ @ @4 ȦqU+ @mXtچhh Dn<|ҡCj)pU$|O$2W @ @.I_ScK @ @ @ @ @\= @ .J vy $0`@$:-xsA @Kxd]H.y䤓eiI @ @+ХK /G @ @ @ @X<Aek @A 0?o c- 0n\rf%'&wݕI߾-w@ @ Иk%1=E @ @ @ @,X@}%@ @\S KNK:tkU{ 2JYg%%srE=$l2W @ @K. r @ @ @ @ @, E% @* ԥ  po}+ԧNvڴdƌ[B@ \w]2dHo& @ @`.ٵ\- @8dmΝ^=y,!@y{,sd}| yӓemh @ @` V KM @ @ @ @ @W@d=FN @(A]ϝFN_{mҿa&;&^{-9Yc&ߞIy_!@ @h?kf2~| @ @ @ @ @' L @@+:Ud+=tMfXq䦛= ~#' o84(WJd @ @l) Ys͚I @ @ @ @hJ7e3&@ @@6Md9FB'0p`ruI9y{}"@` \uUI'%=N~j8qb&OItDžͷv}+?R׌3yp*:ukر\:גYft}=zd嗯j)x @[xH~dmSfA @ @Xwg߾"@ @ @ @ @, Ѳ- @jӦ%] @"0~;6ƍ믿>oo8 3֭<t-}OPkѹ<6N:߰ȆҊD9eʔu5uzJ޽gV\qŬJM+rVYejVn$Pg͏~ɥ&L, @ @@80yM$@ @ @ @ @ڀ 6p  @+P ;SK]kXL3gV/bF_~9/RW^Kd YlXJxcVX!z6`pĞ={f嗟mZve }СCêg\Ǎ#ͶIɓ'9a„*߮[s^>%sPɮ]V%rVkQyؿy4Unj|~HjuN:) @ @&|W[A @ @ @ @h4%F" @ڋ l/8 h%p̘15jT>`2lXri]KT  @ @ډ@ B/i'0  @ @ @ @ @@ l6z  @ ZMKtio._=O)r5@ @ @ @ @,H@t#@ @<A",s}ψ#T3g̲.[mFg}dY{k֞Uڔ@ \kivml3f?'x"?xJ@?\xᅙ0aB:tPnftMg-L޽gǗ+y%:k?qrIgn @ @M,н{暳 ) @ @ @ @ @\#0| @_`ڴ[ @"0G}4wyg*駟N }۷oO~2CTPMڸ@ ,C>׏;Fʃ>X?s93fLu 4([ouv)BḊJKͤW63<!@ @hFٌ&@ @ @ @ @F@d9J @@c L.,C@(#F-ܒn-Çϛo={V|tPblY}5@V_/_zz;m]venU`zV{OL+9OZ C  @ @Z@ A]#@ @ @ @ @ڄ 6q  @)P ;SK\[p1cn_*?OV[m>C ~ [yJ[Me(%tȑUߞ:+_W +T{Ws۷}tԨH-įe* @ @]Aw^  @ @ @ @ @ . @,\AvlA,kz(={̮O?=~yRV!Ќ%xtM6:ɓO>o97tS?~>}c4tf챦%w%9dOJ-s^[ZF @ @qʯk;ر*4Nj!@ @ @ @ @) rN  @ A 6+裏seeԨQYo>vmΝ62PZ>:ӦM]wݕk6^ziN9Z|!6ڨuc?O8#%O;:ǣ @ @G` gA @ @ @ @ @ tl}]c @4@ M5A:KM`9s馛fȐ!ӟ;,՞}'sgfvԎKs\.t99^rΗs\93d䤓Jyf\;Z"@ @gWOVX!I!@ @ @ @ @4&U1 @mU` Am <#6lXV=zgv?#Gv6`6@(t99CU|95PrM(M+p6$ZHgSg$/ߴ @ @nc\; @ @ @ @ @A6 @h' Ɂ6LT஻{|5jT~f7޸v{dMs(B&ʵQqJ?cҳgrE%5n;j#@ @ m}{ڭ3g榛nM7ݴYǍ_Wٙ%EKfʵSr-kJ5פ<{lr3$fң @ @@s zҧOjlhڣ@KVw v-{w"s @ @ @ @F @ @} ]!@@8ӫп/8g}vu֪;?v ><_}OC(c-j)>9j|tVo[o&L"zYr kikK]஻vH>dMO,Yyٷ @ @@KxcA-ڢ@ݽ2x?kF퍩TԩSvo'uv1w\, eG^vʵTrm]tEo[ݸ>_I.?\~ymuE @ ʋM~x @% ~/ķ~¯S-* @ @ @ @#/1Q- @3A.6" /TAz?!ycC9aũ)ym;>6wʵuQG1cO685*[-l"M @ ZJ䣏&.47}[3JKֻwٳ @ @ @ @ йP @ڕ@oW6XZK_R檫W\gw}{䭷ʵ^[;묳.߲k䤓N&ZSms穧V[mYn{ կ~'|2Ofq~\s5)ӫ6,_WӫWjkҤIÇK.Yk;ty 80kƎ[^B /첌v.ʡ ӧOO>}r9Fr6(*̶͂41|g9p )c{s衇ڰ\/8o*[MKv~'g\xaO%C%@ @]:zg֛}o @`QO;w}koK?1ua/b~{˖gyfUW{@ @ @ @hm  @x%}dvEF(r/ԂٚWBw}w ꫫ`ºJcYW w}*<`Tv瞫D>!.z<@uGWJ]_}/{n8a„1z[,ҧTGzS~;;cxj,?Oґ _ <ꨣmg>5\z:R_jY , ;3m&rK^xʯlpE-q 7>֎?t޽z @V+ :'nF]mnz S w'gԩU~UA/on|O s~P0vmUa.]f֫Z*Ǭ {Rw3f;-ʏ| ,mL[^Y-j[?s?qzgذa҅ߪM6٤~u֩*JAf_~ӧlʗJyo?^Y041XQ #GVH , >nu5V35זIڹ5Zk2jT/'ݺ @ @@{XfYz2b$@6fzhX}Νv)emews/|u/ ˂ƲOyAYy^_Vʷj~%T!K |US^WB(ˋK)`K)[O,C/{h<4LG}4s=7O?t^|6?uR`,Gicz-n*A]wݼދy睗}VuMnV8ea~ŭ;V_?]wU"̗54 2 -۔ϥJ˕W䨣|$yӓ=ȍ @ @ ~#ۨT`Ҥ1VW+uر w,/P:mڴzeay!޾^zoS6,kf}#<{饗V,=ֆuL @ @ @h 7n @ @] ׯ3׿}tP>G?є&M~ZՃIǏ[eU(;S@YYhZOֻ2=yg|e5lOՃP w 87\ϋⷸuί߾Z5nܸm1\X:w\09SVn9)KjYm6R!@ @ 0K@3ޏiTņev>Sv/l~Xݾ'tRuܿQK-./˺ݻWu׵eYQ^8v[_x% /-/+ *\pA>jկ~AOSǺ#@ @ @ @E-И @ @8!3f4ȴiӪ.77tS-X,RZ*.M>='r 7[na].`Gy뭷RVdH.48\ @ @,@ |W{ @@ر[5;s{^XY}W_G݇'Z?Z%䱼d׿u~Ng>K˙gnݺe-vrvmC=C9ZۖquZH @ @ @hc 5 @ @oW?RY~1W^A~8Cߞ7xczպ;W]uU{-nWO0zXio|ߜ+_~U4iR>UKY`=(6gd](a ,| _/+2__9s!'?IU ,eAmRJo>~ղ0XkQUQoy2$yv}wnh @ @@3 T_d3M @U tz>eԨQKq 7O>=+/p+!\pA{{uֵkwqUε7'|ruO[guj/VƍWK,;vLZ;ߕ~;P݋=%u/k4yߗ-/+e^=ֹ @ @ @ AÃn @ @@>|;or饗6 Dy?y>Wa_F ;T)!%[nUb.][k]-/m)waQ7v9RE1}/~{JK)A(Z*T>6GW_MdRMjy~8Gz @ @h_fĈVu&@f(>OC{ケ; +T='>Q݇+ }Ѽkt?-/+/y;SRESOMy\ r[6v%hr[ PnGQ}_ve=jj7jSTu/|.Am]/Vc򗿜2c-* @ @ @ @Iڃ3 wUF @4@ok[''rJV=r',瞛 N 1я~XAK=yt=/Rv>}VG>򑴐@IDAT\UhĉӫWa6}y뭷Rʜ7Ƽ &@@ F:ujFuY'el=z,VWzR&;v=0AWo]=dv-ƲXhM)S_O~c9Zjjk٩|['U @I㯨OT/oh.hO/NwHh)^ @gA믿#Gf5׬ιO ,V\q9W-;3gy&뮻n0jMVK +>^پA3:ƺǺ,pIh @ @ @ @e tn+ @ @(ulI>OoL u]Kd)kFy}( !e9o|رkIO\"8p/l|Y7e]~Oq~~ŭMΫʼB ˺_~vikv[o~ݒfPYTK7ߜwܱz0!9Y!%3;I=6Yf_=  @ @5-ZWEmmtCM-Rwy4 bFYreСYsݹs%} 3UxeYoݢa @ @ @ @@[֏ @ @#PF}ݳ>n6`t^1cdUViF{U{ao ۤQַkP{w/'pBy&wݻwN hxx ˹^rk\ (Fk 93) KS9l_ @ @mZ`-{mC48 @ @ @ @ @`) \#@ @78~^z|[-ܒM6$e5 C ,@9˹]rs/ru-孩\}u2thrf%=8jMW @ @-C`qo  @ @ @ @ @ l @ @M& +c͈#2rᄍ⋳fω';#ӦMk>@Ss.r9˹]rs{n曬뮛z%?\rI2hP5b @ @m^lS{P  @ @ @ @XJ f @ @]`6gg} ;=;sVZi|c/~<䓭}FʹYrs.r ~,v9˹ 7$[mO暩'F @ @Z@ɐ!} @ @ @ @ ::n5 @ @@s :4e:3f̘PK_o}[9cje]vnCұw41komϘ1##Gswn+VX![:۷oX;I+{_J6߼UI  @ @H-LEvM @ @ @ @ @V( 4]&@ @$7lذj*{#F-ܒ[o5_ogϞz뭳6d-Ȗ'fW_}4 }i/rZr=gz+o}?*rM7m7ߜZkr{6ԮV~u @ @@ jKӓNZpGu @ @ @ @h [aI @ @@رc6|jW 9r >y'W>h!j[OB]w*LcGrݻՍuQ:,rQlC @ @jI~[d) @ @ @ @AX) @ @Ew߽:oG#GV뮻.ZIn2hРz8p`J`ݼ_~ԩS]UH`=zt}<3z*O?tLRO>U8[oaÆe7_uUs @ @\kM7M7v @ @ @ @ @M@d{;K @h%o{OO%,ϨQ2iҤjεo^Zk{ ,˼=6tk)Kg z|/Bj*˧MVuweɀ=3?WJ+Rqɩ&wݕZhj2|xjRk^C @ @C( @ @ @ @ @%'@ @h2WSFfΜ1cT%T瞫oM2~6YeUfe]~?0aB^{;vW_/ r @ @(A3f$wߝGG @ @ @ @ @+ ;='@ @@ `\eUi7VñcV%T cՇ$ĉ'.޲JYw%:umرl'O>4elaus7VGUe]e ѣo|Y{/ܒ5QcXv(g$<_rС>{ @ @ дpA6  @ @ @ @ @@ @ @,@i[Vs*NJ(d]0IRy lW㼖v:[HB#Kd>9_>-\UܣL39 _m6Ї浕e#P;0yK.I YZlK @ @@slߛ6G$@ @ @ @ @ڎ ȶs, @ @`) t)zRojL8"JN<19㌤9,ɯgɸq%`3BH" @ @ lw_R2mZ_`6q0 @ @ @ @h[ @ @;_"v駛ͶTSOz0Y!\pȶt @ @}l}2qb2bDQ @ @ @ @ @M# i\J @ @ |s=ܼɅ!6ڀMK&cdNN>9yG?JkTD @ @R([idب @ @ @ @ @6' R"@ @ t%wߝ}t2lXrAM^kǓ}mV':$S3 '$={/ @ @ .ΆK}&@ @ @ @ @, 5 @ @v/ХK&7ݔС_N~d͓ 7L.49dԨ}I:Mln @ @vHo;1 @ @ @ @ @` xxk @ @@ЇN6$e䓓:W^I~Y/9Yܒ     @P ZSi@@@@H0פnl{Oj *u4g4sgRDdhy뭱uϕ+pO@@@@@ ZZNڱC*[VÐYd̫ %!         @ #    IWKw-5m*) ; :*)?҇Ɔ?ZdfғOƆ?V     #}[s~̙HQQRhTD Ԙ:          @ o!    KKIGK?.}ϊc/^,M,M.?.]{wH%KfE(@@@@] $D*XPH[{$hz         I Ng@@@@@ ȕK{VCQ#k; ݻ^jLx    |Q)$$6,9          > }l@@@@@ S:u~Y*\Xc^xQQҿ-]~ԹTtwwKaa^O@@@@@ *VL: H#           S5     *H|#=ԿԾtPꋈ&OjԐzFڸQ#i?;@@@@@哦Lo27TP£|F@@@@@@@@@ \     @&HÆI JWKkK秼9sz=-M*UR D@@@@R+Ш#q].8'@@@@@@@@@@Lچ3     \#Z%5o.x4xtL['j%|Tv۱I@@@@@ FʗYd='!         @ 2{_Z    @P)"M&M ԤysGDHKuJGJKH|"ը:>!    -&M"EGK/>{          @rA&9@@@@Tݥ+cWO4)vTW&4nRfZ5 C@@@@ 4m;yMHmҥ          AIp@@@@BjU菉}=%{:t6mzTuL@@@@@ 3HeJѱ}qϱ         $%'G@@@@J W.⋥Pȑԝ;KEdU(@@@@Q **J'OtS622R?izmk:{k^~y%m}1 VLLL5Ԛ;wnɓG!!!ٶyukajqSXXnXxx_@@@@@@@@@  =P @@@@ʕ&m &{ԫԲO ߋ     @ݭ:z;v֎?~??ZcJ c* [LoaF_pc<{uey]] |L 7, I[ q)}Y`ȋ.H TvPB*\9[;v7Oo@@@@@@@@@.@d@@@@Q 2R>\=ZjDgZfϖƎϗN*THy    d'tza:tH G۞'/ iᐥKJreʔѥ^9ӻ-<@@@@@@@@@@ 2uA@@@@ ;& "tRrI#Ԭ)-[& (yҫJ $}g@@@@@ u;k.޽m-1**а0 kР,D<2i!K6&:u m-,ԾW? PɸZ dٲejeWPڹ         @P T"    }fϖNLtIYۼ1z5馛=Kޓ,      ۲e~7}j'O?/V]`:uԶm[ +S .쿞|F߱pH_ਅG׬Y?\{Qtt{@wRJUTQbŒ*         A    9G`~ӥ]^7(7oNZZniSiHi )W?;@@@@n111ڱc֯_7jӦMڼyܹSv ̫X k߾ۯP  d7a @]v[^TT ﵭ[nuΟ?ߝE-ZTժUskժUUzu]~s|*         dAFMA     0q4pTM7]IҼyO,q@@@@rݻISVuݺu._~щ'A]lRr*TPNaA.'Od"Ϝ9m۶S =_%K}vYHdHH =+dkڵj|@@@@@@@@@2KZ,iA@@@@  xmիpԿ4btE+4xtR.J8ٮ]<     (dqF-_\+Vʕ+]#G\˖-5k޽{FUX@i@ 9MXHdd6m$ Hݰa[g͚M24ZQQQʗ/Rn]]uU_l? g@@@@@@@@@E ta!     7~H+ .U&}԰abW^ ~|Pj^O3F g@@@@B`^ՂO8pժUu[d"E@ yŵYl>}څ]V? WuAΝۅC^}jܸ[J}         I 4q    O6mzJ8Pʓ= H&I[KzI|#䍁gA@@@@ bbb~z-^X-r]v)_|.7߯JիW'.& Pj;wW{Ϟ=C+l2:TVB!Z6jțوp         X ]\    DqǤ^Zf̐Tu$o0t]7>^cHen( @@@@ l߾]W_СC*]5kmݺu7o= eʔr[lѷ~Kj6l7Q5mTZ 7ZCBB         @RA&%q@@@@H.<)M {on7T }4bԿ4w4qTx@@@@H@TT,Y>Lzi6mr]w}Y]TR 9w֮]#""h"}OH"jݺڵkE͜Q          @ t #    x{J>(͘!u%d}=CBaäV Εjז&O    9A̙3? 5kN8kFwڴi+2'0F>oޭָz՜9sCɂ"[hN:o&)bl%A         侀{@@@@r@t4ntʕJSFdW㍫תURҍ7JK{@@@@2L`ׯJ*;ɓzu!}W8p !σ|Kّz3M:Uׂ ɉjgQҥնm[}G:}tW@@@@@@@@@N Ȁ{%T@@@@XFjLz!woiؐ@}"Ҵi҄ KMH7jm    @0 DFFV:u&ڹs78odϯQ:v2F 1Ԕduذae?_f8:sLjafYzvZY= y={6         #ô     ]_7Y?MJ>-nJZZޠ}eKy 9rD_>s8q"uVm߾]eA@@H~LG@JNzJ7t:wunKɭ\ ~vءwyG۶mS\RTcjΜ9c}qVZ7n.߿qIX $R{ ~'8d=sj׮"##S Zj5kf̘W^yE7pL,         Z lzi    i5iSz7]j& ;fϖ^~Y5JjB^Pa 8}W^0wz۷of ^zeqM(@@<=# "w}ƏE@|eHHzMnSCҥL2Ӽys#!uMuԉw,q]19EҟF_~E/) h;wƍYte׬Y#79o,         W ni    i8~\0@ޠXy+瞓O~eˤG 䖦M o+t" #-'˗Ϭ(@@<_/ @zH|[5j(kH|s疭]s-KI[bF'v9O 1x$?E]Up@\-O?TWVtر@&uB@@@@@@@@Hsc1#@@@@@ 8>DƲ Ǎzr ζ5kƆA(yҫJ s)S_~QrԺuku=~u]%ٳG}W^C>ݻW]vwg pŠ Є K/yjڵ6lFh͛WC q!-r ׈#TreוۡCVim:u, sܹSo~GϺ*T1cxAZj ,nݺ9   Ty0~Yo%KRJۆY,Pnٚ>}^x6)SFO3YYߡ-[V0y 7Y^0OrhBW]u d,QRy:v*cdž {q!Z#<0ah!-6B-b[cFp@裏4w\جY3wB{HuQw̞c!X=mmݦ{}۷oUAwurέ9sx=5qD9ߤI9tP۷Omڴwbv@@@l$σ<٢)xׁf$b}@ca7p6mBǂƖKy͘bA+Vtׯ_/ |g]M6r \R{-[*}RSZo^;weg6IfA^111.G >Uӏk.6j(7SO=%o?c;U)ȑ#]_g}nog!my]]-otػK.)(},Ђ.m[,&cN[Lw=-B gaibbuwVj=         @Lw"    QQB+ \@~B+/  d~lU(\?U㢋.rl6g-[֗_Zh-;wtp-Wy?I钒~eH֏ > 8L,Kuu_j}oVk[%z={/;^Z5uYhcz-6I̴iToi޼{7ov!v_F e.رc0vLG{ Y M,s=_~.ȑ#s_ dMYZJG@@@@@@@@(@dv| @@@@d1>k ֬xB M~ʲ,Âmy뭷vԨQjҤl0Yj*w\z}i\JjaҊ-HK< EF%\N,Y$^z\dxS2< ױc\ d㶿uք\~} GHdƌʛ7 w7n|agϞUƍ?K.>ݺuӂ deٲe'Oj;   y:h#h̙ $Ui vs5ӺukMayWӧ].]Lg&gرل-)-ZTk.oo֛8KR}q. lHwwرoq~n}ZXb]׬Aw(2@@@@@@@@@t 2]y    -~ԢIw)ԩS`9PkW4iҔ)Bk35r_hQB~'iӦn8ƻ|֭.yǼ1˿[=XУ@} "\}뭷zAs]7ߜ.pr*QN &O>D+WV}Zr9Np=hǎc   Qy0;~M7pCڲeK@6&H% T۶mvԨQ@N@x3Cb}vKZ .TUV.IPoLxx| -tѩ@@@@@@@@@C xO@@@@4 <)JҫJ qGTplرqN oժ O/Txq <+S?D ڹs;ڇ]vc߯ jƌoo߾ҥ^|Ew6 ,ATP`ᐶs}1w.niӴo>w:ЬY3zȅL ּysUX 8Y@@@l*σMa:g͚É}vDGq۔~_QreuM0dW믿j>ѓ׿J={O>8p?|}n%ve:~۷Q#Gt}d`:a}HYlboxEuǒ?|&%4iA$0'NԸq4bwg}ʶ>\5NСC}-2P]ڵӊ+4|/ޕ&6J @@@@@@@@@Kzwos@@l"~d;/Wc69Z%+s4Gdg28TO?7`TZXzyixK3 پ"EnH,/Q)mz`g}V7oև~ϙ3Gʕs]|ŲVܹseaO{o۶ 쎎V1m-[t=g/?w'M5k@H {m0}~q׏yvjwB/+wX/1e^ꪫx{6;?#^{{ ,\PS6m4j(Y,   @v;w`6]˗/A/7B7[o|MYYZ`/3ʧMb}|VmڴIiB":fw9Xߜ-Th}x_xׇg&jox}w?Zj8p&쇴/t-P\{ʴk u[n"^dzյlٲX̀7ݔ71Q@TJ Oߧ5QI@@@@@@@@.mN܎c dA@&5fl\C~x࿟p2ހ]yΝ ,,KO@-jk׺pA6r[(Aj* J*z0 x!$pzXm@Y/Q[.(r%|#  &#]՝y0ؾ96aE޽]ѣeddr~ '@ݫ'Op*V9>slYߍ}Xҫ)-uJM3Kx̂#6l>}Ӿ}TJDRS 6pK 4\,DӾKEu[DfDK.uXXbA$j:` To4sf֐zd~>>~3j       @vȓ]B;@@@@Y/$BziKy2&0;'kVznQ8P? dNA-ZHF OL, 2]. :ŋs,VPw*:(P@uMC@@?`qZlիW{}r/G>|[JY:#ɓGd6mڜҁ^Zg[ҫߧL2r1›8Ǜ9'dH۩;{#a_[JMnٲDq5k&z]Jֵ`Ǧ!Njˍsk@YF>>#oZ~(*X@@@@@@@@@Hofu<    _`O_ 6)"M&n-=`Rժi >!BzofpURÇvޝau+\ r4hפm۶U5}\xxx3dX9)5###{Xz3\\?9sF3gԸqؿ;rJ]yԜweKd{@@@@@@@@l'@d{4@@@@ ' XF>t'H+$lk5H;KI*ٱ.S.]R{[TRڻwoj3E@@#бcǜTS .`A}O=W7XSLk>f ڵڷo/ ˪ٳ.~rUٳz!u-ݫϛC y`ek ._|~aWyy5jԨxAhj*׬*B??}]o"iQ=[˗{-cdA@@@@@@@@Z Ƞ~}T@@@@ G 7:jfVNz1y%o<ƏIy};{I'O֎;j*͛77s%   @ 4iA/CQоA*½κϭ˗/ĉէOx7oW۶mU`Le K/V_YL[e˖^?בg)N88ZtfΜ]vy9ݨqƹ`lĂ =b@@@@@@@@@ _bA@@@@`XZjL[iB YnK_~)-^,խ+-YھڶmF@@@@ K*;VӇ~o߾*^h̘1Zn]Af}{^L+Osט+A@@@@@@@@@ 7@    Pqi?irS.2V jזZ ΞMYu*V]?L#G͛SvW!   @^o6mhҤI:pΝz魷R͚5UL7amٲ%`ME@ y͞=[?7 P]Cy1zWs? Iy{j˵         @f ( @@@@&0cK'OJc8*ʕgqW/.oPp8PjTBO.ի,Xp@@@@ MҭcƌѶmۼ~7o C`f͚֦M9 dAoVK.uud4i:7&rJ!RȒFEp@@@@@@@@@ pb @@@@@ ޸R=4gtK\qg 'h!u,թ#/u|l0[oƍw &g@@@@B.SϞ=kѢEZx,(r׮]ʗ/ lذj4Wzu S`سgVXe˖W j-P맵W^y퇅k3ylV#        N H    ӱTRXQ&5 S W "Nq6/twS۶m@PA     |rҕW^>}X?ޭ&M҉'Zj^z.$dk"E,8uoܸQk׮?+WjժU:prέ5jQFYoK!dRo@@@@@@@@@ =LE    @: ,X +) &=7o:B ,Lz5馛=Kޓ4Hz#G}'ѻロA@@@e˖wqkOtt [|VXBO#GvBZX]~n[XlA#H@dd6mڤ_~E6lp?ZdTTԭ[WڵS]jZ$eeq=h@@@@@@@@@ d@@@@@ %KHSJKsJ*N foLV[jT5h+׹*Xn6uMZ:"    d[ܹs: xڵwVuݺuZpx 8q]SxqU^]UVU*U+WB ,pm۶M7o֯궶o /ARJ+~][U}4eZtrΝU,@@@@l,p%֫*VFGG={? O'O{YȟŋE&.\X R޼y=/?=ݭ۷#Gt!>|ح޽}, ԂB-ԱQFP Ip,EYHJ $D^mRg9        A%    @6غUzi[7ihyAhB t$5n,u԰4fԯ_lqoƍDՆ#    +`}Sg'NC!8/(qx }e@H_0m xւ /"jϟ?j,h0_|nkPsCVsԩSnlnG߾m;V ~};oa  ,R?ӂ/жq}!v/zx:hSX/BCCCpka5Cjg1yDٳ5K[n-15mL_Hh ,YTrNfBdZv/ Y%@dVS.        Aɳ@@@@H dԻeҠA'GCaäV]ڵɓc??䓚>}|A͘1GGG5ncgφjԬX/Bv΂$K>B)S}ᕶMoPNG  @%@@@@@@@@@@@nG@@@@ 1#Gn7WT)+9@FZJKFi@ onAfҭޚr%    \ *@jjRk@uA 8l­3g@@@@@@@@HJ wR'8    i2EQC>!2mܕ@"Ҵi҄ KMH*R׮]?H6!    @ ԯ/X@*AA*        $)@d4@@@@@ u*j%u&u m u옺gp5)]Z2z ^ЩS㏧\    Y$@dSl 2[F        @ 2@@@@Pӧ#ZoƎ 's? T*}Է×R1z״lٲo,    dA+ۗՠpR T@@@@@@@@ `@@@@ ,]*ի'=RFw Vҗ_Jvݫ>o,`j}    dAڲbE?@ /~LʯJ@@@@@@@@@  ķB@@@@^Qwoys|yiZi`)O:̦ZIWKMo=lX    @ -*UHdFEi11YTE@@@@@@@@A t@    9K࣏/fΔN̉hm /.-XPU=]ӦTXS    ɷX-On@@@@@@@@F Qg@@@@,ؽ[VCMis, "ӲeѣR:B!     |yL@hhl I@@@@@@@@A/G@@@8@L4nt H&H_|{YS. 򮻤;wϪP.    $ ;Ç3$' +Y &Ю]liRӦK11ɷرs@@@@.LD K 0EΉyƶ Ȝi3        G .i     @: \)]}4b4|wQUyǟIP "kA@P`ö`[@@Q!HQ@ !y'&iS~92{<#/2 DjU{Lz!kWiwe8K#   ҈h)>^:T*T(O.G@D==w 5o.MWK*͜)5@@@@@ w]OZ b|$2}TP /aQ@@@@NKY#%&]0&         *@dF@@@ ~s5%K\iFXhwޓ:KviѢ? W^)8àc    @VRzpaP#A+7C@@@@@@@@< 2`i@@@@ ̑ZxCzu髯O~CrSફxpa魷Cl=5UZR>}!    @ Ԭ)U ^@ 3@@@@@@@@ c%    @&i`cGn]i馛2*a&-m(EqZ4z4kV0\@@@@IeK ˄A!2 @@@@@@@@08z\#   ?J[oIo)}TFH!@ΝҡCG?4"Bji^@@@@8u \LM pqƋ        @h ʨ@@@@ؿ_zAsZ_~nᰃD ^}U2EJM=- r6ic+     pjldϱ) @Ѣcg@@@@@@@@\ wn    @. ,\(n-4vR͚8 7J/EDH  8^E@@@@ ȃŋO= @@@@NJ5o.yRlA#        C` @@@@,. ,կ/͟/5ie6@'<#]+M"M$͞-Jii_F:pۧ{eRRH)))Y˖CӔyy=knTi5ˣ+Z2b޷mx⊊r5z%TdIEGGKA@@@@ Z,Vi 2t疑!        .AL3N@@@@ m Nx@zH08CD ڹsokb.lS5j$k%$4Ӗ-mtQz^|xl{a_P9fmf $!x#FPռysYP@S_~Zjj-Z\QFiРA.K.֭v*UA@@@E 6/"@Rrr#        @      /H//PL7N*_>0IBS_~ѤI4qD-X@J矯zHvרQ8B  4H[V*UrJ:3 _\|v/=iݣv=k.@@@W \DJM Wƍ@%JH))Rzzr         A'@@@@ &LڶW͓Z 3?ZlZ~}ժU@rȑ#8}SmNR`TNﳪd ~vo=jݳv=LA@@@Q - 3fNL -29Ď(@@@@@@@@@  ?    @ %]~t5¾ʕC| @&N:K.06mH?rzѽ{z_^ z_hJs]v˽iӦiɒ%zp@xٽjݻv۽LA@@@MQ#hQ)>>Fx8q ['         l@@@@ 8 ƏƎn=8A_`ԩӧ{9u]Ђg(^Mɓ'+!!A;wi˗tҹylk/w^+V^y5l٣G@@@@KHIy?Q.A  ٢         p4 >@@@@\ؾ][>u횫ׯUW]~8C *\Ǹ~X.[]^Zl^Â/j|ڏ/nA{qŋs!l#   !+Тz!Cdrrt@@@@@@@@@qsY@@@@ \VzRSs&Me䌳  ͛kq#9{ӏ;Viiiӧ.r=SZp;ւڵk>}z-=z饗dwom̎^w}]v鬳RZTP! 8Pƍ?P+GuX^~m۶͵e}/UzuͽnAƍSŝ1ctE)))I;ƂxU^ݙx;DKJJ?d۽6׃ ?x5j8e,D>{lw͍鍊nr}>nܹS|\Rg}~iEGGg\tjhذ;M~;ưc?޵uu׹_|JOv| ksu6g2qDYݲeZjCL2>s޽^u77pZYF:u֭[]6m+ ri_|!?ӂ F@@@U 퇕( pt        AA9mt@@@3I H&I+Gep l>cEFF ,>5jA6Lvx uAZY۷g,YƲw^uE˗׿og= F-Ns׳ j,,A֭\_&8bh111߿~7rhᓶkƌ.pޗ֧67|L8ba*UB٣ZL]_Z8[80͆ Էoߣς kjɒ%ZjڶmDiC3g{ァ /P=zп/YԀܹY ;`F3iӦiر,-jeȑokٲen?wa6-[tYpR~.-(Ԃ(m_}gv؇zȅ7m[8"Z-ڱB+/fr۷vi65kwڥnA@hngZgl݂{xec"E~.x?zJ+TlY8XO||=z $j!͛/.\( HUVu;t蠒%KjժU.$UV}-Gg E닙˶mۜך5k\Hd6mK;vRJynʗ/C֬YӅ8Θ盐1G }ٽ{֎ӊ?t֭n!K/   =&lH[?=F kaG@@@@@@@@ >    @J]'-e>_#mڴ Λ3gNT:`V *t*g9gӦMڵk )l\ҝ5rH͛7ո8^Z?Dx]wpıc*))IӦMS~N7XhOs9m?&79^+W3<;*::Z 6]tqI&eܲ |{XbؘJƇ )b=s>9 @@@@@@@@(h z>    "EK.&NLBFTXQzr| ^m7,XTKhA)Q;> uܲe1p@,YR>CY8bٲe?ʕsA6lPBBBWTe~l+O_-ÇW޽eo]so1qasgY eݺuv; ^M    $ТA4ߌ5A'         A< @@@@ v:w,'Bp| MFsհaÎ,rG `eަ    &`A+WJ#& E ȣ @@@@@@@@F Ƞ*:   oIK7 8:+0IC &&F}_ AmVJ￯~[F6e%$$u IvZi&uVlw7㮹g2i$ >svYPԩSէOܹSv?\y]wp;O>ޅ@Zi\8;c˖-.1sXH&%%7b!-[}l_{5 8PW_}ƌ2sKJj/pfaힶ{   Az٢%Km Ĝ8 @@@@@@@@S z   ҥRvRBܹRAm:=z=.o:7Q-p޽[]O>J*jժ~i̙ [o_y9ҭ1b &/YF}?/o5k̙~ ժU+h禧GZ06mT>&Ooѵ7߸ Ipb拝~ԩ:EFi 05-XK.n\rСc:fDZW]veZx;dРA.tx@K{x-?_x7> ̴6mh׮]nmݻ^z={VZ% 봲FpY9~-[L{vGk[_~ r1cl,wQ]m5tPzn{-qj޼ϟ/܅J ga͘   I%KJ 3 G         @ Dx_Mϭ]y?έi@@ ro="@""$>}r- @h ??A^81yApRٲ9*x, ., KbbRSSU\9GE.m޼ k-ʕ+F = \,f͚B3nfzjխ[ׅ8 ><,TKZZ E4O /,i߄/gF{WŊsihaO;好,0N:nyYfBBjժuJA'{co {?ԙgyCُ  @H 󥐞D䒀(jZޏR4@ cg A1)߿o1       "P8T8@@@@O/.:w>Hʿks%NT\atUWwAw'FnWT,T˨Q4q^ti͜9SjO5^Vlllq'b.83@nݺU]tQ 2ązځjٴilp*{K\ۯyYdŊհaÌ,Ɋ@fv=lj׮}*9B9|p/pcvmzꩧ"3WG#    @Zs";AP@@@@@@@@@8op4    @NLB^ʖ9(} ^M7ݤ~k5l0qywە8VORRRKr.RBvZZ|>c6WZ~ZƍSǎ5o3:<бXbӧIy5էj׮]/u7p:C瞓cIOO5vXM6M?-    Uysin)!Ad}-] p0~@@@@@@@@[ ?z   'HW_-|.yyvi.@ X_ j̘1ݻN;4]s5pڵ{WsOF,0_;w0^^d۷J "ѓovǯ\Rƍ{ァ]W]uϟNu@@@@ l5=_ Ȱ}0c DGK;ve^@@@@@@@@@Z 2{G@@@@B~;^yȀ:# {wi&w}V^2eʨlٲ5ھ!1pŋed\+jlwٽf{vy;m@@@@ @RLu?[ ,)݋         @@@@ /ii`ȯrG|뮻\]xƏzKÇWƍգGSڵ#0@jjΝ)ShԩZ7Tjʗ/ ݻڵ}!V z   y(мhQ^R ܷ/H;O@@@@@@@@@      O[I=vxPhڴ>_~E&MĉϪTR:եKW5j Cf e4c Wg͚DjJB u"ZTۺwRBt ŊIj!3Dz:R UA@@@R ?8(NS @@@@@@@@@ c`G@@@U7nyD߂uSh֬>Cڲe+M>݅Du]\:t蠎;}j}pa6g@jj-Z9~ٳgo֭[=aA/v*UdggtI6)#"z6MڰAJKe@H C11RG@@@@ TZ\JNBeT DGKZ@@@@@@@@@ Bo&:D@@@\o'2哀]{kҥ9sf͚}qWD nZmڴ^ݙgK ׯO?~мy󔔔:rHuI7VDDI62RQW<#oIkDں=wߕobZȀHPdvD@@@@Fُj,^,uVt"%KJ{e         'A +"   +0aԿ4d89y!`AwM4q;tXz̙s/ѣ *@Ȗ-[E֯__ X6/6s&`ٕ+W*>>ո8K[9 0@ڵSzrv8HN_=቉Y"A^Vl=%wVbRLTYmaeq     --ZDd }{n @@@@@@@@JqF@@@@>]W@ X 믿 -99Y? /B= ,%5n؅e^ *j4'ҼuZt,Ye~بQ#jȑ:묳daQQQ7RKO~fov{SSksTD-(jU    *)5m ,ЎpqL GGa@@@@@@@@@  e@@@@ \F2_?eԌvڹo,t/>>^/vu̙ڸq;hѢ.L~jРliᒵkUռ :,HR7mڤ5^իrJX-mիPN:iРA^b m^얱G{hb'))s,NB"11R"G@@@@ /1-ʋi}> Gz        @ 3ϸ@@@@L?$]|Գ[B2*XZjjvڥe˖˗k5^@:T;^/h. \UZYu*U"(23j[m۔eՂFmiY{ -`baÆnQF*[lh}%J Ïx ?C" 4)M+A%wd?DA@@@@@@@@M `1   P;|as/$*q:a/|4q4apA T׮K^*T8:ԩ-"?Pꪣ,{- jrrcHI}jvZ5iąG4(W FJ.+U ݴ`L 1_y}\B;wv=5jCUJV;v LM-0RD,@@@@@@@@@ 2#   $0nCرR^'!o?N$m ծ-]zҹ ˞gRo_)!A_).jȐ!zsoZj]ݿfΜ!?޴{ݻP /Peʔ 1""5|/:´4?ҿ=۷!ίY ٠oi!^։}e*[    SE_~!2:޽3F        #@d5#E@@@01C&#p))W_I}&M,)5o.  =ƼC_]^΋bbNp=:9YZ\z?y^[oU;v HkŊSn\}饗K32eW_}۫gϞ64J *$թf)^֬V, …K۶[ /P    @alGYNT) n0        8 y#    !.jtR>O`9طO:U|KnV1Bv8p@v_)'&`iiRV'vիW/pxw*..N,r\ƍСCpԝ>} |̐!CpYhNj'`!zx,2B;|yaC_HiY-   '+Ьhɞ@tcd         |8t疑!   ڽ[^=魷P@p]ɓ>R:xP:<驧.V=w_KH& ;s9'3LS <_|QM6/DN(Wj{AS]0 /RJ .pݻwW*U rou9y(҆ DZ3|u SiC"+U    p< iQ@ǐڻ@@@@@@@@@  9    :$/KڳGkx: ۥ |vXHj^s0oԻ%ԨQ ,bc.3А!Co߾⛬PBj߾O>2B!u.ڲeK#4ʚ5}R+DJ-_ iicb$EA@@@Lqsd?@A %{OA@@@@@@@@M `1   С̙7HժI@ /O|F"҅Jo-]|TL ϥ;O?^*[6⤎v#Fпo 6L׿bazZdV$3f`7xÅnVԽ{w ٥K,Y2Ldo%J\-5sIOV,_.X!-[ >ݷߎ-VLZ3!! {dnu@@@GysX%*# f ~        AA7et@@@^w瞓{O:BUg͒, ]ƍ nQzPܾBwd_hs /nѺ+u-]vy{0k|/Wmq^)S\0^kԩz!cbbL(<!ը^h H@䧟JWK`֬g@dRFZb@@@@ Wʕ-"2&e+k/ў#rziGgi#{oMr         P` \@@@@ O~AVi0͓K(-m[ǢE}Xdu|_,':%ҁRVy?+B;w֝wީy)222/Whٲ9R[n_|!GAI&.wöm S%M5*JIg嫙Ǟ*Y D~剺/۱q@IDAT*!3CںdP@@@f|?*aP=7\ {'=?OK         ,@d }C@@@NR`wo '8ɓ9 عS0A#믥b|_G =4jHC̉@\%5lVNܗ^zI͛7ky+WV]=xfϞB!?3=*_." y\r|-N ~RګW߁,r?~*ҥ}%H/oT#EDdm-@@@] ,^?r_uk)6V}ۏtvC@@@@@@@@G z   HfI~8HL&MƏJ*TH^`K%J,Ǥ7ߔn1W/{nnc {G=JUX1?.5_H"ܹcƌъ+\()St׺ڵkB!{Fa@@U \,1CH+ {+!K R?@@@P pR utMAb-ZHU!        #@d=A@@@r$pҼyRR9jX$id飏iӤ4kW魷^}GUmWһt B>PEQ,T}ET TP^i4# oY7! dw:fsf~g,sRi_aäѣ A6h&dD^7.YUV-~o߮>C2Dwu*V ٺukeϞ=U#S\[ ,[cG rŊ#sJ?*W@@dGD~:   >kK6QΆ }W z, r׮[E%[@@@@@@@@@p 2uA@@@R(ȑҔ)R*) wC L &OOڴF.X*T(*>qt-˥5פ_=ȱ'훶˛7~i]veըQGKP@ѣ_b݃c…>r̙X`N:D  XppӦ%x]ZʕG!QÇ% pZr   }͔IZ ԕf(`3K/ uR@@@@@@@@@ 2OD@@@{骫nwO|[")8o^ 7ZzJM*V,[;Kwޙ{T~ڷW^3fn89s洯G<͛ƍB!z߿xvCO kϊppj$į]p˥+$C[Yd͚G!%K @@@}-_>٥Kh^$k{.Q &[@@@@@@@@@p 2uA@@@)`!i]J6ɼ3#_]Wn]=r§}'|W4d)[[zkĈ.Əv].%lʹ eϞ=裏|0ѣ5`.]Zl۶rmb+7Ըq`_mpH |]鯿[)x][ .i@@@NEgP QjUuR6Tdu+:&Fʔ)x          @ 熚!   'Z?ٳi' kJX~ATIWRzHIÇ_F Z#GKvU…ӧ"5YإK>|XK\̙32n8̙SmڴYldퟍ8V`AeݦMGD.Z$sg`C"-p)   $E&1#)[ )pgݶC@@@@@@@@@p^     Λ4I.*mY@ l")5o.UޱWҚ5ңgRͩSLj- l v8PYd<(2eC 4`}\xpMwqʕ+zt=_)666@m"ZxqQ 3ۂWKy_~y 2ON@K T@@@ ,rjT<F l¦ETG_         @ 0L9\ B@@@o ';/ Y@ '͘!YxYR҅ʅIQeOPo&u܅S(`s_;nא!CԷo_߇ h&J,+/ק~3gפI4hN:snx˗/j!Y*T,11GZ?eˤ2zqc`Bu.-,fM)w#   @ H 0HNA DM_/=d8YKӦRM"        @ gz#   @عSCjRz @#DaϤW^MvڶƏ! q՜=[6L<995]+m&yf׽O>;v/phbJ ȑC{_˗PH dQ[ Ybňo3 _ F];į~ݑ嫯wK3K+iA@@@!P\\AʄJzl&         "@d)   +puAj Q` ,?$5h =ԫTd88:m"I6hn=NRn#FPÆ /+H&jժ%[mqOC0@7|jԨC!cbbԬY3tP ,PԪU` *6V&H6H\@൳^#5kJ.   e6@* (kA eIJ矟仲!         A)    @^yEէD?f&a@@@@@@@@@ R3E=@@@@ ]+pt-rT08tH3GzewL .f͒ڷ'IUS\IiӤ? |Knc2-6L`GyD '|2 !A [ljӦ_y^ڇBp#{[ҭ+guܹ s }Ai7,J? D*G`RK}p   kK'w]ؿbOܲw^۷/ήǿd{i|8n=ܹez~tԒͬͮgufdɒ%n mٳg /9r(gΜ~n˝;(/          p2ɄX   K/*Wx" *D2B_ߥ-aYJ D϶mmI_/m= ,^,]|qxղH"0o]W]u{=v/Ȕ 'PjUbmbٲPG}ԽVY dLLZh  \UXzjIKwKyOIڵsmݺU۷oˎ;ܹslݶ=Иbhc/-H1 m }l?fo\0d" \!`$h%   }ai q No ;￵j~ٲeq-6щ[,X u 30~̙3?u r uqtǗG|[{ b/-(3 ҴcC7m?  BeѢEe{Yu;'@@@@@@@@ QC@@@_}%=sRj構y҄ ԩ />@jNnfT)MjXFI/(& N`")KnȚ5{-~N۷ל9s\KR m֭SOi͚5>҂!pijѢbbb|0d5y܄%4mXUUCZH}ؾ=_ʑ`H WO. xo.@@@Bb@AwzWoKn>Z_ݗx *,P&20h (S#1^B~5-M[ -.i v/-ӖիWkйP%J<]J*%KJ0gm        *M#)SB?  6>Sc p2I{SGh݁PJY${ n^z)ԠԷterCӢ.]J|s/-w^,3\E]~*i)$&ݥ}sg̘gٕ+W ٲeKe˖-]X.t鑐H{Rt晁 3@A@). $ШtY3DP8ty駟\~g/~͛7eg~K +V,/+W+`zbAॅoL2*],Wʗ/e W/I 6        N9 F@@@Hv¥ uucN5{4n{RRR~Rݺڪ{.m m+AkS|E!b)AqСQF[n% !"Y@n~_~fΜ!}Y;O;wVNTpHn.u+Jtz.g@KHxq.BtY@@@ Ԫ%-[ lٲEklK .hEV2gάRJB,m۶>}3gΐבFRJ6&a%xO?ƍuָΝۇBVtBJn;8*         l M@@@@3G3F2E:9&GɘnLƏ&L'}ˁ92׿]pY2&B:.0nMtaUh$ޓ2@,YԲeK<~3|0d?͛PȘU^=(^\:mPH{]7ߔ\q.x*կl pyD@@#Pv`܇mC+~ZjV^mm}bAx6m ̚3ilIq׮]>B!'_/6ɓeV2eʤe3\QVV׶        'tؕNޚ=[8@@ :Ns^>5F 6Vth=X ۷KjɅAIoqc p.{LI:ZtRR)ktª4F6mr6&k H͚!S|[jU7R{);TݩS'@CDdhX طOZH8_HGKKs!<3i.;p    pj,_.n I&3XnEҮZ}_ݯYڵk.Su7Ajm9s Ua+`}˱ܲe|eŊ1b~i…} ݿA:uؤK3g>vW        @ "   @ ̜);r!OV{.OLfB_*^\Jꫥr±W_L|n-~xG H ʕ+2޻wo;R7|>Ȩ4ܼys @3]rO?[+V111jժ"ag+`hW[pȕ+~aoY5k_@@)If:w&*ƍk׮n҂FjРJ*$*P%i!Wv<|y4|p߿_eʔYg;&ñ>y         $@d4Mڂ   /p矏ЀtpcW5b;R|WFTIJE&N ,[9rЖ-["Sŋ /؀/\wy˕+Wd5F@>ޭ[7ʂ f̘!w ϯs=?;u "T,Nҷo`p\8K/I{Ƚ'INj܄  /`A˗G|3R6gAs~>#-XM8pP5\-|^dV v dɒ}hҥ/#WѢEնm[kN۷W7         iAF    ,4uTp6ҤI /H˖IMHKݻK9sAlsJKVHmݺ5ZYNo3÷'U%2D=Љ6vB.9sfYH-8ܰa`B6mC!cbbW".+@k bᐫV|Y^~pȆ rd   ,P4mZ$ uu6Ξ=mwjӦnVjJ  #@67Md-'h!gꪫ|yvY-[TVE        @ ^"Q]@@@N sctRnFZ:?()M(/az#N!AV DV ivYWziqdɒz ~*[lhH@ t7eΝ3g;:tUX1.lP5h{/pᅲbr!jUR@@@YSڲEODv+yfz7g:hذa:sUX"@ X-6+Vh֬Y~>|ɣ .@=zPvLS@@@@@@@@B$@d     p*>(m&©fX#BR*R$(woFOSD¹WrJÅ rƍ;SzH@|ԵkWĺ7 P3fWuy`Ȏ;@k#`bK0Ai#_~)ΛWj@Y)S䴙"  @Nn|y 4}t7YD?)F2etE顇R-\?I@k3@McG!={v7iZO?iә̚@@@@@@@h #Qy@@@Ea3%KFChCj ln04|vԾ;RrYSc~*m,v ֭[T FRs\3ϨK.tYg9͛eڰaC\(.EKm֬q.@ du֩X 4iٲ#s>w Yb#<@@ťE+m#ڧTэ7ɒFh„ .?.͟?_M49rg,ǂmٷo4i~oQ{VΜ9#a@@@@@@@@ C0<K Ae =cŋ% +%ҥJ*BV:v|P.d@ E3@@@ ,j֔/˪R+\ڥUr_̾9R$2 =z0_~ſV 4He˖}kF@@@@@@@n :@@@s瞓ܘE#e敥zi.EIg!M&=r[jҼ:Q}@& r_,r˖-oz* LaT:@9¾l2ixT@˧nݺ_֟{նm[+V~Wu֔{"9rHK_/M }] /EHSH^(*%.c}i'j#  j~o'7ne]+s.ΝC߲Y?'Pxq{Zf[5j}]~z'?ے        Agϑ@@@@ C}IUfp 'p+Rz9H%@5;B6JaYaGﰈKv:гR^;w~蝧_ӧOW \@K 7RRݺG*3|pG R˖-uС#+,XVz\p.ҥ[R  QhѢ˗kڵ8p6oެ}Onڿ^:Z]U >o՛o.]@Z[ޯMs咚7nY4I{GI7$e*+{dA+KzICJ.M%%'{nl}J}@@_f ~!CF.g1ydծ];Oj_~ѣ}'%y|r%<?z$t[8'ݒ%KdJ#$vqxK/}iXx7ˇMTN}jQ@@@@@@@@Hg px@@@ȸSt=׀87U.'٠] Ǜ?_n%ˑmZ?,e U . ÇXܹs{iG;X~~rivnܥ g…~ }9sfpUXgۯZ*Rs?,{%HX م} -d|z'TZ5URE~+=n8<ם~fpxM 3/ ڶ[r}VO/`cig=&۶V-UiH믥]8sd  O]6_Ԕ?M^Æ Ӵii`7dӦM/:5yǎ{~͚5K۶m ݖ>`||քnG,՗.]95s>͈}Ti}8 rjŊnŽ^bccåz@@@@@@@@  O:MF@@@>]>KQn >ԳnRÆi]y< lLʑ[ >M֏?8.jժieny5ׄEVj誔.]ZJYg5jhGop~VU ,A?W58.!ȟ?z.O͛7O]t9XbKkୣFRB\>{pxM 3#^/.2| CgS知4 |'ʅdD=7O>c(J@@ X> eÆ j޼<&-[Cۢ]Ԇ |$c6+߿ z$t[r-̯!~~Bf*KA2e,X&G+W֙g+0W q b)icƌqx9qNu.        /@dcZ   a>MraIR6aV9fIz  z@(dU/M(R>[2[,XB4Mv7+W.Uԝ<(-Yr|-[k՜9sdOVrέ.y+xߓmZo:E 쵭e˖z'rJY/?-gя?n}6-Zԅ A{AuBl۶M+?^~/XM]4q3sXx姟~~u?R@@@@@@@@HU:TC"   I` 摆HAO>xBC^=饗K.p-LKxᇄ iW,XbZp&Mއ wyܹڵk]P9ڴiyo?g믿]{V>}0i!^wԧ.ʂǏs=ÇkzSO)66Vٲe=ܣ>L_\裏RJqw* , 򪫮z_+o޼*_d_^K.U||؛jY;f7+XY2e_fe7n{1ۉ\ _Z_e k߾ \O:p<J^gnl߾ݿfYH=_- jժK-iUH;αqo@{ _mm_F S&JrejYer7=S¦%ɍK4j$%lDE&p'(l  j֔;Vqʞ=pm[oS*V.]su,oRJB _&ܹvuT7v_l 럵(5m4wN4f7j:9ڻw }X?L7ˉ-ܬ\y啾_&y:6J eSۧ#F̯N:Îl/~ ڵ?W֧o7o.ʞ[9suygձcG|~cǺ[oتU+fuZyk}k6E]D?~(       Dˣ4@@@?\5 r)Y2GRG7t0>:tHפ XMO0r˖-5j8=zN9R={pLZ 8mχ,YBm ~]^+>͛CVZm J߿&O۸q>6PkYȚ#ׯ/ _;whlVzC+-eu߯.sS6k,@z \~4ۀc v/n)tiv7Hxk.u\.B8,X„ >ӂ//]q'T}һkvm\~g㧅ZH-\jL>/.ka&kS'?~b%M .qyr wo~qomϒ5`@`!)a.pևy  @: XW_CtX_~Ys^C/Ocy߿W\?p*Tpnmr/Fn:XB?5k;w۾,,c>c VNj냶ߤf"vi?𢡄A_pP`HMd- Xg'v'kfΜ#IOJU,+`m^`kVcǎuIuR^q1?v.O%t1dIYj7fo-IiCzlc; f>}         i)9-Ʊ@@@@.pM tyq p4qT܀;AoA|Bd~ ƿצMo^A.^וp"$>/.-ӭޓ{>I۶J}p#!>(66yc8sdS@@ KlV9sfYGΜ96g}l`p?X .\og|7w^}~B!ƶ< Xߎ㏻x?_NmNʱ &)Xl" +RS&>&M(_|nK9ہ1oݏEko yrIDڹ_7zd=ȊR/gZ,<^Vp))H Ѥ         A8C@@@pc|q9oGɣ9s?L԰aRŊryRӦr䂙ƍ U+Fʕ%w۷ϝGw";[oŻ5x Z 6(؊]b}L4 Ɇ ł+U۷mJ*//B%=˅AZD0m.m`W_orwݮ+WN,fChAbfΝ>TlڴiqΥZ,2xv?V.R8w޳{ԯ_߇i7:Kp}8\믿^>Xu=,XBu^/5s=>( (;w_;s NCK%`-5bA.gB H# G?D\0  $.`p;O?v=u/޼yﳜ>}X+6yY~=z>@IDAT` g a I~GwlݩOvW ,ĴL2~9NDmR y?Ԟ={Nvר[~;4@@@@@@@H7{E@@@2Yo_d&-l!Y2Dw풞zJ.PO.JUZV8Q^=CD\#x[t.\X7nAm[d7c5kV zjKD .VҚ5ktwmΒ@7Z7n|'լY3mݺU_֭{@Sa&LPɒ%5fq~I}dߒ%K|l Miq90!'ONtW׸dU 4+$4^C@{,_B K/:{n7|}Vj%J+Z -%ih+`C/D:T7O.LDroo )-\B.C.4Tz ɲye -G@7ǂ/61Qzl>裰n%˗]lذA\pl⠽cP"}1se۶m&xЪU+?NjPqbۺA'Dz-[ o^_Z׏c':$t[pǞRz̬_+؏܏տI&`{p]2}P]c۷y 8P/=,X_=TUOM crbO@@@@@@@@ 3L@@@@  <7>NCyu8`l. $//7MrsBvҠ ".1ѐ"E Ҝ?QG)mIXXYԁΝۅ4q/ׯ_z QF><ӲeG`Xvr!5mT|0r@@1o渻ٳG63eR~Kx0T5a?   M"[O&-Lõt_&Y,̙]~"&bXl=4{lkmΞ={"NS탶#cv,Z(>\Q:P|B%T&)_~9OD/8p^{??|_L>up _~m~Hsr        a.@d    'plYiE^{,Dǂ+TnAn0_|&J l$-Ux.\X|Gm7o/J 20٩S m.)*66V*Um%KcO7n-W,[B!|wܩ{ɛ7, Xp0[quu]aV3@ T^?W͛fǍ_>[Aul߾na;JPA)Ss޽?ibZ,?oX]DunNMro`Ϡ}B/ʕ+n}r}-xv4Is믿mY-6r֭L]v!'Ovǎ@@@@@@@@X s!   "ple~-+tST@gn%cLP _cR m 2{l-Z4.دTR~/ |g?ۂ/ꫯV|4m4uAG_K/T̕_Z*Y@/_Rmu]M82D&Wl d=Νyʒ%_ݦMU^]?j^xA~͂n.۠oѷ[oU=: c޽[wܡZjK?=2]X{Tyd͑kSƍe;ˑ{5 l߾ J @,֞C60{K󵰁o}8=ƌ#D` S4^=%K, D.X.;eIm[Bm#ǸqI  $ AFWB-X#֮]i=ߵ> ;IwƎ{Ԥ<{Qݺu}Z(_>}1,&ɂyX`0G&K,0)Dz~au9&PɉUVU9R믲`end[{ۋ/֗mb 7m &vnۄ&T~ 6nͻ=~XlԺo0i6oŊ7dW˾+{E&9rdMdKjvN4W\Y:uFa[l60*jsj+qAJ        /g6wL7~:Z d wüOÍVF?1@ Aٳ r yIpSn{%7MO>)'7hM.H9}'>'ć$~ ]P˗\r.%Sb] ^ls?vڵ~jŊ剶M;v(W\ʖ-[naѢE>ea6׎Pm5kTR%?DK;wJ Jo)]tQ6dɒ=zL~"m{X}}GZ/(i&Y 3@ (&&/vo& p V!'G *o^aCiSIriiU+DDy @zX7eʤG B{L:smR.R*UB{m gΜM^p,'M`x Znjpq+BpTU _~[Xaz7… Uےsnv+8^jvqP*OBnso ~;CZ395~w|MeC}ɹ{uMwHӦ#IwdtWsp@@@@@@@2@ z   @0W/ae8 #uW 3 !RY?%? ݺukFE\k֭> 2M( `?8x[BVol%:uNbxƄGV%CvtI'O Zj_~ԭ[7yDk Rŋ=l'|ӧk8pJ* imGqO- uv.4H8{jȐ{pH¿@@Q#Pߕ+h\|Ϟ=u׬_ͮ׮];NNo+oPm>Ǯ;v ]>~`Ċoܹ~Sm2!+ m=Y;ԫWm 't[pfswRL[Jv)))q͗/_ܡfMOq *;X8[o\6lzq~         @DAi    Zn,/I^+լZGb%pkҀ?Σl;ih`jՇ@R mԩSSQW|M9u`K/4irȑƿyZ[L{ygt[/`:`˨Qd͘1/cǎڵ];wVɒ%#͇7|3u-^p5ksG"`߅ ,W_ǎ_!JzI}PضM R%)Gm~v_0.\FpZJl  eX!u=\'X.]e˖\@Eʖ-[4v˖-.kWj=F\]ʕ =s]6lۤ';7I1`ŃjgzqO $f̘1ڽ{?[dJͲn]`A2F@@@@@@@G 4憵ϔ){A@H˻yԘm@L}T@ Z͓ lOѢl׬Yr˥>}壳U'*%MpbzK]v=j{%{ƾ}Gu޽nz ܹ)~caX']֚5k|{ðT 4sL ס}jԨҥԩRbccSTNj/XӦMK}X^. H8kpYڴԸ\@C@Tj߾̙ .>.6mJq㢦I5dƍ1bߝLK.q)\|:ٳg[o'zY?`ӱV878Ghw}6ؤViQysZcJ_d?        \ +  @?fNs$@d -ಅ\tghjEҝwJsJ\8w5jDTl2,`ȖgI<$*HK<EN,J*ԩƌqD=?#?8ޓږ+W..Vê\aԷo߰ATG0H .6ȅȅ6B!=sS=bƌY ȑ#GU##@ L؟"*7J`AXW3$}෉'2e袋.K-am_ ,O&S6z}^Ϟ=կ_?y晩|wUr@~o<~-߿P/@@@@@@@_ k7"   i+0vlx{q9Z֯_z@̼yR˖),;$EIM~4I!sʥ{Fэ̯UVԌj qyһm9|[a!m/{ȧ:6 m-ZhΝ[{IzPB-`o?/< ݁o 3$d56D@HJrgnݺe> bFn߱cG{*VX72gΜ~;')ъ+4k,̟?_yq])S]vʖ-[Jw}[Tr@@@@@@@@$S'Jl   D 93r럑jn!w-U.$M*-X@dFz )ϟZ>m+)S&aSzԤO>[85=C /Ϩgv#       $W kr    '.vm$r=N씞kƎzH$suRlY+/_zc~u PmasC9眣9sC#Fʕ 7 3fO?키VJԥK謳R֬iAa *i.%2[ro*Y…җ_Jɕ+8ݴԬY`)Y2ͫso'2AnD@@\Rn#j7\c^rȥ~9r ?.1E~i޼*VQmDh,p}?~wYk6m#]vPB5bi>ɽP@@@@@@@@H@ڌJKRU@@@l7~ ^]ٓ p<,|rNҀRF Vuh'A6n{arwq,Y,rEAț7vX8PӧO> ,;PHSZ7R {kҪU`H 5K.tYrO]q$"-T2= H}Qo@@ 2\^,}ȨsjI[w \R}7o>sM4I65j(niРJ*Ucdh i]zjp7L2~|PZR pk+sq/'*VLZ5kI@@@@@@@@I p:@@@"VG[:|u@3,d6H.VtQ7j~JY!M`n,LC Zjiĉ߿֓!9sgNo?!}:ٲ/egJED*m&*%$!&D&$M,BY}%D?̵e-~wyn|{9yթS+֬YBZ0]wկ_ lժJ,T6 IeQ(`y.+BK޽RƌW][ʟ?( H `B@@ Al#RdhbO^8DN8Q/ ?5 ʪR*U+R^طo~Gޅ-[Ç+s:fպwﮚ5kzA4f H7&@@@@@@@@-ibF@@@@IKH|A^+^9rDOrk*ZT6Mjei옞]-[VKL2!w֊+ZȪ@nڴcə3խ[W?Hf)mn{Ki #       DAnW@@@KxYN N@>XziNOGQ;D eJf ʕ0owzw4`=a[Ȟ=n65uTM4IWܹu7zM6_~j.AE%*\@_:t9p@my⾖w1TpZgʐ!A$@@ //MbSW÷UViҥ^Y|}]/:~wb.a+vz*l`>w,uE@@@@@@@@||>C@@@ Ҷmҋ/ ]vd"vS [@%z4h%?nhwn.S2 XRJ2mz)Kҥ JbT!i]pFꫯ*.. `ȶmۺ bVZE*RH\,NgB d*5iWC!ϗMN!]jז HXx@@,P\ ܹs뮻ѣG_jԩzπ E^(u.̓CG#Y&Mb>yRZ\;/Я|2R:!-%m Aτ  @(\l;ֶ[&-Q85ki?j [~gg|iw>kٳˎX(d6_|.3{V9Y +رOeEEnz),hG6l腑Z"Ex[=;|n;<         #   ػW0@Mʕ3g 99_}V2Dj@ZT*]:Pct K';c Q}dG99\;C=zᒽ4*`pM6ʰa\XM2[G@6nX-[! Lַ;VNY;ej!:73AE@@ X(y\\* X_ pB[hEnٲEwf駟;w qV5v!˂(6p?gΜʑ#ǩbᒁL,Y\Ϫ8~8p,^CłAe׮]ZhhŊO(WX{-uԡVL=nTd`B@@@@@@@@ !A&Dy@@@@3,H΂ ϝܹusq0_W,l:v f ؚ~pnRn$f'p)_fϞBn]-Č@JdW^^B>#ܹ} Xү~&/oqW?"njzN^i+N}^%A@E\9ihMl.Sɒ%r1'Oz۷o!-$0xuN Zؠ;YAf͚U iV.S^<쮎f1cSg 2Dt.ڱ+w{a[á=woAgݷG+nmM[ ,VP=6h0%{ exiV@@@@@@@@K z?    $֭kI}ȝ F Iq'Q֭#BU;Ē;g՝tK#NZd)ߏpA&M ݻkC@  (B;yłfΜ &h^XdѢEժU+l M@ ҤVK׮~϶mKs'"Y8[oɅHyHkuJժɅh   @$ XsP;ӥ[)go|<' )ܻwW,0Jxm p̖ <]͊8qDZM箲fv,{kYIv%mڴs6  Swbg޷G1Ͻ >wiqwA]=/X3ihaM=~O?r'^V)6رr]wXh@@@@@@@@ 7#   @ t҃3K5MRr'"JKݖX o 92~ P*U:>\D@ƌG }Ђ jʔ):u ' h֬ ټys/L z5-?Ԧ_l$.cD9dSrA(~d:~8ݺ|X&@@$Pyt5ke.\8#CDZ@p#Gx%haǎ;og5p3~ԩi[97T2n <~ d,vJ&w@ټ9nEZb^~Y$RA )m+[        a-@dX=t@@@Q`z7N:-`_&\CQZOTHAIK;wJ"լecq+̻ԳgOƅA4(&@ JJ5jK.|8@H ر,nݺ^pdVTti@ +vmtwtZo$ i` xqt0UWɅ  @ +w!.r)f@a9r䈁^|EJsH?./G%w4yx5>\ZL3&Mo@@@@@@@@GB罠'    !.oG I:\ٲI\u^@Uҿ%rDdbv.=ׂ)`qyBLm۶iذa Yy@ d]jƌڵkƏ/{W^Q2eҽ{w}W^Hd0\"RC1Bi>u\niv驧ʕ٥믗}Ј|4  RbŤC #y,.*7n4zԠiyf䩈ߥk:b@@@@@@@@@RX ~h@@@"K`Z魷^i/Y/:\ZIC s{.s _ܹݻ;7%U RN rÏ=\ p ,Y[nѿo lժN(o޼;5aZNj%8yp4zyGjΪTIziX_ft@@ R!"n]ZݰJXX9Sr_aB@@@@@@@@ A&@@@@  йe#Bu.eKg 12@Bro)yϗjJ'|RRRKzbB &Mկ__ Њ+rJS6lp+O<5l0_>53+T>Z5֭r!~`w(,)/ҠAs;ҽ}@@(_ 6=(WN[c1RK'N;#I.pRfk        nA;B@@@@ l~Y^i/M /sW-reiRi,1!tܹݻ^-GNh\ <%PqC ͛/17/#(]iڱc|MeϞ)+Us{ou W+ ئ4p4wt4gz/?.*oe*5h  +}gOXN! Q/bTȜYz]rH\*Q)]%         I 2)z,   1%`'(!oayiK^+U&T9#/m[pꢖ ؉FDŝ.>yw@ ̙Swq>ܹS3f5\BQ͚5uWSN:u>C Cn]{w飏`+#+eK+T:w~[ 0! DA['9]b4DH|#Z%U"͛#~ɓ.ծ^svҞ={  _Rr\_$ḃ@!M*ԭtґ#6$N.ImJ%B@@@@@@@@L >    pƏ}VJϣ)ٳw yꔀԪ%)-Z$5hp% r@UҷJoI;vj m]gJ@jKi="NR;V6L)fEȧ A@@@@@@@@HA}    @ TUBp ۽;!KEH͛KK~Hd5޽ $ #=72t yRbR:?[nEO? EY?f̘;wjܸq*\^~e.]Ze˖U=4ǥYH$D@~OH}$ ICۀ'5k&!U,u*s7F#A@"AiJ-_@ d"?ғOJ/=ψU]4:5@IDAT?)~0         2Xԃ   Q'y4fSRڴ ͟-Agm.5h -[&}Ժr ( Y@'CߗXj k׎~}ի[o1Z@(5kVmVvءٳgE. #կ_=ܣI& @ ,dcGmh6ik -)" Yo/!-]J(Q$@"W\9i=G VBs/(M(w|EjXK>ƹiPPz¯@@@@@@@@ #   @w)OC5+kW▍~E[W.G;WZ5Fx"EG)s q /WN, 2r_+TNϻL @ IF\sUViŊᾌ׬Y[oUsVf\mܸ1LGA@ ImHo/r3~ZTIʙSj\r.DV:|8-<  @@ºmo_BKDXxq9zhqyJ1         2آԇ   Q!}rA5R˵݉[6KՓeF*Q"FX"M kV<)E^uU*|w/Ax{9ٳGÇEԉDL2޽km۶MF_'|REqaUջwo-ZH'L{&JLFgO̞]9Rj߇][sC< -DB@d '[4A_ ҥƏBTo!CYwޑl_ @@@@@@@@` \t`7E}    @dq:%ϹrTlQJy&ޓ%JKRƂ,Y<$N`\)cFr-R}QO@n~wkĉڵk>SvocƌQjTpauEӦMӑ#Gtt !`!*I=$Yƍ[oIUa7O//up]֩@e%pD@Μ~;Lv.!8YcZYjԈg@@@@@@@@H 2%   *4re%m[A駓E@@@@@@@@U cg    pA?# { 哶m׬Q7LڸT4mtQ7D!8B.TJ,̺oAkY;ٳgדO>+hQDP@ /{ ܸq]> (uPKH1C  @ʖۏ y34!./s­[CXV}dvc3GQ        B3Nsa+T   DD "2#e͚NAI]',)})SYP؉{I'NNXc%M`>r xyeɒE/ҥfu@ " ,.]Ok.M8QKvT|y*UJݺuӬY\r}VZz_~n[K.  .2HKO?w--Y"^K9r԰rUԣ4ugO~  /PdMn׊ "Xqϗܵ.Tti& M"wH| K        Q%@dT @@@*IH=Ԛ$ ܱC:y2uEJ viӦRҧJ_)=(Ь6y"DT#2_>cƌzΝ:j($^&@ 2gάnIcƌѶm7oըQ#wr~^o^^)S(g}V^{WygI zmyøqƍrFӦI[*JcJG(  de*\ @ /uᎍpyw+ &խ%b        a-@dX=t@@@S?{ IziuZ8b,LK-ZHG'e f.0h82dO1K=y.c ~w}*\z]_ @RԷ:uW^?W^ڲeɓGM4СCOZɓ6Hw=0{aA$"@ -*+)o>eˤbŤ"ENOu1}h@]P!)KiŊdo@ 9rH}&w ?}/ht=:uJ|=,        @BL"   @T /m$uaZM۶ɓwKV'(ͣel$PԦ? Tit); [7e+MV}رc1!1(PdI=/c3Frs=ŋbŊСB۷O͛7O(wl.|-Kq_io"L        $@n Vkm5}Aj@@0Am5h X@rK*Jwӯ{% 1Cj$8uk-?/@^{m~! ڵK[lў={bq=_Uwj==zT0( JΦL.wk\~ʑ#[s… +SL1}=s1MlCUܗXbG%[4}Ϟ=[SLq~`c4i>U8q,X2'>9t7?|93臨ml;L;ݗ aB|ɬRN}80O6ԹT2de]敌3u߶2goLJAk̙#,+m/լ)կڵ&C EϜ @6-xuRqҽJ7 w _&DzEipp|bOf-_\qqqZz6nxX0ҙSwV_̿k ?@H8p L:38_$W X:spH ,RWʔ){@g.֍R_~Y7xw\V'B[7n앏?X Lr?zaGVv.0gҞ ޽{Oݷ6mkJAkxɾ,`т!Ƌ;ZMt=o'Ͻ(  iܶ 5kVgwiԁ-[S-۶l&'6u~y1UNCZZ]D" Y;j9@@ aJ/,zF@ v$?aCbH'^~.jR8quB ft        @x  B@@@d8PjL.% [ۖ-3j[^.;їX %Kh^G{,B/kT8cea@9\bkZbV3Qt.i;v88>7{*`" ^j֬%J$p]h\.qk_7p$g}V3gΌA2*@  vK.mVڷo3f^B t6&ضΝ;r@ZNxfhݷ`B thY%SL3z[ )iU izy!J 3pkA[nՊ+NjZsd~̓'+ {ߥeXl)6Jt/5xtT`H ,Z465 @ٲ׷D.CC@-*v=Hv1% :]p׸_*wA1髯a'        @ o1D@@@K ,Z$}\h֥Lvƍ _.8~\v+##1,qKz/^NZ N`Ŗ-[B ^Т@ZHR|&~3%+Wri8,]ԝX.eaPsVڵոqc5iɸ$,V-)uDv^RÆ QF: _`ʔ)^B/o/B={7oެ@,9Zt Pnmn-|c xykV,3Xm'۷O(\|O .]:/(B!m[->n!L/`7ߜ|-zA0z? @@ppL Uap}@T)? 򦛤uɓ#sE,Vgp@@@@@@@@ yRXNŒĶ۶+$V  a#0adyj -2d=ܒ*XL W>kN7$מ5+#-\ )ND[nՇ~iӦinM%JB뺳kԨ! }H>>{ׂ ͚5KW!"k[VӦMH[bRǎR^_z3*F$M^z碅pgJ|kM&ͩ@`/_>&TǴi_|]q> H  mR PgZgѢEeV "f-^ẁptO#rr~7?&>T i+Jc Eyx@ .+]2I/|s"+a1 N7q6m"!串@vR#"m       Dg!Eʠ@@@@ K'Jo%6_̙ [&^Tz_?B #>ZΤI\3g2f̨f͚W_ -T'&W:uoL}-]~jժ 3Ȑ!CXe#>[ݰRHK굀O>D7xc f@常8ʕK 4٣]vyҁ^Z1,TR^=7oވ  X|Zd[ܱc6n 6Ȋ=]9sdɒ+*hNHd@)o/L/6+E!_|QrAʚUrPH ^]J>@@ bbű¿"`K?_vs˞9y2!2@@@@@@@@     @ n5 \dQ t9 Q5IR/U":&&`a:FSz-ZЄ Լysq ӊҤIڵk{W^ڼy9%ֶiF9rP:xN C5kcbO]P֭eC7pe3Jb^-[ ~G+[nl,B-B-ς-KAe&"*U*˗+ժU;ԺuvZYF?W,X׻@& ,WܩEW]u,<)G]lOI"l<[R)-пƍR֬鍅%V&^-*6_qmIb6mEG 5t}K.*W\ 6#:qΩOC>SիW/l2$*ծ-׿h׮~/ -M4Z@dXn,X zk aPrSA{Wpd!!|n'ђ%̙rS8w#        N)X]h֯U#  WbʕJ.y)@ N8}@qIgTa P;+kVJ0Ȕ)-#ĥY̛7Ojeƍn4ի뮻++W3Eڅ HG!N. T id1"Wg" @ l./wHj({K@ ]|@*^\6Mʕ+lvkcܵK>]ꪔ_;@@@@@@@Y=el    pAABi[BbڵJļr\Ce:FV׮]հaCwbaq0`!Az*VhM8Q \Lr{W7g!7 =6oެ7|3MQ? /ݻwkܸqj߾ͫZFr4rHmذ+=#z@KbQ }:b늭3%[lݲu5[lݳu)bMH/(͚%/+%8 =v;Ժ4pptxd# @1ٲI+VNjBp;v]H@K6.N"ұc~>!u@@@@@@@@ 2i@@@RLϤeˤ'H.(!KVFC d U++WTj4~x/|fڴi*]t7E׿U?kN{9l}u9@"EԹsgK @^{M 4rԯ_?_^?F}.\8FbH!u-[l]uֽ|.E['md|m[޽ҢEWڴ.ը!/5o.~> Į@ٲ;l˄1,p~]Ni|1oEFǸ        @t +B@@@ (5n,UtR9q&qA1c lٲiɒ%bb)9L2iС:u&Ok!Rz!o(гgO޽[FJ̎$^`߾}z7! {WUJ}ڹs& N:k@ tٺf뜭{3gE['mݴmE[WmeT*=4ic\XiaÆ(v^,(?@@ )#Xy W+h=7ߔ^jDnWʙ3C@@@@@@@@_ !   !lOd(!]FB\%h!,↨>}x㍺馛\,*T(1oVԩׇKʵEdHYyW^q?$$@ sU?~.mGkհaCM61S=[m]uM muY[wmf>͛ի^Gƌ5,g$篃ρ! ie+O?Į |Ek/i'NH}IO>)te6         cqЌ@@@bW`PNp3(^\ڶM.|+ fK;vȅIZ+>#/HG[oGr|%KԜ9s-[6}M/g4H=zB bY`D.QuY6lP>}dL ۺl봭۶ۺn? gэ7ި_~Yk׮#   @>){/J*7nvj DX+3/f͚`\*5v6ls?ka @Xl ŋ}ƒ8qB]w?]_S_|KަNZ ;vl+_ Y~Ъ tM6x)S&[>s3fk? ̘17K4r"C>3n&ȑCӦMn#Kn/OF'~z.Qal#7xÅЍ7xjۦi Ȟ=ڴimOQJ \pM(%Cqzʕ~I/AW@HU 5 j^?>~-[J-Z!?        @4A0@@@@bCȅI \lоf'Tn,<(]~yh f7JEFV ,ܹs; ϝ飏>۷jժ.#Ghذa?>+Fpz *tQc3o۶M+V8+´lꪫ?*TN< m <ۖ{/(չCWd›qo}u֣Nh~{^X٬YThQy㏕+W.~׮]?3}.'Y(lM~&L}Djժ6m^lŊ֭[m<䓧«-ٖ={VZ5jnp_h&M=4j(\R:t>m`~g£M:v}{<ץ?9L.]d6Y0ul{By ^*UJ5Ҏ;m-[\7 !_rmo܆ ;pm{ >s7C+nR۶zwSOɶaF [͚5pʕ+0;f禴iz,XЅ CmӶ;/5vڥƍ e־m<k#\& H{os5Ʌ}}mF^gH7Vl7a<: @ n;+ zW_o;"wQ?2J˗K.9bdh6@@@@@@@@H.9c$FL;    S.wM| ö*m*U3g$>e˔!C/&}իkY R\\|A/>w;M,{n/ɂXRٲeuQ2Z`]Æ y]v^Hխ[ :_ .y;Γ'Oz!Tϸt jpF*צ U]|ɂ403f̘&₴:uT 'c=T YX;V}?oaZE\pigl{ẅ){n4omXrzXp1իh:/W_}I&0v^UW]% _ &Yfq>|m}Ckowca՗-| 7x8YD o f>] ͳK Gt 4PժU k…ʟ?XhA 2{lh!mʕ+լY3w}OYh!{B!jÆ /~Z {8eʔ` h,h+V?.QL6> ,> %b.sכ\ >VPH t^(p^(}s~LDu" v++.˝ H pw / * H_S؂k7RVG@@@@@@@@ Y)    @ X剸t-e'TFRٽ[ʝ;ZL[KjXG/ ~y>h]tdA?+ZX9YXGZ8 z߼,lעEo묳GYܝ^ jJJyu=ĴB,͛ {~I ܲeK>?3_WEi(`a[wuWLjb7#xfϞ SJ*u| W V-x;;BV) >[a8Ϝ9 %?}_|gz?x˽^"[e˖MZ{l +f6y>|X3gK x`묖J-\\~}s_2e>_ x>{-СCXC'뜨>~ԂkX +ޤI<}.KV"Eb[>}^B9&lڴ +d27%6qmy9w'w5|'ޭ% mذa̼ݱ1`{`^jco+93>3@Jl7n]&Oe>g~.sܻ)HW^)   m> Y{3#+wHsIw)u(weu/1rn;BdX@@@@@@@@ 2GZi/    X" t.%kr.SFSjjv ){yGZr u*T;vxM+Uw{W{aPB-h) PS@daF)Ouaݽ{won & ylӦ7Ph ۳hoXp+֬Yk?@2excgVg P]z=ګ'3xlZIϙ3߸Wcc%n}ݞ4X/9ںic.+9rٳ&Q쵲إ@&xŒ?c?>f٭[7o7o^ݻ׫#0;e:'mϸ%ƃqcR*v^ާrrSR߾1….^;W:x0[m7ux&6qH;3)`ݰm+}Yh.!wi,y]"۠6@@@@@@@@I<@@@N`@IDAT1c[oU&.mZBp,СCڝD׼yb]˖-}mBdɒŻ ~7i?sYلmLzurk!TʯA֞%xL~.7lbYSJuqº%`S\@Ķc^ g'?#N&MئNX\ K?˝?ݒð\@KW]u.ٳ-`f+̕bŊYcY`*U''>\%J믿J*O>9f3qg^zz7ղecOhcV>Ę&6gV ;o, OI {}cӞq+'2; Q~ꫯԮ]D7+ ܹul+}dbAF+H@  J !CH[K'IOrRNRǎ=9礼^j@@@@@@@@@  W!   @^~YZTdWW~-URa#`Qs%ϝ;Rgqʕ+JXڵkjժc?Sŋ?f~4jȫ*ZxŊlbݺuj e$ 0JI1C:rD_RR릓AZ;s7ł&{w1sL=.h瀾[ +U@noka҃zmR{믿v!.$X}i@/Fm5h@ ,Pm϶ƍ-taÆ%*2nOiro{m^s&uc1B7Y\vwՁ<.nС=z6m &ѧp;4w,hߩZc-H=,1b쳁@zX8*ptXiF2b]{JKC6o.=4kz6۴}] &  T,w!i@ 5.V Y yEN.uE@@@@@@@@ }L_   $0oz$Wk!˖E^@; RF*Z>괠#2{lDZSPӏYopc  ,+ҫ-ϱPʔ)EŞ}T>N9%5~z XXUϞ=/KT3,XbUNUXQAhڵeAٲeKT],!`!jR۶mpjnt `_.\}O6M[n=a3N* e > l֬ .쭳k׮c'(OX=}z뭷taM0iAA߿7gf%țϏgf4Bޭb;Y B0[lyŎyξwL2Imb͛W~Tfm|j3FxA5-Yj/~b ) b!Y` w "`]ʅJV}J*5lD^|Էd2q>¥+1P ء  .\˗ˍSs+ԍ(`cUwhC\#]udbR% l$IU0        /9{@@@@@x$y:]fY{,?elT`7BB[oUռysk۽ dW,|ʊ+lj[ 2D{_:ýA|A*TțwOv裏za@3fš٣g}V{jT4l0VJ\Yxkyǜ9s;Z Oi8PA: u]^/L<{OJ&MQ@ :{oNпT۶m Z`e|w!dAA;wz-oӦMzꩧd3F~z!/v]^Ф-coYa+' >. J 9|poL,>#7nxo ON8[9'3:|嗲mSY1 /Ժuk7BZ5kem fcFyD1Lܹ[~qw!Y;6w]/돵|WW_BAkeA.s{81(/lToY` n *`V"vazVB`'n[CZ$op ] @T_꯿ONƫ#w)sK۶Y;`rBnOx]@@@@@@@@@ 83#^Q   .Br9.-0, [6«]P XZ1bĈPUs)xA?<7߸v7/|Vɒ%ծ];M2[sβ$+}nfiӼ@ ~,< v Yv7( mӦZP~s; UV%0h} v76`uKL;OfzgF駟t@tMk ڴhB{bc˗{mm6U> ~'ؘp*P,^{{lKbdX@O<{]P`ٲeuza F4 M3Kɩ/A({jc\, $Pg>3C. tZWA q@ c-O@ rGT : qH'w*U$u,        @dr'M9J;64Q   @ sIr'k[h"`Ӻuv @\^ f֯ rl>VMjJzmGbJ\ гgO5J/VѢE!C$dAA~zN cyFy9ѢɚoD, RF6mڤ2e$k[Yª,rjذabV92.;>k]'%,4e]/ʕ+= Z}ehO>ȗZK޽{*gΜn^ٳg?&n޼yWLhA7nTŊ ?}D Xдcݺux&`˖-^ .Ȧܹs{{+WeNt'Nl0dcKQ Nx86uۭ]u}3XbfɒNq!eϑ#GiNpm\R&{)-IY7{l͉ym㮛ZwkO?Rk{ԋ@z rztZF(+5iOXjҬXΰ{۹4$BȠ%JH< A6D]c]A4s䮛Sܮ[ cGw U4wHw?._       @pa    %)Աc@rҢEMo-K9{b/dM,Tޘ,7oV˖-\{ ,^!d]ݺuKqy4R%B /o-po5n8/LK.kTjHG ?kV=z ~~|!tUY ;YAq\q0'L{q)ShLSH͖-l J֬YeSbJP_R0VL-|nl>Xb|aIqIDF$MygoN41⭷R &? 9߂<_~e{-HIA Zܵwܘa >HZC[Y @ 8CZ$ZD[@ :[_~釨[ RһJg nQCڌ        @wPK    @|رR}+Q?)Qa*`>cQF;+iK׬ Hpu&LZ.?.S 4`lڂ / $UQI<#DaС;7 "g![YVꫯ>&,E2z†-ž[.U[c߱UT96rYzX:HäZz'gȑ#U_sWٳl2YHbܒĭ+-oڴ |We e;-7rriTzu)<|?I^=е YR ,_?O "(THk?pҜ9mIO?-@@@@@@@@8*@Q !   @ *I2Vmdp|}hShԩQF뮓 8 jP֭[AK߄-[yڷoL9s&~,{4w\ `vD )R q+dPgG}1cƨ_~)eAd رڵkA[MW]ut颦M*s'ꮻ=ydtM߿+Ԯ][6s1Lr'W6bc#Gdɒzʒ%d^'?T|a}7^ '|jժymڴyUy #2]Թ beúu)wnCs\z\mOY@ qv( @HL__z=];L3gJ@@@@@@@@tĕPʝ╱cCU#  J6 ݨ1{H˹p,B+aT4bԡChUmK.3D}']xajMz8ޓz> ސogϞV}p.Lp;ߩ\r!i RfڵgZH*ظqʗ/o6,YfiKg?~-믿^m۶7(/5{w^,X0CGRc|.i‚SXȶm#%\Dh7olyz( $eˤSNvjğKZ˙uߩʕIj # d kv풻OWg@ swm!=䮩/.&w*],(W ׆!       [M@@@ $0ld.].UJ*VLm#-C T_?vM\hK ٟs9 ٳg,:`'+f/fnDܹDȽ`>}hΜ9}LAKH3gNoP)7I$`aq_pi={{ޓ6V裏>gKd:"و.]. E-ҎYY3ɍOm{>[/ó B3 CHĉR͚ҽJ*q!Ϥ?zHN        @ 1=D@@@ C:$t]>l uhR.Ν;vkj̘1ؽ{N]qꪫ4c /^<%?kTpϚ-лwomذAnx7!@X X0߭Zfnjڴ *ۯ0zC =f5{{ރ^7=jU{R@ tA0WuEp^z|UP!E _?傒}˺  *HlX@jLjRPŋg@ƍQuݧC        X@@@|O? v Ԫ%Jrʚ7oڵkK/՟'UZ5{Q>|rku9G S.5-[V7p CLAR(pꩧ;дiӴi&r|PʕSEեK˂( |{XS޲=g={{ޓޤ @T$rdJ"ty~0<$ \t D]\rl#4I`z|k]L>]cɂeVCz+R-[*Uhȑ^kv#@x >|Xu_.6͜9SvR2e\ ytf͚ʞ={xw!ׂ kdAyQÆ u{g̙Fd:DlD X֔)4u\hwYn VN4) "$Qbue( oTńm%ʣԢEBK<i+ǥ7[C@@@@@@@A  @<k<(Af_P` bEO+i_4wT^'!AaDIs8C'ѣbXh(au㧟~O? &v0`.Tm@>ђ D@p) ͔3y܃!@ -  絠%?,!^-e #GB·AD~vܩW^y /ܵkt颮]jժ߹TÇ5qD @@@@@@@HAb9@@ ' <<@ :$-oR6Onp.A=m۽{^{5 :T˗/WFt뭷SΜ9)ڵk5|p曲_|nl25'~uپԮ]cke!l?Sv#@T X ҥK?kZp,(o^? (3\Ji2eDLy!ie|u!2_kf1yd/>S\tWx\r8:@֭[>s'Dt!tM7nSŊX;OO$…mI%K~j ? YS&N-Z_i ?[z-3mذ[B ˕+}wY8dui)o޼X"r;wz+WB-tyiժU.%R V3U^ ,\pD 9v˂}mv?3Cz.t؅vcrnAzQc*mR՗_]#SI*        *u&Tԃ   " iPI'˗.tlҖ7oM7n c H 0H{iӦ^pSu  :tΝoF_}~/Jbf#Gl)yUX("2y|Vڵ]~WF#q,0 .ؽޱc,Y" 9shԨQڶm[̢E!-lٲ*SwܷmBA [k֬j`aSp Xw tg^V\7  G`nT83y9t=ۭԼy~0)]wIvIK.ȿ uO Pd         A@@@HR|RV^%l]~~PyQhH XRwMٳ).wѾ}d:36URŅf$#5#$,D zvkaCEѹ瞫}zUVMV$ZB+O~M4qA2կ_?}' Z#`ZjyS-f͚K0P lٲnR@ Xd<)}(S>r {rRJE t}@ &pҟfN]2Fy߷m+wA.-5HO=%%gPi}        @z ޯG@@@d .u(̙*uEY9sҵ lȞ=,&+ `^M~ ͷ & @H-SLd=AR֬)?Lg/` ֬Ys̴rJ^ž,aÆ{ *Sa]OfҸTx]r+-^MP- VWZ5o:Q,07n ia6ٸn-ZtL@-9N,2͟?.h͛כ,:K &{+W.olpI mܻw7ʦݻwkKB &{sNoN pZ}q0Ν;ڵW76sB?Zm\IAZ}$2n-{lz Z .H}C Cڲ.  ,&J6n-{.d o^}рa  @ X b)eaä[ x%˥;.8:Lw@ \.W]@W_O :sǷ? yn;GHYO } ~"v:wWo)ۿ؁µ+&}޽k[i        @@@H+QLvj9:uYR~jEB%RlRơz"QB^# @ _ZB;VڶMjT^]zui`@ ;wJAq;c=mH&-Y"]+T;R&RRf~H9ҡCqk1 @8 .-)-]M ܵJ:q ҪU#Hvm /(~0[@@@@@@@@W }m   Q+.wA*_`dsDisb[j'8ОuXMiIU'~w޽RE}ݧBA@O [6];9s3ϔnM*SFzi:@,`%/LO?I[HI H.l)*$5j$=4m?@ uJr攖-KP;/`Q 5)S#_}UVu2ʜ_JZQM?@@@@@@@@_ !   Q!R6Qѝc:QT4u1y@|,^xA:mZDw#@ {쑶l^*\x%iڣr/c w}8q~׌ A@8k?z4||tTֻJdeB )}{ ZԾrb4dT4hdvIAHXbEɂ( zv .״tRƍ.85W" & Ej?h7        }@@@Kf̐n!,F]p4w{wH@ sK2ґ#ҡC~`Jwrɘ-[Tj /dLz @g:u~Q=[TIY*[Vz1iÆ$TƢ A&-_\5L]Hz >}]$ c@lt)XD[*]ZjNʕKSBmTo#kh77@@@@@@@@!@dx%   -RѢ%Dt7N.O?b<@Μ W?xTj˱DC=Z֭ @s?% !Wrp9sB@غU*T(;&LǿKϞRGV@ *V-KFyH.7rԸTRn~gI_.eEN  vԾd         AFG@@@ i'd.YRӿ&zH@ r>q3/3QC*R[J(@$PҚ5oH.5h կ/_0 I0D!6%TҶmҔ)1ŋNťΒz,CB"HR%3Ђs) |s]%kL@>TLk_Xa'2}G@@@<@IDAT@@@@ U   DKKJ7ŝ_ך5ODCW3OaivH[$[^{B[,.^\nG:5jJze#w8@LK˖|9E ԭTԦdv W_2Qjp[oM-Q?        #@dR+   @lڶ AePE<ҹJ'G@ci"D@vi֕9v>OW^. `>f $S gNsg_S%N~ZdVj ۶I)a$PtM{N&+/=tRRr҈Қ5iZ@T&eE #\)=T73'Mڵl66f~]ixB!)        DA^@@@21RR͚IIAC@cj'+er|!@ժUբE 80 !?br? 2ep].b H!\ZwH&H#͙?ްAM3'mݚm`        $W ʱ   }Kmۦf®ͥu_ 8|T\8] ]wݥ)Sh!@@x/Y# Ԯ-5n,Yǯ  B ? #=mۤoN??YT a%Ku'=a5@P T -[ڨسǿHUWI%JH+Kx׳l,󦛤#G @@@@@@@@ :ו^!   v"ΝR6ߕ$uNí@ 5di]qj4pH G@ "rnտ.,]R( "ET9.yF3GڲE?^:<ϥ-B /zJ?>jaFI?B.^2"IbEiviHj5mE eoI*VLj^ڻWz-i&-%;~N /٥wUv         "@dR@@@ &0fԸTTxfwKX eJCGhE KGv'G)  f:6aldKeH]H Y3P -)!Pt~8['dޯDrtҠAolَ>?W= %P_-)D}N*u&(!]~bԯ~4i \D)-"ojI=OKFzoh?        @FtĕPuMcCU#  J6 ݨ1{H@L H]bŤ_n-uεZfNҖ-RR?[>}i1Ӟ={w^o~{k}dc& 2        iԉ   )zKQ5r ޓ'g\}hxT ܹӅ0l֭[codƞl.X@bX+qo-DaAľo|`nW*okϞZ %ւb-ľX&v`S|7o˦.7mUP!o2JX@zGi-A@ #uOir]ԽԥX*xS"E"E"3+K6g6'iDmr?,uRrxEkN^1n۶͛X'͋}|$oIc$vL!1Ŏk~'58I܀؏^D#1[d"AHeXiIIqH؎.\XvĎP[޲e:H ;~>Y#U_压iAܟV4bT4pt=)@@@@@@@@HM SS@@@@ YcH͚I#~%wή4 Ȉ1@X ؉VyfmڴI[l\ʆݏ}; -0 vl_dI6Iv\ B 쾅GOR% %ٛ {zSgϞ !L iGz+fBmr{[X1& ~>PNRoCԌ }l/ zQNZDUB QooXpO`. ZT89c$H$1}B &;.be\/ xpL$>J,1RI1Hp$8&֎yH'XK.=Gc]qdƾxF|GxMŋ\<$n}<+nj@#Y>&A7ΟVpdL>5GHt~v!       D@l@@@pk$iذcfg^sIj.o'׭[kÆ ڸqwkm-v .!!V'N;͛g'>qT@/ c5?w8#UZ@<b }v/3Ja6-YDg^{ ,3TT)(Q"݂9C헖ݵ^낦l @*T^z1| @H HLZd2Ni|#.] <۲e˪\r1cP;԰aC͙3G?~  @ XfwRl?|y^r<6@p'j Cy' @f|-yDG\YܔY]ڴu^h_c$u݁F ľ)I ᴩL2Ij={=FbKի5w\O]Bl۱sYd #XbE?L/@3]iTl(~KwBB{/BM? ˈ%LTi<+Xtoz뚗z Et'Yj~G3r~FaB us|~^FR"G@L@,So46W&f&Nt_i}v@ V/> G(@ P(@ P(@ P(@ P(8TrWx+XUҸq*P(@ [= Yc[S p@^=:^K :E8~{k;{gm{><6J̺ualڴɼeG5ՠG x,YX\u.&:{i6و:uBj(;m63k>׀SRcѢEM_o˗//"W0k}?#F3Fʉ(@ 8ȯp  l4k ԛ6Dk5d1ܘl%׮]kHtl'ٵk$;fQ7fF9Pu2VR„$YfI?6y.]2A{DC$\rQ+WΌ 28q1^#EŊq@Ms? p P.pݮYÉq3RFEތ'(@ P(@ P(@ P(@ NiaO P(@ PS. hu\;+}S!~kʕ+ͬ:k8˗aŋ7|׮]]tA2e̅%JDr%ξE4C͛7jC|,SIxPH-\ZE׹p¾e;w?C_6(@XȞx)WO?[CaBbM@hNtq/)/gɚ5kqiy < Ļ[>/-_e{޸Et5]x۷o3Fc% .Hzs L&1=bh@$o K54=&\rŇy7>h ؈(@'[7eKP(@ P(@ P(@ P(@ PY.VԱqU"ˡ(@ Px#;Q U*@=:8v"[U+E"% \ wz NI-=IϜ9˗cҥXdyn:?\jW\*T0鲌3[K/ÇCV4Cg Yz5vm̝; ^:jԨ5k` R饗^ȑ#M"(@ȹ 0hw:$xW(s( hop  ۰aqe˖#GV)R7p %y䉠VsMet|DJt^jY7ɐ!YVq}Y8D@oRիзoHvǝPȯQ_Ȗw着_b@:u-C~$m[8l%(@ P(@ P(@ P(@ PA ZUn+ӊ}V։(@ P Cdq`db60L'N_|tJ8px Ľ^|ل_6fkA>:Vj ʕ+;)+pL5R4dUg}~Ydɒխ[\paǶųb۷oGҥ%L}ڵkS(a?><_hh13N@`  { VNY={{DO>L2bhPz ̙3gVS .]4\UIVXaUJڄCx1J*!M4Q4j ):a-S@2a1{60mk޵ en h~ yCժ!A@@~+IH:Z+(@ P(@ P(@ P(@ P Y$ȴk׸Rbk(@ P@ ]c 02^Ax Wm\012N9r…?5ԩSȓ'"ڵkF(TSzP 4U,YbX-Zd"ϟ?/ChذyX093\}̚5+D PEɃ7!-B~zrfE?б?Cڴ).`Y֮]~͌ݻ!Cc$:VRfM1F9K@|{%)wҥf5FV9guAƌ+˓ #m̙I؈RTƏ?ڧ{ȍp;ڴ^B$|Fr%H~0'  P(@ P(@ P(@ PB( bsW(@ P xX`dJ Xh8yXǁ|ÁNJ.edJ:l Ӡ3fE3ҥKr1\%ԫW7|3J*嬊6A/0o>͛M4AӦMѬY3/^1:?Zju֡|+B P@k7݁'Jl@X<! ر=FBc$:VRZ5K.)@lݺՌec$k$X=FA iMއ>oO܊K~ 6 2 dt?Сt^~%xq~Y P(@ P(@ P(@ P@ 02rkN PB"?t 3wa Fٳ*㏁="!d~!5;cdCǣGb:uywĢR _>1&Z]#ÕrX cƨl:P'wJZaDž;(@ P(@ P(@ P(@ P@ɏ(@ P@Cyf 02F<zM޽@),|PgCLBA;{;$C7vX̛7\}me˖h޼9jp@ Y?5$K,;Q؛6mtҥp -;#"s׮%(@ D)f?K*z]nrd#(B<l̘B;`q.^3gbܸqmBuDJ*Y/(@8x ~3F$iP-܂N:m۶r*Kx-j6lt$+V@n<5tOu]y UaXXȐ!,UN(sAa(@ P(@ P(@ P(@ P1":FfR(@ P(` z!.;X55 \pǏGVP`AVJ̞=ѣq}12aFK{f͒ COpY@K, iw.o ~3 PB+& $T ;o۶>"I@IJO}# ׾}(K12@7:c:c:67бR3ձSCt@Re[\P@*2BjՀ? s}j 'r"(@ P(@ P(@ P(@ P- >l=(@ P(@ P zmԩw*\n2B:NHΝ;ŗ㏣dɒr ^&b~  uj&ŔR eˆ{cǎ駟b׮]馛PjU 64t͋:X>(@ P%9׀{/ )S.H3ZPIH@/>O}##i_ILwD D꘨ofLuTPu,UT9]ȑȝغ2>m+WErK*ش  ,^ 9ȓ'z M 4طyc(@ P(@ P(@ P(@ PbKWyfk)@ P(@ P؁iylbk} k֬1K 2O>޽{1x`ԩSD@ d̘;vĔ)S{n]ohѢx7wRNGXt),Y{a(@ 8M@_4hC$o M+9> }hG>}!iHH(@[3ձSCձTS cAo\7  T VԬ J`l{RK*+H P(@ P(@ P(@ P( Q(@ P.@Z@bNix׮p4l;w{EՑ:uj6gl.]:gWB.pu%u$2}駘 @@4ڷ>uϣ}i_(@O;pXKXتXT c3Aӧ}U =:Wyy`JH20l>gXb{#] S&#ŋ#5?(@ P(@ P(@ P(@ P@$ 02N P(@ Pp+W br)a…nƎMx=/_oN:իWoEʕcA-W~g;]3=FBN+W.e4zZ~w\1y˖-kf&Z,W|61D& :>|\= UTܹsSZ=zw}'OH,(@l%<,0z4Pk`޼hSj~%Ɇ7FVBzp"c@оio}hG>' A2e|v_|y:͛7㩧9bRl=SձUcϟB^u 6V'AF0<–7 l ?GfczD,CM 8Q(@ P(@ P(@ P(@ P \ ps(@ P(@ `B@2Ц 1ա۝9\'Vߏf͚a$\u2ʖ-+w|;$]~vL'N?رco̙c?}tB|-K]A/_n/_w`7{ r J,'bȐ!ޫ]w݅5k֠sh޼9^u\+8t Ub,(@ȗx`vo}[oU8w.BeO}pr;w⫯H*_5kZ *2=>^݄8egiʜC&cձVsպ <۶t9yڐϺ+Z DnȒ%:تx=`l`ƌv`)@ P(@ P(@ P(@ P' s(@ P(@6 T~t 0HNPoFMpr@5еkWS4i]B FZV\9<uz M4HkYBe{ 4@ݓpYs L:=ҥKRjCNcС˗/mwr ;ʅrE9' P(@ڴ=,ZT9^~Cyn~A(i&:5<%1={\k021)kE.ڇѾio9`u:FG֭VW5p7ވeqV / <ѱ V2eEgIܹѮ][:c:&kAQ zcᅦܤ(S쳮c꫐Ϲ+}(Ș6P`7U2oNiY~n(@ P(@ P(@ P(@ P(D}1Y(@ P(@ PI ,qGҶ5~}`ܸXV`m'NiӦРA `5NOǤ2xM OxYd3g\xjF_˼vǗ^^o'1zxиqu›uԑ ?0w\;UzGtR,^80 PCV-`H`NyWIH4,6 _ or͙3'gϞMcn ; 4dsMJ2o<ӇѾ ' HJh>ܱct9W5KѣG_uȑ# WԀſ GqdjثXl,M֭Gǎ'O? Yϟ2> t+?< p .֒x`HPqKfy(@ P(@ P(@ P(@ PH\ګ߆kP(@ P(@4a*࣏.* ӧ,YblsAЋGJ:Jtu &1괔\1ܦM4o˖-رcQP!(Qcƌ% p^6n܈oC֬YM#y?yoСCa< 1i$|sa?o.Jׂٳg{7ǦxRJr}Ӎ}p} 4(Ftz衇PDe5{}lZ?wl.W*UW^k>= 52d zС c:ip7 П3-[SO=eK?3g4ef˖͔J~ jAbŒS\ȶџKq}mքcCJ矣&=q(@ P>4?^zuS ꮀH#gc_aX| ֯_EE#i=2:x)~sA 0inLޥKj@? 4WF͚5vZ]ժU<+]p,s>}qFk1zhsNiڵ Æ mrgMYOB2JQdH_- &͘1}.0c!evg_Lb?>c5 &3 hٞ_;qDϏp@t VWBIٗ\@mۆիСC?#F_5~˖-[ШQ#}w^c}~e?>g6 cbc$:6m4蘛~k4Pzޑ$ U Hݠ49~utbŊ(_[yc:^}5㐎\ WDNGdYn '[@HCgvr9VA# !!7@T ψ*d \Cl(@ P(@ P(@ P(@ PSbߠMEttD P(=П D &0deefYVNm}eIcY}w99K@.2d`Ix*Uʝ;p?I&X`ըQC3aʕ˒ {. %Ihu[0bYʞ=%}}}M7rrn0̙J:%"ryꫯZr%_|aVr3gΘ}/ o$$Œ@KKB,uYgS8\LncUPѣ`-\l*A2-ޜ9s,}kYRgy~arVƍ+W G4mж8gPx S+WX>Y&7֬Y#gjժf_~%駟6qP3]yf zڵ$(p!9f:u*0 P[@Ne.],9_|,KN={͟|%- ˷$pќGJix}ß~֭[ҥK[gIpu뭷σ.:kMdBs rUMB~}>05k׮B.^^Aq 4}Ä́e:(\V˖ںmU)Ͼܔ%KZ;w6lh^gɒҟ]\;+S=oS XrCHJ?]BLO ʛoiڕ9s$.-WiӦfrKBt- }4"f$0,`[}&7kf-=~ijAbc$ZrCSϾ¼LhYnP_IٿMZ]wN_0阬g,MeX[oRs̲^{Ͳs陌[OX|N֐N!zc qQ}\x6(@ P(@ P(@ P((@ P(@ P@Nn H>从^wи10vlD7P` !XRn.C @H$ bŊXt)$hbϱ{nHx$$  ⃮[lYmGeK^)C  ~7PM}]hy?,?k!a f۟}I#,Y> =dE 8ի!.-2 w1E֩S !@_Z ۾ #FB cL2~{k=H{w$ H$½NrHLB/o>Hl,Z`>)7TuwwN_jAuea(@hSY <8@@ΐBd~˖-xgIz.,Aׯ$=e'Oڵk# _|!=r~7H@Y$."~]F>)Kvi_c$ } u$П5iN>mM 3}G;K`,Zl˗/CNH$}ᄡ۫W/H8!ZjL2o߾|[% ٳ!a1}^JSoE fY۶m ^'6Fj/2./ǛI"ϟUb/#ѭpw&\x DB-UV[4*97;gfr5r0+B!c!) O絃5J 8wΉ5d(@ P(@ P(@ P(@ PU u6(@ P(@ Pr2́\::f pkɺQ&СC^:Lbzihdb{ IC5`DC 4P4o1|CM6a׮]f}GѩhѢ˴/bH Ef4?ng_~) .lbo4Ov˃>I5='_u^f;&tl< 乆Uj`M]V m@]~b 2h(4vi6Ayț7/o[.#r$p:K'M$#܁pv-Z0O'L`/r }_@C'N~y\4ϓ5kV_->4_hH5QC5ў.]rkx~6m$HR2d`?5k>cμO,NaQB ;)Jk V;lN_kjFd3na6H/ٗlJ#M)w4{,~?UVuߍZm17 'Zh@a~7k?v@Æ M8fh8IR 6 {Xx{`͛7o߾/ <| 5=KiӦ5EkТync?>6@LCK,:uˍ7ڋ=е+<wHq7#C:vׯozs/}MM~ϲeLGsS}{ k(23w\Or #Fm5_Ç^4_=&Ol6In,E{ 18}$~|.^H>-߲e6u/Yv/ޗϳŸ0{`__p,_d Ο?sp/fkzz_'gY.YvKɎ;a'ϟ?H}QlYS;N ե2̙3r'РƉ'O>AV&MPD |A/R({7 HCɛ'q: s$N|L,X~΍= -Zd/r?j=ѐG ѯ_?[oao~ ŪUV|ϫ[.VX.]~~Y;wũS@"Ϛ>]:%ُȨ!y:FM64P/?7ˈ섖B˷I~ה^NK}->HE~h׮] ;SdwҤa{B=c)V ,駁!)p~ 5_ {/Rt /E P(@ P(@ P(@ P(@ FAq^(@ P(@ PW@@$ D@C,4+7-"m hȆ^P/^td{i.ԩV\jժa޼y8rH;w.+ʕ+c„ &Yfȝ;&x$MW^y%N\'W1ٳgjpb 4@'h]|-&u\=m|Ȕ)8oB'u:~$%у>hpB~ɪUM~TgS^lݺ۷4m4`QR(sCv> XS& }(gJX߬I2%|NX0(@ P1)1+hGs5`GrLd9+hI0z4}t͛v׹u[?ݻ Ex ؠA,Yk6K\8uо40__k~ֹsg'NAcǎuw3eyqB2wQdW3)yg϶aWb'IC+/_:Ơ}cW_}U_4oL ӼM ֓S>N@K‰(@ P(@ P(@ P(@ P)/ wTHKgN(@ P#0neAb8QnП N@*V,yrzYVٲqUљsg5j*\% (ZrQ%s[ݻwZli年-LXEJ*eɅVkeڐu$ʗ/UZ5g1`K?'e9sfKB4glذaf=%m4iX۷$P?d/bޓ@SKI[ٳg"`HK?BiE Jϟ?o~#8-ZHݰ| P(`iY/hIò2d]-kbHДu=X2eufI%a+}?o޼8}oISiGhI 9KΜ^'{O>eOF$H~i%`ݜ>t_u֦M,=s'|Ҝj@':%/3+D?Ç[GƅYw>eO}L}uCVto4}O j$݄SZ7?͚5,Yb(Q|_ǯq wa9mDgֽjժr}:tP HȨw/LulOcYNtU^u VOŲ@m?~ܒyzUK~-9u yZweY~hYe9Te P9 n~sĚ>.e}Y:(@ P(@ P(@ P(@ P ҷ*2-єk׸B(@ P/@G9 YcP PTq!В=bSn]jU`l0[t)P&M7eyNɹt>ѤI|([l+|9d̘r=$yuI.؇8{ 6B.wc?9q$P~ 7DK%V 71)V apH)GSTP c;wnw˒rl܅~׭['OB A(5"t?܉\rG=lA|G!}vH$2%^ԤI L|g C Ap?*(@ P 09%Aʕ@z@wC+;[>|W~w'ԩSؼy3J. OhU=wz^}iH=J9={~w?0X2:oc;Q? C?g:Fr]w}㏐93?OrÌk}El1ϟk Ƃ@/:ؐ]rȍ3Dr#x2cbŊc{LZ7n4c$f͂BWxIJo_jWrZi矮G9m|Ht.W.9s P 3-M   }\( P(@ P(@ P(@ P| 8_2 P(@ PQ@ĢEGcBߦ5n* C*19`iK/$о}{r)2(hN J< y z^={~뭷v MZޜ9s*N|A:yjA˖--CΝ]/+xZf6 &vX?əx0Wۧ*THNSSd W;&^3 mӦ r̉#G.p(@ Pf=k8 t(<裐à2Ii-6 ǻѿod͚ժUKlx޷Ojt~I#YtF!jjJIx߿?wnn/Ka 糯=Zo`yO>lv<dž=T`$gzs6Z .pk׮5Ng8#YǞûOϏ-)>,Ȑuf̀_w޺r@p*Z>Ae)(@ P(@ P(@ P(@ P 02>.(@ P(@ P 3gƍ^tza/0`o^Z0$=n|אG۶mæ {IѪj ˗OpIQ^|DwWVDI;6jťKb.p7QX?W/CӧO駟;u䥯$Xm9Q(@P Hft0]al޽!)[իWcݺu)((( = ĐMrcћ=<C^9;싧Tݜ؇g!6އx5lg\õ__&.^'O?ł Ю];,[ *UJjQQfԨniG;q X'P\2nC߃-@ ȽШd+5Vn P(@ P(@ P(@ P(@He]-k׸`r(@ P,@G9 YcS b7N=:0AxaH1l@Ѣȑ`Jt=N'sN 1ÇKk*t ?ԩL>tׯ^ׯBŠ؄ >=wLoz+T` A)9ijBzY(@8s5 4Xhy]@49y$ڴis(*W^8p`jSJw^y2> ٳgM?HI4xE^8B/_6zczKmn݂ Ғ,1$E .0vXpKqbŊEd{Rr?<pTJ)t˽Qx1 +R%]:W7B5NZYSt u(@ P(@ P(@ P(@' 0Gu(@ P: ` +AzCAy'+Μ22(… &mĈ_QHm:uVKtr$c&ޭ ㏘8q"~'Os 7Yf =iWV j°aÒ!צ(@ P)$0k$|6 җxx wP5$p„ ۂX+W 7I4\Kr 9@`ɒ%cƌ~fUVȖ-[jwǎ@)N21c$yȗr*#yw>haūSs@nzN}G4~oE(] })٩ma(@}@'}\xܹW P(@ P(@ P(@ PAS@ P(5A f,~=P .L ز(Yҽ8(OFGr!sرc1o.&B P(@ P(@ P(@ P,AFbm)@ P@!'#@ApXEG Hx :I*Fl$'E<m Ҏ=ӧcԩQ/R 5jd H՛*Dsٳ}PlYnwq 3I6:l*TÆ C׮]V;V(@ @  }2mS.dY~i <C?x,zӔz bUji8ƍQ`A3>ҸqcXTU{1$:\ҌqhŒc\.+^rȘ1}?Ӏ%Kv>jn-Wjcݺ & ?*k@ o>عȐ(*#vQ(@ P(@ P(@ P/ H#֐(@ UV~ܡ ta/Ъ)0~|E`hׅiKD˗B%1cOhBJ$of0 ? l.^˗IMX?͛PҬY34m%Jp~c|1k,r(@ Pp5J 8'xqgOࡇ R ƛo} @X1cΝStoߎ3g1 ܷC=HUt9ڬ bR@oa8ɚ5k7ø馛ԬYSnP;T"14-\qC7l4R2|Q6pW9US{!c_ݺEC_8_*\F P(@ P(@ P(@ P@( e(@ D5b L1Z.s Ѳe* YFZI$⯿oN2AsJZ{Q *ic})1ҺAdנֿ-2!"EAfnذ!*VTzɓѶm[رEְ(@ ĂAW_A]H{Ck@I| /w 0nX~O?$wC,I~]vqwލ 2@ uFIӠr2@ǰ9HV+*JҥKAYfEݺu#:V3fmvZ#7 MdhL!r% IAΜ@ZW5RƉ@tl. v,)8 փ(@ P(@ P(@ P({ cS(@$ ]ŕcDA1r̠ ̞ 4i⺠x<5r&MXSAEkݚ5kL D.֯_+W3իWGժUq 7GB8vV^m˗cٲeXjΞ=,Y@4@:u ȔUpQ׀gy/r+=R(@d < <64m h dV@+tȑx衇'H9,(yV!x H7/;.&A:6c$:kȔ)*Wloc$:Դ2NRzc 'Ybӱ.,_I*UVu[G`&@'ؓ>[!k^r3g ָ߯e@nZ< P ̙4n ]>D>.![@ P(@ P(@ P(@ PTAFc)@ P@!n"JAuXY"0q"MT(Jw;wBHA1ZK9#WK.sJ#mڴ& R*T`f@lٲȘ1c]K&HU^4PUCV5@Dtʝ;7TbCjԨ5kX իf̘a|BJ(@ PAL  P$@8$SLANpwbԨQH.]RРK.ٳ's܌x"og|/&M*U :F=F7pr1RI7%CƐO uh>J'V }ϕkQxm`@N>}hͽ>.卹 P(@ P(@ P(@ P| 0ҷ R(@ +?tG Jtp{\B \+p/0a$$}m^6 7d .ϛurůѣGJYHswɒ%aŊCM8/')NΝ;ͼcl/^{ÇǢES /й\r&@?>'ШQ# 2 \J P"Hq```@Nqm9l 9'!R6iӦ!gΜmȵ--п?Î&+D˲L_RC!uѱ]vA)O<׌%uΚ5kkŢ(|1#c$w6a\rSVB,&rr…@ݺ (qmu5 Re\j3f*Wv>jc͚t-K(@ 8M@~Uc;vO@=(@ P(@ P(@ P(@ P`dr(@ Pkh63Iza6 Dƕc\`$];!31B|Cԩ@VAĖ-[̅zqZ/׋/_l ѠB  +\{I}]@X(DKJ޽{O s>P 58IN3g6aJ2!KFLU~Ǿ}>}$lU)@ Ps\~ 81<$&6im"q ϟ&|ڭC_5spEY ={1{DCΜ9Kܹc$u %G8'}wc$h'S4iEDH͛jp =|ǥK55ժ5jի%i:1 (@$ Aڧ]:l (@ P(@ P(@ P(@ P IGu(@ Pat XA <40ol*iLx#!KL\5k؁^d||8;ə3' ,hB!G Gɗ/83EcǎR{>p 4аA 6G 9ru~0 (V ~,^y-NПq5^:w}ww)@ P@$BH PH Lh~QSgH3qLŋڵ͛!i:tc%hVRIoa؏:F=>uװ>}\ C (@0 \ȯDKa wT}\P9Y(@ P(@ P(@ P(@ PI`d*(@ PEk,u91A&&)pU@3p5`$M,eBM l_ ̏[;K@/@;RS@G;`P/AIC 5 R}uϳdbB'5xRL2_g̘s :?jLs(@ P, m:8=(W ҷzܪU+_ӧOGZ]K-۶9\ hG >z4:9Fc%>zhslsDHtl+рH4J/c9.b?G1Cѱ.IC9=oh9Nu|D\ | ۮ@H=ᐁޔȻ-|cU>jڵ-XЛ}sժP$492=Ppc ˖9fO @-(@ P(@ P(@ P(@ P02=nK Pb@ML L bX`D}{EĐOc" MM``.ɭ +I@/C4h%~ 1mvء^ܯLzѾOQ&Mf g\/ L8l6AޡvXEA3@}8Ei(EѣGl$[E P|^ Ԡ-=(]:&^_,Xɓ'QFqW+G <u+0kQ-c }Buߏwn\w㦓:jأ=ڡ*@~\{z ߼k P/M7_퍕bH(@ P(@ P(@ P(@ 0yDŽ5(@ P:p2`CO=p҈nTUr^xq`4A&ߎ[R%ځ BP;qĻE'3!`G2dv8>5@g;Q,NGsؽ{ 0]/C P@t 9 كU+woiӫߏI&aر;g sGW@e:exh8k#I縈s# I{\ľھq{xJ$Oco9k‹yߎՃ=j5!Wcr@*Wg ,\8iuC`׍%צ([_+%'(@ P(@ P(@ P(@p Jps(@ P(@; 9^@/@jHdk=R \rE<<$r@ 'Zn۷D V(@ $O wn>}ɓ]K͚+z]BoO}:tF~i,u AU5_/R}K{D"w 3g..PƣN8AGz5¡!-lNiB뮳cyV췿zuC @ ؿ).G        @tljQ"   u|IxzL kS͛cjZLBXT*P@R%TA ^h@@OT)[U0H{7twi:lRXxR@XhTzYbqӺuK=$]zԬTd;J>*m*m+=hhM&)u.լ)΁z1xo  ۳4}z<Ξ9#       S `8O[    y:H IO>?sf s}c@Dի_wӴ D@޼R^gKIv p%ugM *%J̘ ('4d&MsΑ3mHcJ_.5o(V$uAZ(a/%[7syRÆQGEV^Ycb4 @v t"-Yfgg        [Ad6   D?HZEpz J]&M$L :unL8SСC1vtM=];z7Դ#k+bTjxۤ5@ Rʕ{O/dWO5+RGq>"ZpC-Za+JI/Z%|4f4oƍ҇JIH_b?jW)_@ N;Ϳ_>iOG@@@@@@@U x=@@@,X@/?6otW_-!BEKڵc`"L6O?@@ cn]ڴ|?PTҰ?\`J @ 9ǿKZPĎ ի'e>>H?^ eKD+Q3`Y@3c'8<4        A!BQ @@@B?_^]J 2vy$@ {VɞM)SdGw Ą@|uї__KII+J&_ӌIS V-Z#/`/,M*֯/ť"%}+wHzIuJ !=m6ad&},9s$[wRRɒ2/W oD@~Я @@@@@@@@5A@@@4K-ZY,0deorD`r sNTo߾z׵o߾,@@X8didiZkg,ĩwo/bqƑ3%P9HÇK?.TRHd䌜 Y'гW&=pR˿&͝&I/)"5j$U<({sҢEΝ4ftRRb)K{ Ad;        )  k@@@@ ȯ&2|@IDATY[RÆҸqY #@ }[f ?_۷oh@O2e#5kPU-ƍ^Ouz~YĉҮ]-H ݺunIڱ#+GB @d wߕSF{u$s3{5C˕;E@"US$=4i}I={J"u0. 5;|89W֭ŋ%_Rމv* y z 쇵ԩsm(PdIFSN1&@@ &,iB% zb?cb6 `Jzwwt}og  Kq$p+W (!}q4t;g^wKKJo-#]~ԺTL,)E\(@ k?o^C        )@dlWf   @l$ZEdi_8 ĞΝRڱ77f@@ٳ}*@@HSB|.TzQR% oɢNcSNl]RF@ Za3gJKK:H5jajI:!?^JitibF)~]fM)ohUq[@57/fdTeK?@?Q@@@@@@@@[$   M`|)Dfak@`0g$nǎYM"@ ,]wOd:bnݺiz7tQ@@\Bihii?ثiS zH90%XlV/m<8@V_D݊I{mJ#~R2i 2 "[ ~ZڳG*X0@@@@@@@@"K :@@@X@WO*Z4[WjN; Ș?L0.~U*^\*U*.ϤDcC:u*Aqr̙& DQG >O:i +$ $hP:t(|>}$"G`?q )p ?_/>쏵lY?-#N͓:KjZ3GX1ry$y3g|0w,r~髯߃         AJQ@@@itQ! ڷ,׏1A֨h8u.h=P @bZvcE'[ri`Q~&gO΁Y0_c@ ǍǕ+[#ʝ[PAVxϖAp?Zd6RVGc^i== f ƾ?@ ^*UC? x=7        Y_)    F-BV k'խ+= Y#@v ,_NdvzW tYGuOA@@@@|r}ȑK/I&HK-[ B{tTH(N|RZҏ?cP+*W90RN={U=>?*XPZտh!]xhAZ?οLO%lBΕj1{A@ Xys믃װ        @AoD @@@A_4 2U"B`p,{r"bH  믄򆁑&@PB0ȩSNj!" @|X؀ƏߟW]/U*m_xBtFSN-rn=fx@ 6l-1X޴)qjaأG=.[Vʕ+n$.sG~gK_|!U#1/7Ye @Z cҪ6@@@@@@@@ \    )o\ v4aCK}ɿz07LsD@޽]pEmܸхja! @ qdիSWƏضε`@أw{˝[P!1ܱeKB/%JH| zԾ\H8m*PFj}!*::O        ^ Ik   ĭ…Rq;A=H@~VF@"A $,ĸ@jܥKM6 ?L@_ҿ͙#/]}tرR^?Yo[J͛a_6nܨ?S۷on;vH߻wۗM*_|ʕMpS{DE\jYbTx$\[ҥ( eCv-8іKWrʖ,DJr>bEn4'}ba\*'Ή㏗>'zO@ ʗJh@@@@@@@@H 2ҏC@@@ N(,CL"p1ҥA 'O<@(Wɞv /wu 6}ۖ  mHv[BzQ"w!$Ai.ӥ7ߔڷO9,_~Ѳe˼kzgߚve *r: |Gϟ[Ub(o>l,X%-LrϞ=A-[ f^WέPj5kz. $d<@ MCa;wóc-ܱCĐG{lzVfϖZ>6;g}7l  AQ=         Af+7!   KJE&Mbs~>aä^]rYZb t J]v*RO!Cܙ,  ժ.kWpD}Nɓ>}n# fh"xb/q֭^s\ [U.V ЂOwIX\9dɒ*^ .WkgcPm۶~'7nܘp` ^B'WO'|~pmT`A5pi- 6t}\~ /xj;w`-&?~{ޭVZ)UmٲEw[l,m˦MNnuI-6 /Wǵk{ v\:1eBi /,3=Z$axUvAzaiP^B=7;{`!υ` .]&I%Wx`        u@@@@ MoחK#XfO24HS`rɂQ(ěy睧]ЁPBM" Q/ ?6k\RklΜ95k>S^c}V֭5l0/v.-O ERJn-ZH27jѢE?_]vy ٦MuYe˖Muݻ-n* DĠƍ X]Z)*0xtԯ4oԨQ4Ɔe +kKYB,D\x`         @@@@ U l$lMV1cHQAi*F7h۶-ӧkС1=W& ĚCI&r]H'<{mv~m}6ls9GwZlŋE+f֩S'o… giܹ2dJ|ҥw;n `wkÆĠuk I+J͓>uVKvn^ҥw.2㎓ ě*UW$2i@@@@@@@5 c2@@@Y!ibKc 7H]J?(խiX`ji~ #T@^ʹicİ@@>Or,,ފOdaճ盚2yʛ7:,,XB8i͚5n7},sΜ9zw\D~W~8K AI7J',1BMϧS^'mzPo݊3s2ӹ瞫… Gż{ ӻt4?ɓ5zh|j۶m)P`.?18s=j~Ujٮvsroxe%N,ڽ@hR'$M$/5m*>ȼAdbLjU c2@@@@@@@@ K    XDVM|>g~K<"QCc0 RTb31,P@uԉ >L @W`֬Y1b.\( @ȳ>[hH92;KHrw[ou [7pZ,X:aعxܸQ Yc{eAv?䤏m]RYB ]$}t%RRl,r5,#+`A_Ο#       dL ȌyQ@@@ |T~>L]vSO= Fd`,rȑzu]wiܸqgC}|d!݇I RKD79rpG{lAb![r[Fr-nE;VKOiɽtQ@ ׮͂iBwފ3d@@@@@@@@ 2G@@@XD/vL+ x &իiČ o^ Ԍ34hРw@  "[oc=͛뫯RӦMo:J,ѣGkذa5j /2-yx*Q ,B˫B Vj׮ݎ=ش`[v~Ϳ,nM8wn?*%ʕKDda׊ƌԑF,r?א GL²        @(AD@@@HQ`niJS((VL8P7NjB/S@ VTq2BRB ;vӧд dyEG /-gaw4@)裏._~I\s./r߾}ڻwv۷k۶m?ahڹsq.=5kOɓؔ\aɂ xmT}WTdDؤ}{!I`c!FjԐ{-{>[j6F&AӰ H+kKYݟ/hx`        u@@@@ EOq3+X`PixEdq#6/V7Sf*УGW[lP@@G{߮nݺ'9t 6ŋ5vXz}(ꫯc i ?on'Nmݦbj$gT޽{SN:ꨣBj/+,M/ߥ>ڶAwvoc%1Qx_=["0dxTȺ9W_Pʂ O>9e@ I @@@@@@@@ 2#   KH IUF,{JK\ M.,,UYDž@ǎ?~曺sf  !./vCLw:CS9rʥÇ3ΐ7mԅVjnmڴIk~LλQG}!Cz yaPG p`@c\,cL?тkL\?ŃbxqRV'l˨@|kڵݓ @ .ɂ 7;@@@@@@@A=@@@H梁uܹhq4n{Nڸ1&TR tT)J'@…վ}{/D 0  ESnݴ`/XOϢh6 6_Ν;SOܹsUN 7ys}Q}`]w)m=?|{=nݾ][j>8޳(;Z9,M/17 U @x|R:wokK5@T)_af4@@@@@@@@H_ 􍨁   Xdldu w˕-0b^`jZ@O "@=t%hKi)^xHP @@ >>}/tQF?z̰@)nc֦M/3FW_ƌ~Aג$8P\7xzU1Bjw߭Ç:RݻCX'$8т-1xv{XB :t ZZsj,kǔ @uTeKg/@@@@@@@@ 27E@@@ KH]I0{͝+͛'jac8 jTJC{N:y  *0j({ ԃʸ *${e˖֭Y XI#H۶%6x?u.w۷zѣGoև~iӦH";gdcAmق {lbEs3m+]l;I]t~iw\݁ I' 4+=\2 e.# \n:A         ! @@@@d/T׫lcJdi1bN +Wi1!2-PX1uYz72;" d twk„ jѢEvb;wɓջwo(Q"ĽGzK+WmO_*_^.?Ç[CAu\~<}w~\3wX'4ͭ6Vvդt8|JoqcmeI?,f͚WJi׮\S\?㏿Ν. 7v؅J+ &]ptrKʥ7x;v=ܣU=N:2d=G.$-|j߾goM ?~zwSOպu\P${ Փ OJ}_./΅^{MK .fp~[_|Zn9sxK/_tOW.jF:twܑPJz[mM>yqX[e]szcǎ@7 vϩO>K믻{BgsοJ*K/R[nRܭxq; /=gRLC^O2# 1(LvoĘ        @ ;) "   ˖U+>ϳc;-zTJd!ݻwٳ{@@𰫯Zm۶Հҩ}-n޽.0poߞ}GqOǻƇ]Ңϲ`G -Z`+Hi~I< "Zj/LҪ)ںgkhq؅A6s诿h}.^ZiDw$1-;rC'OGC9]PakWj ]v7ӕW^#G44YHaUH7_6 ={$/]('I~ꩧ;he˖-/cbЃ,Y ϹsPLoI^7x<F;,1W\^].P`Wo7 wL|IuUyZ۴imn~6[1c ]s5yziys??P/h|v.>Ӹqdaj[=GҟZP=Ϗ9b;v,M-`^?R[o!ÝVۏ*V{]'gϜ@;4Z!        _ k@@@A ʗ2UZlYi0xbZ Ș>L.K`   @d Xŋ] K䋠R\9]~^xZ +r%f&….P͂a˗\~}m(+AM*} ;wy=s:Ը. f_z⋥NSN>rr->ĴR;G>RFԡC/[|eӦM^d t7^pΝ;^ZcԵ:VRmKN l=XrzܗZhf˖-5zh)SFT^igD(U,'%6o˓' aÆiҥZpa>X}Z|@{]si}p=GV>6m>.uի ŏx"-g{ie: @< (@d<       dD ȌhQ@@@,fM)WU,Ĩo^yEZ6F'ɴb ؽ[.`"' 307x# ZI@@#@vڹ ?w,yQEȥZ&hѢڰya Ç?LƏ\. z8CF첎QT*6f| }\g͚5.LoBmRJ~-DzJ((jeҤIU[`m4`EB ,X 3aPB^c&cAV h%k%?܇vƍ{ %tDH=!$ kdDfj9{n?P16SOp/y("Wg/]qYHgjR]odU][2DvnV??ǚ"@ H_        ?9@@@@ SYVve(G1Bz!Gp XʟD @2ݻkȑK?d[y  ל9s4a„,saиWU-N/TRzG~-,_QGkرС s`GPk=3Zt/s=W3g/oF'N˥Cw/^8x`h"7|SvF uܨbŊz~ƍY|ɺKrJC:tz쩳:+p,'7jzRzU`G/M ye.X3IV,,dʅ^o[?zho݊+\xBA.UByak˖-jӦMBhmfmμ_}U}^HؿåWZ]+'xwQn]oR e{bn޼y^۷W'/)YI<ǫ{/O{uc.]Z v$(3y]v[E癝cbsϟ?{6}غukou:fHۖZ9lJp{_f0/}]2eגaÆi̘1j֬gjuv>댕P3y饗davL?#^m)ɲd>~9ɺ,"nu/'wn]L" X޽nf         X@@@@2 @db}pɾ7uk L) C]SA,tgǎ㏏1Z@@$ٳ + KI R]M6Mo>lժ,gٺ, =}:sΝ;k^|f!M4ԩSeVn&/p֙MX@x3; !-ϧOٳgkΝ^(ߤIpB/dګZJ,B~.z_D z2.rR.R"~9RL(۷',`DZZj^cӦMzBػwoZ> ~e ¼袋D?m kze˖ JPF lԯ_?l?3H 0J K-fGXx䩧)S .۞GJcpA+A:uGm i&m&o';cvޘG^x*T vsO? TKOޞ=-684݂̈́yiA)T&W,P4y ?_>%,_Zm۶MڵG) WGuγ]糅S[UEJ"/mڔŝA. 88L 2}#j        @@@@ cH+V3[˥&LF0zbI`j? ) TBQ,hEڷot#@@rD`ӿI[(>{sTF w!+YX_JJg_|Qgqʷ}еe˖Y߽@I 4ڵÔ.]OhNHX\.NJnź{%WtZ{G}TsVJGZ`(m !Ν6chb7P,s֬Y@B`JǶmj^xg}>s@kڸqq;HrH뼳:oQEv)\r*鮴bSL TOC 42aC {E(it5kOZ~x TҨQd!y*R^~e=zu]wyU}]Y:l.\*UW]}jر^RU8Կ߿_\rOV6 jĢE30ܹSNW\ql"3E+3gԷ~~81Y঵{}%Գ4kLW_}u:;Vk׮Ս7ިO> [n]BO {L}6. LX٦UR_}:J-P4P?# }qڹygm/`η3aٸ~e?wNc+ c`2@@@@@@@@@lSoZyҺue@@ w$u3/|5fp9kmO^Y# >;%+k}g9$`Ͽ֭@rht@Xвe4(1D@b[`jٲ&Mdd׮].ʂ,BXJw cзƍkѢE@6XD N|{[g6UzI*Ԓ%K/S3-4A^ߪ[n^H, `)Sۍ؎?0twr67vL#){_jXؤRJ9Xorᘁ8̯*ɹؖ~˖-^`׭[ \tiM~l>KδJKPrV༰P{Hh#Қ{#DV޼\)!\i̶~ @ ?؜?.6+B@@@@@@@ Y     {i|8ƨ7YVQ=@ _1LG ,@K02}xkjJ^`C"E.p,c(ON8Q,$Ν;յkW/pn Xᆱ͛7g*PQFyai/~( sV*UBNr<iqVZifԀ[(TRTK+^iC'J8c ^s+/vBJ;Nz5p=GBONqY\*TȩQDo.YE9         )7;;/@@@~U9d{?yfDU+e6J Mt˨1c!FE7Dg TMdΊQ! -`A?:u9sQF7bŊoNw\M4O 4\kWUqeϞ=ߣ{U:u_y'xRW8ܽ{w,q֬Y~Z&MҖ-[Իw mA}FիWkȑ'O!gV[&tBի7|3S駟@rF6mT;wVٲeS3gj޼y+з~RʈhРj֬qy*QB;$2!@@@@@@@@@F @@@l-2L}_ݻK?,4pdm7d\ +T~@< *THm۶uoe(&3  ]rҔ)Sԭ[7uY1c,-+CZpN/v6^| eի'!׵G [jѢE˽0O mL+;v?ó\ҳ5kp%/BvħHĉe7J |xԽGY 3_|yfd@@@@@@@@@O ;@@@#pv_>&9vjՒƌ}6&TuC0#DuUWi׮]*\pa  -`}wpNUzE&Ҥ`EP("+ubGv]WbWlHE** M:R^30Lfy.In9Mnn7C2d뮘GiܸzQDnkΝ;7K,qiݕ]m @ is۳gOS\|f̘9sxկ_?Y)bA@ '0]pZf͜blZ5i֬3A@@@@@@@@@ y#9}#   @ 4;3rzAihiÆD[ȊAfō6+ХK>|XӦMK\f D@g 5h /Ђo#,t-%%ku&e^yeO,IJo>/rz)/<2))Iw/_^qFK@7@H i#+'n$}[x @@@@@@@@@2 2c#j    @*5k5Rj pOx q s Ƹ@ ԢE }1> ħ_͞=[_~6lQFDclV3fPտ%'tˏngرf|n-.9K+^VN:_kO>ǎkFE 6u"2+;‚ Uڶ-+i         @b X"   mի3v7tG J+ .Gc*DѣҖ-rQ>P@ tU'OQ{Q@@N/ҥKգGtMۋ-q&€nݪ.H:tz%r&tvKm[2-[,k[Ց#34w\رC 9~x(_͛7W|\=  ݺIEsTi)          Aq7   .p5~_5LOW@ظQ:vL ~:vuJ;wԧ~Sa  @ (QBC_|y .P׮ݴd R"-`TZfK=zzlbntPwy[^wB>rnqiڷ!7G//K.  [KK|!?$2v CA@@@@@@@@Z v00@@@O}+g}ccD+P ù;@l4))Qf<4lPǏO  1u;y͚1c5k:3"DxժUׯWÇGeN]wu3fvBF{&hz[fe[B!z GeC7wQ.+epI]5  3tQ:…ݫ{Y 2JwB@@@@@@@@* jw0@@@[`Z|dt#p=ҎҨQ}@ lϸRD9E ]vՄ =  ]A=nJ8ɓѣ^dzjS0%?#I:w}W;wV:u4qD=Z>߿)rDu%hȐ!Zn-Fzz߻-t]n_mw4r~\] WI.MJ~(Q@(hN.6#CV U @@@@@@@@@ @@@%ť%ciԌ5Tr3sjlD 2eBUy#u+Rk֬w}Nh  6E肺-~le Git[ ;h̙Ztڷo'xB\TS6x(?S~~]kkժUGѢE3E`='#}{9A5k.wmDZrU?Ε۶hԭTԺ\髯|)S;J Q \Dt3q׹_ q7-&         @ ;)"   YrΏe_&e/z@S XdRҩp/-pbŊ8qbX  q#GSoN;M*知% =O|ҨQ#K.$rƌ wޮnyuE "*8mORժU+-X@5eR޼YSr.0Ɏ|〞| ^G?tra_HwHF s?ޓ-@pȎWS[X{i          @Y :n@@@? o{F J:IO?NJN\mȌ@zA۶yFZF"#Pdy/^Wuv @@@@@@@@@ _W   .@dK.-??<} ,`AII'g dNK..d-m߾]˗\#j! ,pdcJ'm&s4`dri6{->cM:USLq:,jJw6mz)_|ik+-󫯾>LUbEnZ/ >2gH{ycI}J=' ,S4U:l;ӥɓvgGUn+@l k_gJ j3Y@@@@@@@@@, gY!   '`Am$޼qh9\駥w -@ K( E.̅n,B3@@ B?wMB{zjJU.\؅ vuK(gϞ- I|Wta.\T r?dq4h:unݺ.t͛7| cOdb o\8Zd؛DWp \p~iֳiI/?W?ı}{J9S[tub.M$M Tԩ i%K?EBh?&ZΝRٲ@@@@@@@@@H_ m@@@NذA\D G駟5Ө*ȶe|Tn(^ nd& Ȅ}0q@E~qr!R>~czaXUPAݻwkf!_?ygIYS@ ^qn;vz-T >Ө*.ͪ@,eUT)+V,Qi.4k ܤY6゗k׮wudakV#PYfjڴʔ)s .gS:oԯԤtҠAr9/_|RZP믗 ȦkW[7>X @Æ֭rR2ZկcDd^@@@@@@@@@H\ w3s@@@BHNNA Cե瞓Ͱ:@ 7K+f!M@ EK.zGt(P e=W@@2/d8v\TtRRƙ''k9RН+֭]*+¸b uYfy?nWҥPH pF;`ޥ9v>ił+ v'PZeͽ.IіjժCzE ibץ1c^7Lu>M"}ҟ,]piUY]  YG } ?BG@Ƴ          2l@@@زE0ʕb:L"__ʖ8tHڽ L7ٯ_?͝;Wڵ@OKqH SQC_69[X`Ru`\xޒ,٣7zwȽY`cB!K(iA65̙]h+W*%PL2T*TAir,o]顇k~[zekg|>_,Wst}m=IA2%`?xdaA.KXdIxqR@@@@@@@@@D 2>sG@@@ wZWi i0P`YyT_/dM3PÆ 5i$ FH+@H DZceˤU=Ϗ  2i~Ϥ:uBwIleK8;.8=n.R.pԧԠ4d?e}NEHW]/Gȅn/ =tõje};D=p5kᜡ'NQB@@@@@@@@G8)    2c/Сx-C gYo]tĉ{@ȢUғOyK*o(['=+!+WJ-ZEtծ-լ)Mnuko;.\ڴ)  H;JÇ}I~9)gH oGT֯-@@@@@@@@@H$ io3W@@@!`_.SF*\84giNi脛:F  ":G ! r G˗/O2I@@ #k={yysi,?@=v 733|SN8qbl  Q"`+^zIjJVM4H[WFX@@@@@@@@@> o0"@@@R Ȩ-11Βڵ 2HbBcrL&CW\q͛_~%FP@@ʕ% |-sg@6nI3F*X0F(,)5oΏgdgNKQs33j˔n]=rt+ի'l))8mbKB CcUJ;wJڒ         $A)   #4cYiM8Q`\r*СC͛WӦMjC@VG)O'm*-]yTPN!ُQ-=+rz!wc .$6SG?_j,?|Lvm֬{ Yj>wK}3`+ w㈥WvÆX5cE@@@@@@@@@ gOs!   ,|S^IWOzjB 2-"@RtkĉU޽{̙s:n   gR.iIw!-꯳G ]*R$f|Pz'Bk-sF3co1c:B,L=w֯qf?zҸԪ4vtHffAEW9UzAf΋Z         )@dbwf   @ALFTyH+-Y'@dh@Z]\JҴiӴd=SjѢʖ-Uu  @ u&U(z?7ߋtRbQ7 1o_s9im;9\9io*n6{Io%u*c?'K CI?AzF ?r۶ BAߋdRE $@@@@@@@@@R ȄL@@@ ݌ x61l빅 -HO`߾}?~/^GYfzG`siB%JH)@@\8x嗥-[I$[Wd58|`ߗn) ky_\z)A^u4kht%Ν',d^!Cե>}o@   112)IZ>6(@@@@@@@@@  sCm"   c `nT )"+YCQ54@ sGk6mڨL2֭}]-!7eF $0Az?B =m ryNb(/u{4+co:Hs!7HK[J[᧹5 |)碅T֯/^̭q]@Ѣ~?% T*mؐD@@@@@@@@@ L=|@@@Ȃm~# GSڹS3@~E*W.FTE9sB9r:WRNZ @@ TeT曥NchNil? 0M8gAis&P駾_Vwm irVo3ۣ? \ AY         @({y"   Af@5H/dU`.)ʖjCիz! {L͛W%KLn# HN>H6R%sgAȹs!#:(|⋥͛>6ҁfbXIIR&陨LUP eIUr|{+nݤ V{>[Pe۶9>6 2kY9@@@@@@@@@g@@@@:fLȎJK_N?E QҥUy#>ÇB JRһ  @fϖCp.Z0@ZFZ@eJE _`k@@@@ ']dN)]ͥ^{t@BI搀<3F@ -iJ@Xa~&]r4_H=$~z=ُKl)YߧO(fǎҊձwrw짝&}odxNzV~gK_?.@  СWƂ7mCp}@@@@@@@@@ 27&   1&{T? F=H~(YCd`DAQkX ri,_\er1YX$@EHի`קl7_*ժ-nsHmHMH3gJe\NyR'PU ׮VJNuԽRib>֕yF:z4gV@ k Igmk;[-@@@@@@@@@N8['a    $=Rɒ *н$RX3B ȄL2 ƍS]ZAINrxo9@[`i3 .&NnI[w^6&L:v:t&MjOٮ`AKiӢs|4* PNj#ϓG:irG5,2* A"ʕ7Ҋ         $A)   Yؽ[*U*iIշ' 8/H%JHw!@H\øq'A!QR@Xy[zsS+i BhȪޒG%nQ3Fx,t'c^x4j4lHQ4hwl)=믑}"@v#GC⵵iɿ          pA{p @@@سG*Y2;X@6n]:p@=:صK*]:'Δ@]4tГR4LX  ,_.=ԠtYȑWH J?$ ,5mq?Ԑ z^}UbA{J!p.{`A8z\jIӧ?b?r9ҷFn{ ؏%'.[Xح}qc"+0w@@@@@@@@@?O܃    -3PAS.t+@8&n5-?4][)IvK@@`*'&M>֭}V: :|Pz'+.oԬ)թ#M˕IoҥJ\#mݚ+Ci7,-]*//]p!52DP _>n NNJ6m1-@@@@@@@@@)@d6i   @"#{:?K~+͝fĪ޽R:zƍ@ 1BKN(A)\A@4֮~Z:\vm祋.f͒֯^|QjBʓ'ƬJW1O?ɝӭwwtDd8w=F ,d1Jj'n[JN3F[ @ƍ6         "@di   @6vJF4E  ʸBit*N $V Vr?OJ8 J  6͛K5jHKg-͘!m$ &i#/29|XZ{O,u:v4ЬBy0H{_7=YOH#ԭ믑"}#@F,dTOHJϏN\m@@@@@@@@@   d$gt~&p]RޒT>h@" H{(p )СC<쒄9}Q%''+xi׃Kz|r=NZlly\ DzK>r?~o](P[ ,rB p])RDEU(  Y-[wߕƎ>L*YRUzQK^#D}~?nBi4uDQw[~_ϵ Xp#HKIgjݽTԹtĉ#v@w }҂         $A)   Y/+4D\#k~ʪ܉N O; bGwڥ_~ŻݻSu}w'"X;Z(cf-ZHb0h1x:S6ں5kj۶mx {1\^Nڒ:҂*iu2Sll6O ,Nl)^IK%\`UIo)UTu[Wti)SƻI  ۷K?Ξ-z+]y4~ԡ\h3Rع[Z2M{reaSJAwY)yR޼?R]x'R۶}Hq/ .)HJ6m:eD@@@@@@@@@ aL@@@ <(ٗ)DB3, 0 ڵkN&6;.nݪ.iǎi.G LS'`W;JIR|18('!5k&=$Q:ԓu~8hҍ7JFNIa1*@dv}>F5-k|B@@@@@@@@s'@@@@Aڇ{/з҇Jݻg?z@ ,Dx!si mw6o-nh>&[MbC-q^0`2e ^ܙ@IDAT ?,X0UOy5B MÂ9|{nY`g03~_n,Yybg>Nd RJ)KRRR*U@M`رҌ~ZרsVb6ʕҥs7Or _:uW.Tj29 а#r啱C \:wSz啰 iav          @@@@  ӁaujԐ, *ŭ}Rq;=&f ԋ>^RY`SVs=W*T ^K *Ħqھ%rm۶-e`w}n߾]ǎKلZ dzJX(@H /M(YԩrWeIo!u*5lM[W 2;eMcG3)S#n]fMi4 # {O6i,)OHl%2}m+']}ޮy"kʕZ7/         $A-   Y 2Kl4 Q;.]+$ < @.ͅ}kO`K]jV^~ɻ붬]V-RD UV[jժVZ6٥-/_`.HS@O?toIBɲȍ. ! ^Z?ݛҪXb^gDR%!u{' 7Ŋ+  6hᏓ'KKf?JЭTYȱ_S"'0gtH| B7OL )}f | ..s{ *yyt 9y6@B Rpl쨤$$6Eˈ         #@d F   @ THʼn@NRkIO?'bD@ Fy]Bʕ+|r»?z7oNըQ uK.R+䔀&[9t7k./B!-t͚5޲pB5V,*UR:uTvmﲮKWw`j\" :$M?N t6sIW_-/2r <&\kl_)]q4jKɲ;KÆIvN(ahL>ik3Tq̺Vp?6Dt'R<'f6J(DU         @ p #   #Rr2AQ;+yJ&@dŐ6!p x6daK.w}e˖yO?^]@/ׯBs, f͚*VX0R[7nl/{.XjpYjfΜH\"Ns4jB" *fDO,㣏q={-?A:S;@L䩝z[oo:(' \r94uԻ&I#ss; u︶hÜ>[C w Mޞ         īAg   a1+E@$nUz1?1[obSy3,\hɒ%)˷~+Wѣ*XZ]y.w =X=Vdҹ0瞓Ç^Kh >jזl2E%@JԿtM$m^nE KCU>d$@dFBߟw_{@@@@@@@@@HL s3k@@@2-Wϧ6bz^{Mzq^TR~,?& /fΔJNVU?,=s.LKڻ77̦c ̗/'%KJ7Fp#t         @ ;!#    Hl zFG  2k]" 7ܠFi7o.\[nҺoS@L 1Îv cSb;P@Dذ|l\QC\ x_M6 lr/zW_}j֬.1룏> [ŋ5p@]~z'zꨙKb;رƎ9v .eKSjҠAҙgJ'K7K.]z?:qF/wݺujܸgiw/jٲϟȽ}UǎRҤIra鏾VZRΝ{\Czǭ톽#x m"CrG9QvEJߩnSN lci}%4mکF})ĮAFSpuIVڸ/  ~*#!G@@@@@@@S y*C@@@=#Dc8'\֕F \-Ν;5k,F2 VכY]67#ZCpn/w͚55bp"ND@_p\ku/_aÆ v]vy!ݻw|Rg,8J(A? ,Q {I+WT-~`cc&d,;رǎA@ oڵ*W C Ǐ,u,E{X9R+V{λ?ȼylٲPTޒ;nI3F*X0r s9ٳgnž6GyDTqך2%_ɖ_/u׿|_zkK lcFnRϞK{7g4OW"2e}u;Z"D梨s0*@@@@@@@bM Xc@@@HN7Hdó #GRVe̙35h  f;_s=^d>}" A óӾ]p:3d۴i%Mc%B%O*ҬoqPڵkgy&kL8;FYp!gr,9Y-T{ACM4qAcTF ڷo>'ǟm]r%1ǎ=v u_~|SAJJO*WN7NںU=ZJPؙik|߾}_k…!OJ*^ʖewoᇥW^|8V֭5|#1ORJy]paYd" H_{v;9l'4x4a\&2GiuCKFcжFm_>c%k懃g5@.OE`4       IJA;   9 2i\c]֮]뮻0|QrZzlϙK uy={/^<)׿j֬Y d")7;o8_G-[8@eaHͪرcKӟK,@.X jCmڱǎAi$  k{Ho-u"Ye-꯳G ]*R$fw޽ޕ 誫rs\=;]f4@lAf}_Ud?D@ Zx?-{q        c@@@"% Ej;@z.l)W(-_ رdZJ\rdkƍ;쮔2m43F6mR^t 7gW-[lQfԿ*UJG}7kС4h =:@ Ѐ4g͝;+VZ.0{ ѣ?Ypc.Zkm/{ms^?޽{{iksf)Sljܸw|ᇲyFc1?;_ϛo{E8 Z`~ssiT8eɽv\o{_ej{ݴqrw4d.]ڛgFqA 7x*-ӽ5Ոr;CZH yV-H|K_˕+]k(bŷ ;|$|q_~c9GZuo% ¾F*X0s}d4V@ldcu  Q/𽟊@@@@@@@a+U^  ?WZg>psžEOׂMe35[rj PH gO#y  Zp!w݅ky}PȀ ֽ)x\F`pV^Թ.\һ'eʔI履~ @+7o^M6^{NR+/{1؟Kn`…Cfzwgxcǀ>;Br΅y۱c[޼y#G :t(p]wp!|.1B=pAlv!Nʖ-ؾ}{v\Pׇ¤wqn[q!:u>%K pル3glmll.X;6h (gAo]RRRm۶ݶׂݻwgbd޽{4; .7`#iY6A.8S "LYg۱}]8ۅ.yc{饗kkͽ6.4ШQ#ok=6m~?ե$fޞ^Xdc}OAQ [{KUh][;qs)^{zuy 6vqqN+CfoJ;=[W;wtk8a saցx͌Qwn#ۛa$>@s3=.O<~^'x~Ǵ;y\VFcoD{fc7M> q/-a`f9+B@@@@@@@ Sa!2STB@bJ 15h@W>\} ~} @|QBF\ƣ 4K{?cK81UV^PĈ#&Mn?c) ;vHNN6̫ 2[dnݺveMZJ+]H~~,0 [`` spU´R>N2/-S}[/Oi߭[ޚr{^} &ď;dGGɂXjiǃ-Z,Њ/ǝQ[իW"|,1ҷo@彠AkK<}[ *U?ֹuw~燴5_> "W_'NLKN<~w~^w? y=!&Aؿ( @ D=t'}SaMt މ*oCޫ&4ņ" U]XE*u]ѵ6 ,(47{{'{&3L29sw3\@@@@@R2@@@P:*<B +JݺIo~[F-%jPT]`WvSߟvʪUɅS}E.O˗/ Ȓ z븰2??}=tEhɅuVrڻw\@\\0_nvnݺr!]rArkZ~yhȑ)|\IUwV^Vy ߄n,]g-s!85nX}c՜9sXiukڴiz6.Lퟒ%KM4IYv)ea7lݸqZncTnHU;w\j׿ *m1Յ\v~ U^_hYfLCv.SڵwmꪫSV<#8nذ?'/^:Opǔ-[?jժ%hѢS*Iؕzca?+97cVOyk1+v /9P.߿߷CIxh3mD󣏤/W[w^~U3k%wKbO8̮_ 99ǥ(NإgKgK'K#eW42qDu?:i$uY)׿l+WC7.Ht>qoug4}fuD[o|IHJ] @vie@=ߛcYI@@@@@@@_ ?@@@< '@c%p_?-8pE ~/yVaS~e%?@3f(4͟?_nͯw"EKV^~e?2dN=TYט1cԲeKWHkk5j襗^RFvjw_JfΜgY_w>YL,8ezϬ}[N}Ή'W^yE]vlӔRƅ^肣.ײetyBxwޝjnj,6<6lLg2+5i0XT^KfY9\c]VBAN $ Zι13z=Xrx N?kg͚#vM@A[b}Grf!aoΡn_A/ ݻPj{/Q|j`h`Z ^$J}uBuڵˇjʿv۟>>>({4aޏHh|>rsK;~dv}zsnbҳD<@AK}ְn]~  Slbx?#       $At+   AZH% ㊍~!l&qx{V~caVZ^4%9 *Um& J[.]va?xYx٣#G;:T6}A"c?Xf9)egތ]\9h8}իl~uo߮+"1mrjߴiS_Œ%KRUҪ\i֬Yv >3ec}}>Hխ4x-cGgO[$v䋀V Η@r,ߛ7       I FƟ>1   DQeyYQ=Uq ҥ?.'|_W_zpƌ~۶m<2wTeu} X:eԩ;Bw3[У@Wj'|&Y@&'oVUVMo^}Ud7zh5h@eʔ￯3gb!S]vVX$o_'z%^sKv[7o!CȂ/BΝ;<}k}㏲1}B!I6Z[,0ʨQ|ON\Kpڗv4z-۶uV?B}*H?t5emݻwkӦMotNSs#Ϫ 87Cmق-XPTx/֩SLJ'/fkc KM-  jז hdo\.:*;.iUYf춷.Q5jH_ۻNuX}a{)Y/'M+GH@bT7}j,@@@@@@@ 2/C@@@ @ n5qw]1SFZ*uȎ;jɒ%>*CURE~_tG \ =SZr_۝U 4kTlY9Rsu駟[XkCz ˗/VJ fpH+V]m۶![VN;4/^ Akk΅CO<ѯ? g^OޱcGLdzo oA֭??&B ^1ڶӧOט1c|5h%Ҟ'} ˞7v|Ÿ k׮>ٺG[:~97f gj[fs <ӗ_~Y_u޼y8q?O,Ǟ6Yx+; y }tr\^4ufYV-{,6YezCeK\xwtzc_7n(;-&MmSCr>#_m>>GFV]ƪWϐ=av@ @:.}~,B@ &{3o'"@@@@@@@H6很ڵl  $. "!( "` {mPH9sy3\G@—;ҥ:.*%K ?pE\YJw@-.x)0lذ@Æ }xG'ONO:5ª t  @-VQF7tS,:tPiӦ`n@@}}.+, . P v x㍁.]n喀aʀ *T(B.??!yҥK.п־Uzwu^N~X\reܸqիllr9>P^=?F>Á!C6l20m4?f}:tp< XիWW\ڵk`ʔ))ۺ ŀI6 80p Dc>mch&M|;)ݻw` LOf72ͨ^;/*U*5}mUV ߀ tAc=6g}ou]GyުU\Pfvqٲe\C54ɗ_~pױ}ycܹmۦlgΥ< moY;dtn4ŋ\qJݷv^yq>z,tcbgyfKZ6DA"-w9?>޽5 {o ㏑Sg%;O5*N@exZΟҭ (qqDu]G_J (בRw>$:w>#qom FaG8NGAQZR(JT`xLGH=X #q `lď@oyFR@@@@@@@Od)u\9<2R   @ ]EDȳ@BpOHt>qJviO]g~ڵkOͧ䫀HQ|@iTcElĸ?++J(!ox6J@@@@@@@Wh!   @ \'_\% X*޽:oYeо}}aX嶄Nk5+L2.V?d!`a~{.R?o޼;<֦M,}[ l\IolǬ၅EM)ׯWWK6ɢ 4H]t_#pƺN{?zHGhU/C 0o 6m^_[:u9;eȐ`. ywK.@Z %P~τ @ ~*:b@@@@@@@@ @ {,K@@@  c8T+ g*_%+]Z9R0@ڽ{Ə,% sE28ꨣo# :1T6m[qTʗ/M̲ ̴u=Uaz .YdzeYA:=k,YiӦzw ;)H5wK/Yf9sq2@ R͚_ڶlw,V A~7Ѡ#T,̿u-sOHFj9sgJ2[5ǪW2\!ASroYc~B+Vz ݈t+R/YU~}]:w,G^K-t1䵚lmo}κή/hذ3ၴ'0@ s \.ux@شiz{|3R⣷@@@@@@@(p%RSjᑪz@@ Xk_wG  I۞>}"PU ۷}W#K8h0M@ǎ˫Ћ/FO>ь3siӦ\5.T9N68p@'No1cƨbŊ]0ӵ6bd_`gP._V/U*]p_..B߳]ӂ/n?j\ߡCuIs9`PvڕmCtɟCeq20}Pɟd?1R{N窟|e$ϥ>[G)S落X=ߞZ{ ~^>vu}eL>>gڲErABAV%8}=.>בֿ|o<;D@@@@@@@  1 C@@@@ (PDpg"(\pTܾ@e(\rou)^Ciĥ*w}{\0,pXb޽?|uYeʔuy; i8=~.~!KDD`ǎѣG?X`իnI*ɅK>*uTHg/"ٔ e>{O-'%Y0k;w|UH*+Yd9%W,̞?.[]CJKҀFgvnߤ/{,`K  i{E]Kdm@ 2~)92Ԃ       g    ྏl{ag",ҞV\ |C Cd ڃ@Xg' }ƕW^ݻwO ٢E| +m 39J]?-oQɒ%գGkҥ XXNCG707pY`jS|OnJ XN&w+oÍi XKIe˖n߾ L"`V 'H*02ud-C?)ȖoHdՃcI7@@@@@@@@@'@dX @@@)EIBb3t.[?_y$<2t[wL6w)7a 6LwqV38C:tSf%2"`sɓW_iÆ jڴw{ׇd9H8ظQ9R>\nJ,mhi#⼃4?f~OKK{[lSiX6lpoG4uTR9Ŷm۲%DBF }6: "EM?8oذZ~@ g֮M^7@@@@@@@@@/P8&   $Azb3Ҏ̙ukz#`ogyq͛7OVO<ҥKkȐ!j޼ a]ꡇҧ~*9Z k^׮li{mk^׾@fϖ@͛^ =֬) (U \^z`$!q+WKo)X5!-ښ45Ǝʖ-뛰}hJR⋥C#IG-=Xb^ @ Xl*Һu6Z         @A-O@@@/ س'Lk##A=zᇒ}@Zteڰl2}.\}6mNP˖-U|j6E i,q5c ?-\{{:ܵ.(իNt"#m4f{ĉRaS.oVo){\ldC-d%`NϹ)S$w KI=AS ;v[7w+ȿFkOvmҀ҃JZLA"-PF0:R         (@d<5ڌ   @> ,)ޝ;ew1!A*H:HGO)gӥ^ms P}O'|RWzZ͛7Wf԰aC-)@ ТE4w\O>q֬Y>ժOZ0AT)[)`A-~ߍEIIIի~~Zzhz@ ,L          H|g   d)P}|ǎ,Wc X"퓊O@@ !,XSC6lL~X\W hslڴm7nRJ` ڵK~g?͟?߇?}"U5j-ZԺuk?UZC@ b {҇ߣu R^RŊ!#/,(䓥>J&U,_Ŀ_ؾ}{:qأҍ78Bf[b V HzR         @| Ǐ#   /.J۶ˮI Xdb1֨{nK'K7@seSݻW ,O?9sjɒ%:x *:u@ aÆ)S]>!K'sNZXhBŋpB\R@@E,@[nռys5iDGX ;uOcJ.VKO=%]pTJwHuP^({gwY(/^Vw@0ѣ% ƇxzJFJ Hs _n-_9$Ar              d)P}{B '[WjRp,m0-C2nP)sYH/v{޼ynkצjG2J yS&uVX‡:|ҥZlY|Æ )MQAmԨ>l5n؇=ŋ @ ?i4|x0tN?]o).\XUTQ5RMYZ5<4%Klˍz`)tڵ 6nܨCs&Dj-ZnݺJ* @lrJ8rx'pt@,WKA &GzQ'c4* JI:I|SN۶m23}{iܸ c         @b XǓ    eۣR5ư'(ÍtM0W?$2C@=Zeyff͚T~j*}>oӦM:x`nX_ʕSM}VXQ*TPyU%/^Ҟ@ Vi`;5Z曥 /4Ֆ.䂗믗^yEzuTM˺7>+cߥ4xdB ߧ,r MO _Kp|k@@@@@@@@@?Â[    j"2D^wowi_U0AD>" d}C.]B׻ooذA7nL 駟R ٳ'j8B!-Ҧ2eʤ;.]Z6YdRR%&34/\pם/4¸k.?n|Ν~ڱcқ,14Yՙ^1N [Zn*J*jժxNςe <ӧ A66ؤI8qi8i(g -ϽZa9-YBdsYgII}MgH͛KCJ;% c_H@@@@@@@@@"#@dd@@@([V.8(Hvz5[7? ( J3,BȳYM9)8yfmٲOFhAP|)֭KmC B }b|0deC󴷋)hѢ) &k%~n/}-}~~ۖ-NYxbڔ6LYl CA*TMia@ f#qRQ#`^Q^iӤ?ڷH ezebŚHWM}hJ.8] n.|R=C6 XB ~c         @ O@@@Z ]6%)S'.iD_$;Ptq QT ]0P0ݻe-Ĵs[^آ,P`czCeh}p"myxd p)G|8R J3K,)B 9ޓ. ?^xԺu۳&`?`?`a'l/J"(OAK&M@dTĜ+Ws˪AmJ\"j2y@  8TԷo0"@`V9GڹSQi{-}ۥ?:w%CkN=Uz@П,"Aud +PaC#          c@@@b[R%Ai۶n'@<AZϻu>X:t(Ԇ @ڴ Tԃ #ȇ6m*Աc0,o '%B ӓcY,\1k)@qˏvutҨQ7V䓥u>V`e ZUZ>5Q         -@d|?Z   @TͦM;v#vRT4(fX ҌY @BO?>n@Э6l(=ԶҪUsl, 3gJ.ը!}TV~ XuҔ).`?Ҵ?KBz}iǎx GXZUZ>ZB@@@@@@@@@(XR@@@\9L pEiQ4)bT @T /^~9*S) nIg!թ#=t1҇JkJ"u$) t. Ǝt:wƏGPx-IiԨoJR6Y3i,/ x}G ժ@@@@@@@@@ ţB@@@1rbŤ~ќ XdBRRQMD+oB!@@ 7H/mJH`[:l#; @-Y0aRn @גX7?I_z]x$Ơ[9R :+EPcy"XaTUtyHhĵAn]         DD Ȉ0R    /`_ݴ)I0Œ%a,[;JH_~u wt#X 'ykRR͚-H+KÇKKo%)qDz[ x)/CzE0#qn{ҧr4mZwB 4k&-]*ٓqˤ)Se4b@j5} 4&          P|E@9   #`ADKwJDMWGRҤIO @n*V7gsS 'mR]_TTp?ZG4Hz %d$ТԨ4bDFk}G@@@ UX5^ 8C`?O@'@\W/];i(CػW;V) ~H thQHt'X3C ;۶Io)uTҗ_J@pk[F@ҪUGA~GKo]P-` U{~}">          { soǖ   $@ҺuIR2PtIk=-FHF'NFHgHd /=K+WJK*}td :Kڲ%~>[=[YDg&Zrpܝ4)xdS (6TIt sK]@,Æ ?         @ ߻c.@@@bLF ik͉mRQE* Π  mHtҾ}bڈd,pdcW]%ݥx |W 7!3GH\C:p зpԹhԮ]s k:qOϢ'Pv{~  +Aѹ]ystꎅZ.f̈WU% Ȧ          A&ѧ   @<6l,ԃY\|C5~5>O@OGOc  뮓j֔9G5+pl7Kj_y /  餓SHelI/*ADD<~-^ԁ)PAy5         @AF@@@ ,=֯pH0[7m[X1/@SG顇~Kn1H @@кڵ3ϔN >.Z$͘!vtQ i@> MHGy t,?a _۹(]Zڹ3wV{K#FKki'ĢAڏQ@@@@@@@@@Hf w@@@r `AV֮ 7m H}6ɉ! @yTx0'qzEO@ OnU[W:tOkϗfϖ[j zMȻ9[oIo#tSG@GU*Z4m ?҇Rq^EWeAKHfxShĩ@*ƍqx         @@@@] D?‡/ 7:yQe  @, - |iѢXn)mCxX*9SڣN>Y7Nry4}l@2qTH=0Kz#PRZ?̎bֱD`95A޴Ure o@@@@@@@@@?Â[    *%]JD N&L:x@;6{$ʗY aڒY iu;{-[k" у*1}C UH6E{/ԏ         @l LJ!   S5jS$ʍ SOAA@ ^,ǥ#)SմbU`vᲿ&MyK,|P:XE i0siӤ%K֭3G@pA,޿bvF{i͚Xh m@x\Yڸ1ZM{@@@@@@@@@;Ԇ   @B Ї7UvʕK8Xۏ;:h4@ t.ut뭀 ??R Y;^#H-[JMJ/$u(}bI'K@ {&H~+,*9"aIQ P!XA+ew^gkW|#@ Tƍo         @MA@@@'P4jTeH ȶm}3OcB@O7OiР?=N jΝڱco߮].%Ȧ.04{qm\^?nKRK{;B H"~*쒮_fslGq/rdɒTR~]lY)SO~, .N͸URN`/x`Dh1!4.m|!Ɔx`nֳCㅍ !|m3쵟vqD~͋-Y]ڪ7UFEH#PzWӽvjذڴiuz}|isc$YťvU\ϫVB;/RR ['{lez{wꫥO?,dWN|q#          I+@dz:   @ԑ֬,@YTF0 }3@ Qjז~X RD)u pܰa6nܨ~i˖-ڶmnݚjG ʪXؚ7Y6 w ,T2<.mxd({ccW~B*6 *Wʗ/TbEj, β֧Ho?_=ZR@f#G{[ Iv&KhVOV% K>.CcEh6ƄOƆ(CcGݬp &ҥK˂emCm<=Cllܰ16PHO`K QҥKl2\?ץWO u㴯-{Nk:l{[;իWOG} :m-[Ev$u7VYdںȶ>wkF# #+Km$!m&@@@@@@@@@ !i=G@@@ yƥus=[ďA/.,/m #t@ )Czy&) t,|m~Z׮]jZ~}J? uPȡ.;<,(161,-[h[O`L ЭPhf(H+YxVj\XTu`^#TV-do 0@.+PIK}0G{ XBݷ 8l] QL[5dh69z,ַyhP:'J,[Pgc~A7.nuasgo7L5bn[h_x-g(24X~Ɣ5k1B0)'`ӧ믿̙3e[+v;8s1ܹiF{VuqǮ\Xl\](l#G^ֆ38C_h;; ٩{~dDZ~l̽tו@@@@@@@@@ XR@@@ \ r%A~0 ty> QN>Yzل @HBnIFa$D9UVp+Vh m@ZXXZ*UR6o܇5Y`M-- 2lD8 Ͳ7YԩS}kY\X ޑGڵk@~:ꨣbOv.=%oXՂҽyh,C66XЫ-dЦ-ZBBk:XMأ=u',pP%ۡWg|l)̎XbA6O6X '%ϟcj„ 6m5kǵ]v. N3u]1 C;wN/sɮO6mB;gϞ>2à'r92~׷ G\(ȶe޻K          I+@dz:   @jԐw]pDηeH O\& < @k@0 ϑ F|-]T-Z%KɂCAfQVZPY8:Q'PtiTNlĂ,& xYw}炖 w\]9 <(}\da8x┱9dXG q׿M[VnXPý1իWgl(ে+  H |n[y4i$?V{Zlh_ljР ;ZJK)3g3wUW^yKŞ+'p ߴ[jʔ)/]x i֏}{>D5۶CK2m+-7HW_[9Cdp4p=         F@@@ȶːq!2r#ބT ۴ OzB@Z{LC.@G:HڵK]eݷx jԨ:ѥ`[ wBy|Բet\0&7˅BZ@*7vWi͚  m rjWSvTLnƶ)!0e˖/^z~ 8cեK qXbQZk \5ka=a0k!W6l,ϊiviܸ9?y&C\?~zh᧟~}q׃=tꩧ9qT,gm2d7nF .^|źuQoA)#{cĝvtA&_DS]eS@@@@@@@@@HZ q@@@r'Pn[D ,[V.B; HK@ t.}tQ'}={~G?_҄:C6lMo߾jҤP. $Ruq.9E={dh:(M@۶mW^]-ZNZ=X,֭[ǀ9s .]Z6&лwo`mx +p$l;VVOm)G .ɘ1cdAV,T!-t& Ş<Ab>?>TR?tPXIV=`?t4~?:h 3.Cϡ8 pN#]%:H@ *.^6Ej*E@@@@@@@@@ .D#@@@u UNOイ?@"+ 'H+ٺ-6iӦ`iƌ>rڵ!!Z}Qd![E?R%JիO?L~{9߿_:֪U+7֜O>YzL[#'|B,\tE> a-쑂@,h& ]`A6;_o%K̂f ZЄ \1@.L6'z~uɓSOO;տ uD?jς -A^˵嗤g@@@@@@@@@ X|   @nw5iRndxشI.%Zy[O؂MOtom\Y 6-\pxIu{ٲe>]mƍË:&NzuW駟c=O=2eF KOPڅ@ T"m I         An@@@HzK7##} 3QRl*-\(5n( (C1H?/ _|?\WVR|S߾}}gUI9<4@q,kA6]yѽ{`H +2ez)vm*]N;4uQ:uR˖-6, cw,X7h*R;8?\r%q vG‹"[34}t >܇Zd(l}~#8"|ӄ~=(n޵kW?KcR>wڶMn\FYg%}tQ#@T,ُRQ@@@@@@@@@HV o@@@r)РeyTb.+a Hf-~ 2Q)@UronY.8H Bd~0]v0`:tފE 8 6 go}Wp{N~hty@IDATV.]Gܹʗ/^WZI&>UR%mV]wѴM ˣ LחM\pCdA~,$uذa{UD zYZn… 'ٳu_~ѣ>n}fAzI&5jk]}>D駟vB8;EdIm 6..{ݵ.]q>] @ Mq(         @.乄c3@@@U}gߗŋ6mU!m_*U.FMJ3gJ%N  @r y0ONX}駟jĈ3fڬVZgϞ:t+VX4v gPY?Ol:3ջwoˇD qyMP:K{ * t X6l+}֭ɓ}k}6QE]vM_|D[8?+,,X{֬Yu5h„ z7|v _~)d*/;]YrJ:jMAAoɽwf?{DqWEҕ&R" "E^ ^EPE & "# "$ub-d7w>d2s2Oh         q(@@@RRn]X1i”rvӥ|JA`[̸ @ 콷\Ғ%ޛk(M4ɇ>nŊ;|r}2d,[8w5fȵޝH曪]@^?x9R7o] >;O,qK:35yd[No 5mڔ_4/ql{:묳4b4qڸqv* }N2o\~| ,]Cm۾}{-]4wt t_ i[\*U;VN[:\9cwLA@@@@@@@@@ -LN@@@Ȼ@rA]0 nL -L"D+pdF;W=ܣ cǎ.}>^Zƍ%\" գG=Zr.j֬DFۤ池+o={Z(٪UW_[ԦM-ʟzAS.v=o{xѲa~'-v۶m e޷[o% 63(qشim۶ٳ2͙#-[&sL|ȵ)"ygJچ$ }S@@@@@@@@@HK@IN@@@ȟ@zAO0n nLF: \F.%i@DpFOOVF~GWh .В%KG颋.>PXbܹy8b͝;W-[QG1c( pjz'ռysnY{ӧVP3x%Kk׮z'|￯ʕ+ /T5tDڱcN=TM21[MH<ҥKW^>m~:3};3x E?4kժ뤓NҢE *$li.PhQ{zg}Cׯ_0^zo۸qԪUiW*4|>ז_PeA' ,.鲒5o^Z3yR<M" @@@@@@@@@ 2e%A@@@Zǜ Vn{onLRT4cF* =rjr!8.߿6m7/v=zP"Eb7#jB ,XuĈZxts9GGy kO~Mtu}#<%KnS:upe[L2 ɓUxqiFj-駟K/֭[j[Ruʕѣ+n]+ʭwքaInt $ .P2)         Ai4   WOZLھ=0ub Y#UmoZ60= #piI$N%o,3\aRڍ@ Ts'$竞;믿^۶m+& jذ.EW^>XP@ *\+9slٲj.\qׂ.?*_=dΝ;c̪U_?=S13Tt 2/QBY=B8_@@@@@@@@@D 2їC@@8qZ5n8 t1Ǩ{ .iACK俍k׮Ո#t' FHZիJ~Q}!" DK嗌zH>X=;/=a@W஻y&qۘ-۱cJuY:vNٹ8ys d ,_\=?WgJjԨ_|/w o;#x(gϞ>0fΜ0I}A`X~s=_GݻNǹ\>łm͚5s2vcx㍲o=v&qMƍiK/T\rIzԮ];8p6nzhH餓r墝"dz )SRb'P@A@@@@@@@@@ -LN@@@ "+,ܹs 9kΝ7^SIe2o^Ncfym_^&L{ァ= E%t*Y:}ZbUx Oe3gΜdǂ+IvҥKy?)R$ A~)cǎ' tɇ/VREGqFZY%VY.LEg] ܞ}Y}>h񫯾?$a|[إm۶6m9uYO; -[.YR^9ĞWrߩ͉NZ!P"A$h         @apKa3O@@Hc՟ܻwo5oҾʅy'>}FjTvA^lJiT֬ԩ{\F ]r%>(vɹVYzr=q&8ȼqhU" {C 7&եM% ˥̞=[^Rk(&`}Uƍcƹy4.(Q'*TИ1ct1ӲebPkUu;ʂ(Ǐ%4 -WYĉ}+۵PD2dF/\>hܛOVZ:3>dѣh؂-uX.IO>1bD,ͱ.U.]r5mFCj_M(C |1)         @    @" 8P&LnfOb7މ4ڔ.1OAv÷ֽD.muԱ*WUjTvmⰯKˍe]O" z[\S"6  ; ɂ <>H|AZETcG 2;?g|Mm~%jtA:묳v޽|eaq`_X#ּ曺ktQG7_Ϛ5+I m駟^zIW^y^φ:szW<{s8iחZ[w;<-\{ ;t_!.8Z{$sH:?#sl?F `         @b )   yزey}W?ԬY3]qQB&_Gjҝw՚5k|?իWOwqFؠ]V=iuR޽յkW *]tM۶m_|iѢ.]~ l߾Z}'z]Zq=>Xȑ#믇oR_{5믾={Ϯ}~Iy m~zkV,XN:~[+VХ^ոq/kʕ?]>%z~Pv!<|A[e7ܹ{&NO?[L~_.2?38ÇUZl_lz)M2E˗Wݺu]K\¶aQ;me(;mt˂cL>]n`'p;w.][P_DTԠdyf @,OǤ[neͩY׆ mݦF%D';֜1c^yιKױcŋOԀqvN[oW/ƌ#;׳c;;~w1ߐ!C~!cQ{ѢEjٲ֭["E-6rV~[࣏>Nw#8" =zs=Wg}vh_yO4ɟknڟSXMYY[2nмysmܸ1T[`}ϙ,(c S/, ҮIyqi]Oi}K41l=4;7{ٵd/\.++V2˗u`ԨQ/ʾlݨRX 욂vαO9;_Ӣd:k;Њ]$g(vѮ5FS:aʕwծذr2<>o߾⋽}CVչst9-m߯fv-RN׸׮Tj;^k~9MmT>3:r3;r7ff X _AG@@@@@@@@HjP KZgAA@HW_ dq 63?919sf8\P\ݸ_. /tmH &65m4B.Ͽw!j/.!BBÇ}硎;q ⡏?8Tvmq!"r! !ra!&?s.Ψ> @?񏐻ۏ}v? fC.#.C."Bgٵo&7Qc.>c%Km䙐 R^`?>f0T fېn!oO.%4yL u'o͛CzuX= h]Dȅ׶[qmυZj~[r~;n8:tpIO*V, 8plBÆ fϞj׮wu~B;r\Exz 駇BR `C|1)i"sPbߧI o%fu1 ?چpu;Nc1֭[CwC 6'o g.0{(t\0UAT[oշlٲj_Vvk~'fV\o._sqֵmۆ9s݆jV bD&1sr]BC]t ]rqiӅ\\O]q!痡sN訣mfۥ9٭We/`.u~_j(}{r~~g7r.2}ANᬮw }v? toX;\^xX^^ `w]ߟexOc7}.D5. X춷}eu-sƝUv-~_>S575\yǎ܏iNtqv[B ң2}+d(1": (l_/0(] D9!       p=1v YR  ($ʒ$`7zsL_%KM?~ 67NZGr/ H x 7VP!xN '/uMV-|Bu{Xnn^zqPժUCvcvPڴi //Q&ۿΩ}A[ k׮?~xA3|ҥK܍qF؝XHCzN7lo,(#(A;`S };v/fVw&2$ p}:0Xc!Aen6lӦM~ڰ`&ҳ݈ިQ" [1&*`R͚B=z@kCv(%cM #<[-B, ӧnǼ:;yhaJͱoNsa [[r_fnA!8=;v~m0`n޼yIx ?,Mќeu`۶mjk4,=2.B|a?^˦X-e+1Voc!|Ax6vnUӾ VrѬ+2~/ ^~1r /p@ǝ{ E; pVI}֩Cbr|]w}s3Yk?'.1DeN7kY՛۾w|laӦMmQoAgyfTgo͸6.R2pݶ _ɇ B Il&2 LM @a YXy/AycJ@@@@@@@ȟ@Q)   /^ ei8\Mc ~؋/={ʅV)UTp7݈-[jra#߿Tۥ"ޤftm܌~ۯD߾曑ٶaBѢ+쵕~?ۆ .ۆm?VmO6dp}~\.9R[nۈ Ñ!v.lwa4h\֬YQFmi W/6l(Zg6hyr2egI&~$j9 iBiDm!B@ v(u=һJ',x55viYfcFd;TC=T.NÇӸHlp7c8h菋yoNci;ԩSxn6!c^ggvCO=k;pkG[\j֬ '?رc}(Pqb:,M/I'$ ?j_d=N]z% Q+}ens ^.lnFlnϪdfո5%0jE@ ]HC$wAB-oӦMYQ;̮%ܕ_ϭ]SO=傉K&1\~}#}o?fB0n_n ~,J8VXᗍC~K~ύ,~}FHgQ-[ƣص*U>G31UZn].n+yDn+h׻+h s_5hY]'@+ǣ>͛7?,>g.wDX$[hr-kY]ɮ> ܹsx/Ϻ)ha_0eʔyz~.SrciԨQܹKl|ϖ&r2d4hN:ťww}߽1]ꖅ>F{{~`JӦMSM5q C#`._115<3So b'@d, @@@@@@@@@ LeF@@@Jj[V|駻fڴi*SZn,&hK}W|yk1cFx2.] [~y)/_wuȜJj*uYf͙O'N$4o>O;m۶mG?nGO]tM>4/Ѐ>ۺoLp 7z:餓N8!-pkUj|XO?6~mm7ۙЇ+VȅV?-Thz2<] \V @h\A8P+k/e׎UPAֿow\PkfO>Du!A<-)%VǾ,ȕ?p9`YٰaCxV{N0a6=,kӦMkA(6+?1$*U}taf3h Y zK{i]VwGA b_u}AN~ ,Ҋ~ aڵ>6eQ&M_-#al!O=Fà 9GŴXmoAJ,ٵk4z6nݺŪp=l:}(qAF lpAdT/@@@@@@@@@@ AV@@@'л~a*g(K,?oч%ڰ5j-,ge˖Gg{=׳k vGI,n^=ԺukpB{ڣ-Z߀muX@oڴڷo[s7A6#<dz-ڷG HYƍYDΝzo|.2KLІYիuw D,ϭL2EmV2;* OO46zN 9I /諯͛u}E:ۗev~ޮ];1rHvp\3f?fhAyxb=>H0ݳ]CׯL,1DӦXYPY޽}Ȼ-D)v-3godn*ʕ{H-xBdu=f}٥yG-Ղt뇕m9f]f^پ1XPD['8 /Z~)#!/Ba)}ԩS}rt'\G+Y]C6 f_~jv?|k.i!]C6l:ufvi5jEen䢹Ɲ9BBZmS]o]{.ĸUz!1W7d6#ύGUAtCY/zpq;mԆ         @RxR!{P@@RGWݝzcGAmmCUV h"CB 4 <8n8$BfZp7V !4+ڴi7o^袋.e\z\\(a2cM;6smKuw˅ .m 7{;Gձ{9;Pjrܜޜ*V#|avc.幸nɅCAꮻ msnt)E ֋ & .5wL )k׮O\VA5(1'x{=w.R.o3.v 鑍 '?WVKA fG#}- }vae/UTx var?ʷ%<y~\Gv-u.4zv78.4 %k}.ZH5̮άw?$ꯧ:y%wL=[X!][sIfGA ">}Iu~΋eț?++J(!p5Ŵ@@@@@@@RExt~   !`7j|:213|jѢE&D7hy/^<HB Y/z<͛v lUZ7B(>,;b቙Df9Ai7y-Un F]y۰`&M*gŐ5 O M. @2[n/2-ڹҰaԩS']ve5j߱cXdǴg`bh}G4ur+9Njձogd߮~;6 tq/dee!gŬz>Mٝd6 bas>,t0 0@/;;˱ e粣G?ciȐ!> azg qJA {هy"뉬^g/Jf!YV쫬[>x̶D/~smz|5'N‡ӠA[o/seA4}4io%XnoAkϹ&WE֛_~~a1R~iLxh--,qci 5c<Ue_ҵ@@@@@@@@@ +;   krRnf2>JB m` {Q\r>$E4|*D9|wu?{TVO-o> 6o|c6!}ԡC&n|/m\v&٥K7kڷ"%v͂ ) @v>*         @  ׮}jٲWcU%  k,;@"EbPKjWgb]8tiٲW\p!-O+-e1e U"r˛.贘zGb^o^*r7ߔN>9/50 #p5t1[8a PgmSJVO㏺裏W_Or!_?,ԩS(-?}HkzJYx%%y,nѣ}',^>@V;WObᙯFCembζ$Bׯ^~e?^[N&T~wܽzjM6ƣ"s4yrRλ\/N>ҳ?qFzNqwwA͑ gež7(!ߒc9J@@@@@@@RQ T\ @A1ĤU^)PH\vFW5L}'5k&}tA Р87F q#CnD!&U!G),)MG-҂;袋tf͚5wnٲE,O[^' v w.^ʗ/XhV9KE/b.B/?_w^(͛ej?k,uQ{N;4UP!k_uK.-{PW`۶mu,^*VX䠘޺uwܹLo%J.LBuɂ[{'>PV}ܘM6݅I&QFqoIKݺ}e)]˝vߙ;p)U:Ao!_r4o5#)@dAjf^-6Ԃ       (I@@@[iSi`*9~)iTPI j9 *pr!lҘ1:ۤ Yu饗SݺuuqglYc#΂eZ!Â?G`#.r@IDATO_|1c>Se? lٲׯ[M:UMI0˧~Zk׮-D/aLJݗkC CJR@ZhqĂTugՊ+|hs@9[n۶mթS'6O%KCiPx@Z3Gpwi:hBV Y T(K         )+@d.Z:   @|2>4gN̏O ;$N -Z8% [];2=Trʺ4o<p^{ڵF+WZQ lq)Yի˶ P}Gzj >\͛7DCհa>zhYBZ[oUSLΝ; Xtx r)={ UVɶSO=UB[{CGɓjO;ydЛrTJ0KŊɅv@Aa ^         Ai.   hP{iXL}-`Aj\ o~I 3 !p]rAOScEQ}0۽[> nY,(ng}۷FYzu 'RJ>lٲe;b }:Tl,jHŋW.]Oˉ'裏֫mۺ*B0geߒs9Uێ.5jHuߩ{;vyZk׮ոqtE}N0s{1d٩S'-X 8lờ;wI&N:qW.tR/nI?|W C ׯGL         @ Ovl@@@Hw7fJь< [݄x\(( x_|trlrliuK<{҂ 3Fy*W:t {ر ( *h"Y 4~xN"V] *$kbŊpX :t7eo]W\q;#xGyZ8f(v~З_~) UtibawZlES7N-]v ԬY3k ,`Kc\r#of̐[=Ԯ߮ϝ}w ?}~MrsG         I&fIh.   ([׷&bhSn-j=K!]+U} Fۤn)7S2nvg0+V裏>aÆi.xڶm,u֪RJv&uV+}>, JּysNzjժ /?l}no|ڴiz콅RHU @6mLSߴ{Gu.J* _4;S7xFO=Ԕw^:gЁꭷRn|nx`d̃IML)p'D5 e6m(Y($@@@@@@@@@t 2]4D@@@ -ZHPuҦId,v: {Gb BX!PF 0W_}Uwq ^z>lR+VG,mۦYf͜9S6jժ>kA/Οƍ?0M ״ɓ5j(WD 5m_[8C'+66oެ^|~ĥY9-hѢޭ϶L :<}X ޽{hX;$sari@ 7mV\V:C 2r         @  !   PP.'ė3n j'.A^APdA@M\9i`骫ޤH7oŊյkWZ¥L>YkjpID 4pA $٣RJA<#nݪ ܹs}H[fmVw_vC= +V?#PHjaz ԂagΜYff#GjÆ ~rnGn.Xnn!E *`hR .jEW&Msfl%ai!{コ+4`y>#$s0W/ٳgCnAn FN2nze" x14 U Bg         (@d!3k@@@RErgԑ d]?ڵyk7{j`*@Wo_n^z)yJ-QѣGp6oC,*xZtvdz H ܲP8 Gd \I0 B/֭[[,-x6 ڹs~;0>iӦVZ i^Wl٣K.tc-B>믿ŋk۶m~\ 泠O[uuuڂ"mJz B!]VK.%Km}J-3ݴ8CAAY@H7.ӥK.t'e˖#l߾Ap]SLypŊ<,.xX{[-q?{;mmi:Fګ;D b&vi:-ӶzHO?,DBbgϞcu)uƂ@@Z~"}0I 0' x\~VZ+WK~r_ 똭/j:J\pߧeʔIJ#mk믿jUTQnԹsgϷD/*kĉ3fRow]R`!;vQC7EbCRpv-X5;G@ &wʅPǤ:*A@@@@@@@@@ iLEEC@@@Hl-^J6ҺF=iU\މ6Lg@ESm?#$@%|ȟ^,͂/^-΂y̙>_ Ofp*eoAZ.r֮]+ yիAmlK!}ga[AmRHq>#7o<]~ՠ;v Ch3ܯ:XXnݺ5DoXXp=w}Rb#`6m/?,1xO֬Y)l,,8(f$ڤIuEO ?)_|0 &pK}ݧ9sh~?Zk1][5kL͛7Ս-[Z;>}&MNv|rAӰa|$BymGQ$L\\-dLi$` 28]E@@@@@@@@A"    @LZnM.@.< &URI XːIR{im: .CJG-}t|ě$/ GVe>rZre8Ђ1k֬pPad0g[؛Y=[8YXB -0x/x* |oC,-xlpi%?,h,͞#C ,x#qZ {B(d%`8ftIzۥ5h`m;P{dWl J0h--!q=m 6lo~\r|-["J Ŷuocƍ~lmu>l-zk&M|Ͷ 2/g ?NJ+PU GD'J,t9uψfm'}׶ϰϩ*U_ھ# B2-'Af, ?l]С8g e;wƍ~'q@>k+r۲݂&m}g{mVRŇM{iPf͚c GJ&ꡱc'`A+         @Z V"   ? )ǯK%w~ڕ 3 )X# ]wɅH#GJ  X@=իQ ) f൅8S:wzwhE\YEeiWA= e|G@a̜9S}Ao7x - 4-Lo{m{A6̂[m27D"r_ HҞ-p2gD 69w+W·?ڳCA ^ رc-[UV0G xB\#`ܶ{[0>Z=[q:ub伒u~W_mkA._.ϖ NbA7f         '@d-Z   @ Xx_'mӺKH=zAZq9>4" ~MJ{K7,q\UXYaܔ7ސVZhI [oUw}ڴi3fI&I_ U{X#`!$>{P2A=頃Pz.Wc4{nԏ(~{@6$ci3         y(I@@@UU+iڴ].\/IƺA@H6-}4ZN{SMB >[.2zGț Ծ}{z5iҤ̛S!ۤå}Ԑ@pqٲe HO sk@@@@@@@@@ LO@@@@ĸb@ZNݺqMBV^TjUB6F! PjIW]% BB3={Nrw=>bi)/e˖ںuOH"iiA@)]stSOI}6͍@ժRɒ?FG Y@@@@@@@@@o    S -Ppƌ|V*dI1ҲSU#@W8f 7 Bw't3i\ l"zԧT~ w!Mtyw.+5n8)@`w=F.h1xOW:A4n] d_@@@@@@@@@ /AEi@@@@ S*WNc&A*%_60Ͳ~ZP= I"` 7$=!-IRҿr]CJ`…j׮>C;V;os'n@\ ̞-~4}4qtٹ b PO1*@ %LJ@@@@@@@@@r 2 >F@@@ jEd Eu"E - Cy"$@Rj%2Jնm( "]yTz~!֭[dɒ6mvD #HvRkmf: @ //1 HJ sB          $@d:-m   @ MZ3b1 YuIWQժҺuIl @JCzy6*F`{S=>bi#CW.]4i$ծ];mNG@X ,Y"u& 7H'Jjrԕ[ s+@ W-         @z ˟#   s 7Oڰ!USa.L ʕ ӪE I,pg$q7hz Y#=4`Tb5"#;wk\5jʔ)کH >iSiRϤ[nKDq._] PiSa#         Pp nV @@@A C!itcҡEOL~UH?ש@(RD:T5#g>H9SZBںuϖw?al@ 2 @@@@@@@@@E tY@@@hF2gȬ,hQƤ幊J)֯O@b.pagK7Hhrq |ҽJDA ]6oެݻk;)mZJO@ KJ_8qSҌR b(pu9Wf?rى1H rt-}D@@@@@@@@@ C H@@@@vҲe1 c,pd7XV㊓ʕ3Ih @ qxqFNΖY?{woqH*@$*J )d~3 !CO!C$ăcdlBdDy[>ν{>:sZq%uԥKt."Mԭ[7=z7n  @3fH+5h }?H')G,R#gvIj޼X@ A*UJVN,@@@@@@@@@@ "@J@@@]eˌ_EK$~%d'~/ 0? Vk# r]wIkצj/WI4u%u@lݺUgyKb4iR2 a @ 'u*5m*}MF@Ke&QGҬvR4 <4 Id68LB@@@@@@@@HYW۔/C@@@b\Y: b.&~Y{VWс+#4@"i:顇p#TVvC9R-ZHk :3cAZJ1B>]:<\Xk3/Q=7#-AFdv)PfMz^#        A5   E.paA9r!l`aB(P!#< $މ4@vU&i"HӠt ^xAoڴi  @63gJ={JkK]'j%}4atRR٬ĤXQJl훸mԩә+`dl?=G@@@@@@@@H? oc@@@E Gڛ6H>%V"'#! c .Nԯt-R͚E)*G a>#|Ν;'Lh kH>+ ܘ)-\( *tP"6W% }Zԑ;T#@: T"5         @.{~"   PSyl.n%Kի 40 >lX@ *VzJ0i 6i]%  gg:K_}:t>" X0رH.]uT4z4gNF.Z $>rT?-WNBL7          "@di   @1 4j$ُ7[i09%2>}GȋEI HGA ?~+K;XXvN2dHr5"E 0cFFȣ>v(M.{h+J* Se X-4^u?y@*Қ5X          >AϾ   YyؠAZN:yX)E%2Ew,B(t2e2^{M2Ы4SjJ:4,]D p Zd|MS HOG:iS嗥K5+k2LzG[>X*o} @/ϒ         $@dG@@@80驧}2 __*U*%$ 9@_ओ$ iԨcI^yE?^4{Px5x`sk׮ 8|(}TtOHmr/ʍ7Jgs etT KJiXK0@@@@@@@@@;1z   %/`A HVm XdÆOO)jU:># ?F&2zڵ\pԪUz?uEsQӫR ɓ[oOjX80#@|̘\:B q>Fw钮 b T,^k !         ZeS;@@@I^ʔ>L."ZF[L`\m[,L~`/X  @ӵt-RN{fd!A/WQ([jK ֭aÆ7nܨM6mؼym۶GvN \`ҥR^9vdaTB㎙mZJ"{_TNM\) *]w]'+)pTtIR6r@g͢s?'9X8aӶlQV-Yr&MꫳΚݸQll ;+F 3lY $@* @@@@@@@@@ p= @@@,\ysiD X9$LsJ!7%6 @ wtAkItͧ(`>(/[1nM!PBQFjժ% 6l2_yŊ ˗/WիWkժUg sp܊3ZX= a,W\$1PYY#ۼ\O_,2 |iT%IE?jժmyUzu.~^It%rWƳ}oYHzl1c2O{ /הs {xaam[cn',5 |)Nkg{c$l6aͷ+lɭX[-;'+l {([          i#@dj:   @i#_2f9 ܏åFr^& L=N_@ CY3쳥oN9Er*8t]DRI뮽Zu]:uJїX]/ҥK3--kp5 3\n 2ZHYv *(|Y  ~zzo!v# ; d ʳ30lkԨy5kVZ_6kvz,V+L9Z}t92E'L>(1}\' (uu=y}/`Ƿ6V,Y$2>D/BR-1zxXnLMni6>X>۹Q7O~0uXs8Fd}:NXa?C$xׂ4s2lj]wՏY +l,) %:Y @@@@@@@@@$'yIh2   $`A?.#|'SS?ѿ}I~; 0p@ȣwK+=ty\B:., ȴiɇ~XƎ} ?.\h",X>n۶-R\9e ]PmZ.Vz0ȭ%a~Xe˖-> r+a^l2lY(xN-ka0vڪSg{{ie$- u|?5rLi̘O>MH#?ґGʅ<#`aXaC8fk'aBÀA{WZl6VXxcO.Z`eʕ`D/>[dt_+=Fk/&HWw          '@dsz   @ X֭_HYT^ ac~I.DA. }~WuҶt@| ,i+5@(ԳeTp2EO7xKَY,Ν?͛aa)Rce_:t֪U+B51*g g C6lWs,LtuTq-' ;,2>DI)Y ִ}bxA=m|_nj.vkB8NXg8NXat?&}tt\ҡ@@@@@@@@@    F~O?q"AEL-Q#< W(hS@@ & *=tURVO{NhOA z!׫Wiu,'a?={ CV,]v. nFcYx|#Vټy{?{Xhh';~t5RNRR29-/ž̙+Wz y}#c!iU xZ=b;,X1{キBk+8b)3/*Whs"         wy_5@@@@ i#MuXh\\ol_/ Ue^+v%5|* ̘!=HF_vA~O,_\-ܢvJ(m.M3gj֬YaAngF>h s }{ի'ThLb +W·;ZcvŎE cp̘1zꩧ53/UX~yp:Uf4:<343 @/2;-߮[N3͌8agKȴk9|_-U@.-akc/uksfdEE7L ] $u4@@@@@@@@@ A@@@@ ~ |5P._@' I&- t TzIOt]*T #.wIXѠA'_rvl1`(j%{d-^lc5xuΎS'7olj-ZuD\95W'Rh          E'@dR3   -`AZj 9s})$}ٰ +@ ,;믗z+ZO[ [ϸGi5L2ںukaoH-[_azM´.=bm_hҤI\X16a>qժU> e˖ҥ[tׯ_[*JNr3fر?wso]Gm@ȿpJ\v/.;RAڞ?\n] oΘ*矚0a'lP< 0< ѣzmv߽?8S"˖-ԩSjA{UlY5kLGqmVkd=^ PaŽe         @Y2l@@@p%A7ݔv]OSF) AIA@ XP߾9H7 p@apyJ.@5jK/ՑG5kl#: (PbEm?z ЬY4vXx%^˗kg?^MwL/Νljw}WǏ{UV:餓裏Cu%Q7& h%!`vz;i$?V7N RRXbq DSf WNNU@@@@@@@@@ 2w?G@@@,r*o.~Ajx`BV X֭w:l߉{?NX̙3Un]?F\s5+WNE(1 Le{XYf8gϞ~qNsMJl8*U֮M>;@@@@@@@@@B?V   I/~o]w> Ȓޙ%݊~!2 AHNc nE0!9@.praۯ[L: XhaHߥb&Alȑzz:4bm6ܪU+;tRܫRqV͚5S#*V֭K@@@@@@@@@At1lM    *UJ:∌ H8JV  a  ~iD`:&0j4t4h\ ȭIA ϟSꤓNJOw͛nI{챇..oiȐ!:c ,]V\`vE]{Oد_?͜9S-[TO@K7nN>dթSGO>O?oY0/6;윳sA;/휴s^۹JA0, E@@@@@@@@@H eON@@@R@];ii۶LvarK'iaƍEE@ Zun{TkH\"zt) ]/*<Ó3؃oƍA; 0`/^{N;vTo Ÿ;V /Pcƌ/N8A}Ao~L 6lyܹ*Tcjپ=5*MS/!`砍 vNڹi稝i.!q HAH @@@@@@@@@)S   *`AD8}z0}l$A7e-E@X+͜)b^ tda u# &g$Qi&7.y;Q-5k?xjJe˖՗_~/B*TP-aS ^{[?{OӭުիWSEyW}quOւ K/m۶@hܴsU;gܵse  2?j         A&랣   $@Ӧ;K|O&d?tD l"_nK@(O{taLؕG|Rz1FYLm۶-@ lv۔)SԠArףG5o}_(p>85 `guNaÆiĈjԨ^xBmtcڴiK/Tw뮻nv FU;g-|̭$ 'iӦxv.H>O-[TÆ 5w\vmTRAe| G(cn0O{g{d/`7PI:;wsَ!;/c){9&@A {6!         2@@@@\\&+tڸ* &MZ4"2v7E(FRptȯ^?co8[nOooÚhϞҦMғOޮf+A\l {χ徵[_~ѼydϔO몫75i$Z|ysYң>3fh]w!Lj*W=C+]ܩS'b_uE)S?g}Լl"]~ǡR2 lٲEݺu#<oQv.ry睙,wv]͜9ӏaZM~n:u]olܢݟu~T!5`vhחLowv.YPu;8sqkrOd817]#        $AGh   ).`A+VH|MYd ڸlA%Ϧ@R^[?ZӱcHy睧.+/uᇫVZj׮^}ոdizkgնm[ٹtwGy:,3 6Վ.4h ]}6l>-[6U|hB{,cw<5kA,n=.M[Ν}裏N:;vڷo#f7xP5駟ﮮ]Fp>+L+ʕӳ>:ʷ5/u]#m̨[nIwg10 >,-D,~# or^(9n纅۹OA AˈdwcF^1`@@@@@@@@@(ͧ    Sdl}$ :0NJf 3{@Kzq3!Z kҤI.b5k=zh=UYL~.Huѽ.o߾YfdҥK#oU*U\y:c| xdj݇~؇lڴI_y:MVڴi믿^|{1Y_T{iذaz7Tz׵b N8As+VυJ*I>F-& v}K/ws{zg ѳ2w\wltWdЇ~W^yE9Y]tdgjժڲel] 8p'3fP>}\HiwMfu7O?}*T=ܣ +޽>~0K./`=3ꫯTrel5`Hi_Fŋ< 1pB|~SN9EW_} Xv=u-aXgy8DgV҈#xC_ԨQxxwq*XŎk?sccՑuKBiu:u^}UX^=?q޽{G˗{{'~'j_|AmvMwפOjʕƴlˮ<>3?΅{Ju 4e7v~L;G vbA]ϟѣG-׿oD_CkO8-[qخ6uyѢEuwkԮ.5k`ݺuV]ba ]s^#r+v ?թSLA|vc״_(6 2< 8co7| }'Yx?*6;cXaoV~/7N:V-g{_~Et?:NX{s~݂NwhA:zg3Έ)2 KrmٍxZ.t7?|A`ώ;̳裏}Rt,]R}cU8!        @PN=(  #kA ( @D} ΝȷSOAJAiS`|B/7c_e˖{St/E( @2 cS0s`v \ v߻@H5Ż-6B,_ˬ_m_.-ۮcpLK/rᄏqmm^reXϫWZnt_Og͚寧V duw]vкkL8-x~6]sX]qF0aBdZ.ط1<ljy%.P3p˹6Ŏ_Xr:+>Ď? \no<6U[?m.7u]8Xb<ȴLN~9ݯ3VPM1>= .;s{XOl;Xck \D,\!○,^A oZj6֭[pEEn b9p=!e+b,', z\dd!\[bŊpUV~0/Iełx:T`7yߘXYZt {9?A{֭['|/fN:Շ,EcY`%ѻҮ];JjL7-Tvvaloذa68s|=,02/%1-mYH+ 6dy m| pmamlZ HΏ? 6lz~v_zXvnek6- a2l†Òx ctșYmelc;pf7eʔpR<[8_~ɵMvp .W v3V_o~x~KsF"cVm[Dn,lkdn~ݯ3VAwyovߎ3VӦx S"old sߎd,n#v\~;G1*aW (A+Uo%f@@@@@@@@ ('l     P JuHcf~c3gJ *1 )  P4Kw-=mz|˖-~gpS6:TjՒ 5j( /ֱSLO<۟Y wyg}>6lqNv8ߞMC)H[?WXw5ycm-¬ij?~~RZF _Gq |̺n>1'sJzvG]-[3<Ν;g]ѳ u>4lPw_<2쏬 @Y+ji?Пv~[[Q 2Y6m_0jf-⼎F`_+y9mo&߻wmgWygoG.]\'zըQÇ<>v!?bn*h"ښuvX[ogtn/[,-Oj 7ܠO>$2///ƍڵkٸfłkÒ16\'g;ןz)=3>T5s~<#k{l^jڴ|MyQGz~ѵ.Df]? cLSo^'c"6l0-z g++WO۶]+;wϹc㵅YM4ݞ]f?1^a!K.Aoy wtI>Xb' $MbfW>`oca[\B9!z`p;,؊V {(cլY3{ҨQsyN97s2?c],|8 xNJxT5\Coul([qͷsy 1@Nc3ݗ1Ut($'2ME@@@@@@@ 2~qJ=/    7o?ihn7rL$~ @@~ -# XИ{̇?[nŇ%ڴ=XСC5%a/$CWg{pB{f,Ӯ];:mV{キZlClٞ+zfGV_mڴN;OP ç I[u[LkiuX`nۮA44.N>ZJ-\9ZZX>C뮺馛$ۏV}e?͏ޏA*U4|p}=rG5_'1- pl‚ꬍ+R;:_4Y]=vva~\6l.?䓺{lq9_o$jb e}%\=s9;}u}FX{Oݻw~ܮh%{׫W/_W͚5ey-llםx =&Jټy ЇgJn]4i"3$pXzXcE"h6ZJv\Z '{ܶe|vi6f̙3G/&Mucad/v>@ 3鱞+iS}za爍%16zx_?S * \hoB]Ȗ5Nitc֏wkZ=oEXbE<^(zxX ǡ.dۏ~i\^(ޱ"6Yx c#^辄]}`6g pv?۹m}s>#b؁'f f1{*a7 (*`%^U       @)ۢA i ^+@@^]:]c PPC&=PVȑ 'HK5j=G{l /fr75Vwޏ^^fIUi 0eԲ;upir[rۭTz6a͚53g4h ͷmt$%tUFbÆ qB2S['KvųFe^z%]|Ų~Zqa>1c\У\hv+P L G?[ FΝ;W݅so7˅ɅEeݷY^Xm۱h"};ܗY &3]vyޮ8&wqzBhBk8X3Ecs^;9.N.J.0U.pO[y"kuR.P+1Gwy\p P7s;+\Wvڇ9VyX{luȜnfޖߒ]P}Sn  ŵ/sj' &b _AN!eA.rls cO 3g;m۶WzunԷo_5j(?hxZۀٍƳ>\.{Govv"ӬqJml e zܹsXu_44vG+۵1bE/.Ww=\5泅% ߇-,,Ct=ȏƐyy1b|{e억wҥcPn ٳgQX⽖\S;cqc5zcBÒ0{Xb3VۦŬ [ (4h^UӟKb86mT'O=SW ̪v9;`Ur P.nVkvءhA        @vo&٩0 @@@E_[KGY%nr+ԍ ]epG9gz-mٲeLo^9DҩZ#qb0gAYCnX5m?>m]rڟO?]ݻw׋/ zͺLAO~>ߡy~ǎUziY Ҳ+‡5i>L˖ԛ샳+-*&tU7 *Ĝ_3-oεC,JAΝ[.pPkVdgj2xgjo^^S}z[n%֏wM8qzuUWꫯno5E\qx<,w5+αbƍUTZ5u-hoѽlժ.2P]uuIF\~Fы-ZRvp&rɯY>}3Y(ٱVvڲc Ĭn3|o4J.ыk ;%S+zhmm۶зo5V$q0^ۂ.W+ʻD:uzj?UV /֏7xC5r3a1lM̙_^oORXHT@ lڔ{"UAI5        g L     P:I'i} f M7N@H @jڵh"8y킔YW%0`kC{VXkJm%'`!;cUV\&3WXiUVnɴB@Ç_O<믿^\s=վ}{Ylq#USD 6n8;V|/_S2eM4ѝwsĻᆱC۪U+?No^vYB E֯_I&)+,0TRj۶v/4hPRci$PHnݦ45]ETpUBlZ|JIh       )!@dJF:   @r }tK.ǁR?,]+5mZR  P7 =ԿԷoF{Y[JغU:4 G HvQ\K> TԩSx5?jÆ jذڴid׸qc \仆 $u7>ĉmkٲeᒷ;v|PGuԩ=yLwZ%ا~ljzSutZh+ZnZjW9K!/֗_~ +lܰ_:uҭ꾫oHDJ !V|y߮u_ I*>dn*i4@@@@@@@RB Ȕ؍t@@@__.A# {ON&!p@aL}  @ /-}ԣGFdT\4~TvI-@ٲee˖tjB>`曵qF}Wn z*ڰKm8CԪU+|A}@A E6mڤ3fɓ'b>nݺ>GRS!- ҥ?S&Lcǎ^{q zzx@ ?{'Eyq{\ HG Ti ]h,Qcdž5v%Xb4P JQ@(iWs.yfw?53󞽙gW;khOV\)tM W_ 6ӟ(_+۷gDYi. ?;4A6om        [A7   Da9A]e͓Ҥ5C< %`/vj* 2dyyDzEPI-ċA8ҩ>ʂ:޽[̙3ooS=daWx898֭ӗhs u믕:u@#]>l߮];ٹsgSNyYF ,… -JƍeCUW]:t蠄ip짠j Νg}Y^ 78- ҮJ`-18Ws Es>s]{wAA uǎ7! X=ܤ@/ܲ        @L Ӈ!   =CHIwߕN=5z߯Jڇ Os7߬S˖--0cti~']sMRv駟i pׯ[ے%K_ʂ,0kĉ{r>4i" H _~Ps,`C {\lrKOOŋo۶]n]BhAs:PMylK 1bWo߮~M}VZWILLT6mr￿,tm۶~yՃ#Pf.Ej ;G5&[Lv߹' > )));vdFci3 7nxC XR@@@@@@@bM X;@@@(SG:i #uQZB#R5R  PowSBBۊaa"iHi0t >YTejԱcG?=:wYYY>o;YZV0M ֭[UVs{ܨQ#wJȭ)W\)V/g?Z[FFDZ+{?YСCu>m޼y|׷o_?m֭[,¹,>7nb~~E~ެY35mO}ݗ\y`k׮Bmn^ڇ?qu冷Y',8Ԧ={0Q P7{:k@^6lPpٹb֬Y>%Ag}!8W{$8?s;op Ģknc`a9#b˖-QFnpΝ5b/4h.uA&zĞAwLmXfY@@@@@@@@trv    .]wdTs` D!rt≒iL"WRĉ˘ @9,ˊ7U(¹8?~ɇY`?~z loG 6Tƍ]Dܹ-`H{\~}wMxdyvv6mڤQLid6c[wݽ璚i~ ǖ-[G ľ@wۻw;k+W憆 9s?Wl޼ym:3}^z^^u|;w+yp; ȼnݺ>B>\aaAX[jy1,`VvʌgQ,@d~iHNA@@@@@@@*]ۼ!   &pAR&ҤIfTԽ{i`]@@ <FI={J_`EOKn,lht0i;-E e`N,HA 6_hQnV;+01 z & &N:{-$--,.Zʷ=E ciǎ~ݥXZB9m2? k;= ~ Œ-t3׳N:ia|MWM6. XMXX#sE.h/_ٳg+v,7 :Oy-'sع68O犼爼/s0-` =^Op_޽OʖqA˲Q@o{_  3o]-r4 P3tV@ $7lূ,9\bEc[fj eL?Gs{=8w^}t>(hGl :Wzq%))ɟ+,79[xcrC4sy'`+MW\+(@>PD L@@@@@@@bL ;t@@@h>\:lG{o󥫮6g@@>xtuԩ-~w98:8/?w}}+zWִiS?B,$.,mK  V -<f< Lݻ?C# Z -q\PȜ-p< ;LDz[.ZV Q 6sEsDȚ\a2;?v(( ;jy煂tsD=b+ۖ1]2PZ"TYP[H>_q4 @@@@@@@b^ Ș?t@@@a4jTt=LH #L-  @n]8Pz]W* 'HgK/x` _*V6luU쎨r X`>rVU[KgUW_}l"Sm*< qs'V.D&$$Y8( @ \mv-`&W<i6       T@*o @@@@< -N<,K5jH:zS6@@B%0`4btjV(!ҌҔ)A4 oz@>l ii孉@ ,ix1}E T],#@8vj G[hEVj޼d        i #-J}    Pn !|gK=zHj   *͚%Zڟ22N>Y6M 8ݥW(pF |ĘҥRzR11.Pj.CO3vQ)Y;*;D@ 2]mrr\u9;k7i&@@@@@@@@@ H@@@uAd)A!%&b#VE@P+ݻ{ƗɋKOJ1"@D,vU.h:k\b*K @ eg$5  YYAFa[Bj:ZL[@@@@@@@@ #J@@@1f͒֯UPwfϖzʩ@@zҕWJ+mE). (5o.M3`T85tP%%%UKܹsX cg *ZA-MD@RR aψrkLc[Wq/[&i.@@@@@@@ (G@@@X#r~,3iRw%}ԫW%  U,pRjtUܐ GICH=zH'o*@T< S6Vk,D .%2+}B2 @hHNNqL7Eci3Ļ](Q irDAci"       ĬA1{h   !Ptĉџ_K;wJ={V^@FzAi𴫼-yMipiذqpZ孑@ ￿JDL #LQ!`L|CXFT,@˨$Q@ ͯ( @ '[{Vq_@@@@@@@ Ɲ"   @)>Z+S1E:1,lR/`A:@@@@@@@b[ >@@@8hi"iҘRD;ΝAF@@ :LW@ 9ShT/RԔAZJz@\ XdFF\v=:Md2       @L N!   {JIo{}D,0V9S:8(]D@P_Z:["Vy&'<먣${l? @}ܸq6oެM6):[nk駟s ~*X+ֱ0`nau֕F_޿u{lGZHd0Yd=eAe0)-r׮]%LuQ0ծ];zy؞~I 6 JcM]J}q?  P@Nyc2 @P Þ??MqN =6Ժ5        @ Y@@@J!0|\P4y4zt)6U]މ,n%;J@@%!t%ؠV qr*Jӟ*iXpukڵ|x(m?> 1-&*  -ܰQFj׮]n-UVnbhs, mn&̝;WM4Qfʲy1S ;vm۶bc \3ش`M _(y԰ayƍyr Ė@zzNb_*O 4c  P@jj[ | @eFH…978BAA@@@@@@@Jldֲ_@@@kLқog9}]c@@ >r=V3Gٳ\F9Gz%oƎ6")!  oVd,7mڴnՠAA <~>Ђ-0LVQIMMM%ZX/ @ 3[`M_~eno%ѥ)1 B27oO6-[#M K%V4B(A9$ LefV' P>w_=H` N*~?@@@@@@@(N x@@@B%`>wޙ|h8T ̜) Q;g  @9FG&iĪmqI H&ICVm{;eغu/_e˖iŊZrVZ' yhA_v4`hM6}l᎔ X(c:udA%-YYYZNzwkڴisMIIQ-\`+ٶiFm۶mR!;. eA Te /) @ XҮ]r7nM-FQ@@@@@@@A!>84 @@@~)`AW_-}\/_%~*=  @KÇK6V۷*% LHvT{n'?h>oц r+[kݺzN8YM͚5sA$у$=P\R1֬Y&zjFg|fR‚"Ծ}:F#(t1`Tq'';;N@))!cKj * %6]D       @ .#    x hF\ho'f%%cǎ~ޥKuU/nOW[#@| $&~{HMMq/gY!@hڶiA!=Jvl;4 @@@@@@@J ȸ:t@@@9RzMCu뤾}S " )p-С?I:쳥 ˰ P[lѼy4w\?ǯZ?oIf;[n=zѳ = K *@7oꛯl߾]K,ѢEr?X?x{ܶ@Hz衃:E&%I,SǩN*&%PZS b pz)Cy&MZnf %fb7        U-/@@@(J#KۗzO%MT   ;LiԈTYd%;vH+t%:/"1[jΜ95k>s}R٣}ׇ=ucƌQ.]t~?!P5kTw_r=?,u<ڵkRSS}0dϞ=էOM~Wǖ#vV:'AV#ի2E`l9.`,N -ڵ>Z       %@d|oz   @L (Z"t1ѥ2wbL F2W  @L / ,}dUV?^ZL4I:∊" -YDf̘ jٲ,sQ=|H^ e;8HHHP֭tQG:++̛7O_|fϞ{Njw3`?ñ\!x)G"@Ys$୬l@ _)K{5HHHPǎto߮O?N6MOVZeStntm `Ldx -A l9AvފV؎A t.#͛' Tz2}'m,u@@@@@@@(?G+    @ zUޔ*kJ H:TY1  5K}&MX&Y# ,_/KFdU㳆up}ժU+&O77tozá[539f5jH't^u&Whӥ+tTq AfgAg"I 55oYj5f̨ꖰ ,~+ex       U%@dUɳ_@@@(qI&Ʌ-`Ll:F@*]gOƏ7(StҖ-ҬYҨQe-S ۥY1͛Gsjҥ4tP%'''F  8 Z~W^]gy6m[|Ms( G  ݻ@ HI,d@ Z On,Փ }g        ]AF    G`HiVi< !Aqt* DD`x=VݽII~*uXz*>лKm۶駟C D%KnS^#)))>駟ڵkk…֭7x#y8d.vIWKii!kAHLi2AQwh0&YidG @f( i"&.u         s,h    ReKGKa n|ԯ_ t.  $ಹ_K7Tao.rtUҭJ/$թSIf7Q/`_Zj'xBoV=3LpիWw׉S4eW^:3ԵkW=1ldms@ TV._=l+;g H7J |WAFᢱ       ąAqq$   +pqқon ̙RBԧOak@@  k z-}W4I_ z!,oꩧuVZm2m{ի}8qg̘սsS(@bb.KA HII񋳲2 ze @T ח&OM#N⦻t@@@@@@@@ (8H4@@@  H9s _'_ Ȏzbw @8.]ѣo)z??/%լ3<∢U jtjܹ:]Ks P5k#裏BV+qcV4fegg6(@:utkٲe8p K.D;v4~@IDAT(}e!‚ 4jAchD@oA_^>9}ݡq>X~FX %%ٷ>33#{A@ ë憆a3{7P6m4eʔJU]C@@@@@@@@P @@@ZDCk#F /rQ  O7$͟/bpY_,7gKԺuz:hѢE: ̏ɺ򶩴vw9x뭷oG,,ЂH-daҤI.b|I-X o3cqi+ nݺ>>{ァk wR)-ªb# y7nԩSr۶mQR-o{LA 2W[#U,p9+n\9 Ma3,aŊ~^9*˒%97-R@@@@@@@@#A;@@@@#GJ^ͣnì,O4@@'K7,il^zA PF[੧rﭓŽ>Gi}7."C*iT%kY۷ƌS=lzH}Q:u4ak׮%8׊{$R ݻwٳծ];y~ZbQQ`HLiZqxA =R{.‚VeSK\-W .EHII&2$G#r ܽ*1!\z>ϯp;XXnM@@@@@@@V Ȫg     7OG#, i(h.MD@B)p…9aA|S:`i..餓W#P~c ;7`2 pN=Ԉ7ԩSgϞ2ZIEܹS]mRRNKKT'Hvf͚zt!hذa駟"Y}eAV(1#7ANbI2 FZIzIPk 233#<Dh`饗*/}$ZjU n78]@@@@@@@@*G]"   80Jo!5L.5h u62@@ :I"/xt ]wIg-=TF{@$1ciW^ы/M6]v-n˖-{G?yu-3fW_g}ڵkw=X9s/Gu}Q-ZHs8:J`ժU֭[RD7d[N[]pݻjI&}ݧ|P_} k+{Zhn$MfjU:Aʸf%$$6 (ۥ`5lP=^v\i۶m}fuzE|vޭ߿?m?wy =Ӫ^?{FK/H`~wNdڧOu(F׷~Rh^_YfkQO-LKzw4vX8]I ~bgy(m Z`p >i>p Xi%-Ewq.?'?ׂ!{=Vems}b]v,`ʔ).~ž[O:$rK37 qѝlٓO>2[B?x|buXhZG{L`@iiqF?P bC9 }@epy{y>dg oL4?M )q&Mԭ[7{( &[VTlg}Mc 1o|*թSDž',|(S'IdӡCoѢIkO,H[|M7¦JRi~>?pll-[;~,̴8GOKW[, t?៟{~Y+>SOa],B>kW\aZ!-8ʵ^=-҂æ/{10Ͱ ˰sGE(Pm^C-4m1x`{ꩧ|(bi]vE_}lb `낕) ,uxȊ{ꥅ jݺu~]-B5j䯁5;wo,Dɂma*o]}F;GpApߥH Cl|.hd4n*lddLRؘi})e˖ޜ!nOm>K3f*wVoqž2XFj׮5y@@@@@@@\ +כ!   @ X J^A;IӧuH={A4@2E}-E矗Ԧu%1-K;XcyKa%q<#c Ydeffj 7ܠٳg/Pzz :Z$}Erʂ3HV[!u*j*E8 ypM {RyRRnSPmqה`#j}됝:P`O>τ |`R?4܇<5wUWR#7[/ĞСroH_J0n .hd7n;fK2& d Z-Zp$++ۥ~2eF]d[wAK/$ǎߩS"/ԯ_?͛7Ozl٢:K|^U 7(oֵNxRӲ[.ԩ_`̊*%qQF\p.2]}3fLUfMY~Q۵v_,/nA$Wi_駟tw ,mҥRU;"@ lذ!<)V4iH\S,B%{1Ytw߭TW^m,AQckq,|)YfL(  S.Z^*=g(Tl5j)ɘV,˸0ľOiΝze7~@쒄g7f~E {BA@@@@@@@B%@dA@@@whSSKcip! aغU: s$˛iLK v x\^R $%%?zgK}EopEw'/T=Giƍz,Ҋ ُ+۶ms Id+B7?|nP]vvRmڐNĵk֋/z]Rl,xkʕbA[GݨWc~gZj+qeUz:AecK/7rڴi{<{l~^t xk]HPks=>B?|JY\)jLcc1+]wu͘1C\sM9 Đn %T߾}%3ي1,7Z5kLǹh?ydz}QGL; H7X@@@@@@@A8@@@" ~ݥ7ވ@e!bzCC@@ |3F2Ez-鮻_6%A?X@I;0o=XI6u,x݂tzՆ7~0e!O=:us=ׯ^X^z%~{>믿&͛m rIB 7oo,,km>P7yg!8OhKE΋3-#<9vXw>zKG֏?o}}c@ȅ w+111wyq/^W,JxW0yH n ~WZ~?6]r%>Cոq4hڶm޽{u-J޺Y#~}vtI],/^,l,4DB 8_wt.[pP&M ꫯ ג`n+^گo^S ZE{y3s; twg}t)'z^\ؘS^~e. /ԩ{7oM>݇=#. lҤ)@C,HK8M6)==]7A* |Gem,c_Y&Ν;x֭[mر&Lv_fM|W_i.N)Zqk{:uh̘1ޫ}:َb .>h?⚕wXo`3f/0ZP_ 2qΝek׮Aև'^ӳ>+ ?߿o{׮]Z`0/N }Е#ڱl, ?.j>1B]oN~c8~xu?-Z=b↑.2l0mݺk׮T,+g6a%@H香.4hlaٹ`%.]vd:^z_f; X®)l6αmmlwl4C~`׸ ˆl,rg۵ˊ]lS}[ؘwa-d'_N+] *G}(իd9rL_Ԙ)w% i w,El۸G}:cv keYٳ1\]⾺pc?3K!       #ǕHe˓|UV*@@,$7̋ܨ; B#ID\V`D3G.#Wi.,B*mFܝݏr ct,.EsGkݨ7 @A˖In`rarateKY@I,&[bIKZi۹s#[QÆ cD߹7 [4h:$33O^dlY5HcLVoKsC ˫V^U:ڥmhXpBIKqVOaZ\wLxݷ֦ 38?.X.e?q5jȅ4rB@-8¼R zHlyfnL$XTӦI*(YԚLF\ ^c+PmAKawqQ,JŕiztR?&1 (=6xW7{C(}-ݍ6lؠL\1ɖ-[wCy .ɘɶ-侷ȹ Pama9        PIUS   T?h!zAN. XQrԋ Ć3H]$'͚%uZ~i#utgHI^:u, ~༻wqUSzu߾ŤYVyԟHl*IYnFQWSN9ů׾}׷v*OfL;'Hk.n;ٽm?  zHz5iX{^NLy$ ,?ʮ3ٶy=sFq5d #       赏@@@@\ 1"כK?$sO6! Qؽ[w|LFI%JICJo!Y7~{@/`4H7t}Yt R)Sƿj-ɦ_~EժU K{,4seq9.L*UTYMx}޽{Ӵj*͙3G˖-ӄ "b땬^ZGָq܍*j4PX%%Z8i(J @@wԏ?ʕ $ШQ<"*e  } ٷ<^~V͞=[ׯ'`7>ѣGP7sX @@@@@@@".@dɩ@@@-Ы4fv\0EkL.WCK;F>jA@I`4_hCҧJݺ|ՓFnQ*RbKL|iW_}UO?x5h:쳣 6z^Pex*Yڵk'cuwީ]v?~v-f͚y_Kᦑ_W_};O^ E8OPLN6(!@~ %zn==}z饗ND@p_iX4&YT){mڴ)NZK㪬       D\pkB@@@@ ]X؊4eJ+`~+ծ-թJ @q?IB}{iѢ@k`[o@,ի֛ڸq zFւ ^I.K(NRmۦ;wzvPɄ@  1bfϞ~M׼yt}C.}?0WKM6… 5sLSi?IIR~"X%$oKSKaj@l "P4dB +R[nR%3 &tW^:rD2w&@@@@@@@@ =B{@@@@ ŊI^ g͒ 3   Fয়|I.<rJhWtȑRjjhʤأG/@ nM:Um۶uak tzoNJ+*\dɰGC~NCanƯDHTTڼy,E-6ON6&8Cw:G4@ \ 'jŁWbiP۷V#2(.VB@@@@@@@ apC@@@%͜)Y]wAӘ@@ ~,'ϖW-}yDZFzЗMU{GsѺu?Q ,PnTJSGֲe8tf̘G/:-^Əm۶S/%-o˽WqL @H FzHI) @LHo;p_qjժFm)`c[WmL        @ s!   @(.L*TH Ei-!2{@@ V;Oz)i(髯:uӲnF$&<”z@ڵPiӦi^\ժU(5kL5j5\W^y.QKgB ۷O]bŊҥ>S]|^(?ӧʔ)c$_6w"Ee@țytcOr6l&Mŋ筲ݦ}       Ē@Xj mA@@@B%Pԩ4et*5:|di2:S+  m4ii`iSi\yG&Mߖn1Q~ ꪫٖ-_ k֭С9}:3TZ5<"@i 0?ٳpBzy]wsΪRJϷb?#Pݺ `X@&m++yg^"[jݰϺKr Hdr9         @89"   @zTg $@ @(hkHH|#=裾PH84h p4r/\HHJdhIm۽7W\YfyIO0]ڷoBu)mڴQZ #Gl2-X@ӏ?=qiK>7`s=W+W.`B$խ+/K@{N˄ x-}i>$\էO-Z ̼r Ȳe}a9        @8!   @z[6M-bՆ" @@$&iIguE^GM |o5"UQFoܻwΝ~_uZJidv٪U+p67o\*UZ0Ks_n~g-Yě-^  ;kJJӧKKÇKŋG}կ4rtRi"p"rjn`ڳg,o9s4~xfWFj֬7n&MϧUB<ƪ}rJ-_ܛWX=.]4gf͚^c.]t}m۶|Ѣ7`kRԮ]k @awNMd^ [T)פ]}Dž ҰaԧO-ZȻGy~bn qux@@@@@@@W8DKz@@@@ "zI+F&& ?r./ݞ  pRKgy%nG &LBdJB |˗ZҴ%.^Xl2-\PvVX1խ[W 4Hׯ-*T#aM6i͚5޼j*%Tdol0 /0s=W P-J*}` ۷~"@$,2555R  vo;GBzݻZn#Fhĉ $@       Q 2T    ås3wm/߂ ]v }ٔ ĒuҭJ_ t4DhaFK#GJ]'Yp (`yu]ݻwԅm۶iʕ^؞W~u+Vmo{]bkZG{ns5g7F>I ٳG6lk\:K%5;ϙ6s=zPÆ ;@*U*ֺ/o֭r;tbLD(K YKʅgH;.j@@!rtmG >\*Y2-ɹƍk|RZPa @rԺukoԧC_~E6lHj*}w^0]2mn~irJ-\rق#+T1zԻ}alܹS;v2o߾]6[1H">O m/pizꩧz\_j$'K8@ %55R   ' "ORNR&ǺdcaÆ+… @@@ȳA-@"կ"V[Qv@@X /],Y9qRVҤIUWEJ ŋz|zh]iF:-;(ڣ?̳Zj^;ZgaKbK$tDl>FpY &[M@@!M*]w4{Iz?|iF#JKJL        @L ߕ,1H@@@@ :u >PXniYdǎ]̈́  EG _5o.#{@ x.QN:Vi*} )ܱc7ڵ+=0s[ǂ -Pr޼ Z.n>< DpD++|Yء&m.VXi6'z],,X1l9>r:>>|8?ZdbZXfٲLpf͚53jC6fg2daÂ_zYϑm! 1*ྊoncߝⱆw ÇW\ xYvA|-ݦ,G@@@@@@@*'ՅՀ@@@@ XeISWҟwC@#̼g>K+@@@{Hw%u(ժ%-^,sO@#ܹsno77_l׮.Y52    "Qu @APԂs N|!ݻK۷۶CM۶m5bĈc yPT) °@@@@@@@bB Ș 4@@@-`]HSДoAdL  @< |Ԭ{oH.խ=v$'Z&LɓM-wիG {ODK   }aN.Q[ɚ?<"P,@@@@@@@@bB Ș 4@@@"!`|t`$j[3fH; F@!aԻtK˖I7G̑"P:dHI vZ,˼@ oII4[9ld'P5 a9  YZ5OK߳gO~1bD xIT) 3@@@@@@@bJ Ș4@@@)அѾ}ԩ%eE<[wIJ@@H X/K͛پJz JH"ruu u&=D& R҄ Rb4yPU? եeC_6%"&`AX  +Ь駒L#G|[6LSL-WgVN@@@@@@@@ D@@@@ 4VK\@IDAT*o/w1Lh W)nR᪃r@@P ,\({?Iw--Z$ubV6-6G/))ҠAJV~K',5l{E ,H @@ xΒ>٧t O׈#/Y @@@@@@@@X 2A@@@ %}jTAv(L  @, X8N?$=Td,:tmK |ЕII YG8a(M,%$d^W Z$AЖIi @F;f\s@@`?_:UNiFS4o޼`(pXMfń       ĚoL    @[ڼY3'v:$8 '+ٱf~iviVߍ{~Eڵ+>H@@H ߼A:F܍{h޼ynJW7x&@@@@@@@@  %yh   DRW rv")B]  @KFI͛K+WJ_ hV-m>*}4gN~)C ))ҠA^ n--Y":)2 [' 3/ p/$(!*%)#//I'JUJST/da;@@ M3M}ws=TJ{=舂ƐcoviS        q #NN    m \`_Av(-z;F@'0sԶ4]G +0}Ԫ4a(M,YXDO 9Yj zS3Oo;oA  @ժһ֗_Jksի:siڵ@@@@@@@S o@@@(ЫwҶmy,(O*:[PB@8P{/VjNzA;eˤ>}?,M3@ @J4hԵod O}x@4 F(лTx=+ZT3y@@ x݀wn~)2ۚv#1^?        ~    Kn|q.7 _} B)T(P4 h#ޒ YdZ1͛% 5EJ>N,`KO?}x,0}/q)1Q#2>F@@@@@@@ Y2}D@@@,vJSdy+* F袨TO  P,tG}GJsB!7Ii i$|%] ~[Z:ESq/"  oJZD/EWmA n%{?_k@@PXnc784;ե}Wڽ;5voeKl!       @ sz   K i| /h Q`,Vt}KCHw--]*]yeƵx[뮓ԑy&[>W{OYoqD'K xش Ai7-`7R%kwϺ%  y4zct Rժ%zcƍ}X<ZC@@@@@@@@cA   0=|aԩRRݺn # @~HN.\:z4sҤ;5ŋ#ҥ3ë - | _r=[ RRA]WԩSYt0!@L $%eO0!(RN_رܹgO!Dx _bE[n^]VMzECrew{Li)5zTFHᮋ@@@@@@@@-E@@@|% u4eJeA]v@_hZAT믥(;}O?\H0J`tU+i]_W}4 P5 Z/DJÇvtu^ @@ *IIo-maOKwtN{wB-(}=Ҙ1ׯfC25kFd+ډ       @Aಾ+   dKHYVӂݻ$2L @=u$ X9t}'zr+P?!mݚۭYA]֭%K;ǫJ*.<0!@ $%IK liĹ@vRÆ:Qt^ @@ -ZHw)ʕҎҴiСR:i?tᅾv>״% |-oks^: ȟdԅ       ,P4UX@@@ȿCwI;FvLZԥKtV@ȟJ/W_.=ڼmIO>)3nzķҀ'&JX'MobŊwi=\ 99s@[>.C( عc*[*Y2J Z@@*U:wWXP#W˗K_~)_/Ml*RDQC:4n]^= &^fnFв^@@@@@@@ cfW@@@@fRFҔ) :UjVR%ԉ Q`H7}a'_ 'i]x{vJZ!]4̈́@~HI#)+%$zK]fn}@HJo:GG@ f,(zP_s.fEC@@r!PdyeQifiݺcjHkJ| ܷϷ]R&RӦRRKje-7Kڵl6mS|pc穩:R?_[]v媛 .B ).UubTxqc%Kzs%2=rIݕ^[9M#=hֵ\ϒu ۳]Xk׶iCdV-Ni(饗aV[#ӧKJvI;eƍs9G͛7ϸ ҭ`h\R=XY2m<8βT1V*#{w_[GX\?:~ec,ec+ke|nm|qee1! NƩfMl?,nFb|kLķvr'I:I\;UnhO?I_{ο        @ԏ   Q[zyiRY6_e|@@}޽[;wf{goYG{w^of[XI0$C Oؘ1tGk 1(`2cH^i3Kʔ)rʩlٲ攔6]QEle5h9:t(QLapH;׻70!C1c|cJ g&O_~9BW_k14q.col8+1?sµq)Xx)fؘqyݺӴ}KL?(3Sf|a@n4Ʋ1W役B Y+VJ*y0! ,Pdg^)AK? }r習Cv.uRyNT4oAx       DF 8S    İ9HUJSD>rTc!h ضmn۷oׯ.)G #(A,@#cx?helaJڣ@D-;VH hOnC^6m*9s8*\x QCV4/w|JtiXRreURErJjժfGÔ; W_, 0}4`\(Wo,o߾W`)Č@R) LhVJ6v1֖-[+k mlvd68β6uceSeoecWh\wΝxL qq*xf68Ʋ׶/&oj`?Ʋ@+wXh @@'ྲVNܭܽ.>XHrXK.5m;6       S pR6   ą]ܣ/l-B"[/! `A"6lЦM2͛7o^-x$c?@ha!5kTV2^d XLbL,LwBM,?HG5k҃>wWh$$$x3?תUKϙ|.cS wKŋ#@ |$ "#)+wȾ?\sPZ ,,թ ħ/ڸq7c. }q[HaJyݺuevnX܂-1\a6\9ԥf.nD`>6zPΌc@c-cټ|r}ws{hzWe|1q_ڞ@@` si~XZwS7ސ^zIMbL/`67n޽{wc.۾رcGvoq?"p4'   Iݻ3:tNz%Z`R3,R@@@@@@@A>@@@IR/>0rAS]+'L عs~g-[L+V+Wz$6  ӫW>lwukcj2B*`a8ve[EZXZzj/hg{ۖ(QB 6TF Iiڴ7oJ*e[~,1xrҵrKi\v~wgokС'Z@ \8O)q.]˗Wls[ x1u{c{΄@*T 5kmU[kڵY߻t#;S $9,cYm3! (pҬY$+WgY Yg         iWrũ@@@bVW/鮻L7ӂ t_5 Ķ޽{hѢm޲ep {{=C,|޿|g[giiiڼyƓ=Z0g}ѣGi?VbZR֭ղeK+W.KZꪫg!2 m ,`c!C1c=c^hIdD7tSY1(~olMB$9<.\P6XVRjjxiyxgy r /VIfDVlٲG={(٥c LomR}oѢ7Ʋq֩H! 1)`au,=o|{;,1ԩ4eJ%͟?;?=ŃhѢ^أs,PX7Vɒ%CR? =nbӯ}V%K_ֆ U+WBڶ6β1V&M~xH^# @Sd7tYd2"G)Q1        J ,   HZ5쳥)S9gwtE'j!Ļo.U~w={jӦM^h]FԶm[\Nx2G ,Z^=oK3ձn:-Zț͛7|SÆ U-XCluY:3UlLGw} HSWp))Ґ!Ҙ1RϞر'w1ի5ݥI~UZ u$_4zSh9 l|cYWZ ֭[h]s,(UTQǎ9cwDŋ{c, V5k;7L2XSO͸9@@ \ve|qג7/tQo* @@@@@@@@.@d    YW/$wM^(_}TԸq(K,@h lٲE|7Ϝ9 M@ ztC\g6mD5.Nԏ@(,@/0|A۷K?$=H{K '#b }GߪXb^ !tA a@K\6YЏ?iӦ믿!-Ȥcǎ^k=y;1 4xtʕRFa"Bk@i.)1Q/rXswe 4`m%daXjm)hkqԪU+uu w.U&)>3{k۪U񕍳{1vm޸Wv oS  *TBn|n8r߀|@@@@@@@@@ f lh    %=.<_vI"MW %#R`^ASܤI?^ڵӧ~ꅔ|z衇tghJxB >bYg3mmg>^bǀPN}HK?R) RRA|%KBi7 jDip;$Ai (0ݝRꢋ.Rjt=PBz饗e-X@/z/,0?t4w[oUo6n荥, r޼y֭y[3! \)S[o:t, 3!       Q 2T   (У|bExZgwT\xʧT@X.EjӦ+YxArr Z/^hICS! @TJ(}mqg>v hٲwLcC^/t< _rAGy-^`tuki)1Q=*5l*( ,q%3f6nܨ_~YguV `}u7xNJ#Gv1bv   w wd9ujXP@@@@@@@@ ( bb%@@@(h={JfI;v}&U.ir) @>s/oוW^kj߾ʖ o` ++d cIn;Ə햬@0:hԵԪ䲸ԯ_۝sq/OfsA( $%*w9}LL`ݺuwN?p駟4m4/Xb!@ TVM=VZ)S^z5j:?:I/@@ fE~&weuȝ{Lh       @ N    @n]Y Br"yضm^}Uu]?| a ~֭/"\͛  ݻ֮]G}T*Uyc;y}駃k޼y>P.вX<8Y~Sbb暐|fΜK.DG+a;رo߾cKS*-H/(!R҄ rAid)!!Nvq-[C޴4U_~ym @re˞|/|]~2՝D)))nV^cJm۶ݻl2 >\eʔTԓVwYW v@KjZσ,< X|ڵkWXlnAyLA;c;رĎ)vlcL}I݂^~$l(%-Y"xg߾}zw5p,e:y,]τDD,̦&M;? ?i;CK/T;ڵkG^* ^]v馛 ) i@ry9lA ^x~3Pf͚[մi̛~֯_̪QYǎ%vLccXԠts6 R疘(M,%$d~yt/5c+ssXN+WzA… p{S~ ̟6n|(W +Y\Žp] c-c:,7?Te%[ 4 O>ڴi۷Fw8YŊӌ31[N$ֳc@Μ9SnƸ3ݿ=nsh. @~C>T@@@@@@@d=E;@@@@ gEB%۷N9%4Q  p"kt|nNTv8ޫSN8RYpq ~L1)?ȢEfY5в`>>GVСC5m4ek^ow%>}^!F1Ŏ-vcsx@НwS'i kWU+i_oٳd:Vs\ˏTbE({׾}tȑ{;hE]$ 裏TRxlM,!}q11Q,Tdɒ}֫W/]r%- sYgt|~=D0t//p.=Ewʔ~;{B@@@@@@@@ ^^ =    @֕Z]r@y/@={|M-[Lk.ڿks6mڤn ,˸mg-[@B ^@mk!g_5zh-^XÇs=GXbtgh̙^JO< ;꫽J[o% ۼׯ_^{MUlYvizӛm6oU\9?= }߿_7t?fqF>o<Y_T׬YݻkȐ!^5>to]=,Mv?g lUz)%$$xωEn3h֬Yϐs"\Gmz /(11Q_~}Qn[?8`u͝;W&M>C]v|rr- _}1aY?4ko/5 δF >⋺K\^j* 6ٸ{RTĶ xǜ$1D5Qǎ_"ut5y. GHw{"i 7^~X'|2S{+w:iRgmo:t[}xfBvbI׿PO>;8qb>;W*D 5Uڶjݺu_cf>/X0V'QgBu`X;wq+ԡCwWm չDg+Xַ@ ' t5w}7ϩ-6fW1}7b68lLl./l""7ļF0&*&1- _Ѹ"j&h\PAAE7EAAY;3tOj9>ﶰ?^1Ʋ>[ 9x`@ƍUIwk[YnĈYZyyqkz4a5l09ys{NXמW6%/5ϫ~8 $Pܿ/=K:T=uE@@@@@@@2!3m¦f lfB@(;=}e_fB,7 ƽ8@ -.Z.zS/Ο_(xc}&Y 8qb6{,p! 9]xƍ׹`Μ9{:t)կ~Ԯ];pA{{wo1ׯG \GСC`Ν\˰z#pa}xp]wer ܗʷvaAfff .]mnᆬmpI߅=uz̅.P24iRB]8e6qX'ͺٛb0zhl\اoO \7رc'0@9w.=Ve˖־NW:͜9>lX{=:r `\.#p~x0rOWSK. ;8_t9p5owԫWϗ̮'6-=ٵ[n.N7ߎb9;)'5ǮL2ǁ{Ƴ5ۤG3g6Hx ra Z "VM~-E\Pmt|= +_a9.:p!<[\(AזޏJad.sYfꆯl۠J* /h.-[n`u~I' 1΅Fڵ \Z`}Zj=ȾLJ?s]1p`ž~m[{Z?%g(^z_g_7Ɗ5΍9kLSO)R*tˍ~Xb=mA=#{OyzNgl vʹ UH ׼>q &eO>9mx@@@@@@@(.78KJB@E d9#yA&.74sO? @IDAT4.ˈ)IbiM 9 йܯ6mr-ܒY`_߿_C,Ek/ud^_|oo-/z\y*j+u<`O0!kaÆe-1"3fLwyo߸qu,Pyʯa6} ,$& x焅=Z8M79x'}sm,,2,L 2s.9X°JHںEn={Na qN )##ßB&vXj,օxuLi-ʶI ر6 +ٮwiͳk]{2n]k<[M: Z`o.*Ix i{rEb]+ޒ[_$|~zXM|=-Aق{_al^@ Z35jk|G/9Ax-X rodީ0X?RuvˍXb= HQpC=49p^Ր,7A @v NL        @ w @@@@ c4^~9 \=c4hTB; ݻBٲm?֗+W.}ӹsg/xؖmZnuar!r_Һ]ڴi#q!o3vV ȑ#_7X]mzꩧBo>p&`4@e[hѢ\\pܗϵyf=~~ASLѿ]ve~5jPxlНnͨ^oM׮]smɒ%ͅsGz4i$ jժ~cǎY8p,V﹈X.AM6%\(_ Om^Xs]xnwυ㏳%baԩu waY;6*Sxmprj֬ { g -l`嫯i˖wc4̔Ǝۀ.F*yTZ5mܸQ_|DHkeXܮ񾷄כ}_nU 鿓 ӯ\ȵL",o߾~,e؇&6$jN]߲?zu-X$%nݺ69pnx0@H1z.飏RT@@@@@@@R^} @@@@ 7 9Tiڴܶe͛'7-C r 7=}<ܨbŊ~1 +[bt\pyٲep)1^{6<-,ѦG}q:uV~/[anSF]v~?>lM7ݔUEc>ԻwoY@bhv>U֭[mۦʕ+n9oСC5X3 E9Dz@-.?F?V\9_qb!ֺpe˖>$G"'{=òsm}D,I1,‚Xn6?ϋ/U?ωva 뀖gٸokSK3s.]䂑%c('K!YX߱A\+vSnz+>(BqfXa%7Awn}xJzM`*@uױ5֗OcЄۈ[Y/~ }:3gt=Ʋ;0y:e?B[1}&Xeye9MnYofrg,h~X:dzɊZ߮79)c\f ?O/s"Q}ܮk0l@K}~,Em@@@@@@@@ Y1-D@@@" ~;r!U+7\. R %og[ݴiSaÆU^>sp=zB yK\J|RV 4{(ʱJs_ v]rzꩬyڵJ<f=X5wpե_Jz/!nT 3S;V8PUZT5t1kO3&2"\+ p xoG ~GdZ}g_z}؃z?.j_頃Rlm _1x}KC׫WO6V[ddiW9<=Ʋs=W3fRkǔ<2ssPNn:Y&[86H; k׮x}H?e-qa$U+sf&^J'" ~Fd\Pl         2   eQ``BW :qyԬYg/@ 25-\;meu 7 ,ûyZ@Z5nXgqfΜ&O=3K-^/'صƮ9v)t啑$Ϲ,HضO˽oImP^ZxYge/ϵ2 Cnٲn=bVt)My'yX^w իW+|}Lj/^ek;t?޽{qW\q6nHևkyu\=C O>d?vl1dcYc]CbmcM&Yg}k S~}1۳ǘ9βYO&MdG2N>ugܠAJժUs'yNIܮZ6r @2 XFڒ%\K       eM ȲvFi   $\fM_?iڴrH@  FN3\lޯ o_`& CꫯcݱK/T5݅Ͼ?%N4I_~.~7kC=ԇ0aa蒕_|`g}uXa^>}d ƍtom۷?ps1N!cƌGpG [ۣ={vWY(M4aIxz|m_XMсk֬lo﹈X΋z|駾=V 5kV~z믿˛7os]:om㜯X#sBJ{1}gO/`'xB;v+&eWMK.ćs9df *pX( ya;iלN.[=پX~رR׮ҥҨQ:UVͿN"957}񾷄גX}gXB(-O8ժUK#G u[H<}Y@ ,#ܺmJ[/[k:$~$jvmG}O?X|Bxe!zj k*?1Ѧgy}z^ 2e$L̵n        Pܗo65kvN`3  @x9:hi-A n`\s{q0!@Z {ozh[fYy/}%/`}0! _ \bPjࢋ. \QB,FU={]v۷h"ptA۶mիӟm2º֎ײe/*Uk.u+2p!Y\H\ЩSd_ \XErr.1;vlp)5a \ZsA v * 6lPƳKl_?͛{7ԫW//fO>àUV l[n T~vf|q7s\{ =upQJ\|oW}|A|r-AuV^<#P:{?7]0?zJW Q~ׁUV.^+;|Zda]PEХK_=y䑠gϞ'.?^B\ IB-qm{Nqsnh;+goA;e9 *v-k][Sɽl];7R 9{AݺAقz˿ g_$r޼yq]{zo/a>ie g \uxߺg?۵cרޏs+e+;$ ,Y_ɯa'g^ 4m4pT؇u?lxsĈѣCmojku}"}g'j??qϛykcXy\}РA{s7k_sls>cXc,+?87Z>~O^+4٘ZCihq^ϓ~9џcgߴQٖ qs{NǵۢfU:$b9NDY @l       ]cgB|s )B@@J_s]7/qo5@.E.Iw}NQbH!ի6mٳCIeTre ˻sk9b_uǺ[Ņ=ʅ&T S 8 rbAŽBd}o>c\P\aC.\PϺۂۅVȅmhcedds܊u ux =]ve,k 8<%|9)"  gwamJ6ב=yYn]_N;MӧO \-ʅt{u$.P.ҟkgiD0eff;󩧞_5*LQOUKzlSFHK'JÇK&=.F-s~נʂ-9^hW>7~l_xxMk\w[k]\?4%s6뮻t뭷ꤓNۗzwޭC9D.d}>W9۸415ƹ.P2=9g=D$xbr+ȹIyV<^l~O}z8OSsYJ12%:uЀOъRw Ҁ u Puv< @"^}Ur6Mdɔ       {5k@@@@\:uM+X˃ҠA@F[~ޒd!u"sayuٶ}xڰu֬`}m}~ׁ}s.Sdzp*lda3n;ݸ{լY3?ѐ!CVk:KZRj.aRP ̝+#m&M,o,9na6w Z){Kc`l­,.G^z˖-ׯ/ soz;vUVD>lնscAJ9x`iӦ9wv?) RZ _?P=~iu/[$r>\.Wr9.p2%SVdfʅH'Jv'M\FqRO>2]-HS%%:vE r)ۂg1 K|MRD^+ ꩧt=zNc#Fd 2_F,fܸq袋tI ׿'|R}ꪫԯ_b@pnTvKX`\ihivQJ        @AoŖ  @Z F#@d>@<@pNj@:^~…o/KKPo-6mڤɓ'~5b?n:, I9zM2\4G-o۶-۱-"Y+U;y ^څcM |0_I6l羉zfͤo6QRNi dfJK'JÇK&I.Ø (q=#?v񗿔9` >X4cG˗/QX%]qn ĕ28ݯ'8W^QʕuK&ҏ>o>XK֛!$`?hɺj z@@@@@@@@(A]-L@@@@*VN9E˪ж6,m @ ,w.]O>Dԣ>6m#͚5KfR Zc\ D[&2d^׽ny{/^_ 챒 451c,)Εt~Z.hX:>ȐڶM6Pз>mذA_gYXFғO>oDD uMؒr'L/.uNRujժƍDdRR)@(M> /)@@@@@@@& @@@@`G H0On}v-AH5Ν;[oU^~eM6M{,aq PϞ=U҃@ dŅ jΜ9={ϟ{Nѣu駫}ކ+HSHSա̔Ə&N&M" زEھ RT!,;͘1Ïƍm۶k׮'x/aJX`Yc,kY諍l|uM7Ip  P`!C3*       Ho@@@@ \f^]:5\669&mx@ 5,෿psu kɺUZ5[}-שS'5K(C0{G };wSN4h,tYfR#IdR*"\h$pͽMhԨvc#@X22"ŷiSpȑ#~}~e㬉.I<Ȭ1n:G?c-X~mhA?acVZO(@(&֯6-P,        i   @^=c-4\Φ )'`q~6m[o7|S\*߮m۶.K={TnTFk/F UvءO>D .￯>@.|ҥ/6$J0@.I:$,rU IFAC`*R%E@ ZB ~dcnAwֻロ5z'e}= 1V8CM4.eHXc, ܳg5kV7tNO ?E! @ .*W̑.@@@@@@@@ LMc@@@@ *=lt58e ʝ}~z[@Yp{ァ;C6latٽ{wuQڵ:wxHIM]C`ڵZd/^EHV\j7n샄.b} JҽJgrSΕFo&OF}[AJCe#U+1!rΐ6YҥKY/&L;찬1C.%0!@۶mc,gY~vڥի1,\kU޽}d܅!  U},|A        A)|:   aҍ7J}$}u1C.K:c  @z X܀|ƍG~~G_кZj#%:uRǎܲeK-&pYF˗/e|0}*W j% }3Gv5jTfJ2;%9˔ĉҤIr$(UBXJrL@`jA6_z饾 ;wau6Ʋ̙3u=hϞ=XPHcB&Hg-le+?[γԭ[׿+ҏ,\}̈́ qˢ2H       .@d*   &нԤ+ ONtS 5co=@ X]%˗/!&gg_DZPI֭UQjѢwn[e˖jРAqRof]V_~ ?[ T6mSN9Eƍ &SN)}!ү~%M$]TrՅ#$ 8Q>/ yI]E*@*V-*Q6Zl³@>D˦˫Yf~u+1YL$;X6 Xvk-[jH4o܇vUg}:t_'&lR@H&57ߔFLQ@@@@@@@(Kt6i    acI.lt ,K:ֱ @a,O>~.>au9G\RCsPff#U Y懸8 uL,pI&:|IN, P@{Nn޼Y_֯_upBIl޽{wV 1=3|Ў?Z=_-)eIҳJ?yǸWsJcH۶I'KF|8" PP޳ '#P6,pK.~٢oև[x^8[o`dTGYՂ1V8KEؾ}{cʏnݚujժ1ձ .쾍$@@p]+u&.A       F ¨   AREʌCxMڵi @\. |)VZ*U9Fji@k֬D,pҷsάUPAZXIƍe6[@d[x_E{d*퓅|㒯-1z޸qlްa`  G{rZlI,4ze0 t:,A}[ 3S?^8Q>\4I><$@FF&m&K#`c{}Pol!nmec+ -[dۯvYpհaC2 lE@_62}gK[˛6m6ƲVty1=@@'ವ}dJ$@@@@@@@@ =@@@@ .5OOc 6B@ _ᅬ?ΞmҧJK=zH.}Է\^΢SN~HxA&.sp AiARAʕ+C=ԫWO6[X֭[WvRNl}7b,х]vi\ynݺՇX装l˶Osok,BOt" #-ĞL#0nԧO Ed0ѣ^ҨQ%{|U`ժHËZ#^r ȯ:kۘkҥ>Ђ-X2z UlcUxX5kcX.~{{7`cp9[~sv!Cdc5iďL  %&`>\@t!%vX       i$@dl   [o*TR ҽ&8 >{0Jo?@:p@.B:$i„H(t9ϲ,‚J6o0,0ւN>u)abD +UV֭p }Pb(y֥UTɺ {ɷ֖-qΝ1;v~F7 q oszy4c.* oP RJ[|0,S)/M( .M$SrH @\޷5C%DAP'mڴs.֭ld6βU* },lf9'*zenXݯDllX᭍R9xA6gcٺLٳ9z\lcp|eO,1ڏ&o^ǻN|8pevN@@S>Gi"㒳 @@@@@@@R[ >@@@JQ`PkwߕObu$š@RHB?H5+8\\pH$g (FY_&Mo-YaZbaMrlh!hLRre iV6z(+po!'VN`-fk~ m} l}[nmncgjX uͦMf ޴0ĖS9%M:7N/7NN[ΕFI'KFN=8* UmQe @alQn]?w)bl+Smذ1,0L61H8yk6zecu+S𾍹lX9op1 9Ʋha9VafڵYÄ  Pvj\> ȲsVi        %@drj   )$СԺ+ iӤB %.rk9smۤF"< lٲīZ`8XԂ-!mÀe[s9 g CDGaڕ[Xd0% G CS~\JZJ\jUZ80!pҵJ?,|3%r4~4q4|4iRz]\ǣ\@$22, g@qX(͛7/r6n YcUrs|eT8+ S*筍-f> ^* m*zS* Y6_bB@@ 7ݥ?Q#       E͏@@@@ ^}UiHHL|@~+͞-z$rZV-_H۠AґG؉Y|Xzu?gd4p6H09H14GK۷K'KFA((USN)sHH*0,K{C:Ү G@@` 7A@@@@@@@!P>P    *}sҞ=gBHo{?뮓z;, gKo-m"tU@#Px.\KeرR׮ҥ@HU맮['i- PZV.-M  eAਣ"WZC@@@@@@@@ *&[    JHUH=&%5lJ XD9Szu7]OnIZu4AMΒD=ΕFo&O5Q#ҁR۶S'jXo  @r tAȕ+N @@@@@@@RW|V#   /Pԯ_j P2[H> 06"KkK/Y#X!=t@Y(ر~_L,v.%2#K6S'jX8   :HI˖%g       @Ԯ>G@@@J_S'iLiذү 5@(}ދ\횿pTұJ]& "}td]ԀR@Z?q_`\ii6id c He lPQ#[A@ XžNS  0dV       (ྦʄ    P;#{}QJa_@d+GL__:HHQGI/ m"t1l .cJ>+}m81̔n@KiRB #K) VIm&s Aڴzu䖿  $@ǎҲeV+       eA Ȳpi   z4cFV#Q`^ih!]}{tҊ_H&I#FHj$@`(ZHpmK"΍\~:;uԨQZ4F"@ ddHmڤ9Gh2 A&ݩB  AZ@@@@@@@@ A&ޔ@@@@ ,Da2iWӨ4(#_} O;,^=i@饗A3[ӥqHi) HHei oLf4vlZߵtdAL @Z%m. **I͛KA  @ ~xү@@@@@@@[ |@@@(/(խ+K68@ Ε~{KE ꫥ{?9<|׿JKU|iKlkAdd+\޷vOK'KSJ G/ڴIvZH ֭ L!@IDAT3E-@@hJڼYڹ3=O@@@@@@@@*_є   } 9Ti reiL췛"$7ҫJӧG۷K:HCF#1'uE,ˮi w"Ym:OĉҤI@#kF#ڶMgڎ*@d  `qX82@@@@@@@@DE@@@@زE?_JzuoHAit d,M |}4oU6L4&@_/zҼyRrU YmNsJGG &OFJW ڍH<@ ,rΜduB@@@j2`?@$@@@@@@@HAԤ,@@@H+% 2$SNn]:p@*_>(h, P;wJfElhK*/ $ըQդ @BfϖOzHs߾HAݿ_ڶ-L23#åIFRT(6 ][WA @,Bu?k?  @2 Ԫ%U&mؐL.        Pe,@@@(_j֌~Pw>@ݻTA@/M&R$rgOKaä=rҊ"@ X"DnsiXkSsݮ]Rժy}\i̘HҨQyoϣ @Z%i. jGB Wl @@dٸ1jE}@@@@@@@@ ʧz?    P6k?#ͥ3~Z @b/&Lz6Z*>~ɂ!_&2&pmo.j^l ].ر.]K -ZHW mtm=FdWHR?@@th8P~ڍ       #@dR*   q7ސviM`?Xd93S;V8PUZT5*@~ijmֱ۟$@AvV  @(Pw=n@@@@@@@@TLL1   (_A"f͒>Y [`&BvN'+vtR˖c- v}KwKdٱ#T7gt͒i8fMixivid Cn@X6H;wˆu <dIԇ   -`?Ƴxq@@@@@@@@ /z   {I_-ySGK9X ] #C_N4JTIzaɂ!-¾=@ @nҴiRr9~QpTsnמ=رR׮ҥ@⹥ PﶩM-@d +f @@mH        ( @@@(SDt!C=cE]`bin]ӤN< cԑf,jq @ @?_o-%.>4|`A$,THy~a_Zzuig4zt( jԶ- @r "-_v  )`}U j@@@@@@@S ԥl@@@(sSH J{*TN:Izܷ@ XX׼yWHMJ' t҇JWKtqʚAA;z}{2*:|ty?=,4ڊ@226mp@[_lI+V$w=  @z X}}&Ʉ       $Jb @@@@ ,3%br^WK?(Uז<? /H7J]HIGm @* ڵK|nݪ~ϧEh&zg꫋\Ge}1+VK @ t@d AڴgTZd        @Q, #   @]+}?d ٹS?_0 H \۞{.aC$ˤsϕ:vLPO@ ,q넮Yw͛7[[<1\jbj ]0L͚6++ vX%,t0(r޽Y˶&>;vwy:uA:-7kL-Zs˖-}G馛wiJ$ \8P#psHG-[ۥ6mұRM NMZS_@@t(2ؤCi#       AJ    PKȵjتԮkm_h! |) \^:W?vTKS@ҹVX˗gͫV۶m˪M-m޼Q.%Bf͚QW. ܴCJ! Hkv:ݛǏ?]}kQFPyn֭ z {_S FƶmF wl38  @3cB@@@@@@@%M$    @2E6L\9 g+@ >Dzig5k1c"Gl> @r ݻWK,'kZl6n+^u2۴iCF IlѢE|衇 *!V *v~n֬Yu;p .׮]oW^C0g\~x߅WRӦ먣vG#Թsww l1@`-t[  ;˅K0D@H;L        @L8)"   @Y[魷"h䓥%۷~xb;@t22": tdjJ922wZu @* X`}>qϞ=R8uͅ:tP֭}b* u-_7n޽{gQ9L__C?ɓ'[oU?]_sz?^{jժ ,`{ӻ^&@ (*A&ɢ          E Ȅ    RJСvH¬Yǿ["%-~쳑ȅ sϕwJ6HM/Bg֜9s4o<[΅TTWk^zzC m=O-ZruC=zkѢE>Ls{z't-Ȃ%vtܯ_?!qZ%m .3]IKH睗u  !㏑v`B@@@@@@@%%I9    PL jԈjI+A% /HO>)X&%utrZ ے ARQ`Ϟ=>W_Ռ3rJr!.@8T߾}իW/U^=4uޠ,p5|zu=B SNiC"EY #C.d7h;@ҧZ/  @Y - @@@@@@@HA@@@(r3҃cߏ=@ػW.,KRȅeItRqTDʎΝ;/e;vPn4b 2D}Q \'I&:slo| k. 7ܠVZ3X8gr劽^HFUsMƚQ'@ @.?1"  PZwT猥U       eQ ȲxVi   $Teӆ/xyʕRvߟ=@Dn$g-[}>[];G @ 8p >>r0`~j޼ym|A ?+{Q-4rHPǎSUT(+֦MR6E/@YZZ^q@@[ x@@@@@@@ .P໰    ^SH' կ_v%ը!Fe@(_~)rK$9sFI\BdQ|ʾ_o!Cպutwkƍ>/'2 ʕS޽5a-[L/օ^?{woոq[F 4 ͡9DE)!#Sq[(2eҥHHs RI|ֲNg {<:kﵞ >Y>l[oܦ Q.r?գ|LJn]e{jZL@@ )        @V    Q'p'gnjKZISdxB2"{R6RժK\"-X -]*/hĞ… ս{wUTI/:tIZgM73{a3.IGqAȿhڴiyҐO9/ӶXBWֺuam߾]a3dV`*)_!UdCr^(\X@@HI`X@@@@@@@Ȝ@\(@@@@ 6&Ov|)w~Cl1K)#G3ȱc% A#];)wsTDy4`M4IM4[o.]QH#zϓ' Jn-7ovaСCN3R%s.Uʔ)ㅀ+WN*T%+tիOLh6!/r]T` ڵ%K{@@~ ,^<@@@@@@@->["   @,TiS?8!&ToVni"Q@I7ߔ=,+u.XuLMs0 SVR~x!ӧOW֭c &kyjԨQzǵ}vCݺuӡCk.o>#lhĉ߼zfwǫf͚[7n-]z!ve1_Os7.F%PAi@@ gYozC@@@@@@@ V3<@@@@ .E&HgD˖N%2 w@ XiRrWK={J\CAH4d;T7ewyo/P`A~B>#sϩsΩ^?˗{… okϞ=*ZZj]S۷駟j{DC`J Õ6@ =>~@@ l*,C@@@@@@@'7}ը   Ğ}# 4a J*@d^N]4~n䓄@&F@ N 6Ԉ#e@@+VK[С Y]v8yB ^nM>̙;voFF[ ~w_@ V"2XtƍҖ-Y0!  I͛ҥ3y0!       ) @@@@c*U‚ Bڿۢ ;^6Փ&N.ğ ҥJqqa,@xWskSr)t7B(*UJ/&OSza˖-L|zpqiӦM^[[3<; @ _UNh&3^(:Y@@2(`!ed #       i4؍   )//u5oVڻW3'kڣ^onA*_^NSӥ+.y33@ '>xz駟ZdKA y.}Ū\5kiӦ%q.sB 7;ڼyZhviҥo @VWATEDlY䓥 d@ @@ [z*]:@@@@@@@@, 2Ai@@@C`li&KOJRjԩY @t --5j$5i"Y䣏J6Ho-n-]sf6 @N u]zwϫ<9J*充vqtASL9(P@]vus4ydjذ~a( @ Z7fEP@Hp/ǘ@@(,\(SB@@@@@@@\ 2W@@@U`8NӲnmd]{/wR>I'Iw!ծ-}doM:ȟ#3@A`ذa5jƹy_~y8 )-Z|P 4РAK zsZ:,/h0R/y|W^W_Ν;kɒ%Wֶo\СC5x`]vemЮ:s ʺu7LWq4if͚;k}>5dωΝ;k{֑#G{W/t|In={zFAcYFO?nY_=EʁS/ҁfp-,0qذaY_smZگ_?DI',Z@KZ?u7n6w)Zre/BH-1#e5T 4i⅛>Zrԩf;83"`A=ʌ'  @ ؗYIm)?@@@@@@@@ A0#   @ +# s-UJ: ?-k[5g EREzUr\V\Ύ, 6Op=cC"[O>eGx_Vee˖ymXP^ѢE3^$hW]usd˗׽ޫ'|R{>@LC,mҤtT DoK>+-Y"}[~ d=5D[ɷm۶.ۥ|gc3gF^qܹ}Q/Һ;]*TիzJڵӝwޙY`A4k,xڶPO>9ž,̙3b 5iD=Xȹs駟jԨթ_WƾuV3 ke˗/w;i޼D|Ǐ-<װaCO%J`7}^?믿^=z*n֦Mmڴkc[ԸqL9nI=,`sVk߂&-OqG ^ziĈ>|?Ttl'N6խ[7Ѯڵk{?#UXQ>`BQwyzw:vصeq7~: o޼yz嗽kKڿ˽c ;I^`AY+(IcΉe˖^uc> T*9r[=&# m#ۡϪsk/{۷x 5m3}ֽk?{rK@?pw صkǞWKxs#}ǎknu۲J;SN#KBS{u"\8f,͚"@4 AFeN  @ Eag        G?Σdl    @ ̟/#r=-]*=*䮀=s\t]rT~`eٸL,攻w@ fϞ /0ۧm!gy`ʽ6 H6mZhᅘ^@m{2=> >ʕ+{mX"Zbj}Y= |oxjNP,sQN駟za[n6l7K.D}B /R/oݺu^PCvAkz> p tn޽tkС^?v ˋ-RϞ=7x6O+h&t7̻QF*;ޙ>Z}Pi*JѢEl?8kz7˗/lʕRz 'xg}^xAi׵ժU KkĂ#-oÆ ^vmYx?\˖-矟U -0ZRe„ 2elKgW|j m&p7Rg!VCRj3n?sskmZ=,,֞;-q^bɒ%nӟUܵkF=YplJYkkQժUkBn-BFyem^ӵkW;Vv\J۽1Jիę.DAQwJ  *E4       @\!   9*0vFd2Ύt}5njR.m"@n̙#=ᇒ+n%*O@86n腄儈 ;36{z7%رCVrǖnm p@ K/ Û^Zc~Pl>Ӽ`>9^v,Բcǎj߾h,,x⊋ԩS1؜Աsz6U4]Yx?B j޼ƺ&M-;ނ$;8/H( Wڳ[nΉPeG5j׿м}Z(ߋ/Y^J=.wcӦM… nVp?o|NjAdA|_~ׯyd۱muvmkҲo;-$7AvߖϻV Jr^@&-I ݟ> ɴ9Z_6j…^DÇ3 ] :qjCJju~{~PCyvy{1_ }g5}t91YV,Ҟ`Wgr2) @D {?nR"=  "e<       a+@d؞ ,  S/]qEMD A O9˞®&MC^]&@ tI6 +TN9唿ɪ tR/\)-t~Ҿ}x/ך5kۺukBbŊ.--,҂,ъ\׬Y/2ؽ{ع}vo[(gX h366.˵~8p@ H7qZx%c ?;Z,ЊǠX QU(aиbIKh[v]ڵK:tHvαcbŊ)Vkw)?^~eu LrvXȑ#[]wDs Jk|{\UVR-Gbs6lXBffuV۠];w:`oǏH'Ox齖ڶm4kΙnd&4̍d\.;W'F( t/]tY5t  EWKW^Eb*        6yf$ @@ ,'/B@XϗC]K+iۦ4}z)2R5X4g4w!0B 1*=O ey4/_lRj}-[VO#oe˼E]Z- v BG/^ ^b[ؠTR2KobJftjI'Ur=2}-JF Q`_|1QCsD`?,3 6B-1i,w6j% f$Ҏmdd=׽@8pׯ.]:#Zw5c =MiTI4tPrI<*Ury'8A~zϭg6Ay! .=?q/vnjL [7]dIu:,eR@Zu(  䊀m$kS         Af(! Q&W>A}=ʸ @ Fw"[K?`${{uJ*T/K%jz=鬳'B*-ZxkY^4ϻ>Ӵituש@v.ou]ׯzꕨ^f)R @ȤN) BLtTزe,XgvqR2~(tZRƒo^ gO[. F^{Isz͚܍~)[cǎ֭[F׬Y;Ƃ,Coݭ]vf 6̅UӾ}~vinyXcA7oVNpM?>Qvgۖ҆uSOMiwZ38 <&=, .#<=f͚V?ĉs/4-tꫯvŒӿ׆:ܻ+{Q+haV޷?]hAGzƍ>-@5LJV5@hP.<<|@@[ƶ.D@@@@@@@h @@ g>LA@ ,d{qyDr9.1#g Q.bқoJ%KaN.K'gz @C;v~:8BC:e,JN> ;5͕ݻw':v޽?duVZczJZc@\<AsO?KO?qOO,K/hѢ.֭1뤷]ndؿfo}ո lmΟ flޮR\"Їp~շ޽-qc5}뚼;5at]xa;/:o\u5k~|ze_;fF/_^:u\xq}\X p{u7{nv̙^3zJ#F/b$[GmAePGuBi}ڼywm6m۾6bWݓN:ɻR_A`ޘ1ctz .P: >|,[ a͟?_e˖U&M@8{o %ĿL DnСC5n8/s^_'N0 5km[n[kNwNbsJӼwl٧BJyw풻l|o^"YzB& }ci?I/\/֢EUJ]; 4Ly~X25My]l۶kL26@X ;-t[n=zw}c~^~AӵŬ=-vԨQ^ e=N{,~ N=?X0ճjYlc,rڵg݋q,\J)m-dv*h)CX]W{"|̚y" Ar{o2"Ɓ       $7&\@@^}F+Q  ,{~[Æ93Ks/zA ̜)L%$J˗K7Hd$@ (6i$=s:"E.o <>l3/+"!z{wYޒ%K~y})e_|W1B7p@YPd3cAw6&KϞ=վ}{/$-k\tWǂڶmm[l\˖-e]xo֎9)Sxoku @IDATO,ofs~3gN/W_}UjRz`Y;Gߧdiؤ1.mtͭ԰a^Sw  Si?iǎ..[7-4uYV-Ҿ}ҡCRg{{\`\qH^;ǽ\@p) \o15o.w;-賸 ƏϯÇPʁϲ|Jz BOSժr!һCrayUԸq.Gw}sC5\eOw--jV]~H]Zܵkh~lBɔx:V;i3[sqZRk'龤c|뭷tUWy{myAbVZy`jw o袋-Zvtn[`=u] H?xĽ%ڹV?-Ҟ-skzGtwx66+}ȑ^.޽{{iI{b˭uA)gD˔vKy~L@@ 콵SO Á1$@@@@@@@ PfoX3X,] ?ovu@AoH-J=h'G׮\pa&) [K|uy]:혺uk{A-=,|BW-x1ťs(rnCgזZ=>SzK `{ϓ-.{BwiCrMJp\Ǽ>7!,`f输}Pu؃       dV .r  @l1ddžDvsdr6s$=;cԭ[ 3?[,.H y3CȘ?[N;w;C/O{^WFZn'?Rzci b@TuM7wՄ իW}?f͚ySf9s-^X |e.)13/P@B mpvI5*R(. HOpܙ7}үuK8n仲|p?U>-[oApd~dJ;?Yĩvw5B c9!C[+WݔK.2h$ ,_]*/M  k=\   9-bԩSNJ        +:@@R Lو= /r!4R97E3ϔO'2 . \PQzEQu =nXP!]qK @@@@@@@ 2G@] l'@\;5Ҧ䲈a\QOĚ)ҿ%cGW3Έ5 `gy*ծ][C M7ݤy,۷ϻ'OrAvK{kWTjUV#G9Z?RYt4jaS  ִ0o_ʕ+{%RR})Q!pspt8w_}Rq׋X}{wEJb']m9Y.2FEU$  M ȅtK_Md4W ~y>RƇ       *@d9ƍ A9M7 &{iI7f̐wX ?e1颋o 3O@ի z!wy^z%=: *s?pz) (  䔀A֨S       ĢAx֙3  Af #ҺuWސ[&N̽hߖՓ>Lh)sB j.-kܸq7oiaM4Q߾}եKY %6oެ#GjڳgO܎XR|:Kʕ /jժ*SL:9/p,Aia ,[m-˖mCZ /C #-2m'TM Lʕ~ӬJ@ ,r(i^p>F@@ 8CF@@@@@@@ks(  ; ߟ;+ ){AqOjm[OAA l&=3'AW^)ɓ69@ v,3pB=ѣy 7W^^_hDL-qƌz饗x?:hܹ㏽ݛ`SE86mjv"yJhKFD#Um½B?ᐡA"ta.Eٻw)Rǎ;zG R,A}o>͜9S'NG}5k(_|G -۷omH"`%ɮTﺇl9 i!AHdڂ-!%YXd4s\Y+f@vҗ_X{  !zd_ ХM@@@@@@@ $X# $+P dy؈ fIKW^8N =&H#$qtRDYa @t|8p ?\o[oUmڴe]K.D*T G,,q޼y5n8-_\+VTճgO)δPB eĈZj imY@YuХPܹ3v؁pCrx?,2 "Cכ7K˖ ܱ#qB~C&oeKɒR<{iKիH =-[JfO  @ VJ*o'UY#        2t Ć@l̗Y"Ď1RR͚?-  #@ r~A.idkW.r?#Eyꢋ.={$ g^SOl޼ ,9nv o݋ թS'+:묳\`[۪Uo[ݫ3fO?G}M6E@ ;Иi)-矒˙M(g H[+/…+WJ fk4䪀A>t^S@@6 tE F@@@@@@@D$  @ K;@(Cq#V)SB,򫯤mbH 8rDz {%s 7HyP @t)bA0M!OѣG롇R\\իM3Zjyc阧c-ZH7|Zk֬qz VZx_z^zzR@e*oLtC!]"۶0 e?LbѢCK`mv2r!GݵZ۸D@: '_ Bd] ްax        @ }! Y*'r d\  -+#U3:djUil 0p;[?G8 @l Tq/.op)ŶX/҅}ڿ{, Z6j$~Rս cw֏?-ݧ{}^]ti5nX={ghc(PTԁGC"-҂"mmˆ …Gos5 /[<$@U|dۂHKLABsQ3*$@@T w1,@@@@@@@ԜJ& d}h e@p;?^4(gM-0UĒ stiҨQҚ5Ҿ}~8Don_9>ݿoB"m`අT}[+ek= ?^;K5j8@@ zog+       '@d2  5P(@h3F /^1+͟/uVx [Hw!t҈xIBeˤ>}3޽CR(QBM4񖤳5.B!eÆ ڴi/޽;^dѢEeCں`Kvɗ/ d 5uҺGHY 42ZXoZ! n?\.Xv--uJ t@ > yMn@@HQয়${7@@@@@@@@ [V^G@C>i@"]t ϙhAcTd-HI7 &(]. 9#0vԷOK7,͛=}[Hc%eKje`/_lZg!O{@! sn@]`RLu`AJGHyd B >X[p?7  @}Hۤ)SPʔ 7g͒,4'\KRnRs:^ƅү֘cCQ_aiiW_mV,bEjb[^>d'&KA@@ +=K/i @@@@@@@H^ ]؊  "@d7@"V?Iѣw ͛K6eˤZw صK.W=gJȊi@سGz'5/>;wƒ\a[O=VdK_/͜)=TH &`XzO޼'Kr 1,(an^ZZ\8Q7~ 'R_IKEu#A!  7Uҩd       *g   H 3  | Y@N;9s ߳ȲB`|{w?tXsh6@=mۤ'˽$…R mq_0ͱU+y6k+qX(b$, O-+VyD;߅J oN:G#@mV@@2'|B;@@@@@@@@e2u@@bS w͹3k@ذA>}4n\!q[ɓA{x; @8' *=t~q˖0`A-Z?\T(C#BuČ y &Հ ~Wr5kLWdB&-fMV~ϟ߯OO |Ai21dT  &`c /4OƋ        {@@@ѢΝP  cHŊIۇ,r?R|ԥte9@H;-[GS q;rDKiT % ۼzi3ƏOꫥ8?=WU*W~ٿ}gKh]ᅲN[m_vcdat^NҰXl{) mJ/:?7foo   y90S        >@A@@ u Sa/ @x ؇˗ڴ q mF 6m:w/Ǝ.76MP!2b=ȉ$?nݤ .]oJ:$_ @X ҁgd/Y"-]C{ _VU]~?OY3 M`(v-BZ@H7?pd,{2"eӂ 66^6h ͜Zm!)`WMy?{CB-^sL(m*-X 'C~T9vgs0@@ ,X1"q@@@@@@@"Q H Ϟ@@ȗOiΨ2Es}>^&M|3gFyl XK/I7cet #qtKU,8cL* J>?^v4y4oԨpaq"@ 9ᅬ;w;z bA !ACzui&W_BZx8lk5kq@@ X:z@@@@@@@@L߈5@@@bҎP  }&+M IIgyd#H6!]}u@D!gZӥ>5cjlL"zd-㵴n \YjR5*^%7ĒSJ9DZ(Om}m,^۴i#=d׻.]?xcpaix1D@APN@@@@@@@8Aa  @AIA1cebӦҜ9YEd /HJCJW\ I@2(0m/ n~Q: V[{)SF+[+Y*Y !AT-uAr/r{ߗ.PZU2Dڹ3$c +uDd??  U{_U\Vka{@@@@@@@@ p bM@@ @ضM0A'jg-rСT3 /@ᇥo {4 @C2_}ywb顇2TMԮl.ڴ!rI>*}diZVjTUE )?>7<8X X H.\){St}Ҏi@t&O bT  71۷Kq3d        @d DAѰ# +/0=5,01C<@ v, 5oM(tR9MۺujKwyI5AAQIBn.w݋qT,=n4p4lT3iZnΝ% @@2*ao 3*         Ƕ  @ $$H;vр* @ -u*.CHxھq̞4;dK:ICfKh@f͒,[k-4V2ESG*Q"憖U.͜)u rTUqc¥Ç7MX )"ujtwK J D * +{~  @2}u%@@@@@@@@p5D;  -P=z +V]x 6ƚ+Ԩ4gt51&F}I^(pے=/) D-`#EZ"ԩR۶m3Z+P@z ys_p#g`@ -h޽I>id~ۿ˅56:tPҭ?>ڴ9r nT*u#elʙ3r޻J6o޼ʓ'Oҭϗ/Mۼ ;yڭMV%z,r`˥Z\=E sΑ^{-5Y@@6o=.] :{N2HoSB[~ 4INOilrT?LB7mذA7n},7oBn LhTͳ@b /1\aGu8Z rg6X(CZ@?鿵`O/_B-[֛,3.'pB؂99G0sϕڶ]#p9:lixz(t@@ A@@@@@@@@K<@@pߟu_Δd@ a=Z[Wj ͆B 9s 96 $ 9"]vtc% *`ק#}.gk"q @'JyS_up4nxjbm rl`!k֬I֭[{-bI Ɋ7Zm]fJ.- K>(P ٖ܍t@?ϟ?[C)`6ըQ#ܹS6lH 硅~k׺u?vS ,BVVMɧի{c=pԩ/ quE 8CʑC8}#  !`A쐧M@@@@@@@[ @X]wzO" @ƏvzWmiSiIk+2t=ҝwJ Ư#G {w}ҰaRRǎ;잹sm[W7OWjNz_i1*pZl/__~{loڂ-jժ^x^̝OVBB{ڵkٯݻw{ fZʛfΜzKpj%KX@yI'yj-R\H\@/r4\XcGwMO Ϙ@@ g(        @XEXi @^%}}经;z GK.8ÓA(t 9FF9H%JH9}' 'pd}K.+*x)1/-u,D㏥nfϖ^zIʟ۱h8xh"?zʕ+u!Ycʕ0&MdO"pK%͛ B@@ {0!       ^    cb !}4~˱1F5#/xS[yG`|7ߖ NԂ @F\f̐Nzaɂp}oSR] p .NKH~(Uػw{-X@ݛl28p@sի>}v^]5\*i3P- zSʷ_̲c姟~KUK_WPHSOUFTfM/H5e]ti髯֭sϕFʗ/zIH_ s_5@@        dA١N  @ w{ ) Dرr҅FTڙi ȠRY 7zL Ahkע]Ε O: 6I!itG~0>[7OU.K!f@ < f͚MsL ;|J7 ;3uwnݺ^h]޼y9ZA J_jmJ^vh^twQ>|ڥPBqּys'd'@@ZҹʅJgC'h, X&̙@@ S*Z4@@@@@@@@ Bw@@Hp֭C o*͘!w_쏼Y3iȑCb_Z`sPD +R~r!eUWI>*(L)rc-Y`%4 IcJO>)udaگ*,@,l΂+M4ɽWN:jժ.RlRժU JC ʕKhS߾}o}>}7 4H7nT)k\:tPǎթS'U\9=|g-=/A>e.D ;.P^ǭ[gGh@@ Z h_@@@@@@@X 2&cA@B,`A[G@ .+_DoTڹSZ\U+H@.oB| J+  Aؽ[zAg3%{^ Ƚ\Ji!79rAݳԢr{Al@`8q>SvǎWڷo[oUm۶UbU@ yQ&M[n^rMxmG)_ '|ԩ/x_3"2m~6oڶM{_reits.]G ~Ԉ_{=Ǻ\ry_ oG %.],:u;_- }w^޽N8XHx~-hQiXiiȐfq#`AV%͐(  @&Agbc6A@@@@@@@ e6E@ %  @x5Q#}/>nʩ7;;]DZT06JS q%24`\h\/4W2P`A۷/TAkFJx xCzinݤݻZMk;Tbb ν^UVմi\*=SjӦ O )RDzrac]f 6L֭S-t)hĈO-wkXzA% -MH+J-=  !KEdv&       -B{3z@@ Ci @[`.} YP:r$Zl L(뼖-c{@ {>P][zEii<ТK;|W[PgS]s`X7,M$Y(gҊQiK]RU^]sua=j֬YDN!@xT=zO>sC=*sΐu^=^s*F 9rHݻKZ*C@1 cl2@@@@@@@H (Yt@n2e|AOe}@ 쟋./ \_f+cG)'@8ϖ.P:4ir馛\aAVݛbpUJ]h8ٹ{>rԤdXv飆 9`M< }˓'Oհĉ@G{}NRÆ UIh5J$=L 3̘SĀ  @ :)"       @|;@(VC@,!iV4@^_tJ~}I{ 3vQu  'ToҔ)oHeGqFnZ\sw{>DyԷoLlYYcהk˖-͛K/sѐ!C2]O7pۻM@iӤoy9Ceپ}3"g01;=:䓵{n-YDoիCΡ_^Ç΋>h8zhtcŋKm^whpBw}^A2]vij޼tbݺucG#Fo z5˞H6^-Ok;#@ӦR*ر:  (po3       d@l@@Koz [kJ'K^[ d4 Hk}?YVS:e @S3g$ʲ,mڤUƖ 7ӧ{Zvge֞5kVHB2ՙ,l4u'OWdXȢl۶ͽ֞kϞ=~{a-^X < K`SrcRrluN;;=v,`Ԏe˖qXN:iСzFq(C}n};/f$t &hǎRns_,ye-`avIf,lqK^Qӧ{x@ѽ ͣ .@K.E]3<6>kwKJI>'-[vG P=w tmC@7 o#g        Af}@@ ʔuvӦ(4]E97}ټsZ@> b\r`eVA@ Usϕ;OjBZ\V)w46 z['$$xڵs'kᙪ|JL(fh v.&#AءCp5knQۍ\ؿޕ3gty?J;ys_Wv?۸֌;X8^=6W^-[*o޼^ةQ"KT&K.:e@+W]ujժIj2rMyζS wsW\q@f;v=3f&۽y饗2*H])9Ž@7Z:ogaO?-daԁ'u[vG P \R;7-X@@ AQc<"Ɗ       @ D7bv700@@ :J컮 )`A{KyA <#kH' Y@ 8 $& _ P9_aF h $WbEŊuu/eTZի#EtEUP!mܸ1 0@'O>**#Ag7+EWr4o\؟Ԥ;?uq5]vcǎ.T}*^x*d hiȂS=vNm^x|@JH"2o^p UTq?~a!Kf4c }曃 .8CW-Om!Fեq2" ċd7 ⅆq"       @Az@@_=/UJڴ)z@@[}w]"]zit#+ -[uBR" _ @&LnAZP8A{UPA}w߭W^yE?pҀϟ_ VΝK/i˽mlEIE~ڶo6lؐ4Yf7t/:,[naV?w+,ق'w%/$7[yf=eXVz۾zgsiɒ%jx~Go .ӝwީ˛׺uk~^`mca]T9~x3F\܋#FhΜ9~\ ->#o>̲=k+!!!iy8T$M&]sQz鮻_[ɟ;i;sNm{{-q.4pv''L~zwcUVMw=oC'ر@ܹs:{cB,`8쬝Cj/PBsίwmi{cZxqXU mֻy;XrʕZta_ԢE ︶z;u9vNY؟?0A;uNyk\&Pֳ먝K.ro4{]>39}zr y={7ڵk{AڵJ*:"֎;  Hq{ / pN '[6C r*;dtkG@eÇ}gby @@@@@@@"L}-  @e}Y?Y@` ո/謧H餓7: oPd dDe(G$䂻/6 ggAZ?,?|.p%b!efBq8;m4oYժU*AcA"-*/rÆ _/X_~{^s ͚5S҂,'/uђ%K G]b_M>[okP.[nſOƌegA=z5\kaeVƍ{r#fq@gbg!s˚5kNy^_lޅ<=Z̫J۷B/ϋuWJ&S;i; ߰u6 . k̙3r  ۵P= {ʒ]BZkm= 0H;WTk֨Q o?&wJ@ O<ϟYX ^y;vNm^&8=bAv5jz.wٱcw :&'ۗɋ]دfS|o]+Ji!vP`;:迶cǎ^f9hz?~)?)Noyy@f5{7l  F>        a+@@ a Q%Ҟ=R>Qt2p mUr,q7l A v~X8PZX)iu^_(k3-_`@;[ /_~Ѻu뒆su } m 6L˗'V:_mZև7} ;vʕ+睗uiƻ?lY[8i\mS0ʃ>~M?Uk_ FQY#papw) .'!L@F%ϕ#Plƺ  %kM@@@@@@@ cfW2@@ <eJ6-ZA@ QgKv-Bd?? p.K: 䓥eˤy~ZXW H[k7|+V@(\r\bA\7nL2uß9ivX o{}i޼y޴pBM[f[Vm[cb!`;wvz|^h>X;XGN8A/N:$}&˗/WѢEg\߿ 2c3O>\XOj,屓־Kڀ;YhРn:iҤ, z.LW/ MgeǎmBO> m֪U˛R7YfmY֭[Yv?Oo/ mև%?ʭY@߬Y3_Mn[BنbKɎb> vW¢]3!|mۤ _75ƶ˹J7=hF         !8_!o@@]}oW@*v嗇وm̂ 7l 9bwC@ [.K][Z@r9}CRXZA}\K…/GFGЋӥÇ LLLRJyO6^/_{\6Yzb ,ݝ;wV޽{ "hq 'svjR)Imyf/^\ޥY*RB xXЬ 6x+{r|뿵uw٩-o ƭZs={U~=ܣŋm?[-Z۵kذas/-$m|Pwq,|rРA:|8ydo[ς&S+ jժy/0BoBdݺuӢEy}RgW7t7[oSɒ%_xif㳾5J˗O;Ԩ! Ԕ FO/iڴ0}G+U\¿,^z6FnawwzǼ/޽{u)xǢk׷o_oqNd!gazydǎA;Ww[ ` ;_]B駟V\{Mw`Bo; %4 ;M0y#AyHyή]vl]+75Zzxmyn<bho ,],ԮǏWKVrdXkXw|z-{нhz7uN:$zٻXd;jFGV0$]{͛ŽkCB $$ȅ0Ko- k          @r/o8NXWѺuS!  D*TMZ!"#G0NO==,.p%ҲexH> ԑVJ>Ypwsk).+6nJtL/"S7DL*'\P\T@h f[Vƍ3ڨoBBƤJ~…5tP ںu,Y֩>?lⅲ(QeͰ+Vz^HZz\nm*U*ilYdS,pַ0H \Pɜ9s_.mbz-}a}sGKgFy SС|IհTl.Wey=x7o ,mO<8!ڵKEMMI p'Xǽ_;oZ?,0Kj2o9{/s矪_Ql_cׁŋ{_[ /=p,t25'$ fҏ> 3ÇPv%sصjեھg,d(D˯uAǾVľҧضMryk}S"?}@How       -ׅb{2:@@ e}Qڸ1US! 4d1~)B(YFܻ  l$$-ur]o)kpi틔d[?,BkR$&&zmti%v1ɃY lРA:k8e۹]a !VpY0 KXp[ZR[?Y艅/ r3#%vKի GuUnݼbB yxB=\7岔Sev+VɓUud*TȻ}IӺsw袋.JkqǶsN:,XsݻK5jH\ 5i"}d2S&M۷gfӣ)Q:tp<GKv3f  ;Sպuk]ڵP֭[Z~ Ԗv]tQZ^-B}6׸qt @L-Xv1X.j7]W W_}U/٣oQrK6.T)sP-[>g֬Y:.d[7wvբL.}JFI+Y)  /;!         @#;a  (WNڸ1- @ )v!+irehQi"/֧K@@9SnA,6駟j%!|:ӂXc課l.ۧO=ul7&LpBx7t5"͝+Y(5[uԩ:3\m6:D @:uxڵzO={tU}լYH'NԭW_/?2eyֱ0L"˗`Ⱦ4S.j7+OO>ћo)ߵksCRuPq,rh֬.ĸzz+wؑaw^]mN?=B,@d@@@@@@@@@8 2Nw{ڏV-rh)}D@p >,4`T;pB#0eTTVhRR~`7ߔ9~t~M_~Wdi X[nݼ, q{9YYg ?~D<Mhҥ0a7M6M 矯qƹŎʓ'OfvY^kɅن9@ K\z뭾X Yc\`> @@@@@@@@@@0Gs  1 (ma +p4zteRN>Hs?կOd8,@@ ̑6nYJ駟Aikb< \u4y4{ԼbE[.vOGy}J *UJW_}&M?CCՑ#G9f-[6pVO>ю;~ xXr^}UG0u+ /QFyi+Gq鉂@D S8Aa         dV(ʱ  I71CG ҦM Ȑ7 XΝڵQ< AضMZE H' ZT4}Զmt.d@˖ҼyR/<+U.5QFׯ߱+0'/.Ho6oެYf{Zpw[dIwoz曲9 dsgU=իA( ҪU|r 2DڵSܹAϞҺu̙؈U #q*?uP6E@@@@@@@@@)t@ ܺU/)ox5D}}]Ukn]_-*Uc@\x}RZ"O`B? }U M*(u ~{1tP,X9}eb^\ԴiSo8pCNuO)SxAwVRԤISOBbSQ!ϟ9sxvn>p*y6mt}z[|ʑ#Gw:=/UK7Nb ,pR`~@IDATo#`?d?^rQ@@@@@@@@@@ 4J*B@G 17֍ʕg܌@ <6I}&zxڋV|ŋsΉw@Ȭw 7H.[H7(=Thfkch?ǧ ȟ_.O;~Az%iպ{u=N:G@~h~a&+FtR/r֬YzC*S4h s).j֬~_vx=.\P݇6SBĉf͚yAV!!=\ qTNljK'( .=| afXeS@@@@@@@@@@` LMB@D\9@ 0@0 Ttan8JWOZ(J;O@@ B1p/eK_Qb_`U+bOglw)'--_.*Ud"֎Y\rt5xܻw,nK =3:prAZ(dڵVZQ{~R q,uVOZlwk!~zODޱ]o&5j;rYbҠAҜ9Rqa/#tF|`6)+ $         ĴA1{  NKQIA@ #GJ}XpIk,csl @8rDzu鮻|%ާ6sbQ o9GƘ*й4{ԥV] yfZa K_<"o5f\RURE'tRt'zm~@Bc` @@@@@@@@@"J Ȉt@ \2zKO@"_B,袋"CgڵE"W@*tԯ4ut#H%JdVv{>V- |!|"Y<p X?p/6-"7lpTٴ]-pͲ``*YDi%ExIK'D"..)r֮]d6m߾ɂAӖ-[Z%ߞy^ڔ̙3,㣑c,eoj$ aN$ \wtSO';dA.         U ȠrR  ?9eJ"^`{whзk--^kb< ħJ>(=԰4{Ըq|Z0\>~Uj˗OڴsNֶI?nK*Bkke˖I~['Qz!)W3_}^{Mׁ+@&A@@@@@@@@@ uCj@@R ׯˡ3h@,\(4th**Փ*@q g6%祫 A3Nrh&@@bwJҐ!-$-Q!`%Jڵkg &ܾ}7Y ?0?pƍG-ٻ8)_ X) D Fn`b-v[lPQE"JQb)o弽;v|kٙg33sw5͛7W}8Tdhb&/          s@@9kR_ " _R^&,lk- }Ծ}2 KС҅rL/ڍNJzRVy\.i-[o$q[oIÆ)ԕjrȡ:uK={vpȹ!C< [+hLjL]51=ϛhD~6:um{*cz0e-ZCX$%XBG?z^pn~ lyuңJ]ׇ4u 5@@@@@@@@@@EY@@AVH/ @}Bfn]:΁ϭfJo `s.|<ei Գ9p`C/啢'Jk!4aJ:⚲N^ Kl׮]g^9.s + X`-矗N=+I?V Hv ?x         h2?@@H,5f-@%p~k ?ߕV^Z?ו5D@TOZ}u/^{RٶX3%~oi>=ZSu=3Ap'Tsf՝GK_~Yq>W 'H8@@@@@@@@@ȵAe~  @ YFUE J; rf^Ujْ 22 @ K1SK\ϙ!         RS@@Ҝ9?HgҔ)҇J[KFg|@\&N{NzrYgs={i @SJG-=ex]ck8PO*C7LZ}$? АZItHo] Y 8ih\喫{4m4aBuޓ.PuƭKG 'Hk%9LS1T|~0nJu Y/@@@@@@@@@hL Se# E$0wnMx!ot駟~iI-V1Ώ{?b%1=6+w%b?gEae*< uΓ\S:\㮻n VPC?@ecx +(ᅲ|]p5[k4@Xp_h+~ z"&M|׮ET@@@@@@@@@ VI֌! @˖RҔ) @&HnkzTթ  @ qҁJ>nPr'@d, u7  PbݺI{-5kyZ< ?YqxTP\8Ps9W @w4ztuEI>'=t}RΙ?;E`T*'[LjN?2O;KA?/ T1\uUŒoE(vXj|@:$>w@ kUJӦzg<$p h„BuɷɒFNA@@@@@@@@@!@d>T'  P.͟y_< P~(=t퐯ٳ8<~||@(]å.:HZ>kKg-t;1, k*6LZf='вtҹJG]qnE5Cn/KA7@dx >5X>u'S#X"7V Xncoݻ7ƒY&         A尕YG@@ iݪiysir0f Pr7 4hPɭZAPRnA9 @ )rHE蠽L.'9] )iSi`isT@N>Y~G*Rgid  oV 2̿.hst0A +$/SOC裆]6Kk<=o,@@@@@@@@@J[ ޾  3ΐ~'i ;1 Xǎo8@Z|qL%A˖")Ҏ;JIO:I3ˤVF~XzAKt` CM!/zR ,б׿p;:c/ 4A R'KZUt*]pA֑N}#2w @@@@@@@@@ YU   WA1 PYFOԳ>ٓs@@@@@@@@@N 윘 @@50áT3@_/u, GzXoR  @w!o҂տ|}k2O;C`f*$%s=$@.Xzi=-$+fxҬYս8ȕ "Wsc>GM3=f P/u ]tQ1֞:g+kl?t          @]2ܒSY0-  @ +mmM{KnX7 @MsJ7,|7z4=-KKK~h JȦ8(S?fjA 7Lz;.7e.J[m%vW^ltx_1"twxpCf\8pio>>$мt 7H\L5u?^Zm|i@@@@@@@@@@ Y7/F@"pْ1ZYʛD@ }P=zH'6X #0m4xpylZ;|/ 2kҥ4rd@acXt֭+u_zIx|WqAUCɸ[LC^<$-5o7+[lY9, =9!=U] Fa]* \eHn('GAN|'!s}ꫯ⣟g߅!I#jm #kSΝک{ TgQ11_7޸@4vw1?ފ~HC~L\qǡ~LSݣdH;c])yL㔏G([ =w|/_/$Cr>Jv:Tm:\!v^v_uBvj!i>P]Ko>V3*欳*~=:/dRh,D@@@@@@@@@( K`#   @~N)SG?w(_~Y987U-I.=7%7ڭ!KBQC-?:ŃW}/C6=]"DlǡkӦM;iB%=kuI7Q׮m( l/Q&/BB{ァɓ'k.~_Ci߾]v V׽W^'2&_ڵk{}w񹿟Eɱ'9x<9Wc~4:@6jv;N! ^cr 2=,qՅ<&CF&(_]_?&_cTﭟgS\$pǗ_w1K/sn׮]GA@8ĄBpwx]Jn&V' յmMqUuz9(nG?_ss^nk=.]NtumuN'6N#2I<&vz[oQG`} /a[         4Aϲ@@<_) 8P~ׯ_ ]t@GWS ْe&o8͇N҃)g̘_!Hl>xgWXaX^zwZ}Э[xSaƅ @ &&Z[n c!' ~+ Ah\b9?=:CGUCS2Ҷm$tcǎͯ}8$ڃM<:X` >`$2ypѣ?!(3*|fB8o.;XXcg+>okzts-lXjꫯjȑq;vl۪HZqCњKm] i}ou)!cOo!m1킯L $lҏw_0$Zki6fmM6$uY.ӖC’kl>5~LѡYW|I;~8%M²| q'+~W'}>NUW'F!yaڴioXI[gUw\" 餍NhV{:Jq 8(sŸHO>Y!8׃ZVw߾@@@@@@@@@@ W5j)@@ /3f^{5z7ܑ2uT&d=ܝ`A.10ѡ|Sv.K}o0\ڊo^z&äIbO>>,~7):apU߾}k?#FV.sNn\ѣ"a GC=8+'UBdp] &!~LB럜?Ns;o L9I`;!&y}f͚C1rVty(#x衇ci1DsM7I'd+;I@&zиqBx1bkBnvqR>W2X}q' rp܏IX.C HUq?q)1' KVJ;,O$m1ccJ Ldl>?n: ~t?3?骻u{㹿UhI8Tӵj/!sEp_Iv3kӋiSz"in}L.HO:4ª{)a?'@@@@@@@@@@lFi@@Ma^|HL__x`)7RJ$,Uo{c0{duY;ߴnn 7!=L!@\ v[E!#V  Y Aft @5͋$!QCRM<&R{㹃<8.+I\$O㒾}!>f%Ǯ|P]֍ik f\;k֬xO>wV{4i$I[ހ6:i}RNQjI.$}dp<%+jK+I[ڃd{4@Wo+l7A6ܲYRB޾v)g          K+Nv䓻s5K o=zy=O?$SFA@C?.;<)upC!k0ٳg@7\lMIA6{ݺj(k>}uוnm[N: # E`ߴ}w[5\+Tܣ%n{8qoM>=XW\Bw0RHI0R&ru~ IXP3fTCdw=z,4ٓsJ?6r7߬~;nB`vFm$8s~s=[￿[ob^>(^d61_~`)_& xrSJA`Q8! K[s̩\r]!d)#[!\Y~), &stxr.~Gd<(. Vv[>?uyvG 1,K#Gg̵BvV8G©[75E@@@@@@@K ƒg  @53g#_Y 6>.ϔ㍥A߾΍hfbˏJ3sdpH3#2o'k𹨃/:l!>u>WkZk-͚yk|m¥^C \ro?m5~t 魷^?^;c^vq`ބ 1>\ 0c?zpxפ eR 8,Acc[~C:cqV.Q+a.}:9'HoroF'I[>] {B鬃\!I[ɣyK/P;zN)C{.l|wߕ\S7NZ{ƯO֠חf@Bo       )@dynw@ HMM4 xEɿ5^z%=z;]v1a=жn E fSQF2Dz-FD/_}p\+s:~9XJdvѲ~i ~7GijѢE p(QVZeB-9XΏ` .t u]W뭷^ܷ ˼ƌ:+˱ [lC%s=.,(׿jHv9D,9{aԩxGa' יj'f"/bid$Ձ.۷Ac{JkP`)8!d27 ɘovl}|$NN餭Сͅ_mv[<:at}|~!d'>ҫ*7Rf} O஻}UA]^ʥFx\-+ĭB@@@@@@@(屚%  PXGՍ7ΰ;nmڴ) Amᢋ.ҤIĀ^-k/pƷ2 a@z |tW{|0!kF1 @Fo^g̘!wwM}>!Cp.  g=Az2pȑ#uui޼yrC[!G^sq)?%/Xt.ryWͺw1`_ǙqpV_s}u$d؁b&%*<lBkJn;|Ϗ>vG@;cAd ,k?W*pȝA\ 8l_Je {q [;2 w{O+YgN1~饗:+^ .PR87: b<b~@@@@@@@@@bX,|U;u=OB@@7ip( 7 l2dvi'n730qw[n6`{ 9cef@ȐyIӧKZCKwީϐfϖڔ,ʨyz^;FM2s{ TǗ{x/_ɓդILѯ_|ƐZ96%P:r`Qǎնm~萮M74.am~g եKrve Sh;ʼ\ԩSف8  6 1ȁaqas#e9.8ߎ-XVo ?JW_-{5OW :H4i8f}~āuxt[a֊mJ+T : РK t[`UV;`#/eI;!褓å?T8kr$EQO76KF(        @ x,@H`袋bob=蠃P7fw،<^kNs?piӦWA :`1i ,X" ,]ye٭~Ap} 7cWpܽ{AU`+S7YcƊhzg3瞓C_|^5`8lFZoDc݆7\.PuS=G5k[#R-ƍV~GƐ2-j\#GVA/\CqbK/C_x:o3ofk׮.Q[F'<ے+ݗqo޽c[?Z@IDAT;e˖%$W_PHv[=m4hB믿vz7K/]HUoV]M&QO t;>ҙg_Kx@9ضE@@@@@@@T,-z! @AL8Qgq.N8A{g [( Rz |ꪫt*Jm{GUV', g[Qӆx챊ȐVk_V!Xzqi_,@9XJdP)~G=z,Tا~W\Q[lE6|sիP7B(%zxKhoUVY(֥J6LGuT >|]B9̐zr饗jw-R2[;SdpH͕W^K.D-ZЅ^O AmYEҴiS9qj JJ믿xO>iZ{뮻6̟?_sL.s駇Ys:(tvSǎc;ݹszΩq?G}T?F!#[n,0T wމeyz|>};w] ,볯*/M"[?N?#z7նmxNvڃlk+! vgk&vzp@R.?pNUcI_kZz6vBH|E'wg @y {       Aű% =9-5kL\p?rsbmV7s9Ͷ5|pٳs.@do h'K*&]vij4g 6"m$O3 ㍥Af Rmٺ?!z!@i-r1![oZlYہ!PcCC=aЃΝhȑ}yK}s}N*;~籽.`I&s{tw7P.]4h 80@n:v,/` O׫! q嗏Aƻᄏ6d5i$)%|ԣB'nT*x۽⋱v _~alPV۷l]-T@ GSBbz!iCǻuVX ЦMEkmmmmmmmmmmZ.p}0's}4cs_ʶV`GK?\JkVR8!73k         @Y0  @1 __/R +7"Խw1OבG?7o"̑"!0wt!pd!m=,A](gT*|Po+>zt]Hl/u/h|7nƎ+tAr8E] (mOrvRo㏥//5*xi5J=YC@@@@@@@@@(  c;P @(bѣGk6J+`B)o&MĐgyFvm?7 k%/p] !@ҁ &M*5  hZk-~p GG;ﬦM6ZX0]`uUW]iӦ3M7!>lj)e;ԯ_UUVz衇/h}u&l]'|R3 @ƍM7TC Lj]K/q _X"$Mr!?~nRr7r1YO?G?^]`3'^z% 0@{G 1!>P@:wB΍}??wMW_}u 36!! f[;n :uTlH}9^8}=+rRFy-ʣ}R屾%         4A  g!Qiw||f͊tM~[3f;K.ИT*;:ׅT1bM8Q!U 93Fz5s6Kf#AL jA<8̲pYg 6@={ԤItgk饗~&LSB:oJE뮻nNo,= :dBr-?֙gc=VԴirgw'`bTS׻cBG#wF#)>Wj>3gԟ'm1?qCY}'@aÆo[Ŝuy7.`;@ zj_pd뮻N~ag!U㡇O<o&?>*>+"zhܶßFEV> *wW-*Ǘ=6|su5^Ɲ38Cs΍9mzWblwމbڵ3p_~^zx=ѡй.uiqoc䮻<tʡ>x̥ZJnuXC 4iD>m6ƦK zGVҏ?AҦ)/PHp{A=c3gNNxi|0vm79DЊzumL}b,;-r4o^A⿫&Lh UƼ͛KݻWS1F!         yY" @ 8'ԭު%\VW^:óZ/ߌ[+e5zL䰉2`p :L@Ș Gp%˸jZԉ 2rUxu3"C8Zrw} 8vXm9^7մܺS{yQGiUWiu~ꫯl5\)Tm :tiC P#G{<۱cG94vyuLJ` P8@ 砨-R^xᅜ!9)٭zqx}e)cOSN}jR/uw]묳׿K.+B8q|-cC;zºnN _Άm)#sKﯡC Xڟvk;<,Gt}b,f6MƩ}|.Ҙ٣B}@@@@@@@@@@T,-z! @^i=믟4̳aSNш#9q^57o X泞v ?4 7 K۠eau2`R2T˶Ϙayݶm[i&og 瞱SOi嗯~"6@}ΛjS;wn8MQӦMcu=ݻTxvVم^#5a^          @wE< "  |zFi7pV˖-k/7e}њ1cxRK-!Chp¿/UVYE\rIuyO?>xq0tEp:v_;餓CA/2zr8ov0׭瞋7ydꫯb-4W^yEvwt)8壏>Җ[n/R裺uV?v_|[/.k饗x뭷 2o<oխ[7ngu0#<s$_z_ &O.6yaMM.5V]ujϩ|8mڴx~vwFs9'o^W_}B 9O?5XCgqFD/* tLy :T^\Pmb˺+ϙ¤̛7/n^x!x|疝CzDz.sN8!<ñGuve}yۖ.fie5֣ԲQ>s:6lBudžL._Kk9-w9s!I_>o2(ާYf}G>O󱈜ͳǚcx]BkwaYSӱǯGyD^zt +Pt˲;^Rf.UVLmzgwmvӮT9 XhrqǃdV{@uXIrM}ϫcxw}^_t1n9._ϴڎ5g{"Zk]|A:ztm`vI/eS6tAM/@LmMY3mYS.9A&' ߿Yfch ےj;[M3Yo_pZHy0o[3gK[6^:Yb|tС#4˺f%|BԼs꾫қnIO>dnryCM=5<\rqm/S~~?.>@S3          TKǎ;k%L&I]{͛nTA/B48MH*r=.%ܤ 7q~|/Qc;K`q!osR=uޡyO]f{r=Su}!P* 7!.nL<ݚk_'l橋/8nZOT$ǧvZp ~Vz_-‡R!ЪBR!,S!*[B@}|/sofK@TLlӸ= 7q5nLrRBy a`@>Jr\|MLd_B(ZChnC@cl+Odl17!0բE:B`f64>~u\q=򱍳C6ej+CV߸9!6>W95!'u~ auGOjڿ]VNK)/?Ə_zBVUee:8$>CpүXkxGb AeX~EMٚgSӱǨd]sGN\sM2TM8cM&rC@BS8߁B/!`8~PЫYmv%sjNYLmM!m?qg\xf{Ncs'qجJsV=/PxKe}Ǿd\lnm")^wuW,pJ]}nj͹FuU/C>iRST,^XSuѧaJrK6S3MC]7+@^PV}m       $[K uA@ wy1|N &'xpPQFśrCߤ&Łu)phEVquqIh`  %a*'M^C&-aLzĒA:Uo*N'oQIzloe4ԲYN;OT?&(. !R@hR_[aAYegF_t؎~z b/(-ro6$%A5ǎ>;>WwWyџh_rX~vZ5=Tcp:r,so8`I~ꪫ&/c'qV=.d?|eesޔ ]_s 701}f/| K9/B5wT򹺞9&J/-z}z帿/q_^9n}㮼qC N.f=ʅm~/r"W 滘it-|u4PRLoOvCy>6p U?6j56ph..kWl5I~ukbu),A^k\AOz%mt?z$A.9V ձ?.e꾳wX~p4<$H̙3!4%ld>5] pWgP[Oxi-]tQ `*G>"A6+R[[S9-9?ԇ4ٴR[џmY<'ͯ~iҷO_תIdփgV@n- 2Ͳٞn|?~FR|յmcWmuk1Av_X2PS}kFu$?<IM=Zz뵽۵/Y;4I?S DB) 4@!!֛e        @ 4   P!2,(;*xps>epa)֭[+gs 7+ܐpcKyZ5\SMTtO?]h^^EqZӧrZ%#VӖ[nY9iZkUx : +j__ Hiݪ}OKGY.k\٥4ogŻ<sL˺ߔ?w%ޝw9=uR]-Rnaп8[oՎ;D!x'yk7`,+!+ BBz! .q+V۹7B]s58qBpW< Zo4zh 6,/٦3f̈??>[|~Ѥ+>]{Q |ۖllq2'zld|W^Ywuxk6Rp;B!1>zW_}]{W5ޝxJ^jj+ۅ;۳gO˱&iS">D^liYc}뒔8&뙌鱦~Z25ƱۼC6ǚZ*3vq| 8'>Gv.׎}q6ΦRWmz BH{|O @?kkk_ևM6gmYV. js}V;./}~ᅤ|m颖o7ٞn} %j$sJ?'hq(<%ßqx,XCe=|AGٴIgaeogSɇVLꪵL          @!&B@ bBLn\Z'IJDqk̘1q;v> w=xnF գG=,蛌][MCՍUVY%|UދumidpI 7d41L'K^qҤI^MQ\Ώ@r{5Y sE@B|CAZAU)2Ab2*0~EJH6}lM}ƤUSIxlzb! _馛<B띩ܧ<j-}{_SBCN;ŀ9sXת*/.bmf1?=#ӌϙK_겲9oJ_nMϳ˦mi{tI±}Զ4o\>ׯ9z=k֬_]A5 zT'W-͚5|!v-bu@I^3dHɴ͓V-䒕o{Lx%~ZDNM[YuAɵX1kݿC4땴Ic{{Le韫5mE9T =:=IWgӆUuLN]v/$ SO=$V[}|=rlV%۶&}ևLlL߭iҟ'}Σ?ڈA6">.pXѿ-qo-jQ +,9*?bhҤEr6}GE]s=Wjq%İ}8Ǯ̩Z&O\u3~;5q S4?9O>vۭ x}Os*[94$%Wc6M? PVA>˽A<@p ٪U+9x[lC9D׸c֢-bse>\=y睧wQQ|d۽9}IڵkԩS1ӵ&EϞ=㔯BXqm.4~Q_;M|vi y6meJ'aRnXg^u͛7uM媽kcM63ǚ\ojMI/ӦM/Xc}E_G?c nTԐ=ݠV6]lۚx|m}.\d[lVԴ쥖Z*l)ac9F'xZSz/\g<#Xeͥ#:J>~kRs+hrqm/S;Ku=y#          0A63KA@XuUկ_? 6Q֪{uֺ{4v:8`8Xsqi߮Çxr\= C 7$q{#F/>kv|Zh:/./B|L3fL|:`촨7'~w9k W 4lp75˻M7)ISr S' s@YhbٸnjCɦZ<UVYE]vY =wC\N8fJM>}ďz:>t& P"`6[F5jb/5$5{],XQQQQ,PD 3g{{O/j|F!ÇWO|_]PH1TV_uTM4#>gn ~fu/C7I'ty/*ugc_Ծ&noچUe_^ypvu 'N~9;lǵ>1US(oRJab+Ά8TUs1dU˩k:^5jj4nzN2xu imuKe{z?7gΜh?}Gˡ\>ִʑ붺{>&og^w 7} 5\V6);vfmV}fgL@@@@@@@@@@]gւ E&pꩧ{3Zo&Z;ǃ;{Qh[l>; qCTzpv!Zl͢3}hx'3f̈^~ꪫFa5jTѳעy衃6nf::Ck:d~I'iʔ)Q_] ,пom6l;v>\NO<pL4#8"a [.+b䩀sZ!|Xj6O I* Ad%^(hbd|+S/4>V4cת{OmsWoڴi}7|M8$=;>ñxmQQG\zǙ pwGL={v ,arPCڵ[՝{<s/!a硇s@SF)p2!T+Yf%5UwN%$\#FܹsW_Eq@ c…s[.͞|k[<:SϿzᇣ+8pmCh~;@4s믿&owx~'A*b*˫jW^G}4 dYsOu]ut'_սk^N|Gu&xћc _Kvn]:o]kFZB,k*m_qgYklM{5:@8ovsύ۞x]5MS~u9PK\M]Z;Nl&!ygc=mEO?פ=V۾'gJkѯ{_롡8>v>ZA-8a7pCS֭kYBnߨ1|ryiX /NÂΆqjkjkWwNk;/"\Z"| \o&L@zBϓ:.C}j=k'2m  džmQ^iJRihknZDf*U%뵽aqmmfȆG΀         dU tIе누G@@~%zm3R0BCܖ[}"tGu"t{o"tO!$!G}te=TJe}饗kV17 C2]qѲBNQk!2Zz뭗qcDHΊ))yn.z>pDVH|9>$Zl9rd"%BK"t:._ԢE.W[mD^^;6ڎ!$݋fyY?1xOdyŬ<xɲ>ȓQ9$>S۶m!@5^]Ӛ~iJ弩„j*H$BTTnݺ%DO :4:g[dI"k&am&:ӟT~^J?Ν;']6{! 2o}WMr\8J+%_:|$̚[0u .;`E]G !W\1 KP۾&Fmے'ƍ] ۨ-2Bg˗Wۃն.!'Gߋ>k+߯8}=[jl~ǐ:#?/;_"__ojׄ@Dvln_ ok6w|렾F\6Nu_SmksoGmV ?`h޼y_W>NeDhlC[4"+jkkj;'jk;LL PT (u뜠6KS9'5`zC] &O{U;[mkz\LթnㆴծcFb\/B("xo>1a1 .pQsxVKۭ}$n{ZC簵n赽kk326 ]V\M4l.@eeK3@@@@@@@(&FLiu+Zey,@gE!C RrPkzqϟ)Sh5T|_[ӱKN vOS)_sO2Ba |Ծ3ҰaUvJ@:vQZPzt,edKs;&O s=IZ#FfSj;vxWuVw2V>wC({t,Xb5R9>e|?{}I{˰黪Z<$)B2.ky ÎECTTU~@U|^FySMEͯsiӦ)"FW> ]V?=z4C^Xxeo1.H autN as > Ay\tpÑp|yGt]*mL*,0@T@IDATBOt駇sp㡦2RGCح.BT*CUܷT|jw4cƌ]t[cmMUߑoAo&mǺ!Vrޠ!U  aꪫ$Fߓ 6'5ΝgUh7^T5[Mem m^۫x;.{C.w=4<[jsm@R(JyPw@@@@@@@Y b޺ @2.0~xm6>|xi/DV߾OoB/j3)Fq8ONG~LHtCa ;,]J@]B^vۭf\  b̒˒Kci Bm„ QH'pB4f3#oLm*.ry.VU}tG/3|{}4dȐoh[+GuԩSfA\sMʒv w7,_krit0]gqԚ=5.U}>dsBgz7{9k e97 k=S|  mȷ}Goh.}:q̘1z駣vbs<߷i>-Ґlc~6lT?^4xt A[,xҸqFdХx(7$B D~+R       ) 4Iq>fC@B`РA=zva( +bsKm۶;\6lR̙}/2!묳N-ŗ^zI{gFcY-7-*+kfSfJ@ZZm5iӵD-=$_XelC}RܬgϞZbXa/롇ҙg880cU󦊵<VʘsD9 87Գ>#F6!]֐4pwqM%Zn]k]v_C=4 (ܹXaHOH6|sz'uyEE_qC*iHd\j7S}w+3+}M.*n<>}zxѾ.jժ>4mp,裏!~owT'ӐVWu#t5mQ9f .n8>BH8}G뮻*7/6  7PsOJ7m '+d@ɓ'+嬜[mU@׊ pjɀ         dUQ" Zcn{E>t-  !P o]C-rg ;CK,#Gfc9Yǯ.HguV͛7IYXi>TZk-ixsW%w<4餓򵔔:i:+HlR\ިto2Jf3is1+j%9sp6}WuS|_~GtGvIM~Ex]kq5\1ch  <+؀L0! 9o`WiӦKMG?p}Ѷsp Cz~' 6, |뭷ԡCKsyzGb￿<O=?(03{wt(S!c9*:s~! ~o,WS'&0jB@WF_yC?h=qy5ɫ, wT98筽{ց*=T)SD!vh/MT.{%wޑVX w۷g&%i٣5_~Q{iN˦@)^Ϧ/BXVP[Zw_~,k /-Zc1~)i *_bW]U9cBKUC(B0RiuӕbR zp&CaCGw}7 ٻ뮻!}u}ѐ!CYJ\%E*.\0 <,Jգ"yʼn'MGuvuלVW ߀b]vF]14!὾+W^ Y\>;w\yr77ԀGc~26cЮ]<.q5|QC=gy& unSBUUL4I7t|S-9pm;vL5+9' sAr+VK}~AiJRwTvIZ3RuV: iΜ\\8N@2bm       )и0M@@XaF:ҝyK}pC YN믯ƍ6@7?D]YŹѨU+Jl0fФԩ9*E||k֬Ygi뭷֪?B>և)~\*i+9e˖%Vj5#jC!{9y7 =>6x(_IntWzԩQɓmݾ}(7Ч~B굿뮻V_}GyDJ}M6: G5J79hM6 羝t駫{z5#/.H6m*Kt3޽{G6Cvsl: a^>s|lc4~ R 3KwQÎwqGr!!8SkFis^          %(@d nt 1b1ޡt3`=Ù])Kϙ;Q0]wݥnA/R^" HV+<"يTO>)}tu$@׮ T"ʂ.ЪU+zꩧ4sL{QP{W\Q;찃.r}GNEȸ9sZ:F.]kTu]5qDM4IvZԔ4pqȑ#& 0}DK7nۀe1=S4~xM6M'tj>C|ugj̘1dwӰ6$/+cǎ򱖏|c0f>F󱚏* K"?|9~{7!С =[Zi}O!          h|! Hln{EOO7e# %+'謳=ܣ~O::5uoL5kJ]s5QToۿ/jݺuA׋.3ҶJsJ>?s P mIO?] ):\$bj5 Bw {]΋]2.w햾g}VO< i3B*-2b WpJ@ |z?{lz(Aݻw/U]T7tS՚kYZI`…mt-5mرѾp;hfE&l{*d]য়~[oݾ87\֭ l:u CrrBS󱄩ߟ{վ}hks=>5OB _uc,o.];nΐ/(i*K!]~7t;0+,C}J9Bq>ܙ(e 5 o5՟@@@@@@@@ wAΞ5# @ L4I]tN:ãѝU KZQ;NGuڴiSXxa t7#, S߾ңJ;X@>Z0A![ر bG>( 3fLXwߩcǎQC`p0h -A)1Ypˇ~_= rgj6ó<^z9A݊;o޼(~饗4~x-ZH]tцn8llnKgnZ7Лoü/ի CFW_..y}f]BÊ)o?BNC|SV7"hdT4GwCz/ ͣsvc۶msTYԩ eozm4m4ynMyg}ڌ? ̫@J,x@@@@@@@+@dvY ;;DnٳzfZ_/Bwun樃2iZ{wQdȏ5j|ɨsN;=3hߦMJ ?;Jw}u衇@'C Wx%K@KH`\N1ǔPŋ&~paV0 *ŎAዓE2C޽oʃ)8a"2#>(ߏ<]Zh!Z}\{jڊX}QgUv(y?X?uM7O>.mŰyEc&>s[8`قxl۶m)etE 7PK~sA¥# R#P#Z@Tx @@@@@@@!@d6Y  P;:l/ƍk-!~sU 4 ,^XcǎSO=t[.hãniZ)`./N\ @! F[}_a?ly+0f6RK y[̜;ӯ\VNG⠮8fĉO믿ʁ]pXثW/n:0YXt>(šsq8ˇ~8@kWNx-;z-=$n?xxQf՟(W_x]r%zǢSN9E#GMg[+&9AcңȼYnkDtqy縍:u*jSn* u>Fx7Fy1iq;sg­+fpx~;V#W۪mE` l*v:`T|(f @ [?        2w@$w5zh͛7O]v[oC :W /Yq昐/G)v;r)δE~BKW @9{H^ZERI\RXJdDYXꏼ`(a]P=9*ukW_=W"E|Fd}w!,eGW|tG=!Z~~WH;ԪU+vl9[6u? C@h?i穯ypHdn1fV.]M(0iӦEc1T<8˃æTy>.ҸAjXHB s\ i9׃ 9#jVږWs#/xcm۶Qi|-[5%g؆oȴNjUA'p9眪geB=V_y'9(9&g @I [Io~*       @N)?+G@pqgs==vDl` 4hРhСC HO?7ސGwPرb 6,€@M"=wx~iBK! F dLiBwģ*RXJdU߄~h>-B<:﫯R"Vںuk9ţ_<]uU%?gϖW<:D+N:5 rQhoG}TKlzH Cn|;#<"znV>رc/m۶Q= ;C*xf%W>+q5į{L 3 [ iqCWo6 "v=ﳼcYUVq׾U<8mpŶ:}ӉJmRr>VǿoFh{:4{M4ggZ]wtUW7%:tϟ7|DLn^g<Ȫ@)^*0+CXFߖ        dQElV 4DEQwډws ;?^7xc ѝ{k5׌^{( #X!wu縸}&M?:hCzz:쳣Ζ\r&L]wU￿_~)) )Ό@Ⱦ Ҙ1Y| ]@dj@+|nQࠥ! ɃCSqtG>s}B OVLYW;wnw)0-&О8Qa,hvdoZ!xrLl5Gao{/6L81 B/ω;@햃/0(<Ͻ~*Wŏ>U>qh"U'c4n\e/Rw>}Dcuߨ.sf^{-:pv7murB:BxA? Vl>>=yqiy>ތxcQJ[:K:hB-Q .@gyfx\ 9c<@@@@@@@@@@&(z*6pݺۍa{$>  P_ D|I?/W[m;8~ѝ35Û;˹|wX4y6m<܉z9W믿nЩu˴{fZ,H ҝwiAwUN!Hp,= 7\1"=+Uv9/w!2J'y.pC`<Κ5k@8\ q84>mڴ^?ْ;a04ܡ![lM )?g1^>O4~Mg&>猃Zѡ-KEn5kl@Ί9tΝ<uVb,o_wy'{v%ӯ_?_u :o0m_|ACM~M&QIWţ+>v:>۝x_݊eyn|rH)3%KqX`Nq[v¿sTܖs^'nrũlq;O 8mi|n6:q|N>w{q{ת|.ӞƁn=uu!_zy*Tiܟviz;o߾UīZIF> |, @ [mq       @?ۂ  ppL:|tI)Sw,tĊ;g#3;{lڴic?wC/4~?;Ł~ɝKH޽੃,;Tx≺[]Hĺk.KS`u__/ tu}K*͘!]j5Oر Ծ4ikd,C!zqI|^_ϷhRUHLRw+j<1ǞX^Wu N|Nӌ5Ǟ:PA-, 8q„ P8qF8Jp58ȏ}-#:}O=m rȤǞ={Zoc@!J*N+cyk% T&Wnq4y^cOS2ƣAcO}moqi*}Oqxf<*Nǀ@uw!r¾9xܞM9k?Fxqp1jrq|v9ϓ抏i$?6'?On6:9Oe>%nV!ni|^#'Oj/ly!=Hp[yl͢^{-:<KB#'ڍɟ &oũ/       #$BI@@2-P_?[;9la0΁U@Ti<Ξ>t mN؝Sn8258`o֡! O맿:2fj,8ŸDG]U \}B(~Uk.25n\ׂ#/ Ν;GcCjp8S?x;(crpJ{q(V49%+&MC}<畇raq0Lԏ]xe!aɣ<9X>$ !>[N:imof7̙tSK}ߜڷo}أ8Zo "2%6ԣo`HO?y?N"O19⾨>({Bh!wZ~(9|,'U._>xOxxߔ~FWXnr @uIQnepˌQVJ pxMn-NlNr'ࠢW_=sW ֌@nm۶9+}?{"b. HHE /yfϖx@6|y(.w?~HwU9w:쳣qkBjreCy"@@@@@@@@@@: 4̎  @Q 4 ={N?t{Q&!䘐B *PxhnU'騣JT@׮Ҽye۹[Xp'o߾UP%X*Mu@@@@@@@@@@ /̋@!@@r-гgO=s(}Qg'x"by(0 yX0@ ˤVZ y+ХKYѾ2oH@DU+E "٠T@ B`By(*D m.xt [J=$stҥVa|M7魷_/,[u]WgqF4N2e7KA%         P j@@رN=zէO{YXJUw[Xj:eedEKmXIդ4sf j@JJ ȒT@@`B `3Pm+%=;9(D O^z)%CΝlN=TSzIJoV~:         L Ȝѳb@@|ijv>w]fbS ̟_JX498QzYrrVUFWV؟eu @D, O@@ g?LdYq g裥/yq(9:TzeOɓ+JӦMuM7W_5\%%         P j@@hӦӄ Էo_}_pJ 3B@K>}m̓P tDdƑY @$@_@@ l"dmEI;JO,d_`qv 72 0@'|N9}Q~Q#         c sX=  @alVz^{iӈ#7F)e,([TVi[$ B W^ݬYҝwJ'5jT}^)> oR#@ _R-C@@Xٲe֎z!Pzҵ>?s P"?()yuYg{:Ê u }]ʳ3#          6 Fɂ@@]`5\~Zo|ثM~II/pO!׶|͚ڴ8% g.JR=@ 2/6@@ 66UV``䓥O>xhLM{__3Fj5j^x]%aQS%WZk5         dN ٲd@@"6l&N]wU{F~HkK,({֪ULi뭥V:HE©%m gj24   XPj2}cI.7үj-(71QzIl#N'j[Y.kWiLiɒ,y数HqU_͋NԦtj [n9i=WjԨt\JqdᠥhD@#@dzY   O?I[:7!PgEI^uUC:Li4I?(9 K~.R k֒>Li@@@@@@@@@@,mH @@LiӦCE=z^|E 0@ƍ˳RR8Y| {BIw)5JA7VKбcv;"x@h߾l3gNTj" 9{]#4l4r`A"!'ZIK#=4dJҾJ&}M8p)i\ B@@@@@@@@@R !$fA@@>Çׄ kRCtg1|&,ǀ@! 8o&СH~PDdokjZ""2[# @Y*[zG- ;| PzݻKg)M\6uaI:II.%M$%mԫWY= @@@@@@@@@ MBb@@V^ye= ׿U/r5Jmڴ)zP2KB =?ncRLKAu ,-M@ 8| oJ //҂R_Wj@}tJ]w R )D'͟/#+t? __߿,(2+O-[ٺ]Μ)u\e          PA6  y.ШQ#vitMjPu}P'CA ԸqA"P.0{H?C FZu `@@ AfZ# e_6mN`9D8Qj۶9yX~yi]FϳdeK>+]qbj!{Zqեfͪ[K_w#L@Rr@IDAT@@@@@@@@@ AfCu   r( rM6u]#GbS@!s *:EE@3gu4C rMpJQAfbͩ3 @̶8C@R;ۗF 5Ltcn%0T/6ؠlr8'H&I'o-{o7(rHd׮eUfaz=n<^Zv;JRY'kA@@@@@@@@@;  @:gyF~: [KԴi,UW |1,ԝ2u^xA!JFr!bͬ@,-N}@@ W_vrU֋@awvM}(7D;Decr4e駿~SR;C"{(|߾R~zI}(Zq{u{1          Y 2kԬ@@2[N^x >X&L}'D2䷀;-^etT'0sf;nj^zIͩnN^/oYJ@ Y\# /@docj>v9D6|Ȏ +He!'K}$M$-]~hԬYY FIl"mEٍ*.7@~!         u f|@@1B{B>Cp Ӳl 3ZK]z.X|9P\pa4=?N/!Ht*Nڒ%KtW%jF)ylܸqs?nҤ@;cƥjbr]vBɦO~޼y0hL~Zj-[FS?: K ^(dAΙS5  @a̝p Hr.peҘ1ea]lL.N % |魷7ސnQW/i0i]V#u{ϗܮ]>          @}HjA@@ Mӛo}WCըQiZ\ZT%Kh!+Fe::oC &q=(A?n۶mauIPY6i$q(fr:qPgOqzW~^նw(dNUW]UC/b֩n A*| pC C.w8.R  @m>emJ@eϗzJ:gnUy^A?ƷߖN:x鬳U:!"K)!         A   @ zիc :T>hfVDU,tPV|:Uo3.]4 y:uq1cF4:[% ot<ׯ_J+c˖->|hڴiκt hA}OG[{ԵkWu%j޽{1NH?TӸ!W@ Ļzs]! G@JT \. 7B)Sm Тt&HW]%sLG@ /^:\+TaT ?oS!~R`@@@@@@@@@@2*W(/ G@@C 믿wQm{1߿ iԩl_-F_ ~L>GAzhz٭rCf(|q@[. W_}U6G=}4m4}wiժU F#O\sym[։Bj@H@HpDY  P7H)  P 6N?]:di;c!|N O, @}tu1H, PyqٲO |E          dBԍLL@@ о}{=Z.ꫯa,tg/ cK,{=y>ҥKC޽{ae~i֒z衦MX)n ,ӧO4Ve?O?BO|:eʔo AFiݺ W뭷^4vҥEk˼(@(N-%ssR+@Av?$[tҠA҅J^h5 P@tnW7~i+ JjfOn҉'.:@@@@@@@@@@t nQ  @7jԨ(T#ԩSuyQFi\ @׮ҴiuDa̻`z5~Ih"5 =`{u]W￿z-ZF)% hz0 +.fNHG}|*͘1#CQ ??pБ|^{(HⲲ<M}>@R> R@)@d6YW {`SNvQZb)Bt|7&&ңJkvIG%-\;o@@@@@@@@@HAey  d@ଳRuᇇiQ8df2&Y@o o͕/]T{ף7ވ~WJQvI'~Eu|{R |ͣ1}M81 V;v:jݺuw6x`c.]?Af $o  Ap͟/uhJD㤇8@z-y8D6X ?i]%?~9:!lmYK/I~̀         dJ Lɲ\@@,0rH^=ڴi浰ƌmz…7n^ =<:r~6H{6pC 80W) )Ю]Ja:( \ Ș@Hqpd)AJ\JҶmQ@ , &M=C? 5lܭ.         @R T  M:xoRϺuZ/,hڵ1b:w,kVE?_3fУ>?TR7 @D~.ug=Z 9{l]ve>}t{iϞ=ՙDqcfc @t'! VJesȏJ6I7ޘZA ǎ;.wפ*UJF@@@@@@@@@HT un@@Z>cwqԩ(о}A޽[oz)k{U˖-G 袋|HhqQG!C裏>O?oNF=O5kUW]o6׭ 2d̀ G l  @˖IuD81!@Лܡ8 .~ij1!$ƏB 34@@@@@@@@@B ȄXM4@@ʕ+N@={{;vl24څNj9TtR|ͪ]  >ŋ#cǎ*Z]@ /_^\p^}UYFÆ 2%ԶjJ>vQ?-ejǎ&g"@,`AyvfD@A a"F#@ܵXԷ4paC`&H c ԸrhJT@@@@@@@@@H(RBjuX@@(Q^~ew@H9r1$"4gNTʹ9n!֨Q#M6MO?~=j۶m0RCts/_?+6mڔ-AZٸ1t_@b%`A .=裺馛@OY.3Y#\.8#6A<͛k֭={Eq(ZMZ|y3z|饗t竲1Jf30&ЄӧOםwV3/u]v4h⊼Ty,8s#GԳ>-[j-#yA @TJՕJe @ L2E7x6mW=ZqwJuIk>9/еt;U_5~Tȟ@͚ra܅$F           uB ݏ&'wѶmƒ ~5k{c   @ۅMh=^x,Y/z1BC 7ܠotrpm_~eAc)s.Qt>Dڱ#z-^=%L>z7[oI&[5K`՚:uoHfk.{ڸq-a 콝ٰHۙjYy~^@5|P ҫW/͙3G}Uem/j-bځ  RAZ&bA,@ s?^xq 7`;s5ZeFC~xa.rK`Ya/P[ر#         ( H駟pxƑG+2z=RMŊӂ |8DѢP   }65¾,/m?=SU;0ծ];sq:{wiP4:t蠒%K0z mėFپb36m6Kfrq*lXyp@ǎu%4<&LPJ`˗cQg@~k! @0ʕ%;n]<_̝S#] >.UVy0Fsu`ٳ׻\.8d|T „检HQ(WNzEH>ժk4@ EH}"k@@@@@@@@@@  -oפIA{n4f*PBX@@RKBHemBk[z.a矯qiѺ袋wޘaÆ[ni|35N 7oެΝ;˂CKiduS9q-`*;4\[qyGLń$pIҍ7JKN1/_cNVS'.&-]D@@@@@@@@@r-pp E|/R/~ӵkWY8Pu=㟇zWrJZӿ(YF={/_^_|~+nc>sO<ٳgܹs4[֟'|ڽ{v`Xċ/*yo-[L>kr!_z!_?~>ŖUbŴ<@@RA m… ;sf~_~ѠA`n&j+m¿D[5e}'~eʔw߭F+ۢ}a]kues&nWPz衷~[mc[cQ,Ͷ*9jx޷VڴIn{?-2dJ,QFlu9vXڸq?pҥOW_}UkV س:KrK~Ԇ ?N8ohTV[~{>|~GV}[>#r;vԩS}?+Eg`fv#]7Ν;O_˖-u5ׇ-'ZB z)&lcV,C>[]⡵GUntu/6kժxK}5o؆ݻuU\PDA bs넾#i?5]^|?2tPAp[;hƙwԶ_k%]guϮ}6VUpǪʻu"3mkJ:.e{Meulk%WIz=+]Wޯ*+8GN>Y.zyx-%!         @ :uv{b92p A e܏#<4iR`ϭ|g~Xݺuf͚_~yPRl_}fѢE yqz?my{lB:1c5j/^짵etG}s). (p' \(nϞ=I;.H?w'A+WN׿5:?#F\ЎӦ  \vNۄV ^B6al]v\Ym~/ӶPRa.?֞ի۶m \dТE ?wܑ6Mvۄ9mUR@\eBcTYeUr|<| (U*~SS׮](<_P3pJ*ׅ~z#.L{پK.m xMk 8s *TG?ޞo޿\OqOXhɃ>#"]͛w߸`޼y mt4iK?0H>3ۧlXnM6ui̜9]oG{ ,n_0;NGviڴ_ުU+'0ua9WXvd(p;esޯ*W S@ZAp!݊Z~*O5Lo@Z@@@@@@@TpDXd͚݂ҥK5|D>}ci'X}aÆ,J޽/kٯ-+h =gڴi;_x𤁵ÂW?̂>UlD ' AZ?t$A=ӧŊ .]6NlÇ   O?m+m·~o'Hd0m 7mN9$hذa2k҆Y\w}׷5<,mB$ִ;B8㌀衻2|e\⊠jժ"ZO?A9} -[̿,$7n~O Xغun'Z}´ygD$˲[%\?,A[[2ۧlX$&ܷh_z~_ɒ%i}B@wl 3: Aڰk&| i,`BLh7+y 3>Ov!o&|lZhZEf,_\[lѸqoʝo RF|rmZ`wիǦ.2~ݻWF^z%;'mVԫWO.8H.D^ZcƌӼr!r'@`6С    |u}ۄfvaVۄ6}$\YmVPA}ŋ'XuiۑG )ۇ.<\.ˏ?&t5zжm[@6}wrAre^WK_%sOmυUcф BuUW.+W߷l2ܤIwy~h*S̙߿._O=,X ȗfX[u6oHK$,˅%\܅>D>p!㰰cv&\_~Q rj:vקkw=>]A.tJut܅t7S@pHgʖM I.pҺu_{$9=@jڴ9q:}u~\^?X-J1<.|><,Zr~&/8/y^'Jd0$@8Ҏ[ wp ?={v?'Hq:.}h}w1Hڗ?]wJwN_0qlk5o&Yv{xx%ugΕ͝ W~_W S]3K.얰|@@@@@@@@@H&A-Z|g8vay5҆GrbAAٲeiӦowA3 n 0({z!rgڵӌ3|͛u@k=e@HjH /ۅ:cզMsN*Q?4p _ncUZlI&nݺiP{ ^}kr$.I0ػwWdw|-ߊ{ldɒΟב/۽{_~]v)1/̆eֈ&yVreY ˵dɒ$X:*{_hܸq};PKq 87_jժF9gR@)~j^wYF}>~-쑚4+Vj[+Q_9wiY< 4ibG47F_#weJb)ஓٳEbF@@@@@@@@@TzdRzO>o~sp@NL4jHr^uM>=mK A׮]U~}=#>8w޺7t,(2bPzu=Z= ǏW֭wq [n ?@H H "!k> t뭷VZ:۝3qDݽ{lQvۄnvQyG0˶ciɹB ~*U-ނ-r媫ҪUtk̙~gʔ)Z~}3pV˕m۶ߔeEψ:uvp yC¯g{mfl:aY1j`ϰ}feʔIۺނ'lڴ)mZGv ,`7^"wv}t75.@d(QbҿժU+̶߭lD9@Aȫ@j I}p[q 0]gu.ؐ}>~. U:ڰaCFWZxvSN;/Sdo۶0Q6"L X |T[^#         @D=tZ0 pyUjU|~Pڵ}(9Rsղe=Y|fpS/@ǎ;aÆjӦv͚5ڐ-ZT_|hϏ:(tIPqwrf?,}䫯CPlD=O<]|y:33+T? 裏 @ۄfʂ-;- m͕6a+V!lg% nvbmH[_7o '\f|,fh7?u.-. &8l_?w}={s_KlM|I rTm_[ֵ0嬏V^yM0A~`7NfJJd?_v~t"PK+-+:p@MvFܔ_~O|'?6M@>uflZ+٭kO]?nMB}i߾`ic ܛ~a̎W^" קOЕ+WꩧraI&U~WSO=U?xڢK M{@b&ЬYsWwuG5Ř*FRBS/q? 2ۧmnwYFݺ~ Dzl>K~럖Ǐ;$矷rǾ#kֈ+T"`צ /kv          Q+u aÆeʔ .+. $pair! SL 7n8Ҡ\r.#p'il߾=p'(Q;#g}6m.!8}]a/RO ?6Zڵk` ; \MpW]v n`~?jժ[ʶ.#Tl٠x5fl.7pAӦM}błs=7pzal߅F^zOa =5{_qvځ7 ^{-8 QG^Z h|׽vKO>BD!hk"'`v2p3S>NxH;jf;hj4\wɮ}c%Drl>kk$kǗ(&M]_}Ud'W_ u3ZmIɹ& |V"       vptJݺ-{߻͞=[.G.㠅]Vdp4`֭駟ԨQ#&?h-jժi]\\Hڰ .D+V H? J?)  @* }&M䭲(εsNPO@\`\ OV =m;ֲFDA~?#Mp ra~]Bl:ܬhv^Ӗ-[>.˖c+W4C>X/v\"ksǏ/*gyF.g_w=hTJ7Z}N N^'vO_]vbw֧ ֥vш9RDg@<.R<i?5>uncIل>w=T5*t݅FԿМ5ɱh5NAwo陵3~Yy^)Lܱ ixhQ!'ڤg @ [#Z       @ 42Y  @ 1&0%XEñ@IDATzˇ[=.+х6Jg!=\ZtR*y^w6?s-Z͝>l駟R[l]I&e7Iƭ^Zݺu˱!Co߾9N rZ7ZJTr-0vX{u-|kfu]zl4qbfcSoX*XJd9-- \mխ{:tؤS߆@ X$Рt塋,/2b@ :hgO(ħ@׮!HoKVdYwHDKĵF@@@@@@@H|PIM8n:YC?@@,,3㬴jJԹsgs97nJ*c+ Ї~78mx^zDIsVx@B+{իѣGo{N:$ 4H{+uX"`=ziӦNYLlGsdŊu뭷XViDbZxqݻ7.DZX6 ,9@;|pm۶MW_}zY+EJ.; @TE4?6Ԋ ߿E4         Ѭ}8MUB@K}>.2 &V=5qDy>5_Divޭ^xY8`l@F Xcђ;3*^zz4tPԩ޽{ۉ'EFeyVrꩧ/8`J*'#)X/u˖-zw4n8> .;.׋s=3  '{i4;3! K s .0wqC3fFA ZB,*jJSLq]~0@ ANLd2         @ )   m۶{ァ?=۷O۷oc=N,>\\s:wkԨQ@ȧc.LFiݺ #;sAp+W߮3gNS5\z嗵f͚|.)K.- ~LlN&W9sCOWժUuWlٲ.5ZJO=A"G# [Cql[L  @ ̛'qT<2MbEiH iIρoٲVX8g 0k9M0ͥ          A銡Y  @@O}צ],񢋤+̑, Jbt 'wܡ;w/ԧ~O>D/nO4mӦ·c=Vk.& RRBZG_kڴi>r;[N:;S'|7o"Eɂ G@ dQ,@Hj-[E֭t([V5J:ţ+ZҌ3BO 'PԨA&ʣ         đAq2h   *ЫW/ 0`*TԸk׿%utхӼҥKSO7kqɔi7xCCUzuwyks1Dԣ>ZGyJ,Y8g$ƍ5{l5}t͚5K;vPr{̂o&mAFWw{ƒY& @* Xus DWむ RhNi3Bq-[nRb-piҤI^ #         @2 k!  E /P[nW\뮋b[ݼԭ[?ZX1Iv_}vYXw}oV'NԿ\]Txqi͚5MI&I ,ΥY7oU \|gRx≺ktqSѢEmNLh @H6^>:J@@ Mre^/@ j;@_iذaMv̞'Щ܅m.x          PA:  $_ or!8p`´0ڥ4dtRr!p̗ٚ]lYuSݻW̙3mܹ=z-ZON  #H5n?%JW= -yf-\P ,~Zv[9w6oܽׯN [=;vH*ui @ XP  S]E[fG(YRz%ti*-v .DA ={>tⵟ#         @ Y   P7x,/, .HVcG$rÆ ~YN~jذaڭ^z_, [nҥKmɒ%Zxq͂OXUHխ[ׇlR{ v=ҿOmXd2jڋ i{kv# @X)KkhD*Тt]Թs3|ƌAF tę@͚rI_}Ed         @0"  ??e߇A3~-)QB3F:i`驧ⴡ4KlX[ƲvZ-\P>H+Vо},YvmYxY0df;tsr%i&/|roE{l2~:˖-J-Ĵ]vׯ45rɕ>U|Zy @L,Ҋe,M>   @̑>33 M7I4p`)w b*ȕ '],-W01          &@d@@@ 7|-,(Y*PRR%ժUˇBkԨjժzܒ-/3lܸQW>믿jժUZreΝ;.^=YШz>~>тIJefBT1}E(L Se# @̛'%n,=F^|QjJjРfΜZ$hFz$A@@@@@@@@@ Y  '3hÆ :5ydw1g紖=W2Dr裥cio!|ze}/0~xΜ9>o͚5`lٲ:ԥ Y݇WRE+WNYdyŊU|y)R$}U<.={hK!PGgIƛok׮M{ٺ֬YS-[T.]|ڭv>PiMIشIro  ">@B@@$kSfI9@E,8ZݏH&)`AUgRݺGz          2vԌ  @ Xѣս{wuUSNU#;}IӧKzIӦIիg;yJ,] : ή[z,$0N A X, +T*{{|!l|yreneʔI{lO+U9x-nv;vٰm۶֭[e-[c }&R}ȭsr&poh:+p챡c}A:         US*|   J,ǫSN:3|dZFX1פ6m?QCRr!`UTf͚E<nذ,0J>brB ab[D i{ކ٭{aoݙvofᛵ)ۗvPs{lݻwp̌1i37ڰpЦݧ\%͇R0-^Rj< @Z1A@@ Xg}~DxS\zC.Z @d_SY9D>S"         &@$@@ȷ{:餓ԵkWM2J.P&H:HH"䌈VVn|ha۷oOY8Ν;-hÏa{I ` ?Ag wLhD!Vu#1T2S\%ڭtieʔvouQO`͚P LuG@DpA&   P'3GBm G( 4n\FÆEIg-u T.fA@@@@@@@@@@ $5V@@@ SU>Љ'={GZਣ7ސw}4iʕ+]&MN;M}x7Ѡ8X: d @ ELM7@@ &|#뉨]TO PII\"͚%UX` / v}˗$3#         zES@@b%P^=M8Qsy睧{jQISgH='=tI-:R;Jd'RJ` ;2TfVS0@ }SjD@+vmN3=E yFڳGT-}D ,r&i=B@@@@@@@@@ [_jG@@ 7ow}W&MA oU,PԳ'A0$RR@ [_jG@ ȶmT#Q8>'@˖RbҌz         +@dz4@@RB;7Ԙ1c4dȐs~;y5Ұa_*ozRZ 2XL[7q E@ VAJz@@ Bj.zJH=Β.Dri?=F J5M^v@@@@@@@@@(  Ce"  ]tы/G}T:`8OA35} A 2޽C;vD6=Soթ#YX(@X M| (u$uTԮ]hi]ۢt(Rj "${xVofCX-+5h@d,l@@@@@@@@@d(̝o  ^=QH/i"*U{O6mg]vN矯{W r̙߿֬YSN9Ecǎ ׮]݅&Qm7gҷJ+k' .^D+QYSj^=*( " ]  q.pu97p3r)@J=1t($G.ʔ g6b/駇 Uh|yfFAΛ@@@@@@@@@V Ȥ]t @(޽bŲ^UT)izG},nM6uj߾}"5*Prc{_]xa(r$aCi`V-䓥>\@ &`o-OF%V, ȦG(Νo`N 5,@ Yأ8SH4~.tI^ȯwI t_hk,~G PKJA@@@@@@@@@" 2R)C@TBGOtV@1wf~ɒ%yfN7M!~<^S1c5kW_?\Oʗ]s7H۶e_cS.֯LIѫ |d'm@ x\{s{Tb @$v 2}@Vy, ҎaڱL &0qbBK'h- W䮻6mBrOY}>P@ ~ח6m6n6@@@@@@@@@o5#%wjL .]B\K`0@ 1H;sY9؅!!`Ao;g}1D+Fs6|qf,@s;X&@@@@@@@@@@(ͧ   нd!tKq;~98-SG{Q~wLC M{ >dT4o$lĂ( WkرH;&8;IA v풦L K^ȻR^9Ͽq4cF1@z,YR0c)          v  +PtR. ƳXx^z%$lDڴiS6S1*7cg-zgIVI[Hӧ˙K^*ծ-M&~ԩTTԵtmرʕY:ƃK6H| %`СZr@RUB3Ok*@ v,ҎI/vҎ] &ҙg&Zi/GREbM,c߆s7?̋@tʔjԐ~9R         $Aɻn  Pv=.bENP=Pg 6ٳ㏫|$Ewbe߾}=ztcMCZ"XD~E(4pŊЉCHիK&H}"7'_f+KKک3Q,vŴ@ Yʕ :0-xRQjwϺUԥd~=SHW}][: Q9sCIKʭGV-M鮻 4&@߾ tyB| y$)* Wn7@T.ٵk _9b$Ӈ 1KoK #`o]βY*ć@ҌR'S;((ג%l         'N   bŤ.$={ /ԐUTѓO>YfOPp sշ~}/ Ǐ?֭ w4lX(dB!{Lڰ!NM3@>ȷ$U&N<3U{O@ [^=W/woh@KIڱI+i,%DX0tQ=-P4r4fd-8\ާq-Р ,@@@@@@@@@EDi1D@[}?ɺF 餓ⶩ4,7o>H&LP= > ;[wd&P?H<#-_.RҝwJ&]r7ɰNB' Y^ ,Y"͘!uV᷅ @ZVMj, DKI DzcQ୷ʕ.  .fΔ:c =c c= @@@@@@@@@E DYS@HCo"E41nzQʖ-ŋ襗^Ҷm⦝4${bŤΝ#_~~8٦M(pgl,͛c,_K+ދ2Z JղeݺR+ @A 1I;6i.Pa,)$!w4[O@ VIӦI]ZvF [ -[r;'#         @* p@*u R`ڵ._6W·;vhi{kŊ5g䒕*YdCQʕUJC=Tul'^ No݅ ƞ{9u]6m۷of-[ ?"-R"IiU=K %J"lIeWH$>s{n{νgy9yl~̜;a LhMۦN ڷjUEEq+n\ [) 'ҥԈď6~}567l;dF#2wi8&Ö+WsvC1ݻo޼v=5˗]! ," G}kc|{/ҦۚPmپ4it8\rtks1)]߻vOk_hcGN%`1gp->)" L4OxXxys_]ٱ=crc훹vED.J{ J]ݼ-ȇ$ @IJUV4V_~ 7N,u'Y+ Z.N.QbyXM d]v IRLQv:,}v+YW'ݻw[q~)4ʍ۶mKeY۹s'g7sdAR(?Ei{_!cOw@嗢bŊSOE)3K(a(dֲ%mѢ4A=ʕuLB9?@By+Ob1s&яK1D;vmf scn+EPW˷M1nnmpWx%K0" p)8$+{LAcs0_0W2<ˍ o  /dYn?lD@D  p]߶;=qm Pwhg|]3(翙ƙ֎׮_+cڙp]3m$ T% `Ric8ɑ#B#To-uKnǴdh\ɾGBeLefǚdm>cKF{H`4>mpVMt16o3r"A8L/Hi2 Az(m" " " "xb̛7n*y(HrʡYfd* [P#7`^'afNizs\[.ׯo _7KYV^5k`ڵv۸q#(IDŋ[DO9[{|rhe˖M~@N^7pR&'t:}і-[(+ $:v+R"w4ƶt|+L)(nq4;zy P*߳>,|'j /f,]QH-j{ǻ߉D3j ]=@6WǴ;㸰a}=q\[8cz-mPX1}q퍿m9mkc G1C(ɱRp߾hgm"^oJt+",Xvn޼n[`*7co-&E{+ZcҥK۽+t=mF;s~{1IX!WsNV6wh7mڄ~)&wlS$w.Í vq }Hps1M<9Ȓ1柗^z=`([|]ko\og{WЮp! ş5Y7@ׯ_omn9vO;6;rw]BwO;H1x#?=tE8=m"]N=mȱ}I[ABߍ zQSN%`4IׇHzXD@D [ly+6H?:!1 L>{WhbƍQ^=P۷-1m4qB4)y]vIu\`xb,[̖-FIr-T*Vh 8 +W NOWQHsQG*5yUի1Z]Nq &xq{z)?|Z$ 31#) /0շ;`l&мSR Aƿ܅MD Xd>|؊[alܸnqEݘ)+=E\A& O[|ǴOr-q|qC=E]($w7 ȉ$&׾pO*9+JEѾ@6Ƶ+{# S_{wO{hC\BK\=q5*m\љ6ctR"իfbLh_}>Җ쳱n EaH@wc+ <؆ d[Ys_sq9'`~.E^y8Rq>>+" "Y-<@$:+Oथcb̘15k( Ҿ}{m @r2R2: Prɘ8q"[x≸ Э[7OƬG5O$9wmҥv[!)JXjUs9ŷAa!F1N R(ȑ#ĺuaÆvkРD=hS oL2 BF;LF +n 4 JTX*!HRhm۶Yn7 CB+W.+N! %|)B.9  Psg6۷oONB%($s ҁĜh[VZu0޽{Tpa+6D!>WPJCtM渲q q"h,=0EfJ/P/}XDgpa%w9m_shW]A?~".AD8V0klQ`;]"igy],v)ޞ 2P1dH=9NHSX" " oodX*$9NFb @IDATd^}UL09ѡCwDe b~G={68몫B>}r pr7|ӧۍcEׯnkFJMPt5Vكŋüy*'R 3n-[L؉&;V`&J2Aq*{" } Ty78TB-L2#Xѐ+VXm P4+¶)B#!wdž|@޽ۊuQ'asS"7qEJg?rʶlK'J/H[qEQ0Ƹ"U5\DN@B,hW|m #]HҶv欳β6Z'iP80|8p啡=#_"؎"I˗/oi&mh?woe˖=MǼvt{믿ZAR+YoqR]`Mq|y1ڬUh0 8($eHr" " "m-ڄ@f$]kTC6m뮻 @͛)m8 yȑxDVZo"MbclK qŊ\ˉ@2عs?)7Wdʕ?moE!>l+PBynzj2 PD *kc(PEO? 85p WP JĚCabXmr(F͵1lIX;{ o_ `t&Lu둅 bѢE־R.h>1XI撑xy8&NmJ{Vja͚5QV-^o:rAe`K+8^/֊WD@Do*" " " " " " " " " " " " " " " " !xW" " " " w=P~zUrl:p_~^z _}ƻߨu)u n۶ Ǐ)SV}hݺ54h;.$sf)9qD+ZD [vs=7̼I4-7B~ ,0ƍ+V^ PhB ?qxIGObj6ohIreϞ=7ny+ IڵCΝѡC+V,IrldE ?3[*T_|1z&MΦJGA)@r={r%@=De``&P6l0M&LʼnL"hiV$9DC .YNӦM\B^y%mA3\x}pQo9E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@M@BFE@D@D@D 6f̘>}`ժUׯ>+ؓ7N۬8b=`/^ذa>#3};QTkpWdɒ 4O*ш ]'<%em\+itN`b咈@6i4)2嬤RW\d̘(U#ߏy#nڽ{7)Q8[ZxQϑ \ ,)@Pti+NҬY3?Fp>*hp?Hƍq[GښڵkY)!F0/O M:}1mFAO1ׯy&] F 0r"(OQonܻw/ʔ)cE7nli K1a_EP2>fϞmSߣ(dVE0(,=k"f'Znד9GE@D@rH U!6=." " " " " " " " " " " " " " "D!" " "  o> 0Æ C/bŊш*;v,۲KǡC /`'LS~S6_Jxt 9r$z-ڵ+nv+rݘ#Ѡ"TW*#D&T ezlY`8 S%ɟOf&l:R AF.TF9 M2ɓΫTpkԨʗ/;ID E)Iw۴i-jIZHP}|^E ֭[nc(R0Fpm 5j0bRˏQ"K`ն-ژ˗cmAP5wܾ%Ɇz̈́L(_/۷B hٲ%Zh͛[Ǥ@ P|6mNj,\ d.! :D]0HS""=)" ",Rdy_ʇ$ A&T^D@D@D@JlvEa:tKy0#{wߍ!C+y`J'1b d z[n ~BWEhVg_~e̜9N}Dݣ}{ʲeu> ktz5E *|WStKcG̷ܹ>Sqb 'D L0wap\c(ҬY3c<vM2 P\ܢSN8ѤI+(IC}Yf> E# 7 'VFۈ3f̰6fҥH,O>䄣x1x.LހM.Jp0f@ n(P,Hڌ˶[2eR-'ެ_㫯 hܹc.]t2%`I07TLFRq> $-" "E[)hd *$N֭T1chN$f/N0@ųx"9wy'xp PX&L'<'~j1}YԬY3!pa Ѹ1c@ &򭷀KXh\#@`4A/:t@)D*N,ddZ1ѣGcVħm۶`CN9{IJQ/_'ڍ"ADž^Q,(OՈK3:ըV 'ଳbĘHD["YD@D@D@D@D@D@D@D@D@D@D@D@D@D@R@T͸-" " " ^$@; ӦMd_So׮]vԺubУ[hի믿={Ě5kOJ2tQN:F$:;>cU`t\1w./%Ъ̤dO$ϳbwl0wdUD <>}J,iSL-[{.D cbDo6lk K(o?Bؗeb٢  ˢD S@(IOmFنd[mJ- ۚeۓmP`\uWSt0{lG} 4w}իW^0 ĉX [7o(UNJˬ''" " " " " " " " " " " " " " " " " " " A H2(ڥ^~7qS: *`֬Y(Xk͛7?{׊@zXb~i.\ S@͚5_b„ V,rʘ8qbBqĤIC@yɏy".xG#L`T૯A"X~=N*U }Erlۛ?<6m\4d Bڵk:"_Aٲe3ˆ@g-[nݺo9Pf_۷u]KD3 ka30o^b_N#p]@v0b""" !|r+EÆ !C~IR""syE駟bƍxPL}ݬTWt}([,l=﵇:uٳgc袋8,=ZBy~}UT\~9fMREFnnjEY?э,ݻNફ҄N̶@D >|O?4>l޽˖-UF4>7>mO>r|?syƇh"VȊunf&F\_|9r$FaӦMn\`Y EXfXvGq;U8 <Ȟ@u\)~' \7@Ϟ=M?*;62N<6)ǜFecmWaጎ-J̐ĕEYh͚5 =ZԶF*]mSD/H/`s@ @p+fAp)(VoGÉGF 0w\\zJ/RmOz6mIQ c3 W#o޼HFL\v-|M\2 R`QD1uyFT%Y=s@orK$it ,Y#hଳo6miR<Y1In߾SNnD':fVOayؼym?NO>+Vp, .؟7mp8bG?` 'N(tkݶo~]PjŊ%ezVmȐ!V нqԹsg# k> 9)1'w2@q9 9oY~1|>Kֱ0K &A.]0x`;ڽ{w\ 5XcmUYv0۲t\h>2f% ]H18‹/T0+?ĶF<1&@~g@.rN:)m>r!*$d$ !d|ʓ@ҥK+L4G3F~{VX3vopj)Dn< N}│D{QNh+O %ezĽz?  |)p=_%br"E`TDrZ|Qn!%7jŊy!"(ԨQ#wqXtJItZpΝ;䔖*U ^{-*ULkx j* ek(M6W_}P/۷/4h#q:3f̰F<!Ӹ$ZF9=, ,,r!@ڊ*PcGy$?ztN9裏m:7n_}UplNa[mXߧ)puQ(6ؼysՂ Pnݣ=J\Q4'5j2υXN  AFBd' !dʟg 8LONgrg3df{Eu6ʔ) lٲ8cO?#GDŊ\NQpرd=FO@PjѢEx뭷0l0,X0G(ºux_ y iD,-mڴBwqGXka@FoѠ}ň@O{0!s D.APȥ 5MV˧|@$ ܹ[b?&L'V -wNwBM:5C;25t?wլYd;sLCuڴi[!Jc O>ݖ9}aC3y7RC^{ %KcnN8NꫯFuTR6-]tۼy3~ /_/xӦM={6FuԽH]ԩSTW^y X!?W\qڷo?~!va .@vz7_myPxqZ -[laרQЄL?wy&M7l߾ݾ _~fX6w={bڵVu޼yhܸ1tR{@a3jdgȒDs~#O%J'+\zD98d3<|(h޼Ѵ{4x%`kFs6%ܹ¼S3Ce岼SHB*7hX>лwo; Ǟ=Cxg(*Tnۭ[7+2 6X9|x≠(>ƬtQ80 &Oɪč@@;{2kR}ѶH!z%_뮻EdvFzSOYzaܸqp_`#Uc‰S\f?cbc"1vD1P,lL8F 6, ~-/8(vm:u0`ێ,>s&`~"0™Ma@߆/_yͩ[(e2+N&X|DXH*U F Ufre\nMND@D@D@D kfRs;fk֞cN3Iy31x޽{^z9IhZj9F,xJ*9F`>Wzug۶mNժUs=Yd 9 Lbfzaȑ#|`[c&}Y:yuv_Nn2F(I8s#c1⠎K׮JgԩҥKFF4Ŗ r9Fi֬}6[bcWs>jԨvmvϰɌu])R3b.6h#i5#f!9PzbͥG f|6c[:];9Nٲ;swɔ=(z5P wqȑ##a[}8wkO6]U\ӧ)kjzٱg3`FՆE)F<(=|#ŊsfiӦm$rN>d{?YՍp`LIS4HSd1cR+K2ʲ%:6F0K:*-W~xj{kF =,#rlK1c}7lІcs9c!9F)=PP2cNڵ3ö-yO?J22q{Z(6ވH)A[@y7iqVPهmk¾e33*e񱯟((#>(U:sH.~C?i/|M΍7Ν1m$lL~L87B!YŽ=ö>9~]n| TEjPorraءl 6V=Hⶏ| {ׯcm۬Ƥspi(z^rF㺷zk꿩JʶӮ %lk,o3'~X'n9s4Sn>@xdG$NzJ@ PWp-}'RmnH$l;}S9b~6l۵^k׭[)SX tPX`ͪywy$랬1E.:JmB2cG^1dʸ<>3 ̎=k5w̠ }'̈bƌ6bzСCR=,L #I("9بyQ-s6 F,nsr" " " ws /1)H@ByLD@D@D@bFSNB l[r%(ߧo+VɼfONNw^?4\pMT` (2cL;=}y '~YP5]09i9mFp0OJg4p!I٣]s g&M[w׳F3IFרhSO=m߾|(+rl=aG%J`83s/XTpyE,Xd*S>R \`9@S&-E'O@h ";U+gy͚5}2Ko;/3?C7.)mf}ދֱw @\{w{/e/n[+q4~;_ ]{ưʬߐ1R Mݺu1bt!Gӯg^n??ѦíDEuLN3n\>ϟ""ign'9/s1X߰m+n S_s1!+,9T{:KcTw}iq0H&ðf[Ů]mX%C[tl"G9oa0?ɉ@ H2Z9˗G ';w!n͚5<]N޸q#֭[jϋ/zN6mjr'UVF_E:_h*T|E(Ĭi۶-(t2E]E{b˖-o`ԨQ`ѭ[%?@@#GX17{^97. R5U \H|z5`s\{-L\5J۰a狢tf)37PNYZG}nرcH ņ]Hx})ܠA,^z+)SJV>R!*1,5,KLw꒛g\"Epۆ^uiRB ݻwǗ_~iErjΘ_`{F#9 3P е@@s-_<3w\#>wqGdIȂn9߽W]~Cfi`j\k:El8]T?Ƶ3g]\)'R6ƟH+VE怉)[b*U|zmYic7n`Aqk׎9߼F/]eNd[>uֵ0 P3 Qy7\M A8Ċk׎UlGD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@# !XHD@D@D@bJZjgTQ 8ϙ3wuWy7qÜ1cFǾ{+p3'']pG`̙袋 &L@6m"l8jѢE8qbPI e o2M"E֯_o7oF=d[f۷#w'RHuSN:v+s+쇃<o.HzqYgYAր"?3/|sɓnw3pׯoo шjƅږ3 =RK.wߍ%K /W_}e;<(:2E+{?~Ϊn<*^10Q㭷s?@:u9/H2^#b)ZA )Ei@Qz S".\fqϞ=\w$l`ҥm:ۗA*tlӱ}@47=LKkd'hs}.xp?.b+ݺuXD8<@.\l_\ɳIo,O=9BGC鱇PxlY&ݤI2d+P4е 9!ܝ;w)pu+XE؆e["9hfx\yVܑ9hРA;Ѹq㣞 'G͛7N^KQaS+W( P3Ceyx衇2ѴiS+Wuֵ bSCa UR  96l~=O6nhRJ/"e:]駟#(曨T_/Alb|޽{VWzx;wt;7<~Ot۶mX|s6[FKAp ѻ7 c#  #Yʐ.^{- Rĭy"YE7}}NãՂF1OBF:O{}GB.R7n0h2@'``q4;vLv"Ԍ;l`Boe@4l)8M }Q8`?'?JȮs*n_$D9)4ޢE KюN{9#XX275+ ;p@|GVȞrO>$b6&~L(UW]eg͚e~+~m#/Xhέ:Ϲ|8׾{s틻 ty0=SWbcOY9.6u]/ڱB yq,mXe>r}N0"0 D:d'#o}?*0 Tb-.:u1pÓ4yH2'e]/C b儢w}X0-#usnr" " " " Xj'OLjA@̙ ΎiW`9fRc&9F{gyfzf2cܹs;_|c&Zrc n93#h nzYAIcWP1S{0bN "ZxIȖs6m#0a2~# `]Lj!ژШc&I;]tqjCٳCNŵ^vz_~ņkfsZj6 vcl^cfG|tҎt̄?;FΆô0˗/wy65ߓOLBtʗ/oqz)'_|Z#`atc7lͅ !G#X'k޳w8F9Α#;L`=Err߳gOLjo}5ncϟ?$a@IDATO8F*5#bώ=su7|cDSN8+WuJEs`fYA[Lj:7tӾ}{k]Vu?sjv:ugT 8 :x;)/S+^<)ԙvǴ۽M69-[tN=T{*ګ}m1F7#)R$`{K ?گs7g̘t 0iCh0cDCf dK?ƀ3F˦Xbwi%AFX1H6 Yff?kFدj@By7!?ᡲ'>r:#gf[}C}W8i8:sε}pfˆg%9r[KM|,, ,,^qYB0aicv_X`SlY׺tBCN=x uTvyZleDLR cpq;!pƍk<1Fd4q@C3sL&82 8E6+vlò--w8"'^#rbB+ Fͻ v~L9i*.pի#qGN~D1L=-1c" Я_?0"r0B3zf6$if=VX]vx4 ϛ 0- #ʕ+aTPD [;=z4 4ip ySƎyx޽+X'Lzi3b0 (ZhH[Fn9 t3FҖ#D5hsIe`D)PfMVAl .P630qbfy3v<۶mˆh:co(O\ȩ=۹s'PejWCn#~nF_?99f୷ 3IHz6+ Lf=6+߉(woAb'Ur0}:ТEZ9X{fsGAV|=`U#8#}bРA0LbD/߈ANm##em4#AvǴ NOpMz 8u;}l9غݫ ?FFZD*D'`DaRm6sqRVP':nnzDEñ r,*#\f>5٘f3m[pCFژoFdFpڛ^f(Y2O2FX/2n۟:U꿩NS-Zi~9A7l0OIOdF}ɓa~oiOf#="" " !0xM LD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@"K@BD@D@D@D l{Q8qb@ݡC,SԿ+zXzp^zaС1訖B۷G1n8)ShO2 -lٲ(xˣ*dM0h]v`PjICJt=-^ y'׀%SOge3 .̼PMX&>ߠ`_9 MgEYӗ^.+߉hukh!~r`4P45^㚝{K.bW}ufE4ݞ=0 K_XH4R"SsM7\s}k^v)RC8M(LSHݷo b\l⯍5d _FSf?L"$!;icj3" " !W, 㥗<@ @XN:$3M67w g:uK۶mCǎQB| ?Px(:t-+HF=O_|ݻw/F:D=dvn ȗ4)i}̈́K8cӦMN,sqٳ e;~pnj4|F iEc=ΘatM;xUvOLvdׯǐ!Cl{B6@f$/M ?t=S9D5 D}s{Oz|ߕ+W(&',G3+V@qe .kYDo0dcb<1Λ7ϊٍ=ڈ19ꫭ`y 6m2e[,&@Vʛ:U}tUD@D@D@D@D@D@D@D@D@D@D@D@D@D@D $KڊKD@D@D@B @nݺJ*3f ("Q|y|gF(yqb;#bΝvm݆bŊy8JZ"?>|I|'hѢ-|5kL'T7o?m]E4k,PӀ>}G iӦn8e .૯&$pV:<cgɓM:+A߾}[o$ipi'?H OnE۶m:]vV`$!3Dd E &Nh7ϟ^x!w֭[#O<D"A|L6 9g+~CÍcor" OW_3 )ڼys+RGE-kƚ7nP"QosAٲemmf$wOdMØiVaڵkѨQ#C-v5hBקG#dS7O*" " $0@0E2v%" " " " " " " " " " " " " " "  H20]Xr%."l6*aC%\${{5qƐ!CpWbذaț7od1b  r jԨ0yPBO"L/0 > Zl%y .Mf й3@9zy=L] l\w]o+0a/&5DA j]=&~U@=l>K<?f;ʕK—_~ )0R|xlpkf%^KL"]WԩS1edk+VN:Ϸb|{w3%y)Bʅ?hg~g,Yڗs=0 8c k_hk,YbۈMGvO>&`X_aD=$%B"J`ƍM9kl7E)S&)07 @2Ϲ`\&MеkWU0դW 7޿iߥYw^C).[xҧԈ. AWE@D@D@| ,I6|R 7nlFY[4(\/?`Μ9={cѢEA6mXAeˆ|@ ] P k*U*yAj@0vm A1 ZC;SvmΝ;X01bEZqp ȉ@ضmܬ4Aa۷B VlECKREWjMfŐWZ… [Վ;Z!"ED3 ;Lk|PM9i.- " " "3} =}?{w/Sg5Kv^-k(" BdM YRʒ=Y}~t_yyfsvs3o]y~{,l)~_ų>to޼9}csBdZf F^ d`;luA)BFLapʔ)¤̭]yqBC4Ҳf}>0Wo׮:t 3}4L8^ciRO>H'J| Ma­3aG|Z@U64DQ`j*``}();?`ڡeӧO;As @w{M*&4I@#֭[:A<駟 .8>+VJ*H"H*鴱éߴiӾdɒalc8X *pas¨bH'wa jM*9^i_~?h6a'm }£H h^ua…μ|r={r9dɒH4iK.6lp}0 \߫PUsicsvڶ8M7߄AFZ\$p޽d;#e=$  H@$  H@$  H@$  H@! ȀT H@$pcK.gy 1;nFzϦ1m40$fȐ!x[.T8s N> L$ jժ ⡇BLBM~:ӤG65fZrZr@?@@aÀwjs!"@Ѣ@ʔйsH`Y640a0yUv: } @تaLЧOG2n@~dC-4"YN("W4-[#ep,RX1'K#I9 D.poμ~z'̇Ν3)1p.[KAl[pfϱvm(^g[6m W{\1X 7ƶIKb]w-n;SԜHHd܄p\{x1PM_~q– P;l ]f2cxP&B^d2F> Ne#y]3qa՝h8y>={afP@,$ H@"] 3H*̹`)) H@$  H@$  H@$  H@@|Pd|U_ H@Z>|^ڵCNPpᠮWla0sM>s:1IG׏M'ouB!/\ҥKvڨ^ޡRay/Z=̙{"K,I&Z* )mz42׭{g'O5j t| Lx!P_}&T $He%..4kgݺƍ0@OٳNF0& J(T' *h'OTc x ؁A{-CH vL FdÆ&'& E=Z*Eevp%@ʔWFC bXM69Ν;qŤ0Ȏ  e> 'Ŗɓ'%۷; :r䈳ٔGvE9{U,WA/o߾6!lg\8e4 & Ne//_>I& H bw7|AAF޼y60ݡ4q9hP"o;~giӦu~C=%~GbWZkm9zO 5 (U 6 &adݺ0Io?h~fQ*ЮCNѣwR^7̾zA%}V & cJ&:GҹO|̐ "eu1X/{a3$8K,HuѰH aN9_|rЈ0ݑ@ 3;ahٳgJ>}6mWض|LPye]q޺m 71IQklS>Θ1c Ko{1s0A0QCNUNزgp;p~ܰe˼rܔ^v[nuwb2@ sf {5R5cAgcZk狆 cOⓀ; \^|M s$J@$  H@$  H@$  H@$  OQu$  H@8B2qҥ8s)< +B e6vN_%K3C1 FN$0Kq/\Xn6l؀~nq (\0뮰NnMOv O8-n=~)l߾ݙYu֭N-[81D!EL )_W?fh7N3˗$?0 ` ;fYfu̦'"G2{f!Ç_7:t q=x`wGnd`7܆-M@p 0Tm_ܶm_E_n޲n[ "rB~"jcyO2dpγ}̐4}-023fI@5#7hwvrK$I5xmSyN*oٞ2 WS pP}:'DǎWw9 =`BC^~&?ugd|P؊9;@,\(+>U`jW/`H{0m_p4-V &ȗ/ʮF,0{6Шc10/g}+?Gpߏp q'RxL<{?}H.]?1RNArI'Ha2< ?3ԝޏw4c3Z(?S%\<6ŻqqϞ={Mݶy)oƤI _ 3sۖmѣGݶ#jy/n6h\'f33fC'WB{y{=q>;󸌿޳{8]uxܦbsuN]1Dwc<:Ww⾑ɶײz & DT)A4EM} Td.9k$  D(`k&Mi˘& H@$  H@$  H@$  H@$ O$  H@`0 zjg^nّۜ9sv g[Ν;tbf{^33ʼnW ^lYgΧt[bh@ȝ;wseGJ;1,᜝w}N ygQc'Q֕cyAn[~رcMj͚5ѹsgԫWτ=)j7!CÁJbW&UڀboalL+`~NV@VvDzyॗ`ڮk G&k۴6\f͚k M,4 ``HUNo_~~&)v>ݙiOrͤ=3ğvpN -G=9}󸅷}>rf(o&Zz0oG3$ HMsC!y"uކtv»a[) 7ͻmq>6m<[N2m[ܶngݮyaV֍ށ<_}cl_xm4Ş@  {њ%  7m&9-e{ rwp[Rwf޲Menl3َ3tPu m%F}tx˶m&t#G?XloOܧ6yQن} Ǿ`HtӦ@~\k;Qݺn=U3 H@ :(Qhܘ'fӻ$  H@$  H@$  H@$  H@@ (2> E$  đ;رLb۷_>܂P vBK43#23|$0qXΎ_;g1xx *?22k֬ދ~C߾}D3;O&ǎMv-g~g^=g{t;!"G2;ݹ dB>2D]fbcbg̘#Gbȑ#ڷovo(6t0gc6-6;~<ЩL+p睱_9A:0,0]I5X͖u:!;c&E| =۵+`L(w JeUˁO r5q)}i7!n(a[Au<΋x?f.܇7}>[owv ؈lfȊ;L}r?םw}woǞ޷nHu ZÇag<v6y};N$  S6cnQ; Fv% ӸVmw}n=/n_>mJn+ޏY~waUt/VD ۘac7XWS` ;p= h k-uglSvjlsn6cyϙm'D ?c.ljm!8{}h,;mt!lo6l'6 ɼ|^,[J-BjkLqJ'P_^aI$A|+Jey={>݌)hηn9U2 H@…x{\}BV4hH~ ښ$  H@$  H@$  H@$  H@- %  H@@9r s!i!n.޲;~Ei3ft I !k@Αnp{51AvDw yMU=T5AtvЏ.b|5 &Lp6lΝ;J*NBDz.M}&xug`:N> jՂ "mZOx1PX(Juˏ7؉:-Zt;JV?ʡ-^`Fvm}qh OoCk >%]>=)^~9'*W={n*|no7o>}-ށ]w_ݽCü'K p17(1C$  Nmws6m{6Ż}}=qo13+V O@@ sul?c3l;ϹvmNϹ#OMmtx}w9l7gx#$Xwv0o_HzBsWBS_u V M5k]$&C6\!2K@$  H@$  H@$  H@$ (fBz]$  H@)SG *ݰ":TzĈ3& :u6m8a7|^ z7 Nƌa۷Ä6y&頼mpB iƍ{(PCB&SXS P>o*V :$݁]wU-a$ '͚DqT`0ϻ[gB$ 8p2A;w@M@i|2E¿ |ehYE09 *zK@$  H@$  H@$  H@$_Ɨ$  H@@dЪU+X6l@jPϞ=;ڶm5k7xU)_2g*Tڷ=E,A_wK{K(2?Ϙ?[6ƺu+p@@" K1]k콏' 1Z9r˗6zuۙ.jD!?oC5~jjPmLH@$ ';[o)26|N H@ K;j/z/k9sH*p%9q^2)2P?$K@, 1M@\? |B c^$  H@$  H@$  H@$  H @ ! H@$  H 6J(>СC/lٲ(Uƌc:iBR@`|Qb,P!}[$I^q}|`^g?k…6*/ƎaJK <-f&+YX)S~ "йPwl`Q @}=mmI$  s6re駃*$ ZظxU[=|5QC]ڮ^UdT>g3~cէOT2$*%c7#G&3gT$  H@$  H@$  H@$  H@7P͍$  H@$ H*:u 6`Ŋ(Z(v&{UV!O[ذ|>v?zI S&7k w ԫ<б#p!9shMGvZ r{>盭|-Sf+Wb3p$^9`H[nyU`GZy}M$  H@78t0ྵ& H@%z%d.o8ǵ}zj 9sD^L}þ9h .d $C oubg=kꚂ/G}g6lY&*m\ Cpnԩٳ@Z@Bo,o^Gm@ի߾?ܹ+g:v4% l+$H\ 2h$  H 8Cv@.@XY@ <@Ϟv#^(:up۟};'sTܶ% H@/p 0q"P&PL׮yM*m/  H@$  H@$  H@$  H@A@A)$  H@ 4~I!۳g:wO?Cݺu1sL\U> l"Q"Mla*@1~6π-[b`y'i%~ɓK-T@Hh5h|=y3P0p #в}_{tۦ7Ip`~Vfώh+0KnQk$  H@!p<Ьݏ:44ZH@dɀW_6 9ȕ$  +ܹ@@O? _|8|!+5I@$  H@$  H@$  H@$  \+ k=H$  H@@ѯ_?'rʔ)x 'kv2$Hx `r7ʿ͑#|ƍN-u 0trۆX'SsE*J]Z`@ȤI-/ H@ر `I$ `WwE%K\ҫ p$ 2e(wuZuAh z& H@ڵ@Ϟ@@6!|3\ڢ$  H@$  H@$  H@$  H@FA㧦2K@$  H@ `Ȑ!طo>'T… >Tڤ/yhBÆ@/GXxD gNP5-K4Rb#>oan 1vz{krz |+I1R? 񷜡 G0a^j/իoW/w /$  H@ ,[tbĸIC yr_?{n!`dMm`TQ$  H@$  H@$  H@$  H@@=/-- H@$  H $7=(q\֭CJLX+Ȟ=;z)ocv}-`\bv`hE K/Y1 [4I .In]A`pQԗ)9K)e>v=f}ZK0 ^&6 `8cL~UB H@$8 ,j_x)J" H@Qț9>GP!˗-) \-ϫi[+3f)RHFA'XtyFkԫI@q([7kvKzB78u (WH\Mɴ$ ํAs<Ix9`j>uVo/J6jJ@_/Ӧ m'$iSL>!V$  H@$  H@$  H@$ PPd(~$  H@$ #dM!k''@Np]w|[ZΞzcƌ2e7mJƏ^%cO?ٙϜRXR([ֆߞVKmő#mͶڡ0w.@7[_gX/681P(p}@26hwZC` 0ooF lpȨj;{Ӂ]g.8z((k0oyuilm/&E7{^$  CcK:v>̆sM$f}=AB8 o=x" C0q ,ʗ ̗H$  H@$  H@$  H@$  H {Z$  H@$` I?>FYgeƌѮ];t0 r力Bi18uv7h6 H6<oC^z)bڵvf֙3nb6{R%FӺ}wӧ /PTvNf($nn4|q#p7ZRs瀷߶3E|h`& -4m -˿8{$VZe>} 4E H@A§|e87h|W%  H z.<<T4IV*T$ߦ[vlT_ H@)+ ܼH Y^5;̲T$  H@$  H@$  H@$  H ꟰' H@$  (2"ݻGرcqaԩS;wFڵ0a8+6}3a=mg+F~wmӉT~XXGlc@Ҷs%&> Ν ̘̞m^=T v۵ۿ ߢ~~ w PT)jM?hhhl4e˖ tU[$  M@A~ 1LХ y+੧BZ$  DA`n;Ҵi@&С62 o"NH;X t='ؿ>vRS@ :dc@?VL$  H@$  H@$  H@$  ?lĿ\5$  H@$g9sD ?W_}gϢnݺȗ/ CYh 0(_0Vl._x={i/7zQVM +Sve#׷r%0k#mVRr#S&W uj cg~!r&; LB~u}WĉU;km|Ȟ0g߫i߁㻌?p Ц У0~> *?ڊ$  H@!"73(2D>RUC@4u*0g=Qm.\j`seZsT KUO H@#A9b>vPYs3>'z~ ص 6 UKSI$  H@$  H@$  H@$  H@ ;v զ H@@P X׭~I7?hd0C$  o`D<93{@Dի6X4oA8@  =f`, H xuu@lv7^[^5T%  H@$  H@$  H@$  H@@ (2?cP$  H@W@AU8w&MB1iEM!qI& as rX`'+@ƍ@*@6@F@.G.]Hyz:R Ԩa;8TR 0x^ Ӟ}szɃ|g-Z؎ [~a8 @ƍM0I$ H@ _(VB^=;x CxI$@}js Rz} toȔ X؆#ıc!o"]:7 zQKm#}ds 7ŋcTf H@$  H@$  H@$  H@$ԍ!~$  H@$ жm[^?3ʕ+_|ٲeCnݺ* s]wV[͛;&2'^}{fM; ElpB 3@$2; p d'mhkca諦-%;0nd P L3gO9T #"@r}%{߇Wv*/'ڵmF Zؙ\ſ9vgYcҧOg}'uO$  H B+:uZ!$ kx^w$-'vbz > bNt@mv%~{s WL`.`8ǀY"E^u6Pʁm(2>>G$  H@$  H@$  H@$  ܲ oP+$  H@$ TT _~%݋={p뮻Pzu|7|?mDQ wn `^\xMwm!ro{oW$ 0yhvP۸̚= Z"pk[gGuAoŋU%&m[`V`x`z}X,7fjg s* &`I[N</$  H@u 5kœO&MAM-'$  H@ddgp3g?HޠC:HWu޳x̅AdԅyM.]n zMw'񩧀nv옽s@bVG$  H@$  H@$  H@$  H KW9`iCK! H@8q>(Y6 @@ 7/p4`wv67 ܲdA׹-xwcg^J2j2J@$  H@$  H@$  H@$  Ķ@ހ/ H@$  H 6F <8驕;wn̟??y8p ݋'I#]6Ϗ~ gym;v *TLw:u&L-[m۶oaڿSDq_so[v$EթStk-]6nK֮d`ufNj?nvp6yh8[g8;v, o0iL~=СPpvo,Zwk`Ӂ~ʖߋ\lCU[- ƌ8իѣ֭{]dr,& H@@ ,5I ? 64-ه`6ml88D$  HW {ǁ|YwbǕ>x$&^ڸxZ5 C0v3H" c7mF}șț^ڶ ?`D35j(2(>\R$  H@$  H@$  H@$  I@A~f$  H@$ p=ŋc֬Y8sL@Uf׮]سgxߧ$IyXdp |$ȑZŠ+JtĤq7ov{٤:5j jٳ'yt } +WugժUNC/>_|^z% 47!l6-*Z}͜Xh泱aRL^&ojL./~hr%ϖ v_8q09wD}ZR@|)?'^*[6 ]7b}sɓg5]$  H@$  H@$  H@$  H :i--+ H@$  ={G a>P\rj\)RpB֚^nk֬qy'HSN&TʤJmgʔ 9stKcƌA֬YMNڵs>rH=+O<:&,eʔ(P@eL u: ]儸͞m&Mc) H Vwԩ@60!u\޼04ɓU0m6?l@?ْ?nzkB/ \ @wepu4iʩ;$ @P[Zl@=;0I$  H؄!f '}7PPu?KqsGl<:ko姟5d nje %cHYRP$  D&`f`G ]:{| ]sݴ^k>(SH85y H@$  H@$  H@$  H@$  X@>zU$  H@QU&-?78zkF͝رUTÇ1m4߿;wFbܹd8VZu׼q>t p/^xMM,wܸq{6l~7 ʺ$Iॗ^ҥKMG-SL^MU|ХKgL.UMAoY~5vX'0UT;1x`5Iz~zNt4>yСOQF\rgLL9r8ő#GPzu.aM2M/=\Gӧ*U}ŋ?~ҤI׋-?{u!Ck,<1#ШLpCƍP0A@j;1?{^gdf1d_1WmY {)*W8  <0б#]_%di0z6{};Lt,?z-gLO[ 8gd7/lߵޮf$Zi *K,qw}/UΚ5wÂoپ1# H@yU8wJ(a:D7kKy~h„ ? k sa[Q[ʁF>S\2l3ym)2e 260;ᵘhY ah|9PxUPՑ$ 9ɓamxsT#A;qAfw珸 ȳga\w*V:%FM$EKuo+_9ܜvyiW/ﶃEqZL$  H@$  H@$  H@$  H@/y"Zo$  H@W`Ĉx2fʔ -Z#2Q OiOao}($]:[*Lh`\= 6i5Y6!׶S&ws.XfߋG\pEc`jժ-qދwݺu_@oNLpj۶<l0}&Qiʕ~*a8(@rlR;J}SNSNhٲC!F7ڷv߯[ H@@dOuy~,0R8Š+ݬ-ju&mx'6w*DWMϹp`>Pɧ~gm)dbԩS}7F DGpxv0(I!!*\\/sQl_|סqkxw8W \r 1JƠG3 rsI9K|s}˞"f,:'R!1f% x">f00 h!xN9T7 [l8~<R5%  H@$  H@$  H@$  H@FtXԬY$  H@$ @<]{Ltڿ*Ubtw9s^ [nsk\ry8 :yl<%пժUYfԨQs&y;駟[1!ݙ 䒪l@L,xRx~9>&kwO߾OzOl_3:u<zٱz5ʢ5ߚz<-1_7ټ9!賔$  H@$  H@$  H@$  H@}q?J@$  H@kFq_S<6Я0c=p 0g3@Y3UہJn݀ _~i}_.1-6 ؿ9رö) u;nt=7Q6mڴk]_|E.\ikD\&}רFھ}{SDOg+W?Sg} wʾ!# H@P),_ιw+۶mo>Ғ%K-vw؎F-uQ3H$ȑ#3sjKyȑ#{wp D|a ;fo穲^9NR%  H ҥ/֯9^iuWF|W k^޽{dӸIPNos άnn~f#H?c8C:aѝ *u9xuRH T͛U}d;;6j԰ϳC,;hS|y`b>̚u1N9͉v y$ao.?`/^ ř9!Mq Nvq d@d߾=3dSOـя?x"rl߾y gX\4oQ7wu{]s̉:u`̙`9>3qIIѣ /g"n}֫%  H@xp_-a`=,[ Y_{ztRIrQ[Y;-mn,Y f͚``ߨ|,G0O& l'a$ H@h 2a@Ϟg<>EAT@+hX v {/h%h5j5bcD{A,(ذ!Pzog,<3wܙ3;sS>  0X;׸q /GWw nSN* B$518u|Vk/s (Sg@ @ @ @ P4?ʞB @(&K/SrRe$9gRC䁥5JSgΜjԨQ&wLDzȊ<[Q!sh0 YpA;2T>}v@ǎuw`Pa_S- cǖXtN2euVbX-,c_ I/jbٶm>wUF7~{;,5/M% Jhl'˸\VrM5E?ȑ#- (lNZyeiN27ߔf̨-ZJ_~)=rQi idWjNp3h]T(V,tҋ wm_@ {*GKgXO0hdVϼ, 1H @,t_m)<#* @O?= \z N$AHόøZqcs~yya@d @ @ @ @  ǣB @ j'#ri-?k֬ueldUHgqF&I{%XN;B f{졡Cf~Uy 'O> ZYwun&͟?_=:uHiz뭷-ϋ1QLq C ANn&`:skd܆;oqiAW%1w4kʦm<쳵-WwEÁJ'J*u,n ŒTJSuŧ(_v{pwO׆odռye. @ @ @ @"|>:  @;찃ƎKKz'ԦM Ʀڵk?x&ڱf# BJI(C>`‡Z+|V,e Uァ ƪK4>p3j\ rKC.|tRҜ9mE!ŐDn`X/mHZ rf 7DЦJ_.9*H.ײ?z+vn;M<9k#`Ymb7߬Z^۵Šڮn׸}궥~R`fZ~3v=]ke֥k@@.m=T<^uU٠~oA,1F_3Y:]Gݪ:~ |=!uh44$Q-dGuTѼB '>6z]:r-$siǘ9G:Tr_$~ijEK?DJZca!2u_1DY:{.V#zi<BfD]#FdE 8cݻ/^z) ¯*d/JU`ig">&w/\}#il6U EiZn(n]Ȱ_O.LZfou` k[(OfA'>N}p usEZAe_.}xP5@IDAT}4 g]n'8aIxYm׻C:lArsQmWk6iDi~l[::YL6۪)YZ`Km-* +j׶ӧOZ5% @L9ԧO캸꫇>z4\}'+ 2pWM\[o5Kz(Tk`#F.{m۶D}Zjc=D>cgKRP m%Lo @@$kK~0T}ݥ7SuϼJu^KgΜ?h H82ڴiSz״VX3_=( R`s Z$0cFlžQG@ @ @ @ .D˟C @5H kpUhҤIW|o~=yU:HwqG^)+3wQ {v{KW,$yuF}yIz7DY9R۔-CWXACzu֑6]ϚG)ӥ7vEzi0曥\r|'pB&ʬ.BT1_|Q{x~w(Ҿؖj9@(<>4FԶvΖ[ř?:'y͡뤓åW_eyŹ?:O S=FR˖Ue@ @ @ @ Gd;1 @-kB }[n-r9z(7ԨQ4cƌyHpz쩾}[nnQZk^zՃ%'0{v~C2 "]6JԺvbHj|ɷ'!P_͝9sY&NDO=TSľy[l6i"sOծAn~|;oG٣ŏGKy{(|xXR}LX? @ @ @ @@"~o @<F;_+,t2)Ac9[oӧgGm Arp.⊵RO6,#bȔá͚,\1dnz P|tOKg% ^0?Ł[>ScکSIAdpiuvsV_|!'}tő_ 5_Zi'iąZPa N/kM @AM]qō ~jE708rQxBz1⊃쾻dQcWvUk &O}֖>sgxe}I&q;|G @ @ @ @"c˚!@ <#2fR'Bt3}bnŗJ@j@"Z1B:0/, @@:uԠA&,h-S&^Jwqf睥]vv/-Pjë{k Gbc>>fh @ @ @ @ PA,o@ "DMWO?;3kѣ&6k$/B\9*nӦzEIdα(|-W*;H(}(XYF'RK!dO?~9VysI٩SGFIo{NsOi Z*QgBHK ^|1W]Ufic֍) @AVUm,9ctWHcx暵Q @[N@=t,X];|~x00E۽~xe駣71N *m25{L-vzzm5@Ѳ}ϣFE'% =ݶ- @ @ @ @ |!2_ @"jG+kVwI!E~X9fLviܹQ%ŐISOHKfϖ9G(&}uw_*D:PթIC(LrTvp-˛?#zhA~{T7ސ>f ~QZqEi-8`65[5, @&2O=%  M"]v*J @J>" uw_ eOWqɈҬYqФJR G4I$@A[;6Jq_^=Zď~ouB @ @ @ @ ,G!@ "rpp:un]wuO[ajܸqՔ9s ib-7I ٹzrTM;LK颋G|Z=kf_iܖΓ':XdmC\{ܦM5m˥SNNꞄ ttR˖WKV{C!@I_ N ǯh!A:k)}0fLHGvr_Qh9v[os- <8GE)嗗w/)|-qo @ @ @ @ $A. 5>@ $Dyبt9Kg_}_~Aɯlza|I򣏤oh4YG҂ܲMzcFIG%-9znS@AA:(4rԈUWbH!S!No/-좑Κ%tYvi}^ԑ##^ZҦJBdswd_@Aqw;(sě@@׿֙g? }gkWʸ}`.^j,elJ+U{ut{,!'A(IŢ$||}},YأGqvmI @ @ @ @@%[  @(Ed) ΝGyD O?fu#*R'~~[,2"-C!=1X7._ J:,m[ꫥvV?F9q ƒXWZiAkKW=? HȟH7b~XNr㍥6H @>@YG錄M(w.Zu@L`^L;Cٚ3gj78Q{j]JSץ@:I[lQ7PjԨJ6[#+yW޵ԢEܤm*]xaT@yNw]X.Z-w-|Wy~X @ @ @ @"jCˊ!@ $0qb 6ϭ1bsJIWr P>c]wu[4m4^0`vBϗƏedlrƒ$2L͂5j'$w9P("ඡHvsi̸?>5ls߾Q󛅊k‚o…#c[ҧ+JX5_@@!pmJ+;7/T=|ygKg %%0}L~<@;Y`> yt_ 4Ht !9jժv%3O>>0&I˩Sc5:u]waQ$╼)OQHԼy=v ̝+-lɕ-WSOI'(5 vL+&Q%>%1d*,r5=ZzmiԨ<}zNq07 ý$@@p+[FdYE=ړ.9GZak @j L~K a]7p5*)vrرQxfJl6UmMkm\8OJqcɯts㍣0Pd_2쫴 |9Z~UvȽg!w@ @ @ @ "H@ @ Xd 9o7c`ZK. !"BȻ;!ˤ9 j" !$Q8ͶhQRd.[zEwi /:z%"qt] 7 [Sz=]_KBx6m$ !S,2M 6TXkA;}MJ]1`*9S !0rdU5=EU- wKW^)@ @ Avvw4va~*l 7C W_uIk#{,E^% |!Rmshgcc>\oʗ} @ @ @ @@@LjB @KHBU:Qwyg&|we21dyB`iĒH!-8{WZX+t˖y3T`L,qt-R%H;T0էH`޼((9R.+Xd#wq*;edD~yvIQ5i"o.s-x,h6# D}4Ԏ;WX6k]v{ΊҲFH '@}t9f4sfǿ${LG@ @ @ @ @* J  @;ʪO/L!tŐe۶R%V @("G)Fe%7XMZzn\stRÆo-t+}m$@򏀯ݟ|R|/|Ciy<.Ǐ^\J?/tᅒsr?ֲ,w$?wJ${ts߬YQh&nѢ&kʶ @ @ @ @ Ld}>; @ .9G*O@"ILoY_Ǝm6hRF `jh @y+I[ҥĉQfQEhI [v$5n\ cISOF?ʂ:v,]KABo-^#G-xKC{5Q+̝HȔڴeϑ.U,rƌxvz̘Lʟ[i(TZri(!@KND3||2{w_X?I_% I >w{sߗ,B ]GKϜv/uuT@{E%鮽*=[o]oq/  m( \|>܇f[ @ @ @ @'|6@ 2Խ4ztY0 4tP 4H":Q!cњkHF駟&Ec*%0}z Kb쯲c%I_;y1UZVV{?i@i8 nجJՇ-,3ϔ.X7v}>餓JWuք eLe_~>Xi)dCTZٲeZzJORH_Zvi`1It7F@ @ @ @ @UAdUPd @@^tS魷$hRZv(J@&_oQ'OV~ m镑=3݃]*ʠĬ 1 OE~M-Lr\QzAΕnA:\㎓N=UZuպY&Z>{4|x$ׅ6pgHK-iތ{kCEZ YV^yeAgw-mO$$uJmwK"}|~v;JU N+N+)i@d7W~,(t\ԧ> -qsOn)އ @`i_vth6݇ac*==#͜)]ye`b)lmw?Je6?LjҤ)!%eIAp|~ot6Io}W;njB @ @ @ @KN䒳 @@p@WXjC&0g=4hy 8l/iڴi!s`[5D:6,h+/,2t2|$,LȵBA#~uҥNw]:F $w.ue&},ʲ|+-17󣙘$a/n_-[.>A&-9OKZ,1>OJ(| [ Y?U}m|A92^+tғOJ; ]pԫWׇ5B+P7I\o^wI]$]uU8(<0o>\jݺj[ L%6K P6 7fLlqZn(>z:eq @ @ @ @ PsAk@ 285l(WK/*&k A>;N[ou&g+ y2drˊW̻Sk)[HgF%IJ$Q!u 7H\"M*}tiG[}J.+@*G}_MM@BN}yU2׃}tH/|;H,]zEE|ݓ˒.]wQXu?Q~ɿ'R5zϑ @ @ @ @ e e @ "XY]]&w*Z @`f{'Bk֭ Et4 % !^瞋\/ @Xh!diQd$ҁ;ƀu-t BYYo.X2E:H/ǵ""n@0W{׿^}XPVMem」`Zy0;+2 "sKO[]^׊+JI YZ~fr$Irܸ(ݰdW'y-uv9  E}@a =lFWZYS+%MHCT:K۷ʫ !@u@7)IJߏC ,|tiBO' (=H<2vy qB؏<㎅_,x,}~t}޳1 S~A @ @ @ @ Jd}=7 @[n:8(u!Fv79Rg}{rkՠA]}:]7 P|mIAIlXiA:D`Fq9ٳoB/' !{\~}$u7K͛/sjE{Q>IiUyL5o,"W],kڢ0K,zr%|g #s_Ċ@MO2$^aAl/_5t[z) m]ԛ@p<(&2 S9mZq-BG߹L9fsΉBbr%ۮB{uҿSjoa@VZhc[`oM4m,  @ @ @ @*OdY$ @ PCz/ejYδdGw뭷[$@ˊ?xaQ%'EXiغ.,IT3}6 !-rp'KG[bvǬfjV#H'E=YqI%}AtʔbQdGi<,\eXz+$Id!ҬYq $&xM T W chݥuZ|Oa ݾY @uyh-=b,־?bDz ُS#~/ő^:?(<` pK|Q=-_o=Kb @ @ @ @ @YyV, @  .W>{_o;3fhΜ9={vg-DtkIjܸq&sٲe Z1+Ë#Բfk-Mjɓoըm^ziyDZfeԻw c}D/|%>QrYSJ?Rgtz̜93Șb:r4}J٢4r~ ^LS;YzY^6ܼlĥמ$3i^&MAi:͂yBir-$\ZRV81:%j {KwE?傹 z}'}S?Ca/K}L=wZˆ WA$Z ;Ԩ &28- EsEG~rIl$ #dҤ뵈2W$tilVE`@Au퉔S"ӾKs{:߷9O'wMmti˹s&#ssq;#M4{2k2M~+CҴ[n8))s_f6^H") ^d '`Ѡ£9s=]=ے?=iy9Ғ`)W\x?O\ϔ^`*sBNm}fjS>Hө ~l`Cqr֧݇ߢEn7s;1=tKz UAZ}>Zď;t()zF @ @ @ @ T/D˗C @KHWHC|$,klݺBASw~ 4՝wn{H$J$==9_ǥr0t/믿~vnݺ9K POXkkܸqAl&Hs˅ʎ;>2-im:;вd9L9˒'+ZLE-)OH}ISHIDYz)2tVdNIRKҜt VJ|lȷ|m84۶m^%`W Q)}zL bHiQ_~NEJHKgC%;OV#|U3I$I3䐾(-LV- CnGXD;ixO)+궃/md7R#s%~{G)jo"S#k7* ᾪ[}, ~'M=FnɥaIoK}(ԯb d_}U|9LCj}e9Y$ o,*+-}(HGg)S|R7SZ붾v6[ɺ}KybTOԧ~ WƘ;R_Un;Yj?7}z=h7LTnn,r F &ߜGV'^̖Z䘪Xɂ &d$ti道6)3,ֆXB<@:bGxF3,5tfYҏ$KB$'L/_:`ͥdUBg陃MPcQ:'cnN :g͚ KLtcǖD&Y)3Li)dEpHI `W`eiР# EKǏ/ݞ 98%KuIJ+y"BN?4;gYmQ%!f*H׵\{)_kJd#onPEqIDUZ /iFܛđ[- M-x:8ߢ4[z"J ۆItkbJ"7YąIhJy:׹Lvǩ%ŝ=|rJYIJCr!,v-W#.Li{M; rK^? T -x`)NG+%y[toc~YPߥj̚5ҍѣ42xpxp;4 -yLOpuU԰Xg"A @ @ @ @@@DŽA @^p3> Q*LW^Lf͚-kZ-t eK[lvqGNپ8|&`镅E xݶ AIIJp&`P{YTcTg L,I\c`]g L,# K Ǎ~Z,gI<=!hXiQdz{:[KJ*:g!~EKՇ!b;6=? eovwmҿ7|.- *Sq䚩NS*7~a9D]H@.MqESDj\{/>_[hmFprDSZb}iJ8=krnyti (\{q!qc.ON퇔ݞtI[HZ$)dpt,`)-`uk2u!֐dB뀯 ]O, Lu i XHoq7}K9Y^e>=9&A}w{e}\3%s5 Q dGmBo+ )B=H}V~|nNm~;r 6@ݺu*˿1L11}>d\@ @ @ @ @Eda/j @ &`? L ,) l^r΄w14!(2<&V3y̙?0httM As=x;3HvCzٲ;vׅS ϒ?;j wigIh}%A29EZlE2Ƕm%H^ZeyşEZ,P$@ XniG}=8%KS!uRkK +5MhGIs <)/C|j F "EZk۩WN\.$@@9s=e;+\M3YXV[o.^uZ#vZ4pp_-%g*O~¢x'ʴfhv7Ύ KϿ2kIt ׸qђ$|ti;ʐf@ @ @ @ @Ada'j @ %ࠢKs^z i]vE{,lݺu[e+nӐ!C2 5Auvi'D r"`>Qc8/ qt/R$He3)% P,"XieɂϥS0"Ӵ-a "c댿V_@ @ @ @ @`1 \ X, @ TokV3!ŏW߾}*D4qD=r1s1:#B@e P X` HʖLy޴iӲ54i$~Y!DfH&Y ,_}U&0&M-7I/TK!t颮]epH5CI Y 1K q5$r8E^~GJ7߬ .@: [2vѼI~ A N'"fa'WTfm?ꨣP^QC[zurnX`{<ҦÏA[l~_eْ&@GZD`Asy~[-w MLT˳]vz4|0@`R:{ gIC`VSoF_{"+[}Ѷn=g*=˕)|t_S} I 0Uѝ @ @ @ @ zId<4 @?;O6`LrxUVշ]z~駟tj!(D Xpg;3ey< @6lZ+Y~g?H2> u329%]Xj7i`${ĥs֭27KJ! ѱ9Vܗ,ij+WEb"Iu%]w,'}糀x}˂+lᆈr1$y331 w[fm{: P,uL\Ly}W|O͂qx8R{T,-!W4I%k+TKu{L#v}nZ·e}?,"u44Y%7|MveO"AѢ0-s;W"t6N4JrHJ E<(СC3dPM[gXkYTP,̷,}+C}OqU`.iA~l@ݪ /GnZbҤ=o8lEGm'cx'k @ @ @ @ @@YC @EGѹ+k맿ݻb.੻K_|q&;tgfҟʤ>%74r,[?fBǵC)w54E,D`jRw}(Oq|Hkf&ձXyM7ժzQfϖƍSyƠ$t\5+ !K ":p,r賅1mDQw~{NO>db׿d9+bE=I`s/^xAf`wvmբE2?L \M&w:InXL7lL Pt߄!24y]* @=%yʤn:[+-sDnj2[v&.S;6L>Vn!(?zgكڧO㎲}G`VwcذaYo=rp=Ȳ۫2Yh* &?Wg|eb0U7ܾ${\Ttך5B @ @ @ @@]".M @@>'xb&.g}4p,R>]pc-s ÇgsL:-lNjժ}, dVY\܉'G}TP,z{S_Ν;g kϵlWXE Kx =c2dHỬ_}}~TS^sM}G˖qԧ2 J '!y ] @ @ @ @ @UKddm @7~LG]uU8u_3ٳ([NjE}h֪ؿzB`ڴiz>˪G rchT[ eau[ Ijۄ9'bgΟMnZv_eۂd@p_mݦ[oUcƌl'Q PYsMx Bxai^91*V|;6NrҤϹ,;u*sB\ts]yWg>?o d|0mՂem]& dMd (<ӦMӋ/-w5jT&0ׯvuWkVr+uBQٰ>OYW%Xm"|Iyz3QG;N۷ͪm)L|mдΖZ}KBsBXf` 6iY\dIjoNj۶X E^KV1f0Cx~UM8{ xZ&8zvc0z @U?Cp⴬\Ȫ RqTHm${-yy:7›hLA(\h,\K@  Xw%vpmow1+M2Ez /BxN;4u%5O_vJ?'L|> SD✟QB @ @ @ @@!@YG:B @ ̛7O'p:]tEAtJ&&̃Ջ*8P$d=R~pu}iĈرcv|,fmԴi(W(4tP 2$.߿&lfC)/Kh/lܸXըP<<> b5t≽ս{,&A@ ywdAcǎSO=Uݺu+=(|#-H'O&N\ $-T1lQdyD|}k$iӢ4H˖,tҤI@Rp+W dQ"ٲe6YԺԶmGԮ]Ky]Z<鬳+18uϯwW_+2[:J묳Ne>2/:4hy`iELWGg>"A@ "H fbk~&Lk]3*.(  f1D% wƞg{gNԩ)=k<~Ws+1arkXsms# ,X(|k7nxʧAon~_tĝpbvv|@@@@@@@@@4 2;  @: {/ѣk׮XU~{w%jۋzc'{GLaeʔ鍊([hQEc &wy7Gi͛7K/Nkyu:)QӱRՇq.;%t~I'ORĊu&߫K/wYΗٜ9ff͘mulO[̅f؆R\@@@@@@@@@   F@@$ |ֺuk܍5YNup]QeʔIwwm+^zࠃ*6dž @j6Zx≩Y9kFhs pitPu.+g}e]VB%lH֭9C$Y! Ta Tx~\vVGDYg} Pn'wqTY#N T",E^d          @BL(' C@@x t^5}t+]tڸؚ_ՇxM8vm7;c7E/N^O;.\h 0`vݴX_h.c´xw3ϴzB:vKKGн{wS Ie˖٘1c|Jƍ}hTː2e[諯J]>m%\bO>3ϥjF&qƹ🝬o߾RJgKA[li=~'3MXPP.c+X!X!1L@B |v!XӦM5JCO>7|_åu0]_v=]ӧuՆ ߤu.;6>         @z d=B9Di@@@ 5m45kV7ܤA1SZ~ق }>8I!|_QGa/Pp z4g}|䭷jg}>~zw-b_~yZ>ʗ/oOuH?`3g7j*0*:SߢE|j*iq,*|w5LNixʕ.c-_N;4OrE]e˚BosԍzhQDꫯ?cuN2fD٥XkxnKh?=O?bSqIVWT \PoB࢛nɇA{kl UV#< Tm*;+J|օq (KdhキsV5Sĝsaݺf5kh?h=Lf!m3]'ۭm۶O*2$o裏kj:ww`XڵB5m6o1*HQ۟{kZ<CpcX ,s]3xY}qu 5PR> P|6\=g:ONsLBo;U+Kud)U´+*C^ӵڵkgǏ.]ؠA;YB c0@@@@@@@@@ JI6pB֒^{-QKd9   PTGumtw*ȆW_ ڿ/eިQ#L^lYv]fͬv6ylݻɲ'&hDag Q٩Ŝo&♎Yj")W_}e+򩧞*2*`7 )>- 4it޳SMzjsϢ.6k|[o4Í7]ǎkz30A47|sE*e>|.^3&m9sXOWд:`Fe)\s!Qqw9@ ?M~ 0%'wQF롺%u%:w:\ʫ l&;|7M2eJF='2@@@@@@@@@J@@)aSLQ,UѾR)h,t _>ŚfcWu7&tM㏧mߠAL״iP| ͥK/4m ln2xNT \fvm_Z3'|b-Z0^RH" Tp3 dI@t @ S iOE@@(9gv7Aoqa. !I݈#L˭uvW.b[ncz!駟6}=>4~>F!O?͜96mdz/p~˭_~[ nٲeW_0]'|g´?g{뭷k/?o_+C{]ƫCN;4_{V@E/l:vvM 1j(f&/߃ԩd]kU]߃~cƌǖ]\uUTJx^{VZe]w]g̘\cooQw%XmVɫ(/(+:N4hmfW[Iumu:Vu裏Ljg^^Qѷo_?lf1&WToX\RUQϿ9r5k~z6w{GAu]s,#U/(HBt @ (-tʙ 5w~c2ܱ1c駟ڴiӬf,+R+oFvm7 DEf{7!|m۶ۜ ;ɽ]jfԩ-fpx b\LA${sTF֭;]&kb}Y. E5*E_==륺[u_C(k-# pC(]qTv^JF;Uۙ rjs'ߵfZW2q=B]]3O5Zu\/y("         vG"@@@  JFpH.]"~䩧 :lܸ1r'Gٕ]@dąo1qaps-Z ۉz"ժUڐn+v `w>.|/RV-_ΦMFj֬q!9I 0<qaȔn싸@9{/| ./₿Hv|.0{Mq^~ ~@ 2,Z(BZg\xYg[?ͅji.0}nРAl=_~zLJ#5j #t=܍P1iҤ^+h{<듅 F7nQ=8}H׮]>3~B \WąhF\:"\lą%i?|?mi>bq!&~ކ F\`cݰ_WT)2͛7/BPTl2re UO~=s".|C]g5ߵ^맹͈ s..{. .Hɮ]/~&MI/%^SN/KTGujOh_ӴPV u}!VgԩSz]vzًʰd?(z`„ ͛7Gbw&OQMӲTȳ_H^xV}((G5]VCaf5ڴEi(Pں;ȷqPttL.146IѷI·vm$ҧ+*U&kwqF"Tp.!F֬뎑4B @5g"ٞuNPµx7"N:b]Nd;5k]"|]UX]}4Q Su3}+hVG@@@@@@@@@X[#8K  @Q y睑+)EP\2erOu*$R7=?̯It)NF >'N*LAFZnT=ztԻU؁w%~%h]tQDaYЅ@G? (tp~n,"&ji@#GFr8.*DЫܡka?6qٳiaBېW}ry>fu knTdj׮#dwԨQ~7tS%k A6t{aRC3 QQfU}1ci!Roz~s==pV:uC=ˠP݁sV.]9eʔ*Wq)\pAnOEV;wc2$#}AjO)GAj;v_a:xx֑XŲ㤦#<ҿk7cK8oxD~t @IPNϞ=j۷oхR{;Ajz^6z/xMKykXa_P\6IѷI7=LF皺 'D"+fA 1C @h֬YkMxuN ^o;5uDSs_o~\]-;V{7-֭[gGu ><{DJ&t/nٲe˶)d rbŊ {h޼?9CEn4w~is7O#Fof.lĿۏ0gϞm.|\hߧߌg_?qEUV쭷2:f^xa]lx!V}._SʕMw_ϩ^瞦L]˖-,vu?8{ZA#.ִl՝.lϮlٲO4;ܿ;M =oə H^G{Sa?.,տs|r_5ks13l0ٌ(rjW__1W^fqvZsզz"w{u [uoڴp ^:0F^ˋ5=Uqj]讻2l~_6.wq2R9}&ԯ\/BR@ma^EخuC]/.C~ZwێhYB6IzIgOuzܯsMs|6;sج˕ٖ-9_ @"k8jMnj{A:SCReo0]A׺}k|ّq],"         1AfWEA@@HnWPІ ү߼Z͛gϷʯOʔ)XUN¼ 5;蠃o<>SnzG>*(r…oСaR0}={|F `?lѢE>\U!4|,x!lcSؾ믿>~裏|v4lU`叵MaZa wvou7fѦC) S6ӄޚ4ibсTL/n         @& IeE@@ EmڴAeɸlwq }w'Z_I7}9}ڵk瘞:u ? L{WM*U 4ݐtٳ˙>}!*:|- KUV֯_?;lƍq}&g:SZj>'O?Cږ&ش`aÆك>3׷nj>߷TqYs+nCTfus̉X|61!ayP R`v6m1ݩN^b~ѓn|֬Y#ؐ!C,=6  t'۪U_΀&OL'NcEϹ-.!G†8F/H [/ESQoD9z<azi05k'箓BXtTn]SXs9t\Z)X(;+gCJ@^L'7xcIm5C~,4 |fK[O$_ZE]=9ǸX\_n0ۼywq~b顰tR΃:ȏڗFՈGUN+mrG /Ж-[f O?SLV}PA%T]aӸqc\>xi@  7\7X{&MG"܋OTѺ)c1:^dӵ裏>;˙~񖫁K~}=O?ΧjuKrC:&YB UK3#FXa.1g“N:׫9f >Ķx*܅Uƚsut}|cǎ oBc̙.ǹnWc͓iGtL>}(IʕG}4;>=!NvC!EG X05O^rim${Zxqڵ~+Ar}͝l @F t_5dc!vju۩jW&o㙖 Ln~ٞk|-/,X`<_2!         P, 2ۈ  vy>mŊ?r9X*Ulᦀ.;lׅu*(ko`z衇La{ꫯlРAVzu?-7 GH ϛ6m^شiqvW[ǎ]ݻw7Z~K7nիW:u=-Q#;V2|r}7]|B]M)4w*w}7 MaVkʕ+{ZB ;ԍӛ~!&~a?W5|~gժUӴo)CfC Ƶ }\r%&.]؍7h_jm۶- ua%Kh=TՍ3\uŚg[~lÆ sپkۖWoEƍsUܿ;3ުU|RQG+pKP^tsp:v QO|0Xt뭷>o]6vUW=cv-r5ʷ["V B,l?o^6g TZ5rF8㌈ >Bռ/߮]ȷ~=ͅD6o9zsg}s|_ˬ_~TF\cŊP QY]:ti{mdOD5jp!~DkѢEp엩UOo}]Gk%.}i?1rn+QyVZE)n-;S8jٳlGyd>ٹs \p?&\tEmv R rU-cH؇Ֆrw9s\`]w5.*WLq_Ƌ>}uyruZp~g7DS]և{DDt]a֭EV,qA('|_cP{@m1$sxu5]q^k\? \:'pabiI ŘЙ{Hڵ#GqDZ @jZʒy}[נt= #bxک{6׹DSFĺU,g {+Vbwy.tqҥ{         ;R"+ҝpBb^{-!c!   P.\M4\@BKSc.d\ \͛7֭[g.,*UkךQ\p~2,Z\?x}% /`_}HK`ܸq悳7l.\H2իzy{V?\@]N|nmS65jxoGxh7jUTɱDpa*ͅf+Fm&Hs>ͅ%(I_VB*ä`s7@o.ݍiQT}w?vBOSj蘢ߨ#]nʠD?6WAmx œ̅owqPZsX<ˈ'z0ӂn1bD[ZjULfM>6KIoAQ򫏣fˈQ_C7C Ij0iFPH@ ߗ^zvڵ^=Zu_uAq4d,3Iו{~?V=֩SL)>D@}]?DLʄ(TU^~Â?ѯGL4ibÇu&z,@@@@@@@@@(%   P}ؾoQ+V;ftk9XEo{`0Or`n`%!KQ>(*ڵk0(<ꫯ6]#袋|8ˤ8{2'{=eyR\ҮK|^tʇ @Z Νd0[o.+[6{`QXP*md/?lgav~/ uJ/,@@@@@@@@@ JE\pB֒^{-QKd9   /Ν;n7n6!dPƒR{v1 /`K.)6۩cSO=eF B!o͚5KrR!ї^zɶnj[ K/}?'O7> z>\iӦUXJ-Й~n6ilРA6p@Kfb3tD.̾+4`~ š>޴iM YRQ@ йaL_m'tht h[w?UW;EUV-u @b(C=dۿoS ݶũm?(mܸ~;l{?0.         [ u  $L~=zؖ-[߶?afA Dqoy HM3738   lݺծZ뮻c~֭LI)S|`/ 8∄,$W`͚51c{gK.A]v5;v7\&,vT@Aj߷ɓ'۴iL%ph.[쎮ϧ@$O>[=`ҥ y}_'K@tpjuQv9pjB P} 6m~G}AVZejղ:lm۶oVjU@TΙ3f͚e3f̰?tjӦMsֽ{w;C[d)Xz?6}tQ;#GVr!M^AK*O!V@aƍ7|?`=yB9Kwڒ/0T?M8?CSeʔnݺ1& t  P/sꩧj}ݷ H 2N@'уp_I2ۤ          2@@b$i&[{=ӆ bҥKLY~f͚v=B D"/mڴi>PLs~*Ud٦Mkժ[haիWOjyX8%U`ѢEG}d|Bz*T`-[[NCڵkT&;O?do1jwҫW/S~;H&L`w%իճ\@B V8ިQ|pٳ ]뮻r̎@ (TQzԩS}믿ZF|XO;0TR# @?~zH~gw?\77lO$#G'5u=䤓ND:x@@@@@@@@@Y-E@@} <^y{mРAv)Xٲecm~g裏+.Ri)N`զ@B*N%Kv6h^7bV|b! ~C'ڵkL2֬Y3kݺ)!_&2;v;>iҥg:u& }"_е3g~ׯ۾j+aÆ)KE@ M(o…8УGa9I 2b}:n8,D!oҤ!ˌ-$N@Ai/'W4>oۄ         @L5+B@@,Zq:tAҍ@7Z`>LO?}>γSO=vyCaK --n0po6oWzu{M*0aÆW.]~:|w?)XÅ 5kf͛77 +4g=H͠ %D@7J+RN }Vu-;I!O>K#f*VA!`iܹ?tСYRУBJ*Couz-c{-!@h.l^""s|ᇦO>6nCtcz񨭫i˗ϐ-$گްa߾hڴoz\N eA@ 5ׯ7N4ڨQ#Bz`MTP!5b- Xr?5k]*Wlru=PM3%"        ` KϦ#  l-[7)o߾֯_?;KT%Koàtٮ]d, PRAdsf1/>M!hѽ~ \t)\O]*U `I!KHLNAZ mڴ1[\+V!Raa cw}!;wLh\̄tcy ڧve˖mcbw}w$[FR!~?ѽ0W_BըQ*/7l` ?~M0>3\vG '`{&p/sތ*BCDpB+PO!uߏ?h[n&O),$W)nݺ~XvmSgA ^awW:R^>QF>&ހ<իoV[A7ϫUVN uR{g D׷MZgϟʬ^al֬ZRR-|Du cPڡӦM V=ڥKڵ@ 6n j;(h8wtڴi߸ *c 6סDR2>w"Cd͚5^H݇vC>@@P8gϞ,>\o|c}mmmx|}.yp wNǶma|̅         @L$A@@3vğvuW;]v}^fQϸ`nt5k}ᇦНza={;;SQ#C@A [xԸ#~}[*ݨYfMUøڧ{u٪U+Wڊ+Luq6(#Q.nիWՇ&`FN%Y@uB~>Ww;E9))O U*ݎ (VplTrh"S2ep&MPn%\NA`3g'O:wӭ[7^!NVPf]ajCh\{ ѰZj# S$Χ/_<-$<>X+Wt~} 7n{S@0IB|5Z'햽܃+tBPUICB:kRN@N)x-́          2,@@ `|M4(DQ7-Ӎ!I7'5oÊSY.]ꃙΤ/7)lٲƩ:ȇZvaVnݢ(*D k֬BE*0aEB SzD]v%PӪTb+V^)` 0_~a|ڵ[}իM-[r]Bh 5vɓ[ٜ9+X\Y߾Y(C8nI!ImpCP:UaN!IC?uxtX!%7,x%ѡK'C'#BCȒ&Ln;ͭPH TДvk;@}6DxCk:F!W;"<@ Ps0ẏΩtu52TR C+$Im˞@Hg1U z] '55.PQ 8;uOE]V@ЇP\ lڴ華yl         %] Ȓ `@@HCܤ@ȏ?-*lQ7)FBt{u#X  y]Xy+Wj\=2 C)-uŋ{#2h=!Ramڴ֭[V'z|  ϢC0.]_(P24Dj5mvBKr!qK!^>.]T7~FּzmzkM uRPw+% øusqVs7Fj\NiVapCPgPu[hz9ӹjyl(w5 +Cs,y@ ' Cxo7 jD(eNS`SUNSVul^WP5ԺļUO  U-Fs^tʠ ɬSNvxCؒzo{|C!C0E0duHCB!%B"B#ws%t 'z}>Zn"1s̙C6l=^t =`C]QvDAT;"\N)nݺ!'iY)HmPC}p: m]oR! ^@.Rr] P CfjF_Rx;Iz*sXk׮Vv(         O V!  Pb0nR+NCE+WxWHZJjt PV!U'z!z[BE4$+,K4 S^QC]G)1A|_ tֱcV(d߾f͚D j Cյ hSMS0ԑuc~—44ձt&M{fϞ폟͛7ݻ`Ȯ]p䔀"'vzǸqlfFP"Z§PmЎC)bk jSf̨gw='G#A4T{Ca: `a\G  jg**vdff(=          2,@@@@bYcbQB!t1Y@PHԩSmĉ>O>Klݺuv0!b 9C@ Z`ɒ%֣G3~x׾w v|xFoG@@@@@@@@@ 2}J   x?493+r(>3\٬gO>}ڵK< @^&M _־}`ȃ:ʕ+W$c !ʮ!?n8W^ 6eY׮fKթճB@@ ͛7G}4KO@@@@@@@@@@ ̄o2"   x~+efmfBkֺ5P E%O?{!'Nh?J[_]t;̇~EU<֋ P~ qi 4wyjԨQ0[l=̦M3;")+E@0f͚ى'h7pC"         @)D@@@!qل YG1WPH9f;#@H}0}85knݺֽ{w pz@|`Gq kom#GEYJf>jU)X/  @& (n;/MY@@@@@@@@@@ fPY)*     y<ꨬ^?(+r(6P[7}=(# ){Mk͝;N0Cs9yfo|(dϞ=K..|5Hqcua\5΋+UʬQ#3QL  @[l1=Тv           n{?s'5rk@@@@R'|٘1Y.֯7;B!۷7+]:uaM 96mdSN5)>!a;vlժRr @F >N>d0` :ʖMgsN;jFqRX@@"Xd6}tСCU"         @I $|l#    Pl12%+r( vó!{2e Ħ#i tR` &r[V- U={ڵkAI) @~ ~S{wmر6Uֿl cǎV\V""pڕ.m뮳o9JfYvE@  i&0fӧ[*Wf8          P\,.$ہ    Ph15*kzY&B* B@ 6lI&`HC~VJ޽~ֻwos=N P8ې!C/pNǛirٮh@@ #}Y袋L$@@@@@@@@@@d ,Y    Qa6cFV(!ҬjU^!]֘լQDa@b)pB;yP͛gBvʗ/_,BM %\b==vg[wf͜ivAٓA@@`;÷ou @@@@@@@@@HAɒe    -B2߳c l"7#B`6m4 `yYʕ{vG~b[@ n f/VQ{Ŋf>kv)9  9.2 >>y         $R Dj,@@@@b)~YcƘ-[ff!CBeƳQ @ |>r6qD۸qx>>`+SLmEES@A &؛oi={Lς*>| 7z  D 0bĈ"          2, @@@@ D"f~ r3i' _#y @(l6%*rVF ݻa3`K(" ^]JGkҫFAj[  %^ۤI{K          <[4KF@@@@ *eֶM7eB.Ybfeʘ]q{jevffg3`@LPx?}vҥKO5kZ.]쮻ye&QF@V^л_|aSLL {;&9#@@Hs˗[ڵӼ@@@@@@@@@2] L)?    @ ԫgvYf#F\i;f;Yfu h6|ٺuEZTVhM_n'N+V/l 4ּysɶum#۹sgS(δi5[ZOkܘ ȴ(  &AA1@@@@@@@@@("K6pB֒^{-QKd9   ?{02=D e_BQdK*mHETZT?-BHD}Bd+[&{v|hhqgw^~=y{"?K'Gܖ.R ϑ֍Y @ iΝ;n4iw۰adɢڵk^zU2gΜ @ o^ҥK3g*o޼Iܢ~NQ)SQ  -`?6mZ7N 6 ;@@@@@@@@@HR #   CS#B!OnP{ҤI)HC!-Z UREnyIe @/QrέiӦ)[l pĩrf+R眜@@~wg |xZ         ~%@_=]4@@@@ Μ\kE@IDAT&Om$]{TVD0g=  2e&N腟?~\wq4hBvmAZ\F`]l)S7>-e %5nJ@@F`ժU.46믿>iY@@@@@@@@@@ EJ    $#4iʕ}_^{M:p@jJ *T~[dp0,YGոqtA;Y%KbŊy]vղet.9sTZ5+W H{@  @|b_R@@@@@@@@@@ 2q@@@@-*=4k\ИWR"K&*$=\tTljd@_ KNw ]K,Q 4~x-[VyucS={Μ9S ~70a2dȐOȓ{˖<u# AO^mG@@@@@@@@@ %e    72I=$ &#ҢERR֬rcc4 +WN ۢ5k֨]vZpW9su֚:utRհaCjJ#FPppp@u  > ȐIe          @tAF:@@@@@*]ٲKWK;wJ'=+='TԳb M@(Pxqk^ CvE?>/}:!NO @gİu.)%)#-Z@+ XP;m^p[շo_,XP+Vua? MDؾ}lMp , R޼y#A)|W   @"          yńT    @ ( u(M":$M((!  *%$o/}tD!Q (( qOgM4Iy?9s~;vO@ 6lؠҥK+88 ̟?[  *Zjʐ!׶d0@ ߼y_j:q %֫WOҥK ޽{5eo*RyqgѠAtƸ_ [lG}uU5jp @<FT͛@i*7oرcʘ1c>2>㔏@u  Xzܹ5t>[/X@ӦM>;Nw~%'3}vMy&M>          Lܥ@@@@@"u"wtDΰaRHԻt ҍ7J/ ͝+>Ȳm6 s؛6m\,ϝ;uiղe $@PPTYXءB={VM6U\ԡC-[,Lϴc-] u?.ʭ[jؖP}矕-[6-ZTY(=zT~{oto)0`5kL:u]w.QlΰvxX ى_"^^}U@GgJP-  7s_/0)aaa^Hý9}{QFiĈ^Ν;ό@YpaeʔIf1          'AE3@@@@g뮓yDr2i|~}iTjU){vqc]GvZj^EVRN_U6l8HH{H 2dP&M; ֭.\eꦛnR>}k׮@>u]z>gA۷ns,B ={wﮧ~ZYd}ĽIv }uh`%װK}` x1AFX֙30]{wK6'/{LRq*)9@@$p tҩu˵9߃ƱcǪ_~t^P͚5S Eks#         AD@@@@$wޑ֯BCŠ#Gm7ߔ֮ 'L_,0lܹ ?<9H=SLɱi )+W.uY?~GըQC,,ΖG) HI%M4nc>}XG>cʓ'OfgLK.zW{xZfśRc ;b} ֳgϞ?(λqw@@  wkWΜ9/~n`Ŋs?ShӦ<`#         la@@@@@3DK9S#>E H+[A"m5b5/_>o^dcP^^J/hĉաCwڴiꫯg5kLqv۷oJ*͡2g)Ȏ2dys( ٳ}]o K/k^2dP޽eƓO>靷QF^XsN           @@@@WBplBje" f\N v@\:|.M:U 6j(zZxo-B.9.2BnݪrB,pl޽^СCeg*TP=d-XY^G(P AP-.IB T\Yҝwީ? 5c?X&LЦM~zoۥ? iӦuku׮]8`6^r-^ \.5\ܯoمOV,YB m,nܸkV,3 Q6oZw-Rb7pN>Y`^*J(u֝/\̽k;"OUR%q^ c9ԤIn-8127͛7w.b!?mA6Obㄅ*U*o~٦Mog0p_@HIYhMQP*Qz!/µ-=`m/ ow%ᗸ_Z#         @ @@@@b!$"(I+WF?瞓 Ñ )'[05.]v?/+VL4l09rD& kIhA.1󫯾BCBBH>ha۷Bꫯ$=>v~o^]ޮ];o]n)]wuh[Q_xEsXQԩ$eRp@ ,B,4ozXfsBoRcOԾfE۶?#^xG}맲ez iǏQn96Ǻ%BLrx^@s\I/Wn/Z4"2445kͳ,Bz,uܸqRgPBޘh"uWYudxիuis: Bmȑ#JB!m?zϯk! .Neȹm={7ﲹZtZVdf͚{a)= T.ˊ_jc=fgjժ~\!,pY駟Kz߉wxc -ƶ.C@@@@@@@@@Ht     @r V:tH.H*WN.`P.QʕK.pK..؎}qO|̘1O?MPj^P (QnMG.f 'L{ءC)R :yr+>}z׻: wF w,v̙3gHZQz9s].]˶`iTɒ%5i$/cǎ^/׾ *$.ڳgZf5R^\˧OR9-B?soO? ب~alR۶mSeaKw@ l|hҤOv~i/X[o_ע)'jMk˱c4tШ\@o< Mq}MXP*U7/ЂZc[,|o"EAJ'Ҧ|b)r}dpOλl&7I@yoذGu;<ͽ,g}ݿޘ{awގQ6ۘ3gN 8P_wٿK T"  c%V,t;ySԎϝ;W+WZnr…]1ض@@@@@@@@@@ qL\oΆ     PԭxorȔ%ԣ\ؑt-R.raIҙ3 W5v.]e'OQHH #:? W]u?^I'Np2,TrРA0޽{yZ~tҩtҗ{2,8򫯾kƌ.ȳ|ѾK  аP͚5K CʕK?ݠ KLcOԦj 3f v,v9/p-U= _`ܹS*TJ-Z8nbk֬QAZhxlٽiݼ˶geyqٺuūTRϯڻY8&B˖-=<7ԢE ͙3Y )Q`޽^0c7Eu6lC).!Qe bAݱ-ٳmz@@@@@@@@@W l     ٲI=&.<(n#ծ-}T#Դ4rtp7&էMV~wKRVX 2nADcf-E\:fƌ5n8ZaVfa;v8.Zj@zx@۷vܹ,(rcǎ~a]]g+nv𝀍CժUӨQ뭷ƖoֻᆱWXSLc(o S3gN⋚7o^:w\:uD{V,X7= SF,WS/^|տdɒ7c :o߮7[n^X˝;(da>C m]Yv-ڽH=3\:fϞ=@ BN8p.fJJڵ#{|뭷zR2e.cǎy"&-?]wuEV]}cHSOyA+WTժUo*o޼jԨXdT-ik]KvѣѣG{Ai 6Ԛ5k70i$5l0tMjݺu][geϞ=}?}ܟXz}:W\do)QV_]P/^X6l`} ?p^)P,=|.O6M\x.]u62eY8V#[=ۜkujz'#>].;̙3{Am%2x극X85%[Ȁ{'Vsèu @d}VidFy͢~ލn>fqZ9iޜ̶G-c V.hs_2         $?ߞj     N kV\9E S'dIx[>\W )4TJZʗOJ$(P@JrmcǺzWDH+v ߫K37ofϞC.:wYfy,nݺd/_;f̙] |ۻx݂v m\nWW_}_{РA̡b!ؠAZfmb,1B3fhzw?~UX1{$o pNnb^(n?UhQYplb bn챠_| I1Bm,ukAo6}۶m:r1j(^h@ i!p:t9뿍W^=#mF-<;N*]tׯ~7qJ רk6%-|{ԇ>~keOyq,Ƌӧ{c6?{B-r͞? ynۼ@H+E骫QXwu|y"'|q;ecՖ-[qxv3@R|[ۜySǎվ}{3}ff u\d7wclhf}7׳,lҾ^ئMg3gxE{ٳ{.hK_m?          $_pW|ռƍ#jrךP@@@@@p;.P<9e֨!(#̙4ݱ -Bӊ/uaSJ0ƵvYdcΖ-th>sŴpIO 5ɨDs틬{H7n]^жm MH黱{e!f'N@|%6WP=i԰aCլYSG8^i<|zxNRUW^: ŋ5Z+.C]F.\|wl8v,3j(sv< ߶G~^1 @] o޼ |Λawyo Rq}@@@@@@@@@@ qL\oΆ    ~ s\WD(9+wDBZ0dRr=~$S0M8Q}:+W.jJmڴQi/ݬ })GޙB`ܸqzG#hȐ!J:u,.˗e˖OZPdJ)5q!?']0Ĕe  H3VRE|I4{\٪AïfF@@@@@@@@@H      @B '=DDCҤIAKKKyHmJ~+?P^@ p,`qƚ9sBCCȡCH"]y8do޽ۯMc`7hҤ|I}> (QBk֬O-4%@@7`  @8|N>3ĉ q>3&+"         AG@@@@@ 2d\& vV e֭|PʚU.Li۶ܹs3fn6qE͑  *_];v_p5lЅWݵ}vOбuҥ^;K*|XlO\$ NyOne\fzZaXuԆDyF~>W\)oN" @طo̙3kذa 27UwIgc>/'#         'Abp_q㈚ƎUԃ    $_)Sɓ3? rȲeԩ~oQ޽feʔI;vTɒ%VQ]Je˖-{IH\g}Cjlk֬۫N:J&Ma>=1C?~`Mu~PZ5]wuXW^Q>}d:uJXpir… 'y p4HZhq1}Ĝ@H$yy//5,,LOޫǾ~p7)          |L -C@@@@?pskPH tJʚUU+".d~O?^z޽J.G*423ghҤI8pfΜ\rM6j۶g}V:w:8_ SO=iB|{  `cƌѣ>* lL*(          @-& 3'A@@@@@HV^]-[ ^,\Ǥ٥ʕ}/3\R}٣;SuѲe._{  &M=>} U-4`,XP״itܹ8SN0.]xaq:H <}M q%xu!cƌ*R֬Y=*2dWi-  ۧlٲ+PA@@@@@@@@@X +&vB@@@@&pMҋ/JIH_~)+tRѢҳJfIaanݺZ|N?Ce˖U͚5xKV@  *7|ȑ#u1ծ]ۍE>3裏ԵkWXȎXɓ^ĉ5yd=>>C/^\k׮yeopa SM7@@h,2$$$mD@@@@@@@@@J Ȅ^@@@@@k4FuZHjH=[QCʖMz!i0 jժ%Khƌ:qʗ/jժi1@ kܹڰaׯwyGSӦM5X_~ A섀O/trիWa헯DZfwL{X@-)t@@ Z ea%         $A L     @Tԩ{֭nX>~\z )W.lYץիr pB͙3GΝSJTre{M7ݤ>@wݘo/رcDر>z7./CTjUmܸ /-ko\/~MW"9΂ CC_h  @8Μ@@@@@@@@@. B!    *Pr4u27RbRRɒR|'K}aӪTsj VjT|y͘1y@ ԲeK-]TVrk׮ʓ':tw]n Ŷwnջwb5Ҋ+Zh{woIPJ(K>YIrJ ܲ%INI@@AI          @ SN@@@@@ y \}TgˈҊR6ʕRzR֬RݺҀΝB 9s,Y3f͚*[LN,!)Dowgn;Ι3GŋƌӧOG'pckի_ zV@)RWUǹ.kڵk|l`OÑ#܁7  py /o          {pW|Um5@@@@@^  E }4h7o@@@@@@@@@". :8@@@@@ rZ&L l\~*TFʕl{˖ҸqM7#'kʕʓ'ׯ%Kc'ȇ =z@7AAAQ7nuio`j TÆ 5{'H իy~ \R0XR%}̙,B K>%C ~sxraҖ-~d  #GԩS QT         N ]]/W{}@@@@@7"q) [7v[|n6u]=,D0?^|/^uA-ZP̙5tPY(/썟)ш>N`֬YjРV?OwSnQz|V%! ͛u ZJ~&"         @ˁ)     ,pR׮…K9rȅI7 5n\B |׺ oV&M@ѣGܹsuڎK mڴjڴ-Z5k֨bŊ^cnu%ү@ S fͪԩSdzC@@@@@@@@@'@d8 @@@@;…BΤ3Au~ۤ;+Unu4Xw Vk֭^8dLԿ7f?PO S> b~GoF2eAHǎ^  @i?@A@@@@@@@@@[ |     @2C--UiVׇWlA__3ߓAi yU޽~}G[Kuԩ$hL^|@_|TAZٲ%@@RA)y         $G B@@@@@D K.;$g'B@@@@@ XPҢE'G*e"ժ i]\1L}i8p߯x@O?*V2A>Su?=ػw^|T3g 7}XmΞ|;-eR@@\`…\f!V|@@@@@@@@@H{i     @T{Oڴ)"{weeK)G wޑ֯O ^_j׮]T,LdȐ!:yTϱ$k׮zw/8֭[U|yE@^? ڶҤt  BlE@GL2J6eܭ[          rD߸qرkG@@@@HGJ3fH'KSHJ IuF*W?+t+V?Ԙ1c)S&=z'+W@_СCʟ?N8РA.4 3^5j>OٳehtsӧI~VQ#髯Z@@쾈?~ ϝ;vءԩSǸ@@@@@@@@@@_KW(     $@!J_|!'-Y"5m*wѽT5С޽ jFRt>|(b,X@=cZreR6sG#[o),,7TŊUpa͝;:'Ա&M};~k@@Sz صkWB a%         Z (_UڸqDMcFA@@@@d;ɓ#nsHNI.+MuFJY!@J8QF_~Zf*Tg}V't$(~w*T HkRTT\9͜9S2dHVrz_ /1Nʕ:@@Xxʗ/m3f~dh@@@@@@@@@@*_VF]     E _>CCo,q ;yvIR3"[ ]tjժV^9. 7K,jԨ-_GuΞ=zv@^oٺQ+Wtl+9瞓Ҥ٥JE  )p]w>]\Ҹ 3 @E/^H @@@@@@@@@@ I]ՙ7iX_H=  wQTm*H" ҤcP@@E {.(.U@zAzлo;BLB&fwvvߜ=;3{@@@@?[Hc\MNU.L}?:I~+}ԵӚΝ}{ua9rMGh~ 9s&b:Ë܂,4-&M1cFeʔMco#GʕKҥ &@ :tH yBCC5p@_/7G߾}رc7?~E㉅XzتmK&c{*_W_}d㌷,K,L:U7|[dwE;vt.@xx/h߃9oyMyU_.|Y0fm>-[6eϞ=bn@O&-Z ݫؽ{{d"= ȷ ;lnބ T~}*U]s^ 9sɮ!saDJ @@@@@@@@@Y `>: @@@@@ <2Mt!r8i.)<0Xid˂X._mۦ[G ~kٺQ2ZphkQC$Xm nKZФEU*X0=kU`A*T-X+}QsR'|_~\ =Z53mΝ;/oP= VgF_l,mCz܂\ll6S@Yga}4w\Y0`|ԦMiN޼y]k˂[ƍfZ~{Л,4(r<6Y o{j/>>Z~?D}yA}X8}oM%K_&[@@jڴi;mdAQ]oxvg7zû[`MRH5""<Ү-PI۲k-,ߛn*-ZTEqϰ(          @lAƦk     ^yi cHK6(YcX؅B"lTL0B 5~dahvڋ-[hǎ.`nf!TP`a^ТYfu`l*iameRzE~l0K/, ڊ/RJtnnӦMj]JH,h]S>S=ѾŶiY؊babh&h*"?`= ~ ColpJ/g+V@ [kPZ u)\ v1 xՃy|r͟?MK.uؖhs fZ_>{ϗ#jNzsG,Y\=Ƨ~˖-[`ȃk0 k1/v-e| %J+WysXw΋          Lև!    W`.i ._TBN(|Ae_Δ/@5飏$X؀[-PdA 7Y(BI_Z#+V̅^YMC,T!,sݺunCJYV Tїi _jm֭#_&+9[_W˖-zjYd,D ͳPYon&ɡXPKzK_9u  뚏7Y` 1#˔)ymo$`sѤI4uT_q~kUT8vl,4XY MBjnל9soTÆ ըQ#t,  ?,8{ѢE;w5ٹ29?z%b廩d6Y]sކ tYtލڹM`NA@@@@@@@@@'@d;@@@@@ \)Mv!җ-[ X/QC^k8,` 5k͛ j.!GPn ~)W\qr\.ӂ,҂/_B,,zUjԨ3&O Z>{FLZJxx τW,Ђc-<Ɠ%Jxn}ܸlcZXiZxm6UTI3gy >\ƍ]` MZj<)X =[(mF-!o65iXx@#Gɓ'G?rܹ5YMJmv`{입-^XS/L[z׵Wϝ;L"fϞ- KȔ)SD0TRŅB]zafdiaixVBկ__7|j׮M0$]&XȜ9s"& HG B |,TRrl X0X(e8djc5k֌xPbؽ{ p 2iӦjܸB/X@Ə﾿,[oU۶mAtci $qp &hĉ.̙3*W]ar=fsuv-[6wkav[@n@@@@@@@@@@ DD@@@@H|モzV-~#?pƍ, !<<\9sTztM7lٲ <";vӧkڴiмiʼ5k-Z+ oF ֯_N*{쑅U\Y^Ȋ,X0kŮ XE"^,ĉʝ;/\ mذ/)M4I}ѣ] S6m8m;;w@̡C0 zԱcG+V,q^@2q #Fh׮]ʗ/5j&;ϵ zJV\·xH?ZnBf#k!         TL*Gz"    $5jtlܪ:| 8 >¦MI&*Wl%,bĉ0N۷OJRVtw| W@N<ɓ'k̘1n޼Y3fTڵ] Zd4i5VI,ӧO -Ӧ3gѣ*\> (}U߯|W/qFק}Q.o| ~o3V]0Bf͔%K7+ *p֗9{l0l0mݺՅBZ}ݧ'h}=ZC qWR%5o\5R5~܂!͛d]uUjܸڶmh?hbo ѣ;~X:uRҥc}_JܹsԫW/ k@+)݆# @,pРA/`)RDsNw=eg1e 0Ȉ]CZO<5k         IT $z6     @ |kRttuaʔIʜBH=NkŊ9ZlNޯI* [qvYw Ծ}|ǯqji(p?H hР  S޼yw6vҘ1c4|pM}h…\^|Ew\_q@@@@@@@@@v Q?@@@@@bݗkҤI*Q Fஜ9sED,lرꫯ4qD_uzg*CB=/;bغuk޽{U~}}jժf[y- b}B$bտ^z*\VZ傅9,W&OCj*] 䟍@HQg|avWo;}w PjU/{P5kTTreY:@@@@@@@@@_ ?F@@@@@ H-[5k ʞ[`BR`XuIݺuSbɯ(ӦMS:uTV->|X#Gƍkk A>a}3wY_ b4UTq! иqTD`r߮իWɓ'l{8 $yTB.{ӦMztUW%lE[-nݺ{o߾xm@@@@@@@@@@ aLXo     ='|R+WVhh-ZC|ɠu4Rٲe;# h׮}QլYo]꽼 ZJ77߬9r1djѢSPB 6ޱb}ƾY_>e}+ĉUZ5eɒE˗/םwlULv^zi_Uvmɮ4@'phA]wwݛ1cF-\TR5jƎYfw!1;@@@@@@@@@@ x     @J={n 6LԔ)STRʑ۝={vS+VP]?uBc8v옺v *ȂV,X#FP٘+,`և/Ye}Z0_~ErZjiӦ)PSqXm۶v qؽ{ԩ/RӘ1cTPo5NyZrnVs]=         )] Lj~kv.pYi?     @r޽^z%mV}Q֬Yc3ie |zU^=%KoKSu)}nIM+0duEҥӀTFDȑ#զMW$@xx7njΜ9k2@J`͚5jҤƋ/T2W.`<5j$ jk          @hpTZ      Νӣ>W^yE #2xWbլsβkoԎ;*7zڵkP> Z0Y zjԩ#{Q/^O;u$B \Ϝ9sjҤI.',,L'Ox! @Xj֭%Jhܹ@&^`?H0m4͞=[v.h?N@A@@@@@@@@@9+Jv4xv@@@@@H\~k9r4hbA/M9suڵ KGA zJR۳gτڭ9 *Xb?~BCmÿĎ6mڤʕ+N(  r W믿^cƌq)W#e-~|X?!>t֭5jBԩS: O)C>}4k֬Ձ  2Μ9;C9rp?x.]ix^$'eʔѨQԣG9T@@@@@@@@@,@dJ>@@@@@ V ezߪvڱ_ܿNcرclBtg-q={hٮgϞ XMd" Ʉ ` Xpl\8`&M|ѣGhٲeƥ. l٢N֭K{ eVZcϫ]v.7߼עE EJ}@M6*W\]oBk֬>H+VЄ +Ȏ˹s"ꟐB,-@R.YDCW_Tzm\عձ2         D SQ     \wyڷo %KtmK-޺hU jРxRJ{ݖ,-%_|ꫯܴhѢ@mmSOwQf͂v>~!KXWT|X^-ֿo!~ndΝ;ge׮].l#Y{ʞ=>yV#No޼'oK$m{믿ȑ#&MM>[C4o<d0( Ezw/D~٦?7&ݽ->ڵ=IA@@@@@@@@@ 2q;     @ CzWua]z-ժUKm۶Պ+Snlm?xW֭}v[7v۽{E:q ?kذiȐ!u dK㏻clu$CiРA|&U3gny6l{~2{݊1ݺu'| kOLmɓ޽ڴi_~+ 1Ɯ GqA0bĈh-Q ,Pxxʔ)ȁW,Y4n8ؾ~z=?UVu.]- } 8PGQ/_.*Pž{rwilR4ƥ2fxѪ]ełD$V?iѢ&M?  rB˖-)S4:&Wz]ؽ ̛7OO<< ;O۞>FW2]\n쾍5@@@@@@@@@O ijg     A*py͚5"w,B ,`ͺ]X_Ukܹ.?[Nk֬*zg>}zYș cmZxٽޫ ǒ%Kp뭷_w5j5j?S>fmYkO\+w嗮^n ՚>};:x9r [dGϞ=#*,,‚'(_`̙g"Zk*U0UVݾ.N֮])So (e~UVMǏw!6~ 0'Ξ=vw7˂m|o\m(:/^}nݺ\-0]vmbboŨJ[kKV6|Υ@@@@@@@@@O ijg     A*p!Y`tN? l`Q`A>ի; >^s~AJ* p|뭷\ȗ{1)SF ׷o_~, ɣrʹYxǖY`@LdAW̞gQ[׶coƏ>(εT-Xe˖n{/ yZÌ3"kѣ *Uz衈A9\ bw#l٢\r){ Z믿gB ,t +իx3f̘u B(m<ɲe˪VZtAYpƷ|4h znvw^W 2޲={~n^{ 6Ŋ%M룁(bc}',[}7㏮?=.HmYLߥSK?i}9>{?~i*Tm"w}xx4  @s/ 1PMԵY]ز7Сs07aaC q)um'{%-׵I|y}Hp1         H      @ ˗U -رJ*.aĈ6l{n{1-ZT3fɓ']8UXQFrX;wXpۊ=c7`%겫ڭ9  Tm;^;z',ԩSnQ>}tתD*V{+d*5M4qM(ɂ~Y\䀙ڵkƇ׻|o1 X{!edvqܹȻrO>6T\8pXmXX,J6'={VZNܺuN`ߑK{[k?u1V6x RGE? 0gE|]0rȈ'iڴ{:|ȋ8ĩ¬         A+:hkF@@@@@H$ ʔ)6mڔ 5SJ?=gy&bywqMNv7n, ˲+)S_DSG{͛*TȅL+W.c?n:eΜY-qs1ǧF+ ?&MٳgOvSsU9 $s;`t; mMl ޾uoy|y]b?o}#o^gqFuE^E+IGQʖ-իW}paY dԲy樋.v옾;*UJ=P=Ki%r֭[ݲ} /iӦiʕzw2 @3bBie#;h7x2eʤ}nݺ[0}6k _={EqG7>aA'{ɓ'vlk׮/lٲi۶76ys[M<:D+l Շ~mR~-7j7o VfϞ~Oۍyo^|~}Q׿-8q۷q={]ԿcZ~> u_ҧO?dm$T?? 2#  >JJ9T koLY6hذ~#o)gΜDě۪57e+nkJM.l%ڏb}m^T-&         K GƆ %#HA@@@@@ I X_ /e=ex֬YꪫTR%:u,XB 'Mf͚飏>R4idX?.\'jΝOT`8u̙ҥ߯-[6O?Yp>-`ٲe0a ʝ;;VEJ 8Pׯwspkc̙T/[RmP3 + m1$+n믿O7BwW/tÇ#GԠA8UBhf}},x׮]ZbEdADZRX8r\ z)^G@sVvg9r"6s{.{!6k[oݣv®Q잁[(P N^[F]'qj@, g@H!         \B ?:q~)     $  -ѣ Z]vѣڰa [`F/iA&ؤI8Z@jlS 4>X!Sr\dB!z{XygȐq]-p0UTO,e˖zwYB„-ps͚5.lПqF&ZH8V#/K3fM7]X \?,-8Qڷo>ZxdzuY M.զ9sp{υq^j}^G@@@@@@@@@ X_     ,t][ E{Qf.Y{΅A]rxʝ;٭[7"-Ȝ9NiIzhM6Ձ4sL˗/i5Uk׮/ԫW/uɯ=z6F%fbַo_=Sܹzy,B *VƏQxp7oHdӦM\ڷoƥ J  @C իW_1c(]t &.k+]Wv`/}dP@@@@@@@@@@ qR';     -`߿`I!-K,z饗. [JK޲sh o*U*fȐ!׃+Ve˖J>ONd0.\͘1C}}Fz cmJzVv!=c:tz'|23eej׮mAɩ$~b}߾-Er:&@/?~M0A ؼys v%.k \bEO@!         p!}2kwa)     $;ݻŶmۺ0Y&6^nΞ=zH?Μ9J*r7gag?ի}_N7oڷoSNO?#H)cԐ!CԥK^<`ըQ#ᐣiȑjӦ}RO <<\75g]s5W A%f5i]1Bŋ%$]<#jԨ~w]i         IQ ȤxԨ3     @ ̞=[w}DQ"˦^֭[N:pnݺ0Ȑlwǎk޽{N:UJoe}+Jƍ`:tH˗נAɮ>ǏSO=-Zn̙3'OdN Pq ={l٢ҥKޣGo'l)֭ӭު[nE7t֬Y͛|@@@@@@@@@.O s]     B 6mƍm۶͚5ӤII6mO? o߾z׵aw} I-IWf̘V2gά-[hѢzws@'17X_>cA=և/s)Y-ZK۷wa4g0W9mذa`~I P~>}$*  +PF -[̅B~w. ƍ۷k#G45C@@@@@@@@@I'@@@@@@ 6m ȳgϪq*U(<< S̙39r,x3f>CmݺU>2dȐcDf͚1b,Â,pG6lɤ4#vX_>a}3wJoʛ7o 7ܠrJ5h@mڴQ;  $ԩSACxGos7|SwJ.\НY9s\%KTN;D@@@@@@@@@)伯 ] [<_[d;     $= _/?~\͛7Wt-D5` 8Psឝ;wv24J"1VH7=z,`Zn0͛7ɶ_Z`׮].tv}dA+W /_j!         A1@@@@@+8qFޅyOޅlR͚5S,YtO7{l6lnݪRJOӞ 8z 2d&N( 7 mԨjԨ4ioT8oڴi.uwء~o=~3ϸpK@@ ZJevl\KGڂ7'O#GJޡC7eϞ?;b+          hA&=;F@@@@Hиq4~x9s^znȲe*4445{l6m4J6 l֬Zh%Kdl@_^NdȐAy7FR ,ݳ8 l۶M-Ҽy4w\y Νۅw֯__ 6T5i$ 9zhןml@H NΝ;5|p&=k,e˖M<:vbŊ4ڋ A&p9Z(d|ԨQ#7yn?S˗/׊+l27ݻW!!!.hf͚ҥK'XݒvޭaÆiD 0ƍ"E$f]gϞ}w-p!m=u뭷3H.%   @B صŋ^L0ǜ9sFv RNToa<.v` ^`9[6iD Y@@@@@@@@@AI@QM@@@@@!`P+WtWpB_ޅȑY_BJ*BRο[y vZdk¶i&g&L]saiV͛s?ۑ%S.eѢE.p>i㌅@/^\FhCsgϞ=yUw㎍h6s sْ%KbŊ.ȷrʜ9j6k. iӧOױc\ԪU˅&n&r/дit!YsF\?O>5" @ h~zΗsG/ʖ-… 'sb;kcwjxT@@@@@ e"K,Bzܹ @ȼy; ͑#G=e̘Qb|6&%D?~ژs۷Ows{=w-ibuM[_cqժ/X0 ~Ps,2W X05|7-]c[ng6/P@dg8Z3 /ȓ} [J ^-{Cy@HG|Vrh-4sp;Q'Ǒ9sf7YX:tMvb^y/(QBniSrs{l@@@@@@@@@G qg     LvB-- E n^,B!-fA`ٳge!rM`!l`yaln UB,»lnӧx=e7ϥ>sI]xmHOva' y/XgBt%C .҂!)*U1{l۱%X } J"B#׍          LZNj"     7 жp:t`~u>}J*Bpȡn`^dI{lli%Tv?0KK|: A^<llpFSFon,/9 B!m|o,`/\қ{, Ƃfͪxƌ'^z1GƋxgAB9I/Bz^P/ IZ(Y$@@ pvfv_ mҥyjU95h/TGaDQ$-T y욄         \AW*@@@@@H6x`m6)2RI*=d@ oSǎJH*D]   ,OPڴIjFzdIٔa@+@ I+VHsKիKݻK   '0}Tn=!          2b     J OϤFGʔ~dui ~(P@2EzmW.;wal@@&z5A~eC           F@@@@@@ X_KkJUHK*HF%P_@￰4w}T4|x ȶ@@@ >3fH!!M7]         $A @@@@@@ ~IZB*VLjR^]4)+N@ A*W,nұc Zv  XdٲRlѼ"@@@@@@@@@@ H A5@@@@@@ ʔ -r7Փf zRH]S @@@@@@@@@@  C@@@@@@ *Uƍ"ծ-5k&-^c 4-[J+VH]'լ)t\T   b/M1M          DLj#     @ Ԫ%M*M$8 U"n-^`o I&H}$Tm[p֕Z!  \f͒Ξ#ɵ @@@@@@@@@A8 @@@@@H yQMr V $Dzi|)<\*_^4(hK@@Hv3fHKKs' @@@@@@@@@HfA&Js@@@@@@ aZ.-4#Ҷm +`6.}t]ҽJo}  E`tNځ         Y |ti     T $DjNZZɓ%v8@ KcJ&H*Hsy  IXqibn$         )F si(     J U*u뤞=aäE_^.$ͥ+ҥ:uޒΞM 5  $- ^?}ywҪ9E@@@@@@@@@(@dJ<@@@@@"&cƍRnRRoKdl@c>૨6?IS M@4 **XPVEvUY TTpeiJBҥ Uy$!Mro;8sgΜ;9synAid7!C ͛CT@@R"EBT@@@@@@@@@ҭAp@@@@@H.p'bx#&~5q@ ~XZD7Ji`1C@@ t""FB@@@@@@@@@ҷAz@@@@@HF9-[J NJshZo^~{ΝÇT @@1ER!Q]*          H>      @2 # $m,u*'p{RTT2#@ d*4}4wTtդB  <)5j2U          L     )'PkƍRRRҸqٳ)W΄!pҏ?JիK7,=Q7j  @( DFJ]'(J          LW#     @)" ._/ի'u.U$M* # 3᧟RB@@5 Se@@@@@@@@@HAKO@@@@@@ JƎVnQAQC6-k@ _ZTUFLp>@@BS *JZ@j84O@@@@@@@@@@ } >;F@@@@@ (WN?>&P!U+aC)""*IU@ n!&|PNd?-'@@@ /N5 fPy@@@@@@@@@HgA Ns@@@@@@ xT&M ˚UjDj\Z(xL@ 3KK~+-Y"U$͘sp4@@Ғ@dt5RٲiU@@@@@@@@@ҺAi >@@@@@9:u3cNjזڶ~1B@274ZÑ6@@Ұ@DԨQn MC@@@@@@@@@4)@d4 @@@@@҂@ӦҼyҎR*R.iu.&'gȑ1k\]lG@@ =3n u           JAբ      .Z,>\ZRPA^itAHw=zH˗KٲI5jHoh0   s#RFnf%          Ab      aaR1AGKRٲKvK 6J̑zJzQۤ}f[i  I: eXE7ݔw          Au     ԩSuw'XaÆ%=7!^ ޿uGJ|R:p ޷w߮W^y%Urɿz}7o5A)) 1AkJ+JS^USϞ3# ,YS3}y¥`}7{@@@@@@@@@HAK@@@@@H~ 6h h…nOlHTz6n>P*QB0@:r$ѷF r!}w@@@@@@@@@@T2      r VZwٲeݞpE HlFm YB/ÇWƍeh!]tQN-8~YwB{x E QE 0.kVbEy@+O {" !`Y&:Vm wVi$6V8ƵU+z ,pRǾdظqFihҤ<(C;vL>vgbcұ`@@@@@@@@@Ns       pح[PDD'F6DP!魷~ {n(ɔ6yx]w 2d5j?\cƌ5\J*cu@ [ *hժUzw4x`њ7oۼ|r?;Z7߬}.v͛7~B.ۺ}-rΜ9Xaaang֬YٳϤ?n@H;FL-Z^z׵p V{}X@ -[&/TNW/ĉk-3~fq'Ya+  ,6u^͜93ѱ}@Μ9ecE{qKbcՋqR;w5n:۷m5kָj4vXnXbca@@@@@@@@@K CpU      @ Xc@IDAT%F%/`B\Y2)T4yrW_ɓS9ohٲ{=a„s[&/2Ce+;wt>HgΜtaaJґ#G> vv^y\ԵkWmٲEn 8uꔢ\Xa۲fjRX1Y;>.O>q-cĉ/cCY؃@* \u{>1SjҒ% W;O[@@G^RƪSu U:Lhj_D1cF+Ƨ|[e_|ЦMΝƪIK@@@@@@@@@* *Q@@@@@%}Ru}]oAl+$/P.ի'}m47nt;A 4p? wʔ)[v׻@ŋ˟֮]+;SO=mA n2rH72d֭C?*{ P:kL2}߾oٲe~-<<<òTh^Gҿ%={auc~~q_`   R͚ X_ƪ{U:}X:Au֚={;N2BG:|pE~'6VMX:c@@@@@@@@@R_ Կ@@@@@Hq-r攚5,* pΝ{Eqs'%`#gϮGB,/[l9U慀_|ᦓ'O/T̙]cR5Μ9:ux!+ԭ[7W=zx!g~ܿ{zV  vΘ!H7,qn͸D @~HzMXrƩv+ڗ 1BTݵf+ʚ5jԨێ.6Vt|c         A)Y@@@@@@5}!TtҲeVvnEm)/vk:uʽNTv߿ 7|o_&: ҥ~i*THm۶7Ln:[d߾}U`A}5jΞ=f~RJ)G=?plxl߾=c |R{i>R%i?jǧ%@@ n7ʖ=[٤U-P1***=[8e˖*^^{5wyxw꧞zJ6XIlv@@@@@@@@@H Ǖ"     !%ШdӦ W:v֮imݦ[nE7oք b6{Cկ_?pn>eYH]رíbΝn?իr̩/R͛7;C޽{[nzݾwsC| sB6:wvC52OcGu qϴgl~ʒ%# iܸy׶ Di\V,vS:vL.C@k֬R&M$i}Ycդ8ƣ6/9*TP +W.{8?\X5)cK@@@@@@@@@=|y̑)      ^xխ[W-ZHM'-,]Z^HTd]b/P#umm6 [gdzH Ɏb M@7&*Vލ?xiXrĉnYT)+VL=EǪO>d3&iZLw#FcB&mlWؗ/qM[gcϪU*<<<KWT?4s@@@@@@@@@B0[UNb-@@@@@ҁ=zAk_ } KWz9)[Zj ΰlXGŕ!C7'jӦM.xdɒnxQ~ fx0gY/\8q=O8ܹs_*I^X`@@@@@@@@@A'      ǵ)4vҾ}҃JPG8      aaaTÇ+wܗvN'ٳgkĈ0aN>: ^{ڽ{wԖj" 9sFFҀo>HNM  @ <|`ԥK}g)\:_CV-         Dnl       p?֭dϞ=IS XgӦMt3F#GO?$ּysiY94iWv-,YR)]>%C2f̨^zk׮W_}U3fLٳ*Tvܩc ;v\}ӷ߶ӶmճeX5ܿg5}Gʜ^~5=h`*uB@rB?j!S&=gJGf}T-[7!          dH`=@@@@@@su^9sF Mtݻy/"3gKȑҬY 7H}H{$)PhQMnɠ)<}؂         A~     A$УG/lK[H)SF*UJ`+H@CI6IJG "^xA:z4aOH{͡+pk@@җ@޼6[db?qz^!         *@d^9     @* )RDՓ?嬗שS'%sRL8jpiz~}yRJĉ„ һ^|?@+8qB^?qw;@ p7K|#Y>.8ITh4xX  i*P@2$5"         @ 2]\f     @`ͫ͛fRڷop4PJi$i)kVIy٘9 {?N`a^u,!@JvV^zI__ʘ1 y~#~=@@҇@"1lRݴ@@@@@@@@@ҏAZR@@@@@*pwnZs9SG93& vmFP: bs 6i˜u/PSҜ9ҡCҗ_JݻKǜ+ssٹd-@@ *3V.e~Z         i_ ,+jfN1G?>PG8     _ /:v옛~-v_wI:uJO>-~w76ҙ3gΙ⮳? 2(,,g̘Q2ers['[Kʒ%]uYfUxxxٳ˦lٲW]urȡ9s-۹(#u"z'iɓ5uj^s\4E>>.{οWƟllO6.߷~묿_~~:>@+`c\08~_Ö,=;g) jwN?lnrʥ|y/         AxU     @@P7 x;:|=* R;e ~ JX"X0tA] l`+`aaymɓmٟ,L C{R3"-X pC$u^Zk֬ڵkch+v?]{*\9>߻>ޱ(k.ٳDž,PB!˗/o1v^Bw>.U~&[ ?}6gr73?Όٲ?=;albybA=yqϿW~ Yz?9npҹF2 @̟^['3  @瘝;wΞ{۳me ~Ph*da OVeˊxKaXq{^C&4is=AXE& 6>I           A8C@@@@Y ڻww~:`6Y8_,˜A gmNy@ 1 \Hba V.favek?x,n𦭋g\ , C.l$ ,xd,<\vKzy^8H<4{yo }{?YX@kٲe]0.]XH"E\?P;vhƍ.)ׯ_U-xł!k׮;Y8QҟQ~ϟ:; `m mo?+wŝ !a@q O?_޼ysl8,My -۳[r'$q=XygU}[eܐK/,tMeʔq;@@@@@@@@@@ m 'A@@@@  V0`ݻw@ E "0, q-L`?-$PBn [ 5AI9!CgvsZwpk[l7|3fh֬YscuիWwajRjt˂XP֭[tR-ZȅX.YąY`mft뭷y*QD06:]]o tc}-1nw~ٽ@ >hi%៶_H σk [f~g?C(  :6]r{_b[^jXYCŋƴixB0-3dc$ Rv+jժnWT)!@h         ) @d s @@@@@> l۶molӎ;7,ŒA~6? "1uk0!#,T-[;uTlճe>kaLhZ!#$g+~!e,EE% i'^͓S9 I_jƍ.@QF.,oM7$ I b'ߺH i0:tPǎ]e(1=P[y`c>>~ɕ+Wl@ŝ[g}"~X `H_jq9rp/Ϭo;`Y{  @`֭[ `^իs_UR%bhcʕ+œsy=SYƍ,TO?9ھN:n[=QԠU          \A&,E@@@@H1gϺ 6?ߴi6o& :~KfVw= ~ KK.OdaZeΝ;gJY,gdɒS/n򅇇KmÒc plp9c…Dzgʍ7T˖W+ffwq,#K,1;ZЩL4`Z}&;uꤞ={lٲi,ǭ_>ϳ~&9b}Vf.ڼhѢQ@tt E7mB#UW]~*Uͭ_'3=Q@@ ~ &5k,}Μ9.ٞVڵkf͚V[ /(8qVXKEyc lذ4if͚/ Y9          U ꕥ]     @?5^rڵkO?y!nu)9s]'O̙3w^ɓZ` Tz4R咁?]yiܹ.KQQQXZh֭[X)@@@@@@@@@P 2ԯ G@@@@Ҡ\Y?+W-8(::.]څY@k "/ ~ h9ǏwjY n:74C͛W7t*U'lnsqαxq >\߯nMw U fPb'ҩSjĈ.@۷ 7J+V>[M+*[ yW󬿳)W\I; {!"lπ~3+d~֯U\Ml@Қ5qDM0 ڗԯ__-[TfTZ5e̘15;c1c/ٳ=ز}jժ @@@@@@@@@b      \@TT {\tlZd ~\؏_Y?YVɒ%)S+9-E M ޽B^ZVr-[@XSՕ;w4iqͷz@ϟ|P?)rJz;([l.G!|O[pŋ]g˗H-+N7xzeȐ#%`?-4 '?0PB>Fn^fMG"iF?~>c͟?_yqڵS +yfM4I_}̙Ym۶֭ [!xQ2          2@@@@@@ ivra.\肰, T⦪U>Z0L`.l-[斷n!>]ԩ& ]MOs:yG}T2t7СCA{uHr1-X vúꪫb; f~Bdɒh3-`m&n-0̙3*Q֭;sfƌ/\@1̙3{ﹰ@ .][o" ǵ/R~"##U@SwJ. 5          A>F@@@@ҁ}w3g#M6p0 Uj֬2eʤ @X`?E߯ZWFTF4zja5 ״0 9r*T-JZ-1""Bgvs ` X534=B 0ǏwA֯Yf?rƍiӦ00@~W3ƅ[Os:tٳ_AyW6;VGuzt-L(         \AWǻ@@@@@8rfΜ3f?˗Y\zTzueɒwR[`Æ 7o,HI,E*UTjWo|}YUZUo,xK"<DtD,-^XӦMsނ \>6lP 4p^ܹSL•_;w &_n >n֬7oVZhѢ`! "[o1o{rʥ9Ip ={VSNu WXXk.*Jm@@@@@@@@@@ A"    O`.d'k֬.8ovJ*)-+Lӫݻw߹oU|y~;d2d)G{2e^|E/R^eϜ9_~Y mݦ>@r f.믿֤IdI*U\YccgO`׮]5k[M>ܦMmWkj {̅_}ա4 +W_>S[79          AvE     "[nݴd+Wõl҅`eɒ%DZB5@ k֬Ѵi4ydEFF@С:u`|ݹsZn/Pzt ?IwAE QSf9sL}g8qN:%,زUV*\pT @l2s])SF]tQ׮]3nO@ҝ?.\?p׮]{N&Lpvکxʑ#͛WSxxx ׌!         @  &B@@@@ҸoFٳgrرN/_>!@\C,bԩԳgOCŊkP,o۶MM6uSLQ(`*q?~\ca&\l٢QFi̘1|۶m]?fϞ=N@2v6 <_`ԩO;wUW]uGm Uĉwy ˄e~f{ٲeӵ^B _J(ҥKp̙3^V"         @ ׀     A/`8oF!#ݻ뮻R T_,0kرԦM=cjԨQ< g8pիB gΜy&]\y[da/_:e722R ;_ 99s^1y#ƍBЏ=^zO> ޥ @_}qƑ#G4rHn:UIC[8p^z%J3Fm\ecݻw]vɾFgʔIJr_RZ5ըQÅ\nڟ j         vL;ג     غuc>=.'b >\sRJzռyvMugΜq۷ow LrۧuXbpΌ3&:{l_˖-sUX1i@ X/4is{w)R$XL@RY ""VZ7n (5.`.]x2eJ_p`Djի8{Nzn~f͚ u         @H dZSi@@@@@d8v옞x -[VrifR'98@ʕ;h۶mձcG5mԅOFÆ ^'N!q?] &vmvټyn67իWO[lqcB Sp~Cj۵koVڱcJ. O< A#`?iٲ:uꤩS4W&+Ҹqc-\P;;[%TruAݻw˾e̘1.~Ѫ] |gqƄz@@@@@@@@@H& "    *0m4+WNٳ]PW5R9.T΂RٳG:t~FrNsoԷo_`d)/׭@z饗ap .ә3gR B._|Q*UJ,Ĭm۶ZyY?~\?Zn?Oz7_ߕkbƮ]*o Bɝ;֯__~Y\sMjUǝ>/p;wt~_Ƒ߯w}WVW^y2oi޼Zhڍj_N4i$M0XhQȷ F`ժU;գG92MFz 'ҎRxq}wn|֦MK?Ϧ[/[̽ݗV^}N~5h {qu          #@$@@@@@X'xB ,PݺucٳgrJ-_\eZp ?rbv֖1cƸ൰KjJjG^y/=;_uK^p YfO>QӦMe!)QhѢzRtAsUVʐ!KkѣGc~aլYS/ָqOogwʕ+'[bA~?% ZxTf.)r&A%S.wY֖&Mh޽|KyZO>L2][6dmڴI'NtazGŶyZn^uɓG5jЋ/ӧ>"v-صkdʮYJ lӦVZ%KȂ.}B+RZ5uRGʖ-޽{'a ?$U:mnJK?d~~ӧ@ҺkYcǎM[< NJ#环}َRJ7ЫoWz.{Npk9RGVÆ e_RHw… {mMD@@@@@@@@@') <     @ 6L~ SNϯʕ\dLm6uu}YٌN!/=I>x*x-sέiӦ.]7L2E~صk:EHׂ7-hѢܹ[.QD &誫R2ebծ]-[8drFv욥TI u]R]W;?OtmL~$a?5⤘]llJł>wߥ&&@>}څk*T"{IyI&睔 j_r˗/ u.R{0TQ, *]zXP@ +6bAPTz"UzUD:J8!    D.m6{]`A "0ܷo}'ذaLag϶/k_~۶l2G7xs=g3gt |7r}ӧ۠Alҥܛ4ibAP[!?ƍsav 3W[믿6=VjU{"?6m#GM6ֺukgsu}vܹsmvYgٹkּyswLC&L`YƪTb[n5hQ_}i.]Ej*kРm޼o5j+|nС}v+Vl.2S8C>}j:ur!v<_n}-_j֬SmLPb} T! M<\믿n:tnWXѺveh73ϝۛڋբ!CX%MQds4crW/}w(lw…[oizo*1B#9ssFM6nݺ%KXpa#3ƪUkZvڵ[ȑí^\9Sn3 ,Z1XM2sT/Lf49-Ƽη;}Ǽ;w7|>_z%`=zhٳgO,?SNN89R踗ؘÍ#{Te|w 6lvYpo9Xk!MgVa2gL=lƌ6bucu玮oٻwoȑ%wu,{Ai5+L*wy-^8@еn4QbER+꠮ukp݇z\L;8}wm Hx"ދwڿ^x!kgP{KG%}I$}<=?L-{7=?0`)z~pbfŊnn-Z{=?<-n{̻=?P{w=?+] ŭ܌rի[:w!rLyʕ+{~HyAqMNOu`uW\CۦC2m}ã9Sz~xw%x? iԮ!^ɒ%=? ~;z-m3նIEGRva m<]F~燮z 6,XG:wuq[zWxq3~-#^:vZyt뭷Jɹ_8q֭v>%w^;;eʔTRR>2W~>g< ^gGlj+(ݻwwhhH1/M1O=?՝~Ќz~{'OOK}a>ޒ%KEo߾}:IyZ!q$cV_~>X]ዮ7#kWqk+ӵ phv~jLMrKuz$(]{Es/h3~ ejG #{wݣUICݯڵ˫U{ݵQzBr6a,N{vP_w*~HDۆk[˓!뒲e&}L`1LK逸J^Orc^D@@@@@@@@@  X4 hjR     6ݺusiڱ:*Reʕ˕+޽-S A-K)H1SAdh((ƦТ`I(C*L@}zCWMr^!&-! :]t77j_ԇ݅:(IYAQ C {={[M; +D2(.]xz R:^ BOuJ(C &ח{1سgOZ:wҮ];W_ y۷w˂q,Om@ 2kh|u< ft=`) @PCH˒ؽEr+>u/-; Ȥm]èp;\}Nj5O?Zf ]$q̦M~N81UZяN(         #)     XN3Ӆ\rr>l˓'/[n޼9n:uXJ2?9{s|׶~]v6 lҤI=Z^9s]p6tPkܸqr?;ŋێ;Ec&+,,U]s56p@[pAK 5) *ؼyYֲeKZ͘1?w!sqh&hGW*Ug~U\YMĕv?;wl~;q3ۄ.Oj>$swߵ ԩSîO6?ъ-zݺuh?tܦMq۵k}W2K{:>ᇂƵk37n4?4պ}:%Rw?5}W뼉eMWH6jӧOwf~=ֵkW˞==ϸ{Cᄈ?Ӵm↓@*Ww~0L2=:/֘;Xԙ #4~ 0 sU… àn6|A5n:7 <"]FfUP l7k*ez}Ƒ^{Es/wZL/;x`oi ryҲd=G$+T%\-H^ۄ^רz!Hk;]辦wg4Hgޏ͟?Z_RIpnnj@>@@@@@@@@@H     dn͛ի]\FȖ-[ݸ;v!}ׯ7]Ea* - TY|yb[`)PS ˲eLY?scɒ%=z$\=U+Vջ}v[x * 4 GkԨB26moMm۶.hSlZrK]PP!XW^=SFJQh_C'5I_^X T8chQBP^UD[$-8/osu^KPt^ t}EDㄟIGz^hOj۪U\U }y /Hw^ =vN*45Yf.7am4N:_AIyoA]>)Y aڷm۶ПA0=c^hyUZ.|bC }K 7p Ci+{'|b !SE=rʹOloÍݯ(]*)&z/>^}gsg/j?|x'l;yVRk~.?f;:'L* @@@@@@@@@/@@@@@ TTɮҥ ˨{| 7p>;־}{N;)S~…O?=;ljrB"Y&TyIn~/@hܸ&SkM~e˖-9sӲ ,aBscԮ]_ᄃ@!(mG=Cmih}^Oe2YNj+X#"OX̙3aÆ\J{}Oϼp2X阥E >g̘awqG´h?-HjKx7~xGH"n\Pnhs0~^rc*L8c#= iXX}б5#LmJnkׯ_>h H  @H }ٸ{㡐#t~3$кuktg_|5nz-_)/rzX0`߿C~m?rH Sx*pӦMO¾:vXr 8ЦOn{_|ѭ$>c6l0{衇T)$N 8T\XK/}UH믿W¡ʕ+g:/UԶ ,|7#:͢U$ TJhIly$Ebۆ֟ؼLzW];v;{l = >ZW^qJ,Jɒ%g>3ʸٴj?vRkSۑo:WQh~heʔqZ ֵ* 3fL\0pbcM8s6-j~ݺuM5}cbԵ?k$BTBҪ!\ X>4jOuM>۝cYa6#1.3تUK'_Yz뭮ڵ{~]M Hxm5L띠I]$7վ]t,auMR3Ve_r;~^zvW-[fv.\w뻡}sW:˗#')u@@@@@@@@@@ 'Vڴ<=(     Sj$/W\^߾}Ď!yyշWvms;zM:ܲO>? ku޾}{0B^rjʕ+#{-Zs9n 'a niӦy~[j??m&gr=?ڼN;ҥ?{frmC^b}R}^9X~zOu%~L1O&u☧>z?+R;~~^vEc tk]7p8z~8$;橢pȱj[WleZje~/~ETN Hϋ{:Zk~8]x]/R-[hTyTu7p.h~`iJrc^ηc>N( 6x3?9<@uֹ\j7ܘu#W՟\ ~±8ɵyGAڎ;Qh;Ѻ 35Y:h C~}ffԍ xÝ/u>]S}78AQsk;) 7U{uI]I¶UOr3kKۿ?j3G-XqZ^1MXtm>?mC3-bX.}IP@@@@@@@@@@ AFߔ@@@@@ !p{뭷\֮]D2NN(|iӦɶҽ{w]/47Lv\!}VF۟pe I7n6fk߾ R ( 7\]|6xe=}znd{衇mzɮm?"Z?-Weõ'>2}.lb֡C{׭XbZ1m!CXƍ﷗^zꋵ빩c1|pb !:oB{dڪU+Sn7pr)vc? QLR%W\IqPB^;OOImg_e SG׏֭n-\7cz… ݵ~h 4c)2%nL C@,YLߡs9{)SXMrUV۷3]dCm]kCjߺgٱc luBGÕYڃ>B9bB VfMڵ"E?}5gy>@@@@@@@@@@ @ Y9E-@@@@@ ߦ?<wmԨQVT)ӦM+Ydߝ-]mcboazPň#O>ѣG[ٲeo;\СC뮳^~e^s&>4jQ{gY:Ӯ];kڴ)pi|^j}>|تVjw}o>{[={^z6gzWBVCQȶƍK/u! U@HNoHMz{5)gMf'clٲ+$N02ޫ\r;S&Mrn4A         $)@d<     N`ƍ6h mV|y+EVZ5r¡EyMВ?Ч#*}wW_ٸqSO5{tM.h"URÆ sA~裏,wQj"ػw Sx7L<ٝ3_~l9rpAQ~}?~|X         1"@d    d-[t7nmݺJ*e .Ef]eȰvӧp,F(l"K,.I&ּys+_|uֹ(T{ٳ}+_ܪUf)R$V~9rą1/V@SƽzY L*+#z{qĉmرn|gڲeK+^xu@]?*o޼y֪U+,sP#~O^˗P'|J(@Q}l;w!˔)cK, = @@@@@@@@@@ 6@/@@@@@ 'y 5=z)LNsN@ .jԨaUT\regHz.[f͚±>]` ~{S5rvsNq׷o_YX1ׯ׈+`dƌcݺuիW xe˖vu 6<֮]k't]x.vVzu˟?zE@_mƌn|2e.ոWreڸqcuh:tP&L`+V.]u]b:IҥK߷ؾ}o=z$Xmwv?C.^N;4۴iSb@@@@@@@@@b@ 8t@@@@  ]SܤI\(]HV٭|q QB*A@@@@@@@@@ 2u\@@@@@  6،3\XBuV˚5 S B"G%kT*djM6… w^˙3 :Tkժe~o}wֳgO"G}ԅe);gyFaUTz.֒qW߱c:=4fɒ4UT*T+^˸")ؿ-ZȍiئQYjVvmSЪB) ݻw]@oZr ̕+Wz F`6|pꫯlܸq;wn+}֠AØ@@@@@@@@@ @df8#     ~w9o<`[j.tVLx%KZ*\Nr ,[,XI9*԰nݺֹsgOeڗ6l0{wl.g7tkΪUvtffϞm ڮ]UVv[Æ 3؞ٳ.\7㟂=ϳlٲYѢETRnӸ1Xbv(R@45mٲժS }8Gݹ@ o=ƌcwv}V89@jO4t/9qDwf͚%\ c          ;"    DAj* B.0K(M Rx_qgX֬Y#@ e)mڵq~P0ƍ*̟? {SA [ }nڮjYeɒ% hm 9s 6̾ w~*|cǎ֩S'(%ue˖qOc gG#q/rΝv_`֭n<mȝ;w5u Vpa1tnӼe9@W6}tS رcm֬Y)b]tժUݧTZ٢>i&w4c CD맜rիW5j˔)@@@@@@@@@2AX'     ! _MAC#4hqkgϞ݅)H 0-ӂ fз8fJ@ ܰaCt.T!֭s{?o޼qAm lSpaqTmf6tP駟=.RϏTt*`f.dFa':۴iժUHe.TAzh#ۿ$4 NcmȘI o>7i ئύ` =mDa*`OL O@@  !M+W+Z p5d#G mܹk%J /֭3ˏ01         G)@Q±     @P8!wXSmٲGA9\8VB,xviqz),2ϟ߅/3M vܶm{lݺM&sDЇ~hѹpа |϶EB(G`޼y?)SgK*ek׶5kGJ,Gb}X&MBg@@@@@@@@@8j @@@@@W@ \RЩBPҞ={(%4%|h z(|N Ca^#y,Y,+Ja=Ctz4h`}ի'\          @L+#     }(R44){ ? ? BL XJS=RU~;~ TWhf%NJ QSEA U@5kVH(8OРt+M 3 <\PZ($uCc^x:1/N54mI~sPq蘚VPehLmAf` pIc]G=W@2~m{܏<:u*Bؼy C "!G)5T~A|iSԩS~ڴic<(Q"c`          AiFMC     7(0`:aCAZ-SG K5kV˞= PUCܐOz j~֢E^2_ L!BTPXB ޷o4'ota'C4^c]%.t ƹpqNcۆ y;Y>S|=:BǸ޷z>   ._[n㏻HMu`Hk o]w%|,]b{QVk*]K>t=bS]W_?lVΝ;PPE@@@@@@@@@t*@d:=pt@@@@@.0qY&f7h;}o?@&Pٝw=Hz9E@&yf{> kf~zۍwu֯7; ?`իܹӺwZoy~9@@@@@@@@@z     +pfC}.g@X_l„X }@@*A>*UƎk1cdH}9rr#-[6[mŊK/d%J7|:v#         @ 4      hOϛV @ (rT~R-Z@@'0{lYu[di&CA @Νy[z]wuvZٲemС*L@@@@@@@@@@Aea!     Ċ@vfjCf+ ]@A{͚%@ݻ]`Z,_|`{g-O u@bL`ȑV\98p6~x+]t2zQv\ѫ/j:smРA6g;SAv嗻@X}@@@@@@@@@@ 2v=A@@@@@$ڵ3$V%@H L#jA@ C lذڴic-Z:uؒ%KSN%K g U\{3fm޼٪Tb۷k0E@@@@@@@@@L.@d&?}@@@@@ғK/]YfӦW@(PԩfeĽc@@ ->c+W͞=~OPBiqoc߾^r%6k,w\LbJݻ۟@@@@@@@@@2A     G,Y߬qcfO{A@2 5?' i%akٲoڵkg .uLT2Cgˌk֖.]j? 8Њ/n}}B          @ 2Svv@@@@@+-矛Ujvef+W} [dI20!}G@㏭\rxb:b꫖;wD Y N8vjVrӧzJ*e #G1E@@@@@@@@@L"@d&9&     I͆7+ZK## '2=/ ذahڷoo7x-Xիw#2~rʶqF1c}ݖ%K3ik GΙ3VZe;vzʔ)F򂬁         @ dž!     Q4ib6h٫=QT& PdI20!: d#Gأ>jMFٳbŊbRs'\@ַo_[|]|v7ZjlёWš          SA3       k1^=5R I ԯOdB @X~5l^z%{뭷O?yf̝^rг>>?D~5n.R3gN+c @@@@@@@@@8AW~G@@@@@ORE@ANjv"  Y&NhUT7ڌ3nD) 1V,_9tڵ˪Wn_Y?@@@@@@@@@bS <. @@@@@ Cf=zu`~@B* @P޽ff%@@ C k֨Q#S͞=*V/-vf~\ҢFzl6tPw)Sƺuf[n͸;͞!         A @@@@@@}uh֦ĉa) *PYgMp5= IJ~?}v=X^lذa7oXrm> upZnm-~ِ!CxOA~R9@@@@@@@@@bR Ș<,t @@@@@)[f-Zli6gN4k.@_ 5C@ ]ԩc|9}Q˒%K4# ={vҥ\Һwn}%JomncԆ         ,@1R     ĺ@V dVY&f˖z @zPԩfg@HJ`ʔ)Vzu;p͚5˚6m꼖o+W2+rc={UVW_m]vۗ_~@@@@@@@@@RO Գf@@@@@!9=0+QK֮@ ! Ƚ{N  YQFvEJƒrL T!NW_}Ֆ.]jUTq\pM<95N@@@@@@@@@HA)cu@@@@@Hy}YAnْ~#Ğ@ɒfge6aB! nFڵ}G7cط*r<檨 bŊg}懕roze˖hѢde@@@@@@@@@HM,_5SӐ!Ѫz@@@@@@ lhVI'֥ij-~_~i#F[S7wm5n8۳ nLA?R#%Z @8`7| g7x:wF2qaVԩf^2'gaҥ)8y%X\\RcGB X'0R_֢E ۷ںuⵒ;wn{-[p}6|~…tVF {w?zvopOG^ڹs}P5jf̙ǽ          i)5--@@@@@@ 8lhM̚77۷/ ~?ǻ={Dcq͚5o@.С @h lݺ)hPq@FSp?31\#i_>C[lYDۦJ/6o<|Ĝ9sl6n8+Y ܾ}{Ի ,Ybwu)S^}Uȓ'=qm9rĞ~iR 0j֬iO<{/3ƚ6m݊ޓ NW]UXE*,Ϸkk9r{MӧO &<         i*@dr     Ċy٢Efmژ>;z*,]qѫ<5uͅ"vmQ@- Ƚ{fJG@h ]ԩcO֨Qh7A}@J x%Uڷoo*UrOllŊ.0k_3db7p |\b^DU*guS?۵kWu]gy{ީS'ٳ5h4v;v4]'|nݽv"Em۶駟nVuѥK߿{]/-R/          K oB      )ʕ35lDIyޱof_}\@jTDEj .JTЍل )>GʼX@Xx]tE#G6m u) |Gl=7z?~;餓1ֹ~=ի]Oy%wVP!;]U3P|n6՟?ٳg_|-߳gNu%Uzm5jԈ[e}vWe+n%f@@@@@@@@@HCiM!     1'P_5kf5o$ӧ۠Alҥ.0I&ֶm[ѪUAyfίmvǫPmذڵkg7xc׵6mU<> +kf .^z?N8{衇`ˉ6i$Wo\쩧ŋwmӦ >|'0[oխ{g3gδy9c/B\lbyB 2 +P?A~fQ\a`;AI~ɚ7one˖#F "% ,YWbEڵ'kE!}q:u"E3<?Zb駟O?=a=p@˙3k_M]*\uݛkJ:u'{s*PA~6lX܏B|6tP۾}c˖-.su%?BJy{Y+x]~ .%UtTnD!#@K}WS`U;S!#W          YSND@@@@@ҕ%}oxo_|UVXP!kkq)81~QtM.d1Qw}.dBA Q4(=jP֭[Zj0 ۢE yUWB%b@ɋ.-W#۱c[z~N6ͮ Os-("( ]Ț55n0`@Y.ʠ07uVf :С??2ہ]G҅5j(Hdi@ w>g^\r1VZYҥ|ǎM!aÆ6w\¨5^NvܸqVn]{}~8A*0DGt/Hн\҅@E߶m\]K.vu׹ ztW}GUm(N4D:RED. MPPV`bUQ ҋH/{Iqi6I~;3/ЦM~z. p~G6pv kFZf;oFU5>TnǑ#Gb >=?rh"lA(         $Ai@@@@@@ , `ץw޹n۶ms!۷XĀtwhҤIO?~r-nbŊP[ Xn $x7]PnzjٲO?ԅXZXH-;v cY۵l2aZ ܩRJL1o<\ELԶm[W cM-{TfͰM~iצ'x-Zy¶a@B3g!;ɂ@ &N[n,`;vld6lՅ/VPo}1pYfs {_,p.^۶k1cƸC8qBgO>]g~:OmR6nܨuh7o^=ݜ뇝n&MwSe%{Mnf~0K.9wĖ-[NэM&=kc-ZvCmv yDziӦn          %:Ny@@@@@@@;g/}:wW~ŊFSNbT/˗w޽M?3]|Y-|.a f,Q? v͛6(-[6iF;v6VW+ yy`^K>M 7 B]?ܭ/BSL ߓO>g!  J ΕV @ 7u]#Gta}_dRGERNeΜڍQUXlטa>!C *\{--+PD/@nдiSeϞ~!>|X*U_.4gvÈʅe-[VVYz{匥_c)^[}?pc3gTvm#         A&*?'G@@@@@@[B >v[nuO,xѿx!7o_B*ҦMfCCCtӦM.q6lgux0ł1M 5jȑ#.B, ?`ml' Ї~R$3ϊ׾_|1~VruAA[n? G~`@ 0,̯Cի JA8pnvWV{CIt}lƿ Q)ƍ~3,q_w6l;ҺukuI5k&ٳg\/׮]Çq%K꥗^ҩS"kzg͚Ume˖-1/ xvsxJF          W~S1O@@@@@@@xU'6m~yu3?U.T{?+$L2ĉ@eǎ]rʺ5yd8w, ((ȅ;$˪^֬YmۺtQ?~V-[vչϜ9\ @JWOZPʕ:GJ~7v@ ,Gs=~;*jd}V+wΝ;hqDcAc7pnGno&}RuҥK.8rv͚5K-[L}l Qܹ k练UD xb_zdzL8n'anI?+xX]@@@@@@@@@{ ޔ#"     @22DzAysiRZjUϿu˗/wk֬^8.'z,h+-R>}QN-4z!W Tfw߹ƍGN>ʗ/Ǝ?X!!!/]C,Y4i$Z*8ނ0~e HeUΜ@@1bt"{曁TUӧO*Ul3f(llq*ƴX@aliԨnF;-Z4w_yge}Jݵ~nZk׮um7ooĜ_t环vmlaj߾y)SF&Lb<#}{1k֬_D.ov8r~ٳgu]wE@@@@@@@@@H4 #     @ +RݺҽJEB,`ԩaU9sɣ{- v3f صk[Mݻ2o㏻Ѓ)Sխ[7mVСCnjuXd]PLX)Q~ĉ7XHMkժtҩG.|. N:*Vnv-?@(UJ_ .+@E>sA~/^y@VǩSG1c_d* ݉nj`eΝڸqD[fl 9Rׯ>lt}lC[_B( \r]e˦6mX(ٶɕ+ɄnFu7cEժU?^a}*TٳgOwO>_xQ? p_tiB#>|Xǎs/}Μ9jРV1&(         @* j&N#r@@@@@@ qΞGڶM1zI}Wj .hڵ4iʔ)*j,іp .\^֭[9sfOХKeoz)-^X?w^woQFQUvd!Pʗ.f!;w ǂ$ʖ-id!? ,СC]JZF>c9st!Vgk;X8'tu qlA<2@?|ݲ ߉O~?xw $_~-[w0`@bU%p}}e|կ__ӦMS/`ܸqnKǏZرceO>azM"Ξ=B'ӤI-Z>P޼yF\h7G킂: b7Xז8իWwvsӧ;t~ /q^f+aFF|'obŊllĮYZ1s1l <Z` ,YX@>뮃tNGU{-X1 {svt          AE       'NHI6'Bкu\hAbŮ\ܹS:uG#,B /Qm~ _%- v }%gw)bYD e͚5ax R^ұcC~X0?x $5iD< Ч|{ҧnذA'O-n~Z4W\WE<}}j7>}ZٳgΝS  ҥKa< 9s\ʕ+M-^}U7>r-հM6*P!8GLe3fpA"jl         PA&4A@@@@@$-pT|AҼyRΜI9T@ lnIZPY3N)@@*EV5f̘k,YoTOn2LbҤIׯvڥݻWܹ@@@@@@@@@D 295     ={d!V^|Q? IS C @'; _i=@}RE@RRp4wnwaC@@5o<_p4+V,Gb 2>uiӦսޫ>LИ1cTR%IƍԪUK5kԯxF         ēAa@@@@@@ y (P5W͚5ӫ6QVh@i^Z {z"G@@ zAiĈ7nVlhA&}8sj۶۷O7߬ŋ|jРݛ         ķA-@@@@@@ O^G[o<}룏]Si @X…ŋqp0  X`>_G F ȀZy{ڰal٢x@ׯWRԯ_??~zP 2$>OñAysňl{,u,EZɣAiƍRZlիk޼yW/#.\趻l4@@@@@@@@@P T      N6-2ғ y{@ ԭKdrƴ@ ~f͚QFiСʙ3gƛ@ bGt%5#Z2OXb;vVXlٲ^zjҤ֭[vw}WGug̘ #%4 @@@@@@@@@ 2A9      D?ԑ/._XEixi׳@ y 2hpd@S㏫e˖zb[@V I#u濄yNRJY{۷O+V#<5k79XO>Ds$@@@@@@@@@ 2 V#     + H.E}T>z"$ 6ׂӥ}]Jb`˞~*7Hca }/M6h6B@@@@@@@@@Z^l      ;97ސz^{M> _ƀ~[j _|vFO={VҥKNCBB&MM6ҩK̜9{|ƌ*U+@k(UJ Εjּ@!:Y,Dرc?tQ?=.\ {TpV( Cs}ܹs+O<_LeCd%K~sc(Vq{٘==Ae`>?}p96i:ioަ^lxlv6ڗjxDޘyG 2q!@@@@@@@@@|| ,4$ZH'9       о}dA6ر7kҮ͚= ؠ#G G HbDfɒEr?~`Q@"hNҬYg) )Y`Ϟ=*Q}  6h˖-.PoǎΝ;]Xy[(M,l!oYXGѢEUlYxBb*`m۶ױzjZ+.)RDo[~) ;l??l>X7MqW8aӧO{7Ɛ6#k֬ʞ=e6@J          RL)Wv"     @ؗwa!wv{ Z xr̩̙g}_?:u&-ڗ3g2zþ,ԾoA ʈa.҂=Joĉ,X=]8= B FARR^ұcRPPJk=E@ jnݺoqlҥzcƫWXEk׺м/,xܹs9Z_B:ZѦǎ՜9t9\@P V,8[nQŊUreծ][JWl5uGoؼ1{;Q7>1cưixAMOC3`oޛ߱1oQ=ll&l 'v{{_ڼ7B-m=0>8Cȑ}~xS,c/S\0          LJW"     @@ַl/luְh_‚C /Y^*[IҘ طoa֊X dɒ%K7%q%\ׇnIZPYg@[ߐ!C'fl,(nŚ5k,X%Knx/_>h^M?f,./0Jj*Dg}:unݺjܸ Lzqg>,1|F ^ࠅZM-{ngڵϪ IA@@@@@@@@[ ľ@@@@@VTi&0aa_cs ),RHXa%d 6,ZmK̊YݻsNo.Ds۶m͛~3ft˗W ܣbŊY΍ĕ@Rn9 I_gϞbO3gh̙7îO[^=ծ],Zc .h.҂+aarʕSӦMլY3UV-N ؍%,v׮]6n`7>т-4o޼Wym\mOI6^g +oꅂ:tpŋa O:{PB*yS>K a@@@@@@@@ Cc"     @ u!?.]UViղ@ }a2        \Aף>      Ο?-K,ѱc+J*1c$ހN DzedA1V5kT:uܣL2IRR^O h0MD@  ن 6mhfX!Ch۶m[]@b۶m?9d@rJ3FƍÇu]wwjԨQ@;V7oެ-[\1Gs9Z^ѢE]?rm q!NR .1'OJJ.hTRf1n&CHd]6N        @ 2I_>*     1/sXBg? ܹsK۵jՒ=UvLU; Xt 駟?̙3.A;հaC( |_`| r@Hi[n7߬QFC)h>|:uR׮]ݍpK.iƌ.ʗ/gyFڵ#t:֭[׻Voj7pb7ٰG +YZfׁ.!ȂM-Ҧzjlo>WԩSMJQlY(W2e         Au      'NpA0sL:t?֯__X^=x85L$ 9st i_oܸ~i_ʧ  PԽP @ t믿*M4WdvӧOkz5kV=S.2W\ɬ1oڵk;hܸq.pj޼y>'WZ%s6b%O<.,Kv!S :@ȍ7^ؼyΞ=+*Q [TbEU\A@@@@@@@@  />MG@@@@@ 9 ?~\SLqٳg+$$Dwq5j*THͦM?^wAj_ϗ/5kVZBA  T,͚ $ ÇUpa 4ȅd%`F ~GzRƌ`K۶m / & 2Dzk, O֯_Y˖-ʕ+]3elL|aֿ @޲ϛuօ=,T"mZ =Vի`Q         ,LF      .]$ O4ujܸZhO9rH@>LdW_iZt (zH> ې@ F/I:vL Jr@L ˗n %޽[]tݻ륗^Rܹ^C+VP=\a~\xfP ɓZh,Xŋ۲ٳJ*h*UM7$k @ 9sƅZJ߁lH".f͚7+VF&qGϑ@@@@@@@@ RP@@@@@V 6lFCaÆС6m,Y\> رC&LѣqFUZU]vU6m!CAs@ l/XGZPe|P@Hqxu7j߾}?~Zj fh r5X!!!z]N8Q%KLV=}ϟٳgk޼yZzk_ TV-:wTR%s\(e\@B_Gq׮]ʚ5{֫WOwu h%5\U        @AFn@@@@@PUVi2eOSNn>@L\G}?܅ZpJϞ=;w9C PԽ|Cɡ5@k۫hѢj۶^yk;[;P z7SOiJ>=:(}vlRvI&;#M΅YcjT~}թS[W -\̙M6 q/_m5C@@@@@@@@H      hi3fPZϪI&J&MU$QG Ǐ[n۷rʕD[D@ )k':$͚jK@[5j/.]/"nOvy=Co5|pwxkٳgci„ |,k.WuaÆn,%SLq|V )w^9sL_r>UiӦjժJ(\           cǮ      0{Q>}4n85h@/ /Hs(p=ZN8~gϞ JY`W/1>gd@Xl 7oΝO?T[l ~Ub_K.7|# ֤č^zIC Qtcƌє)St7vҢE 5nX rXHlPXBӧOԩS/rjݺ:t蠂 &v9?        D!@d8B@@@@@/3[ /EjРA. qkS5tP+.=zTFȑ#i&}j׮4ilٲRU $m4i$}gڸq5j{LRN@4         SWOL@@@@@T`߾}jذ> iРAց!>}z[7oVUNK 3R`i8;$B@ ?ɓ'[n~{Tp2e B WO=:u_~%rmݺuw"EnV`!o{7|myml@(QsBWXŋcǎ*t vN>Kc@@@@@@@@HA&+H@@@@@H˖-S*UtQYFzR4iaKiRRȗ/Əqƹ/7iD'NH*է #2 \& iUVnjU2d=Wa7Kxea&Uʕվ}{]x1oGU2esNM6M6lPϞ=7oD'FX{=k| |wtܹ4B@@@@@@@@ j_'W'9     4ySf f@{ؽ{OjҿW&ܦMk4G3gD E$0b|ұcRPPrjmA@ bu*k6\ov2d.]O?T 6o\[nmmօ_r_hU6l'u*U*Tlc*X`X"0_jԨtЩRbʮ]JӦMuwFꚗm߾]˗+gyϟ[os^~eY[bZ=zG};Ack̙1c;(P ^되׆up :uiѢ/!N{8t萫1Pvs/RWciFŊv!!!4i tic@@@@@@@@H<ԉwjΌ     \)fסC}g@x^׳ϕW"pW$_n@d/sN-X@?muօ-[dΝwQ\{G2et]wuŋ#'O͞=[]tq3O<*Y>CM,YǏkذa.H.Ι3ǝɓXTlYeΜO)RDUVƍضr歋, ꛒC h!pk"1%v;{[oѝI+W &C H;de&tp 3f֮] ބ=u @Wtg{16PBzfͪCj˖-. 2|hpB\ψaaŭ[v?|NVD۳ @@@@@@@@_ 7       v-\}Y:%Yx\?=4$$Dwyg ĨB/p4ihq{4sLm۶ͅݑ9TR /* n@$`بQ+>PB.6ʗ/ _tҩsβ0G+nUJծ]=oذ*TgϪN:Ջ/zJ9st۴mV}'|atsڵsDz'xB et&M ]ۼ1<[o.rQFԦMdcqwi-a Q,E4h+W~ qgϞ.^ ]ҧO>=P%1ۛm4G}4!Nust횏wjjժ j۷-*M[H%((ȍeZ%WVMV         $A o@@@@@@ _~مt9҅xDIZsNY0˗`2g^~XRnA#Fаaôt@@$,PAIQu@kOC)mڴWeA{ѣGbŊH"ad˖[Y/Yfu2doy?ok!VnjOEe˖SNu_m̾}|sեKhLoFM7A- _ ʴ%W\j޼>8yޤIӧ9s89f߿_Njc?ï;v ;>}[ב٧Mo (۷O>d}|g߿Ο?YnL<{⋮B1^M÷׶l\'c_}n{#GhB3fp˖-СC8O˖-]J=TfM7o!65o |?N<_V\鮇X[AFw} Gu @Ab#`Ag{(6Ga_@[O?7߬*U\UQ }} b *Kjz*Z@3k۬\o֬Ye»رC5jԐ[ХZ Olg/;Y0-ӭ[7lԨQ4 O.7n|LjjG_v[7}`fZ:Zk&  #]ؠf+v {8V3 }B c2vGڴibܹ?W_}խ#jmٸNdljhytic+C{넄G<0aBgmkȖY W,n@b6cM[w?ЍEY(d8]o Pݽ{ ^yZ8f޽]eMPLǡcF6ݪ ^Is}ry1cFw}|@@@@@@@@@ e23D@@@@@ V^2e([l ZO2Z/o߾݅@xz7e%jr! 4paʘ1c\c4i .u1a__`,=㾼o%[nf]c=_2-J \r\|ٶʬYDǞK*eÊ+ɓ'Ķ={?OY(bڵ3<,BO۷TRq.B?ъ+W9rpa;wvzx&RΝ;^ q>΁W>%_v @d+`AS=P{/Xbj۶U۞:uJ +!XY(ӆ +'[8z}]Ue7 OO΄     \%`ٳgjyB,-_ԩSJ*C XlѢEXN>%JnY+U˾Ka;G0c_ صk^y}Wmi_m۴iSU\}޾n//j> ciҤIi>%KhavҨQ#1uTuIÆ SBda^ZgE{}}b똂V h|9:@ʕ+{nׯq/D-ŋ_M8.`B,ܰG.^>OTvM\2dnkZo} 0~ fb}b[/g猨lF&L ^\iavlܼ}-a7.޲~wÅ pAur!r_ǏOCyw( )̼}F`7 ,06&c9~aws9s渐CoyL_QM{t\>it6Nd!Wg ͮώi7:9Ƕx7%\r}&)RD9stˊ-i% /[1Vb8;`4?ȑ#>rElX}P@@@@@@@@@ L8k΄     (P@|M$kw4i҄hӦMp˗- ?Ӻukd`͚5wn1)#GM6.?tPonǎB'^M>>WdAlcaV/{{uab}U;^\YyջwH϶qD˭M,Zj]?n`%1kaavQC|kknvjB7kkǏwyG#FO<V!m웱H ]n?_b?VLs(&:Q/nqQ˧_N/5.3m}xѵxޘ2y;/1&C'y ݾ}>3X j K.iÆ F9\O        @rɭe@@@@@@:ucy_NgʔI'N}!=|zZ/H5ʅ*THfR˖-o˗/zZfڶmױcGΐ'OFK..$Q'-m{,ʗ_~y?y?Ju7b ?G#&'k]{ɒ%RA9#-[MS@RAFW|y=z4/mb[ ܲeKlsDz,?@09p$,8ΝWbE,L4Iwyr#E,Xx7Gyhb}Mh6 ߰bVl{ضB PSNyu&/U͟??l,_=Y .\rٳ7&犓>|:ut͡X-IXT))8X;7 7# ZJM6`ߋ,ʺu^ל'oyo]ditF;ԩSxOc5ݻ7V߹Dʒ%,HѮW}?~woQ0"f̘1l}ņԂ 9SY_B.KmT,x:Knra{N?{wgc컐d߳%ZJ"pT(( Z["J lu) %.kd7~i0fΘ93gμ:Z:s]Wʕ+Wt{Ѽys=SwSN5[϶׋k\s=׊lqB zڋgו9L4@g(Pw}yqvK(= &Pz→_~$mVZy7h07|W^X-X?ף>cfSL^vvK{6XŒ3tm^pԩSp{ލ+W,|IiF;wֳ>ς ?~/Y =zp!hd ޼/RgV 3xɀ$T :vaaM6QS…sW?Y>[8`A :oB6ˊm=Ⱥ2-ۿ߮]]FyvNT kҤU3 $}n}b` >a=sQmgu 9 {w#9_MlE9gv|7Ne˖M3g?9sxO 9ԯ_;.؃FZШQle駟ʎǃ Ҳeɓ'{\&dϪ]z1m۶-( yl+U@IDATale ǜu):f̘^[4k,b)!eZrXʴZ@@@@@@@@H_%pm>       z뭾%K܍痲yq;2fsW\9;]?s7{l_oPH<|.עE … bݺu>sx$|=ٳަ'OURūL\ oڴiB ymvKJ*˚5ov FnҽJ({}j5n9|O%?V թS'ڬFmg;nok&z_ص3cvBv|_;vr\ s >ks\!X ס5ݬ]g6)̮?680zdJz@@@@@@@@HD% a       @=&Mo9\FRn``xSf{eɒE.R.P/ hn\.8C;vw7̟eJ:uJ6u {u y捞g/n*l]-Kl w^Y]h9kժUrr-,q7krkĵkKtE4*nTpt5in##GszK.+޾P{-X@?S k֬Ӹ$kիK.IVdj+l;6>|X.pN.-IʍY9<.\8$}ݦM<B&iqfO<\`C(|!Ca]ÈJ GRHlou7ʅ[ʅf͚Zlw-DžaFWc1ɓǛZ(šC;>zA2]KH r*:ݻw{&9[dhԘ1cԺu䬞@@@@@@@@@ A10x     )/px ӓ&MnnOVނ={En`:uw^B8as΍spZ8|p_ ékBHX1ABQ4@K>}ڶm(P R{==^p??ލ {L˗/zv^ܮ];͞=[͚5Kv+VMѷo8`]V~A'4Hvp2!Chڴi!ַtl@@@@@@@@] C쳙     @|X׺'Ojʞ={%6lV^=u]d`_KPal޼>)R$|;M.I?#qa&>J,yI        G R*     $ tkMO=-DS q ̟?_>,lazǕ%K7b) IK.I\R )$p!Y~܊Sz{oW \Rƍ[/wrIQHڪU+YF?J.z)9s˖-;v7ܹS-ZЭު֭[ ;&HuGFFرcnMcɓ5qD-_\7>XHll& F@@@@@@@@  D@@@@@@ J`ʔ)zǴi&s=zUdIxy4d}7^СCU\E  C G@ f̘6mhݗvL1B}Btҥl v_ƍ5g]}!+'{ _hQ 馛TbŐn?C :u=8`kM6MWVաC~!^^        -@dx_z     @X 9sF},oÆ MU?L 6hɒ%wԦK.Չ'G k{|&@@@@@@@@Aԥl@@@@@H6 2eƏ3g*C t7u*P@BS`ժUg>'|anM;wvk$^U PtҠAX  k/Ϟ=%{w+_|OK,WMͥDIT3 vN:?Cp/_M8֨Q fWw2         @X N!     /M:U&M7|HլYS7tnFթSG3fLHaӏh_?ڳg >MB)G a.A@ Z+͚{B@Ңs=>@ׯOO>ܹSO>dtСC&xB0QFy!SOZ7ҥKl2op.L*UW_=VXQ J-3ghƍZz$B - 2K,R,Ѯ[ڴrBk7@@@@@@@@*@dPy)@@@@@RZѣoW_믿֖-[={v5lPM6jR̙SԟH}i…Z`Ν\,v̚UʖM. RzU87e! t1c~,G.$Q I*жm[eu??$-&rJ 8;'V~au1MڵK#GB ;>}Sܹ>|bb ɦjwO"+T+қ+WNe˖FÀ@8 ٳG֭S׮]+ zT46[dI/т-Ѧ˗W <$? @@@@@@@@O      Vv9s-B - nݺS7.]:n9u@.],m^HĖI-uV5J~vء{7|-եXyɠ?~G^0azԽ{wYdIv?.{]sqÆ ^xm۶͝Gg̘Q%JPɒ%-Dp>А>2)G,+ /Msܽ{wti٣M-F -sLiJ*F@@@@@@@@ U *wF@@@@@` 9rDs\fR%W^y YbEUPAe˖ |0X r-|n?CfnS ܹs9sjժ^0g5TfM]uUn+?0HUj-@dYڻW5+Y@D`ƌjݺ,=O?PׯOک27g/DB!-?W\_5j z!v*.YD ,_~ t0˶mzիWҎ߿{X]ClS gZC.p{cL1o޼ucA -p]9p7Z}>lܷo9{]Tlټs1D-\BF/=@@@@@@@@@ 2@@@@@NԩS^G 4͛7nT2en47[c֬YСCcv#3Xh?^g9ri2eʨlٲѣk8sFzikl:u>}]] IK J\5S .`A|v^g]z!l"voygrCTW]ut9^0k۶mαa VҊ+EӧO=8q^`M|!]k?v"*8Un,@B!m;wn/ȑChc >>;Gȑ#vu%{mjAo6=?Ӛ`3@^`          @ j{      @ E9޻wwSn?s,={v&w|3l ¥Z@lS 8mcFFFFߤY?&~6F|+#`uXP`i~Yxqeɒ%פG\9CtҤIK'K.C@5@ _4(Ś@ $Hշo_ 0 A۱rh lݺUkha7nhO A gYls];gG;ǴP-,΂yS=+TժU Jh %>j0A>~9ʔ97z?A~cc0Bo->q 3f>i6uw{c_,b6Zx}bkD6Ͼ6w2}=qgsj?v ?l;}~?iSA*v|1K@@@@@@@@@  G@@@@@T/K2d5-Zآ?p1?_Mvئv!翏X3pʟ={ IҥKGxo7&} #H-=v$&  pWQ=ؾ]9R3F:|XRr#IsgekVT^p8u ݻUpaB@@@@@@@@V Ȥ4@@@@@@ AcJݻK&=P6M-lq. ,Y"?\~Z @)SmmKÆIVI7$  5mzzC)`IJ.@tjΝ*RHH!@x D͜`;IzIw8QA.$C@@@@@@@@M,Z     ) !"""4~xmݺU\ݧs         a"@dH     C`Z馛z?ҧ[o(O<ҥΞ=:Ѓ奷ߖ֯ZʖF"2@ ȅ S,GH%k֬!2+@js?X1{%;' ^SSoh+         @ZHeE@@@@@@ 5 Y4i)SM9'h]ʞ= Oj֬W^yE>ϟ̵vuŋK#FDB_QW^))|vZ/PT4o^跕"]kKnPBE h{C%{7GSO,m( $,*(@@@@@@@@@ 2E@@@@@҂@dԮ{4s?u>}ԦMqڷo_PX17$ ;jԈI\!@؃ OHct@ d֬Yc@ ?umZpϠ-H]O@Hwxa@@@@@@@@@@ , H'@@@@@@ T|>Z*U*T[v{ʐ!v*u%c_JnI:iɒ Ve A.\(<(͚% $ժ%U欄 @,;ɔ)ScǤ1c~6h ^-%!?rOz         @L cj@@@@@Hb&NBZ5 OɣO?Tg+­ ꯾Z:U{)^=KPn9CP8z4*_\|o^{MZTʝ;TZJ;@Һ͛Ut@@ ~ET-}۽5k          T Th6     QK/I#5osC ? \Jij 䜢A.*TNHS t `9jE?ZMٵK:{6Ȩi (U@mTD @ Μ&ONRbC oƍMͽ         .@dV     ,0c /H]Y\ԪU+~ڽ{wCr7[,+><[A}  .01f3f9 A,Y2@ fRRRRҀR!l         @ -#     @ZX\Q.ӆ¸q-[6uIgΜINd/d \FjXAjLZ69@. 7Hx!]:P-e> +`A%JHJ BV`k$r u${{XCv0@@@@@@@@@ OK      oZՓFN;ϝ;>szꩧNǓEJ.GI%U"=tdN +etXn_@K:rAN=; h(reIi&w$fR2!p         @2 T     -`A'\(1cxUVM#FСC5cƌ>u^yEZU;7XiBxqi0)]ػkA ž $֭[J(RK< j׎:]XUʒ%DJ3@@@@@@@@@ C`'@@@@@HgJ;K;wJӧKs>]Jz衻K]tƍ/4MDDTXg//]wԭt@f z42dp3@ضmWAɩN]ĉRӦRJ̙3H;vH'լv@@@@@@@@@BU P3 @@@@@RQa_~)*}7A)kNǎKB%KJSJ&I|1cFZ9}DA ŵ%@H ˔#G䩐Z@ ,}Ir?iZᇥSM0ARaQo<҇J&IӧK+KgE\@RR l=9?y @J ܹSŊK$`$x 骫T矒=V~*  L         Ao     Y`v];^re͛kȐ!.b͛ {ZMoIuD}zH 6@tҸqR`K  "o>(P UYRQ(Z4 J"-\(1EfOÇWDDD* MD@@@@@@@@@ bZ 5      @( 8/4~\nۀ\Xf;uA[lIî>}Wi&BxʖoO"lb@I`޽o?Z@ >DjHZUryv~;jɓ'տuI7N}         A)O      j7*o)gTۍdi￯".oѣGp;e$OQCp1CW[Ky @۷O Hʩ%mRR.RH}HsS]v_g&@@@@@@@@@@ A6+#     hiӤeO {3k׮K'NTtیgΝ9s7ސegC#@H cƌʔ)Οڼ̙3{cHA@ػwm =\GO rGKX;4tP=nWf @@@@@@@@@b 2v"      ԷooE-[֏uf^(PT)}s駟p%$Xi0뤻.&OJNpQl8{>:佷yGƘ=cǎ]0?~ |Gh!ӌr,\B!drΘ5kVHBs9s<絽ϕ+rނ*@RI S~iSiXi(i:qcix[6߿ *~8Y         q ' @@@@@@:t|wըQ tդI >\{Vʕ]K`HmB ۵jՒ>LjK+@@@@@@@@@@       pСoK*Ez+d̘}_ڶm+%2$OKeH=zH{JcHIV<!$ǏצM\`mܸ-?8p YXbh}5j^)RD6ZM9DiA ;vL iSwᅌgp{l 3@HX\m+Ttig@ Jދ9sB)$p4s4rrחڬKO'd=x=y@@@@@@@@@-@d )@@@@@YekW[7gOOyݵ)K4%l֫WOwy .]K/-/EʗOj^:tH dH/q͚5Zvm~z/y-cY^ӦMCJ,gf)`Ahc\@ҭ[F^|N0s8]{O=Ztu҄ 7KY x w>QO>dˢ@@@@@@@@@H%      'OF2G 5'`A\'OVf4p@ˉ+/hR9SiNҧ&M1# :uJWo=zӧO{> ʕ+>-0> ˳т  F6ɂ 7%7lؠuy!pk.o .q"RJ+ *3@ ,2G@XDzMϤ̙dѻTbu_o&S\`JB@@@@@@@@-*@IDAT@ ?t@@@@@..п2̴t5kzvfCLfD 4lPvf+QI_}%h!yR8p-[˗BaVX@Br-nVoj˗/O0T\j!E9r `TM4I/NTREUVUսr @|3gVc9$R gK;Kٳ'X6ӧjժ.]IJY          pA^!     @X &P?]XCXƍջwo+VLZJ)%Z M WzE@ Ncǎph"o%ՆŋZjwv\*VAY( c9ri! rJZʛoi)SF5kBիMeRt Q pܫ)AGK/io/ &5hV~'Z`/^t"JF@@@@@@@@@ w:]F@@@@@6mzGs׵ '2et%J駟֭[7oM,Or} \ k.͟?GXBO_:uW^^7(P홁 Xsػw/_o@eȐAUTQոqco,\pMyAʕ+EHgJ3fD=b,D gO`B ݻv@@@@@@@@@HAN@@@@@@رT4l؅EFFz3-Љ!iz-رC[Е.]:i+4zJIW]%iJZ믿4g}7vZe͚UuU-3x JTX 7 vޭ%KhZp{=?~\˗W&Mt׫Yfʛ7 @HXdΜ9C-4.ಢ;;MvM/M,w,ED$O,^2$y*@@@@@@@@@ҘAil]@@@@@[`@ߥdpSL2]9Ȑ!>s5n |%L6POiJsg1+/\9+gM:U3gҥK-[65jHi5Dm~Y Xjk cٲeZ`[u]ǎS͚5u7m۶UҥK 'NpPDuI+қoJ'JٳKݺI'+Wƍk_T[          p ܍>K.M:t=aB     iraJ҇Jw{S,Yujͺc_?U~})RDsBU _ )5i">,50#Μ9s0tvZlnAu!17]  #fW_}.\ ԴiSEDD?=Dر^_\h,5~|T/H.]/urj7|֭[+V:,@ooZ        V@@@@@HJۥnݤxgK6dʔɛș3gj[͓[}|?LڹS':{r)Euֲ!CxAgU   ;3z]w]mqw޾HNH6yRrSWjXFOoR*ҢEr!R)iaSN L2ڏ         Aq      gF?,(wnb01OB ߻n|,\;HӦQ0Ç*.Ek͛5l0ݻ sSA;1 @wھduwߎv,';60 s̙3G U 9#M,5o.U([4HS'խݳ_Wrkk$         M ȠR0     CEO>e`CL^U Ș?\Ktyp@vR׮R^.gNcŋ{owu ٮ3fSNʙ3g -EK}o;Xa@` X$Iҥ.k RRRrҀR_ ~WCA@@@@@@@@@0 2w.]C@@@@@,g_U} 7!cƌh޼>#1…f $p` K)0٣zHe˖ղe駟jݺu^[BT*` ca ;fݻ7TM@  wMRǎRɒҰarrBV!/8wޭSPҥfB          %B]     $CwH_/XݧNV̔)S`XBz-nZj%)s!."nM#GԓO>ZÁ԰aCѭ9|}Iw} m27P.]ouTZl_3h+Rftay;ոqܹY)fwĺ?uT*UJfJ&ѣUB-]TsqoZhtŽqcjժڵkWzbo_{1tWO j+VgԵ8Ծҳca ;f/_;)Ҏɓ'u)IiGwQʕ&MM1c$O/,)TnwhӘCLFiurOzǽkTC qb@@@@@@@@@T 0ݱt @@@@@>1iX׷5"##6_y!L3fѣG>9V:{V\_~E:{f~wM&۷O .ի>}ZڵyuA槟~:o ƋEi޼yޜvGՋ/6mĉ:tMw҃J+>'1 زeKHP޽[͚5ӳ>Ο?_ 4Hv~)},hŊ:sML5cEB>%eg7oV՚5k-b_l~qP^m ;fX0C7o.;0 I!`A&$eVx@*ZT.D[|N|NZX.)KbHk)[l< !)}} shgϞ+gΜA֭[Z%         A^O      7'HI ƻz 7P kxUPA{.+T^X\oӇ>ŧzJzr+^>`3gyըQC-Z⦅9sx3/?W]vjժ{NVިQ.*.v0=7/JP3<k\߾} {kkJw.cYza:*CJK2gά=zQFBr}ܵkWo@m\r.\Tj^b_U uJرSD*ٱH 4a?=!"`A'JMJ*ɝɝH;vH'լ" }=I&.Mo8ʢ>JBK=G Kva RJy8r7?rX@@@@@@@@HM{'_jR      6lx@OƄ5=22R3f hAiܹP@/61\r%GUz!/ mʔ)*+1g˖T%1cƨH"jժUt={^=ڛ&z^.]+fO4IٳgWrת[!mLosQ߉g `$Xe˖-;RPXJ,i6WS0ӲeKM:U H\P8dȐbKUi N N {H}ɵNJc;1Ŏ-7nm5! y YT&`Ah;ʝOKvR;o^siF u]' ҭ[7ԧ~귱{U;V/^H?zJӦMSrT~}~_~WVv*TY[V-[0zXֱ2گ6j>k֬QϞ=`cܸq=3pԩSu-hС:ꨣ-[LM\˖-}7k׮UʕS3Ƴ̝;Wg C W\R]vYft؊Xȭ.>װ{@nA&Mg}[L~h/_gyܮ )2F2S54Vg ʹkOuűym6K~w6>޳ڹ뮻TF }:JZȑ#}ηgmؾ}F!;xvJժU/O;zX}s'>btK*R^z%-X@v6Rƍ}kx@cƌG}k3}0M2şZłQl_v.t)C~o}h׬}jذU^=_p>`0un}֠AYdx≺#Ca3[oo6 ovZ`LeJ]v]i:5Kf`>*]-Np 1P'S/_l,KJR @Hփ_w :HrҔ@f̪iڴGgC=4{2b 3==.~TWO>d# )Q6$ؾt잷UV:aҞ =[bg+ۇ}wbb߃Xiݺu"@@@@@@@@@/~=ʙg @@@@@@ Qn-J^ y^=Xgy&p!S \ 9r$Yf~'|k+Wnݠy%\TX1pT ,^8pAtѣ}~藻08ڎB_ 2_7O?uѿ{ \CsA*G<*U,>=O>dPD ޭ[F TR Cܷ \sAۤI̅:e6…e.,.l0`7܅7DDx^͙3Ϗg5.,kdժU mt6/k9q cyoŬ{ T?cVZBG{(:7tSd̮Np:&KąDC9$8Ӄ.]xKh繀H\gΜއ/v`N߇tX9/lgp=a„`ǎ~^FO_0Vp]x+W]u)qA & \]l+V 4 ͛޽ױ| ¾'NN..8r/wuh]d+.6m\QMSx>ꫯcۗ_|őZ_|3;?cX^ ɬIdW>@ lJ?woYZ= >WwOg^3#{Y.JtP~!p!1@v^+$^}5uAq`!^)|nJ\Hl3JFVe=e6|lшTݷ|        $g9W9K     9/`yz.(xBj֬都zu*D- իWghԨQpSO=5}i e+VXL '=a~?~|n.}Qv K[;0li 1 ѴI'䷽#=P ۼysd~NN|9Z8uѢEq]#oa"ulp).i|a qW|dt9sGE]CaX5_W þ*sz~B6-0,Pb'pB8Y /KRJ'N跳p01 PF =c}bxΟpƝ;wǏ^A0t>f^ b)zu,Akf7n ɩs1 X`O —?O?Էk׮>v`mL|.bid״X>Yu< y׵͏|\0Y;^Z|)+ 똗c;W  2rlg~-\~cr֬DmJ{3w\li,Ss/}gFG9]ƥ^TRŇ=g >dVW^Agޛo9Ra'P炭*g̞{u;2YܾuV\MXH B^         \R@@@@@@ n=WC7wΝracھ}\XpG}grAeEINUVr_ڴ˗kӦMz뭷TbE͚5wraV~}; ʒ N9?5.Iwu{9 8ϳmvޭ^C ј1ct'˅w.zɅj\pn6K~^xAV'f˖-.d/2/'逸>9۲ Kw}ڵk̅ȅ/3?q}iڴi{P|y2P3-[6\5G%JHÆɝҵJ͛g}^{ӻNb]#~<`kąr!zu_|QB l/YF⽎}3^fjԨϪNZ'L2e|9HZh!Sۦ[njݺ\X\УׯoⷱW^ S#<_ ?;k.\l8vbQ9usb^mڴgy&ϻ@`Y?Ѵi:.TOׇ9~.Pn֢KˍsާuXe%zi&.,7U^֩S'zv\;Yj>3]\ *U5h~윯%K\ fo{º{  ?MA GcK͚=c=_=Cܖw?]v?pBuO^d2.#.þ=zڶm+r? ύD<uWy#Ut?!(%gxQ2{{uhG ;v#HF߫@@@@@@@@@"ׅ@@@@@Ȧ?)n$?R͝01ܛY Oª:TӧO̙3h"B ǶbW{kZh1mB,x_e0~67o㵖~iǏãB3l4&,,;~\∽,ts,$|oJi5ufo6u ޗ+\Rgώ>%|_öڹѩS'2tY3|@d8?ƴ]Z[~wY֮]w^ؖUV͇ZDkFdnqkӶ>~b͏^aÆoI/dekbxFocǺi} Ȯ@<}}vv䶀CrAy}4a4~ʏIHK{c}F֏z 3._~G iɒ%۷m۶]=YJǞ=V_u\(<[Y}f3=Jt _ۏ P@@@@@@@@@d 2Qڃ     +2Ԯ,عsJ,Sm[W^=2?n/Ӗ[jigB,T'w~ sPA С>EϰΝ; ]*ƍ5p@M8^-?SY$, O9۹~4m-^8zԲeTf͚k4rH]|=aÆee7Y^ב;7ސ93_ժU:\#bv9۵k;_][P%OXjf׈kc>g~=;9UXѿYp 1˗kҥڝ^k+<쳲>3Fgcgub;v숹[;:,/6(z)'>St׏5?z a9ַۘXcȮBAs\(܏ H\"",t1%3ƞ~-vw>jNwww?/v=Ιg#ߵD LȆ UdlHfٳp4 $͛7i[Yb?߭:"        @ p@@@@@B#r4xtyr޵k,g}jӧOt`]DoiԨʕ+^{M3gΌlfalٲȼXzRSO=ՅY4 WZYBf-Zjz] >̂ڴi7馛RL:U_}fΕa`f[K/+Iohg֪U"̙3LJYp[bat񖫯Z[nE5jԈwlwIWwѩS'Q<׈Q]zGωsЮ nA>W|9ݻwzɉ8r?&ZhJ~,z 4Hn6]xᅑXaw^)S&<ܨgϞeA"- }XT^~eO>/ӧԩ:H~vz7}׷lٲ%U?s'7Ōڕn"u駟^z:C3:L\r+,;b\Ǖc >2 8>wfͤ㎓֯{{ޖ?ˋZ1anFُ{セ]Ftzt6';s⻌+?/??۽I|~גA-yHb=[=leʕ+?g8[N]vGu+4         E@@@@@%pR҈| 6R,`,+,jժ,DgܹsB#,_O,ɂĺw[o:y:ձcG6X:-xkÂu˖-խ[7bihiKb4+D,J׮]˗/7xÅfѣG/g4\F> x]{7ϫX9>$j-pI \\PL` W \@H=r_|`ҤIAƍk \Wykڤ/v~7oj׮?C~a;vNĹ.#I0su^.&#fYuGvNG_ &u~_V.]y~ꩧfgرmѹh\Чwbł38#_3hI,>~Ʈ  `I>>pϺ.9G` ظ1jwuq?L{?"=] ft~~=G.`>2eoZF ^W_uaumh׮]`KF^<(^N=[پȞ٧G=P@@@@@@@@@dph1gYgWsf@@@@@ȮRVK>ݽ%\"Ч &k׮w}'b'.L.Jt>2yf-ZH5 l}۱T_[lQ "bM0.\M+V ^7YJƉT^]r6lXUͅRJrw3{ o&h& (O֭矗9'sͅ~cm7F{YMs{G3z 6}ݧ D/.֭P>yiӦMrrj?uArA?t:"O4z҆ ҩ}IݻVl]QɅgӻ6{ߙ,+epk.]Z\BS}''\,yς;^zՍ~6g|1W^ퟱҭ83@@@@@@@@@$ 2IH      ߻r4s\۟w .Uƍ]}ppaiA&'zmwFAj>4 l?O:^<:@, ǯʯgَ rFݹ{cg?cfMSs(s/׶m[g!HU         @O@@@@@@ E`(iDiԜ ܹS%J\xᅪR [f^|E,Y>qrCI7ܐ8*5W,:nI 69眣+B۷/}t!d},$ ]B-2ۚ!Zhّ *&ΦCm-0c l]tqq-XdO7oޜ ۭgF/H/$(Eɂ o4"         @N  \ɩQ>      E6m,.K~ qW^yy䑘cI\H_[ov5,Hsi̘1{vt…R3ڥ\veW`_~%%K=z7ey Y*Uc٣ݻw]vꪫ4p7N5}}ϟ/ Դs{Î_^}YM>]vuܹ7#@ ʕ+5~%UK&iӤ̓J .\.;Zm&M(&Onݺ^,gf?l        $AP#@@@@@Ȧ޽ґGJ[JQD6wf_|/_,6ƙ`eիVqƩN:٪g}ݻkԨQ\rկ__~xns۶@=bfٲe 2$Wt:餓r?{g|S>}tgOܯ\pO:{m(e!TX1%ظq{=;vjժ .֭[7{e3@ ~]N81X, s/@cnx9RٲYY!Y}Ś1cF!im=VR%;H-G^~ዤ1m۪q M@@@@@@@@@ 2g      $JCJq P!pRػwo_އeY@Vh4jH_:t &'M,u)Zұ|0J,u 4i$+>Bz) A^+dnl&La~׿"En; %p{iOA -F\ֹl :O $Hx{f?,= R@@@@@@@@@ @PG     d*0wtҰa@fUWWL͛먣YY]dYݴqI\"928nܸ+$O,裏֨Q/Ȃ,^{E?w}W6lȓ:q?V횵k׮a횶kۮqG, ?kF /_^6ml@ {OKjT!C^|1pd6          0A&[AE@@@@@@ {H/n-]{mvvEB ?~t'|{,5TRR cA}f ȅ KTxٳy-YDgvկ_?U\Y~ ~[[֏!@v-5iצ]v5k׮]s״]v۵NAK\rڼys~&݊}԰Է[ol~sM4#FЎ;ԴiSu@ڥU)2@IDAT,Y2NHV;wiӦ髯Zqǎuq;TnTLde] Pʗ/M6P:5%xפeA.4q|@@@@@@@@@@ n:+eOS{d?      @ImJ*pCz- 0@ڵo*UZy't*V1cƤ_X^#D&(T&o8 mٲEǏw!sZ` ./ի}䡇ܶ~k^ dIoօX3g^[dչsg?tEZt,ퟕ@x饗tyiqxY@n^|1%r,2+傏 h6$`!xs_SC8,         PHvL@@@@@HB 4H:0k4)ON=Tx׷o_uQ;IASϟɽX16m[nk\m۶\J98wQG!O?ӧkƌ~׫hѢjذZjC!-EjҤ g@a`~Ash]S{UJԾ}{S_:t蠃>rn(˗_# HFI>+r'-uG0          @> oG@@@@@ 4{7QȮM6Mgyt'|R; 0aBaCI\"(ꕺ'pvء'O> X0 veҥ9sW^qwŋ͛ˆMpH ^z $ի}ࣅ>.\PÏ?诉bFQFjݺ m~Ic@C@ry͛7鐮ûJ#GJ,w)xtR*nL@@@@@@@@@@ iLڷ!     ._I"zԢEr@ +V3͸"ϤΓfΔKԬYSmڴѸq$ׄp'Gf ,ܹs#{ァEi~<ЇBZ(^Æ `!6]^=Y$Dؽ{-[ŋ맟~cG ܸqrҥոqc5kLs(-`K*h͢> @ /_oӦMZjlU'VL wr*Z`#         (ݍnwY)s^}5^#     9'gԵwRb9o ׅ^û^{5խ[7={j͚5\reŖ-KeH'Cy ^a[… `am۶uI@j2i6Uj׮MT-믿V #mN#`=&uҥʝ'iV%䈀Bxs_H          @ 13@@@@@HXfLLط@W,кuk~j׮ƌ^zEdatV,,A-+ԩSJK/EԻwoy睚7o7o 5hw\o/>2 ݳ%K4c m?JR| ]5kC5RMWVFC"d+=.9WZʟgvEOX@ر#bTul )tXn$X`f秔K I_?tB C@@@@@@@@@@4A%     $E7KCJ-Z$v]]h֬+]z>ꫯw߭%K0kAZ`da/K*)rI'i@ƍ#$jժnݺf\8\M<ُ-ςbV !T"l~tJZBYh%%ݫ 6|Xv֬Y0oAa`P;Q{t ~ ;( Y8e}-AYK-M |ying퓡u@@@@@@@@@y sޔ="     @. XEIMJ_KaD -[Vcƌѱ+B|^z%YxY %Ec#3zA䃀?x*-`|6z1a!aիeAئ-4p֬Y=UH#g`V˗Wr=m8hΝ;uVm޼92lڴ)ƍ}ȣ=FOk }CbŊPO <}>V^?U~T@ Os>C S|=>4r4id*ܹU          @ oD@@@@@PǥɓJ2F  .]VN:ZbEKK/jז Дz˂,,@n +VL5jC<ǰH q)-xqYv"         I'@dҽ4@@@@@X\zi l#Jlƍkʔ):t :X+W… P;~Y:4O^z &SO͇qHU!52kyftjcl^=041 NJY&01mXcBðGkAic <IE ~62u^ia_tnia>+Wh6/^[@=+SSGyG.Y.]R^l/B@@@@@@@@@rS e      c\"ը!zk!e%Jhӧ8 ;Vuggy_ɺe=\ԻUԱcG7 d} i,0 6aP_ҪUTR0UD(pLd{2ƍsIFII]vC*Y2MY          @ @@@@@H^Ə~Z*]:!D% Gŋk:sukՅ\滼LԨtqRn5.b @۶)=;_@X ׮]-, \udrÇS8,/AK.Q=pL*:H#h*^xc\h8D ڴfJ R5@-PF ;lKuJ睗5d*FQe@@@@@@@@@@ L7!     PƎ^yE=Z*W0KD(Jx}Wڸq;0vmڱcGW=W4qb*W=.mْ A@`WN~+ %S , p9&oQ@@@@@@@@@@*@da}i7      .ytR '$xeo^_{jٲ{BӠ4}C.fxm['|hV7Oz̷*p`@$Qvܩu%q+ v~]zAY3_- )          @A S@@@@@B&pMA>P!k8-ŊӐ!C4|uA't~߶i!H&H~++m߾?{c[Ȯ@6Ү]gwl @l z+$_FBvm[=S'MJȗjqP@@@@@@@@@@ Yhz     @ |4bRj[Oj@Fu/'꧟~R˖-uK8ݴiSF%C>H>]:tiΤn.C !68@5+!G@ @} VZU[߱C3F:}{/V{Lj*9I+@@@@@@@@@@(@dA|ר3     I"wo%]tԣ4p`eB p',6|p5JM4O<={w۶>@2E:4  E_ X(+AYcu@Tŋ+:rK#~J/dt ˦RzҧJ}']~T=          @ş[uV9)@@@@@@ @Rݺ3Hڥu睒 ~+5jkK#P0֭[aÆ@f͚_06M:8[77%slq \vYJqoŠ ظq.]FaoÆ Zlܹsռya ؏,XȑR͚ЂMS@ V ?eyK9Ϧ9Dr]3@@@@@@@@@ L7      PX~QjX*ZT*i@#nH(pBw_wyG={w߭::0 kה0R  F _\Z.H|EHz#)^{+]v?lٲڴi'CkצY_"]~Է $}f߯eVnYG)2[         y-     ԩ)S{A)u.ծ-]sMׇ#"M6oI&i˖-ر8 ͟??/:p%,f۶|@Pi#ƕU(L#@rM*oaٽ{vܙ*Җuܙ)>hTtR>ҼyKNd1Z~P%T@@@@@@@@(+BK@@@@@@@ ?"mޜJu?G8&y+pQGĩzw`jJֲe"x4 0Ak[2B"pr]̙4@ 6ls9G%Jy%K[n1 ~ NNYVyD:Ś P,ѾO˨lIߐ@@@@@@@@@ 2?96     XO]RAߗ6|Pڳ':B N>d͞=ۅG|4iK/Bo/M(}t ҦM.&GR>g]CA@`b'ܹS;w,Z$ "թ#9)A_,-[uh;WqcM/^\4(r         A@@@@@(7Knel.]s4|xX@2 -ZTw,X#F>(T[˅`J J={J'ӻK[Hꨣ N{NvSG>Ӥ >H ,V,d H~5nݤi5A         @AHO rS;     ?v޷Ҩ4stq.gQ \R`ƌsu:5eʔtIfϞJ/?xmڴ)ufgIvӵhQ֔z!PpZS n9 @b r-9/^:#\ӥ-+3?֭ғOJmۦΛ'S@w <}3@@@@@@@@@ qL      P(\Nl]O:I1#% 2z `ԿY{ァ׫[n>X_מ={"L#GHZɓեKZ* LԬ)M$U&NiΜPk@hX*UJSgj Z)G{Ν;/~ґG@>D溌wRZҕWJ&}eHeޖ% @ZNFk`Qc*WN&@@@@@@@@@I ~%R      $^lg,҆;|S*[eL!@}є)S矫KLׯ4iGyD+W?]vwޭCZpa;LйZ1qԢԽ{JlVj!P,ys \թ0 @ z뭲ϰ.]ZYM׎)uϖ[n[oI={J"tsI:.S @V*UzHj^iu@@@@@@@@@C P     b/(8@ztBBȖ@׮]]ZV{_j۶m۱^Z;vԗ_~cFIǧA{lt~Յ"l-[l)A[u:U\0ba2Y~W.==Aʁ֬I ~\JvA3RR-NR%+Ʈ@{dVJM         +@d7 @@@@@ H ư\ ˜9S..)J3ƍkĈ]C @h ܲewi&K y _?䓥^HR; @VRO@"p뭷 "E#,(V=-t+nws˿t9WOzac>}}d uNJ --~T         )?uv      M ۾}v]v| ±MT6Ck{ԋ.Ƿu+n6o[,YR\ _ dM`Μ9ZbE̍ڶ븯K=z.& yjUiikǎ\߅>.DZp~[Hg!l9 eˤ̫r@dgI lW=W4}tc!EFy1|f v/tlٲq2e~pwIuG鮻JN="Yg]k׮up<ܱ㡚<6>X_gMG+W*U5+c]@@@@@@@@@(QXS?묔=jN      a?ltIL6i&m޼yۺukdЍm|?`NRUgnsn)@.-#,$BBʕ+q.٪B .*el2)I)pgD7kذaja}m֯cˬ ֧YfCt8k@]>‚Xc /~ma=m $`1׎%KN8b OWZ+W~Ӻu|N[Xtc^}Kt8tA~`pچ5kVZ(7خ>}/PG.FK@h ՝7o~-q7?.]cݮ^pC 7mdھc@իg#C ԢE կ_?.         +@dw@@@@@B$`ek֬6 X~҈[>v0": D qhc  _tɒ%P%QtXb*^lvkߛJ;ݻϳ?J`ôiERdؾk׮TcgqaaʆuLGzhѢ>!+U GуD_Tn][G 'x"mivlX`}Z: ~( ÀCpݯE%}MG\E]a_2Y=XacP0\ӖY+sr?Xbd_G*EO%9qYZzh@0Xl >Zc8΢,3ߦàE{^ ӎXxe!CGMiϋvdFb>}:6m}ڵk#6X k׎-謁 =4{JYBSZH os 9pƌ.}f͚9sH .맬{FEK{(6{cXieuf2i6XjŞ;0nZڵSnԤIT         @3@@@@@ I,H,(6^څ8Ӷnb<aha6׶܆0i}S'`4o! 7nL[X]t0M-3iiVZ55koc[frRu]*'vNA:p 'G;7?t0[gv]X 6P[GiN> C9ӎ>1 yb!iAUVcáFYWJ{<^@NGH=a 9/`sK.a?E.Ђm W^ Cm>ش}f[PtN{0,xfae8لgV7 Ukܸ'qfԼys?62wt1r?_dcI]bU/B~&O/d/Y0!M6YE)U*[_0J a̙>#+J ,_H&9" @yk\a8uYcxognmРA?0n- ۾i6VV|0[ɒ=4|xwm o`.[{ GlR9L#@a_Ǝ럟>խ[7hX{ӧJ ~PN>dW,Y         - F     A`׮]P v, KR|0_tpU¬('~zY +Wc , EsI!vׯ_ߏ5jps@-uimٰlٲH@Z8i`3 n =A6#(Tc7oZgêU#mݻ#,_ s-47e;)9+}v~ Ta) "EtQ^ 6bAJQAH{ɗfaws]ds~ɜIs ҥKʒ%KL͹!ʕ3PXdI)UQo5Ο?/7o 6EC7=}>󦽘e;/I֬b_ӥ;ZLC4/pˀ@( g:5TȽ{"5Ru,wBsݧQQQܐ̙b҈8q-*d+J@pEQ֮]+z-!UTh͔믿dŊf?MX9J5vRNFzp[E ;l0Ou}ŊM@o~!uǶ?5j;V9" 4ݻK&M9D@@@@@@@@"N Ȉۥ4@@@@L˲Lښ5kdݺu~z3ݸqp4:k֬&(XbfZhQ=FqiҰ ?5T͛7 .&\L.L˗//ٲe4lM`::հG A3G'V5( A:>qHkFF\}\dI d,u}$vTy"V@ϟ/?̙3\gU VZ&Pjժ&۷[4_      /^ |\|Zʌ\%Kf0J*eBt=eϞ=9hF@4$rÆ ׍z1L޼yMxTXQnv$ap=*W6^뾿4 u)RDSi@ hȊC:{ N: ts5DB 0kϫkgmJt"Ç)@iӦɌ3L~i{ͨ2e+4zʕ2w\3+yҲeK;x0T3gwߕ{> L?ԡA,cǎ5\oje@@@@@@@@@ׂG     AЀ7.K.e˖H ̜9 prʙQÛŽb!-w^T˗/h ժUիKΜ9C=X_+VpjrJ.mk[πPM6:!֭[ch(dJL(EJ ђLmiN_ BT`2~x4i͘14nXniڴza2e2k,c)PiF:vH(,@ _{5ګW/yu;al۶M#~ԨQC>s@@@@@@@@@ׂG     p |\p,^X,Y"Ǐ7+W;CXHI,Yj&< `H &QV׮]+YpaYV-S,Y2آcǎKlOy!rڇr-~ E# ;w΄C:\ҜMּ| HZnEzKi 2e1BΝku^ѱ~&MW-Udԩ&MDҹsgy衇$w![o* ><2g֭dϞxt3Ozm3bu(o6H) V}fܼydɒŜhxfacO>-,Y#Xi8PNj՟~i5o`C8og}f/_^^~eС?;GeYҧOk`+iҤ61۷ovډg8qb@@@@@@@@@ ) >mG@@@@|(o>0aL2E~7ɚ54iD6mjԛ+W.n@ln:8k,.]:^/7kLҦMML 6m|rzծ]%#- l us5Z!o!5g7.]]wa$K,ǛݻwKժUy&ЭRJa<6a"gOΘ1L mۊCjn8 )bg[PcOѣ+;av.>ػw 8PKk?\p^\xќ/]TfΜ)իWb-F'HnݼYe@@@@@@@@@ 2v) B@@@@/b 2d x@:v(*TE@fϞ-wIܹG\n喠)!ݱc 3fh[FL`[f$G )u@#Ed&@ܹsҺukڵԫW/䕲eyMRA@ hz /^ᇢ S`ңGߖsАw?M(+84_@IDAThksv|[8!        a @d$    Ywߕ_~EZl)O>ԯ__'O*U 'N>͛7KΝ套^bŊ`7 o9sY֬Yi@[,Yn@@r,\PF%&My~X2gyzu*UD>(8g @( :u&LW_}Uz-iҤ *S ϔ) L8"lӜА¾}`DR?|Wd)Wk         9|37r%-A@@@@&0|no^ٱcL(X@@@@@@@@  #hg@@@@@f͒2eɓ'e&@-{DD_!!6CD >s̠j#dӦMbj;W^ 믿D??^>cрH l p yUVҩS'ٺu<쳒!C@W%{ڵK,Y"SLcǎZpxA?.\`Ǐq,oޖu-;ѐ) 7n dXXߛbDA.]jqB"^@ϓ6lhgϞ-9r6쵓s OBNW^-V˗/tu%K&7?ХKc|+ߛ{KO?d 5(W!/^\V*)K…M̙3>-@@@@@@@@@P 2uC@@@@$0x`{_ /2/0w\c.jh⿵Ihܹ)(E/0%4p *$$>[l 6HO6͛77*s=42P޷o]Vz%ҥ N}*UL#>,Y2 fV1J?gkڴ\ҜoըQC P!GAl1]M:5Bt3NKtQ8mQ8IM࣏>f͚'^0?}"?cRn]2diwn~aԨQ>/@@@@@@@@@Po0B@@@@L>>}g}6jrtk&˲Wyo 5t>.><+2FEEI̙[,^vM4IڷooN5P߃N֪UKZh!s̑ {*?>\nEd{͙z3s_1ՙJx=J&2aѣAmA})@,0}t1ch%k'O%慓[,YDp!gΜ/S+!-~Y`h**:d~ٳ-c\e˖MZj%ƍsm         @ OG^}     @^Z^|EꫯiӦ!Rqeeذa'|"k׮5͛7>|X>#@L2I.]I&L"'NǏK…{ƍ^ݻͶ.]*3f {'۶mz/GO6M'O=qoPMg'|46}GDpyٻw$K|Yg&s!~mqF)[{ҠA6>%Kȹs|yq- $/TR}Q>hVqAǓ\/>\fϞm ʕ+! 6 i>O.^hRbEڵiסf͚&K#Gϙ3gʘ1cLh~e׮]ұcGs+ĉmݺ1s]gb˗ɓMrw.衇4|뭷>!C~1bY6Yϼy^j>]yc˱cǤsfis}ccΝ2vX?F+CݚrSNpBټyTR;7}787-Zϙ}ķ{D0mذ?6oٳk"cG iFVw9^jyzTY:駟vvW?˞K(!9}Xu1}嗖zv;põL|'S-4u*Sվ}{4=f:Νk,YҴQPBreIvaᚮbفxhC|fCg+uԖ緭߲dq췍`O~ݺuVͱ45CVu;² rvF>+Wy޼WlbyG:vW_}ղ;]e'>;4jفf=㏻>;lPv\l+V̲,vwVf|s&}`A{3qoYzŹ/"/`כs+;;mz7sSNYvhe]~-;dߵ5kx&~,;Hߜ *TȲ-;l<u7K99hJ9u\׈B@ϙ@x9&-гgOsFuIgދԾ\ǘBO=̜9s/^ܺ[,e|*ϹW@@@@@@@@de&e!    Ș1!}\buںukGqU7Ν{'9rBᇃ r-߃;w|Mע͚5s=1cy7p۷|r3Yoq-Sre2a?VY}~=2p>\i q.0osxG dꄙhH3hxf8C|ǐj@:8Z5AA$?, s گrtm<6lhiHRJY{W~) tt֭[{BJO>mgyw{GC~36so+N.ƨ9=A:8 U]27. H M& I2tmѢE=zyx8!|s&/Xv߷)g@9sL?"^Ow=N(=sɓ'y yyZ~'j?lO ޜG܃ 91u f@ h =ܓb=']gm~UV>[?ggPkL6- O@@@@@@@@@Hi)@@@@@ܹsbv_V-;KN:%SN(C3˜?^01:tTTIIiѢTXϟ_3~ɸqnXNte/Kttf>>?ljmرcn޼k3v8qBH!)om3ԪUK2d vAUWn6)^w.;Rt_zw-st{ Gup *f-[VΝk1{vMV*ȑ#K.fw/_QFK/$G6ǃ>Zs=qW_8^>~l=ViӥKgo>)]w!3?5k= CZ@W_ h9sfҥKQ'JF<珯9;(¼'Ȗ-)^g;(UYf5 ,h[ڮ@ jn`o;XȼGo3xyS^|Ӹg]ϙk:V`M~}#/A<FBB@upΗY)zW%⻞uhukMo[}&Oq zx~J<~Q{[zϰM6d2eN?        $I@@@@@ ~2ۭY&?"E W-6olW-[fƕ+W֭[E_/So^v*;w-[J&MLxhUz뭢!Ŋ3_~{~yrwM\gAXu=~L?k܏Co3f}{̹`UomzsIˊO4?Poa_l)Sȴȉݻixދtޮr         @8 {:#    ~ܹ :T*6}fy &9={V<(/_6|ǏnMfϞ-ڵxϯ\"ժU3k Nҥ̛7uC/&Md'}Q[:ǓĶGt/q a(_H._\.\p2OthМvs lnԛccfjȣ~Y/~[/Z~{%+Wv[ƇqW_8޸Ep̿Xkk<3ƄpkTnN$**ʄ7}szHի'~|53\>M_Nߨ]xѬW2qTᆗ7>gD±a*Ѷm[:@O ;U0@o!#-C s Jy9b sJ84y͙j(~3,V||rӛ=v_7Џ5\F4C " [li۴!7@S# zN:!CSW_}Ů]dҥ7[xwB3          L;&"     ˄=Sޮ)RD2f('N4N4XBݺuHeRbEYp?qN5G3gN87l0\):aMΜ9c ._ix.qĶ\rQFӧbI>}Lh"`ٲe&aÆ-[6믿q)wަ-΂1͠lN9yݓi|&MHd&|uOz)~uڗ׏9bB N} -OZh!-[cǎc!UHtU/ uy:)Rcǚ๗^zI4}cν/tsMsoO2ń@:}Syy',/k|(23xu,5ܧ~:/f;'˝;^鵚3_:|5t^i^lۛ?yYf-|-;͞S{*#P b~3A V*۷o}2Ο?oܹ7j<! QYf۷ ԩn OD-7nW_}|1_6y fdKLdɦmC~Z >a1MwmLɞ={Λe⩊>g9|C=dރVM,(v"vuy$9 ޴ih^ \z7s2='|L5xVs 32ܯy~i. z-1BJ,)zsJoZVLSB۫RXyv1۵JLSHam:t U߿UpaSѣ-;yjveժU-[~u;-[?ls>Cpgޟ\OMZs|q)ퟴ#K,{CDaΈ뽢{Z˶k^xZnuCb͛7[ 4pMeݖi_C%,']t1w|zhµ^f~5}mf 8裏swUm?M 7WVٲe *X^ !wn>P@ xeY+n|dvȸu=ΉAAouI];y:/4O7[z~Wz7o^ t땘sӧO{Χau:ѽ<_>>u9^9geٔ@RHzȹ 9|C(=0wB0(ޱ+Wϋ~ES         ɴfp}׊0'Q     @db~(~X#6m<֭[b!Ο?/v؁bJ9\y|;K/a޽{;Uu;LCk.]ӧOo2Zȑ#flٲ]v)vH؁2ĶGpKݢuC+YM6l;hBɐ!u gL]N$mfڣ~LBo7ۋf]]F~|>oL0W^2qDׯK ؼk;Pu&s疷zK Bk@Yj{P8iC\Ib\_fFby_L`>gb=>dz[7Ny_I 5jDG|IԈz x;JnU޲7dz>n׋/)v9'u=x׼ys9shVg[^s H9qℹfu/We&^%KĖ E.>/Qb9yB )'hXzb`j$z#ޢ(@@@@@@@@ eOQO@@@@@ H'O^xG:vh%ToСCҴix@;m{iӦYM L+jj;#TTIz!*35 jj~.ȷ>ѣGsWzjyfa U!IK@C;ud nj#j.{: |*UJL" 6 8,?d˖M}QܹΝ;$Ε&i\ .aÆɼym۶H 7Ⱥu ^@H27N^}UiٲoHԩC۶m3uJʕ+pB8qL\4IMO>_!m@ 0ډzNYzmW>pz3F._,Ѯ3gHڵeŊYÚP u8|SF%oVXf f/z߀¬QSNIݺuE56C Qqj        H HAR      ^*s̑/R{ɗ/tQڴi#*UJJ$!_ȟ={L4Ʉ@K΄jK%`͚5&fرrAiذhB5kf}®AT.!sΕӧw}'O{G:u$M4)SVD\I۵XHޜ?vpn =qℸ6~e̘1;m3mڴc( cz6dsʕK>sSN(Q"^`ȑCɠA_}M6o&           An     @ >|X&L Ǐŋ/l|VZ:um5G 9rD~G9s5HFC:t`BRJ:& jM6Mm&+VƍK F  @L?4TV5(wvhbUVfLKEVپ]󺄔: @ #K&7 8 >\z-9y[{9s NO?5W^yE  ɒ%uܼ(^7m/:lٲ7_k          @dD    ={L/ .iJMNK,*U Cŋᅴ/kR; ,k֬&U]4i"ӧVd=]n̚5K~'_MNSԬYSU&2dFJիvZ_8|9t萔)S [n]}DnMvyB @φcʛoi:v(>T\9Iz _|!:wYygG={N  (oF}Qiذ3F2gΜ˖-֭[{LӧOŋ'eڎ        I\ $~|@@@@@_'Nٳg@5޽[cB4PVZ&<)Yd"@Ν?jxb9~ҨQ#P3 AL"EDK ,0+Lc+U$իWUJ*UhѢ@H ~RG =~*TȜh@l D;11†+WDҤnCkA 'O˒%Kyc=&۷3aIeL6L&MdBu&O=d˖-J[{5PC GeoTݐ!CgϞ $***5`S         @ z!    )qF7o V[h8p@f*ժU3ajNZ#4 ` lݺՄ9f+W˗/@V 4[ԫWSNofF SǓ'O/ ό6E)RD ŽH,pQѰWu|r>Sp˗/oBq5VC﹐/ /a 9 ?o֜j`XǎaÆ*U*?oI`ڵ2n8;vܹSmJԩé)$%o>yGdΜ9 ҿI.]2HHclb4LO>һw$# c@@@@@@@@\ #w2@@@@@ 6m$/ TqÆ rU)\+LM4T-W\!*@( H`iǎKʕEtY& yn:?eٲef\z\pA2g,e˖rʙ9s e@ S?֬Y#~թ{1a]}!CU8[s >b%4 'N'7|#CzآE `F6U,˄MO:Ut{ N:Ƀ>(ŋOhѬA6ltS0`tЁpРAJ%dĈRbEK2 @@@@@@@@HA&N@@@@@/;aj˗/7wa3gNWVdIɔ)Sȵ !H]afhgϞԩSA@3}L2ULRۺt_jG5j[ti)U|o ݼy }>Rtܾ}\rEҤI#eʔ *F #w¦6mDR0!lLE@ؽ{L<ٌ[4mT7nL`WyɬY~+X?h۶m+4yV`߾}ҷo_W[oe~öA>shHfd?|XƝ;wӧM SՀG#ph}$Of6Ͳx\@_/_K@y!wyTVM4@o7׸&L@W^Ē%K̾Et^խ[W6lh>B{O&L 9sGyD|AsV =+9rL8Q2g,<<Ӓ#G,@@@@@@@@@%@dߴ@@@@h4@o۶mf`SN'KLn4(*o޼QCt9|!p%ٷoٳnjw!ĉMXxqqƌ3Ad hއiǒ!wrr_N_s6AB:͒%KdѺЀƽ{Gy3rͨ:_S|+0vH׮bω|[6!x> _DC5`ѣ,m *Hr${ bt߬_^V^-b 믿}J*IեFRvm}(+GA![lië5VB ~o5?æiӦ}E^A@@@@@@@@p      @$ :tH4RCԜ05g_>}S Q1O<&LMԜQ4xM74!i ?^:xhhlc 5-2H0f7ehV1sl!C Jr YоKE8өX>|X^*3}s/Ü1gΜ:FEE7gΜ#G?s]3g63:uk_ XPn]?m edfǏlٲ&$R"K,i!a'O5߸q7l ֭3\.]r~RreX-D^ϙ3GF!ӧOgϚEҬY3"N L[f̘a~D~;D(Q"w'mC@@@@@@@@"@_X)@@@@@ N8q]i{Y%O܄Aj9rpYxa %pee:=zԄic'L>Mjh޼y]f~QF1OQ}Hch/v,&jHYGj$U ^zׯ_/V9.RR&ELRP!\xQΞ=+OvN2u6pFir1;'Ol:u2 zk3j=y|…Bgim\S˜̙jߦ>O.n`vͰ,K4LDC5?tϝ0TC G 9ho1@>1Tɤ0/\>=[apmFuDwoZitN=Մjء^8CԩM̜;wnҬ~;uP4̹T ֩:aS> /P ̢EJbXH/tz!wg[΄+.ZLkBz5Wgu Z}}{p%W8mdڵaOz\rRvmXSL@@@@@@@@@  =D@@@@@V@LQh~Zc'|+f@>׀ kH& PHg0 gkRaak)S41k[l~yӨb:uFCcNu[CtsG 8өZm(u!17p3? v3 >M1 ԩ 3|Pk8jנ} L_s7sFss5"N{9ii~/QBru7~A18NLuq_ .ҩSd!.fH"s{;9 zNg;$rǀD KD=׈9hP^ysף:O˜ئ1ɹntΗ> vz霋jynWC,K Lإ~5Ȍ=w9#@0v%VrW۷Q^}:j(z~XsS/>=Jgо_?{kzXT)P ԩzmȀ          J     $Z@9S OsBݧn 91uZp8l81Ds ?Ⅎ9!mSҺ`˘S qΜ,oMNM)Z|]>оD1לPsR#[oU ,( 2ƀ         X @@@@@ h;I^zT}xCdHoj5,"}Dҥ 6Qs@@@@@@@@@@AI     ?$W\R@TC*VѠP4I䧟D֭)UJd@CB]@ӧCd.roʢ@ l.ҮHZ"Y\)W"ޚX @@@@@@@@@@BG @@@@@XdTV-uQ# 4j$fH"+'2{*S@ n [W#I HڛMq=د]+2cȜ9"ˇ[K/          &@dl2G@@@@@ ,]TV׬)jU膥N-k"6)#ҸH۶"w'ɬID Sے. 2l "~*RȈ"_ o "@@@@@@@@@@4 #m@@@@@!p ;qTP!Ԩ!rȒ% ." +/2e?^-RȠA"/dlP C pQ hc"W&VC)3DʕC䡇DnM$eʛ*@@@@@@@@@@@ L E5@@@@@fJ.#R ."+6i"f+'R? l D cF dWQMh@?(@ VUD4iBlY D}W$KXW@@@@@@@@@@ #`'@@@@@|%A2d $5D~5QEt4iDRHÆ"'gO@@  D|*-۵i ?D}T$:ZԩkO'.           $ ^     x)n:)e'!&K5/~-lWE6m~#@@@@@@@@@@ {+D@@@@@ 6n(JJt;˔ɚUdDҤٻ(o ޕ*{/JUDE"(],(RĊzAA?(^ қ"M^, BM KHHa7lyΜ9gf7gML d RVK۶]!1\` <~\{RA*tF @:;WjPS 'gO'!          @A&H@@@@@2ɓ'}v.]O<,L2i޼n7P4y4exT4xy@ ,JDD+?H3Kv8ϒsC+iԬ 5o~=eˤ> n          /@d_#F     @ܹ 7Tɒ%_Ӧi*$iV7i@駥ڵ3Cbh RI Tȗ Ȑ ҔKUlЂza9UF:           A 24     @ZغunR2&MmۤHs!HҳB^ztR!1<AA>h 2D.@4#k|yi*Pzխ[^}I9          #@d8      !/`Aaaa*QD@ڰ54~@ F,ZZH\Yz-)**`@  Ȉ7Ls!zq=Ԩ!=ԳgQYDx #G/B@@@@@@@@@@ +@w@@@@@BF )7z(ٳKuJmիAڵٳCt [ W&;oJH#yp,D.ҕWJ7(ժ%Y#=O?< Z_|"          @( W!     wvAiSi@zmYK&)#l)u"w荕! X( c,=_gR&}tRzґ#1=IӦ}>@#Gd|            A @@@@@(p!ɓ'nAVIِl\9iTi$ire.B)e +x)4)`Aɡ3h@ h RŊҌ…KӧOW߾}/[o h@@@@@@@@@@ҾAir     D K6˝;w@5ba(N#oVzHz n]iΜ~֜G8;)A@_kF (=Tn LC"A1 d&?NOB!oԿTdaӦI~+U~A=-ZZ]t؂          #@d<(lB@@@@@ # +***ޤtdINS )jtRfRΝi4,^  d( 3d@wߕʗƌoi k2d>Luԉ[@@@@@@@@@@@xM     dD,Y%bEHiz9W }4a4sT(:lA ÇCo\` UDP|69W^~U*ZT8= Rlv׮]6lڵk'U?uꔮJm6x2  ȭ[jС3ꫯ&0lї_~`ʅ B/mwHKǏK JcJeʜ{Wʕט/묽ӦM;*,^X rW-[{vL*?zV=ժU+OK,m3cΨ@@@@@@@@@@,@di@@@@@"5kV/K@ݻZfMOl܃4LA_w|\?SL{H/ZHf͊{Q9rĽkѢEpW*U^?^>]/0Fkpb!73gԩSua zI\R˗/SHMܹk߽Ki@nR,&O:uC_ru2@x z6[>T4{vL7n)GFF}:q&M̗waÆ3{@]v=/{l+gDŽMN?ЅuvQ&LP̙լY3}7Vݕ          @j Z     @ .\ kRD ZxqGb֯WOʑC^Y-[TժU5tи$齵s1> Hnj7IKa[o֮W_j@Z00 UlժUl]%/w)h)XXLLjz\`A֭[Wݻww]}bs }饗3g&NbŊy̗S`p;v쐅5֪UK?.p߳cB}:y|jӦϯ;u17 :          g     8.Ha%gΜ*ZJ*d 57/fw{qK}ٲelp\^~U^XԤt]B:Q<=䓚9sN:7Xatp]͛£9 3F 7|iZ(RHLH-8uYnAڸQz1)[~IլY3@˱IZ7nۧ{'X[8B/Ŋ>ځolyaթS'Ͱ05lP;wԘ1cvcb+          @* b_t     !,iô`%K&8=iSi„[}wM? Uyc+,Yī?AԵ뮻NÆ ӺuԳgO1V|m/>5Jٳgwa.o HT9ݯV,M./  M(fzAq)vѢE=z֮]4Zvm1 |]^]{a;[ou5:ؾ]^R,_\yQ=d[r>\ UV^zZzSvmqzGu w<Ú%19r :u>s}_7eʔ][cҤInu뺾"is^n]uU;vLwQ=ӧO/^f̘f͚gq}[mOtv,;v2'}ԯ觟~-ZE do]xm6o[-v/B3-΂ʖ-[tepI ܱc Դkj^.т,モ,\m:w7nt!v|˖-g>/ SNީS+]tB23iڴi=.{QoQF.WW" PRw^k֬Q֭]w^d>+l3FldV־.]>F?}A-8O[[,d Xdtt2: ޯa+/YڴISQ:WdBe 7y5\|9}pk/>bŊoh6oY~=]?Zپ}{?m          ,@d*     * c ܹsLq~+ҵiN5m8W{1pY ={>kwC p|`/YDo ޭ\3F{q=#._d,nRjR ˕rU4n{6Khla`nsI&7k֬p~98޷\ar{1 ڞ:u ,+3J4o^?m          ,@d*     *P\974 FOAѰaCթSDž ?J*\ri?mH(^;BgϮ%K% ]*UH?(#/DTIY!]Zs15nq_{W_}݂ +ս)SZu+[n4N8Q&Lpx' i~o&׎ճ,14fᎾbDEEuZX 7ܠ|([lRtib!1iرc]ѣG+::Z7|s-8x3  XScvVo۶z?Oڽ+͚5sg6lp!~J(+Ⱦ>ݿHuȑD- @:𦤲Dž'7_^踼f'|9Kz+^zi;:n̗~͚5;CWl_ފ͓+W]u|2q׫WO}վ}\ۜ駟vUkժ#          pA/Ht     !'`ab7K0`@Pפ4o^M{.@pƍ*_|,0|J>|)%~0>}åߗ kfjwZM6uׯm Jxxb߱rw\k 4e8= mO>D1B:uҰa\J׮]n:͛W˹`IؿKW@gcV,BRKm}v5j3fhڳg|Co.{M ΍i d,%KCs%'[p_s0/[/B};>W񩜽7oM{me%e-,r.dZvϳ^Ii:          C S0M@@@@@Hj XҥұcgޥKYG}tmI>4D+IKz ;"Ep(Qm/VXAI ̙ӽPȑ#ڹsgg\@]_]/wիW{8XٲeS:G6Vx ;wգGgclٲ%&#pNuu&MtVȾK-j֭ʾϝ/Dr^umH=znD H  _|Oj@.ƌI~ĝ/[rp*U- ҿl۶ͽVdmVo|Mҽi& -v          @ ,"     ʖ-ྔZ&҉?݂@ZP'|*FA9ZU9S=Z2ETI^t5j̙3Fo_~q/rj!eI:I,ʕs_|-[{IowrתL2׿oY{;GE&V,VѢEkIYP_ڵ r,X{W$5ktlQF)"""ٳSO)k֬]|9ru*X,?Jb}no߮޽{c  iYagcsJIKӦMA_{5˗ϵ|9Et:~u-dTR.{cϋ ?fƍyxzgw           9     %P~} Kb6o۾޽[&LЎ;\?k.͛cH+;KI=zH< /4łcΦm۶ꪫdW_Ş.\X>f(Nr!#Fի]9_ٺ5٫=C.@Ez\cfd 4p:SLիkÂ}jԴiS͛W:uuzA49K7vVxv) 6!Cرcn}]VO< (ٻ뮻4k,K/Zg%Ks>ﳳgͬ# MQUҚ5R?drխ[7|95jn삭J3r:FFFbŊ.(YކE]vjذ:Wm          \\:⋘5&A@@@@@ XرcUreծ];&櫯զMԷ5guEV~ k}v>|XҧOYHƍUhQթS6,po31{lhfnW\qǿ~ZZϖMcy)3H-]~d!t6lؠkҥ6m Qc;-d`馛bڵF 6lƌ `ZluŊ,O>Q͚5cf]^_~9Fo5Wv-5g,d[Jr͔)SFr멧rj!]v=ힵ\lyp^>7pcLYH,Y2)@^_d _u@@@@@@@@@@.@?t (:vi)      ,H"^-.,P믪^^Z0zM i"#^(/mVZB-43n{ SL.1GDDF p±EEE|nKh*l۶M^z;6mlQHĉ_{ߑ7jܸ1˅+V,ަ\f:G-6n [ #G{S %`! RkE`:GW:yR*?;]Kd ߱c ̗mm׿κv v}V 6_wd`ȑneLOA@@@@@@@@@@  ū˜@@@@@;wn?A嗷…k^=(]ШҳJ'ի'~̫_V@ 'Nta|;OƑTE #F #=1o%/1xgw``I+2X}.          *Wq!     p*V+VM6ʓ'O{ժUD*-]aa?G*Wη5t_?g *L`d W^)-]*կ/n6Y&pplzϞ=3Ys)vߝ7a)m&dς}&( \'b_|Qʖ-&;L7#FB zQn9)Sh֭!1cƄx          @?8)     IBW? ilBE4AiF'PfM曪V~}ڳKU ^MlN #PD A/29E@ &țJO=%=q=5r۶mZx:tڵkh/i @@@@@@@@@@;n t2~|Z@@@@@ה)SaÆtȑAiF@S'AEWڷ컌@z @UAz@ "  ͛'u,TTJ[P xY&@@@@@@@@@@.)p      p@nݴqF-ZҤe}{Dͫ~Zq/sƎDݻ?'w~}m  -ED@ #_ء cgI=1X@@@@@@@@@@H;AkH@@@@@H5uz㏃gRAiFȓ'x iSЪUeu5jܸT1A< 4f,a(@@ %MEU`4~4wԠAJZ@@@@@@@@@@@ m 6F@@@@@ {رcwހe!jjIiL@\裏j˖-zlgDŋ]wPӦIh*dP+  $]IipBC5k[oMzD@@@@@@@@@@ҋAJr     X{ʚ5,lp4MIș3~am޼Yv^@d_ի]}H'1!@SER:}?n( (y#            Ls#     :rRϞ={)222ZRDDd ȑCӦM[o*SR/A/FNJfTG  x_|w˩!N`Z];uktiiJiPAK           @Z 2-^5ƌ     @* 0@;vШQc&RthQ dϞ]>6oޤm._W^wq4C+VaC Md: @v7jԐnO_rwDs           @ 2^8   -@IDAT  @j*UJ=zk6z,ŋKeJ޽gocK d͚UQ~8D_.:uB! =!AUaL  p4xT4a4tyԪU(1           #:Ca$      ?>3Fݺu;c˖-뜱-9o4̑.͋YݥwMNK @,YԫW/S#GO~qir6)SÇwY,ʷ^Rg0 _J=&1Lɘfұc:˗+O+WjժI}҂1&I6Hђ9fxC^`b* Dy裏>דO6h.>)kW!F@757S&)sf)2Rz)y! eiM/$wWiM"@R~Y0 fߵ+RɒI9:Y EHɑ#vڥ\r%R          /K      xsN}ZpUz4ss{Ƅ,(/8P׿KƄ@Z QM$T޽{hϞ5zOuOoԿT"*5jH Haawwd@(R.Rƒ#[ Q@ksܹsō7HdRT@@@@@@@@@@HAǫ9!     `%Jx3ϨI&?z1cFz֭OW=qAzQBX sz鮊X>*U><8Lb#I @ҶCҠA1~R3G_?m@6m xD4Q           P x9e@@@@@+0w\?^G)/yIYmKJyŘL%u.@̙t}Y~tRRҪUzd@`:tdpM7Iaa a i]r?XPA嗥ի[nIg!-[6uQYdI}lE@ =Cwoy~ƍҀR֬8` tE6o:u:gPd@@@@@@@@@@t"@d:     ؼyU{5}2̙3k̙Ikn?$_>)[5ח-_9RTI;6H 2}n>" ֬ڶZ*[VZJBY1+{%";wZC@@@@@@@@@@BN Ȑ$ @@@@@K#ȂmI:uJ3fHhw-<&GxwD5mdS^ҺuRvR.իסJJ$KXԢ;V@HvI{K5kJ6G1Ai}j d&N]vU,YH"j޼Yـ          @F)e<@@@@@@ )<.\.HrIiI-EJ_- *$}h!ժ%/X4f=s&"c؆@j <΂!o)GB Gq7 IbsK{GZM:uRddiݻwW%jS@@@@@@@@@@ȠAf i#     T hʕjݺuAtuڦջysy2eNg- 4l(4d4bTwyjԯgg  о'ϙ#v;@BI`VOR*K}J6H={JzLA 5RR8܂!;w|6           s     @@:u^}U/&[ gΜ)IÇ <]BfJ8!`u6m䅾HZIkĜߎғO>W ۳BM [6{,YNbEKNg @P8p@^Ү]B4n]jLZ>& 2W Û?@]M֭f          @ 2]]NN@@@@@ y=f͚B }ɓ}oZ|LȌZJYg(\X ZGzH:q"|OVڷ/pFi_W/)22<,ȂK) ͯnAڸ1f3g?b7 9iHT] :u͟b&PywY@@@@@@@@@@@ M /G@@@@@ 5kUVI&G H{Mn8PXQ^['2~i~F;H~(}EL\,tV[+R6l\ٮ݅ }# k)͟3հaҡCOH+&N7֍-"pUVU*U\3Qh@@@@@@@@@@2A@@@@@H@ѢE5c 4 C s!/Q_MvkYH~*YX%c^,W/XиgkaEsH}{.@>1YI_0@ xt+EGޓ9tmR1 yM밆@zᚮQdm           \ CZ/{{nY("K.{|=˗ץ^Q|yM@.Ҙ1IkEeˤr}駟ܲʻ,ъTXQv,@. &,,ܝ$C63_X_6ލߨQ#4lЍ%n؝`^N]'9@ y؅8IΝeV,Fn^k%ܼւ SZ,_[Фͳ'7l,`_~7oMB#S/5wϭMuzJN =X-v?ڵŞSg=pheb7b=bbϋkt.l՞|?`ᗾB{մu [, 4RhQb-V|/⎁          C q9 @@@@@$`" _-‚o|XH/^-1= ?_0o۶ͅXp-błW,ȯB RJRZdgSs@q1I  hgH1Iiɒ3,g\)Y^2e\bݺucv#&%::څ>K.u Ժuk]uU.*V=@` '7߸߳isYk5ktKry&VzjXB6J -m.p 7p,Y$صQ LZoi其nb%ބv֭nŞ-|gjo}AW_[#Ag0}>|Dڂ:m0m+`H eK{='HYhq 0? ߷bgٳ/֋/~Fp=%# c]h^-T>v튥 HnPKŊe @@@@@@@@@@'@dڻf@@@@@1c ͞=[sի]I]`FT^=ժUK9sD,9+Vhɒ%K6\h,D&,,LUV|E+UH¡CkСKjQ*\+-vp֗_~ &Dw}ҥɓ=پ}{zjذa>N.# =A֓/`sy;vݻI&,DZ>LFҺuڻK_ɑCR^G ~2( <~ӪUf͚łN<鎺⋽gʖ- >݅BZ=?(%VR{V#Ŋ;1          @ --#     0(-X@SN?˗+SL.YfiӦ*TP ٳGܹsb!6SvmnZm۶_&zشi u=z]S^E ž>#?^3gV׮]5p@Y0Qz*I~H%@d$i'}YM6M*URխ[7 T XqvjTn/( h 2e ֭[tR-[\҅k<[l.Hr-[Xrʕ@9J׮]®sn{u[Hi / f͚S[,(2=_R<          b SLǁ     Wȑ#.f„ oo>UPAmڴQVԢE ˗/T8pfϞ] 6@kվ}{ws̙cJ֯__~Yʔ)sNOa߯>LuE rEidz?$ 24]O>O5SO=뮻Naaai?6b3|M}'Zx 7Lq?O?W ܽ{_.RnyժUSU|yi %~ӪUbH;vLٳgw 4PÆ wf u@@@@@@@@@2As     !&BG)Sj޼n&mVʕ 3` lڴISNդI4ge˖MڵS׮]]O,Y}}v\ha+VtO:u"'W ::Zcǎ+" ֭ ,^x2[չ^hJJLZkK.qn@w[vGM86LJJ畔8u 7ol?,84SL\,~.VZʓ'ORF **JaK,ŋl2?0a͚5SӦMz9͹s"          @ Wq!    d( d5j(ݻWW\q, *,8!-o̙*Xw{DžThow}W< (_aaa=!}ci߾}zԷoߐ~΍VhjrL!b q.^R>}Msw߭;v֝wޙnDtˬYܼpºt嗻z)wիh"-X-(opaÆjժJYʚ5+n           24     @R,kʔ).ł*UBZu릋/8P/ 4b[_ڵSZ QqwU+W?'|RrʀW3x|a+z뭷TfMwL(_t?_*@dR,Cꡇr~ÇWrUkرczg}NiӦi۶m*^Zh-[P뤻Jwּyd᪶ʑ# dK2esb          @j      'c꥗^ƍe,}q%!\ٳgkȐ!4iʗ/zJ:uR̙T=z^U^]Fr!yBwUViذa.3RjA ?XQQQׯ>=zLuLRڮuA%KɓUt6uAP:N0A3fPxx }u5רrd\t@Fسg `߻5j}ng:           @20B@@@@@Xw'p6?3dײ%kvHvɒ%[lY*Hem\rEIٙBٗ-kB&ٲf̙93s9s-^,YRv*u1As%21\cj֬):4TT-c:8ׯ %ի[Hܤŋk5@Hz/]:A W^&M.ϗCUV-ټyrʲ{$K/_,Aw} 4X.X@"##e… /A+!.={vy'er1ٶm `Y ,Qrȑb          @¬cWt`w+@@@@@H=zڵkg5a&yICfl~8~ 6L>SVL0! oݺ%;v4SL6mI(1c<3ҲeK"E 0~G2;F`{[34:7o4!7n%KHŊ׭K.IƍeϞ=晤Xb7 E?KάWڶmkִaaa_:@ :tHf͚e;w ٳ4kLRL<@@@@@@@@@W <38@@@@@-pm9r+WN46|@& й:t9sџs!-"ҏ7BÔ.\h惿䣷(!z,sɚ5kdń@zx"dȐ ., 4H߯5bժURJrI>}hBV^ݬiW;W!7>0`yܾ}.]Zu& #Fȅ L>S/M `(WcM>|r-СuμyLp\ǎMo&|4mTRL: @ -[V!Cn!,.] #@@@@@@@@@@  @@@@@@J*r ٺut5 =:uNe0aÆ@ʺuiڊC@{|t|HX/9c^W^yE={az]q Uk__{\"*k>ٳ{90n ۾}{[{ׯˁdԩcujMZ|>q:oVX! .˗/{Ilm_ #G nQ_~ERH!+Vu;          1 =FIE     _4"""BҦM$˖-!C$AYԩA(1;ĬqԹsT7>{No6ukѣGADåB ҰaCի.zo{|[|Ы?nQ*UG}5#OػzMoy&DW^ ȱcLgΜ7xC7nlv/^O6; 6^zɒ%KwCluci߾TTɴ{%sL:Fi?/,mڴ13޽{s?b}̝W ի2j(iٲ?~<03|pywEkcǎ: [9KxxnӦMrY)UTc̙3ˢEDXb[l\!+'OʁJuکS'u_eqV5t\[+Uo|~r vuAtLhI{TPAe&k֬d/dڵ2{lɘ1ccܹsͳrk9L6Mt^^=32k,y;ך=Z%n~Y5_Y-1]pߦM "<ߎ;?EFFʇ~(o+ 7I,s:Ğ={9s]|JϠF|F]ʕ+'}Ak4         L=VZr8t       ۵koYA.{׼>VpŽ &8֭[U9駟>Z+a9G:uGNP]a8yӞXbCiB;VИ q޽ۑ)S&SO=eY!#+\g+ Ǒ={vϜda8=G]W}:7Vx 1gZ!#Ycژ~L2q5H" 4׹?#Fcntϣ\9;QTv Vr)SQvm{[@G,Ye˖׫[Bwu 0q{V0vXC+pG縖3gѶ({J NC+t^SfvXsQ1t?ubIl;n{O>1uyu} WW2 sl۶sgV@ "5 6̬7 m;"7y)0 :tJ1ydM_u%5r|kvS\,Q{f7n4??b{mL?#M4<ԨQ|N>yvK{F W}5WY[nQϲXOҟYΝAQ0+HG-           x_>      :$V0jrӧpc.رXaO?IӦM_+Q Kw5Y!"uԩb)\(VX7b3߸u:r-e˖5uY +W'V,YR+&?9rʒ1cFB=5 g+/Z'9r䈶U_+B֬YcӬp] +GARaÆr-s:W_~wSeѹs[ ב{+7]s}߿ڵK0s?y>3Hj|Y!?b۷~n~FXB^s?mڴw7+oխe>yw^=ޞ -!@ Xf9shWon־_|t+PgºEZ+.ǷVuzum_>jN:]# 7r+SEkRb"FsXazbKf̾-Vի~}~ٳgG]oJz 4ܙ3Q[oKg+ T~|v#q=/vAy饗Cf=l2rHeΜ9f+WK5r|k۱RJzqۘƎ+V8^/eժUҹsg|_lmg<jb*;J7eĉyfs3?XŝAmBkџ@@@@@@@@@@ TR7     E Oύ6hbΟ?_:u5睿3ќ}ҥͳ;v̼8>{dvy\7yggڸ^@ٲe3 ̟?d͚+XyvygbzMBSR~i[@@@@@@@@@@ )ZB@@@@@ y h޽{}>H Ԓ"EW74s7om۶ɁDiݓO>i;>,M6  ̄p;u ȕ+hM5$C b{\%M eĉ&l端羥JJΟ?/*U2/ 6}s]>_/&[}>qǫwgnkcij;!.+W6]w>7׮]ÇKͶcsـdĈbPu@IDAT^t4LGdt~z{|.|~o?y{>v4,={vӽ3gxL2Eu-t] ϴzl]+hű]/nF2!N~W>$<[9t'ZWCWZ%{^l^zx'rq知qf 35r˖-&ާg]wyD/Z9m׫!Zu}>]_b^uEsٯgEv3s?2bu5k֘           Ag     W,X0 7Fҥ3gOw}9uܼyS>39s͛W.]*ZvSsƭ[uֲxbY|tQ4L1fq&1W鋫kuJ*&]vr?sqܹsMf.]LLl|\Wc):Wuz)SFnݙ mT5رcrȑhwCKܹO _ݿL>=jM5/Xb&~Vh@VRWzϼUeݙѯ'oߎ@ Ν;=M]/ZNbCg_Ns=K/_֭|&rС){5ݻc fT#={4kzʀ}%K&Im̙)Sץe˖ =5y^r~>ə3^vm4swXG넋Om}~J ,Zk>;w 1@{o N@@@@@@@@@AP @@@@@xL>… K dΜ9m۶hO?-@׫W/9y<䓲c)_ZJ"##ΏM\u؁׮]Fm4nݺ-[63: Р؁*ECk]}N\ /K\LXͧ~jꏈ06#G~_|%qw}`$*=iC=Yܙ mOHukYzu7o,iӦ:`>lٲMjؤ5kpa'?]~?{!(zt>=Va>Dug>Dw|1|7ZB@H"?x_=ںlҿ勵Bl۷Y#  4     \~ѣGΞ=a9sƴ!vѠބԬYS "G6!/wTT?~DC5TR%Kx_5Uy1/ZH4LOϔ)7sLe4ׯ_ Ν;E b;G1GcPoܹseM6W_}ev@l4x:GuVy?~8qGpgnk]A1FrU#G/"d͚eVˈ#S{Q{|Hj9w\+_̇8@-dƌQw ֭d̘Q͛g֑&L={Jvd̘1 WkWY+hŮOȸoN6m|G(ZBц9{ls5 V[ 寿2 =꺆lذ(Pc= S' >36zy)>7j8>g:cڷ9rȫjiBGG~`u؞x1鳥]yTO2<=x_O:e[~w\"}u>jq8ݝOݏ>} @n&          8_XiЍ     @ \xa):@U+ѦM]wGѢE&Mj WtXA+TJVHT Bh޼s+ınݺyW׮]s-[ִm8G X4}ʛ7wq;|s>>}CK/OVL2.+;*VQ pܼyW_V |x'qϤsRQ.ҥsXm*{jsǬ0GΜ9˗7H"+D[=fg9"E G˖-Ov<۶mkqFk׬Yж7_v>{ۅ?:g~ we<.rf϶4抂t U+ ң_a s,_^w}\kw #Gp.IHiKt% PtԩSǡVJ9 vtX!CG*UVxе+WcƍJ?VV-SVh לsXԩM=&Թj>Rl'VxYIǎ^ѵh;ךݝ9W6bO>y~\re}b}Vc~>}T|9W@ͭLSݻw;Vu9[9ў?jxҥxj9Oyiyڵ@@@@@@@@@@%ñҨGJT3{G@@@@@RСCb!VPX+~4!… G<"iҤ+KRJ%9rHp? q+dE2pX!.?[*lٲEo0 +P%DoVXHBY/mC޽{bky~M8Qz)Ԯ]'̇?O&$I $qq;&%K=z{w+@\+Rzu0at۷o޽{Ν;套^ U.WQ+VuO{aA:u*@mKO>l޼Y|AO4ϗA;ҹsgOTM          @HlF@@@@@@ … ˆ LpC dҵkdΜY Xb m< 5OLNʕe֬Y={V5`P?# 2I0.zO*Ro h??5Lw@哱cʳ>k q?ƳMZ̙3ҦMW_B U|vZ7oY3矗 x@m5?ΑM6>j?b oYd7N405O@)&M2!ҥKĉMpj/~رCӦM4iҘ^zIL⺌c          @H ҷ#    J`߾}ңGYv 4hɓWN ?~\ &~TVM&L ŋhܹseʔ)ҦM);0c yge˖&2E~a`>Fe>1vAs+B#֤Iٸq,YD*V2c@/]$7 gbŊy׿m6E?KάWڶmkִaaa )ph4P@*N~M6k_:$f2ٝ;wJZ瞓͛;@@@@@@@@@@? @@@@@!A|+Vٳg… K^h:CP@)[s-B vh_|!}vɫ*DZy={H17U+6\ z)SKʕGCˆ9"իW ub @xOԩS2zh9xyݻˢEڵk^PȒ%8oAɁ}v:tnݺ sHrLx˗A75`P5Vk5He>fz| @ hM+>->|Xv!B g@@@@@@@@@$0?rxC[Sٞz@@@@@ _~ń|&Onڶm+͚5ٳSܹs!3f̐+VHl䩧nݺ@8/Ѓnݒ>d͚UFi}XXX88 ?eСA.|  jM9"< G@N:zK#Iq-fxI3f qs}vge˖mʕfݣ?TZռ>!C$=G޳glܸQ֯_o}]w%=Ԯ][ԩcKRbO@@@@@@@@@M C3j@@@@@q,^XM&~\vMjԨa!5j$ О-oxv$ jIA:O Y1B ,h~=n&`D]G-X@6l('N޽[֮]+vp^R%X/_^ʕ+'3ftZA ܼySge˖-yfٺu\rE2g,+WիKji&3@@@@@@@@@@ P ;C@@@@@B^@;7o ?hѢ&ԥN:RV-ɔ)S;%' .ʕ+eٲe߿_fjB[ha}tӐ_5!OӧO{W^|E0,YD;Ο?oB4?9r䈴okjf0C^rત TAi̙3MPo!׿$,,MU};ߗ>LJ,)Y? ӧOƍeӦMfлgϚRP! YlY)U.]Z)"{FPN<)v4QR^*iҤ2eʈ>CgiCo "         AL@@@@@@͛~zYp,]T~g |PWnjժIك`4t8w]V֬Yc-[۷M(MݺuQFRjUI2}IHwBe>Y Si͛7MpW~ip> =z|&0~ұcGgߎ;&m6LsN]&L`z *$-[4[JB觟~sMCʕ+'=zKƌ N xC HoR'4Lãuk^ @GyēT]G/lc &M;ݻwˮ]DMC4]=#E4x3kDsY/_ÇG]8p j7n0uʕ˄jȣnJ2s玷 N@@@@@@@@@@Ae@@@@@<&pYٰaU/\ )R0˗7Aeʔ1XTtܹ3j۾}hPϭ[$SL&J*ȑJM`֭2{lciʽ+7uJZ$sO./Yr|7.٪U+vUB2|HЄD h:.ӧeڴi2eҐ>]k]oGmN uaٲevIN$Tk׮4&_L>,Xl }W} c@@@@@P ,ٲeh`ڎ;vIsm L@d%LpD"EL&@xxi۷O֭+NM˗n)[44aaaa lӝt^ϛ7O.]*۶mTԩSk>C+W.K潆lڴ.[L~'2H'0(h䃎22MAz{ܺ>}|f 6{LW.w_Pי֭UVɷ~+{1ktpIoD>|؄iH> Mn߾m:kU7o^Y!w~y x9۩S'La^7AvE5^f5k֨sy          <LQ      3gdݲwިM#=T-[6:9h`nҥs`=ʕ+&Qء/i.緬IxxJypJ4>{h`/k֬1sW!5SOu )Rnݺ%d5J u~iXPѢEMXUݺuMQ`>o$D Ȅhqn Y \hlܸQ4O׶ժUʕ+Gv̙oݿzYkp]Vvi~ѵ@&MFr]w40 ;v9yg ;$ҥK*,1ٳ>ٛY3fh֏*Go9r9g@{ϺglM{ 9iG           @h Z"     km}ՠJ es4PPjUa L0AbBqs! c}^5BjYus~!C2ojoYts}>ٛ8f? ^7/^mӵ@ rM_~RJe[NϏw}8wt          B dq     p (P;MALbЍ؊8{ I24lD|պn޼iBrb{}AA[6J;R_sm-54#!(BƦ}:4hiϞ=U`F mA]we^\ qy.1<1Ԁ);tRJ(!%K4CwִA=dq h?l6]+AcǎE]!yv蛾w^AZ^{;Oפ9r0(Z-[Vʕ+gZ@\:.{^h :g$}n}v\͘c\1X:ous罞m_7{}ӱǶi~):}wlA15pM}Hs          ;A9        'C5tD+WWwh{hiHl!>;C=/^,6m?X2g~ 夵sNM5J=o`a3pyA1j<!=AwYuk]:ZShHʕK (`g$TCg4}.7=nw^;oV\~E>j&mv|kqiп~M?|hj@@@@@@@@@@E @@@@@@<&K"ELdN}z޽?^_,LA    4m*ݧ          U H8     R矗sɗ_~f^'@@p8rDd6f͜v@@@@@@@@@@ m*ND@@@@@`ȓ'iFFCBN@@@D>Ԯኩ@@@@@@@@@@ 2Dn4D@@@@@+;w+V$[!e`  A_"wݡ          AAw0     $EGyDƏjZ!6I@@J95kD5 nY@@@@@@@@@@J Ȁt@@@@@|!ЫW/ꫯرchm[@@@H6|#2HÆfH @@@@@@@@@@ srD@@@@@ lRr)&LwW|>>1@@@DH:"3&1(@@@@@@@@@@|"@Oi@@@@@I஻nݺ'|"ׯ_/BF@@HvW,]*ҼyB@@@@@@@@@@A@@@@@@ Pw.2gΜ@A i@@XD5&Mzt@@@@@@@@@@ [@@@@@@@y͛|@I d@:  @ Dɛw]c          AAq$     xCw޲aٲe7: [F@@͛"[ 6MB@@@@@@@@@@ \,B@@@@@xjԨ!K>(sC!Cn3V@@XZH)^<{p           % @@@@@@ v*f͒K.p4F!  $kiɽo4C@@@@@@@@@A>a@@@@@T:͛7e̙E+X!Ϝ9#'Nƍ˨QhwpHڵQF.^@@x L.RgϞྮZJ^~e|7/`mM]F@@@@@@@@@K ȸt8     ^ [lOȤIX:` DFFʊ+d…re{_o߾-;w۷   [=*rV3;ym~a2e۷ϝK}vksQ          @  c@@@@@BOK.qFzO5RC\ԩc2*^3)R޽{%({1u/_^:u$\~V˲rJsMʔ)?7A .ӧܹs&'0K,2eȏ?h9sϙ RV-9wTTI.^(=zmۚ9Gh߾w}']t}=oʮ]J-LhiʕM   - Dg)R$4fE 7          !fe_qA\￳ٳ:c      @` 4k-[,0;dDZc Ԯk8 /h`dBtҮ];@GhS5@IDAT0իMyj-[)&ZjҠAYp Z0a l=zէٲe Ѳa y=> s\j5һwoٺuTPA "Ç)SpI=Y}v?L`?.\XokQ޸qCRL)GB3 [o%iqߚ*Vh+ox4rĉҭ[7?@O ̙#VXA]@IGDk=Tׯo +V w,jk.I*Uku?`UV5}rU9|ʕ裏J߭g!@@@@@@@@@@@ xs@@@@@ `cǎ̘9P<4HB nj+Pd0 tDDDp*UDD̟??jXXX{7$5}֐ ȼyDu n̐!iWՠ-yڵkWI"wQU;;ґ^E)r8 ({E E"E(^HP$y,I2$dv]zgełl.\qƹcǏWNbC `֬Y9 )W{9 0@җ_~NgT.]bk@z:c  ZP̓#G,0i5k9sD ,k֬ۜ=r ̖-,V[57;,`v$& ؁          @2A&i@@@@@+_|σgЩ0ҫ ܶm)iӦnw˖-CJ,l&01::Z{y-_ܭVi,\Ow)U콱Qgƌ.1o̠nj.裏\c[ݟ~-#GbŊoe[չi&ߠA6g@@&`SR.mI8'u 9>)R$/a3ȑ}\lYn:x%0`,TrԨQ:t^yqڸqz-e͚UuMx[ϑjذ֬Y^zĉ۷ϟjpٱcGC|F@@oSJmHٳ˅!Z{ t.\p&Lk֭_~vxE@@@@@@@@@@ H@@@@@@ @>}aZ*Qv)p 4pOX|ܸqcH T_kVrɓ=(&T۶mUL;.8K.׿4h,(2{1.\XF-ajLNZ> xb=䓞l@@ɓҼyR-N3gNmn=&-3wMsx@pk׺1-\Ph @@@@@@@@@@ ] #     5j$ 4%5Cjժ}7̚5K O</^%Z⧟~7jgk6K,8p lѢ^z%جY3+WNs>|mKhh^׆3UiӦʓ'zY-q&'Ng츍ٖ&MsέZmڴш#tW^6l/  [` ńKzGF_gϞu'vڥ͛7駟vav0I˭_-\>T@Y0-ݗ܍|A@@@@@@@@@@ L1d/[@@@@@8 8;vy$pfeb2u} QLҹsRZԩ,`fȐ!ںu&M+Wj̙*UI2eO$TJ $6 E y@WvҮ] aPre~z#          'P?C3      @oVgϞPJOɛWziNGaäe% dA@@:US!ˑ#GT@V@@@@@@@@@@2 3\@@@@@Mk׮:}fΜ \7=Z 4PHH ы/( &PȥKSԩ5y顇y @/1YȲo,AHa'Fں5;y@@@@@@@@@@X 4@@@@@@$v͚5+89rP~dYFZow--?vNʖO@@(0ebqd @@@@@@@@@@ 2p      @ +VLM4ɓ.Fo>1Bر7@Tޛ1 W# \ƍ֭A^!!          A>Sq!     @n4m4={6cΑ#.Zv:the^%UD<)z(  @@L")"5jP          V h     Ck׮:u~4G)$Pzuڷo>cͻGZQC U L!{E@8SJ:)fqH@@@@@@@@@@D~e7 5!     @/^\M4_05QHٳgW߾}/hӧeYJM%J/G   (g|tm8zƌ          @      PsΚ1c"##a[rժU5|p߿Ocǎ 7PDD \AEѠA ׃# $:Uʝ['          ~ 4     Mcǎ:r/^цɖ-_Y6lнvTH[zR*TGD@@ ۵fG@@@@@@@@@@@Aד@@@@@@  TTI+VԴi2kH_>]=W#GQb5~|[]sMy.F  1?ިV-פcǤ .]ӃQ#          A8!     @ر#Ay/:[lڵ'-]I tyU4xQ@@ ")fRժR Id @@@@@@@@@@ 2!     @X͛m۶)J"P^e-^iG ~@@@Țbe.\#m(j%Y%t\@@@@@@@@@@HAG      JM6U5mڴTnR[ o^;E dj  @ dviw_"  )TdLRҧfT          @F 2#J\,2Oٚ?~ 𤤞 Ȩ'K{*Ÿ@lc1s]糅?\(b b9]lN j[u܀DŽ6WJi̚U's]{nldܐ'N0#Gěo۷B-&sA&p} wnm:zf흲wTR*][+W. b f'&O[AGȀ@  X`=Zh/^pXlYlXNZzuUC9q6n2WX+Wj:r̩uiӦnmҤ|S@@@@@@@@@@4 2M@@@@@ҳ@ǎ-[6M,T۷k֭ڶmvZ'd/$$D v{`=ۖ,Y?/^mgϞ*u cǎi޽VY-O<\ Bz˫bŊP{CCCce oQC&`͙3gj޼yZpeA5֯_?,'p9[N˗/w燅^z馛t-8k;Ƃ          @F 2=Qƃ     &0tP >ZAQtt,oͱ#;oKB\-[6v5k bQ`S[-Գֈ7l{=*URʕZJRmS i/Eiԩ3wjٲ &me,ؿ,Xֹs9P|ԦMuY:tP޼y1-"          A:]"     @XpnFZh,/`ׯnڴIOv,XPpgu]kօ?ByXF Iھ}[nݪ-[Rm̙3pªZ Vly F2|A^!!@Y_~+_.Xق۵kƍ+sjLX̚5KӦMe[VϞ=um)W\e@@@@@@@@@@  ‡ΐ@@@@@@?ʛ7 ֭͠DEE+WjZj9rčdɒ.΂lR ,P@aX_OamܸQ]xRrTvصN:*Z !@dx عsƌcǺ?k֬=z*V]N+p9i$͞=[aaaYO-ZH@@@@@@@@@@+ @@@@@jժoYo6qۧ_UK.ղe˴|rɓ'"٣5k[n* i-Uׯz깭̙%^: 2>4JFd~}1c Cӧȓ Bرc8q \d{v<{r )@@@@@@@@@@LN      @ hѢ$6mڤ~9/ڱcfͪڵknݺkʕ)SHNҪUb j[lqߣr۴iS6o\ J#D oQCԄ ohڵjӦ>uؑiZ=?n:}G?~2g, |衇T`A?@3          A)J      $cƌ߯'O*,,,HF-޽[gz/^܅5jHZd,YƄ"=~M/^Ϝ9ի릛n7߬-[*gΜa! 4 1 ھ}z{LUVMS9r}]EDD?}f̘׫hѢjժZh֊+f3.VZl.\Q?σ͛}[UB'2?aƇ@XrB{Nʕ؃ft#FhȐ! kK!!!           PA@@@@@Ho.\Pܹ]؈d%22R_Sرc.m۶jӦMHϑ OgϺ0ٳg`M6f͚ڵJ*쎶X 4~tW$`A/ -[mjծ-nJ'N5jѣG^~'#         R 4CA!     $իkʕcwvZ=c*Qtp:tΝȔ @@ d˖M[֛o7j˖-ݻf͚Unݺz_d k̘17n̙#B 33OltyСCj*;wNjrDbs@@@@@@@@@@ 2@@@@@2@:u\Hz|jԨl< 'N={*_|yԎ) PbE/hǎ֭Fd-]4zI@.6m4h"Ehݺuիץq$,zѢE4h.= :          xA3"@@@@@Hgkի*Μ9Ç\rz'վ}{ڵK ̙3g#@)S9~z-X@j޼5k9sMQ cǎmݦ{W?+f dʔI/,,tܸq.U          A)K      <jɓ'cǎt3h 3fʗ/QF^^%JH7PLƍBv u涫V ̂ @ L0Aא!CoBX&`… ջwtm\C@@@@@@@@@HAF      @_fÆ TUlٲEs?֭[}*s̉ęt)p)?^=zP;|F[oUoV+E@ѢE]UNgu,@ҕʕ+u]w駟O|,YY֭[CԈ ϟW>}t7W^ *SΝ;5vX6\"6x:tHWFFF^RjٰaC{Y|e           CE@@@@@@` 6|kĈe,)'oYW㭪+ixUr&TkVcI ͛^z鲆 5jpajRfʹnݺ2b@<FҎ;dې ۷j֬K\ɼ$N:;L2%rÉ;js͛@@@@@@@@@@+  @@@@@+PjՀ9s~aM)O8YॅlٲEСC+W.Y :uM%K^SѢE/ݻwO>ҥK]eʔ[o% >m߿k?xbM2%0<;iA=ƍSlTF 6Lڵm5/frW޽էO׃qYХYٳg~ә3g>gŊݳ‘#G]w;˩ۻZBlRr׾}t}^z.0wӛm@nݺk׮z׵zjWոqc eĈ @@K`ںu/,C=6_Sx ͛7.'=Z7oV|ԥK͘1C2g{;63ffϞʯ)uٯ_? e^kM69/dsb[BBBbHnm.?6睦M\rg5kuC@@@@@@@@@@ i ,      @Ŋe& >T~ 4(z.~Ws=.1gΜ.qƍ.Gʕ+?~glA;cٳG]={ 6Fɓ.`Ѯ2dN:M6<#""\Ç](o7߬3gʜo ܹ fϞ5k8͛7ק~* 1Ypwwr:w?p ,]N^kAE duZpќ9sTR%ظf!>/_JGoTBĉի,l?PH{_,L/Tڵ]kػZV-haFwܡҥKfz76h@K,qUTqAzjᡣFR6m\dbzd,Y#Z{f0W_! -8.Oe,?u6]b}u.\㯨nIժUq[ OuiAHw^bsN e^K6϶bŊ髯]-Odr&MxߗY,X@@@@@@@@@@Hm@@@@@@(`Al۶-g%JPYHNhh p^z"hBwa-Xo ųP3gt{3g]{u׹?Bpn6SO=j,p駟q_ڵ]Y^ƍ;wn~c Re!xڵSdd-[& b!dibX{b?p׻E ʹ!3[ގY$Zcƌq(4vX뮻R b,~3YheػZHըQõU\9Niǒ{79Z#],P&.@ݷX޽{DB@mS:D8ի]:ڼv9{۱Ȏ;C k,jN0ARisi%B˼x XBoµi\(^C)}bA@@@@@@@@@@ LmqC@@@@@ )PP!͛W[n YmvW\6lXj׮΅<9sY-ؽ{w76  P\~ݻŮrnk_,lc.]Zsi:t萾xyk-N:Zd [s/.PI ,Y[='lsܟjժ0Nkm͸:ymj-rĉ*V լY3Y}y?\Rq-%wN\_M/=vRKrm1ڴ2_@KSN]z"$6?z[bݺujA^{?6Pp5K͚5couc%<>r6/,w֧4ϽqK$@IDATR{4KŻ9>Vx۱x>/Z y/F[q5wѣ֮]Zji…:zh7*]W€,u*P'""Bщ',6 .?\GVTTNꚴ >2tPwgf/ykݜ_Xbe}^]s-[~x/_\ٳg=U|H]5["YPUr7G nk_<o$U L2E{ァz` ٲeS>}#0Ԯ3xg/^'|R*Tp%-X ^iqNჷyIb]]p]Zc TjU˗/ԩSɓuAꫲ}ӞCcwvxaϞ=gk혻1KRs?,<ٳg]\7oެ~Z}Vޞ}RaK]5[f̘! |y796jHsva}GzW\lI. /ϟK/={Pu lg@ N3J8?{_ڴi#FW^d{V9ܼGռy߁˖-r=s4<[os oO=˂$mmss[, }ܹn.<ͮVOB?CL2gΜ]&          I $'@@@@@@,2<<\'OT2k֬ kܹ,XA]EGG > 5jBCN>5kqƺ\0^>}\[2Z`X>_0,_mu9agu<;#{-ZոaURE>)d?~ʖ-,_~ޅ [nv[{$ݻW:urav?O͜9c|yג 2DV(bh:s|IyyǶYf.LsΝD \jժ^|EnM%Kxq[-$^QVX]pM hR,ӧSP!+VL J-Z]Nh@ Xh[o”i]s5nguXءl4f(Q…~ʛ7 gի_vsn۷\~ӦM]wݥ{Kxx <נA\-[t2eʸy @@@@@@(Pti7?3 +V3fhΜ9z;_~UJ4{<iKœB=&8Ṅ^+„Ko-XU9 x ״>OVo'7o^=SvSndI {^8[ -_LbƏѣGԩS߿qyt ,hqҤI{ԪU+.<j ̙3e>iqNzjP֬Y]H'2jB@@@@@@@@@_CbK1[͂     @ŊuwgMߵk>cvaNӣGmVrJ1͚5K<6o, ñ… YMt+qxܘ2eK-[LM4qS9rȈC1M, "@ zվ}{5*+Vw9 7n+Z6O;C{Nmڴq?˗/U @@@@@@@@@@oAzS      pM6U:u{]a q~G}:uNmڴIC S@@@@@@@@@@Y H@@@@@H^k׮ ĉ8\ jʔ).mǎTڴiVZYfʟ?: e"l߾] ,ٳ5o:~7͟?}'PR\ dÆ Un]ծ][r}.B˗.]'Ox.g@VT)u 7@R|4iVZ_~Y:t_~XzR9n ߺʧ~ohhh G           x + @@@@@@+ȟ?ïtxW̙լY3Z.\իh"kǎ TV-լYӭɂ#۷k͚5n]rVXȾkԨ;te˖M@PSjӦMz5p@=ӧ{,Kkj޼kuY!!!k0T          !1'_#bK&EA@@@@@җرc("""}_Zt-[UV?t=+V̅UZU^n͓'O VDd|{jÆ nݸq֯_uֹ?,Ѿ,Ղիe˖ae L, .{.FRLѣ3fF!mڳgOC*TH~i?oV'Nٳ+W.K PկqF@@@@@@@@@@ LepC@@@@@-0uTuEΝxիWk͚5uV ,Y*U뮻m=eʔQL7QL_o߮=vݲe۷$[-jժ,>gɒ%ȴy%j܃M~g}1:tH5kTΝթS'թSG!!!mH}iڴi.r1j۶ Duz @@@@@@@@@* q3X@@@@@Hi 覛nÇU`.Co.;vBn޼٭6mr[ 5- B kZ\9-[V͛7o2a0-`Ν;}l۶ͅ?Zrʱk*UTjU]s5J ȫfHg5eY޽{UHiFrZlŋQrO>_~Es?k*G9X~ǎ?70*F@@@@@@@@@@ A @   }YU{CnAT!*ͮ%U,X#X%Dk7נ~FxFMk1EP)" Q|gmr& 2̻gګs6OO @6F7ވ=3 kKAO3lO81ҹҲe,2k.vlSI=EEET`…1uԯ)SdixlՋm& ?MA%7ҹf լX@ c=zt >+Ӽue ,i P)9>3 /kK,VZ{u*)N:>*_ pOzN)=-)dsς6铽U uJ @ @ @ @ @AVn @ @ @! ;tj^c>ŋG}SN- Ka|2},oѢEͤe˖Y8d \[tM#֭[g-Zv!lٲb1gΜlBf͚BGS>K)d4ptcE OK "Ao>v۬lv%mFzo-eŊٻ)S"_&OmDzWNKfbvΝ;G^r;n햅`< @ @ @ @ @@E ha @ @ @J _֪yׄɶh"RIa5[/_Ξ=;%|`>\0S` &\3X0_z"B&l7i$RhZ\*)8(ogCi/x L%j[nԩSg%7͡-[i͒/]4+K,)NŋTNU*_|EVi|̯ScWug 'J)3֙vuגc)1֭[g봝>' @v ^w#~xC:rj0)qܸqY8qb> ~:uj. cUævzI%_0t,`i/}kYhvZƝW FO۟~ifszWL!)2>}w}SN6fM @ @ @ @ @ K @ @`g)T'ҳLa<)d'BK>tgdSI)0JN>d?&WZᆎuN˕e5&|50~ gL54WOTB:1xpěoF\tQG.{-p=zde0ۥ3g'||IbȑB)<aٛmYΛ,1Rٮ]H%_Qc. @ @ @ @ @* Y"@ @ @DNW%SF JE-K,H:vˣRdie##QG_JQQQԯ_+AٱNBz  @r9ӟFxcľFѵaz/z뭳RVRw Ce˖?c?A+;Xw¶Spv ~L%e>SG @ @ @ @ @\E @ @X8X)L1\~wۥ"6 @ ? #G|; MT6l2u޽{ׯ_D @ @ @ @ @@ ԭD @ @ ?Y3-ZD̛W L'F~xĉ'F1n\WMd-6E @ @ @ @ @F@d&J @ @ @A @X4⪫"u2%"n-bM oFD @ @ @ @ @@(~C6b @ @ @@ @9 ,GLM @%KELӟF  @ @ @ @ @j.P  @ @ @%xl< 6,q Yޢ#@Z`܈sΉx睈.YE @ @ @ @ @j@QM9 @ @ @J ٨Q~ T Ja  PIq+VDuW)TRǺ!@ @ @ @ @ @V ԭ6i @ @ @@ ,Z(kaÆԃf  ¸FAl)GqE'rD]M @ @ @ @ @@YAEI @ @ @@/^lԨQP@HAWϱ5 @`Ŋn5bg喈V @ @ @ @ @ @AV @ @ @Z$_dmܸq-F#ͫ37g @ e1dHGѫWu @ @ @ @ @ PAVe @ @ @@ ̝;7c- ~H`cG|Ѣ%K6 @*O \z\'/|3?hذƠ' @ @ @ @ @$"  @ @ @'lٲe5%(:7/b pDXE`ĈΊáQT4&#SU*$@ @ @ @ @ @@% ԭľtE @ @)QFY5Z-jd0y @Ϗ<8"rLnWUW] ܩmp @ @ @ @ @lA5 @ @ P)e˖ܫT 7# a>ѥKăFyXnE]a M @ @ @ @ @rYΠ#@ @ @jٳuֵk ZqMTK+y ѯ_āFśo~{ԫWZˠ  @ @ @ @ @9 kν4 @ @ @f̘[neT@+۟7b: @`C?K瞋xш;=˳ҵk iN] @ @ @ @ @T a( @ @ P[Om۶7Z$P~D& kM7U P<8#>:b̘#XbEqѩS2dH @ @ @ @ @MEiJ @ @hN;Ut7'P͛G̟_C1 @ }wGhSo71rxW?- @ @ @ @ @RnUvo @ @ @@MHAm۶i2kHaK @ 93c#8餈^=rĉ$~ǮZ @ @ @ @ @*?s_V) @ @ @Xti̘1#ڵkN k}4  P;#OGx(..3<3:tA~ @ @ @ @ @V@d @ @A'O˗ga35hZBTA8ATYD qln1bD924h  @ @ @ @ @ @ AV!  @ @ @%0qlB:tY3,a @Bzhed&O=ѧڻ2eJG?!CĞ{J @ @ @ @ @ @ Vaߺ&@ @ @(ٲehժU(M@di2 @)0wnĩF|QGEv!߳:+fs"@ @ @ @ @ @@ [K"@ @ @r &Dj&;iJTOF~zĊ>qmO=TѰauWv @ @ @ @ @U$P- @ @ @ 3&:uTeBJHAvq @ˈ?C#oeB M\rI\tEѳgϯ߹+  @ @ @ @ @ P +X @ @ @@xw[ngfZR Pw޹{oDdРA[ĕW^j @ @ @ @ @ @ AV!  @ @ @#`2e ȚsKͤ ͛G̛Wk2k֬#kv-5Pqqq'8∪^ B}#<۷'xh#|yB#'b#~;b\jnƍgwQeo]STTӟaÆşxJNLgiӦvŵ^[2@̙3c=j*e@X3>a„8O>ɞ?8d=C=?k+VDK/{.F۸q+cǎqf-'RXeJx <묳{=56X8=dA5wO~g}v㨣Zt_5:-&M}' L3f̈;,n|ۯ_,Dygv L p1{{cq9'+..H 0 ֭=Xy%s?O(wgt=z/2ݺ~Lid_:zJ{Sh~=)1^x1o޼XzSdZwK/sL}ɓu=*ieH?aG7>⭷g7οV[)cn( @ @ @ @ @Y&@ @ @j+VR+I*2rBx1pH!)pqСѫWcPf͚E:uŴҵkxw⦛n*R/UKk ov>,2'Fz&S[ Js=S^{ƍO>$;Sk q|OS(),矏ȡ%5*ӝwޙҥ>}{阅@oӦM.T~M˺=C=)-=o)2=iI1;#->m?3ޤI8St<Ou=oǚ O~rs [ ]Գgz(1tҖ]8 @ @ @ @ @' r\M @ @뮻.֭n- JaÈzKE>)зolBJvV֭[ Ci;-}Qƿ/YS pLeѱc,mѢEYݭ*[s1Y;^z&SczpǬBtͲe;ƣ:*ZL̎5L[eIv IJsN"Y+/_{l6w Kc7o*$P]Ξ%AlZk@\m0#OӸ׬ZBӒBW]ڵk~x<1~ژBK~U[s;~Y7)o{)^[2jl,?=ڂ פx/3{g<]YgW^1tg}g;vuu5/P ̝1hPG7_uK;~Ӓ> +28−wTg}CΪEe}}]TB @ @ @ @ @@ D޸ @ @ P-̙ӦM.]T$XѬ^xazlM6%TR9ѤIlW_]p_̙3r|)$.Jr-Y@\ :b̘1qFÆ cZSRϞ=cq)vƘSݚˤI =e}xvcշsj/F[Gl[lOL81zfŐ!Cc[mUBo3fLL:5;_>(; 4Yd\~,fl{gug͚\֭g}vF fL]v?7o'|cM{1cƌGof͚Ń>rHtMq)կҶ􌧹 >< fKg;NW}~z> Om-Zd'xb:TOˆolF ֭[.,- @ @ @ @ @T@YglʫE @ @ @ WoT|F6m wFFFwuWBnjꪫ>/xxǢ]vY+V/1lذرclqƜ9sP:uDsd&O?8+ij>O>dva1tШW^ҵ/B4i$7=V;}-dפ)ܭuq1ǔMgqFO:}ݣQFq7wǏς,_|quRhe]JڶA: Z#;_?*3g<=O)JAe)Tu}x,xvcJq5A -^q\kr- ,ۣG~}}䢋.뮻n{p{ͪFUC @ @ @ @ @@ Ux: @ @ @@_1q3fY)_?΅-2O^zgPE". [";/k#6,.\0ve8qb7^Z,}N:4˹sF-6  @ @ @ @ @zE_2W @ @ @jѣo߾ѵk׸;3qiV0̘@N[o䒈y PS/YS̋@ȽFNWqdMb„ A-hN35E @ @ @ @ @Kn @ @ @Fo~Yaâq1s̘;wnNU3((-",Xc @@ qG^{E4iY8 @ @ @ @ @X@d @ @ @-p'pBz1|h֬Y6{/[wԩ'at*P A n4MT_D~zwq9?Ѿ}H @ @ @ @ @E|O @ @0/ ͋{7Z_cǎ͛V[mq;j@ LK1#$@j@71}z#DydM9 @ @ @ @ @ @jVmz'@ @ @@qqq.k⤓N޽{ǸqFwԩ&`4*Y  - @@뮈h,7@֬k6 @ @ @ @ @T Ȫ7 @ @ P0-[o5usLl6oğhӦZ9vXAkq6 Mw\  @|eęgFzjĠA#FDlmmy @ @ @ @ @ @* = @ @ @ W`.n?~|qfu <Wy5Z@d&GP"N8!⣏"~8k!) @ @ @ @ @ @AV0  @ @ @(..'x"n6lXlqǠAM6eSN.]Jj@&Eq޼:C"@G{":+roѾ}홻 @ @ @ @ @ @2Vfg"@ @ @TE⦛nΝ;G߾}#9{1y2@97.RdjB h1~Ē%fE~Ze̟T~y'q?/z9$@ @ @ @ @ @ Uׁ7 @ @ @)cС1px[nem+Ǝ 6:|jG1{vgE̛{#^}$6lc @ÈSy}EpBah&pNj/ZǩvZ񢢢,~뭷.9f @ @ @ @ @Yz$@ @ @*I`>ʘ;wnwyqG6m6zcƌw1իmi@uHG:uZ=5 @xȅFlMkEƢ8ꨣ駟^o#=z!eR @ @ @ @ @@ ԭt@ @ @rI6ݻw . ?0aB :\B tƎ;w@ pBD˖CG: @U'K.e1D)FܿS:K!YI @ @ @ @ @*G@d8 @ @$e˖Ő!CGѼy=zt׿-ܲ\G0f̘ҥK1AaÈsΉ(**}KFvX!@N`ƌᆈ[oƍnj @ @ @ @ @(_nT.&@ @ @Tx`xq-3<:u*,^8&N;w.5H: Ki ӧ @#0sfރKo{Ĉw6-#:SN;R]^\A曗Z  @ @ @ @ @*O@dY @ @@{/wf͊#GgQaѥK C Y`"Hk.uDѤɚg @-pG5k\`>DZ.Y~u8nݵs+VĩZݧh @ @ @ @ @jo @ @ @Aߎ޽{Gv_nݺUnjՋwܱB8Be˾:ܣ}# @@ `\vY:-ZTX^5-r7ׯs̚ @ @ @ @ @ PE ^ @ @ @@L>=;i'-[Oheرo|#4hZN_c = @RYgEԩ22̿_k3#~JDSO+VwQQQ._4klv @ @ @ @ @:AUgg @ @ @`#/^w\4i$׿FӦM7Ų]>f̘ܹs*E .Wo nuYW?fX!C"YzJoѻwD۶oѫWŎA!pGDFV̲bC @ @ @ @ @@ Z @ @ @!pǻW0V" HiY4Wnxŋ#Ճ#~{ͣk Z{KZ^ 6S67 @ @ @ @ @N@deL @ @$GϞ=cРA 2a„XdItܹRB85i|EEX#5. P2bK[/b޼8S>hٲe6 i!@ @ @ @ @ @A0 @ @ @ Ç_~9SN(*cƌԩS5%X`="szhҤO  @@5x_r!i:)$2EvZDqq5~m\:)]馛悺%umL @ @ @ @ @ jW @ @ @ ˅+}zj)};iw_q& X"ϟsʢEbҥY9w{+zh|ԯ_?+ 4(nԨQl2+͛7u7j Pg}/2,Y{o`/Siڴin:Zj=>쳕>_޻)x4B,Æ T6tiܸqI0d>4}vӻ[ZZұ-s.[ @ @ @ @ @X A @ @{gU2c\%} QFeߏ|I!W+"SO>k׮y.I*ҢEu&M~.m*_QsΘlK.%KDZK 07o^_ϝ;7f͚"0#Fdii[n;FnJl̙3@7|3Rw*71#%֥pToO>}VZE*).` N^z^ u ϲB'|M7.|,9?GΝ[^{{)/-@s'Gxb ̰*?< Nړ'O^-X;?K*wm&YIvZ箨(xgH &:mV ou.PRGZ`aiNm۶)aivesKb-VeM @ @ @ @ @V Cy+[jQ; @ @ @ *r}RX^ӦMoO?z HSJKode*¥va,*Sرc+  d%tĚԩ7Fݳ r \|_Ͼ;J8BH{)g#Gf%%]iy#uo]Kioٳ]v%z=s9͑I'EB+{䵫E{wݛ~ޯRI)~i F vmW D\51mi&5jTrMuH3.g8ziӲs,;t落w.7tJa @ @ @ @ @6H@qL @ @Twgyf|'U*{8qb/g!<ݿ&xxcĈp"}FSPі[n{W%}5S-7|k1cƌ,HgϞYI 6s2H* PqK &<OSO=7`BSp{[^W3u.#TVrKo?2>y{pp5"TPS`a z|뭷J;=$%nnvY0u 2L%T*bW8)Sbɑ^̯7U!裏F~b޼yѼy> ̚5+ [xozo~zv(_7>,֓&MMơ=~xP! & rüԮ:}/B4h o80W\dx粠voGf⨣N8! W𘂴Gz5*,X>v! #L)sι{ 4^W"Ǎcǎ>s=f̘Hc,5QTTf#@ @ @ @ @ P  @ @ XlYlfqWJ]_}&NZ@^ +Rԯ_?88##̂ uk:AaÆų>K.}7VZfs'PfAeR ,Y=Pr-sE&Mo}[qaeU0*>ʂ0x`M6p9DݫdLcYx#23gfa]v͂w}H)l0},U#"x7B:_{H7ګ$= p  @ @ @ @ @" )$@ @ @\B>Ə;vO?=MO~3j } u~atMqǜ9s0ַohԨQ5},4[owy'Rc:>zxgbܹY0t c}={U}R~G]n̘1/Nj//B#e|pG3;{r% @ @ @ @ @YZ'@ @ @I`С_: b,&7=zd!1__*g7}Qx1p8yڜ9ǃ>wuW6Ĺ    =U@ /~m۶qgg[ou{饗[nɂ!5k\rI|{߫a)H{Ĉ#İa"}~S޽㠃>}DnݢN:| )g~:ĤIe˖q衇ƑGo!@ @ @ @ @ PH n  @ @ P1EEEZOk6>JX`̙qWgM39رc-V)O0!n馸[cٲes=dȐhӦMwET@d5q5l)F\ve1`콰M¦'u]K7l0 QFgU4S_O?w988b}S}có,No}[ѢE*.  @ @ @ @ @.Pw]{ @ @ @?O nԩ`ҥKA5[`YU{+"kY>k&dyOc^X @j;w#Gwcƌo6l_2&O{n\yѩSx7¬>\rIk.9xwK/[oW]uU0o_jw . 5kVqB?,;A6,Rx @ @ @ @ @@U *y @ @ @e6mZ|'ѽ{2_Sǎ5ˆ,[c>~_Ą ⢋.MwW[C 'd=H" T3<ݺuYX;u3#Z1nܸٳg0>:f̘1VɵK.Aoڵk+]vYvZL D 0 o9nw}d`:%@ @ @ @ @ km7i @ @ PRo^!cǎ ^wh"p}Ů~iqG˖-r:(A鞤{QWX9soC<Ѷmۊ޻w=ztyY+ V/ɂ8cԩqw~W6H_~y?1F}SN & @ @ @ @ @՘ @ @ PcRdU0 Ȯ]Xcj…c:,2C @, hGVݺuc9]Ç}.̳I&~w5{jԨ{I{ɓ5j(L2z饗Զm[H"z/\_~Ņeay<;nSxxM1}R⯟/a\Q/ĉ5gϟ%/vءz˅!+V.dxٲeS7;ŠWu] 'O8C-SN;#ӄ ߺ駟~:z{ks/^~m HQU@@@@@@@@@@@ Dԉ     $X~N-[6>uT? ρYtiR/&uUڵk<isF|kرcGwMƷΝ[=Ν+Vz\Pڵkc.т$O;wXaao/eAmV .m۶>pŋW̙5{l{) xgԭ[7yI={'Tɒ%5h ;v3VZʔ)uֹ0۷_v0,Y_ڪ>?i$7$HC9x BǏ(}Vpz ]v tȑ@@@@@@@@@@0 @@@@@@ Q X@9sY@]~}+WN}6v%߯YFeʔdW`:zyOI2zW4 b 6S8_~ڵMRBYEdh5jciӦUΝ]pdz saaVRʔeر0`z)5l5e!eO<^{5͛7OYfɓ'c#>aÆh\_IpcΝ޽nhG{nnZ*Us=EF.ӧ׫#F(AQk[7̓QO:ïE>n_;ܭXLgϪK.W]                 p 8Z͖-u ɝ; *nݺi֬Yڼy6+΋阨YP 4h wʕ+[lQvػwo͙3GfX]ˇ~]ۄgʕoiӦ`X RJ1v5fΜٯcUXQzcl0$ }  >mn[o6_СCz衇|_sB w-_ܷ?6ڶmٳkȑ Ue?~\? G{`(}(>#G0~x͘1#C@@@@@@@@@@Xb@@@@@@DB7j(KN_ƍ;rmܸ H8 ۾}:vxpY͜9SkZr ~>&M${ٳGUTQ^%K_&Lиqta/^\wum6… 1cF)RDӆ t-h޽;w{^ :8qXkf\,Шo߾nsn 'OԎ;"E 3FL̙Ӆ1zt߯wyDž5x1iӦu.{^uI[/֘'4m4=Z| m\t,T,*Z+{wgu|~̟?__|V^5j6mU!@yB ώ@J_Ls];>Ȃ9gT[[>cj޸;c>}Bz#˻'OVJ"uiҤq6 W]ߕ*1b"""vcJ/5߷o e˖)SLy2yς[h!N6ߦN:~mۚ]vC;1QG]3=efxdS[}o-~zgz#oeffkM+ѭ;/^, Ob&M4tP{|-DL[G ԩ͛;[Q@@@@@@@@@@A<@@@@@AfϞ,WXا~W^yŅ.@Bʔ)ӧO˶wJN˦M\Oҥ= .0"6,/tmݺU.`gܹ. uժUѣ pYz!]V2dLq l߾n6͘1C}ڶm -ǂ--p_U^=j={tI֮}ݲ0G {` gժU7o^76 \N(PekjaHnBAZ,?TR\=s,)}.|֭났~iwXP;~ɒ%ʖ- & XHې!CO꣏>rQvcƩ.F-h"[v 4u%yBׯ\rGڵsϻSBb*y+-O<(6> ̨ ՞gsRJL/X0v |fiv<hk+ J0nl*k Rs]p+mk5g~[o9cYxS*i[-֢QγT[cX\lMjk}֋Vlz"fa*Nue@@@@@@@@@@#2>'q   t&5@IDAT   , _|ѷ[n.qn߭BY샅_ڸq,BL,bkVW" Xh  ]Be@ZHX8Y\X7ȂRLB|ҥKT-4bSeCV6l(oRY@-g!AϟWŊ&MdRg+5kTL\@c~ D\,T+jՎ'rn۵kRD d؟d>& efle#G=z3X\9Y P͟?_v/XA[6l%;tsͫ\;|{yz-(.޽{]Ux?{]Bl/^ ۷/!˗'xr E O=[9s}x1vU;̙3+fy,Y4qD?޷޽[C`':rs[*Tqvm[읯ݗ 7;`iAq)X\wunmʔ)Z[;QB|!ibz"}ϻ~=zh|N@@@@@@@@@@@"     Ȕ) ab֏?׻;aaa1ۗih#`Mϩ~ݽfh"y_Vr?<󌫻M6ԩ6oެ[PC O7o^ :TJɓ/w䀢4iê^ ƍ_v|NDjMk xzjw?iΜ9Zx/,͹S/:[>wtMnӞ@+`r~LwMDt-΂޼y;*U*լY}>\Fwoe9go^ZyCϓ'efK/PK.uk(o DJGڧ"E{8.s{:mQKԩ.o(i9ϊە~oH)          W q     Eɓ*TƍǏ_ۻȏ? $; P& k0N|ڊ|N?M6]gϞ~W*Pf͚VZE=ϝ;oQ˗/Wv\{ d|R䀢oNvE|ʔ)Pvs|;cٸRe_5kӧ+""B:1BOV˖-]esZs/W\ywv_Y/  #GhΝ] Ʋe& з-[\rjqe˖uoܸ~ر}._%u9rYԩSG}SvY?.;={/\зG <|us('~͐!n`          @ 2^X     @R8qℊ+, J%cƌ0H 0*֭Sɒ%:Ifz:ro( / .ϺϏ |ꩧ;wn=ZÇw!C&MryN:嫦o߾Ikӊ75r<;ƂBX;ގP#oxݮ][ ],V޼ya߮>}ڶm|ӯ~I VŊ/;zA5kt/h"vڗ$o5j(M4={vC3ťQ맷qRo|޽;m̙nń(xWn@TSN3g[v^%Jpycҥ^رcGmݺ9r扼?![E/lڴit_i_5@NPYOؽ0p@޲g@@@@@@@@@@ _9C@@@@@XmN7t!kf~? T+5N_zuuAӧw}={~pY(g\˶m)w`D~m[WE]EϝGV,t{Ĉ*S:ww5xElm-Q>n%r]sdBz"*  ;H-           @R˯$<_+     $رc2eJuIo ^кJ޼y]?,tVX[nEq Yn ʳ@|r,`"s,(ɂ-hѶ͛BTׯ3fh.3]> L/dEc;*\pEi=C՗_~׻f͚@$ ̲S !Zl Jӧkۂ$4d׶lٲ.2qD%J}ٳgkΜ9;w|AUdIɓDžX9W3]UtiߡdAaTigNr}Æ5曺]X];eϴm~ M P~MK,qצPB. ~r[LZ01 ]pQ\UԠ( N K ߕ+W.5badcg=6%4o͟?=Bs: ȑC4i $X7vB W7Y裏@kG ՞l[v,4e`6XӞ6[n Qs,0W_ut'a΁h] "7:PmY1]zu͙65iܸԩSm 9ξ4i[DDDh޽4O> Bܼy uO<ټj5ktk#3ffv6/[()2g7[eVZ傯m}vZߎۚ/]tMo m:S 5^cnie[Ķ麹/jo5j֨@@@@@@@@@@ Gj[_߽S@@@@@@hٲ =z 2  F:u,ѣʘ1c0$*РA޽ۅY@NU \Pݻ'O I& ~ϻY(s\ocAD̙3uY:sxxT q㣆Z8 ZФyvr;6g%ur;JbaS7|sBTE >CUREo^xmL_|q >}޽jܸq?j۶mE>iA#rݶC ?n׮ @|k6|-n·rsu]wv-9k(}֮,;j:/|:u{xӂ@@@@@@@@@@AI22@@@@@7c}ui 46lmJ$'`cǎU&M\믿hشiS)S&}R҂>s=۵vZ_eH38|N8KK,т 4w\[NdٰaC=څEM6Zh3w8 :˫_~.’-0),Y瞋uHժU``īVŋ}C˖-]-[ͻJ Vnٳg+y}yQEbl^JڧO˲Y            !@dB(R     L eʔY8]Ztw$H{7nTbŮXצMb'Xxȑ#u}zeL*Ud/ʿ ѣ>#8`sɂTΝ; 2c3f̨Uu֪_֭+?F/UL|@ z@ D{1\RmڴѴi1DrYߪU'< _ouիKcǎ+ԩS'J> uAFR|_[stY-rmvWu%1~ςg̘c_F4/_>͜9S|{UPA&LH6OkP|ywM^{5uRs]2%KZ8q9 W_M7ݤTRas[J.˂ WZ%?3]p!9"ң>[n3UŋUj8ʔ)ѣG^zz'U@|`vB\g{πSNuA-Z}@@@@@@@@@@P 2TD@@@@@ MVN A z4|RHݻ@ڵke˖S~䃐HFjfB=!A)dK4nTT)uLu=_?h֬Y.H.0@U,ԯm۶0.Y,X2O=RJiر5jƏ9r$g}^^Z:tPّ-[6=.w۞ɺ'o[o*㡟 /p!}{vwgܹS PajD@@@@@@@@@@ @@@@@@vtѠw`*TPۥ-PjU͘1Cf;wnZSdIOڻwoIћ]J.%-_.i#-U Ut10ғ%9rxB"=)@x TVMӤIi&UREM6uUa2<ɓ>|ʔ)# 3ÿK Rٓ?ژvs ߿ʖ-{LӦM&I9b!ߋ-^M7t"98p?[ڭ !p="          R\dk;6j@@@@@H}Y:t(ڵ5y䠶KcDXn#G Cj޼ҧOPcpAb_|{Y߯GyDJؿu;b 7̒Փ<j%e{@bs'H?+HlC?!&0}tk?'|v fb# |wWZ%[G5ʭ!ڷo޽{P8ZP hԩ{g'9,,L5jЭꙧVZnM8zL/*p9矞5\Oe7˗O5rwq2eת9@@@@@@@@@@ pb@@@@@@3f 9{Tso-[VC 󹜀@B #:Zx<6'\Ν;5a}W_UX1*wɕ7{~ٳ]`ƍ]0 7ܠoQ5kt/ NdsKLw .t ?`o&:6~.(61           Aѩ@@@@@Y`[DDÃ֯2eʨ]vӧOڤ!# xmڴV@.\͛7kŊ,YDںukBN-VZWF           JAբ     $CYݻ'O d͚Uov6i 9rD3gԔ)S4k,߿_2eCZ( ZQ ZuHq d Ŝ9s+ mԨ tJ Zb KPB lР{٘0B_Th;,>oذAe!1Y3PѢEUH^P!l}2-g!`yfڲe6n~.nrc9}^+VN)F@@@@@@@@@HA& @@@@@u )X͛:ue8RRX1Y؎PUM6iɒ%.8g7 2xBJ^^T@Xdٳg&w U[E~ٽjk8 }wqXX1g^%KlM5kR@@@@@@@@@@H>A&kH@@@@@I'O*<<\SLQf͂2VZ.€($%ݞk^h-B%mڴ.(W\.'K,Bzl;}J:%4iҸO>3g\򲺏9Çw,,ԩSަ]TtiTi. L9iTi`ilH[7sg)gΤ8b AU8ygaE^~VY y9ܶ}yAesbTgw.ѣ:t γw{ݻWPik]o`@ʕ+ ,_~l9RG5SOyyZ71&8p'QΜ9^I=,dJϟgϞGݶul6 ~{\Rzm}7o^_ȥ7~i>R@@@@@@@@@@@A       ,dȐ!ԩSP:i$hy0 p,T /t _ؕ7ni cY7LnAeaA ɹx҈8K[KTrrVaB kNZnݪm۶͇<c7hyiswL2$-DrzR~-dB *^ҥç+L&=fC/N}رc{mz+PȁvE y9ERX3[&Pza[=e6           @g      p ,hPU# 4 I{{+W.^öB+c^| .-/R*ҭJO=%5n,y2( F{UT)Se ,\(%H&H6O'Tɘ1e(_UV:@@@@@@@@@@@*دS@@@@@@ 89rӘC5HC @4K]H˗KfISKMJ*HÇKNEs@@֯ڴj֔Ν~M?>aC T          !-@dH_>:     @ȓ'4jB?4fΔVjԐz^]:xJ8 @bطOz1\sIܹRZ1Ɨ           @3'      @ Ç+[l&! T }yһJ IO=% DDHRҠA ;م          $A H      Xq jL]aԦԳT4}z" pW_TC|/?=            Z6     - SN… A}e8BQ W.ի M&M.~g@-0oTwj۶ʖ7rH.@@@@@@@@@@A3@@@@@$ 'NV#& 4F'iNW:|8iQ!$- 4n\[w֮m 5IX5NF          IO ȤwM     IRPBڶm[vYFXXXۢ@ |d4h4zTGҹs@v~XPAʕԹA' @@@@@@@@@@@D,@d"8t @@@@@(Zl@T ov֭:v\ZU??A2@-pKRɒҌҐ!ʐ.e͚9QiҤwݜ          S `j     [ #""wxω)R0A@,һJ+VH9sJkKݺI%!30@D.p4hT_V>3;hӦ>}gϞGA@@@@@@@@@@@ׂ-@@@@@HieӦM?@+pu_H&Ie\lԎ IIO?-u(m %@NLR%K$>!          \ D~     \(T´y栐\p!( ڵVG~Q#i˖k ?,լ)i#xfԯ=4tP>|nP*G@@@@@@@@@@d(@d2 @@@@@PH* , P4 @f Εn*T 8"W௿fͤ,Y%K?h2k,=zWվ} @@@@@@@@@@@  G@@@@@H^E xdXXC=|e kKKJO63c UXQFC\=[$BM|׮]ݽ90Г"x}}<&Nfͤ˥…ڵ>?O[ފ6 [lޟ:uC?~'+?RϞRѣq)rk[5F/pR/H_|!yurJlRm۶Ճ>9shڴi:~( Pܲe%AAjf֭[wj٪U2eʤ˾Soν1u^̓3?^aaa[Ogs|_          @2 2^x     @ *UJk׮ h-ĉ4nݺiٲeZ`A-P8 @x{~*W>#Ga?/3GI)= _ VMZ"nc>Cs?En{+ @N{O*QB>\z-ijy)kwݺd!Æ u]=zwrz'\?o.{ZXcJsϩhѢ0`;[޹75Yyu׮]zgԢE 5nXYfU~dZɓ']g#9@@@@@@@@@@+@dҽ @@@@@$)PLY&c˕+:$ ,T7o     @Z -[رcaAٳGVRdIe͚Uzr)jwҥ8p ˗_~jٲ{ィ}lƯ'JH=m)G=zt?OK/պuk|W)bŤٳu*=tthʳد# @ !_}%]vԳtҺuR|ײpBs=ꪫt1y{1X+6U4sL.02v2eަM=:p;ԩS6mn{vcM7wI?m߮ދkZzvp5khРA:[nՓO>)kcǎvxKl۶t";p 4V YzuQjU7;uTiݧOhcuvr6S^=ҠN?@@@@@@@@@@Afϩ#     *VBbpA޽ۅϟ5qwI?lfժU{s魷ޒ9rDtb45R'M[4vX=Yh*UJsvZ(?D-D`ɦR~}ծ]6/f-)G*Y|z%K .6\ cxf^ +=Tt㏥E+V)St1=JrR t뭷FmpZjʜ?wy+۶ms"##u 7nݺn`F%Vz\{!uE6mŠ}V,@:uyynaMKҥ])oM0aˡCgiQׯ럅-חW&n4ɓ'b%WG_uUjݺurL:ut } ˶mjРAn5k<          W Hn@@@@@Hs*Uڵk hm\wu.nȑ/DDD/2@߾}5g_yN|_2Q4wԴKCy?vVl*C'`y/(/Pz]嗥UV_qb /PKJǘn?dPC}`KaDkwnsA,ѣ /Fi9uT7Y=UcǎUQ%g.Rwo, ߲e\lc}P/B:tMۻ`ˬY/ A@@@@@@@@@@ .9'     @ 5kքD,&XX>}4i$y[[oUhHuYУܹ{1+VL:tЗ_~&sc= .>@cƌi/Qsʔ)*W ƞ8q-[Um޽~uׯz]bᔥJr!AfmX,Xxq <8f@@@@@@@@@@@ A=XB@@@@@4 `AG͛[?rǎg_D kNFΝ;De7wިu Էo_矚y!ҍ7V9j(YA W,].<}l٢2e(snBmذ/<9s*k֬Q?U`fߧN#n߾]~l?|֯_r)o޼qUwwQgu ڵ:k[Gu,(3f?~ ˢ4c2          D}%@@@@@@ mTZU+W Kg;=r6ok8MXR@'P4gtR_ @ [z59q%h֬Y?zJwu9Oc J@@@@@@@@@@@ 2x      *UBe~D!5kO? 6Jٳ+#FK-H H҂n09@@@@@@@@@@@ LbPC@@@@@ș3ʗ/ ^jκuo߾9)ZASZ5髯ŋnݤӧܕ  @سG^MҔ)wIehN@@@@@@@@@@HUAAg@@@@@@ !5j/CA-Z(ADZ3 @xjז>\6MA @Z8zTzY\9idiذ3A:3           @ 2^[ @@@@@t/PV--_ʗX@@@@@@@@@@@H=YROW       pڵk5SdI}7jҤI;S5k͛ΝggΌlYRXB )2eƏ7N^h?RL @صKziihbE?ڶM]}7)+رcgubʛ7o 6ޗ0          @2 4     I+PV-͚5+i+Q[-4g=1@XB1o& .RR )M*թ#uv&") @z8|Xz嗥|#=pvCR >\m 2$ښދsϞ=ֱ          /9E@@@@@@ ,rժU:qDUVZi:tP-,"qNӶm|{(ZT4I+ϯ.FRS҈RСҺuR^@еkx%KuAsw_v@@@@@@@@@@@ ^_jG@@@@@0 Xɓ']djݺ"##5k֬p5A9 x&6'G8waI&Ш3HӦ%YT$JUJ< u,m 읥T#ЦMxOy zk3A@@@@@@@@@@ # >     @:Xrzt˗/(P@ 6#u<8m}($]wI={JݻK[&W$R7KuHkH&yCQ  dϞ]:uR֬Y7o޼jժUـ          '@dY     A ""BժUӲeP4c d .pRq#6ۇ@r &+&u"EF&g˴$N^jT^҇J_8* z:yd{9+(2Y          a 2,T     )PvAo^;wԂ h T-% yBgw6ۇ@r %}OSO%g˴$L`o_yҦMBǥٳ:uV{# hB }Z@d׮]c@@@@@@@@@@RN Ȕe@@@@@H"u ӧO'QgWSKT&NxF t\mRBBՆ M& CRgnj7Z @̙խ[7/B YfT>           A&2M      @x,ZzuXر&O@ v$иT=u@J +k')R]GvP uf@ XdҼy>Չ*U>ܰAz)GsV*РA*U*a ٵkhX@@@@@@@@@@@ 2ei@@@@@@ :WfͰAV^]*U҇~ ҏ yBQ`&FFfL4K{u o *=@8w[ k_.(Y@R _Jwٲeue%Eԁ          I$@dAR      @zigؽ{wM0A'NHuR@R: A曥Ν;N = ӷߞ9eˤwf+WJI͛KI?$Tap t >ҝ%K3\MQ/          $R Dq     .uj:uTX;vmi߾}>}zXۡrҚ y9Cn"k(]_N"@~|tE /,Z+->ޓ #G_~ }f<#xwstѨ1]?}ϾO1?c:taثsQ1[f6&qRO[[d.er~٧KA@@@@@@@@@@/bwa-     1 ] ݻwX{7ט1cdwB ڿBVgBŸBmdߩئ ?D,S[W̰Hق4iǞ+B,$ 9YHNdDMy\y5z ˟?:)iKIGjՒƍH[8$wӚ5kj*7mڴI[n?=f]bS sO 9އ,0ޣ&i{g/^\KVRtJ*nT{'s gsmAo!=̹ckrv?c:Y+v?1Ӷw&㛷q_A/Ծ`c|eA1?Poc.c_c.le(PlIA@@@@@@@@@@ dQn8ij̎|     $<0$6֪~aM8Qrd!,#`>gԴw^He1 ؊X@Np ̉-_gqMsJ;ϜaѢiҮ"?(–⚂4c[XSPN'N yE& 59o!LdG>N{:y߻Kjo'jNq~R{_]d-\P-ү͛7{.R7hsҞfg{Z(MZ?Y:KnHZ[e˖U5T~}5lPsPW Ǔw>{ {cDXsNobݻgϞ&1Fbc* 8?_mHmO6 o˗{^r䏽,8ccce մzb 4g_Y0 *m*\) c,#          P *      j>KNd!x,,TbE}j۶m80 X@k. dhAA tKYPp]!A~h}d!A.2HӧOఢy ! mAٲe # -Ë-& T$I}H/uLoW4cc9sh֬Y7oV^-{F(Q+֩SGUTQʕU|Tfׯw]j.]ŋkkm֬lRq]+<whw!ھu,hvmBm~ǎngc8Y`p[ڸPGJxR~۸ܟȨܮ?MD[076Qf@@@@@@@@@@HA@@@@@@Hs?aÆaW_킎f̘h qm۶hY M6o!3a}g@~8}d,Ȃe' "1q'e!i\dEsvo޽;*xm‰잳bŊK,m{07ߔ L_yYP8&I&i̙.<тj׮+R5R )-rѢEn8{l-[L.Բuֺ]Փ\X!ްAuJ'Jrz+(`Ӎ7jӦMnڼy ~G,޾}=յ # 1 ʖ-d?37 FF$. I׮]O>M6vyߕ\!ba_? VwB֭[dl>-d7l^«c˗wIHdL]@@@@@@@@@@*@dB@@@@@R^? {?-swˈ X؝Y(І  QX,ł,€d2@LdFa M4i~m͟?߅#xر6mN>N&|c;{u#.UzZW_] ~JOw@򟃽~WZ{֚5k޽{]gl\g*{G{>mmʨREma[0~اv[nGoJ[bE@@@@@@@@@HA8@@@@@HO?}]֑5j>YZ"Et]n:hA,)S&ha@_|,ȟ/V']pR$B7;vp!Fdd!iwnYX]z.Œl*^x"ZN;X٤ wI;NΞ֮]4tP3ƅo^wyvxu Mx.1^ H}.lw߿?bQ |\lVX0=;Azg!ziޙ3gQk׺LmLmle!bjB֬YS]vj׮ |          @ 2]:     #0sLiF{Qϧ=v 뮻3τtLFi߾}_& 8fbT|y7̙3#q$׻ɂWm@#,J|\@ըQ#j /)Y@zw^PaRb$,ܹS/~m͛ZKL[uǎ7xCy-Z42ЖSNEiZt,ɓǽC,jժ.$>c.~Ӭ\R~^*UʅB֯_ nuqV v@@@@@@@@@@RA"@@@@@H: ,PNv%] -[ .8ǞkXM?-[m۶9"EzQA@+Wvv(  hk.ױ^bbڵ]Q:udSSӉl K.]^Jd%0 =x C 0`lAG/O?xژ{?lg6w!wtg PL2% H?'@H~G-YD6mr oҤ.r7+W.1           ž      &,TnА!CW2e裏jfjkȑ#.d…h"ܹSYdQ*UTV-gժUPQ@ m Zb 3`W 5ZjN:EAjԨ6lBrΝ&NI^vH͕ d{C&LPu1=S-[V@IDAT8%>yȑÅwTtZ,Ht޼y={̙_U3gV5ԸqcNoN+I,pB!7CXbjѢZl+Re˖M@@@@@@@@@@ z =C@@@@@D K7ov!5"=9rk7%$ػw;4w\TR%կ_MSՕ={#E$pqfF/vӚ5k\^qj֬6m.(UǤ%#oO]LNbI={ԻwoM6M6>… 'YT$޽;Vm۶՘1cTPtAc_|,;""޼ysƽbrVn,e["-Tku},p          L_דA@@@@@O`߿8k:ʖ-'|R?pr4mX5k,7ϲ /W&M԰aC͛7YEc :$ scѢE:rj֬kMHM!;K۶oLyԩS'~w\ J q X@vϞ=uQ}.7}SH=yd}gھ}TVZg@̙3v~!.,\~k}w֭[oTv/_tq          w     @:_UF -[LjJ3|G5n8mܸQyIvЮ]4m4M:U_kqjٲJխ[7ق6uԋ8uꔖ.]ٳgkΜ9Z`kRԶm[)R$9G _}%/LZN*_;fMA nw}z;dT޽5e >\wqG2|~,^X>#߿_h۫tW9G#y >|Boӧ-[n.2GU?#         @k@@@@@@TZU  O+gjA'NЫz4f6l.r+VL=ʖ->L{uT L#הn"Ydq {vX=K>Slg=kc{DmUg]JN$!CԷo_ j]r\tEz+诿J&'Ojjݺ/QFkъ+~zjժrȑ$Q dl{ƞ-g=sc f${6%Wڶ>\=zжm4k,KOMݥ/ $ Xj3F;vȑ#oFj޼f̘7          ] ~     $JI&i}\`s=~'A{q!QJҽD~4x`UR%9C[ AYccaFLgٳ*9J҂Ҿ}m } ^{%} Ԙ [kaĮMJ 6k׮Tl٢)S{LEM>$P {[\٩S'ծ][ӦMK`m          A:m"     @,Bnoȓ'q[߃7;w{Q2e4o<1B[nՋ/HcJt)`,g=e*{fٳ+Y3i u#~뮻t}jM] &vmD9|xGҥK5sL]s5)D0+WNoyתsjѢVX֨@@@@@@@@@@ L*IA@@@@@T%P~}EDDh/ )Y{do\ ?~\?u饗jƍ.`mܹչe[ l۶Moڶm{.䆗-[Avzgq۳gFCӗ?Bk: 2D6mJU'ho{63 e.{ٳ,@B aKׯJ(C4Ԃ{q>&MmBO߮];gVj4g}7:uj֬y&?\e˖լY[EkmsNtGS@3z衇TRI5o׾e˖1Oz/^xqSҥUn]=^еtMA@@@@@@@@@HuAKB@@@@@@ )B^ϟ%lٲ饗^҄ p-N:_ɂA(O`5}tEFFÇkZ|,Jl #G[_W ޞcc믿VF7o^[Zn4i" !MŞUs˞a,gZ8JIA M Xߌ34|peϞ=M=\ݵkx/_^Æ sØmY('wQK,9ɖص]*6mӦzꥥKqtX-[ $p _^~8H@\ڼyy]6]G3믿1rF D,\Ə~OXkY@@@@@@@@@@ 2>!#     @hڴ_͛)~p~ yk۶~' % \ve޽`DDDjaO%u+Vw[gSO=m\y啩&@)ZRh!6R;wTN\Pc=e_w!i>5f2 g[R %uԇ@x^ylRW\qExJCׯ6lkl>lۓz]Fv 8P< Z7|@ j~q9w)k߾};xp~A?s8cm,g=|yy!e{͜9S):k׮- >.UTM6RJñ;tʮY8رc]JҥSKRC?$G_C'6I?~x'#"E믿֩SԥKH9#         V KC@@@@@S/w!v ,P֭ϳn!D{րԮ];͛7ᕜn6 [ϣ;t֭4ɣ2e_vXl,Įx*[>#m޼Ym۶գ>*?B&Ns~Sշ~M6M~^uM2ETdI 2DEMZ6ڵK]vy˗/Am.W֬Yy[G2eʔ$ 2;v[nٰaZhݻws?ԯ_?}gڰ{?w~{髯riРAQFB .￯5kָ/r-Q.]T'O]kV#Gڵkus1˸ի'{Z.,<ɾV|cǎiO0gqϰ jذan_~KԾ}{j*jf zvZ[`Ś5kFۖf=VX ni/(I^Rb,J89q,T!cƌk7|}=饩ʑ#{ :/=9n?{O{arzVOZkv74,dnLӤIq>;>pl $e\qF7ְEܩS'ꩧtq괱Ê={G %fpߏ꼽gǍYfƳ>+ mӫWXǎ=>Yb-Z }ݧ/؍lemڳV93}twM4f=eq=:R~|'ngL!S>          _&Y1     K/4㏧XwE]x^J { >}:NlM6 x>p/\*po6rjժgܼB vO8Xre xaqnTRছn 4n-{Qu:OGx!+=ԩի^Ӌ/jW~_~;7[R+W7?u;w xn={* qg:[w^З x2f͚ܹsC(;><-[رc^h tu_VuoԨ[U;̙3pP'2.'vy着P?J^36Ǔ'O (7Hz: Ar{xF+2pޮbm_/˭UZ)lkkϺ*˗{IS ~-jLI{2mMO>:sv{; ov疭gB76iٲe_~qO/սi%zVlŞoms1]p/3CHlqycPJ^;CUlG/Hյm6wӯڽm]ʕ+x^Hwy/ ?\Pl]uU|ݲmۘȾ? ]?w 7W6b7/x?}ʀH,ݻwxnzwO͞=;]|۽@M&          @,`MA@@@@@ҭHyynzohŊڏs E&-[モ4y/lQ^؝R~'yaօږKW^T(/4K{v} ^/#w.':/Z9sF_GۘJvu׹-;N wXbai$'{?[ѣ<4hYe ;M6M>{7N=<::vcllڊy֘ Ա'/XNœNmΜ9flc=NVI7XVE?Cϸƥ9>6裏d611Ɛ1ۍml=oI 6Lv_o/R^`f̘Gvr * Vm(^(zEk0,3~GOA@@@@@@@@@Hy)z     O.,رck$- Gx؛-B-d箻rAI&LB߄6 (--SN.dς6-}>[oiݺuںukT=~.#-x? uBʕ+CikĈ*Q __ԟժUsV[0[bMZÒ,H,)˔)S + dŷ/UuKWG>~ѢEL+-cˡ;?SkvG#C>6j%fɓ'zZIcZ;ǔoF J)n7\]7-dBj}hz uPB +ꗦM紽l6g~Vu|{;rHiavB޽ 6>} :tH}&O5ׯɓ' ?{|߸?P?k֬m|k>~kg|."뗊+Y?{~I̽=?ẉ           A @@@@@Ҵ@f\… S<,iZ`ƌl/d@ИcǪhѢK/TSNK.~YpaKko=~̹*8X]V\p,Y5^Zׯ׀b=Ve >?k>K,!u1UL_lV{\.ro6lm9\C/Me&;zڴik ĺC,+oS7oVdw,{ƾ_ r=e?,3SZW-˾IU>S &읷cǎ5,|mYo;m E^iʮYJ:u\qJ'Źv۵k' w裏\ ѣշoߨ:>otҨQ"4hPnٲen|g,4~?Bm8&uoK|l#k֬ ?:!{Siy5w\T5J"         $N :8 @@@@@HFg^d`ܹ3Y^{-Y;F"##հaCڵ<=zhΜ9XpѩS'͜9g[(_8J\\-x'fٴiSU.8q­ ǏǺOJ-(&u1iaIOv%Y.T;|Ѫ)Q[.RH}l2i$اOYPU\aDŽSNiܸq.y֬Yرcrnߍ}GQo T#I&(* EPD"X6 X+E@HGҋ޲CH d7gvvΜϟ_&i&ۍ]r=cv,XήYr-]v-zj"굀޽{СCzw5au%? >Yoޅ7}o]kk{۶mџ϶>{=ķ?11vbP{\}ѣu]w5@@@@@@@@@@RA T@I@@@@@HY+R3fHFhmʗ/8 2ehĈz衇4jԨ7-<*R|⋳4m4X+W>̅@^uU*P; g#)_VV̙͝RgR\?>g)n1M:}պuI:ub~I7u_ /8;j%}f> /^,-v׮]sO> KXUҥ]km4{3~Z6n2g V]O2<:${ߤI׫ؿ`t5﹘`fθٳg>yieۿF5Kq,XPy͞=;9H:-`|PZRxl~m'[lqm߾=m;o׶i&[EK(>O4I/϶Bw,sذaZlo0s[,pኌtr;/,ɂ,_,`PB.>~g/r}Q{ߞ-?so?.Gl'ꦛnݻel-ʂ!|MwZHQŊ]ȬyX`H{^;ܮw}9sڞai43.RٲRƌ5_YBXZlC yرõkK|]baqo9Nw+[w;?f C{cٵkK]9Drɯ:mױۻі^zow{1Yx!z޳x?n԰aC]xᅺ&ϹN|~ ??׶;yb`\s"ͳcε޺u;$ڿGbտ6{ dsg~@@@@@@@@@@Gm@       Jk׮ x>%DnրIR?^b seƌ)nbZjU _|/d'pw@~^f:.]:pEի”Nt3^H^ m DDDJ,xg\J Ȟ=jժy/44Dw /`]K;Jٲe^Ѝ;^HP['N</xtB&~{ 뭷 *Ua}W_}(Zh s/`*`\3ϸvrB^PnVZFp+^h < x/+ЪU+7 ^hpҤI;ILqݻs̞iɱt=Qsx9fLgSc϶=9gm_r%߱{/Ϙ1c}/8V{ Xg7lO9i[㏟vC=m{gs=`}kcs`{zSO=8~Mc73{yA؁Εbvի}<ޛYfu+v=l`}b'maC:FRV>1¨ݼmF6o 5kN{۶y߬_6W=\>7y/d6ʗ/Rڵsέ[n 8Ow{z]|I^lXb:EL          ]tpqR      A  ZIh׮]T5k#F$D煳 ы/(/OO?Dד\'x@iD7煶 S>} s12T_a>:):M6U/h՗#GTs욬_^^i^X\@ֵ^+/G[nu}ztUsN-]T^Ps ݒڽm vذa@#wؽa{AVʖ-&yŽ{n۶mD'o p̙3y%Kʗ:u|Lîұco\_s5y텤*ؿ`b^{/_\",/8ij_5jԐޕ)9)S lկ_?%Oy_իU\9y݉OR>Ğ%f_;?XTJ ߕrދG\>A;          g >|     iD{.o!1Z]w>sp )' P4h M6ʘ1c# y{z8p⋳o!SN=12׸ H ,R$d nh!Z Ν;s~o9Z:qj  1N|XٳgOA[p߮^zA*TPɂ|M=zէOu]^WWvmPB%1 ܹyĜc[nȳP'.& Ȅ!SL^ܹjժW/o޼zy^;gCy@BSMp-[ÇkȑRϞ=駟z^Bc2/ly%sCaT} eFN] ]vv)p}f֭[$iQ-ъm[@@iF3gN1m׮fH&CѣKǎ|W O'jҤIZfׯN:_LW/kWzym!K9R^ثeM>G}TO={0yOhРAs{{n >\VZMp۶m+/Xv{/o?\QQQڵ XbF@@@@@@@@@@d 2Yy@@@@@BI{q ,ni.g…*W\m۶mꫯ4a_֬Y3TV-e̘1dKG@ 4,_~qE~k!4o܅^wu*Zhv~deKijyTJH5>bt!-:{O} 7ܠaÆ)w 8CW`߾}^xj}zճg2E5;Vܸqc|nӦʔ)"}[MToZ,-]͡`ۍ          @8W>"     @P,]vھ} ,:QɱcTNe͚UfRLQmP8zw}'+r̩u+pŶ *;!P4w\͞=۶UE4h=Be:H%͘*= ~R>ҡCz8 }=|p5l0qptfΜn=ƍF%P8؂{mǏ͛7B ݳ+TC4+Zhw߇om۶?͛7͎!         I t+     \`޽*TF傑BcY﯁Rˮ]\PLM>]-DFFvڮ\~\rH9v"@,$vɒ%?~gWVX 2Zj0 C $5[j:trέ{W=z4/`a|^u߿_{i/^<7'NpsyvA6߶rr CmMx:AP9Bo Ѷu,тm)]vڪS,(Y,          [ }=     Nɓ*Rl?4h'xBV~7K8˚5kܶ@om*UʅZe] *Tp`!Yx-駥m=/ͻ 7 6m;UW]`F^&L|LC-Z4-*=!.\(+nAyvbމtłmL2܃iYXg[YbEtͱ,Yc ζS ^:a{8          A&/#     @ tYa>0`N j7_ի]0YȊްa \NXJҥ]p-[m[:_@ v-,B~z7رc;3ft P0Um_|rȑRv,˼乄TB3& , .ёdO?TC ѬY\rvԾ}{7Io8sLg2~xkݽ{v&YfMwBnzvr6w. 9^z}o$uFkav[.:<bj?@K-DRJ.2SLyZE@@@@@@@@@; a@@@@@8_>H={ta39s<oQӯbŊ%[;Z'\X^bxn/TD (P /^܅]k3B`U@IDAT/:5,re֭.,~T0" bcٳ(v9~xtbeZǘM X s/p*({C˗O?շ~ٽ?Wf͚^zS{6#͖-[\O?)Sh…ʘ1j׮-[}qhiϻvB]?ςؼ_l.3YdI7Hk۶cY[6DzW ׶mu+oD6fmV."w0Ǐb@@@@@@@@@@ LTD@@@@@[*W{/;dY_{꥗_~9۽{z-YK=4`-[6gA1~pX8_̵Yp;v,\۰y!}Η/ގmɣ9s$yh| ǃj߾}.`Bٳ'm}fBvl̐QY,Y\,j!T<sTYPUKK.z> FVLKb,IԩSwiƌH{FZB֨QC*Tp\r!^} l2Y_]Y=6jH-ZP&M:)>޸q ?y6=ms9X(?mƒ<v}yϥlϯl??ߺ܂m>eAmJi/_v,           %@dj.     3<7|S GV.]4fu1U¥q lYѣG(V|СC.Ѯ:fٿ }.vf<Ϙ!~X eaD~˒#}jZ%[ $/]8|8o<Yuֹg^⥭Z)S \5+fF{˞{|Ba7 |.nV.r׏Ƈ4-`p %f5b/6~ȷ9?˕+r:}>gs8C:[l؜ζ-4#G(fyV̹Vmn{3`6?ϲPNSնmNk&|F@@@@@@@@@HA(@@@@@@ /VժU]Qڵyv~jذa;w*U-_vBu ޽{` a81m_̐˜~hthu&t?B*c-<3bu~ ԊYg۶%?@'OTTTlW.*~Ցe.L~f̀MÛb:YdkZTXG[(NZ {GBMBVXe˖vZY 3ZP='gS,Y\mr1.{XX?:O4i@yB DFF>k*` i_9}qzLZQ/'o> 7Egk} o!osssmֶ?uBm.b-~ \X|W~cnڶ,          5 e<      ` ܹ}ZZ ^]ҼyTHJHko^x4s3! uBzPHq+gu~PֶukmCC!ZE1&c(-(ZƵ% }Ym x9XjH`y!Za>~Ҝ9O?@c4aa۶ms!w^[bH <{[o].Z w )0iԽ@GiaS(iBmsfs7+/o!h<-ڟscϟ<~;1|Vbs.>۶fw#m#         A~     $@/jĉZbE̊wܩ:u)S`uY￯zJs/_p}Fd:Tni|Zdl( Um^KJӦA1@  GySPԵu<U"          @H3#a       @"ڶm+WO䙩sx]p~رH:K&QtMZfyB C BI`z顇~Lu9rDʖ-1gp, .j֔F>X1B"2@@@@@@@@@@ X1G@@@@@4#P^=+VL}Y،K/ɓ5gu1]A,I&*Y,Y^{ME HG@ [oJ~:M ->LdZG/KuJEJK:%O[Ԋ          iO ȴwM     $P ""B7pCXAjժI&Ե^$p}a/WddX'Ntɂ' ܹȑg~ ̞=oُ_fͤLJN@@@@@@@@@@/@d8@@@@@Ґ@h"Z*FuWhڴiԤImڴ)N:U+WkAiҥk[ #@:.j0܃9PU iH`Ji۶SA>(y,           @!'@@@@@@ 4nXEرcnhիWٳuKYOvc8W٣={iӦT/_+s:@ l"u,xԯ_:H"2tiP`>[N[t,8            $ I      V2f̨kܸqa9/X?6l|A=z4,ӟ}*T]/B%J}@3,M)~iذ3fGrJa3*Uᅲ&N|Sʞ= !          @ 4     .бcG-YD˗/ٿ\^Jק~CjȐ!V8 {QNԮ];l]n)N@ [u뤯rNi m@ ǏKԸ HO]sM* @@@@@@@@@@HA[@@@@@hРJ(cdž5w-+TVZٳg՘f͚UjƌsέRJx*Z ,TJ|7o^J/!,W\IH/|Ao^Æ S9T'!@8qBZT^hm|Ey?c؛x,['-9?[R׮yK'          Az7     ]`͚5*W&MVZP0** Z?ӭ-s֭ھ},4rΝڵk٣G1,Y")$K,酆u={,t;رcsy;^  J| -[&/~X3D@@@@@ t ˠ1c$ O SLTNжZn֭/R;wvA5\?ZfM|Uҡ@ϞҎB +ծ--_.͜I 2efDRO+ҥ7zϯ@ՠe@@@@@@@@@@ҷA3z@@@@@%'OmVb}Ǥ L0A͛7WÆ 5eiF=\t/]1cFR<H##FH|"8q̙#U~w| NjCRK`>[䅑K5j|̙"          "@@@@@%Э[7͝;W+V +0|py뭷jʞ=iUTPB_^ƍݻuWqƚ9si҇ڵR^qՂ!DžG K2 T)&`S*Uᅲ&N2d뮻VyM>           [ "|F@@@@@t/ЬY3)SF|A8>H=z?!C(cƌVgߵkN3fݱ5ҍ7ިիW{_ @8yRA:~cvm0`}8IΖ-[jѢEzϫf͚r* @ ̙#.EE3:f.~,&M`ŊSEF&|BRS`PzS=XPތ=ZڵSl           v;t8UӸqz@@@@@@ ˆM4):f-ԩ_|1h_vuypn*B?Cra>r䈎=ǎsk;?ɓ''NDo>WK~ 2gc3/2e޶}D+Yd9cYU֬Y\ȑCٳgX=)'U(mrf74.^jJ__XA=å[rDI`GiDᇥ'>իWK.͛[           @*ItD@@@@@;ԱcGmܸQKNb/'OoYz j /Դi4x`/a͘1C/_T1M{nWݫ}^mW<( ~Ƅ,k_ࢅ(ahux?[,WX.i1(cRڶ X-2gΜʕ+W%O<ʛ7lsϟ;\K>BYp/h!n}*DsXB FMԁw.-o(5lxfFRѢEդI3d           P XmvpqU#      '`jJR޽SO^G ˗N:ڿ֬Y۳fr7aUX1Pÿ[۷owŶwggx*Z``ܹsdhZa9ve͚5zm!sѣ._[C\ b д{i*i~0dYSWÇ_z'ԶmiFF 4h U*V 5H3 @WxkSk/8%Kmٲ^}8g'           A6m!     @ G}{adu-VZʛ7~7^ZʕРkѢE㏽A'`7o֭[_ h1 @?y5%X **ʅC۷O1;mۂ;mk׮>m#{$|Ͳ@OEqXb*^bK,w)]Fy.Գ9@ .t7yG),XW͛ڵk           )$@d A      ڵk]g}n!<>y򤮾jhW^y/_dlTǎS>}4|pիWIݻW6lpłRm{ӦM.m'd̘Q vA~ Yd>+mG)*v! јžgdϞ]JBZ2eʨlٲnmT˒0+=å_~jL9־cRBۥҥރ/tsֳɷ           @dJfh@@@@@O /2 8.?9sh֬Yʑ#;ĉq] .P޽]cGʂP׬YJm ~ Hə3TڅoAѡ|WD ha,(Z%ķH ܲeKt𨅏eڸq<]AZ0E]ݧ1f}lzW)sfR.@ ǻnUS8P0@8{OȱcǪ{g?o@@@@@@@@@@@ 2i @@@@@SW^j۶ ó0S_~^z%}GQV^H H:XcQ/MO>:r䈞y+ڰa/_+WjժU-8 ѳ<+͚5sk +S+ 8GK|@,PXbس'e׮]{g 3]n~G퇙Fx bv?_r%K/e] 2DoA+Jdcˠk1cťs6ӧΝ;'B@@@@@@@@@@R@ @ @@@@@o뮻NJo{4-[ԣGu]r4SSi$y^hYV u8p`"NZŋdt T]^ tG$F,Jjݻ]W/q4sNwNΜ9BV+W*U8+M;E^oC@4#ot]ȑ/(eϞ= ~~G"          +@dR;     3O>zKy駕#G40!**ʅ?Zp믿]Q̙'Fn\_WJ62mY=ZE}-eʔQJԴiSׅEFFPB!3:@JX_JoXB+Wte˖iȐ!@U[~G2YKMbAs0v}r|͓OH3gz&9"M(]sMF|1?^EJ=/WX~owʕʚ56k=O-5"""8kr?*@ I^_PA5J*_>Iո8EW^ѝwޙ8@@@@@@@@@@H *@@@@@@ 4h@*gA3?P={tf_~G:tH9s_B8 wٳGժUs~m%ڵK|&N(뷍RJjܸ mԨ ,š4+sN͘1CSNմi\Pm|ԲeKlժ (p$|/?{HIwߝj8HR?KO>)Ot#F졿+U8'           @ 2]\f     ;vt?Se˖ V!_޽{U|ytMz7Ǖ%K}<&wΜ9(>z衇RgE.:n8͚5˅hGY@ m l߾]} |ZpԶm[+V,E<{+h4\`${w)[6nTÆ^ S!           Ab]T     yvکhѢzXc'PTTsiۙ2erO8qKzkҥٕ3>tv4BM6Uɒ%ꫯvڲm۶iȑڵ+!gȱ!`ߺo{3 gEJ,|#]x!!)aM pJa֭/^;?o@@@@@@@@@@I C)@@@@@U ;ӧ}t,[Lo}Yϟ?gȐA:~xǤO>Tnݺ)B*ͳw*Vf͚Z` ?<nP9ο2j@@@@@@@@@@@A d@J@@@@@HEQǎS5T0̙ &SDĹRLt^۹KeO<6mڔq ԬY3lR?_zkd>P=wYa {v3Ğ%LgKod6 Vԃ)qcҔ)Rgw{֯_~I7|V           @ lMS1      ,Yɓ' zH7vAd 8\yĉ8 >} dZ8vlS/uo8ە1cFfϸMʾ}o߾_ oP_]eʔIJuD 2dZrЪ8#F ڷc :K/%zCgȺu3Ş-g.}&5o.q5q> 1R*Ҷmܹ҃ Ď;zh(P@W]uYyi3Ip7i@@@@@@@@@@S '+NG@@@@@B\Zj^hVs吷^fJTP^̙ XH/ɓ'QQQ.hsѢE.3rHwmܸ͘1C˗W-}Nh>n^~-\Po .z8!y,tٚ8qYح[ѣG7hϞ=ڵKSNuQzd9r$fAKT1kNsQ V7GnVW ]J(;CѧĵK/U߾}9ۆ=5k@)S'<۩껤xgVbϘmۺg={|]r6  ̜)U"y^8Ro,Yo3^֭Vzq#7{woSg"S93)D(/)$*MեAzEEm f!3!y3sߧ8>>}<k}"          @Wsk      @jժ7Hws7o{=K2gάs{ES˧]cƌї_~) Yb -ZTJuVqzg\ѣG_GW۶m]?֎→xj޼瞘B,Cի_ǤUZ7s/] `cǎiʔ)C<{gnznGqu,0tƍWsm+w[xOÇ׆ sήNb4ilٷojժ>}(o޼ k^/" ,kJ :%5k^٣/zC{ȃ>Mjnλw?BE{OֻᆱEߤݻgڴi魷r:u+*QC,[luU|al-[{6nu]Xrg=԰aCX79k5[wyzٟA^ ԩ{ң&|Lr԰g;C~=9sw}Ş#Fw}ލ,`p¾ugFܹեKh,xԨQʖ-{Wo]Z`kFڵ{V=駟ܹs=>s1߃~|ϦgR@@@@@@@@@@@  sˆ@@@@@@ ,ςetDSof̘ 9{I7tfΜoօ#is,pQF.h6ǎB%###et|rϟ߅Y 8.\P;w†!?/jժ># &?,@т)-'y=.1gΜ.Hӂ,?CY5hZKw5׸yf]V6mu]Ǐ$k˂ 7nj֬<|X7x ,oj!Æ s_X /MM*UtIeT o뺴ଘ묽@IDAT%Jp706[ ]xTTAZc=[oA5@4 ߴp[Yح?edyR6Ԧ cʕ=㯟\Y_tKgVlυ7kLUVu!fnAh7nh}uA  m V)gS|s          @X@A!     A$`0f2^,f̘1ٳ K|,1G; ydm7~7}tB֬Y/ڕ3gNB,͊o^ϟwunL4ɅZu/믿ڗ64h:k֬)S'x"j>xv.X0c]ȑY{ァM6iǎQmX+ŋ=_/(r<և[ B$[mۦ2e诿rG|]/ի6}גorV7]۶341DsL "?~_PS FiB"+V8sLԾ6.\1Ih n0wfϖ̳` 3f V- (/(:F{f]uU5k:v:e_DD^ўa|7ꫯEq.bOVѢEݱ~naŊspG ߶pG_cΝ;m[4뫢q=_Tl           @@ P      @0 XhKn[oٳ81G.BR,҂>SY U\9M<̙e˖E]RKv5=6lP 7oܸ|-gڵڳgoW@uU[nU֭eᗧNw%Kta>B _Wƍe!HCjB[6lؠm3`:_~}wH|>˘\1Kc{d"e'y?\,`O>)l)r˅ H//8ՋCn q=y.D^wzYb{,g-ZB2cfxəlaĈnXm񕸞M/v@@@@@@@@@@Nvg@@@@@@ z)ݻWǏyDDD?V.]={$#s̲  "[j:vcǎ6Nj9rۮ];/ b V{nYڭ .։UV*Uuϝ;炇Z~w a^Ծ}{͚5KvNzɒ%K'9r!c-[gX3gb; k&~|l病`ܹS۶mF.j(^яeKv{݋)FI^.6u@Dծ-#'-/Ss̲Zj]3+{dɒKk߾}쏹B-?ԠA/B׭[!C(k֬SN.׳)9wQG|@@@@@@@@@@@T 2ը@@@@@ҳ@%@{4x`s@[GI-<΂x~i*T O>ąN4vofڼy:t/燹sUv^hw뻏˗/X ,]oذa~mg̘QcǎiС~x ZjիUF ͛7Os8sqߵlR_ [tW'O8J߾}/jzgjXbnN?u*Y]#Q_RYo<ֽ/ʟNł=}?EoĂb}_e|ﺌß06[GY믿F] %۰{{d1/5|#`Uޫ-Yf{زgV]UTh1Y=.: eʔQ\4qD_aa۷osݼys,YҽZpd۶m裏{vqdA;{@@@@@@@@@@H SƕV@@@@@@ {9]VSL jܸ*VgΜم}.l@+_[}~7R g|GK/zIe˖M6mرc5 y'\SNua:K.Ur\ \SKH 믿f͚n>R9d69j(cы?vZP,\P Tٲe]VZ7 +_,TB[7%fL2j޼ X(B?s-YD}vڥ_]%JpC1@< |Weg{Kֲe˴j*O.,- 1l֬ $`D[4gΜ޽= i|.voF͜9g- [1bN-pk׮SNG 3Zji֭.N:*Yd|Cqߙ}I۱xb]uUz/gaM/{)Yzi}X3[ No67v:u P?/ʮc'G0#M0A7nta6e6߷·C{׃ocB%K-0G 5/0?'O|IwW <{E|Z|~JOoyW/Ť  xϺy~yd] J,ڞ5eC̵w^edd{/jڴzlME]I{~4h 爽K[x={^מI1cF=צMֆ/vރ{6Y6> i           @` dZZ@@@@@I ׳01 Ż[3<}]\IX( >܅=Z %XZOݺu^޽{]}!ӥKY$G9v옞}Y}'.!.,B `?~kX|}z?؅0o1qy9z1yi~ {eQy ǽr={`9rĽ{ZX)'̊ϬN8-[]l{Jl%4G@@@@@@@@@@ 2y=i @@@@@ЭުgjΜ9AѠA/_^F1[b|.=ߏeK90e˖FV􃭽>}hѢE.?J(J@m -PB)26 ЄYu!j}' %t3/YbJ.wd'W%=۾} e=x`ծ];S__^@4n\!Ν%/?Z~*hȞ={03          @P$sD@@@@@RSo߾`5l05NR_6mŋ/'eʔI7oĉN+Wv,Y"gɒEe˖սޫ^zI+VT/{6{l͛7OT2e0z]hhXXe :t5k׮ ̛7}]N$G@Ols~^bޟ9X#G<Ϙl._l./""B}>͘1CM6̙3ոq$M˥կ L! =*ԿkR˖gwcǎUr4k֬d̞W^ye@@@@@@@@@@@ @Hܙ_8r„q      @/_>M>='dovޭ3^x{a!5$O{aiɟn:mEg:uR589z衇4f;wNjR=ԥKV,`V+{{4hР!oqܸq:v:v~+Wu&-Z$e5 N6nN"y*:TzV(QBK[`7           &A ;"     @z1cZl+Vy_B5kT5lذO-ыmDyꩧ4zh/i .]6o}9r͛2eʨM6j۶4h 2Xq5|ыʖ-l@j^i;y |&M?SM4Q׮]ծ];ȑqp+_ @:>\KY/V˧ 2@@@@@@@@@@@  p@@@@@@ Xbr4a„-[Vngjĉ^V)SJ{W_}'W\n-z **H=ӷ~^R 7ܠ[wudKHvIr%k4A,pCҳJK3:           $Aɉb      |wjݺuPB@N`ł3ecLA͟?_7x>C/KGJbap3gk֬Y:z lڴSƍU@T]!@r:tH?Ν9s~S|ԼyslR~ Mb!)#n-13҃JٲIGKF@@@@@@@@@@R_ 7G@@@@@/yrʺ4bĈu#/񧌗6rȀ_ZO>6l.]˧PZl~͞=[Μ9Ez5l]_+VT dt DFF… `ݰaf*tMUvm]@24I!\dn@ Nz{O /K)0w\r-ӧg@ٳZv{oXPCZ%J YbEUPA+e 4\goذ}۷owc˓',тVkժ*U(si>YZZ^`eo"Z _),,Tf<@@@@@@@@@@@ 20 B@@@@@t$pyU\Y 4g}3TB3xa@^%^#G[oݻ[7Pܶm PH \~ ;yrT|y+WZhoɟ?Nq!d#G?hٴi6nܨCvsR+U$ zի@$w%]sR׮1]!@/=T4fTf           !-@dH~&     %{!\]]uYrTS+VP5z8AAsiԨQb Ao i!x <ț7&wMRT),Y҅(QBW\qEB]=.paw}۵lA[nՖ-[ˍ),,]˾ TGWPAhw R}a>.eɒ\cO\ץكa@@@@@@@@@@  C<3K@@@@@HcϫJ*W LhȐ!`uYj;>^O\gj9sm޼YXoB|!z69sŋꫯd)Z *$ ܣ pPjݻwk׮],;vp'OL-tn`Yf^6ۖ[˼$,0ԹtR C @@@@@@@@@@@Ȕ      3fT~ԥK *_|B̞=[͚5#2g^SLʂ}D<-bŊnm}vX0mܹF,ԩSQo`ꪫ.Z, \gɒ%X6ҿ@xx8cݫ}oẾ={v>ZX1Y &%Jł C|<'yP9E tΞl)/Z36t=9           "\lBK&$W     UREuѣlbΝS5dȐtd p?]uGq{-[}\ߡC-sέ \\q͗/[۵Γ'츰v =:v=zԭo>|Xvc.v\!Cw-$pQEq۶ꫯvAcٖ, tiCAPظQIZP8@@@@@@@@@@Y S0#     $`t˗O\R'NPFҤ / $޽vءw}W3fLSK9XH-UVڿ[l;zPyQ, +W.Y(d޼y!m19s*Gnɞ={Զ˖-[Ԓ5kV)Sp>}ZgΜqk۶ZN:}Iw{Fł} cz13_X]۱J*]yWPBnm~S1n?+/hU? ÇKzI+K+VHi@@@@@@@@@@H ?ĉL~۷҄ "      K ""BUTQڵ矧i:p,4tI&SN.T/pIo#+`Gq ;vѶF1m|[dl@W ̒%[2gm!h똋a 7%<<c}>{o>[,A/3fxﳅkZfM߶p@>%KAիKuH}z*O}V_K@@@@@@@@@@@  2NCD@@@@@%0n8w}Zv*Vꓻ뮻\ɓSҥKպukY(VP!=N3ɂ-ҷX8'r̙Kֶ/fﳭ}AFg[ ypF>DF_\M^,=l҂(/V5kVb!1׶#GbQS礷ޒVʗ90jHX` ץѣR'| 5@@@@@@@@@@@G 9@@@@@BDBߪWJ*iĉ>"EW^ݻw^;ܳgڶmuiĈM );o߾:x,@l_~)}gV} ^N'` kNO=_* iFǏٳSW &ի] XHRҘ1Ҹq!.           8Aι`$      BVn]7Ugl2eȐAjJ~C,Y™O?u] 6ԙc*/^n'M E <(n-" lg @D4xԠTdޛQ|           Aal      Yfi6˗tʛ7ojuQ>P#`)$`SLQddd @(pԮ݅O(e` M7II/,͞-y@@@@@@@@@@@  2O G@@@@@մiS=6e˖vک_vTlY-X@ս{w5o\;w ULw^-Z(Z Уt4ytaF|KիKɻK} }@@@@@@@@@@@ Ã1v@@@@@zW^yE?fΜ*sY|jժ*}z'3gրݺuV?8YeTVMeʔѤI.MO/ .}!,.=͍ ǎI;K:H:I^j e          ? 9eF      D 4PVԷo_EFFۧ]vv)_,`xŊ֭{1tM?/'hӦ&Ogmg9s=Wj6=ϔ!Z_v{itwCˀ"           @d(e     -0`ZJ_~esZjh?4~@v/iȐ!Zp8Uj:{쥕ك@<a_>Z|,K];O/ϖ!J/AY#hsg           @( g9#     @@ TVM{OϟգG͛7/j'OV&MkРA.drڴi*Q ^2 ԭ[W˖-S+k՜9sK 6T5iҤE@@@@@@@@@@H@H$Xi b      qT:7뭷rqիW0eʔIQ˧2eʨrnݼysկ_?{6RG`˖-Z@*ZhtN/A-Э[7YF/y0 DD\ddTX,Oz{/ƌʗ1@@@@@@@@@@@ 2e\i@@@@@H#<ٳgĉ:tΟ?Bz! 6,Q;wN9s(2f2d-Z Ș8yԩٳ߯}zaP5kT]jJ;w$<4NeOs .1G48p@^4}RRi:$:G@@@@@@@@@@HET싮@@@@@@͙3G[lqiWXQqΔ)Vw3o'2^;Ժug5`U\Y_uwLA+p7+G"2z@` ̘!U&^}!u@B  1@@@@@@@@@@@ Lycz@@@@@@Xt5j;C7oVdd%uׯ_>v4lP3gL!J d˖M/6lؠ뮻NڵS&Mlٲ4<^7oI&Q,\(=3R)"@2!k :%=Բt- @            @ ')#     @`L:Uu/?}]|;k׮Z%SLjӦj֬LbŊ?עEdAv}tR߶oߞ6׀9s_XX\۶ҭJ@z\@ pBUPA}ё#Gd #Zl3fH <)j%,x!<.OAmF^}U^{e4 VO @@@@@@@@@@@BQ&g9#     @[FR!CXǕ)S&%%RJʚ5%mfΜYsTrw,vi4hFҥKSN@M ϟ_͚5ĉSo:L~iNi)w^@ KH/(/[:wN3髯;n^~Y=[*^]YdQƌ/D] UvIs^BK/t~vwC7oVݽ UlY 6LgϞ A3Th߾fΜ'NJt*7u0kIݾ [w U{ohԧ갅           '}=     @O?)W\ʔ)EUV]]w,HWlWr|X@ܹ]K={TJ4fEDD,fr mV:eʔl@`xiƍ`@ xIi.DFJOKŊIKJ5k[           A\      @ԫWO .|Iڵk4:uxD$Y``]o6nܨFK.VKEZ%d tM8qb9&dSOIݺŒ#+=zgBy/[N>؃           A\      @ /_^K0[gʔ)jd<ߍڵkX{ݼTRJ%KԈ#d!پ}{ժUK'O1D y5k?wKmHMHC\عBhk qX>s>Қ5q@@@@@@@@@@@ 24;F@@@@@(R.\ (cƌQ#]n]Զ*UR֬Y] ^RQ~=zA"PB?^V5\m@M$3`#K <Lr9pl:%n-#7-b elw +Vՙ3;@@@@@@@@@@@P 28E@@@@@%jժ.ڵk=v;z\W_}uVk-_\ŋםwީ:u/ɣ+tM7iĉInC͛SycLb:̙3+K,ʚ5kڶe˦ٳ+GnΙ3ry GvK=@54i$/pj^z%iF_T֭9?ivfR˂^?ܹs\GbOU_}%}TluC@xx<{Vlk{:,ƵK&/i1c߶ϯ t .={OZveR@@@@@@@@@@@H  #/s_ʄ "     A `pAFVȑ#ſرc.Ȃ+ S/Z"YxR]8cl1\m8*UgpJ#/rmA'O͛%dLWxHoJd@IDAT+҅2Y$%yVZ!UZ zAڵsas .b;uVà$ |dc%C hǎ.Bmٽ{{W%bF h>C-w%H{_mV?f>,2b%J\;xTj֭މI޻ՅokזZn]mr}j@@@@@@@@@@@b 26!     @H :uJvr˞={o>ݻ7jٿT$F/hpC ; FD\r]XQB ciӦ;;[lqc+P@u`J1"}!Kz ŒmuL33z(SBtUWE-TH]}n( '@{N;vtZB@hѢ,(mɁ:DRFHKv!@ްa[~w?\CFjŋw=}am-:%p?~DX}>{ ,U7Zj޼^cۯnU;`J΀@@@@@@@@@@@қA2@@@@@U ""B;wԶmb!?go?R+hDhu#lSƌ}C:z [ &_/[[dH ۴PbŊdɒ.ɂl۟R~L3X+cǺgyF]vUl7xȑ#ck-\^ΰ֕*VfΔcf!pYYxUrJYFׯd[]eʔQ \lN鴖;v8gN-[vΞp ]YrUVյ^떚5k´#          A}~     $B6oެ7?Ж-[ܾ[z=g]kXH@ -@EFm;s̉蝪)-`onN۶O j4YHLZɒ% ,]-[V/_^/ϯ6 $ Ю^zGU\RT~ X~駺RLNӧo@,-Z$yLw-.Ғ%K\3g\@pʕUzuYС?bP nfmldZhիe&nAuaÆQFȿw|@@@@@@@@@@@LH@@@@@@ N8uֹwl `rʹ  h`p'2t9YH/ֶڴi:z0RJRJ+ڶC-5aÆЯݻ QKe˖k{ʔ)5euN.-^,/6r Xx9s4w\͛7O{uEVX^=թS-l})q©-[Ke#?zrB!6m*[, 2'Km@@@@@@@@@@@ )3B@@@@@ ] l۶M˗/תUzjl޼Yʒ% {"[*T>[dӕI#G@H , >+C .0zkUZTd@b![Μ9GyDzRbx -g}G}TS޼yv ԯ4st-40nN<λfoە3gN]jҤnխ[WٳgOi51{_ M ܹs n֬n6q*QDZ ~@@@@@@@@@@@H 4[@@@@@T-Zŋkҥ.,L2.ZjZl]lYe̘҆؃@"Ο??Ck֬o< @:u~jР .^ >\Cu}O>XbpL GyQw]~ܹsK'Mޒwq28|}]ر=znXLA8 `N[ܜ8qB5jP6mԾ}{nb            2`TG@@@@@ԺuO?iZpnB-pŠjժkVyIiD;vLVr˗/ג%KpRJSFԸqcU\]h>?qFnZ< 聇w}N>=%o^6* xcD/piM       6m?yСCʗ/ ӻT~}Ic :  @ŋv!GUԤI|n)We8FDD`A9[e>}ԢEt|87cǪK.0+dؿ_WO̙iB@k׮|1cĉG `ܹs#$_4~x}:r;?,3,,,Hf0@@@@@@@@@@@ %      @N:QӧO׌3m۶f͚м*U&$] HevBNK,-ɮٳʐ<BΜ9SUVU޽աC/ԎT$&'OT…(i/.5m*'/LUs0_=v/2d̙ *GQΝU``ٳ6m>#}*^z쩇~Xr q           yd     c4uT}.Ƃl6l͛F?b )!`\+WԬYܲ`xm]v;'O:\f 7n*=S.,wܩ6:[SNھ}ϟw%I5]o-*UJn( 3믿_o;=)S`֭zw'wD<[ @@@@@@@@@@_ H     qk=z[g˖M~ڴi-Z}]f7~ X834i$͜9SOV˖-չsgΒ%_b;v7G}3S=Th@nȌ8e,Y2d2Dzi4y@!c &yW^Zj:v^+V )0{OCUDD^|E_raӗ,"          AiO     M6iذa9r :`K93g4k,7NSNv(+W.0Ǩ=>@o>N:?*WTIngϪH"<<)`Ꮽ[K./σ@,{UϞ=5amV*TKMv'4K}7TX1 >\73G@@@@@@@@@@@ ] 0@@@@@H9sy.k& )?~zZ@i Ț5o~3۱ߐzo~[X˧{N[n{ァ jժjٲΝS 1gΜYw}Ǝ]+u(/`>0/B*Uի??ܦe " 'OZj>}Ν{~K\1ׯ/ M. \|y M           @ 2@@@@@@W\Q>}t+mڴھ}F9rz' @lnfsAʕ+)ShΝWz衜9s{:|p0N ߜ8q^Ɨ;v֯N2*裏СC.HBiD$%K-ZHիWW5?G @@@@@@@@@@@X 蚧ƍדq@@@@@@ wޭ1cE 6hOwޮ<^:uҧ~vkn}͘1<|?~7mT-C%,PPBZ`Um#G~gV5`[k]4lذ[y ūS!+H~+խ7eQH Xo͚5ݳײe˔={>_k֬Y\ttzyzb ,X0@(@@@@@@@@@@!     DU`ǎP$I-[$HP]7n_{jwkNŋ5g8q¯ʻ0=zT 7 n7L867eȐA=zо}4bZJŊSZ?~ +Wƍw[uZr n(`6:H :tnݪL2O>-K: @=y ]xm%v7O@So_B c8!;kkG lgϞԆ ֲ; b&((HcǎuM4ѥKp@@@@@@@@@@@ < a      Pȑ#VJ.PȠ+uzΝ]d.d˖Mm۶UB⺔U=裺RJyo FL(͂l.ڜis4>ɓM6_… n|v'M+WćalL>=Rak*$_y[aytϟw\ ի^z%y睮ߦM__|7xNn8|ٶMSV?(R`Ν Ѿ>kP رcB>}nW7t_bƂ>j!}Q @@@@@@@@@@@+@dt@@@@@x**{.@&YdtrbYv@ o[x]v%$J}dsh|jAAA]]VfshOOÍ4$^tI3f̸cGkd)pf͚9p[#խ+)".A Xd…]@nBxd Xm i_>WĦΑ#tŋ1y(F@@@@@@@@@@Aфc7@@@@@YtR;Vɓ'!^rEx YԬYSt}jٲjժ=zɓ7<}t=3n /yݰ>:_mۦ^zy׺udDqFuAUVo8_={N:sް>_/_^{M< г^ǓT6b{:pvzi„ .\izw\]W` 4h =SxݻwWpp mۦMwn1/ϟכojժ8uTz[D8qaÆnÆ Sպuk9rۍ{9S}9ishDGnJ.J|'ݹϙ3z}̔)q7.R#\yEɮvO?6y)7ׯk>}CQFڼyǮ 8͟?F4o5{nQq&OЦ<͘:w 2e:v쨘 *8P69Ğjmf WyR̖/_B"׮]ۗ_][nuvL/t YgmiҤq6~6`Y8>}zXڴis+4hPA K H駟B9 0>w;g駟%J@'`ds5\~? kڵnu2dH}B,HX[nYo^>Gf·yeT$iܖW&ۭ,9asСC1cFY lǎod >سѵk=nOj]zm, _^g"23Edan .;ϟ_!          @+@@@@@@/-[6ł,رL2ҥ,'ٳ'OegB%KYnK[Ϭ$ђ%KtEhsw Xi˖-˂M 5j0S@Λ; .^ k.5~9ZUoK WA z̳'| -6]thѢY<޽ q2_\g"c"E):3wl#          $\D w@@@@@n(VV\y8nA'NZە6mZ]6k׮]zvM4qqSUfM?>p};vpիWh6lp: l@'NlٲTV lp˗/m!s)_jG&o_zc;vLyao?n/1u;D|9js56 .C֭/_>yԩ[j%-\޼yBoΝۅ,v|dv[5j$=ɲ! [hoO: }=*=XtL5{f7?eׯQy֘{¼c8           u n     [-Zhܹڶm_;pAdysۻw[t;V_gϮ{»<]qЬ^kk֬ϝ;?_o`ڴi.Բm۶=z *tMo{w) e:x©w߭X^.]r׭[/id sԵOܴ9js5%Kj„ ڳg7n~[9sT׮]uСﮋZ "3-PJ*_,׮zk5E:Ad" ss1)-xbŊ1=}"          ܦA      'uG}*|[D WF=tڵВ/__}t5iD7otR?և+uԚ:u BК7o?û(+$$č6>{z; "'Yd6駟nvڵJ2[5YQ ʑ#2dȠkٲeav/tp>sZesQ Xu.2o޼jٲn u2e,6\}'NI&)K,ҥ,YVW.[xۦvanks)_0B%sݕ'X[yl*(|l˗}qB;Cppѣ[0O> 'TbEY`]ٲeCC$I&={Դiԭ[7}՚9sk0변E ڵ/PBdvu7kgDפvїW_@\yFCd1ݼ?[ER\9=s?j rE !          @b_4㫲N_OGA@@@@@H: N0`f͚:u;2\YիWl2WGR{ʕ5g@6{lYرc]k!&L͟? 8PrXF~[jsN>}څ[.(N8e˖E{YYTK/vR̙չsg,Y VZ߿&Ml# `[hCgAldv kVrhaOf5Z͍-W\IvnX[~֭k>{"WTy, jΝ;wTHP'NX%KtYx;vPX />ٵ|ƍZbn<[eۧK..Pծvݰ9h D:X@{L&MrQ ~)SL6mʰ`:ko^zn;G4o_>LC{<>.C cƌ.X 9fǷzm^w|衇믿jʕ.KvɓZj/, ˶{]6{Vevo{N`G͛7O{vTa=WX8=E:^Djժ>ܞwiϣv}" @@@@@@@@@@@yj=y @@@@@\{ݻ]?w#aYP|nwpRH%K#J9s [@D 9N| 2et}BBB\b/^܅ yw&JyKtA͛WΝs;vo&8G=VDYj6mT@M<م}F-`e5sLFj-ZPq<_bfEf._}d?[nKNzw;͗s>:hs-a-tgXȫ>Z&s\LD:"z3LD}De=7o]s-`Qٝm@@@@@@@@@@@bQ XP     .vo=Dt?_W c;'$]bE_@@@@@@@@@@@|(!&]!     ,xO>jҤ:u꤂ M6z7#GnڵUPpkO2e}Buaeʔp !5:۷ƌ M6E{q>{F~[} Bׯڷo/ 0˚5kI8Zn,ͮ׮]ӏ?b8}ʛ7oL>-D/C 7,ӧzIU?'m>֭[W˗W_}{,wvG8 Սcǎ::f?>9rD5yB 잾@@@@@@@@@@@b@ zƍӔ)~@@@@@@.\=zhÆ .҂J*O%R )~z}ᇚ!o ! B~W-]رcʝ;qծ]SL8-sl{wﮦM*I$;]v2sLPϝ*V.\VVMPvXAxb,XPڵSft]wJ $,Hѣ]tΜ9չsg=sJ:u@@@@@@@@@@@bM X@      sN-\нayӧW C|*['+-XSfZJ/_'NVVM{v }m۶_~4irʥnݺEJ,Y;=W,-7!6O4'UZZʗ/!*0@0#Gjĉ:sjԨg}VuQ4i}x W犯Z'OݹС N8q`           @B 2!eƈ      \oo駟?kŊڷoTP!Yti,YR%J aB(ڸq6lؠuֹH o.C .h̙7n7@hWڵ9s8C%pE-YD}f̘ÇXb.ȳYfʖ-[X @@@@@@@@@@@ N"C@@@@@@ ZrVZkj:v ˟?/q- (BG h׮]ڲen7o,1cƌ*Uʔ)pqW1Gj=z2d!۵k)SKqΝ[͛7W~6yB0#矏oc< ]qh"]tɅlW^]X$I:SΝ? uzޠA5nX 8(           @  @@@@@(~[N6mk޽pdɒ{q9SP!ݖO>Gb p Ymۦݽ컅d)o޼.tԂG~.]%}Çk5jҥK^{M:t@7|}w]BqRNT@tΞ=̙yIܖ@IDAT?PTCG̅]HdF ~M˗/ҥKSNUFSrW%r\@@@@@@@@@@@8 29,     D_̙3.Tǂu,o>3fB!-/{J$I `Or:B-0tϞ=ݻ]c\'Vl7 4Ydʝ;whhO۽ߪ9I8p L6u+E~9 ./ QQۄ'Mujj)CuL7&/_\+WԚ5ki&]xQɓ'$/^\EUµz@=oX,6oެGAAA Y P,d$          ĀA1J      W^e϶܂-,''!,K,C3gάL2鮻 }Ϙ1ҧO/ E^O8cǎ鯿n!zzڎ9nJ׮] =@ԩ]cΜ9]>z=ɣ9r(QDr5rHwMy7Զm[YP? saf_[VI Q2.nOn7nԖ-[\ءZ.`ݓ(ugF{vqoӧӤI1-(Lo{)_ GD{w႙-,ׇg{mI硘n>w{VGoDm mLRp7o^XPlٲy7@@@@@@@@@@@( %.6F@@@@@'`d/ >N8fgaD7 jy}8sdɔ8qb>{^y|ҥАGoأ[dd( v +2eǎ3eEO4~xgڰaCo^+Wll@ ]jyܹR:K]ħ1bG²x&ψ#Լys >\iҤ =ٳge E{!Dۂ-L2}vמy&Mr-0=\r%̗=>zfǰgo8[t\-!           k }-J      @hIp"{%{YH7|-eG r +ʱȰB#ZfaKBi/ ~)S6y?[h*UX3ɓ'Pȕ+W{u-ZLG={O>8q-}vqZ]gϮ^z8-Ƈ߾]*_^__KvLW$ 6gÇ5j(5i$# moPݮA tuV޼ w>2bG@@@@@@@@@@@)@d4 @@@@@@6m!-\B3z) YbE+oѣ[=ׯ{+Ν;k֬Yڵk :|uiKl뫞/`Ճ RϞ=UB7N9sISHy)           @E{OvD@@@@@@~1B>|o߮J*H"2d[* ?3rJ%MTZڠAm۶-N|o>͞=;N˃HMHcL/m+ \'O:8Y6lؠ>LgVԧO9s&2d_~Y .֭[}_\t2f4d4vTt\T1<δjJ5Rƍ~z=                  iҤQ]իU|yuMٲeS֭eh@DԲeKرC={t9zh]z5KQ .?0ƏcGGI8}"V\%Jڙ3gjԨQ;@           ~"@@@@@@@=e>Sppuֹ`H 1bN<{p$n!2eJV{nOaOaG*UJ/Y_~Y'NѣG}i,RÆRZ;A9 ,~[+V=ܣ͛7^z<"JG@@@@@@@@@@@ 0 D      1 6mZi&XB%KklٲUVnY .@ƌ5dmٲEٳgWժU=a e1՚5kԩSkȑ1u{Tt҄ 'ϒݻW*UR~4x`ʒ%K8{ @@@@@@@@@@@|%@$@@@@@@ x;V8p6nܨ *Xb:t?(TfϞsj۶m*RvSN|p)S?#Fŋ>^&l)8 ͜)O@/ǫD:}֬YN:ySIO_g           A|v @@@@@@ ҥK;jÆ Zz, Gʖ-5k9k\/PF m޼Y֘1cT`A7N, ч^Љ'4qD3]4c4m7o^6~ihB[v!ECc            Au(@@@@@@ 6ʖ-ѣG+88XC J*ptر,c!*$Iڹsx jJ?6n~Ț5 }2y]@4tTk ,]TŋO?svɯ߄            KA4A@@@@@\4iҨ]vZv֯_ zKٳgWӦMxb \y*H C 1bmڶKVNtԩvW_}U[n՜9s"}loeԼԾԡCl!/_VUjUw8իW@@@@@@@@@@@x*@d<= @@@@@@ fJ,#G*88ٳDžk,XP ѣGc@8\lƌJ _[UxqլY#GmRz~) {Hjذa5jf̘3@@@@@@@@@@@x)@d< @@@@@@ RJ֭[kʕڼyjԨ~)Gjܸ,Xk׮t@@PPZl) ~]6m~Vz;k׮ZtV^};t+WFiRҤ>~J*%6_^=\@@@@@@@@@@@@ >"c@@@@@@SbŊiذa g}ޫW pÇi}/^k׮Ј(՟%K Z9EƍoYK/~mgfͤΝcH [N%KԴik̘1J:N            Aa@@@@@@xe_СC{nUZUsCGT5jԐ@̙SOSt /裏>ҹsv:%կ/,(O#W^͛7' Q9           8 !       iҤs=+Wj˖-S>Ν}>}._#DȒ%,X.]Cjժ.\v\&=t4c<ҥKW^.fs0T           7y_@@@@@@E꣏>Rpp&M 5j9r~A~+8qb;5k'q*VPoL/j:{ nK'Tٲno@` |׺{nUR]ۃs0T            _$,@@@@@@@ 0%Kƍk޼yڻw^x}7TB3FgΜ P Ԯ][k׮ULXt >{Oco'E 0N:͛gQ̙.]:mݺU!!!аaԬY3 *U*=z}~]:g'@@@@@@@@@@@AѦcG@@@@@@G W\ݻ٣ (w.2K,jݺ~)JF@Zrʕ+*UhҤIg̘Q:u}8RRR۶ F%Jpᾏ<Ν; >>Z6,Yr9;!           @6;"      AAAV+Yx￯ 6Vտ*"H:fΜ_|Q>{R_}U]tIÆ ]'NH ' 7|SXHmٲŅf˖MN5*Z̞=?[,C@@@@@@@@@@@ ;KzB@@@@@@NgAׯW5`̙SuՌ3tebS QD4hF޽{C Q Թsg*UiSyi4)ihuNݻ]P=!C+sʛ7fͪgϺo߾(k~X-uam2@@@@@@@@@@@A'@@@@@@Vdɒ6l5qD]tIO=gϮW^yE[n),oї_~&Mߑ~,?V\I-Z$OwG vB Ǝ%JŋZn:v: iL>3(E=zt'Nh„ jذ8ۺuk9r$t;'G߯޺3           ^ Hߛ#      ~+wMӦM/駟lk֏]j k{!           %=!      4VJ?^46dݻWիW[wȱQt -[nܸwY Fww ȡtwK_DTBҥtJ(Lm_c 6^89<9U۶mկ_?1BO~7nHK KÇ?9 pz???W5kTk.ըQ#uqڴie˪dɒ9rdhĉ  =W8v޽z/            xA:="@@@@@@bM E޽6lؠUV3fϯjժiĉyfĎ%Pxq-[L6m3f";w.]f͒<<ۜ8y+WΆ8;6w?KiҤyLdLB>gG =77Oq           (@JB@@@@@@ *CԩSZpҥKgC"M0Y׮]vZG(bYTRZxV\9rh:t#ki\i4)[G6qB`Ĉ*]&L;vIA`d۶m,Y2ϑf            Zu!      c_K4uT7n8͛W:uRlcTxUiZt Me5L[///%NX- I#G{_1G߿.PfΜ (M44k֬՚5{I}&UeN g.^.]g< zg… a&҄AO>$XBVZ wbrz~r@@@@@@@@@@@\:C@@@@@@H6hڱcׯ^rR͚55eݺuˡjvblHIk.<@޽~oȑCNPɓG)R۷oGvH[~'jZ~}xjJһqJ`*V+<8x'4 ϟWƌC}u]z5ɓ'w Y N8 &!iQ2d'Rҝ;w[4xW[oٺ{:ɳlFJH!l@0믿v^|EܹS*Uz5G>+Qʕ+A`WsdM6ɄD9r6o۶ 4E//ݎ;hӾmԃ           yȏIK@@@@@@G $PÆ 5o< 9x`mٲņϟ_||||ȣ]1a)R-ZT5jԈaԩmH ꫯTT)޽;8q''5kӥॱ!Lc2e4uT믚ZYBxϧy?e'Nh:|s̙3 VZ"6           -Q      8 6lΜ9y)UT޽LЖ Zr r>muMƍ K$ 3C ^={T֭ [j8&죏>҇~ĉp'O?Ut;v2dȠVZEL2iѺyD̻_oMNH[ $jqʖ-k߳hB)RD֭e4lP ;wlCﯯF6d׼gMxo.]B/?~\*T!fls?LУyXB+WW_Lk 6 >6AzG!f|% ~|6fW^yņ]Ν;WԾ}%ETm?@@@@@@@@@@@^ HE      s $Hp͙3GgϞ_|{ʄpʕKÇ{_ɓ'fGժUK+V0cm7m$///yxx(}8qJ*6~7pڶm oܸq%JYOm/GU޽ծ];p4TfB&T3gj„ "R nA}vN..F#Bϊ+SNi6 FiBU98h#XhQUTɾ\bk~~~*W'Oqͼ;MfCMfHiӧOۧGۮ vM4_vyv1o6̈́Zpc2elxŋ9hBMcx}a~Snnn]oͺQ}@@@@@@@@@@@px[T D@@@@@@H6^um޼نgjJƍSlרQduˑ#r-ֳgOЯ_t-Z= a„aN%M9jf6c֢E @4{27oܹˇi]vm{lkۺ[2Fא@ ܸqC]vUӦMnYM_to&ʦK.Ж- 9sfwnVrew 6!![;38x!_ի2f;wfϞmﭹzR޼y,Y2̒%k~M olnNpGhB}C6ɓm@rʔ)CyG*Y,X`|"U_|A@@@@@@@@@@pX P      q[p:t|||tR̙So2eʤ͛k…68˙L 4k0Zʕ+u0ae5ĉ?6駟lX}?nٲ:u'NaÆ2aoߎT}w@@@@@@@@@@@7{FB@@@@@@8,`jժ_~Eϟ׈#kdɢ7|ӆ&:A@@ʗ/;wM6v:v+V)„ Sf$!a >ؿ=e'#O6]vm.Yf3f s>*TP~ԧO=z40'|J*ɄڵK5zuw'O)%Xd $I$poݺ%gϞ6T҄!CCڷo+%LPeʔp9m4u@]E81@@@@@@@@@@@bD af@@@@@@@)ԥKy{{K"E@-娛fȐASNرcy)f͚4h;֭[=frȡE>k0ʕ+gW^-[qŊÜ>H&=Z@IN8jժ /Ҿ2g4XĉUD {݄@w U7o^%KL3gCwy{ԗڵk+gΜolpdƍգGۼo߾2A^{5ܲeK>jִj*N:=nn#          <{ 13       SڰaV6\)N8Q7nxmӧ.3/l'T4!mfz_|˙PFsڵk+Vل]pyxxٳܹs5?B9gΜk&p3]tzwCEח hںu ]2T/^\W\͛[o AYfeɒ%&ʌ9Uhu[ɓ'u6,ќ4& ׄ7NөSlOs0l>ԄI 5+WVܹ /׎aޣm޽_~2&S&?=7Y4idB|&hq=86           '@*B@@@@@@ʗ/#FȄΚ5i3m۶6Lфf9fXx uIo6l]ۖعsgZJ%JcƌQ5w\5kLvLxbv-Lgի~'o>4F-[_mׯ_ZjY&DUVj׮M6ڴiV^6>y 6A.Y$e]g<[6!Ey"Єfʔ)&^K$ ̞={ɬYu UPA{ տehF޽{mÇ;ȑ#ݼ~{μ;Ԅ?w͛7wޑy x&8wҥJ*c:cք8^~]Ŋ!k2M4!"QB@IDATy 7o^%O>>1*eBM`Wĉ%1SH D9Ҍ6mZUZ5B ͜FRlԴiS36A޽{߿U%Jhݱie}}})SW^ |M?*Tnio&M,=}._ʕ+]vj֬RNdE+4rH~fϟך5kl XJ|'Q~}o {E 4枌3&i38|ڶm{oQ=,… 6Fgh4f ~U}m6ݻW۷̙3UD )RD~?8+WֺutYUXQǎ{CQƬ~:yd|X2k%wwުUT]vjժTͣ5A2ezt                   .\?FXzu}wʓ' q*TH6lPUBm޼Lj/mg Tn]]r%,uƠ }-[ƌ &hڴiJ*U V.\@dh           S 锷@@@@@@@ *V(xY-^Xy￯,YN:|ʔ)dɒiΝС3-z=2f=1            8Ay[( @@@@@@bK=4… 62A֭2dȠ͛kΜ9scK4s ,P6mԸqc9}klٲ?U~}ݾ};Rh0uU޽mի;wh c6Al            w!      @$IVZ0G6|p]|نAf̘Q:uҥKșLѣGW^6.(( hٲeڵk6m*??ڣ pB+VLҚ5k4h EaĘJdY3           %oh2f̈0/       Ν;b__ӫYfjݺ<==n&MRnln~r˖-R͚5u飑#Gڠ^ɓ'w"]CtԠAթS'}alTB6Z3Wߥ4o-1           "@d3)      Ǐ@H ge͚U-/z-[TrZմiS.]ZsUʔ)j iڵU6lɓ'0H~ضmڶm .hԨQ6pq}{0aBEظqc͙3>NA>kaG@@@@@@@@@@ ט9@@@@@@@*;wn}ڽ{ ҥ-Z\ׯL@]VfMYFRJtԩK|' h6Xᆱ|E:t}2gά]v9eYQ dc cswu!           A:z@@@@@@p "Eh:xo߮-[j̙*] (ڰbŊiƍrqqu;wtU8N)^^^ߵ|r5jHov!L 4H~d˖!j@@@@@@@@@@@@QA>J       @J(/Bǎ_k„ *Z{9=Z? *ʕ+kٲeQ-vԟi ֭7nŲ'1c/`վ}Օ i           "߀v&E@@@@@@$PlY}ڵkUV-;V+Vԙ3g3gNÉ''HL2־}/ʕ+Kø'puuI-[TVm6,Y2-!           @ 2Z      &J*iذa:u ]._,p={8Z^OѢEzj>}ZUT^ĸ TD -^X .Ԉ#8q @@@@@@@@@@@@="      O)p( 7\vիg?Ms=hǎO9CV`A[NPvɊG}ʕ+̽7             A:]f@@@@@@S! .TH(dڵ5yd,YRS~y8YL9lX1ԟ4lj;f aÆiʘ1R@@@@@@@@@@@@A@@@@@@UPoV'O_&Mh֬Y*[r̩޽{k ZckTR/:uتyĉUD ݺuK[l믿l'dt@@@@@@@@@@@@ d@@@@@@@V?ѣGm6kN/VJ-[6rJ<NCSN:tА!Cr?-[szWl j"EoY@@@@@@@@@@@@\誹EG1#Fd@@@@@@@٣ٳg}J64hMf͚J0ax乑#G7Pƍ5a%I$N3,[۷W``&Nhe3@ڵaKnnλKKY@@@@@@@@@@@pdWG.@@@@@@@xj׮]hj߾}_ҧO֭[k̙qFġ={Բe˴rJUXQ'OC?Kw'///-[M)[hD YԄAD B ﯄#          )@s7F@@@@@@Bg 7nܨSN>Ӆ l lذ&NK.k_U͛7+(8%L2ZjU\[Sڵk/_^?~g͞=[iӦ@Kt /_:t W@@@@@@@@@@@p4 P       Y_׊+ty=z(cƌQ{Da+W._^&f͚1bD޻w/\)S0R6rH.]Znnnھ}v^3C %ּyDW           :c`ˆ7c;wn}G6k|GQgK͚SRJX@@@@@@@@@@@C HOT      ĸ3g` -Wre ٰaC̙3kʄf-mڴ͛7_UV½ ܸqCEq…W^8wHiJnY ž@@@@@@@@@@@g 5"      ,p5-YĆBϫWx!l dB!K*%X2/]ʕ+ zq$I{nɓk@N4uTNRL(cƌ$ t g,H#           _""      Ķ@)Բe _]0aʔ)ٳW^6,ݻQ*/1Jw~WtG秦M޽{Q*5k&NHc7Ծ}xŸ\]@&H!OH@@@@@@@@@@@G Qu       N" 8^? m۶͆,nڴIuUtlItҥ'^UN]p>ԩS5w {n>}Z]tKwiٲe7nN ԩm`Z۴1@@@@@@@@@@@pp-jlߑf̈@@@@@@@L… `XBX4h`]Nf4{lIF&vڏQ3gΨpº~"ȗ,Yy#)]3ժU tww%KaÆ64tґkfxC UpP           A:m@@@@@@@ ݆B.^X.]Rm wRJ[nـ@0[oiСi:/_?C-ҩSfC!ְo>eʔℿ]۷|&LxfMf7!4&L$I(q|7確}ׯ_ ϔ)SǗ_~نkM6? ܹsG._7n淴kWYeիwDzo:uvO"Ebi           qA ȸpY       &pÆ 6r…:p [S 4&rŊ fsi֬Y*X`kOspq iB*-[fBB C3*Uň6hB.}}}~&.&΄]?1bk33!zC{nҤI 2̙3\ 4!&XbjԨ |8Z;Ƭ cYC>O>ۆ? Go.-͏lf_5,Y(Gʞ=|)O<60p@@@@@@@@@@@g(@3eh@@@@@@@9"i5kF60߻w/LGf!u-̵-[`ŋk6wU d~ܹ0ŋeM U /H(ɓ'W$Iާ 4Ynj5k o7!!MdHA!̧ ?fׯ_hff=3gasM ˖-ݓ%Kv?㨀m۶>[{վ}n~?fK0fh~&T4$`|=Ey̧'ONgw0ٌeiVܞ:u*tzjh  P…^dI-[V3f           R g       0AK.͛7#Ӹqc7*F0M <|?n?w%0uؠ:lh3e>}zݿIEbzlbB'M6lؠgʬ?>LPfBB6+WF͛WL h_n!Lv5e ]xQOɓ'uĉرc6T 榜9sPBv ,RH~>;w?C˖-Ӟ={dB<˔)c˖-+Og._͛7kӦM2a7nԥKll͚5K/VZ6YD           +@*C@@@@@@7|~vuu 8p dCM'___m۶vݻm?hЄN˗φȑ^4v[G& Ԅt6L-[6-ZTŊSɒ%?~D{= ݻwtR͜9S ,=1!fZ&M~g'<۷k6rݺu26iӦB:}d@@@@@@@@@@@Qt;A       @<\Lؚ x|̈́.\XӧmL2ٰ^f7!=%J$C6LǵgϞ}ǎ2aZ=.WBv[`^M6iȑ5kn޼+Yf2A֭[ZdudMeդIyxxD/}wyGo}V:|Y5k  lk5ĉ;|           sAƜ53!      klI~zeΜY͚5SƍUrec38xϟ3fٳm۶ҥuϟ?=zhjٲKӰa'(}3fW=3                   #m6 >-Z]v6yBqFرc6tĉ:|V^ziӦq6tѢEԩRLc5Ǚ` 9w^u͝;W}է~gWFO9           C hP       7~7UREK֡C4j(?^G!t@ƍ쌫ȓ'o֭S9ԱcGΝ[_}nܸzd̓VU^=ܹGJEυ̙3k?~~⋺|r (           N+@: G@@@@@@_`ѢE*U7nlo.׮];%N@JbŊ4iN>=zrʥ?\ovjuYC ȑ#m0aҤIzMT 믿t ߙ3O           ,@d42       {nyyyaÆ*]9)SD ҥӀtI 8PÆ So@uA3f̐ g޽{88y(Q"UZUNzS2>           7@@@@@@@gz&ф۷OGVΜ9q9'N7|SGUΝխ[7K:qSɼ;={~7[SNJ͐!V\ɓN:zj[!A@@@@@@@@@@AQ        c?J*ӧkѢE*PcGH,={Ν;*Y̙eMoV'NT՝^dԩtR]|Y]ve}            @@@@@@@L`ƍ*[RJݻwqO6ըQT^=}WO;jO>#Gڹ? ޽?XM4Qպuk[.ңܸqC'OV˖-eU#ϗ/էO5o\}#.\^z?l.i֬YzzjmVر6oBYd ;wL3            c @@@@@@@0!5kִK,Q y͗/_ʕ+h"ݼyw/^f/=Qsш#vZى]&&iӕ+WYEcE&WWW 0 }ZS˖-5j(H ԫ#s=8IRԡC{xZ~};nݪѣGGz,Y[n*TP}O}Gً&8d gHm7a}&Nra>ͳi㏕$I+6 1}'aQj*jԨ}㏶M׮]㧟~8ׯ&M?u___}wڱc'O;vv,iL%JbŊoZƍ5e8p@&ьײe5o&*_jժ92cy&M#ۼys=چa'."          8AN}(@@@@@@=SB *SL< W>}Tb-[ @GSfW_ٳ}v%NX[a{Ç횮_nLfΜYf/K?2yufM]tI&n͏ tuuUӦMzjؤIi0A&Ҵ "ì7-k ڶm+///-YD5A&:(G6\ܻq{Իwo5nXSl 4v枘|Aukcwww!Cᅲ[LLݣG=Ǐ_T߾}Un]=g1W\ԩL hBgƄw/spB[9rwĈjժ}Vg̘+VWЎ5kwի>Аt            )\#      x uSN]lYmڴȽ{Ⴆu=zn@@ܹsZx $̘1ʔ)cyZf>Cʕˆu-xb1n]I~עEx$ń<͜9s*SL2qjղVTɞbj7k%#1sL+vpKir}z B 棂Un]τEFGG|&jv&0G6@Uzu>%~kkwܙ_1#Gty/^cѯ_?{LФ3fW_}>_FO:%k.͘1ײ\r2:uŊӠAl 4rkkKC Q@@^$Aʖ-mi B           J_^(@@@@@@@N>mSV"gb>v;fP-[Ǚ3gTD EDD(K,6:c>*TDUV~cٶ>jժpGbpM㶿EڐG~ 8Pƍ0m7oʕ+kŊ67绗k>& ,J 4=~ʔ)7f1Ϙyhv_/9sf.\8 ρ Y5ըQ#иqc-]T'O#ܹtOg= 55jޝd[s-c@@@@@@@@@@@T#!TB!       ^%P~}jΚ5N:%x{nEEE]v3g.\]`BwۋA@IDAT/ڏk֬х ܻ^o+NH7SGb瘘g5~z=ޘ۸KƉ'q޽k>zmilݩ%2wʛ7l){,VgСCWގ&K  (oR1qǎCO,Y2b@@@@@@@@@@@!@dT      x@=Kﯘ:7K\hԩtwhcPA@6,qݑӟ s_$. 6LO?tu#Ԯ][ϿSնDʞ=&Lkƞcs.]o߾}PzutҥNYz^fxLc2e/u%==\'UV͓           @* 2_JC@@@@@@R@"E/o߾ڳgO~;{k8psoM[94i$5jH_}|I=`6m?ŋ5emܸ4֭/^l<phBܮ7i|{ή]Fꫯjĉ{+WO?dgL#e>~ypD֭[kܹr#p֩SGo񆽎&x288Xwu5O6l(s}M8{3g &tl˱cǮ8矷ytٮ&B +N&Lqʖ--           "A*vWOmzGA@@@@@@Hs͛CٳgOr-[>}6Gzg{Ⱥuʬg5sLR`ŋk͚5ҥKUV-5oɄ ?v9hMdʕfUVUҥ:Nrl ?45/ʚ5#X&dV Vׯg4j֬bŊ]dg$;u$h+VXVZ]w-z{aر z< 5(O<6psݺu6pv Z_ZsJ*!Cjvf&\WرcGqkիLXn6Q,Y^3gDF7a>2lҤ d=~i=zT&pф֫WOYds`;ܾ{ڱcƏoCY >}F_~e=a3&PpolaذaCyf;ț7o"_}w@@@@@@@@@@@]'Y<5v\=9ς       N"""԰aC:uʆԶ߹s 4Ꮧb˾9pE8p@:{:]7NܶIfHU fTTT 42dwicLإKdV|7[LDŽL&ru]? ]vr }C|zlЩ ?O™#Gto@7mڤEg#N̳`B]3f(D˂           ~L?ך"      I&`9]Æ S۶ml[oS^sJ&rѢEl>&M\w^:tn;oncuцΜ9S*UJ1իW-[&T[-PB{w4p@*[lBM؇           F輘       @2 dϞ]3fлk'O>H L*of͚t,3 0@w}StLqTJS#FHLq ]>74'|B8|G@@@@@@@@@@ҁOxjڹz?S=       YF=zΝ;+wʚ5Mz9s >>S9sP>}4x^no2:uСC|            @@@@@@@n^J*Zj ?X!!!Ot̙3HXV-hnmfCN)Ұ5nXcƌO>dH#0m45mT>KP@@@@@@@@@@@ҩA3m@@@@@@@ )|}}ճgOg;CEڷo_RMܒs4bWpp6oެ!C(00Nɓ۷oɓ'Sft,'ݍcq[lGyDFyO           Oc<5v\=@@@@@@@ -9sƆ}ڵk {G6cƌia֭[#GڀHϪD^>YF[sFXN qC[n7o>c!           w dr@@@@@@@e˦gyF۶mvmPBz駵l2EGG{ԨًvޭA)44T*UҒ%K[o\TUT Zիg'NxULoVʕ֭[Ed^T          $G1ot2~z@@@@@@@*p!7NcǎժU-Zy6.SLiu+6lؠ hΜ ZzڷoN:r)XY=f׆;ѣ2d)+b ~kB7z)ʞ='@@@@@@@@@@@4 @dL@@@@@@v0M<ٮ+WTlT~}w}v-QOSH ""B ,ܹs9ڷ||N9|Ub5ʫU3J)00La?hС*Uv 7ޡ׮]kC'M5kO>q;!*G@@@@@@@@@@H N@@@@@@@nV <<\g֬Y4|:uJŊSzTn]s= 9/ _U/֢EdRzu5i ~lc*?d5k{]( BV6(u,ܾ}~m;>_/:v̙3{d~{=ު⤊p͛{o:A@@@@@@@@@@H{Akʌ@@@@@@@4#+Vh…Z`/_ .`UfMUVM*UR֬Y̼Hm6\&r2Nկ__ 4sjǎB!M8 4]@C!|?ȢEڕ ӻᆱ^ٳgW.][O'pI=ZÆ ӦMTF kjڴG;@@@@@@@@@@@&@dZ@@@@@@H&rժUZlL |FaCwmMz!jJAAA,3g&L)S(C Сzi?Y c!          xA{@@@@@@@عs \z 4AN(+f"MHYK.RJ){إRk.emڴɮ&L2/ϙ3ҥyuj֔ZV(- ϿND)N)*JʕKN+ CdI9A#9{v/͛1chڴiA@iF7Tr֓c;vLϷ3gٳgUV-`̎;* %bL@@@@@@@@@@@/ ҋ/#      \)c7l nܸ H2h… ;!}%(QB~;nWz|ŋ~{dVs}on?_tɎY`A-[V˗W zfʔ)^MIsJ&Iӧ  i!˜d{zW( 4͒ yr,$\?^fɓ'԰aC{ェS *5$G&r6@] `0۶m넍7Y@@@@@@@@@@@Y oV@@@@@@@J[?Ԏ;wСCsɝ; 4&0H"vk>nSlb! 48}iϞ= Wtt=X9*UJK֝NbbΜ9woeւPȟ~*Uڴ ?9C$rႜRW(;|wr9PKJ"lK'yY **J+W?yiŊ6hAVV-v5؞윓iV1s$yܗ5!'$֓          s @@@@@@@ӧOk6&Cl.*G5*X ̟?yQ\&\2k֬^G}%%K9|}})C 6xь$^m5ϝ;g^skᏦ勏gϮy*0006|6& ӽٶM(%ĉrTԾԮt_?('P!]t+2n8dh3gy#kͱ&|ф0gŽdΜՄm@@3`u6y&/^hWܫǏ )uǎa{ɖ-BBBl0;lK,i3w;           $AIK       iBOTҼyҏ?J}:6Lwk/exA)S+ |4aq#M@dgB Hi>tMh sWϛt4a+Ei]L{+D#G\5/.U$PH5U~۷φ5U7i)m M(dQWi !M({-SFʜ9K@@@@@@@@@@@ҍAR3Q@@@@@@@ 'EĞyk9w^f*W|kqΜqAPH!ԬԱԴ)džJKڸuW`󒯯+lYɬʹ%KJ3&YIt           @ 2^z&       ?H HIKJE&*ihB'NpufIرR@Ԧ+N'U`QQQҎpM͛]gHi!˔qw (;@@@@@@@@@@@HA       @pAjl+.fRJi„ jժUr 8 .'}vTîP n><۶w@-Ү]H??)$ y睒{un_e˖3<           ^ @\$JD@@@@@@Hz(MibZbҏw޽{k2q LP ;VڳG*_^ HD& ?[%3_ֹeu#-*. 4[D @@@@@@@@@@@@҉AB3M@@@@@@@k # *-X լy>… 7T߾}==%@LoҨQҩSRÆRR˖RlXL2 ) tEY͒;q"@@@@@@@@@@@"@dz@@@@@@@_}%=4nԾU%ف>Ho߯9s&8t.HӧKGKgK2IZI]JI>>[OJ ܺյuE<_;] 46K1@@@@@@@@@@@Hz ޘ@@@@@@@R?KMJHFEE)$$D͛7ק~0b=*4jjTԥ+Dd)!U rmty@dXt+$ۥ2e\eJʹ>g˖B1           ܰA7L        iE`>R%qcSfV&MRv}vH)Þn")#T#R۶R)ZZ)0Hinϟ7 CWi#3eJ)@@@@@@@@@@@D (&!      5K\|#\)e͚23U˧SLbQQܹPi$__M[7{RT9ptsysu6O*YRP!ZHE!          s @@@@@@@*Ч4|jTt(^Zwu-ZuL*NƍF֬BBvRE}aCu>WsKRJy7,           A)%ϸ       )&0{ԴXرl٢kצ\֯wB#EDHKݺI/e̘M7w8y̺it%T+J9aRr_ E!          A EeJ       W8yV+-oF]tI+.\NuBΟ//=ԽTWN)EtIڼ 43g̙PW( ZU*UJʐ!EKfp@@@@@@@@@@@4*@dL @@@@@@@ a]y\py$&9+9r+1XM4|+2<\__CjRKң[իU\% U&ըZWK@@@@@@@@@@@ M&.#@@@@@@@HRӦҴi$挤isY)RD=^}դ^Ӥ .5Kk6wnɄ>tir>K+]2BB YSPAM@@@@@@@@@@@ H       xQ*WN ƏO9IjȐ!۷߯|%0FFν$5h )h!' iB"#"٥եjՒ׾d.@@@@@@@@@@@L H/`       psIo)TታbbbTtiթSGÆ DY$'_TsH HݻK=zHEs$1߲E]$__Wج vm)$*n@@@@@@@@@@@V Ht       XJ^xA0 g%M3fyڼyΤ^ӭ޽С҈ѣKO?-5h [dyk]LZ^217N]A@@@@@@@@@@HACi       [)u*\tx@ "BWiR׺zdKHTkWO"t          xA^v(@@@@@@@å%>zt+44TsUF<=! 3FʐA,)`sv&3oIKHK+W!KtB֯/`$*n@@@@@@@@@@@RARP       @R-M"I2%k׮?qğDK<$pҗ_ >}M% B78{VWi"׺z)+'PH֭+̙.i           %AzɅL@@@@@@@8~\*TH\{UL>>3 [>Fnݤ޽儖zEicǤE]ΝR,RZ`{BC%4@@@@@@@@@@@4)@dL @@@@@@@ &F*YR>KYgϪhѢN^o 0 eat8qBk/\ZIIի'И])"dP $>, lH2 Hi            pn=@@@@@@@ %K0W/?WΝoVZ9ѓ;9sF:tϞ=[˗רQ 'o%"Xܹ_vƌvjԐsISHщvI%Pԭ4vڵ /HGs KeJ}H+FNlZ8/~NziҥSռcTYf.A@@@@@@@@@@ 2e@@@@@@@ &N F[|/^:u_Ռ3njTw?7r 4hZliO3㇇+00Pq:z}֭>ܨCҪU S͛WjZ*UJ2D:F{}RH ȟΕ6-rmWCiӦ"4Wg9R۶msJh'EuƍZnJj(          @* 2\J@@@@@@@=SU0v\P!v*Sꫛύ<}tݻWyT6sYL-={`+VHTwqM 4BG'? }bŤwޑN9ݣYHIK {[ԭ4aBڸ~&TscFEEYˮ]bŊuDgڱcLo 'L@@@@@@@@@@ _@@@@@@@ ,_.:5U.MUH0Λ7O{wNb'1M? c˧ .(k֬ <*P椵%b{n" ,)'s5jH=vqyk֬ҥKUJۯi#cƌQf|w^[۹qH"ok;Z`kԩڵ+fowM~uuB9wٳ |4L=f1ζm۴e{Z@@@@@@@@@@@4!/=0Gf?޵'       -pႜE9_Wu9+cʕ^&L6mc;w֘1c4rHev(P5FDD;?1_Lcmy'9/~6m}9kĵN^z;wѣv… 'fX QQҏ?J+'NzAWʕE's39s#GEf$U%'_QY 9$>\{qvwE9cwaߕn׬Y^͟?F֬Y{jJym0d`p]lBzzx'L֭hK(;v(gΜf1~~~6@rĉ _l/u@@@@@@@@@@^ π        GrBFJ؀ݻw9XZ5UT *X,YҥK+SN: &]O?Io^&c˗={j63f9sf{.!TWzaiFi$9R*RҢ)+A뼲4j&$QN0d7trޝultREM(; Rvme˖'Cs~bXbrӧOې)S8$UZծz n̞= ;؄T:7w}yNddc9ѣ!f_L&vQ 5M[O=T           Azx@@@@@@@֯r .ob?Zpv42_7ǯZ{VƌUH́Yf6qСX ʿٱ$kRZZ1$h![ 2.G1ե]4<\ 945JkI+V ޽>lAw~~~N-N1β}vA6p>sbB&ڹQͺvZ{3zwyӦMxb{άYeC[;ΐ!Cd~GyD{qjܸΝ;/@@@@@@@@@@@{kE       0AK9;w&xVǎ={v 6,㷲ӄ@16i… 66ֽ{wM8QǏ{xo+]&@iO6Ǥ)SG9sڵ1c5]ǧNΜ9Ν7ܽ{PB{bXfj[ZꊳΞ=C]&ѼA魷R.]e}ʔ)VziGFFG27oڶm+Oo           @ 2^ C@@@@@@ ]g(,,,nL 4a\/^L4_~u릜9s.reC'MYB tFa!&dM.<(U$u SpG:}I.-m(=RR|C{bj/]4iWV,YbȨ(wnb%Jw vӢm}b]CƍUX1}G68e˖/LPzJڷo /-3%KaMR8           Su @@@@@;O݌@IDAT@@ %q3u H'ѣG5i$eEDD]kǎ= W>}5.RoKBhذa:rݽL4"pIKeH=zHWFM#N?(WNzeߤRr2կT4p_O,ϝ]2+ذD3((H111>|F-[ľckfk&{m$ԩ7x:֮][뮻ΐ!qK/$lٲUS'ԩSv;hXɣի>[e]@@@@@@@@@@T H/p       pŋb\BBBj ۓ^|E\҆DC$;vĆA~j۶2 .RvePm۶顇,YbqC&t6֭o̹B[m3ޫ 8YzQi9AҌ ȡC%畫o}VZPO?iϞ= ҰaC߿ ڵz͛m;]wnݴuVQJh9sFoys,:IӧOc=f_l/^\:u ٲeg۴i 6}wɚ5kl lժŴ3A&TZv@@@@@@@@@@zg,~@@@@@@@H@X+XnjJiرzGt9&l`X)) b8sGү nuٳK/ dI&iy/̻xMRRӦRRR DEEӧOB ݭ:I&<1O<]?6,DθqNdf|ŶtR-MdΜ9c]9sf?^?sn>w?l@@@@@@@@@@@ u : U!      ܄RzҡCR`b ըQCvRppMxc4iD&kѢEWk„ ڲe؁@z0!}$ $'DOzsg9Y%y-@ȩS_J-[J͛K}f          Wj@@@@@@@҆yچݻwW޼y=6ɜNZ_M6iΜ99sf/EڵsmN4')4 5RnݤO>>@j L)$(PԬvr+t@֮W rٲ%E9p@.]:]ΝI#          LKW       \ )G5܄? .$UL5i$*UDxc2D%PWRҋ/J JM!(PdIsc;w ҝ3g?Ges* b!^@@@@@@@@@@@|bSh~@@@@@@@HH.ݛs< СC裏zK@ ,\('m$=R\%DGGk5kf̘7[ moovnW˖R꒏O'a           L)!      UץI\qi /hرڽ{shB M 8NR һJݻ/e ٳm(yuiex.]jyuZj&֕          ROY@@@@@@@H_%""BÆ ӳ>Kd3Z:0ᏽzI;vHmJ={J5jHW3E+nݺiʔ:y,XgiocoQ6ʕksӥ C@@@@@@@@@@RAP       DE%СCmO< TJS'uO5           ~Lמ#      iR &&5zh;vL}IA ԹmԼԱԤw/0Y K,j֬ 罼[7okjժ= 2e;SDDzb           A`|@@@@@@@ d,?QttN:PBlA@ҰaҥҞ=RٲgIΣɂXF|w#M;lY DOT۪Uk]ժZ-UDЂ23Ga$?~ӛK $$7y}9>wzt߿[Çօ6ֺuo۪|S.wq!@@@@@@@@@@@s*@9a       )yɓgEv/0ZC=;@ t*W.HZ='~Xv[?͜9UӧuV.[oSݺ|!K]݅?@@@@@@@@@@B_ @@@@@@(IIҒ%ΝңJ7 o/U*s[ZҘ1cnK/O>jڴݜ@J Z^]:سn7(taaao?}(!a ՛0jդK/_ڳ5!          @;[/_N@@@@@@@|XL0@ڰA:|8ޓf͂K( ;Jݺuտ˚={:wq.䳀}}Vz9{wiv|~(/6L$_WƑ/D]sTb&@@@@@@@@@@@B ^@@@@@@@@ȵ@RoxijtC d5رC,nܸQ򊢢4k,@CD :TK;wJ~(o4dT?s*Xt߾D@@@@@@@@@@B+@d}54 @@@@@@@ 'geH͚ev$}[-Io@H+zTzu=ڵkY"@A t t mItx~-+ (w*$ o8+#BG@@@@@@@@@@ Am@@@@@@@\ \}Դ~w~jj>fڱca@aä/&Nڷ,)FnhN""VJ׿ F@@@@@@@@@@?)X@@@@@@@ yFJK%n2?-[(222|({И1cy@GZHREpX cALbcn&L,';< y5ݹ@@@@@@@@@@AMO@@@@@@@ +5j$Y(drԩSmoݺU@FDDhĉٳgn pNjՒOTh]wIǎ&"&PtҤIҎ;HG ZU8P?>g˖I10          *YA@@@@@@@p XFOgƎ> LMM=T &K/=8;@ DFJ/ '#u&,@ҭJ_-m&ʩŠnFJI QÆImHSw>g!          @h Z"      d"0`Tf̰ԫ'UaW73 q4޽{\+p5ҼyRRԾ4wn-ʕV{i&/.\^]~AJK˼yc/          Ah9       "")]tQ}gR ;vꪀ#l"@4ir*M7;*-$P>kK=$͞}3WiTiS{N{LO:|,@@@@@@@@@@@  G@@@@@@@nQ-oΝ3mۖⰰ0=Z^{ml @ +'M(y4`KZ:Kx|RNR=G{g_|!o/Y$           @IߒWݸSw3&}@@@@@@@^{N]ca[Z}ǏWRw[ckI=$꫒΂9XPaODdI7X8dT4vtef          @x"       -HU:tielO֭[ϱȑ#G. EKO5J6L&)%h^m_E:q"g!wSg~{@@@@@@@@@@@  D@@@@@@@(QBzSv ߊAp8_: Yn&Nƍ /]cP7sNR߾Å#4 @@@@@@@@@@r;[r<+ԉcy!       >K:x:֏9dy=zTǎs/[OMMWNȑϨiәjnZZZq[%DZH3[_n&M޽{SN*UT%+eʔImlٲ(22w!&0ctRgI2˂@~ /U"$^5o6 `β1Ws7'|Hq%pf_۶Kֽe7{l`u ߗmPd,/]+v@@@@@@@@@@M5XG@@@@@@8c ڵk+{U`ٷo8pZG {@ kU,тÜj ڡM6G j}˖-SϚ5k2bY>9-f Ur2˫bŊʕ+ss?@ uJri@O-pG><HΆ+OU4Kբ0e/Tjoh]l mLT Um-Ѯ,p :p=pYg,`@?%0@ V!iWXm@q@@@@@@@@@@/4ן:y̘\\ĩ       VŽm& Dܺuoߞر#=т ) *:0Ѷ 6 ,&YmS.ɒXrjVV-{XpeuApvf!iB3/eVVbJUfMW,VOAp4|xޛ_ ~k`N‘\)e^Ͻbǟ| A/d ̬w×m< ~8?B!I-@ӛd-îֽ 9۷wCZm¦mYDms4          [ ϭ7OC@@@@@@ P%$$(11ѕ7zӦM.тlBBFh^XՕ+Wvł"##ӯe%{ JJJҞ={\ݻC6wڕi*P' U֭:uի玅g"i_~)]s#v\vܙm;nWl[/ RK+~ @@~uƶLZ(K{ ޺ն{z]R%7jong^8}FI6          @VAf%~@@@@@@@Xpիn:Ym@b> `AbS,C %%BnٲŅvzyze֭JMMu .Y lР6lFqƮԯ__BƂ |tKwܑ9-:m6_[WllPG @ = BbXWm sdA\XJo>YL@SNNN< B!-+^zuWu          d 2[       @H t<9sj6m N:+tXeTsgdIi ɗWȒ@rr {\pb᏶?""ٳUlYK{e]ڵk^6EB–{}W$$$^zׯ .HN? J#FH7T]-B͛a^tR} *UR6my睧MTRݒc @[!+Vиq\? 5JK,Q׮]uo߾*Yd>#[JI?/=@0DnҦNoVsщ'Լys7ws>  {q!>k,nM4%\^zG l@@@@@@@@@(H Rg#      @HKK/j.殻R>}TD"O:@~ ,\P>cEEEӐ!CT|z$E O,r8iz)22OnY(oo>M[aaa2W]%;&MrPۓ'joTJWS.]j] 9Xvƍ1chjժnfr-\9iA@@@@@@@@@ 2t-E@@@@@@B"p̗c7M7ݤ^xAUV-$-T 6LO>5k#F(>>huބر 7H۶7fwݫ~}:hڵCS( 5J#GƍoC=֭[Px,         6va{#@@@@@@ թS'?^ӦMi]+/|N6oެwy=?>-\PO<ڶmgyLnQh9yL~X5m%""BrJU\Y>쳢]W\!*%Mzطo 7SFzJ[n?uޝ{nqfef~74m4(WA͛AK.ܹ?+%%%_r*TPկ__ӟj*M"      Y 믺 UfMҭ[c/߻wO/R ⊝;wj֬Y٩gqss XB-*tAgܘ7jĈڰa j>jժ/EoQd(SF33/[_kԨQZd.EGGq&ll76X]0Kfml_0 srW},ڤIt/wUV.{„ Au;JPgϞ7n-[rʩ}{c          ̫#       w%K/uat,ݤI{Yڵ7ʓ{[Pߞ'˛|wzꩧwiӦ wqV ѣ? 8&'нO<֮J :T/.\>}P8sbLix_|r֜xپ[nE[mY2ۗMB`n9_{GtW111zwe,5jHdw~΃壏>Ҝ9s`i,          P<,^#      @.N<E>|xd_xf\0ȩܬA:+{wUd߾}]w}֬Ys&\Mi;V?V^ .@/bd 5kJ(ukCòzNJJ ?^{Mo.]_jҿo׆Aӧ. }n#>^w^gf|ͮMnz 8AFܹs]Xc=&Ι3G}<Ԯ][_~ i&׿y9K3{嗵n:cAIuV:t]c߻{'$$m۶ڽ{w =7| kժ>ըQ]G nrɱ|ɾgӸ=9 4l(_ߩ08#--MSllNhY?3#))I&Lp㊅_ҷ~~x {=|7nꪫNzˮά5rLȮmYvz5;pc_uVl,4e7~?쳊t3xM4 }Uc.nȤI_wĉs=jժ-ͬGydzL9g;_{XX~ҥKʫ޽{wgdz[&OVvΗ_~).bWYv.ZH111[|*,VeqimW^Qe5 ];i         @xݚ;#      EC,~CC B,|R߾}M;vtaAvZ@#4rHnxz֭ = @-[{,s}|~gOmZha\VӟJN}>Z{ ZH7ZC^yڼy RaÆ/"2Unp!I7xW_;ݡe˺G۰G{V:urϡwa!i,kZh…y(>.0|a-\Pz{/^C{9Y[~"vl F 'kU۷^ $O>$dC ;w< K\ȱvBtmpcZl5߯Zw~n~'yY71!W-؂m`_sٳ;NO-owˬ_ngǶ/wa8oڼK/ua6NZ}txg"/kӦMs߉'|[l>h,]ҥ;d-cͫž;w}fmi|;/fxM(l?jݺfA@@@@@@@@@%@dz@@@@@@@`ɒ%.\ .K,oҥzw\1YX--r,4ǂy,B,l%''wA%JPոqc5^҂ +|jڴﰫszd Z~ ĈfSOF0}_w 6{l9|wW[o<؅lխ[W/wﮱcǺ@D͘1Cvo[.2>fqqqjժP7nۑ{qRyW(**JCUlll+}Q;Ͻ{ ܿksF*T.=xh-N#f5&d6{\V㪍 111.}F/#~Y0`f_+8n\s{c=7 _ϸ)Yy3ȋjKRR-[l&M lm gkz?,s=ndԶd<{F(lmsK{,          PN'ū@@@@@@(l޼mGPk6հaC8p ZOtt Ы5kѣ6L5kt .Zh-9=ΩQU.X۾}{ma]նm[YUW]6mڸcaa9!xAYַ+Sk׮킿l.]Zh㝏2v]8ԿoxT~}fi&=3OSk/}G+v{o=zH?o!f"e~駪^ N֭{~-8Zj޿-|fΝ;]{u' 'N|i~ >|xmGڵs6b۶-N#-DŽfg5˶kiݺumbta~e/]{u0ޚ-<[lcǎTR물osL|BmSVՉ<;nqƹqobUٹ6g.̃a@@@@@@@@@(A7D@@@@@@@,lo޼yގ`!XxbS@IDAT-VRllϟ3jժzꩧ\xӃ>( ޽YRr2c}رM&kR __PsU%ԤIjE ,oԆ \mH5?=nݺ.dn.%Kw[&Mʖ#w2ۓ^w. m8Y׌|] xˬ-?:qf͚;z dR7oVbbbcmp yY2w[pO}9-2 ("]w Çdd𹴴4ǻ>guwsAL{DŽmO7d/~+n3`> ?kgڷ̮?vȑ#ڱcimA^;}Y7o@@@@@@@@@A}[@@@@@@8 Ll׮YS(,mڴqӟ$ ٳgGտoy%bŊy֪UONN Բ%縓cȐ!ھ} _~޽{"윷gufǎݡ1)w^x }UjU}?Ə pljʭ}Eɒ%GfmJ?&l{v7ސ?rn@QYPpϞ=]plLƎӧn^q~]p?x9\]{3Φmv? I\65NϬ_ꁁ+r?q<<oL lٲ;v.\~27|6nܘ%ynS3>s F@@@@@@@@@ Ƒ       @ѣGkٲe]RAvwӦM^m7ovVLL>s]zzwtjРAzWη~M0A/7n,Y ݾg}`éS*ɻvr׬_VoM -Z|)a֭;wL׎;\Y#Goj`߾}< իB-_*W駟K;uŝ^F WO<مw9qmpI vZ}ᇚ3gk+">xQwD\RTBα 潺 \?C?! %ؐYfJ*:劉B;ll~GM@giqcy/w]ٵ71!#W~fi!Ç˃hS2/3獓^mW{sά_o\vYvj[2'ٓ&xN^m{NV3Z޲e;5!!!C4@@@@@@@@@Z )ʫҿ^ݑ       C /2X?+TRyf̘s}6lpiiiz> 7|WZxKUVjР,ƎYv>}hʔ).8[ou4h(e{ڵ={j߾ ֲge-[I =6Za2e= GvϵoSNP9!<<\/f \ؤ=zСC<(ϟGu=m ƿ`WPAds^zyRRR\{ouOlm>r]we_f(oڬY3}65{ĉ͍,![b6JkӃ>i( { jݻ^|E7݅t/n}3P7J'klo,l͂ tƿyōr;,قm,Tiw;qℬxvvTTi͎ڛ٘p6mc[,d پ`W^%q<roL|->Cj -``A\go ܴg}V͂         [ =      ccЬnI/2 ;[sO/ƏWZ `/ũg,rذaz'Լys1Bgz;C _B1ٻw~m}hڵz=׵,cǎ|-rZy 80x(1ٽ`-tق[r YXqkn\97!!AFȑ#qFC           PL"I?&       gJҫAiȐ!jذ>YSŊ9FW\q6mm=*S_sN'駟־}\w߭0KcA<ף>I&iիT~o߾ҥ"""yy={mٲ%߂ ˕+sjws:%_ ֹt:zhy9ol1rq85,YvZ7NcƌժU+s=[Tr,         O%~w,       @;vx YmݦxC:@ >|X|^{5ܹ}<| B ,Lss}׽{>ѣ5c /]r%x&LMMwܡ?X)))j׮~v&}/w?7@:k,M<^Z7]`|MCx          A!h4      647N/ϟ.G%J(lͥ=: s!nQQQ4d/_е!@Q }\ل 7())I-[TϞ=uk׮P%|}YtiYa)^hU'NЂ 4m4W,҂g;u6oҤI7          '@       @^̛7Ooƌh_ R.]f)a, 'hԨQZd {շo_,Y%BN(ATo5uT͙3Gּys=sjԨe#!%gټgΜ֓]c^\{=R          P8,V       @HIIѲe4rHM8Qk׮UTTn& yEDEtVXqi.H^zp2""96h@WÆ ]mV*W vɓ5i$M2EIIIWϞ=]޽U6#Gзӧkڴi.B:u+BW^y,(@do599YK,… ]_\q-Ze˖j޼ }QQQYߔ# @6Ǖ+WjŊ./_. wsmJv\]J,n@@@@@@@@@@ o[O      !&`^c`yfY-˗w^]N(QzNo֭[IvU]tQǎ]8e P{2o<͞=[3gΔ8qBM4_^zr\ ܑn:im^Yv ֭[4mԅE6jȍSddd Po~Gwc͚5Zz G֬Y3=h¨2e9:         #@d+Z      g `06l41!!Arw G tx_ }y.d͙3G?f̘p@@@@@@@@@@ 3 3Sa      ɓ'}vh0ׯP,αRJ. Ƃmv.̮u<--M˖-s`} -[VZr|g-[T  [7hO ?~܅-YD^x }XI;uj +eA IcHwdk׮uyp[liU6[s`]fM.]:ʝ@ G<~ӦMlܸ1C;wߧbŊ.՛[(Z]F ُ0           "Aȋ      g#GG۶dSdIիWﴐG/1&&H0;v̅-\gA}tV5k^4ir,+<wʂ׬Y}(Q}6,@yjѢ6mJZ,Ѝs#@q>ӧX8ݎ;d^Wo޼:/X{N 2CZX*U[rʹ@;Zjڵ˕;wʊm{V{A*22R+VTʕeWۺ bxVfѣG]Aݻ={h -i0T/ Wnw@@@@@@@@@@Af` @@@@@@P 55U7oKɲp/ѿ0:;f簜 DW,@7m-*---1Te>V\m? bVɓ'k. $aN˫f͚Ϻu@ObÃk g! yFl!}FZ ^W=o ܳڮ \,\rr/&&FZe-x!YWl[mV¾-ۊ'pPG/BSoN|쁒l#          g"      P,D w@oj +^m!EmT T/5Y{aL}d /g a%/x ڂS-ъ @ YǏ{^P_Vg+A0Hl\[Vl\ͪcJr׬ozɒ%O+)|҂mkѿ;v붝슅z`ms{֭#w{6A9"X̛ۜYm@@@@@@@@@@s+yn@@@@@@@0 Xƍ3<=Z`-cs^cnm_ժU s7i[."##UvmWrv!ٓph!W^Е nڴIK.hAGdJ-Bk Lp \gϲ@%+_??ڱ Ͳ% g򂙬pL/RJ. -@h X{&=1̂<(/ mMzan㝕.6z6wqjn66S>ubcܮ{o6{ֽGs7wM/?mܷ ̪GGdA@@@@@@@@@- C}Z@@@@@@ZpDŽug!cYcգG~asa?gnP,([ZYh\e!UUTY}m mpٶ>oݎY4z^SY[xneXm tsֽ& bW, 䕀aSzm},LY/ث_uo|jmߢE“Wnݹnl7+xU6V{Ǽ| ph=@@@@@@@@@@ 5XG@@@@@@X0ObbbG/ꤤ$K > {rvJ] gq%TL;@(i#[kao)C@@@@@@@@@@ A=B@@@@@@ $vyZcBB֭[-[(--B .ܱ~KzÆ euUd$e/F" &Ptiف          @*"     GGjÆ =_;|c)Qԩ4i޽{ |ő>#  ϴ."    gõ*gEd%PDAgEq_jeYLc䥖eeq4-!9fGx7͠n{]bp? @ @ @I@t7 @ @ @X"NΠ)SD:'Mڵ+;uQҥK4hР[C  @Ԕ@ \JS @ @ @ @ @' rY @ @ @ |9豢bǴoѢEYI&ѭ[ثW8caѪU:& @6, gy @ @ @ @ @ Pj Kh @ @ @@ɓ'8f̘/ev(;p ةS_~\+ @lXEc7|3 @ @ @ @ @ R#C @ @ PR_-豢"Fi9ve̒%Kr{5kݻw}O>y͛T4 @@mh2b '@ @ @ @ @ ]g @ @ @@eeeL8q1cg̘ϭW^tرطozyyyt!9& @6  @ @ @ @ @YJ$@ @ @(19sW yLǏe˖hѢǙgeeey_Z6mڴz9 @ꮀ Ⱥ{ @ @ @ @ PA; @ @ @|fca{Y~; P\///$@ @%7J3  @ @ @ @ @ @ @ @(0s(;0aBTVVfnݺxAy睗ʢ{ѸqR6 @ A~D0 @ @ @ @ @ ȒB @ @K.cǮXQQQܞ7o^jРAtڵx!cېzO @ ȔxqDӦuӺI @ @ @ @ U*nN @ @ @jiӊcƌYm}ҤIQUU;Ҷmb)1@6l蟹jJ @N AiAJ @ @ @ @ @xC)$@ @ @ŋGEEj)o…5nݺv- eeem٦V  @ؒ Ѯݖl  @ @ @ @ @|4A @ @ @:-bŊ2eJz,;œsneKyyy:z׹shРAy @>@!rOV  @ @ @ @ @lnA[\} @ @ @XpaTǎ-=hҤIt=<~ӟ;.eVJG @@mh wQ  @ @ @ @ @uS@dݼzM @ @a4iR`4u:tP w<zyyy^Q^V @ 9Z6AS]] @ @ @ @ @5! &A @ @(1 رccҥ͚5اO8SaiKgC @A% @ @ @ @ @VAi7 @ @ P*++c„ ŰNJ=ztN3f>ՋN:[\///;iG'@ @ 4nѨQĂZN @ @ @ @ P7A @ @ @@-3gN1q̘1?>-[{Ѳe(++p@uYŰݻGӦMkAo5 @]` ȏ  @ @ @ @ @-, r  @ @ @uW 9@5C+**ٳggGΝx`^/?o߾"9 @uZ@d:O @ @ @ @ kp @ @ @6̜93{;vZ&L܍6mD!;ح[hܸqm6 @ @` ܬ*#@ @ @ @ @!A5 @ @ @n ,]ڐ1cg D׮]sc=C)1mouP  @ A~< @ @ @ @ @l1A[^ @ @ @@mxscEEE^BrҤIQUUҶm?3<3~GӦMkK @B@dMI @ @ @ @ 5@l @ @ @uO`ѢE1vصBSc \paFiԨQt-cv!C6m,XCz*n>|xCc @ll6U @ @ @ @ @A5 @ @ @VXSL)=p8zsҴGYYY#9昼6sG;SGMe/^h޼y_|q?;lSTL @ @ @ @ @-(--j @ @ @.\CSs ~\xqI&ѽ{(//+?21o'|2~8ѠA٭[\=N :4v/B+ώ3fp7x#hժzJs @uGEXBիf͊g}6ӧG+dcǍs7qU'@ @ @ @ @ *  @ @ @.PUU&MZ+8mڴb:t(;tIqsGXg}uqm[n%1?O#acE ʗ0:N;ŗ_jG #@ @`kHY l|/S#v.qE}ݷl3ӳq?T  @ @ @ @ @fUE @ @_`޼yQQQQmرccҥf͚E u,//xꩧؼyW16lX?,[,//~wW^yG.}=>x׵m6 4Xy @ @. | q駟~vZl @ @ @ @ @K7>  @ @ P"1a„jnj3g-W^tԩ~Sc6IRRh2M[nںy晸뮻cn^\rIh<0_SO]uUѫWJyŋo#GƢEr_җrk\b @[A7M[ѥK8SN=zttA1mڴxGbqf+LC38sƍo  @ U yFW:th~.JKZ#Gx ?3}ѫWƟTٳg<㑞ekH/B5jT\t|8iҤӟÆ /~/G ~\`A|[ϛz?xϏ͛m@|pzfMϨO)|2M_|EA @ @ @ @(-Au? @ @3 yL)q„ QYY٦MbAbnݺEm $L) $d>~;߉{w裏/~8㡇 W&MuM-&RR=)2lbŊcǎtm# 6b"@ @@]HAK1gΜúӏ}@IDATIN>3; WձN @, #],9{T] )?Mov@_|qV[/ԝBל. S 7_w9ӟjkgBW楶  @ @ @ @ @JP@d M"@ @ @5!jɓ*WSc8(+++?BFM˨}ƫ\rIs=1lذԩSt=N:#<2-Zw_/.խԑ;׷m6ߏ'Ƹq"Iw1] @ƌyae|+y]I ,+͛7y@]ve 9z}S ӧOsP7O4j(߫ B"綾^=\Qxg%C YBH+V;ָqk#Fv_f͚v @Rܻꞓҁ⟦B%KQx+c紿/qoT1\pA+ @ @ @ @ @! 4V @ @ @RD o|׿u\s59F{GuT|ߍy_ H)hpܸq#y.ӟ4 '{wifz9uLPh~ [n%;wn{sPd|Wlm<… ;]w5;ⵅt4eʔ®?a/IxyoVۿ[m۶x @lW.~3c̘1?1ڵk]vYޗOD OW&L ˴1qļLLhժU?vm|rڗ]wk#=-\yѯ_>|xq__җs_!?:q9x3!˖-w9.jCSX>OGǎ4} 9֭[3h5} 9?AX@ /m5?YfŲ @ @ @ @ @ ҸZA @ @[@ _4iZAiӦ{ޡCW zԩSq(lҽZ|y0N8!~裏u S|Ai&nOTneee10BKL @[V@W{x߯ ~<*ydQsLӘ9sf919gqE r_׻G3{#LˡciƌѮ]:g,Rյ9$GѪUu @ @ @ @ @heW; @ @)ȡ2K,]4wyB(RXþzj^O ifj?F-A x7V 6#GFϞ=kGtkbjРA5Q2 @ Pk5myB*AGB @ @ @ @ @5JC  @ @ @`S ̞={AǏ˗[lY w߿ 6,oE4i)M bŊkͥ?3vm"zI].]D͚ @ Pr7oÇׅ>SL2_  @ @ @ @ @M& r* @ @JI`ٲe1nܸbcEEEq}̘11gΜGΝG9q~K[R&M^z_]… W٨Qhܸjjry5Y @ P}v?>8J[qM6bu @ @ @ @ @zAջK @ @P`ƌ;^zѡCbg?zyyyt)9& @ @HA+Ya"@ @ @ @ @ PkA֚[ @ @YsPBqҥKs͛7طo8ӋaifjaJ#@ @|A˩ @ @ @ @ @%! $nF @ @ @/_&LU+**3g֫̕W/vqb_ ~,//:|H @'F}zzѣGGZ'LUUUm&Rcyyyr!Ǵݭ[hԨS @ @V/pܳn[D.?Q @ @ @ @ @[J@䖒W/ @ @uF`ɒ%1vbc!䱰\`Ahذat5<1x۶m[gt @ .X9t[[_1{  @ @ @ @ @ R @ @ @@:ujA1zHI&Ŋ+rn(++C ) z  @ @lj/})K"*+׮iٲZ{= @ @ @ @ @JE@d @ @ @-ZCnjZcNa|Anƍ[n9q=>:4nݺq @ @ p^Z}d۶}Ԇ^h# @ @ @ @ @@]YW~ @ @ +bk<NZ<}p;^VV;wϵB @ Plqlٿoĭ.F @ @ @ @ @A @ @6 rcEEZiߒ%KrM6ݻ޽{lj'X {,//-Zl6* @ @`.0׿^? \}- @ @ @ @ @%  @ @ bĉk<3&>}z.^zѡCbc>})cǎ1 @ @@߾+V|Ά+Gan @ @ @ @ @@w@ @ @@;wnuѣGǪ˱cƲer7oeee9qO?7k֬V[c  @ @/})2~"Z\<{ @ @ @ @ @ RB @ @@,_<&Lnjr֬YY7;uT w<;$@ @8#K> W/c @ @ @ @ @V! r:A @ @v 0B+**b9 2UVQVV=z<0>bcݣI&ZK @ P[G _~h #@ @ @ @ @ IAnV @ @˖-cF v.qܹAѹsb\\///vmH'@ @ؠD~{;ʏlt' @ @ @ @ @ - @ @Tb޼y1gΜ={v}iY-Z/,̫n֗,Yͩ׏ FӦMYf֛7oZ֭[ea}mܢERQO^mc ~8qbuo-:C-]FFjY5 @ @&VXf͊iӦ￟i=;˜la-X .]C$˗///Ļq7"1,iqѲeKӘiatyvm6իWU @ @ @ @ @ " @ @`kHSLY%2qzxƌ1sqzx)3rp W\3x1-}959d_3qͰ"qu!F ,O Rt% ٵ^NA}m]۵kW\s~/L+**aJS@O}*?۶mc! @ @Zi2);6ƍ2>1”I8e dLc4.N;4iǤV {|+Ǩ>rO\5(ƻ 㥅 4vƍW'Nc_=ݺuݻ,++c>X @ @ @ @ @z+se5|;￿v @ @jP ;~H/i}y٫՘B )xX@LauU)IྐྵsFz0'4W L/=r՗SdzSN9v%eΝ#m*}SSsT>LORcusAK^k! @lzvI'm@Ҹooj4֔%ԦM i0fi3^QO&B8i-if-ӜYӔ>vm}W[  @ @ @ @ @T' : @ @-.˵n{ィ()0!z~0Ӝƴ,Y"S?F>}rMnM B @ @ @ @ 1A~L8 @ @5#lٲH/ ^-,˲bl!,Ҝ۵kW3Q'X|y?~|L/AG#ro}.ŗK={5^:'MTmc |:ujQ%.L/k @EI'}k]ATf̘#F?y#X`g><ý;=)},'˽+9,^4ϝ;76lzDv]; @ @ @ @ PA廯 @ @`3 ̜93^~lzY^z+.]V%߭[u]s8` yܹs||37Wu5,dɒH^;ާH6l{g?OG޽z&Mj5r{>՟  ΅dRW y\uE1J @ @) r4">?ĨQ{ H;qۍc.i\_^x!j^q!Gp@4jh#Ku @ @ @ @ @@mY @ @HuK/Ǐ-a˭{4k֬{iR`ڴi^|Ns -|A~9>o{ 4ؔMeqUWc=Ʊ[VUUń ";XX>}z3vqBc:1 @ @[F@qW'?~<ǓO>͋O}Sq衇ƠAbѶmO^gώ{.~xꩧsZn?> Z*o @ @ @ @ @`uO!@ @[L`?9?|Kv)n}>}{D`CW^y%Rxc…Ѳeٿ8o߾ѢE S W_)aÆ|Hy 7%\zܹs yLaƍe˖S?ʢ{SWEN @JL@dY%K}}OD0`@ʑG=zX֬ѣ}xGbĈC8>q}.4iR* @ @ @ @ @` ܢ*'@ @W`֬YO?wy'奰?otܹvRKN 3F/B ҍ5 4`ȴNof|2Ry㦛n*Zm"Ǐ_ {(w&M׏N:S㚡;j @ @j srK_{7M̛7/:8rn[iJi,1B{yu1t8c=,vj @ @ @ @ @\I @?x<9/>1pp~YfuEԩS/Dpw}7ҋчzhy1dȐPo\sMw}9rٲevna*ԪUH!ݻwƍW[ @ @@Y,x7ƈ#b]ws9':СZ߷4_:x뭷b/9w1z @ @ @ @ @@Y;V @ @&׿5zxᇣ"RGLJI`ܸq?1|Xpa?>N<ҥK)4vs=ѠAX|yXu+-ZsS9)豬,/{Q\o׮]uG @l \ ƻ~c=6/Z؝:gy&n~;s\q1tq: @ @ @ @ PAֲ @ @`sq]wpػw8c=ss4AjD`ҥ^~G㷿mѿ8_/$lٲaÆoFnݢQFu @ @# |0os9q饗N;Tx~q4]w]p a @ @ @ @ @RYJwC[ @ @XdI<qmň#bwO?=N9/oʿk&? nРATVV72qq7t @ @@Yoz vg|_cag}v\}&%TMƍ|;qwƀo={~R]N @ @ @ @ 9oJA @̙3kݻDž^[92W^yҽuZׯ{..\7pCf͚E԰rjذapuMcƌY!  @ @l1˗޽{GZ饗oȦ[n{yi? @ @ @ @ @J[@di#@ @L`֬Y91@򗿌+"&Nzkロ^(͛e]oFqF&Mk׮qi)Q mmԨQ 4 ,X @ @ɓ}{q7ƈ#b*i&H:to oD @ @ @ @ P Kh @$˗/n)vix'?I;/9ڴiIT(Ru]og?p뮻bΜ9Ow8裣CQQQQ6 @ @:&/g?٘7o^ . իWt7to o" @ @ @ @ @JSފSM5?,kD @ @5)# &Lo>6lXU(@:uj\}qǹ?UV~-Y$4iRܶB @(fN:ǒ_Aw-Zش*V,\0&}'~Պvk$ @ @ @ @ @. ԯKW @ PnӧO[o!uСC?>ҋzQFYB @ ^{8裏zHVu MH[1 @ @ @ @ @ ҺZC @j\`Ŋqe]v[}Ѯ]g]>2dȺN٤N/N.?izѳg8s_^-?~qqi9眓_XN=~/c{ls7A} @ @7o^s1ѯ_կ~ 4s,>[Ǻnĉq뭷溯Uǽhɒ%o;?e] /-X 8Sm۶ns1&o#Fo%fL @ @ @ @ @# t @ @M"p}O?tuYZUUZ5*Ə#G~8fϞ٪~7 6,O~3fl[㎋o1'7o}kc5kC)-Nկ~ucZckK}2?VZe]=\n[zs_Spe޽#/| 9'bM7_O{oC @ @XߞvM.E]IPi\Q4A/> AK/vF7SN1|u]{cG?ʿ1 @ @ @ @ @O_(~k @믏owm֭[o64lp=nܸXYYYcu~2N&Lt Ӧz9P]&RuǎcȐ!bҋi[u]={/xKTN @ @Y }ST|ɛTds0ّG 5o?cF;w.߾}w}1c҅[9/Vo&vL @ @ @ @ @!RJZA @@zm۶/}iyѢEw>`_zx衇e˖qG~xsΉ3<37Xo)D[ni&||q7ȑ##׫WN:k3N;- yHs ݻw\veژiqAŴir'O /0ӧOo1FZaÆ^,65}N.ݺu2c'{7M/1_zy}֬Yk]1{xOS;> 7ܐ '/Y$1bD~!:֥Kڵkk.NV׏B[=cƌ8CrsӋ<|ؘ ^z_=c,^Y @ @6Jw]unM?1+LC-_߸ƌ=q}{ /DFh*;ɭ:4nxǏ馛^\5qղ +";ҘqauŊĘ1c{ۮpIb%5r$ @ @ @ @ @ @ @M"?!?-:K%2mzq7!_#5½;^yB뮻pد_xw /P_~9PÁo_7o^ZoZ[>vgd*R`u]of\tE902Yfko>uY9 "=׿/8#K{n.&eРA[ pL)r]eYwuۻ{_WNȧ7.S/3}ob_xq>y){/]ZBֳ2~|cǎkվ}ܮy~ufqmO 7* @ @V9sfK\S Wt\ze]dR644Ӹ`ԩScȐ!{AÇqtQgLNi ׯi4}'}'@TFMc´vkycXcS,W_}uת.e @ @ @ @ @lX_Cu: @E&L-ΘB{]lG '뮻v۶mcȑ9l˵?|>֠A~)+_{g~;cΜ9q9ҥKצDyTg!TpԨQq綥p:.waW^HYYYL92Փo~y^HN ~͎u/o$M)t3hѢxrheF"ݣO}S: K/ )N*ރ;~Y2 M"6˱*2 @ @3fUlgϞy 6}|'m nDLlMwyuoC1<0_3lذћy1ǬVNu)1i&4ifaҵ4n Ӿ㺮i9MPM @ @ @ @ @'aǻU @ @@ Vg͚U-L/Ϯ:BRPa-ޝTqyHdȜAI`Ȑ)CQKs==BIOРD&J Ieg:s=ps쳇{}n ζחO>D4dRJ2vXׯW;O4Iʔ)cC DO-zwAp~vl2AMULHHH /_^~i׮WC#5h13n\lH._EǍwԶ-[&9kɒ%b ;?AmСjxW?˛7ZҥK˘1cz{ Σ>H %K'|R=\)XԬY3Z5\S=?sрL-K.ʕ+K5XΜ?+VS]d,z+f{\;yqYg    6PBp жW--Fj{6-[>`_\[ƲNٿuCKz3S{@@@@@@@@@@<6/F@@@ G[ꫯ2MS5\#EA/C\gc q [H@IDATzu˕+gߗ*U*8W^rˤI NבېHZIQ߻ʺ^-;j{ʆ $11Q7onC.uf9sd˸u& otW\q̘1nS'Odk.P|G!-[}v`6mZxĺV{siPϕ+W:tH6m$~z\pAFlm"   ds ;6Δ$4U=ʖ-kg裏D(y4h$&&y'Æ s-J*ҤI;$sМK۶m>CשZ-[[Ύ… orO?$iӦ… mc߾}E7k,Oy6cpf$~ 7A9s{,8_i֬ 0 8-GXvUnfԩSzo!    С4jȶ;j!F/&77k׮0Zj,mC ԐB}xG1NӇZmGg޴i]Fhs}\WeɴXW_-WƯ_~kE@@@.`e"w3yT@;6mj]`jn믿툮mQrYgI>}l>)U=4ZcC}}YXdIiݺmZm+ێ>kmwum3Dk_yvlرcG'S|}O[m0Im 6j-{mnРALk}e'x¶          ćAq   @&0?m3׶mIn|wIѢ G sLh.Ǎ'^xaY    R0N GyD^yѣG:m5l&RI^믿^^>|x}aÆ2~xTRnŇիk رc+Q @@@@@@@@@@<    '"p ptCHoY5QArYȑ#oO8T @@H et[9q;ytI sPGKC=N/ZTD )#ȑ#?KϞ=kիO  gϞ-L2EN:$ѣ|RJt@@@@,@dV>c54jժSO_9*O-K`ƌrwʕ+m!C$W\ǵ.B@@@@@@@@@H? Ϛ-!  &.i|vK^y^pt $_[`2n8?~,_\6l(W^ytIN;[ &\pAmf_|aܹsk׮6RJQ          pA   %pȶmP͛)MZ+50G oLi\?˗/jx ͛''NSʚ5kFҡCKlL>Cnm7on;D_uURL̸[@@@\ 8?@ٰz?<GIƍe(sΆ:dxOK/Çgw=@@@@@@@@@@A쀳   ?.QCS rLi֭"(q<rA.ԱHG 6T:m4/Hϗ .֭+9; طo̝;Wf͚e lRڷo/;vef@$   d' \`y'w1N>}H^jժkGimW\);S,_~ 2D6lMEm@@@@@@@@@@ !{  q"gȦM8w۶hrD5 Í֭[' M/nNs=W>ljԨ V0l l5ɸ| 3grA] '袋l@iӭNl@@@ s mw6TpryInݤK.r>M7:e8q̞=>F;'ʕzR@@@@@@@@@@ X @@#" sL)1i'GрF q,Q"i. A'|C 3x'|_ƍ%4lP4i"M6իK OAg1 {7o }\|]CZE6ϗ2eÚ@@@H] Sד@bb}τ ߗÇKVSNҡCҎ>o{j?1gNXd 1\ y̕+Bv0ȟ~)d߾}\ԩSGjժ%5k +J5`5$_%K,!E/ئ0zIFի%    ~%o-ҵ*dm9sL>]f̘!V9#{6mT˗yv*j?̙3G+;ܻwm#⋥]vҪU+|Q@@@@@@@@@@ L+Y֋  ,p@ q}i?:iS"%mB;-*.1x"IAHLL+V… K!5 ڊ7_SO=վ4jժCl*Ulٲ{9`-kիmG?k=?D?R\5T_~ԭ[׾J.y|   ġAqxP h[._~ .\~2OҶƍ_PZhh{6jH4ib35kfK爱@@@@@@@@@@x 2^ B@@ o;/q޽wh@(F[!1^XR%C}4D2ˡCCqV^-}s㮭Zۮs bjY޽{˓O>)'|r<&uC@@@@@@@@@Hg !  { Jzi ztݴ"gN1ajI&[ᅢaPC =#$mK.+VHpE-mA>a"EllJmy ' ̕+}uچ/ݎ\ۄ::ԶePPR]Cq4RCuxꩧǚ5kb76[o㩧=z?f@@@@@@@@@@  >  L鰖&-Y{or‚E;|Hҁ:K0H  4$q͢[nMBC;{C bt\xE/}E']Uϟ?Y4.+ ,^ ԡv    ylf̝!80իW{Vv[P=ifLZ}@>GMuy> H1 }2Rt?>yE2zhH           @ 2{@@ ̱`9{m$c\N,0)S&)QC4ӟMrNZ1@&yׅBC"8 u|Μ2dʔ쥝Cʕ+Yأ ~aM    dAFyal_?p Qzl#ΓfͶ+8  42Tϟ/}Eɐ!Cl8R@@@@@@@@@@A  q*w`pC }ܾ=iSi@G uBM6  @ L,r"?3@@@@  U<:"/Ҿ}|>矗CJR_֭[ge          @ Jӵr@@51;;DJ ;-+r"-Zas'-      Md,ڢ$r-rˠAM6rW31Re/Oj<͛4?c       }r۴i#-#F_1cHFf@@@@@@@@@@,"@d9  vWї;ׯ9r$P"ժ+UIHHZ>@@@@@@@ y1oݺ,\Pz!dK/Iz)          *@dr1@l[,_r:ܽ;75D Hz_Hm/       \$g|#<"ݺuoQ8 ]/@@@@@@@2^ȑ@ ,razxtQ $]ttMy)Yd@@@@@@@@@@ LuRV );jУ ԬhQ5/Ax"yfd6       Z2ed2}t0`ԪUK|Iݻw+aN@@@@@@@@@@ X@2J`6%K4q*3H*VDn)%KfT.       @Z 9bYsڵ-[СCo˘1c)          i*@dr@8Q D~-^kɗ/XH":԰GrIy@@@@@@@ k x^`<\`AygknAի'wu]'Oc[s#         ,39@HC v OE EJiJLG~RE;DOYRdn D&Ny]E%2 F@8شi3Fڵk'O=T\ߗʕ+˧~W2     \dٳgCSxfZm۶MZ5nXϟ/#F{L6l(sMn۶M9odҴ>#Gk @qFYe?,:t=yݱ =vRob83ƅ@ZG =7MfdPsRjU93>^Xv=~GfnބSI562w&~9       ħqk|B@!uC#/ ҿy牜rJ E|Pd"ڵdUo[W^ Aj? /땞 _ d{vsD7?oBϩHmm)}g-        @A*|  pL?̟/2ni#RH"-[sȂ"&r"nȶm"s][niZ\c43# Y^/aÆQ 6 qXn1id߾}vT @@@@I%R.`R=~qǡ ˙OIb8c 0aL:Ujժ%SLI5r@Y#,\mi}<5i~Rs{֭{qLuNct)6@JjZGtngZ"܌yp>cԟ]Yt lNMݪ5j$]wВ]؝ORrL@@@@@@@8 Ey@@(YBL?1Ob;*$ҤP"YDJ ;N.jΝ"~+"|},̿ ⵝhѢRpaoE/YD.b.kמp5/%K *u)k]xjg8HaJ߷f8pΕ+WezJ\w"HN"iu-ҹz N܌ip&٣}o5`i\ vCev9Gya~g        d_KM@2\@U_C_Pd9D*UWO+D N;M(7ëN@@L#wɄ dҥæv+m9eƍ妛nJo3f̐zKo޽\{>aiԨ 2D)"]W^2rHYh 6L|I9rΝ[n={|Wv哇zHUfBvՆU>n;_%cǎ~vتd~|ꩧuܴi3/QM~s$Vs]>uJ_rZ,֭z7Q=nr)؟׺ dҤI:Tre{[qv䮻 ^s{z-~G4X3keJ(P^zFsu\ᅴ!        *Vv<}Q@@ ^yy׹Uy9rh+X<_9st̳]w] L f:ׯ1={x&ҫ[ ӢE τKÎWXgg%ѣG{#ײeK     z/Mz( |[ڵzZ~Wjl{j1AL]TBMSk1~=Oymb@IDAT&,~Dj/lׄ{Um m&LҮ?m&оwhy8g)=m5vCYLg͛7{&3aj }E[ u{&4Wfͬ<`(7m&PLce˖-9q5ao ԿK. M]ŋ:i`Pkod<9;_,<,J{\{g)/xZj}"7Zgw N܌t9K=F&0`@]]=]up Mp7oȮMpK]#˴m68ީS'oeʔ Nc@@@gFd<!ꖕ^}ӞxmS\O>hKjHViA qE)z0] jh"Ki=4<mذNҰ%Jx۷owxM6˹ ~yr ҙ4G_p'8pBy6R!u_Oz뭶}\2 kv\w~>HC\YbGCvm'k@מQpm /i ߖܷ`ëS}rAϢ_4P0X,u߷XWr,?K=bG n0<p{Yo1XP ;; 꾺Q}pשXE}X:5VK.uC dL&7MzεXΓhװpj}m#7)w6a„梙F_+҇9~z]up:+rlcD;W "}vZU yiJ\:KFкuA:] u>aug^3wy|6lhJVtI68-󩧞\c9+d@@@@@@@He\(  MYH䧟D, Ed>\淂5E4i60O&8&  ?U1fĄ;W_}%SN={?3^nN:b:ڷ:tCKLY1{tjժ zLd;ر](cߛNrW/lb)M]x 1tӁYL'i;]1o:RbE1ab:2#Ç7|γk.6m-ZT~g;M}NAv:     K|g&͕ҥڶHy-@ᅴ勤QFXEEY K-0]ym4Ahup #k&=zӵ믿.wq?^:t &|2\h;!=ZLHH}Zmm&@QLL^M7ڱ:} w z\C\r߄>Q =ot͌:嶝CwMW^^# ^ݨ4kmkגұ/?M=JsX\c9t]@@@@@@@@ -L U։ @E~1ZPDk{lGb:-MG88U@@@b!;s9Nw~ ?vriҷ)I˲eD/a۶:~θA?y{g v WPC%S@ ҽ{wq7tPí     @6];IJ5Ph̙2Z[NvV  m;6V Keb [}>60MÊt.6m05k"/z3ׁm 0@4ȱw6Xb1NE Q{}mذ31upտOXD'j !:O|ݯp0!uX֭r]xyfdԬDž^hC~#.YnK/~t~*Urv=\Tg kvSۍ7(#Fx]{s$ܱʈ3~hɪU"^v~кty=4ibG/s-Һ3n+pڬ˦Toy?eȑ1;/g.q-[ݶqqC7=:שX}TZծB% p?~4 P!3_~ӱEp-Ev7OL95D@/0gΜd;Y\9TRɦkΝ;md+2oIGکwޱ˔)S$wܶvPְHE;57o~t֧I&Z?-Րw^7d2o@@@@@kE%vicuH{^z%zH:l!5n_>l"z-Ok׮Z|yɓ'ln Ӣ:MJ* `kc;IKX,mծQٱcGi3 L}sV%JYc_iw8?h{í•Ԭǽ+:utMr뭷ʐ!C 5\R{9rDWvz.?y}8~'G%{Sz Ȟ={ w2 V*h牫okA}b%Ova>dž|jޱH í+kse[h&k3G;帺Go'5cNƶÅuIGwK˖-o߾ӦM?##Kϥ+Bf̘a7}gwLtX]S\TO>C@@@@@@@" I@S4Id`RHzP~1=⋁]DNHbH2Nwj! W_}LaYge#ֱvjР]F뮻ۈCW]u}RLle˖vT4pr%dɒ+b;jgjժIm W#5kA@@@@BvvrJNhJ*mذi;3vt]y믿}={h[F^~6вcǎA@m۶]lٲRxqٶmL8Qw=>\slڴ)xܢW c9uֵxmp۞߾-_ê9IT'Wx,%DWvS2ҥh{i8cZkh-[dԩ2p@;w {uuyBtZzYfw2\9sQC5QCn]J!eРA@w'۠X7Kc秫Oa$5lݺu))m/{)m#irn> Ҳg;ԐXKnn}n˵-:)7՚4zvG5# i#pvtN+hSN9E b'i"-}o0_ino֮]k7( )SH6mC3v Ҁ)]>'X-*cƌ D?l}٨P>ݟ:6Op :3lgjPYڞwZ[kѐ>-ٺukLYXBYp:toWNJmAL}h׶XWDtU =h+"pnI7nXD/q6_~!'O6qB~7q7}<߷i ?/-SF!={7אRtiw!իW)O31s-$5,ܹz=H^)LL w? P}p{v<~]gvݳg.ve!rl#틻D;Ww/X?cF xy#]3cN o֢~tՆ:VA@ș3gaغoz\5TCu4O?{XNJVw[omjO?$iӦYX\c9\="       .`5J׮/  @b-\y/yzy^Z#>2J=G=oL۱R  'pmo۶mg|y=zL_tLg`8իW_bEtN=T@#|xXTHmjU~}￷^_-[~&ξv;icpЈ ߨQ#OږoR<:j͛ݦ_dBMwo? b =p+tXo MS,/W|yk)LX/R=e÷-jc)b&pC#N+5{>W"7 t >J*e[~Gr?1}MhdO{3Xu:F:^NwG.pD25\\w<ϑXXSZtޘXnݺ&K^ƍs>*Bct*"" `QPEEUqu]kU;"Ho;RI/"L{N6 $3|n-|$9s. ,ڳdɒWV/k =[ߔĞ{y)_'PwpIΙ359BL^#       BKYp)޽/ɏ\@BZX?_Zk;;ԸԪԲԢTRVנ}  @ >^/ pZvoJ&^M7J^ Gy[.:+Û$o 7nqMؓ7y77R%J~ 7Iޤ޽ە_O8-[Zj&7%@@@@\dߛ+F5j4;̙#G6lؠǏ $oo?YX%u }qTɓ&U׾3ʓ'E7%Y\n: 4H^K=Cz']cA夞ZxAY߷"SҗmU65IWIj[Z+̔'TG[Onvm2So+ ,*/>CW|| +5ǯM2E^YW]KQV, Zz)]QT,9߽ͮIg?m^^arY=I&Wr6'to|Ǔl/ĞC qA .O?iڴi.ZFr*UTFoL͒SƏM{-@ 2T@oE pano:oGJM0!VX@@@@@@@9@h )`i֜9 -h-5h m+=ȅ\MR  ,`H ɓGݻw$G@@@@@ ?lWcǎ. |0ECdɒzeu-@~.XE-Yf1n޼Y{Ѱa\ ČզM\1cƌQ*U2ȋʰnSN)Pm涋.d@fZrkߒ%K;x9?~\}WTnevmٲEk[y+jbB{+~I        y+f^Xz}!/Cfd @ ?/Z%͞I^h!_}?[:Gu@@U`zvkIy2ewm5G@@@ȖMͥ@DDr0 Ԋ̝;[[2Ç裏ˤP,  z믿^'NL}܉        d" \_Y$ۼw`AM] [fR\͕@@BQ`xrH@@@@ d?j'K]';'/(d:C-ZAi:}k׮zwTB`>uD A3g(wf tX%V-ɓ'?*r@ ;e3)R$Xr>o޼@@@@@@@9zi ذA        @DE@%Bʖ-qiƌTV\ 'йsR7          "@ `yR@ 6l^zIY*ZTjiT˥ϗ7)<\ʙ3ݪB        lp3fޗ46m}7oʞ=}YըQC ,ȴ:Q0          LO]FHSo[\YSGziP!פ;/]*X0 A@@@@@@@@,#+W.=. ܹsڴio]Ǐ2!           @H%ԵTd-̑&L *U        @2M TV>}k(QB~]JꫯB@@@@@@@@@::ϒ X\9RjBpLJr^}U7iJå9[@@@@@@@@LsN 6Lǎ_+Bϴ:Q0          /AK|@2] 2R5KzK&MޓZV:|XӫK@@@@@@@@ٲ9CTy_հaC͘1C*Ukp@@@@@@@@@@ L #d@D4mt]RٲRǎ'-^,RnR "         ,@ 8@ l$=TԦ4st}?>ȅs)˕@@\=i^*S&k8     @( 4kL;w3<#G(<<\^{ h[lիW2mG@@@@@@@@@ d< ?GޒZjՒƌzV֭z]+@@MdIS'),,9      -[6oǵw^nZ_/>"zѣ㏋s@@@@@@@@@HAf6e!$(%͘!'-+=T4}s4j԰as@@V뱹q@@@@@b (QBɓ3gN 0@5r"+V^p7޽~J?EٗUH          @& 2)@sI5jHW\!!/K~(u$Y  YMMFUaaR׮R     $,УG9r\j*VG}Tr (:u$g@@@@@@@@@@t V:= @ H}@~4otRQ@@{w)G-:^x     <]UYW [qi̘1Zv*UQFҗO<w=          Pn CB[9ƍ6mۥߗv^zI  'p-Ry O[г     @ZeKܛԩiӦy 2Y鿍}hz꥝;wf&@@@@@@@@@pAz @V8|XzR%i`aCiriΝZI@@HWK>zR޼;+@@@@@Hwܑϟɓ'uٳ ^ @@@@@@@@@@ = v פ!C$;RF !  E[ʙEDԯ.     Jܗ{=͛7O@sk֬СC          @2}\i[եS^'RB#  p~ K8     @lI\ػwdD-llJB@@@@@@@@@2H@M1 @(l.qT҇J7JKymD@@ :Hŋ_ςBȑ<@@@@@@2AzꩧԽ{w.\ص8,,L%{_pY|yB9         U~$3@ 47w/;VF)[  'ӧO̙3n{mϟ?/;wye˺2ʕMDɨٳg~훠jrx"\> -F@@@@%PbE >mQ^t 6hܹ={fΜ}to?ݽ֏ߣG^ZŊ_RoΞ=;w\{Xq7ג'Y|cq_̙Sʕm׶1ܹs'4#         @: 2`/΍^xAz9T)i  Ϟ6" YEĉ:|:#Gѣn?бctXz{oh]Zx_G>N3@d|T`A*T(uѢEUH/^"""'fbŊ)^(Qh$@@@@@@@@@ } 6m fϖF%m?Bv  $ `wڥm۶mΝ͎6K6y6 ^ذaC&ZCfmBMĽ4hz!hdFoc9[z{m%}6c|'!          uDH7ڶ&O ,cΜ9_9r |&`!W@@@@ 6jߛ+7s Io-@$yԐ `A֬YjmQuֹmϞ=.W WJ8ըQ~V*UD4sk?~\,kٶyf>9rp ֭+f"X         @ZVAG-R&G|ԤIl$MB@𛀭1zj͚5Ksuہyd5k&f#¸C%mn[diKvکcǎ*[lN@@@@ACJ!#0et5ҩSR޼!47Yt[gժUY߿-d}o_vm҂ȊՂBnذAշ虍Y`Ȇ *[,Y6!         @`7BƍqŃ@@ ٣Sj駟tAߎ]06mȶ?*sʕU!8r,Xk?2$ܹsnBr@IDATNԥK2_|!*D@@@@ 3ꔉZݺI'OJt 8vK]p h p,] T~}\2;O8{ i WY-`b 7F& ڴiS8ZV'!         8 |#-|;RΜ!@@@Xl&N)ShժU*P gA:v&dQ!pir̙eW DڡCu]]wʕ+UL@@@!Aæ' y℔?U/S*{n͞=[sq [NQQQ.cդISFT`L#"/_%K`wA![nv         O@>  @ L$#IF8G@Xt>3M0A;wTZԣG]}jӦ }1/ ÇԶGe˖իn&-[6jKU@@@@ 29rO?`Y3f~oBvս{wJ$!        YK@Yy@ [a^V7R|;7  d!^^{MSLQ tm_~QFj%M uH7>  }ݧ*U:G@@@4 2܎@~A*1`4dFEEi7n k.тuE-ZPΜ9T8rfΜS Su릛n%\@@@@@@@@@Aȃ @|bjDYS),,8  Ο??\=yQ¯Z 2D_~٬uYX;v^u =7n[M@@@@ =@@]B6nܸQGv}{UǎճgO]s5*W\06:#'`]WXJ_~we˖[Էo_)R'@@@@@@@@@,*=f!$C?> @@ |[+B۶mӄ ԩS'@fM(X UViƌ:y6m* ~n    @V\OKUN-^X#G5m4u] #B 0-PO [l7 ڿ-Z(q         @ 2UE)K~(-Ϝ @@ V^viѣvء_|Q+V S?M}:u.]3gΨaÆ6l;ne1    O2*yfVNǏרQTre=C˭[jٺ;UX̪"@: \z.(-fΝszm۶ɓӹtG@@@@@@@@HAf6e!"!=tmRR)  zgԴiS.]ZHZxt/ƍs+{իWOӧOSO@@@@BV +<{^z%UZ[CΝ;]UT gKElƎ۷WfmF@@@@@@@@,)@ ,Xi 1%~g@@ÇuWW_VR i`TT.ru-Cʋ[Ⱦ}4zhx1bD!RΝUn]/(m:ty䑀nn\>m۶-iVVM7ݤJ>lׁ@@@@@ ^tP3g~z7kڵosΔdv߾?{l=cjذ[zwt5^}2ٳ6m|AU^]ʕsK.޽z={o         LW^2GSW[oʗQ+@@ $֭[رcZ|ZDnϟך5krJN;wԢE4qDV|zL|Lm@8?כoCeGJ ڿx7&<8q"%F@BN+TLOXbinRZfL\m޼1cz)k3g`nuG@@@@ K [ Zf/_ҥKܳoѣo5qDm}x+VPA֞2eD[ݷo _=z~lKiwx?]OnWZU=zP.]\H_9wyk>nqO>D7nt}ߧO_}.^~e]}6lXљ$ƅݫ[n%znOj"9c6d۶m-dAL~[ʱgu|-vZ}{FիWOpl&vYȄkbHN=38}6,#˧,@@@@@@@@@ dO܉ Un0֜:# T&j*:aJ6QZIQQQZ~ h-~4hnF=jѢ .7[-% ؿ &Eڳ6p߾}nѣׯ h8p|3D^ԩSMKlRɶ+YI C u_&31#{u׹6aRB툕QyG}v͘1#[A@@@@zxt]'x SOVo4ig>p}vMzȑCs `S<CoŵU6akUZk[DZz뭷X۫I&.aRtM7w-Je|Io}v̼3n2I 8|ppٲŨ|m%>cnn鲶Z˘ *Խ{w7s 7lA+߸PRMM%6XzI#zfy ٺukfF(@@@@@@@@@ Lw A-TlP7# $S v9We%KtA7n]' ,EGs/_|ۏ3g ]v;f֮]&N֯__mڴq =*yܹ{Mܼ]G dh-\RfyX0F&{.LGҥՠAwE*UԡCٱ|н gcpΜ9xzBS6`vSNʕ+_6N={vY# _ ,Zߺu hl,K.ѨQ\Ǐw6`Zn:n M)acXo:˷XVRe%5Fpa5\##ț7~a*T(V *,p% i2&'%GI]=WGRHN]3{2u(2@@@@@@@@@R)p!@*o6@(_75F@HbŊt#wܱrI,Pak >hno?ڶm ~nwMd7n켬,/|7o&>&#P h0Jn'(22R_}'OZj2˔lu|qM4IEqR-+IgΜqur׮]z_T/ϋN=j&ZKM6ɮ+VБ#GArAh    #L :$7~@NqڵkGWg͚gϺvo?"Swm([ȗշ߲eKDRzWԽ{Ő|eꫯ\3]uU.(ĉumE-e&mص)Iscvo%lI:vv-DelYJnl*KPH6m'GJQR&{io1O8>)R;          JC@@@P k49,,,޺:Tϟ׻ᆱ={hժUkܵ4&d)G.Hp.ѣc^^/K.6lؠ-[&'xvթL2zwTF M<"|y^tJ*^ڵSseo5me2-mܸQ+WVZ]?m悘q:    YNM-h-ȓR|7# l2SL3nܾ}ZY@Ӷj- |c1|7p򇍑XŴ[VbcׯwUZ}?gr>K]|mm@گ]%d =        $.;JBr@@@HꫯĉDS"E\?0`|-^oڱcG˗/ޗ.]:߮;jܸqzWۋ| 6i4n)M%K\ũS~EFFe˖.e߾}]=?S{|y:7V~޽߻2\r9:uN8:h@&M~mGͼy\@R"!    @x1\ @-ZP͚5;p\[ƌsΩgϞ:zhtmշoc)|Ǝ+_6mz]G_dIwc&b7{Oj'FrIdH3J]bc>׌h\-ho/y!         ח@@@4{G^{L? Iwvݫ~Zւ^ve9sۋK*o޼XXX>3)SF=f͚e]׿UQ1f /X@<$ gϞuVVM bŊϟ?kΝ@>J*O?TW_}宏gt&~zaC-dΝUX1ɓ'c9_U7p kݺu|ji> ^zV F@@@@)zw4eʔo8 =䓮ov ,q:TS>}zjٳu+ŷ,&x֭moJθA7`rJjA1V 2,%X7Mb(qeUb>׌hG*-C qc`#FHZ.@@@@@@@@@Aγ&   U5J=.\׼Sٱc-ВMرc{T}{aA-m2TRSz饗9 xywڸqk{ѢEu!w3?MNj*wR5a]yze_~9V)W;=uT_&o^O=sxxTf͚Ǎҭ[7wM6n7Oksrѷ޽۽>z*TǎZ_|r;wN&MҚ5k\9sM&܌kGyYܗ^XP ~ꫯW    @D lKzҷ~Vme__X~ܾܴ[y1x -ltw~~[0@Ϸd &YǺuH"bAѣ]=C[@խD;x;e-rqwN~sl#h޼[j޼y][lG}EԩSzdiS|3o%vGjmKN;Q qXɓxR8         Y >Tso_x}7 IZ  ~ 6Y *52ɡwyf͚.UdI=#ڳgN<&IvJRF/^,XB֪U+KԸqc7/ЦM㏻zoCɩvWvqj6ͨO>С;rʔ) |4hQ rJz'ճgOVkY.̙3,;C>̵&v]ÇwA.ӌJVСC]'N&ȞODDnv-[̵{Μ9j۶z=_^vjA/^쌬_~}](jGRɣ6Ҝlbܿ:v$ݤ^M&!    0 Y'=TpƔRZnյ汾3mO>qA_قYO?r|9BE8[@'Q+[oMs߾-e[dũ,-dcժUS~\?-LS7oQXlbŊ{ fiff6&bq ٚ;wyo߾ݍ'X= Yl,#IU&:F`6{7ll7ߔ-հaCUΝ,',,-ehY-}N3ܔ3oe˖>l$sdzInr=믿]vYZ^@@@@@@@@@LMWw\HBPl}B0"B@!C\ķzKs ,Z_6tÆ :~ h)Sk֭dm9i1ZK$j/}ɮ\jƼϮK(O_;vMz|stY|im۶M#Fкu\{j/`[&;MbSO@@@xc3ޜ xԼ>Kre[@? fh^{5i&8*ZK3g'O0W\*QE;t뻷3>|Xk׮uATT7HT\TY1, `j NŷhURX>II=Q#kz#5my%x-Df+lA>15         @` 20 BMGFK  @ >|zW^yIa)xb6ꫯNzKL4^3諯J4B i̙^ܓ N٭[7۱nW^y&L+d̋/f{pB 8PNҤIte%v9@@@@oQc@f ,]*5k&X|UX=zuwɔ L6#    @& d~po횠L /!C&M>u 4E%X S\xn>xCdĹĉ裏ꫯ1b~s(NE@@@@@@@@ lQ^WY{_[t 6/N{qZH  !*zK#GTɒ%o& d~s7O?TRnޫ-[&7&Pn2e͚5ݾm۶]g*   %xl`=jZ+VHK7Kի۷l+nj+Ekn+W.G @ IY~>+VLnIٳgP   0 Z%]viTF0$vݭ/ڰa:uފ]w/b!@P [N_~Ǝݬnݺiڵ‚mT@@@@@@@@@bf_l@@@BBXbzg}vq׿ŋC€F\  +<{ƍΝ;N:Ztƌ#dٷo_@    dbt}Vi}֬Y nݺ9rʔ)7_}Umٲ%4v R;w{1]z饪WNk׮] wW/L~  .`Əw}WsqW^=؛G&wcz_3#P٪U+@@@@4 0fB2@ kJK6Hk::͛Y[f͚ꪫԩS'o^ PIBM`۶m>}f̘iӦرcjݺZ]Zj^@@@@@@@@@ d#@ 0(To:ur[˖-b]n@@@@ 0VAG ^jՒk',YKmŊrRڵ@]:[pJ*)#!gϞu3֭Ӛ5k`~ǎNlٲjڴ4iZɒ%CP&#        T@)z@ x# ,g͝;msΟ?/gޚ5k& i#!}6 yٲe˗/ɓ'U@YǶm*<<\1Iey@@@@ ]MW^2G Q͛5'J]襜#]EmnJ{5=h۪W|ɍݘf/ 6~WH9aÆ1ϛZ#         @ @x @&e 6E! !.p -]T-?ܹө.]ڛ{ի뻽M ͛7on8k;8O $a"Eî,VMRPbKKֶE[ZWb]^m"UA}{'=7!.y̝;97+|E/_\>lWK `5R?שS'vh9   cPk1b^&#D1jn޽{mʕ+Ei@{'qסC׹sgҥܕ͛Ws 9< 4T67 e})uJLLnݺI}~$4^z-@@@@@@@@@D J6E=  @d ڵ \.]*e͚5rq;`4--MӥGvjF#Զ@aaTvZAz]߆N6TB322_~dB@@@]~_4 L7D(E"GsKkmGPHP=WnjC"7/;v}! j<[rssm`M]ϣt@N:R 0gQLJ&4@@@@@@@@@  C@ 0(@@:N^TAGOJJΝ;ygqs-:hEUBĉ|7o,6l7ڹ. `Y\\lOժU+;RC?]ի*@@@8_;VNIiiE/0 )j}Z4O]Ѿ;v"Mu6}Ү];qs]ҦM / Z'߿l߾ݖ|Blٲ>ܤA4,uY YaN9         @m ԭs^@@@@@w޶xgi uف ._~Yvۼ~vОӁ}:P չҨQ#>,/BuXhcnnN uS:Rˈ#k׮ҭ[7[6m|@@@@D >dgϞwcǎi[v}+V߶ѣv>e t-[WeQnyҬY3INNԥ‡Z(,,={ݻmٹs-y>HkBCP߾}mhJJ}Vsh(         ,@d8_   @ = u2|$8 7oEF,YbC u0P@QCrƍAb3o>ٻwo.5QԹlsאGD7322$33S:vhY\Zj'     PAքrQ^= }PI5п`@^j/@Pg M4}Y%ZeR uYj0Ç3}ΠhCyEG5kzd}A.гK.9<mVY           W6    :W^T|/npe$a:_f]AN:\||C3z`HhJRRR:xQjp+f4[TeKǏmRѲ~w!ۮ}mW6]:?3--MWj Թ֝ @@@@ J&-P5dP]\]@Ljվh&CZ\8>pEex=/p t^h{u='y٢[y±clq:/,,E/-lACI!mMYv%t_&@@@@@@@@@bQ X@@@:u%&@F n`Νdʔ&Dѓ[nu?^:pRR`G=vـG78]0tnNjll߾;zXowocj+:p @@@@d;ȫQ^t` { .Qsn(ڵ>\FYgn@_T-keR"ifE.u}&ݲ ,;אJ`nZ .7L          pA{    @ IM4y)mHvHF-D&O#};fPq@@@@@\ӽk' ae}6ZyYD>,kI@@@@@@@@@@ X b;@@@)B #.qvϑ*j     HCHI͍ζ*@@@@@@@@@bQ X@@@ hdVH@ƺG s@@@@Y\--HM)(),IL,@@@@@@@@@@ kF@@@@\e""xZ84a)@@@@@vbNP))"'eHε\N         U ʄ@@@E@C 33Erre@IDAT3]' s@@@@GKhRSK>YZO         DAyݨ5   X@C ?ұ$#    @4Ǘ h<6mDDrsu          iAF    rlHvHFFO$ 2,/ B@@@@pAw;  'ҾH^^T*"         @AVJ    )aN9    D ,.VPw ކo@@@@@@@@@@ 2D-@@@@b=ґ$#    @ WzAl         *@d^   *@di^ K{ @@@@[`$\'JJQH&"?"[w{̖̚l         .@d_!   ! |R wa-    @z"3g\?/GB K)4RP@@@@@@@@@@ Ι@@@@ 20iD&O>=|    ԖqyMoD@jHAHaaԘz"         @EueB@@@bCளAa:%@@@@}>}DuY\uU &"y"[ti          /e@@@@ Z<+ӦAN~j5     P7 R75,RSKΔWSg<          P]AV,E@@@LeDE22¦ja] P9@@@@b^kEgЀqD@6" "         N &@@@@Ȭ,B O*jN'O    Ԟ@ǎ"C|Hqqzh@UW^'"] .NCHo G@@@@@@@@@    @ eEvᏄAVE}@@@@@:$7pHjZh @@@@@@@@@@ O@@@bB C{q 'GC@@@@|"*R\Nj,!MpM--         ĦAyi5   Q-!3S6mj/snn50D     @rHfȻ줡Ʉ@4 ̚-M         ĖAui-   Q/!YY"V+Ǐ6!5@ kRs!    @0&̜Ye|"' yy          PZ |B@@@p![NX##ܚ:a{m    (pe"8PqbQ6NJ@jHAHaHbbv"         }L    @ eD~A <8-0iD&O>=L+I@@@@@ &6u̘.@ ' Ȗ-2ڃ         @l ԍZ@@@Fl^[ ҢEhlnشI u0HO    LzݱcǤΏ?.z\TT$'N٭-ɆKϞ;d܏%..RN/u}億[tIshzl&jK 5yy";V-8/         TU Ȫ ?   Ԫ@Ȍ IСCk^rrHd\qډ    xٿr!߲;|1G& g\/+VLo;9Bdׯ/ 4s]QFҰaCrƍI&5 ZR*[G@@@@@@@@@H 2uD@@@r423S$'G$;[DC ?./ &+C/@dM9"    +PTT${]v*w{\i=V4%9C 6.y撒R* Q]PbyzL]rݺum"/g-wR:5NoxwR).. />1;vu tsLsNY6@S?+U!mi֬IsnѢE۩St t u         Dg_aڇ   @ M]t1_:4J[" 2< B@@@ iϗm۶ٲ}vٱc4߷o @ojp tiiie lڴ e= ZDs}5X6Skˆv_ޮPO-\?i8^VZI֭OiFڶm+ڵsL)`2W KG@@@@@@@@@ `@@@"EHEҽ{HiNԓ0Ȩ4@@@@?n$77Wn*[l)Ut?o' P?׫W/>| @#/W/9Ok׮REA˪UlXjT~}پ}{СCRSS%$&$$rhm0!         @ #   :9+K$'G$;[$#‚ dȐ!W1jN    G7eÆ vy⊆<ۖI˖-mS.Bi׮ k۶kdR$%Fu*jN:=j \Ξ=ܹS<ϳnj;+gq=gΝE=ҍLF̚Cr0@@@@@@@@@a k!   e#kIN$Ye L@@@@"H`n:Yvm?j؞ kԨ ༾}ѣ%դiр= W^F6ǎXk[l!4TCJ5k׮ҭ[Rs d @JrD@@@@@@@@@9 kΚ3!   @ ܰa:dȐ*]C!@d(9    @8 ʕ+eղf[tYoCt"zA:u:oѢE85 PaKT4ڵKO~ƍ_ B3g ,..kNz!}z0RP RX(xaO@@@@@@@@@= kϞ3#   @@,X 2p f)@durl@@@@8|,_\-[f+VݻwSlRwn%\b}A'' xȖ-b='@@@@@@@@@ QC@@@bZ HE?_b,Od8]     PV@C,Y"/?\.]*Zw INN>[z%cǎs]nժU45==ݖ+YrhK/${:u؀վ}J~KϟpRCjjɺ< Oa          !@dd\'j   @L hdfHNHvHFF` oķ5.@dsB@@@@ ֭['͓ ȢEdŊ61դiW_-}1}VQX+AÇ6m2rdٲe6G\ٻwo4h 2D &]v5&۴IHcͧ         DAQqi   '!YY@߿}Q" "@@@@ V^m^2-s̱۷od9s+~X  [QeG@W\qF%KdŲpB1cݻWژD @ .@z'VD:tˋN@@@@@@@@@O 軦@@@C |ː!C" .@@@@ |v)~̚5K%55=PC4E Z@/2[牆.X@Ν+o|Cvj&N(6mKʔ)Sd@%Ԫ=@zO{#4Rz{KaJI͍@@@@@@@@@bS ؼ@@@J6dr:thX 2"   ɏcI1g?dȑvZrұcG@ޠ}3ޡ=E-<Fr+;         +@d^{Z   @XT5R1|iڴ+,D% 2x+D@@@bM@Cn6ڵ,^X{9ٸqL2Etk w=D%zO{c"5YlRvE@@@@@@@@@Z 91   "R5sϕʻ: 䩧L~Vq+Uݕ0H0Oׯ~j7xC<   #pQ:uy晲yfe֬Y%u)gY1#G/fNX,۶mgyFƌ#sOo#cMU&S}PS|=E-6m'Ԓښn*M}u]^zھ熺=@@@@@@@@@#݃    @BUY` :4`tNwٳg{' OMa;T6EK;l0N8Qmߖ}رc>p`@@@@rrrlk&-j{bY|,[Lt' O䭷ޒ={CzPU6w5>ʫCM{F9HڴIH=_7s='_~{n56C#         `䇀   5.-[@A2eݻmVm?l[n`6m! _~2~x{mԩS-H֫WO|j9>E@@@jKW_s=Wdɒ%2rڪJkի%>Aɓ˭[<~4 B3>]ާk_cF9z{ދ"aA$/j[O0A222N 5umsk@@@@@@@@@ xi>   ԰@(C , ˛6m$^{|}]]}TacǎU;w0HxvdmdB<Ե5J֯_Cs<@@@@^~e駟qZ=*;qrrreTuF<{WfϞ-yfk]jt뇯UaG>[:ѰD}SJʩAwko qmsՍ@@@@@@@@@@U`@@@v Ȩ)x i֬|ߔTKꫯeĈc9slݺUnR'W_|;{^u?-۷o~=#M6"}ɣ>*O9b~:;e\NqqqmtR   Ġիms{O%58mɒ%oھ.Lz)/_JJ&MG[=>(5k=t57 \(}ĉcƌ}`ӤIdȐ!~?)3f̐iӦɋ/(m<``?r-Ot*I~'JI{衇窴3v&ݮ6U7jTQsE{X+b&z*8pDbރOyg_tY|AiӦ:5@^xAK;f_ӧ g-^aÆ]w%s̱Z4矷eﹺ[oe{u+K.ѯn?         y;zȦc=O  @ ߤ_=|G@@Waϻk- M;?y&l9rqF L(ضmu]w7{lO͛7Ϯ3|^rr=֧~v w6k1|& 3Ǐ2=Hiיk}Zn:t3Yge|ۜwy dτ^[~g%'|3!&ҷM$/LxΫc2=30=3秿ve ;0!1ݽ{  GU;o3ᡕ3w<]0yLxe|@@@@yٛxΓ G>Ǐ{+Wl?xE# G M2}ޠAv&`L[ͥKuG]oxgӟۼy؁|U`\stMv4 }:u JQ 6S`ѴMݴNnvτmz&XüjgBPk]*kC0)PߴTQsE&d֭gߺ~HV#7tݞ.e0yAիm{an}ivv\3==3 ĄI6l`ú7'}&su;5o۹s׿o/ܷ|Wz'N}^pݾ]vuP]ayyyg?5ҁ:L7mf֬YX=`td F z!AV[zʊoGC*0!   ^?y1)^ lРOq:jNO:vAN_`\_ԗQFm~>G7A/*6вF u[6^Pw 7}%<:ӏ},Ybq}ggέU[Cg\YqMM;@닑/^ܤt}ܵkIQ<S%5 [ƺAKܤM6uʮ w`\}Rnn-zAnzh*+oժw^/Dsoe˖L[_+,          &u˄   T#"YY"˖dgddT3gg6tPAM̝;Wg|Mo-[L:@;7ńD8h??.] z`F;7ic-M4kF׿ںpJ9z^bB& x3Ү`Z߲.tQLbL/K1v?INN6LZ_IϗdG?wYRɓKsU//CM{mM3`t+B'~HIIq?/&L7TTT$/G?-I~e{7WK,{ߜ,         ČA1si(   5/P]!ڒu5kLtt@N_}[e jtխ[Mu/EUgn.DRCN:[ ho~;0{…o HPn+:XZC%z)?Qƍk< ]JbE.5}JtN܀^Gv;9sd֬Yxbٵk [s`~K.08,#    1#]vYT4Bm.7t3l݋J>O2/Zia `Z.t޽m M_85J}ݓljC)PI`eVwv֭[˔)Sl(6==ѹGrޓN˚5>m.Ao@_Skwq|G/>g}AjP.j3g}ѣOS7olw T@;@@@@@@@@@jC 6N9@@@@ 423S`P1CELaHVZ С]ߦMRsPK A~;f6l(:R,=zT|MIHH:Q"M:sϵ¯Z[ &BNFXv:|l߾Ӧ >M:͜9۷D ׼<ٴiSmo̅H.YD Kmo~ҢaL    @4 x㍢/@9tP46צ~l򗿈5k?ʿ믗#Fk&?PYT郆Knرc,i_꥗^*{h`y_oM5sjC<`wv7*lߴn]~"ZEzObO=Y=]`kDe\zӗgM:UƏ/Vw ^EEE6,W_׿%cǎ='Rs         -@dt__Z   @Ȝ F 4ȶgC s71PP_C>}}g&m,X ?ǀsԨw'?kNF-~ wunZ^z%fOkxa.]QF2c Yt8:ZNn޼ٷ.ZByYgY^xA<#裏o`ܹuAcח.H7o.8o<6:U':T[֭[%777`ٽ{=    &p=H&MlS6j{4H뮓|/Y*dN\?REQ{=V:u_mʏ~#3gۮ(]esR/NqSپ/|v_.)))Ai0^}v_ qnҾ4#Tmu4\C0 Tʾ 5~뭷lmڔ.Grc{ޛ}wbOɶmC^`kAiiiOˬJJ_~}/M0X{fuc@@@@@@@@@ 2C@@@ j"RQ:wlmv%:M|l7@}C u9//OgM7$77|S.by'nkVOn-((y4iӦv`:Kw߿~kAiС6pҤIv/SL';<ԩ 8nm* nTY|s9HVV|ߕ_M+: 'rӦMfOj'Nx>_;^@$Yh,Y$`sOwL    @$ 4lPoڞ}xHX!Tދ=nV4j(رLΝ;z> |W Iƌ#9f3ӷi7>R}I3<#eԩvw}BNsIzzhNI}Qoa_jo@/:ih7Sb7]Nϸ6o&W5޳g=ܫjN^رc /ѿ%}–VVk>#O[SZ Vg"0W}~ի 6̆_s5'qI_Ԥz }Ve;@@@@@@@@@@iX„ bDz֏! DÞwע-[Vm_5hꪫ{&L A ̠E >3}0X^׮]g3{ᇽ9sZ,Xv[?--͛5kgz&KHHu{}_;<3@ڷѣuV:]0=niפI ֮]%''{&K/NOh뙁Ԟ,i3<=3;"ʧiho7:?:z vz}: ZjoDŽn߀nWTT}ݞkcz&L3Ͻ믿ޛ;w=\E%sʲ$N}'|r*`[@@@yÚĒaO }1'szE y!>:'?mKb<XxRm̋g<lxz]?J~*= ~z+WN+ㆪ?JOVg^TcA̼3ay\^ϯߖx&$~ӏ;xmڴ袋<3ΰ== @&OlJVëjkhemAUQNoթ켲~ZgСSg7nÛD\s^AISr^mC\^c 72%߳]4=W{/SgB};vSYM/g^>yy\瘗uy +u4;_@@@@@@@@@0z7$UWCr8 P qq"z;!@@bZLldbe׮]b 1AbBO: N3hPL'}hv|b j@ۗnb* }sNiٲsE Zo3V^ٲe=y?x[Nt"&EE&O6M;OyfyQիWˁ l zvfߟ ⴿ3@vU-:@@@@ ,x[ˢ,<}TlsݻwKf*k ?*?JŴRs=g~LiѢEUIWynSUq} b2`PVQr7 ߹#ѿC{Geu8z$%% שg-U_eu{@@@@@@@@@B%@d$9 ! < E5@@H93ꫯSF @ CY'   +]{}~YhzPڷoOu̙4oq_ H kݺ[P5,UA%bj |G 4H{1ݻ)#\65YMPS~Vz          ucѴ@@@B'!YY"99"";vEG*((kСC+ڄ1"p% Hi&    Ȗm:̙#SLN:| V_~咞(vlvAnm9Zy_yd;ërZ߷gGdҵkZ@@@@@@@@@@ Ή@@@@ ̬HmmFUNXm۶pAn)jm{14iRԶ!   @l h@A~gO\ ]t}{r5HZZZl-UN8!'NFu7~ &T!?Tm Y@Seܴi+/_mCe,X ?C4nݺe¥R 6,\C=@@@@@@@@@     q*@IDATi VVG믟VceXim穄A1s}IFFF97D@@@@?/ӦM_~.{2x`ַ%G]UuԑG}wXtf~֭~[z-Yp ?[k-Z_P]gBiӦ ]ӣ4@@@@@@@@@ +F}@@@ wݖ0 a$lJ;vl    T&nwq-W3f / ?яgϞr%\"Æ UHNNʼy?{OVZ%g}3F~iМ)u´WQ#@@@@@@@@@(_ ]X   vdb5V 0#FٳG@@@@ Bz!?lYv;c=&u5h:v]6j#@"Yd|Gwܹ;<8qdeeIn[IH͍*@@@@@@@@@U h @@@jH3vRrrDE22$* ~Jbbb    -o'O2k,Ӈ-/?Fɐ!Cl|1?O>D?G@@@Aƍѣmn߾]̙#͓3gԩS<ѣ 0W#III5XSN =zT}^Z䬳ΒaÆ 7 ۦMsRRN@@@@@@@@@"^ Ȉ4@@@ 9CAvIlA    @8 hPW_m!--=l۶M֭+钑! >p%4/5kHQQmV $\s{AL' 枼5          Aﵡf   @ff)-fsXTJ @0#Fٳ?yPb#@@@@ .ע\ҥKmyMZIZ˖-W^ҳgO޽k*ϗ/RVZ%+W;w=SMa߾}e̘1vޯ_?uL ܶ̚l         !@dx\j   @X hdV!ayqTAj+"Gdž    'sZFkݻeb ;1oye޽v&MșgiC!5k׮tE7o; Ċ|ײn:[4QW_}% 6Tw2vXYgL$*@@@@@@@@@@)i΃   @ hdf&!v٨nAjdaa,X@FYF@@@U sj 'N % Hg@@@@@@@@@H 2uD@@@F\YTL'QO) jSA@@@@NI@tX5PҿCDsD!5х5/u.ySfK|_8 ypII]./҅Uj et.~0g鮁LRJnn(ȱ@@@@@@@@@@:N]   @ Ոw'-'0a$    &ZZj57Ҵȇ\|qV!P-))"fUˡ9(         }9Q}IHwDT@@Eѫ"ņ\Ċ/vEi{/{udd73̜s; s8A A"@@@B #,p L.qA@@@@ 2\*MAn}          J   @*ȶmE.:UzTt* @@@@ #D̐-*oș3"3 E@@@@@@@@@ DLB@@@ %KEW06@@@@)6HtY.e! E8Ȏ"JEBi#         [ }9z@@@T&!mڈ,]Jd*;n"L"    f2=f9$@Ѣ*پ d @@@@@@@@@,@d )@@@ 22  < @@@@+1#A5cȟ_$}zmۢx8 @@@@@@@@@] h?   F@C ۶YTdTaAAs@@@@O C ТHVpaۓ6@@@@@@@@@@ TAG@@@ %K SEP00<)4 @@@@L^H $s         Q#@dԜJ@@@܄5$V0Ċ=    )'AgΤ\Ԍ@J hm@ ;v?/R?YB@@@@@@@@@ 2-@@@@ I,ҥH#ҧz          Nié1@@@8rDD 5{#8  l 8PD C!<~޳    #Ag&O]Ԃ@8;RۦFC+i          2@@@ADNPԷnu[O@ ;w=:v=D֯w     Z 0@"UA p;_@@@@@@@@@W?s?@@@Q D.\uBz5a C ݒcbD^}+    $@ A&3u+\xy)QA@@@@@@@@@ 2-@@@@ Q}&rx»hM9|W&!=Ή|֭o'     \ Ii!ЮH"i޴_6i{@@@@@@@@@@  Ak@@@HP@CzKߛicL"={^ ӠB|oZr!n:w"    @4$ZM@C_y%vtݵ^;@@@@@@@@@ \@@@ |ȁo.H֬"{!2`Ho@ݺ"7|, `o:^dPݻۂ     L <{6%R!p睱5J@@@@@@@@@RAs   )x5ϕKDvO$w>g B#Po,[&ҮH4"qD{gE@@@@ dHdpE)-RE/$}G:wfK@@@@@@@@@O ;'@@@}w)Q?A| Ȏ"?/-X!ZUdkEtINDzO:hkYF@@@@Pd@d(\)32թs8 Z         @3,=u4G   ].\sy&uMk|/^9LDZsBY4i콬ߧ5It&E{.F^z)"\}9y≣ҩ)9~<>#ӧZ$@ٲ"_~)"o-2tf }C~MGCԩSrY;o.od0W]Κ5Ν[r%2e @@@@ 2NM H@}ḳyVT h?`nW9sfݏ @@@@@@@@@+ƄX!:uTΘ1)R@/C;ݱc˦D@H]ӧOɓ'e}k~Μ9cgw}xAmDf~̣|O: ;{9cƌ6,N_Ztŝ_uUv;}ug\u Q`n4RALFٹS$[Dt`MdÆ uVٶmuyraj^Wc ̛7)RD-*ŊVPA (pe   XcHy}E^dʔo -Hǵ~;8p?zWt1Ǐ,Qj)|}@ٳ{^uYJ9sܓzj@@@@@@@@@T)*F@@Ry@:L'Nx^4Q ` ^yȑ#`B 3e_t ײN鲾zqץ1Y/]}^ŝ5:=kצOʅ 2s/ u}9n@{7HS t60Nxz ϴ,ZYd1AxYE_A_;P?}0!  "~(2pU[-K/VuME5QrIf$OcB $ڏX;6OyϞ=y߾}-n#CjHjW_}'PQ{.ƷG2/iR iߐY ,w%zٽ}Mz{Ҿ8=|ه47D_paϬ˙@@@@@@@@@v s|   :{T#G.{jpc|p=d:K~Jsgu_sOҥG@@Y׹5Pԝ@Qwty4AqgutQzt5( P hҥKe&/ɝ{_w%GKժe䦛n^zᤴI!uNmAWT? ժUKÆ EvPnba{@@@@CtMQZ>xk֭i&;oٲžw_5Qq'S+T'P痼yY  oLwo1 gM藴H1߿?9w\oXbv.^}-QyRi)U P            p3g*GhȢti7VR%V@Y: +@F7$J^r|^ jÇ=VƝt`q_˗W1!N8Q&M$SL{kAr^zdμ\w ipTֹy*߸q̛7 6?gniٲ4mT2ek?     R~wlJN"m6Yf[k׮G7QzVPp… {fw ;2>ϣʕ>lI+VhH         @`5SK%)@ &Cwc`Ly ^ ۳g5]W7}PGw+!nw.W\ngL ЀH jNUx3j2o޼n@d@>g ke~ ;v{9suҨQ#آE YhhjL'N3fؠK \| [3;JVlPq/ǁ   @bM#|>[÷_6%F_tWXaC5XPt҇@-[ֆk2el ,XPA:L!p$nٲE6md 6x<7olb-ՠʕ+KJZjRzu~8@@@@@@@@@ ` H \<(7|s=ҪU+ɔ)S6. jk}̘12l0YbԬYS~aڵk SA@@@RPħj'0bvb f .Ȓ%Kj̙#:=\J(!jղz) h̚5kdٲexbpP>ltW. 6^keRG         RA<")$Z@d͛7Y}eOmJcpƸ!l k ٳgOcBNqDh54/n^h;ȝ;|Wu.^,Y3g˖ͳ- X~2Œ @_>?+| ̞=[ b!ի<裢L   Dl>,ұc4%dž@x |HN"V,S \xM:Uf̘!3gΔGJ\~ҠAZ^={L'46mKΝkg =wiҤ4mTZhAh|G@@@@@@@@AAa@ rx9犖"$,4Qù6l`_uƍ'Obbblx\X1/Zd̘1HÇ9 Omiږ*UJJ.meJ2eD_َ hp>}dȑ^]޽{e2x`BS2eXl   @ a'F/zș3"2D!ƍ'ʔ)SR`Aqv\ߘHSl0!̚5Kt] e˖rM7pH̾         q+{@ x'CPzjYf}]vgtra4Mмg z$+ /  ĉA;w*ʕKʗ/ogsŊm`$/$ٿ`¯~6mZ;֯C>w}W4ޓ:ݏ @@@4c#h0AukcDf#c>^~1ͳi֬p ҼysG&B-гgϖSh"ɒ%۵k'ru;(@@@@@@@@@ ! 02V ٳgmedb YjlݺUǑ2 /@rײe@09  d˖-~zn:;vm̐!AUTjժIժUDaq )Ոӧ/퓗^zIz)jm۶ɳ>+Ge?3)X`p @@@@08 4! L&&0PܹS=GDl߾]F!F%KH…nmJ&MldDZݻw@ȟY&N(ӲeKڵz뭒9s=v @@@@@@@@@ tAΖ@`QX:'Nŋe…h";kr9!Fd:WTIʔ)c?KuX0 dcǎݕ+W] ^7 2GRzuYԪUKj׮-›6m $;2`i׮ 4Hjdfƌr}ɑ#G䫯n)CA@@HǦϱ̙")_v~Q*Lz>0;N:Iz$2!'O~>LsңGۧMI         a*@dJG\@.^hfϞ-sΕy.\ٳ۠1 Q  2W@B$p!Yt,YbzWZ%%K;x~ҰaC;h<(۷{rha} c Ⱦ}J>}º4@@@@ Dms+S[xEطo}ϐ!CҡC{iӦQ@kG =zTƎ+Æ [<䓢D&@@@@@@@@@ 2!>CPGQxR9$@ 4qѢE2}t?d֬YvWLVZf]};N:RLI81!3gl0$ꬁ֭qtrJ&M믗%J1k֭[ngʯ*UT Y@|?r]wҥ r    @ -1cD:vL: b ݘ)Rlxr۷o7|S  =rwK\RQԌ@Z ?ʗ/qRhQɛ7̙^^YfB@@@@@@@@T9gv#  F[lĉm#G쀖ƍK>}QFRfMI>} Ș1ԫW9sؠ_ 9r Q,UlRnFiѢED bܶm ̑#矒?~0yMF|k^K|M6[@U    $!å1~a ÇKeR|y믥} sC+PR%{6ޒӧOۇk'}bpRP!*Ya\Ydޅe@@@@@@@@@(HcYac$vE@4";ݱcHp@T tR;vO|r;믷_͛7ʕ+K @ tٳeԩ2ydYpĈ~:ckPΘ1Cr)nҺukyGދ&F@@@.?2V 7)#h%{T%>dϞ]4O ?b1=ju0@U&}3[d…yfyya?x_~&MJ{n>| A׿6,^X^~eY꫶Ǐ7|#;w\ruS<}ݐ)رC,7|} F:QFfh1{… (Hs8wW^RLL|}}[͛W.觃}ǎ+s|._#%' 4eԨQ@z]}=?SN{߳gO^eQ6<ògϞI!    K}nٳhWX!u֕-[7BޏR)j!~}pޛo̙3ү_?i߾/_^N5kVmkq꯿KΜ9壏>zIl޿x2:$^{}8 }k!        G 8R   Q)0~xSx㍒.]:wyGjժQǬc:,Ƕn*sε|t0M('zjYd'ѣ>|VA>}7NN8I}[P6Agv.O:R5TC'L Z/:&$sbiI&-{KkSEI_1cF[m]7 .[t-E~gzHd Jֿo ݩS'_иqcwۤ뭷$GK/%(G@@@H涤L`8נAHXBdiDJݻY%ƴ/Yf~ ԇ͜9>d'Pt_Mctے~ՠy>ܖ-[?Y[4'}.e˖>|K2[ha^{B&]Ǿ&ڇu          28  @T h`b֭[n5jȺu䧟~iF_#|I٣G9W:0駟N5{UWBw˗Gy$vd͛75׺_vIG}[ժUw2|Yj}0[/UYpas_@@@@@@@@@ 8c@@!0n8^94@IDATi:h#ZlmviPt}pu |}xc{ %. ҥK۶jJ̙#_} 2D5j$;vHCϭw|Hf͚-곹&M'NnN:Ts#}:hwy k @@@@l8==}MOQg%  8i߾h_~DCeZf1B4 RpB;vd͚Un&dڵr=ɦM瞓[;C:u$ZV߾}̙3ңG@3Ν+~\Ν;|gڴi/ڏuu]'?P,Y"ٲeݻ{UNM0AF%v풻hz=۶Ot@苻_ŋѣPBRD [,iZjޅ ) #Ӱ2˝2}l Sʽ+ywyꀪZ2e$ժU_Zn-O>de|H1^f̘!֭nzw6u6m$T~W,+Ve5ͳu/^\}]^Ϟ=kZ~{:x.գ[nﶖ׫^G '|ѣG5:oɓ'k_m6n(_ݻW~'ٹsKL7S2 sw[r[TjO⻏ҟjz-5kO^C}Փ]|oguk?>O7#Oҿל9s\r}vAڵkg_7)Y㍯Ƿ@@@@@@@@@(``ЦGg&@4fL! |s JFfTZ1}rL Ds6lhיB :rL5H6c$L8 պ^z9vgZ >1Ar kuK Ҳ~ |sL0 /8[n,tΧ~cNӦM>&XSW 'NX쮜9sW:+VtL50g73O{_LcvfSF DŽ*:&έ6h&̖׮@9{>Dhgj?^i˹7Aqv_G:j[NR3ϩ^@9Gu7:e˖uL5Ä9&x13P1a*wԥKz赠]ƍ;h`Sp GqԩcQ׸(Zzs56ykNm|1$v|-'pLا]ך tLp}%KkrU%t~v饗^r4i50tP{mwQOM&1AC }3!'sC~G8`߶e˖kA<.t\%v?uyO&8Ӯ7ޫ#Gfnz_")@@@ Zre*@@ƌcn{3%ypw)OQSvڎycB#{!j2E)zr_ HdÆ v]ʕ=`:`Hj 8SJ:7Q?Y3gqz=!q_|]4p.nPw}bmJk0w ;(N1_f|=ZaF9/^kТKٶmwI^v ?lې#GGbCۭy>WEu΁֕k _]ьzvWL[aA}5P=>C{M͟?!^{-L={בSzwC@ϗ^ s:ܼy{q N;^U|}ixbqCbu>>3wzUٵkWȎK @Ι^`5ٲeӦMׁ9sƮ\N.EgOi:0TI ?CyMݔ   _ LݗG&3lX4&4C^K)9ҟ>=> xN]AGK}]}PxO0m۱c@ڡ? oyN֬Y>}x6Ѿ}( @ _i`2/胠xکS'ۿ (@@@@@@@@@ I11!  sN)ZCQ2glU;K,vRJu޽{LN*&|ML,ZHLȡ4hnO? ww4bBĄ=wyP%lҳ l(f,YĮ7ab u@E\RCe,DŽ׸\jժYr 2ZVX!E{[l~R@ϫ u>s9 .MإM|7bI59r9rDzSjUϵH=zmf)8(f࠘LyWm,C3NL0gYfm=lٲkp’;wn[~bbbo J(aϧ ^5jc>|qsq3oIc1!@U4N&^+w v3_mwDѣG bŊy۸qc]֪U˳γCj׮-O>|bB,ƍW^=\^{1!     DΞMl{z/SWZN?Ew_a/E˝P'>zt[p0jH;w9Fwۄ^;9~iƳ_~i) -?&>}L         )@dxZ  @ hXۀd֭!)\at.kA۶mm@ܨQd6G6l`kuyՅe˖n/O?k|x:=orRÇU!}mԨ Ps4wk'ZWo߾6 *x WZeχ{ܓ=C;ﴁ<']wV૆1jzOZz^e;w{˖/n(㻶uӂ]k]֐ٳ˂ mƏo~/_>dǛ#G9tPH~hc|@b 6{Oz]֯__M&z}i /-Z3f?wd͚5?Qwk      җJhm Fܼysh*HBn}܄S$=QH=q_7v >L!Sb~!>="SdQ7M6 Yݿ Y         $؏NRQ  ,p뭷JեK.6p-%m@=nscuEP|&7|;68ZnܸQzi ͓'eCql    ]z ̙:p>}رcùmڟpBs}'nc ~^}RTe߳xbPJwaǿ         A)O   ݻwK&MlS5/śr_Һukɞ=M׷g.,XkbWN ,(<.]Zf*!sݺu[Ut=uZ0΂cbŤjժq> ӧK2eYf:cĞW#IsH]? $wܶ'NxUfM<0O@ꉵ֫W/ɟ?1B>sknB Aj&5U%|iy[vzy@HA5j԰Ž⋱6{ly|UtpkNGzo)S^Oϙuf`a>}?ߤƍ_y    j5T{~O> _=O)RgчTy? ?sTՓ\%9_믿Ǐ{v1c}8TR'_Ә\J*ҢE O+VXYozgmߜ \WFC@@@@@@@@$@$W  xt`Ϝ9slýa:z= 0E ȑ#Ue|A:];u=zM6s &H޼yE#uڿ}4rȑ6 CtRNOE ۷ 8І`,YR֭k?;wݻ7}۶moon׹Fþ4(O.Vh3m4π. ܳgkmfOqǏ[>;)uSյWR[WBQ uF_~Ezmd5`GpSyGK.#?;+qC1CulYdoQ`OkAM>c9}m9y/ʕˮogUڴic7f͚ev8 wuҤIF2!    X LYR?C}Ƥw%W-r_ן|rO <MiN"Wn,q%L{inLu?-Zip/,m۶ׯ=n@xS3gMjh~>|EUԴY%۾}`> N         0+hSǎ3 @ cƄoh @x\x1NXێ C ]A+ *U1[r. ^r6n`E q}YZ9&Pήˑ#5nN͚5WyDŽ93gvwyNʕh矝5jزcbb={:+Wt/nץOy3`1m9fcB|M窫wW_Ue?j~{huvlYinf&<~7nA{s[]X1 o C/LȪ,s]hQĉ_z;g }?FMPe&Tnb΄@k_:?) uLc=m!Xxg@N   N՚R2 Ԯ8=lݴiS\r c Bh}\LOگ}Jz?]w0P['TT)Q1         @ Ѫ? ԩӥb̃@T M1O1LH@Jb/ǎn(&KLpWX39~1!XVi &&.}6lҥK8od\ @ܹs{ꋻ 3L~ay뭷 -yv v˖-m&g I1MyMJ>$:zx}EܹSL00T1b0^Vz`C 3Qv!& -Gϵ~̀ƸUI9_> 6mȸqd׮]b! :MhX%Fz\f^,>1!M_#q2a~b6 8+ח_|QL@m ÕsΉ Ƅw  R F[-Cw_}hfzEۙAbB}e_Q   @J Rԋ@lki@dyZne2vXgtq}@ Rgìb5_=6+mG h'bDsUφ&q| AHb&AY/Uq'GiҤW=/aW2i$oxb#ؾYw~ѣ<]+         @ F' !P@ Μ9c|2g;sҡCSNpnotv9x˚п駟.["SLriU>S8}6(+#\&pi ׄWN>=Icg7rϞ=>2QG4'N??0PsC!^SpZr 4|Ww)ؒTɿ1:q68V:t24gR@@@Rs$дHbxNJm{|=|wkSO=}O}D=OE7Ӿ%}ɓ%&&>J/}MFI"pB;whCn&[EܸꫢW         @xĄG3h  @ƌ[nv^v|6ޒ… i@af$[l|(ݶ9r?R2};vΛoY*T3w~:6ה @k"H3{}Ehأ1j}>}z/_^_Ŋ^zҽ{wRL$T;w;6@@@@@@@@@H4y_yv2v @ L̿5^c0m B(˗A(̟?_4O4o>iذK[DFhc'L O=YƞΝ;o-E w}Ɉ#lHiZ'<҅ݻwˌ3d2m4Y~dɒm۶r-/_ѣ 7ʦMm;SKÞ}Y_VZ8@@@L(;N gI<"_} {<|waA H@@Y믿nJ?.iӦ/&ǥ4H@RfM)W胭tR_^wyE@@@@@@@@At@ xv!Q#o>2eL<نmٲEt5jHiР*T(j-pi{ʙ3[XÇj{LD4ŕ+Wܹse2k,.]:; QC[li3f4٭[7eԨQ62"eK bW5H @@@H?6R6SmGǣ{m,tK^"hh5 ;wN &?=z4 D\w.y<[$nիeŊTlYQF۳!         @L{#';e4X͛7!3gδaak֬qH"Rn]SԮ]E˗/b#(ׯE… e6SïZiܸ ~̑#G2!}JSPQ6mZ}MZ1@@@@@@@@@H (:  Qb@P:tH/&6o#F;Cvj<ăz\Gќ8qB~godҤIRdInzJܹ/; 6N:Cj_0!        DA9B@ bq@ v%-%KY6n(/^ 2J*IʕbŊRB)[d̘1[N @ h 5kdv^ruV{03gn0o͚5mc,Y"`s̑K=*}6 cxZ|eҮ];2dɓ'Y   @d YFl"&-z1LH4rHe֬YRX1رoذaCh8N!z?.&hRҬng[h>`iӦɔ)SdJT>P1z8@@@@@@@@@_ARa  <ˡ!Q"pILb Yj]W *sGҥK'ŋ!ʕϙ@*6l yڵn:ٻwe0]tv5ljժRti!ٻwoON:GIS%֠Cʋ/h͠VBa   )| <>&1!kD>,n,XPn&;p ={H9e6m˸qDCujٲ -$[lA9b7r_L A@@@@@@@@o :@  < :)"$i;kxvaۊYT)K,)%J~Zd\1|~0_~E~W9s=o}`OͥEv9}a~4/R<(ӧOSʔ)SCr%[mpRI#n@@@@@@@@@  Ak@ 0(T ﷁ7nwvC40q۪,YHblXd/Z)RĆe̘1*@Kl}vٱclݺ[lwϟU r~[tiZL9sfX 5p…vp / ^{mJ"N>-#FzˆvE^z%LG"  VcSM0E7@I&ɓFݠAiܸ_!ENk>?ʕ+֭+-[nA6l(;]QQAY-K4M}kL[;6Yi[+ " \\.^>Y<:ok @ @ @ @ AƻMXGZ9s g}Ry \;wnm{YB{^z&lR[v~'EӦM_~92gce̙֭[^!%ojQFŷcРA|&N<ѣG\%]dq饗W\3f̈?>=ȐR @hk"S|!T[; @ @ @ @ @jo @ }zm[V *F!loquˆn뭷Μ@+W_}5^y啥21S7oH:Ryy䑸}C?JÑqF.]We6뮻.{b-(2O9 @ @@[Vv6w|'ⷿx^S+7n\nʗ>u)[mUlEx`9lBCʾw:uj%JxI1eʔ"1[1?ڻwڐρFAy uJ @ @ @ @+ rB$`QkBA &eh]BVz-Rj7{%rSA<e}+kV}K\ )PSS3gΌ3fw}7W;S>rYf͚DD R-V_"k׮KȿnK[bѮ]b;YlM;j۟!OU f`~6$2O}n} ,zoF˥yi3CMV<P| ǜϙ3NOyuѧ UB7: :+( @ @ @ @h> ϽP4GM" @IrSYW徺{7ַK.kC9*Kus_}=Zg' iM6]v٥deD @/?~[ 4/ 5]5 s=W2d3}zd@eotJ0`@JYS80zUVɜ @X+M Fvڢ&Ka 86mZlX30_S~!Sw#9/XeY%g_JiNzY%+gJ|].}bm~|]b x㍋ |)ъ UDYw'?q9ÆU_2 @ @ @ @h =RC4G d @rrW˰zPXAguX*ܪs[zr6 w,mZY)_jHdYˠ{u-s_meHf WWฺ!^-3n<Ƞ{.o,䘿obγW~'x ,ffm})J~M @ @ @Cg q6 0ٯK{z0^my!*mRڣyR#oeO2 ,G @ @ @ @ @`AO @ @ @ @ @@3ж iS%Z. 92bܸ#N:)b,'@ @ @ @ @ r5$ @ @ @ @4@N Oי m '"x"+#x bm#N=5bԶm @ @ @ @  Wʑ @ @ @ @ :wn*h*FL @ @ @ @Ms爚V+!@- lA1iRDvZk[f @ @ @ @(A @ @ @ @ *:u*nFhEnqEq!B @ @ @ @+, rH @ @ @ @-A@dKKHm qu1~.DuTĤImC  @ @ @ @ VA; @ @ @ @h9gN+mf *v-ӟ"ƍ803"Oo @ @ @ @X M @ @ @ @-K kjZVՖ)pcFg7VnĬYmC  @ @ @ @ VA; @ l^}ոKC /Yo7ɯmO@U#N=5bҤώ" ʈW.(N<ĥ7ߌ=3ޥc @ @ @ @|0Aϧ  @ @* ͜x㍸k̜9s|gbԩs @ @h):\d>ƯxꩧUs,Xcǎ1cD.4@]?g׮_@#">#* :qw,Zs=1~c @ @ @ @|0Aϧ  @ @* ;O_4/AgRO @ @L`e 3Tp̟?'n4ԉڷo&M*ڵ5/}սEcE~ľF~Ȇ[޽W^K=UiY,v @ @ @ @ @ AWA @ @Nw\K=I׮]c 7\1K @ @ @ @ BV( @ @+,pǕW^&L(GxqGCPL>=nx饗b馛ꫯ_~9N88۟+İasΉݻǼy"?_2~E]ƍ;/.X`At1ĝwwuWq5\3oG~O/{Gaن*2 N+.|0^{۷o\xᅵu|W?q3&u'|r @ @4@55gώ'g͚;CkիJ@?tMk/[b-|;F_3 ֻ+K.uATWM{9 ԧg==3:문;g:t7EP_ڗL]wu1rJ0[E=1bDqeկ8?ڌ]m~}-*Vg>/[? ߻rߤo~={bscc  @ @ @ @ @a5i @H>Ď;X2nq1QGUepb8|8餓R/C`  @ @ @:u9y睋pϭ{)|aŀ QoxNJ|I)R{YokF=_Ĕ2T3ΈxFKw/ 㩧'|طG:21'MJc1thrc9x-2X9ѣGjN @ @ @ @ , A @ڦ[oRiE '9X4n{ȑ#׿ulF;H[lE13S>7n\\|}XZF3fLmdc0ԙۮ"2ϕGL=P <6C(Zc5jy{1`k׮qqYY@kN1a„>}z/31{o=;y|ySJB\.]΋lWN˪}ܬ Zt[w{?*oQy\T #*ƬtSf_`9s9_"?ܤV @ @ @ @G]Y  @ @@?JOٳgǮXW F__}\{?_/C(D @ @Bϋ^ul&JRM{WZ1iҤ"$^37x}>+L|f/UʐM7ݴ(y w w,|| ԡ3O^Cƍ7X]q+TW@U[GTec#.s#f\[x\Κ @ @ @ @ @iA6 @ @@i=,V'NX96QQ]'O>8v;epcN/[?(9z@lq`?οկb7K.$_|.)~=XQܗ\M @ @ @)~{r2j_T^3.j\;W>~n_~vYė̾O>я~49QAe_K裏O}SarYfyf{, _M.'*I7vlD6Cy  @ @ @ @ @ ,L\k^ @ @ }݋նwFmTZ];YwzgnZb}ذa1|Xٳgǵ^;v,Wd@c]w<;>'|rvm顇Z^+Kl @ @4…5Ӯ/BL:uK~UI?3|S K/㤓N'|2.ܹsNսʼyȫ:]rKy䑞ׅZwU__Ep@ıF_T~O @ @ @ @ @@s\z @ @@뮻?\żL:gΜŎ[ʐ!CC?ZƗruTsL|+_M6$;참曋ɏ~|NuYUW]/cq 7D~b׎#Gc=V{ܟW{m @ @ @@c ̛73Xc=_s5|EHSC<?o߾xg*}ّ7q1mڴ8'(twƺIu_ "Jޢ L @ @ @ @ t ڕ @ @ |#)Su]Wڛn)6`8smz*F ?| /Pl+g[nq_|q~qqW_}g2{S94߮ _!Aك>8g{DNߊOwyEkb-bűA @ @[qJqE/IkN:5&L_Wܖ.\XWU<}n"ė> >c=uY'=جbSٟ'1뭷^.9N/FצW_OA<`T~"~"r_K.$zw~= @ @ @ @ Р+ 5G\t#l3:4WDNW  @P曟gߊmC9$>я.x$ _Bk/[;vlqZk1׾K}ž ̾|_NyOEr[>:thw}p+#y-ċ/\pAlf}vvUSĩF!_F"K27OD @ @ @ @/FM 2GL4S|wZho3AEX3?Ql믿ƍ+Zfb)fc߾}]vuw/s=O?] Pr-k.CU;yXs5 f́lAQ/f͛/30!& @ @mA@l[Rz2z1wgǏw}7vaƘm;Wv>3gΌݻ/*gώ.] Y߳ZVV@ⷦ*ﳋ}.*/8ENujwX @ @ @ @ @F(NJ+`Q7jFlZvkԞ @ @U*j>CqYg̘Xsg%_U-.hnsΗc ό/4>+r @ @ @ @ Pt@ @4QGp'kegѣG\z饭UC @ @Q`֬wb#o i5-)o}+f%w_-ޛF}"jjnw޹)9dP1dHD׮;xq)ԿV @ @ @ @XeAL @ @}SY9  @ @ @"0e{",h~TE vW4 g?ݻWBrkJģF|sfwT @ @ @ @* Y"@ @&z]+׻&I/b @ @ @@o|1"#YV WmFD39%=;{ߋ/cLj.1p`~E|oY}e @ @ @ @hA  @ @ @ @ l:w^TfS%!@@;"F5*b( @ @ @ @Z pT @ @ @ @V\SE \q3G @'?1~|āF~xqEzݣ @ @ @ @ @\5!@ @ @ @ @f+ #@ qFEmq-K @ @ @ @f( U"@ @ @ @ @U( Ys$/pAE|cdGG- @ @ @ @ @ tXM @V/0f̢nZ|{.6k @ @ @@ A55{g'\_5;Ѻѽ{eEuTiE ӟFydn @ @ @ @ @1A6s @ @@1#"fZ$rqk @ @ @:w^tA-E@Usm1n\ǢP㎋O"]m_+  @ @ @ @ $A @ڒZkEvXDxBz2 @ @ @M+ЩӢ lZwW[}V}[rn\1jTGl}ĭU &@ @ @ @ @ \y3 @ @q-"tв @ @hx2rΜ?3hiq"#bĈ/|!Zw @ @ @ @ ! ! @ڜ@bm1⨣":w^1 @ @ @#Ю_ƵoQS8wVQ@Us+mN?D\uU~1thk% @ @ @ @VU@ @i z<昈7͝q @ @h NA6k4W^՚{lرo1~[n @ @ @ @,[@}%@ @KȠ |oZ}= @ @ @M!й Ȧpv%yݏX޽#n9G?8xٶ( @ @ @ @X eK @*z\rwǎ'^ @ @ D: l"jiFhU"z(w# 8 @ @ @ @ @H: V  @ @ FI'Edc4wnqUoL @ @4 Ȧw 9u( xE}zɋ! @ @ @ @h v @9`)>}"v޹ze @ @ @2rΜXV=Pt_"F2$o @ @ @ @mU@d[M @ "0lX替#N>uK @ @ @ ȚsmW%:_N}^Gѿ^{E|K;v @ @ @ @ Am>k% @4>ѡâ ̝q챍x1&@ @ @VHsgA+V)Uߨ6=:ߎW"=47Z|4 @ @ @ @$ r| @/-Zvۈ{% @ @ @`t$rȻjs:'_rwD2P:d\}ٟ^;wKߪnd^Rܖ+۷+r^U;eS}{Gg7f-;=8舝vڈ!CuU @ @ @ @X@&t @, n|뭷7,湜%`׷\>s@Ҧ\r_xkwy9K.r[zrW4fLH|`dWYr^lr^R\7X" s,m9Hz:S伾rཥN @ @Kt-\N+ٞzkEɾoaٯRߔ}Nu#bM7],}\<圗}_9~gcSLMUIQSeSrk}y7ӵ yޯ[oy-oEY~4=o}G8昈\#N>F  @ @ @ @ |/ _G @ @J @rP[s@[Yr[\m[J堨2 ˁP}-L倷2ȯy9.0%ׄ i‹s*gwn9P/e)CyW_}5~BHs}/sdMf(dΫ.9@\,={,L @ @ *y{ [mϗ]eߴibr˒2LT6fA+dׯ_1/C\.?ao֚*_䖎5-\xqYA/+>s^=,XP2r^T-rC^V8 @ @!A55qy|N>iҤL2%3K|yY>+ӧOl6qecYgps^cǎKEa˚e=~ⲯ8QKnb{ʖ[n[lE1ׯ_ʋ+؃En"uΜ9E۵kW ۷r@_Vo߾ya  @ @Z@΂ WvΞ=;&N;K.g|RN* epСC#7߼>[oe/xB _$Voذa)^z饢9˾ 5jT9e[o]aen[{k)Rn)⬳"=6*f[iv @ @ @ @ КA滫m @3k9dijѳgAm#F(ʀg+9.mh{Wjb?7s;v,~GW ʲ@<F @ @@%0jjV6vؼy⩧c֖'|x`u=0 w8b*J>}"_d"@`)CY{%N0k֬'O.s?ϵ}]v-߾KZVя/, .]Zk @ @ @ @ F%`ѫG$\'s h||NydI  @@x饗bK21lf[alΖal9-kvn 2O^ ˰,@ }WFddl[Vt֭e4T-  @ @mP@lܬ=7⦛"}YW+/(z+֖3dv9f4hPd\> }h>NL0q%_L)CưaÊG|Q트ᆈ6j>HM @ @ @ @ 2 WF˱h  \3vx'j9.>`rvmW f+3SN= X;'N,ᵹrsӧOl;sPuW @ cWʑB"F?j/x#`ݻw 2 |̗h3f̈ 1c%}ڵk뮻.RkjSOErHļyG/ lmR @ @ @ @ڞ ȶwϵ6.`Q|B^{-~xGG{,y晢kv 46(mEo %4,wLR `26"s_oСCcwv);wn,F @hvc-Q6.F\~yT^z!f͚U=u]%gΜzÇזaÆlz!.\O?tїCO kb.h?@IDATǴF6zġFq @ @ @ @yAmOmMvǵK`޼yE[ b{jC31ev!b9`u5!@1̙SC3P<{رc[뮻F=أ]l87 @ @ m.0⢋"Nmn5[ˁ%izkQ21߆ R<}݋yA P-`e=SEd믿~~G>՟4{vĉ'Fx㎫ne @ @ @ @4oA\'uBhD";;SXp^;[.&l҈5qjSOŃ>Xn ԗr}٧7`05%@ @-&b~7[v|=ztn)f̘;S|C*Jk׮-jOjx饗o- ٿ8CC=3:tZ궢dgG^ėt @ @ @ @V hr  @`%&NFo9^ze{W@AEvV'@@9sf yw{oڻwcĈEYwu. @ @@@l :䒈sύxXgu&.C@[xg ۢSNqa1S4P җ"_#~Èe& @ @ @ @4gAAF@uJ@ .xv 7ĤI{'ob뭷@aX\`ܹE0[ [=#>},!k @ @\"hR/_6cF^v/6o޼_]vYr-ѯ_y'>6l*  *g.~2o,^xƩ^S6gF8Ĉ<+dt @ @ @ @ UALZ}SkF &o~SNabw:fkoY A|F~->2R裏=z4z @ @ mnwD}ںUWE˿D4oӧE]T@fM?8餓bvhW;ڌ@dlѕp+}8c]/ iʻ([6s4 @ @ @ @&ЮWu  @h͋?{Ƕn\sMp Oĉ .( Uچᗜ"*Y (L`Tt qߴuaQ(AAA [=ÄaBwSUVuuu9wu.y+/2MGV||ōǣGVÆ u׫nݺ8p曤F@@@@+Pv_u饗Ԕ)SOʶ=@&UaO2eʨO>z→o߾[}=sۥ4yZU<F@@@@@@@@ 2-D@@ vvÆ Sƍտկ__~.\{G-[L>AN8A={,6'MoY[ֲe 6mK/,.fΜnM~.tuשyn,(*/,j^ziȐ!ٴB>aiz_|#P׮]`@@@@@@ ʕ!|6ok?M6_hĉ:UT/Ğ{9y智$Hzʕ+OڑHܞjUwyN9裏@J^\.ZH2Q&WZԩڵRǎҥ2ځ        O Y   0n8hB7p=\-YD:w%Jiii={[zaO;D ̴@Yfiք 6h;v֭[= 67o7A6-^X/~~٭'mϧzn+Vpjɯ&q۶T{_WTIԴi@d{ܩS'?_~@@@@@"([6rD cyl[RAnm۶U!̔@V_)kwO; j>Z#G􁐿;0?q@@@@@H ȧzJݻwץ^ӧ]v{{}QȎ oANx@@@@H]0ݿȧ_4j(p J틺FBgрz,vKEU΅:\b\w}W*UR&MV!} xկ_?uI?CB4Z5iJ]HӦ%Dh         K@@tR7bׯ޺u|WoF[ҳ8>{=}W,N:2dKw |'>Dz۶m 3/;_VtWnݺڵKvo`:tbնm[x㍲sb =հaCs=oh"7yk޽{ꫯN.SfzK=^z%}Gj&1/'>۟*뜗6e+kkĈeK/Ի}ݧSL2:S%Jwc^|E/_=zkg{Nc׻O>:餓;>|w?tgk׮їEs6`ӧ`ڵuUWFdD=gfΜ7xÿ: Zxz꥿3mH&+Y@sxE{aʕoUʕ5`{-'iA79眣FE?;/ڎ    %AQ߱zE۪ϞY믿;k^r~iv?`A>4s=ׇك~;9X-o>3]&={ڰaCx5|;M_3R7JO^pΕ]8~Yg}V<q͙3י6dukKY}jkV;{ڵkguҤIZ`VCzDO;4}wѾY܉]}nj)W[?([Ĺ@@@@@@@@@'m/lfBH\m-CH~7 &j|I78%߿|v7ok޼yn>nPRm.$1j./pat~l28YfSL 4hTZկ/<~W鮻 &LozAΝy.`1زeKxs?WǏf7PosG ,[,p~  &N̞={m@A SNqJ~)zZy'7*xL~m<97mˎ5<Qݯ?o8އnZ0o޼5~fw?8p5{uցT^=XjU'xbrEϊ >3?ޟfS< tS6m~z`fcǶ  \آnf駟.oVZ` [-7P/څ>ٹPQy{d] 6,pA_7`1zd_k8 =&@@@@ P-h~,Nbmn}ꩧm#rqjds w?>BF? n:hFE ̋(;b?K.gSɩU!?j綾Z=C h5LZ\9!;Yv9|[Vq!qY9t1z]] k2v7@ 4i0|nɬidﹰ~6Y ,Ӛ5kZm0&wY `DjmA@@@@@@@@(5& ϒ#!%& Ȃ ^[n ,001 OmbԮ] nAw6 G`ȑ  'f,Yn >:`hm|ᇣ c=6`_0H{q؀:˂H3d) vϳ?c!]tQtd_A'3bB@@@zlqH9E, C>|x6"gX#lM6#ڍl[썣FiE 2}<]@Gi AڶxYkrع2aPneSO=:sC<ٵyG}{h} ^{=Dٳgt=`\rfhNOƍÇ:d7:Z=֭[ofs>KW m{Y=]>ZG{@@@@@@@@@8 v4Ƅ   dz*T܀sz\Ȝ\x5:tP֭ Bt qo! DӱcGr4gm6\c>)S& Ԓdݶyf5jHׯn+c8va㏵qFU\9,v]W2n>ԦMpbzF{ァm۶裏Nw87M'OD(7(I\tAV^\CӧOL>]Æ gt~PӦM-q4zy\%ze< FKw'bW_^zEp{D!&\?F˖-j֬_oժUt[Ϡ}Yg_|FVqcں}FUF9ϥ߃˄     P0eFJ+LyX# &׏n1VX=C~ȪT_Iow=}Ńΐ]=+zMN5u^an+>yºi}Ն>`_sz]wݥ^{-Kc=BGݔO/Z]1.?A<>dY{:fYF&]ƶ8wJՠjR߾Kgc7         A"@@@ 4}^Щ[= qgs6UV-=Pfa`Ν;cwcaÆ~[VxnM^{mJg)Q:    I'A{xԹsg}袋q򌵄Q# f͚k7a b[ϊ^]'uklϹC'USVgs=WO?|'?)XcXvmyw\scݴ.|]~փg3g\h?U.]mNkjʔ)2D>{+Wn-M         9r  @Ntg4K.-s'?|UZ0$D ó_UK,I8?om;vo߾+V 6AY^7p T345i$S{VZ6(v=vZ:5h .j6}ڞ͈x3r׮]z?P˸[m@M_D3ǁa޼yYu}_klꫯ2?[lc7%[oGyD?`ߤF@@@@ zoѣ3}U'\Cx =cZ^bYk6/cݡfׇx9OGnwo^h7;|=vCp5riƍؾa}+?\zo0fvA1 NW^ H[%)^}5Q[J@@@@@@@@@ UL+K@@(B +_T3y"lIџ 8P. i?4c UP!|] O~Ќ F)<)pw}}\+`̶eծ'z.y~QGenO{y:޼(k8tP5?6ovիիk֭ F,PӦxw?W\q-[?k,I&i͚5禖-[/6mq뭷ta26}&q+~0Zƌ ەgv}BFi}%Μ93zH/ݖl+և!C;L~^@@@@Hmr"+ HK<>n„ gnDKhSzo-ٍ)?3.cYkXwȯnϹC'v0Sڵ+g5e}]٭[7_w[=.YkFV;?&yk}# Lmp_rԮ~Gdh@@@@@@@@ G q,  + >裏d}]te]+W& |cC, Ϧ`K,V^6 G>h.nˇz?k۶m);u7Zj~۪Uwm7N^zt%rzwԽ{w 6L_~Ph s3~kn[bEPK.~[[`o>lNR-Oc9AZ-ܒT     P|:׿zx zDkdM2i`!w;3wyx~~ZoO=FH65Ja0 o2e. 4믃:{ v.[֮];p!\pp囘y7K*7puw^PJOۅSNͪۙnw!gm-v3a`}oٲe0z`Ȑ!m.״i +iذav5j܀N߄>dvn/;k 700p={ξ/lb/I/=N;-H&@@@@'/Ix@ >ᄙ&Mn׮:aӐjdSAVfۻ%%լvf8o ΝX˶Y/'=ņ+V糺} ݘeԳTseVw۾ZjfXRn.nc=fϱ.SqccSFck]c{pGxLkUZhE[{Fnkn+W.2g"]@U]ve; x73qNn. tKM6i…jԨ\0g͛[oiذar:jաCDn6mC@@@LzlsbkIg.z=%; =,v Ff:X]ϖVpAQԳrSɬS"|X\!'kfNkWeN~+cffa(jփ\v-zD]1W#YȮ=Y'jh׵}?K*ן8^.         @#/CUGzh7 6wO<>9sղed{wml0ĉݧ -_|M+VP=r< 駟/? bӓ^믿^/)6',ʦ$m 4b?8]uUj۶m¶!    @=6m@ yFoOGvS' >ۧO*U*mZNvu;25hٙ>gÇ,j^z\~ɼ]\Хtiڎ        ,P:G@@@ J.C-q~P/{WM4ѩ޽{c˔={Tͳ=` }\z?oGn)&w9mۖ~dp#k.Θľ~{u4~x3f֯_ᅨxs9Zju!    @(WNڱ#1Z^= 6Lwuq]~~>տj*1DZNlv %}MehL25h=;V/F忟,HXv?mp7NN9%@@@@@@@@@|()_rY#f~ @}OGx MI2}t;9r~G`O\~5j=3}${-זe-`7w}Ldɒ>/V֭~aQٲeuꩧH)]trIKF3:u*Vݧ         PA00GMGvEh @v;vдi駟jҤI~݂!+W裏svgw(Cݻ?GyΜ9]ɍPp.]yƅ"   !@=098`"a{evZmڴIVym>Tbi0-A}=B'N~IM4Q^Իwo ”͸@@@@@@@@@ 77^$p@'k.͜9S6>}~goSNmVGq_jJ}%@ؾ}{}o_モ)SF]@`^dB@@@(8gˑȫ@fҟ,zk^X|W0a>#_3 @~=X i˺u&Vi @ZZΝS--F:ԭ[7uڕzR&WjNO_ϤCd'6!         2`$ ~@VҌ3|ټxb>;lR-Zp2F2!$`{m >Ι3Gfٳ`se˖q6q۵k֭[\rMڊ   $ؤt rti]w`\n ?sd'O7oA۷W8 j֬ EZdž5u~8ԱcG?wט{lpaI'ݬR2E:=va         + s @ 0(!=@Y`> B°4 N6UVBZ(M6U&M԰aC(<|͛7cm[Yf*SL4"   -@=6n*vD}sԵt}v"=J*;@XB?~g\p, W\YtiwOX\r^Nk@@@@ Azl! s r)prhC)͛woV++WN͛7a-ZߥɸQ JJlpV|𣅾Ν;W/Vv#1 ~ g<,Y2%(r^ǎr7&MQ&Jh        $Avh/  0B#4hmYJS  [|,Y_~%2 6Z>;[A2!   $^x\ţr׮]>Ln (--FݰaC5kLM6a7nX6ׯ_`x\ lݺ5z#m6h+VC=TزeK?׫W/gc ,]*u 4a>y=C@@@@@@@@,@dqe {!e?n,mp5kD^jU?|enݺVZtV@ vޭ+V_oniۗQ_۷o+YsZ gn(UTr!Z@@@@lfÓ@r7yHNt'ݶmqڼydlްaOrdyg6 ժWt՛~w_stlh?ٍl:Sڼysr!~T H;ʅpJGK @@@@@@@@ȕ@\   @1XZh̺iӦh(%K| αA:'Oulp*_LOkVAtL P6p/_mn}|lp]͚56k׮>1 ~ҥ g@@@@@([Vڱ#y&ղZj%-\0z3gw񿯇WT){yvpRJ;KRFdblҶڵHhVk:SԨQ#5iD7}WiSixKsߖ \⶗!        @ Fxׄ!  @ >EZW֯__U,1\oرcl2m޼9]w_ ijٺ-ckԨ@tz<(6nݺuZjUt^reu{?r۶mQ. x^z֖-[{R%5      v- lСܲe/^of7O;[Ο?_~wbMԩ]Z~(J;wKVӵn&^fyJK['t͵AvTm  q2eҽ     +P,Aq*VC=ϙ~ ¥Rݺҽ~!        AQ@@@g}dsÆ :$dPuDgbv޽-D"URϱW\a;pJ(Qbs!}e9-1zmÆ Ù۶ާ L-sVZߝ \Krtti:J.A֣w     @ ~f*b%Kjsvl#-[旱a|͛q֭[8 nfc׭`ufYfL+`AV՚2bŬNjuT[;蠽7@Q mڴ:tXBjcQQ݃XoCz @//t@@@@@@c@IDAT@@ 2N(vC@@M ֨Q\5Eb`%KTa-3T6=UXQ6Ȯ|JKMm*TK`g23>eʔQY73vY]l%em2]׌mt7ou;fV C&j0`VZp8\`j5jZTҚ0>}Vnt RnR׮Aej#    AfM~Yͧ^z~3VXji-ņٶEXMֆؚ7D k`Vc\a-,w.K*OjMY(\)?eU7Ů[=*cV Vl2߰j0 ~BA-f ~ Ki33e[J!]yTt=@@@@@@@@@x kk@@(5iсW6+tX[c4ҧtԳ*Yw(h,7 &c`8 bx[olsi6Pg7 ;-mL5\'p/ifhˬ]v3np6 q9{LgDq٠ƌ3>H[= #mf͒ pH{RƑ@ݥO ,Vq|@@@@@ @j 4sndqCZ8me:l,Tr;Ul`5=k5V#Vٚa4V gka+geu֭l([u0юd}]Ì0dv>3of ~1!P7,t:ʳ;ek87        $A~h   6,Tۼ%K*TnQJF[cw{ 7oަn(g-⋻*Lf@̖ᶌq@F{Mmq֑%ǺvTV&}bن6 /ezvs6H. ezɒetg0ĿF]GXhIevu|urE:5 it1I'E#kj@@@@@'FXۄՋ}j֭>BΝK^ZS+VcZk\a˖zYbX*jXa*:c۬[ʸ֧2 mᔱa`է;ne) Tx1i2OiET%}B@@@@@@@@HP   3G~פuAJru=v޲>{M_nobɂ0x„j\ҫJW\QM3fTK/I'T 1n졺t+^-)wO>)rJk֔wBڲNo'@@@@@(nĄ@a7;v_ws3C?4hU vCW^O>Y )f4@@@@@@@@K   y2E[jƮ}ҢEW}䯿J:H/}@歍4$tyRұJw-ޝ--6ը!soIfI7(-_.]rI$ån>TڹpY@@@@@_ 7Y XWH+]f5 ޟg@ 5ʕFV, r'B@@@@@@@@HЈF@@(8 >@:8cȠbAKKΕ9&riӤm} ,Uϒ׫'}RN?xʖ-n&L֬=bԥTԷo$8rٲT9}A@@@@R_ oO~â^~YzMG%{1!@ȱc SOm+@@@@@@@@ 2kA@@عSzEBlJgISH{K%Jv #Ƕd,d+ۮWK_}%m(i#R2^+Vz{Li"{͛/֕8BvBJ3!    $ؑe!Y=m _@ZqҜ9*M@@@@@@@@@P #*fD@@(*ۥ'5.(2m,"ٮ?N:I:ixj'e7h4$!/Zc8-]*u[X"        @* W!  l$ *tt]HK/ծ `ӂRϞR.ҋ/J%S_iR%"tvy[fMiwUߎ}԰adϝ[h0     P eӎ%E v5iq7Rv=#Wƌ`;OZHMi<"7_#@@@@@@@@H5HKB@@@ز+]rId`}INWXߝrԤR҅u=O*ARK_-m&m+~ PA:H҇JG-=taRӦM7I_~g     @ x^uҩJ7, ,Tj~c RFq"%ٽ[*SFPB@@@@@@@@T 2կ0C@@b/sR=H^ 05 m&ZRWvfҴigH&pkW\ -oԩR>[oIG%ttB&%     ,abڙ3fDne7̚81R)Q"ZF@ 9F]?>R:MV2"        @* `DE*^&  ^ԼtYgIE WҘ1Rq9yb [`GBE?^B+=`3;styȑ @ί*sT@@@@@  ;RW k:Dnf: 7JzIGg~u뤱c3         Au   @:ߗZ:w,yhmМSj$2]SAZ_*OH_~)^-m+}i*6q֦4x7H+!yt.͘8%     @" HW#۲iS7+nY7NU+L@ 9~IjN#̙MKK=3lC@@@@@@@@T 2U$@@@ĉ1H&5k&͙ҠAL&]stREۖ:{H%[Av$u*=@Ar?\2DZPk쳥ߖڷ6n%lC@@@@@r^Q{O-:∝HwO>'uԫWfve}\{n(i͚@@@@@@@@HnbQ#  ̘!u.pTWpyuntYRn Ȃ=[=- \Yz-iHgJ7}q=s۶}IIЯ+R˖RV,):@@@@-Y;"+G:aZfΌԴڗ T }teRR׳g@@@@@@@@@ yLkG@@@͛'+o/m$M(/qD]$DgYRu T_f S~1V`ŋɓmK;JO=%ZU-     @b A۷'VhM l* $ (ծ=:]R_jU'#7{eUgA@@@@@@@@(A+O@@@ ~EBeKiiHϥOn /H5j$V5A ,92@RH 1-r#`?___i=W^6oQ@@@@H^0rǎ-1Hc73[?\gyz#"mR*Rw̙@@@@@@@@RCFTƅ   P<6lnIjL4I~+x.]~׿Jݻ'^Eiiǩ^=idt7>woi⨐x}.SFK@#NO%@Ƅ    @rW8z-];~Gi*('tR+@ݠA?KFjα]e        '@d]Sz  )({SR3HCHK/LoRС)xA2钅%Ȥ|yGC:\i|? ̣@JyIFIjagK]H F٢Ey<8/C@@@@XlHLTHMWKg%OԩK#F!+V,p@`O# 0}ԢnBssݘ @@@@@@@@RK ABR   {#0fԪUd`?.\(Yb2{sԂ}ر[oIO~qZZ}{o'*WԠWx        $@oC@@YK}$7L9RDmB:,׾4 COR[Jm.|e" v}I~(?ȫ|\tԥ Df@@@@r'Anߞױw-/խIRfhݻիWmd ȥ;\wڵ|%e] fnFݻ4Wپbz`w0t-96g|\dI\T)]2.Kr.eVʕ˗Oma|        )$@d ]L  !ltKmJ'K;&O\Z\zis~Ӹq0LiӤϖ:w^zI: xURy:7#AٰdF&jh     ˞r[Y=Tpi6th$'SNTzORF7nܨM6o޼9y˖-ul01 _ '!{*C9\K^skvҘUch0 2\Z/ad2,cYei2' PBsJqcU\Y6>~iυ>i"        A G@@I!уJ/U&? 8ȧa֮ ƥ%׵*W=Z*o{/3sZUhNX|y]=Ben-v mY&9ҙpH[پ9 ش-m.s_҅yU] a8d*U\{_e窺j5KL        F!b_@@@'7PEfk Yt |<]ǒ%aE${?<ԬY$ ti0ANE0N@KCJ#FDB!O?]o?i@⋥ :;!    E&ಷ,2?'H'%M&jy>cwie[@ ,qʕ~>׬YBmפ2L?{w?ռqݾооQTDhDD\'Tv\D%%BTڴi(|o_߼ifΜ9}3}jԨ&M,B`๭uf&H&zQuw)@ZC!сCE]p^ᣙA0dŊUR%?σGoUTK0C@@@@@@@ @>@@@ ~}3G8PpZ6V7.[&#sOx`]T,*bc ʧ%fRj@:,iRa%`C6H_dJO?YRG@4@@@@Z ȸ=V9iwHg!=\\ƫcQ͚53^w@ ];vhNk֬>Z޺u\SD,N::ꨣTB?zя|Uy^$@!יo6UZ5GmPI ҍ7.u~m$B$KawI;-2z:ݙ/S@@@@@@@@ ̮!   HVICJK',}tԂuvZ5iР% tc4(t.M.cvһJkgފKuáiXOÁ_,ժUR     A~tԩHg=cgĉꪫ2_wH2;wjŊZ|VN+WhxvE\g!{Av+WAwXtPI dLS;R-$R)x=|ׯ>ڲ<RJeTS<֨Q, 9X        ]   $M~XNR%7=_g{NX,Hdlyܼ4sf8 upQGeo,v~zxZDz4bt)%Hݺ{Z     w}{rϘ!m7:ج[k͚5իW D,qҥ~_l2h6^::WB-t꺻wquh6Y$(V&k.ʾ:k֬H`رʚ5kKWdK(KX@@@@@@@@ C\V  D L* ,-Z$]wt RRK$o5>;qېӚM]nL>LGj^zp``gpdr;acRrAWsj     `A;v$CK< ]ԥ4nTblo5jHvXl`)D`ݺu?zQdZp}\e;:-ZT5jԈu!gq6Yc {jTZMYX‡FZ_|!{ܺu_MBwB!-^z_4h?+qG@@@@@@@r.@d Y   5ׄ,~8GoyGz}ɍHbA}-+tiIcJ^Y2> OKO8 ۥ~+ZϺS+@@@@(%JYM?!M(}w8 2;T]:묂B{D`:b_~Ň?n޼+Xx\ڵ}uNdHBޒ䀡I#Pѥ!Դi laK.kw}ןCl?[u9CQÆ t衇G;.\8m        @AnŒ   @vx@6L:pXbZEB,|ݏ7kN Q߼$AٗuR͚ҲeR ρ6wxGc=Vp0     y-P8Aym C2Ej>{[3g/^={f,@> B!wL?^? 6p-fl]tQ |=֪UKIA*W,>ّk֬ . ,З_~^)))~9;yqjҤId]@@@@@@@@WT,  .0y4xp8Cx~>zJp,R$c%T7M]&-_.=>4}z8򢋤k      WAlǥ+ڶ^xA:7T5͋݋(ā͛ɂJ?-[UZ5o\Tvm.\8Z@@Ʀ֭[i5|?͝;ׇԎww\hf͚#Th@@@@@@@@L߅   > ,]* "ԫduӪCTr#J-؂W֬^zI*UjWT%Vlر?UZ     }{7kVK%7oS.o`,gϞ*TоO!M6i~5kl5+eʔQӦMe8YRl"#`6m)z۶mӼy|0Z>+V*V>O-[Mu iqx       d!@DE@  "cd#FHjI| u'w+qK.i1c-+W.qÚ[d"9\IS>񤓤wޑ*THrjդonIzU顇vHi60    䆀]oJb ̝+{I]{;,pB}_ D FP(>3͘1C3geTC>lhu%4F[C(Y5k';%%% opwT5jTتU+*ٶm[{F)2@@@@@@@G ״@@HK˖I& f6>reiРF.R7oq~1jw풊9OmHA 8iR8\5+fq)PԿxrc} JCJ^j頃T @@@@H Y:~ݔL:jL@6_&TԾ}l~Z-htԩ6mO 6BҎvwѣZnTk) @X:tৠ7o7| }u78nٲ_cǎ xD@@@@@@@-@DE޽4@@R`&Y`]:yYco6n>HG\ƍ/ڶ>Pj([DcpGihGGF:KjyX2     @Z%;gN l.]yeή%Z^9d ^`z&iZvʖ-Cn:ڢE ߟ  v~LpBk/#?, )&M$;G@@@@@@@*Pf!  y*չb?^z 4Gnt%R~x!h޼yyj+ߵ+lLը!}TiD9̩åeoHxR(-y@@@@H6w?+ h<(i#d}rߟ;!W֌3ԫWҠ(ub<:tA /Ԋ+܍W_}ק񮮻:jՊx܉ FA 3hɒ%Zxq࣪\cx:cjE[ص5kgĉ]PtիWOr~嗨O@@@@@@@HL sQk@@gPHd?(M"=Tb>W$6{үJ^we5jy=# Ed^ҥߖu On&% lLI۶Ovmۤի&#    @,rǎl}Y`Ni3~3 r&L!@?TիWוW^Zj]j=sӧʖ-X @ ;Eqm5j(9s減ϿvΝ;sr~CA@@@@@@@P iT@@Wয়vH]&ԩS!czߵ/X@yz[ɓu5Cmk9rߍY^A._\9SO=5[ɢ{yf 6ڵZ^|׺ս{w1B/NL^(VLzEiwogb+ou~9w>k,Zo[>p'a_.ݐԑݷuO]VcǎѣGMS|!s @@@@(Q pmo/=r5%gY/d[^\'|;,' &=CM4q3dWZ-aw9Sou뭷E뮻|қ爸UhyX ˯J!mڴ߮]ʖ-[|a?\B ?6O`zw6$oy䑑*|*S~H~饗h*"       @$;f"  @, vfϖ ȓJ '._4hY! ˫gzgd*T(O6[o=}լYbކ(R$c^p͚5j1.mpqQFᅲ 馛t'̃G@Gym6Oym{,`XuIn x ~tlO{7v9sƍ&bZUp 1rB"O;Mآܫ JJJ>cغuk0{?ڹ~w{g{Ũ    @; la&6mR(o{=zHwV͛k&VG~Æ KԼys_ߨnΜ9~^ٲelerҧl{sݝǬ"8'7/`]эJo^yvr99rZwyZ$ -\tĉ1‹ƍglܸ1䤍Ji=3\͚5ӺurJM0AŊ'|lÿap [bl@H~#{Frm+ >0ŋgϞ>X'r`ދ/'ru Rr~;ȭ~v'FBc|eeEy ;-XAZ@@@@Z ȼWvS]7zbě"0B i>|I ԴiSM:Uo[9餓~l!{}.½޼#Lnnv^Lo^ ͦXi=Ze}uvűc{.]bZu#qfIo6_aÆu/\nH^zzG?Fɫ+@@@@@@@HFZ'N   [ʅf ח?骫$r;p6J**_228 ,4,l6I&bz $"*7xR1,r'6KԳ"6 t~/6l\_lٲ>rƌ3gN0;_-ҎEqa|pn$طcnn 8d]U\F׺?DPp@?U ;mnGWu<a     !`A۷ǖF,W˅aIGK=&=t|rߖv￯^z˒t3z-%']HK)$K[t:|ӛKҥKտ 3y ╍ek}=׬YyvQsN:k^V/;Lv۸ۥ1?OwYZy8'`@H ~~g?Wi6*#       @M6D@@@ & 0@ڸQ?^:>4 k:0ܨQ#?!xwǎz5}tڵˇ PVk̙?uGj^z 8m4=ZxZhN,-]V=;)S0èk/W_:#tg褓Nl޷@>L֯_<h+:u۝[mNїoaG@IDAT~6m?p5k,/T\{jqA,q,v,Z3a?vb:(]wuݮ('|*U'l]6Yq "?n;H_.Uu-evʣFAM5k¤IK/iժU:suyEbpS.cƌ!G}~'͛ .ǨkN׸V;glڳ>\oxk>֖_l?yKvm#*}#    @r X_qO> _/]Z ]]e7NZ|^QY][@~Z'Ov7:H3joƍ7~xߐ̮~aw%7Z^}UǹN Xɬ~~v㬳:KC8Y2?nݺ`ɒ%:SuGiajK/T=z,v;dv_bĈ:ŗ1mҧŸpF爅 cǎhʕ*zޠAd'N߅>?'?d-#`YevlXl;meU_X_͛sk<̎`cicz w~wacLE[;αQ덗s9=z衺j@@@@@@@H#P8f   I&kƍ­Lx S {Wjذ ^sk؀mjѢEztW몫JJJ=Xel9 à f}@D lӦUo~_7s &[wNOɳݻ?|? pܹܹsMq^fji6 U|}q`ԏ1gRΨߖ0X_X.ni7lؐM        Ps DA_J֏! _ 5n - =T~o=qjU(TH(kPA } ,Y2D>O\`h!7(B C.@0Tai`!7&}кuBʕ 2WeCKs'Bvzl[.?f6 <8y{pB ׿ef[3kqCUT :4VŊV\gOx ?SOk~~PC=Bmn˗/w90}l[؎eA;W$Dt'{clȑbŊ`Vt}ܩ!Tx(tšX-[V}gqk}~b [zȯkn3u?V7@1zj?v^ٸqcd`稝;wyK,oIPwf}@@@x?6u@  Uv>sG`P.+ uY2_6l:suq+l^zVO:$YB|\x>m۶M[oO\8>SPE]prmQ3(.0?5lpԂhrҼ,whĈ7%%E8 p/t }ԭԣ4aܱ5ze˖ rlgn0Xv" qضE2evᒺ{+ >?qd:TJg znA:XnW8^n9ҳgO70گ/g<ǍkV=N;4p_F{P^=T뮻/e>"^     uؑs5k|ɭkcEr7q$=Լy`dvZh}V/08OL%kGk횾}7K|g}PaR&M&}_q>BQObe} Y)Gm6ןftk{L=/7 P1~cϩ뚑W,}AY l'sw~]b=?ccicϤ:sAiގ3@@@@@@@@*@dݱ4 @@2.Zd:|xdVb9u )*kժSN9}9[-O? -ԞgV6رc@GyD{nL߇{    X̉c]#yIrVkOcauA`] +}mnlf%>rj~|3X[G^̋>GD?c*yџu7%;Nm쾎o4c3c!dvn3Z~_Xژ67촛 .m|pOZ@S@@@@@@@@x(^   @n \*ղT4gt@fl.Ng䡇F-[/kΝ{}?C/_K~5:H;v-0Rv+Zdzdc9)))"0aBydӦMRgczm={ԬlAƍ˲b 9[8Alܸ_ ˊ+?[D9sǎpା@@@@vynDA#e_ڂHkbpB:YeT f']vKvM/Fm7>}_n~&KzRo#/Yl]eulr,IJ[Kc/S;֮]x--3c p d@@@@@@@@-@l@@E^w!P%M.rHl:7  ˼)6Xf͚~`@Ja`!t6py~~g͚RJ-j~}ڤd~k^u6mW>ȬΝ;+}l s7_|񅮿zcB,/A<|ǒΖ+'rtrǿ׉aA    ^%ڙ]g">|}ծ["q.zio-ʊ]w.Q6?^~ԯ_?}zMYff}h֟D[#Ћ/{ dv=L6Mkז )+[nה%7'>)f 1h[+ݻwh}k>|?K_PVf,B,&dczX*RZ5A LKsNb}';G o       ij@xuC@@r*`Q~Bդ;ٳ뮓 C1Z)R$4jH]8p.Bg~0<%իWχ 1ch۶m~٥K֍7,>/fΜ?Cw+`iAdNvW_>;ɶ]oKٰ ?CoVCsN?@,ZHoFdXreFimbv6wwyfAcW_i{ $4׎;dɒtyK.޳A_6'V~I'Oc=8/^W {uaUrfv,[eFضb_VvV>eʔA/.Sck_cۧ6XlٲTX] 7ro_å_M~?,bZoZў[Hnh:زkaKaGՂFm` ׇ;8;ug6o[{/G۶m!ʙ    @*w+䝀4n%w)xoؔw[zgbwɰ?ϫk]WƵU.VoDeov}/c??^Oה)Sd}wb7LKĒѵL:5rc;#ϠhѢ~QkK[ 8nӦMZ_XWcj[)[b-v#6+k6޼%xD|v,Y#7ϖ ĉS |gta~x)+%p ^ϔYߨ-ձ˱гg,չYYbۂYAXpumgh7$CsOd|Bݰ .7> |5C@@@@@@@@ I\+}B6Q@W@.W~ @X":PhP;B;ssɱY,J3B.+F*]BJ u]={DVTj޼y9 3gN n(RHO:ꨐ(ڸqchǎ!rr!7P$"dх=Ⱥ? tÆqW ϡc=mtᖑnذ!tYgy\8Z 2v :4z!&r_Bn`GAZͮnݺZ':Wl  C=y?9QPaPȞF>mdulDzm=_|E :u<{+[xFiajw^HرG CviȐ!O>ğ[m_Ј#B.`vy?p;yXb8O>aժUAyBw!޽{:ZZnrC ,/_>‚CW\qEk׮oCw#u9   y!wؼeP6pE|<][C!B7 (FWO#VO_EEl ڪDq'Ҹڪ\cnBNз[}hi*_@gFs;B~a´4k_n|i&TRH~A:wr7;|ШQ|_]o֬G{N:t[.̞duƺX3G#<Y7>n)޼.hAFSɅծ];n6γ[vz\cP\}̪)VX*WV}AYVX̶;vI&~_Z/iܸgp7gw!!wI;.\diVbi_0O 7[ t7񵈻]hРA7.:b_6        @#)g^+X  @ *$yo_7kD@ &L.HXQzex]kޒ,.PLw}@6x'%7E.D,J\Ν]nP\PYelL+W_ GLܖ-[/Ar*Ҽ3[G?3ukiڵrer?zz2n.R.Mn`^6[V^-7@l~:uv>XY3wj>؎ee BcdG`b{gqs1%Kfg-lV7Rnpfbۮ\rd7`֭swVΙ}wVX!;ޭхC@@@Ux3+M:vcTIvmyR>֗#'u׵ٵuw2M2E۷ϲ?*Qn۶M%jKs7m`kzᅲ&g**w#o-EV]\H\`G.dOR_:l &vay:FcSΓdR'_nHoީw}W. [ߊ d͹VVNגU_PfVBVۉ9_r_ژٺ*Tg%em~GrArjذ\ȦGz,       q!@d\*Ϛ-!!Cc ?u)[uW^ҨQfҤI֭6lؠ_'L3g~V @ Xl`' A\R $ I?.7J:KE   @c NIB/mn$ըQ x%⋥&MW_V\TWb9rUѢEb$~g=?~\Ϟ=տuهo&R }<0*׺;Zf~aÆ@̶e]S |odkѢE 7ۙbdDikJ~~Ӣ;'/[D]y啲\       $pL=F}@@@ Cot#7Kz5w ܘ&-X vZ HCKt'PݺuOʕձc4MڼyN}UѢE r!q֪Uپ}yv%K믿FyFrk6@oQ^曥{XE ݨ3fV z=P5o޼!   \D:vXdW_-Y^K/7|[#%}/Jv{1w߫_~YƍS=T\9 <@8瞓j̧_{Ypl ݳgJ.۷[]v>}zZw[&f~2xȥ]i=ضΝ%{c~+kE8?`K&G5k vvc4dtR2S۝;wA'OΝе }f;9Yj׹UzuY%c/J-[_]o חZXm۶'t:()R$+OL4^΃?0~iԨQJ:U`X5~xڵ;:`tf!tRM2EG*%%E 4PϞ=wQ֭V"       @RF" 0o ! uA\6LC @޵~L/=LmٍCPݺW_ISPZU0۱aC8 N- Cbk̙3զM٠ڵk!J ~H)*-s-[}GLZR5    @ g ̛'vRӦ9ZURxp\:ҫJ4/uq|hڵk]@Y١Cp jѢ/_Ŷm&K_|? lܸq-tw@,\ߐsڴiK(ϣ]v)&M$ D@@@@@@@$ 2v8Ex1 P>T?r!mu-y/K{ߺ$֗,#2R||4uԨQ5&u]ڧBj*DR XJ=$)" ,S&g"VLRJl|@@@L9ntҁFx3A&sKԵdn4a۰}v?H7TϞ=3_w^F?Yt5RN!͛;N^u4&)    w.Bx+5?JvV m}T0 ;fY[!s>n86|*UpH ynJVc;{lӂ "@mXv:M@@@@@@@@l @@@ qV=7JW\;N/飚5kꦛnJE^"    @zŋNya67g)=Dg]+s@ʹN:)ټys$Ep#&fpB`d `s4Av.*GWlc)@@@@@@@@ W   6H/}A84M*78HS &AZh)%ʕ AtԱ4mT^vք9XQ>\{;_K%7^3rKΖdJA@@@@ L;2\7,쬳B[@BTvm?uuj_އY0[0M<هm޼/k!y [TF )Rd ?,YK5-ZȟCl+6{G z-I|2Z       Ay@@@ '|##٠< f;*RN.r&QkWO|yO A~I0T q8,rHi{o Cr\UeYF,_\{֧~͛g@@@@@ Y,ζoOV=ztZ)H>+us ħ@JԦM?u|-\?ǩnv%ZPA֪UK5kk tAE5q,+V>DG=ӯ[Xجp.޽ׯ' aq        ̮!  ,'ڶ^|QR`/^[eWaxc<֋ x+ٯS G ;t, vcAV{ȡm>k#FnU:Cfی zխ[7FfϘ1JoY!    TxcX-q4`{v]~ @ T\Y6{iZ |_ҥKLA@n|͚5v)UVUedя=pi ȹ.w7J^^:2Yʕ+9xy۶mllٲڮ8wU y[S%J,@@@@@@@@#@qg   J]&=tM]w fv L.q1W]WAYX1٩S{0m܀pmp ٽ{)42I#]wtҥJ#GJ.bŊ7!?sUDS      2 f͒<32Ԯ]eGn2e]6i&݆رY(d6-ZHa7ZlT9#Y & m^ҥ>SG`QAJJ֮]uG{::і YMTR:#-[wF>L2ɃJK@@@@@@@@ 2wUG@@ ,]*)oKݻ{N4u,6_uTI2E ?Tn ={h~`;oO"+pC8 ÆIggʖ-<dɒ/\@@@@XDpaG N8A?^.myI*Pܥ֭[Ol߾@қ/^*ng2*;UrsW6/_>ͣ+ܥ/zQGIÇK']RAkN{^y٠1     -͔*7ٖ-]G㭷]OL""Purw)bwk׮Szx6oɒ%oday7nyv+W.2eȖ{p)z.jCh9jӦM}vޝFt>тڵkE{Zje!m᏶aJf        I#@dj  @ # "r-(A`[nOM*$R |Gw)S$ <$wL(/F_n)|nU:xiǽ7٤IM0A]tW_zhx    @ p_g\ƚ> |; $`65h -Zmp iSsׯj֬C&@@@@Hr tSI[?wIKA@ A . I-80:̂mu֥ X@aRQ`f!- hѢ~yԏEMbSv2IXЦMisZhcڵӄzF|<0hm2         -@d~=@@+WJg!4qԽ;0[ϥM wMsnxJUK:5sg5-YBd Ѥ6mG![ -0ƍM۷VX!C0ȳ>;!F%@@@@kd tg@ =Zj˻gJҳ @@@@@@@@B&@"BvB  "0bdI4J٨QvD 4Ծ}@үl[9D:TXRtiiN8@4)u'    %з߱~≱ZŒAژ߳ƙmUY'@R!pjZre*N@@@@@@@@ @@@ W_~V$v*`3w5*7n@tnAX1%Kg֭TNO]*M,,Oitk)A@@@@ g=_*C&9؜ϯ5<#u4_-oD-GK^+3@T f +?>Շ~@@@@@@@@@7"mB@@@ rHVb1cjD͚Iw5+PC ^-u횕8o˖mc'M,@: _V"ޓV{o˥Uҹմ @@@@=,q×ŋ,)T&䒬p{5ܥKzE@ ?*W͛kܸqq8        @ d=t@@ tGKÇKeJoZLV4m*͛'m\zCr+tiV%ZZ(YRz_o/}TzuaCMkS@@@@(޽R?rq;3ϔ{ۣZAsΑFjv=@N:i„ q(        @ d=t@@x%$ J{eD=Kյh^m4k9~&E_{_{M)dN;IK H\"zԤ+R(sVv~=mX    @ʕlretqKsIGo?YƏ~]#"U;jڴinbg+P@@@@@@@@<2x  @Qx o_+&2[:{l]IWֽwi$5jHCHuxs9y(_^6|tR۶gEF'}_ѷa)    8Ic+&_TҜy k@H@ܳ|2T@@@@@@@@(n)g#  wH_,yt fi/0wnV-y!%9;,ԩɩZ2SkWiipAɂY,GI ӥ]vuJ8k?3Hʄ ҙgf}_@@@@SsgnNI' >siS#oْ59ގ BaÆ.8qb*N@@@@@@@@p$2@@@W]%|sVٵܔ&0oTTN5<͛ۮ4yr7@ϞҜ9KkA(0WKCKs8)hBCi(ibeK_~ނ_{MƔ4J@@@@Q&93GuXr?e    F+vU'zyҟn[ɻN1CG&\Z˿ 俀%\d9"        _7Qz   X /?>*ϗz̼v{[vYKiӽ/?BOh4hڲ X .M6鯿eomݺmſ۫ķN;і.⸤Wtir+_; `^lY+W.eRJ? SD+buh[$gن \Zr~7Zz{1^{̾@o}*U_UVvuWU^=9@@@@x۬[οoܸQxm4x㧑SH_&A[NR{^XjDEc}._*T {g-䏛7K͛KW/I @ m}8qz]         2AJw@@ȋ%f_zyi02u`Ըq4r}{ϥ~2x{kjժUe֬Y{m_l-/[2ewߚ#   ]EWX_6jc46\ec{F&e &q`4Hznl\KfM$ ? Y{l4<exRDkPY!te, d׆EkwUT5.ec@ Z5wYt G@@@@@@@($,g>!  KtK/Io%}t.*apy\r7At쳩z*`I,y/__uʕ+?ZoddЂyk׮MCKh/>UlYZEJ_[#w l^2+H$ȴf>{m"I!-F۽jժk֬IH~reu r\"T)>&M䶟'kȊ%x{U~}#;1%i۽bҒ,YDp2xYO?'䯖\QFjݺK޿g<`@@@@ ?l\_~!K._ Ym%VX&XF>>{ml5_ &JXޏ㨖[Z\"jͼVMK$6|G<~ǹ1E~iԨ$69m6jc:unݺqRKxIA@ UڵfRU?"        Pd%9Oz KN}Ԃ |b$;uS# @ =sYI <2sB{wsV |ԩ4o\c˼ X%cm ( *9HDn\d*Ki,^rAN<҂WwuWl/ *D X7蒃fb-FC@x@mF'ĉ߬>g-|RE{oڴOiR,19s|NSL+-۴i㒾vskOJt;@@@xU6޶h"ٯQI0ll5+![Z+o K,=`k…eA@[RX `:ud/ eʔ v=C~ ҥK}P{ #-Ydx { -0`|w;j̬ԩrI$ J[N{n>zw}HKjv_ڵS֭3w\Mc6%І ɫI&kdI"-$@X3fPVsI(         <A&ϒ@ (#NDUKyG. QM7e%lD!?OKÆ򎦠{6mҼy|0r&Z*1HgA?{VKI)x_AAt4- =P A7nC[@]OHQ,qw$3fvmoRWC.1ur!;YBX>#ԩ^zt @@(<-8;e[;7[ǿ?3."Ā 0xxd+T&Wkm%KkYfj޼w'-crf +Vԣ>>;@@@@@@@@($,'!<2@ \{tСr CQg%ԓF(ϟ>?t]rsL;͛}3fYfwKfE|nݺS J$[0ʖ-i]i&C5gFeZfomr{iӦe쳏6Ӭ; :e~zuid~{kjkeT_XK7|B}߿wN2d S   O<'h/7 M2EӧOoƏ-jz|r?۲$(UTA o~l~ܹq`l~MSLhBZϏ*Uu@h t?'g;@@@@@@@@H gIM @FX &ͥ )v[^N?=E.Szɴl^hqJcHݺ.6lASNմi|pnڴI%JD{t^M4y:0;#KK9{W ?Vꃟ-)+ @ŋEc7Kvjmtg묳"f߸qO3hܸq>E]?aN|D@@Uzf G.\ &hĉꫯ4sLY2}6VlB&)=za~ׯ%lٲڶm;\V6 PW^y{=F_u6#        PHYN(A xO @x!ii@BEr[z .f|KԁJ?zӽP($KgA@}߲e,y^֭}PhBt-ڇXzo%6 M6j߾Zj!}P[;L^z?pgƹ:,@l>ʕ+' ܁   a- e_Sv qzGԠA=2|[    @<6}E&$ 1{Ol&رIEwU5k&rF)]}ƌ0֭0sizi WREwy*]@@@@@@@@ dHl& ٤/ |tҀ=ؾl]\N2<}ZDSp-{ӨtqҽcoӟѣGG%"|֭Opxl@غu`hƎ׫uզMB J*W^·Ν;WW\q>rwS2e@@@ c K?ưaôtR5mTGu}%Mz饗Oy 6@M F9rl٢]G:#Ȳ\R@ W =qDo5sLխ[W{v}Ծ}K qFp/Xw};%$`I7/" oI& F   yll3ŋg4CWv6F 2{.\{'?ϖ&ȱ,{oeVX˗& Jɒ%'jܸes &H xGR+Ov_@Ԏ        @ d:t0@'0otrһ]ǤG.nu,Ir҇J]c(^ovi'y:}r%ԇNয়~eƏvM}U~T~7죎:J_iB%K}x z衅gt@@LfyKUm?֣>>'|e|J@RҰa=N^j_f'|RT#Ȗ؍@Ȳ/;.`: ~:  m6[}K,#FޞKw^yݜx≅@@H[Ǧ׆m޼Y.&ڹ tk;8,0vX=S~r=S]wN9(Q"n7nܨ o̙35c M6'-1o=zPgqI+`x4iɓ'm۶qg@@@@@@@@/~   ڵrMrMrIHY_ZLwӢg-jUZ4gF,]T]v֭eÇW^F/@m9v>pق5jڻݧ/]/JnTR%?$tbJ*!CSO=UN"   PBÒ$ٸkϞ=ehؤ$,^ 7{wlK;͛O WGl /v>PUZ5wqna?cU:@B UX        ; @"bS@@2E`&)i pʔXLr9((лrtWqeK}Ҷ)SW_ռytUWzqf5@VSOiɒ%>Q߮ jںuk~5#q6nܨ:'5jQw߯?_rNh   qӧC:6vwuA=b36ePǎeԎ:x ͝;W?llݺu~y5th;Z5#E^Xbjݺ5        @2HLMB@@ B!_?i4=HFф drOKܖǎD3f5k柋̚5+U P$l3fɾi@@@@@@@@R!@"TR'  (p-[oIo-lY i+@"Ȃ95/͜)W0Ƿ:Cu7ɓuAH,!#,/zԫW/]}҆d?cYB ʾSr')K_0o^pnqnݚrԞ{Z ncǎթ07jNKy 7߾;S-J:B/M7ݔ@@@Xrwﮧ~Z^yժU RiŊGui,Y"cu]o%6m?x5iD'|(C~~̤uֺrܭ cqENhCv/=ecv.~9sLZ]v6nܘ]o&L,CMr駇?\~logczb_.ޭ?~73+;ڮÏh[xyo;|]9xD#{9}#E/&r}x"Y֭[^yY[<ωhu_^z8p zGgw9rxmlXGod[MbYw.W\q^Esx;[Ī3vݎ!hW|D|M}ԍ        @ 2E@@ KO>)`-Ɔ*'bj,m%M>Z0MvYf_~*VX4ՒY=u~ҤI\ܷ}WAh}2d~>$SJ'}"P >ceU*}'!8ۥKwmyձcG~'~Y Oh>%HvQn'8ԇ   @QXf]kjƌѣGr^Z~F!KƖY0;-[6g mll’ . 6ٳtтcI:vO3^ Qو%12e'Uo'mv}u[o>l 6lX6oެ 6d' _`c6)j+rk… }[m;-1]3Jd~a?NjXk~o.ZE-6Ό;8 kwdk֬Q[ѮW_}U^{>裳FA;z!{イcE+G&_v yd-}䦏Ç^{~=tܥK{&`,\gs3ڶ,pܮ6m<^<쳏        y d @@pH:l_9'-D#Pbu,djiظ"ФK/ b$YKhfA5 N;,x 9G >5P{Gڗ2~]jԩdiӦ)lA\xmLa:jY-Z={{˖[ u I ʭWh[rgnݺ>6S'   EY y䑪\OVV|hҤ.|?M6:3wt\2/ :t&Lbߴ1K0hܹ:문T6,6H)ͩ]^;#|do߾~ҪҥK`թSb]wzxm'&+]ux&9C}5Fa?h"vz}W6MÆ eG֦N:uG.XZԙhla:"|>Yn6G]]tvΎݑuھs̑%k{x=|ꩧʘqd}~/^wy'5^AC;s4N;Ϳ̙3B`J*j?gv_ 7Xe+vhb/X֬Y3(Q'MF}ԁ        @QL E]#  %  HZՕU M2#..N.ff_׭[Y'|rVbT"fTX%ф_>SB~2)C%g?.<Ԕخ/Ohؾ}v([>{n馛n[nI ~7{gI 'N3fd/Oև 髯},TA@@@6Ê+|撟I#;GS}ܸq~&J5T } ރcDRakvٽb>s?Yqhlٲ1>n=WgWm`euSL㌖t&Ypav"mWюS[lZrNO,Ⱥzc)͛7?/ֺDoXYNKh M-ypPl/+^`cʕSFO;h!DXlK&ٸqc%X~DxuAlk% /+W%cTr]WVbm~Z\su|#m¿Ǫ/v A{b/&8&Ksd@@@@@@@@“ i#  )XF.ɛd1C. TYhVJjKՑ%+nEfJ7nUX0#1b^y>AԩS[o A s3駟k뮻4ydْ=~`yJ4d~ƍI&ɎײeK$ς:1coݺկ ;#{-_\mڴW_-;V"e„ eիnM>~饗jڵkeoR{饗4j(Y{-?(}}YٺukY\>{Yee AX{9ϖNq~]uӦMcǎrvԶm[Dk/jwFeF|@yZydZÃGyğ *?{?jA$ "|':餓RUz/"}G,NQ?o٪UKE   e&ݱW666kٲe:ӲT ,⍣k~*v㒱,[񛠝m_Ko-aKaGMF;-K9/TvX, zcy%2^3V_c{CNw,%0`@yv{9.(uiϟW{Zdlcv w>2^·+'r%ɴ1P{O?OYke? _Yobm66qYC769gL6nlozH@IDAT7oqP*Ʈ33TR~7kd/*73Υ)\ؽaIR#KxlI,guemV׽ %r=\~fݴiSkη-Jъ3rꈵo1?fs2z        փo  d qI䒇I/l(Oc @ZRtyrYrSo`c?O$#KQ[-)%Z/ ֵK.Dђ;ZGK__~ꫯ|Ŗu-;_,KvVt`9K|hg{>%%uhgu'ς>oG'r%yo4tP_s5>ϖYb:+v;sv'.@>Kiu,Zog "9g jԨ>vY͛7zvq:c=VM4YMJd~k|N{ 7̪k{Ӯ{+v>XԶDMP4;v/>Ѥ/J׮]աC 4(eM` j}M1by۹:۷OtjvŷE=c,X&:uDߡ aZ]vfYn(Wti}7:@@@(͒Dx6Y%`Bkcqxh֭2ӦM.6% KױbXfV73{#1\MP7.=>o볍vɷƨmIxk,D˭X}5o 9V jw &ԫWϏ)XMRr٘Kۘ魄'Β٤N6Md%;Iov]ۇ/hCWm+{6c,=۱Jx݉Njٖmc .^lm >Zi\qjKh{#mωo.=>ھ,٢%bѬ_"i%AlܸO\k0YgdJxٯ:,=ؤq֯^wrΒ[N8?nϻN%Ѯ:m1fI/q3s8's. A}c/޾yYoIwy}@@@@@@@@@ d I+{B e ;&pePٲдi;[]_ J.Oxc(TZ(n]j[䒵$=P.kwA}aK\rX~ |죌7/ѣG2:òs9!rղW_FB6m ͟?m^{rAu2B.X/{\~e>|G~[o5{Ӡo.H;{Ks 첗uY~ZreRJ!~Æ + L:/q .w1$Sz`A5e[n%hfe./O]w5/^_>} 6t(C.6'㹄~KrIS$7Tx9okK#l\}%@}^\ c_]R[.]mP昧 \ %\K   yltB3qiџ7FI1`L5޸_q4F7mcsεq~ٽױ8NCc~۹D~qF6j&lc=6&k%-W"5qDƐ9ew>{0Ug;ZKrI?cfl¯ȍmҮ%KDYwIe \ƨ iWm{3{b]RB.ia% _NeGbfar=#dyRvmюSD-[9Hd1K\4믿F]2P*{KVqh7[J!6oc]cV'×_~O6gʔ)geJqᾞgvs˗G:v\U̙3C.IwV^q,ܮs>C&M ?kv &r,@@@@@@@@ @ Ң   @ #kI[g`hrZ%UV aW\!=W(b]mz삾wLʕ6m][:u>#d$Q.J>q#8:t\>uu'OVǎoC>ĉrUrA]4h={Y>nժUv.Y=O~_֭[zskѢ_,}9iF.8O\`efOZ\oK8k~K)اufo 9w{z饗d~ƍ~}".Q.P+Wο u1ө%X;X׳gO~\Oadlԕ҂׬YYfC4!2xTR~{ ~=z|>%<1j䝖0O>%DsQzԤI$;4ڵRF YѣujrPJ"AʛnI ?vNaի_~I:E"A`m݂ |;uA-h$nש%a=oSx=[e%Hz.-P~wedTG    ,%ݝױT8 Z"~lla{m=c71 o~1rX-ɘ%{wuUWi~sJ^~"Dyca/vM6-c5Uƺ[l[_|я}mבݓV,;\o2vD8dɒynҤIzW$VlYp ۻ'Z oc/_deׯ866\JժUku9 l+K8k>l>Xz"?ڲgA V~ɸmvk=Y#FoVYg1l"NudH7Vbm/vMgyt 7Zy,v[OAY        E`) K  Xz?^QBQ₊RR5%Yۣ;yzG|57=SUreYgyF}Ulsyɒ%K:uw 0 Y`СC-[1Z@mdYhQ䢔|[QF믿1⋘Dz< 4KiAJmҭ&K8rHYd׮]u`Çgo.Z>}裏>?$bi&V` 6hg}& =sS֜2eʨA:ujҏ % /~ ]stmj{Z2tRYfዓ7mڤ-Z$N*B@@@ ؘʕ+ogEqDl<TD;N"7ZXa>F/e_;8\/\W_}uvRdy妯ACOw޳{0ǍիWD?}>!\dcޖ)O<ǣYYŊ;Wm_lfG$k7o%K5xo7= {7vxמYD(-/\=ggc6Ե^&;b ,b^d`m         @H7?F@@ _\~!x %,v)_ uR # իJ'{:t7$lBR,_~4 AdZ_ǎ,SL% ܏髯'2tZ2p M0A\sMY Ia'ۂX`[駟GyZl?5j]zq-DïKiH,@xقoFYb6-(؂ wﮪUM!0H҂-Øg~){YAX'^h׮]Jc o Pbו%lڴ * YK`jV /dtvS'|igIE   u=C^xOe ҽci9qG[_l>F0hceɭkF7>F/eff_|lb &IWn91`tx{m޳{0Ǝ-d5rU%)Qjx6%;ꨣJӧO=3IlҬJid.4lO"fD=3ji{Q+В5S3fI-MfΜ鯗XIM׮]l+y-g]qwc='Mr饗ElDTbyoײ.cj;Sd/w\[֍7cֆɓ'S]l2VpN:C=$K0y$LA@@@@@@@@2^D   @QZsc% ŋQD+b SU*̟dI,%K,d?_zjg-Xlw_lYkΜ9TJAvZj^{lKfo=P 8r)>ʶIt+SO=oj'gP{?Z!C^{3<ZW_ _ԤI|<˗+HX|ri{/L,k<η5$: ĕv}X}P,!cuSvYom"DŋO/Kj GZlѢO:h ϾYfk~Wʕ+avhn}YUd`*`c@@@Q1.:c~K %K[{1xh|M%ƲtlKepױ:c`6X6j%g_6%'ʩ|Iiw+l͒@D3~Oi;'2xy"}<1hNq; {9]ݺuЎL&l@/F>x'$dɒ~z̘1cڸghbՑuԖ>%6KiI[ŋos>òI.O?OywF],_ϝ,!dn>Q3Z}6Y]ĶVٞoq5k&=Z՟evvaٜX3(6]&'l6         QVzEAH_e 9  / k'p!йۊ)p。Pٲҥ=KSN% ,N.a%[ dwM:\p%]@\誫 ِ *Ur %g Ć-._Zjro \"Kv|C.X){e.+Y7˄ B.i_n6.21c-t{\sB.Ao l Ć~W[npB.Qanݺ!tps悇C.1\ ަMЃ>ZfM% լY3d޽{hԩ!$0TLwRs`a[ҭ.h6{fۛMr[p !g+W$j~DH;m7G";e9:ƽ!䔨A{1ג}٘K/Zj%r ͟??&ήD˦MBn)=XdNŞCuEM׻dۭ1]]vYM<6 mW~=V[moَ宻Kj ~r[iK诓w9jժe1baܸqٞK3Ϟ7ov ۮ{o=㟡XKmmF7XZjxnҵ\k-[ٳ_om^{6ؗXmv*: 7l /]ɼo;7bϖ؞ծ]/m%'[."9d<ڄ        @3NRJ>Y @ ŊI;ݻw *J@ ,X i#q); xt6CiԸtҠAm K 鮁gڃիWJ*ʩ.XSgϖK'O.x+W-Xザr<^ʭ.طޭ^QG#F%K)>Om_ /|/2 /{+We/KڹsIytZhjrBڵkUbUmE0eTC Q=Ҷ""[l\%c+6~icTu{TW"}i`HKV~b ?k.n#IB&e1}Md 9?17o.Tz¼Fw`RTyrF@2C$$$ŀ*1맲WEQDװpU(FP *ID$3$93|?l0'tu]]_U<%zۿ y[@]VR^'z?| jm<꒬Zn6y!yh"V4)⿷/i{miӦIC^CQNk]>K=Lԩ__0         2S\,D"= p2ccg@sNA6J t7182Dwv \}F-h-w 3 e #G \2eJ_fVl_|;g^z~Bceu1_u=䓊w6-ZIs >\su*$NsbUOش (A^;'T7   @ p?6p*ͳ\<@ƫCx*Tʒ|R })Skƍ5l0Җ2m?~;Wr^Ѹ+VkO?){M\\\j|x -^X]tSO=3<3iY L3 @ TXQ=C        @[C@@ôtτ@m,nonyPnuI/$oAko$mݦ=z6бYfzd|=%0%K:n޼yF$}uV7nݺ @z%5… qeV@oaXF /$k'N[d]viСz7o^Y^͇<5k 6mʔ)e9}lxL:T|@@@'xBݺuS߾}Uvm}.)>֬#u /=ł -Ԑz_x5koP{?N>=(eҤIZd @ɫ(ջSX4a&޽{ vof͹^o] .tC@@@@@@@@D (94TGJ zU&M$ \:4!`aÆI^퉶VX?K*/-w[c[.toڵҥ:]r%*X`V&Ff y)Tlƒٶ`葲M6lB?| .pv=͛7!zjWkѪUVk8t 0YzO5ڋ  c Aa/ÇO?շo_m6 jGrK4=0PNسgy曲ԊAOO>I_[অ@rQ_րBBdW        U Ƞq@ x~DŽ! >,s4{I-gdN 1Q>LƜRP`~}ᇥ M-pC?Ι8]|֭:wEb(X|/4m4UZU{ 7ܠ5j}Ob {w#+%^ ~A~:t%-   @d p?62[jmǏ%;=@wቄ>`=Z|[7S.]\( @93gkˮ_~EUTQuWe˖˓ho;C;SK68Cޠ̯5{I&MW_}!ׯ_x]p:_*U ./ jZg5iD]vuSӦM#.1cYdI=֭[jY6};vAϱ& @0(W  e]ƍFQVD U ISJ眓"|&K;J|#ooT*E5,n„ UvwR۷O5kέsdׯyXĆ]s5m47yǎ.0 /Td˗J7B 4Xx%R%`SO=^zIjСCնmlm@@@rV9[%CQލ!w@;O]tWiРAT<<$ڏe,~6}^wv]v.Ryl7nk-_?ǣGwgj޼yi~ h޼, mE;        *@d8dUGYc=@ wnQ[ySO͝}XJQC'A s=3 >| V6*sN7`Ejٲw5WӦMUzn C v @sz?i֬Ynо `ssu-vYCb {~g]~߿5k Q7o4_yϟ_D4cXn{رc]ޖ-[TL[4iD Lg+|@p<g̘A8[nUٲeվ}{AW݃p*WfEܹ>fge}K||V .  @X nj,К         2fD"Qyr#+K/Ҽ,^,կ}*=`o|5\r.Ns߱(/?g';ݾ?~9`A6Cpl~h퓋#K @زe;L0 Q@@@@@@@@_ ?FQ('C-RR /d{sltO?6nTRe $=4oT^U.sN7hlYߪU\߾}jdAUS*W즊+& X_ .3!}vmܸQ6lp?vZ~u:tPRʖ-j5kt p HZXBZ XdIkM ٴiS*T(4^-mgϞd ߱ES.]ԭ[7ݰ*   @p?6 UHUȑ#?(XZ?Lbb[H"Ih{Z%t{Mcg=};n~g:up!8G/_5=#D@R3Ϩo߾Q        @n  A  @2=~~U^P/E SJm OʗdZ "|Û7ov^@X{AڵVZ`䩧r%Zp`2eNJ.-̔? ؀;vh֭'M[lM6ɟOhXYg%/6t38=(Tk.ZBZh̙3e LoԨ,^{6?l6~wo3g~,XЅY袋ԦMBHCu_@@@ H܏ , Cw;' >V[ I(Q"A;wRcU{%c;>RQo N>n/cPjUiI>ըQY@ -ZB[= "        Aq  9cת]o-{`>X!ի]$;v ]4i-[q A`}@@@ eI-0Cwm۶~&Om~-BM{\{(}gˡ  *k-9rd~@@@@@@@@XFG졣  ,`;'2cJ\\՜K=&I]L,dVZn d 68BlP ȵ)`]ׯ_hA ^%X 4⼋;ۦ жѣ唓 ޶̩6lς/mgiڼ #%3ey\# @H,Y" a3f gk6yk˂\0Xe]+v>|8:kؿm~bAC'۶m^&/!ɵG@@@HJ*)6XߨBݱouժUI'Zez;~P$;>QJACm>_k|| }~?d}@"Aef(         y 3o  d[ I/M2⍓D@~ҨQҵJf 1ІDXmPM5kR-҂,ҟ/ 0&PAo\ k3G C"2XjOpQڷo.z[vlْZcG@IDATG?_^$Woe˖=i|   IJp{HFfZB&GMOW4R3uꩫN Q4_j6كH @ Xʕ+@@@@@@@@V6  @SJCJ~()r|@N xyqxc)*`&MG ІXɓ̦"=ǝ@X8iݺu1    @ XpM˗m^nn8 1!PzuڵK0.{@@@@@@@@,  8|XGE3[c}2'pXg84瞓Ə:R^-LJf@@@@#@QU»@@@@@@@@0 2  UB@^ o+FZqq떘uf |tKKEAi!    d_ @|xIuyʕ+xE@@@@@@@@ @@Ȯ ҀHիgwk@=uY#JF:r$Gr_`gEA@@@@HG tp @L (P@+V$2n,        y  @. ')#. B .)mD /.}=Ddt ^-Ues     @ *$<e9 PFZjUk@@@@@@@@L|Ymj  @d L&}嗒 .  {A>6~[jY3w쇭R||ו"    (X Po@Za@@@@@@@@ /${a  İѣҝwJ:H_4=qqǫ`$%zzx@GYJl ]+Y+Ayi5    .@dV, @ nXR@@@@@@@@@ S24 #  @ ~]1"ӫ9*8Jt (-^,u&͚%ը]5 ^}| 3b @@@@m cz@Rr~l@@@@@@@@(_ H!  "ۥG Q%-8zҊoIsHSJǎyH| ykԹm[$gE`P!S6     #@dkZ ;UVՖ-[t!{A@@@@@@@@ JEI;h  a)0p_eT 8 5n,m(ot_agub8C?] -*-n-]z4q`k 5ΊՒ7J JA@@@@H[ > @rFc'׮]ZjF         1 7H@@5#=TDHNcXP!U+iAޘTK\ԭ[_a T(#t5ѣ% Ҫ    ĔAC(  3Uu^ H         .@dV,  @,reoL@>RZN,(wF@7H&H7ߜ9 m A     @`AR *pꩧ@JHHtC@@@@@@@@O HN@@ /HJal>[Y3+T4I<6m?;'&DAu-    N ٳg@ȓ'*x`Æ @Z        @ ,E@m6zmZzoR^uUi t$}=ܞGݥOO"K1)!AzS[@@@@@  Ib@ ȍ7Foi        AmI@@bZ`diX^i zILZ9|XԾhDkWRھ]2ϙu&j^+ǥ:;^X^Uˍ@@@@@ G@S <. @@@@@@@@ R S;@@Y`hiù-nU[miD$AgO)1QKzC)'`AvTSc@@@@@ mq  9mڴXh*mD@@@@@@@@ x1J6  R׮R&h >]$yc.N(GJW\qGrkHkD.^,nDq,R%)(n$MC@@@@rH ȡ@pqF4@@@@@@@@@ AfE@@HO`XilG[}Wʗ}I:1Cz5)Oz''/`A_Oj    A<5 DAn۶MF@@@@@@@@,@d<  @<ԥԼy촙F7JGC^pTXԟfO`ѢGHZٺUzԾpX p?F@@@@G 9@ zʗ/iӦi-A@@@@@@@@ A# Ć ҏ?J>'PǸu=@&nԾw6,(͛^oS`jɮq      @Afl dVlٲnB         $@d@L,  @?.u(lr|@(,v eMwn XdÆǏ{!~(%`AUgj    J Pɳ_@h(SkA|i        @N =@@bM`diSOڽ{٣0?zi6%z>,S烮qqqJkʛ7ow P…UP!j󩽷ϊ+lyJh:K?^ZBzuiPi^رS9" "jNMLHH͛m۶^%|M>yK-TdIr)'L+VMvrٵKڱ X>h;    dNn]ypdj~AoDOKLXBZ_Rd?& +[ʔ)&/Wʗ/Kg|5>^zIZ@N%%?yHI#G *oו+Wj͚5Zz6mtF>@7r", @$ؿAA@@@@@@@@ ̉@@HU`BixoSXBܴ~z%6l-/ec"E-jz }C- Ϧ%JW/\ Af,^,Y_ݺIX%v,w^g6YH?o߾mz X*UtTjUd xY#!%&jFI3fpkiΜ99sxIv,;Iիڵkm۶.mpO;Vvg~켲oݺu.pB'ӧkժU^[eVf͚un:ӽ߻A3@@@@@  =Hm  䐀= d3        1!䐘  d,K^:uxY,;wjٲeZrVX^mۻwoR,1yPa:uTB C?Ђ,xx9Z,Ά-H矲Muƍ`%Khʔ).p3yhdѢEkԨ!,X^O;4,Y2;Պu:Kz}ޒ^~Y^f}4m!Yرc5i$YݪU+W dy 81ɎqjΏEB/,ֳP:x۝T~6Qy9^ȦTXDU"    ! 2d@ D!       A9@@bIˬŤ^l2J X˓B-]M7oNjY\լY3UZ5iVJ*,3Y*U)-رr&$$ȟ,B G) KrTvm7խ[Y_Zd!x_}I#F֓OO?Uoҁ:? O[Ö΂Y:/v/.E {DžZ dnԾ}<'Vw<     y@FK= dF vAfFe@@@@@@@@b]ԋX?h?  @~[b^Mb. X`… evTի38ŝvi. ->iSFRelٲp &hn k۶Oe޽5j>#7Ny{|{\j$XgӦMtѣ={k7|7xCڽ{wSs AFI@@@@@ ~;D@ zJ,]vEoi        9,@d9@@8vL:TK*Z46I\vf͚9svӖ-[\*W sׯׯ K(IMXp駟٠ŋkѢE_e֭[-[lR``ղeKUR%f%K\}]Yf[o.S4_qqqjݺ{1-_\#Fp믿:u; 7靦@@@@@ @ȤcްaC&bq@@@@@@@@bW =@@ S n%a8r z3f7o^խ[ׅ=jҤJ.#e#)`O:,7%om4|͛7MFҳ>DUTIZR6mts*_'Nt5j馛dAXjժzM ,kͥ{ZjaIcA=zeը     AaR Q PdIܹ3 ZB@@@@@@@@N#  I#/ Nj褯 Gܹsev'Ov{Urtg뮻r!͛7WŃ\6-r.7mڵk;fϞγASѢE]0-YfW ~A<>zhuusr7СC5x`zozpʕ+bmաCƍR||-     _Ae 9)`f@@@@@@@@L X @@$>|2#f,a3ƅM4I;wT*Ut_9眣:ul>lc6?дiw_WUdIإKuY+Ve˖ƎjmTJvͬo߾6l~[s~a.\8s雄1Z\!A@@@@@ (84@ , B@@@@@@@@X o׍!  ^zEM,Y~Z-ZPʕuwѣK*K@{tM75G=bvٹg砝v9rĝv9k9r!/IqZv 0a!80W>}+ jܸqJp]vン}    D@B[u`46! : CgϞ@@@@@@@@"S W-TtiY ޫ|{1+jꫯ4zh5o\K, I-Z욝"    +P Ȉ=vT@  .*o߾(C@@@@@@@@ L A5@@"CݻK.s-l٢jժdj'OvzVf¹ sB!'Mq;휷s߮`~Xz]wݥ)S`'ַٵkW͟?߅mlR}Y#n!     qqMFt3< a'A8p F@@@@@@@@G P'@@=Zj@^=l۸qnUVMiݺuzԮ];ɓ'@Ȍ;\s}Zk"ʝwީg}mРA@Vo$+%h*Ura:uMƍ ھRΣԾ3@@@@@ ȨJO@ȼ̯        ĠA1xi2  @&M:t޽{տլY 6LK.=ܣRJ2 m!;휷s߮)Sk® FS|AOԻwlu3!P-<|pSW\qf̘Ago    ĢA<- OPBnAϘ-#       DAu 4Ho.lu!`7TǎڵkV=vLJH 20-B@@@@N D!  v!2'4        @, G6" nձcgpY9XȾ}t 7Gxb]s5ʓ'O,46"] vMصa׈]+vصhY|n6{コ]rX -lٲ뼿^Rcˆ ҡCAM#    @ !L Ȑѳc@@@@@@@@ 2BF@}E(_:\ڵk5d]r%z駃ϟ~I_jʕ9}ٚ6mf͚˅bl\pkS.]{=jܸ6nx2ҥKէO5h@۷wml۶xkgyڵK=Zj宷Çk6kŮv5;UF wj#lgwְaԳgOxXcѢEch fY㳾ze}#AX3ԿAhD@@@@0j͛5tPw? V}W^ƏV2 #PP!؃Ni)         2x  [^^j1cJ7mڤӧk:zhP9qDnZŋ׫* : NYf;<,YRsU&ML j.Ҳe{_~ v۷/(>3^8ܮJ5j;*͙3'w#FVZ9s4C#S@~h׊]3v5dRz~رcGOoјȑ#+K/_~ѣq;z{1oAqqRʙۃ,eժUzwdx oxX P @@@@Te&[ݶmLݻ7uaoC2G@ n`z%Xa@@@@@@@@M h;@@ h Hمm޼9h7ܴiS˽]Nnܸх5nX>߯K.DժUsuhż,rѢEʛ7oOu7{˹oڰat:uD'O;+0 'Ls?Xڵsˇ~C˧CԙA® wkk׮k*/B#)i <裚4i  mܹ~ܸqioz!w|YBƫ͚J 3^vMo>iU޽e­7<<    伀w+' H_X[nv7n? aE@B! C>@@@@@@@@"Q Q"Q:# ļ>tee!qK 1_S[&1B۷oM(Q…@Μ9S ,2 ֭[矫PBYBάRT)/$Dl,[s%ٳ]s֊/Ʈ"iǮ ;XB*^,ϿƪV֭[`P[ڵcЖ-[dTjB[:|v\UŊu'r-n~Ȑ!ILʕձcG}G9ɓ`ڱyzع>eʔBNX7<f     ;A^Zߒc ~U=d @A_@@@@@@@@HTHӧ  #x6kVLsƌ뮻[Hޛo 6Tnt&-s+~5jH?TRegyFӧOWKH7rHiӦ׿%K&m'o-vgx QFq'|ћ76ZZ2e2ZsvB K믿V*U4p@UPAO?C 8|WUXwqx&o#G#xm;ǶA8?vX[zG;g r}s=c*Z?IZ觟~^:,Vg? aeZh! bAe˖+ێլYS^z Ƀm{v5p׮!;'-_~MiӦҥKsd~޼yX}^>cZJ\rA{W֭~Y %KOv|/^ ]vYpg޽թS' _횶@M=?m%;횶B>r:Վ˃>BSgXػ.xΕ~,͹]zꩤ=mڴIÆ O|Iߧwl {o /BX:3fmy智+܊=~[7ɎR 6{_ ߧu(6vfJLLt xwX)\ Zjowꪫ\X߰{cv\BBd}v=>sIuL7i!f@P X @@@@@@@@ ɩ  @^l@XŊrVeP1 z]Y2]t,ֶmԮ];+W΅ڵ Ȳo-{n7 /@:?.y N:Uh"7??3lrY-gK^/ lH9 XÇpcǎ;k.ToϞ=/l @6mڸ0H D N?mrej+Pi& r-HB'- H>o >߿ >O\E    ČXuwPm}\s'|Y=hfիW/߻l2d߲{ m۶u&LWVһt-zؽE{4ic=h!VzX-\\{j߾3n8ׯAh^@0 9@@@@@@@@Ȝ@-  ĦUv :eg֭ڀs9YDZH_fgq;hǎ.˂}Y͝;ׅf*Uj|n}?waۆ . <lZzW_}M6ͦ Ղ,` d^6-%/6H/w=n]?>A ZfuAf%kfXٳ݀ (|RZ(5ZR,K+-[tYٲeOX}@OW:u\cƌqAyUW%Z=-$B#cbgImU.vbג]Svm,;dA9]<6k!m0?o 3:~ZvWJΙ OYnGm?]6-6nVAu[xH{q5ydY >%`W X,o6cVxZ`hU     @>ܻOr:wdc8PO?TvJ5jLjԨ7هoomՌwddVV4iWؿo_` 믷ұcG^߯  dF h,          +qTElPW5/҂,Hkڳg.䒤m\|ڹseF+=\-ZTK.u^uU\م˜uYnxYtQ]qg޽U۟|۷/黴f,pڶm|ÇVH.QoKjYph:ٸqc7N6@۷['#Ww? O{ڽY@@@@@@@@@d&|  I[He ozgtObMI$O?[X#yuɒ%_sI-Ze˖_~nU hK - 11 Ub)w Kt֯_ $}r<ڶ-rܹ.39ɗOm>3#ԶN=T7&u[xWu[]}nUte >PV+ . ڶ]KvMv=~6ZJm.5k$BdtB'c_G7n޽pum(Ӈ? H_%իW!¹&e7X9s_#lJ+2Dݻwܹsc`ئMfn:h'     p/ya@ Z>_7|ow9{Yуiܸ5kwyOvһᆱ ߯r߼ys+hy7{n          @." aSѢlv|`رcuI',.T&N{E6lW_שSzsqAGg|e5TwCI&AhVҊ+6nܨ={[`_x5 .a-*TP^4p@N6ɶ @IDATի5x`#kjڟ/}ٺdAtݺuz,ޡgYNH5ʇ@ioW,:w<3gN-[f]~9s_f.?:vÆ \sέ̥e˖~'|yQ> Ӯ{9סUjmifj_[iokƌ/] \|y,_+Vq'LVʂw-4vppNbAIիWdwMUf#wku=>K.~߾}eAٕh'ٵr@@@@ '+=$'k@0`U_gq^oVr;vo@v 0@veOϲeU!r}Qk^vU,C@@@@@@@@@^zk   YI ad駟nfi{W]t*_+(ز$7 <ׯ_oY}Cـ/B7tJ(w}W{{9r-+SEM6-ɂ-B#s>+V̷?s.mmX?<gVlْބ+^,(—dׯ_츰pD ޴{f o3gݺu a<2 Zrjdɒ7|KӧOמ={{|Ͳ&L#GʂQC~iBRܪ_J.Z%ǯc ߡ/[@~~>pK}}衇آEj1v-[6:v "~oXiN]X.]hӦMcLJ60w~y֭5h $تU+j֬Y7sm߆ʓO>+ tZk4e`\EU\YVN*Uǹ }5߂^m_j:ݵzgBGs ]oBo,   KGP _E۷V?|*;ݛngUw zU}N~ު@*U?h~ӳzoZK~ >֡C{u3          @K.M@~y=CUi@oߌ{Gn XS\cSO dSƍgpgr6lj `3}[o߾}7B.L2_}૯M4)Uz k o*./'}Yg׿jEpAmpZ-*[.@/BQn`^-Zv)Lp۴ipB~Boڟ./B ۱aoo2R31  ,ۯ]vohSrFw|3f΀d?3ٳgَ%܅xLO>9tҀ ԨQ#"db;w\@\K..3樯+йmmD'ON_Ņ+5k qp}(9c玝CvI 0fLn KO){ѵ^p ܃һcy Zj#F{=TbwgO=~6v[{KzmxqJ~_qA{W^;FiuXox# -bnX@@@@@@@@ l?H5X[oE:*A@Zd.]P9U"I,pROsQ Bti֭g֭[7RJܹSK,(;*V"E d G ]M+3.xE\6u 9B2rJM6M.3Wje*={ꡇҚ5k'|Z}g˗/b3_\pjעE:yŎ);í">4Ç˅f.rZڴ@_|75$sk;\vھ}J*m_b}d!V@@@@"aix鬳!@\=tMU|+Zi;yîs;i=3H{v7{[>;7Ńr~d@MA߽@@@@@@@@@ڇ @ t B ؀zgؠ Ae\;/`or^u_s .N ѣGg-N0!uZ6߻whءC=sd!=\B$WZv,0rw֋9tP=ú+ݵ aYBa6lzGZ5ƒ /XXPC ,_?/mS4J RVդI-\uF-D@@@ȹYsrҤI{9sN99$։m㴆 @ ;C@@@@@@@@Fe  $@2ҦM޸;χկ_ FQQG#FSNիW>.rE+ - 7֭`3E=9,mwf0H {<ՠAϟ_? u!VOR4`*:ߴiӃ~oZȑ#]@[o%7Y}Yu]'||nذFicꫵ~z}gQ%r&w̟?_4j?O1=z-3ca, }O6 p>D4$UuviٲeRm   )0goszⳏ 7xCW^y%YTPAWb ! pp{(fm         @^R@@0JENl?7DX߯nM=z|w뭷nPҥhkٔZj%ٵkjdZyf6l@yM7iرGZ|Am۶M]SklӦ ݻ/ f5lY%DgϞ     @ ۝)w}e^[nڽOTr1           'UE@@ V/ONiw-'t}x#<ʕ+{/ ֌nY]ѢEQu\ivl1nǺh瀝  mO?~kE9~-F[c/؊VYg1c}Q>:M    @.v ~ \±:y `{@@@@@@@@@@< 2i@@ jԐn֭K^w_˖-O+VЈ#zjmVwiӦ;c؎e;ضc܎u;طs eСzSOe˖E?TÆ i&M2E[jb    R`۶JYb.PÔSA@@@@@@@@@@A  @+͝Y%W T.]n;VM6z{w\ZqɎY c؎e;ضc܎u;]>Azǵo߾h7[W^;C:uԩm c !   B(Kbr%VE< H+w_@@@@@@@@@@X kqC@HHJ2e3 UyϟoY}>ls1ԩ{9-Z(a&vLڱi9Y;vcَi;c],rڴi{G5ĉcݍiς>|Iխ[WSLј1cK/AOdRl   $A(!%ƱI$AIC@@@@@@@@@@ LF@@FY3TlN:8p~\ϟ_ Pڵ}^/jH6灀kvٱgv,1Y@ڱjǬv u)T,r֬YRڴiUѷ~]K-k^4{lo>Oarzێ  +m!C%KWY9gA6Y(۾}4}t}ך4iz)ZJlWN5nX5Jʔ)PUlܸQ?f̘';~gp{*UWV1U@b;4|xprY:ܣ5th\yu]ώw!7ղe&.=駟3^SZZw~z]gh]\_"U#    DR`&THH] -Pjz@@@@@@@@@@Z 1+"  -ť1c=c$@B}_5eM:ՇD>CZ~_VretIjРիudɒ9hU]`֭?͛ٳgi֬YZr4 BЋ/XM6i*U$fgI='}d٧7 b{>lv9l0{\P乺9xb9O3g 'x@]w]\]- A&)Ig@@@@ 6lxJ p65LG@@@@@@@@@@H -5X[oEFA@Zd.]"]3!!dѣSc{i+WX! x MpBٳofJ| ժUOkE&EoΝ;d-Z$,X WZ巿PBk'|rTjՄ7_j:x饒,um|M;VSuW;߿_ L~Mr.SnԲeKww8+.N)%st@@@@@'g@xX4$wX͚{o #`bb4z        geF@@ lg~˙s )e C ŋ5o<͝;ׇΘH/\InN> cwqzU_ҥKL6o, iui6Y&g6kN'xի5k@_b{_*^\`dݺ +VLW]u6nܨQF>P߾}ճgOwUVj޼Wm񴂝;ydM0AƍӦMdy~#ޏeˤ*Uc    K   {{w~!         $@^$b@@JK޽ѣnkt0,N:~N.R;V*RDzjٲ~A >}ܾ}{zGu*U>UXQ*TPe!c9 6ӥnذA֮]jW֪Uҧ;v -ӂ Oq#;uC;kԨ5ӑ襗W;V^t @1sGG~ڳg[3Ƈ'?*m͚5Sd;#;>ϟ9sh֬Y2eN*TR:uH MrO]xe""   %`Ae˦6$d Ƞ"         ^ ؛"  @ \?o/*A モ7G曥c9ʭDM4ƍ} + W\,Xdw ߷H Meʔ^mdɒ*QDɾg!ED{x( h!vm۶ ֭[yf?mڴ)ՂCSxmW4-t;:M B S/}I0B ݥngXP!nVl?YwiZl?6֭ڵkj& D}uA֎Ov%#&@.]TP…qӴiS]s5>OTZZZ2n]iv#   I/@db60-d_Lʦ           &! Fw@@R[骫$mFI`I}^ڶf̐N:)gdv6r)Y~֮]uilW[f/NJܲeQ  y,/YN˭.]B5iϞ=>BÃ-2bjYʥZe(KkԨ,[lkr|d*8 5* GR;k׮(6UX LF"   @B Z{v Dpa=ψ          @˓Vi@@6iZ7|CRÇKK"M(=||@nI oz*W;/x|>z$fdJ(lZ^=ʟ    %` DZl/,r`          p  REUz {~c-`7(}ԯ4hd(} ޓFV zԭTV^6]`2)-MZ5{J@@@@XJP!x'5jO g@@@@@@@@@H& io-  1WjX0K.i4 >z l/*شI;V` ?yeRjjV ˗IMd@@@@TЛ@H9 Sn          @\ W  $@ÆR׮wK;J'RvIuIO=%(ƇҴi1cɓ4ɂHGbf+H  ^=1J/@@@@TX7 2G@@@@@@@@@] D߃@@ O N!Y{4w˗Kի;    ;u(M 2ԁ          p|@@+JKHW_-p2رC`HK=zĺISH.߻W__jNڴJJƭgR`@cժCG =B    @+<#$ϟ_ڲEZJڽ;8'[r"l}D@@@@@@@@@Hd yw@@6iW/[)ё5k.. hFFI{~im ~m[c8"&I_}#_>gO'5ǥ \yT`uy    [?m  @ ؽU{>ZdL(r]u(K2~;@@@@@@@@@@"-@dE@@ %痞yFjRz [dFϚ%]xT4yr0-杠'u~4cTtYH+ծ$5mϞ?:~dA6}Ժt    @Ttpʛ*d'`}dTԾ}          G*@ }@@_3UKjFXh L(]tԸ{R2lM`z4]@KUH_,  0H y%pC 3B _@@@@ ,F<#@|ۤI=x`vyQGl)!          Y|@@HmG c3B ,[!Rݺ?>M;r .L=Ѽy}ȧ zM"   B k֌EKG"pR p, %          DR HjR  @ +&4f$f$@rRʇޔ^%    XHoK/aPܿz          <A&ϾdK@@DE ;;/N%I7|S2^O c3".`o=wuGK|"\))+VX}xT@Z>5ή{MH@@@@H췀5(ZT*`?d!mHKy             J  )/0xTԵ{wsDz}VJKHTd&H_,թ# e]B5J:|iɒEyVIZD$z6'N?׹!CiK@@@@ VojN7J{|kt9|          @4*u" @[oII}</u&tG\$Q#m[i&R lp]Hk-h#=)ıAۗ]SN f\;@@@@X02Ayh vZanH:e          DO R3  @ 9 .  KqS.Dzî/&޽ҋ/JBO8A6M+sg)=i$5J>[iaUy@ |TPnX?    @ ,X /.Uuȹ7g !-M:Tcs^k"          pA G@@ ][nz.bET知ϗZ^yE)>ܿ_z%ɂ1o4rԸ5飶m۪C^%ĉ@RFtƮK;s    y/`k~ȹ5H۳7=            F%ڴ  Op]͓n͛']{M:}46h'!CҥW_uxyx*? VR XPo.utݺuZ~6l'߸q6o'[lmqVŎ@@FeRSjկ i-x24x:4o*6B!K*ηҮ2>h-[Vsl\r:czY2@@@@ U޻S'UL{ݺuDZgcm߾=5|>bJCC|jk}W*=V>{m%W9,kfӆB)q|}(ҾbC)V:(k}zPWl}%KW{OA@@@@@@@@@{ ~@@x)iB )S*UR KAh]dC,0nԫlԯ\x_~EÆ sO_L4 q\bVZ1^ڇ?]Vml(^-FBmЬM6`64zǑ*}$~+7\WiCC6;4o!K_Nӧc b˗+VTJ2LUVM&IA@@@Y d W^h7=}Ѓp? ?ڽCZТC!`BksPࣅ歭XѣNގES Bkhd~O?zMϻf͚`PHtfw(2Ân3p} Ռ !         I*d$b@@僽Ԣt7Xa[InUrljx9K"u(}tqG2`+ɋ-Ғ%Kdj} N8A*TH2 eoBX e(p c0o4C6؂5gM0nFڀjժ㏗MijRR[|@@@s [7ϻAR@-ɭ[ߧ{uC9,Bծ]ۿu63 V:uY9Z {>5|(O>0>ٱ^v-[?X\r~kBx8Ŏύi^0z4{lۼLch6UXQ+WNaNGp9@@@@@@@@@@ HH6" ĥ'Kg)!r\v3rn; /|rAQW֮`>d*}Q֭uEEJꉢΜ93}5k~ܻwo֭[W't:wZj@ BJXM'|A;sNY0z.Z(=? vRP!m[=B>)    @< X5SK ؃S.]|r{ [cxgy-ZAz6ov@U%@IDAT4,lٲ~i;{^d>}~/ Hly)|ŃBZ"         @,{@@HHFw  ZС ݻ/Փz(X1xI⋟|"]tQ҄ r;?Dbj)Shԩ>}֯_ 4矯}kC=YdɈM%y/`OojRqm*SLm]~z~ {ƍ3Gс͛3PV1UG@@@s^ OPg1g.\-[5jڵk_mަիDY<SׯȾl۶MvYj4qDKڴinyVV-ծ]Q]mմC@@@@@@@@@@ W  @ "nUXQ1la~Sk c#CI3dt饒tٴa.eWw2iZӦM_|۷\rjѢzC6mʠ,%Y.pGm۶~ }uV}8{]*V,?}    py܃*"]3啀>ZٳӧyGilٲ:|ܙg5kxM^9Mf PmРh"-^8} 9Rׯ_pzeuZ@+S3@@@@@@@@@A@@`4dx5_v.]ye ٻw *C%1UWIUe m޼YC wUV-USWW֧~]qeUREgu {}J-[EZdɒ,T,XoF_~}Y}*U t绰eLA@@@" rb*D`׮]5k~GYhM+_|:T~}s97"g ď6kO{qF}B]ΝÇkҥ:p/!5j$6lN:IE\@@@@@@@@@@V*E@@yFrjBow@ /=,`^' )Z#-:t;`5B^M5O\ l۶|A?0VZH!so 7^h>s;CM4QΝd)    yr޾}|?O~/_^'|Zh={u{Q{ZD %,{MeΝ?.̜9S?}]]V׉'SO=O2i , G@@@@@@@@@/#H-  DD-қoJI'}TBDJ 撾Z*QڳgAfIO\nIzU'n&,]>{LJnc)Z+^#W;ꡇҙgyE{7V^*M")]pA|Whƌ3g ѣG׸q|X^W?ݤIH5C=\钗rsd!\M.SN|o    'o_=*ç0>O?… O?]65oޜmԨQ@F{zg5l0m۶{^ǫuֲ;]LmzG_꥗^u]%J[oUϞ=UlDL   QXD0ڵf+0=y?G}o?pOز}ͦMlYP=DȊia'N{9 iן /P:tPݺu          ȇ  ħqI~*;N%Ϝꡇ3W^ ;Cܲt4yrlB O>ݖ~ ^\%@֬YVF~iʕ}Emڴ!2!]̝uYcݎy;s     Y`Ѣ'je^h XZUwO9r7lٴi{ 0=dt~g掠nRX`cصǮA;]d(V5         d%@dV:,C@@ 6{Oz];3GСRzYWw^hfMK @)#}TJl9j(}zc`}v}ݪQ&L^zI .wܡҥK'VYdcݎy;s ;7    ! ,[V*U* X@t}4ZҜ9s4p@^=H{ 2 T"@ صB Zd$65ʮUvͲ{v k@@@@@@@@@,@df#  gI/,rawqֹtg~ƍo YPWd1C:Llriб+ W\f͚ŢɤlcѪS^uu+_>n$gc;윰s;W(    ,^,լE8ڹHN8Mo_a]| i,0-? 9? +X`X ƳgKIcJ%KƮ=/_x v&QK;vu]]5|D[ɦ$@,ڹ`Avn9b犝3vP@@@@ , >'">nVjJK.g}ݻDo@( 5ˮ]v k]fvk@@@@@@@@@R[@jo>[ )@ ?@￯ *Z!Bֻ8p`6z@vij0*\9s˲?ҽJe_۷ﰂ ׭[QF?T6mtwf`Իwo=n%ˡˏ?C 5_*R$_j[lqx=n׮-?8CcfŊرmۦ)S OW_}1cO>ZBm}tGʶSOUFìGvmoO?MoaϞ=ڿř… kȐ!ܹt-ZȮjE F@@@{]G$FK }ݧnݺoSx]yy_G}'7wޭzH?̙ƍW^Yϡw{iӦx3f߸l?_r%v&Ns0x)Zʕ5h }z7t;ㅟ~ QXfYyCy8',ZHYgs9G^xaG#        s|1o@RZ|FKF-B&-XNl K6KiӲZ3>)ը!뗳ݻׯXP}e!bV6nܨ &۷%nTe\0$elɍP&4x{l%t| Kfҏ.AnZJrבi1 mk @fΜj_D;vZϥ[_u$h]9o{;^驧J{9wa9c玝Cv.Q@@@@ 5^U魶:nisU*Ҷ9/;]?)*vom۶A\<rX>Iڃ^6o|o6C1^`nm}?fdM-`g: k]ZHARA~_3k=g{|  P,e}̙jݺ*Tmǚw6# Ǵ]S?~5馛'g'JygS=,l)A3ZǴڔYmYbr.h"; 1lqgFA @۶mu5ĵ'ر;ۯ~np_^~t 7l'ܱcG\`&@@@@@@@@S w's@ W,(ޮ]ud @n XFIA',^-w[xEB+#{v'{V 󊅆}dz;HeZ٠:uh~v?Vm+m@_n[oUׯw!TTjM[ŋgǂ+_mcVlr7$?~衇T~}YzuXVTj͙cuS@@@(\rEG6m?_c* +12'>3vUVMGuTvW -2_f}hj@ dd}NjwrcAY?@@@@@@@@ VA|\ NO6xc:SC6pÊ'ЬYdgn޼?C|'5j.]VZ0"E˵kӼyT|y v_^ !ewߍ,\}gl֙_/iذ-f׮] Zp}Ygu 'h͚5z7GC%~7n{{M]f֭+=?W1B?NY ޽{eA7xsTӧOՖ.]Zs4h!CLJU:3]|~_C-\r[~hBGt*Ukwzžۂ9(-^  l@}ݗ=im i9w#8Bhٲ.BA۷׵^+dۏ dy}Pk«`޶ڶd%㸱j*gUʕxFb-;u}F[~ۿ5jPvhO>^lZvmvX*'m;gۛrС~{$\ƍ5qDh"m֯} yӯ:f"   NuG⺬(~پ}nmǒVOZY?>3fp;`%Ԗ>G{^prWqZj^o2CH;kma~xqߊbz뭷1Ç륗^G}$=}$bA@@@@@@@@ G +}M@+ A 6mׁdnt7|Af͂N:}].%p;.)p>SLp  'gy&pT?µ0@t'h}v Tu;@ ҥAPz|rڕ7- R`gʕ3 v \dsn^p].B?8le:uM4:mЭtB(z~֯_?_"7vGy_?}]n B)}./ZDž+[n _n<:t\`p@љrƍAмy4lWŸz$ۂ B"kgnij-ڶ0vX°lֆMDvB!|.4%Hk[Hk[V>7%g$~\xgz7H783c9޽o|@Bm}ܹs}~=s|]clSLSDӞԶ5܉裏cۢݶɾvFոF>n \erە]lL0Z=yb+U[.pΝ;L|e}TkM\sM {/{[@@@(<dRcȱ*GO5(~ӝ(QP1w:9ٳ@L;N00߷aÆ_]p.uwwr0-xNz飶6e>uT|0^3;)1 w[|^+V,駟n#b Yg}v݋/' Wӝ6n VXKwW\q-J).02p;QbJn~RIf        $WL%5!%~gtvQSBulІ YZÇ}HBc,B_,~P ^z?Y/Җe;/<|VXLv7Vv k~B aۼDp)ivO? C,,ׅltiu>$n?c#7mlPAXvlP\l{pK{ N=љr}e8 pc&[%Kwp[AֲeKn pm]bKeK. TUm{]|Aw{k};n Sޢ    @n,<kjO%~飳c ֯hAv_rujZbl@kDJ<AƳxfq;36ZbX9^u$$:7kSxLoM -a'hd<}bق H ~ b%+뜨cj֎ymR/@ ? ؾ;djc u L“P[rXL;)vJ% x)}        $R @P :YuI.1r#BU4~xFtA;t wlbʝ[3gΔN8 hѢ*Q@SR{@@6رR^R7ܹҸqҫ}g.?iΝj׮] \O.7@^xa1w%/M6߮[Yrtd#70߶?.lf ={4Ʌ gmqڱcl̘1z衇ʅaq%ë.LRn@}5t/+?myJ{I8C'u~K,?z_{ 7ܠ:K-Z-b%m!^Զ/X^|E]pX;GC꥗^R=LFVȶ϶8]I`ͷV@i;0}'rAޮ}w{BUn]5Jn0l֭8e9n~>'m-lO". ]PF}9fXv_ԢE<ꨣjÆ {O>3rr:Zgk [2e8Xu"   i Y#U,:w+ժUK5Ja_xz˱юǖx;x=u M4;7 /YxGϺdXNڵ}x//v(+%>p/KXl:uw:[}8f'kkuP@rV/KxW_}%~'ꤓNڧ)S/Z=6i{.}*JxǕS@@@@@@@@ȲAY&@ ,wA:[}Jlˋ/.V^Xdc3m4Y(>j|d8x t5$ p\.KH*̕b!ػwAڳ&8+pNx;ì -qvJe[cbsiA6N/o H0k Dplf!O>=޽rm  5i|M%K0Kߏzn mVQ>7=Զ:u[nzwdl}z} dixմN*Zpex;ॗ^!Cߪ{k(|w;ivnaIFړڶ'QժUӝw^}>x3 reX E ɵT .Tzt衇fX tZ駟fـr%ӯ_?Y b% ִ0Q    u$kCɂlNN#DmP]>5ObZ}t֧~zD• x}#\2u OK.>\ю\wuZ``JQdz/Oy>k׮Bef}˗uOZ ݦζDSzR^b=;ػ74&"i qE HNxEZNb>xǕ㭛@@@@@@@@Ȉ@Ӵg̋ Oذ-s>~ؿrJ-_<:֪U߮^vϰdTJ2e#_>sl۶M˖-SϞ=ӝ, FUWIKf?p93_s>$bgZڼy{]~ڱc&M%J g*خ];`gf֞ ..([>sTZ/҂.]ve_R2X}O^g 9r{| f?>LM:pm YV^glu~.s5Afop`௧]6vm}yIe–Ķ-m{۷ޘ @-{鯿ABQgj!ƍɓ'O>dMY8ómVl%{O{   G`Z.dA*w0Âz,Ԓ7^bz}tqoƟ'Lo9=/gcmٝW^ceWw3WVrlx㍪Y}dn|N^{Vƌ?~o\bEu'kFrap5cuQ JgUnV۾XqoI{J<6hnݺ>|,8Zh뮻.@P/m!۪-#,ga7t֯_ޝ.m`^?Cw}8n)}eм/|Vd=*<UR%[&,;͢w~p~Ǩ=~K^j:,}wO?T90׮]ZSr{K )s1,@@@rTh„ ;vRTWLvھN@{¬;<rr43w]::;aâǑq<ڒu c1OՊZx15IOBMJt#P} 1b4 1«l=ɒ%.,jf͚m۶GaW\qбcGy睾:o^_}4' X-sQpH@Q  NlId5om>O@UTYHZ [ /ʕ+"z9p@/_^&MI'gyFC Q~裏y-ي!b+V!= b"l޼ avc~]${>,GiOrr_eҬ\Ÿ=zȾXIi[Asim mvֶ`6xBD\B*|3-ij&?{*W38#=/d)9XM6EiA$7x`?:v> .k[.ns^hۖm0PmOZۚoh:BX~?CVl2n8[ٽ̙;w_I-AS'OWa=߶'x®Ajȟs1|{O[Hg>}-'C=Fed1 ׂ=d${OQ@@@@p XdQSN_/NdK^Z{3z ">:;nŎ[ ۅPvB)S>G_C;cXHV~xQ:6ų2ӻ(;aͷ~C d2ﻃVac룎g]K~|x~5;3pIƬ%|M=4ZfxS:frxinYYgJ"'mYXO%y}I>;֗9Ŏ7۟%<~K;i•_x5nww{k-Cc:        "~lҧODAȻ2nܞʔ)KPt* w? Vl2꫃C9$pA}t|v֭Cn`H.By7X paz2rŅ, 6u.|2#U0/ P(/Ճ|AЬY֗3m470. \X ᅢ͛]\~Wo+[lpndq3gnЛ_nm9[n%c5jTtW.駟e&Mn^>7| `Ł L \sper߆D?4(nwu̘C׿J Rƌ\O\sM駟&ySrw[pEku套^ \hx_@ \mm]v Kw[Hm[MRyoX[lsAZSs6lM-/g6d.5pdH뻬 \zPdI_w۶mmyV{uK}bsns;mo?sZj{߶e˖.3{Y^ f̘RҼ/={&j:Ӭ3qc!۞)    P!T[;ݺuǦ~ݻwgעTwկhљWC?s9'p' kKZID]O?'i}isXi~;ǻ~q'eڥV:`Gkk83ho;nWr'% 2z~/p' j׮N\h`q;'cWw{:Ƕ=+Ԭ{mcۑ{>w9h@~)O{D%W]uU?l}]/Nwcߣl>;i/wÎ=6oDw%}h\G@@@@@@@@ ;\;jJ߾&LHPT p"E$Gr?, / ϒ>rD`mٲEǓrZcw*V(7An >_r^jР}@ |tuIޛWԑ}V]N;̙6mhԩSۂٛaJ2ά:'ݺu߆kL {H TY]? s>    @p"? ݪg 7Nr\ nV6%օgC+߶\\;Ѣ u'{%Dg+mG<^݉-N /Pk׮V֧BB/F(k.v,n۱D15q'xJO:m"^|رrX](H ,w΄O޽}]6}rYKoy2        #M 6 Yg0& ae>p4&j[ZTx@>4p`Xo }3g *`ِ!C+nm,%>{ܛ7Hsf [Ӝ'sb˷{ꩧ0)6NҤIHCv{Wׇ&S|0iDangׯ_?=Sy4 @@@Q嶹pBפ^qAj5jy`묾؝VZT$}];e<}-Z? kڴi=mF=/o}l'{֝Uoȑkup<- W3t/ @@@@@@@@f\?#9<ר4vp J@"JI]$zԼy&9'!ֲ;w*VX,6O;ɭJ/wB yg'N-(5lP-[)SF/z.L/xuY9,,qiΔ@ۜXF ٳG6ׯM⯿ZSLQ>}R z*Vo1i&ڝ~9~xtMe„ I{@@@@ "||*c^¥l su᛽T|Yx!53o_~a]n]//pB;6MŻ5W1sq[l믿I;8=:Uh\lF_`ѢErbǹxfvΝ;RJٽG@@@@@@@(Eܠ Q߷o&7. G rOgQy҉'J+VH|#'r0%gI ٲ:J5j xjz^xavmsA-X 'dEn@ף>* }›*O=M5k֨Zjnr m׮]Z6v޽~`'/^>'efJ   D`F fH.K.?ԬoK.>Nd}W-Kg~?PgVդIpH koox 5kʂl/rgˉXg$(HO5k:m@@@@@@@@&@d(C˫J@1GjZjJz-R,8p|髯R䠀 Z) &<(j*=9rlp⥗^&I yCvءҥK`?s='|@oQKA@@@Lu~3Iu'jҤI#8B'|$&H)֟YdIw ,A /%k;YM߸YgOզM Ƭ @}O>юŖRJ&         Y v@ Af D`L;n%+eAիK7,]{m룆زE:Li WSNɹe!n:=S~6h;vdmx iex駟H (_ *UY !   @a7vH1ΛpB;zw]_ ޥsZMVDxZV`׮]PZW?c=Vzwƍ @"+2m@@@@@@@@@ ڃ  #`RyD*騣.]>6lzZ=<;g~]n j5#rv,-X߮nIoFN:N:۷>lWV$7hܸq0a~WuY/ۧ$ %0C@@@/PyEl:tnݪӧkڴiw6%K0ȣ>Z6kN5j+ͧ OVjf_|' -Z~+Bwʖ-Oֈf"         @^ 2/@@lri soW]664|<3g̉wX47^MYZ(Q' {W4f=ê[z:t@x^{y Uw|M[Z|5k!C_~>P    % yr,k׮~7mڤ3g?ӈ#}vժUˇCInڴiVZׂ8w\YأL.7.]ZGyX@w+U          G$-}Fj0!Q5R @)$jC'7K[KK~(-9G=gҠARv9|V~'k~ʕSNt)K.:C 6R`ɒ%2e>M6Ml޽t衇    {.#L5kJ}kͽ޽[+}rڳgU͛E~j΀ոqce0/ ]p~wowi͚5*V;0mև?ڥTxqη^aZ-`O~`'         @Aã @  )ۦcn]喌WttR>9]kFNzAl9|Tzw5uTmڴIk '?ޅWF >k-O>DV\+pnݺk׮.%5P@@@@L l U,w sLV;|8ܹs5o<٥D3hwgò084i";sVT)OF @܇ɭ,X i;йw^+ mժZl/-TRW  *          އ;@@(G! & *u$}telAPR۶{s?KI?(/훳giC={4;ō6m mݺUUVձvڹύjӦʗ/_8XlزefϞJfҌ3vZ-[ogG^1o5R@@@ @ґv|.`AoGyU @˗/ iɓO~NJ*P ȦC9_paU\"@ lܸQ?bK,v= \no[0@hSݺueae@@@@@@@@@@ 1Zx*2aBj@D ؏دz誩@  t*-^,͛'+ (-\(Ms3g^|Q2رR9| ޽[sg}3g]E.[nVZE'Jݤ$asɶ~I{Ձ9uAM/yORr>@@@ȺumiD3^5iʕ+q~Yp NJo|W>qrzʼ%`'ٲe~Y;!,aÆDcwp̦ڵk^VZ\~8O~X_jV@@@@@@@@ O"U   _^jT.$Xzo㟟9sN`ziȐ@d{]x@o[>KB Vڶmk?dK͞=ۇD>ZnVZj֬\j&MA*TT`~  ?o׸J*>OW6mtQGB@@@<(2mTm[lM6 3SN<$ٵk.]C!-ή4uTiӦ+Vgvt R6LCחM݁ /ЇZWDN!         @   QC9R: Ӥ=r\f4IRn҇JƣdSX Ԯ]ۇa<-6ヒNqܹa7nFt԰aC?ta5\۷/,YEHke?^k^>Ԛ7o'OA@@@r[r\v/`soiSJeƍZ|VX' v"?Xg YĉWoeժU}?Z<.+֯vZ^ZV^pXN,UfMzAa6խ[Wp@8;          @ @  [Bi@}{Rp6IќXR27åsn, `NN=hU6ւ 4|ha\ "RH٠^zAa|J Rl0{8.-[.]hSΝua}K5h@6藂   Enr~:Zl{՚5kdxa8]Z@͘1_yb#@@j|(*UrJ>Y;-b;l03[N6ٶi}6M6%zm۴G 6;NjՊu3 7@@@@@@@@@@0Ȭ"   <4ytK/=E=4x4\N{LNsԩRNٿ\@NCM={LH _\2 Ӝ9s|֭[UtJڵwx`t *E.]:rؾ}zj?76 N۶m-[s֭[W-Z撝v|>쑐(W@@@@  ,=)  ; dz#H |Ʌ{v{Nc}g}{IRXB >2 /΂%拽n˗/OjѼvl٢͛7Bmu>wfO6m{Xb~QWҦMKo) &m          Ap  N3H=zHg-zj˗ ڒʕK}~iӤ+,n12*e lSrt=;4z~o]:Vn0|X"fڵ+)S\6 h[Vxi69y"Yʽ B,Bbm;4ڠ poxi)6֫DMka'pB4lN:>RJy6     kZ%!YM ﳾ0.$N^&_UN׮]_:k}ڥ[n0$.< ~~r :!         @ndXs  IN;M:i iA|IpYj.+z+9,c曥^w|Sj ȃKÆI/$RXJ>(]|qI7kM 6h͚5nZ[.ɠh{JѠM6$lAf p `Nm*Zht ޻wkSl ppAU,1kw˺uU+ ^k̫U&R1@@@(嗂_~0CXd'p0h0u $ C 5yPaoi)ևj֯j}j{;o Wvid&%m-<Ӧ}OR_m}olˆcoϛbasJAYzuY\ XQ[ Q^S-.?Qhϡ          A@@Ըtm]O^-լ#ܗ˗Kw%y{Eۥm͠nwI< M E})T 4}eXТ v<01m<1vpc֜#Sl*]t%H]&x`YQV@@@@@@@@@D#  hv"ݷ͛ {'k 'H-ZH3fD .=7g6Ԅ@bL:u>ZZNzmi@ 4j$=5H?/ի9ܷv@@@@@@@@@@ YX_y@@T 3'2 ,l;wJ%K&YO? jԐ8C*[VCi|i@D.#?@zM騣OMB]-     9!P~d)KX uʕ[o-oɎl)u"d}@@@@@@@@@@ 2Y"  y^YH -H[$m=RQH[7J'JHuH/}t x#tR&+iyysW/f{䣏N(+*    ;u#M@5  Do]$}.u&5m*%ؑֆ"         _  d]wI;wJߟ-JM4I:裥UCZ@i|i<륃*D4^>{F5??woHmۂ    @ )#ը!s%#Y8d%{~K/,kZ;G@@@@@@@@@G x@@B(PtңJ˖tiiǎھ۶IsH/$tԣTvd:,idE i8i:i ۤ&M{(L[F>sח.\EZH3Fjڴ0I    yYqci¼Bچ'ЬK?9Y٠A|'\          @g<@@ !OD!_|1iA+m ]+Y\ZZ"2@ٴj~I*~tRvґGJF=S1BzHСҁA@@@@ ,sk,H@ҽJ7,1A;QܳJݺI^+pBI          @a o?  i(!}t 7H&~}OJCwK7K[D'ndΝҮ]ݳGK lvNv;扝;#Ȳ Tg"Eʕ:uz"Agޤt!Rb\"@r RO=y\~t啑Uy    @^IJkh 82eAߖ:uZF`v          u nH   hϖ|PVפ*U~*[?K?(-Z$-[&\)Z%Y x 8?h]^ymڴ~RɒRRRRRٲRR VU\GA X!=4jTt-Ґ![jbn@@@@r^åk%;I9|d[;4{#EI7(]q4p`Yv@@@@@@@@@@,bO(   @EH'v4gN$fXK'KfI[HVZRR:RFeT,Y0TL$тm013m9 "kcH5kF  s5,@@@@ lyܹ)d6mcaä7骫"˺N@@@@@@@@@@ / ^ ڂ  @]j:23~MkJGK`d',vGӯ9@ ؀&M6F9'_׉v#   ^͛Gd Xs AI?,q4jcғOJ={J^+}t3a@@@@@@@@@@ےy.  [n^=kiƍWKuJ#u(͜)Y#+ ,mKdڊ<@>}u.Y"'͟/]x!!    -[Jv  Pʗgi_cL*SDX_@@@@@@@@@@ sAf΍g!  Pz4A/^:F6j ||A?>Z*!Df&fZn{O3GӇπ    @hFBbbŤΒR3z           @Dā,   )"x[R ҂)~ԻdIW\!.܋G ^l)|{䓏ԬYUԵkYO@@@@hNZLZ@#''[7曥:unV@@@@@@@@@@ % SR>@@HQ쳥UrB宻}V92\܃I`n饗<>fTts*Zz.    m#'P5 @PC'V>rsϕ @@@@@@@@@@Hc`;@@@J ֯fN>SzIiq  KO?-5l(/i#ʗ3u;مCbŊg@@@@p/5n,+PtMҲe}Ժԩ;RA@@@@@@@@@ Ag}@@Ȣ%H{ȅE.;Β x:i~X__jkWib骫ρSԱcG7NŋA@@@@Ȫ@Y#W` .V#dIGIiHi          A 8  $R%k㏑ƌ~]z$r ҝwJuJw%stSҖ-뤓NR۶mꫯDhY@@@@RpD_K۶8"OK~ڷB: ;5k7@@@@@@@@@@"@dayYO@@(pu^y%rR^R: \U!@XJ@|y$fMiFo6o\oJ,'M#@@@@n &͜K~@v4jb4dHS9`4~YO@@@@@@@@@HO x@@A*[VzUi۶ מ=;@  ,[YwHi*EVlܹ5j~[KkL@@@@Ș@ZR'dy̍ U&uW$Ǥ?6uLA@@@@@@@@@(Aט5D@@ [:v~E=[ڵKj.[C  H/5l(裒B*+,]T:uA{υútX     LK飏 J @SIv|⭷ۥOZFvL¨ @@@@@@@@@CA   B gSi+$3>x4xTdҹWXC U>@˗O:@@@@($'O۰0d@"RKsH͚IHI< 9MT         &@dѳ`@@'J%JHӦɅIE" L.rԦ|ҏ?J yM *裏>|n#    Ph:w,lʔBʬ( ZI/,Kxſ9)eIKdY          #D3 A@@ X rp ~]ۥ>fϖz \OiW^C K,OQJR@@@@(4+JG%M\hVErLvmi0_{O:PW/s,@@@@@@@@@ J@@(_Y͛ w{#!ݺI*DJ~tiݺuԹsghԩZjOQ@@@@ Y8'M*$/89.Pt;o:tN ٓMb          @2!   Pxz˭][xXs] /H&}԰4gNdpǦndeVtRG5jHI94[ozi9D    @Rݥ?fNz?@` ux :uSO=5ϴ)Q )VL:LiTԯԠҖ-ZR|1Bw^3oܸQ۷wu          LM@@_R*{u9ssA@WKW12*^xᅊX=p;"`sȡ5k3T lkאƎ ȮS'i==e˖U2e܉ͷ2 @@@@@@@@@r  @.Yփ#{R SOIaimڴI;vѣ~zY(dhH[Q-@@@@2ii0C'͘1C@ NhѢ*\p$V-Y<lc\)uԴǒLRٽ| n7*Yd$23@@@@@@@@@@ O1  @ K*VLھ=u@ a_~OXQzҳJJw^ݻwWu7ߏ^hݺu:ssN6ܨQ#ݻ7z|.d."92<ZR>}e9ɓ'+MS_|>W]u~WkѢE8pnvIV/+wq>f}ٷo_ 6lٲE=l۷Fy]r%>Ҏ    ~Y dzEHٹ@0W鍊nϾ5g=Nٹ=_g6?WСC_|Wa̙;x8墢ԳGo %u, }TtR_܁Xdr78{lhB_uD`@@@@@@@@@AY@@h6c[lX^Mr ]rAE`˱iӦW~mti\s,Jܹ/_>?ަMs=Pnusyռyt 7/[nOy5lw d0_ve^?*{RP?ǙسK'vښ3gvnTtok{o֬vޭ:Kn6${Db{ 8b!TZ\q{5ywEKhРA/R'Nf/*PMR          @V 2+u@@x~:7@ ^eˤΝSNP(\ԣT@֭!Q:0@M4|zKݻw?엷H@ZT֬YS\ gyw"%Ki#GxhժUi]/x bV׻$:ڲ 7|g˖-Y4}dթS'_ndK´m̙O袋ԸqEcS7i)    {/f<*}?;w *${vmϘH1KbΓz.гs{ҭwzNn_V\;vy% J(K1سNFQC:TڼY.i06kW*7uY[Em{DC#          W { |G@@+P\2L y/N?]ZT3z\GP)w:c-|>+qKZ={q[ٺu5jtW:VZU_?7݁vl,\:v-7믿Z]X'Cȑ#6/O<]*T xiv{vҤI0aBtnv_? /zc     ҥ Q2VbQHWuz'|ĉuﹹLyϥzvn9rᎡJسl{^I"m۪H"E`u։oѣoѣV >ŋc͛1    @rzHʙ3Ǝ$g}EȓгPM,XG7n?ٹ*9r$H)\/VŊK/]q.ХҫW/?$<%'0e?iFK9o|y;ի? դ             @,O\@ ÇB SOV:4igdz1L.Mr8q1B͚5s'w~eʔSLutΥ[lBe֭~Z[oUB4alRC q$PN4p@Ν;!bEZ;tpH+c?uk~P9眣ܹsu6my睧ʕ+묳@@@@#7rp{GbEr y;tb=J{}Y=\.\X;v U939y,0bM$<#wn瞓NjԐ{i{T:t-~:e         rЃC_[hx %Я_?5j^]T3vv@un7l+X0 Cp$C௿%<7NjV;BR0mvi&=;wv)vg}/^\,Y/Bh;~ƍ%u$il{J`ZR,?SYU UpI[oUUnX5ϕ+~]~jРg!ΠA~B+^מ={T^=YG1chڵ3^׻I&~̙35m4jJ 훂    @r,m6b/NG[u$wK,i-0p`o3fϺq k֬Ϥ-Zٹ=۞4i]jUUPA{o{s9rZj~ol+2iyzKn&ۦٳ3ڵ,h1nXbEeۓ1qۣu*U8$u޽ʗ/_`F <]fZ9(ϲW}Hk!@@@@EgD-[^y+ "O|޶l mZlyٹ=grϥ>'g]C"EJ8Ώ~ kH&HeHw-r9➧0d } )         A0tAfS!'`av JG\ը!sg0B X{J~O>z4|pu%w@@@@uJ? b؇Y4~i|Cy5F(q4hv_n޽RH-uBV ȴfo        [ {Ʈ>G@@HFi#fغUNÆu6mz*B {99dB r`    @㏃/Ei ! 8 ||jv8POcƼO:t΅@@@@@@@@@O X @@8^=iР0W`1257KUH'J<#m(=TH G([nʖ-CҥK aO    Z=fӃJ͡Cʕ<YF`x^yy6;\ hK}TZ51ĵVTT6MgK<          @șCE@@4k`]JiSv@ Co`8jUi`ܹӾ\e˺2͛,&}C @@@@H# d/ dMSNlO1BTIiҬiQ#         @l c{ @@RHjդ=Shl>6Zr䐾J3G)[4UB@@@@ȝ[Vs%coʞ fA_Gƞ7@%p #H7JCJIuH͛K}xp֒h@@@@@@@@@zAfs#  &7hP0$o4%;A 1cڵ+JΕM??ͪ@@@@@ :u y}ҁRRRRM7I͚]d ''tҏ?J|XRZ[oIF\         A @@-ZH_.u-8!p)H_/թ#R9 @@@@H@޼ KW_- ,͘!m|4 @f"/mL־tRŊOH;wf@@@@@@@@@@ $@dHO@@H^vIͳQD:p(U,uԼz4jTVT     @ -'Uj %P4bit-+H*HݺI+WFTU          A&@@@_ezIf;12=ғOJ+J}J:H6HCJUd#     yBdZh@ s tԿyKҌiI\\G          @H Ȑ   j7(m+u$ܙjaJ>(UpwҦM2eRl7l@@@@2@ΜRdC0@X ~ۥ+I?.@[W5J4C@@@@@@@@@Tp?C   /0bTtuҔ)RvbS=$[`f祷ߖ ,Pdo@@@@@ d&''"S㏥>]o). ,T!6֎jנ H/(ً%fw-zThԅ          @ zl@@bXgq㤦M޽^1QY`*gѣҥ瞓ӧuܦ     I 8 EE%@ =J,nhEѣRnYSK'  SғOJ]J#Uﲌ!         @p   i#Р[ҋ/;ڥ^  ,^,]}tiҜ9қoJkJݻs@@@@@ ]Aw@ R6ʗ=Zpk|@2֦EA *ThoV'>N9Ej.Iu.          A9  J}HݺI'F ;ukn`رR.R\#    @~ ̛)8x"^o6[@ *$!['-m"5nƏFjݩ          2@@@ ]}7iCv?_|!5m*{w4ehԾu     tipUy} |@ t(w»y HȑCA;7oORժI"uP˳$         1)V@@@ CHZImH~̕YdĉRKIf;)     ,Y"YW˖+piҩ&\?gPHIU֭ʗx@ں5#;6f˲         A)gɖ@@@ 9rH֩E` QHI#G#5v ?4I=-@@@@YtҢEnee/Eʙ󿵰i6@F8dפ-[޽dUH;K'|THӧK/G1@@@@@@@@@RV Ȕdk   \Aj%}Q2Vf,%H|!:$ ,U&u*կ/4aT^x`)@@@@@ \ :L ťѣ]@ =FI-6QoCI7JÆI?(խ+]p4ydnWv4n{sgh.          A.F@@$r{Oz骫7LrbR~>J=kH+zj1@@@@8V+/ɝ[A1"vֱn@ u*T6ew6nl"`.pt4m'Զmd߰$kba+WJ%&\"         y  -#4dԷԭtRTqo dGo 9Z =-&'UYڰAz`(d    %uxҪU矧,{_ٸM Y7>LZL:\2eS0Mϖ֯M@@@@@@@@@RC YScl@@_Ǥѣ~\",B!#GJ6n᠃Kvu6W`+HwRҙσ#B@@@@XP*VLR%XZ-gR#W}{^@*6n(dvNzKڼYYSʕGla۷ W|          @2l@@RHS'믥~Փmbeݺ2/ Xc.ҨQqXdwH+C-@t&ǥCK    Rc*F#PtRm"-4oAԨhQ0@@@@@@@@@O cm@@HΒ/T9Gzwba]&|fL;_ y: @=paԳT`̥G@@@@F H jVトҦvkK$,l$~T.oԤw/\@@@@@@@@@HA7c @@H%a=$sԦ}{# sŞǷ)`-Nz`![oo !    /ҪU(nyeiz;DKr U ,1%8 ]x4mZRK3@@@@@@@@@#39 ,   ]tcI-ZkזxCj^:|XzA)[6)x@:Dk״+*k׮]Ν;={o߾C.wr=l9s*Gcy\b-LOT%PX1SXG2 |C mZ@h|)\ 6    )`AYf]re_?o6RG{Զm۴em޼믾~?dm+kg:0Wdʝ;rtHkC)R/EBJRUBYtie- H`]3dݵlwu"^ֺR۶G]8_fA4`67[9F3gi6n.;n(4Ӧ[g!tko۴P?⎇g>cxӦِ7o|qԆl";k@@@@@@@@@ c E@@ K 4n,-]*wteIu vF |\CunBة4~|!]_MԽ{h      @ ̝+-sϞ'H:H=ߍo)!@֦O?iZbE?Z[ BpFVXzu?n/dII^:o P:{aˆM6iɒ%_}vB!CF-d*WSN9?CYXdǎ҄ @Vu}8]KNH)|"    i'p.%M>ݣSխ+5m=-OA\ぅ>u -pQ,m8䓣_Tem&nqkpYPE`k׮Nj*wRZ0dÆ  : "`mp~?s?r'v?H`!!w; 0w ?Lڰ@H Bv] ܍9ؼ܇A~8}{~uD@@@@@@@H_d   8`hbmH~+yfC7?Eiɒ%~ܾ[*+Zj~%+VN:w;}z֡|~Hr.q֬Y Ȝ;|MַBkg8@^ӋGo:B[ fاMwd9.cR*H*U^@@@@@ \>7ݹl)=гķ\`k{״i\tdg!uSVc`պ]R$'2t,~l[dƍ-i޼y>rر>l͂.BhB-M^EɺF;v^fsNbg%mdϞ -f_…  ƸΑ mHb!iC( 2fhq "[QoB >K(ۧ(dɒџ6n/         YQ [:ps{+@ BǶ=zK/=ET @ uHxAu`\'ƘrIͱN,s }NY駟fXV-ըQCKNjYzm۴rJ-[̇h.].OQQW9#ʙs:pTEu VR@@@@@tpq2Y&Mȑ 7H=',@VXp>Ҩ >\̂Κ?* K \{A TgAk6W_˯C|ɺꪫԾ}{vUyf?_~E6sMG ыY,F4 ҳyŋwmj|@z Ϗ- Үg ޽;z<4M- ^hC2e|Vֽ-050.3K7         $.@F>E@@_.1JtOy:$|hի_7Ysgƍ{Uݺu}cK$K Q|;1l.mWiӦyZ` Kjþcy睧Mo]) #    %_\S~x{:${B^z,@fXjy~zZ"^zjԨm&3kS&z?Ç}'z5`UREW0wEիWLڲekߺu,-/T, -ʗ/ J򡏡O z1$gFkBmX8q- B!-55[p}B$chѢ%|(}`Wݛ$myS A@@@@@@@@"B T j~{+@ B=zK/=ET @ jդ#GY(Ƭ.jUtrObgt6m>SM:U7oVdს:cɓ+3%}r`B jٲڴi-Zsj`     @"A٥pa" 3k@}~YIdR[&M!Chƌ>SNj׮ꇛIm,Xk̘1>d^u/W\2QGaujP6l^lOкPP]ٲe}0]O i 8&#iA 0CJ,ە+ʕ+J ڛөHJvƹo        YR ,y9hAfϱ#_`,w~V S oU:?{n}G0aO.e [j͛aÆt/cNs4w\}d"΅^J]vN8t#;G@@@@%!$^{-RnRқoJs'@F= =        @LK#^  9@0֬>l>G-^|PQQ'Bz=jR(P -H ߿_|{=}zN[gNު:uDz    d@66l ;pdjNrѨQEXH0ÇO>:xns= AW^Q޼ySOk׮~Pp%K? |<gիWC5ǫU%d ,+_*IV7Q-8{D~]Bc)  S@@@@@@@@O Tdb 3@u裏/k:ctMku'?tʌvѣoN~M4ѽޫ.wɌ1!    @ _X߬} ?;eϸTZ{!$}i}޽[ŊSUNqFʑ#Gf@ BrJ-YDK.  'z-VƍU`yU ȴfO        _ Ȍ9@ YA&@2)ShժUڵzꥪUfSXny >\իW׀Ժu%F@@@@L,\ȏwn,|W]wQH!{_/ky'Իwo^ʔqg!dѷo_iF .gծ3g^e_̙Ӈ>ZYg3dfk?,v:rFWЬYLsN\@@@@@@@@-@dl!^ L9@@ K lܸuK~:w~rYʀ O`Æ z4j()W_UJ[@@@@@-jז Kߖ|P.LOzlRg_lغuҮ]4~x5nx6Ǻ={ڵkO<q+W.[Hŏ=yiԩ~ iӦ:sP~}Ν;+K @d>|؇A~wa֬Yڷo,Զe˖~hРA O&2 "       dyq     :ֶmw%2452gصc@@@@HʅIu$g-{MWK*$͜m4-i&5iƂLmnފ ;'$m۶gիW/]*uDvf6k{Cڽv/{)         z#F@@ C ߿_\sN=Ú;w4hʧ@Ccڮvkɮ)      7HI9r/SҢEԪ4o5H)]vE*Z )rʥԦN2΁ ;'4ѣ>}vRJFj/:ݻׯIc$C'`6ٽyv{ - v{3)         5d8%  B`ǎjҤ;}z衇|LjLqpD Xgvkɮ;w    d\ <T˅I_~)܋K/{MՁ=!S **J۷}~*^xٌ;vNڵk?ӡ_UUR%uQYC Q۶mU@xe" g@=v{3iP         dn 3@@4vRӦMu}:3ͱq #`א]KvMY]c@@@@@ !M-[62T /{)}܋m䞑K-ZHӦ0` "I&dɒiS ;'vnwYbzf6{l>^}ٳ>G"G[GZ(eN {S)         9Ee<  JúKd Oe˦tg />֭[5dgy&mz ԩSuO} Ů%ڲk̮5      7HsK 77mn H{L۲T4riS̼l'H՞_pjӦMb7'O9@@2@>}zjM)sڲk̮5      _KK77m5o.}`dZ]J+Iu{l'Hў[Ԓ%KdUr{M*D~?#yj߾{tvWժU5g]{ FƳz&ٹsd*lSOՑ#GrJ <ؿ\,'pmpj}}w4aƸjժ$+sᄦ\&3C^mנ'N7xC~nOiB^ 1ƭGv/{[kZ         d 3ϹH@@Ȕ+V/ArʩzիWwܑHhu_gȑ#movk(w0vm5fך]s@@@@@ YRӦqz1c1=*T:w{P-#§.4g;Ab^\~͚5us/ z.={*gΜU7̳'w܉.;V͚5o>,+5lv\RX`Nԯ_?M0AFr!w#dcm,SLta@fnq{O-8}t=㡯3=Jj ʝ={z!n jذaa넮Hc[~{[kZڽ        _ }~8@@H#wwѶ@IDAT_|Qv4cz:o>䀓[$/kqZk    WijIS#g|yg-[+sϕ ޒxCȩk$֌3bg;Ab6EU…[$UM2EGQǎSu?i^ҪU+߶P *$Bm+kFTR%e˖-Վk#;WvRXp_?͛.~* k`|M =yӦM>.***<6Uj:t }~bnorEO.Y6l=ܑ놎-w~${d=v         @Q{@@2u\?~xt9?\cǎնmԹsQ~ᇲWnݺݻ)>ЬY\jР  Fˁ\gw)W\XΝ;5h -YDYn_엳N|VǷ~[/^}U-[Lojm wd̙~{6lЙg]vcQF+e~:tޅuF0aG֭5tPZJ7xcL7#7t}Qѝ2Sqwl@@@@2{ԫ9sΉ 'ua "Z?Ns{+lzXOX׫WO˗/St>짝;~ٳy{oV3O?TG&-.31bh_,묳J0c.pkkɮk9u]wL2-`wU޼y`{' iӦMoSU,0շ~Rk?]k={.]ҥKRm'Nmz{Q*UԶm[]tEڻw>c?綾^ȑ#5m4_3JIn6]z~vrBK3+6qvء#Fhԩ޻*UL{OA;eq/BU=wƍK?)\3yddmVO>O뤓N:%m0!ګOb1;x[ׂ.gϞ~@ Kׯט1ct 'DF/g$68DWuqK{}r         T( +Y1.r+H@!:C߮ŋǘSߧ 4 zꩁnݺ-pጁsFG 4m4`6,իWN)~A,PZ駟]뮋^u !):VXp{9Zju @f|סԩnF.2w(pyq(VXq.|2:-ׯ~7or>|xu 0LLϡ{F4ױ2PV-`ٳgm%e`*صfvQ@@@@@w뇾e={_qJ.RF@Coۖ#M 3J8 3ڽmu1A<./G/X[@J?s rKSrX=Ά$wԮ];p~^+T|O>=`mAn Gam4サ}h֭۹+\ׅ~\Hcx+eSb+;gY\ YܥnRu.1Pxq>\X7s~w}ws[r@ǎM4 (֊]O;:;.0^m'K?]'M.6$=;t|H|Ӛ7oj֬p/ GݽDί=N]pW[;4ktm YO~b;qAB@_/\uUƍοCĮI'j[7A'ڹp:pab~M$u`k/6d=őV܍7.ҪE}@@@@@@@@H{c| S !&`?$2x0 @ ̚5wN>iUBk.u>2x`_P/ \7ougC]}CO^: ,TM A^qn)4;0g?:tuu ;|̦?XM6X"ENm--CAk׮sU7b?ٖXǮ}iצks9nךˮ=      8@gзpad\^ ^L-^q)ڞۋbp ;?иPzX㯿'YpU%{,ҠA^(^ΔP[@Rm&ثW_;9|nڴ)_}7yY`ߌB8EVe?DH8A>hc Vse,5]v,3gLݤo'}.,gg%m_|E4k㶗Y M/+5?j(=v2` :}DUb͎g3 P`\k !O{a]5gsNtZprJp'Ν;zż,Yҷ&>;`)^~{vmX]c s{&si~v{=/g&hѢZdn״kX,o0AnߕW^{,_+V7E@'=ʊomiٲe֮Zjgĉ7;VM͜9Sna˖-Ll϶~7L M ̄q @@@@;+C#Iױ~}Wa}-ԱTԵԣ}S_[C; ]禛n?wyɾ󏍍ջᆱ+\q~ Ɋ[/H0Ѿ$9NL^3~1c{s׬Y3Oa}6˗/c\ʔ)K/N6/]/mܸY|E_ 2jO\Z_TNk^z/\u֍kWF_f絾w;w+ ]ͦu( 0iw:uη7|E *'vO/k׎[kΝ}~]CW^=' =>wP"+Ók~tfԵ(@@@@"C` y⑼ L?h $yF^0K ぐEqNwI52;55, K/.gPdN *[OjJ/ #sI /L)~EpXdpFiڴieSnCcuZe2J^{u(ZTf:W7rHuA\r Ka˗wg۽{FS8 ;ҥK%KҥKæuuuyN?h]d֭uic미cxjmhlc*Uraƍŋv _0D=zz-Wĉڵk}_} X~65j-gΜ? ,p\p)erg>kcB@@@@|ӥ-Wѽ}_yEWiXy!*%%^PO~mb?J_ƕ/_^Æ s~ꪫԧOE&7%߹_veڵkW:\lzxƿNPJ'=\/zZViZIr6䮓&z'*šv{sޛ3E        $@I$l@@@p(xM7mٲ]_ڋ[moVB4~x]r%zt뭷kճ>… ?C}駺h"9rD&Lвet=czy#gmPm{6 lwq8֢E =n@hfTbE5hsNܸq[3 \@&M]IZPuzw5g8p@<;<]|Ųk`"2e/F@gӞ={CyfnmJg>cY     `&\)]xaȫ/Z$y_W+&Fz!iÆ5Cram@#FxJZB3gNu͚5մiSеkW;i޽u ȈܫV*xOWZ_3~ ٴ_|QrմիWSbŔع)mXPfiРA4k,Y 2&~I~{eYfL5j]xYXL3K/C,D~-zB6Yȑ#Uzu/Kܹs>>H{{mP u( pǎݿ/ ol=m=_qV{=ٶ4i$g۟,t=\mv_I)]/)7v\|>_mA]m_(Ӷm\?sϠ v__䭍2ֿn\2!        @xONS@f&@~uf $  )R$%76y዁ʕ+婧x^H ^xw~! oXdnJ.F׵kOw"2J(^dxo;Ϯ X x\^cq5N9w~*Uoum۶~ ;v,EX?cϕ+WM6uހݻG=zxS7X]kÆ /ҕad7i*{iӦT)     cף={)kײe]wJ}fw})+'3Nkѣww1c }v믁oރnjWO^q/ -\_@F|>uT}OcZ_3~>^x_3ԭ[X-b@:vSC^zAqww:UT)p0bޫ̞|ϫyo&yy xy!ao1Ю];׏d}i{ 6 )Sƻ5 x!>,PdIg׺u… *TXYC'+0~S'J`p`_|s/mv~8'_ ;lÇ;;\rz/ϕUlYw=~zW_Mکޟ :t{ϭu ̝;kgO_mNs}8g~lY9}ϼ|rWLb }J|ruv//=6}YQ{?ǎžk"       D@G72u|cӥ8 AgAjذNP:E" q5yԷo_0ﴬAU.`͓w^y7"/Q^+@q~zyE/yZ ѶmduR%thHۼW16)oIڵK y\[N: əXLȇLkTʝ[QKj,%%e}sO;W&ǿ]xq}1P2;:hժU",X0ڥnsZ=X}'/w$t\Fn%/N^(ekիWOg}ϰV{^ SNYb\#:|¼ho^_|V׏g}e^I߲㳟e{AtlZ7u(}ioJOl;/Wރϐ'/ 2D^0 v$gr_[yW'wʨשG(m̨:\o/HQ/Lܜ޿wSSPα۽ @@@@@@@@ 2i"Q'@dԽ4V&Mv 21bD vkĉI6+-x3ڧot!ǏFʹ@@@@R&PIO<!}폇fV*WGT$=jxuU-4f̘ @,{0Yr]wݥ]&wXp.]hƌZd+[?ׯ^z%}.@,kf.blYB #={iъUuw ,E `y_zv]t‡&B@OS&M䖧rڷo_7F[%        $-@d>EN Ȩ{Ki ml`k4ZR< mAhx6ڱcx r- LMV@@@@Ⱦ7(_/͜} ңkHo!o#[ӣ˸+|ժU>};ْ}u/=x\ap}Fyɵ;vLo}SNՊ+TbE]tEjٲ6mz)Y4޽+˗O63eCdsTh#V7ov:iӦiӦMYڴi~6kLr :2AU@@@@@@@@@Xڊ  #`5?_:tP&M7DO#iIg>ϊ}fc!&@@@@@ 1/ $Kl/CVMzii۶ぐ?$h!թ#t`%v\BI/q),x𫯾Ҍ3԰aC\2ï iȝ;.B˗{m4h>_*TP2eԥK=3gIypȌl{B CȌRW=]v{f8=tih xe        @t ]'A@@ ,YR#GԒ%KTxqn |7nbcc >.`}l}&ag @@@@HJ`ifUb_J.!/ I?_[W6y!I_~IIiKd6YfZh f;sSO?+?ج-=鬳 7ܠ{ϻn֦M㏫p^h_^~}Gow/ɦsl4`p=EvO{ݣvϲuٽivo{@@@@@@@@@_ Gi]v|cZ#d@9ԯX ).A d?C@ A={z#I^`֭zkǎԩ :uD}i     U?Ir)D~}H\#/;Kɫ^ɒ)x6>ѣz'裏*&&F>\|X$_?6nܨA{Q\BaZ}4o<͝;ׅ-\P[lqժUev:sTfM/_^72L @ZO-qŊZ|.]@fᄇe˺p QFAJ'@@@@@@@@@ i a/ uAF[J@ضm^y1By#I[nnݺ+T9͑(~M8QFW_}%JoԭުҥKGb3    d-M&?|Xz}geˤm=G”XYhS [N~NdyΗ5+ZC=Bڴi_|QUT%-Zf{XY]V?vիWE\R%r)i*"@4 ڰa,իWǕ+WsέUi뻹xȑ6&>NF@@@@@@@fAf7"A@n6?;CI&)W\KuUW}*RHv#ٳǽ&LpѣGڣG@&@@@@@ 5TtԔ9С̙R҃J]zyƍS.]dXxb]~z԰aìL^u޼y>L]_H6'Ӫ}Z ]˗u{qFw_>VreDVPeZedO?ׯ_/YG~{GԨQsjժɓԋF@@@@@@@ 1Bk"  @ `+Ə>H={tuh֬ڵk5kfZPVXɓ'y֬Y.H/j+V,r     O`RiNUx;x)޳;iy!x#/O4HwWPB xi3e=f{X6jH's7cǎʗ/_T,̯z!׏5|pY_g~!Xa^թS:|֭[!-sjԨQݡ֯XlYUX i붴3TΜ9eHرc_]أ>nڴɭ-[GrUJ7w݅Zm˛7o         @4 9^ xIcǦW ~jذN]4! Qw֤I_hʔ)?- y\rD)*~z͜9SӦMs 9Զm[]veniѢEٴ@@@@X`0ǥ~ŕZXz1i7_8Mj۶m:묳?=*`O\@nuM{n#\/pBHj߾}СµT/7ȍ7g,(t*W-4m?(QhpЖ߼8?Q[lccc]`טjKG3O!yN}b)S2        @-$@B 2D(CVGՂ _yΜ9:tJ*&MqjԨX@leY=plܹse6Pwʗ/ۺukʕ+u@@@@@  \ztҸqٰad |ideぐ'MK.U:uzjUVlZo 6pZ;vTÆ eӐ&{vyGiJ*gϞիF p͛7K۷w޸Xܙg!-uFڱLdwG{(_ϠmCͬpq˗wK gg,k>]Af;WE@@@@@@@L #} @L5'"d#Çk9sfϞ w) AWzTV-7-lϲeܼh"YFyg?_͛7W 7o H@@@@@ -+&=ԧO ;Y+_sĸ;vvq^7nTɒ%ժU+`({@T2e®i֭[ɾ+}7ڱcvI6{i)sP`߾}B!miYp?[ؑ#GjiSc ͧ~/~œ'OYA \s￟4[>ƟOY8?NU-T~'l,T 0 2        AC@ 2M)@ {lذA ,p60tW6zRVꖕ+WVPV8p@ׯ׺uvZUVi׮]hsSh6 RJJ%     yԢ7}_yJ)*yi{{дiԲe˔Y"dM:UiƍaÆn>H ³ 4K7o̙KWM6uamڴQݺuěfY0lxB믓*iwyi0[hѢ"Eu[Ν؀@bڳgvu7[/3nSO=kK[G3EAQ{@@@@@@@@ 2s Af[@@H`ӥZbnݺU@@{t*Wʖ-2e-uil B۲e6矵m۶8kdڀMk֬ڵkTRQi)      I'm 6x_w=YdϞu'+~(l5Ke5kΝ 2 Q>>[5jpSN[7nʕ+ðXn}Gfi| 4PFԬY35o\ϒr8t Pȝ;wu ٳݳep[?^BY@d…f _ Tlٜ+W.ö,8zA}6߿?n@׶w^h "Yvph𺅑Z@@ e".Af:D@@@@@@@T # @*L%! `~zaÆB-(knA X`f Jldc6,l'cAa*Ur+Wvg@@@@WϗjՒR^wxoKpE=|k՚7o-[-lLer̩%KUXřg)g2?B,L2O<.8Җ6tKقmi!a{wءcǎك,ZލaÆ^aT7,>6ٳ'n^rwmZ,d?;~(d҂N3~EЖ۬^~P_v [&n/6x6mqXغuſKlI>k/&;'8l}@r36vXu)Cُ        @ȝ@@@Y;ծ] mxnݪm۶ZA6ڀ+lexlQSz,Sl@d#`J vmYD .]ZeʔqB"    a*ei|_0 JTP!'nSZZFih!{DOcGXE5\e?ȟ~ɅBጳg]?ݥ% f&JrM4qK P |$ d;d}m~L miC;Aٺ~hK7$g5-sb/ub?kvӧOwAmڴQ͚5]߮oq}AݎaB@@@@@@@@? =F   y+dl@?ʖ60*666ys],Tܹ6ȟm V?`_ >smveuiۃ3NEtjȑj۶x խ[7%Ep,         @ FoUA@@F~`cbo=of@@@@@ ՓN?=1I+VHC҅FLh: X8[ݜNER d&l!L ԯ___~M!u׮]5x`$|[@@@@@@@@@V g֌!        I^.$.e2\ o^顇BV(l)]wm[_  ]t͛cj^n6ر#CK         +@dzR        @ l,['na H.M(͞-/,K2D:r$S9@رVX_~Y&LPJ4h ݻ7M@@@@@@@@@ '@@@@@@@@ [ |TԤIfw \)  ,լy< 2M@^ wܺ馛~z 8P/ |guo? D@@@@@@@@"Y H~;        @Rj\ʛ7EQ@ '=zTtҥզj $+?~/x6lؠ^z N=@IDATPժU;رcɞ         /@dsE@@@@@@@@0loZ Q ([V3F[_Z;#/@PbŊiȐ!Znڴi޽{vO3         r Sn        Q"pK.ьZ-^}U;V\Yz)66"8@(]˗FС4iYfe}         ̎:mF@@@@@@@p_~)ut9dG_O-['|t=? ~5h3 @ TVMƍӼy/_>5o\۷ײeˢ@@@@@@@@8 #-        %0uԺuzF9*P4djTԡԢ4~z# @ 7h>֭ݻ맟~ @@@@@@@@@2U Lb        "o4gt%R#+Jc\;&5j$u*mڔ5 ]?z,X_gVjG;wL{ᔀ         " S        "0}+n--%`fIKIիKI^W@F GҥVZ{NcǎUJ#hYS)        dC N@@@@@@@@Sz3@JZBzYGe%|<[@ܹso߾ڰa^wݳ :rH4z"        +@dľuT@@@@@@@@ -٦MZJ d[eI#=T򂲲mDf ƍս{w 0@ժUӨQtرhn:mC@@@@@@@@T ,        Y!`~6ySO|P^PԭPȪU#G#M@_NO?kꢋ. 7ܠz/a         A#&E!       D_J I\#p3 :$ڧTұcSOj @jʖ-zK˖-SJԾ}{5o\?Cj@@@@@@@@@DL        +0uԲt)FZ^N^]ZF:|{wvmix)kS: -PK95{l̙SM4QbŊ4#        B l6H@@@@@@@@_¥iӤ6m-,H@L;R͚RNRZHǎ\D@ 7noV&M͛ٳ~pu@@@@@@@@@"V Ȉ}8        @j~AڷOj65gs T.s<N5wߕbc> D@vxb{9sV;Sv튔&PO@@@@@@@@@         d)RRLLF_gKGKVI/%U&Q6#D@9tjz{={LW4v         "@d0s@@@@@@@@p ȶmå6#ZTF֮Z*>] ASNmݦ뮻SO=J*_BI=ڈ        i 2톔        !;vH?Hd]QQ͊eI_.'H='WT4F dS jڰavF F@@@@@@@@B 24'B@@@@@@@Sc7 /]wݕ@ VZ)/ҩTA@@@@$0eTTfvj5m9+8>ϛ'=tuҽJ&)vZz" @u饗j4h[~{mgΜ)N4ISNURlZj_|E_>Wy͟s'.@@@@@@@@W g6!  *`X?]_ocǴl2-YD΄    T`dm۔d@Æرڵǃ!}T*SF[Z8@H@Μ9uk͚52dFJ*'ЁZ|9rą4Zt=蹩~5j(Wnre .2&&F _ W\ZnVZ%$Ą    D`.i|]űd矗myF3G__jD2eY1! QymذAwqqU\Ybcc3-yU^ԬYd>j w%:?߿ڴielwQHsQתUK]tQ+VL{4<擬<;@@@@@@@@@ ]B+t   d9s4j(^Ze˖U۶mեKW :t[իʔ)'Tsʔ)믿[nܹS?,Y"uj+;s=_|\{V\鎩[ns=:rִiS_~;;./ѣG ٲe|M͛7O˗O?ʲ&N;v~ZE     dɓ&M=l&{VF@˖[J. .=t"m_~Z ]%J /~iڵ|I 2D_|q\__m۵w6 Gxb3Fgu*T'o^ p_t˧zOO?؉        -3kO@@@xWբE h6kQΝy:tPjzϞ=uWPsw*_|.hт-pѦM6w(}vkN#Fp/܅0_rSNUZ4{lݎƾ}ׯw!V^]vAڷon7ǂsu)gΜݻwm ֱʛnIW_}l MF܀τ    CRC{~YmۤVʕ=!A+@AbŊXdInA.X K/9P{8a ;v~,{(b>3f>i |C)wynoYʕ+]g b}Gw6oެYfԦMW[_d{ァ&M9]t֬Y#Ƅ    G`Bya>R۶٧ʹ4#]{Ҳe$!I.>XAK@"[v/d}PÆ ]ڵkS԰ 0;C[yy_ QC N?쳵h"̙8|pmݺ5$7lHO?؉        -@dD}T@@HX`޼=:ƍpPtF~o Ȅs9G9s_G[XH 4~xh!}UJT`Aw];βJWgtMʕ+ wtxX]cccMx7ZH"!ʛ7oܺ+WN+Vtᓷr,D>pnj5JGUW]WGcuܳg @@@@[`$tibB gm}ɥN2e@n>C"{^ʱKXBC{H/R+K.{!Z=D1SOuX`^jUViP'ܧj        #@dW@@Yу?~rӦMڵkMqT6$;wn5?wZ`/^׻}s׶lٲKߺs&ymP>W_}UdkFRJ_W*U'S֬Y… j*wm+    dɓvMsi(ʓx)ҦMҭJI5jHMn]ڻ(@_CZtU\YwvޝdK>qZpacbbjr򏷥? X"        @=%-A@@Nș3{wߝtuɒ% L pϟ?8;v= yPI3tP <`=K>aȑ#رc_d/ u:3ܡZ&!        @95E@@R$73gpނ .--ƞp\R/*U jܸqZxqܡǎsa?sܶVڶmkذa.8򪫮R>}w},(2%Jhz뭷du8q֭N\_?/Y"    @ L*yA(o(C _n-}}Ν}SO= BY;vҥKݶ뮻N .tG\oݵ_~6~:u,믿v*]t\٬     @ ;&{B]m#-C e{xҲeߗjՒ֕6mJU8@(U^~eZJSNԨQ~-8[W={Kϛ|MUVM&LHڎ;pԩW__o& ~ҥy~P6m\P(},@@@@@@@@@ r)li*r@[Ba:wє a$PA۲ڵK˗/WrTbœj+gΜ:Nڗ܆kT *'k/^XGdxie 37^]^4e -ǥ  '6nLkR iW;kM={qƺ]?q Zv~…Uj4@ZY1L         ]9@@@8p`ƍdOJ*.2f^"    @ L$]zi5 Ԧפop<rN骫ϵkgA$ ]4c =zyu];w>UVMZRǎUh4y-Yĝ?L鏷l3NF@@@@@@@@ \r)*׹ƎM)ٻ8)`Ɋ$HTQ9FLb:{fEӡ=; (R x]L9 $@͚hI $?#d !    @ ,]*U&tI)@ l.+!)TBuThVj!Hŋӳ>Yf6^{4hPʴ_w={2"       䛀{^;@@@ uTz~+K{@@@@@ ^>J:vwCȳO}T<9=)%|AJ$ݻoSlNζ \z4a >'%ܺuu˻#TX1tM+ܿ?,7oMŎIA@@@@@@@@Dg        $RR2I]M*@(RDjJ^iLit+tR׮cI&@$h۶~i-]TCժUďӭ*[;v՚RJd1ڑ@@@@@@@@@$*@@@@@@@@ضMc[m5G 5nY+iJnI][6seK*#$@ٲeկ_?7NfE]ŋkںu.Bz9rd7!        @ d4@@@@@@@(_|! }@CreޒV>TU3FIP!?'G @S͟?_}:v쨴4͞=[=z !-a$@@@@@@@@ A2@@@@@@@@3ѣM:<;%'B8K% $M.-X Yҥ[.TFzȗ^.l @-N8A/-[!CQF.!Сׯ?Ges@@@@@@@@@ g$̙[#       $-+I@@5kJ^(b4iԿ4gNz2;L*wkAC@ ˗ץ^O״itk޼yߒtgĞ!        $N@@@@@@@@(0sJ3f\PRhZnM?^ZF;CXQj\P@<8Cohƍ6l&O +@@@@@@@@ զ        @=Z*WNjӦ7!Pʖt ^ZR.9ԺdnݤZ_b?((4@ O/ .@?y曪SO5$        AL@@@@@@@@B"` :u\  ]zQiti2W-Ҷi\wի MAs4_g7B֮][?nݚ         P$IzuD h"Eh5xpD! @> GX\?>}7NvԮԾ}Z6AH!.ޫ!CJ*8p>lOmU8 }wfʕw}UdzKzu,         @@@T8Ti][%2?Tl!uF@@@@pemԵk|۳ʕOyDGi*iHS'ou%֕;Ozi֬~Z *T?f矯ƍkԨQ$<,5khD$L H@@@@@@@@]D~    w6h],g6-@@@@(eKRBڅ 쿿tҠAڵ%=Li|+UH>4ecGg`;@*PF 6LӦMs%ս{wkN'N,T$}ɶiiiׯ_۱        Q 4!6#  )зog     @r RnY?j+PtKI_~)]{ukͥNHg҆ [oΎ  6[oZŋW۶m]}ujv,RHݾ}z        @a da@@ i ȼ9mCA@@@@ wIKH'TP[H@ ._:Jzw+wIIUJÇKeKid_ҥB(-g.{1ch"5nX}ݓ,/3Ν;.ߴv-;Dlk֬Mn        @ț|'F@@ Nbv{ @@@@(FI5jHM.M{֡JK/ ͛'KzEU+iXW/u~a$KA5 "p'jʔ)EM8Q 4pd.pr7^s='EK/Y"KKyh˨6        /@"7    @sOe[ k@@@@@` X"n Vh @RҐ!KkH~(yptURFRJ)H/}uk֛#䟀%?ӧKW^yEkwܡG*6i$O?[n%^*-T\Y{޳gTjuE@@@@@@@@ ObGi8   @"lauz     E`RiAI;HVrNO?֭&OnU*^\.Ԧ~1%> }dmB.Ӝ9st 7hРAS}Qm۶M]wɃ w߭z(w*G==],1+Ff@@@@@@@@H"   eH=z _+l֕-u,!    M`hT) Zh$ôh!]}曒%5Kzq^u]J*HMJW^)Fv. 8V1xܹ:}Ț5kjĉھ}.'k /.^pA aR˰DR@@@@@@@@@ sAfn;   @ u`Uۖm@@@@('u(s( @~ ԭ+' &͜)-[C/>}ח.H.oYc΍ +Vԃ>fj۶m*Z4vw?%2jԨRQ\9uMŊx:S"Y@@@@@@@@@bGk@@@R@}_EmQ@@@@@*e'R RYrezH[iigOi NKSw@&NիWkΝ17 @v&Ld]ygkǎziii> >쓬ե^        $ 2P @@@ 1ŋKg!qx z۶mӍ7ި"EdZyK}vuESNtd{[n*SCR@@@@@@@@@ kAfû   @ uƏɖ)     @A5JjT^ !@A(UJA,ڵҸqHK_,ժ%ի']rҪUUv!['tIʒ=fUvܩM6cǎ;wnV&{i>sIS7*        @ %kŨ   ;vpi֭~no2l ^  ;v*W$Ϸ|(V)>pV-bŊEm]iiil/%J>@@@@MKٯ_nc#y'PԾ}d!7oRi0' ԶdQ@WbHO- Vxuֹd4ydUZ5f{6/-[: 60!oaB8?蠃|}Zl{&X;cG/Ek<,ѤOA@@@@@@@@ q7Y?V6+}_Nl T9`\o9l*]t2e(ʖ-Yu I̵(    $?JM%ǑZHR'@ .'Ǝ>8}W~c.]Ν:u{N 8իWkƌ~9sOiӦi…v&36Y_^y?Пsx0>"b 'mHbI%cX\@'=g}2ٺrʩ|od(        @Z~s"  %L )؀pB+dׅo>ӹ%*`6 - 3KrXbe[ږm %W 'k`lߧ/7mz¤6'.\ ٹsgd֙M_1ä[l=`dϮs8pDO6$- 6lٝ@@@@@ wFV7pt@ Y\*rJduZ@3&}&+zғBZbcKS@ X?Ub kժsW\Eiɒ%dGa}֟۬Y]܎^}+V%9b@1A?XC.9,v!VBӐO7pkl[) p D'X/w3EŖϒBZr *Ĝ8TR%?ٲP@@@@@@@@".@(؛D۫W_^2 @2 XҢ^=Z@ ,5k`g\^n֮]yl2o PـS$~ 66D~)~U}w6#& dL:\>; `p@H|M6H$2Ab@@@@=hZ:p驧lB 1ӓB~4uԡԵtA@ ,iŋemD˖-ҥK#sX, J>hay,q%X,%VLbaŭ+6}H@IDATc]:l%ז25RΫU&W[RM         HQ @ d4H%[|VX' h_jlulIx  sKgS1\N5RI! ln 󔱔(Q6l@OŊ.G+U$*W쓠f<@@@@(.=0,$O8[1%5, %,bk¤6Z2P{heX-kԨ5kɒzڲrYၦs@@@@@@@@\kZxAr# SYyä|ӦM )Sfdu.LXWBdIù-/^|(m6>6($rL7nܸ Wҥ#I!6X(D=@@@@ W}Mrʦ d!`u;Vzw%%JO{Rr{Y@(`,Y4{l͙3GmnaaF'$~@Zj~\KGA22GOvEOL2,JC9DkVݺuTNY@@@@@@@@ ]SZd)@",yxH9׻AZxb<-<\[md_%--M+W ,-&^ur;Kj>6ϸl\mo\%U^=2(\ HJ@@@@RY!^*##0e4rdzbȟ~ʗuzN^zjذ.%$)        )@"ԼncA1;"y.Í^$oi…Mk׮ԫdɒ:#¤oUVI@xDR_ \'Đ.YD[l4iB2N64YbŊEg@@@@dp9STC'Sͨ  z.ߔyGz-iDi}SNzN8ArϠ )!`e6m.Z KW~}5h-cݺu}EJ4J?'f̙3e Lmzj`lԨ;Ըqc@BEC@@@@@@@@ d _< D}@mm<7ʒ>%ܾ}? Fla¶ZjEm%}h#^) @V%/ar Dm},2--ޱTvmd,,@@@@=Z]o]RjU ΋<׍7ߔ^{M4Io?SӓBwTxk3-B$ySLѷ~~O YlYoӡs{(^ѢES({X/YӧOL˖-[كd6m&M#T-dF@@@@@@@@ dr]j s  ,_\6_ٳN7nۗ(Q'Z;C" k6Rw8M dC„0Y֭[}ʔ)uF˦ rʹYM    N0@rK`B7_ZPA:4sms]`Ν:uKkM|Z       $ P5@ 7Hlpo惧-ڦ3fi͚5TRW,y <5kd7$ ZF}Ι3' f͒M7omհaC?5jHtA62D@@@_I^5jH\"v[ח"A`/(M];=!9/6Hm۶ M4I*V֭[Dv͛7Wf|r95A 6m$K髯ŊS۴i:e}         !!@"R[㏑駟~kYJt衇g 4P8ժUd}=d!`I",X3gF&KkWXw}?(iܸz      %jB{Ixb;@D R=KҲeR۶I!{/Qg8 PM>@|&L7ϵo^,l.XjOjI!Ǐɓ'k֭cǎҥڵk%K9&        _$V@  7|oR[={ %.dfGqOlva% OAZBHeSʒXiݺuuGyn Lr    % .`] @ ov>0=);蘭S .?^ o@ l>9RcƌѢETNp :d +WZ͛_?- %޽Nq_UTIQm@@@@@@@@ yH׆!"@"\a P,ĉ4i$lΝX5k'KVִiSծ]'0+@ͧ) @ XBݹsIvL"VZEĺ[V6md")    >Zz1<@E`:7gkK.H:}>˫lٲ 9A@@@@@@@  PHYo([lIicƌќ9sTtiYGK0־}{TR @ 6mڤɓ'k>a%uuQΝխ[7dɒP]    >*|rTD.#r '&N~zBΓ*UګC3=sz'4}tuES׮]ELF \@@&_ڵk}rW{nŊTreS*UTzTF +W.#@@@@@@@(|$,|ל#@! d!h>T{z7kÆ jҤO ֩S'b rגA~G>?ec~w\è0    @\*_>=X\; @Rp:T.q3ϔJj8)G%@ ֭Ӑ!C#b1.22VZ5gP [nuƌjڴ7o|r-[LK.͖RB|:CT^=կ__ 4PF(        @! d!40Ar @a0a~i[n0&uQ=z'jժ& ڊXŋd#Fg}@vi Զmn   F?8@>\:(@@$ 凓%Aj=IE~hY=c뮻|[nE={TZZZaf )S{ȑ#ug;P5"m_jo~4g믲RV-qj֬Zj-[bŊ㰀       4B' =  @!ضm:\7Vv|<0K.I$Aݺu˗+tR=3$j7pCan ݻȹ{vmjڴ׏7N^{6lٮ.~jӦn?cǎ/U^nwη"`` @@@@J]~[h PXJ.X6MoH*SFa~RzK'0i$GC ԩSէO|IIwb7rvnYᆱ>${E'I'{gbGčo,!%K.عso%s]z}ȟ?w֬Y?^tE*QWR%UW]lْ9stwGso紒ppv@@@@@@@@X$:@@ g}V@- O8QO[O?~Aa0t^^ hZfM7-P{ڵs _~ϟ̙3#eMu'C=$0fuE^=։r?[)Cyyo^{ =ub?@@@@ UyGo>rJPo@hNFf̐tnEQC0@Z0zK@ YR}7߶E_x2}9[2Qufo&'[Y|M>lmHD},٣ż._w)V)68"?FlR\sMTVM^x6l,矿˺}qƻŧ~o}ce$ya]}W?fϞF˳9N$`˔b}^SJEɸ}v3e:,aAA@@@H=,$|r՝#d-PE?OR:r}Rω"`9=#uL2r>hIn(:y:s}y.-Z5\zkԩ tkoOOSzuO[, <Hf mc"lޏuL!        C   ))o-wƌi+VLɶ._ʕ+yZZZ3b'Py晻yZ d7o[Ǎp+8cg}KIPc&5ֆLNj*)m;]aAA@@@H-q㤵kIZW"9pݤ:iiP/8I={J}c5^Ǐc=6O36ݓ~真%g{ĊUV[<ORƌ#8B;vիp~s92EwEW\q5kN9լYӟK.G}cqO+'zmm9y?x       D m3  ^ 1B}wܡni/oڴIGK/7|S68aʔ)z뭷>k׮nP|ys{4ydlI${1}~ӳ>߷>&M$;\Pj|g;woyȑ#eӲetGn+75|p]vmy睲9nD .Nwﮫjun^{5>X>餓ӻ' _jvukiV?+>+~?_p}緹 TF VXB?~۷:w췵$?J*C="'%3YYfOgAZl)k?,cǎհa4o<5mT+WT"E· 1+k_a]CѣG #   Kwܟ) \xqu//I:D~ac 8C bAI[Ϊ?lt<}ޙ1? d+O[8akxb+8sZ<ŝ%3k4 .mea\2['3ܗ+gאUnҤcoVڶm+fcsxwN%J?/bI_~Ԫ^z>f:A:}%mkcbnF=SXK+'z=63        ..)EJϞA`@ yܗ@0`[Aj)/_>p #7ss=7pAہ޶m[0}ਣ] \o{ѢE7.ho$F.

    .9fҥw׹?~ֹ@% \%ċ3Q fk l\~K̜9ӟ.1?nu`ЛZ=ܹs:uOp7|%G \`ԨQ]Lp,jy~3Vv۵kИ1c58u͛7ܠ>K}i>a 3<̟??pP{c7#pQ:\A~p]B%۸;7#4WV[VX[}`{ϾK(    !u p]=A \ ?N98"/\|[&;~~kR<}Ym~"%cŬTXco…>b’Umgg@x ["t . *KwqgאU<4k,p \2_~V?R6lX7{m1Bbt\H*vG,˟|_rMxCWfX+aq VVl]Vq8YI7eٽn@@@@@@@%"WH8K䖀2t9.СC}9 .h%LhAVfϞ-:K>gu[_u]t؏wy'X%Ug}}0:%dT/XbIKdcukq0+]8Pł-^X, %:Kg۵i&p+TR]6x!n2e?lX_|1r:e,cEK&xDV}W~<Я XPX{rҦx%-YdVRn]aصӧOOi"Afw;?(~7>;#Ƿ$9)W_}'lEXiΖ>vX"ލBsIYlvgu~x]~+z7pAr!2{s8p?0SO=;%j<#Gq_"BΝ5~xׯ\K-, 4v%]ާ9|Va]S}n7K,IP@@@@P?ũzuYB\ GK| .vԾ\_tR˖Y[ 0UVck ;fnho珧;۰{O1ڲ/cciOc묿b06m*Hu]M41g`Ot<QbM,~p}v.Hw}{9H-b,1wdΕDrI?s ;bN&L_9]79#sz";       $Xh@@KgI͛'K+V,f.rܹ'?ꤓNZHKfKZZZjW믑N*K3Dօ 3g~_~ٳw ϭ݊%.cǖk׮W]6[{Dch'ҥK]F,=ƙ'9:_G[S<n^{> {?"am yb׎anժU5tPիWONxl疌ђZbaZ߭6V1/^ܿܶm[ݖOs̩nIa!]BA@@@H~Ӟyvu y#Цgr֯L9jyS ΂@!RZ=0JN珧;۰yok][:Ӿxefݻ@u)7nڴ?@5>;fVq ~c7N]p^V`خ]jر>gÇZA"vgu|oƍ>ƫnݺR 3gsx3|mrz#       5L@@% '{nJYgY'|R}0//ZGU^ݿRJdy睧c=Vyz[(S%s ؎.c-Ko^xO1D|7j˖-m}WS;vW^3f{e֭~qĉgZaoݺOzg`񔰮|2&f9VJ*CM0aC<^>3z/Ki%@@@@X@^v #бdM.gs?e˺G}4eOhvy8s;"XHٵeO/dN:G<}v,W_Gٳg$>!>2;gX)Sh˖-mj>w߯mI2 %KycfI0l0d:]A\+Ѥ}>f0V"|@@@@@@@/AL;w3%:> ' **Yq~Ku+g^XBkV+WK/~wȑQ[eXZ5UXQk֬pK6H~jʯy7>pnoı"4gXQĮ}g;w @@@@ yG*WN!I@WKuy>dҡJW^)ZT{W}M4~xM`V"vڒY[Ҋs[yاc+_KxSxqƩTRgt~U5|=0a\GwYtL@{MzYYW^YR,.of}ݲ姞z*!C Qƍ}O{pKiqÇp@@@@@@@@`xp  m-=>@>:gi%V`;$b[}ovzF1믿ܹs3={v׏9~ڵ!-Z(xCpnۇ6աvW_ջm 1B-[ImP 7kҤIڸq|A192kk|6ݺuڴi׿7 tzڀf͚yk;%4g 1c:Kj%3QgϒOFӌx>?>h4Nl;¾+dBA@@@H~{%r  ˛4%!<&=eK@M=fӰ6Ys]?y睗mmlEf9*V$ع~>ACHG={~|l}"bGⱴx4V7 n+J{.p]vq ?S` aśXT~'~9=V{mh۶K_N}PY{ .;sǎ}yVvYRڵk WꫯTdLkI5-&:1HA@@@@@@@M%@HX3l $  x=y+H@=ؾ}{p} AÆ 7 ضm)wq l1p}ݺu.킼믿>8qbu_Vq.?TRФI0 [n .Hcn @pWӧO\4xE].8گm.9ct,ݻGo߾}7=XPF 7|s~;K ̚5+pvY-[Gq% \}u|ߦf͚ :ꨠbŊ?{ T 'L2%8ҥKwuWsFK̙3y_z%O}q5;w \2EMhbK误}̪Xb駟q!^`'%Jרz ~aڮXfúxGڵkl3vzÆ m{\qAΝn~;=)S{8p1\F_{o߾|(7vnp?fA,.y߮~Ks؉|dwM6ܾ ;>qAA@@@H ի xԨ/DH.? n \_OҿOrU\6${O0ʤeU߭oM~FbEjKh3vÎi~nﶾ'|2h޼y`n}Y/cz<;..1b`X_Ǒ{/>bZ,#c<n1<aW\98묳3p-f9*!w^x!p×yVl /13[GN{S}܉{mpu{4<{ _g$m+'KdK(        @n ^ 9A(J. G @ ,[?R WoW zޏU\0~rITlXe;1g=P7pj%K菜qK8)`S^z^-]T.!fdV'r(N6~_m2[Xre={ԩ#8V-gW?CnF>_.]rDr$"ۇ ٝ'.57c/^,?!&޹)\TnGVZiӦmܠtާ}>3~.:/n@C%K`+TV.!k2U    d# ҅J+V1y@L\WnUzyysm3٘ cO{Av:cs|!xή6Q*V$޶Ī˂ |ŠTFmپ,ssTJq.)÷"31d|9PQA810.$ٮ6X7l .;z\x$POM:5GdHX,F>w`K믿K4q=ڵQuI'dɒ=džX@v%8}@@@@@@@@ $L(C\DI~$D`jA6Y 2ӧzD&$$K;C#Gr ϳ&ތNwX2.]> K.8w܌wy팮Hm%z߂Jݧ$-6iĈzWjժ~TR"N1@@@@X䒞Hc9 @p'raҠAN @,)]խ[7#CRvVW(cG޾Wn!T?f̜9?v>?jDmݺKV;viiiyDX@@@@@@@@Y h|G@@`O,׭ުnI}y]y啺KԾ}{|~Aݺu엍 hذa[.]:sUV/^8io?x1ߋ^YT)YpzV%?]xԼy r*9dw ={Fw}WǏW%QFSN*V]@@@@AI>@ 7>Xz=骫 +}xo-@ ?օ^56m vgRܩԯpǎdU}0}5d[VI m{ҥKsNFjԨ6k}O7PѢEC5q@@@@@@@@<(DW#zq@-`OQ0u 3чx @R lذAF>@k׮U:u|q:bŊI* @&3f̐%iݻ>U\91'($@46%;v>SwΜ9*_t=zk׮*[lY    RS${ρTթ, @ X{'dTҐ!Rǎ)Pq@/zK/CE]>}iD,,=ܣ~X+Vs2$+ZU^p Ou5}t2@@@@@@@@\Iځ)@"8  5qDY>H?,Sնm[}ѪUVv(Fu],d>M ,З_~ &h6m@ҤIȷsjӦҒQ@@@@\prhhҤC  ܹWK=?N>(UƬF ,YDEgqTR9>; @ L2E5k֨x>hѢ/ǎqUwU6ލ,~g9U\F@@@@@@@ d]0 V@ ^Zƍرc_hԩnOVԲeKhB͚5~W h ֭ o4yd7~w+VLGqڵk:cQ T@@7C-@IDAT@@ vVV?s<@P`(骫˥?iQ2G'襗^҈#, 'B@X=l=1ަהYf2))! P(OÓROIhԤP1dJ(Be93~u{Ϲ^ms>{>۹ܵwiʕ^}֭ղeKҥK>W'Nw}͛7+`H0`o>y*Q@@@@@@@@ 2>,DB H(r Hv, %NzbŊT.Ro)VXZ'@ X/-?Ν˗+ PB^n5,s9    @t 9ThTltו!^zdiE`߾}5ji={x]s5ꪫ>?#h7nƎ+ԱN:ռys(Q"Y0Mk{|0A>S֭[E@@@@@@@@ =>e 2 M@$V^9sl7o6l@U|yom۶,X$ @زe~׸e…֭[-Z.2/\vTҥK=@@@@~X=Zz;# _{,S'gO)G qɓj̘1.|עAW  88"A4e/qҤIaBY0kƍuמVe˖yÃ!>        ĦAQk@O@8@($raX[oI `gF ZJ&L*Uj֬5jZjʕ+WɁHO7͜9S?f̘.9{],WjUe̘1Yh,i         Lw׏N ts !7"h͚5^ E,K,ц dʔIJҹ瞫;[۶-g}ɓµt @;w Z|yb3}`+E\ /0nHγR@@@@HL`   3=ޓDnrtv\. @ &\ԯԲeV!6mgyٳe֭[1cF!mPʗ//kui'`mϟ3gjKطxyU,Yi}:,@@@@@@@@RY T8= A8C&o>\2.t-_ ֛7o;PUD /TRvUX1o… {KÇCZ~u@5^mwPP *Bs9GDA@@@@ \fC@Sؾ]zQw[nx&;#Mt7w\/.X[[9s\ruElٲ 8HVc!"־?uTM4I-7n3g:tȅ4cWϑMIA@@@@@@@H}̩_j  flXHuŽo3g_Ž5SL*R,hѢ'\l@Aسg7cÆ :b6 /_>{v{_*[dɸ5Ak@@@@X\Z@'@H\ o^-ʗ}Wj8$@ҥeKfNsNZp IPHk;=6T{>k֬qbB}l2-wA Kjɒ%V,V Ë 4m@@@@@@@@T 295  I`6`ˉE_>n8{l!q+VЌ3m۶:%G*\ *÷ @q3رC[nՖ-[֛7o֦M÷wV?c_Xb^裭lٲŽ @@@@M`0uIuF[ͨ G.~k{^}Un+'OլY[k{n-ZH/ ۛ9s>corWT[.2ygTR l=7AATo/1vZj1KhaAHMxw /:KWv4wc%V:u$ #       A)i@@Hn $T<7z?S>g2eCZ8-@gK|% ț7fẕx@Z۷oBm-y ~ ÇCaj:ƒZ)?:K,Ǽ    ĢKuFҕk'H͚I;JK~(ծXbN W\RX]&O;k3v]ߋ=g͙3=V69gPrB/^ܛ//X-ZT֎k8(Cñ~7ڶMn:N0y@G K٣oFK,MZzulRW^y,2TPAgVեKY D2|m`a@@@@@@@@:"Uo4dHq@"-!Cu4D{9 @N[l ;~; _v|-!`H[ ȓ'ķm̙S60:4 +`%޻wv صkGowwjΝllر {uhk 5Ŷݼ}(Wb͚5^(CYȟm[rx~,6 mpZ/D`m[MLh=m`"V2K6ZcjXcRf} +_jС5kwo\R[hkZd4j( KmI ]~[._2f+        ) @d s @ O i[8X -AzA=ׇ~"m Lhɞ=dB%d_[h-2e<[-6b -1Mm 1Xs⚻}1Ʌ8vBJ 4<4xb{(     oH]ȅ@xY2eO?.(u@@ZR B'OVia%x*~K8p 0ض D/m?!|9XmLi}kAc@}Vuw> (_7<<ϢEzTZ(_|3fx6mTz iA:v_OjꪫԽ{wM:USLgvծ] rT\!X#       Ao@ 2>.*{ NX%{2-'.6" _[Gz{l,Yxˉ̙3-vd̘1n<ymǶmG#v|m0đ#Gs6P Xv|<`9p -^vf <>4<4hv޲%p&N< | .Tj_y'v    IJIY!CC@ ,tۤ},`-1X֬k<61rM|֭qAa&ݴ 0.pC?Wg`mm6IfDAyNB|=m{lYA)`TҖom_`&y` ķXvY~ 9tPM6ͻ-ZUV.ܴ..e^b}Wz쩮]]}. ^jNjiǭZ7#l        DD Ȉ0r@ v3cNCԻwة45E@ >TziirN{To Aڶà vRm} ~oCZxc|&NYAU^>-C/)%P&vԬo :;V=Z0AڱC:qc?ҍwPΜ>@@@@8]RBқoJڝh/G@ vB!wokW?Ecz9)`,!!լ>ڤ|.ӎNA&`~/>З_~ÇKo-2RA+W<&r<;wnխ[ pK/TvoP@@@@@@@@ X!i^ 4s @'CFz9rtMΕNMInjԐ,2W9o!iLig)KN?!˗ZS@@@@R^Ϥo6nOsF@RJ`U+B J3sW`ң/j ~ZY3 i ޽[CBN2E V֭P *DK_n ܲe ,B6lPW^yʔ)sr0@@@@@@@@ VOz#(@)6@X\UӺdB^W/b{I髯S씲C :D}Ñ#O?GKfZi*1/\    @}RBC@@ Թ?YGI KөRh?֮Oh? <-qԩ4d:tH͛7w&_MW\' &x̙3ZUW]\ "u6        @ t!s @Al#ĪR>~cSOIK2%_yGziǎ;ljlxF/? Ng~|Ə!nj?.iZ(j`x     iM`pE izHvu\  t`_~)U@,X>bhK*R,Q cݽ{>Sۚ={ʖ-W۶m]`}Y .Tvnݺ^(5_@@@@@@@HAI@b@ - >MHCH>*m*u/rO\С-HI3&gviSߤQ5"{x_~9 9}t?B!m^ӴsM    @zhZZ J5# `mZISJKwމ %hѱ6H~_?f[EmO] SwΛ7 Oo>5kLs 盜O;ͤ9vX/rӦM*Q u+/_F@@@@@@@RT b@R8  .\VҥSOH%&e#BrD74nT\|?07.TE4<6CTB7K/_α|@@@@oo-b8 -P~֩Ծtr .n_T?CI? _??Q !iR/\8qay^~em۶-7Fٳ:Kwq,rKurJiF\5kgϞ={9r@@@@@@@@ 2\-ʐ!?@Ofdizn}F #q' WR%y*^hc!kJ%JĻK'ـ+ e)W.aãgWI@@@@Ҫ]-[&MVB@/5oҟ;8u ~6 qӦ?fti[ ȴZG}5kz-ZgtR/r;kPYjU]wujҤ.2HA@@@@@@@Y c4W!  @6MTIzq?,<yjBv:G]ֿPχu߱g7ȊK/IGH>*stRNرψ+F@@@N\V@ʖ~Qr9Vj@z睰D 6M(ؿԲTtR׮zSҬY_I~OWDd?@ ̙S:t… 5i$+VLm]RԽ{w_>Ů<ྟնmۼu5%5h 稒J([#FݻS^@@@@@@@8 !WN {C$!pܩzR@2M#~(]}ԯmSNC`v)_>i8骫N@~uKzM)#DT[1`dI $     $ԤzTdjԀs" ֫i礎2g:S'O_6o.oK_ߟlDFiΝ9VrҔ)M"}w֮-=?kFwb H 9Gn~x    oZ8cN@ғJgKEH5jHGZ^ [ w,|kW@6i6?Gʕ ~LȔ@ 2].qw`ܰaC<*iya9%cƌUzꥅ jzǴb{u׹B[g~6Q/w        @ dQ5@@HfI+J/(= XꩂLWeAvn:ΘU֩#Z޼i֦ǒB@{ j%wSgHPFA@@@@T WJ:#>@ҟ@ĉҍ7JMJ?Xv_~ςB{x~ܺUkᇥJ${FARElٲ0`֬Y?zUti71]ZdI)eʔ5i$7q&m۷oB^{zwy𷱍       DL]@   K]JjIŊIjO?ٳ'v^?\ݻO)sΑMv,X'Tq2HUHO>)M.m"}f7U"EO>V6@@@@HTihݕ@@8YAɻ\;n7!#GyǪU?ՙgeI={JZn?KWRN?KA M tɵݻwիտM:Uʕ-n]m;аa\_-/ThQ=:묳ԠA/(rݺuQP[       iE ȴIr  DO?I+K/Kgm]]\Ym6ʯ v Ak'u6j7Բ :w֯ڵ?3 #NU    $رΝ @/4td{R&ִ >}f$K{4gmnB;ןµ-bE)#= U"e˦kѢEZvmԙ        @l +6?7j  @:$u.ը!.,-X uW̙6l^x78$ׇ+AvyHcH HW_-}MrpSPAz1iDi6U"}T?IA@@@@ \3%Ÿe@NVysyڵ储N h.K,,Qz)CkW_Ϋlنj)Fc4|vNOr-<9?~v}Eh,E%sjذ&CӦMS͚5ǥ.]ݻ֬YE*        +$'E=@@AeG*Z;쳏^c.QnݺjҤ'ي@,Ag* *n-x'7ߔV-zJڵK~09it@N!@@@@bV`~믥[oK D@ժҬY~WTϒ 7H H*I=;{n"tGz*ʟ? J"x<34c Mr d& ZժU"2ZnvW]GիW~,CmkڰaCU        @  B@@ {OXQ:xP'$:9RSNK/#kA)ңJuO9eG=Zں__q?6;3GB@@@Q={-b@(YR>]b ozZ?k^VRRϞ/H7KÆmm矿Wߥ;C{M態3ү@5n8rF  V*:[pa]{U&L ̸ɾW^^ʕӓO>:Lh@@@@@@@@@ uLwΊ  @=[XvAiɒ%zR(.Aca~Byd(%p~0W_I[J'J͚I&I,8o_iغ6j    ]7HZ%/{  XV{IݻK:O1x X9+ HUH/ e*=`id< ]r3ZqɞsB_gHo*UrF?xUW^z^b4[X(d:uԿ_޻B TH~n1 _sn       A)%y@@Hud.P7O/x߾}ѣij ={"z?X6_K.tWFHa4^|Q?@ ܐz9眣wG@@@@ 7O*pb@҅AZ uEC.т4';sٍٲKmkm۶t3w}2eJ*HժUM̙3~+5cƌɔ)j=mܸQvn(QB<7:NP@@@@@@@@ n?z.@@ɺf顇nݤѣO|>}hǎn()"#GAT҄ :G)IYX1mҐ!Җ-KsH7`ٗ^Opx@@@@dZ{͓_~Y:g.=p\4th҂+нK5jr @ڵwiҤIgc Tc(k֬jѢF?ӛDTŊu饗W_Ն bZ$       DN Yr$@@ҝER*Ҕ)ғOJ2a֭z)ryeݺu0`4i^zųGd8qQ:ZwU[dGəSڻ7+S׬o+VHuuOP)uWqȍ?rH1)Tߗ^yEnGWL_iU> iܸqy'{֭[N:j۶\CA@@@NBl+  JcJӵ;tH5˟ -ڂ\_?wt [7oެzmݯ\ywݱ@7op+܌lY% v3f{gvÖkv3f$aovIwjGkժUKt=h1C?~uM:M˖-Sf믫dɒ뽰ȃPQ@@@@@@@8u Oݎw"  F^]r}5w9lԹsw>nM6i5j:HC$:X7nX3f /k;w&h!GiϞhS[A-ծ--_~rOS զM7ol F.T#@ev(-Y"v<GL)@׬YAy[2$w'] gz4uT͜9S~j4V    I3~GٴiR~   I K[텑cX?Mf(N}[xR6o["E%xm۶}n۶v[=|%veM ,(sfp tRM>eʔQϞ=͈:k!s~6X_-       iV 4ra  $sI7 h!}tYkժUz7Խ{wʕ+7GJtwxfʔWO!7E7gK>|~s=ڽ{>?A*!gNA S*V#.]Zr^Λß} (M ?z}_~롲        pbԛJu@@B7ټ6//7 }•5ky-ZHE_|C*sf!믿3gj߾}Pxrpd{fYd$ 2x#F sT {Lgy1$x%L0A+WA8u; ҂Tī~/_^7tʸ7FTlŊѣw⡇ fl->*h3F:uQ\%Zj d'垳&Sn]r*V-[;q.70wj۶w>{R >,P1=3gc    p"A~O~G@0&]qԺ4dDS9v4Ai9D53&;,bW^]Rڸ?c-'dB _|Ew *&5[+n3pff8kӦ >P;1q `ﺙҬݩ_~.sצmAaV.2Y[:uGڙ=fxA\c'|gʔڵ^{ZMD}>8)`aA`ov[pʉek:'LB\Ur s/_On[MLK(~WիW/}W8pWZjd {xi@@@@@@@A   R&Rl?H睗[lHn\(ߧRJ\Y6ƕm۶ymЋ Pٹsn6 0@|7]ԠA7(,oDyuy|'`50K͝;W6P^ޓ6&<@cx2( ͂ b9 ?:GR'ƍ몫ҴiӼ{/ZÇ{lUbN|I_/Ʊdܠ8ihr᳒ xt ƾ*װaCo`L"EurY>#w}wn `Aګ"~~%b^{m@ $'|/  @ 4rt~{Iw:?Ξ}4q ?њՓz/ r5z7eY۶Ǽ {4l0-^ `|uULN{(֭[WhmEe]2z%swz!de͚5ںuV^?Z[M nرn >{=S=snR^(_(?ZPkƎMnA&>OYa߰l 䳒gAw$߽nB%,&7 &ns=W;vPܹ^;a(5sLNre /' $sCDٳ۷/=TҦMRngpB޻_1c>3͙3'6SȖMU1cǥޑ5ЩҾv_n\`c!O}YR #%\yyڵKÇW޼y㞳HNt>%KN Nw/kȐ!*VX4k@@@@kUԭ~U…Zم  ִ@չTU:fϖ&O\:ڑz>}$kqM)RFFǜυ;jʔ)6lv|r]zmN#]ry.2n6 sq릵k駟[I}ۉ?p1ףbŊ0`Zh9/F k׿͛˅GE F wp{  ~,YRԮ];/VՐ3#       @bbU:  )ٺG_vΗ/,t_~XȞM..-dz8q3[[nU:u쥸@ŋ+O< YPکO^~-[T;+!Үӂ CڲEz})nYx3<W{ۏ‚mM9yϖ:t%C-܀:n]qc 9V^Bx[6nܘw%Koyo/SLa\io'm?+b{ۑo;ꫯ!9   A +#G WVi@҄J H&\_t\?Κulq(?./R˖-Nl%h׶J*ym?ODڭȊM,vܙ2e ,k7|#& v]AdP{OZM6JJ|B-p/t_[ONL_+R-[t}Bv}Uz^yf};p=xߖ@@@@@@@:EaD]   wޑ,*rgxo/!m۶Uv! -֭.]:ŋm+?QGf=>9rhΝހCW\EzT7t_`Y >\^ )~馛mۤC%w(?G v .]-AمgkOds,YK/ _/C>ԩw٨԰Ɗ$X{nK<&IW9sL;H":`#]*ډ)ht/{xz_D غukz    V\@Z )2T߮fe5aX&g'*k_{nU)*T{}ڴi뮻 ڒ׬YXX0A]Nl$c-ZQBlȑ^؏&9H v*U$t/Rh-^Jjp^dA_Z߯rsw\@i,3.\XݺuS.]${-z#rʱ|y@@@@@@@4'S@@@_`~E /<H;%\^ӆ bL]vesSLsQvZxUWyvfhr!oU'P(?fB֡9C .m֮] lB ʕ+LA H'yJW^)Cw޽;BQ-<5|i֬WUn㮅 ljNsif aCgys@A^Wm\Pwى *xo?~|pomߋwn}W uɧs΍^UN{G]t1Ahyܸ   i^&Co߯n7,6@@bV ߤ'Lpsʚ]>7V޼Rݺg%l\ۮGraR@P=6۷{j uqĭ-(hޔXdb&b7okӱ> L؄fAb|}]-& ڴN>رy=} X;Aqo>lą ?}lHI*ovlvVZ}]J.@@@@@@@   @$v쐚6,gTNwy E{Q~6p@͛7Xz_~ތٲeիh"Sc=F 4;ֳ>UTX (ի %9u6;9&,s#I& nV1)}2bA魸>:U˥Tɒ/k^'n)&Ef$ժ/oe]9f`:+(ubA+=\"ƒ>+,XPC w߭s9wb;Hsyhz;sLڴicmJA-*f+k=yoG@ ln^eBr%"*`[XnjxΝ;J̓ҟO[㮣        @,S|$e@AR 2S!.le֐j!YPކ ~ rZ:۠\R% }$ә.{|%գqxpvmOuA>)&`YgB!mlF{΍B!&N|9>{[nd>wcl0frɔ6Bts}Zmw\ʕƭJNt ޝTfK!e-_ -(Do!կ)h&%Y/!Bd?g~12Y^8̜9}sf9FܸuN+W./:j׮yh!dɞ=ס*U {Ȃ 6$ ᣏ>ΫGj֩ZeVٯ_?.v:oH+:%Z:? ܈9\սs[lIk@z ض:J믿$:3kٶx嗽k)]բE :*E@@@@@@@ ^wz#@ o=GD={ 6?F'xwȂȬKB=.^X;vPŊF/ۿ,+پ.b+Vx]p4޶:Nv%'r4]C1TVŵ#q+IGKŊmg 3Q`6iܸ@(رr0@Yƃ.pvn;V&Z, ZB aΝ^ü%K*O<s@@@H@ /u#z蘭ã  9T;_+P(urYȣ8iRs}yki=3-:-5j넯v*;G:lv1ZguVC'<<.c[:`v[ݬC/۱#p ة)5UۆvI 7߬7|3sPZlْ@Xxs       @5oE#@dxY  +.կ/e-;T׬]v?~.]ᇥΝ#8V%.ԗ~Q9҂2(8,B#M"8 U,5j$]{tRlqBU@@@@ * p}$i9A.KBEe5)4 q+R^g'`!ӦI8qb q>x@c:?XʷhlnذaUV,V:!& Nj#H}k,Hׂ7oA oQ޽{:}'ժUûV       &@$@ 7"I,Y+TH;V*X0''EbŊ*Y*UWE.Rۢp(SFjZ= "wzu0K9SZVVM*R$ +ED3ҭS\5 k3SOl[l*m̙vdO/"=쳑]HJ   aX>'y_u, @2@`)з~Gg̐,D@?h`_~eu}:u@\TΥ9KK*K.$MvI/Ke@ vء.]ۺ馛[os~[n+>}}{1SM4R-@@@@@@@"C [dR   @F X#zo<3;g%mDǫp@سG:U8Q4I5)Wm,R$r@@ w!1 K;wT.]oI&z뭷±Tf=8pW^y <@@@@@@@@T dI+y!  DrbGK@F[g.ۗ s̩_~YӦMs 7 +[^qҿ-3U"&5kV*Ukҭ[7 2DsѮ]|r9RJ>?Tgh„bСJ|ffOw"@@@bZsBj$ |t}hz"2?T@ „ ғOJW^)+]}4l9 7ߔ, e];7 E ǏP曰,;RRhQW+2S.@@@@@@@M#nW5 ,uʀ vǎ#Ի7=nG[D@t@#wYryx q$P\ԿU$U=p^xCETҚ5릛*h NbF ŪUpB-ZH/̙ܼ:xе"j5jMbx@@@Sɓ1w\?^qLȮ>q3Te@@HǩSkgN ڵ:u+uVtUһ-@ 9v}w!r}brxNt رu6ow} /:$͑#GtV&3f ⮯YBtZvЩ%T@@@@@@@:   {VDd콻ɫQҾ}{n<.F ̙B4rSjxvYdQɒ%u 7k׮2d-wjŊït-K0S\9X1>Z3ʅ   $Oҿʟ_!!Vy% lڔhzo)+ @l %n~Ai@HkJ˗K'j%@;EG1ט6nNڴkt!)( թ#B`10    رC0@rV-ic2'.ϥ"E$2  @ ?']s9|y)8w-;y[ry ī@] *9Zjӧ(!Og͚U۷ҥKqU~},J6l׏F@@@@@@@ MA#  ˖]p+YܯrR8ti߾[~/Bŋ wZ*],Uq YF g3C(+&D\Y:\鮻 qB@@@@ kH/5i".,=`؂?EӦI $#K< DZcnݤ5%?O/>PO[crCg[_:t(Q# /PhQD=ҥڸE,T;\ceٲe]W @@@@@@@HA)  DʕH [)W);% iIŋǺھ#UZ(jI}b] ~$ \^5Kzai U+`#u   G񮯿^j"hǑ=\hEC+_ԎC/X 5mE@ ~|yF>*T XNZTzmCmWw_ T53  @AzSTR%M0!#5\sQN\kիcT@@@@@@@8µfK1"\Kd9 8SԱ}k@"H`骫$ 늭AC| }w֘1퐒/[4-[OFI_W\"S`6ixɶ6]W^ц …# @@@hزED hpſn=#Gi@.։u`WpyrʖM:cub?Ϛ506ܽ[ǭ[͛?f bEZ5V-zu)Gc'V~R[@@ m24qb`Ξl^TN`][:眴'n@:@tr_@ B[o$owءvO?ճ>nݺ~ K]2]wݥ륗^<       M5 `@@@XW_-y4n!ަ.,!^[ta}dF ʋ? jKohZX(B"*W|5jNĒuA@@@ =,i\it_Bŋۏ~[ {W׿ƍW\:wSj:묳bթK2eGѷT`@@@@@@@8&p7[aȕ@ BgGwoz܎зb!80g܅Fs;~~X7OFd )mPoO 3 vI?p,rŊ@pǂ!ƚQf@@@GߤQѣN:_>R%B|y %$M=4{lYJϞ=եK)X-^o!mA+e5 DdYҡCRٲG }S'rs¬#@ ?䓓.7Gڴi wI đt[ĭ:~:uziaHUVڸqC뉒@@@@@@@Nvf   @D X(>|X7N\9P\kdܸeO8(1pܯa}TER'.ޗzǘ@4X VˏB>{w gx啁heD@@@ \.@KÆZ>X!M:U;.#GmիWO{fΜ:&3a@@@@@@@@]*I@@@  @Z! r+zQƌʔ Q  2dU1k7` }I ۶I{nXȞ]j ^HZ:~qiRn҅ 5Jڽ;jO]@@@Y`\K/͓֭___Jn䗮G zIN0!`ϟ sgj@a_Xzu-\(tiuNh FN"6kL yQÆ yć@,YOk;_hÆ QyW͛fh͚5ʥ.\ڥK3        '@$@@H`riDB m8r$p@c#ExkN&צnؿI@ -7-$rӦ.!EJ_oi$[YgI\s,82:jE)@@@8&`wG2?,];)gcKέ׻׵S۶mg:;ٳzb2T@?V8~ رKZ  mS}wHÆIFh)d@˖-ݵ Jiv[AVpV@&4j Dܺu ~Wq2\tE]VB^(fTj"       AI   %п w?aV}k;ҴiM eks=ľ^uԫ4gnRRϞRRbȑ#c߄"  D!R2с@f t|ZqڸEͫ^{-5L8@iZ)m!5jH#FH7JK}:M7Ղ }@ ֭ O"oc&*Pti/ lٲ^ '|7gy^Yƍ7ި7x#nNE@@@@@@@HL d  @ +Yأ%6MH{$ ǫ%ىW{K@cÇ_nj@}tҰaҦMԻ 4v`k R#   t͒YVҥR˖)}!.]2wܩ_PrT)p+A@ }૯'hǴ]NƍBGP@W//Q"P2T K,jժN2tɸWYr  pu1>qwyzeI` ;V /       $&@@@@ vLH7R6=_\kmyTߒ>&4X8@С =<GFv;iפn$ lPjHj@F    d9 C u^yW\ERWk ciʤ=z0iԭW!ځ,RҪU  1Cc@@@[`H+% G~^d׮]ӻ C_~jղ2@8Ϟ{NִAl"}ԱTTԴO?6m BZ=FFf?,mF^)r\ &b@^7N?딴6[q2jJC /N:I&        y@@Hk|laY bYD}Rn@Ȉ4X9 X*U$ ̚5ey.I?GgwY#&M[bEi@ C6ijuG@@H/[6mモh8Ν;kڵ]ʓG*W.fDE@"T`>'t-](޽ҬY:92H ~@Du4:+w!M(zw;)^X>$[tҚ6mr̩5j~m?Yfz޽>hG@@@@@}Q@IDAT@@ EA'#  ۶I]0lݧ"]tQ dnlcq ,23s||.]ܬ1W^k?s0Nq-[!ծ-|pdr~ ~>@@@bYRƍնm[R,%3\Y$^DR /HvС@\̤INJXTt-Ҕ)Rz_:3GzU%;Ð:k *]r^]rbf pgN'|xmM0!!e{]/{vV       @ pY~ٳf@@%`!jr IHI'k< eFdz| {& Hw%e. (q\OșS׿}~/z ;vk s,8r߾&u L{_3@@@W~_>Կᭇ@ȑC #hifI]A( 1%gOXoʕ Jl1}ԾT ;G =[[}pLO;Mj<Бa82@ NB\oҥcr ȓ'[w~_jܸ Ak#wdլY3 pwHJ! ]hv|ʎNю{O蜝ΟsLΦNvͅvF? |;q;ChtŒSGJV-irua+Go=(9.`;7&4c oϱ?m_U6~ѿz?\n*xO6M'CGۯFO VΝݵ'zcb UȮ׫ZwܤICBc       "@C@@ Q0vӦM?\h/m޼KpK`Ã]Ev]Ѕ6m'ݬ n#TMr * W"EN=\".kD8lb6lƍmklmKZ[lYi-_~~2kkX9KBo:C6ضo`(B,҂j-͟m. g&LC C W^ ]zad@ 7_;S >e_klgۖuy_lcclj! |ܲeGo1{MhH LſmۏmKBm[b L<ʶ'm[ *䍶Ms7v@@Hԩ]wuEgG]O<!='KS@ Z츲vn?:cC ~oO`혒䟛6߿O5~۟n'4ʚ IۂvF;fO`9;vlпmSo>3;8*x 1:cIo)>UK @u4xDd8DYF4 ؾz4;\|۟gS[&eCy |nI&v6oԮg]/G{;xX-G/ڗNR3lGs~51ͷor+N'l}ao~gRu        İ)B]IFfGHI< vqXǎ#ԻZV[._b ][Bז{~Mk֬џ](Bs N ϯ3<ӻ.d=E Xc: v.Xm|q]@0e0?ԉ].,  Wy[۵rJZb_ljc%{~@moBC۶ohfSkу>ԾX`eRZإ]ߖbŊy߃,63e6  D¢,h#իWL2%S~weu'~zA]^փcJ0v7tcT<?;ΔXxC1q?h)t?fCvfJ @ G? A6Z0iqihIlvFPʿ<".}7NjF8`<߭Z=z?9xNZ駥ߖ;.g(+`@mfD_߶=H;W|&Vv^ugml Mm<ھ/7HGu'.P o{p0Cݶ}FO&>zd?ҦO}hbS{SL0Ķ@~Ծ}{=3z'c`>9s*Uu       )@d|X.8%2?T.\{ tR/,D A .8.t‚X{uYbZa&IUBoX,!qM7eMN QZ]*/YAmWlZ i5PH ˴Mm\njvk` ,D^ۅ^(8Ӵ ָ֣0[;x–H/(︇S|~-Yw? lԶ;x菶6ڶ$x?~pxߦX0v2e.Hf@@@p.YS.EGc-ĎeС4}4cF,ג!vLێZv<)}ֱׄ"߶N|Cwߎhy lj*y ~p]9,w4Ǝ=h;=ރkRShlb?Hj˖-^gS}ٔ`!>/?4tdL0 s\ߧXۏ&Hj!td~(lWm߷k6C5#;C_ݻws= S::ux_~ ӢY        %@dDH ߘ5 @,Vֻٳh"BN;Ms\rG-.gAZ(B"t >zA7fuTP~7:N`3)N_~ܱniР[K]{c3(_#7Aw-T0cj׮:w:3t`׎yܧzJ]vR=@@@@@@@x 2^yq+@dܾTNɓ'kʔ)^]lHRhcʕ>moڵk5gΜϮu뼀* X+񪫮r::mEթKIɵqzX@Ă?¶~z c]LYY(fhaf,BY5Pa@ 9ӦI5k&癮I +ŋ,7ekFam{>4<e_ ᴐHێlA^*UjժԾ{̙3#ɺ@@@ zyF81[ }v ?Nˢy.0HGu5(<.`7XuHd^-*8ʎYx?;A:!M ի뵥~$.`:k֬vBm,6!O<'YX@߄))`s44BZ-BlH?҂!E-Ygyfz;*ݶL8PN-Ѯ -saqv<}5DW!-߿5`שZx2>xg/aAyacTwo Pb@@@@@@@N"@Ix5 c>D5|3f oj E2Xϵ.f ]vyk; @5 Be c|ڽer# M8-t^= }Z.ϕ+WB`^ _~AmjfA|uzan!U\Y.D4ɅɅl@uAnZ@_~ļsʕ+a g:cשSh86 S  !d\6:4u~wȎx&MO"}:S`8;h 1?<.w^P\hߦ< P;?Yȫ] !-dɒGG c]'MFFۏիW7wiy~?7[2ďY8kS?(ֿm;vE H?Bm@@ *:4$]t.RuA?|xKsU.$EC 7o?qD|r/ҎOpY|i 8?"@ q=Y^p(blU)k֬^Յ^ҥK{Sfdɒ%ڪ~Զ2~!OpN|}UVy[-SBd99?͟.\kG)ضmѐ@fF~_}ٳgE%J8ܾ>Bs 8zGn|mŴD&Mug߽@@@@@@@ c坤 @2L&OC̜9S;wnݺj޼nF" ٿ{}'ϵ}vunŷ9~+T%>_u髯_|@̂,^z^cp?܋a? `NvY4hR$)5ߧ̨}l駟jڴiEͱφ}.!d!ߺQ7߬f d@@@xe[7it^'v:Kep1#/u!`.\EySxbWvLTRG,P=\bc@-H @=?XdpY 76|X\9ojǝe˖.ȅZK.3Pɝ'5s%Kx}ܫ su~G `l#`vw ~M7l~u0_tEh۴x ԩ#Gz3]/v9{F@@@@@@@I te @  B vۧC_]R%iF~kZ0Ĥ5?PFR޼yu=衇yuJ*5n,Yc,׮'{lÆ s g3PFt׫aÆ*P@DĎ5m7|~kyuשEw?vjKMB, )S謳 7ܠnI'4 9rDsB?3/Tqjݺ5A  #r3H]]B-t~XD< TC80jM]IQYnC`lju`C a+Sl,RaFSVD`˖-GC!|FkVvL:+[w>K.vnݶU6qs. 믿`ost, ͂-k72bU v]T?B.]zt b0h660K,a/Sf/]vz'N~ab{O?fg       E Ȱ0@ z"moW_ݾJ*VʛFkp{ߖY?.(Ki;V.\QSʓ'-K kAȑ#5`M0kִiSz뭪Se)` 2K/p^BmVիWORxZ4/w?XYfm{Zl?퉆w0˸xb 2klj*]uUb =S#@@(8xPt?ȅ;2`;û(Xp?IO<1/p/j̙G :6ٳg-PƊ+z/-ɔdݻwˎ!ZXkӿ+YѢEUjUKv Ov߂!,Yo!GG+Xsʕe\rE5+C;nZu8lذA\pz:b       @ o:UF 2j@zٳG^|E߲޷ϟcQ$`'z饗FL֣G(Q"j;E;aCi632^˶M4Q֭ՠA/-Jƚ8&uV >\ ҴiTBUVʙ3'r+j>/'Y×5j{QyO]΂N4I>3͛W۷<ݎQj@@"[OKIJv,?£`i.s>Ht"ƜL:U?~G/d޽ޱ nlK+:B O͙3Gfn-:|ý+X*_tҨ-ULxV\ӧwQB-G @$֩Ey1رûtQƈvܩ+R1vs8tɀ       @  GR(@d x:$)0bŕvR.]`h!= `k=Zxy=SⳒjTp8k<3UHӋ"={zAXX ̌¤&8,Yk^cK ;С:x9r |ڥZJJܱcGNTVBG͛o7ސ5(HΝcVԾQ@@ \]|RnJfͼ: ǎ/J #.,,P~A7;cg5k/\eX  @, ]Vֹ98{l߿_ VڵUn]]}պ 3 fgzQɓ'{A>oڴ۷>.s_,:.;ӣ~d}oya `G Tm{-kժ宵ɄmRhdicƌ0Twƍ^'ĽzULkx       ,@d$; H E"vhv4~x=zg/_8) ?Cw￯ d<7 yK[aA)|>ꫯT^==.%R2 ez<`[fa'O(IwҤI^ҥKu=y?4"mKa۽pl ͖-[DB!  M^+$ w1%twkm~]x,mhqh&J(f̙oFÇG :W ,Ƶr@ zTM8 ɵ@WD ] 5v;ka}&5o._/^(wi„ 2e,p: 1 ;Q>FNJn@x b!ӦMB'-w=#dɒE+W|UW){ǿ8BYG[nψίoG cX|       _AMm@ɇ*_M6*^w%\E8ضm:w, l߾d~5$Jܽ{w_uQ=t嗧Y,pA/W~1WS ?V˖-ճgO)R$KB?{"@@bW`XQ#e"vsŊw,3K@G3SjJց}'PBjذ03#]| cƌѷ~ /Ft{3?-/:̈5F:,ſk}7-ΡZGz{tEO() ?6lɓ7˖-SΜ9nߞs9b l?akD. YjJ*>H-ZY       '@dٳf@ SvV@<Ӳ૎;W^;9.*jZ K$>r ͛ӷΣF=ܣܹs^ӵ^+dd5 [V^]$l0އU~wjݺ׻ᆱ5k>DM#hz3(K,UF   @ :$(,)w1!jժ%;0c vi]A-Gٳ5bV\u66x`^ZʕM7TR }(Dڵk7x?ٳgWӦMնm[/tЮJu%ke8p@9tP=2U[P8%DB7E ݳgw^y1R_}UuGAՈfmw/Q_*       *# x /x ^~eB -5sLmܸQW]uĞ0 Y!SNuwh@&bƓO<,X Tא/k5x饗-ZМ9s޷2Jn #F_~۶m+*  @Z>@ZTr? >XXyiVI%Jƙ4nX^xױG^pYժU E p 6W^qUz袋cwJv g7/_/=N ȮXnOz $2>TbJXb^#Gtn֗_~:(]?` ;v:-,ΟXYfywZݨ       @| _7E@R%ךo.MBN?Soyӓ<=Eۅָqaz\hW_xz+ڵkտ]wuիWbO |51H.O.|cǎH-jԗ+ ٣&M?^|EYP^zݰrlrGӻ OrH?{lam_jԨqƥkK'ꡇl_Ɛ;w֓O>>H}QfsL4a k{[[}_@RkܛCrcu *^jU  a8p@CjN*]:֏?ǵeB|~mDҐ~]x$՚D~.;`F݇_MU[]ʕzKٹs{̗/7/z,#CWĎIvBp.??~w}wŋ{AݻwWѢEe^wܝ KM6Mb2ed{LƏg}vV"3}.4\oBBp-;I2#~+Ѽ/I+1O?t8]+c:T{v,a^ǒ)]nH"^8q uU rRZ{]bOvw֭^ݦNϮCȕ+ٱ==K       AO@@|^C!CꫯNKR(Yp7:9|֬YYSDT4YܓT7nB6k_{;wvq!Yc1k`rfFbG >:Zr-_5c /*#PsaO٤G}.'x{T/Ҧy7kZpА=}o^֘!^xVh"VĚ5Yti CoAi޼y/mr͌i8U\Vr,lkv 7xĒ:  @< vZN5 ۶mSVteq]vwi\ZFVs9F.8*q'rJ5l *W-Zu:f[vL!}#˳, sVko߮}yrخ ) Lh^t;#Cٹ>pNG견ӢW_} &^z%< 7yB¹^˽5k[mﬓs9' ҥtJeĹp_VB0̚&fRShޗ$VHǤQ,_ioڵ3v훝mܸwsGE9smsOӧ{e֮]ۻӧf𗓚y5bw?/td ?ټyW7ۧpAY]eLNNx/a       @ pUuT@85vFjuM7izzj۶m؋fͪvyYvz :t D饗uQ &駟>~[5 2g?XÇ{LVDLnݺiڴiufXsaHGӻ ۃd ;ׯsuO[Y˔)%Kxa|YVj^sw_~z,פLTݽ l,TT)pl֠֕W^ylf:Jwt\}ݦ%\~/3p]b 5iDM6:5ENKk ׬X,p̙^`x=KŒ!%pW-υڇe41F$:G>&5BWh}Dݻ,WfdZnݺ5ܫ:,>}'{y'g$Lo]z>B$U 2z^|@@@@@@@ 2>wj $K^s%i}]8!"{]E="ӓ OXzCyCbiZԪU+=Y] :̚5K !~%2ba _Q~_? ~,-$T& tȑ2_k6d˖͛Esng PFwu *C>}뭷zHwzoBC|I&ĶiI&2sw뭷R߾}`c  ĵW_I&f^!Chذazc[/%5Kjk"2%G?/l x M8QUT&T-b=I曕|C?5=+HZ.+^i|wK3ޯy ۵5˖-Sjռppd˳N{G} />z܂%;_K˔Ik 9h  $V9sTB3t }^<@@@@@@@$#o9  @v=(OD֭[gAw4f& ć>h3(5oܫŋ ]$JGf͚\fxxZhqpIF8a;ze ge}7ٳ _wh> z!Q9܀Lu5HӦM$eSO=UMI@GɲeLٗI>p>Ko?HyMgz?;ݾHi=0"L^%_ttcE~{Ot@IDATM,hk/,,=u%Ҍuͬ|7EE _f \m6S_ĵ=z0߀/(зz$G}&?ƘXH4(3u7/+V2S{_~Fs_.\8Qij{zi g&"9-Bȑ#zqC{ղeK3vFQh mD_XI              Ho:6nsgBG$@$_Z9o3  5HZTDŽYhQGD::Hɟ?9x U:: 9j3+P#Q$Kp^ &OB7Pި3|pS4oG*ڵQYG{͵j蛣֋xQޤN -Ó;v85r԰ؼ*JiVZm75k4ς1}s *cj;?8M41(UQcu;(ӽ:5s+f5 4 Σ' a;j ,]Ԅg^s/;묳J Q?\.c[!aЯ_?G5vfΜ+W0'P[n|K} 8*oo ?8^֒x Ρm;z^.7t8*Ln4"G7*kå+1lI@{T%G̾ Іu2cfKCz=hDzաNS!GG',3b{8)YD?*:2m(󭋖>{NJ3*L$ɻlٸx;O.nىGX`}[w YgEΰn֭[gO1nĈ &#`XK:PN3a< \nD1z D`ʔjzͭ\<7_u̬G7w6 }G! ;] /իW  p^}{1 imܸʱ5 `C8m۶u`n2nXmYl6DPGbxfݲbxp%wkϱ A@"{;ٰ:N0"ָb^ZٺuBuf #6bhk?< n@|W<{oam}";,p=G,ksґ d$~2:񸗽Hm VpjrMj^|EaѼݠ +<\?`b Ygq 7CmXPN2Ѷ` 6olmLL.;1HgylEZ+LBXK΋b然sϬ@f7ΩTu"<ɝ7/*dOtE:f'B֡E*ckyiz& 's%;![~༼{38<6> %Ls%hWLf❯<#ۇ嫈e32^^/X`B#էbm8e~/^X~+ufG^X.+Mw^pe yPwl]&Bn<^+]Yy)i᥂X9s}FڎKn

    |RsܹNly9rT>@")?1Q8Xp5,6Uw9/)Kv}Lpzm*ਣ`P˒cs:qNo,4Umz0ʙR![o'_#vل; Cv=-HD@D 45֙" "~4.t!HM0 W*U 6M4w̙3DG' DPtz ipN4͓F;e]f_8'e矸pw;G֭[W^Nr 7,:78>l0X2˙1  ULn(SA! a&P6, AsV~% X|}8[ ]t́Rqܸq-9W ZZ`iӦV1mPsSNu q i[Z3&fBR7S`x$䡘P곀ukׅ?,P`}aN`eN`tM<=EJ.}/K:P ЧS-P7YbMqHB2XjÆ Dcf%0Fp+rRr?ơ*L\=qͻvl[{]ID@D@D@D@D@D@D@D@ Ρ 03Ո1cƀG͚53N8"ƙU'RF|M&\7/2 CnYUfFD@D@rM?|q\_c)" 'PB9 ,p,FFA!2.-[t#K{̅;ى.~m,][n%ڵk:Ao4jȉ{rS)y8Ln ˗/wQŋ㫯r u._~[O}ݱ{NHE7ORv0L~x 9:N"^z饉NqKǪJU ǎGy#G: s1ܹYumv`$Wmaz|ӯ8#н{wo2ܣ@Br4M|q\/6D@D P'|^z /2>cM6}{,lP$}M0nM4 d:,6XdEJe"=_k&r)=$iC{H5955֖'/is~~[lP|E͚?r|6=2`0㵏iO@Ld G(L*nZT^fϮ@&440D'@hN[\sMt@>}8бcGh ;J5@[F٪_c *1 (G:4nܸlO?|s W XU\r p lC|GnB)XU.vm74h\x(:KD I~`֬Yn/"K,:6K_BN/[mUlELrФ '+WL]Olȡm^E%(D,ħ:J`xp[@nݺѨQFhg~_ /NzBϞ=]j%" " ! Gq=|u@> иg>o;;0ĂcHM$ j*7V`ļyPn]t{sh:C@Ulݺ5[o=L81g 8j޽1w\\pׯ6tl(ZNO?5 1~x׿ 6oZje}Rr=+@Kd7|O38~}hw`k|>k߾oD,ÇB,G& 4Q YTNǁN; rfD"}yLdMࡇ`pgCǡ/։" " yO`?n)Ȁv lתU+y@LSLq9",z'얝比,%*U.{ZjWaNTDNSW@c)I!iq"wU7o}M6&lmU(L z 8ᄂ~VW΃% f7t RUID@D@D@D@D@D@D@D@ pov o9N?t9;Q 4|A 6 -,%n " " "M:/QUҦd|Yp!{1<Ø9s&vuW: \IMjMy8cƌb d*UPzu'ۖ[nu1Lek'LX,}HwM PԳSN)Ofb \|Ÿ{бcGqe]׈#H/.]Xsl6CzJTȷ߷@4ڶ93~sʶ&4f/_PL ` )NrdH#"g{QtmX KJUuƉ'DGzU$7]+" "O ~pދs iSTX-Z0^8/9?}L f7jD"ʕ7_Mu6\Ì +W>|-Ӌ6 ʥvyS\E6٪mK%ϲЧp0@ 5m׮|z! !ȼyHY pb9ruE9E,+8(jSckMRD@D@i8N<+_Xg@ Po!C_[lO>rIߤt8Nn om{}3)o_~EMg,^u= N1wwK ШQ#?έu>h̙3tVZwu˙K]_nbVq|y2tp]w{Nr 7̚=Qd{{H|}VG~ȗiӀGgM2L =v-Jh|>L#E>\'~xuBԫ<5*ss!DLE)M.7fS6KM'VoG$" "P`;7wS駟VZ U7L2Æ sٳ'?|lP:t(ysg,;!ȿ t֚: A~p衇6U@ttA]ƌe˖%̅ Ϛ5 >h]f%Tzu')}b*UpwW^qAZnd˝a/T{H"̐Yes{Y&" 4^R@A-^W2E香{71/.dC*<1T T( ]\F5&%H9 DG}& B[" " YBhN;W__=D b1(@6ȶ6ɶllJ'nwRTA[~Ν`Ŋ-e}L5d)m!PjUk:W^y%F%KO>gЙvR[G)ud@x2C*A1Nь_>H޲9NP535]E@D@D@D@D@D@D@D@D ;H2;JP2dve>s}qD fv|̶6Ŷ6$" " " " " " %=]vEӦMPfxc=z*@`e[e Lٖ٦ٶvmsp\veQ.?d@/EXdԔ3w_\wu裏vԯ_gq* QBr>,:uꄣ: 'Nt" / I#@ӦMs-[tI˼=Z/ɶĪ)+! !>h/i:J"QB}dK"O￁SaEזW|(b{_;.,_>JD@D 7,gϞhذUb03fs&lP)"$&(fvنK'9p>S_ #T{&{~}gX'D@:묃ƍO>.bB16mڀ{4h"IJ'pZH>9rLLw̾2fǗXg=5Bڵc" " " " " " " " "P$YY`|LIӧ;]) mMID@D@D@D@D@D@C`̙ncqΝ (O~F2M3؆ٖmctla|}SO=o7'СC;ca9Qj,YdK/O>\pyT\9:2;&Oիd)WI߱li髱$"OșTOիs?Ebd,2?o B:fЪU{V$][V !ȲB"뮰q"?-9s*.Bw܁wDܦ:{d#MMd[9rklllJ#h" 4^y'Fߎ3׎&X}_MSP"P-w~e/a_>sGRJ!C婜`,Z5wawƘ1cp;ED@D@D@D@D@D@D@D@D H saWrҤIhҤ /_O>_|M_PT`[bbZlkklsJ" " " " " " "?~:ϪUbƌQNY<jllll4rfg/kzq 'Ə? )0Iqcǎ7n\Y-Mw޸[M$T"⤓N* ڑV;v,6`t+Ӭǝfn D@D  Aݕ*K2Emhj4|$0|cDG0{4hLO&u 5IfK[2b U+OD@D@yoo48pԩS~TN(l/`f[ffVJ. x≠O?^z᧟~o⬳V[m*7A} E7b_>}R p{a6d0ߊxuXV$0q"PVkwa֬Y67(Q8@ada<炭#\T;EbDE%H-Fkc[c$*=%HD`…80x`OTN|s(g\YGB*Lb``}vQ*20Q֙^h|{XJ"vنٖ٦ٶƕ*N`ހvl >'vy灁'> @IDATĔD@D [ObDG.wf}Ry$е+УT+F2.T4щp6;v,Lƛ{oωC&ʟSo.r4nlmg^ŝ:uuJ)$xZN*P:uн{w|͡Xʱ>ݺuÀA?]|UtWO;0pbܸqPיh.2(hT??wA7W4}KBXXG o?*$Y[^9|~T'*]"eV$үM_ޝc~ÇOs,[Q`A`s,1)XE@D@2EGu gy&|M6%X/HrO}mط)2(UJ3~shEa BD]P4hP&LO$2LD@D@D@D@D@D@D@D $Qy̞='p>l瘚(,;3|| ֡5p%:CQ mQID@D@D@D@D@D@Joq:GI&ʼndJdL0/_^)I{/( %مm<.;ԲeK=܃ _ ='jȱ> |9pꩧ vǝwJjժ9 [bEpʇT>>ӡIN8ҠU{-Z:ݐ믿v"7x#b5S0~n&1W\:PCq™n!ȯyND2لt'I8_;y\{NX}2S:C2˭D@ w0aziƻT)RPGUP7`4ػE 6dE4E4)Or\=Ɠ*RtkteG Z0xA6 Eum1 iRUW/>3p;afKG*_ʖT;7O=+99|Jlgg[g}w[nAn7o XXfL\g"e_Iv]YOUtSE#] ]&LYh@H/e]禳1bUط+ R6+Set@p]VJe޽kPmɱT]_gp:ʳ?)N!κTyJ[ƍnZv[o=Eav>&=Fkc[xǺN" " " " " " e#@: ;F"%կ_7HWy5k.(]hYr(}~]wߍdfJG?vtiݺu"pFD@Dt Tù[I)[yd'ܹ꫓UOyoAsl .y?qG cǎuқ1B&S HWRQO9*o鶧.K:ލfs :AS hԥKԼysgO"{Cqa#Ev'S>gP>@xaBsWJNd"!et^JdӦجc?]5?U;>ur+~u&޵ }]@a+sn`۵+*a6A0nP)p7:ѣGJ32Gv'JGE@D@D@D@D@D@D@D@rYlZb3jg5Yd y Yf#ёSNuϗ]vY(/!2ZYV^ > M7o=n֢¾`ayoqmpptw@m-9)X;ÕA`@FH5jN_0x`|'`MFQNy%ڞh3˼yФI,Z^O|:y,~!Fw衇:/vuSRxm.E_F8nHU5v?;rJݰ;y!S|sWW r8:|xWV[[o5D' Ecǒ1oϧ*=M6L{UK<auJClFkg=nI*(p^|@$4-bBS@:ЏRZ/BQm&"` xqhC11%ATtAkncM2*Ur\?DۙzNTXsozh ~\XfK5|$1xu&ĚJ 3} 78|>!}n#<Yߘě/o̹spbYYg}͋/:M0ss%ӯbX<˝4ikK`@Q>1ĪG3:)Zn軡T:+sᅬZSf/7 gϞ\ٴpN'pEb^u`ݻwOYm b+M ?cwq8c\ۦ矏-[9B/&5a|b$*҇l)=I5Lf!}*jzV^KիvO,G̱hS5l0׷W}m$qFrhr˜C~_l)Yn\[ 7#w`fwIO};N:e`a(A_eOI{Za`wݝ/3gL})ړRtGuAKP|VID@D@D@D@D@D@D@D@ X䣤㎋D(@^:RJ즭3gΌ$t"f(ȅ^gQ3#իWd6sdgQl&Ҷmɓ#(1H#}̝cu6YQFѵ6TD_ 4g~f$1#MF,Zj"ELzcsؤ[Q=7bH"E'xmuIً@vx9/gGYz'OlJ|7Ԉ +fXK.4m4bFg{6gW&qsݛ6#Yw`89Ms0}7}w=z$b/{@DVedZi#^d}#kYl/RI*DȌ6P95S-AĂG8[+ r܍>:ie@.cǎ-VtkqD"j6_ qACX [[$b?ΕR" "PX8LqsɄ)*>/r#}a~c/q6,X8p+ ۸yg7쳋5+O]5Ξ-(e~\LmsŪ#k}~J'lK?3{eׯ+X~_vוMt*rGU2-A~%wq6z' |>Ges'^T>xo֋pMԧ{HtU8^c٭u~r=]v%[կpU`+0rr)KVif]f_WS{ٛ GF"'~q}kIX}[f=]tqC-q1=m|jt0^ϋՇX@0s|qHn + vә8H3}WnE yhAqhQN~9r""myN _x]>=}#vQ2GΡhOGus}]wV[mw%\S"FN<ĢsK/I^nh(:6ڴid};8| 1 oܱcG :ػ7n}Q04hayh@VZEh\Dc_9p baLh|Ȅx-qDAMv?:aM^1"ހJtJ4nPADX.mc9c9E#4$T%'Q3x ɉAJڷok2y. A2i{%%vd~̠7qxP,?_TҾKNe{ۊe,oXb})m|S|.*Eht}[ Bzk2X,Gf$b,YZ k"(- $n}YlZv:  !V|/|{׻}^2ѻ3c>;5w[] C>͚5NB9H4OkgiҤmգ4nЗ o|g;T.%_n/ɲWh: m_Lam +!0' y$S{0>G+Oi}R0TŒ=$YU> Ziԫ|ׇ&*Sk# )TM[f͚.7 PF nݺ0Cl0g nQ L&o``<9,#,eѹ&sMœqaa=tysnMx/!+, WEċ/M7||f+Wq̬E,:k6E;,^r2Mt&M @1kժUݶErk։GD@D@D@D@D@D@ @v`q,P{;-qgn3ô?j=gdPhѢLD|]+hԨ8c?w,LL8#t ̠}6J7a}xan<?#sɧ06lpfw9A1'|[0RAi=S_?QRCnۜ 7ۯ{`kw͏>ϧ0}=%+0˄>G,O?)'%eOk>-CU> 2E3SׄY?=Yfvt8c\Fu> i: x|a۰ dcڭ/>8~}opwOaJh+WϞ=ԣրN=Ti߾}(mOM|_cn !nD#`uE] %rY(:^ڕE,ZfΜ NbÆ Cڵd.z9!S.]8EG&X1E+iTbFeEk}7ateAca'wg̘qa}i41=rhЀ;`8Am("Laޯ},^XqǏuw$ZJ{O׻vtl/];-M@>0g<(.|(E@bH&D1 P 9`P1`(FPĀ $( 8=5_zvLz鮮zsaNZD@mgϞ͊lJxN,YYfypXVr?Ϙ,o]'s;lA2e` Xղe˒gH^˾߀Rlu}bP[cW3rX{G}-R+~~9sĺ~LCY"rMtOdc~ϓ}@"_5푌-QbޱcƌO hIQF9DwG!9`AN^?f-ƴȖ$IzO@l}ۢSDF۷/Ml^|Eg;F{8dt{t]yRD@D@D@D@D@D@D@DxU\+v%%^zg-t'ӷ~9yC?ˈBtfbD!$sYfxWp!KAǡC:Xs: p9\jV!C2<M2G'F_lY星_wމ=7ҹvKԘ0>S2>n싻 bMg*DD@D@D@D@D@DH\L'O. TՃ"];-c9+o詽t3f0`^z%761gSw,#Ҹ1q%јS*uԾMH6҄ q( 6㍧E{u`+ߥq2ܯyEәN%4M%qN@ 9uѵd[ ~#SyV#1^;R_6:q|ԫOwX9s&b 'P&R9Qhݺ>(=֚6m>?e!GC_  Ԝځ/ 4XOXz[XCX{gmboQ :1xkOC${84~U-w\Y&9X@Fx97n;=1?Ϙ˓=cqxOoϜ߹eTl?jzO7̹N =S%o;'S߳sn` [β8~+K*S}uxO/ 3^JՖ }o;g6R"#ůO=)xLpMvO8${sxu=WF$duLڱzjSG_B?`:쳝0 =_% ˺Cc= NRibI'|S(m=izAI0잟xfmʜ̳)|>ϔ9·LW%\: ,;vjҥK7ǻf~ O/E@D@D@D@D@D@D@D@ @傮*/1pw1&&J:ur_{eM>gy&(y駻h=.3eQN0R7x90V\閑ua11I6IS y{1|L+%FF 6'FāmĈLo[z>#ڳgOoSe2I g_>|xJT1" " " " " " NWw\Kn!w?\rz!x|%ےx, r1';>{NM4ѣ]d}Q7dPϘIp"{6z["Zbm3x S:6Ɯ r[MHٳqE9?xZy0% .aG~w=EVG&ɢ3X)4$%^BMA!e_g҉c{N~~臭B^V[oS)7־ Xľ /q?:=qXn;s=g1{QBCbI:w 0#oĹ w۔eCF+D@D@D@C"SߨA`TaCXMFi( }yq\)db0xvVw UP7^xij8ߒ%Kp„_Rߵ7b᛬ "4Ynj/" N0}qBoT!b.?/C-~s8˓=c4Ɋ# sN6]f*yzlJF3>yxdHbiNqCh4-C)π{w` y\ԩSrmS%w_/9iv^~OG/#)d6?I޽ {ztd͛;Dc~S6x%U8YX.˔ݓWO.WZ|1 =ӭFoyM \/ 8PS>4ufs,p0C@coc-LH{e)n馸ܳAlx3 "xP afO7@ada^7:FE~ +'r8BKN1vDqn&(Xvm$In 'p?p\G}Db}qvadnȻ% pb}.7JCF yNQ:]a"|E#H3O5:PJ6V8g,LؿV11r0`>J޷rn;,h:-vnrN<7L̙>gŠ3Wu]QfM'zG w܇oƒ1^{Ճ,(AexWúhr7nw^}%0UƍqilJ.CrD@D@D@EZn,{U#^v> # 6ii0ZhK.ĕqP~8~cƌqy8:͂ϰ<9;SLqcكݚ[3fHN_FB\nl7ǠJOgh6 ` BgO=庮~~#8b7OC:GF&?Ϙ/E7:眙b;dlΙ'[.m<`^~g"dyS-+6FD/޼uWӾAۢ }^=y{`}S7Lבɯ-AJX7r,zkɻ8/z>7=#$uO=ԳlgGť~i Ͻ;DjiK%wӧO_|Q;{q|w!L-n8* YW' P(9cLrKB{[Tu &Bf2СH>682aKǎ7o^']dmúխ[7dbZR˾kþ$" " A"0iTG))?%ED@D mM!dэCf9ާ9Vp3mn{ZB_~yl3/W_3 ukz &(5;w}${x 2̈5tꩧq]Æ ?,o2Іn2C2cyyVZLKn^#rz9dm0y7.ñQFh*ˌŘ_tmI6v}fx~w?#1 ̸;ԺuiV q|Fw͍q} `2Rw-G!s {^M24`7my! td,p3!̔B~$ˈ-\XH ㎌ %3uJfFmCf>!\?㽆c^^rhgN.! h2礐Q9Mol'R~w#?bsq}H٨2햚Ϸ~۠D 4s:=!c[\afyV6 d5_׊ׇBo\Qg/PdžB{oc c !YxﵴYȔY+=#pvj&Z*Swe *];ZJuz 0n7~kף:*d,b1Ő3xU8`UB*g0quL;gYQO?3J=cxƴ }!mĦB&lJ4F$[UfIp26C&СyM0s%<39=G.>`WdHPՌ~>ξ>;-c ?8{gI_/ UmXf}%oI| m+m58wm7Ss~RICS%ʾg!yҵNvjە6 bߝDv6l&[f|{i=CC6 bv/Rm̱?>潋ɫU=#ҷc|m9mKtLf{ۂ:,K<@N>e &&_AD@D@D@D@D@D@D@D plB-I˙4)3H#Ux.=y,Hꢁ[|&sQݒuIUAo.z\Æ Kի]IUeqM snF&?fP}ngysJHqu5 h#L|f>sL1kߟq]@9w<`p0c A9Ka" " "P{ {A2 Z%#" T 8!WN0SSOur A֍-x~>fHĈ#pWbҥ02)(,;c2]!=ĦWPsT#6t(4s۝[W\Hwt`CtZf8hacncLz,X=hݻ/A){?~mXhhD{+Ff?%RX_axlUoÍ]UW ~;&@СCN3aor2cۢ#?s~sF|727WfA a:aB|]{lk/{{;v,L$O)e֧~:~m9D)>$?(%ۏE+};N:)CAY =Tt˧4|lv81~TM!t')ۘFu{PYLPxk|gntZ&2 .6^V0k0C><*T`UX&<<M4aAnM6֒¨.hoނ 6'QiRbxE6 ,v76d/v[{{ , {r_@A7쳏kfD۞{ d;YiY䑦;}6F._|1$|'|2:vZ!;.LWٞ"m 5(I..ٳqM7X@IDATtK?|n8a;?h> c:8G`+KPA>Ν[1YE@D@D@D@D@D@D@D@D T㺩j"6 mF߿?f͚':A .]i8]K:Ͼ3gc4Hf$z%+(o &D@D@D@D@D@D@D ƍ ]v3xEǔ֭:+).]믿vёB)|nLU믿Ҫ3#fpBNoY.p:J'|JR~tufn:zs?uQNN4+VW_DN9唌8PP,_SڵM}vi''Zz7kUUT:AŔP86[kY-V!̄o)UT'@~7bH/2V98Gl:5 o2;Ia `b`^Ge\"I9tRGuժwm\ˢ#\|h7Cʦ#d?q<&" EJy3gt(6})ɟp E+/{r_֔(I6 :t@*Uy)S%` "m۶u}uTJӘy:{~낭f@  і'mnShml]Oq7puNٵz?bWl[8P嗁瞃dW\ _1f͚ĶZޙwuW=ǤPG@dQ,|fҀr/RI' 87{ENCժAp@`=')YVZ5kUW"衇}6_/%" "{A2rR 9ޟ*N*"0*`/9L>Æ # 7mڴ0*|饗ܘ\00qUW9u jxdĈJtj0tP͒%Ko:ɓ'[li裏N;z-=:'ud:fL5w7ΉF54r蜓駟vN=T;6߫[ĞfM4y{r< ?ĭ\(,aP&PLi=#sۯm<@.n;G~fz( \LeGfiXtK s))V9rd5vvyV,fy*>]/7|ID@D (^x!Z\W\De:AA0_?ݻ7N:$ѣB /w}3{ʕ+.A8)(v=6#zB~L@lA@m-O^U,~Ю"}lӦ PB= fϢo1~A3t`{GC54J vGE&H߈@d_\5,:|8s&Xe?DVB5@'|%hX`դ=E@D@M_br\j)" %PBYe:3~hݺun8QY@Bp,{uY .YPt>3' @&|ϟP@pv{;w1b{?<ǞvAM>(  &LիEg^9mV C_r|%J>N4sn;mPxk|>٨}߭@_Jp3vE5Z< Ak)d4m}%6,vIZ5`_kc 3T}a4ѰDaaj!" #ЪU+g=o<8sdAD"=oҿ}V Ps_~qfM6mVb.2L:+WJ" yG#x=Q⽄C?sxQoi`]Tkg7j% `J"L;v?3\}8qcȐ!:t(ZlL0ju}N}q衇d=N̎ " " " " " " Y"N;yٲepcǎ5#v8CпfMLj&Mr?S|` QJ8{isER f /PzФ֮dRHڡ` l0}:p Äǀ1c " ObK\s݋ǸyJcйM`^P5 o ̚5 >  L0z;%OV}m`ܦMxټyXX:oձ(3ҥKo{ \p]Jh۶-vr.]@5k)"j*v! n_Іcq&MX`N LԳ󿪛T-(6" " " " " " " " "B2%﯒N;ŋA#<|*.h^nᯞ|IM|f͚aذa>|84QX*" "fd-xxZ&"?> abSL?vc:~w}ݘF52u*#%1b`Dp~/z `]` \0u≰)߇ڔ) QaW)@10R|2lxAQbn&" Co.ܹs={9ijo֬Ywy>,~i̟?[n%0nРA~ 9s*LjʅE!#\7mB_%" " " " " " " " H2m,*^<3ng ׯsh/^4Nq<b-VoT\9uM_br\j)" %fB͚5{i8Ct8N5m4+Nf7nB*:;J_|^z%7[o1jժaev^:(0:\r%,y-اodž't1h(E3fe]u^{-zb)CCҒ|[b@Y4skOAloG]v/ƌԤZ.iv퀾}c(D&%`L0ECQ`_ ~6~UR#D@DhpO= u ӧD"jHP5Sz嗝_Ɋ+СCtAΧ~!R2R$#is O`H D9&͜9$~{:` 4pmڴqYf٬(ŋ۽x~ds¯[&6tSgD;/SR)8~UWVmW./,*Z(v" " " " " " " " "d Wۓ?saҤIo Ĉ^(^UTIZv?k׮u)b />zo_U#sr4q@P".]ԉ!u`[z;bvBϞ=x"D E?2/ӧoJoFavsR{EA7o_$) :Qh R~X`3~{we+vK?~/\r%?m۶)yott]vg Ta]&~kv/ 4snlPxk|> L/އQ6$,nX\9M49QMJaA`dD(ذ9 "s`ijFs[o=[8ɹsΡjժڬƔ7ϹqΑ΂}~ Xה;BL%sc߆E") IHodI,tQi2,IaHvU.)gL]ˡ0(fϞ2(~rle=f-,na'" /;wnI潝_ML ΢Pܷcǎ.sN:Ρ:1L!%95>iXiB*" " " " " " " " "GBKHB"cEP~}..sA5d|MRNӐgڴi./_͛7 (ػwo'Y15YE@D@D8u,&u֞" "[AzHDSN57"U梘Sl4@WD$;ɠ~X?j;`wƮ 3I[j8N3|'6s޽wuWvNPRo-܂y9GÇoݦjrwwLDFJyD ~[_(4sK[W~fzhG~ V|sX88[VM  ֮ٲTzYPX[8 =m=D l,:gչD Xlq~x8wI5Ms^{5gKukl/l=zt"1f+Ew}aٲen}>!:m+rUfeN:M0a8P$sfa!\[(B_L[R11[l6lEXoRD 1)m3m3薉7 6\1'XfPk[@cwavcfg?`ϹṈ¨j)" " " " " " " " "M@BDY|-b+%b ;֭&{g "@3'=#ӧ;y"{w3|f'" " & GS׿Z{@n E!40wL p68HF;gnРA*k<%yP|֬Y.`WynLHD*1JժUsuJ' \s J kdȬXnsxe0 B20Mx/^'|?'fc9w9Z'u/nú4oVڳ8 x~ϹA+g3Ǝ{Dqgf6(]@_}ϺR9 l`ذrÒ8x`\`ʔj(:k <0L<蚨@Q%qB?* ,Ν;sΣ7R\ٳ̙3s\y {d9hr ^M4qA}*|ߦxRxW9sL.]*Z,?)I%/q)ZjB3@N޽'x L4 Rb T{T|g3)<<,'O(鐱Cq jԨsR!W=ߦCObO9=2(5>~l[8XQYLx#̡8ۗV#и1,@-.8Cpw_j%{ؘQNbE 0d3^QJz" " =G}=@o9ڮ];m?yN<:|#s}OG-eUÉ?pa8Cpʼ0 I$Kz%4[oN?f<`%J" " Nl~9 %ypUV&7yK'`J<98/<1CΗs^zN"z]`E" S0$!Ͽ>6s'IH Fr魛RxbL<3F?L 7uF-PHv=K~ B}"GF/E.?Zd_)#)^6ml hWЬY3P (}0ݻÞ7߄UXU%8& BEJ_@AdA].U pkK2 )ĉSN^P#cլ j.9A P9qDqG gRH;vD1v ID@D%+&u֞" "[4ě4 8ܞ1 eЙ|o;< zDrcx\}49 ɕ Ffx$\FH@ŽGS38fU$pWwN%UTno>}:^}U3ΞDC1Wҥl׮ ({k$޳LH?rf0;qK @N)9䌴GDϷ A&PLiz_mO o_9FUxmsDqCS b^~9plʆpiaQl#6w)-} @?s"o4 ,\~;0p`PqޜB^: ㏒SPdE%sWץ[Pڋ3+8G)hǹRm2@? O"̜''[,_0ĭSh64N$2r&Ozv$GǍ3}w8y6C%.u0XK"9:̀2G [OΪU z⣍7.#BϼGSRIlv˯mމ@Oω@@d\H5 Xx P!hBH|\2'_9ZV-9 +W BN@#2s)1"!#uz 5(hHBJz# GSZ{@n E!T㟍dad?78 J fjiD{Fџ9p2*2^ 4rlBQ4 =un4G86B&,#2~"SLQ @g6ѽkm* E{N Κ5 u9ys{%yQi-#yoཔL~<;oq9sq_^B޽tSJC =UUR!PLi=r7(5>~_t H qv <:v ,ƧR zLg2pvI\zi̯1MG y&͂t UѣâtlLHf$%_Χpܛ_!D5S<\Kܹ-)9g2*"Qs\9e:} 8Oy(GU^D(3r.#_ĔrC¢d]4;.l`Pn/.Cv;c!y9ZKD!%WOSһ\fM5jɜ;/yX0+nE/y{mxYcacuݺ-" "M9=aDΛ{"l+PAD?OPKf? zqD,~'6|sk? s@^d>蠃9#,Y=]o#أ7L' zNx_klwA" " " "P.D` [o H2R!K@> 0XPhk PH# b,`s;f{YmVD@D@m=DΙ{␜ޜ)͍s͏Gn:$"q~ɛ#&?s'ȹr&`z& tn;)TeS%@$o |W*w zޒ\L1 SfT]Ywy/o%R06ʼq{.ֺ'oQ,`&EH'yιx22s.߻zKsRcq ^L3Fn@" " " " " " " " " s`]o6˼ gH~iCE@D@D@D@D@D@D@D =4`"7k,hm_}`3C Aǎq%SOuy^}U/@&K۵k_SwRЅ y86R aPC)}{^{%#/O%%@GtӳPAiS嗁o<<xu;k$ @aET.&(}%d}y 0^&;":Q(rRK3E"yL`?J0$"[oFV.2hN1X;ID [=vSwY9@oXc J" " " " " " " " " I@By]*%ХK̘1W\q>lL4 wuڷo_-R@nݰ),d?Â[իgȂ+hܰÎ;\0ETɋ*l%L/< qGkF*SN>4v[`X`btV+D@D@D@R&磍7=b|yXz2%jԀ Cz"\r;u_HТEE@fƇ'>8-w`=+ +:@. H2u.AZj Я_?{ܹ3=\' D" T\}qBGȪ" " " " " "~h0ovXβJP~!,\z :"Æi o3K&%V *#ڴ(\taag6 BFH@sN߰8". ErV(=:eEfnStG}CB -E X\S8j<)ط/lVSkE@D@D@D@D@D@D@D@J GÏAūv@ oӧO 7܀??8n6.SՑ ,9M%2(6e6 vW\3` R0Q[ox+93SG@BhKq.$,pQM`8J" " " "  pa9Q;ut;୷~=qf̀ܨPwA kOAw%`2`s>U¢so\k3䊀 sEZr\2F8Æ C=1c`+G:D'ЧO5/)SࠃJ@ " " " " " EFB YRl >8Ń{ M¢E%ZoN9Ei\P ADD )f9'|oPv`㍓D@D@D@D@|S',Mx|̋3f-_^z4wvfCzzJZahBc3}U{HfG \yeJKt@Sm$[߉ AT[D@D@D@D@D@D@D@D@D@[l^{ wy'8 <Ӹ;ЫWmIn/J2/j&" " " " "P.OW_;XO],4@&/wɒ] }X}¢CE(V;hPԑ" " " " `#soyyLSZF͚#7ȦXiV^͛;PnyKq" Lଳ{y8촄k,7aAymyT@~d~^JD@D@D@D@D@D@D@D@D@!PR% 6 }5gu]qqꫯFڵ_D {oL0!P" " " " " "P(٪UV?튿P2гgE ,Zhmg$K:݌c#  Aa^͟&" " " " " " " " " ! !pYD@D@D@D@D@D@D@D@D@D c5kg}'Nȑ# /cmN 2c'QA"I/4OKy뭷N`dÆjsdkOڵՋܪT PpT>CgXVBHi/O`o ?m8"РܡCzXP2^H8'`͚ҲW5( keUy Kcc3Li>" #p)@ Cf5<,BID@D@D@D@D@D@D@D@D x4k ; {vb nnaPgmkSLd>_(MD@D@D@D@DB]={V:i|]b@`π#أ|RT\Yk" 'Ы0{6@~0b#E@D@D@D@@:s։w_~)+l5+V.-R%￞0'ϱ2TVzJ ԭ Ԯ ,ZTMk" #ЭХ 0~|f >ǀ>}U-z0fyRrĈh׮n& 0[J=#3ܱ۹?'7. BKFD?8D`Ŋo}|wuUW x#@d^YKD@D@D@D@D@D@D@D@D Po?83APL8r 6x@qPcsK`]v\`"2=QD@D@D@D@D@D@@gz&:1Q=fM`H`ժp|N޶=T ~;AaΠWCJ@jv +SG)r@0ԯ0oUBE!)yps_-hrˠ<6hr p55ˢ`!#@Ivƌ.(|ڵ)kj"}Vij*" " " "_8 6in"[~ |Qx;dz- Qys AV$[_{Ԑ y&0jTNHH:dٳgða0qDqhٲeΦ"LChذ!M&! w]D@D@D@D@D ~  ;o_>$@K,ٺ5> n tpBX\m}/? AA"1y-8?pYa!ۛn8 cPA" " " " "z-Zs#\T22SDJYJB뗊GyB'[Sl|S(|?x⸼/~0Wz(V,+v@IDATf ) 8Т ]~8餓Pr@Q3GRJիNjQ>sdU@!$_4(Vt+bQ`HcAV5kw._:*6:n0h0s&f$LX x p%(ndLIe@fԬ PDoZXT2Z4}($mW=CjaHO2rXGRsѢ@0 '?o}OԎ" " " " " " " " " M@B}}:޽9e]ѣGG]w݅m) ;N: F`͚H,L}Y4 63*S%P(·je>m7O+=ছ]wZn" " " " "k̛m?,#%pρEe Y:u "9%q BID t*˖{ PDg5D@D@D@D@D@D@D@D@D@B@Aj@ t:\xxq]ws΁g#'о}{4lӦMd1H""@Gq:v1QS'9{8uKU hvڒ>֭;8g J T)(U;E P<†1hp)!h,ڈ@`e5WxyGcљܶd 0kSlUR q둙۽\޷'/.+WKaZGj/ d*" " " " " " " " "xUT&pbС޽;F!k֬x>:J߫W/8S/@G@ӷ2Y c F7iBagvj,b( i(٦ pyiիg*VD@D@D@D@BnݰxPOZ", CrX(&vmiժPcEuR "?K0X>=vR,e5 VZaڴipg⩧wib RkL'`C{+2%((\ ^\ ̚ 8wڒ:G!/ ۔M7;#Gf,U. -N@w_`=kƌ7'**@h<,j)ޞ,_X\n2:K|R]hdaHBnqu~fnh*odBߋ@B0-ZXf4SBGD@D@D@D@D@D@D@D@D 4tˮF+aYkޡ0X_^L"\pp@ÆY>a/!"jBQY8|ਣN gk*1" " " " "3-ZE߲yʕBkdD@?9a:nҒx6*"9}d*iMD+L}o^{ ݺE" " " " " " " " " "P 'f /ĩ~;8jptժUû+!!Q" " " " " EDBtZWB,Aky{Y1w/]Z{.p]UW\Kx3J" yF|x $dN<B^<#" " " " yNy Atd2ȿ Qnɒ ޾|yi X~aqfKy\27hPzD (+Wn}4z+~V$ !HZ4hsO|kpGGLEMCf͚vmA=q~>" " " " " "PB!_+٣GQ^ kEn zÆV@V-"yCI@m7`L;B cTR1uYE@D@D@D@Dp\AP 1,g8'UaHE.^^{--RLE ' -[dUy&B ןW^⯾ []S9\" Yƿg2>wz*3G@@@@r 2gE@@@@R[n:t !6^Nѹ x6{xժUG   G Y3EMfϖ,OÔ/θ;f/\0l"awK˖- Yd职=q&XX"7ºlC0ouo^q Xwo(+o;LsOiX>     A <     UV߯^zSO.좛nI}MSB(>co>]y@@HY %݂ MF]ğ~)l-ۜ9s2ׯ_LP3֭fgSpE߼e [EK,[lyrcհ@I:-r}C W^Jߏzg6;WRN3|lVo5lP7V !\N?]'eaܒ¯{6a%N /H'K\[9R_NA  @Fa/Y-#/}9^tߺ2JJ!kdXp~%u#J?/-qe@@@@HNV      /Ru)'w&gϤ=ԪUKӧO'2^|ڋ  >yD )݂ ?PuWɲ x?o&l~|RfC۵kNnF>v? 7g –[N .  |\jU8u2eݎ;MI&a?Hb/zƌ!2^/o?'vY:\ir#@@HU2wԼytLPȷV?/2~ Θ=ċ]pM"~} #wѢH<V =JPr      H      lV[tqijѢq68ѹlt~&   -V&}d4Ml2 矇.ڵk 5k# xu裥oF/ xp /   KjW[ioUkf}f͚*VZ5lRڵ >XgS LN:͝3X,f髯 a~;nY&N 쳏Zn-mڴi/@bհHc|C @ xR~EK/nY>\:d)  Ν x[-E[v\Z?߁zHznͺHzm ;:5Z8뮓z~T~i    E!@dQ(s @@@@@ ʕ+#G{߿QnA/Дc=t꯿RŊց#  @ ,Z$լ^3Y_4[|r{aPATzuݻkwѠA$Plyߺt^3g ̘1#x;6Czx/JҾ}{u!tQ$AnW$@ժQ9HW\!vt e ${?  /!7@INƍ-7Z7zҤ 70!-ai'+WJ~(볌F>}-@@@@GZP@@@@@ ZliӦ$t駟!TZju3Kw} 켜@@HU+Yj[0yh;r:ڵk_oׯ_]v%~j׮MYݔ(Svm7!?ZO:U7t.U\Y￿>`z+7ըG{%kV "byl(i0gOi=QΝ\@@? (-+5jm]BXd<$o'o.P|=ݺusSG*Y2+x" X<0]e )'R     $AQo@@@@@ JۈeGk{ua*W\Ԑ*;`UCXAE)ϵ@@@ Q/4IM=<uk ,[L^|EZ|yzl)T^x:t蠚5kƥ9g1 x8>Z̜9S'N;C#FsϕCq֭[,UTC/ C T7(@ U<[e+rԶmk@@F ? mKCn+5lm" 4iCXd,aK*xBYü&@@@@$n     l$R.{=~2d{9" p#b=AiX  l"hԾ&yH{|O𿒖4w誫R.]B`^%@fguiƏ^zIcƌQC d^ԱcG{ ҵIc-3' i 쾻҇yN\~t  $͛/aom]￳PBp/:J<,2 5#e $ ⬜@@@@]     P %l:K]v@ޒ/kij $<rJ   i(AjO]{u-ozK{74vWT)vazt衇RJ[~ΐh۶mFٳgEIƍ>XuQ>}ԯ_?5mڴ@m;$rSP{9Ha6m_>@>\: ipH   bd뗨Jm& +"vl0ڲ5Q(ܹn=.ǖ.ptQ(dpHl`CX$ ^w1Q0/KuhG@@@@ 2{A@@@@ mf6Cxý&o8$<oڵkU4C$Gu@@@` ,0LM #}|%K 6}ݧ>%65lh;PzGCu]gdkРA֭SqtҷJMq H @ 컯,Y:5 _A68h.  @x#L/(WNahJVE?D3G GoPHOgUaEv>Pg-k      P,XOΆ     }!:K:u)oQUV(7o5k~PӦMS4 @@X`R -2Tyj֬YSOU r8 /P2tаM<9x≪].ffEGǕA\.-N@<㭷)S@:v!"@@RG^-g"($@ ;G[vZ" 4(rlpӿptjYDzhmTSKJK>ꭥ}     PA:D@@@@DN:zg3k;CݺuKkffTdI}AO@@HkE[d{͛#F衇 ywW^*SLN"%`z}7jԨyiلX/;t5='j s9G}{å]ƍg}>}7BL_ guY}شiS>c~O|/- C`<rh[N:C"m(   I/P^ l"PԲԵt"(>*M$d]W~Zo=dc6ml5 8Di8<`1ыMmZD֧-{nט!    @ N֊So@@@@@fmW^8pve|ݻwr5*мys}W   @* ,\(y ZjԪ2{xԺuğd\RvY^ɒahzk 6Lgy.첰XIW~wV\=K݋މ~2ekZ }W:U+vСu  [.P4oޖ3 lhk-ϏR΍n̉n_=VbEAɿP!w^|q^cJ]/WD@@@@ M~Lf"    "p!/%\>}']we{md/%%Zh~:%B#@@@ ,Z$ը>F}_jCW_}jѪZj E PZ=SN }Qu)OW0 >I=݋Aw+~N];ixO@Ȟ=w&eҤI2dv}w-XV;թS'q.⢯H!\3Fs p2K'˥)#-=d/} 2 gM~Q= `K/R@`@rN ^۲&PoUqm*G@R˖ґG!k\2Egi((rTd͢KZ&H]VMvE_-DpQĉ?ݠߪ[m%$'"(H?c:;Z| T :4sŶg͚@@@ 2[@d4> yW_>L0`OA@@@H ꫯ˖- _}~}]uASmd+j,Y$?s<ퟬ;*URPo@@(/]pΝhga,kcHN<0qmmOEP|68&6i=O#/7߬+mvs=}'w!Hr)Gy$צע ;x} P@| xM7E!' 䕶^:4E @ 0_Ȩ$@zҊdhιgZE9"]l8{m[ /l=_駲~K|F٘%Yt-RRݺO?I{xNR R:Q_wfQ8ҥ9DZ`FOϙ31yPgV% ᭷ҾZ~{X4]v4I^SN   E)@dQjs-RT;8:蠌AM4gp}|^$?B    ZҌ3„aÆM6aaDnlp]~j.뮻TM?΋ʥ%4l0ǥr;i   Y kH?fN0AǏW}Oy*r ȁ7\\r߿'h1AG aċ.(,-+ -v+l"i6)fPvUjRzvJlY& PժI^Bxےoy4iR_"l6@ ]]jz;bĈsrٿpXQ@ԩVriXwҪU05=JUȂؤkem1DzXFI' .4}U@4 P>xa3_eٳgX(K. +o?7   +@Z}1qDWFGgATjժ\rAs    @ҥC䧶D 6xvB柲QFa-!@V*HZ RAթym𴍞   i"paA~dهjb0KzR^ 7kRIsΕjؕeȐ!j޼.\[ٷ\wN<rn MC"P _o~8 ~(H*E@`@,<i(P^h.sKN8[.Ds, $ P5kƥIG-ka1#ˣ͙Gƍ%2 }+rHV[I5jHu>[i8_~l $@ɒ%[AzJ9کqj!|>쳌ǹ   %Z#O뵣ã>ol*ޥKwq>k YSQFmT_]OH_U{I'ŋղEkm -?~["o֭ު/2L9ZlO>Y]tQF@uw z(Uz3dUOӧOWJۇ-i^xA-V_拂    Ph͚5Ӕ)SBСCmgC?>Shω=¼x|fe׷P5m_E    .IkGkg̐lȆ-q{x-[&L".>DŽduDl2+z/篺*թSG?.0FD:Ä;?׈#f 80c,KNch6m 6,ß|169<9}[}eҤIOWRدJ klag^=zaT?_@qX7F x_ S źі],Ms{ ޗC|-]~끒Ȼ/.3 {Yg/e`tm1?'4h֭E|5kc-YDQRƏNBj8_|Q{?    ^$EzZR^;TB2z'h|л7=7i$8OGyF&~y{Т=w}Àn cǎ > ?Ac z؀wR@@@@ W'{0_|mVm۶ }?W^8g>1,Rjհpk?>#qᘰc A}] !  |Ulx,y^{>WŊd!>㏇Ǒ#G>wƓx8aΝÄ+W*}l&o>}XO>$oڴi>qKnchNK'v=Ls/9ͭ>oj}>.x'>r2u԰o-oE0q0nݺIMY_r!6z+9^ƿmW[`7RI@|]qdB%˥Qh̜Y @ A@ r;7z2*U~1Ĉ\>9in\ʯvڅ>}lժ=\-_<<;gϞ=&5'P(.~ŋe߫uPgz8g)[Gdݥ! fϖe lmdoQYpd]^b},Nb_C%-ߕ/w?>||硋F<#aN;~뭷iF;Yss<9֊\j*s8@@@T FAqJMb˗r)5hŘ ^1h)S}l0|lݺu93<6z ?8 w [GfcB[yl|3>`ƾ^D[pax:sc5k֌-[,c لٳ6 c駱RJŬ593 l7Ӗ7|ͽ){A J'&  YbBb\P 6mZ7z3]V)~ǂ-y @ۢq*+Ji|?,]/UVW5+eX>Z#bE,6fL,N1pΘ_8u& @2 0_ c@2c+#йsY彿(Org4"/s3*q)ʘK ?Kc6_˭ 2*AsO.%}gb/~{,vűX^XvX16l.vX>M{o,6aB,fݶ+\-qi;s}>œg Wxǜ;YҚ5k_IJ*=gt_l-(; ϙU.s=q   i&P:( [1y־Zmڴy w _[cWxhB%KF?jyiŊzv-w~]/6=r~oO=TYHzǬ]V?px,ufS\~Wҳ6e^NӢEl-[zˊ Fu:j3x}%<     @ ؂%믵n'ai|h 0]wݕ]V)~L~w)R@Ew- Ԯq/1UMDŽx*T*ٴiӌ.yI~uY- n?_>c /14~>}hԩzW[s?y/q@6wZx߄-|*[ V [6}܍-* OGfXd8-n3>~-4'쐠uT3 Z"V[I+W -ՠAҷJ/$)vԤtͲ Ҟ@ _`@0ֽb󢤼jUvsil:AZi֬YzB{/l0&^Mr)~EFnM(oO{p:3k\2E3'ꋟ=[ճ`rK+~5c=W&MYpIn6HVˁнޫf.׷|V?硍}r; 3}رc>;oov ~+sƌ    $|qلA?~|ڵk1he(_vqnjR6pDj 2'۶mڍu   >KZm*F}Bifn/8$rtW(O>F&{c?nĉobH GK^676gwylٲZl{olRzh?O zW|6lh]e%1<խO _T6 -哳3er;,w S%1$ j ~J'|[  P`@q>(@IDATA|06%]es˜~ m׵^}^|E1FY6os)~E(BJ{O~hB#9Iok駥 d EGP. }o8osKA ~7VW>GksH;#?a2>.w>҃*nKk_Ȍ   )P2=M@ /%K M%22kx4ޱ@.w+|6)wVCI>u$O`&p a^{i<UR_UI{FTH^8$:  @b ,Z$mTBb֯ kij}V|Wc?wq(/R;?ކ5kyC;>ս{?OAs>3<.]ؤ!\iӦ]j+K :zeR@r`rx{d#!i͙w%sZY/6^Z>ʔ)cdžEWs[#ʆ(4F6C 6`Whq뮓z* WߊfvtԨ4wngH([XT,8V:8颋^~Y6RߝZ'Syy׬gΟU$y C#3ss/SNͼFs}7{lu-֚s{d2߿Q4o|{[j!8裏 /0 @?_jc=VZ^xA-[ :4N/-    @1 T^]y"ꁖ+WΨ>6&~.L>/1^ϓ1Y|Woq>3ʕ+í//nq1DŽ~K/T_}U'1y3l-_[GW6LѾ/vGѢ 6-SmD+tQȤOIa8pC$F6f\ ͐"Uki>v?*o.^8>ש`v-of'|>[77lsYlYFJ.{3<ӧ_ !n8qM0~C>^'mDٍ?_W_}ug|9Hm<R;o  Pwb=K2,YFG6.5Y3wu> P3_߈T$ZβM_s?>=:cUvs|/Ϩ~<^%~}V ˜|}#PukSe‚ydwy    X#/P^oQbMo߾1 WYb:3cŬS4lw^lҤIwц*f*nؘ1cbw:ZcaaTƬ4feʔ N/;klv?#,1eNرqb6<ǪVYgҥKl1|{ckg~y睍  A`8.ke/O  PP;7Q@ P6=v=dB֭ck׎ַUu*k]X.u@X6syٔi A ԟ߫~t~&r }t*OK2 W}}QGIz0QrM؋]{a?ǦMƥ׾p1 nܨ:>Nd=9Yzu&ʕ+}> /sci9_+/9Ǐ饗bM6 /UTЈ-Z(/XFc}lb&3Zhc,3/gXe&;lq?jԨcf>q1ΑF}.͹r4uΕcРA;5kC6k k$`S"c.槵bsbSb64}iءl.j,VR7uXVXlc63騱[nŞ>Xl4Ǥy߅SbŊw+6/ꟓԬY3ֲe0g?1bDg}g)rHUV1 ٢X_3e~:vh    @Z C8+ҳgtq |O~zzҥ/e:q6 WZM?3+ju-~5jdvZ[ejeX.lWϗJvdLa W  @O?-WFIG)^Eڀ.y?U^S-j*ϾVP'J <3ak Đc}" "1J{N:i@ ԟ߫|pt~ (pJ;,uW,OqWd_Qq衇Ԅ d`l:e6fzK[Posof.)|<m/5sLⳲEYVX!￙5k,S_}lq\lnrرce jȑKrFXTtgoTa/vE Eo. D$YGl誎wɼ^lϨ?#g2ȭ+^̹} +~]n(h7ސ}J*vXAUߤ9sd?-}lѢ gTI6Us3mmsbÙYyϙ3 \‚e\şsYuoR Bj…_&WK@@@HG UA`Ӂy8]@@14oTV' PP\ 1cN9唰Ǖ6 sjq_;c!ī!5BCƭۀu բ%JiZXϛ.g͛KݻK_^W-k~z6eJ믿l~^C"=<ҳʕ+jrR@@@@ \t"@\tʴN;e˖}Z·    P@{>c]}2dƍ_=c />t KjtAmYF>{ʬYԸqĮ,C@(  Ik'f Vg7ogX^z%]veѣѣGjժy;AaM6ͱ*Tܞ,kdúua-ZPRG魷 O,,X^{M:u\|0cOS'߇'o%m8@I'E̙Bx4|,X_:04ġ Vf@><@: ԪbUo]O!P46T^yhU6_Vyh,Ko9}zʕё>?PM  deuKd=|uҺըQC;vp<   $AIQ]R>TϞ=IuAi̘1IUg*   @['YmfV4t :ꨣ{J=HRzuUTIgNf6@v,tj. f ]+-]*ժY'A?:+U.YFC9D'|r95jT( xoY}!;#.Z⡋^{ڴiy"%z]w |P-哕m zꖞ-y6{> (ЬtM5H='ws(rC(;&c˨3 r6b@><@: 4l‚3*7A[%_aBV.\8Pa¿W(\H~hk.k-YuPoKsm94fͬ'h%l@~T,۷ɓSi @@@r 2B w\h&)h;    @ 4o\nf 6L<Ǝ+cOF_дݷ->gΜm? G@@XXTvj5k=;o?}e'-H,r-6ru-L9"TV^mX eŊoh ?|,x,R/^Agkۂ< @+'mf>C|0 ! 5Tbԏ"-|| Nuq#1}u:"|w)-_.]zi՝o@o٭rlA(҃!㛯l `~}tm uR6ݻwW۶mc'Nâx16#@@@@XV_*     P%mY;O 6m袋.*_=eW!yݶn;͟??G+ ,D@@ .A~* 6<ˇ^[VϞ=?y'娤(a-6{wС6iw{vm}7hd8(%PNŃ .MVHuF+!^}5 _S' :5h  @NK!@q tҙgJjwm~ldIäOx Ӳmq?H#~tqq}N9Ed">p,PH-*߉ԫG]K0az5J￿~k(-B@@@ 2m^j     7 oN[{nI& gڴig}/;EAN@\ -7  @:Aڟ*Uj4}O}ڵkڤ6l̙e'h2 Le`HwH"l+|Cj,}ii 頃w"mdm+맖 Kz5o1~|s=W3f̰V   $AIQe@@@@@-z+ovUO6R?2fxn:=xjS 7k@ Gد/  $ERrR* XҧJ{Qp'lԨQXaܹ!?ֹsg=a^]3?QFY8W?~x?O}VbBYSw_ 2 wr@ g ϤO>9DFYԥQ D*6@@H~( x!]t9-GAJڌxc^%>8I?H`ϗ; %H'7*Uޟ{%{ty-D}lYA:0}L/:ֿi /HK/, .[Z*UJ:Uj[賘m }w !!hr┧s˖-nAo|]wU&L   @эn,r}@@@@@eKtwIg}?p[7|Wq]򑚔< x6uժUPBcG@  7p@D3AKҊw󿹻t6ӓO>O<1=fCv5<;6 ֭[iӦ<^ٲ۬Yf3dGeg;LqztҌEE{]>S( @ X΀=6?.=tRFQ8d>RiGC@@REzk @ l̗tuErT\YTmY;͙#[oU+qA@@B-sJ"SOvIE`MYn$ڲ?D6 [i„(xH_A(҃!}uS?%P_ ?O}QYq    A&@%@@@@@Ek׮ /Px q>}Zn(Lz4/EŢʕ,j AT.٬T|ѷ'$_zw+l_}Nm۶ AE_SXPLOM7u԰M2E rʡfĈ:C;% <&/ ^NzO.^@5AT (*k7ߔ~X:|s$ᡐer努F\@@oy D`i$̜JM`2ed$E[Vz~E4(ҿ1^&:ҿOYpd^:~o߾jӦJ]p*6<   ,@wf1\@@@@@ T"ի `aʹz xMժUKJ K lex @ ] ܳ/S =(*xo^/_{/l8vXy`5^{g|}HI8O}QZZ9x`u!Hb9>i1jeu{$b ̒@ k\]D۟J='=Գ,X]:$Y0TDj  .Xw0C7iiN6-鯿nFΙ#Zᐙ5ʖ u ¢b7jÆ ӫjuq*IM@@@@HQT     @ǎ_hȐ![m#ܹ5jT IK*hѢlF@ I @T@,<v,H>,DhMv6*k6mZ;+P-[Eak޼|sP _ fK͛J_~eí>٢ڴnZvZ9J$:H04at≅[W[WzhӦk@TI'~Ez G`%Nv-1O@@6+̢ @ :3G,,C},]ޟ[۶Y?`ȟ>~ \}n}Pw/5QxE1{oӠ㾨   lA[L @@@@@RYbŊ[l ߿vuW5J 6@ZU@Aވg@(.=xqjAzqťVPA۷[e˖O? N2E{o}j[g&M¶N;q[%OlK`Y~njӷ~+]Ck֬B:3ժUYL|]+wzhoGdiZNȯ uCE??,#9Bz0~'F;<aD1@@T^=٢> PL"=laC |3'-Yq@d<0嗣?G?G}ϱ}Y$ 1c.btIz*{wjm)s@@@@ ' s9@@@@@_`' /PO=~5k \@\bh si@A`Riݺ6 z TZU;v [a|M6s0σ z6)q5h@mvۍt$,_h;w~Ys V |v;:t?jڴMEOsgҡQ'2}^mZ)W_-]ucIGKCJB!Y2@@ <r irJUA ƍ--sDA"QCmg9aBNjwdz]˗ ~ׯvm7=C:@@@( "    $@ٲeu嗫{:S{hذaaҥr5%2;G&`9E7/B@(.VvQ^hA}RC%?V;Sغvʕ+O?H8oSN^treCִ YZo=ZXbؼ5z/ +XmoRK:?`zz!{キMl7nnK*UKux}ԢEBUP*co~)SsR@ -Jڵ1c7ސ\"s?^:hr   @B ^#2_N7ek;Ίm] $w`R?H$II"PHVQ (Pz L xU #("AE@d:ۻ;lsyj;LwWկg{f̕V" l.Qp CrV42'B(N?3c[wasGID@D@D@D@D@D@D@bA@^2E@D@D@D@D@D@D@D@D@D@@1sL ܻ^u@ 0ũz9Tmv!WHP$mޜr*Bi3m>_u 0O[oeDR5 AFJ 1iw 7p6mAYaH6(MRvhMD@D [Q3̟{:? ~!3V\4‹njN1={R ;nV SF˖#z!|BD}F/2&ݒQKm_~ ~{xWYXFl}uT >w}7{=+Fe 8j;%yTD:@D@2% @Ѿپ}E=K,isN4JtN, sF3ЉB ] T親q" "3_e С̻Х peqwbvTzoVE@N?`ـ^4 8P $ E֫P޵+H$E#)II>W\Kj'jiF .xQhܸ}vj)" " " " " " " "pHauE@D@D@D@D@D@D@D@D@D@D En&o}g~'@QZ&y:}v3 " Hrjd9>;!" " &aP\K.N=5vuH)yqd~=ر{YmDM!H~GBE@D z^^ 3x]`H ɣkWOLWc"[]]D@D@D@ ׬I֫"Y[yWC}G\]]D )rtH BR2%5xvq`'IH/W x'Lu&E-x !x @ T\1Fn 'NĈ#Ю]@/(U=u.dy" "p< }," " 1$qc χjՊ!$/zbv$NŊԩObd6 |TuH@UyyٲQÁ=QJID@D@D@D LVtK`:Oј[!~>`paPdݺ^N3{7>o 6mJ9(IqH.B,KID@D@D@D@D@D@D@F@BG#E@D@D@D@D@D@D@D@D@D@D z?r .\s5&Jspټ\-!Ȅj@8!cQT@(Iq& ARJ!@!H qƆ}Jm 6 p]1~S&tiO5d PG_|T lL}PE@D@D@"KW}2tuH? Fe<Ij@|lB])+VxSxlIiǧt<ؔc&" " " " " " "d^- ewѣGuK/]FrϪV" "d޼qY=UJD@D@ 4._~ne%BMUnjPr RrɒHh@ PL)|3?/Qh '" " "L+kmjD?d cZaÀ F Td@")x9;wzi"'M"nM9\9ZbGBR՚@p H2V-:uB֭1p@t A3V˗E Km[1Fh""  !@F5BD@D (I'ںo׮j׎$ܹ@&O[Ah " # y;E!ǎ( y 0^nȓ'xWD@D@D@D *Uv (Q"%"L+V#G_\|1@ f{*"Pd-@k۷{B|LO?^RҟO<ۮRE@H27QMo%K4#ѣGus=k&+.\  TH:L[$ÇM<'rIGի)ņ%^jŦ|<8` Ayldž"" "~"`~QOr8OaZy-[uE ʕY#!ȠS#r>#ͮzȕ+@(^hˡm'IqH'{dPd ( FR(Ҙl*$ A&MRE@D@D@D@D@D@D@D@D@D@A<_~ދ믿o6FUTR̄>:}7ofG3hO\hʡHRl,Z/GoҢwv5 Ap!ШQNEB>0`'Ia_YtD!>T('" " "*UZ`*%3 ]B`0oF;w&$5sP nҊDrk܃?("Khc" " " " " " "k*P"vM]}m S@=Z"E^_^z!O_~&J ̈́fmwes~\.Z}cǎ8j5AD@"GA2c]YD@D@rB`Fﬠ A8(^R%'ttN8,^ Ԩ!p5Z~:ֵ|'о AFJpxC;(- tBnpD /iº@(Q(V XҚ5^01 A:JFNv? X3{++A!0a+U|/ h4(-U;D@D X(|gu"j$`jcD" DΟ=" " " " 3@IDAT" " "{E " y'g,IB7}mD@D@D@D@D@D@D@D@D (9k, :?0Ǝƃ3J7oƞ={PVqks9SN="ik[D@D = Ag=" " "6lʖ䉇ڄ \|q+f,n5k&@QOknkv_ID@D re(d@&ڵ  &J" H+=q3ڴs}"L`^[ G͚w<." Y%9O Z3l,/Y^(r|࣏kSIJN< ,Q"GD@D@D@D@D@D@ Ϋ"UW_|fox@d˗׿qtgp hܸq? ,nj3@QxKÔ)S2CU8*CO@ظ(W.*ƪlP^0^TUji:8 ~Ҥ8`֨m̸Pz.ˈ%UL=a.]…=Q /$ $VSE@"F "r-B>HLOc[;w 7?zjbK> ^s<9T2&)ᅦ =2Sɒ"9@Hf^cKJ" " " " " " ",*,wZ`yF Q,ZF믿K/{&Lȑ#ьj'b̘18cpcذaY^r%(S ϐu*i,<̐i@jLC[" " "/,uvcb͵k'_ۃb<,_hP[ $ܻ@z*a6}e˖[e< x!c}MƋGT6 ,xx͘TgیBJ" " G'Q,_>~ΚPX1@ᤚk-ZwPtKB3h:~ۚ. PDRH>*{y&6y8gO[ݺ́%J$XbE@"rE@FP!a{z+RW/^m@|_x&[ٺ{V{ns {jHEV@rv,pBjqH'eŊV)@P)S@VcǦ/΅LID@D@D@D@D@D@yrĪj+" >UVg}fo~!ԩc GРAdo(p 2dHQBJ" " Y# !ȬqQ" " "m6RS 㬋Q)gGTUAY$fh~ƌlѡ" " %P,L+/'ڶD!^؁aqD@qt3T&pM;vno5 zD Phk4`d  g w'xkp5W-QyŊ3=={= jӦd@a3(z}@D@D@@2@^^޶ &0nз/л7p9(dN'5WD@QbD@Of=y<6ژBU7_ L@ap)n0HСd 8UYD@D ipl37q/Peo)m !,U*GD@D@D@D@D@D@"I@Bk@eo UOO v3U](^8V\c9Jվ:]{ixMQׯ1$7$֟$Xꦥ+5TD@D@D Йh&|`B[m*:a+@&ajS4o ̝ yf#OD@D , \}w>Vছ<].]Ν?6/*UD nxA!sz+@ PqO&;~ T w^pŚ>UUPccfMzȟ~X.׫1!]V-zj>h(" " " " " "V]TW#Gԟܧ$" " " " " " " " "[vt"V0a^xJO8I;vDҥe[p@4nC5|X>,3Mh:D0]UD@J@Bj@Bظѫ~ ,J0_PZ&Fu)8 ՒN#ԧ'" "  )t>~ؠ1Ǿ85rrz`toyޘˉ' qRc9sD@D@D(MoPiqSjwwVH$CҥC]]D@D@D@D@D@D@N*@j=z=㺒@ck3f`ڴi2e ̙F,0$#lقݻ/4a,[jeߍJ" " " !l" " "6xbAtơaaT`t/8)ȩ<vm/ ;`D@D@D 7 ڷ2e< p=@@׮(d:)I@r@rgRD : 1k":e&r%0`^=g^}T~w y{=N޵u@dwj>vڵ)N(r`D3ckSb5y]Xt7nɥ[wtӷ~ƻ?u'r\Ѝr.AeBRc=nsIn KnqT@!"  @@B pTE#q#P,(%KZ׮Dj8uet~mhԫ='*;NK.kaPy̼P'ɸTg:^֭[úuV<۶ms}n…I/8<+Y$J*&ʕCŊ|^RRE@m/V%-6]:???'-+Ŋ0jT_#VbDpGw>X~ >pv\םU%m4rNf1O? <7dbf6o)8{6=P8д)p@˖gEfz)}(" " "8\:+}BN --F#O*U/ֲJ}&ڍ3Ӯِ}0Kؗ(}*7Zw-}rK\?n-igLs.y $" " " "  !hPVqCC:8ܹ39=:nݿtZGPȲNgN;Seډ:~&>.yۭst;zժömׁqt\:n46>r);ηfp0|3wz" " " !@!H ddցlZ4tq S]U4(itxt)Pf6ON9<+" "0Y4{s~[~^B F9 U:u9K.i_$"8GgRL}\w"#N`m;,#3(;diy/<8P-Y'׬9i6 M`ed',羜$} }~?>6ͼ'AK ] Mݺ=a' 4dg<{=-󂅜|2Ьp@\RԖ_N:ˡGh'_;vxg񽁂~5av c-jPvXWNzNvڎ36qKv]Gܿ&91&ݺwnb٭&B]qvv밻m~fؤP67QqQٰaGL'+?hiǥz5֭[jN@Iy;~txf$),XzmBiv zfs;x͛-c5ƉBRO˚]XX%-*XtĔYgV"Bлw.R[zHPϙ|!H 3>37LHtv?,/?<0s&0~<CxN]zM=anlW|g6"QrVH8_uQ:(E46J]thdRJY;R.͐2[ NRtO>ϛ8,_~}41dM6KEID ~Չyq< tY\:%>O.6>7w\b]p~X/geFu:u"um_9_,E*{_:+a8[ iS1MⒿ!%S8 qK׉uw曁O? #FtH1O?[IgOL/˼$=;WN9`t bwg^DR FVp۸,{g2݅'+sٍ~^ܿ![|w;[:B9;qٜ8]?E"_2?N(AM[~ hc2m>}gj( }uQu>d'5TvR7)!0Ψ_X4 p;sv묪BvXq IJ.II7I˴wߙK'9*:dg>TgN=;"}" " " " " " " "=4С#;vTcE4385FFrKqcH+M HcMɂv%ǻyi5o޼#<ޟx(Ia *N8WɄ`vc." ~N-E@D@D yϏ}=]ӝ5 7p^o*Vp^U׊'(=zS_ A?W@῾(" " Nf^:q0$9(d̈G&OI&ooFsUVT:uln8s>!B$ݨ`-4 sū|ЊC֬Yӈm9D@rGpj??v)6q 8!>m>{X|B-9oOdL&>g\%ҿ)Y]NJ£Qq롄T(JC*N9{b*n?&6qbO<{]-$?<ҥxQID@D@D@Bl3H9YZ(B?L_.CQj'>34a_?\{~x``WѹGh@h ֹtx⻻{u*UaÆ׉]֭s6r;NK]_}H$b6?SW?i;} اM˴MwQgn@dݳט'~W/1.6qb/'Uu@)(CԮmv cマj)#FQvy'bŊT⩜M8%9.qWRq LǦUFes%::9̧vtnq:S)'.Ā2pˉ~r]ĉu4rN}t;X1sOID y q@{r"`^ѠAltFl#r^=Fɍ{T(+e?$| cyTOgx ' Ia矇qtu1[o66/ݻwǙg&MlٲѫPJ/#W`ٳgc̙2e ^u+lIvڙ.8ӏHfovnI_BNΉܦ/ҿM*©0 3rJ+m'B+1J/˗R9aHo.mxgG6Fw VY<928@E@D@D@D B:nRmn*}!4u6N2"M Ei3h34O=u[;~Oh<޽ gڑ&e$p|Ǭfl4mԾ;A?J @a& ?[q_~m\?[BeJ*/S" " " " ' !3 8!N;.[2qegN`Й/Dֹr WG%\yNR:U. r#A8Vy(K*9dGKw -E@D@D@D@D@D@D@D h8ʠ ^t)y84С_-6׹tPJ4}g,q90BnN*?w9*9O>َϻ& ANj@oqT0Uem>M.d oL9LBToc;ǸD@t^[@r; x/c tBn i %; 3f Ǝkq^CF~6_< !F}6?cHԩS$=s_KѨQ 4[mThW@?- Ky>59|MU^=A'Z J"Tc#3jf7ڵ]91[_bFOn4;I *|~9YzWo|Y?%" " " "mk{90_,۳fR{xg11P(hq9?93&v#Eat)#wǎvvi3m{ oOae"Pܒ i]Ԟw9+Bn|c{/g5kր"(O?^>(D][KiBθ%Y|)9HdNϗ '2|agDIs"щ>r CvZD@Oy1g51#'%0$.E_<FLtbgY)vc7AV5И{Xp͋-ܸ )L'5j1Sr\$o޼nO@tTpgP!Dqʖ+:f 27vmԩct_~B]" qF J2#" "KvcFdLWɱttU+5P ژ(#cWFǎ޼y0cW," " wa|8~'+صkWt M4Hιv4/Æ ٳm`4 b>F+ŊKB>?S`8?LFcKrD囤vF})DaV]k7aM;#p\lЗ)"0>84ir#T1xD@D@D@D , iˮћK'R -Ie^;׸_<pC!d,pBN?{(|t~Q_I@…XcueeW7JL>̎g8A|^O6v d c}$" " " !L(y3J?WLpB(݋6'{KK(;EBnuN(gZID@ ۷Gp*iRI3A- C2s^Hp06FNjXօE?&" ЀgXD@G`EG>RLF94R3 ܒJ"ohlù{_J*SN9:5lf%"p0N&VU[' *hW]p~E2V|_|`|MU`s"RD.ze0dbV/`l+#E0f3M&M5'0vC?춪u" " !)Fm<8ԒСC1zhAnF4o )0gV̛3BHys(n- T!\iNJύjFhݒE<-D@D@D@D q p.̘丛n6j/r]z }>},X`3hW˼a{e|8KfA`柔co&(I_qg"-1S0R]Q+E@D@D@"C@B֫2*w%')yE1h~;q6'\FSHIN4rC:qy>8QɁ23I\!wHi9q=֑" "].o&F-̙Yf٘;w`= Néj (WN*T(ޚ@p^_~l\RƮ]\Bݺuq駣I&hڴMP$oNZ*H@_? AF+,5>K2~#=}6JZY c;Lj9 p^|1'')L3>`WuE@D@D0̙@b@(/ 'dS@!t19vdhcL|HmuqG?RL j׎I*4(9r$@>S?x]a Tm:clb[2jj@J['>V^m;h̯VZuGSN9^6̴+˽y\T6s`<߶ň-3<;Mܹ~09&B QSm1w\L8O>$'A!Hz4of EE@D@D@Fq#tJy᧟~?laKd%Q"DH=F" qM>gH|2#or[ؾ}=xc- 4hN;>gLMKS" " " " " " "-rڴiOlasҥ@ݝwi zZ[f:)dk֬i3v܉SNsÆ 4|3D@KB]*MD@D@2#@!ȲeI<.M_X)F(>݃݀(K!H3eI`\\x~[BQFD@D@"HB/@QHS/+ڷD!ͰD!#xҴoh!{E%|8uWcǎV 6駟\QxRID@D@D@ c3ثci ۠vc#^3U3~f%x'PX#BάYl>|Oe3ϴ :)@2d672Jٳ1gp"0Sdv#2'-NID@D k((t:tHuڹJvL:S<g&MX BB [ Ǐg}&+#? 5P@-Zm۶WEX?s書{GΝѥKuY֙*|5ЕD@B0ӎ FD@D@D F6lʕQ,v2{ZKgJƴ"S >cVh$K/8S" " EnM0s[125( IQ /(dоGF>}}O?$q` k>mnԨFa8#T.G:_PErA- d:[*" %@[ ;2m=P.ܹsb׮]O[7nMg(Thؼy3 k>fL7#y_lI7E֭8CjB)Ce@Pܑobo駟1|`\p(@ d4wx۶mom1cDx!Tׯ8̗J )DuٙwBD%y餾gkFh%KS1Fz#>P/oaV…  mf+V~h/ҥK.UW]eDf*I )$" " "6n @JlbX@eG7MaP{GؔetYP*I26w@D@ٲ);PrX{wV)U)A >|wuy 4"K0ї{﵂|ꩧ0F|t~OmQ_e}զMwgf͚.Qi"  B|N2Da~ s̱}뭷U% $VZj&M@ݩZ@ =޳}?{.yd~`D O1e0+$2eʠcǎ6;wcB'OkJ*ԩ:wl")n$" " " A#,QF::u*K6!9]F +$v Ik; }w ˻HBFwUID@D@D NUü+Ő ??PQ'`|Q/6&R+Q``lvbR *" " Q%PЯ7lD!*vVWkW!pA\s57n.y0ɹc?6l]w֯_o < cҤI#e] =ChѢ (Ybg^D 11Uf+mek?bƌ>}:^xw}֯mu֍mU@BXr; }` 6̮+CBVUZ"JhѢmfAk׮'⢋.2 nٳ/s$C"<ơpʣ=-Y}})d}ƻ^z@s˖-Q|Do/" IM`ȴiӬ/)"ICp@J" " Y' +"<8wcݓj$ :sQgԩhӦ z.]` UYuW_wW_}5NzBQE .2jքMEu)H0AO*oa|TNG 9t'<++feiDs_3> xE W}U8ؾi%I~ S*" " a&`ԍ7>`4wP8Щpe^_#0˅E Ǐo1RL2jWoĮ"*98`m>EqRJS Iہڵkg:AD@D -Z /uVTZXw {κ598n2Qhqf2c#*U j.(ؽ{c (YDbW[?Q"D@D@D@"K^>pB9x1|3"+bC Q(F(tAG:pЈxD ÇYW|ʽދߌ8㽺tR;ƈ˗/Z=T5Am%" " G`FījbPю"z5`L_*R%HIA`x]D΂ uEH$fH8V=,^ \t*̼HJ>x{Ydhs<'7JMఉ@}B h۶/@IDAT-\uUaTq;xM7I2oj'"pⳘ|6g5|vg9J" " " "l޼<*WeIgΜo]"" 9&PDV.XmqӦMm~*UXٹ2c:QD@D@D $;lDF[x 5́ 6`Ѡk@xYI>77b Fo@0yܡq*K/&D@@3n>,3Ox>D@D@D@-[}h5qr`0\=WPj(Zwe)YH4o[?CW" " " "nI+vZq8Ŀpgogy-[LIE$;_|EGM3V%s4h`3zR.XhذBc#F}v"!ETH|r-X|ycG:E{5ʙܹs'Fe#r*U*C3c;uI'ɐ8?qD+ g~v^!ڮ6@ ,z" " " 9!@'IA6j3$$I;.FP1#Ф 0kV̊z&>߼fԋV" " "(}0:ҥ@@@̙qߌ@VpϞ=ݻ7:w>}9iƍ!Ct Fyp{{{{֯_ono3SOSN_xȝxQQ"*BOXnG4m[5KdPEۢ_'|wt>糞|>D@D@D@‡ 5kڠ9Oneb͚5V :Y/oK' h#T8uU^پSN9WQEg$ ܶmuQ>S+n:V;Qn'V\}l0yXd8xVD,\FrN1rW_}? $w-a?׺P ٩c7nytn뙈)O<7͠8$C[B}(dL`Ksρ"G 91믿TapXk,Ǖ3C޽{KvoV)~8ޔL鬳βz쉶mO櫭"r)]DD@D@D 4MBqv1?3J!!ZbSJ-3.ufEW_ ?02Y"`LTqO?&5Of=ڔȵyyٰa^|DnFX ݻwbP]}EV{g^z)sJ)(yYz SNl+ĥv;-^/K(%v4m[5IdPEۢ>ydN Ŋ*hP"%>)g<|fN;@ sO+E+YM6o:g=9굲۷uCZV3U3mPճX`ԯ_Srz='" " " $TB3'x u .Ma-[oB*Y`A tFb9T^Pj~p}ʔ)x衇R}(>$R:UB/dD{(xM7LZ$7\𷅿1J" " " " " " "  ر ]y9{4h *5Xk,Ǖ3ZbEp ]vfEp1k[#G?ϟ<ҍǪ^*W35$" " "*i|ulT) 'i-dz+Acf4`2Ǜi*" " "@4⏗] 4j3<0Lp\3!@M42)`=c■o_|G4h8g{{{)ņypiaĈ~…sJ#n?̡y e#P /v#_r4m[IdPE"NK/$_Bj /;ܟx|OAH𷀿 J" " " #ZҸqcwqZǎ㮑ẀՌfR" =9!+I6+I4T8+euU3a,M4 <:ud\HH!HF`GkˌC34oz]뮻.FBN?̡gd vVm5B+ԾT7"DHb֭ݻC/nE 3CVJ!߂-Z?O" " " !,][ cƌA%BbL f/hkrӷ=Z]s/=UX/>ׯ>P_>\D@D@D@bJ z ~1l&R.]İ&/o m۶aĉ0aU&mJ*N˗7FƁ_n' xz{''錹goa4Fr-|kr`DēO>i['Fs*V2"8;`UW]e/C6mi&:N{#իȍ>C5u,}Y5*J&HdN'XE\0~x-Z]tXsmj3o;ĬYwlٲ0`NԴ|g¦k+\M3{2580[[ϟR`2s;r2q<<7䬴_߫b'sr=mƼΩBV>xnSFߝɕ}4]ꨤS~>+'ޖ_?_uPID@D@D@⑀t-u~0s<%zL6xVXb A{u4/ӇìWvq4F4HF3#b&.w?M?ӧ6`]w'^yZk֬Dam&g:k UH*BI4)Dd,\ɐ {5u לyL !1!!B?ucwa{y>콆{=y~U`ub{Ivט&frי`etXWr1A^ts`B7|0;C ƎY@p`8q߂sppL10`mu ض|o1SNpmp+ς]Q6HlV;v Lѵfl$rݰ [WΝ~60s Ld2@9X`?}ٳgJ O-g#LK^o}fm,\00׀ݜ6_|ѝw9m{fM60Nj/Nk~p9Z`A^z%/uϪIt";#h:l &yl( 5ªoI3T*lOUk'~СIIDNCa)(6[bȁMNܧ'szpxuQUEr&hܸq`9L63{:ۮM s61._6# 4 ,+0G&rMW퓻ӦMKڸi}lСn{1h g&sq7dvv<1Ld96,يlH>t[uUWFGX6~Gg=RM~.'y:CL N4{8߭j[}xgbdݫ`=UI%0yrbͺJJܒRY_40 8jZ+" " &@} 0 0W|1 0hj/=c rq,cb\Sn?q r? .΂3&s>&:U&Z༫<ړN:}F^;Xyݾ _+3`l8^)%jGQxfx<}߉:b~QR^~0]=&,|=<Dr2=WU%2wmI}פ ?g21X7C_ϟkDgX\'G(?6;ӊ̙3ˢ1QlH.\֭[@Zt~ϴ.KVN&5i$`@m81Rѧ.]=#;mx uȣN {m!|Yg(:9 hM7 e|NA8yJVx=@ԁ/>9bWc B_h;ƀYmZO>]g3y&/ѵ^_QYu9QuѣG11cJ]u< 5AU֕"5%T 4~K:SD@ʃR,{ZƗmzkI60͇ 'N‰U|'Bp>s ̩v" " "P,t}&EIߥ^߃6XjQl mvn kq&LpLǣ?;뺉}ҫlB^jذa.K1'UdyZzOҖtQbb>QQ%t}U+JJGyv).뗮QQV0e˖] /" " "  h2&`A}ݺu18O~faלp ٴ`xtL4 6l9r$L-ZHc3ڡ^z1cLU2%KeJ+%/\<V_}u; t %Fǎ]̓L_~[?&7cl3SΝXv[Mjar C8%^y=PlJ\g9su?NdMkmoc2!H4j(}c +s 9qse'==c&Vo]|Ν}[9l:oh$Y;y9gfH˶¿o㎰K+=gr6۶m}6.6ogx mS`U+" " " ~f2'p7fbPWH_2; Bpb`-|ܧĉ(}ٌZ0xP?vyDydͺ3댤;Z̧WL0_3]sKw_'|=WrXkG{{K= 4H>w|0B6H2l gh '>OQM#wsxnez#rV?  T*(@R-" " " %Э[7Ddb&;c3fdk͔WM&ga'駟RO>L{M1"tOQ&Mpcmuv_*@ǟ3_NԩS)ކg>>}>\|Bycf6q @vaP_OE@D@D@ Bo)9{6K LF @!М)q#@!P~Ǐ[˲qX6w|OE@D@D@jFЇPx}W/џ|2,fejo}yo^18Wbe:|7 YJE?};w8Y{{T<ݻIJ)^-[t3d+ɏs=WLL|R Θw\~;\BngHWtR0o=Q| JOC~ҕ>}3mShq9)h\LƥmjT"N{Pb0$6{20ͳ l/|įSw\ɬ^_|'jTL}mjҎty|3'(NRE%m)q1%(U˪j-kP +JI|?c`[o?iSzZjԨ3i^8oڴi0nv,1} =:SuFK";t;(nϴZkƧxfϲWo3 rƿAa8C/"gǃ>ԏ8GE9=Y|ud䦦3gJ@~:@Od<ںgd FG-5Zz!sGID@* Yn;<#t7|jlQtRPȑѮsa9/?"u'Ge3Mp}3VID@D@D%nz}P|ZBѵ]+_%[&`ҤICy\2 [mۺze._թNZ{{T\ O/n*-WKb1bb2QU}UЫӮ(פGcyURLX7(>QI Wڷo駟.o/OP(SNfSj۬1H|˦C=yͮ 2\dJs'jK dOIρԏI7}1_|~uzvr:>RXs=ξ{iBuTHK Bl0̼`zYgeHcLj}Aǔ1p9η:C q+}ԯ_~<-Q7yxxϔKe= ϟ_ 乴\. xDɔOUgf^qR5zUvkk|nw7 "J9zd;S<$wP>)>j߱L8M0[޿WF{'q25Ԉ߿9A==[Štq.\͛7w?Y@㓵N#UNnd{OՖLEL~zO?wܤD: t'}|E$[g|vrr ~kN*_D@D@D@!H63c=oG\)2)ܡݱy湵ӤI 8}[_uU@̟0c>ӧOwg-[<3s3w7v{ 6o>ʟٳg̙<=ݱ/}ܡx!ѣAqK։i|hm݆S㏻m'Yhp'?%x;>k!1} ã?g%kGz=z} xll3q&0~9g>s`~>uQI;3nfwq4hjZ5x;0wء֭{޳pWEC<9U} / L.DG߃믿>opoŸ6'q@|.sZmRE@D kb>S" " " " 1 pwQRhV.mc~cvƭ٠8 7tT<䓠M7o -eGha"iX}ݱT… A[/ D[?.ODDG0Z>l7%K#A_LE&h ŋn^t4.T#lmӱ1}Ǹ;oz_y啮]Qٞ!e ֦|}F[7 Xdo'" "Pfq|fĤti!)U8sRl^K/h6m⚮@I૯C ʍf`6V͌0-ܒכ13SQƟ2]?v6c?k2rR pLݞ2fĈIצ%fwgDuY xez 9<.;s95M.UASUI!|3~wDz[M<վ(mdMĮ>]fzdSP4ʸ@ln{N9[j~ߓ6{2mfE2yL>Uǻr(mIOxO&\Ql^'J_;oU_!jޙJXl8䓃W^90rp뭷ZUX7Pn!XG1Y u:u쉁}LL6tec~*Z+0`Сur l00qDKm: bvZ<-7l`3Sw@]_Tε z X,H4HwT]=Y'.:k_~%\~-Zc`Džϊ Bl'aBurֻ:'9ݽL~4yB >db.~dž  y{V6+y3kF`~뻗{d6^_~ +΋pe!_ %O (ʡ:GD@JC**n"P1hˡLg}$ڝcI{&mgmdجY3gk>m&m6r8ՏXcdNNiGҮJs.W:ϻlHcv^8|K6;3|a}2C{:_c6l+&[Ga&;C@rMo=_$" " "_61Ӭ/0K-E՚`FyO{"uswIxAT>`]2'{rP7!UO{2K!͋N׷>V U%jeu12e{F).Gj0)26.Z%G*L2xu*7ͨQyɮ|eT/lp 2A -hCDV:M6m.\ ƭR-8UV1m=|0q@SɃEƍݡwY ,x&l=oblv5R׋@Ex=S'm+j,C N4WүbBT LMD &f \:Y伆cГ'Ovq+U} C=&~r WKl119Psy38)KO9RMYcڕzL1a&HgNQ| rgj{.&=5 A48pM>~ _.ی7:#ͮs#K@ _p tfb~ѣGY;m{q>w;s|7b,Kdr/{2O{~:D{r.|ټ2mю~i&Q{T]|=jqmQ]tI3]X!HOS&:QfD~V[aVj] 6#l3(xرY)~Џ+t;’vFS>ԦBE%m3|;zh`eNc\h@}© 9O,hzͱ* _>w5>0w:a`|'i0Osaor1BQN"La_|{v"G}tY`r ;83;cM7w1[,3ǣ[n]lP+VG9ŗoG>b(0K\)_45ǥ}zO7sLcucĉNrVM ppE0 i)" " eJMP׀.8,406z60M)0xyI6pC' 洲=T`7,Ǐ`ǣȫjwťnNc=뮻{e#Rr/ߎjҤ_(Q8Xt_M=XrǥQrc [6sѣOwu1Eoh6T:hܸ1 {~58͎Lx>@R3.ջj>K& qE0rHvmNc_~x ]v-DqSD@D@5ә@IDATD@ N`9 Uʾ&r5*_9^>}3N?Snqɒ%x)a{H-aڻ?*?s㋿7>*'=qƹT9*g`,gX=[ 2`zywO>c4 >aj~?~<^z%|SzTҶmZ* " B x`ԺSQT" "r-g}Q,:0TDV <쳸\|vpcWzp={6nvP_v[rG-<l:`|kR%'{uWA N*ͣ}hg C"'6Ǭ&ȵMjPl GU6>Af=\ओ*c"1ER_2" " "P,DanژЫڲeM!#KxpY4E{^{qE/_V^2{n}nS0b;;FU^s֊ 3PeW16vX,{Ѭ{GUtA77|s?Мd7o(0r,^ew\7m y)3E@D@D@ O@Bnk.tۿeV[;9 m&Xi"Sʉ|FՅ*nE4Pv"QւmNzxW xo:|'T<6tS4BH֫W/b:MD@D L~VѺ5wb'NG Nڧc" "P $Y wAuM7݄ P b0C9L(&? Q81^BH1y'TV X, `Bqo' ɞV)„fq?,suqԩWRuM _*Qx?QC%rq+}lP<ؤ@.ȑH@mx0 |'[w]ࠃ:w),F1|Mwʴw bcD WRI$nj0={D=ҹs璈RGy=f +c&O X?ϙ3U7جX$" " " U$@{-uՉKnJ" #P_}}|'cUWu;{~G$d5rW_u &L)ȁn͎(PNjKD@D@K3LI&eĉxw&;AB)DA%D@D`Y^`~e?_ )p( ,Z@U /@=!~ijmLk/X}%#gqry嗱k8փ,zs6d1 XlT48*ETJ S*Q*m8DSj\GN{2? /C[SOl9Y棊y `=W^ TLP-3`B}?`,xBB5,f3hOǕW^in/vEK.g+.HP쭷rc|?-i1 &۴icÊtkT@1^~m˘X]QaÆjvmݻn#WE@D@D@B>#Zǁmxm̝ ɔq{WD@D L;/6?Mp]w}7>h|w]v%в?[#;xPh.:u|7xU^=եKpaViaUW-t4z1V'Ov AgT1[lo|?Jr" " "+O*}b 6qmOjOo۶mڬƈ'0o<? W\qE[. +J" " " "w,3gӷsKDK 4p/ ;RO1ѣG?FƍoF !4D%?%j{>p&_1_r9NXdV[m]w-)M7 T48*ETJ M?EB?~5&9.ɺ_Kʧ'`Z11|꬚&~o +NyX >Gb U'7q0v,ШQB$C`$_Kqƒ:ŋz8묳8]k)Zu%+pwuD7{#g48q7c!1Y 16;vtFmDDr6 %yVӧOwBSLb(+;GXQ0[nN4W1zƊ5[kD)\ͅ"W(_Ps}e9K߲[1!\cJ" " " "PI$Y=g7FvJg*`:9) ɥM6hժ[Zh!A"/'"P<{駟O> n0\ʈ%KM6M R葳qiҤI*D@D@X}#sISzJӴ+" %C@B%s+T(^|E g&\Qݻw[ok|e*q @GR^s xQ;#vi''@*꫁/U 8*ETJ#@qU A[}uˀ*d)ۆA Ol SE|0+%pѰIa0ۆ|L[(E_~ I7 #m Ic{oÇ7QFKq~ J'1gq{\p8^59`J0Bc׌O"EQHnm5o}g>j@o6XL.}ˬYq⚓|2>J" " " "PN_}Z&߉ַE [wՉ\wŚ5kVNMS]Eb,\ЉO<&Mr m5ԓXwu]N:F t$J-YCpT.4/XՈ뭷a-[tVv\Yg <½S" _;G 5|gN ?rPNPL 4w .۵k疆 F+Pg7Gz.je[X&" ' !b5P!@ꫯIxD*!7lӏ&Xv*sSCSy8q Gݺuwdm:֬N% pEwK:8ӖQk gE\)K[PgE5v`{[L[lÇ 8BL&\yeڭx> p~JL,@D@D@*o#F#G?kBr݀V*} [>l')ª;S/v~t.2c9ĕD~5m4'cEQ8-0p1[>nkUWj:_D@D`fMYʹ{2&N+.eUݚeJ" " " "G?~ovJmܸsС{?ZC3QPJ?wlo,̚j6le9ѴitN>l|%xU%' ڿ6޽[Rg2@{98f|i_r:̳B,ut~>;J" "P}aK~#g#9Kgo$ۻuV횕^sMzQHkqZܖ'@&s~K>ΊV\#|bLsc5^ڴi䷞" " " D^z6F-}} νɓ'v7WYky _qN먣[o]/r^3#j6Q|8SmD I`ѢE9sfrXmQm]îXf(df2.Mmv$jCbC`ҥoM嫌 3/^lZ6+mٲ%P/Z\mTc?L6~Go\F񽋢\6pCp.V5:;>طO?m\mNj喻Aƶl{ܩSuT AV밈;p_4VYepqvkn>sЁ %D (yt"ttф1{ J9 Et#_tDSg.o|*?㎃9/XmQ D&dOaš|^[)/H +O8(Dfs)~'} 7ݎrر(i.ZJ"~^v6_>fsO " " " !A<`b2=; ӧߙ(}=ovQd`}qojelN0n8X'?cpZ;Fʹҟ~ BR$ R:X-k4i^OBч\64hZ"FǀP5s O|LӦM 0MD@K4a-(SD@D@C@ø-rܴ(|\析d =N?xUg4M0.8T]&Tt@`wmu% o-!Ϲ=4! wRK6!I&c< _Dv}w QaK/1c'pb8p Y`vVIq&@!7rɔW0{l'Br9.o%1^ /ܮW^zm,KtVm+׌򢏩+j뮻%E=(.݄Z/cЯ>o}|'1!4D9ACx͉+~Oi0ށ۷G߾}ѲeK0&r4|8ЯlBĤKf;.ȇ]%@b?Q{uƤbL ˅HXD%x Hn\.Pg[V^y,/eGBtjɴpv.o /;穉BaU?t ?#/" "P拊K/Mmm,C)""i" "P:tj` rѥ" "WrK q}Bg }|d=t~ 8۴hO|׿kr%:p⥰M8ЇD[9DBѡ<)E,/\yWEOqѩ~T?r(̃u 7? mz'?_[5rMV2Ps ٹs3J'({qOD@D@Dؘ =8sĉx衇san;rKt OFjZ&Ŵ޲7x/&L/unݺմ]/ c8klX-^PN7,-s< 礄UţF;`{XwqW\^= X+f_ #" " " "PyOB?r}8J+KO {J"@A sv^-Z 8}܂]p)02{aZ@\Yΰ`o<J& !JEl;Y)%</h ˇL!Hvj9u3Ț3e[S ;J"ckSg3ۚh:uÂrz!TTs|8LR" "  `60bD1JOq \]QKD@FΗ]U{D<t>\\s}ZLuN>״>D: C6@o۷i~عOÉNj~rTzAPMG9qi[D L^s նT8*ETJ E.J٨j=N; xXU-)J'\8m]av;:)_>>d$ʱSNYg[mQE@D@D@O<~)Xpa]濼|q' &3ƍ {Xb˖- dWkD{sСDc~3~9R|X?k{>{1?hO '/e반ǼF؉mm٩Eoy¾ﷇ;&{|AXXtN rL)vziC`@ʼɪp3yX}` '!I" " " L` n^DcKU;^2u@gE< R>+pFNs/5!D\xoS ;ٶ%|ke;a l\ )8ٶ9XͅπNgX}%;u _ةnݺurp<<k\Rj_D@DT ̚xd@{b6ˈ& Fzgn{1Af;CTfNTرv&oJ]3 m.DT{z s osۏۘ7Ng͗V N@l(٤IM*@MpxtdD@D@D +vɆו Db6]@btoժ+PE!УGP#`dKH$Eg d1Ś'" " "u#wm7t ~xBtJ2qis +`z o[nF7}9^նm[矾z!0Wi\82{lW>c5㣏>r~,ر# - X.J" %`JUnR'|~X:9%E^x2%֏>/!u>~XoX,֌X~cJH^X,cR[cm+2| dJWga͛'cqbgBID@D@D@D@J+(>W}Lp/ I+;$p엥HgywyQH6g?̯}|;|MLsT~_/ľ_{tOE~{3\ǼEfG r-=921iKHLJq&L8nJLv C%H^^ 5g+7.7hl?|y8^Ϡknsao5;}6h-lsX .bqhctapFp!чN$ s]Jyml\|gSa;dm톩İ1uO>mr?WbٴyOtw~ߋ?V$" $`CS6vQU@9]Ž؎Ri[kXYo^kuU Xw}kW}> M:խgΜi믿^cub>\{68HG9n\f.“+N9t۷w\E@J Ė5!70`mqn3Qdqަ¿AUo {O_,RM?1X~M.~;Q|(|kr">t~? :Ե-" " " "PiؗbUi; }ȹƹa9>c~a}0;ҧ]0mB&?fۗ|˯}++|o5Y/n3f_(?;Pɦ&7C}}kM!{s/:~CSFf7tP?Y@68&l{[bM<ⰹc2l̞  mCz;_3N-=(\ӎN^siK]hA_x$" F|.qjՕdSs_[9[| V[0 AVPwB0J &S3SoN\92! ٫в%0dp@(OXsIM={6['ȉ(1x`޼$E$9YwW^K!}i cԵʴ=+yӧ7I Dx]/"6'| VH|U5R(MWxy2fE!@m5W7{#L>%9Pt~)d[I]h=<ƲkNj^{5 >Cl3q㨣škYK=bx4s$hMl7a'G /Kr8q|tLD@D@D@@@#qjC$S{A lI&:;DS׮]OUo=x¥sJڕ\U!x)x " " " " eE0ZE)D&W]5:QD@DB xs Ad&˿rd퐷y,hӦvWE_?w3w͚7 _pFyXVD@D@D8"L vp $; B,zR E(/!TJ@ пOXìvE4rAE+S@ux- N bs׿O_ϲT[o5|qW'O<;vI%y-}kxN`P`rW:ѻwb7<\~9@ȽJCR4?D@D@D@D V̝TIMA=t?о=;SOVԩD.fM) JvfMU+\fwL.^Pr3ŋ%gND@bI@BsO>5?XLR PY*E.Xŕ%mX#R (P)q! T-`A_>>@`u 81MWD@D@D@D@D@D@D@D@D`@o_[^z#UW]cM61x'p׃>>)rK/࣏=6!@Ӧ~<e!" " " %@@B%pT`_ ;&  Q”Z>>\aZ ;qDŽz?lD@D@D@J7$IID@D@D@D@D@D@D@Dp~Wp+gxda#,…W龰+#w ArT%B`=d:V7~;CD@D@D@D ;V[fl,JoOE@D@D@D@D@D@D@D@D\ |IBto4`8`˵%QUW]D ԩSOc ۙ_EGC"ֲQ'f9cGsI3y'?‰}l&%}$" " " %N@B%~Tx1kW`m[#ܩ 36۔~*FGpؽZAR  (ڨ" " " " " " " "_$" " Y x!H)ܹ<4޵#.V_=dXǥ7".-O;WzYg'O"" " "P4|k=z'м9&& \Bj@ @[o]ĩuݖg]v3&`wga8Sgvjv-[ 60c/ hgT=+" " " & !jӅH3pV 7L(ѓ*J=g*aY헊\t[V%E@D@D .(I#)ED@D@D@D@D@D@D@D@ C`R_Kb´^Tՙ4}CΙqs`A kX: 7ڨ[6W@>@F}U7^׾=pWO<ve" " " %V7|u@[~wŭJ|1~{$Evϛ x~ n qjReP!9SrcmÆ5ˠ!?Bʛ_w-l Cw Us:S:t; ~j@|tSBBJ" " " " " " " " #㏉W]pe(gxXnD;$Yw! M'i|]#J>ޛS;`= " " "O(ygf+['/|D@D@D@D@D@D@D@D@DpWrSOO,ܸqc7gO?=܃n-ufwbɒ%UɮB` ``= naB§U5VD@D@D,_fUuE`p[`瀮]9M;)}61+C9 eP5 iWD@D@D(>p1fWV( ŋ׫WB@,Hm:PNa)v $J䤫J#ᇉ$Y,@D@D@D@J@BEŭjJ ie+iӀlQRD7]vzEiV+3f;̛WTD@D@D NN:r%X8z-G?1I2!)DZ s%W~ ,h6Y\Jw_?בDy~bXao߄X7$b8M [D@D@D@D@D@D@D@D@D /olMt 4&/"|0at;}Q2!7;ẍ́>́#FZ%컆Kf\@ HU@2е+p V pJ*2yD=u̝ l=@%`啁SN)\YD@D@D@D@D@D@D@DO%%'m'@NϧGФIMs)jW׈BŽj_PHh,>`J X 8\੧ҟ" " " "P?g.0T@I'% Qtgl-@]^6 Y:V.֭#<SL hƠ9mڴñ`riJsK.>x$w^b<*E@D@D@* +֗O? 80!::!꫗OJ<l9Tׅ*K={f1~^RD@D@D 3 atXU(</)³V " "Pd{KJskUuI!޵7] о=н;p"a4>=ۙLD@D@D@ CiSO?Θ{,@?-L۟q0iRaV" " " " " " " " "@3mvzG K O>NG߾}msmB8'ĩiˊ+%I~n5a}w[ R2_@`0ΫO? Pa]8h>տ 6._TD@D@D 0Psg˹/)o/Qz˜;7B?Hpﯿ3g\/C? ,\v57l1n}D@D@D@Dn w^B<ЭЦ U?+" " " " " " " "/K$D.4hsVXaxQ@۶mq/矏{ <^{aر6bC`HZ7{ j\y%0~K䅀 Q/?{%EѵEH  ? DA@IJ$9*#H ^3:gٙꪧ٩[@|ȑV0H Ygի^S4D(4g(@ P9~ l I3s(@ P(@ PK@Aƍ L(@bİ^e Ȱ"q N< 8u عӚL<{5wW?FF.wE P(@ P(׮*dSdNp$JYI&E+@IDAT=qR&,X7oDŊ?~L>> T2vlA`ZqH0M6CmQɟR(@24n]yE q+pл7_.f 7+<1) u<(@ PQgݻ:%KF-/M P(@ P(1{ #v (@rb H_tDT;s ޫp.Gg-U>0yoUqd͚Y4]qI P"#c?8{ض \4 ȝ29S+(@ P(@ P*p(P8p"]QHa!;J f̘r?>lق{ }d̘˗#͖ 7p뾳y `ݺ(@ P@  Y@Ty3d%(z5@Dn>'NSCV(Μ٪b(@t"0b[NǓP(@ P(@ o (R_09WM uȹb-, .pehسطϱy٭G`)@ PT1ҥ/&o* d"EQZ(@ P(@ P z~(YHK,M_"v>1@B0{lY,4$YW^1jH'uN~EWTN= ?A P` (W hЕuiZA6W'K] hPH Q(@ P| (Qď(@ P(@ PQ` Ȩh P$`_{zuTs>w ݩmKA'Par@@+&3Ҹq](@ P@4 h|y`De@'( d /  & P(@ P(@ W_5kk+V<'6$& K/?Ν~hL2Xx1>}Jp^=@ٿ(ZԊ% 瀎e(@ PL|*vF[:Z5WA&HT` 4(@@ʲڷj첲t(@ P(@ PWW,E P |S;G;d@2W.gMvy{|~ήUF@g~(@ P1cUSW$~ o^`( {v _>mȤmgQ(@ P(@ x~o#quYXDVa@qup?6l؀)RH͚5z[n9OC93fOM2Y(@ PAF8C \9wogn`Ag=|o{ʔZqQ\![Rƌq'(@ P(@ P#Eb(@ '@ Eu;A@2gNgMVV:^gO@4(@ Pر5iӬ:FlY`d+ d:/(@ P(@ Px/Z8,6 @ڴi}5@ d/Ð!C$Iz|8~x_~@8{? ٣p((@ 8C <РB_|hhtsZիj\{O=uj`:@;3jִwXN(Iܹ@T2(@ P(@ OKпR@2rn $ͱ-9}! ^h& 8C yriS`g?yelز͚R(;1c+Z/\v.2fv & P(@ P(@8}(U 8pj_>}ݺu 6.Ȓ% Ǝ 8l0Z rBZvZW2{AjUXѮ$WzP(:\5s:ȠR%ogMj@H& #@?'A0Aj,FǏ=,(@ P3~:3(R3RP(@ P(@` H7(@ 0d=BJ޵ߣG@ܸUfo.cVsZ&CMV2.ϤIK@ee(@ P@X1b%KI`>+u@r@5?_(@ P(@ Pہŭ,wz6t۶me^p-='fĉq}TZyɓO+Ǖ'AG)૯B;u.]@(@ xAz,Z\ Ċ5_ʔr4ٳjneK0yv(g͛ڱD P(@ P(wEoxv P;ӧQ^o*իR5dx@ƌ;' J~]YØ1sIrՙ`^(@ P : >8|wm`^@N h,\h3(@ P(@ Pw ̙TdH*.]J*SwU8dRݺuqF߿_7_2d@~pE+(Nm[/eˀY=D P 0dP>w{Ԇ A :ի=u0?%K +X$`)@ PA{ S})@ P(@ PC@Yf(@ +`LN)S:9S#@3G@BWg>.Ο:Ȳe&fN(@ PrLΜΝ6ڹ=@ P(@ P0 `k~$xvĴioaر6 _tL>]ϙ g̘W^yEbΝN8og;6о=G+̒yӷQ(1РvI#wuӧu*N3P5 ґ|Wŧ(@ 8I@oJߗ.Y+$L褌 (@ P(@ P@e (` P~$3UYtE@R9?_Oc n\O(AAj & 8[A M/V^~qe'O~YC PS S&{w`f?Ţu`߾@ƌ@BkM P(@ Pxm *:u«`\ uԲ@={ yq(Q%K/kcs4Sw2g 8(@ P` H\"0aP5(A^=: beܺŊ]s`oإIW/+ؕԚ(@ .9 XO P(@ P(@ ܹ$Jsl( ],ɹd|ǹ^-t@(Ď tl(d䧇&I3KV0H|D P|Y E eKky50ԩV@H )qf 0Q(@ P(@ D@r6mcY0 <8B' đA&-Z޽{eK͛71|pܸqgNz9rf\׷5kC PAFT)pд)е|Zk0.X?ɓ_wy-s @fVz(nݲ&"kl 8C7֗{sZc)4h _r$4i 1HɭN2c?Ol|\ܹs9s |=.˕+[_ٳQd7|l[Vmd0hРx+d A^=k}DEtC@F+dҦtZ?+#u7(@ rFf@@~So֔(@ P\k>~:!RYg޼y3gmƌqy|Ѕhd"ۉNV:m<N Pmm<(@i ^] +*):vǎYșW@`=ҵI v-eNdF<(@ NCNqիjC@2YY/Y65"dLIҶm[jI@}4JN@$bEiX~=>*T5j0|pt%e c$^2iM9e$ǎǞO׮]@5(@ m @Æ ~QeV(@ PbŊGT"O,|a{,X`.(ӳgOsQ=.,}dڟMLIH܇ܱrf HW 3_ P%`߲wp3Ldw}0{.@4@$9a1?Z'OlM )YY93 P(Oݨd5௿;~2P2x֓%(n QR9_:(4Q(@ Pt!w߅F&M ~Ǐ1׍ælٲfmVZ!](FU6\CQ!CnjitG/ۑX$A |;Ѐ_|9H"2dD^jr$Ϡ_2GZ{wT)߯WϓW)@ P` H׸Ewu~ Y-/5EPQp*dLv?:[; 4iӤA!L"oӚ Bs*5}7ɑ;5z?={͚5 ǹ"X od+(@ Ν@ժU4h_T(@ PD H4XcFF{Pb0%%Kf-zr_^O 8M(wv?A:z 'OB8\I LpN ۻ"/ ]Da@ݑϋGR(@_>%!p"W@@@֬@\y%`(@P뇍70=1?V߫DBgI §(@7 ryx8sZU`&D TgH0˜س ;;[n_zu4mlh>|(pN _|ܹs@dze\Sh 8]7v"߿%FzE$UV )RxBRm0Ҵk.+W~.e$I\Ҭkx5 F'Rm+i=Q9FZƍTLQ!SX _2'ȂQȐR(@HhnȽ<8~@<*nZ.BZBkV1byԻ 5lذr kQXzB{Tpa9rƎ;<ѶРz:֭[fԩ3); ^ݻ7t<6hݭ[74jȌhFmgG$}A߃ 2!&ϝ;gq8qbkK mׯ1Qc"Syτ} 3gҴt y4 ?O"M)@ PQ(1mۀb k5@FL}{< +[u"tҥq)3R~wY BE͛77 uC(&v^F~I׈M_'KkY'\5 RDe>5@sQ?}taѼ(n߾ -TRI I˦' HJ݀&M,Ў(r)Roj@F=O9H4pQ'l hZ7m 9 TJ t j;w.4;HO55o iҤfFΑX$1Ix'Nچx,Z qL8`,wbUtåK 1tLwoRY} tA>OƓIDU?(@ P2IiaC&=01z }P# #U*8΄6$؟!{TO4ZOϐ` x]ٳg7=zdHH$!}H8!mo!<KRLat9>3 /^47 sf>ڵ X"Лٳ'km}0Fٲ?trt s<|+W.CPZ65uDs,~۷f?o4h`o Hi|@ PE)n 0[ x/C3G_u u YƎ5d\o=loϓj%Ce˗{RX_(\0zk=ybc;}(@ P/ h;t*i9rX$XahQ_-B ϨQñGE1rrd#zB{$ͱ3g 8C4OsJ%nݺOqa=rdnT@|@ P(@?а5h0$t<]:6ڎDžԶ\N&^bƍf/ĭ8oj[tH2qMX[n5n>|N4F߾}ɓq<4NR")SW]_~kZ /H,_+khj-xx2'D PpfcGvD.$p8=x*@X1hy]AI8u$$ϟoFϘ1JC2w} 6 */BW<4Joŋ!_͟_u~⋀s'Lt%0w -ҥ ރĉ!ev rC5% h> _7.vE޼y! 8s>t9s 9!~S{MvիgΚ4W@-lbe4w\H0OYM f-$p]7nc} & i' Tk]_|/(@ xD@…ŞQ.(@ P?'O) TBɒ%!}e_Atej*P[>.M7;ܪqԑ(@ܹ\x,(@ ,*o&Dk׀)eew _ǭss ႌwT@ox,(@ POxrc3N<ȝ[DZguy?Xk PNqxQHT!G m{ASf ֹ@:houԁ=gK7#GF(@ P(gzG}{@IhIt<>ҥKq-ob34^+i[jժI!}f謶l&3 ,QtitɡTZ C @;v,v؁|RJX|9B#hvmHyD:B'BITD>C˖-aqĞܨ\:v*|c<*S9Î'co-(@ pڐLb^@>1ȑkwض(74MI>WYltk?m ŋO˨#Gdbb/yO={?k63I&6Vjo6~uJ,^z%{C%%ta!ZMA^us]cσVcMxtLFh@GN=zݻ}Fza#+ GaNFҥK 1?Z2rY&MY>mzNg-7nwyG 9#6ue!xc֏~Ǐ_Xz5ĉc'r̉ǛP"apf,-Icȉ%B\$&O/x*Th1#.B}z:  DLA?O읃ƓĖo P}^yD V]!uj]7niDVB a(_/\gzH.\#?~|]GRi'~4bѤIl!-Sۮz*vG^n Y=Qvmi3P hs 𢡊O'MϠA7{^HB-ZT,24ŋeBAlsҼ#7c[W8p5kfUVذaY>=ih? V&n(@ d - ㏁qWg(@ PB)cNA̟?< .vhe/u4?G P r@EhG P&@"E ݹJSL2:$kV.bffD@,X yO$н51﫯 c cꢔ(@ P(Y ~=e~ukp`X=])@ D /5#G+LxӡCYɓ1b|'2%9b7.)7(*s(@ P(K}@cA4mvg}E۶mQ@?عxk≬A{^?36lȘ^VEUT~b}=o06bhiӦ58(N,]$4 >K|.AŸY甉nQ{O~j?ޓ5r%Pd]2+H P*4)P>0ip\bAwo K [6@͛#5p$(@OZ]&1Zstnr49c^OՑ)S&3874hizK /5sQ᝟S(@ Pvq>xf1p} 6<0pݠq mѩS'3FDƍڞؼy34p]X1+ /+W.|fmc.ZH-Y1F'ᥨ"Me5Ao2h sEu2e qV>>g$#yT)@ Px=YM]@@#ܺuk38H`j6~W?7Mv,(Wl]FZze9]v{ko?zNMz͠-ZhC^RjD|Mh{Af >|WQM[C̤+WSN~zH2_~e2W;Sd3o zA;/^Uʊߠcǎ s_ ܩIRI$1oʪ&&V 1$Ҳ̈6ºE 5S4&vw$7\(@ P=umsw}g.RR_fzb0v O~mٲe{̙3@_4hk4]|9K;(@ 8Y (@ i/ruKš$ڔ zǁ9]At 6 㼂QXQ]t ύ((@ P hpΝ]Ahpn}(ed7gO+X_(x:ϓ'9Kj5m4SH4Bܨ`' P(@ L7|)lxE5>+V4A5pE"vm mL0AC>I->i`Dk|e2uA8k, g_~3g&N $mt)0zNH̗ϓQ< n-(@z C[m(U0Ҥ1Ç.X'ualh0/_n|gF2d0i#UT`H#Ðhr4L6dⴙ4Uf>/T!_[n?6db!ws?irϐ&q)S!;v, [ղk$qף`$Cb6Xܼy_ [je NC: pi,,wƌ pnO AC}ƦM_رÐR@e=9:hbǎm={vcԩ sΆ46uΝ;!1db'7k i'N0ajHN>0d?`Wu}+P@1t C<GF9;f܀SP~/m(@ x9gsh}OK.5&uXbݺu>Æ6Ӿ8 ihn+Q! UMm/WX1#},Pc\r9#kԨ{Ȣ,ƪUϑ PNh0zə2; x/cn{7w8n k|ڵ>Y=ˑa"2cĂ'#ahgwcuϞ5^3^2;xb(@ P/2 0ںr[(]04͛ C3Qp@ eBCÑGs5?=zg6(y=:̑Gh9HӷܱcG[̄8N#G͍z.s>(@ P HoȘhCDŋ74CCm8΃mڴ tLh/7'O̕$8!QdjQYݻ Ӑ Ҹ7_K$ ntG B)Y"QDA_vs-F:;3կ<+X9_D:N'Mknhl06G4ͨ^ҕ 5vt['^x""G7h,sރ Q*xO}}X: P7t2 1cFX P^. _+njx+ @.SHq4>(DZ _3) R4W*w?yǏY]h-~qxɓ-}7oɓ*^ _uwWme76mfy2>Xk*+ZsXܛ@XAA/_(@ P|O@4E~aF ^@VȒ% -[{P,AE̙#cСC([,ufX)>w|9+? (@o+w}V۷AǗ/73|" aPFFfg@jD Pn r候31c2 O P(@ Du]EE]툉xG@IDATH**Pt( pM x_Lድ:;$M weD:e`#UwwVk ぁVǏY(@ P $r8p0xCW4iƍ9$En(@ P(@ P~]~5A \'Nĉ'dިLe/ڶm?udmbԯ_ٲe_|TO޻9:RA I P:KK`sԮ hM _dہU{v-]6RbĈ? 4s0xu =6m(*p PpDয় 97ov9r(@ P(1E_uĔB 4cƌRP>-@>}yY9 P. G(Rd;?O-ʓR@ X |زȚ|k@Z8-\lo%K*O<ѣ#x|qVA |̙(@ P3raf`gfku޽;6ĉ6g>?3c^BE@p{#ļ|S b H][;dӓrx\=S%WD0Q(@ PƎ9&29J鎬"=I3b S W\a}[ t,XڵYcZ֭[%v3g4ވW> *5k^ xݕ2eC[Μ9R3wO3=z*\7"x < QZuU6mu묕 Cۗ۽C`jZeLQK "8vl .]nݢ/s(@ 8"oCgѴ#E>(@ PBH_ :7R3d,@lQ ߸;.=C{{eʄ QuJY__} tiV@"EM(@ P#}+4]zYﷂBjpȁ[Y,P2_>̒R)Rω[ (@ Pn'O>L> Ѕ&2g a"&3gNO۶m/\RD>|~Qݻ2dԩŋy޽zLxF5j}r]B@@+3?D Uz'p3N [l3g cD D Pp fɆ4@ZS(@ P(@}r/(@ P hd׭ җ~`rGٳɟR 2#F60$ƎvxŊo s (@ PQо…=e+1[<(PHS9㨟9P(@ P(XD ٵf(]ӧGf0qD:t׮]Ò%K#O<@dEĉc|wU0]&u=?,֭OCg(@ P3||g {b)t@҆eժXB)kc[JFX1uʊ}eF'ԯ7(@ P1 wo` {vǎ^(@ P(@ P+D5%Mj(@G48!`rwH9yyb.1bXb H]'`ϑu`Yl<8z߿H`V`rd"k!ʕ+ω#)@ P)E,t,] 8n83(U/_2yyw<(@ P(@ P8y(Y8zԺߘ(@H!4Vѣwł РAL22eo={x~e"Q|Nʋ9ʗ߉#(@ P tRP㣏 z~yYBtUę\/CQxi9RCt y P;3 +N۶ Ċw 0(@ P(@ PKzH/JS@$>AF/4d!#q@p7[ 9-`Ĉǽ.P{7n(vm kVO]((@ PWе+hp mdL"B.] ˗,-(@ P(@ Pl&vx*Q$@4;ùs0yd>|E-K_B[-̶,fX/b(@ P z#? @kglr] X$Ō˖}ĉС%\& PΟjڶڴJpB̂(@ P(@ Pknݲ4(@ p"3@V,*αc@ƌ@x>U-V4`nAh*+WZA4Ǝ>/Tfnߎ(@ PQZOipe;MklـwMD P(@ P ̘͛6痚%7׽}gӦMH*4i" dQp^ݑ<|v֥h޼,"s@^h(/xX@j`:V ^/w/p*PWū*U0֣j!_*> K P&GƏNtc/aeq(@ P(@ P\.`K (@ P4'>ThL< ہ uQ&h 9]7s@T ~aTsQ?2g/?YZ;Mn]+(=b(@ P^nW{@gY3trt޲ƍ ֙%(@ P(@ Wh XjP@r?J?o> 2cǎoS͙3.jJ08xM(@ Y ]{ h+Vtu5֊"w@RG_…!auX5 P@%K={:TPw (@ P(@ P>.A%==̬(@ X4W_Ƹ22ұ9r mo„Ӧd)zbǶw.^ 0y2E۵Uh]r(@ PQHR2ذ @wíP#=ҥ9P(@ P(q{Ǝf #I sr_}O?TxY&F͚5dž:hPw ~…ڵw(@` HaW}{Iয়Iޗzk˷ZV|;G`ذȟ9Li={< (@ ]Az x 탬 ċc%(@ P(@ P")p&,Y$a(z+ )>0&Y?ܘ/Ф P $|81в%|9cҥL,L*fُ?oG<<(@ P34(xX%K'N@&@(Y _yh ?ػ@qY P(@ Pe2emۀ{8\_֍Y إK KѣGVɃI&!%[7-[6 (@u{(X2 cB@/|T{noAFUǻZ믁^ƌz~v6 ;nP dLԳ|^ qh5]xbEBti Ag(@ Ppџ-uqc/A.(?>P(P$PP*)@-.}3gAFn]N3 P(@ Pst4)s'%疕%# # sA>ݺu#dx;t ӧwOa|ҥȑ_Qp-n]g$|fG P@h2ɗ:w>Q×k?uӛǎ}ċgx =iџ!C?6d5@B*)-k2Ԁ(@ P@D@J֏桁Y`H B7b]k`H)^ (@ILa|zg}1(@ P(:@'R,^l и IR+/_>L6MǤI8zhԯ_ YBWm%K&9 4eqRZ^V (Ͼ:ԡܹc7ouo!A ? 6 t4{tDǎ@֭0B {óQg \ t`MZyP(@ P!EZlX2H=k֬N|(@ ͛@d>SV$ y_9:F-}y1/;fNDgr.!fp@߾V-r~6L0ye 8z2 3(Zg^= U*ھ0y5M(@ P\@wԩ#֜+&M>}[tm> \q挗Wŧ =@ G_}³8(@ PcЦMPZÆ@ր2d'n,TrSv8{,f̘'O"-% ;]AFȇ+s#\o)7(@ PpA8Nж-ӿL!$PȍL:gΝ1oϞ(@ GU\]eyrk_VZ֔(@ PGMʂ6h @fY٦PBW-^Xs Pa7'G8\ k/fA& ;fLtwn~Xx.@3y@ڴ@ 6]hZ(h e^0(__(@ '}5jCz!a޼ @ܞE4@:aڵ־)@Zbu}Ma(@ Pp V1:l-o6vލm۶ɢТE +p׵.vMo %1h|@2Q(Rt)oe>mx1$B8KWJwXIjsPgX5 ,\h :Q"pp~сL(?:QBoeuw Yh/y(@ Pg|IPĒV_[@r)=(@ }]w&z<֕ ]{m5dΜ=syY0A׬q֙;@@|_oY48;2Կw+{nsgyy. P(@ h?OMo}[}'U}0wn+_{Bsny|Y@pF_}(@ P(@`:v׮*A?|A%WtX(GN:%}M1rH30dvpWz?9DɢO@?/(@ PpA6r>{ZBh+O"CJz>eJ`Đ^6W hPFWCX$x?(@ xN $0QQF8$phC P(@ Pw4У| )=l`(@nI-(@ӧaAr`f{2]2G)L+2f P0ptCtNvc~[k@۶Vw_~3d]k @%K hvw` (@ P? ď)c5ZйGWXA.z t 81P57q4ܟ/%jS }(@ P(@6 Eh (Pxر^=P!1cF5 .\ѣEViɛ7,R+W# /꟰Vp!Wǎq0c0bկS1k P_ <үIzcukH4pkpw׆I@'̐UI*J`P`F+7h[]UK Px_X(WH.3+UM6ljִn H(@ P(@@  7RSxW\#4Sn4Pf''D]9?{g7Wq  E ŃS(P(^+ n iN?ٞ77g>ٹ:wwGΜ70[pA!Af +f^Z)r\tRG/)?o쉢!$Ɛ\cW+;O(.ĒwL9(B@! h&flrcf?nc:˂yN"y{gf*ju 8ᜂB@! G&K. 8Zdm ! SLavif뮻ns=`{bSN>S[lr9l]~=xm~3zUu.'B(A'un1`lˤXת/c6p`gz˂aN;M9Сf,<FYp wf we*B@! @iX]xX͞zok1xUR0Zk nJ3BB! $B@! h<j= ͶJ<㣣#B@Tl*Yg;^m9;3>cz;<2{1QfW^'6_A/7L$侵;>\{5櫿J,B@vF3m7.2Cwrȇ2;pYf1}ڹ〝sChN;՝ooq-@1)! B@!XX8:Zrt!.;<{zdl؃>a8s H/z駭_~Ad#†׃/lQ=S! @"TZ<0IE;EB &OBغ5~hcyO>=fB@!`Wfn3foW\[|qo4`qwB@! B@llRVXf}cB@@((tA~_ozʶdA)o<1bٳ[zyn X/>唺=ZB@!E^WX`ΓA6к*90xqfP)4aSOb6*B@TF$ i/LB@! B@Ygo?7mB@|eB@tPFg׵cP?cق<Ӵ֩Tj+yR EEXb 瞳`\bvYy'x5$~L(: -n8UGm%Ĺ7Id7nˌ8,k+B@!=lUKSv*K͎8"O9LyBH!1 BtS=[rSB@! B\}6X`}gؐ ůAc^{ey @r- {]pEwYJ-̓A< B@!pfGQ0w9G iGV/3l$ 0xaS*YEOboQXoj-T.! B@! @vm#$ Xl*J#Oځ|*_S ! @[{.D8ŀE@lS z 0fgizf[om^ ^~ף$zF+#|1f[KCk1{-~_?fΛ'$%3w B@!lUK\cȱqPN( Kf(#)K:pB@! hc@q:tFXklcfK/ݸB@Go߾6D ܴ#)dKkvxkmg6$fgB@Z k|acmʨ HMyV0裏>Du}zB'(5h)uq\yB:.B@! Fmlo)kM?cOjK! A5q.ЎB@`/Rt0DJz< EW^y*7!PO~{_ίv[ɬC""zz}R^XXs3{ͼSOO?hSH&gOdk.3B@! KfF=t ;/CKy;&kl=t!P #;m! B@! 1ǘ}$[t60ObؒB@w}Ϗ=Pd 2H"ozjE!LsHuSB@! ZA6}Y2;|35LYi{9=}me}5lMPN@)]7{eUoѕI !}5o7[gvGNB@! B@TF``ͳN@ 2$x nsB$}W,ӸB@ RU_~iϨB̂oF}5Ap>W z#0Ez{ifwޙg0SD` zJ8쭷DDt@n%~m"{y$8#B@! GRGr^K9rW1CBf/>n\A4?w˗m! B@! 믛tR~Mq:desivW:=Y!PO>& = ~~=^s5F&' e0u׼1T! @# &{_dpM ZnypA]8fs$g')qI }f@>u=6sʈs8Sf6,U7C' ĭȑ"_|R7|_ToɂtO۳>{D#([+ط"\9/_UosH}ѧۅy"mNmG"q.ʥN:M\w\G1OY u# rquq"! B@!0 ~w<29Fd[1i SKysZdd~&rK:j2enY,2ƒsM5)'<+I=r|<5KA!(QA B@%R΢V|ڋk,雩}|~ .X|~I""7"XKyd:{ѽJ/[z齂,q\~2"ׇp2!%9FHʆX}]&.7ry.3"E\XD&,eCM:TSE)XgC I *rS=6ԉ!I1 DR! @`=%21IrIrL#_b,RM ">F!1qI SxX%"Kq<9&ac֪|,)!Ю Zl|47.nrL\͸1rqO3"YϞI &ޤ ǿ~,)%Rʢ owCm'm$'g# n&v;<e'I}>d} r'9N=71{V>pp,Wp,vRRX>#ُ qI OǼp)! @%DY v0{*.h5^xᅎRp?ᣇ!}3=^<.`2r/Jz@?5ָ6k~ςP ʶy.A(HG\,ʶB;ݿ1+DBnp.qyJ;o Hd9$),hB6ʾ& 7;F X` $M>m$oI`RMJi€C6_)m 0 ]@pr'#~qq }h{ 9B{r\%8R $)dʶz>|f+rQ ~u-Af,pF%<qӞB@! B0WE\/6χI꫎}7/7b~IK1x2a~69M_5̎gweA=蓠7$t+! @K"zcִ|<\rLE]*06qM>>au-?Hcb۬e#9樴fL&M<^_n 3c$Sh5ӈ7llX[yHqa'DߖSUڢ}GW!_jYnN,3kHsO LjQ)#?IsO)o>DP0aeG7cws>RMΏ 0Oc's0~T /~<B@!j0B6PJ׏3vKOFׁ-'Cp%)[IS\˜ɱq1G9Ą9{} 11o'}lc`7\81-ęD2ȳ~ѣf.9 4xXʸ:۞",ͳun!r|GqO>ry@E聶tw<0.I^}})Xaѯ'8`}w$G\L >$gx ~;r0/7(K~~#)}l{RB@D@DM^ r-|V`>mE'${}Al@7Wp MdpUZfK-uxY1h7h$azbo1*sCϞ=mVK,DHTD!O(! B@! sYd9m \㑹Oa@,B.2dϼ79NnVx`7St,(W7_z BQaaDSd 'qf-ʌv2 xSFBt&@7AyEz(.rKdnx㍨ !F #B,b}dG C =|,V $36,AcPBH96/VB@4|\L؄5d@G~I}m 'ls׳|\L$Yff׬cvr,ۯzx1 c€,c$da-i`H0Lf䐐DqGFM8d/>6B@P+FJ~2>)Ǔk侍 U>sKgLj?= I}z?4>䔻u=ƷfVJB@l#84k;R |L.eXpك`ٷ}c业ddL$o 0C=$icb&{")5qSP/1.XʱvzHdn+L/p3H ddN?m2؜7} w57\vRoxǓ}oIlAO$S&:9BAq5\ z13eǺ uAyo2<빌7wx}F2(v[GInL~DŵyY ߛD7HMX"gOx%Y*T&! ZA6^a CW_*\k:@IDATa`;`H꫇ޅ% .G=;nf[lEfy@one yD]=@`I($Y:+b0@6xT#!Pr%to&PB h^*u6B)%v"$SRW|g?$#BgJ)V2\o޷ !߰'~p 1l1KCٌыE,sdQeWA.h |Ry 2Jo ,.+h^Fcv[\VU_I< 3{A kűt_oq >![:eNfլk]lUX=7ߌr$dIoVL㙟#e~BF$ 2l;`ӆhS06!MF,y`~QH'kq-߇ 3I]8Șocd&S͊@P^2{yQƦaXC0!0f̘Ϝ>24/ u!(q'@@ I$l {IJsr|0E] D9l/EB@vD[=Mc'u {> zɔms#?јn2e ǹMO\kLomR.8MoqYOn߅E#%?\nr;ǒ}Hr@@}rd~c7%rdQDA!$jB@tAv܍>D<`J )BK?%\b~:NX!p +/zdNiCFa:6\ ]S*IHd\S)-!JCW%B@`>'o*H0b|; 0cޕ^ocOt=m@_OR(|I&&dhx7|6m+!m_l̎9&T@h%yZP;}fwmusf-` V0Q%ȧJx.t+`1+!Gz7"+#?Bn3!#"CB876z|3#ND@z~N]r/ä,hБTz=%.HH#P$,Lw MVGAĂk>H#;`ӆ<ɱ :apJ_5_BLFܙݙ+ >a7DIEp/Rn 1D c80 (Pb#*Bx2s@  bGD> @6:B aF'­7?OS0fz5 Kxa{-5zfg^)W_}cuihdH%#siVtu]_Mh8B.Z4,"f=4oyp"Q$I X_F=ĸZA"@cQ:ָpNL_'s`R@`]}eD$BGpu)!-X0AdߘW-7{/ᇿ˅o0> @}A@1]! \0]}R'F@gRgB@!=W[rowH9'o_l{DVuc({d̀}>,Sлi3C& 2t7\FI_>=߰)!F Rg&Lߠ,]gs=DA@m!#Y޼)@=d=P3 Ga̶߾qVs~Z>}lvڦb6Fel!+ J+dGyc/j-L=XOv[y督sWg}GL̖_~y;Cmu֩a{'S=5!/)BhBwR"'eA')LjJR秊 ׫rB@TAVG"c\ GcanǸW&Y*_; ؂ԕXd;s\A"9Z`XPB @+&d~-V~!fl`|VY@Ze࠱^Os"ݧgy#BNdɬBJӻw(KB, !Ь@V!$2 /IOEX|K,DGDrꩧn*e!iLI>rWnG~9Dd,v 5 B@Fu,"#G*]Xߢ&̉ QcҘL@±>s͌E\rɎ:B@t}fL>Ast zKY~Y;[ު jF N~b@_)IeS\B ;ٵ˯}.uǞ={}9HNUG]ϑI92z+}knJ-kȜ =,@>P6$|K[X#}/5d%t* B`tz]K!=EH 'hNY !J/ ҉!zC D􅮯OB[P]'Az8*#AI ~}܌E߈j:BW_{ycZh㏞?rP^z:BUjCHC @@?A|KOEe"jz B\ڀN,49L[QB@dAf-t p@\׉t8akߠu jfGK~sv#Cnw}mv'7/ wyC͂ G҅c=n[qSOeY^~(l ~.غ #Q@` <x nN:i"Pmd^:+h"lz,=8 &ĹQ"|CEϨݹQ ;5@wxZ#-|wrҽBh%yZ;fKl'9,(>g-ipCڒw[sM N ޡ!fcSҹZ <eIȓ /b=zD85A0t~OCW^ye1m> "}~!)zC$I=}x@GD|;[! *!N!k7tDȗ xLh}p&4q.B##c܇edr߆j؞[`}RYg5WF0'`- u`LcPkgxS=iN 믿~FJל2d㏷w9HW\qE$ExG2kPWB=#*L>F xtDI5D̀^\wRpx[B>}Ĉ`<dw**"Q@q W#FF3de]6đx/1Q!Pk(#<@rE<,{P@+cp?((v]U;!YZINĄ}ϵv%kd5Xpux0[X060z<_{,{dȑ TZ>0{s9(^T䶏>hGD.9$ [uUNf,ДGrH!$ԉ"!d}q K#QGN?}XTc!kF$i/dTRB=~ L38:N$ $d B@,"9dN~ǩ.afOo;B@TTȑ#m̘16SGE]4KBؖl߀sxƸ?|{|Ⱦbs/!Xj4mW1D蟣Nc7Ȥ|r/]UB~76TSž3$.*l+"+{En4d˫fv;Cm2X:N:$[s5K.ɤoq2AoB[7Q^kDkO<` hE~H؃Ņx(%a !mJTg! A6{R)0cb\ [qcDiCrFT@`ûz(*V[mh|b[}G ty @+ډplV;~qx“ǂᒅqn+Ԧ|X'|rt6A 2;t!O۰a;t|VYe{N #5E~߈ȃ ?YghWB(D &⯼$I܆,I#= ` Afd0v>禘bto)rBJ׿1\UBo8#^]wݸ<V-0 ‰<Ai@21 %*8@ 2Ht!C@O>"R*غO!Ц`'  >[#BІS tA6;}"k_QglwX']!@І$1`ܓ83g"*Dn+`5<.mVUٳd5PB@$donfA_D0Lh|ډuiJ޲[Do9RZ˘o@.U5h??w1_=ܳe"\#TBahGp[-U! .|wA+b(f8q d!O>y7[p=hB@+"l7zgن bv[\G!c6p1БQNߠ&*#J;A|W0 }! #p5f[niHBX@+ډ0 k; )^o2찃G~NN;yWVJ/ַ,8̏Rf.눐]Bㆡ:5XPc3aUYHϜsu67pè'oGSbN9|>&mx!IuFB Y."Mxp6GoN c\Zkٚki3OSK͌I`gsaL>"#mQtZ6D5sU|Iy2Et% <3:,8 K2$Ok'b,|駛هf-Cіa)&:Z H̖YkJ6V&%C TFaoFTE /xzKUBD@D-ZU&A8fKM<7n&M^%Bqw7GrX!~,y 'Sh.:ʂQ*J+@+ډFgސyYz/bQo뭷m˦|*t*aI_݆8}K¤% fL0`ĩ`|9^-s0;3Ďv݂3;.bC7}tta!@,e>U`͚5lK;D'g٦~zi62K4$8:٬$8G򀧟~:,z8WA! :=P$B@oȑ1S]ۇ LQyעrZV >s5W2 ! ZMU>`|9$ AzeiZ Zpi_ .@# "ȖŪ`x1x933fͶv[r- WEB GƫW^fqF_j;c0b BM nU[AiDLXT; q!Mn ;͎?4ɭa9<]pA8<O4 2E{SO5 !`aN{!^zi$\uUx)! qN4dȐHosvmg묳NXw B@:! ":춛Jf<ݜZ~`S#ձ6??tխ -,3nփ"p뭷 i-w]v/r{m {_~y-PfB@$}lmMGJm! @dކlc~V E4Aa}!  h%yv6ݴڭ 7d~' miX6dtf[!~ Z?5𨣎DU~[B8؇]v=hdW>B =}/A)ic12IJ0C&I"GB<S|B[f 7 ]X2 vFg89g}>ztBDo٨Q\䠃 m?> {~z@zCB>}ĸKF*F'#ѣĻ/袩хB@!P;z*%3VƙK޽k`,UGO?nf۷m3! @#O?E/Xq׶^%)2!Ȇp$B@f4KP#&,Ho' quRK-e[mU$WO'p#]uUѶΤ]Bq B@Z# "Z#\ä@lhvUʰz뭃R}|pfhfj}YT߿P O${キMB+7*퉀 E㗿oQgpիӄh)nv;㢌メVe*! 2J|;#Jv"&7NxC |a-YPl:-yVi͓椽GG)D"*Fp(2D12Jgh;')!x~a,I:%%DHztI4y|4nMdlan~δyBKQ$p 4?puRg@K!0lذHH)bء 1BE|O>0Aq".f.[n%}GBmC[B@ SO ϡ?\eU"ylSB@q[v|w9p! @"UtGzc=l)@ yCnDo~ $!G\z#<B9bĈ 69Dh-XNB@27A|n {9\>\mM#0aǧD I˫r:[/]V%"!Dc=ՀbW^is<,C~J+Aځwn>T’H yi;@FÇ/ozk$@s '4 !CgϞv]w5>CuEo=jY+m6tG;y**v@]iii#iiiiB@! jށQ^^󳬓@{YϹ4J'}]}ȑqs%]";~By$N[6hh\ +V/+l^zID k\|%IATM޿M3M73i۝+EɕP֌5?϶]A}0u>X g3ӟlE {|HjӨFM^6u`L!&_5ыAsj?i-Mg! @9DYC/^HX~衇n똸T,~cX:UpൠÂ3wyGydbBi.TL,!g|Gr m(Pf A;ݩ+ iQe@?F&&Fb>3fL"!( Ŏ^}!%:SViii h!_ͧ긲3Z! B@, 2© 1jiQ\g<^_Ϲ4(`\vK/˖9Iwּg~%)Ky$rH qfȖ VnagC O?d;gQ!P+D}dYr$&E7C1b.oB#|7|`A7KHd,a2`mB~\ѡr"o3iVd<ɶگgS`N{=0AsUUw3mmmm?KVB@( ":=@f_b󄏐CBl >O "}'1 dQy+ȓHTl s[8^tZFiuPz rx^s5bU/=KhwXU;k8ǁ.k8N8Lb u 94rJ8J@; ŃJVm!I 4!FRpAsbmuc yWH;Z)ոoww$2\sMԳ|00>㺗i -M$66_A! 6WCGY3ݦr5)LYY)SĚXfe\ ɲwv>UԄb x>XqSɅEAmF Xt9)߰sP#4Tt}]=eY&Q?ܦnfYډw`ֳI+gjd\wټW5rWѧOꫣ",T#o!H"]|ڌoA≩wxc.JPuvKʦ>B{1?Tdbemo66 }B@! @uꫯl5ֈ,!`BgըW=pQ'k/PaiU@fyGt+OpwF-*n.7:th7!3/G"j<yL<ᦛnP}_(F"șfSB@*%kUS.N.sD/Ӕpi:?i5} {'ʐ04Ȟx b-"Ag}#o4|SBq7rDٙgiHc;.xkֳI+gj'icWb_1_Z\7 0|+(!  f chї {Z*"kN;ԑ-ސ@*9鸠7l38Zeҩo1,P$ 9v衇m^jx'Q-J3uEJ{UUʓo b޽{AUYG]`` ?O$c/>;^O><ўC{l Kb#y_Z˝Ks0_|ŶV[Ź Gsbmucibbǚ5HU~ v=Y컫W)j*CaϷ +XϞ=m &W1jxzGO E }=o[n}{1S<Ǐ?x{衇ws/\PЏ&pM34J5aEж [n_|sv ܰڃ8`t]w|vDžx b!PGᦛne?!S|g0T}WgT$wCx{}_W<'|bvZ"z %0 \;SL1jNx7SˀI-kr3ˌ>)bkxIQ}F񔈷:b@LtO8w1rxǎ99rdBH;3,om뭷^IJJ}t ?X'Ș.=]W~A4bA1@> YSwHG;D(ׇztL[JZh(PdqJJܙqLտoP&omm!SB@! zkLTrȋ3e΃!M2GueVj.,WRs+dv[\0o߿hv.\5iuɂ0/dj9СC;s=r V"Ðcz4R7x#ʤЇ~hkWJGoVk|̟ܱ3O5QṊO03wl+C0@IDATbliy 0dS@XADfU! @ҝ7-F[alViUn l_a܋k1G}8N<˭aҋ`nz&K,mQ?ㄕVZ)*2?c͓㥗^Ώ|sJ"Ȱt*]~?𨛆KC)9Z8AtXFP9ȸ(c)$N3#񤕣Qr+VcڢϪ+u<;묳> Roq\~gb_3v =@>%;c?zqK{/f 0 )$CHU ! 2@XXI&CoAlAlx:8r(76ܕ *ݵ؄wqQm5PN~K.ҌCد_W.M.Yn(ؠJ<]t!jB!ڣ㏭FB߾}׌9a!6+oz}VW:_,CvN2B(%Wo34x'tYKw_`>A?k&%bOtgܐm両324uIVqú뮛|;s=wͺ)&,W!B>ѶkzyjqMtw!Yה_gh%yH4cb-W4srkNR4f ^Xwdle {(5RiOGVm1럮kX5^CnYr-Kl{^!@ǚ:[ ʫZp`9:ȅJzpx6YTF Ng*ULo7ޅڭwfM/L#gJ+<˥~OI>w7oCgrggr|UɲV%kOCّ?*! @0Zt\P].8pr&&hE30\  Gg@ H瞋X.,w\ sK/t.]G^O`x?\}\pA.Lr .`˅e.,Va.8żD#o6Y<9^i',7Ju|PX0a\ 9a —'X uw0r-@BCxO|\0fcָ0馛 \XɅ U{ te# ray睻r{{x7Zq`TPGy>5,&8炡z.{;sO1X%.sAY-]" 9@)^?/SoҸ;8wPBɧ{f4PYhUϵZ=Kyd _}U.xЌCdwyg1444sU˕[E87bDG QB4g}67|8Bn,P9Ay}!t 72U\/8\ 2,rJsXSjs>DciC02\0Fr#<2 ;4wLa5$|M'1? ?Bļ=ˁrO2$"Tل@92--u9(ZV_Vպ}7~-0mqPAh㎹uJ31fNːϜC5rzcƌ1$`cBW*5?.5&rMֹk.a*ȉ|#bns@fCCYBAKtEƓFF*կ\\yJi< h\ \/8lx:CM[mUߏSӁDBbfR:+#@j޹Bro FQo[n)~APJj twlr=uTyʆgpUgqQr41U‘k*J_i(ؠJ<_ujխƍ:Xl5׬ `@ 澬~XkwnnLx,Xǁ$׉ !䞣>=` #Z V&L4n'CKJۅL/<?!\sPdׯ_Cd>NG}i}5*?;] ޮ2qR%73FG2pB>qJ@$1ƷWi\U[qԿ^yNHYPR`&Y*"h=/ޫj8 >WO{K #dh#+Si&[q9$tРAq.SBiuXSN9%{8ql\f.]i[H; JApA;~(kԑÄ2OD` ? n^IgiwW _޵сСC].=xcfMXT{3A)O9xI>y_SWU?/M_N1R&9*C`00S8f6D Y0ε0x`iAԃ?{>IQ!pȓ(9C HAPrp9ґ$*pdPקݙn섞wBWWW?vmQDZj^/\YtrrF]uD(J%s1 H: Q9{qO<6'J&:lWC9i+y[4W8M#7ȵ^+M7] Wv0h4)3hTщFO| s9+۾M6$+UFLMXQ";9r(h=Vx'f^g9&å2½uYE<؇b)6% t(1G#()1BWkH,bu]陴~a\y啢omdy_Zu߇1*:I!?yr}]t>ƭJ4D3w<.}43)>g>}5mU#p }:K5iئdU?MׇQ}*Eqe 7YA3fLUE UYL['wp\i̧ݾN`RQ2$"*J{rGpGk@' ]_Ygu|(|eȎ,J5V9XFU7BRwoe\veDmy ?J ,"=C -i q}7ZV+<#kEm+gճdy~G7GM&8{9Aѹ&_qGpB,D@}O&4nM0Zc(%x6s_l]̦]Į*J!\phP'e{E{crPr|\k<[x_񨱳7m G-=Qg xI̎-.!u%Aj4ۑfu)ͷuolI58UZr]nLI%mw-6̪4jdne]ߺճy+)"Kvɍ i)jd}I9_Z|ݲsrrxrG 2[\.2a $$rU&]HFd; $1 M<'wu<#7Y1ֱZ /a^# jνh#:&+[#0QЮ 6%,L hL U!d YB)"ʜ] [`H`d8;i~RNa6vpyX,=@Jg-`D]B{_f;'O[7 Uv@KcnO< yMKYڞRM_Xz}G{k kәgg` (ش>\|I` *U9,8e^29jIik׈exmvNkʻ~{o9и|V/?~ea?ay*:"ԫ:+Vrvg[u\=8!>֓*X"Zն\'|Lfu@b`ӟ_,Cܻm&.M"2\$5*=nTYWV#55ʢgʪWۗ6nW`˶myOC\7O:}̓#8y Pf.ˣ$/e/>8YcV`DbPL8D2QOoh1s1Gk(ۉ(]+M9Brd/"-LLcHC/Np_̠d?Y`%*Aۘ:k0V'Z F,m]?A { ʑF~ V'M-LF\|+#({ʅD8;g,:1q=^zE<2HG6ԬPw|{qgʟ j5Lb5y?X1ҊRx+նUw1nG=h~i2@>r0CPol[neD>nit y{-xN4w%T.ܑ,|}M^'qhQځ_G.J5#8#Tu](EM&r-b{+yt#7We~mkdذaCdU.:cqU##ٶz=CŶڱyGm0~s=C(Fm^Dzy&Gp6 S!)&7")"Uߦ(lt V[<77㎂~f{Pk8aݍ=[~TOa>ya-;pGG2ǿ49k uȂcZ&?ԛs(>Ok9\ծUC}駟 8GlN!OF̎? 1scWDl~!me-B|Lr=i[ۜi|qb\N5,czrG 2[\4ӈF?(_N-_BBHZdEB~]?{`Aiȑ!G}Tb YkdD11$_2Y[9tA! .LJCD6N5\aoO[_o 9"#i4 cs#g}r-a 8$q ~"]r%r9} !+"~ eM\|;rW_} 9pO7ܣV&"$a~^{r-VXqYucT*'탈L(1F;jߴV^ecDy4t0_FIӟh￿s=V/Vǁ AmC`~qlG[H˷^zԒa;~&LA1?O/ go-w%iRgmOV~7<#E]*t#^gGpGW +BP&f}vadرajud<#4]^s5vlmVib~y䑕pkLe\WpJڸ)X:mjzUuE v31=@ǎqyݣxqhrC=FZ[b\v 5~8|!7o=p|<9#%X"Y}t{kjk򒥳rM^KӇS#!?ςURϫ\YTkS=]m{嗃oxB}0KbR묳`˖\pm %{=dMJJkm/ʍ7X|KM4QJ`XҁoIKjW¬pe]}=]:K%a ᄀ%[4VhOee&poGLJ@ZAHIrLJ0]c5&kƉwꫯlVҌ3XR^dYswidԒF%)hfOPWii 諒͖4jKxfvaJ54Aئa+t4lS6[QҋO'mS%L5*wDʉx≰-} e=ṱܦFWK|{kT)\IvK9ն)!q8nȐ!O>$D'aZqYFsYߢayh+븷 d^znƳJUZxCߐUcϒF.\I ·^ "WeyWřd;8..di*vԫo=r1~*\z9# o#P z衠P@ :4Z"GqDfqd.]WZtVꍭ(Coݘ1cB:Q_ҠA*Ѡ-%bic )+YuܗÇWJS#-֏wvEU`6aF ۲ƩjDԈ%tZ$0Up.׹ Ę01=mq$԰"o!t_O@/#SJmz!K*6tS'﹧l_m/SX5h^*-@M'癘oeNLK9,v Ƴv`Ӥ՞kʞ iCR4ZX*^%: ,zgDI 9,X,P]Bu RֲiVǓE}YQ[GYl|'sϱMsf ufm,Wi-:=Ed:$UڞUUDWxgV8@+2EIYd,i}z^>y&݊49 _Rr#K*S}%9-˜Q y,2O9d rM5{,rM߱Rv_E6&맵#˘Wsb{+蚲WI 7Ǣw:KpL0T eOYYr)|3hгpʝwtaMblqEi'6ƟN}K/Tuy7ʚwyK`3M]U')gh7~DUɵ~]z9jKʪgʢR,z,}UIf6[,8$2UYUYd,1KJ[s=+\S_pz u//E~ $sUWqe`QK!l|1!%Qmq AZI)a8x衇VQ.D1".8L#̐0ֈ C뮻Ke^ǐfwbsW/tIOdMVbgYb!TFCXt 70eK/! Q![ygD*t3HAhɄ y$e0 ɟ 2Kέ`Lg^pO4ϲ$L#gQPzyYP:@5@t82M6.GǗe,Zc^{-1&'4Pԕ tIy urJЩRqL"3mL }my?Q9>ciׇ~XJ;62=6$Pct5%m8t`8M)}-)?49&-QZvnڜQl@,ڕ6/ii'P^uchN8gr߈?euFBjM3eC҈ opwߝ:xD^0z뭃76"S伞^zrLo~To$m9l\M֯׎F<_mcz:裏*~䦛|3&5U$x*}?Of^n*a4آVQVq{>䓠cb4lɑY0@_T-!R4"Hꉭ6(unzJsI[mU.+r) 1cD_GD^Q1Q!_PNv"mXN0ǻúv࢝((`CTX80>8x4kIԹ3?\;QUQZh^:"LYvWrE}cXH` vWZEΕ|;|wQ&QE7uWі?.zM~#t/RN8am(0_O4暅1z6%: ^tj.p'-:1Aڸٺ;X:mJ3A.3EǎXÈWyGT?{qU"QQƒ֫ η\/zA]Ŗ>\mOx?Ȱa6vm.=~5j;LEW *i6E晪\ecVSĵyn$4;ʟ,fWfErQU.&@@:":aq7gD4%Yt iש\`+wʊ'-Q68 Vr3Ni޵ؗYQ__:Lu de|xp8箻8 ꕑ徵Un;jսQ~a8yʕW^^x< 0&zmG}r D7vԠGԘ| %#8p"ZvG _cQC:u'2\1]72]nlk@فrY@n=o7:?ir"0t"ȏ~T0-Nٷ~ '"ȇu!8hpCחKʥ#7Q_OM VUD3!QaG:蠃SXjvZَn40tI8L@qdžcIguٍ:=%2!!܎ }o+e3Z뭷gk],q'0nСyYh$˷"ȴu7|3wy!pRK-3R;~m*Z}=3i>Yo[^~jl 0)+֬Q^~#)d7]` ?V9<"UK0BG4hPw 9#+@c w)$j?,q駏)^{m L7A):ݾ|7F͚}a@rIqi]l}ˢ "at#EN|AC}ƭl6lEvWխߢ}7Vv?hExV{h7n\\ls@=!Gh%p/; QBw<-gqFpdY/첁Qy/LY`D \p#BL/Ol+ $c#~pV_}v5-)ڽcʺȹPQ @v@IDAT\.Rӟ$Gu>AYF\sMviP垨Xf!d󫁞x+ʽjeض ZɍT%&l0yH徵W,QG v /o&\G|!Y.L3P&y UvGpG +3s=ev NC q P1]7@iW7N& h2Cg?qO:$Jof-Əszé D5z9Gp!0D I>Xqɓ4/VmaDe.| 9Y-{]4@mP\ 7lz!x'K|qI?:u[zA7vlG7|:<8yA4FC8dM֎5GԐT?vmY65pG/M&D̷[o`7u f;c 7ܰ?f"}u-lcT|N$~_o+]vYbc+bǿJ+I7Ȋ-ڷhml٫ö<+wuZ>e2H9|;ZG }k9>#8"M}g Uc3O]#̺!tIڝ{n n۠ǁb8 hrť+-whiSgtd{h7nYO>o-"0k?p# e$|R!0l@A4Ƹm=sApkkZ>)&dI 12K5J#{ =C~>{(]w]p &҅ W 'lYzBduUWg^ ݶ~`LdLO#} L©?jɓ#Я@ACթFTݯ(x=W/@?፾yDƌ5B~+E)dEO<:,"o TzDo#k%/&`N;-!ַ,Os @a?_x`v(w8I>|goY؎޿]I#Plx^k8RN RJ@L$nƆa؋j` Q/$CR*!.Jrߢ܉ >b[Z?ѣGc1X@̋>bk!GNRH|z!$zr#p}ɩ)͟YJ?Odo?2>E$Le<%are9c9)U#SDժ7F^Ao 뭷,bN_ 4n)yYs5_[l!SO=u5o#tN%wKJصK*\j2aKÇ7U=XZ;~HSM5(Fڨ&2rczGFs ·n]NG;9+2^:묲ۆIxrG[ p-=8<4_,+rȺS# ydZ·z+]aNx$L"_}UݪHu+#;_ypFaGPbOxiD-Xfa_~; zO@Eߗz(,Cng]^{mIGp_~YZ!0r70 YuU;œ,%L1EV!œ2--H 7xCܖyh9;4bH!8T^zI}c 8 Ș>`O#Лt:~x ,:Y pN"DDkr!pU=ꨣ`D?I+仂ӟ4cy< ?\=P!' P . .!xtyz7B!lfeY&D>b%:.5^}G"^uy\ P<#?Ϡ8:tPc9眳Z\UgM䠃D޻,Gp8d}||#n0"8dA24[guX?ܯt 1Q~뭷Q0 *ѩ-*G?'GAV7eB zJ4]9!*^(JVѣg@|NVxj}unT?!F)]vY('B.O#P aȇ~Xfe"*ŸU^ G\uUXTSMq Cknt{."Ea G.EW?ϸ;C(H5b7|Sf}/*<~??B.!/,>ύ#8 C 1i3n_x}Gpȁ{@X 9VZ),+B=s?'zGS0E`Z? "$ g.yJ"z sF Ip |8 u]S|ƯCK F0cEYă8mAv >_@V;@xa0A-8#ATگ+\eGQ]zp p6eڹP-Zjԭ*2zhq0j*Z"s9' V^O~A{5'|+@dkn%dB.V(& 7#G`'8i|׿5>Og0H-zb{nT-\ӼA#',mJ8U?!rKXDpY:"$D9Q8a> ê_?ۓM6Y!rS&*O#P'oNE G%E" - @EKX|{=w9Pe#zm 11/!b뮓oY{ltI .`wڎv{oA"%lds# ^[RE ky.'Dh+o\s#r睏 [τedM74879v0DžsG#$x=|08bǏO  akKVSYe'Gpz+|Л>}ט1cN|)n'8'8@`ۋ= $lgEL߂ NDGk^y`>{A`<-;!m@F>ݷ!/bX1!q\gӷ7/2ȩB/X E>EV|WĴz8@Qp"ȢޙD>D-/|N 0 v}w9#BL'AUi;/Sa;CN >zk9 ]6@%`@?û5L3g\/Ap;QXzagxɢ0RHX җg]p;# _x1!ѱ-Be "!$*hF#8@+`2p}Nز{##3~p~peYBG?2Ϥ4LUG`PEx `8BAp&O# Ouv#Nُw=6}"[z@]4HM>S)jR2(部\-_`UXB#?s+X@4p!\W>n@̂3@3{2jԨヤ ]:p>r'< {)#S-.%!ס廍PO~o#8db%VfzQ.tz~j?(f1!x?<ȵ˙_:2/SO?} 5GwB?X5AO| Te|YG8[o?:G[`\r  ~[6hР0,n,NBny8݊Avѝk/QQA*]Ъ;V=P93c/~ 'p򨣎s[IK%U=Q j0K.>:(Yv[9ey^H DEa¤,J V BH8!@ !$&f- VJo# |w^y ?PH$;FV)"NhֻNRwy %'yG(NYqxLA،HAbL${ ~w~n?"@&Ͱu2?0Èr [n0qx[/~aZOD:ըFEds=ڄl%Z+UŭdAkfġ<7T$ȨQ> Ca, $GjTkO?48K±ʖ>Lr *@V\qŠmsr#t=|SGxTž.>_͚A햿Pa^˂'G_nrs&@>ȼw@B|p#Z<$ ",R9ZОz29r_O@ iswu7#1vfÏm?&i&vt3w:~lco6C&|vHkbF_NbvGh/eskXQ$яџA\|ަʯ~ȷ66yͱG?%cϼ-Q|<9~9KCx~GA $y~!8݃5z /Z F c^~ݭ'Gpz ';z\Af f)0=#s .!HL}r ;S5Ƭzj ġy+ 9 ꮧᙀ4leO!Ecc䯩EҿQ ʉˆe晉>:H03\j4Z@&%9݊h|Q0O.D(LHx3<Bw#<净DĦ"*r$Gp2NO##?A0S@8^0?dȐJd?~E`?8`bJX7#f!a@$9嬻#S>5v!8{nq'{Vc{"[nY:|%njuz{%sV߮WElq;_*7$N"x*.sᣏ>Z%8*:AC`G#[)M77k0š2g[r'"-Bʌ3'Gp ,c2=C!eF ]Іͧ?36diyGlMAa?r9s'"`;4<aD>($P͵ծRԦV2:|PQ #?d8S"@tW#!h@xrYf ܚ-4LN@нh_-Iӷ <#Ah`$aO߈O4}+DGp"@X[_H~[$g 9Fr[Doѓ#texw+99.d$ggAω^`m_G3DȜӇ=!ϖlݍENz~>Чg\dՏO_=:(^ 5 *O9@n1fm!W_}5fd@twk&{B{Ivޟv\s%UQA 1 nV9&f N;$?e{j/ hz-UV&#G~ƀT4J9|UQSRDAB (<۶̪I5\WGm|b^[>@9 ǖ&Y=GVsDӟD_ϯ8@!D>\!'e5-p0C1X'I| maYyI&[ὁ:n3b[L2A΂q9zQׇs> 裻^cG] BnO:\b"ܫ~[?5b.,T:xȆ@ܢ}6`_Nǣy6oE,j83f~J 3 Ď%(.i)lWU:@f tA@K b%`@ FX"3~#8i(yq-S=Ȍ3떉- /ȪIXh\dsy.'R'_q:|Pb9Q_dY`jƙ_%lv CYd^0j9\^XMVL AdE0 ES5%|%g0,#c+xRH\~*Qi (*p' Ζ/yHA#=|',^rG0"NLVJJIz*g^^Gpz'셻mpA~&Yc13 Rp|fF#Pu7Jx)!̸*" 8Y$贞| M R[S\I/my393foɜ 5ly?^rqu׼f=vw$GpDIbƠ6&(? 8'+J x5Ijnr.65L2$AhmN>/'P6GrAς%x6Cx 1{tE'#9Nj}EraSms<p"1B>1>[dDq5v^7N{_SnnI&D:9_ۯž yK4L'98yGgcQ]~bg;p  s0].ȢBx@I3drl߀D*sZ$6l &B~YJ S=/Ȼ!#j$!CtIY-#6=\$HTi ;K"crH N}5'Xg򛾶a18gBIO݉*3/l 6?v68K3G̸[wn -HkfZvo~/fOMP`{!#8#YLn撱nc'm댃=9EB.Ym- uq¾! &9˼1jk#bO7=)i?/xGZv5xp^{j=w%$y lb3K<0Y>^sG(NYG(C(? 4?p`p2@ x}Iz#VXaY^-xȉPYt- F)܃.G3τjYϝN{'fB n,Ҳz,{Y0b閄Q?\YPk5&:dBv )POG@Go~bB!j L9_l1>+`p8R)đ&1*fI.(=9BFrar1lrԛ翚Uo-ܷw:'(r䑢 8@" >W 'CDo#Pɉ~'?8e0&F_f|d~[ ]#^!FVd9:MRaB"Ȋr{)PM}D}#ЮBKd{:G` 8@s"H sC}qlj;s3b| HHW9O{EA$#a,!%tG3[Q!2}gN<)@B6;?넜\jQqnM [,{OvB d])$uGbd#2ISv߯;̻js8#~Yf ҦX6>&mRGtn%iϷcóYilr>NsGpV lmd6&N/>C1u,_:u-}~+evm,2-fqXM]2$^n}ϊ׸3s76˩t 7,g;}3WILGqa}z8Dglc:s3x.=9#'l=ƹ_aEXC; |>w}92)=Z`{gs1eh[Xo-tȁI^ UP[| M1!r+: >>;3<=P0bґA",R BnuL L3&4 ,!5Y9T]c{yGHr_s4"+T^p2;nsmhM2'|2̰3,(A%ކ2G2d}5g1(uF΂" ϧ[63 I*5 !-Km)ӓ#DrH!8#m2?<$GNsL고;"7?sȰ&9\Xncdr>ًΗ"cD6Vl3FɄ^&U vOx˓rH,p d\X:Cx %Uy C,қnl^L<\1E2KBYN4d s[8p2[#Dgd_}}wnqL=urwӇWTK|}mullىZ|[c?aSQfяL~lA0&[u[L!'<GpGhtW@ iL ٚ8GdBEFnAab屿,,I^c_z.cXuU17ȳ˷:!׽9+9@և}F/I\Œ;Gg$0T;ozn?:}%=/_غ_Xl2I$#8E ;SW?2 $E7,i]vl |F=X0@iCbr,Dd0O2!38^8xab+i(zeA$Q6C /;tٶ&[fIn :9[:([8o}~pm=-ՔPldTMdJ͕^y!ݒrE"lW^#8 9? #PDǘ.}=7}9&rDq2YwXgl˸oc^&x\g kcYxIW7&g cM:zZcN[&sO#`῭:3ma^٤pjh)Yk-Ѿ@tޠp@ 9hٯBd--{SNzQކ@b8 #D}裎Q~ sepBRco h2w8G@EL^eB݆9Zn#tE1#7<+KlGw-i&?%mb:!%A/dsh3 v}9YL&r"#+`Z{rGP` #t^XdUDV^@m/ `_@W//#{j,2lB[-!!o}y}|m=Nnɭ]mmic}78gll=cmeK=D@?Ocv,uvul3(Ǔ#8#8݀'cE.{:(&S'#'Nxen%M^בc8^]&3<,#n<^7ٗz1׶&^>x QcE&$ ˿I6ybv)Ǔ#>|o$Yr5NÂrj%WXnzx_غl7}L_XB/#"viO: ψn7{ak.~O 3F!s?=9#t?Nمp6IkjA AL_*pBxiDrc 3O%Ǹ蜞:pyx͹|=Y{γ`ϯ "r ;D G\eCA%5|oO}* 8۠rLblg;vj=zgOd`LbH6g ?MЙ`Ym%N녲EdnJZy5J$S$ٺ)Me9e{rKO<59#] 8dw3##d9\ēfƘ87ۺwӲNwk)ƨ:u]Ɵfx`9G;64+rƓ6;0>O#%a,rz 'm"HYg-Sc챇tOryjW_%@sCQH@r(JS&T&Yzib Q|BtHtDI Y D7&L'd%‘œ+(>2$8wlE ԸžGD'7wv ,,Lh_ٓC%}-ܢv% IsRM&? nk6<7ܗVXA6t@ }z?%dl!"_}^`RH[Zh!@SGGh7ݭmLc}7֗Xn}Got^߰>&/IJ=vyyeȐ/e?mH}SGpz's2hȥvi^H4ƾ+ؠ`1%dQ@F>9 "2O΄4 <6:OEȨ>Bˢ"Z&}\}2sqv>5{u@C%92a[Pj&GIN^maE N,bNO8aP}}pHlI.|o0d68Sn{E~O#P.;>x|#8@c 8dcю#0%XƯ6ֵl<6/HvaSzw1i<e,icP83sLԟcG6?^{'l/޽t5U $D'3\&;aSc"/r㍍G%e9yPO8oףG }?_p2d7b`]Ob]"%st9\st-zjEgd:!Cf`t#j9R7?\ r"/P&*m21t;r#9$MVuM|K7|󺍣/5rȯrvxj&r[n[Lp rGl)m*Y7۫!8v[$|7u ˭"\O#8#8@ȷWAn69_ (/Voq\7uI[7yںȾWMg#o\a@IDATE>}o*=ȱNJ\y\smHvITGܪ+z#8݄Av݊zy"?qyRu]Qa#LGFp+#C^Zd 3G<ȏ~$ӢDE9%&cl׀u@E^ٸ"Gp*0DUM#t &"&lСJeG( PvNVΫ^wc~Oxx  9YceD^y1hֿ(xk!sD~[HQ^!CjAB#}ᨴ#E:tB]w>\d_#8YPAyq~XԑPd?B/qq[?ofUpvxyI1=DओN:J}ݚ dj{o @t!j˻\ d/*3CC6a2 3Q$Iak#8#8#mC5ƈx2i<)w=9#0<Ymc!dK.:#8#8F@} C0̓#88pmq}pGh̤ء er,1>$HtXDU!!0}wx8#j`CDN<lt]D׃5N;#o|moN9/rwzW^)F~[@/ 1ȩqR Vk2bB+ I40X&,8hx_D;@`HG{rGpGpz'rPO#8@@!7g 'l{k\?P~@q>&Ç<2Kﵵ-+8d+P3g"W_]v47&FsN \;01 ԸuQ{5>4 4͠ɔ%^p"t1TSY~_kH!7|s|e]5ld 6P>gCAw&VMDR$J )$B )Q'$!)S2"I%~ "$cg,TB۾{{Ϲ}k}>g>uP$E"|7 ,~ &( 7C{ݺuA\MOU<2+ǥv8UNƉ8$L`;c%QB8dx9XW\JE[E@D@D@D@D@ʊQt{nY5@[Éyc7.; ֒SE@D@2G|V~F>)ٲeέE@D@ Z\ Zd倯x*" 1 0R'? F:vm?c sX'j" 9D|_f|CWQE@D@D@D@D lH2`UD /,] ?@/!Ȓ?):LX=E  <|`뭣Uϲ oիgcK:_K7;3ubBJ" "P*48< ݦh˦y%wL7_/\~kqo|k]vY$𽤁SR(h8h 7-S~˼EO(q}{)$PNp:# l2'IqO>M>,iK" D˼6ߣ86mn*M=o~&\OGqx=3ed yz΋.)2MX[BNJ@ -j+ ZW^ \x!p !>?";W" "! 8T?`=8`_'}`K@C79~+G2W&O9$oUE P|=WthfܒPKM[{ 7XWtRcU" % ,t009 "" " " " 9@@B9pTD2%f bPVV'(SB%tg|J?SKW?w٥t#@:kQoR%꒭%ŋx*mW_ sm.`ps%H,s&|bc E )Txw/#<{],jժO>9s&f͚%ab)%^ٰaC A&Ɣ5ה$8k"S0p@C8͛7w":廡Rr(+t |CR$W^_d5*$QT d <8+zH7`99s|{ɓaBdŵ頃epeᩧcVKjS $bv?گzVM>ρ {ig3(dh(LrP>%K`ݺu)vuWMᄏwfr)_vە"C&3pd_xZwߨbv$L ##ߋ[OHˢD@D@D@D@DXQdËE+S$P?x9} {  # @^.^< `q~YrA,: j¡ʊ@ H2s'?Q9{/~-J&%ꫀ٨8ȿ,,:t8ktz ,0Dv(+G p`Fu$" " " " Q# !Ȩ]QGD.sdiIxdk:S*R-$UsAמK&C~ZܭSB3fb|!t9t|8=b("8+Q#`Boy%n'\~{ѰaCL1c;.1u\T*[,gmm4Q樂:k,' ywE )Ia8@פWc+ &GNDAO?@$,`/6ޝw޹8$"{eZ(e me_])LE͗/_G/eVL*R@$&SYʾI##ˣD@D@D@D@5'5di!sXl_{/T޽;@R%C3x> jԈy6 9RN3ͨQʕ;ZE 0 wocF)~^wFf"zf^ʾл7@Fg4q%(Ӌ/ T* R9DwU+Q-D@D@ʗ@hL2EIXѯ _(i$J'@!C=zvyEYPoq"3,(A8it`Ьб#pzKLP{@,Y<LT eO6^}U5m뭷@v s=ի6xtB$IKwq$n kMwq̙P'MQFvN0cAσ쳏¹iѢE0d0=s馛/'YL Or6lJ$@CNn[6c00dX($y%vYPl2b I >OD@D@D@D@D ](FgP\])38F~-jOts̜WDcQr0`X x\4jZ@d9f) }lqڨD#{ӈ530鈮]rC3L^]U 0E9V-㵧5C&NdY9D@D@D@D@ʞ ˞("wVv_'ND@rGqLg@- T>]r͚Tht7}:K2j͗..:`,U6{E!Hŋ~nYKN< ByvtduܭJ."!s}Dz'^ilx1`| '|2:ԭ[7Aښqm8-\ڵt4mFQ?lƷ0йsg{9[ourj~6l&^ y1d␟| z-x6f\G?01 aF_/ԩcg,!p 0o(^YR,CD@D@D@D@B@BiLD@"DvPTr% !Ȓ_?6ԯ-˕K_h6@J l7 U ;EvW5j8 AvaWX;X``0qc epZbJ q〻25vR(voGf0<$.eEwTNBE\zAaSO=6F۶m(dG{{R:(ΩCNߚ'nPl|r_S+*ճ(F@)@t ߎSYڲ0 σeQH߃9 hSB@|-oX W+O*UA6ԛO)d! eURD@D { O夓Z+`.:Q^h*Y,D>d,*hGkLX0'SgP"8#~g75iBqxKO6 e1w`~xXl`@PPE@r8P+Q(d""柊Zґca'#2-UYo.Y}?F"@4bpeLCoxׯ%Kx-Thӹ?03KL" Iئ[)|wR=4h1Cػ{Y^vMBYx]+R-d?ݴrJ<&B=w-ZSNnqBʈ@ڵ=C~( "{9,]U:l`{`wvŸ("PBf*aIN?6Le}S7d y0o8X5j_U\%pEKA pYڴ7. #p'jlPa{|N| A~'a)-!H'd͚)M.m}_xWSNKRɼ3R$ o3}[Jں^}/ 9*k$/*scO? ԭ \z)Чv`UcξU{93pעjժetv&U9sfir&SOuf|YL6#FX@w}MRvQ8nݺP(@Y9xVR%umР6e@ȴ$ q~p; pQ=Vd "K2nq3i]  7wl&sb,};t<8(_{3Hu ЯPJk@{EVh7ccUYm{oQ:#%@{ .>8tߘBAZv-zz:+9n5;IlYaPE@"@ओg&wh " " " "  u#@a &ēJJ``&| Bh/mVt6 vgrQ_yRʕ}}}޽oCab<?8}J˔6[ڵ6mH>Y.(.W_?o^.eIKG` kSߦ +8Qn ]vԩ۾56RJgh {6oM3@$~a'*n:'I1HB"x@t Ph"2$}UؿD/eoxEl3S2 ph]B y^E'}u`r 3* 'O,yB{ .h =Y3O "^xl}-#Yh75ԧ8 |f98ˬCg E9Oqm2Xtw0lL(&Lu]:u lٲH6[nf͚)\?MYO?-$9qDa0d ٨Q#0O%EMX CR$‘E[UtU4ߋk0dQH er] Yw-" " "-}{jεo?8G d~K/\A1s1UR(%3 hqu*#Η#Lz|H Dcԙo"r/Lh_mؐ`)j;b.@v5oW^1c`=,~'$:t4+<#yU)CzQfhTeHd$/*%"PBK)j 08$NM\9ƈ$L(0%OF.*EoƎߛ_Ǥ s4n LcE[w f~崘?jL _ :pܹz)py`;^4%NǕ 8Ѹ>LB?k-D;1r Cf^ժUCǎ0$z/Hoޕ*U{puOiftfc#SL[n0d I*TGS4`[7]’^ʟ(,s^ŋ㜓MnhST,ebPx)$" " "~2|k egU4Ə9çSID@D@b` ?2`#u9a!:RE@D@2IH` Gy&5̍:=8p!@zQ^RԸ'aEŎFBm۶g|JyC`rgOil\*Xv\~UT"Oc|cq|#WX ̋ˬJ$IMID@D@A|֕JH`j`-JxpF' A&X]yj'{k6Ŭhåvi'xg.R^ hwZ U,wG֭9s9 z~Yg_5ǹqꩧF(RpQ W!ELzﷲEС:w[m MM,w ڵҢ>␜꫸EjժUp,!|WJ" "PnدJ1@Pd~J૯>̉tKZ՟<خG(BD@D@Jo}3tIkʬp(qsm3$" " 1 fb½{zys|5nAtb " " i& !4͖M`T㲥dSPD@'@1cC}C@ǟm!bDN @cO@.ӟ|IfzW]E@D@D@D $kN@B3" " Rjh㑯Bm"!$n0:,'0{o75AD@D@k= AVhhn(5*'@gciMD) opNN;- "%M`v’@}5飴cT t싻^tp)OjOG^eA￁aÀѣ_;řyW]umւδwF4FjSJuTRZ3NsjS6m VOa0`tB6jԨgҡN`{t*?XHBO{_ex⽱)s "wygl&cDN$6 ER9)x?5`~u|?3Ӳ@n&vE><ەQ~{_7?@͡$" " q з}8/.LaI@~h@Sh3dдi 2!" " H~a&M .'̖QxsmVZH*d%󁣏ڵ&N,$WvСCqW*Rjrrv0 \w:sb" %&@N/8eOE@D@D@D@D 6XBīE@r 8 ⊀aN8 B,Y^5+? Ɉ3*?x Z/J>#< SPN%Ƿ;3RTeD ;oz:8,}n>zhPN)j[$ʕ+3Siٲe4+Z6M7d()Sp-zرw߲͌)\?ⳁ8'|I&fX@$!-2E@D@JA;Ob *9Z̘ц @L $,5`ӒB`8X6 7T@fR9\F>X&0j/u}mNID@D@`{ن@ind#![{6!V)'0BՔthۡCN;' NY`+dTh( ~־=LOVFtݻwwQ1/b`d<m38'٪b" "7 <pI w" " " " "vmO2%@!H:r(@lQrʿ|(Yj՛5|s A&sW%$?z/SRP䧟~o/!]t{^xN`u# @ASFʧ֭= O|H 6tl*/8]}ɓ`2N򨣎{oF@nfZ"veӜ‰"9( LӦMs"UݺuC"&eH?Br_z@$}P| U&@͚9h_Pogy0q=D@D@D L/}8<M6u/h9? }=\w?qK.'ZD@D yl al8$S{ (L'?D{ Q˴&ⁿZiN{ 4h5jTNt2ЦM}щvvHHRnSm.p#Hף>"Zl7ߘ]8cpثt3 ڵ3#y 2}1tP;9r (R|fjrY"bьv1cd|ɞ@ϤdIi(_ )&0ǟ|yju^dbjϦ9fo5 /XBLK,JhgNX-]ԉ` fK3цAwn ={L!vX0ؽOTWO}O-fIO+{ ￿k{ϔh%YT A<}2l0>+ G*OeV(.b̝;_}\lN>dT^;vă>˗g-)}^.1e8p3i0, M7ԉ<[}NE駟g:C94ժU m۶5&~'f͚~$cJs ZI|k\ɦ+D@ʰXе+py04G^vw{\z(}>}|]w7Yg(+~^:@ [f[O=S";8{8U6 LZ)861$n)Xo39s`mOXG)fVƻKt" "G(K`=g˚5qMl72Ql멧ʘN&ʬd . Ve|ݺum`>$%%S:RXɦ{wqvdd;߰h}:.Ro߾o%;B3X3+8T O[0L4iRxe@b ̜9~h(-IϤl*GY0<3#}u>HFO&hfk\~&Q>"'֯hyRaUSD@D@ǯ%gC|!ԞMU=)\Dm@IDATbq9M4rx_Dj{` &Ogn]?ϛt1^RFMBnFp-Jf;PZ[Anֈ@kiZP.hת|j@ LuG۷/^{5S\P3z[JyL9>hERy*S{T(Hr#_6mpgyp1?܉{v>RK_~(V3ՓMQJ|cHyRl6͟מ` sժU3QC[n/ot.BydڕRWJ8$_rƳn3tϻ*c{_A oԨۈ'ނXD>'~}Ğ:Ա;?2 8}=gjX&ޔd*oi Px8NiSsg`޼ YؤQB:LD@2Hࠃ)Sɨs3u,ۍtn0XW;;{'"C$C+Ezk 0í#G&Nrt # /zx/k)32bMCu4H`#=(I'F=ݻH"o&{ӝe#;+M7ML4֭ۏBc yqOCBj@*S>h؏#YLʲ x lPN@ "/cĈ Fee4 $" $,1'" " P,T}%ח?ʧ"lRHɺ\IY͙GRj&P٢V^ AѴ;$QYpN,aR܁6gq5jT։,"; htڧ1_GzDAtl3ߦJHvGq ^>n8x>%w/I"<[l˺ک?ut PϚ4sq'q5~իg/#0[O>=ˉ{wQϗe SHSM}݇ٳg;{|87n >|Qtmwܽ9žy> ndٚoY^L2(o+"[JGꝰ͙/+دJ-s}/I1avE 66{w Y/@iL:ϚBYxtLG@Y`L)kJbh?B1>O;׷bNHcS,vGP,.8h6CM*ۢH vr!`~N9jXAr%ŲHg|X12HJ" yOBC ŶZ`y!#UfT% ժU3g,/٘H-/KN}4-USI4r7#`g'8Ts4qb„ hbȑYmmʼZ1~V  ~3 cO'iӶ_b.b'Ν;R sB$ϤKO? N˖-A}QkD X^|\**" " " " >@2^ $>ϳ8:}مkrXmXm#F h0Lu?i77K~\۸k׮NT7d \N#C֑*(" " L`j:gs 3W6 ARw0 g_ll[8SڴtL>llfRŋ]͹L g[t nnرXv-طs)h̨y/hG<5` X:L^1I&>&n?q衇&eGG{LEX¶NE9w~ D-0̌ ^ ,:"}>t^o뜩.6|&Ftԩog}f"7K>w?Mocs{0n+\;6l3}n{~W_}5ׯj) y!T-W6l{6%O&޽}㍛RaiLc9C )ia>ť+W:_7|rK?~3 %L#XO[zmWx QԻ~NV*$I{e>K3Jܰ8$"w5O+𵣿շDpB fqkg!<3񨽨^o>^A+/M7f͚9_ P8;|+[dĻ[PnE@CmG{̺U Š=BT .;-Zy"%+4`4h猱v|FD@M>ꂬ1o\Qw}׍kӡC'O?B mmEK`H L)|h0njQI>Kԗ@@F X.8]~Uͺy/,=u,^uϚ:4٨Q;AMPD/^v" "2tI[8)eX3>rE>} B{<{x7JUN(?|8+," "dztR]xdڨ:˭sѭݏ Fz$&)H-r8 8K.ꫯܺd,g=tv W\qQR#`_&x^.믩E r9gJ$`r#uX)sQ!`8RqwӧgzA˗/wcK| 3xca~whx=o`u޴i<Xerאф\^z饂r$W+9;-G{.sLX{&F{&ٳq|ˏ+cy`|n|x-an]2;o;3lwq&kD#j`DZqY[^NnSHt}Ëo"=qtnAJ*}L3s6wot;tQG ^ tя̂ xla\!%XfJw9{0_ϻR;$ڇymo͞ ~=syƳgg>rzTyg丹gͩw9njc݋{뭷궳Li Dߚ ~|/l5h# yvܑGfKu'k}Yw +ypdm7bi=>>MTD_u9Z" yFӗx>*ٝ4rR) ♰X!E(șp\`v I Q"_`h>} ϙ3MC&:#\|H#91Y9'Ab98к rSzuϢ ^BLNk!'y7Ǯ2;h@}9#MSLqj}:(2n0hb0 UЀ>.Lt^pnk"E <`SÉ\6o2;;X3; QG}笠gR$aQlY[Fx⿉~S<"<":|hL*HWngP2DcKdMG{i ~2carj9>1#}g|{%E"}L$}T."]v%8g2jweA^Xd- 3> cs|lͼmtF@$jn BѾ M5 #3%SศOx Tc'1vwv>w[oA.'ۋu-XպukA/ #:3QH߇c}q¾'87OoMA " %$`:&$y?N/Z5 1E@,.:LD@u[ ?ܽ_zl4nܸ``;`$-߅BE=G<{0` ?Ǜ6<(s;2R)Yzs" " -ȶƏ,P[c?e;1g&Yۍxib_)KiA@PcZ^ /pay UkO'lb 0^z9l f>ȘtKfQOxa*ڤIX X7`Q50|^>`ѰAQ)xn&XN:;?P #G?^z<"qGEǎa a2lft h {cEZteLT>I)?f=cuD v2lyO>}N&N^{ fDN; &PڵkaÆK[oD /nyw%6m~cq8Unnn[5 bsowܹjI~XX$>a22&o%x..xuy u V`]?~;Eְva y4uZ\!P"} :ԟU˕" " " " "̙s<֭K*cijs={o2qJמf=,̡3jk&7U\Sp.E@C`FJ" " " Y@?hJ Ȃ”C VX6Ϛ6 A.j$gŶ7·cK|:s<ʕvm]u-n?S~7|s v3 ,4}Bs΅ `ĉ8# O/ a!M{=, ,P %"@'Ќ`DJwHT*aNYڵ})D L`vg}^eϓ cҎx„ 0ø>lO2ca4>w.RXtg#O<А領GժU3SOŚ5k`0s$WyW mv6}u^C;6ܗ&w?O!Q h1Q?+vqGw}0VKÜx8Ld&`Z0͘1zku1!EwOL3u˗Uh~G)9a¢ X6t~]}_A85ka&փ/=`DWY{eO?ӝ\fO=\5" "ll_am`={kZm;f;' xwq~S(z}8TCO? |!߿yYw['.k}eHR{@hdazGY2hл7]%q<P6m`6 $_ ߛn$f)*(C+@Q,J$ 6lx]J)367Ly(,>*Tʽ+$Q38sė@3 6 \p[.E;d:tR9hH,>Z$'?.K4a+CC`ӈ)^m"/_쏃LK/CUnm.31;/_^m`<6D I4ȋ/,_~Y }c4X幵pMQmvm?+]a~{q3)Tpϥt=XnPnlرc󰨩UGD ' k`Jߠ?'+B%5k|G@8ON Q2mEۨ<hD!m4NsxԩN>@<.QmGӲ@4 P2+TD@D@D G"ϒI؟L1yMAA2Xl@ds3}{XJ"PiDEmQT2X̋K2/?|.;-  ‰}Lk9>iF3u4_hd;fc }O2ꫯ"pdAB:JnB;gf?1edyk9prfs3<ɓ'o߾83ЪU+t p )GQ}٧ Dt^Ȧ B?;_nE50b8p (>R%Ls28ˍ%s-Q}KxH:^Nn:chN$Nno}0$}/(9R(x2qΤjSCΧ~ؙmxx:}krh." &@gv0毴~2 h1 >(Yt2h%+ԉXޡAZ=XԱs_㜅߆E9bCr5s"|V3W\\|omzX1S}e㈉PD@D 2ص0M`<nٸ}kUT)ă-[L2؀*@ 6Na_afaiHjh pt:Q1ke4#2S5 TߦgDuh$Jth=㜙*0#_N؛;ug88|ިX/FcDt/i)\tnvrqSZYb&B.]ܜ'ef)b4Q&06ŤdGy%r^{,H ou_7n^e:R 3,dY^7̝.'(O>(h(4n!#_idU4iDIrp A\," " " "֭(irSKP3 ASO}&MБtط/%j;P sz" " 'A&A<48NJXjڳ%U*J4M-M$YP~1caۢt6+{HRPJDv}1(f]jU 2 ~0ިQLDY%CﴴxP{5wX'X ӮXԡCp̶[n&%Mq𻍕ors&1p'7Q0 =X\d'suǚ6mw{g. mڴA͚5v۹{7|il&:S.y'xٺuk'J!)S[ښu~LWgKzO> Q#x_W^ kaliy`W_e_D@ʇѷL[oB={67o^" @Yqg"92QnY:Բa/vY3c.I,(YIlylil\D@ʆgqL &b . A/9Na ؏hl&Og_{5X(ʭ$" E l\t' S/BjmØ88xk[zowy{ֳ8l$8Ɉ )U=G4 foF'٩S'7hȼP"gfLjK.29hlx|_) pPlLl4q]dKaq4{tToH44R y"}7g:.-2Pg!I8nݺN.>>p୷ ㎋b-Nm+\wg?>#>c egСCrp8A6%Uڌ{jUn<`56*k+G,2ho'tEjղ0}tdCR6j2}S6h;_hBBѸ@dP@3hk~PJlmW: qv% jY|a%H>Haۢo lPKX<2l[өq&M! /fr%/bY&:)a8^YϡE nRdIGhѢy~Q^g##Ot& $&tF Ʋk[>l)/{JhV[m=4bwwB<|Bw<7/=ٜjDj2m5()v6oɓ';vEիW#2|O3E) ^ijSO Ri<ڵ:i{A'l˸+}h"ɾ۷w RFh7չsg܃D ; j"Tp-[Nh֬{,.QdQB,~oܸ3j'ዦ`2䱷Ӣ9P<(•|Eh38!qz?0\< ZnMrzvP4Dqjժ\(LbJ#w5-Q/O 0a=#vaT3bi8ahdBTŝ3f஻r*neD?WfVw@'phWRZI~2L"6{.ļ'L0b;w4d0+8[$$@k;%v߭/I> m0 {2mxmTAmtاaldžS~SnFMo7E@Iz\d4j%" "{@1jP!H %YP{6` 0 T &>F{':t1(k¶ES6l=XgO"(s]#:<҆A&iww⪫lLaH11,O?܇"Ǐw"'pI/$c[=tߴ軿۟ l2w}bief&UN&@l36.XL-eiݰaC l=٠FY:)iڴi%n @EǼ ~*U Υ%@{wC=mP9 څ߅nNEs\&M]9(?O8ѕ#VO O<|.5ya͚52e1w!s]q\t=>ꨣ '>E6m\~w9iޗc,l}[p1 pw}ѣG9 .4;R*љ(nvkWS'„?D!R 4jpLs|' m h#NOOoMZl'P:p衰VaA_"ٖ> & m l?q’lw!k;3ul9UpCvڮmx )@QŽφň[dfPblwt2}e;Sωt>@K" "[\@} _ha-@ǎ~G15f8~~1RL8V̀3TWF렃l`3-N:2`gx+DyJ3 uk6xjAb#go=`g⣞*c=3pLL3n^=؏)(wayN)M?V>sWjƮO7^5^;:E@K`= ̄[GL2A J=j&nb7Vb/z+z^$#o_8"@5յOM@ِ]Sx\8z <3NhñpmmmhƁoi-mzL]>y^9K:ۼ&Ύv\|?|gL୚7"cIJhPd3gΐD iP"2KIRi(Dۺ;s=s~{}^뻇ֻ,sa~~B ӧڵkm36 !v5O{{癿I^ނ鹆*"@_L7ܐ3F< gPyFA  &?n od"tZD>my&֭[0|q3s`+]h~7(5&s=3Ӽ:x>mؓF6lx1͘1#~ M>?&׼y<>GlqL ? zh 䟒.Ν;{c/6cgiϔVD@D ڼ?ٷ3ٷ޷iwʕY9%UD {oCM?6 g« خFgnj 2dɬm"M~ pנ0ϗH ZM,G>|lp^M7le<*wG&I2a'v>{ZfS|`F=U˦Պd>sLoM* V=vHf4tqIsH)\ܘ4 h6%`+5 ڲe~'[$k{l V{,X}5?k]W\|5|l(" ",Mfmꖖ" " E#Ȧue{l`(ʶMR xEmҹwJv&pNV\ `M>+fL{RJ/[_H=ʥL%\5JoXP~1O407d|0pqw/ӧIaLر? *s#@m&e+lE(nhA2>% eA"PWf,=z|^ &kaHYWW:u*8} D&w~_/?Uo.CLLL|91;1-ՠA&xҥKq!|xw_v 7Lȴ@xݻÄt`޸3}+lJdx?mckBYѦdc\<_1FZ5 4i⏹k.IW"D@"DmR۠w7taС/"Po<` E_k/I$z!|u9 }79 '-thb$ f*ߍxvy." E! !ȢЊбh.ۧJP&ޭmopi͡zGժU z~qD BL482~ 76m1L%`)Lqi*d%CH#1z*ҩE@D H2 o,"@Xɓ*s" "'L "< A&JG$5aĨ.[oO `p_ssvL\!szxcR,s8T@sYz#lM~Ck7&8dve4 [nQFD@D ='K[AC _orYxW6!=;{6p@ժI&"3o?D 7!pef1b'Vd;2!)JC駟6 ֭O q2eM&1s aÆhѢM.q@E! / fa3J`wmT ;~7ȑ#|rO ;tRnoޏB3PPW5Ռk֬i">ax>(Hɠ@K " "E1^oqcNJqM]j@IDATJ^lzl " "Pb^ X _3gV^-Оjܸ1ԩSb>:Ag3rM=ߟgh?/K3?7O8XW>k?cl"koڵ @M& "  P:̬o[!G߉l6)Fg7 wF*T66~xr!q~l' ' NF%K~p &)bd?ؘY͚רq9H8 V>`Cd<̏sg_9MHD@D@2aн{ HI&ZjXbE&P)H $"@UtSsTߨZ~SqO#l4b8x㍓b]@,oԭ zv;V|*.]ǚ|x hAQ?jïsk:!5*"'N^L-.a? %:-iƄ!PS"@?oTu"B,ŋc=(( 153<3Ripmy:ds!N>XO{Ҥ&|{@&Ie+@ǎS8d>$>ׯ.2OP:YG6PYY!.qED@"N6Яb&hd4srIQ֭}gof,r9}0g@ ̘6lOdg>&"Sn]. Jd*8x]35J. A.o]MD@!pUGNcD@D  ;L\̝$#Kn 9uZ~c/!s7H6eܹb#qA=zOG@ "A2ZO7 N 9}E_bxm!'}"0Z[<+_|ôO"?`]v1߬w7KYIAA9C`U&*OvZT^mժ3*iZΝ;N֋ c *U nj]J@Lpʕ+׹/zj\ oo׾{BUL*Zk/Ԯ]͛7GfРAԨQÝB@'BrdVB_ V(@,KߌSN~8'G"^#Lᔢ&L&L8svgaX?ILRhG~뭷@ڧ)2ܢE tlq{aR/꫁McF;E@D lQ)P2@ƾCG w_'T8t?kD K.E [|,JZBǥ$-" " "@biɸ%^,'tW/1݊#d j T +$Q<78XB^vql{XKC="P8ePbŅ#D Yg4rH /S@8I',$p}{BtAhda`( EAʚT-/49! D$/_CQUWs4 mlCmsO7!`ň7΃c=\k_'</c2($}})*ܞz*n@~Q|"m63˜9s~g}u5QL,̞}'u17X D@D@@ lBB6)uUk_̛&4b4!)6,J<-N]kG 6%@'_9;F- ,X̚h: *@UD@@F@p{׮ـ1J@.d.]MD 6^ L!@!Ȩzk bذ6>oڻ@@ϞA9@t# KBO[R^;&(|Ldg@^~x%z}+|ZcOop;>D"Plޚ7o^_(JwB޽{6i ʕ+{˫Gy%U19q 'xSfa\Ξ=P$.^MbR,v}NDV@fd/L}1s/ iU)n0aDF}̸J<黎,Bm6(ҥKvϓ6sҥa֘3<+#+zJVXh>ꨣe?~' 9z ;fujv.&8L}" G`һ (xj:6{@Gx'Ü3CݸOkK5h(ٷoS9l#pwܑm)WzE@D@D@D@@@BQʣ@"䷰zDG7$@!Ȩv[ A&zlxLFO.xA@HZjaѢE;$E$P/g_6<:\H4<m4:"DN:$x뭷'#ܹsS{RMrҢE \}xױj*L2]w(oyh1cйsgҥ 75k eIJF`;S{uYg{ޝ xg} tnbnvo?lcb@"+iӦ8Sm;0zh̙3k׮Ō30tP-ҫ#{ 61㽛O<&M$!(>Dʳ@U 0=` C6ڷ _~ AAD &)$n lxW>7`3&Ю#54&e^D@D IʕK}p뮨\2Zj?hz/<)" eO}͚wV}a0_a"@׮o>LطӬ@F`޹PADpo=.B|T|eeߝիM(c~"!" " ڧȑɊƎ&HrfTW8D#F\:C_&S-ZdO&&N)]v87xK̉'p@~>mRM Uԫ Br`Bn3QpӣBW3 pf`7л>_8(?"  иr+`NWo6<+ -5tP`-ײ@VcgTemSnAY1%RD@J@}N6Fʛѿ@$ ?BD. '5Qo* GVfTѶ}2HNۯ`lй "*-sRae…2e VZkŋ{ا (-?v0Һ(`=pf#az^'`[*+@ cY#E0nb`ة 08~_2n. ,nfnڄH˵uR~Z*m#wynVϜ4hP`f O5R"`fWp4߇cMN/2"aÇC<؜X+>j߭"nQ6qk|h#L=WEDE@D@%uv8i~W_ ЧLh="" " !TyW81;ӟTr LůǥZ~~ڏ>>Se{\s'BQ |Śrʞ8dO-7 y?#r+oM{`! \~& hNDO)xM|`X_i,0'@/ѣ=QHر#N8mfsFAD^tN,r0X;Yn|q{쳏ݳ{ " " JBǦ̪S6MJb!p /*b7hx ଳ"Bï1lXM<Ԗ.F\uУi. " "O̵}w+ \,@)0.(9n8XG)0yrs> `6il؄evNqc?OkdSNV(9&M6=o淁A)d/KC ^dIkl鋲K+[yD ~=/ar"|{UD@D@D@D@2h9ǟd'Q8D@D ;ɛ%@6XΦ4:T5wlj0ٷƎ=ر+٨ǿ gLH 0MD t/ qbt&@j@.YRO/c,uѹYPV-Ox"5k֔dt 4 ~c6wk1w\xN֭_~%S$@ l&;ޏ7|DŖzdp8h k5!pffmаaCkguM7dB-@q4*}(@G'6 8Lv߶f8O "Prw* vgHg"*V<%ؗӽ;p 0з?2UyD@D@A:SL88wop-'Udq6!@Q6|93 w ('Ri/:rD!/>S[&෮sgmrT, ζB2v."=~ڟ7M3gnTt8E1 V_-" G7y " " " CvQoH2ȶiD:p_իG2F}h.N^ʖSAʘ|,hBPn'IBPxqࢋ9#xb}ٞЩ?((;ڈ<:E p@_[D ޸+1qD|{?Z*:t{ ?Ci'Mn2Lp 0|Sbڵg*" "͚̘  XXu+x%Po:s@4LLO<RʂMwЧzu)Ԫ +6)|ED@D$YTb:>!Mbw2;.L|6lv@`h|΋R' @~@Cڶwg:9S7|LO0@4P1P r ʥ@Wh$~[BP(Xc@>]$/M׏ԭT2@/8D^-ZYET PLϟ\vY^Z#Gl .ȑ B6N: 5m] i&p'QFq),SuӧӋ'Pz쉷~~fovxQ)H?+_Ir)1j(̞=L5}̙6l' ^u$mj^);d|'XfM+@Dƶl ,_g}е+ΰ3۬><f -K1^?n ‹T" >ȝw"]p!)~r&Aح `r-ҥ~>% ‰'W(H."LNARKGĖ\k9t@!W_ug{N~(*T|/oڛ>։4miV*};苰nD\zhٲ%*Uv GyoРAOG." %%.¾7{ ۹_pE@D@[.PO!H+ )b?h6wG-oYfm<1;9.@>4Э[4ˍYQ P8?&A>t"b{/bV(P:UPD@@/ ?s -Z_5MRpCDB`)i"PXjժ:ؤ&WbȐ!O?o1q7fƏ:(nބ-[Ĺ瞋~aر6~I`ӔUVD@2@WDywDzԭ PĪYX:Ĉ@0M|i pDŽYUƄh]D l= D};?:颶Mk^R03U#`D`]` O<Xק'?y.Q Ϧm(dr)E@_*'!&B5n E"=tZ; ܦ Go y}W7 |?J(D#Fw/MpXg]XD@D@D@D@G378mTW6^PAD@D@D Щ2Bm(lJ&>Æ3oJF{D ze/EQ )@&#Fl_sM&Pi4o8QLK_[n͌fi' 9L(,EyzBG/BS}mlxժUDƌ?8H!a6#4lƍ+h,"N{<#=aW \r%~Ot?2J.ѼysOo߾xW_Y6yӹE@D .sX{o_$4mm<_M@Wf̙9>F{E@O#={ amd[mS+d+hsx^'pS LVJ0wnV(.yA/&*)bs,/h@~{Xd=S:K~LaG'ޚ!~/i{86<=YKfx=s@PȜ3KqXb]qqQE@D@D@D@J@N,-uppD jԈJnOu!H'>A a`͚M+'+@YfFTmpb˜ZhQ5E )z&,Կ蠈/kQE_|wk"s7Gx*XGšD@r@&Mllĭ1c͛BǎN;ᤓNm U5/bq7&5J@ժUqaKO 0/_\=a<|GlQNfm݆#G⫯T  {;`@`"6PpO? Du jX \ZaQE  /Ι u}ͦBN C}qL̇$" "9(~m[`z L)WZٛ2'J@ 9EARGG0g}0,p!~Ь ͡²M "/Umև㢋`eAz馓M@.|Z9ٱYP," " " ".[m)VCڵ@͚Qɱ)" " C@BdLSJ&K N+Iի>lt~( LӁc>۷drZ#E?Ґ-Wy<@!FyOD@r@ڵqWcҤIXlv($wU # b",c*/,Ni+V@TZl;رcdOuʔ)f7{G}O? 6l[o54h.]xCӱ~ͬR&" i&@9QBnjU)"ALsڄ &c K[" I0xqR `W,B'" "&@*N';[/i%jMj'(FSz uWcCs{2;IXfR%]`޽KZj<S{s,eO'OR "P.#l DR'/Kv@ qF'6:xqDϩ3@XO )" " Q"@! M>)lJBsZnrmgdߜkS~6x|٨w_fG}1)<XZtIfw5ӔR(E(#\rE nvOԍW[ӦMQ]AD ft)Z= Y.bTV{ꪫlMAH IR,*(dm͐ڼysa0}W1|O S7{g<H[G3<};vqWNj2fC8Xx!`\ukX & gN'0f),г'@fd^Y7 gώ{~5^! -Ӧ;JE@r\ʒ)kc[Y߸-[nYp6 g^ye`:)dD@Bh|`'_T:@O#q%L ES} u 3g",i H7 |ҭFt_WL !L J&@!HD9P_X TLد|I(9U޲E6+v~9lKQի><0l'$,)!駟x%'_~=61;C.v5mn9Vpp=sNUW oYʗ/,b2΅켡S SmzUVyNcjmuo¯[xvPұKEY"3q0_t irKF&QJ;\2'4#;7/aLlNuf&:.}WGva宎\瞿0x.4}C禢F^ug.<[gK[g}ճ㭳\- nsº8nZwuu˹($Gu=מd[Ůꋌả72>fg_>¨Q+:$]CW/d1cD@D, PjU9=еE@D@D kΘ\BtsY]BXߺc=\{udbSޚ 3`lO)mmJ;v3<ْ(돌Dz%9;[ o}@Qv'QK?]Q[:Ns$zJ(&tO(:nf^/yT.y%n_.+\ o~(+$]9UV:thDtŽ@\57bʬئA`m6]}_x}Gc{xm>D 5h[;h"O,\>YG6@}1wyR~wxʙ6.]l'ܷ5= ~o7qo+r!~Cݷ5up=}S~j(@a7eǟTt]4jT$G[֙[77mΫbB[ϚU!_Ժ<<z ">e߷ $'%_ r&id]=1:/>Ww zEWgd^綫Gcop둬_2V\$` fl#X :XFtI-c="\ +_ ە'۱W %]˜ F.);D$#Fd:EyS3O1d~bfJ 0cF[c%1͔)H# cSk;YԖ ) Ic c.إ&s}mf-\6gHWJ+HO믿Reɒ%^b Oq~6:' dUZӦfYi33ϷB8XǴi B{u]-k׮r/^e˖y&c.}}^ʸdw.bBp5(kժzyWܓ0'XweG[ۮ^bq]z[#:r8 xR[ns(8;:[`}>\wۮu}}-RJe1vnŬ׹mn6eD K\}5{EuD@G jUHxBQ+jߢ>9c6E^ݦ@5ZUw\xaLn{O>:(Ⱦcyhk]FO> yf_).BwŴ+%Zh[r%bڟŴ3)mK<\ű}1p~[~fW$<#pm?Ʈ|XvyNGu9qٳgs&C3!@$KtѣG{"W=z7ߜVɒ4>Uqoh{羡ΖSe}W]쾯o[wVעBɳ<S}4p5@ֹGhX>R`ʕO?.3Xhkorc2+wգ~kPoip +W.i_jYE];<@IDAT/`X/tnfKy,_^yW~SS)gcZrׯ qnȅr)XcB+]=]zkP< " "6T jeHil0ݐL|Smn-l۹ho(WPTw?eY_yy^ŘX ?>{։iB*>qf֨-[Ss, Y0Za?`thXWt\L=2W&M4S5k7Kܹs=c hu]}|hNR։M:I=uN/Zh Dց@u>bf݌`փYoTX{߲vF `WX3V-0vc&jW7:]!zփ3fljn 3d%Zwz9 6l%]u>CAD 9VI29V:JD 5Xq尽vWpqNf.;ɥ~k 3\+ݺJ!Y \g-m3;ϟc cmG^bc}N煷6]sayc==̯G=FAD 7t?sQ(& AތZ~K[Á{_P)*mFl㚋KsNuԱP<Q)w>\%X n~yϰR$"@A> arڮ馛ЫW|ndg!^`;-s>/A綝?A_ [ؿ\b߭3K۱\kŋ]ϵqm6_ >]|AAځ_h0 }QXa_KɄ}nx:_k]ي9G7ү}K]}n\DJ= wKΆf\طw4m~}[V74}uݷ5De\h? _>- \=Q<f&rn> $cYWȼ*EE'˷oDolf?xaZ#;u~=7mcm.eL3]}>q,K=dHz K+\yy``8|wFj ,}cY(@ .ú|.oU[mrjZ}}v3hdSʯ: ].6cW o~Nu#2YOd-Xv&Z%wݾpmN\~\c~\ח^ n6@`.Xr%ϕ).veKquDݔ r^ʃ=,a]m߮W23+[b+,[DeK7Wmc._ۮa/ϐ|q{Ͳ%\1\9l Ʋ$X%?QLmY\a,WBndnǤr 1 0˜f 4 8NϠ$Ώ @ LvIYYwFuˎ™L3PHӠ ;BX!79n8L0|'2NJ;(D׭[؝r%yw.Z8%;"gΜm甂-M￿Wˍ;TvB_xc٥#Wf#S?~<>SL2γQwx.{eeatp Ul?::#Z{#Q{z dǖsǮ/f+^`5]5Ůx b4(֭--ƻpAb=V`k4y3:@..!\ʋ.nn8].λXq<:ZbA'W'u1sud쭥K+zW}XNjn ;/Xmg:' N u>g " G:>@M)l! !lSNfȼ#EQoIK~*ٲ5tn%Ӈ>=|r:P<)_-۴D~zclOڝN;h> - _ܦ vx AٟP:x= cڏ\y*'EiCrۜP>n_B m]x_OW|7psRCCi;#ݩ$I*if׹T?ɮf>9ٯR\g}vדmYX/Η n'j9?i#p/c?jB8Nڎ($c'q 5rRP$ګxO h# I䷌ߛ;Û,%.B[Zp]ќ]1ǡ@ok<{JNs>+=i ~KΆ˦2Y.v4M徰MV~uӻ=q"з/0f?Dv  Iuuaɒ%޸DMŋw[ x{bG!8׏8 +VxLADZ\jժʅTGydǮ\1m-. ;zw⭳t8v_Aٵrݲ8z'\wX$x/+_@=-f+\خte'| 1nە%8oIBe+K\UʙXv.a>^9$9D)aFA.]e˖9# AC% ga> #4l8Y[Tjg XvXРÅGpq.@c4!k֬5jisgˬF:B6(v0"LL64i'fڶmۢ}8製NLKm Ӵ?CuһC_|z-6ǞpX:uwi-qֈQ~ruYr7o7s!: ڵjd])+i$q3mFn88QXA \N˚h&8'D1 lX}цƛX smBa.AӲ~"t`UB!%18AN^iKc4\7e(H# w%! $vٵm;\].lwۜ8{&#`]/JX4uԙD j$;ZU^BÙsg72 7G90\?=WsÆݻc|1_$G'Aw cN0mN{듡͉mv.nb[!hsDcNۑ:pnmA! VD_G%)R\]`&Z-?r*`Bl;O{M'Iҁ%$I ߳}Xvm?7.ǵ vG>[kۃ{ξ\+Kѵ19P>G6k%je[}bN~sAq,H;3B!gq6]3Ҟ{~O),~/iO}O]쾳7#m8]{꾻̫)Ys2>͏eSs67K̲lfoqݕZK1cLxE^=O_ eGj9s9sxc Y8a~Y8aB_hJ!<:){ˢEgl.P^uz 3*@ '9\\wn=.l0=FkS37}na{GuTY/jd8.5N uT.1,tmwo+pS Ǻ+ڗhS`y'YضoͲ&V-n.?e7>,[X2mL8XugWu3-|*[XF=L۔3-\vMG.AV8 .x.I-48#D +5.P5 Br፳>4s#U:1 ُ;tС5j'EcิnS.Ԥ*4PpnܸqEw ͝|^'"1 s6{7N}L R!>3X8:^pVn9C9#w w0秨ٳ%(1AX)ǴhG˖-cV`3mu]g5(g1]uo[3Y6Dm/M ma[wKhLg B SH3T05/;k,̜9KS‚d\vmp\!Ǡ]P({Q_ vRs޼yմ7j[o?de2.l2ebpv~/o~,}> Q w1l-^xlM.gL;kWn\>G#m |΃e  >mp© 7\o2v[˲9QNb1ŕ9,}"uP?/]b5\*}dx4bs и5ܮbB= q0cvHTnUd.B&v`;Q!BaR~a{3p6.TH: 4O>Wa1Nh@W_}Ռ=aH>{:u_C9$׳_͛nN<,U`CrȐ!I8.6MoVnXg;:toN?}n~hSɴA9;[g~M*)Ft/[h3r}YfM~8d%.䪰cIG9pD0Ids)SS|I->+ip>[Xg9}[UJ,7MrSg[cB|߻Z7`cK~IǔScijQ,NS( 6 xrWБF(DS E?)oSs7߷1.-LKǓ-n#5ic~Ra Ӻg{qyng0vϵxel9[kc*}|g Q'@2~~np/҆| Xf_Bf޽3PR ~[ΞƘV7( 8 ? }me{0hS㷕 |徧.w~cx\hgaL;.fB puM0'Ng} 6$i͛7Gfͼ|X(Ҝ8ؖ Q._LVZCxmu6>}_s;8Iˢq\r],yෝv`~e}N|~v37o@|rXeLp 'D3qx"Ot225Pq6(Hqvzp 6t?so& Z UTɟ~ACFD ٟ={v, n63bϙ?6m}Zhg?M7ވ?3]tEܹE!V]h6l'RvMtP< |Q oڶm"c#n6\׮]%D&gj9r$}Qn sL "N ((rc #N.nKzG" ΐC( ľ pQ " ~(;{)r\0l7?w} .+@trɘ Ns@?p?@8 :D~B?{gvGq) -.Žw-`A"]8$P\Cq VB(|߄w3{{g}サ#gfϜ9s{)P<<d4~+٩cGOEߒȰJyX28OGۇ"[>p JYK9e_sUN?:ˮ3RC_IKi~~wPeC)`?1 B@Eo+uZ2D)zB1qTb.%5s5רwQ:Mbf%/t`Ԛ^>~A}ȟc7{|h8c#~/=z @Hv@>FcG pC] R'pf@k@AwSbE·U>?$nLA O{H"bӋOshfcZ@. SO5ؓ`<*HUjk8GX+X3|wcYK7nR }> xr3 쇏( h|ύ[N5 5!Ce֕:C/kvLH|apGԬ1#Ycy2k'`P]]?}pil,O9?Ho;Q xzH`qWBN;mu]b, }z#8BH63d 0M#5]wݔ'$ ?'ȧ$$Pn>O㰑|+qPڠ14ǐvKG~ՙgc}=jMdT _~e\ _;?tC>Zp7S@SpoG5Հn?H^xam<$x*z t=VkU~Q(twLP+էKV']U$q% R3B?\_ֺkĈRI0c%kNЌf b_D0e (>g{߃zS@+:":d{utJLR }v6P<ǎoFm'sIGϷ)ЭI]?}mcyes ?wvv*>g#P,߱ P@e p/tI;$]Q*3hF7'` 1N~| @0CQJ@$x. ulЫS[l2ť_)FH/ ;P{zU|W^ye+_v) ㏫G}T=c?^[SC@85mc kɀswuHHSSi > 6 H+\]:10`؃/{C'(ܻwoϋ]Y['~|+695(`  1CҬ1f@nA0b~ޠ* L(٤.R7 Orx;=F"DիW|!rct@?|G5$:O( '. 1w[{o&/pTZev6R_ 's> ˥.-b~뭷s .%Gj1FqbPGybb }HkPo6r>@M((pP[i~uNO&b3=d{ 8RYg{W"@Ǩ8^ #|> `|1>[1 C%XBSyg%J Zv{ TPVt0b9#J,qhmz?/G+8ֻE^2K}wxBI֢U\_|E"tQ+g픾袋$! ,ō/S ".{8%b=! 8PąV7ܠh].N-m̓]+WyYeOTAKIIM7S t|y ytъ`~[~ c}-d(|Q"!ߧ~m;5bO&{?{ogpO``0'i,UW]UJZ>oV@8Ux dP.84,y;5kC ~a nMlORkSN9ez!@/Ճ>(rC]w%A?R:PxѾyFeQICF3`kt<7*\eSdPk> +_DpO|7b_l> # ˺b> ᓧ@;(٬-|bSh-zf (Ycolb6!T`Hz=x@+" %7`m,68kx@$=SZx`ꫯYg}Iw}e]4xͩn;ZIWcmrX874QRZ*uyJ՘iaV(x'=X w9h>&u\U쳏:ꨣkt1l`"s =59tE%󊓎{5|<<2Rʁ g9_ F OEY{S W`}D냏W,r*O.1b)#6l'`pGSi1fUKZFORAVwl޲nF:xJ+~Nr$F8J|^T bhP9]=؊_NG>3Gպ(%~ 30C=:[))nA†; p2y+W7UNScam]^)m'`>8j`X哪o@$|{LC`-G@c߇}I;S(0rH 6I$~+vN~nA#:'|RO.ފmWlFp_@)UU`k .y+; pGJRJ\u}uۻ+%ۍ7ި67tSkS7C)nAe5/y[l}7i,<m@}$lio@>y x x ԅ/ /9E/^&GF_0DƘu5 :xǬ/|IX>Q?))Pu Y_Xk gi&71TA:0G^'ZP(:'{v,gh?@~-ԃZkh C"d11쬳RSg}o~SǮTlN.buMM7ݤ*%PyOI`8]eU4aUutQÇW}Շ]A~Ȥ$ 7ܠPwr0e @aC<6?жSS| |W(8qH?H!,S}) ;vա*?p߂c=3:[)I`l pTC9=#꤮t$zk%:@( @ۀNS'[JM:i/WM_QTGV z2ms1LR.B8䃠恈>y x x 7}™6Jͪ%T뭧We=ES@԰aJk5կA T)yJ)P} Y>)J'x<\>Cpn^$SS@5J. A}F(${?^.[b5 oE ~Z{ x " w[aG 9 ;W_]ꭻߒ` ؜x\ &@{i_d\sKognӧc9ڗ)2du'lKm٦5!“B#$Ư,fh>@-)Ӏs# Dfv>hLP,b cE/nwDw3lyA29OOS>@ sNZr7S4L7|n5x`5tP5^[O?}@O4 wީ^Yc5 &f\Ǘ_~꠰p+ T8 `?z>( `I%bfžOv a9 2r|*(ĻJVXJKr` )k(MbPQL^%SS)z9 @C)8D2ɴ8GU Pfg} $8.rд[SSX  78"ľ(ZisXK@/PI PACmu$O+nQS 8ORX'n{WğJlioNkqp;?1ĉ~_WѾ%/OhzH;:X06g즪`Sx!cly>uğYo#ԓ;v|'S3)PHuKfaG;\s}@C!` ~'L?}||믿o\mtjx=#TV]uU[Yw޵o@ xrP d_So&ZbKbog=:,uen4<NwB;$Nڨ}<<ʢDlICNk@{bc}Ib@.<|+>C=Da p/fSS@g_k vFYfE_O:Cx ȌaCQ6gM6Q/PZSSa\vM7o ȆndP 3v$sHtbIו=uJXwŧt @# q`uWz@tr~Q6l(@"U!_b` %X.FM~{}#pB?|!"!qH!+8+)էjRAVs\|GsO>V[m5NGʫ޸y x ."F'b]w]4C8<AQ)qBRJ|}hummuzsdڧӞg[[ @R z:6/N+]w:35J~ԑGY[Z3?KF8 ص4LZv[fe>gM4yz x x x 8P`]{~|ͧ= ɀ^cc},:X#SO=E}OOOOC/B1B ck}F>}#}z _H B%bzEip' (DxCh |wuWտJ C5 NACiSDDy 7ܠ uRz %rJ7q)7ޅw}W#{O 2Dmjґ &۳՝ n"9a{kpO 8t$<'P`d']P0_7.S;苡2 C|µl#}Օr+:101AtAn+?)@?{;C;}_{8pKi(@X!2-RAH.~ۀNm9~RG3>DzrH4ve/iSTj)L]}:+6dFN6o}͞Q {y$@8BD@aAtF xw;mCbJ ɽlos=~\M<&ȕUO grm:h:x}(bˏ]xѶnm?7o`o>lCy x $Q=nfc)h+glj9++׿9LkկWcQ\pZpGXs~c5pZٴ҇;Sۯ!03c9\x x x x d9@D/y6\Vtu歷ɖsU 9O{.y$z뭧f8z >Lq /TN;0`V쓧@gPE {}nxۙ`ż; yxT.@fmnXn)CJ z:!†O؉s=ԑseR}kUK c,\;oi/ 9.OO +jڶCn",1 ̿l_bu)J:궱]-#H6.2yH=<Z@f/kkVlmsل.Bȅc+gN;j\(n6ukPKlUfiҗ)))L?\OOj{]vEzܐ&2]Rodh6?۾҉^zN;M mnS0 yAoV}޽Z,oѲ&СC+ZwukX`k{ x x x d>ܣ8BWԖ[nYP^0/n@ّCx51]uvQ~~i{}7L|iG7 ZC4ȚNj͜b hUbMT[<֩/ؕwwwC<}x]騣RÆ =<d{Falq@ >S`ȑz>}RAƂ101BՐ!Ct4t8LtIŨQ3<@IDAThxEJF̷SSS  .vD]& |rh>DOOO `_2'pZr%V0gh)))6 %@n#0cSn+| VA0=+X"׵` Y'@NtB *2:}G2,d1,XOOLS }Zkm 3Dfg&ԚyO1ab'%/CG_@h|we ;!C!KZlA R(EB7]!#V)U\pgyRK-z-裏{* o@) J“M(xvY.xITUzkk6hP`hkyZol3ƓΜwwJ 0NM7t @ 'P]qA 4`-]E|> x5רO?T=CSs5gSUL#FPs}*{9uj_נ૭.6y x t<n gû+ <-z& =le~m4tl5A>LB/"O>iH쯵q9d?Ѐmyr.d̡Ƿh Ç먮I'߈tkOy x x E`TF|e??Vsv(.SF-[G?[2sM<=DqDJ2S]Yi23jG.PL{{ X)ЬZ m@?|v!$gb?5z>1e=.=S5ispΤdy3Q |z5j=СC3$+95u*9],6ĵ^JXc =QjI!_A@2tUWU?|aD[tQ%]vyu=h$]7ds:̳F!26Bhm7XL-OtҼy'/Ssִv'cש;͎qF>*X.d\J_AFBVBfBvH Y ^ߊ䫼OSryV\`3o-?L*!ܮ*=$ iU)tTC#Gf_A8pns@jNw oyk^.K~O }sx ˓܆G.x4x[+ wHXZdeYFD}X:Qt2uq~5h '+Z)?S@zy> C -ž[SL})Sٽ}(tE&gn\|y#EH_- \DL 5^y?uaojp1|V{*4ӷ!8_kT.VRӬn&ͻUu8z`bpx98=v4kNȇ6[wuN;^~e뷽kDcg 6AcVvan ⋕DtG<(.>CL 3wqG eӮ_+vygs&PU@VZi% \2ؤqW3 MoK/Uاĉ" }W)\OhGޫx@C 8SVwJZ}.޽{Lb: 7.c0F60`E?v3nf h8I-!70 cÇ  _~&qXoȷ~kN(e)Z4)P% Ľ YWĜXa|͵,aHL3ͤ 1|~饗K/ϿKԍvPE2h_x jyS;eԲuqøu˨Ԭl<=\1@TGoVO±ƌq%.¬uKٽc{))))P zwygl:?\bBBI@Q$A(3)'=WuᘤfTl/['9J)54Y UKݤ*چyjq yfܚ{^!ܲ.N9mw}iХZ0ۥ-kfgsjH؊睄e >VuYMU&{Zy<CChmL_ y:9W;^>ӫs2{1N3F3ϸ̢6Lx㍲_S_pĪrv{hcuYqm o-?LV.'Ҹ粴ͥRhYB. +dv$hD{=A-mў:۩SM[[~=ow7Cf+؁q=|#XG҄Ny< ^OUqX0J4k 6mO?[2%%/SChTjcߍ0 UOh}s H ލv{W-" -¾؎^g{;o.OKmU&w[QybQu{m[LG^ڽO L 0_.g]}uu5jOէ@%Η,`nd+۫]>u]k -mV|Hw֒^Zzφw強!rK7P{yIsK}ULw ĘrMlkb lVJiG[t'@H裏.J/(m+& xEiذaz~vUվ|Ql dS\a]h=EδvRrMPA`3xG@t'xb%ȑ# _|M 2CƵf Dmю{FWM7]`xmWC{Qf Dy(%SM5U Bj!talJ;@@N˪z-OrQXѡ/&1J N5n/@akrQs^$1\_|9 T,7J|n3g k]zs-#MFe/ϙw]陵ܤy{؃#U ^{5sh>LOq("Ap\<<@ve}߮f%[ߦ'/yfL6A}e^{qD9CFu^  t(s~3E_؃]S˗s͹ ~L3Mp_a5t*r%Ѭm :r'c) kZ&A6*A}~뭷L0^7gRP@Z_)&4$|/kg;(ql^-ϙg9pl%IaR.yNҌoyd, vS%}6@0Z}ƎhSIZߑ[ ;hە<+nWL֢e Y7Ï]@Xo?2nGA;RVh7~;SRٽ/f)6#Cl&l4[;C_lIUIs WSgv}gL:DE4N;-Q_2jj޳lӬQ*ͻUw$:ۡ+Ɠ WWmVKWϳ2K[D2S[t_˦gq-t DLG+N+]Umt$#9Sw /0-qi;e))Qꈌ/Ҽ`}\f&%, GŻH"Bq˔EGA)_gt1FmƬD 7Pz}̵"v}nyly)?JC=K~ܵMS .-bAm!^@ : /l\JV6~mŃh kw|=<*HO>DG:EGn'ZPR7ɨIoQ̫xRnm=p'}J.?VK$$e=) Ԭ:g=<<<<<JDͮ8 #qF-x:o)Qe) x.D7eF܏{kL4Rr[m xZki]s=[l9MzH[L⬬Pq.w1mѵ.L] E]&xba!˺xl0$`s #&O6RM7l12hize$M6 ZGhv?Z^F`nm~N=?PLn/Rg%ӥfN|2JҸIyEf@jfSկ\yO: ,LYmzr)JWyW̧ MzWpCyq8K?Gm6ꬳXB.dʢ駟k/ujzի*[.Z&axjZyaiD|:tBFE;d(*h#k[8JL%JHZYqgj:'#4X^ HӘ|,(`P~*7 >rW-6?1gLdvmF }JsO! Pv > `C;\vG}Q\Om(ʦb }`a{u@uQWl1m{NX&=6 FQl ፼k:`c:|'Puz &N ,ɻ ˚pǘ(4~{5 }j#0&` _g lcmzk+׌kO<ASDbhc&5B<ź|Ⱥ DBq}z ĴcvA%g?ÍkF %q`c|A]D0Y-4I*+뼓7p9r6H2`ll,Q2zM"kkyO0>@zZ/B` qB;I~4bn/au]7^^ ^Þe9Pl6.rMNm+U6q)qs6qA+:C .<@dv)mm; ^lX@S9z+@딢2j:Rha[w*ZG{2*dWk\螧J{lis=85b-^@XQ`864h]4?=<~" 4v7ϥqI 2Z0mh'(v7l3Kⓧ@k%{W#Q ']1z$(`/R=ǕY5|[@/\]l"ޒ OاqL|ʛh=."P.z˹mHwUBv}wmciDUyc'Ii4NWZ[9yvi630Crec uh{i+#a_)gw6؆/Wj|a%Ց37mk2y֤jxuܼ3^>PKflD')HmIs捏 2Q{l馛4 LuI'f=Ȳ:6l P ȗTOY[J%Ѹ {:HRR+{ OмE4=xۨChԠė=ć5V.vִzq~s5W2_I54393L3d{2Fcym;M0ݴ=1*;r^{5uWu(7K̽ejmiEԦC5e}/z@gMIkB8_T*{8P &;ĠA4_Ad|h X.ՌYuUfҜpkE`3Ib"dmk$*NV0-Ele"ӊ,eo\uO)?j* L2IO|"c=mhOZc9ט!K].%oZS^]L,,z:i ~̝eҮ5rd1FR=e1.}&N?I3m`_G5C kI" H&E\  UjV-rU __C@ 5P 6t@RИƳ⴫AC_DX L_ |h/r ̓[o.k8-@l8k"`s9g ܁}r(p*S3<$؁(.@7ֲ8`V@Q}*@D85¤ #si g]vOh(hHD@@|Jj4QNKHp._ $I%B8h'p@qcB @=NʤciXLD @_ s.K87zǜiVx`߼뚧0O=F;kif[>QlDe5b돭*!uvl1`m;Yu [&gj|(ldJ=F#p.21VЭ$bDSd5'HDk=0P؀@Tt;]O2_ C_v ܺl1lvyg}MGza~f{w9|1 g^!#I@ 5 r@F-c wM7}&hwf-ܔ\x84^o(Ћ~~"c"KӟlE dJ3DqR5Svj EVɔܳw:ʆ7.7)6IK]?aG~z'|S~'tr}`ʵ7S 8 er{Rz]#$at]SF"П7VAtDc[ֺVƋel 'S–]k^IL+SHPnGV]Ejlæ ?M{q4ݏ{ӯ9Nes7`JUٗ'wl8哱>#YxN<G[*B>ęU_!*Sa-zς$CC_r!s l|ucf j l$~I4n瞜>_Ubk]d&(ZH B1 e|Bg#FP&4A5gLe|+  K$" @ExIK.4]a{k{M=OoF q?ۊh /\f:+KGrnC;/$xCeA(c\€\3@yK~߀4 '6\&۾/\!`ƴsg՟I]&7Gh#0ucČ-`" :ST2sIF2 {\ɟhuW~ԸݡM.)5$:E%LNh8]CMl@9 +\٥]wNd@(9q"8ΒlkBeW>L +M%7mu}W3}u7/.?:mJ=t޳gјGUۛ6>~jQi!1@uH-)'#u]wԑ&r2|8l\ndH^$2ixޕtHnl dV&8n0/ DΦu4uoksu Oy x @zAӫ՜Fno󃘭#a^iȐ!Qh/_8_r\HPR(#cdyRjtщ*icm7ꖊCA2P.zsM[;di|<'*Olq4 F׺<쫯 vwksn̆~`@-:h sM6ӋA6Ow `nc^@F'n^>Cx$mX|iγ7DG06iYjgh_}n:W {DId8/ l|_:ԓlɶҸ{rfm$ly¾>W><ٲdL׳z.3N[[]tj/{\f5\x9pU])*ڀ`UO e]tmvy]][[vic.0qeȢ2 ׊,Jm{#5 n.]G]SAzrk>t[lkK[ch^6=.W:xQ_2bV5~%5&s?.Rw.:2QvTwϝL_ˆ0O?qҬl?mM2$4?JFe%$*Q(:dFȧO%JHD0%BEꫯ*Amׯ[Jj &h\-ܢ$b ;}]Ĕ(*RTxiObn6Qܔ(*)hn;} =6}b@Eи1e+RӏGZtEUҮ/1>}jysxF wazD@WQ4b @#:Ovy)1P<b%9烗qr~RK퍁o p:t7%Cīor^GS4LטXH?mb'W"wj*D(_kbإeM1XҿmkBA-dp1ZW_\lcy&'5u3pzW3}5s0̓Sm\u$}73:-jYoFYfx x ԌFr͚hnڊ ʨeHwE>pl8\BpݶɳIrm$p# |dty} }Dmbly睷M֙|S+%V<<<<<<*J~R8:Al7:9B_G_lRr{㕜q)?S/g.fXNRl[=3sM!SMOފvX<И߶~=)7)Kv'/;|W[՗_bFHqQn%AR98|ay',bRvTrlMƾD@GjOK2^>a[ǽ|2gen8_~(ٲ*iSnL OMjwm_)ĩ&]z VvV\̭+gxkƗL=I}M;w:cQڧ/LvwqG%lU؆"U/f{p+u)lS _Mө xy`Kf{>dsL.;d.G oMC04 إ_<~Ƶ>OP؋ao`]xkt\ Y)4[Jϡ18^b%Sږ-SfCuYx}LpyqO>ӎk#+E%h c9r愋\o O:"瘺{(MIṴ aGu6e4O5mMleҟ*We 04BGX 0bQnv$ǢRTC /KK6.K].֖V'nRtMz4Fk oM-6EްC[~]2PN3ɥ͔[w>.8{9NhziH`DXuO?8]􄅊4K.D:=,BQ,K/[o(^҄o|7lQ^+!%Ԍv?@hA&@ȾKRK)t%GEzFY3E|+Coye8UnZ9ѹ%`n+8NAk{k{g&tex%Tz_3Ny[tYO<Կѭ&уeygdxt?F $ָp2 p]wx7]aO26 -yWN͇rM6$z+U)@g׆0s=td@'O#?q$N#J+B cLBNٮFȓӆg8g=yhlkBAY@m/`c8 喲ɱy=MZg+=lt ʆ{|{`h=qPu4CKsX_߀aKԹ/-'-CGeQmA"čs6+%3)v'{rnKkIp[U<ӊ~4oJ?|;Gb"4޾F=<<<<q@ۛ|qNߝpxs׉]wJ:\>ZC9-cdSckP͜U]e5r at4/Aɸ ^>3e.r֎W^ ߪhщ)Is=5Yz饗F~ֽ_Yq2wq 7_U}\W:ӊ { .`,3+Ggr}Sى)ԠAV$ZůFi|)\owCg|VW ZO+5'Lc+~g|N34ڧ i'K^"ҥө*E֔ljg'iELߧ ;b|ЋlfSSN9^D(9kh˺[ n",{X ;w-sOW~WGq\ UJ.2k=&kL~bß5ɛ&(SR3kLX/ f߇h]. pqkJܵ3|CZ3)J+#mq7\)z^i}i`_Wր5 lh;4̊rG\|oW[o 0ÇHtNtM׿Qmf= _DݣF^vM 9j4vm ] } $"0BlfwaVny$r7֟ᄏw}fK>2GHO<3 Ur^πw5E-3<7x6|s} Bq֔޺:g%ޚw(N?>|k.{ٿZkOx5I"R4QuĀ[q m^:OW@81Bli@#~l?xߑ-veb{1}馛&d'(/ "=#aX ɟviu|C-Ia*nF5hР3E;s숻W'2BֶEք49X ϼU>}t569L699gdu6뻢;ÿlW\m\^M5>ZO~á~Ujo@(kի6o:(0lʋfO|`e,[ޱ_Y۟g}Ouq6`'}NЯ_?!OPA6C5@H|z2yIFB"KopĴʫ5顚9ʜkd gxN#\+]겝7VAb;O5424淭_qqg[CYW:x8Ny~BM4=`ʸ=ǽ~QG^mtL`h xY'O̠H9e dkW$=C@- 2+ saDΊ󖹛'_i}ukZ\ROZ;m\~}_;S^{뮻tc\{jQUR]:%h} [V[M 8PAPD+3MFc%VKR`FfW4LMKj}|BW2tH[c\1mj3_qUƿҴʟ%h?,to>Jq7b5)M΋CN/J+_T@tOcjtN:սgG}>$4uQxc-TȤ9S2D &?8AͻCw&'{('ʍLI*qOHԍ(-3AMSN9ETjtHyԯ+gFf ^^{iCJ0HKF 3:ܣODMXbL@%<7Fҟ_yGp0G6lXG:+3{l v[ŒSY(dzzUWؓGyDqzm1㙴,e.s oQiI&"~G7nKb.8.Lˆ2LEffokDj2 @.@M3Ϭ?Do1b_~\ˍhe=kg݃WFv$:,Қq|.o H~a}w'< 9:ʋT}`tJʒzY|aa"澅t@IDAT.mMH3("XnMXX#lr,ߤu6BFpln?:mjO Ph24[m&;TvB>SSS dD5.WgQۡ#mѵcq֪RG8M }71#@b`t=|vlAo4o3t}_X4CL@З)))))P40 $@hpP"0{q %O ,)KoKF5x06M󹨦 /T PFPT]U*7Iy]zV\v؆t#d\te;ov1<ѵ.?%q @ 38㘋V7|swpm&.[S Is-*QGQmv.8[x駛OK哱S'?k0(Q|2v|8oK*J>;bd d!솄"p#GT{LΊ _M2~< ޯh]W:m[.{-s;QؑzQYh꒗w]E]-JC햔SYmxlJVxѩaKMi|q\jA.ե1-jBm%Q~Ff5m= Gs1)mO7x3l{[m@Lߧmy¬2~4q}ζ&P/4qDz@I둈.<y@_ fu@ 4ő~<N]r2P .$γNoFҿE"U|\~2O>9d_r% -Э@"|†!Y Q;.A` 2I2u9?m}M@01+o b85gz4@ycWtƬ缙wygI?6vaq;y,}`ԨQw}7ORs^ޛ[9U2~e7^|{6t@Ns^&zȁu U]:xseӥkyOvo\a%S Yj$]84Ņ暚fF5 ǘ5N#r&:߼|׺khӅ/d]Tپ;?Q5!2!lBA=n/C ,-69\<.Jt6ِ<蜗C=٘}٧5H{ƍ~adm\=w%:`M{Rfïop=[)N~SLV9YZq2j^:R:#MFeTW w{^2JOtf z9zutj.eJkI^ s= &t7oF=ɒK.H@ƹE uVtwS"=BVЧ(m:DZ|) !scOՉ9rsk؆t%ʾz?6?7e7׊vGc[qtJ@4k1'|b}Qrv 22Q]lYdUz78~CrVl y!ڹp9w.tp' a({\1tiBEy=/?xhO7jL븐%H%kkQuRGN-+o ouѩl|)uC.c[m^Ѕ?4?8+ʏ9?rmlN qP>{iT6#gu*~ Z>'n/ o-k;Æ k[c]lK˔]d|Wjڀ-rZF裏VXa}W^lk\x^_rKVuw푝wwwf:q R9Qou e]*&Eqv?n]!EMvy3,C>"II{#5 n.!?8VZ)|o&k)!0/]J]SC\l?Oc{\rﻎit=Ṹk.v1q۸kU\cO>[rYcl2"o/E1.}y#seR'%鉚"Tu M4hsy1ZݻwpT|P)|I`~! o`<裵*@t; e&jp?S)N;^$B!ˋ`!JȽKΡzD3톹p `@kH6^znl1;??^].BȒlSt%Z$$ -ŸG Gr`6۬d#un1P_\+Q01gL|7#HҼmnNcs97 Sm[olQ2vOn?ԇCO\ХMyU@a'a@'xNi~@aQRl~ )yAY˜Hz.s:Ǻ`˻k(e߾}5-0bI_ؤpI6"3P`'(IEra2{ァ7 Q2j]qJ)C)4N]!CxNI' k0c\lJ\.1C7w'ܖw>=ǎ^c3&6h ]յ^cKq׌0@d~@6@/B04H ͌)7[o5- xy1? 69cyGNXgu|.rMN4}d[gmJtɆq{qu{1'gOEt5?? hW{<dUGǷH ƁV'#M[w֑"dT|8=Fw)R^ž5,ߧ1<NY]=ۖ0"3"tkmrnUo-^#{B*Lp"ew6NA 1|ȉUGMٮz ,k1oѻ3'ْK!H Hq:SBΉ`IuWm׿ƜыMmrF@*eC1+lzl>\5]lC\t?C<{ m: ٝ弱yj]ֵzb[xq[D/®!o{"xtX2s=DbAaDmI AFSH sۅVOR'vqkOI$Ћ;Lox6uHE'i4@B&B6BF-ULM;vw28z뭙mdIs#RG27elqpkFW[\Mqd=mf7$ N@iB,3OaYutj[]tjK\+o.zAޚVO5!.c|K2.{s7@!]iW>x Y ^Wd|1B$A 춧~ivXVʐm퐩d|=M4N Ƈ0a3v)i2\hI{#۾ n.RM@ZmsN@X~iG+bpk_w}EG_=FbuKik }qK8 5&}\xm,|08;u]\x]]I9lLFR=e1ǣަ#6^罬}QRvx<ކ *R/`vFȏcK|q1|7~y$NTل2yX8^|yߠoGy8p7&' y.VtFAǍ&_u †E@9.J>1@5jTws&&.xCiO{&A?ݍfioY;]Ɣ)q4x_6zw[[m[)=S%&ت^mnWk%>bp}l-WND;djlk;[*:>ߕiz,.!Q]C7灜!GN M겝7ۥ?Ҿ8+nЮ'y ky zB,k}+|_h5)qNx'c t鸵 cϷ\qZtiƾ,ąFHJLuKߢy5{΋%s, _jFW>]mĻEivq4){fQ3?k]:-dv$x N6`َvUgN6ec&[eko͢SNfKIoQ|(N6FyN7eV[=qmsfCHqqX)ƹ sx< b|1] V_喬m=QJ F%Lϋ%mMpSgYq5ƌ ]S)Eް3E}KZc(5駱td晲g'`_K x;<%LbHK|1 Kq"TJ.HmJ6]JV_7|q)޽{+9MYT^x%@j&2sc%2MI4 k>2zꮻR~ߎ_{(ajiqT:{\Ģ9u7]wUIDJ%RI #jSk+s67r~i +9d|l 7l>JM?RW] AVAUP6r w\X"/A\EY/*z%%jsYh'1_ a.K%J \0\Dղ8G.d%#Yhpy.'cWWI6ݜk$D{zJ>j]vQug=(E a Hu}Z,?)P_ YS6#V*[NUul˚e&`L~^IxF]|Z?+QIYTEСJ^Bm7|=*E#M >~BtNmQJ̈䬸Ւ:Wbd1BKoSKXQƢ`_IZN;$@c92⳧QEv֖עJuuH0J 4H:ꨣf2>ܫbSO5`|΢Y}s~ ^>ӽy ^>iuDy'бRʖO\*`Jc=V {U~T^\(7o 84,yPpZuux}]pei*S.G裏~>k|UYk~Iukց,5T,Щ;h~6te)RNԏ?WG:8=_wY;9眣<|Wݗ/?QGnEՍNP쳏:Sx%K9?ÇW_]m 'ԶUYYrM_;cfzTw_9қN釭@k 0JJ@lr; 0Y;w5\" !$ I $;\Cp _> 3=3z{ZNwWݺu.QG5M3e{Vj/pocLmLgb侾0L]Z{3[e]ӚivA&li6k40NYfw[|cn8ۓ{2Y32x≚nz;uP'D .:J<ӟ”d2w-\fxvޭGҌl@Z"OS˙'DeHzWRw%9՚y2,N8e9E[J>\apM$@]m]WpeN]i[I+-gu2HJU]GydG}y24vRzf:Ͽ,)Mg:Uwc@7iÓSYf%V!lKXV㎾U?1I/l2E G[]6[B -ԕ&1f#3YL~f߾QO?+)XRTKNM]Kׅ^ؕ,kl}BNW"Jރ0Jm])Rk7[)re漨Iu 't%I'4gqƮw޹J ͩ#ȸÆ h: !.!g'cٮ1ĩ=|Оխ g}+EZi2]lZ J=O >5ۯkypjhU{o5$`mgՠiȾNû;ЗfH@P?kzɶص`-rK~o/?)u׾;Rή+>+;^쀇&VE c.t)xR?عgk-4k# lkZ^zٷƑ JOl.kN@2-@ ,LlE 3p tOEB7 YzjגK.:j]'tK,AMG"$|uZg9Uk54eC]meSO=U8lo:/w%:|+d{]+dbH88}G_|QrMiMMykVn~3wM0ٚ\;x`W+OnƮDޕHdivqǮ/w-^cLykVrs{鋱oHJ*I~~"bbJ#:䓕|'(Cj6+,Νy4*wr{Ĉ vdrwi1]wJJ!.%-7xJ wYTCv-vtgg}N+widU>`|[iW\/4D7IX -vd" Ԭ:ZJJ|]}՚~t=?akq3- oNf߅|V2ɾDnIɘMMs5JDQctà\LeS['nlٰo5<[wyg'h%,f2fdVT_y5‰RGi9+ZAF"ѧ]w~ۈN8A:)?zA&.LZo^nI}RZCmtɯRY;Ş(جZkNj)lН}ٞfOvB;IR$]o錆 Nj:v\s9) y>{}w"93 OjAX>i> PFH$lwgvC؝/>F@ѭ@" lx9B`5|Iѯy2}|Wk0Y /_*}L)v^S#9眥koyyiYz;ۿ'S~bm0Ӱ{ꮻҖ[n=`<ܓo;0oK/C9DK-58yذp ꪫo)(S+f>H)kܦnZuM!Dz?/|bHz[GͿlAfK{ѿ_0M%IKATTcL t;3B7e_ =t= X3s=7+!p G1v2F\|J츺u饗?̜%zs1UBmEzGꠃ^{U՛@e7)Hҩ o.(S 76d7 &dDNƉai!V|q$X,Q/"aAĻ0F@,}ݗ)y䑬ߞtI[.Swy ~A ~eB @ f{a|0Fl|Q+m 8xDM7]٪tɖ&YKs4M4MBDM oiD+ށ菖_~x% g!gRMq6@:!Iu9&3^ 7R"Ey^X^Ba:0E'(MqDDf XY^|q[Z=5d#8p:K## ؀~!s>|vs>~7e!ةuWѫ{zvikd+}#ꅴc:W_}5ӥѷbOke>O륨Xp~;@M D7iut5ִx>#.쒂ײM7*jA9!ELBj}RUty'FU<8d~K,\rIQ8O5Ft 0_S !F+t >fLAng=2I&>s_g"Ѫ10@ -10:zwf&*p&c,)3=,K\f `y6wqG c`%'kVO>X0#c$1#:NNFxw@!am:$}a)7HW!}7NO};~"tZp_EFgyFSM5UP٩W/i,)N)˯fsHH*;8]tEb)2?m)hNF;׿5#FdMgNY\z ,,.6짯6g#С1B>` @_d|=cbjx!3΀z/ӗ,B#ǙyGc|d@HQg$}% |I6 3Ɛ=34#(08k/gu gnC daԅBV^zI30Zk,`oV[mM@PnFܜR՝Ew9{~kdA$>.d,~xnʠH=ꨣhBLr?gݶkh !|kwooh!#퇐 ԗ)ceX!=ق6z]c@# $&>̦byWZiiH4tJ2,RNBzmȞtIYf`i棌@'#Ide7|s\jAI`:묥 g2aC@ZtDquD.d"'|#UJ9#Й#UV:52To_Sjk9ۯb<,l'C f);emG8ϥ{><3}ho}!Ԅ>2/Bǐ!C>~92M4Qv#ІC|9m1G_8$dJ&R" v=Ȍ]!8:b.:#lw'tU:|im.ӾX^2?%'e{"h.*4oߍ@ļ ąw(qPvoc=F ǘ1n>᫉}5k{; 6y-d@{!=UJV|HD:5l>=%\F %]2J$bH{o+ɦJ~ I k)* '뭷Ygx\[>bk~UW+i6#(|ͳ>Ԭ3@ߍ RljI07&C%ľNF"GeVKf+~  V>ƅ΅q&M-1PK8#`ʈ:Ol bl)3ISL11q12MY(;RXd#c=v&` s=:˴t( 4_@f Md$N;플׎;=3)&٩&qQ!xvm7>5 * ;HGjvD텨BFy~k&+{KYwyGs=Xr&i'Ie~6JdI m0C1 #CX,_uq #0H12 h:e>Q8H2 v,D!-8gy>9GucxX | 80eLw2@W4El'纖A ~ɿEv_wouu `)V^9w|g/`J:*K46:%xM7~bW^)%1HH2o27u3#p:!PHEc0%bM2|ۭ(wv_; =39M^z_N, @4z"%191Xb%*,lZO>$c?l Hļ?}*{m~}FJ8H;#PnfѯRHH[SÂLm˕ ㏕Hsy֬ƩTfm!Wu]˲ O孪V[-+MjOoLoJlC` WA z" ̕I7yYg|rupYF #|u'#{DD$p0[7y4 5c Y$СCG-1,'O2FpH1߀[ Ɩ(w110`?8SVlI#9$/Ό*/L;a@㏟)_|lBhN; կNƥCwYg頃JN'?g$ѼiL߈ $($82 d97f&l6⾟66pԍA(yT, };{@90E5JObQDe~[__=Iɏ&u}9#& & yk5ט7V愃v䳔)/uIJkA#'t WjszI6 =|+DfM9Bpʉ}ix38?b-D7|Yfo]E쒓 K܎ImT?ݢI>8W|: Ȓs?!!W Q>,9'ҭ]ӖG;Pט1c{e(4`?>XѧNYD:(k d@s[EA}jȳ$b5՟ѩ*d{4NILTMHG{[d} +e]6[nA@;tk|me}ފ+5X#ůͪO_]幰_ia\'S:4-eX'#`@o`=O֑S)XO5ޢ:|L>c|* 71m c3_AykbʊW_}"_xblq3ǐ 2xr&*k{ {~21"b(! a dXEy8dV?D}"$-dq'w$DnJw p՟*E!"p *!c>ugK~>] Æ)][2C!Y^gu2ҵZ"kF'|lH3ȀJ6k VDF Q$ωĘ<4dR00G7d t6  A; F=ϥ@IDATd12}#FO6l<Ҏ=䟌 Ysy+3c b`ȶ|Fo98,p nV=C~ҹFd74A6涼IR-l}h+@4Ÿ"(*^vK; 6&Hg;YDR1c4bĈIA(9I Mk>>[ ٔ8Dg+氕-flKE)Ryy.KyHgGON8LGA%<BLQ(RnCbHDjwyGь:ݿ:() $mfm}`K/7p "iv;{I\dTK.IYAѹ[jM6Ѣ.&_3ᄡuQBBou6rԎAڰxCQH* !QD.Ϣw {tP3}D6LEi l!H #AEoz04 ,H?裑Bqb?ƒ& 7@0Cv XXY`\XCvH1bA 2 kM6YFя%ڹnh>&l>rGLÇKv_w)u+R|&;^?.9$Ʉa;e_a  ;;zk{COQ[0.o`"$=&"_#h%P~;ӔpTZ͠BgI<ڟzGum 2-u哖z\l|RQ0|>.1cDuc1F&"|ܯK\ O܏;H1#cuj/w!>[)ߐ0:5VSt ˰/ئoE.o Hѡ_ŗݩ}zGf {v˥^:}KdZŕc2Q#M>d'(M92oR Ny'edr|"1_㛦g/-@?P9*1ș9Cĸ%*T;j8{lX!L'~["ꌽcL +N3`=ܟBH2$g 61JatKs n@i29P*Gf!uBd $;Ph%*ETOp뭷^F9%YMIZs5j洞@R ,TIWVD"=ef^ ;J4vtW/ >ٱ/G4(O3bEfxĤ,H>QZ<fn35(2J BcwDd*f.(.P)*|AKVAKI_d cQQ AT 4"@Q3ƞXq)_1v!Zlݚ#Fb(!Ed_j|C,Cd;qa9OwiuVYEU:Vooʅ |*} E<$|{|13Cl9@I?}+]ѷCإ`oVSCǔ6׵&\N~{bV/>5[G8^[B !dM6zrrVJjSaDŌ 2vT❆xꡇuy'eğ|9ak5c4pY;E | b??#ļcMsKƙ1,D~-6( \Wc؎{ضޣe"긔z/ s=6Y8:3 11c@^|0vr.{x7dyWP,3tҍweh"2c."rQΒ<l-Q|A7߬?_^zi6PLH֢W\1S|2bHD!b-Fe%vSͪJڔ&D /0#Dԙ7/V[m5ʚwy[h~?p Yv"iMk)~CH1(-rն9/0B) 9LI͟Ƚgϱd XPaMow(>Y`#{}+~1d,m`Ƿ⳧|̼\'eFaÆ#zO56G9 z/\*&W.6g {؆aIq O|fp(1*.6sȜSLbZzX3m/;Ӽm@Hj1Ҿ$j@W|@7$Q?RZ6ic.u%XJtKr׿U׍q([]/pÆ/ы褘x㍗Ǚ^G'tTc9fto>#Ac}>E2BWٔdlRyKjGGlr'󥖪<>X^Y3l!<.1A"+[S;B–9sbx{<]ϛB} 0+f_rNW{gn[*`BJƮا>/rя(Щa녿(Շ V4W :5ɣ=HK.)]{m%j%gQ~]PwNɷq]#Iщ/!9CO!srH#[.o ziE3)þsϝ{J3_wkEC3/a̼qc&el3-&BcL[jeZ+VD>?e,.|Jd"1^0gmJtU̫K U2ƙSK+>|K|1& Ї U׳32^Tr TgBe>h1%r/DggYD&;f?e7ƤDL 8p3\Y,>0B#5U`mtLtlI3ltpG((>Nʏ{Mk6,ҥIKDLa%wߝ$3D5tPY^%yQX t!Ҏ;I>!oLpFٸ袋fѐ_|q->y:9;xRVHZ|,t@rWψ@5X\BA)W_H>:QZ`6ɳogDX=F[Mޭ*F(^"ʌIglG}K%,ۭr0(%bFR {,+@w9c~GYQnر5)zT06䨘?#`A ЛE`~+k&1Ie̫"7kr~6AWˏKR{.3OK[m5uݍ@!`"v{kORypܝmDysUbv1o{emCa#POb;X }1cmJ`#] }fQVԩuk|_LaCC:'߹[֢_d:tj~r;|W_ɕc6WTcٲIߟVP"̓Qc~[g}]&Und՞2SO=姟~:# : K$۲~އ,AL #q5rbsB9k92ch 1va3],LpdTǺiG۔MPYCx'y3*K~'P>V?(}5(e1eޞ1ǫ60[q|a\1awxQmrl/1X[D۵":\/5 ǝjc T{y+ǙccKq̱cOnǙrX/l[ lՄHHfQA*&G]bB:\SJ|p !η(GGLI .{6!SQ~Q(K~oK~5URE2ۼC22u4Hv%RA%ҽo{u؞W|xl!I\s͕f-6>AA(L kF,0y`~F&ғIZ,sMY@v[nS"V69ijZl,3Bm&ĕN0E.2ʐgiea?%y/r1a SUE 2݊^q;:djrэK{Ņp =y/ ;;^M|DzC Cp{R"`x7n͑OMM8&_kI&'|v!/}9%9C)@\mWW|/9!}Äiܯn~cdv{bsg\tcU>إJ?Wj|:|ak۔J!2c]q 5CpL C,*踂[#JA6(fl+ɐ yavQCjeF|,)cs@%}*2+' ,ʟl#oV!hw&C؎*Ʈj%r)"69J1xC@S-1%g+8v8ܩ]0o>r%ݍ16T3?1Dٝ"ޟ[b6}~W &8q:-1A,cR%t8tL=%jQLl% Lv}t6 Wۦ^tt=m b&&x4z[RG-LA|e"TC8! F; ?};!_[D0-~ l )@+ٱԏo"d!{W{}+-TS-9?.F ijLnIE7ʸY>&.Po6_@ #f|V(eOxGr q4|"i?&d^/0|nS}f] 5/F>(Ⱦu1>|dvQN?!#D-MYXi(gd~ʌ\Rm;ҥ9kXh;%2xwߑ#]dgd;50FL` ~?%ǐcᦲq%iT5{rHQvvB,l\c62dwb+djem)m#"EY܎}䓮D}/d2`Q ].{lGzv RuHb(blG (~Oa V+UflBB:^;0Bskkyg} 7ܠUW]}!`d2 (vQ.vO>lH"A .]߯d*Aߐ ڋG cbjEY9y^[X,E=%f9acP96Ź?x}QϘ F]iܯh;b(7,i3T`?e/|8wKѥnrz>ЩuWK+zKKַWSZiiԹ>чVWW_-ԩU_MF['*ЩEJԙ$*t`0nI{;kZKZ[Џ{_#edH1JK%ئwLky_7ӿFZ~E?X#+Bv 3|v<~ H0r)GeB)%uu2F:8sy~*f>MbY7戵$dW9ߎu2_W_혃SFȇj(?rl!C}(}~O8omw- #Ȍ.Gsr2F`L1&Ɠ(+Ǜc*/_O B18BYmrq180ĸ %֒%"1TgWm\a(cZN퍀gt|::H}Mt101P`U ts ,b ئGA4g)*/\*>yR pkfB%;WsCT ~e"\X޺B"2Ep :?mT$ 7Rf퐿c"'d_Plev''}](>1Z_m}!SVO0F#~PysO:#IW *`2gzGFDDFrdȍ?dJi d/GʋȈ2bȄdD佐+˘?zuJ''ΧGΓC[M֋}ۍ9Cx0FbOP Cq'#`0F5(gFXˤ.R6 Ik]:-%hg&2_dNkhПFhBGŲo(+7C*aew ]Rn)W-68t+HzG/%'I_/=G'ƾQ#v(#_N'I ;}GnǝZ'MSzOb+ƩɼJ{!=%󤣏"'%B'#`/$Qa[8ϋ(1cWnr/xE⾘Q~ZiBjc܏6G_Z܎}aKee_KZٟF?K}+5܏~EQr0C 6e~?^v\ Gt=_۝nTI5_Gc;bZmFjѧFY[S~5Vtѯ>ʾ?ϧا\ +RUx"CVZ}m%wX~&2Hv{Co_cr->ȦACIJq|ЕƋl_~5j%~:}XlS"omqPoBc3Z[-yy2e1Ǿ(W?C,O>Zr̿G>6(ʋ?)tG_G~/ʎ8je緘#;M_s)#ǜ=(-㷢o#P/Ȑs3Q_Nqr_wc cia,cLiy|aY:ivǛjcJq_b<+G-PlG8cJ'cIq&ơac_}̇:PDr1lXnJmj^ݖNcwH^*4\N;IﯴۼzN$E]O eq cM7i>x@69q/[RK-T U4"[?>dad N/m;6Lzi}!_ )er*#.JּNF#`0F mh]ϖ~#騣  3A|> qW[ػ'öT"'?9g޿Us#y@MrR8#`0-@O-҄U;wdG_^>TÇK뭧6T>0X&d'%?RЕ׿vR@n.|0{D0'ҜFW7F#`0F#-&`!9GK/ߛ'Ҏ;J>+W!dp8d@g  ;YFb_"'|rE;X# +]\ď==?ω+7Pa1GH3F#`@ %y2,H?,n3Nޞ>k~~K骫y $j8#`G3T+ZF#`@mFߡ?X&cMϭ0eMP5'#`|8yg?i=|U#kҹ;>!0$oh#PJJ)A=lX^^Nǥ+e@x%/r;&ҷ1F@؆kK?_^}530C[L־AoE¿i JK-%5z%hym_#`0F#`@0d]vf!W fc?Z!FIԋ1_>򽍀hO>)Ad  kfi%&L`馛$T.Dzms 3'h0jz$|IcIkzp0F#`8:tTSZe>kaL9 { ]4'zF'/`d*#`hgL4{!0 ח+UVouF Cq[n)}eF9FtRik9#PD`'ֈ#m@#sϗ_ӥYXj<-]}#":k^0/KtM3M#Hې^i@sPqKtyR51J$ONE!eCKs){>iwM 7أi0F#`0FA:ة9ƒÔSJ+;'aZ~yF4 W^>@w2F4x V_]2DZy|rEQ,~X:\`Dw^'} +H#`0FVEG(o5DӮd$㌓?%H+>{]`s&0K/I3nr{0F7߱(?eW$so]ƛ0#`k82>TE୷N U:rh ;i4D~N9FC|  O&uu@c\E#`sMw2Fx)s[g_n_DIhw-4Bˤ}\wiۿoj~|Pg?^xYCOri<YF#`0F#`M_<͙m6d$K-%m3婣kb@}x:&0 'ЈN"GHXw\Y 5D~uK8#`0Ftϛan`ApՕWJ*m_K;#`2>D#`,ڕxB=[a|p ?YgWFԂ68G ?I\Yk:FdI4bĈNjj:wEv?C87F%zcqÍ@G MvDSH#б<@N8<ҜsJG%-`N J^>Xp#`?q>ϨvQ|w\/79dW\!2ҵ>q`v~ (Y'#`0F#`0 [)D"$ /WXB˥'0ROz\~8thF`yL9*&K84t4J>Ziw뭥ޫ,gGפNGo/Ft)Vw1mď{,>X}#~{ڴn` $A;~ i晥EsV[-}7S֒}#0rޯKSO5gq08/}a^/Wyށ Itᅒ5F#`0Ff#\(Fk/sƞz9Љ'J^/xǍn@ -LNF -5SM%mG~]骫aä9Ŀ9D[gܠ's,`-#`0Ft~*mt챹1HmtBgeҫ%z%F,F#`/J̚jF#`707oVL4Qr曥WU|0}EӤz|i・#F!˚.჌(!,` +*#PzX4<8 I'X"RK勜3@p@ݢgZ sKtt&(r0F#P\63 a.>y˔_\> ǮLs]hpZ:VxZ0Fo07X,cQ1+9~t&f :9'܌;OH>]vF"{[Fs#ޫxs%7jIg!~ 5U5F`$Cj"ȑx|u)5I!7{q'IZa0-K묓 FJ*n,#5[o7ҁJ=m}>^~[ou[}P/~!'U.#`0F#`0%GD%@^~z闿̣Lvy:x> _ϥyY[kj݉EE#`FE;.S܁h >xi '|W?.\#^za;]_#`0퐱OD.Ba@geYNvҺ憡NFZ0F#`ZO"tW_I\#^{IÆI9 ])68s;# #F>DyKg)t;KSM%mqn7Ytm0(#P'^{MSiYtA_#J4&H/4Sf}%0F92gn!'鞷"̴9)CIoh rb]!?|:Ě`a3F#`0F#**u=@YsOS2KAcC#ؔ0 p_KK,a<0F_^wyQ-&m]E!Ss`!B:X9w]0F#`ʆ7M7H6s}]'Uc)jqϖ_cGNj~N|7f#2L #`@!Hd:喓FM6iw3'>Awn)_)]6۸frF>G׼@'?XcUJF  "CHK-VYvzp@[[Ҭ#PN `|?:tQ9NFf# "1?,LmϫJ/Qy {?$K/9$_c jr fȉ/:'gmiIsjW>KiǶv대0F#`0팀 mMA?AqGg?]QؔJr~W:<ӿ҆Jy58|';#`@୷˝(yGi+'}d_uUiIU AfM"b +40F#`@`N'Ii ;i>+v] wK.0t2Ft/Jݯo0F@b_~u-c-Y#r%:tB ^{zt m7i㍕r%kLFO#FДSNiP0="0~7ސ. XCXez4F`xui澥0="82-ycKk?F4;Bl t Lo7e6-;hwpivog0FkYZXNG`A'I}9F-p-z"'#"tMߍ!x{|0# g;/'%9Y`-Ǘx jM>XzMw_ $i߿"'lAXkE%-`@IDAT drF2khsc2H!)~>U38fm,09zz+o+fJp@!|r Rj[Cs"6F#`0F#POLYO4}EEGH*xc^묳9G/sbK8#PP4q0P]?R(79J"M0AgaR>gqu]simC5vd0Ff#pm:H-vn$3U(0LҜsJ#mriI89#` 0FHm|-q; <8 qI֮[l磍h [oo#TS5>j{ d3mr+`#P$F._z('@xҘc~#`^[z%[F ђǗnDn!$>[oqW"\\p\VC !y{G!iCf*F ͝xH?lZY D`Zqm[f@R|W^?DDe+'t$-,?2E(90F#`@#y :C }`՜ :HϭBジ㪫_ZjcwNFx";#`0 G}^sL9*&}oϤo[ogC4;9};G#8N8AZpAi{úLlI-qݍ@YGduClta{KK/B~f05#䪫|4F|t9%dj"ot)h:K#Pw^|QZc ~lYv ao]w.8}ѢF3N[[PIaHs${o?!%Đ=Jd0F#`0FVƨ@g@`0|K?qǗqgў{FAl 1$N͛lRNFs:irp-5d7ܐ?B.BfIGXP`UZ/~A4KggVyx0F#`C +HL'|r:kRG8B~iphjkk@cМ4yF#`@ `BQsd^?"HpBs2FL8a"pQG娙kQ& ɠ?@ebZ S'fH/i1v!EܼF#`0m:4wIX6tӶi@B@>U I?יbd@σ #`0F6A~Uk L[^GLa@#Xb w[zFnE^yEc<6NFI[ߋjFc)t9!Yg~\y2 , ,'#`[oI| #'K[m! zytgksAƩw0Ck%@K_I 3mWjW$z:>H).td~(uW{z%&HSM%=.Ho1Hm0F#`0F|r@ #_JnȪ*sS3WXAZH"72=-5tcu}0F#`@ {}s :[hk%c- NМsҹAom@)rJQW#`#$k2ִ5űԗDֹ>f!^K+$HtuI?44c3'kʆd) T\#оw9)QGFD3)Vn}ܲ@ /:`4Kg-1~M>Itֆ4acl[e@!H뮛k]'M+xOY8< 5&-=ᩣa'#`0FFscC2' ;?,~w46*McL୚0RR)I@PI!I#" QRIJ(!yxιs{kg{}^|1p%m:jD #MT@dZL#>س;7(&o@ժ-E@PyZ:Rl5 C'1O(Y #U5A~~LX-s 8Æ9aȷ7w|<'L rp"" " " " " " uxQH<$7Mq8!D0$ز%UjG0P|E6wtb h^q@.(Ҹq&!IҀŋ wk4k3pM91fF<Ɵ@7oXSQj׮|R`‹]R/ԃ4 >OS'*" G@Bwc!`RBiyۑG:AG&01+%.1m'yOAƍsR% Xz+p@:Bh$UD@D ? TK 96K :+T{,1)`|@QG{&Lp,&Oބ^ӦM1p@[@><Lrۜ+*C[nq1xݺv2E. 9`CM\r67]g"j8-" " " " " "-&.m,ȑOo,S.￉[G2k#Yg9G޽#3k^ 0ȋO'U Zk(tM!NmsY8Lq5k֘=[TQHzO<ᜮMN9f4[йs '΀oSB|TH.Lފ$ A=L#7>[X;ν@lR]0&\U{ 8TH;9)"7J* TP!p =|K.ժ9aH rQ`FED <Z[,^섢N?݉fp[տnݺ&`>_0KD@D ^,ZSmȴ|*'TK 0wmziFgIv-0~;|ǎ@ٲ@6{it0<$P C@Rh 'HͩO"ْ:tl`RE@rCY; h"7h_Hط3wW\YCu揬g^x9f>4BqgE )bMRED@D@D@D ^w, SL޽{qW?XBVN@tQ6:" B`N[RXHdc8O|&@sF:"ŋ}f͚qs5YD Y L~ʗwTY(]:RhСq@׮4j(nEz/LOŊ7(^:bll &5tc muGD@D@D@D@D@ hxA`J7w݇?ԯ2Q(TD@"@`D*" KΜHzਣ`G+_ ˔&X8t%@"[g ʻZKt zr6l9`)AFED@D@D@D Pv?`e= j sM% & W#͎1I,ᴟ,cL""QBCHQȜi9q~ω A2QED oZY/ <v:֭D@2z*5@ 4?J^r37 y6 ر#;@>7 Az6 0ć={:'>˜O?=6n *#cƌA&MV~GȢ\ MD@b=z8@@ .\8PF*" AF <{>6'`N/D@)sHްaC#@0!^˖/SgqeۻD @.oRFE}hz gD=׉Q qzKz'5^zᦛn2?;,L*" "-\k'|n#эebrsSIοR#0s&pi9zh/^W)3  ,]DGnuWD@D@D@D@D@D > H2>ϛZGwgF粩tr}`l\sYv$$Yg&S;t,KVNG}2n%" " " " IG`DQEǎk UаaäNkW8[6 =/3yhRpPQD8[kmJd4h$#˕qU@`ɦM@% 0~$؟@(i07n4UFjQD@"IX1k\lPn=u |#\u_u=jZ+"}U2E ?XZ0-[ؾ? 6Ы"" q@},.|FwX2j8ύ+8ᅬ"`E@ذx9E ti"L3dl@[o?><"K.5wYG&E𚤭D@D ,wI&Xf@pBXb8찢_Fŏp;3p󲛱jk'g^[+v0 c=jNEA%Bq[yTC"'ԴD)0m0aBdL_wF'|$Rud'PT)*樈@0W4_cBxSSON>"㹻jÒcb"E&[;IWxi'sE7olY'1_D*nkk׮r%+8SN ~_WU@_ݺp1LJN_ŋRRK"grVaݣlRS Xb/VwB|T꫁~@T !xU$5X,/鼄 cDO'd #F$~_3!Ez8Qۥ LV wotM0?q49ʾ}<=[s<1pN\ʕnRAWt6L֭L 8&?nːwiEQ(zhذa[Lssśoԉpj35aÆYxwq .Hc+̞=ZX1=} ի J tfql<?cVD3`1" " "$m:Cvfc3Yf8ꨣrL$6%6<)9|'7oy~L--|MI;hcĪHc<;>#U+E@D@D@D 8 AD<τ *GRMg?`)e0yMFND渒%jtc{9H;@ɒ%$#|ID r , ~#]{ 8X'yի#51`ƪ f0v?~M 6 {aYV"M'L@Nfv3mO}S@\.Ԭ *|5@Q(sa A~wSڶ7z4, %S} 9zau<9bdgx-&R/D*'?%E# H; HxvsTgskjL(_ o~@ӵ^k4-f M?X[ÿ r:ȚEM|GCN̤ܦ PhuhM|K1vܤ*m۶u]aCi3бx},,"oK)h)-B,,E_ow)V~o۶_6夾-bfozVJ83b}!x$=ݻae@˖N/=:.Do\h۔6m€|re3&SȜYiSl׮\])$#6_ztI?vyF$ !@8>bLMŸsN&}  tլ k Bz׮]q̛7;wp(Y ذaN:SQo3n=Xk??#~k_ LH|ޔ(l32^ݻw[*No]w97}1j(y9KI7|z gM6mTԴ}#Y_EͬV ;Wۋ@ذseΙtL|ʼnkb o%  Ȫ|;v,~G`>Z2՘0a^u,x_O۶m:fEhJSH`3'2=4[&M+Wo[o忟r)iyI'_{5ziE mLqL3p(y[ n)y<7+WW_ۧYyiF$mLsϞ=`zT?iSQh?C`L>{@{ィRexR}(š~SsR>mۀ9e]ysO88ӨQv;ؔ.+[-C*Ŭ5 *.+Z46%d$\&&0}vNxNFlPc6֮̎Ue&V"1֎7VD B(I1iD9FD@D@D@D  ԫ̕$Kq9p'Bg?8+Aけ#Ν[z3?Km[򜨇M<"@9ña*" "hXgE嗝0$,F#c׾qn܏&|-[uJp__',{-Ɏoѯ*7"+[?C."L8I ˱[[m!R6n4JɒE`XG^ߑP£LmQZqio)g.F;4'8"@B#QE@D 4ퟙB F"Vڴ_}i/tg;!_}9=O%yMyMz[yyZyԩm[rI-ޫU]}xޖ-iأgO MիOz ݳO6ALĻ袋7z?oۅ? ?؋Dfw~;F!Y:S{%@E 12{ۈ]76t_X!bq1\sSnX1bө(y)jwWX$1plpجlHyC]SR>TVo C dd^;K hcc続?~ocX[[4oX`Ik ]|qi|'\oZbr͜?Q/sv~:,73u3L 0\{L(;cK6lOF4`BJ":j.8ԩ׶gΧn]c,/侩78mEV> U "ow!c̒{y=-\"wLRKJ4s2e} p> E277L'IV Gx!Dt@z꽮Z 9@s(QcUw  ,[x У@׮A@j(`8SvhР-_~-JYnJ)S8SS|ɰ,lݺ@^~eؠ馛PN a׮]0H_%gB z${Ϟ={I+'N%\LƲ|懺u„pc̙WuVT/M1+z6 0}, x8pZD3/+VDf|aP㷅bFlxׯJ۶mBE-Z@&M|Gk_zsw5A1c2eG[@S'NMQ8+`{BÅ?M;A=gK t1wrWi ,9μtxf /~G=֛O`Y`wn| Y( =k,̝;׷wS@eҥ]XwI,Qٟ`RzYϩ0.駟|A/2fi>-FgyYV@-Mwkfs OS}a}Y_Tr̘1O9(I!> <q'~_Sg&nj=%W{ry݊۶mm}a-oon 3{'KXp]N BqO> E.w|HN$s]pfESJ8'sbgs ek}׻5f\ *" " " " "_|fҹU.9ɜ@`"Z4||3Δ}n6V ϖ" ڵk3[e" " YK4l0V%IA[\td‚`%;6,)p2 ATD@Ǡ8أs\j)ɋ`^fcn|~0~`=\LQpK:Tۈ7|۾}|1e QeJ0|p_8e˖[PCܰ[nXjڶmM}Q8 8Lsv=X>lʀV D PT"g wn'0dRAQg3`ȑ14q 6 k)osTE5ʿ8ЮG dvPJ,i\;L ׯ()HEۅ"|Ms4[o tMwy'2R0%370ᚕxfVm qwq/>}EHfʙA-͚5 ?QGl2e0i$7< \\+E@D@D@bcq6%)((MXUƍCڔ7-DjO0+LTBիv￾MѲR4%))(G-z7i➕ "nclP?"Al_ED@D@D@D@$S>< *௨X"d6gx~%@ 0զ\}i>Ft-^ pscq)"[Xn]n" "/⋁)S8bXc,2'Έ(;6,?`FZ9_ݖ"q.M} KvA5U:rXANAAPw o;Y]POy8`[j$&:QU+a[' K3H̾W''@͚i&kW}h:ޣcǎ(E@)f͛QF=W^Iٕ⊥K-htb…2dum_}UZ*s=z]w݅&\GA"P {6zh-&x%+9)K{*`٬vӆ*V/v/]킸ʼQ}Qna sK@6K]a\7nfuBplEcc ȴЦ,RĝwiA4ؔ\XU(r!m!ڇ_|EHc,hlJG5cTѴ)rlo#KY&IQO5&R%qHylp5憢"@PB-[vE/Bz/L0fKwwBy{P㥗B:@8g{m#" "5 QOcJᇝ%8_vKZC_(C)kMFw`M(]]_jIhXΫTaU$s8a\ #3E muɾ7+>tP`#\5D'ȤV;1] rٱc ,V|??D/V2)$xq1߼'J.dn~s,~݉hG飯YD H?"H/GD@Yx:jkZJ6Ǘ@<*y fo?myyOݮ˦:XveA@dM*" "{^ZYװyf=$+MɽCUcSl!N1ڝ~ 6)iN*oѢ:91=>3[4I1Ϗ>(]8יٱS 'cڑJRA`z[6kV4jW"  $?G{N6cw…;#^9?%3Z&E\мR+bJ@Lg`';ӧV|'PBpc|O "CWd嗻z^|12HgI)L*#mC#\{-C6~֭[aBC0Q [gL˰2Ămv_ղUA 3!vKYc3Sq@%oߎ;,(]vD`bE0ѩ4vm{7a#c"o 0K"x gs։@bXxu5@@ŊG"춈#ǀK/1֮]SO=ÓO> Cٲe3=h"h!L0mL8Ų/3c EIm^ܟо]W3>z`1336khoow xA{t7f꣮=j$  uOg_SŲ}m,J(Cw_ 'cwt,]/r~u.K72sʕ.qL@9;yL^jU|m?~z*^" " 9"06 S*m[Q9|LsiSI@6X.xPPt ୷|Yg-mX= _bAO|g}v̷Y HNgݺA[BS_idÇ>|i8vUAwhذ!/3gN+޽1wkUD@3|7" "K AROq8ܒtlf]g.i3~6G4j,\4oqP0zu{2sp,_>=b%ZEy?0pD \? P;s=~%^Ip~ԩzB*鷊~e}=_}d*Z:t`Y/xO%s%JL"" " "LñD )(W_@~T1&}dtۃ*Yؽ{7I _<h&@^QlgK˖eH2/X" " " ",|iE4 Azhk&=￷ L t#-$cȐ!~u0?7?Uƍ@O39wUKvXm%"  A`Æ cY}_/u4֬87ҿ?л#9h0Y}* i6O&IxfŊѶvX|ۢ YYσ=__viESc8Gf͚:OYc@׮4]'O<[ϢZ,"!8`֯\v@ςlU D@B t2Օ'0h@={(zpҥ j׮|fV`gOcsF(4|rցyD;R*h}^8|miw,A`:qENbV}{'ʛm1=q΁tԹEwPM6;H\g4 O," "  I,sޚu~'ٔY & i]T(lSEH! qUZj믁͛3΀DD@F 8@>ן hCG.,9odv39(X G`K@(YriԨ! ii_?38K.A\X}_~z"g0r$Xgexuࢋb9jLc \R J`^{ X ĉ6e[4.\(ܠg'V7bX'ڭ̾ww#@~DaOD@@Rgסu\ixV"B*{_yr4i8)3K.#<[v"hԨ;;4nNlƽXKG+#Ke`vH̤Ϻ ˋmN3LyA)NdB;T.[2㏁Z,"[޽_r3ֈ@|6 p9);:c#$^ nի#߃.rxrʉgHb{Ƭ*" 'H_;\xeH{KL rH{ zʭOFD@ѷo_KF^<\.~=̇~ 1v{պ%˜r6>`3hOعs'>S_r9|2 wAS{<4hc3ᇅ,vh*+h pn1*"?;W^,7.Z4." ")LB1763ۀs:V^Ӿ93c܏$/'.bvmaB 'nԲ!SsvFBDrB@49}D@D@! p(id$P ;>@,hMhrtXnilc5'l2|ٳNJP^L;;>`ǎZ8~ ~{L'JvJf̀ի]f͕+ݻD ^U,["٣E@D@D@D@Eॗ.sb:F2lb׮dWZՂ?ѣ1n8pI =ѦN*" yK py{LMD@D@D@D e 4c?J6mʸ\KD@@>}CI/&ONjO֭;r M"z.NtXvmVD@D *1eR믱fL8aN، :> ?^bFPh(_쳨4K){?]P@o0';rˣ57߄ـٙBT|U)" F`r+ Ɖ-^ 8"<ɻw SrO96J]K1cG=;dr^/95㏰8~E $*" " " " " "  c@%MwZ=tl60~6T+kX4Ǝ8"".| i :ה)9;bfckgn+T{"t'ty-Wʕw@"<舤= OOԚ;w~n5\`VנnuȾiD!?d֡D@D@D@D !p>\9`܌aƍk@bׯ/3fLOs& fUC M6ms dWOGqQUED@D 0F+8~6Gx WGٲL: d" |1o-L֘$J|nsc} Ԭ L>c5KnѮ|=I:@Rc{(`0sM4:(O+)ؿ!C\*)I X{N?٭[y`I-%z]e&g\]{D]D@D@D@D@D@@x/H|A3fRi8DeH"ѣejB|;vԲAF[0|xcs>.$oۥ%>ZTwCM>G_v6]&.P¦wߣwztg1. ?}:@ fMsc s#tK=Ӽo9k׉s; F<0guk/0@m* AGK[&P>^ ~8X'п3Ջn끣:W] |GoDO>f8ˤ}0@Z*U/[ݻ_~%f͚/6aSMhN:l\}uQT;y w{!>f̀ĺjՀmV:uz*" @}8d$rkaW˽/6pXD7QvCƮ@^<}Y t␌O͗u x$ x0tF3uTD@D@D@D@D V PO<-Lv14TrGxx'Ѯ]; *;2)A=1A{dF`2T.2e" " " " 4h.jؿ%KZ>$>&whFsN;={gw(""J[棵thS+E5f _e|Yx'p@Y7|.N<1:thn8ŊU7lh;To:Ƿv B: 0mXj優.&b*s3URv!HCR1Pƚ5.F/s֭8Wt@r.V-T(کS|8x=aЯmyUD@D@D@D@D@D@# !H] "9Ɖ@nXcq۴5kbԩ&P<Ǝ2 2xg7Aƍ]%0UD ƌeuE]##[,xoxn}7лwL;7_D@D@D@D  ̝5v$љ›*!P^=|69^bϞɖ{,&M-#s "" ;Ve$" " " " 8T'Ji i[RLED  03At .%݋.N?x5H@(,#L aUTD@D@jsW/vdɒ%&9'ϲg[ѿWrK%T?9p ;.B}{3+8ysZpVqIu@D@cFSz `2 A')׆ +C\m[#Ж#_ge˦}Q L@":ysOg#i)[1α"" " " " "s9;)yBG`4S'5M{,4"ƈ裏c ѭ[_ r ,!%`IJqN㏁Jn"V~ڽx6i/=)wr2PBNk~" " " " "Z8=n2fV9:h {ƔЪ-&$p'`p@䎥D PJ+A`pe={ߟ~WO" C; d~G믻$O#S&dhӦ) `3T@.]3U4(%ʪVD@@W~=-Kh?ĉf[7"(^2ga,3#RK!8_:c?S vر%JD :@p~ aH߾ Wbݹزؼٽ(Ըt)0ni[x߾=#"E%ݫT)ʕZg@EiϪ'n=?joO" " " " " "|$|\=3t"3T3Zqց8l.w0 ՜ƙp}t|3xs@T/瞢j%w ݻ?)l2ڵD=d'0t@ZYwy|$w}ԩfG]kq Q D#pE5iÆ &`J *" "  Geo֬bVN&Ov15W\D!kN'd(HN;ROͱG'+W_X.Ow4G糫$ŋaB.eK}8m~غE"gS1κ b2Ic(Xx^\uw;D@&E:i3@}BGD#?H۫UZ:X$+ A&W' :s"jոj~6@7|qNZZ1 ߂mr't:4CI/7wo03f22 @~ @(flVQt-3g ̒wー'@a\%۪ߗ .iFBi@@gk=xAfM9VڜH`?$Rb/,PnТE \~yW|ѹX9>5BWe`SB;$1&|ڗ_g@PЂBok,"/ u= J*i 0a KND@@f[Yf 紪'" "@x''I_Gu15W^D!U ZV#TпO]#L7q=(Z4CgI3f8~h%;(\8]BD@D 0c~D6|#oOc`Y3,#?9+_pvBb@LJ2 ;r=LvO䉨F?|8ثDz9Wd#L{GȬ"` AfFJ˒@d)NNiq0T,y W{F= ٍ}Azp\2u ?Lo wW?UW>7?87n S}:~W[~8ztzIYEBED@D@D@b6\ B`9*# ٻvE>Ք9 *f_D=q{0kx4hZ*" A֪޶JD@D@D@D@^͚ͩ| wH&O?}:,q$6]1Lt!.] g`Fwϸ$ez"" "v/&U<;0#}xJ?{g/E,B) A D @[&b`#X(b ` !ϙݻqݚ}3;|gv>/F,ksG*Nӧm-Zo?Rr@`{w஻PY\J%⭷CrH`ǾV \N4Q̑۽_sOfG@0 wQ,گ##\y\=[xqZeE"6CAx~iӈ("Qҏ(^\D@Axl&J%&O\\D@qѺu uqNӦpё#g$bP6;a/O)B[O#s΁=6J"k4 J)䓃Ο_8"RC(JQqcg!:*G#UD@D@D@Ga4j47V-~]EgabZw}~" #`PN" " " " "IsgK. z A6oE@m(j@o*=G3Hcޫy/f1<zaNBlLau,\P0D@D@n?_}5pAA?t">oY)(WDZcv>R>PE@_ˢx"e-s0?K\``N[/Dn/Xs9aki LY<@⋁AnS,Gd." Lxej܇>fJ"P짠$"/ ˗^>s}7I|ޓf̀OآKhL=z?[$1# w΁nPѲpu>x>r 駁(ʧ;+pu@~ ]Lebm;$" " " a$ШQ\0rm吝U#zbU;GvM\cz*0{vЏ߀ 3g;֋@pveNBFsdNm|]D@?N_?x x#xO̘/^ t |9{o" I`5 QHID@D@{Lw[($ivQG Z Ary+em^|1|9c-Zg?n}+@:`m֢usȉ$'R-wV`?NAjaS{G~=-Iʛ4OZ/xi`@2_ˤ|@>~D>%QD@|R(^b{(@!%|"pe-&O[)w(I$ Ss??E]2weFcYD'F,+EEq[?L`։@`p`l@mBuߪ7ƤckE2E`c".cp݁u3ueWDϊBUމ>ί; ;(@X ps- G'utEEƭ 4h8=yܸU}]>)@J" xa:uVӒTX9F{b>E@7G 6k= }vx V0)P ؗ%"@5k… CD@D@^=O> t[>lS`\)ڶ G&dP.J%Qi0yrvu$"e "*3Q@1#Z^~]E$R6{Sw9_o@xG粟6=ќ6k۫RlC;;qoQ&L<0۹7'!yq_xU;\ixmR@ ~D" "Pw,OmjERr@eࢋAZ:*Us FSu$:sLyD#wd8#!HaP4#L5 hāH%(b>d[o_`5*zW : &#;_Xg`AID@D@D@LNñ ><9_|.;v`No;h4K@z Pr:*@*(BA8٩QNJ++O{n U" l,?_""PljժE[U^ж3(9z40bP6ЫW ټy/1>}`(2rd}h>_UӼy3ӧw9X [e=ֲ_Wy>\HF ?Q/s/G).z9?/ǚm?W*e.cYk37pz*ٸQhٕF<|}1pA, ~ F'ÎV(i@XV H{꿍GD ԬYovSuAH CϣIޑ~m8f_O'LP@Ĵ-ʷmhѵ+Je pSv[yo@IDATo}f93'sXwdgL`;?Ķ0߷#~}^xˑ$/ֶss^/N{oNA_uݟ;z߷s*H P01K0)|*O&D@MuW,@#GNgHFm[`-~('q @`G-[`眓E)،׫cF`4@J" UT 4lؐ tЉ He"  ꫁z 7DA-%[yM" GBhP$" " )},G9MPڴm"<U#w#~aӚ@fH7.TO?mArpC`Ĉ]ٽ~c@ ?rS`-n-uE6S\Se~y_Wyc"E/G^%Z>e2 ;#G.G6?~{qKǜ}*Γ-K/G;8 x JU'1[J" KuN N8!wB4wU96#^B'\M7&bbqo @h78U\D kNCdիku iqsn Z]tо=0y2~>ZkE u_}p0r$P:pفHf~n ?h֬FO>`=H}&#:{E1ɨi@XPp"1O싹z`’GjrO ,\?рlk։@q(Ҋ@xr0zt-t ?`@qh#n};(lsk )1hSH$,MS]Hπ"25. A&" " %7[n&M 9`Q~ QHu|*6l;pb_yLesۿNf`sOm|S6|sE.G=r[DoO=|Ng_4\o3G;+9ϳ }>Oa=3eJ0%ˣ s/־*=zchcn u<_\-Ay܏"w(vCkF~cmDo>{eW08)۪UӾ褓 /R( Kqй3ЧO{xaRgUE@D@*J`7cj:% -(3>f ϥ)s =z}7@aN므i cCQF@2I3HRڴi>0п0hNȖ-WmӒdɁK/͛>y2ɼ=f peK[od%f>o"P1 (B;W/h{Џg?'wjՀ?,r02r6$2Dc%(f] " " " " $n>hS*:@'/1 tZ>o(>DIo6:pz]D ](mXx"'[D jb5k-BX#o/{t"eˑu~y?W$o[+s|~'d>">>BM& >ɶq~LGkX*}~kF.GO S`ɒ>g@ϟ#ym~yrc"M>O :>~U…9"s!gc_m 7{j." "~2ǁ#7oe=CIDԯ">ʧJ]]R@U*-.+"`QJ" N`s I.w ;8D/9AdQ)R٬ШQr;?tj1b6E?(^q@~u뭷j?-@&pgw;;4g$"%H'F=gnD`-"|: Fy׼yAv'#ˑ%h`QMXOXư'̚%X|8SdqoRD@D@D@EC/ٰa k:" 'P@ᏻ:+軡0/E, ʑi 4h}2Dr 0ʕ~l?q=';[9q=p#&Ogz>\r,r:?9_y\^9f}u˕T䅦"ngzr?lU|b>PPK\-`28-rW]?j|ғ\D@n5_\{m-8}bJ![D@ A֢E|/e@>Gd#" "^`7< D@V0w>%B @hp{]~M6 ;u :h(YF - nJEN+U:kuykȃ_}leV6\ZtgB{U3Jc8X}:v,@ Ш>C_|tD6m*WEe]`/^\w+JߋY+e/N6ڨ{-MghDgA[n3/}Wiy=5P:'o` 6&Vs97 S嵘1]D@D@N*hF~M9Rt\#'$drK`cbS2H!)>BbJ:|!`+쓮Jݼf[÷-ؾ˴1Nfv[ڶm 72+5D Suim2uWD@D@D@D cu H ?%O@˫'.`] Ɯ9On?֩y28si53ԲEBK,)#M6<21Aآy EPˢOJ"PUي F5{bE k|UB0a"An >7w\s-7?>;7u_Qo1j֜lƉTE$i(j֬uA^M4;vD!?3ҐCS/C/a)J) Cyߌz?;rOﭏͳŏ믿7hnފ|/rh<LQP׋[] zwc {iӦ2WgC˕; n8$um֊'/= |n)'>ˑYq͚Z`s*D@vpZj^^䅿ŢY7^pXDHwZy_ /9#';dE :ɱX $KN&/Ysjf~>BBl[DN .GN,oe|zq_hul{H2!MBMRqdDZIcA}]D@D Ə͔\~y|۫&rpί*" ;bࠃS>P)(hT?b QD@D !ES>Bϛ7 G?}?vRF\nWr<Z+ʤN/" e]CDpQG _.ˤLћ(>흩OHj?[ Is7|M>7{Vp~{<Xu"Yw/~l Y٢7#I&aס@dMrw7n.c $hu͝Kz%{(GD@D@D@D@*B7н{ %Q|JID h8O?9&6q9~?pE R@ NA~B#ܟS2n!r@6|5h@AH?hcx 篾%ͳ/Zϯ&xݨx?XNhщp_]8ƽ)qQFeNt>(g ah3[\:H2#ʹ4}4vkK'UCwn#'?_^/ok%&߇Y8,j4Xeq /9ʱ4amm9-^٦˜|m ΓقW*vTNX/9g#rbmXg'ۀe'G6_^rg1_eR s;[f*xv3 .À1c`KfAg?IID8y]~:037xϋJYh2m]oS@@1oA"?o8 4p~zhVfB[dE`b ]/ߗm[nqIGR3DmժyQ|"=M)GpF+S=a ?M)͏E*(IDFfGPA_˦b@H]s"bmڴq * shs纉3lF40#{mbѮ]J9eSHÔ)4'WiDEf:;/0B M0q"ߍc'{"6m& 9 ׉FF>2"|Tn<:]uj,"VA4 wl5"(>ӧOĉfHC7>C|)gGiD;[o: >w}cRCD ؉{OছmFtuJ({ξ_!* + ng<$Sh@\M)ι{3}Xx C2@!w]w:urmmV2,eT>C` `zٹ""@!#OvGgpx[yS}tīH:+'@PvÕD@Kg+!=?ƻʛ$^ |½"G~;ʝŋyR ,p/-Z }hK6~Dq?/5L]|>X wODC֮]MWh{)ׁ81f.Bqo˒4Vi~j&Z~#|V &h,G󢏜Ӷ*[}32eX9}4+KJ" " "Pťo?p6E 3Os} ˠyn?/6_bӯXx~i /M~ ӬtScu6 %mS *``"oA#oŚ sv>S uJA&9~;,Wq3QO 6HtMeoN*" "N"W-[: v4hB!qPwqCߤ8ZhES xK`Z?.:I'/|(9vM> Y`ȁ@.(VJ0dt 5O> /v.]+Vf<_;^x3uGVz償i8DJN4Pejx݀yF"Pq|ۄcg\x!9YcoԚ*)}Q`lmݶがT(ϙo7-{ %S4S*ON@Ѡ;wO)ob-S| D@ΫB@!>-={t|oS2=+w4,py:51 }Y\l_Q}Pm_~1?J0;V*j#F5^rB aQ@1}],6VT$*O޷K5}"?}4pϳr("@q }n/J)HA?(xA!>_PϹ̉ըD$ d9ΉQ(rbc'>K_~AK3٧d8;C @Da3'p%M ɉ-,ۻ^ދzz~mT6/c D>fh." "oa-~dW^[R x!Hs91gF):j@N9͎..~[ 4#u'D:uk׮w}0 1f )S`ĉ?~'뮻bU<$ !5;(Pasnݺa 7Lyr># ,\8~E=q<])g<+ax!?p'ŖCA̧z o&z<&mРAPyE@@8 :_Ӝ9s\F߾}`쏱9Hy-\QPᮻȑ#-ůhgglcPOŖ@y19MGcvQ؞,J-$PHd[,!,>Lƻʛ$^ |¿"^ݻ_7 /yVE U4;wH}ds?u^Ӧv9#z9 \G# %LB(\NLەF֩@6η~{4i}_mUH_2XUyH: 0 l})hn˜sgd)H:/3V8_VU=$" "Pplm#)V`!zU}lO{QVm?6\gP$ԑ` K,_D Lw Ϡ?Y~|0St˖|~4 AA/"PScs T\vY.CD@D ˬA#8-&X>BOUV:o}hѼys#tEm^zޖK{@\m6{M` y@ć| 6{N;Amwσd04: j۵; fk9CS]&L4 V! D(J%*F=0R3N8!psDaŋc„ v&MdsF+ v#6|G&6d6iD .B8n),?Ȟ{iPNj)h}g+  НD2HDxȑxJT-PY)(vxM7W^18]PJ:QƴiӜ Ұ/BbP[ֽ$"e$L&><ƻʛ$^ |¿mc`#ŸgP*Jx|d_|Nޘ΋5lЉQ˛QUIŇ8Vg?/:7o'Zӌ7m;s0A=:dƌ@giGDi݂_Ay 9{rKĵ4~YUr S_VԒ@⿑o[o#E{x e죡UE iKK[c/Z)2dw]6g%ZEDh XU1E@- A"ͦ2&"e<;/,gA^ۉo'棭" "o<.XL3 A[P)>}z'Lh s18PNZ,d@2"+f;]wN?&\躩5\{[n%=\wq)!@cc'LoԪ5>!:b2^z)hű֦CXԫW/iaƌSc*.Rp>8qm4NHW1KK.ŨQp78餓pE97A`NrŊ^via9%/ڈm݆ݲeKڵkrˊdI[T&zKwiMC߳A`+f-׉l#Fp}믿볥(l@m{-KJID  ILs}xw7էI,mǚ'ؐʏ+"ͲN9p2b4ib]99Y<' JS^3B( ǸiEiѢv35E+VOF>g/S=n8r!󧄉R3@XP8u# ?"Gl7pSRAr|#xbxz 6 E"oE!)XiwFݺuʯ)hn\ +nB:aZ[6W"!ȴIDpL6e~g+@RPEU=߮7%"P\7d~ 0;ZE-H$0hC=[n7qDi IS981qCIe{^}`$Zj9Ѯ>}`-c_a` o`4is^۝GZx= W^!v0ʟkG}4,93 ;o׮]xi3*^pϼBF)xN\uUΰ_~`K5NfSNQ:0ʒ@ȑ*]$u߫ƍGKo`@U#+O`ԩNGn!ʕ*G1>|eЊ}rj9sCU֕Y($L&>ƻʛ$^ |c |N=0q0E~[,n4$>}:|M7QE͚5ݸ(Aa;H L8Gsb̙`̙%l:;cf]A*/SoڴiyI(u:;^8=3f F9x<zUb$"m~( EF:72%-)Xׯ_Q" EHBa){U2sr^򥗀 yf=*.{ lMֳ  oF~;=u";B2E]^z>m(I]ڪg"PyZyf:BiÁ޽~ʻe_^w9_k*sw)ȁO&l' 7qDL2~3&*@U|%г'Xw`4g&ӈI+~'oF]M߸D +ΐB/ [(R(k ?|PQ$a Ȫ3=35k3Dر{:qԪQG"{,*[W,j.DV`ua:g̞=Ց%YhlƶؖS*L- = T" " " "]n}~\)"nVto97n: _q=f7Ͼ^x8D WԒDQVpI';pª+Va[HTx~~bKJI [l?TT(d ,? T^y b {̉-[ {п0hD PH6+`=C`O<>,_p馛 :Bp .æn84i[VB"}ʬ*?|ƍ$w$?\cNd:pn.o~;Ȏ ɒLɖZI2IED@wk  GMضS*,4 UJ҈i8^PyCLqoދ=z8]v7|6p"4^d3> %RόJ>t4oF1?el/mBc jz/XbB^$ ! ),$;|@|pǢvڨSN>dgIa'|}(;` կ_5?@5I~?>|*cҥ}7lAt8s1~xg" "PE3WYF>eU̎K)"Pz<88yZ ogߦ3Yg/O?mڴ1Q\ &jGuQgO-XY)2WLd"2 zQXdhp28m0a<=z4rKI5Mlo&hٲ%z4Y(dM'aCGo=C@)5 9eAUfoeR'?=R3u8# :׹E@D@D@D@QCyU(H &ACwuť^^Ra7o9SѤI6*GL`ME߾;5=ߛl}Xl=c A,XihF6w%x@8ocHrk;4h]vQ1{l'@u\s u놭*W.D@R"@MO>뮻0k,0qD[ᅲ)lfhժ{7a jR^ID@BL` +X=#?gZYKD@DB]N9@0 DoC3X'!~bY}]!C0%2%[sRo^I2A@Bs@H m  vH3Yٚ:u*Zn8ٵk"%b(}߿Ec9\rIf/-vLtf|`~ 0;kGBq7ڻwooa{h "')/ 6h#)гgeHznsǍ= .,ҫ" " ">e3Z}J;]Om붬㲮;,XeX)ؖ@/vtfa[O0|LL0ʢR ^~:^J"E3fLkk΍3ǔgLq:ud1W@2_9nB=ͬ?p 8b~:e V ~HJ"b PE@D P[oEN㤓N??3|g*=8 tFU(tkpcҤI&:  dSOaF @Z7 .sS0 0١$" "Х 0g@#Dd]QRO婳N ҸqpfrEdM?=PtX3'ӹD@O `gG3go<z_z%brԨQ СCѤI9E>|x O>>;ӽ{~?=~<[Mi ۤHnΝ1vXi8NQ?8htGmSh*ۦy[SPoBlUƩE@D@ٽTa:DV:_ѹbru@ ۘZ)Sp)vɎy&@!HBQsN@IDAT^XX=ZFߞ?+pL5j(b2*/jժKR|iN`s:$tYm馠g Q%;>?cس@8>ѣGÎ;h.2dڴi#ǂ*ml!.])>s۷/-[iN?-ҵO6lz""P1c\r Lbj Oʥ@Z ϭ[&G.,9T>J@۹3ۏG͔." i":-Wa?=pG`5İað.At9fB(j)@:H2u#t~!ysXEq_eJ6׫W/{=Fm{kuUW74mv\RR"oS@>α$^Zn &F`RvP| 7ܐ*P_~퇎G0}tRnG(%{).RBU|Eq1:vm(6UrN;~oA [+" " " " C=7.F]9SN5;̉mvyg yaR?BCT*JYfD9s8gX,щ"-5ktq"cqnݺW (hrM&m]KD ?xg1b+3ӡ@l8aڴioγ("gpNHFa;vnb;FID@Jp0 mt\ _K QD Q: 6qpϷr Foe?^~v4%}G'pGϻ XB3W٭[7P RIA@B頨s@`vy{w g(~NhQ$F}Tϛ19%9˗7 vLu=Y$x1tPQZY6F'믮cwٸv1_١|ꩧJ2&N=E+0djB3eAD@D@G@ޓBilMd4Ô5tXlxv*(rJK-r4"% Sw%Et+ܹs][]{($"Pvi'x>N"z p)BEΊ=>sL2wd) ٨Q#7mNhb,(ץ${*d%K0|pÿ޽{nD@D ]ض`P8 6 O=h6ȶ־}{'xb,\A[Wnb9( I 6 M4qȆsH<" Y%'q;lz],KV[- \$`UKVqqh5aJ"PJ@ۥ(B eDD Gu^JRN m]< : lvs]0H0J!&б#p饁RSX1E)4AJ<*zQO?tn?E&}U9`w晰Ì f+__kQ) O־?M-[tU'Oj~3k( -[Es=qOC^R:L0tõ)!{9RwjnK2Rt^Ne|=0k,T^=wX A.)" " " EKNWT4x<αH~=S/ |u*7k&(ȉB*NW_lD믿v}]ⱴ3Yt۝9iժڵk֭[c׎>@JrK'It@L\ƍ4 ;(@& 8Tu8QB|m馸гgR>7okNmwPԞiN;`]wn* wZ&-'`Z&wд) @ϷrXu%JBUg#E@Xn9Ϡd#mۊd'A/ʕ@.wމ}ݷrkL߾}A tf uќXcEsUP(O\6mb#FK.k3R49zB>}ObUM<믿nLS3MQR\r%Bcӹ͚u;/c%7S?F`d-(%{Y'b+E;l;s8˺,Jk>{챇saFH:nܥҤw+ƥλ+" " " " yJN0<-+Vp۷wÐ!Cr&I1p Y唭>tjx衇pGbM6ItX,Jvڒ-1o/2נAlVt䇢(< (;w\'B;TV-'gF›o yQs/n;5 $M=:}ԩ~CU\b2BZO>=&dc" "Pd>{аaC0رco;\ Q1mʗ"?E](?Ȥ5j8o9R0wu'V[mwy 8нæLyƌs<%}.'v5mz|G 3l{“k@ X!'H!ș3% J2uI(`̙ [UW\XxA\̇vcA޻x9묳bNJVa-ۏf;QUCD@rNs/Z]`ǜg($H,%ԡڵ+xgאz^)@*$ =+yN-xaƍYE0auq4D<ѣGviy_.ꫯu],{6jbsK/9Am,Zeܸq3zGueW(J:*bQ- ދO>2Uh|W` *fvq cg]Ye]V .A0m4> :JK,b1#XWv]͚56 M&T/̯܊@h )OhKS',C[/Tf3e(cL^x ϱX?>YʍfKeɼQ@C]{W$E/6lN?tp vVS"sLtb+{ e}1BS-Rt`.aÔrۧ$ߋa"Bӎ?&i~;pv:u !*+؆|){Dd-uIYgy/7ſʤcshݺkӰ/ Ϟ=۵w(XvOӦMM>x蔬l{]D 75Ԃ~QPR],_hPD #fn6@ǎ1^2c'lv;wnSǐK} o35" "b|wqJD1܃j, t'#+%HRcEtLD6b4޽{̯i/ 9ફu3p)PT4fX⢋.EcRz(0H 4f4ѻ+#{\Q.š {4i32ʨ0Q0!)D6B(ۼys0rfzU񹾪([TJL{}6mOյkTV!CܻFQ|Q°SNuo({WU`$tP^' 8"_lg"Y+q:+뮬*"w6is!8xGZ`AFl3\t5Sq%q3&*ǸDhkC-[F3* 5n}IN2gBmV8餓QzQbI=zQmy3oa&l +/k̙n)X24l'x"x PA{K>lP8"#n/%|]O޻T8SVR.~d- xO`}@;wk3T~YÖԆ c-O k| 6_ChvN;Dz vFF9|JVLݟGsxYX(pY@Ϟ0W /V*^ҺZD@D lCpw o'Mqf%|҇[ned;LË>aN EhѢO?^1J"PUW@'"P8, _ sryQ?OW)5k{UhBF0T%ӣ>ԣ_%/R(kwwsN,  ;meG銙}G#LAdw,H'|ri7pC'o(*{ *%'.8x3_ňRJ/Fm/()dDנqiPJ&ݺusQI>(|Q }?pK@ ^{rJs1\#NZHb?OE2>N5:\Ps9۷w8؎K~Xу>ۘl-6ad$4^B Aҿg2:!pg)Z_D )/AH{H)C.H}_b(W3ngo ڑ51 k>Ð/:D.#SM|~^;sb]wӤӶnjƻV?ɶ'*@!7o `jXsM7 mqs~ZH126D,ժ㨣*v]_Zr.+7ʘ;x> |&LҥKn_~N$Y=2bG*;|!H[2=lYXr|d17%H; N 8 t_&#'Ttz~L^)@U *q" )0Xt4>L0S=#3'|wEbg}J1cv:v%` t $Z`)R pŠ*?STѐy$~9pmFx?daG6p|ItMx衇0qDΌ\D7 g}V:p T;4y2JLG۶m2+!dcyncMm+I8f;$Y4P3Q$*|v}VJOX&0m(3h`໑>ϴPA+NdS]|15cuDjڴ6n8g)"Ʉt'F8yիWIõ.]X K=\g "2̕W^ޕo?>cƌq%K`=K:ٜ 4=C!^k೘7Ϻˋ/EAS',bEt?B`&{%:/NSD&:?>JvyӲ++?|gБNX57qa({8cҤIBg(%j%V[3Έ`;!Y_p󲍒,1fQ_t]l/LlΙΙO`}L8N)" " " "  pX%$QD SEXfAc=L{rDc$2>&ogM= iT2q^;/#W$%cxG,XS6̒ &vjv8˔L2ō`MV!^2oL9㝍3ais/ѩS'||oQN?t.WѲ1O+ 9ߪ:_^{⪫Bѷo_W-]7x\pv,@>xMgΜ9`};Y=2TE@*G^7|RY$Y/$`n`H@0(桉[+Q;Qovq-ՙ-Uf\%^t6Mv@?d]yϱ"g*~;Sdu^LLƍѰaÌ\*&A,&gQBNg믿[FmHG5DJ⛶t%%D@o4lXRҾ}Ig 6\b%6[b%8:%&".xwjPW6X!<,~5J?.1e߰a~fD[b%V(F_u2۠fi'ҝ Kmoscx 龕DKLɝKle{KȄ>7,A]b%3Iwm@;+J!JB*QH%*!d"{vHRZdMT)[ɮH%%Kssv7ޙz͝sϜ9=sg=ӷo_[vlqTb+tڴic>XLGUqn*fqf5zhNjԨaA!0~yd+5k֘}&㏎ .:۷wԐjժ1t噈_xfӰaCw5fjoӧ~/_6{~5w (v?lݣ7S{6H"{v;j`ٮސs :8x"dz/bnF>ޣ8a PG`/QWJje)+#*l㽎{_G M:^GUc͛771cģ"oh3{f_%CFE2"8ص$]GEw'BVe]ac {{%Tў.=="k|wOs /6^xo m2D;WzBoٴ`w2\veNzd#HNb/Q{}wG퀒$݊t)SJ,5 @a SG;鮻 {n2RA{igM.V@*Qtmtv7n~;=lS5oO~x( @QL>X_4EeQaIGذ4n93@ ׌r%EX)! 7I %喎do ^}adUR|("f 6ߨXcN$APB{CΝk~y.E510mM41vW5"=T*ېM{ v` LnCyssq~:}>Jm 2  hѢEC>O/"^1(#sQ5k9Eq1vk@7+ 콷ȃ%"=z*ĉEUEEix蠣蠣WQdQP_yEED=J5Axڀ7j&򕧟~Zԃ耞ٯŲnNs0adH'0?Gه%l&+OUW\GOqxlkĈ5DDc/%0y A PGs*0#01~qܗ5k4w/#ܑ2]x*+,dt   Z]D3aÆa$g]*ϐ\'ҮM֖}XwŦZ[oI&.s̑{LT<5 ,_.ҥK E&   (:3y9=C H`2H*a֙=Ae3É2ql;O^}UQ'; Ѭx=Wb1 Gb]jws[(aWrH|q * BZsoK,̲@"hET ]1נ I< @)&y/a: ժm[^[Mb0Ukovq.*ȓ݅48> k97Q m/;Q%> w lKpdcWGCK c*{L49}2}e7(. A?N$гȼy"g)O` -* =DPfA]w 6¢E ?(vg;F< !lltM7ڗÊA21rT^=ճ zꥌS(nULeРAf@<[Vp$a Çh/Yp` a*W~ʤkcS%pk'*(r9"fd F'6z&knWXQT ^f̘!dz&8/KkHbϓj"Y7w߭ьLժU 3gcݍQdtLBR!˟͹1j'Oqַϝl_0JKv|.eC :S`p^÷~kb   R';M0!c=4b8~0K1N8A T3 c}WM>|}}vH7߼k $K_0lpT7ti4`P']we˥^*mAl~Ӧ:9: $#R~QOF 6J$@$nf~ V4;9RMWZrt[=\۷i?FyÃ܆x%h+'tdu8^`׆zibLN3gHe:}:Ls=wNw奄C$X yNhٲ̝;Wy.EtmT~N:M'0_'4;fr$@>U@yt&"CL"%v $@$PP,*СW z~M{+>h/6(]vq.*hkdj%K/}Ε\0a3~;t6 @>}'{{6MzarJ9 ®cΜ9nO>^: JZ8 VQ"+jO0h/'e~񿙕?oT->z @ZbXn=n8L DQ ;`>i:  tP͛ˠA\S^ꗶY^l`6G6uM"AoCغ/he 9fg?lӵOl9 mskvǂzɓeM75Qϳ!][ + (߿SF? Lhb6l HCs\;ODumuȬY:@ ;'EK!`_""K@ "nhFN5ͦ},~M\vO=e @ ` x'XG}h+nݺfWniK!Ҹ,% dM&tO'}aA~ 篼JiѢƻktARfM~Ih0wl{xZ  o˖-˸<ѡ | Ql:Dڵk'/B6+L(i@% yaOnJkqN|u6192 g}aWkwPǾKl9~m=k׮9 \ tj*ST^dЄ"юQ?رșn!TDS":93ٲ_ٴbŊ:_~xw!ls8KG|1lE xϻxW=wK6 q]ڶm{m<5Q[3{9߳? <9M;1>\gu@$iC+tmL?~|D14{l3U2M̌H XA>1HyA3G:skh"5c ьo  @t̟8[n8L*HJKot ;Bysm8&>ϔ?L_|є[mW}hQd  'G*z^ц@y2/{ԱQszl7UahCs=]]BsP/G믏˘QGeQ1qᄏgm1-[L0uLKlvQ<%ĺ98Kk@qsիM~WLV1cL{Xg3O]&@IDATϝ;ܛ*kkdm.FicM$Pxy9)ta lt yio%Ǜ]\>tmL8$6hС@߁LZ~vh @<!PSzHjү11fm5l:L^ywZAUsW\ }CɄH PtSGʟ>b &;gzs2&H(/EA`!  B  38#>o ¸+ 7yT5\rys99 + g FBXҀ8@otn@`ՃBQF1Hic 9LX>@A`#GK8k3f'"n8m۶5╞2Y̹^{,dB#^Tx!O۹lWk}%N: Ϣk&LD:~/}B$ψvڙgI> V 'B˳qٲezz5yDZ08Ct|=z0ӧӹsgG=ΛXf<%3'j[_xWxw1O_6tS 8yTykἸׯo877~_|tϣtz)#u1;"ϏmtHH d8slv}D| A:#>IR]7LS}tkժn2 %نFz;-% r-6ʀ6d빸XNF#p 98ʥ^$-H80Q¹*9Z'NyX x1G:[h]djoጉ}И#T1t}^^URAgjdjM:}}q _~ 35 38 ϽzTN/'Dؗ@|W]uUL; u8#DiK8X2&!EOD7/ƾ{8Qc㏢%EGEՒъ6N5V}9^/,[._,UT1[ԸLTLԸ7Gy< &Z(Yx.m.'DQ޽{LH!Z/} WV+:)Yz%wuWhQ#D,)ҳ$QG*N`s 7X.&" Fyq»{EZd9/k׊A ~ IcTewL㞉cqbT*%lE ~bJ3=&G/ Kw^?] lX حW>qtQ,xmOp^wb__ &}v@Ϗqƙ-~lÖSհQG7,W8裍-g:aS4h`Ug?G{ҋ +fa۟N1/x^&GEYeHH\P_5jcCVQGTRRtaA="1$'Ʒ ن@X;mbaׅ3rҵOAyj׮ݖ k/=w|?qfXySi8f ڦ͘*^x7ܿf)Gm.]{>4g`L/qH tZD;D[^!*WV+ee IC/EN:Ip8󞩽>h/m/?Ϟ=[ڴiC(K^zG{;|u@moH `0{]'|ܕw6Y/,/@Eb!~ )!23fa&8+0;?ӧO7g|1o'_#A@;cl)YDmY#1pdbk gc{^dɾ?3XU# E[{D<8~xۍvQV(Ä˨0DΜ;%³>Ɉ ?uJ@.ۀz{k5 ,Nm~ z8 1x7/LHL&M֭[/{oʸa!hWxv΂ $@$@$@`}c&=iFa'K1>.oqQoDM!h^&z/E R Noe9!  LRd: @Ӧv%"pH!_g lQUQ*@ pQH8cȎ@X(ܥ x َ5,O!F?qT"8~h$vuWiР}^{e>lYS3]f>jժe]ecǎ5B¥té[{IH\PGQr.bc8x`# >}dJ P,6D%(3@Zd^Dٽ>3:0@mƍ0!.&DǟXyYιIw $@YXL:~ZbBX5jd  :ذ!mH$@E!cL]k^D|St쳃)S?Ďc|~[^o[o{%x$@A&^+ W_}qR^=# f;c\\#(/Sn[sHsCH dAzhiV!ky 't<1Ҋ+lj(oϨQrܠgq<#IIzfCD}y@妛n*k׊7I-AϷA{^.wmre]fc5y饗1g}f:^*sA}<F3gy??&tA>Τ; ^hئKbD;vxyS'1A;2H /X VOF裏OaSδ*WlDL-xlzP]wɓO>Yg$OY6 @&QG+1!J7gO8g(ղS "1H51ѱ`勹 /^{MLv'I|+fIΝk0U\RD+p !M1;էx⬜u4S , Cx"8ilV^- .;4Q`D (q0uT1b̘18z ڹ  $@$Ph'˗/:)K93=z!Znݺɓ߹A$jUQ51wg>1H {p{%1$@$P7ym:Yge^Od4=76U>A54i;;I$L{i,5zW裏;8-,nnxdT$A$6SKc^N ~.CYӦM3Wbx%@b XC, {GޢQ147*J6x"1ȑ#ڮ_^0? kxE(<"D{%={4fms10m̙RVH 4(KŌQO G#~+<Ǩqҥfp X:;k&10\~y8\@Th(ԩuL{W_5_9D9o&cAjpt{˜_H|%z(SR)>+j) $%E_I $@$x:"z췟㏋ac)"h3 ;lN$$@Q">Ǜ{=8)48*V|\!mn6|8=rdM0 V~饗 N;4cT!Y h@GA;NFX 8X1o׮":/^t a9cer$PJDbs犤s8tP3F `~aX>YnvzH/0j[S<裦B9F+tFb#s%*x1q9_}PPz&(Vg2\.袸ۻҡA\r1yd"LZWeQH FBHX(>xwg Tc`AHLF#%h"8pKd-$L>\Mw߂'$p0?\_w//,J[/ [Uְ 7@h.9ZaVZ et܇l *o̙3G d;]vRRr*Q"FܙP{1ǎ+g}7eF$@$P/6bmf2oFfE!@$nό3 ?BChG4mԈӣmʕ+VիW믿n1@>`$T!,9I6-;!h# xl;Yr\2%KDn"ӧT:X)*{&"#ӜHH Tp "^+IdhѺu"` :q}-[|c60(A$Pb Nx)|`_veԊvmDǏό?( n @@ u`NEDUK^jeҥ#po0ƤlxV{g=\tMo_|\qrfm`;7Ӣy?%OR 6L;ow݈i&)n/>| 2DՌ <2AŻOC`:8ˌ3t2tw# + d)KwJU^A"v?vL)9ԅqi߾@t~N{=YLgg4<)3DirX!)eb)H $LFޅ[ĉzK^8\ SN–s7J3`DY*!xlm͛Q8 D³,E#`U a, a?V8QF A掙%;r@B@UTIHH@s5X/X@0/@4^zk1 $?/Ο?,^nA3tl@bK>|'6dcku jժ $%RSJuEF}FD,K쿿hGrͼ ?tXNz/2i~KաC_p;뚩(f?ÙTIEr-r'}GK.8˅\yxzLχ x Tr"#tK \}Oh k_/wq1rO 7|K5\#tB2&BO> D@(Q[xS2/tRްř9ST_OD5 [(Xpv O&[.M41+ہe+ka{qaVTBX.p.{ Dz裏d=7qF$@$7w І8[ompfqmT @O?ԴO D6 v>c'psuځȋv؆h$6TXQh#!nȦ-;$9 QX)]fiY0bV"2$@$$zu&2lȀٽ?Egyu ~#S!+VyAǏ7%OAHdw Hq,ZHN9K.dc@(4B$15ڵyHtB6vXׯܓM%aԨQ/o}ꩧʶn*lڴiF<rš!8.@ >\1!2t9 _] 5!!jx f믿 oM=5jHL~gps-10g}1r r7 {=zB3uyQGU$@ @!@)H=@_R/X ᄁd"{gŘxgM;cqBϿbˈ#}>s &3D6'^t2N@DIJ7t 9g+uKyEu-o)Xn,Ў+A>L֛ !QvAK:u8_J7IuU "vWYx8cl!~UcG"p߰E知J*cǎ&HH JOȅzD X4̝m us[mUAʓ@T@8?71m!1HLm݌8+;w> ~<-?)`~"voy?,5 Es`cq }5}:;C n-&rݩ B0!CDƉ#Rr8P&NhELo۹qQ$@E|7h5"].1C觃]w%K.={aMG0@PPy(gv9 -OPǻwނg# &Hp}1 HW[lo ̂:Ν;x&E$t bJc]n]9묳XMPwvD'9N(Ep/*rgg͚5"|I9rpLx#e\V䋓ӫ? ѿf  @ DIJwŊ"&P]Vj.Qzz)ovpo1s)? ;I."!t#j]VZXHDze*V`*_}񨨕7EK;H* ϐm?3g6}9CHHN`զQHP_LpAzxv^^ lذ~k GLnFmCpFA}7k7V2bV8ҽvoDiP.Lqg@n@`Wq"1!HGb9&Hgۋ4l(:焙 믋|fL$ҬYޏ15TM{i>33b  HFvڒN0:O'Q :dKvߜ9sIZc^zɅ^h ,h(Y4<1 Dc!r"S^xA8p'%_UÇ#Qx&-JgyFqy嗍1j&_c!xԎ_>:6N;xydG'*/߾A ʕ z p4\Ă3複(i:8vԅeĈ/Pu dNRaaˉIbO=gy7J*jLrf' @d]s80)cǎewu!: Gwb^qG71"~VZ6FnB`iJI<' '|,NٳEB"@ @ D Ezt"kx C @ G>`|=6￿ ͛G#eM&p5 4^xx"<;3փEu:E 'Z5dC @Ab*5"x69<':wlu O!=9oą żyY4l`E)<@Lxc @{-gb&Ƿm^iBu^ GrKk}aH{am`{5ls>#}^>NJcDZ}&r"kFY08H3sÔoH2P#w}wL/Xzy.A6c #Z_nX흄|`3g4~LfxlF|tH@`UA |h/h*:]kh$ UJwA[-t{qM{AƳԊG@b5b6d|diC+DWdX trr p"[m%#9CHH t q"ve3=w\3Op|fuC 'yiӦ{g45kft*OyB c@+tU&]~h_81IFB  DgL(:y^{%ƍG,˧~j&g˂$m=phB{os=aÆf o"` *RTM65F;A 'vӢ6* r"}?ap ֡$ J-@hC.xEc S<@0/F|Es?zK}]}=-[4x66j(Y9sX C!CCQ7}YP u,@E `[BKk DL$$:K<_2|@h/1A}xpD^QGǂ PA k׮5|ik~HnF̲]vqA2(.Pg$XHK Jd(Tj)Uj:Qzz)oX萏Ue:R0$_gBvX~G [xrq!AI+W6P@R"ׁL@n㺺Vwb(lH jU6+υ{K.8K]`?r h?`Nm?5A EqJۮvFaCO}״YI=6{AĶ+ %;C!믿v?,X&XMlIl`VH&"X 1@ iakqıaS@-[ Z/z"\#r%y>%sCe p,~#&=ExC;E+[N8y\=;˲ 7o*1$@$N nsLO1?Zu  6Ȓ%Ks𞄆L}ח֭[9B:t0v@Bud\i@@ߙBS@ǾRefb- GΨ`R6Lp^p*_~WZj Xym-+ 0 Ç̂J )w‚ׅ_:Ӳe"G-)U'Eڴ+eSj Ng@p߿賩|$`P}6BrҥQ["w"aTgcy;l10tp?<dL:s eN0(=PGcwbsoXÐ.0Z14àuLW xv/t7➷mJ$@YmРIu,dt `=HWɓE>S?ŋhk/\ІF}aט̂INmc<91vv6CF{Nf4h 쳏q6#|$ -}3"?,ңGN$PhQU4I6W roAwכ/\R0Q__:a.N'p)XAx{b8&@8A lKJJJekce8.[p/clk,+F/8X5k6Zc\ k#$["+5?? $PHO{*:TbvIKf pv{eȐ!!-!m ~ےHHo"裏qv}2}4见SQd88q_|!-2}˜C^9BD^H L(ż@  @@W'ĝd֬Y*GEb_J b l1!1x6ŀq2*fm @#=   F#&CiO5M@FcE DN.s_&HtG܂XXC>!V0F:xng]ىg"LFsNkt,}6&ئq>&tǂ:Cp5 Hm('t?J` JBq$|eCo7N䓳9qLbaEF @{ö1F;ng`rXpLlB.h[64]nnO@5>T BWD $ @ DIJV).+ (=o7q_tNAj 0 (lV0q> +w5K>T'@,1Sxl}'v|ֽX-D=~<$.iHos׸a/^j0 3w+i6k۷}( _)SNJ  (yD[@IDAT8QT<6EvM+RZaH' @(Bh[BvZDgE3츬{Cuv-[0a7Ղ6 Zk+-Vk% V$D1Mfn"VLH#=lN  dkX$OvNvXOS  9&:lo)L ESE`s:#C$@%G4gذar:Og&HH,KyBXCj\gSЉ.]/ӄހNQFA  `l~0u{ϣXC$ɂm]o{ah$q[!Ix5gVHHHH 孿ˑG6CgCG0ł+IЎ>hWDp1.~Ѧ 1E¶1l;hk007 $@$@$894ebFI[EFqH ?7GX11bN {@Ŋ`{;cmKklc Jx1fLv V |!juĜq3 @`w'5G$@$@9Pb0!&" h{zN;d2p3qA[.ma۶i-vmkصOlo [oO>HްmHF[!݂`}kc 6? -[LY<0 ;SR+<0}t6)6k6m)7ai%_HEzJT?y<% @G5A.F$@ z{|ȁ{H>"zH.BTHHv.' C$@"y|͚53Kbl_ʕ+\!:/=Opۚ H o@Q&;@d}0iV9f"()5j0dI]vHJv7P :UTl0&sf5L snp:@H$Isr'MV(bvYx̜9<;!SN# H6CPTر"컯 /r/U,w P2W'ȅ%Ɍ"W^)r"gcly3뮻K. i߾}.Iv/L$@!! IM$ A0S$=;A@ZQtDT9zdH Y#ң:S SN)E ,s#GlWsNl;4y d"NL=:}g(2\ A"$@I SJ#-eN  #qJ,1 *sυN9Rr@0 ]s ]!Rz0M4\}Hnt ;%vI0o * _#âC5J@:&_sR7 Bpc ̒켎T+tRꫯlCwTV nݺF(Ү! 'Q x{э7QԮqBvY^ KBniJPy"OԱ4o<~և[ Kt# -[aHԫW,:T-{h9EL9eY%( w #??6ܬu)_ܧ? @P P2W"P'WF MAHJ-,E'"'R;$ d$1O {箻DN?]ĊdLHHHHHH !Hb(gs @Y+WN(HHH t! @8mC֎K,. ڵ"O9#:b@2Cv4@E0HIF73 <7 @|ȃ׬`3ψt"*8T&I$PpUKӦMW_QHzԩfZtiXԪUˈB"wm7s)̘!ҽȼyRȝ sg#ICvmٳE8pwo ꫇H=azf     ( A =OLK3gm|EAQ"#rQ"ƉluXK|pȤI1^0]<$@$@$@$@$@$+~?U<3 &jȎ; @P 8NPs| t$2d iWf#2~HϞ^ geR$;dt.2{cŶ}?  scɓE9Q, @ժc 6,#r1Y UD'RDP, ?{goSՆGy3sf* !T$P2$D$S$2DtɘC22g {w{ùasi5>g$@$T0 #ʕ. AÏ$V@۶ի@nmvLLm;h @PŋPU  v 3ڹ v?t(Т&Mlkgy]wdɓ @xǏ"gСCu0e\?1ID.O<ȟ?)Gƌë6m.ѧز%Apq# <C \>`2UM®]  J     H P2R/-U$R"q|Oe͗ ZIJ")Y@,XL8qHOsEr/S)C @$yQУgߤ    p l$@#P%bdu_H :V5LYj :GW kKrF *UL$@$@$@$@$ xT qdi@+H'th| ؟aFZH$zбAKN *l2{6мtƍ %i+ ?P!{x9dΜٟƾ 떈g*Y%fޢ7&X#~I}2HH\O 81g S!CEQ!"_|G,# ٳg7E!3d˻E $`xT' WЀ_tQ#dI`|(+[`]$@$@$@$@$@gdtHc 4b>VҤXlH Fo*0e L$ p60kߓ#GAӭ^G ] O\hW.o{L& 77`"  _" kH@ @^ ]'7{~z,CSҦK uj7g$@$Y9/ AFIH L̙ܽk9K! O|( lHPGGժUs>l C߿7¼y]ly!:($ < ꣈'p$ > @jV 믻UO$@$@$@$@$( moAP1H PD$nC&,?uf"4\l \ W     ?t og XѶu! ؉5Q-$@$@P!Hp&' #ܹ-A7?c;Vݺ%իKj'XboOi P=9y$ʔ)ߝeHH"%ܴ (P{dH&ҢBt!LVE$@. AqGTQ']08{|{ D@ƌGc `m3e$@' N>u  $ Az6"{xm`,`@i#"_!pУEL^KnM)X9;u.T=s @Bh ]THH 0 =1~"\|bZK*0xח/*D$@$`/*Y&P;@KW_(dmQݳgO Ydv?TC_X)#ۈ AjRĉ|&  /4m ,Z?? Ğ cϐ5 @ƍT7au$@'Q#@73Ͻp!ǁѣ)SΝ2;sN~e    'rYcP'_:Y% ؉5~HH| }pXp dɀ#֭Ν% +%' k4i[MIDrԻuƌ^#]$@$$< ݂ m 0`dH/R}Pg}|p%Srصkv؁/׮]3吅ŋG%SO=ܹs#N`1 hjMnQ"g @oYb*he˨1 @ <",A$@'ׯL(+27D$fSdغ"n˜,Z . иqCXы|H     hC"}"N`D$@v"p$ 4-$@$@$5 AF͈9H *PХ L$@qPQà ypR-~$s&N"SL$u!$@$1/[^x"_’% 3 OE mq+ ڠڵUw_L6MƏ ^x2(M4TYvشi^cǎaٲeԩ@т dQc')SЊ2lW#޽vbK@UkŁ$@$,̙kyV@o;[HHHHH%@!HgI1 ȼDR 4j 1 N`ic9h,aC`F @It>`Ĉ#!L֖H}3w%-%     A RedI /6O$ $@$@$`{!$[0u*oرi_F܏81EIC@@eVf  Ț5+N}L^'l2x @$@$ , gfϞ cǎ.c#Gԭ[طoYFBe7%ŘdpL2 *(/;38 &H nkuMq_w#    ǑA HXVzK$9{@l.a <L/%<&OYŋ A %tgHG- DD.P ؛ }|h x@ѢClmu  ,J~{E}C^X]J}"qW/6KM [l o;O$ԿYLwq޼=/`xhjٲb~dƌ>g6 & #AkdP-M&L@f$8{c&I˗GN0qDߌk׮aϞ=6mWѯ_?-[e!irеkW̜9h>@, 8nŲ"' &KznR|N$@$@$@$tTVI$ZmG@Pk[`m$֬ؾ]&@̡⣏ܹ6m…!QTRˤom!+I@  BnF81Ҷ- K@ ݼ!lD$@$@.$ S;L$@$`ȗh2K($@f϶~8p_}ŋ^1n@V 3#$@n#BgΜ+& y} gNys ]:˷YtХ , N6x7{8)W "Ɲ$@$@n&b 7o}Yd5?b޽-qʺxW1f_W\}Lqȧ~Z^{ E%QTPzu x4˗/ŋï[I ꣨~> @L ֭@ݺ֚tnsLi <$@,Hԟv @'5PNmci ؘ.PǘA&MSIml0Ms Sq)S?W/ {v29%7m$qˁ`$@$@$@$@$@^# >ȓ9k&hm:X@$`7=$@$@boβb>ӧ&Ybo!pЯ0q"P0y2)n: ovUT'5j$"1rHfڀ3@$@L@t@A?ڊ+TR7z]*PPHMz۶mXp!> xd@}Yڗ zl[W> ĜޯϚT`Ik̙I:YHHHHH1 9zրÇH9/CkcB"9W]y@o:A=Nnڜ, aQFa"     ?$P }vǺNtFsI dBQvHHP);D&P4~UfM wXW H +ڵ\f϶D S.] -ѰaCih`Z{]`"oYvI Aj:y$(hG%uKZZpaϽE K ݻuAj0uGw :M2X|& <]/4n0w.P?e˖va/^<,Y|tٴVTr˖-ظq#z쉛7o"]t(dJPJ(QO<{H %BHHH|k_L$@$@Ӧ @n@PPgCHѡC JG|*ĩ)TzP`b_c\ @dɒP!H&   ?c޼K/I>I?E"QL"p<侊l:*H ;fvn )S&4h fy&MԪU C upUSpLRZԧҦMcرعs̛qg uAOэY5 @@(Wе> i    5 A!+ |9|5oX6Iw|93:Z c;-9ND VvZ$xQFf2#>[HHHHHH '_I„#m④$.^5> /]dl{|3)} '1H ŋsgK@?TYD6ΖS~bD^=|y`g! 6˜93(mt,@$@'o df]/֩|Elm@eː8q3s; lH@˖@pML6 ]t!e,'S}$q^Ԉwe EƍW E%L͛CI>}:,~ :O~> + KZ%Hݶ-o]ɗu  Aqf/I/ $ zJ_e7)lD{.^P)xG4:Pfĝ Ø1cдiӈ3r %!~!FVG{|4HK @dhvb@@O>w@n@PPg äw۷/Tf?Ĝa¿c^K @td9 AF g |f@ܖ@{m^5_m!uD1LuTRE^{F@41ךg$@$&OlPI +:3?Mqd vT* yQ"oP9Q*ԩ|I SBdӦM`%B:J!G3 O:/t)7OGnB$@$@$@$@@@.HHw HP&lj-A?ݾrp5oD=t0 3+@\@SOEouj׮)ٳg3s/ ux-ZضO:`m=p4 VҧNk$@$@~K@0: G@IjL-gm$_! -Y%KLݻk ,!CO"P:DX0 Vհ0 8M@ O:t~f$ p?ðD {(WؿqV1]ԩA6l#G`Ȓ%KԅkDg 2xy6L$@K!0a27Ct CH~˗MAUb…XgeEA)޾}dHH~ղti` o[IHHHH7P7$@F WgLGH @hRA3 ,y(_rsqwsY$5jd.l>|bHHHHHH |׉5kǭ!@O'Kf+$@Qx@$@$@>C@ u= DD`d Y2E rq; 6]ݭ+4o~y۷_}و K >a}\ DH@ O<~  ;w@E/L #o%k jݺ56oތ+W"_|c/89u/ȦIH/  ,:Gڵk{ ω'F50n8:t|̀M41E2_ Yf'@:BnHgM "ܹ!@z C̀^<lHHHHGPG$NT}P)S"Ͻ$nڶloldk_~+3[Ÿ-[ 8GY+W D$@$@$@$@$@FV-k!quW,5g pAM}[h D D!Rc~,)RX5.f"# /̝ ̞ ,Yd~/%Q?Ɗ6]80Vհ0 8EBNab& p+W-9^܋-T~ӽz_oK~,q3zY6H$@M`v/ \h>>TT %K|l_ o(P^u3g0aܽ{:uZ2xڵ@W}׀QCΐ ؘ^̜ |)0|%kHHHHH' L$@$TLwiTѷ/Ȯ:0)XLȡAAA愍 ˜ݻ2eKǘ1΋FQ5wۈ޽cT֬C"==CuzH,L"ѣ.vRKMo[|& oo n\ U*o[IHH  'zfu]%  6]F    ! A$ 47hԈҡR;&=fbo(5 nUڱc)+׀rD$R U+WZǥK?BCy9[=(iq3 dԐ3|ԩ8p)ޮBG\o3(u17Zf$@$ غu%?͒% %~nS?X{H'ExWMs6i$f͚ɘc&S2X$C3|Xڽ.^M6a޽6p $I87J$`#< F      A@  vPsA\[?kKVVZᩧYen,7n\SdE'E4zӵk@&FEPYl1m]p>r$'K@{w Y0JQ7Q .${~Fzi AvFV   A,X|j&gϞ/l/["SvWHڵk;wbGcT2x` K.Mvrt7f$@H@ҥEi3 @7! HH#0z4$ d0dع2Ev".uŁ={ͣpXhϋ[lr '0o^ljaY  Aj:ydHH Tqc+h@H})SƼz]oP\.;wlνϚ5 b%UǛf$@$J\LѦ 8M*^8m4t }!(|*U*}РA"dj8rH*Ó)mgx) m ; ؍@@ֵon}=$@$@$@$@$VMXH TlfE)W嗀Guo):: 1DFsھݚ۰6Lil1ms^Dza@8I8xGAPqUV!Gn/zmɞ={  x ǻC<~|2:t ?Qq-[`Ν!H5^x ˖żǏW^ 5uCmVDjpg 6LV}  GL$@$1XUw*L$` ,X1`\`l` SM;t4PJǎ1j(E%9 4ѹw%U x@ƌ?~|8q}@$@$^&P4p%w/ж>*yBK: b{<[ޡLc~ /K]O^/pK"5y}i8> >#i5k?yE*UU|ӝ)(fȐ@GgT?Q&  й#!ڀ{"[* ؍@<D{HH䁈dMZ3gB3\rЉ &`֭HݻwhV)$#4ڵk'wY;1cDXܹs$0S#]pdjǎH<9Zj%N$E"It$h1cƠVZ 6ol)QZn-QFucŊ#XsbOϓ&M+=nFΜ9s^ SCCΜ9#Ea/8wJ*eS)%t=ײ-p:b <\8- 7~zlPO0I'СCG~tbXVxAC'q iv(矑,Y2Sr!6z\ ioHHHlO@ 姟~2[IJST3꽃^vI |EyD#+T\R1( )b~oSO÷$@%Bի:v԰aEuQu|CN> o1 Z[5J= ؁ ph @L H ii#D*.CCa w ؙ.Ldxy eO4hq<ϳGZ\HP5g ak$@~K@ c$@^$ o.cJK2:&E埣k һr?`7`uA1 _uqaB~ȟ?::5\s` .#F*jমl޼9:u6?\r2#IT#*UZ}$ Xx%@4h`?"jY 6rYj0D$@v#paaqƠA,]{t"Pbv26nhp!Q.;q6 (K۫WnnAC M0?׮][wȑ#'O66mdH,3k׮5q\`ACD$ 3DC$}"b֥m E*rƨQ q6Zliċw]3JiҤ1DKZjl̾0É! .׫8p0z6ԩڬaS̚8q|7998v!§X 'qm"jgϞ5S=/\*T!ymbW?uT\Z"P¬WHCME@裏zniQȐs]VCSĘsW OBTTqIL 7_h$@$@$@&]4ʔ)c^\v6DE4w3O 7;3蹺L]yϡ=֬Yc轍.BގWFm۶ H\C`\C ̙~K>"?06HlAfMh PA},9u+@7!'nEWÙOySslF@ \ 1/غt]շysΝ +3[ & @ ܿoF|n:Ǭިs:dƨOc@IDAT?1cRH-M <zf0aCN2O͔)~CO+Wΐ]СC#/Q1G$c:FƵ4HHHH\J@.u,Y {|!eKa':Z`ԪAAMqǏtzݺuQ| <Ѥ+*,:93TёT1eʔF y˖-fݙ3g6:|dɒiqʕ<:٢u: ;rt˗/y~>eʾJcFXܫ1 ?T!=%D3\W2FTDzrY.]*\HAՔkKҤImKWFT%ZQF 3g*IE"qƙl߾|z,Y2Y+ (i^vM&C>XئZfذa!eWS碣= ؟^;,YۼNRxG}kQAxGi%N"`Ա-P{zkӧO;6_Ud[׭[7v~ p  N/3f9 ϙO:t$?oƒ%f p?e 7[ Gk AF&wΟߐ p3etC .f"[е]Z>apDyEF[jefxg_O2d϶H.x#kժ 1{4`!L ' Iع3v?Gsm.]Z|JrAP{AƫFq GF1qbΆ} ]O}0Òr`8a„qϞ=a)20B-C4/w xZb/LQgK$@$@$@$@v#OۘHH `t,4j< @\}7u6nQACڨT&M?@R}"'z*cѢEvZ?oRŽ;"ւH865= L ̘?Ԭ ,] Ԯ >Ϊ%K~WC'wĆ xw!G8q";Jt)/{"nd~'S2Ez49_|ѬGDW"MO5mdV9g5 "2 lšePc " {Ő!C0w\3^\ 1oHHH|kՐ$IC hQl޼zSjՐ:EybBS?>D<2|Do$H˗ҥKZפ>L"To~x'n; MӁ_FXUGu%"hݺu A3y߾tf$ xH֭Mr  pymճb ?'C'Nݺ: )L$u@v+L摛x5 {4^[tsCo&[ ,9rXfoIHE-E1|8x@ܓQ@Psԟ8Xʕ+ŧv>j8xw#[6O6HH ȭd\H ꇺ`p}]ۉ7+W>$#NǤI0~xT^]v7Q9QE  &P_nǢE?~vȈR *`Νe=ZAun;#IHH|ʕ+q0F{RQgܹcݴiS:BEEթ. ^*TȬȑ#_e~.RH@$:zT0l:ûҽ{vo)'煎0 h`vBڴ޶ @1+R$@$ A*UV-c+_Is$ޫ)8w.0{6d $hs?:7sL,\cƌ1+Ǥ8WWR}^?,vweͬH// A$@$qرE}u "E|$Vj5E;uԏOpfD \%-Z4\k@[oFo(iASHXMb?]v5E5Wx~n ݟ4`}ݺu*b]OY{8xM`B@R_ /lـ M;žG 3 @`Ё[Ð!@a@@O }f :*/H81J(anI"uPQEgS}'9ǥKkuZ|u(t ۷o;?n4^y7o^7 b?D._ 0!ev@ec5 AF͈9HHԟ|k}Q@:@޶ <2 ؍@sI;vnߞ*UZ@|)?~CbQ^o>}:OSE#@&}Չ=z+W6]},*U\([)ޢJ8IfuѬCs"EPbEHŒ&hk׮΀*3A[$I4u ]TxR}L6-s'ж~Z[ClΜ7hV^< ԨQ~.]dz߾}M#<Դb dOCYϡɓˤ"<~" zԇHH ,qq1UR$hHvsqp9?c WG}ޠ I{*Pqٽg[& '0hx{tݎϔ? ޽{C}/Qra:ȨSܹsk6駨~&  ذ@}wʹHHHHbE@\76 }0 /8|07i c_wl?!wҥK%JϽ q6lbas1D`|!C$; 0|y}EDЕkܹ}!RJШl f :jW+V3g}$N O63xZ^K/$n6@DPQDȌx.B>ÇFk׮ Ȑb!;yvy믿s:HHH?_l,baE=kg4hd,"Ȑ!WW^ $Ν;lٲ7$@!Ш/ Z-E0K[`D󭎋ԯ ͂N$@.&d Рp6d,ŕ: X'Zƍc$hK>I@-оnuAժN 8ȒŹrEQS۶ի@QpnO?*U`ȑ([,bk oKHgTi1V>C4VHHtmĤIC<Х @1kӧɄ<D=ws._ԭ Ȓr s 8O@v숸 /`[vm\1G;u[cƌӑ,Y2ݺuCT35%\SrZwF;HHlH@uxر@^Q@x64& @,P2XH 89&U/E kl{ZX%uZy4uN ;7nQ+ܹb5lP =С̙}`m    Wqyǎ A(! };@r6dP@{ӦAτHfIroѺBPc.{Ly2%-zΗeNxhމzɓLWEU򩧞2~m*a)@ yZ߃O?XlFןA5y< [! - SR x{8UϞ=EA\w]cHHtYѢ1Qc…{"& pH*ԩ)9snٲEDz[ Ed8޹ďO $@$@F@wo g͐z@{IHHHH bOD{HH p "u뀭[2eݻ{z2b H, gqp $tIAρ G`hjUKv~`@k=}hĉ͉=ry.>~.vߑ _7L$@n%pKT ׬݋# བྷU[Ar pS)PD$@$`[a$2d~HP1HGg"g ܸtfd+4oliyٳ"tsj<Ϲ#\ml{9HH **"L$@$(&O4-ۇ:u|xB8AU\|zM$@%BGsAC÷>}y/^<׆3&{Tdnj)Soqjѵc,,|~iҤy HH!0XH| d\Wk1&     F_hؼ;HL л%nװ J5ul*e*6?yz9s+ F@ݺE@@ޱVu/X-X"/*0  _I+HJ@#-[*UHgϢnm+w=: x }> @l P2YH *U \(Lz jH VJ _]5~1*<hx-@R$@$ b* |W7ǏW ;fAO:o dbXѤIcM-Uz/h? ؏q@ƌ@fۦS1i_QH!~!}'6l%KpyTX52ח92)SHzC!H~%HH Nm 4 ؾ0k}:'   p7 A0'yh:j%tئ d?p!;wEh7vQu~X̷YbzYb~U:>yŐ(@PgK/)RLW7n\Yf"   WM$@ 8qbw(Y66m, DQ:K@ ov67 $5Ǘ5 Ϙ- )SW[ATVߌ?F~ĉ@zɐtͶ5j"q.0Ǜg$@~F {xN<)t !9s!C']0p -J@aTH4^~& P!HM'THaXKE=|=E =*96/GIH ?^;vfAfqEe}ܟe\0/k:uAj#&   P>mp P4q    <:D$@$,y-[M ^w-|D`xq`dOu @lz/3al`Y p.\h[KgK2?EݺAA̞=cU4Ph8U5 @%!C$T oMI`rZI15h`t W./{[/_KXL$@ MşStEß dVD$|?&NUV!_|޽;N>]V4׭W> [WD$@$@$@$@>GB>wh0 o)7g0mPpbv!,_{ R(P"tĉc ܴj> ^m};ޢC     p- Ie=ʗ\@צcno8vH._R)4HHbD ŁL$@$)f{-[FyecG@bܹ% idg @L$@$Sqa3[lKޘ2d9 Gg,9;] >L$`[%;D$@$˖A큮]]Sk Cŷ Ǝ+KD9ƹsB$d$pH|@7X4`]۶KCJIHHH 7 @L };p&PxqLja"l Y69kV}7={B8ڴv 9 ZF$@$@$@$@$@$`wŋ߮,(U*9bw}ƾ [|\J$\Rk$@$@~O@ n$@6#1GƌD!u)pܸ袪 xq+pjujִ~ p]H 0 d('T5H|m@5 %hPvf5uxI@HH\C`@IuM}%ėN;wơCbȝ;eI[?(vHY.kUR%)?4G$@$@$@$7(7!uxeaCˡmoX6IyiS^=jUKtY3oZm߻[gES[hؽ:CŊHHHHHH3I>[3t8vgV%bU?? sTT|\I$@$@x ]H$@n'&NoA܎ [zg,2ei4G ~AL$@$S9sNL W iW`͟@ٲ^5@4 w D}?XQYI1 E{8|0ӧ*>?6SH@:/h˂='   cEKIlJ qbHd$˙Y.4f nViӺVZ;m[k@jM(e=0-2$@$@$@$@$@$@$СC* WE2Uqqw6u)!H$`o/[Nmo;i DF ddH4VJTΞuw[TH[7 ( ҩ~͛{O{xy`@B$i4qG$[̓W^J X'r$~~&~HH PLԬ(=f?M ,ӧ9"c0dΏiӦnV'OL1$@$@n m*UWƏwC#HHHH\H@ܿHH\A嗁4BFg_l?-Z 6wm\Yh Hފr;v .. X/ }p^wZ~\|1Р0sf3=}:бcU"u)"n m 𝏒D@YSA2dǛ.]ࢋ.B&M0jԨhy)lؐUTD@D@Dwށ {6E)se#" " " " Q&`reJ" " "P60ipu@>'O> 0RP*o-+cd>nPZcm@ݺ1'-(E尗H' lD^.kW`}[rxJظq,~;MƬŒɓG?n p2,l}:(@,^RB,JS" " "P4v5xV4+WSݺ-[_1tf"ظ1|) @&}J:~8p):uKV " $PV-l5?LaZ*:(|'1t(0lP2u߾m;J"L(Rp9K9@NV';nFGyO= )8WB)|4Ȇ~]FlN!# AHM%JB8c|0@*2 /`t{I}{nDZT٢ ?8_{-Px.;w#'*o<,й3Pb@VO=U&!nsR r&feO?}0D(\wߝb튀@X&ȼ|",DY@XJ" "( ADP&;*ЫWAr5"9"nx:SD@Z&ɴxbq$GD Q#ٌ;L%K&J UΗdlȉs8'B:M-t 4ZB.]gnx,*a*SX>aĈ@iA9&F.SD@D@ @cG`,n]:S$1]0qPN RzN(7W^ hp0du(_~ hÆ\ȑI"Ƭ E@D@D@D@D@D@b@'€bŮ1/_R*Uμ@Ͷm~ܲ%Xsɂ+@^ boO˕Y*HD@D@N$uPD`g |44stLۧ BBCD@D@""lgA0.I"%"1c~,MqbʕQ*!q SDD@D vhMabWJH2/B\D@ AD J"8_ڬY/rqh= x%駁(VY[DJ9l`c)d|)ĉ0 NJJ+4j@6 ni9?1 rsHe??t_?:," E@``=S+Q`R" "  N0z" $0p GU/9# mh;n-'L:x WU|>hs@jGgHu" 1"F(4D)tMHsʖgi-KBd % > :.]-%о}{̜9/"Fۄuڼ{,Ew%gL> N" "P4J~;u߾ESrd~h\(bŀ&O.4 UB\ҧO1ԫ8y_#xyvO?)ZA/=wP2г',:p ?{-]3)(f]'" " " " " " jcqm&`xقVT+hX`'+dN$(%%ի bYU9D@`|9K. 6eL{'0n0x0p} /^ر4{6ЫWnh[UU L犀DL`zU+>ҹ>89|MӧzrJ@r;Щ@ :ЭPdR"PPl2gyٜثpEj`cO<t邉'xN|P @zv05*PAID@D@D@D@I@rK񤯲E@Ҋ86`uɇ3m۲nLĨ<4lL ^DaR%[ۺσp2{oXD0`J`„@ ¡J" " " " " " "J^{m9 nvb f6_$);ZЎԯ@ d$" $f P|,KTY" " "} &!sU" #P6Dp.o JP֭+W9e&0-wPܙqA̫T> oxٸBE@ "o93+:cpq 'ժPF$39s]D@ugT0DC@`=ފMͼM6 }6&\UVSfN)p°OoB6$^T#1O# cI%Č)ĊٿAO? 9?E4ɾPd&:!n \r py 9JyX xyӀʕO> w:`d:NX1t$3^OǣDp{0H h`;]s@XEID@bI`jBXD@D@D (.!sU" %P@ڷFR7#ZG6)v-mX6YR]7~3Px`҅w lڨ|d"PfM,Y$$8سdz6*[D@D@D@D ΍WE@D ^:u~hh'a+`xvr3/V,_vcKstp-}Tʞ']|U0 0 pZEС@Vf@8/^x xx`?6lv&A@~Ok5kcWJ r, SD(πTCuk(&AaY2^ P|5;|0H'mCIk^C@ZdJ" "_B; W81<9BB p.+]hw@"#pEu/m|ר_>_|ĺEA֭4s2e7UOh˹`{sZsE@D@D@D@D de!" k/`(੧G7~i#eYp"~V[<_4e_zΣcMÆDe- zh௿/0I%H{+b+_x!;T,H_T1= " "+P!V(,UDoc̢4  J!gw̚Cݳ~}?*U9]>Q D@ 7: *)@! sOޗ?)p9/)tO'%Hsd:mQD( wbҧZ(o ?5'}6p$E8)i;(m |9pA\]  ̛;J!ӎRv\-)X@I χoNJWA)^-[f>=իcQ# !ȢcE@O`஻4/_~n1ec J[L֠El/MG"p5TD q 7QB_S<`iؽ;~}›̕}70}z"PtU|(@^Wnv5yE@D GG)1t@jÆ>LD@bEs8kbUXmVji7sI^z)ƎBOV" " AsL8hx䨷j)" " " "LKID@D eͭ  (#w lo}i …!Wd'y_bvE9" 'Ʒ|{w.U+w@|N:Jŷ*]D@D@D@D@D@D@U#k_vOcڽ-_5K˗u*OD@D@K@BD@+W@hcݺO|7dCʩ(@f@"s))!D;$3]6s_oܘR-E Z~h8Z)HOSӳjur馛Y緫M7o^46l+" " sOA / {v KP׋@ 4o ZE!)7p` -@v~ :$B 03z ٽ*ϧM "3S%&Nnh\8 N}Q4s8UfR{E@D@D@D@D@D@D zh:4w D#Ï6wԨA(;.Z6$"5k fDNà F~`ˁ:uv=(x}{ ٿΟHƌ Sl^=`஻"iWĆ'j_w0lbElT)" M9A.Y$ڋąj+Op*CS#szmSD@D >,|,KUY"Pp=z)7o0x͛Ѿ}{߹|cV HR|z;#a6IH`L'?FOx:^,W.޵ O; ndI_X:w(Iqb6m'm-[^IJv*KD@D@D@D@D@D@Rr|۶M-N`` -[Y3Z*hQXذ!*_>%<.]w]itKQn" "U] P6jՂ(rk);]rY4nreW&=x@TSNCI%$" yU/^i\D@2X h,R;)M_`N@&)L5ND@-Z"/L@4j,B6sŁ!*͌dϓO>DMe= AOHID@D@"!p|ڋ; 1#t䏀Kg@`$oiWo_Y3vmp-0믿tz)eIqիW(L[M˖-7><)J(ᖒ6[OS:h*UX>+ӱQQ{ 9}iࢋ +ر;ˁ ;[7[@j_4(X(@ |L9,A{i38x≂1B6!韌eƍnkF޴i[ocq >;ɅΙY1F"%>B5  G1S' Imw1:r t&RT7:|h-+u)S;o{J. 6SHNk-UID@D@ 9Pd#@I^~AȄc@ "b9;~ wx;_{{}dqx[?զm\VAK,ܖiji55hK1/J?D6Mq[1ق#7Y mSo!R2H7W^ \}5~PkQD ^J %HEw|+~~;+e2z|I{K15*W&v4m NRj*~&ș?'" " y٥u>!@t3''f͚e>W_a·6oyOD~McO '~ngY[ gj߾:|h˧]빦>뾷{}>;{}o1H5m\ʘb_x$" "?@@˖gd# !Իj@=馜 Ûfvm0ԩ0Orߦ|) `oy/P4l3XLƽˉ8r 6K/aƊSN$;]6CDrɒ%?K.ʕ+]S@C9 Z:@jM`6D,``,?zt @na>-ʖnXnM_ׯ kNsd$~2=N^4zp;+o$bs.~~O(@bpGN~@ i;6p~Jtt,[s̺f.e+Ď=n]$5IU^D pL`kLqn.udv1hIfSNcDljokm~s8m Yodwd\u?ܞvvpm\ȉ_Ӟ|6A5=35]1c0'ҖB{FBߧM',{m@T >LjLD P>J"H_ιu/_f/|7$}35&Po[f,[ϱ~Op|Y_sge;_lR ՃOQ" "@v1)N@hǦ-6go~MHaGOcǎcEiv}}jߢ_{>h gꪕvn8.> ~"zD~wG_m/}f,>48lo{ $7//" " " " Y H2+틀@ ,Z| 9kn+dc~j>lX_8yd5iҤI.4S֭ :QRJ9g哓Nf9. tLJ.#Gtu׷-Mhp9gh̘{nd|h>R!OdLw" յkE@ ?t6d[d$#CVӶг9rM_y VZs>>"̺tLD>3׌ IKڷ&uP'E-VZsr䤓jVgL:eVXh?VrewM"dd m$9d%a9vom9.qrCixF; zۆyp] 3i\:uvw@++ݏ@$qٞgkЖo sNjxr#k$[oӠ3Mۅ_h VKDJ~u PMID@%;;+PJlA( D/I0R(wv?Ybcg=Cz[Z>yA`i6imU+E@DLv;JPN~neʕ9Ҿ.q׋r.kr\µ_>[`=PЎxċCz\|9~g':9w8k"oì{7hM ǕJ" "  `ݙӞ䗀 KL狀@BgiL* ɀH>j@@&~gΜ>-ӧOw(xQGCAqh-P ˜K1c})\I_'SN嬝`䯵wvXX[#'i\]h8`qfboщȐ/Ə1 B<0}Ss60'nj'" " " " " " Htt #1tm&ibۿ+f̘|ai*J3k5Gjժ5KID@ҍ@^6SlIFWD@D@D@D d"&M%" Q"8^`bW_ 950dk}q^ÝўFԎ;ZA&9GzE ]tq $i5O? :rogu:t肓O.i*1) Ɉh-Z-[kӾLD = ?RPx'p1W( 9bҥn3w _!єTs :D2EV29Gw[8=mgGBĉ"V>z{5~L!|)vI{w\~sD KMN廬@zdzgRr"@9r{p2h6'CDŽdžR|^zn wPQc0xi'r ? 38\   ',g݂i:|f͚^M>6oy&p`|wP5Pd :*5Ǽ/ !k) BU / 戥`ԤB~sM{B? }e]=vRioi*p_Zj)-x~a>}nO4ɉ~>ըQ#, Vy" DY3`t{@W]@"d" ED@r Ppr=0*_￿Fm 5b⢋.SдirK4uQn2d3"GxѣGs{[ !ԯ_ mի_v<9JpǩSG{濮$" " " " " " "!F3>:DrΐtB4:1q#]s8UO8:Cuҥ#N'@GH;ϨY5*3t 2PD '@LI/W`%Hf|JID@D@ g˵5}AI C> ƥ>'撶miz;o<|gXM u.OCΊ~uJD@D Y X)JG<-fd $1$ !VQ" " EJ( A)be.&j6k,g۾};J,lڵkW7&p>+Vwy@D g{5j䖬gtҌ >(͸q2&*U]|ʥiӦk/U's3 H)@&\)1 EJO/}/Hԩ WOB͛=͛m~wnMMn9>}8 gGd<Ү$"P.K!9zΜ9Ώwimr>`^Ծ@<'|ڶGMT@d1WD 0!C0tP7?zcӗf͚xqb޽|g,j9]q~"|oǶO:G/8w.l;`>&P \} Yʎk%" " " " " " Lg̘!IE9$$'dzO:#SE 06'ri׮]!&6?c3CkXC".Lً@ Y@pGSŋR;*IˉxW _'q@zO9@:`d:l LG >~WnNi*V|h;ܲ~%bT'HK mԲeKP+F@\ qp-0-VH$, A&QD@ҕynbSOʣK{vڶm\Nٚ/76 s=F2˶֭aѻgw2Mx,Y/҉ Pwm7͚5s7nimի1sL̘1ítMq= B;l-[6Lud!й3P@,%$Jd;n_غ5t~DrRyI{{Ί+0~xgh#i(a#9(\OG=SB(/@ؼyqLyTRN9q9裱ؤߨg E * |ge&L6mz]9#g3E ] w'n>=jă{ XL!7?-uPw;v,ƍ7nDF]ԯ__~}aD p~6m …~sAҥm]v8\ $j*"> 8 `J$n." " " "Pdv+@ lڴ }ȑ#qwkՋ|S|xN{nŇ~^L4:']wYf]u3UVe8C!r…P'2hѢCФt"P8*Tʕ+7߸ex衇0\&>(Ȣ$x#9S爀@b;m$ TP0>sYfbŊn;(LOȒ%K&STW"$@;h?3&~.HԲeK84*zX0"] Pt@Ze! AF]MҁMB$wR-'33N@PO>ѣcٲen!l{W<2E@D4hs9J?g//kAjбcGxh߾Rd" fO8ZID@D@D@D@ H2E@D ֯_Ν;tڶmڤ^ќ|Nsf#pEA4Jro#wihQt%hӧOwΐtf^~3umu. vQE@bC`I'uVL:9lR/g5;uիǦr*%) Pr=ꪴd"@!HwR( 3|7h nڴ)veKD@ҕ@ʕfyqaI&a>|nA1;B- map_[nN9.X>JD ԪU T*< P9d&rfgdmܒTD@D ̝ 4luLڭ3#Fp"QmEaV[D {x֭[xҥK駟g¹|\9)'A@ 4jqzi?yfӅ" " " " )H9wt_@>lڴɽ@?>Ǝ"Ir>ܹEm똏+S- 8!L|_ D@D@D@D@D@bLwک8OIDphF߰(Wxmؘ%TL=LE/C坽vc9ŋbiJD `QFwk֬ Cq%UE  XW_ <0,Pp jIUP۸`W" "@>}0g@fR${ŋn5>lOcРX1sQt^R'qQ>yʔ"Ea]}?0tPZ }9"\-TjwtļϼgϞى@F1ۗL `g+)`eBD@D@iUD@ ǏGϞ=͇`7~8#1c ,X> C"y" &{wN"7(p֨Q7thU@gl۰@]D@Rgi>oE@E6۷GKu@saJ'_{Eݢȗ.]~!.]{I2ܕ$3>gg|fg}LEID@Az(fu.ڵYy$; A&TE@GF%}{4 P??{uWl֭0'?`D׃(_ 4m  P iҤ`" " " " " " ">tpMf&Ċ+D3<ʕKզ]" )JnݺꪫW_a…GH\veN%EfEHB{:MD@D@ j C`˖-x睏F׮]QB|;w.nv0'%v //_DigΜzᤓNr8U-V_aڪ@dp_=c<ĩSUÏj[D@D ?--*8p o?۸c>,ڵk]vTsg|vgݳSh|-Т,}4rU" " " " L@֫d{@X`z>>mڴI$S4N5oaÆjZ8jG`"w 'd pYRUD@D@D@D@D@D@"'0rH4i{ơ>#E<')" Kf͚0{lj*x.7_ҏ9 ޫ" "v-hտb&(m۶ᩧw;q4o޼pj(;zѣGc޼y` Dj 'O.S'K>0dqW(r=碣" K@#}*QD@RAklLU>@kO?h |ݯ_?;Ft&Pti,>}13GID@ K. q̹=fLas" " " " L@B|Tw'p58AŤ-40AB 1)3 ŵ^8CpǢȔ(#Q|}\uUhРApnݺ5x PRJh֬իW'MTX.ȣ B}ѹsg'&TD/T=RID@R1I2࠿" L07C=mj"(ڵs"oޱ\ /[nΗ"eGK:Ohg9fH$) ;`,Z(N5Ƚ:ut=}.E,l,q?F௿`σĭj&";dk +D@坐t@坐DQLWпNDJ/n|5ТElR)" "8$jRkGiܸqOL}iӦYT}QEq>RA˖σK.CbSʼn@(^< 斩EH;uMf&Cq#)r 6A:0!BGqʂV?k֬zDHx !2Y_l.bh"G bĈΆѫW/< ]xUn `&`ذx@劀$ ˃ wwdKe8qʋ˙ %byuxߟ}Y|zl퉪IDo=yr Zf%Bd͚ /=yz-LNT 0kXqGo;X;\3q>,3&%(,7eoU/l^D@D@D@D H2*"R/xٰn6GN@b֬YJ׋@R`Ν;:_56lQߌ:ֶx!ǚgAڳļ鰗H˹0~)7'H㼳-q8AxAeƎuAY{w={Cc:CD@ҏ׸d{83P( Qmʔ)Ic8ўtL377j{gF!Hnuy1o_Uע Er8xf1sqdꫯƬd)re`@}HJ" iNvXpaSr/Vn_A']t;|h׮ݎ&ɖѻQZJ^ID@ґժcˣnYM4)_#Xoykܱ7hˎ;QF;*[ g}?lRh8q#paJ" " " " A@J`qJ#__~A6mfsx1qDMC83{Z{.+V@fpע\rիW_|l;tP)S}>c e'x"~i̛7ti"P/x &W6{ lbz:(gs 9QNtD _$" " " " " " N{q~G-[6;w\%?|~!FGy6z뮻PjUA9; rq.@d@IDAT}\dm//saԩ6SIݘ?ցB]vHiӦwvݻ[nmepQGmF>~w3B]tqO^vg$ߟ m۶Xr~QD/=$o:UK~;,,W|_:Yf"G]nu'_|~)8TO5+SOuΦ7Nz'.k} 1</q̘1x78묳2kܥ}GO}V}v7e뮻d*U :uK.qLڂo" " I A+c%HkU }w;H|1n7f#ix8>^z% q;)G';܎2E?43իٳgl@gy`c&DL dyB&C*UT9slB;DBᄏ;g$M"pK.f,C ]}ծ#" " " " "l><5ڢV@4 ! zmL2P&Moteh^ ܱ L0dns9^er)pdЬY&hħ^z.]Y˶0!sh1QSO=211/MˋZj2a0w9%L"ϼOn&?6هh/ݮ 3!@b"e . S;ɍ!pl2!ɨ_|2>c#/;X$3C&*շoߐEpX^#r B$o &7;_$uyYmgg\~?2 &JLՕìu-x:͛7i[o =%J^xŋC,}MXe:~inذ7|SnOnty0 +ncmsvYy[&w ڸqc Cze TGƫ1EB?$dhc9JG$*U!4pH瘘7+"Ű !wGh}F'oݱHsyk,B믿>믿f[6<6"+DC¶ 駟B6ѵ&eiFcFՆH80ڔ؄Fr]87aE1~^ &cݗW Ƒ/:sOȡ=nD +~g3V"AJW9|_FHD_+\ *Y7aw[/&m%!{T|t@(TV(4tHW^X&SvlEsbȲD^6omA|C&L`Ώns}=؃Ge͞$5C+V `fD)C{ldNoܽͮ&>D@D ՟|1%&`K="ID@'@Q:ٟPt"'zD}'D N4JO?3qF_(6Yn]9x>'xoذKblѢ;qmpbq/>{: \Eb(T$" " " " ":l8"aԹjI p?'NbjѮ^%uY},l{('}4p˒%K2.a /$"as˸6vׯ_!|hO^ 1 ݝ:uOy֍Ɏ O^ ARu p /xy7sf̘ᲢC&ФO9r[e~F#OH򦝍߻XF$u>}OzkF[3ħ )S*UBʕI0`@裏Nz‘0[lE' d<:tȰ?7yY&5w#|M1'O1C"yx8 Li?uWc%J7޿8iǐvnߏHMDAENL)Da ŠQߧQFS$p!H Q2S$}sڎĮk#!a_<|oy1;HIe!} lʯZ@^>֬l}." " " "vpJ" " 1&`̮D4Ւ}Ykf&]c۶me]2o{#lgaD:u`LQT)?J. JW_}&ttqQF\aʕntg\bFp 2Esm Ry@B(_</=!W]%oF``?$[k{eQ"PDPMzC 6$L^{쓮Yp~ /F˖-qM@͚5s&9=d:u*,~mp I֟u$>$&Ď}p@F0{6 >v[ ;fȫ pM9M$*1y$2ux";gXA+=3DC`7V)>j׮_TR|* 1+3?~Wwݚ{ &ƍ?,pAxOߜ2W%Bz\$cV[?oǑ^[bzHIe#綶m6#{r~DQ;}$D~]t4Oۑ1dxk==zs+EQ AƏJHcիWw_xqIӅEBg~ 8Rd }zN΃vtB9]ĉJ k֬V!;vD@D@D@D@D@D@D  iS?8z葊Mtm.A6 'xօ^g :e;MxƍE… )I? Di'/gmR*b#ePtv佴I̙peaS S=w΄;vć~XlEnv+V~W*?p /|;}d;;_vfP/ߌ'ڐ*S]+_"]߿?.gKߣsή=Yu?fo..?>$lŜ|~Ÿ|3ֆH9DҦ&oNp< $4~$3cڴix2 4w$q!`q,T\VFXpa A[un}?"[_mwЊgB& GX?{DGK!Hw| eqTA5" " V*V ?H p駟 )8-Ͽ%>/fnޏ%c]qGnD/x„ .,7|C2ed/ve\d:wPd>|(07|{AڴpQ.Dىĕ.q-]@Cz 0eʔ7Sޛ6m2=霱n:琓"Yh?d̘1NO>ee=i޾}EQNtҝ"Ee'" " " " " "  C{u⅜`N3XDѫW/:F@Ǭ#VR%sNO묉eSvFlCO Im5$nSN$\ywСCwyN"U~:ƒJKnE5𫯾М_')*͛7cĈ(ny,?.h?r>ز~W:Hap@.(i]Of~IߖH@H~c~sڶmkH°a2U}Lp'܇̘1[a!EjDz["I99 pnA8$:&ۚbgqz(j(kqOp-'(KR"3~󀓚ҥtiX( D@P!( vlXbo(EAPHG)b *|$fewgvvJ29f&wegյz|b Y ^t]k\q[- efNUxց+W{P/]/nLfϖd(h ddgE]ƍ{8x`dxbi1,W_31g]óu~˷1/;B{C=Nn;W^yJθ)S !K]~evw?=Y;MRX(_`γ#bٚ7 AƛCsL D7wK&EoV5 afY9Y^]f's>CP6iӮ]vP$=G O\pg::묈A" " " " " " "5UTĉ1|pyIql(HHBŋ[p#(Bi;nL~0x[>~VZ5+{h"gwؿkڶ`Ҏ;[oI/[~GaUmV]?Ʃ8پ}Kڹzjq }J,>(kCixfg0cvƺFsg n7kNرz}aiLciS[l2[s>],]ڤI6% n?3J;kcIG @Rܣ_~DcV??[K ZFC- t#*q x inBL2{޽{L3^%u농728F;)[;1cSUڽan=+5` IŊX&H vwsx g6!v42ܓ;aI?LjӪU+_LAh¸IGpІ# z i˼ ]/zYaF^N$,KҥKQX1r)鶻񍮗s?*?h4u;3*&_Jk ۭYJ #dHO;-q Dv>o\oN:鎵uOA.߄vn¦MK,|?5Zsyw8̝I."" &ĞfyVab!bݪUƃL\y`?ɧoz{ae6lN8lÆ ֚Yzic|8s`N# M0`.\heU0aA0KN8Nbf,| gYل(\IXwʤ@OըQW˨QЩS'K!u>p+3<Ls&G,tʹI.,_b۶mCE' 7ܐzʚ>¤Ȥ VBL,[nV &Ѡ@} d۷%׼ys3x XwS33FYLJ'{i'i3m[QsaquSbŊ8plh?xQ\Yyޱ\2oY8k߭mz?3׭['t4KMYQ @qʕ/9 N;'EΒ5s;P~x/g5G}4?x+X𷇅g (oH8VC# $9 +KjZOhgU'=(׷|ӦMC-rJ+5\vpNze6"G%`E yŋ[ՅsmnV+] sΘ0Gg (2үCqisହspP&eȘ1C,$e /cU?1?1U}Wr;SQvm˗W_*0p &BC %Iժ4LUVڵk;wyz9}^N8ygbr/z9:"" ~&@a]o7G(7k,z[ d}82^0`c6皑 D(7ɂIx;w.vލ'|7ofs!w<;P̱uIGg)e,(Z\̕c ;M*" "OfZy. 0l]mĄҹs EED@D 4P aÀzz 0#PP?0"kϚ5k0ڍC8q>3If4 fiB yɬ9sfXr+LL V]YSRJѣGL@eqLF&-Ǻ7n0ЀJ9 ޮ&X߲~%" " " " ""0ng̕"0{ @JJJal հ N zֽ m?K0myY{.F!`UM?ܖnƈ 9昀#ĈCwnb[B_gLe.4rYW^0yomֲpK8}th;Yr-i>rp DCL˧K/Y0w8qb uQs9'`@*U14hP矷|?l2 HC9g7'do|UiL_1n#iy뭷/_`z믷66ʯc!a 3FL \q#J0EP> >۹+cj/b"gm,֓Urroz2+|W;qBY$_>>,LfemΜ9:gxvwv7u3:o]a0ڵK.25i4o4dGx=sg{XrH)㵜Jʋˌ'>>#}+a=LrtYۥ@ѭS_ !{k;wufŭ1*8--弶5 n~ܬbowcvc|$Nn6m 4p.?ݲ-Ӈ[ڵI7M0k)㽝s/qfW_0ɮYόwTD@D L8Ll~ dI"-Q" " " " %㨔.]jƍJuDD@qf}0Ѳe˨8`a& ]U78K\fr2q{z =Fj3 /}6nheg2&I#b]6$x(׮D@D@D@D@D@M4SuhKԾxt3d3Q}VXɌeʔH+Wbǎ0"03/?0oj`9$}̄*Cˇc&g{LVXnXL%6l3i&XF84ZrM%K1X}Ց`O` y(#dhP~Pm7xVu#`/ FVvu#3˪&ڶ-ڟ'pim=;x-# e˖Yu\"}zO=oZD{-]h0_b~%Ѩ1u~5ȻD ǁ믏/k/#8џfn?̽`IN^󛄙ÈC\rD_=zƘh'ֱ'_!'1$F&yuX2pl/Ef֡ 8Pdgcvsߑ1Hgu#Zi~ǤIЫW/w}1n峏>:vOO^^ е+LL$sP%1d}D+0 1ŭz]/gL/kX][f-]/G93|VN &yUk]/G88co~QD@F`(;ոpUD`ʔ)V> JAQ=Մ nbg u5ƚA&uȪNK0! k$d/Nj/nw2>wx饗,>}Xw%;͚#FxAMa$ c^1?l%bݻkf3 ׍^1Sn}Grq3ǎ ?ҏ4`\{)傩 s9ѣ3MvT@3 [E@DuFFY SNEJJlAFY+DƪxsS{" " " " " " " jղц W_}Fի8.C۶mh˯uP`FvPB~هmPD2Ĉ$+"GyfYٶlܘBZ%F̀۷Gɒ%qUWK/3"޳$!r8K}M}3b?+Vu]@*U*C6}h=8 _tYtl|.0&0 RSS}L"z9k6$U^ƨ侎hk-ʺ]/gFI૯`AzL[D@D@rN`^#'@q6&|8cF,?:t` BO*9#F/ؘ3DS蟧$c ԩS3D6s9db`bn-"mT@L sߐ9ƍ v"|r4mgy5@A% Xf3}5\Uz7iJ$'֭[_G9G}9&0k,9_=̜D*snf4i$%Ç[Lchܸ1.t˗Oijeʕ{7_k΍.=H=cWK̥=j^EA?򦖉yڋ5Nw$ڵ wr|tzxw]ԩ=&&fCީU8k%҉'Z=;vDj5kv͛yӧG:U"! L\QERI/QU I@!%d]/'M ]/'>}CbBETD@D@@ࡇV3P%Νk%æ`V.f*TA#RD@D@D@D $uPD@"#0ol2l0/Up!Mw$`^!0>CPXmŊ8餓pLtQdISHO`$RX1IgPc!]f f̘)SX.;w.BKȥRJI:ZVn*ݜsS!`pKcHjaȻV-;1ex~3NL{ gdڇ 0Bl(bT1h۶bŊ]%1$ X:u*(FI^`ĂI9:ꨤf} f`|nH6$;DɿFo^zHZew 5&t]fpx20dлw$5ӸpaO>VLw}׊%ϟ7&f2l&T'SiҘ лv ^ve=3TE@#grJJeBpiD@D@D@D@@@Bn " `p/&j׮-6Q"@G_{ÇG߾}Tp+MwȮd"/`ҤIV_mA:uЬY3KxODגipf^jfϞ3gZƍjkS"Euu yΝ6$"`h&qs y7hicOҎ/m#Q2c~;6w Sd(oYg}6Zh3<|PD@J~ŋc֬Y>}ؾ};n ζk76yڮ* M  ŨQ56)&l5?i:Nhr4iF.^\ Ԩ:U]w&Jw?a>S|ǘnV矨P8 k$PBI@͛-Ƽy$\3m Ҽys#7ʚ`^TёQ!裀q]2ࢋR*, P XHBYBUVźuRr7_NbM@˱&)a=${AD@09@~Nˬ"s̃?JquQV#}wgu% I8o++b1Y fOG>:TD@D 2fD{츻eˀa%ag%HyD]5U'0ÇG֭ /g*9#w^ 4C8rV,wPrYճ'a&'Wԛ~aF(rČcVzsCfܪ-i`DmEBU5۷o~+1~ 1`= /_nLWct2F-[ZI>hw/kD@D ^ CjBD@D@D@D G$#\YD@K௻:]<;G{1r܆wHȟ >$]vYbn `kr4(YdIK'|ԬYw\aPD@#uY"+V?rr(3FLp )JGs(v*_ŚU@|%L4`\h՚zt_~ݦ >Kex~3NgÈ\$[ C2BAQ 0ֽ (ZvmTVM7:uDcvm/8tٲe[lA|PF K> &O@?5CjP[o]Ou7xDUK'0zh+_*čZ @z9aްARWGzU(" %p-0cBEܹ3 6}Lm6,Xcl9I .왾P:w,]lh+qw^.]ڊ1dr&&hѢ^00 Z5*ժ(d@Nx~'1tP+K|ѫW/urӦM}gMҥ ʕ+{K]D@D@D@D@D B!8&q&+Nig5'Ro޼ٲ]@ᷓN: 'xbBV'wO\g %CqYUD sS&iq,R" 29+pa_w:x#ؚϏpƉK^}5#OVߠ E,8߯^y8~ q^: *U."[nw5&t+'{7hJf q6qU01g0c 㯊aC(;}@| H2՚DLn=ɮX {FϞ=q1D\g |}Y̞=mڴXщ"" " " " "_߱Wϓ3hS\΄kW++V4]U-.*UL2B8t~7ACXn[k-k6Y(JA :' |k z`Dsʚߐtcf߫ˆa3.Bt!#o/*EGwxO?F xp~ ʕ+j{5C1*UBjj>y} 'H"6D@!eF)ʵ8EZ~ G~ NbJ^ \~d\ZfQ= FOK<PD%~1\]xy*^vpt[7^D@M$6K B2 I?~+qR }eASˮ#i&Gyn%8ə$"D@D k?Ѭn VFH~L1VE@ 0b=v_n B1~믿^xt^|Ÿqg$٨;" " " " " ȓAΑcD@J`޽VWlq6闅 |\W\Rd pQGK\E`Ǯz@IDATq\(Ⱥ~zkJX(HQVP+a{RUEDh[Mvp7n2My1c0IҒW;~}U_^l͏Gt=˗{-[>~)ݚ>7UτR<(^xھz!~%0*k7oNcЇgpe7g9I?DR/eUNv<0_(P_}WoKCwl|TdxqW Gz#%3=A@˞I큡Cj#pE MCAxj*+T={X{2щr`P7^zc~o$ӌkΑf>z晜)x]@Zϟ<O੧|g,?Ϊ" " ʗ/!ClX"?%|Ȁ]Z' ]ʹ}[5kW ݺu3>Ci@`c:u%cۗ.`̙ؽh"#H̓';8k27E!sl@28p%3\(,?,GPk`Dqj"" " " " ^Kx5+" % 77\/^7|* de9qyyHIIms =~ҥ4i`[]t%жm[uQ O} YE8 6pN_`>+茓cB'S4Κ۸0Ye a~k];Z+-F yͤ+N%{@K 9: JH^E~U~dE LԨUE@B="=3τl̘\rI(Zh1:8>gMNJ+0eJSNDKr{8>g]D 0E f:dg!-2"xd/4x/§UL:C$ʕ+[ TD 4B^@0p>"sV7J~sz9ZjFtjS-&Dڏ5]/ǚ&0y2[okhdPXZ4T"@;_2Lb(gq|OI[knsgx*"C=}Na$NO;yݺu9~tڪ@0 `&M`Qˆ>Y"" " " ~" !H?*"2tPK(O?~i.\g\8 s#Ŋs- :)l9{lk9s%@'/E{G \)"" " " " " " " 9!@QGNU$rUR28yvZgIO:=I(K.*U*%K  T`;wα\xQ؃˶m14BSL5_O:&U9IRSOMTC>!` ACɐ#`y>S! ݛÃd @?A~ 3q[ԯ_?Sw81(=߱۾HN> lyd\m85_~Tşx9 ^>8YL͛3n̩Ys=﨤:Z1YC'ސy>y8ۂ2QP}34: HHMF a|@i}?^(M![D@D oڴP/tk85:uXKڵ<>˗cҥXlNrs WRuhԨQ' %" " " " " " "p9P堉, rVJ ۱cG2€8gۋ-j-kgL "Le}k.˿E;eG)ȅW€J :\WT 3iF ̃5p)h,(""p$l~?"!#h$Mw$.^$P 8nn⋁GLnȓ' ;tXN ^_6뢿"A?i߇~-s)RD~g`kTנ"gЧ>~$c\׬Y3M`Hy~r_EEA 70O"P~ б#0v,0q~豻XZ52J$S zS%c#$۹iӀ&" "-2 }(:@mNl'5כ7oN'D؎蟝YfeIZЊMItuiS1*~1=D'0xꝸCߴ[-ki0 ClРI\_a6Č@̙@nLED@D@D@D ~$?jID@NYtzi-&Fdb8h0K0j(08tRJ*V:hIN6\: O[MkN`)eV8>[.*KIw-0騈@pm s s'5k҄QAfgήo =%Nfv>)))z2g%=_SYq^;kNna3[KmJ 5}Yaqq^;knD..dٚAF^upFcD Y{208'@k'68,K~jΘ :1ucg K0ٙD 7~X4vq# L sΑi@! GC;{ }pPTZ5N^~ ƆvG$k&$Su>B遼8ps7}662[gq8~ g{pY8ߌ`?_; gpbtFfk4m8}ʯANK8z黠իW^;cD?k"^"pȑzr%ܹ{䰕BTD \n^.TDLj+rA]/Y=ӧÈ 1٠hĂ xIEbEk' 6ifWLh^~y?/}v4"+-?>Nl#d2lO>YdO=ܫd\3v9>׎'?Dnsggç;qd܏8=}=E5Ȫr]\9LB:G.Zbiy8#v< x!W/` ੧`8{h-" " " "K%]-" .!ϛRơ?82:ޗ/_8# 5Ι3od>ӹ)t&SPI Iڵ|]fMTX17X )SZ"5'óljN `:5@B&p;0!#3Q"s~hG0Г  ^3ȑKs൓Y3x5cHw ( Kr`1eK[b.fEgJ:.n%0npy0nPv{ pN6sk,sNIL a^ J'h$fqB%m/y8~ GYs{!&p&W:>w#3c 5`Fo;ma8 }k91F1aÀoSxW&~xM AƋyp;dHu=Ĉ@,n=qaʔFc+74!^]1E^6@?ޑ m\ъS=V`:;Q1ǜl^!/;N\&oO>}f0p%z.bo[n(鼧Ϟ~b3M$)^e=ROBg" " ~%<8\Kn`a0~%~@H2~Ւ$u;@'NW=ݤYaۭ Bҙ y'PN{8Ni^*U 8Pb6\Q_pd:ckfΆdɦ)xa~ &sh%H9Yyr2~gaoeCqB&'% IqȻIQH DK gn[[־:* i0}eDp JuY:u{x,vC²eR4`FF_GFp|\6_o802idɢopbCƦ *W]<0|8xē F'u ̮>r$v?]|?(^vֺ^@PO?&Pl r*"(&w/@VE@:YCunDj[Cм~?+-n.e:+wA2[ӆIwLANk7Y~zLJ5\Ӈυ$8x-54.D9>j[D@JKjU}{7#RSj eGBD@2%`փf̰o31t63pDcs`K]3j\b\S =t_lh&yQ"p{Prpcd@f/\´Mz!"~oD'sr'LlFCGK ߈%]-%P(п?p}m1֪oԚk\q}ZK *V5kķa& p 6l(Zߪh压r.CE@bL`_vbܐ]g\؝wq`g>ڿA+mĈFtdCvI4ׯ"wu]bT3HeLg&(a"޽aD-aDb}@Ԙ@\ 0g࣏qm\I>n =>0{6mK< [s%mQ,A WwLƉ@P$+Oo$I=c"KE;{zfY^+mcƸFY&" " "Ыn^km b,jWTV k׮ >Wkvg7tE'e@B LhSAED@D 6lV"U-=&X"_ 4Y3YwvN1u{'*Uz-sݲLD@D ʗ( ܺ72jTmP" " " "H" #0x0o*Â_/\t0bov0mٲOs1@.v0hp AP@W%cD(Ay"zyW_uS/T AZ@vp w-\0 E:TD@D (yLZU@0%EE vpP^=``LvD@BLv-vLR4P]" " " "  u@xe{ ۗ\TD@D@D@D@D@D@D@D@D@bNbE[7;̦M%;oUnƏmIj@N܏׭ E@"#0f P&p晑D@amWrK# ;ZED@D@FG~[x8|gWj!P8׬YZ\E`FgOSL&Ou2FD Il |-<$]R7D@D$^Ws$QL6Ѵ)CٿL2x0vb\<ɔ?ĭVgW"ʕI@|ua/vlUxui/$@mAHƍ\p}{rUDdȫ]:9޽cԈffs|0cе-y0 ػwap (Ae$~z$$Pݚ&ēzr? UD@D@DO:ʞ4k'ѫ@ pr-b]]˚ 7 {z'}"q&c@j-8v,`p9q6D͉g$MZUY;'?}qoZ EFh^=c yoÆ</n;u`"&Yzy_|,_4on Vd'N>z}d$@.̙ҥ@&0m! !KDD@7ece !" " " " " " " " "+c'nm>C{Pɒ  6V@V txe%TD@"'Ay:R2מ48jTO^D@D@W'h B&oD`EGGLDm3(>|?!!p@#ߜȫY?'"Jy)8$@LH$g7mw}70oPJ釻foNͣuKظ5ѣ_ƌ?\c#+E@D@bCSENOM;UD@D@D@F@6@X "m[& c" " " " " " " " "R hbNLdeO> 4l{,pK/׻#2wl!HII]apCI Q۬="- J[vkKnx)[>& p11{M!PpMO;w:[5jժYMY&M~Ȗ @ZmW\]k 8BAE@D oM:weE:\D@D $nސj/ճ%fQ믁?xȗ&4"Xo |0dH=1؉  &[N=u#E@D@D|y`Luk[*" " " " #`BTD@D@NT @֩c;:w/" " " " " " " " "9JmM? r p @j*Ыg^@ pP@X7E@B_~'B쪏E@B(\ށ*"Mwlj4kU]" " " :Jv[p vTCQ<(꞊$9YgiXߧċ'-kՎRB=s&[|[iS`"QhK6k3-5n <=L=K?g=V }-d$" "&}]`?^DF@BqQ" "dAv;\c 5j}W^"ЛnxرK{Th͚5իK.88(+c'\gd >к5P绢 8siSI%ƍ9q"ce721E_lzs#6>Ҷmi츿OVj'6O+b:PD@% #ϷEtG>k8ć@%jP7X g$z&OiѾp ho#.^ 4j 0w.po#5>о=P~[^{9m.ѫ׭5q~Ưtb@nZvĂf.4bюd& !d]MD ܢGX2;ʕKs" " " " " " " " " IJD ;tH`j`z`T)`0;/l1') u+9hF!%%%I#<" VkdC`l lIީ?" " "L̘z_!9%@=O= 9e/m*"C?Gj/,Y\xa U" "O?E]䒀 s P[NTR*0>P0qx/Gmq\,/で~.Uzk)" "d7 ,Rk1  A愖:64^bH x{Ev_}؁' LOtZ]H{Ym(P a6a;>.v.Y<(^z"" " hhp~"30y}8 A_]ELjFJS0tc޻@ PHeK;A_mQ" "(Ƕ>tb+2(]:ūÁs4WkS1co~*%KII'ɟO$W/偙3>Ko;ŁUD@D@D@D@#7ݴ03;,_74"" " " " " " " " " Q#'P=9rd￁/.u2igZO A`EW`3Nhؕ&(,"E$ / hL&Dg&EjU(Ǝ,X^%I1H&FԪKL*" "L"sW7#D@D$QMs'G@i+޵XL01F][o!/\,  '7+m)" "Mq-^ݯ7"E@D@D@D $OjKD@@'fi9ԨQd7UD@D@D@D@D@D@D@D@D@DRR-m!ȭ[޳E}8l;xI`"c*"{[R;w-(""].Ov$N?ݞ *" " "'LJrEvb4+43SSS&֬YTO| ?ۣBCXx;dR3;5ć 9ZٽhFLo.zs`z%S8۴)z~_.N*G={-M/)" "=y+qޯ<4бzoe@ H2՞3}70h?;MtMûa!>v"y?l / ԭ - p+CHrg}^@lӇ" 'w/pN>9F; ArbĊC^z XaU;WD@D@JGI|V e Zk`<嗽^D )SWv|"7 V:u=XW.D@I ĉx*"m9s6D_{sgor2og P . \|۶hQ[aC%Ig \uٶ@{+2\D@D@D@bN@B1GD@D :S2%e,o5\U$*U{O`;׽{+'|3GIiu!W5Q妤,"sO>i?cu@hܵ+~CrC< Snjұ" " "=\z[x'РЧ3e&ѐ4"/9D4mψ[| &f͚ԪCD@D 5ip啱mGI <If̀͛k}%J|$&>G[7 T=L8K.jz 8t{$~3Dgd#" " " ! !pT-" "SSNcȑdbbڮ*ȓdi&י:o`4C`\S'tiӁfjoewgZ@Hq" ذ2(_> t@H H;D]w=zTU#" "=d!gL##@Ѣ@߾3cV^]B37KU;S֭1l03-ZpAD@ 0~L`ı+.oP㕝Lc>X̎yk@8`n]ys~ $މZ\pв%LP3|uᦛnr2HD@D@D@D@D@D@D@D@D@JZ=|=wN9*࢒%mҥn &Ͱ))))ѪVA"ewED " vEtȟx`|stv8D!`Pr(42 JMMի'B<#<nFH&V|@W_sԆDDŊEt&H2}ph0HgYݻwOӗ6e}MTˤ3|%`P`LvOxGଳj԰=J'.">N2zAIMuJD@D@D@"& !Ȉ@=?ڴ,4n #F@֭Cx4UD@D@D@D@D@D@D@D@D@D@""P4й=ڵSOMzQ[ lY+W_~=ft ؓ+Y(PŖ4H._}e > @^(RDB!Z3#P}-#m" " "x}TKj=gbmI֫WСCE+JM6u9F}Ԗ,Yb9tF׮]FEU#" '`~3׮E@D@Bd(B|VMNS@V5N^zIg,`;aoRu,0W@g7Ws'E &ᡀPE@@|{]d|Dғn! H2Bp:LD@bMmHft8(TCM)&{I"" " " " " " " " " "5U={nش FR%fMOOZӪ(A2=oJ g[Ĝ(\ѾļA5 >&̻vw֡p-qo^ @S޽ 3C '9d ]MPRSSK 2A&Y0h,_Xk 6 .0" 1f{K P=Wť&,HjLUv.س";RxԣG\ƃNL^0^/9۹2`L:g<~L' LեE@D@K&~ l,'lLmGvē'J=8D^H@L5ON=6 `]|-p@g e@ĸـ qk^D xY5 Aa*"W/l ]upp\Vc" " "Pk^x!f$&P8Hgh AY&FOwkmۀZ߭;wZ"ŊÄ k?p) A^z)?K Y" "$at֮Phܸq8h>ڵk5y+ZFcИd@%sUFWje'ag^d̴UD@Fs6,[^. AFj\`f>X_dŊv zŤm,d(T2>t(p}@ӦvByi`򸘥FrI`>V`\"%KG*W#"4UD >x=`L஻ڴ([f[^` nY3;qw.YISWvժϣoN<k[-w }oذ&MB%w" "2 Te樴VjH7yއ8eC}k2 ͟4iL /̘ sϵ;ҟ{1dmkjF*2QE@D P~J?Oީ/" " " "3e"" "&={_~ig Sx 8p=zp6i-" " " " " " " " " "e]؁?lgq`A偫"P'W,KIIq2I}&Op3 Ayt۶Fc^z)މ@06&Lg ު"]=ԫt ݺ^[jj*֬Yw ?}> GV_s$>}`8q"Tr"" .#wi0#" >" !H v]e2^W9s{a֯ڝrwl Qzuuk;,'c]U Xax^>g[ID@Eh´i@N@v_[ HRg`f9=sڵ+J*H(jՀoغPk&PU   5WG F,y/_j%" =fS,bXu'P6@p{3fġA5!" " . j<.0H&$%lIuQ_d໤Yn|2p=vBkn(ԓYy|5 oI~b P6 \n& !ߜndZ\zʕѪU$u]P߯H`$;CD*cLm0QJB)!Ih*)eڤHTTRт$-DQJJE!K {QY>3vr{99}>sϜY~w̝y}7:U#o?h8t/-D@D@K/%UD@D@D@D ("*"h ɓ'[֭[ǠΉ@ى'wi }sO>Z%x>]KEuxB[PE+A>9j)_ED 9G!V~eKM`p[i 1 UD Q*V^{ *q"pO,Y$NT"@': ,Z .~onV?VZPkD@D @ƌa.TiFz@c*"@NfC6S>:t(.2KhHiV8v !+fp(P̐ T"رc2 ̜Wɚ׮֊60lЬ~}މ@< (tT$ȑ3PKs7SOYPp}Ԯ];J[j*7lsKaC cǚ@%L81HR_D@D@D@D@D@D@D@D@2AYݻwF_஻D/W^ۼVU2^{M> |5rT⋞ $!?` Q(^pfc:$ڵkm⣏>W4//cZ{ &xnCD ҄ߊ"bSN>F廌R.@LAoۺSM_6V^;FةwXv<!JzX*t)`4 ];Kt>7n w{[̙3fP#ݤI]r'({$""$"*|!`|`(Rr!TDJ*\dO1#Gěo>7s~2D>16__2-M4՟sǎ"l .ȳ;zam_ZI>p ZF~ےU'f󄪅" "P>ܻ_bP" " " I# !ȤVC" "_Zyx^%>e)֭[gۀ~wYjpf[/41*zM@8p%-nq loikժou߿?6n.{0Tz-~gW szDtJ-DŊ˓ybBo懏ncQą<qJ&NhXȺE | zﺋ~$1-;IJlF 裏g'{x*@kW]~~,J P̽͛wdU|Lkj 3Y_SYfGD \q^`LVF]wUPLW@5|yŘ;Z]}ծhg}oC巍}) " )B@B)rM bJ˪5Zt{e>$_ EaV2IUa?D>]aWGu3K/`,ZmP裏bׄ/b,JyӘ@rOcܱ6Kƹ5vXK4WڍKfl2'&fbp y;f ; ' :X˓{=f-[]vg&= FD@<|M'@Æ^_HozW0Af@z|-PPh$~:/O5 =ZGP6"Jo*~8*V订8DSM^ti^F\ZO C姍%J\rYYi w?.SRo7k2eF "@:v)wÄK/ %6-UN:LLAݦXS *:mu2ދl!7HFv!zvKCn2a)EL{}W#C-E[n|-|Lp9Жꫯ,G8m'aM)z2 ?QsŞ{.4j%W7._'uc)I&ߣ'|hmh<cwIz^93 ҏ^}iӢ eYvVԬY35 kժm@,,ͣfG~pー`NAL,}߾/h۽QVf֫-ejk!{G E⏼=x"  =W!*Ѯ"G|$};l|ډcJH O?<ԥ%`q߮檫4sV\Bw}{ywM]ۮm,D&MeJh=?j# Tـ}n݀g hGS[nXB@! k sOHn3ݦ$aEݎz|cnkFΝ]oRԯ_={ԩS]MQW^{=w7benGD p,8?akfCnF݋ RD@MB!\^gb2HrcLGO?/GԌӲل>y_-ښ# &&w:m47Ε>G;vt&Y_,>܎Iqd_zu.Hi#ҡC\hnlo1,(^x rǠU+ؽZxs7ϭp6bŌS3fpfn޿׍퓦W; \ / i,j,Lx<ֲ>x+L) g>`:D@D Qx@jWxI~v V"`/zVڵsN*" "  _8j9NjjUXnji;իWw]_ +stS3e̸.Zwʱ3e5dH駟noΣ\Ts,{өS'gNKǻ͡ׯ;%u(c2sʪ,NΦMX]wݕM t㓳~et 93M2k͈@,mԨX6" " A k6/ct9t:ee͚5ͩQF7|ڹ, k 1S͛;֭s;d];9f 7l͎%G:M41Vn˪3f4ٖċ…ӎӢ*>q/WKj^tcI@pwތVdߎ8k+F{8?m]Lrwo0ujryZkz~qcSJs1ɿ_-q!7R2\{M}{ϭpcŌĔ|'Q0\˘d`run21N7Dʈoa\ ri,j,Ll&Ӓ8pc9F" "lZ`쾪w" " " "_d$:Z'" ᅫ0:w,6W]C/-kk 6i9 4^ߙNhwZv}eht7J3ҲeݜMu=s2:|'t.Y볖Ѹ*8~x>YôD,{?jʹ˳s2d-ӌB%$ (m#" ! %ڠެ^Šgy]&?石Mٱ)Or8=z8j8-f+Ծ&Kz9餓.˾z4/#^ 7`g^v{$L)}$N2(C/0=9! E-/q!7 4Gpz4/!`^fty"Dϴ#Y^d \b0AS|'JW|sC5O_+ŨTR%Ӷ;.QK46F OX|cw=eW2Ϣx볺F7 #nG{_UfD@R5a"_8x_Z5kԨQ#kp/`D .R69^4g-&3qRL ĞvU@Ljۖ}LM/cucG/GqgvaNjUh4E>ʜ9s[ͬ{n\-gƔ2V6իW["RNǎ*\1HB #=g0>ߵSa➀櫄[ўXX|1#1eqyi37ah￝+ݏgϞ:ys |W_ż[ 10^suܹYǀ{/@D@NNj%q^UD@D@D@D ]n*" " I cЩ0w.'ant̘1q)7&h| GΝv4eּ?cY^a~+Y~>fVcqT\&.g˖-zano/sNwʕexӧOų9s衇$aJz<6FҥKcΜ922"GD@D@D@D@D@D@D@D |Plܸ&58K"ڮW0OoԠAXd ͛KC96h2st9fnƲvZY}QD0ٓ{h>Coz `=u<8D]7>= ol4m۶ɾz4/ u_^ 2d|}_HV~{"#P75MuH Dof'`?'Xi^E ޽{z+|]֩S B۶m k/󨣎裏ԩSapremf&6 BS@.U@@2@EK6KB-[!z5v<;8ζGZ޽Frw;Vp]W^xWp饗җCoưapNh˲*Ռ@Ju\{wW_ +ۚ>Њ+9pއg~lÿ5mԍ@cd#dJf;'ž7}Ĉ/7v}z!s=I&}ˉd[\#B>s_{ȘFva*,3\?Æ f{5kfŪF{N^3Ι+V`ڴis+w EJ@6'~jb?b/+9Ɯ2bFc>}p6k9g05[pЍεsj_|^[g?(;:Ӡr(& Kf(ўV`*" ""Lr3gzPB)rMT"" "  |c f;γXw9o&y;_,^s(3xDE_D9 _ӨΉB,h=0t ܧYE)/+*I#,E yXY[XpUh@ؾ'ݑ~FHHv崃l'O6/f7HXle~_GO~Go۰,~`L:͋@ 6*9Ǜؖ㣏IE ~ c5%~+O=. Aف pLsV(_&d`HFR@}#P*7a/aA;zUWkm,˫ӗvlÿNpiy`A^v@fEӏTlɥPTK&A2wf ~&ژHyٶ,X#Gk%" EmSL3s^z%WT"n,RZ'"\n(fS:fQh@ ]ק}F^z^D@ҁ0!6ae"g2c,Y/Ga>PF~eҥg^9LnRM֯߇WV\gK|c9#*O>s>e /o{t^ bHܺ'i|s+/f^ìӿ'$+kFŌih]ߩS'W~]y pd YMxث4<ڼ.\ FwuN.7; m)" EGa{潃3mc7AVH-@ x aG5D p0D/w7<ܕJ':9<#!BJ~k43N;rDO8Cj={qǹ(RɬY?;0Wܑ3tBSN9sE=,8Rˬt'sfRb|N9w'0RW|a)ΝJ_|EV9xOh-~` x}#PBA?H? QKO| o>ñhiD F'8|^6n`„ݻ 7rz =Ng$hˢ٠vq֭[bŊeE ϶.^_FzD@D 4_T0Vޞ ! v 3wd(KNQGwaȟFCǡhw2gg  2m{| _O>) W{N_4!VKA&] -on<ڣ nhv٪<3)cB+3I8 I1^^)DJ37hL^2EӦMx)bR6]ED@R\  X~'LRiG`f5'" " Td)'3{G*ou_t$b9SOߑ)kv7gVeY,oc (I-) Ic,&Ppy[W_}C X;@rʕlU4zYp%\e˖e-ӌ@j^7n Hi:6O>$k=ghC҅e v@)&1aů'6KiڵQRZyEC F+@X +xXv|. XjDY̹zT|v^MDvn,(~ۑ։@|dLPtN%2?KB9im|, KT$,xW%=+$JGI晡2{se. 쳏%/RVz m=N(,sLSi^ %(X*%@Q]C_y%py[0H2Զͤ͛7wG_%ԶMAE}2ʟxE}`blժU~FJ$h"իu" &`zHN-{Pa%//g2ڈ{U$T2ߧ395M55kxީSA;p⫯r#7lEy~kgq `3#Fdmg0VZ뗗ݝ>|aX&1 YHs39 c i6mZn8|e"2"Ճ;o?b>\Bј2&x9Ez ;Jx&LuO<Ho4Aoe<8\.] _&M@V୷A|'矩:[D@D@D XJvIED@D#曎뮎C9cgРAY;]veNٲe3L$2'9Lye\pA~ftyq`Vdɒ3wlD|zX 0d|ԨXv" " EMGQ]Ȅϣ>1G23EڭL9{t̷Oǭv)S8`s&stb rTonw̱yS@/y]ǹFǩQn鎝ώsÎgهswvgڷz뭬Ao8{ȾJC"7{q=pS^ w]uV%92>PpCr8j+|~g P}|F=qd~|*/ޝ",9k#<] V، H|?umD OI6<ڮ9dOwd7b 嗎ӨgWiq.a7uinѢ{!Cw;hGym_{ホ%VZԪU~pEݎ2(Z3gzt˼%UKVV.ܮnݺY;>]vWf- ^ocƌn}xaW # ]2砏Ơ~̼=WRr3i%2gsN 6~֮8^0`{nc&|Ƽu3:ʕs|zW_yƲaV0N}7A0[wEs gǎ܊?G3^LMiܸӶm[DŽ5A0sQG9=B.ٺqx{?yɎjG00%Xw}li m&ĚmF" "*fv|)Uz~,l+~EBcD@Rٱ[2鸁 ,;v@΂ *ڼyc\#XEwN/^jwh gKsh`ɓ';-Сk|*U8j3twE$e4Ei"S0[ou Kv?pcͱLN=Yl\~&0`YvCּD%`"JI@pB -r邏Nʲ_Yp 7vXp,k[wm\ЙBMӲN 󓠄ob=\aÆ q>,HߴMC:%8f_j8:^ ܵ3}.>4wײo,H%B&cfl>_:gd}nK#Y[g#Msc'7R#O5"{]< 흴жI1,+}*@2Ԍ7\Mʀ|sHmh>5 P S'O`C2{ݵkW׾6Vd x)D nUVu͚5wW_u|M79q6?pc^|ͺ2l0k?ӦMbf[4O"n}Y@~{͞P׆pD&LpSdwd*UV}^o10bI ק AQ} |9ύm/Ǒ1Y џoHy{|()Q{@1* ;w+k4mN?%"[DzNc)."LiTu~1w|1cy/fE@D@Kફ`1}E|kVmA#0u*а!0cPn޽{8`yߔ.]ƛˋ֭@*^ A|a,cjCcWc䶖'3N6*> U,Zm ]>.'=vt4_h2X[,`ӟl0yf] s.Q#1\io+UKzTD@R@ǎK/:`u" !Ȍ:@2`z꩞oxX[,u}/m)" " " " " "EED@D r %@(ƬY!\Z*vğz V#mܦMPo*#32pf*#@Q>} G~zrPG) qе+к5PxE@D 5}|"UW*" " "`Ɂ,K"p\v-^{507x#^]JzfRH_jS<=pY` nΰ oټ=nC'5#}#7ndYN]^?A|D]G^OV MYpzLק5t&{N9``#Fxބ]߳umڙ3mE~E')" %p5@@v@рi4@ b+M,>ŏ͌$>?\o3`Ya7DD@D@D@D@D@2&Nŗv*" " ' ;/J{$Ѳ%͝;םX.yH{XիVZ8ظ6 yR%3΂9&꫁Ï Xl*" a ^ 4l00O.Q) Ur倩SO/`%-_2> ֬8ϏT;۷zy0wHLQ@@L8%'x&oիHp8w!yBR"*A^q;$w}m @f1$QU/" iJ*UNAjX" ".Ę1i0 !O7*xI7M0_~:bpOasl%@1cݧfގ?%KJ2'`ذK>|ha]4߷sЪչv%(^@X 4oQG%-," " " % ~" "t/sI":5D@D@D@D@D@D@D@D@D@D@2>zk5f9/,X >l\Cų6ƤIeQTEԭ{*V|:u?7q$8QX5E [ nJtVw/lM_(]ذ!vBR6 ԨAQT(" "  c gM/g_o"LL¤z:Lb*ZK,7Kvm#صdj'릡=~4+{”>Q;?z4~=еkMN+VSq)7bȐ8 M02˪. U?Eժe1rdK_ z|v:.@૯FO*ĵ?SMM ʖm .xf͹@ п`0e`@tKl$ @ x#,;7թ#Lzر#>+|rL0ݺ]Vo۫`J&& gE~ /v)Or T5! 5m ]9@VL|a i&|6W+,P*ChiISoyI;7(""" " Da#q%Cͩs5i>n4iYn#,xVj>w u`Z26 =h(MB8}qC׀E@D OAB)uY>kFﰻ0f'XRI&\x<̙L5ƍbyV$ڕ(]p| W3W;%?/3~sO&_iBcܱy%MfIX@(WγI[N{dYg԰A@By@"@^3ÇQcKۉ@8͑l~\9~gL䓏& 90'ؓ%-8N8٧/4?X8 رc /^) 5kk1 vJi:$ԥ'39 APUE҉{O=O 5j/8N:RcHww ,FT :3>X8d.=N|(dɒ7A-lW ?+p'.BCܹ&U+" "7ScUF`J/%c)ԝcKD`:Ş!!R%.N=h̟%jǘ1\C-9]3TQGU4[UwLr z7Yp@&'?*T[YD@D`(;bw&Q♜`^" " " "( !C .h۶h7(QOƕW^bƌظOY_ o@b,0)n<*W>k:uMKvm@2q6[򷣶 \$UCԥ'> `ZD@D@r_5 `l&3h$ EZ툀y>80-A@(U .~i`"Xtg<~ʕ0 ҥ^[ݠ@^+'1ġRU-" AB @J2pUe еw?ؼ9й'0sf NKgOODCہ6-oɮ#</NFsiʕ55k?L;.m@|w}uMC= RSK8s=ᦛǎG-)l K6Me|}eQ:`ÆЭx,Q,D>Iv c1y?TFl+/ ԫ)n%x@T Ч][ED@D@D@ HI $FhdS.]<{98p࣏`b !TL_LTdPs$TD Ԇ@ٲs10{oSNN P ['(Я"A!в%0k@:gGU3,b6m(@FqqVH,M$." "?d/&py01B󞝷m*p{؂{&YwKhy'*VjI2:}F}*Qx&ش#<(Q2GLƻfM1m=ҥ…C[}4p@AF"ĉ@6LΫ" " " iC@Bis(5x`sDdӦ^cy+7!- PLfN_9ϳΊ^m)" yeV-gO/[u)@r[{8(tIwz6oΫ&-$dhl@V ʨ|!H@2?$x j#=<= Z5ছ$ȃ}#E-$p *"$Kԯ4n R=%e*J%ŏ/" f>M" "  AǙ@I{[ol3Lm*'@Ē%-K[Ӓ]]qߘjnX1 ӧ/xAC / q R {7g޻N&BVzuࠃ$ E@2ż_zɳtؑc(E@D@D@A@؃q ;gi<=P]"LV@:Jb H2|U{nƠd-[ #F+=lܘT4x}#U 콷'3b""No PITZ- $;v,P&v~|KED@D 9k>䴧VD@D@CPoˢǾ#|wo㏁NDoT/^{ 4h Έ$ AYmK=Gyl9(l̎"" " " " " " " " "Px^ 9-RaV#mu" "Pp۶'/ <'I!:u偎!C.xSD`4/H=rԻ v5OhAK@#K6 A& *=a cy?TrO>ʔ~8}U3@ϞG3gz U΍aǎ냾jժlٲw5sOE c< $&<6Ւ@|0A>ħ.Rt<_[haPaȩS=qۅZuKβ$Ϩ_.mO&!g`o[1 [VV*wN>6`/9g0`*;8(U 8D_~pjo\L7 !@ Xx K {=|TD@D@D@D@D@D@D@D@D@Dm)ĬtUDضm[mqzGV)L_T3Z`h`5+)Bn&1YZ)4iHD422VGE vR{# dѧmoD h^T$jPb pi@s +}xB}yj..^8]-T֬L^? ~gF<2BD@D eUD@D@Rdz7mۖ:.eR@{l7K7`vU;P6kd ݁7 *9I@oxDžɎ O.8P'skر8KR+" FNGxX6>WD@D@D xv ^#H>~?<81Sbv^ƓJ-@8Ꮞ%[" "Px[nv+)VXvs\x?gٲTӗ [V@QxYssϢQfi 3hU=QD Xʔ/gOc~8cƍzlow"j. }TI(vA]w70h|ժ,nR[ahѢTr@Ӧ@z87իÄ51cO>nP;ąEM <`\S%" " I$_^cL"5g;WuCzQ<0 \x"@s^{ͳn`2z^$D/cmϷ~p-C<77X,ѽS" "|9_>~CT%` *Dg4 Cď09AuD@D '=ŋ\;7msPsЯԩ 4lPpY3_?/8ZԊ" @kDy[BmSe6٬Y 4zD"~ diOȾ ͉}h;lL|puioH$&xO LH?7UZj An% ;7CB?}G?z [EЭ4/" "l|Dі&MOOvjOD@D$YXٟB ;ݺywc꫁~1e pQ@ǎ^bZUh5| Z5vڵ=NXXA*|\سQhxUsa@oA֮MFOՆo]?MED@D@D@A@a:E@R n m.6Z#" " " " " " " " " 3ga)D*s@l۶٭Xbmx''{j `_~)pSQ ExE஻ Uv. A2AEE@B"vR!r2GJR}|b ȾX]2m PLƛN=3Kr^z˶m(6rgKd)L`1#Ӱ\q;yٰe40@W]PDED@Dh P0端E." "P,`N"*EGn@|eC OƎ z-ﵗ>*|'9D䠃5*27{I,!Me}c"&$9-v?~HE_Џ'" u2x!*" " " "OzOKD % 0C ">1 _{-ҖZ'" " " " " " " " "+%y 6=oضm[qłv&:~:ipD}Ygz~UZ xPB%KHJSjD\ez`n(@&;ё_?t?kmf}#3F-"@ڶK2Tăm[#FMz͛ *Ph}wWGU3M2%y &^y%{p>_ΛP $[jFD@D -ZIb,*" " G@Bwɥh)/Ā%{9ߍ2 ɓw>Lt5]|/xp71ƍzeT]mH|w^$}{Sh˿|7ц4k0lv՞{G?JÁ*V;i|hO?]@1&9ٖi&Nܟ}Q3'' s_^th-xZ"G?i(!t$bZ'" " "8VCm۷֎i+``֘w|M7( 3'!}`TG`U4Xf`}@T4ղ7襟BGB2:E"yz≞($!LC:`7oW9[ǫnS0] *LZW d}%] (Jv~~doy`p[o3gPCݷ+ɾG_c``A%~*&|=)p6md gn8`pQyo" " EG2S E," "Pp'z"+>g2W >' ,\<40tgH$#JPܗ_z(.8{6l>X=jռCߊj'z5d{GX(G{wJ0$!<濧cJ#R&3[}'9ONq,h/30~cg4SҟN?&w߼'ߛJXR}G"]R@P iIED@2,Xi|?1ySR(fLCD@z&" " " " " "_Ng?`>sZcO'L>;}VD@RϳyqGOr$O t ?с9o36Rn 4sM{?)&F'7Hg|nw/!$֫dj7?{g7U E1NV0P1{;Yl={ޙ3`r{$籅^ߦ|)p G`ՒF?^x^#PJ05i̞ 19=ZϤ~Xn=Ts`rW9kjn#8FEN{y#+HBnXg;,Ȇ?Ok Q2ϼwA6ՅT/2ng5' Zә3 4ؾTR(9vȮXN>w O܈!3FN'y}uɅ&CHjxFG#17DK:RlBf!e? }u2rNOY徧˵zCG}}mK7ml) _lۆ={z}>ωm[%!d{F)#S7'>v'/!7C!g5[Y&~M^FswHl!B)עmE!}tSѣkn2*GpGH"SA#4&sTB&ݻ{7&.jGpGpGpGpGlȵ&KE cD#V-W mଂ""(~ĈdX.]D^;ׯ~]$䩧&^"!20Dw)r"X=!rvǎE3r"`ۄ yOG &Yx1$B";촓;,@Buu;1@U p"}&FFUT+dD1|QD3۶C`m;߄\M@k{F;Cg>}&\y!M6RL"ψ6-5 G2mW%fnim[0AGpGpG7tDvS=#PVS;t|oSuA&%_dM2ɨ7"B.e)W_=_AyِF`Q5BJ#D Y 2 IXDݗ.IT-n=b9qBn#Xtp6d}7zt5Yj$);E߱Mʠ\{"]ͻ+eJhrR9QPu" (A"5PLYӲ{ovzʚuIqo :QRg;ǷQܦ$d@w\;l)"AC)P2P\> ҿA8$mw$1曋~kmV{u];63 }#) *!p lFh)L1h Ɓ"2#cgۤhnYq I .`y Xhc ʙTOG0W8`X(5|L, -EVameփ\Q!S55]]a))ب;mDFƓa}ptoRdBQɏlb1m4Q=m5ySz:eoUO}.m{Z׷uL9u&}sGx4s9YjzeNsl4"qr4|1)P|T/wߝS)Q9ȆlYrmVTXz䘎M#"Ǯjvpe s)*N{Gveꋔo}LKgoSN4P/!щC/yxh^ȾxijA.lG.5;s!j '+_W/Z73= K\Ͼ3Ef3yCL}Qwl}R@&.GDa),C֪!m";2]CJU€">M6oRfUBǧ3]UW6ƨ-3>fO0[_>G#8@!D t`0`ԔSFl[DК>iҘ43grlJ<ڶS<<'&J٢1l<>ؗ9bM SbX_ϡpGpGXp:TdРzip!) / z ~I(@;wgQ5dme4m?>d]U3RHb^dVp%j^'Goʷ/?-rՕ<#)Ie=]~fAz喤W'<'w/imTQ::J(f!)iz,e-|zY YP<|e4DAFD i&t`; Ϲ)Z|`DIe?>(7 {|ȰaI_H T01@'jE6c3`Vƾ{!Is q28 "XveþZjs#PFd̘al n`aEtN3tMe]3M`z7|a .A„Le"8 ddvgt3&L.[d U#8SPEE9f~rGmtY6tPm%gCe7n\O$W[`Ni8sCJd~Nȳ`>os|[H!$B|gy;袋 C#EuD^[dME_^T6?mȕ~G_$Zsd1gG'/\R! G1hCɻ,ٶ~ȶhO}1U]fQݩ.Y&^ĐCd,̟XEgEk YC5Z?$Eg~yD#r[= ߄߃`hzrM/Blkk!+Đ| ?F:fz0CJK-7SGp'lXDa A)*1˦da rB()-DmDQJ"Q4"2,#6MORc ,} /s)o!Pbb GpGpGpJNYJ=oGUpDK/_|1( eYFt.HI!G<{Q SH#~y`jJһwoYy[OȌ,FOý艢,6MKQ3EGWiN|(ʱfg5(IxPCac<fCDĐ9!b㦀!,!vQix<d_`<| i0S"/\k>jn_]nSy$)ü>QBVK~#%m6E躼Z(cM/I1N쐱 Ѷрr6xC sZ `,ϯsIPRW+ӟ&m e=82'tMضM?ĉ2^xƐ;FSdZM=vzE`DEױEqJo#8Dp3]w[g!G˜{AVlctQ0c~ | @O+t A8s1tLΎ|mP✏5N:t t"wN?ȉ2EtC̑Y?~ Ap%rdwA}{W/t8!_}U| aL.1]>@SNsDn ?[wREu鐅u7"hE=yp(Dƛ"BLWX`SLʔR4ܑk=8@S.)ZV4ꙋzH%\"(}#8#8#2?N~#?/></nAt+W^HveBI=zqX5\S[oYOof8uuVh78~cS#r㍢=~ oU="J(k"*B(YVQ g-Cu""(!H]{s tU"˪&#|Х5PdpQ\>$b>^L)>nv[g<ȝw< Jl"BnC RgyFFƞ70vأG0u?6poqܫAZ0OCꪫ#Pnv%i@|ҦMKʅF8l0 D3'xT'"(^Fu4m{ ڃ#P!C4vfMu!02FLә;YIn8EA'EXCE6ܰ(Yz&#8UUT\* jYG~B457sr\t :G-Bb$Ds,D|p,LC< [g$vkQ?;E% :B~HD ys/R#DO^DsI5zOQ$)"dj笯H';RH(\vYrAeD$!~DFn޾A.:`.ds #z]Y_DtVG!rMSīJoS/t蓪Zc$)S/lALLs@IDAT\9cƆjO;>0Ӫ^1Gpp"K G^eL)4="8< L\ 0$"p2Ť6AO =O!ߨDĕFVx2..72GpGpjD@ENY78eA%Abذa#;!@gjA@Z<ӁEw.TkL"j6Hwߤ* ObuOSe5(T>DqXO(.O4)e\[n!gƴ sZVXa㾧4r\{cKq-G-߽?FI:WKQm 6H@`7u~'#F3pWso=d pg @ iReɔr[sDܳJ"bG2Z)zԜC@gHHpՙns;ۮ]Kr &Lc_`!ПI8*mZ:@!Oڃ"H#8')痮NCb8]t &i )1zMףEH$ MĖô bG}ʆwСbq 鋯J_AhHEȒ<.<}!9A#:;%rjRH!^t,?`s[nX)k@eC#F EC:dT7%$|?2b_<^7:g%"tW&=Vd!nO||w8#NA,Z4 ~!U>]Q$GdL  S#P0 !-5-Y۶yHJDkYg.1F9#8#8riA=#PLQOnvy衇(d mzAٯ(S 1ƒxdyɠAo (SUG(g|xp#>+m" "r睢"<V3G7" }4GtM:":3[9V]^#PvQTFĖfkSa颋.R!=.{@ਣD?_T.jmV:#(\r,Wq`/s=Q 0,L իW ?t;!D/B"s.sUW]5Hj ム~#r1"=ddQfIrB:|b@s<ѣG'qV | J'#8!<K}a!FdKC"Ex0<4BJ_~Ӭ~HDwIZdo'iPQ>>Z\Gp'l\&GZrکY&r6#^_TwuZ R/2FPN*DB"h3,#8#8#Pj%gT8@]#W_ Q.,RM6D:u۫q(zq*nPTEWj<8A'^"ӫ4ϫz ʯɻUpUQgE!u>eƻbGp 'Y E~H\Hb IFBpJ!0yȐwW4e. (V"Xb`J\#8#8@m q#2P[nE.weJ>[WٖAZ 䦛n~)q2$x;/J#6mvUj?Vkf=2|p9r@T B>O'5xڮ|sυ3HZj\le+*]&=ڻ|@D9D^xAT^G1J˕GMFKQ.ƊE""'FMxW>kʔ) P 6l1>ntj(X &wuBVtp4BP񫒪6mi۶Idd"["F+;JJfWE}|O 8#PQWO(/@3y<1AYe5b!$07q5BlHp΄EmsF|ZDc_a7dNXfe)d^L}@z2}@8tw$IŠ_8#PItXHN;MP25h*{Ai&ZZky-:-Xe*5X^|ǥZ!فVY`;#8]Oe 6 "=8EFsp^ljg1Hp \M(eS0QEo}}.?|pgr+)KvG#šuLĭjJnEO37ߏ2q2v*{zM8O Ff;#TNYl0xE ŤG6m/J2>{9#P-`pϾCBA"^ziA O"Q-8#8#B sGarJPkd}u5p#G%}ʺ+}@ͽ@#кVj]7Ei|ȑr-N/'(z1t4T?#WtoPvm:^$iQ>oeDI1h8,]v)#5P?5p-B"ѣED\԰PQԨK)'_4- D.Pd뭛o̘1A~!yg5VA;Hǎs]j/@ٶmd{^ԫ^xgVuZ~C^zI^} kdj1^ :.[;rʇ> c`x@۳gϰ&ΗxI@-"& cE;[uvGȇ5|g8\<^q̇fxyN@ y衇CSF"cq{-v8ͺ]=r}1yGs]wd?pJzvT'sw^0:ؿu<8eD'ջ#嬫?^ F=8njO"CQ Ш\<+D g>Nq++ya:YVvȤI+s9G~Cu]ޠjAEYDt$rRڨ'|dOSO=%>|j|>;8ڃ#8A,6ʾpҟ K>}_~AY =8#6)3DGpzD@dDdž"mڔw.,jge;V[=wnPzx0WRH!!r=sxTY'On)̱~ALOz*A#4~΍Z6лwmU`gZ~/U7p@ #D{ 2W:C8Uz뭁4uVw}Hx%U.'V{/9>>>8#P)Rȗ\ޟQ@`ʔ)3L!$ѣGЮ]³tG@2n8yׂ7 &.]Zj6XlwGpGvܐp!0qDkn =8 ԩSx#}G06>)B-ZU9^=G 'M7@ fgQ ȣx E9;`D5xC ɣΚjy"F%c5׳WI.=|_]jۥNsň(Q?\dpyW+ a yE~ ƭ') vBYMHq oy8lcQ[]{ҕS9O2|p";髃W_=d~@! w O+#ȑ#7!3k;qv:#P6;OE^~Y֫lzA#8eF`]EDžJWTqL;Vҭܿi۶m " B+#ۃuܦ=ܰfB!i]x`z߿&АÜyC%7ȹ暫nC=MowG^zMޚ}W)LH?^W\q&r [c?pEO? }+jQTk Ľ޸ωpGpG!qG O/_l'v5;15kt%ۘL81D,@9v9q~׮]e饗EYĝP:.TDmYՙ D4&0P;tS(Ww܀7rK}Djp(O?K,EFlRؒxpDEmDɪsrïvG }':yAi+@uS3Yr'7HpFս{4AȊ3$tz6`eWݝ  tD믿!fm# *Wh?\AgwGO:@ڢJ|OK g_Qje|ZQpGpp"Ȃ+a$㕖~R@뮻n [}eg.}EGp"?.uȿ+nf}UJx掀#8#8@!uvC9@ paE <C#V[mw}}7hjeuȳSMX^z)>(w!㹾hP8{# &%vۭ *V^YwosmTt@>(w\uȇV}ZQ-wQ)TUAfEP8s p.UL7$r*_:@/$ _,mڴ #?~|'|qޓ*a!N4VAU߾}eUWulB@ՠUمȕW6TCcѱcnx5eV:@.̘8xGՃE]$~@()P@{ 7_/^hiBbX_G*o?rh߭*zGpwQD)23E_~e9CYA>+K"0vؠ'}='x4LUQo]Ӂ6ȿ7dW(`Yw A)2! <8@hjyhuTXUU=H Hg*W ~R_^]SG|D:2X5j.Hy [0Q#3.qx-ei^[dE_\:5k)rʜsbA'M7T#w 3̐ γx`W^ U?#i۶mpF9#o^~#P4HvEwE굕M5i$+ /:N]tѦ'?GpjՓÍ7ިN Og%DmI?3OC@¼ΫdKK/-ݺu gϞNdyTYo=nv U‹uG(ͼ(icqd. ƬBh~a} $=zXqn{СCu(9Ccɺ+Va/($N?u-ߡ)gk'AB-@1[Jb]wݵEǧ9u@5Ofo#8 @G ga/ڵ|rgz ?kw}ꍮY=n(; deǏkF6l>CȉOxjX0.82d0ljח7X2E8Һu۪k>`F)eoߊ4(R|/1^s5&>YյIϩ'M}駃b5 [ ~m᛺r?^UߋtجKdGh#vIGH!""r͢zc"W2Hd;NbԉA_Yv.2bĈ@[Fa@Ԫ<ך z_Tw;t#]).L8v!|֞A N y#_i+?|83,+˔h:ٹ!#gj(8oIxdy,qB{Y tgyЙmihtE!<ؖ"X;atae,V@ˌK.eVgt \VI]Bgya6\xnǻw6p)My饗d믇1!Cm\L!gu`;ɱcfB6v1RD.Vzҏ|ǭN6^\s3*X✗N7_1_`ع 0 VL*miySG6,^g0EUlN :9rȪ!^ GpʀEQ[ 9n&{ά$5+;@.NϡuhoH ˵6^ݛo)s*rwgB4s01SJzR_dɜ:S,G_Ĺϼ=D%x7z& Apk&MaKnGyI_rƀp0&dlbOiSZKDp]Je|Z6zގ#8E ˋwPY(R$Y(XC (1i/D!/#H1vqK>L ?S {7ކ 'NQB 4,@8]vӜSQX 'X>H ձDYf_9`nn=p !G3tCV[Mȏy"zꩧxx z8 MPEG1c?A5X*Ȇd3NM.O4h8Bq[lǶq=dQG1\b%dVjr )BY۷/XЙا%Rr.f°M?Njv[oc m,BF U) FF\XuY&baL]I]~sm׫0[{yǻwK.u<3L3)yyA@_{{~,8Z԰)ef cl)؅cSL c*ӏ/:x-zmccs^g;=(^_1q6Kw$<0 'Z{+6C =_%wYtm JvG(|Vyp"Hd!G6 )"crJf\֢`#ݭ[0@ Q=0p t-3cHG!ĉ+=zJzR_dvA\1/(˳O/' } x'n(Wl^;d'xbXyɭ*\rIX+׽mN9E#CcBƆ+[%4&{)kqֲK]SGp:A@ J$#y%f}$t=UzAVf:I1 % .CYݤVX!췝g~T'= zЅoەȴ/u6@9QIB˄zqW^ֿ ' *ﴚ?*$cMBgqFo50o#8#8#PD0/:zV#& +J:%*!qeswy;f~m۶mU"WRҵO曛U?pBm9 %I, pP%={%MO(R+J\_y{J ߿g;YT?Q sViYm jP#*UM֮8&Ç7ʀ M|2^CEQC7˫ZQ:ꨄ$Я("ڠWj:6A2fUp&0{''Я!()bbW K-TBcv']Oc[% KL?Ƕeھh'7Z'PGt,!dا9+V$@ %orkkRZZ:S[nT^?2䐩}q7.ƽ^q#Pqs%J <8<7̭oWsCRP߳tJ`Woef[77.(/yy-;IO|+s̑8}Qlcl).Hc/B [L?hwVW/R(l ^C[vJWᅲ6,8a}GfoQd2:v{9s|eILG?~}r'ᔼQD\yBJnyw>}aV4RyQbpQͲ]^8O>Iznǔ0u]\h/#zmgW DVey 6N昄.,/~믿Ngdnw-.ʛ[l!F ȦҺ:E]-r"/\?M_D sNt3\5--=*͍?#Ix}ȷw$ʖ&?s1/%%8%ޓ &clL] :xNi?;찃0Hu,O/mʷc(2`>k--q%oanδsωrHr5Qe#8@P3QY~yQgL[onݺ<U@ͨKkMww% Run,{؍w}CгS:]:Tfqƒ+Jz`]K}Q:ؒ%XBIz*c&P2$6!Cz|rN}NPBekYVbtgR7VJZ{nԩSkKqcDƊ;:4pZ&Y.u?ȔǧGpjֵ]ڭ ' r'=|k!i5A&M$<}݁^0egyDE'(&(cP#/13EP"P/ܡ^xAn&8Wi5I%ϣ>:ԃ=( ~w},[ɫK󫞵}W%buCF BAꫯ;wC1u 7 XBD=(p@BG<2 &LD"J[YgUg`tWy'^x[rUWLB!9~bl^4R J Adp-{.xLlgIh#hLtYgFqF) YY/DasqxSaUʗ׀/`γ`N\E]$7".l 7۳zJȜW_{0,nUc ]M+P9k׮]ԫ8#8#8#8 RVȯ馛z㝦L2Ldn_|qP4hP y**K&Ãċ-XQA& ]oq3> 䓐&GȤDZuOc~|=tYH?J]&}FH>FY?>< C#j+"Tb\ ل8GKo-2!/Yz&s|0`A9*tU1_ ȏ+uȣHTΐT3l̀Tk N:`j{ *XP*8u*}}2SEe1"O' P/ r$T"\䃩|l3\ZMN_y~φJ\ڵkBc&TNK.d8O2LTa+ąf-ѣG.h'{%bRULbwpJ(dB,x^}BJ3JuQ}&WjM4]H&zm<l`>V{T4dMԗbBB' %L(a8G* y{.tbP/m*8 m>sRZm,"z'vpuMgԄ*]%TPNpHX0S'h&TY)~M2 >aϱ*ЗXco* g{Fh)y~^)zvGB vfNЏW,(ڃ nJލ^W#8#8#PtJre8#r԰&- LٖDMC,* Y瘼F nkgո2> \$# J}YV%OS%˄%1MgiT>/3\Ry٥:)r#Doϯ@IDAT9DwU|[;QoP>?چ1pB :]_Y"B[B uJrzj Yȵv@|k#j`|YwT↰Fyrzu&Ð5 Y!_U2 'fYnQE~_sֵ,8q:*4sicjJF@չh+^F| y{N$ i|p`%NmDE]|s8|Gg.0]džXǎønM~,kW-J:Sb`,1s=7-(aбAIOJ*Nsƺ=fDS2ѱc =`a!_v^4ꗮƵq :nNt9WƉɓ'{)=:A7P"yK,DQI,9B2ya ~! j8hU]bC5SX-9*Jc*YFBpo@YP#,(N[Lnbj'ͷOn!,:JvζIlն88gyC^8msxG2YMxѱKx*sP?ll}0Xzӏysԩ:v1 3^St摩n|xk e#&Z*)95-/qljqƥBu"dݢɞF~W-;: X(XKYF3Ÿr}\\ iQVܾG91.„:M#UuJ)}+JYN3|/Κ qŚ3O}ykO|cЛ_2싮Q` k[J@ѨҒgH]C*4ɳqOJ)O?Z6T*c|Zy#8E@U}2,\QA Bt"ċI 2@ F$hĈٳgBi;$LϮE٘Y'ؠU"YƸ, N(+7pz %-Zײs⦹ Yۊښ=7q(y~9KUN|G9)6=\>/=`| +S* ŒQ7+OW/T)\a 쿌(dE/6{gI Z!(Dl'rA?p!ޛt2PFg2Zve1toTq}i2kH!!O"X|攗vdizq)Aqpf>o˄CkhuTaKSk+D ӞQ{gp黛g{ Ea|kؤnqKo{sƉqƥ%S^ i@/xPGe9cpGf%CŁxl*uOqubzg3gE>B*;OM[ؤ;1fPgPɀz ')U@/}>=6s:>se9H1>DLGp#ZE M'_Eˮn3E=et|vk.SC1(J'J('v{-*%Hɘ1cDDxu{o+.z*mlHiӦMj.=#I\>WEpO9ѭ[7 U D6Sig9SMcu[b Q[oϟ e6H[n9 \ve!KUFՑ5 *T'un U j%\2l{&PtbY:%H=Bv .,Vr 'z 7%%oQT)]J+Ndĉyϊ!|,U*_yRJB,Pųɳogk\%եܩ*[?/{^#8#8#8#G@@i_[nEKT,u:1qȝ! 3z~mIs2ɄٯJƝF:밫YPul+4đq^r4#PJn.]V*eΛwkl bw%IyN>}HEh55-i_oEsRL`$ڈ_3aMkq*fz4 kʚ\ZvNzfnMTЬJvI&s=sJKG&opzhm6E]|s880.qbK~m_Kn5j0,AfmS^zd|,`>8`LŘ/fʷV|UGDTŶf=rZH,mCOw0!.so@Y`ʖ<ɂhkpNKB7: 8:qgv^u|ʧ l=ۖ.+: ;^q`y*/d?#+SbK+8'^Wȶd% hr}jtd;KIONٵ9Ա]0P`(Eu{1.cZ16 Wu&(\pvqKo{ǥLپ9t;:#4 2 Zb&W:d#W/]ǎB6|(>Wڜ\r\c`\M*6(WcW愄VX!#ǪhARtзرcIQ-<}azXyy/Z?lL+_=xV%xƏ/Jյ)}R7Pbz?Nɚ 6/f&k>m-O&d^67pE<3DJeon6E=X)jfө<o̜)}l?H1>DLGp#d+R9pZ<07<駟~A c!&nL0}!!:1?ՂҺh?(Nbs,^4nnaE( 2^cۋ,H,!S۶m<ТX^NXicǎ)w #%=*0I@r-٨z|N2%Fgy¤}ʯVK+pDb3BΝ; ʫqgeJQ!ta#aq) V;M=7};ٱ<홳V[ʑ>ڻ]vM Q8#8#8#8-GS>iy.D!`vv>l2L9i6YoN$;2-YȇLFľ25\O9 <RN-U=_G\#^-u㣏>G^{W_zM7w/׷9kwmN9[e$*Xk#ve!׺Sh.b'xz!rvviQ֟ /-p?kك#8B`9*2 q q)t$هX ~ $K z;I櫧Zvwfv__ot<]+tT۾sp|3w'5t㎑ ʆ*]r%[{l {FxSoleKJA SC6n[JGuT,-Aa:)1;c"=3:0nyӹ+)aǷP4,ߋ%n_'.Pk lj8|kYw@5jBoe\r ~I}[ilʒUjW%]lmh[>i;[֡,TVZYok8C-LSSeN$/H0H M؋o,q0v87$ì gn81c܌}C CS^I:VligR Kj+iXML:@KlzR~#zQ.6.X\}l+}Ge(ݝ[T=ɹ9M*Vw ١,<Lֶ/s=ZׇM!]m_}QV_ z A FUǹ+ v/z'꛹4K_杈̪/޻oy<}32vg_tT?ǧ}Gz;>%JsWwUǧ}6k&`&P_5u|hp;~&Y;BΊ[lE(ޮ}lH2|;1 ](IL+Vd2@-W_ Lj^JeeGx)Lz*Us_O:R;nct$ `[ouT淍78D׾9~4xiȐ!B၈( Djͯv*nRũ%wygȰZ:JowtՊ[o֨󹇈ra5Hc&`&`&`&`&`&`&K?*{H'ۅx *?F+ r))/):w}eVƙJdV\lu C曯T0V$@0.uyrbc'cn$9;_wEwJJ_͍S58@lXN}ݵ`Qs*7aHÇK/m>Ҭ{Y/3S*e>O`i| c瞦Q.Hoj ՔS (tj_c ;9ễ@)| }X<8ꎭѩ:l|y晧lUchP#H'pB+ʷDY&0_n>y?c~MuT%wߍu-z jR-) S'9C3ײ|)FqjÕվ[NĵԖ^ZJ(ݕg=JJ- nktRn-/Lul5H<3k`gFrĞEOG}i5s}y6b|ڗs&`&`#PSGaԎ V|FQn6Sb\ũmQNAC '͋ƣ>8pHq!DeA8'9 }GAǔPd*KIi#(=PO)ۗ~+\u]Qqy-Wwq^xW'1"QM)mu_XX DDN:[V̫/zb)P@-Æ g}&X^"J{nTŸM>hbM:餱x 70*rBqa8~UdM?|$;;>\QMek~/̛ TR*ݿ^8T+nLQsGn @ix]2G$/ c -Pզ+<22q(6$ %[Ȉ[ouӨWNdr%2V7R5wTANd&Y$GTfrBvmm9#`Jݝ+f [jdʧ's#J,E`Iʻ{ȜgSn^k{\ciYcD5f>/[olO>ӗ*xvم}D ; q N.L% `P{F7}5jʩr:sՌ#q0.!Ӄ~P4}]tEAϚkvdM;wyU*Ctїzn~H:MyOoK/褓NNRiF1^C-%K |Aahu׍ -8D'q}6ᨒYw+l;IFb%#߇;(:Ig-97}5Keg)*l%p}P)Ppw@5Fr M~gj_yʳJUIǺINTݓQn;u0i5Fc5\zgjVǃ'a]vY-bb 0裚OQJ]o*Ʒɣ;@GiAWT*U7usHϏs9'ڰ$#TO-PwvB uPtw˶;JRxi;jޣ  &Ai ;N&`&`H U zxޫ=N\w96rߋ=/e3\;>c*ɹSlR9Aӝ>ݾJ?|mZ&Q|r}پ˛/V#jG!)GoDߠWj*7'ݾXXo֧פXXDo]}X1#!gȥǧ}j*ۨizw00%&j'[tњe'f-"- r-}A!k0ܵ/m[vu@8v5t '<V[-j.8ߋ?qL;CsAQ,I悡qWl%ИOP2”?DL0}뭷^= hC}A17s#x~ cj+caPh.8:anG#[Xp;mzH$Y0e{0)j J}L}Ay+0/ Jq_{3(v>3*Da\0Όeژw*jܞjr_}.DG sA …\t/A6:r˵NRqOA*G oQGO{P EsA%/kveS޿+Dcx\m /pdG߮7F78dsuLLLLLO σ\\v20&\y_׺o(7A?^{tM Nb0CpX %/8\|E TL8|;`{'c> FE9L9r . Ͼ?>\^5u1搿: ԗ@mL *>k NK.dי_|qܷ;vK/R[]Үu5s~ռ+;*F5s#!Yl+X&?1~eY& q_w''8wG\p2dH)JT={u喫xJ  !}nE\p]Ϣ{9rT[h}[^~9x zvnW- '.Yf%v2ےyU# R雞f5JЈ9%tؐ':>ᐽ&&zuմ/կkނ#{1R~aC~Փ + &zdQ7>A(G=t"z/0܏kTMyڎ.%uM:r!hN*.18gˑ)8uV?tkH^|1䮹\Fm%{VIA/%MٗUpw@5`pVQ2XNT-1|5*8N2TJ̣T#ϪV~VigX%]¡-V5'C䅕Wӆ>zoX'z!|.8n:q$y",&t1JۅǥD_Ǯ'  'G}tU3DoR*SU:ݭ[<+U12qC4=øRbmfX{ ɕVZ)U++GG:lu.rE ,E 4z_+iM4Q>P;@.W^f* WE>R\݁JrjmRk;XcKp;{TֺN&r.ed3E7C=¾<=z3f O7#Nu<}g@_bs9A~FFVH>f>/z1~q)U1W㧡/TN5 H1i`%w';q3ƎNǧRi5s 7z|ZX70h}AXttU:!' gq>G.(LR21ߊNJLN8ᄹ}7Ge=a=`ϲˏdD[p"sni3DUaHbJswT8fžCwSy8$ L(P|~駟>H(yv Q0sg}vt7^.Dsu]#K\rITN>{g@ۗa5:"Gy晣ꫯ]kVdq=(b kd!*K,RAU>0AyrPEY.+?ekN| jbwR1>H8hVRͲm(5#EpUm:&`&`&`&`&'AEp&`U@L+qЋi;a> )xO%&-Jc9fy!À!8,F&LNԅ|v}h}wa[SOE%EVJ59FDd+U#׫8p]N&`%EBcN魷ފNbي%pRo0? "=V(|rs~9վ+*]rs#ƻ%kP25LE3O+V|gQ kɧpajذaJ1(`kQV[m{5#H70wmM{Ԧn_~Bxu#h` 0>c,CzjetAFP譞S%b:sdtl3;8}:+'φg/ڗ[fi@S;Uwã ;ʪN0(q![1=lh&8D4SG2j 3d}|S!'>}o!QO%Ǩ~GC6T:* R<96@iV=Zi=0 Y60ht4r0IrލLt&J}/rL W֧vB.\e&VD3>E|<$w,dz}wQX эJK0O>Unh=#-:F?~2l'&WiK9Ywމf.W[2Nxs *t?pSWr b!UYcݐ1"cF%OA td3j'j|ڨ00b&%wީIvI|#9uҠAm,7L Ϳ G`bbZ5;Lz I,![dIyM=\mE! FJ ι G:\)+#G* D.(8en>Lf/" Ø5}Y|_0T,jίAH A Ż=y` .@ʕ1uF&!b|k6^gNZofQgա}q%cB0қLwM\%?QQB@নh%]oiD%yT*cjJU+;8GTpu7&ݯ9j_?^n喨 62&KBO r6 2D!H\# ̣^y! A**VLϭIU@]IŮAYt0mwY`t2~o:\yQT޽_ԡ Os!vnr_צwC Pׯw6վ*ɂmKKR}VUG죁F'U_-ub&=׋@+k駷a$00n&`&Xa S˞p7kM7c~!ЈoFKΰzcڊl!n;M;F'dop~<@tA"4kD4=rVqGkv_>qN@ŀow@#W(#igG=Fw?/<yI>=ӞlD?iDYa|60hm5u?T ?W$`L3b%\??D_묳\sM߿N4D1xW $K8kԵl?oe;uMY;26DycdUQ4h sIZMס5\nDZr%pQ(]u2?LLLLLLZsV[mX;Oc5V+6&ungy`1@q' +׿Z @/A=:cv; vhI#(lk ;FGLD*ׅ/SF߱!s=cEseg&JwLGq2>'0 oy5\0$-3F xR* aGL00KbN )_|~i=q7bĈ(C>L:=`w%N&`&`& QBDAvPV_}u=|5FG\cT@#YQFIm%Y6o?]pc=L6 PK!+"PiVֻVϿ\#(syW_1h8{c5X#8w)lTZFQFt;=LcCd}<>9FF%I}Ƨkm00&0Z.Z5!څ &RбqZ !C'jDYyEFF[ rp㎳p]*s=:3tw?¦UVYE첋Xbro_.xq:p(d~g&`&`&`&`&PhG LLD@\PW\qb檠kSsÆ `f}gN&`!JB4N:)rTCцn'su\J)}4j qȄR'.p9x:?쳱Oj[̀&LgV6 /8n yZy߈KSRv |60 .yql28t?#Q>1Gզq7:.Z`DPct PZҝumbM' ۫|󍮺򼨇7px}ѽeYګn @ hx}nOngRm&:\)w@{g{|S4RLLZJDhW駟8𨣎Һ[chwTd>zj&4K㏵{뢋.A;01R=ףA:A__-24n3*q<|p֮AwiNcz+, ǧG}thhv>>mܕvI&`&` PSGAG/LKf18Gu'^y0Ixn a"7)E%",f\rI߿ij%@t!$<M[y8l7U}=B?$qjLЎd&`&`&`&` #`CvA&`5& /h#b :cuGGguVEBNj~^r;! [(NGyN;'n!O<#>ZnxKT85@+>IUR(adGL7j;3gyf fܛ|n{@'fNzs=WnmƼ8Sr2BO7tO>Q5?kcx ]}qAzyZkpuv20f :T7x{zfgw9Ǝ\"` v%Hn7E s؊n'DdwyS K/NX;â{=)6vi'90{pIN3J ">TS5u)/KTbO䢻P00^#HяiMz]7gPё/|Aݹ+(,'/ "~VΥ @6n 9J첋.b}.O<wQ?N:餸>sKLuxCzjt m&:W0`@\AO?8N޻i K=VoV~׃eI[mTB%V?ZzGC ./>h:WQרOW1 ?kF/s9':PhCf>_:!ãs5G -rQWEYi~sZ@IDAT&@ } 6,2YaZ8#q"xq_Dǐb^xN&`%xB \^ -Ϲ |w"Fzkv ۴wY[o&lLp:G`Tgmzu[n1VYeYg.5DLnD1x\ zjV2k~+tN8`;g%d>>>LLi$B3pց6M;"(Ib@CcGp h~oWUG1rcML^pODžgO>f_z'/x4Lt4z] k&`&`&`&`y6`&Z1BG#[1дlG};,*apC6[GpMxqĈ!H%X0-Bovf:@ gu({mԚZᆴFh}-yX!X ƀ̹5њ͵n>8I3~{V~QC`xG|`: 3IJo|3CƠ8EB߲}d&P8F0P7wTk/8T{_:-q^ߤNQ\X0Ϣ=wiNWZiLaqƩ1$ϳBǐ/c&`'qp`ͣ<| @gQ0b=l\{ (=`}h[ t7kupI#zWFgW|;a$Z8]jM1!HV/=݃MFqEž'7MK,DkQs+b_|GٮvSm y /Ppљ4LSǧ bjJǧ5LLF ¦VggML𣰄S䘌I~(d<̣B4ߺY70 ;D=}ٸꫯbnx79]xmwi&`&`&`&lFMA9H4j @ s8ꨣt)hg!G}e~'xN>hHEmY x@r/rxvl[e"A4=7tz΀\sM:Ӳs/0/qq_h}on*+z[[<K/2 cGgSKפ^~hzI'E뮻n Aro#qv-Ġ O8낍y"˔SNzԋ1u~I\`!ChqզnM]҇~??./b :⬳.t;ZyCw6\simTx4nsύ:uKD?Di 'lVJ9v*W]upĊo%/vHUl6t[g&`O wEAOA1s PVbgɉÅRc q9sFŦЄw206&JX,8M۬r<Gio 7LLLLؐkk&Po#<2:!!d<ѢQtjNoftygg欰keF]NjD;r (n5ꫯ ;pdB[7|s\ֳEкFkfߗ qt}Y-]=A\J[l\<s-ݒ!xCg%;C7xSQפ&W3TX>caĺ{=)}Ƅ|0F .IV>L`Fǂ $qW_}50{n`Z2(<]SO=W^y%2mل3Y[,:d#6 8Ҷ]F';[ Σ[oUߝHm60C0_wٝsky!BW\_Sȵ^;.Ɏ?,y@IonoIqƆH>C=.,:zvZZK:p83VdN; /5,OO Zd)+b|'gi櫴kԖQpk.$y'lqkvFy|Hx:}|] j䓥c (G-{#DdLFu%hq%mqNLZ",@!ޜ5,i1C(m&g8%  )0000hG6oǫ6 @vUhwA}L w[#*L?c=Nvx50,N/Lz/ (@x饗 +YZh$.&PO'-0炳RW[m5M0BogA6pJW^``@KmsRxHw&P<r҆nnǡc8&/B\s.b 6, "g ~;3jĵnr*5A7X6yezytO*-Ux ':WZ)X؆}x\ ԈrU@_x=] 㸚, ,@ײp 7$ԨLH; s,y' .Ls]LL@0 cF9Qi団L׽ǵK-T ҇SHtMתj+8bj'z8l7jߛ̝Y,0kW}5vN&P+Çm!k |C?d=@NK_utI?馛r^އ,-%wMQǻމw_g@~Hg5hެ=>mkӎ5d&`E P0ΐRAɥ`uzk0!dZ4F:(2ׯk cfAM6Y:k0o;C~;.(d7ȷ$"FJmqrKT^ad&`&`&`&`&zF : vz56 Y{GǒK.*Fz:瞋p k;sTs1kU1!N/2߇R{/:%;b-fgs18 Ő%V#VZI vU,g*}IC;wtٕl}5v g}/\^xz!M1{ǐ|?=QQע$>H ä-Rz4/y0h:Y^aoU+GȂY}ٮ5$t;$tZ0F'qꩧnoߦh l8x嗻%$  y晧k6L  0"?-407\K,UmN{@8d4pO0HRG7RK?$]wݥ.ڳ.̐59@i~xw _>x%23sV]GnLCɼYϞ'xs=/' wvZꪱp0=>=O{9 4@A`ȡQƸ#@u5 Plb )%)$k>\ Nvym&%է~'dJ F8}L ;(bਖG?j\em00004d]r:B1?cvHV\qE7kicԻOˋjƹ$y/0ᆓ @m ``ȳց( li+Xkmyj{M o;0 jﺚ 4N8BMajT/θ80^x x td'>zGc'@" Adp:B`([~SHk`'pYH꘶QP3|} (0}l;VGǬCޑ$o}^gw"}~H>S ǾCޑNzV>Rw @;#Hu?"F0x8gKڲpކ#7p 2TS%m5+;pUr&зxN|1n5 1<+nbtςYN&`&`&`&`&`G t FvLs ch GkF"j`D2dHy#` &hx} 4Nj"G`qGdjQ!KyW;8$S`g맞z*QbEy{1,(Cw7+"7W~ޏze)oc aÆ CC &z{i:u;K0h?:vqlؐB;{|W9,8{7%ax{wzYHE`; '>|]&l2 Wo"d k 0 [a&`&3O睎|xW?/ro c$!K$/}Ƚ)Yqp?G-]}ӈ7e1s齈?o5"wB7cQ=?:jN1 n #c^aDdT袋Fc*N#(|87|w,L|rzLVFI߻r} @sRi-+|7W:6<{x(kagv,U.tҝ̮z]v3oEv[dW]裏uU_<?vH6Dw}9DFUt700'뤗_q˷~_!GDw*掱enY,Wa^?/$ǃplg GW1GdH$}qA#ڸkԛFO+Sꫯb>ϡ/HdN#)މ8/0o/4sC|`8=8/2ID1o;C#Dލ4z|X}Qǧ}Ae %8g[}4ݮ0*Cq#9ā\)rNj>dR1$I,D#*eA`dIz BW|RYǏ_o.gSN9evr>bv60000h 7K1h(q;cCd(i a(pԉEI!TG"_~`L xkHTsyt+"QJ&1CYfE~6s툸ku& 8DvyעAGr6 {L [aW:\fuָߤN#~2:`yE`Hd_p౔k}q}$;n\]R5Ear~6daN5kw yNCLB4zWI7œ@mkrq>qJ ^~*x&}De+~6Di,Ø!k'SIy|Z30Duqyeye`Qj:h63y]R )\'v0MMY.&h qɺp;C+gzVPF )1qȺv#}Z8Й#u-<}I)BZ]ac&`&`&`&`&P-C+ g&`ET5NP" d2'P6j?d(̡x#Srd[DI 2YPr2h?/ ѯYPVN1&@9%e24Dg8(w"V>1# iᝇGg.$pPgfgZu7Wg~T8 ]>8^z;iNnk;`L裏FO=TɂVrtuJq\urw VuD.M$RP d8NDv\aY/Jyl_v8%ϳ}1AwLI}5~Ȃ.%~s4E_tD9A+or N֒68(bO=ŤO{yOtH/KWNLtq92ɤ/"0h_=>mu.6>MDO=\ @k# QcZ@!VPXI)l[#a:K?9dZoqǍ Ǥ,Da)3]CC"wȺ6бܒ=5JV_́)-KNIY98EY/O|LLLLLL ;l : 4 &_xᅮ)B4JHK/M5T1Tr~O ȾJfQjE5 uoe dIzC~AL3x̻g3Qb͂rWrPȚx#pȚHE)023w"kxw#Ȥ:ǧ寽ǧW00%8Daܳu^&zL"YgN6IԚ|9,$5Aʇ+ Qbfuv)܇ !/X86mgi?ƒ$@(M{P`)o > m.l3ɐlzʗ#زN?LQzK>:UKT? @v6W 1K}'8TLkQlB6M%F<Ydv5UbtXă!Ǥ, %~AIǕ2K\mS @ 03=-(g7sǘ!km+sX7an%-)Zy7>JKJ5apa^*wZ6@|iIEޱU ɐ^Yc{8f;b64ciWK#H/ $~xәky 8*,m >ld,r:-I Y cŬ^ cgx1b6Q&㼬Cˬso 6*uH^06Z+u @:TZm5[Үf nKFI`r]w[5zYY~ O2կ& :dz;#@g;:B..'AK3rr eD4II9m0Lr}大'orqs@o˴ovエo/*|kH͢t5KV? 9cMP$dN&ܿ¾Oi\ i8^/¾Yl_lKۅkd-^ڗ&:~e0r{!S! W>npiS_&:^\}uUIo/ އi_":NVϕz'R/䛩e߃i_ȕS_DZ,ю+މё+W'-N2N-io,o&`&`##HpCEF. Ԏ|"$KBᴝCShCb,>Y>v+ Yg[ڗULpuvV*)h.Im'/L߲dlGZn @mؐ6 T" E(ܦ5S$kLHd?0U% 2Y2$Cކb. NNbaSZrɼGXGSl' wJ6g]wK'ۜ~] UeS=eg;&TʢqjA,GJ[ Jwz d=9އY=Blng"jbwf]md2SLk"C":tk'hV6>M5~i} @#SN=T AUwV@xoV\Q:HGjnk {g @ \uU^QgFL:Njxdh0^fMziE\"}6vMza ݂NN?:&`";yG^(4\Җ[J[l!4SJu&`%p2H*ros&P[g%BҥJ3X @m㍥?_4&`&`''|忿'@ 7v瘛BpQ8@+ @7ݤ4/'q[*&`&`&`&`&ΑȰ_|!=TkrMjNCagZK\_0000000000000h]o5l:BLLL?~Pg_^?ڹ\0R^ZZ}u頃J&x_~wҵN{Hwe' .Lڏq.L n 4/'B\ddN&PHW&o *My H_#$yk뚙w2"ԌӤ> N } 4@AfIabNQ%YD":-HܓWt6n 4 70] T"#ȏ>ґLLzN`ESO{Oh睥6,oDO=g ԖQGI=$pCmun&܋ .ׅ:T:hi1{100_~ey{LZ`_~ 4ASGӟQh-c-_K/OXکenK+vs!=JLL |Zy[.x4dXSLL'iJNh]8$UVw7o"w:H>+~{zv9&P ᅲ^b|A$Aۤw&| ԇ@AR5;; @m ҀKW_HH'00000000000000%3m\ "9z#RLL^&Xa{]v 53D֫|k&PG䍶qA࣏(}tMҔS֣$i&`&Ip1ҋ/Jw-4hDm50h6MR嗥hڹ>B`qn_Zyegf B"w;@3-mU^oK+tN;Y u00000#H!uq ԊoJo#%dDadt(;00000000000006[&P/0CȰ^e8_00D=K3$t_Wſ ԒY7\:Pes ,x}]50DϤ__Zg&`&`&.ztyGU)ե_Z?~1[rvn~1Xfm;)EoG3 @pn&`&`&`&`&`G ^Z` ";rA!%C6L:\ J׵'ף5LLLLLLLLLLLLLڛJmtZ8Yq200f K']s47b 픮;Lzu :ne'頃UWYFz iN.LL \}Կtm 7o mpV۫mnM;nFW^xvy;')@nC1 4'g#lqPw'f9IޒOm7ii{W600000z׶#z_D> /dm6i3֙ @+k%yLY Wv @կ;Dw7ߔXCn:i=T:n 4N:SKLÇK//xtҕWJMԙ,j00zIIس=:۹ @=-4<ҺJ_|Qg;o<%piǡpU[ 7H~[jݶIn=LliVzJo|҃J{)0Ckϵ60000L׻L13.@{i}YfFDsj[c&`&`&`&`&`&`&`&`&`&`&`&`&`D 4+g^~Ykz 4$ w; YD{nF}fe&P{,js4\wyG'?, @ HK/w r9v0s>LLQrҷJn**Ǘ  s|vۣ{C%dN&+?O4+K<"~diFe @ 䢋JSMW֨} ?7;2H @mL?N1H}W< @]v6 8#LLzNH+qD%#9 @zj_ V&@馼Vz$ȍ7;i:[8\讻JM'#p؟+zqiDK200000fM6[s7V'W PJ= 7=[ @ 38_\l+YLLs ,t{IK8C 76hs &P/ziϹ3|/]-8,׿600矗V_]Zk#H?d{Fg 5E>[:xK6. L8ty(Nјv2z'iMnK,QK-tE/ =T>@uTNn @#Hqτ3ϴ@zK`k晥?i 4盀 4JR] t@~XcI/ܽ| 4 1;}2%nРSw[pLRm7}9 yW ,>x=&-00ߗi> JBd&`&`L෿ۖwy'X׽&H喼 goQ{g KoZ7$ <x;p?x>!HsU 48k;Ѯ 4モN8Avuj׃&j: kdOyA+] @}smIo-xrw B}v&[NjVm$7Җ[JmwFI f%:o00v%w& "}Ҳ˶k.00N$@0VS5;Dnsu&X:Tb i7߬<e!\pMc6{VK/ݝ} 'ܾ/Pj+驧9._>j&`&`&`&`&`B! GMxc+a='i~:q}A0;]p2Bd&`&`&`&`&`&`&`&`&`&`&`&`&`&pA 4;^|k @L;'yFtS -$x{G@d||iRp{J%7Pua~[o30N%0by3l4zC:m&`&CriC.U ViIV|ʕkz|q)wkMM'XXtQkJ;(i ԅ@æPGgjMOΒf]gi5D ԹwMLLLLLLLLLLLLL*wޱ#ʤ|D3{n& ԇF8y-;Ɏe;Whǖvi',-4U~j ALL$wy1;KwR=8UfV@IDATLLL iF #n&PVYzژw~''jw$xu2xi頃9x>G=r dSLLLLLL4"?.)&P4ҮJ#=7zѵ5ꫯQnǬ"'b&`&`&`&`&`&`&`&`&`&`&`&`&`&^yE09b'hv8|=uuLLL7F-o}9HW]Yi'i7^ޔsM= ?iO{ҭO?]Wk/UV9^?dХ>_c1Fq>&`&`mLG8O:pi7ސp>mp7LL2[|s^VZ҈ip M9M$P!)&!!*E\ҿA*" Q*D¯2OI4 IR$٫s]=3|us{uzS%i@Zvl\־KԿnҭޚϤ/*UF X|>,   x< i"7$ vTԩ԰_<1`6L&N2T;@@@@@@@sq :Uy@rGV7O~+u&͟/իq'snjE ,@Evښ۷E H'Ar6uAիWߞ  q+bt sIߛ?tq- @T*U&M͓ڶ%dTP{4uT Yu[߹رv~w_E#W>yP=x]*Pn__[z߉gz  @LMH/]N_v 'H[M\>L6LXѷ'3<ÇO@@@@@@@ XʕZ%!k/-\I@8(WN.X`fs.\5JYS:8ѬZ'@ǎ=O?*ʸ{aCٯ4nTԧO-^XCUB4@ ,K#Dۿ]*Q"K ěܟ8Qz]U+7/9D6];,駟+^,J/,mc=SNt=(V-ynӤ phW[t-7:    ܸꫥ3$FA QyG.Լd4r΋{&L]/{e˖u       J/*URm&1.`c4@<VMz!iJi\^=Bֺuy(N@> )"e>7DŽ"QC`| tor{K W:uSOVz5髯# %p>rkS-[ڋmx2e${l.Y0ȟFnA2'F=čwܑܛ4$ǥNqLcݺQnkO5sL]xIcCG@@@hy FC^|1ͧW2X {\.--\(n٢Et%KWjn#      %` +WN>ћZ@} @N,@~@ĝAuT;ƍ9= #]&s-!`AnMnAԸGR͚L۶mSTzu~qzDC_*_^J#9s VBS4@<1ޓfϖZ;Jg o IjW/Ok=^xAz iSi֭ݻwӶpXFz n]{XIa}Wi aCO>v(,x≱Z  ā@/箺 u&!41M¹A?@a- RZv0sE]71pw`        @BXp TJBtN$@jҲeIY @ F~I>\*ZTI:uki89@И(f[_,\XB:4aϾ8Q>}xb :r ( I-`}GHO=%,XZҿO(  =gK'KI͚I7gxN.7}X듫6s.]瞓F7w߶.;̼H8w~?d%'M, =\ɾ/o3s~@@@ yZxu҆ ~` -Q wtr)Y|%@O矺 k̘1n`㿑vf       @\ |o~q dآ  dM`・K.z/~I-[JeSJ۶e>B q^ԣGHk]|z^zE $/Hd9pƜ^zI;ᇥr咒N# 5NliB_Ej*J@{5c:쳥_MNҥ=6駥W_V67#}*oQ)I!`9å{*VƏI 5ٙiwPsAm۶8qbKa= @@@ C}F7FA -6,ƍҔ)~BWo^|F%ە        H I#` ,]/ dOdIS'itoݥO> m-H|:X(P@zAS_`&];+ycٹ(+Tu|'!$@H'KmHe4/Ε.L*V,  y&`AM>yvjN.7lcQ0bԪՎG, +WTnvlVB C;LnrX{elhݻot颛oٍ?p»@@@, K Hkl~7kVʎ乀-rb~&M_[o2~ *d;#      ĹK+y'h~ *%YRWA&ݥ  ` &oMZPKޓN9E:(SwƍSO'{B3׬ڵqDKȫO>.':t *Y܏ .FϿ=\o,H Q @ _W_`#iR//͘!t9>(d4]wIO<]rɎS[pzH\&+[ #~> 𷀠t(Wf lrcZhA^#hh   @-'Ku9#u/_:d,>Pj(kzSOiذaq@@@@@@@XLZ5IPc .!@JҽJ˗KIZIzuJ+Vs#9=9ǰ˗A5xxԴiڍ]^z^zZjiV@ظQz%^=1|lRѹs}I@bZ裥y > KY#}7 Ny50Ee7/Y ~E|r.]%#k娋.+:3]5uTn:@@@ KZw->3UYj+;!|#]yd l’ `L`2i$uq#!ݺuo .@6u}RS@@@@@8Xn]a84@3'BLQ㗂 #P裒͗3G__0@'$=wsXu̙TJXj Yg&MTb18>lRڗ] /nAvӮe۶mn.mu="o@ 1n&Nbʔ^*]Zzm>֖̐ '15@?֕ߐQ  u| ;bun_ ZҢ޽}P/C.\wbZCY/咍Yƍ%v>Xv-%3L\޻ȵ2Tu6çzꮻS\N  "P0_ImHr>{D~s#RrTr(aäK@FYO~8ݷW+Ƀ=W\իW~S@@@@@x\V~ui׫H@HD?@ Ĺ l\7E@ l>iIO?-bkb#[o7iOG)`kM 6j$g6+`]cun_ ZH i;}t;hBٗgF$b=o_}Uj\*]Zj?Fk?-n[ox >={>r嗫TRY,Lo.R5  Ę@6CE6hR~ѯHOWіt2 R!㬵[ q77e˖.KK $j9҇S@@@@@8Xzڵkܺxl^H @ |Tޓ`];I `L-a{  @ -٢M+{%?ʔ.o۸1ۖ3}ݚ>}0_q8gv)xi"i̘l1"` ?[8Q:g^JU^]~xgŽ @ ݺ56'$X%,0$@b_5}sK^~}췙揀˽7I:yD^i@$0Z'?XݻwO)1wÒ;\,?~r/imo}{?weOyZ@HݩS0Up=2׎aL?h@@A ?q/3`]wIn\ǥ,cI;KŊe~>@#F?Mx:_mڴ f4k,my.ku;Uj_{5R>";s'7RV-H˺oX.wSO/җswsZɻh̙.⬰]WEj*\m}x`6ce͚5z`*_g[NO>/^e6      mc<+VP ܂1h_C@=Gr. }-94@njb>ٵzI}n.Ӳ͛7n&-[6l-}GW]uʕ+z(67d{:ꨣCI?9_^{FߨQ#?z:j֬駟nM3fbaÆ*mͫ=ztJҙ7|SF҆ 66mTw^XWF wH\j/O}W'O,4wdv-i= H`(2}W5Fb[tϟ9[0+֐H[O<1O@@ cmU%Χvm2>{SJi4x7NcFs24Zg4Zݛe˖0cNo-x=l3H\sR_C߱5'"̝b/7&ny ۆ9 㱥Je}X VC1oVCu><M  䂀˲߃D x|o HP G o 8 x ش)}gE/RjժM t_{+p.]Ŋ pn ?̙3'CU A4eJ ի?xv *Wڸ)h׮]X .@c`7ݾ}.2p mn2bJ֞ҥKW&*|=ܓg+ %KLo \@ Νԯ_?<Lه   Ě(F '`ڝxkc?p8FxlzlG~1+Jp_;g ^ﳮܦM\xaO=y|$U @KgABA>Ap%A0vllޜ<ij:+XdI8%l~͛ ma:`ێ=%Nظq~'9SN lNQJ \֨Q##I\2mwqߑlΦKtA!nJJ ֯_|7 6 x?~\l=C7ٿ|JZC=4|i+<Ӓc {?eJxcvn裃;`k/-B@ a 7ŋ9WOk<ٍ7F֙zȑAh-xjyO>;5tv1?VY~l1F  p[YR_]c%XXxǝg Owϼ9 @@ȎerApAA1 <Ʌ l=7fs_uF;v3<3e 'L}}8m۶h"7S(p1Rs} n 6pO|ݬ}7PBʱv)lp1uI&Eـ2jӤI-Z\F͛o(   ĪK X8 HCt/e8;dȐ8(i@ ,,S#dQ YH+aOp ?EK@ $ٗ]-orW W^riӦ +UQvp܍H HKJ)Ped6g1ܱlٲa5kcn!_mA`@?+ɥ,Okݼ惂~-cA޽ۙ/Rgi..g?믛6rJ콷0Qv}aV{|H@3Fu56y|  c\е ץK#ONwxDUڲEzɘhsM*T\iJ}^ƍ@E:rʺKR+P@ IZ ݶw߅G!$RnCn3q#fz q͛7_m۶u}[YfX[+9En•܄Fu9nvevVFM^p-2gƍ;vƌҾ뮻.l BT     { |qvLs2]7+Scr< OnKnޞ$%+@vO? '2]KZ[A+69ʊːt\p"?˗/'G~>s]nb,V}p_[o؄ILX_r3ʔ)e0̋e g$J      MȘhNy:lg<6"o@o>-//`~7#G7" @|xfEҷJMAT~qhǎ;D/(%:uh2óRϫќȹӚSyᇻ7vA2g'M&붠C 7p0ivG:iFW^yVZ7 Co޼9x]k <kb/Xro-X Uw}={*ёn @ m_n#nݤ{N$63gJ]6yBΈ  Ю4oo`S  X)SKn˖Mkn_nع֘;YY nm̯b-ci#5| 5h L53umw dY/rc6voI.P.d,M7%c2>uk?Q~}U\9yz]o=]u@@Q`,uھTbe(dG$7/OG2lKJe=Í?&M>!l`+$?{op+ʕ+wݴߵjI'ѣG?zK[Hp1+o-{'|vnDsK2m4ߕ-.eӦM駟vʟ     @"㱑Z;&㱌FF@ \.AW6I@ ܐ@Sr|R> `YFEKW]%d M,Y2 wi;U8ޞ̩Js2g [>Lm۷oe˖X_X1ծ]{ǿGk~{jժs*w{~.G kqZ_}Uz xmQ-9 !=Mͭ_ڶc&\ -rJ^Y@]}gAnd~Mst!r |pUȕum([{^u8٘w-.v-L>%rw;vde˖ cX=VI~7W@@@ b*K0tGPڜ6cmPq z~M4ZP=k,YæMԹsSO=5ؒ:MPfp{7x)Q;3gmҢKt]wu36-eΨXn-J*W^yř۷kܸqXw_5-XRo#@@@@@ 6,0xl@%sÈLv-^gr Ė@rmI_hz>(֭kwѢE8ͯo*mUjƜ]';'x"LvݢE ]s5anw+mef T6mdɒO3gΔcNezp?L?;^ |*7ٿwL\R?߻u& |g>&vD ۩9s=kD,bvõ4O>)s޲Q@@4ǯɵ n)N:#Ksg6&'sJ-[`ZIkn_ f:2晓ݢuK.N8Qk8}t~_~{Z`|ȳXiƣ}sI-t[U_GǧkС[PW.0d<7@@@  ZoYk/be'lcpJį ݖ6iDg},mqK=i$% q -ۅl5kmeNJ~.FqsWwnڵS~}׭[6U,d I&.ڤC+VeH],A_w#6iъi.-M=1m^zիWط38C*Tpn    DI 2kY#wa<Á Ĥ/`LF!U *GdVc?@q#, )Z.{iA:v?)A!m~-}ꩧ$իW?`Vl^%ȶ/ht\|o/ʬYlN͙6r{lyW۶m;]UڱO?tORd eK͜ʝvæZNu DE?K/,aZbw+P{VwPga FgͥˏFƍ~U}nxOd.rwX ]K4z0~®x0   9pb?p0cƌ 0 <܄p_; L6-p 1(RHx_J^x!圩otMS6mwXUV mvML :ꨰ>71p,*81>z뭁a ǹ  6m?   ĢF,6!%po6kW\q㱌ǦpaQbT:5(Z4#xU5{+G@%reͽ ±;%ky@@H_&.T,UHKCThL> +)}\6fRiРA\VksϹf@rAw; fu һ{*X"̒53},[-422qdVnVzڵ[]˟2|+jnF@@@  xg@4v~Zk_~EK.e<4/lD _"u ,Y"ը!}tqĚٻ"nڂ>ZN{ǫF@rKoѣQ.Pbn/_7%ҖKN6#ŻݗنYu͓믿TDNy/*Zhs1sھL;)n.t5CqGIw%y4|TL:裏=sy3:g(FnyfϖN?|"*$ծ-}t9)ȭI}@@%;JI}JW];;W:|?Nkgq@@@ b6M,[Wo?iʔy/0yi1\ TF޶cҥ:Ӵe0m޶ v[~Ci!   @ ?.9F8lժU$xlRsr ~19;F 7n/ܶD>3}vxb@ ?,I=6坮' ,WTtR"Ѫ>nk*Uby: QԦԯ_0O1sBn1zj1m9)P͛7w|*T؆,Y~p|iVR%~}[Q@@X5;J,|0Nc\ ge:B-+թ#:9Mu#%Cim6sR׮?3.ZjvM}ӛisAxZ%}y`O.F߾}];~0V|+w@@!32l}gH& !;ͭDH=zYk.aty9#     dx1A ]@B`bf̈́ @ 8Q@@^q[~K}M|@˖-rJu]u4…h '{r" ܒ v]|{rD8PR# ϖ,86!dlB@8D㏥Uz+@k#}2@IDATаaCw)[n{yGۣsj]`XNη,[k[>i&rcҪU2Ԁ   @TIVGi̺$dԼT_R ڊ        &J{%)1C/@@ ֭_IH_F]{?v9Ds9Ə_ 1'`:/YϫB~,-P D_`w{AKj֔˯mji4}P޾}-~[@oD]J_|!z_ܸ8P~@5g]pri^}5PNRuk|tMsgio^^x@:xɾ=7zG@@@@@@@E࣏|@%3N<1HG@@Ŋkw]`un+WFSާf͎RѢu=4hB/ã*$w\Piٲlc<ʂkr҈Ґ!rAV}mۤ%K矗:vUJ5Fʖ{L0&_Ԡޱ?Z DKCW^fΔ֬;N]ڴ)Zgx(ׯ{g-FZ,]zi~s#/v4nԭd8@QC6iJرO?I_}%FTT0.Va5  g)-Z$-=TOZ#/\[w7/Sst!u4t藺:AFy$eK+T NG}J}iI`^   - m[3od(Z?YJ*?k(P@z7}Twq3:t.LQ7O: .@~]2EzE Rr>R R߾~ˆ ~_ Ynձ@@?….]H#]yOb0y2D$p˞X~*\$ad2v_yǯAX]ի>}O:Jzq^~ִ̮,#  @4ˬƃKIB;[9F1CzEϤK.a$Zԃ       ? xb"uH۶I씂 @f55yrOGnnj rJJg`MOj֬qzM%{ٽ{><OdO<ے/- @ 4{ԯtRRɒ>0ѳu,7,M&YG[b:wW r*@@ Aʔ k[s?'HF܅5kڵk_l{馛Lc{urwX<x)ґGJ?,dA5Qzy̗[@@@bA AڇoSZ.hCZ6(r->I}anY}ڷg$-/!      ğ%,P@"d];ZGHpoe@@ jW_ ~Ok׮W.#\ 27;JŋgЈ+` yN ٽ[-Yk Yq*A@,~JjRҙgJ<"Ԧ eiAiү{@@/p>KjI_.^8"+@>?giwJL7Z U,w3j;ZO&N~IzE…vJ*B@@@  ZPƍ}A[4|x.*X`zG|{{ ʁ    # ~BL*`@ l }Ξ31;ok/[ ȹsnH $@Ϟȑҗ_&Dl=>ƌu<>b >@dؼyzj -m*l)jTYgIn9%,̙[/-] Y\ ZvU[oI=zBV=!q+`Il5ԁD-vmcA@(  '`F[;> !_8s ̛7OԆ +iR&R>vA ݵlj[AM8"   q@Ǐ5{O:X'Nٗ}{-utu-Υ    %B @%|ysZkGA-hR'` 1LOykջ~ޞGC@U`֬4cF0HRv=cQN,)?Kx~Zk|cչ&siV.+RzN΀Ģǂ?mfLVʗ/  @ XA~]Z;k--?6.vI?q ]񼖻UߵԦTnw%܆,X>}Zƍ}@#$֑֭ƌsH\xlԈDA;k   @ dž[&ߖnH4m `lʕҭ2mD@@@@K`}…3oAv  @~|Tv~s"7@3,{5ңJ)]}TTԷWZڐ)@W\!]y ;v̨l.=x>A 3>H-[$ 8ld`:u>HE )"u$M(h9H*vOa_xk_I6j (;}&xE@@@@{K/,uFFZf   k}' cО Xӂnfѭ@@h+'];~>ȑmz#U"qd3 PG&MjԐ-$b!No͚I ݣ;χ1i頃ޗ @< X?^;㎓WUKZi,騣wkFf:HeKxj~@@@Op5ٷlYwoɲ~m'k_ݛ7K>3(D,/=     "`[Oڸ1٢֭ڜ[@@ ,-԰UޯWA^tQ~! @"V}EKo%=t~QĶ?%of9?P,j߾}6X/y[e-ѣwߕڷ/xīp .m-k6W-s" $;K/׈,u(Ze II<޽I[:[Ij;#yDSG+$S*"ܳr87ɓgC ˒Z     P p%^;j-6I $@Gn_-[$L4Tl+%&Q@@@@X61Q@bS&*mݚvL6L>"9bN9]=Zvzԩ_4sfգy|ꕡ] DO/!-؞W/$B蝋x !==5kJeW|WK6hΏpLiAJ۶{^J@ kEF>Y0S  gիͥ?SvíxpA #=+XP|"YH"|d (?<59~9(Ŋ%͚1NE@@@ :],$St]ҽ&D!CE;rH@@@@h?ԁ䮀_?sX2l' /*u"<#-+ <}מz+ R.>qMJ#Ѯ(A@ c_~?ۢc, Ju@½{*`--9-O췟./ma=/wG{ƎӞzJq}BbQ}eˤ>Xი-*U=ZH#&@@Xo)#-XAZ@H ܱXjYo]}O})H,YFӥJW >;͞WblOǂ?=l΅yOz   } Hx~ҝwJ~B)y4>\~iZ?v=?G@@@`!b]Oz)`<-кu;&w^Կ I]$-J(YR]\}zR>%jM#Ѯ(A@ ,},iג%i<< g]3{bvbBZR^g,#Rg+VƍVM}@ش)퀏|_컻Jj|em9F%@@%`AA*TnUA{hzR[Df= goʔlI Hs($uTr~K}O^\ZTj*{mϙ6jこ&I6۰آs@@@H@6Sd!,ۋ P/`&%\)]yT|@@@@ XȟW#Y~?_:[DW6IB?N8!z}>g撔(ubhxUh #>-N;W*XP: I*Zxg߶R:%KZmvC$'H{lAr[}G/ϪU-ZT\|`}u@@ _JIÆIŋKW]%]{tQv \}⋙>ot*=h J'>8k^FIQʬl>ZGgݲE`[K]dV#   nRlK =p'{`_؏-9A jp>@@@@@ ڵ=2@{cZ/`srlҼy?#@@xREviLi:iPC9/F:u=QqL{IŊI1u@_zK|K$GZłCX!rKZ +ǤSOJի'Y9s,0˘1~ ɦM}5{/V%dt  dGbVViH裥FN7ow:uc@ENS҆ o<`Ɵ"֕{.@oI I6ti+4y x`dz@@@\DA 򡇤ŋW<?Rg>CNŊn΀     @ZґGp W\on! &0t/ڈ6r"pi>8DNX@@ J _}5Kj/Hk='^싋I6YyqB}IQ܏   ď@~IVfZ$Q[XKZd ( @n ~17u$/=Xb3Qz}ί{I'TL닥x|ՠ- ć-Z0A8Q>]E'$5i,Ȩ "uEŊetDgcK66m$ oe"ni )bH4ӯHZfs [}ds! / Ԯ-ҡ+iNN$@$@$@$@$@$@$Q߽[N0|yRPD/4k&}&#EO ]3 :c!       h#@Gh @4PnUdz:% ``e$Μ ڶyF}ٳڵKy{NjB$@$@GYٳ]!Mٷ8ys&MDϽYbD{Ԯ]Ɖ-~dl|~}3|Ŋ"+WFϝs]={\}Zyuk׵w?IblĽn"rGڴ"ŋ_ 2F31 ,^,R˷K:99#",g`& $l(}$3!ūW]GH$"ժj!M=wA {}c42|x9r$[ҥ[`SֱvTR/[7.]:Zp؉ݗ3fL2W?kH&+c?)r"[qv\/ @@]DowmۮcӮ sr-У=cѢ wgF$@$@$@$*[̰a"'۶uD _XBGvMaOG&M*-tҹ^}G}"4v}miA>ؗgk.d>}5vIǎUK:.HFhlNFiHVW*HtaHHHHHHH 6ɓU ˎ;dҥJL6n([lm ;Ed˖M1GZc*XGm#GRk < R*"jeتV/_^;~T.$B4L"k׺ j $D,$@$@$@$@$@$@$@$+ ;V}X1I$ BԩSrRagĺ'3g;ܚmn)=Ȣ]hĎ-Q^S_uBL bMObNlsNil[ 4K:GeɒE׬YƯmx'XBB$~k@$@H}lODUUuӦZᄫ1 @@ŋEN8Q~YUlB( eKk+lDP?`F&muc {2lv=N]i?ER ; {q þFc@fs%g.SP}QYqҠ& .SuVvaٳ'XϩE"$ @d8zTDq|u_.Q:>tȘ/GI$@$@$@$@N9Fr`+r{cGQDV~"]nlA$¦dfi>Bo0m*Uz4b&bbD]1ط=0/"Fv]Y?y95wV)uHܵFi {*BӘX0A\v$)U|ҥkIHHHHHHC jAwm'TKVU `Ĺ[\r*FI˛,$@!ߋVH (YN6ȝ/sɟ_O;ӦZᄫ1 @lMQ SEr^;8 Տ9Çˑ#G먰U [5w/@f sc6Kl36hmn6 wVT FٷOQ.vxڴ|*0Um T7>ldN{؁a-zvSsέ'ՏrB$*މ i^邯…]MGڇHHHHHa֭1Bd]AMPHbGKABy>ѮI4D}ғ\W=n >%N]JrbCB<5HuvmdFhFhΙXML`kZ\*B7Y@#P' 'P       *$ "gϖcʴiӴh){|ҨQWTVM9V iT8nR*]bw֬Yyf`1kN^-yl-;@0B`,$@$@$@$@$@$@$@$Ws&@&h&D{!]5KYh/E# .hBh,#1 uO0:Np`RP!]M7ݤ \lk׵`&縎ó3E^Tf*XK$@$@$@$@$y\ѕ}VgD>hW "4g">Q4D,MX4iX۵X=aA|y5eOU*.U[[S 74iI7e: CgQ"tԱ:HHHHHH"@TDšC->"b&MJ*:ۈŞ={t@ɓ'c7n,=m֧D^}5FHb!       #@G0 66]D Z =XJ™3&xp5њ<8dgw_ G^@ϟ_;cji@BGcs$R~+䓮tO)Н]df[+IHH  ,ҫ(;UrmSP ޥ@ڃfɒED @Sa 4 cDe☤qwѰ]*M%_+ɦ 'B)RDע*]%xz@,$mݪD=أY_DAGTݵ/՟Om8     w*ƢN8f+J"mڈn-?~Fp>îO?1Dz@8 tZEY4K}nˢE  @@*1tPywȑ#r?.~{_;8V~1?@u&z|@cbl\̙=Ǒ @t#t\G΂RBRgqͲegGSϞ=G6bC;ˌ AMFb)8%W: -!* lp6/k%¥JOq\@Hb/ vOu}.3E7utd׉$  H'pyYn pU9GTZv|Qi^{L gVr뭅T0R;f`H1~܇;vu۶my0T} ޑ)S&VPAʖ-W1znO %apGKzq-Pqpu@G}T1St]s<$@$@$@$@$@$T˗L誫VJ!Ҭ+0d.mnݪ ]"ʕ+[$FG$0D,6s9 DݵEBb&jXB      F!{۷ٽ{wyWtfh0v`={JŊU!3L gl؛#((1k '       vt+5+ϯ 6rӦM:#ĕiYŒH,!L.ݵF$ Nw 6eXUt, \dIL|u86pR9Lrq9>12ۮkcGh #y"  Hcdٲe\RVHHTEӧW[F8S >{Z+ NZpVXQ*U$UV5gΜ{xu@H0צط*W[@h>b%˵F$@$@$@$@$@$ ʈٙsA՝֓Ç6DS-lB$qeعsgIhb*fUYa{e!      H% .\(='*@DS/߫.TDeT f? @#]s8 f`Wu͚5^xAyAu-%_pL2W\3$:2qÁdGV8#=MV-[V*T_)!N7^͈G \#/"mۊ 0Al׶s}k}"p#\/ DCEŋeҥ>V*W/_^Pat\X?x+V={hVVMj֬)j!t+wȕ+";/& x5&s@GE/nrwz׎ tKCu9=|)?JJ6=m='"$,$@'-"lQ)͛&D^QT*"bLfkIHHHHHOс p;H~J*W_e18E8y_T֘RN>3}3s͑ БC 8V\hH 7jV&%VrtEV_!],$@#w-E]Vm&pFVn{Uꊿ_:rWs'x3D$O<#}X#F<ɓ"3p#' D.'Nȼy?6˗/5jԐիk{@29Q^g7G6xd?U:APJ^z~={v G,cx4AstxD=];k$@$@$@$@$@$.] DMD~nP/C4DL&XHCY4IZE}_xQҥK'ChjŊd      p<;wB{O}Ym@sPق;u$p9r4h C`$@$@$@$@$@$@$@$11%$vU[h !.\X4 AC^.YH"mlذA }Zʨk֬)(P r&ǑF,^Kǁ@XԪ%7a鞝Sé* ڤ"l`. uǙ3g j M`[J^G۳ " 8}aw,X 6`${&!3d7+WD!K3sfQo]?ȍ7^;k$@$@$@$@$@$${ϬHdΝ,YV6lٲ 礋DZ@2&Hb _!<"X"+Y'4O!     GDƅMjѣ_f :uJw.&L/Rz3IHHHHHHH 8lAYx/ `pիWd͙3g d$@$`Yl߾].]*K,uZh]HWԯ__/K*pHN# r$:*d&2l䍡=7k';#2GM$@$@$k.2esΕ+*rZjդQF֮]['6 6 Dg ͙3GW؁ӤI# 6-[ ;p(ʞ= ApҾnx䈨$lƘ58&VMGHHHHH"HQ7o'boU{aDLH1W%8z@_kHb"C2Iy       8.$2hB5eҤIlb~o!޽{9U       ģH T֮]+3f̐3gj |Rn]S^f/Pf?${ղ`?^ݻW (&Mȝw)7]WTo^:t %KLQ'"WR~?9 )=#c~J%;H޼*[3f4gqI$@$@$@$@$@M`ǎ2k,MDBcǎI =MDz*<4 lTHf "75kzEh@6uԶJ$@$@$@$@$@$@%@@yOxԨQ>}6ZLDtՔop| #8#+;}XDZW^;mZWR^=tb$4 Ґ, @pD HܪW͛7Od(7W^yE>S8J*{&       #.VX!"˴{vB$@"pLyN8Q!I .K(!(XDi}\!4 gB$@$@&`YիuңG; `!pΞ=[mPکߪ:\9|Ȝ9`/{"{އΉ=깚 ;J%#+#LӦfi=f.'p 2DkZωHPۃ @,_\Ə۶m|=ҲeKI&Mzd$@$@$@$@$@$@@ z-%K J,]ec$@$@$@$@$@$@$@Jz8H! Ȯgɚ5kך6m*Sip$@QDĉ2j(6l~ԦMyZjQ4KN%{14 D/RQ})^HHH <l"?,\P{9y%[l {%H6SNɀO>ʕH_Ș1yQo6{vyv4[<HHHHHEҥK_ˇ~(RҶV61P @02L4Iv:p-= C ?}-"O?t0K,)/v>ydϗ$        =SJrв}vy饗( IgΜ~A:v(!m?̒8}W_}%-ZďLޞ{jAt˖-wM^#~ ;<#t/_^*{쑪UJӦMm۶k訰'  7s&!&Ӌ̞HHH"u8AUp Բ,1cB_ϑP?G؏9"|.`N)5h).G%ֽ%~'gϊ {R"6̛'Ϣ;/H"%JHJ<HHHHHH Ǝg >@m8m"-ZT]1礴g|ؚ^}UX3+8NZڴi#sΕEɡCT2, Y,$@$@$@$@$@$@$@XAڵK&L c$Qcbh!T{gUfӫwclHHHHHHHHH F :uJv*wK6n(>I&Fnځ#'ӧOŋeby;waÆɦMi,X!+N6MΟ?>|X,X@`NN_~~f\t-3d *TiA$@$._%g Ԝb2 $AB,$@$@$@$.]~X^{5eܸq?/v@ Zݻwk- m=1sM_'9w^Xf\Rk nKN(MVnR<ɓTK*^ǎrHHHHHH_:!t]VXir{!(e,]X(Tfb]O19s='܂?:ۡ +UΚ5K!3 x!C9r̙S& ;f7 蠳fͪ ?C@ec$@$@$@$@$@$@$@$@$@K΢jՒ-[ufݴi.δniuEg7y[zmڈ}5jԐGy$hSRߓ=$k֬}F!O=%2e"(ٿ(_{uvȱc7MHHHHHM^zҾ}{-w1ߛn)?,9':pudK.cO2cN8!lٲItt]xJq 17\_|Q٭?/_~)s @ [FdwXt<#E4~W`駟_|!k׮CJBȑ#gʕ+%K,,wAo0a7Ng(^jJ6m ￯BW`D+͛7Kq3g1|pI>TPAeDn6Կ߿_zꥷqdYNc֭S%        q<-ZT9ӦM4V ,?̜9S) }6\LЗwp,ð#7|#"܃>$F{%K)"~l۶M6lюpB矵 c@`PT۸ w}'3f~mɛ7yaȔn3`u̘1=zܹS'z嗃… Zh Iî=rI-=w Oi׮q ڌ%J$+Q 2DwHHR@ 4HA<@r" ҽDd9=   GزeۏKbvS3V_goaA3cA2*j7lOf͚i O[c& gaÆS>$o>=QFi|~\r%p6?{ֽeӕۄv޵xcbvUu*U]K/$.]֭q@?;eԩSeĈO?{?a7CJ*/\C'4H:u$=*UJ[DIu}MW`H/Ru?:i 6#x>ӖJڣTX1TFq9SLچyzEZ9J`f+WNۄ,RoSBٳu،=ّqMЏrz',R(yU@6nkl?6%Vlʖ-k@ f?k͚56}ajzTr%P~1|VF,8k%صpmDYqY vmZk֟[lq`<zJtW_} i)^}Z ڰa~'V|>cg%"?+Jly睖'A`xaF9P//# h%~nY3Z֐!:ؙ{OuNy.&  xWoّv_vSPqeF*q%Kkʔ)ֹs笷zK2⭟t+V4{]XzuݧJ,*ȁm|e+gΜmӰrXrhM6?s?K_vtӭj ƌ矺k_cLί`Z*n_mA^ׯo 0R , RA!qhJb'w|T" lw @ǏG̠U/ó믿L% ylR1&k8P%mݻWeXв͚5Kk їA1*!_:?m7fb@}NJ sM.c_le1'Om\"n2zH;K$@$@$@$@$@$\rJmlڼys@>R^K/۴icu-EϯRYa$6̛7ςs)ժUB$boQ4pLɒ%GcC0KBt Cdѕ1$}I$@$@$@$@$@$@$@@@_'.XD7T|yM ^ L[n#3gt;p E&P|^VG ڇs-[3%f#wqǟNJ-N͈!8f˖|h7!\먈2&H^"'_裏wHbeʜ9s 7Qx 8MRL H$2eĉm{^LSL $X8~4 ЪPB>G\ǩSڛOz\tfe˖$͛Gߋs998OC?'7CL>f~[ɓ'XYK$@$@%d'vЎ 8 =zTaػaՏ ,{6mZB{ [efN dYn۴%l@g?7ul&]wݥcРAz?cLo=:tHO ܹs~& ݻ~7ۜ}| D]&DȧMɠI9W\ق;59$nҤ֚FGvӓ0Ps7OMʛnV,_3ݻN>tPשHHHHHHG 2EUQ#=ERJ%x (JRWA"D .2H_-p&*}RRlTF2du։:#J4#?(GAA[((gMQNzתUޞ9K          e=nU"Co/AQΥ>2e`!K馛Xb(STfn5ju8UVRJQPm 8c>{[f[0*YQ|ʕٳgk;},Y{}V*To:eڵ6F^Ș1cD%\STk}aGnʢn_ ZE@*~?+{oax*~^2aQhQR`ASc^5ҦM+> ˇ~(۶mRHHHzfv>n!FI:fڶk$@$@$@$@ $f7Q4ξlð-:uJ6l)l˗M6ews|>V֭+JƤmE,*S`Wܾ/]{CÎu}vݻJ%tE +W_akV ~n~B%hUϞ=5XHHHHHHH ?cz'|RTk$k zHTr`Q0S?SG現 }웱L06 ؍2ʀ^z9sf;~b`))]Ҷx> @ls~}2pD-ɓz/lG{i@/_>TR2qۑӥKymif͚]w7N ҆4i\ VOc~֋/7?9PδרQC4>29~}N:#G; |pQ0&رc:?Ybc=f 2D'1b<ɺ}E`h"q @Pƍݷ3 ;#~&   @狻2t#HZOv=z8 ;>hlcl)y>:UVI˖-͐\L?IhQ s.k泧eR50}_$j޼ 19m4A;=+ozƝM6I֬YoذA/zj.7}| D'NDΠ0RgzzwӣG =`;ѣn595\lNplZl$6nTHT쯾_{I{9.dΆ19~N0lLۦHYN5kj'N:|]tf9v;O?=!{r"ymymipJmݻW </@ɛ7}sֳdɢrέj/1!; D/^v:ӧe@]vXـ{飏>7x#>Vy &pꔨ  k y3 #<i/۰.X O''aGΝuBvo4f|% ]%84P.k:Ǧm2cDG?_/=Nʍ7(ժUw{ݺ#lpw/;vpϸ ,$@$@$@$@$@$@Cz9$x4iڰa6v'F[?uFoKvdB9Wer ϛ]~ cl5/s`ؘ͛'mۚ.#j/ԩSo߾5nHHHHHH 4J!4wK%$s2n8YbE|wpe݂ 0tQV^-*U]?8 k@:Gzٳg&l2uI".|W3y8 $$?Ν;ՈO켞F(-ZHS޶adF@: %^(pꄝvlؤQ`Umܾ~O-7馛|Hw(GP2dߟ`g>~D'QӘvڂ[xGqy42^~ikLV$o۶M7o.st=± ~"'VÆA͒@PS*@Q61NHHH b+D(DRG6\B=3g&:FO? NN8y#́_~Fk.c&$.{y]'kp^HСCҦMѣ$/(?x c+{Xp^Z .#<*3a$@$@$@$@$@${2A?G; I0^zI5k&YfSN~q:$Na0=iit~?6|u9طӗ/lxB;cl5/s=C0lLH d$O5k '| 7      0ݔ)S+Ady}:WFׯ/o~RX1/Rv: &/_3ϲf4ӦM8BcWʕ%j ()D2U*GFdϞ=&7;I3g9sdOpl} %1~r$ƍW_Yױ?vXM>}:p@Ax}l IU\  F= -O /_>ҥ\|Y~a9K$BIܓi OĠ`wߥ5N$@$ߧz.9sF 9/,UEOM llHHHB୷ޒ  eӦMI95{Y3/0l}#Y [nÇŋܹsGiݳ/-ubBp>[}\p'wީASJp,lhHl_6ws}$Zo!UTci;33u8ƞ@Yd ;:B$@$@$@$@$@$yJ.B֪Ua'3vRdb;_;z>>}H&Mz={ꀚؚL1&AGfbzn  =7Ķu|ٽbK.93}k^<>ic½{`0`lRh|I#     `sNK P,e4Hu}YiӦKKeK,~o)NIR"KGyR#k1BTKeɵGW`Awޱ>3Ye}+a=ik:|nŋ8RNdE,ea%%\        bS$H N,lΝR٨(YKY/PTfkX N-%k *pձcG}N Rk8ZʉRNr*?+p/* [;w x}k/xwܲh">?0wo߾m.$8p@s7|>ى ۗ8B ҥ-5; ~&o @ صkWVAxvnK6W\%tMUTѺb|99dTK%0TosQA<ڟшr·ʗ/o7O M9 )z{O9] UczlذAoQCE9 གྷ]C8R֮]+*g%jYȱ72_~‡~(WÇ7G:{dFxpU0F-N,Q( &wH"3g4n(fͥ0e9tH&4}6HHHy(_7o.*ϟy048_۰Jȣ횰\ד~;8?.ٳg w.޽{zf+ۅԓ 4PeM=cDv;={V;͟]o۶Ms ؛]n駟J>y'=$O$@$@$@$@$@$@cW^wCs6=8)z_K˛=&):?mZM:C3@մm/^c؟yyƤhm2e!vهxo̘1C۲zt?1$@$@$@$@$@$@&@pTd<3ΦmݺU*V(}NC#       #H0$gBy[T6k'9Ab1 Uqί7k5k泩^xAy`1_}uTo~ 8w\d_~?v` 1qDe?_oʚ5k>m\ԩul+{1V4II#0l`"ʏ@%Lڹ<ڙ}bC<`h D/?Am 3 lٲEqYpڵk *U*r& Mk5UTڶ)D'm# t=pWߑfËk&MI/^,]t,TK$@$@$@$@$@$@$ 7[oU^{5][h!%K "8[?#Z'L         4iҨ8{2zhho߾Һuk-^jڴc3q;vLcٷo_Af˖ͯd= |V c_+OwU&?V2dmw=-@絣w^xQ.| @0yg=j(۴i#ͻncHHbY3dyr d"Rԩ2y$@$@$@'@q3g)ңGA 8ahu%v0߯A}7iVZ9v @ KN~i?\MDhV뮻$mڴ)([ė/=pWߑfËkzj>|NVkcƌ >}$@$@$@$@$@$@KKpYZW,PMW^O?Tg-R@       f7 2vHyd!4|pႠK\\#דAٳ)SdS 6m-B Iʕ+;oc c/ Fa#vH"%RZ؆Lꥹ[EJ3GaC/:h] HHBD`…_hG]$Lԩߖ-[6D#`7$@֭[y9R8?>SRvmCHHHHHH F 4Ď=Z'VKD-VX ߴ {:O=ӧOJz69sn0HHHHHH j 8&$/]T4h M4юt~ 멘 0HW͒@jѢEZpBYbܠ^"׬YS%@l÷vN:r'ɑ 8Aغutf b:çIhNݻ_~3D=       ,t䏬˗/_%/LU^]*UHΜ9c gK1D,پ}ΚdA]| v"E^z֯__J*Cd8PPf?$OTɑCdQ#c}@~I"V Ve$@$@$v%SLuܹrV4jHWȘ1cN&̙ҥK%M4ҰaCiٲ @ @uh2g,#"%J?"p.Gj}"˦߿_2e$jՒo]WD       G>,;wƶ{O}٘7-^X:u$.\#GJ Bu       8t䏸K0Wj%lnܸQnJ*Iʕ$RX©G(ذa JV\3gc pZ΢ %j"tv$HZ+ {XnC>tѓ򭓂Ez'}'7ɡsHHH v?^*@IDAT 9s^ZRNu֕:uh[VAb!'xdz`??*@|iҤp}(> ={?Ϯ&Qm,Ys+x-[ aK MjYFkSnq޽*U*[Trڶer7@ݳ      H2L;H~tJ/<?ĉkf'OO$@$@$@$@$@$@$@%@Ge$lgΜe˖ *ė6m+Whe2e [oUWHH |q͂`ׯkjAmK+V #*pg!PPg$l*2n+G%J,)t#|: DǏwHp | ]PW+]Hl+Wh>C==͒%KtE ȴiTL͑#Gy\!      ' ZDhMErߠ^-ZT6:ҥKk}S֬Y0|H_B"T[Nŋ.]:-R+b bLȐHHHHHHEс )R@;j.]oV?cԩSΗ#       @PZ,;V}@ʶHI, DE^C^ 27߬EX*UJJ,t cFv-[lљ8ʝ;wD_p`ٲe|RB]!`@p8pE>9cHCᘔVOi\dBrfzHHu"ŋ R {׮]z !X *eLMw@1`UV{c_"EHjդf͚b=}3$     J!g`M&ܹszA!hO,^.F%NLZEآn_M۷H _X1bj4i<vO$@$@$@$@$@$@ DD HLò;81cp IEe(QdȔS)Iӭ[ʭ4RJ$2f QRRJpRf[c;<^ey{{g=9 &hĈVe@H 9~x=ڻw GyD H@@@@WD(_ZC/UktilƗ޲lٲȿ#FIHZСCںukl&-meWmիWwgF#ʤ9"^ ?#L Vg7>=Sv '_Svnf⤇ @ ĸ!W^uֹ󬓲ԳyժU;o9r?% ZԞĝ=0֮][W\q;.\8hD@@@Hnx/@6hOܵk [t6^E[w͵} 8p;{EuDަAX-UZ"oV@@@@547n$q߾}Сk;$d6"믿*-zȭ Bq@@@@ @N*M&u ,\:n߾mti/v 9rͣ5,Q, ʕs]tlƘK@: XߜW6H|,mñ+VmlTmT۠P-Z48V5~/;F~8 Sr;2.>޹@G&\)C@w4f`ٲes뤭:1lupVW ;w$Ϲvn۶}VbI칉E{bK97-kժ5jpr!   G Oɓ6A')S&}mgLC*khmu-xU:RN    (r 7Fo:u^yZJ5kTϞ=eh޼yz`d5p@@ʛH>@@@@ (= !S޽{Nқ[#CcZ0H YT),Yҝmųc_%٣ݻwF?XDMOzAP-l\bX4 8Oʉ>He89Hcu2ݻm*.<$'U(q  d~hӦMK z*UߩǻX^5.,p@3*\7SׁޞsxVOlGm*P@lzDUV>8s   6˞=тBZD]֭}˄@ 3Ҧ[E͢?Z7YZޠ^{Π8yg   @l Hw믿ָq4k,߿_u7߬f͚.ub *>#7… ToK&TӻE^@@@@ TF xqZ{'Nʹu-T;׳mE9o.DDə3g /`Is})::mLiKMu, `js5_Hb$۔짜3MO}%A@@{P3fDifUh߾/ }6(7˗|:?`/!$`A!칄׉[zx>ٛü?N*URŊeCY"   @ljm}o>lohYv'Z[DnKB?~\kOɓ%vvymUzu6!    @YiӦinumҤ7@dڵ3u4ӧO~7ZrF͝;Zr-nJ'    @ Б?,$,`#|ilcuov\@}ve|k38 /Td˸uepߟ@eoѮ7k-6Fvx v!pԖ޺FH?C s>DN_Ȝ4I%s\oڶH\A@ qr?:͡dzuE eK9ml۷,X `u._Z'mozj[s (pغ`Pouöu7ߔV\98?}홁?^GzN҂?0!   @ XD7'm>ю[d9rpۜY3n v'Zc ^cǎ>6k-ް6u$dqvohkvc+k@@@/V {Zd|񫯾r+e˦jժf͚\.bwF/V`Z),أ5ıS7o7nܨk׺{s̩K/T7VӦMՠARj    @rȟ\)Cw(։ꖽkTgml 񬁞E7Y]5-d2%4NNMy|y mfiE:Zflk -f{lyԩxl^cYkH`mKӵנ:`3"vlD U^L'!v/͝+9T'J /oX@2Z iŊfN}/X~ʥ>ViA,(^`/j `v|ꉽm"o"o_]m:g֖;&ߵbؖ{¶ֽz~oiuq'sܹq)x pP]5ڤe/t۷[zo ; @@@O3JonOܶ^E[ e|WIO^'>7֖íYR6ڿ)AYŸqmz8oO UvFі2!   @u ȸ[nuFJFWv:ql?4)̰QP¿"*̿*1Uy9mT2eʸ%T4ĹLu%\hq^#   (@G  65 u$y~5m &p3y /m樨(l  ԶY=zb58Z}uQc|'w|k5TokkZL x~/= 35}6rC2BPM5Nix{䝓Gqd8! 3.#9U}A-'?. ^}zj{NNݫ/{m{˄֭&cC{Y=ϛ܂>&ԁݱp{A1m^M[Z{oimT4u׋/Jo)\G6LX?U@@@@^F1VO$֦ XDmb׉O} O{JmSڋE`Idu_^L/(6op>kh۽(/cB@@@@VsNw.y yli }ՖVRin#mi#VPm_ZlC@@@<:g5)!@h XŸI[KV7{K q0>cB!ƒKܷ~4x&@v7nMo2ݿ?u1c@ <+B %۷KIKML %>n5o.'4kV`P ɰ@KƤ˳VNnq)ȟ#:[]={K[εmVl^su/'3U `^2'{@AKl>-@q;vHmJÇK\^w&A@@@2^q(zC^['66Nֽ6-$+Eu/P/zzmyuNVwW{)qL    QY쳥 e˺٭!     p: RNԩS!;@"@`BɉkRD$С4l`@o" *w/a]TIj+5҉3יPBV>Wiʔ07~}-svS`B@@@Z'͛ם:d@@@@M        @@,^ʙ3 ɓ(!Юt4~DB" @ >-}Ò+YR4G~6o^|QjB ghX Q =VԫT<G@@@@@@@`Af00G@@@@@@@t \9#7@ѢR&ҴiU.J 'M$u&o}R;W:p@Ci0JHWKSJ[H;KFIeHw!sگ@@@@@@@@2_@oN        @O?Z `&H 5 H!  OKVItURR߾RtI6H[J*t'OX2P ([V=ZڱCzqoCjVZ<2H@@@@@@@@-@ dSq        ^]L KNIsfl:\@Ho)S=}-oJkK3gJ11GI#Uީs=ȗO6LڼY>]/&MNH|"       ^@       d…R˖ I! I7 M@BBiiH~}hQW/i{ᅲoƎڵ b0fϤUUnʗF s        C#        R͛VRz&#@j:w>P:t(W<@@ c~]>8T)+1cjդiӤi253&\[W2EڲECz)Li駟+        ^L/I       A/0wT԰ag "62{v  @ |4jtR"R׮NiZߤ7ߔ:t႒O>))žভ[KKF, G@@@@@@@N@A!@@@@@@@(y-J"@\ /7N  @ >,͚%'.-ծ-T4yog҃e|HiPi&%p|        /@ ]؊       a&pRaV0@t"-Y"%  ? =ԸTԱa4h7oK:I |q) duz m+-_k֔ʕF7zxD@@@@@@@2P@˥@@@@@@@@ x,dZ<"E)M)%  )͝ XdzJ"_h/wAf援'MnnUz9 (c|        !@ x)%       /`a5x t}+{wޑuS@JFvF-jԐZ,I%9 @@@@@@@@ L!#       @ 8!-Z$izy'@_H[K( d_I| ~TTR"ҸqVI<"]uVҙV X!C$ :gtԬt%[oIǎh6        4q 7,"       @/ZNu8R/дT4yr  Y?,ԼTʕRnҊRt4eԳwFdPZO KKk/ʖi߾K+!       ɝ       a/0{TT|"QQRN 7! GJIÆI+KUHRҫJvIWK#GJKٲAa&P4amԿKI?f8        @@|F@@@@@@@8sF3Gj."H\{wiiݺďc/ D֭+H7$*$h!-[&r|4mtmRBI@ɒ;vH?/X!լ)xᇒ̈́        zAގ3@@@@@@@@ FڹSj>2Ksz w R<@HP1飏bE9_v[i(k/ܹ}?@:uJjr8LI        a(@ 0|S)       =[*_^]6@ pݻK'KO. +}4vԶTԴxԺt#͚%'.y#5H@,R˖@+;ʖFMu8 @@@@@@@@'@ H@@@@@@@kߗڵ "R8BJW/i._8E@d 8!}t}R͚Rr=N=ZWiz駥ƍٓ}iD UK?y i>} @@@@@@@@ oYD@@@@@@@ l$# SYd@Rz҄ s} 7i8曥…&Myfͤ%K9s$ Wl`H ŋK>*m.WҥJMJ HgΤoz\ @@@@@@@'AӻIY@@@@@@@@ߗ6n]P!8L.@ dnQC_P ʔoi )!       .@ `       J`.髯vRu:'!@ ,(n-Mpi@Hn _+J }TڴIgͥ\Ҝ$@0QC7Nھ]:Tz |ywoiݺ0)$@@@@@@@@ @ 4q*       YR޼RfGr@$ XO?mdʎ @ 'mޢB~PWKI11ҢEҝwJ+_@Ѣ҈cHkH]&5i"͟/9\%7        @f 2I@@@@@@@2U`LU+)gLM@ ͛KM1! @NJz+ť~uQܝҖ-+~_2mާR\R6?!_[6r       F@Q@@@@@}iر馛4zɗedܹ*_өʄ *DgI:dj$)w~[:s&'r( Y &F^֭3!       @ 2xr      |zGܽUVՐ!C82 8p``3B DRR<Xx@ Ԭ)խ+fe" "JӦ>,)թ#T4}V7.S՝7հaC+W.Җ.]ZJJ8@ r>}nTL˩@KSo9oHKW\!5j$͙#'a:%XP믿^Nr&e˦Y?fHrNE@@@@@@@ x$     )[n-ֱ1Xek a+`o,Ma[D @X #͜):VŢ0 D`:i(kEݥ-[$gپ~ƍnYʟl8ԋ+2enӞ={t7= *%rPAxbm۶-ir/,OȑCy|%g<(tH' _r>љ3gb g p>>cs        @T0e      +WԤIqFyչsg_~Qƍٳgk׮]ٳ駟͝;{1UTIC qرʂA=~ǎNgqZjͫriѱyܷo^xc:k>ko $_`\)K馛G"@v[xi僔@EÇ%K mɩ/JS$yԴKdA."]p111gL8QrRZsϩENy 2Y>px =㱹Xz||['۲eK;V?ԫC{+hDy:{~X0@:TNf/g't۷َĞM$Vг+B6lpӬ]nVym 6=ܣe˖34a7P|>1cF@ZI=Hى        @d͐rQ@@@@@@ cƌQFd- cbԥKuɽN?֭[Wzr,zI9w;d3Z ^т2v xUWvmݺ$ou 4p[G y]wСC6_]v7oL\|X^{fhРAD۷Μ9ĞM$$        @ 2I      N7c=܎֩'Ե^ӧVUV-ѶyS5 kz+֭s;I&駟d}]7l*lt"Zӎ }{,Yv\| yq:vsYv(w7ިr=e8p:&;V@@ qÇŋ}Ao? L}X`+&@8W?9s$ (94zDh9XAL$*UA$Vel}%LV6sΏ~??[$_^[lY+XV\O?5r޼d&[䌟m6nVNZi,9e2/_~Iل (/_>5[oĞM$Uг xjn2s{&RN~ߙ,;- &Z;Ob&zv@@@@@@@@ }      r_~9= 4o}=zrM2TfMe{a6ܹ]N4INRݎY:?VTIr)Ul׮{;Ʈ?~uU[nէ~cy:i;vL'OtUz3m_Μ9m;uz[gbl)SY̙3c7x`7K/b  @Ɖsw7@ Hx&X%HH@TyFpa%g+} rɩ,8ZzM. >\]v;wm7ɕ+."wD ltƽsRƉjM &/^ {vgOiO|;J+K/`SVٳg'D|%,M$|l‚;f˖ ʞ/8 tզM]x!)z6g'f@@@@@@@U2]/@@@@@@ DGouNXrаaCwuӦM&wPK(wEr~ 7țtzo޼Yw{u;YFx wO^z:p8lKe,oJ(c:S+^~]͟L  iRӦRI <|8L D_IKCHIOzfΜٳԩSߪ[nn~zv_H{=o;@@\CŋN+ >}f K@* /H7(*$i#Y=/&O.Z4%},Twl˼y_Od@  8c.嗥;N*V:wVLYgR\@@@@ȒE6M1xDN@N0N:x9s8;4݉TZ5͂"eGȑ#yf]pz衇T~}/vۨQ4tP}嗺[k.Zʕݻww;8qB+Wv;TL[ի iZ%K+-uƴ`Υg+3<,Ηm<>}f<ʝ;wYA {1\`w_q㤞=-w'P|J>:?@XO?$ϯ"q@IDATL(q  @Js0q27v c -ZH$W\zi͚5IꫯѣGu)ƍ-[6o^-zα@ ʔq:ӎ΃x&ힵׯD{QvԣGmݺӧOyN:~M~|?Σ*UR|. @r3@ ~[Ne):ZN`-,>3K:}qb;J;9W`@ -N5.~\T:rDYS-[ %'pWZRs-u2aÆOHGAcR\*LxCzE9F *'xMس/TP5Z9=k8|XǤ /kiv$DZWf!       @Y^@@@@@@@@ bb%K.];'PԪ;@ ;7ސڷ1LܠK͛~oٳP iv/ս{̠$ @ (,أ+i g} V$-:$         U%h      Yd ڼ:c%Jݻ G@ (f̐rڴ )HRҦMR*  F'/,/#5n,RR iL$HN4iΜ9'ڲeK\'HhF9]]l25j(DfJw>ЧNΛ7o>ۥ CՋ/%       d 3ޘ@@@@@@ *U9GLӴiIs $.{M7I\qEZI&=l䛜"h/%ҡCRʾO?-'(U4ݻwW+^x\ \*UEuw'WFQ!'p%#GjzϩTZnvOiz_}'mH\% Ȟ=Zj'*::Zft ߧ,YJ:A t~9I'UF@@@@@@@ dQd@@@@@@@\[iN7|B@ ɣN:i̙ڿ?Z'&M~zbN@j=;H(<"       @& 2I @@@@@@@Gwe}A\U o^[W_N\/@8tH1CW*]Zr饗*U)Sܒ/x@U+#r5@H@>' q'JGSL^o1\/uO;*UOK&z       -ţt      lvI?|nr|*%=@@_],YAH_ym#Ĕ\ᅲ,.V*ۥ-.7`<Ε9Wa6k ?o6m@ (P@5bL'dN]tkȑ"5@@@@@@@A{AN@@@@@%EݻY- g_:%s׬! W[7o Kwʕ} 6CHܹS*VLFi Y3PHS @[o f 8ii6#PX)W{N_z_c+R$0y#U@@@@@@@@)#     @dX^(g* lw{R" Rɓ5ZRz&#@(  aC(#}?tRRwIIVI{H'J]; \uT/cBҎʳ籆@0 \q4iutҳJec0唼        @F 2>     'еtyPtl  > D@RK/Eb)3 GHIKK5jHFI%JHK{J+WJ#FHuJ6 @Rm}v .PpNihi2c˖Ғ%{       !@ P      "Z|\:)*κ ٰ@HXX!d?2,(wH#{dPj@ 6m^jL*\XjVkW//hwݥ"EBd) C6Ä@# "m(͙#=(o%;*%!        RAT@@@@@@ ]z,c|ɓt֍υm  TT *euZ_~^zIjR*TȷsK|AN}v/ 9&  YTm! &ktԳ' 4|Қ5h $%`\"c8~{ե |Axo^zIQ#į^@ z:w![mL<2>H[+;@1Bڻ7KO@@@@@@@?       %|7D@ L,/juvk MH^ H H\߰`$_'}r,\(:u;vH.o/.,p``S11KHeʜ{.@@t(9s6e[mLD@Z ?h4fTԧw)S egs4       V[ej/y      @z:{n,Rg_ x#u$ma.0|4ukWKP~@| ب>xOϥ˥S@ReJj"zJںUڰA=Zz)G`  HE% -ouƄ@ /.=}KW_{A&d3r?lG@@@@@@@Ț1      @nY'͚I %!+Կ~h/@jVcJ.?       5&AbĂ]7@J_&FԽ{6 P٥Idݺvl{;׸ 4Vd@s >= -[6;#d5⹺yX9sWR%pM!o>I3z6ȅ ݂f 9 P]=/CB"7 JCsCߡ>%ˍ=}E~nl=7|)ӷF~$?6?3* P 켳駛I •n>hzacMb7m&jܮƮ 7ql* cp.W8A,'?k\ Y+c0:R> BbcbB% s OPyyX7v!7 1ޜ"vpyUkTwe|M2j/?pvB (1jb}ՇZ!P/^ ^mMƍ~,-ZǪ߱m~3:u߫ޥcE$IdRقolwvy۶m[vJj0 @ @ @ T(%  @ @%IA-T7 hE6-l V~7oMr87¶X3Z(DqX<*UF ]RK܈uK#/M Mj 򑘦D!m LV1@ |T۬Yf_}7 gs/oӦ0{-Nh\+}\ F ?e4KF4A08\++q(ȍgHD0C Bj^A.7^ X0'!7m/ eΩ9YfR*[h-M[Y77!/4saY:uȉ3$ڈOlC}pv <>@G G s\υ$ԏJp1ݍCM*꒝w'}E8`U±G +Q9{eñ62R?k[b#0bـO>>lPsg^Q};v3&jWE͚5v۝^bӼy;wMsK E^PVk;wZ Tb @ @ @ @ d2( @ @@к4 ӮXHJ-_l l…mj1g"X! \- V0e nkKRV c=ñ>7oޜ#SZ۰aQF.VN21@x_L!PnK4)Dh37'g6jTS?g >5FV|!]d~niӦ/,'ڈ!ذIC8n~ԘlY a 8 )wƌNh-Y"ͮnvr'Hj_Y'VNdmX6m9*:V~Is概 S8+9 J+49=K;%h0ƊѾXW=+SMtknYuM'hn7Xw{a(^~A5qbҟ)f{:)ޱD#g*)ÇF_{軆8o;tUB'}07x)ᄏqvۡH"QB @ @ @@@2 ,@ @ lO3  ={͝;̙Λ7 F$蠅듐raaRb D|ҢEy "\ JhTwW&MiӦ͛J0?A <6H@:燴?g^R1~Amֵkb~$)}I/v +!.h1#b%%܅@&XvXVن 9EP%ߍ4'aÆٮTjР熹0 QË@P|40Xܿ A3s]~\6?t5aÆ6֫W/o>`SgЪ-?#/r9a/~Z߾}N:I!@ @ @ @ Y|  @ @ awƌΚ5d%(zhW{JO ۴-? 9 R@@kUWJ4բ`$ТEmժɶnڋ(-x_,-%M>3!L1<8sBK}I/x;w673{~$Ʃ$|IQa\ K+sIH`WDcB1Å@b4Ϡ]A,lhxƍр%D8NwYK X\`E]"֯_o?W8}Mȣ%8$WKnWטMb&AY@@U/ "AL8E~@i3{b~7o{lY>vʟȑOO}tK?x / Y߿]tE d @ @ @ K!? @ @@F(Sl }3"$H!H$&Nh?ɕ Dʕ+gvlӦN1UVzZ ӄM"d%:m4o.\SYjU/١C }V^4ɀ@ Xtv< "0pك AqM{2ljN~̨>$[>UAK1 p ⏈Dqq$ qX BJ, :broܢkj7$NWhYicgi.XVZBqrտH1 4`"*K跼h" }Ap\2_wm'˭^zPIn6\\%K~߱C;Mg7Qd;Nvok}s_|ыeN4ɺtb7ts1  @ @ @ \S@ @ ւ"EI. P(Z(1qyw[li{k׮_XbBŃgd;-R(ɓM%*Woep~}}׻i=DL*-ZZ HM￿ @{ #]sٜ9f;ک)g͚e3fB\AKzs5md%%z  0be%0 $6G+!=$0 :ujtӒy;^#Uʕm_ǚ5kfFFI% Pd+WN*+aXs`@4jom۶.rIfح>lCrbβ +:R5ju]o*7|EG @ @ @ @  J @ @T˗/ʾko?Ht{oԩBp  Pt]0aXȪ%uVоK."+TPx)&b<vfݺ9]o.x&@{_:sf^jG|]M2[ qIKV";iذ\WتW… 2 .[zF9D${zȲ(Yl X|MHxeD<%&WSowʏ, P U,c͎$6]VZ^L-[f-|}{ 7)xcq }S;쭷޲2ƍ>bUV5 uݺuf;wfTf',E$_z_Dd*W!{eGy__4$b I YÆf7lNt,1;/S^ԬiS3WbW\w.J{%za. 4kڷoJ|y #j*/S˗/9Q[D$Mh&L7lEkר3g߼u&X[~ Xx5a„;c ۲eC.]RJ)JI $8dKo7_&HĞ{9kF&Mm @ @ @ G!W @  }!(d2޳C ׯ_;0;Cc 6d H`ٲe'|b#Fӧ{a;Ύ?xFP&K>bz+^yl3+l n~ 8L Aoi6{Y^CT?4;vk=zIkɒ%VlYd;u-BgZI7 ,r؅ ZqHPBMam&#ʌcզ@dGAh IO鞁Eٹ뿇s=?)ݓL @ @ @ @ L2P @ @Hi!z'1+Vz dխ[zmG}jԨc4 V~'߷> N9;C\ri^x_r%WA#*W6{(Y%˿$c7ϬeK7;)qFꫯ~k$U~}B.]+W!;w3 ʕXDvիgtМFiܲegyY K(SBݺu(V#!, /2j%,D_{3m]7 ӿ/jۡN:YPZ՟vۅ^h=P՟ M*!@ @ @ ' ӳ\H @ @;!6I< 2/vje˖M@ uV^!%{ pb=g }W) 5kf6xى'i"IVFϨJzb%tlsTmcΜ96l0~gڵkI&ֳgO;{ֺuAp M@~}6wԨQfkܸyvn;SN4ml2{B=zȪk9.@ W_'o^&Lss쨣իWs_N;.Ds)Sqzn>D{,N@ @ @ @ Y @ @ um!H2({9{l&38 S XAH'x7矷#Gz+Ž8tJ&i/fIA#pfo=ѬB*%=:l=ͽc͆1c p%:#1 rIW^֪U4*@ { l޼ƌc#Fbcǎu|[|' '`j8ׯCګꅆ+Ui$p&[~  J/sn6le㎳ʕ+2B-޽{yH.KKLO< @ @ @ % ӲXH @ @Ȇ;ʀ!n֬Yc>s=;e]fgyլY3ݒJz 4 0m4{g-Zmf|$d $Gh͉g[OI/)'nu\ۙL+V^zo0n8kذ2?>`Xvy /%KذalȐ!^l֭^hvG[o3~x/@%HU}L߾})ުDl@ظq~7w1 SN%w_`1A@ww;\~(R@ @ @ @)#P6e!0 @ @ @D"O{!ASN@yhӦ_8gӧuYֵkWz F2sq0F̾Od4e;QFv7zі>ϟo<qsX1 2$xb{ꩧl~͛?[re·޳=z~gs`-{,LI2v>sTbj[ƪU[Rf˖-^m۶~CJnOc]}6y=p @ @ @BYUd @ @@z駟bn/n?~ʖez:JE`͚5/Z~vyy+K,Z x=$%n <~N}7"I |of͚epxvUWƍw0d t#tcGN@ tlv!fwޙ6m|ɶ^{Տ>~\гgO+SLf\d >܏cv}BTޚSԩxR1N}yh4;R3Jc 7Et 3T^8 c?y~NiӦv뭷㏽pm3go't%]8yĿ#mJ$5v@(< @ @ @ @@@IDATPJ @ @@b6-RjҤM2:,)2K"Zh*SذWZe6l>VXd%nHeO?aÆڵkz6?O7oO<xkSN.n+{TGޣG[`A!@ 5֭34c $ >23&A4wۢE\>qu*UR7'aΝk9c FSISN &D$]+81/csZl:V9p @ @ @2B]|$ @ @@zx뭷O>^HW^ZjgBIUЂ;̶lْ%FygmڴIzz lzD 3/<ߛoD$zGۥ^lIo!{q%8!d͜vZ&4BF 1sgsb'YfoSk^D]#P\RDž1?sr<ZaƉpQLt `;v,H](Ds# .Wܮ:k֬Gp6DSre˼?|۴iSeGb*1I&?O[nOD;F`Gڔx}Ik/+#Jp)Nos-V9fW_2&|WX$ҜfZKkp^Y@ @ @ @^Afoْ3@ @ @%B`ʔ)vW\qEH3_o~E"gbG._|ӓhs̱?91 +W\|'aÆvFIR^Kjժ{g6oޜN#- P!j[dOUZ4|7SOٴil>}X^K pvc9q>}}vgp$q1n |[liO?]x! aޙi*Nr!"pq޳͍̜Xښ[zs f+VL۴&y6m]ynk7k̿klt+Ĕ4.7qEY޽}%d$qO?d:uc2e$o(xKq={ i._6b_N7t#D @s0/{/?9}Y>|8p`Qꃢȯn$$R4$h"?sq*Ww}^Hs@ w##DEwks{ϟoׯ\W=y`_𓟫 {wyϥ丙a'ݺutp )ˁ:%8z(e:`D Ku$Wmի}MתT$默Re{K/4i~yRa8̞=n/86w8}1 @ @ @ "@ @ d!sieaҜ[hqSO?4Sr~qqUVEtU>K.'h8qbdԨQ&MDjժ Fy8!LjnN">RNۋE֑;,D}u뭷s' 5_s(_{#'xb-8Ѿ[q'~qO "[lϺi'y"nQZ'r}B8"Sɓ'G"v8!Ɉ+<͇EcOuH2cG$'?x/MhC'qB˗G3ό,\0E=:tMϩ8aH۶m}]Vt ',Yx#iժ7wܷ cF:wVi"1AU}3He) p {El\ 2K}#O5W iӶ%3=9#:uڵk9q;tMcs98E2h쨱  D~/﹀?9Ѿی!6[.jժ`a"Gk_'"NtЧm@qgD: 6,ScW}ш><3'qB>>y88Ɉg PPT8ԅo1ҳgO_ן|ɈϏ|~쯴jm0 $B2u7,ϛ|H^rύlڴ)Rn]v ߫+/OA.N4ח_~_Wۑ-3sO)˒~˚dCBHIjcdOsԧ:d +k?t)m#8x6Z;/h<лĒ{BUz$z+k׮&S6lE;<^–|'>oǓ駟I"GjԨN#]tQ^zхS0H,VA t-AߕW^w}:&Kx!"! p<#Z"f̚5ks!AS%)!XSP>v$x;-vPPV(DC%`2$A`[uB! _,?/.C޷~.|Kl}~?o P!@{O%6iϻӶX?$j(Al1xf,{cA~n"AF!XIr7t3n8?^z%?9HXOs"kxb0\AqA7N bǗJcxBHlO奍5i4W A)"i B8#m PPL.HQu=v#LAys#֥KXL$\ &q(]ݔ% <|f̘噲!`m_l//א>Wmu*O?cǦ"xY~ߥ{0xP&_h~BrKl֬Y.L6 @ @ @ @DX @ @ $;Yhխ[7)a&;7oO>z̉믿nN,њ4iߣGV6i$g}J*~6mڵkgNœXUT܂x{ǬSNY޽mOxo۷zc=^ pBVvm2dժU&L8@s"DmEW^1'hnA}ԋ+WN; .YxwA0W.0 vn"iېP.'wXd\Bkݺ/l299L,pcs8N&'-'M6kv… ͉SH  >@ ]ٹzkIc;׉E)2k\ݼys mfj4Ne4 cN9{[~>f?3 /D_o^nzʟ̇rH4*Oc0>HA":6Ba,y晤C5NFiN:o"l8w1z[>cS])h^H]p~^NF6.7G2NһN4n؟'{|:QOӜQӦM2yI4XȃDH\bM]Ħٳg0ZW_6T1cbrŞZ~0s=g#0-⎘x*T"xQ榛n+ɓc5!qLW #7p/vzQH!ºEMɝ^zLyklԩ>9mb侧sQܢbة>s=^[RXiŖT@i"തm[V)(I6Ȼ.Tz4;oc8F܋@>#v盃-Z+V+opGСC}^7s z Yc)SBBbQи.M81^:]˝ js G2̙3}p ;HP&Mp\rscyi#U򫛉ԅӧ[5 \v$^z]p~sK.ľ~wcD?c_H Qs&Fbe6n`s̏[">ksN2.fѿl-,26xw-ӿ&bп%ٞ|_Q۬ VHhXߗԯjdΖS~5%dŎ&N裸fUrm=S·dOx @ @ @ Prdɧ@ @ @@B+-Vmi-lLjժyA_~$kvuWڠAo޼/~L>3ɸYjUرc nݺu^rq.^ovwW\7YId#$>6pn2tr/b+k?iϝ֭[{-5mh{{9hK.!Ӵ  P&܉!JQ* P.} Ѧ%Cc -[X.] Ul~ "RMbwkӦM~^z7ni/T?o|ZtHG*d Ɍ5*GE$R ţ߅r~)"vi^XPyO<!7ZP^q׶m[}"~zӧo&HHtn,Џ>/%I?%e0o_PLb%w],sjFN{mxWMyJDgJ(_ڹs6J=zkKE @ @ @ @i@!4(@ @ @ qv[޽miFYݺum9fiKNdF#~UR%z?*!÷z.2Rc^GuSk  dv޽Kμb@ uY!=?>vUW?fQ~}/|i\o<~g֤I?&IDqXLAb5СuĈ9b8~Rp2~Su&5u;wśэ<0%X"H]s*7pC:-џ$5!?f:5~Eª=bRPד?m!z7( 2U>6m-y?~nO_2~/+)}DbFVMjEmt*q6xǂhJqxܸq~C4m_a}ر5n8 @ @ @ $dI @ @ q`{6dȐK-t9c^{Nw}y~Dz![~;goծ]_ yB'#q?-~q:uLsOUuժW0ym~;tP aiLl%ʏUK4@ b2sQ԰LgޕPhlKW(/}H$F*ޡ܃+Z|h1pٲe~_2M7#+_ݷ5F@p]2V-1 ,uC;oUcQm_|}7{؃>ړŠ8{{nݺH'||@E+IgvugF62!qsSϟd>l/|9j(?ߠqk[n{>$%ǭ0]xqzka|\y=N7c+/^瞳6mژSiT/zeg%%W^=Q+ع|~n\H}(n&R$ 7|ӎ8Ӧ\rgAs2#Fb9製jlXE~C 5YF’Æ s}+򫺣PmT"1'|2Ç{f2ROto56jNH1c+CBRPE)}jMVۜj3`/6ꫯ&5Dޟ{Dx{( %:(J><+IN4~A @ @ @@1p)1 @ @:d ʺl!d'x"Rrșgqbi~'뮻"UVH*U"v[d֭4ꑝw9{GDv}SY?;vq"\pO>f5jDN<ĈU/2ϝwG܂SO=袋"nwĉEj֬u#nQO{D#ZĉVF8׺ulܸ1"N_w}D4DM9yg}"k5k֬+-\sgD75 ?^~)|䗏 ;6DwѼtA\KI~8hت7:#:t4iq>ʯ:}g99xϫy䑑SO=52cƌ< Sq'YR ,!~B/fIY$0vS~vØעN{i_D%@ۡ*$$ۜk"N Ə5z8 <o4"G9cX!hlm-"nÄHݺu#nh{H "*T~qE5kwqGh$kLy+Wg\iWXO*wG4n؇#_}$޵#G5N=t>5GxTsJ\"$M-XTs4N(ҿH#|,,'+QTO5gOt 8RPT: G0'дiӈG|Kl]:#N,y 7Fvˋ@%܈qB~~ǚ o"?Q]߼ys$m|.ߧT?9<{K F`VdMAJ4ü #<, E_/|v%:S\֪U۫6XmqqN]6ц:W~FMBZB nx>Q[iPmӉWwӦMyّN<.D MoGY@ @ @ @(~e @ @@V(Sl }*[dI`̙̉[De_~9ȋ[ns1'gnvirlԩzjsDS'aN Ӝ{D+-kgfS9lҪWS{[d9stWK Z:urē|v qir(VR%;묳L|݂>SNӜ=>5⮺fz6Hb:B=jNÜ9 sBv 7]S̀O3%D}k1H)U?4tְazgljZN:$?8CS:FQ*h͉=Hvȥ9As148qo݆>I SR5vѱ^14~Vy/s;8sQÏU'ҙt/]&MjhK$Cu 'viNtN,[̏ㅟh^kܹ]}5~o2lѢE>~&+W7xÞ}Ys_3͉l\``ܦ 6p@{W R9Tuu& }wo4Q*7LNl8 sK(7{*Jxz&EKA9ws /iVwC @ @ @@@2 C @ Mp%E`Сv7ٳK/ 7n\R)J裏.W_#1|B) t_Qҝ {{٩jrsE3H&vMfW]0 yϋ E@ۙgf0ٰay'lԨQ^OBb=zreFFX!G}4ei75jا~dLWHP<D ܛ<+IS2˝<ϖfK>*+VxA|h^xxy=V͛gzgLe}SN9?pM'0п A&d{\%`M6QJ|'f'^b&d"yP^K&DҔ(lk# L<>C{mȑNt5OxAŝv){ZK;﴿>y^3JWۆ2V-=ǖ K볾uQ~lO/0b @ @ @ !P&LL @ @H! 2814 CƏo`klΝ !Sط~k˗bgyIZj$qڵ E19;^zɉP p b$г9q21R*hKm'qb\cֿٽ&XZz9s&/Ҷlb;v;>`ѣG vI(/׼@~"4i $Jusϵ_~6ol쳏OAل@H?O?>c[`ծ]ۋ8qY01̮YƋ\:޽{w;#C}7m6ITK&%=n8O|9j(Zo# DtUx֭vgĐ!Co#@`ŞD%&-af  @ @ @ d? ! @ @(z(N3 ^>'x:*U9#H}]/-j>/ӧ_t* RMT&|'f[̉U$}2if_X~̟ov fN4|ZʋЌ1»ӦMeZhW.]& Z*j$kjժ{q XbE+Wlvc„ _W_}e:+Vq(b*lƍ^Ry2e5ۭ[7/ YBTD_`/"*1/%L`ӦM^Q ڵkg~{챦6QC& YjSJ#<7ʄtgS'Md{߉I&ٔ=@ @ @ @@28܂ @ @\a!߾RH`ٲe[oyaO> UzN$(M6 y@VH1c ;';8;o|YW2x_̌r"G w9J?W&锢P?+li֯}S _|EjFmIN:^Re쳏[r"%@N`^p^o1k~Fࡄ%YJ qѓ믿6|Yfy_vjpǤ):cJylر@B:iS#}ի5lذdvmv뭷ڀjժ`<._j<0 @ @ @ Pz YzʚB @ RE ,GT;2֭ j#FpbA?Etr|ֽ{w0d1@X~}^@B_~Ko#:7vEWjb)j2FI_͜BX0gl$㡇̮llscόRB _vWPl>glz {m۷VcJ*%6 d"mN3i$lĉ^QǚۨP^P;weQ5ϳ% 9j(?'f„ ~NHć6k,p@$[-YmfEYŊ}%_}tx| fguլYӞ~iٳg?~mƌ٩JUV^m۶&+q=*W\P_@ ,]ԦNil^q>WիWm]SN1+7EFcǎA}:vh,MٽڋC@VXEJX_/k%Y… /w}g?ngLR_m;{Mm @ @ @ I!Y @ d=؅YY2RJ@/믿ӧ{[bm-CxV2?_/ >jŋ>c]v=zXݭnݺ)KC`G#xE#лf#Fy@QZy&w35n\z8 NSB]&Mvʔ)~-[XٲeS "cmӦM\ryu@)#vZ5kQyD ?JVjժ^VAxP͛720)' Կ,[ݨQ#_6AxX}wuW(CHϟ}C BAX$}[j߾="vUWْ%Kꫯ+j׮=suVر_ȧ|Z' *m~HҁU/Z?oIԥm۶~g]t3~WPr!/&B ?H`N^~٬_KH(}AJcFsbfc&QHL|D"ecւTkѢws# -W! HDI]={vqXmcDj%$y 6i1Q_?iJ}bEe뮻|߿vm~6$! @ @ @ Pb,1D @ @ J2.†җŋM&L'z;}tӢ+Rh!E:@d57S ) 6>vy|lMH@Cvɋ>VR%!H3@ 8̉3UB hS8cW?|f&`+KR;jӸCB=2cHS kwm7kԨ7D'Ҁի.;wnΙ3k㗍Rurm# 8+a@IV1A`ҥѹ~F}͚5k|&+UP'~Fbo@E@U?G3u! ;U_}SNfen)JR@ @ @ @%M!Ȓ. @ @H 2e 27%(  PBw'O)SLV%)S~"A-oٲet1;'饕͇֭hWQ۵ku%)q2\1"/fQa'1ǜ`@'f,+$g'^شl=;Lx\B=gnx nJ٤pFwuWo7n=e]իW򊈐 Rj.\腐$%߽U鐠Wm$v(R{hѢaK֖-[f̘mӂ[TV-P c\ ʖ-[| '&8Z\ƊHPEu/,RZۺuko%xc-x@}4L#Fq9msB"Pޗ.|^N.ܸܻs剢и[pA.A^HK?AR:֭[$G@K,1 -^8D-[#:uy ە@_ڵs<  K@a e h[750V}1@|k׮}D #|{QH$ZZC5>7xAO>N:$/Yi*85>L+={?߳XbI$8!@ @ @ @ C !E2!@ @ G ظqIPOBfz:V#EZa%))+ ! R)hEAE ֗.] B & RڬY3kѢEԪR8(x_,ŅO֋)F*"yȫ~8(/\۽D!1E`ժU~|XIn r q/իW/y"5VmnI'5#f/'QXoYo+XSjըkd sbbTRCHTkVo r+W̑FwsY%+ձ r $CW^b] w+5k֌~ H$o'rBdذa}nA{ի}֫W/;*\?>#oG /}G}b@ @ @ @@"L~ @ @2@^ 3.#$Z,z 3;;y޻|'sh)/_>#ͳ-RJe˖~Lz~PF T7[f9Z ع UY~^U[FW 5u!yJ,Aa -LٲU`JϠh3 p#{!6 ۆ]ة5Z<+}gY4m4}GZPڷo;CظqL̞=;cꫯ{ޅ]GMh(       @1/ A@@@@v8 ȭ]hi]a p [<؅v1 8"aw(B'lM+V *p`Û -X\B݅njŲ6,0!Ųvlڵf@bx 9 <4b`l\y/}Mciٽ?,ǿukeK7b%;}eٹ;PP!v, qv~<=ԼX<4>>>\ X@_lܵk!S6رßwN$\-Y9:{l<$"w ;%tj^;؉d `?Vu'6}=ҥK]3@ľ'߾}/w}mjhŶ5)rw5uS{1 e|ϟ4?HηZE=~)~~~-ZH .?-[7aÆ~eNt'M6E֢       #@dW@@@@"B"nGr Lwqڅ.\0ַٓ_׍vQ][lY_{>xB`7*UJ6څFa=0JύF Ǵ mF855U6ZPc=Bl hݼS6h 5X܅v REV^l/9G,޵ҿ]oՅCM{>}d-ΰݼž l<jYV[_w}ڼf5P}' 8x\vnj}GdZ5p.my=n D0 P~;3gh6߼lϙz~H˅}}gϗ ᵿ^ZV3ֵcC*-w2رcGf^        @ #&B@@@.䏜@ va]&l$%|C.s T⹜ 7P9li E6]ABZ.uc\C3x"D#䅠1-gI'bt.' ' h0M(Vv.B!6BԅI8P(8dȅi{ nuݼZƀ)dI g͒V&ٹRbԧ1Bj%0 f.ͻM"x]]}o?v;ą}`E.3MCp}w/Wvn[]y ]f@ Zrh7KG`gYK֩SG 4&MQF~y~       F1%A@@@@@ JjժcA4FŽ.$"xja]l<2$3_~YWGwov/vqk.ܳ.uͻ o1 JM  ȑRW_I;w \`v~y~vom|z-xWѣ䌚\pvFd5-w5c@ YfII?.]*/LKcԪ#|T?l-W;:jSwͻipo/l}O}o s|g3 mn -[rB>wg:oE6oUVG\d@@@@@@@@ j@@@@@"\Q^F? 0 ܻf  P[ pT @N?]Mni0]!e96/_P[j^6P(TvaX<h,#ickRbb X:f]xbI )SFkGH@@@@@@@ c啤       D R\4xp4f x餓3=#6E@طOSɂ_~*UN=UzIOnݘ6B@@@@@@@@0Dv        /{n ϥ!)Эtw F@ +VB-qLi.U+/O{L        '@d콦@@@@@@@"i|iܸ"kF.R{B~v +*}d6.\(U rcR>R|        *@d04 @@@@@@@h֭-Ю4`tҙgJqqc) ĆRrr`>]ڱCj\JLƌN:I*U*6J/@@@@@@@@@h,w       @ l.M$=Pu!9RjJ0A"@@@ Ҥ/KI'8G:X1}A@@@@@@@@ _       @.]xatn A͚I^*oyIJ=, DڵԩǏ>m4Gwʔn`@@@@@@@@ 䅢       DҠAR*Rڇ}I&HO?-t탭@@hZJN?Ν+.-!H d@@@@@@@@@ C P       ĸ9?HcxGkznx@rBbA@x륩S~(m"}t qSe#4@@@@@@@@bP .D@@@@@@@@ƍZt)s8@SJI{@@ Gto:tjՒRڸQ^i"i@g#(+         @ ؞1        ;(ݥ P8B6ᇥ믗W/ t@"شIC)))0 >}{zʗ/Frx@@@@@@@@@ A@x       yx5)-M2$o۱6 7,}hF@ :NJN?Ξ-,)u*~(j}         P|,>5=E@@@@@@@@ƍV-ݳS@ ʗWVB!6& @bJ`iڴ@ԩRݺR>mIzI+T         ĸA1=@@@@@@@ Rᅲƌ)ȣo@ R=:ˑ>Z @ ̝~LJZ*QBY)1Qj:{H@@@@@@@@@8 Y_}       @>ƍZv2ϗڴ\@"L`6i@crvTԻtMR^R*h        A f       w;_F(ңJÇKSW s5o^[}tԱtuRb'(qgK@@@@@@@@@ RWv!       *  y @ X0#H',͘!Y@b ĈO.%%٘5knz:gJvt1Y        d#@d68<       Y ' @PKB<AG)1Qvo% d@@?.Ꮯ.I[V8G/ TM܀9@@@@@@@@@>E@@@@@@@?Ϯ*;fw @ <4wQx @v_:騣VQZ瞓zTin/-`w         @ -D@@@@@@@ yFjB-F@B8X颋{RR @"XXz ӥjդΒf|?~~ƍOhSnoԬY"o; @@@@@@@@@B (1@@@@@@@@ zv^{MߣRӦҿ-|s@,={Y$)9YZLRE:4B{jͻwW\7xC#Gw!        P be@@@@@@@#0q"]|q~¶ @l ԫ'­K/*W@,B-B - m[i )1QY*YPeކg}֬Ym^zK@@@@@@@@@b&WKw@@@@@@@@ IHG9 cw)8 c; R`>i4[fͤ&MʕzJ^҃J]LR#۷ox}w@wF@@@@@@@@PARa       ;W3GꪐO(UH4fre Q*bR߾OO>XڸQzM˥:u/yĈ~ꬳ_| f         L "       @>yFj\:|M@:驧&L5@HI>\JJ I*H={J?.#կn۶MC ԩSħt}92         $@A<@@@@@@hذaz-ѣ 1]x׿Uƍi1! ]kIw{`;@  nEj.L(,uyauIԸqc=#!}/Įʖ-r -nҥ!9tc=x 2,ի@ΝRG 3M*U*w=\%GN͚5K]tݎ¼~@@@@@@@@R .gx@@@@@`ۆ͛7?vY:U VX!2   'JI_  @  u,/(+W_b˖-Yܹse^'LޠAZJO>>S5jH*Ut/5ϖٳ'e=\ -Mipuk~}%[jW…oꅨrֱ7|;f͚,u-         P܎09     U`ƌ~w5kL]w&Mccg7t/ `@@ yF:ZX }@ VG`I/[b:aǏ϶%KԒ%Kٮ;^ *To&Mm[PȽ{bŊ2A ֮$飏ۥMDɾwJ{-`SOgjsW_}_{7u 7hJHHø~ @@@@@@@@V lyx@@@@@"M`Ŋ?LUT;8r)nWjU]q~^+$,ׁG ˔zF @6nFu]ug6lаay!SO=i9C@@@@@@@@@ G{qD     )w ?~ݻ=\ ˖-'wkM:U'NڵkujȐ!=oBYnWʕ&O<_`^?qO駟-[Fޕ]w܁^ڋUZ^}UY \j}Y͞=[*TPÆ 裏f.3fw\UXQ_|o3 qRfREDQR˖]4"9Y3gԔ)Sv[~N|~h{i=z^y}GS^n_N`޽{5vX/|kٳǍ73mY@8WϒiӤ-[F< &y< ,w?[ӧOWjjM6~}-\vujsڵ… mV\r_KIIuUCլYzžK~Pe ϗj@@@@@@@@@\Ů@@@@@@| <^TwXF wy4h_ NtpE!ͭު2eAhn` yPs9xر`c#xPÇk/,j Vغu_HII ȳƍPv"MSDDze}{wJӦɻq<>ce^`%ڜP|6> 懡VT_]m.WV9UKwu8 }l%__??gf9]m.a3         @ $A@@@@@=oVڻwoF([޽ٷz-Ƙy8c۰zj:a߿_/ƍk۶m:ucb?_>Sk v>/+--|psKIРAY;^s5꯿]okʔ)kY;^ΘA@ƍ>[Vʡ@8{w#ٳ=gu|X[gvy|Nnϻmfn`!p8I&vڲs}7t?ƒ%KH)y^IC^LލQ䅋JIw!oOK}:/{zwy'ܚ5k^eg˲UmK,釼qlZ^TLo/QʕOρjsf@@@@@@@@@ +!ð#v     ަ̓/]v/^؟BAl?p~?o-ZKnqǶ 3h?Nl޼Y?iŠ?jժgyFM6U\b\~}\2e, '0odLW_]xH @ pT^ +FΝ5|m߾_7xy^6lmݺ5כ_^lnCEtsLN`iDՍ%n-i4c4lԲev{:FfCYXjv:X\s?9սܱ3ׯD͚5˯%%%^x?^2#x>\njb@@@@@@@@ȯAd{@@@@@~֭?YAs ƥ^O>Y&MғO>T-.==ݿYCn7ZիWkŊmU㠕xP%?҉'JG) "tjGҪUҸq Hk7dU[5D-Z8$,2Y]ΆԽ,n2C1B]t.\G}TKVmJN9 =aI@@@@@@@@@ A!PX     E'駟toܥK wz9=h۶w_4/5|p0۩]pnwծ][gu>C"lɡCFzWsa7n *h^(+WEL@(4]}gIW^Yh@ @ '!rKv!6ΝPdIkU Yf??_38d;'炇RJB1ʖ-|vom\D2{sDW t}DiFOթ֭ ߪcǎAvsKK'u޽{aÆ=zÔ^BW_nr͹s:>#        qG@@@@@RSO[oe4cԩ^nvY:uiRR,$.^jMիenzUWbŊ망vnذZB Yres=_]dn;O/۷o q4i֭[/w!'x,D!]X}֭>hp 2@ Tڒe/_rI#F;}ْ~1 @Y;--yz7Y8s4o<9'9{gwy/7o/=1kf,s3VUvƦ    DwxC80RZD;@^ mٲE^{}] 4H)))]1?ydh߅-PD[ޠAȑ#tR/_^w}t+"c٨Qt7ꫯ. аaC u!jڴAy klٲ\.:1cj׮_~]4oW^yv ֯{c[M2'Pٲe3 _o@ǎRk>^p]&͜)/,N*S&=b_D߬J*~bs_wΝxp vbb˜[n2a:uرcծ];yԺuk篌_/Xݡf͚x7ˎgT[nQ޽3ֳvPn]|^xCn31-c4}ݿDɁ5o>}Oގ\[)w ZVjsy'>~&:, ڜƲ{.]:W9PW݆ &5?Źnb'?/VW̪6U~@@@@@@@@@p nQ    Eu!DtF Q( 6mڤ AȐy+VȂ2?c;ƲeFl7PFw=qFLڝk͚5jΝ;^VŊ @ CImJ,)}lUQ?|9/|^^t A 6\}r H zܽ{,ZjmѢE%Z1/ ޻%/ R&V7Xj^4f5o[-jZGq! uu8ڵyعvSx@@@@@@@@pn)      )н{,c r'JxW7i$hIf+UtիW?dYRJOe׆ *x[^ E(3Rf@K@ FjזF.LY3F;Jȇ@nΝ{?ndɒ:cñ+%^f ?&'˻Y@Qӥ^LsY*o۶M]tN=Sl_nkavߺWc*ڒ\~k2@@@@@@@@@ ATX     E"0y"9n4L2۷o446"ĀҫJ[ t. (0l4ntai6&!PUXx߯_|o0[r3g㧟J))RvDC NdӼ~Iג%KtM7F*lO5mڔD+D@@@@@@@@> 5     ĬAboXZv@ȕĉ޽juVBȣ@ٲҨQ믗ڴX( \~Zre=|Tti޽%̱ {xeiΝnj#OG         @>"     @x:w?³? 7N:lz퇭@iXacY3Ν;{ǽ@ [n=L2't5Kڷ/{yRbԩT[;v          +@dzs4@@@@@@@"Z`|oQ"4z%1c$/NSH]D@*U"}4,]%RR^ҿ%#ծ]         C :K@@@@@@@r%0~ԴԣGVg%@|t(]ptmҙgJKcgl oIIIǙ3ݻ㎓>;xR<6GGV@@@@@@@@@ȿ]-@@@@@@@سG0A.D@"^ࡇfͤѣ;@@ RR>3q"bEgO'EUh,         @#/$@@@@@@@@ o!%]rI~ [W>\zoڹݒ@B Z%%'g̐vZc]RBm2@@@@@@@@@ O ³H       DR~ґGFt3i s&=t] /\ P_`Tt)# 6,&s@@@@@@@@@,@d@@@@@@@X03mZ!.PL 믗ڷ>@h~=,}}t1ѣNJ.6rt@@@@@@@@@ 2;C@@@@@@@/5j$zj10D"L` 驧n FXh PK_}%%%ye=@          DAJN@@@@@@@ H`>嗥C% @ G1cN^]:Wg@ C:58muԸԧ4jT  @@@@@@@@@F U     D5RRZڟ8p@JH2_ߵG )ҥ+ @?>Y|_"/X hX{@f*t Q Ɨ9OmNO&,}TԽtc.Y@@@@@@@@@ 2b_     @l ԭ+j?sSS^ҷy #0~tR {|S5J92۱&&P+ X_!5S/LBpFi@iҦMQGB-Srb@@@]>[@IDAT@@@@@@'@`     &pҷJg}%A~g@@ <KH|"{Aȟ@}Iw%]~t[#{ol % 2mwxv*y(h]2         Q)      Hd݅8/ݻKje  @x}VWO;^z w>6  BH@+̦@p/}ZK#GJ'(ը\R6L?_ZJz_?Bm;G@@@@@@@@@ "#"_     @ "Q}vX x}iÆ@dʞ@!piYgI7,cҳ(y)D U[J'K^*թ#k'RҤIҦMҬYKic"         P {3      /Я |%Dr僗@/0~dAc @ GK-[Jc!G@  ^ %SW H )Dދ͛'%'KIIW_IH;K7mMa         @\      @XQWt۪tiȐbIB@(T+iӤ+,r0@<4j$ *aC6dUHW 3ҽ Jn.Vz$ z| >&L|N}t]"4@@@@@@@@@ 2^     @qB)-)#qx xyz@0s@%`j*µO@ \2x3(륲_.O?)rJwǁ ֮̑^|Q:\j@@@@@@@@@(Nũ@@@@@"KO|yi׮@⽿\sTld  kA^rk? @l 9#HCH\#k[7@@P{_ +R 87Hrd70nvfΔ$ʕO>ڴZ5@@@@@@@@@@ @\,E@@@@@ ^tiiР?Ҥ .(r@iҪUw DR. 7HDGi%y(y%Ty (0cݽ{o-[5kx:=R^~҄ }         Y <     SrRS{RE:p}! @(gu9&Գ,CDc9s^&/`+T R 3R6O6x))]-}tRFR҈RҺu.u(?M         a      Pt=zHժI6I i   Pp6H'Y$ @X5HÇKK+GOi)yM^B!)_<` sS@ B~oԶ4xԧԩT1         +@@@@@ T/ `RRRdYt^2AcJJjZ>֔)UDCƸ8/dD$$$d9*UJKN  p/,+' x;`3@"1B4I>'>w^>jnj5OKK;F8===><߱cG>ڵk뭷:6`ڀl>xjeʔnaye~*5mKᏵje^          PXA4A@@@@@,TqΝڱcoOmޖڵ3ٳGnܽ{wƼ[fG;NOҽ{, @H ˖-౜|UBhիWl1Ѝ7J/ Β}vb!e=@@@@@@@@@ C P     J`?7l5OmC Z@ZxQG ZxwS[f -ÕWZKAf @ }WzWe@@@@@@@@@($a@@@@@ȍ]пj*66o ў۱cGF{-t!8xM6ӧjժ`hA &yGZe,b an07Ο?ߟ0 7ر,~h 6ǣ:J6n;S@4IJM.0I@r'0j4e4rCۆ/``˗/e˖u%ظrJdjժ͛7WϞ=3-2ax @ynzk.VֻI}6˫amFwzFh˖ލ&Jx7(nXQ V+'/@Qг         &P»X@#    PD^֕xC8a@ "n* i<~v[ȣ ɳm>XF Y,`$0S 6PbA%6lBr`FqQtuA }1_A8]^pfS| ձ;V:TGc K.cI/>h\dh|6; 4z1 PvC;w (ͻɲe˽KMNaV۲scI&         A@@@@H ./":@ iҥ/ 6qƍ~,nݺxwQG PN,Y2-سgOF(D,_qn~>5kD-Z?39 IIm) W#3[6Mի01 >#uVgЮjZv-Z f<-(iӦhyVG|;?JHHԮ.B ر?緛؍R,h6G}'nٲ?yVtǪ|!B@@@@@@@@@ȻAy7c @@@@( &"Pva͛7O ,~'?1%%ſh~~`6s1 GyJ*spE`۶m/!ԅTR` hݺ?V^=ZI;/wۥ7ސe2 Pl/6/au4V_|!u0(b~#i=~w?~nQKҴ;7oO- π@qػwoU+jSw,՝mV4hPx#         a 2@@@@ bBH D@jj~G};wh ;wTɒ%դIY6XM-\r|ڀ@ _p-XłY׭[N:jӦ?kN۷Q^+ *ІTt5Q9!}dڊXz\z4}6|H/vٍ#,믿֜9s2-bwqO /׆DߦVD~~Ǝ;c͚5@@@@@@@@@B 9    @ ҅ƑK/C,..߷oVS۶m3,L2xZڸq !~?,"%%EժU!N8u8(t~_,trX+/-_.[/.>=jK/ݻ!tC?{'EqaEr$'"Q O1rz3fN % 9'JAwlݝݝLOwuշ{'N5k,^h<} vɓ'tNԹsg.\8m@@@@@@@@@&@dF@@@ E rf ?~܅59҅?fɒŅ5mV-ZP#tRCܹsZbwiwGtn+OA  4 Kʕ ݖ hR,Ftz#M,2֕;wx]B /7_Uzt7]vZ 9sFsuscƌ=]_|Ǝŋ:u uۋD#wztUwKT) 8O>̙3Uvm'8K.uACÇu뭷o߾BQ         E *t~"    o&RN={v}wG͚5#2 #P@Cƍ޽{/B jժ ={l @blnUHdbN|D@+H#];t^}U)SFpB="2t-C j֬ ;vh:rׯ           "@d\I    =*] zJ{ѧ~&M(*it, !7o^SӧOׯZjO>TKEGGg:'p4ltv@H_jդ^;vTʖ-j^uf  `s-Zȑ#}v[իWB@@@@@@@@@ "nD\F:    ɓ'e ʕŋ5fX4trʕlq ܹSTvܵs86._\>b/k۾}4h WoGMlΝ;SGu`{r#G?W׮]Qd b2׿\x?*UhҤIDځq9! @s>P=[<8&=Z+VСCcʕѣgϞ.駟c6eq|!5Jѣin6]z n5n I)CbdsT۶mS.]-[BnG@@@@@@@@@ =LO}΍    … ekÆ 8L>]͚5 ÞDvݫsSLLLPuֹ`O//mЌ3\ǎK~.y~_6nn%ZڐhuIqp}4/gΜ۷~DžXHݯ@ |Ԫ͡ dPZ$ߟߤƕ,߻wo=䓲:(SLڰ[ ?6lHv={V۷ow6C?K>u ?7U(XS         i.@dsB@@@@@ | &MGZtZhרQCwqe̙mFt]w\*T{ca/y[x 7ܐ*7QQQzU|Tiuruy\K/$;W6mO2%jt9rG՚5kdA%^kA3@ -M*_VF1DO_'t+vR:ueO$e իVn뿅WX1d,l-|k۸0Bqq͍$]z$_H:tP={eL@@@@@@@@@M pb@@@@H'_~Y<ƍ' ˚5k:*`Vueɒ]HpǶmԭ[̘1CΝ\!ݻ:\x\LL>c+VLm۶؂? 80v[((U{uՅ.^8I@ "#o@ xC4HJ?/W^q!'c:kc`;g0>k Pk_|s#o7o|uIgĉu}ŷ@@@@@@@@@YMa     %0aK.PnHf|;vO>ѢE;wn.]|K˗k*^ʔ)oF[nUvO 7oƌ[}nruWϊ+|MyԫW/n::q^{5͝;uZdʔɭS?'OvwV=ԳgOmڴI_vڥ}:_5vnf?~x9RoiӦϪJ* h/-k@sbϵtR5G7x/T|c\{X@ڵ|yuc=rS+EmrBcw)y3g-[znulUF w/+7ڴiGy;Ek'ϊ]ڜx_|<{L6l7 tc\o?tO?_~Euԑ3X+pvwܡ.]СCpB5hMbE77Rvz@ڗ`\:J*W6lMҩ@@@@@@@@@ 7mB@@@@@48{q!Fҽ{wZ7i$G}{o/y̙}駟va{)6jHer #,[:u> 6аe˖z;#%b]w !|ꩧg9s9rĵyٲeo]݊pA KŽE}QDadpZ 8/\:tP v Tl߾,, E /ח9|jҤj֬ ETx/5B ]aniD{ŋ'IGUz?+>` {oݟvOXF}i%kmƍd!VlvٽO?^db.ռN>- b)vOY(d%K5k8{I@*j*7 J7. HCi֬;w΍X#XEvU`SC 66~wmj_n]loHx<Ɩ^H@I{@C|]~j˅y=lÊm=^I>a__1g{<`j`6ַ {@Ν;Cl,ns^Ilo.ʜNl}X2kX4g1)         Arh'     N,aÆPNM۶mٳ]ЪU+$h- kd} Ï>}ʔ)^{ebbbb,cǎV|IVhA 0k,=ӧkݺuvZЇ'xYZ 4pt@u]i+^9sW z\۷}no޽{/($g͚ڽEA"Y _ߘH%}CHoxIg ߓzt8q C9 2Eڸ+Gؿ mۺRC7B+VmjcA{Sڜm6&bXK~޼y99sf7g`1"3frQZ5-BJ-Rɒ%ecS$?o'NmA6γUW]{͑L<}nm1',\Ps!`j[2\T|s#$'&:kHRc1 k          .QPډ     >^\bҧI<X)w}aÆ֒+W. -ϊtEhvŋUF `Vv/b_0SNy\9rDcƌѨQTV-WʕSܹuIw| UD uq/~zۃ\?9k+;w<4qm޵'/YƎ|]պukwѣGg_T)yl%9ѨQ#w|] дHY+_ug׺w*T ~ %[˗rًv=sf]?¥HjW;|( d瞓O|Ҥ8B¥TZ56=tl=ysxmf:u#A#c/^ܭ9rpahX?-'u NsL`}7^6-Pl-+eʔqO E}>u M 2kXREj.u"        A%K     @X}Q}ɒ%a#kg}&AtWjܸq+p^zL8 Wb_oպuk#$P ^b)bt /ӧOK.թS'7v׶ iP/*TȝjΜ9睲D}"E۞Zo,ÊB-lbΝڶmyeX Zʕ+> 6L͛7Wϫ;7bA#7o>o7 İJ*=ߘ_||0I@ |Դt)@"XCo %SBoc9Ң@#xsd;yY߅e˖-nJݻq~Gn JKrOټO.]4yd7cs>ęZ%@G M 3F #>{뭷ԲeK/^cw}:sLHwfB f ;zfA Ȗ-gyF~mlE4n8wWCbfIm s=.I&z[oQF*[j׮\ݾw},҂;-pÊ`u ٵkm޽ǵmǎsomovyŋ,dgŶ[؂u~gZvn?~{mA_|*V(W0͛7͛e!^]o b>a,4.ضz}QwO)RIJ !k{+X<-T_lݺU7o^pj{i \ߟ?-$C(eH='_RoYM6={֤Ѽim=y;=`͍7ꫯ҂ tq.?O<5jZlWnoNYȿ˦؃lld%bbzs^{lيK~w[}mo럫 7|z)-[LO֘1c|>y yy{_{vk@onĝ rԪU+h_rR? J2dO         @fߗJ_HP7    !ecR8;D 2J*nIo>sթSGŊ Z8ߠA4tP`!n ó @K.D}`|^`ѢEeA`|N+W/ϟ?߅FGG5j_ԴiӜ9ƍ6YȤ8Z+k֬й5k ,l. sX0z&V֗Ç_Ց#GaÆYF~dv={y -b+VД)S|a#Ϲ ,\r޽ iZ䫯B-D zHI}.dc}1b 4i~`޽{cAʕK=<… zB{km5f_~Z`KҵΗ/oFPcvs *ϾfϞ݅UZhf( ڴܹsrsi[ bsToOSqJauҼ=R0:tpkPCy=H^=ܣӧŋ?`@vS6.o<=UVnocd{XjU7voݺlLjcG/[ТêT?|ƩI-]v͛' Py' 4 vۜČ34{lu]ά|XyHW\K:YfaÆ񽍳! 0cqٵZX@ZU\_l:-D;ٸ*?ӧ\@IDATHl.@q΍$MoP߰(uJ5J_eq=(         @&a\5"    ;IA ;wlٲ:~ :Sz] $Cg _`5,bݮ`h],s.|RXL2u>׭[8-#`@g ,))a-sk?\h{B1?5&ߋ$i| |Q//@ot'FO\syUV-H :`*٘||[i:5.K\J{kIЈ նno (;o|s#)ꉯ}/Xȫ/kk=Pe|*C qs`<u!         VA4A@@@HS~?i9J`QzR~TB7R/Ǝ`X0cƌ և֞Aa,`ɸaۂHyv ?lN8B5477… $ ȝ;w5[FŌv#4p|aȒWz@R}T?ԧ|GK!olw ^WT)Og]#[-#5@11c/kǎzW|dH}         @(d F@@@@@X,XnҥzWe -Zw߭+[l!٩voھmʌ*9sL~j퉫sצpH캖(Qc7=6|H@_#{CH}Ξ=.]QFJQ:x.lbpnM  9'q _+::Z5j?^z%~0{)0aw[ʿ}.I?~ |4iT}Bк*W\UT H]'_8|9a!LHt]…RZi{9~׈bŊwѣJ. l 2i3g oTP!7Ot!sh         @ "U    _kB2ӧegatSǎծ];5k0ɓ'eɟ?[^;s9d %NR̙%KWBGڵK :u ,wjժPKiJb\)ڙCIӧKk&'#1}1{MGFy1a%ҍ6l{˭ԩJ, xb=ZÇo=8e˖!󐙴Ul         .@d_a   dPȟA/<9#Ghĉ;v&Mh٢E p \rȵ!@hXhy?hʔ)Z|ʔ)e-\ւaB",{1,/@ &F*^\0gC"=7BBn|Rxzj}71b6nܨڵkKiF5kT&p{ǏtsǏݻդIuEr.첰#@@@@@@@@@@ ! 3@@@@a{hx >}Z3fɓ]:_DѢEu׫QF.͂! t!@,\Pg֬Y4w\={V 4PVd/UTI>B i4/MߟUߏҦMWfi-}~󯏅  Y( BYbƍ &hٲe*TZl2ѬY3.]:I@ _[мystMj߾)@M         @dב^    \ /-!(c駟4sLm۶M^z:խ[-uqB4 R(yfh ,paXzu5m4vɕ+W -ߋq5CWij7E -}w.ى QC9Bݮ]%MBۧe˪I&.@B+V&Bb|'OԒ%K4g{áCt5רE.3gN@@@@@@@@@ȐAfN@@@@a lݺ}1|޼y0ep˗W͚5}A5b!q <z@ ;wN[lqA˖-sK?PgVZn@ʕ++***C@aSX .u.@ȰjB O>9rq5TfMϔQ@@@@@@@@@@ q 7b@@@@0axh29ؗ׬Ymi`+eHo!!111ڱc6oM6GڸqN8饗 MU[Rxs!ߋq3j/>D3*o}`Nu/K}JKHժſ_}rZjUbvr]P{*Tps6P\9eϞ=ܺK{HKۘ{胅='O:J*BSZJB"f'@@@@@@@@@ 2N6"   _+HHٳguV 6}o. 'O-[-Kօ A)zsNm۶-3agf˖-cK.q˗wabzז.ߋ[g |ԯL赏!Jzm;'5j$>--X EEſo$|k.` {Ȅ-^ݻ]|g"{#xk{(G bv_xQk?          @p '!   _ A3Q3gθ; žoxX޾}b[={v,Yx*Vl]hQ~BAò ,oB-[~%YX̙3L2P-\rn@$ b$^ՌӧM"E3N)}r2q _5kե7ߔz(}#ӣG>X,8K9K пbc*'(Q-sT&valmQloo~ooXAR@@@@@@@@@@ m3gA@@@@!Y|nYǎs;v쐷X^l ĆB%3.\T$v TB\@F ! u8x vR q{ƾG[?[]TT,xTRS:w^[  ) !Uٳo J@TIzq駥o/0|ܖ[xc5ra'OVJ؃%lYv&Ogѱ˗BzJX-;KRJ)Zbbs6߳g[qhNPRo_bEjʍmoA6?`s@@@@@@@@@H @@@@@ȕ+4 /mV^K111U3gPH dAq-痷ؗ)+pYYC\Ĺ.x =4zWiӦ.BD,X ɒ9(|Z\,0rSEm\[@JÇK?,û9rȂl\YX=\{ك&쵍 ! =T›;_{s7o^#C쵅:y>z_쾰 yn;Z@A@@@@@@@@@qh%     @ XXW^閄f~ /_miӦ@@ .,YfU|\0mɓ' |ܹsk- ZhEL.< '`'Np=zT#G\_>Z?wEٳg5X zWN:.Â>,{mv) S¸:vz RRi{p>[̙]H_%.:u=H Lxmms 7n %**{B Ɠޜk+P"7~9Ǐ1ś17^:><yUWaÆ^A]g          DAs-      @ ؗ@ga^`-D0` aAa`ӧO'xJ 0H _l?\lٲ)[d&, Ιb}opL go֙3g[fq-'O-^裷,@? (Ynx!{[[@mP@D`vi|驧ٛ}@@R҃J͚7 N_{_~n Ƹi` [/[lќ9s6n/^`N/[[S@@@@@@@@@@ q==G@@@@Q RD @8v옎=/ 9u\aQz ^B<;WՆo $Z[C|),`,, /mX؅,{mmHʱ I1Bä-z$# 2ޒZ?RVGLƷEuM6l/aÆ|2dnv迟˽A6o ^/,?< J'+^ h[O|~N?`^{sR{[l.6jxko ~KA@@@@@@@@@R"@dJ8@@@@@|%6rԥtPo*C@ :u/8ݚ@2@һJw!u(pCn_>6򪫮W_} l= m@P+=          Zq=Slԋ       IؼYZD$ EG[^R%@`ݺu֭*U˗kȐ!Zf_d Nǡ          A 2ȠT       @ 5 vԇ @J2I1\kתk׮\VZCv 5!         )@djR7       A Ν,YPU  Lc>Jf%,5knӵ^իWkذa.Ҷ,RB@@@@@@@@@U t       $,qrt ǧ @ӦғOJIkצ39~gu@[N}ЫVr2eʔq=          Aţ       /RR&Wz Ttɓpk=r-Z6lؠ#GWm@դ          A^l@@@@@@@BF ;u2g&@ .%4tc׿fp w;w ڬM6iԨQZbFd@@@@@@@@@HG S#       ֭ҥ?%! eH, (_Xaڟ?ha|իWז-[4zh-[m#2Ү6A@@@@@@@@@$ @@@@@@@Q ֺRYm B"wԧdŔ Xcǎ]5vXiL'G          "@d\)ډ       Vj^ʚ5u#oK_.~tL4:tR߿UfMo?~m!<          A20#       _&.n%9Gs  i##4|z9,/M7ݤZjiϞ=8qm/ڎ          4        QR@z-]MDh"mVu޽{}Ns          q ' @@@@@@@H_ lNʞ=}@D;$[zv 䈌… u7nݺ:p&M$o[          q  @@@@@@@HG}9sΝӱ@$ TԵă#lu֪W<ɓ'a];           2h       @j L e&jgn@++4bt;\j7oV_=S.}          /@ds@@@@@@@$0vԼdZ@Ire^L sU-ԠA?~\ӦMӜ9sܶ          (@d$^U       (Աcv#dp>}]=]"cپjذN:ӧ=w          ) 2%z       @L/HJ WLu AR Iѩf͚f͚qƊ֏?(o[5          Aa|h:       @ +կ/.y}G G wnii"#3g_&Mܹs޶%=A@@@@@@@@@Hm S[@@@@@@@P &F8Q! @REz=WSC4mƌ.B O?          yA@@@@@@@O`,ckgF@ #u*!̚Ӧӧqj֬fͪٳgۖ6-,          (@d$^U       I*Iˇei4 q $(@Ș8w ?6l͛+G3gm!X          vA%       *0qԾ}~!dTܹ#ŋg mSAjѢrʥs-u          $@d8]-ڊ       K6ImFl @REz=פɓCbʔ)_ZjÇk^ki          @ W#      DĉeI]ݡ \$ЧԽԳsEˆI&^zjݺeom N          !N"      Ai#E} )8P*XPv)::^uՍ7kOA-Zp_(eRX;#          _I؇O@@@@@@ ۧA]vz7BǏW2e4uԐjA=s,F@@\ȑOK^SڶmcǎzoYYd 5`3Iǰs)5"         @ zԌ     (p9W4c }w.#O䪷l٢m۶@2忟j^| @dT,ԿeL2aժUK7t+%KjժդI_ \_8ru%Y`fΜ8 8ǑZ@@@@@@@@@@ mL[oΆ     A>}^xWS tW# {7S# @D XVR-: @{Kzwپ=RqTfMuA%KԲem+Q/FPBʚ5$ӫ'r@H1!          @: N@@@@@'m6uM111dΜ9uCI@ Ξ&Mڵ @RYbŤ.]3gwsiرQ:uҥKHVz-[VJr-;v<z \R         Agϙ@@@@@@  Tuwj{mڴI5޽{]]wݥŋ~n/&O޽{UV>cc"?;ž}3کk׮?@ |h~m=B@ !K.VZZ3,r.o4._mVE%KԆ k.eϞ5dY]60`Zl)ٳ'> F@@@@@@@@@BT 04 @@@@@(I&Y>S.\X~,Jܹշo_vں;t嗻;GU9h"˭,w=ﯺuĉnߛnEZǷ4)ShjР۞3gNըQCs*i!ʕsvΛ7O;vA_~Y,ݻ+**J&MR>}gyi˖-TT)=S.X+ݙ #FKKW_1]# ,P4h|c5i̘;oG 5j,[nѕW^+VmUV=o_7*TP:u4b-Zԅ̙3n>Af?;?܍+zS.)@@@@@@@@@ 2C@@@@@ C<=z;b믿ƍkȑ/THURř-[VM6ulhaQQQ@ mtټncǎu[l_|~ ү_?6Ǵ/-]x-Z:~]r9rUT71yH<ʥD%         A!      %9nܸ{|r['{̙3@-[g{i[d\R}umgʔ)vU7ZyzjԨvܩ/-5k֔=&V#FPѢE5tPUXg߿L͛geϞ=jَ ' .<A@My>XH' ->roAi۪UAIl;vKgϞ=?Xb&4gLl_?Gkϑ?|`         $@d8-     @L:5(K()R$ə3+ _V^)ԩzO>qÇ5~xeɒŅ;["O9 ǏWÆ 5|u{.dgg<x n^^t3$ Y T .y+/X1cTzuuEj… ݶUodzx5n8EEEɟcZrҰa΢6 x>뉺@@@@@@@@@5 C@@@@@"\`qfϞ_r%ns9r$~I+=@ӦM#<t/, oFOŊu]/ Ow,pT…5j(/d,?W]ycwM֭ @#`AZ0@U}{;,9ѣGZjڵ,n>ukSZ`.]:e!ѣ1y<@_u         @ zִ     I\q믿駟9a,XP?Vxqoe!/֯_k{a_CsղeK 2Dwu:wnm۶!byUҥձcGCZ3f^>8vXmٲmkK/U֬Ytq5kLO=[&MTlYիW G˞UW11@!V^dխ[@9R+WFqƩdɒjԨQ:{۷?۳gO>k׮uw{EQ         'GO^    &RTTڹ #5cǚ3g,P^Њ+dsw}97KeaO{wܩ5k(C :qzY}ټysX]7|# ~|wUzuivԩS3gNթS'@,Yi&]_Bk?`_vrڽ{.b :TGʕ+5b]{z\6m5k~WM8Q[emS@ x/ϒ^$/Wg_G"@O܆Oݯ(Ԯ 5j:uիzamGT@wׂ۵kVZũhѢ/%99\lH x>+Z@@@@@@@@@} ~7!    g&`!*^& <#@ -xcg;vh…*U,h1~F x,] 1ǧ}omZ/+WέO{@ݫ9r fܾ} ,oSZ-@M6n(k?߿E/_>N5Vų` l)y@ ck:G|{os#GguA]t?K+xA;H͛7;Μ93&?-P| z@@@@@@@@@$9=      @(P5k`,<1DA/B           `a@@@@@@Z@^Һ @ +LTk@HscǎiTz.L˗/w g$#-~{pyf]|jذap* | hT         !.9G@@@@@@ *Uq7.@~I^ D@{zqF|zG@2(^\=ZjRz {uX;+V̛2M( ?@4         @Tm@@@@@@@pY/p =aÆbŊ^x=jժVX%7G7zJzA@@@@@@@@@@O k@@@@@@@0y۷)2 jIo!qt5ׄLH<H@@@@@@@@@@ ] dLףcp      r']w9_Wչsu! pӧKR&g]" *9h -[VO           QAFf     @VR܉%KC)[@M 4 ^_@Hؿej[fPBaA#'ҥE'.@@@@@@@@@T #3n@@@@@PoQuB1K>a )p4sԴix^#O  }Y~.Ҷ,X0]4|4xGa0"3h@@@@@@@@@2@@@@@@4G |L( h'lC@ <fϖ4 k@Xlz$;o> *Sy@6! %wtҥa<:"d3T@@@@@@@@@      @* 4m**$m,Yn͊ ;@6M*\XP!A@BX`ժU^pm߾ AC+W>{믿_~Y^`}ӧ?S I3gJ۟\w^8&3B@@@@@@@@@8UBy [@@@@@@ 2du,1v9vL9^# Fհa 5k\])S& 0 NG-gU2e/3ϤH3?XڲE3oBP!xR         A)NL      >ZcRT~-F@ f 2"#@BS`Æ .r۶mv˘1c|rٳDžBZAt}H ̟?h(HQG!CT)դR@@@@@@@@@@ D2h     D@:Gl,R0p Q6I^F4a3X@Tؼy7n-[H̙3;Ђ ܦ_{V|]"bݪԿ _u\"ba8HI          pNhF@@@@@Q%/ĕcǤNαBG@ f̐2zu^Ak[M4ƍ@ڠy)S[n^='6]CQxV         A)%K      , ~>JU&0vB@ l,Z5)w2Eq۷YfZv)!~3{üy"rmạGwv*@X&:         A 2HT     g'PTcw?:8 @P  B @ ,ܱyZjU!6cǎiȑnp_J`Ai8^H3<"u          @dO@@@@@HyG:x`Ê:tHołFl[tt?:ĉdx74eݚ7o2f̨ 2,>SLʜ9sm˒%f-[6eϞ-9rym;<̙3fmuQ@W̑;,!@$ dڳg/ض6IhNbK/j<bs ?ؼty*_|ʓ'e ?%:v /ʤ -@{[j˖-nm6ˎ;\0_/8XƄm?U\c~xdH{m-\2~7+6/9B_,ĮPB1K…UH+V̅'V.r-Z!o}5j|I+W.#f{oI:IsJŋGSt3j*-^XK,ъ+~~vbs< V%u[^cmYjm|]޽1!K*ʕ+jժn-           jA?     x|}8A);wtX+X\-Z4NСwyn{gUlm4DVAO,%rK ˴s|rش \1o `1._[ȋ-v̔ ~f͒wtw 0 5kָ b7nXȻ_,ѿO]p^)~ib?Zp\Z6 ,6mҟ^J? nZWK(4 [,|y-X e~У?~+2e_>Iåu_~̙X(5sL̛7?v5h!e˖UӦMcK( s d=]9|~vBecNkѣ]hUb?,^zjР[F=-/"         @*d@*C    o5n [Naa(z˖-.ȑ#q@B ńk 9ȓ' aSo&`A7b~ g;;^ZЋ i,{퇿eMШ~1NF:JϞҒ%| }pO]@ʕ+/Vիy{AvOkᆶX؂-8.GnݺU7ovAmE 5/kvf\|yըQCWڵ.(y4hPdӦMĉ_4w\7+R5U^_*U/7R%ލŋ]WZktt{ҨQ#]q+]C@@@@@@@@@"C 8ό@@@8"3`BF`۶m.łPlYv֯_-҂9sfa~🅢b(~8e:0 ?m/ꇃZ_,ǮRJdɒn]L-[6fə3;kH@bx\WR  }޽Z%ҥKemWP+WNeS[J.7ePVs͚5ni!isO?p@Uz.(8)q>PM?^ᆸE;~o5i$Y`[h⥗^G+WAҼyd6_= ԪU+eϞ=/Ə         ),@d S=    @d 'EEM[`ƍZb[,t^aBO,BKB1cZ\,|X۷/… +@ ו*URgfh9r`*U^4fۉ'\aٲe.K,qAeV˧5kN:][y9i^Ҙ1OisBU^*8ԩSUW]-[H L5k~G}w1crʥmzϖd|9Gz< @@@@@@@@@ 2=@@@@HR*0 Xj ΰ [.]* ,ł,Ŗ˫lٲ*S[F& sNY-vb^n:RX8=ժUSe"U zSu  ݒl]F6Mc ^ vgӧOw3gʂ.]֪Uw"=(0` ȅ z->/^cǎ/X 4PÆ u饗FWѣ-48hĉ2d+ئMo^[vϥp<~'Z '|~M-ܢ={g?8&         )@dhz    p=# #aw Ę? ɰ`C) TRR*WupDਗd_R?ԂL-t׮]n jl,Y(&g/qd{ONy!R?=@ x2e~={xwTEuSUn]vY(^͚5uEz.jժʕ+WMh",\P ,p~5kVw_%X(-)S`wHSӔ?b>i̓K "bނ}A3][]r%*W\) ӧOoɓ'ǹvJ|עE ȑ#"{?2jF^8t)DHT~K/իW/]x!ѿPĉ'4akw C)          Y yp    g!VԩS]Z,]TK*u뺥v.XbiYZG ?˗k. S̙{*gΜ`H K]xPӰ4 pxԐ@&tJz_@GO?>L_l٢%Je˖? +ZhSkiӦkBE͛lٲ._뮻N NWrțرcz73ϸs~bPL= թSG٬Y3@@@@@@@@@@O H.@@@@t) A1( `~gܹsAjԨ6lzvkH@@+VЬY4}t,XV,Ƃ,"_|+ xʛWze;Bt H5qD=څ8puڶm6mڨZjq~d l۶M&LЗ_~) kxܩS'o^ HΤPKwwVʕ}?ydSwzǘq>};W_U"EP3U          @)gq"   &^"42\%`w߹e͚5*X6m,Fʘ1cc'8͘1C&MB";un[2_BX>9k˗K+K.y) FE4|p}ڵktA7paitEbGՏ?q^s5| SLa˲}TTW޷,СC۷|M]uUzWTR=7롇Ҟ={7]_          bA ;    HoAQҏm\g}~Ʌ<6iD-[tK K?Ç5eM8Q?,XB:Hte)k֬!> /FYO1%'̙mO =}^{5M:U]tw.]H",H KL|ݗ3-ZTwyzᾤ! tMzޗKHOJ7ovA0?*[l?tMj֬ n җ~1r}j|+REA#G4|p 8P[nUǎu]w~ m6lo߮nM}=$;>ԊyݻW#GTƌٸqիMq^j}I޽c.LK.߹)W[:uTű          zBA@@@@@ m,Y sBO*V69V׬Y{O;wK/&M /\ؗ1B}ϵ:G@@@@@@@@@t$WP@@@@@pXp7jHӦMS8@oUfTΖ-n6 ֩SGݺusUiO?z*%hŋ߮*U$OZ| v"-ƜRmvAsլYԶm[RmQ/ YZJ@ w׻{ 4Ԝ>Oz ;z뭱9uTTy=4iRȏ'ucJ[BJ,):|ѠA"F fԅ         a.rr4a>     @ <#ʛ7z-SѣzW4eYVvI S֭[]? {gUHM6MvAQQQ?Ꮏt%hΜ9?~,hꫯСCl2r-. #Nc_wv[ɣ&k:o)K,*]bA&Mׯڰ~Z8_-dcϵi&y睪Wg}Yf1˅}&g};~Ν裏dvM.]:f1sL]zׯ_nƌ9r;dɒ|w1Ns~31w;m۶U sizwzjYX=|x Y?]tE{UxqW믿W_u嫯\^E遝3[oթSG?Y!D^Xǎ ꦛnW\"= @'NRT)}"S`Ϟ=nWKS4~m1m.;wnYp͏bsɹ=];({^Zn޽{Ht /`s'ټn{ƍ1c\nnX`Aw/Yj7m>kqƲ>͑,H҂G1MVqejܸq R3miSysj{uϴ?|N6mWivĄ 4|pĮ }iDb?IoOWqUyI6] ॗ^R%)ؗس           d_F@@@@@ 5ݫ?ЅYE럅_.եKSzei޼y .[ouXc]/‚,~i,p.B/,k׮:p<~ww\?,#gΜ.̣}zg}I&;w>Yĉ -B,łB,$rYh?ZG ^,U,X^ӂ<ڵk$tm'TYZw4-т#֯_La裏R. #m֬.b`aaa!~>}b!7i/1 s`1.h\Xȥq~wz'e=zṶ7|ӝ[˖-]]K SZpL \O(kR  uґ#RŊvt {VL؜ea5}-[\#\3H=<'kf)|nfgvo{_|z>9cb x?حr.@B˘]S>@6WY@\ޯ\҅@Z'{I;vp7'6p*(VJTn5묫9Oe˖Ϲ*8ݵkלz3ͫ@B?ə&VobHv6~/vƌ{aRؗ1ؗkX%@@@@@@@@@0 @@@@@RU`ѢE:| HՆ٘Yx/ܹs`= ~8q"N-Æ sDRH`>۩jժqpZjl-J]H|޵3uԘ}8iSLѬYt+k֬IhΜ9z饗/_>UREv[,_uYdqT m]t;-TĶYԨQu:~xqMRm'ta„ # 駟ܹK+3gԴi\Hٳ6m ~)ԬY3͛7n//P@@@@@@@@@@XLiaG@@@@#PZ5auV,k(h+ 78)SD9sDwJ ܱcʖ-g?l_ۇ ֋/M*W\.d͚UwVz\J֭cm;9f˖<;vm_r[x+˗/w;@5k뮓E:t}vŋʕêqРAw8&l2ɓGgώY,Y"3۷oB6=ᇉD  #RRKfΨn f{K ^{Ng?т>QRs&~8홺}.͂7mڤM61$5EJ߇[W_-osߺx }|w]o b^&g~s<,X ιT å^FNFc5SP!ټBZ]s&3&t| e˖Ж-[7ov}k         rL*@IDATA\     *`at]vտo>|8UN1 wńXѣGi~\ڷoBϤ~-Hȑ#j:tЄ ?{.%BO>q~,\%ȄI1粶 +SNSM%"Eutt Q裏dsLl8$?["{H病lذARcz3gN4daիo s=!:$Wr+VL)-`A\H ul̘1!կ؝G+vOc͛7/YWuֹsϛvb?jw7Bc{lb&=}j܇_uU*]^~eٮ];o߾t_}!Ao:mJ7 YG~ 7k7۠֫~n?sm6fv+ٳ           KF@@@@H5AGr=jm'ГO>vt뭷\|*[lqfÆ nnԨrέQFiĈz뭷3ϸ},aڵ.\6V,d/۷ow/m &@?`tkۯ?S>f?G/裏jܹ}g ̴B-p@y'_~nYf/p#9m[6mrUm۶ͭon/<(\َNi-5\B-XB(b t޶Y o>>eժUS|_v.\؅ryYr>͘1^r!.fka>쪴kdҥYbVbҎ;ԣGw=?^-[Ԑ!C\PΝ*hڴ:tht~ 5kJ;;!@*x'/ZK~6pݻ=dms[[h}֬Y3=SI&n^T^$ɹ{>\}[nZJSUr3!V[[`oFQQQna|ʶۼ0~[numd̘ۼBW7nw%7K>C >͛ʕ _]w忍Yn~S*=+ NޔޛɜSVr~;(Ů$k6;+VwرI̞n~{zc+ӧOwwg[lO}Cڞ3)/(6fc_ FB@@@@@@@@@ @@@@ҕ@ ҸqRTTA ] ٳGw3;N<[4ءk :npٷo./ŭwu 6 "/E^e={ ?|0Ayncǎ.?c:;vη.V| Tc,Γ(/F^@)GxZdzB8씌 vyA!{A1nR|S޽兑?o~k %&M76oMTeKD w W_ڵk Ŗ: A+ʕ+U|yyiqL 9k'NfΝnnfs%c_n Hwms,N^{8~?l&) c=&K})BJ5&񆼹wIbsѣGy_>&S \j/p=FBΥvK'|qƱ?5         DA~0|@@@@ ^,J&LP>}d>e˖-=9hc{g矟> u_NOJ} -ȱuIVC $wL;_^=Z.3ᅈ!r"Y7>@C:tH^P:A Lw?; n׮vޭ_-ZΆH}w$͕ٲenVM2E:v"WTpѵ 9s$/c0ŋ}a@Z\X=[!Nw`vu߀i@]B PA"RRB~`A Ez])y&IHH [纆3y={vg6הּJar'n @ @ @ @ @"нN @ @mQ6`zU0=ܳg=ݗ,J޽?vklZri6+O|wܑc=6sN^{ 6,zg $o9X!0bĈo[lQ_&lR I{&{20JM%PB Zl^`ᅓNFlRZk*4裏)~ W_P%@p/Ynve?^6Cd"({jo3LN:m,J~q?;>h2O<aÆ D  @ @ @ @ @`bAkX'@ @ @Xc5?)/rJC=uY }sgԨQ W4/W+{Gc\zUO~۬>M@Av+ltQ`РU?tǩ}[J ;rgdUmqҦx饗rgmݲkW_'pB{hCS Lnm_W.yڦcT~۷oT}FC @ @ @ @ ȩN @ @ %P~wUW]4ӟ 4j 70G}t7jW ,PX/_؈}|Mz^{Up ꪫf1S| h}> ~6l,~=3>lJd'o~uQ]FH 2$%4߮_ok#Gf}>|3ibC'@ @ @ @ @GKa5H9 @ @C t钜}vl )F:\rI.<ә{>묳N\fe} [@yr-k[o͇~K_R5R~48Zm-'du; M ,hɡv>XK,!oԾ߬[WZ=uAG(% /<#|_ήZ=t֭# j> {iFx*Z S_z7jV_}j.!u%,D {rmo/cǎK//| Yof@ _l ʹdGI_ t"-H->euuiѹ+sYgM[mղ馛fM6RK-ij !ꫯVpE/^{ljj!CTAU(o;Zeu]w=%Co3N}g}~㎫RM @ @ @ @ @9P#@ @X}:R-(A7pCnj~PB YVX!-\ߚh@C 3&so-쮻wܑ;3ÇO>}J+eʚk5X#>{CGq%~qZBR.KYgg;8sf?￟\/ ßf 6Ⱥ뮛y睷oxrM7U_[%NϞ= 7,UPY . /܊Uh# [曫P&|,Uji_һw8?N~kVkޭ}#<#F)w{%\@=}W[WYeRKWҁFT @ @ @ @ @A6Q @ @@iFhxq=T)@z R2`*8`,|͗DJϓO>G}4-!+B٣GFXM:rJj{q h ?jwk4Zu[Z:_kZqU0ΛUW] .f+rf}-F #P? ,3p ]lŲZkeuzW{<gS`>"+Xӟ.'tRx≬ڪs?s=N;-R_~)& @ @ @ @ @ QA @ @4`,"СƎ[!<U F ҫ;XzAU",R-2/B:žy駫>>mY?I:.S%\Z.RYz3V .`&{n*^ȳ>[%ر3TKM%Ա`E]trFLL"~q/Z@`mѣk4A@ ȑxryw]wU2P}sռWeY9{YP˳£>: ~*W^9lU%sW%X"ݺu, j_#ddM3h_z}y9쳫/aC Ŕ`83 Žꪫr饗[nBR7]޺2ٞiݘ @ @ @ @ @J@/ @ @N) اS^V"!^}*Bߞ0ݻo&;o\B$\_:0ï_~KFY/_| ~,A>߯:ׯ_عKVK~8-2Y`Z-W$oɁH-Hy>=s%k͈#y \s5k!SBa;|ԨQUmݖaÆUsyN/ 6ؠιi(ž4D @ @ @ @LE@T`l&@ @%k쳓P=Owީ!K?_Px훹;s5W9眙c9&g}Ccn~X{@7x#z|j.Ae./'%YBAKFQ=z4:t(rubkYHדC*@ 첩&K-to]>ղP|3vتrZk{z} ,幥ٟYJ+R×zH||&Y>g _8Yd b-V׏l|OB6kz?tM+s5T!并<ˮ*YykWGXb4҇^xᇫK ,ѣGW_Y}S-Kd O5 @ @ @ @ @R@d[j @ @h%.X, %L>CK`=pȑk׮UlV4嬳Zm+!ϳ2K03OX{^zMgiƍQFM2{)+e.v/KʔÇ\~ZNɼؔ0z@g=,e.7bk"@/ygc6G|[}Gc n kyO~gCW]ҟ}<ղ׃ Ka /42nݺM/%<|\cJ\yN)ݻMKy(sP4,W+N<YAe fg?YnswlJ8#6,`K {s뭷Vwߝ{,e{y&0`@J dY\˳rywΤ|x.ᴏWV)A[ @ @ @ @ @@٩/ @ @W@O^{#'Ь~pP!KB=|deYRaVE3f4 KdϞ=` Y=zTR/gF \jѣGW%t%^ LeL%HbN9z (,/z c9epר#UX~|~s-H@s |%gsF[Kh[ R˶r?M Y"\QH1ɗ噣5\3&6qc=5sA / ١__[K*-s\>b͒[nI.I0䁧9Ôg'_/*٤TsW?KLmY/!YD`ZQIoEɹ&UG{/y2ɦ^{-/$`Q P޻Yޗ?ߗ CYk Tu% @ @ @ @ @в(& @ @Kg'[oݹe4R/f*Ѹh,u=:z5=,Xr] +tѨ@egy#d;fY-<7>4hkgfݒJN;uQ @ @ @ @ @@]k}Œ @ @ @o99:{d5/n>Ժe2|xn?Z'=z$gx`~ @ @ @ @ @W%@ @ @ @A9a4@s lyr1{2Nh @ @ @ @ @Z@d[ @ @ @:@ ֭S `4l%?/tovrb]5\#2KCէI`9/O>b#:Rj%@ @ @ @ @tnA @ @ @ V<68䥗:=47.y+3dȐ)c#/УGr)GYa|G @ @ @ @ @ q* @ @ @4InM2X$Љ3{C?m=Hr ɞ{ޟ_~Qd_+u<}M.,dgxcP1 @ @ @ @ @3 LWX @ @ @ @ƌIwonuH@+k kr%n}ȜdW\q8nKFJVY%?ב @ @ @ @ @-+ e=F @ @ @M&P &Y#9?MF쬣lq'\ub-oyTա Jn9YmdCG @ @ @ @ @+OQ:S8 @ @ @4@nرPh ~7%[5mL$lm2x\2d>@߾$^O2zh) @ @ @ @ @Z>Ӊ @ @ @6x饗r%_W _WSyܸqYӻw)4oOaG7}?|T4@ >}(=H昣Ft /$W_*l02_}՜?u]7p4i>sI[Ԧuxӟ&-Sɹ&sU?’ @ @ @ @ @5f&@ @ @r-U˛o9&ǎ?sONguV?W0 >l?\wuYx3묳檫PX@ to}+Y`C;xy/g,`rWd%^La*!75\S1ݗ W@S lerMI;+}wS24 @ @ @ @ @A9  @ @ @O*0x~<[nykgxg 7ܰkEСCsanl͖QFM @@s lm!P̱&'<`sF$s̑x J!CXN X\3f̘j/kǶO\Ҟ5뻹]6dРd53ln'@ @ @ @ @d[T @ @ @TJX㬳:GeY&뭷7Lamgnb"@ X:#'yh#OJ<2;y饗rO5k&ƍ0F?4%e@;9gRaO}a;K @ @ @ @ @@L_L6 a @ @ @+Cn2,YhrQGM:w^Ǝ[~*_WsϭB.(sN9昜y晹+3|Cɲ.[mb'm<$ԦQFN-ܒ{jcڜ/  @ A6E6Ħ8dRLڪiZe%qOz|oӥKZ0FmmݶYB 8j}]w ,gveo[^||_7 _}wq{ҷoN)i)z7yJ+塇Y~;砃|Pm[kgذa9%3Ψ*'.)'Ly /L_~嬸U_m!P><o&wߝ{1w޶] @ @ @ @ @\5Z @ @ @k׮KnNjK.d.>)0{YSƕdToUalA5X#O=TҎ7x#j\}Ygʍ78Sl#@N. _`kjEVX75EOJ#9M?<-XN?3 J-5A[/ @ @ @ @ @@sll @ @ @C\UHc)v 7TC=[ J^=93+NrqV[v'6^{7#F#ix `5\ y뭷Ri>i5a?t2Aj|3&/&e%Ode'x"w3L3X?sΩK(b߾}ӥK*xx*>vJ0|=}Zg k}ݫgL?_򗬳:z'^P~Y3DJ;+ry䑼+նXQJԞKyLy{j>3S/J(~yyGSKk-ص/{=' @ @ @ @ @  @ @ @@(/e8p`Ʋ{T*_?2n-zJ[l={ȶgڶOW})+;0߿ 0ᴵ^;{ 4@7P @S Բs'?ܔ->O?9M_xᅵgԨQ2dȄ6hjϟANiZZ׵K i ryU%q=̠A2,T}coo^S+pnݺU:G?Oզָ馛_~C2sIy~ΟZ[Yj|'i@[ /.J~dR@ݶC @ @ @ @ @( 3^Uc"@ @ @LW^*>2w]]tH ><Zh*孷ޚfJ%H0S?{YuU-  @IJM2X$Ф_jj&lp ˾^zUKӂ .78Æ ιK?:mJM=<裙uY'W|:Zj<?Y@^OBL唚 @ @ @ @ @fP@ : @ @h9V[-{ova*qvW_=IK/{?I}%eرU7W2=\-b矿j368$ ;Ʌ4 8{Zi/{d=s](ˉt=0>}T;o4rȼ>XB%O9q9ò;桇QG={fWI^3&S{)59SOMk"&Iy~ɥK:%@ @ @ @ @tAR @ @g/ɩZ5^xᅓ [n9묳2Ȱa&?//9DL<4LY~M]wĻrwwO  ;58 H=4Z.S\~y&ZcX[+eZc5e ,G^O Yf%sN {g¶lFYhr1T[lEv}<0%(rZS tN}|$ 7tSMi @ q喤BG(6^G @ @ @ @ @N% S]N!@ @ @[{^zj5\zkU˷~ _ZEn喹{' |].j߈#rg%Ȯ: /PM%7ɨQX+ |L]7JM(0thb^{5gp~oRPO%Q69'2\s堃7|UPb ?Cg՗sY%}}$Yg'?^{ 80Ju~LO>d?]vͷX^/RYk2묳fj}J%S{)m7w^ O>5Wva{i)ЧOroWI-'5ޞe @ @ @ @ AvK` @ @ yƌ5X#{wvy|6l{V 3OX`UxK Ijr}U}k_˝w9 V o\uUȞ={fذaѣDŽcJn>vM7e 7L O%0G~鬾o/~1?s$@&(eaM н{j'\r'8䩧RIW\qEuv_z,Po\wu˳A e/>`-|r!U_|q~_kK. p/%z9K?i._暪r\ |7^ow^׃,H?璩=9眵S.j|?Yh(ڗn1yd[niC @ @ @ @hx.jSW@ @ @P NphxO Gy竐][36d_J z9rd2#S;3e]6H%@m/sR}4fq P̑G&ߟZPi jw~G^fec믿x  ?rp , s1GMkûロ< J߾}uGk G]KiMcǎM9wOTa%t^4o\y: @ @ @ @ @Ct @ @ @@4LU?,HWcJJKLݺuK/Mi:,|>A%\Kr}ӛNC/a%ȒYJ`:oAS=h*;fOe7Owݫi*rZ;%F4Ϟ\|q'xc?C @ @ @ @h2P$@ @ @W_7/ @@ :0[ @S 뗼v 0}.9{Kyd T ZMAș[^}>LV &w'sΙ  Vr @ @ @ @ @ $нjQ  @ @ Ф-X5>F1I=zL34ɶ|ѧOlN[ #yP hqO.,7oN?q&1_nJnm͓iO͋I]tI7xE?6,9d]ǯtRja \ @ @ @ @ @ ?ot] @ @ @ 9Նz^ @ P~^һw(X@.ɟ,l&e5929d]Vp 2 !J(G$묓c*9$K-!h @ @ @ @ @@tmV5J @ @ @DM2`$@`KN=5կ.dWS/Ó @S lqr=s$'O @ @ @ @D@$^ @ @ @ @O&P$rhF6Kv=7^hFIQG%?q2<X`dذ;Id睓#h  @ @ @ @ @S9% @ @ @ @t 9xc:OpRc|&~d̘N9$ -t@:@G$gr*$=ԉlh @ @ @ @ @9H!@ @ @ @S}Kקv4@ɹ&wݕ'0)kK=6cJ@s |w'6> Ӛ  @ @ @ @ @E@ @ @ @ 0ݺ% B4K,rJ'W^i53&:4)ao_t@H`kM;mdÛP  @ @ @ @ @' җ @ @ @A99N'iJ7{N3''>{t T{䗿L. 0% 6H7Ydd5Jƍґ @ @ @ @ @:@M @ @ @xr!L+Z($oval4@GVj?LzL9'YyN˒#LK*ӟyi~N @ @ @ @hoA}O @ @L/k׮3Θz̘1'BYArK#W6Z`oKCu_-=/li''}ҷoU:@.A%묓l}rt @ @ @ @ @ LוuE @ @4@ZÎ;ݻ=Nm. SB @ ^##@6 կHs}q7~y%W[o9h&{L 2$ѣۧ @ @ @ @ @Z[@dk k @ @o?#'0poNVbRFkBF@ _vC~ͻoKH[mݫ0A>k%[r)'k<'m @ @ @ @ @H @ @ @ ,YtE:ݻgv~; @@ Ȓq꫍Vzh>0 ddFp'oA_Z2xpR3 @ [r{%/ymy @ @ @ @ @٘EU @ @ @ 8i~6 А?^hE@; \pAɶN9HKo-;vʇ7~'ɭ&%|VD5oO߹"@ @ @ @ @4 FB#@ @ @T=)M,L[l)4|/KdC^EhLk}m>q3?S?kD-9ç~=^=cI.,6,Ynl @ @ @ @ @W@d^ @ @ @N- gWL.]&gݳ;O  ̒:ks^hO3LN\Ӵ @ @ @ @ @@cl  @ @ Д;Sv+ƌmݶ)= :@-8O>ٱǠzZ_`-<:4%{>N>m'ߞ{&@@=wrE'G{  @ @ @ @ ee{TO @ @ @if;vK(k6+ @  {qG{'gh @ @ @ @ к [W @ @ @;YguR N%D: 'O> W2"pw[oMƌ/W.W\w]2n-%{Үn7[W @ @ @ @ @ZNUrmj @ @ 0;cԒdr  @$0p ȎtJzH. ?pڻNWI{E39˒OY&ꪶY @ @ @ @ @9Z @ @ @f@_jvOC s19 'o ~5%зor&$#G6n>Բӭ[raݸUf*!ߟFR75Fn @ @ @ @ @@Gّ  @ @ @@'ׯ_6xj$7: U`#f0n>&]?0Ge}l;vlƌ3Ź+MmKv5]j'˾ݺuܽ{cwM}߇{r>ܟ܇?sCڇEM|]o+{Ozje{&ߞ|}{rO]^/k5w}{n=w}w},^_OcRKRDgvJn9O,S$-8 @ @ @ @ [ = @ @ @#P]z o)N-es )2p[':,z`K}Y/LX_J@f8|[ߚjPdA7z@e}YșxY,!|r^=Aĉ{z,w_-q\-D_u^X^4C'ٻ0)9$ H `VL *(u]19gQ5!JRE$' D2C3_g3L:Tuusykv}ƯSȭZ=:+o]<2li.VOmfe֥5YjN)SFVSsM2!{jI&I/ =7KkX         D@s@@@@RrR)Z@ ,8fcǎಭ߹s ,c)MZIh`JJha)~8aH,XB]"i ڴK-ևzk L>YP]߲e˺^\9/_޵e[WBXF7b t$կ/  Fl٢m۶u$V[-nskV[a0AR !YX6گã9JXdm?4שpN L>YP]CYm+zjJ*5DuIkJ*          {coH@@@@@0M6in/[o I:a#~YHڵբE`🅓~-4&H 4s C{dda7\cCW\‰,@ԂnOj5XcsrʪRJk 2bB^FEx:jÆ mܸt%-ZՓA g$cH;boOtw?jik~اl^"ܜ9s\8C@fujTjU7eř@ 5fϖx@in @@@@@@@@@U<lpr@@@@AЧJ=zd9$Ĝc, dYL貅8p -ĂAB >na3J.BNdP m۶GR ۷/,Ȃk,Ȃkl\V-Y( @W9w#ΝsVYjuinnyh݂ )Lhu5~`BA& [}mz:t?;<AWf$Fۼ@Y@2Ezi0/pv@@@@@@@@@o 3z@@@@ fKȔulܸQkVr2k֬qs IHHBb,#yR ,X0 D%Y>`|؍4,8o.T^@DN 8pa6`cAdt)Y iԨB}Y$@A#RҀ188@[Mx`[h6x_ޠA,8¤NLFR-jighYH[l&M$i[怀7t҈-H='+'          '@$    @L Ařc\ … ea2~9 (\,aÆYL]XFK_bB],[̅܂llSN9EM6 f͚RJ9GN@Jԋ).N?]jJz:"A ,y7oϟV[`t]޸qct׋)D},%KfGq'[h͛Vo3!@,IÇKgc'          AJ    @T U",bΜ9;wk.o>*T=6iąڵk+o޼!@ XC.^իW@תUe˖vi1!ԋ9OZJ5`-`AD7sL/YÇUBY\hǂ F=,-o̼}v(PiFڶmF);L M.'s~'l         dX     @4 W>Ƴm4}t͘1Å̚5K{UٲeբE 5o<,T&9ݻwk…YT^݅״kN,ajŬx/(=qcZ\ xǟ~5wsYܪU+nڵ5jD@q&n:͞=5 lvO?tqر-0 6LnyϦV߇-@@@@@@@@@@5A@@@x}"8 MxQRL l߾݅|'U^=]|֭8 Y  ]d!6cǎ7|cǎK/UW];O ȮSs^CBT)飏"t/=* LѣGtҺ+ȳ>1w8|L/Rvڥ.L}qt޼y3pD N QC>\: A@@@@@@@@@ 29!    @Nʜ#^,h͂e"ׯ^zpƍ+ F\ɓ'pQF)._~)& P/&uV $)-[Gx,c 6LovjZH[fEg} 5b-[V P߾}U\ې%X`y y_yD*T(A:         @@@@P TkTZ5͘1C/ /)(P@uE֦M[oik׮4iR$v>!@ l)wo EܻUF /|tms9@FUDw}ww=w}wcB jՒVzuפVY]#         @f̬!    q"_~Y߯uֹu-- 0 +З_~+Wy+զMM<9zKw@ V,1iX!m^UN-]Tcǎ¨fo߾*VXnw#@ w}w7|c~`=Lij@<7KI+KK+y? @@@@@@@@@ȐAbc@@@@@ ƏFiذaz뭷`QHt=aÆ@ ;c4kL7os_ޅq^tEzꩧqyiРAjѢ{8EӮĉݽu'^GӔ{u̘1]o4k͚5Okղ_/0GCQrҜ9qtfI4aY~gGKnq+'֟۶m]gŰ>F==,|A]xz'jժ,>ÉSN;ƾk{cALĻモ2iPy~1U?         dD Ȍh-     'M7ݤ={;ս{wɓ',mZ|y=!!A}-\PGsnݺUӦMndعTw^-]?qO?ǎڵkݽeX}62rZ͚5k".&{%K?+VTRjڴ>Ô6e e-[Jsf8BέN{5sLy%CFj@z7Ν;5yd o߾v8痰O 3,w^\UD ԡCYfM]c9cA]d%.KKH  enU~„         +@dDl    ėΝ;kƌ.;T|O>j֬YPB۷:v-kI;#9= G o]3:èsvH2'֟ ddp3|>dD!FY 7ov:p@ծ][ ׭O}$w}w}71!ժI_}%>R҄ @@@@@@@@@@ = }@@@@@ ,+TBB vSNL>#Y1gaRv2r-;@.ԬY3{ٳ&M{Nz֟#"@VҥҾ}p p=McAun8_~9y.;ofϜ~ ke^n,g(!q[!*,Y҅@Z`Ap}-Xx}s}71!@J*k'u*p9:          @_|>"    DK/ jɒ%*^x4i,_ԩSea]ꫯVŊluV{8q,?*U{G6lPW#G~Њ+ԦMwt⟯o߾^x 8>qÙu߹s>ׇ޽{^Ӳe\]իW룏>̙3աC 8]x3f|Q޽zֺu;_~q̞y\R:uGƍu-N ”)SܱWZ-ZhIf#ږ-[ԲeK_RRf?sw=h%jo@IDAT\??6"{ծ͇~( tCj͛' 1ծ]]On]t>fqKc}V}]]wuΤ^zil[ @ڷWO$gPg|_Tg}Vcǎ փ{6O^;X _jW^y6_}K|IU\Y!:rGաCԿWxӫCMRqlm۶>͟?_%JP>}=Ffӫ ӧO_|[of]|INNdt^?n6mr5P瘴pjp_ǮqذaϞ/^jp{ gJ̳QZ'z٦M&Vƍ/2C_9؞N9$*`eҀ҄ қoJ]"@@@@@@@@@RțG@@@@?7xCvq,{nh1xw뮻ҵ^{\9Y] pA"7xƂ;b+4h-(q̘1n ߱0zJd)sǻ5k,]ϯE\J=7I={ԱcG͝;WFu~n H OÇ  I`it饗زVZMi6|,[ouA {F3 \~ z+[>묳ԪU+ca~P]yjܸqׯ ,ӂmG;;s~6f_6ka!.h~G\ݗ2m4e>Q 8ݻS۶m]d} SCJSJgϞ.4u͚5n7 5WX0H"tl|СC# X2G# P< HRү.]r-j,j_lSÆ ]`-c)޳`^Z[͹yfu-X;gf^MhǴj&MN_sSۆ3 .'-)3?痴c} 4KQKy?O̳QjYq]uJ*~XM~^D?&@ =%x`B@@@@@@@@@A)X@@@@@[`.huQa!t/֋/%Jp [d;d,C qa&MkXMS^$Vʗ/\w)ȂXl*S )|OOm 4uTr`Ο}Y͙3G/J.pdI 4,Pjg(6YpXXg `Ir4^wv0ǻw΂.m9sOB"gϞ+W뮻΅Z֪U˅y晲N ´ctp駻e槞z[CV4ٱc 8 /{*YdzhFҡCׯ]v>|aGwv1,xтL-ѿ8vZ(f|\7&$$uj5\Cw Nd5Yˌ39sfA4Yhj4)}&ze5@#)xe8Yn?cpLgsV[eS8`Bj5ms=z^wz!7?ҫ pC{^ў,ѣpόɭV}]i>3Qzg88/?t6.  p< ֭[ݐ,T=t_dQL p#~b5J|}A@@@@@@@@@xH q@@@@@ M/^\7nL>_XpСC]@^ѢE]0#GJoYfM4q!{qA7X9jԨbŊ--ϦB:zB&OB݆筷Rj\\d6Y,{no}tѾ}dN֏p'-ZW^,"ֽZPN[ZiϞ=e;6N SiӦM- ]&wz9*TІ "Ci$-ܟpCns5euN[X_S^)Zc_| [k9 aZB.\p8Y&zK.Q˖-]l6Y kS803&[N %XVj3 j+W;G8l˪w#ϐÇ݂=/ED- W>涀7*Xذ? ys'{@@@@@@@@@@ 7LrSs#    $`ݻww^ Z8hNO7ŶDǚ/_S'Y9sP$o‚%w! 5 nUXQ=+t!/w }]BwCKl]rV'cB nO?jժו*Urck׮,XkFwX_>ezL6-MTLY i cyhѢ|ZjUU>r{=d}8qb'r*mhϏN]peQ(pRR?BpTt9.iF7x{Nw7k2dƌk68pBj5Z6͚5Csoٲ%tUí GBSfcl^^7ΓN7};7Y q/Fц ƍ'Yi/ھi&Ox4DzA#sۗ@@@@@@@@@@ h@@@@@/Bo>;v섎;WZUʕӟ>(x: ?@#F g\tY?,ꫯvsիlٲ@C?B ;<z߾}i,L}7yV?5mֽ?&l駟. I{TbE}6lG[ LrTKoI-,yXHI 8z.ӧOwvIqխު͛7W^Zp;?;w&DM2E5kTӦMCWGMԥKGdĆk'Fdl\E޼y]®3ZV3s^ F_u릒%KN=[HƩ[/#Gj޼y]ݻ֮]\хpkgyVd5M~NvȢҫ?ӫ}~I<':<%Ȫ[nqõPJkԨ! ɾ,x߾>w/P@b7,\`Cz? D@@@@@@@@@א     Y*`azSNua.r,=~VGq۷nFcZI'[n]X~[-& oԣG0qF3ƅYM?k֬qˡz۷owlA-o olYޢEǭ`.cx@sUBB },0e,wu㲃;I:iA4d˗w֍1…ڲcS,l;v,@_tnpiO,̅Z8\K/^w[믿^['5nXKv¹WpԔ&M{cY=jH<};J*eL @v ؏!/˗ =ӭ;묳\=rB̦SҪwؑ'mMO^`z5*wq b4G}q;vtvZ"z7衇4j( 8Н_~*֟iϯyzg88/m6@}ҫ3l문,<݂@*>_5qD+ܦ,d.$nbB 4h Tz iyTA@@@@@@@@@@  @@@@117,@ x!u/X1PH?صkW?ܓyAz*Phрkz{,p1w/17o^^6mW:/t# ]5C n:pg +^ {{ӦM xan]R^X;vBܶ7k'|r`a ȑ#n_/ڀZa?c1VV-O^ySO ^:pBN;]/  x!αsn9zA0%KRΌ.4"^(dફr]}/mo}krmváCbYf / gn 6l͗/_w[l3r*Th޼;]s/\]+/X5 t ԪU+`SFk&8Sfrbo>P\[o/\r% s#to&N{nӦ&!/9p׻g Hj=SXլY̙3] h}/1jѢEupk;׃ V/[mj5goq\VMh|WJ* (9sj׮x wpO)Q”)S{Wݮi՟(97ozNJJu]jCfRzȊǞSNyo$ͽ}۾컈 N`ÆX3z1gc#!         @d nyi&@@@@bJ OO=bjX \B:jҥ뮻t- ȕuR/tDk֬'/8$M|oڵ r9 7t}%ݻ#/xQe˖Mu7Lg!~_{ޱcP?wşPٽhÆ B ݸmnؽ+^v-{Btj֭:o={ tQ+#hck CR…e}EU|궳gϖ~im޼Y^PH3zA#K`ĉ;关 nu]~GV/3_Ӫ]R3zF/N֭+/p=}z5Çeͯ^pfS&^W&Sy2;p< Umٲ=fvٵ>пowzx@]tɮq\^{lwHI/ $          Ae`    @| ןgqUW]СC,jݺuKw?uW]vlkiB''O6f45 7|3"/~͝;W}}, ^>iK9_, Xh{ァzʅY0Y5HK411dhcX`+ ~P_7p ᅌ\sE <+}Rz,@@@@@@@@@M9,F     ^h ]RJݻz쩆 f)cxJ[֭&6 ӽEɮqqpر] 6JdGє)SGiԨQP!+Vd@򾟲< (nɅ}zW5h ]~.sU|PĆ Vz#>7Mu{4_Gw޴iS4ko@ g^7y?-_̚3},          yޔ     @<ҧJ=zy9$g1B8ck 4Pu%UVʛ7oN2Evܩf͚/X۷W|3cFмl-+}qwŤ޽{_/Ԅ d5{6mR ec3(C/G %K?p饗ꢋ.RB(1B.{TK/I\          A)@@@@ +HcI_շ~I&駟~rn5k駟X[…ci،2)}v͚5K3g5c ٳGәgΝ;*T3ԋ !s-[$ Gָq\>w\(P@ڵYg38CZHDZأ=>|Zl;Oݺu#L=:/-F % ( "XzMy          @ mW"   %@OXLl@ -YDSNu&MNs͛7WӦMUh#'D%͟?ߵ9sիW`. }.cǎ\ru3Ņb\\yjy{"{t(N/gV/X@V7nYp{֭ǩF r9➳gϞ-՞xŎ9ZT=C xw||yb0K e0         $@d.sZ@@@@ '{}9:Y)}v͜95 ;w6oެy~C!-"O:$^Vc!@ 8p@K.u4/… ]cgfaڵS- +ptET?=/w^Y`i|֬Yڱc .BZj0Gx{l@V ߿_-rj6?xʕ+;tŋg9DW_yDP|S:(]B@@@@@@@@@<     @O,\E6mr i!ѣ*RN95l04hzpxvcΝ;l2ז/_;vLŊz.@-3!ԋ9-|=%/gOck#+WBΞ=[ssO>di?N,X0FPX[=dllVW-[VOn@֭[7BGC@ '֯SsW/饗*Ur̜@@@@@@@@@2+@df@@@@ CȔe t`9 5k  m't-$ضm voiǎnc vFfPM6U:u~H3!ԋp CJw%;S^u"0Xf v/^,9V6 o\rLA 7ov QmsӤIWO[תU++N1@ FZ?nUbp @@@@@@@@@ 2."C@@@@8^`MX@ :t(a3VX[l bŊ@Hծ]GZxd5TD, @@[nպuvZYիjժ`۷o㱀'Y0ׯžsEcE3nV եcnbmt'l2:֭mnj ӭ(LBjF15~VW[=muʕ+]@u[k"Ej  ycʄ @ ؏\ |9ˏoK[gy9         dL Ȍy5    @%n"{qYa(] PjժyMܖVLl1G =* G%׻H W *VZ.N:-[PSM#uԋQwbíZImJoSb0*`aVgXoVuIW\Y`HA6Oެ>!p:UjAmmCyfv6Y|fsx 8XTiT曥'&         Q @d\$    q}2nģ;d- ςmܸQ*TX8M*Uܲ+U+&iJ %`۷o֭[4 ۦMܲ;v,ؕ%JO-Ԛ;Zͭ-Z4= Ěb]#HÇ˫?:l_[nmS,XUVu6V[+_܏kl0uК=3%$$[d`7 1eBrC{M<3H} ͍pN@@@@@@@@@ 2Te@@@@ 'f.%A W >,>B$XЇrʹ 2eʨlٲϟ8OܹmJYc&ٶᎦe$ aB g͒ڴ,N=5Ct @H?fFOyuE~]mE*Uޫʸzj"E3!g8oB.ƶ@QwVZfN}C7 CA vzHzmm[7cp @@@@@@@@@( 2.]E@@@_`F`޽.r˖-n!#7[ga64|*Q +UJ.Ӕ:YmR+^+&%fj߾}{`Ϟ=)K)]^5 }-v.?y˖:x׺Y .- ֶZܟ۲߬>zZ|*Zh0 44,Ԗ[mL @,̟/  K1@@@@@@@@@O f@@@@ }@bUG? ܹs[`ڂO,lB-&`.B!fa'֊)lvPB_f66z .LYxJ :fc1mx]j^Kbٟ[bJ-!! :ۿ |G:KjC>-dȚ>-` Gz1{\9jIKH?>l'&z)饗*UT\XnsNeѭO)X~8Zܯ䶟?]ۯCu)V[VmM^onVK.[mF~/5VcZ۞sAv&zѷ:TҚ05eԲuBMsVk[5ۗ W %>\Ay}V;q9^M7         !@dnsN@@@@l 'ۉ9䲀XXB6?4R mdZ,l\;WMc;~P[C1-_jB~GndB^O=Z]ڼYP!FXyO:TzayCI&/I@L XdϞ=]HdŽ @3Ŧ&еT l;F nS~iP37ߔ5|/.L1B^}Y}-y!?KY}K7KH/,}d!'J}@ >,@@@@@@@@ Bڿ_7.N)A 51LW/i2kg",)JdB,@qZG#|yi i魷sͥsϕƎ @l )#4{tԪt_         !@dnsN@@@@@@@TIQ92)@yGjDZZ'פRN9vO>F ϱfDjI?/=/=bv(THFi"i@ ƍCU:@Ґ!j@ ͕I@@@@@@@@@bV Ș @@@@@@@ zZ:x0{JLk.]oϗڷ̾֫;nKCNm9yR,&3~|b(d۶ҀRSOI9iti֬ C@@@@@@@@@ 6ʨ@@@@@@@@BuƍE"L`(Y3i:i4g…#atg@P!g8B6yiziРPtIU>}栗5֬ɂp@ JʔxC;W*XPܾ}-[t@t@@@@@@@@@ 2B.@@@@@@@?ʕ3ΐF3b2+pԿԣtUTJ̙Ұa /H%JDjՒ^~YzyiҤw8=ZUziiZǤ/֕F??#  K~+կ/tplQ!         Af0G@@@@@@@  k46-pI['~[R"щH*uhmF{wwoiǎh}`λV_iE kWig @ Vz-SzAiSiX-B@@@@@@@@@ >[       @o4aBq-ImHeJKW\#FHI/2DʓG/zǐ^痮VZ@;61sm?KĞ@ѢcIKJKݺI\"{썕!         ]Af,E@@@@@@@ *U#ؘMC#GznM2EY3!|P:iK2H_}%Z#ܞ[Й3fHժIW^)5j$ &%${CbGvmϤモ#1{cg@@@@@@@@@ 2d9.       a !#:l@l.u" *}sR|?wޑ6l]#ҳJ7(լczA3=13 :6LZR]zvm'!+Aȟ_i ⋥>}ٳc@@@@@@@@@5A@@@@@@@ T:w? ʡbQ6]oT1 լY&Y?DZ^doD˼޽@ W.ztMs%|m[&. @ //4g/Զԯuk#         Af*D@@@@@@@ 4~}{Fd{bK㏥zOG_Qr5矗zN:)U4r4n5pGSHkJR?!mQ ͥS>&Lח^|Q:|86(@@@@@@@@@8Q OT@@@@@@@/ , xkJcb ibjXt#7ldIi@iP#:uo֭3 q/pҲe?|PjX3&Y@@@@@@@@@@@Ar   cNm*?2B%!JLᯢ4Ҡ6 I%%*EQARdy(uױ|ٟZk|Z>u@@@@….]Q"2Tl_^o.5@IDATڹsz6j|uQ#y̽NvB.-ӂVΚd CZF4Hn#ah>         @L F#      D9H*IFEb#p3H#FHݻk͜eYN퓺vJdѥ &MCz΢ Ge/ >̴u"T@Ҝ9ȑ'H5kcxN         @ 7!      Ď@n_R=ZvO{y]q9eeK\״dT4y4{Էoʼy^$ |Uit?c#@ %]u^xҀRݺ61         WH(        )a4sfԈz 9>+ @Z#F/Vҥ9_ v:Um9AliIcHÇK<΃bh7 [ZB:TS?[!1-P#{aVRgK4 G@@@@@@@@ c&D@@@@@@@[WQ )WG^ZfR^2zbivmۈj+x /H< Z u!h/,M,U.'mݚ#H#@4*VǿsJܬt5oy(;          AFm       9YBoƏvɭm*~AvQ#FB Сѕ9d[xqqҠ 6w^~ch|nVoihjUi .}җ_JjIH,4@@@@@@@@@  o*MB@@@@@@ny'AH,`ԭԳSGqQʓ' 9dm!9iCJ=zH]&͙broV|P:TVMzbĨ@ҥ}Ԯ폍bf#        8 s-A       .PQmۤΝͥ^;ޖO 6kI! zrHcrIo)m+u$-^|'Ê_[j֔ MB" J< \)~#fώa         c1       $n,I-*ptґ#{Iy&1bZhڵk'\"M+:uR#6}7NjHj^hxqiij ^Β?3s< '$ .d[JA@@@@@@@@@ Zo      9Y`ӦM5eU^]>l͵vکPB޾ʗ_~YVJfKU rE'2A|5h ԬYZ =[+L޹s&M!C$ܐW64m4M#ojٲx̹:od '=?eY_k7\k֬љg=zOp}9"GS>O>W__&}0+>g#G         9@@@@@r5gM8Q;vHG\ŋ`rz˘1c4zhoʕ+kÆ }Ni@wݻTl;'NKZ Ν[ݻwO1klgcƷzKk׮͔HʻCZ0)@1vɍMҥU͛7,@YeK%oiFUV￟Ƞ>EK"m+-]lyf<U0믿4jdSrIvY_-u?}U9Ri) /W 5@@@@@@@@@ 2n6ME@@@@@ Z5k+ɓtA2K048n8KT% ~zW_dɒ.TT r.'@T X=K}&߄#Fk׮*VX;c:թSGYeK;v֭[?}l G`Tv ӦMgϞ2ڵz!p v>.()-\Sdmj.]|r߿?~zThQu!v5VfE;tg/W2etsP`iQ!H ` µ=2_R\\]y         @D J!     @by&^k k,^xRZٰaC{)m֗*U ʬ@T/F@pk]z%Q.p}Ҷmқo&ߐ~Iӵ^\;w g}VX\./%LU\ٛ,/R 63wfL7t,X9N6l0FmKXp֢J*j)|N:` 5kJ|#ׇS6p0eajs.\t[Ό_"EGV:vO;MlE@@@@@@@@@ t@@@@@@cذahܹ@ E8p`'F to_38CSL;CݻwBTƏ^o,ħB ^xM#:cS{9o}iȐ!3go\Hzw}@Ȉ 7H-[J/Y#pzUiqRºp/ B yӉ'̙3/&Mh֭^Pcնl٢^zɻFbtW(bR\ѣ +z !wٲejР.2o>~?o=^R%vbuz_+_|ڶ[`ePe0}t5Jxk*Q\+s #[7`Iqt=2MϳSI?PӦMuzGkR<{w ]ˏgEҏ?}ʕK mٳu!9__ڵ^uv i߹Q+ș纽|{?ڵ?O}V_?gV!        DA}=     9J+tN|M& I)nݺ.0#17| nIcƌI<{ bA5͛7W޼yHZjo߮s9Ge˖‹,h+B>-- @Z m #,TvC4j%R6~1_ƍg/;-;- ۷Ǝϕv[b…/hw.x|Az7tUW4`@rsmA@@@@@@@@FK@@@@r7n\k Br Foz'BlW\mwd/8Xq㸸~n޸qc\ѢE~.T<.wqJܪU<#֭[{1bIz/_ &=޺ l?zs@H=w-=.5-ȑ--S;SzǸ.ѳy׎ٲi&K.?wFvR ѣ׿+~Cׅ ?Ŋ2eJ|X@ϑ#*U+R$.GG@@@@@@@@@Gl       s_jUmذA.\FcǎMR/աC$ (d]"Eu7fy7`ui-{O.8H+Wϖ]ÅU꧟~RӦM㷱 @8ZzAipqF΁@ #=tmRz cA>s5fkNUT_Ck7h׮]j۶m * Ə*Yd:Tի.*_|rǧ?$\P\W3fȑ#9uVk Qԅ^҅{mr4hۧ͛o;j֬YrkꫯbŊUV~.[6˴ O?\{-ع\x\مkzs2D'Oӗ.]'wtfi2iHpO4cL&G=K.d3b.({tlmڴIg[o.(!} 7HIK<ʩ:}RW;73B[.]ķK={JݺI/('cR^R<9@@@@@@@@@ rGv     ĂX`rʹ_M5k:ѢEڽ{omymCstyf/Lǎ -yՙgZbE&@˅宽\XXNI4Yn,0»?c]{.6~gjժ%d%& o\jͮgqiMyRH*S2gԊ ׷ʅ]{-Y[(UT,ҊJqgV6ڶm M oX fZfeB'ڶ p}ڵ>L ɚӦegOڶ|r/^ .9O>d/,-02(f`ƴi_^۶mKB٭|wY ͛eaNZxeARvޭkתxпc =t72t^ٲePZm۶駟~,9V ҂T2AG@qMΉ-x1K]R%[GI}_"U/m ,Uǎ={z)|toٴIUKV'=قᅲz֬G-4Q^o>[Bm5GWB^.WzQkdw ~xaӦ|l8}&MTFLrHSА!顇%֬Tx]>[N- 1ŊI=&#  zJ9bIE@@@@@@@@@X W+Q\    @rIɅ+$ &p]w^Z[u*UY&x1˨P& T4tԻw&]"N>:t/4H #Y(#GR)jJgNfУ?5gη7/_>˚?§\(9z饗tmeƍ]('z):|,nV_$=5@ Vkݡys駥֭#@@@@@@@@@ C@@@@Q`c0@ Əݻ+3~Ν;`-x1Ni}^7H?,ΝSZE;QK;/g}:[o ORKŋf}Er-[;MZv<^K5ja-ͺ8p@S~_XfMў=+Kd:N]ډYW!D?H'͘!u(=tiP1         u*H2*     (Y *9:=Ed{V&MZR.GI}}yի>瞛Rӵp] FTNZ8Rk֬y睯ᄏS5kVU۶~1r|Ο?.<_+\Jt-K'ި6mʹfjQ:r$. @X~aqԭ)         dH q3       !2t%3DF}El #+&]zilxZݯ=z9Iv}xNDZZ}P[օ@^3S*Uc.%vQYn.6m0=ӓTvS͝zny˹kt>;:DJsH@6h %           @d$       1\\1!A`({w@0,Oq4yʝ.]zh1(&W\N ZB o՗_!+s՚5;cѢEt}ka:xp&LXλSF?*W.R袋'c:4bI.zKFUK6XR         "@䱨q         pR6OG@eB XѢERϞ16WfaæzX>Y'@G] z{Ú5mU^UgWKejڴ],ZU}VɒhʔAʗ7YO=goX@Oܫ-^|Q.WFzAiG@@@@@@@@T #P/@@@@@@@!pr[҂ؙ];HժI-[1z3ΐ.l_y`H =5ʿ'WyTtUСA+Рp~lu~gC@@@@@@@@L\qDfը    .4n`c? G"d-[/KRIΝ[[_|VV!/x 9Cd /ը!u, uV'iSIKkG_?(='rfiMhlIقv~[z-i2?tmj$ړjg4g7wҮ]ZXKԑ9r /}nagZF@@@@@@@@@ȝJ!     )PlYkoѳg̬F@ G ( 4|dae!p≒N6 *"2EohTc髯{s9RV~0d/ T wt4oԥݓZmv_Np/@X1GMoj_~YjX`țn4Zn]5,$@Rh=|Tc         @ s%JN@@@@HQ W.i8[wa @6 ۺ꫕ț7nݪ%Jds-<TƋ9.ؿ_QCY<#Plnئz NY%OHSJMHIݻKv(Y#0w>VϜԩ\) pO?y.ZvZPdÆd˧"ؑdK?,} gu=         @9@@@@ @tٳGeʔс%ur>yySb859W$ zTB$֐:E=.]h!%ƚ{3҄ ~߿Vֳ.|˥>>:|@sϕZJejҲedA~.,k::U.,Ym6 3M!-t{\əU         @;"   1%@OLnQ,еkW/СCǍ'FA2KbfrHؿ_Q<8RjE=YCB /iykJ/$d'eb.^_~)͘!}0huJg%h!5k&թ#wA(- w i_-U,լy4Z5S*Ub"/GHl/d,$6tk; " -ڞ;38t^'ϟtP!pav %,`ᇥ nݤG?O@@@@@@@@@  2`    Q @4i:w\m\(K% $x1`9mD ԯzTBDUD@^ҨQ~@U£WC,`vI#FHCJ+WJmH}J^EfsvlVK AK6YPCyσݯUPH T)?2pH*Vʕg0dA6Oi/&n{ylρɖmsk 5q@}w Aaf.Ђ׿A\9Rf[/> SbLʔZ:V2G!ii?_ZHڱÿ^ѢRR~`G},@.ҋYP޾}}>۶``S kgǞ"E)ts̃gE>ɖgҖ<㙴bVA_ y> P'3s&.fyϚONJ8gr|8~~ d~ dzw^F@@@@@@@@: Κ+!   d>Yͥ@իF$O>D;v<γr8 }ؚsKZRT)紋d/Kw?Y`Y_x6Ho!dmHnH.]=?LJG?ˏNWKa۶ llYDtB8lLd,ZX&gBɂ009[N$-AH-i%9)#Ri6Y 1ey k3 W0,2tl]bul)k[oB0sfAk-s&|4?C`>>&۹R*>kwZYr,mdz{6woU'7m*{~Ӭ-$"T?6~II]\-r?[7%!Swc+          AF]    a_Z7N_z D3Ծ}{%]Ɩ-[ג>( @& 0^D\NQ8Ut9~[DUD uYҥRBQ*HN飏8 ?2Kt/#@,ւ5[ڮ] 'BBRjZP["H~Tdۃr9 Ю\ϖ-XgM dЂv,.uh|8NWC{)HUjդ5/V \ς!C N įmo l̮7_ =3y~߳gSG Qg/կ         @ wz!   > @ vi'td}jȐ!Yz}.)x16{w/֍U}gK[g9 ʲeDZ@`X l?.-Y"u*=0G@@@@@@@@@ 2r5A@@@qRna<)BH}w鯿rad\ڈCm5e=jذ Myo'^.R6 .?)RRK* `,vz rjD`ߏЀ Ĺ4 lqm]0.KkۥGq^\N߾<~l?~Vțl,6J4z4v^ ?m%*=_Bm#r>C{|WJqo- &釶.|a},(rժӊҲeʕ~آ]re?|Uח5ZD':Ԭh%/=sПW$`" LJ y42\VZZZFڵ˿JA@֨!7v9v?t~hlj{BN  g{y,[xƧAKm4w!        @8 &B@@@}"VPB?i۶mھ}v?%~gϞG .K Yxqp *UTږ˖-N:IeʔQ@ /r҅J~+5oHYd$ߡ~XtiY.`!HtflK!- Bgd}S?ozGGwo驧>s/ [NWE}/?ӰE&]v iA8dorc# C"?֮-ټN?\<5>`K~㱜xNB.^,u"=b9F`G1>=v;D@@@@@@@@ >K΄    AD͠* Qn:_ޛ~W-x[' )    y+P ~>O<o^zKͰСC : QIKfy& zA\:S0m6C8V_[ҸqҤIrMY:唣װG#CZdjG% ~о>{Ɗ-V?O%{KBu`]/mnxnAY} ~JB \B}=J!-@.ٛzgg^ $O:p@$3q^0=Ku/iEnp?vfC ̓ ^?HڮZ^ y'&a {$+>̭yŽթn]. (Ce骫C,+{c.hgBF4?&&zx        %@dD*    .}%y@ ,Ăb_~}/" 9AatId6YPN ӱ_ `H `[Ȅb4,ի{5jvd.ƋumxF.Oc𜓳$/`A:8`k׮¸-& _ O& TX0j \ m9X`mݺ՛,ϖq႐0YpdP,ƸdB jժqfK9>٦>C!?@.DPjT2S7/5\f <"|eωUV%'motABN}Ѿ}6YМbY``nߥl໠Ƞdh_$(2C.X -\ϗ,o,|IDK/I c͕Kj@z5鬳R<,6sa}-[ >9eX=^|<!Z k,?aA?0/Z?e<ɖmB9*G-]*?[W[OZ GE/}r=oYzqh.J0>]j>0L9ݽv1>M]`|$vA@@@@@@@@ a2@@@@qnݢ86 NXx~ɛ[޽{ZZxa0YFʕH"v:֯_B8Yƛ,^[ S h{SFdaMLƋy_U \rgW0 [lmN_RTR@nGY9`M iÆ bAȘq-VZ-WgY_H&H'}ו %vYMP ?K޲AA +VM\H9v >/W UC[u84Q!ϗlH}~;&/BX)>~\p~-9 j}Y`KD\_`̴bs2TX/,~Y\ÖgA5}&Xћ7YPk9b}BZݏuJIg'<@BnQ}/>Dz&#*UNqXS>i6lA@@@@@@@@A` @@@@  쓃n&MAYʕ+5w\.b.\[TP!>|-s Ѱ_/_)%gkOgEDodahyh@)/`?jmDE3&CO.\8A5|[h\BryʗOn !7^LnsIy0>MN%z1>{EM@@@@@@@@L 3Ss#   dqRnV.Ι3G_/r׮]^pa4mS]2~RZ9Fc6Y8xZ j޼ZlMvɓ9 iW_-7ΐ\PMPl٢]MK ,`6& zx;G \cYyx-Yp$%@׮ҤII Fwr[-H2 & XsZmnY%*v[ &>eAgV,p׾ 7k,?j# B!ǖ>00V;\ѰaRjsyy}-B-03O+ƿQ)ѥ~--NG ,X`T5*l4cti_>sˤ^\vq4 I^4G^        @ p@@@@ S$@ 6g͚/›,l S\`YgM8/G`o}[onugm۶ԤIVS(`%7jfurAvҠA-d%tW_yĽzj6;ӽ>-҂ )!`ct :Y` bqz}g G%q҈\pw^C/ر v9 h^[%6,hтT^-ZPV0BoC ~6mYY~͛5{?La?s9/ZRrZ@E{&ŝ;wzLX?EƉ'Q‰.]ұvɛi}颋~vγ/&d|F"       ĘA1vi.    +ʝDeGiڴi^U^=ƛZ4Goy`S_~edaСCuQN84 qƋ7㈜%p=&Z֥ zO3g>+f͚Ňp[_ҥS?[cN ,B -Ц 6@޳s9}ٻx2VBdVHQ!"4h4O[ fPD324R"2Ȝy{>Nk=9g}Z{S})ͩ?6kfs2r۾=[Bm]`?320|RXbE$`_pɶvZ-kjJA(͍myѢyy|jnO ud>8lݺ;/ *Jo76oy8/nB/v"Ӝ O ^g@@@@@@@@I tڛl     @D`@ N1l05jVR%׶m[Ӎ$Y BfΜi~4i nG}u>lo3D =/~er/zYfݻ G%ԅ! ,_M4qW.@~7ӼM:\W :SSO*U\k3+U\xYٲ7!g%Jm+V̷%K~q?ڦM+\y k@X˅d;WSsu<7mڴXx\f/<8T ]a=Cͅ{(a3:$R+-rjkРuVE;<X@w} ۞:uC_v5n8JU` eD:t˖pY`eʬvow>hVG0? ϛӼy6         2    3}bFK GYf٫jC yYz3A"|"EX#k@wy}][j<%{t*VXX(Nb"|1&Tb>kv5f? b϶֭Çl.L;}wfͬx(9s|>;m:8 ԩxbTuqcD4ԥҍ9Ҿ+p p>V"-ƯڏߦL2ѕURiZgJ4;*W^i6̴?+'X;\\k/!Q s $/FBի駟ω-[t.1MKժfK!sթ6o}>8[nL~Be~?60Oi?@@@@@@@@ 2+!   >) RZ@a/o 8ЇOԬY;<% lٲƏo~cǎ֫W/kժUb:E߁t@m3;䐌`wzI/~k>lh֮];w)X*UR~ـشiM0=b?|(k kRkr+VzKRf㏷J G.m̘1~7 C{>-]iˬF͛r cb .; C4 go6=}tVuza5sob\ {xj&1?6EObĺ        S xj    @5 !@x {饗lֵkW袋쨣Z lȑ /` UW]CL5[]/\`Xs!Xf|b.\x%+ͳH)QA{v+W.N I?s4h 2֭[ݦMPps=/˖-ýuf-[{ilD ])T dU d޽]`KPL~z{7S|7?0~@̝;z-{~MC*eʔInOM(Pq)@@@@@@@@%@dx    @ {!^rW +_|zm([t?=/kcKN!MbHA.]j6uD$omO8}Q3fխ[z +WX8 (4^>zk .R-{ӦM+ؓO>ig϶O<яSN9J(gYC o˖-3Bj,J_S/Y?Lc/b;C$@`ƌ/PH5ckjժ%7$]݉Hii@@@@@@@@ W8q@@@@@X X.r2}t rܹvꩧZ߾}F>mƍټ;9^R:>m.m@&~ 蜡9Ct.9EctI2|Kf͚6vXxb{ꩧLHKuUi:S0?MDHivk        $Aɺg     @ A`?)>ӦM3<G$mX TXnV|W_mGyM:5m C(86ܹlk9sp v)Yf٨Q+覨 T^`o^{-n}kC %6h[(%:ܢp}ktѹ'իk?L1c {~׃{2v>!]?X1c^zX1i28?m        $J D.     @J ,Zڵkg\sx mRr{tz +Wn={iѢy睶m۶P@l.w c]w5mpW_}rT@hyE]dzVZP$SHs9:sQ!CXwޱA8S\"Yve}ƦcZ?nc\ǺyR&˞Hi,@@@@@@@@AP @@@@@4i5iV^m3gδ}Z%b؈V >|Mׯ/?k#@T} ]lƌ>kذa{ zRd([u]O?Y2eǀeAB>U@Ͻs!uNJdYvwyv[޽}Xg.611`V:54Y&R!DX&        -@dAR     @Z 9ڶmkg}fuIv._ܞy;S]XKkq?쥗^:nO>nv;{IN:uiӦ>.\Zx  @aJ3%l^[oQG}tIq阂<@7n\\ڋn$8q|ָqc<,JAvX>}|z2nB^~e֭]x>d['^z6f{J78/Rۺuk6նO[[nm۷uSY֟c_~={a6mߛc=օ'Q p0|0+z'A69ID[-lvwXɒ%cޕDt<"Ƣ~s-æL/l@ǺXИHDa~4]5k[n͛υ0wre~ @@@@@@@@(@di @@@@@ 5@=}瞳%J$tCV\i&LѣGcޗ W_}/믘 [~'1c)"%?k]F駟ZJ|  Y hӯ->j-{7;4/_>nϛ7χ >e6g{om۶Ż 1k'{) 5h {g?YX 'nΝ;[^LcB:bڵk\ jSmK}zcqÆ ֪U+;蠃~UC=mFCuM>uܾ@9H" P?tg߬e˖VjUw衇ƭDt<"ƢC-!Sl XИ؈ga~4[Vm}6dU}>5!ɉf2@@@@@@@@RY T{@@@@@ A}IHKVX^=˲z)&ˎontzwt lҤ|ɦ=f͚ƅ̮긵ԦVY-jg/R${SE.YN9[cdۡby-qҸGYvk>`MWbx4i#c1]?Hj*} 9M.|C#(O8ˮqG+V̞|MvmDOs7A@@@@@@@@ J}E@@@@( \T@ƣ>T cg [6+8s楰!CؤIW^I@$pW.\U;f;}JLP9rF$94nf{gJ 8p>־}H'.瞋,烆 ڠAg?M3Ʒ6v"'H6'O-ھDGxP*1YʕW^Q:WwiСVTX7e6Jc?rco?}Xx뭷Pw t4?P-ba@b-LXs秱ԏ        @" ߷6L     ))7ߘP/;o޼ٞx Om֭vI'Ynݬr;x;lK,;χ'i뮻-Z ٳg=(_R%{}=Ç[ٲeSNޯ{FڡA?پ}I C2mƍ_}v! w__]_kf7p}zeԨQFow hҤ} җeo٩j}B6Gi-]y7Z _?ޖ-[__xێ8[|=6c =zM, 7avesԍ h7lvfk~}x#įL-͚5 u\j{ $5мZjXժUmܹ~9ί]vΝ;뮻lӦMv饗FuhץKL=x:~( jSvy4/{ܥ*-7K|0T5}W\39q W^viEV_sty~%G3s: /D^zi'pB$hGkkΧD\m5g,PНLD5ѣX6lf,>5gyGr0=k۝X5B:{SԾ^|ESOBt̩h}'~5]*Sk寿!k'Nُ3;ɰf,ڴj֬i:tO<1"eu)㎘m?;;Ƭ,*j,3p̩ʜbNx]9'j[2s:'>}cQkԯ_ߏƍsʮEٽW,;.J Ĭyz K]k$*\}P4EE@@@@@@@@ %)    Y v!@\IDV3[zup.0(XfMt(HWsxtA~=%.e˖}1߯n \`N`E~K /׹Ksro,XmŊAF֭[~mmU[H|wNfi `t%ƍ;A. n6՚  ~guVpQG.H:n嗹2=pDAǎ#˞}٠DK/ЦJu)ι-\/sa~^G.|/+9FN?~;Dۯ}9 7+:=.s.L0hӦMcEW.t3{b΋e馛~e՝Xg9Կ~DmFnbnΉZG+ur>ѰB wS{.JؽViIJ0?9ilǷQ@hgy6D<4E        C}    @ ~-B m۶ iف:(UT~H 4g}|쯰*P~YtFH%Aʕ#AZ>gN uUƠú i6GޥPG_ÏZp!ׯ_Ȳ=zea} :-[ i [ACaJ H{w}R}}~Dr HT@R|1)HfwZs p9q)˗/H&3# T_9 â9Ѣ47ay .{_\h^HKd] b(4Nۥp_)O;{,_Yfeo/ Cùoߦ kswx_-SP5Ӿ}2eJz0d+>,]v1J,u#kz *UF$c~t۬Ū՛y,3ՕX9(7Gs,9Q69U97UNc<)ȱq<9-Z.JؽUc%VO??>?'XM? DXO}        @    @ q|mߞv!@֮]k.'έo̥Z֭mwܹs_iذa,\^]ҥ￿)S?>evd֢E s#‡vx-7Or6iC 1h̑*97a_^BߨQz]HOd ]Q=uZΝͅjF/DnoVZz5-R#F#ݻOٲemƍ;/^OdQ@N}{N3 -[[`^sA+L|)Wh͗gRY/]H6m6n.?9r?7pom}MsѣG rVPs@] KVE:T@n6sv֤Iss]@waLجY3xʕ^s5jrWA" cje../o2#xEê;Pە߱xG[ƍ[x /A$Z_egc1/5߼';vׁ.>wy_w.ߴm:yuX8UcnƢιDsa; >}CIx{Z v ޼֕y,Ĝ>Ci,7#9qs\49 KL"<'jaAE#СC-'X|bq(p,2?Mir?>c.fΜi5k4IJBz~Q@@@@@@@@ 7EM     /KahUjժyU, __+Ŋ;;kC(HdWKѢEoa /R0mSP2h)(s)^_d~=|/OZ*\ٳ}0ԩS-O6gvX7 zG3}tUw(O6oIA@ ''0Dm.:5wuͽ4v8Ԑ|4`P"{_z饑hޠy,p&L`|Ϳvujþ}%\#0|;Tpp!}G~g͚exiIuԱQFPOvO0uk5͠`@IDATS8U4[d2Ru %R \xK:Scgc1/;K5+Wގ=XS}tȘ#7cK.v駟~)4N*X=XT;Pwvc1p<"c1^0s\N8J09YUvکX2?i,朸Ӭ~.U,Ӹm !        g Ns    (S,̆4N+ 6Z=E_0Vy-sx3roC ~y_mep>.\]/WR%zq=U}}&2y( {TLza[t鿖zAxL@rPNr߾fc.L-wu7[li#Fصna˟ `{g}Y;+~wgV]PsgNɰa|x%\2i8fwΎ;8=3a(m۬y>s=z׭[ׇUjTѼ|֠AkM6Y6mbָVj+U]Ŋ}(ƢQg^9k֬\#2?Y]\cs6vX?nd^Džf,nݺ^~eqƍN:U=mTn,6s:'꘻[3{nF袋"dAEmڵ3R"hloJ S̟ewN~!V>7sOþd? 3k[h@@@@@@@@x w    @<7!%@ R/׎^_ٛoi;E"rz(A%S=۷oYp#jժv'|z;[Ӷ)\Co4iL:J.y}/Eۢ/N7j(*~z1\/pY.!˕0R9*jղe[oeӧOwn ,,׃GyN>dVZ@&J̮*rkd?ƾC)IGZj֬Qy*ڎۇ*[}j+ [nUp\`K,qAeX4>ù}Vc1kŰvwv쬮XoGsO_b8œb>}LcHYGV'N+WD7ZQ:Wˢk"Ec=fbZwvc1>HDZs>Zbi^~矛~6[cQ_|ݤ$_zӸklhhIJ0?e~R9?=yd?;t谳Ub<^Әo          O    PUbQԎq{}ءB=.\N_l]tROӦMF{= kYvtOF]0xb{w|Kpzj?tQA{:,_?9mȯЂz6nkUf͚e7|~B]Thۺu"5.]>ܤ2RYlWArl瞳.9{: T3f)駟+j.q1xG+b~jv@@T)͆ 3{nZnϯ 7JD /󏰯 TJppG)),cǎuaO9~mWsGa*w~JhmZ*Reba ær3j(SȣLU߄ lܸq6d?ThYϴ*-[GK=C՟x ShUt,hD+V}QR*q߱ػwo]@VG^s4ss?axux-شil6br5!Jj4h*V3.!;]9/ܤk@tΊeP 3Dc1}-3l,=wyD<⮎CلtbNDգP̙3}>x}8^W)v^z%Yo)C!:1sJ, =oXd~jr< Wȵ>S8G:>ynAxO ԇ        @R!    @ pC4nv!@6myA&ME}Q?xw=pA!(]tl߾=4iRPvmL2<|';,ׯ D 5j~xp.l$F_wa7 I}>˃C=?wAW_Aŋrmݶqvm.D1{UwM6>reV\0*֭`ʔ)֩YfТE` 6<3Ajz.$p'/"pa~ږ ONj B𯻰.0%p|r`Æ #vhp1:4IH*s wz ֭m\sp'xbNbX]h@<ղB믿r= \05ipa,|©]:{t-ph?%Kukha{cdY-}ف 7'{r<{.)hذSٻUT 4t7|a\uB"']H_~ 4|VؓN:)|RyE3͝U4\\x6v< \༟7k6o|כO>k~-WcQg@NfJ߾}ߺ޽{W_erꜤ:G0Of]2%8r?Cx͝ŜA<"cqWωX霨T1}ypĉZŷ+cq;ݎϞ=۷44&46U2?MTsh5܏kq5.1?׶        M 1    @Z E]kVdZm pvG[ʕ}\h`zuVs B}8.X\/ 40 9m ;~-_k.p\HP4BdX޽2_d.1W?I7!\Hu[̙cV\ O?\@K1oHІ5)zKHe7mtmݺ >\8`lA.\ Nk^b5?s;]/ jQPɩ9e-jΨ. ]pk<ټy̅v +7%-ZdvU/^l{챇o?cLs;\ p5sWnreBͅ %*ӓ+W렬JA]stUY-+dUw^B0y[s]4g+Ui (Q"ۿFҥKs.^4yݡnۦMx5]`4 nc1sv :v}ts l tpAꫯ M8~xܹ'4\`q9U4'^g~UX{W=J4]        $Aɹ_    . `'fZbep h׮m޼ن  G`K:YG_qYƥD62`+ /gy&_Om#Y "|֣Gk֬=EIǷ[*Tn)F?׉ +VM,Z(M%~Q\~>>}$?4 .^{ͬgOstfEng-5SQʕchԬg5K^G}ضm)lGa5EÆ WԦLb}ui!'V]*3f؁ T9kԨիkGRxxM_Ƣtꫯ5\?(QD4G볇G}Ԏ9wޱ~ڎ:꨸!Uxƍ~QO7)ر,͝;ׅumfͲAe~c/iYN?hv<`۷]qVl4N+I#駟ڳ>k)Mm۶͛7O~JGEy'KgS}g:tؕ)*cqݺuSOk8&S믷_ݺvjwuխ[7E&_M6p>NjŊݻww=L2:i?{v0Խ;i4ivEB;D&4;@@@@@@@@( *@@@@S`֭~ܗ` RW@!D׺䣷~:w쿘^~ݠB7nѥbŊOS~kԨQvۼy|KK(DAԥ pfX@Ē%KnIeGD74^_d0/;묳ϷmZѢEU'oB :V૯j_~qvWX.]R:~mݻxAŚȷO?d?\yּy|י72?M>mW }        [ x    @\\Fըaf}ĵiCB*0ydF[oYrMR6 (0zh{YʕMA^zUZ .^ ȴl`.ܹũ,:u6x`۰ar)vgif˗,B ~۷oO?Ԇ fNPЕB/B;3xL [\uȑ/۸q\UP7)R$S59 Y}]?njcᄏu.b;s EXt+6k,kҤIXRd'y7W?:m4_]pVJzi+rC 4-w        VAdc@@@@P͙cVDVk (x˗믿CP{Ν;F|Ԙ ?~I1b]N:$ԡC+VXn;@,.u&2k\٫&~7nC uvꩧZz$=(֭?ޭ۲e#s]t/-ZdC SL)lٲil\̟?߇kJ V‚K*s۶m}v駻1jԨۙ 7o9ҏ>̊-5i҄0,r5qXbŊv'DQ_|://VR%;8) ȏG}ǢOS:/3tQV BOh@@@@@@@@\ $VA@@@H}n2{y9s+-@2eJ$xw^hӦ'*_O=Z0=߸q}WoƊ+fu%~  8\s[f?`VB]mٲ}ی3|[-l=,樣l޼?~>tNW}ڵkg'tsLx0\yv>n8[xQfj*(_D;gD@ԗ_~ǡ ȪC=NxA #RxEţ4Xj~}@_m6mZjEZnB`sR Ȥ-t*V0kS^x!7d>JWOusf͚nrtɿ;_զNj vW蜂5\+[:(.IF4&Lo [l,YҚ6mGǢpk(E48tmMɝ 4uN~RJ~6o45. ͝iVuNԱZRLs(Cuo:%wOsZ0?ǂG        A7    @7;lqڶy Sm۶}ĉ/J.Oծ]]ĴCT^` ՘9s+QxB5x~<}@B8k@ { U#^s}AF~H{hBhpkFaf77CVP!Q] lٲf͚e3fs8t. ̯~=>V^C5uw}g ,W?2qH@a 26mZd,N<.\Y5i$rNԘ:쓱 D·:6ΝZZ5;#XԱQDd܌Ӕm14ӘR)        I!@dR:    /2s]v_^5xJ; @@)eʔ)^(H' ]Pl+V{C@~wP(Hh֭z%UT) r/@dXtb.H͝Zw> Ps0)L5k*HspV^=mN 7;ذa)tp~ޭAݴLa;Ŋ:ȇ*T }wZ'/ƠƢ95uB E/C-c?U˗/PcPc1 ,_8B@).QoLu8xY f=uV?4WtEI&04}9bӦM}dժUlKһ;O{j똟>f @@@@@@@@,@df#   }QlĈT6P@_Ot*TBݺuM!(pIIClڵkmܹ?Gn JP ^S\r$S! iV]Fd)@d,,D`\)v@A3>+ {v{ 6n`nj׮BjZZsE&6{gVlۯoUXb8c+%;U;ŋo83gj*iJLoԨըQÏTtʵ?4{MEm.C}+W]D >91<jjj,.]:yvowRsƢn7o}z΁Xxԏh9%&>ɩGOsu@@@@@@@@ Ak    N`m| AR[`>( "={0PCC￿AQ!{~VLԆ( BE ݇a ˕pB䧀Gׯ ,{ GTpC؆5)V-P/W`n2BڴI@~Hؙ϶(1˕bŊa0tg}J*,J2לmɒ%>`Ns7nׯT$0LdN鄑ERB4±`0TJXtqaXjUI{({-]ԏq^OijLnݺWRxq5i85±έvg;53͍zFơ’b Z[c1<^?tX\*NpN ϋ91,C5:'*87*Ui;:O㿯ߜ@@@@@@@@H a/     yxo63Ƭ]<7 )!/'s5q(#,˗A aB*Wo{;ܴ~*m۶UrJ믿"7-[̇(Dŋ. PhKj֬w=#d!AY8,i̾άlق7j\D.B0Mwۦy¯4S{VbEP tRHu*^;"tӼV)J Kɒ%}f€1㘷Z~Æ ;CIAiߴiSGaX}8uaX j$=ñp ~XkE 61{C--%5gV?g?h;∌G<C:j EC8ul)L-,Sp<^a8{/bQhj8p\sp FCt. U5ω Ǣơn2^9{9        AH-    )(p9A~j֨Q n]FvA@A P؂n AM`D(\`ݺujIa8B![2e"+GA zn^V/7 qx>֗ׯ_o s oXA %YfͿv #7K(d}(d)nfC)Ć/rͺu3{邯?j%NÞt4ќ(sFs2q¹³4}x~^TȜ,h;fϣZx\-|ytJyv(+ 5w Ct sǂ|gɒ%(6ZGc1 VĂH0Zsz]J|=pE_'t7np܅c1|{mt?XSħpcQQ2'N̘'n7k5b}:~52E}>y,tgUt,zXx\ECe˖8>fg ~㬊\އyQD= "ωv>oivyfovi3[Q BXY]gpս&3eD R(k۶U[nd]γ.[)Вt?S{4vyga<0ԍ~<( |n,n޼9r )1qyƎ%s 5TٲeXx o,vJc57Wge?f!7٬VԒu4?Pbx>ԽΙ9'ܞ]V55s351{}ny 6?<&H@@@@@@@@Hm S{{@@@@]pev1f.&N4Zu+ x-3Ll#   L#ع皍of+ 0̅Bu <`vmf=gֳg!!k/%f X.R          (@@@@dc>< ;{L@@@C.lh3RPp޶mf}-jַo'1JA Q?OW_5kl3E@@@@@@@@@ȋAyb]@@@@B#P/5h`ַٷߚ `Vt!`C@@@80: ڴ)&0Mt-mY>a gB:/sDv ?fcvfuᏅ`@@@@@@@@@@ LG@@@@b.pak֬fuļY@@@V@3ful6eY͚il. rKFd^fE]r.Vȇ /n3%?ΜiVYg=Gg]W_h@@@@@@@@@@&OA@@@@N>l4?l5@@@^zN?lݺ,pfwaֳ/f =:tԱHA fMծmf͛}!Kd#         (Fh@@@@TP@_]{Ynf|`Sfe˦@@@ Kfomn-]wmfv%fEu-kܭ + zl)S3~3ŪmE@@@@@@@@@H@5M    @ɒf<VfZ[Ao@@@F6S׬o_ /4{5v]=nh:(…fO(|@vm=*ZK~@6o^]Ͼ UFn.Lʖ-L@@@@@@@@@@C@@@@"ULiXi?~IHm1B@@"SছmۤU*^\32I"C_?1O{vъ2D?DR,Ybc",qɮo:u~}̑#ÚƁ@@@@@@@@@@2X >@@@@ CjN.Y3wo_@@HO}% ˲P"Ep<>NJ._>).Nj?LkF\޽{d6VEJ}?N*#]yyR\          A2@@@@mJqW>iHz~;@@@ /$YxWK&I v5K.ϟ{g*]uU8]V {ァvaQHҀk嗇53ԡ4tԾ;w +b7@@@@@@@@@@L#iN5E@@@HknV6meԏ  Ć@,rkRjH;W_SZiԨ;5Ƕ];v ٵ= Pz۝waعSz}˥%giݺ'Ҷm~n*A@@@@@@@@@bN Ș;t@@@@ #}W1CڱCSG^0   pzl٤aäjդK/V:򮩼yx2@@@@@@@@@@ 2    KK~xC0#  Q.PR~Q![ 7HW_-kĮfټy{==#ʞ={ .QܥkW?C nF:3z'/+..#         d" 3ɦ    #PK4h !5l(M1   @4\jre? rɒhh5m( |gO骫k'q#[WkŮv^r_+V%JؿnG mWM7>UǎGiĈ3G@@@@@@@@@8{ ގg"    *JAsBm֭KU5  djդVE2MYX{IݻK;K|sk® FZkf۶mzC)gΜ1:wg?RsҖ-g.?wƍj֬͛)SK.V@@@@@@@@@@R @d @@@@p ԭԩґ#RRҬY< u!  !/4vT9~l^@V¼tRNҤIisj>우kîV*P?7>\Kn,Ԯi&?D.EOX`5j;ٳg~'=@@@@@@@@@@R!@d*@@@@p 4o.M.'%]rte̙< u!  /74fd-Z!]+zVR.RǎҔ)iu$Zk® rz7*wyKGK7?^uqK"M,uXRWj֬jԨΆ+&@@@@@@@@@@HA)bG@@@@F 0AڷOjDjJ@@@_ O?ڷ_dH^ .οFReڴs\aFP+W\ݻwu 9"+rTԩzs҆ wKJo{n'u7V <x@@@@@@@@@@$vA@@@@ =.T[id){v"Փ Kp @@@ r>X>馛_ҺA+:t"={Z ܵk^u~r͛Mxi$p*?ZpeғOJK3fHT̙pq={Ok;;@@@@@@@@@@0D@@@@@ -[>wTtҹʅHHԅĆ~[W^y^~_|J*i„ . @4 d"'R>GLg&}d?`p3g%Ƨio#عsnޮBkM$%CZ_ReԩzTFΰmjݺ t O~@eD;ҥWYPz1知Yr ~p\pBDe         Y 0R    WO>\ZBr{Gʗ}Tڸ1\G@ z,ʎ;4yd3FVbڵkn:ٚ 63tUҁ᭟bG  iZ]v;v@ݻW^(P 9 ?>}/㾘rq-ZH ,άź>e\Զ4g'nW2rر7ng3e^/@@@@@@@@@@t 29    8?֯OCreGi @lL8QO?יիO>1 ;3"G@v]%7,ЌRGLg. *h!]~=z9sm}ҿ;vL_P6mxmM7ݤ . H+Wjٲeʚ5s_[ӧK\Ԫ]D7OzaJԝׯ]g*մiU{3LC\F@@@@@@@@@2@ s!@@@@@ѢOH?,vԤtҁ: -`zJhZJ *Djh 1!иwRzҴi1-:9rHÇs. A19skߗعs۷O׿\=*\pÏ=&OxK_yFBT@1a?׿JS|㏒;uR94ivx^UE˸+/#@@@@@@@@@@d     bpba'K{K>(rt]ҹf@8$ &Yf?vU|y]~ѣWիժU+m۶MFҦM{{ )ƍyf~ynᆐG=ϞuVխ[W= ,Gʞ{W^믿ŋ駟K/Ǐ+{zG4uT2LΝ[=VHx֭Vi}4h,O׎ 6w|bŊz믿W_Ղ ?~tMA@@Sl4{Ԧ˅?LEjN1aFt<6j$9 |CW.B|Ķ[iڴxMq67ɖ->C/r̘1t\$7R 5S~ j۶}Qn;˔['          @nwF@@@@H? o_WO @oZhzy%Jе^ݻ{O ~Šf q ZE['B-ꫯ6lxv ꪫ{p? vlҤB-<cV@ZvZK,'x-$_ru)k֬;v 2] ڵku{sL ٲeO@@0 g{\("34r䆓RSvI4:Ƨv\9sk8(;vP 񷅺[26kL3fvܹ>}-W6,D1X(F u[>~ҤIq|IooBn}~6oxUVy!v-[jow^ wy!_||8v9XBK.;]"蟹s0J$ K?wBi2gRׯyZpP Q          AiK    Iӣ$o(.gLIi,OA"Y`׮y{!_bA(S5l0}*Yԩur^(m JZxb[z` eKmeh.bd] bA,k֬ќ9sd0PN>{q/2` < qG0ǰ}N7 Zٳg,Y3F-3qcŽ}k^`=hhAŋׇ~{O?v B.~i }udm}egrrO?I='~[oB4arٜTR c~@ @@@@@@@@@@4 2 P@@@@p5{ Oj֔ }2uH^`ٲi[uA5j/rgR,%q]bKu1u W fGv[LoݥKU (Hzݵ6*Cѣ^Xeb̙V B K v뮻pO?{^F#F$w^,l(  2zqR<\rAR6ra'Ke|S;gvڹL!Ct^?/|Bͫ+Wz!Oja]p.<6~O>cX|.rW;lbhAkAwI  v9eas~M]ts SԾJwZ.cSW_-͝+Z%/]xkЙ^y饗zvza0L]@@@@@@@@@@ VN*C@@@@ rʖ|RZFkbE ?nI8Q:~gȝ[=ZUKjZZDmh%#0>]]3z|jΙ;;v.m۶yavmna=lаaCo`nw4ǰ}BsO7˗wO5eoW_yoz!ޝdѣnfϲK ?p@D1|=Tk]\JgK. M|I~zK^g:ݞ2է'          $8/)=]@@@@~SO?6m~r[JcI.D~{R[Z+%K}aBo(}[pa/qƍzu뭷L2~I3fa1[x&ea=nF-]T/r̩/n8z9x`Y&LnݺeþzY?vmB*3uSj 'ờwAuK hٜ{          Ag @@@@F>}ٳ`믗>XYSrf.`@r@ CMvΝoܸ::t~gsz?ӥ<Ӯ- Z=#*]:w{۷?-pP%\( ?QFjժʗ/ 'c[q@R'r5o}s>H;敾J:uk԰aCO#k|jΑ+;gv+9rP0زe7yFܹy[bJK8dD #׿兿wUwyׄ} g*w}=z… >M:Us+MSG:<魷5}a+~(eI;d]wua͸TR /lP7          @RY6@@@@}5^~Y4IWϿ_Բ4`cG;C,mj͚56n8+VL=L2+b-E\ v{mwܡkĈj׮ $y˅Q^۞_[[*Y`A/BV,V֬'={x8ZXСnҤ,/>ӢE =^ߚ5kʕ+~޾ g'pvҭʍ}T]<+\&Ǝ{IZIAO#k|OsdٙK/bneݺuZ|}Q/,Ѷ<#>> k8p.]0Hn16PZ@ݯU6m gϞּJy=>EBLoz1lK]$U&\)Syu~Z?"\+/z\-*+/Cո          qNr,@@@@,#| PI>?rZiqR%)gj;A?~f~ e+WjС7o y{`/B ,0gyƅp?+{c;޸^oXdKrk?j̘1^￯ڵk{.io'Oխ[$ٳkӦMҥ4h=f!W_};N?vܹk׮]\n=Oj*YLǎu{n޼WBS믿W\~ɎMA u Z _Ԅ/'-5j$-8@R%N G;ub|S7|:mZ.$1e矻4rjɥI>^@m`#G UV'N!/GZtо}oY(W^';P{G,~ѢE^=y=纤Z;qF劅LA:n6m Ng&L_~EYGZ1E=M#rs,EɾK׎x%7B;/ֺ/}Yٹf2d~"C@@@@@@@@@~>>،    XBO? 9f.İ?/X0usaLݽ@|Zx\bAXcŊ{JE4zj/K} _RZŞ={;w-إXbg}Q/|YIw&lA@c! W/+S#DmR>҈Kgʃ墡 -]zy4úftE ti'aZ.B-}ٲeڻwԩavظG6oطo+W./$dž ҰaҐ!B)$u*tf˖Z{!_s59sy׺Ca~Ԏ          R S*~    db;Q NjN9 #AawFA  5eckt %m+YhA&S"vYC Y>C\ba^tRU^=Od_}dᏳfu?i#kDX~{?oKѣG뢋.@@@@@@@@@@@@@@@T XKS[,S'tTU 'Av d ě$(@ AVmۥ?YSW^ >ӻֺ'|R~[My[@)"Me||ԩ 6pfAIRgU5Nzl˖3fHKC =zH^3w\uQ[\G7neFX 39^@@@@@@@@@@ Fvh    D!M7IGK۶I+-K\"'S @$ -Z5H>G @X(ZTi(?fMiX1};@ʕu=h̙Lʞ]2Eڿtp _oZ(7ߤ.ڱb wy@w@@@@@@@@@@F?NWjE@@@@ >(m\v4xt%RR7KÇK{d::  Q"PҔ)ҺuRZғOJ~O\%Kĉu-{y;1j%KHޚ#Odw{OjN*]Z>Hmu׮@۝@@@@@@@@@@H,%ޕ    S`ih;)fͤ+s Ѩ Q`0{wjg6#YHCJݺEgi5ѣKO=ԥKDG};S 4u?~0؍[zaeDV;56I-[JٳK'K%JD{"vIFICqqWH=z          d& 3٦    DرҘ1ҸqΝAZsG@CiA@ eؼYW4ȟ?IMS׮]]dVōTΜzaJE"[ g)RɒЪmÞ=_}.Qʟ?zF@@@@@@@@@@     #Ptu'H۶ISi!K_ҥ/Z  +P_ڵ`H du~p?fPE[4֞=Ժuk1HaV~'y{߷t,(!~_ӻX0d^@/C@@@@@@@@@@ AS@@@@@ UٲI͛KI?(m$TIjI*Hw!!*^vF@@0 e<嗥>Vo:Q] +VL&LP>yn~ b @cǤIR"ּ}!CoY:|Xz-?th"4@@@@@@@@@@L.%ޕLn@@@@@@ ^7_YԶ4i"I jaä%Ex@,СRngYOCL/gj+K]'e'93͵1x`rmU0M^ܻ2 @:orAҔ)Rٲa4Tq4fW~9!u*) "          Q.@d@    @fعS@:|?]i-I[ cǮ#\yfͪERRKSJJҦ9vd~xf~UWisdjE@@@@@@@@@@ 2-T@@@@\`ݺ'J*/leKɖVZҼB`.8} ~I#rmF!@d8B.~X=9Q=;/tSӦMQoj[TH6<ڱCjF@VzcC/Gꫥ%b@@@@@@@@@@#@d9@@@@.,rdvPH[רt ťnГ3 @L{#@M}T9SjNz)q?=SobzkɒW]H_:csV =|ٓ6'C-1L/ ͣbG}Ґ!K{JMHx5RR!          @, g>     IǎI ~pB~E-'Y_gOip{HKã y6j<R#73m@ȦMSSFo=oӊP!wt&Hh]l!eH GK^?w.^۶!+X-,q(-5:Xl,!          9̜^#    ,hn\i9,VL  lL")..SY2L`:v<敶or<~<Ags@l&M!MZ!mB][\YMm'=tzf$l٤/,!7oC Tm3ή | lM*_L58          DA|h;    Q̟/YbasKY;Y'!CY5{v륁zm  RNyoRzRW{GUg%K@x6ܴIʗ/zT̉}ZfZosIM}1ugGz'+U@@@@@@@@@@8@?̣     @ XK/)xHEHo!h!,(5j7beKY#2JVuRł".G؆ DN˥ϗ>@:|8:D'@3~;F#7cPf`n3l!Ǐ>}6mᅲx@ZZ;WW"2bX#          9Ļ9J/@@@@@ ['͘qbYH*Uƍ&MV-)+?rXD D`T*EJ۶Jʆm ,YCnS Gg鮻…S[G_HW]#?s6nr֟},Դ\9b63Sď};56o_{w=7Ko@@@@@@@@@@@ Aތg     @&ػW5D0ْm˟_j@j_6,Ѓgp%O ɞ]Gz3 yr<-/ҫJHGJ*wTrD}%0r4l?&TzKӟҫUswMI r0kפmHK}-v{ kfM)Q#u7          ĶA}~    cҢE~ȃ=O~Gժ'!- $ >(tɏYتR@ 2dV}ܸQY[jF,Jt-u"ٜLBi).L{Fg 0ݰ>ԡÙM=|t(-]ꟛ~hO?֪X           MAF٢     ;vHCZݮ]R\RݺR~90>4.͓;pKן{ @ (!@f̐UKfppzJi~OHY'ҵ&O4=2xԫ ɵ;kVX1Ǥ;rNnn!={J~yᇓn?gߣԽTNa+           *@d@@@@@0 K+Vi…ґ#RB~0dh8d2a<8U!E+Kb%{v?lAi%K NE7ߔ>XH ǟK8~C%nosb5jHKn۵jI˗~iVJxBV)gN[$kaO=%Y58OkK ʂ'WT-񢋂X#          ) 2eN    E@,@@@@b@`i\?? ]wlA@dR1i@O?Iի;OZ4An"i$@dR-қoJÇz\#tԢy#8@>D^֬~`\?=;UF6Ϡo+zIH+6YڶM BCۘ-{!Y?)           @8 "u     aرC7Ұ`H[֬RRtEI+T@: ԩ#-Z$9dJ 3iĔҧJ|*U!oQR%S9~\6LzI(>^6Mj,:jmH/ժI>+u)FbyGǷJժʕ&v@@@@@@@@@@8{ ގg"    *sKV `H[jԐҵ,>Cyn6{ȑ# ۡ=zT\*[$֧aŘ۶|yn˷DWl,ŝ5kVoIvl,Op;:Gʞ=ZʕK9smvۂdBe˜ XK80'T 9]0c6c n/>xfϾW-[>uJHdh=? IB,C /-hǎbH ``\RnƁI3n c'u:NvRA 2X!Wמ=\Ͻ?;'ۘqCU@IDAT8tq\ (sI]+u$Z)֤8uzJzSc            G#z<@@@@@eKPH "w ivjUeQ ~m;wzk 9b!2X\ķ-X0p1 $;Ե ٺiPl޼Y۶m֭[:q~hs  7] ,0tBv ,PKis5k .2ޅG],Xgsˑd͚݅ƪF*YJ(ҥK{Bs@@@@@@@@@@@ ES@@@@@p 8 -^|""- GTCںfM?82m99_5` al}vYH|~(A1-0/ ms>Q0-Ǯ ' ? P>|R,!%ñ@^GGDȝ 2NAtaP9s>ץ.]NK/rJ:tHlܸ1ᶅ>.Z3,:tac`|qARHNm,l`Gm9-=\!CeʖrykmA@@@@@@@@@@@ AE     BX@H `H[/]*YgUD֮C֪%U ~ bl$В#GSaB߶ٳVm}qP ȱ GZPS)(k8׶͂ql0PcA6BHXF:T9RPH9oNYJ?$25m1?uiKup{Æ ^^PFeʔIr` Λ7o4dnݪdi&ok ˫B X+U2S@@@@@@@@@@2L      @t X^DZR:rDʚUZD0d͚D֨qr@ݻP eƍ A={p, _04gۺ` cd7 ,TPF8e_ ] )Wr̙h1/@d̟b:0/GƍPH <>-qZJk׮us5 s<3nhAbM 6ǵ`ܶ@ϟ_+Wv?P[9wʂ"]Y#          @ C'     !`!t 9!y\tA1.R]/~~wބf.\ `Z-ZTGA88, 2Mjm!9:EZ-c9bs;@$]eP[t9AJ`i8-XP}&q~ڵ &*TWM<>mm|6G),po~laիW.EiժUy睗)R$[@@@@@@@@@@@ AS@@@@@L 7ǕZjUba`=fɒ]J5SM]hL15k ʗ/|e1g+m6Y OZ~gf U*U :s,c-t@b p2={xb[edVl^yj̯ %|Z`;Fƹ|޶X[~w%JB!k׮?[vҦQԊ          a 2T    ĎKX˽a>[M}Yy睧{Yq\bN#pAa̙-67of͚yKRNS!          @ (!    "pQ4{l}ZrPpaYE]-\pW9rDHi vB!-$BsmYd>ff ԰aC5nX*UJFrİ 6J*B سgL[VXB K.>4i}f͛7Z!@ }?0c ͜9^--[T" @@@@@@@@@@ 2O!@@@@@|xSNӽ+_|_cz^EPB - rܹ3gxb;vLKVӦMլY3YXNڵ)Q!@dT&!_zYc-ԪU+oSC!^D k…@0!Cxʕ+Pw+԰aCJϞ=[cǎոq?Zj޽z!          \ ?nH      @ X7|QFiڲeJ,6mxKVTrtkB=yiҤI8qO.{g>ନ?^E&D BUHD1D;D # 6DAQHAݽ w-yfg̙s3LkF]w[*} A ?~^}UZJ-[TΝթS'.]mܿAL}6mڤU{UZtά @H ,ѣ5eխ[ׅ߽EdU }]XetkРAjԨQV%          AMlj     @ رCƍK/BĚ5knݺ2eʤũ@ f .ԤI4qDmܸQ-ZЀ?Yru(eA̋@ f͚zH~z꥿oSN]@X>7xCM4uǠf@@@@@@@@@@@ kdݤ     @տ;v飵kjܹ;C M+O?Mst4gw}WoߞmXd 袋k߿_&LP׮]UX1WsN١C=䓩ڦPyZ{s+sSӦMUP!=s駟BY)i<6[ljժx sկ_?_Z5M8l6k#ɓ'S 6TݸVӰ]lefk`hd*}ݱc͛'{7J&~:ƧsNrmk]ffmg=          $.@d6A@@@@LoQ:u;_wݻwWΜ9Ӭ wٿXUu=yqj-Z39Юs7ǫL2[t-om'baӟⅢD*K̾/%hܸ 2DhZեKիWOC QŊ5fYgĩdɒ9r ٳkVĄ y<믿^O?fΜcsI>c{C,9rl=%#FdMtx4h޽{Z1f{2N6:cB@@@@@@@@@@AFv@@@@H3ɓ'UVjݺ~GuMٲeKƅ?Ԩ6:2@3k%,6ٳy^B;JIx?cUoztZϪo_"+\ ݥK3J"EkZn.mڴ)u"D!pquQ7n… ռy(:d}jkgϞ]6G;ũGB=7z<ޞ XK5fܛ6:γ>&@@@@@@@@@@8U E     w}=aÆeS:Vқo) ж={>Д)S4fM:UӧOWr裏u 0.]1b9M6o/_ޕw5b,t|6YxܨQΝ;]{*TH} ]J?>cM8Q۶mS^t7+YHж~9# LXfVӦMӤI4zhM0A3gT2e\_֭*-O}ѢE`ӂ ]v7nV^}㥗^rvںuWREbw}lU~mז|(QB>lT) f͚zI{",>|ص:$= w! Gݻydk?zK~ 2dH(`vɒ%`E{^*V;t>Ʌg_~E 4eaGyL?k~N:nU[}U^8C./jٶm[o^ ,Pqoڴ+ ΝJf͚l-ZO6znwa}mܸѕE#ڵ}.roٲev-{^+W }.^=~뭷aDRX1w7ٺ P⇸x-[tx=?=ڹ"7dz+>di!GKnG@ w?(]4v˱}4X7!nloT6ްƏaXiȑƇ׿C=?Lݳ1ι馛<{?2*Of%t4W_}WZ5ѣ=~{.w^aÆn,1~=c[6Xmw ./AOI'կHhրd#3{? h1          d)Ą     p6~w^1}qT~Aڅz,$J,BBm[Z zVvEy|zk׮u C߂W_}AZE^y啞O]wׯ_P]î]tPY4+) lӦw W?i3tp`ۖʂJ~0B&c9Enkժ߿5$,ɵ<-<j:5y^r%{ H+   h6x&&- 4...tY\?,dBy6W `) 8 V6l۷o. 0s-l! !ؔ0rɒ%nxX]ƍsDzVcYpOv<s$7>qX,v>c7 ,ь,pЂ-=, Bà h"wymlcy6"LьɂcZF3NdvƃUV 6]hƛdaVA&w;1cƸ ޫz[vm^%\ca?;srjܸ/^,?N~;oԩ:|ph;ԗ_~)?N7tSP޽{ѣ={r*߷o{=-ZT+tCBrvVe VC˄e pׯ:fذazWB} 8Õh݃,*hgvu+z-ABo^~PDA{>N~@&M*BmI%7?wޑH??TY-~A 4=e˖莳7gΜ2bŊ+ʞe?T2TWpo֭իWW.]4~xWrB+~ sE:pؽ g5V5΂˸cHM9r,E@0Ny0vJn}bX7z4c)?,Ӎ][nԩonkƍ0|;sγUcx$x:WƩ~ȩ&L ;[0nj`w=_\ƳeʔqtɽOAn;>i$;*=7_ ωɵqorBG@@@@@@@@@@ y%=A@@@@ &Ppa5o\/B ֍nn[a2'Nѣ/kXM>]zns͚5.BC,8B?)8n4hPPK )a]xIШHe`YBggϞ(&˔_4}idl c@21`J{ٲe < f"SHx͵5iDf͒=id *WV{~V^-ZpapJeϚb_ل_Ԭl Ge_~EӦMȑ#3j2D!gH{~OO>]=z=߅HcXjG) K㏮,Icܹs^5rm۶|Z,tr VѺ,YR#Fpwu,\=۷]M chFzւz[v^{M^{EЦ~NMlƽg}wHߔ#          ?e}F@@@@΢~'zb+ϥ-n]@3s=׭ϝ;7Tf+e˖uۥJWnAG՟g̟?[]`APZڵ-lN"A;"֌ؗzl8,V3K;MKw}Wmڴ-B-D1Ҕp|͘,R=))ĉҥ>cXާO]Vh"9r$壹NSPxqؘO? 7p~Nƽ۷o},@@@@@@@@@@AfO@@@@@ 4nXoz!|ڿYonXxնm[.\8Ԥ&M/2Tf+ .t͚5W~Wu]aS*UT`AM4IK, c!{ƍCeiba"N + HeٳfËx=gz:u*Ə31g 6,E[McyLhd;OsU\ٯ_3s/_Hd}  5tPǘj>k p[Pda˗%\^!WXMjǎ1cɓ!Q}-͛7v"@fw \1O+Xja&1<|<'7~ Kխ[Ϝ93^ϨQشk׮e0 CŻinD:eyWNm>/W+? 7:مi_el27wݻw+qrx#w\vw""           H@@@@@, tYb!~^x&N 8M;{aaSxJ\\+۵k[?J,nm?(vK 8pG vp`p%JH+_.e$vmW,lo.te˖1bF-ZRJjԨQPu˭[c,-| w7moi7ove6ʔ)/W^yE?c2wcڴinW^{5]pׯ_;&hݓd|rYÎ;gϞ9r&Zϫo!Dgo&?fgAß) |ݹ]ti]s͞E ygtaW}^VZOŊsQ*rsi֬YM E iχM [oU ɓecǎ߮=z;'vژ|,҂{^|P駟v(P]?#{8d5hΟ?=/>H ,dp.x/ּy}R:O8>8,c{ eΛo? (xR}-DrnmˍI ;wݘ]9M1X{-q B/^GsyMb6N* ?,xwNϺ,1jժEF4_{ fq2oysA@@@@@@@@@@ 'A&@@@@@t o>{ nݺ[o;v,,&^ʕ==??xϵf .ʕ+CD&LׯCL;[bWBW+W./KLTx{]wz~fDu6k~w9x~Б|gx…n}vЛPf``f=[ƌ\:-M{ϯ.lQ2r/h;dT}O1|~X8+t|;7? 1qX0N8}nc{61K/e~gcRA=~X燴qS9m۸ơ{KhʕCbI#0`qJ3?-!PҾ4|JbY(ԝQf7gRzww,?XJy(3+ݻb2Ed@=wkܹ8px إD6 ~A)KmݺՍlcAOl,'?;x-1YFr㸽{C$ܶ6ݻ2spbr Kne<=31H͸;P?N'|R5kLmx@@@@@@@@@@AYa@@@@(2n8i&5kLݺu_2edndv}۶mmu=R z!M:5K[𜅢$7Ū59g?IKiRsjBgNE|ҤI8q,r,s(T*M&LnE:r$~J@5k|A}wիN:iلL}XX*ፋu_֟3Z_3wzgoI&>|.@@@@@@@@@@ҵ@t:    da Ca&UÆ ոqcY`U~}e˖- KžEѐ!C/N:`׮]-[D g .H9sǓԩShdUT)Ors֭UR%2'ԯ_?.ıA.HN?]wݥUVvQFE M.OU/^B{?s}Wڂz]wu.gvϗl# XКwv˖-չsguIK>JLTQst$m6o'O>۷ %6(          p#    Yd,d̙~7.x|Լys7׮][ٳg- ٳ'^o+HNò9|*Zh&Q߿_ ,мy4w\s=W_~*iFeʔ69^+/ٸ:DXb&NI&i͚5jذڶmƍ+GWƑg,X GyѢE^nuMj           =     @TrasW_}oVTըQ#YP--Pj^7h $)`6|}n Ž~.]:؉_`۶m]C0oܸ4iK.D [P)Z          @& 2\    Yx֭Ç]Qjli|B֘@ 6׻G r x.f͚P[ \ JQo?1c͛gh ZxlAqy]l@IDATYvmY(A|ٲeS9ԋ)ennGl?{nf^BڠA3ai          AK     @f~zO? \u el6eϞ]ʕsDasU`HD@ F;wƍOƂwRR\cx8WVMŊ  ݻ]%} {ur˗/&?~d5j`H{sRIƹnmW=\]xᅲ:u .JZ@@@@@@@@@@AԤ.@@@@@fms\\\(-4* g@Ȳe˞2[d2ed3ٲeC2cǴ}vmٲ%yӦM:|},Y2&[bE2[R%|e"!~zFHͫP7 ,nʕn5kָ ~ThQUR%w9c?>u:ޑߛu# {q ȕ+ ; իP֚5kfXSQ;          -@dj S?     @< 7y͡ `=<,҂/J*ҥK΋r "EĻ v'NpAvf {y۶m.yk<{. ``X )HjNs+E*_@,(`c xK 0h!^@,Iӛ-<<Yuw[Aл4X9rWz:`Ll! =>ϳ}698OznhqL           yr     eNliAAY`qvu#N8NmfG 2Cc,GA` @@@@@@@@@@ȊAfŻN@@@@@Hg&I]XPd:kXͱ6[x@ZNW~8T|'sJIO>fB             @DK)D@@@@@J [?B,W^|Q9SVM.iǎ Hek+RBT            D!@dH     $'#tMҿ%M(U, &ٓG6M*VLԼ u#             G!     Q -ҺuH?/U$=t@TUpXv9c\1!            !@iq       @҆ K+KcHG$w6@ V۷KsJ;ǪFA@@@@@@@@@@@@L 3l@@@@@@ I…#o U^zI:~sI}J dc@@@@@@@@@@@@HA{D @@@@@@'+tmҺu҃J/$U,=?H `ӦIqqw            O }U      @yJw-_/ $=GK'z;cHIUfI@@@@@@@@@@@@ȀAfF@@@@@@(THzio_i?ƍ'`4gY@@@@@@@@@@@@2ANN@@@@@@ ťQuN57ސNL$ȄO+Y#]vtMRݺ{eu֮L              w#     *T^yEZBUKYjHS@&x1r?L%            T Lzc      P;RRWK-[Jsb@&L_ʑ#s             @ 2Sz     __i<)_Zڵ# 2ށl A{L*[V             YJ ,u,     defͤٳ3]/nAZ2+.'t}RΜ7@@@@@@@@@@@@AY.G@@@@@@ L+o{OZJSG&iÆXE )+'AL3@@@@@@@@@@@@@ @@@@@;wԸqԡC=3ӦMSŊ駟vZiRixis1]F ~r3 ߿V)/ڵңJ.U$Yڻ7/ 4h@{vuȑ#&uW#^z_uVM:UrҜ9s\}vu7dUXQcƌ]yx}ҤIcIhʄ            d/QNN@@@@@pqqqѣN8IпPgra i{z<ҝwJI+?P\Y?CҶ-sM SGs<ϓ7Ny=s^{ڴi_|[;PM?US…]7|K,PVk9Ê8@@@@@@@@@@@@Hci|=.     $)0|Zjʗ/vYnZ;vԩSuV 0 ^}&Nm۶W^l_ԠA jΝ;1UP!'6:( ViP}#rH g30 s]z]qz锏?͛yڔ-[B힅OW]uOҥK?-ԩ~jժ}իW/>6R.0ijj             ~@@@@@@@W˖-հaCXdIuM]tqX_بQ#ۅ,[A7o^h!6LÇw!عsgؤIY۱cGi>ؼysWnywweV@dթS'[nV\\\SٳgG}[nEJh߆ ԴiSykj۶mcBJbңJK~+U.t7u{駟jʕ+]՚ܳ`۷O-ZŋT9sL LrAƙlHʕ]?0s_7nA0dplRjc2G,Hٹ            @@@@@ֹ^zo߾dԨQ?&M^{M7t֭UTIZrk׮uZjiƌ.h~.4r޼yjܸ{=c` &7Ԗ-[4g ywA ~ܿBmʖ-n͞=o6}粐G*(khu\}ծ̖͚5 :Owe^ 6lnqgcԘ1=H>(?Rzq顇:I2gK/ԝx__~K΋Yx'h"^ZEus~4tPc3:uF:>Ҋo{&O{oP۵c)c=e<#?Ҕ             @Ȟ>A+@@@@@@ + [~>|X\rI<6mڸ)S+pSڵ]ۺM7ovK ;q℮:]|n`*Uwǔ)S-;ugϮ… {.D mdG]X孷G]zns͚5./^A9 A ի]…:y #GSD/25JM67|_vNz\)' _y*9n8sϩW^ 7|p 4(*Myj!C$jNj\zeˤb w@bh6]-6ςhڵ+T2Z\rG0afΜy)xd \~ B)m ËYO=HŋKߟ9@@@@@@@@@@@@HGa4@@@@@ܹsulٲnTRʃxIlϟ_{B&6l ʤ QFzw|aM5k}6-X*<_~PP Li|)o^U+ꫥ$6;wnS҅]{+OY8z;fѢE:r)XA4ǏWN]dᏏ= ,ZhP5ktK l6kժ^z ̑|Sz))_ȡ             @: 2     @V/,o`f\yX_6ׯﶆ*B{k{。V, u!CtҺk'v%u,pVɒ%@7/ɓ@*U`4i,Y[7n Ǖ&M>j)'?4SziŊS[[NWh!0O6lXeԳP\9/^\Rx`ݹ]iӦdg B<3fL2~|.t? ,_ qd1#DŽ            dh 3     d.+Bׯה)SB@%Jh,߳= =z L7ov[oUB\XUW]coW=sN6D,H"PvpH{}!o۷o͛7Wܹ5p@Y`˖-5b׷-ZRJ~֭%?[Sӧ˿Rݺҍ7J7| E\| }>|:v쨞={jȑ2hׯ Y}?kZdrwu-Zlk׮UkyknWW^=z왝nq1`?~ԪU+;=:4>G爃f-[,ϲ&c=s5kԨ!@ @ @ @ @ @ @@;Jf( @ @ @V-#'o-V)^]pa 80 =zt4k,;pVL=x`h8{) Xfώhdɒ_ /{qG^u*;G1vlD͚epL @ @ @ @ @ @TX}  @ @ @@˖-o߾1s̸[cbذqb?s篢}^*i(uW3D{ȍq @ @ @ @ @ @$ `%@ @ @(@͚5㬳Ί1cěo>>Zuۼp?1jTj]6>8 #.(Ɯ͒ @ @ @ @ @ @# r}!@ @ @(V֭[ǝwf͊[n9ݼ#vn#:Ǝ-)(^˖EtW_] @ @ @ @ @ @  I @ @ nmY}oǨQ⤓U+ 6Z8#:v|#>`ji G|7y @ @ @ @ @ @B@dQ(A @ @ Pmڴ+fϞ{oMxo}(z+k#=(* @ @ @ @ @ @ @`c=!@ @ @X@Zs{Ŵiƫ+F(v߽q}^P |yĩFtqL @ @ @ @ @ @("(J @ @ @V93+WsD|}m#zk>Xܹ_xbϏ䒈:uVڵE#Ǝxjcy&A @ @ @ @ @ @@ ,~c# @ @ @?HEvE̚Qne]׿䆏 wq ;tmD͚kV|sWW*S0( @ @ @ @ @ @JE` TcP @ @ @`ɉ=RRXߪpɛ8@j\G\q;q-_)q^+r= u#@ @ @ @ @ @ @ ;M @ @(cFh7nCߚ[K`_|q W]ѳAknq ̞ѲeD6?a @ @ @ @ @ @(Ob @ @83b]V?J"zX}w@ ƈ?9Wf" X|]hWT˖EtRD+\!@ @ @ @ @ @ @l ,[l  @ @ @&#S㪎K#u[@1yr~4ڢEO_=O5*bРZ֯^ @ @ @ @ @ @( 4 @ @ PFRc |\ձMk6L`"'bܸM#~6m"~vx?)A @ @ @ @ @ @* >y&@ @ @,ZE(jf"y$b舺u#:v8䐈_/K)xGs  @ @ @ @ @ @ʳ  @ @@ 𓿭X,Kyb/7)g#^}5b8ꨈw)7ž/8昈֭#n؇3 @ @ @ @ @ @6zʍ~&H @ @lB'C^R(F4h+HÇG 1{vD Lω>/vҥ>шʕˣ5 @ @ @ @ @ @ @`eA+{D @ @6DtPD ?z@ tE~D={FL\~yQGE6DFēOFԭ[^ @ @ @ @ @ @+ U|' @ @ @@ItDt#PZ1vl=DJĮF{nĬY+(>tGwDaT @ @ @ @ @ @ @ _@dW @ @ @T~ 7)Ho-Je%{y'F;q_~CR+"6C"LR°a?gOWo @ @ @ @ @ @X@Ίc-$@ @ @1D ݺ`XOE"_">S"V.B!:bԨ[^y4~|~EtѿyYu @ @ @ @ @ @ @`A @ @ @Z͛ӧOO>$;?/#]Og.,Y/EʕUF*UW^7lSNvnkݺuBFE<.-5IDAT 377w-s@,Xq-weV >bĈZ^Q~Zti̘1#sӦMܹs}Z o{-ߥixUZ5jժifmֳ}Ҟ:%]=;mk W5 ]&@ @ @ @ @ @ @@9Y @ @ @Xz7yxc„ kz?eʔXpaAޘr˂ t-U^ 1ѭX߿w~ȕ"Sx7|Rd 3gNhѢR8ݮ[v6k,v}vm xCy&⨣V_-A6m꫑vro+8S˳iV^B~Ka+VW_}U $]g%Qf 5 <=[1Oަ0֭#^|1Ors ?1bDҥK#777g)t1;sҾfm"''g U7V L{m1mڴ8qbN)|SHfټ]=Wv Xo @ @ @ @ @ @l 7jI @ @ @`C%2Kǰabʔ)Bwm,حM6Scj6db훂 ǎoFv0˙3gFtvEcǎZ*VXsQ|xO\50ȃx晈*UVgٞ2dH3E- @ @ @ @ @ @zw @ @ @&)0f̘۷o 80/_?ѩS$׼.9sfSOe]vYTjrea @ @ @ @ @ @/Ay[- @ @Cǟ3fLqq_% Eŀ/K|q'hҤIQnf͚]w]&Z~,D{[n 3fM7ݔխ[783rʅ-= @ @ @ @ @ @6z  M @ @X/ѣGg]tƍ<BhF7q߿fǹ_~e!*iZ-[rKX|guȵ|n[㣏>]ƅ^{W+k6 @ @ @ @ @ @ʞ Ȳ̘ @ @Q`qG۶mc1bĈxGe˖k*Vݺucf~>`4m4wr\ }'.,pҤIYdʕ˕Æ.~Yc:(<̘7oކ֟ @ @ @ @ @ @ ȍQ @ @pآE8p`QFe^Y$PB8>N8!w]v/P9XbE\Ѿ}r-cܸq?9rss˩H,{vg}6 C ~^y啢)  @ @ @ @ @ @JY@d)? @ @ @ݻwtAѬY?~|3rrr:?SNvm/ѣc1cA`qǸ馛bذa.رcu,w%6 @ @ @ @ @ @ PL VY @ @ PR˖-s9'.¸k⩧zzoGӦMk9s#GÇ\ x[lE}D5SOZjEN6YƏ-ZGuTÇG ~|bH!UT?>իW\qE1< @ @ @ @ @ @^ gEQeU$@ @ @[G\pOft=&_2}3fL.I2#pgd#G|K7R3<~x) @ @ @ @ @ @( ›A @ @J]ދVZ_)?rrrd/8 -[F+I]EJ_ v%G}tO`QB"u=bС1a„SNU @ @ @ @ @ @- '@ @ @ pƒ%K^+`bj?~z; ^<蠃w]TZu.]]vYfcرѧOh֬Y ~4iRh"n86/>4iiw}?|C {`/ׯچꫯ}{G޽7 @ @ @ @ @ @(1A%Fm  @ @ P4Æ ;,Fmڴ)e7|۷SF5bΜ9jRK/RPvJ=ɕ.K.$+77**QwqG\p1eʔhРAiNe{Y@ɓW /?W=?8ׯ'@ @ @ @ @ @ @@T(Q B @ @ߞ k-Z3gΌ'x"*WÇgyf%1p6mZϮԦ>\|_ƣ>ZT%)E٭[7! k.ci͘1C Tz5k֌{gf  @ @ @ @ @ @6As0  @ @ N .!CDשhŊ/F ͍+1:uʖ>nܸ>&O9995j(;S\qՋ;ƠA%(0}xSN)QP7tS4n8 L  ˂V]v`eE  @ @ @ @ @ @ P  UI @ @ P\oF,^8=" T;+"lKO?{lvg3f>_}Ց][~-qqőG_~y̜9`k[h ozic `LG z9|wqI';쐽~MW^)jk*U߿GM]vY;'|rquŲe ƛ7o^/ g}W^`E]}u}4iR.}=܂c=]ߩFگܹsCuQY:[cĈGڗx`yLg?1c_~ @ @ @ @ @ @ @*%@ @ @ /0yUVl=,k &9 Vwg}z|Y]wOiӦYPezgi|plVq-󳠻}f_cu|n8뜜qG}UT92FեcFÆ n9:uimJN`ʔ)jժE:w][cVZĉ#*>}dc~>7|w_p 6dߵƮ]K4hv[V#կ~wFYvX|ǑK/8#/u^wz@4֫f~ouSi_̴A @ @ @ @ @ @]>A#@ @ @O믿.@wy'߿'M]0`@tAdRxc Ka)<2ѥ#=t駟K/4Əw}wY{'ٳgsLV96R^qǭF^z) L8sk~czn+_ڵ|i?|Y!Sb +͍~ea}]_FEʕ#mҤI:WT)veBT֭ҵO+T+VO`jtEec}~ ?ezgSN:+=ƌu 0 @ @ @ @ @ @ @@YT&i @ @ @).Ǒ-[{lA N;AnmvK.Y\֭;,`.ЭX"z表_~`_5j|Dj*n~¼^uU{u]n)΂"_|X|yvX*=7GHoѢEŲґ999x 'd)HSNYjjSXk?Svo߾Ѳe,裏+xdz[~ LwZjqwduoxbYQjE @ @ @ @ @ @@IT(AA @ @@FbΜ94iRl1zs„ 1eʔKR(\:*Vi)`.^~J*E۶m'O^n~u}My?|<裑YQnرcfgz裏jkX 6SDvql*{z㦛n<0j֬M6-|N<8ӳs1Yd Q߇W^yeOAi{ɝ|?Ǘ}I @ @ @ @ @ @Ae)# @ @_֭[NJ+_/rի#Bziԩ1Θ1#MR dի k_A֮]{Jb_:/l4-[Gpfah_Z{WbI!e]bٲeq 'Đ!C⥗^=zD*U =Kw>`=8lذ8#tQoٳg\fm{as{;d{y;iH @ @ @ @ @ @RY&@ @ @nE#Z^Y+" B.k^ѣZjW}Zi]曳hѢϴibĉqgt4j>L2%9͍*N;LkHӽתU__uVwQzz_8p`|ѣG!PBtwF ,㥗^ dSpٳk7|>[oesI!ƍ}OǙg1o޼9sf':`n-k[D۶mcwB.?Aӟ"8 7nOgmC=4دj|֬YqM7M4Y[BO!i~z@ @ @ @ @ @ @Y+Jkp @ @ @bw_YZ+Lj#R>HprJdɒe]K/JSOe+Vc=6[mU6P5h eLO=Ը+\i.)\nԩlB, CReӦMVZ!mݢCe_O?v)no[d =ztذaè\rԫW/&O@}8)ıssEW^QF yYc{GqDjկ_,K.wO?t?BXSHw}#7~Oį~[Zj޴x≬}fͲ%;u _sxQRx׵v @ @ @ @ @ @(uAL @ @^=zdg)(fAp)p2mlٲ0aB|7{f!vZϟFnYeQkusH{1ScH{GFdQA)/K|g;G ~o#Aw $^z~XhQfAUTu`2eJzBS {ߏ?8R+H!7ߌ-[0 @ @ @ @ @ @ @A9 @ @ @d;x#m%3h 2gΜ8:_ݺu[klCI'^Krlc@ RlӦMn8|Haz8O>ZXoqܸqѮ]o]w][Q @ @ @ @ @ @ U @ @__TP!R(]:uyĒ+:`֭qkmWR ^~,W^5N L81 <#߆ ?tԩSt9| )Ul}7駟FcwaÆEJm  @ @ @ @ @ @ @8A @ @ @>8VZY [o]B#)c.]D78 }x^z8#[nqwFŊkrC /0RdjOn!sΘ1#~Enn&UC @ @ @ @ @ @& rS{C @ @N`ѡCXxq}+'F׮]7YD W^y%w1.n)CGժUcԨQq뭷fmn"@ @ @ @ @ @ @@Yw& @ @ |A\{1`_~yqgD ֳmĈqw?]tEѫWQƦx+`>θ/nݺo~g}6T`ɒ%1hР,d5hȫ:>MiB @ @ @ @ @ @A @ @شN}_NwGFϞ=SNi/~V7k֬,g?>Zlg}vzQzu -Zo=}hݺuڵkԮ]{ӤI+>8cYJ @ @ @ @ @ @< ,O  @ @ @ ,^8 wyg >< 9<ꨣ㎋?\Θ1#xG_5jd)M6;bE/+dO>d,_<;8sαfYŏ>( Z}衇wމm6 M{mfk: @ @ @ @ @ @(>Ag2 @ @(}YGy$^}ըRJq衇fg˖-B eb-2Ʌ ƿx^qe!|G}tp ѩSZ꺔҆z ̟??x8p`L+ =3rrr֫СC#~lѵk֭[xodo. @ @ @ @ @ @l 7cv @ @ @DR(!C B̙o>ڴiSp֩SD!}odQbѱdɒh޼yt!:v|pn0X/?1cF8),uѪUVZ) |GY dsӧOL QFgzAlͲ=~>Kg_}U>??Hc柟yT'}ּy{」]vQv_ @ @ @ @ @ @( CD @ @ P˖-V7eʔ,(.?1͜93 KA݆Y]ݺu#LڴiHAx7|&L?8sӦM+iL!)qѢELg~Ao}~]vw9*U(@ @ @ @ @ @ @& =q%@ @ @$0Hbٹdɒ5EV\9TR׬Y3 SN HkH{,Bs…-x}֪U` y\ @ @ @ @ @ @XA룦 @ @ @ @ @ @ @ @ @ @`=*G] @ @ @ @ @ @ @ @ @ @C@zB @ @ @ @ @ @ @ @ @XA룦 @ @ @ @ @ @ @ @ @ @`=?[IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/images/http-strict-none.png0000644000175100001710001771152000000000000022552 0ustar00runnerdockerPNG  IHDR"EtXsRGB@IDATx{?GG*0bؒf1+(2rmfic:L`;R} ChbS"Ww~]*WT>]|4j @ @ @ @ @ @ @ @ @ @ @ @ @$+i_ @ @ @ @ @ @ @ @ @ @ @ @ @(j@ @ @ @ @ @ @ @ @ @ @ @ @ RjT~ @ @ @ @ @ @ @ @ @ @ @ @ @4F@ @ @ @ @ @ @ @ @ @ @ @ @(LI&KEEEf̘3gI&i޼y[{Ӿ}i& 4GVj E @ @ @ @ @ @ @ @ @ @ @ @ @@3<'x[ @ @ @ @ @ @ @ @ @ @ @ @ P͛?ϹKi۶m<;ݺuKƍWح{,Çϰa#]v͠Aҷo߬+,67rB @ @ @ @ @ @ @ @ @ @ @ @ ExСCsgg„ ַW^+4D9z\ve1bD[o?1#XV1ZvU @ @ @ @ @ @ @ @ @ @ @ @X|eV߾}3dȐlu׿r+H6mry_~ubmB @ @ @ @ @ @ @ @ @ @ @ @Ԧ[o?<ݻw&lg}67tS*C^z#vXcL86yUjճ @ @ @ @ @ @ @ @ @ @ @ @ @o|0Fʝwޙ:+_?W\qEƍSfvȕW^Yవ' P,D @ @ @ @ @ @ @ @ @ @ @ @@eee={f=ӫW^K.yG}/w\彭@ܕuLC @ @ @ @ @ @ @ @ @ @ @ @,"0k֬ 0 #F%\>z%}[o;3[r%DL @ @ @ @ @ @ @ @ @ @ @ @ @Ⱦ ޽;rKϞ=ӬY=:_󎖯 Wp @ @ @ @ @ @ @ @ @ @ @ @ sO>yʀ|+\uxt-kVƌ-Z:sث @ @ @ @ @ @ @ @ @ @ @ @'tR;U{2y;Ej 4jݎ @ @ @ @ @ @ @ @ @ @ @ @On-}ߞ>}K|S?y_ӦM ؚ7o^5j͛VZM6i׮]6ll򗿜[s% PkEIۇ @ @ @ @ @ @ @ @ @ @ @ @,믿._3Wҋ.(rJolexVÆ 09s[Eֻロwy'&Mʫ?h߾}vit={W:tj"|H @ @ @ @ @ @ @ @ @ @ @ @ @UK#< &Yf6{G<#iР~72~kݚ}WrF @ @ @ @ @ @ @ @ @ @ @ @Xm||k_rW_} *Bj <8GNeeem,WF ʠ§_93Og6Fm8 ڵe][i۶mNMuZC@𕜑 @ @ @ @ @ @ @ @ @ @ @ @V~8Kwׯ_zO<1w}w^|뮙:>hwq֭[gO>Ӝ9srww)~G9餓ruwsgVϩٳkcmݶ *®6p4iҤ4[3unH>}3^xak7߬Nu_28ߪjJ_] @ @ @ @ @ @ @ @ @ @ @ @ @ U[mUcܸq9csEeĈ8qb&L^;|WΝ3`ly衇ʠ;"=\sMO/R90묳N4hPեKYwu˥֒ .k˱"\v.(82P!k۶mƎ[]7dȐE Ocq>mE/˗rN @ @ @ @ @ @ @ @ @ @ @ @X>kfuw;3v!wqGO|ysvL6-3gά[҇4%] Ԫ/_9  @ @ @ @ @ @ @ @ @ @ @ @ @`hѢEJ5eʔZk߾}|'J# `VӦM3ut9W^yezPmRhQFYp?|VZ}ޥj??H>Xh|}Ɇn.lE_jXfq5iƋ[ Ԫ_ι  @ @ @ @ @ @ @ @ @ @ @ @ @`(Zn~V6gΜ\s5[{ ` 6 :crWC ~˂k}VҌO<,oӦL[{キ-lEPVaQ أP-I @ @ @ @ @ @ @ @ @ @ @ @U_r-xy7ӷoߌ?>:uʘ1cpW3gά{fܹe}9}rfqz"īO=j@ZĴ @ @ @ @ @ @ @ @ @ @ @ @_C}e_\]tEe_֭ӥK]-[Lc=iܸq7dȐ 6,gqF׿5F*~K/TO^uUW0apڵSObj QF` ~//k{W_}|]ݷ48Y Ԫ/_9  @ @ @ @ @ @ @ @ @ @ @ @ @`c=2qW[..'wkP 6̶n>?x<^93Ӯ]馛O?~eCI rg6l3s>}z򗿤Y\6mZ.tԩM|xzm6u`,弉  @ @ @ @ @ @ @ @ @ @ @ @ @%(>\}ՙ6mڒM"Lh۷DV_Yx*4iaZ{ƍ$aZEmUaZE8p[o׿uyv-7|sf͚"/Z$h+ bN޽өS~;^{mg4iR#BUQQQκ' P}'"@ @ @ @ @ @ @ @ @ @ @ @ @{.~7Mu0bĈq9餓rgT_u0`@F)S;-[5 kZ3f̨n Ԫ @ @ @ @ @ @ @ @ @ @ @ @ @@ . ~zN=̛7oUtA9c~l޼yo\}cSNFmTΙ3gN***;@hPY֑ @ @ @ @ @ @ @ @ @ @ @ @I[ò{cڴiSSY+¯N;\zկ~/=y晌92:t(ùy!W@Fm# @ @ @ @ @ @ @ @ @ @ @ @ yz衙9sf2\rW(_=W]uUrd.phC @ @ @ @ @ @ @ @ @ @ @ @ @`t'x"Ko#țo뭬|O?=;cZh'|R +yUm% @ @ @ @ @ @ @ @ @ @ @ @ @2q9S2eʔG?'uYgVZSfϞ]BƏ$s~;. 6\[̧p @ @ @ @ @ @ @ @ @ @ @ @ tzʄ ri&l_ynT=}\|r-C? 0͛ye,J+3mTV:y2"@ @ @ @ @ @ @ @ @ @ @ @ @X`ԩ~ /0EpU>}rqǥ[nipU=+r 7d9ꨣ2xpyT/i2NH%UD@*!] @ @ @ @ @ @ @ @ @ @ @ @[ߌɳώ,nYfjΜ9_#Gfy[gwVZgd?>NFk$zjҮcVmZu; @ @ @ @ @ @ @ @ @ @ @ @X ^~9ג^- Ms)vit1oy6lVw={,cǎ͸qTe<2̫د֩Sɼy6n4h|'mUS@֪]݊ @ @ @ @ @ @ @ @ @ @ @ @VS?LvMUHVCɚk~/Ы>i޼yzli߾}kժU5kV5kVf̘L6-oF&M_8qbWg]w-uVYO*jj$3'7<8nZ @ @ @ @ @ @ @ @ @ @ @ @(§/ydM?0}L0!{\pAӟ&Çv% *n}!@ @ @ @ @ @ @ @ @ @ @ @ @y#cIfϾ)nivJ3N8!ydd͓N>c:#Рՙ8 @ @ @ @ @ @ @ @ @ @ @ @X{/iduѣ+V2Kv9s=O}4inZ Wv'@ @ @ @ @ @ @ @ @ @ @ @ @ TV&~rE Cyү_%~@СIfIɬY1pU'>C @ @ @ @ @ @ @ @ @ @ @ @ @?M0Ont1mh*5*yӖbҕ& Pkۘ @ @ @ @ @ @ @ @ @ @ @ @|,0bD_%]t̙3'CM?.l\uUxOSTVm  @ @ @ @ @ @ @ @ @ @ @ @ @* .]O.#+{w^zlfQӒ.Ky$q1m Z6 @ @ @ @ @ @ @ @ @ @ @ @ @:5imdIj8∼y?g ̙tL xe᪛o9{gڶm"ocƌtaZm馹{VAؽ[dTy%>:! PN| @ @ @ @ @ @ @ @ @ @ @ @ @Ig|'9)Sr]w_~ W^y%^{m&NXW^~)֥%;zh2cF]:4l @ @ @ @ @ @ @ @ @ @ @ @ @rJIɽ&M,ݕW^O>9oVZhUƎ73zԵ8^{-oq9CUY:uJ8"ºr*h @ @ @ @ @ @ @ @ @ @ @ @X1%%3g&Æ}2L8M7ݔ}aZjs.tF-^W^bVaɥ&]yg]r @ @ @ @ @ @ @ @ @ @ @ @ @#'c$3[saYkfs=zlCGÆ ӨQ f9묳2k֬rX1q9sk-ܒ^TX|G}tɇ~z/$_s* 6WZ- @ @ @ @ @ @ @ @ @ @ @ @ @` n99š2ۚ6m/}K&lPc=͛SN5s̅j>류[3<3?p~T$~-A4hP C=4gqF_Suޟʉ'7|3};3&EkC'^g޼y0`@^{гgra)!^k~@O1F @ @ @ @ @ @ @ @ @ @ @ @AwQ^Uq@D@ *V$ دlML$jb&+ƕī7DƮDv Az0;Qa<{9s{9ÿq" .8oG٠!CdUǴib„ q%dS:t(3ӏ3gfώ-[ƿ߿|qyqώ}Qv\պuH_)+Z?7|Ғ%K{ka_]oӦM+vi/ I/EtҘ4iRIYhٲe:u_Ϟl1bDuj$ Pw@ @ @ @ @ @ @ @ @ @ @ @ @*I "n%W"vm&=s_qƭFU@ɫ}瞈NҥL@50 @ @ @ @ @ @ @ @ @ @ @ @ @ }w)D{1}Ѿ}tMc=u뮻.bj?#&Nhڴږ O @ @ @ @ @ @ @ @ @ @ @ @*A`̘ώ^0I⠃U 2">4k+sVs}@NqI @ @ @ @ @ @ @ @ @ @ @ @ @_-0~^{El]С |XwjoEm֞}֝ Ԫoξ  @ @ @ @ @ @ @ @ @ @ @ @ @` ZqӧGѦFߒ Tҥnq]WI+r @ @ @ @ @ @ @ @ @ @ @ @ @ \tQěoF<07[⊈n<P˶S\jٞm @ @ @ @ @ @ @ @ @ @ @ @lt;88čU"v%b" 0e@2 ' @ @ @ @ @ @ @ @ @ @ @ @ @`F7'?{ƨ) ?>bkg aj[G @ @ @ @ @ @ @ @ @ @ @ @1EgN;E [cf#U zuD{q]U)3Z> @ @ @ @ @ @ @ @ @ @ @ @ qAgGfĦ烆j33"> kZ]Jݼ\jl @ @ @ @ @ @ @ @ @ @ @ @jDc´jڻ ѥKUWU*{nZ @ @ @ @ @ @ @ @ @ @ @ @Xx #n!;"vyc\ D\zi]wELV7kU o @ @ @ @ @ @ @ @ @ @ @ @ Pc}7Gco#;/K";=)DGRVu[ @ @ @ @ @ @ @ @ @ @ @ @jFLD΍8؈￸'аjg8U"'@ @ @ @ @ @ @ @ @ @ @ @ @5] t1{vEF_7?? "*k#9_ ԪJ]s @ @ @ @ @ @ @ @ @ @ @ @ @@x>}o777"??_wgEڻ?5 @ @ @ @ @ @ @ @ @ @ @ @瞈 ;^`Aĉ'Fv{~OϏxhgUUuNqIK @ @ @ @ @ @ @ @ @ @ @ @jUmF,^6hq_k{EO#~T\uVV @ @ @ @ @ @ @ @ @ @ @ @ @5[g:L+(bʈ}/ٵ] yfSOE|iկU_VU_޴:  @ @ @ @ @ @ @ @ @ @ @ @ @+;"/+oG99qY_=Ν!pq% P,M+׽ѫ׺ǸZ:5W_UQqɟF @ @ @ @ @ @ @ @ @ @ @ @G~ƍ#Lje}S#^}5bҤPY Ԫ,I @ @ @ @ @ @ @ @ @ @ @ @ @@뮈5|rr(#> ?HZ59$b-"5:s @ @ @ @ @ @ @ @ @ @ @ @ @v ,\1lXDQOYmFXtid˗G1ʕ+zjժ`^z~zNIUsssy^z////5j7.w&M/9͢cǥ_{:>yɾ[F-yZ^ uQ`#ZxɈϯV_M9% @ @ @ @ @ @ @ @ @ @ @ @TXp˜?~vO"t-?Xxq,Z(;KR׵BSWcy4$4tXUʵֵbŊ,+KGq%[_[ҋJzBR&l[.7thӦMlfٱ|7mFÆ OW8(6ΕV ԪVn @ @ @ @ @ @ @ @ @ @ @ @ @R̙3c֬Y1gΜ;wn1ϛ7/ JYkbU *=oժU8ղe§Ro֬YƍW_oDI]fXtiY/ [dIPбt\lٗVKF)\+???ڷo-آcǎ[f[_z؅Z!p=g`ADɟVAZ @ @ @ @ @ @ @ @ @ @ @ @j@QQQ̘1#NӦM+SVk=EvJCRӚm۶fEӦMkBbϟgAf)\6RVΝԻt5*򒿝0쫶DVm{cK @ @ @ @ @ @ @ @ @ @ @ @@HYSL> &N~aL<9>,@?L6l2@N:e=4Ҟ999ΰ&·f͚cӧOz GKAi+Vȶmu5f֭[lvG'q5o}eZ ? @ @ @ @ @ @ @ @ @ @ @ @uF cM0!{?~|1gfi& Svm`T;t)xI1o޼,8-=PsfwޥKqcvz#f͚ ^ŏoY7Z'P[#@ @ @ @ @ @ @ @ @ @ @ @ @ ,^8ƌcǎz+)D+gRHRm]7l ((('fZ~–)l0ukw}s=#??1|0bE"ZF|Y@֗M\!@ @ @ @ @ @ @ @ @ @ @ @ @@ pqūz=: =*..7>l,[,vi8㠃ʂڴiS]۱JH+#FÇgp 4Ⱦ磎:*<ڵkU&"#bVY#PzB @ @ @ @ @ @ @ @ @ @ @ @@9sf<k[azho߾TXhQOGs̉w9?\}4c# "7(_V ݻwGy睸{{9sG?яgի#Zᆈ3ΨVmMU;  @ @ @ @ @ @ @ @ @ @ @ @ P }=#L~{̞=;nӧ0: veӦMgzhq]wŪUp7unI"Tn~XVv$P6%{$@ @ @ @ @ @ @ @ @ @ @ @ @{{챱;cq'FF|} 999ѿxcԩqQGOӒpnqwիkki#f(w8΋˗ׄUjUVVZ*nI @ @ @ @ @ @ @ @ @ @ @ @jٳcO>$~0`Fbʔ)1mڴHnY]wݕU*mիW;SFNN͝=SqGd!ZC=zĕW^)kCۆ|+~blٲ ]Ƨ c[o7ژoEDAAo]εsJ毱vz5 @ @ @ @ @ @ @ @ @ @ @ @uX`ҥƦnC ͛ojSTN6<3gΌ-r2ݻw5*V\ ><^|Ÿ+;D>}{##F;ZhQvm}O6[I5/.,k}רq)3ό~:|͍WE%%sFkW+9sni*#@ @ @ @ @ @ @ @ @ @ @ @ @@ylٲx7zV JChiӦh}Yq͋>KPVZxC ^{`zG)d{݊{ U^Ӧ_L|y.S'';ף( @ @ @ @ @ @ @ @ @ @ @ @*KwߍO&lRYVx &=ܓ%uYhѢxꩧG뮻.{x'cǎ?!ڷo}Q򗿌UVENNNHt 'D/+W9zh^{-V[m]?׹4e]# hժU\}g{7n\l2N;59Z/袘5kV/ +0m_=1vxCѥKcԩqGfugLSLw=,X_~=P 1q{ウzZh'O8 RUr={v{ѳg2$wcɒ%ٖoZ/?yvm+ :[nl88S1韵tmƌYoF|ΝsU :4Ϝ9sO.7o#Pw1㎫իv)Z]8I @ @ @ @ @ @ @ @ @ @ @ @lt{7uwk^R6mZo1 uzGYԲe˲6lzj5f̘Hs;d[4L릛n~Ş{v[pqkrԬYHAU)w]6$V>.Ҙ;wnvaq=WN\>lYo['x"{._?ȮpѴ$(IW?lqGI'͛jKRXiKRwwyg,vyeSV J-h%N:EeԺ;G޽⨣BR̙3{ǏjꪫnȂNb~zٸݮ , .}~F&M"o t k׮qGd&짲 P*nI @ @ @ @ @ @ @ @ @ @ @ @j;{w57ª9_?pY֋/X643tAYךH#F_ٸɓ'gAJ'|rqѹsl/RU ZgϾKYRQFِ.(8sb}گ>ffرcm۶R kݻw^{,[o¨.\QyY S Z*kY0X jذanxW1ڵ=zd[ouV_V5SVjjKaVRtM:W#Gfkj)$.N;n|{K9}S5wY@/?I @ @ @ @ @ @ @ @ @ @ @ @@ƍT Jmv(Xre>8rK§Rw{,VXQtC=4R8#<~z8S0{t }dMbܸqڵkfk4iҤlo{Ҽylv N8!RT 4iR,^88.Rދ4ߒ%K?0oCwRNUךn{ڼyc^H]),͘1#ʸJoSW麥!_3g,//-V_  @ @ @ @ @ @ @ @ @ @ @ @z)xZW{ 磎:*RߟKos9l\ J4LF>}Ӊ'^ʎ)HkY`՚7J]ve1jԨ;6 J*3Lku>fmK-gJǦ`pt-????~-Z(RVL:>SSj]^s{ۣ}YZn_{Xyyyr7.5I@ @ @ @ @ @ @ @ @ @ @ @ @z!0pw7.?>,nx'bРAeumȑ#ˮ-2ݮ]r(,,;.RhUik֬Yvo^*;?Uygӧ਴^~츮NCƈ#NFkhYVMu\b;N[%Kd5ZkKڲebZU lz @ @ @7@IDAT @ @ @ @ @ @ @ @ @j;gqFwyBj6|?_qaEV&իWv/]K'F~|&>8餓"6ֵkhѢE7eCRSj:ioj?|t)veѣG6|ذa[jU#daZrHi&lٲl҇rrrӕ+Wfʬt:N2%.Ϗ{'n{yӻJoϞ=cԹMV{jwg @ @ @ @ @ @ @ @ @ @ @ @lu]͛71[iԚTsͶxⲭM6-;_paٵt”?9SG)$+dp6th۶m,Xz]vY4?aԨQO~_/.ko߾[gHOQ)Hi?Ә={v<eaXiЈ#bҥ,@,G1iҤ뮻^>,򗿔ܗ^zi3& Gwy':t?dȐ,h믯Zg͚͝J[!}ߟ|I飱o%zg̘Q~̜93Vz~lR?~|{Qlb&Р?k؞l @ @ @ @ @ @ @ @ @ @ @ @U"R-w}wyѲe*Y&+(5uXhQ;6nXjU{ĕW^Æ ˦JPGuT4k֬l-" JnG}t0*>xO?tHB|,|jԨQѭ[,W^ƥ={Ы7x#l?vX\}Ѱaõ]vg}6{x饗3vm]vѫW, o[V㭷)4*e”Zƍnu7fhi/:u]w5;xw㭷ފ_|1gɂN?fmqſo~=MƋ/8ϟ'NX|y\pYYz)ثsΑK=??RPX Kcoe=̾Ҹݤo /̂~E Jkbӟ4'n)$N]2a{ U^I[OQn#t9%NU @ @ @ @ @ @ @ @ @ @ @ @|… 㤓NʂRӀቚ{{Ѷmۯ`5K+}Ӎ›R0ַ !>}zlVYg%Ck`u,`+ns{)*Pn:͛P9pɒ%ѪUKkNAS)`*[FeZp%}ൢ5kV+yJ_AeG^b+Q+$4,_Xa$PlL @ @ @ @ @ @ @ @ @ @ @ @@ HD)+C=4ҥK qZ :þqc}5no^+jF\O>_W=:_M6݈;ڥjU7z @ @ @ @ @ @ @ @ @ @ @ @W 777.8cG?Qqggڷo_{ Ɲn:.o\q1i… qfZ9kνo չsxO>c+֬%9%6  @ @ @ @ @ @ @ @ @ @ @ @ PeCK.$&LrJ\xYV-hr .6m'xb\}Ց_n5[`׿5ndM/R]}hG7Շ+FZgi& @ @ @ @ @ @ @ @ @ @ @ @!C⪫_~9<8cFՁjn +Vl)I1lذ['nݺ/8p`*q*Y?"*I @ @ @ @ @ @ @ @ @ @ @ @/R=:tgqFt!=9rd 4i)@k^2y睸⋣sqGdC{/N=zUq\Z߼  @ @ @ @ @ @ @ @ @ @ @ @X/x衇;̂Rր}^wyxGc„ ѣG8bРAѮ]P淪a矏[MUU^  @ @ @ @ @ @ @ @ @ @ @ @̙3|0^{hݺu??w۷Ԟ#P#-ZÇ!CO?s̉w9?5rkS*./Pv$@ @ @ @ @ @ @ @ @ @ @ @ @ ̝;7O>d<쳱lٲi⠃<0mڴBJ;~W#FѣA|GQG]vU˞jUYVx;dߌ3[mU^gؼy*Ԫ'  @ @ @ @ @ @ @ @ @ @ @ @ Paŋǘ1cRy4h z޽{nof^ӃuK Κ8qbgٵ▛ݺu]w5{瞑_ jP5*2jUΓ @ @ @ @ @ @ @ @ @ @ @ @T5a„x`ɓX6mm6frCYRndM8͛SL>O4) ͚;wnեK,|mvʂJ͚5h Ԫ[Uq;O @ @ @ @ @ @ @ @ @ @ @ @ @ZVZSN> &N)4mڴ Ɩ[n;wV[m;v̮|7jٷE^O>Yf̙3c:1cFN{M+V&IYu5 QKjo}lv7n[-*,Pv$@ @ @ @ @ @ @ @ @ @ @ @ @F(**ӧg[)k))e˖3///ڵk۷/S֚m۶fEӦM˞uB旤*?;wnrʲ S ViYNBR8Z.]ިQNj@Z$ @ @ @ @ @ @ @ @ @ @ @ @jEb֬YY3gNfӼyzr55i$ڴiS7dhݺuK[j-[-Zdg`Xay;s=E @ @ @ @ @ @ @ @ @ @ @ @ڈN"kFZ3 @ @ @ @ @ @ @ @ @ @ @ @֢q%%kq!M:# PkyB @ @ @ @ @ @ @ @ @ @ @ @!pm DpBد] |Z72 @ @ @ @ @ @ @ @ @ @ @ @Q`c`jThZ5Y< @ @ @ @ @ @ @ @ @ @ @ @j3DѿZ zj^_ @ @ @ @ @ @ @ @ @ @ @ @ @@ka^*4 PjO @ @ @ @ @ @ @ @ @ @ @ @֌wѿy Psj՜we @ @ @ @ @ @ @ @ @ @ @ @SDii7YaZՔ @ @ @ @ @ @ @ @ @ @ @ @ mY% Pjo @ @ @ @ @ @ @ @ @ @ @ @X##FDL6(5<!@f ԪYj  @ @ @ @ @ @ @ @ @ @ @ @ P#6W[4W@5; @ @ @ @ @ @ @ @ @ @ @ @jԩa͍mz,) PkI- @ @ @ @ @ @ @ @ @ @ @ @ PE4j49خ]jT/֗7i @ @ @ @ @ @ @ @ @ @ @ @X-K"Zg^ @ @ @ @ @ @ @ @ @ @ @ @ @`6,⭷"z|/4hZZ6iG@U&4 @ @ @ @ @ @ @ @ @ @ @ @,M`=L]vK#FĀsK6:r-cXJ SXe<  @ @ @ @ @ @ @ @ @ @ @ @ @@&E<@ĭF<{Ѷm*F-TVV%%%c„ q7ӗ[z뭘8qbB Y)@ @ @ @ @ @ @ @ @ @ @ @ @"60#"&Oڵ[rb-'@ @ @ @ @ @ @ @ @ @ @ @ @)7qIXĉo߾pJ*--t\o~]Yuukl @ @ @ @ @ @ @ @ @ @ @ @9x|糥{F/xcΜ9;h׮]?>k:uj{1y8ӢGŽǰabgѦMb/SLw1:hѢEOa]7tS4l0?+={K/-z9#F#G{5j;vO?=95nܸ[#jr)5s=q]wŌ3=si⪫1cDf͢_~qU!P; @ @ @ @ @ @ @ @ @ @ @ @{bРA9+ :4vu•³R裏r['irƓO>~x^wN^)Pz: j˹ފ^zo~y؁Sߙ@mU߾ @ @ @ @ @ @ @ @ @ @ @ @ @`5GӧOyŤIb o1f̘'xbj*va|C=3ڴiSiu);Y/q2f̘Ko|ɑ·RUjKn)9sf;6|x"Ma^=X/))#9yGrXVƍo߾qe :uDiii4l0.袘?~Ns=zꩱ.?p3Z-PV  @ @ @ @ @ @ @ @ @ @ @ @ @.bM#>'O+oqo߾w=4izKjUUڵkK.9j֬Yq-… #(ѱc裏r[vyaWmYq7#G=#Νnָ+r@V *x /Tvy8p`t=8C[n8dȐhٲeJzRWz^ RfZ; @ @ @ @ @ @ @ @ @ @ @ @Y`޼#(l_~9WիWiu֍={ƣ>Z4k,/-PTW_͛ǨQ*TOUU9P+j@.,zO=T :4ߓ¼*UXӧO > @ @ @ @ @ @ @ @ @ @ @ @Xi1#?bb1q;kninӦM}E+73g`[o-޴;=z/;wn]6hРk#n-|ab;6lXs1y}g}v)>䓘2e6Z/ @ @ @ @ @ @ @ @ @ @ @ @VѮ:ujԯ_?79ڨQQFѭ[(i͛7Ҙ]{S9󢬬8'>xJ JAZ_sΉma?p:蠃u{;3ߏ>} /4bĈhժU4m4=ztqEovM@mU[߼} @ @ @ @ @ @ @ @ @ @ @ @ @Ǝx챈lJeѩS.W'NqO~:)\>`yw*ŤIr[:;߉f͚w_ ,O:ӣo߾qWqӦM7|3Zh[lEJ)d+4:~fΜ*a-\0ܾDϞ=c֭[H{.(v}СC#,PV% @ @ @ @ @ @ @ @ @ @ @ @VI<*:vgӼ{ѹs:thL0!zgyf} /;//9vax⨣XrJ빿_~oķxWrۉ'Ϗ~8R ?8"r <86tӸ㤓NGsLrcƍ?񏣴47ޱ'\\sM 0 Ӟ>\/++vG5믿>q?8~ӟƏ~ҥK\|ŕvA j @ @ @ @ @ @ @ @ @ @ @ @GO<*ñ #_0X!Z+d @ @ @ @ @ @ @ @ @ @ @ @T<8aÈo|b:VN@ʹ @ @ @ @ @ @ @ @ @ @ @ @B`ʔ+>햕E\w]ķѸjXYZ++> @ @ @ @ @ @ @ @ @ @ @ @S#<3bM> zꩈ#bk- Fꮑx @ @ @ @ @ @ @ @ @ @ @ @HY>[wq-EtѾ}ܒE  YdI @ @ @ @ @ @ @ @ @ @ @ @ r>E^GnqcƬ# j@, @ @ @ @ @ @ @ @ @ @ @ @_bVieeE̝1xpD1sfa3@/e4 @ @ @ @ @ @ @ @ @ @ @ @jut`gVD浊f Fe3SO1 @ @ @ @ @ @ @ @ @ @ @ @HY"JKsΉ8C ] @ @ @ @ @ @ @ @ @ @ @ @ P{RV ͪc/FVF @ @Ge @IDAT @ @ @ @ @ @ @ @ @ @ @ ̞]떧Kč7.=p; @`I:K6i!@ @ @ @ @ @ @ @ @ @ @ @ @ ̚QVVY#imu}Eԯ_VF@ʨ @ @ @ @ @ @ @ @ @ @ @ @D j-\fKK#60hv5@Us/ @ @ @ @ @ @ @ @ @ @ @ @s3#-luo6,LkMkT@0 @ @ @ @ @ @ @ @ @ @ @ @,3>_oIIGtyC@Vu( @ @ @ @ @ @ @ @ @ @ @ @G}nkϯ P]K< @ @ @ @ @ @ @ @ @ @ @ @XflS^ѷzA["@`()+/J, @ @ @ @ @ @ @ @ @ @ @ @5@`1gΜOGzܹc޼y_ڑ?X`A>/^/\/\0ұhѢ*ϩ/ET<mT/))\Hy^uƍQN%u-S7իϋ 4Wyt4lذұx[ƍѨQ|XӦEn1|xDk{55~5}Y- @ @ @ @ @ @ @ @ @ @ @ @_@ F͚5+>裘9sf>6{||U Z)jy%Q`àR6mlA_^0U!*[gsxzG JG~㍟qǕҘBW^:U KS=c@Զ"%e:4iϋכ7o͚5tX/l2߻"5()G(K @ @ @ @ @ @ @ @ @ @ @ @ @`H+3f̈?1}9+^1)8+ t*)ܪT8 AL MܨQbS΅ЬYʳCO[)h+͙3'*+SpZ!PPOsWU֭-Z|VZs 70tU5_`ڴ֭#{ounuNf. @ @ @ @ @ @ @ @ @ @ @ @,O`…9kʔ)1uJ|cZy2M JGbSN8JFPtԩSTBJ͛CR`|VWRR 4Gz]͛CRV `+C t0aB=6s%T^hY<=6; @ @ @ @ @ @ @ @ @ @ @ @#0wxwc{/S[NY-*>4cm9\( 7ܰFTƥ#+k[O?5}b\!.}z:%mƱ&D۶m+M74.e(,,b޽u+q.k"@ @ @ @ @ @ @ @ @ @ @ @ ̛7/&M'N~;)<+)oV1eʔ(D4h l9',~mVO"Rf7y\?6Y(ӥP[FbTOA\)KY=9igÇGz*Pk}}E @ @ @ @ @ @ @ @ @ @ @ @`1砬7x#^JǤIb…f͚wR O i߾}h]SRR. X[鷛ByBR^ KDŽ bܹyyϿm&?<r)+/ Pkj;  @ @ @ @ @ @ @ @ @ @ @ @gώcƸqW^G?ծ]z+:tAZn:/"@`/lP‘4h:uΝ;Ƕn[$4hòRM.]GdуXҿ;ǏA})pתU޽{ܣG~)|b^G ԪN @ @ @ @ @ @ @ @ @ @ @ @`:uj<OǿG˖-[n9&٤sQnudA.0wUK^x!mѳg|ѫWh޼NRܟ@"dn @ @ @ @ @ @ @ @ @ @ @ @ Pn#Gc=ƍv) 6l%%%տ3 @`.\/R<3HAcǎ^u5c|;RZjv$@ @ @ @ @ @ @ @ @ @ @ @ |I >< _-Z.[>RVÆ Wn$@9sf<#l͟??ľ_7nݺkslZ+)PkI @ @ @ @ @ @ @ @ @ @ @ @ L:5x:thZhQWO)--BsL"0wx'GǨQrAvXpѬY*)PJjBL @ @ @ @ @ @ @ @ @ @ @ @X9Yf=v[x#|k_}76mr5\>|0 >ñ`oqx`ԯ_Pʿ2Z+oN @ @ @ @ @ @ @ @ @ @ @ @K5jT\{qGf裏>}nuY}: Pϟ)T;/ixѿرc!+oN @ @ @ @ @ @ @ @ @ @ @ @bȐ!;cZyJ ~_lP#6UZZzSgǘNqgv';ww=N:Jm]Vj[#<]tQ* pQz7:zum-[n%os)SV#ͽDkxG @ @ @ @ @ @ @ @ @ @ @ @`u7.sk_"iucɁh)*}CHX)l+}霂 ii))~ǁCzꩼʖ֚wZ()*aoO.ޗӷµR۟.vn#8"o9;~(^|nJEmGh,ҘmӞSPXS կ~]u&M}0|Z5 @ @ @ @ @ @ @ @ @ @ @ @xCf'W6x2;'7|sNVO?t@J!C)}9&]m?ԭ[vgбҴǮÍf̘'xb̟?xo`3SR*cƌD֖HIi\ W*7\ RHw>hiӦ;C~bsҥmi\ Ly؁P`¹Re]V+?~|yo~3;o),^R9srW kjݺu9 'o~=)o߾1iҤ8rX JSLdSO=5矟)+foaÆqE'c=),?ϑs̉ÇG 4W^oSN9+s RX۽[sL+7#wLasfZE{饗𻣏>:Zl>RBVw'v}l /[ouM @ @ @ @ @ @ @ @ @ @ @ @RRPR 7o^4h`ިQfդI\OaDL:5ӟv-v?p`t 7D󘲲;m۶9Ԩpc I9lyg^z吡ۯ0] @ @ @ @ @ @ @ @ @ @ @ @T!pПU_MUn3ΈEhc=6^~JiҤI<1{s=SO7dȐ*M͚5wu)e{qGi?㬳ΊN:)_\~B!vͧ&WVM|kL @ @ @ @ @ @ @ @ @ @ @ ?+r%\ÑR '^\|q'‹u떯GYlOQFEF4ndMG?Q ><5R''>x+Ьy]U[s?r/ֳj={T:veU{ ]]UuKǎiӦq]wѣCRXmqg}^x!3#FӧG S0`@n:nHJ{7F K?7|3<uرc劬/ͱ*%}[ou˵Hϙ3gN?wO|N&N)hri0<0ڷo_׿u~s}iqO~hժU|==/i~9騣>f͚/~z7J\ɓiӦڦNZl{wrpN&Mmsv>C~j˃˵t7FΝv!\O]OJR-6h8묳rӲu m"%R)QѰ?Hkc…ѻw袋"ѡCѣG)+mvѲevwB0ٮ͛7wqG$s=7cȐ!/@SO=5o [ 6,|)-Y_oPz衘0aB\s59`ny6o#i04O0 >~xs׾uqִ%I|&$n#@ @ @ @ @ @ @ @ @ @ @ @ PRT "wy9h]5IZgyf_;9?g:uĀo~9|E9褓N?88C+?Fm馱^{4\<@\x1f̘[n|ߍSN9%:U^8믏z*>(_m1x<wߍ֓{.BRPW 4hPi[ocR֢E"{アwR_ԩm]tDaaÆy)4*"iӦZӌ3~S۱:v۸s՜9sk׮c>'%qy+If?OsV :KsS:7},XT‰JZcccW_JQkZ 7n\5φnZ3vk)!PǏO *!dY Y+Z%7H '+\m^|<#UUxA57\~/z|as@"UJ@Y-% mOӹ/r /%pj~wjΗ @ @ @ @ @ @ @ @ @ @ @ @+P_.\yUG?<[B;-pEo\htm-O[j=0`@&M}ݷųݔ'|r~-uv/ŬYۯ;z5bĈ\wu *w>T]sњ9Ӫ Xzk?+_JknWߔp[n%?ϫ^;zjN:jy5v_ @ @ @ @ @ @ @ @ @ @ @ @ lA.\xᅹ3r*|?=I^c4]&PB.ӧB߷_|g}KVs.޽{g 4\)Z%4n֭[Oʡ02vmJU}?̐!Co;vl@SN~ߤ Ї>nk׮`մ@Z6 @ @ @ @ @ @ @ @ @ @ @ @T/B~_omݖ=z}{_g^6lN&PN:*Pm6'??-;z뭙4iRtV?Odwlw 1cF/[nɽޛݻgM6qշovW *I>`^>GN {ߟ:(p@Zϼ<9Sr{j-L; @ @ @ @ @ @ @ @ @ @ @ @m ꫯtM'f֫v}y;3rY +-,Aڇ@ w>}z> Z*JzJ.]Ԕ~8%lԨQU` ,!#Fٳ/v)T PZoK @ @ @ @ @ @ @ @ @ @ @ @KEGn//VZ;SwgmJ+T3Ju=Θ1ccʔ)￿:J?7.MMM۷o6t>|xСCӣGv ~M{,cǎm>V3gάxSj*Dk뭷k~+ z;_ @ @ @ @ @ @ @ @ @ @ @ @hW% Gµ_Wu? ޽{6p 6,|;~=dȐ[`ƌy''h>}bUpV dMc7BJP>j-gaoj-L; @ @ @ @ @ @ @ @ @ @ @ @@`yG3v}ӖJHJ+|_{3ˀS^z5?/={\QBfϞ׍)ǬYRŽUǼk5WH P+ZsYZ٣6oZ V[{C} [uU~]?wmaxG@+jg @ @ @y!@IDAT @ @ @ @ @ @ @ @ @/RZkU۩Cõʹ~믷p*aNs:`rj׌s|&N>;|d-jRCJhT/!T˾ MŅ.ae ;xLV%jy}kLJ瞷fH~-CY%8_~QQ4گ@7*#@ @ @ @ @ @ @ @ @ @ @ @ @`9t-%;cM- +d}nX!fϞ]kpYfU[s ۚ~555e]9ʸ(~]?pӟ6wKK.(} *&~VwU󻮇h ֶڒrȌ#ӟ&n|G@{՞vC- @ @ @ @ @ @ @ @ @ @ @ @tH/$_%kK)Uz|;> e{s}\w%VrI˰S &?o @ @ @ @ @ @ @ @ @ @ @ @Z+Pv%7.K~% jonݒ;~-{IN?=9Ó)SO-f%@`Z:F!@ @ @ @ @ @ @ @ @ @ @ @ @`d뭓3KN= @ƎS5|+lUr]rO@GQvJ @ @ @ @ @ @ @ @ @ @ @ @u!$G1'ivSb{䡇M6Iv-d[g:@S$@ @ @ @ @ @ @ @ @ @ @ @ @]srUorI%*jEVrMWw^rAɔ)Kġ3Y@r @ @ @ @ @ @ @ @ @ @ @ @ q>f9w_ry+LZem]$gv[rv%=4 ^jםQ @ @ @ @ @ @ @ @ @ @ @ @F19JƌIvS^ lZu]wMx Ygd#o h @ @ @ @ @ @ @ @ @ @ @ @.0yr2bD$?q'z-v5P O?sL&gm2 ІplC @ @ @ @ @ @ @ @ @ @ @ @ @C }wr!IZ˘1[w(3j=ד-HN9%?#~Z0!@tm'u( @ @ @ @ @ @ @ @ @ @ @ @J?Nv-l{;WVZKillWmRG>v[r];'&4%@m z>'@ @ @ @ @ @ @ @ @ @ @ @ @s JNZopHzN>7߹"@`Z6f!@ @ @ @ @ @ @ @ @ @ @ @ @On=nvPr*AVKOOOO'LO;wJ5}.<99dd=S@ץ; @ @ @ @ @ @ @ @ @ @ @ @ оd];UZuL<0y䑷/ Pk @ @ @ @ @ @ @ @ @ @ @ @v"ɞ{&nzkvP@oBZ5$[l|ɤI KG@q4  @ @ @ @ @ @ @ @ @ @ @ @L{7f曓}Y˹Z ߀^oLwO=45k%@ z{~&@ @ @ @ @ @ @ @ @ @ @ @ @ wo~\%u\H;~jw_rP:&Z @ @ @ @ @ @ @ @ @ @ @ @o yg>ɞ{&7ܐ;Wo t6纵Z'OW\?_\ۮf-$䪫pokٳgWk:묳w3-ѣsGg]w{-Ӽ#<2'pB6-{)wUY @ @ @ @ @ @ @ @ @ @ @ @+@N~ˤGa@ԥKKrM7e_9Uz*ǏO9/v!I-*cFKc%)&L|$SLaGY%$O̺뮛'ZBȑ#s7gĈ 9蠃 /+?;.>`.…O-t]s  @ @ @ @ @ @ @ @ @ @ @ @ СjY>gd]_B֢65Z/|z7La*PSNYj]|q&G$3f,ahnMG?Ç\/+䳟lFUw@<0|\pAoᢋ.6l}7~zu-Ի9X"ZKĥ3 @ @ @ @ @ @ @ @ @ @ @ @Q_Jd뭓OzlUyLjǏQGU+?hPoz!Z|ߣGWFo~*lu]wkرcS7n\sL4)7xc&N-8c9&{lr*w]>я+l~Wvi*H{.o>%'VnN<1yӷNRķRәgY_(^ʻz>ϧ[mf;sTA\ӟ06w/^%8lQG{u֩yE.0&LP Tn|%TM#"ؖTL @ @ @ @ @ @ @ @ @ @ @ @څk%RJ*:L@ UaXsLN8ᄪK.$wuW'?G>lջ 6 y{'x:n j U/N }ZwuzhV 9rd}ٌ5*%\D*@&;HuY۪%T?)a]+R:ꨬj8jKVc};\]ʘeMrJ[;ZpV-9kv_%瞛|R?\YQK~+=;cgѹ@j5o|ͫ0\9v5פ1tPu_y3tL2z6x|Vlv} r:#ewj-/Kץ^ndDUW^zgy&^xa~WJh 7ܐUW] *K]Vݻ[go;9K-fyU%i[a_4hPsVno߾yǫ1w1s=CVm͵.=z7h~A={|˫ &Tƿ/SߣWJ(ؼmVìuYgW ,R@"t @ @ @ @ @ @ @ @ @ @ @ @ @= Բr]w%F%n؞8ѵVGGTEۮZ>cs? Z<{98%TG}4%{盷K8ּSO©JV ԺKN;k~_WZz׻ZS;F +p+ Ӻr1Ǥ??tOsU?w_ˮ? +!]sbS>%NUS[V6G^S6km9t.gp@.17Rp^{e[2dȐ*$!ԧ}cccvq<93v|AU}ߔ7x נޱɕ-H¸O={V7Hg͚=ӦMK߾}`)[e-6̙3wygkz[ڂ4i"}oN9ruG#>Y6(%'?e'O 7Seb~ @ @ @ @ @ @ @ @ @ @ @ @ȑ| - :ϜݺW^Zѣ[,{wy\Қ1cF~j.2{cƌ9|SO= *O{nUµJ֣>| <%묳ʀ2#я~x:thk6<@8q &4?bذ֐|ɳϾuy嗫zPU ϽO>-ܲc}\BJ}-5q<3 =^zjG%DkM7J`V *dx`Ns_硇Jmva\XZK/ @ @ @ @ @ @ @ @ @ @ @ @MNJ>9VH'xNYe5{'_߼Ys5sgWJHTi7|sJ7*<+aMVJK8+뮻.#F_N;-GuToV}KTiտ 2$~xեlVڵeԩSwsaH=j.ٳg>O]Pmvl߾껠>dr}lI'X9mݶ~UXX;~;6gjNBT?ꪫr]w7׿*ka뮹s}-(sؕW^Yr*T}J8Z1WRݗoev駟%RKs{3roIԗ @ @ @ @ @ @ @ @ @ @ @ @HS Iv1|ĝxӓ>}>_?_92s}4S-t**|_E]T_qJhyW_zֺ:d=9昜!aŻZn~VVZi%\XY=?h%~/oJ6܀^%| @ @ @ @ @ @ @ @ @ @ @ @,C7Hv)S YwjRl+ V+}WYl[V_BJS 꺄f%kܸqUԆn*I`ԩUU={ Ys5tQnhhHccc}ٔWkVm :4+򂆛]wM-*52o1+!ds^Uj׿W_}5[neNV7gҤIЦZj []fֈ @ @ @ @ @ @ @ @ @ @ @ @x{wݕ{ry|=]/KO+-2>bi餄ygctA@VgEk @ @ @ @ @ @ @ @ @ @ @ @ Ё.0?>;":@ 'S&/}} ZQv:  @ @ @ @ @ @ @ @ @ @ @ @O.,Vk'E elzH9fhe~zrIE$ j0|XğKZb  @ @ @ @ @ @ @ @ @ @ @ @睗 xb(xIIno]جYᇿ'7#@x Z܊  @ @ @ @ @ @ @ @ @ @ @ @,7{M6:-V:*ijz낇O6=i@ -+P-ZU9ժ @ @ @ @ @ @ @ @ @ @ @ @KsIv)Їey+DQk-J1Ǭ_/dU[z׋Up&+ @ @ @ @ @ @ @ @ @ @ @ @ @`ɭ&\L3BN8!ijzCCCrao޻Zz뮛wI - ԚW, PkE}k'@ @ @ @ @ @ @ @ @ @ @ @ dĈd]ᤦA%zjMa޼wt.:@x Zq  @ @ @ @ @ @ @ @ @ @ @ @,3;LFN>e6"J!$ݻ9=v!Z*pr%-݊- Pk'@ @ @ @ @ @ @ @ @ @ @ @ Ld]w_&әd1?>ihszb|8n %Pm 4 @ @ @ @ @ @ @ @ @ @ @ @$]rm7-ؘ>=\^ZִGV]uz}L'{ꫯgW^z,W$%G'SOO /iӦez-akƌѣGj?ʞee}Q̮R:  @ @ @ @ @ @ @ @ @ @ @ @xށJmll̨Qr-T/ Ys56۬ <_%[{v D.ۻoAO'vmI&q1!Uf'7bjRj- ]d@IDAT @ @ @ @ @ @ @ @ @ @ @ @%;q;׬%{#<y֔¬6mo}̞=;^,H꥗^3gfus9qh-kcODΝi#;,Rٺ뮻6֜?~ꫯFϞ=cYYSN=cVw;#  @ @ @ @ @ @ @ @ @ @ @ @XoGツT`ԩqw}묳N|qgǮұa֬YfA_ς,\ /5z뭸뮻GQrhѢEtIQN,cJ_]t¿F_\tE?9ʔ)JsbZ+Y+z @ @ @ @ @ @ @ @ @ @ @ @*Ñ#L+~i?7xcTZ5}H!UǏᄏЄi:˗/rJ1pl͢I&Yp|֫W[ntAw?E :+aZ ~k&F}-"N8a 󱁢/ P蟡 @ @ @ @ @ @ @ @ @ @ @ @(tfEѲe+Իwm{\}1f̘KB z{wAE2e"}?bƌ7x8*UD ׯ_4m4J.z@ 6_|1>hԨQqQVٳ'P ET ,!@ @ @ @ @ @ @ @ @ @ @ @ @`u^{-⧟"'thuf)c8C:uĨQ})=3~xgڵkǀ~y/¨W^̟??}޽{Ef+*zCcv#8"5k&MZ01Zk @ @ @ @ @ @ @ @ @ @ @ @JsEԯ% /;3fLG.]g*UeB3O?8jԨ 4;ԶBy}'~8)L빜k9)x]v%uV) Ph  @ @ @ @ @ @ @ @ @ @ @ @Zx/%† i-\0>hѢE3/Em+-_~yi&,X{79l26px饗buͰb'Ww}qM7ouxWaÆk¸;}cƩ .,e*&i @ @ @ @ @ @ @ @ @ @ @ @ [oE+?j w v[ 0 vlA.v UwgGfSNӧU?/7|s/c ~Rzx_[nKO @ @ @ @ @ @ @ @ @ @ @ @ {QB t_vy yb޼yѡCw}sNj*8]-nָcȑE|ZE䠔I @ @ @ @ @ @ @ @ @ @ @ @(洨UӢPZ1imfѮ]ZGaX|6ʂ3fLtWFRo/5B\pAԬY3ڴiSB, P @ @ @ @ @ @ @ @ @ @ @ @%3"'UV… wqoh *8∸W+icE ZoDEnγ>;j qŃ>rKlfQ_L2ѱcӧOE};/ ( @ @ @ @ @ @ @ @ @ @ @ @@Q:4U66mZla‘R@رcTRn w}bŊYЧ~׏ &i'|2*T-Z8lٲqgSO=sY[RJѲe5VqZ^zѠA{Ӷ쥐*$  @ @ @ @ @ @ @ @ @ @ @ @E] jmQ\x d;eʔ3<3vyH&N'pBԪU+ڷoUV;fΜz]t͛G2؎9bѻw5GNsyW˭ѵ\pA+W_Z-M @ @ @ @ @ @ @ @ @ @ @ @8 |aD:đG]v-Э.]:'[no:k0{/ ~n.RWs{V[E5wY0`@L:5:5NqCzU\h_kI _K, @ @ @ @ @ @ @ @ @ @ @ @kW`Јڵ#7o}ow͙3'gaFM4;&Oٳ;?>8∸+믿^|E>}e˖Q~8󲀤RJ-z2eJ\}YW-W_]yn3/}]w;w}+2p?~VK/vZ$ϫ*f̘ 7o^#6m_~e\r%qań :to=^{~:Vv+7`5Iٿ՘aCSfmjZy\㩧c9&>m֬Y|GK͐v饗FÆ _Ξ'tRy{zk=4?~|\wuy5ҹ._r^oQ^jm El^C @ @ @ @ @ @ @ @ @ @ @ @%rbĈ 8#<3q,5ju֍.]D 6:CЧ_=Op@l3RO<1g}RRjO>dm6~8蠃PQF믿x1c!zRT ԩSu=,9`ƍW\yn*UʾUi|2ǒ}x㦛n#GF6m"2}qgfΩǴiӲ d>)iwr'N'|JSO]漃 *U,Y*_Y*\G´~ S,5>}'ʖ-=\+ҽjժŻ<#y]tEYو~)l-ݫQFwqq9眓ݸqOZ8oQ;BڊVZe}:u|SbZ)\ @ @ @ @ @ @ @ @ @ @ @ @ W "΍~[/?G׮] Ժ?}fW)$hÇǂ |ر6d}^vgdYv[v?Kzw}Xgu;F "KAbK6n?)+-R [ PKAt)kQ[{Z).9jS@V~j @ @ @ @ @ @ @ @ @ @ @ @@ tZjm޼y~Y8VժUc…CeX믿bw}7 JAݺu˂iN 4 *ħ~=?f̘A-$[0Z zc6Z|ovEҥ\rO?-ܿ)W^ӧg/qnJi[mՒWzMɏSOEWӦMO?fLF=s))UR%cn r-ol'̚5+%k͙3']w|zљ.y`~GgfBRǏu-Q-GJnx駳+{gϞu[AH"@ @ @ @ @ @ @ @ @ @ @ @ PBRVb_9tMk׮Ѿ}/#=%[ٲe#}&MamK>ΞիW/'|#FȞW^}~)|iQS5\]tRVK 0/ږ‹Re]78 Zi\t=zt/w JL2KYɓ' Rֲ/@,:vm3.)P+RV&MGJrI!]-Zx رcl2}_YQ3g̷`yUrN  @ @ @ @ @ @ @ @ @ @ @ @1Uӧ?~qV JW^1w(WγfyҘ &d[)hQjJ*Ŝ9sw}75jRO^9mРAKO_~HQ^xF P~cFr/9 @ @ @ @ @ @ @ @ @ @ @ @(q9:Kj%F0o6 ZN:HAJkno|5kf^̛7/ /J7n` g?pqnt)d]_u?~ӧǹ瞛Wϓ.RhQ JFvm,l2l}y]uUp}_~ﹽHg\v2dH$5;ދ&[oMGdoH_?]tv),3fd?N-/8bܹst){K/7n\6G~c>sH @ @ @ @ @ @ @ @ @ @ @ @_>Pkς~l뮻.{gDV.B֭ժUQT{cY/s&N\W\qElqgaBN6>'x" $yYh矟5l0l dO?>~Қ{CE JmĈѻw*T4_ JD>Xb<Ѹq㬞6mĉ'wuW6} *K/.gyssi_4^&/s5.s̉wM²{y#- ̺瞋gӻؽ{w}LAYttի=ӧO+W.[&Õ*U|0jժ><_,8n̙ѺuxW9?tSN?~:׿5N;h׮];KSx\~b'mFos"gR sZGH @ @ @ @ @ @ @ @ @ @ @ @-HX矿4c}!CD:u͋/2faCKJA#G~!j֬*TX믿:{fAL[lg.R8g})D)qN3gNL4)zՙ&^x,j̘1jM38E|QT^zwu:K?3ߏ>hk:i&{L/j駟")mܹ>)<+[H˗/kz78wQ(W 4K|Wy߶|;]Z,;\2%"W bYZ/ @ @ @ @ @ @ @ @ @ @ @ @Xw݈hSIJUTSN9%n(-zv7焲&WάYbmO<1|>  |h۶m|'YV!)P!P+he$ @ @ @ @ @ @ @ @ @ @ @ @%P`̈9s"6dٛo޼yt-.\%nrꫯ{7Ǝ[v^{Yg||q뭷}C Y٧MW_\u־} iC*u *| @ @ @ @ @ @ @ @ @ @ @ @k[`_*XQָqtQTb9V9眨RJkn|At):t)誠駟Oj*f͚eϟvZ <8g?  6 \ڊ@Mb>@ @ @ @ @ @ @ @ @ @ @ @ @XÆEԮ1jTN;-_|1͛En w}Wy}F[^a̙3N:QjݻwV3fL^qG׮]w}Ը[/ҧ8n!nx7Aik)S""" z²zw6G @ @ @ @ @ @ @ @ @ @ @ @_XQPӦMxEm8 .h׮]Qnݢժw…qgD z' 뮻f͚O:x饗  MmY{l\{q= 7P[ *o @ @ @ @ @ @ @ @ @ @ @ @C`QVr1[ɜcM67|3 jԨQ.v)ꠃBz-[,t{<#cРA?D:us΅5Y[o{G;oM.gnK Z @ @ @ @ @ @ @ @ @ @ @ @VU`޼_F-#_R| /e]m۶c=6Md"{sEZoDƍ ^vq,TEq'cǎ-Ga\:,f͚1tcjsȵ@\SH @ @ @ @ @ @ @ @ @ @ @ @i͟@2en7|3 ui⡇ 4_|GuT4k,?lOkoyTP!ׯ_ C]Ѯ]:u?SzQzx嗣[nYۖ[nY$- Ph  @ @ @ @ @ @ @ @ @ @ @ @uٳz)Ŧ8 Fzji&իj_ j߾}[oŃ>˗/2{;6r¦_}wYOgSW\qEL0cY~wqo7tS\pg '(Zl @ @ @ @ @ @ @ @ @ @ @ @W@֚9ۊ+ƝwC -24iku=ϟf]YǏ^ziTZ5}ѸcСŠJ7/r¦"' ,#w+'x"U'xb۱p¢裏΋*Ul)H믏 6ؠCS@V$l)h_n)~cǎn-j֬jՊW_}5 Ӛ0aBq;UYrJxlm @ @ @ @ @ @ @ @ @ @ @ @֞9B()+F u2eJqGs9Q~7x#^|ѣG|wqA9sL J\9WD<@DFWۯ?z*tǏ:;0'kM7]$c̙ѿ,8+g926d8e˖Q~|^tK $c-"5m算/ Pk6 @ @ @ @ @ @ @ @ @ @ @ @ |nA"')tsƛo/Bt=&Ooy4h Ԯ];'llVky'|)>鼵wsZy3 @ @ @ @ @ @ @ @ @ @ @ @y"'(g#;IaHXq ><ƌd?.њsµM6$ cJL[mUԨQ# y睳²֑ wѡCD<Q~^g5z°9, JRY J!ZS\\ҙ,:E\[neTZ5ҙN³r k@P#  @ @ @ @ @ @ @ @ @ @ @ @ Q6'e #r2B$PrHC9UvKy݈֭#"k".$r 6,ҧ~Aw̖B _Jl&#@ @ @ @ @ @ @ @ @ @ @ @ @D  *'_46gѠAD*qU4TI` d3j @ @ @ @ @ @ @ @ @ @ @ @X=M7zF)Ν#.(t.]"7_S+j @ @ @ @ @ @ @ @ @ @ @ @X=6zFgErH'G{lĨQ´|S@V~j @ @ @ @ @ @ @ @ @ @ @ @@ UBn{Μ"v=b# 7,*e_ @ @ @ @ @ @ @ @ @ @ @ @ @@T<8 #OEn1n\č7FkQVJO>隆(f7; @ @ @ @ @ @ @ @ @ @ @ @%A`m#$ iZE4lv#FD\z0xVj"<Z˓q @ @ @ @ @ @ @ @ @ @ @ @\ @3#O GskEgG\}uDfExqG_|6j',% Pk)_ @ @ @ @ @ @ @ @ @ @ @Sj@IDAT @ȫ@923W^=b"';"ӢTR裏t'Pj9 @ @ @ @ @ @ @ @ @ @ @ @'PZĺF*8ҤI'ѸqDZC矟={.]&lR\k,C2E @ @ @ @ @ @ @ @ @ @ @ @U(S&bj2\ paCE\~yG |sOS Vu%Ctئ] @ @ @ @ @ @ @ @ @ @ @ @ P1lXAd.ǑѶmęgFk?͛7 DVO@.jI @ @ @ @ @ @ @ @ @ @ @ @r'Pn䮯^%S`֬ ɊS'b#n=B_=Zn}D曈%#+bȈ6m~5bĈ8/ƍ)f @ @ @ @ @ @ @ @ @ @ @ @ @*VqZ^$`AGԨ1hPDϞݺET{Yfn%jժ:t}w(el @ @ @ @ @ @ @ @ @ @ @ @[7b_ւL`ذ֭# 袈뮋(_~E^p1a„:th-+ZgR( @ @ @ @ @ @ @ @ @ @ @ @%>`mnݵ-^eu+zg⡇N:Ŷn`}ւ@nI @ @ @ @ @ @ @ @ @ @ @ @Y`}"NK{[@;FNn-8묳m۶q%J@V:n%@ @ @ @ @ @ @ @ @ @ @ @ ֍(_>ZV(_}qqG?EqJsFͣZjqwf_|q+\ODժUw Z% @ @ @ @ @ @ @ @ @ @ @ @@ N{ *0ЂQFİa6ѹsDJ+}1bĈڵk٠cc=G$k̘1_F Ԍ @ @ @ @ @ @ @ @ @ @ @ @J@S5!E\ziG|q!~={+ڶmO?⁧zjԪUkrqdZ[.,%@Uf @ @ @ @ @ @ @ @ @ @ @ @g'zT3gFkG E^#g5m4{챘?R˔)em),@([vdC @ @ @ @ @ @ @ @ @ @ @ @u}HHoѬZ/G$KkO?E<@DVJ-ٳg} YfE͚5M6q'GŊc1yx)gu^{xG޽{Gs*UZƔIСClvY|M,N<5jTt9RYg^x!}>8CSL;'tlh"va-_Jz @ @ @ @ @ @ @ @ @ @ @ @#j?3em q1MFx`KEqƊôO{w++K.;DmfJ!ZrJV>:c…YV)5\?p;.n,0+w ĵ^Nh??⮻"v?;̫A MQVPPDA%`KD%jYc1YwQc4 XBA (*RQi3sΜ<7!Z{>`;lx+W^yeL0!h׮]d«-[׏C9$wlVZš;ju]ceYmԨQYcCe{·RUKF {ӧO>R:uȑ#jժť^_yw^Ԯ];N;Kڊ i͍5kƵ^˗/ϚӜL?Ok׮~S$@`Uʊ @ @ @ @ @ @ @ @ @ @ @ @(3#ƈO?h̦֬5Vx( 81◿ꪈ56n4hP4i$veln§͛mϖBu~%m۶B-Z?p}ݻv-ˬiӦ󨣎®7o^SO;FݻwKfmt?gƤ00&}#o+,JKa_3fz\s5q%ozV_* @ @ @ @ @ @ @ @ @ @ @ @( Z"9$b6sl 'h&"/bذMJlРA3g7tS8p`l2;ʎ;=ӟ *\T]v,,JJZk^~Ukw!:vO8K.z*W^t;BFʕ+/z,5kOkXdI̙3gz@ p~ @ @ @ @ @ @ @ @ @ @ @ @[P#" (,܂z2"⨣"&O8O6D RUW]]w]t%x㍨Uڋ-[Iݿַ?^{-ʍ .ȂN9/M4^zK/us1?i̞=;NvW^y% SN<[oSPP3f) @- @ @ @ @ @ @ @ @ @ @ @ @GF̛1~[ě!re 7DwD q}mƤ7nJ ݻW\%wM.JJ[ 4Mf}׿fA[c>䓬^fΜեu֍z*,yqEi7|so^]ӧOϞkIAZՋ-ZdX=l+͟z… Uð}V߰aܹs>ѸqGqF:[nݢUVѱcl?|+o @ @ @ @ @ @ @ @ @ @ @ @ EB/SF8"~ˈߎ[$Gr!bŊ={v\zqǯ~߿EI^o7.N<,΋SfgyfL6-9眘4iRVwg㥗^ ^xaP?5k?qW^O>(훀Oڵ_~qGnnnVݳghӦM{ݲߞ? bȲLˈΈ}/;"v߽oǸ袋^Ȃ-Zgm )((?8ZhQָAяZj뮻f Yy…QV^zIc/yWKF͚5>mf/^nQn5J rRePW h6xZ$ҁ @ @ @ @ @ @ @ @ @ @ @ @<8#͙̉4(#2⦛"N?}sg\ &DNK.뮻nݝJQJ?H @ @ @ @ @ @ @ @ @ @ @ @lX##W_"}ҥKcĉYyˬTg[I&vO rp.S @ @ @ @ @ @ @ @ @ @ @ @ @`-:u";,jRV0 mۈ3#F-׿hqI'E^^> , r @ @ @ @ @ @ @ @ @ @ @ @ @| qGWD̟QFceըQ?I\qeիWS:%0o^DÇGQVwS7h @ @ @ @ @ @ @ @ @ @ @ @T| b∡C+Y "#uh9b޼a?v֭#^z)'">Ex#@@EU= @ @ @ @ @ @ @ @ @ @ @ @ѡCsٳ#n!b="~ z)S";,?8唈I"N:i+,l l%e @ @ @ @ @ @ @ @ @ @ @ @ x7!Z|99˖ZS Fw;;*@  @ @ @ @ @ @ @ @ @ @ @ @@x睈ˈ-;7W֚qЈ /쳈"@@eU3 @ @ @ @ @ @ @ @ @ @ @ @(G<qMQzĊl.?M`˿}ʥy".4⡇"?>bȐw"N@Uȩ tF @ @ @ @ @ @ @ @ @ @ @ @; #&Lf05wSXt隵}cdp[G >+LkbZL*t @ @ @ @ @ @ @ @ @ @ @ @P#6pcΊ8숕+>ĉ=zD'ELO *@e @ @ @ @ @ @ @ @ @ @ @ @@9ors׿KV[Ϗ8؈ɓ#nӤ3DoƎ:uD P*|eg$@ @ @ @ @ @ @ @ @ @ @ @ P+⠃"ֽre 'D̝MVAAD3fDomFzkoĘ1:F-*@ @ @ @ @ @ @ @ @ @ @ @ @@9^="5[wVe Ժ҈^HZW~~ıFyd~ELGH)&$@ O`L @ @ @ @ @ @ @ @ @ @ @ @h0⥗"j\;@jjW[f݇ֈµ&Lꈧ&`lveTEZU;3 @ @ @ @ @ @ @ @ @ @ @ @P`"~z ,[v]E7.sֿj"'bѢB$ P*}mg%@ @ @ @ @ @ @ @ @ @ @ @ PN?  Pu"@ @ @ @ @ @ @ @ @ @ @ @ @cW_Œ%K"խ<['…u+@3wDnnnɝWT{*5kFZv%U˩mۢdzEN:¸?alQ֪UġFtݦMDjkQC& P}q%@ @ @ @ @ @ @ @ @ @ @ @ P ˜?~̚5+Ν+yЬ/Jޗ'IcvUtUQXx :4WV0Vq8֪Y+VXoVq Wz.]4 Z5+]ߕuo;܍7&MG5ͦ,*W-Snݾ :蠈 ַzTmZU;= @ @ @ @ @ @ @ @ @ @ @ @(((>(꣘1cF|'1s駟f!Zs̉NU|DÆ KR9KifAT)j+ JAZ)8kk̘ΝXjV ZxqIت`M>=m2o=v*SPv4kqnEoeE.Ѳe˨[w~"cG51ZZQrca> @ @ @ @ @ @ @ @ @ @ @ @ A+VĴibԩ3f!Z˗/HAY)y%wӦMcvSێ;5* ຕC}Ia[)h7 ?+ 8 &Kadw *K- jZw߽c="ݵk׮\EEÇGQe]&U&&!@ @ @ @ @ @ @ @ @ @ @ @ P>R0ɓwߍ &ĤI> V\mr/ smݢe˖ݢEy#//|좠 f͚}Q=}PԖ¹UɿuѦMh۶mk.gA[wUG@V鿵@I @ @ @ @ @ @ @ @ @ @ @ @;XhQ[oFL+V,4+2{=z}K,Sfgۥ0{/˖-Hgt!{pѨQo'Q"@*Uz;#  @ @ @ @ @ @ @ @ @ @ @ @l5˜4iR5*ƌ'NhРAԾ}HwvM6QF? ʕ+ &;͚5+[(lu9>컧5߭@ * @ @ @ @ @ @ @ @ @ @ @ @@ zw{1"^}ϣvqFNcǎٳe˖[l&._gώ_=Ǝ=Sڂ N:ѥK޽{3]啯 * PYV$@ @ @ @ @ @ @ @ @ @ @ @ Ps̉_|1^x,HkѰaѣGt->ze*@ ^{bԨQYڰaO?uf>:9hժU=@JjH @ @ @ @ @ @ @ @ @ @ @ @-0iҤɓ'G㏏q衇fZ kѣ[߾}N:1+# PzJog$ @ @ @ @ @ @ @ @ @ @ @ @Xxq 4(,EѧO>7z l?xvѦM8s_~;l P$ P?Z3 @ @ @ @ @ @ @ @ @ @ @ @Nv[<QZ,@묳Ί>xcu %&Lӟ?⋣cǎ[rYsJysJ?H @ @ @ @ @ @ @ @ @ @ @ @'[o '{W92nƘ5kV}´և~ m6nObSNѽ{Ub1 @ @ @ @ @ @ @ @ @ @ @ @ P~;8ꫯbȐ!µ;H]vd*e#'xb :4Ə͛7Y?Y,؀@ i&@ @ @ @ @ @ @ @ @ @ @ @ 1)'N̂98ScΜ9b6A@Uy @ @ @ @ @ @ @ @ @ @ @ @l%#FdAZ'|2 tVZ2^`=AŨQbʔ)ѦM,hW2#@ @ @ @ @ @ @ @ @ @ @ @ @`3 ={>:&Nzڌ %PR0믿]vYuYqNJ+&J! PR|F @ @ @ @ @ @ @ @ @ @ @ @qyu];3j׮ŷQXXx{[|u-0{O+b]]ʬnCE߾}Ae6&9sf;HAiorssꫯW^y%{8c"}R@VYj @ @ @ @ @ @ @ @ @ @ @ @g?<'|V;w zwc[1cF=:_|]~…lٲxb[t4ܹscԨQ%7yvV.]Ę1cbڴiq '+q, Pk+[ @ @ @ @ @ @ @ @ @ @ @ @ {qw?;wު͍SƤI"'gǏt).䒭rMƹ[*u!뗭7JfJĵ)|}[hȍ7.z;'@ lU"dƸq⩧:u1cʔ)qgg-;`;vlVNa\q}zڗ.]cёw}ߢiӦY_PP5zѽ{3D̙:t+"Zeq=1yy裏}L_O<JѩSswJoFիG-jժw3iyu9Dͳ}q%c;v?cq7F:餓aÆ1hР̶e˖cG}w\\y-dKZqgNw @`sjm @ @ @ @ @ @ @ @ @ @ @ @UJg>}D5͛]vY<裱r(,,'faW?PoV$պuHaN)Ȫk׮Y_*, z7C=4va~ .N;-x5ަMO /0 J}9rdWL4).,x+VZkNI)/u8Sl{x:ujt%]l@IDAT-Z>`֞ʇvX4i$ '={v{Yۦj+\bΖBRW3p]w55jcƌƹɾAYW Ka{Μ93;WЖ\?K.$-)!"JY @ @ @ @ @ @ @ @ @ @ @ @ L2% K@-ҜB?E ]*{x衇4z,0 ^}լ-777nƬ\8^ Gydo>k+c„ Bڵkh=`8cY?)ЫgϞYVZ3Hk1`lo|p%ϱ> rя~EqG'߯:KT^=Ӟ{U??1nܸ̥~9~v9֭d0ռy,lƌ% 2$=s馛uf߰f͚q]weZ[ҲdS(аŋg}Vц @`uZ{x#@ @ @ @ @ @ @ @ @ @ @ @ PjԨkժ0m6+t͝;7{?rH~K/s=qd4hP4i$ *t-wԩYVqرcK.q-D޽?YNkn_wS_yXtitA =裳G2y"c…qG'|R2;f͚eA[ŕ:uʊժU+cR_+W[o5'%:*{/^)x| ӧOͶFNGlaZ[ @ @ @ @ @ @ @ @ @ @ @ @K`wy*77w{Oqwg}ovwqYhѢY=$///:wyKM)++.L2%nx7JI&Ŵi//Vg#]k3x7n!wuԉ֭[gO:Z*KPjxYט??ׯy'Gy$8X)^b]w͊ ,-iY^i'צMf1XM` @ @ @ @ @ @ @ @ @ @ @ @5z?x,[lͦ ~gO)뮻3<3R`V4hgΜji֬Y;ԟ}qaŠA[o-Oڵkga[) j?\jwaڸU}_|1sm)|WHcc=ߘ|09昒ƌч> @ @ @ @ @ @ @ @ @ @ @ @!ӟ4-Z7x:ZU JNf͊7ql:No>{1bDI}*QVT>hNqeSuvӿ(,,,^{-ʒ:w [SC׮]cYG 6W%{i޼yV_Ǫ\+Wdύ´RWU?5jW_ٺuUYNKk׮|KXs|gbԨQ-7b)]"ȇvL @ @ @ @ @ @ @ @ @ @ @ @~o_W1rȲtgYpa6bƌs/,??K ^xaYhSq}ztMYmK.͚\'O*4hz)LkNW\qElvYc==\fo駟w}7:s9YXq)0jȐ!Yyc4m4 {' KFgyfX">U CŋgUO(t\rI^S@t`Ըqh޼y;fP5^z)RT Jc׿͚5oϧ~|7.BN9я~guV5v1bDΗRW J^rKĵ^n]veqǬY٢E^{5jKs{ѦMTHZjՊ}V_dɒok׮wgqF\l3}={ '@@@¢M @ @ @ @ @ @ @ @ @ @ @ @(((}xOިqS jРA=ǤIbѢEƶnnK(|Aή68z:|1a„e]UVkZpaUܰ{_|y̜93Uk.g] 6\kfAh>jmoFB~ٳcwYc˖\s5G?]vYZ:u@(+ >.vqb+$P͋ÇG*ֿ ?  @ @ @ @ @ @ @ @ @ @ @ @T&)S/xg#+2zY, ֶvuXti{ի~noz=Y 7]v * P_.C$@ @ @ @ @ @ @ @ @ @ @ @ @`M+~x7 ?<cɒ%kv^]fHZʕ+㩧ʂڷo3gΌ^x!F%L $PEjU @ @ @ @ @ @ @ @ @ @ @ @[VC1x2eJt-.hҤIwyYPі]6,0a„cwSO=5};6FGqĆ'Ѓe(P*LE @ @ @ @ @ @ @ @ @ @ @ @:/^ {'F-Z>}d?xvѦM8s_~;f$P͋h8b=76p @ @ @ @ @ @ @ @ @ @ @ @*0mڴxGc1yh޼yݣ(f͚:)g}ַo8SX8N@V(Z3 @ @ @ @ @ @ @ @ @ @ @ @f L81~xgbܸqYV㨣={ƾժUuLPuR`СC_!Cė_~[^zE޽SN~SU[Y@VjH @ @ @ @ @ @ @ @ @ @ @ @e*0gΜx^1hԨQt|Ѿ}^zk+PXX^5*^}6lX|Qn7?ҽ뮻VC9 $ PKV$@ @ @ @ @ @ @ @ @ @ @ @ RP;3k1" KϣvqFNcǎٳe˖[l&._gώ_=Ǝ=nj ,:uD.]={fy!Pj# * @ @ @ @ @ @ @ @ @ @ @ @@ ؚ4iR5*RR'NѠA}ݮ]hӦMԨQcBe+rʘ:ujL0!ƏoV̚5+[hvΝ;gw׮][0, PkJ*P @ @ @ @ @ @ @ @ @ @ @ @ P-Z)d7,yN2%VX)\iw}'Zn]rQ^uJ%KdYM<9SPZ*/[,rrrb]w:t>QFXT\ZvJog$ @ @ @ @ @ @ @ @ @ @ @ @r'|,wߍ &ĤI{rʢj6m>vmhٲeݼy+w窨*((YfG}Tro1mڴNmQZhѢE|֦Mh۶mk. D]vE=}rJjH @ @ @ @ @ @ @ @ @ @ @ @F`qsży5=~a|'ҕM4U|7m4vi>ѨQo(㍦ Ĝ9s5{O?LgΜX"[=7775kZv}{DgG2@@VjH @ @ @ @ @ @ @ @ @ @ @ @B#0!G?#ZvYG}3f( JA[)*Eਕ+W J[)Tkv DW׬[nԪU+ Jի̷ dɒ믳ŋ/( #_#Yvy.yQGVUzlZ3 @ @ @ @ @ @ @ @ @ @ @ @@1"⪫"^{-w뮋{m0 ={v̝;7W JaS Z|zLRk^-d8h+777R{zNA`)N_g+ZIlize`kƍN;;cVUB@V?I @ @ @ @ @ @ @ @ @wqN?b$6lCR6)h*ښEVkm Čw~seOI^^׹99s @ @ @@/9ےo|#yd fm-ZJԌ%j\g}aÆUVl)c c?:P h[JHW9'wE/ܳpt2 %7  @ @ @ @ @ @ @ @ @ @ @ @sY`S.KV[-9dfOVZ)ydug_|lE2dHҧOҡì><ߕ0sn9sʹ"@ @ @ @ @ @ @ @ @ @ @ @ @ ~z'}M3LՍoYv[nIN;3W/ 0JM @ @ @ @ @ @ @ @ @ @ @ @ NUVI:+9WKZ6dѣ.WUz[jg䮻Nkpl@hMV_;$@ @ @ @ @ @ @ @ @ @ @ @h}&nwII'%7}UԊ$E4}G3$@@CՐVX @ @ @ @ @ @ @ @ @ @ @ @LC`'päe-}'?!Yti4lBj!g_w @fO^ @ @ @ @ @ @ @ @ @ @ @ @(!R矟rr=5$GҥxՍ{Vg]zɐ!z%@ jM @ @ @ @ @ @ @ @ @ @ @ @@xdK<2yd0؀JX9fWV۶-$|W2fKO@3 @ @ @ @ @ @ @ @ @ @ @ @Y4(c5YdOOwmgwVZbZޛrJ'34xZ ~  @ @ @ @ @ @ @ @ @ @ @ @9 \uUWw_Qb9 j9W6$袤G['fOW7P= @ @ @ @ @ @ @ @ @ @ @ @holm3z1}r!5OVmjtL>8gg  @`1 @ @ @ @ @ @ @ @ @ @ @ @9!PB;/YcNvt萜sΙsG*odݓ @j4Ke @ @ @ @ @ @ @ @ @ @ @ @MU瓮]O~_{Ypgz^s:PMgdذd=~ @V@W7 @ @ @ @ @ @ @ @ @ @ @ @-P<3YoE䩧N#8$[ou-D`\V9-$ߟg I̢@Yl9 @ @ @ @ @ @ @ @ @ @ @ @3!п>cCzH>:)Q/>L<5vpF%$]$~6K 98' @ @ @ @ @ @ @ @ @ @ @ @1cC^;><79رaZ ȩN8!+rÞ\ݸ@6m ? y9~o$@@STWּ @ @ @ @ @ @ @ @ @ @ @ @l}rG'}$0=Xb%rYjqZ[Ohw^ҥKҽ{s^B&/ P/  @ @ @ @ @ @ @ @ @ @ @ @4J^;yᇓOOڴrdv[zꕋ/8ڵIjj5ɣ9RP֭g/wOkMZ@V^^#@ @ @ @ @ @ @ @ @ @ @ @#F$|7G=3l̈́M"PZx,hrC%'0G_ehsgI @ @ @ @ @ @ @ @ @ @ @ @Jdݒ_N*gÜvi:th9WP:@C*ZK %u f@@ `J @ @ @ @ @ @ @ @ @ @ @ @`zzJ7Yq䩧V|{.w^.,bt# $yq߾'%k5P @t z @ @ @ @ @ @ @ @ @ @ @ @ 0G''Sn#L9Lk̘19Cz堃U)F5@2sM6 =48 @`FHN[} @ @ @ @ @ @ @ @ @ @ @ @ OwO~8d>.,}I߾}Ӳe˩W^j|sɮ&wߝjU?\ 0 N* @ @ @ @ @ @ @ @ @ @ @ @%Pz%<ȴô>owqя~^{Z{>@ jfp"ɭ S-fP@ N @ @ @ @ @ @ @ @ @ @ @ @`b[nI6p{+ώ{slfw}O̎&,к  @ @ @ @ @ @ @ @ @ @ @ @CvJ|2_׿΀r=TF-Z曹ꪫ2hРlԬs=mۦ\lruhZ%XOv5@ [giY~[C ɸ6sMՕW^?;wλロ~8^{mwc^)D`wi&ЦI @ @ @ @ @ @ @ @ @ @ @ 4{/b䥗}´^{q9Sm&G`w߬ U-W_UFHڴipT hᅓ^GM=vGsdUWMNC=Tw޽{K+ Pkz#@ @ @ @ @ @ @ @ @ @ @ @hlI2lX#`aVZ)GuTN<<3fL}'#YXpӡCYm:rdҶWmu/O??e˖%s>l`:wO>~j Z7{ @ @ @ @ @ @ @ @ @ @ @ @C駓KVX!dᅧh袋c?Zk4t}w9S_K/=zw+̽ޛ_>/b?6${lJ%i̘1UG}4x`^y*4̫u :䓫@K/-ܒkdϵpm;b&;e/uYׯ_m~qk\px%x%c/ RuwLIE2S @ @ @ @ @ @ @ @ @ @ @ @@3xM-x*]c\ofe*w޽,UTZl}-?pU,>|x\N:mZ&l%X *e%롇o~yꩧҥK*(OUW]UoeĨypUugc}V *AKӟrꫯNnôJvmUӺ[v}8:딪UƴN;UO q*!]C /ZWsVzmkh+S p e±ƅi%\O+_zo*ܬj=#V%?Gk6}Ԧч 6?˞xsYg妛n߇qO Ԛ2 @ @ @ @ @ @ @ @ @ @ @ @f/p]B%\vYҪմI*cǎU,ug-+VojzlH \zWG'|r-4hDܹsvaq߿522+ Ժ⋫)t]ysUWewvmWi?yӡC*V}OC= /0g}vڵk_rMFUnm9crf]vBZk*mo[n)ZmL˹ߦE.됬zjcԶmZȑ#kryo ֲ.[?Z.k?Ԏ~8lMu=i xf[ߪʃ̶{vA4I](i @ @ @ @ @ @ @ @ @ @ @ @@3ߒݓ|tUxJ(:SI0O>9?Oꪫ'L럗0BT©Xa2o2Rse}o=h%1{8p`viP'US@IDATü{5]Vs*\ I'1cw#㎫ZTzVzmK[ meWUǒK.}ksup\P|PoyoZճo:e}RifS=zs ZmrWeO ;] @`j @ @ @ @ @ @ @ @ @ @ @ @@[d睓+LZDG *aYvZ^x`z+ 'Z2-J%ZjW\_| /*KѸ|#< ڢtꩧVX_׳re 6rZ&UJPS *z6lt!իCVJۋ.*ԩS6h\{-ܒ.\rI;9&{f FHڴ MW_k|%xj~Wp@*_z[^xa^՝xo~YtEӻw}?)=X s9 >*{O߾}z\c=eYJWSL@?/c: @ @ @ @ @ @ @ @ @ @ @ @@-o(F&\j5,H/gwߞ+'|r`Uz몲r}QGeȐ!+SWW 70^{m<\uUezB=%_ hj=ܳ YKiZiЬ4{eM7B'ڤ}wZ>¿6x*H;qfm~]VmK?߯%E.[w{V.65Kgi~\So~~UUb[ֹe/\jR<'}ٔ@֪Q%xky\ *SG{\veR_~9++'Ja-.>r3 PkT%@ @ @ @ @ @ @ @ @ @ @ @hlefG%[ZkoN?*`SN,;v/3iNG99gAF,к  @ @ @ @ @ @ @ @ @ @ @ @LU`ȐN\2ᆤUV|A6@2?,Ⱦ9Eҵk馍` 3! Pk&4!@ @ @ @ @ @ @ @ @ @ @ @h8c$-ZL:dݓO:J@s *+tYW?ydߺ1%rZ<'@ @ @ @ @ @ @ @ @ @ @ @ А8 IGxq$*hR[J`W' .|{8ƻFNIjMj @ @ @ @ @ @ @ @ @ @ @ @|Yr}t2j؁Og'Cᆍd29]¤ڵMRI^/'6ƌ'}C@VX'$@ @ @ @ @ @ @ @ @ @ @ @w&#G}&_zR:(OL#EZjE[ek+L~/O}o/] @1 jLe @ @ @ @ @ @ @ @ @ @ @ @xc? uuɓO&~əgNPMh΁Ze ӒJd;HZJ,i j5%7a @ @ @ @ @ @ @ @ @ @ @ @@6,d/3jT2bDҧOr_j:=P~66XG?Ip5~'ʛ M]@VS_a#@ @ @ @ @ @ @ @ @ @ @ @4QU³&>1cOuK ,0|ѷoߘg1kco"Y{g>5Ǐ>JܝO4Zg @ @ @ @ @ @ @ @ @ @ @ @`<nHZN%}j~{ҥK;5t٨>|癧QOc_v99qen\s%  8/qL(  @ @ @ @ @ @ @ @ @ @ @ @aɝw&GOy%XCH^zlJGQFMr]ZhVğ֭[O9~Y۶mk!YV|W_ψdMȶɓO.X Z(:uB }YK'0|xҾ}ӛ׬ΨcK}M?/3&>bĈ;ys''و,r]>w|7٦M|?׾,YfeswxV=M[ŘѴhv @ @ @ @ @ @ @ @ @ @ @ @-W!:׿Rw}73pꔠSr١CɆ\|UO-(<+q%tk\ָ˾ Bƅxok\gȐ!U{ Z`"d?Xb,Rg )ss4(7ݻyNt/|7kKy_OvЫE]t@]?4kuNU&ߜS^xᬲ*Ymղ.sVOkLbu޺Ȅ @ @ @ @ @ @ @ @ @ @ @ @L`Сyҿ_ϛoz+ov^/2XL矿mù8pb0qϠAVξ(TΑ#GQ]vsVH9W\q,i߾}}]s_l6vGgy&=XS}߃r,Kjqcvr-eY&;w,Z k^fG0*I%_L^RBQ6xlF_͞,Т}LC @ @ @ @ @ @ @ @ @ @ @ @8p`ׯ_/WaQF )AY% 甐S>^zق .9K\G}Tqc峄0?r*pUW*V[-kFV_};[i}ZNSn}!||駟BJ +T\wu2O>)Z a_|Ǟ}*ݵm6]v7lvgy:_ZӘ,p sM7Fmo_uKjrӟX<(AnW\qEn馼Ya.[ 쳦.UO=\ZxU` y睳f7n2l"MK@̯@Ӓ @ @ @ @ @ @ @ @ @ @ @ 0S6x^z cZy啫 6 ,!Z3LC9+P[@{,NVq-V[m7< ,\{7ZTrMlbΨQҫW\|Ź2d=]wݦ9Uӳg\{yS,=BO9' Pkjͼ @ @ @ @ @ @ @ @ @ @ @ @9rd~u]sϥe˖ҥKrlfڵk^xO!0`j{|0/B~ziѢEPeR K; +k!a7Mv!|pWKGy馛Ү]~9өS/+"0j<@Ӓ @ @ @ @ @ @ @ @ @ @ @ 0EO>$_ӫW*HkȐ!YuUvUoX`=hz~x{;dOnҽ{l6i۶mӛWlX2-w~^{mZk 0 =P%@1:t9眓رc6xy晩@l5ۉ @ @ @ @ @ @ @ @ @ @ @hJÇ~o*O>yꩧ@EY)M\r-SN9 *l-Zou]77tSjZ#Ga+p@7|.찦V[-~TA%nMfH j h @ @ @ @ @ @ @ @ @ @ @ @W\W^9'xbsϼ曹+ΙAxKum_~>{ォ`0_|;o'|v!\sMn֜{i׮]D#m?N޽f6ˀ, @ռl  @ @ @ @ @ @ @ @ @ @ @ @xDzO 4*AZ=z/>iB`Jۥ^W^y%lAuV4;k- ;U´n ?ݻ7h|C/ߗ>}UV|[o5I1f" P,i @ @ @ @ @ @ @ @ @ @ @ @3._cͦnh/WAZ -Ќw@`ee]z*~iZk\p3fW{ǎj9 zCenMpK.dxn6hР&8KS"j554 @ @ @ @ @ @ @ @ @ @ @ @`6[dMrצW^ҹs&]qT>p ֭[:5Æpc :O䮻J+ȴp;uTÈ#뮻iMl4ZM`M @ @ @ @ @ @ @ @ @ @ @waZT߀HUQT QAAlDأbנĂ/c%-FEQ tx3d7 ؅-a晙3 @l}رc4l0Ph@ԨQ#N=:th|駱Ƿ~[-W&*S3<rK/jZF֬YxG^/hJrԪ(  @ @ @ @ @ @ @ @ @ @ @ @$n{ :묤uC`b2dH4n8ve0a5T jU@9siGqDz衕@ qm.(?TTʹԪ*O< @ @ @ @ @ @ @ @ @ @ @ @8qbpѵkxbV[6˪ USQm٠4BM6{.Xc8蠃bܹ+^E\YǏkfS.V:R:ݻw5?i)W"@`U ZU%@ @ @ @ @ @ @ @ @ @ @ @*gu´j֬8/b\ze`}ceҞF*@Æ #F !QY׿o~hѢ`)裬wY~{ Yԩg}v{SKUe@WuO @ @ @ @ @ @ @ @ @ @ @R?~[~t,;;vlѣ.xc…q\E6`,|ꫯ)STYo?- G}Y|qGZy(]ߞϦO Z֪'@jf  @ @ @ @ @ @ @ @ @ @ @ @%p]wV[m{JW_}b}ݻǹ瞛?Ν;w}?x1lذڐ!CwѥK㩧*y駟>8R(Njo}O?=RR*oO>uJ:H\qqnƬĉ㢋._WqGs=={{=vX̝;gwb֬Yquš .oJQs )yz9{ٳJ~SN-hXpJ:8䓳+Ǖ͌E孼>_=֭;V-?uvZS=y;#Hu1c~2Y/oOI,i (j~%כ5km۶*@1 @ @ @ @ @ @ @ @ @ @ @ @ZW_}5{U2tdz>P) >:ZloF.ѯ_իW5bĈ/sL<\ƍ}뮻fmF;.LK&*Ey饗պu3gNGnݲ~e!])'Tx8Sn!}'F ޹K1EѵkXkvM=zo= i{ "kѢE}7ϳ:+Rk92ӣ>nfYs,rkz?;}I'Cɔՠ4=:Ua|Hkg9Y]ZەRՒ;}O#mvӧg뱨w>}{J3?i ZXeM6ɲs?#P|* @ @ @ @ @ @ @ @ @ @ @ @r p_zرYHS~N qq4k,jx6¤ҹƂ b-ڵkG ?~TRU.]ntҵbkD5:uS?[K!V)'O9眓ճglW]uUE]'LOpYO {:b7Ϯ/?w^|GqwgsOZsOL2% KA_E= T{in),OE\qϱ~z KtU+3fT@SFƍ˅>լY3nݺq饗fw\3gΌgA|ZR)Oߘ}{J%S,{QJv.7i$-We(s!,!j @ @ @ @ @ @ @ @ @ @ @ P)&ҲeHaY)ꫯ/<z衟 #`tonbmqgRzetPӡCKYVR䷗RO l>}znHAuڵ[ߊ`ID Kkz-Q1?,K(v/:u,s=(ӬV  @ @ @ @ @ @ @ @ @ @ @ @K  2d:/Yg;bM7'xg(jSv2eJt1YsQ,E^^Ϯng8F}ówߍ>,ҵ,4bĈ<"ǑVZSN߳+j_TQFEÆ ;rl{BJ귬ϧw9U2rP{V)\/(A~qƘ1c}'R(T^{k]v%FznݺY]:QzY*ci(}(rN嗋-W#* PfʌRC @ @ @ @ @ @ @ @ @ @ @ @@e޽{ 4(ƎR1~ߏ=zĴic^ziq0`@s ',Vq)? ˥>U~aÆO?&L(8?tЂ9hҤI𬯿gϨyY͚5[KU'5=dI<}K-?||Wq衇G\(*Bo1iҤOKwYo7o^}GzӳN߮¥Na=\MIߖȷ,p{Ro{K(lwyϞ=;~HK!@bԪ( @ @ @ @ @ @ @ @ @ @ @ @U,p!&l{^#IaLsN]w ,<G~M /W_}utgf̘.\K^ I5+ZZj 7Z=nAsiG}t7.3M^~|PďԮ]ꫯ]Çz\_bO>QyȐ!qyEIϱQb3s̉qAE6mJݐ^ *;ukf໲.vZ?>wW^~!j3 s=iӦ={Q.jKuoiΗ{QJOiygc̙(gZ y @ @ @ @ @ @ @ @ @ @ @ @rE߾}#~+uЏ . 4i[XUN5X#}kwSO=z_򗬩*s)-$XRV.íB>S\,) [nɚLY)k-ƍg\ߓ'O?Oƅ^N6{,>(_ڷsYZ^4_nHAc-Z(!@`%Z Ⱥ @ @ @ @ @ @ @ @ @ @ @h_@IDAT @*;7xc~‘VVI!238#=~vX}6mb~;~_gaN}f͚ŝwޙmlYhU 9#_³MTrJ|DZ_*rSO]W{!<)D+1#tteŹm۶/Sل [o]%ܝRXZZGiݍ7.Ԭ(fI!})*PKBZK0`IߋWRseP85rg8FB @ @ @ @ @ @ @ @ @ @ @XW_}u\x?9>rP 7o^0o&6x,p鞱clPpmܹg6zI&e4mtח䏹>,Zj,F_|lIŶnN̚5+ԩNV#Gӧgac VbRϳPR8Y*yNj.&7~8W]u".rl{it)<뮋?[e1^֭~mԮ];~_٥iӦEÆ ]w%YY4[ UJszsv+58Vq\~]v]Tɖj1 @ @ @ @ @ @ @ @ @ @ @ @!pFϞ=o=4iR5&Vh}]ナ,sύ#8bl@k&b[Ja@/ruqUγ11co~=zt?vZVMWvr9HqW^Y!ؠ̙;c-vS%QQ oV{У\Bj-?h寪& @ @ @ @ @ @ @ @ @ @ @ @ s1Ѷm,h-o9 bJ3nԨQ%NC%޳,7̛7/ƍU9sfѺubW^׋YܘV[o /0R8o-[\f+|3"4Xv,SNqac=ZRFYQ^gA Z3vK[ @ @ @ @ @ @ @ @ @ @ @ @@EHO\rIp .u]۷íJO_~yZh'tRl1bĈ0`@pXf̈HZ Vٷn: :t.]\3gάN!rKk.Rc]w6<jy @ @ @ @ @ @ @ @ @ @ @ @!;c=y~q7G˖-c{7LR۸馛b6mO쳸sѢEˢ]vǨQwѴihU ZOO#FDCɂ ~9Z:cvo_~yԪUk9ZSU! PkU @ @ @ @ @ @ @ @ @ @ @ryyy_*y䑘0aB}Q^8쳣yv%\%͛7߄J'0sxW^Ǧnm&SO;BJbkڴEs]c1]߿ <8f̘}#wx7W,>8ꨣb6z+~xb-\I# e% P$C @ @ @ @ @ @ @ @ @ @ @ꫯ=zĤI:ܹsYu]Ç[Uՙ5kV+qeŮM44hР֭[v-h?V[m3>}QU%P+K.Y?sy睳@?\`O[lE 6,5krksyg5JA @ @ @ @ @ @ @ @ @ @ @ @ѣ_^z)n5h nqc;f0U`n cƌ}|2dH;Y[Ѽyjg~Ɉ\TD:+Zŭ׿c=kÎ98ꨣ}w+idy<ѷoc=SN9%^SN /0e]27|%L7'0qbkGo|D./OYZˀV @ @ @ @ @ @ @ @ @ @ @ @@Y ,\0FoFYS I%0u!ڵkWlٲ, ,X >xwߍÇgiyyyѦM, mwv)6hM$Q㎋3zx?> ׯ_|ѪU޽{m6!7˴miK*:#OM7gÆ B>իW\r%Q~NM @ @ @ @ @ @ @ @ @ @ @ @@ 1tH0Ncf4j( jj۶moݺulfD͚5|,;wnQF'|q92fΜPG 9n  +co'˸J\<#YԸqy{f{쑅LUijӦM?/B=:\s8C]F +s/L s=+C@+ Z~;5  @ @ @ @ @ @ @ @ @ @ @ @+E l}Gl#FɓOԩsljժ`x#m-[¶6lRYY;>ДB_fZ)D+mcƌyeS[wuc7h-2ۄg'gr,\0|͘?~>nѩSlkӦM Kwogsj׮]ޱ^{EΝVZHĉ'>l+2e,Z+Pkq @ @ @ @ @ @ @ @ @ @ @ @Z`֬~"&ƞ{~l|ըłNZ0F)ju֬YJ[ ,)S-,mcƌVkVA0Y )tMc6˶S0Jtp%=ᇕh<ӧ/ZH¨~X}c-ZXeA[i-92FQOA)nV: ib=˪u]YV:t(Cg~FRJMF @ @ @ @ @ @ @ @ @ @ @ @mE\}D:>b >5v؂o[ )ZUV4n86mM4)ѠA_~-vڑmt>5o޼?~ٳgg@)(^}tnڴi?ɓ-8RV~QF6"zEͳ-lCܔ)E.4*bȐ90RHСC㣏>«RՄ l2 KA{)L/ZOk9KҖڟ3gN̝;7ۧgkpb.Q諯qet<+J}m6 vmnݺ'}}8_}ո㢋.Zeb5GV Zj- @ @ @ @ @ @ @ @ @ @ @ @rnBq)zE.gŻNU)h'm&M**Lª`3g… cy:®JH͚5^z^)'?ZkYWir_8ȅ3E XVGȑ#rU8*_utVr#TLI\i-VܕikݺuPUU7ǴwѥKxj Z*Pk$@ @ @ @ @ @ @ @ @ @ @ @FwQnęgFqFjʭej8Ӥ3fls悿 )3-N>˶Zj8ԯ_ k֬,X+o9sl&Ո'h~Zuڴi,H+PݻwϾQ?bv 6J" PkTS @ @ @ @ @ @ @ @ @ @ @ @*_D\sM=DfG` 2FYU Yr ZjY@LѬHu뮻n-G Jew.]W;tN.$|侹g]d@*1 @ @ @ @ @ @ @ @ @ @ @ @Tr?8ꨈ_2"n1"kU´*9WRi"67 'ФIx'.s=78∘5kVN6W @ @ @ @ @ @ @ @ @ @ @ @ q[n1ztDϞuTU& PkWَkԨ\pA 80ۺtǏ51]@VEBG @ @ @ @ @ @ @ @ @ @ @TI#+b"&È#˫S6)+$ PkT.F`wz+&O:u#GsK@. @ @ @ @ @ @ @ @ @ @ @ @`)WĎ;Fkܹ?1thAEԨ N LѨ #_2 jѢE1dȐH) PH @ @ @ @ @ @ @ @ @ @ @ @e#`A#Dk_E4m/eӇVTu#64U)4q4hPt9c\a.P!@` Zi:"@ @ @ @ @ @ @ @ @ @ @ @ܹEnѣǢ{EYj!@ jA @ @ @ @ @ @ @ @ @ @ @ @($0sfD߾^1~|QGE_nZ&Z`ڴE6lX*n$yyyq=D JZ µA (@R1 @ @ @ @ @ @ @ @ @ @ @ P@ ֈn>="zX뺃N]tQq@Y ԬY3nQFt=xg}ʲ m @%@$@ @ @ @ @ @ @ @ @ @ @ @,IBn%bˆN8숵^֖ORX]* .HaZv[̞=;9xcw^]@U-I @ @ @ @ @ @ @ @ @ @ @ @e!]EԯѻwG4jTk|Z+[ j7Lݺu_=ڴi?BfI @ @ @ @ @ @ @ @ @ @ @ @P"N<1UG#ƎGV2k@ԩ\hذ+M ///zb-b} &uD: ԪNO\  @ @ @ @ @ @ @ @ @ @ @ @È="Z<8[#><⬳"_U&@5Ry ԭ[7|ɨSNtA1{NO||&M @ @ @ @ @ @ @ @ @ @ @,[oEt}q|q k/KK%@`yLhxyjC4iO=T92zYv kL@ @ @ @ @ @ @ @ @ @ @ @ P/F{;DLqyyETr2:5Q2oVYu}}]* P@m\!@ @ @ @ @ @ @ @ @ @ @ @…O>{QFD z͈X2U*0eJDƫt:'P ~\gqF| bVOm @ @ @ @ @ @ @ @ @ @ @ @̟C[mqA͚EVĠAVE&i*@J/رc7ٳgWᙚ' PkY @ @ @ @ @ @ @ @ @ @ @sDomqQ> '":u6$P`ԈFM }ƍ /ŽT&Zi+ @ @ @ @ @ @ @ @ @ @ @ Pf?q oq1jTDm[fh22%q2hHP` 7!a˚"P=jUn @ @ @ @ @ @ @ @ @ @ @ @ `+`>}"w⋈;hժڲ8 -0ujDFzWM;u]OyUS&P6Q+ @ @ @ @ @ @ @ @ @ @ @ @@ .X?G|rرKD|G ƍ9WX;#>Ӹ+ @eU1 @ @ @ @ @ @ @ @ @ @ @ @-Wg- JAZW\_,w* jDl]-@VsΉ/<&MU @`@-o @ @ @ @ @ @ @ @ @ @ @ P%F8u~k׈v2%gϛmۣMK.Z+8묳w]̜93oΥ}s=;s I ]JxWsΉ֭[Wq-\0vm\p[.M)sJ܇$[lIUR VԵOƆn=QF-i/&AZ ԪVd  @ @ @ @ @ @ @ @ @ @ @ @@Hy7=ѱc{Gԩ1xpoDLVxpl1qĘ:ujtMoI'zuͮ-Z:(&Mk9rd(n4f̘{bԨQjV ,?0{HJ wVzfƍޭP(OwÇ/.*Ta~1vH*:uc9& h駟ʪYc6I @ @ @ @ @ @ @ @ @ @ @ P5͋#ڶ#_?bذ#tY4͛z뭗.M0!ڵk]|5\3=q'FÆ #O%Zt󳁤zj)ŧ~լ)d)D+t*jFV"+w 'D֭#GIrڵ+,+\/b\z㪨kzY0ֲ8ӟ9B@-;  @ @ @ @ @ @ @ @ @ @ @ @U$0{vG6}Ft6h\F Jǩ߸ĹJc.* _ _^G,Aƍ@嬮Z1)P+-rʺ*9W Zjw}6mWUƎ=z(˟gE]-[b5kk/.PO @ @ @ @ @ @ @ @ @ @ @ @+w?GCıFw^D.3ȒZhj^1o޼"-B~E]w~f͚rK[1sj3Έ[/k&M5jȿ{(?]w5L~rJtر@[ܺHa]w_ԭ[7f/N:ewjJYՋ+"Zjzj?ݻg_|InS։'X0ni߉=KW^+hE * @ @ @ @ @ @ @ @ @ @ @ @` LqMeԳg䂌"]mfYmݖK\sf!ۮkZY0ҴiӲpo=~ij3jԨ8".[m6 J5)'Z_ƞ{{/ouG z{Ǎ}BRU ` 0ڵk\z饑ޓӧǹ瞛.\of=G d@/8 J!a#Ĝ~}xw6׬jG 5{-';һgg&dޛ^x!CSܻ(8⡇.]{•ׯ_ ]{tGQT %%Uy.OVdM5RG)p)n.ҳNk֭[gAwxY?).R@ZY] J?< JϟoD[ŽRpꗂS_+/P#Gt_s @ @ @ @ @ @ @ @ @ @ @ P\\VH3":+ie':( Z9ӣk,Z={vL2%k|Qfe,:;1^tW3 l'ߤM74>裨]voǂ IAY 7x#vq:f*xrHizarlf[\ ]zW;YO ʺ+{ɂҽ)ދo&^{,D+|ѨQtKt)s΍ZjeB Ilz6;/kCY믟g}bqwI'"]~MwRZ~UOJ_u.|gVܻBKakj3gΌP3fd } o}YߩVYĉ{#xn 6Kas]vY\r%S,i5VҺ4iR~z͛7ςԒq*)`/3H])+yg Bϝr)YWZKމ귴rg~ZRKu.]ttʴ5 @ @ @ @ @ @ @ @ @ @ @ @C ^ѯ_L"qɑ ZrURHʶnpgo~|.+?i ~S­ZlYOΝAYU fmk5j([o]m۶/fAWc=ᤀTRXZ PJi)xnݺY Oʉ'{-JuR}{nѭ[0TN:iWP~,}YhڵˮƔvK qJc:uj) Ԩq\w- ^Jp|һ#n 2$sNL^z[fag\ *=JH?S~")*OU //7˺vK.RV*{w[h]qꫯ.쒭t}6򲠼%m:_-䷝>-ܒ執'@~n  @ @ @ @ @ @ @ @ @ @ @ >$⪫"|0"@ :kiӦF-v.(+W`)`,ĪpϵjՊN:K/G.1Pkɺ… @t|G^RK J%.믿~~Og}%r5j(,Pnˎ [g>x`^V_}5jT4l0d5"0oԽB%;i0aBU5bĈ/j7TJzV}Z[?Ɯ9[k.6%}obb7/#M%_uQԺMmKaLkiKZW_}uoO<W8/[vǍݺD.8#cZK 8 @ @ @ @ @ @ @ @ @ @ @ @+Qw"=4b-"!Ezꊇi92ƎJJ+PF Щ_u k޼yYfKSps~aÆ>OY.,q"󤀟;3 +tuE:uCKZyЭ~8Ҽ޽{vSiӲkE|Ki\UYs.2shРAUһ5'BJ *3&:;.*5uȺfmcǎ1`l5kV<裑)/JQkw"U.,L.*   @ @ @ @ @ @ @ @ @ @ @ @+M"t)8(ȅE.lv6m:u\`AOIKk|%,jFݺ|WkxQ^h׮]v>i͟??RMiKVǻ[P-=ߣs/ڸq u>l_}uGϞ={]PN;-Ə~x|ٜ^y קO,+C ;/&O΋&M6ɓ'ǚk|7'nmVY^xt޳@IQ o㫯*vKϻ*7ɦSo~ٳi~EE JAZ8cu׍<0~%ۤI*yW|G% @͛ @ @w>ǟ9v萕JV'@IDATEFHB*)i1"%{+$!Nqُv>s]q:@@@@@@@@@@@@@@@@@@@$9S[WFqɗy+6m~NO@ƍ=_={HZrWbG^Yn}" )RG3zh~cܹS6lO< OhѢ.pBh}=#+>[Ϛ5yU^= <cMҥKkuZm۶}laW+T:u'Ou]Ow=^`<3ެ|sέ)S:vX=С^{N *ճ>8vO_]Kk!hͭ.]`Zh~˖-裏tR8qB#Fp]1# ˗/=VƸ|Xq KVkʌ3d!yvOxk۱k\l"ukYV޼y] Y-+V^p|D^v ?~+^7,H5+KjȐ! p^Zf't\ܲЦٳg+88XO8kX-[QB]]k)˖-KHUvMٲUcTVA_jv=ֵ{Ŵi\ ~j׮-$G{\hUL bŊ֭wۿzg3g%ӳ]?,>|f&mQ@b va                         8{VeWiPi&ɗ' *a* \۴w^,X0>rn W_ŋWo%saXrf<(QBYd"߷-;qΥPJ5jTz)Y[򥮋G*{̋k9e^ʜ[ͪUmS-xϭ^ӯR]                       _~_z?<˗kŊI(-K bV.t)qgȫNրwŽ J8I8ȁZItkjÆ Ryu%͍Ij%|dN\                       H#ȑK]JI%K&w}+R'OKM7䗺?{_iSʕUbŴ3K/TBCC5n8(PjL^~]v\^Kop5k\rE %PRҔRAr KSCKdNh@@@@@@@@@@@@@@@@@@@@@@@Ҕ҈oKٲI}H?,]vY388Xaaa ZUzU,멜b.c}'| *k= ?݃B޽{kСѣ맚-1uw#                       @R l&T4iΝ3$VR$CRI&!w!qÇOhT!@VMt@@@@@@@@@@@@@@@@@@@@@@@XVnBil% Wʙ3E ,P+((폓?yj5jߟ1Q @@@@@@@@@@@@@@@@@@@@@@@@@'ukJi*M=@8xP LvhxG;wnKylmR,R&{crݺu@ 6+RZm@@@@@@@@@@@@@@@@@@@@@@@"pS *u*!Tx\j.кɓmOKE$J]9{V"':}'P+AJRŊ1-ԢEkrȡ~Xcƌw1g#J7!                        oRRp"uԻ lw%YhVt%gNY~xz@YӴ;HF@QYB@@@@@@@@@@@@@@@@@@@@@@@D1Beh!w/n.,L:|VFCN,XkR[= K(5hpq `J `Qe"u(eΜ=Km(QBwq^{=PF@$"@@@@@@@@@@@@@@@@@@@@@@@>\z-[pK/IgΜ~4qTԪT9s @ Փ2FHʰPN.<Z9; 8@Vrv${'E,n!>'@>}/($$$1NR@?Rd                       i^W~.ҸqWH#U"^-}tu7Rw_CBy.j]lG 81 HvIkk 7ܠQF3t+@V @@@@@@@@@@@@@@@@@@@@@@@ % & uO}Tza&7J'J+G}.GHmHCyjL齦)`ZAA6 tJ,RR )ЧOM6M۶mKf#@Vt@@@@@@@@@@@@@@@@@@@@@@@ " ¤'7ސyG*[68@jțWjLʔIByRKgXV6'Ъ9gHwo|J\֭[/} c@: P+d                       ^~Yzɘї*0zt+Is$ByR]K9r@ѿܹ-+_^Zx| =Əcǎ%^CԌ@                        .u_]j<9 S[gϞ`&9LY6W'iںk˒%Kڵukk)iWc+T(1Ç_3TӧO|@_wkkiƌum>sȡ.LW\RڰR}> Ok„ ٳg@ & ?4b:@@@@@@@@@@@@@@@@@@@@@@@,\6<6 ݰȑ#GQĽP, 豐 ɓ'rϛ7BD 3}0]s|yܯL" ;tPfk6f6vĉ ³,Lң.>uoo{%r7Bp-o3gN~m {i[@yQRURI˧ڸqnomgm}G_,noڷm4 زfkXb*^J(}7TRzoFX:sZzV x ,XP KMQ̜zCg@@@@@@@@@@@@@@@@@@@@@@@\ 44T| ۰mڻw6ﳅhB,` * )Ydx0D 6+s.h#SLiPsbΞ='OP /Q;va`vڵk/ faZ^VBd[…(b[ѢE5fL7^-_P1k̎( Ν^|-GүzݳgO~֯rlG.&#LykFek[noTZϙIa\ӧׯn{k  {nE "\rol)֯al{McW,w[+Vʕ+kZn Zl=_~AW ^46 5ak,(K 5dBf{lfwDHۺJ*bŊY r'EzRڵtRժU9@Z0@@@@@@@@@@@@@@@@@@@@@@@ XN_Ӷm۴}vYNyb,8 ,BgB7,\'=Ǐ,,g/ ":uyφSepXrsRJ|쾐\*Q"/Dn0nlMZYlwo^*[^ e{[v;[pbbc7q{ad(hD,Ô=AS{'K!!Rz~cjJ                        @ ٸq6mmٲEs97 ˲%JBasbfAZC񟀅,__ӧ*C?}0[t۷t>ӮA 8S|yUPm988K٢)Fm~nu ֭ [^mxaNn))S4Rc͞,̂ 笷˖-ֲ:Oq#FH._\O/gYh͚5Kgv Y,>3# [|ytRoY5ią1%F?y=o,ДrJ!P+v\                      $Zz֮]uiÆ ?X(S2efA. N>hfa<۶msh^+v1wq=jƍ.H-·YoaHl[5\`^Μ9FGtH4xooq!ZW۶muBK9z[}9sΜ9z衖-[0]cO$P+w@q%                       WGK, ߖ-[#G Z۪Vꂴ+̂,XB,ɶ[p"EVZ]׬YSn)bK.ek ^۪Uʕ+Yaѿ$8~ [f~ٚᅰ1cF]y啲{u׹O[Bh?Pcǎuk\su6m((('[3{iΜ9pݻ>h"խ[6;2J}!P+v\                      \ѣGTΝ;2eʄX&d˖!`sjʕ.l۳g Ӳt7AJ8q,dno!Z,k ,B($D ,,L۷o׊+O?cǔ7o^]Sի¶dɒfR5W_-5j$ _zf tQ=zUW]b%۶mӻᆱvUTpTB5mToF1>,~?JW"                       H1cfϞŽ,4,Rl+\pdb Zp ڴigϮuqj޼c"ŒfΜ~AK.ӧU 6p2 7 ߴxbn=ʕ+[7t5kJ*%f7/=%iI?W^yŅ#eΜY{#<|%qORos'OtZh!]tѳ>f #Fhʚ5kqij%p;D@@@@@@@@@@@@@@@@@@@@@@bYf髯ӵo>.]ZM6ԯ__ K`׮].jΜ9~-[V-ZP6m\@Tƌ\m;M:nT;&5vXڳg5kΝ;[nQS<Q _.(?… }AU]YVJ,sJN)ƿO׷o_=KYƿ"o_~yof)ug`G9fwg| P+j%܎+@@@@@@@@@@@@@@@@@@@@@@@  ;wN} ۷;C=5kc,f֬Y=z;ժUK RSp7ol&LEW^.H`jtK< ٳѣ{1uD'NtAZ7xcH.׶m[YF/ [ Kξ[VZȪ=z>SM2 }^hѢ9s ӧOf`-ZB @V >"                      N8駟ָq4m4*U*i|G VSppp }5k\rIQj-[LJbd Mmcȑ_7nSZnaԩ`"scO^j]EYd۶m[o]j >-jYW\/:r￿}O-[tSL_֭3f]Âl?#y٬Y3e˖-Y~s0] o?G@@@@@@@@@@@@@@@@@@@@@@,Хu:t.\+Fw*RM7aASժUK=h#ݺuSpp r}Æ 5o<|ҧOTqI 0I͞=[mڴzq޽]VϞ=ZE P׮]]L+I!^|;wD^~o Uh|s†,-RѢIݪڳP; &2d2g쿊HM Fg7o/ ʗ/ɓ'/8_ T,uȑCM6QH j@@@@@@@@@@@@@@@@@@@@@@@b }*R´/OZPPb3ʶ*իWzK|Mucڴi1b>3]InT (Q"Iv,-w>ܹS:t'zTٟĺW_[.ɺxt|$k {P {婼B hfuUWj֬}iĉlٲjѢ~bhyȑ<                        Dؿ,PkС*W\_ٳg5sL0j(=Zk֬ѻᆱ/\믿_~EsVΝմiΝ%-r ^{J,) tzϋˇ'Oj̘1Zt_UZU?-. Ȗ-^s!"{K_~ɓ'1)SFz4ikv]-^_~Zl,`zGTti}Wn"O5.믿ma_y故 6̝۵kWw^zkm?^ b~UPc3N qsb.,7tw$v͡G}T=z` $ 4aYXseɒ$rSVoY'Nt:t,$㧟~ҙ3gt7[nE rV tPF ?X 806ê_ ( :z:t蠱cǺ {(88XeQu)\d -`9su9PW^qi/_,7tfa?m! ɘ1 ʂ֯_ʦLB?n6d!Cԑ={ x6lʕ+ I/&6neY} Yʑ#m% ߱9b>6̝;ׅwnO^-~sk뭷5is+] H֭[$#̴Yf~ٜL{ݜ =[޳ 4Wl]ENbDӻ:sܹsԩ&_|X{O&FS{ϯ^Z_}b4uZ JtnHd [_"@@@@@@@@@@@@@@@@@@@@@@@ر i:uw(YDd4z!ba4m۶uaYdeҥ.XH".p‚,4ʕ+α6mڸ@!Ccq{;vpf޼y.|Zf/^  9x:! |nıh"0`@\y4rHk.}OoȂȬX@ɇ~B,_~5\z,TNJYo,dgʕ u?b4gO/BN<) as *[,P ^]ٳg]h,`!Omݦƍ ~UHtW|ɓ'p;1rOT2O+`Wuֹkʔ)?^\O}hh oZBSxqM<9!&5Q Xȑ#5n83:e[/uqgw|޼y.B,t+y=C{]{^u>,XPvc> )*@[WoD=z_tgф tw<8>O">´l~&EٳG Ǥh)qޙ6K,F2WgDLtl {.^?}$ۿkjԨϟމ7lؠ]޳.?}A Mj*VҥK2(p~X!U!                      ]iӦZd,*9r.Ou!8:{Ee]& {ڵk GxmbB E<ϱs߾}n|ǏwD֟Yf]v~CLY=* 7\o~(Ws ?FQK ѡCԤID-ܢ= $z[ـ.wԩSձc& (>/Z(}n-ZМ͓mۺ=-ܯ_U_|yO|>wڷo3g0Ν;+k֬Qv[wWoFsέ^z7 Ժ{#$ʊg}9soL[ϩ;PBݙ1WlI$͛7ak6 ɲb!'N yzWꫯɭ[O>*QD9UP&K]f7cƌdiFZ@@@@@@@@@@@@@@@@@@@@@@H3-ZPٲeSO1Yrʥɓ'kժU =ܣSN7;+Vn[,zaEVwoݱ8-޽{uwhծ/Çc>b~\ /^X p[',UVum̞=- Y}siٲ,,)KJdk>Kkn\HYfʓ'Ox]wZsCF3h۶m뮻\qY[v^\Yp9+leZTREq_~ Ӻ曕?~/X^XcZϏ<OOyS]^?{$f[^ݖeY-9^fM͙3OgKBrJi֪U+WՎ;;bŊD۸qcI0 !GIU                       6,$歷G}O?4u׶xł:,Bkիkȑ[J.B3}7.ū#>{ۂdF'OKwܩ 6'e]i#!k1c\Sc W^yε:t}?C:x_}=;wnM2E`1vX=С^{5wX{ァ_֭W-\$>.]tQh"$e#6_.]'NhĈڷo7ڴiHk 7X蛕s֐o/잶k}ٳw7oBlYWfΜ{s{eTvb{ڊkołOnkd/iԩk.η@@/ |gI&-ӧW_~0Oa1c CL5:pܹΜ9#KT%yU}fT K矩;P˜ڴi;>[ޟw%Z0ُ?Dw{e̘c|L2ɞ7R@& N                       @b )SF9rpa,UVUpppb5uQ.Ba쳅&Y_jԨν]`ٳgYf6ldɢnAk׮uJ_|֯_-[jS 幨h,Yҵk -zꩧ[=C.pB,ԦAʙ3g45wRiaV|~'͚5KRX^}U(QFbdOs)gdc:G厭XkAU/LׯN XPٲeݽ;w ٲ>S~4gwڳ {I&N .8 noV,,([l1ÇwAnjhnf裏ෆ Fsf~7svء#GhժU.LٳnmX֬ i+Eq[oq 2D7ovkyha\5m46g|.jŮΉ'ya!Iz3$r}ymw޼yZp>WorTP!rgbƍsc|wܰmq]vuUe>mVk֬q{} p{em[N{Y]珱F^;vtaM`` `g@ugm6~=OvjoAe6%K@6/,)Ztmդh-qڨP{oؽwJlsTd XRX&I}kk֩YY^x=0>!틽oMŞx1=$OFߤ򽛤R 4ڰq                      $/* IIlšr}Q٣L2 ٰp0N]X0?X.эɓ.kfͪ JuVca>vckΏǽ* W[n%uڒL71C  O+]t;ڊogAs6-x.b@{Y[^4tPYnYNT%|Qɓ'-B, /bkLV^;Z%/iZdӦMeR,F/_-Mvx^L^Ծ}D6*MVsb@@@@@@@@@@@@@@@@@@@@@@ kytmM6zs=#?,k׮YvСׯ_e;92:-+sNѼ__. >}N>mKOcǎZH;yn??R&L+#mYp? 6mZhpnHE73ydg!Cjy^,3a,۱c5k}ݐiE59r~楟eR,O?dYu7g}Y `? pj>-R0j=.绲'                       Y{Urr6xoOJJr㬦wh?BS 4HE eR HHHߞedCqӅLC*3[nѣ5f}zTboٳzwsӧ>խ[ >s]6$mݵk7n, ],W N33|A{Yy4j(YPlll&2&ի$%K+vڹϣx OWFezjs2i$;]h 2g 5s 1#P+</@\evf@@@@@@@@@@@@@@@@@@@@@@@ ,*@,[oqF=&&F˗QG l:11Q0|p]wݥ}H\[O? P Akl@@'TRztyև?,$誫-ܢڵkS.fM7ݤE 7{URo}o^_|Zn3fjժ!튄OY6m.=Կy߭!;3e]r%@[o5b-g /t#GfOW:usυ,g&w4{;o4@h@@@@@@@@@@@@@@@@@@@@@@(p%%%,?+8+tjjjHˋ+&?[@֡- H"!Όs=C7njԨoمeXP8͛7ũtXU.Hkرڷo 4H%JZ̙3erԯ_? ;{y1+ 3{5|5.]h\r(,SrKV@@@@@@@@@@@@@@@@@@@@@@B%e8bZ)))!>JLLT, J/^<:c6RO觟~'K.D{v zS/%`a;򊻯.\:hРA.&..PErkSO=goէOuM%JvPQ7x=}jԨ^zVz/K^OS gϞ>k*T_|Q͛7ϗ擬\R׷~'|R^zislٲE˗״iv78 HV/ Z9cO@@@@@@@@@@@@@@@@@@@@@@"V`߾}ڴi lzǎ!Й Dz Պ2o`e˖^ܹs]]vejذaUߵkz-M2E+>lYVr3kSu֛o?؅_;wqvRرa Zv.rYСC5|p‘9D={4a[NKj֬Y&Q=}'Oט1c8r~eʹ{"                      6w4kVబ7j޽!OHHQG?(i/]t̄ 55kMMnݪ֭[BzvN:I111;1@> 髯{¤~UZUzR޽ui{4%%͘1C|̧sYgs>^/֭ު#FxD^φol6@_rnǞ                      䙀/Y?aDzu[l K\\C±2 Cl\hѐc0{e3g;C+Vksg4h{'Hd `.?~d5M69ㆶm*666 עT}G.lVZ>S۷o:+\EvϞ=5{l}.o۶mjҤ ϲF ij@$ܯ^缮 ՚- q̘1"zg}VvEDb U#P+v                      @z 7n2+84KReYʕ#!0̦.\? jdA(ժU)v㎋00c.ٱc ꫯ_НM6:vN:sΪUV ~,˗/6mOv-[6C7믿v~۷ ?ўH׮jԐy%y_O{5c rxw ."-q.dl,X%޲>%%ʹ7Z9cO@@@@@@@@@@@@@@@@@@@@@@B*s ñ6xoQ-L^b6~e?: ԢD@ZZ =eZsQJJJ,N:I[G脠UG$`ѯ~A}͛Y{Q*UtꩧBFlh֬{Go>YPAeWv 6T˖-ռysx:㕐pgc&`Y׏?e Zr9/h] |Ѿ̝+m+eo}5JӧOw+TzB=+?z)-]T.7buСdL -SƏ+"Yj圔@۱'                      @XxQpMñlyjjjHˋ-e eY6)R$ Xo^_- S$ F*] 豐 E:ԴiS-[ߝq!! ]B~'/ڵk bUVjӦNVu)*?Ӆ}7,LJݺuskϪ?X0}wP g=`ϲKVUYG5شiR߾>ˤnj[f z=aaQ}y炶<@nm6;zW5sL׿P&M9oY`„ 9?{H@ʹ{"                     W8pdBi[?O'$$ -sN߻䇻ըQC7 sG˖vu8^>ݻW+VВ%K Z>ӬXYX '͛@žD';Xr ֚?~ mٲeڷozQFjذ7h@6TZ6;=ǫWҥKEdêUdfhI'J*E@ scH>*]ǍYK/w}WwVuK.s$ۗ_^~^u͚5ZX_/}BJ*m .\X(_&P+j܎=@@@@@@@@@@@@@@@@@@@@@@A2 J*ƪB `cX%J3F l,y~WYP?,^X~Vɒ%U~}7XxOݺuCZTLm_aƍeK|rn,8w4ic=V6ԬY00EUwU FP%l]\[-ƞWԩY׮]]s΢bY؏fs<5y @bath!jٶP-4d4g4w. w̙35m4ڶmԩlhbۼy+}GnX`+׻woK,@=cljܚ@۱'                      a XȤЬ>\/i8ec,L 2]֮]+ Zd&_dZ6T^]ժU mr9wa  F_iݺuac֬YUV?i!I~-xcqJ@M, B,L͞[?YNXP^5\=UVuϮmR ձ盒3bϱfL|gg2{? -О k$/Uz朶9^؇~N9b{ZR֭ղeK5kLž-o ǵΝ;3taZڌu]ǻ>}QO@[s;D@@@@@@@@@@@@@@@@@@@@@ ݻ JNN޽{C,bXL2!3'`<+WtN;?ܹ3pИ%&&pJ*i{mZga6+W΍ 7lݺՅmڴI)))yfئ3f [\K.*5k,ۆ>U r?͂^ .~=jϬ?Ϭ=?Di}۲e{~,4c ³={a} 2{-y ;\Mm[r~ºJ5o<7شX[ƍ}u̲ϱE~sAZʖ--Z 0 k I921co믿={:, `@@@@@@@@@@@@@@@@@@@@@(:a/J?{XXsY \*zMix3ۃukvCvfϦ=6T۷o grg6xlA;ϯ/ec/YOpp=6jZ sϰ?o(%e2ypW$צVZK.!Ͱgڂ,pk֬qWB,Yq-p9?`ܲg28FnzYBL 硅.X oOEݟP                      y$`A4X[؅Yłg,H‚~9c' 9r N:.KK_-]}t}Fڌ C/ H͛K:HÃ[X,[&5h }ԢEXTJ fR׮]հaC-Z(I U4{Ծ}$ռWU                      @HIIQRR J~޶۶m[TѢEe2!X|`YrNLLT\Ad"R>K.u?/_nU6@UWIa_}*@ Ԭy H3:}`+WX\vY9w{.h9G%E~s>@@@@@@@@@@@@@@@@@@@@@J={(999Xba0C7n얥_n !3ݵkWDj.TCi`iDixmph#y+СÁ0[nN{n^ZI KE `@@@@@@@@@@@@@@@@@@@@@oߞp 6(%%EwWll*T+4h %Jg@ cm۶~HD[ҲeG^jN_zAr/5B nI[_?:u"VjrS >>>pK`" C@@@@@@@@@@@@@@@@@@@@@@ W,jӦM. +)))eAX;v9wC±,E JLLtZ!a@"5Pox&GI& "5l(}4xGxi䓥=9s%PVU:JQ ֲ@;FiKiV4 I[@@@@@@@@@@@@@@@@@@@@@($wa`j:99Y{ )[lHVjtǻeuQGL)S&df@ F 55՝(ZY/@M=Zv€ƍN?ȏ(JI3f <L) +u#p -+[wɒ%XEAjD@@@@@@@@@@@@@@@@@@@@@o[6l e7oR"E(111$q:cc ʲbŊ@ضmhjY#,h(i3ΐyDQ#2D ,iTKyAmSKfVIg@p@- lٲݝ( "                     ƍ](Vv±l]v,Y2$^ޠA@8ecʗ/c0 _3 7(5j$ &|H+ NG 5u^lSKUNAւs#}qqq*^zk -J(@@@@@@@@@@@@@@@@@@@@@rO`ΝJJJ de5maZ- n@IDAT *W\HVڵռys>bŊwg @#y#ҨQsIcJ]0Yp4tEҼyRÆYXN^TnV#K ?CTFEZwMi                      l޼9X6l\hѢ.˂, ˆ;.0ܦmȾc@#X*U{/. &/ "u&u.=T^Vj!O+}PVZZZH%W6ݰaC̦ӯKHH HAd@B(`Z֏,`]^ &NƏZ:x{ PX,nʔJ-VoRRJ_j@4 0;%&&o&Ҧ( P+.(A@@@@@@@@@@@@@@@@@@@@r"},C6mڤNeAW*TPŊXW֭ldɒ@@+`A9C[Ji`M+7;~A0 !=4dTtV 2 䍀(Z~                     pt" lKbB±N:Cc%&&H"`@ڴ4{+СȑҠAn?["7(-]*]zT@hmik2PhRDV4\oZi!                    D@ZZ={L2!aXUTQfܲ+eˆ   .~(D'ѷt´nYz)ixS#;VZB];W[7oC/ڷ]@||,Dʽ#s$F@q                     !,bÆ Z~6mڔePVJJJȱ) *`5lPr2 Dzeŋ93  @ +i+nA:4颋U1 h~^W<]Js -6XրQWj@$ X־}ThQjĦPB"@V!4@@@@@@@@@@@@@@@@@@@@F^JqF%%%`, jzΝ!)QDH8QGzeeʗ/ؐc0  pJ9Fz=7n\V_ҍ7 1 Hwޑڶ=W#dHoU߲+5D R-Q+qqq.LkEjwt ח!                    a ڵ+@ЬdYVp)W ȪXרQC'xɓ'kժU4|p?   Xp!u]wI<#?R·sE zVf͒ڵ.H>]^q/[|ZկND@>ӎ;ԊK P+j/- C@@@@@@@@@@@@@@@@@@@@زe,+8+[)11хauQnܴielچEfw}ƌmwQÆ ڎ  ضm[>{&3%i]v4dȁ=jlO!Io%u$/YҪK"E:u¥FwJKKs={D_#iQT U                     {Urr!ñY~hݻCPEC,~'=zx m޼YŋWLL;駟;OK~7N6mŋܹ>?zj}'.TSOU^2 0`>UV?D`/詧 eʔQʕu1YX1[]=\=C:C1 D@pǾvmbcc]dɒfҼysK2.oŊsp*>f#-u @ X3wywj[vY C {v^᯿G}T;wtCfΜݻw%B3jE                     ,x Ne@Ŋ aYDO[ Vtbb)~իZj8*UrY&Lp/8p-ً-¬,3TfܺO?]M6'iӦuem33~x'԰aA֭[а_=7[{#W_#Fh8q uYo@$m۶ZwQ6m\Gg},/gK*e ֗رce7p[faezjZ~ ;=c:u긾p*Udae\s[o}kVO<9Y/VZ?Xͺ*/C:T^ԥˁpk?c`1 hذ:uj0b-='+ .X©,?toZ\8]d ʍ0-kw8/0ZI]>3Yjwھ}{Yiiiռys}.f妛nr-^Ld ԊG@@@@@@@@@@@@@@@@@@@@3{mrrrñ, kϞ=!)SC*W^~k˂e˖ ?g֭B)^x L_gck;^v B7*WͺbAِ+:K*⋲J9[k& "?,$f͚3 DC>ZpÂ( D=37;h|^Ε/bQ oA@e˖>X({~c˙2E?J^<vڑ/Ne{~ {=_#[( eg ^ow8}'n? >_G IСx {@- F5kn6cE(i@@@@@@@@@@@@@@@@@@@@@RSSaYSpUbb*V°,cQvlœ"XpA5rTe{OhX5,,X N:$zJHHp!3<ƍ/[vt_g?w-YF^ۻwoemx饗dZ~}z7ڵk{n6;vϟB.2%|bm({{‚_ǝ;wj_;8W:Ń>~g)^+ XP|ziԨQjdvYuFz͵pBw =St7kٲÂx&M$;{B/6mձ{:묳*0gqVyϧ@L @ }Y 9E);, $^ʡe˖6{BwZaq                    '`/yߴi JJJ e˴烧ED!Xe/,҇cKj-T+KÆ {oJ?bΧz͛C/W_}۷kh0f-_<ã5'|R:t`^rn/NܹsdM6nڵk9sNHWf@GoYP ]dłlԩ-@BzímE  +y^iSWPt7@[n OW_}P 4ȅ YPF]XҥKy, kԩ:K?ZrGLo?z`z;eݪU+Wkqa$dO<~駲! Lbe!Zvx@ ,аazs{υ~Xh3ϔ[nn]+"p &C~{Zg-/LKAf--[6 b9s왷@] 38{ƚ0+p9 }d!meϐ=c.͞7 s͘1nAs;r~euxeZVk"xbǻmwٳt遶fҝ? c{>SSSH*oV;<7?ٳg< PDZ i                    @4޽±{ izBBBHV5 3 DzeKٟ@1 K_, J*kf 'N[7[9MۋSRR*..νt?&&ƽr/^IVժU]xsΜ9@Ç@TE^ZM4qmz(d]BsƂh,ƂU-tu֬Yook-Z-֊I3g3:3 W{C?{#*6d]r%.@vz5w\M6M?,s3 j{.T-€ϟ߅ լYӅY￯^x`Yg}& 5~pZ>Z~-P˶??؅*U$/_c cB6>& bm۶` bMI^&JOLmVXlc-$³,Du*S<[ӿw7~{3u[VgiѢ{~oUTɅhvYeo4i-ZB:L<}R,>:f,/ݼ:h@ n}'?Ν;?Z{媝/x@3W"'ԊKH@@@@@@@@@@@@@@@@@@@@Q^a%%%qVӶ}p`De/շ,{i±l^|Ls.:?{ ]O?#Kă?K/4hAƍW_a`/-oԨQYOڋ-7@@ >U\VFme}~@(M0ٳgSN9EV? X0(۷?c/ }V-K^@Pe^} j6mB6ҥ>s_XgVKӦM~6me͚5n/={yc͛ݲjժycABVʖ-~驧ru\ 'zᇽ". uŋQԪUY{~ 4rʹ"[faV?'|LD ?ˤ~=}{yAriN* :/g/,YN:$*V{PGׯ*=څdY# :t ޽ +^'pacǎչBlE%dae[ܱB+?%N ,pG*TЈ#dիWTۂ.Oh*J |F_i                    G$`/7߸qc +p,[{s*U0c9F~XV,{^r`fEEݺuݹ,jذap*Uڶm^Ue 6݋?`{{1sNˇ, D-tBU,|A\|~?qCrݺu7o 9FaR:|y}O>),5o~ /]ԭ ~(ŋCvw bFVomX}]qgsĵm@- ղ@0[or|l:?륍Y8דi%\"}2dȐ2^>H޽!y<9.*!!!dݯ[{!@u 䲒}t{f͚֭fΜ){&.j}\J>}\`?=zs.H>ճh9^ fvt!@n 3je' 5\Pao| y׌#                   ;h:xi/gS˗/e/oٲ Je/з@-J 4h,T^_gv5|pܹS{ٸl\e/.fR׮]5ydw}ދ3xS{A3fpsv_)  @4X?xjEZ;KH,մz \kh‡d/W+WXfYjlo/ 0z㏃oG^sAwUvmBoo[0Q6mO?馛nҔ)StTZ5UZm߆c3۷ow!L ڐ**{ҩJgu`p )֬Y+W {='H# {]9R}ƍGy}ֶh¯vc{,tK.w.d+gq"rUe1Vp\=A>l߾}./GN/                    @d hɒ%3gz-phСݺu^ʽ8tjr/>[C=3gjٲe^(=uT}_~z)99ٽ^o/8qF{o_r%eR|;aZ{Kz.gO>Y28-x?mݫV6m^@~%+gyog{O>?wL4I $z /rF @H *YdZ~(</h鬶j_]zg#vg 鑎9FzqmZw߹Yo[vNp6,$~/vm: YV߾}u=z`- ߘ pJ*饗^rQ~x7T~}iӦ _V ,c"|,B֭w?Hu-V{1{>v[Se}d1c诿RϞ=u5׸*r- O>],˂Y%nVg`=䆀}DCfWӁg#mW_};vSNUa:⢨-4@@@@@@@@@@@@@@@@@@@@ IIIڰaC`tN)SF+VQG{ضIHH9;tx.tBbkV.\/r/-+K. ,^ {G`ł/Bo^޻wo5Jcǎu]^oW܊3ϸ7 zTN?  @4X}7^fˬtqv,+q!XZ6mzЖq[lQٲeƂz-|f„ _,u.{t SOI ="O[G}~جY[omXZ57~wuw\2We͚5n_}պ5}tuY Xie^cAZC qd…mǏ ]_[|_Z0#TJk۵k' Z] syްZX˖-mSJxh},yQ#@U57n]g!6+WԢEo˻-WhQi&hzFv=n&Md>^g 9r)>ˬؽ^^=6{7k dyB^\9wC=o*w x/9GySAU~_ f}JNKqt6V!                ޝT10쒲QQHRV+-Tk/BH*7%BTʒ,"T2݌|~g3fwg8{;3y#    V>@,{ݟo I}VقCR?|‰h^QF)!!f͚zGԣGWxߊOqet]w .)fӢEr ù 5z}Qw͛7e;ڽޫo1yy4x/'^n +M&]{mLI[Gk׮JLLt>կ_ߝ-pŋF^@.Bkwf ={ [[f=B+a˛]%~Yx$}Z_'`aCӼ\r3rHYpsY0߫W/w L1볝א!Cdvl;=alaÆDf`X˹ ;2T˾W6^ݻwwak~0[oF߉vmze~#I:q\6hAoeZ7n ٵ7 в9 ς~Y]~ڵk'rM6btt[/˂%`?-Ƣ,3/wY]~ZЯ6mڸ? locc@Ͳ;+Vf8} jA@@@@@@@@@@@@@@@@@@@BX&[-[$`e6ou0ñ,L/2-hyZ+3̭ñ_@@lwyJJJҼy\`i66 UWXΣI&!ٿ`u˯x,HK^HU UrfީM[Nݿ իWN8=Fw­![W3koNo7ʎVw¶j׮2/@FZv,[L;wtǁ!ٵe׈dukѳмo>/^܅YaZ>^>dW`z7eS &-~~./( UFV@@@@@@@@@@@@@@@@@@@( NJsO ,`eUt͙G -Z={jze0 @@ 48 U^] M+%4zJ/R XҳJ^~F=7Zx@aسg~iZJ]vYa?]@(UJuҥ@Gulٲz5~x=cՎ`˖UUTe<(5{vqL}@-[^{q^ K' k /' LLL̵cc%qkA@@@@@@@@@@@@@@@@@@@H_`߾}cfڶm,ToteE-Jk>5 Ԣ!  EBx r-<4f=ڼo5kv,aä. ;N X!h1H۷׽>g}eNɲK~[^8bV } /QzoU4cԺu7 s                    Q+0+p]R-**JV >0QF|lld D   @X UJ s.l'ktM5j(=)WQQwS ֪]9NuJ ޫO/Az+.nF& K|tt.#6^}iA99H@@@@@@@@@@@@@@@@@@@ @RRW8NVX4uVeS@XQ!Xwlyʔ)b{   /`%$$>QzXb;ԳgO1 %_мyA;տit1,/-ZS͛ј1ݵm[&Muqf):ZS'ϞsF 6mVvʿpd(@VX @@@@@@@@@@@@@@@@@IDAT@@@ ={ Dz ,?4+0(+>>^J>"E|PBr ։'3<3yk6_xA@@]-̘Vx>r-:t ^}zۼe%t啅|9REZ8#F~xڷߡɓߑʅk@- *JbJ^w> \r>"uF?wjk"                   y&`m悰 Dz{*NuǦ+ բ!   Tzu}w.84zE/-uV/Lk~|}ڶI#GF~`!7۷˻µ.RƧo>Rv(+'7˗/)Sx~!*Vf̐Z΃CULN@@@@@@@@@@@@@@@@@@@"( j8V\\8bbb òJ.b{   ,+V^zZx6lX:Oo-yf 8P/UQ>;^=VTmN6颋iڴ:Ě;w,&ZJҽJwng"N9-YD'|ru$LVlrnǖ                    ?;w,(k)"##ð DzuS'   [TfʹfժUp,g,qF==zH: PPvz*W.~*Uu?UOڴ9ݱȢԩSվ}{Ņe_Z9,M@@@@@@@@@@@@@@@@@@@ A֭[WџҚOHHHAQD#±NRdTԵ- i zҚ5k4mڴ\>4XQ1p܈5@@@@@@@@@@@@@@@@@@@5$Ź[ـVT)|ٲef@@@޽&L 96~x]}kX`ᆇ~.V;I[ϘS+lS]ƎPݻW(Nq&jմO%:ZJL<ډ'J&j,EhӦի_~w$@V\@4YX                   @ٓp:tP)r)@,{B /^} tg'rC)){륺u<y'UբԥԺGRJҴiRҵʭw=ޑW?YKLLѣ% !@ XV5{ѹ{ @ $A@@@@@@@@@@@@@@@@@@H)a8, Ӳb~2eʤU`=Rfe#   Bv.,{͚5)ΧlٲKS,  xlj^4Hz1i?^{MGycSiRr[s%~O?]zek$oTIEH=zHKEC4}Z#_.]xᑯ/|rթS';f@H˥e                   9ؾ}{0y?(kΝ)UԫZB?6l0ycc: @@@[+аaô~a7tϖ@ҿ-]wԯt%HCJjkAF3gJŊ:s䥀eXPu"{P:xpV ^eXUs%JH#F.arS`…^ vi̾+z7@@@@@@@@@@@@@@@@@@@@¯,0+111Ź,Y2Eaխ[-Ke˔)     @N4hРՒ# Ԣ!5ޓJAOc:<Գ99 e% Y l#öj|%4U;Y RŊKGHHHвe!/A P+@@@@@@@@@@@@@@@@@@{{f9Bm*YUUB@N8A-ZH~͗ 4@@@@ ZlRJi׮]9#!p4KKoH_/}?{n?˙C /FƍKeoӧN~bA`~+%yԣGmYDڤI>G h `m@@@@@@@@@@@@@@@@@@@ V&.>>dmٲ%͠, |mϞ=)"+0 c=XW:Nx   /M8Q{O_~yn?&OvwyVe]wG.g )0{Ԧdnckl}=!A*^1KO>p4YW^~UHpsnbEi uHC@@@@@@@@@@@@@@@@@@MXqqqJJJJѥҥK˂RJjذ{Ĥ؞'    @Aܹyn4)PԨ4iRaZvN:`}!mҕWf-LrRǎRllWʔ#=aZyX`N=T´ Z                 {޽{o>~LHHPbb8p@/ҚOСCWddd"E_8olNs*^J(ԏTR*YY?]\@y2{SQñ,nݺjժ+ fXO B    @> X 8M{qc6.8Xqذ?8.fhqK1. ~r6 ۼM6z:cx?&lC`FG3..y]xeJq{6i&mݺUۼD%y}[쾊5Ĩ\rnHqի{!s5[o~[;VZR+O(Wivmذ{^6cǎ/Zhֿ}w)25YbEsT]Yk"@v,PiӦ݌WC                 &`IMqqq?o;wt@?oV, e,ʂB~1=ъYSi   &_2s>ZVҦҥKGyٲee M= BG7{C[lI~͟OgqCz޾   䗀oXMRM6&}aa вq̚\ec6hx8sL5i+X?!^M귱k ǀ˔)<l8E~h 1:w*}dYEO^^ [Fk]-[Kjߵ~z`ٲ{!vחAE׺eϯY+-X˦5k^zjРׯ/ :?e!pkM*k9kqŊk&lvyף=w-v-.[3}ůe~J*{-) r.`+ϐ^7xcwĖ9Q:cԺuvo='                 PPc"x6o&+|g~PhYXVꂡV΂ ({x~PъϭM0cVԱ 4+*w^WHа`1+J重|s"~U6YK V\4Gd] tWw=7oߛl:@    6ni&mVl|88Fl㞩ZH6.lx=c-\P7.mlƑƅmL 0=,fb~X=zM6{q1URE6Y`-,m[y?~2j]|{Rf#X`Ν&WZw%@ZjN:QFr\UZGqJ ;fײ]&k׮u^v['{a~Zh&-̑yG7N޽µ운kryʕ+5o<7.HcYBzZjף}wτ>^=I9e(> nذ[{5͛k>4ȚEMQFYۈ&@V) ʹ["                 K=YqT+}TclNPBB[P'~s9.Эq!▝Ͽ-΂ZB;w[EP tͅ~g3K2eS^[V&Ʋpki޼y\z^zzƑg;w\5J&LPRR q+t%mw}rnM7$KC ,tOٳv!qjm P+vl                 Vth_-HƂׯbZ*޽{]ֲed٣ZVӮY+ڤI5k=*U*́/~ɂ2 _,{[ҥew1113   [O?i…ھ}"""\Hd6YV8'jOvM/n071%J$~j޼4h@[}_xڸq /ݻ:w4Ev=Zlcǎ{t9'Hǎ#Fv˺w£| 6h̘1nZnڶm;}fg2 pxu-E}3qrNV@@@@@@@@@@@@@@@@@ L,xfΜ95w\W5>>^Eu&-|Ȋ5lM*U S)N $&&jZx~gWw.H"Sg38]둑vV@*VX!/{#2 ˲fall*TB,+yp tb@@@L`Ϟ=.d=P?1rs;D@@@@@@@@@@@@@@@@(7oִi\qSʂbbb\AVZe˖0jR @ҪU\aٳg˦˗+**ʅ[o^6mw5V\C"IIIB|IH=LLLL^HfٴuVSXiXP    @p~g}sz뭲{E w߭%Kga,l޼y.Œ!-oܹsu7;{|衇TbŜ>Ӄ>肵:t_|Q'pB"P֮]k m۶m?zj#P+vl                 PH,h.ǂy~'Wֹƍ4BHg Wulٲ93ϺeŋYX+=zhmce5[?-ZT. B AYX󶎝 @@@@ ,,o|?P?xoHP|GE vޭYfiʔ)n_^zsRD|e}vGƍS.]4x`ըQ#;d#~رc]PꫯcǎG hذaȑ#UNp&ɵso]xl 8Pwq"""rx_qqq{KT"P+H6 ,VE@@@@@@@@@@@@@@@@(<VoΜ98q}]mذAz -[ph s7ɓ'kԩڳg+:ܵkW]vejF{Ьwyi-Y}&Rl'xBO<+uVU.)0 +s9c((('    @ Xj?^&MR||:,uم׭[7L駟O>_Hk\VTTT(t3K}駟tWŒFMSrYxkO< \_}Α2Kv´>Sv\^llle%BYSN{~(w@j܎-@@@@@@@@@@@@@@@@@ Uo"}ӪU+c>5j(gD(5}tW>rV\pnW؊-..NFСCe֬qZͶe ñ,L+ptU\9b{GfZ4@@@@!`cƌq6mȂmƉh u]vp'j*U:KaMnڅϻ7᭷R޽ռyswL2yw;W_}.]B횬Yfpwg֭gA9B-o>Y0ٳPkZ9ʹ["                ? /3giӦktUWRJ,&G1c+N{)**J7x:t Eku2=H bΧe۶4@@@@4dYX^Xqx]m. رC&LΙ3UO:uRDDD.9~饗tmo߾}aÆzۍYs=ry}9D&v_n]z뭹r(+ֳgOիWO-k׮jԨ ?ݵk[+NeErs߁|gk&2~j2d,lsY&\V?ӵ<6Oz0FDD{+~`:dea ԭ[c}Z`ʔ)R^|+gZVO?T?P|+OVk֬}ݧ$Yپ}QY޽{ .о} /hΜ9BznvUR%Mo[ =3nݿi…*],Ȏkњ7oJ*5kjbzq, >Snי;v/ 9Z;mo6_:Կl][n;:1BfݵkWW~[ose˖0`{_|zjmV7ov۴in3hpv?`fq\Wޏnݺ3f8kתI&ڲeKX9'ְak|G}Fx-?X1/R7|~ F@@@1'xM2$dzfc}+~wƵ{=׎;+VG ZDl,wȑn}<2V?_tK,(sqynw}yuEW\qƝq:묳cIsϹʍmu-+cv\ IǦm/Vz㴧~ќkZ>4k,x5iW^y[?ڱ4ۧOxt~dfϞ[-y._V>KvOB+-LӾƏTG;^5c=rIw !P ;H@@@@@@@@@@@@@@@@@0 Νr)!`!LOBsֹ_|х*Ya?_3gt^{5ep `'+O?}z *+ j޼&OGyąV1-oՎhE1BfaLgy,¯OZ5f̘#тk>S\r֭6~}zݾnV2fU 0AԢE .V+gE3o6We'РSNڰa -3^z)y-+Dh`5Y?+ jAaVov֭[iӦ `Ŋu|MgincdAliׯwW\9fw{nE C=AV3@@@??l-X٘CtR~`, ɲH VY`n͟?uڴiۮm۶.L^CX[1O?UrܘјgZXVf4ad+w}/[f8zrZ۷ׯ*1ۇY[8#PZj`gFG{i]vn_vieccc]e1v_M2E7ntvvm*U 2>ݓ/]_~޽Aۯ]? eeX{VؚS R7 9w.-whFһٹdϬ|Yh5 ϕLF?(2>duY P1__dU@J                 @ X vWgI- dKݲbV΂u޴ %+0gG٣mp e˖z/ JLLLޟXVf֬Ynhw-+ٻwoW Z{衇cVھ詵:}ټ\.]=q칵ΡUV;v[wǎؚ5k\ׅ VP=\XYue򏅔Y=kiӦs-;w;?"¨N=TplgU?m.l{Y9..ݵ.H%Jнޫwyf#_ys? @@@@7@Pi{x vi]jРAZY>.dnH 2O81yӧWƍ 7ca 6:l0wիW2LeÇg[o3g,\ֳ:jDb6},L(q`kzqjժ4?Ntԩ;ekV߶ ؽ?~/}QFy.8ȊZQ _0a+WF 7.XdɒZr k ,zu׹-+X ~*[أ5+6Zvm)RDSœތÂ,?~;V8oY=+eVԚ{~^vecV۷oO^ٌUjU/_ޭn-+$kmVКms)8_{n6l?Cu .k׮]<۶mZX}L~!{nꮫU @@@@r.{ljm tATaZRFda'66YfM=Z7|&+c7p[7o,hҤI.+o&;ct?o /3ƍqf6jtم͝;WeƩ[8m5p6޷o_s=z5x`|fs-=㿾?v"7ZV+ǥ^4ku_x/$Q^}f<-΂[ee; Mܯ~oe=__g+pyFi3+{aǎjӦMݗ)S&s n37TnݒA[*|)g                ТŸ,(yv糺-yfpYyFW;pJK \'̶5jf ('}L.b;+޽{K]BZhZ+ ւ,jɒ%jҤحgO_~˳;c/Y9rwzY=dj+V(&&F}IU{*HQ`%ƖXb cI%7Dǂ "RDw9Yיٙݙ}sm]pw}l'ձC9xɮQ'OݺEjkźuq uvV4̙3{*ܦ?oSNu&qU}M@@@@j ߦM{7sҪ0j(;338æLbtۜɳDzErG?7։z]~5g-?, XKy߷z=۷oHvv믿ed~-UGq}o Ҹ >L#4YMTTyYf3:ge}{EN o{WxL)13l޽{8Yz|9J酥iZt^HGޏ {yVEZYfBdyh jL&ywlذa~kTϢ+Twa=ZꜬԪha               Tƍp)wtuy˺/]ҍfh䃢Tj+(tǯWo~Sֶd*p!؁hs7Zh?SNK.M`͛k}]{/5jm/]|?~SO=ިcݻwMڃ>IK5yp𸾭onRM']c=4&D5{Xp?fpcv?Yߛoi7p۶YliLi͚5iM rzmEMt[رcVW]6&vg8tWMԺ[hy#^k@@@@B.Üs9YeX 9sK/b{YZτ{k/7$gn`a_K,)zzv/}~j kqϞ>h+\&{N{Mvl +_jm֫W/)e1cƸ<&OҨv}wOکZmW~R+O%\ճgOw嗇*OVvuWkҤ=vg|^]{4`_em޶nߗ /|z3,yl@y/^>;g,T'+z,                @S gQSxx_?Y;ާ|-H.(JaN _< hᘲ9rjJA΂/pwI?զMK5kV|׮N&_>Gm喥c۷ooGy)jȑjh"ΡCڍ74~8ӧOw!\Zr,XjOɾ.8O[n[ib+o.vM첋?;v4MxeȐ!}i;E <8{h9sN;4ꪫL9b;mԩnrEcuǪUlʕ6{hV/Zer~ZjG) Ǟ3g;e^xM~ӟmWU۶m]&+_wL?ލ( o߾fo67qڴiۣ>&ut-g]? ze,K@@@@*A@ELkv.J8k٧w='~p@"8:w\=g>'?K;Z&ܺtRzr)g?]/K[zuF@}ׅ^>'ӟ;?^z9m? gZ| 'حj'tKTxv_,9gm׿O>ɨҧ;̽.}ߺg[mU=Q#ςWϴ*ryM*u QG>5jp|tVYGygu YGBlLoql„ TgT)8$PX~g?+qB.A@@@@@@@@@@@@@@@Pž֮Tz86l5o>~~=U_~K%S ^5sEOLm_k|v>-vxL+d(tMܧI5߃>Xa;7tP5o`?.Ij"Mֲ^{C=yz4ޤI|WiO&qÆ 3+DIY?8 7i5klvW3Mz7{wkP蓂4^j_~iҤ]p.LK} m/v&|դ:\h]AX B Ae}'[-زU'?qoelwyo/}/Uƹ9    @ ⋦C=d3w xG\{=G*p*qsO>z>q~}sǻY +w[SN.,|Su~o})[YTT#O_dB 0Fsџ%|cs,!R?`RPr _y,,               Th1aگ벶P~~=p[v4U΋_?DVГZ}zomO T&d~cƌ>ۅW)\ؗ X۶mFI Gٲe{ euY| v޽5k,hzΝkݺus}h֭[n\A*~gnFS8VR墐+}޳]@.M&lQ^wg}7ф\ь\9.D[ouGnvin{=1g#"   )^-1dȐBAQZJ 4ggCcZf:»6rJ|M6~fuY@?R=ǽ:n3}ݛݏV<O\hܤ 3g=1BӴiӼ* qota'O߾/1/tꩧ`Akwe>L>K{ߣ-)k[YtݱZ:u\PI5m4i\X>{fALb^{cB<' P+Z۱'               @5P¤|}a;ݯu?N=S4XNSjIAMUa>h~@&ꫯga-/N9KaN]v=cim޼iTFJpesϵe+څӧO .|I;3//7G@@@@TV?n&;*0T]hJ͟?ڷo_0\{UիW[>}wW/翋/v{t!~}ׯ_?g}S}W{뮻ӟTR;+O*[$/Km Ai7p e\#4СCmܸq6h {Gm-쪫ov|`cƌ{:wl]tg?ڵkywةjW]u ګP>c /gHL5ey衇ѣk)8q]zO.`(7)裏^z^~e0`@63JΜ9ּyJ;/'No- 5{?1}khj;G@@@@@@@@@@@@@@JXV'.]6m϶DsQeh"X:,>*ܞI~xje| D@R h{Mꫯώ=X7A]ǎS Q+a{=V/JDgquҥbNQ@@@@|M={ډ'hr/D Q.ˊ+I&)o߿n|ҥv]weǏwAc :蠃֗@nf5j}٦pBJ橦NZ^xڵkWM4mus1vmYSfKx+W,]WYfVN2]Yp~6e{gl8*U@}޽'?nRɲ P+;p4Zm@@@@@@@@@@@@@@17&h5|ۇ\|Uk?Fd[7>ըaVC*_\xv4=   Pm>S׿ew}͝;v}w;\ܹson Xn#Ɋ,X`￿fȪ~8?    P|;teٶ^{QGe?Om۶5LE|˗/zxDӴiS/~azի|u'p {`wvi6h A-5=vX;#ϋtRov„ vG}O?ӧ/#Rࡇr3fXnRcC k@Vv              yV,J!WaU+u 2YlP(ʯ'k>_P,_oKծS'c   @y4!䎚tjΜ9֯_?;vY@ gMJ?{aÆdצM͎    C@ϊ_uS˃>h/!CBUz왏p >WQ֓O>i/Չr!رk#Fz=O4?p[f~s"%Ko~mv5\:*#/"|yׯ_oW_}]z饶>B쪨^yᄏ |jMEVv              @ذ!XbEVdc|U||lR͵Ӹ@+T[oAX[0@0unGM4ib{챇}"weiD 6q>pP&w8qnED&s=]V#%$     PV\B^z%~ge ڵ)d]w5=+qAι ,(4뭷reڴiwa"{5!ivuٵ^~ugZ-j!׮ {M!\;p5yyL|軁](a\=zΆ ;ﴋ/p w[ԩSꫯxzi;/ nvyflVVc$-vm~/}zΗZ9} Z۱'              @5paV RY,kUOZu͚6MZЫS~@@Ehǻ %,S5]Tw!ӰU"vZ>}{=裏J˴i$lׯQ:s^lwt!qXaqL[    @X![ ך4i +ZdՊlҽ{w۷{V Rxñ P%%%6sL\BԞ>}pF\vw4f}UeamX(ݺuE\qS? ?asεÇM9WW^Wmfwu-X<@;s]pT^Imƌ.<74}ޢ{~w/ ڵknF9O9;UV9:8g;]/mذavYgY__Q`}mfh|,TٳmmnW5pAF@@@@@@@@@@@@@WE`K|Qoeio}:N4Dҥn]f~Xjx`VV9N@@ Ԛ:unda5nlvyfgaQa&{35jGm9j.JVv             h͵â+av0hKf͛'T⃱6j<,   @A |WnRKMh`#_ [n T5j.]\фjքu R6{l/MZX(/Qj@Mۚ@@@@*G`ժU.h裏\mӢgݺuݻ6lVsR9Paei+=g̙3]+`C^z޽{Js}*ܹl)dk43}LKх R/]_=]QQ-#FpN:U-?ƎklҤIֺukO~bGy8qM0 D 8 䊂닏O<އ=\}s=msEm8/3ϸF?r ,eYkƌg- ҟ͹}([?o;w0Tr&P+w;D@@@@@@@@@@@@@V`ÆDf* *AY^:k>M 9XR/~b"  @$w G`" Se̛76nj׮m:t0MȸV[Z![*;v,۷o_m'ʫ+V믿ެV2gWReѤI5M06M'ׄٝ{C@@@@*W 3f0k PZ`A5n=zMEϊr͊!W`қ& їEπY/ b* QѣuԩVjeK`-('}/MҶE^?,[jժK3~؅:r]Ϟ=]ѐ!C\蒞+$а_~^{5S>{>| g}Lnžu|mʔ).DKN;d;S R iY%=O /`|ƽۅl.Я\C^u;+ظq{Q w_;C{2f]}?O^& }CbIWxjٵ ΋              @\ihQ( Kxͱ_-D@IDATݏ˖ xB6쐬   Q`ڵh@%վ%u֕U[mڴ1kkm+/-jBZaRmY&{"l…&Մj_ELĸRZ     @X| w%L=sCkqX4UVE*k=_}IKρ(EEπUF_hz K󵂴e`---Q.\QXo׽PXE/[EZcǎn"ik@{Խ)@kԩ^d{)ֿ0` R4/@4}6~^ދtv٦ȿ'L`ӧO7ދ rbaW\avf[me?Y1, *_Ph5\c+\<7w3,C|D˽!             @ h~h:l+ ˯ZPSZTEAYV@@@ h9M9o<'6`'M}E!\ͣd8hN4kliӦ֤IF_2}dOQmMķzjӄ^b%+˖-3QroTZ8UElj/ 4( 3Ӥ3kBh. 5:    S΍R_8Y^샞3蹮 n-/pֳa|8l¾VW.z6fҢµܣB{Q>,߻sJE}!{R^+>֢s{Q?UD9_vefwe5k[Fm?"| E#P+w;D@@@@@@@@@@@@@Joфɋ_PvV EX R)*~=Uea\   [$R*`KDvڇEQjRp-lŋhRȰmUXakMP6JMPYqnxИ_ad>ךR%ulG@@@@ 虨a= C3bGjYK LZzvXlyX77\֭s}uzkݻn}Ka͚5s!;p1Wa3aYp:n#('$mdݻ)\KJ䂶T}Itc x6m}g6+JQŸ-}?OzoYzcL?h׮]i`R.]\R>}wަXϮ>Q[uWRϯgUo/y*T|+gʦ{ kE^8C.zu Y(sP^/}?{kw;vX6۸^'uB\>s͞}'?1Z= Jb3]6jԨb{j{"             @5X X4!El*CZaZU^ Xe6Ϳ‚   @Q (JE }>?@ϯk20+lO>5)&S 'TM}u5?O4ڪ}Ѥh      Pv`-=Njg VχυT +\?ͤ3a= υσ`_pƍ]j 0U3w~+ˇqCP3-9Ǣ<.8}b;8{w(N Kr@ܽ ݎ=@@@@@@@@@@@@@@HJ7|]b9I6`/Y[Xc@@@@@@\?κi"w?l'lsW%t}8_v:mϴ㔵=y'ܞm۟i|}qکKÏum׾_ڞ1RS/<1a_vpZRmS-ڮەq#Tm_~x֒n ۹ltdI͏Q%>֯:٘d}' v?m/lxL%:czX|Ge(hIeE!/EeVQ2T%Slx<:o$B.(pDŴ4u\ Xb=}Z}J:_QU,jGQZ߷[Zk|Eкo{с]H Da$QVYVT̕() KJJ&kDNQڦ*zkg־}{Κ.(v["LKK/5կ?#5݆]`6`{#@YjOVv             U(b²>@KY$ !@,,6›     @94t8tv]Bq6hZ/~||Xj׏u?}2۾N|}8vc>Nv<>+8oxϏM Džm?e2&q]};:>~LWR߫W%{R:~TqZgZgOn ZgAAYsm_sR]GxݩƄxjq:}2if26՘ᘰvY|v/V_DzΙLDžN- ~_¶ |;~~LXv|Insǟl!So1cSO-sO/<'?~ӍѶ\1-_nr &1]_oQxEaN{E.-ѭE—|v"jZ}*ulUNj|o_DQ^_}K-[fZeŋe"3 Ez"c}t-6-4iS91C] ͬ[oM5O;·ãYl8Ǩ"r'P+w;D@@@@@@@@@@@@@< [kyT²!Z \Z0kެCD R[ŷ[NLXO@@@(+>P$٘tےʳox|uMZsL?N|M]126]CuɎil/cמ~kMwd}ׯcxdu|Yj@|j}|d}~ڞ8/^';ƄjLo=^.}u|֙OԹŏߞjۓT~\oOV\m DŽLk\?lpo:׷mK֗x_Xdʴ/ql\.}eS^[xL|_Th ӵmK)IK  @uG}g7}՗23'1Ӧfl(nk֣Gl[UT?49Ң $2R&M]sxmW_}s|cUZ{"             @ R&;7QkRT/Xɑ7yse-aY RQo+,AMB@@(L0C!#>hD/lKJJJCv~u}ml1R9>3=oc$ۖk_x=#~%~k׾ש^~~Tu Oo^&Ňu?A|^Qm fzLjL.ɱL7>6#T}>Sqv~[6ב׻?3uߎkǭuYjnk_b70ԭ[TիJ7[WvA`ZƍKkT~{86U;~TRϕju9_xN_|[X@@@@@rVLk͚eʌf*%CqLZ}Ci3ʹVRy.wƌ1;;?g*^}N;YΝ'(ʝZݎ=@@@@@@@@@@@@@@ X<1ى,f͙hZT8\ml-F_@@h2_]epL|c|}~Sm}:/U;>lLJuN66Y_ż>HÇh=v}ߏz6cSXǦ~d}?R?x|l|>?>^kg_8|+Lj_W;@OQ (@j͚5eե߷+bhS]G.B:4l06퓏ZrY\?     .p'$µf~[ެ^=޽- ټ io1=6;0nJ|ok),{N:$:ujZ|jnǞ             T{kXf(4j+0kM MmU-ei@@P0NIIIi}att\VFCRKCY븩$ ]X* l-k\~mSfɦ:uaۏי_1q7~p=l;g|\d}-vm_1avT@<U"UK,qYuc^@xv+J     @2}?WZ|`6y٤I5l`]w5sOΝbx#߹Fc)+:+S`ٲe֫W/;蠃[nSs  P+wXrcO@@@@@@@@@@@@@^ ־;"Q˼yM̟ƍͶ:Ut괩hE'@@|B|QPv.>ڇ嫎?zY}lfN7.MO1- G ɤd;>1u l{Eup{ DŽר%ݸp?ߎ/k=7VLa@P`.<ʇJUF`?`2 $ v{˖-~\>      P0.¶6fCf[lQ0̅d(bovffQ`Y۶̰!p]we|iӦFsuIr ݎ=@@@@@@@@@@@@@( 2337/ MY%}.f*;'jſ-D(B }Гml';Fy|`Rcږi|\uP[gspl؎_C-?WzxTO[yqj  XP)_WFղelʕ9Fݺu-p|KU-L      @ ZzU32[Ƭ_?3;`!C,G]GίK/tR"(_21"h)0m4qm̘16r j$2b              +Ь3>$Q͛uj֭ۦzmmf5iRǕ!G@J8ޗp=l po:X=:Xm j{H6>>/',ll4QA %>>'ذdt}Ƃ  PmV2ErxU>cdhܬ^q.,1;t7;,6kР:1ValoGy|,bNVZ۱'             *5llGzD+ߣGtnfU@\`ҺuJC| bʤ±}x'=ݺfߧ_dC:l+()Ϗ -k=o/Ɏu@@+R@ŋZ/6p*ogXGZ*K      @ ď?ncfǛicvfovZ'{15lx[<;c6pv.6Z}m%P+@@@@@@@@@@@@@k? Q>l436l0k({4EZAZ-[VsJ_a}ԯcǷuv=Wjժhj  @A>JueVT[VG,PH-[= \     _fQ6M/ivfԠ˝1쨣>;h5k.[zexvm5ޣ+JVv             @ld3:5?آMͶ>Q1;QƢ}jU @'MptEPɶaۇYucU'kɶ2{Y]NaQSa6m?:~=]n˴q\,   PxTeZ-YJJJڵko`UYU> ҵ      T}7YL٪Uf?Yg_}:fgmv-fUWթS{I%p]weGm۶_j{"             ³&LHAZs&vۙ뷩kֹ3YY3eM⓮+\%k'7uRpS]QxSߖֶp{|]}겶kdyyp@@*U@WR]߹*jVR@-ZD1]@@@@@@P=xavf{أlHw7ڴsr2e6f̘u^xj'@V/)Z۱'             )4Ifo(Ǜ}E4f;`?~5i'(ըQCfa龎5Ʒ}zXY+ OoNֶvߗVTm_uZ%S#  @5sF}ٲe.T8[fJueVT[V eA@@@@@@& <嗛g^f\c6p`M){;̬N2ӧ0*<0lҤk|/|7Z4|#w;D@@@@@@@@@@@@@T`Z3fE5^ҬkWF64Ȭ&.ݍ"n:[!^~Vox >M(MK8zا4޺uL=L\%gl_=#  P` ϩrU<*wdWjժUiU12޼y(P#2e aZ!Pkc@@@@@@@@@@@@@@&0mٳϚ=ٸqfQg6t{ b5MU@W˗/OZVXUNjQ ^~}FFҸqҶS ԓ??51ڵkgt} B@@' ++JҹrYr Ia_N]V        ㏛w٬Yf]dvfe7*Z`ZSN1>1cN?+K`Zv.2~WYl0֭+8_U (jɒ%t[lZMܮiQ5id+ߧ_Tm`4/@@&*ߓrY€x;UM6u\?       "^w嗛mٽW(WuH \/N]z)&.amlƍoZ:u4j)cS2@@@@@@@@@@@@@/fwmCf  bvfd֫W)zM&pBW;eѢExbSZEAZ+VHzYfּysW[oښ]}E!YaY JJM'  /XRjWf|5!SK-@*=ȏ qY@@@@@@@'}l~fv fbvf眓sp \tٖ[i6o?aQSU'&Ol&M"L^\/9e-"1.@@@@@@@@@@@@@,]j&GqǙf;[֭_joKQ2/_%iVZY˖-KkUZhokBwKz6;&+   Py;*N_+jÆ Yx`@*+@+תU+g@@@@@@@^kCM|i⻏zO=evQflvf|U^O?g~sT{/Xfb6thݼ Zy`             .+_bv͉h|fj֣GY~MF?g/\5k͞=}W6w\qFwÍ7j{k׮]iiӦm֭֕[U(HI&@@@+& 5J>*)OXg`UIoZN       TWM yN ʣ@a|Т:TEpʜ˖.]j&Ltv*.rݎ=@@@@@@@@@@@@@f7`vef?tYR%%%G{g|k'6sL[vS/;wCNV[ٖ[ni[l+;v:XӦM9%  +> LUVsZVl0* RO^}լgJNRwl=~ج^CP&Lvͮ=zt\PYj.MVv             P >l:v(ɬGjpSEx /qY?Omذa6h k޼y   P^Ґ|RAW Zn]ַXC6lXnVM65]         @ >ll749#0Ə71l߬v:-{Ⱥvj=ժU~w8Op5ׄgy&BvOo,=jI&>yMo x;ꫯ> AYW]uUկ~?7a6 r}s3 g' =}܏=#,#D|ᡇq ,sp'z7=\׿?»r˅~o^#8"<CY@|_p+C?Xe7cB;,a-[g?وUTO_G$-oޛy.Ф|ߘE2]#NO~ңm/})b |72Y#<up}7 ՟'ưRKM :g1o-=hzmWO6xc۶MHWl馑Ud?]|hi\rI/9Ƶ:a~> ۔M{/j^7?я'';t2zx9rgSwyg8sË/^z>8װa?묳s9",O?iE]N fȝO9yq'3?F\ ~,>Dyi;'#P=s6󨴼3U5M$߯}keqI>f}7R]<笳 ; @;N/%X"e{r;wqG4i첋,Vկ '󂶺0;by,JY=|9OYhRWEv]=裓)Eef~φ{.MoVQy2~?[GiXl4ǘxi3K+_(QGϰg#4~ݑumfXsDtt7y˚v);c8sG矇UMs<>M^R6Nunz_nԧO14-ϱZѷyV[ǝ9U~ٴpo鳉{ O'ݢok_8'k>E]?{ۺj'm?yDmiݏ=ѥ'10@xhZW9hvQ7F<Dz<6;l!yú[jH'm&Lptެ]y4w/l]N:.T/A|IJyFĽ|>wM\Yރ5mꄦ6_E8mt2sNxh㏟l̫{V=_,84呟Qw'qC{A.|S R~˸Sη>W2.߭2xOV#m5sݷMǧ6`[UN-?C+|_sw+g3PA\f*2s[i2r!fm7Ôa&eDY"& A̜?df&3gTslF3b_3G9'q3L/9UF))9f\-'>؜j*m|d/_B̠b[s뭷^f9n?o}fNI238sFFfTzri!}"!9w3뒸kFv衇F ^oJ23ČdViC.3Svf0"A[,tύ7<0#(ųt,}~Х͛1lmD]o2b?eFϘQwckȟESܺ?3t3*9mߌ/>D4Xz_o6t9zz7o}[9ljgW1{[ 3=#?ڦݦKN|ӿ̮7Ρv}Of9;uaNb6U9kտ9Ȯ(7ceg~`IbNO3u"c ^1 mKf'3lqdzyzez[e _H'_!d7Ѝw`O sNf+R@IDAT"r؍5h1>sLsNj.[or#ܐ:8 O;r6[|۪GV[5zgeFƌ_  9Oq,q#}Qw~+@sc^_z ';@$<(m99I'3}cnд/p/v~oìtLl:=ϫ?m3ηAўiM樦ތ9NC68xk7m!m R6&ږk;ȏ;et׾WBgm9EAkOq_b?b~:.ws0h[;k;>jE^ӺIeս *ҟ.kEڶ ׺m eb4Y}RL|/{B1嫚a׺ɏie:XVx]6:~Mm,[wp8˲u, GYk7^ۙ]^gP7p!5$6 %uu0iQ6 ΥviYgxμ@{v1]7P/CUHo;s\'kk1Dpy Po^ԁF9+yh+h'8H>fx?NaÃ;NNN3vuxK.  rx8aybG7O0nlGqDzjQNwF;Vps5H2o馽c5t W.:KC~dNF._p{eA;[.2N`Xe7wjimy6M C a:JQ53Zр:N0uppL1K =Coګ Bvj䥗^::clrVO?}-mzsVO:8bZwuC lFY%/Dg\I$@6GHYq(Vnfcf69 ʇ3qAd?v^2o3fC3gyRepC['蠅c5ёm°m=:>N7)@_vD:Ejo[7u.wU7kK(钿z<*]7]7KY=4}&>Hsk]̶}v4}t.cUg mƫ.2)mRoq6߲^Kf_RLܿ78)ZW,J(ep)-9βl)2J}k X0mC?+4C`BC8lοF ICՋoNzcinj{3=DrE馛.qޱ׾a9 氣w,1' C'tR0cO@}3N~wc=3C(qߌ협R&esiG<_b7 oӓ$ ;e3[P9D:ceoIw݀,f #|~sK8&kk%1xY<;M?=8O9> .lُL$QͰksle4љpYgs:>Ϧ)όr7d-9؊Ü}xu^?זmm f2|3_b,9 wuWz:ӝ /ғ]Bml+/xXc5R'Gv!0&T\յAG.,%㠸ob(f$Q˸Ͽ~7ĭL|o{o:*< nzOW38G||nӴÌD3ө f.p3N=`F9eϘӊO}*1Ȁ9df,-3_~^-yV/0ߠ^L=B [,w}h[/l1m3 ̑V, '(#@9ɃN:al Ua{b9ye0"G?Q07Ŵݜ 3jb-7g^1_3pv=O{k9 f.wy>qesaNU3`7sdIf0aE:i7|7bl&}mu#y-16FжӐu皖'At͙MDüԜR>m;ށ3.Y/zBP^>bf>0z#L܃qbg,=}+_Qgܗ39S<ޖPs|[zm;zN6:9{(qu p5FR#oϓ3<tJ`-oydy#~;?r 7#9:{gk-ϯ;9 ʛ<C?p|Ɠ (v68"\~UeH~񚭷޺*5yM/A|f0d!Ӎ7VYedEg8|~+qᏀSօ\0iKϵe6:!ML#8![Rַ |m:r/}K6ָa%1Оq"1!m[~,֝O~ӟF$78t* 8y`\կ~`0'P?w/A Np㿓O>9:ocq p`3uY'ozӛw]?iwʝ1*E\ r׊+D#8kO ƣpT<}qFХ*"n1 k\>o9~>2?+c*駟8@nȈ 1 Y\!'Fޤ^{E'8bcu{@ VVphk q`/Fh6@=ث({Eq;fV\#+2Ι0t]mչXEOz~Vϧz*:(ҏ{wzv~B¸6#vX##;/ܱWjlueVsè+d/.b&.ܟ1n5 E_*:7H^M. auWrǙR>88*tAb38#s0KCQsܻe{C|iUW:EMoi)뱢~FZ]yd쮛p޷ xh7]!^"6~mѹ~SA0/WQ(*/:צty6UߺMSLEm=qftUVvfrLc\Ptr6ؘZ_Usi)ޤrDƪ2T++_z<_6m0/yFSuQՅ~5sM{]hn~Ϥ>ϧwU:W(;w'~l[Tc ^MِFgJ"EcEsI?WV}yfEX[~~jS^Qzg. D9Yc7 $<)AR/ E#mysM~;3ߖE:ch:^yU[ŷUq9WS3zK#?g{[#͚hkXӴZk5g5uìf2o?y9k_8fԇ>5/YF!ᓟd<~9sO?IfӲuia+e[_ͺ`ksZ;ߤΗ0q[nV΀<-yS|0aBtL?S" a-狜bX0묳F&G? :PmA,ɏn0(8fk`|99iF`A3+¶nǑg8zqlI;CL ǔD rG??s1mUa\29>#i{:o!'c6-k1C* Xq|vpf%$ι^{= N\o《:#} g0ZtE{N[!?ƕ} j/mK6MXP';eyz}1K~Utэ|?qGT鑦Is]W=;2}+_Ė9b-볩LUm,#Q . Ɓs/?O«^#=֕d۶}/d/c8JQeC8#. MJB֦s\c/hq}Jp's)Ԋs ;{Iۓεpsމ_ѴP~uk[꒹y(msmXo7]!M(cCer<&}ϳ 7'|22g$ j sM9?ARe2SWME9tSeey<f{W'{:lӴͣkú2]4tjLu&_]G}|j>k(KQ`^{0~tSWSyHRwa) C9{(ݖXϗM_~ufT&S/=nWU=ױ9ׇʟʓoÐg.qCa"0g. +m \mU.=ה L۲xaqmҷRf.osÚz^鶉l* fY=W7)Wz /M~StOݤ.Tߪs]4ϧݶM]ms:^H?ȲͿkMM uVŪs\&ytjY&:<[*x?SYɣn[ K\uU.g B"Y֙u`<\+ukzZ\GNYK:^:pҬ 'kxq~OqhYk9_N2˄pÇp92WZ;_Wg\vpνA9ތc^z@jy؇?Fjo~Έ4#` qD@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`'Y6Yv#jm*3V^07[h2,"Zkasos@o@7^cF{Cx>^z[n[8?#9̩RfB߳9#3c#x}>׿f93'q ef53/GSNԎ}#ə y$3,Q6sL5"w97#uf.f"GKЦh_QyܲmN}sϛ[L~_v{5Cb1q<1,8gyfz8ό 7]Wv1}$s9C`N?zyokf)71jW`5\33g?.ˆ-ǽ^?fp-)t`'E˂9ʨ˲@IVEd#_m> d{l}2G#MR]ۊ9se0E(YO@J0+,߲Uu5^?Ug,3=ooEfc|}^<.2G}=mM 95N1zFwsP6s Sеﵙ¡j.2a6%tz]m[;7a[7.Ş t 33.&2yZl+R1gzt s=3R=wx6<{5Y;EU+u_Mٯ⊘yx-1<ᾬ*vu&8,nr5am8M&}gn ?I;t^`@33,B F^/=V~";GYtr#>'my`{!:hOW]uU>Vi'nQ]1;]7A:kʰM=!񦺿kՍ/KN$.uS삲 6kҲ~Uڟme;]oR֪+,=4}&>H/]:|h>bv @N2Vu}@y+tkU_2{?Y\e2Ӱ*J#8p78<99X;Fhƹl 9ϊҵd.bd<51?fosՋEL2<[? YL?Ih*3R[;ߤήtyɞՃ3Z;?:c&Z "X2f$4ɏh۔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`'p)!3Ol3w<0iҤ`έ5E0#, sDyM}DqpOF@:H9KۜdA63^Z=\w܈˩/s=7aGsdXI8C=^x^>d#^f{[om1>u`ms.c@f|23P}3ᩧ fwM2}zjbe9ȟ }`ƕ{NV>Lys:k0'l3zuG)ݦwi+x0t#<_waW_̐^w!9裏zh0 3un>3̘_0FaVf$+0NX;3nD̡U؜D=iVoy0C$aŌ3lck"q 370s̹Y`1'V͛Ǹ"O?=h]3n9 f"?O̗m]%l' !Ag Bg(7?3T9<(Y41iPeRmdvi&?оi{2]̢un$OsƼ߶٤kS.F5ՉmMh}?6.W6m_ʞۖAl]nL]w)KU^]~:4}S%εyP7^ B6:N~mj?m)\` %WY3!)dş_|qzp]]+֌q.[:-2e Y g}v>`>5'}; 8 )|l_Cpgay W\ Qpng`(SFm *2NrWLU NN:):OIༀ z׻▴agON`1=G|?L3:Ǹ9~0MG_:Mm|)h8b8lpŵm }E2!W}„ .2F;Pk|7ƕi"]Ry8X0XLfWXaՅa,of&Ɏ>9"ퟱzp 'Ĺo:f6I8mK-T8cя~ǻ믿>,.㧏]vQf)2_@73N'>V1b0Ԋ4Зq\x= ~{8y0A8XveC::EL<|*.k[WUMu/skg7G>+#qG+MoY|sr3 qsEѦ4i2=^O0y/͋!:' Qs߀AnCI] 7Mx풿_n˞ۦq$2o˱&UilwUeg Ui B6:J4~.pu3.9J+;U!]M&k=u88qb[eUGK/kYں̬{)qm٦WueilIwI `8b-zk}=W]FZocΐlGN׮폑j66۬&N4%0}ӈ'" " " " " " " " " " " " " " " " " " " " " " " " " " 5ׄ#L^>! Rcix3_[pC7(xpB[PocR>7!aPɝ,2D[\8Rw{<:`£>P/?h2apA61Z=q .`PWa2v M\s[~p%K`j ˦D bp*F?Ltp 7ܐ?ӟ4?љ?X`q_(Y%6ʳ>=yOLcEş'S8袋97xoIH{4-"`n֋%HG68~Cm ѰřS0HQKgNlAtM! 3<gx ZS]:3G,HoȈ! qˏnǰ~D;!;3:pi㴉>.׾ep ؁c #|5.,\x:`P _B8ꨣ¹)pʿЙcyYg7EDF 5Fi/0op0ʮvYzi0ޥ7tUGX #܁-^z[Ϙ$&m(p^CÆ|ene^,D ;c?heaeNSǨ^{28r8]/0G }H! ꪮlo[WuuƺN&sk|S-*ku鍵"p߳;{7VD&hfK&q=JmCټxeg 8rme,?VMyHQ5i7EץrDyÚuU}{cWM=W^e x`ϠD[AUU+A|]|:Swzu/1uJW6uYCz~9JQu`]hQ^@ooSMW.xwRWc TϹ:UiK<0߭yԍ#k]_}ϙ~?jꫯ{׈.ԧ+kYo=̵KDJEkUgO`8c0N1O77\shcK,D [0 ?0 wC?C~=aXa聾Dއ~xם8ۃ?8좭7NSi_Ԭf>e=`䎾=M;pmXs$ώ.RV{g/B>b }L8ZlŢ#D 9ի_(e+vYM:jĉٯ%NUZ_@Ȑ]k̚}ꩧ܍bI;f?/KUH&;Ml9>sEwI9+:VFvu@A %2gzmcfem2]/#}5̧.$/o]fqσ;`\e&?Ͼs9"l7l#8OeYzG=ށN_^;(u8o]h~?+.+0rm)SًNYͭ;Z}i]ֲ:M}~_=vq=t['S}?w~- s;_?:Uwm3!/+P6qTñ0NxvF7V͋-yqij w6x!xi7]!0(MݤֵCO?= ?p[~O1Fqꪫ *kWo{ۂĩ g:!v)(~AJ+^ׇ-2IvI'?H2]tQ4o|#| [mU85?8SKŨ'EdM d)Ng8Xq >x9F=$w衇7=C/>h<|pwI;hoK9]`Im򗿌gZwc]-ᔉ~8*(;#o1/˕fOq|ɞ3)skFtE '995Ζ08iҤpc ޟqϻ;pVpq4⋇_?-7a#38cl; :δ$ &&Lq>>Gyf Xw Ĺ! 8 F28 r{=B8B_<0N_>$ҟfgy&R_:G|8"1Mq"d!ip>Zh9 P"}X曶9#7 ?XMrӦzFК cXkTOVz'kv^y뉶uK?bAO9t.Џ,uj: sɩݪyq-?OLyw|j*W<^ݖ:/jow 3ڲٵP]W=Cmmy4 m浼bw޹wss9'&Y: o[axh2vzĮu; /sm9ڶ -]wm۾[٦󭗨 4 y~Mcc1m_3Nֽiʖx]ƪ.ڌW]djSӥަkΨUc_krW]uU\yO`-㭷Rkr>]&k`!7/NϺ4C gyi%,!mN[G[ZEuF ^_XZoc9眍Sv5XET0 T=`%~"o̠wfN23-R٧>>Uf.6c}<>Og3/} 8fF23|3".i™9ۇڙ9阡M3-1-?f33.?֜dd%ʈ\'3s̜E[o즛n]kNp29uxvz_rf332Y$,y7",!OOV=3Cx8d%3I\slL(9qHw6?9q̜MĺeaN򇳃:(Cn6cՙ97̐vf2s^ֻΌ7z9͑Rf 23pKwPH96\cܲm&;coi헕f83ŹDl ȋp饗f-3T=f83GP9JfzaKf;oFܴLw']_ҡ~h30B>g>툾eƙ}73Gb>i/oy[2s>8̜6G{y9e#m8'R}V9؊L\**T՟_g5\3Ĝef%3cG1B5)3ru׍ `뮻flˣrȐzc &LPEf.m4e- mˏ>7gO=^;3CiES&,sK/-XvWQc{N]fhq`uԳ9r̸[>e5zӣQOG3i(ӴWih|[ }mvi{e <[3e3'Q3p[o,Mʙelse^̱ܵZ# s!W3[?ێv+i7i?,nCmU:#vq:M# =DzM}k|,G9/4AW< M8mZWUvd^ey*ʼ 059K:ILÞW72ۦ5m G4S_amg<~- U}j1~ѦNvMtrZ_MywyVW>lS#vメ9s]{Agö).:Nr7vz5[m;0>y6ޥϵϽe[m rgO-ϚxXH{s>g>6}0m6^T3]Kmi9دv^kswIHf/GdVGrq[yރt{vN<묳z),FZf߯jiz߶M|ɣ٤۱2cEy1m]̦zxrg#%[;3nU/3$ _˜5Mni㏏~Sg$Vv:;{}{ɬ"Y[37ݖ~ɔL/ahPön<`V; @{Sj\s^̘]0NEޟ\z<}Mރ96Yt܏s~ 9f s87/awq6fEs6٠ /$#c`*2CQ~/z`NnZd6CUd7IK:k" ´K`q꯶zrd CsZo H3K05հB:;)3ֽG`JeO!tSmmMyXOyƺ;|61VN~.Ad]bjC1oҘRǚPW׷Ytۤ6MkKϼ۲A/ƻz>Z|x?561'ޅ5 zNs><_Sky-@|/D.\<$8F'zJ ?Δja)ō9VjcU~uL^N]ڱVo4Za&N-lþ`z,f:~8Ɠ9W62.;/Fnlӿy䑸fH~׉{~N꫇p!rLUkkQBխo[gW]uU0aB8C?}oU "P)9*E" " " " " " " " " " " " " " " " " " " " " " " " " " SC?-+ϒK.6ppaE!8S.n喰RK )n;J|\7>`xf/CCTzYgU.8]mi9K,~_[lp+yƪ {ox;{gk~p7g}-'a9C4)dE[UTWOS׿BXtjqcUG.bC# 38#|C º;@1曯Dr4Bx~. $g'0,M'Bl=æ,c9y'/7<zMSeWaE`,CP AD@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`(Pk(X>>w1 CSZ>b]]nׇv:q 9$ÙkO?fM!)LPkڮ^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@jr5~gZyV\qHr !!TPisJI~iȢc ַ¶n;~95HD@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` !գ 6 vm_ ~Ùg9@K_\s-/T1G`]L3]>5cN襗^ ;c8Yg%gZ]OrP+D?E@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@oKq]x;7>.L0!$!<`W\1=6ȣ>V]up7k&L0aj+#㒀jj" " " " " " " " " " " " " " " " " " " " " " " " " " U>C8v5!,d[u΍U+r;g%W_=Vŕ\" " " " " " " " " " " " " " " " " " " " "0. ly³ON aCX~&@}^r9y&CXnlTnְˆo{p"0LYOKV("p9!qDSZcBi^>~!,ho<. lA8#NU&%X#0!}d̘1pKs"ٳ\)ֽo' rR@@@@@@@@@@@@@,Paôu´Ҥ)]'p~(Z̝;W,Yb >.˗N:m1!          @0-[Cz)WnbvL <]DzKsokN,ҿ/_65{,^0tK P+\J:            $nܹE{N$YDj%SxGe2uTٴi*Uʺ}% @@@@@@@@@@(cGؓ9"N\.ҡ޽a%"ˋ)#7 O{7l?תU~˗ ?PW'p#             H~[$IԫH0Q7ˮ]d̘1n:y衇]v&l+QU@@@@@@@@@@b%ZZw:ݻ_K.-K".n"PȹsbIFȾxʕ+ҧOiРT:ú4ix E  PI@@@@@@@@@@@@@.PH"ɒ]wI$]ݻeڴiJJaÆ2|~$=@@@@@@@@@@@tX5"HƑ2Et ǭ@"G\soNu|RT)9s}zL-Z̜9SfϞmVZzuςՉ#FKBoBXEp%իwLy\?wgu{@۳w]3nt]}?         _@k5uvKG4k] i=7🵶:rZ̙3[)"4`L1cFSc߯ʕ+7ސ 6ĺ?N˺urͦU~aTT\,5LKGN>|X9bdrlMɟuu5'9]jݬl2s/ٵN,Y`ܹsՉv!b>j܎=@@@@@@@@@@@@@,}Y,t0K}f & tPu r>Fڡ7"mwYvuu 긆ء;ᗺvك]>KV#0 =Iۤ;:`8Գf-[63X[!!!2g;w:tHr)͛77sFU+ڴic¹tW_}%{v(WTtY]g}G{!ZD4; Ȗ~]>{#Z1}]g}]vl 4(L?ݤ >}]ٳP.wb         x_@O8!'O XrJ# ?Oj+uɒ%s5K(pKk]ZG[h`/<qi_ks%zss5*C\deuCMiޓz_:o40̙3r1ƥ}5`\rVh[y Q@_UbnǞ             @YgتA9]' ßt0 2d0!P:\g[9ޞSHo5Ӂ:^]?`Ad:X.5u@9rRkN TwK|sN5|ٸq,^^=i֬ 5PI t ZjĉPBqm??Y\'8׿RCG!}^@` t>v@^ IC(G*ϛ7Փ @@@@@@@@@Кˁ|A9|9rG:SZǧ5}Z#5ծK / i^Z5uZQ]:ړ%(PԿj lbŤxfYpadoٳgϞr%_}+6AkwYvhֆ LݷU^hiVժUE\uիW˚5krϞ=ٲe3AVj`z ,h´tteՠg=ӧsݻMXnݺRN @V̯"Z1cO@@@@@@@@@@@@@ ܻwT{Pc̠T]ڛ7o:A޺ ޤAM:Vs4GC|';:0]g 6;{3LA~K ':3sdu^k 5Yx,ZH~W? ФI3ׯ_m۶M*T:X_>}ys?CGݠlIs}5Ig;uG+A\;^jIC}}u_ž}jh%         (Puv2?@t\:EkPjdbzsY`$&]4xLC4L'URJC=$T|yl?Z;ٻwo3g.vUV2k,ehرC߿/EZjYJ.X_3Ν;Ek+Ud4J*8ݦMi־բE iٲԫW#Z1b3;s;D@@@@@@@@@@@@Zݻ8:Yg{``^'(Kb-K _ʝ;hKbiTא4:AIn2GAzu?u]sʔ)=<+ " ںuyt}4izytO9?qD -طo߿?̬LNiӦ5Ak:(]\g}7h?[@;@h h(QB/=X"        W[ٸq @)C RLO:k=Y")z+W:ս{:C4Lٵ1UT&\r&I4p+6ƍ}G͘1|'-ZKڵ!Z9rqM0AM&$u͛77Te 5 d`L@IDATnZv*ueLC|@۱'             wܑ={:XZ:T' Ҁ J:XPB'OX :cav`C{G=tislLɒ%͏`uҥKP7 xYYd Ґ-a;*টuzPP:c/_^hW&u8q KɦM̬}?hPNz:k .轥sN-  ga;y@@@@@@@@@Sdҥf^r?xڵKt`ߺu>|؄hP^lٲٻV#O'$Iϥ}W֯_o~4@\bdih)S&OOvx$>;v0͛Ҿ( e=:.!          QҚ˂ L]T׬Yӄ0իWkRgرcfYb,[lO^}QiѢ˗Ok>dz܎;p&OmY<|3FF_^zI̙y~m͛7eĉ2dٿmV,Ek;8剒mrZ@@@@@@@@@@@@@Ǐ7~׮]+!!!&Dϟ_*WlrWTI4$'k֬~o'D pM6?C8`BtrڵVZfYdIO`/wߕ(,AAAAfk^jLhsiVdMX"W?k߾}0H}ܹsG#u58IR6N         p^m2c 5k9sF)"͚5ԪJ*t/"͓~YW5I$wz$5'Nh۸Hã48O?i/ݺuɓeC̙#?Sz- 0c@%@VobnǞ             @Y-[&+V0zu 5jH͚52{:;#/_ Y~[|ur #<"5 uSz&MҥKAS6ݾ}[t@|ҤIhUZU7nlhN@4ݸqhXyEɝ;y{9G<2#        $6]vĉerIXi̥JJlׯ_;veuVs SJ2ܸqCVQCIpMikb³4,ߖ^{j{]ݓǛP1bk.y#@VhAV@@@@@@@@@@@@PEŋeӦMvkժ%חzꙐɓ$@<A:p}ժUҥKRdIiڴ̬*UHͥe˖R|ډ         c J駟dȑƲXbҩS'رg&n߾- .)S4i3<#m۶5N{ 6yiРAi_/|-e˖5[7n,k6ZQ HlذA.]* K>4kLZnmRJ :$ӧO3g͛%w&TH6l(ҥKSk֬1A ,KѢE]v *T`o@@@@@@@@@  \xф >\C֭jt.\ &MѣG޽{M-կ_?gΜ1ӻw;w6._\u&I&5jK]X@_<bnǞ             @?۠AiժhB (~|"笑 .y晀-ЬZ:uFIpppfzy7vZ)\ >VZUuh<={ ۺu |g͏Bȑ#6f_@@@@@@@@@x p%eС2eJy嗥W^-[xz(C-[&C ŋK:u>0uFvlٲEZl)SsJɒ%]s4Ξ=kjtʔ)ҼyhͦxO@[s;D@@@@@@@@@@@@\|Y&M$G;wJݺuCҦMp<v̟?_MfΝ[wnf&}/1¼'RHa:v(ժUOݠM`Ϟ=2uT8q:uJڶm+}1?jFp"@@@@@@@@@ܽ{WF)ɓ˿/ѣJ/$ W@ $f͒f͚ɗ_~PU֭MJ5d!C{1ԳPy饗dܸqv[u0!ob.NV@@@@@@@@@@@@0GCرc%cƌ&K.RP!@'O1cȁ駟~Ixjڵ2x`A{/nZ4T ,]TF%͓ʕ+;#Z         -i&}Jԩ4. lذR^𶸜o.Z_ܠAK _7ߔ!CȜ9sy8D B"(`@@@@@@@@@@@@@Ǐ={JbDՎ?^>,$L˭+@l$ڵ˄S]tI~aNcǎ{oٲE4i"חL2ʕ+MaZ> V 88իKe޽&0~{UVիWѣe틣ֈ?^Zh!+ViӦyWA_|tok :u             @nݒi߿_,Y"!!!Ү];I4i p6l(͓[JdL?/.\NkW^rʒ%Kٽ{㏦q8@<(T :T:$u֕͛8vX<G@@@@@@@@kפe˖2x`;v̞=[͛K.cɞ=]`ۡ'Ԡ`9sH"NڐN:bSݾ}{}vb2}D /!@@@@@@@@@@@@@ _^J.-SL~IV\) 4g8+Wg}&M6ݻ@5kF#x|UV\ɒ%ދ@xj`ݯ*_~yy?^         @uիWᅲ:HnzmdY<}t@{8!P@@@@@@@@@@@@@o߾2p@1c|ג*U*&ߗ;v֭[E?{:v2k,xOe„ r ֱ}cGl]N:%'z֭[СC7ߔ /_|Q2d ~m>Z@@@@@@@@@@@@OdرtRiժUT$IȁDjU"S=zHɒ%E?GgZ| X>nc{چAɓ' ĩrbBw&1B & ,-Z|CXW6l( E+|t"˗IcE*V(W6Ͽa2!        c2i$ɗ/_`5˭)Qǣӝܭ`ָ۷I& E:Ğ={Fq,0a9Ο?,w0`hG}d6m*|k7)S֖O8QkX7=8,RA@@@@@@@@@@@@@p7oVW۸3cƌ>}8k@| ؎N0ѣGcǎ> =t=} e2uTȑ#ү_?2dԯ_g΁y?ObŊD5]?A>E=QcUѢEsAwz@@@@@@@@@G`ҦMiԨQ4ʇ-~]ퟻu>l!C9LAAA2|pYv,[g;~ZJ|I#޽{2fɕ+4k=z#Gtu?yl۶[8 胎sH@@@@@@@@@@@@@ 7oޔ ɓe̙7m$?MVq5j۷Ou&;w6]y䩧2߹~3CRn]yΜ9_%+Vz֭3ڵmʧ~*[n5~Wf͚r7o̘1Ck4i,]Tr-\rf\RƎ+~XΟ?/:uΞ=x / -Z?S4h gϞ5}:u[TbvM_[,`͚5Φy{99t|WzozO9:t1L.t\_IЇ *K/d'}1}RX1s=?n2? =>_/yܵW\f2KpҲeKiҤI|gfݻK޼y?6Gp'Jʔ)M40MC^}U3p8D1z7|Sٳ *d?B=;)Gg_],YX 4HraZϟ۾;vÆ Mȑ#Mh}/jhP,YLV=:ԨQSߟ9sƄ?!!r ۶mIԩS{''x?RjUYxhGSLҥK>;&_\ׯ7M ;QVZI%g)w;`F>}Di7! ak֬=jb֬Y[NQ֥$aQ?>[<#Cw~=j/.իE֘@@@@@@@@@^@CRL !w=mMֈjЏM;OT4_7.].urWnݪUL4hk3UTw5Q>6Z;fٱcGSn361p'W}5:tH˗마]-Zmڴ_xf=-:Nrz`3s {XqE5u8 "w&@@@@@@@@@@@@@7V(専|@ӶPӐPǵk̺#Fu_k֬16m\g94i<5Pa8V@ 18`;v(Yc֬Y;uK$j2QQF9E 53~;7f .wv^:퇞W^; . MsOޑ:uj:k gӦMff8V_sț7#iҤG:ic9.\;V0{}0"7ks]t>XAUfkPutv붷o6m~^}~Wm>@0cơXb tXaT/2}}N>+ϴ^JOq+V0}ʝ;͛Ǐ[ϐC xg̺aÆ9Y?2`Ͼ'g=8֏X8#GNWxrm=}nj={Lo         /_8w9rԡ 4f͚9?{aڵ=޽{f+XʬsvWnʕ+;jrܿo߾}6R붵)QZ/Q#]toRӦMS}I={z3tPs?ZWf3Im#FGZ={>irw7n|خк޽{0@g:^LHj@@@@@@@@@@@@@dʔɬD|RHR2˗OҤIc>?CfyY綵kזˋ:%V@(P@Ǝ+V( [nI՝k^Z,ڵ 6$3f̐ƍ;+Jb8_~])"/_v*Tpޓ֭[eԩ 4p~ne˖5+u-[JŊ9|e 071K+TzdɒI߾}7+hGKМmW^ٳgKƌ#88\w+hy~~ٛB0/.\ac},_12}tA g;ԩc;VܹS:?gkphB\weϘ>VxcOGث +4}ϰk>ߞʔ)#˗/7ؓkn:ޣ9ri?x_@@@@@@@@V\r͏iMJ*THX?CSh͞ꤟu:qY ήZCŋKeĉSk=bR˨&ZmնĦ~ӓxsG^դuZɓzvYx'hf]f=֚{{Ǎ=h=ihhY'O _oc?xW1{L            $Y͋I$v⋢Nnj#Nm۶IͶ4K{} i*ܾ}خU}`7=ٳGof}i_.]$w6(\ps`r{@~SO_nvov[}uwl$HB/3gu"EHڴieƌefg}V;\>5~LR}u6m3<#.\yuɓ'^wH*{m?In߾ݜժU2}^}ǹ1t}z}cǎ2d'hG?^;裏̮:}y晏5a<ս{wp4оvZӏĉ7nW_}%^9ކ dܹ;wnEDƾkݱ~s.]$44^~QuPriPzduԑB I*U*ʿ/Ђn޼)O?_^:i/'/uk;W5]cn2 ݻWILğnڡAs K3uL;Xu{ݓwܹs.'o>Ch;~?niyE{ni/'N0籗\[Oߣ>gN,[@@@@@@@@@"xW%_|ҵkWSٶ.65ӧOwhNjivݞ={[oɵk3fh ZCO2걣vw~Ok]+w:5oLrz)S8kqq.Oj#h'_,~ssZ/:yl~{| ` `B@@@@@@@@@@@@B rԮ]ۑ?~־ qXU+a 9sT^1gd:|MGHH 12d~>(+aD= nqXaDTR9'GV@ e1>*T0ǶD;صk@f`xͶ֭sXzmnc 6~QOSvՎc:exV]9ʕ+Z#o޼+,a9o}9J,iK$ I3WXa u\t1|G9ڏG}Աi&G}9K;v{^W.'s s}<.ʿ~mGbŜygV8Yz}9*U(Z Mf͚?f?}k hsXV;ZnxVHyV^wD'|IfgH5^glٲ :\gPcڴi+a/={Ó3+=N:eٵM=ysya/\?9         @4cjzak7MMe̘ԆK{Mj-'իM ZM^reuÆ 3 _pNkTxZkr5jpdɒwy$6e>gK3V΃֭[2e2u>:Ej}{)C >DTϮ5:>@p)g^ Gv\spYfy.Z߯mݿ{{ҥKMՉ h Y~-a#Hc@@@@@@@@@@@@@ w}W "֠hd Eb kXA3nyٹsXQbsƓ: 71nGxuU{i.֠^n͛7+FN>-V@6qmɞ=עZg+ˬV.VxXab8F_#:/۷ĉ?D׮]+lJ)"@uzi 5\}iٲ5ϧ&VXͻwk{t` -DK+[JҢE _L>]&MCGz~ݻWHΗuw.OkKuZնz=Y`ABڜsbUYR^=2@Ds(            xK`͚5ҧO믿LxO=mhL{ jڴiҡC( @).<:6m_uPNCɌ3r6裏dΜ9uEeŊ̜9S/7o4wڵv-X#4/֭[i{g=>^nsHHo>ϤgϞ1mp~@@@@@@@@@ _^Zj%ŋ7AFy7qU5bĈ]4ZuE QF+":u,Y2w]ɺWJٲe|2w\#5 >\onʆ&.b~m'             puԑ-[ѣeРA2x`ݻKtؠ 2Jjr>.\0_GUO&H믿w}W'I&<~,k׮K ,92 @ @ @ @*Tgy饗F%֭[ѪUUuzDf͊Tx5رc:/<7n\zyW_={믿܄};lP2Lc9&nZri3+O@V-jΞ @ @ @ @ @ @Xyb?rOmvѥKw}#TRe!I`ĈsœO>? of͚?O=bСFA#:u5jԨTKH/|xꩧ?05kGqD6P$g= @ @ @ @*@+{衇" {gACT0N+WǏ;#n6mZwqqf+<+X>ht=:tߣI&+xӧOSO=5 Rӟz}+ PFVI @ @ @ @ @ @Hu<8 yg?^;sksѢE> T &ĠA⥗^> 6 RxV J6zxᇳ7x#j׮{G>r-XҮyo?zC=4ڵkW! @ @ @ @ r^|Ÿ#`7n8=ڵk\h?c<qwguM6=z)W{qG__}}(m/v_N:)w!}RM@Y *@ٓ @ @ @ @ @ @%b8p`|ѤIԩSѱch۶mTV#$PXX#F!CdrJ:u.˥[n]]&m @ @ @ @ ?>sOveCrH4o|5ŅfΜ=\=LY))Fz*7L9_of;o_|,ji& 2kݺuCVAP~ᇢgXk :DovW.j+ @ @ @ @TTvUwz]q Y9rd<+)iF:u]w5vih۶mTVtlW_}z <8^y啬6vܹY{iNiuYfΜwuW/ѣGG.]O=3TZX[q-䣏>cO?dZ͛7f͚E Jfmk.;yHX}Yu ip*3m֑Br-*G4 &ǰaòezcz>MM4ɮY KrM75jhʪH5jԨK~ƍ "Hݧ4HZ ZWʹ @ @ @ @ qwѴioq챑{\EN< !CԩSz:DvlNuK(fw}n;o,:VZe!h[t9_id9;y믿>^}oit5wMs?/H[mUuYѭ[UVeT2Z%JngO @ @ @ @ @ @KYfea(4ЭQ&O\ƍ&l)@'-SʆnX47lذh[/*ib„ ,Ns IAYiNAl'Nuׯ_Cy5֨ Y/RXR~a1|MHA|龐Ҝ mQLW^}5O=T GuTs1vەk ZHSok7PK>3 @ @ @ @ @_‚".4/<3Fע VL[&/Mu֍-[fuuoyܦTWi/u5=qE 4KOfq뭷mfsvb63?xDSΝc]w]v%fV8KZXX}Q1p5R8؁/r/8*Ej-B+j-7  @ @ @ @ @ @ PRN )%Ȕ_m҃)=X]wXgu7lpAQV!,_`YUz,g / @ @ @ @/^8܈\UѻwV],gĈ'Csf I5x&xnשvw֋5Xc5ΔHSb<-טש49T#ڼy9mѢEYf~3Rc+D J/}۷omڴ)[nkf)bΜ93RۊؽY|jGǎ}':t}QBk*@_0Z%' @ @ @ @ @ @VK9sD I.9/^҃)[ h'Vz,@~2a4שS'j׮atܪUfs*UX K͛4K[&bҜ?3fd9e IiӲSfXy҃|pY>q1aquǘ1c#9'",qAHOHt( ;yBݺu{B{̋',^_{Bu^Os_/nw|EԆt/LtHndm"@ @ @ @ @I/":+ڈ-(?=H&Lcfs ʇK嗩ѩ9_AYdfzeNժUTTڕ˅_Tø96|weo,ޟԦK4o&ټ馛fuE^@v)W_Cưa>jYSR-jv麥e&MZTS;O6Jߟ4r!t_~=X[mUծ]ycm dZ%Ur;{ @ @ @ @ @ @ @r^Sxη~[4/Jt)|K҃)(K 6OSLgᆈ^?gGt,lC`=!=8*O-|H +y/v[3 bL bŗit_1 @ @ @ @ @(j`o%#ѧO~U̞4qĘKSɇ Æ/Sd>*EΛ7ou:%R=cU~ 2- Th̘1YV>*zW_ɓ#dtJo{ӨQ,+u4h"ZlÕ#PQjJ *=  @ @ @ @ @ @ @ )T+)H'=_s̉~)CҖ鳂Zj\<"Os͚5u ZZОSN3",@H Ai`=)UW\1(ڴv{ i]jժ & @ @ @ @ @`~_+w\ ޒ̟z|VZ|mtLs̿KK]W^yeVӘRbZYeD`IӧOςR\^ktMT;۰aXgu~K:V+Z%JngO @ @ @ @ @ @ P:o߈[nۈ#8}5**v2 @ @ @ @X #n)ⷿh<#ڵ[QV'|r|gϯ6'@P^r*%՞ @ @ @ @ @ @ @@yh(#><" vۈΝ#{,b޼#@ @ @ @ @L_~~zE~[o *+.(((ɮ!@V@V4F @ @ @ @ @ @V@͚7?P"֍#Z_#O_yr$ @ @ @ @ @0 MO?xՈ޽#W_ܖ-K jU"vdYN>'@%/[ź^ZK @ @ @ @ @ @~{F @ @ @ @ @X@ ]qWa6f j  @ *H  @ @ @ @ @ @ @@hѧOĄ Cf"?4"l~zĨQ+z4 @ @ @ @ @NEx`:9:wn:u5js9 XUV @ @ @ @ @ @ @ (&sĄ C hr/\; @ @ @ @ @*p'qiĉO駟V[]T;^&@@e𗭲^Y"@ @ @ @ @ @ @+Qn݈Ί5*G".b="ڵ"f^'s( @ @ @ @ @ )p{Gzkk5>B7PVyHG+, Pk@ @ @ @ @ @ @V_*'Ә[GtRFE&6zN @ @ @ @XN?=/瞈㎛O>9W:Z͛'PtJ ؊ @ @ @ @ @ @ nq}}q`O>|ŏg @ @ @ @ @)p9CMZ>SL*fjk V @ @ @ @ @ @ @@1׏#Əᆈ#:b# (,, @ @ @ @ @J#n)#~][STj  @@ *  @ @ @ @ @ @ @ԮѣGGE<^Ė[Fv[ď?V @ @ @ @ @@Έo2t2dHviJQ jzZ  @ @ @ @ @ @ @@H_G|A;G}vĆF\rIĉ:G @ @ @ @X-+O]ӧOl喱nwW+]0T;aT_2wr @ @ @ @ @ @ PZ3ό/bM"vxw#@ @ @ @ @TV7ވ-3";�o{+*y *Y%@UM @ @ @ @ @ @Vu׍kqG:DtF7 @ @ @ @ @T#>8b=#~u]Qj\V.mTJ  @j @ @ @ @ @ @ @QFcxh^h C"7ƈiVG}&@ @ @ @ @T 9s"~z"x Jԋ۷ot=֭[1:T[)P_Yn> @ @ @ @ @XI<EԫAg͚_#U֔@RauP(cZe| @ @ @ @ @ @XG\w]Ą C{.U.]"^|qۂ @ @ @ @ @`fΌ8(n"k?CI' -Z P8= @ @ @ @ @ @ kq|Smۈ5keK @ @ @ @ @ \w]W_|p4idd @~\$@e) P, @ @ @ @ @ @(@1hP;D@="68+"D-&Mv[򗿌Ҩhz'bM6|6ePثWhժUjkX. @ @ @ @ @B z̫ȅe- 9xٳ7ȭ-5v{ĶRٳc]v^{ӦM+:8GtM7EnoY~sѻwCo1̙S)  V˦ @ @ @ @ @ @ @@h>{"ƍ8Ĉ3F'寽&2eJOnj3رcs"-M a>;Fe5,C|&@ @ @ @ @@e&ŚkF};ҧOhݺuti*B] Wl{Ez]ѦdO\ Z17Ҿ馛bѻwk# 袋bРA+dǭK +Yfqie=òЯԇ?R I'm?~x7c5׌786N4)nxnݺq1CBTi̙q7G?ci&8XcIp+ai>6l7.|I0mº瞨UVv4Dt"]˕u y.kO(*5: @ @ @ @(@T0W˛Z` 2$[lժUL:5)L0k&N 6 ˪[Z ےj%v裏sk.=جrٺ]v%z+U߲~:|#tf'\E*UD JΩsɱ^{eHZgy&7o^/<.ԩS:M2#5j>jTW7k]Ԏq-  @@Id' @ @ @ @ @ @ @*@㎈3q9w#~󛈷^y=۷ot9 )تQFqG$PRSݳ| >RRR Qe~Jnu!dAY)l)>mt _:=\;gSxV :֥04vA:x) *<  O<1G1vi 4 Ɨ_~m\N_L:%~ipԏd~EyAJ Phv!@ @ @ @ @ @ @*:D\zi"r9Gܘ O%ѣ0]F" p5DNqѦM$ i]~JJ >Dǎ6IL}ѣG>!M& 2vۅ5뮻" ҵڰaå^o=|, +]彆zs=ԩS?̮SO=kΑBѪV;$#}Vaꇉ @ @ @ @J.JZ_cY(^gy&cL;DݺuZTSTcYV ےj%?8䓳"ӹ;t 8QxNu]7E,nYcOӜ4iRvڵk/҄djXSh~ ;K.$)kw֧G:_GlͲv䷱$@%RC @ @ @ @ @ @5jDt1th/GVaE4oq , 3gΌwq}w)ؔXxjݺu6@Z^i„ ~|p6C!\5k,ҠiZA'm*W^uQ1vxWmR[Ӕ5kV̝;7 (>YfZMmQ6BSN}?gEa +UVlټajXN<9fx'а={fmװ  @ @ @ @(@.)mCY]g0`@ڳUcuKL!YUVB-O>2d{<0ׯdZ%إѣ# N׼y99suM6]䳵r'xb2ȇ^{m4n8\m캷k.LՉKXYVց @ @ @ @ @ @ Pv-"͟~q]qq晑 Z^}RUi]v~'Wǒ˜U614EFcMYϝXxJXwqG6w)ibȐ!gH AR #;¹nHaZ}]F=܅w-;Oٳ5\{k;K/nݺ˺iױ<\Ԧ#8"W;?O~f @ @ @ @,wߍ_r|[BRhӭ)*S-\c׾}l5jT߲jؖT+O=T&Ӭ/u]qyE߾} lwK[s5sdStUEt6l뭷^Ѻ}Ѳe:thV7BZj[ne~/alGK`'2k @ @ @ @ @ @ @*GtSC}4yCxewu6zu6moܸY"PN:uj6Cرc^4@@IDATvm?p6Ϝ93y䑨^zH[K;c 6,>=sL4ڗzkCW_-뮻.j֬:tHYⴤϭ\IKA 3gN-Zn̘1EҋͤIbZ`iҤI{ѧOڧ@z+Xؖ,S@2l@ @ @ @ @ @ @N Dw^<1qbĮF.jb,;d_yֿ;f|ӬYnYoڵkmr%d= /̿]2 <ȸ袋" n_*{,k_)W^ѨQ_~1o޼xǢYfkFcСEI(>uEӦdܴXvHס"_Է={Ɨ_~GqDY ip SM @ @ @ @ P2gwEQFVo>6mZtIEZ|]Z~HT;:}s x/K|WqG=&(5-nʔ)E9:|gϞ]K =蠃bذaY`T+V?ESN]dݒVs9Y_뭷ޒ6H@VD @ @ @ @ @ @Tvj"7p@Đ!68昈M7ܸ Lp@^1f̘xG>{67:\pAnϖ:lI&eԆM)H~`)L)M!TYð w9@gyf6FΝwYvͥmC.%U頃zfytMYXjq?Ya.˴.Ҳ\4H7ߜkV0* J 0 @ @ @ @ @`R6[oEwM5iJ 4^/\cV:ׯ_yG-nyV+ S^ T.Dz⨣\k%Tc @ @ @ @ @ @ @*;Frb q5nq#GZյk8c7|3^y,)m[F6mwމC9$^{˲v)=,(/4D)줓NQFeK^O3#Fd;idIװiӦOmvXVY0 RS6o=@2\ü% @ @ @ @aunWVy-.m Z?0Rײj⋥!s@eJ:6,G5X#*Rܡ~7MV۹r:U=%ڷo?|<ӱ6ľs΍{7\\S}co;f̘ӟ),ykz)d8%XY?J+`C @ @ @ @ @ @XOX_:?dk"rRobFŦnIaܸq/qpEvѹd4B!-Wd:ujԮ];W^ɓcu)ziP';*U|z(J5k,֭qňrAYYgu°MD#^3gFdĉQF^x SL @ @ @ @ Pr[no\}9ccСjҞ61Zhk~n uqƌQ~eyj~n-2ԫW/Ə=R`Æ nPlf>ǤIcǎѨQyMK6s̈#:w^FV/V@bY$@ @ @ @ @ @ @,[ /O=qtz눳ώo"j\(? ji  @ @ @ @X51n\ċ/.zo&6`O^tkV@ VZ_s;!,]@}i}3 @ @ @ @ @ @ @ ̘1#^z饘5kfvZ#s"{H6(70ܷ~ŚkYVw^ @ @ @ @(E##ڷ_ Θ={vԨQ#Wgk[n[l*U>}z-ZmۮR'#@#PP*Ow @ @ @ @ @ @ x衇{W3i& Vn[>bĤrF}a#s.L @ @ @ @ P7∳Zo͋7<Ǝ- pWƥ^|ӠAK%:K PY&Mh+O80sҫUZY @ @ @ @ @ @ @J.0z,X{hvhٲ{'b="9'" *9F+Ed @ @ @ @XiӦEԫSkWځ4io3,s80L@}z^UJ=  @ @ @ @ @ @ @͚5+"R֠Abmg<ƌio%Ly8tZErKČ=-  @ @ @ @ @e+0f!MD`޼yQؑ r4S_儲 @ @ @ @ @ @ @`y SNѯ_/o[4l8'>Ȩ[wZ8!]1a6 @ @ @ @ @nҤ+WP%u4(E @ @ @ @ @ @ @r Ԯ];>xgcqe^ٳ;0h}!6d\nުzE @ @ @ @I"W_U ̛7O/T:Z @ @ @ @ @ @ P4i~|;D׮GZ~4|r~bGn]y6 @ @ @ @ @U jNe]@y]@ @ @ @ @ @ @ @*h߾}p '}]'W?5~{8찮ѴqubU4'$@ @ @ @ @VCɓjU˞ *Z,U@Ry|H @ @ @ @ @ @(=jժE.]W_79ڵ{O\pFFnŘ1G&@ @ @ @ @ckpH)PJ#i+,[_eق @ @ @ @ @ @ P 6SN9%#Gs=670?f:D۶7œON.v8 @ @ @ @ ̚QcZi;,I@֒d'@ @ @ @ @ @ @@-|36bݶ/\?48(>1gN5i  @ @ @ @ @J'jԨtݪ*,,*UĎTꋬsX  r W~2 @ @ @ @ @ @ @B ?=zO|h3G׮P])m6OlO?En`S'bܸ5: @ @ @ @ @@E=:⣏"L#ӧGh1iSFgQ{[y^vۣ[nzF *6j1p`Dejet^%@ @ @ @ @ @ @X:d޽fرso߈k?PEgѪ p5ߴK?1Ӫ:  MPTcAD1ĚhN45;Qc!**6T. &EQyaʽkeUY~QXfu´, @ @ @ @TFq"<2FVtKFL\rDXYX|o# @@_*1  @ @ @ @ @ @[mW^1e7Z<ѵkwSێܑ= @ @ @ @ia+bɒoJAZ~18WfL PjUo @ @ @ @ @ @ @@h ??>⡇"-7b#n=@E>֍85 @ @ @ @ @M!PcERŠA5k[}w6@ Ԫ>T!eBP @ @ @ @ @ @ @)q<[ݻG}vD_1}ztYרO>9"--]?ꨈe#@ @ @ @ @UMS#j^-85wg @ @j  @ @ @ @ @ @ @L;߉#~믏!S"~{5wnD㎋XtO X=W  @ @ @ @ @@elNUk#95sbԨ!vb| @_T @ @ @ @ @ @ @ lEĥFLquGGsD>9bٲ 42J #"/oՊ48UB @ @ @ @Mn͛^`Y'jmo PSm @ @ @ @ @ @ @ %PnG^ēOF}/bm#6bM+\Έ?bTVcU+#H @ @ @ @%#j,y=ͣ;לU,Z{ Jˮb5 @ @ @ @ @ @ @T,:4b؈>}"~ˈm#~ɓCELq J|[kd1D| J^sF @ @ @ @9D,[Vrdi]߾%9X@1!@R@ַ: @ @ @ @ @ @ @ l]B#S㎋䒈5oDi^;⫯zU9jpu=*#4 @ @ @ @ fرu#ܳ5gK UȊE!@(6T{ @ @ @ @ @ @ @ 4oq~qo)Dt7ӧS5O:QV'G5G @ @ @ @ @ rQ7#LL*@aaa9ZN@VܼE @ @ @ @ @ @2iы"v%"?JZ}ѳ7\r^]PqszM @ @ @ @J#pu|f :X|y֜@T@P @ @ @ @ @ @ @ |Y=D5m^z.j*F"8~oMN;U11 @ @ @ @(@Gw)Lkٲ}K[K@VyIk[  @ @ @ @ @ @ @@oXWR֗_Fݻ덲_XX-ŋGAAA,Yh;NחXcΦǩKNWttmG5V, WԬY3ZjE*kJ8ԩu,[  @ @ @ @ @o/p89q՛Gf1s1eʒl^s9riկ_?6mfѰao5@ T2Z. @ @ @ @ @ @ @,#VdDXb-GoG]HܹscΜ9E%ϛ7/ŏ篨lN³>0ꬨvz}V xH lze EE4hPt"5ŏӵƍ6,[dtZ @ @ @ @ PNǏɓ'ǤI}:Ne֬YW_ŋ3ơSW\Rnڵkl뮻F=mgrZ֛̃ PIVL__#T& @ @ @ @ @ @ @ -H˚6mZVRxӌ32sEV:S87[f+JSghԨӊ+h"HՊ4z~)ڪ04i;p6۬8re+@Z"-x7Ifu%-F$|֬YEo=bgaf[6mDڧl @ @ @ @ P1&NO?tꫯf!ZiY֭[,*VJ-W,\Qܰin￟|傾RWCڶzٳg+nmX \ў}o @ |y1bDk_;['P}!@ @ @ @ @ @ @V &M)SD*'O.ڧWenaZ?[zb-h/vsJ8-Z(uͽj_,YkE4RVڧ\Z6w#l֬Yնmh׮]}8w!F @ @ @ @e/0,@'z*>Hsz葕H۷o_oӼQFW^y%̙[netAY9yd|>sVށ9@XZ& @ @ @ @ @ @ @\RԩS?ʄ O?ĉ#f-_|x/G;~/\?q|^x!T^JjΛ @ @ @ @ @ @ @"0s?~||Et'ĢE6k׮u)ۧ%e /(GB%3f̈rIp7ڥKHem-o喑Wf @ @ @ @=\p Ce!Z_}ѿhժUG/ Y؏~8#<>,ܻ_|1kj0PTZRJoM @ @ @ @ @ @ @|_ɾ;1v3fL/W^lֱ6dCsΑBڶm5jV{@yL6- JZ}QF*i5l0v횕v!w-ڵkW] @ @ @ @69so믿>ƍݻw38#:hѢ&ߦpo9mڴ3<3+鸺mSL؍92c6|%@@UO$Pv$@ @ @ @ @ @ @@aaa$4zxJ J[Z" m%J [6;6lXZ)TPPwqG_\{n6R OSN1zl\) lDZUz;o @ @ @ @ @ @ @T࣏>'|2?|̚5+b{#3 Ъ[n52l#txW_#Gfv&LI}ʧSZ!@ @ @ @ @>8e˖kx X`A\~?1:w){ZMx?:xljN @ *Uz;o @ @ @ @ @ @ @D`3?Ol<otPqq!fmVǠs @ @ @ @T=+:СCr-U6"|4G?Q1".d,]4owlvUxFL<9C-/Z(zGuT}Ѽy3X#!@ @ @ @ @ ,_< W_}u+"j׮]Y:TXX_◿ez衑4hPe9~HsY~i̸ UE@V鿤@y @ @ @ @ @ @biъaÆŐ!C0uƑG8 ׯ_Fl8@AAAK<ӧO ;Om @ @ @ @(+ŋDZO>d~q1ǔUYOW^y%m۶0@-Ez5{ӧO̚5TW Nը!v}="@o#lFϻ @ @ @ @ @ @ @@3fLr)ѱc6lX\ve1}2dH7+t5 EZ(/K|gq-daZ]vBRؖ @ @ @ @8cȑ1|ٳgi^y)lqGŋˠM[˳ڴA PT @ @ @ @ @ @ @@0aB?w9[!5* jذa PjՊ~O<ƍmA|peݜ @ @ @ @_g뮻VVi& cƌ畣k@EZ@V|:O @ @ @ @ @ @l%K.v! z뭷{=zlH5Uŋo߿lqK/Te[^:uj\wuqaeh7M^Ѿ}8bٲeeQ&7ߌ.(veK7Y?R]toGNb=:+̙Iq @ @ @ @*G}w^y^x`t9矏C9$rPO<1{8^*}v-_O>dջ)*mI6@Fb @ @ @ @ @ @ @" p={Ɛ!CGx ֪H}ܔ}I +'fΜ٤_|1 *~UU)Sc=C ~~8 -*r뭷ƸquyecH!ww[fZG~;vqx7%  @ @ @ @sNl1xJٳcOJz/B+\=c^?>8p`,[|ʰ\VbGʐUU P|] @ @ @ @ @ @ @6K/ݻwv)|86n_1r>q7h~o~S&uUJRiVfݾkGѨQ,飏>žʬMP>SFe9i o뮻ʲzu @ @ @ @ Pyx/*4O~~eaW9%^(+"ܻ j4Uf 4Z%@' Pk٪ @ @ @ @ @ @oFzӟ4nhذaUB J*m۶sZm' '-nm몬׬YLhѢOZIvܹLԕTco,`SO|pSsi @ @ @ @ (p7G.]y{KC YfQGU<@ 4(wzv⢋.ʎ{ϖIwwG^u[|yuZ 7I@$d\'@ @ @ @ @ @ @*… ㏏~~ 96[nN?9[Hg?Y|qW[o5O>995jTM41tи;VZ%]ҥKcOFZ\s+,, Ą ⮻͛GzvذaY{_#-VqM7Ez>SRhYc|DZ̙3w|gqYgᄎrmɫ믿~8޸ꪫGk[mUƾrKw 4( ;vlt%R0WvƖ>hЕJa[qeQ^F3_~y4m4ۋ/BRZV K;w֩S'{//Zlqp qgm^k~7p÷c zW3>MW^S߾}@6'ROߞSș @ @ @ @I`<4_kclk_澭n>~i)yk߲4,W.t@IDAT@4O{Y뼳mۮ0-[ 4M6[rmΜ9uQ+ {w;3o+z˫Z%(ooz[ @ @ @ @ @ @ @{,*UĭO>YV[ @3fLL0! @:sB ))m^xaO!L)L+,}{˂8HaF=#7n))#E"RKVUZ} ݻwvR_S;1@@TO6|ipBҵRXW Z])$-h--䑂{,ll?!½Ңݺuڵkg8Gw.x⪫FeO=zȾEzﭷފd"'8}gײJ6RpWr{{L};w:J`;cNZ@dw/M!Oizk6n-[SO:tP&cڵk Q~oeKf;Hb#@ @ @ @ @@N`ҤIaNrllk 2$?4hPv晥diݾoKsbe]mܐpfes qڷo5k֌w[v?jz6 P4"c!@ @ @ @ @ @ @G/X%Чi&R [nm6 WzI&YRz @u9RϢEg•o)[ҽ{(,,¾&O^ziֿEbkAY)+>r-En#]w5^},|+=}7fYU/R,]4wܑ/ҷ3gNѵ=߿ѣ_{O2% JVǿhݺu$ܶ>D2dw疪\;_]6M| Kb#@ @ @ @ @@N K[ Xe*>1cYwV?)ثW=C矏x N9;+ZNFw}w=z-O'瞢K>Q6giNc:u2|kjngDk @lj @ @ @ @ @ @ @ $6dABKt%A͚5}E] *^`رi v*muMJ?>n,LkچjoСC5{rڵ#Yڡ>hvoĉ±RpY-???RIc6۠<׵+ K̙3z1bDo~Y%*-X f̘Qt}ԨQEǛ`ٲeѫWxN:} r*mh[ˋŽ8C3Έo1nSV((((.\i-xb$+o|ʗ6QF;)m5m4 2eJۖ[nn/8.m%*F'_|EqqI'UQ* @ @ @ @j\cƌYף|cjٲe֏_|DgYrRn;,*&M޸㮻*z;<㎋GE7رct鲱بiQUN@@&@$ @ @ @ @ @ @ P>{Vȅi1:kg-ŋKI :sUVق7|sj;k>}[W[nƱϟ??F6myW_vQS;=Dz'92~_NKOM2jO[> {/їѣGGzܻvYs)jfҥqnᎢ  if#@ @ @ @ @@N ѣG >׏'x" O?tkVTφ%Kg}Vڌ3Vt_WL>={,f^{e)*mCƲg),n.N?Z. /hQFC=\rI\zN;/RnY:5j78#ua~ѳ?xAڨYfȺ^҅d׿ƢEg&N_Ѵi_Yq=Ȭθ[o[\veY>hmu}Hs3g @>:ƍjժUC @ @ @ @lZ:*o法>47kM\<0|xÆ -Zd5_B{ټɓ'ì{챱N;es@ˠU2dHpH%PkOTZUC @ @ @ @ @ @ zOF&Mb]w{nn(~C6 @ @ @ @,p'gҜ5kMt=׷{778`l 'F>9_bM7UW]UuwDs=4DZ4-͋Ls+ ˫Co ZP;. @ @ @ @ @ @ @@Z8 Q]q٢E~)(t95jJ b„ [G͚5cv7x#-ZDFl.])jԩѩSQF3'N:răNU6M6-,X-ޑ YyKFz=o߾(抃'q'JE'ӬYHao۾M[7.Ν5h`uMڷixٴil2/\0?ĕW^-Br}$@ @ @ @ @.HsƎ[.<;5k֬x9t[mʷŋ;Nq}Uڱ 6,=W;L  PE>Hŋ/?p\xqUWgg}vtԩ X.])H+mk׎ݻFpnBzz?ݜ5kVԩS7YVYe݄T1x?_7xc\{Qf͸SN|3'@ @ @ @ @`iw{WqWJx+ꫯξOeJ?S*? ]&@2[o+W @ @ @ @ @ @ PҟY:4?s=rHsGF:u*ǥ^x` 2$Zn]LU9XlY~qwF u]cq'W!G9 ,_<i? {4hPQVr쉦 @ @ @ @JwuW 0 :*X|~.RxyH]-ZTcTU?h*bĈ޽(7θjmW @ @ @ @ @ @ @Lދo1H;G}tVS)Bu,Y ,(ިQYfkUd%RnHF`}R/h}W_1gqF>Sg @ @ @ @ N뮻.qTu>pg:_RA{az衇_~֪Uk^4ltZ'Uz;o @ @ @ @ @ @ @UP`裏F yDz?<;8I&UpԆD ,\0yuZHdƌqqƍW}#$@ @ @ @ @RәgS馛aÆއe˲0?qVP|0MD~~~uM + PFVI @ @ @ @ @ @TqsСC#Ha5jX3. @Uz{Z& @ @ @ @ @ @ P ^'x"|xA>w=ԩST @H[/fV{/bm}f%iկ_tZO @ @ @ @6SNSN9%Rֹ^xa6@.]]w]۱cǸ;[nz5s}1ר @`j7* Z @ @ @ @ @ @ @f̘ n @ @ @ @X)o[׿ ƕW^'xj՛u80>8⢋.vVE{';X|yU1 @ *'Uz;o @ @ @ @ @ @ @RK/#G_~9xXhQl2veu]JN"//]]`ԩٿ*7|3&O5k֌v)cѱcǵW. @ @ @ @6iӲP!CD .#7TٳgǸqދwy'}ݬ|B1lMxLZ@&TנA@c @ @ @ @TA4K/|0WxGUpe;>|x#Fľ_|qpePSN9%|UT<Z&JoM @ @ @ @ @ @ @ ,Z(RVZ#WR`P J[fbvm]tJNVZԖ TTe˖ŤI>?0,Dkر1}۹йv)d%7jԨK @ @ @ @ Pj4w]Ѳe8S3Έ4VR`̙qmō7}Q'.oJ>X8cU|G) PMVI @ @ @ @ @ @("RPڏ7. ʅ լY3:v[ou8FΝ}Z(#!CeTR .O>$&LPK>XdIZӦMcm ;D׮]}#// {* @ @ @ @T|)SdAQ7tSL6- :c_~YVy{'}ѨW^tI$wqZص2$~Gg#@' PDVI @ @ @ @ @ @ب_u?>  FBfΜYv %СCҮ]h۶mVZnE; m/_-L<9&NX}6i$R\l6ѥK,HEߦ+%@ @ @ @ @@Xti<#qwСCcɒ%ѻw8ꨣCN:Uq㩧x ɤO>qqE _~ǫg}v̟?ڍ݀  Pj+ *7  @ @ @ @ @ @ @L`ܹY֧~@>Ϛ5o5jԈ-آ(\+lJ6m{oyj*j׮]%|_n0ɴi>8E87gn;v,ڧhKf͊u@ @ @ @ @&}Ѹ{'yesO +-"~ұch׮]V5kч_ɓ2iҤxcܸqYV³<ݻgA`) W^޹*7w^y6xJMjΛ @ @ @ @ @ @ @j%rM)\+wrSZ#]KXӖkp\W^ԭ[7+u):Nj׮pn_fH)$*-[qdeɒ%-Z/_$%_r+?#BVާM'$ @ @ @ @T]^5v>Yf :k۶mlٲ|4,QKV#ϟ_4070Ҽܖf,ܫk׮+;w4϶7pC׿n#@' PČy @ @ @ @ @ @ PҢ͛7Ji͛WTΝ@F`tpUR ٳ)ĪSU.j5fƴ\8])*-()aÆѢE( $ 4( ˅ \M6xoΈΝ#{lu @ @ @ @ P9: 7lL~<' @* P"@ @ @ @ @ @ @ :*#v)?8䐈ɓW݂ @ @ @ @Gڵ:Ķns$@]@VeCG @ @ @ @ @ @ @`%Z뮈'x͈N"n)b•  @ @ @ @ @.p!DQQQIa[G}t @UE@VUySI @ @ @ @ @ @ @`%3"7iFĉ'FKM]N @ @ @ @VM6$r2¶82;@@ @ @ @ @ @ @ @*h("x#b̈]#LjyV݂ @ @ @ @X-GydԮ]{{D=b6Z @ ԪjoL  @ @ @ @ @ @ @mx͈.=V݂ @ @ @ @X|p-q8ꨣo[g @ @ @ @ @ @ @@v툁#> Mw8ԈYV݂ @ @ @ @Xe믿~# g  @@uUޢ1 @ @ @ @ @ @ @X 6x晈n<8s爇^ @ @ @ @XUVѢEU,7$@kB[OL @ @ @ @ @ @ @*@GGK~Ex`ĉ{:B @ @ @ @jA ,(6H (mTuZU ? @ @ @ @ @ @ @U(ТEGS"5!&@ @ @ @ @Bڵ P!@F@VyB @ @ @ @ @ @ @` 4lq%o1{vV[E\xaܹ9F @ @ @ @,XTTGy], PEjW~& @ @ @ @ @ @ @kH[7ވʈϏ<8#va uc  @ @ @ @ @@%?~1wl7o^%ou:/cu%[pa[ly̘1#x(((Xd),,ZjeKڵԩu֍vz"-hZ-y @ @ @ @ @ @ @@n^8_2⤓"v)"fͪt @ @ @ @j@ 5kV̜93lR>fϞsi;଴:mp>ׯ-iAѰal)5j(7nҤIHK\aӦMu:W#@ *M> @ @ @ @ @ @ @JpÈ'&G"/t;  @ @ @ @ @jHAWSNiӦcƌ7d봝RV *0¡aR[^"\dTDUnH\|ծ];jժU]PP%qE.]1,X [䗢,+{-=o޼HܹsXCAa%,VZYYbi)\+-kVҼy^;Zh묳N䷓FW@V}FF @ @ @ @ @ @ @` ~x{Dyf/~ jn=ҍ  @ @ @ @ @0'/'O%?-ޚ5k)dXfmNMiIaN鼒ݤI,j{V1>C*S}Ia\)l̙B_};vl EKaiFE˖-UV,),-mڴ)^ @j ԪZKo  @ @ @ @ @ @ @Tu։ֈ~"N8!s爋/84AG馎 @ @ @ @ @@%(***ƍǏϖ;=a„4iR̝;DžѢE,,)(0M7ݴ8L)K:R8b5Q~HKzgi),-keԩzʔ)ji{̘1kE ]KA\%[Æ cu׍vE_? JdTW @ @ @ @ @ @ @F?DvZ]wExt @ @ @ @VX`Y8رc#|/2 J礖BRR ;JV[m{wm6 AjӦMN!ZVUT ի}XR ĉuN!m)-;3oWnXob 6FmT@.[\6 jvb @ @ @ @ @ @ @ P4C8n" 8܈| @ @ @ @T dYq|'_ye#MaH)CѩSc=ZG 3*=忯s1nܸ,-6tX>A@2}ÛlIt16tu  @` ,̵U{Kw#@ @ @ @ @ @ @ PLZ&AӧO|%mnꪈ."q ;\ ;K @ @ @ @ P@QQQ5r=zt5*[G?f5o< JaC)hh7‡RQ *(((O[}Y;6RX\ZRܘ1cϺޤI|ͳΝ;g.]d|ȕ#W<}j  @ @ @ @ @ @ @@R2#x"c#.$"7wF @ @jd@IDAT @ @L`cĈgY)8VZFeA)<( ԱcXgu*Ht0aB6fO:-)k…ѸqHZ[net5u[ou4jhwjΕ @ @ @ @ @ @ @D@}GvZDAAUWEx} @ @ @ @ @@3gΌz+xxw ?<}V[ea@)(-:uz}CGf͚#G>xybԩQXX)nmɖ={Fݣ~RjΕ @ @ @ @ @ @ @D@3fD q?y5D] @ @ @ @ @`5 3&^zxW_ѣGǂ bM6=zDnݲe뭷-Z޸='0~6lX >< {7c„ QN,W^N;eK6mjRjΕ @ @ @ @ @ @ @D@VŽȡC#?>bҤ?)S" +D @ @ @ @.0vx^Ȃ&N͛7޽{om]lkWw #PiR[ooF꫑B̙α뮻fK֭+tjm#%8 @ @ @ @ @ @ @@U"LjK.=#ܲbi @ @ @ @.gώ>xg#j]v%~;[lET!j'0o޼6lX1t, oWn{>;Fڵ @uU*Pv$@ @ @ @ @ @ @&̋㎋x睈#;/~5O%@ @ @ @ @@U6mZ< /Daaa^{Ů:uJW?~sSO=j4n8s/} .vTZoJ @ @ @ @ @ @ @j" Pkͽ "&s"]7"7˚' @ @ @ @ @ ̞=;ᄌ矏֭[Ǿ-}zU֮+)0sxgG}4ΝOq{GڵW .'@`U *fa/u% @ @ @ @ @ @ @VN0_gK+{wWix≬'\]f͚zkvaqGG?MWtlk>,u~i*ʛO @ @ @ @ @ @ @.&#:thyחz (N;E qE{UDyvmGU~ 6lJ1!@ @ @ @ P ,'|'AѸq5> Ĉ#r\#mWt/#=1cƌ~|+YU s1dȐx_KiyJpBKumcƌW^ye 80>8}aYZwu.#G̙3SNC-2  P)jUנ @ @ @ @ @ @ @Ae˖Ѷm2Ү]/B-P^ąF QNĶF}vĜ9e矏 ._ ڪwe8ӲGN8% @ @ @ @ PR8a_|q<#qG-*͸jժ|=: +>bO?xP]w5ϟ_iBN>j8L4uꩧ.%+}.ݻ^{rJ駟^lc%\~x Zt/@g4 @ @ @ @ @ @ @H`u׍[ua˼Ё9#krMHҷ]7HyI*\%MBS_O @ @ @ @… Cz+^}c=*87oM6]c}]{>sbȐ!]ejSsVVZeVd][M6ѷo.{u]W2mwq3j0&T2}!@T~ݳ @ @ @ @ @ @ @@ 6E j߾}uȓ((8餈}8Ԉ,b.XgEN4?~z̙3'vm۶1f̘e]믿z(&LIѣGczk6FmuuikYX JAXq 6(^1%n! J5czR}ٓO>ՑuСT;SX {Wt.ղt0Hjҷq'gIAicǎ#G'|{YfߞO5u^zi>.l|O Ⱦt_~ӦMx[o-4~Zi&iZ9ql$?RV{wGV%y)AW!; @ @ @ @ @ @ @,4KIeJ@,xZIEx`D~{k_ 4(>Hl喑&vo>:ZkڵkvzRV֭g4)=ܓM+Ç_wqGvc=6RG}KICRWP$M,&I6n8 J7+((Z&ߞ,,aÆw%xQXXjՊ\w=ӘN8lbD @ @ @ @.BRO e˖#w^Ν;g5JiGJAHb/g禚|Q ʷ!C[oukYuVs_GJ]q3aZ˪Z&K={F&MT~3&N?\ [.,WZuf5cKZuV[lEV½RV AKugztWf!Z)j~_o)ŇRSO=]vR{7믿>~l_~=gΜ:thQNH] KgjRZɶ<]w}.KZ.ipe2Z>L}_uݕn;oN [tp:D@ Ԫ0j"@ @ @ @ @ @ @SNͺ&Ъ@Ӧ\pq"rs&a?͎#MB2xH!miB|iQF'dPV[mUK.ƬY;̍q~Kvm/78;']Զm=# j߾}i>,^z~![B~(**&r9zo7zOnG½N9唬>`;餓0&@ @ @ @ PRM jѢECfRKG q#@=ӑR馛O̶W*;RS*ٖemUU^=PV+s @ @ @ @5Fcǎ15jTsiuJi`rJ>j&L^>٘Wߏt-,a<5UK\TʎjJZ+DʟR׉受t[]uV%kJ/m_X~doʽ^<-(7J~j*7vyhܸqliwmEG7.q _SwߕT3UKPIvGuԉ:T_ @ @ @ @ @ @ @TQu#??b #z\T?4)Fc_,ҁve[n]y&#)>90741Lfg-kݻw/[~ᇸI2d3^{mCĎ[{4gy&:蠬鴷zٜ{!'O^b @ @ @ @j[oiK8h޼yu 7Āڪ4:c]vEV*jӺdW˖-C/rSzd"'~>VuV%u Gi`tMV:|SO /}7uSRڊ~OKUR^ ;v" )S[l#/hӦMOgA]{.ώr)1iҤlr?Ӌ941Iƍ{aÆ'MqGƗ_~Y @ @ @ @*pwwyg%H=GuTL81?ı[<孳_PVku׍3<3?T\25UfeDM>={VJaO)x+={fҁ>;^oqYUJk7dȐP߾}:e{+x mbN[~y~:/{ャv.MKu)2#7j@> @ @ @ @ @ @ @($?>bmc#N4UW]W'o,tm۶YxHA[ƍ:?~|/ I&q]w]|q_7eʔl&( f͚lbsRVj3g̎ JIK0[lEj*+8O>qdciCѣG @ @ @ @zo19昸[*-C&M9F*>8餓Z+_eYM_y)Lg,X 8,(pyjyp?ʪj޼yvEJaP7|sR=~,(@SO=-Z:+UZ=W ZUuV˪9K(^m15*?xGfumo}',ccəWoeΜ91{:ttƌ6m瞬sN1wxcĈXtMic{;RTW\qEV?*cKg]vDL` f( @ @ @ @ @ @ @FmD{oG ѩSwTSxùѻw8ӳS~GP#Ν;G׮]w&wIXw\|'ħ~M@2:GM Og,,iȑYս"C=4}~oK/kV,kUY./T76e-Ku^ի5麞={fAZ :u/uIj*֕R3fLV{jHaf|Af;F߾}O>94iW^yeqmZ>p+Q?= ;, ]jR8ڊݻ3<?xt-s(**&ޑoEUN0!c߳>;sE<3 Pn? }  @ @ @ @ @ @ @T4C(+&%C2Rf͊8眈ku׈뮋hRN\Ż$@ jԨ"OHt|d?OƲQ^1shР"L:5Zh+s~Gpnݺ^&I`oq6rI @ @ @ @jG})jʔ)?9 NӧO¥RSimYuV]SھZTcUXXk"]6mZG9UgUVcg}'ٳYfB*YNko~ѿelڹ*[7o^vEE Ka-[lV y.2rA}Ta Z-nJ @ @ @ @ @ @ PjU}}㎋\UD~zD+_w @ @ @ @ @k6;xs‚ ZgմkSC=a!C,<_^{Gy晫<-5y\ L.fVY<!ovl6rI9w?Mc[E*U~Jes% @ @ @ @ @ @ @UPWwߍ䒈Ϗ?#n1bm`t @ @ @ @j#PXXrJ? 9ꨣ]v4iRmZ۷olK}l z6k,>e>vP6mڴ_}UZk.~:>|xm6:uL&֯96iҤ馛.K|sLԭ[wEn\q{ @ @ @ @ @ @ @֠ѣs݃4?; |q 'D_]Ѩ?|nR裏cǎ5`H @ @ @ @|f͊[n% lzC:Z;RMF`U |7ܪ~RV jРAeV%矏|0,X>:n 郇 lZ6* ZeO @ @ @ @ @ @ Pc4СCO>5f q.=gy Ev=z&XG @ @ @ @ ̘1#x׿/B:|xl2{,@o= VA j& P/TV\I @ @ @ @ @ @ PMjU ´~O">bMVgyfp {EV @ @ @ @ @r̝;7g;=\ 6,իo}ҫWhڴr)T_j+Yoy{# +[EJ*?@۹ @ @ @ @ @ @ @Ԫ&/r5 7#;.#??bڵA?c6Ef_49 @ @ @ @6mZ :4^z,h֥Knг[jV(j%R"̙޽[7x#>Ө[nrwNѨQ#dTQZqoJ @ @ @ @ @ @ @j" P4K/ˆ#n1r,FMrq~.sY I @ @ @ @U$0sx_|Rӣ~YVnb뭷Ζ] YEnS߱f7|,D+GEvEϞ=W^ْG! PQV\I @ @ @ @ @ @ PMjU'1thĩFO/C/oMFӽ{Y @ @ @ @X|I;/3f̈СCtҥxܹst14h{@ cȑ/&LԦMHlM}UszMr Z.ROU* @ @ @ @ @ @ @5I@VMz+?n8㌈F"&b}}υ Ʈ&M&1̲͜A @ @ @ @@ |1bĈx)xk޼yYloylf&Ħn뭷^V|=@ }Y|駑N|1z,HkĉY/Rm`Nb-][n]A*@ Zs% @ @ @ @ @ @ @@5UM^d##;#ew1nܸl~UW]U( @ @ @ @_  4jԨlGeB3gn\^hb7:/i߆nM6-\IMf଴;8D+͟??I- .:wӷ.X^jΕ @ @ @ @ @ @ @D@V5yk`O=qI~_Eݑs \)P܅{':B @ @ @ @* 0y㏳pK 'ʷ͛믿ȲzE]vѶmhРAtk\`֬YW_/_~e,|s r뮻nBҲ&Dǎ Zk ^>jΕ @ @ @ @ @ @ @D@V5ykhiϏʈwMQvg;x饗bĈk}# @ @ @ @3gµHK /o7.R… GZ)̨M6YQ~uѲeHaF)H#`Hm_u=M81&Muڞ0aB?>RVծ];!olA%p CXK@VزjΕ @ @ @ @ @ @ @D@V5ykxqqFEwEԩdf̘]v^zŽ޻  @ @ @ @ @̛7/ ;ꫯzaHiofZjv-buYbI[ii֬Y.r?*@QQQS]ZRPV~:ujvLZiISV0K۶m}Y`[Z6C^͚! P+  @ @ @ @ @ @ @ @ /6oq}7ѻw,v[n#  ~ @ @ @ @ @ԩS'6`lYpᇘL)NJ~iqҷ~RR j޼yM6͖?m׍7&MDZ/4l0ׯ~ZdaVs̉ٳgw}2k̜֬93v KKK J/RUzW)$+=zdj)Tm%}WT]Vu @ @ @ @ @ @ @V^`ʔ)ل C>} ݡ q?qI_ Ve9o{/6pEE @ @ @ @7o^L>= iJAM/)):`2´RV / 4[d;[nvZvڑ%;=+pvZbG_/EEEl'̝;w?),.ҒJǖ8ekVr_C^{HKF&+OէGsUk֬ @ @ @ @ @ @ @TZ%T.qGD.7+79JWG74ȶnML6 @ @ @ @ &Rhw}/&J,U2xv W ʇZ *K Z{ynyna[-εx`W JK>+·||(V2D,֍5³RV~Icj@ԕ @ @ @ @ @ @ @ 4#?ZqW]ѦMdy睱v%\g}n @ @ @ @T@>(UV̩F3  @@U(*O @ @ @ @ @ @ @TE-"n=g" )#.jc @ @ @ @ @R~1^u @ @ @ @ @ @ @nEqѧOćFqѻwׯ_Ug@zJ @ @ @ @.ׯz Z! @ @ @ @ @ @ @h0K"z+b숭¸㫯Aa"@ @ @}YQ.K/"EMl "vDP4K41Xb^51Fc&FQĀkĮ`D*JY=;E)˲~as @ @Xu @J Ԫҷ  @ @ @ @ @ @ @m1fLD&N>K2g @ @ @ @X Dԭ2X!  @ @ @ @ @ @ @ P\qiElEa@IDAT3gD @ @ @ @&a @@U-nE @ @ @ @ @ @ @ PUڶ92=>(~U]y @ @ @ @ @Z?_Z5gZ @ @ @ @ @ @ @I#"&Lh{yCC @ @ @ @ @ @ @` 80MV:NIII4l0N;hԨQ5kwߝ+=h:#Ǝ8(SN房5u0! @ @ @ @ @@,Uƴ @jU. @ @ @ @ @ @ @@&M&/.slwR^ .8Nn3Έ6̏`, @ @ @ @@ Ԫ[fd. @jT^Wz"@ @ @ @ @ @ @ P5ʉG\@`m 3]^?U @ @ @ @ PGԩS33' P @ @ @ @ @ @ @ULO>ѢEUCY5. .j2S"^{-Cw"f^ @ @ @ @ E`u e6A*W@Vz @ @ @ @ @ @ @ QGjZlc=f͚-֗@6#FDzk:Eyq  @ @ @ @ @`] ̟Qκx @`Z7F!@ @ @ @ @ @ @(0AŢE;%Kd[= 807"8Јx) @ @ @ @ @ZX@Z9WZ @ @ @ @ @ @ @K`/wڵkǀ{A"ФIĵF:ԪU+k׮+ UF_)b=";.bƌC#'s / @ @ @ @ @p,rn @5Ӛ @ @ @ @ @ @ @ %KdXhQ < |)кu=DqGѮ]K/EO(= @ @ @ @ @Zk̉@57 @ @ @ @ @ @ @@hٲe. 6d۷o^!D<`K.{~#=4rr˞ @ @ @ @ K`/SNal @@e ԬC @ @ @ @ @ @ @`] %`X6$8j~ynݺœO>;S >콟B*ZZmYk.m۶Ͷ]tVZUk @ @ @ @ P@ڵ z&G*, Pt @ @ @ @ @ @ @6lf5cƌ6mZ|GvY`'|𜴝9sfp¯gAR)L*(J9i?>ʇSm SNVk~!":mS5jXfc38#~ŋ#ݖϟK-ZiM rPQv6 K.)d諁b߯5kokm&ꦛnm~-\Za ̞`Ȑ^ԩ|mRx֘1co+ꫯOzZn]xջwh޼y4k֬ߴޏ7&}m~6޽{#zk- @ @ @ @U] 5W P-rZ̢ @ @ @ @ @ @ @*,BrL4uJi?iQTTٔ y?mӦM#kzRXV!ړ| ٹ$Yf-SSW>T(Z),mSWPުUhٲeV~oyV۴iV?G8g\[D.-e]jc/ѨׯH<zx'r>_j˂aV:tȍp;vlꕂ_)+=)Xo߾~7 ZG2  @ @ @ @*M խk}0rnuD,͛GVrռ;Z[ @ @ @ @ @ @ @`y-w}7&M2ދ__I8@noD-exN~~_ ,ɥ$@tG}T?,-|Ig)Xm۶Ѯ]ھ}r-nݺKm@ʾ{饈'\ Vc}*ܵHL6^˜ܹs{7FmY8U ӧO"O K_)+'sy30`@l8us"@ @ @ @ @r_7/~v D@Vo@iI @ @ @ @ @ @(xodu„ [oe5f_N 0|Rڦ7$?cԋE'1?hҤI\JfOǍ7~{|ѯ_8cv[I+ @ @ @ @ ~n-bŋF%@ *< @ @ @ @ @ @ @,{?/Ri7k,t)(m;vՖ-[L* |K]JZ)^|Avە> s+**J:yKo[ 'G(**yR9,XsO\veBz?5jT+$@ @ @ @ @Jxcĉ'F|EI @`U[/PvZ @ @ @ @ @ @ @ֺygƘ1cbY6lnmV{~Xs2 ̚5+^}xW^ɶ)hk…Ѹq,hwv)vehڴql 6SO;.5jgR8å?+wc=,  @ @ @ @F~zĜ9, @JԪmUq;-  @ @ @ @ @ @ @.0{=ztVz,$ڵkY0QϞ=A> T@ J![=\VS(믿 ѩSӧOno}+6lZ_XdIuFqqquY?jժ_"Fo\ve[o8VJ @ @ @ @@ \uUgG W@V@iI @ @ @ @ @ @XcEE 5jT|xk"=Ն%KO~+G~ko0= @ @ @ @ @<3rx$ P*~wE$@ @ @ @ @ @ @,#0qĸ ǰabѸqe N%\wuW\~Y-[ZbM7͛gu6-[FVuѶm۬n˒8wߍ'|2:tPԨQ#.,$񨣎ʞokУ @ @ @ @X…k:W @* P9&@ @ @ @ @ @ @ F>s=7ӧO{ア^{L@uSN 4(?pQFea[ XH>}zL6-^ȶ3g,hҤI0ձcfmsѣGh׮]^Ww8xꩧiśxLJ~vX⋱[tM @ @ @ @. PkC_hiTeZ! @ @ @ @ @ @ @/^ӟώ]~,PG#xcذaq}ũ/4hLyŻロI&ń boƔ)Sk7hٳgYmݢqS^w7Ɛ!C”իWl&裏V@*{CL @ @ @ @@58Ĉ"-@#7=:ojuZP @ @ @ @ @ @ @@xbY ϥ^GqDY,#tO<Fr^zeWŋ/~ѢE8Um>#Fx f͚ަGozkl˜9sbر>U\\;C|ߍ>8t.M7ݴkVu~*ppѢEY_ ׿U_<$z+=x @@! ԪݩQZ @ @ @ @ @ @ @6Lz*zM4^{MV5 Rϛo^Ξ=;:,iȑ3t5׬q볃sƂ "'o}=# *kwqmk:7>}I')kG-ܒS]}ٶ[nqeE jygb_=\zUK/\Ýn!}ݸKְ{.=xʢR{l׿2N  @ @ @ @ paDZ @@U}ﭕ @ @ @ @ @ @ @kAscM7] 貐jԨ'|rtСRu{cmºRRU.-[;v,eԫW/ʸ+#믿BjѢEvaqԩS#Yh[lsN|}j*ŊʪίO_C 4 ,Y$j׮Z83cʔ) @ @ @ @ E"ѳ>  @@a*` @ @ @ @ @ @ @@xwqEEQQQ)V@qqqtodԬY3ۦ VJ뻓

    Y0T/ΚKqG j۶mvmo83҅O?t|L!Kk{7:(skV޻+l۷?gݙ8~7/2>,vmxG뮋zRS Z2xdȑY8T/{,{}E9g}vԫW/ 6lXtIuO=TYHփ>x1a„|{:*xx7b6Uo$ RX믿][ *zG+2vqǘ;wn;;s0_GeaS$R,ʠA?AҖ^΂~,|(t~qaY0׊tRS =K%ǥc)lٱtRXZSZO:vg }뭷ʜcӦM#tҽMÊJ2][㯾jghuU=c+ @ @ @ @ @ @ @ =:6lַ f-7|s&l&M)Lk- . ne]P4"ƌӟYfѩS,);{OD͚5VO;۷o\r%~Ν_̂y晨[n/? [dIt-j׮P-^8[Kjgg,HT׮]WW-oB @ @ @ @H_}U{(/2pc& @ @ @ @ @ @ @5kV l2F6<ҩΛ7/r˘3gNvkVZEJiܸq~ywRxL JQSL;/n 4wy:;,iܸqY?z왅|]}Y_*rK|g~e?֒Bʳ|MJ]vY?vʻ&Į]^N,,=駟ƿx㍳tQ=.͟?? ZXw}wv>ͳlw}+˻k2nٱʻC OKh)*txm͛gicǎ^\e+|*:>cgQsy?3_UH% @ @ @ @-h@6@ºfC @ @ @ @ @ @@۶m>ȂRSԔJqqqƏmQjځѣn{?JHT.Y?8&LuYqiVwovv}~'?_~Ud8]V69ke1cܹscƌkQFyneז[ѳk̯l\>0 @ @ @ @- PEG&_Hڬ̇ @ @ @ @ @ @ P`OB ԯ_? IAS_-N_|1JJJJ_WdgűN;+GqD6G4TZh/dܲT{,&MtP/sʔ)1x!W郬FihK3&J'O YX'@ @ @ @ @`-Z $@UPd @ @ @ @ @ @ @BhԨQ?_W+ F*o4 K.-O?gqFlfYg}?| w't~Ѽyo[,YdWe=zti&u]tQ`f̛7/瞮Io4|I!I~jGGecY~̙*};߉-26lwqGK%:*&O˯+Mofl'z?myZYfvtܹ61ݛZs8;ڵk01cTrnٳgv7xJsM;q/UVg,?5y}6u!4iR3' @ @ @ @@ Ԫ]/  @Jj) @ @ @ @ @ @ @@Y_ѱcw ;iҤE ׿{w\}08EEEq 'd2$R(=/KX>Uү_l.d?)x*M~GjG>)cy睑Sygy{챱رcੳ:+s=7VW +n4m4K.!H)kʔ)Y?Ϗk6vu,0+O۷os9q%d۵kzM0!ۖgm=t쮻ΧFlI^/~w~U%=/q}šf͊> k-o~u__t ={yIΝ;ǽ[)di~:H!J9.Vְa)-ݯ*}쳝氼kWd]@3fTyۤϰ` @ @ @ @HZjb @*( P 4S&@ @ @ @ @ @ @֏@:uVnE>e}&!<w\o5kl2z~믏VZe7?&N~x}YHUE֒Bz'tR :4~aLWy#.sy5Æ -Z_tMѶml Z4h |q_ςRp?cg)/Uwi5gyf6={fWm]ΔSHY*)D+ROڵkwy٘)|iܸqٵ+)_RX),9*GƍWxSDZo KJ iJgzѺu>mZ5\ 6̞Bj޼y+Wuʞ}x~=M4ɂϖۗwBR^*>}1f̘6/us* @ @ @ @ ZkCU PHE/e/-  @ @ @ @ @ @ @>8p`~őBx,)\pe/[~ )))8B8eCիWufAF:tX/O Lx`}N @ @ @ @TcW S#N;/ P r_{}G?rE۷,h.:P @ @ @ @ @ @ @j!SᄌKbȐ!q7_'SS ZYl͖{7M}=?Fţ>Tc+]JZ"|Yfղ馛~P땭7iҲe30Ud5l0v|6k,G[50|JaZǏޓ)-=)(aZu ˗sƛohK/ /.Æ |;ѹs|mW 4<0N:x+5myؚ.iuӧgcU?AJ9׿5 YLϞB @ @ @ @%paoz/X_+?'3 @ @ @ @ @ @ @@ 9cYhM 93ΈVZ7'f8Ccǎ˻XzJW3cƌT]>ׯRֹ>^175Ш}{YQ%]v;eʔmߎ?0;.]dAhGqDѽ{(...teVx: @ @ @ @%%]BlE//ݰ  @ @ @ @ @ @ =P 6,^y8#nݺy먇s9' IWM6_&Ï5*~ěo)hqEEפ[m >ݻw6zUjv) @ @ @ @VOq?!W  @` b~iDѷ&PA'@j@IDAT @ @ @ @ @ @ J/8RV_ł:( *~e2s̉KYf4lذuEvϟ-oqٗ ŋ#} /OlIIIU̘1# [u=}^cMrCS~ey{Zm>=C{W̝;7~iaZ @ @ @ @EA+:t oP(@rB-粚9 @ @ @ @ @ @ @@RHNƍk&~8C=#+k6}֭**Cgo=n喘={v|?1ڵkGj 2eJeﳕlM6RWˬ>N?,)͜93~ӟVbn?>xGim5 @ @ @ @X%%j I֑@\YGc @ @ @ @ @ @ |q]w7>`4i$8vԫWo3`Xxq<1|=z6mnNkl=#Yr;?i g6m=[^4%@ @ @ @ @@#n%bq%{?h{V[mUc*[>BR֨QbٱN;ArHmvl5zwYzk̵VisҮ]k׮Ux5~%%%qE9x`p Q~u?# @ @ @ @ A ,]QFĝwF|I`2*~jUNK @ @ @ @ @ @ @@̙#G?qӳ=#v}۷ol_CUA =c®ch`J.hn[ѯ_l*u))+BvyJ*t6q8瞋_W_" s_s|Wc7|3.8䓣h}N @ @ @ @l`EԮql`\T1Za*n% @ @ @ @ @ @ @R.]/b<#O<yi&ve,wѣGYfZ =oF~:)VZDŽ Mc֭#&c/k~UίW,Y^zi 6,ڷo^xa.uZb%7:z7pClVֿ @ @ @ @ P^WKA#"+o+ @UquZӒ @ @ @ @ @ @ V.\?|4Mr*Ԫ @ @ @ @ @ @ @u"‰&L>lVnjj,X ҥKգGڵk͛7_'s39skƍ˞˗_~9~Q\\:uo~;f[nՕKTՐ;GEiѱ㗵lV˖;چu}L~O=rox챈v[;c*G@VjUNK @ @ @ @ @ @ @@ L:5 ;vlYQΚ5+k\zPc-:d]vj Щ_~Ʉ֍\2ɓwߍwy'Rvi8qb̛7/H Jm:uj.][n3TTTn&[QM{a[cɒȅEmlV -/ёrS.0aB\uUq-'|{y䑱~ea}aKr1cgΏsZзo8bQVLk @ @ @ @ @ |ADVO=ѻw5Z @ ԪMUq;-  @ @ @ @ @ @ @UF`1~x뭷’IO?-]G-rCmM6/S[l7f͚۩)<(=~Mcʔ)_)D+KץR^9jеMu뭷֭[Gg]X ra[6vx/RV>d+msYtQX5_hQ?n!FN;k/ RJٳ#F})D+ 2$>왯wʬ  @ @ @ @{/rs3&b7[#@;ZӒ @ @ @ @ @ @ P-f̘Ni}/ )tiv̙QFl馑µ[)+_7on&ѬY3[r¯f͚|I5mڴjM!Y%%%hԨQihZ OK]vYPڦപTJqE>\6vK##ڷ_6dkm|{m7o^<1|0&M.k'vۨ_~gy&|x'bܸqR(XcΝ;|M @ @ @ @+4)b-#^x!gϕ]oZ*n% @ @ @ @ @ @ @`HA:SN͂.T6x+@ƍgZ)`iӦx֍78f6Zf۰ahРAu>sƜ9sΞ=; JY&ߴMh)D+NZeKṙfmV~Zjt_⋈  J[X-\\õێ Ys+s+d!U?x>}z-sҽ{vԩ4-}pH!))l(T>$*,XL/M\ςRVj:߯[nԩS'k.ݦ,~ ʿNK.ŋgAUeeSPzE";\Wk Jd)@+mSj V~jՊ+FS8ѦnZV^d[#1~a[)d+ˡ=Sۙ _V n2E4iRRMV)*ORIym۶͛gV)*}߷T=/0M| KTRP\ΝGYWڦV @ @ @ @ Px#rߑ7.K'@@U+PvZ @ @ ٻx^{of21 9aO@DRjV?Z?NW#HU 2؊" P0e0$$;=I@I|V{>9 @ @ @ @ JhN ZbEG]*u@R6ZjUGUҮ_m\o. )Zz%u*@%تչ.A`pRRRJ P3/PɀתlzT>ǵUr9`ޞ0!mv,X ͫ.{@|NWWS*r=jԨL@K r @ @ @ @ @ '%X|AW@֖>['  @ @ @ @ @ @ @%0gJP)IZ>?Ӱ[nIxֳg)Sr^]G>}2qj H @ @ @ @tc*_r @^+z1 @ @ @ @ @ @ @@SS2~|pB Wm͚ʍ7&s$/X;r![Ӧ%%͍9#@ @ @ @ @!vmm--c?vA6' Pks* @ @ @ @ @ @ @ @ M=V:On]2o^-lmLn!Ysdʔư5uj2dHѴ  @ @ @ @ @ VGHO{uKB̽ ,]  @ @ @ @ @ @ @ ɤIrI+X6/ Pk. @ @ @ @ @ @ @ @@rqB2{G?J.,)ʱnI=\s]J @ @ @ @=USw` @ 7҃ @ @ @ @ @ @ @X`РkR֯O.LfͪmJ{ֳod a[Ӧmhy4m @ @ @ @tOzVss\U @! Pkk( @ @ @ @ @ @ @D);V%<\-\s~| ɪU#F$㓖 @ @ @ @ @ۓ})z۵7 @ @ @ @ @ @ @'R+֭Kϯmmo)yZɓka[z=thѴ  @ @ @ @ ZZ @ @ @ @ @ @ @P`dZ鼌Gö~ŋk=LLi ٚ6-:5G *ecҤU67/)A\oƎښRFx4 @ @ @ @vwi ?O @ @ @ @ @ @ @]`ݒR^Ʃ׬IzhCV[[rW'˗R ڪl)SsF @ @ @ @@X>ij{  R^Ju @ @ @ @ @ @ @ M޻V6zl2kVd޼dݺ97.6Uz{ȍGsN @ @ @ @@OՓޖ @ R9 @ @ @ @ @ @ @ @(0bDRQG5Nɜ9BJ֝w&_jbEalɓ~sF @ @ @ @@(Zo]VD@i, @ @ @ @ @ @ @ OۯV6' a[}Id„k6ֻh  @ @ @ @*}ݼ @`>f!@ @ @ @ @ @ @ @]`ԨcizdΜZV=pۓ/})yZ]v4doM83 @ @ @ @@mkt{  @ @ @ @ @ @ @ L߿V6GYö~\/?ӧK&m*![IKc ̜937xcn喴dnr5}#W\?2 @ @ @ @=[@V~VOL@+sҋ @ @ @ @ @ @ @{rq}dZV=p[K/M^xw7kCJ=qb8-X_eÏYٿ2eJ-lU˸XUIKs]weʕ8Gܹss1dŹ`=r+̭ޚ'GI+Q+eѢE9<Æ -a]W_}u Pij;,<@U^V߾}O|"3gwQ}fL4)sNx≼mo~U^^9w,_Ʒ-9-Y$\rI :+'xV"@ @ @ @(MM @@ջ߯ @ @ @ @ @ @ @ @n'ܜLP+o|cy1dmUrCյõ:וAO?t^gwXLuoɓZwW :3aU=~Y~}/WCnj???OOOyX]w]?__d…id2>j]B:tM~U&8袋_:';X)ZgN;픓O>9oZmN:so|0~w @ @ @ @ @@ջ߯ @ @ @ @ @ @ @ @%0lXrayI%w)mm*M`dɒZρS7 jmM%ĩhݫ}#<uUWd_e_]JY +rGT/92wyg}}3Ln^kua?5\}s1TΝKV:th>OWøʅjV Ԛ9sfN;jn5hРj;\ ƪ?e洴d :XBʞW{ͧ>)Z  @ @ @ @Z`z6O;@E& @ @ @ @ @ @ @L\+'ܸNfj ַN֬)APɞ{&%Xkڴ1cjG~g+tbGUf?#+!`;eΜ9@J8~r_z+idzj>&M3<%ee}%W @ @ @ @ @@߱ @ @ @ @ @ @ @ @^-.k_[+7vm2wn-h_&I *G%qԩ>ŋWC 0M>}ra'?IfϞ!CTTV˳(a]*:th]%-%l@5Pj@/b?3%kر=x=3fH :SrWþ,XPxrF @ @ @ @Pvm @ @ @ @ @ @ @ @`(R%(KkA[mmN\̛'MMɸqgMkGx-?yS}̟?2gecƌc + Ԫ?_AeŊ`֍ U6;a„7i|9C~jժ?_jVR>яnJ+2'xb>[oۿ[/~gMٿ @ @ @ @ͽvH @ @ @ @ @ @ @hm8y{~6dΜTB&}K%).9ؤd\ L]?S*aS$/8+9ׯ_'|2o_3g <8wrvnݺyY`A5  @ @ @ @ @w  @ @ @ @ @ @ @ @W!Pɷ>$w^-K%*1#?SWJHT$%&%ozS\qER2-z˿KJ`jpU=Up^5tjA~mgʱp†򑏤?sTvGf„ 9C @ @ @ @M+Gߦ @ @ @ @ @ @ @ @Uɜ9ɬY`5>[s56VUBn馼=ɘ1cr1T<~5jp_W;vln\r%@fݺu>}z|3UW]qn#ղKVXM}'Ytq.\V)sU#ҧψ >>v]MK5d%j @ @ @ @ @m}N @ @ @ @ @ @ @fCM)SLs]6K,p=3wSCZ[kh  @ @ @ @ @m% Pk[ @ @ @ @ @ @ @ @ƌIJ9ƥB2{vc֏~\vYRjMiV *A\ @ @ @ @ @` jֳ4 @ @ @ @ @ @ @ @@4(9Z듅 Yja[mmWc}&''n y4m @ @ @ @ @ zR @ @ @ @ @ @ @ @zdZyspa[?A/$ViV ?>iii @ @ @ @ A@ - @ @ @ @ @ @ @ @/)0xpr!ҹӺuɂI[[n)yZɓ75thѴ  @ @ @ @ @) Pk|vM @ @ @ @ @ @ @ k]1dmpCCɋ/U jmmǎM @ @ @ @ #޲= @ @ @ @ @ @ @ @tСy#¶ڒ$_,^\9p`2eJcִiԩG&@ @ @ @ @=_@Vv@ @ @ @ @ @ @ @ ZZIjMoj\eUws5kj}3immz\ojj @ @ @ @ z[F @ @ @ @ @ @ @ @F`睓Λ^6y ![%lo~3yZϝvJNmCJ] y4m @ @ @ @ нjua5 @ @ @ @ @ @ @ @6+ЧK!%KYö67/)A\MM^{ՂMKa[=zƣ9'@ @ @ @ @_@77# @ @ @ @ @ @ @ @*nI){]k$=!l-꫓k} lu*)SsF @ @ @ @@m%k\ @ @ @ @ @ @ @ @],зo޵R/NJV)fꫮJK֭Kqij[Gx4I`y /tԫVʕ+Sz)eM%ɭ\kooڵk7[_>+űi\@TK>}6뗾|;WT;N;AU.: @ @ @ @::{3 @ @ @ @ @ @ @ @2#R:q /̙!dmygկ&+ViV ۚ<90Y%)˗'=fse˖駟gybg}ZVT^h]{UB~QJ(U `չ]*+iVRW.}7X@2;K3dȐj:thC{X?|je]RJW @ @ @ @zZ @ @ @ @ @ @ @ @z@%)W+o'ư;H,H%(!e„k6ֻh[ᇓCI=7GvzcwH%jѢEy'%Kx┺^.]zU²6U:@ {t*vPRwn8UBJo߾]Ikp+WV /Z:;=̩$Ɋuyf㣄]+n%`o\FTc9j7wSq @ @ @ @ s @ @ @ @ @ @ @ @ @ T*aCa[%xkjV6 *['δ3מ-ozU}>~K Zpa{MJWO?0H~nUu k*TJ=ȩwy,M [d͚5Հe˖UU=جRJY=^>khnn5jԨ3f^{Ut%i=3;X1z+sVC.\QW j+msXUµLQ&OS| @ @ @|.K.0Y ,IFHfH>vO4 @ @ @ @ @ @ @ @@ Z V z%puo'{]oraVRJ`֯̓>ʂfU/V>|xe=J 7*!Z%̨'p ж?UJ ssZW9޻2Z>yk^S jj$9 @ @ @zkHTjmA֖y @ @ @ @ @ @ @ @(쳵zV *RV~T$]JЦ-[{キZjV *Y%kĉD4PTvm\!Wo.|.\X]Y w}Zx`>p4hP @ @ @lN@T\#@@E֖y @ @ @ @ @ @ @ @.xT^"JV{{wk̛wG򗿬Uc=RJP oAZ|I X"oTK +ew!ӫ 릻, @ @ @;@])=_@֖CZ[nI @ @ @ @ @ @ @ @Xg?K^W[WIժK뮟QG-ɡ>Tv4Gy$w_5\{/~,]4A??(c @ @ @\@V @+6Xf&7\ @ @ @ @ @ @ @ @ @@whkK%$+ƕ\X걨JpVsN8adN9eߌWرƏRַv@;?$͜93\rI֮];w\}>|x3 @ @ @ @T@֖y @ @ @ @ @ @ @ @.5ܼՔu^rH7I'^ :6}ɕ.ic![~zu+WdƌrWTO^;)ozӛrVz- @ @ @ @vWyVB @ @ @ @ @ @ @ @XjU{l^{~~V hp >iiiy#J 80뫥+?O0ַrg9Ssi娣7r @ @ @ @44 W @ @ @ @ @ @ @ @ @ [.v[|{߫)O>9K7]e .̍7ޘ1cF38#z׻r衇~;$@ @ @ .,dm8  @`,Y'*C040;Q @ @ @ @ @ @ @ @zc=O;vl^UW]%_rg o{^{}C[+?8]tQ|>K.$˗/-۵ @ @ @ @, Pk+ @ @ @ @ @ @ @ @'_2~zƏ[n%ԧhѢ|ilɌDV>|xwG?Q.\w]1csɼy\"@ @ @ @z{  @ @ @ @ @ @ @ @J{͉';,͹;s=@ګj3zQryeΜ90ٳggԩ933޾}#@ @ @ @x^!n @ @ @ @ @ @ @ @l{ŋ笳3rȔo~m?ؖMMMyߘǹ뮻dɒDV\-66 @ @ @ @@^% @ @ @ @ @ @ @ @og}#Е曫LpASn%dK_RN>|sۢ1^*}cvWW@۝y{ޓ#vY @ @ @ @vME @ @ @ @ @ @ @ @@??{^n|7رct}ٮw~f+w#ݷuUsssJn[;p myC @ @ @ ﷥f O @ @ @ @ @ @ @ @@;wn.\uUg}rצL}Y|yn\K?7tSsϔ`#Gι瞛kצ)gqFN?.yߟO<1Vʥ^++W=zf-ʘ~uСCsW.Y/C YgUcō[-\0_swg7n\>Ͻ/}#hѢjp? 62Wsꩧ?AE.jvi袋RZ|#9}GU}@%^H1A:(R"O[Y,C Uz54#HBO(I(R'̓@ I7u}kUuCULuQ7Y=2?{\~ysCUkYW_e]G}4[ouNj˽G}4=PO[?n={̆nXS:{[ X+yW9>p^¶}OVaO[neuWdJ+TM.gUR޽|U=ܓv57n\T"ꫧu㏳b5۔JS 1bDN;?ԝtu9:/u)n%䪄PeΝ;x Yr%q իWw^[eU*FVͿjU_ciR6rxW[]v٥ xkG8ov M7\B꿗N @ @ @ @4@&^ @ @ @ @ @ @ @ @hniJӫЦMϔo~ Zsgs<ȪѣS>U™b}6lX Uq *XC&lRjW.~_d I x ӿ`5hРxs /.]';?%n۷رcg7ήnv:4.8yg5oK^|Xf޶f|C+bujܤ}x^Xe}ٔ`: @ @ @ @@h/aZμ͔ @ @ @ @ @ @ @ @&8#+TAMM\|luQ0aB?nPӽ{*tiȑy +T={lt/ΤIVQ;uT>eQF5\ԩS[g?0rH5}{%X[Y?W_]v%*f묳<5^6je|;7T=YgΝ;gRG @ @ @ 0jGL] @ @ @ @ @ @ @ @ 0zN=s1yfҲ;o>_]w5]t*/6xk4'x";vlx^pv/˼߿JUيK,*O=T}L6-|p^{s{R?#rT^sUL>὇z(?ϲkT瞆gO>itݶm>h?eʔ̵lgyf|?~|uy|1g7RJ}֧<2bɬ`ʆnX;cbWVVzkw^P+u @ @ @ @` ZF @ @ @ @ @ @ @ @ @s~gvm'|sZ5?xP~7skV{wZoޑGg])\=+?I'ݻWyX/~w1?sQGUH%㎫_W)}oYuU7.f5+"s}ݫ׷z/ѳܹsN)!I%@m~xԩSn 0 wuW5Q?_W~Jׅ^s=7~z榛nJ:SrWO?c?QqqN5 y'N &dĈ ݔr߯n/_[RY, FY?(Ak%dkXz饫 ; D{_|1\rIy䑪)sqs=k,u @ @ @ @,$6uW i, @ @ @ @ @ @ @ @ @@Vo~3%਄D-Rsըx1hР 8 FzW3v[CJ)P%__r%s 7駟JPV{ェb]WJH[l=أ +T-ﰌ׫Wt!;s]1I *+R6hZlf Os9O @ @ @'ޛpBs^hY&$gSJ˚muۗ @ @ @ @ @ @ @ @% ?aT?뭷ޗ&/!LK/,k:uj*ܩL-l7'7KV *aO%pn%ĩx㍬jiݺ5y*j5H6mR¼J0\BZBJMݻwҦSPҶ\wر&9nźey1.bCBV]uYαk׮U]=fna߼{r1Tyg뭷^% @ @ @@4(80uYHh1cO3Nms=yZsM @ @ @ @ @ @ @ @躿u '{zUâ駟믿 ԥKPT5|^Vq,ڮ:ۮ~ӟm 2$rJ'?~כ:lf5 @ @ @+ Pkz_F@ּ뵝WI @ @ @ @ @ @ @ @+УG/I 9餓Zke}ɀҧO;X mw:3o)tʔ)y׫'N:|ak׮9gfm66̙3g}v\ Yy @ @ @ @iVud"=C#@ @ @ @ @ @ @ @ @ %Oj^୷_ . C 'UW]kW  @ @ @Z4(80=V*R|1II߾Y Ԛ{ @ @ @ @ @ @ @ @Ԕo?OU ϻロo|ww=-XMժy4iR&LШΝ;M6}ck_;kV<*L[n? @ @ @1Z5 !@쓯}k~  @ @ @ZA-lKf(0fLңG2xpҷo3@,P M @ @ @ @ @ @ @ @2eJzr-曫`Ν;gmM~0M;m۶?@ 8qb}Ѻ?4y䑔߽^nU&lVZ@S&@ @ @ `j-X_ @`~ ԚwMZnM @ @ @ @ @ @ @ @jT]wUw}w^{t)oyjj/={(@ yǪXOWZ뮻n~j/auݺukbU@ @ @ @`/ H Ԛ5v$@ @ @ @ @ @ @ @ @1"<@h{ 2$%Pl.lfz뭗u]7;vA9 |UСCSgyǎ֭[gΦn-"}~ڷoߜv @ @ @@EbM" PkM @ @ @ @ @ @ @ @4O_<}yꩧ駟mݖs9'|I4jUZ묳N^ʾKwHf|ͼ 륺yk2r䈪%X ` ~whҩSB @ @ @ @Z@u[˚ @ @ @ @ @ @ @ @ @`LaÆeСyW{W֭[UW]5e_a09M+s.0yyW/_l_z饌?g-u~.]emG;f}6[Z @ @ @ Ф%&G7i'@e@IDAT93&#<8w^ФAmÙ @ @ @ @ @ @ @ @h$жm|+_L6-Jhk]vYiprիWu]\qܵsرc3r*4kĈ }|eرc`w1sL\sͬZ)X+;窫:;I][~'o^5 @ @ @ @@ ^5i'@ @ @ @ @ @ @ @ @"$0u*n_^X&M0.]ԅ_˦gϞ)[n 8i;5jT~j?7o8a„IVUjV7ҪU;eذ. *Zk=='@ @ @ @) JLFnэIs#0fLңG2xpҷܼ@- @ @ @ @ @ @ @ @iӪ U“>-{j߾}^z,2Z*K.dݻwO׮]ӦMF?'Oرc溺U}݆5#%p~kݺu%k喫fW+%Dچ I.lFV]W649䐤ԍF/ @ @ @s+ PknŴ'@@ Ԛw{ZnM @ @ @ @ @ @ @ @,0I&eԨQUV9=!i搦> ӧOL=K,DuV%`;wnػtRv/xީS;v[خ]όS7ĉW{9?~|O0裏fܸq {.{ *{.}z+Y%Ȭ>gGٳgJV9 W'|prlfKqM @ @ @ jKh ZmUo @ @ @ @ @ @ @ @ @h߾}zUs2ԩSޫ5shT *!QSLp%8lu!m՟׳:/yLKw*zK`V'Op^f4IKX 9p5XQ0Y}HY9VZ}fq]Lgɵ&K>RK%qD:b:$@ @ @ @h) @ @ @ @ @ @ @ @(UK/t\ W{ *ĉ©JHUu}է%ت]@O˽p5^³oSwꂫBJ0U^նm*kc99ȫ>ЫKb-h/A`^NUҏm@G:h>bDr$m_  @ @ @ @Qם @ @ @ @ @ @ @ @ @ 뗬~;zc e;cF֡&G @ @ @ZA-]  Pc$=z$'}~TaZ*F- @ @ @ @ @ @ @ @ @@ kE;\ye2rdr'뮛CrԩW @ @ @ @@V*%@ @ @ @ @ @ @ @ @M.2~RrI~%uVM^ @ @ @ @@fhJ&@ @ @ @ @ @ @ @ @M-к/{r{'I^1$/ @ @ @ @9 jNV @ @ @ @ @ @ @ @ Pwȑɯ~{ɞ{&=T+ @ @ @ @jܒ( @ @ @ @ @ @ @ @4OΝK K65*zdmnHOoR5 @ @ @ @@ @ @ @ @ @ @ @ @Z@뺿n'ݗt>z =6Eq, @ @ @ @Ԛ$M @ @ @ @ @ @ @ @ @yv+h䠃uMdʔy[ @ @ @ @@EoM͈ @ @ @ @ @ @ @ @Ԝz%[V[%Gvr%ԩ5W @ @ @ @@ n8 @ @ @ @ @ @ @ @ В\3dذ_ÓO2>%˘; @ @ @ @e jo @ @ @ @ @ @ @ @ @IV]5޽M6InI1( @ @ @ @@ j0< @ @ @ @ @ @ @ @hkoɳ&[ɓOds'@ @ @ @<Z-o͘ @ @ @ @ @ @ @ @Ԝz%_2aBf$^s* @ @ @ @`Z$@ @ @ @ @ @ @ @ @M`mN*ydu_jFּ- @ @ @ @ P9  @ @ @ @ @ @ @ @ @@ gNL>{F嗷0%@ @ @ @ Z-hM @ @ @ @ @ @ @ @4'NHOv!d9B @ @ @ @s" PkN!@ @ @ @ @ @ @ @ @Lg GI>0hS$ @ @ @ @gZTw @ @ @ @ @ @ @ @ @'y䬳?!Y;Xz%@ @ @ @X @ @ @ @ @ @ @ @ @/!ЦMrq'lSrر_S @ @ @ @4@&_ @ @ @ @ @ @ @ @ @s+Wo9Yo  @ @ @ @jE@V: @ @ @ @ @ @ @ @ @gO{Kƍn@ @ @ @ x O @ @ @ @ @ @ @ @|9%L.$䦛6Jm @ @ @ @+ Pkz @ @ @ @ @ @ @ @X@V2thI~''S,tK @ @ @ 0_jWN @ @ @ @ @ @ @ @ @M)УGr ɹ&݌`#"c @ @ @ @̉@9Q҆ @ @ @ @ @ @ @ @hV?A'oxc*_ @ @ @ @' P-  @ @ @ @ @ @ @ @ @e 92w^o3X 7n\.?vXL>}9XoZVL6kI @ @ @ .D @ @ @ @ @ @ @ @ѣoΖ[n9 2eJk; 3jԨ|ygrit8w:n]mM>:2$ߓ%~&@ @ @ @Xlz'@ @ @ @ @ @ @ @ @M+лw*TѦM^/u]9Su]x:7Kx yd͒g~E @ @ @ `j-W @ @ @ @ @ @ @ @ @@ n=WiSN͟,r}=#;ន(AZC$+lMr-M_  @ @ @ @fA @ @ @ @ @ @ @ @jE`ҤI?SL.G %>#K'z|;ix^N&N7yӮ]UVձ3fL9<ܹs9䐪spcw;쐙úV\qtڵ.jms?sP,LrɑG&{쑺-9؅2A @ @ @ @@ @ @ @ @ @ @ @ @ @` Lazl馹gwM7ݔ;*sO~wy9?1ws5+ڌ7.m][n\}yW^yU[N>뮹 } zGg;2֧ly뭷O?wtukd5K:%]Bњ&# @ @ @ @Z@? @ @ @ @ @ @ @ @jDGOͰaCsSNiҧOδiRB <0vXUgGy$W]uU.z 2$/BuV~xU??>ˑGY:3կ~5rJuϮo>c *cǎiSo>S7N:)Y}C7L}ڨM @ @ @ @&кM|  @ @ @ @ @ @ @ @ @^2t׿^iW_N֭SB>l.RxfVZkЮs`7.]w]lf~G+%X7M&L0}嗯-_&O\*jWNn-LƏZUF @ @ @X.ʓ37 @ @ @ @ @ @ @ @hsmM$ݺukTp۶mSձkͼm6a2zW߮iKȀYh׮ݬn7J+U}Qwu=.gQ[_Zr=IfqSvUj @ @ @ @@E}͏ @ @ @ @ @ @ @ @B`Fխޚɓ'g0'M6Yfe<9f +T={̤I!CO>I՟tԩ:}o5'LPavmkəg/7jR0f̘l]޽v]w%K-U @ @ @ ^&d> @ @ @ @ @ @ @ @ ZPL!~.첆 L:5p@xly9y'뭶*+b\rɔUM2:6mZV_},ꪫSO7Iyv_ϻロ#Fv/!_{gy晼 }=U׷{Nj_`gj}`F @ @ @ ZMX!@ @ @ @ @ @ @ @ @֭_:u޺?mڴ^z\yO>zow̝wޙk&{wu{^n 6,ݻwϙgO<1+r.,R9c5ps=Ν;gҥKgy~YgͲϻOfm~tA>|xz衺֟5*+I߾IϞޒ]kPe @ @ @AR:ѣ[̔MV`̘GdN oc @ @ @ @ @ @ @ @|F`6qO?=]tQ:v옓N:)?^uU9sv&Mg}6w_U?ͻロs9'm](3dN_*F)[ZN;w޹sa{ aY׿U֜"XUWM]ڌ?j3BXƊT @ @ @ @`h5n[d: @ @ @ @ @ @ @ @ u^Ͽ2eJ^{Ji׮,gRZYb+a[#GLy>a„*4SNZ~Gyꫧs΍śoYi00[>O$+2m @ @ @ @!za b  @ @ @ @ @ @ @ @ @@sh*Ҥ{dsO>i3R? @ @ @ @vjZ @ @ @ @ @ @ @ @q.]O>jX @ @ @ @@fXJ%@ @ @ @ @ @ @ @ @^`sM9'喦G @ @ @ @EA@֢@ @ @ @ @ @ @ @ @,TH:(9#@ @ @ @,e5) @ @ @ @ @ @ @ @ @`A t:#TkA @ @ @ @. PkQ_a#@ @ @ @ @ @ @ @ @@%$wܑ/ d @ @ @ @Z@&J @ @ @ @ @ @ @ @o~59ddԨݻ @ @ @ @-Gm˙ @ @ @ @ @ @ @ @ @@-\zir=+駓o|k|Z#9+j: @ @ @ @@N$@ @ @ @ @ @ @ @ @"#Э[rIIV#3MKOON9sWjQ`œOv%9ZSM @ @ @ @ZD6 @ @ @ @ @ @ @ @ v99)YSz/li .#2sg|_/ @ @ @ @Z@L @ @ @ @ @ @ @ @&h.wru_9{>8ϯTE @ @ @eZ:j#@ @ @ @ @ @ @ @ @"*pɟ?iӒo{BX#яSOMƎ D @ @ @]Z6*#@ @ @ @ @ @ @ @ @"+2zz2N~IϞ~.Z/ӓT @ @ @ @jޚ @ @ @ @ @ @ @ @@ :]YOf}].еkO?$cz#@ @ @ @Ԏ@Y  @ @ @ @ @ @ @ @ @E L)}w4()94I @ @ @hzZM* @ @ @ @ @ @ @ @ @@tdUOMdݒ]wE9 t'3>9UV @ @ @ @@ j:{# @ @ @ @ @ @ @ @ @ rHҮc6-9w@s8d Mػpro@PePRpDMs*C;H1RdJMOcũT gDs(8"*8 ("2Z:=u-l~ @ @ @Ԭ@ @ @ @ @ @ @ @ @|H`B*/l'GWm.8Yr @ @ @ @@M Ԫ)i @ @ @ @ @ @ @ @ @'6wܪ "[Umi߾}ձCرcC屸ִiӏO3eq׾\}@e3 @ @ @h8 @ @ @ @ @ @ @ @ Q`y<ӦM /_|1GB\s2@j+CfpЬc@UhѢդ"+MT)fϞ7|*d87BĊ0'fԨQeXU*eVΝK.x㍫sf#4R3FN @ @ @h~q @ @ @ @ @ @ @ @ P,YRcM<9&MO?S{U/6mڔOmQ铃:(E(Twԩ Zm@E+mkժUcǎ˼Ɯ9s`^z>}zy,Ǝ[A]ViƛmYw-={L=ҡCe^+Kn)n:#@ @ @ @|Z_Dϳ @ @ @ @ @ @ @ @Xg3a„z˕UMEnVvZiZ+;kb/±>m+B^}dc=k֕RQ^yȑ#3jԨfmPC=4ݺu](KI7gB @ @ @`.(9deHY{MS7 @ @ @ @ @ @ @ @uJ_\yygҳg|9שZS.\?7tSnƼ#+S_cYI-Hͥh޼y .ȴi2f̘93_z_+U{MV2&'@ @ @ @KZ) @ @ @ @ @ @ @ @3gN9l&9#Ӿ}yy_*[nemgF"ФI. K/kܹsˀ*Æ ˂ Fhi_}*B&O @ @ @ PjRZ @ @ @ @ @ @ @ @k"H3Fms=7w /䪫JSԆ@-r!dȑy駳fm.,~meO-SnD @ @ @h@ @ @ @ @ @ @ @ @|EP]O?=׿rꩧC?jP6mZ:'?[lo@Z]  @ @ @ @W@V}:'@ @ @ @ @ @ @ @ @`&Lv)'xbN8L:5w\Zj OB^{viygC^zr@<,X @ @ @ @> @ @ @ @ @ @ @ @8ۧsΙ:'PYf/Yĝwy9KC/HVC#@ @ @ @VT@֊y @ @ @ @ @ @ @ @)PhM0 vmEov&Ogɒ%Vsm]kMkp[r笳]xtyV[-i:y}x @ @ @ @@հ߯ @ @ @ @ @ @ @ @XÇ7ߜ].Ǔ;o߾]E,^8{-ZTuԧkn<=P}v  @ @ @ @U@Vr @ @ @ @ @ @ @ @*OΏ͛j?Os=dɒ%ZG}[۷я~Tu-[&O @ @ @vZNjB @ @ @ @ @ @ @ @7ޘ7x#'xb#믿\׿uV/iӦ39眓g}r?f)?7sWM㏧:묳2~ 2$_ת1>|'?ϲpr-9蠃ʺ;?=s9ckwuWܟu2{\y9/Ck|+GW{9C~i3f̨zyxs1ygrUWeСEeĈ4hPƎ[5gqR;կ_rݿ_>﫨s„ uFQC{UM @ @ @ @Y24 @ @ @ @ @ @ @ @ X{.vx_җNH=r!??}/ː"ꨣ*w Ep~Ϟ{Y>eրrgvԩSl67n\u'x`nw}wOMXuդGF @ @ @ !:wJ @ @ @ @ @ @ @ @F+P mᆵϞ=?v&Mһwk_sO+ɏ~2l*b;SR׿\=Ce guV/^1cƔ@6mڤ*>_uUׯ_y*j}GO<1lAUmUnwygVT-V]}k_+tI1bDbUC=j"'(j28m={vV-+"wʹ> / >}zgoȑ#PW_}5b+µ b-Z*[hQPC!g/raRj^Qw @ @ @ @hO @ @ @ @ @ @ @ @(kKuN:iٲeJUS6wx㍹ۗ!C馛u֙?~ZjUN_.ye̙3?t᭲"iӦqUVd…_>fڴi)z[ݻW=VWWXdɒo:v}L: *^Zkf9wUu֭<իWTPQlE(Y"Υ^Z^c]筷J3`fͬe @ @ @ @@}U_ޔ:  @ @ @ @ @ @ @ @XEԃ>EuEU5kLSO?]zy}ܸqygR+B>m[z=m۶͟2ꪫʷj_EpXe-4o<;cҡṙAa-Z!m}gό3R?6 @ @ @ @% PK @ @ @ @ @ @ @ @@8kNյ2Ym}O,3o޼꫟Y>Yc۴i!CaZSjuQ k׮]ӧgڴic/?w#׫È#>裏.úw^]SW<_|q[on: @ @ @ @,@2 @ @ @ @ @ @ @ @+G'tR|}*zj /V'niZn뮻.ƍX /T]"LkѢEUW]5?OZkeeNh"{.=zGzҪU9,Y9#>47Q}wᠯb{7cONRE]~e&Mzg[o 4aQGuTy;={vy晴o>lMzozdMR9>f̘jvm?Qkk&Æ K˖-?q.hE… Kb¡Ǝ~޽{_\{yS\abű+BnO.^xa{L<9]t_?cab]1v޼y?~|:wv-w}w=5*=z5{,eW|{2LoOV1cI`T$[M @ @ @ ଳ:eغ뮻1le*>vG @ @ @KӒ32e3f%'ޛWgʪ4U* @ @ @ @ @ @ @ @5(УG<7:_|q?aV͛؟Y ?7r\֭ӻw}M˲!a6\TWߊвo+R_yf*B*Rjp+>V}_"P췿mN9vaj$Ty @ @ @ @!b-8ltI @ @ @ @ @ @ @ @@#رc瞜uY4hP . ݺu*kfN:ϭs1=KX6gΜm6[mU>^G]=jjx {lMViuQ5u @ @ @ @,@eb2 @ @ @ @ @ @ @ @(ЬYz9Crg-̷lPgIV]uvau-Zӵk2?^k]?OOfܸqsWd뭷&l5jTϟ_ۥZ ̙3'7pC>t1}]wݕ}{ygnZn]O;T6 @ @ @ @@chO @ @ @ @ @ @ @ @ݻwsرcs7[o矟V[-[M6@2]ve]뮻o߾nꪫjL[Ν[h3&^i͛7/]t{c=6{wڶm[P @ @ @ @t$@ @ @ @ @ @ @ @ @ t)w}ɒ%0aBフ=:osI'eUV[ow1})øze#ϟ'fرy#dYxq6h|_/]v  @ @ @ @@5-j@4 @ @ @ @ @ @ @ @GI&epV5tgy&=P!Kӟ`l2z*oV^{YZx饗"@Ǐ_g-\0z6`~iR @ @ @ @4FZ @ @ @ @ @ @ @ @:'еkGYVi=;vlƍ &k[oUo߾}w=z6,žgUVs5}hOgʔ)ehVq*s'?vmnݺiӦ Fo @ @ @ @Y@2SH @ @ @ @ @ @ @ @hѢEvrӦM˓O>Y6M4 ںoT [+M N.7eMZmQyܹs}O1m͛ӧ_ /_ys=3fdɒ%;v,wWg[ne:t I @ @ @ @ j/] @ @ @ @ @ @ @ @_.]Tfuɾ[DES:k~_%M.i{$⃫ ,ȬY^ <+2eJz22ĪZdg-5mڴ *>֥Ku]嘟i߾}:űp @ @ @ @ P;jݪ @ @ @ @ @ @ @ @X." H]vIn9Ij[h_ܗ:3naZOeVq,{/-.\Xu^y֤"Ԫ؛7o^u^yz˖-?UhꪟQx7wyg!\6 @ @ @ @ꆀ@TA @ @ @ @ @ @ @ @Ox䪫&21c>jbժUr2[nokr碋.ZX7 @ @ @ @YZ5m5 @ @ @ @ @ @ @ @,o'c% L}ꫯΡN:g?RFL @ @ @ @@M ԪImk @ @ @ @ @ @ @ @ @sfL~䢋 ~79d >AYࠃ(C )CH @ @ @ @r\J @ @ @ @ @ @ @ @xsaÒ6m(9ؤ]eӧcɆnw}4 @ @ @ @! Pke @ @ @ @ @ @ @ @(0vl$#F")9dUe83C̓>=z\$@ @ @ @ @ 4b{ @ @ @ @ @ @ @ @VD஻J.y+S_֊x3M4ӳg~5k֊L @ @ @ @A@V5  @ @ @ @ @ @ @ @"xqru'{,Zɸq'͚-,To9EցW"@ @ @ @ @`j-#a @ @ @ @ @ @ @ @XQ"˒n>xGJkEg\u :[3eʔ <5 @ @ @ @!|9J @ @ @ @ @ @ @ @!0{vr%$Am%mZ#ݻwψ#{W^9kd] @ @ @ @ @- @ @ @ @ @ @ @ @T~\vYҴi2dH$W Z;/?PۯZ7 @ @ @ @Ktw @ @ @ @ @ @ @ @ \S$眓\ye:ɩ&rMcp- :4ǏG~8ݺuj,M @ @ @ @4m< @ @ @ @ @ @ @ @+G{A%={&<\|qɉ' Z9+wK.$=zȁzk.fv @ @ @ @JZ @ @ @ @ @ @ @ @XAnK7˔)wI|'ib'X ꪹ2wqYdIפ @ @ @ @ ]@VC#@ @ @ @ @ @ @ @ @Z.L2+o{f-6J.][u1#FȨQrYgV%@ @ @ @ hUy%@ @ @ @ @ @ @ @ @̛ɦ&'o>3nGqskV[m/2g;s=7/rw D @ @ @ @j8R' @ @ @ @ @ @ @ @^K~Tg%'x`3{E%5jTڶmV6e]:th>|̌3BIj @ @ @ @ j5ת) @ @ @ @ @ @ @ @iIERtI.09_^yС]u\//C?,\W< @ @ @ @S@V|o&@ @ @ @ @ @ @ @ @`% LydҵkrAZe r穧ʨQ*¶*Ҷl ^M6g?YW @ @ @ @jC@Vm[ @ @ @ @ @ @ @ @:'p}ɾ&[oZÆ%> zx⊠#oO=\ Zy[ne.œs9;VBf&@ @ @ @ Hj5m @ @ @ @ @ @ @ @vJv-y[?ԪJOcrn gF`׿A^k4}k @ @ @ @@MԪ ek @ @ @ @ @ @ @ @ P,H.<39䐤cL/wOz'fү_Op\veiѢEp- @ @ @ @' P,D @ @ @ @ @ @ @ @@3'9d㍓?edҤv<̜wy+ Wk*#G̅^h( @ @ @ @- Pke  @ @ @ @ @ @ @ @Zx䓓 7L8#80y˓ݗ^%\SN9%]tQ3TRvꩧOO< @ @ @ @jU @ @ @ @ @ @ @ @ @n LsLFɰag 9$5_}9rYgeȐ!=F'Pm64hP.\0 @ @ @ @Uݢ#@ @ @ @ @ @ @ @ @{,9찤{ .H䓓m?[n J:*xFc͚53y2tc}$@ @ @ @ @`9j-' @ @ @ @ @ @ @ @]QwOI>Iz*9昤ee!R=ߗdɒ?_ h|0_W?~g u @ @ @ @9@n @ @ @ @ @ @ @ @ P- 8kmN5K3yÒWV<p@zKa\i\uh[xq&NX7:thvi 4( ,T@ @ @ @ @ ,zM @ @ @ @ @ @ @ @@x⋓7O<2-XɨQ/_E8UwE";1cƤw7I nV6uL<"(̟]xÇϳ>38s@ @ @ @ @ Owq @ @ @ @ @ @ @ @:*ɯ~tGJz*IvŊ>c#Tru 7ܐ-Z[۶mkmMlI~_OӼy\qYdIn\uU1bDUWvueep@EXEtM)W_}"tlr5\c5| yWcɘ1cҤIj @ @ @ @@ӪN  @ @ @ @ @ @ @W@IDAT @ETETEPTri%/`z7;dȑ/~ꫳ[(nC*¨>?ƍ+ì?;ND@D,(( % {E4vhM4jĨ55VlX.J=}.}3g|<'tRɓ'G׮]y3f̈}ƝwޙIZx`fuae!XÇw9^=iٲe <80aBիW̝;7:w_}U 4(KZiKzYhذabرa]СC0{db龭x*WrK?Ɏ3Q @ @ @ @TgfJ @ @ @ @ @ @ @ @@Y(Ȼ*h. B"n5 *>;bMl&~|q]we!Vݺu; JAV)j…ѦMTR`¦n-xC=?|lYW~ĵ{ƕW^ݺK<={&M#G^ʎ)`x>8)H+z;66tx뭷V|u o1?ϣw%& @ @ @ @(_?O5'!@ @ @ @ @ @ @ @ @|u6nGGAi7h Rִibʔ)"vZ|u.] $PsI NJȑ#?RX̙3m*|РA¹nָꪫⷿmwqGW_5jԈN:l1/// z衇Yf3đGN5.X 'O;u,fvĐ!Cbp @ @ @ @ʥ@r&E @ @ @ @ @ @ @ @t ̞1thD??¶Ѳepz衑vF ZvgČ3bad9KYhXn_|qܕ^??wXiMǎrK nȲ./FY  @ @ @ @! P8A @ @ @ @ @ @ @ @ LQT"qCDܩkh|XN)(e]_:?W_ӧO /04h״i,p;;3>裘:ujv/wLӦM1v̂z]vYգGhժUt9;;l&Mʎ\r?HWm۶ѽ{tMcv,Xs])n6lc=1ׯ]n})09N?8ꨣ2 nq饗Ƽym\O>ϙ;d̂ @ @ @ PL 0 @ @ @ @ @ @ @ @\`Ԩ((* RO<cƌ7ѫWp/ς~a5~&LO>9'5xg!Zo/<9h׮]KfX/B6NVN:fmc)uieu)lKZGqD=:k;΂R`a՘zY8WÆ cÞ{H{`h֬YNJF`СQj,̭d`T @ @ @ @GR~V~c& @ @ @ @ @ @ @ @&矏ꪈgh>" ReUdTgyf.U*3gNB:$|}YV֭nݺ!ݨQyyyYHWz Vvp¨Yf|gQz=~ĉаUR-H!j > va~ˊ@yv7I @ @ n1#fȅx=V`ƍ#^|1gva˜;%@ @ @ @ @ @ @ @ @z ,];GOĢEgĨQGaô 'Pu^\{ѵk"ôҤSպig7dС:iޝjժ&aZ J[ӦM JRֶn)KVpۉ'mڴ.hýԛ @ @ @ @Aef% @ @ @ @ @ @ @ @ P >{":bĈCƈw8žѿnbvGydRڮ]qKqeʕ+oFtҥO  @ @ @ @@@5$ @ @ @ @ @ @ @ @$0~M7E\w]ļyDlSx뭷⠃ Ƙ1cbRq% Gi+.HAo6 @ @ @ @~, P&Z @ @ @ @ @ @ @ @X>ڈ[nACD4ipN:ł J-'W\qEt=>I @ @ @ @T 4M @ @ @ @ @ @ @ @I`؈SNh*#.(bԈ*aZ4M(VnݺE>}K/-q F @ @ @ @*/+i @ @ @ @ @ @ @ @JX7#;,b"^y%"&O8M7-@9o~Z > @ @ @ @@4 @ @ @ @ @ @ @ @r'FѥK?1fLĩFԨQkBJL`=}~{  @ @ @ @UZeuM @ @ @ @ @ @ @ @"x }4f͈矏x͈7˳E]#F_~l8SO=5^xᅘG\}D:_նdIĈ#G{eC9$x≲< @ @ @ @Xg  @ @ @ @ @ @ @ @D ///l_xqE%)Q==;OǥKLVTi{*Ube{ժUZjQzy͚5{i q=ՑJ⊈ar-'>8~ѣc]v)OS3 @ @ @ @Z" @ @ @ @ @ @ @ @O ]-X`:s~i ., ʝ@UFcZvڑ;.{^NdMsmu֍zŦnk׍N66@n/ 0B @ @ @ PJjP @ @ @ @ @ @ @ P0aB?~}ҤIYQ.0nݺYJ DԩSz衅aE͛7BVkJ ׯioӦ*'N)-رcc1}Xti6FZ`m6nlϝtJV.7 X;+^y啵{Ho @ @ @ @e\, | @ @ @ @ @ @ @ @fϞ~a3&?8mڴe+W*Zn;StA6d!ZZ QF$Pଢ଼w޹ȑ/^lM<9>q,P瞋[n%R\j׮o}ٞbvqEj$Z.]\)Q`jt @ @ @ @('B @ @ @ @ @ @ @ )0(g3gkРA zUF'!jժey/jKߓqرc#Υޛo-Y$W黓ڵk۷;[lQpXFsα`{G6 @ @ @ @A@VEXes$@ @ @ @ @ @ @ @"gЬ7|3~,D>EE:uӯ_h۶mvݤIrD cGﳀJui[O>ծkv![ K8r,  @ @ @ @ P"9 @ @ @ @ @ @ @ @ (0s1bDY; . FNb??:tnmT\*2QFo>ۗ/ѣGǨQ'+2,Y-[̂vteժ~5ʲ~+@cw̾3kfK @ @ @ PN @ @ @ @ @ @ @ʑ?|+1~Yfnѭ[2dHt9zr4kS!Pvׯ{Wowߍz+x㍸kώ:uD ٳg>wWVNͱk.>2]$@ @ @ @ | @ @ @ @ @ @ @ @2)K/O=T}zk~KcM6µOZh۶ms16(`]4i>9 @ @ @ @eJ-S˥X @ @ @ @ @ @ @ P^|СC\~qɓsύ V1tu]7M&QTK/կM6XkL믿/  4X92/NCz<{XdIٟ+i6eI@VYZ- @ @ @ @@< @ @ @ @ @ @ @ N .38#7.N9唨^:U 篺Z]Rј1cbԨQ{O>$;vUkE-{ ,>Ɨ_~,=\t5֭7xc?>uӦM[Jꁝv)+)m۶kK7ng.q H @ @ @ @4 *& @ @ @ @ @ @ @ PR8H 1bD[1tШUV9ƛ޿ˊK>K,Yz'trvG뷲UTʞM6Bڴi3f̈gku[o]w]^ڶw=^l{[oE ԫW/ϟ_= @ @ @ @ʛ@C @ @ @ @ @ @ @JybFūm۶-LGuZ`l]tQ .+mZVJ[yնs,P-_#}O=ni{r>W)/>dȐKKi RZ+q @ @ @ @ *jJ @ @ @ @ @ @ @ @4 |Qf6lXl&{,}38#պ`'e]ݺu#<2F|^{8sgϞѯ_^xߎNuWĨQbѻw IQzf͊CvXL:5ӧO>3fu[~~}Vcǎ>:kK땶iӲ駟y睗{<O,^.wo3<3F4 '\ @ @ @ @@b4 @ @ @ @ @ @ @ :?Ymk^]v_nᆬRGe :4OO~7n\TZ5}s=cYW_}5 xj׮]<ѪU,*Oc+o1=owߍN80jMVVo bIA]iܹswqѢEXUmx`•BRXcvH]:(;/)`,gH),mEk+rk^9n) Qm;ƍgW^?95 ^z)[+lM-)p瞋z({,Oj{G"}FӶ̅eǧ~=ѤIb-V:*^z饥LիŋI @ @ @ @*2$ @ @ @ @ @ @ @()m۶ѩSQJ{rQJYf\vehѢu]]tox@BRQRҥKcwQK,²vi~ 47x#;#FdMFK6L իWUՖ:?Y T:OaL&M>snݺQRl=#u)[o͂敂ˊ뚮WqMbĉqg1l2L^Yw]tQr!+/,,-okUJ sKabn[mU4jԨieyYۓYfeԪUkGs׹,e鳝 v)+O92jժ Y @ @ @ @0*R( @ @ @ @ @ @ @gώ-r R`֜9sb]w֭[83 SNvޡC¶K.$;5jTvL#G;ƛo)|+mSN͎͛Gn #Z]iVW[״iӬ{ ~Jb)-ӶXYC h߾})0kW_jY-绪Znxc…kˎoӦMK_`A|mu\wԯ_?{,??/^]7klx,J!w_|Ei,OM2G @ @ @ @@U!$  @ @ @ @ @ @ @ @@a?BlJGEEW1`8O>>8Rw}Wtmmٲe8_f-իWt޹sۣo߾|>ݬRjaM]6djMj˅gUӲcUOIPTT-EXӊu0aBh/7Nݳq~t,Gֱ!WOqEY%+spXyދz[lA%U`?u @ @ @ @(J  @ @ @ @ @ @ @#>:͛{oU^^^u]CEfg#(wk>,3k֬¾EM:5;iӦemcQ*-{j>)Pm}c5jw^֖Vϝ;7?u=S⩧#<2͛69kl=Ӄ5YYXmV|,<3q7G:ud gqG>$ /$@ @ @ @ @BZN @ @ @ @ @ @ @ @ %?9~_D޽+Uuad}q뭷F'm 5jċ/ժU˦r[l=b뭷Ç+ YkC׿faUkjzwie]ߎ?͙3'g6[٢UTۚz)>-ZDVV[)yYY\>wG\hQ̜93{wJ뿲;.?n0!,p7_f*P{*s] ED @ @ @|XQ?JGbDϞ^M^ @ @ @ @ @ @ @ @+лw3fL\qBw^xau)L+mM6]e+Wmf}UimUVɖSڮsN 80뷲zS+:Om|un /Ϻ,j^E.j9IrCy\q)d:6uqM]m]ô)t.y/FtueҥKi+S= @ @ @ @ k?,q @ @ @ @ @ @ @ @JHVZB|8㌸ꪫ_~Ѷm8c@%Tn6ܹsӣq%z\ڱ;u>%!W6mVs[zs Y[p*QX뽫]˛G[n%n;:h-Gѝ @ @ @ @6@mC @ @ @ @ @ @ @ @+HGzktM`8p`uQѽ{T K,O>9xˋ;/87dy޳gώGy$9rdxws.R;/Yf(gPff: @ @ @%%Pχ~~XRo0.@gƍ#^|1gbSbL,  @ @ @ @ @ @ @ @"аaø sύÇwolqG!ݺuʕ+o)UR%lϽf͚SR&`Jقs93gΌ'|2{xUVY?\RӼf8 @ @ @ @(iZ%-l| @ @ @ @ @ @ @ @`V/" >h\Q~}'B6Ԗm+;֫*]ti;+~x7EYޯҥp @ @ @ @J@R8J#@ @ @ @ @ @ @ @~lOyea:O=T~1mb}^zEnbM6AG@9;vl /Ŀ;wn}Oa{ӟSN`@ @ @ @ @I@ @ @ @ @ @ @ @ P4hG}t/Y$xxgk&{f{&MK" ,^8}xײW^3fDfͲӧOlǜ  @ @ @ @ Pj%6A @ @ @ @ @ @ @ P~T)8+]vY|7Bx>bĈ .-[:uΝ;g[ni13\ ߍ7.FoVv|w[oݻw/8iҤXtiԭ[7 رcr)뮻fߵ*U|Pw @ @ @ @ @Ԫ0Km @ @ @ @ @ @ @ @@hԨQ~ٞꫯ"aÆE J[:ubv(ܷnhݺulѰa0ʽŋO> &d?cԩS`jժEk.?y睳UV!DL @ @ @ @, Pk{hӦMY\ ղ @ @ @ @ @6Z @ @ @ @ @ @ @ @JQFѣGl_v)L+ ?>&L 맞z* o 7n87o-Z(iҤ篿z^{r={|"ȭv |a"k׮YӼy @ @ @ @ @S@穫o @ @ @ @ @ @ @ @A Z)m#?k֬2W_M^aH&LȨQS.~զ.ir|K*}8_}˽]vBQE;3iӦ孷JEGExVMV֬Yl묳Nuw߽ m+]w2H= @ @ @ @ @" P: @ @ @ @ @ @ @ @#мylI={v&Mnk{ɓۤQ7ҵIy'.!LsPj`"d8iӦ۶m;j{VҺuE^˖-S5̛7/~Pw}c"(f9 *-5i5_ mСCy,j΋`5 @ @ @ @kڊ @ @ @ @ @ @ @hO? Ԭwɘ1z%^2`@򵯭Y1R3M:5EVMPǚ0XuՄ<ӧg̙w7.p"Xh"u\eUREM4I7mڴ<\bF}^"̙S!c |Aj"lz֬YGb *|ṾĪ 1[ϊ೚*\m @ @ @ @ @ Ԫ+l~ @ @ @ @ @ @ @ @@x"Dz=:9?80nT>y*ETM'EԌ3./"yUK-@UtUVXǚ *B>*0Wlp0Ex^ }Pbo۶m:vHHXMXMXq9/Zn=/6 @ @ @ @ @`l @ @ @ @ @ @ @ @sx!ZO=NÒCwaET6m}y? @ @ @ @ @ 8  @ @ @ @ @ @ @ @/.z≤cd .Hv)isX @ @ @ @ @Z* P. @ @ @ @ @ @ @ @%0n܂#!/Mv9iҤ~l @ @ @ @ @K# Pki%@ @ @ @ @ @ @ @,/'Wi=hI߾g'*Dk)(5%@ @ @ @ @김@zG @ @ @ @ @ @ @XW_]Ivɾ&[Է=1 @ @ @ @ P'|IJN,"  @ @ @ @ @ @ @ @,ɐ!ɠAC%m$}$'{*z @ @ @ @ @V@* @ @ @ @ @ @ @ @IM7Uh=@ҪUһw%={&͛I) @ @ @ @ j$x @ @ @ @ @ @ @ @uO`ʔ曫C/i"gdȐd=ެTL @ @ @ @XV @ @ @ @ @ @ @orKuȑI^{%7P}\uZ\ @ @ @ @ @uD@VY(e @ @ @ @ @ @ @ @+N୷[oѺi3dsVV\-F"@ @ @ @ @4Z a͑ @ @ @ @ @ @ @Xo'V5bDҸqҫWrUIIKB @ @ @ @ @( P3y @ @ @ @ @ @ @ӧ'^u]IUU'}$m9 @ @ @ @ @.Ԫ F @ @ @ @ @ @ @ @` ̘qGuܹn%}Ivm( @ @ @ @ @|JZJ3 @ @ @ @ @ @ @ @ ^2thuVqd] /LMڷsS9 @ @ @ @ @>Ԫh @ @ @ @ @ @ @ @fL K~sf֬e~5+n @ @ @ @ @$Z+ ް @ @ @ @ @ @ @ @5+dРfgƌ+\#3웵Zc @ @ @ @ @`j- @ @ @ @ @ @ @ @(0{v2bDMV2}zMIǎ}3yS2dhz+44 @ @ @ @ @/ @ @ @ @ @ @ @ @&ɡbrȑ+AZۦ<߅iնS @ @ @ @ @#j}[ @ @ @ @ @ @ @ @@3'1"9d=L}69d䡇M6+}lΝ;GͦnZ&" @ @ @ @ @ 47 @ @ @ @ @ @ @ @D`{AoNx#f?O Hv]PE]A.,͚5[ @ @ @ @ @@UGq @ @ @ @ @ @ @ @ ̛uM7%''_jr!ZnJVu笳I'hW @ @ @ @ @^@V_" @ @ @ @ @ @ @ @/PU<`u֐!ĉ'?quov Py <8G7t @ @ @ @ @V Ԫˣ8 @ @ @ @ @ @ @ P:D^K6,97乿K{Sjz?O  @ @ @ @Q3fΜɕ73P6X@%iA @ @ @ @ @ @ @,GGY5aB+~*s!Znzӷo߬z_Ν;"@ @ @ @ P{O6JEOZs]͊ @ @ @ @ @ @ @*4(?>:D[+ꫯ^kӲe˥@k @ @ @ @ @Z' P- @ @ @ @ @ @ @ @@x!Z/larɀWs'>;'xbylԨw  @ @ @ @ @Z' P- @ @ @ @ @ @ @ @@x!Zc&믟_6K?/~{t-3pr!Kr|ѣGV]u :t9+ @ @ @ @ @@0ݬ  @ @ @ @ @ @ @ @rx!Z=t Dkm~"QFƍW\iӦeԩN;-}y婧JfR7nx9; @ @ @ @ @@հl  @ @ @ @ @ @ @ @r( ދ@ΝO.<~T>0E8n햿/iҤIu{G͆n:^o; quG @ @ @ @4HZ rM @ @ @ @ @ @ @,@%?j~֓O&k]u%Ɏ;~+9餓r=*7|su֙:uj Ӫ]v5 @ @ @ @ @( PkN @ @ @ @ @ @ @K/-zdK??7ƍ?gΜ /0?pl9cөS"Ls)Ͽʀ?яseȑ}K_Ry+w\.JhW#eVUUU.vaeǿlҥKĉ{+(ZOfկ_2뮻Jn_ڵk>^(ôvL7߬tsQG,[24[nɘ1cuO=2̫h_%7mݶ + @ @ @ @ @ Y Y  @ @ @ @ @ @ @ @L{nv$uI%s*II& OO?!V;CL6-zhfϞ] ڨUIlCyU.p 9rd:v8?hrǗWGyd.qW_M*H-ZiVΫxO5]s5)~ᇧ+B{6 @ @ @ @ @@C̟ @ @ @ @ @ @ @&矟JSҵkrɗ L\vYIӦFTUUo1묳N[oNiժUƎ;#nm@ըQk~-۾NtUrKn2:ˀ֭[g̙[:u*o|UkܸqU`!Y5[Μ9sRd[zջwm۶I7o>8ٮFo_jn28c)\{;wn;Ǘ5 @ @ @ @ @2~d? @ @ @ @ @ @ @[EP֐!ɠAɃ&Y͚-L< Z8i%9rdeԳZ~%Q[lEXWUlzj;~YVg-u%{g?^?__80?Os% {7W^yeŴO%lAZEט1cҦMa׿5J5jH%]lٲl2jԨ5}2iҤ_QGUs]z9srg~Fi޼yf_[zΜ9e 7Pq#Fewy Zſo&@ @ @ @ @48Z nM @ @ @ @ @ @ @o$l[ҩS%;&'S$]JPѬԵ[qܹ9cS`5m4 *C0YNi6([mp͛7 z^zk׮9s}#,Wn-i;c2qpy'9w}:u|epWM_r'\: @ @ @ @ @@&N @ @ @ @ @ @ @M۔/OzLY'OWOd~-V̋", .29{W?wJS%2sWdљ0aBX\+Xv?.vyvie0N; 6 ݻw/N)*K/TѸqqeEUqfewL6mr.ܼ<wcM`Wvڷomݶ]ve߫ZnG9蠃C}A @ @ @ @hhڊ/ @ @ @ @ @ @ @+iӒ+L3Y{?#i*暤ȏ<8?irN/f˃>:W'| Po}yg`cǖ> ~g}w衇_/)Ϙ1#~z~ӟ+_J8̛7 ĺ{wvE`a 70w?:#VmE'||'? "0_%hw饗\kF20N1aÆeܹsM׎ @ @ @ @ @+Ш5ٛ8 @ @ @ @ @ @ @3J8U2hP2bD*TIϞI%*{'V;'Ce}͚k_m*_ j~7w} h*KQ]W͙3 j۶mͭ=Μ93-Zkf͚-OK<b*VwG8. EJ5\?<{gڏ Ҫ)p@{غul喟->vӦM+K*:*´SN~Z_>{ @ @ @ @ @- PA/ @ @ @ @ @ @ @ @@m1#C KIv-䒤oߤ]\}umUSN9%?͛I&9Ck+oׯ p @ @ @ @ @# PJ @ @ @ @ @ @ @ @@?::D8Ξ|o_nƌ;6[ @ @ @ @ @` Z#@ @ @ @ @ @ @ @93>:D;z睓sM/YsSW|N @ @ @ @ @|@O @ @ @ @ @ @ @|Nf%wUuɌN;%%4n  @ @ @ @ @BZpQD @ @ @ @ @ @ @S#Cn-yd_:Dku͊ @ @ @ @ @j-Is @ @ @ @ @ @ @ s$w]u-o'mvZҿҹ2tU @ @ @ @ @D@V=YH @ @ @ @ @ @ @ @#0wn2rdu7'S&_Zr)!ZW{jU  @ @ @ @ @ P6 @ @ @ @ @ @ @ @ !ZWuMo$[oxb2`@u~&@ @ @ @ @ @s @ @ @ @ @ @ @y,њ4)rC6ڨ  @ @ @ @}˭@IDAT @# Pk8 @ @ @ @ @ @ @@UUC!ZC$tTh}K 4  @ @ @ @ @,GZSW @ @ @ @ @ @ @ P?<8ydM#L8 d9o"@ @ @ @ @ j(i @ @ @ @ @ @ @ @@x!Z/lqra!ZmV禣` @ @ @ @ @V@V] @ @ @ @ @ @ @ @?C JƍKM HbeTdL @ @ @ @ @_@V_c3$@ @ @ @ @ @ @ @%<Ă_L6 9_] @ @ @ @ @ P @ @ @ @ @ @ @ PzjA']&'$ݻ @ @ @ @ @@UwN @ @ @ @ @ @ @ G/zduC*nLs @ @ @ @ @@F# @ @ @ @ @ @ @c,zSd.K>iԨ6V& @ @ @ @ @ K@VZo%@ @ @ @ @ @ @ @@x!ZW~%]cҸq`0I @ @ @ @ @uF@VY* @ @ @ @ @ @ @ @' BϤC.yg!Zd @ @ @ @ @- Pke  @ @ @ @ @ @ @ @3  \5jTI~9$fҤgڋ @ @ @ @ @@Z+P @ @ @ @ @ @ @  DᇓWOM<3#i_vd= @ @ @ @ @X> G @ @ @ @ @ @ @K/kɐ!ɠAiorɷ  @ @ @ @ @j@ڳ*!@ @ @ @ @ @ @ @&MZIIɉ'&={&͚-) @ @ @ @ @uZ@V^> @ @ @ @ @ @ @ @~ LtS2hPr}I˖>Tcy5_!@ @ @ @ @ @Z@ @ @ @ @ @ @ @,;3 &7[oS̞={}޼yYeUҬYEmۦ}W_=kv:u&M,C+9s`曫C:4kォ3Yu3 @ @ @ @ @ >ǑW^F&@ @ @ @ @ @ @ @8qby晌=:=\Ə_~~EiժUUb5Y5!ZE8{w>`~֬Y2mڴ2;w>;wzWmQ6tlfx7^ '|zjҨQrY4s-աYk*!cIuIղKK @ @ @ @ @꾀@f@ @ @ @ @ @ @ @rx=?p}<ә:uj9B0 6 [l.]C)Be٪2}r̢சA /[M6l~vەZç7{M*K *n:D/I*Ya+d}֭? @ @ @ @ @ Pjշ5 @ @ @ @ @ @ @J_ψ#Ȅ Ҹq28kmF/7ltq,5j6mڔ믟f3fLFgy :[oyzӣGٳ jR$W-mԨOdʔ+l?ZtJ6Xn:D뮻UWTjwE @ @ @ @ @@0ݬ  @ @ @ @ @ @ @4h{,Νwޙ'|2͚5;#<2o}wjqSQonʽf!GI vUW3L۶mp}'}-kK/M9& s{Ye}7Óyo}+)wTj#{ @ @ @ @ @* Py @ @ @ @ @ @ @ SO=ntc^|lݻw>.iٲ"EF1cdĈepXVzʷrZZiΜJW>H"dذ#TW; @ @ @ @ @ @F@V# @ @ @ @ @ @ @N`֬YeŕTGy$]vM3`t޽w l{챙6mZn 4(|pV]u[?я/yW?t'T2>v{嗓OKXcz@ @ @ @ @ @E/r @ @ @ @ @ @ @@`ʔ)/~u]7~x5rȌ7.oDخ]r!6lX^{r)>|x6tߩ7Ӛ3s ; @ @ @ @ @|@O @ @ @ @ @ @ @:%o?y6`\~O~ &o7:5ϳ5\3?2vu]iѢEklvu%e*ϒ3O *k  @ @ @ @ @ j}:' @ @ @ @ @ @ @3g̙gYi]y93nܸ|رc-|֨Q6lX}t!zʎ;#V @ @ @ @ @ @ @2?_?w}s=k׮ʺWNuysUW[c~74sf>oނ:Խy @ @ @ @ @+ Pk @ @ @ @ @ @ @ /!Z'N^q=z4J痿*GqD<[e?3'tǽ> @ @ @ @ @I2e @ @ @ @ @ @ @`?ݻwOV \s|9ri堃ٳ?uM @ @ @ @ @@CPW޼  @ @ @ @ @ @ @AÇgϞ}Skuҥ΢|;̰aһw̚5MB @ @ @ @ @jZzyG @ @ @ @ @ @ @@@կ_tAӟ͛='p sIu)~x6d%5]ŗ#s]w?cZ9ꨣra @X[lGY4icgMƾjE@ @ @ @O457c @ @ @ @ @ @ @uFO~kԺ6mk:餓r=j["XW^<# @,'w}^UvڥM645 @ @ @ @u@`BLZ @ @ @ @ @ @ @~3go[܋=ꫯQFӟ1c3ܹsk /̜9srw/y睗 . O?t.첬 &}W_}uZh7<{dҤIg.~7xlF_wy.  @X@wO?7N:~ Eɓ'31"na:tqSL矟'x"Z>ի|ql=ztf-!N8!g.){˿᫮ :th 2$5_7|siӦ5;={_㭷ޚb/jʱڶm; @ @ @ @j8km @ @ @ @ @ @ @?>B]x\k7,`^nչs /ˡ_~m^5jԨe w=zd뮻rZ}IEEסUW]7\q);ٻ(/^z HS/pmҮ .  QAADEAzEj(ҒwKB<Ξ9sgv'aV;wt7e˺޽{5zXKhKU[C@@ RZ;wnOFҗ_~z) ~&MbŊ.w- ezӧZh~] ԩ ׊;hY ^Խ{w5n~4jH߮cǎeA]͢EԥK̙30`,XYF=zЧ~˗       B (U̒I"              @?ݘ-*KtTTh,XPr l8q6l[͛]JrV&uukV֬Y&Mwcz{lB"""TR%?CnoV6N~\ GB@@ uݻPƏ>[ք t{̙K~3f>c͝;WyK޽w]CuO-Ӷm[=#³jԨk>[cY`}" MV2dp\6/+lL]xXΝeq,dضQ@@@@@@@@ 93F@@@@@@@@@@@@@@x ϟߵlٲ @np*Vݺus7W\D+V<* gO?uAX]{*QdɢSN'b~籐, ,}Ν;Ы;Sٳg7QRN8p@UVՌ3\pVϞ=]>HܪU-h        @N}V@@@@@@@@@@@@@@Q wh{MģF??h]ǼQ~HH95kSͣcmxgɓ'z @@R@dYED 7]t]X~}$>m_+;`-[˗kƍ9 B E>_} ǻ}}]]vرnݪK͚5_Z[Nٲe ƹfw>}#@@@@@@@@ % .sC@@@@@@@@@@@@@@  .]Z_,=<<\uOaaaСΝhFSNu7ܹƎeg%frM+Tp9@@T/&_Ν;m۶h p~3e]tiɓ'o>8ݺus\cƌ/}Zz^{5O^5jԈs{ܹs.?kٺ{>6FNdZ1˖-[bn1       RIf              $G 2nݺ9sU~tv{222RxaJ[yĉM>nocݸ޶km:q[x/UbR\ׯצMThQwCiw9-  I_ H2r wٲeʘ1T_%J(K,Od!b-kMq.5k"E7p[j]}n]S{ugVX4|:t(0~c.\~%       "Rf              $7O}cclرc)S&= UHH[ڍ6m:詧r7N8 4A@@ Y W_oԩSn۶mڵk3sb\civ>?c.aÆ8p\~M7XbYk> =# *TP-[6{ョ?C`9mUvmG9\Yfէ~*~6j(C=7ߌ-        JDz%̕i"              @28v섊m{7T1AGo7oѢV\B i3f ;eUuY*UJvy ڵkw/AիW6nn\o7Ʒ0-{\\9F&MH->ziӦ:u 7xC_~nfgYXpݺuݮ֏})R,(      ڶ}GS~]G @Oy'+}԰a_RZI06@@@@@@@@@@@@@@R@dK67mNҥkI˗OpjO< aDDΝ;pUxMW;vL7p2g|~s]f͚/m\bO8|>u2ds}~wMޗ?Nfߑ*?K@@@@@@ R$@ @֕tW+{"              nYQ^+voR|l5b?kɒK,\p?*!+/:[l7o&VJ,kn0,.]:/d,~]<\rҤI8qfΜ0-;?gΜ^*͂<g֎;tRݬ?o޼qoϟ_哅sY[   Z mڴXEw>gɒEUTh{2H|´OgnW q}?k#       @_H̹3+@@@@@@@@@@@@@@H`#G|Y5<˂,cFD _hVfң-/IүJ˗KGK%U}z5e%^wvʖ-{N2S@Yx:w^zEWeFv~sjJ.zpuk͛pBtEFFزP@@HhG7O>InSL2V\3&        PF@@@@@@@@@@@@@@@(%Y@V,{ ,xq_PVRNRcI7J"-[&}/@ҦwtZ5g*U|5G`5mT]tرcTV5oVSzK;[nEJnZEjʕ/:gϺЭ={_wX_j[߿,_2ggV@.   _;Q۶ķyk7x`?͛ #       Jg#              p{u뤵kmۤHyVR",˒jη^T/˺KHx2D2dYU/<{եn2f}P 4дitw>}5ΝԩO> ?ϒY ^t rbCjCb./^IN>^d͝;w L@@DR{}hD;$B@@@@@@@ZI1@@@@@@@@@@@@@@@ٳҦMZze%[6lY_&߲\9D )$!_xĉҥ|ZK5jHm+ eͽ`ot]wNzpL ߫W/ܵф _ld\jժU/:b z@'NI.シgR@@@@@@@@@@H lj8@@@@@@@@@@@@@@ : ZFZWm}9)MpaLvmC!ZgžŊIjIO=[V&e{?ՂzI]-[5=]n?#?^zT"gΜZbŋرco޽[7nԂ G c^sVd[Vm˕+@@@@@@@@@@Z1t@@@@@@@@@@@@@@b x=Z|hgYp֖-RD,,)//n[+'.-e菽l%-Z  NefsT/7 z'uw` >|)rUZ:ԸqԷo_uI͓Q\ k֬Zl)={ja[v-nϟ-_BBBK+peǧ           TJgq!              p'|YVIco 2e|Y:eaZe~-׭Ҥ{H~m{b3jԨQ^0XkuUdg}V{=G2 *{G]`.zcy+@[e˖?w\gΜ t%KYV2=Λ7          @b X@@@@@@@@@@@@@@+8}ZZ|h?@kV)2R^p )BqY^FDH+VH? HKUԪT/@ob[K{W]ȑ#էOu]2eJ!cX֠A_^zZdW"'5kV/4q/һH8poE ڹs,|~s˃H.܊ea\'.           @B P              @}V+W,<˶K!!RRŊRN/~yY!Z˗K?(=*!/LI[&yJcK ^׀\kޅk=ܹ͛T~MeKs_vښ5k6mzMF M4ʝ;+WSN-ЖmY6}tٳGgϞ q5l˂ *$[klYA@@@@@@@@@@Rj]J@@@@@@@@@@@@@@H`% ͲboiY%M+,)U k βu J7wwܹ҂RX+Ԡ4xoYҕt%0w˛аaü@z7\P /VZ[njܸv4g||U^N*WRi:~U^X.^,UڵnUWO [}PK1:d-]TSNuASogYBn֍7ި5k*k֬*{A^?,Xo߮ٳy=ZZrmb=&=TtҰaBՔl2Ȗ-ʗ/j\S8~vqAݶm~Gɓݯz5d+jVh     .&@IDAT      @ P+F              DNV/WYxHez-Tr羺?vL^P4s޽R޼RӦR\RBe_/ mjW^QXX\OڵU;*Tpv(gΜqYVU  Ç+}^:t.^1^͓Oʔzdј$@EX\9W:C\E ûP] wܩgϺӤIP/4)▶B(          N¿zvc              \3 _=ft5P%yDR׮u/_ .JzY11Csi|)<\UKSjBZUb(W(/_>>e<'Oo-۶xb-YD},NJ/_^ŊsA<  ,s{ij]wBBBp$"##u{A1w- rݺuڸq:wAY%J^Uot`3-}#ߗ :v,\U{?Z\rDZ^/u0jֶmᅲ矁}3g؊_/XYA@@@@@@@@@HX֓@@@@@@@@@@@@@@CZ6H^r攪U7,U+WJӦIӧd6{76/o QFyi^jWZn8ZJWڵk]o^\=z4V,B~,\-*j RΞ=3gӧ]?ua4mڴ*P@ m۶.ԫVLeDZ ^}q^<5jd-($?4^ҠYe)SNBڴi͛¸i޻*RHha[jѢE-[X&@@@@@@@@@@%              $[#G$ Z|ݲ7}YToFf' H-[JCJK_3 _=sco\A/X믿Ye̘1ZȖneϞ=e\Vj%FɕK9RC૯J,GA dȐAKv5EzIe[V;ymۦ[}ҥ:u~y%s.pz|ЖǎIA@@@@@@@@@RZ3g@@@@@@@@@@@@@@ >--_.-Y"-[IR<Ь{--H+_3 ɓI$hi#m+լtƙG_cǎӧ ҧ{EkLVih>^xAz)[L) dʔIʕs5ٝ9sF۷o tkꫯk.;w>}z*THŋw[UX1n˼I! 2I @@@@@@@@@HD9@@@@@@@@@@@@@@ DF,R@- *_>Na#z .jlñ;wj˖--Үe_~ ㊰_8^ɒ% *V[ZȖkv{#S@@@@@@@@@@$*@V=1 @@@@@@@@@@@@@H-gH*-Z?,m.I#. 2DUK\Y I2^{O?7Q6mYS{/. ҪT&O셚jvD i4^|Gu.%`ש"E[۳gz7G ۲Э_~E~٣H_ŋj![u[ZW:K~          HdF@@@@@@@@@@@@@Hvϲ- :}Z :u$ 59e|i~z͘!)u =TLGJ]VNNR Rt5-&L&M |wՁ8$^ҝi֭[yfW-lg͚%[ sYpWB.oΝ;ن         $Z FIG              1Μ~MZ|֎١ou-Kwx|ZV-Bo_nMPR:Nҝw)[Ν;WٳgOJKc :uڶ kR˖vZ %>}z/رM-`ޚ7oo߮sιݲd"V!^UhQY@@@@@@@@@;j=E@@@@@@@@@@@@@&p/<%˖ 0rԑvgժ%yɺ/!Yxj+7X!!K5c;T)YO- >22R;vիpʗ/_㵞_|Qzo_ 7ސV֣ p1/i5kּYxx Պe?>:tK,TP- ׬Y^7@@@@@@@@@@j1              @ng"WʖՓ:wh..|mۤ_Ə,',0Glz-/L4viӦo%ᥨ.,M$=R̤!C5U&@bŊڤI |QmܸQ6m 믿֮]ɝ;w \_rq          VRg              e K+V~ɷ2"U.h!/H+g<40߄ RK=$>}D+Ϳz f8n8 : @ƍ_֩#-\(}Է{K2\ÁqhHPٳ{ӧOk˖-- mdΜمm*UJ%Ktտ?~I&f5˅7Pk|>ϗON}TzIn]{}a} [D|M۷O- ڲsj̘1 s-l˂J{bb\r葇          TJ*gq              WY-@W/Μ٭Qx /@tbŮ@p6I=zHsH:ICHy^8ӧO{A@RJ4hЅ r"##Ú={2dpcZU{|ueJ{ d}"~/fo ,/ Z~}~n_$9r\e[JA\          p Ժ@@@@@@@@@@@@@H p_htTԤtM?hʙ3MY˗Oa%cxLz-gjH?$xcC}ꩧe-_\_vJg{9͚5KS1ZI&4xxwCC@ 'OY[n`X;![6lp~nݪsιwZ(QB         $             \ Ze i|Q)4TjeAZŋKÇW>}twh„ ʖ-5sR8ΝH JH<#/$+͜9S#Fĉ=KdN!Ch̘1$A2h!!Rޒh=ԥ/`7 5 piҤQ…][sYm޼9~zYW_}]vYX1-[VeʔV-          #p?O               9s|o뮓5^|Qĉ?5۷'Sᚗ|, cRr#ٳG=Ow}o̳*fuQ=zPΝ %Գ/`ˮaZI*(@ .@@V6µ֮]uֹ:w\5JǏwsw)          oEK@@@@@@@@@@@@@@ x?_=z!T/[*U ~z}ڷo|6JE[^zI_^4r)'+{^{oJ6mڨRJz7̸ X_j޾@WHT̙3{TS mr޼yڱc3Ct@B,p\rDx         Z @@@@@@@@@@@@@@$,!/'!˛ixyQiG$4PMlٲy[ǏG ٲЭcj۶mrʩbŊZȖ.\pШ#        $9)a@              RNhyyLڷO*RD6&MLnOVϞ=5n8=3}|f߲i&C?7ohSLч~}AY"x'CXKICJI+t]IqČ H8,YVZFs͚5?uĈڵkk5kVõK          \3=F@@@@@@@@@@@@@(w4c4}4wtǤ;*U:޾}Zn 6xǞ;(zԡTw^(QB/rwUzn\x~Տ)!CGZ7xOڣgt @ dΜY5jp5jGѪU![e8̙S7p9R`i[@@@@@@@@@J̃q,@@@@@@@@@@@@@@ % ['/tIF)~'Q$ ZHzaZVp8I~' 4(} >\ժUөSthaZo|AΝ;_>sG}Bo'b[W^ !}6륗 ի+$$DW޽UlK-fxmEٳPzY~n 9 )"M,*<)U.u_^7zho@b׼rʹk50tk.?F+V̺ }LkV֬YUT)}z駟j@@@@@@@@@@1"             )Y` iT_]Fʝ[vg[o2f8 Z\nX曚5k 6 ł ?{O2elܶ+WjĈ[ԬY3͛7vׯ{lAE1w9/Ξ=D7I+1YBgǰ쯡C2eb;j۾[%q3Ϸ֭[5a:t(-[h۶mej(/{uK,q5d9^ `bhZ}JS˽zI2\:e@@@@@@@@@x O(!             z>Dk`AѣzY Ǻӎ;4}tkرӧOvaaae 1^ҥ7o;u_Dki 7vnf[bſ{G~luRs?s )[6'Qٴo^ 4С>͛7Ͽ)I,qjJ N㹚Xj=,@\iH'!KaƵוoy D{_>쳪VN~=2dEy1lڴiW.ߟ%  mR\_sl? VeAV?S9ru[H@?lDJce           P+P4C@@@@@@@@@@@@@')-Y eTԺԦT+sɔ)ɣB ᆱҥKk͚59r J6kkar1ȑC>h}bŊi3gvСt׻( >KeM|:1Fx;zhA.0~6&!L˂z!UZ5$B~ h%!PÏykѢ 90a5y)={t5/fZPrY?@kS͚5]m[5yd~}Β%*U~WR-+V 2Du@@@@@@@@@j(XA@@@@@@@@@@@@@$ Z|֎RɒR۶5NQ ,xAO{ァ9sիΝ;@`- ?0`4hz؂~g 8е3f (O}%sv> [u;#[=z|_-yaeB[/O:B/^Bjn46uT}ʕ+8ӧk޽{k={/B#8gu߾}Vz)eϞ=o~ %EDD(88X}[ 9KDGqc;մiS<~MYfUԬYIqW_Պ+|$lO _>yYysylҍ7{H^N$SkXt5Vd2g}lǏ7|Bh%6@ 1)"Y_N8~o[_~}vp@F+W]-(Ӫ]-$         Z@@@@@@@@@@@@@@O`2idii.lY}{_wRnX,4tҪ\z/-ZHÇc=^{ͅ/EcƌoUB@V2etСX1:w3e@@@@@@B,Hk)_>yˤVtiJeAO.%K$IYhͿZ( ]iذ :{G4zh(eʔ.|ԨQ.tkǎʖ-[exU,\`ƎiYe]l6N ֢E Yس>wyկxecTD^lASe˖iӦ¥&MÇk̙~ p7 -@bŊnv̙]ב#G\@; ʑ#[n>}F:xa>sTzue͚U7nԁzSvi&7/񩧞{Y`y𫯾^nZ:uB֯_ϟj5i}Gn  {Y05 Q X`vYBL=~#y畼&,LwITPЭ|dQnZV(8ô&O´ϯxsrhiYx[CΜ9#zӧOkժUHֹ4 uq vw;9q ,;zeAZԩg^ 0yJ*.8p `3 ovy+_;%KՠAy睮oƅlY57o޼J ۟R9`aZtdĉ]gBzw픆 }Wwkː!;cǎԩSC 6{l%JH+Wi'%Û-[̅Z֧~޽{feexBxD@@@@@@@@_ @@@@@@@@@@@@@@k xɯ B,,hixYB>}C3g,|aÆ{\׶m܊v̻ty#|gS]vU"E|BJ aä'w^HUJ< 'ϭpeሷ:eA3WnJl@LTn]7he}uy eSҥd4@@@@@@@@@W7#             8qBg_uHYJ/ %M"y9=1BVM^X5Յw֤If5iD.\P~ܣ^YnJ>[jGbŊ.͛'zĉ]Av\ TwkgOV3Yֿ5{Xٗ_~) 駟ԬY3Wmdɒ+8y{aAZiӦil>]{i*P!]+omv , @=L!Yf-$~kV״iܽ}r͗/Zh~[^         >'E              ^f̐ڴ`$wRdKIcJ (q 2De˖uG? x饗d,O?+zȑ @k_Uԩ=W z޽kuiـ\C=柰43ǫ8{Μ9sEnt/B/9[7H \'N8"8kΜ9.X,K,zwtRr-ҺV}\ճgHc_`zfYV]`װaC/g W޿vOzq{dcŊnLsB2eJB|~,wXYfys‚hĖbi w w "ǮקNRZ"/ 2dB]Ӯ]\p7 K:tHT}K,Ish@4@@@@@@@@@ P˷              M!)gNvmyCݻo|0,X&MݫAiɒ% {'bM4:thK1BiӦunN}u/}Ν;|{yWC\"- ךM8Aŋk4R;w (9rѣًǏCJ ղ+kk֬ӼĴ(ɓOy Q~w\@ً/_zak\=zpSYfu.h˶}Hbǎn=ZͩR_p/'P˖-]h~M?,!M4] --k&P4 낗cZtT\9)RD2erljժݻ{L2k>XؚYXKG!vI wH%JH?˅x4i,Hi .-[65jH $=x֭[QFrZl{# B C@.!        ĭZq@@@@@@@@@@ h@IDAT@@@@& $ ,uT#X蒴hR7y,o+­N:B:wسgZh! fUty Ј._daJl=)eʔʜ9{=/, t ^2s !4rH73F5}tmig5̙3N{~y{7eQ/^Գ>e˺@^Mƌ/_=w#lk׮]ʐ! ^z0۰p*^ 5{\8V~zׯ9nvq^{d6f N:B>SYÔ)SԶm[ܹsլY-7֭wZ8zar^fEq)zscR|R:Ra3]W~y|;/k@ȟ??W $ԯ_?w;~xiyq}#o         p+A? nGE@@@@@@@@@@@@@bHiyDҏ?JɒIM Vbh1CԪU+͞=uvuKeBY;{Uɓ' 2Җ-QozY0M?³RHi# ںu 6 i7nޏA.oYȃ%J(b9%iҤ.4,qW}??.,o޼J*U~޽{U@uŅu=Kf͒ Q^@]7uBj֬ s@{- ,YH]+T1Y - 7 gҴV-, jX @@@@@@ |p&N죋1L @/e$͙i<@xr&             ,}>D RRRaZ:˗I&pႾk)S_u׫'HE]Nfʹ`XB!DWKڷokFU- xW襗g__yxW[y *`vh[vh7ovù;Tr)_|:L@Dj      \@x` WjJp%              sH++&-+͛'YҴiR˖5j(UXQyղeӊҪUa5i$30pV|%iq`H~vRǎҋ/JEH}wX _*U|I/u6mڤݻwz^ݷXh%KYh\-"        #;P              w ꄅ$K&= |9{~i1 h̙ʘ1c` .FQn]/`mNm zWVΝuEլY+1Wk׮UD^Pɒ%HjTBmڴ:=Ղ y9P^MԁZx0j(.?Ț5k cpܹs]0ڌ3{kG >|{ϛy!*sx)O]\J6zu^ʀk I 5^l?t+V_~Ѽy烅l%MlUZU6m @@@@@@@@@JP]99              @ 8!M}߼eyDjVʛ7fM'0aԢtD_ H&OS1 C?ҫwzסձs8 @|Xj,8q$I/|U¸*T@V|}\縇>}h߾}׹wPѢKԉ      >8}t"0GM`~)S&ij[ $@@@@@@@@@@@@@@w?d:t#~n'L+={ ;uT-ZH?O8)RsggF}gJ~PJ!!ճ(!S… SN/k.[|x_9s5jx!_~Z`Ο?O6         Ż@@@@@@@@@@@@@b\qi鮻ҥ}; {&2A C ءK 6 ZyZϧ+mP/,*V<ŋ|p pWv4vXwZz~m/1J*)]tjР I         ? OGZ@@@@@@@@@@@@@3KYΝ"E_~;u ~6 Y Ժ6-¢BE}2jF;j,CWܹR> zNaQ< @4 {.]hԩ:tFPA7nT۶m%KNݽY:{l4WAw         @ @@@@@@@@@@@@@XDj^ޗKwX1i|鯿BBf N%()J3fhҥz\HVI}HIgRhh D@ppF\Y{֯^IT|y/qj֬t|-[D׮@@@@@@@@3⌞#             ǏvdIlYiBץ]BB*U128sFJ?j0׽EZTtiH7IH='m 5h =T/񆀁"ܤ@4iԸqc >\6mҺukڵrέ… {3iΜ9nM@@@@@@@@@8 P+1             +_ғOJٲvD _+Ҧ߱Q XՄc Hї.]Yf^𥲨XȘQ^ RtR*RӦa׭X+!@O~yiڴiY&Mի+C j޼ƍ`)@@@@@@@@@p)E@@@@@@@@@@@@@[8wNޗKÆIIOG[ꚍ!slڷOںUڼY3F:rD:> n{VA;t;v -*RnR3H={JSl cI&Uݺu4dYFSNՔ)S#j+W QFʝ;r@@@@@@@@@0x'              5oF>(,AZknBbDSOIuoaoWkɓKe^m R`׮]ꫯe__SGwoO~v }TA ʦn^ZÇ?S^ԥK/^k5iD%JQ"        e@@@@@@@@@@@@@_ 44,4Q#)wn㏥-[oj&L5Y3ڴR,H+0_VNMtGGÆ StԼy>ర Vžy3D !!!J+?^Џ? *hȑɗ/y-^8c         @d"{ @@@@@@@@@@@@@x-p;RR:7NڶMOʞ=^0xHL% Y=Dq%pK@Kk%%I$`{wߕKʓ'Z֠fOMq ~ 8qb:>|vܩ竑T՗17Fu*gΜqW{Fj֔,r0ix)_>i`9?"@ҥohӦMZx7ncǪxn0`mc8@@@@@@@@2@@@@@@@@@@@@@oT4rc//%l)e ͜)\)u(L} Хdp :u.3fCq] Gx о~HݻKEJSP(@ʔ)zK[nܹsUR% 82jԨQFP"        ZvĨ@@@@@@@@@@@@@+'҅ /]zQ)Gw´6lFޗ_}"w%U Y̥-4T]9<1c(}W/C @TKkHw)Tb_@|\ ((HUT|ݻw{;~tyA9sfG5o<!        ? \T:"             ڵaaZ;vY#}\ΝƏ*UJ- l7ߔrߺϗJ:tP2 _=\Æ 5qD U*0`9_LD@@@@@@@@Ci             \K±ʗΟ[3JIfj%e,͞-X!o/%KvYx#kA3ϋb[`ҥZ%n:wh \H3i4y&oHg @ 'В%KrJկ_ l~S9rPfͼ=_>i         Muhl             @\ ̛'}t´%/FٲI 6mZV-fDu&%LwDRzѿz5 &(O<*S̭u p@PB뤮]5 U @ -ZT Ү]4j(ݻW5jPB{z@@@@@@@@@ P:X @@@@@@@@@@@@@_vmi…+ Sھ]z )g+a$ж$I؈Νj X&NM`>*<ԫnTԼTdLY %Ļ!oٲy ѣgϮΝ;k5^        1#@V̸+             1"Ktwqlt՗3@HJ1lTAAR6B2i&5k̿B@lgIK o(WNjFڹO@ ~/Ppa :٩~iԩʟ?\hߏ         @ s             @ .j%] ^k 2@x)´BBid?)S(Sti #@씛7O+i|@woI?"@ԩOkݺu8q٣˫Fzl        1#3+             @|8w?cǎE<8qBON:ӧO_xY]m:.^ ^ϯ6ώG„ K)yŸ+qW%KIɓ+EWL)S}MRrzoH=z\ڒGaäW^Woǚ}v7m۶Mw֡Cta&Mwm۶^ٳq]G`sD"v>K q=ϐ!rᦜ9s0$I2O߫~>]#!MJ HKK}$ԺuXa !ݨQ#7-X@ P:uTLKB@@@@@@@@\@8?            T-˂xΜ9eA`6ΣGF 44ɓ,,|+M4J6md>ӧOɓ+iҤ <٣W ЊO"5o~^#vZZ*bZz6nεȞ={D߮xAwTX+³:eqs;fݾۧ;vh3gVUP!.\MEqתxR`޽Zt^~+2bM2^zQyԶ4dRʱV;B@@+VɓrJ/豿@Kvkժ        s#            @P) ٽ{ßk[fA26YL],*]t.-ɂ㎈@( @TR]hAZG|je![Ǐ??"q˖-вyǡfaZg7}JR<Ev[Be˖D9s&W|ic^ߞsyY͛7kѢE]XɓWw}*PΩ9r)YdW'o[nvkݴi&Y/pNrELwu햋f̘F~X=%#xmF_Kfܹͤo@w+/Rz{GժUe4@@@@@@@@jΨ@@@@@@@@@@@@@ @>[FLcǎi׮]:{l-nS̙ݔKR([ ʘ1cc]Vʔ)# $MT6፶'兜z!dGuArf?g{-Y :)-y^V6eϞMow!@hF ߊ͜9S?~gwk}]ڵk2eʸ 0-_PP>5tW BO-^Mo J$*UڵkTR+:'3f͚,P#]rk4uԭTԹ:}N*A|… 뫯 w-Zxaﰁ/@@@@@@@@@R.9             ϟ͛qF7mڴI6-[#H& Mʑ#PHjՊVʚ5dɢ 2렗,}eayWA^uiܔ'O… .gڹsgdjzɒ%ڶmNZZt+ۇM<_| {M0Mfi]ydnemxa:u"m9s渠AG:{YfY%J~|xbZvi 'խ+ &#}ԯRtȩ @J,ӧ{]]~罐ľV.         @ z-[@@@@@@@@@@@@@8|VZ妵kjݺunsι^SJ~daHt)gΜ@-Q 8p@[nuZdAmmԩSnS 9` . *EQu|tA=ZǏעE6mZYTƍUzFٟ\RӦMĉtRYx]FԺukUV-%۷owgώ ^tZ}w   XPȑ#ճgOeʔI|K}FqٱCvkkaѢ.      0v@ އҘ1cԾ}{ 8PSrlj}@'f      @ p!@ u@cK@@@@@@@@@@@@@N8˗  S.\ β`bŊhѢ*Trʥ ~X8w Zzl8,p˂$Iwu'{_[-p,mĉ߿O)SF:tP͕2eMlٲe9r>sw޴mV/g~=f]tٳgoVHU p-3$4֚5RNR^Rtڂe Č?,yѺcfG>+Z>z`,.@@@@@@x&@V<; Z@?|7)["            \K²~7-\M ʘ1J*=/^\S„  DE]Zٳg])Yp}:v *Y*T˻9r\9Tŋ?~^}U/pex}'C3`zʂz衜9sJ1Es>C 3jL>XzeiذP- nh Ě@ڵb uYռ^^K/Dyv        @ z-vǞ@@@@@@@@@@@@@?ZrΝyi߾}J2J.rʩlٲnʞ={`"0*.bÆ Zx,\?Й3g+W.URMիWWj7ۗ/_\}ӺwFĉծ];^Z *;-7oެǏxq\ GHZ딼Zj@][^btN \@͵dm߾݅_7fM@@@@@@@@y|Q             }/mΚ5}Y9sF BٵkƏzJ%KT„ }|jA $IJ*{2e< SNںuZn3f͚zwiӦ8'O?hѢ1c&LYfXb[g$(Q"2n:U^] 6T۶m?Rq+dz?B}"ssK_}%Xy}bn wq l}0UXNy:F@@@@@@@@ P?U#            @, X(HϞ=U@y睚8qj׮yiO< bU H J.{N?:ɓ'H"z7o^7Ԗ-[c~8PGuuAO6m#3gάѣGйSǵkG_՛#GH¯X>ʕŋO?^ʟ_>۞@UԩS~=ܣZji%#        @@@@@@@@@@@@@<dɒ*Qf̘:hÆ ${S~,,Y2{.LkZlիO>DyQ5\ɓ'xU/Ez4b7NiӦAiw|;wߌd^CC Z֭}V^Tـ2C1o2cƌQ&M˗/ )@@@@@@@@nT@c}@@@@@@@@@@@@hm*{.PQFPE[nʛ7o@!kj׷o_YF/vw]vu稝E9 jܸO~I۷UfͪYfN:[;W]fZe||*AH\;,X˛ՃJw--]{O@" $H@jժkΝW        Z~u(@@@@@@@@@@@@bJ`.t:t萾[mܸQz"$wu_>tPt?~=Zz &pEjJ .̙3Ujۄ1$$I}j޼,B}mݺUs2Q [6ihya-+=h ]! p 3fyF<Ν;w         @?%jD@@@@@@@@@@@@{W5jP\\(iթSGAAA1_:FH8Zh_~EN}TN:t.\;{UرczU|yw}uԩ+믿*UҥKXVgJJ}f̘jw1޽{]3gG I }ȻFJ^% @ْ%K"        @ t            &0|RhQ-_\ժUhCtgh;v~!::l˖-5j֮]/k-[ԟ'OziӦ q /n: 4z M6m«ͫ~MZ믿iӧOiYۤIT@۷oㅽ~a+xbtt}9r@Lȑԩʕ *޽{kt        @;@@@@@@@@@@@@|@?PccRHUV RfM]p!Z6sLEwr35ZxM۶mGQ%nza,Y4k,*THk֞={ðmCH˗/玾K~z7NY#FD ܹnhB2dPvG.lƌ1-yQ}ڴio6F(^\wɻJ JLǏX @ {ʕ+ *3        ܌Z76             wOV][owK/fϞ)dfkߺuZlm\ul & "}8Ljĉkĉ QvXٗ ܹS .RJ%n$H2#N+@IDATg9rP BCCo>:yd=.bf4=)Д-[V_u4}X]'O}@_I (>PYi DHwְaⰊzի^5kLݺus+;vLcǎUÆ qF[*UrX"Rg ,s=Uа)SD,?rI&} 2Dsڶm={DwO&M-Zz|IM>mj3,k?z>|X#GTVTL6[vy׍7h֭v5~uɒ%nj4;ƒix Kۅ w߹ 4/<*Gٳz7eb-k֬k޽Vٿ^z%w}:·?߽Wlׯ_vcxbZ~{͙3* VjbX;}Q޶넅/Yzcw}5Ǯv^XD JlڴCvrǵXOׯi]7׬YݻG̷`-ۿ]ow)Lh"=EZj_~no?%IlDg6lzHz dIi7Co w@@@@@@@@U[@@@@@@@@@@@@@?~ @J6ϕkaN4m4caU/ * Yrʗ/n&Nֵys֯*UO>#uEPj*(P&Y X^ZEщ'\А.]o8 nZnRH–l?uq_vZ=cJ,Ƴi&EׯW tq=Z<>s޶mtA󐗪ЩS'YpiF9s"GejdX\9Y荹*TH< ر+Fm!!!‡NꂬDlr 5{?u]5_?i5jPѢE]ؕYGYۼyj׮ի,?v ˑ#=UzuպukZl{_-\&M/Kڵ[~+V̍׮1CCRܶJҤIo6@ٵʮG ˗]vW{& +X leW;3fԠAdO˖-5|pwXaT ˞={T^1?44T>\rKWڵ,,B?l]^t>/\ ߳,WڹsȒrh uK Ws?wfhfkc,CÌ)0b,ome60aFQY"Q$Ѣ~;n<{,yӹZ)W6 peЀC @jIGte5GD @ @ @ @@YZeL @ @ @ @ @ @(n)ɓ'g2իWφMs)D+8@+23ҥK#լY3RhҒ%K"ŤB9ls“RWf^ȶG ZjTV- ܹ袋pt~ dMPp^ϟ??{, +)$* &ޤƝ_x}R{͛7Yۏ5n4K ڵ늛 SU>>`mVpZV=zt\{g u]@tW,v[3|']|I>NS),fCf{/%RIc)l[o#Gf˵]2#k] R(oV)*hP—v?H!\3J߻ロ]2w9d+v={vpBM{R.}nݺeH|] &Ka[lE~w,ӵZxqv-ֳ.Pk=F l]^# 4)rgJb @;B @ @ @ @@Z~j @ @ @ @ @ @XM74fΜ Й[mUr_*f̘AoW wJǦiRISU wIAH)|+SfN:b)D*}7|SpVRg};Se˖ѤI?lmJ[ouR)5,C?g??2429ڵkX8SC=}W}޻v?oOis޻C B>_sHtIt/>?wMˋ/8Movl61eʔXpJ7׿ºg1#簤J KVZ%zer]ND@#|3"(Ѯ\~B,SI( @ @ @ @rH  @ @ @ @ @ @ N?}3 J!e?Oǭnm:̙}Ç:BZRV*=P`ri~{XUhCcq]w< 6,8∕ZZ1*#CfsJsK`RVl(t]\SlI;=tl~_ay~ztc…&ָ[n^q͋O?[ۋ8iQ*?l?iq4W޽{|;\2R֪%xkiܸq>(R݊%LҼy7{RIsسgϨW^΋^zeٶ'5S PQr9q啑 `9rՈ}=ؼ @ @ @ @ @[@VfO @ @ @ @ @ @i&0`@1;Ȥ15k,ᄌ;G}1Ae\KH!G{^ϝ;7[.[6w)|IW ڵk<1k֬TƒRyᇳ0ѤIl[_QƖocm1ByR/eC /[SIף]vgk:60ڵkǦn_|Eg?iӦl[J۶m~ƛoYph/~,`*+k6rMW_TS\>d;-NѢESSIT./Rs9] ˷ /tȑ#N:WY /R@V|Yk ,&MZ}SKtqt?vw#@@Y=mHؙIկ"f,k#5 @ @ @ @ @ !z%@ @ @ @ @ @ @\ *guV>̌}Ȑ!YHUP>$;J{dz):mˇA 80z8s)SV*+FM<9gˢHaY7xcvh ѣGlѨQl[ IL)OSA<i~pxGbԨQ I|JCHm#R8ε^5Xc|bwM6$ 5KK/ͺx'#o6]?ӑtn馨VZmvzw\}ّw).SL/>l[ZN;- ٳg\tEߞ{.ħ~]ϏyLﹴ=ԠA5]RqUWE .K<} JD+џx,S->:mO4n!RU*>w^4nxf; /}Ƌ/}f+>{uޑ=%_ ^qn-VZXkeQ N_{-rϙG\ieqjD @ @ @ @ m@ @ @ @ @ @ @@Kk:*8,<R{Ж3<3<ȕbRxU ҪUVeǦpuI'ń m?ϢZ),+LB]RIN6'|rw J!a) 'Йg!0)8*}Ĉٹĕ/:u.]믿~x߷LWcǎnݺY_<}}yutSW*?|qA|)*`׿},]v:ŋ=ܓv8P_^; yi}իW^yeFi6x2 @: 5;6r{Ή=6eױ! @ @ @ @ @9*?YVFe@ @ @ @ @ @ @(a#G澈Yhu]rH SK kIPӦMm& ݫWHN) i޼yѰaH4EE)*fz]NUݠ ,ڵk5k֌6[դI}sY)hi|&O[^eVz6tƘW]ƍe|pYڟJږƔ淾A6EqL0V[}k GR)$,m6 4+Yk?jk뵷PG$;# KF)))'{n{;~rV жyi%CS\ ={v|7Y^>@117<;6d{ ᥠ²Vn,oƌemhC@ȅFw_O#rEpD$5ks-k{.kWEsaצ @ @ @*G=tq,]ϫW}%D_(F7z:$@ @ @ @ @ @ @@y7ވk69,0K.}g.`TڵkWhCk߭O?ժU} y[ȋXڨQ">R!d+v~c{gY鞵1  PZވ?]q܈/OϬI\  @ @ @ @ @_h Ui @ @ @ @ @ @@ڵϏc=6 ?яcǎ~2}č?z6mZ4k֬Dznذa{km;f9蠃CkB:uָ$wǒ4ؘm?quŗ_~ 838Hbʆ ?vm8unxey}ᇳe] ȥ3 *ȅFsNDgg OX @ @ @ @ PjUh @ @ @ @ @ @l[lp駟վ}fa[:uڠ%K#GN?N>}Oskd4h`Z(!CcSN9H!eW PG0Ȉ믏o\xn~QJu @ @ @ @ @ a; @ @ @ @ @ @G }ԩS㪫ܳN;W_}uL{h@Y5jT7m^{|I5q0`0X;v#Fć~{G,4]W\GuTX@ڑ ?>r m^Zy @ @ @ @ @@; @ @ @ @ @ @ePvcܸqѫWb뭷nݺ~x뭷J|5kB2,^8}ٱF.]駟~ewO>d|Q?N:Ht|G7F @;, =!@ 4oqoΈ|'?4m8 @ @ @ @ @` Kg' @ @ @ @ @ @ʡ@ K`7s<;Sh";2dH̘1ΐ Id;3cõ:v8 4  @ @ @ @ @@UA.i @ @ @ @ @ @ P]v.,F~aKϏO?4?,gvO?='|Rr,Ľޛfm6ѦM8sJ*qg_~9ۖ+/Pv[sa$3<۷o9,YR@#?~|tA(~ĨQb=@34GY>bР[newD,]Zzc3 @ @ @ @ @j @ @ @ @ @ @,[ǩO=T̚5+FrH,bh׮]7 ycѢEEn߁*yw\{qGF-m۶q)G}'xb92f̘C >}DӦM+A41cQGvZt=VIdR@s1q6lX:רQR.  PqjԈ8㌈ "\qݺE ^qlf @ @ @ @ @"P 8  @ @ @ @ @ @ PVj֬={j W^_|1^~o~yԮ];v횅N/o}E`ܹoǛo̥ѣGŋe˖nYg{WAj*+<6l7pC.8p`G?w1?8ãjժcC&;uwqG4i$8餓FJ|Q @r"ܳI{G2##ݶĺ0 @ @ @ @ @j. @ @ @ @ @ @@ Z1`+1nܸ,dkȑw)x(t1vaڹsr-J*ӽsl%KĉQFEN0!.]7o VZmd t)~xwK/޽{G۶mO}FӦM7`QO˖-#Fmݖ5o<rup QVr4C%@@!'# 0 rqᅑ{)3 @ @ @ @ @@yU @ @ @ @ @ @ Pnڷos1RoVDo㏳ՋoOa[o׮]ԭ[:x={v?>cǎ1cd5-\0 ~kӦMt%:lٵkfmdx7_~y 8098cc׻ rɓ;#R{wygDVf 2K @@w=G~0{袈_*of(ը  @ @ @ @ @r',ẁ  @ @ @ @ @ @UVN:e裏.ҬY[>GŲe˲-ZĶnm۶dRM͚5+h pӧ|?0[N81 њ9sfLjղX z;㬳޿)~E1@ ? !CBIn8 7n|pq0*SxTl=CY}עI&ӟ4~a*  P~r;YVz<" 馈kO @ @ @ @ @ʫ@z匛 @ @ @ @ @ @ )Vfu Λ7/&LƍjZOuذa1mڴHHԩS'jhݺuL[nej*Zl ش .g>IlSN)SɓeڶpLz&C=4ڷoմF\Knݺqf5|zz^{k>.T/{.ƿ;vl(>O\rI>KFJH =.õ>;⠃"7k#߾:, @ @ @ @ @@& @ @ @ @ @ @ @@9H4]tobҤI$? ܚ>}z,ZgZoylYfjӦMeZ γRvΝ3gΌ3ft?䓬Sւ ^vڧ:z왅6mdk)TK!P6`pCfaS^zi?7o{#vuy督-[, 9|WW^ov59\˾{ *7 &⡇"^x!rfEc/=/oA @ @ @ @ PUK%ئJ @ @ @ @ @ @@HWm]VW7åKfK}QBRR>tiرz hZdJMl&YfmM4M7ݴ׍5*76lՋ*UԖ+ W_ŗ_~g._|E>k֬ϿUu7oJլY3 @Kin>dZT[l:*JS kxYM#Gs=Qx);ڷo;vsR%5;nj^LNN:~;Kc$@k^瞈Ϗ .8?  @ @ @ @ @@1 *&H @ @ @ @ @ @ @ TZ56|΅3Ƥ3fD mJTW u7n\-?0tު%Y~hРAPLSN+׭[7ԩk2Uk5"QZ+n[q=lٲl)4,9z~E… UX`A̟??+sT,<+h͙3'[OǤ1ZW|Y ܹs:b5k, ITSB 讻Sh+oV\#HTRߖ[nYPSP\ˊ5W}"H>>ϫ~g2/-SOcԩ5+?MFN޽{GNY_yX @@HY}D'W^FrKUWEvXś @ @ @ @ @JC@Vi @ @ @ @ @ @eP ۤTZR T ={vBU)T*He ɇNLJaU Z>Mr8Kf),RO>8,-SX 4K!bp2RM@@eHYRIR͗d5a„8qbp5eʔl?,+` ->)4+wqf[:=rC|({QK"~ˈ[]ѭ[ @ @ @ @ @ʓ@t @ @ @ @ @ @eLJ*Y T jmt)\+kp‚ڿܶ/,]`Yz IRVZիG͚5Wj^O!@djԨ;vja=7k֬,/ >Z3^W J5} P\b/q;ѧOeEhQC @ @ @ @ @UE&@ @ @ @ @ @ @RHaUXF:4#z.TrװaìVr '@,OĐ!ѾYgEԩ; @ @ @ @ @@9Zo @ @ @ @ @ @ PI c$6M @r#лwG\pAUWEl]}E,[Vn` @ @ @ @ @RU @ @ @ @ @ @ @`m= \#'@ P:kGw^ĸq_D{/xJ @ @ @ @(o3^ @ @ @ @ @ @T2ŋ#>;w=*M @ lywDFDݺ{qQ'0 @ @ @ @ @` ڨ:#@ @ @ @ @ @ @u뙎'@ Pz;1|xģFzD\ץ7&= @ @ @ @ @ʲ@|u @ @ @ @ @ @\`Μ/8Ԉ6m*9 @K8w#.<vۈ;X\NǠ  @ @ @ @ @%& Ph5L @ @ @ @ @ @*BRڒ  @@g1aBO~_Et1bDI @ @ @ @ @& P]!@ @ @ @ @ @ @L`ʔ#.0Q#( @ʿFpC;DhDrHnf@ @ @ @ @PZ*| @ @ @ @ @ @(Ϗh*_i^ @JMcLj:4b„?bR  @ @ @ @ @. P/ @ @ @ @ @ @ @#GFW\Qƪ{&@ P1/#_"ڵ馈ŋ+̂ @ @ @ @ .E˱ @ @ @ @ @ @ Q c( @@ TqG{lD]D;w=* @(F\WbԨ1n\\m\(VX,rˈn>fٳgG J箮 <JRSnib­WR0֪aX *,+2ua^)+Яaaejsu%/ͻQFYmܸq^e&Mb6 V\6]5jI @ @ @ @ @Bjc3 @ @ @ @ @ @G82 @ B>N>=RM?ӬT?3ʡP)*]i6W9.>T$ j 6 T7d,D*ePPR_%Z,,裏re2>,;wUլYh޼yE[d5· @ @ @ @ @ Bw @ @ @ @ @ @lT)S"~Q\yehhv3 @eJ`…1uԘ4iRV'ONaMi{ZΝ;`ժUdzc]wšRpS6,RVewU=* J2p3gf!gLhj-ZT\VhժUVrlٺuH7մkYД @ @ @ @ Pjg @ @ @ @ @ @(||#fߴM  @9sbܸq1qĘ0aBLN>=.]VfHaJ[mU.,RRmt˖-˂6mZuȑϟ_TlMm6ڵk-z @ @ @ @ @r, P_Ȃ^~2eJ,^w&Mvm:DNb_/ @ @ @ @ZJ' @ @ @ @ @ @*]TwމXhQ) @T6sƨQߎz+[OAZg(RQǎp?[o>ڶmjժl\͚5Tweo´&Mƍj pK;wvZm*ٛt  @@`ʔ)'^z饬 ڬY֭['?ɖ]v6mD*U 4n8c8iӦooFq7y睗;tPpN:7V @ @ @ @ @G @ @ @ @ @ @J(p-'G 1?m[hQ%0e @$?|՗i@pu Pf͚?xV |MqG>KQ+X@ժUk׮Y=bٲe1jԨ׿>}D]gϞ89hժ՚ @ @ @ @Q@VF @ @ @ @ @ @.0eJW\Ѩa-ZA @_u<#1dȐH!Z׏^zŝw_NЖCTf*UD.]ڿ?~ > @ @ @ @ @@U>Q @ @ @ @ @ @ @rK~@El}cѡCqw/[,~Aq; @ :4:wK.yu֭$7uHÆ N;ogΜzk+b7^V/fVZ򗿌1cD׮]#jvmk? @ @ @ @ PjUKn @ @ @ @ @ @(9/SOhf/SRJ,^xfk2|4iR}1v2LFz+ y(2 @@ӟ?pպu 21cD^~Ln:ߏo9&Lo,s5kV1"z꩘;wnBĎ89rdY4j(g93<3=hV @ @ @ @ PjUi* @ @ @ @ @ @(mA"&1pGRz"j;,Y5ڧOqA)MAaǏ1cDժ|..  @ *I'wqG\pY8kjLk ij>]tц6׵L~iEvVioXq.m]ׯ؆g͚5w]Y uQ3č7/  @ @ @ @?@ @ @ @ @ @ @"0eJ^Ѩњ\@??F˖-+h4W(7 š @\ L>=;,c)s(^yqGo;!햵V7c ;SN2w{Ʌ1W_}L` @ @ @ @ @^z&@ @ @ @ @ @ @$pyZEY@Eł o1ҥK׿-Zd/+?>~ :1cFu]1lذfmw]4o޼`̙3s!_㭷ފM6$1tи;믏n!Fݻw{/;k׮ѷo8c…ٶ {.;'sSO}=P|0fϞۯ`>h駟Fnݲ6lX  @2 4({6_o:yLZƖ:NP) v3u]K\x?8䓳Ela'Nb;jmOQ"4EHBXR,5FdW2v Ňe$>elєHRYRwݮ-th׮]Ѷm,@{YրӦM˂RV JW) #ܧk=9{w\r%Y0¬YwޑKA]- 6,?d UVڦ\օ^j6z0裏FXf `ҳ:+?LK.Ѻu8p`믿Wޠ9=z> R }{W~faoVt)N8lp~*͛gA_~e/p v=D K(XRBٲeʕ+g\i^{YH½ޛ㏏> |gM"2PLJ KmJz_7j( J!IoFB,))7MNNTrHxGgZj+_?z&]ƖYSPRX&MϞ3LSK7,av(+=KAUy)jeeץ%wޑRpzIAqrJ2y @ @ @ @ @ @ @ @ @ @ @ @xĵ./ʕwy'j׮)D WZlUV?8|nJӦMw7n8f̘)*< JAXtI[ƺ)!:udVRL!Yi)$+W9 ,HWb5J*寧:5kO=Tu'gm .C=4nv|cBXRU*U⫯*V5FO<1Rߟ?}"8"b]~~|i{RXU },>׮|y1cvXJ:7EE /0~><ƎKO%w4e6vK/f)<뮻ʚvmYB sqń 8 G}ժU_ѣ}مMX+gx'SҝwlI~[Ǔ)evAYӧgZjW_{gZ08ki]~n]Zz&͵+-9zi/mǹwϚœվ.k.o~I?S[lQҧb @ @ @ @ jD] @ @ @ @ @ @ @`m/bĈ+X1+faV'O;?eM7Ͷ6x|~_RJ[o>s΍/g 8p;#ӟsL|q5DJyO[l{A^X z"矏;fmgΜ)XpO MX+z:u KgUQz&][r(j+ҮmSIז_z_W\~Ǐ[o5s @ @ @ @$Z~ @ @ @ @ @ @ f̈҈SN_źPBl&Ib'۱:;OOOA[rXwuÇ?fX&M߷8 ի_C=4z5?#n-|G#F/7|??? 5t8sr @Z`ʞtƍ+)W^QVG'xKo=XզMQFvޜ9s{.,8X3i[.$j޼y+0ˆe.gט^L(ڶm[T:uIsY FӧO:;Uʦh: @ @ @ @ j4 @ @ @ @ @ @ @@WD^p@F Jc7tS|Y''N?0=` }uɂRPw|A|ٱ2mL<9ۗ+VN;- J! \rIղe˼N;eml9~lYe 'vm{GTV-:ꨂͳ3gf\`W 曳})(a]v^zz>h~ѯ_ٳgt9m @`mVZ_,|,85 ƴ/64{l_ z/s'Sy⩧;/}ݘ?~<7Qy9iӦegt~o6붨-9:ʳ>)(7.o)tInSYzOOSv_J;RXY!{np1,Ɩ[|ɿ IV䷲SL}7#B~UN&@ @ @ @ @R! PTF @ @ @ @ @ @ @4)".("/jKcM7'|2&LcguVQ/8?>;u}`NQFe㏳{l;6~ѣ}ݺu>, J/ݻw4n8c/fv)p޽{4h vGvժU~1bĈl_.]wɂR`a1;p5ks= 旂&s+ @\\rYi۶mEYҚ&I!Ui,zjwqqgFzn-XΝM6ڥgtGgMRl JT)T5CݐB\S"=#ҧOx7#=gT%-Z( ]3ivz6.jli,99_~9:v#m7j(4i= w! Me~Tвd3^mQԮ];)w-FfͲqg_kk R+<^pfcMA`i5;)V|9J?+*k;pqc 7믲k @ @ @ @J@ ۈ  @ @ @ @ @ @ @`M }?|QŠdvVZ_HOaXf>_0*s~ QFnr/S[n,0];}=W,Xt-χ߿\rL:5*VX?7nܸc)|?ח%-ܒ~a8@@)߿r)Ѽyp=Κ s)S+ovuW[mU @e t5 fݻw4m4u~޴WNRSYs\ *Ux.ܾx' z_LZ7Px,vߑ|ׯmpŶm.it?:l{i?1oeLK+]vxWNl(|B+ıPkloqu;2`] @ @ @ @ָ% @ @ @ @ @ @ @@q+E~҇~=xGcǎQLhժUk.ڴi 6,1>BO?^x!?|̞=;ZhzN:E:u8  @ @ @ @J@} @ @ @ @ @ @E+"~1 V\ @J^zt-s̉{.~"ԼM74w{c= @IW__~9 3fLlߗn!ڷo5k,4~ @ @ @ @(f 1 @ @ @ @ @ @7I"W^G @(UV;,i#G ~z̜93ԩ-[v-vuh֬YTXDנ ,… cԨQod5i;6*W=ҥK~N;Er喷[ @ @ @ @ @ Za2' @ @ @ @ @ @ @`8܈u#z\m @[qƑj^" ><^z:th\q_DJbv͛ǎ;oc}t:J-Zq;ߎٳgGٲefr7tSj*;Pz5̌ @ @ @ @Y @ @ @ @ @ @ @ }W=?#*T(F3 @+Q\rYhV ʕǰa⭷]ws΍ʕ+GFI&Ѵiljժ;Ւ@1cF92F_ƬY*ot 4Acy_Y\2eż  @ @ @ @J@{o͌ @ @ @ @ @ @ZW-":t] @@HCT.\|A ><x駟iӦek֬mT6lo^zQl٬? )SĘ1c⣏>ѣGg[:ujv[/ a±R \J>mYs=_}{Qvh׮]xѦMXwu; @ @ @ @XV> @ @ @ @ @ @ P |2W"xNΔ @@rP~3ShѨQ#⡇o6kBr,\+t2mUXql(,&Oƍg˴guΜ9))*mvf˴[D2e w78vEeq(cƌcƿ;bY۲eFڵ#ku֍\p F1cFB>Ә4iRL81 KZ^\rԯ_? f{N fuM7]8)YfY 믿fZ^ziyYp!|p4o|»VuH @ @ @ @%Z@V}O @ @ @ @ @ @U#Я_Ą J @ lF{~1~g 5( >< T3gN9)@)ڕ· ֍78jժ_+V5+RT)\--?쳟)SWT) S|ͣA>[lմBR՚*)裏j㫯O @ @ @ @ @ @WDc @D _/u))6}µr5;L#FȂRԬY_Ŋ#k뮻nTZ5׫T+WuY'J*E'L멦rE J5^xY؏y/$.\0[\+Lbϯ_">[̙Ξ=;[SxV*-S%Q., 1UViΥ%\|I<#ǝwޙY|YV6mk @ @ @ @ @WxN%@ @ @ @ @ @ @@i4)"2z6;!@ Pzʔ)ԨQX >}zpL5 Up¤rSSN_;wn~(U.*] \XXZ_?ԩ뭷bbt<hU6P@IDAT{QJ,]~qgguĉYV j߾}ױcܹsl2Q @ @ @ @ @@w@ @ @ @ @ @ @QnDϞ @ PJʕ+µ4HZ͋j Zڲ౴X˖-+VJ*e˴NYiիzꤼ? ~{g8#pf͚A2 @ @ @ @ Z6 @ @ @ @ @ @ּoGG#~8B5?# @ @ «H8lq9d>ȂR5\m]wqѥK]vq1 @ @ @ @ @j(r @ @ @ @ @ @ PLzh"Cb:@"@ @R#ШQƍC{]vYlfѮ]x衇b޼yf&B @ @ @ @l#- @ @ @ @ @ @ P|2W"O  @ @ nѯ_b:wlIz1bĈb6b!@ @ @ @ @U! PkU @ @ @ @ @ @%H`>}"8"b]J  @J@ʕSNƧ~{nbĈR=w#@ @ @ @ @@iUZy @ @ @ @ @ @ @ƍ8̈oY"֍s @ @@I|/O?4nxiӦѦM8p`,ZL8  @ @ @ @ Z @ @ @ @ @ @(qE\{m"2B.`~ @ P*Uݻw#GƠAL2Ѯ]hܸqs=`N`~ @ @ @ @(J-4 @ @ @ @ @ @--,4k>}"2c"ZСs%@ @%M`>F;Sy[7}]I @ @ @ @ @`j%@ @ @ @ @ @ @`m~x,\cĔ)GGL1tڪb @ P~cرqAL-"ʘ9sfi @ @ @ @ @ *q̀  @ @ @ @ @ @ bÇG \Yk1n\% @(]Ջo9&Lݻw+" ֺb֬YkfC @ @ @ @, PѣG\veYֵ^+ S4 @ @ @ @HZ%4 @ @ @ @ @ @O`Ȉ2enۻw}ETPt;G  @ @@iQFw]tQ7{'/zԥ \ @ @ @ @ PLja @ @ @ @ @ @X)PkiAY)h#en @5kƕW^qp>6m|xcM6իs=#@ @O^zOfNm&.Q6%Z+ @ @ @ @ jb:' @ @ @ @ @ @ @ bʔ)1~~'jڞ0aBr%`ժU+6hX[/ ʅa`aY)D+K]r[sY,+w}Ipûb?G?cn(QRSNԯ_? 4_r-17B @,&pǾ}O?=wyg4lpv6 @ @ @ @ @`j- @ @ @ @ @ @_}U9gu̙J W^Jոq8蠃nݺgYiYf(SjS|衈Nvλ^Xpa9T?4iR~ؿY`W` J(\SB @DTZ5ҥKt=vaKwQ\9D @ @ @ @ VLs @ @ @ @ @ @Jybod?OL0!x5b&MDΝ:ԩZò.tS!M6$?]|m駟Ƙ1cQFE]wg6ĮKL[>- @X#H ꫯ/8y]:3+ @ @ @ @ JK @ @ @ @ @ @Jw}ZY}wc³vy8cf͚EڵKBD~YhѢ,P,Tz衘3gNTZ5 jժUR?  @XһrHt=7o]vYuY.{m/J @ @ @ @@%e @ @ @ @ @ @$O>$z8p`V[m{w|Y[oV)SL~V,\0FÆ nָ b׏}7ڵk۷Zj= @Xm6^+g}6瞨[ ) @ @ @ @Nk͚ @ @ @ @ @ @Q`̘1ѷohڴi4h .Xo⦛nI&ߢk׮!L_HrI&ѣG0`@L2%>KbΜ9ѳgϨ]vl2nϊQ @ PJʖ-w^BޗC=TJfg @ @ @ @XuV  @ @ @ @ @ @(ӦMvqhذaz뭱{믿~8?l͊hKv83b˂֭[{7Ν['j @ @`9xw##8" LM @ @ @ @ v Z;Y @ @ @ @ @ @(Æ ]F:uϏ&MĐ!Cbԩq-ľ*T(kj뮻nvaѿ/Gjժee鞜vi. @X-UT½xE1nܸrm!@ @ @ @ @@IU @ @ @ @ @ @ TEc=[1cmyu]ѪU([VTUtRJq衇Fx)S .AEF⠃W_}u]Y @ @xr!fqw12 @ @ @ @ @@~{a$ @ @ @ @ @ @ դIرcԭ[7oft=T+zvp wGSO=gώ=3gxVE @@ bذaqGaz 1  @ @ @ @֤@5 @ @ @ @ @ @jgAZM6QF?ۯ[NL2Ѿ}x_G˖-7n]X @ @` TT)n{_~qķ~G @ @ @ @(>Ͻ0 @ @ @ @ @ @V@`̙ѳg,8jժ1|߿l6+ЋAEcѸqcax@ @V@׮]^1c.-WEtH @ @ @ @&Pp  @ @ @ @ @ @ }p裏yŃ>~8R ;7|sODݣlٲQJVV-6`^zlᆱ뗂 @͚57|39,T롇6mڬL @ @ @ @L@ @ @ @ @ @ @%J뮋>;;ׯ_ԨQD`(W\~qAE M;SRJ`,@ٕ+WM6$ԩ[lEVjvm*pm @(N^Ѯ]gϞiB @ @ @ @& PkQ @ @ @ @ @ @F•HZ)hI) 4_~9z7xc\q'nj3bW_}yV?Ә8qb<1vռyycw1RhB @@ QFq)Ĕ)S.+.3 @ @ @ @6Zڅ @ @ @ @ @ @-?SO=m۶]9 /_> jN~!z5j(r)|m„ 1r>|x;qUWE>}Zj!bu-/  @ @8cM7H ۄB.|!@ @ @ @ @X*  @ @ @ @ @ @(Jࢋ./yhݺuQM+rJTP!N:Gyd,[l4h )4+6zxѱ+WN:řg7.O  @ @8f͚qGĴibQRqi @ @ @ @ @(G` @ @ @ @ @ @(B`РAqeb5| Yfѷo"fr}WqGkYz}?>ƌ£,SL4j(89{źz7N=3z/bs ;.{sW_}\pAo>Vj+-_=zcǎ/im/\0ycw}7wjL>g}v^qO?Uѱc8p`+ݻw{oyԭ[w׸;uqeeǯ%KAUH_mM o;'.l_ tMQho6 !Kv)͞=;mto۴iylN:%iӦea_Ò @V\QFYV$~ܹ+މ3 @ @ @ @ Pjd @ @ @ @ @ @F?v YUEѼyxcȑe9X}~a/ItAOaLzmذa?!nx㣏>> {':tsL}bԩ1k֬H*\RW2JXiu]OKÆ HcwuWfk>^zf2]?`@nݺey+.?^v5wտlzꩧ+{饗L2ѵk,Tkѯ_Ԭ|U' 5!@EzE\QAPQTK&UQX]ņ]YDԵ`w׮k[{ ;ɞސw>9sw½MAI   3vi͚53HA@@@@@@@@JZr=             qJNN ڶmiz :#3-_\'pgUdaZ4.7+TN{S㏺+4l0뮻ܱfaFgVzzz(tkՉ'#FlI& >ouYx|]ptꩧʂ}Y?_m `?\*Tߟ1Drڵk6lؐѹҬY3UXQvf^\r:餓|,X |4RorJըQ#4ݏP5W_sLsguyw% jܸʗ//oٲ,͕MfV '!I&;wukY[ժUu]w MB@@@ 3Li?㹟E<;"@LxQ@@@@@@@@m             S2֎( *R~}ի>-™,k~PWjmPnWZj7;tԺukwLԯ_?uQz7k}hjرß:11Pa{'|qnM^zifJ6c =sBVv>#ug{衇dken=tT\YuV/hY_m&Lo) ~^d5ju6   _szGdO4lPӦM̀"PBrp       ĨZ1zc8-@@@@@@@@@@@@'D 8?}Lӱqϓw˾*_>Kڕ&}s6PYIHH5h K{Կr)z$ ?i*Y y/ɓu5RJY NR{͛թS'?N3GU Բj)        :`A @@@@@@@@@@@@ ,>:<)|=ڸ~[7=η ¨,)*i%ihxmٮ]keǎvv}mƬc-@jʕ1U<,iٲe:SujժU8p^z%>x7++Vu][lQj2EZILL~,wܩm۶nݺYy睧ŋkĈ~TN8 Ne??~*V,-ZCjҥ=sPO3gT52m?Qvv'fW^Q-T^,"u؜{nw}wp1 Zj\M`@@@\ >\?FC=$*}}Z@@@@@@@@ P+n '           _ ==#8BlrC\Tvv)cƅ>:Z TpkW,/@ws]vWmnH}qq& S[f ma٘bY8TRλ)|dDV[H-ݠA,}n̳>/=z,m 0r]yV5w\ 4HzI'_~ ۨ??3]veuv zZ͚5{G5vXuǮi7n\@Cs&;+b%']vM͋8o^^xau߿;0}YnڴA{lݻZj% &dc{^3H¸^{5?uoξ6rZx YW_ u{eב=}ݲFz-=۷oC@@(@nA_|?|;jڴiT Py}FOA@@@@@@@8 @ Z            @DHTHT`ۅZnD raP9-*'aRnHsݱo0j۶m¯,*}.(ҵyi^p+j¯j֬&M@qukG t}:uR֭uw wq~վ}{/nf̘gî-Ɋ-Y+?ߴ o9ҥ|OիWװatM7?0@|}gm~ꪫ4k,p kp\]vZ:(aV֯_YD6i$x≚2eoJO=Lwaռ;3 ?X߯z*P̙3޽ZfdsΝ7 8п .ԕW^ Bsl/p۬~5}t˾6믿֡\(7S֭{Oy779ҿ믿uj;? 1 ֲb]BBi   ҥKQJJluw*{{zj OS^z%p 1|?5>QI1{tݒ@@@@@@ {by_A @1 x_+x"%J9s           @Vv;Ǽd r}*U2Kٸ+V|H*ٯ XH%RUx[\M$r¬\Uv#nsX`RU$x?Azի %+v̼3fhŊn_#k׮Svvm6:<#s467,p,:fnvl ӲP:^z͛7gOxك4h?\x OSN9E>1x(RAZ:aZƹ:ZțN   ;'|nFM0A=zPǎc8(`6DD'        PfuY2.@@@@@@@@@N @IDAT@@?VeUTnsͿ{]B(^Gn.n\nmHHU/{e/&^SQJJBV.j[֭͛g sAX(%`R/uqiʕjٲelΦO>jݺuVrl񀀅`YP_]DiY`_Yx^ 𨣎駟{IҥK/F99={5kC@@ȣرc}]?P:Sjm".y!Ep@       $N@@@@@@@@@@(*"^Džosv rP\bAP`hժemm\vۂuvr]@q XL~B\Q,^#dE$аaC0`:uꤻK,0d %1bY{MI;j۶me?#Ծ}{?TmI}g9@@@bA >>^w:t뮻N/@ ! ]WA(F@@@@@@@ʘZes           P 傢]U/nP>kׁcyRyu¢\mARR%ۿrZ UO`uV?hm n-[ wX«ƒRRRԸqYm(Ef͚ZfƍA驧… e#_s/{ٴidE^W}pYgݹj}ݹ`@@@bAQF;tyO>:c8 ФIF.@@@@@@@(je#          P<( `).ڮvzqm*˕T) :R;1Q^=cm}cM`Un&ȹ¸:R ]m߾=b {aP!XUV-feuݺuբEL}ժU `% (yΟ?_z.jJg#giE`:o<͙3Gڵӿ/o^} /hժUڰam˾F~n@@@(BrJ>LbO~}|yy}IݺqF        @qU@@@@@@@@@@(`Y-"+}߾#ZH rS@H}UD /8k:XnAXV^%`-.ʅ`ï"E۾sΈ($%%!X5jP&MBW!YU^(b^z?ִitWh…5kWt^>{GSN>ZS b}Æ [OիW__{ONMMVBIQ@@@ʪ Ժuk]ZxqYeixaÌ@>QN@@@@@@@(BC!           J}=|[p?kg=ڶ`Yxy TY£}ʕգonymKpUn"(= >X iYHKR{! rWEnWn-T9y.}g# 2l6F>[_~E#F 7ܠ5kf{*mڴ-Zj^}U=je+F@@@.PF ͟?_]t Ν;K(^D:'       Zʤ          %U{(|\Ȕê\mn璛 0傥\]j*Fɂc,Dpe?˂"8WoU UV`Upk+NH7M4I3g矯 /СCe)#7;7Æ ՠA\d||>h;vzio6mڔ@@@$pjٲe~;Cxi\KhRRs9\        oO|2          @AY,TEHl"[߮]Wrw5 )@jNN>&EU@ӵ}Wm氹‹${/dUZLX㶹^Y޶@- .롇ٳpB͚5K'O֙g!CSNtwypXB{V^k̘19rj֬Y`ge l>&B@@@$ ~:#tmi%R8wJ@۶ғOK@@@@@@@@< '6vB@@@@@@@@@J rT.pʭmYsS rS.*Jy?d>^876|BAJlٲE7os ֶm"ay/Ue jԨ,Dž^E6NCխު3gֲet駫nݺ:5p@?t)!!!iؖOV#<~ ݥN;M?8    LUVk5m4?l<%%`P];3ڵ @@@@@@@QbpZ          PR`=g^ lk߾{[ހ rS٭WvaUoP!H@yduV?BlzjC rV M6`vrr2AXe D 5tPꫯ_,YⅮT>}Էo_|s~G=իWkΝڵf͚Y@@@N`ܸq;5g͝;̑@e㏥O@@@@@@@(j#         @PC"Y`+W"mLpZYT0*v 6.'+W>0O95eC(}A^\`ig9/ т,ʅ\vÆ 3m n^zhen:@&ЬY3M8_ XBO??|5SN:餓t '[nJJJ*iX,qF+Zv֬Y=cgJO7߬~~rn@@@lL0AW]u4h Ĉ@zRJGj-4@@@@@@@@xA1         Y\UUmscc\{D,BCթu\p}ܶHv\L"@H]͛CXm=o7HaX.nݺjٲe(d:a0`B<{;vlڴI/V^GyDfR9/I}ҥ:wmڴ)Ko[p2 uңG͝;W={~f~h    @L9R ,Д)St]w9q !pQ;        `ju         Q˅MY· rmWۘ;3 ύ:--)ePBFP rRIIRZ泱v\  @Htm ]- kǎ1, z~ &M#ï\`_7t"-?^֭[{hv ܲ?G}?Cٳ|ԩ>l{jܸnf=CO:KqqqPKB@@@ X34tP?`) ;K+Vƹp        @q Uw#         ԌP+duB6&¬xHQ)<(լy` >7ƎKA(n₯޴iSh=Z Dzz֭JɰbAVt IJvzԺuPVp`u˗/6+ %EaÆ4h9۷O|~mYL={m]ZhMfY4h -oɲ|]!uM#GT.]ԦMŇPvkĉ2e9?|ݷo_   ,?ղP;Sφ#@9s}'S@@@@@@@(jU#        PY( ru/v]mۂ۳[@ rSb­uxUp[xy#@$}PbŅaenY{r܄? +pe픔?nqXM ,$SNDpO>D_JOUY߃֭SYmK:u+ p .J~`c+Wίm T`m;v!Xm۶PO7/su]CU۶mu{^2rOZؤIt 73Pgu)p!   @aX85\ѣG?g(~ >;H={p        @q U@@@@@@@@@peUnqU.*Rp[j{t?*nezRTvv_\) @ZZa!9 rXM;Xh\Yؕ[lQF~ rۂeA$@BAwYgU|~g+ o|ےsTQChZF[0 /{HvԫW/}!~~VnBrrp z'{iɾ?OA@@@B2dh"B8S"@.u%@@@@@@@@ U o*        ĺ='܅Xq"ƹ`}=BrR傪.=o<4΍wup?gumcX@bQB<\զMBm [;nZ[n%&KV#bh"S@V@,  %]ªlIٷojﭶ~MMM S[5rDzrk,H+!~=ꨣrJa4i$C={ݵkל0@@@ P>ÿ+pB?^III8;S!@^w^zI~        @ PtG@@@@@@@@(0%^eumU#m Ҳ?ݸ̡V+6T~q.ʍ ?" Pv{IW±>?TTJII `YaÆHY. oa" bլY_y-Rfկ_c=V/^yMmzϞe,PRҁ0+v p5nyZ.*l@ʊZmٲE,7=޼˕+' jڴiĠ,WXs  Pݻw/իWnPNԿM6MGqD C@@@l ԪUK_WWe[c9%@@@@@@@@*"h        eO 5@ȕ ֮uu{xNZZ.BlC `]reB(  p@`޽\8V0m޼94mۦy86999K VݺuժU,XUT4+  @ K\ر9M:Um۶|@@@(uCU/磏>RKqA4ͥ k *iE@@@@@@@ P`= @@@@@@@@JWXH\fqWnu/W#RdY^eKm5ki/Rو ٓ)®6nܘcv7a\r૔m r}Vzjz(  P#[x ?L矯)SE&@@@bBNPӦMl2͟??&Ή@ xwZF4Kp        P*wkG@@@@@@@@ 'mv`@+[\w-B 2®,-.9@ rnW'$D;"  W}7 .*<kÆ Y{׮]Y[K ]e7@@ 0@gu~aM6Mmڴѐ!C4yd^@@@(X8]tEZxΝrx M 384i`iZ        @i/J]@@@@@@@@q Ъ[3\ Ųv8 ڳ'/z|v5ƍ%B]mN  @ZZ-ڸq+[?X{}V*xpUfbYm HİXE@(,{y睧j>}~ >\'NTÆ ̋   @0SW>}ʤ@, -YZ%3X:3@@@@@@@(:Κ#!        P,+ _\V~n^.FR+& _VՓZȺ`},U0t" @1޽;S(V0 ˅cٺiYV$$$z,զM,aYndY;)))8m@@ .@sf̘e˖iĈ0a9N@@@!ФIs1zꩧ*,ޯ6uq3Uo5        @@@@@@@@(beAX rmnx4, rmYK\UpouJA' ĐV|zӦMx /~ȕ aÆСB-Wf"...|:@@J@9//õ.]Yf鮻ҨQ4n8ժU_=   @OK,Qzz:)r@}H"Ie#        P**B@@@@@@@(g^m,˥Cl°\k,0,#CV,ĪZЫ`]N~m/ %L6lؐ.$±RSS3]mMECW.QF bm\ 2   !/r >\~̙;CW_}Z{Ѓv@@@,`Z'OoΝ;GD/@߾҄ ҺuR׮EvX       ČZ1s+8@@@@@@@@&{d!X˯\_Y;X[{۶qqR*+2\mW dy(  PrXpڶ͂%n+W.K(V͚5բE,.4j7EA@@(*U1cK/բEtM75\'[<@@@r%СC5iD ʕ(VG%Pp@@@@@@@b]@XC        @ XamؐQ[;nX/ض@(d,e{%kZUJHu@(;v}_m-+®,ZjyZk r1U   %L ))IƍӨQ`͟?_5vX]qJ(    c38C+WԌ3r@G).        @, wsB@@@@@@@(tifi\j[ۗt*Tr*b5mzm.4ڶ/@JCW.7nbñٓ #>>ޡz(Bli֬_P,W[8-ժU4+  dM<Ѻ馛~=ex„ 1b*UTF@@@-УG-YD[nUժU= @,Pu\       4J|@@@@@@@@BeX&{l,mljjhwe^Y(VZXֶ`,eغ[T90-@(};v`0[lQ}s(III~V- vڅ.jXjQ@@@ )^Y4f͙3ԲI&i*_|'c$   eP[nJKKo޽{A.AjRzQbp6        Pj2@@@@@@@@ȱ g_2_=P[L(ծy9ꨌu _, ~@([nñ{ .˵]mmݻ3Q$$$B[ڶm/+V4+   Pϟ뮻N3gW_sneS@@@@ yzW C"pҲe77nr8(       ZFρ@@@@@@@@'eU3~hbAYe Xq`iNSS'bZ@([l񃯂WvK0˅gsXB Bjy͚5SΝZbaXvYիWW}cBA@@!P^=-ZHƍu饗jٚ:u;<Ǘ$@@@(J?^ZQc!@6^(xfԫW6ل       2J r@@@@@@@@ضM˨ > JgX{mhiH^E!HnЬrKqR @ lypAXvXn±*U%}°XNNN.br@@FK.Մ 0k֬Y6m @pn*@@@ uGyDWBBB @hR:X{ *_ \=       eO {#       yHMV꫌믥oXӦi+W, vkÆwtUuI=ԠTm<;! @ ٳ'K8dYmKŊUfP@_m6Ӻ Dzږ@@@v>]2e#}:v   eFM6e悹PJ@Ϟ.Oipœ"        O         @, XpM7I7,/sNF։'Jw;wUW][W^ywUB;3! P{oׯ,-. +n}[lt S6m*]]zL   7=zW_s=kYX4m4k.o   %Hy_ZΘSE I#F ͓J5s        P*G@@@@@@@R(`Zg%] {FaҠA/詧R~J& @^ ,Lm7nTzzz.!!A5k\1i6Bt4@@@b8Se}y 7C:4elٲXΉ"   PӦMgUX(1@ ]$M$-_.]ziv`        P*7SG@@@@@@@" \}fKRΑFoҥ;G{N5̀ @ \8#fݻ7UV-eAX[V35j(>>>   ľ@կ_?=裚:uڶm![zh_g   @.,P/&Mro#@a Ԭ) (-YBVa3/       ĎZs/8@@@@@@@@  d<4 'Lk˖-KwkJHHy3 !k.Y(V r6mڤa˗/ڵkXuvɵ-+خPBh_   W ..N{9-_\ӦMS˖-5|pM8Q 6,ϕ!  9C9Ŀ@2wXjc_z@@@@@@@@ w;D@@@@@@@bJ7뮓Ε ߩz駵rJ}gdo;<ܹSVI'ao;JwyN9<. %M`ǎ_,WP,Wm۶eD?˂liѢ?P_0$+%%Et    m·tG34o&lȱ=`/װaôh"͛7OK,5\1ޓVV=.ӹ瞫7|S]t%gܖcؾ/F:كm}  @IHJJ s<(+I&-X ~{Yj@@@@@@@ʚZes        PR&M;]pK2uV?ö;Lۋk0 PV6nܘ)$δnYgCL+Vնm[SB\md   L 9j:DթSG5: '`ӟ4rHA 4|رcuWy Κ@ ŅޓZj^%ׁZٽM6_G~O I`#C  PR*Uݻw<(SҸq>',S"       @ Ph.@@@@@@@JR҈ph"[NvRtW~ꫯԣGoZb~'ozZJO>&M;L7xCw4ϖ_UGujժ-=hǎ{뭷I裏kz.@;ûf͚iԨQ~HЯ>L˗/g {'裏j9O{… (99YC ѩo? @YHMM_-d]P޽{CLZjB^-^z~[^zh?   'PjS5l04믿)Sh޽o!14 MJ*gu7r-\3R  P{Nhذal}~hze~,p?СCu<@mvH:d\ٽ_wn@IDATy|,셂%{ҥ^sוW^>j]OC33WV_'|Rh%8o1i@@ @VIKcYHLZgNرRjeYkG@@@@@@@(S-J]@@@@@@@@̚%h!w^K7n>#}jܸ?{QϞ=5tP[}Z5jкu* Ժ;յkWk~>ٳeU5Rn0=>/G~W_}% pRjUM28?`g}uk͚5~XV .@)))~0c{ib L:5teb#FGwqk 6 vC,d-,k͙#999eXm۶Lkm{MwYJA@@(U6>+k:ٱSs7o&Mj(Zjo?9s\ /?,3 @ ߓ=P[_@-µ}>O%%%oרQꫯj cĢaÆj{jvoq#m@(j;y%+͓,l::z'z ѢIbBpDCDDޢwѻ 2a3u]+kWyX;I$ö+W;Cejjڴʔ)#W_}i¿l,gcbAbSŋ7eYH޽{]hY7eY0kX-W\ؾ7$˶~   Q#fMcOb]0} {͎o ؟ǎ+ >6l:w#FhСjժUֈ  ]vu!Uzu%K0W\mr!n*x@@ >@@@@@@@@ jET@@@@@@@@쫦MtX:gܹSy ;Ylׯ2g˕+OuIUpN۱cw{7UPA_x,9si |Yݭ;nҤIjРz쩟~I-[ݙ˖-Ξ=ƲdxbXm_-$^߿>VDdAXpZj{ólkA,    wA,6L 6gf ,,+$$D5zhq{D(    {ԥy@@@@@@@ ,        ~EjO8ʔ)r9M>ݽjݺ|M!zݿ]z5EO>aoӵkWզMׅXkmڴI5gyFenSʔ)kŊa Uǎk׮AGժU4c M0AغSN.D)RPB]:tQFi޼yŋ'Ըqw?eZiA(wzGu)BK`   i g/Eڥ,jժUܹsk"  Ժt>8;b="6B@@O;}ZT\@@@@@@@i!C@@@@@@@w멚0Tof͚3fZl;vE:~,ʕ+E{5kzݻwmkA/ٳ'lۥK1B_~ׯ~Zu~WwaK,۷owۛcc{eȐbea3v p1aXW\رc5|pO^*UrM3gά^3NڍjժP m ;t~/u޽n{χA*k֬ʙ3rȡu뺭gkҤIa@@@@nݺX~bʔ)ӧkɒ%8p ޶aÆ, @\jӦM5qDժUMĉaSݹs?vX{ݹUTq"{mG@@|E S&yFF(L+#c        uv       Ě9RRTB57ߨSN*T Jݻ_w'+VLJ](֌3Թsgmٲ}cO?uY6lp=5sL=#5k[ɣI&kۻwow]oLKձcGl\XآE*$$G]ی7NfͩO>9r^֯_tҹ9ZF 2d<4tP.@ Nk-7<ҥKaM$IX8dYmaY0.   >"pEW#Ͻ>24 MO_4`UVM5rZʕĕ8zJ 6T݀-X^E.`ޜ:u>7LwJ7 =ڴi>WyOudzE@@|AW/hF1@@@@@@@@+`ZҥKCD>;^,0~:t@@jժ jraeΜYS͚5y*$_10!Cjm.K7      &Ъ8}P|^} +<"+<Ü@         %peTƝuֲЪQ>`'YV|NoZ Mt-?O:?>hhaZdϞmOʔ)UL>=e ų]v}{^={6l{ܹ]PVʕe[²¸A@@'fe~AtҮ;PB~??&    u=z&!uJ        @l@@@@@@@믝\/2zhN 6̅j}?)}ڰaCY DÇ]PΝ;Bl>~0, ˲BYeٲe    _NتҤIBU\wfԴiS}}g?G@@@@@@@x-@V<        Rnzq1=o.^^xc޴i *U+Wh߾}?]@7(˻ݵkΝ;6$IȂɣRJI&.$e%K,xv@@@@wTV3A8Xǚ5kI @-[?O?TCuu͐ 0@ٳg0V'ׯɓ'=*_4tgA@@bQkWikZ~        = u       Ĵ<=T]ҧOo&x˗{neYg1%M4ʛ7 ̪WZxf6K,߻n"l@@@@e̓'#Kc> $PԶm[M4IÆ sۧ~Z}ULՃCCCq@@;ĉW^ڷzJ)0`@@@@@@@@         g;vH ٠.+WdX;< n+;ƻXSf Ʋ|a- bA@@@^@uY;vԄ 4bM8Q?ztE:    O n-̙>9D       Q@;q        [GHK֘ },oxmwޭ˗/ >cƌp,[+V}/EaDz    I$q!Z!!!;vF~[={Tݕ2e wG@@@QkZ5kJ3fH        %jE #A@@@@@@@bNaɓyÂ8gφfylݷϽKT/_>6om-,MRl@@@@H۷yU„ p>F@@@NT)y%O-@ϿkTJw\f͚y`-{5l0.]s    o $}t}Ҿ}<+um#       /l@@@@@@@@ԑʕV\ /Jժ";uֹ³tN0rRѢE춶_X1eȐ!>1g@@@Q ._~ƻDVVZZp~ 8Pe˖U˖-5tP<q<    @ J'JG^ i=ݧ<j@@@@@@@@:`@@@@@@@Ek۬٭GR*OgΜqaYk׮w]f8lYyuAY=/^hH"0/@@@CmJzBVh֟ w#аaC:m4 4H%JУ>+_|wsIA@@@ ?,X%i̛5        jŮ?wG@@@@@@@(ФTysM- Re8tsٲe,,kn;vիn^rr};tɓ8    ?Tb 6m~ihN&    @4o.}4}o'÷?O@@@@@@@@ P+        p-[J}HwKW}˗j~$gZb,*%HK#e,Ajv=:u1chԨQ7n ղp)S   @ϞRRpttCtI9x       ĦZϽ@@@@@@@@Ht /Qʔ)K3fjÇWpp0aZQep-@@@?,Y=л%U}H: ۷׀T@;do,    >!)4{Կ=,۟?!       )p?apo@@@@@@@@HR];֨8x,YѣGm۶. +K,jڴ~mx:<쳚>} ڻw 4H5R֬Yf \@@@gif.%L(%J$=X<`>/!C5J۶mC=^xA G}+W     ×_~sfmysD@@@@@@@ P%ƈ       O yrwoy˗jՠA zҢE :Vo^O8˚ٱW73g?s(V.g\ހ-WZ}j2dpC3v        Z1j@@@@@@@{Ւ%KrJ_^6lpaZ&ӧ *^ׯ/{ 2{B {-55QDnk %.^(m5F0öZvYFl\1XcbŊPB)S#|n 7nٳBa5\v5kRJIa    ,j_r[=֣Gް:ٵ +pH ?B,TʚZ齡S7yKҤI]Ŷ^$Ig<ǭ6kVB)rU9sil{EV[gm/\V/ 78,p1̂o^l|3f Z1sʒ%ھ]%K믿ֲeԿծ][u]}2Μ!   Q#pe߿_{qs~a[Z/V /*((ӧ?\Isu\Mzwk5}[ְc.lҥZhƍtXVzT~}ըQC% ;&n]j&L~BBB\Yʕ Њ;!   ]9sF۷o5f7ݽ{k꽬ղ aڵk@&k$9snp{@@@omܹy-ޱZnYC[j]׭[' &žo^vy}[~|$Il}Xׂ \ssV4tP.\؇G@@@@{8{6l֍7M6i۶m:wո5bŊQFʓ' ϙ3 Т`ȥOޭ [YqϞ=n<5e˖>s5KV{.X)wzZl@@@@@@@@ bjẺ@@@@@@@@ Xs?ܭK,Q)dAudɒ/dq;vtCbAPVӲ:ո=3feʔ NrgVڵ^=z1wN4id,{&t.0TRJjum$I~ ڤͼ[9ot!wTѢEϚ(QBe`]`hB'O֐!Cٲeqw@@@@ ג%KtR믿\ 4o޼.m۶6eu)X8$UT /pVp4Z'|3gθ47VPA+VTJd![qXz%       @<ó`L@@@@@@@r7j裏dZ'P:uht޹sLw}W[nUժU]V֭iq?fm_~֬Y̙3iӦtz,Y*    Q'w^YUViʕnkGϗ&MraFT,XPɓ'Ap%n8q6oV ٲ7[g˲"EtҮIm>O+2{y5l0=zT< 2D@V_(444 %@@bRVZ.zر1y(p5S͚51yqiСa1youk SZ`.\V{^. =˗/Bʖ-NiҤϾŗ/_e˖ɓ']mWN@@@@@@ Zy>oC7 !+Wy~EW"t O@-~@@@@@@@@H ^ZÇwMԥK=ʔ)S$?sĉ5m4eɒ5? Q$I]Қ|.H~ɣGyD\$HpW4@@@@,~Ӓ%Kp c˧RJݰϟ_ &r6Q(pEeu7 swcktk͏g[B .\kĈ:wzVGC|K`  ] upxZшKڵK3gٳp)*UjժjժXϊj>Ԟܸq-Zk[vڪ[ J8q`j      jE(COGA@IDAT@%P8@@@@@@@5`}*]맇~PH޽[Fһᆱ륗^SO=DE*qSN?X ,PΜ9նm[l5҈۳gv    ,v޼yZpki2kZ@:t}\rna~+"˗uҥ.djeʔqkԨ5k*cƌ$ܣ3g4zh?q>}gUʜ)@Vtrm@@ zԊ^߻:Zwv\rC[㏲h)\]~j5Q HbA "6|Wk3g J2 jܸ5kYFR     X@x3u;+#P8@@@@@@@'\UD >\M4'iZSZ ;v˧1cƨ^zs3?ŋ]ԩS]5l߾9o@@̂a"   @\8[?f͚{رÅT\YժUSJJP\ƙ٣~ͭ*g[/_V]dm>J*.g(pqeZf=`uY'+s:DZѡ5@@ {Fʞ[3gv- @c5>LӧOב#GTdIYу>֩Ek.O.ͶOպukʕ+0?@@@@@ S@X P       }oVEɓ] ӊ=K,z׵vZ~С!j|ZΟ?I&\rΝ;5qD߿_&LOV|`   ĢիWtRPs}7To>uUnٳg_v d ӊ/[Ǩ@Μ9#^sZk+[c+V2d k=rHmذ!F_n6mZ+ھ}ڴi={PBzʕ<@@@@ -[~Zٲesm۶iڱcV^#F`u´?_2w _|~.]څɓG5jpl٢nݺ)a„w<".P`A͘1CӧOל9sTdI-X #;Oʕ5}}Ϙ5m׮&M3c    O&cY9rPJ\as_Q{Vʕ(Q"cE 'OڵkkСZpW_TR0a+悞ˣm™3g֛o[~ҥ/SY@@@@>}Zƍs5+B,DkϞ=?y͛7"Yڬ6?~x۷O,a…/\=߇        j÷@@@@@@@@ Fݫjժ>sMP'M͚4ikתB رc$#G\ܹs?ְad?o䜙   +\3ٳJcbwޭUVW_U͚5e mڴI]vUdnw*!   Q"p.lsYÇw8g͚nݺiX@-޽{kҥڹsz)}7*Pk;uT]|o@PP>^`6m*UhΜ9!   askyz7dZ-VXq K|a`W*Rڶm%K?2@@@@@@@L@(B        6l<|iѢEnsW5zh 8ls)Tk:qDGQs K6mps@@@*C{ʟ?Ν &h׮]:tU:  ҥKk̘1ڷo막'_3K/_^3gtϟWʕռys^:jnU@@@@o~g(Q…Y-fժUjѢp7@Ȟ=F͛7+((HիWWntԩ=@@@@@@@N@-0       D+WԶm[%NX~'Oշzw!zK׬Y wʌ3dqϝ;5k֨O>+Fĝ@@@@ \|Yo _hwjժ DRHZ{ァ… kʔ)>=n߯ 굻wV2eԮ];mٲߦx@@@@ .]R^ԠA5mT6mR Ҋ#@ܹ5yd͞=[?ʕ+˗        P+H       q[Zs/RҥۓN<~rjҤk`P7/ք'P:uԽ{hiϺfvSN<|=j(hB{vA`yq2(@@@{SjUY}bZdի&3ڳgyW_1bDիj=TlXÇ5akX| &t7lؠ_ qEsb:FԩSb +VL;wv![Qw   "`Ͽ5lP}fΜѣG+eʔ2պuk_oDDVZZj{z6mZDN@@@@@@@|V@-j       Ą#G4x` UdɘG5 ŋ]CכZCM+ "Ư5j;v,1D/ӧO> r @@@@V(W ,׫m۶&mG:tHf̘+WD},$+qFuֈ-;vLsu.gΜ{E'N, <[v/)S?\|uVmٲ3~w5k,ee^Y@@@@ nX8Uݺuo>-],… tXndꎱ:P?yL[ZhV2e(1D@@@@@@@ P+|E@@@@@@@x"0zh%KLz'34BZe}Zr5ay<߿_/z!5lPiӦk'oH~!CN5fY_]l|oklҠA_&B@@@8('(88XK.ҿdf;vt0\fϞ!CD $? D:pz駣~ݼyʾ_Zh&`{1m޼Yo>3ϟ_վfx@@@7{us̑Zaɞ=BBBTHXnhhԩ+W8#[Í9W#Gt_5*/͵@@@@@@@1b!       X_;wV)|mx2TR_~&ʕKUTqE{?Μ9e˺bŊ:x&O~TtEְcԩQu(ի](;FŹ    p绐~[/m䣘ؼۨΝ;ծ]jj^w;_ݎ? رcթS'5mT;v['Jȅm۶Mք /_>ꫮ/Q4   ~.`n͝;WӦMS֬Yn6VŞ4?{{w^zpG}TΝC^!       1D@@@@@@@+Vо}Բeh_-[-h\rݻҤI˗/{ァzKcƌڵkf}&MRJ7TÆ ]Cϻfkt`?sʞ=3g;γq7smܸQlĻlٲ>}VPA_}53W;׿i=z)G@@@",pc5 Ś~:~ϯf͚ɓ'ߺx }]}kf믿1yf>rHLMs/F0M6'P"Mq:](Ƥ믿z ̠+Px:t٭[7M2E{ue/3f̘]YTxq 4H3g;޽2.]kvoN-(QB[n/kzwwa=Z+WTTcATkh"Y_Ԓ%K4}t7#YVkDlasV.v}׮]]xs_گٳ؜XG Ydg詧ۯas$I1WE@@@(* zTL/={P–nlཌ^V -ngx8)SF'NpZo߾ʑ#ƍ瞁,w'|7ʕ [nvpVmZ?ff5E_v;Oŋs ,pςZݲm۶:uT5\{2{.5((H'Ntј?C@@@@@@@^Ժ=E@@@@@@@& րBc0W^ц O&8ɓ'ZۣGʚeX֐H"[5U2e1Xvڹ+kPZ5T6.[5~FbFXbkBS[_f   q_O4ŋ/ J"4i׻@-YOkpfU\}{Vg۷o׺udUTqH٬]B>4o!Re˖uAeu4(]oǎQjldsz7>ZFdmm~;vTܹ][kj5F(\{Bرc~̋-sMdW^ԩSw۫N:;9sZ~ R|y5lP… ] {mZ wVfcXα, L:]y'5j(15f3c? ִ~]X7a„t钫n Axf|ݯ=z衇r?W /ַ6VgժU]#h182dnZ/^u8g@@@|WjK -N59s =hwDE}y.hjӦMz'd!p޳V5c WwՃΝܩ8~xu='i·~[mڴqb~gyVS=Yxq9sF&Mr?;e<Ş۴}|:~WÍH!C= Ԋ"S.       s bV @@@@@@@- FmhY\5_feZkז5>Ӱ*kq5p(Y|Ǐ&/^uEdkڳgϰq+WǮ83kqС}@GUuߐ{!z. (]R@@E) (" MD 5>ݼ2I&ɔY23C\\ɓ}BM|DW=yĞƸm۶DBC@@@R?41"-HM[Z H %Mؕ6-E͚5$"XZ$IjـBOZ,*QDRhQBGҦ5Ʀ-]tcS3fM Ddzu,-|w^SG kQ]0O/K,P^q͚5kB? |9rHƌ٧4EIc^={V&Oܹ7oR`Hj'mӤz?Vj|`|KMX{a=DؕI]_Mz\ҦRW˖-3ڷoo5h@VZe ~WzX'Nl uiQ㳎ִc_DǏwkQ^z9/6Ѹ    @TϜ9sT/ $߬XJ5.#zƱcǎ9Gʕ+C1ҥK`HDOB_s61ի˒%KD5;tPi޼eҥ&ߙM6yI}kN8јիWO*T`X}%L_cfG}z|76ǡo@@@@ ͛7ъiHL4y5҂{Ƴ*U*dU(IjH kMO>ĿΟ?r+ʙ3M-txdze3g&QզE"NZdKcڒ$I"ݺu3hM i2Xg=z0|ѢEx՟%Ҙ& ݊+f⡺Okp￲|r駟Bb={4Ք)SuIƼja,.\ؼ-nMtZ0^MkLkaEҥMkׯu.Z**-x+Lgpp̝;W8ZrӶn*N wΰ̸SNm܎h       LZ1j@@@@@@@pbMEb;v$ ܳgXۑ#Gɓ2p@3a^?ۯI5u:S*Vh>?~ܼZ׺&*xVj;tPȥ&MMڬY33%Ug7ztVR {4#$@@@S@iGkmڴMzyWEps6q۷o2g,Ǐ7ݵRux-q =Sd*Vz }EmjδYIo#:/~{޼yK/ٳ`rJsBӖ.]:jEM~4!>|xHlu&ǒ&MaWӘ@8qbY/ &տGw?M kbM6ʕ+ˆ gB dȐN4u  N(<}{>ۧG|3WظcDg{=Sjr}Yfk.tw,[jauh=h_CpC>yyw޽{ofdX˰grbsq       #@A-W@@@@@@@,PP!9}I`Mwa14&]ps?gn˒%KTjժr7qƙƚ4_'a{|3y!D     Zj%ݻwۭO{tc?,^X4vn:ѹiS-\řӑ?\Rj׮m @@@@@@@V83        8@ժUM2ҿ+UGC߶m 4(䳭o4MlϞ=,YM5kno'O=zHldĈcXŽ}    .PbEi޼;v)d/޽{˕+WM6kV7n7oF8Ć 1-EkI>޽glvV-&q9ryjЉ]6-"?+ k]f-McZ$ W[8} 0@2g,}|Wf-Uxq7|#_Hwz Eo/)S%KCNյtIΝ;/бذǬcǎ56Ԧ-m\kN?p؇~( 2Ѩ @r~w-f>|pdr%Lv7#  Oe˖_~YFO3n.&G|_c״G[-Zuٳt%S#YW/ȻG#2        ItY       8@٥RJ_}8UTO?Izd֬YҫW/i߾L4Ɍ$:uʼZDĉ&ԩSgѣGeȐ!.]:/_4͛MYM矛ĭUTy;vH&MB uVCר^{5;F    ̞=[R֭%00!CMfIU5驷MZ|ւF ,///ڵN_x9C}ɣGdr!SKOs9WX2'Ö869~'fbiVmhBTj6M`IR[je^tZ\1~嗦JBAӦ÷zKri֯}ҴiSLvԨQiαeP{7u,=j%3}o˒%ԭ[mkdD=֩Sٻwh\mӦMRjUS$j211M05krIɜ9.]:RJ(ajի_i,Mث;sT^]ʕ+g{N /8 1¬U6l͛7D: &V2d0cSK'*ToV%Jd9ZL }Tk]Z QFũtzRLi欅tn3E&A&Fڷo_OJJ>ch2[6lPƎkH-C9r䈱U7Mؘ&k4n~z$3f0}+R)e3F,xQV8WPBҽ{wL\8Ξ!___@@-4ɓǙbl<-̞=-l]fa ԘX;w&L/Zg/_nbRBZ,3&MgӟZ*-xE4nqd+볓3sx%1Fe>~<ѣGأ}nu}SKdLu߿W(k.?9W_}[5     %>WQ>ugY W>"O][>+5%xH)8g@@@@@@@@8&:ț7Ia&Q&1m:gM;A&Ф2e >7]M(_5ss&\IۦM{vm٨QD@@@@kfΚ58}d|z\ hGM~!<3F@\@Q+Vvf Mha0-]F g^|Rneܸq(ZfKsW|SӢP4j;vHl$s"'?raɕ+Fؑ1E|%J̨/>s?hLe˖ryO!     n=].YmeE jO_y<7\y.v;        Z J k"som kBژ&;!&i Fz| ڵiӾ\OOOڵ ϱAM۹sgS8b1-{~@@@@ XɁǎ+ZF. iQ^iiD/jU1ERN̡9CTcbi1kM)RUTFn%BVEYW-L^q?XVXaރ 6Biz‹b2e L2*U**t& VcW۾} 0@=j:t0n 4v7x1cƘzop`8.EB :d   ƹȻ> sN0abmE6̘1cdS3ǵ`)(|JF%h Y<1C qVO'ϟߚ3/>s?hVTG-p5kV;NW       ĭ@_>qNFC@@@@@@@"VȻ+E*UDx3H& <8ҩ+W.s'Oģo6IzrlB@@@Q@ :&߿x{{K.]dРA%4?f/h11GOx7//K,Y{\`׮]EV^-ݺuUVIc>:=Ė@$Io߾N<$:u 2Dz-V~p-7n0@@OO>RLi׮2m4_@8rGb=9sѣ%mڴZ֪U!       !0>eL@@@@@@@@&L(}TTIj׮m:e>>ŋeŊRbEwY:D@@@*PJDs8qbW-ZT&L .]XtIV'O,ׯ_[nɟ)mڴRA;&Æ l hB*U$ׯw5T@}Mh@@@G]lذAm&ҥ-[J|dԨQ8#͕ (+V͛Ɣ-Z$C gϚ~i       \&@@@@@@@@ 䣏>kךŊKƨO.Xʕ+ҩS'iڴ4iDv%     H@_ժU3fȥK~}&.S`Aݻ,_b1bw|,\Pt"ZN iR~}#ɑ#)5~x9z+.59Mnݺx>zA1b\pA-[&52hL@@@@@@@XV1    D5@IDAT   @e&[TRҹsgdj!/$6lK4Asfb+"   Cdɒ2x`Z hզ-[DgΜYK.2k,\? }H|nL9jԨ![n5?wO>-%JN:!jiӦuƩ3g@@pC H͚5eΜ9rgs+Pymʕr]7b8|~կ__2d -['Nƃ4.{Ǧ?@@@@@@@]'@@@@@@@@GD{~A>^{$/(S#Lp=7o?^^*o 2$u3A@@@@ RH! 64.;vD۷o7;wHҤIE qilٲRti)Zl,I}!ٷo4g eɒE*Wl fkr$I$NR7F1b.\X~m6ld͚ѧ0oB$  N)(QYdݲf͞=[Bn/S8tPP5nذA6n(7ok׮IƌE j͝;W4h`>٤@@@@@@@       %0aBi׮iF~'OM;#m۶)S:֤`6vΜ9h"|V i EǾ{ٻwxyyI=SN.s2j(vZD@@@I@l8qB8 4ÇXQ$IL-i… W}OwZ\b gi,k;r˓'OLBc-VX1)YJ*Eؿ5 Ȍ3>3I()RD7.A 4Q/,Ν9s  `W5kߗMf~㺳ׯyG5jԈ:'ٕӮi᤭[>G}vٷoHɥtfӘn(͵.^hM<}Ydk1. kC1@@@@ʕ+&ILubJZ\zgY6mZɚ5ٴV̙۴(| $M4n Eo51[DZHcsWk{}eYiuZ KYU k2\/_n;Ԙ  Բ)O8L&-u1SI 9:.]XX9$-[68yE,Ų4G-1k;wAkYig9k i3-ve65#믿5k֘ڡCڵ*U*_@@@@@p2 j9 c Ԋ\        &rmݺӧOTZJ7M|K"E̦41%K,bt\kM ۩Sȑ#!&զj؇~h^˖-+=-@@@@V A!ű*U:4vҥBLkKZ4i覅ӧOokiOjAЯZt+um6E&OW}(ZJw>ݾ}[t8n{-ӢZ[Ci JEZEѬzh &О3g 8P믿.3fԭ[ ؃@ 5q@@@"J,igi ̙3lZiݦ"QVX-SLlոgMuCb_oܸaiA2ݮ^*jC'5k&˗/+'OM%L0ikf6>_:o<6m)SFy[)S1        q)Iڌ       n/7o^ѭm۶B;vLBիW_|!!^W4hr Mk{MtK(ydڷ& ^;wBjۛ7o.\0ꀚ$CkxyyIR}RhQ6 nC&@@@@Y iҤ OuilLjT-d{iU-: &$IZ\K7M\:tn[1<}x)̥1=}5{EjX5{k_W k ^?kڴ@w^ȦE4Q5jЅAe3f4ˬWMK׈Dُ@ ŋe#3VD > W `-mGD@@K@](QlǦP˗yn'O۷>'1Mc:WoZL+U㚞&i5DOܭwb5>jVcaE9KX,d֬Y3-[6ް}8gA̶yf/_~o!=zhka>       DUZQ|@@@@@@@@ZXbf ۭ&=;wμ^tgϞϚ JdBNX yC'դVA.MQP!@"gΜ[\DIh     $Et+P@17-emULi)*@ ^TV"X=_ W.feX^Xk/g6[a 'Mj\Mj%W-xe &Mcri J_~El"C _~Y5k&~if(UF W\kB@@B@cr9r0-X;w}sV^_ Oi\3tA,0VǏJp檐8(Cܲ⛺OcVӧOrLk 3^ݧuVZ5mɲ`={̜9~#Z21`W]?B@@@@@@p?o%@@@@@@@D cƌ[ҥdL@@@@SV.WWfMSgڴi=GZl޼Y~W%KJeԨQ/_>9Ss`тZ9st@@@%PnYfL.Oc"׮Pn7@tf۰a̘1C:w, =z-K,n‚@@@@@@@\O -!             -ШQ#ٷo,ZHv)^^^һwor{ðXW@@bU@@@]W^%Kӧ7ߔiӦI\cǎ~wa       N.@A-'L@@@@@@@@@@@@@O AҦMӧ˪U$2d}vx {FC@@@ȑ#3FΟ?/f___)SԮ][~W  ;        @AX@K@@@@@@@@@@@@@@Q<==ߖ'Nѣeܹ7o^2MZP+iҤ-[6X K@@@@9w7|S<(֭DIƍXb2| t0K@@@@@@@ PP              \yr)ywO?ˌ3H?.--֖ A1@@@@ @ݺueڵ+˗ݻϔ)S(Ɗ       )@A-Ǽ/ @@@@@@@@@@@@@ԩSѣMa6m/^^^pB 1=MnX-D@@@q/. ,'OJe'O3fܽ{q'@@@@@@@^Zn@@@@@@@@@@@@@Q SL2yd9~ԨQCt"J9X;& COt   ȕ+L2EΞ=+o7N+~)L       vI@@@@@@@@@@@@@pMCy+.5ES@ jyyyEj.C@@@Ȗ-̜9SLQM[?p@|N@@@@@@@PZnxY2              y7駟%_|2fw^T\EWDz@@@p ҥKe˖-&SlYz{J@@@@@@@xV&             8@$Ir)ׯ|碉O.αf+~~~RhXN@@@@ nT";vN֯_/ 'h       [ PP-o;F@@@@@@@@@@@@@/*U*9rK6mde,EctJ[n˗)Ϥ@@@@ |mʑ#Go߾#%K?#ً       (eD@@@@@@@@@@@@@@Q SL2yd9vT^]:u$K_~9v͇6k/Vp@@@\U y2zhB IݺuCrUW]2B@@@@@@G j#>C#              ;wn?:tH'M4jժ֭[]ay!-&Mɑ#G$gr@@@U o޼b YjlٲE)"s̑`g]F@@@@@@p@ j9MaJ              3 -ZT/_.۷oOOOZ4mr0gZbl;@@@@4'o[W.Ǐw51y@@@@@@@ f             @JdÆ fx*UJ:v(OvgVş'@@@pY)RȄ dr=AAA.f       7ԊgFA@@@@@@@@@@@@@NAw^dǎ%\v,\yr@@@X@ڵK|||Vre9zhp@@@@@@@H( @@@@@@@@@@@@@@/ Ai۶9rD Ytϟ_F!wލ~\ϟ;wH%b>L@@@VڷoI2edq; FC@@@@@@p j̭d!              hr=zɓ'eС2uTSXkҤICǝ83{9^XA@@@pmoooٶm 8P+ 6˗/Y       (ewR:D@@@@@@@@@@@@@H y2d7|*T,X@"*p!ə3MAgȴ@@@@ Qd˖-r )Q/q5<       \&@@@@@@@@@@@@@@ҧO/ƍ'OJz[n&ʕ+m)n=_-Uxq6`    @JҸqciڴ 8P=O       #@ApP؅              7ٳgs-^^^Ҽys\l޼9n&(1V@@@H2,X@ϟ/3gΔjժٳg]v, @@@@@@@>Բ#              @p²tRٹs$MTW.M4__ʥ)c9v/^<6o@@@pbΝ;ݻ޽{RlY?x5L@@@@@@@ (            IJ@pplܸQ "%K+WD8[V-iܸqw`ԩҷo_6-BC+PBY~]V.]$K;ʙ3geӟw[6E(]k|-Zl۶ZpHB]f>Gw55yQy=~c)RQW4h@ƍa       '@Aسg@@@@@@@@@@@@@ Nɓ'E ʓ'O"7((H:$}ok[hhAmr˔)SdӦM/_>I:f_@@r @e޽gۥp¦&؎Ͷc2g,&MP7nܐ[ʑ#GZhh>GwX؉Gv<|Cl9s@@@xN 88ylذA~wsӧOٳgE_iH9q)0/V@S?-[Hڴi΃@[$H ڵ3?? QFgKQ>'{-[6ѣ)>shi?莡i k";D!   Q?eȑ2-ݫWv'޽{_~wY~ԨQC\Kf}       QvB             6 ERNmӹIŋZjY}M.tMh @DLRm8pL8֚6ms(ɛ7̙S7o.YdٳgGɓK̙M?]1^";<#ۧ-iG@@@9gJɓ'!9+Wy&5k֔;vݻwB N@@@@@@@%(E             ,[Lڵk' 6޽{o?~,C ={mРA漀Yth"$Ye2eYjId[re3fL9~$H ܱB?~O$CӧԩSG|MB{@ Z)RÇҤ ///YhGϰi9rz뭷ϯ۷o.\(-[ԩS^z+Wg#XDcիW՚`> ȅ L/_x7c/]GJ"E":~@@@7bIjժɵkdŊwݻw?vZҥԯ__46uz\>>>rsJDS|^{5v֭e߾}2i$Ycgyiիٯm#Νk>裏Z2|2l0iҤzh (Pđ/UV5k<{@@@@@@@RZnyY4            8jyeڴi|r9vOOOI<_l$pՄZ|fƍҭ[7;v9$M,Ih}pΙ3gJ5lٲW_I̙m۶ji =2fh^?~\T";v2eDXd0*c.\X*T`.yw$1c)T?w̟?҄iӦ>>;wMZK !jEM.~_tL'g&ɇ Q-hFC@@@ @d)S߭KN$W\!]hLߗIʮ]DOWiqɓ'õHbŊ` w˗/E5q~B\ON4m6i޼)⭟?ѢVС$LyCriy%gΜ2tPѸ }Nn&]tn:߬Ygb0nN@@@@@@@z            $p]9xIajG= -5h ټyI4[vmI8dʔIk,ֺH _M8|,Z۷ڱccΜ9rH_M7xC|Mɝ;)UzuYd,X >8U@|7~ɖ-4h@jժe OG+۷7#חٳg5bW[n57mrްaBއ}})LiSN5~_tL츞ck;w)6h   [0`,YDMGY>y{{Çe֬Yg;wom0[S KYi,رcӋ~sM%H@ `kl矦XWM`ر!󪅵OOOYc+W9G5u5h!DB||.*    a>6 $KBP"4DJĀJQiA&UE"U"" MI%$ONBHIf&Ϻe{Yz@@@ \9C@@@@@@@@@@@@RQ@Tn߾-/^UҥK͂={|AAAfٟYd 2:)S&^Ed.]Zڴi#fZs0,^VZ֐- .u7 5ůoݺ%5j0?W߭[7ٷolܸ1.ooo_lcJw܉>؝Ѐ0-*իW7YlK*e릨@@@AY*׮uKe>2뾖ӧOי3g9˖-[}YJ(!W^5<;u֬Y}r1b뜫 ߗӧkf/qS-*Y2gskdѢE`uOü,EWN}gҧO裏       J_ϛ"             d˖M:u$Ǐ-ZTipLܲvZ믿}k_r%;r9/1KݺuÇ<> `Uz͛͢hȕ.Zv6m* '&X[:_)76SzNȑCrʕҪ@@/l(9>XZ:G}MСCX۷o8 =ڎ;`i4iy1bԮ][BCCeɒ%f\hhÊyԩ?~3_azsN?=j9%oɓeС&X @@@@@@@'HJg             袱ӦMsJBdʕ/>ӧݻwu֒0BZtAĖH4} &[N-*+V|sLCb5k6lyXon:@VRꫯʑ#G>00(QB>s:v5P޽{*ц5/^ܚUR   Q \҅uq2eʘc.P_ *$͛7o\Z筥8q^tr(Iq۸pႹ_c?@@@bؾ'@b2$j~`˗e̘1r)soN>mY^_{5ɒ%,X@~ioG(cǎ5>;ie˖M+&m۶55\ͧΛ7O,:'N:f.ޒp_ 4Ȍ7Z~y>3fs;@@@@@@@!ڧ13J@@@@@@@@@@@@@aKiժtE4K]ݻgޯ[ΌW^K*Uɓ'EI֭eϞ=K/$_n޼)+W޽L0A^~Zѣ?CyePøt:HNblذAraW@ U4Pv:tHի'UZ5Yre믛{uիW{4$P#Gc5n[`µkך{)S?{s  Ha-܎  pqqy%G3?X|yT|$W\2`3W&@IDATe˖ɰa%HItnT_EciӦ۷w3yu \rҵkX_}[d 7oӧi\!Z}ƍo-~~~2x`s_/AilG!FJ\       .Qa{O@@@@@@@@Hc],C8|@@@@] {Rpaٻw={V<==%wV,>;|p %Kk@oѢEx)@k h{'H(85x(Yd՛MLޫ9sfR_R&лwo9wtY#믿$ @5k&vX׮]#PZԃ  #\]]%<<WqH|޻wo޽I@@@@@@pN2*@@@@@@@@@@@@@@+ I.]ĉ2vXɖ-/R\9ڵX%Ǩے!C,D@@ rgH@v#F2eHvݻk@@@@@@@RM@T!@@@@@@@@@@@@@@G^zə3gd&TjԩRhQ0`ܸqÑj% @@HnFUSΝ+:Lƅ      +f              )Ȕ)|G&Xw)C  ʄ ~{ )   `{P-[8@ɒ%eƍs@@@@@@@ Z@h v@@@@@@@@@@@@@@H@9d̘1r ر\~]z!E%K$"D@@"ZZݻ+8 $7.]۷A@@@@@@p`w;]G@@@@@@@@@@@@R`Ϟ=rXc 5-+Vuto@RW@2m4裏O>&L矗 *!*6n@@@@,Zw///PEvݝE>g Sf }-ĉ\|g֮@@@@@@@RI@T@@@@@@@@@@@@@ 7n={>p-˖-u|ݺuj  vŋŋĻw.6l5jH dɢ睡 1  8@ L?ܹG@s6qt@&@…eԨQfN}RjU7B       6py 4             $_|Q\]͛Wի@˗˟)+V5kH%$00PBCCm%,ocdG@@Zn߾GxA>痨I|tSH]J͚5孷Jh@@@@@@@o@@@@@@@@@@@@@.'OiРAZ$...3 i*/{쑕+WJbdΜ9?jwyǡ2f(7nHS[G@@ x{{޺u+ q:@#K"k?2.@*:_˦Md޼yVJ@@@@@@@RW@5@@@@@@@@@@@@@ QPwo>K8 `'5cǎٳ%{2rHɕ+|i'L|72e$7oL \  пk!6لhCVD\XCcG# &Pzuԩ 4'0i@@@@@@@jmP             @yqww]ŋjժ=<'@O@eܸqQ[o%ŋ_gQ֬Yի \)@@@̙MUׯ_VԃeiD-* GСC2vX[6C       6 PT            T K,ҼyxC4hSN)m@@Uzeu~ʕ+ҲeK)]l۶- z&s%@@$sDZ]AZR"+R@{-G0[6E       V PʠT            XKॗ^?Pk߾9 88dz+rQQԮ][N>>uV9vԭ[Wڷo/yfeʔIN:e7}#  8@]tJtn       `j3             |Iɕ+pZVCU *E: >)"l۶M<==v@wI @@@K?dDBxxw "m:SΜ9#/v11@@@@@@@r@@@@@@@@@@@@@䥗^w]6t@/cɺudѢEc)[{JlpeR6*@@@ @|$$$$a#`WQSrOD}l)؅4kL @@@@@@@HX@}8            @``ܿ?j1ZyҼ?t@ yٷo >\[@'Jxxxw&ҥK&4   .,ONCg$ ?Hd/;Pjx7eÆ t1^      8#w#            $&׮]0ݼySnݺey {,缽%{ %yxx^1cF}=5kVeɒvٓ'}A-?{-AAA2x`ge̘1ҨQji@@l/@퍝s7nWݿ}vݻw%v޽:_ik˞4Kʕw|KtwwUyzzMZ5C fyL2P@\zJ)"3gΔC={@@@@@@@;à+             `?lppp!r]xѼ^tI._,U^jMhk|!W@B+ft[KVl-U/K=¶-[6ɑ#ri^s%y1[ܹk%_|fۇq@qIϞ=ߖ~Z6m*G2eئ8ǏOE@@k h!ܔPWfQ\b6w}kXX>vڵXz%@KUt>RC4JCXŜ ,KV|s mQ^FyL M&׹Θ^o ;w5$s^Ǣs3g6:w9ٳИ}2'J0W" ٳgː!CLțt"      L@t.            ?^4ɓr9}tܹs&HKYtVKL邫˗^xU[agʔICR?# 2uWRcmi.s1O8!YYmpUõ ( 6S5L7 X_TRdYfG*V(=zgQ޽@-?ZjD@@ @@X2F.\`CBB̾ί1,e4@*n`+ }Q:Gp3,J#uӹ̸szmQvReի֐0 ֊%D,k|cj,dwYp- RZs%dɒѯ诛R^@!РAٹsL2E  3gΔ?XufP jѢE2z-   XW9 \Yfbo: DDDyӧOygFsD4IC,3YτihnLoWKyIKZJbLumݙ[`3˗ҥKhByfo:[ 49/RdΜ9}I=VR%;w.ZNK       @J27             袥{ʾ}f;vBZ40KC4^0NnEbc~hnjP- /lf!gk׮ɓ'ג!CUlYѭB f!2eʘjs Ѕ_}Ui׮ 2D'&LqIÆ wU&۶mbT   unK({,gԩSrIAZߏΕYBJT%XIÕ,h鳤ؗ[t>Klѹi N-888z_4Xm˖-U[檵n M`-W/^\t v >c ꫯl5#      H@q3            .BcٵkܹSv-GHTti)_ 0&XlRC@3[ѻ.\ÇˡC~nEDDy~UV5n9s挮@^~[5j$==>xGԮ][  @@-P\9(0A CҀ#GDo^uR秴xyyIbL7j` YB I̙l)1cF!X ,ii0[M.\h[ϓYT)=dɒU.\rhҤ|'~Y !      P@-R5            $OƍuVٲe矲m6VhQ\JJB fqQ `8@3N);vI&ɀdƌ2bСCP 2? J3  0'gʔ)Zt&t.QviosJZ4HÇ4HURJc :~-!Yqo9>tPmʔ)&K_bEUU Ѐg}VVX!ov쓼C@@@@@@ 1 @@@@@@@@@@@@җݻweƍfիWݻ .Y~}߿H"E }@3"]Dv&e2l05kJF¨ĦR@,&ݺuvɠAs_MXerm4LVZvZ Jn5܇  @ۈ'D8 /۷o/_^4aÆRB-Z4š+YE *d }M=Zu:ZRF #GXu7Փ} @@@@@@@ԲAo@@@@@@@@@@@@pZ .Ȳedɒ%!Zا.nGBٳgw30 )SFtԩܹs~zdʔ)2p@ɕ+4nXZha2glP# q^^zŴt"Cܹs'kO>L6-Yr  $^Xb?~.^i&ٶm\~]tGÂ֭+o *[ \O,W"2eի-(Ο?/w]vM>] `.)YH:urʥڵk>dUTI>       e.             `;wm>snTP!g:J Hv̦>|X/_nUysyf4&M"i.VEI߾}e'HʤtP $G__ߤʵ   D ټysr5@kÆ vZYfh???Q;` Z ț7oԨQ˗/p-[#$44Tr)~ߠAPlfjԊ      ؍nA@@@@@@@@@@@@9޽+ .f͚IYt\tɄwtErmϣ(][V^-/^S/_|/E###y @˖-ҫW/߿T^=ɋbYd+VجT  xMTDDS̶mLo@@ʕKZnm/"W\ݻw7|cʕ+GS} r! 6?P~g3_zA>|dʔIF)+VKPP̙3ۺ_iQըQC4\       `j3G            8SLxV…%00Pd"ӧOMJ rltfj>vy0a;wN5j$%KѣG˗Hy=p@ٿ+VLԩc501Cz)}b@@Hcʎ;_y]=W_5>5k֔$˗/7Z|O _;:@)\\\L2gΜ):4h\~]w.y 3f;v)mD*U@@@@@@@ԲAW@@@@@@@@@@@@pD]tR/n{=9{Y ڠ `O3g YzYV?apz2S  >>>h"х7l`՞4iDFF>ƍ˚5kΝ; @@@ ~~~&|jժUɯ$ 01ɓG^x 6YgΜݻwȑ#MwH%J0AZ . v7qDիرcܹsT\99tP=~ @@@@@@p0]@@@@@@@@@@@@E@Eo+Wl]t>>ұcG)V1YQVZZ>ٳg˷~+7x#QO~> `mY7m$۶m *Ȓ%K)S 3gN1v@@@6/l޼Y9bX9geΜY4Xkܸq?$*sN0`TZUlΏs?"-Z;V>S[:t(v'@@@@@@@RO@Գ%@@@@@@@@@@@@NݻҲeK9pO8Ν;/ȕ+WRϡvZEȜDDDɓ'erqRUzǎ'N:Jرo2c ( jժe~W_]իn@@@ @Æ `2uGfWlw?,!/ >\ve[oI@@YwŊ2e7n|嗲w^uꔩ?̙3KbdԨQqm'Z2A"mܹ&xC/G_r͘d";vq@I/[n~I+:ŋˢE̦ KU]ޫ-֭4o<|bw֭[gy1Д/KG cQYfjf17Fթ믿cg}*m `FYAW^lٲk  /P`Aiݺ]<_^cOh~oΝ2oy7M5ǦaFO? qw! OJټyGM> fڿERLaM:_EF%ӧO7!YԣGsn͚5f~>2z\\Yh۪$4?߸;YꩡZ:afXu~e„ R~}y΋kij[ls2l03_kPΧ'enZ?:?w\3 }zLtZ<{>|Zo߶ @@@@@@@Z ^@@@@@@@@@@@@@ Zѣr=\r)_|&5ȩJ*͚5,n5J -'N,̪uh@.Ϊ̙3oHΝnݺ&,6[xqRB0o,կ_?y'_7uZ>Ca]t1:.]V ӧO˳>kT/=b (Z+VOOOԥ&IYҥKfQf͚`/]T5kV'/庘:]6fIxc֓Y>Ivi g]]?/Fi]o  8iкen)sM[XӠ1cƘn;LhҖ-[\ۣ}yM=l6|}H×6lؐ$3fE777 {f͚%Kr֭[n::ҥKsiiРhZd߾}fKTR%sx˗ϼ/ ͏7}RV-=g={ /Y ;ϘqhS߾}CfŊ3mԫWτ\iz9r~v{Сf^vƍ*U* ܹsG{\lY5SH۷UW3d@]=:      W@@@@@@@@@@@@@ ,h غJkrǤa [uMΟ?/s1邭ׯ_ MիWGC/Ev,ZH,X`޽(QB2ggl=e)eʔ1oMٲe1](X[óU&[n5^zԩS1=kEʹ$vхJ7n=^(  dϞ]t`9w܃p@@*\Ҫ:re 2edsl. jӦhX޽{5ǦeZ,saKbu}Q/^UҥKN:ҳgXZ] ɚ9si뫯'eg1!]ҤĬrگN|{4RtTˮ],xb3?k TϚ݅ W˳נ(KkdkG=Ok^@輪2N@@@@@@@arGEG@@@@@@@@@@@@H=___ݻw^lIC%ط邭SNĉTRds.T%Ga%TtaN-ta?`پ}v)G1缼~>'-3rɓ'Kƍ~s~b,hqĬ3Č7myNoX~زFQy˖-sg@@J {f)5:pnݺh.m$4Pe0[K[r(۶m+:uǏK-DÛnݺ99yȑ#^zs1CG͙ƭR^cΏl#~w,=_X13F}V,:Ggnݺf2'j959> [c6j?N:%Gի*G@@@@@@Hj@@@@@@@@@@@@H@,YaÆ2}ׇKZLX``Iǎe͚5f!]ŋիW8߁3۶m{͛7%$$I90|n׮]eҤI,޽k.۴iC/8ڰYfIV7t?ooo#@@6l˚;wn 7ސބħZl(8p9]T)[Bm-u7㏥DO'B@@@@@@Hj@@@@@@@@@@@@x| YWo<5H:O.}L:U\]Y,-m#   |699Őy"$)%FRrCG"JE0{wﶳ{}o|>{@@@@|X#_UVɒ%Kd޼y2sLyK=L@TC2y_ִiS)X 6ϟ/3f0 ]]w%>ӉduZ}]Mo)=GJrYjf%K3q[kI  @0:|"G@@@%:L:^6`VKMOϤnBst%v,=hp|ݺu%44Ԍ͟?_^sJZcl3Ϯ'k _i%j{L}ѢEvj$&&1Ck 6d:cpZt\R|A3N9gn:1b9R͛gxѣ3~&I/.5k֔:uȷ~k 5)=EױN-+V0ϫ>93o1QZ榡hNWZuTQS=xyeSOW2yR߷VJטt&oe       P)ssH        dj&ɛ)    իWAWre]nm%WtU ;cwNn=((>)kr]pLc3g6mCٲTk׮Ju%Jä$$$餻 UrdE w3[Ο?o&٭RyM3ێuѪjQ7p>5?.\؄(Qk9Q׿eB4L'4  @:]D'  xԮ][^yp q֭[pVۭc@U]E4iԩҽ{w;w-[6n}۹sh~f={?~\Vz+خÎ8^p~~~RX1:u/$$~LǕu*~h`S {fsz;r׭[7cǎ8eznO={HER\93if}]پ~/X|?ތ/YĄmlJMB@@@@.>}^U;d9A2+`+""Vuc            -jze[YVUzħ+ ҥ^T)3su~```r}z5k֘I0۷oofr,7Vɗ/%jƌXM%T?l:nJx)J~ 5 O=QCMw%ftӻۜWtiɅizsp%&&FF)W6C5*{í@ gX   d7onC<>aٳqD)Yd&:TZRY%+)u)O.d˹mXcDefj+}z/wʕmz%{E5+|q.xZi}2m49z 1bDY,@@@@@@@}ڜ?YY@|I_'0P  @/.UVm۶1:F@@"##壏>!Cm۶5;g3&װaCgZ{x;j@/;w4~=z 0 ;:kLnرC/^,i >\w2@@@@@@@nT@z@@@@@@@@@@@@ \taY!X r<~dtI+ZlUL$ǜultCɤIEҦM:ԥKluOFKyY@7s5q:ANA|@ 4iD7   a׿e^|E{T tP.oL>]ƌcw.֭(Pu믿NrQ"El>>>_V6%g~'ywM=xt|ѯc}(       J@-WI            ׮].K0.S OEJJ=\ ҭd?ʬYn*UȰadҥGmtB ȢEE Zv+WmHG@O@ɓ'Kbb"Bw@@hܸ 8qhTzrʗ//3gΔHٸq,_\*:ܾ}{޽ *UTQerf݀3QfxٲeYK dҷo_Ɏ w @@@@@@@rZe!@@@@@@@@@@@@ 7 h3|udy|}}Mؕn m Ji;_>Jyh7,+VgyFϟ/gϖI&Ip>ҥ_.]j&qX<#2x` vn@ W$gϞ}Is3  xi}grw˷~+9uooo!ZolذhaäN:ҡCرhBr&pAO?ԌJfg^RJyE@@@@@@bsK@@@@@@@@@@@ 0, rΝn9z\碓%p|弟HeپQ b{eڴifYdqR`A;4ϟFodX@]VVZ%ׯ///m۶5n @M `ݽ{7Zijq  бd Cʊ+\{hOtbo);wu֙q^xA|||QFҺukiժ4mԌ3-4z_z)QtIϟo-t       dZYK            ++KϏ^ *$J/_,"Eطp" :iiիWʕ+MuAu&;w2eʸcЯ\ ~OLN Hd-ݻp\< &?׭J@@ȍ:AZ:פI=z=w7l'|Rt]r6nhuf͚e\vmZ5ti 4n۶m_3g$$$ĄM0A"""VZ*mN@@@@@@@B@@@@@@@@@@@@ [W:渼pBא +JVU%ZjI9w&000ٶى@n(^ >T Zv|2fѯ5kJǎD-[ Ycǎ_|!6l(9|-ZTtb8:(((s @&ԩc2y9!  h3dҠAi޼ 똺kբeٺu,_\Ο?oի'rԯ__֭+իW__߬ #'O^v-~ :xuժUYfAu@5Ԏ       .@@@@@@@@@@@@#p$WWֺtxfWc\)SLhm;.,ku/Z 2ʕ+fכࣗ^z4޶jJ6mj&,W\oyN`߾}f2eHyͲ~3arƍeҹsg3w@w@W_}՝D_@@s?|7rwʎ;D=hՒ {5ϱ}v38|???3㌵kזZj)/8L ~i;v̴:7p@iԨ4lP>'"       j:D@@@@@@@@@@@ NjcULLLXb]v: Bp++Z*UcYNiu+;Q6""Tș3g/M6 p5tCľt-ڠA Ѿs?eΝ[l aD ;6mH-@9I 7,GsΙ'{;@@@ K6A=z0:3а, 2n_~E;ٽ{hPTT蘒 Q%ժUs }o>Ѻ~ Ç߁U^|M7΄hKѢE        *@@@@@@@@@@@[W^5XV.dMne-uJk1yNt}R@ hHV^LէphhҶmd+'-_ԭ[WtB:uHZD 83={~0 rIxUT1NEƔ*UJ*Wl&Cԉ K紖@@_f 0`{fnjXa111L?sЭ/R~wD{бU;YbŊ5444QXq;K.pCo&q-2 ߄ik       @nWg@@@@@@@@@@@@4 J.*}_x:KL`+ ,*Unu\'stIu@44$)""T?Sve;Yb̜9L|'7tԬYL(:.eo>{ݻw$6!!O&L 3U״$&&ʏ?(QQQ3F瘆tԶmKO@  L@V|yd@@իWSJddѕSlTvuI?hhVk]ǚtRǧK LVrĹ)SƄ9:^:q9rD$â!Zz*5$k׮f:YlY4       ZrK˃!          xիWXtcNnge]|6a"t2VUhh qoեAArZtҢ[n\pA4iϞ=f/;#Ǜ-*:QpʕR'j% +֪:1쯿j<(z\K֧ͤOUԮ]Ҡ>֩SGyDg֭[[95l5i҄ǔ@ُd|^'   @ nZ^{5:t38p`w*{P@[ηr1FnB-}U *d-RJIɒ%EZqJ~byRC4˪Ǐ7ǎ3l̦U[cl:6]~}gf ZX1 @@@@@@@nK@@@@@@@@@@@pHHHsΥZP8\Q'c +]/S I+`&PĹ]@ ( 64yt[ m:p@իd.]ٖ-[|_եN|:ŋNKuI bѣGE#GR?4L'm۶YCΪVj&NR"""L5k>}Z6l`Idd6mWq! @U&jě@@J!C( N:e!$^^^VS,@!֨QN@Cn pgٸq :|K5P˚VC:ɭuLu:|rt]zU.^(Nkll?wsN'UXV>HV~}˛,9E_>}(SL"G6ضolR'0 d@Ŋ姟~ʚi@@2%0sL?w޲yfW^ky{{p$ HJ\v̈́0i('̺c(ٳnjtN蘣5K Ox5&7cԚcϙֶg6wjR>8K:[P_+馛*Zu|Tϧ                    za`VUZz9(Do,Ʌ^A#6)u@r@%DkFR|2رcfSN%Vg޽{RuV&ZZA['٪?Cc3.>>>ͪ?u6AAAksO'P zǏ7,[仞PU&ZGaonZtWn]ر jѢX>" P\9Y~'t>"  .\hv*_}TT)O=V>i |p-{.sֺL1Câ4 qĴ9^wa:NKk1ֺ3&$$ɭ>c@Vp1k]ó4L+=Ec::Xw(>kLTE^z9@@@@@@@ zSZD@@@@@@@@@@pNZXYĂzsщt"<+KXu ? -@Z}rV'՟aZ +ky%긽y-ҸGfY8VId:5mJ˔Ct]kBLeʌ3d„ sϙz_~e RMOlӦM&`룏>9sgkٲ СhVj>)@o :z|?]  8իM6Ҿ}{ٲeKIrGO( cV.u[CTeW8PL֬i/wm $ָ.,\0*UulN;.u 󲖎^\Y:a;k@@@@@@@yr5           @ CΜ9s]@Kn^i~e-uR)RľOי@/׾x0@mtW5=E+W[lAU$ ^zL ǠP*e.A@@@@@@@\$@ i@@@@@@@@@@. .`, r Jk;66.ϟPEJժUM2_>Iu@@ 'N|ȢEȍN)SHDDO֭+˖-mۺQ/]i߾Cr5o[oR^z- $˟?n@$d   j2c<PB ggUy1G t3\       L@-Q          xc_&KCP,kq]4P,4\䖅 ///ǦXG@\*iȁ"C6lhBk7\,X {]ɗ/h`iӦɹsDԟ~^ZfϞ-ҪU+{7 3`̩ YE5=@@+PF dP6mȺu$444'9RD SsH        jyF@@@@@@@@@@@ 5/& IJBtSD4~[XX~kz  ,`˙ƍElIԪUKo.ƍ;6T͛grf *$=z0U/=|DEE:k,?~}ҥKg.~pA   x@XXlٲE:udB5(rʞ4EUD>Pdݥx@@@@@@@@l P+[          dD@4 r^j֙3g$"E؃4JkJڶ… 'i @@Oy}W_uEkFmP!C֭[eʕ\ v/A D}&&&ʮ][Æ({ @IDAT ˗/K͚5Z[#"9+ZǎNpw@@ȰNMCtbB֯_/up;\>gϊ%2xHD        j@@@@@@@@@@@lths(Vjgm3ic)P@, êQuaYV8ooofXG@rLEDͱ.dۍoviذO5j$sΕ#Fd=F۠AS'N(͛7^z%ɗ/4mu-'=&}E<.Z <>  )PD ٴiSZliӻvCeV@@@@@@@@K@-z=           !kr JnڧE4JZxq^}wlu@@.[H`u=S.Wl922RFe-Z$JIY @:udu ό믿.SL"EHDD=`J*)7@  ,(Νs@@Ȍ~ݺu2|p޽-9;vlf墉mxN}Wlpk@@@@@@@@ Aa          yI@'Btr$DbŊʕ+KF̺Ou_C(  @^غUd^KO-#ӧO7OpY|l2oAӆ=c6F2u„ ryT=\]v&nɥ ŋ.o@@@ dRfM?~xD_Hq8M;ݿ@@@@@@@Zy5@@@@@@@@@@rNo`EGG5?$!XYAX1PBXGC@\'`Hz" MOjum۶2yd2e pѵ3~EIbb}լY3 ) @N ˗/d7  H@ô¤_~?{'˗wQ4U"ǏlܘUw]@@@@@@@@Ժ1?F@@@@@@@@@@ !XVVZKIñ 5j$ DzRkPPP= # yY௿6ܹyYA$$$D>yWE'^hwR\ sO+Z2uƌrY%<hwlծ]ȥ @ty"s-q  @eǎһwo[|=YttFظ̙sDͫ/ez%s@@@@@@@@ P+_z          %&&FMHVJK cZ/\DDŽXWŋ*UHƍMqY`$m  s˖x橽瞜;yȑҲeK۷ˢEgϞEK"Eo7U~ :sL7n*UJڷooµ4ddɒt}嗲rJYffTaÆN4I.\ 7ol U5kf^;JE 7*'΁7&#   ҨQ#ׯr-/-v@``tTmرcgW^yEx vڙ- >Xk;Ak    kTb»Ν+SL{2?_7nkdp]og%""ӺO@@@@@@@@ ^p@@@@@@@@@Tϛ@,+qi;h]|9ɣ% *UԩSǾDu I)  BWYY8BzCh2׶AM7oSʃ>hB4=Y{5Ug:DEE?,/^Uõڶm=/ wA $&&gA@@@ yooo0avm2b[|S>k, N"fҥb6l^]Bjժ%Q@@@@@@@@UjJv@@@@@@@@@@2$p%, ò%i_4 *[ԫWϾ]xq{@z6@@.wE׏Ϯ[z}'O=kN/b i֬G?vvڢuرrꫯ[oxyyIÆ [M4___O}\   . 6GyDVZ%'O6![~~~.M%'pȸqb 9p`h0P@@@@@@@@w P˝_         x@||>}ecMt& ҥNڮX>u   x{HٲnKZDD2p@iݺL6Mqu6H'nӦzvٸq Zl̘1C4XС5j#:<&Gӣ9  >~ɭ*f͒I&ɼyd̙uDF^?u7e@@@@@@@@Ejf@@@@@@@@@@(p{@։'],=aZ v|IbaXոq$ۺ I)  6ٱ$$$$=^?~XvcɆ DJ.i {wަ4ZQQQ2uT3f)Sվ}{09rk'>υ  .\XfϞ-=HdoD@@@@@@@@rW!         .HLLed2uT˱,XPBCCXժU͛m{yy9^:  yN`ʕc_E~aiݺu֕%KHn\>|I%!Yu7'ٶ+&:9@@\/{"/nwVppoZ %KÇ͛eʕ$o;7-[&2wI^fZǜ;qF@-   @'CɪU@2`)YCXv\|9ozUdP6mo &ٺuqk۶mFGI         @@@@@@@@@/^Ǐ'[uR'NcIaV:)NjukӉKY"  +b8%rz痮^'&&9sƄ~Ұat]]'oraeN*U،~d .iPa͚5K… %222}k֬͛7'9FnݺuM?~y˖-ek&QF&tZ7n,yܶm|rM7 / w_pr~o^vMtLΖm+Gj_)~==}Rtv @@@ ^z![n6)X [SNRh<}VyoܸьG-[NkG:       9*9[$G9         56AXY ϲcccp, ZZ$bŊwk@@@!`]JDڷ[xN 6PӧKXX1B}\3Lj\|l|}}eΜ96&^zb |nz˔)cN-]tK#Vqܷk.q:e/ڵ3u&I64`kɒ%_֦M{~s?.}o&Ӕޛsg1oZǭDpY,@@@TJ(!cǎ5ȑ#>J|| ܹCm+ʫe~36n"bˡ Ԋo;0,6       Z9 p@@@@@@@@@V˗/ñ4˹ZY'O4pYɼ ,]֬YL:JJrϺ%  AymM+%r ISү_?:t\tGǎ~0Z-[ML>YxL6|h޼nZZha¶ݾ'("5jϓ;wNv)EC?C.\(۷o PFGG˼yd&j*n:;wL4LtR/`"ٱhx79}]x.馛Dȑ#[sV۶4x 7ZhC۾9?/:.ٳvZӯ5k֘O?m[$iK)}/Я[MKڔa1<AA@@nD@{esٸqzL#kڴhmܸ˺뵶eD9(oq1#];       x{@@@@@@@@@~ٴiXL# ۴i#aaaRP!3Nݺuksl駟ʩS̤X={HYjlݺU~Wt{5kd:{EV~t  Z`[o[@-9sƄ `+ ۷ǜ"VVÆ K2a7΄ixQ*SL1aYnuwe$G޽ & yfgi?l v4LK󫯾lt{̙ra s 2d,^~~3+W΄]?~\t7e>i_u5abm[n#V4GFُ=lD7kLNj8zכQ{?4Z!!!ұcGun98?x |Nj݅ dɒ%:=i]˴;vnju\ϡ ` eID@@W TZUȑ#f\Hի'}&mNwt\KN>nH[ǎL 2v3a:xd֌G#       J @@@@@@@@@@ #/^?3z6uL'ٵN̮<$WKjժ-kZNMA@@[Yϝ=j˜4fРA3<#۶m[oN:XJDmVZ~. 7;N4k,3QVi :YN$}ЀC=$v2ZKKs chXP--6l0> 0!<ܵkWsL`-mSNf.5*ڦ>Ӱa.oӦMe2x`4-osmFa_r,rԲeK)V}>}ݴRrV`rm=?$**T {GBvLVYkGŊo!F24iϲl28qZ:Ʊyf{ߛ^z96d={iOy^ܹsf\/C  Y*GC[oLH… Ei $]6h@t|SmO>kqpһwo&xd֎G       ܨ3Eܨ #         @k׮[Xٳtv\CVRLTndYK,)>>>XA@@M6)#ҹ?=;tK&Mi[l;Ir}eHΥv&LK뺖#Gh8:I~믿9JKϞ=M;:AB w- ,0}iժřcD9LC4*VͲ|fa Hyw̱X"E/ݩi@ߜ?tcر9\RVkԷo$%/ lihDFaիWki[vL=|pѣlٲEZhaRc5kB6˗:'erH{AJmW mC@p~v EǽZ%::Zv);v0^?.:6fµ4^C4>˭d6f[[H>0c:a?xd֎GڡYA@ػ0)a#y9 D00QpPtV]E5aX (I@d $(z_:vuuu9wζ      E uQ|<@@@@@@@@@Y8ַo߮'N`8{qeEugEEE    G nU^՟#C,<*Y&fW ɚ,/pprB-tYQ#FaÆꫯ'@ZjB[믿¹^y/o?CNiwn<u륗^R^R|>]psx <3gWtzk/ewY>7;۫Dϋ]1/IlIm/ϟ?@@RQދIŮ\ԡy:Okk5 ۰ad1{5k5h@ms -qtMR֧bڵny9\`>җ@@@@@@@C@P         ǵuVmٲ%d٭X( Cܹs    &H;vH}:#G sAnH"sosʥ={Ȃ*Wov6lPٲeOvڵkBƍ;)St.$رc뮻N)BVXAw+D|rݻ +VtaC q% ֊>Ǐ:udɒ}xȑ#G 8:m!3fpZhv޼yدB 2>+N߯_?=zT@T9n⃤9uR"o=%f@@ 5~8j=yyF;N:9 fp*Zhko?9S91 ۴OɛOR`Aɓ'RzGYA@@@@@@@|           RҺu_O<]A.+{0y֭+駟Beʔu]azZK.նmtamܸQwE׭u 7e˖T E@@5JJT?dEw.K,YmԨ <'l뱱_v>{n B=zNYkYu]uUg=wW…o^Ӊ'|.?DZ{M6Jlܵ]~5O]t9ewBR޿_ ۼy{_Ss% f[nE~_/juQqH,`vڥ':  @ z̡_&Iӝ:ٳ}Y yÇ0_۷WBTjUmׯOΙ#yY^H3Oc4/G|db{@@@@@@@@ YS+{"         @ uݻw+ o0ALdv-ؖbŊɓ'k5 u-͵_}k׮xd)]xW{_uA 0ž7m}?q}P{o?~+D =(C@Hu7[,YR}@?P+ /([ gX`8 ?t萛kѢZlVZL2qԿԮM%ƺj|dG&"@@@@@@@ P+Y@@@@@@@@@@ c{U~'YtYtnXq… dɒ.I&, ˲VD   z~mx+oԵ^#GB,4+njժf͚Zt z]@=駟, {ϻ)S[n>}kKoK/T_fΜӷo_s=K\ԻwoYqqqZxW⋲'Zm_vZ 4ȍ{/>=C.ʞcc̈\N'xBC qfoNܟ &rʮۓ?m Xlkfa ϕlYYf5j[o `sk˗O,ٶnBѺukc%]`/ #}v{"Ei  uzHx:sr(T:t ~xbwn}A/_^m۶[Ж%#~K"on+g~;2͑|d        Nz        )Vp/g 8qB[nuX6m:ւlێ;/SLqXfv[X1W _@@@rWyT᧞±֭u֩\r.oQRTlSwƍ|kH;]Cڹ|={(gΜ\[ܹSV\رc.T¡I߾}. Ȋ_r%:l<`53f CO/7)mYXZ3fzѢEe!VnXd9sй>FcG@Y¶: noŋk޼y.O`Pȑ#? xϴb eϞ]͛75\\]USB߻O>Z~fϞ|dG&Hz |     !p/jܸߝoOq @4Epai,yHᡳ         .`E-+fŭи˗/e;woEK(lٲs   D'K^f{f~7@`P{B Jn-@B 7zDGG+66d+B˗/׭ު+Rֿ/,Vr3Զ3vbC X^~\9{O[r>իp- زٹs8' {lF C\vwݳk3[7pf.@ZhõuV}4i[.]J*gԃԑ/71|󑧼XA@@@@@@@3:          ] oYq7,Mn!Z/V,ˊ[%K͚gA@@MQ8|3oZ67o3dK{ﹰ;S}>裋 ( ёt|!C3g ؚ:u}Y@װa@Ͷ eܳf?oי! @ 245       i+@Vrt@@@@@@@@@ 8| Ȳ²mݺ;[s IJ,k 4ۢpt @@@ =^]ʟ_9>HA:|?Ǝ?\-Z7|^į⊠X֭[B,mժUn>ɓNɓG111:v{YV…]؜x Oy K,VXR @@ <9sQ.+u!dz2Fޯ͚5s5~x?t5JmV۷wsV6pR^=#OG9~G="       jE[@@@@@@@@@ M\q 6Zm۶/%K/^\eʔQժU+naYdɒʖ-[!1"@@@8qBz5馛];&}J*KlugϞ0a zG{)666tBOFvڲ/{uZ~~7ڵkۥH"~f̘խ[WmڴQ||6l|mH lٲE%J>Y@@ =ÇK. oɔ)SȏDw7n{aZҘ1ܢ? % ߲,5 x0} XVeUVU9"ڐ#       @ P$^3z        D={\`ֺuY~FZÇEqXդI/U   @j %5m*UZG8(`A3f̐&5KR{7TP`.} aDz֡C(lm-\Э/^Xֆ ʗ/nMݻwWѢEg`@%JS   iے'O jkF𦢼߼H#FK5[,rs-һᆱ+sn7YreUTIKvۊ+ йS@IDATm       /@Vƿ@@@@@@@@H+^eT-0Ͳ,kv_ Νۅd+WNڵZ,kr    !/҄ k8GF XC*..N={TZ[oe˖5ٳgWllkc}ך\f̘ƌ~X\rZhتRJzwo;V]v,xjժZrJ*#  @ر#l,4`ؼ,/ O=%^-J^YC~dByc5n89RÆ qnsw        +@Vv@@@@@@@@HVɓUYUַmx^…Ureկ__zrU\9EEEc@@@H8p@:qB3i$ɻVzRV#Et?gϞn)~A#P@u5ڵk]ִi4tP 8P%JkjNYHBB .@offՑ#G^V̼|UV hBۊ+Q؄  NsZ'lr ;W:U^\o6lzH^0Ш pvǮ7[n / &ZKշo_Y8        Zz[@@@@@@@@@cǎ},0˚'$$U ƲUTQ>}ܭhY˗/)   )/]mݾ]2E:~\I6ɫ]{"[dɒ5k~ay.^%O*^xr Dky_tǽ/ŋz-ټ"ǻִiSȑ#CIOFS\i~zHWl.@@ xnݪJ*O.'jɓ'/(<3G^tHc #HkYؽ5khȑ4h{1w} :?RF@@@@@@@ CP~N        LZo5 ͲvZ=z$O<., í[Vr"<\,e   y2n9S>]^PԿK11^F@,YCUV~[8tbDÆ ӪU;w>A!`+µCj߾}.8nڴiOO0&M}oaI,)`svС$,f  ?-ZO.'v-c l3f W^[ yCR~lg>Y( /{WÇ71B<:ut        nTHI7jN        [W-~7|eY- RjԼysWpjժVxs=@@@@ $_ PJ~_Lf͚iŊղeK=0"r-:x.5*2u DGGCYl Nl=S{*BJ,r.`aY6lٲd݁@@2D+!Nj,ǻX֬9(~kISJo!/}w~;_|QC }ݧΝ;m۶9r*Vx~co@@@@@@@HWҕ!         lڴIVʕ+ZW֑#GN e]8q^+BZp?   Y:'MgOnp(P>cW_VѢEխ[7=zԍnѮUW]£*PD /qɓnµټU\kYV "xuTM>݅YR [קuPֹ5k&|^5A%8  d?N\X@*5**@Tp-0w-tH҇:q护u,.}z67l29R<&MzK+V< @@@@@@@HSҔ#        @ l޼Y˗/wYemWɓBVFjӦ-[M4+Ƌ   @ X.X,Pkdyg<%Kk׮ON,|wcA rȡVZfعs ֚z'Ol2URP2}6}ر3<,tGUܹx   +i&ׁ%KflGR,[$ZJ0ɇiߥ[# !5kV}j׮nF|SOiqx       $@V*Ar@@@@@@@@,'N(!!A˖-_B_usYVVZ]ve,    Ku}-q3 ݻW .tx-e}YGB Glµw};TT@qsXBON_2{TK.}@@@`ƍV7qRI!y3J`^֓c'[SGjժZ` Yf\r 8        \ZǓ@@@@@@@@@ {U;-]h+ߪj{xu^/rnEAY@@@@ 83P+S&ipB{l>,@gϞPônS-TDěYG ,*W,kVB,pz7@9xך4iٳE **\oډ'[YJ<   @ X!\w6Â@,Z$ehDzbI(/Gy_M6lЅݗ+W.)@@@@@@@@ll:<        '`Ōd-^._\T&bv TvmuZ1 DF@@@ ޲hK,M7IC[E O>fΜy0-;ڡCt7}m>HB7vԞ={Ə#F(gΜjڴi `f͚n6RBm6矻ng|z.]Bm@ *SLX7wj+;Wrtc1cK.s;k#~ֹsgխ[W99gA@@@@@@@$J         )[nբEpBwk!ZVՊ/_^S׮]UNW3O+WJq5O>JLss <*]nfo^}URǞ       M0r@@@@@@@@V6/bs!lğ*f@^dݻww{!Y9:       j"        @ [N3gԬY4{lYl+DSV-mV<4iK/4F@@@@O WBB)sʥ%J(&&uX *+<8_?va VlZ2T>ج={:e?+VTժUUZ@ bA_;vp4f!5mP{Yg ?bAVkٺrЩéYH@VvP,(tLN J\L: . v0/f㇀Y8}c_Db~H}-'m…]׼gϞƴi\o=[kݒoO=:u }zfs`}-Z[唿իW,  i+`%܂gxi/JA~w` vͥ$rsIj)?¨ϙU6`n@,>lm&ϓ$oE|'4UcT޵^v8̿^:}ves!vfmܨ5fvecf9?JSLvEƍ#@@@@@@@  Px"        ?ӧkƌ.HkͮHgzԻwo5kL7aA@@@`ŋk…Z`-Z hXY_/ (YkV06U5zmZ6aBV^BZ^~e͊ZU4h Ьx3KX SYۺukm6W/mŞP,eU |à*U =qH)ŏkY;'2?>Vd/mHXql+$mGK/bŊr6p@d_- j:u[5rsa0t7 6]Aw+_\9 ١CQR[S;iӦvRnt`g_}]4hϳ>%jUj-> @Tk׺kU  ŮpRȌBloa~駟\ͣؼk'^râ, )k~ضZ Yx0/f7.NQ7-PF,DA|?bb 7jd?bŋwlXmŽYhҤ?h۶:vs='k       @&'@@@@@@@@0xCa> ͙9sNꂴqqq5lؐB%pR@@@RGѣ][ɒ%Kt U~}F.(uΚGyoօYRZ5i4o\V =㏮mܸ1b:oa4V/H5Y`ʞ={๬gVh JܹYhO懡޽{ɜ9{Mbvka>eʔ  ttC[$`:>>޵.eot+nA|3fps6..u[]yʕ+upطUϱ}6n8Ԯ]  >ks2+ A[K XudQv7bvk(~ص4Yϣح8٭ͣ f:Y8?ρ!ftfp%ld˖9 3P#uYl'Hqp{E     ^ƍ{0DBX`yf͒Ht@ @        #@A-;M4IΝ++blJpi֭լY3EGG9"   O|)Sh߾}*[)Lݻ5o<>}tZXH˵^Ν;Pgok֬ {>[g+(lnX%Kp7s[س0}'Yqi+$m7?`¹';/(X+! A-Ю];hdaS\25WZzko|ͱbFme@ҥKf6RX1.?͟e6bה\bZ*Urvmk!vk!p|rŹGĘ 'A"@@@@@ Px aj]8=Zn3@@@@@@@@.M`Y3gԧ~,XJ׬'q@@@H cǎiĉzw\ XT׮]նm[+W.-NTܶm ĊC]wrT X7|od/^ܽ,ɚ6'EXV R9L+*m!ll_XZj^+2m!m,%`{˖- lYH[͚5Sܹ<}X1bd,m̘1zpB˗KY`c˖-7o)4wVgiܸqZd (N:W^jѢEh^#  `}<gOSڼ@5]$/`Z+Vp)g׼vm%K7gb!J~?bs)~҆ ?,B}caZϘ]/תU˅J[Z--m>1Fxg@@@@ud j]LօL@@@@@@@@Ժ޽{5yd?ܳgj׮몫R)V|< @@@`زeFѣGk֭.@£,"&&&غnٷo «4faZ{րd<,)8|+|>[Ќ-(c >[ *(G)?{"p~K\Tֿ@q+,nA[VX:666P\BXBG/[dAi5 lթS'0m-7nzܹs/);nd]V Gbaw}}]-]U?Hea  9,4%,k=]\vzjJxb+W,؂,hKɞ=;,\smG7ovX́ԭ[WsB}k+R=zkÉo@@@@@ P+$_6:*@օj]D@@@@@@@@@xXք jʔ):q+}5ꫯV%h   .`!#< >}_~*W\w=}vuck׮us&CU-ҽ/~B+my%Kܭ;vL9staE5ktEŊ aѿ08tdڦMܨ *$ ` K[i޳ضmOز`5+-;1 X^xA7|' ޏ7N>,83r+S"z۲eꫯPaC wG@ڮ-VZK*;S?Bv q ]`͛k…X@ͣuiڵݺiΝbO#Xw׭vjfxl3[1'nذ i ɓ'}^>|xڡ?tB5d     @$ :cFP P_9.܎g"        @9V>o'*SLj۶v:(o޼8#   @ Xԇ~XǏwF{w. a9L6M=f͚f͚iذajժٟƏZؘ_ >[Ç+_|г|+*saI`׮]_Xn-xˊK[FdN۱Xh}[={YSrKv·Z=ﻐիWu b,||I/.Xmb3@@?>cuES\ŽUʖ-ѣGؒh}n~昖/_7m+pF 4pswł@Z صYJ? ud-\ٳuwRo飑#G;Hcr P+9#     uH/.\@         { XJ ڻwJC;vTttt2b3   ֭[ecƌQݺuukqۡ<껅H=.V~iUV-nݹsfΜ(w߹0ZjV`Z ҭOK, 'O5inٲ R"<.^ ?ϑ#G͗[`brNZhċru]ZjnwJ*wa=zؿQqmٲE rVH! ! @X ؿhƍa9Nܹsx ʮ9,?ה)S\XZ@[kڴ * ,6mڤ9s@j q>n޼PWT)ciС8q,'@Vf@@@@@@"Pw :j]kEօL@@@@@@@@Jؿ}]WdɊԫWO7tz(P ў"   @8 X^+laZ\rFB?i9/BԚ5k4x`W5{٥T=w?+D~vܩ@&M(gΜi !}uֹ~i+ߠAW\sΪTR2LF0emGc!O6מ+W.=֭y'[`۶m.rر#G*::Od@@ ,Ⱥ~.x4 +WVZ6ԃj-~̙zGi׮]jڴ:tZ*U%dL(`%KhҤI0a/_%Kʂ{ڵkʑ#G\ݖ-[tRIYGgʜ @@@@@  ׃ g Pl:g,Q@@@@@@@@@ i+8ԣG/_P-+34[@@@+ ѺeB,X{04zfͪjժU XH(-Ǐɓջwo.\X_~W >ܽ(#OV(5l>[oՇ~f̘ƍkѪ\+(Oh7NxiӔ)SF[RlmlݻeߙRI/E՘1c4qDh " իDtXzu:o޼ z~0]׫WO>-[& ;5{lթSG5kt!6ы][ѣGիW/Y        \Zdz@@@@@@@@8oF;wVllݫӧ tMʑ#Gy0`@@@"Q7T6mԲeK-^1Dsҥ_p- :thzwϷvZw}*YtW_5a_ŋ?,lEz'?믿V4j()SFm۶u[VЙ%.\K/T5jP\\z^=S.>ӢEߺyw{M;B 3g>;W\ኳG CF@_k.sS,YԨQ#͙3'^3gk W׿U6mrձe -gA ʕ+n.W_Clα_~Zre2ĸ9SGоpr@@@@@@@A k8 1         @ lݺ?;v+ʺdծ];O@@@@ ^z%q+ "Џ?VZȑ#n3fг>I&nݺ6l:XtC@ZdW_}% ?۷.Wt݊,X0LFHiÇM6M͛7Y++o&D'0&A@HHHp9PشiS+IO?T<9P>}t}O}_YhC= &_Tllڷox@ 4H.YHh4}^4i!       @pc@@@@@@@@@8q℞yU\Y?LVڑsd@@@VwqaZDVƾL?It?ꪫE6`´9@Z 4lP/~gWLRҥ5dܹ3OS(`7p,X "$L+pi[eѣ:u꤅ Y8$  |W%\"  uڲe۠]4jHݺus;iѢEP!Yfusv=msrr NF,wyڵk^ziϞ=Ή       @X/#@@@@@@@@@ m֭[M?s    @ XQ>}hE@s=zy+WVqZ~^uW9C;phvmhرc5m4+WNO>=:?|P~&Nڵkg|"3gvWձcGmݺ5E> DjU\9Z~@IDAT}=iҤ]t79*Uh͚5zTl٠/B G-[Cz?#G{WmN;ܜ@@@@@@@p P+\^IƁ        @* L0Auq[tM|   "`@{衖-[joSyt5G*S+OxN dʔIg/+^fMw?gHZ ̙3G>yW4?-űS.%K[ʗ/򗿤 @BB,) Om׮ ~.g? (/UTu jɓ7Pݺu|ezv>&&FFgyj΅       @6/%A@@@@@@@@ ^z%uU>czGH    j믿"VT+|ܶm[8q/^Wڷo6lpugĈ*V ZLq6nܨ8jRwDE (AlҥQJI/ҥ3'&! I6|>唙3;O6uT3g}GvW. |ثNV"ϟ֭[m̘1o>{ /x%0ŋM0.\"y[lFӣG+Yeeϝc,{PA.L!@@ 6m=SJV O7߸O>&u}a}vޞS<ě+Yu۷5k$ڎk/ 4W6@@@@@@@| Pw+D@@@@@@@@ 4L.]C֩Sn+C@@@ `%KWJ!KjC9M8q_֭[g´-Zd+Vܟ/^p~* 6QQҥmі*UUݮBp\)l߾#'+M4WڤF">5j(Px畮]QϫWn&Mc/+صk/P8?ٲesn S)\].һ-Zƌ? B3gs,cƌl̏-[jժe[ JVRyѶId+W D}b|xIg裏]wݕLϳ{l0ޞEJl B$쎢l]zٳgox        KC@@@@@@@@#0c ۸q͙3'4"   @gϞ%K#<rW]Ծ}Zj֧Oˑ#ۤUhB2*WlC &MXVs)>uֹP[oNm֬Y. ߶w}VZe~]}>7e˖-ϻH}7}J"}^B^0UT?4lО|I[vyv#nCv?M0ԩSmv+^l7nl)`.e„ m6k޼׼v(Mϛ76lBT05kVۥKPoڴ94xΝ{j|sNwo@SK.|饗 ڴi9uwn-Zpt輊i{niɒ%nswC\Ǐl4XBBBlذacO][޼y#-eر6{lۿ⋖/_c&x EV?@;>mOBúR@@`гo"E,SLؼhۤ5j?O$}8q лi1=ӟ}/љҟry}\&2[Vիdw~l>պu^         ^|        ,\5hGBy@@@U`֭.$#™{97SU?4`ESNࡲe˚½Zo%+|C#F0\)CR)/I&}gƍs 9t)_9PK#w} @D"ڮJ"~%D)_۬Nlʔ)v7ZR ަnݺ ,Y5kָ0={ڲe,W\.Jm [:;FۛV^펳믿ގ?f-h Z :Fk֬s;vh 4o־;ojvmA.oP 81cƸզ֭[6DwPWt1^{.@KASj`WT9%2eʸ *1b\r;w}WX}^enfX2|}n]PLmUVLI D&Upe *\p4k'G]vuai:| AJZ&}5׸SB&{~GvAQﹺ(0P_y1Q;v̅>V!ByxuoO> 9LKmS^{M@@ iҥI>E>{Ngl/ۧJ'B1=+ܞKg|b2?%|WJ,{M_~k_Q>0        \^ a @@@@@@@@H ȹdɒ)@@@|8z[2gΜ>b˗/W^y>Sơ(HH'|6)HE}7oUUΝ]xB~5yd裏?7oTh RheРA.m۶Ѯ~->\"3g6wv#nG!k c"uԖ&MR3`¦rՠ Rp/жH".]:A5q`.}vE?Η?[ڴi mڵk[lL- {ni?*Ur1M41؍\9F/OLʕ+ z3'jК& dOjBs~p-('>E tuQ/-S[]| 8;ݛ,޹p:r֘[J{#}UVرc5HZ9rkxvroվuիWYOLE!*H1~ϛ@@ 9.]{:t_N\Dߏ/;ygĔ|1Ley! VwEA@@@@@@@ ",        )A@^fȐ!%46"   3ftK>}5|_>s@[5jI:P *X۠2Thӧp[ouoNZr!Lڿ˜|) .t=Cqq/,4442Νs *sΜ9ͨɝ;yAAQKo2fh7n?<|Rʄ lܸqV\9>jٮ]*TpsvKDPcǎ)S$p:6?Ǝ~޳g϶;#ULn*JrAdڵsv}B\p:[buڟ땨+O2ŅiQF9(64>ۍn So5!!ZtiB:p9Pׁ޽ۆ bO<AEqիּ0FWi1[?ӶoFQȀN&Ol y* Y7~3   l޳}RbQ /ϓK.'nݗ/QW?%Hҟ,޽k#Gkݺub2~6myH@@@@@@@. PR>A@@@@@@@@@@@@h֬)ku|g,444| .}ˋڵkEZ~soHҥK]EUVnS۶ms)={?k֬H_p.L)~zߩ~5kV?m(hȑoB<#w^;ok޼yv8w\RR%:u jԨΝۭsHf իׅ͛=.^hӧOw[Ҡ ^ 0]c+ QxۭL2JUV &{utVx[d;Zlyɦo?iѣG￷͛sl @jYXbQDΝMa}I+LZ=z0/,Q+ag{hKS)}))ђ%ʇ'|]f,YeQw4:u*׼G@@@@@@@jE%            Dҥmذ_\xef_|r-?l:t!C8pͣ. jذXI^QUHHH1-s4)hԨQ{n5kٳ];b͛7W_}e(DZ;vO>$w4l0TB˙3g m:q{}ً/h QPʄ l̙֯_?[l={֦Mf+W ERWo^-q>qU Qƌc:vg}=SnY̘1b;۞[2fm|7z˽׹ҵkW;˝rsNӧ?uڽ>o\)ΛzMV| :uj{W]oO ENƍ]ܗ_~~B݂@w/_mM{ow5*[Ξ~i˕+,[ o:ur!YQwmw-#~|;0Cnm! I-g3fL$ӤIgp,ꏨV{s޾.W^ժUM@۸q[M6~ڵ3eϞ=.1] ڪPmT[o]G)h+իWw ,pI]{̅F~mrl xުW}۶m믿z]wV}oJ*D k'OCl:.ul @Hb)R$kW0շ~* RW%z&KraՉg|b3?/~]F}v7|UyRkѢK꺰@@@@@@@Y Un        m@Ou_UXц ,   )G@A5 Qϳ>׆ޤ/^}H@լY<)e޽.|,@cǎY6(qӱ` <z6mZK~kҤeWݻW d)´el٢ cN|x5J U}QҰalVL[p Pza3gt/vkq@, 'Ľ5M4VbX^oryEɤILAVQ@@`سg/_>6)wqZZy]A mРۙ0a{˳{|q=_<)DjK,q VZ%5kfe˖2erָqcPۉiXΝmVn]SnVSKRCڵ+A9r/QF-`cr0h{υiɓ;vfz ?~ lٲ o).9$sESN܅C3@49@[?{ Zԩ-_͛ի^0z)^zD)j$@OW3a^)HKs?g{,R8}9[͒%r-W_w>@@@@@@@H!BJ i+D@@@@@@@@Çw߿N ֯_*VSM}?@@@HgϞu/ZڵGŃ۶m3}(kܹvUWL+7ol}V@޽s=/_DY'u9;lyMCS@I0rH6m ٳuD kך˔)Ξ={T.dĉ~CСCSXi. 437|v!~+#F}ҥK"|H&A@@@@v۔)?ApR@ Asf%讂n㩃E4@@@@@@@@@@@@D }n@on&qj 4]͛74s ݷo_۸q͙3Yuչug١C3ftc !G t]Xd=3VL\}ڼ{n4ii tJ` /_ k̟>}z`W8j6mڸy{׃u4@^ɓv9˕+W O2h {'mܹI*`{OW)SB֭8`?%h(0^J*YժU]xvi/\wՒ%K"-_}UXѝ3?M]@@ I;={$G駟VZwa Iꢀ'x֬Yc .t>V@kР >vؑd$իW_u\s k֬[,X`weȐ!AmѢE        @ P+YlT@@@@@@@@@@@@СXBBB\KnI_ S瞳۞={ 9UTɲnsal7U^>#70n=)|j[Xȝʔ)sE /?u@@@@@@@8W#*            F@j^ 4A{'Ol~9?s>sa9[޽-]th4hMU?` pls:u 7`4F%Kk A7ov*kPم(DOaZ5_ݝ W=֣GK/lqj߾}kٰaLϞ=۝Sw -[TD}3g4޴nf͚P}2iӦƍŋ.]!D-SL.覛noj֬P$ɓ'1/^Lk׮.NaqXjժeUQ)        @а[^!        @\ne\~VbE7d@VJ!   @ ?~U;}{13g΀{T6fgܹ *P@T1zj7o͟?.\h۷o4iҘ@իWw,h? ;]lҥӒ%K\\ƌ]`ٳyl.9YkM>ݪTB+۶mkSN:ܹW?CSPO?m> P @H =g׭[vm)!.+VpVv}'@/{u ,;wرl)Ha:$$$ЛBP@g- 'ry+W]kذ5hr$zW6%iLA      )Sŋ|c @b 8`77 H='}MM             ٲeAYϞ=mС6d{7cǎXժUY-[>uҥ=SVpာobTB v@ Rof'Ncǎ@ [re7)pF![ U̙3n:`zn@ҥKgy l^Z5~| ʗ/oSNunjwy(QW;udy r5/44~'_|$]v%1~ A$p9ךtQ)c/yw}7avǭϟ^7isR` lڴi+^.^{U`y5\]\X6c˖-sx R>K6 VO<Ⴔ̖Ҋҋ+f+W$P+@@@@@@@j]@@@@@@@@@@@@@ .|wn@ԏ?}7ipnݺY6m,$$$. eOj:wl 4 -߾}M0Tnڴ4@ "K>} @MTjC@FlܸqoٳK/th gisÇm믿魷 KQBļr=)S ĪS} WvPtW]լYk)K,ؔD-wDA@@@@@@@M=x            ~P@L=4o<9r8wa[yiǏۗ_~iSLYfٹsL3O:ZhAS~TRA5sܿwժUn|Mft(PDVT)7kM\ZNɋ4 6o&VpBӥK) >~]w`7 UQjM8FeM41Yl[u_II2jR(@ܹy{kJKz  @ ?޵@-mۺVReȐ^3&ڵ+\|_}U D&^lyHH )@`ݮ W? l{=P ۭj 뫮*į:pGA@@@@@@@jE            $@zLɓ'믿I&kipՆ N:1cAl… .￷9sآE7t;.PAe(M#CA5د& OTRNm EI[E… W_&~̙3wik`hM۶mss]Tt(Y+W΅ih)eΜ4;vuom޼eɒnFبkJ=zΝk޽Ut)^ \H+uA@гŋn\ؽ{wg7`@nVP!ԬYN>m֭3/\wϘ1K={-#Gr/Sh76B 7ন{߿ZI^h˖-sJ^S~ς -pyS|\y!%*tyo>oi޽gZphhokZhz}5׸)}I*v?:F{&k͚5˅M 4z믿>ZF ˞={aÆ{ 0kUVv-Xݺu&_J" @ KUܹsPdUx+kuE[SĢvoݺ6n7oTf̘%! TSrqNG}P?REuA˙rWyn        #@G            kݤ )8G.]V^mK,?؎;)S_ _5yE ޤAc5i Y Mz}I7Уy %)iҀ*;UInݬZjVV-7د[B;*Wc{5`7X^{NNI/[-cK[tEǕ)[lXA7\5i٨Sƌ1ZSԩ}+xG]}ν̙3αӧO5,tGGB4 q*ULΧA5`y{&(jŶ|r\_{5w2wzT27Ϝ9zWum޽Us`UI:UNQUZ]Ǽv0G@<3J:wnv_v)C[ -RX|(DjY(XD)RĽ.U+V]X? (FkR/E k0d/`F"{QD 1O)pYse4r邏`ހ  ,'BŢSs MAt?kӦ5t-ڴim޼W,{4Ң]筮jM £  $TIwႜǏcŔO&F,s~,Wy=|{6Q?,u,D\[l 7Q_I+UT"#O@,okY  V@@@@@@@u@@@@@@@@@@@@@ Hr[A\@78sWbn3ڴis[aU #G7C{h  wR)W.puْ%KyVVVf+p ¦Mf}Mj֨ᅴU0WUlܔ0{`] O<jŝ5@@@@@@@\ u!                 dʔ ۷? -Z,X`UVo}?m9x7sYf˛]kfg'\VJҲ.;wn믿{3?       ~ P˯l @@@@@@@@@@@@@@@@\|Z}gn_~yȑ#Il^~٬D ɓ}lJMq4xȑÎ=5Y@@@@@@@ P+x[Z                Dȟ?ݻ7gr4iؠAlΜ9h"kmW … fcƘ*e+fzmdfalR;bO@@@@@@@N@T @@@@@@@@@@@@@@@@BEڶmۂeѤnVXa5kִƍ[ǎmQ$ŗ_UOxV˖io%KT]"`Yf'NX       I+@Vw@@@@@@@@@@@@@@@@@ ۲eK/%($$&Ol3gδ[rwޱgϦ?1SVٲfWY|)"pY̙3۩S.        JI6mE@@@@@@@@@@@@@@@@-Pxq۶m[6HƷh",HjukeʔO>.^XUHXa֬Yzf2-Yb6eY҉^v@ d ;IN>       $@B@@@@@@@@@@@@@@@@H:aFN;vX"E")dYf^{za w}0͛͞{ljBmҤV>۷oMxȎ=j'OtRJ嚝.]:˖-eϞrm  )mZG c6,!C;sL        )Pb$4@@@@@@@@@@@@@@@@R@ \WZEV"W_}5co=SaTYN5j$bmlW{n[Ϸ,cVmڝ Iԩ]`V,YLSƌwιsv1;q3[R\rV|y^խ[rA@ٳ+&ڀ       u                $9sZBlִidR੦BFa/ RСCdɒ־}{k֬ J&M7a[~ƍ]֩S~,]bV5v X&0c|9j](XhϞ=.k˖-vZ[fM8 VTիWZha7|$6mZ*|       @J P+%@@@@@@@@@@@@@@@@R@ʕm)\rY>}omر.8JTwQUV*UP*;44X)J͛mӦM.4KYGq̔) *]tXUmժ;w5߿u*+]hѢn#m?ۼy짟~w}BBBm۶v]w9H+d @'RE@@@@@@@O@ijfO                 @ ԬYƍԨQ4曶vZ3g^z%;x[XbVD +R@ܦ`YZ LT :w?nGuX}޽{m׮]sN7={m_/^N:ֹsg+U)Dpvp"ּy]^,[lVv@|RDjGu@@@@@@@Y@`ui                 Ef͚ŋ#[@BLSf.ȑ#v ;{6mڰt.P*G>}Kֽ z 2e2{ꩿmʔVam& J4(\=^}U1b 2͟{9{EUx@@< P @@@@@@@E p@                 @ ͛ʖ-ks VbŊҥK[ŊB VL+^ɓ'aZka43Ƭ[Vb۷o3f@U{Uxv=X޽|6gΜ@.uB]x @@@@@@@ @V ^"                )A~j6i֣5ט}ـf۶=ٻj&MrSɒ%}b-;wn{7lÆ VJkԨuՎ=tb 7|       @ P+e@@@@@@@@@@@@@@@@R.]jǏO 4}& 2+QltͶn5,sfʞy{뭷aÆ H"6e7˗Yf%6PH*ܿ1C@@@@@@Zq7c @@@@@@@@@@@@@@@@@ Y 4h.^hsIʖ57l͛},SvZرuzZm۶5k֘B6mj?;jT@@@@@@@@ ZQ@x                @HHժU˾`o* 0wJUbj٧[g֥Yt._Y˖-bŊaa[ai[ɼΝ>sז[&MɼUT@@@@@@@>7E                 e%+}]ŋfSծmvMf'O}يfۛI}.\;N>TK>}|ϟoׯիڵkqk:        |joJ@@@@@@@@@@@@@@@@@ 4oveee'e|`V*dhټyf͚J}zBf̘a~di5lٲeVpaS-X 'wT1ɽa@@@@@@@x O8VC@@@@@@@@@_zQD.*vw?b `Ghb +{#D-F.*olrwai.f3gy] @ @ @ @& ѹs[k4FyfdQFlyGW9rd\zq5lP\.R[lo}qgrfRcfΜYcj @ @ @ @`q Z\ҞC @ @ @ @ @ @ @ @j&^{ ԪfW#;,cLj>bq"LjWwO?tyqꩧF߾}}C oѤI߿H?^{m 4URRRӆm @ @ @ @` Z:'@ @ @ @ @ @ @ @ @@{wމ{*x{#v!bu"L>8er~a;ƹ[6_ԯ_? C C=4FQknL@V5@  @ @ @@j1 @ @ @ @ @ @ @ @ @.Fꫯ_}lƋp'F\sMĕWFvG/;QR`}~wRK-7xcԫWo:;hԨQ?~!>Z0+S'd| @ @ @ S)= @ @ @ @ @ @b?<ƌw}wlVq 'Tu]1p>|xf\B @RࠃC%\ 6\|'Y_{W^9~T¬z뭸+b,Yj]w-.U篽q]Wտ1DOw}7ᄌ馛z3C@Sֱ$0I @ @ @s܌M @ @ @ @ @ @X$%i?~|&NÆ ףs@ :5f.]"~8WKõ~L\rKUVu~=?dȐ|x{DZ&K,#F .b7,l~|'g!SYTJ{ED\sM_DK}EcDIɏ=vZZG0 D֫W/?s5E @ @ @ Py @ @ @ @ @ @ @7n\ӧS~v"L}"C @@u5l)h~]5i$xѡCy5ӦEygix+GOGwNUk~76ڨzb.N8:thU-PRxU=( @ @ @ @P`O8H&@ @ @ @ @ @ @~:gy&n+Bb}o[o}YqGQGUnF?8[/~ilqI'EVbZtW_/W_}5:문袋bƌѰa2dH<1vؼۦMƹ+go0`@ܽ;Js#g?Y>?F-cǎq ?K/4^zhٲe?7(k @@wޱƈ#ΫtFcƌѣGW_};w^zŎ;8[G}4n|*Sx[l-e&Mʂo_}LT78:<0^<ݤI<*Q–^.s=nݺ/NԩSh=_GL#z?w++o @ @ @ @JjU N @ @ @ @ @ @ @@>< _~q!Dǎ /ѣGg/6]vXwuw)j^XꫯUW]\pA̜9/R^vG JaVlMBTv7a^;s={ۦ0JJJ^O9_92Yg|֯_}UxvƌGl,E,={EsNDQY"W z>%߻;I; '/~ sRl @ @ @ @@yZ=\ @ @ @ @ @ @ @O 6v)?3fL(?Pkl=}nӧG>}b6p+ĉ6۷Ϗ{OjW^Xb%bw}7ƎIcM[ 2eJL6-:#KƍɊ+8<dyg8믿o=n˧0u @5X w:tgX㮻>rm}޽{ޫU\͛[o <[ [vzpo??OU(_,c,N9%b"6qDw^GE)9nՌ;zM6RlP02JO kg?QFUN @ @ @ @Bn @ @ @ @ @ @ @z LC̜99T *z_1p7hРA~^p7x#z磰[oʼn')<~u/)+m#Fȏ^xaǝwޙ]v-a/i\sM,r?!V]uԤ0O?l|/b>TפI @ @v{+#<2ۄR^;Rw}W]wҤIZ\^t1Tꫯ‘ ki=ڭ[+-D\rIĆFtqMEp瞋80b饫~i]bz*AK~m:mes=9sbqY @ @ @ @ ,P_,n @ @ @ @ @ @ @j@?CVn:tȯ]vrzwEf򗬧`ۻ[h 6 6x[ᅬn-6l}ذaQݚL>=6txcӿxGfϥW&O~iR @i[G -M6-FF6|c.C[.+W )jƌy׺uHY~a7me5O>⊈EeyE^cEDqkYK,L^[X'=#r˼z~d ivX>CSPE @ @ @ 0F= @ @ @ @ @ @ @4g9vr}=zB֔)Sʵzvi̙3˚?Sq']$f }Ɛ!C]vѻwx"u.s=Rpm۶o1wqGѢE=ztetA9!@ @@m8S0>:>wxW'D㦛n[.N8x䱔@m7,mFcJsZ6mڴ>#LvȂ"N=5b"+0֚[mQRRUO{?ݺu$._'i&7<:uoqޗ_ @ P~h/7>+򲥖Z*RpS.]b%/"/8qbu7{gei]V+%Pe۷~^{mqaˎ)$j„ )ͪhKk|̩jܸq;RPX֭Z/oG\|qDʚN!Z'sgEpCĮF\g,im[Xϧދ;3?9rdU~T#@ @ @ @ P_TtI @ @ @ @ @ @mѣGG ׯ_|yճ>cǎ-{ Zk뮻n7~9=\pAbQGץRk.ox{ ԯf͚AĨ_~^6Ěk~xqӸ+ҋO><G_=g}^~g 'kvs9vA @&pꩧwjfΜc|Šiti#ڶm/|?>$NǕ Hkҕ7n?x4lذPSscԩuZRrZå<8 3fDw#vXeֻSdbaZٲ84YM۴Ok'|2GKt[7h qw1'W @ @ @ @@(̺1U$@ @ @ @ P%?}Yw{j^qG @ @@ug+[ώ3J/_+FNfƍ;Fzf[AovDΝW4iR4mڴKֿdަMMgN6mZP4o&zXy啣e˖ @M [oXuU,,I|GѨQZw͏ˮ{o|1yhժUh4kli@ @ @ @ 0gZsvQJ @ @ @ @ @ @Ĕ=z4JK~Jj @ @ Lz"Лo}.tX n]v͛aYYT^/rqZ_3&R @ @ @ @`j-; @ @ @ @ @ @ @@9sR>ub 3u]7^~兹= @1sNdT3O>EO|'NS_~ѪUV[E~iZ֬c}~;x~jhz~V;v8cbذai6C @ @ @]ji6 @ @ @ @ @ @ @JxϪ; @ @@ |_<0~WLr5i$c?,9⥗"{ /DfČ7ѣGiElEzEԯc_?C={qM7Ş{+br)uT´  @ @ @ @ / PkI @ @ @ @ @ @ @ @Z/pfT=;@%\GVj?駥ݶkWeFElqD?n&P^zi 80V^yg}*m @ @ @ @`vZ(!@ @ @ @ @ @ @ @ @ t=zwމΝ;/V)S"{n曥+@IDAToD}V:-"\3b#v٥صkD۶uF 9x뭷ѱc֭ @ @ @ @5P @ @ @ @ @ @ @ @ @ \uU: a„w- JYo]gD3fDDokkQ U>0XK.$ݻwσ @ @ @ @꜀@:0 @ @ @ @ @ @ @ @LK.qqW_C ֭[/PG7Wի+\o}*ڛ7_jL'_~5*6lu]㩧-[$cP @ @ @ @@MU>-c%@ @ @ @ @ @ @ @ @O$pu]gyf\vee<9">Ӟ³ o)m^RѶmJ+;ѩӬcLjFʺvB h"dM;3J @ @ @ @RZҨ @ @ @ @ @ @ @ @ @@93#>(M{q??(z|„YFMF¬[W,SXV:odV{gj Ø1cbHwy @ @ @ @G ф: @ @ @ @go 2eJ]&0w @ @ @ @&0}ziPG|ID:Ьt,T7uɵjѮ!ѪGđG>gՏ嗏|OAZK/=3" ]{ @ @ @ @Z(&@ @ @ @ 0?Z|T @ @ @ @L`̈#>t֞u:}1cƬhf=zDo_~!ytOIʰp c~j?#gQ^z)9Xm`96TH @ @ @  @ @ @ @ @ @ @+Dt^eEM));g9#@ @E'0eJG{ JenYciYfe"[n־zYBV Zmu׍Ǚg{WtqAnז@:th꫱{?[&M @ @ @@#@ @ @ @ @ @ @u@ {zm{Oe6j @ @`4 +_/_B]:4s4)]5\S V׮.;ަMD F^T9~{ 0 E5 [n%6`8蠃⮻~Fi3 @ @ @ @. ԪK @ @ @ @ @ @ @J>8WUܼq^K @ @ Cė_b`t]³&O.ըQ2˔;wu]*[,Oyմi1bDl1jԨ۷O9&P#f?̣G-2s_/1n$@ @ @ @,.ZKs @ @ @ @ @ @ @@5oΪ| اODfQC @*0iRi V ?~y. Y϶$u6m"^4C]KRpV+>.D>j[oGyd 0 z/|MXݻwK.$ݺu~  @ @ @ @U@Vud @ @ @ @ @ @,FVXgs6-_9)%@ @@u93b@ J BxV*Kk- /Ti0V J{ ZwYY}Žԍ/8{8蠃zՍ%!_"~8_vJ @ @ @=jgi& @ @ @ @ @ @ @G 1d/O.D;L @ Uq/dW3fD ZrYX)*:*KX±U\YfqM7Ŧn)\뤓NlA%  @ @ @ Pj/ @ @ @ @ @ @ @@߾'Xul0"ե @>=bĈp*;R۩SgB[)*wڥaX:u *)?%U+yvZlvyHP>Aoj@-[nݻ??gqF훤 @ @ @ @P@iN @ @ @ @ @ @j@z}O?1cƬYkg @niJ X)<]W`'Zl䒳yvkUbpV;iu+9֏ /͚5nC4N ]|1xr- Ҁ @ @ @ @Q@b( @ @ @ @ @ @ P:4PxmFlEqs @̙|3+:/g5o^Vu¯ ׭ZEԯ?^zu]뮻ns1q5ԖE*~^}ׯ_+:F @ @ @o @ @ @ @ @ @ @`N{1` #RVIɬ2g @,i"&M*SU:/>B B}vƌ {K]p¾22++@±իWlFh9#F:5jT0} @ @ @ @. kju7w @ @ @ @ @ @ PA`"v!#O:5b*4rI @@9{B܎±U8N\۲t° !Xc+4{yآEYwN,R]w5>cӦu32)_2^xkGtСfNĨ ,F>G}tlѱct"@ @ @ @TZs0  @ @ @ @ @ @ Pmzh(bʔͰ  @@̜7X)vU8x]*./.>}Ψ)*ŁXzegTvl*%@ @ @ @ @ @ @U#0cƌ,xꫯbĉ1y:uj}֋'\> x$hذa(KX"K hժU7iҤj @Z)`U **`R֜BV *`W\|Y *nS|S_6~@;M6$<9r@3?O馛ưabu`֦H @ @ @% Pk3 @ @ @ @ @ @ Pzx㣏>m?~|´fVBP&[vvfuve%4n8Zr%e}+r,QRRRY7  @iW0t,>OaW&sV^DV1n~8Bt,as!XsdVH'Xmov-VXa8s~x8 ''tRѩS0lc$@ @ @ @T@*a  @ @ @ @ @ @X|q3pvڕ[:ѦMH孲tž5k 6,G4QLSۧL&M'] &'|y=O?Mjڴi`UW]5XcXoK.YA  @S8|5c!P7￯oBV¬ X±~5+j@ >|xva:=3H3Έ;3yG/"g @ @ @ @O@VL @ @ @ @ @ @ |g׿5]vY|%60Z+_|ѣG~_Bm @%(6"ZU<B B}pSysZ~+B洧U+7q* 0WC=4_s1Ѷms=^%.ǯ֭[1"8∺Nb @ @ @ @@UG>h$@ @ @ @ @ @ @!?cǎ̓x())) :餓bS B5۵koyN6-^z饲; &d-"k{b޽{U @*~{^«)j^m."jU5iR>*[5o^ZBN */*{R6T'SO=5>8M6[V j'Ʊ'|r+[nj7F"@ @ @ @T@ @ @ @ @ @ @X3f3<sOƍFm}={fmK.Z36h ti%M->|x~2Kab]w]v%ڶm[3&i @@ L>+*Zk/[`)KeS}M *^YfV}ЫvBYsZK/4>ݻw&mT.pgǭ [nj @ @ @ @D@V- M @ @ @ @ @ @jiGQF]w_~et9 c뭷&MԜ UHKJJbu:*ފ/qƑG?Cl&>/_# P?+jY)u!ܪpW}{n[ÆVt,>OW+QX_ܶyzs{:@?_}C=lnSO 4k, ;s?:a @ @ @ @@U'>f$@ @ @ @ @ @ @ +F7pC|ѵk8餓W^kT!V1*1p|6KxGbqg 'lM|^{ jTk9^ BYX*nS(Kmf̘6- 2"BUضmDźX)PFWqqwG޽#j=WX`v}GZ4M @ @ @ @j@Z @ @ @ @ @ @Tӧǘ1c+cFN?Zk14YbF K,㮻n)=4hP~L/^ijЬ ?W AVǹ.wʲNʂ VV"ڷM!ܪvNש^svEuKI&zO><ݺu[fK`~ꫯ^xauY p @ @ @ @% Pf}^FK @ @ @ @ @ @5D`ʔ)?1.7n\;AxzQxIII Ef,o߾駟W_W]uU :4{8Scu֩ޓ0:Q3gF|Bh Vt^J,s[)Z5mܦBU:V,x5׏@%T@,;+vaGUг.>vg~z?l}4# @ @ @ @@@- @ @ @ @ @ @ Pӳt_|~x{ѹs*|* ,yI'G /0vkwyꪫV5"AW}W>jA+ Jgmk+BUeǥX~Y*Z[U<9䐚2|$e]=C @ @ @ @S@, @ @ @ @ @ @_}UuG>} Ν;ʹ֔ID޽cvk&N=Æ j<B`ʔY!W!V鼰O<+Ъ}jS|]|^y B, *j|VKDR9pU>qyE  @HAAiMݱc|xjj>_u|p<ѲeXb%qˏ3rS?KYab5]FmkFԫWF,$­R0)bHUU^@ٲ,hҤ4*P΋éyW.𪸾{ۤF3*m @C`vpnavm׎ə*83믏K.$ҹ @ @ @ P[jՖO< @ @ @ @ @ @ @` 0 Fcƌۃ=JV\qxbwz(ҥl}0?8|77ވG}4.:ujDl6/z_eUfG PlC aVLy`Ts^fYVs/X_N @ @ @ @ @ @,~wyg. vFEq=;>l,rW/KСCw޽\Y+O>dDyqq:tP?I=y;vl_:j1?̙SDЪ^*\s*&=bt??[FU0ʎ-[Fm;+v+ZԦd~F  @@MH|0N;8C駟.,7n\Ӧb\`y6xcUWE԰adD)ahMwä.,,(,$,$3<cǎ-Y*ӟH_Dl/'g%.&O<ǺKƆnWy_]vYqQyGET|^Q9mڴ|#kZxͩѹsdmKc|1nx {Y2YjOfZg^=b'!\s5x=l sΖs})bcXW|_e QN `{c=]!B[N&P<ȸKkL @ @ @n @ @ @ @ @ @ W^ye|)]z ~"}qaP="|R:= qySӦMM6f=`YpQiS*K[ʓjԨ4䩴$YfqGg!Eo~8ktMYhRСCmn[j9X¹^xᅸ ao*}j> Ȋg"߈3:D#xG2⩧6CY8ܳ_,ӎ7>cAW|! kMЫ~(P~Z9ŸfeYpUi. jܸXJBY˖uw"ܲ}N+D#ZEb>z?n,DžN:q֠w6yrr:}lyI'u'h_ZeeZ]],N}m*D,T~}"׏r߱;敛oyUڲM:Xឹbs+c[ϩe @ 'ꪫƳ>C osOx|U, סp6s SO=uk>E'@ @ @ @ꘀ@:. @ @ @ @ @ @,̙3 #8"[4f{Yw4h zBn,4)KMʶފ92bĈ?HӦ)S^$KlJ!]nmѷo,<ԩS;e7 YTIcaK\m?{&55`{E@PRWQOEA@lbWDD@Qpԋ"((JNfv$Lٙ%5TARٻWd*wՀRIٱ|hLG3FX?gȃsٺuX3{!_𠖚\qEX۷wG\EgEYiLvg PUO]|Kr$w"+q  Sռy-P+tPRzSOEn]B9T+J԰WWO:C^䓒zr~o"Ny%ˢsܸVki 8@VZ y >ׁl#rNj?'{_bJG_bKl]~=w?  )#`ߵF!:u믿^!o6mڤҙGgyFϥp@@@@@@@@puL@@@@@@@@@@@@@'0w\Yf#޺X0p@YvU!C#GHeԨQìҚ[o1";vԈVNp7n|?~T 6,nokI矗 H뮓 .[XR_|_x_36*X}?*TȻعOlqц%JHΝ55AfAƎ3G$GC{$ޚ['Kr|sirLJ7*~}yimKKe5VQʗϞ*R.gx=t5ESO \ȏ?UZ_+W/T={k`˖AiQng!**/x]Mﻯ 9sS %7_Bo?GӦMݻo&Ǐ]{}<:vςĶKl]pmغ>|Ro۶M>c}|?I&}{۳f0܃HVlQ6|/oE nغv'zp@@kw…bkҳgO/(d9LA{F t3        UVz}8n@@@@@@@@@@@@@49s*UJ֭*i!ҥK˖-[4ԪUˋXܪ\r^P믿믿 {ծ] X kÆ 'Ժꫥm۶˔)S4-.b 9宻N:},u 7xq)<^;~`Ey_=.s-h̛7sLl+WNM ܱ^ir۹mz"r~lo&+Ԉճz%ORN(\uk)Q\sM>'w@Ua/n y.ҿ.gz9F;hgwŊZ2{V=KgZ14?PTx=V]K˗+U}=ZK۪ފ2e,Y1RBҥƴ޽[^yQy駥hѢ֭[3yd:u˗O.j?3nŪF:m Em ZgA5kjG5Gr;qز~"]zw;}$?8M1"Zhhڴڵ >#5a{vAO!bgx='X(q ?y@@{裏[oI&ɘ1c3h: w!۔@@@@@@@H3q#            ,ȒZC٥F^=FxiƋ͜wysNYll޼9nXjƌҡC6m֬Yܮ([޽{{_Qzweڵ7xq- fY,aÆ^ e˖E-fE,pc"uR|M?pL=&^LKɑC$ֱc"U|];g_wxXy}1  pv}߿\r%^"b(ydROsg}V}?JGc        @ J=[             A,7oS~6e˖W +Vb2Yf :T}ovO?ԋ,X[vVd͚UcScpd,gurׯ/SL wY6}IݾS|N?ŋҵȘ1H5%E#f ǵŷٵ*gΜt^p,=|-[6}x^l.wyGwwc-ZTzy YL E*\rJlmݖ&QYdi޽Q',9^ꝷW\s5:#=\TBJ_z]ny_h˗ϋ۲d=%sJj3=bZ3 *$˨urʏ?譯]7Ϩ]z_" zoz߁g͚5eȐ!.Ë#H]{?c+ES;        Rޔ="            d0 ,\𔟕lxRJ Yd^{Mu&cǎ?Gb@<@aN'7tw!o@IDATY~gҥ?}Gc˖-qXricKb^0kјhGDر^{n~t:uYJj)[c,K}CŊnv/$d/bԠV{9. {x;H["Em %QFv+.'3} 5k -_5fwTI$[6?hk]C/u~=54żٳ1ɛ7wӑ#{H۶w[+_W,Yd~᷶q/wybZdQ_~Y G">N"  /oUv{ ;}m{_Cc *x}M٥KhwO?׳C-F@@)Pre/;uT;^zr 7?NgQ#]N:^@nVt#"       @l Ԋ燣C@@@@@@@@@@@@8kP!e?FmYv;2(5HŤVTjڷo/}S:yevS=˗S` M%Oh~(<.]Z:wmּys @?{2`/5~xi֬4n6xLʕ0}^:v(+V[Ϟ=>(f~GSO=ui9`sTZ5nNƬnƛ(/O>z4٧|hwʖ-+ӧO[0`DYsuC'ŋz3g̝;Wo5QyQox;vs裏-.}x C!/nYk„)]{AcQoj4ٸlYyG j޲IqF9tHun{zL.\zQʺMxKGȗZˏrQ#\h"7o]qi@ߟמ{kg]/}[r'7=5k}%KYuuƂ6|ҦM3g̛7[fAի駟vI[Dk̙E-ewZx. rg  ; [T^@}FMg kCw ‚       +Z`@@@@@@@@@@@@@'kW( dټS7oa,j9D)Z44+&RFvpE{\{X1cl2ѣ|h\ZJͫe^T{o+Bƌ!^ɶ/ÇKFIǂOȲҥK wջC=$7n^?dɒENdС{T#KW?o[}b6q-tkt[7Ml'N.lnxbaq;%&Jn|ySUeѢ)䪫 j%k ~믿jijJ,9XPkղ{n SXW^{NZh!CsUNńn!~^7탃>^ʢPY.N n%r&]0I:u/;juN5=eJ~ QcuS>@CRRk}Za[YPk7_<4T7,e˞zj[^+<ta nmd>؞75Pzo ;`">k O߃xa/ʑ#[>W;ؗm7o^+yjzmxq9ݦs xXh_%6$K~ Kh~`7|{vw{O`ն׻Z&M֯_!c܎  K w-`mU>YE/~{뭷j8W˹ d խ[{[@@@@@@@HOY;$OOñ"        vQO>Ļpl>r?Z֭^z2jԨ9{D@@@@@,X.e͛(Vp[nG~$[P˂X6Z*PMABT_ 6_4 \"?/F{Xfa *x{zAqmjQ, 8Y|fڵ^(.09Xb[ժU DNoĥ\ц}ϲc_ְϭz!o_E3Wii3nuQ0eye>W_y'G id3ό۟l9sJÖ>L`s 'u_{v2 yOKުue}.xԩGecz+jl` 믋Ӛ#ॾiۅI·NVժU5? k󘉽.JplY%oH~LPx 袋Nr'З#ʲТzCy:MpXA/ƍ;${5{ƵИJ[h]p5VTJV m|?ݼR sE*CT,RJhI4ȼ#38Cl̈:?ö9"T+FI֭ Q6&4\s5q۩ҵ}RvCgme˖%{oyym.^]Jh˒j]14RW\CG{bq;Jl444IéJ[ؐEoم+{cleU4/U:/319x0XG,մH~0^T׿P(vUE*y i!vugin]9={f(ڵke„ 2`6(YriYF+y7բ.;z4_}r}g}'=M\+r1h˒.mRsg  @(eGyD.3f1Z8pFõ΀@: uv~:uꤣ#P@@@@@@@@ 3 >            1/`aůMpV0ii[).U?ߠAenűRcrq,yei3FDydѦň*V#Y)՟e*S&ebYr ܹL<ًjЂ҇~Ǩ{8קOywŽСȘ@Y8[YYUNꅨJ9d:M^Պ,LE,:U䯿DֻW>+V %č%JfɟnUO6mrco޹=P)]zvtOܼ.\ی)gLx']hժ^7jk1lNlb?[v/ ƂZd.7#\nYpz2Y]0c=  2~=w!o<2n8 Vf@ iF*W, 6,1       U            ѣ"[!, F"7oya*$b+7V o/ZgLKd!`$ͻ]c)R$˪[WcG?eecr"9smٳ֙g]Y 1%駟ʭުc2ei߾w|3sL/? zE-9lx2lHV"zx,2b?d/)rΝes]Ũ-ǥKi"/$s'V"5kO˖u҃д=ja"C[vR.M-eS q](0âZJn˶sFλD[ow%l@'Uė^z72|p䮻}J>}TR9 !УG:tK.$C'       [@o              A B M7n 9x0xo…l@Vfd,+2֮q,D:Z;JHgt̲IgjEo?ClҸqc'jՒx@!,N/]|<+b䓲Mq<~W2ydY+xVKV1ڰgO(e-r,=4)W.<7q- emSdԆ.PlKX_ǡ[a@3KZFe.:ۻvl_nyۗ=^RŻ"#\VbAvnb`nMcaR&G@ 3 w_ &cƌQF?._~r-HB:1$PQ+ܭ{ Azb8@@@@@@@HPV4@@@@@@@@@@@@@"ph$Ǐ(DƱݼԸ󷨁,eE6KeXn(Y,b?ebZ ;;W7uVhE,ч?@ hR4 eE/2iժ4o\ hh,t}ȑ#erK92:S̝.>|swiNvI ۲F/RS2el߾==jԫukxpˢ[6ΙǷe.R%4޽U mi.n|E,gQ<"ڼE@`Lck.-вh-m{>v}steS,x;z1  Ӫc={ /}l0曥[n2r+;Ϩ         @, d9C, dž        @, tU>9zh,fuzaz2jԨdmF    ?l,bF::b3- dcY-@^\釲4ڴ)t&BYʉ6.-bVirp°F}E6mų,u9HD*kL˸q4VJn6ի*T(3qsp?ƟNzHiJP)0oRNS~˅S߶cŶ,nUocaŋEQMm~.4 [@ FvJۏE\, [$x;ڼ[4{Ďu d,ٳgѣ/E,ݧOUV:Q& ߶ʖ-+q\@<ݝD=`{xeS\cgcB@@@@HJkW$覤6e= )dFits=i:{8\@@@@@@@@@@@@2"6lH8emb0f3\bP, 6-^\$[)uk` gtyYƅZXh9wX_t͋ hYi۶m^E2`/ըQ#ɑ#Gʕ+]D{#FСCSn䦛nƍ'{_l;>^zI,X>5 U21鵲Q_ ZlbY.e|#"[w)mu$ү|GPHz…)~LMCq- lY6.8o&b[e6FJm6~O}#: qsɫ*cǎ&ЦM/u%NݙMb-.,       LV{B9@@@@@@@@@@@@bMWfH e%4Hֱc3ȝ;IJ(V"g̖XH~y΢Ɗ-|cv"7 `tOmZd!\`֬Y4Gk% ?C^@3HSeذa2dy뭷_qI͚5{b-g8~{.'M$7͢?]v.XޤIa&Whsgxh˅~/ rCU\uҲW,:ym۟ #!6֪%_@ ,fecj G.yw;`}_pZ,x_wXW  Jh{A_|-*doFի-r&StO_..}g@@@@@@@@bT^O             @ ld_/qc趛U· BYmM|pgq+]0+kVeH]c3ÃY+!?u jѬo-eP>|7]v-sΕ7xC^xWF/N:IÆ P m&SLZ'NHNiڴ<sJ *,=n{_#lC{w-7]_n](X=OEcs"uDz:S3yNF81k1X?{` lV}~޻ۼ}\n۾,[.[E@2@V}׷q^`W_'|RwҥKF1s NY^vermԩS /?re(bY6 a,um 93,S}q㯿=vzp֝waZx6XL4Iz-9%Uzoqf͚I͚5%U2m6(̙#TRҾ}{[CRޜbV'kcܼlYdkٲ~~GM. -(c"͛D70E@ `AL}%]+ Mߍ,ڥ jE ,Mp}y$ @oҲq~)ѣG"G}vy1~@&Ȁ       ĢX|V8&@@@@@@@@@@@@!pG,>Ͳr]h]4^ ˂OPO趋dY@+wnw3Ն˲؋Eltf솢EXE;OBmYVp嶞@"(Sjػ׏rYxˍ.m[n߇z72ٱGFa.7iF0en M}`@NV ҷo_o>}5J:o%}K,y3 "m7!{        k_Ś8ǃ            B.e1x-ȡ].]Dz Vڡy"Ǖ]\{?qѬe.|na, dը!ҡC(eA ;/s̉ h޽{Be˖2tP/uE3U/UN/e>١hѢbczkW gyF}Q{l@ [Xy7G Z_nZDJ ɉ,Y"2e_"vz lǀ )+ Y6,\'t{JƦW`Ǜ/hxrYx+8n>D@  nZl\1cȑ#J/Ogǡmꫯ_WZ?<       $)@P+I"6@@@@@@@@@@@@Ȉhh]$ rv&MB, e\ډ%=ݶ-<|y"G[0"&/һwvŊ~T+GcصkFkf7|E~9xT'UV2boZ 6x7oϗ3菡O_;Dvl̖MKYB}?Z jZX˅   pjQ'5=*_wW0e9- m~a;쳅}vqѦ9Ƕݟ}Y@zE'xB "w[B6mdұcGGz}~긋hMq2uTZi        q :..6F@@@@@@@@@@@H۷8eEN7m9v?YEJX][m[dі[X,\#se],|y?e,w--oc[`˖-wyoL3|5kzZBVJbD,XD }}^_ wyG,eܹseVw F r9l. d菦ײcXzzw^^m׬ ɓe.i?ES Cg@H?N-"ma. N#.\bccrYhˎ;s@ o={F" >\:w,u֕;Sw.9s挽bF}[op         @PVPy@@@@@@@@@@@@ Do bq,,O ;X˂X6vZh-+SF$;感{{^,&""S|c"Tn,JbA%^kirE8ӽp֠Ai)0XdtA5j$&L\1paÆilЯ >|XO]; ,` ?5oW_|ȭ;ϏmEeP׫v*UǶj]|FT6 G.^u2geO V薛yZnþKlZHl=&l\pwnI~`':}ڵCʊ+~!e@@@@@@@@bHCO           dfBq`,+8x Y,cծ-Ҷm趋eN^A FfC(TT.ҥV͟Z̞7+`u,.BLv-4ZyǥERĮΐ_f/g1"_nȡSr L3:[>̚%2m_G![t$RUoؼ9r9sDyGdsMV~uS[Nl++ @Ȕr"ѣ";w- l\n>8m {x kV-8,]qo)= >\xo;(Rhǀ?7ٳ j@@@@@@@@ sO            d<={D,f?]֟27ߡ8D2"cӦy8-E&RNeˢG칳 l`!3j$Ɔd\D;#(7LO?-2hE.=7gi9W`,/{">/X`+rXQ$[6; $%`Q Yh<2e-<mj˖/_#Dƶ _fݲ}^c@ ?>?l0ygZ6ʬ5h@cѳ{+|@IDAT       b3             p{X.ڼ], y1,˪[7~,T)3C O?a! ˒N\4];?U*P 友=zz9.5c [Kw{hV>}Ŵrqu~<(]v۷OfϞ+b /uرWVa@kbsqHxH?";$,78 mYl9sD~[dV9EV j g0]π ,e;Jh8nʕgwg7o(U?[Sަ7+2@1}Q:T(#FF fu]rmG(OIGӦMǀ       ĚAX{F8@@@@@@@@@@@@ "H-6pvܡ8V "m cvL )X̅67֯/[6{^,q"W(U\X8tq3gʎ;S-Z 4h)YlbeʔIݞ~F=YӦMo1yH@bzMro|q >X\k?۾{DI`G,Ygcf,™~+ꫢHf7%KF  @ ߓщ|Eg  Nrj+X~n Gv F턦w.܎%B Ƀ>(wq<~Q֐!C䦛no>d4kLF-{4@@@@@@@@_1a            i-p@(-eѬ͛CG+Wx,cYg*^<=s+Ȳe".['rAg Y(N/vժ"9s1ا9sl.[ti/cyzI,Yb3<[oiXgno12ٳGƎ+1-;<{-|b0ҟ@"rDƏpH^"ډt.r%"YСIۦMl '. Qؠb׊SG  @ XF gJhj쳓[o1>[$&[nަF"\AAJZCnMo@Z폆 N֠>,?{9a@@@@@@@]Zpd            XLiFիE,e- *W.AY6mZ-M;-_^M-xfϟ]ٞ;dYsP4Z5M#bI`Ν2s̸֏?(Zwiժ9қְC L:U^>|t)x"_\69rDL"GYFۄe L '-' 7-r~\cG9جdI7}X֏EX0#b˖?kԪ>RE$;b9[  yT)<l}" mm "\6 nEڲ;w. s=煵qK}^\v'_*g͚EP+=}1       Z{z~z99@@@@@@@@@@@Ȩap,7 F,o+Vǖ-E*U Ų,Đ WY6oϭ6l"=тg6^IcO`^{ƌqY,dC7Mb i+n:k+o=m<z6ݵkOҸq6a9@"W_aUз /Uq6πPM?ZXd E`1 xZh+r@  xZktR9sDm5uv[.jh,5Xf *Z}_ [oU8 oC  d,hڴ̞=;@@@@@@@HKZic!           pڵ"@V*_ׂY&Ҿ}(e,EtC^b1E\m\B]$tP4m[?Y#1cY`Q|q.Yb@JڕNEͮ*)Z˧8ziӦɲeZ-ϡDNJP+Q%V"pŊ7E^]DDnoYD! Y?vڋlcolԷ 5Jd^[}ӰڲVοr dXܹC䜤iv?e-ٲMmk[gHPlT)ަF|#h;Vxyw矗+"ad3>e9e@@@@@@@epl            !,>jUhpB "G3 HVx-TI@ ɔ.Oj6?,bY KX"Yj\sM(Rax.Ӟfmѣ`@k!5.Z9y駥yRp4;&(izH~G;w?5$.mCv-d͚՛n8Wf4iw}nSH%5EOZ $r"7TSkEycltbyX[ojB- mY֦ <  -IJ,qܲVpȗ_G jYb[ͻL! d˖Mk,W^y}ҵkWdC83dyf)^x=ON @@@@@@@җA|q             Y,XOhXpݶ`].;,]G",zC\~$.zܾ-Yvqb8o&[X@kݺu;wn9ꫯs=W6m*yMjw?Ez'dȑr駟Ha(]wlݺuK*UdϞ=eoEd! PK};<1kȨQ"mڈ  ҩSl~Ncϲ6~8x- lhɓE3 ea- lG80  DpOj8plܰ!|_-[}.Khr6򧊤\_X17ntMz%u#4{ml0GuԲaVγ/         @ Ԋ'C@@@@@@@@@@@@#p_%Z&ȚտlJ~PcG?n4sH׮#zK;zTĞ_ EX4aC E칵 $Wȑ#`֌3ŋ5kQ[e˖ҤIə3grwvPr{᳾}#I#/b~ߙ &-њ2E4'ҥHݺ"w)ҽ49~|M)8g+E~mT-F-- lkAM@@,_?&Ⱦ}~Xˢ[n\^č߲MDOqCBE]`˦ʅFmQ\&,fڶm,=z>H^{5)Yd,&ǒKŋJKv   E (IET aV0gŬ)zfϜzfE & * _ 0տ@@@@*Nӊ*Β@@@@@@@@@@@@gIӦ:DɃ;u.'JOЯ_W4Hon ̙#}a,gNN!1rshU 8liرZf͚-ZhM6;,v*={Tzr}uh_1#FjȑGI/?\ >)J:&N.D:3SN>Xr8B>o n[t & rȖɓWd:tu![kۖӢVtx5nܸ{0 4H{.tְrHU.@-VIA@@@@@@@rE \GA@@@@@@@@@@@j@ȧ)50o ]00k]w-|嗯9.aMrl ~.dŲ AYСfOԆ;1f̘7|S^ۅ~i;vU}!pqDžЖnŘZgbM6vp(+I'$tI%$a%?|>ɐgl9dkD`O2B6D   @ 4hb9 `4cF-CyE<gRCFIS=w!dˁ_h֬m:#B z?R^{[5^͒/(+       @  P           I_O>vO?o-{$;ܭWOj^YrhQGI]$Y͛zz=ztAc']#<2ޮJx'W/b^vB@,k6L\sMui.(|$a[=zu.ic4`k„$h롇OZe$d+%/U!d0# T@:R˖ɰz/aZ_~Ngɭ/$xuv oA hni}ݧ-ܲ|33U ̙3GSNUǎs4 @@@@@@@jZfM@@@@@@@@@@@ wIXVyWC\_0 OimjD?ЁgOϜo<}_ըQ B[ݺu:38#l}+Z%3| >\6t%Z'PZY(&ࠀNE;Nr1HRao +'Jロ >+]}oRI0kx2>3 T@zRVPҿV6Ol" oR^~e|4h.Bp E'Q^ t-wj+Gc@@@@@@@4n             P43$+gIigXI={J;c.[fi//H!(xG'aYkUWP#% L2 k9C܌!ss@@ WKQ۶6|V}uGɭV' ۚ7O3ǎMRݻkȐ!1hѐۺuAy&ڇ/ D@@@@@@@Uk^jV@@@@@@@@@@@p_|!M \'˪SGZy,%tp;/Ұ[wB+ݬ -r?C0;ZGC5k;>cVѰah"zH|~?tұLM&Y(t㍥})|ܶԸq.mZ ?al:Lt"OI͛emԵt 7W%Y:"oQ+h!bWgyf Z'z\Կ%%5\Svygu9x̙yyx*Q`}:v- x92 yE֊}h!]s:9{FH:La G˦n" .X#gf'Jtǥ.~MZz丯gOiuK~/)?;3f~{_O>}dp?k9J       E@J           d 8i$4 ó3f$3ԩ#,wJc4e~zC㬊yXcLfY\V^Y- cpHC.вe2>;!";iۺӧE̙W_} @_ׯ!m_ wzQ`1Rf͚j~(A!G2j~u%LӋ-RIذR8 '2 c-߶i-  @j%yfҸqIo;91c@z|-,z) 2D #<-2_WֵCϴπnݺnYa@@@@@@@-r5           T@ȋQ5eJaho4ڵK܁СZ~qf~رv1{,\GfN&ON³ޓMV[M5 8/|o^}- Lz z-z0vǰ7p C'/2v u]qM7{͛7RcԨQ!dq Vˡr(^`饥'?\^ZÊg+N xp~l9dV8fIBkЧO2%;@@ ꇞ}uK=,lMix_~I6D\OqGƒ><0vu|ZZVv߃ nݺ:        us@@@@@@@@@@@W`,w:.P: i͒7Z*s`⋓Z nI!pF$4)Zǥ+>Zn;K$Lг{k7/EF `G;Or'={JMJk![gH:lu*BG']~@7.9L+_7Yy~:uj[DD Kov^=zPv|O=]wݰ]_^!_n6իWO,|;Ӝ9sblY<,SѰcv2s̸{WJe]8@ĔC=T8a%T6e;|ez\pAACqLK/TrKL\W^f|mYdl96^~km矯O>$U:LPBӦu3FsNqU/nl{NsL̮u? u=3|0Jiud+eK8\캲-Iʳ>P7(k~U^zIÇWΝbq^q}AUw$or qw+싓ce_?vI8rUS{N+v^]e  "t%ђwVןJ瞛СKӧ/o!E;C 7\}aСCv(      5VgN.\0ys<.hj۶mn%\BAuk           wI&sO齳6Hj2\=hݥnH:W_sͤƏ~Y$@+쳥}IBVYl_|E͞=;tBZkbp˴i aAE%zIK/gtI&o$~pqBЋBЋԬ٢:6tS9cDHj.l:-[d}Y i;Cb J+;u0 ;?L8Q]w-z{E?10o߾1SHz'v>3x}_eVжO>YݻwWo^{m }vؙ!SY;d/xw b^Wq͝;7FT# ɐ"J:'d./kT|]GYm*疴N9̮67Qz{{UWŎ N=~Xv{:#6z@W\;n/YOeו%oIڶ(s kiذާeZ8Hu~Rg'Lq89|N9/~*NCv$qC2lkT)=PF>Q  hA~H~Yǟ7/ \]}upܚ+C[:tjv#     @H /kMkΥI8YpAo) i(            Pc/)S!dV_jP!@QZ}~I_eVF 6l"IyU"̏I!d''!jn;Z]k-L:([7kW1+ypaavb nݺ̅9!*?P/mvxN!IۚCp>|M _n ?|=1tkرb;jԨQ=OY̙3CHᆚzEhQ b^뮻_WUM"y?\udsGڣG[o~m]pjРAYϲ)m|港ZYgr)nr{x](dY4eQ]G}47|s =Y6{ڽ[4OKI~ui&NO?Oim)m\AYw25eeOǥՕmIqw]]yP~:HjX!d2eKvT 3ޫkNSC#δZlY "OBBAZ?,f啓>}0h9<| m[veÞWO?]m]d>Μ x ,; &g97K-T #կ_xI&ojJm4uPT6LԩGz%qI?#>w^f|2OYӔ6>s;pșP>izu;io3ǥy|Y{$u^q{t5㏏!G(~O[vUϒQV/mZ_iuyyYߢֵ8wsHcV7sSEN;-g=-ŲrbjFґ| .8+dӯk+ӹra,LE@(|\!dS+| IwߝkmtQ WgUMugjܹ:]v٥rQ`߮(      5G&: V*Ws[)  A@-6@@@@@@@@@@@*X૯eYqd:vXCaw > s80`WZwάz!0{䠬'3VX! Skó7_U,Co ,+tWu[n%vmR{=Z/r YveC'cZzR &.z|NqquCr!a*mYƍSvK>zaZrңF1Ha?dȐΟ]_|E:`_hUW]u Kk[渍BmݦÇk}-h!r]w3t:K~:H%{dƟg{ꩧ\k;]&tse(sV<~ޯ׼yggmdiɞ?s\iKq[l3<;Gƕw֑W~xK/?l.HK/t.sZ?Qz}źҶd(#{ytQRYBx# *n?pJk!u=tTWxôlr;/>oV~@J+T0C z?$;z8[O޶]zO'tR|9=/c;9{}vaÛ8pm j+Wˣ>*߄[szY>mH Y;'[cH*͚(18\a&\B@@E:d:i睥N$rT.)`sB^ϥіW@@@@@@ o|w߭_Z7lxs/5lذ":|~OEƗt\Iy%hSN9%;s]4is=7\;!krjeO?O sv_}><))kwst}~3<e` Α;蠃&C><.ouUϞ=Os|U9D /s[OvZeg- @~ F@@@@@@@@@@モBYi`B뱸Oy!dC0ArߏW] YEp;wtMZ{,,pi.+ }o[j@!p* ,gmвp}L=曱{${LKqz饗b‘G~[XAlK*bq Ea=z:(K.t1t'z!9bm-RÍ7/uK  8x}q*ooA:{O"t_j8P8snMBQUۤÁ7s-}vdjekffG=|v}<餓4Kq3dב1H~m>Ng!vô\w!qE3uę2;ǝU:U: 9wpꩧ;AH;?Hɬ<Η}YOtݳ~\ZˮǏZfZ/"o7 R Z׮]c@?Ғ]WqkZiӦ|0-w+5k<>>?Y2=D},tgʜ's;5dم3ЯE褢`i@7/qrHó<=CrM7i6Ϯ84<;p8@-wQC=x6T^ziܸq{eH{awyg}?~Մ}vWF6CVZ@ч;ppTj|T_}%rзJؿ%Cp-߆Lp^=k ;+BlPYi5KE@GC$8:sXa/;diPR}l⭷:䎀       @ k9{nE]^{M<|>~ݻuVùt.iVprؓO>ѣs|NiYȕv8묳4z<̜, .wF?|XށYV[M hHT#wO)^یò<8exi$)\֒N:ΝPkg9kV7pC ZLPjFx92Zps ܪ.?p?2%\@IDAT{v(/uF\np[~oCa9r>bgp?8Xǁ-Ta,V8PiӦ1Pe;/ )n|Yy:]H/>x!|r cex}Yz惼bʀy)[vP8: JÆ ˚r;܉u]/\{oOt5I YfG!U_-q^`BokwӢo'up{8=S3fX*6E:+쓒ЧF/wOpБl@-3:SZ؝c8I~?Su_ _\t<6?=G܁4'7{Fi?na<~ٳJo; q~m{*-s̉m駟ҧr6|udpCCCg*[!0I_^NfY5 2zR@@<pf/S۶+c1Jn$>vض`E+^A|MWL      .`o\:-\dZ9P+-ŝ|N|<ȕt_f4tP|ͱ-v =_r%i~9+-D_spg?9Sp5,yi"WxkF@@@@@@@@@@@Q sf9<ˡY9 aGk)mB@rS'N0E\l܁Zt84Cыe,oK!/Dk-uS{~x)WCհa4eʔ^xpJ~ |=ztA!B6z_z[nTgEh       @. BIϣK[O e2?RsewMaχ9Ѿࢋ.R>}ꫯӥ6vm1{コk^{_Yƕ @^ /F@@@@@@@@@@(N .J|u̱͛ Ifu 5jT\390 4"]t1h%.<1$k׏F8C9$.kOreWSabO^ ۷/v\YO"C DŽNA9r ZZuw(`U_~e!▿6!R|OcYna qօ^9Vn&F84;jI;pHg$bq;ꩧboqx/ãLLZ5K/m*l'JF,cy!U'UV[mxoVJRYqLםZ*+.Xpܹ1+؝qǞa:sK/ꫯC/z*nւ)Wo!\li]wǺ~M3!O>Qv ;νuި|q69,>yq8uפ `![!#<[oX/ @@"еk=lH~cNRұc;q'\-bpG P+R@@@@@apV(>,hgqyǷ$ȭ9Ͷ~{zy{lAs9}uqw_Z [&!@I;%           *bQȬ+RHl:!vw}1 K J;}̙CB9ѸR׮iF>jң6d&!@oiv[H` ).K[qS{ AJ7CԴΥ^Z҄tbnsZAp83ڶm:(9f/F?/xWz!mf uSnr5q-(gyW:}XfЪUx~}/ˡEٳg6qky_E-k.G}t|ʡC**gK7w|n̙3G ,(uuJ^ϟ;p{ޡ-1. r{ -lh#>oI&mS #[:c;:\w)͆o:謬,l7߄};9Ձ[e#8B_u |7$za~zW^ao?[ @%M7ª5LK6,m@@ &JBR3WA%O/_|J^՗G`忒q=      uԏ ,>h4Hs_*9s& 9%^[p-kA'hjٲ .y>*U Y$S !A\|mN:tGV$AYx 6L?8 /J8 (2*]&qp˨Q/AÇNv isH0a;C~-v$RKy,ƍ'_8d&8x幐!5‡/Tw'|4}\Νi;吙YwO(-o!3޷8rxx8t1En煃E{zʷ~xiq}wu >'%!ms\)nnWO]8@-զi{:ǎ^!!biq^$ .H'Y"3v0yOWDTaI:"$^yN.mvu(ĉo܉|v)mUOTtGI(p{,'S>:묳qu8m+裏>cw_s=q{s{Gcn~9#z<%Oz Wq뫯Z$4?^nusc[V7D(wѢEve=qpnj.:c5+vzud}sDZqEcLoG iIhvV(E u ? x  O |Un.(;vѣ[ZO±w{}li^ pˡZ^      <9r>W1<8_s\vݻkvyxޙgǍ92FSO9xuQ%#*hСes}ې曫K.pXFkcؗ򹉾 \KiO2%uu%g' @^ 2F^G@@@@@@@@j|>;o%VRﯵZ+vYyKf@@*wAYYS*\ܤ:!nf98+ pp_|1vY)q!HhB .K³+PbuXwtV[骫ZZ2*zH5H( kרk}^zi!V4i$ !puŠwD!F`?P`j۶m|5OewG{G _rY u Çj3'.AqXEMUeP/СCAfՙ;Zcn玧7l33FR 袋t)İnݺ-*wyrפIb ]Q0=qbʳfϓ/_{Mxc)' [*5{FӦM Gu./jq__Sk@@,e6MC_~}|!%;Sqe.M. ك9S!0\[" 9 $o{?RXXU@@`B&p |f_jw o]ym1L-)'9c!i'גڳdw9b94RW9KD@@@@Xrv6o0"oN81\Zڵ[hק~6m,5Kzϻ 4(hWy}#>)N>=s˒g]@1C 2ˬȚk~]k*           U!S X%F?ЩzaV6+IpV6)s(J <6wh+ڸqRgϒ֭bq%q]Fl;au}W#/VJA~Y/ux_oVSrF;%-n'ܣzx G?S{W[y5j$Rq܊ % Pl_qa2{ߡ3)O)2;vXJ!a riy;pPkLVyӸɝ뀹){VZq0diyug{͞'_H*BTz!h*u5e饗V=Jˮ_~´\ô\V]ux[h->zks_l '}4aBi2l>ygnIq;ի _?p@-1͟=-~_4I/3*3gt|}_^uw W\b?{}OUGmiH"( ;]QG%[uUWy~Tݺ ~Mxh]mՊ>#@@ |Q-[O?6H첋zp|uUpVXwl       @n ,X0֞YWK\r%噔i@rT@}ah           PsH|P,SH9rߊmJ]*t/}t͚UwY~E hB[neEVYl]gKᆱY,'Jhs:K[OV ;Vc jעꫂQFiҤI`ׯp׷o_ʵ &cmg̘]w5"PՋ#Gg!cI03 6i$i-~ 9k![zJ 8ϟ;l_ Z'nݒW+*㏓WkBDAVb@@2N *y'o:K{nW:`n⋫`,"[`#P+      @ bpkA@bԪXOjC@@@@@@@@@@NiXo'ONrq԰BIXHեԩԸqޭ. ^ j1*}oM~;u;G6,=€=m>WA#coiIlƴiK/hM )Ûgxl:b"+*S`aO*sQVwfVCP1xt{4bĈ0|9 P sN: 07m*fRR^RΓ  @qSz'46h#m6Pc[jK/TÆ ;% __|Q#׍B@@@@@j@׮[Y95eX@R҅Mx@@@@@@@@@@04) m7Ν,_tp ITJ}yaxC4fޚot1BC Q֭+mYT\T`F;{O@@@@@@@bbp          ,feh}]R'J$GxW|3}i\aCi,o]jҤx,/_/zWhn:\Y}?9@kCSNmbK!/\wuWޭ;aCen$'Щå wMµuiҬYI+c&![! 䵀y?E)mvipt&O\'tns1zGeUv ?/A ̊       ,ZKnH            @̞g94k„|Tr^4!Z 9,*L 3<+ 7N3Gj(鄳W/i,o T%0++h;VS6mbp֕W^o\sެ YO־:K;v+ 墱TRKIxCgRs@ 8vu?L!d5p.l![F@@"#mi!nGQy*k ꪫV[m՞fR,LМF@u|MA@@@@@@@A@j@g           P~Mz=Yç&.< 4( rp82>;<Zh33{ɗ8l0㎚:ub\;_.,ܚ ƕ7o^]I @@;85PRf)CJ*4HҤ(H4x TT*d.SB%"y_;s?s^{S     o D@@@@@@@@@@H `˗EaxW`aDeD6gU"w\Z@=Y>˖eO>uqs{\8\`5kV\ٳeJ*僳 +Wva.MP_|EnZڷj*۷jQ1~)Jd^gϞPH- ' !]tQ{$h:<vI#YѤIk޽RAֹ]Hyƺ  )0gNpQ^ʷҪU+tذa SXCBԻwoǝ`(P 5@GJNNE,C@@@@@@@",@VA@@@@@@@@@@2-ҢE³,o[YSN 6`blٌvZ9֮@=o)gNF n][ >d{9M6iƌqZsVդIuhUX1r&@ҥK|0- K9dRg@7)R$l"s@\ (P- @ ~5jLټY \Oyyda B@\>m-Oow4X=ބ =++vJQ=@@@@@@@HZ)           !~MZ0,8/_ ]`Ut*Uy3DiD&ضMYsH+WJenƣs ӲP- $O௿YӧOԩSۧJ*=zy2eW1k#(0foiݻZ,oĈzgyinذp?@# wAPV@ # /nL֮&OSCHIvOi[҆ U6<*zk׮4h;O͛'뵩SO>z!~gaV`lF@@@@@@@)@V|k@@@@@@@@@@Rh҃, @"EfDvpNtHn߳l٢xi:i,PTp?iY \k$nElϗ B _@@|,G#qꩧnݺz72DY޽SOiذaɝ$Q"* C#*C@@@@@@@ P+ F@@@@@@@@@@زE -/^,%Uf]rI0ӧl5s l$͝g`~3gV `BCx Ā…RÆݙڇ :"[1VX1uՇjCY8#@#        Zig͖@@@@@@@@@@@q 4~ B4nMY3P8;54Y6`ҥAhgٴdI0uٲAhV߾7 $_`/״i5k(O<[:uƍA+o޼@RQiӦ|anV}'~`}vqHe_~,0O>ٴsÆ . 4g;m!@J,z0ɍXɖE,@cfԿdS[+=\.SYMEA@%nԪV~_yCk 2D|ڴisJHe        /i-@@@@@@@@@@+VH_fPʔ ڷU\&cU` 4k֬`>gN0pytEZJkS8Q-w^-taӵ~zϟ_ 6TϞ=}V:u|KT,GL!PB}7nnf\R jȑCztu@"Ek8D:]3 *Ӻ5kC @ .4_~ µ&Lzk5o.wTh@U  !N>[ʒ%+V;8_#F0ZrZn'x@Ⱦ|MQ        pDH           }<<<lPSO B 5j0oJym>_~)ҥ-wc3^=iР`^"?Ԑivڥsh͜9S7ovUFԷo_Uuٲe˴N8D\~AO=={hq;f_z%;GN 1 ÜJ.$UXTc ^@t ttdv]81zuPOV `Bח *}  1}t ?ҥ;vT.]~z7Ev9-X@5k֌D@-0@@@@@@@@MO}nv_.@IDAT          @`<4~eonr*WB.@xqγQ+m\ρYjזZlţv7i8,'e˖/pܗlڴi~={vءҥKG}8 c ;TNtwhĈ>,p%^vZM0A^@gĎ]dm;/{=6i4eJKvOi[*ER@HX`"iÆOx-K\ gN5JݻwOYezuSwBcyVj_vQGA@@@@@@@I@tg          Dg@}۷Ksgyt5RZR*rEXX % ;Ay͚A\,;@rVXk >E֭SbŒr?3fhwI]RBչsg??䓓]7/@UTRz뭷ԣGxz õ^~e '`V/5kje@  .4 k,O/%)#5olټHtj,E@cs}}#5q./!%Pnw߭`뙮,Yd}f@@@@@@@@ Z          @ ³ ~+)+U.թ#ugqJ9ü!{J6}\Ozuϭh~{0/[63K۷O7omۦ;vGqݗ.KvZi|"O?gz~~,P@L.|7z饗1wӦM~z-Z0/ln}tr 2lo!dW@@@@@@@ZW}h8          At87w7ːQRÆDQZRJ;0_db]JAY'BmAxpl-[?(?,6l}d[Gb¹tXU?+\fpmP-Юs 9Z$-  Wpq!aK('۟\,Y.]h>jP֯ {^pEӦMu\@ߴ HK?EQ~4rHw>W7M֗Z_u%le5}硏/XC-'~_{ah֯-'N^wZ s/ 1%Ksc}ZO˖-ӊ+/kEvl].R-Yo ϲAxܰ-:Î61&,v +SNr?6tdAA XF.?ҤIҫJRAl.R DV~sq={hmMw|@ϧݾ}{jE P!PA@@@@@@@c Px          -`c, Z@n`kjזw槟NxVtz30@%Br㭻GϖTAbo#GaH֬Y-B֮]{X poA ax iQzj\Д fi' e36Pd-{lovl(Y@`@XHHRTڍDnO8x>0|ҲX#<J߇(p0FSwB,gKKոqcPS@(`}ƪUd}ի}js_OBi◂ ¤ ~\r6Y0M=>ΥZ`VeZY84h˂ Lx.Nwװߴ2>Ӝo(c]-;Ҋ/^xSɥkԬY3/_އ]G&,+4@c ۲c;-9m?? ێ\ҷy=sS Lu`.ƍ o索UkLA@tG%;GO݆9w۶mog@-nݺ@3L]LP{[2."       04 @@@@@@@@@@XpckZ6ˇVf]sM0\YJ1c}˧ԩrK3fHeY`gzk0/[6Bj,+Ho-D& [YSTn],Y҇UX`E8+V,&fCJ,$%u P ' T mValSPpI'O>هt>u ;waYu[xX-~ڵ.W_e;[PO?U w ו+Wd9]aT&M|j}Mv\B)c!XýBc[ag8@2 mb.gZO d}e8UX@;wԔ)S4vXj: ƪY?ի ޮ]ڶR%'sa;H-&vW^y@Ĺ]# ԲK(        @z ^l@@@@@@@@@@T Kn!\[  rSOB TiAXoF ԩ^}j۶m-gQR e˖ԗ        q,Z@@@@@@@@L"Ю];=Z=nڴlg}6@@ Vv- ³ /w."*fq} U +b_@ִiҟJ'5h 5iL|2m0EK?}-믿!Z;w dx)sʕ+˦J*eIT %}:ekCd0\ !f Y%Ι3LJ+qm%ѺbTZ5?j޼yyi{?҂l>tز. ز~xS  45rH <_[1s>׎Xw?\Ç{d-XO>PB,2@XV0A?>v-㧢E3Lsi Q-0id}˕vװi+vŮ3J|i̘1IQَ7H"8q;H܇hks=j8S\4'g     p?/~_@eT I%JH_|?<{          @wn͞grtT@uK=$7Xt1H M"7yPtr3gJ3h̙1c;v -ܡ~馛|Ѓ}ʕ+F?-Vr,0˂?l_l.\?OF҆ 8Gʒ%,h!hc>h$E<@2:w1uT?}hǹR.{t;)Vd2[.+SljѢE-l@pf͚!CȖp窝NZ6m5k`Ӹ .`Cինm[>ҋcd͚U{}Y 6LO?6mh:3b\C }lNB]>7NjNC]$]x5i" U|څiK9S4bĈ ɝp @… G[n߻wvlҭ l@@@@@@@Ȳ@@@@@@@@@ڵkѣG'8՘~aT"X i/vW_~3TTn0Ьgv̦;+,D%59G.J. 5;).e̦iӦ'gVZ7 q R]v@ n>}wүô+EPںu/m޼9n9=Ǿ@ ر/pa }ߺxb߯Z(eFT^=߿-[6HjjZ]Yi!m\"lƍռysTRFj6mA {{ݻwW޽U\lcƌу>('ux@%Kl/&id~*YsZ{U"<6 @ Ԫ%;\n6z饗oe/6 ;g|zڊOh[=5J cҥ|tLXץ˗/͊v."ԫW/;5k,fA4 ,p~r#ZX[n^Lh}ڏ1(K裏4vX͘1C{q5ԲeK ۷*Uy DC9L kܹ֬J=#{k+> @ Ulr_C4qbn_?p- :|Pk 5# moZ}O;4og@-SյkWo3 N{"Z1&        ĀZ1&           Gϗf:0-Tj0daC:Ʒe,u\N5ihQP \Gfyf4bMrX`!De AA (PgY+V?p8={vաC`3e7v!c\,X )-@Z gv~>3:vX{ܸrʥm۪K.jܸs#SHE,ܦOhmɘھW6mԭ[7U^]ڊd'2`/\k}.A}_@V[ T@ L o4e׿Pk}ȑ#C []>X+C4*{nb-       Bzɳ]@@@@@@@@@@Yg#,fXʛ7&v$93@}m ʕΓ|PjTʟ?$a7ı_~YG_|>T´lv (`5={ӦM|Xȑ#uW(_|ԩ:R#) @Ne3f* : F ,0Zlz-s9Pwz)ZMSbE;w̙3ugʮ~ع,ާO,^X$ /6@eӽĉkI}JJ=˅K͛KEA@ 3 Xק[Np iٲe5$ޖ@x.yje䴝u@@@@@@@@ vή'          mѣJ^f݀lAPᒅl]wI GJoZlϖ *V^}5\]Nքi6w`2dN?tvZ+o) "L+RPIo c?C=.mZjjذF{w3>DiADիWWfʹyfYիOofh~B|Y۷דO>O(٠īV (.u MoaBeʔQ~\ޥ.L7 |3tbXpº馛4g7X7RWQCU8f k a}:Sս{wwD˖-ӧ~Y : m{ʕ6lΝ?]tъ+mwhodZ6m'D;OڿtF djՒf֭̐ 5*TBkԐN8AzﲴeK ck V`x'M_=?PU-[Զm4eʔʼnҭs{@@@@@@@@@ N          T`iL엎?^.DM7Oj(Սի >;Jy=i!}d,~TTt k|mѣrSNIVE6vڥ>~W 4He˖DHKU.BQOq#F@!cA N.G>҂q),@ X \{lZK=twR>b-N]k.H 6ԨQ+W4oC,osZ#G}˻ʾ!.YW^)Zp|V}tRѢKO?-SL2; ƍ;Oʖ-}1ڵk[kmɁv?~լYXʣ Z9rHKX@@@@@@@Z'B@@@@@@@@@@h! Ų`% z` 6mfϖz*hxwic(`c6Z͛K}&m M,}tRV+)STJW˖-7ܹ߬s. ȌEQeA8]tq}7ŋgF ɝl_s5j֬:,-_\? =pbT|1k,=~ܝSH={tWD>LAΓsC }Q2_ ^Y K0 w'r) D2Ϙ!]xa7dɒjҤyoLX-aRv{ĵfRX@@@@@@@RC95T@@@@@@@@@@ C +-\(=ԩtIRRv5kJÆ /j@ʕ+C A Q5k^:v?^UKCJWK}YV޼VWعsz) ?ЍPiAZ7tgϞm@ !|i][څl}V~0Rz$rN{nJ 4P޼y5iҤ4Zlm@z?@@@@@@@U k6v#           oYP"҅ H &gc/Z$m  hLPy ,[&=\@yO> ,L΍ KQCʒ%0c“,#qB4lFJ ۷OVk+Vrd? w}nm7v ?ZkkN|vi޼y}֭[k @ 3FW^y _,P(ʖ-[tRhJJqq+WtAb.^o]}M˾#~5-U9ܹsw@Q]?,XP}Dg̘\YGQݺuiӦHTWG!~}^_ .iK|}NkuTԵ4j?ѿ @Xzhՙ3gj͚5*Q|CWIa=v$)hѢj޼y睤&̙ӇY/%yaV\BF@@@@@@@"(@V1 @@@@@@@@@@ ϗ~Zr:Bk,@΍ѯ?,tץo,hˍLA *\~lP=ON=UWl<5Sdf.;g[H[8#o/+&s4x\jFi5@Ȍ[ʕ=/1rhJҥeו .Ԝ9sY+?ד>~xBqR(7n, $O=dɢٳ'       DP!"IU          ؼY.F_:'|aÆKX]vuA=a Ⱦm $_U_iXRj;t萬c|ȑz뭷GJ! \۰a&:]ӥ?:^o[9餓EAӦMw .) )V,uti:@=2JyD: BqҎD }&tF&ٳGT'f=.Q+V,nyz<D /PW\qߌM6.@-_\ i,Z蠦~N5iD-[F m;>%y΍2m!)ZR5F$g[ЩS'O={fYd JH~aﯕkVv|m? lвw^;ֿu֮r1k{}ntm۶={e%9uiJ*ӧt ,If{ `=:czJ ?ر?n(D;d[ٳg2|\p~  鴾=zhfN[=o?vrʑ3sL[;&+[G럏TR.rٶڵkZO>ۖY8X#FK/NoOnjZh7x#3I{qFsPN>lٲſȝd[l ͝;7iGx6805S] Lw.z T>8.u,lj+Vx9{l}KGkT;X(?v>")w\.I&3Ljx#Î 6<2ݟvq;U; [ؖ;usswp+%sa )S^.q.]zX}0k9r׶vn2|5? ꦛnRf _ؼ`\0hr5;7x6mZz5"@:Xj}RŊacڵ}wvw-'+]t%ZUYjW) W5kW-\ m\dߞcSO=ױ* [o~XSΝ};-TTm-&9%[]YYɓGj}2ۗO>ٚge^zǬ=-myX s$対ʻ<9,^sזPQ /_>Nd-llS#OJ@y.MwժUIYu2V=}Ot|@_ ﯝ[xax2e,dծh:$łeZ{[GR7ݻw&5'nѸ epr \T5\`\HI?{ 7i֞ *hȐ!5UV*T_~QuǎqaYv/[n==j{ݛ>sFw %o޼V-m9sFKsi'       ĨO6)          ]C]=&7T`6~r(Knu7rK%KM -`  gqn?=D&gY.H} [pSz4, ,˂XȾ}6\ݻ7n`L g` +s &>aG~ Bl* KP/}Iz؀6Xg˖-}8ǝwީ :,B,l[ )r&Nt˖[f'>B?,ł_,\ h\l^Ws&P!d8 Yf KWQF%[oC`lMٱc-Ç/ٲeB 0.iL cXТnٲǂl=\+GW?^ s+fj۴b&a@m0:ĝ'7܂$?B(K_7N_,;dz©* ;bYR;?eUϥ}(?OX,+ۧO ɟڹ]4n؟7۹heӦMZx?~~YRYl gm>i7R5{( @(n{w_vxpȝʅ˅vJ~*h9 &ಪgܽ,w9]/x[V|yСC*v-l.\Xgua}y9s=Da%GjCDrP.Z֭mۦwy稻f-pޣ/Rr "%\x9rdJk {8+#P+\v @@@@@@@(8'v"         - Vd%,U =ܠKFI*"e˖6c+ jxRR#H%KJ*܀RR:b#Գݻw'e_^y)) ɰ?ãn\r>l̙S~0ˣVْy`+ynhlʟ~I [K,Ε i+fp%xM:aCKteݺu=ٳg[ `j!aHXSn]8ֹXLe;@R@ Xp Pn>*%+յkWXB n'K.}w9Z{Zn-ж\BÍ7_hb۶裏~ڰa?w JR}ebDzոqc?L4zIiCSq]9RzRbŊH6?ljv `%|.lg ı֎  ;._=S`gw tWP-X/谿mk _رc9;t%Ra=d Nmvaӎ;{)G>wndr+mPqs);фJj!mi}^jǞݱ8NVf͡x%k}hv\ ގk'|r$.$X_/w&0-}Q}lY&-7w5Ȱ IF5 ԲٵW_}us;?z݂SX7$gȮ,YYI"PO       d2»@@@@@@@@@@@(ؿ_;,2Cz~9X6~q4SR۶ sn<~Y#U.+'u 3HW߃ D_nGg~z쩻 rF9Nb!~J(Ұa|X|p}裏+/ߺuﷃz */_>5;-ܫK[esI(ժUkM8-JNIѴp ;,^ełMm}E@- Qo˴iJ mҤN?t N(޽[Q֊S;9rdd*La-w&P+v_$wIk"        T         Ă̝+ZU^ n5o/?_ʟ?}@p {S (쳥wߕ6 ^ƌܸ.@׳$XbjӦmۖn},JհaÃ3vXB؀*Uҵ^뗅!wF. h?Yrn~?q,|0`x ٠'txHl[\s1c駟4|p͞=ۿsҟXs?Y+5Ϸ`7BW\"7j͚52a+}v>3XB=\B~] ~Y-|P=gm^).\ё?+ Q→u~FӸ lQeOYv~z%+c /ז?_Yْ֭]6Z-f*WB nmz|?d`|С =-|,+7xc؇l%N ,f0[B>f=$a6  P;e0dwBo}\2.b׮]~[|駲JӺg]vر pI 4uv H8rn9\ϲ0X]cY^ܮh^L<ٟ#ˉ}n4m{Ò} _VsW ϟQ@ s X`A07<#i7o^޲e,oCs mA{\"]XH]kLs7,#Э[7 À]|7իósrۦ-[6)U$k^zq@ɒv*}>i-w(l u#d$3wVTۇR)*;Vln?K&X"&D*wj,gs8࡟ZήS̚9>h]e_?UuqeѣGga>lɹСCmC[oa] ai@BXG@@@@@@@[VcŽl        '"ÇGzsV5v1N @5Kizu";*;!Gs5Foo⮻ߗZGrB5mZc8pmݖ[U3ϟ8ܺv횅>wQJxn6B97vwЅ ru- Xe|'jذa]~ZnRZgi4o|y;Тceܮ1&N!\a[mu5GEN &9aZeyV7T?;# Y9Ctu׭TXbyl>:S0p!b-=\yclqy{>u|^:͜93_\:5zwyqת,ke@!_ktMujek O_? skyO8orfo5庐ٌ32"a//3?@`Ǝ|=?@V9`"84]\B@pwhlQﯺwnj>XTj_y|?K/ͮT KN_xh/図D@@@@@?/_Xy1@:U"e=          e L.=tn|RQXM"^ яҴKϣi}Bh#EA{imuٮ kNONΊhuEUJȁֽ{_5Z[Wx>N[N;uaej=7lcOo߾Eô~hĈ%ϕu{--tSN%]ZNq\-F:u^"ߕmkY+pꩧ?s9f|@ <@!7|sV6nܸDpE%oƪKۖ+://k_2U6OY6Z݆^2ゲqu1CZ1rqSN9E]v y0Yޏ{P= `e+-Z?^6mڬ説N?ty,_b@_RpNP+Ӓõ7ؠ<<@@\^.u<oYvmW-VG-*O]_h|饗eG?ҩc9ܗ]~Px5f˽hVYVӦMW_u;\9<#1 !@̘1{!Yʃ9sJy5P6mԮ];o> Fu]~NTw@LnDguZTbҶUqAɏԍ|PrƏ4B/y|OnPD`u9֡Z~Zu<:\!Uk>A]WKMR\ת[z!%裒/,oH걫[lV /0[o>w@-_{rL޽JoKM{_WMe{@@@@@@@@`Z1'^         T;88+) +BFR8%-fI< ( (M.mu]<}o&6pOoBz),S'}4h7.-;Z_z]uU:#WrI'TpsȕW^|Q7%VkkVzZj/8 +`0eTWquqiޗ_^8m۶$(k7V߾}yx7,/\? . ;t駫k׮%*0W\1cƨY;c<_ܣNqjpz~tc\Y; }7PϞMջw@ABTzww8C &i##h:uEL  P N;~饒f`-إEnڨY:tb %0jԫWŲft 'Ƚ:rK>}v~)268hG}TZ@qG\$v3.s>?aYKNLYMH;K](E<@+2@ׯ&1_3-ܢ!CsO{Y j֬ي*CB\n7߬^x!B 7 4(AQ}l         <|ߵZ:Zk"`6UxT!Z/~nP/(VqƼJ&O,?അ 90aY+mm?*:wj xY'u7?AbrKq9s. 6, ohԨ<{&ֱ_|ŏ}Q/P`u!  4fi&+x\*.r|GdHӟ>8֡wjX5 8o?~B]vg];o)൉;e4lLY[k;s"HZKS6ӫ6P˖.}Q`NjMӳЭ6mUKݺ5PϞM#`6ڨUs*cUVfY'01~F1@qЍDު) ]`K ̚3gNɲ\s,XǠ(fk׮~}ԩSw]uUEΎ]v7 G: G"~ax V-m֊\{(kLƌ[4nCž>qTQ |#^       /@V@@@@@@@@@@LehsL n;E!2΃(ٳOZ+M(.z®[o-BeX,9(w:4ϻ9[#s䶃"$B2 忍7QGieuwꤓNW_}7\}ͺC@X(mXϙ3g'ԃ>qƩyׯ*9.0o<}'Y CJ?0 rCӲe˒pݻg!SyX:묓=vuJ\u20N;-/ 6, ˳J~c=ԢE2~W^yEwZwT[ickG^/mgΜ;% zY%[So4K/Э6ENM#tkNn}u֩YV^-Եk#,m<^><2d;,nR޽+{U jys~;]|q]akq$_Srkx)yd.x}ö"U+0jlaqPbc􁥊ZHo|߭+@@@@@@@@b놊]sG@@@@@@@@@j@YZˊ,U!]w)GIK; {n ѢuhUPAwfEF&[O~4u+,裏>YˆL|%Dhb8l]vE;f5jԨ >IYS>3=sY?1cdNvk}ԩSSnVJǁtH֒?A խ[WڵuC v<0}T6`YC#+B>[iרoO](z+=''>hNSN_WwV4͎Y_̙5v\oB>hN[rƢjZ_G֌ݚ֭Qǎ=je!\k,m<^kg}'F8ʖoYjtm[={V-`@]^~Yޞf͚EYoUj9h Z>@@@@@@@@  P=         \ rV5׈-G`ISVhEKGH}J_( .l;_Y_~~[Q`_7.Mܚ6UX~i-f7n&Mb^xZ&hB*n!k޼yz/^г>axd߯7X}yaD0FrZ*Ax\LX~bt`^ՓCvۭvX۶mǗ؍3GѣO1t]wfwCt饗fmYZcC,DC`y˟xSOl4i}1]=7yIFyoF"ꁿ{f0{̌Ŝ,tkujEVk k~RY/ *m~;;|p?O<,lk-X BBx ?ЯkxLC@QG#=4rtU隟_~{@U5J`,Ǫ:k:S5g5lذJV|}|o+@@@@@@@@Ԫxc         5D㏥[ЬcQS( UClJ(h^]r~Β+ \p[o曋nGv.޵()jz5^ޮ];qYO6k,tM2dHv4hgϞźl P knt=[]&0AKr˚k*0C@F x9P\w}9IUlZ+W_x+ɼ@@@@@@@ZCa@@@@@@@@@@0LY wߕKEݏ:JuW d-+[ r Sĉ"BҕWJ;B*{j>LxwVNCQ`<CwXiUm6+&n$pҋ/!=s4w,ao,kɏQr>7.+@}b\FLƍ 6f x[m6pCB~zT SbdtHV~ۡߺ*|>R[w߽vXkR$+{h9x5%#dGN[Z^|L͏s /V:8o/l;| v(ڦnMZkU!LN7cc嫑[&IհE?Ek׊o^S Ǫn akĉB.]ne̙3?c?3̾BL5q#EKZbְ1/B kGo}uFIV]4UEg16,O.0m1~8C}\,.r-۳q'uuJ4 @`| Ys/Y^{jb@)|裊p|_iqy~ m>gZ"       @ U,@@@@@@@@@D3?(DE"~VRHRsH>p6\JzTTu(@ґGJH}.̞B"+@nG~>4,T-ѪV﷈͟?? Nz=>̼/ O;wgdZ#[n= 6_~>+$#e#'d[ YsP&luj*eUXy/$,+*=urܼtpHv.۵knׄw+So N!+kذa|=FH;vltFY`;]w,_?=[s7qwy;4An.cfEl,PC^kRWr8{fy+5i$x̲_ԂH`&ǟЄ ƘgFyXc1~`A㒙ծmw|ZŁ["(1"Ӽv[NJrgu7 .9眣=3_$xVKOE0|py @?Dak҇^$'?4it])`5kuW nXa@|.F1FEWGJ瞫s*NsM_-[k'G#PkN<       /Pka_ K@@@@@@@@@8\pEۂ]v%+dz5 @y L.=-ѸV)zcj6m㪧>%)gC >~S3?^:Dcvd^1>㥏lTrho,}"t(]3p8İa%ﶯ컯>֖2gq&q^VqߙE[_z5wn ͝!-)U|ƍ7]d~يb[k C~Y;w}8Kv[\(?cwͳߘ[JV«"Z?~:gG\dan,@>F~I}'g曥FKYV x#) %G|bUjXі-_g/jN<       /@V@@@@@@@@@.쳊`x/~!#5o^M7B80;;PVזEQ<\"G³id7DTY[l!] ^@-[ӧgZq`E䩋AP_Y9py$;aP{HtT` ctw{j0ze9pl֬Yu~80t6mnTj6C#.s:묓4jԨԻ@ ̉%CJw\D׋t=#hBPN8\ȁYdmSMzHo+F>V9݁[\sM<+NlO% x55|(?ao t=_W&t.tI|1V"+m[4W5_Xw7|*^wuܶlA{d6vz?Vv}at믿y8Hix yh W8Ws_O1B2D1V"*Rkr 1 4(B/ɮT _ mynCC@@@@G,y@IDAT@@@RQ,@@@@@@@@@*Uo^XsbRnIZUj0 RwRb vo?Rx@ddYs0.Y[80MvvU/* ,^Ng[FsNF} 0)HM2E"p/i~^$ :ue=0X9}͛WB.Ǘ&M,cEɃ-o bAy/'V{qߎﻷb SUijc?(8Zo\EQ :喊}fݔUZw}W_~?O8 g蠙5pyԿ#W},qjYE׊O}]Z}J7va`yd~̏޶5/2{tV[mU(6b9k(ֵ֍TaoM=H=µ|ߧs=LI*r1e5|,-ޏc%[3fL…jnq 4=",7lMw ~udJoyߙm];C^{M{==#]yĿq=8|yE^s@C EH4R= @a )aJ_,Zw|לZICjȑ b"5swݡڕD"Ӗ-l'E@@@@@@@ PY         T@ih̘EZO=(j(+t챒kuN EƎ]ҀH{(]`Tū:/.,RwA#FޯgAԈhr Ao5so" ӡKbA*RV d8.kwo !Pr08P$cC4Ћ.]8{²0:Za DFNZŏ.Tt0:u*m[}>6K/Ո#C;821ġ+d`-KxҺ>8Xnt,sRCccYa[K>`в\~~E V}(enP謌TտֿJ}Ȑ{})" HwvRѪ~oqZ=A}ٱ5:nmРa{g[͚mN&[G^A{"V1]SÕ}i~u*#.}}EU;l{p,Yx7JlPZOաCl¸ P/'qw O(ESZGY-+B̮VV:ʊ^n"P}"       5WjQs?{@@@@@@@@@pϣػ ﲋ5ϳ‹WF!P!MǏOt.^zҎ;*[WbrQ_\=)PfRh[Q7@8ЪiӦY/bC("98 /P90Xr`Jwb W 2N,Y<^>vMY^m`*m]5wԨHwrO?㴭5tP 4(Bk*0sMHq_+nq{mʼ^ۿ:84ɷ:Jr0kW:ΒC 갩8;qp99ԵSK87B"l-&EVG 9މ @)ON=u)\3NHJݻz#7@"ybmNoW_#pBP mj-ۇg@@@@@@@@Ԫrt)ڭt5\_yFzd:i ԫW*z)sGUÏUBFax,ҷx]kIr`֮7l0)"̒g4{ԸV>6uԔ6w\@5nܸ:OODZ>,vm߯ &L+ux-H$pF 7H(kJUWI+sO?l%:\u*xaV^#R}KӷN}\>O-P-ܗxwyw+/=Gn# P>6yd_}%=` sΑk]fn @U!u meU,r@ #ŸjӦMH-S@e$       TZ͢@@@@@@@@@@`&ONZ<"O(g7\+&u`w ѺNO=zHGB\ȝlYRxOK/ ȫ'^:"g@(OO#Acɠ<4HtpmFzhvk׮E5*b^H_W_M!?lA! rQڵWҪL>]uU$Go]={5( &rHϷؿ:Xڷ:J2$T:Tr[O:fC)\ϗڷ7kb]kü+[N\ܹsŗ1>z7u?_},q~U߾fvoTh3g*o;`+?Ϙ{/Xԗ fܰp-GO>..7hhvP{Z^:fe P|}[Z7K☺(\kQ,鍊n; qӼyTVZ}"FC@@@@@@@P@*g          |ua<@7Rިcv=}w_a?h r>zN.wY׊Jw`9ݡKvyHvpח_y=Vqhy/}}Џyߓ+=8Ddɧ__cK.֪Bϋ@J xn_},\[W^8 H4{M@Z %>tru`j]r%:ߥ>?jٲ^ Z nLC@@@@@@@P o          P}ZzEZ.ҦJ{-]zi*"ݰaYgB,=t]wIӧK[n)uV rl~B怿1cRogK}Hmڔ~E@`yEe,fYqI(Cխ[7dt1 Z޲xϗ^}uQC\={Jm'sL pC;Ol$]'Æ ³.Bjܸqv[ wlތ?F֙|ۡpC8(%Esÿ޽S/SO[5gH=z$k9ס%F3y<^Vs &nyЭGַg8%:Zµo߾d4MD,Yn³6)Df*-}<իU=P9XDzG>XQ5grtA 'HɡR"G1 s}~Zni:޼>AhK=ֽ@-la[=zhM0!"*瓇k|\ W3>rS!<\tn//+to!cYhsk=~lia\vλC_>^_TyH?YMC:ȴ?7k {qX'#F:{~պuk)b'd-[}FC@@@@@@@Xo4U,@@@@@@@@@@{o_HڥKӎ6@pOE]hwAT,CQ {٤I}M\[EVF -jհ/HFp{キX?~|X5$\SgI5AvɆ##)sϭMvZk&N-SV!       U-@VU,@@@@@@@@@ G)@5u{"]\ .{U嗩oqUFsѣ=HcǦb.zy)HkWy@HO>@U$ t=nmmgp* 2lc)K},׃ӟJ?q:4Hr_w\3?wuM7E '1~d?0ƣ18-W믿2@@@@@@@@*6#         P.)<ZI ͧ*@`'uk]g۶>b}zH9RryEw_7vMZsbz @`Epw}WNf… {uh"vHicX@|sgܟ{Nz-KrHvI]Σ20xjr8_uUM$?g.KΟ/~b{oڢSiਣ UӚ=4u_9%-[J'Er+5lXӄpPFq`r_9Xcn=`C_|tRõz5a @pߞ{֬=]wݥO<Gu6Hg) @Qŵ},gZGfՎ;vp_~%}Xƚ)-uċ/sgIZӦ0ϭJK.IAZZk,~L?,҅Ύj'|r+՜tGMRsxoE: !? 7(5`-<1?Wty(ς :YQ< ܹW#PRw}С)D+e!ZrΖ-k nܹ O'ǻ6W߾ק_AH^?nܸ;<+P-1x̓铅Y 6,f 3B>@rAM7MYg:U5/uq ވHPu?dG;$ժUp7l5w)j̤1-H$pB _߰r\VK睾3rtUy祰tkE],rgVhԨQ37/2<7ߌHM4){y:uԥKl瀭or᪩dž%-}op-~ؕlm&KM/ 9+_NZ6mxitݞLǕ <~#5g~Eq'Œ"[n0cko"@@@@@@@(8 #c@@@@@@@@@iӤGz( $ ׹J.(F[9R .54l4j\dȅ9bG7K&͜)5i(][G?f;zA(L9sDwK²Jg͚5+ۨƍg N8#KФIpֺZ xNYC<=[cmOA4[oΣFJ}cwH~0`@|dZI m;SiI}QҐ!!k|luپZUG8|+~bY{H ,~!PYkV\%9;yȖLJZ%;) UޣGl#z x1{Y֢#ڎS+='n#b >Sק1S߷/ck "H+#5kڢE.1 L@-_;r({k*n-Z@@@@@@@@*wRf         @a ̛Z²*vX0F X ;D뮻 q~'xԦMu]]>K!Zk*`Fy9ts̓QY´#b * ĉKBƍ"xk…[]w,aH{я~TЮ]UZ.oB`y|(<ZguS9I]<&!txykV\swT$$s=پ`X|r;HS|۶*[AI' y R~2O麏|Sõ|yDg6-~05j޽{g}5,.O5~xh:tõʽ}KΎL]S~tG瞮oHmn~@`q/~Cr)PM_c( 4]>Ϫm`_uQI/mc@@@@@@@@*ϋE@@@@@@@@@\_)z /ݥ==Wm7 +83C;o!Z#GJ3g /N6YW婧?9(m@:琕޽ϋ¥#0@W_}iy뭷𬯿:[֭[gN7`^%EV϶Vl)Dӏ>J ^uT8EmWm+"}1<餓$gI-n5 umqShiIYl2Drm/,O>Iw){l 5#}3U-вeKv bѱcH&t[&M`-k%O7d.]dK͎PS'ɽt7(7W_֘1wKmw jdlm_ L8,3S4)]v!HI+ B]7^xj!5p3ГO>oBhss:< +$;w\VH!       @E ԭ0@@@@@@@@@>'/ za7v]4(GQgFBv[ ;YT8DYfU,8XxhY='͚*B:OLa<.p5ǥ^ҥ^ۣ}ǎu%?6lXիV-=C-t-d\$-XR];SRI6^>\:h)=7JzG 8m{-a؎͊h_k9       T@*^>G@@@@@@@@@ pa'\H ߞ{"kWJ0kDqӊoxB:Tr?ࢼъ\2O&um?`E]x6o<1[y#Tq0a|,x rṭ5nX=zN;픅~ݵ+Dy+ r~w~4uJĢ.\/ zǵGQTԦR_!O;M0@:(i VA;;Har̠A)`kWfμ!ЪU+΋̙3o{裏m5i$ dMޫW7mtp cD>Lze)=~:=ۭ[6H{k{"CK}4iHEXt>v=Z\5W^Q3{yTqG˝׬񠍶B{k V赼@@@@@@@H*Ry#         PqJgy\Sx #V%CFrQpujϦɓ6>[:iu VfW\!R?c䓥v햾' "AX- hY Z_9Q#Z,~%!Z~@U SBy'eE΅vA: Z|_䀒K?p* ̚%st})/זNw R~kJϝy$kQ(ۙ@! 80˅,_![zI6lXIlΝ馛ƵͲ;җtR5bnÑ8v´;w|CC@@@@@@@Z@X>         @p BL(@˅?<c/IAZ Y>j\r\Suby%ۤ?\R,R,E/]sԬthKywϞ=[_|N9uq/Y@ 8w- ʃމ"ԬU O~p )\]^PW_]<@c N:;(mZk'03_2dH?ա[oUvF[a#% ZzR|WMM]c iSVcZ!P,M6qY/M}^{cjС袋m\^;[h-zWJUmڤqڤ矗3l*7qg|̪;8P([]JY"{(Z)IRI%Tڴjd)BIj5K%~әwܙwy{Yٞe|bT(l&v{޽ua۞ }n 8HA4ңGigjw" aԩ5ׄY)54C`i@M7`4Z)yrAƚ1VID@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rZ9|{$@ 1 'xA#%o''b…f̀;ZkGE` ݻ\/o^୷n𶲸֮ٛN: `v@a(?pxqǼr22/"IO<quD@D@%@q֪U|5kF|p'ڵYYU zĢE^q?wD /-xJ  6NؿEزe ~i9"ݻwob'|S8* $-[z};&jNԬ y(`ª8lozLQر0vnN!%ȕNԶmۤkJ7͜9O={,Ygy&('ʺb'ĺ^_' Osr-_EA@b(R͛>({`#O M!)[=,'i K)ڭU+j!"(㴮=?ym6xਝ5{3dc_)"jEI+d v!" " " " " " " " " " " " " " " " " " Fd<$^<e՚5 .X3f3gr|`uJx[ 0aA/)b`\`޵ $fhAV8CYX@tٲeIիWGqI!OrEZŴF^:V ߭@س'Km+z6}d.)xaJOvZcc@34jM~iA×VYh7{&uMӼysԝ2e3F tY4`Wu+[7oY3z5ɔD@@B@N6.d~s~7&H־}ƍ8"S$vWLD@b)޻N,_NC`4gtR+W%JFv Z qu" " " " " " " " " " " " " " "$ԊӤB zӧ'?3U`y '+z,f=&9|;?(K-Qx1u'zeXdRcּk= \uvimuC36lYpbrʨU:w4PjՐ?~$vܹZX.['T)&BKk>cxol/r={p0=qQ,<<6೅b#LA4r- y8db-N ,e.f 2JJ֎;0Kͳz\{%ǟh۶Ճb\'`M0kyF/_~gy\ZT#T E@M]4yeY'4 uh8H௿3Խ׆~@@l0<jʞmGÕW^߂L|cxmV"&\4V1.(" " " " " " " " " " " " " " "YWY@v8p݋?M- cjs:x`'mNg2s#dN,[ CSN-ZRI @}zԄZ˖-sy&-Z)@NP+π/" " " " " " " " " " " " " " " " " A~( v܉ݻwc׮]9سgS}}K Fq`܊qBK-p̂ |˽( Ⲵ1QGŋtXϣ-$cQK*CM7GÂ+dN24j0(^@^^`<B 3 ^]BR_Jq`DBA`AR_7wu(k"Y]눀@\`?9,~|&ۯY&8 \uU]ͺY}>_T_<O<܉tIʸo>+&Q}v/Xl*EoD5[ef(3nF[5'/}|!J2oPzc&F$2z{ӳz2 7."Xk֗G{X$Pzu'СC]?رck낒Xd+eC:D#~ɵfZw&d#P9D@I`ܸeZ ֝&Mچ.]c׮Ux[s,,(mdz9]dƲ)Jt8QDmڵ+/05*KyCsqlNdzlO5'E+V/˥̹x≮o|ƌjQ`i+EN眒4 r h" " " " " " " " " " " " " " " " " 1MG085kvZ>8hAիg;:LDIRE<[r "Oϙ3X$˲e˂)31jTK Fb`uiNkM-"3D~i{ڴҚ) iA!>-zT騣% (Cri_ |UWE}Y\D!{QIqVĶjժNիW/YV-WT }O?&-6W14n͓~:L\ vK郄Z’/ oAP5hpM@\Kx/ F}͚5ss=iӦY?(]ҥK+rJ]I'mM_d+̙4z4Ly'עdAtAbºu윃CX fklO䓋$f5DZ˕+~sE){]*8I'ǵ)G۴i.\hINK򛽜r-_UTI'd{"E"٭։"ɓa:mlsUVڵ;#'|2Sǵdw,X0S$dvu" " " " " " " " " " " " " " "׳-%" " " " " " " " " " " " " " " " " Y@`ǎXr%UYlƍ&W(bʕ+ .pAxQQTbŊn u$ @BYٲmïs,\0z*'/f \lYR[9ٳ=C{5$ߍV}|5@y֧exC=PE)Rl`{kرx'\=m۶v |n W @Δdn PԤ }tt n>>kpa[7o~?RO`kl P:$FbŊLtzfΜQFW^ҳgO5I%WG]xtjOe] !۵ăgj$:8+;wķ~ŋ'AQ~wL^slqʳ(TTf\Rw^YƍuǺxMFݻ&ŋwXש NGuTjYj^̋ga7HβV1cn S#'YZzu" " " " " " " " " " " " " " "[u>T(`g-ZZrɋvf͚`h~rPBKfnJy˗ Gݪח矆O?gy&ׯ˧Fo]9A7Zj1b6nҥK;V"ߌH<}{%C .=#3600X1n hD.,͠'TDskR;yZwyG>&UQ3ZL^37p+zJ)}:z}f(gɒu4"(86oƍeoڴڵkĵ5$eSt$!PH'Ǣ +ebƹ\*Д?^zn3@ѢESf!Xw+{}i!Vl#X[3#Ԣ8nԩ#$@ρ4CN_D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D jlق? dy1 A(κ;]S,z`|oe$(\y='(m.X޴i0l0PS"7h7vA(ɟ? ]wB>HO JuU0vX'&4iR\_/*@`pիW'gQ~zN.eYlO01$/К3D{~ͷͽY} P+!ɟbX 6FO:2;+e7@睗}ԞBgG~7&IFK7MЍɵ^xT R$e}i-q4h?;ڽQ }W_mR%YbE4Z8\obޚ&[ڐ6Zٯrs_|񅓽MʕA1_u뺱l= #p:sGPsٔ=غu+(nF%eS:muDaT5?٫W/-[?_)}:$Vim,"?"VD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D l޼| fϞm縠Gy$N;4'0`|+e/~0qD'ϺлwouQ! RD ڵ+r-> \pnZj^0܃>W\qnԨQ#Ee k[[v={3=yRsO?85n fpGLZl_cٔho&]=ɇzŮ~N62r¿i˖-ꫯ_io۽{X36k,i,}JMq8hDB>(uɶ\}EqHzrg;AID@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rZ9} 8p>Xz آ133qN8qZQb@ѢE5O@̛7ςj9L…uhӦM tgY@ cÇ3uFL2;ܳ/+GD_u¬%fKgatpK'¬va{jՐ?܄A"ZsZg @+e (YHu+K.$"3ܹ3{ |'XB)t4itt(R #ܹk~'rࢋc*dˇ[C=h^~ePfp뭷e˖U'+= EwNz (UEҥˡP*v+1L`۶mDZ)x;7o[M6yPD 2<8QD c?37=dwpγzvbV'O5J(]]P-M*jQ m[СCjCD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rZ9_H2o*fΜA\#Pi@ŊrFuV0 ?ׯ ǠR;wX;7\:h{faahQ/Jpnr[o" L௿$Z6mrX>h'˪k=zVZw1F.U!@"ʕcH%`o M{ NqFzRɒ%]lu3N`\9;yhˬ%@y֘1@׮@>@͚ȑ@Y_>X>D{ 7x[Ѯ&ӗx&PH\wu3f'DV\[[nqc3*n|FPKW{bFdZ2RUD a Xo쯿ڄ9ТE 7nGa*U<o6N?t7|&g 8DZwWXq*THHj?r5(|HPJ'?oҏM[dERD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D s~wt7p cW_}[F3m-@9ݽ{w71(w}ӧcڴi6l\bf N;8j1qT8 oYFٲ Yw5;P" 1O`˖-.+Y82-J4Aj\믿uq) k̟@0-EO>((΢0$VZ)!QQ ~iڭ[73JAa׮]TdZ5͛I`&Mօ bS ߀^MIX&J҈@cFfJ~g(ٺ;L~nhYwb+SN-i6w`!wo NNxE@.VU k׮+Wjժ&'x7F|bSzn6ڏٳgG}7t6lƱ/ w2eSح[>:àm۶}݇ȱ/_(ӪFСCcD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@bZpTG`ܹ9r$&OB sxТE qI#dfqi&L4 'NE45k5\c{γ;n_n" 5駀y/o6u] uPb}`8E-˗w,Ӽ۝82-JD  7嗞<?6*q'Jy (ߙ < ^|E'$իnTT)µ1X) ,^ OhY/!:3Ɠg#i( `[oqWElYع={LրMʵ.(W.ʮ҈@fP17ʉ?w5LyW^=3Yk[Hvڹ)`…6lhӦ{Md'ĩAq(U5GZ"wj3}RfKL-" " " " " " " " " " " " " " "+JAT$ <Ơcg{,J)<5 ZL+1/ u& TP[`֮].]駟\w&O6bFaǠA ^\~4?x7tS4U^" 9LAS׭[wyϻv튪U⨣Bѿ|8餓pbΜ9T3f@]vjI'SV/6$pY0P4^ƎʕQYA3uJߛe^1m݆f>|xeZ,aɒ%3::U.&p @ÆҲX$СL wб#LxXo';sW޻\[5^~֟@ PCaÆ {0~xxN~+J GX1P`矁$Z|vRK\eK¡"b zoqBx> %E'[mcچNYfY1KQbEK)RnI&եy5 NͰb :I)}+@N_0E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D A 3ǰa, 뮻\}Kb@Ν;CAag wҊI맟~©m+FreN;eQ(`psdIlgȑNSP,ه2zc1_=4iDyUTqu^{ t%`ĉXz.\w͛Y_ZAbZ?8Ю'jx)}7W Ponj'4]Hj矹Xr ͛g➎Nb>w\̵8F1i2@\\sα7=p@׾l /q*gpEp ílEqP& DD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@Z[b {M(Һ,E!U2y ,Xd >h4lЂ\vqO3cߙ%E NdiQq-@2ynxٳg3S" YN :%y^x8QX14j :H:ucaNfL2ŵ m\SD$`/(4J<&yXض 0Z5wP.3ݦMbΝ7 T.T M-a×iN|X8)1O%N?=a9W1Kiu`\}ȹk=ka}@^Һ٬2~5WJ`nݺo|ɔ{?~u#XI%IU0hP:F$qm#%,={6fΜf͚^AU"؇qo+W_}L5%UD&yB…cDURJ3~qWRD$J?;m!" " " " " " " " " " " " " " "}jErH~.EZ#NY=+o I'ɴe'Th׮LY>Sb=8Ҟ={,8hٲ%Zn~gf=SR{M7mڔӽm47<|l= pugE^z&1Hi RJ])qM`֭.(# Κ5k0yds=ȅ5`>P1r$~I<ʝw?-V0~& Z`OaB][gECHky sɂ;w '[n-ZO:guV%ZL,Kc߉ {„ ػw[hҤDF}CϜlz qg;4SIwq\7<ָq@B^^GoPаaì}y+T玄&(4cxj5m4MN X_[RwieHcΒx?X=ߟrlMi8߯[m۶8p`ڽVTv9s`\,Ԭ ~X>WP+kw" " " " " " " " " " " " " " " a HdP*2h k;v,@˙[ۧƍ1zhі2\)7oތ3f8Sfqxx\V ˨-Krǿ hNĒ%K\'$c(?8Q Ό:ZhѢ.@ŋAwuÝ{߾};(Be"inx `rr@yKv?2Iچ r\V9\BcŊ.H*RZLwqhӦo֥K] `K&ٻ5rP|HDk'I)_8OAahk0}7nh6(:p ><'i-OZ1}a-i >^{k1®1Ȳ1,Ym] J)DjժNH_e_p0>6osz؊>͛;a넚ojgcI⣏<" {~ruŧz*CEmJ0=xu`6OFmݱhXѓg^!d(@<nҥr7]}%Z1oW'`}>=( cR1X2Z|Q*'15|6K@$_NV@lWsהK..'Oco73FNryJ!fۆXLC8<{_ds1&޻Rp4KBp>)Ŋ{{~sѢ{w`4q0z4L[6#eMAJDrbX=[ mO?'N4 L4 ={t-ο+0o< 3IbD0fxX໑Mn}j &5l2FhgPmp_y`fN #*4~5p iSNua\KT]ve 뙟ޣ8һ,'uV'ͤȄSN9,&M0d_|~-(bs9j"̗kAJ]la`@`1=0nl6?Ӥd'_<eb{c>4ۚ5kL2}2w|1 OJ*~wC \_pa)S&M0[>eJr\^{0)79s&֯_z6嚗v˜1i9LHf91ԩ+)8n[ĂlzRM bxT9Snb裏vm![{m޼58x 5jd[% ]Ԟ[\zضm3h"(^\|J" " " " " " " " " " " " " " " "h" " " " " " " " " " " " " " " " " ^z4h +Gi&' Zh VbE<سg [o't]w݅:u$Aه3#Bx ~Jd`' ʖ-O$_~g `uW& ҳ9- /X ŏ}QwHzزej*.$j?s XGQ޽{qK.IN?v؁W_}\2Zc=6is/~w~ηRz7 oUV)1$ @k0@{p[w_Ӻ#9 NH4R3y߾}*e k׮u>N駟зo_'3qھ}˓uŋDsEz 4e˜H~`>mSP!J*&NuI{7j/w7K;v{'e/"! W0R uu+?91@X ^P\Ƶh+-`:X嫵g3TJkya>l#߂>2ιSg`c֯vYAYŋq''}<7vOZI_0w9*ᅫ, )a]Vi*o|xOgu36aNnB6$A٧Jyfa(f}"3gFw}7.]^O)#. J9Y< +>=/cNԮ!>g8%'VdcB'"޽{{ϰO{&p}aXHy{og_N:Tg0aBƲ7nNM3OItFRZuan=9Pjպuk\|vڱ RLRh׮]9F /R9l^ƱdNbB}X+Y|7 BBGw9-Y_6 c%  epڬyn!jN `PQ35m4p,`ccqMΌr h [έ7o޼HGXa, [n;mg^xaH۷wDi |灳>cӵ/,\D_,0˧p‘%iP,WK.O>$;PdI7$UgLNֱ}-~_(3@IDATw,sz|9v,`AIܹ3PvdɒϩO?)=o[n3ynSO=l#hw>cb5*޽{O=֚-OL.׏1}+۱W^yeXLkoJJ*nn9Gܼ'߼Kd]K.    t ~;`te+VNy HO&pK:m҂±-[pHDzM:0k^V*|V1 p+Zc١gt,c|Ǎ/o m+ӓ"?c导J&tߦ)Աrym$|_q:HuL0{n@NX,ӆ }0k֬зoC)cX%sJ.;ޒ }#6` qT`UD@íp|`ΜC7lJ" " " " " " " " " " " " " " " " " % VhrVU^= 9eСI{o׮]w_X&ͻ6}]w~7%U_wG閟(`Ν;z1ji._SZxNoC˒^VZ8s 6teOHMEy˾gv~2 `O\s+'. 3"#畞OYcPgl[w„ .+'ߺy=+gpJ>SbYN~$; -_f3)?СCg28o]؍7&m`<7#Fp Sȉg 2O~9rYYsig(mcTtcNKNנA5^zV8k>,`2怉vyqSv?<;Җa 0p4׉6o\I<0`m=\ t|RpjGRͯ둔"TZhVIz뭤U(xÇP/tI+K;3\mڴqB$e(?l8 39<_{ͫ|pB 5Us} #6e-V y fm߾ٻ~ldZo6V^/\A$nG8rI'.1;ż83|[R6k7t%駟L)3˖sȚ & t-&ѧ~qS)m5j}ik{Oies Y\OѪEފd_O9XZy̬;,8p i,e~>PiYȬ`BpjfT|nvc ՗܆{3 V)8""[VbFE,c-鍥ZM R=|x^z)~GXL7n{lH^{[,Xiw#0m44n7p"}3qXu O<L #M:c׭[v&+\//G9qHE k`0ukcf̀W_7_6oVk@׮@R߯rOHsl^uU7w 3<~GBD"`=eL>j5OA`Lbo+^*=>+{;uꄼy1?Mc=G@͚S~o޼yP~f\3YebRh =z~=uJk.#0e??}C=/{|5vO19-;.^kODҏq.w_+Wgĉ]СCar>ZksxbWVoSl=-V$uheŏ C!,\*eA0qDgz 5o'={)+( [lm+Wƍa\.RF{:DVP3Q& CID@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D 9@L$h͚5c| E@ٲe1b|xw–bŊ.03ϟ.`ԨQhӦM zj]w݅M~ce ,*& NdހaKoeJ^C~nee^OM44h|X8s֬Y4iRg9"$RI'%! OnCWHٳ֋tY3~7|33;&ʬ'cQ~203'tcg>}Q4jȉ"XĠFb.6U&` .P޿?2,H c1$fa%h=(c0qvml'bիc*d+6([ %K2{˓i=4vݚ&?>[ܚ(PlkRJ)f_N3˱S3}R29 `uPXx{l2% 2.d{`}fUOڵs@>B]|)sxh0O{&TpAQ 6x%*Ξ3gWx\"WiaDɱߗ3g>I?Frooaf=餓\XLY&8DQ*jժ,Y `}ɆLI )2OE.}־>c-~ .P+þ Dv=)Dz˔))hѢVZMgV}Es,;~!ql"x\#e/B&MWN]1aq.]>c-r4R&o(~T>J̿mJ" " " " " " " " " " " " " " " " qO@B?:M .`Ç2wÆ xb\veسgJ`8T!(buָk\H;… 2۷۷oO9;t?Tgf$:S>5ԺT0(͛aÆd1(5ӱ낡udXy>(ΠP裏NVX@TcƌW_}Xt$]3t;]CW_=ígnk(LsLs 2QTV:A&8ɓ'#tHes ̆ lś ?rW `[gL|N>=gbY߽cHKp*U@T{ILpA~[,ff,糕x=zE ?.#6x[VH#e۵&BsRSܡj=ڢx{Zw86buL f@yrIZ{&~Dv0p d0ߌHzܵEq#LRX(TDe٭[7^={Ϫ6f[ˎ_z+V-863d1ӼyܧO1<֦MbBxc;ۿ(aÆa1QD3 2e`ܸqx嗝,YO>-k׮dL#@35iF3Uh |(bN$թSǭFqSpb-敞? #'ʫ(4a"'ɾNJ 2խ[g%BBkЭO>1c;5)ؠ% 38[߾}+Ðko rhp= @HQF;@]d?%'!C${Oϟ?(+˦~&`) .~ L`Znpb$,Y3~),<9CбcGN-[,Xd(àu;I0rW)Xtx#.SVߵj1#Z*ʱ{9ƥ䛢ąv!^g_U.JIttbb(Y*L.Yn`%:SNh}[ *N>Ժ:t/;ϓX!=(ƣR`ƜֆL3 9 lYqpA~["~ ֭[sή]}4CJF?FZ唊<3XrCtƍ]*Vbl)y3u:scZ^{{&k^Hn/Nޖ-[7ݻwjѢʚ5kn7l0bsb 6yPPj9rL"/}w⟛O< yHĈ#4w\zH˭/wgW^yE^~mxEYhQx,~O׽BRI|'aZԡCps'ٟ+g~ys=r%>||C9%~sZgldooٿBz)뮻ZdI/}^1KHƷ=<Û1u Ä^Hݷ55 yGC`gK"~yW#!@sXKb_~-Wi_|k9h眾f!1 q/^k~=fb!C6~I?R5> 6 ϥ~v`iVpԏ}[ku.,l~Yhqli,]_&{XM.ž.ugn~:5ܮ v9-T;\i~7ZwpocrJ^kl~l50,b#1Yಔ0b!a ķ)c&?.p'G;OΊ q^.?1"VNtnJ;Qw,XXƲ}c0 |ͶM Ib 6 d8Nmy]VƲsi켌e[@Y|u{~>M^5,:t)faiܹۺ/b 6UW]"6 xu?;S-;%9I6B.uC|f ]߹Ͽ[oP>D+ǝ"    Nl|p`j@p|C%c        @Oȓ *ԩ5=^z"I߯K/T2[m]RL}'Y11Yq4YKYwqz饗dE1eU~?a͚5򛅄|$V JVMVJ*U*-C[mUX/+jժk^YXX0.\P% q? ۆd}*)?v駟~ 6f]H{+V++>V._y]>yu|76I#|7T,;KI] *d!~Љ} `ߝŊw}}_fE>4O;+~Xz|?l!9Ns_d!:ujÌ,$S:([PiwLJo!4yd_v$~xtkZ=H73gNNarea>¿M2E ?/ NsIf*/pƯ=do4 u$':v~Avm*絩],UV ?h7Nv'Z!CmK,E^qCV=6mdũMux7u:|n=~M'>k>dj&.ݿ/_^|- WudxXhKεj*$Os| =4zlO:dkWU7o^kРWWl$׀-H~^sw^#o4>C޽7X/gAks ,Y$ZZhQ0UƷk[.Z _,@@@@@6 d @l8%d/-OVf         @ ?pjѷo_+&Ce˖Lx1i;\38cs/K^h }ּĉs{IҞKE+wK{5誫*P2>^wm+/?Y~?_Fb5lPcƌI'Ix I0ӧo5|yA]v%f!Z~Sj:nj(ңJ:Ȃפm-Ik\K[>(M$۷BBdaPG } P+X ~)N '/G@@@@H Rm @S/JJ49v@@@@@@@@@ ׯ)SXaCa+Ҋwv[lQ}g!ժUKJ*W,_5k(vj}uq*Td>f7 3gSO=?^s-`=yzϷjoh}Ouۧ0-`Uh׮]+/HXC8z덟B 67{l}ᇚ:ujUЬvڭy <&F ,\O֛oJ1Բd9!DjJ@y@lKZ`f׺tvb-EO yTwq͛c9Fo7o^HEm,~\W@Tps/<[m۶jmiޭZ ?9^Ifi^=o ׄߖ7 kԴ?+Oo1-w]v/ xK?XV ae~רQpkذaBmocf'N&L Ο/++vXeQuAJҥKCf^݃=(zx϶!y!$xaw,hkB=&/m(T07?cD][mU"foW^ymׅ߰=K/}|þKd!:]FғOJCȂդ+}sefaM>v49>_͞x 5h@\pڵk'?,XvQbŋ}ya7պ .%TRQ-d.O? Lv;VVp^s22~ɒ%Vz-h"W7?/rr     ^h2c Ix㓸 5ZJ        E'@VW^m\]wݥV=cg;Nʕ+8+Vl-hd_~? {%dd2o"d:KVZ!i!+^ )<ď+o?yhX{/R4(:/B>y?Z)U* ,Zl$ *^$.ppbذaV&v{ye uT=sEϡCe_mۆkO?t'fx(Xg Ν=*z( 0UpK$Yfve5kBiUr]yNa~g!\0a B Ӣ0T?-!{X2ovbMK~k~?Ole6*JX,nk鿽,{Ka~ߖ}wXjV<)SBA[/d[V-:cntuo>H~0^F,N&ukY\Ǝ7U^sk5Έ>VbƌZ{~1٭JVƽŻBR=QZ<M:1$]d5+g[@a[.3,˗/Ñۆ^:P~3Yj x%\?B{3P˖-5ӓ ϟoAsE4W2Yr_v}I6"%/T]~|Ybˉ'HV$ŋiӦTݺuù᧟~ĥ33cS x[\|ŪQ8z'7߄$JlYt.gVNj|Ljh        !@Vf        !ЬY3=C>cTZPz_2b]Y !:;TӦM5}t͞=;jyHq4>š23I8>"$)!_~F޽{QFTR}\?묳/[8R-X jB{ˋ@h {Kog=T4th䯹5V@ o5h S1B_|E(!-Ž=o懀 xM#p dAQhR^t<Ə ʋV_yd]z2t eIۢԢX+(0.,yb,#vqGv^Ztz+V{m=Pv 2W`뭥n$V҇ʮUI_.ԣ4kVfzI'0*TN:iڣu:u>֤I@`#K:Auz}B 0q:ULM,Per._S֭꯿ ]dI'P(       $W@2w@@@@@@@@(ر^}@:wlٷa~ڵk &A 3/^B󲳥xYiӦM(@pB D/*w#OҥJʥD]onPDӋ`״Jg}vr!z-[W^yE}G3фuB UmCP8Hz{ܹwmT] u\p@ZnƏ3gCvl[J|R:8i 挀 m+͙#$;ޖ]nbr˔Δ{y a-* @VY|LvUo4K?>ٯqP?G^r{`ǰaOksKc[j/^{)xYIh0~l~RSOIk$V9Kn\Zj3< uk֮y̵c9\R˖-õɓO>Y>`dLy!&V2pp}e[K=AW\q|\pUk#y"h*o**}եK];׷/DYm#;兛ʔ)kJ3M`U-z3g !Z^|> -^C;05m4l[lElv}|o@:~O>Y:՚5KV:EaVZ xHo~E =,óx{(jIǥ՛IgK@,&LB&MÕ3 jFVWZDp,\c=f UtG2>=h}Uƍ8e3;V>=\XQt¢Ef-@{? *>{_2@@@@@ &@Vܘ ( NV@@@@@@@@R|?CQ?0u- PB VnnkEY`ʕa3g7/p°Z;C QF^z:r;i̸~ŨkIGQ@ &+°-ϕt6/-Jʧׅ(@=a,v!}E;kt饗cǎ*_|F+=K/I@3GjOjCi _QG~A;c,kRh5kgO]*H={JSRg ϟ.]ȃH<k!9G)̫]y1bUfw5i #`ÕV_!9' yq2e^(L6E-[fYX~zWZ5կ_qlˮ\rndOvQ0>={e{nRBXtAa[oyZ'.ғOJIxQ-ZǏC-իWˋ?͘1#=/Yb/ m{n쳏j׮ Cym6>ؤڵkCq/B^u޼y½b*W\իݻk AZ& ЃߊF ?!]pԾ=aZEEeR`/Ѷ>pwC|a|ۯ:TV /i6bZ{G>W?l0DZAe^<~koFUJVbj=N'njܒ`zW.8qJ.*UWWX.        @J*D@@@@@@@@*ya5'}G~1b< o{*{A2/{lpQ @,^ n_}U(>{获m&qp͛k_jP-Zb|'ֳ$έ/ȋJwU}9˖- E\hM>]k֬f͚Y!CV] i %?ZӦɂ^2ڴ}veSD x#<;C_~?x@-$Z', H^ї.жm٧e EC 'Y( B@K[KzR29MJYkoKikj׮]ոqc]ve۷/a"d`pǎӨQ4d͟?_'tN$\U=Ke=DuDZ:H+W^y%?w-s<䯍][XXv|{֬Yci>~֛_p5kp-#x;l>%z7|#k?o{キXgƱ}<{v[~ش{bMg!N6|Mr!"-@@@@@@@(>Ϟ%#        @ TVM~kѢ?C2/./"zBUV8R^wuW.<Yŋop[hQ(o4#F#(@ٲe- ~ٳgSNn3gFZzU9H/{95o\o}|STò|oVX|=4dz}vVe>e+ [Aԭ_uv|LgÎ~G⠵-B5jcu?ŷ%joUN=JZE4.\*Sj<@K+WN|p(zmӶd[zd Z7;"Kw-qDT;VUA`#ߏy!HzXj\ο7z1 "O>)FeRCt<@iSYtRҠA^C@RGG7ҀR~"W/Qswy:cԭ[7VZׅUB/9Hk{W4jԨp<ǔ֭J˂A$x@v# _\taIi!c 6 ^fMv^ L>_+Ui4n>[g_,Q= Dzc{>v{ˮ^W5S71n .EǺ3sˏj0n9^       ZC@@@@@@@@HavI~;CrXW}xך:uj(űY@fP'UrXޟ,VV)sŊCP/7J^^,~[r_~%BcWXB<oFV^;"ckVf h%W(?ߕ*ղmr=o>zc—'{i?o&N-Z"3T-t衇OL7>x; nҼyovqQVt>:h̘1p-ܢs9'g~/0ztiR2.Af xxȑڽT4d,x7כK@͚R"deQVvkׅ[V54~y%hرJ3\͛7/܌D x]uU:묳{p} ^]X 0mweI>Zm=I6]-W.` -P6_ᶩ5믿w}>'{׬[>ϲeˆql|Ǹ>A]DZ}L;X/DZǮ_֏_gˎakxVN oe{`gy]aӊG੧aK+>lԫWO>r4@@@@@@@@H&g@@@@@@@@J@ҥ55ji tRy?A8TfV0B\^ t߹.Uu[WrU!hk-_ŷY?//ˍg9Xޟl~󰫬^t\`0/ײbb{g(? }u!x:p*+B*YZH܊|=QAdA`+J]Fɓpo=zHU֥KuQe˖:a~M@A<f`_x]mk7|zQ 2OA -t~FS^oZ}+eo:i:7^>!y q^^dYǴ}p8+WnȕGc>ߊ{_8uƴA|:}Nck\իm?aXq->뮻}H1l}{ 89nz=-kժy0U2֘D@@@@@@@J % @@@@@@@@@ Uj֬Y.^:$pxa2~0IjWQX!ʋe/&^,e92d BhҲE>O(=aBT,iXIr]|+o|rhi@iH^IP"V;8qDo \:s=@4H=>^=Y 88" 8p g޻F-f5ʎcjy䑚`ׇ@ w1 K-KÇnҬ `v.'(g#zJKBw        @J'h>@@@@@@@@@ ޣ֮~LNU2@`Iaâky ʀUgRHB#:FW $_iĉkԨQyꩧjʔ)Vx?^?&MdʯW-*4!U^.L:i?fZz}iٲ(X2DVr}}F.nn!i}9r$aZѻL&jHgϲd+ ֕ƍK5%PtWiLY3+]w^A-7p.J[Ζ롧/Nn@@@@@@@@B .L         fI#+D.y[n@ZN>]ҥhR*gHkHO=%-Y~NVE1cmպuP)-YD, :yʫ@ %b8ۤ6mq꥗dwQeWjX*S&%N'(rٳg֞{QFꫯַ~zE@|RYSj0sf~@۶Ҝ91ecGiD`,WSE!fzitK;LG}:w+VFL .]Z]tu]v _ULClS{'N>8]c[[2XbEdᥗ_e6+vE=}1/(2 *hѢEE<        |H         @Iw_[֬+'R0sR\,Bo-=TZɶHX]jvS]"޿U*W_i'C¾+PʕO,D xܶk93?W~cJ&]_,>REX$}+CbX?Zx =s?~ԩc۫m4 ! f~#kɅ#"Pp?믣q ˉ豂ϙ)@89\^xT:d\*[Xw믿R @@@@@@@@ j囌 @@@@@@@@@x饨=HeʤzsE`lez_Cz^4EE ZR.,43f7߬f͚ ~$9sP-oɒ%!ds^I)#oҸqR>H5jH^hwr4sxcRNҮL&[SjذZn?,EK`mԝ;wchaI Ť,"Pm_6m$cXXT)騣/:KXۃky'+w'Z\FNЙge˖o&l~nj׮-ZXхZreW+E#.ѵ`YTVtGE@& yڼ4`@&9 ޜSq<_eڵ\qL@@@@@@@@ )j%"        '_EI&+zGdK"md8o#>ӦI>;}]z!?< kWKiР̚5kZu׫qY$iʔ@eidEɓ_$^}URi$!B}ݧKgqFoc xIi}3sX+\`m#c uea PxϔVCb Jj#-^X<ڵkg= RF Q?s+U*z4t,(*PmImH˧L)!d]wuQ./OQF)G:@֭mRZE ڶ̉%IG-'s( K$krsm9͞=[mm=Sui駟~ļ Mtɾ愠\ti@ٲ#M&TtQҟWX.'pƥ_qYPAB+w~'߿:"rWXۊG}! IxQeI6@+~..9~ Xݴ[EѪ]VXn0        FjmD         @f |IH*dֺ65K:HݻK&I5jBCI#Qd%]hC޵$>UnҤ^xz!\kѢEzuG|E9?_z6Gח`|t RRrO pر&̂FmgϞv~ *J xauhM^;(~㲀_wM x.B%7nSq &Pt䑲sqɃb=W>\׿`T[omhĉ!N:v}.(N; 1B~kРNZ92)oB*SsO[7ɯ@ gnOz*y4쒖JKgzexUDwy'SV@@@@@@@@JS~V@@@@@@@@J@Q/DC |ԲeT駥; \#̭^+c)\.^K. EZ믿s9G3gδuUlܸJyeo3D^(vm G{a[nDI@C X1\>q%y!۷~>ᒥD:uR.]B(~Ky < }ٚ5kWBgj͚5y"L;u הZY>5ߒ)ϼU`ΒF]kA"0c4oԮ]^^kC f˖-&MUoD@@@@@@@ @VP%         *O=%}tݩ#@tAҲepdkݤ3ϔ9I]k}_`K5XK3ܹs(u~Q:xaCS_֓_UCaX;NSNuU"4(~?/nyqi%]Tz}iSl3=@ .\h!Ƀn6uI_Fa(I+P:Z^y(%Kfn@۶ei#;J˗oyN6~ 7}El~[v|P ӤI͘1CݻwW=l[mw6|!wRy%9Ϝ9Sv[o:Oߤ!"~,\/QGI DT\S䍢*PԫlL@ZX“(Z%q̺eʔ Q%0嗅'3@@@@@@@@(^\KNv#        N .Z*ܜ^ 3eR~ҳJl{W`jgʕ+d'OBBvyg]x}5~x.]wgzN/w`n{H{-]sd48,NVLSvBs@Iv[iHi(n]7ٳ)Sk9~C c]iӤ>gHn>li4h`&}>q*U .[VٲQA%G @۶.MQTWngh$JQ#ᇥモnQzmNtIVEKjd/c>}-[j)/ԩS/h#xAc~k's@ ^+=4fމsɝW_} c뮡q&M4m4}G:*V\h`餓 8)+:u^TV0SO:0Kh i/0aZ~?v_N0aZ5~xʹ:tPrr(œSK6 ,niN(#n^Z(y(ϲBXĉ{HݺIvyȮJ[lnݨ?0 ~뮻NZ~1] ԯ_?j{ҥN9 ^ĢSO=Uwy^} Re+Gg*f=k46{em< ]4th *IO=%kQ~NE2eʄ@-[ƍ5eʔT&}B@@@@@@@ȇ! @@@@@@@@@ ^V3 4(kFe7pnu5i[f$X%/T:dԺug^g7c + /믿^}<b~yGfMV-YН@tMҼyeA7*Utx뭷VZeK1Tdi<>{5թS'!`ryY^ɏ doҸqRŊٟw*ж4gdYEs7/no2: _~@ -[JO>)}twwݺ0Ri({kJiӦdfQRʗ/;CoFض،gߞsi/",Yƣ֫-[&=_"  P0;wlvc}'zձDŦMq`HO-OrիWOZ E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D N x8-" " " " " " " " " " " " " " " " " "` ̙Lx;l Lԭ - ,YԬp3PR%.]:S"Db37d|-py('rJ\y啦޽{kЦM \cUMO`BjUO84PfϊE5n=`t`. #ЩS'bZN9r;C "V %KcH 7,u_#0 B8# #\+Ή@٤67h(Fi*cժy(SFP뿸Zoa+@[_wqs"+y^*^=a›R>?j$Y@IDAT*T~1t\ x#дi%"CRgXsQP?D Ξn 3q0?u^u֡[np@p(PK5 ;eˀCg0r$p@0BvJCT>Adqc &_"~ BΝ0Q Θ}ػwoX$" ,YqفKqD@Hp?F߾@V$;;p\jнY@t p 6'fE*OX>d1sh-CX`^y啀bYڢ`o!RK7@5XSOS!õNYK)uRPk@ " " " " " " " " " " " " " " " " qIx'0v,x1@!POgOM+'.]jEw^/>G~!Ab9dTzmĀ^«jf*ecnjv;q|mN7:#w<#F}jOalٲ!}Μ9Nsʅܹsc_gކ ND׮{)S`N ^ #X\{-@f@)Υ#HqN?~<9om'(-;-XAF_66×8p wx{h^ mo oQ4p>8ǡbT}وK[.аp nŸpf(@f"p+V3goΝ 4=aIWOh7%7|srEUCF~`0`"ڵ ,*kW`d1=q|c۷;?pwϙCs\TQ/l-Ze˖-#un-S_[zEff]F tj4aMc%/̻=R\  M8Q󁠛[.2FEU:@~"p|ɵ'\uUF<;(N1@VJ," " " " " " " " " " " " " " " " " Iб/'Ԭ~B~:w 䓄̞=:-ޘD |裄n$N~[o!aҥK">}xtjplwlKCeŴzo{kycJ}i5'}ҦxG̋{ }@1޶9X ]AE*V<~G9%Ke1عy}[A3Y8oJK}3{#F2~}7c.,e۽F 0z6-A\.eȝeqVZeޯ`mۆ[]srfcQӷr̕>)ōw(Vʕ+gJ*Q+P|LqBaۍc"|_رm3Ծؿ?aiv_yYSpNvZx8g3/k>'+>{?LX峮_>Zt*wf.-Ǡ\rs pB+P^D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ~HP+~J%> ش uRD[L4j;3PZ5\xᅾ#DруB@6Q0ei}bjP$bx߰w^ٳǞ~_$wL <8bSDFx( D8M g981{9a#G/oٲŊcăȊE1- :ފ/%Kڍ#(u]їNEǦAr2b|F%6mc'=m#w y CFp+c&>"0F&L.-5%yY']J@I֭kǷ.-%" " " " " " " " " " " " " " " " ,zR" " " " " " " " " " " " " " " " " ~tcǎMtV'Z\3EyU.0:0go@p~h2!I@*^jd "tǀwމA<˞={7߄Ĵ7$E,zΝv۱cS 9sL":9-{5P"+=+^S\,sG E;?1 pPexlЩ;dܸҤ+ Pű}pŮ]weq޶9}:N>èz^v-V^m'Pp'G8>8v6 M}t6wB%69؁c gc y96q7mz1}||=bWiӀ>Jn`GAmƍ)tlVj t||zVZe#ҥK? Vծ] XQĊcX58eY-[f6'Et)լY3nT"\d5*kӧO9rmȶ9Ծzr3O]ؾf-(49ό= j>It í͛M0: ) ;`A'x+,1F]u?;T͉@fBÆ Gհk5&Ă" AaR$0 .+#" "o|N AptID@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@R# Az &V6mCtnJ_2%Kĉʕ&Lq^t2NQtLz7+"!+W&VQ'G( _PPbZsOc0:un݊͛SAFoX8" S bLޛU8O6>"GtlHsDxx tB^xq3(Q7̙EBľ.!ݦ1&@qlc#?$6t>8Lɞ=s.#QecTG0џ8|pb˗h.bTXn\rƗ_!CزeK8{?ﱄ±% %@.68#@#FU kqAQBDqu|3'| >-| R Bf2ݔBh qR`֭͛ &ayǂ Pn:O@ZD"M8p.*" A-_T;'0xukWiqT :hhF(H͏;f͚77(@ #U >7Q.@g7h "o>lذ7nLOA6T(E˗-bE(|BsW)jQ(r(煂jœf:kĕ4&1}f=bsg'5Lt>iqǏ[@m'~1a\rY@zSN>P$ϔb݊ϟc[qY9۷[0^̚5 C ѣG9r":+W]ve?~p@X±#"7n(ı$澶 Dw_:<^~hٳgO|..Rk⋀^*mz-㯿E{;QR%pGgaj}^0ba0sf1bطWZ;w7ߌ84o(&5n8+ž;uRJ2 㯿.0L9Y@KND(CWc#x)vCQ=چf͚=E h#(CA͋/nhݻ׈8͛7_dol1&P,Zj6 kԨa2$htQ 6bժU6BH ڷooN8y2m,FA%|cǎY@;A >sLLX=Y^hbK@6ߠ;i#~ıܹssNp,k@ <4ЭЧPDpiRP]vEV,ǁn5 ȗ/L gd}x'dNҙ=/^KZ! 6񢿐;wn\jժhٲ%FHܹvVpD$ɜ={m!Nw}{gΜA\1jk#lJd+ ư|n˗/vb% E"%^{-xı21 :Y۷qĺD[AÇ[QGլYӊpA[A !Fd*{rK.rt`'8߸ +3|c@ 2Ͱ Ìp)s.ٳka̙ѱcG+Tv.VnJ/ԡp着psuNfjj+ugU*8#GReD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@@ WlXD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@A4vX(P:Jq[ HG*5Z?G`xh|D > ]g v SNE&MQ1E ,M`ȕ*#Lx+E~(ѬY33:7 =Ï? `8}4 ,hE*ԨQ T2H⭅3nyEC#8Xh[p`B孍Pc'hD-(q,oY.g,A|#mtW dƞ=@R0S|@a7Ä иqc+4~ 7X孷);qgU^jߔQ7eB?@t{dѣ3;wvo$%{aӒLy]gM.#JTvk.p(Z(f͚ ~b|`E)D}}QD@D@D@D@D@D@D@D@D@D }T " "is={|sXKP+cj#" " " " " " " " " " " " " " " "eԊ2peg < T=7#@Y|0l-1}9r$vjl#ǓP񫯀~ c ):[.J,i;/.j믿b̙1cuPm6ȑEjժe~+@8j0{F_⊝Ve擜OQjڴiJ 0Aٳ'Y!e}S6ZoʚFY)f|(vEGg;dRa>\ܙ'OFV9B6lh(zA!ȈonfϞ n|(\Ig͛77}vL/ j*kh#(B! fFpVѢE3:Oۗ;69gΜB(-[LKkϞ=ӧ1c#:\zȒ%Keg\EիWcΜ9v=߁RJ%#nFϟ?BHfoH3<:ߠ|m˖mDC_hӦ#4Sp4be' [Esvͫo߾{5KE?ĿT˚W{% cDD偑#×R\#ŋ3#,7$O$J)tSO[Sg" " " " " " " " " " # A-J$" HPKP+uF!" " " " " " " " " " " " " " " " ~ HP/]S``E(%+qNAEvyĉ'PlYw}xtnP ʽ (S`Aj Q/[@;l2˗5JKTBdB#h#Ν :٧O\tEUt7x/ 4%KLu#Gbv s*jߴ7wRZnkPj@(73U@0y+3S O]oʕKܲe[%=G}eժUvZ?w馛7o^3}(Q:%A(" " " " " " " " " " & A-W7 '" IHP+ ~HP+$\," " " " " " " " " " " " " " " " I HP+)<#glJ|~Aѣ@MԪ/Xu}צ-%A>0~]Py%O㯾:O:ѣX/ZhalTkP#1.ܕ+Wb„ ?~` 7{$CD0Ѩ`4*0gpBAw9s/!-̞ t{/лwѩS'\s5_l P}/(]߾}A+dTƍb[>ovI <3`Xn@G˗/7be]8"~Ρpƻk v`ڴim!(lo—m7L 7ʔ|k!͛7@B p5ߨPaÆؽ{wMC j4@ oj>@m>`t~oꢻ"K``*bdQ%+W.PT)2:km).k dumT0D NL:0^qt :̝ \zi̜9SiӏQ) l p"_O<ߏ#G"kh::ӧॗ^tߢm۶ȑ#@hʗ/^za˖-;vup^zulK. -(ƞgϞu%s=c}k5k*#:ӿ駟wQ:t((C1ߩ  EEʰaAo7o?ʕ+gEŊ)bc癴 jҎuu|m oݔZ |9P$РAR %PP!ZJBbŰgD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@@lxQAE@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@Dfq "2>1r_ua޽J?JO?-Zu}#'N%_cȐ!v#hG}d/E_zPDhG@"@VZaʔ)Xz5 (`i]k[nu %K~׿kƖmѶ) "% ;wZQnݺjժ8qkjࡇBXx1.̙5TAD #ȟ??(λi&1¾b;O<*kfP!2)77(M^\z饙"[… cҤIصkE6}įXoh>~@j>p5ѫr 1@ǎV-wǢX_ꫯ/0:'" " " " " " " " " " " " " " " .&~QD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D!8*Urh/"o`tm0s&.M~sԬYSE 4*Vq #,2|N>m6]fyѳgOx$~P"+C* kQJ*ݻ4J1 GŃ>hE(/f}!P"t/b۶mVt}[{qV{3fԩSѠAI@f$x[b 6 |[L>=84߈)~erf [֭/7x FC/k~)Ə}fM^;o hL#A4\-t7."EԺꪫ$Gm HPKρʕP bZg8J:oذ!e˖jgFn@ 7cUVn*V/ ۦMaۀIH駟F֬Y;vVBZ=gϞ$uoQ|QX]v?6+uڼy3x [ݽFBZ͠/S ܹ3j;-_;w.ϟC1J)NFڧJ_ŠApM7T'apl 7zŢL+9syF7"NyX~=9իcĉOt>(^uPP뮋ZtX)K8lkcs-ptR<#ֶq@7cǎhٲ%8@hy:lKNL2%ɜ㡇µh0`?QZ5pDߎz O8roĴ?>3x6SDn띲d9O7l >#Z.~)tE()Zux c*jSUV(LA-~` " " " " " " " " " " " " " " " "㣝TJLL7a5jdbx,'YR.N^fɒ^߶muwcqXf ri (>[٬_ m-O>m41_&3dQ |( 4l0?0bGcǎDGMW|0iRgQɣ ݯZW֍B|V3bA> d֭qעSN[m D#m;-;/*?ۇywBC(Reas̙^7|!^P;r~@>}жm[{VW}nhѢ\jql5+Čc i^x99r8g8[a+֙'OE#)7<7Xgشi&ӧ' VEYq cb9s_yF0/EGΝ;*JXΩ}cx}Ȑ!(VHiuC{7q>:73K(~=`PHg?Η-%.,[zX [ڭ[b>^y͜(\ZGA-K˗/_ZR." " " " " " " " " " " " " " " "FPD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D+sݻ"и1pPtxO'ZtO={f|= ZB4[l短p9 \dy0}?/|2zgΜڵC6mZ'|F2}\+̕Y q]vEʕpv>ԩ{7Ɖf8q_}ƏoSN1c *O:7c^#f̘ay^y <ӊ4ӿ+qwۈ2xWS/?18{ǭ3oK/?jOZW_%xA1-0>s?ʔ)cРA7^P\'R!Zk>VL{5H]8ܸGv"7\gٳg]wL=ƈ||yLE{](>vr[L`!&n-Pa$PH߿gJ"Ңj3E4 jEtxmV-ӑn BGf]QhѢZ_x#5'zEN˗/0:3F F%ALӛbرcUGΓ'M ((-SpL+PR׃bС曑?~̙n .QAPu&!CXAmۂ| {bxg#M>84$ :~)"8w;\(:i(68➶B><"HsȞ=# X"=M8p2pңʕ+K/R Q6m.]j;^HP O,UZߛpL+֕im˕+gE+ [FkAowq[rD;h"ڵ+"VJM|GHSLۇ| 6Z o8~= !R%}ӽ|=SUd8f0f P7x*^WPߊ+%k" " " " " " " " " " " " " " " " ."Q" *_";G-Zug8 YNN_a٘?Ŭl:yŌBw毐|~;*U;CG|^.R 8?wvwLLH_O_|-3fm6;y Oc6M6vvD{DQmcP{ob޼yȑ#LO>݊VչʞGofu]In}ϰqF#F{{vJ]z!#lԞ [l+bۃsn [cΝ"ǏoE8pKg#K#Eʾ+;Niٲ%l.] s 6"Լ5ůbŊ)lRz-@IDAT%i#RKf#W]95n /{A=O<֬Ycns16´b3l7YƚohP\U[K>}رwXGkAM4H*9ؗvrmGvmpΜ96ܹs_G (Q|kO&yO ֝E'w'N~g>oNAƂ0/&o('OEє@Z " " " " " " " " " " " " " " " " "FA8N8<#*T&/̓z<{<AɓOFObϦMaky.rq1$cy (`q615=3gδyoV1U=Fh6"y#(1< qj :^7omc1`l׃}oK $ؼzhgÆ f.U޾F!$ٳgLj 4Set۞sź!?o>~ц>ڠ.1+&-Zx~hаa99ںPZy}m \r{:<viٵ6ߺOD2L1k$RQ$0m48pg|V9vgqxC.[Bt 0cDᢛrK$ (t " " " " " " " " " "G}! @&&7?@Z HP+t_jrxD 3-xu"vjCA?l1c=G1 0\})grEms}%^`M N߿QcZdݿK)2%{;g{ɓ'=}NIqܼys;VdT ҰMi#'X-_⫮i:wnԢ]>_~e*SM!`9SKc# #s `lD0ys,y׽|,A!pX"tՕ}x>@>zQpsr>@Q:DHo:p5pHh`F.]Թ}$$O;[tΤ0܂ z>(裏Z}bx_lyřsGRP+:h>H!e1ڴi9rHH.8??zƏO}݆U5 f](=@d͚q#F${0>S{nȑhݺ5hKb#xƑ?orc_;9n8k?'}֕u10"Nڻ@ :vۮ{%B_9qK!(p%RǺ8k'<>}:1(@0}J|f`D\cq6OeѝZ-=kQ^M,fo~7HL<|̾0'bN /e1FΜ9zꘗUp_J@"?2WU[p5ӧF8$ATՅUD |?`eDZtFƍ'f={vԩS޴iS`^:u}饗tRX7oxDxwc-[b֬Yɓ'[ g}'6*E$((t;wƶmp- 'NO<|Ӊ9ؽ{@Z2-~ 1]ϐ ߿}y+<r鼁3|XڠaÆxֱ%\b?Bٲe9t萍Eϧu ߉?Ê z`JH˾!kyHՕbRx׭3|:wtSxeY>lDD<g8X2Kc#xOJ$Oh-cډH7w_oDf,v/8\|,\0<3g΄Ýdw`V\֍"7jsTc˖-}SLfeY58bmɹ+UNݻ]tA^kaVHզ:@\MUtl>ѩs=qN~{̟x뭷P^=8p~7f ֝3_('L4:t.ōWre%Us" |o̜Tkp' j]T*LL`T#dbz' D͚EGifGgq]Xө9Kρ$|ɒ%/QBt\G:wW_0 p}nTXS}?N'u7 J~"tH('O{!+TI3*i. [.VZ:{=`ƌ~KHtF-cZQ]N1x La޼yv? *O޼ye}^cEǏ+oߞ6~+u;w.ك[o5I93?ӈtڈp;O@}t)gNQNi[hc(1c#-[fRS`.;AASpG ?;B/Ժ1jԨmǎ=)+pS9aO %Fx%Fc'1_g#6eT]+UdL*@1> xH9wrh>o}vK!H}='N/8sI&ڵkH/@*\J̚|clmZ+W}/'Ys3k^3ΕW^ZjpҨO}Wȑ# ~qD}h-\xB9ԍ7r,7 ǥX[իWCuTF( bdZʴM@~0"7@ɒn-%%0hk BdsP&k֤rҥȝ;7jԨaӉё`i_p#}P^QlY֙w۶m[w:F|ĨQQz0iF@bzi̟?=Sh >|йs4SN?:X;Ͼw} bQyR[n(Zu4:(ў|7):'fΜi'-=`8vYX8C8N6-IhYPBj|y:adx9_0y}Ŋ*Ba#_3g-ǻJK]tӡjҥQv`oZ<E( CE,_\޽pI+YPLTV ƍbZM4v"6:rz |)~HRx-weaa|8褿r 7ͭ[tGP.%=7A:K8]߱%bi#X@uu_&O-tFYhQk֬@N{%.}'x$FjdP\pӲ|/ g8ܻe"El;Tk \aLًݡ`n6@[㧟~Ł@kl5>bS:N jU^U[Bs|(uR=D@D@D@D@D@D@D@D@D@D@D@D@D@D #H!#Hu8&`3bJq\ ]Aǣ&j GdԨQA37矷kyQl cΝ1~:{:O4lP\9ԪUݿoٲPMW]jU5_|[JovG0&K -0 ش͋ M6 jo{] @񷧞mADb u䟦t:Ôj/@SqDׯ$`Hʕq}sË/ "!&ŋc 1x .2] ڿ R(7oƧ~ k).2P+)RDso8~`eNuZ(Hn~~+ԺZ87 <<!kȑë=,V}(C=7@}S>=z{wVc ?>/O<)x{k7Aɋv`,#@PR{oɓA'|իgq$LJ&NhǔCtJ1s'o&gRzc[ %\o=7;k.?(uwܡw=cmc7ڹf2ƻW^|QgZPs*o*TT_$\D%yI4-N[螁-u=`ٱa6}w|ꩧ&Jm^V*SuߦkL:ϟc;E[Vڵpasc$m^N}ndvCܽz{Z# ݯ5V6 Yk%K6@ Gzo[RPm@@@@@@@ X.        RuqǗ y\|*T_Hk8UF |E$RF$rpR#<2ҠAH"]vYu~qu^2$B"cס1c+s+@oY.`".[nq y_ν".gy&₯?2:(i:".!:鎸#.+c>}"}Qg]Hu>ײeˈ țϋ|2#n*|>^C5K$~ځK.$Rz2k.qAx.k\2ǮS@]j޼yąD\y3fLu*;.( 2y;VZ[n~kk gg}YtPu6D/noP0o.*rGxw):펬X"Q1W7W9idN;ED\BgϞ޶]HJuqzcǎpٍ?>oy:ewNn)̄ <^ \}i+ N}wAIinaJ;ؾv^ "ՋUYgm㸎#zkŅ%&:)naW^qzs!|F\(Kukq 6D [hq/j~#\`ggrv^:l!Ps=#.*bq֦]x`qfX=ն_Ý8v}V"vim `0Ո 时އK۶yӦM%dvn %Lq޼y`8KDms`o[;bǦ]wع}\P\&j#~bo+Y9HFa=(u%//ΰn:R~ #;-:R}_7n ./Uɷ^7zc!£ h۶w_˅n[ ï2q¤=q%~cMwҮCcO:餈 ,+WD[A/{vI~.p3Bϵ끑#Gz잴=믿>^yťuOEsMVӅPi~6˟^z=;?瞱A{6ҔR{;{nU@@@@@J'/ ,BHS[8=Ovak^O>30         @)N95JR|:Xqj߾\'*XflU+祓OΡSU}8@AzubZJ;{9p 6mV^- T]A\\gY3nݱJ.ࡈmv! y3\x֬Y#`{^pUZU;|?q\r_r!ԟt{#3ϔFNfF/;ү(ɟ6l ;}Re-wڱ:s69r!|r}^rySj"]v+y$EY?,ֆYlO.4ǟUiQ~xܹsBl} [;:eY)ym߃x[ekq :}. ],gR]w\mƮ V~g]r2:o 傜B: c*t9RɬPA\gY6i ;V㕽8Ǎ-cǹ f֖֭[כZ\mʖvus-N.s T_~ ĕ B Ffscȅ7w!@:&j#lKl ]pe;YmEk#l9Ja-L&Wk傥}4(pz :T] |eo2c$˔v ^j*o*u _w:_|OVq=?=[*vdHvn +tgWh̘1^[ 5fQ"e=vݲsxe(}'l#}8FlK4uTjԨ׿.LXxjW^ʐz=!/e>/`|A~D@@@@@({/=_( @x<^rm7DV6E        12FjY,X(}g/ P׮raOr[M}j…jРAz7B+RҐ!ҿj~בBecHaa>CJ2!֦4l`]m'-|(in&+ d@|AeR53ftÂB.ro^wu.`N`㏻3]jҤ?;@-0UCоOA?^>mkEs=wz衇ԴiӒ"ZfeѣGR_֕`Y5?$z]]uU^H#<;$O\o0A7Lt zWN+2QqC7/_ *sW_}ջojTtCJ-z xAl ~o;Âz'y Lqlx[҂R*i Ȉ7莳nWO]&Wg=OVm˷z&̘1#a     @@`( aJ*|@@@@@@@@@ Y6HONm{rJB,8/,!àAto9|={fhcۉTs;E1ÂHD/N3sLY@jU \oHA>q aa5 Fvd ܵkWu֭"gϖY@r߾}bu)*;Â[z;ww`;*PNYQN L+ٮA[˲D{Ϳ H<rP`́w 9+2       O^|        [SNѨQub& tAx Er=trhIguUxC# a}ԩS3ln:KySYNZ{#=`*붎m-wQ޽ vZ;Tu .P&M^-[x>#FuթS'֟ "Jz뭷c#:OW%ۛo}7:]:J,o.ӏ?( ;Su,|/)f%BvoiwmZpg *bm?CSǎ6ŽLtr.}ڃ#`a{O=N̟?;+ %(|a;?X'NT6mr`,j!*UWSOv\ē}R'F=Yf ;{O;w{O:duMOqQp`F^~e}k      D=^pEBR`䰀{Kq{:Z@#        jL*r!ϗuM|]w\(t)7%]㎓ d\ܵHetIe֡urkaX~ys=1c:( 4HsLZbŊ|\UV dYd]ڸ`__~ ?^wu }+]kءN: X/|IM4I]vՐ!Cԯ_?/2_u} KXV:%ҩͶ)`!%i5Ju%\\o}Qlva;w xO{G6K,ݗ-[i5m4b<7QH<.끙3vg!uV: z&wdep }=zh޼yw>7euIӦM|%PH$P+؅lkun-Y     @X ˞ DVSI@@@@@@@@@ )_~)}tIY+A .KBOy'aZaRc2H&=aZJ9䐴Q>Zuy~￯ZjyA97ֹ瞫w}W7o.fĎiI-TV4zh d5j ٳSzZ'pB(´ivrFwjt^ǾڵСC~Si/Fp.u*4O?ZhႼ~o{9͙3 Cpo u0^oT^]oZlݻ>ݘ[\R/|!)Ko2 MT0 z`;ۯtSep:T´ʦO7l+EBi˕+mq =ǯTR`CA@@@@@@@jM@@@@@@@@@2,^{I=zd l4 I5`?Ʌbil2'wtIO^(MΠ-`&C3h…^u}QG:8p^x֏r#j)SoTΝN-x:ꫯwyZ;c[XXh_y^ Z̙3S}V@,pGU߾}U~}wM'/4kȑZ`>)lVWI&ymAs=Sٯ\/[l)QF'~z//B9?]uU^ 1cB z#D 7,{YeNz7xW{dhaek[=[T(J$[oI={J+'s/25}zt&j-^8nvw&P+3=7 +V̽Sc@@@@@@@ < x         Vu-qGvד! ,_.y\'2E /{tizO}Zz>To*YxZd1@zuO5j[nիzΝ;:Of@ ̙?^61`a8v=ǝ(ؘ0.h탵|򉶸}k#ڵ6l_ꄀVO?k/i&u18yYYFX eԼy6‚,0[ϥ8Lr[²,@k„ ^;aS;5kYȞl\o1B\5h /47-GÛo .GcAZ'tRdp.aڿ% rJ#gA S_ ̆=:?㱌sΑ{rSҲ XȬ<8.r—/^={=$g 6lZd\J[[:szwr@@@@@ { |!ՠ @NyW,<>'J4JV        j^On]s|驧^ֆ@ ~X.DC)%Llp먣Z#GM&NuJ]VcƌI~M|}/hk٪Tb9b[0]FQJ hʔ)Ͻ`( %Z`C9}Xf&NVulmxFXVʕ_ ` v-4BDԶm[|^a{;ckY}V\uz탵]t 3r͛g}^oc#mA^d'zc`ݺutk߮޽{o[W]O]};v< ^[][TQ{}{ɵ{sMU8!\ [9F~\8vxvn$GV**`ʏq-R|{V^MmZ1i~IV l3Ԋ+kß     W@J PH&PV,        vjmG%pk$ߵ dQB(0ztIҳJ90>}瞓*V̩g[uX=ƭP Ø-XdԩڸqaZ\"a\gȂ*Tm/_|7^蓅_㏲Ν4ihuMݻwDŽ?ѕ腅XVXٛuo턵65j(YT oeYaP'O N~,$T=am~w.aŬY^%{>3 _~%ꫯ |^ȞZa]70Nҹ pQ}`aeAze!>9=^wͅ[˖[x ?K_}-vu@-[W׭.7^!gR;6-I3'[>\OrrZ;LZ#<9sEq˵jen9{򩧞-[hԨQ-[G@@@@@jE@ U@V$ @IDAT       "P/AY??weY E 3gJ+  =PK s[#GoZj饗^R~ҹ@okÆ ^ Lq?Zʛ7oVjԾ}{k.ojwi@׉…[`ڵwЂq[ΝUA ϥvE͛7w\H$d ײL|ժU^l'vm7/+բh!N'lks6mڤUj 6~LN_tFX;amK6l k׮XhQ9Nعʕ+U\9/,%u7bvyTp*Y[Z7J+sǏСCx]C :TR/Vzu]wiܸq9u]= {ٿR6ߢ]k/ԝJZuUR6rq}]vY|]p=P.!k\"q=Fa6ъ7^rB 9$piy!G˖-Sz#8"r6@q2go[>Uzu1"a     @@`( aJ*D@@@@@@@@@-4nY_J>@֯8 JGR*/2a׷=VzY´UOԵkW͚5uK7w|z̵{mSΆ5jsx{w &hժ֭RX`ۜ9s?kƌ駟da86:b^y9͚5LjwFL:5u֭^pѮN~- ߲ga& %pB{fnmm,6XFX;޶m[³M| ٲ`- #~8{.vV4ob͚5ym˗/*hmF>.ƚ5k 5z#;0z#};iɺ;4j(߿#gYgI"rQ ,3Ry)´ kxԩdlgÆ y(p`Iv[.:Եp ˰if;Z(Cp6=h[ږ:Nozv0 F0%?ivSÆ [YJJ;a?mM ۘZVX`DFTbŤ$__,^xv¾ʕ+6nz~pM6¦vG/VX3fxmMcۈyi˖-^طo#l [[\UVC.\PXreY0.aD5[YJ7p]F1chܹor!ѣw? 2îQ&M?лd1v?㨣i޽{9*7 _p}f}dC-زi]i^hՠAai@&H -NR|wY+wRÆIg]ϱdv{コ;d2 ^x{M0!b953!;իWN=ӕCjѢE.JNnw}wN֟J#    S B8O@\pxrse+b Y         P"'Gz}wI]$]qaZq9Xطޒ?^:T's! UΏ} TREm۶־`͙3'/$:Զɓ'{l[͛>j ֡mW-|N:, <[ljdŎֹZu||[0 1p4 ] 8 U 䖀7|v_zfϞ ~`mX'޶f͚^^ډpk#lVu) Xlǽ XO.mM=?ȶhǿf ڶNX@A7)-o`6mڔ>m?}w6¾~}f͚!|s k#;,SܭC|;=}FĶa֦۾s QҥNrIıv^1wH.Fw,)}׮]e<}r7Ȇ.]ݻ{m{-=S]k|n6[_~]L6 sݍ}z*o߲3m~,_p֔)O?]I9//;z}ʲ>V;w-sQF6@ ֻjA<ϱ@u@@@@@@@jo@@@@@@@@@ _Jt)G C/u(zk f(oH'(  =aZ K"ҫWn.иqcٸ֭[ ͱp- g/"/:,VZ^~Vڵͷ3lz_W^:21;eڵk?C6Zg+Wz!t^b٣uh b9feDPd!ᄏzNbӂ/l4?"`7{7[}`a\b÷::Gkb.Ķo;As6 ]m#5}vv 凖Y;aaE6z]RJ*i]wxݸqw1o޼B Þ/6|Ybż o6Z{U<ڈ v.6v!m_?Ķ9MsF؏=4;v?h^NF7JgބwJ/СCA_O?Մ ЪCzav Rl׮{o[첋ljלYtݳG 6="͚5-y :u{_vN_ [n_keY.7A/8Swةu@\$4k&߰h;mr rEWdS=ߩxj 䮀|@@@@@@@ XeEi@@@@@@@@@2 XzO?-~u]ձ)׿JsJ|<;BycH'$qR`n^f͚D]V煰t" vN.]u;2O?AX(Dlٲ%ul,0:\7D+?{ԂwSzۮ?}OmhaWSp.jN,: p :~M 1Q'EmBc=\IZmm/~hԜ9sB,,ڈB&-6qf6S{/Q 2ر_TYklVw DcB ^XMl࿎m# I-[zcQ!m#b_!R?s^蜝GX0uY.m?|-(8ۆةm? N k76o k+\>h2qn~OmaS <{Dg^ w}5Ⱦ5J,`r7KZ7&?[k^.ozb=/vͷ.qg} - +Vdٿ%J, ϲg!H ͺmYkCI}Xx1q5\ā 'J7,wԦM@ cpҋ/Xũn+'۽xj0m4#b9 @Vd      ;P6         a?^iРրr#X`XåwN,sȔ+H"uÄiej?nB.\HV,J_[Z*U-,l1,8ư̾j?7E={~]Jau H`$ ΰNjcC3u~M} (8ɀ@ qҼyso,mV_u]QwkyU.m?DmB[:c`{okSbFX<*` 6ﺵ yM-d%bG;C=fu.hQ ͜y xڅwED츍&|]il{Q6\HFlaE% ޘ2$wRKzܮz#5xQG+sA~?bS;<;6т8!=ߢ]޳,0)SSrU}{ɲgu]e;ؠAoT9([oz >ɥ9fI' +]|q.j=BV [B v˵hPB@@@@@@\ P+>uG@@@@@@@@ <ԩSo "bKaqTt)G/$vt9҃UJƤ´#ҦM&}ݬ0|ֱ+%1HO={FE S7Z]v>̙#MdZdrVFByVz>)Y?+E v-no LA Ӻuko Aq)b ru,?(]rtuY *Cٶ<hd(iIG% P_FۇΒ @n,X uu :ݥqR~֌dْf}utj-ZF~Y;J[˅dduCt tqIÇKʐY?fΔ l9z/1sƍEUVZvϟM< @ Zo@@@@@@@%@VA@@@@@@@@,x%::, Yg~[8Q_T9kAŃ'pK*]sMG \Rkp#U = 6_~9FCzm Hj5nV Ժ^]l%B&eBˣY ͺmYMm|H$p4h{СgO%K߼#6m}M6R0*UlӦMEnaKc#PH.@ +@5jde       f¼(;        F>}:uBSd @I]&]tԭ[if{NX)*:*\Br^]Cn,(UC ,[jTzE"WLX#`7ju]u'ґG5G|륩Sg}n]o=Yv ժ) zWfMiDRMP< `|⋋}# F {(*T:]Rg1 Ԛ9sf1dF?ëV5z @@@@@@Z}@@@@@@@@ 0jtR͚a(-eDhU.8C.Huڱ[ ^ZGzqީn W`ƍTRp H&׿J֩_GIӶa6*ɂyGs@!@ ,\`FY^Qi@矗6m&N& RٳgZG7٬Y40ӣw-<j@ gVZRzir堕47˳uy~}rrӅZ/Cb~Zn? rF`ղիL(       ²('        R`r'e)4 xnt=MR&'R^ks9G9RKYXq6 JnVkA9' .k NQ@ < uW#JX9 Pι6,rQ@-zBg߿Yݏ1#gԞYvEV?y[xV)>A XH 7H~}tMq22~\Jkp9(zαg /( $ (gFF"}QJ' % n aҽY       P "         @i,|yoҮ!,?:֫Qhy5nԽrturhGfC6p˖-`2ҥю.9 A@ /-H @F.׏v֝Q*6m$ 4@ڱT,Ӧm ϲଯ#hҶm45pԱRj/kD!`Ϛ^xA׿m]߾K \[kрK27lR@VZy3g$P+ 8jŁm@@@@@@@ j`'P@@@@@@@@N5kޓ|0;GrOWwߍ/{ƙjB&,oCBˮ]3[>^vn5oR#@@@@@@@@BXǃQ  ~4d4pd2 N_vM ֲN_֕40 XVX1\K^(],9 tԧ1u~k  @P.5 Ji(d@nҢEgCQYegm,լ)u() ,Ԧ bA܏ &㏒[x=c:,˥]v)ztzn=I7Ŀψ/sۉU|yΚ5kVnQK'@V>@@@@@@@%@VvA@@@@@@@@lx5 V%W/ibɦ S2Zr}`'yR^gmYւ;8a}8h0wx ,`}+m$Yfi.C@-o@b6HkU&M}) #@\ Y&,״iuGóԉgvtUv,F4f{EónA:D s†cK% 2-[jΜ9D]@jU@@@@@@@+@Vp %C@@@@@@@@ XoD;$ q5(:KԴ)(W~͛%tRzeNp*T@VpwOJ[oI2dV@,W:|7nSTENϙMEH@JR.GIg ;yYeZH"I{q kg+YY$>]z1ipiwoWʗOQf\!,Lukg \XvWj\\̡Ejӊ6UVc?2ɶJ}@@@@@@@ ;ʎH-@@@@@@@@@ `bsQJ!pҎ;JK)>G(^sMH$<K瞋s+`Z[l39eICHݻL($ ץwߕ=B2(x԰a @ +@Dv?":~~TԩtaҕWnհagh޼~޼De -+VDϩ~Z4Ii' .+!K0YnoH5jdI%F,džZj{=-[Ԅ < "@\RZ0       @ .@         *i>!w~Yzq顇UsׁgFg_~1^lI* yԥtՄڄjmɐ3/5o.|sT"@W9R3B2(vfԠA @ +unE>ژT R ̛ ϲ>&O,fhx ,u,j%+M7B>ta2\Kb@X`&7gƌ}F;–K`p^ C>宀Pvb#X֯"'U4 "@(I{Rv@@@@@@@ ljmQ^@@@@@@@@uu챡(*D G; 4(bD  uZ ҲNg}dZUJ:H'uVtbƏC{qqb@P`f^^~YZ">ltRZYXi'`-DK:0/H jѢ֯_EQF0"@ C;"      @ .         t9siӤ;%|$_*TH,sHJ Ͼ։K^*5o쭲L TT@Ly/B/8ǎc4r[:?ܻTꪩA@ vcC)E%PԾ4iZ2e=]`1oAz,}eԶGóKr͊5XDuqǹ{) EgGKKJ;K^+rprD´lg}ސ#UX|*VvءZl-;cƂdU\'iY3      dZYK        dZ୷5=2]@Fw_˶>@I֭ihx֙N;IW^)u\h%]#]:۴iSЋI `9׬)zkV*@ 3gJ}J v眻.rC`h= ʍM-H@pto!@z,eXiܸh ]կ/x`4HۢZvϤ4Vw#OWժUOf|ڵ;H/,2rԡt]w \)P١jY cal"t2ڠ7o7okܹҥKL@tbZ-@@@@@@@ pjnP @@@@@@@@oK"UP\8Qp8!xׯך5kqQF{u.mӍ7:n޼Y[\RujcYgbc ’*FJ*V٫ujGjŋ{:lr#n'WV 傷3(QR*UDVR$W__Ε tZ`Oi/G$G,`Zr2K(L[7GDۚ–=҅FC\Nk%;w=y5~x}Gt}/.oKf|… hSkۍ9uTgc89cӦMy֙J8ko^['taJ: Z:-j:N:m013O?:>1ײNmlذakdqh N~l!W_- t=.[C` X_Lr<]v%X4 @!R]72@$h!d-/pҔ)wկ_?]r% l6wVO홅c#`3س e$5kmHs g}?BvlF?4̞GmZ0\ΝHf>Sp<ݱg,g,^1穧?YOz/0@-wߍ>gkͥnA:P=b#`ǰ=޷iq_ً=c4iD{G1oǹMv۱_]v9؛.Xvxqncݎq{mwg͚/̞ ʞ5ڱnǷϱ=sF;Kv Iv;΅@@@@@@@'@V %B@@@@@@@@ +!EyW:ܥ謳_Un)m!Yq!MyZ6m';zY'ka\2_E:Gu~g Yw~Y?1cF^u;X'ѝu$hY'Nk{Pj(:0eN?}Tzi5}  G[{OI6#orKAuST@n@#v#GJÇKcƤ.LkK,8pwO߮ ~mXa*~ٻ0޻&&E)""kEyEQ(EEHoREt͙}]6m7ٽI|Mo˙3g8uySVS4FFP+nv9E@@@@@@(G         n ֪H'`Dg%-iQMi&l֭[mP: L(h@E'6kذMTxq{ V@hkIoztcǎdi0͹i; RիtwN; +V[VQRbOY21AcxU3FDEhZ]6AJڇ,дH~"f$9v[@ 5p>":D瞓9sȼysk>|lܸ4ђWweЛw%M~ɕVjUiӦM Y0ݖe˖,RxR͹׹ҹSڹ s˗c)z_R%{ lbH'J)o)":]L8?_XohB~XHLmn|zr'Os}6^w$yIT^=ԩ9)I(';wnR獃)uQmgΜd^Z7uYߕ+Wi:ׯMEǨu] ďmgs6@@@@@@@}$r>E         G,Y"Dih6F୷%9<&rԀtz[n]c}IA52E"sz) (NJ+h S |}K.AO`pK'']*Ul; ~Ip* sҟ;E;$O]"N@ |_=饗Dz5P%)&&5q&Yr1!)5_"׬Y#k׮M)Lq1;ҹڞz ЛQʕ+vg9rq*zMN.\h;s]]:_l:ю&'Ԣ_rQɛ7o<D^/:3g(l=MF@@@@@@b_Z!        Y ZH ,pȻ<5EmܸQ~WYz J4(m4 ޮ3YtNfi# hP% p۽{ f4`ޖ-[&_~߿߮4[UF6e<#VJGQ?gNy)}uHܹ"7,p=E#uPX46"@ TCdjE>̛'G"TXHsk׮r=DbԙJ+LfU&;~3֭['TKKɒ%mғի5\c*430+1ZLDaÆV;wʦM\oz8y򤝣\n2\z$˓'Obrn>yJ= **t+=ϋ/no)LK|&c9pM6{lپ}u@5< @|r"W^)YVPxp&bDž;&!C34nP91cJ\ 'ҼdW?&&,#FF5(k֬ŋ˒%K|ʕ+vIɋ:vh,VjI^TX \&[3dU4Ɏ&YzuMُL?ou5&;\rԫWό;p-I#f«ruY3c(ZgE_~e˖k&<ʕ+Mf~v)S&{M3Z T vW$iΑΗM{m6\Q339ޠA)]t:bM86 hK-Z<)(X`t6V#      q @B8t@@@@@@@@G@jl>b+DBE*!I$SN@t M>'0@O 5m&Ϊ^h@JQ%6lhom`\KMkk.&ӀNׯ_~LPKmM&%KoGO?-2~@Q iػWL`1E>\DD$/7o6ߡ܅@}ǎ%$& -B P k?ć̜)2kVܹse?mسg̛7/X@.]*̇Ĝ9sJ͚5mMvkԨ!;@ 4LyMo۷Oܼ&ڴi9MJ? h&Ss4^>Sp0_?uwΜ9W/,TQ'|&%R qsǢzs{Ŋv}y\\%c&M\&yX([Mbϡ"EXMEA V|gz      +@Bw@@@@@@@@\$`D"O=FBزELP< a0/~рtg϶˖-A銚\rtDZe˖ ֩wȑ^U RЮ&+b;?n3VVs͚5ҥK3! ԧ(s})9w.z}tꔐѝU IN85p iB={F)ԍE`߾jHN*A?P /!  1siO&cנA6nDf#Ԛ(uV m2ف4P,YlFﲚjժ5+!xhKfK.mghʨQUd۶5M,Sܲ'.9lҬӺHrȪUbΗd/D;v3fLf˖^wuo߾vR(Y@lޜv=zԞ:Ϩ9_{5yGl JVMqEjirM6FB'zIA@@@@@@pt~U         eHe%/&0j gk~-?tIh P^ԄYM4A4h ʕKF%\*PX1 {sI-Z$ͳ#Gǥ|Һuk{wŋwVqZE!5l01A脴" #@L=+ңGuEϘ)u숉_I Rz@W ϶)fA3f׋I6*HI+[3{nk>}Dd^m)SԩSE˗O7n,~h"KHJZ~1"\w7o/P˷ {H}AKu^!Vg{C\tmrd-akr#FxpÆ weܹ&a6$:{֭[KݺuF<w4nfw^; 5 6K%31co|2LDiR-J֯_/cƌ/B~7$:t'xBZh!9sLX(V\]ݸqL4޺vjQuQw.K3ܑYȑ#6nϟ_ڵk'#GsG. V@i=y<Y|L0&|TRtu4ʶmСCRFTJ} @|hB-@@@@@@@,Z        D"˖4j=mx hO+Ui{b ۷ WZZj%+Wo޼YV^-mۖdZicfm d͚U(EݻE74;d֬Y6("&BBCGz&@馛O޽DF561A=Cvᅲ{d`$ʨv. hҬ~Z~ٺu<2g[T^~Fф4n(mFZj,YRvH~A_        +HB@@@@@@@@@ . "GSi+ L\҃Hѱc޳=5֒%KgI|O.y".PhQモ}ɰal6mڈ|oH  V (QG*5kv[6&#@LlbV1nT l 4V"nh m@xhDL" 㡷kVo7v iu&&ի(QB $-[Md-0`%Fa b_ o޼6A՗_~ij\zfܸrC8qnjժJ>lg޽[F!W\qd͚5`Ě@2elbƍk 4 ?kF+VHr$-I/!@B@@@@@@WZѻh9        D`D*VtIh!,_.cUWREw)DL=rW˖-[d̙6g'O2^ O<ңG?~9|˧~* 6 iڵH'xiPIJM8modWQi4з O:vykϋ*T~D2PZϦCbD*W3';O2cD&O5 ?{ӄÇoqP۬Y/:uر1cȶmdȐ!Rz8d@ܹo4vΰsO9{& w+oylٲҿwI.]$[l$!͏c\޴i;־֪UKڷo/K,^XիmkNMw4 ~pI)\K @@@@@@@8*鎧         >ѣ?9o_Ԅ@: hK }{{$(͓?{gmkd MzʪUlp&[`֭K&9,Ϝ9.c#013"MnjCw ҮIZB͛7Pݻ! 0x"߭MMH?I ҩS*IagyF.\(_}˗/%x*%e˖I֭M6R\9YfrUWUHɌHҥK;^ѣGKmSN M>Æ DZ:_q( 9}С_\r,XP5j$\sozMu%i%ܹ3M2_௿$-D@@@@@@9        I`ÆgxT# ~' r%)SԄ7/T\Y40֔)SlB]2xFD-Z &ފ+ɒx9rHDۛ%K[? "?Hdz矏&\(pXlDƏd8FnٲOm-F2FZVgMer@p&Ժ"_[N*7xCjժc&ӧ4h@J*eƩ| UT^5O Dٳoo;#ժU6yO'NUʠA|c* z]vZN>jMςD vp@@@@@@#jΦ         ~G+Nu֥y?}5MF&B~Eݡ)ؽ[db dժU6(OdΜ9re_KƝ&`?ԩS'J5}'7oe,A%ibӧGd[Zi֬Ymݚċ]&&  rb-FWi-^@/_/m?)Z]RBVRH\,a V1 hDqKZ@ 4V۸&o馛{r]wq97oVC|*k7oԬYS~vޢlٲb]@u~K]wkb3! /#!2glu_^:vhFN<.:t m"-_qB$\ wFp8#a%G)=zIƎAi}2f}Ht=EIL~ϥA3Н#G]m:kJ…c@@@@@@bjEΣ         &6d\Cdj.wP-[G}$@MEmݺ5C#V2iP"[ףqIFvڲzjܹsp+T׃W`s6Jڵkeذaa #> 4oѣG^؇7_~Env+W_Hdb%VDx#Zo8  #WLE D*U qN`jyR֬ Vx0y!hQ1_%@ }4%Kb`2|p~_˗>Ψ駟^]vciMQpvOj;vIfrL̕.*} ?˗&Y~41;##KΜ9eРA`8qiF4 {M裏,F"F c۶m7zjRps#zy\ P9sFt"o<#ҭ[7g ީS'$o޼7+V6/NիW y%JMrJAЄZEB@@@@@@[Zѽh=        dк&8OT%駟d[VZ<`j-Ma2EeKܹW6zh_? K"ZfJ(J[-j3g&Woko wq\tEύ` ys1PSW駟8P\j׮{)c .Fm΃H4m4,UkB-vR@ 4&3{Wl;@@@@@@@ }Hl @@@@@@@@bL` 1 DիrB[ 7pN>vm\tĕ. ŋ-"}݁W`T <2c x,RHw @ h9skҰaCYe" LW_m;u$pE˾}L7d/_>+O l {H0qt3 -ؾ} h"ɛ7+WN^~eeDj_|![l;c=m޼y2n8qФaW]uC'[g=&L KI?(|3$mȐ!^zyP1=W׭[' 4i_tu?|]_>euI&2}tP]zk\ 58wٶm5J~GV>uꔽ̙3^Ϻ5 ^+hѣG.=mygFB2Yk4.6mW^y^cZiݺHLݷh3}?D(NB-`ᨗ:"'`N1yMWLm@=3g X."ik&K|_JD^`m_5l a3#fLHJd&Ժ„ZלtMRjUu\P $Iԩ#ę eK` 8ϝ:}< 6!M:I™PKb[`%Vlcz      1 `~JA@@@@@@@@T !(kk.sQ.o͟LwxLjxcyZjYr$} ǻw <خczf̘紘Gys{Zli6 @} cyoO?)S]碋.d\u co[IX zX$rHEׯ_eυ  M0cxL @I,1/v2u^@9s^A\%쵱B osС#GxL0EOv|$ ii}GZDžn$r&+tIݷZo>cQUҾq᪒z",t >fP=bx<+Ǽէwn%/`A@棪_acl0A\<TPxcƋk9#SfM;6<}Lj3 4's 7ر7qsǣG/^>6 Qlgt|Z_^zK/1 E<:dst,Vo}Xlѱ{m[|LNnѣyO|<'NOxg;ww/΍`ukg9}; qPB髳/º;s۶m~:{<v>=\u|Iꢪqqx=EMߍ;I t@@@@@ _v@ ~Nf:O @@@@@@@@@TXRZ"&菘$6A첇dOLp,1D5ɁduNk$&^1z;JL22dHk݆ gmI#&}Y>[L!^}LtV>h@${v Ydjb_0^ݺu=MNuo )&p}$I$&׎;dʔ)b@LIΞ=+/>ҹsgxN\TYf9cD <'zN깣DubUI'&@h?T"Ϸuk]_|ٟ^RW]&S1ck̚5kQF4A* `РApBy7$͒/X$1a%ytry%>k#<"Z߲eKx^>b^Ub~$*'!2bO~`3I`.1DW}C畴o_~ߍMԀ@O؆׉o- F  c.%k9Cɯ*l1b}2dL;fzvHu&wu>-Oׯ__֮]+&}ȑ#zj;odlwXz=ֺtWTv,\&;v,q|뼠cԹ5s>{/}ٞw]m7_nkk9Frk?-s_ږ깢 ԨQq,>.c!f_碯 D_ifĆ3hdɒ&ljqǰ:Q w#V(      q-@Bt@@@@@@@@" r^ل<Gi@* D]f* 6O[.`@Z4 nc/֬Y#6lGy.l[ &/xHo "74 uWzd˖-rW˕W^)ǏoOl߲el5MEX={$f .Vz1ǝۊ;~Ijwhʕ+7P;+VhDٳg .1bk.έ@+:gK~=(fKҼysфtށt=纾>}_ 4z}mI&`4Qjui^K5k&<Ӥ7| >ֶ}&ҥKE*:-B'\C}/+ &vID*?.>98N|_`K}9"G=+ORA @Љ%--ď&*Y2pS3ڱcӎmk μ>f>sFκd|%kr̙3</gϞɳFMaÆ3dHŦPeOiRMp_Ϩ'[n_rykI|Ej*t[%mLhy uVR3L_}~͙չk$e~-1DP9e:윒^$3>z~V^mqsgy8v`Bӻu{)vuFvɋLfpGwS7oTV-WOn_Nk`/Z&$P^u>AW)' "&ן}ěy8QB?KX ?p^P34g͐ͳQ!pn{@IDAT" XsF:ٽ{wd -ZKuH+I˜&\:9d8pr-IS^~eɑ#ԯ_߶?ƿ:*UHrQ vlݻɚs<:b \nY:_aWJOj\|M6y?m hb7<%/o$)s?\sNs5p<ϝ.{6$}DM>m>h9ߚ|O>oݛ)M5hÆ otTM_S@ v:IBݿ @@@@@@bCZ        o'z74&]}a֬Y.`/+W.ɓI Sw~lCgyc=^#j"- K%ꫯ)S&Ҁdʽ+wMrJۧM} 7o^ꫯdٲehP@ m۶x1˗T$\Fn*@o߾&K1>'[͜9s-[VjԨaj3'1бc<49_M5A$ol26m/4z5C{郞]vK|MUѣz꼐uiÇbꦾNq-m0'|H&dszFv믔9+Rʕ+'ҥnGS T;O˼ulR糆 t>4Rf̘aСdfnHis* fB\ZCܷMьL<9ҚL2IR4 7lZlyN4^^|E?9gtBk֬iM\9$/#_Js9 yl'{6$5}+:oڹsgyBΝvy*Dyd̹.Q: Ѵ$d;MM<=6{I@@@@@@@ VCz         } D"U:u`K.4UZn*k׮5I(IJ,i ?LIiٮ{;v蝽뮻lcW\!s=r 7kfslڴMUDcN"!' ֟9sҟ9ai~V]paiذTV&7$3e]& }k֬TPsD&FԪpt}'8Me̘16 դI$MԤMI&zӤwL p]{ꩧ믿 tEw}糖`u,XЮ >CZ0,Ə/I/Nqɯ*u_[aToƍ5> [8q9Ԅ`5N#F6h`^WNM7$VOjQg4i\wutΝSϗ/Zz˭*pgϞɛ56*䍤a Rz{%LL_XLW;=F F_w 5x{ߗtQ# Vd\С.jŒ%wඦ?HM5έؤ֔|xՉθ.=gKtNHt |OӦM%ңG],II>oo;y$C4Y>裏,~/ZcZt\~E@N*/gA_)qms*z2_S~ٲe :Td<}ZRs۸5jع_t~DZM:1 &3`Kr:/Ҷm[ P܄i\ΙD>;S "жt>XbyGeÆ vy8+ع`?΍@Iq;ν}Xv6D N*}^H\_dn(ͳsٲe KǫTj*q8U/ {Oۘ;=%         R@@@@@@@@@ &9KZ$>:j[3mzcRۗUT>iyLOڵ== .R0Ⱦ~I gOٲe=&9G x֯_ۓ,|uR 0"3fhʚ,X^JeDj71/c裏w挴ƈo!a趽爴ǎ3s fR!@ f;c)5$oю맴Xğ 4ޱcG4iqj5-R9r|yW:_Qhu>{朝pCꋟ͇I${2!1h ywޢ-&I^[:t?뮻N^$skAWw Ai&q^ >4f\+gӧO֭[G"    Ă^0 bb7m35i~W#b-il5ܽ @@@@@@@@u%&kݺu^K|Zh2_ETP~DZ(%p dZZJ, y5$&^cԪx^h j4?! pdnZ zt뺚;S֬YEo NN(OiwΤt&ow}m2p@D[_&2s Sz+NO^VHc%7qٲe_s%>aZhG nW_ٿRg]odPNZ&oni+툼ɏiu"V#`bJ Ml%m޼Y7on;%/p&S/U卤y :arܹ$ԊMJ>>}:f?䓲|r;^Z5+4Fw:'|:L2-mB0sF^/RYbK:7)iSq;N Xk(N\FܯYFk<'DmYtY?[K6ED;ObJWƘ$A@@@@@@b@ h1Q        S`z1έ^zk.Dϓ'Ϲ D& )R\귭qٳ<Ҷm[drK.PoD9LT-Z$wA."ȕ+#bZ7nhwH6}IR`AQ$߿iO;g3gΔW^yE~{>ZJTg ^E4@OJA8r$!~<9rD0y۶mdJ2r[}Ƕ" v_I9sNZ@!r[Μ cM/˵^+WkիWc&16lu]&ֹ馛l-mzWx'ImSZ/ZƥcibݺuvWDr*}Ϲ1v6̟~⋲g{>f,*Q:G`1b<3ꫯ&a:RjKz=ۏh^0s~^KԩSBMs|)$-ZHs])U 4bS`߾}RH)6       vLS^ 5         ݺuZ4(x 4~hJ EnAL`;p.\8uNsT牻Jd֬mO"h$*`mKʖ-Xɓ塇k׊&eȐ!@!6(0`(QVwһw0n!iU.LfϞ- 6qI%.ei@QFY 6Hm@IM Z&R_{40tŊ"]{EK@ <zriKLv!eʔ fѸ^Kq 4!}I$CE/1t <0rbƲČen&S9wK)0p@yꩧ| s='3f̐mJ>}lp={|g}&g̗u/zkby 0ÇyDM&dx,&1]61ù=K]nJ[oɴiׯ_?nb2W\Y>裈lo& "R[+e6Pg{f\#hM )     DL/hFGi4~DieI@@@@@@@@@0df1z(Th n0̤jdɒ4ϧ~*Æ AIfͤGrJ"E»i'Y`Iix)YF籙2e2 fɱc$OV5d禛n\r_9Ν[}QKk}rmIǎ%[l=8Cbشi|{n+V{&< G Ħ)&"6-B@@@@@@[ݡ7         @o9}ZRo- nTbkMO [/_.K.z$[jJ|MٲeKd6V H o(P@7otY4&ڷo|rWQ}bŊɴidƍ6ҹHQlA\'"_~)s[+ Tȑf!]FԨ!?Ȝ9.i@ r1y[䯿ݯi2~k.yꩧdƌR\P5ր_MxScj {7<ԹG1cHný+ʕ3wwygĒiyFnk2}t*MwqL:UΜ9JDsGJ3P`&kܸL%;vSٳg{Ұa AfdԨQ-H7aŊI41!_ #^e˖s='׷ ^}Uiڴ,]TVZej.\8];0zhڵdϞ=b%VhW۷~pEch       O>_@@@@@@@@@405yI(D-"#RR5[i:b eҤI6^֬Ym -Z5j$rJ%bHӢfΜ)3f0AѣGEiH X,Ybt%o!&ȥFr+ԍ-0m]w<[@09?ʕ+SO=eoׯ۰a$[lҤI˥uRn]RetػwEo7o%JHǎm:=r̙n vC[n/&LoVz)NsW\qiƌ7 v43ݻw˅^(;wC#SLFK,!CD $Ԋ(/#y.v@@@@@@@˿"        hB:%@6%4bŌk&&áC~IƎ+j׮mV^j2hкre\2.@O-yٛ>>~/_|nljʼg7- ! 2n"#VZnDMq +LhFh@8ЄZl.RLc}\ 硞Z}惟UL:U{=; xtYf\ׯ/yrR!qF;0{lڵkm,M>wwK۶mf͚ vBVn'Na?|2`{k4F$aHI`֭2g;gܹ֭sK-_~Ү];TRJfsGھHMuw`Vw*-Mz" bC0 X"%`ǐh}, k|0j$"!*EJ}lfòs9߹aNrߟ9eK]K.CoEjpd       ʹEu@@@@@@@@@'`Zu@@\;U,UWt ۷7[n첂|VgсTzuX]NԡCo jp0"uZ`ϟٳg{5kVZy!t7tW5555V8 ,ؼÄ!n_H;J/,W81E/@h ho +F y/.wLկ^Z@ ԫ'-ZLT/2o^Z ~~YÇŶiFv://-[TblHOJbt͚7o7W_i̙ڲeӥK 0 ٱkdɒ aAY{f:wmԩO5n8/P&-`nzA JA'b"{noq֬Y1c7_ ɳk+9#{l N_5p@{r4gZ6m߾]jES}#{Ci۶m!@@@@@@@ /uf^X@@@@@@@@pj1?H'WREfkeZZ dEl~75rH>|UVvt)ul+˕+2r!`N .oƻM <+hgU$.Y 7FӦص+3L׻J%J4 UBFs@ )ʔ s P+)O>jMȦѨBhРlkmڴI_~>b!Cㅐ8EԶm[oЭB+n1sjڵOvw}k׮x\ǥꪫfa]4o~gtY؎صW6m4!?DD  믿B̙?8{Z1;Sݻw>%Bpخ+Vd}oy Ԫ]v4ž@ [nz1>2C@@@@@@ȫZyc}@@@@@@@@Hz rj5jft).]tfջw ͛7+_޽{UH/lȂ7of͚yK{L1_ePvءKz,@%Kh:t萊/}~w f Yx}iFiРh#@,.TڲEr5eZL @ҥ~>D[ջ׿ȍ˽wA+,ԨQC\r7[G,Ξ=[Dd%Ǐ.U4pa\[WU+W.4>\zj-^yѢE66nX 7 ԩ:v(!ySjZZwϚ5KP4%+/q UVYK{\nC!P6FnߏoVk֬TZ5oo߾9rgqa^{5}͊cO?!;GC@@@@@@#Gm@@@@@@@@@ ֯zNj:R Oil+6٭[7o{b+WX!+fEhԩSsyA[^ VI&.XN>d5lPV /%%K E UntD+Wf~^`fmT7Yp}&[h/+j!Zg1!q2ֱL ~nJs^ @-$  z iNb4 n{yIIԝ.Z,(kֳ{v?믿+,dĉ=zZڵj׮Mfvo*l.S ܭw?7Vl2E۷۝FB3۶m[o&-/Rɒ%եKoܿ.\mX=yfoezc>6cz5+m,ƥKモ-׮]+:`c0Ǜnɻ۷oϰf_~m1"&M۷xb'jY        @ u         @M50 [ V VҊN|饗fYq1+hAFlŶxZuzZ\ʄ?k855UV H4Zf7[:UdQdx]ϫMBŊ'<)S #p}oH| =p^@d P+6}E .g^.[^3fd!մp(*RDZ@3բE6Nw޽{uWƤv.1Ą %`_o7TP3       @" '@@@@@@@@)ڽ[T)j`DM x_t? Y_lЖV }gZn]VmXbEծ][uf{l-mǶS٣7fVҞ_˭[fu .gck׮W 6l{=eA !^yEVM'!C'Hj^F^| y(Ν`v @ T.W@_6 !2e?gjEd'cOlvoOl>YPl[6Fa)g$΂wRSSf']V#f(Vٝ 1Ʋ,͟[Кq7q-ƍ˂׊-2n6㈖yvl׿]?߾}Y[WmivG)q#g׮]͑6mvcNۮq ҲT2NƍS߾}ci7@ ,P˾[&@@@@@@@` א>?@@@@@@@@&cGfN:)` 9@_sus6g/dg@^q3X,[qYfy!K۷o?³dɒ^j.&r===%Jy [g>ric'?t x-/k?hvl׹]lydqE- דּի':/UTە,[L&Onh >dB @@@@@@@ 7#Z         P+@'IՄ& Z137yEѬ͑MV$͞/]4ZNEXV l|\\9-[6k.SؖVD ˔5=Pv)>V8f+DgK ڳg7G>ٛ3Ν;V~OYA >kҤ (լYӛ͖ dSœu%K')`tҟ}W @Ԋ4AX֛oJ.CŋeKEhN0>uΝb7lؠg5E6͞= |'onA]%؄kEQDl+l\=`xDlc6Mcm,"GXX&dAG~GAgXhٹ.7Iܿtcm횷k''[ZJ׽}#'>ڶkتX}I׽y2sov]׺خoƆO9ݴiSqYgvNqgq㼰1 d>L Xj%7       j%w         P^7rLJ@.+W^=oӽpm۶yK?ɖh(+gK+eK+fr ~bŊy[F+ژ}ŒV(hѢYszn6:as[8[xw Yq>`1Cli'5g/ h+́ rxuj6kP /̼_|1 @ܯax[I@ u ͓l$ t$ݿ7fp$hŖ-[1 ? ,lLԒ%Ke,l(l'l\TR>>?Od5Id_ڸDMsm\?I?խ[ 2;w{9onvX )`cw6&fsOkwkBl|ҿ[8ҥKBq]+޳_n㑑9]|ݎ|nܿ#܌AF^둡b8ְaCZv=- ;0+{t-x|(|&\@       Dw7K5j2+ˊE{Y=+TkeʔQٲeٞ[=&2wߕz(:g }WW\ Hzvr@ (`Z.C  W&MFVN IJ Ȑ̑9') t c ٲq9r"{ȍ<59..4k?2k?s{9O(W7>at|AY /GyDnXB(5j5$#y?/zy=׸ܵ \η'1J[ٯukݮsmk=_l/w]wuھ uctL X?ٍ&@@@@@@@ SD@@@@@@@@@ Hey.v@ʕ 4~TKdEdiQH{ (K$}eLB06#pU|E@nݤӥC@x Ԯ-<{6Z<;Rcsetb:JओNң>{_=zөz@1ɪUFSf~5t/46*axgէOƼM]v+T5{       P(E e/@@@@@@@@H+PoWIr;wJ1飏KczX?^KRM|M@ /_/͙#M$W\4/[. ~Y*Wxk ?P+>G )piҗ_Fc@@jذ|M͘1CTΝ_Zk׮"֭ cl"Xh>s|q1!P+. XVգ~       PpJܐ=         @ ')D #`E- X \tԨ䓱<*B l.M" -Y ?Jo%ԶmZD@w9D]'iٲDA |g)}tpN@ Խӧ̙3լY3 >\w9!:u"EBXSgyF7VϞ=cz\`j,H]viQFt        ,@V\        /pTx="m+^B8RKn^{M&{I))R߾lBc +2NuE8A@jN'. ;JKKӦ%`!8{~\/K-^X#GرcդI.48u뤺u,g _w7~?`BشiCo@IDAT@@@@@@Hp=@@@@@@@@(\ *Vpzx,9Fv&3Ђ>@ o-`Z&M+(*!]{@ ddHU\g+@ ŋK;KӧG(r#ЦTgYu@ J(Cj岀oY۷׿dfI.vt(W_}Uu]w{z!n 1!@0       @$'n"        @X+eB lj%N{ 7HO?-'N "m\VD@ 9͓Bj޽rś Ԋ;C t&MY#Po3ΐN+$@*U4f}W;q ;O׳>zKM4SO=|M}֭Rݺi3-??_Zsr.aСCsQ-%`Z5k Wi-       j%ɧ         w[Vx޷c b)l\=i믥ov쐬(٢Eř%ΝlJf[n2s IxvYK2T|* @U8'PԺ4mZ@ w JMJ'gf#R6On-Pԥdp u7jذakHM4)a}B [ٽԄ&˃… 5eyy*:oݻs1 P+@@@@@@(Zcc@@@@@@@@H6 JII^߰ <ԡԾԮt)wI>YdU+-U;VϖZƎ kh7'0ujf0O>7z@ ddH^LiI@ xj"8Z[7V#pYқoJ]JKhd1!(G%KV ջwo-^8`=B#jխ&( =ڍ'P^|\rJj؊5Za9S@@@@@@ PO         %"rw&M2ör6k!Pp!C7ސv(\`Ҥ,%{@ #M Nf@j@$ @w͓ Cki#'wI⋒|Uf?ӥb#аaCw/h>3m޼Ym۶-ܢ[Ʀ͒%Ucp0xk:t)-[kQ[D@6mR͚5 G@@@@@@Z10         V)--1B/WS'^X1k"PW_-HR{f ?zϖlxYᇥ^=7GX @r ޝONn z@YD@B :$]Tt'HgGv9# p|3l1!(Z~߸Vt)0?DŽ@֭Y6]$k.=sT2 7b7a}Ϟ=Kvشij֬fp|@@@@@@@\ K(VC@@@@@@@@L@->a0@:x0)"u,5h@4 /+ͣo8KV [ /9s$KjEWJNs^GVx-M]m*#x {kԨQZh4i^zo߾sD @kJjMرc~hl?\d*Sג}E4 "m68p@ -       cb @@@@@@@@@ j%S[5˹E_^sM*hR:,EcB8 Ly-(Fph8ʕEIg!=1W @( Xd̮@wf̐.]#ȥOH;KŊrVC AQFz5]n"nZk׮B;@ vIux)XjȐ!Xb`YT)-j $qFo5kh?l       ;bg͑@@@@@@@@@ JD] yfdH'] 7K&IV( #gZ9:GE l&]pT=@@2e g_j)-\ͣoIxqPJ)%%5$τDCsՂ 4zh+jڴ O4g֮RScv*^xA?@H"P-uZh  P+tl      M@s`@@@@@@@@Za#> wJV-N$NqrDŽD[rz5|-[lU^{6nC%n]fڜD^Ў;4lذ@@@@,Pf͚.$|       !@@@@@@@@@ Uf}'UWIVTן,Ȩ_?K'pҚ5Gů d {w)%%Y7/Բe0H@d@2e,`Mv/rkt-o [M6:uz-oٴiS=:p@;FNԪ[7Fr)w^=C4hrbZ1`DUBF-P @@@@@@@ <%2hZ        Kڲ%^-Mm.D*[6o`m!j8ꬳq㢱w9SxkZ駥Ez>>C8ZuVG+ @,Pk9M$K]Hv/ޟ22G,@ \~t]wm}GkGBU V3fvޭ{'#P+!g 6VZyގ @@@@@@@'@V92        PJFo][:tH)=]ꪤdo%W b$ijUfq ۥ<ʼ 34T!Y*^\6@ac(i^f8HJJw @,fĈZdu/ʕ+ g6G[Nv&c=ú;TZ6@@3       q P+         @,P˂l Sik \}!U(~k \zi嗃*ڂ@b ̜L.Oz@Xf ѺF{jډ$RɒWz(SFjߞ@IzիK| u{/_&L_ZlZl_ ohy֭ }7@>z!RQ}Cl6#P+6X e      @{C@@@@@@@@[ %E:$,Gw]%n+LwެeZZl?>*m[;Xk: @ܯ*W.^G @wo pb/{nl9 /l߿X'O֭ʺo{5{ߣv>qs/om{c=/~)_7|&H.;O_z)^{5=Z^zirA@]+)4"k֬5J+Vv8~cB lܸQ5k G       Dj%ɦ         P8U?,} Xa۷kǎڹsvڕдb{ieW0fb9VaV~UbŎ }_ի/Pݺ{!["÷책r=/ph/--̶d}e˺B岖g ׬VJ\I=.G>L:ഋ K'j'.@WOz-vZ$P*[ `ZO4b9-2[Yaf}N>mY3c+vn'`:櫯I`; X]}%SEFZ H M.G1C;<Ts?6lؐ5ot91g)*U_nԨå,tG./c_)=]6{VTgdddݗö쾺e1ZtiVИXxWdc6bs͚5يdz/#@|z}5h r-j۶. >ݫfU|JruZgz+}z7{>Y`jnUڇ@ 6      aNՍ)^@@@@@@@@@  H+WaV-t.}a_^6ms-+}@,Hlذ22Ɋgva(씽3sz5:xaVT3v![V32-RyŊGbCõjԨU//k׮FܖDž#p =\q'{A\hWHZjxb#`5ki+*sGlQ@.`. ˵Q&=jؽ.qcժU޼zꬥn!ZOlϵbMkO=`{\jUoxb}^ٞ={g)~Ves79u%<@ \"9s3. yh~[UݺAn%m+lnӹ瞫/w,YRJʄ P+#      @ D|ו#        @ %nw0]KKKӺufP-gYqL-,+2/!n+Ȍ\ZL 4$eg6[μLVBK\YP+9uT/mGJ*`-+Փu]7[F+H숆$ؓC $ bB,X_^ȍwK'J|"5o-X@ ^ 9. ?ݥ-[!/oK.e˖iŊ޼rJ|XWw}'+|rY-u ղɊկ__ 4Pt饗zY6[` 1!/efm=V[v7Y )SxEbwm^HY8\ƍyqHhN^++%D  ,]*/7L W\w%% pH@< XVg/6@`t&L$͛'u6ъ1 H3g,X|~glRg}ҬY3\Ayk׮GwZnbŋ_SRSN9EڵSǎeҥ/ @(ΝcsoI߯_퐭&`Z%KJUf{ +p뭷bŊה0uDL j{Nx@@@@@@@ J“N@@@@@@@@@`~Ћ${mCyAYV%Kdh߿߃R6mvi^PFիW/`k `!Y5kN:"+?xr+VVtĉ=6+V̻.,\E^Q֭[殨*Sޙ_S_{M1";K˹$P+N6f̐~ki iذ䶠 @JSi+ H$U&MF ^Z_~f_fϞhmV~4p@q6m@ضERJ$#}.-pѢEel0av[{駞zu{mv 'nMW\q/X}SO= ol֮ԑ2O>QٲeCPZZZLc@h 6VZG+        P+Ч!        @ֵ bs M`͟?[Z\2j'|Zj_;b\ʕ+Za";v}矵l2/`˖v]YѣujҤlvԾ}{ohWJNV(, ԺA,_.+w\l: ApA;@ OݺIӧ˅_i3VF O/o>pׯWŽ.]覛nlһ29X8fOZ~;w7W?~,|Ʀv=z謳R,p,ȃ@55x`Çv/@JVXN`J|͛7kȐ!o={%K$P+tg#pZ^@@@@@@@@ L         ypQ__H_^ ׺3g͞=[f^D:u+ּysY1!&Ȼ@s JOOZqoVb/~ "չsgu[VZ5 H3g&W`aNMI` Ft lْbװr@ p\A o"]z@6FX '駟꧟~RJ%q^pݫ#&b%PH5iě ۽3f??aÆB ^V^t{ĪD8쳽k<_]cǎ9眓ݣ1XVJMA9\\,L~>ao`X:Z~=B      $Zx3        XM zMӧ{%KF.uÊ`r-СUJ Ŋ|饗fuu^yiܹ0aFCK"]d[jJVT4,SRjY#=34<W`>OaiDL#*`KHo%ŽeˤMO waΜ9?PT\9/{TZnEƳ쾺gl!6-_\SNՔ)S4boOvQ߾}ugʶcB w=`[u+ѣUzo̻D['#\7w/|m wc@P:6lPZx'       /;h!        PS2_ش\5iʕOيZJ*NW\]SOI'N מ~u޽?f̘~zѣWsmtu5fRJJP[IUmn |mMB|\A"jzL @:vJM#P+t'/ 3gꭷ҄ ?e˖ SOy#-L 4nX6x.p>CӤI{cTbE]|3L{c-P~E j޼F]cEus8^֮RSCpk^ z킶Lfȃ@ZZmۦڵka+VE@@@@@@@ 46         a@+ݻ}yYFt'Ojw-Z[zwaZ8OL2֭n;^[ {¥RU\YO>ZnZj7~mر#z@OҔ)lB WK.}Mmh8飏 K͚4@ Cra ^) ;Y>=#F W_};/6+ <#ѣ $L+'FH~:A 롇ҺutEy_8l@2W/u]!CxT~m2t>@قnM-~o{,m=Q,P'Z@ 6lZg+Ä       .uh-        D22 ۾}׿_~^-˜~,Y Ae˖"L 8 4W_^zI˗/ך5kh޽DsڹX{|I`ptB%вeK9R>S*U k߾u rMoˣr,[য়J3L)lԯԻ\xc#+uV K @*VZ L9^ o aذa.^Z "6KL2ucGqƩI&zPZ@jAo^GG87ɋ/ڍN@->       @xP{h9        T3H_~XhYAs=Wk֬ѣ>:uĮ)G }':t Th,{iKfӟYN}g7o]^>믿+B*U^}&Lz(}ڵK#GTϞ=em׍'t~kʕ2dn6~\rt19A ܗUݤT`^˥"E>J9 @ZjE]#@w͓+Cݏ=stnCիWOw>_|gy@9C@O `cNٰƖAudɒx':tٳJG8>cuLk׮FPH7_e]aÆ?ՠAo +F|r~'Ne8]+Aٓdy߿$/_|$I+VL\z^#$Z vB      $ZIu,        @ZrI^_m۶ -[L>*Vx x'^}UZ+d\N޴d-X SN~mK.՞s*kYdAWl5ydر#_?ᅤYޜ9s?}7?ֽޫ^z>OA@iXԹsg=SQo^jR#cBBp_r*Gv/jhW~Aɾo1!$_F\}{}UyO1( ~Yc ҽܵpײݺusT}qZZ/k[-ܭ~Y+QXM~zt~ Dj%ɦ       pj%)C         K {E_ 0@<,N:&ʅ@JJn5o\8/g뮻Mrz Rr)Gw'5bĈ##VIg֋yx`J(x[Y(-[ȊXh^gyELaިPƎg릛nzq_Rr\]18u"@.'P'P qpYR&qn G(t?P(m!N^=n]s{:dn=ʂ9o[=^K,Q$yfܹ,ؠbŊyd zk*K.GMЅIv~ݱr3x` )t v@ ;ӻVTl,[oݻCK{]wͷ~ecj,lk'ϨRJ{꫺{60-ZSs!O=.Q~-XƸ;uꔧs ˙[@c       tKOC@@@@@@@@@ y4k\5ӊ >\'O_Bb)clDN&kղj~[gNE9 tr^W3pe˖Gg:³H¡@IDATTR^[~Իwooo6bϞ=5c /X Fs0-  pLM@ KG瞓Əvz  $j)@+ ݺIӦ0uT,=JX.O:$Y(|2O6PrexYS zNT[)/X%z>wi;j(/ȮJOO| ػxf 4jNi24Hi@j̘1jҤ{LL܇rsra$\zRZru/´cG%珹Kfߝ*Gof[X[: ºQ`ڰaj֬Yw}B@@@@@@ @B          C ڶM5K:oh…}1c=6bK.ȑ#]*W֭!C-|WzW}++_~I'0![O?՛oǀԣGjܸqzG[owQڵu=z~Hj*ܹsO>iaF֔)S~:õzjC?C>&M뮻Rjմh"kŞ7~(.LtEz4tPq[ռyH9sg}^zIԩ>> ut '?.HV.vkxX1/?R/}6l2X6{O{%uſkԨpݶ׎;v(;F]vKmCr/QY &`Z֊{ /p_Ȫ @ 1q}[0@Hn$W^wK.}uV?Gfu[\͍]yiŦ-YP}id5G,XƨQӷ~#8B ,]hB^xnFm߾?ټc?0azm?mQO>tsY6j+We˖~[˗v!439ҥKس߸qcD֭nԩuQGc0ydFf6~Gf{>#wÆ c{*ifU{G2?lӂ"~m=Z?|s99^Gz\e ϝ`x^9'xBv|y?g[$֭*x:[;(-݌)6[^V\o߾hn.^umbV@fW Z1ciڴu:}&+i͊ZJ ܲ!׊:Z Mm0'+b dEE- V#"Z/@;NTrU-/cbd͊z[51+fYfgE2?x_ ZvɜFqXYQγ:oʊk{EgW+;{숇d9;.fB1+kl Y(Կo8p^WlŋUdIMf!;nAQX3$W هj@ap5}+Q)@lM].xۭ; @A Ul)`Z6Uڵk}@ڜ͓ZN&M\q)95ma6޲er~\ÇYmN>Pf4sL-SM|^O>Lԩ֬Y@O 0r6gjÇy~!-˞Q eN?t=jݺ瓭Y` eg鼴ͻ2D=M{饗d֢9leu~#v[|FV:uddղ3xlNkM4ɿU-㚝]Vcs'|x߮Vw3XMeaZΣu]Zd_%ʌgu?sY[Z˗/r3 {v  Asv.~FVa?_a Pa@@@@@@ @¾         kWӅf+~MՊMs dk׮>n[xСC/_ʂ>3>ezKYV0w]v(YASO=sM7VxZn_ ^z~V(-#ٖk৓N:I'x R#17 @(+hvm %²R1[Ίai/OnTf\bE\ Z1\ۆ++j,̚ /{ǿ>O?z0VvmUR%!+f[۸qϟ/ wn}+ {K0dh^c)Řmj"z,zORC`ǎ=YDj/{@,\ '=P,@ $'|sY4@ T2RϮWXFvᛱ#vB:|'Z;:gexݎ\vKc|X$;.|}/{4\*Z 6Vݻw;LJF}lWFC@@@@@@H>7dF         DŘϓOFDQaE-- 3&m e˖-^k֬YgCkSYdO֖ZeoK>!_8ӂmۖXv7o7xaB]v4hri֭~ea{iuliOa֫fX2l M- Ŭl4[o}nݺƍׁ gRs(f͚' ºex>̊Cac\@!\ qA`JWC/ VAHJ1h߮me^}UըQt-\0](L9`(# Nu|esvm!YVBf;wAM^&˗/,RJݶ6zj~nnmue,~׮]>ök VybkO ;{9j^-XŎ?ef ;@"}^_x_A9]d~viM޲9r{/qt\Hlܱuh ЧzJ}k8@.?j+ ʲ-o{>ʌdv?2#ޏ-[&ժoBL=G7_Çk>,.ޯ^;8VPa ' Ԫ^gS       Po@@@@@@@@H,v<:u\}/NnviҤI-Yagy"Bg5s[2ׯWɒ%eGyFB \jA-(b~_z뭚3g|W駟dYRV-|[ ,cYz u}Ù#2nݺh63fEq[؄?u0Xn#Z?P:| Gx->c]g q/%;fS1bc  D*`So3f_B-* y֭[susZ6Glrt 'hʔ)~W1B g /PN9uM[lZwsvw 4(Mj 1`yUGrjմ3Ҟ憽#9>|FVoJx_ -St Ӿ}{oժUafm%} Ȣ}HC wq7ozC|7Axbz|H>wh#i?+#+"3XVݺUJ}MߣB7-㬳Ί$~Y O=#F@@@@@@H_@@@@@@@@HYH ӥ,N;n-)z髯|~2Bmڴ_;ӧ&O(@5 !+hڷo_=̶,,S&¢7oʕ+X3۷oX6bz/ufeݽ{?.߯>}tԪU߯VZS厽^UB3gjر"ݧHLoVw}Sv&?-Z?Es_3H׵sK}HC -[V<>-^؇7*s.ұÆ}n"miOds#*nOڵƍ~=G-T^v.>q{$Ȇ@- $}|Ǎ#      Z         S7 {qaCj-+Th¬xbUjU5jdz뭷۔)StYf(v]fMB,ʊf_'YQ{N|.E}^;wŋeQ6qDUR;c[ܴ.]C[:+fƕ X&92{}kc>իؘ=Bh.IpذaqLVܴ }IO?-#&((  $@2jَ؜xǴuVo6*VyE o5jy-X@dpm QF:̹e6/g-B,ߤIYh~s=׏/?7nw99[w1 ej~[*T}>|Isyu+|ѸmP?|ر#]橏;j^ڎW^y _/}v曚7o^T瑳;z$3z}g 7vNx={/܇Gzqs >ok{,sTY&Mرcv(vmȐ!6m?۴iS=1>wW^o-LkDs~봱emgeri6OE{.JxNs׮-Y֏?3 kۭ~@w ׶Tmjg O²O       Ri         Gr'vb#䂛kPI6]CNݠ]Ȑ+r!6!W *vC . "!H+Bݺu ]{!W86{l7P:uBLʕ+Fwy'TZP%B|/իW/Ttwm ͚5+ ~N:\n\XT@rAX~H \XbE`[lriCׯniϹڵk~ e JQG2/8c Lh۶m͛8+.c6r嗳O  PE+:sӧO "!WofѢE!jdgРA3fזˇ\Q؈䊨5kPVBG}?F ?gqFȅX=z][ޅE][ 5ja޽{\1߇m}gvq{sx,r C+}sv^nb-sm; v!B?.53~{4vG =\p!;>gÐ w;mN@2eB.<      "N/ 2 J<>+?ޠ!        @:,b?rvbҹsg5h@O=Tb ,F3fԻlTZl|r"az+%0W{‹rE.ectYr-zpBte k+Κn[xǎ⊚uO{̅j6mO?_ovTlY,\!UZ5}EkE;&\4s4arE>h #~\N}r_rAlY.'~W@-¿~?X/ Oy7ʅ='q#ufs9TN6άd~ yidwcrvnɅ]o?mM.=rAQgs7/27}G{.7bم ƍ/Jwڹ&M1hݲe.R2 ꫯԲe˴)I9_K(.newqhX~*V>@.l::       $N/ rhP @ SLY"zxDK        zR$ ԩJj b3Zj^ɓKÇW}=WP³ 5 ʮY!Ƭ1(Q*zeH޽{p :srʕS-r\'j֬Hx[iev,>̞cvL2UeX{ flZW7bBɘ2nς0l7f2^[! Y|Gds>h{ >b;NZ6@TX@t)҃  "оI3gJݺbŊiӦp/<*S9lm|q`Y´f\΍4qd_n]}駲>Zw c8Ƙ\Br]f>7ͭ|Fy^A="Bz28+t\s;軠mۦx@s {/Ӱ'G tQ_,'x"q,7}/ge9ݎ\N}elN\>Z?H~gvi>Xs„ ,x%`ֲSrE@@@@@@RO *##        rV"0;KKg-=|Re>3M4Iw/rx'VȊN%R[fc6,+zM7Vr\&Z 19p 0`Hלݢ)ˍE,l?^Vh駟رcըQ#(9眄\m7(!/ .p\r]SaG@@TZUnGz饏]mݺUvJ~Z!ue% >|;oq uUWL2:̜楣1GF15u>3w'i:xm @&e˖!Zz.b:j(u=#hժU2eJ+rI sڹ_7iVݖ.J !Ҫ]Ə;wv=jZzoΙ3GOXZ6@ijEǓ^@@@@@@@ P &         *@VL>rA4ܹR/t"̟?_??|YmE̟8qZ?P]t~eޔrRN"عSOrugrbM  @AX֘1KfMI0QJ6?HK;S>} g 0@m۶ qaF qSOmŋW_zʗ/w_69 TXх={ɓ'_T6mr^9+WQGM駟l_>]vn6UZG}:=\}5~%yɳBP "Ϻ5k       Ex @@@@@@@@,@耺z`uktM/Vpք rJ}.`N=TPI't}Q}6_ژ,'Y9jnJ&YGK.ըQgDժU}J˵U>}߫k]J|#dl $peԩһJL#g  N}{;Btɒ%u饗j…;v~ww/C=Ts,Ye^:p\׬Y'x{̇ &[EV(834o<5h@;vwܡ]v[[n\TOF\c Tkum֋ĉua%5k^@}xDUV"!       @V@<        @`RecI)B,s+VT޽5~x]ǬWyr!Y=\=Z`Tٔ%H&_~} 5lPp/Yti_tuWσd7WP_-X,#f *g+HGd\  DGࠃ NEU=4i$-ZHgy~i4|2d/^;@`ʕzꩧԥKU^]vZnsjΜ9ӧJ*AO,"PF :t>uf|ݻwaz~mnVcl-f;4h p >0ξ7om[t4ٗT@-8       @ ǎ#        U ԢLtHU?_za9^,@NJ# > Bwyh5iDUT}֯_Ͳ>I`͚1c駟Zj\sԻꪫ4o<BB=:,UP!Nf:uJ+~ @ ^|Qȧ־  +оR?{hq>@-LawAjڴO>D@C \_|ϑi?ڵkw_vX*G oJ~ߺuZhQFElҪU+U\Y'Nx^`ROj׮FgyF/rfc$j@@@@@@@Wx#        @Ԋ#+%u~ՓȼK\hbnvf3`G/͛7â5A lڴI|K_Њ.X@v!Z]e[oU:tayV40e劾IԻwa3@ ^'nQxm   PnH|,YWU;0VVR2v}ȇΝ;e>-,o_//ժUAw~>yYc#g@ qWN;Mr_3qH@@aH?(QK?ɻ ;gdv;e'M>@{ZUXQ݋ˆ,#PҥwyyoF3gԴi'~n6uU5*N @%Kz_~eulZnԯ_?_*[l6KTN˖Yv휖h _^ رc6f vҊ+J>"      @ PP^v@@@@@@@@-ݻwGK(pu{´͓\TR5+,xKK֭[sꫯm۶Xb_4iC9cm:_*Ut5d""??^o_V.b~jѢjԨIo}4rb'5DȿN++=@@H)w JY.B,X)S?oQ%J!%[VV|֡70@`/P(EiΜ9/4k,{˖-sSfo:uR˖-y-%qڟkυ[oUrK cMҥ{c?-gAq>͎9R_7)|rڵksl @@@@@@@ jE@@@@@@@@HVNߍ7J\"_RFAXX1Y؏]8㌴޽[V@׏?C,DȊi;w˖)SFuUz/VFmHdP(+Wjg_UKfŶhYAO<{BJXUcZ%KJIe4@S}]ߣˉ!  :HώHr-9oVs̑e̘1Ҏ]9 ˮm.^BKmuJ?,Xveg5mԇy#8B-Z@H s1:sgȳ>O>yջuW^yey w˖w'z,}g^p;R߾}#_%@B&}ԬY      Zu[@@@@@@@@ P+K|=j鮻n+je{=Y8]wnVH†a/ԸqY8pZj=n om;DK`o,_\v-޾}{&+Usi=a?i8XiĈC _i iT¿!   o/}j-s]x>ĂfvNϟ?cYÖ-[b6߸qc5jHW n;@K~.zh" Zz%JcߤIbvׇh @~5kٳg+)kFJ,ֵjs=ZpnJ{pS}VVbգ>nɇMZiÆ #Zrn%%YIg7a!      $-ǎ#        U+BH1\nE"76G+thE*m6-[L+koOMCl-zVUVRHJJ*MIMǻk.] ^ŊxeŊiכ6mJʕ+YQN:ouٲeӭÝX}alA /p /Ho-qD{  @~ڵ %Ozoo@E!Yu'h<)Kcǎ/;vez:uTn]3f@IDATڵkKZuJFlܸџDZ:eKRYdرԊhvL-8²N=TtAb URIL25j;8 0@3f̐}ԫW3mV˗OV>^+}VTg/BM:Uznfw+ Hu2" @@@@@@@ J@@@@@@@@j޽;j\ {+O^TRxP̪YM =uxݞ7o,tB6lذW7#%]bE٥B iྭc+I+X ?]~/֭z͚5><+ږX\5 e;C}5j - o%GJΡ+GVbF$sI.=t 7>F  @AL5m*AVAͽ,h+ҥKl.˜,X+L]*J™lEy]؜n0[jU?\WRş )wwܡͫ^ڟs.+Ws4{_֏O jʇ<%K- @?|N=ױ#  \K.@ s'Xի/Y `kYSeܹiO6,+/wsv}_ۼ:BPڼsްa?7bus'vΗXVxNf 8CÇYYe'K>p(иqcw.3]y:St 7{Un|}=-kڝz0`x u"{/#T= M@ ~oC7 @@@@@@@ J@@@@@@@@je,H'H_&O$%KT͚5%7۵V4ҊE$dpA\2]0BY?v -4+j[6nXx]o} eXQ.6.9`XvvpcrBfAZ sV|.A(]-ZO|2B͛>vK+̊ZQӠЩGK-v ƥ> 9 |͞0۳Β;Y@@TA9RnR=[*W,va]Z_V^- Sصs?SZsnNp-{<|eu?8W>OosYݷ9y x BvS ̳[xͷ[Acv6OC }t?>hZkذa\'|.]ݎ>MUڵcwQ|>2%vDr)`|g@@@@@@@ P+ CB@@@@@@@@ "}T!r@қoJ={^'~Z4XW4ܼy/\[N{ܮ3޶Bv  YUze5 ̲UVb=v~}ٵ+~;0bmGVǥ;Eժ^+ڙՒ<mJ+WGo@ N8Bz<>  <ˈ1@j\uma6ߴiײk«]gosBln.\rL n<}xx[eAC\wjѢN?tx'#slZkyݳ"uW^6}Q Mo+e7 [@ ,_c+$@W_IK;Jc&1h TaZ4@رC:4{IEC@ .bj]dHZիkŊI;~kܸqꫵj*K[l),XT*UJR%.+4@޽{뤓Nұo08j:D ?ɑ@|B:       j%A`        $Z9 5jHCHCJggldФߗ9gO ]~X6vO?Zwt }JfI&H;@F`Un,E5wԄA-Сd!wGgC _AG'PH 6̝|=NP#jD"\ڵ%HPॗ^!?XǏݯTRkX4Ԋ&}!;@x@@@@@@@ jR@@@@@@@@H"w,S'Oi˖m-!ŊI<"=tYgI[&1h m+}kWz@dѣ^?[EU+Wf ]k׮={mۦVZiڴiqC2n0JƱ{̋-z>[ ,'a00@,s_<+VT2ed @@@@@@@ +q@@@@@@@@RL@gV&ek$}I;K%1 n-w@Q`(;'uK=`  @f~Iӧ*d-Pzu8d$ SAԮ];(e+tTv[n߮Mjt >\o4ݻ)RCa jթS'¥Y @@@@@@@ J@@@@@@@@jڵ+[LMY펧_iԶ`ȭ1H3fH*u Y!6Z zT嗩k#*ҀҭJ\ 7  ypԶ-Zyc-b+`Z;vڵkc!zGȵ@r4n8 =oFGo $P+6DSu֚5ko.7Dkٲ=ï];w#*ߴiN5lPoF؎>O' P+6@,/b)L       @Ԋ5[B@@@@@@@@ ,PkΝ =:5wԷ/08_(Sf{#Ν?ݶ91,P? s| @ w[HMJ&_դUϞ{Iy!  @l^ ʝK#{"EjժjŞ- QW>S5nX;vZu$}裏A2dnw>s.B-JɟgMVիuV&1Z      ]Sl@@@@@@@@(^vڕ8J4o.+#WD)vE KKKIݺIESHf$5/L!3P@l^}UZT]zٿiΜ=aZۅ[  GCiƌ  իkʕ>@b P|yM8Q'tѣG`+ե*%U\hmۦ\ 6իW/-^Xzʖ-MGԊ2@ Kǵ:EOB@@@@@@ Z!        Rb*tRŊ-=;SΝ~GHu+{7tM+R*#r4wt9% Pv.XZD5ada4@@j=ar h ժUӊ+d4 @ %K꥗^R5thպꪫ"YP.lTTHܽLwjzhڵׯԪUV`b ZT4H|eZm!      $@v@@@@@@@@"@VT݉_/ h!g?nF~Or,XcO܌RuѤ4~j+{fo"?ґGJOz @!Cjժk|l3[ hn Y֥^oч}ܵkߵE]d(TK.UʕULB_        Fy@@@@@@@@ s r  +$|t`XG-[~~[ ^`}eN6mJ< J }c@TxID{ =Zڸ1sC@@ 5j$M~X+`Z+Wn 7 S9r;ڸm76rMTv"(c7oﯺujĈ+믿jذaiE;=޽o/`ZuI2B@@@@@@@G !        @(^vU3Yvp@H\xԧϞ[ @K=bWR%֭sΑƏscY/ ,]:[g{ /;2mԦRZ{/#   73.k!@lU+VĦszE_e˪W^ڼy|I7R-[&5mZvv7nq7g=Mt u$e:P-ZP;@a PY @@@@@@RUH#~#        AK dx$peҋ/J=$YAӝ;BVN@ouiM,]{ߏsp X~}? HW^nzO…GHe   @ly֬msK#@WUVq.Zg7xC=P(T@#f.j׎vc hРAnjWʕe;ӊ| = _@?F@@@@@@ȍZbY@@@@@@@@ Zyp]&m+mذw_I_fT$@KÇK<(bhH*QBrh I*cre]R Қ5/dz   @Җ-җ_FK"@l,PkZzul7D 1ѣƍ^z)eB췥֩sޘnG6mڨI&z5p@z7չsg)R$c/^p` w'eA@@@@@@@ U1{        @DsΈe <4cdcw @ \3+:n&cfZjʾ @* |՞sbERNþ"  [8'(EA@# &Q(x`DxbYPAENE$'%HP2HTAr|)^egwvwfw¯>ffzS3S줓̦LqB(]xƍĖ Q+ЦM5j 62˺uG;XBut6tPkժ-[>V?VXa?0-wZ3b?PKߧ @t >`\~=4:@@@@@@@ ]j@@@@@@@@_ d0ٴif{ Por0V;bo>k̼9(q*pfKi  ʓNj´l*o7cX  @f65:5?KL2*%J= @ (TkĈ[߾}AlUbƪz;dKٓnWqh7o.4( #*gNgJNGcV@8@V̞A      /767a          )˛ޟ &!ޜLv杓mԷY]@Çe֭[koO=_ x Q*sy7 Cڶ5[͊y!  @x5#P+Ԇ@-j72 @ \uU;3l5/lY,_>%VeX+:|͘1~akԨ+W^;߶M6٘1ck T;4}/V/<^+IOJ @@@@@@@l P+O @@@@@@@@@ :rM`0}t4+a[f;(q O>f|A2ĕ5䓣Zğ'\GdV`-^9m< d|GΑm:fSeVjdK   @Ӧf7 {-@ ;xAA/.] /`}?0:YάB3zo4tr6dС*Uʚ4iby֭[ѣLXbdڐ"P+G T5kx99Ň       t@@@@@@@@2-Kl:d&JTԨaf/t4HF0۶LZɳr2Fŋ .R z0N-ʕfҨ (peN-^vI'evCra&4+Ygͮ.&[r  @ qk ^=@ EҥKƍS| -p]wڵknr{nlw(Y@d#GN,)v6i$]P!k޼=֪U+;ӳM(ܹ)-ND*X       ćڈH/@@@@@@@@ȴ&9<)ӵRAfr4YZ 2o'O>1>:tȼ y3{ԿAw={$ݻ״۷-N?Gw/Zwkhj&Ji9%,ȑ#%lw޼y)<_u3-w`^PY[系< Hhժs=֫W/kѢUR%X]^uŻ\z\k,Xp̢ϼUJ*euֵ͛[=Lkժe 8.V i"-LG@-ޔDA@@@@@@\@@@@@@@@2%j8p S[n0*Z*)X!0,K+XAkr;/)\A Z4T\♌I@a\ż'-yJhM6@BDٳ]8Į]*TU@DEEI6\{ٛoun6gyԻ7ǬCb^#@dvҥn5զ`C:YśT b<~hCWZիY XӸƍݻݾ NSW͚5NKZ _  @ 4mj6eJ5 Kv=WȈ>o ķLoV?~|v*RO0a͝{t?"]KUP³ZnnPPLR9<       Kj٢        DP w_'J@۷B|r_?ӝ?XAA Z5jn+VhRp-F uy&,&f3gG}d[lI])LDBԨQ-+Mf^ ?eĨmhi6DL@Gs޼yO?e…/B|;W^sCM5dZMo z࿗XJa9s'M۠A"y}W\1?j%yױ';;{@@@@@@@ P+~%=A@@@@@@@@ SyqkBD(۶m3(hYh Zdr4E PPxPӦMnH UP(ĺ'hZ4iYJE# _]HnL@, g6'ڵkHA@@@@@@\@@@@@@@@2%SGh8*I ͳs[Mfgi{~veY /YGKժU-W\q$AWH&hSe߾}.dK_Ix ۵k ڪ\۷~.,B݊7nҦP4'Qb6/^l,aסӧۂ Xɒ%3ϴZE @  R;vL:_eOz7 /`zK1rg~Tw@@@Jf+@Vt^t 0>}a~ l„ 6qD[~˗]袋ָqcPaxY6Qt@ #Y&fgYF΁@@@@@@@, P+K9        /OˁZGe˖ٳm֬YnQž={,.8^zֶmۤJ^ @4A^ڛ$m)NaGz4TѢE]YgeZ5jd4Ko6oNR{I[n1N/A>^+7aDvD ~77q?y&Tp=\ӧ{}(yY ,pwvz3m47Y}g pѶl.!r  @6=z/Ptiۨ@(Ys=/ڽfuoÏ7δXµ7P%f5o]0k 6IĞ;o8 ;JSwk.zpUWk|৅g@ʕMK.]ܑy3~ Rƍg>~V^=W_mur8@@xPf խ_Ć6m a8k{/bZG3gڨQ>_tVZСCK.q)/*TH^l@ |p /Zn&p+[lxyfmژw\"+vt,8@0 ۷ύ>/$_6%KhT@ Tf馛ra5k3>c{G\u]g;wjժ^i1  @(UݧL!P+jN IXҥKۂ tHdN:F׃phMy|}駶~zw-Q]m۶ƍ[\2|={̶m3X1U#Q#@-TQ( (PRJǭg       @l z@@@@@@@@@|\UWgΜ9X5ܤvGiM>ݞz)7yaZffGRTR֮];4h͟?5d+Z=V||@IDATykԨ=䓶lٲ~lTOY Yp aXhإKPŭ[ڨQk׮iEJI gΜnr~.]~uꩧZflСG3R@@H7ܴ&MjsW6G0 )S6nZ@ Zhay &d g۷UR=\W->]|EӦM3F[w*dT@ 8p}f  T`ǎ@D<      ĬZ1{h8        DL* &pj9sLѣX–,Yb/iN8v@ J,i;vz֮]kͳ/>SYիWh6l[?40[TŊ 9rƌ&Ss٦MlĈvUWY3T7;!իW.m…6w\kذs=.Ts@HD/զLIĞgK@:J C v˖-ϛ3U]{5D裏Zݺu3Tw@mzbG'Oi0-E ֬Yz] 3obDP>-j/z@<(HKO;4ܹժU-Zd&Mn *ݤd@mРA.DK7ν\@i6# Č|{Li(q(Pti믿lϞ=q; @ limC/vY1CϦMzASlʕ6`w]>i01_>%\1! ܹsgÑ9$*j;C@@@@@@@ P+'A@@@@@@@@ YC=d_jL0uf%Jp?G@w}?zֵkW;S_{ffMº~̛wc ھ=MsHӽ{wk߾ip>]D y3xnIt.]I?dY   Sge'y 1l@ )Siƍq7: |Vٴi=VjUk۶;ookP9rUM_μe2V*@ -z7EZ}\X1+\pԶ!      dL@        q'ZϪTbƍ!C Ě+Ɲ)BU⋶~z]'n5UFJf+W';H&;x)\r֕ۉ'lK"@.B4i=ھ+饇>@@` 5h@V0#Uje4AS@X%K ڸSZΝ-yر-_&L`_(P 辑xԊDԉ@V (̎@VxO`ڵVR       1!@VL&        @I`}VF o>3fW_m9s5#G޽{[jLC);waÆI/vIiMk~JdΝk$l=X`={Г`M}#>֭[7g5MW^=8qby)fڙ=Lwel83O@@y֯_]kqC4&D?&{8&WMKmvwq|=,R  cƌI OgTY3((]kͦMl[k7n mٲi&6)=/]wr` @wk쁻#QF/믛>8p9x&VB6"fjΝ;̵RS`͚5.T2uR       @t0MtZ        @ ȑԷon^{i'xfϞm\pA-pa#ZJٱc۷Ǝk%uzBKYu@`Ӭ06Pْ%Kl޼y!iRλۅ?BO% e::w\7H}5Mzҧُ?61\gw+8>9ҍڷoTkժJ=. w}~7SU ~܆_@>/t$) |Ku5}{\V^jxvjdkwj-\h] @6 ׅ͛7M)TeС.LСCS곡~}?}yJl2h 4i|VHzxnϞ=Vv )|ǦSE{9եKZM>f͚e7xϟ?Zvպud19PxGEA       j9G        dX@3PK5oMԻh"馛Bkp'1r[oj֬ij)W\~>)s]vzՄ` \K>?{G wo{E:mذwn7g(9ȗ/fΜi}]qI<8üIsL x/gjeJȼW_}e:ur{jOP#l#5Jo ի h_/} 4pn޼ٍ^0}-ak@ z${~]wt~{V!@ 4mj^yA 1@)SB [n}6Vymɒ%]_WK/d{K.ZZ5X)SXbl޽Vv G:@}Yreꫯv{gɪ̒^΢U% D\jE\ 92       @4 hmC@@@@@@@@3Pk׮].|wߙn)- 3iߛ2RZJX׃>h&L#Gջ;w|\V9N %6 B 5j԰+,mMO(mƌt4\XZMlxyڒE O\ЎX~]{;31"K=ի-ʘ1eJ.mƍk@i*UJK<$ *ev$d6mC@WE ^mXNkٲe/^nVPI@ Jn6۶m,Xik.Pu VJ(i269븇@, (P+qU,#p}.X=@@@@@@H] wO,        $@8>;x}V@fOO>?N>dK.;vؘ1cs? 6̾[+W֭ԯiӦg}ffͲB wam۶u6j(u6d[ttMv'ѣGMذaC-Z4ǚ8q曶rJuVˑ#Gv7owyM/ߦOzoP|vQ7l`ݻww}G\h#FتU.?"4ݻP=l`:={tmP_~^z% 0MxJ+ڷooڵz s:ԫW/;s_mo/… 9 8~tNׯo=zpff> eFpxX_~v)C=5 k׮uXrϺ͝;BW6 8 6>MiOƬ-[:,7ҸTEAC1&\mԨ{Ǎ>_=nִiS{!Km|x\M x/ղVZ穔fOGh\6ś_H}ӹׄM1s㰒%K)*S'cklb {L]s5.&nFcN:~)  v= =]|= v?Bz_c>l_%y7?}5&Mu܍zo_h*@>pjrv{-[S](\u.RWn@ 5#P+N3]r]޸q1L;pC}VϴXEZ,Fs|nl0rH^9k$zJ8plƌqHE/aE㈎;R  )7p[1ǎ>O]V4[wuB@BA{$V!      ș @@@@@@@@G \Z fzMkh.ӧO7M $b)jŮɚ`P)T뢋.rs6M,@#QL:՚7onkv[UVmO$hڵ4)7hgvuڤ$KAKP)kK*8L+@T9+Zll`+jԨ+lLS&VdԚkMc   !{Çۉ'h r瞨Ro@-(PPZqq*D Y,8.B@@@@@@N@;t@@@@@@@@ m߾}.T(Ѣ㙡Cp\rYMMw{饗Dz 54پ&?|թSd:䂍N?I/nK0`gʔ)P7o $8YY!`Z걶mBlЦM7}gE _w (] $S SB.znݺ Bz=n7M([CկЭpZ)JX:W`şi ό&*}uW PX٤I+Ȥ~>pQjµVX~AI]K.qoذ! ܼkVr7j?jE١a.|rh) ϗϼ뫱bډ@ ?[J}KEgo_r@@@@@@@ 9#\?#        @ +P+&ߺu5h$y J;p 'aFXEgϞmxP+|Keڵ@bŊ l޼=? Rԙg r)}5|p矟tXQAQ9ҥ^zI]k_.X_:8#_hI:-[U6oܝOu͚5\x+2O 9s R/͑| 15P̩1waimtG? DU~ ֆ`t?7eB74t*v.[,hn'6EhV7ߘ~P|fP`;@ N=T,5}o)S Fbjfye||\TT)8p{."0SHk̐>Z 4;fӦMS[l 17l l e BL+fo R35kzn@D@@@@@@@ }jϋ@@@@@@@@k`۷/},Y|C LW r}[~lժUt֮5P-/1P@ :ԊB@@@@@@@p .IA@@@@@@@@ wQB4={QeD;mƍֱcG[`կ_߾{߃o„ 6mڸۧ~F]v#GphbMfȇ[֟xQ)(,;&V@BP&Nh*U:ugVIoΜ9V@y2ॲ}Z|>GI ;m۶v`tAl`Ff@ 1x [b=cQa)J*Œz-7=zt WdxO Jk||駟0.NMv6`蘚 _N 90M2mBnR&Mܹw - ,͛W?1vjet4ϟ?7n> {Horopӻ'##P|y>| 0^y啨G}:퇢6Ռ%qEZ=Uq@Z?bĈ1B~Gۿ}gO?%ӒRgФx75Ӕ u|ioZ]xGIRv[ۥKS[5.Mqʭj_~od<^ڦ66&ULڵ|Sch*?@w pWޙ^TZj]uP EZʕ]X-՟3}k`c*RϷhy7^ѨQ#NA8 ̼KN:ɍI^~mmݺյR_q Rh}jH|`?W(K"dɒ) @< 3l}_N 5G}K(޽7WqVu St'JOc@@8I4@@@@@@Ȅ#&+        ľ@|‚M?yd7ByUǑ#G\HW_m dq+HIa[h^N'Næ3ϸ *Su]wNmR`AԥT|IӤe˖5eu&LvBT^}դ/W}Q~6g}(L;vt13ysy?f^f @ ֭[P޽{uD/nF{ܸ#ȩ+Riq@Z%4I7K/t Иov]]`Α8+&ToZoj,q&nРjl@Lk믿F4i۶q]8Tj2[A/wlBwu`cA}1 DK;wuY.lWcpFK?i SN^u_k^_o,W\ Bj\Cc 5v裏?O]=cn_AХpohS&N)$ŋ[zgX*zϫkwX]F t,X }Ԯ3}*} k=®u=s:ŤI\EI`vwˆ7Vlx=}nVb~ `Uܹ@({}RJQ:       f"@@@@@@@@@ 4ȑ#qۻ `M~i } շw^SxԆ %K<.̅ib@MQhQSUth"cFqf{}ir | oN8K!MJʶ[)h"1EcWvlznΜ9n1Jt2N u|Ok'H+y5TBJUnEoWK~\o1>&*:t_eA!p FD/"aZv680D@SZҿ̾5_ן545`m eor).3X]G.y-]wD@z\_lZme^#Io~…nUwwG^@ gϞmիWo݅ ~D/7慇5l(O>~Yk F6͊}}fmQBNy+Q@@@@@H4dq,i6ӱܓo{?$GD@@@@@@@@hȗ/ D:wlm۶uGW]upǮc "qTR+ ]PBI'.Ν;i hBVZHIo?L+ G;HigdQ+>蜮X"W&LpPv u?nGNu.\8iPvsw5*Z xSZf#/6oYgy (дiS7Y^A֣G{K&TXdV#*qά阁4 mJ}3fH4c:v۪PxY-[V7iJ*%mo8pg_E ] @@@@@@@Z ZU@@@@@@@@E@nݺ5bքO<^|E[n-*Tر3Zmܮׯ7?p*uۯhѢַo`O'?3GN'WAj@=ڴic5kLup?Pv?~V.Zx 6l+Vm̟ԨQ#B@  .tG~ᇶK:矷N:_&jQI|f%K&GҧxXf.Yxx@@@@@@@H&@V2"          4{~죏>W_}=>sDSڵ%JPСC.aΜ9[oze]vpv{=룭=RM7dO?1gڇ .uHSomvE{g[&fPQޡ\ֽF TġoyĈ裏 /`_c)x(;J(p+Z&c8>#o.+S?s Tɛ7)0xVZ52dH^zi4h S 7`|UX1>< p>⅁G ,]ԪW !@\ (vmS ԊMV@Z/6]_v곱:D\' @fVZkIV\]k5kf󮇚ݡ8Z+V<_g3>sN:֥K/\rYK/5lyl:ukڳ>kjղf͚L*T(ɸ"˨@ dڑ;wd;~'MdvN8!YqGuo :ru-JYODRdɓĉf-ZDHԍĖ@ӦfSVi-"Pti۴i)*e޽%K@ y Q|}6c +Q/ˠ@pеCۧDZZq|r       0#        @L (0*+qjԨaO<[4QW_u׬Y.b( &g3=sJYHd۶m6~x7n[֯_o 6vڹիG )M.jM&DHE@*8UˢElȐ!ֻwoٳ]veֱcGkժU_Wr쩢EfK˲e죏>r~zI/r9(  ^&!xnS )Sj)!!.\#ZXz}6rH>})RĮJ߿BL,]kVBgY@ 8p5:O-_ܾ+;vv!;3EnDȊ!yf W)[lwre3oR1@l?4b^VZ6h 8p}֩S'$ UUV6mdɒ1W:@>lfͲ1cƸE!Z ܹ=IM=  (PKϜivy<[%"|4GG`ɒ%z̙cŊmZ߾}K.y&F&znYڙ]2 (Pe˖@@@@@@@ ԊI_@@@@@@@@Ȥ@m߾}%zv]wEa_ӦM-=i"y04i-7v̙3 6&ZpM>-3t_~ ,hs]{.HO{r 3[gkwfka@_@W]u[vµ4iϞ=ov $)p@" fomܸqv۶mVn]k߾ >ԩH@@ *U2XlTC&T6nHV,}Ȝ_$?sl2+U]q\ ]kVBvdT@(=14 Oȑ#{ᩤ@@@@@@@ P+nO-C@@@@@@@@  1PhU~l-jݻm̙SGۭp֠ASgW^=*y՚v!n-^Νks̱~ϟB4wn͚5se؋/[@$PP!С[4iɓmرgO<xyY-ܸOcE $zjĉ]=рUV^f@A@@ 652% ȡ@ .]nڴjժ  @:vnjc_~mٲN9+ݢ)s̙4P`mێ>,@V,=7ov5"P+4C@@@ػ%r@IDATBBaCd!DE@ڊ".{WjhZu@Ȕ)K6=6xp2ν}<3sF@@@ ԊwG@@@@@@@@ D@! Rre8pTlm6c ?z=8m:tΝ;[N\gpPA>(9}ۼy\pŋСCVZ5ۺwnɍ6l0[JĞ@c自;`_|^y{RJOOu}iڴ;cPXGɓݰ~zKNNvQFA=bEWF Ą@>f<`vy1d@ jժܸqc C%@ ,[̅g)@KRώ;s]vAoBoڣUm(bLE8Z%bM`؍7.:p`@@@@@@@,}c        @$&&ھ}"y+g[v_>|ؖ,YbsqkNkԨµa `PBC+=uDϗ?(DKCff󨠬;BNN>dk֬Yz||ZQsRiD@.s*n:8qk{LYnݬk׮k͛kTD4JFݻ]7ʷ~k ,0ߞ={ڭj}u_Q@@v4?>QY@֭V4!ػw}WG}dK.իmܸqvgZڵk9EqXQjE颲1&@x/I1vi.      ĚZvi/        $'':P,ei1bDNӶnu9 ~ѢE{tDNТE\ckҤUT)g_L YYYb [| ؟ȑ#9Ymڴ޽{u]g:tpAuJgNZÆEuSi h ݠ* v֬Y6}tSP;c?nڤG]}VN@E\ǽ8*;;ۥKש>肴HJA@@ ޟTVyj|]HFiWAZ;  @ x֫@ѣ#Wmܸ1A@Ȱ?>Sn:ӳA?oCu!شkךo$(1 Pzb}}@@@@@@@ ԊK@@@@@@@@(wި*ZjֳgO7]g˖-S| ‡OۗIM[ jذK!\~ *l%%PM6AiZ^f 9d*U\3M6=zM5kfUVYڵ3_3 Lʕ+{rCh u=\hQΠ?0sj?HU*IF{:BEsz׮]j*<7˗/wT]Bt/նm[7Vt *@@X쥗bմPS@Xo|}gn7oUXې!C[n.>VLN1 bݨ Prl@ (P뤓N*q@@@@@@@r P\98        ;yW(L†+.HwhP@‹,Yb_~ ݊w[D ]vCjjj~e^ر6o|̠³6nMo۶-;~XNont5rmË77{e-@ a*{n[l-] +VpJ=ÇUV? SUVRRR"ٶu֜R?|TΝ;s*QoֲeK7=>@@hPCyE{kioH3g N  PS_|aM6jӮ];;3GX*UJDبщmZ;'_@~       jEu        I 4PHSiڵk" :RG~QX̙lbʵJ*YZf͚nOWiͫZU\9׾xQ lسgڵ:l߾ݽX;5±懳czVz[ZΗy;{F([];t↼G5PC ,p!v0Q[iP9¯ RS  Lw~[i~Hڙg+I&:X@@ ǐ`6q٥FqCiгDAE@f̘a_~&Ol{5=;otc}Q+@[?j@q%eo(       -@Vt_Z        @*WVVQJK WR%Ö.]S8W`S~B .XKZJ*9CJJJiĕXaN z;n$͓ݰo߾:mӐu833әcݻ]x4hB򖸸8wN 4m#bZG%/ +Vf͚^bÆ .\K'u|Nb{<'-=Ahp Ӻ?h_jQ@YtߔJV;wtUcRgQ 3kݺuN:_)T*z! Ğ &P+<-.o 6CA"M6}t0a}W-=Գ7WJYc֨Qԗ"Z(e/`322*{z      ZeN@@@@@@@@:WQPG~:(@A~*Pȃ??,1ǻq0015n:v+|"KKK3 Z  %/Ч矗~#,@-g A̴S_iӦK_߿=6`kٲeЛB ?-o{j XDZzv ^ڵ1===J@@@@@@@X P+@@@@@@@@B0"tbŊVV-7DI-wZA *tz²-56-?ࡠ.^ /J _Ycyhq# O@&wCq+?545N~U`+ *XgitoUXV2M]~?UAY)))5@@'@-/ 5/6xFD@ݺu]6mDV4`ڄ@lٲ&Md|M8fΜizجY3۷]q.HK)!vvxiJ@:4&ԊIS@@@@@@@u #        K^E!I$OUZ\A 0ʵ|3۰!ED@nUKwPe_$w˾@@@ Jz6/|lCQ4 hlܸ:wR=K-h)@kx雷z jذa,pd@ƍc4:ԊK"Z@Z+WZjEt;<       :k         3~޽{c48Qaq{a{@%0wEN@@#PY˖gBM]Zj'o>9sM<مhiyfԽ{w \ifիW^QYchV*gZFρ(T@Z酮B@@@@@@@ P+:#@@@@@@@@@D@d' #5jm# 1!Eg۷|rL4F"  @11/PK^ziӦbmF @Q֮]³LbfϞmuBݻr)VRuH{XF;(jMAPT @ AU@@@@@@@R P=        &LV4*PZ @ ̝{NJt @@L@Zoq4 (fƍBHػw͜9ӦN3[tn&7n֬Y6zU f#\G ?j5m4EC@@@@@@2@@@@@@@@NT@d{5T={bմ@ 1kĬjhn%mC@@߰Yz<ѽ=#P^=b(P ;;ۖ,YbӦM͛g2.cƌqYݻw֬1kO@;(:տh @@@@@@@(T@ByX        @ (P++++N@b TBV1 @ s皝|r@+G@@@ 0[ծm6q"Z9)T$tҨo' DX~͘1æOMܹӒK.֯_?뮻\VӦMK)&֮5!&J#cL@;47bxIS_*       P|oǖ        D@JJ ZQyfiCh{/ e/@#@@"OwoI#NDu7|U P۷o3g-?Dkݺug$=zc=³:wl eP+^5j-m*@Vyd ۷oZA>I @@@@@@(AJ]!         +Whh m@D )ɼN{P@RسlrO.Cq@@>}̞x" Bzƍ#TJS`6{lo]˖-sl%u~_nݺYժUK:;m3YdžkuY?c h P+Z$&իW椧GSh        @jl@@@@@@@@bU@ZYYY|ڍY 1"o R`,t"@0222\Ykb vr?5̆Pw:#G8cu s"M@H;c7ŽP,iڈ       Pw        HII={ @a@h3Ǭghh m@@@/qbK{=n [0PPᛂu\K7nB.r7VVÆ #T9z1Lv֨av-e>#@V+j;jι       }        *Wl6m5  T@V:,A$DΟovTk  -p3ۼ٬v G lڵEYvvvKLLnݺ廌 Pﷅ ܹs]p³4ܹe˖֥KXiiie_Q@N>̻Ϸ7ӻ6KNw13("tQPV~b4@@@@@@@@-         K@ZYYY@`8:2-x9K@K[sH1D@@ vy!f&~jD.Ϯ|=%$$仜 P4IgY+СC^PuNRƝ:uҭ{G*z=(Q|$ѣ[<"O@;g8        N@-         K@x  Ą9f痂  -Pѿ#&N$P+l4VD\ry睶iӦc!?hРc3JV@Y/y Z~;Pz\`ְaL!x jժUPd+(gf0;p wE\ͪV=WDZzw ߿222ԊL@@@@@@@|DA@@@@@@@@~\eff8)@@ ?`_Ęh.D@@LZ(yf}n8|p(aM( Pb … `mڴN:٭j;wvYu)#,{;ʎc3H P+RVիW[vv6Zzi       Z0 @@@@@@@@XPVVVV,v@H^=WMX@@ ,X`֡C F@@@ }޽f,C Z{-333WTnݺ O@/}w zAw۶mB;k!}z&/ƌ1UeA RԊ3GU@Z*Dڅ       G@< D@@@@@@@@ RRR/Mh? P#f2@"C@Z#GFF]%  K@ZMf6`@FmT/~aO=:t5)..N;4}ӆRgfٲe6\Y+V#ޏ<+W[ǎvN:YڵK^H^ݬeKKs;s.@VAm JһҢi@@@@@@@ a6        *òb(~K) D}f^^ *  $nָ٤Ij)1 p-ؓO>Ҋ+ڠAr^3@ dgg?a xbۿUPZh.r7VVf,>>>h?a hghjBWկ欈@DJƐ       3j̩        'bC: .@-F  -+lѧ#  P}MXUD@}/D!@o)AÀ4֬Y².\~xVffD :t!Cw۶mkIII @f/|tÇ' Y }f*NUz@@@@@@@@z9        Ķ@*U={z걍A@0QZa@  @,0Tɬe@W!  @Gz\Q@ u]k$&&Z#5T ]6Wp!Bv6Wze^{ 5@X;r,.lM6B  JII t$@N:)L[@@@@@@@ P+         [@B'@-:>@.@V*TQ?@@+ЧΝfujR1"Z]vvgڇ~"=T dgg۪U\P֢EXYYuuY +ݴ>5kXys5v02>8C:dg6A j75Y@@@@@@@ Z_]L@@@@@@@@JH 4Pvn@P#Q}i  j>&J#@@@:v4ZlDJƀ6mdׯm۶X;[J^_r%i?$%%ya'5\ؐ4]V-kذ%M a+VfY/LW X۶mMYFrYVgR28rݻײr3 .Cs <ߠe6躓|Ul#ϸiPBCEUt&*999'4III.<+*kFzke5zURdo߾-Mkr*/LC 2SxW~E~·5ktcMҬvnд('a8YrZ@]@V        @;皖"        Za1 #@-I`@ -2SjEɣ  L@Z=d^x:Xe mͳ?>S6m PxP׮]mv{?PaÆݚ+?4((Б AW_&z>dy dS%Kk e4\{9Y "$4/_ޅ nڴ6nܘkPxi))(<)oؒB;uLXjZ!ZUUhKc´TW}ohPXi;w愠)tM5kܹs]p^gff檒B:uXݺu^z wˢBq ғK"N@amԨQ՝ #      _@۱%        Q):qPT6F!% @-O7  +`YbY*  賲I )e ۻk| eQՠAlرֳgOر)%E/ k6uT/{1cƸ@-k]x6`@o lݺe),+tXl VbЬSN9F0! APHj/SAHkXn Xî]rUWW AÐZl‘wB=(+= kQ[kΦaniSEz5hA߫^ ƍeZR:wjyH@r]MA@@@@@@MkZ        @)))gϞgE@ ;#/@֭;B @@@|*W6lDK/-ߺptJS@! zeff0o"=p%))znͅL2ŵ߷^xulӟ.Hosigxb۶mbe\aBE: Ҵ*U!vm+V+W~ș^ji_]H^ԭ[7X@#P ڨl۾} s[~}X෌ Ӻ* ߬_5iĚ6mz̠% {=J] P R @@@@@@@ ԊMk@@@@@@@@K@+!vYB DڷSs@@@>f}:QJJ@/6mdv=.xH,\sڼdZjeGQFYգ"m;r hQhV!-W`u)xfi>h>1Q{ҥKMaokXl뗴4@RZpG @ U       !@VysL@@@@@@@@.@VOC@ ޗΙ[liQm@.={xѢE.DK 7d=۱cG;B*k@ *UzOWYX~-_ lܸq{nYjj w}vg}^d wG+-SJ,Elt_зo߲9GA@@@@@@r#0         s. _@ZD @23_M    P"{a6eС%Kv@ ̜9~_|`ݻw7x.BSGO>j;=?ٮ մiWf*l B SQ\s9''4KkժXXr)|onw٪U,;;۽۶mB@ JJJ*-`FUK,1+j`:\Y}թS'ҥ隭i鎡5СCk/@|M        @l ["        Za1 δ@@ 2>6N5ڴSk@@@:f-[MHV5 W@/wy;vꩧ3 w]/55Fm_{̅\{#X͚5c֦oݺ5,hڵmBZz_1cx߳-РAv|M@A>ӧO3fYlΝVbEйsgC.DI&WnD@MÀr5C . ΝktQH# ѣ+h |ؾ[/ܠ,k޼z!;Sg5!!Ďˎ@dkarvi&6mM2 ƍLw:MN:9DB?L"A`ծW       Ė7        %@5kք.+!.N ԊwG"W`:qSs@@@f{͚eֳg0HN:ټy\DrOLF /عkW_}߿ߞz)޽)cvrTa7̞=~m۲e=]O?mzU0z?\2Wh²jJ*U\…8 s^4R`GZ>@IDATO?uQ߮zׯ_L$Q)N@nݺ봊¤̙c&Lp 7`;v0')K*FGsN¦U\nZZZ!      Z        Z.pB @ yJ  |i.k!   nmVĉjkz'#裍nv饗e]fڵ {yWܹsX"gP`fmԡ4\|9-Z0P%K?O{wlָ̙qcK/٠AVZLڀ(H[nn;ȑ#^P,OܠP̔;.!C|v*DիM@@@@@@@ P+9-F@@@@@@@@{  fj.@djy}XS@@@l$3~ 3f)FNW]uU`MZ y+0X<Vrг_*T?`+-o~c;ӆ v.>l?44+tz۶mnxkРۯBN?iZjDu7ߴ7x,Xt?|{WcǎDڀuغݿ'裏޳kow+pOH/ }W@       @y /7Sc#        PudGV@OB (P+99pբB W`f;Z:  Y@ZEތ (3ƍg?\DY\\ QtM~_yʕ+׿uN֑#GL_v4|I;v)C:Znmv!~h:6*ִiSk֬_4iba#L} /ا~j]tQFíqQv5g?t]쭷޲/]ӯjQF;@:x Z8TݿtI@       ĠZ1xi2        P7v:j,G6P @"O֙@;w@@H+2pb=SoU^fM뮳͛[߾}]m#_{Z@?4kýd7ڀ\XUv0@ ݻ?~;LwW3[H@@@@@@@@@ ڽ{wc@ ԊųN@PfEG{h  KkףsLzQ-Zd7t xK)gguY6b;w]}֢E _ꂴ g>mܸ ~|")LK!G(ԀE@)g5mj=n:{ * $"1III6rH0a͙3ǪTbz{H)( Pk֬GG@@@@@@(ʅ"        lU粲]Qj@ P:>;M6t޳&M'|R׹Y˖fqq`   %/`֣٤I%op ־}{Mm;{l{衇K._{";ڼy 9'<]~+ۺu3xW w0{Ǝk7x 2{[n/ҦMfj?.rng`C+V۷o>}ɓs"~t.{m_ . gmO+]yvwx+X+m_©n8v̻,t;M:t~m{sα^E]2ɯh;+~g}OXFF14C!/gy=9}g5]m8eԱcG{-\Юy)ئݳn=W^Sco >jԨ6oY8팴uJڮ;\2_/;\+a_ ga7޽{N*l5!      DZQzbi        '"6lNlZ%>@ hukْ%KUMujժbwƔSeժU9"  @Lx26qbL4FF‰k{B O-Zds)A۶msAT<ަ'\AW~TzrWR%/I>S2e)lDeԩW_i?ƍ?Wiޖ-[@Iϼy\Blw]deey)J RG֭[*mww"FnZϼB}ٟr)v뭷~kVٛoi S0InLiyˉ㥗^rA2+VtB rݧ-g?L-tV׿e/\xYmw\ "unWm(8`~ :Ss.>_E9_@A*WvL>>M{z*eǎӂ<&?]ioڴ}*\M_ޢ][RR={DuuF_o] p ?PK e%=ׯ_By]"M;Pu@ͥKصksuu]>By/[D麨{a        @ {#        p\K  @uT @ >\ێ5:wvr-.P\"BH#P+RD@@ 21S͑Yj}~ذaֽ{4o߾vWk}ԁO~;^QpѣˬN [z׭iӦ6|p4~xmVZ5W(d+h^aZZk׮~zհaCkРAn:*w? QSi:tۼe Q8A uu]r6nܘsB ݗ?*u6.l~ˋ/x}ڴicgq=.I?>lßH;~mKKK3)/32uYvmϜ9ߍ]?ggB@{ݜH@şMQ<- Yk߼+pv(SO=v<|r H]+P ;pK]uxXMW'{jbwu/iӦŅSQW&M{b}Wh~Q?l:B^@1cƸ -@-إq        \of        @ժUݱwUnu @dg׉OԖz" ZF1߉:(T%u#T@@"HӎOAQ+i&/k \+VXuRp՗_~izRσtz-Y}Gc[b_h~|@-5k1y7q]7~ r.+z),tB T-yy<.0 )L%(H@)G&t=:]C˻R~f̘az ry]s=glڵ.I>'|.J;mBBKa,hYv.=Z Z넮pwV0\`[nuA6۷/nئ ?E9l~בݞ5RX[7?p t-C1J6!3 RKP o?O dUwnڭzUWpr;vtuvh\E+@w,O믿ކ^ت9l.LbEa*+ڳg7΅o۶ͭ+zҦM˽w]yU\ٝSO%t+HL,f-Z0'_;޲UTΝkW^yժU>sUN=S!SpBa~hyβDZVVV+v\; yQmB6kR!O=qhXJ=sg=s£ϿC*zƭgQ>\p[_ψo&즐$h@Ϻ-pa‹r,{>/̗EVA&ڵkþJ߽-7^ps(XMԹ~W(ܺ׵=fw.qr݄i( _Z\0*T(jBytψ*}뾵{իWmׯ֭&r5kf/}]PnANtRଂwUt>'h"wCJaG 7s3VC@@@@@@D @@@@@@@@JR ))uVk׮-BR@ZqqQ4Q&{rȎ;}Չ;L%רQ:uZF :I ex饗쭷rY@lΜ93Ruꦀ,u9hy;E= lŊu 7|BɫJhgW3#F΢J!1]GUgMETɲ:T*>.5Ykm   P}͚eP(W͛7[zJڵ˵_=PShy7nBlD!. /)NѾ~i?)jԩ.JqxСuF'`1بRSS]uhQɾ(h&^IL~ cҹ*Ҹqc[=?Тa gjذaFz~?3WM(LEUcƌqO~ .8p{o(^eȐ!.4,m򫛶 j]ѣwAp:y6*Cj{fرvABl>o۶g>࣪6 %jBW" JpE*kAZ7TtU EA)CB $}{g'!Nxܹ;܉籖-[5ټy7t .S(_/}G75dg=z]|r޲j_}ӧO7e.ɼ^Q<^|3'KNuz)WECoo|%טBUP}+m.R j#}/ Py4i35!b-;ņ ܶ7~.V}o;իꫯ6]{x7[X ^o!P+b      D@Ldu         @Q ԨQönZTc? @D ѧ!1?կ_ wgϞVjUӠ/2ҡCmۺnܹ+Vp)4h@QFjs=ז-[rn] 4gc/scgqN-Y{:kA߿/w}w`qn})RG b_1G@@@@@@"K]Y@@@@@@@@2 h`6? S~۔)SjղO?o0cq}* ERH.XRxu׹{wqqqnyAyhk.n/ܾ{ᇳ\'?w}m„ .PLTžTE] 4iRIPnN;mܸ}.]PVW6y>2K9F|4^ڐr;M>&+,555;~E1-k{NmBXD.]!s Y,UZ7¨5jdcƌT^>oK9^ven5? \/}W z\ ?v~g}@@@@@@@ P+!=@@@@@@@@@XjԨAVȲS@@tbbڪU8oEÆ lݺuEJ*m6g))d5{ݻ˗W^yŞyCrڕ9|Ww1kvYgڧ2{C6߹s_呾@H?@@T Si۶ ޱcG_K* 9p :>s.2P*'(꿊x*gqFVKtBv~ }nه~Ṃ<%z.X7ް;υv)*?#p!oLu'y֬Ykto!YWe9uQ.TkS :餓wo6߻|m0qٚ5kܽ3<^|Ew2;. d6nNG_x9{K/^z,s_^+p8{u(][kP+EQy0 m{izr_ZJ / fr$jkƥY[j?jfq6m<<~xNr~.0~qFf}u֭ceF]@h       jEyW        Z@B@@ 6lړy09sXʕ l{W5f~>}|pWAZsr-V~}2dmѢE6pדM}/>M:4a;wn`?pU5\2,ZfդI~"  @i x9*6cy}qaM_|E3(C%xx?AJ|7nv|´k)  {B \'BAE5Uy_3/X8oayxb 5j!k*JE>Yڦס=XSFa FP /}gL R?n:ura7 qzwp s z'\Cvo۶͟rww~~ꩧ\' `k֚7oٵOasp3׿Cf ަ(篿zw^N9۴iSQH}2e[4h 7Fc7'ֹ' R{jB]K2_9\׍` ZkP~ 3oo9FmCڞ}Y=5kp e omUV fRPƎǪ=y,zW^y&n={%$$rG^]vXab* @u;mvAy +!      Za}h<        '@Vٲg@@4N=ngyW w…v뭷Щ }駦- aVr4˭ZjI'd/]uU6l0@*7ntS қUQj`4S 6dwZ@5S}Yͺv`k=߫W/]4xpӦMK.nh֭f[h1D@@P-믥 "RȄBwq[oe=v?q` #k֬qnذM#m߾m6~x[~w}.8zn;cvmO?&L`7R/oz?(mm}yW]غܒ6y^~W{L>{9wL+ ?܅enau䗝;w?w쫯_6ϴl:,wOvGu 3.0J!CXfުTb aO<1#3j֬yH0U uV ([t+uqw9Oxؠ\Ԃ r٢t^ Ea* #Çe~;r- 裏 _W)˭ Fr:_lo=m4馛lɒ%.~0{1YtgY-^ꚐoZ?k/+7+'<7jGvb~iꫯ= բ{ާ{ɦZJH6FE@Æ m`؜>Q~sտkO<.H*XK ^E]}x衇EO ]r%} @U;{]8„uڔ)SquBU* r`*ov>[(|C֭[7w_F_pn}ڠA\SO(pkС.D+pgӦM6)`J}=QES74ݷjӦ ٳgO^K `BԆ;M |a+~l|ТE SAΝݽoƅMe&^^{5[7];k{ѢE.SNtM+kk(ꏜs+: gɩ>--Fs*i_N)tU^K ȋoIQ<: PVŊM˻Ut[oX&M}ή ̙3]`sncfW8YN<K_|#<⦺oG}TRxv)Uw8}ҵIA\wNǎ?;ms_y)/66;oy>       @xXV,\@@@@@@@@r^`H klܹ(@ g쳥>5)%Cx G+ǻ/{ǭX-2ޞ|op^n3aA4Yp+Vƍ@ ~>yyҥK͚5vm6\r`Tk׮&޽4gPBi`k ټys7tDɃ O% Cz}?5_OǪ @.x eEFtI+"=h`Zja/wVϙ3Ǻtn:j(ס>h%@)a…w Kmĉ.l"}9SАy9Yg{*D {k] \GO==.{TR~/)5!oe7jz%yخ@ŋB-f̘a}^ ̯֫W/-?lKS s[n>1Ir ͗T2dHBsj[IiEF%Emo߾s ^^{ ʭ}4?m5\>oF;s|w[r_WmYf6G!:y,Vp΀ݷ=\Dϛ(0(^9v5(}9?ȼ?e<88ӂ^c?nfPbX`{G0ݷ_~˜~*&x +SGĆ@ vWB" 1[at mܸqvg9       @p."         ڶm[4w@@ ƏQ}*hTmECQV3Ӣ>"  @1 (P;͒Ȼnȃ@Vg.̅(%ʠA#̱Y+Wdµ}0|'W_Y͚5]74UHҘ1cl6b{lϞ=.tEa[~ִilŊ`(x%==RSS]ְa~!lB2>[Z¶wӎ9u;wuX!ړUKV T۽{wV,5J^Eu<?u\%1y|쥗^ӧ۩jvر$_dOUd(7Ǐe~Z@-}ǣ       DZ{9        9 h[O" رwرޒnE/Ö/7kҤTA@@@ 0/B0(Ltv}pB袋J*6dȐ8M5u]V//QFYqԖ>#o D7n 6ex@eV*Vh *g߾}[o?ofͲuZ,%%Ů>֧~ՂBO/4”ѣGjI7|;2>)H!\s?{s9>l/t08`VЙʥ^ګ.|9묳z_'sGt R0JvנPC^[KEk>y0aUZ.wMnԨQNs~P( ~ͶmfC-Õ1^{5$yI%86       @ U @@@@@@@@Q#==ʔ)6  j׮-Ho1+sڵ+ˮ(lg̙1JT@IDAT¸VXe'NO>9j*[d-]MoUZ˖-]躂׏8|ZcHSN9իW^tMֹsg\ڵ+n+'t?xJY(נRdCzP?>S۳g 'յOtaY}P)Wa<[yiiibiƍƍ)       @xqh%        %.@- ԡUV   P< jڴx^@@@z0˜9JV`g\r6jԨ OPL8l۶;<,11|A+_۷ϝ|_ZZ\_[?}6m4۲e5o܆ fn:xs7Wsׯ?/^&Lp[ Q] RV-<<  -i-Z}WN۷tI.0G%Q%($,Bz %pjv觟~ɓ':}tZ |嗭_~VrpRmC=GAXr;@A@@@@@@^s@@@@@@@@rP֭[ Q'@@ v$P+|-E@@ ?CDVMX VZ٥^j x7\HRXv& /ȑ#m+|?L+.,%%ŭП;⡐”uj}HX"- =IIIcbb\0ؑGij~W^ޘE z\]f S_n֮];ի={ Elf9w\:u ܼyohԭ[ !Ͷ< (fAVhԨQ1#      Z|vh        (PfMw-[0@E)  @Q ,[vpoM^   7 11ìmZk;vaÆ(bŊ%q?ڵk]}MOO6Szu\`UN:mR$+,wE_~{n[d R… ϶6vX/4K J /9 6oʗ/a<@ 4h`ÇwUA3sqr {mΝ׵T=X<*mCׯ3g똮ezرǞ{9;&8oi%.@-o       @H R         :Z*Z  Xܬ4jT-   P0x-ͦM#P`lU d;c1#q x뭷\0r/.s!;{ݻ׾+0amΝ;ÊI$}nc>s{ꩧln݄Sf!}ns11µhwr6k,7}m֭.#:¶JƍB74ؾ}o`?/ئM,&& mi]tnɽHM(} Pt9*       Jj٠-        ʩXmٲ%ZES@@@0Vy2S@@@RP;g^xN5#@ӦM]ӏ?hw} 8ЅNp viY r>ZLMM7|{1[b]x6i$g"C3~裏lܸql2@ ]ve<,WRX\\|iӦK/d DQW!![ ۊB0T8@{;w͛7^x}N[ժUUV5-hт 3d-vZ[h lw!ZIIIa[ {cǎ.N;J %P+k"P ٳgIc       Z!|rh        -PV-ۼysi7#  @ xchZFE3v  @{wY׮ P:u'ٳmԨQv[ll >.rkҤI &t[p(9tMּy<5L2vqǹC… ?{?y|^_g%z ![*H[lqY۶m36mژ~ J S=R`܂ _uS} }轡`-[# {Yf.+3fP֬YcK. %Kŋ,UU袋L1( [nqU!"}]av*EaЏk׺-?HcomݺխףöZnmvX뱫\vyɛ m„ ~k6W_\UPػw~EȬX–/_ZuT*V,׫W/yZaÆհiʖ-6D={lÆ jEI/       @* !         jEY  $iES+  @n![G^@asq6yd{w_oݽN;"۷f̘=qD_nݺ.Lw/>+ώ$"KM/K)Eg~ַ~kcƌ;wdƍ]Ȗվ}{SY 2@ʕCfnGjj矶lٲ@U_T mµ9" E-n7o6 *SuժUli]8]!qM6uU瘘n*$~2>IA@@@@@@n{@@@@@@@@rU'Ǖx@@BӼdâ4@@"XGQ"t-ʗ/o ru駟G}dO=zVvm۷˺vjڵ `kܹ?ؔ)S\ݾ}5og?;/Ə]MKKsCA[z>w^YZz*`˯  jժU6lKmݺu\Urh^aFgvm۶eV͚5^z.$П[:u 6m7f6l0uֹ,UQ\r5VU}?83\h>7G)]pJp(u[@(~u@@@@@@@ /@@@@@@@@V@Gmٲ%y@@G35 6R@@L !0[#*z*Ud~?g4i}6rHKMMUZΝcmZ6m\B ,~~9s͛7()HKZqMnȐ!+eѢEϟ?M}Y[j['666CȖ m# $PF 5p5kڵk3 aHG ,IJlٲP8{$x y=^va#tc US7oqJJ%'';24^jzk d֭[6-SPVݺu9B^ @ (Prs@@@@@@@BI@P:@@@@@@@@ OH  /@-:_@@(=N$l4J,pPQG7liii.~3f~u7n삵4MHHDW6lBZ SB((dӦM.(Iԫ&%%w2PK֭]5\c{hѢ8g/_d)$+l)`m֬Y+dU0Wu .;KTͭ(|kÆ -?XIS~wU?IAM\ѱjժeZ:MUTq" QcŊSͥXaN*̟j~Νk׮ClRչR cg׽{f-)(w3C4)hcKNNv4m:udG}tQ <PHUժU]rXxyfcٔ) ԊNх P+lO jP6@@@@@@@ Ԋ        d/kAʕύ@@B_`ZC@@C[73/¦M3;3DA@+T?@WZB~'S}-))=ߨQ@հa @d Ԫe6qٱǚofcFv]h YٲeCPVbbbn!      Gnź        D@\\[JJGY.  %fY&'z  +Pya+fOVEZ]@Y'|r`M6p-?d7ް{Fߧ;u!h 7v iGi |;7FZO8p@p9Y3p׮]jEY3       @*["        jE٦  .vqEz/  @fӦSi+ @Q Ԯ]N:$WnݺΝ4.]XΝ 2E00F4klР0KXrEbbb.       V@ =        ,TRRR"t @@PVWz  !УٿekYfZ P5j԰޽{iǎ6o<={͙3ƍg{µ-uQ@ <F0Waf0k:#@ڵV֬Yl̙Z*USN-m%(呂!!P=DhD8pʖ-=@RRZuJh        Pj*?G@@@@@@@@     "P+["@@@R`@f  [3;fʔRjE ة:f[ `kOT{ > kΝZjcAG7}O|13ގ֯_111tڌ@X \Һu}       E'@VY'@@@@@@@@"R@z.P]v.s͛qi:'w;aO͚6 >P"Zuhmd(PsΉ @@@@@@@B UhBv        @d Zrrrdw!   ԊN=@@ {1Cͼ|Z0-/넰84 UZ^\{zj1cM>M_~eۻww-pnݺYΝRJfL@^|Ѽ@;O7=iVr1]"_t&jr@dkݺuPh       !+99@@@@@@@@^ ..RRR_g@@@  SD@@:u;Ngiʙ5l?b @ 4.Dgy=.Pk۶m6m49r Zy'gϞVzuڵ]6~x[jU7#" +,+u4J,Ѐh'%&&F[/       @6ޟS@@@@@@@@@ <  !/q   -pfcǚ͝k֭QVFY?R@JCbŊֽ{wW/[̦ONj<8pA(lG.tuVL3 PM^Sz6MȃZy@bX`ʕnj1,C@@@@@@X@0>y4@@@@@@@@%P$9  (\/+  D^}լC웲oZ  @4~T;<פ;vجYlڴiwM7dlu*T*ݠ'avUf]j6Ma$@V,1 Rxi|||       N p5        D@7~JJJw!  JKA@@BBMn3+[64ls< @( TZcwyM<6ols̱h=֭[7Y4im۶-CI4klP]B4* HR@Z VF @@@@@@@<x         @ BJA@@HN6S@@@vƍ9۹Qi* A@@eN:ٵ^k[/^lGf͚ٸqkG}]GYJJJFD@fkzWGCcI U3j%&&B       @@\`@@@@@@@@@  ޥ߈+b  /@V#Z  @ Thfzslխ{r  -[4Ջ/ue6m4lʔ)O[zzo޻F޽{oqqquڏ@ (seX!C{]pA!`j"@*yv      @@@@@@@@@ {`W@@i}oVnH!  @t x 6|Yr]B( D@]/A3ΰ'|͛g6m &X>}\֙giuq[\snHw&p)f#F]y٢E]@[&E%rJKHH(ݱ@@@@@@@O#$@@@@@@@@SJNN.ðo@@(&m7+[@@@>jVY2IFg@hU 2Ğx 駟LGַo_>} :m۶vW-~ˏW} x!֭͆ 3۷/(ZcK *@Ănv       (@VT        @Q h2( U @@HI9xؒ;&GB@@*PϛoM7 ,PӻP<{13gx7&Nh 3ggmuԱN:ȑ#?;vD3}"zl";b PXy9l޼ٶoN!2,@@@@@@@[\tw#        @ne˖5jr[@@@ n=&k=@@I2//ʔ1KHf(@J]@4U5fwo>S{G2t_Wvꖕzi вSO]~{AeT UΆ@RRkEbbb&       @L4v         @ Yrrr6!  @jeK   BcƘ+goYÆ!0 @ (`kȐ!Oۂ lڵꫯZ-W^={ZZl.lkܹ=i_`pSO5͛=[ ,@Vʕ+AH.~l      g@@@@@@@@@ gXr&Y@@BV@=54 @@`v;ww6={j{zX2TYV=׶m_30.C~-SeW˖-kr^RW*Tp4TUX+W*U?@BQ^zvy繪-]Ծ+WGe#Gڵk[߾}NrAڄ@^|Ѭ}{+0{|mdп=o UV-r@@@@@@@ P+,ND@@@@@@@@t,%%t@@@@ X@@p m6۲e[qVuc7 2i)4+EU  r[W߷ZZLZv(8rʁШ*UXJ^bB2Ue|T{>{n$-ܹͫiy>8̟Xrf3SWVE~·~uSk׮muqU "  W}С7xM:&OqwmWI^*EA \N>֭k;֯_=.?C'y P t߿:իZ>)tAp-lCA x̆7 3+| (Xߵ) P2 R'@@@@@@@`5G@@@@@@@@,4(Vrrrϱ@@B[@>?@@ rz_54UU04UURpQB0-[p$$e b``Xb XSZVUlӧOwS۷/prʹיBQ¦ڨQ#KLLt5!!h=  @ p@1uXzz{6`8puQ|7ޗKecǚuf6fWlSiX 賎wɡY){(Ⱦ)@@@@@@@ WcK@@@@@@@@F ..RRRt@@HرìjH}A@@tRSS?e˖|+Lrʦ"USt)ȯ RTT)m}l޼م)-*~po6lp(_ٲe~֤Ikڴ!U\111@"D@]tqo7~駟ѣ;p kjԨ!.p1f#G&{DKR@X.p>g        jk0        Y ԩSǒ---b!  +@ 2@@BI`׮]… TK,qu֮])|7Jъ %-PLum۶~޽j*d SP3lʕuT֬Y3kѢlM8;#]H\ @PX֙gf͛µk=={'q:wm6qf_~ik4lBKX@qɖ0:ZkݽE       Y % @@@@@@@@@ X >>8`)))AB)   >۷U>  v _u݅h)@(-- ,kN=Tk޼ RPUdi,PBtVE5kҥK]UNj/ͪU悵ժU+iӦ5BA,}woI?{6bS袂ս{w+WM"U@mX3{y 6PaC\ЊPP@@@@@@@/΂5G@@@@@@@@,ab!  +cYݺ>Z  @q ,[͛gsuۊ+L+K@[={@<2:҅ X ( RTXWׂbG*XY,AEIҔ=8 IHL>u3l4JGOǏ}Ww4|jϞO´,T       @Z#        @իWw[Y@@K@^@@ Z`f͚Z|֭[e˪uرvکEn{kH(@Ŋ]XfT-\PwĉҥKB;8]v੬#D(^s5n?\;C믿^W\q V`- :裣tt;ʔ}V>^ץA"-Ԋ@E`ժW^ q"      @@`q(     8@IDAT   *PdIYƍ㕀q#  %Uݧ  d ߿_ӧ~ ۤIuUrtVZYAHNN-z5g͞=-=6mN:-'xj֬y+ )PZ5 2-w, zGu7#Թ瞫~`%Dc.\^tw+RU ##C gOׯ @@@@@@@ fԊK@@@@@@@@@(^pÆ #  @iUlЫB@@B">@3f̙3cս{woRխ[7vBr%hUka߾}Zp 9R[nU֭]qY^R7"ԊF\r:3b5Wo^5hkYn˭x}Wzcy=@>֬Y={hC@@@@@@'4XƊ        HLL$P|  @%P+l4  P(e˖{QǎUNvmR}YmܸQ?{1wyiJ\ ʲu]iӦi͚;wVluՐ!C;h׮];z /%JӃ>+Vh޼y4hO׭[W?·(F:G^|Q9$@_<]mNիW~m#      DZza        &PfM"@@!gZ`@@0 SVԼysӷo_㏲ _xSz0@ b[7t R- ׳2|p5x`}ڿ(F[ $СCj!-e] }O<х^yꫯtbƪ@R^K{(WQxo) #? G޴iի8 @@@@@@@ Ԋ`@@@@@@@@(jmܸp&  E@(  @>2224m4~_z-]|Zj;7l*A8T{i֯_ɓ't0`7֮]' }-[j.duҥ5j>Suͽ_s5={6Z+mO       @v@@@@@@@@r@ 6丏   jEg  @ ڵK<4iaÆ裏O?yi.!^m7_TR._vZw+5jȅn-X q$ @ 4kLz/^Eϑ3fб n?㠃h@} r|)$p/zjWiz_95"      DZQ         HLL$P+4Դ  @lǽ{2eV%!  Pht=.gѸq㔒zH͛7/t+WN^x -\P+VT.]ԧO؇ @l lRwq-[ zKm۶U-t=hŊ5hF4+]w]ЪHHH1"O`͚5*_jԨyG       a P+엀         5k֭[eR@@@ : ԊE/@@XժU+=zǴd >\e˖aGxI}(p6m*{sN8pUNi#Yfc `r-j׮ )lUvwWF2w\|ݻwąXK/~M:誫Ҏ; EރN:$wo$Dv[oN8AÆ {CRSS5j(u%3׭[BzkڂJ}QeayXZjٳgk֭M,>e}uYրYHÕ/4+PT)9tҤI_|QVvmМ9s[ŨK˗ 2,@ ԊC@@@@@@@FE         D@bb&Zp#  >o.zW 0'>t  E[9m޼ٴh"(RI XpMak,"{i[~ºn&}g:p@fVҠA <r?\6kNGuիo]z饙+WJ,~I+v}zty?/9 I5RjU}EA!PB 2D3gΔ} @{G)))h:LIkJ7FY. U~(G@@@@@@(.Kz@@@@@@@@1jժt"P+.,A@i7/>@@ <Ú?M5j6W\p8 ]q]۷ok>[7m:ԿYot׫{ݻ{`A6ְpB5J't^}c ;K.q曵m۶ Җ ]xnL?i&%$$dU\+{'gϞ.i)3V.p w6aÆiܹZ`Ǝ‘c=߿?vޭx15֭[r&SO=yݺujה)S{{nl}i.AFO?]k׮u3f[j h޻ロe{= _?#{ϡϜ^_K7ncլYS?sH,Lo?.p ,쨣rCuX :uE]F·,l*_w˖-[t1wY8믿. o't}Ȃ w_z%w':v7|S?;m̘1Rf_:K"d!^@dap\ec褤,gժU=pH/z n]Wv>+^vuս۽oq@/*r-tcc,Gڼy{رC#GtMv?"j#FOAri&MrAZw,t˂*.]il1 ro y *`ٟ@@t @@@@@@""@@@@@@@@E&ܰaCt~"  >%@@ \Riii:Bjᚲ@^mICsrdM{u=ҥ[]$ 6%M8 ÷ǔ)SX}Ѳ*+ժUӷ~+ko~;믿v… ]0wqB,Bl[~۲ :3ջwoFu׫rFygoO?0,RJ.voݺkӂl9眣zm1^ ֮տv"3 p+ Dzl/lp {ƂN;v Vn , j۶m&ѽ{wŠ~wwYpRq,,u,Bǧᇼ?sz}=ץcڻ˝Z7n{.s{,Dx饗*11Qڷo{u&PlY 8P} ~}{Ng{ \xTGA o 5k\j15#      .P"@@@@@@@@@@ t6rеJK  6&+!bp& @ 89?? o &`Y6mRv4m4tWdVRBf+³,fΜ9-+ AC6Q>`RA^uYزj*5iD۶msm槭;OtvEy6m2mٲKn}w-#l~ڵkWݶ -ںu;L2nSNzugy,we˖rʚ7o^tR-_\_}mfokɒ%ƍg9&NJr}OnOrCn+캅YP*{Ν]KgB8-X`~^$=~7ڵk$uP}9p ]?: |][n%}g}+W;{&ի>swΌ3\蝅gKܧzJ#GsyW1ىq/`kz&O5\-4BI-ls޽qK)su, w|^ w@- kTRq7E       Q*@V^8        @8,Pkƍh6@@ Zwcx @@ u`(Xt1bl"뮻N>lH.s.oԩ>Hϳ"ce8w-X׈#sɂvaھ},<&{YbEM>?̚5+c¹# sW 6 ^Z5Yڵkjժ,=cVZY͛Y➷h"H|rw .(W>%$X(]B;`;VΝ٭_Z~A۳o, hxg5qDy2{ {TlYu1iY^, HJJҸqdO+jnMiiiG'͙#/<-GA(?PpgsVQ5Pw)       &@Vn2lG@@@@@@@@,PkÆ mg  P$ ZEQ\@@` U \s:t>}hӦMpWhݺu8p~GmV_|lْk?3wb컭a?tfov47|1cu3gf9kYv_@{o?WժU\)2eʸ/>osExb^VmۖY$hԨQO|AfllB.]diO,G믿 *DZ џ^8X wޡϜ^_jI&.8ւ 2BV^- Йzps9_,pP%`7GwޓK^|z{ܠA4{l\}{ oy4C(WO"gk &bjg       @*g         jg @zzt5#  P@/ӅESzڵ/^\ڊT o +~:w-ZjժY6m{naY/5kÇmqi;vwwu]!0iժU\veTLSO=UO?~awYɫCf͚u 7hoV|Az*7f60ۊ׮]k.,^Ћ/%KȶY1c,ByO?Ν;S Y~.YV0iݻ]v g/pFUVmfZO49Nw͟?_^z~W7/؅xY ҥK6 JKKӀ\0Bؚ7o>Z[ӯ_?&76m, 2dw-w]l݂,P/wcmVp*۞S9\PN &(11QIII, !fi!dV|ˮݟ)f \Ӎ3-ȭm۶:31v/+Y_hnz/=1 BG*TH>id}YP\~^e ~=zZl;CދC6l7n /0s<0ރt^yW1AV@bL9w?;6m#Fςs Z ݣBxygWU!jOBkgnj^E@@@@@@@ <+F_@@@@@@@@"J&t&Ǭ_~1B,У?x[gvw%"l: 4i}Nm(ydR<^a8@ RSHf hw Ə@,ʂy' ߿ N ^ iݲ T_LըQ#KEdaFdMUTd/f!Yqg?oj ]ll\TӾ@lڴM&~gB{VZ }SN\[N`QܓDc X;v/UV=ڵBWw^_>b'B_v, ,n/bToEW~Ϝ^_˗0v{e?*zxKBB{1=sn]}J^/rU^^&rEOB#x n%Y0}עN;ԤI?0dJ,. cOh@@@@@x =GEY+]r&        ě@ZܐmrD3^@O`Ϟ=r  @WJwOh8䓽EnR򫮺JǏѣulٲahrrr}& ʭXQ`QRdK~Yq<Լ.eQ(i?G`;oT*W,[K~`sK,&?|ny<l/0(SNݜiիW/]aݶxb=zuiiEnaL+MTXQm۶mexPـ@~6%1zz]SO=>}hرܹsjpW/ FCm"Z gb))džћ-}@$~ -#      d߿~@@@@@@@@@ .Z֭3h@(;w+TP< P+  jy N]s59ryu]3f."]zj޼y[,zu7ov8UZ`2pұcC֟x]rڟ1XHM^W)_|^ wj֬Y=Cj~(:NuE'xnFr)iZED 駥.&j%7E2=0R ֬YFV^!      DZq        Q!`wT\YjE墓 D;\_mrI   8p׃%G vfpӧ'X矯*+dÇ׼y܅1b_ SlY?HOq|.¶Ϝ9SCĉEڷo/[B]nqs߾}ohԩaÆiҤI[nq71Y 0bi;5nܸHA8(Y>=-e„ :SաCu9_@#UK^tҨQ@L ˼k.YsV<}gk8@@@@@@@` LMB@@@@@@@@ j׮H" Jl2uT  @22|=`>p_ ڏ ӧ[RRR\+nA;vt>lj*Gqx?H|ѣfϞkUV'+`djӦMӌ3g[oO>9~mϽ@Bc32@ N92g{.Tr\pZvGxBz%_Vu T RtKeؽ{]#֮]ĸ +(@@@@@@@ ms        .PV-[.ڇA@@ o߮ʕ+GP   @< WSN:.HkѢEZtSu֪_7|S7oY7-)p!P+dy6d!'W~0ϛ7Os,Lzܸ^xmܸхviq q,йsgY~RvtE裏v?g%2C A ==JV1]vUԚ5kTnC@@@@@@@ Ԋ;#        P@ڵkU@3G@l2t   @$E ]$\Gun&͟?_)))?~mBtզM]uU2e6lJ  |P}Q5ԩS'׵kW}.DW_u{˗MF kj߾}fm#X+2n1ck]@*.CkZիwh@@@@@@@kKO\_~        @*g  @j^@@ J m9 $''k{'ϹF"@$ _^ӦM^Oe˛Uq^Iz駕^v? &[n*UT$  Pdf͚eku}mٲNZ亩h JI'8P8Hػw^ҥ#1ٷ;wbŊ19EVN*lC@@@@@@..s@@@@@@@@S&' )  @ $  C #W ZФ+P{av-7x Z`k͚5Kwy֭[e˪uر,]vjѢQD 55U .2o<&Z m8ʫnW ȓ{Q#ҸԠTLAZX@C&Mqƹs1B%O:D rhy/>8#Ȑea۶mRJ WugyE@@@@@@BM@@@@@@@@"EvnBH@@ΦMF@  @LZ1q9D X r׺Ѯ^Zsw}_uԥJQG6mڸ-[裏VÆ R  ܹSK,ŋh"i&(QBGq:un~۶mri.iJiŊ̙[U:ulYmcRuhLk Sy2e<{M7gϞ:S\RB+ЪtiZyZ ޽{]s=Zx Ȑ-׫W/ȴ       ujE%        Wl"?S*Togh@bB&֭[LA  DZ A| ԯ__/bγ`-\-O?VZ ײ-bCAҴl2/qҥ.Dk͚5UbEڲ ;{Mk%薜Z@k>Ξ-5-;^- \l;Im (`3dO>De{0_ѣ党^!3M9B *SLZ@x Z~x       Z9@@@@@@@@rHJJrlDP UZ #  VAJ@ y :{ٹs 駟ܣ}Zz222T{`#8BM4q7yr lb@^ 6[|rn!Z;vpT k֬F-[aÆJHHDժR%{^W,l5ҺuQ/d{9g ۲k vFYC@={Ԝ9sohرu]\Zzɒ^}'r(Q"`ZٽtQf<jYud$       "@VR)        +Pvm7ũjufd J&^޾}ԩ&i@@<Zwy:hX:wڵKl2nYhNgZF 5‚ W[Wy,+DM"VZ+Wf.͎RlY&g޽<:ꨈ{ ´9m`V;ps[ewS![x/yق @?|W<&L^xAwuP'ڹ*i($ KL24ٳG+Wk׮u?E|@@@@@@@ /=!        AYJx^*C@I@@"A`>_/ԊA@զMdoBw/|gEbk?Dd}p-(:999s?o!E-pw9eI-DBX+%KTRR;Fc=CZZ-` ^Ⲱ-[V4Iڴw 2-d x br^رc5l0?^^zy=СC{_ $psҸq5vFjoٲ5\Zt ĭP@@@@@@@( P+ /]F@@@@@@@@ kԨuօ 1"`[!P+F.(@@b@@ bTRa[m۴zj$ѶnaF̝;=n߾=KVڵkµ6tbbAM|ďݻ`MڸqAcmlu[3qw;vY-;wV~T~}ffcer  60h5s`2)#w,a[_4@ gƧzJ]v s1uw+^Y ʼ,3 .=P3yq %{!( ʾYx(w%Ջ2F@@@@@@@" Os        ģ@RRq@,7M~afC@@pj΍@@RZj,=p5k+{lf0=ł,L럅@Oڶ-OܻWZR}[.ok>q;?@(@v4k,^Xۚ8q V8FI< M*ٍ@ >)S&z]ݰa}vZB3F@@@@@@@ j*@@@@@@@@7&  EXx7o^j8@@   t :#r-|&޸q[J_OIIѢE2,)##㠪-|ڶp-RR%ͶWP!s¯˗/Bm\r*[l棭B`Szz,_i׮]=Zȕ-vl \$93 DuM6iVF-[5Jx,s{I%{O쥸f/h¶[[n)W`- /meW9 @NYoС:s4n8]zzsϩI&9¶B 4l(%=,Z$Bhd@IDAT P+<ƾ:eC0Tƈ       PD        ģ@RRq@,O?c rT  @ZwGL[Ҹq|wuVe[N( Zzuf(mHYT~Kҥ]V/a{_Kyo؄9-e-6 en罙ў[XgY)OX`ZjW,`eHF=6QgϬ[-5UW_q s/ k>ZFA@ }x5x`ժU+~k "U'^^V5*Z]@#F jYX}bZ}        !/=b7        ,Pvm-\lA@ `T/^XÇ/Y  @   u6 w*U|X,j׮][eSXؖAU\t}=mynپº,ojU\9h³ZHVo,N&̗-=zd ۲-;o{2S8)-MBl-/ˍ ]v{Wƍӛo_|Q[c W/g3z鮻W/5!Nfߏ(@6Ҽ//u Sh@@@@@@@ ԊE_@@@@@@@@$7Etn  @ ZJ;wT˖-tt@@ WJb2&(TUP-<@ ZFr=^Vޯ\QGe J(d8 @ ,0[oU5tPuIwyF-G)}G^n]*Yuq&"`jj[N5k }ahƺR^0N       &鉶+F@@@@@@@@ ڸq3 G  DO?:ޢEF@I Բɰ-̂ D}>_߷|[ia[l4}Zqcµ/q2$]NDy5k&Lqy?W^BXmdpɂ-?P+VGɸI,ZթS'5 앺u놩4       MjEբ        D@rr222~#B 1%h"5h@+Wq1@@@ҥ{ @O²<ҷdΝmYȖ-~*=dT*5k[,l˿ޤ |BD@I/5´z!CM6zt%Ds <8 XV)@I j{rB#Ł  +Jw[?mY#8 /XAА}![_\9{m*;~eجtѾ-7O>@ Bʖ-Gy{?ɅjuQoZj=n  _Ҕ)%Dn?@-#cv{7m7Zk޺u@@@@@@@bZ@ @@@@@@@@(WUiZ@@ ,Y-[N2@@@ P+E@80m[BFr/`5k֭#_#- /-Zb@ |}… usz'\Vz}-ϻ޽IԊG ߿_%K̾(ww2vZիWE@@@@@@@ ԊX@@@@@@@@@RRB"M! @, |תX7)7+/@@ػW*]::DW@@(QBjطXH`YNZeaʕ}[ԩX  `/BcǎհaVRLGk0`4xiTF~8"O@_ OZ۷=4-"      D)*/F@@@@@@@@ JMM G DW_}]dɒQ:  UL쎏! %PdI'emafib_lV;`eKɖV&ɪ3@x,<1{^z "*?g;SK/@d rJ+WNj }ahi@@@@@@@ ԊƫF@@@@@@@@$E@O DjČ@@"M =@H&@?,3ݻ?*//orzu[7 '_l2edۭX?\liB:0~DAԼysW:u{{ <*T8Czmbg ddd(!!!K\b4hvnݺt         @1 UT        @, $''{y3Q@@ ,YDW'\39@@2eZ@@ "7 /dnT瞛u[$>}K`|A[EYgK*QBjպdK6RFka@ڵӼy\wyG=z(h5qw|Ґ!Җ-p8p ."rYV#eJҀ Ԋ@@@@@@@ $HA@@@@@@@@ ,P+555ކx@@ ӦMSbb:wڨ@@ XV@@ sVz+Tzξ5'%IrȐ~㏾^mT/dµmvu ph'|N+?'zg̐.0!zT gZ-Z}ahqڵU€O       @ n#        n ڸqۧRH @4 {:3UDh6}E *6m.\ݻw1i@B-`ZeʄUC@hTjVw܏_'-1Ѻ*#|˹=?kdA[hA[;vMs];R糆 p@rok /1--ͭ|$[Lre[7ZQ+ բN`ʕ^n'SN>0@@@@@@@x`x?         .222I+d- &`~FoCg  Q"gOlPD ?D@<.A*H]eA/|ly ɛµڷ=v N Od裏*99Y^{vڥn \:KV)=]*]:،@ k@]tB5jFؒF^o &ѕ@@@@@@@X P+.cC@@@@@@@@,PJJJ7ZHM ĔӽKSOq1@@ P+v%#A@ .Q~tI= R&_Gi`7ސS^x(Y-;u>5@ ^ƌ;L׿w^vmJ-P#җ_J={y(;H ȈȾbV\7n;hLU@@@@@@@ wra        !o6~{ 7RT 6DEA\"** RiJQzDZy0I&ɔs]9)ssKU,}jϞ=뮻T|y/t"+ @X .\X%GV^%.(-D@@@@@@ZP@@@@@@@@T &&F7o3l@Ȩuex=@@1;؂(  @( )#o2ziT1_ {]}(6rd(ݺUb h\2}4zԮ-u[:KjHʓ'r, Dw -ܢe˺>--1_>o+{=BͰpjD~S#b, "..NUV dWA@@@@@@@ @@@@@@@@Ȭ@lll   p*UV&efSY@@ w]ZG@S \wt9"]}ߟyevs8iino$;?[H#5i"U(/pFzyi.{J  @|IO^{-Z´ƒ%V3tt;+GANޞ7h '̵uȻJVF@@@@@@R@>^עEܲxb[TdI70v4lPիWW(˜@ 'T{W)SFڵ_֭[{>TB1Ci^*ArW&5a`u*W :stiӦʓ'OqD [㋋;`¶>L3`_Ȗ[ 5-11#yEN:t Ud(+cYb^.Lega+po^ȦI jugM6p;Z8@@@@@@@#@Vp@@@@@@@@Vƍհaèu`  8 SOwުQ,  ?P˛畂 AXvNJ+{Թsg=Z۷wϘ"=(HTIի˖/`nK.ٳ5sL 6Lwq rҥ."]pXb&[ bcϽtxhuɂx9dIZ^7,@I݂# @BE_1 " hɚ2e4lٲ:4j(ZVP.R hٲ[,]|OoF׿tK[mݺzh Lm 2k/ ېΕ|SڷTԨHW_}[֭tޣau[^6lH&\)/DGҎ sի']!^k֔k@d 8P5iҤ TIHkJYD]ϵLJ,Jƍ^wVhOݣ_       !,@V        @TVM7n O@&_k֬_|M-P-  +૿Hm@۷kz7_ղeKvmٳ%PSB k׮n3f,Y(zGtgꦛnҕW^ŋ(m/L5jnRֹ{o^-c)>޷_/pV-fMbu{QAA0%誫 d=(@\H#GT@pzb%B-{z@@@@@@@H@(: @@@@@@@@Z*ZمK ѣGOSݺuät@@>.r=@@ 5zh}Ǫ\'t׫~)w"мysSOɾ}]w};t 7hW^6x(SFjַX޽f,pƿ,^,_/;o3.z_)["ЫW/z믿TdPVSyY2Jz7{?۴iV}ήXBM4 n: @@@@@@@ :Ԋ(@@@@@@@@VjժT @ ?ޛt,=D@@ ߆"E؁ DiOhٺ '[nʛ7o0hp [F?P/4h=zGq[ٱ(!ʷVΝҺup- ڰo}>hQ_Z¶-Ԧx䜀}o[k͹C% ܺ5:BȀ]Ӕ/_]v@N:gdrQm߾]1 F       j(7!        5B@S >|M|7vڧܟ@@U|B @uwA{믿 Ngh(T9shjٲ 9rԩ"= n+'⑦Z}F_m۫w:>t[ö콅nY0+PLuY:ujTjsp= رf̘;3'6rJ 0 *kܲe?NVԜq      W@zR        Q)`Zmf2  Do[ꡇ3h@@I 0@*sNu]zuUWi„ YfVx"N}ϵh" 2D7v!t>,x|"E}KZ ֲGe&ij露8~enU[gxE #f䐈طJy"b( "u;C }2n[Np׈/ꈳ -@@@@@@@ A0vG@@@@@@@@{ݻWJ.}A@Ԇ B6)  7 w@'_o߾A̝;W[^Ԅ@ hBӦMg}Aiʔ).3Έʔli,~K._.M :|w|޼'J5jX֠-EA{!vqQb!}v `Zwƌ袋¡!Ǖ+W>6j(| ͥݥ$OniLi)!AڼY7O8QNeK~w+$/wDy+WڷVzawY|u̠9,pgPp˹\RҡC%w{BdL 66]};0_|EKvƏ'ڽ{:v9s渍Ŋۓv^`/XO?֮]-oYWZm.}cbZ*TPd @@@@@@@ jS@@@@@@@@R3l@ lRX+vҌ3d߿?Fh_>K{@ӈ#4h UYB)  Za~> @Pnv9RnZ JT̞=ݧ.$-Gqh,(y ڶz[3F2EZD2?gtoln-+M II0}x ׇ偸}Y*A D,zV^=̞nss{pYlG@@@@@@@DN3        dJzjeJ@rS暤ɹ/6㳟R٣ߺ;U\P@@@ Kje@\`ҥz]V|4}  ƈRhv4Z^wu\Pڮ]o} #/HD:lo_ipi$_|a[WµnMRE{iU+xqqckݏVcx+PN *Rw: Nj/XդI{YgZjѣ*UW_}w3f(11m+Z*V;q?Pw7ߜLi![eZYשdT,t@IDATP+Ph2`       ȟC9@@@@@@@@[>6n ! ӄ 믿 .B]y啮g9m߾]SL͛u뭷ԩS5qDmٲE{Mzql۶M-Zp*UJGojzl2=czguq(P@fΜYfjx3=䓲Ix3fZ={t_6_3?A}74|obQ qǎzd(QB_ ´u]:@@ B4 @\x衇Թsg/Kn'裏>cTڵC\p/^,&fYwn:]r%2dJ6ɾol6mgqlh .m&ݺusZJ7xIH>aF:m1Bgv^<Ɠ_ݺuOڡC}w:v옻yW>D+։j6lp ӧOw! < <8hߣ>?pKUD@|[wO ~Y}y瞓n RIm^O?]*Xy@( -[žeWG9]-P/+`홰=ogۙ)UjUw|_/Y5jJ.0-Nү_?SO=%qnCKNKVV|y?qmswy:>vH]Yx{.o6m/\]tqNNcP~GQ/)       dF of@@@@@@@@@D ( +N:e˖.&ʺꪫԫW/E hnZ}qkoaXUpa7AQDYbpYX[D֛&}{_D6d$³,;О={:´X?̙=z>p &7Λ7+tMz뭷]VڵsAb6Vo͋.(>I;gM||Q@@r^EFh  $_sܹرc5ydYՊ+\8 -‰Mj?tPvmI}]M0VkF/ ڿ `zy}@ڻw:,-ZK|5m4|FK~jʅ-[̵gdvς6yٷo[}l"]TYfjRΝ&ڲM4M"kl争Ib-Yĭ{dY6 &u z,\k͚5n"^Ifلw}{o˷ެUԛ&+ ȟ?[}}IX6[nŭ1Xyfb9r8$Y@@ x@8t@ lGpnƏ/ %Xg>|o5j&·) N7o^ӦM\/{vUK}mz blߎ6~i?~\??Oh[vm…z\p@Æ կ_@p>iu?͛'_޶YЖݻ  ײGN'7:uR0aZc޽]>jaff!n2*PԽ=䅜 AyAmR.{v!=qұcmZ7F[tSޞu[YT_۶mUD ܞmg+i=޾}nɋ{Ŋoz~ ]aſX}϶B }cǎ{tR! ܵŘh2D@@@@@@~+:@@@@@@@@>jժID1W|F@b!%$$ ]w /t?DZ)Vx6m&²ފMke„ te&@OZNٳG&*Yj]VfrZ_XסCտ)TP{{cd6ؿ/7޽{5ydM4)z6aa۶mz饗4d+V, @@ P+<Dl ig>8 ?YfI,,W^~ݲe\= u%_&l)|Y$yf7#@@@@@@@rN@%@@@@@@@@"Z&`'Cc`t}ߒN|7d>'Zj 駟_V\]{v>ly곉g&l]vO?u駟Bc[\^}UիWg'oŮp©ت#FTR.   &@VQƃ R= zHwWnкut饗 /mvn^+Vg}Vg} oذa@VG,kΝUV]_FL:M;vHkgj,' CٴO`ljjXjUk|aZ6H+VH=&:h{Ν矗}6: @@]v{/v0+{οo۽{Wo6lη-[W@/+eʔq/{W Ԫ[)?HV$UƂ      @rmZC@@@@@@@@߬_>FP@Wg?C!'lTRN?hѢIlڵkO\u-ZuݒI&@.$W^&nt 3ŋ 6$ț#FInƾ  Zas( @6 6Lה \uV]yefΜXz:'0]lٲnwUd?$uł$?ic:oK~$XIh};.rY'0d8_{7' N&Lolծ-#]|4y~N: )п۷O|AP,Pȑ#zw\}v]gk[f M^,Xjժ3LZ=o<ܹsCg֘1cR~ae~C?n:լY3}"mj?P@@@@@@@ȬZ8@@@@@@@@H!`$j` @ R.]f76Vu}U16CWKY֨QqFj6m_mҰ%JhҤI:5n8 0@\sy;ܫ!bAZJR5lYM6ѪaX~\_l3]zC.rnN:sc;묳TV-n훑lҫ^{M< *C@@ P+lNEO?]O?,L݂sdcǎu[T۶mդI.]:Kd[Pm۶ ,%K'Ng}|P-Ç_%?J/U@Z8߯ׯ,Xh2eM>ݽRڮ];w[oW^yEO>kogLo7xCvϱO>t->Y=75迧Mщ{iȑ.' ( YkyBM nyzayt+@PbŊkݵLF^S㊍Uݳgnuz7+R;̭+ }eϯ|{f_X1ή՞۵K/… kСZv }sa<,,TŮ.Pl療       @fR_@@@@@@@@@OA  @n DZջwop .j5kʔ)׸qc5kL .W\rʹIlM;|p͜9ӅH: z~_&[ݶ~[UTW_3f!IpmKѢE$^{6{jԨn_w}[駟jȐ!Mվ}{vmnwyzYmd^s6m'x"E݁~0 *Է@g?@@A@p8K@ ;,,DΦҬ&ӷ{p_~eo paQ/;I?l f[{ Ĵk֬ -wg l٢s9G]tqJ( d(>=y< ([_v/u; ۧf͚jѢg!Ɵ'O@R쓕shi'%{):C7.jf\6=א}_y_ڵ=% @ Z]+uU4{l|ۮ'~yy6,kQeV ҳ>nݺ]:urav iנ^x浝OUtM6Mmڴq]zkA^~ )WgUVMk\oF܈ B@@@@@@v<&f{+4        @ X`ǏG36}*..M#:w#~lE 7 %nǝ;wjٲe^jժus!-?I;& j{3KftؿKEQZ j˗/97G 篵Zۧ]uqU_zm/s/BO;Z+J/o=^+wxLW^mjG  a  d^Bٟ|I裏&gLHHP…D Lq짟~R֭d#F֭[UnTٽ74_N_׬'ڴiiF HII~޽{2eʸWS>~vVG0aZc5_ެ7t" ~ .M$߭tYҐ! e3,\wֿgC5@ST*'a[/v3sxRV=.[l鿵kg ʪVZ;5,׮?+U@]͛viݺu>0wc !=zt#     W篡?z ?EF        %`A$sIk3@ry!Bi\mY(&lI>@´l_M(l%>/^\͛7we#G*8@@8vL;TXw" 3 4Hvv:3r74@Wᅲ?K.! &u:9@ &y?:@'oԮeuRW 7{ ˵kִ$ wSlll.#      @*=         6aÆ/EdC裏"yY[ҥ.r۶mzW5b*T(Kr0  ,wɲ+B @l֭/_KڵUW]全 S͚5عsdggհat(RHۃTROYV ,an9,ZHC ѬYtwGjn @Β- J?,ԩ3R۶Ak@B\QF+dA_~ JGɓ1-(CigͲ  OmHLL֭[.D,#A@@@@@@r[@>        @ T^]Ԏ;d 44 fW^anfʹtҀ5jJ,?;!  j뙣 )P\90` _zSԩSuwjMo syF+V vSjѢ[^q&+={f9,3;wqPvÜ̙߭3GÇח_~=zhŊS;hR׸}-J7 !{q ! R=k0acK.UR4Gx>|@H< @@@@@@A9M!        @ ԨQÍp>R : ȒAaZv/&K.\p(v  @Zŋg**@@ ڶm~A_|V^ƍsd;wܹs{nm޼Y?|i`H;ugcǎ*P.\I&_23%/kQ/ =-^=_~z衇&Ν;6 Mu$O/L,PB i:E]JLLL$1!      Z9M3        D@Օ7o^[.@x1cƨ`[#~ @@}|Ŋa i tU4o<.]Z]vj֬C~K밠wk3$"Ο?_t!ںukZJ|7oc4@n %!C$ ڲ@xǵk.=:́v+e˖Mshذcǎ ԪRJ4bƈ       Mje,"         pg1#D5vXvm*^x   pw Z'Ѱ@ڴi>@6m]P ԪU+=3ZfIǰpXd WڶmEiȑڲe^|Ez (PS+-ZH/ %&FcFCrʺ{5|pǧ:hV2eR-+5Pwdɒr'       @6 T        @4 ԨQCׯfƎ @D:x a  J@S @*V{G+WO?N:p:uYf.h޼y:~8t萦Mjժ38C'OV>}zj͝;WSCxt hP3G~y!+yI۶\ ;@Q/UGMa Բ뤂 =ZVٳG*yfD)f       $@V6R-        *PfM[.Zϸ@GjԨQnBGĘ  jp*)# @˖-siƍ/X|ڵk *W^z7v+`-(e˖i֭ʖ- .@?+VVݺus4@ /=򈼟~H-Zއn @f+ÇW_ҥKOfΝ*WImj,Y2mZQ5f       |(         @,PO? ^Ԅ 9.0qD鮻i@@طO*THʗ/z@ D@/ղL2j׮ jݺZj傍]H`ƍkϾ͛*W:v쨇zH{6mJ[@@KK.=I+VH?/￯c+ @X رcզMۺ:O( .YdK4ټy>h*cD@@@@@@F@@@@@@@@F Բw&Fƌ @8 |W_{0;   P+d @,<ԱcǴd͞=[sջᆱG}[F hB~7o[GA =ǏkʾlYho߮yQF.kuAZ 4 @+=P! zqyAuRR|; !v>p@{޽ʗ/FFtaٵi"E"l6-[J*^       !j@@@@@@@@ȜjYYnZN@/{N8zNo@@Țj/:8@2&/_>l-v{+… xb/|6,YRM4qKS/‘,z"e>>z֬YUViŊZ|-[+W*!!gկ_߅Y}jJ%J3MgOLˤK/>X^H"%0l0M4Isvv:&:t PB0\7Dm۶@9 @@@@@@>ϖ@@@@@@@@J0o޼nbC #?oԩSç@@ '+ʨ@2-P|yu-Jvޭ_~-dm~[obIԭ[WuIzqϮu>aߓ^-D9r r.dui׊->D@.?.u.}E"~vD; NL\s?|ڵKe˖jÇGS֎;5FA@@@@@@@ +jeEc@@@@@@@@@$ J*.P뤍@@5jx .~9@@Cώ@*PLYX-۵rJ믲իWkZv:vgWիWW͚5bU斪Uʖbj&gͱ{ƍi&jׯ_3[Nqqq:v돝# JW.R5l0i)]t@ mHӧK;KW_-}/_H@ѣzkjy&#s'[lq R@@@@@@@ȊZYX@@@@@@@@HU&$ )  >6ĉ5v4=E@@ UD+*@v+ʖN:h.i͚5.ɞ[Y@nM\,ȑ#Iǔ*UJ6{RJnZ\9-Z48ޜ,w^7&_m&`߿l޼YHH".֭]ޝ\;cό댄(KD"!VJ6tK7$E*mJQBʖ 3D}7>;ƙ9g^[7~w}(66֝yA+и4sԮt][oI p8 @ ѣGs g+aaa AVA8ˌ@@@@@@ƙV@@@@@@@@(P6MJHA@x[o5x:MO@@'sO @M&Y[|u&M6p- w߽VraP;v8-x*Q ֲp-[ʗ/RƓҙz)],4ʎŋ{Bd#E<9Dr!Y8Veڻwˮ]]RydUTQuW:שb%HSJ;KUJO?dH @@1c[nq{\AZN*0 y>-["      ZJ        hZjiٲeڀ# LIII7n7o0"  /F=  6}TT[M~gsN})fS7o?۷Omx Y(=\R_}>b[H7@\rbUX1 O\*3e;T}{y~/!}tP@no>s!6, [,>gQ@@@@@@@ȩZ9x@@@@@@@@8C &&F6l8c=+@@ 0&O, +@@@)<< @¢lj9~z;xn2l9|iAV@+_vlZ!Y)ׯ^V%KUZO ޲ ._[E_29e!Zល$S;%K=zY;u! ԠAM8QW_}u~u#-Z[lR@@@@@@@ȩZ9x@@@@@@@@8CVZnR۷+""@@5jnFUZ5:Fo@@COޅ ,X@K.U~'4  @ 8 oh@@(H5ΝimkF=z+V`]ɒ%ݖÇG&P+)#B@@@@@@K@]@@@@@@@@BXz*\6l£dh Qte˖1 F  @6$P+t  d[ :Z;V7NlWÁ &ϪEcǎ]wH [lQS@@@@@@@ȡZ9p@@@@@@@@8SH"P37@F`ƍ6m0}#  䗀j)_.   PpW^ #GBIɓN:á4 RP!(Q@{۶mRJ6       @Fje$v@@@@@@@@Ȗ@LL Zْ @NW^QTTvw  ($K   @xU)1Q< !"Dr NAG- #se˖Eݻwk       @Nʩ #        O|@Əx@E ~@@C?[-S&?ZM@@@O抆 ,Xk<@BEN:.TkѢE.TbŊP0TR@@@@@@@rY@\z@@@@@@@@ Z3n@`?'O{ .O@@rM?ϵ&@@@ ;4`G6#@foUte\P"-HZ[nu@QQQY@@@@@@@R            ڸq OԂ 8~^y陙\rz@@Zz2A;:  @g_fΔ 0@-Zj*]veSl ͧ-PXb1S@@@@@@@ȩ@V         / :v6oެ5jڅu  O=E@@ nU ,@lY3߫f͒Vsw[WZF@@ WH:IR۶mmFi…ܹ5kɓ'M6!;興oBv)H*T(Z"       =Q         @ll#>>@ ، @^ 9R7tjժM  .P'T<٥SN_/P   @ <Բ4wƍBIA@@ *$]{TocǤ{   y#p7  @|Yw]wiڵz4j(e޳gOtڿ~z?U$$$J*Iz       4jͩ        @LLワ@ǦLA  YI:q ڴ9sk@@@N[6yr޵IK 'PT)=裊S^dZիWW>}|X6[.S"""nݺl9rD{UTTTpt^"      Z         +%&& 9 !"0rH{M7"#b  L];P3밐?s=k@@@VB7vi @ *V´6mڤaÆi޼yjڴ.KڲeKv0 ׮][ׯ@+j߹       @ g~!        111:uC`4 @ i   (WNjPʕkgKԅ   ]^モ'$5p @ )SFի5|5nXO>WVZo;sf͚cN; ԊiU               &ꎋ˵6@2xUR%#@@$puRp"}IHA@@6m/@ .2ڶmNڵkk[ߨ׭߹sguG 6?cK"P+t%#A@@@@@@E@@9@@@@@@@@WʕcH ]믫*^xpt^"  G;JǏ'k!  䯀 g7<: (;.]_ ot-hɒ%! ӧ~m[._n}ٲeٓ-PB {Dn@@@@@@@ UN8E@@@@@@@@ bcc W`ԨQn޽{c  4\YtRttx   ]'-X ܙݠq@(BUVz?h׮]OԡCXBwuԩ:K\sh̙ھ}{yf^7m6UR%=@@@@@@@ P+O.CC@@@@@@@@  @@ 5zhOK. @@tt>>hKG@Ç_}ݧˇʰ  @ 9rDv]e=S>uIII:v[R??~N8|mAN?^TaaT$r˧a*TPRpa\)hѢ&M֕(Q-6yo%K-JJ^    oO~6" Y *]vn j5k^xao^:uRfch~Y9$@- .        /%I=         Sv:t萶mۦH@/o@@ g۷O߿G-ξ+- ϲ @*opǔAWN7$20+,쨪TYjվpA^RsY`W:˻lmLހ2e(<so޽{]Tj AO&Z{L hY/^=s Ͳy̒_] !*`ߣxn!O>}&McǪN:{իW/\F e.]T[h۞ F@@@@@@@ P+C@@@@@@@@ UbŊi袋~< @`?~ <0`@0t>" YBmٲE[nuMj}m6eY'N8ҥK'/yCj׮- eKrʹ:~~ +JѢEe$%%i߾}n񆞥~@4[VZfAjϽpyõT3 G}\P  䍀㪚4.$P+oi@+p˖kŊz7SOiȐ!ӧnTe˷~rZWbbD         P_ԃ        >TfMJ@Msf*R  ǎ͛qeӦM.@bJ)aY87$qI%{\J(Py%+ԩSd.\-Yڲeܣ>zhrj2RF }hg  [iS駟]+! yFiرwƍӋ/({8p *UZjo`^OV0E      ZwN        !'PvmB2 @@0avءGy$PH@@2׻S,c{ﲭDFF7       @ '.!        j6qʕ+CmX@8v옆^z B@HHLLԚ5kj*oZv{wY`eYQݺuվ}{RTfMYVtttHMÓ-[6lfւ6nx2|M8Q{udž~9թS=Z׹4uـ  &`Z_O<0A@ J,{o߾ꪫt=--uXBM6G *T*Wca       #@V z        @ XG}c` MRuV 4(PD?@@/_U? _zjmذA'OtX݉ ]r%ugeZAlٲ.p+- Zn 9[,Yw}W{qC:ׯwKddd0G@@e Բr%ZJ' @TREӦM￯޽{kU^uA.t/ @J*=v @@@@@@@ DT!r"        ,Pvm%KrW A+p1 6Lz/P@@^Z|.]e˖iŊ.LՊ+z!gXm ˗Wfܒz۶msW,|,xn֬YJHHpFDD`&M .p[\BRWk@@a hy>3Hۇ@ @ t}եK8c ]x{+Rsрv|;nEFF^k@@@@@@@r$@V8@@@@@@@@2#SN)>>^{nfa@Ȣĉ]壏>#@@ ;ǏwY}{]}% ܹx wy.8H;Wv9&l][Zn}`wڥ+Wԗ_~QF)))Ie˖ulR-Z=2yi|@@@ $<@6 @Ԯ][-7߬vڹxm۶Gx!1ZB42@@@@@@@ XwJ        '`ZV ˈ@@رc6lz5j@  zr~ײ~PbbT͛nsz|T.rx?VҥKxb}zecbbt饗.sK:u  !"Pqc a @xx>Cx㍺_誫r)+Cb۷o'>$$@@@@@@@K@:@@@@@@@@ Bl"ׇ -0qDmݺU>h~w@@p^sqZ֩SԨQ#]r%ӧ.bU^=d@EwB9rD˖-ӂ bvء(79q۶m݄0D  Ԩ!}i:; @(VNΝ;sӬYB&Pk۶mjѢE @@@@@@@P P+T$@@@@@@@@@ j׮%C@ 4l07| E  m 9sf̘ٳgjҤڴiUVp @%\ 0u_ܹsW_ڹs;^@ [o=cր# 9غuL_ .Tddj?^m۶U rR="@> ԫWOGN5k,}g1b*U/ڵZn-µD,  YQCڻW:p@*S&;  PlY}j֬bbbdA֭goeߩS@@@@@@@@?+.@@@@@@@@@ -ڵk@ȦѣG5l0u]^z6k0@@ $&&wѕW^jժi̘1jժ-Z?C&Lp!;i F RӦM]7|۷P- رտ/ @@!?cG g˚2e5cƌCd ZA*       pj)C        jmذAN 2*@Av&χi@:kW*U#I&Zt֬YÇ /P@ *V={꣏>JZr5j-[wձcB!  yW m@+pkqAO>=m@VПJ      ZwJ        )`ZGdT 䱀>3ݻuC@K`ܹׯwѦMϫq5z~W=4{lmذAڵӀTV-9Rk{T  9PwY= @~7N?vڕ][j@@@@@@@R           ;b 9ۧA2j@@BT`͚5ԪU+EDDhOu*,Za!mjժ驧ƍ][o%^sر:qD@@@@r|_Ԅ @^ ԨQC}ѩS4iҤj6Wپ}׾{        Oח?5 @@@@@@@@RR>l@@ :tH>^ @6ϟ^z8:UV-͞=;fj$ c|dpȐ!СnF5JǎJoѢEճgO/#ռys-Y$WڣR@C P?[W\; m"@*$// Ê)W^yYeZ'P?=ڵk][R@_ŊIǎ:@C`ᮣO}yMض &hيO?v-۶mSӦMݵ\rnuV%\v-م-ZT ]HTdI :T9o߾ںun&믿wߕj}}`>@{u}Pm߱cFQeʔQϞ=վ}cy/`->*TP(kv]U&M 6SNzGuvtSxx͘1Cֆ]'ZjzgTJ,u}kmf۲g}V ,]k֬i֬YGwn͵mf;tFzݰaÔs*o[K.ԩSyС^uYFwqG3ӕ jر.Pgowv-}O3e\o^~e=}޿ j*Dƍu JVԿ͛7c׿\̙3)S$u*}w; Z:v,h@ }W9bc0~d#>w1       @ 4        ^ڂ@leB@*<" yL&o=@ W*W&޿ z\MvgA46hÅUt+԰aC7]Mpmeodq^`Yȇ,ZMms>^m۶Հd#vd߽zJ'  8}t}.'PGֵz!-[L*TpSv]A;f.(խ[7_~ڵkuE.Ć뱅:t"Z]cRһg-뛅6FEEk];v躑ہZv1P<-,4Ă?( #=7i;\r%J>g ̴PL m ֶPU ?c=C qv,Ou N{*o>_Ȍ <C%M;2        wԇ        % &  @lѣGkРA ^_?U;(}==666y} >ꪫ\Y >!={ޙ}6uR)OF}]= ײ/vs[o]͚5s6 Ѳ@loVi)KZѶOF)9#1Zs:  P`ʕ+'tY6P޾{        o0WH}         @Zjr@H[`ذa.o߾i|8JO& ,[\K/UҥvZ7w\*5J^ݰaCYMz;wb7nt>VW_aU&[ʖ-nݺ)>>>y#G}mBG Nm/IG˖-sN5iD \?CM:5}q0/o{)9 [i]=&[C²vꮳTdILh^ );voڴk>V,[,0jfKfikܸqZ }qzޯ,Ɋ=bd)>^sΜ<Яɓ'g^zώ7N~>6eȑ#]HCmA^wv^ɾ 4>ǻ>?3 j_݀=ZH_[Hpo!YV,(sβ0oI?ܷzBGsi x  @2d~L '=oĻv"P+N}E@@@@@@HD'"        Eug#䵀Ӽ]5jH}iof~ڰa:o^ͮ-_϶(Qzx)`MǎK QuJnMj%""BDteɂSg|cVe~}- vIUcbbN}U;m@ #܃@B{{XXam޼YЗTZսL^ɵw<)URWiӦj޼L#Ghԩ@޷zKX*=aɸ'M$ٳuM7ŋiڶmix)`7X?:UB ԩSMPڵkW͚5K_}zbŊwxn '%%.]Gf/y=_|!=;*T vvcCiر{oN eƌI|@&}C( YuL;d>KgVr²,-D{СѣVZ5/f͚y}?[}6J@@@r:s`%$$oO?4|Y0Ixx>-_<'O uB]?SYЖMtmeӦM=ڋ͛7ux=L2:uڵk^{ͅr-z饗~;vptXVre;vؿ'e3ƭ-ZAxҺukPhcK͛c_xK}.ςu*_|rW+x|G/ewV1޻{Az뭷j*Z?s>eog^@]tEwuN7tP3={?yՖuf?m 2g]ve.P˂( @TT s2o{|N^>۽ [𶽶Zrݺu;13szF@@@ ,P~pԭtbڽ}Jݏ       dGQ8@@@@@@@@Ȃj٤GQ @X|,D&O&S0EuvZ gh ڵӵaYhC=J㏻a{:tRp .ڵk={jݺu@իWuwq qҧOY(ׄ TjU}'ի馛hۭQT)C P^q_.nqر߿{ncɸX /q}7x]? YΓO>~X 6SO=ѢEПƍk…5Uގ>|X5MjT m۪cǎ:ڷo_4jԨk{wPeAV6 Vf6T&BM>bĈLe\oݺUmڴq?5kt}[/zqΝ;'p7jYe? iޣJ׮]]9/}:΍w'OvX틽̙3[ʕiӦ^d]۟~ɝZso^{ |WK@IDAT@ .&}xfL}IY ܹs]3.@llw;uҥgy{+vjSw}krJI[؁U)pTTj;(NξӧOP Ӯ&Mrw I@@@@@BH dߏd"ڋ@@@@@@@@@? VlVA@ k͚5K_|E 婀'?ȕҥY P… XIvXKvK`o Ӳ-LJtt{Gxx u Z7tPu]T:utmGqkVYwm_{h.}M묾s9{+sbVR:D$Qyխ[vv_5y+6ޙ1soA};2lH촛8k۱c\Mbg }/^,ܻ]vnRҎ;&* k.ו?#WdW^m,Y2h!  ʰf͚eOnѹɌF?~<.k_f6oެ7xCǏrP@@d-[.7N       3(!        @kֺu2ޑ=@(|.\~ 0l X' @jS58q&N ~U׬Ys9'͛?ڵk5j(uu=oܸq>MΚ5K݊9s;s=gM6-R/n)PsF?2sn_'. +s.Oƍj @ @nv! P4Z|A>+ @ @ @ @&jՄ:  @ @ @ @ج@III[vhҤf&hHWc'KC֠`&@E.гg8sux8cٲe1bĈ8}'ڶm[#} C`裏fc=C?, FI @( tg-zZt @ @ @E- P/ @ @ @ @(Njժ5kV߿8 @n3gN|;ߩUP,ܹ޸  @ qꩧfK ;M>CǍ7iaÆ{-{Wgq4.bŊl vq?GtR} P͚5}'[R~<w˗/=zĨQbzĈѭ[:& 4 v/s='N &ċ/iN;o\s5z (  @ @^ j=-++R}*;C!vO @ @ @ @Ԫ @ @ @ @@׮]}tPu_  @@x㍱bŊKj~6\ ":wn7r P]mڴC9$[R)^gy&}կ~_~y_>zÇ5lذmbwMsii5mڴ:ujL2%^jUvSTz{cƌݻ7 $@ @w~rfͲ5  @ @ @ k+J @ @ @ @@ I?f̘Q}|7pC\xѥK"@. )Ğ(n4i Ig fɒ%Ys='O?g[͛7gZk^B! ̛7/O-JKYpܹs3nݺtP\p{DبQf @ @HE1lذ0aBp ;ttڵ`c @ @ @ P= @ @ @ @()) @ꫣM6o|:UL` @jC]v~eKUVe!A/BYPx뭷bݺuѤI0`@µK ۷o4mꟀ-[`…_=Ғ ڷoKvaYV ޽{q^  @ @TA`=phD۶m#) @ @ @ @&kPU' @ @ @ @[HBq @] )W|YV}վ@n>3ZϮE P!мyP˗gAB/rk2~;c١)LO>N;e[iݿׯ_իW,r ԕ@ْܾ~y7+7x#RV*7>#G]w5z]W. @ @:=ztqzh֬YgcHZ]t[ @ @ @ @jU-*!@ @ @ @ @`kJJJbƌ[{  @@;vlp׻P ]z @Vbٲ;ꫯƸqwߍuevq,(U"B#P^^g;Th-Zmfo /N=,.NK-*A @ @G)PkʕgavZ]' @ @ @'Ʌ4  @ @ @ @&>Ø;wn.AC]?%@H`}q=DfͪR$nDYiM @wik>իWG 19sf2k֬lߴiӲu ?\:w>3_w-6:,Wׯ_s{}bIn] oK봤I|%쒂mrHַolgN!@ @ @` :t &ljmeu4 @ @ @l@s8 @ @ @ @#PZZUTVV&PzHBE(pE{sL^A ZpTM Nٲ3-[gώ9sdH)))5)}v i۶mt%[vZ:ucǎFmP5/jժXxq,\0 J!Yiɿ^`A%]4m~mCz*/)H+5m@ @ }#GfZguVA{ޱB @ @ @jJ@VMɪ @ @ @ @ ;Zl3f̈}gzGG}4|xGLF_/pIV\ @,кuy睳esM[. [JZͫ[ʇ.M堦5k|ƍGv}YVZ%m~~M6VZUlQ~iѢE]NW+Vʕ+u^|yRҥK#,YdEeTJ0뮻n&hu  @ @u+0z_Lq7s @ @ @ @ >?g @ @ @ @ iDYY64 Pׯ /0;8w z^)P+c (  P)+*%-U[AOi_> jY(T~X$W4okcAY)06mF^S7B\u尮e˖YXZ|;_ @ @@ J.x1|ZwUt @ @ @K@VFC @ @ @ @JJJ',>,^4^'pB 6l{s> ̚ѧf& @NAS;w~^]W'k @ @+z&L(@uEyy@  @ @ @ PB @ @ @ @ @QVVVGr)GW]uUA[oEW}; @@] YѤI]@ @ @P`Yֆ{Ղ "juҥ; @ @ @ PojKk` @ @ @ @ _ jgKV  @ ,Y$8쳣_lA`LZ[ 6 ֮hڴ#> @ @%&NXP}JIZA @ @ @5$ P`UK @ @ @ @JJJʶ|# @@=cժUq饗փB _ۑ o+ @֬hҤ2 @ @>.0jԨxww[uzY;w~h @ @ @귀@}} @ @ @ @@A /6m 2T@o/8L.UM٬ܹ+WFr) @X6r6 @ @#GFFbĉu\`Af.]6}w @ @ @ @v N@ @ @ @ @ )L1cƌmę @HogAZ{nX7]`̏F Pد @5)4M @ @СC 80&Lu'Ϗ-[F֭k% @ @ @ @@Chڐo @ @ @ @Խ@III}GԠg?Yɥ!qhM @XFVq^9&@ @ PF'N,A@Ν;Tt @ @ @@7$#"@ @ @ @ @JKKjW&.( 't6$";$ b[C4k? !m8#6R @ @A`ԨQ`ҥK1# @ @ @@" @ @ @ @ PR}WFb @`OΝK.-&??:8ö|'V^ym=y @!f@q~ѹSOEgKO?^# @ ͚5' E ~P @ @ @ @@ ԪA\U @ @ @ @ e3fl`G @"0aB\Esݭ.P>\Gc @jV`ڈMk  @CVK6^cE @@ l2ArѥKB~ @ @ @ @@=UO/a @ @ @ @(DƍX @JWK.$N<1bDq??\VuykD4iRgd @@(->|IAGѢ. @!0jԨ8qbtv~AtΝ ?:B @ @ @S@VFE @ @ @ @hZfqcƌEg%@UO~gώ*;@ G Xժ P֮H  @N>ya),a$H @@UFSLFfեK. @ @ @ @@}U @ @ @ @((+++&زE⪫s=7A^y%u>}b @@Iz6(!@nݦ׹sān} @ P\Fe˖K/T/// @ @ @Ԡ@U5 @ @ @ @U())U5*G @@\s5YO/"n74x}CT5Tu @@ >ӬY 'nS&@ Pkn:&LPm5K,N:}-  @ @ @ @@ ʩ2 @ @ @ @ETֶ9 R`֬Yq-e];v,>THZCq! @`{֮ht{kq> @N>ym^q^ @SI&{ĉ|Y:w\} @ @ @5: @ @ @ @E!fϞ+W,$؜%\{:ksy@ ԪQ^ @D`U @E#p72K@dS4Q @(0jԨ ԩS{0 @ @ @ mUmY @ @ @ @VXn]Z @@AL<9~_5\͛7/>DX8w" ixc7b @]Fͱ @@] =tPf"N9{} @jB jM6-VXQWXZU&s  @ @ @l@ms @ @ @ @'R)++JD@΋=39:h]>x饏|" @y @+pIWGw?^"@ @@չ/SNA-X ksu @ @ @ @@U @ @ @ @(xmF=bƌW$@xG:~"ڴ߿V @hjq -0hPn- @@iiit)&NX*//MF]? @ @ @Ԥ@U7 @ @ @ @U())*@ PHks3_xqG^{UH]ӗ(0ujС52 @`+jmC  @h:##7G˩Tt @j9rdj-X 桩 @ @ @|B@'H @ @ @ @ @.JKKj6  @ZxkTB`{RֈSs  @ C@VøFI'FY/Q @I`ԨQuU^^;wvA @ @ @ @@ 44@ @ @ @ @*@WH @Xti\qqgFL!PG<|'e/M(Zqʕ+?t0-[˗/+Vd봝jժ/鼴zXnݺlo|M͉K/"7n-M4:KKf͢EѼy%nٲej**/[6mD۶mu:_!@ @Rֵ^K, Ю҂ SN$@ @ @ @5# Pf\J @ @ @ @V [ok֬MW P]w] o/:셦 |$PV #'B %m2% @@`U^^|A̟??.\ueѢEx /smCRUPWͭ}27YHC6:wC*ozK%=l۷ocǎDi_w%v:tFm @ wu{%l$PN5J @ @ @'`֙w  @ @ @ @@a faZov 00;W @cgώo1D V!PSFn刡C''@ڵQV_+=$@*}ݘ3gN̝;7͛^:mK JO^z+RT۶m֭[GV*UARO={ݺ^۵ VXt%|axXz=cƌ BȖ,YׯߠOM6Ν;gZ)`{1t`ݣG9SB @! ;z'N@:,P!  @ @ @' PD @ @ @ @fJJJwjm[ PX^zi69SXӛ+0eJĠA8 @L@ P)魷ފYf;3vZRV JW.۷mJN[vK.YSu |JWgVT^{UG-֑BRXZ}ZhQ,X ϟ)&MTvlٲ.),-}ɖw1[7Ғ @Y`ȑYV]1| @ @ @ PjZX @ @ @ @TI MJةSHZgt @@] L:5~_w-Zˮh@#FTA Z(ogώ3fdZ)D+-))_RR Xʇ,=:z-))-t)/V{&MDz*5R Z>-^y_zꬾգG߿Œ*))LBF @Q?y9@;Y&@ @ @ @# P\k#%@ @ @ @ PiR4BA[V /CwL1vla @S@v:T@ J!IjL>=[7|3I[d{'pB/ O۷otڵzBh۶mٲ[.͛3g̖֫VNoժU5hРN~UP!@ @ @ @@U/ @ @ @ @(.RZu Vc'|x \1ztM @( P> @@}X|yK/ӦM˖J˖-v1p,$zYim7n}.gc̘1!n͚5+{8#w^ފFE d2dHn2lذe]Yf @u)0rȬI&aV]U$@ @ @ @@`/ @ @ @ @(<4! @Jk֬??>{+c@ L4Çm?N(|V @+tҘPI @HuOO=T?>}up{Y QGÆ BvyHaG hKT4hPfZ*^yxBXhQ5t3fLޱ^{ea]s  @Ԇ@ {Mŵ]RVOVmk @ @ @ S@VüFM @ @ @ @ JJJb1gΜݻwAQ @a I8#($ "F.  @j;(\†{xG Dv"M~Gf#GzSQ6"мy,-tI)4`ƌ1iҤ3w+W^z~p@1pj @H?stMWak*//ώUE0 @ @ @ @v .>' @ @ @ @ P`4)@UTXuرUzT@ <9S: @@q Iwމ?#<i2|W_O 2$7n\M-@a4j(JKKK_R֩UVŔ)S'<.쿉|C;,[wܹ0 @F 1{Z f:u7B @ @ @+ Pp @ @ @ @hp={֭[GYYY~ nL-0s̸[k Dj{ňe"ܳ!ޘ  @&Ԓm~"@-~xϖs7R8Ё\sM|QRRR&7ogwy{yz(N;XbE3&_%88p&j @@>OE }8qbjuرu$ @ @ @Fx @ @ @ @ PiČ3n @⋣O>qYgmoU'PGt1dHWB @@X5iRoh` @`RQF<=ǽ_Wim@z9lذ7ƍxn4hPݐꫣ>S @@ o>~9iҤni-ZJ+ @ @ @ @j0  @ @ @ @:RZ[Gh &o~YfТ&lSOEoo  @-vGՠ?O9yo|#fΜSL*waL>0"мy8Co^|8c{;sOXdIUs  @ Rĉ7W/RVVDMC @ @ @2@ @ @ @ @@A *+3 oƾGy$)ګ S @j)Kc PO?t{챱;w'xbTFCַo 4 v-oǴi^}'.ٳgy1}a @"0rȘ4iRUJ/^۷#@ @ @ @% PkL @ @ @ @@u @V} @`loqp"3'⭷"޻&[Q7 @ 4c3" 9qŘ1cbC=Z\veѯ_͝=S`Сq 7ĬY⮻2dH| _P  @HAO@IDAT`ԨQ`x7j-:Z{"@ @ @ @- Pa_'@ @ @ @ Ppplҏ @@Xre\xq'Ƨ>7~.H!{YK @@[QOji~:>OGG&_OaM7~>&дi8ꨣGSF۶m#8"^% @ >}jA UCs7x饗bnť^VڪzL 0ZjC 'ڀ-Z:t4D @ @ @ [?i  @ @ @ @I`}q ]wUZI'Tq.^:mI/di~x&8ܖdɒ;㎋/q}emK]5}N߾}iӦQVVVMlV>~qyŎ;cI.x""uT!@J|V&[y  @@ ( @+0rȘ4iR5*P֨5D @ @ @9Z> @ @ @ @A`1gΜ֭[tMq=3&1̗˗Dze/&k׮]?_={xw*ƚ5k#[n%?8ck_Z\qU9֏IaZ3fz$@ߕ[ /n J`∩S#> @B`ݺ)P(.N @6y~6N9Hϥ )K.W^y%wdjT~V==XpauGǸq"vmwFVC9$^|e]ŏ>h$@ 1jԨxb]&g ,=n߾} z @ @ @ @- @ @ @ @$ЫW,*M~Gy$oWݻws6VΝ_ 6,.߿& LX[S.Hm_uU{??g5Uڱ%%%jM[C 14AW_}uifcG |2bڈ+ @Tj}O_wuW|+_~7]vZ;?!fΜtP 4(O/q([?ݪm=sN|sWs #@(f#Gƒ%KW_a,Z(:tP+mi @ @ @ @ @ @ @ P ݺu>}GݻwnmZӄs|.is68/~Fyyyqoo> z矯ؿOٳg~~Z6j4L;/ zj0"v%"uT!@JV9 ]`ԩ?N8л[5mڴJ9z^y啬{^"<粱繅0+2 ;#>(. @@ :47o&MԪf @ @ @ @氏 @ @ @ @jHX;c4k,N;[o;ƌ3{/~ǜ9s39+ӟi%{rNj/Ǐ^7j(N9Xxq4|oMvgsv;t5kD~2 &wӧOv-:Hv)--Xj$/ߑ<!P)P3)Ğ @֭M~_lvX³5ԱO=T6fy1G^{mTRkՃ>?oG1mڴmժUٳ'|2.\F~Eܗ:+oٳ#=o{W_b۵kϊveu*)鮻-[7tS?S,[,~L.޽{g&i|tlUˊ+>=3|s9'RU*ߦ7l2[ovkR76{oUZ=: B}캦63lذ`o~u'g?= @ @ @ @A|WM_*um۶.l4\߾} p+Izݻw^ ҄in6\ JqH>c'֭[Y}_qee92C4`6KIII֯4 `Vjim @@H t9<a.tisE|S#@@Vr 7)'ȞʠRXV A7Ku׾㳟lu)dIY󳐪'F6mi8Ks7P>ܹsgw^?AȔ*MO)T) K[)D*oFzvv>Ki)qꩧƬY╶Ν?pzgxT8l\>h*gY8U㏏[o5 J6縥@ Bƒ3 d;ė/j7x#^z?XdI5~zh~_" Ja/Hk~8R8@z9yo"%:d}M;6ߍW^y%}Ŕ)Sg\sMBz/=W;µ6<7]E{>{)|-V @K?/FYhQ6 @ @ @O}| @ @ @ @T@ ʗ4a^nv`w=iҾ&XI0w^& lt~.yًߗ={v|_N;-ghٲe7n?|je;j_>xVwj\L@n~X&3)  @ RVB@zӤIs= j\iԨQ >|}s9>ёBR@S__68nk^\}YҥK*M;\yW¥*o}[s~YX iJ%='LPwuW:\gw<@zRS*N4yXfv -MR&OXbguVi&~=ܓLuqԩS wy'fΜߝ{wxv8cq)DcK.$}b̘1S;ޕ&83"?EϞ=#>RV &KeСKf鏿oqeU Z- _~&UF;fCo P l~߾US )*EUԘZRkҤI-ly]))G -=j۶m{ケ\KzO~;kΝ;GzgN=M7RHó IkժU /Sɯ7WfC9$S78w1H~_gogK}ț\zSOE[Ւ>U;3+P/ @@ 9rwjbEU$@ @ @ @ ژ} @ @ @ @Aw/|!dzjӟM`q7np/~1~ӟƜ9sc_~_zki&__}\pA5*|o֬YqgWԟ&kܸq\{ns=+;Ӳ_|1?vج'pB|;ߩ867jզ а?7pC4k֬ac}n옹sfu?s)+}T \~dٵkZhQ @$w@U/ @ @ @lJ?ٔ @ @ @ @A_j꫱p}瞋>:7id]կކ_z\}.;n6q_4\*ܬ{RWoĈqaŚ5kcRV*)롇ѣGG ꫳ yܹsvLm1`x뭷1v#@#~8蠃0Ɇ3r#-v״8b @V`ݺݒiT'|_K/Οn: |Ztig5\;C3RPq>hoo,O~cǎͶl`r:th3<3=[ J)D++:};Bvm+CviYe\}۷opO9]B3R$JJy] ΦTwzߎ:*M~9d]_ ;#7Y[n%_2K[cƌɞ똮=,--<^HgK1e[*~+qGfTOlΥЧ?)ݻw|ߏ? . &L_VV;`]wusjJ)<-g5C PLF´RVMZ5%^ @ @ @ؔ@/ԛ @ @ @ @ yc=6~emȎ9sfo&[jƯ7/鳥&9sSNѪUM&Ku}>l6ޛo&Q2? `|> Ǒ6rno)2M:eʔl-u/82"jx`G [ >ux챈|w @n5">[=r?tIѣGF^l)Mľf͚yUZެYOX{}\fݲuEe^JR\FbٲeYXSv :JaL%%%YxܯW^3D ֲv,\*yѦMm[xq-ZdbӳdShZ U/?m鳔ҵ0`@3mylz(D7M S nCkڴi}Iv0J*ҥa9]dZTϞ= iYYguȘ1c4l0YCQKIQԶۙwŽʂj׮](F Vu *MH疸?jܸqzew)  <[n8&߂| ~+u4       1JWh@@@@@@@@%W_}5{ǫYfA{DYYY߿P@bCжmdR$7\تX1zM_@@prY@"R`iFz5y3:p@zzƺꪫ4vX5i$"9 f: w/^ݿ{>;qhvZnEiQZ5?}~t_0q+W_} }h}Zp^z#3ϛ7O{^ykq3g   =\O~}       e&@V0        @p^xQ={N#G [h7a@Z`ժUNՋ2͕>X..h@@PXV||(1@8T`ip, :r@3/T*Tjז_v\=V^M-]~+55 8\xwBnݺjq]wݥzW۶mu5bmߨQ#YX]jСCfq71ԧ믿^[n|+B˗LJzH+W>ҮQ}7m4=ctg뫯: @@ ݻwԩSeG .́vUT)M       @*#        PXo߾gmCJl"ŋ]D@`„ [F %նmҙgFT,  O BDYd^fge YV,TvǫW/nm{:,͜9ӛtNSJJ,hĈj֬vzQ`Ne]-[xZ8^Y[Yݳgv\\\q͛{N/,~,TM6Q3F  \ ֹsW^?VZ5        G(=ґ@@@@@@@@8@-[0 ?_~ٛx{5x} m?8:   [DH @0vuc.7PR%? 弫aCK}v±ڵBɍN8AV׭[<Ӻ;ԳgO :TVӦMءjZj!9HQJ*$?W_}UlGuL V 55U5k֔-Z5@@@@@@@w        E@'x[  E=zzM \@3 @@ ,P+>>GA@J*oq~˘*j,IIXUԡC d# `^u~ܸq^K/~Xr x{w'￯kհaCǫ'xڷo*cڍdž@NN̙/ /{5jHv~ioi!t@@!`>/RJ@iZj h4       :!        @H6mk޽{H@"_ֆ t=D`AL ԯh19| \8+ "طOڸ1? ߤ!֮-YZH[`iV-ƍ+~Kog}O?T'N͛UjU^zyK(DgUfff믿W_}ٳg+;;;/Tnʔ)]?j*J@@"X>ٹXVʕ$m!       pTà         J ӲPPvc#Dڵkun&9!1ػWCi8E@P@2ĥi9{OݴIr`jYn5k fYm/z@ΝYi 2= ]vѣeC .̙35c ޵8̽Zj0A絳W[l ##p"܂ 8 0۶}.ukUgf͚%F@@ M4q*##@s4@@@@@@@2 P Pi@@@@@@@@'ŋAZBI'z3fLLAGҀ?F ZLg-[CY[_/ۗ?}!Ye5%EА, ˪Q#?"W %%''{7j͛Zj^uM2ŽN)))I۷jvdn[8Q\\\"4|ҪY5٥K 2ĽYf{IԢԫԳo٩T"5@G@@hHOO=;wz.!       p$$H2܏        a!F?E_ @d ̝;W<y%&&F u $R1O  0FIC avB֬Z@V,uRNN,(N_@aYP˚ݿ wO?ٳg{533SsѶmT\9mVݺuwܡ4/J*ݻ5o<}\::{bZl֭[UV^]Q}{aQ(VW\g-Z{w,iӦ^xYgcǪsB =֭W_Ioyrre_p`ޒU rs@@&`Z/RgZ턗       @ 4A@@@@@@@@ &S  PRQFװaJ!r <8ݠ  @T UO'A =mӦAYur|xV!YmdY?(vmePbH`߾}Z`,4e,lC^xСC-tV MkYp,Ȗ,YٶIII6wV5ke/dJL 8pղe˼tҼŋes h= f!Cx6jժUVt晾j;{jL/_&M}[^@@L&ѭ. HA@@@@@@(ZEbC@@@@@@@@MrJo»Ptc"Doӧ#鮻yh4`@L30x@@ j@ v U K{|:)77*B4-۵/|=faYp1w^}^p?@n"^P;vBF-v0]Ղ/_,?$iƌz\K_FI&jܸWyÆ eKP_Bָ7;W[wjժ5[Ͻ5_`LoZ-[go﫿ޓ4>\_^I'I}mTFz DjY}oT $       Y?q/2"        @(,PkxҥjժU(1@"T ;;[cǎգGF@zmvmW/4@@)@V 5i +s\@#oݚ߲e׬) eAYnWk,gYXٳ,L+''GIIIҥwkFiiij^hCV\9xN;x%hŊ^%zFF´k!99 ^[ZS:uܵڲ`/k8۾Payf/mƍׯu.ʿnah֥P~^hYm֬'K +_X87Hӧ1r_5?ˑlu*=@@ CPsbK\rN       D@        Mdee4uD#ܩ 0-Zx#޲kU0`PFYH… nærssmX}}3]=fZV+VEYXU]qs){V-̫(K s)ME](;;[k./d͂J|DRjIyb0f2-֪U вPc&j }[$s?>T~k۾N*}Y00@@ O-k>+X`         P+X@@@@@@@@J,JVMnڵ5nܸ`Q#0m}G͐  6jSAGXe :8?`|[SHcȅII*/nm{S@@@;C6m*gŊ}F        ,%q@@@@@@@@@j@Xr^%%%Ťi1?Y<@G@y. e!`?6H2ò,@/|=@ eJ' gZ.xhׯB233³.]mн(uÇ{K[oܸ⁲X֬YS}$~_K=Ғd5I3gJ'u./\;A lp?H,?ҎWزQɊ @IDAT@@@-+^`ni5* #      D@        U{⦆!D믿GK.AsMk>  e!`a;V@Aؽ;?$,z?5|X6bK,} ]S߇5B!ʽgϞ](@ҬY3/4+TZZ^^PtcC/% Bwu^}U=Z/RzԱ4k4tt K_]٨vڡ|7l]u{3O*U*@@ 긤M$@@@@@@@b[?#        } x7?z*nb|fK+`yI%G@8R|>ƍñys~+Tח7do٨oi[`Vbb>!.˖-Sfff{׵Zhfx޲[nUVt~E #C:3gϤ$=c.s}w/B][C馛%˥.2\&ثN(%M.}dz{B,\Bڷ1@@ {Zhvȅ@p       @*"!        @,PkǎfRm3Q@8@NNƎZͦMA ^]WY3B@@0ؿ@0}jV ڵdVIWKXU-bxb/8`f[jfvm޲k׮VZ~E}AZ' TQ6>l :T_~"OoԹ/Xk<$E Y[?~ZЙlM,zԴ/=: =5@@ݽ@|Ϟ=^3*U Ds       @*!        @(RRRgee'c#a.0uT7j]~yӟ¼tcؼdt}ؐ@@J,@VCrs5kñevV⤺u% jr9eU۞$̏?g͞=[5gm߾]˗W۶mЬgU\9H_ htiRoH G0~Gw߭{キX=ZMP.wo}!Nj"`_Ww,ߵFRŊR~-brlA@@zz 3_u֩%޽;11+        Px^l        !hڴ7ɤj!Dwk7njԨݥS] .8l  PBJn1'wjաaYbk%/կ ˲@ݥgmI*_"Y ץ-X Ͳ,sΝ;]R Vj4]tE^xVΝURH2}?Rwߕ"u xYG/\[>ˆ4Yxӹ}'ԫ=}~gI.xԱtye/xGA@( j%##CXj)j+W]BN)@@@@@@@j@@@@@@@@@ ˗W&Mdɒ#"Dnd/Pg"t Իonȃ  %🸸ΎD[ Ʋp, _e,wV.k Ų`,rpu{ܶ m999ЬLowiϞ=^HVNЬ. СmP{YzIiĈb6e&`ZhoK?/ˁ}[">Vf]a@@2QZh@HM .#_E@@@@@@({KBs@@@@@@@@@jjM DܹsOmx'ʕ+|H?8k*4CzcYKvpsؽ{,,ky´,Trҥz뮻 j׮ mGNt~T᷋{˹Uӟԯ_?0`@obo%/)͟/saņ,*TU]jµ,`ǥji`3%r y@@ iii^VijV@@@@@@@+_fW@@@@@@@@@ $)))ZdIHA@[`޽wF&Z3FR%wʣ>vMT{] @@ @ J X`%۶kW~,B6:t:pXVƒkP5;w Z`rss]zBrպuk,(1/}t8_| %}Pŋd^O?t%$${hcrRWK J\(]b @(y7$CHIIpCϖ*U R8   @h߂;ٳ@ #      E@0s@@@@@@@@(@jj>6 Q&?_EN̟/w҄ M-7AԨQ0N@@ 4νBst~l/UpaC~NjL:vU   ۶mӜ9s,D맟~~Xӥusris'N[h5XaX8`jdaZ>mP6m?QǏ/.LjR:|wޑ,đ9j] zc פZO&C@@5khjذa vDJ؏@@@@@@@J&&̍@@@@@@@@@ )))ZbrssݤlS9 ;v=ze&lSNF.@VX-8  @q\vwU@]eC^^% zj DhشiS^pٳeYYYY3իW          tT/LB,\ ԩS9e0 Ҳj&dz9HO?-լ{@@J/`]TDA,~E#5k%Y|ͥ>}|e5n,UPMG`ݺu^xfYxeJFЬ.&jQ(@n/<¡>Dj׮$D>cƌ7~zgJqzoL⋥}]2TMs,\릛|uR|G֭.ۭwqH@@ TVMwZ"@@@@@@@"R@|4        'Zd Z3b@ Қ @B*`Yj)o&YDZ0-" .?Zؾ=?0kɒCYV/:+?<GX~%1@ p)- hmqv.xe>յkW%''1nUzi7SO=Qnܧ>S~2FjdfK&^@hCڈe- ˗KO= ך2E8P=~Bpp@i ԲP+VI&%QŊK/;!       PRJ*~         tT-m) 1-0j(SÆ i6qiRz?VF BePcC`i2RVoi͛{Q :Lߺvfro^`K4\peV̙.|j׮uy)--M;wVʕK`Z@w)M*/Dngq믿l3^[j"-F84m*}tқoJ>*vԡ4zt饒pQ@@F-:##āZjC       G P(8<        %fI( ++/ԬYbnj_"3e  @,P+@YA;\V<|`fY#slF _HVjt)}K JJ6(\͟?_yZsծ]\J Uf]|^VNTR2 M"P2&M|Rr/Ә.wsꫯ / EǎW_I+)Իw0pY:Wݯ/뤉Q$[Z5 :J@@(RZnj%jw         P+ @@@@@@@@J%`Z?K;#D={4n89R;z1ʕBcl  @&;֭YYYU ˲eRNU_X(ժ$~(͛g]ILLeu}[ZV DKc2WtY\r AH5h }\R.UNK t"=t=?ArYm^7Ka?: DmEFFFl9I+;"      L@        @֭[]v)fɥ Ĕ>M6{q3+UVM]v)1cxYZr$J*CI~Mc-ZK/uAc%\<{:w0z/Ts135F|P?Y1B`  PfڴiT+,PbŊمm@@@@@@@(Z&@@@@@@@@@JJw%K,tUNr-a#@\h\ٴM  *Q[7KeClfdV\eK_HFY.Cu_֭[5g/8?kUu9;SSS]8a\h;KÆI^+M'M6z5bĈ2M7I͚IÇK+WJ/,U\&0^].M;.O9L:I7@@r.6##DZ999jEN@@@@@@@H P+ҟA        @ TZ՛sҥ14j 0k,+J*@ | K/դI\poryI|" ('7őh3,'뮓~)=]V r@@ 2mzZC )vݫvя       @: @@@@@@@@J/%K!Z@noY}QI&wA2ؿvޭ]vU={-vM-^վ}j:=\>k͚Nnu7Ez/MB\\9%$$B ^0wKLLtAI^u   @awΓ Vu [8dxtqn[ڵkЬ̼˗{mܸ5b/D[njذa~!P&f zsc!~jӦ^|E{GY=W:LW/VhN]J_~)Ҹq@C%zI_@@쌌u־)       S@`js,@@@@@@@@(@͵tRC !`rdϔ[zu˖-ڶmWo~7uǎڹseYE)4eTVaU/m.Bm :RpႶY͛P L??˖U0eK_qhA[UreUZUUT)TdVVe5d#(,A@Hp1ec,XiYV]WܩןS߬V˖݉9Hx=G X"/4ku5kxxY\sIԩSpw96t rbnN .RM<[" P޽wޑz,v!,kΒ.L5ӭr>O']F@ kڴi%}omߍS@@@@@@@TSc!        @lϏ? @ r3?^W\qt,iÆ Zn֯_M6iƍ,-P³Z M\,'(Tz`(m (y,X³li³BY̑֕5z0+֞={{n/X VY~凄YlլYSkVZ -n`Vmbv "  &Z6+C,(xܹpy!Yg-w\ 3˻Њ}sY;_ g _`ɒ%^`g͜9Ӆ5}p ѣG{Yݺu>eO?I.wQzu]QnS];:sW6sEIK/, P+5>D~i}w)j䍅# @-Nx8kQ*"      L@Q        CyZti01@B,p}i9;ry:^ [gӱ ba*,8+33[q)B[nQ^xZuu8-|GXΔ"M&wȡm۶.*@-;zR[5HIt啇{S >^.U:4ipS'' .2*@@ ;wV啑Q@{z?       :#        @X Y -V\ X|x}^O@# رCf&+WU ѲtBHmڴQ~ԩ^vm۬\[bmذVZ蚅͟?[nܸQ- &{oԨ,\_5k&mڴiTX" @p,P+OQ;?fòliB}Nʲ@-zKBBo@%n@… , вjY>o^ݺu-tY8_>}l@ _r{R*1G3F'|u= m~$]u5K;E@ZDi(i`_#]nj2@@ pj׮}E\%        P+        Ah޼wKSNA;.BqPn)ل;4;﯋/-[ $%%‹h›ۂaG 6f &PB걊&׭[Yh?͖_xAnC,BVSSSjOp<:# _B}:kYG?|hp֒%r9޺/(B_?8_L\VXk.߉@6N[ '`:j׮]:(ͥ > ϲϼF܊}Rbކ@ |oz]Ð>P^=1J9~yQ>^~RV{{nAZZz1¶(!.]'M.g  @IRFFFw@-       @0 6B@@@@@@@@R 4kk&%PԜ43W~m%$$eýS6lЂ ~hDV*WY0Q>}te~ZZj0_s3÷w~pI|r/dt w?p+11QǹT Zj۶me599s' Įj9g]Ѝ/0,YS<us1V08.`?OZv3;wB*oپ}"OZe\!P+_E۶Ig!--_[oՈ#R5o  6[}7;m܃oZJh"oiӦMn 5jvycǎڡC%@bWsB\;gӒuBԮ ̲=-4F 6oŊK%k.}^xٳ?]WRE]vU޽u7zYl%-e?5-عS:ln_T@ СC5~xC=yI4p5ew䅔t ?{I.}RƑ>2 V --M\°}ڪU"7NV@@@@@@@ j@@@@@@@@@ 8͛7'P+8>sz5X›|;33Ss&p3[0P5x`iF6wc7kQf{k'\hӒ%KpBYՙ3gꩧN7v||ZhΝ;{DrݺusA.邂 Q/r9rчiY"/(,w:ul}aY'nYիx2!!?4;kemiC3IuoY>n83qM>XVCK aA|ǧORRw@|k0{ +A3%ηf̐8C:$_aJ%~ipk}ғOJ\á  @*T['Pk(j@@@@@@@)7X          $ a&`OO0|¡bl۶MfW_}oF6lPrԺukuE7t:vi5j(;G.;3,hw}=fٵ +M6=zgϞļYA@8\VN/4`X?Kv{2p:u JN+z1  lݺ ̲,>gX88PwuoYUСRFra>W\;S.䒠wОSj yJ!- ,ԩRRRȻF@@ ص>; hذaEO@EV@@@@@@@ @jf@@@@@@@@@ xG @ (suwxtUVi^/4|yYcp[ON 'D|٤V=ܼqXܹse!vV{1;֛$O>:餓ZfͼXA@f_/\_p/0˂/ͪW/?(o_N_ЬU#k%mBB}N 7n heeey>_tE^piY8o Z.t{OuA1K<O'5! Բ!7j$K.T]K.,=2^^jk⥗~C- A%X}JA@@@@@@@ jSc!        @@5ke˖-A߯ZjGʰ[l'|?^Hŋ={ /T޽eAZUca2ti+PZ5uiVeÆ ꫯ4c >q)pwꩧNl^  ?4B-l_/( βS g?P}(Ă5k, βɥmb oM4B. jٵ  yu҇&*7y{0?X;K!p5׸3`m6M5䮹JCJK&yfa(ߋҥ]wO(C@@J!_~Y RKqTvE@@@@@@@jߌ=@@@@@@@@@ ͛7͛cFB\px@ PcƌQjj@5v̛7Oy}ת\sSNQ.]*5:TN 8Ы摝 駲j[V,˶0`| e/wdI~P?4˖CeYXV~YGKmH?^}#XP6M֮] ӮOtM]wLKKSڵÞ6lS~қoѝwv|s%P п:ujYZ`[oIW]3%s76BƍO>GV_ؚ"z> @Aq0Zb[jM@@@@@@@*@V@9i @@@@@@@@!(Xt:vCr @2@7|Sʗ?o _yꫲ[;wYgOz˄+O>^;k.}g{#<oQ:u҅^, %͕;-g Ͳ5mY-[²\ΥWݶZe??Rk>999l@VV?<˖7nT\\{8 ͺեlXի%<UBly晇<wXB>{97R/t[nѠAԸqH}F$%%ya>fe…z7:kWUfͣC ĮU4Z?thh֒%޽> D,{#fM`@ 6.uZޝK=+.zS=B$[=ҵ\oŵs%KD((EJsLuΜfy}i~=gΜ;{;w*V(_۫M6#Ľ8:0 S[ d몫zNXtEW_}V[o4G?g_}Uu-{*x> ^rj̙ c)NĉK{- "]z-  P^<תU+;V>w/LxKN C2       %(@V b)@@@@@@@@(UjM6!%G ._wV֭0ܲ~xhjW*K\p-.ך;47Xz4h_O0U5 ;'XZ C2tDR]w)-&< Ԭ)=tQ7/O + w; AVaX@@@@@@@*)I        *иqcM6T@JV`޼y2dN=Tmv%Rښ x?#kG}nhѢzn@ j9ϺwyGwyvuw%7@%0_Ym/  YfDXVf9;@kĉZx֪Uկ_xǞ_ZXx!ӤVs\uI9r$ZҔ>}o1aaVkK&͙#=NshT䓥ΝڶMګbp  @IDATP:tBEʕ+ cܽO8`@@@@@@@`] _        pw}WuY @ 3 *_z饙ѡ"駟E]Bh @.첋|uM7e˖;@\˥oMe9,˷dp֌~ lI9$r-cg 8_u&H>,>Fuj߾N8x@k@-T^SpX੧㏗.P!t󖇓箴s{_kŒBnҫJ$xs %m} 9sc}uE| p7^Iz Ep֢E*i*T(b,       @ MuQ!@@@@@@@@(MjM64wɾ@JPPmnӕW^5kӿoCr m xJ}~{p8ȑ#k6İO}n2dچ*zsm[o߬YՙN… #Ģ˵j*Fkvӹ瞫ck;%Rzt5sΝ;k's)]=@Z_ޓx LѣԼBhK"a!+R_~)_N<^X( ҉'J{YaZR뭷Lez+Wܹsc0ロ}cO?](>Y@@@@@@@ }jϖ-#        @5jDV}4 n:+oҽ>CWB9M>V\Ӄ>S`'#8Ʌ'LST+yޮ?eʔBu!_歾 [/]4esCQ۫t"vm;u{XAa7p>s|]M@pMԯNa_M]R:N;%)FP8;LH!ҿӥO.3B*Vw<%.;o<9̹ٳg|n0 Qt7К^BNCK/cq7 x|qpwPm;|pmv!pٲeg6OFRܸYA4mT[n?cƌ !Kojw^z7lrݔYL?\# gZ z)d[?i=\?1_C›bi>6mZ<қs鉠O>)}'@@NP-%Cݹ0nik:~~ŋǀչs8Ftǿy9zNҗ/_={[n!퇅AN:Iߓ@@@@@@@ ʲ"        @Bqƚ9s@C.ݸোhgS1lp:#t'Tݺu Ġv s;Urw1Ǩu֫,׃_]]v*O6ox#[伞930qgȻƢlI sxgZsoSޟ4@!,>{L2D[pFnZ-[J\ LP_!|T!EroDC++Won>G˭կ_?a^3g|su\֨Q#\uU5k>7 ^u/JHr,ѹXov1j;?6&$P~(~f gR!rԽgt ۫_{?/KhѢE Ilu xYk׮1ϟT!T[e)flKStH'}>{Co.&ۀdQr       _O@@@@@@@@(PZn.Ѵig@;7襗^ʌg։'`*Ī_BX믿>arA-B&Mhذa(pnt+Ywߕ'9e!4P[nE=^|E5h N̕g\tqjժcP}"|~ڶm+^뭷^zRE]]0AH._B{@'R)l88YxAi /zJ7xc(^{: 2D;C:WZcƌѣ>?<ָqB}tbhSL dQG\Ag}O_'xBW\ ?ϸ =` 1"͊=! Bl9묳b_O?4cJ !)rR˜4yrgMӶjԐ57WMq8uQ.Yy'ʷ.]T.~sZAK7 A8@áMnpQfO:142- iuE긹|͵;ǎ3Y)@P 7 *RJ^ERs!? bAv-_<w}umvI[^%]2B^]3rgbjsHz'y>O]Aq-|-[!]<@@@@@@@Xy         P :ujժ1P  :_]gqF(gIs\q3y䑱@+uS?k储~ \.bvi\j]wEV=C%/">wE_XȖCN8"8sαE]3fdTݻwW>}bM74WW:Uą]|Ae.[.0daۿo:c\X֡Ys־]\N%j{ ~o#awYH{ꫯu_~aS<b>f7x#\̯ zWkc۴i'{o,6-u]/Jc@ Bp~p*S"(SQ9Z2Wit r4UU߇ҶٯxJ*0^ͫ|^1?s|?_8X׏=8Sꫯ0KV齶+C9sԺu뜝:n8qbp!i7~f#dKB0"h⟃N:ϯرc|w8Ųe<mw`\lc78Iq*94<[K/I](QJ/\:-h.qF)&D}dpyW^1(kwŋ㲹E{!\7o^8Lz<>:t*5f #2벅xmk0Te7  P؎ xX‰'%K׻uw}|}zI594[r]wŐWW/v_MyLȑ@@@@@@@         @17nJQblU@JQ9.lj~ \rvŤ~m9ɭK@&7'蔅Zh>() @]l{?wVc= T]bEN\ũ\8؅\jԨQq~aq{졁~:K./\]sU6'J 9ٲe5y[n%p.³*s8C>U믿Ev]xPRnC|I>UV~XW]uxw %uJkР6d9&ϟI&o EChۆù9V/ƶO6j֬CC(?jw2PC1zs`WysC +T{/5}Btm Ҟ{*+?vk{뭷[(`ҥ9ym\>癟.kZ>goҤI94w|&/O|a٬Y{޽s=ػ;19眓+dwaW7wmֱXUо||BĞNy%֭[lցY. cK}'s K6mڴY̯_s`N3Ϩ9.B_gdᲔzr-p5Z6{~_pÇW^vY~oGC ˥/T8R(bE"*4$=ӯ+@ …_v:pA˾ ǏVPk!C}u5h-?&R{,rqhʫ<dkOYX5jKcAv:v<>pAϘ]paQoQ_|q g׿#Lv.=c6NN~}8`E1X^Gv-)zNuKE=9^~nƬ ;F;wW_v]׽b  xcC5zLi b NPl&K 1+u2ׯスuomv9Sϋ-z[n9v 'v>?f+ @@@@@@@ cʘ         @Q\KW!dg qs1i﫳Bmk;nV촮 l."&:c߮~ۭ*>?wxl_8@/RIO-Jsv7h?묳*cHn-ҕ\gm_?g\[?r7n(W_% &,p|mS:[t?%/\|> vW~r!) y>vS- ?4@Rp}('8+5eyYqdpV!2JKHUy5ҥK;CV}ݔ Ç]8RJsgջwdqVp9t~ZLspP۶m˱^@(/w^ﵨt)>>9%\x8kرyv>19#{@kV;w{ssWWsNCg8s~j/'>6χtm# pC=Xy߃w9>!}te|.sڒ[xN8A7|ss49;'I=zjժ6,*y?Nmij0      d@ =A@@@@@@@@&}Vbi@RxkF"-KJb?|Z_K6\(SN8qeoFs1[M 0 Jm֬Yɍ6(~M3g\c~n3p6zܞΈy muAٕ!ïKIuͽ;l~qzVaÆiwaZ> /Pݺuw}> /X" 1DF@" a {B@Uru}P_4Nlh#9\gCQ KiwMgL{gO_O}'v!/s7` ׿r'L+{7rhJU| tᇯ6dϛBfϖ_i-־g}4r<7vGʅ<ቂ<䰧gy3h!C[o.@袒XQ 3KzZovYkx߽ û9--_N'?o޼L6-N/9\ݡJᄏ.29Dhא<[ʅ ױywyꫯb1c~ 7/>nr{?}9Ǘۼ?y)9ǚ5k?gK}'z|gy&g.R8;gd9wrm}֚5kVܤzKeV>ժU{-r9rd|^˴柇 /0kϛJ-^҆ PsɧV8WQ86¯93aYl#0gV(**_7wtqRǎRժeߋ#,UB*'!"5ѣCHm5P֭gQYc /uS'M . ޺; n_7%9SkFȐIC BMvz4aե+كpo|/Oı-[g̶vRFKG%-_^2GPq{8cr\2y%%9߻~;Էo_tM myiըQC7qȖ_ª*ϟk̺c9ʰK}aIw@@ xcM>;栬կ__t瞜s՗O}+g{c?v_9~w.K`- r)9sO暜y%;. o ?8Ȑ!Rsc@@@@@@@ 3όn @@@@@@@@@.+X@ &+uiYkՒ֕>TXhk9BK.`"毾n iib:3 )M^w\ 64r葋]GyDzTSL߸UլY3y_n.4 :u-}bq*:tWV})u]C 6(` Fswq_{?ڎ9=cqɓ'uxԢE pq㢡 Io@pd0曪TR"%2 5ׯ_|8?֨QT+n0 C.(".}sؙ6F_u r[oz_g2PAd۷/n_7 %jC ul>@NCE`B5H~>CB]XoԩS-:'cewL2 |v_coq       1Z         e.v pЂ2\p΁+R˖?Yv#^ޟyv'x^yX7;Gjݿ>ƢNKbq*%QA cӧr CycǎC\kь3B86,-[o 7Ox[,ȵ[Zj޾V5y٦nZmԊ~MB"]֭O?+L(E? i!(uWP6l Y=.SNfmQx>9shС1ρt_},V&^u(v,͚%mIIo!%Nb`C&NLL;*Fİw&^<(M빂dlkDaͅ8M\ظI&,˔SG$|׮!u]@ 9!;{ l4MuY'NXy G!LrS00Y2GR8]ncݳ_c8cE tTT)ggcL24f`I'WGK]*I=GVis=W%5WVo)d^!#| O@%I}uꩧXFU+PNz3g EOoXȬ:x     @6 g@| #/        [p8h %bJw~R IO E O}f>4b=Ӻ袋t76kիWo5FM-˷4s9G}K٫+ֲm9[H r\4f9q_ՃrܭsQ[aňk׮<^8ڵ{17O]V0AmZJ:#] nw 2yַfʹ #'2AC_Y[ȓ-]Ь}֭ӥ/qNt:cҥYe𵒃 r諛edV s@a\(:8uSeL8t0D`Q1. }(_Fc5D%Kh뭷V^ԯ_pNJ#L~ΔN(m}$[ oLrVAm#q„iywaƬKj8Hs{5pKåRSO6  Pr:tŋgjŊcVaZsW76lذ0(pHRW[nC@@@@@@@2P?.!        @@VX(-cǎ딂uкwOj=4hPz:"=z#谿AjѢEzvZ̭PئըQC\pAwQj]vUf݆n~2I K0׵~Ur/,LJrZWMmyy- >P!tkYZ(件+0~",+5q4iBBviYwVI\z@ TRE !qH`ym>7Of%aqhzW*VX!}79MݵCn!)^pp,{ 6@7p:9-i-!"%L":5m4:RywqYK뉷J'RQkJkf-D;^3\Բ,i["`K騣sXtn" @5XZ8Nヹn$ fzLw4@@@@@@@ P+3^z        p_̵Y @ y5f̘X05(hl(\y҉'*-h=Q1#F[oӯ_?qjmr≮^{M{l -imvB{^M. ]܅ǎ{:{)"a]i]7(괋?*>裚6m E9#)0{BP_㥯CSGrq=8#1ݼTRf B [*d_UvX|GsB- . њ9sfjbhiI|.[T4JX`ƌZreDQI'#CaJz!tam:|]vэ7޸ŘpBUZkU&O t iC;@-R͚I!7]{-L6[5.dX;찃&:-9;K/(u0+ya]E@r)a`Yrk ܹs =>6aCb裏ΆG@@@@@@@\U.^f@@@@@@@@+РA= Gd%Ktꨣ*ܘB7b^j}vnKܼBe8 [nAV={T=[*Y*yPc99}K 6 9} |zgsOpB߾}UvR?~6߼w@GDx)Ux R۶upO>YGH:94+5@Ac*TжnC;x6|0ըQzRXpEL[o?嗥5KaVZիWy~!|[F]vYXOm]o:t\̊p^1F@IDAT1 &͟mSN믯mYsN]vz:Q[]Hr %ʦ@ O QCPC?6o'۷W(xX+ŋaY}QN֤Ib(jՐ`wQ RԼyxV;ee@" rtҍ7iUǫJ*ljw^ jVFZ8K/Iv`{}pժUS׮]5l0fgG6M3qÉYo  @=h֭p.VkZljsy       @zJ/[G@@@@@@@@4 lfh F?c̡n:Q^[RWҳJlSJt ԧOxnۘ1c䀭YfbŊ1d>.*o[lE)]!6|1lE7ăkԨQ~N9u)-dc p_(9 Y5 9?Vez ?q2AUn-! .ĉcdɓ|rU^]ڵӞ{>;N;B `@}W:`y鮻Jy{.Οj֬}GO=T 10=qI(=Gǃ?p͘1#\G )ZpP騣kWB@2 yjdɒܞb       iX/PӶ6        Gp"BVz|* P<)|gl4 u5zԳg"GnJcEG5~[rms!ZrϭޚVZjٲe5kL͛7Ե:ܗC+VCʋ|4iR-Z()ljݺ C\0nM6)ZS&I2q8#A/+8!Z!PK*H]:TQ_u"@p𰯅E/BJծ];pK*o L |tǠR.ϲ-sk{֠A`UV-Ev{La)0=r?CFmN;bn x1iCd!q  PCW`         ($        d@Æ sEH= }?|jӦM@CN>9pUWIT7ܹs'?~i,:{LժU]HkڴfxtMs,GHz>}*7Kx^ZhN:OTVb R: ũr\ F~6fR8P ,K9<ˁdwU` /,f%ܯ^z1W^7n  @ |ԥ㎒CtNiOW/!! @ Hu1Pc]8D%K2       [ wt}@@@@@@@@t'8 P.]1K[oH*]xC%Zf!+C\vڴi #Oགྷ^߷Ų\X^zlʹ{OoJN;|B yeL`ٲe={~5n3fO?佗[reo?W8Ӎ5.L+h={I'c_T߾}Xl̾ jU1ߤslԫW/ 6@XOwW: C=r`  7n=w .\c>3@@@@@@@HZe         P*\/_\!_w /raj"HP]rsQJ3pժUS˖--/1XˡH>s5*ɟ;w*pV͚5UN9\Zj)5jJPڃE!e3gz>믿7o*}t`6h"{:y9]u*kbG~n@ 2 ci i-N6Awk]B?W_ɁY. 򹣯nu{lpޗ/7G -~ h}^S*,:vQxhSO@-CFqh_v_<} !Kjʔ)g*ݺI+ (+e5@Vj{Xba%K5t)kĉ9!M ,*U\t[woo^_ovp c8W*U⽋es .]o.b-^X[ 7['佋 H:6%||[*EV&#~kLVzt*^?Prxֻ&B¯8rkԹ԰/=@#A&C5a„x{kN|p+n֭[jժe#A(@v+tKo-mYVc2 lٲyꩧx4{8z;4) O 0|kM~F6Ӱa3p|A曥#K.@@ 3Ǎj-#9>>X4=gfX1>ѵtR6 7$C,pPC/}+lsPiyΜ9 vZޡO03~W_OR:Cֈ$堩´[/T77x:p t)o'n#1/_<{:C\ط}Ki18,5X%d`SZe_'h PNMg9<˷p*~g(Mf]tQ>d؄_e9CZrxϕ[lCCN @pPAI}'0P=O81q <={ꤓNK/$O6`@"Tc[n@@@@@@@'@V{9b@@@@@@@@ʜoM>d tQHlp>ӺWbiJˤSN^xA>iJll(TթS'ryzY~+?KW]%w ê .\˷dPUjxUrAy^9+5,M}r rd(W>5kPd!`.`'7pC-$'8˅s>tXVwq{i| @e9Dw[RӦ2]{=իWO[ne[vmz'MQ<21f0T;8zrxiҕ |K&vY8"@]SnZcǎU'}o!       Pj6B@@@@@@@@f!~H( _CC.f)׆?]Bx}ԫW=,;,yԤI",Z9jժ<@|Bj̕0JYPs^G'BB`#խ+94k`iBm4df'NJx֤IoC:SBpռyaAw@2L dP9'2t}p.d zSO=U ,Pj V/[UHw}uM4l0-tmRǎO$>? " ! iXqVكs_h*x       @J0G@@@@@@@@RhРZ"N@< |Ynf]]vpń YgI׺VFrCQ:st /Kg-]yelFu _}%mMt. *!Mro_|!vȫ;KotUyK`…zfB,Gɓ'kEH=.jڶm[{ڵkm6rV(־X @ rGNg%o):;G թSFw!P..Ǝy'/Hm$u(Ν5 i;wƏCƍK\RuԉY]vե^jh )()"1^Y5m4N>ڵkk}ѓO>Y/'ƝwMzƌt)(tVȴգJg}@zj-^X}ZjjժZhQ       ]jeEo@@@@@@@@@ jM0!g o{91B_~[7i$Ӥ=V&Ff.L?t j[@Z-బѣ9LˡZo.98Km*Sv%ٳg>(믿X^=m޽cpVvԸqt  @ wtSOIA+.0:\ U\Y:t(Ҿ;0 4HWՋnYXxW^vmUG P,<->Z:41XA!X @"k 6иqV ZXb*VQ@@@@@@@Vޭ.c@@@@@@@@JjYw:d #qgWu%ӻթ#=BqzBȑ=$Ҿrߗ<ٻ p7bJ-! `b Y آ+ (!(|Y9'&63gfk9{++}t18E͛% )U_ p.MhQyY+ժ%(q]@ N`͚5qYVB/_/Tͺ|g(P A@ )|RzwƍrK e"VTZc4rHkK~+թBo}Igu*ݺ/j3a  i]Zs`)S&?;vdnSƏ      DZ7        &`WZuc 8C "'NQK&ҥJɅO/(%Li7=ԫTR|)<(6@,] @a 3boӼyh^-e U>>\#GL"@ _qYeZƵŋ jժN@l2@ f:XҠAu8=jխ[aÆ1bDjͅJG 7WK_}%]p<: ,'P+Jv)@@ 욣] 5B"      $ZɩͶ@@@@@@@@@  ,={hÆ ʙ3gm@Xؼyx =C:scm':TjBz\9_?ORV8DgΔ BR: x @(V찇NQ`.i E͗^xA[z]$+|J;RΝUW{=E ,]*БuY XpY gM,-[&n#U&]ySR͚RΜ\@Lۧ ⲡsڝlkY7|x+FKC@ Vj\n#q9)&ڵk&7X֭i&EzԹUd[,_ܬԱRa?\ Q*}qb1z.@(L @@@@@@s|1<@@@@@@@@H@rʄ5@+0f5JƍS4iO[ ]:G KK_O*PدGu E @ ,Y|$n@d <(͛'YpV(DkZ% vbE-={?BVLvg{RJ|h]w|Jg'4@@`qc馛`BL!Q,dtڴijժ{kџ~옊&,jխ+.+wcصTF@w |@Vd1F @ Mi-C ~ٲeKN!      ZaK        @PB:@_cǎHncrRh-PgrdR۶R2R׮RNVx괻[|ԧԹ3_b2غUoT @ Y\v͚gYԩv̞]UKz @Հt7:46(sN͝;7.<ϟ/ Ȝ9*W5kc>D\rG~f  kRMbkYMk.ZRϠeɒEW]uFAV"yg  {J:es!P+:.@@@@@@@"C@O@@@@@@@@ `ZWN p"jҥ9rVSK}Qo!\h)tE+vtYҔ)RQ49@ ,Y tG \vMow7^ =&`"Z`޽        ,P y@N_`ӦMѣ:t蠒%K~G(ZIi~RŊG/u.=Ԭ4x\񭨜*B \/p^X #$۶ISZVD|,e-arIOD͛}`֏?og fjȐ+W.uus"+[D;A@T˥O?ҧ?X?V,Pvډ2kV݅O>DmڴI> պ2B֮ vҺzEˌcw͛K#FHO?@RVB 0fϞMV       ĬZ18        '?~^:&ƌ@dٳ+VݺuKƭ֦ x@j^\9[rِQۖ/Z~I8P瞨*C E, ҥKaqX`Fȋʔp …xStQ*~zeE_CZm|dYsv!!W?UH(`Z ]DZWYgz"6<)SK }ٲPÇu Qw ϋ.\^ngI J<17(;%͛'~ " @ s_4Dmݦlٲi˖-Q4C       jb|         `.dڵ`AN:cE@@`ѢE0`^ue͚$YS9S6L.LHR.RId~(%}\|2!CKJJЄj[oxĉ/SX1zQvm)oި2ADPhV(@믿[(VVZ[oԑJB ZFj@ʞ]k)KP8~uVx|W:g7of͚ɎBmET'ҕW>jiH{לCqy.WrIcy{# =vծZ#P+z+3A@@@@@@"E@HS@@@@@@@@N*`Z\8 բIX8JSNPΣつHJ"4xpu}RIu~ǥ瞓Cz5쳓klXD.,$6ά#K`Jɂ&M n]w*K}Z9rDּ-$³hJt,+zDžgΝ;@qfeA.%cI&0ѝq OʕKm\uUʜ9>#k.͓7>:LgczJ<3؂ Vz؛?3F@R> ZbEx Q       ĄZ1$        ! Zz5Z˙%$_-[ƏԩS'bt.],TԳtmAHB uVZf͒|Sj:FX^ jac[nr䐦O*V Q1_TTϕф hYV RR˖eI\"}vυ"@ x  вe4jԨY*$ ,u,!h!+'u.YVa8h7$znI2Dʜ9<ʨFC[8;8+Β.Hj:в3L$pBeZXx}nVTɅ@bW`^I1}ɒkOM`޼yڴi Lvɉ4ٳ?#<ȽGfwٿp]=VszJ }@VӫB ]%P+Z4B@@@@@@S@/ @@@@@@@@NS@Zji!'qFS;vT%b gl8ÆI?.YHU˖R^OU7K'K"=@2<P)u@Q89veƖws%}IuH5jH" bX`߾}?fϞ5w\ڵK2dPŊ}h֭og{ #Լ4}wy%vJtL0A9sE{FҥSӦM]qͺi XekApVppp?ʌ4bƊ &PZ5mK/۵gFNf>       @ ;a!        ϟ_; @ A=zpAյkJ)#`Ō]X僵hjR.|XչԩECXT*V,(gQ.pjkvZ)sffMm @zoAS0="ZG=e˖sb͋ βY{u{gRJ8{;ȵ wH~+}\eʌFjYaTR%$Zl7|SK\xҥdةq7j,Zvn[lg^{-gɘM @H9D?A6 6@)7        3j̮f        ĆZ%$ 4p@ 4HYdIN%Iʖ {Nz~ǎ}$1;<8RWO6Lʑ㘫 $/RaCl"&-0-n]wV-ԩ(ZnZ ޽[;vΝ;e=fˮ]~te~t ϥNZ4i|iB_dȐAgu2f}͔)n[9 ?zrǑCoG_^W^y=s |Cs̉ 5|W?\j׮ۻp*dm@@ |_髯#;4izdõռyjz'l;qݺ-fJ_|]k "=?gm6X‡$lڴI7nT' X;}HŊ@H>jժi֭ھ}(Zgϖ@@@@@@@X[wG@@@@@@@@ ˧)SD٬ 4:uRŊժU&Jo!%bpSACI %٦:vyz={ʅc=H Ԫ^=6&B? 5k-G \& ĉF$,Ȋ-[h͇->v"|d!W'kVB,XAVV=u c=ns82dxa\5"oÿpɚiY!w ײK֬YٲeSXw+n"қ]iF3g!cj{³fϞȥ~5*U/ף>óJ.MYi? @ <[ҧJ Dt`̝;ןԵ4$jv~q7_璅cҰa~/-\P ,Я˗57 )cB쾝W.tfj?+~v~Vpa)Rڹyŋs}w̘AV? )%p>;n>i       $Zɀ&@@@@@@@@@ ϯիW' G7|'R2B `Ao_[7ץW_^xAЬԱtI3?6~]9Rڤ" ,]*hqjaZ+WIjIKV r Zv ,[o׭[6lCEY1P݆ ( 9sf( VlV>R9v鞻vvߊ[x݆BB!cCl,̖cW(\+W\ʝ;_w?o޼o[6\7}oC :VZl^%5jRjdEi  Y=zHKCJ]Ycg#0ޝPq tP-܅WEϟY+VLmECeJ+}]3Ȳh„qiʕSѢEUreneAWseg,`1dŊq](qk2es /P˂b#q馛bUSt@IDATy# @J 1.^w%j`       @l =["        3eɭг!-~uI͚5ӥ^z <qvyD1BzEF KnAJ>q5ftA׬YRɒ/ l*#.}fp5nܿ!ZPR͚ZĘ.]$(JNvb2dЇB [S()t{9:u}W%fxC ޲- 4 ſ -Y$.B7 ;`->ag]j IY0`;>lnvj?`Y,]l_oY-[vNC@`޽!Cd=0a.$.wӎCN v[wv;6m?I;ªP߾M}"yfrt"b=V _~̙3Gpd;Ҿի/܇lER{YHگX@HP멧JEVv.W_/رce!ݨOپJ*)ho_h[(q5?f̘)S7PϞ=9t]wAkQ&M-,4=\i2D@^j@@@@@@@H.K         @ϟog1QD-YPDի:vGa]&ٲr4h4dWA*v65>^|QjMj|+a)"}\A RQ:IlvyfܔmѢ3g .HM6vC>#5ʟ֮]_oРTG4wQPbEOE|pؘ1cԶm[$la7M69QsL`˔^zIr,h  @ X֦MTBGC@@@@@@@ 9'P         pY8.={*}ڵktMW`A'',Xqc)o^U+ꑺ?ַ`.WTuwU@@E-'UM,<˖3}΃,eKaE,h~? h…~_eɭe͚ՇY[ 2*R,0h@ƌ{Gjf2-[日ݖ~I~,ךYVrb7ވ :p6qce aZ Q)APz.RnQ9E&ǏW=/ *Y2hWeַˤIrE ,05w\㏚3gњ?/@*U*DWԇթS4Sޏ%\rԦ7o, }[hQ2tPe+jj\͚5d< D'l)w\00@- tJҽ-Do߾cXhvL'଩SPn.UV>, 7G~y }f̘! Zd<( _\jժ僳*T~gS̙C "gϮ //lELM& 5={Zbv5Y`W4it~V@*Mo^y%dRP#'O샭s-ZГO>I.] Df}~[ ,pgkܸq>̎i y=&0`kN}}ʘ1/r2dVA3T@:Uj̙jEݞeB       @ !        i up Z`o4aN:.2tUm;HM}&O>YRF.eVO>ݟ .J:H_.U"<=mذASL g[Vܹu [G *RH$O#p\ e]+[Ns̉7o6nWbtR*U*K Q e9\fL)o߾]K+WN*U|ՁZFRΝxbN0dŎUqM ={ZO?ck.tGw#oK @TTVM_|v) 㪨L@@@@@@bdG3M@@@@@@@@bI@X"`~ap GOY'6d&(9Լ4dg7,e0@ v,Fb( 8p@Bc!ZӦI?jז:+AEJ[lĉ5n8,X@iӦY5k;5jPѢEނ "p2x{NW2l@Zm@@@@@@@HJR@@@@@@@@@ E"f @8 0@˖-ӨQqx)L~Y:` ܥ\``˗K~(}gKW^lYWa2@ x:$o?&rPڼY*\X4r玌$(Ν q48ƥ\tE>(W^"q,9vۈ ٺ֥bm߾}駟4~xM0߾} VW_ !x\f'rC1nF9e!)Zh{̅Rǫ)1A|@tawqwqi#`@T6mԮ];Y3B VJzA@NGrq/믿Ԋ       @R N@@@@@@@@H)|i͚5)yƍիW/uA%J15bŤӥPHGBL+}mۤ; _jזyF7/|H5P,w쐾JpTLY۩k\giB |Sjْ0jإ#dE{=_B6'㛺u0|3H6Bkmڴ]RV[]z饲;݁ѣwȘD@ F,zF2fQdwbZE_Ç'[iӦzձcGw}uaZI¤Ik_VZdAԊ=8@^YTR~K-       I,:{@@@@@@@@@ Jvr6a,`aZiӦU׮]x -%^jL.8Aʙɟ_jF¥aä%_*U GCe@ ,P+wn)sd 9Cҏ?a.I|κ(5n,|FZaRٲ'.f;w~a*TgBe˴`OW\qZ1`)!` VXwޚ1c+awLyw ; R0lLt dԩڳgOjfKD矻jRu/BM>]ǏxKKZOgjժyb+yYE/  S "*t@@@@@@@R^@@@@@@@@@Y o޼.cۗ= Y-ҀԧOe͚5h\`~ua%A[oIR5[6馛ߖ [ ] Xϗn9QCz k$@ f,PD~XL|:[n\MAY` dIzYRa1Ď;4h U\YUTE{C|;8^ŊKq2bU Kk;_0տk]jI=3Xa Ru KϞ=\F8MJ.un oч!}W)43߬F_r%ʔ)f͚ڵky`s=W?u]1cڔZѮoݚR[g  @ PjUT*t@K6H,U.}԰#\qXkWihi3&F-g%N"=xYNA| >He!Z+zk-Z9= 詧RFh„ .>̙3r&H+߲eK9R;ܮ];>LUV0_ $-5]c[MVRSu)6> Gq^t,ĩL28˚5r B fq.]ʕ% .vZ=*Q `^oի)ra+`w:t/.Lu*Toba @4 !]}H8K.[\ٳU~ڵoS$5Xb5j2gIÏ&v]B7n%K-P>!20@ ԲM1"       3TG]D@@@@@@@@y.d \UN:BՋA|noU2$ZN˥Y;+$+=Y*1GA_DC;Ô޽AQΝ…m;޽`B )|5kLRfgQҥ5o<}7>Pn 3v cDuї_~s|Vm۶@@L쑻g̥cϴG^&L*77mO?=ٻۅ"p#5."PwyGJM7ݤ}ðClC[  &p9(GZŗfΆ@@@@@@@X P+>sG@@@@@@@@ J2gάTR?+ Ut}ݸOtgӦMU/n:K͜9Sݺu5\:+4>n@ 6 .Q߾}cYS J^(M(ՒܹƍޣҤIcIٳKÇ[WuI?.}ra 2L6@DӵP:ڙ X8K_/j@ e@iFi XeC /F0`?2e.UbUСC3fRJ2pVjٲZnJ?d+_,`;дB RrHl@pyFil&l٨* #qƩRJʙ3an옰O>qqڑ߽Ol.]ꫯ|pL?sgS޼ySn ae;_h1waxݻտw5k&{?&Vː!FŋKnYJTV:C@8seק       @R         )&`ϖ.]iӦ~Pرcu+K,z|xM͚5bŊ#=ωI7  ]J=Զm[*U*.rF;>\. 2M5>[][Q6Lxו+*u3ЈHT-Zʅ7\MѲ K- ء<`Tԥ& @~RÆRƌm/"]nliD'v1JE\뇝ׇ[6ѤIKܹoӦ?N2k,y睺+! @ <(^$/}up}$:#N `F?j m„ G=nߛM4?[o Q/L.kLk׮M+RnGu2oQzRn ae ۾ꪫ:ujw%y]x.4ޥF{'|R1ߋG~,Q}q{4ZzԞ=62ƃ &Pzu?=֦|@@@@@@@Y@dgs         <ٳg_ @"s 9*QZ1@+lg^c^wd[f/Z]R%_XbGm@ 6z'OƄ rNA(O\ sɓٲ m\T̺i@+-[!C0 ±`.ˑj}{WK&a$>JE֩Ю\)Դ39j3ej@p=#Q߾}e3["-Q<=έ@~Ϟ=ϴ^ZAv{d@}WZe?7yU>6mZ_K}3bk սa#Gʅ׆ǸE ^ڇ$+P+[|m;nhԮ}Zډ{+$k] <[#FH+Rnvҥ ,$go殿|~}+?lGYxkvԩ*Wa'km.]Ѝ@@[ܹsSrl@@@@@@@ Ԋ@@@@@@@@EyB±/… qƲ tK׮]5~xY!lFDiݻ.IHÆIOsd(U&q\U髯eˤ;rfΔ]µ=W:,HN;}W8QOq!uڱ{d$Bн{g >G.^x!rig(0}~oj|y{o;NЋҙ&Ml!V`!.M4k&w-u4&ruɮ쀔 g$бd2\a~Fb*U{#[Ϛ5fZ; N j軷}Yb_&Mdaކ¼dɒ>dڵk} p!@Ok޼gP;.]&97oBBI[YװSr/m@0/CL2@@@@@@@Tt.IA         @ -ZԇZY2e Yatҹ;K/_~ʞ="֒9\lSO=:DFXbG QDOM6|ݛ+駟?\_~?ǴP|p}?}%Jwk϶Dxby\Yջ.!K;|uw:c]j~xB{k۶=ɒ%K -# ?.wL"w"a)?*KP~9\dȑZd_ӊ+W^yGI'O-[ꪫvСC\wI6S=G1ƍunhoޏsڴi>Xʾ +R+;7|S_~şk:ބ ,([7;߫VZ\=wws);_s5;g/[,L-۹۵pim 1@U;FnܹJ@@@@@@@I@df3         {y|jmt,h YAn+lQFPͶP16+ +? nX9r^x/nWOBprBjrY?V/(9 b[` `Z XWH;wJ.] ˖parg0N[HeЂeVĵ 䊽mǿCW_@ BbﳫQeL~eI={AZ.s 6e-*-⃋vk|jYUNd\–,,Ɋ\ TTyz-liҤ,X ;u۵pBcoPۮY0VL|m x6 j?/bk۶mPYj}!)ohYHM~> :su kf裏>mذs5{V=eٓ'Oq}'cYF7tu}_uM+3gNM>݅I\w^l!\zj_>A&J:t??d*A@ za\6; y1k|kA߿YlnHo:lHv_^=\x߽L{3;fb[lI19G;:],PY~ܹ?mѢ?~6lytcЫW/+le/X[>}X-?VZdeFC@R\{       I):);o@@@@@@@@@ ,*.fϬ/^\7|_X1_|РAgBdɢTRB5 :VB[uB?V8"ViӦxw(\hkʕ+C;TZ1cF=#!@l v \ ,b ez$WOVm1h *W|l=$;ˠ_WVז@12rCr%yj=r -&J[:={֬!ٹ5;n.sk;<oveaOVBثc`pB7n?؇pٹI w|jcٳ,ڱaw?Z8UH_a!_d͊[֬8nYK㚝;[S(,?xNdj}_Wf˕1=glƍee߿1>CVlBXY=Q ++W̙,B-L-;W_}勽[?P(uf ]c+?fu@C@Sx5e;O@bXk}gu7;Q?ϰ&;FZg1}vX -µ{n{b:7s~p뭷u>d†-X>oCshyiY4 ѥZ5/Ϛ5˟{[3~z!Cu%?mt ew=:@@ J,͛7'^       1O         V܊ϛ7hӦ/6ePZɊu'eϞ]7nԡC[}? , Zv.]IH_Æ uƽkі-[di />+h+0m4 %d*,n~B\_VBpA&늹z*P@Cb@pPm@-3hvE%WY >T &z4eޭxu3e{йVl܎_/o!M-5/BaGe˖ =$ ={qOGYU^u]wTTh֍mBle!OV|q[)`|\01 鲐'k'NLC/?~C@ڵkXMs=}hZ?lٲ&֊[xgC|:`l ۷/To`]8zđ3 D˭Q۶rCEmXl,YW_Bsš,~>dɎ4hp-[5؂{Xiطc D@0?)_fўa(       @t         D@(PkΜ9ǜYVVZq$ȷ U߶m[kNg+GEW^OH_?_=(iE v,lς,%)bR믥f J#FXFL2ؤ-+uAo֊pY׌G+wXԼyJ㨥X1)gm]?ur2p}iY=eqtURQ9Tjմn:*SLXz-Yu;0-+~뭷p%JovɈӧZ!ʕ+UNҤIs5~y> 7jȽ ?<΅{qƩcǎPVsdGGjz?{w/sqm߷{J")%IӢTJI(ZE_H{*k+IQ(d";| ^;3uw99sΙq?g9vaÆލ-[[̵.`ַt…?v]믿ԥK>I>?fs> J*Lm5L @@ R>@.LTG;RzM?Q`jܸrpZp!om>xYS\\l~8f̘\3t0]e`\sihal̰rJ-Z5 ѠAU֍۷{A؁-X8  @4 TR Em @@@@@@@P#sL@@@@@@@@@ V^di+Um۶=Mm@hjo,5+=*_߯oY>zwjeEۭ}G \믿WD,(SOy-@˚+m+ } aZ,ϖ.HYS2D"~+Y#WUz,;!ByFjNxqNZ5b=siBip֠o6 Պ@-W– =ò4,LejTiViX (ǰb5j?C?_ ,pÝoQ|M^dw9#X?.Q7Ο~4iڷo6kV&Ldc %̍Kfw4=zDW,Z6;94+sN/,.qī]Ҿ۽cXjtMm܊s9GV>g,d,g+#X| ! @_}%D)y4`@۳ӦMSͽSXC{?r-8ql{m^ba;v꫉w mkX`&[WҥK{P6' v;9JR)oj,K7lNjdɒjFa;} Nriy[ yyGf@@j>|ҥIJ@@@@@@@!@V09        @ul%J$Ѭ~뭷{؇LMm+h os Z@%b9;xVgСCw{Fr n{wM>]}=z, @GQlll<^xArY~7 .#CV~}kqv-3G}˥ɓ^+~Q8пm5_ \^]|\gȽt)o;DC=/{Njɲ GV,dM}2~iZ9 ;N*8~|2e\a5:;Л7mw7z!Dj֬)Ba?co^٢E xov,k,1 -%ӤkJCçF zꩲ"wv'/[R B}F[{~R1|Aヤǥ_ɓG=5sWzp4{~ؘ,P-ܚ<z]hpA@ ,D؂tCît(K {;v ԲpWn;Jo=o.L ]8^S5.޾ fsf͚iܸqAZ0(;U>tmƌ ̧,D;T³6mꅲծ][իWwfsk^xa`UP/ UTI஠! Q"`w&jE0@@@@@@@0pnMC@@@@@@@@O 7o^%./keѬ؟Uå,^8.Go[!u+nׯ_ﭷ'MW_}+h+@ 70^ex@IDAT˲>Y_/5Ǻ曽.NJu]; @ݻp]we3b/dg$+ U W_$nY~ԣTjKRvmWtL>h\hV['YWf5+o?/ӨQ֭Ҕ)~\7,u€o~N @vְa]& `f`6mRb;wnAY.ޏYߟYjk Tkqqqej05 Ȳ`*U(Dx}vo1c?BO9Ks.W^aSے3M 4,Æ ӓO>Ίloz5b5jțgV[o6-[z, /Te67O[oP}l[s܊[ȭzwJ*Po w5:My< !C燅S8q`DC@^jʶl3O߉{71PW-lͶϕ+ n,WYRs+;ge}"_V\u=s]ll-9&LŋW^ު>.9TC=:G6 d95}٣@%K<݇An{ջ+{h   Tt_@/Y$@@@@@@@ P$@@@@@@@@W [q+Jv-[ٳgku*ow\ȄKrjVf͚d6 %\mgh]Z7kVp²l[tz+Жܱ (ɓ'^z^ЗsV` @ |w{ݱ"%`4dYk6e ˲:W\/hi.e8ˊqbUڵn^|Qr/5ڷ/sEl (!9OY-j[wiSix?mL{lޗ˽gN>:zرz?Z@p *i!U\pnZwWjԨmgC |ҥYn fre˖< }[ykVh܂liíY(rjC,Eb|UWɊ֯q/v2ֶV܂, ={,M> A\Wyꫯ{L:n~O>sl,駟vg%9VKsͶ1tUxfms6 j)lnޱcGJPx "f{Vs[kso;clXٛo) 7n\&. ʗ/}jyg B{.=VX=h  R6R&߯߉{m֬Ya{7|Tm-NfDlj!^tQR؜N,ef3THN'6g92MyՂ tz /Лe,iv{ߍZ}jrɾk vR[P @@ ys=W˗/O~#E@@@@@@@$?;r+        YZ_ o޼9K;xTbV:5 w[괄TYq5 :3RsdIͱÇ",t5󼐏^A1Ȍ xoVu˿ o\ Q/t5!vFKH"W_\,) k:u-.gƅ$zH.PN0!2>_f͒{-]t\ \n|… u 7ZCՕW^iyXԺutYg% Un]/(gƍC@-6״fǴ̶~Yq Sŋw;wLP\< Yz<.'֧d&r)fWX1&k8-\+-AZZP)_YV޽0Zp\xX?-`PZsϹ߷pwL=7/Ͻtwh6ݽ-3saA@2I`RM9^<N@<{/l5_uoN./ɂ]/^J*ſ+Ӯۜ\r{} 'xR';G9AۜB6v|ˤ&kժU޶p{p,H;ܚjei­wsg3g_oz-:VZU/T2a-`<.;J@@@@@RQo Q J`Q%I        D@%\DNPujGTӲX6.dmѣGkܹgi7,#j>AC h,$˖.]]>@r9-.\D__Bq*T~\SO͘s,7gg~ۺi(U+HA ! ֪R  @g|h Ʋ9>;Y^+}?杶Y w6mRPNN;n6q>'P$'ԧ~zMvܩShX(/l1xj*_0X|%Ӳ' [4+4B3=FgE_~/@eHG8  &RR <0{3fAܞZ˖-k'7snZ0\>{p j׮}O?)P陣QM=-HC8:sQ^Bu D@7ݶmD        @x£@@@@@@@@H);vh9r anذan!@0>}tM7f͚<4 cWL ) -qwZ //b?kl4{4s2W#e[_/D w4yeQ./{X+k -G4+ݻwouU? Vkڵkphqqq^7֭[qrfRSNJ~+@_bdϑ/_d'#]۷o_(ۊWTRTѢEUZ5%~|Ov] @͚ɅH_}%( #0M+Wd8z4hb^[Vzһqu Dڳgy #Fnݺj>0o²ǡaE#a 7jŊ^x줶g  /`Z~7կ__ɿ       Q@ br(@@@@@@@@/ ڲeשnݺWܛ.Lƍ Q9߶mݣO!++)M$W6'RKv+r-N7Jf[vKz-ZHIy$ljϬlE;g}]< CKUzlJW\Z߾} /oV=[܋J2e2Mc„ ^_V8¿(WɓG۷!Cr, <%\8>cB}]/n PsέҥK ʙ:5|u29`|ǎeAZ)e@8 #`_]4o.YFĉ]!V6/ja꜠|Gյ^{-R^}u_r ˽>\:uJ^~6l( }R`@÷0-{g6  k}u k@@@@@@@#38(         @ Xٳgȑ#9zC`K/ygԻwoz8Diڪ.@`H JI\/6ۥi. iYV%\Y&cܰAArC,BҬ/J.U.+@N;4=szǽÆ B +z~{QMձ_.-67CB[Μl.rƌڳg (8m]Z-`.cN?tu]WDF@ 3vZ[}Txfs#p}믿駟>X`OxfQ0t?\^XjN:Յ7CǍgdM4 jܸq&S" +={vuYZbE#      @C@@@@@@@@NB :o޼$ @x WŊWMH\MO/xl 1 {Rv~ҟJ/,#  U$//}4~:=|Xڲ%!VvY= UCO?-BV?B5< 4|O:󼐭R.iӦ6TV 7KK 5EI8,X0CaZ[/7xCW\qu'O+WzAieӇ DR6֭Ҕ)˚!vSܓ3W\ĐΝ;{!IqEʕ+oBwԩ3giO[˗/W ,  v Ӿ#{        R&         V $  ,ЛogyFaZFdaZժ#KK7,-v4u_^r\@Ծ{Ҏ;prsŃ۳}?,$eQ#͞-_/!m+(hY[FzvZU^]=ʕ+*Ux'N>{@ ${GyDsJW^.3V~Z>袋-[" (ms)7naZeFh[$ X矯 Z|X6ם3gׯ&M_~ᅢ~P`^}2o>լYS5jPժUŊ$I.g:=.] z/_3y睧;Cx'oʽ S{Q>`<6B &MRӦM P?#+W.o^^j\.umڴرcտoz 箻R&M-[\&!`;xatg|qX  @2eJي-@@@@@@@.݌=@@@@@@@@@ Bg.+NV<`tرcq*+WYH˖IӧKiE('PeZk]M\p\Q\KeffZI^S&OCƍl;sz?HN,`@+W_ŋeDSNuA}zA[<쳽Ŋ/_^gurz+Gq@P97?{o^`fmD,8˞{pepv @C`i@> R={7'jѢEJ5gQFi@F`>}xl… 9kCI&v%JDN˻vr}?}6^6ϿڽZ=4@@83f͚9gA@@@@@@Rje"        ,PkYo"^ K$e}v պuk5oܛ?؜7ҥKSdɓ'ņ]D  }BC@@@@@@@ TE9        @llªOtH@^ݻwOlaa?K&HE.a$?tM~r+\CR=HժQO+.kQ|"}w[QқoJ^b'ƮZ -[[Zl`!?K+iקOk ܲ-4lw{]/U,YuS0G=.pƍGM6yׯ_=g?,{NjdU h@P@@ xC.Fr7?=Rʣuv r߹Q4h>][l._hܸqPԨQf"}5l4p;~ֈRRR6Rl5n - Z@rooնt\4fLd"ٳgg-7>nG/ 6xZe?S?}ɓGŋW%,V .KbTpaYhpݲh۶mG ²ve˖㖽{&HBYZ*Um{Yq@x}[~=bH " lݺU?~VTIF@NԡCo/" E2e{;vU^=8_\rXQڵKK, jܹ7o7?:u[n^؛Tg@@ϼN       Q)@|X        .!"`/~\\rIt~A=zm? B~h |5S8Q I%vmڴ ڸqcp͛7{-[v4iΝeME9-*R~[ ,(+X]|¼G/sqܹuÇ~oٷowiV{-$ b_^y+4oyg*TN9dɒGC̖ YO`8{<덟G_6m4o]w>AL6O,[x ˗/ל9sž+}}(m!klacgy@ga6_<{f8XV^-zkvs=WkVNT~}UZ5e@@ ,Pkݺu Ώ       jEʐ@@@@@@@@@;k @ 5J?={xiì.K"j ukYֲ>k~\MZmfC>DTԮtUK62v¡uHY O<*S?xZ۶m.Ov~~@?TO  s'uGYK%9]Z0>Ν%W\ЭٳL|=V{>nEl`}jʔ)3"!Qi6p*[nᆣ0%Kh^՚5k4|/ͧlnd͡lnd|6 8n߾ݛ]e˖U-Tre/묳:  @x X; @@@@@@@` ,I        a)` ˇN!@ЧOW|Wd#^|Q!GBL*U#!C$ Bz Vq8 WsiVZ5[5Ϯ]r1oý VSNh\>xCzUݭO;ݶ$}lu.z`9^DV`%u ᲂ0Bgi_Yvbmɟ?@-vۊ@@P |tWBy.@(&Onݺrl i:%5*Kj;fղe6>lZvj +pis0|-8jA\=m 6 @@ zN;4o06l P+zVF      9         ^p+nEh @8 -U}&vԯt]Q54@ *%=\4l5t3ګtꩡ˯ф GI_|!Y(VzRϞRvR ?˾qA2ߞ-@ :~Yi\=OH <@͑i  'Kͥߖgq9 -xb/H)K(׹sg=^Ғ(T*UE@@ %Kzk7m{$|X       ~kv@@@@@@@@"@ P,<...zK@ + Xg\K/R^hQ#0cԱԭd4"E޽UcΒWZ>x}ܹS=ZD }{"rҚ5˽-LzGV#@$!}T#d C.L+G@@HpCjI~})gHEIThQR]{RǍcH  d@w9qgF@@@@@@JQ9*        +]#P#<".ҿ4,X m+]v+iؑM@ GZR4H#|yGi˖uc6魷/N9Eɂ^xAڰA>)]:}Ƿ,P+OϞ GHo-{d#FH3gJիGF%  6l\XQSfg1YVӦMB8%KYf5jT41!  iٳgW%iӦL'F@@@@@@NqeT         @llwm@0XhF(aKVU֭Γ?Ւ!@ X]w 3F:,_?鯿RR˖ӬW%զm[)--4^_~.Hfkeˤne132@@ ֮ôN?]K½FΝ;kڱcG!  `پ !       D,? @@@@@@@@O &&T\\\u! SիWW.]0z%RRҧJyDY@~^Z}J/k=B+>tԸtT;Җ-Ҹq~Mb ;[GHu@ )!ծ-4wZTh~! YC7k&,(Me4 ̚5K{@v){dl  d߼m۶ey9!       @t 1:@@@@@@@@9sT"EDVV&0~W`?~e˖-|;JR-`W]%%M"*]H ~G4Hz 饗,꣏/Luk u0-kr#0jt~֫J"1zH@@Hؾ]jB:|Xr)66RGBH(0i$UPAʕKxG*/s=Zݺu1@@2O@̳       @4 ͏.cC@@@@@@@@O<@ \ <.r5i$\I(`XQ5K:4 v.U7,e. !5k&}_P=O6BXXNi OK116 D[̙RRQ:P%,Pe˖Yb:uRazYb @@P +VLWi8>       @pKC@@@@@@@@[ 66Vqqq=HF)[oiKOxg#txF>@^Y#o~yIK"mjh!z^Vfև˖-r<)$-{ԳTd׿^>0X d}KkHSHed|8#شi,XVZauK/T Ҙ1cª_t@@H@m۶E;       @  ]B@@@@@@@@ \OسgݻbŊ9(GTwߕ{Lze"NXT_QC:i`N?m:T3G[7r0p@@ JWidB"B&9sI&'uH9Op;n!-_W:vC8/W> \or:u0w u`|;]Ν5w\X":@@"bŊE'CA@@@@@@E? G~         @bccm۶#iX~{9=C*QDZwg0wꫥ+~::Gw@ Iŋʕjդ_, kti:W9r$ѕvK&u4oMػWG^]ںU=[ ŏn@@ 8П^w?ɏv&LBS';#nZZʀ)J,ѣGO   ,K'UG:       @ =@@@@@@@@@ XV\\\@ Ot~' Kݻ eߖe n)pKH?.U/բ4kv4ttERt/bYʗOWONiǎ"@>XTI6L.XUGA#" ^`Ji8>ڵleߗ>Dj(cK"I`ڼys ۷oOV$=Y+  @X s_Zj@@@@@@@@:7X8         @1ԜR!믿ꭷSO=yb6 W#G믗+<+}}_dUK'U*W6fC_aU*M.ҹJ|}WYsK+bԦtK˖Iw-1 @@ s^xA :$/wk~V˖?Ύ@(&N%JVZ={m۶jܸqF@`馛;n5'd!+RgObSRZҹJCJ J|#_/mƆh%5z{LSǿԶiYgZeEP tRǎm'ZLCʙ3g  i8p@n!@>7.\)=TTsX~+HMd~V%=/RbK{KV=@i~ LY~ re{.yA\_+zj0±@@%{RJ_Xm+u$0qDU^]Jai,5jPJ4f̘4   P _| p @@@@@@@:9?F@@@@@@@@jE@o"D޽{կ_?u]+V!f19"uQ;Vʙ3K A"tC^kˣFJ.F(wtKuJSH6H*5m*ȑq^ ɂlUK3'}=+^\ں5}O`xJi ?Tiӡ:sԢE#! UkO޼K&PrVպu|{ݱcG}:dV@@@ ]j@@@@@@@R P+ F@@@@@@@@(R X!"dDs=ݻw!o'~e Ӳ ]`?BYPҳJuHKe Ԛ\j,2Bc \f&(-\(.-5l(=`]yb+B!zԮt%RҒ%ҭV6a!  oĝ ܹ=?Ml]roUV= 6Mq@@@VՓ:ԪUK8QڰAz5y :6cʔC l@yݟҵXR2~B!pSR~֤ImZ@ȑ#7xc(N1@@ 0pJ Ҳ% Ngԃ!R`@ ò٩s9}S[cƌr.@@N o޼ڷo_ԍ!      dZgϙ@@@@@@@@@ b]@\\\S!>EGDt$k'{on#հe?wrgU&L6n^]j/l~^ѱ[ RCRwmNl@0&O_ ~Ej?a+覛nRByZ  $ iӎ͹rõnYiPnqR4iܹse2S;v;O@@|iQ3       jec@@@@@@@@@@ +۷g8 pL`ɒ%1b|IY!Z XOR"oD^1-`uӺvnJ*(ehViX?DkHUJ)#}4pdA=^(Xx-kڄ븅kT[<#WKc+  VəSʖMٟ{ ..V]3DB tp&MB@@)={vJt@@@@@@@p囆        D@ѢEcǎ(#DxUť.p a/:z͓^*T(e v)M޽{.vRvۊ dt[ZjVZ(ug޹Sn6G?KfMi[G[[ Nz" _ m9Ёu6o?wt͗mIj.mN49s2<ڮ6}Ϟ=ڥ+4Xo^k˖ڵ+\Զ/ ho}Z2.A3f.xp@@R+`u@@@@@@@Z8         ŊútK`7n&N( ͡E)ҠAȑRjH׶L[_-;]b]{n%^ ={fŽ,ʖ@ėV;~n+z+(&8[!^viK-h (PR,KeH"]{)[>kJmdk =[Rm4or5g#Rԩ҈rh GmZVWQ~SO夺I`ҥ8{?  679-6N<̭mΜ<¨m.fbg90`XJ<'Gs[)ͥϝϩwz7G4sb$?RT<:tRsh[-ZԛG\4A`„ :묳TBpNC۷hm4@@H}_NV@@@@@@@ y^@@@@@@@@+^aÆ( @pBA={T˖-%KغU}{kgMVz˖-ڴi6oެ8mu/mvNЖN\: UdI/*pۂP-V:p=piEq-<.ſSMxnaV`{E ۷hA@at O_H݊Y渢Y14{,[111*^bcc˘X͞}?Brei4TDf)4:u.H?^Erup `شѣ.R /WM6'ڄ  @lfsh[lN<6Q/fġ6gۙg`.mQys2&?.mNm!ӑlT>_ͥhW'5nKǟGmaٲe ҶmRkXX`m/K }q)x\fL_`ĉjժUw4{}ܣG}Wꪫ2@@cGH       @DX9        %`E*-,d1c4o<q:nݤg>߰{/RH(XQ"{C+b/<"*(( (*"Hiҕɛ]d7LfΜ$3-עPyWiw[ mGO6l m{D4`Z6m* e,^[x M9VL)߹sg ̮ n-[ Gk>O^Vp|0}tMsss/Qs gڵZGM]؟l#H <( &=O?vMv;N9R=,t $b;[_h{nA~< \ 6 sHWe%!!!vtNp۹-,wު^lҥK7 @ 6e[ȖXM|n,XPuuq'4hbŊ>nU }ԲR&+HJyqYЬҐ!RGI\vM<ٝ_? (  v,YG[ŠZE]/mU©)D[.mSre.d֟v?w\~[_GcÆ :.+m0?~/5`it&~۷رc d{6  eV(       DJ2)IA@@@@@@@@(Ql;vµ( @4x @AsO4( 4m4k?7-mѢEݣ loٲmBի@! v\It)dƳme˖G{駟~Vʕ݀6(xFt 'Հ^6|SCEjTڷO^jf @ᅲnƒ>yǁ 1kذaر?0f@ ~M ߵw^D{X>@_‹MA ˧Zj)T{l![OO:Uk֬q7o^wOɂ횷+Ν;T̋QQ7o9-f 1ݻwH"(Z  @:tHy0Y|T4@@@@@@:n>*        CmFVF YXz^|E=*^xFl ]+yd!zb6e.X@?g9 w;R yDInSmomp| iJ?mP&M褓NRfc2eK/l<]qt /HEJӧKmMox}4b,yB'V l>T>ҥK{5fRm@@OV0@@@@@@@2,@V @@@@@@@@Adɒ۶mF3 :Q=z4ggƓոqG ȚXnf̘ᦙ3g~sZx<.ЧqƊPbd\U;@fg[MÇ6~/un*UT`~Rt=kvJ^Fw얰=b[˦7 Γx@^Fۼ{n1 .3^#5  @Z{k}iG۴qF/@ڽe˖.Yf.`7wi#@ލ3}tW]zϟ?vXm߾]ŋWV\'|2Nj>ٳg[nɼzz }ծ]^ϑ# djϟ?s7@@@@@@@Ze@@@@@@@@@-8 ]Q="]5EY`^yJѝ}v7T!CcFLUm֭h֬Y׻>$ :]?M4qoP[R;fgb{|7j„ KS_%@@@I|@@@@@@@@ bjE@@@@@@@@@ THbCmĩ#YF#G>q*m$=\h"M8 :K)\ Z;t蠦M*wo[@4 -[V]vuo>/j-+euE5jpIw\3@hzSw|xc뭷{72j#v_ve*UT+F@X7|֟^r > /۫jժy!+W.իWMW_}kԖ-[4}t0;讻RrԹsg׏>묳7yd5o\KWϳ|@Vh@@( 8pϟ?J[Z@@@@@@@(@VNg@@@@@@@@r@ŵcǎ6DCڰ|rU^]ڵ&3KO=u4rlرc6w&MԩS' ZlSu|.xY%z7 ֮]>;5/        H@la+Ā5Kd^K.- iXPғOJe9r ݩS'ըQ ڿ_:unUR%El%P~} 4Hӟnݺ,.ܹs#\"5h (!BD2bZ;jyu҇J#͜)5jf\ҝom@Avҋ/z3Ν;5j(mڴI,l) xiv >| /TdIׇZ|Amܸ1{#Di&MRJSNgfֱcG=B@@ r~V"W)5!      xrW@@@@@@@@rZ9fO rYfflmDX஻ͥ^2VC0jذWW/թSG-Ҝ9sdae˖XZVZ2d,YK֭ժU+o>DZ4R-OSҵJ_,7&]yelgAy@H-[t1_~Y7t ty)o޼鯜5@ rʥm7Ԇ Ohɪ^-_}o5h@_6mڔw="fܙ3gsΉH}9 R>x>쳜/  iCh J #      "@V*@        G@Y'dСCus=Yڷ?:cuX DۧO]wuTHT:_~),ԩ~V`7'~حj lׯ_?ܪY.6ڻBJ,Z,ܮj\_$W(_|IZJ-[TǎeǓm۶eh3/t4`?g*VF &FՓ_zuy!wδbxeJ'>SըQÝ'k;@ \'|ǻ@^2l\iOA }P}PlӱzKܾ^Fzwf޼y۷t[OkѢ1g^ߠ^}HU-6m8@V:?ҥKm۶7n\:k`5@@rZKϛD@@@@@@2K@̒f;         jeG@ׯ /ADbrNXGI^۠TX1-]TwyϟX+ի5b\2M۠ߋ/… A\YV%Kj Lt^K;wԾ}4i$m߾=M$6mr_|Q&P4U-(g¯~v?;̝;7[:ltWÊĜ\[:|y`k3׫W/-[6цi=O$(/, B쑂 @f ߿S~,3fdۗg 56kk&'7?xKee֭]P͚5]ZMԖoڴ,(u/eSn| jJ&MTBkY4碋.={Oi)  ,`}Q+ -9@@@@@@@,@Vvt7@@@@@@@@H$`'6'Ȉ>2e[nH5E=$uԪU`[;@HHHе^˞n gYJy48b;">@J޳wyGݻwwgOO?)@ $3gK.Qv_uw%5k&/@^XWaEbB`.yx7^7x4gRR߼^Et뭷&xzZ*@n![z@ ݻ <_&LмytmF^EZ }P}P^#YWǎuСD+ћH$^FRyaAwkAyMeyG}ƍjӦ,\X`:sU,~fIA@@or6E@@@@@@@ j݌5@@@@@@@@@ N/;vii6Ă~[? M i=[^h4xpVE-@裏\Ok`ȝ;lJkɓ'1NXתUt饗&<Լc6ȌcB},dFݱڂ>S{*P@5}x =.p`j}?\rd5pc^*b%X`y^~Yר_|QvX%_Iy¯#3Uc[ 8+B˗/׬YtǣЗ4hM#G ,cӏ+pB 2D:tgcŊeke˖uQM9*tRwԩ$PZjqeVE@@ { XVѢEw[C@@@@@@Ȉ;#.         jCطaÆ)'0tԢԦMھe]z\Oμ׬Y7|SsU"EdB\,X1^:IJTF ʕ+եK}?l각vؾ}&NB^x}ǚ0aT\6lZ͛e@6V޽VGZ7߸^bNl~J@}ܽk ¤kpqfx ?g_[]O}cߥÇ~]uݻ&~;^<ɓ'뭷?aÆkE/W_ݣ"3iקZP!;VM4qTMҶ-1.ȅ߿߅g6F@@ رC        Iܑ@@@@@@@@@XXn'mCK'!6wn fl~Jɷ' H~ޱ .n-Ebbe]澛qv {mS?zd1x`V,lu:\S͚5u?p˲wpYgDžJsS¯Zlœl 6%n,K. \\9_աCYPّ#G\ mBɊ\y^Qcـev6H^Y~؜"]^ymV͚5soPm~s߉'x m9۾^uUn}s7+ f,يwY yV2n87zK?OwSG}䍱F$/À@L x/ J^0mx֬ ںuN97}ŊUtiw<2Ա>i@r ov~ l;.~]ȴjʅpyB` ´1u& 3,`A]~k[۾ڹ݂`%_ $3ϸP X0ZJ}H *kl+3~ZC]s]6{VOJSv_v½Z,Ovajł6,DXPr @ /G/gwgWwVCSi4,ݮ-P6]}w@;LxdL~cvrK3Vk#  =)JA@@@@@@@ IMB@@@@@@@@ﰁ<( @ZlPV 0[NXˬP:%Ҿsq?Kʙd̜930Hgl}g]Kl@^͞=[ 믿.^>|uI lF[0{ }-iƌn~ 0@ڵ 7iMV>ζoԥK{.$l*V#EYI坅mӞ7DX(%g˽ :Sݲ,B,|*;t嗻m`lF6m\Ո#ܠ6%Kȑ#㏻Ƿ~v,ĂK*UTL, ܹS/_'bQeǞ/;. }KWg6E z^ޝ,gפ瞓͓wl©ٮ,B-_~۷C׃NxW]CXK[hѢEus#_0Ђ힉]Yٿ6{81m}Ů6mC믿dߕ>}zr6/׮szٻws99""oi,`΂)   pZǚ0@@@@@@@ 3^5         !@V||NX` .x'i7 +9 fČѣQ}GL"ڐjժ& i&=: ?D?l f+wzB,4ֵO:$cOV֬Y폂 قJq׮]nq^'즛nIkv!!6试Զegso>=[1F4i$PfY[l߂Kv$6cb6`z$,C?#7˷Zj ۾[.*UrUZ@6Elذûw*㦞- (&m7M9@`ң=H>6 M@IDATG1cƨbŊ.,q_ ״cRvK??(+- ?Z0䎋y%hŊ0Ki v.>x x6% l٢O<хY0D_b)t"  ɝ] Z_:Rp!V .)?Ì>_ڽ^gΣhjז޲R-DˊK/BΝŋjd ݳg:u[ξ '\K @@ Xqɒ%ӷ2k!       @et22@@@@@@@@U|܊ NA8| BЄ[eȑGCϮ*}hѢ ٿ*Ȅl`~[*TkuA^StZ"۷oW|d͛7כo m&{=d͛7M ,вedYRr%x[[h۟q*hʕޱ|Y [zI6K@,`K ꫯbZ!aJN_KO_:=}p!B;b/ܵUrٿ?ɾta𶒻6 ^ƞ'O~F^t͘z+WV+TP`uGuc,;ՋffJ&M?^N"[ LR@@@ j(Q"<^        Q2*         7Eum) @F 6㏇\Q 13^~YRxO>ϧLXСC~K]xd޽5unV,C/q4ZQ~M?1U%lܸfg}]cb^CKX 30?\"Yʖ-oU]|Dˋ>@;v>Ν;G#TI/HW\y+bTf/I  zJ?_j*Du,oB/9*yB-#iYbEYǼ>餓\mڻwƍypW^yE~1+8xyח_~"uO@rܹw"CrÔښ}\C}䮭=ߵH WZ9w e3K_s7wDYbE:GeA7|ϟ9ɓ=g}XH㣵 E@@ n,PTRq~       jB@@@@@@@@@ Ŋs\D *E+\(n͜i*P7M*S^uYg}p`ʕ{ァz2})noQjԨQ#7s]|n r$‰qkV"Ed!GT +zjV7vO2%r6 Օ{߾}fx3ɓiӦ9{nw2E3f$h޼yih~$^X(݊}{YѦM4;\xndz>1cs?oPC / ,_.u"u&~0))!!4_|jڴkX͚5;m/ ,Oq=x/";k,}&,HW^{d! N _߾}aw>M>]t @#`a] nsb$w>ܺukM_KGv*fiz+~F CkÌn'x}cǎl$}髯moΜ9ړEhѢN7c2dH (k`-SNYېl .@lK  (jeܑ@@@@@@@ D&W         @L ϟ_y :Th Ĥ/7L}rY@LoF !/ 蔑? 屰X,R1j*QSNݻwyheG}T6@?`}ݧ?t؂sxj*Söկ_?7x۶mBZn- .i޼"m@ ꮻҲe4rH͞=[63d}/8 -m>@}'OǙSX>PaГ:˽k] ]=m6 yf+i?O? ~{;餓\'wޑx#*R xOz!㥕+%/ *THX̽4hPM\ewZTru?ںzH0n81W_?oQ 7SO=-kKu 7 +ye)-¢,},p~[֭y(.rn_ζk*[?+ѣG݌Y\/y4M-QwN쳣AZiBB,XVq.\pۇPpvsFyՎvWreM0An ҕW^*!!աC5h@`\]l}m s o2 ۲k;v $`}2;tU'| k·mLR_z̙_.]:kprv<}P}6 Տ vł&5٤t_&֧J/!6kpc{Į,pgޅO<+VtaW\rן;ڡk9?=Խص9έnvmph/k}`잆R$Z)8ݽGbjC@@ k-(       DR DBB@@@@@@@@ ' iӦq5ktrq Ʒk'/hEz(o_|хXLrWVkK*ޓ,/GޠÑkŊ+ܹdٺ\ ee9|<(U 4o<7 JOjÆ SNelobuڼ ב^l-;e*\ ?XD>UVzPtǶm0ŋgʀc6/jժɮ],jժnptO;.YęVP!ڛJs۶mӣ>*SX ԡ7i@ +"rռ0;n-( ,I^(XI.nWvl D ֲD;PSznǂ-4sNw~_ܲeʔ)V5{uvCtX b!H Yfsr-Yzv> }^Cb_ڮg,TR& G={.)]Fh3jX? ,'{qbubm%_ۑ}^Cm/}p}z&k.&Jz]>X|)69oڵayoO<PmHv VoРAlܹsc\޽5zT29s矰υXYatM/-[\b@@B>Ŋ3@@@@@@@H IMB@@@@@@@@ P+?"@L<裲ESmj>b,6nQ#ݻQ}K:t~a]y啺馛԰am85Y[.kJu='2ZsUS'}ϵr<N"=gj3W^ч~(3&K'H͛K^*MhAKϩ_~)r~tw zOaÆYfdB-@3BD3a @ .B맧~څ-WXY^uU^kl_Uc=?PwPUEoU}ڬn1O󱾳,X.L/HdU'MըQ#SH֭];3֚G{@@t-[m ưA@@@@@@@l%@V8@@@@@@@@HMXbڹsgj>`UVW_?B *AVDYGIyJ]Fw A{ɓ'_TF\X_^zlٲmD*[nvԔ)StWPMTW=R\&<餓dS,CO>7ok޵^+T޾K%!ڔU <|z4j(łfΜSN9%UEey/@vlF|WY_Z>JH4/ұ֞}Ȫ>mVm7g#Ghƌ]wʗ/n59r9 Բ'%zv/K."P+zԌ  _~Vҥ@@@@@@@ Ԋ"        @$-]vEJBl&pa6\$oWJ xsgHiX.`ڴK1b^xdնm[]p֭T9 Jv͑J(5/2_>R@)q,{!Ui.0/[u饗TR1g+5 sMA1(p#H* >;&Y؝ OA@{,lӷ~µ,PKe}鳽p#bkԌl]㈬gvA}7mAE6 Y8k$%e ^xqL){]t6mڤrʥC@@ [X-_|*VXv@@@@@@@ vԊς         @&k׮̈́- G_ j͛7]ȝ[:|8EY(v73iI6clC qӏ?cz#Ϻ›4ijٲ?結&|H1` 2،={hڴi4i*4Y˖-SƍճgO[nկZ?_z?d +0uԷ׮Awh9 Ć駟./}WСCj?:"i+ǑT$~__֭/=eY3Ojs;NI^(yY塖b^NƻwHcH'/DNw='    L֭/1yv]Z5ׇMjMAA֧OK/^XʕSΝ[oBo(ݱ1?iLZvO3Ч~JVX@@ { l޼@ѲW       @  @@@@@@@@@wڕd[ ''͕+WحNH P+lLZg[mH%JdLFdӽޫm۶LW_}UTbtꩧUVn:SH8L[C 6#;7|gߴ*T(͈zy]`AI'$-/|Ͳ88xPz顇eZ D@{| 6l.]*GdZ۷ow[~Gvi:=nP@ 9?Cf ,Y" ̳W_,\>-alb|vB->ڵnvݻ}Ϟ'  M“_Q@@@@@@@Z:@@@@@@@@mbudA܀:uJS3JW>|XKio*C(Yw&hڵ9sf̘ct ׫WOe'/X` ;pBYhMsʕ+K:eYwy{,UT; j^z)tGhvO-;}2!#V=! i[luػ?~~amܸڵ7of͚N:ʝ;w ի5@?z޼y.xⲠ^js6mܽ- ʣDV)޽[iV=\p .Ȭs9k[@@6oެ2e)        P+2Ԃ        q"PH7`4f"@& L2EӦMsFiݤj8ֵX>ZsH[@6Z[NUT%\&ۂvƦٳg-*YȖ ޴iSըQ#UT): V#Gb /n  ˗=V|$tꩧAsJ 8PjBj.~ ح6l;0jdcTv&  ebmaև+{ 7n8З>tǫhѢf6@ iŮ/O?KonYZxK/=6h~z'M֬Y3֛mWretI8qg&P+|  @l٢&My=V@@@@@@@@ 5R}@@@@@@@@VjeA b r_n)"i,%K/MUJxq]/:MYF׏?,~e,YR6 M{\rU@8t ݠ6G6m/%zk`͚5S2erU~4kԫTb<OFÇKCعE?^-;1 IF]z`hO[(/1B\zu׏nذam}%Jd'4 X?pOo.Dkٲe~N[x-@i+d\:u!M]vo_~9M0  I`9Uɾ       $@V,}@@@@@@@@.`Zs?:8@ >#Pd+XOPbC`TChK[QK T}v-ZH?{_h˖-n… ^z[ԩʕ Yȑ#Znl`K&l]Y\lSO=U_5j/TP<~ -/[L]&}mcD菉} /y4x#F> voUW]cժUm}i /e{/1B :/maϦ b ׇO[[_;o޼~SecjJ ^=Yߘւ.]衇O?s  8w e˖E@@@@@@@ 0LI@@@@@@@@bY޽[%J6C^}mڴi+kUV=5De[vSp37o,v l!C~/_Em5kVZўרQCժUsSҥ9Y&`xoܸQ6H |o}moV\*X? 6MŊ˲} -*#l)=9_3cvYe@@^lڵk`>֗^d/mӤI~rN/mu}iPkڵ߇GSVʔ)֗n߾ g@j βP-J 1ʂ۴i̦-k楐WXQ&L P+~  @v/e֭O򒼋       @Jk         @ MG FrAC|IkkL^^#Zm\VVlYٔt0] !8٦?=Θ1C#GԶmk[UVuWRE+WhmsX'UnݺD m%x{Bj׮;wҗ'J<#'m+k:!vq[ENh   sv [t%Ѧ-[,З? +ڻwo`y'[sp_RJ*j2 K@DaÆ@`bիΝ;>-4))矫Cʟ?|@?{8q8  @oY         P+Ңԇ        1- q uUW]u{{j.+~A ZM CԮ]d.۴zjhaF5}t7Ps@y@UBUX=s <۠6@9% u˖-ڴi1 _іbj6ȷM6}Vܣ=V{^@q3Ao_i4K 3al"sH7,-Z$~tHA@!`M4qSҷ9=~_׬Y?=  scbŒnTۂћ7ov-:i_zΝ /~^2yK[ڂܸ' 6O߯SjСfmGvz˅q  @Nb       @Ԋ(!        @L Z68%roB]  c(1 `Z &-ZT'pۍkYR׌3܀۷oOT \D .] e%K*x=/^\(%̴vdto۶MycuV&0cǎDmK*m G{O`b761ջRT{ -k'ԠA F@b@;ϱSN ٢@uӳg)X[es}g7oe!ؔ4G}>Ky>o޼5~ժU˅N!lhAYeJ9svޭN:弝=>3?~}gkbU4@@ P+s        S9g@@@@@@@@ȡ~ 2HA+g=裺Tj A޸Ȕ,8tHƟSOeqCrA7n߿?0 M.FY s)Ҵk.9rzmi@p¿nSs{]PS]8 tk!]6fo>7dǸ7d@6mAX6x~XIgnAYeʔQڵAiڦrʹlٲJHHHR/I5z矗n=ZO[M_o){cR^ ?Φۖe}_CYC(JPvJ+-*E%iS/ZD*i,!k)[BXs3kfrs}}۽.3=F[Y=WZͮ_%{?B &6g::Z:...hkîS^GH+ٮ]Gu-mastkhװ{nv=mVd#'8eH]?{V@zǏWڵUZ/wdV4n8BL   P˟Q!      "@VI        A]7x yGl7C'9ARlÃ&`EgtpS pڶm[^S-X-fqF-^maR(vJS'\f8emp \r1bک=loA'ϞB8{m22G"Y(pt[J*n0Ⱥ=|h6k{͚IO< c RgR҂wKa  @t X`=,8p- y{[lњ5kBz4#Ůj9ٮԮ2Ԯm]Gw-m۵Yef&fҁ|Y)rkik@Ծ}`7K{ԩޫA   "`Zݱ]S@@@@@@@Z=@@@@@@@@-\it-" kG}ЪAVض= }[)kB&ҤIR.49?Z l*+gK {ǧ! YkB wGv] {l5={޳{mi]G٤YU:D_SBR^;ޞZ:ttuw=mîm; X(ҥKku13. XO6Mm۶y3Q@@,P˾ۧ         BJ         k8|}x|{5z4E#7O:49hCJªw=R+~*3tQjU؆wRÆR^Ґ!x '@'=`E{ݵ/ @@|.`ATEuJkfj2ܽ%jѢEd < G[re>IC7@(4      Į x{f        @ X֞={bvLXxgUhQqA%ȟ@fモJT3;vH:$+(3SgD >^>\7N6,$]q~Q:K//nIʕ8@@ Xg^ -ujժiWbOXͫ .@vn(  Ċ΅|ɒ%ce@@@@@@@ j@@@@@@@@@  9+r޽;@ lk׮Ր!CԷo_,X0BAm2)ie ǔIa36I&H%J,!hBzW/iuC;wJ'5nd<7*@@ز:] 5Ə;_ 9og_   * *]@@@@@@@ Ԋ@@@@@@@@= bA;8z)-[Vݻw:ZA'tդIVi\)!AZ5&TRKZÓBw`H0}@@ juUdL Nվ}OYh׮߯)SdD@@ ԊP@@@@@@@ P+OCF@@@@@@@@ ik@ b~W;zu '}e"ìΝҊd*f<4bGҩ,G d͟/rȺ.ZVIrB\b@@(@%d2L ?^jѢEz٬ +Wιx&L&8@@C?)^xČ"      DZu-        APBڳgOZ '4Unp-PJbb3 …ґ#jW=rz{}_?i }7#E 4\)=lٱ>\cܧ԰}4{[Rɒ?  DZtkN $$$uʗ/_N ~h׮&NN v!  [nu'Rd8@@@@@@|@IDATZ><) @@@@@@@@B+GVhiXB#Fpu)o޼!WIi8 HJI+"cNo[nzn-τJ"xtPR&go9Ҝ9aRwRҰa+HK͚E   l"w4lDطoN: Sm_~ѪU|:B  @p@ŋAZA@@@@@@@ @@"        @ *THw2CГO>O>Y\sM4 Lj@۰j5nnvƠe%H]$ L?ܽjRrB-%{dLU6UWI/-_.! @@"R¥%#r X^&td^y抏ĉ30G   A۶msG[X5CE@@@@@@/mV&Z)@@@@@@@@@ ,PkϞ=0,]T|x '"td+-js2B@Fhӛ6I:$ .aD@ݺIOί^%%&J&=L yvҷTd͜)TtBw  䀀j(%" RJ2f|ԪU+M0!&ό@@bJ`|-Sf       @f`&;3{h1O         U ..@-ƅ@:u+b6U`6  YLj8=~؟ /'+()#gDrB,^9zNIw |-ҠA /H/5o~^!  jEf~?~"S|-Ю];M:UF @@(ضm]|ϟ?Jgȴ@@@@@@@rZ@>        a(Tv~'d}GNNNheN ,^,:$5i~͟sҊRBT?ɨFٳSNz*e9$&&DnVY]s"{u  Kv }TD,͚"q U$Z7˩m۶ծ]4k֬"  r *Zh@@@@@@@ @@@@@@@@@!@,HA˲qZ=NEv]bŤՃ4 F^}&-լ`D/H\ \4哦OOkotm}~z?F1B*WxG@@غU%KFܘHp97B<`4G!VN:$}W!셦@@YN*]P@@@@@@@Z]@@@@@@@@@\\u!ߎ!@-ZO?T+W7#>A V;q 6HS+0jҠAR˖; @D 8kDkljU)o޴p4mZeԩRf8n]嗥g.9'c؋  @4 lْ4%y XNu.>>x        j@@@@@@@@_ KMlfs .Ԙ1cԿ݂C,T%Դix7 Y^s /klX(ZT;VzPܩ w%)cGR]b#zaҀRݺ/H'K| U @@ lܘtQtf>/0ٹܿڷol ϥ)SDɌ  G u@@@@@@@/Nh@@@@@@@@@姳Xi5iD:u NlZ!/XA6~RPIfAjf"N`Nsg\`{"nR ɇ&M=zB45}ۢWH&<(:6x4at)R~ҢERV0k  @6mJ<"x=+0~x5nXe˖Iȋ:M6W_}c3g  "@Vi      Z9gO         C p{&P+N"" j̘1z'BC*$ٓ~_`oߞz޽:pQ;\/_>'^ۣPB*V1ҥK|n`<:uID;wAAIVA܌RӦrVSQ#(]z'}hfjL_~E ,prIZn~eAYUTI'J*qNjZut]YV"EdW(H-:n[Um,@/{^l g Zx≪[;>=lgʺZ9AaՐiO8 g^rB_M.[@@@@@&Mr۶mr3#HUVٳ{O3T@@ P+}"      d_@        D-oZjE؉c"xb3Fy*{÷)>^ڼ9|zOSJ7 5n#͝+9;![oٚ6mf8c7vn矯5k5j(ad(Q}T$4ʮ]rJIZh}YP.]Zv9{|Noe'm+WNj\j,)}N   @NK '|7lE VkfmDիr΍ɓ'@H?@@8p_GR)#e?h5k^y=ÊS&W/ZT΂IZM&.S&y7/@@@ T| T 1"`Ǐ]w#3irndO2E=PN! ĔKv Z1uڙ,       vNN         [߾}~ c@, =z>cʕ+x#yVGf͎_/0yԧsR?f@$ݻW&Mرc 7J*j۶ziU\91uR=\ѫW/˗iȐ*PM:b*Wޠ.k.H-ZP_ .N8!&ӓ\Fj˥޽c#3gs*wڥM >wY 4IZԯ=ÇO _cʕ+뮻N7pN9Nq!  K?LS/ǠUpR5j#iZn~9{lwyk@@!ٿ        *ܡjv@@@@@@@@@? 8O>ruB\J&Mڵ qG4 ˓ʗ~;LJZ7*O:$';=Zv5[}0;wnuYzdgnݺO>QդI>@@֯R+_j{ن@l XVcsQ6O      Ć?V kf        >@-o @{9xҥKjjYٶ-F`cдM9S>}{Q  7n-fY0g}%Ko}.Wxݻ '%pyI'![˖-ӪUb -]T+WԚ5kas6>|85@@|.dbE!F/ lctJ-[1cF(m@@"{?:A@@@@@@M9mf        .`z۷/?'Ya4h ɓ7/Z4i(۷pN7~Lh7֯.<)4oߜ #GBFJr劎 |'pwn2`=fٹ)R{ʕ+ TTJ0ڵkUV3<@@ Xօf>5fCiĉzGy17e˪N:6mڷosg  %@VtOf      U@-ƅ        !(P>B#@P^x_}PncŊ%m[v[>T*UJj"ld´ .'(&g뮻NsQ޽裏>S/`ZzR׮]խ[73F:tc= %޽{0uVjݺu;wyfw:ԴiSb wy @@l >,3Tr6pDou1Jf4<v@-   .`iY(       J@P.        Z ڹs@hM6iС8p!PswGK^(i3x@Gi<ɉ @6&LkF*UՠAl($C~8qnf]{`oA[˖-ӂ wiرɟ:,]~+Tt4G@@r\`A9.9>/TZ5ծ]ahٲz-I ʦ   B)ytYCƍ      D@H$cD@@@@@@@@-`Zn@ /)nݺ5gI۷gxJ__HW]~=FGI&'0OS'2k;K/uB姓XڶmEzj޼ x:3uww?ߖu[*T%\ӧgM*!  k&^rN]5=%=\:tH3f̈1#@@ P+N7E@@@@@@rL@c@@@@@@@@I 'ȤS3ytx-*mbQe֭cm?eˤ[nK/3D  нޫ^xAÆ }S&L뮻N_|>t,˻maB5k֬,!  G?\ guֹ:t0[ʔ)ujڴiYl@@jr.sf2F      DJGyeV         pk߾}ǩn믿yG~1(V@cPaȤmȐ!nkYVvJBpٳgo ':K7tvܙ9@@XiHHHPղeˈ7͸yGVƹ  S ԲCA@@@@@@@ jR@@@@@@@@@ Pbbo@_Nj}*\;|hQiv * 3kbԵkL)%pҦM }9jo@ &M߯?nxR&z ﹮ꫵrʠy"}ƍFiٲeAi;܍L>]w  kʕ] ժU+W@ hǎ9Af  jif       @ 㧀         @Nϟ_ˉ2)[o^{#[D i˖ *zԤI,6v҇J#Gpvuf*[oUW]/Td݅ s|Lk 2D'|uM+Џ?ŋsŋݶ,K9rYzgMn}URkGsk.=<￯8'\qy͞= 6l^~eޮ4I༰PִoO:uҕW^8:u{Iu߅^w琲_{V~{Ro2nZDz@s_o_cǎ93z j:tH3g Kt Y{vors{)1;wԻᆱ.]覛nѣeRϟ}!yYicȴyț7o@@@@@@@2#@Vf        Q#P@%&&F|*` ޽J,i )ھ]#9?Z ̛'%'Dj&gBD@Řߴ: SZt~,/|(ӈ#`;A\r6mj֬) |`ټy[yZJay̙|Nkԩ?>lQO+u<={쳟 뮻dP/_ƍVSko15koרQRms޽S>sꫯs=2pCsߦ5z2ҮWg@@&xGP:3z1ҥK^z^g@ذa;ڽq{x7=f'~%)[W^y{_~^s~03IÇ'xnrJ`6骫-˩Q/#`# 'xBEZhoWc`j׮[oUO?l^NaŊ-*bҫZ;*UR2edVS1c .@rn!{X1^[)soNzc/N:)o޼m3~~z|qM[Lƍg?isZKY'uF <  6mGǘ@BB:tN-G,Pkڽ{wO  1W_S#hԩ:b_lSҺ{! :T˗Wǎ֭zȐ!ێnݪݻ'W-R5{l-Z(y;/ZPM@@@@@@@@x        Ă@o߾X*sD bFUViܸq1{Ri̘Kk9'`iv>'OL AK/K[xb]f͚Ay+te?vճgO5o\k֬14h@/ڷo{'[C꫚9smۦO?]UVUNXcRZcjoذvؑ|}7B^|EB_~Zn\'X/,QF۶mfҥxقgJ5R lG`ׯ{1"ձc,ˊkyV׭Re?[{ojʕs )ma?;Æ ssh~~KZXym\4k3~Fs`ic;  gR-j,1p]bQ >rF<( 8sf *y׮]CXO?{i 8}}-um_Zn͛͛7sΝܿaWw?Է~{vO?uqU_~r;^z1=_+hƌnڵ}OPLw?A +}HV@@@@@@@2"￰Hm         Q"`'&&Fl)` P]z饪YfDL@^ڴ n3  p"{nΌ^F :3B25 4:%K}<Žƴl2M2E-Zpp# mnƴk.7iԩnҐ!C / ?ܶs_..ijժ.^kر[-ٽ{w7^Pfʹw4?qD70-kz*·`;/`-\0ͺx6m4uIŊ;[J*̵iӦmOcdf-Z۷Ny :oK63Ϯ-ٳ'Qsi(`Czc [@@^KA ,,B:묘v[iO>=V<@Hŋ'W]u}Ł\tEg_xI˻)cV|s'}_`-dBʖ-ڲ}Vsc3}1j(K{ڔL X@@@@@@@P u        QNe|آɓk`l;t*sHNJ8k+H}F>E-4bŊ!Qݺuj>7zZjÇe˖WZ͛7'ꋧzJsΕ)Y=,>x%o޼:䓵eo*URJ%g}Vd'#F[oMs}`+[ 0) xJ-)lyX0Yf͜9ӝG`Z^ӧN:$b^1soy"nʝ)Ν[?~ۯYWRSpa](Q­8~8 kXR}חΙ-vl+#? J[^MY>Ll7e^# $or>Y>FXjmVvK s9@8@ )k&y~1ct嗻AW? M;ziݓ믿: Lmڴ.Є {v7p;c8M~iɒ%oTP!i 駟d6 o*q       _6dTz         UeeQ5/&@}teeo&K6m,6+~gkĉzg0}jժσիWV@@j00 |nRza݅Aۧy慡7@@` vm2efFTk.;wxyocjԽ{w%Kזx֭5k[-^޼yU@-        oa`         JBKdO`jذڶm|eK;~ԡCM,r?$;[ SF z̙ł @\P!7˂˯;6z-7Po<^7̝;W5 vn{eP`''9?cѣ4hoV`I>}~uGV69rDmڴO?.jg|JHHpz衇rJ͘1 ڢJ R`jzu_A!6/ҹzʔ)>(;UXѽ>0@Ȩݧ-\d4Pf͚ʝ;VۅPr_ݰa>cYxֻᆱ'&UNu`[֭s}d;HY놺k@@@@@@@@oj0@@@@@@@@x @,ӧOQE,L%mAEP,YK>ag8방KӤ~@ǎeo۷/H-L޼y ۷oOqA3/_^k.}w]$&&&^x۱cɂ:$ol8fg2k,=t{GQ%TvtgwUdOB,駟j֭*X`CmٲV>o󫯾]V-|^Kg%eU;wyƌ~-,4iu=F鶑>3g,eg}{9˲W)  @4 8}O4#@,T׮)'ТE b35@IDATc@0- ղ+kaZIzӳ>.b-ZHŋJoܭ[7qO'Ou];wtv+&Lp̟?_+Wg *dɒF9x[;x       L@-         P+<@f,,RJ \0*T2eʎCI/nV8/g!6iH9aDڵ٣{/$<3YwyGրܾƍ5k诿r߯^1_ݶ)i- i?7K6mM]qرcemG2dzk (/Wn8p@7tm iB'x~/F)_|Ǵ{n7;f+gyg @3 ~7~:9)[04e\j,]p?Lm۶m[Lo|(*@|<%P+VN8LU,Ȁ@Ty~9#   Dmݦ͛7;Xh~Pwo߾ʝ;{ +j֬m]>}Ow:UW]CꫯAܶ>r-j8M4QjՒ        GxV        \@غuԽޫyfx?PqFycCi9 Ec ݑUr>!@p,oOls=z7t}_W^R.MLLth+fx 7FÇ/m!JfƗ^;C@Aգa6 58u,%Ν;ej@SO= zwtW5q駟TNc&}+بQ#kν?b7h~ճgO-ZT{qe]׶\sl<:u]wݥ^xA:tHtw:w#$        W\m¯ @@@@@@@@"F@9U 4; "K,є)S4}T[7gkMnuEJJl#ҠAwOkܹŸٸ-Jʟog[@ԊWҫac+_z@|׉'FlY '_fTzYfΜIZDƍ sI{6m0%J$oK"g+Wjg }~m#eN kƍHKܹCК5kTJv@@@@@@@Z~;#@@@@@@@@"@VX BOn6.\8C 6*ۥgXaKNƎJ^{-zA X{.I%ہӚ\y%%oZd Žd|ǫE ZhtI^ =9rĭo> 4 -ЁYthΟ?]|kf޼y7n|IoS-;H͘1CrJZpF2R'Su3<>g} 2?J qtjl)s=G n&G]vlu!={v=쳗Wf͸ʑ#G|>9W;vLe˖#G]s5Xݧ~Z},Y׮YUtW$8Pkܹz?m۶۷o,5ѣG> doǎ5n8.]Z 6R&N );|/v%%>m! ذAnB=zB_`ҤI0eCX_j{wMx@RA`Zn]_N\;Cv흂       ZxT        ]@-s=ꪫ_ n7kW ,0:wʕx"0H'0o\pRժۇ@ ypթS'۷OO>d6ҧO֭['^ziРA}-x®xDB}aI%JЀ[9yy n!I% @lڴIK.r=d̘1@@@@@@@@  G@@@@@@@@@ j%ގ=Hn_Ո#/_>>d4c4w=6,];|gx%eϞ]]vʕ+շo_eȐ!!l<]t9=(S_ աC9s&ݻwM65k~YhتU6mZ8q✦;vܹS?l2 &ѣj޼&OFf @@XVj8Z]RW•?T^,|̙jѠ +PB-_ܕt{9 6LonEDDBk裏jРA.8%JR-R-[7KGkYLuj׮e˪PBn@@PH@?F ԴiӤV!"`Z{־}d@@@@@@@@@@)          @8 X@@p<9Pv4>LO)*o>gmY7ֺun|ҥKիW/_șu ;ܽny-:uvV:u ڴ>PJN(  jY a)0aeΜY 6 3 rέҥK@ mX         +p60@@@@@@@@B_ **J'N2BP{SΝ}ZDw骫Ժ^.Җ-_H#6I?.=tA:@ H?$srw%4jc4hkر.ijԨz3SO=˗Jw-ӧ}q{I/hÆ 裏t W*^xA .tv&M(}--XU9S:p@ᇥBrܭfͤ7ސock  Zr FX֍7xw_tFNnݺjQC          j>m#        @ ѩG \ƌ]v0b@h \}u۰6N j"LV׫Tq^W_Iw)7v\r:t6oެ..pܸqpʕ+O>ھ}{4qi/+ h}"")&m[ ^ \zZǎ7߸8q)o޼:͐Aモ, )_WOʑCj {xu@@Z~'8zLMhVj XּyejE@@@@@@@@@ P+ B@@@@@@@@@'NTsg ZlB 64uq\B.Dz /-X,'# |>2v?,uX/@1ukiJil9ѲW8C֭ӴiTzuK*Xԩ^{M˖-_S.Yp̙zTB.]Z rgwjZfvL"4jTԪ4cFf5nXsuԢE|mUCB*U}TCxJ}2L]]jUǥѣB⪍u  W`n/֝FS;SjҤI؍_Z쵱tKoȳ          @&a"        QQQj].`3:D,j{PC>95 /ȅx-{z@` l,Tt]^@ݸq֭RRٲ)vءJ˗`VriMW_}:wÇk˖-)߹Tnqնm[YYz\x(tM2e;n[wۧC,{wiF93i62/0UTQѢEPt} ¶4f͒ڴ|dICiixWφ  $Z`*o2e];"&LPʕU@@Yw!(`@@@@@@@@@@) @@@@@@@@@ \ҦMp>F b9XCSv<\!%HXZ8<|n#'˅TIKyJ:I/X_2f̨nͷroyԩS5tP_ ;xڵeaO+V K\d-Zٳgkڴi.j2gάu[nj޼/prサswyFz1&̾\-I^kw-V}/[Ҍȑґ#raaraa^,5EF&}j@@@ Vf ]-#`ZLA|5㏟4@@@@@@@@@@`Z; @@@@@@@@b 'N}-]\hH/ZK&,P1i)WCsҏ?ʅHW^(GZ[FK  iX}Բ]I7gY9|/dvaLW_.t)ReʔQժUUB*Uʷ/^\ӧ1R֮][֬YKjڰabbb'OU^]]tQÆ }-7V-Ɏ֭Ho%յTXbkN~YH7-$ZLK/I{zA.CLe95jH2$=@@@ V,@ \R6mRӦMm7=hРxnf          @h Ǘ!        %lB|.SA`Rڶm~Gxj}R:qlEl[S.('qu(sտtԦdUFLt 7O[N--H5ե(n۶\DDj(QB T%yK͛7rȡlٲɶMrI_׾}K9v˖--[g)&/;?Pjժ9Ǡ7ߔ^|QnlFouKL j[yƎ^M{ GB,` ʞ@@ L!.3!,0aΝ[,m@u܏^aN(          @8 G#         Cʐ!C5-*5yt5)x4g;KݻKgtn$Jmu}kَ'./vے ZP.H.;*䊅`,Yҷ}ݧǷ{nըQCu=hÆ @ nm۩J/T+-ct[?~wkmu߿_~c^@TYV˖r.)+=G PŇm$Ml}^*UµbCK>*  @pXhwFWz@r ?^7vR^r"PfMcٺ;"         "@V)        .囀?+BS& ݺu f_2C[J pY ڲ%ǒ,[&vԬk}IwoiRi")22zF_<7N.I@ΐAxguAMw  `Gj]n"Bz.j/ ,ȑ#ϲp̙3_u@ k]̕ץϟ߷z]bպTS*RD}{n.iƌ3![~(Y)k5h8(  ]/+WK~Κ5K?px &H k֬.ܺ^BV@@@@@@@@@BR@< @@@@@@@@#6mZEGGgSAdׯn/^<j * 6o>wcJϥ4i uUr4/KLvRsz jդ#;QFi ӲcMT=/=|UW5I5uڭԟWDe˚5^V.R^Mv& *wvYe׹֭47A\ &;&(p&\BQ@@P3X)[ֻI|Ck.%PN_֥9@@@@@@@@@@  2cD@@@@@@@@8,Pĉq>JH^kta. " JBҖ-a0гraab_-O֓ :SNJn݂t9 ][ڳG8QZ@j*|ômۦ|P=Zhq`Cz3,OԪ%-]zR:vz$G%[6[W_Mno^{wB)OeKwr8t @@e׋CT@ Lp ^{rk `Z-op0         ZO         QQQLJJ.6mЋp ԲP %ӤY0 #&\ ,^,}&ի'9}͞-5nv 8&&F:tpIyoFO/,8MNVA|kI7K4b>ea\,(~}ᅲW^x {ufM)gN曥W^ Q7@@X!)uo r}]\#X=RۏƋ@@@@@@@@@c3t@@@@@@@@] %JcaP /`F` Ȗ-Fcw/gk 2:"zt]Rj^ԤI^Ѝ7&ݶK:u>3eʔc[6/YlL5 nJЎAU>q2J5gTt^HU h]/C+WʅɅIhPʑ -{W0>" G) %sjjAXJ*傧s?@@@@@@@@@c"0CG@@@@@@@@ DEEuqA ƎcǎVgWd!۶I11o~{Nnݤ PI|}8 @@@@@@@@@)@V< @@@@@@@@BOCo`4m4u9z.쵱eJFQC>ۤ+[oMЖ?v풺vyD[ן-Q7/RRoH<#Y}O3g_M^aCH;JQQg?<5^.47y ZnYgi BlU1cSan-}t{R…RvUWyw.M|"mxx@@ <[]Rc@85J ~@@@@@@@@@@ Laz6        Hu2f# T"Et=Q)P ]ټ9GI*H-[J z!Krf^{:!n˗K Jnԣ)SIo[\r>ݻ'tbaW;vH~bZ{Jfk Eť "bs攚7zΕ~A?${>TTձ{s  [`\@( p?vcbbĉLY.%PfMEDD߽/@@@@@@@@@S3l@@@@@@@@⅀?O?ԅftR4,M+Yƍ~cէNISH:HW]%u&ժ%-Y"'UƩ:UƏF dI.(*pR*ѣҜ9˄T|ڭo1ė?~;-PRѢ<*%,)gZ{ -}ݶT4|oRɜY&嗥_~}lkR2ҕWJ[K}J˖MrZ@+`+}D 1/rvرc_ߦu7*}􉩒}T G*.p̱S@@@@@@@@@@ Lkv0= @@@@@@@@$P+n",~ݫ/Y J @- њ1CE*\X&;~i6i`b`; 7>K>*i#rK|`BK`lYi/T+Q#ьs _-ȝ}{L͚wVIY֪U{r> `1 H=zH? Y0#J\->} B#օ[@@ /&zB@lo6lZj9s_!C[?Rk Ԯ][s 10@@@@@@@@@@rj]N@@@@@@@@@ d,P+:::dHm!CoVS+~ѢҦMt-7yD8IK&I:I+WJK?.7ld Kw e uӺԸzJdCsXըQxz(o3g@-۸џOݥJI~kթ#u(Y'~TTT^ȚyբERϞ=^ؘ4i==[:q"x/=E@E@`9R3Ydq3Nɓ믿_dɒ*.wsiSL)(KA܏oTӰ1czѣ$ ײP Ip kӂԪWx śARE`曥}TJ6azR޼y5 9Sj>^'iic<~| ٝ IŊ^TaoD=$}Қ5{IKI z[9ѳ4etHJv@@XX.@HN *`Z.V%^q.x(Z"HqUt3fԼyVB@@@@@@@@@G@9V@@@@@@@@Y 22@d6:blbжm*]thQ/paɓKJIw-~"PRٲ?ZO={]̟/ Mlz=eRFe=k[Y^2dHC'|R]*ӣHgDiLgСh-8۰`-{OX!U n-U&{Yɒҿ%kւQ- X1i0- (}F@RJ` Ydߛ,lkY(/(UZUs΍l         ZvD        [="@̙k{!jY *}'U(z"xoҗ_z#"RWR׮k$D}ҝwJ;zR͚j->}k;ɝ[,M}GҶkD:q LZMw2_HrPԼTO?HsZiizi~rҘ1-H9sJux߫v_m@@sʕg4<^"1եKzè%P]7o^e'@@@@@@@@@@  #H@@@@@@@@@ 6ɓ'?;"@~ʗ/UƽA-P@J6uڷ,PtiiJd0g ٥=/) 3fxϝ+M,%eCJ?.F"RY\Φ֭K7˓ M?>UM9n4uM-  AZԶHg.kwe[.0A2   jgɒ%Zudo<+@Z|r9rb@@@@@@@@@YB20@@@@@@@@Zy.pq9R?s2TiŜ/,oR*Q"e@k-0e4bŔWz@bN^~Y:R%iR~bc?iњ7ozq_c* -7k&M($zu_~jԐ[Z6=C#i*i;̱ys+$s;7ۿ?ճ!  v^i p Yj̘1J>}ϳ tIZh6a=          je`         p9-P@ Ənv%[\QѢ҆ )7o6K/,LnV=ڰ (wԤһJ٘+W(4d={tAP$cYرR)ؖ6ox:v h@5 \B*WNzA4!۶y?m.i(n]-ϣU'>(@IDAT 7%Ƌ $d7'B zUL)CI) y񅛧T         Zr$        @4iJqu uÇWB}_4 &~t=ĉrm&J*A7/Bpp '`IժIVIӧ{r$]/К5k|Z mi˖ Ԫ\Y*XPrY$l)-[& _عK&05wn;%5?Fח&O׶] CE@ l,PˮQ]uU @,YyTT mΝ;$DFj%m@@@@@@@@@@ d C@@@@@@@@@@ j%TA0a(>ťu1vt}SOI,Z)\ }ԫRb< ^`Pk% YPrsSAԩSz饗|KNPdTݒmM JHcGP5ׂeﳏ>#W.;$ \Tڽ[ SlU*=$[` [x(PȚ5!ߞr!C^#PfM͟??1          j         Ǿ\(_*&&ƅO&mȔ)R6CIov9yF ,\ޓw:tt^ʝ-~_vz葠j)ƌZNnɺqf^ڎZmV!ԭڮ~4JI}/l)?Ғ%gח&O>7`V:p    HիB4@ dʔIVȑ#u8wOA 5\ZgϞ$®          @ |nj#        @2 LTFƍ+GO,Py闲nԪ\~iJCD`ti0wCdP 'p{ҧJ.EFBo iRJ%9s-[R7P$ ")A)rTdefmP lgҥ^YO?I-ZxJSk  [ZZV_-P/%ݞsi 6 ћYi@@@@@@@@@@ Qݑ@@@@@@@@@` P+؏ $]vi>|x u+R *_>yst풵1tS[<)=t-k&tFH]`viSiV k]$?uT٤}MpGKKK+&xd2oH?^)٪ 9=͜)u%o]y%L!`[vg={_~[S&yfiHUJ]']%os ҩSRH@tt9-vѣرcoϾ .Ǐ?}Y}'E[ʽpcbb.D q-$~۶m]w|vߖitҝo-ӧw͔)l.(-;wn)Rwm[o 2:@@@@@@@@@@,.        ZuƎym(jw*~iݺJ&h}O#ЯoPի8 L;W*Z4TFXf͚ ꘛwt /n~u7!_J-nliH{wT).]0OG\wxg,8wo ײŎR@@X@ʓG*\8[@@K׾}te|iUۻ=:t_?5znzR^K/IJ}xpT,ԩ?K.V.& kYV:hP+ /pTkyk.vײwsNѝdP’byʕ+Q,%Kb!W )111ڻw,h-v5 c?%w*~.mQ]"-8}g}'P}ڵy+@@@@@@@@@F6"        j/c'0%4o\2dH\!WV'NHi&mtЕ|5A'Эt5RAu:tңJ+ED\ +QO?ǝCO`qsk7@^,h\9?6DXPl?X׽z5aÙ}矗X_j@p-[T\5@H…u&hG6Y`wBqF{ӦMN<bXEuYRlQ]-ɷ" SL28t/X˂zJ}ҤIgj"EThKb|5v47Ȕ)ʗ/ jݺu!         #@V8R         ZAxr $3fиqoҡR$ JN|ƌ~ArsRwI/3!ɠ'0_.}'?pڵW\ౌ/e$xg?P;d}#POȗ˜x@y{ ,š('楗-:y}XZ2 z-駥9 lYX瞂 \R`\5`KnƓسgVZDmڵþӦMB J rj_/mCA 2ŋ-kۂ߶o߮-[h}q xbѣG}K:/Yl)Q/½, .K͚5}Z}ɖ-/\lٲ.HqIXP,PkĈ23          .@VaƇ         P4<@F-ZЌJ͈wSf̙5kwKnL_Vjap#i/8&XCO 6Lw]Co|:~.kUŊEry\5ڴr{s4p ʕ%7>Lziihwo}KS).!U-?.:%-Y"M->+tgµ,`X* " @ XCP8NV^ŋkѢEj/Hk׮] sέZjNKB .;A fϟ?oW߾}=e!tZr~'m۶ͷm9 TTUcҥ@^Qvm:tgc          .@VaƇ         P4<@nݪٳg瞋QRrz&N$S^#`A1zIOsTڴi}5jϩZYʕ+=ZYd}n!         @ T        $fq .WJ`ʖ-n %JV&q>9b4d\T`s^yErPVޓ|Rj(xNz.'5V=p@̙SZˮ?^rQ+_nd.ի'Y۴Ii"9rH~(u(=T'e|Xj!N.\3fh5kk3*GywXiH@vwnݺ%{ƍxb8 ]nPϷ}{JϋC:w(ݢ          -#        @ X/0j(lRҥK|%a |U~cIݖ}:<~ %G..< u $u*-5o~ʔyC?)pheZ]Q?Hݗ]SdfͤW_N&OFi$^ժIg˽瞓i>@j"^QOgOi3[~T™ % U  @h XVr55GsPɓ'@)g=RBk۲eu>H`b|˝wy֭Ӝ9s|!xƍ/,n^ΐ!}RN-fߦFӴ         @o@@@@@@@@@ bbb7tؼyqx*tiiNuem[=PV. RBR.U`[z)Iȇ C ~ۤ۷owD `?7t ڻWnbXw,.7ɂ\n/P˝vRP cF$&{6M7IӦI.%ը!u.M$:  pjܗ,;Cr'3uȑ#]Xy}?zjug:0 i+A@%Ԯ];O/5~x]wu[oU9sT&MԷo_mܸ1U_vmZJHi@@@@@@@@@HI )         @ Ǟ'M`ʖ-͈O@R&k\vS/$-[&7>}aX{XhEڴmSo.]^Όcǎ7nwf%"0p@zѢEUO?I3Kn~-}\E:>L< *WNzmG)+~:iSOI&$aA[nz7IԠ=/;^z @ 9…i&w?~3?׮]tR{.0vΝ;\=F ddɢ[nE 傹jԨQ*Vn׳gO-_̜{yY}{qlG~=zF.8"0jǸ!C->+F"yg$wYٳ_~:zRNRjR׮wu/mZd͡b@H˖rS Çֲ{Zx;oyZz*Z%}X,)`[{vyHsՏ?}Ij޼5jnMvo(.O>)P7          e4@@@@@@@@(! Jh,Xp~m޼Y_~eH1r6l3Y#qtQҠAyOXBޓq]Ho;N*USOeɐ o͚5ݶp#b/u|RZ˅YD6,|oP PjMWOݐ>H\ם+BSNբE4p@s=] pWڶm[p *Z*E@@@@@@@@@$ P+6A@@@@@@@@noa, 4xW]ǸUNR|(1 4j$}}ޓ^xn\pL1P$Jg¡<#.QG-! R\/\Kԡ$\:y@}\rqWҊաTq*3܇Y҈uX^Ba"Р4`@d{/Y"}tmRٲ-H͚]^H<"͝[,b!  jm+ҭw&z饗tAkԣUre}\  ]Rg̘»gI&:f6lx@7niq)jnj          BZ        )`Z%P@@ճgOu҅@ށZU='YPPE3;ejA y,|騣"wcH*޶;jOOŘxƏ sΉ M$ժ%qtUیֵ4vl-%P_HtI-Q_B,|vhirE+k+WWO}ŋ߄5D@ ,P]dlYm5j7nK.u!k֭[<C@\o?{Zh=C>Xkںuk.sl?Cs)،L         Z)h.        $V@z&cm|.25j(gGݻ'Uk̂ 4c |>P?3hT,!*} T-[1g}뮻Λ~?~ƸHd].Ε<3& (ԣG aMt ߲E:4qcYش)yRժy_#F񳔬ǐ,ӗO=,l_KL(y6UbgynV/HἙ*L;N"[ T9 HZx&,8}dAKOXvjժKIi ^Ssʍ7ڹz ЉjC*Scaty~wܡ;]#:r栃?}&a8          jfd%@@@@@@@@@  g@tPu3hΜ9I۶mӬY_^JyF_zuu:ɥ|G'k׮/Ӹ7״iI/LtIzTÇ`sEEWD,D&0e'ؿJ)|2Q 7Zn&`7}J} AeְiKC;vlCNӗ7|Żl,P+ks)._yD>s\8{s,ckWii j~u.s?C8 4iX۫\9kHШ幬^M pҩJZ6:[r^OB>3y0(:wkOv\>䐢[F"j~g}ny}@M"ꦎJlH"^rA{o w}G6l*vݮǍ>ZO?tƽ+M jRIsl!%{.ZoBT}|jŲ@@@@@@@@@RZ@|4@@@@@@@@ #`ZvW2o X8Ց.a֭~AѬY]ho>cT)z:-]wUx ȜFaڸ \͘1#eN6/kYtN9j瞺o RYWAk6j̰ٟyFVɞ+W㋬n927J*wT^XeV2MV=:X{0u i^N:)vz ZIxNСCpzGNp\'( iJ.D9 _c$eM,-KN]X]-);>ꨣk]\OY4h >:uG͘>|u;j׮ GԹn5}t͜93cx~/YW~:²v]o#g'n6;RxHNDA U, ;?୶ΪǍ;N;cMJg\iU/1I8Ǵ~Asa(&L/mDϛCzsdŜ^p5l)}t4 {K֒[;@k޼yZ|nKtqrҬYrAҋ/FIeYfv3-?y]OW;jkW4u'ֻ\<x≉:X`N;4w^X|̣7d7n试˖-mu7l0uH /{nӦ=SAl۶;^2=          2j̦         h.UR_ Xǒs~޽KN~2ًe˖Gy~4~!C; /;Vzuz裏˰a馛޽{6{UL2EQذa^{5?]tG֭LJMcƌQ~dmVZi|QZXΝ3cZ\і.9\rrʕ䶝2&;vJ&My:7xÇ\x8pp 3?~X b[wyر '~,n] ۿި%0u"(ԩrr.og` ~zRP܎!d+MyEa ~z:h3dBZ{1~yڵhw ݐڥ#8"k팙ryabkv܊vߏ ;Nf|Ǻ+ta[~5F4ԗ]v;W<ߣ̙-m#k{oc/u<gqmۦI&y+cCr-{J^~ό3zz\ 矯~I#FpE^{G}ݍ/2?[J,k9gZ@o r?jJdT5K/QF۞          i+        q ={l:.:&L#Ǯ+\ocŷ6?;.v% ~z(E'znsϮ\puжm[ޅcg4,όo<8c6^ )ۑc= .|*)ݨc tѿT:(wrAAժUc]g]w6=OFe rTqիWsv嘽0j˱{6mr[;񾿟)2>ݫy}ê]po{ ^u?aÆ ˘.#G1 fΜpgg5k-Ӭ%mMNdo޼yЫW/=l4ۉ]/?c~K|-'Os9'p~q7w%̘RgEY )SREX犜8 (_7QThIY֣XBH}"f"    "toP68)-0{2Æ`ݐ(         D+#P+9E~` ,X1:8lO1{jYPVXH),a·uf 0+`~׻ugChXaX]gAp啑ZM탒ڿٖ%5}Xk@JYMF.ŎoiJvn}i=L% ɭe3fYeXr; ۹cK\矹oXQ.>.4)6=VP_:)%/6Gྺ\ Dbb;/p L.vs r<3$X`HA'PhL `r>aʒ~7tS,KUөS' ?~|Fg}vYNxH;q}ؽ;|O~z_ ~ߌ{;ٶ[o5cR G}1^g rF~rFY^gSmڴm5r Ԋ~7|k3:N0~aÆ32-z$Xjxd {6]L,u}Bx=axAuKڵkAgc '\.<4} d#soZ0(ly@@@@@M@d"]@mS+@@@@@@@@(JҊv駑rVW^F;tJ*iܹo3`/5kqZj֬YF%׉ 8P 6 Vƍ|JܳgOp%?={rSgͨqUÞywqr/eL:7xm/\GuA7Tv4x`?TT.Bʌ6,}m=\]tɶ(6qlRNA5upm;eȽVp1TVYfiȑ6lX8{K]/\grf:ˠA2bvE&ۿ%dz-Kj{,J,4o_i1;ysҎv ꩧr1L2E/iԹORٲr#ռyss=Oƴjʟ<#v~1AC_HKf_g?o__0Azq I ^OQu.\p?tEXA].ky?_:To3ΐԑRKwޑb&Y Ɋ+5jQ \!1 'Ngtaŷt]R^m^ ː!C˯Zvv.oÇ{.)Oco\8TF}vl2?vA}饗}ئ-Z.+6n_dx@IDAT^׈ue[P.37\ 'w}w>oۡ%8ꨣ;G,˗/'̛77 hbJ>_5m4~Sb-%xcǟ4}Ѷm[ڶm[!?k&p_oo@@@@@@@@ʔܢY2          lٲL[!Vsu [~njQthZpޡC?ʅxYgV,<ˊgE|cS<^-:|?X4z{킖_~>Z6l͙3Z/+ZU߿꫾Cg,c >}LcN6CfuF}k8[o:]b).Q%NW5|Zq@-+&IO2w9;?S|}qM.T|ᒻH9qD$p˂jԐڷn!(z2k%q#UΫ,6=PVu8wv]rJ?Iڵuwcǎ~f6<۵]vg}od[L=`l5W.%r@aP _5!`CyJU2 @@@@@@@@e 8=#         PeVwբE`Lm:ud /hF;>˨#|~zo\/ c=;Sr:,2u=ye˖o#//:U<h31p@7,H^?#yAJB{HymM4ב0TZdܡM1 A 9}orlX[aZ@@@@@@@@ PdY:         @ eʔW͚~a9>sUti͛G[֙uk% vxWW_efALpŒa@ׯ>:m0tPv 馛|=3~rcLT)wߙ6D _JF4?`w辷ľ/BҴ_|a-doPB!;d~e?*\E94-83{K3HxT%WqHRsmKt@:ytΝs)'^ҹF\vfΔ /-y"L矗IU,g j+vGP@WΥݩLҗ+>ܥ=d,ynoZ 3x݄iZ}>_H:ыȑ#g^VڵkwyGgU q'Dj?a'vXɾ4zvPO >{eOw)쾴Z~;e5Yx嗻oLe}JK,M> GbV R"k9O,DF':Co[Ga}֦MVj?EyCYVh E7g P+6ME@@@@@@@pAA@@@@@@@@8\MPV8f`}7o\r%{uQو#^zi: \U0hժU0wpdB͛7gp}zj:>O<2k|]>pW[: N9|0j^ wٷBrY*U nJ*ܡ3i 7/zh_oٲ%SNp 7$4q͚5 \ͅ^g \]A6Eb_.$P ~ce ;iDk4kgww\w6/P^ԩ/\E(M2˽o-_>pAApA0fL\d.ד *Vpƌ=vϓ }g`B@LvˎaV^@TT)8묳Tc^SwcT{СC6ϵoC6ݻ=C|6+4h.|ɘL>{5wН}}xwӦM~zf z뭌.]_|E{c-u>ɹ5:?ӜuaRھ{.4:hٲeбc/wz :|AnMqfqªos񿅸4]\8WpI'˖-uxmiy?ox>66zv Â?l]0`PfM?ݾ'>dGb ;c:_7>6{A U$Eu]+˻7e=07n S D'NLS3[w+B3֮|~y'6M ڶmFr(P0@@@@@pk]bg ={{aæ`.&5o(         :?.ٙ~% Nƍ\!:4[MlUFlvZp&5lPUTolmٮɌsM[Nsʌaظq\ȅ\\犙 ?7o\'r]9WtUWimy-u3}ѣ\,Y9tmzjUZ5Yg( gjzi:GfU~}ƹlqV sѳ:ڂrw۱>݋7э[Dy4E:?KE{wد_?oo}4*w.z Y [->7X=XJt00-U^]?\8Gj*߽k>\1܈KX˩(+#"xHy9D:p鮻qsJgyұǦvMǵcv6mBHqX' -P F     $Xuo7 S @~O\.ןMc@@@@@@@@@O`wZ.]+hd9\7oXf]vٲec Ӳ-Lʮs:{sU$ì3ݻg-tu^́ZY;gAcӲb:-l[{4DV:օ7Sw߅ݶ1s$-]taZ2ϏWw߭߅J@vSΜe zɎӧr;ݛezKgM\:ϮyXtrKzRr P)qQտb4y4q\d{:`P-;YxIrED@ 6 g Ӳ5w}1vFCkˋ/XTjb["*öX krmA`sэXzX֭[^q_~_v٠ALus'?G,%~-ܢ1c9d;r%{FWX^9iH_{fL(hb}т˗/[F2` &d/̋bˎ,{Yxݴi,{ܽku-$Xށ?@D&y].Ï%2g+j/HB4WJXh*@@@@@@@@db m#KG@@@@@@@@(+WNO?-׫r_o&v^a,^Xk.ٱꫯη-[;MQNн{LAQ9-P)wz)5c +ID9sϪJ*Kd K2aSL6-`ާ@.7aEC߶lI6ђ>6'B@@@@@@@J@^@@@@@@@@@ ˍ9*Ӯ[nEC Iz3F˗1SGsכi:Q=dA矗O>\*S94:Hwy=\Q?cyU(H7K+d U:;VKo+-::I駟^xx$K{7m6ߙva`rԼy5$8]uU9OPk׮UJ 8W1Nw,PB}]v֯_{%pt=>['ՃȅJpMWnCOpi]w\*)cKՓ };>رcg}A9,iK 0`n2r9袋.R߾}sp*TB]jv qGl wA]۽obYJ~Yg{uaGI%KW^ы/?v/'Ա~A 3j=S>(iA *E"@dMJo@Vjm3Z       '@VmS@@@@@@@@HKƍNJuK֕zԭ[;جQsWJD`j d*Ow}Զm[}wP˥. @ -=.9{P5j:ի?q>S|\gRӦO8R^RLQ/i:3]R!RȀf{o#CJo!=ル]Rcu PX˅PI} ײ_! g=;LZK-k֬-@q`P@^B{O:^z%=np ڧ'>K$ɮK JUBnrظq=Y?w\3]#ӧ3<{M{G1jmv'׾}8j`T\ %JԊe XݧZh)       @]5 @@@@@@@@@?5ydxVQF:ֱ=9Z]uH}]YgIp^!L J#h%wHіׯu 'd3 *U=)g՚5ϧ뢋.ғO>IVRnmTn\"m҃Jt`3h,`zdoSHrN+}t$eh-WzP#޽{v5k$X@BB5cF.hwf̘3gi„ jٲOﯗ_~Y{5Zj~Ul) O*&\vz-]x.`y_x֥-y%=L֪A[MVd~Dʬ\ ,@ /8Iغua         @ %Fς@@@@@@@@@H^7|wգGmd²,l%nҸjhQQ @ 4ot啀 /A~\ҰaFZqi&wq ,ī9sF QAκN4Y[?{Ǔpd, O"K/8]Z YPttK lnv1WҲe /Hvbϝ:IիKݺ}Uի7x#US @X{s=ueiZdn6[N\pj׮BŚ/믿+V;@ X_s5>A[w\]rW;pouM7I&%Ѯ];J|+}. 2[[QHvO1tRJ>e˖~tП>k"85|}Wj/ŝeU\{) DnӦ쳛 VX9s@Th3m,@EnZf; *_>0!iS26&`Zer?        PIe         nX'Q|L1,WH}u7j=cK>)$ gHK^tͣA9Lq)}JҫW|rISy}}رj%*4ld!lIMJ< ڶC.ȥQHB똽y@O>lҶme XhVB ;<߿,Z@ -0~Զ\LJ ʻDW^y_yO?Ռ3뵃;ln6k?ڵk+@I ZJ}tozj+W9wZj8 eC3,owA~5*Iv] jeF&P+W%'ms7,@        Prj=KF@@@@@@@@@ )FN:Iܨ-t>_3-PM`lw1cJۚ"pUҒ%unx뭷\OSկ_?!H5>,P;qXD XЬYH]J]$q\@BdI~~iMHpY 1fi5}?}TB$D% :`NӚU裏ȑ# J )  0&^uUذaCB{lݺU?/R_}k5۲e5k`- orիH@wjΜ9?hjAZ/SNjҤҐ[h?c.lٲjݺMs9']V" CVf%Gٸ1yG˲ y;Z]       ZũͲ@@@@@@@@@Hr 6w=ܓ-MX!rtr%í#u>R"Wdc4 L$YpK{QRssO?=a;WXQ}UTu.w4ԠAR5$@r?]xa$tͥ+wܞ`2Ь4pV:V_#ĉ뮓U e€-;-Lݻ:,pY;sab^@"pP7"<ͫN>G\| jd_y^g}{.{2eʤWZtR͛7O?-nb>g#<҇h5nݿ*7ڵkiK~R֛@[y۶kTDA vQr?SRH`;6ME@@@@@@@ P+-7++         @|ǏwzmPϞ=㫠uMRWdžƍrFbY`2it^_-֬ z gJZG qI? *jq{~OuhqKo GJՔ3ϔlq@jZ:4n8M<׷+biu~nٳ غw.Z.@6uʕѣu:!;͚Kbjժ#8?W%{>HhK8sL Z~ԎӞ{ \2p0 -@2 lݺUK,i…Z`1ߥ\ {l讔w7mp:%Z֮vZKu뭷j\vR,})JD`Ӧs%R@e)vba@@@@@@@@ PY2         I'`mu[ϓnMA?,=CR*-:f"P+6ᇥʕ3Hue SO˥u$O)#[o[jF] .*~vƎ%P+6N 4-!Cֹss\R48@EI%}?[g-m,5iO9o^{9r$ZyA1(! : -!;˂r] ЯMI  t ǏE`L2Sزp- m#|]n],쒅)$PB,,k~~^hѲ/;tłm_@K-ZZڂ,8`7P6mg}ڴiիW14W/j@-GA JMv.m@@@@@@@@ PY2         I%eY_TJ *שdZvA{ooNu.KW PΓc= ${cI"ΔL-- qcIhǏv~x~KN=zH T)ׅzU2SS͚EBW ,m_jy5q~d'JÆI6_;Ghò޽{SOղe|8dG(ի?,ԈX:tbE^pŒٰӧ^1v[T2KEwCŒveU?s/ r?|rsKfz]6I͚53\"kWfm!Yc=P 2Ûvi'5nXSN%P+6*tNuHt@-6-K}E!`IJ y2)h*       @(-דB@@@@@@@@@|&O+Wb>NYGK::}&MY )4xpi`U`i#dm'.`\Ϙ1C\rI]: 0={rE(мWKg%\+=TZ.H2 %-4iR$\'nV:u'`k#+ѽ{wR_{5 4(2@J\-̣Ko CIY~}m2 ZdI#kgnD Nl-X+|ԨQÿ^a>Wu*U槔]vx[=Ak{b ^Æoݺ5Swqnj5 ckԨ;Vn]c]w%,+\ߴoj%fjLk@͑jc«pKwMѲvl@@@@@@@@7JΞ%#         TGV-{&U1\#l)tR[ڴ9O#nߺF-`A06HÇzֿ{~;wշj-v=aU&eEjIZIcJj%&JF, &\ '5k&=Աcʬ E uHyXsDµ&N^"0\:w>V#],Z TJ`ܸ}0DIq å%#qƌp- sə}F8ӪU/r,Lr.Tvi'l![6,G%iM+V .M|Nҏ7m$s73X~֭[u,<+-D.M0 ϵE=j׮->@'y@2r߫^% %`å;TSRH@X4@@@@@@@V@ݴ          X'o.gbJ}d OF&?G:Q aS/ (e? !Jj ?^mڴQjŋ H@-#l P(.]o ?\Hx0 PO?sΑ6or.wשtua۠ PJX÷B]LYӟ+WP6, g({XhLR,* *W~n&چŶ~G2. u-g.&Ҫ9|-<9^~ [e $L6l胲,,+-{mKI]v}jƌԩS-U>9:}p_]K.U^MАCΝ#eA~+n_̕ÇK>[2, M:ZҲ6u$tu-T 6)+]2$xزeR6F;KcD /Lz= RlEh.E$ 5]Yu4=eqz8Q/"% V:7.Q- @6ᅲ. 96d0~tRYzw`{qF*{l-aʔݹQ>#* )r ̲m!\A]0+ ˗/}ffY_0 ΪXbFCA W:u*Z!J=Zl0P}RHz rsEεRhT@@@@@@@HKPZnVV @@@@@@@@@ w}ulRNV5o.ZIRQJ&#~f!AE("t1e#e$0'nARE:Hl6@4nTz$[=b-3fH^*]{;\lL@ o^Q,RvKG˔!P+zKD_ԊVu =u. fO         @ ?          @i@N83h]m 4[Nj8ioJODBN=Ԭ2+~+uH{ Ə5k60,d%4ݥcKÚ-`~*'yfzuq!ZkGzJZ@3'rbǤC¡#A1BZ4֏" R.ۧBkiciX\:Hחv ֿkNӧO׶mJ*$P+vY7مw)PvmrV,_\r9d(        @Z,,@@@@@@@@@9s~g+%_~=i4 M *bjְugK;쐚@O ϗ bL+-k4i$q.*eߥZJԣ-^^@IDATkZtoK&H$}I񶁥!+ ,lhX! ]p4~n]IKwޑ֭K嵥 @ XH[m'`,2^xAn`<!о}{ZJfJb-2 m>~D6oÔ$|$΃         @ȫW&M䯢Zڂ:vN=5+mZoDapiŊ*M{pSrpvޭ']vݺuRŊ6Zh tWp-5ZQ/)PԬtᰗ !Zg!#u"+'n-=`8s_`@ z9zmP3psHK=]K-S&Mҿ<ؽZs@B>^WT)iiǎcR>^!       q P+4         @nݺ@AV`2n4eԷodhZ7J˗G>jI_:t9&qLO[`Z;Cj05nKDۺukT֯*UJf׭xqm[iĈ?R%@6m871@ɒ=T8n7p0r ҹJ+WJ6kE`0E |,2NB\z%QصKKAtꩧ>X0Z`-JBgD K{eK{I|=` qIxF@@@@@@@"@V\i@@@@@@@@@`,^Xgv)9xӥfr4{3Y9sKJGKW]Z&JJIWb^f._#pa}O[NX1v.]1c;u YXL3!Hwݵ*SFY@:&&U$uh=*WһJ?/,keZm۶n$+[YgI[Ht,,H9/@]:iǎ$[IV8 ԭ+# &5o.wteR^pttaG,0qq#0h>nzgff&#ܥ.[,25W@ )p~G0G .!       T@r         @\RBlVl_ A_ZPz >G´lVZ姚,@ҥ\Fޚ5믇7OUf"pҬYRɒ'K X~v YK/IUHO?-5n,U,!ticj _eF A?~xP{I@q؝XbZ`}Sx@{ѣ@E8O@@@@@@@@b&@V̨i@@@@@@@@@` p Vձf=h"  ;#_75OoFU+x}G'`@}J> [„ :#TfͨRRQ:ڠvN?^VM*B lX y4qԧOx߻DȪ h RiijipȲ.tdڵn6m 9@ ? Zc `~HmƬYB -Z P+[(o+X@rjuJ;LVзT~V"E@@@@@@@HRtòZ         d'']v.#Œ1d oL?$ {%kJ#GJ_% :]t݉gzjj*1?mR#PkVɝ&+Jl6 +eʄh *$=ҸqI'I3fU=Sȋ nn*}d׉_~)4}zbESޝXV"5m>| C:l;OyF Ԛ;w {%5 㱿G@->.]tiܹ{I/3        ( U@@@@@@@@@ȹ;4j(u- 𜯼")"]vYt=V*VL3':Skp J;/8}'+һJO=%/ɲ]bԩS}{Xddz=,(sޒ~-<_f(jemȔq4{tiߡЁmYMw{@ѢR۶#H|#['ԠA2.˗|<4o^;C @,hhGT"vֽtқoJPy )Sp fK ڳ'z>&Mh ؽ2]vy ZE@@@@@@@|| @@@@@@@@@H!ѣGkK8Sh68kUWI 'P+o[(p . (Zr& xK-g@u5kYR|=w@vN#H۷K>b+;eʔjJ."i#eΥK'N%@ٲҠASOI{ڇ9dHA,)u,=d VITR&R᠐W_. N ڵ҄ RebtyR'F%@- aI^?>)V(+QH2 1 P+fnh_I}j囒 @@@@@@@@| />F@@@@@@@@@ >s1_~u>=~%Nӣ߰jY3'̟%0fdQ\$*VL/_+W$PMR4`TdӗP(yx@<fΔ,@? m#@vժyGZ:|]xH7$yTt СP@h "-f;ԍ@NìsZ!w@UVդI}USf,O>Ȋ(mAfb([Vڴ)@+Y ZE킈        7FO         GuU|@bi 90iشG+@Mb.!QT 1d:u Qu4iA{~N?^ ޞXHQ?5xMBx~篼"}eH ; [n>LڰA;VߤiӤϗ*TN;MW.$!Zen@`Gô}Sx@|y$haZvFAZhAVL 3ݛ?aV"-U*\ٖ-@rƍQl#&c[9!"JE        @y@c@@@@@@@@@U`…?>Z9؀J`a{`r Ҝ9j#}4ttEIQ;dP-IӧO%KFm WkWԚlŝ;K}H ޽?pOy@~A۵_vei#=4cvm8~}魷-奮] "&I`zix{D5}Mfѣ% Or@ȡ@Kw8yd2pyf ݗ"Pk6τW([Vڴ)}wa *V        q P+@@@@@@@@@U\95o<&d[&!g*jJ:m. nMj8|l8-7ߨI&Q] ?Pk6ʟxB][*Th_KWK{;73Z-d6@ *T_[Ғ%O?I>~cB:R͚ҕWJ| Y0N^sի'}e^fHd"E.]y-{,[&]xa^ƍ7&ZFK۸q~$fJ =) xrG$Z$ *^xt"       I*@VnXV @@@@@@@@@FN:`M泿fϖf͒.,$5a%Վ]kJIUĮMZB Q=,@SyoV'|rTWԷQEJI_JMx "78Rة~f={W_Fgi"-pKv<7id+זzI+˝'Hw%IXbԾԧ}{NbH;Y*Y2ֆuHd =|Z5ɂ$) ; y1iҤ-܁k} ~Z"P\x%/[+C@@@@@@@@ W$_SV@@@@@@@@@5qD}).TԲeFr ڵ+~ux%ӳ) 7nԽ{rkO0{[t'CV _ծm6l3!Te=۴)=_Z        @|?          @*|gjv1V7hA!Hܒ*`:R"0 \ H`pŒu PJ ܪ 7*V p)Q,6hkFe;AXl4XSN9Tsߩ~].ܹ{޽{ 9"GhѢ޳mrʩbŊP\8/^<IY( Ԭ)tS~4l4h4z׬񏐞~nݚ}l>a^7dN:l!._gYagߩwȾcu%T%/k@ zhZĿ=;ᇥ[oV8#h^VMڳG;6|-cf6p-k\+wm&n[(ضma@{1.sVCwڎQg#X?\ʧcǻD+o w.H]_^}U}cSׁ5G -Z$y:eZ,x|_X=L Z8t @@@@@@@RJ@ܬ,         @* 1B6xbٲeS!u޽53؀5gtE GR۶?P^@).2P+Mq$]3faÆn{#RQn$կ\Rgvs?jɒ%Zxs  *P`}eUB{ m~~kYJuQޣv<tGv 7/o07Vۧ6Qx7mڔ]o[nvvmc\;ux{y>maU>`9~7xNd ŵo,&baA3K֡.ek{݉ٳPHd(;/}--_P-+4t{R#8nݺaB{ݝd|رBX]t;vdxqv\Bl^?!d{ ݲ2-Îsv-p`^[>@@@@@@@@ Q@@@@@@@@@@ lP>LsOjwvwUyg( LѮ]FEI)_ 87V;VSFb.{ƅĤ4m6}ך8q&MYfyָ 2}KYg]y:ü`Siә*^<] Xf?0@p `͛e˖:a0('V^vZ~1cYU,*c(RFtQK݀|3U.X4Uc´%Bf,p֭[3}XȘ=1{6gslzFcۡµa3+WN{ZU}n!:*`'w%*5j\@\ԁ .9?GnY.Hׯ_YZVѾ673q( g lQB18+a g c[01 Ұc o1Ύiv|^`^}4v;'Knwx]H=! f͚yv /E% A&lZfjsЫlb:` ص6׻F@@@@@@@RC@ά%         @ L2l!(Y 1]Y) H=V?Ç餓TbŴ0'?b?7csD㫅j3da>˖-~ŶlYYP=,]fMY خةSѸqaZ~?oM޳ ̲p&+e0>b&MxAKc7B׵`c\PBf/(},$oȑ޴=~€,}G" Ρ K 5+g-e-^=+6 ~'p´c'-/JR5{B쵅dQ'`K~@3ʮXL!~;/Ԏ}eKfcL;cek>.;O0@:8aÆڵcAI5kS!v\p,{4O3YS P!ۧl _x6o-ix Ñ?[a4QƎ y5{qPڵ[xVZc.[ W0%²rn9-˪Owov,5{.w-juپ`-uQѢEϣ(＀b#TAl{eك$ȵjٽ`Jb ,(;1{^rjhXf Ѩ:#)}v2Lp$M @@@@@@@ȋ //j,         @ /&PcUto8cvxn`q@*AA .?.Yf7ǥyj{1e6iҤ\9s 맏> 5%fZV2 ?O-Z 'xBgqgLuYrfϞsj޼yԖ-[>z^8{m `D k, XH+8S>Ob^w|K95kVP7wqiA4h/unF /a(} ZSU^UR؅tYԻ^x&QRKpqȎEڵ;`׭[fc޽{5L!/DЎg֨Q#tIlɮ ovj3T@?,]|\@tՙ‡  Բ`)SSNE)N2=?gvժ]"u  ʉSٶm        WZ(          ~l4!RR.Y) bD^O[5"_75"J?/=Ttvs3=~5`5f+_rt'7T=\ȇm8KZ[>LO=:t{޽{ m,Bg-oB̙ 6xZؑ5kL]v֭녘1j޼Y*w+V=2 ڸq@cFkɒ%.(RJy Fc!4(hnܶUV [7_+W~Kgi5*Zt p)ۯ?xN՝%]R%Nۯ]vy߻tqѿ;ýY&Mf;>bg?0@rYrb*}tyra|ҋ/ƴiC ex'tw[`n˶ Xލ^=c^ X!p ,PDh        Y@8oG@@@@@@@@@ #GTS"P"?,u,+Z"elJ ÆI]+@^ᇥ2enHUa . "7֬ T[@OMfpwhj׮Ǝ6mʄ](Ɍ=fϞ{ {'կ_W]lk1m4}wQ-Xyn$ G v_-P\9/&c͛eADcpp([l´,h,$kז7(-`!FӧOׄ 4qDBۊ c;.v^׫WOl Q? Gn:/r֬Y^+" =ĥ>>ټyslRZr$ZSzR̋@dZZ"|/4e#VԂ@Zhjg(OZ~jZ.v߂; K       W_ZG@@@@@@@@@ ۷oտo };X z`C&1z7Rn_z\˗Kny=Txrkn7ETn'DjK*ETm8s{9//Йg%Sc jۼ1 5;'Mrsb,$fҤIZFW.F6 ꪫ\HI^11(4uҥKewa… oI'^\uꩧu^Mƍ Ky޽^(ј1cd.EgǎYCiӦ^3)[[:t=q v<~|MܹSGyj /a:Λ:~ ޽ YN"E2_ >&LXH"cVr(iFس Q@`.IaÆÂp1Ղh{9/ή!qg}^5.+W`wGiG]juA>}C Wi{0I&3wqn߃|ЅWѹ瞫o:]KUx.gO& pr%:LصKK@ZC$P+1߻gOb=KFF reޔ` C@@@@@@@@ uIUeM@@@@@@@@@H= ԲA)Y !#uKF Ԫ[nWe觟b׬ ^ٱcG/iҤIj۶mOl߱* iݺVZ`{NwǕ+Wz0k׮u_gm8:tŋ[^d {QLc5 u'N -De˖ vZX(_'E:s#{By˖-K5L7aC J=zD>jA ;A~W^6nn#@,PkÆ {J P+mvQ/d>O@ __`׮]%J        'O         D[:tu#R.] `gOܺ@ù1cw\ȧ˖vX|V !r%PAi\Ɏy.={KթS'MT+VѣUdIuY^b^7|WgyF^zVX./#P؍]< 8 ׺'#B?~-8tIe@vyɶr&pG롇[_{5M6MAM*@IDATs.r-_cS g\פ:uε=:d_.A"ElXLE8qbZ/l܇O%PTn]Eo ςW        @         @>sp ZjjO*-PC`{A[+TJ s|ԶTAfbx9Ɏ^ኩ. .TʕULDSn5p]L'0c p :묳}SK.ٳnf/5|e˖ζ^0?ӧ{s^sFRF[o 8*~_p"in?C>8 uQY_}N^zɅBThJLcǘǵ1;ך/۷o_w1۷KJW\隩|RTغU_JLO]Feq*mrVM CoawZn:JC /m`a<˗/w .]!믿V&MT¥իW Z 矲7|`@SBsDbΟ? ceNc=9sȮnA]ڵkUVj޼,\{)oԨLfZp|{[-8k8ѻwoٳ'݊HI۶ɭSDpY$NOM,gcPYf*T&MVi*e"v?e=ɓ'kĈyޯ'O lc.߷9?`Ww}ZTUR7 5jYxb-]Th@Db@@@@@@@YY[uC@@@@@@@@HI~SOIԩjm0[jŁ=OMN.xu.;@qO5IC2\d.&*W^щ.mW}vNs_Ç (.5kT/Gд./~X3I ,+Ruԑd/J ӻzqg05lPׯתU4tPK9rdzt`ŋўyS3ISN'%~g<*, B݇^>[\9UQY \)!u&v[1b,PdI/@G9{Tzuvajٲի8~=Zܫ][E {z]r%uwjvmХY8;$usT_;t穞h/tM7yZ\sMx~VR"^7"       N!;/F@@@@@@@@@ 6 ؼy5;V:heGXLΝ"K`A,cO=%]uTBlڤ,ZowSn ^k0]tQ+OZ}w2֫W/YJ>Jeݺu.l]veׯ (66 s$e^tJ~E:+7muސK3-|Xb^Y7TѱcG}~WS޽cY:v'zg[ĺ'u z-n>K E]qED2{.WIo$ @Zh!!r?P먣R5ѨQdɒ\&' lHj}7n/A'QlYz~7yN0 rGs]2}Vf [lQ%mI        1(6h@@@@@@@@@b(矫M6*RH [M,Pm`,N8!}MYVVR`@ij[b*mAlxj5l()M,իYs纰:3"[_YX=~WtIULٳGvkKyY_^}U[Wo\sA~թS'tMڱcﯯZ۷ow'O>.dѥ,rz?zӘ1cK.gA9h Hںuk*TXGYw,SNUZUO>d>j΢G}M6գյkWuA M{ʥ;=z-̶wm\JO?SN9E=J*M9s>c}Ν@D.bolu䦭{ŋu'jy ̯VZ޵ڵkުUtu,(s Ut# *}Yln߉$WʕϒӧOϗ @}O?ՀdO zQK7jHOY{իW /o,ˎ/9)|A~gjVQ`m <'xBvci*/^\>_nwڳgOo^þꪫ/_{sv#P~iGi3͛+'1 @@@@@@@@ {(         G7sRJy\-yeʴ 9_ ܽ{w -P¡Y)vB Ag J^|1TP^PwTZkp2!?B&M?s6%Di*X` ސ @\p m۶-\m܀{7ph `꽮SN -װaojРAm۶9sxABC.'mdU6Gk\UhѢ{ZhQLfҷo.`!7jhX4eʔPC.L*Bڵ , 7xcȅynЅ^jժdɒ_~ś T:c~4{ꩧz˸5w}s|Ȧr!`Z݃Ϲi˶$6 ׿>(Q"Wo͚5!7`W:4nܸ}f-*T>rz}{B{p*=AmՎn@j>7vdۅ^~ɓC~W 7NΝ;~L81C.T9dɒ,ef̘9͞=;m!`jDuެ(|+Rpo cBߢPȝS;︤Qk@ vb%.|%5x,_%jҚv!=#^ o۽??tiy:무6}=iݖߞS|N߹ #}/쾅Ҿ}{{\Q!jz\(W 8곶~gLlr^z˰{+V8=$X=3B! ժ/믿׹۽}Ty3fuhG`K[nk5ڽiӦ5r} Xv'Ί J@mu[zgn{iٲe[ߟrʥM{6c ^}LGA ps Ny% oFw\c"o wܡs7ސ$ԫBhӦMr d֭[ .BzjW\ v*7iLnS,yt/V%7jN|]\\x6sAV<ם+~*VK7\؞K-.]gyy_ (g-ٺq 6HNt뭷z);X%npb.@;L|7a͉'-Z}v|ra馛rxLwarAm5kVLKF{5m40:1͔}[<>fr7 x~]j CH'Ct#Nt-RIzI#`!jRnCfxE wzdrʅ]g}:swy\\~τ dI/2v>'˅?}ckر= K^\p꫽jkOv1_.Hv9Gݧv܍}mzv@V;s}r!^S}ފkgg?}xV{b%?_,;g         @         DJ`̘1:##Ug23nRժ_;7 ~?S6\  {,l,B}";>PRO,gU$łfݫs=<9:va޳ :lJ6=@fo?իW~PJ, z9e˼e߿:4}t/\ț{FÆ nᆴzJF>l`Z h5,^˗oXQ-_YJdGN眴{yt))Y]oBEzڴ)SdljN_ʔ)mmP!.?N;\wuޱޱcWGVK/^ɶ=-/?,@~s|p]* 7#' Xݎ޵+СCIӗ;zoLS/>{meŊsNcz衺 e',ˎ'ZgfGk֬ٽT vJNG1CV i@@@@@@@ȁ@_`FfA@@@@@@@@@ XV8pdA܉6o j+NM*8w̝Soi6,;ߞkB*`KƓy75n,$}En<\Bƍ{Ϙ˩ , :cƌǏnEnjlӗ>A?mpM?BԴiSO?=d_`eDiYdɒ#QDSyQ 0nݺݾ}A{yK\\x jJ~*~925o -}nǗcr:T7͛7T&e_W Ow_ڱd֬YޱĦJV{oFod ]۶m>3op=z $;̜9[O<1] L,nڴiON;qHN8>;?qVܫիW{he\Aty 7.D{˝?ȝt < ԲH7z ؽ 4r5hر޵ =K͑ g ܿ#{8s"QAP FĈY1+s:339xg&" Xrֿ^v 3g~4saϽmj^xְaü~<^Qn Sw^C*<qB* J,P_9[ZRUɎV$ü->]qܛ,tB*{NM6ՓO>vy~JVԺѪLx{wL1zFb3gɚe頃eD6p~[ +oV׫W ;w~|!XM4|iNb6u޲vy֭2߷p# TVV-/8B6lPU$mM6+~e>_l}6-[A`m8pF b}gr._?`͖WҀ6xmς yV5S\m *: /YBvmdU1=%+np@)wr|*ǨW"[@b=#s0^{{QN-M kCǼ;zK= AZ;̤I\֍~^d6rSOmZd:]; DZedq@@@@@@@@ j%U!         N/ ӧO:-L©s 4{6ZYi+HCT pjѢE sҗ_J˷Ƿԩlۏ?(lw{o;vZa̷KCS&jժ從祸y2_}UeL" Jt0O 6vw߭+LVZE]Nm?XdIϼ?p;^A.i~Wη8_/_ lxJq~@ $VXѫbH%mZ9B1mzs_,6 oo_fzPl8s /P *a_A?|}j֬YL~7qc+[;x&Mjnqq8>Jq|̿%{dajp=x'n_RrɯKo_+No;, q)>ezՋj-[5k֔jYPl߱4k\Ps횄]$!VZ>om꫽%TRx=vh~5.Mo=ӻ-?z O">aAZ'x:ŀ4rH:Êioyׂ7n?޵w}Wx[y/'#       I(uj@@@@@@@@@H ob5l0q$7^+moNilkRy?r{ȶt<\`tq騝:"0g5o<?ڌK\sʻQG Jw@o_~^u'ngΜꢞnm GyP%O`0{ʱ}z]p7,LBY^vI 6o[ JJT c|`&?ahuͷ-,Wugv֯lnA&MKCmfAbVI}Jq] ye. llmkFӧO׋/gzС`y.nq~~ؓ=Yw{ъKYKj޼yevb>3g}dVSO=UիW%S~'[e(yKImK.d{aiFݻwVW`jҤ,-bPժUu-N&kݷׂRz)Ν;YnGJP4 ~,c^ɿW㣿D㏲38CNYOA v*R餓/NY@wj9QUeuX0E]XxqtdA;;7o yorrE$smUkv-ԮkT޻eav$-P`r?Ի\C*?4l.v\?Kwz =î5wy'fĈovJa}ӿ8}XUN/N憽m[ o{ml>b}y UV%{ M        @f lDA@@@@@@@@R #n0R.b`{ ^:E:u(t]v%rWgicqE">l> 6Hcǂ XԮ_7k <ia%sՅبx~;6moժUO?Ag#nPЈ 0^k׮]xup LPB8w"ႭrewBj#m۶oŭ7w1Yvm䬳Ίl2".'2dȐ agqNab_ s7.œ" Z5%fQ掳#G}}衇Fƌr7Ыn=zD\]ą(E `q׮]#nȲeJjzq~ׯc.--ZHn"WM".,ҡC kۅ^q_1+LÇ/]PWmڰaCąy"n`M]VmbL֭[{nVɶE.Hj"ofTh/(Q^=34|.œŽmuG-Ώc|`iד..b.H+qD6eSƝvcrʪ,ӧ=Hd,4D >~69RN/j]a]хG+;q"e3)Vq+{B^}@wȮ阥=#FFvao]~{^zޭ]kFk^{qs؂]CWA l)t-ι9FPAzt W$ Vث<@|P&i\nĭ5K`ժUU}@4 .N$ծ&P-^X&L6a+?paCr ݖunQZr\he]e˻p͚5K.K+V,tIJ/HG7`@rrre =]WRW35e9H4qܹU!.hI.G?vid?͛+nСgPו]7^}ͻXuY~t,;(2իW{iJj@I9lD^C*=Žs윜fv]Zdk zanI] \tmqsg*NYTR /c}އ]/YG-CxEꫯ.,@eKO@@@@@ ѿ r;i CrZ Cb2+         T?g}`4k|ii=ўX[.|[iTH](KgIV6n}kjXLPQGI'tkt <4WZVk,X,C-qJ'tR|6`.vRbAQ;̀I.w68짟~*|K.qǺuw̝'Uw,LˊWlW7L)xDyiCc[a0-{m*X ?TLmgysؠ;s1sG_M5k6r6g}(QuJf~zWxdﭔ4 +С *yS%6,їz(?Q[USsl/ro#FO>8 X`~8]MB+Xe P5΂mQmvWĊ6_QQʕ+ :@@@@@@@@ 1j%Ƒ          VO>Dz?LkC^+ݺg'YD`,i4fdtE:Kty1.֕@;o׍7;IQ uu]WbmRt2} 4#/O/rU?۬,O5Js: PKa25j'iB.2/짮}p|,z과xca}LsM&LnN^3fN]z6Kw/`=z:w({jD[ ObJR>}tq?jݮ O>YvR@'BԨrj׮Ln)pqAb%P+ @@@@@@@(Zc1@@@@@@@@@$`{AjR 7Ҏ;Js<.ni iZ(0id;'Vxh`Q۶pd%i_4qM@q裏Ή[yTJil֪-7~{=[_Hý ^/8]qm`&MUhYg|_ɬs.q oO \SxWljSB-Z-j_|Qm]y~{Up3I픶?17"3ï4uTp 2eJN`[ܗW_}UzxdǤtq| gyQ;ni'A=>D3/GeYMV,kHa Բ̈-ZYBI :}4fVǤ]v  mhx,X@/ \JB<1BZ l= ؀½z _BVj׮K/T?^Ǹ_~e-[,%ͮ[Nj=Tv#ݦv]TBMvZYx woҤ=Xwߤz v[ JSm8p&N"6j ڲ+GA 8>BTsrr}Gm۶ջᆱ믿^C=1aZ=Tts"2nҿ%5hU@Ϟ=U]3fLZCv nÆ,hn@-@olkҥK.׫W/ۺN@@@@@@@@@ B@@@@@@@@@]%z-RE7u\%@SJ:A4%,'WB2kt .LJxR;\7_+}':կ_?/ d-g={aeAe=R!,T_W 6zdo?}ݚ.7[E`zGta:~soz",,fl_pB@IDAT]wݥ7ok}Gڸqc:HU8/Ђt &~)|3]>NL}I{Iw)=ԭ[ZA :=zdu&X~$Pxw'PxZ\6 [֪U0H@m        8 @@@@@@@@@ n$.c+;'T`Z?UR@wfI;baA Fav3b\2^„h,-[J' UZ̽nMW\qR a( |.~mzgTrb *UR>}_Ռ34dm޼Yc߯6(dG&/GOnj;;7[: wN<,D^PBSO.@U[ eXF}$m+YR5,Yut؛haCƹuﷴuP@ok\m8c!,[L+VT͚5(Z       d@,;]G@@@@@@@@@ 68 Խ{%@Ν]K2!b4Դiaͱ T@\+0r4}4|xK2& X Fcv[7i}CH^{x:裏뗼JCfk?0гjԨQH{S|-l`܇|n+]⛅puv'{k׮^0 JA `sv,5a}7@WϞ=5x`~c=A3!԰aCvidj|g+un.uǂz#wm7v?݅;7NGoպuk/0sn3N\0%,pyr!rR*% N;ܸqYjJR6mL#ʕ#Pˑ.L?/tRY@3@@@@@@@@ _0@@@@@@@@@@TeP2 y,H ԲjE%i.H˧Ԟ= $!sHXFlҤI pk8":fIZR ~Y`F|^pl4(+D-d_W=4j(1wm68﮻M]tٳgkW_iذa^P `v%w{ܠAv!Pʕ+5uT7h;oZj*Q;u>l^idJv TPnYؚgM7$@jժq»-|Ў܉)k Bosrr4i$/,H>˻/OZ\B]U-䴷{ߦ)4 <"JZ34Pƌ~Cٿyy1j߶T#Z%k~իK5kJj~,FR^f5@@@@@@@@ BlB@@@@@@@@@ _|.D6ַekm'ծ o#SZr!4~>Pz͠SR6nS~l]\{';'\x^W\N8A*UJvH$#FhСOnyZ Lِ-[&c駟da!do,Y5s;wձcGK)v4ྶ4:k,q³:wN;M{tC P- ,TBmb/>hAO=֭[lپ 46lm Oxk޼w<;P@ eI |.OQ} @S`X+cIŹ0#@(|pѡl{65ھֹL\J1k=Ki@--EK $5h         ^         @HOk} iR3kO]ɨ1uhMH6 ѩR !?/Rؐ!Am^RS~.mO?‘^ 4HuI'ORӒb/7#GQB/0BlܹsKd!E&3l0ZʛK8m׮]ivP6md!\600 ,ZH3g&{\^bAH;S:t3< Ѳ =˺wywl3 6mڤS1,/^^^|'H[KE<'''xZH w.+V«wA/"/(k׮ny7  !}v` )P$Src1` #SokH7p7;V|۽?\xg/<)-ŋkϽ - hذt7_~G֢E o۷oe7M D1cb!5yd/X?rYA4i$>jAI͚5SӦM~ƍٞE4|v[,t?ȝf=kԨ:dCYЎ;:DL86Ҏ_6dIyʲerWwy! ,ȝf͚qvl􏏄nrE؎o1͎g8id=| 4 kdh=O(`b7w˽wSNIzY[v \{rRݺwz@ 뮪]w@ J}Ai{HUںKKjo-@@@@@@@@bG@@@@@@@@@@ _~N>䐶>Ͷ@]vImɨ5+DZ2c[0 Zy1W|O?-#r̝NaN:lI'IW\!|TJݫW/裏=^xmܸ tۥYP mSzիW~'zYNf,ԩSN:]Hّٳ'AiJ[+0 @b#s& ڥX0|~-DƂ,\˿ l>`Q#`X+V kjO؂Lrrr[{bm? JСno K^d@]b6,oydv;ՍtGyty(gAFE;6dFXZU sL;~d3c}>vߎ~H>cx5 I,; %BÆI<"U䯆5tK/}'N-(ROu1chE kE)^~|CVR@5zK]L        @@@@@@@@@@l3fh}il駟$bZ6F:ufIk˅W 4<.O HW@H*`a5k U=HKCJ7ܐV-oYk֬e!襷vc3hB;v;BXXR뿂!,<>J[,),bPEl6mfΜ) Uea_Xh6M4)7Ɏ-Xb#d![\mwbFnNDOUVMa)vZoZF6YPʕ+,֞3WZ|6fa~X {gYȏMc!Z:!gaكhgc6VxhaN@hZ_|#mN>|֎vnΩNv|p;g <ŽsdǾUVm3͎e'?(>w쵂w?̎ivp4?̎oeS>' 29w>A2W%Β.X:TL] $.g RhKw ~-h¦;,_c-gZ`ڱhѢ &, C i<Xa7vTZ|ula?yz.^f,\˟l_[v0+v :u:vf@y|TW0Go-<+d @ر>Km*Mce[vLy|qпc`qXq̲cp={?ټvGv,;t}5n\=ѣh=w#»̽ʝgJg> y\'r\m #@zsOe̘1:j/T"ē,P멧|+@ևNJ}Wr r_pԬYZ7 ;b @@@@@@@@ AS@@@@@@@@@UBX,⋥. ah2Y`ժU:j֬Yu@(da}H&!mCJzs>^hr":@ jQ)`E)Y}yĉ%ZYjQ/`ZV֭@@@@@@@@O@-v@@@@@@@@@B&0amٲE={ Y\ iԝZ JjD}D$ۧF>9y=,&Z+nyIټ%;)zjU\Y*UNz$IBw$vǤ+W`iRC:DcPK@ 5yd)JREZ٘ w#t*T)(oƕ\ vjբ9hemS.]^zYk@@@@@@@@@ -B{@@@@@@@@@(A`ܸqjժ5kVœl*YU 7OZ&Sz~,Z$m Wim^zI-+WT͚5݌Ro4qt뭥^ "@Hl00BN@ K j}Mt<˻j t?n ㎓4{.Y2\,fpv>ׯgj tLE TP{@P&҂Ei|*J6u!        s!         cǪgϞiO2cԶm[{,,žs&J`蚶.Qkd=H?/tdS(JhjժUˡx~]SzP4F"@VF Cz:H"TPf=ɑzHJIKSJ|mj@ |͚5S֭5f̘5> Zl|jž>֮}L@Ŋ Ԋ:7m*;&W$d/_^u)iV^G@@@@@@@HZ)@@@@@@@@@!qIJǏ'P+FL ʴ@vЋ@wU w!0a4m4hP":2Y`ժ^zxS~;D@ & ԪIGLV̄V}W"TYj%ʹ4/$sIM'лwoYUBV<{wi&iҤxbd ZlPDVpvE~^VpZEK@@@@@@@@ P+?G@@@@@@@@?KW^!kyzҺuR۶?ڀ-[Jӧ'c$%4'#K:Dm V5k֨FvU0@Z8#D'@Je@ AyC&NLЊYM`fϖ|Y4$'Kp|UqDž4&`ZǏז-[*.\~߼( i#5l(M̕|7i"-X9G ''G5JOԊ        PZ$         ;vUΝ;k:kXc1+aR ,ZT PV D"v?}5iРm_ ^ZիW/t(W,it @ !@,Tkpi"T+P'VY32V5˖I#tYm:@+Wjʔ)\%K֯O3s=z-KVѴ4~x jh |@@@@@@@@MAC@@@@@@@@@(Y`ܸq֭*UT̡3G$, ZۚKH맯~jOJ}HÆI˗Gaܻiui-O:)Z֤4rd J&5!@J8!@ T".Z]̴џd XFXxCP!Y5^N:v3fLt)caxjŷ9-L['@V~[z(=-RFS9"       *@V,<         @0r3 `,PM6M"PeX@2e6I~*s԰tQҽJyYkfTA_D6oN+F4  @ ~]F 7&Cz:!C>zKj8uRW|PjoݺukW[ԣoRNN[=m#P+nD7l=v c3~]H~h[ ''@toG@@@@@@@ U         U믿va+ժU61p@6m׬27h1̫bq X!թB̎@ ~x5h UTuk׮\57{O>\:.g`O)`Z5kk@ 78B4&,`!h6uW̋0c XxJ͛KO>tJ%{B ;vlgT]) 쵗4~|3goKV~t>Zh6l&P7        @ @@@@@@@@@ XV݃ڼ˂8.@ZF$Rۭ^-ըz1H}XQ_X(Qs3o_㏥1c/Ў-P@,t'21K'KG-߁k" *DK^{t!Ҿ2O!P̙;H5$Bwm7w]FjhSԊo|8M t>2wiʯfikKGX~ظqNA@@@@@@@Z4@@@@@@@@@&*(﫳fEn̹jck̯´X+Rr_z뽅T![bQ%[7O_YZ&Sg9G8PztS_xA;{jښN>g) @iz 3cǎ-,?Pk$VWƍfY˪Uvxݺ,x۳e4aBV*$P%p>^rrrJ=;5"       % U"3          ^e˖~S.]ېnZZq4*T7XY$0u~a ЪREV F7zsV\9%2oիnWtҘ1wz@  -' `ϖv^{eR߾Rj J.stYk-B X֢E/3l@C\;|E+ jR-N} @?\9RZUud^xA;J\ @ 1+SQ{#@V Iݺu :Xi|R2SVɮ1;O  y(5999j߾}j*@@@@@@@@Ԋ@@@@@@@@@Hju%=V ԲҲe6SmZ5+S{~l$|%J,xc޴ԥ,[,dϭXB+hyoeAW% 'AV¬,H?0+oY0d¸/^FFC6m$ )eY^RXV͚5UV-ծ]ۛޯ[ի''{ܠAo2 J06n5l,ImJ6vNm^.x|*r|*. }6[}NQ@!R? l[}$h7$P2$̽x!7\l:@ z6]&%UJk)kە]g.k~4ֲnF$?sN,P!))V:@@@@@@@@dJ6b@@@@@@@@@*`ZGydZgϖ Ñ7[k f=aB|0wʗ.벑(q X݀jZpadEiɒ%^K,6b@:uxQmڴeRQp^eQ. T# ,*-ƂlI+x뇌 7oM/0c3õlFn$@OiӦn[ F,i\vdӨQҗ_J|"M"E"rxƎCJ={J?[-ǧ]b}SR=gLò{{ZGˌ)o&I=&=`֥WޗW_-K@ z ,{/_.&KIz aBco8ҹ Z[Lդ Z[ER~߾(        @@@@@@@@@+`)?n喼Os9s/aƐܲd}FexeZ".RΝMGhd!Oy^aMv֍naNw߂t!y_bEUӛ[׬Yl!f]RM,̦ӧ{gv µ,`;nޭݷ;H6]Bl?bQGE'@@IDATCرрO?&N*U6nS-[0%;VqSb&OqX}Q@'ЬY\ãZ/W[ KzI/.\J&]wtKJnDǏwA.iVUӦ .vxYF^zudy X J=5"       % % :      }IUm轊HU:(EA+jaKT% ch=(@ibDQ;ҥy.Sv|>rν;s<   I6mvΝ;'q+үiƍobG YVryC8 dk)/3g7oϟo ]֭[s-BֲeK.@tv%TR:3@=t_~b_R@@@@@@@@RK@:l          N"*u$uɚ@-%&k"s˺-UJھ=Vk]*̙35k֬ܛ= - RtiFc!HtyI&f5j$ Od@jdpu- ^[߻}]T]Zj6m仵m~)kPhcgƍm\B_9 gRXLJC"G"'=75Y&~СҾ[,p5ҷJ' HXV׮]}G GǏOPk4Jd͛C-P5|z侚$Apq>z~K7' Xlo         @J dMC          Pjo^eʔ)z!!`Sݺ19&4nK:e 6EQ6l+v駟4m4[j#xR\95o&r!ndZG e@ 7:vX(&&;w̙CfϞ-;pڵ˅וRf܀:w[d;vd|SOq'P+9Zzi~}rnu+W_"t-ٷq.=+rwڥXP5.hذaJ.?FeKR8cB.8 TRE+WSY}ƲTJQ;;"        @HB0@@@@@@@@@ XM'>0ըQԫ ժI5kJT>ZK,ѷ~o6o<7Xd@UVDw>{laZe'Ɖy5eo+CVPa֭>\k >S=#y6a6mԥKuU=zP3~L Ԣ*y?Hlܸ_{ħvjEHwj]~>vku`DoEf>Ȃ>Pp  9GP/ʕ˿k׮ծ]; !q(S{q /C TF)%8@ץ;s-AEZ,jժiÆ Z7SW<'˳T9˖-#P+Uہ       ϻ @@@@@@@@@T:u;"pF[/]@3uoV/۽΍9j(}g5k,UXQ￿=Xs=իԩE(Pn]y܌D0qD;V#G< K.:=.lT,OxTئTȖ)k j-i  A ! (#}Ժu`vedG6S#TÇYp,,k֬.-(s@w7U=F(`ZKF0*`Z6I}'K01Um]e@Z|%:&M$)@@@@@@@@R@(X@@@@@@@@@D X^{ $Ɍhg"R%9؝;ac||%Jjז~8-N>]>7@8-[ PG5`U|o nbO>o i! ײw+Wο,ncǎ ԢJwۛ*?Ebk LAL6m?!'Tkɂ( l*sԿtŅ/TGWxITի  a*^뮻j*U[H͛#Yeh67į&P(xNVZ˙@X^<@^z%%@@@@@@@@V@hX@@@@@@@@@ L6MoZ˜f,PQٟp{2cdHJ[%U+ZSLo7|S?ZnnpmwaqnL D%`!.Gqيk׮uA?wܡK/TݻwנAt)EQ՟wܙ@-Di6L"9fjE2 @z ԭ+%~tҋ/][>koU?_.jE2 @ X;H\ zt=OC[έYXN} mUi>#ZtiU^=Eb$`~mڴѸqbT#GR%i:y# 8P(گsjĉ6l-Qot]wɂ, 0@Ç(y晚0aB*>׮]*SL۱L#D$S$;b$WZ5EY@ G䂡o=WrcSstEA@CHӦӅ|Z-B( @'9)DBL7m*d7'hΜVc#ڰaC j˜*,iٲٟtؓ˗CY@@@@@@@@ +;$l         سF6SvR5r4^T)@ĽV,~[۶mSO=ò ^|ԩS}VӦM_9k"@:u{Wӈ#eO={ԻW,q#Ũ`ΝqԢ*Ɓa(S$Z@  A_.w=-t䑱 Nw5绛g'폽 /HOÄo R\t|)ᇓ(@Ovo߮*U[ &pرْ/dF;'Jߟs#G; ,ZK.V:v|jEFR C ԲSưVFreiӦh`5iƮW)Z8(eZ-hٲez%IA@@@@@@@B >6 `Q@@@@@@@@@S*Q4iL)qd5jT"9.]Kv~5M0azaÆ骫ܹsuuשFW’ 4 o .\c9Fr:(D *SL bNJ$T p;l[ZjE .V&y@K 0e4x4`tafvV w'|+T ®O5tPjJm;fϞC/t'x"![sN.?JaRfoF7xv̒)~Gl2=.L$]{EVk.)> H =_[gT*}>-%`nj :'3k Mk%K.db1B͚52&Giv RtyUV#xV5* YWBi S\JK\Orei.B- Ԛ>]Z:tWB˖-+M˗缿wOQ<,P~x6D        -V          Lw#ڠ܅mgM Je[V93W/gj]VK/QFGQ3$mietz5o޼єEGiѬ5˾{֭N9M<9eaÆzw37:\?wDZL4#8IE$b6矫O>V{1wp䧛& i'LP*eԩ2e@܍ ayW/4i.׮Ƹ-Z4;6rYXk>k˙3gFq')lL XK7 ]rtˌ͘RT?!+ORΟ??AIEHoMr .HZ{6pK4Pht-wi_vb)лwob e]*WQLBf2)oSSv Xei\pٲhE z7:tQR.="Xi5-+ @ _I} #TjeӦ{-F۷>uf,]sϿX-        D)PQe,         vءywD'`!GGN&,mc}1Z⎤ܹE7؍a}[n 2')MG$y 7hԨQ ,Lr+΀vwߔ۾#GO?a,X k)^G(6?1 . ի0ϝgZVOٲeU۠Mԩ rZjM!zfa|z)$.;PSNJ.1'Dhƌ6,3#\ti;}4M&Mh}V}tr%^.pW8!#@{V)9a„hWeTSˍ@o_buv c2\'~mG/VÆ #       S iVY @@@@@@@@@0- jݺu+g JeBҦMҺuRٷB oy} j\x-нA~iM4IUVUӦMuk1b|M=z饗g{a|ܹs7Nr?_v>?}]=Hw}ի[O$V\)gʔ)V>luQQ_F֭~W?k$ېwl`ÇE;<[l g˾k9snv?z:u#o~W_}U7ntjN;-2Xs=WswڵK'|="sߦML97ԢE4Pc'$V,)oС{K.yg%q"p;h5+vaY ,|9f~}[oŒ"H7 /sjck zj$UL Xhhv7/ĶK]u]{b =s>dӮN>C]®ziӦ:v*ְkm۶i}v f׻vMft/y->s]umq#}f ղnڽ$S~r!,Yₑ.y}[B,_TŊ}W^}>(W ѣGk̘1ޮKظ;ԲeK]z.|}~DlhZyAC ;XiArrHOjL~Ϧ_x_E #       [ @A@@@@@@@@b v{wg pM5jtxY4qa``͚5i >;-'~L 0mZr#[Z@ g&yj~z 7`VZ R }Ӽy tAy*U./7v؀ <[.첀 (? \X_]v~H6'x"_>`_ q-7xq\W`ӦMnSrH7%wmzG۷o^~Z \(GpRe0`@|~ ]..#PzSO=p .7ׁ=piA[[n ?`q}4C7_S.h+s7{^6݅d8#.,"HA}'xb$'m׬ţq:JT5S';Y?g}S)t$wrJ` , uY7;ZZ/?va҅=?|\qe] 2!%OV\P}k {5=R5M󳽖\^\~Gl_]u}Y.a}]viu1k7W\A\`X0XB]xK kNjUaٲeߓ..`O>_o/vB2p~ع>\?۞u\eUneB Jx}wi_i+.מ_D ٮ3kJJ=Ȯ9(%Z=uQC wMl*GME Ѽ^9 PP+(s@@@@@/7p$]ZD^`ڴ~zW5J?          @ UNShcS-7NmV֯Sҥh\;}[$N?+%Gy\ؕw ѣBAO>DnnAB4p@ܹS| 7Æ N. Kno3OCʅh颋.y=U݀>¼t1ǨRJkB"݌BK.Kn=ܜ[n=hԨMI=+4]o׿U6l(l=-_\^z\?x.D۷Ϸms׮]M2e^ҁ( -槹:n\v.$?\C `˝iҼeJT7S'߇vN[σKxOozˡΧ6m?IwX.\/\c#ɷRO\X*# h,ZĚLNgqӏ?{_9ݎڵk`۶m*/>_ҿo9R._燻- 0.髱s+v~iƌ 9vh . v=tVee%_h{LN>ũ(} VΝ}. ٿ?+UGg!ժe TQ}C}맟~\X¬g|ozg {l/_pnlo%T }tkwl_ZnݼK^?ޜ "@ }IűC S/6Zy 4kf][EBqϱ*{71tɒ%.J/sLL        @hW`y@@@@@@@@@?VZŷ } k/#ɍEI@˖9[QM4 mT_||^˭J*qp`x mŞ[pXL8Qee~/@v'Bl[N ap%A÷lWזߺut!6gX 8M guE[gOQ/wmA#)fl yK5>nTo J;r-m4h[<1r+Ԏ;#e,ַ7J옔4Pwp/lmO[l5oپ}ڰaüy"jh6({>}dAYv>*X*TPp"+X 9ꨣwy'8 XE͚Q5,+ `)OҥKpu_7um׶E]_Y`Y\]ov,ծ!7[^6Xyn4bze*# =p\ 4~\zI-vף\α컂sPQ}C$``,‹f!ѧ~ ^l}  f~7DwY% nE:+l`Qp*옆s/"26R 37o#VƎUm@:urHͪeJi(        )@Vj @@@@@@@@@ l֭[g@vݍ-\xZ dؾ}N;3gٞ PW_9#Slg}VӓO>{/V5m]/Wޥ_O?rL ̚5/~7kwm $^Tִib-ZȷYo_s5`S^`6`tӟ d _x߮]JlH)5R?HO4T+fZO~Cڥ$L$u.N߾}`?} ,] ݼ1/[zqֵbk&ܵm5WԸqcrK=GS z|;?}hR?z9͛7O,$n#GrWDLF պ.N.WrI++V!!fpCB rx^9:"y./X]m>wY>|%o7 ^ !Ҿ*TE|t9ZE,9se >BFU5k)pG :uh'L;f{ ڴ)6<7׮CǍW X(>S #-Z?@@@@@@@@ P+5 [         6;Zѿ.YǍ7Aw-eK=ۼ袋d[T*;wwug>[#G,r3md Goxvk׮uK2r~ofj6QB/_&l۶OH" Wt;U GޤI"] ssK./7jYxC^{M ,㲫 T^蟊+{=')j ŋ:tNJxOv~[V$SC9DypM9L a:[;vlRÆ }'t@R~UJ6Pa=kX;,8¹BsuYPTpC.}(Dٱc_ϟ~N9FIB4,t˨>4aQWSjժWoXBF/{>>m˖-zU\9IОmeQ}C, ٳ5my#lW}߾}dٲeEɏ5 k rx6ٯrdn/VA%m7q 4hРĿ$ni @@@@@@@>u         K7oZj&2^7/ecG3D+ԽG3l(7rI'C֬YIbAHCUݺu}3<*|wܢQFys:S7{?e˖Z||deZIܹ_>˷ nuESYXRFv©-IfoH1 n|۴nݺmnW׮]Hyqtun$y vTvm+|-6$rvߨb*.I*^κOROho΋-T*]/ԨQßÝOuYꫯ^z_gEu=ZWݿ\kD#`O>) %=tҊPe˻{?Tߐ;o n`%y{߂NsIM\X}7O>$}a7b<d>R3ƤXhi01kr*AB3  äx T"mVsJI@:uo%[@~d}.@@@@@@@@ uJcÖ!        dŋ}v5k, dp`R͚%']&P+G]l+u~WVMv;~`x H0X̷ƈ#s x}yØn&[~n1i${~JiV-§[oՇO͛7}رcu֋/yF mOp~( ) *?m47ݕ?_~N9Yڒ%Kd [fFt?+>c(TʕW]u f/yK>}kW^Swq_> //'Х^C|Aʕ+9sVP>l>P PSCfu7ֱCI!''O:ua4O=}e~/؈)R?] {AgΜCOW_]Gع^K +s U3܃P2y󱕥K쯑qN< Qk J ԯׇ<>Юw'9']- 6Uҥ5]X=СիO?S :jБ\孛$Js>Iݻ%FOS Z1/.(Ub ںUݤ}VkԨQR@@@@@@@@(         Pl7m SY1Gz;^*i_~pp>$k@}dvo%!ۑ-[`֭[7q16lpNE/9g.*?9pQG\Ν;zp\UVng}ʕ ~o6*U u]Çևu%0qĀk>1PmpA^7_ rAX~Hrv:\Q#ϻwp`6#w^8?Pm n0 ^m7n8+~: ;.$*>Ǧ[npFv\Y s !C䶿e˖j ~_Ϻ'Oˍ7.uٱsFpܠ5`[7_X!Rp kl:  [4)Vpi{Ƴ|ɁAŤ ''Os}` <1yƪDOمa).;u/g+2O?sÅ>;'ش޽{瞻"muAZ?n.1-swI;2. ҷ낇.,wd@͚._Ю[jp'^5]3{װ6^s~kH;-Zx饗.4y>93vx 'm]D%0X@IDATKQ#Lիp炀,- 7 Ý6I@&MSNP}C}p{_pAɹ3~{=y}n}/p~v!Tߕn-0cFy]T2ŝsmHרʬc;|'e~ڶ n=ƕfyu G#$p3cƌI`ԏ?K ` uCo#Ԏ@ v|p5@@@@@p9m6 EZ`ڴoezˬv(ΗQ@@@@@@@@@=rYcmVI/G kM"9}yҢE'$d-H-Ɏ}W:Dizj&ow;.|8Ouj˶ دŋ -7wn{>CA }゙^{>ؾ}$Ӟ"1?e˖VZvJ*붺uFUW8?̅yڵk{ַ.dd5bbΜ9rrbѣjB Mnذjժ}T;ش_~o^='/7{ \O?Tvގw9u8+VԫJHa&O.dB˗/}|t[:Sq!r!z7,u9y=P# UGy.R?\@\(i<ZvюeJ.h_?͢ .W;:uVm7k܉E=';Z`b*dOB8cDH:Cw-j݂,\ZAL{.yu헝k;vr 3Kz(ض-06baZV^\89K}}^u k ,Wz f̐|oV('r{ΏŔ5khݺuB`r ,b(`-u]1"REڴ)%Y&R$r֘1ҹF˕D~.8䨂{/,Ub|ɒ%.\=tͥ6@@@@@@@@ kCώ#        ܹsաCTܴ& q'-[FV^]J}YkKy睧?Q_xuwOE]GPd|;wN9S{[Y߮_nq˫QFꫯԪU+>UTλ6g}cĈ֭7+Xʕ+Lg)&p7CgxEd̙3զM,w}$ֵJw)zhEj}ٲ*tt}ՙg,p"QL2z衇-fŊOSN:඼_ZOcBƌrݨ*UļDU8uT+z\\'t ݻw6vl)(}<蟊S=BժUu[3ڵVkg$@>_@ , % =pչK 0jݺntPl^\~ZKgE#,C=VwƧYS@T޽ʕ+ &b__nB dӲe˒4Z?.-RٲeeA         @ NMc@@@@@@@@@. XFik֬Yvx vJ4AeiZeXҊii}HӦoJ :}~zԼysuj֬Y QYH{\`[xZ"J:iMƌqTW@}eS #.\ })DA@@@@@@@HY#e          mK,Ν;$SyЃZ Ym・+3dg`7z|Ҥmlc½4sL}:C3Ϩm۶jӦ ڼysbmk׮[o;O 6{/IM}饗VZ)#ݍ^lلoSi0ұ u{Vj1!T }h|iZ`~Mƍȑ#ʕ+G7t=ؔBo_ӥ].5[wީ{}~AgUFÆ>\^yD2w?3@(^z'֭[UBcz 0SCTY@/_Bwm)9 HKO 1)L        @lԊ#          PbL2( ̟/5m:4Z?.ħn^{֭[QF>/[nE+Vju#ۭgϞ.X%Qr;NpIwcǎ)S@.]uP۷TSrT)Y!P+-`cv) !m^̺bi駥})zꕺ3]w.ڥt[<]sۮR:O %`Z۶m/)qREڸ1deuҪU^{e%Av~߹sV\׋yM\CgްAV-qfSK .TiW@@@@@@@@ -X.Jڱ ǿ̭Ql/.]1c|Ç ]jѢֲp=zk׮^zah `6X~I&?ʗ/nݺi[}\͚5Uo%.W\+AO1@Ȗ)#P+RET)Tb!> {c:KI׿>OGWMNi5lXKKtY7xcttF _/xԽes @HVZࡽ4qDBJnjٵ %}J9񫯢~dv>@wBn>Z X[TjC@@@@@@@ J@@@@@@@@@2X`ѢEjܸqavz_Rsݺ鲵a\ԫW |ng w}վ}|-ZL2*G [nYӧOWی3dƍ"iq_~βڵk'|[&P SASG7Kp@X#qj%ΚHg;NBϤ:譱Y֖oR_z˅r \4_̹^s( @ X}LI@*ҦMi+[9 (^5]٢EPnu#-]f&`jc3@@@@@@@@ #         ַoTڤ˥Mbs㺑jŕ>XKiذ"Iʌ nr߰a~M:UӦMO? ̗32_rԼysnڇٽl+_|n]<@hsh͞=`vR)na9 ~;uWSNС*VXܦvm۶e)m_O=@- @* Xx2[sgi@`,5CW^F8 g>s֭>]{Ȕs馛y]e͎ @^z[nq,>bIfBrei}e3EԑWǥq6lHVҥu *u3R*B@@@@@@@&@Vh@@@@@@@@@.\FEKe@'PK@-$ PG Ijժ>k׮Ռ34k֬ȑ#SO)Qڍgõl&M#xݺus LhYv!Z˖-ũ]Zj۴im۪ K[]ǞvO!@m!V{"@H^{I& $]r䲥1ޠ~8'P먣vOG۷Bw ]K>s^GCd @Q={TR4qDwqE- s7n$P+Fq_SkNsXILwEŴL~}u*-VZjz@@@@@@@@b$@V @@@@@@@@@t#-_@b q|!PKZ%5h/`lo$-qDۋG 5kT޽`+VМ9s/{ EƍC,'X ݲA{!w#իW/WT) i$%Yݖ.]{xbo6Fb!kΝ;P-[{{P B&%?}?*V2eʤM Y*p RWH+y[oI7$i3tPOg^_ @6mhҤIj0*WY~ &*[WjN3@Jd7Q oKƳ)TLjA@@@@@@@,@V@@@@@@@@@H,f׮]>t&YfQժävɾGj%7n,u(}qjFn,@*-\PYp;/YIRZ5޾޼{qVvmm@l Ǜ7o֚5kzj·߂W\d7{n-hf7^#v5vo:u]زe)SfZ9U.)@R)l\}/K*]v\د\0t]ݜh=s޽~]wuE/̜3o\v4@@Ϟ=}V<@Ԋ         @TK.[( %: j,u2u鼁Z_J#FH>[*J6`jQee˖i>)oPnd &:m۶m*U䃵,\n5jPe\v|lϫE *W,n+VKޣTcYʹ_^׮]feagZg\dի珹rWΝ;e7ΫK?W.;ֳZqy/]>0vRVA_|!rԺuћ[oΉ2ދDAEgC zbgbNg;ED^*QD.EK&܅-nLy^d2L&֭[2QsIK-[̰ Snݺns{de(pysH{ R8&j-^8UNsr ?,رc|*V@@@@@@@@ SN*C@@@@@@@@@pjͶ̔4)ejrUʅҨ1 ?x>海,ʂI0UzjYfoTeR7nt\n jdv*UsVTT)wKɒ%UD P|u^لw.ܖرM=e۶mhY`MA%##Í0 _[M#Uz:eac sQb/'{Mkޓ,L-{ݶ={*[yӂc$`jj&hܪbIgK+]tQҡt>݃ƍӐ!C_zs_ 0mtҍ7Jˆ ]zqgϞVZŧj*TAݔ8 )+OS#T+ ڲe;O5j-] G<,P˂)         P"        jY:P@CnT]&\@d#ٿtAjiviܸqf!D6m{Ibzժ#]s͸aVp+ $ eY-Ƃ ?n8} ѱ%XNk ϲό֧Zگx Ouhk{?|^{gOz[oJ=,Tw̾k(_H}.= כ:U>\6LzEǤcݿ T9r: =C.|˥oQRR|뤓ݥ{M!2(@ f;vq~jL5%K8@jTVb) x -Z$@k~ϒ]*c_d4iR@@@@@@@@ !j%F@@@@@@@@@_`ٲeSN+h HCizu32Bl6ZϭpUu{QS\N8!Ue]#`pV,T?E:YxCH7c=*`Z' !`DžŊbC6A@ |tqGK Ӳcptrˡu w5lsڵӝwީ;C'x"!9yR}Fy\4fϓ@ PT)uIugǡ /iSx K815SgX;.澔/\ /Ok Բt\S6]vƍ2j@@@@@@@@@@          PR7#VX a[%EdbawMV6tgk$iݺ7LsQ |駡 zc l޼k\r n,#RfR~~%}Kw ԪPB30~ XHJ>$C L :PHh[4^]#駟6moϹ .}˂ M̞Q]CPFGC@t JLkJq7KHٲM@Ϟ7H۶ű4tҪ]9jɒSD x5UDH6G@@@@@@@$@Vi@@@@@@@@@O'lޫ={.DVv>.E'0zҳJn~W زeDz6K.'j UWI62 =C XVna:6_K+#+ed?f̐nU>}{ئ{1b;=< t=cq ; @Buӧ}R(ڋh7mJ&kzI[BՇthAG0HXTti$kNXۏ@@@@@@@@ _'}          @:,[Lulv,JTe͵FZ{*T*!V@ 9uҵJ眓<_6ou\r~HOKeHC$#4@jþع@-_:@R:#^+8L+ܥR[n~Ej.T'KhRnv2{f\X`|鬳sϕ.( @viY%K7ƷtIAiҤt5j Ʒn5kfmFA@@@@@@@ZO@@@@@@@@@ VXڵk(c?LB*W}AZ5i>0@iǎ%F|dgOSmt'Jضo|R:T)Y`ӦMPHj('.L+KÆ҇J?(i#or!M7ݤ֭[ݻo l" $YSOt@-TJ}>Mjwnݔ8 %MFҼz 8#JNu )R{ ؁>@@@@@@@@ jb7I@@@@@@@@@TXrj֬Ì,Pyr*fMeK@Һu҄ k  mB2e1cM(X5$`4V^I^_=,+KT`ƍwEzI R< #@{O:ɾZ_#͘!|4lԾG%5rH/|wNAzV}u8; R+ ? Ԛ={*wMlME ɂ&N#^e%333^M^b6lླe+ b+Km        @_YjF@@@@@@@@@ *^?@},Pki۶}~~]2%Q-N^>s=HZ?RϞR.lL`„ .LdMMdDʕB I@$,qΓnAzQX86#tg3{}ҙ=v=6+VH',utZ@t֭,9q}T kJz"P+̍\Jmq~KVNerz޼y*6mZԪ@@@@@@@@ Aj%f@@@@@@@@@K UVVay.+WMO־4ee͚5&^cGI76-!) , $r˹@,͐KIkY5c=^n..UV_oLSRTreիWOm۶ղe|;:~7Ke˦߸1*gO(D뤇?q#u:|iN:묉zԾ-E/ktipŗ^Z=d @ xkV DV|.ܴ)mP{Hwo/EXjv;r.^ϟo@@@@@@@@@D'@@@@@@@@@RY222ISyۼy6u@-쿁 JظQ_nViĈd(uTRWD xPh~Oa~iVvׯ_iUREum5! *W.)M(X`N GɎF& DX]Ŋa.HR:_#*p_KIsj !)*p!}[d)pio+][h~7]jY`k']&}Ǒ$͚%͜ޥvlsΑ z1: \rz Q*j WK_ 0ǻ=!\@ XHjDO<1ҙg&<o!M}&-Y"o:[:}!?RN R@Xj^W ҦM? n-ծ-Mzf͚(XKC[4 l6         @pW@@@@@@@@@ E*ľy7J() Zع.dw693%w-f߰abۦ5!n:UT)USg@l2e HfZ v3Kw9߱WXQ'tR صK0^)SBUG-M&_+H.+ qڶ_LX!%Bmj.$xY[0ƍzS8qߥ܏S@Eg/ n        G@+z         VRjRttּyIB0k.WN*UJZ6O^+& HVҰaK=z$uC >ׯWʕS9^`v'C%( \h/B.]:Y@2GWM>m"~uWe)'ܹKw%l)g/ҝ;gӶ#)=T$MV1w|ԩIC7l6(3> I ɂ) :_úeHUHKp] Բ6         @pܟS@@@@@@@@@@ k֬!P;&!vQr &N>YGi7͘!stE)NI ͜IIK1c,+r :`ӎ;r-jp|$n]3jh#{wIPVQlU+VG3GΓ:Hԡ4mCد OSU[h)Sĵt܂-$^B!ҭ :sG-J;޺uK]#6 l#P+,VA@@@@@@@|$@v]A@@@@@@@@HOիWU]o)؄syE  kזƎMPi̪URR.ң1COI ެZjJA,0|4xT~ر;q?%JGjٲ>p X[@F駥}?;VZMzҿ-C8µ=6ʝ^Gv|=~dcf @9_y{wmJ5kJ&]č 4_:ybXk j}?.^ lk֬Y+@@@@@@@@ 0jB@@@@@@@@@ wrwoҊjeDV^2]^Aj[}NSB pXo?駡kS  r?|v{_~oȣ$A ++hIh&@P+K/SzTBU勍ڵ}W3ɂ;w;OrS 0itK}ġD!@V)_>TjQ/PԳ4qbJW͹ss:jᠶMF"       $[7}          $S mӢEۦjg/z4cSĂfFz-fTIw={hڵZjSMۥKZATNЎ;rJ*0`@eAU䞢ʕQGI#FH*6Ƚ@IDAT~{:a{VzeBZnIZ. X@%KOnY@ | \F TZq㾏p?^v AyjZZUbE"?" @@@@@@@@$ $xE@@@@@@@@@ ,@VX"k Բϛ4|tZ@-=1cӧTKORj@ Jrʩ]vjE4"+z,;M;qb뢆,P˂(X֊,Vsh" @@@@@@@@ j%@@@@@@@@@]`͚5Z=,Py6#P+od=@ r!jʼnBP7ƩOX1gOi„bA Z{AmQE:PݬOFAVi@@@@@@@(h~l         @ZUV-R=1ZqI]HmH/S-[B1ZG5C6%TXr75jW.O?-)# ˃,B }ݻe]tX@j(]Gϸ@fԽ4j4vCRszg?4ktҹJ:IoS3CkNq1@ H5m4aV Amwo 8mѢ~xT: u{@vsʞ_@@@@@@@@` Vw-         %vZo@UTIy4uqn$忝wY&/U Ri||jРVN_Z ++Kʕ.Qoؾ]zrt'vҦMy[nU^ɷcu۶lΝme{M<֥7`{)QRd322T,.r-[{,^4ŋdO ? 1%+~C-]|3,jwSM|9ݸ4rtv_'ܓ֭ >XzAD@%`Z\, ٦Mdu#%u e_}7nLvPe?N.toȎ4h1ĺ:vuQ9ʖ-[ǀ%        Bjd(         X~ip{QVIMF~:Uzu:ܿc>Єٿ=wlW_}w]5k" ,_\jWD@m>frt6Xvrk֬.%B]lB.e ŊX`TuoSB·oիW / زrou?PpȗeGRlLUBUX1׋}`c~Zj=fc}tj,5ǨmM7I<"]xcrQAI|lY$.}tҟwԭ[|J.Svy\'@ I۷Wҥ5eW^wn Se(U.M@VH|΃WTIՇXOq[ҥDe3d 6H@@@@@@@@#g_S@@@@@@@@@$V WvdZ5jH7K[He˦|QGI#FUؽ7K=dU9*&E`ɒ%^(MPK?.0|4xT~X-[L+VpiYZhv{K-lܸ1׎O6-kԨ~aQ$U|y/P*uYw`hAS/Ŋ˵.>}HոqVc{ `-lqk -tŬYrٶ1.jl ڎGԩ xQ!/~Z0 /0stRfKҙg&O~A.҇J&I"zԿ4lԡ{d>L3:mQ; @}0} ϱCJL+hb!`Qz j]{˹ =@-uFdQ=1z;@@@@@@@@-@V#        j٤%JHkh2 浧!`ZV\^4 \pAh~,`˼Kg-]}O+-Ԃ@* ,]TumLJZ|ϧp?H Zx,vb!Zvٶm[ڱP.=cǎ^o'TRś5h:ucܱSxq/(BbYvر7`+nfk֬,B,f^ًY]իbuwnQ+`=._NM&@ #=t:j$UϞ_H/vd'$qԾ}tu?Խ{*1 R Np.g[6c)ޥ޽C.[4%ji.RH Բ@@@@@@@@ xjoc@@@@@@@@@@ʕ+Ј?6Q %wpZ$krl1YZmRK[K<ʕ+jmoh, K"y)I=,.33ӻ,X@ .,DkѢEڸq^fddxwnݺ6%P|'`KK4eӦMnRe^xZ8Dͮc'O-k׮]{ആ zZըQ#5q 279KӧKqb"po:|n]V6d\?^:87 kyg.׍Rl;\¸O;MA,p_-,.۝{/Sre+9u۲eK;6u3|I>ZIħi@@@@@@@@j@@@@@@@@@(Z9R|ۦFԹs,UJ2DzY[%o;mdgRҡM,Px^zuA@6c&%f͒_z㍔ohFeΝ;7³m>o껃+ :N: A 8 a*VoFG'P})i֬wɯU{Yo7i4~xpVl5o<ǥE[X}Ga %]uU(tϥC-z zqku |dZڥ8Փ{.u@ tq7o֯>R( ;bEΝS+`Ą jZϟO_6Xy:R`(\DεW\Zj\=RL`ڵpRl '$jU ,ڳ&5}t͘1C?HdZАMj!DZj]W^h 51(Rq!YUg!g,.F·q{Nd:tPΝթS'ձ)9F364zq$ r'J=zĵ9*wv줓BZƅG`mS%Xx9s>e Z%K|w:sSkpIMŊ҆ ID6߻w(ԝr|^ eX=EɝBB-@B         |         @ [N*UJ_B|۶PV!6MM6 H!f6GJSHn'nnU/9gWX5kKH!%KxW^ &R2Ґ!=ʲ233g2uT/D˂芻T2pcǎ:3ծ];ui6!MMA h^z/5sL/Lŋj׮k<×t3AA8 (]zi(Dꫥ{\ %uɡp- ֺn}{iPD6 L]&|t1@b&p˾Sb+Prel뤶,P˝r磤l*Xr.uqAaZ7KMA 8C3gWZ1D*@@@@@@@@ Ob          lذA 6w1@RY<Ï6ѢMHcҀR҃ޗnPT@* ,<۷KO>) */,ȶng}嗲_,wLXJxlbN;M:ul .s%{׬Y Υs *wv¤SݽХS܄ ^F ?-WR׮o#`-w(NnEX*U)szD@ҥF]vDy(*Vό$1T6вeK/P+˖^@jժyhe}@@@@@@@@ }@@@@@@@@@@X`ƍPB D?t (]:m B)ڤ t\ܤ?{}$)##7j4+VPr… ]RyU^=EF0r: +]fZ'OvO? ڱc5k}.Y`Z_jժիw ?i&M6M| JeysᇫO>:#eݧj{{B}9'5CC7vcAɗ_xO X)H', >sٌWVã.Rg!#-/^@,{K~D~^t?3R `S+,MBRVZi֬Y)ÇKKR0l2n´0c&`Y=zu]T8>3gȑ#u衇zaԳ>EŬ}?T'm&}zCH=BLZ"]uaZ~aZ/z\?Ʌס~y4qb(F !Hm۶U2ewC bX!UE%Ү]Qmfer.^FVN       U@-         Lw*THj;ved?ڬhxK=гK#FH/$i^jմY) ԤI!Cf4i5^OvSO3f tXiӦ𾟞F 3³~W-]TO>*UWRFԡCq.p%/u&ի}|&fM(8ŋO>\&5ӷ4yAZua7]y$;`m@ ,YR;v$P+ƻ~^ܸ1ƕR]{KօI#ވ $ ߴiS {bZrkajn:R        @J5 !         F7Z䷄@txX1sg *X- zԾtmW2zc2^+sԯ_= Y!X%' @ff&Zߍ`pgOK|WK+]~[:(㏺5w\͙3G׿4`U\9΀@:utYg^В%KSN9E~{ꢦM/a89sd!,X(cI͛b})BlT# C6ը!pBkIw'k^I# "]xaC@"8إ N:5 X@  \$ж҄ qj Mmժ'LSNhٲ [jѢE@@@@@@@@ jsk@@@@@@@@@ P+igdD]:nԔ)8`BOzMoxeiP-BVV7bZ ^5Zyt},CaUVXo.l g'xZ͚5 8(ЩS'~x[-^XW^y>uiڵMʾL$ZEV}+=79t _"7}(8k;0zh(ptE _\2͡p'LFh@(?ϑ$}>ݶBiBN)xz>,mrvdɒe'P)@ݺҥ`D#0}A"       &k@@@@@@@@@4Il٢ 6%bkDWOuf̐6mJk_o_G (_w5. #"kBYԬY3 X lݺU˖-S&M{#Hկ_$kw^gq8=Z]v,Y?PC QժU;8z@ ԯ_ $~S@0c7HFsNh7ߔʕ+Wz+֪U+ X X "iܸq{O XJz骫):Lc9F]vN:a㏺kD, DB L˚9sZh:K(\VƌF}{-`CZe瞓4dZF Y8 7±K*bln^.ջ5)0VA|(ЦMXFӦMa٥p)ZG)_/}]-rfJšjLuJKjӴȞ?Jҥր#       AHzB@@@@@@@@@A@e@Vt JI_}N.nQJ/[z]iܸ$ܑXB%JPj"݄jYJ <Ґ!7ŋSOU]F͙3GcǎzeD wɀ'|oM$^6QU.5ndg!`毼"u  ϲ k2cps­-.,tQ#+}mɓkZѹs5?% 4HM6aYTGNc]_|ڶm{/qI6 5 ضMzyP]ҏ?JNgr/jBwޑ78C>=v>˗K ҺKM 8蠃d(T)Tφ Z 'лgۖrqfϞ-;woYf8}jᄄRggKg_yʔ)t5233? E985d7.ױDZaݺRVsg[@         @tjE         L`˖-^]ʕYPj/_@'][z3obM6&f[f".m {w髯r{e~VM>\z Գe s/.(WX5kFauo+/X@#GԬY"6Q+޽[3t7ݦ `LσW^ M~z3͛73t7{!Z(1c]_OkSO=s熫(ڵk0N:ɛXy̙^n* {Hzlꫯd̟/}t9#|u IjPP{ҁ| {r /He>hY`JeJFk>FHr4vbP]ǮNj^#B ;^.-Zj% o,,_jɒ%U~ /~믿ք ~ f^XO>̙G~-JD;A裏a;hVppYJdk!       ~(t~}C@@@@@@@@@ 8Iڬ,PDWV͞~]wymKmVh Ժ0)CyåUBXžMm?/bAM&XW\Q6O.{p\ܱc5ǭJ74_~qaywU=ڴi>l~W7׏l}eWw b)3-d?6.j]ٷ^ܻ%p2wm\ LH,l^wu4ij6tP79 Ŏ;4KB4@@~Qɂ, -Xzy n&UdI3~ vN.|4vwwMҷJKUD=[ O wbxƍP.x=`K ܰ!x}O- NQ%w,[:`u-wb^z^P}7悵mlʲe˼+ &wڸqc/ޯ=ywxms=tq.裏rkeeuپ7X@@@@@@@;!        @8P\r=nٲoz;׺pBq{CulC kihWǰt,)#}U + <󌔕%rKܚHZ;wJ"+QXVZ gnkRJG& eߟ~ ې!Cd/0&G ϴ¶۱qaʾ]QZ)iD*Tn?|ک[n0aƍ{7Xڵ#}0spzE{wy-{Ju|t?i+ٱa5i"~\e(mӦȺe zHzYCȶa-@ oޝдi´*V֯@gSvc/%F5jPս}7.9{]}S5qMnW_՚5k\K_l,L+ARd{9|}/w駟޻,jE%٢ۚ@@@@@@@@"a~ @@@@@@@@@@ ŮN7u-\fU?oïZ/7MvSO7oO&Ns=3`EK|p3l?ٯ=_ cɓ5><@u`{/f׾+ [B%{\p:t}F?XM6lpukK.矽*:u^oy۷oq_J} ^{_w3CEƏ^{Mk] O1{Xuy L]gLJzEJ~ z㤑1/(–,̎,XN8A7xbHދXnڵbMޯXޓy3WL/_߬I8ER%?C9ؖGZr|j޼~]:˧.I&cݓN:I߼cVkJnthvKp5j]v;" ѴJl 6l1oc mvn˗s;m6oO4Iŋ33a6dwc_;{.7.UWy+wa/ M=k,Y]{K^ϑp~K=3ɨ[l *nk jf̙r´6n>D\P C w(s%;vYviPrMdN]&w.uX LҥKm۶^閸H)jmPjv,g7"6+`w܊k}, wUTQ^ ɭ[lًϰ[oiƌ/'=Γwvvc͟?_YYY:ꨣeloL xO8wAyۆ _WܐlYx Xم        \߁(          ͛7y'YLm1쩧R^\0E/&?ӼIm|6|8@&?sIc0k6iM~fr²,B,([n^ۯ_?/<&8 > A U, e)0-+&0`Fݿ{ply>Rff;0o2HISulexԽqir!kovϽȑRǎnj0={xڄR*׾MW_ys[^sewZjjtz&?V{y¡YgúޛqJ“i&9M*wܑcqX8XXK^Pe!KhAYblڻ[xقLG0 AW D{飏> ڴi,1'gZ~} =zxqٖg~3ϧ܎-,t֊f~ %z^?- 'lRHMklܸXx )Sxyp]Ҍg[ L뮻ΛLT_zae1XXիk Ʋ]+wg>^]e1;N뿕#ރ>ǾdO?tzмZ ӪT)apYz7O{_ wN,0-_tNˌwrrrAˎQ,ĝfe

    &/W O:1 ڬ%Kz9~{W:-碋.vm{ױ.oM/ܙc1w|,sR͚ 'O \DmB+Vx%beO :Yv^`D+V^{ً^3 )ukB"lF+׹ma"6yيhY@rt;&MId ݰ %JxbR{SzL8L2Z0G@sp.PS.3GlK봰 ?,u^۶mMm!_ڳψ\Ȗ-[4a/5##Cn˖-CL-TɊMkybڤєgZA}cV,bT3gU-5cS^fXpN/{-;>A 2 ر}VV[n[nǎ#QŲ\ ?KTi':W/´\Ƣ; r[&`J ȅ[}~˝_zKMk{v( )(`B-(wܝsM]RxuWv-s wP WOySv&fÏ[wsmn7 xծ$cWywOx/wǾ#IZ?} KQ ;ئMc@@@@@@@@ w         ?s(i Iz6)Q(]{ѣuVo5؄Vl"^L69m&K/i׮]8p79Mo7si֭֩g3Rba Vcו*U駟̽ W+6m\N/(c.]ڮ &x.b/W^P7xCƍۿK.MnVAM0Us[yg鞽 gڱc,e=zC3g^رcxoi{MEo!Ye!YbE{M,OTʕëڷ,u а.[?s#֪UO!jtr5C}IQ$l,"HbBQ̊9+z*Έ39{9 bEPA HD~?W@IDATv۰ঙٝ]]N CCyg8\*W8,>s:jРA~ヒd \ y~^דӶd_ҷFw)Z_LK?%KS]s5P2ɜP'!K[up%ٯ;3)ޖ$!f|V|^Q3恙mT z]ҵοyv]{=B$sƒ5ix afT#yڵs`BB 7`ZHVok@j͜93,NZQje{ ],hN^4P<'ekKgs:2)jRSj        @ _1s          Py)n0[5!P/adբţ;% Jٳgt~Aj֬- yHr0ȑ#N/Iɺbm.wuWtC[nYr| k  H;~Yg%o=8`+dDZw}G @! >}9=, ;)pp%JDŽRk%۷?j)ڱcǥN'\O<uxm ʊ-ԓ\c|g֛ܙ={vrw[\Rs!Pt'^E@@@@@@@rA@\xh#        dD9+mL=W^:2j5 Q5tD0BxyB$N<00drP4dȐh Ȥ6nӧ[9ΎVъ\ZjܸʚŊh}Ç[!>mіK!1CzAS@r_{jU۸jҜ9TTH`~C*T Gr@ùSO]*o/r9} A[,}r=jw[G~I<_~SD!уǿSqŁZS p?FA@@@@@@@mr         Pj5wgQpRݺu˜p^:ʹV9lw`I`gk>uY'}1,-8%I&fmZ𩧞;o]'pB6:H7tS4o6WkD:qIt\CE˜?F=,XH%r{n֪]N>(0W^Km6!<6lhO&qGuPl*/f_8;sՃ֫BC+,$_aB{Xz0*a$z #s{RA{0 6 6%qU~/՘1c$ޗ.=vn!a>Mw}u9lGs].e:(,yg-á`IC9>|s2?#0p cQpY!P->U>]0]䠬׮Zw(lM6QNUKSY)&ҿpMZYՆ\/Ukp2 [ H  @ 8LSLgW$2)Y" fIcg'yj֬Y6\5j,Wwfo飓N:I]wv}h+26k][/D[JN/^,x\;k=zPW\qEoQF<+I~2 XvE)        /RlaX         #L:5Yxhpdjn/E ]xRf˹<Ƚ[^z饜k{u6xaV^DAn qDK+L%<jW_E; 'A焑 6QˉHd2A<$]!ohݺuPÍF~;y\!G^1dM=[|sAx:u*i^xa*/?G# J3% @WmyW-mŶ6{l\z~aÆѭaEvz>Vs'us[>p,X :??RmGE;>#wu'FqQ\e]Z= Y|Qr lpnDэ.)  [Wtrϱ(䣀sB!T!1]rnE5J!@!@!DT:@z#50P\!{~,Yy!3)q+:)6XyjM?#ચ5kPu*Ypat=c+k2_o<߉K*?AY?\(1yۀvs"@ %+ߔ@@@@@HU/#'0nOС|K8rWˌ         @ xtNDAk0~dz|.4#LrP t` (4^=6v@n~R.%퟊[V[m?|EMJ1Y&ݒNj-;}t\{(=pTFR/XJ`.Lt`'$y$aZLfBƏ飏🐭hsNޝ0̼ԚmfalӔ9\hr?+:8}Z)W U(s)|Ԫ3NBv!;ڔ˭h߾|}櫯R۶mSJIשʪ*#L)Z64iҤ1;yr ?I @@@@@@@@          @ P+MjX!JV,X44%$Z_}xL*nРvi}@!X2DΑ{uEyI:4_7oRn1X`)@Y6?)L]tQW`@uk.y{L#F´ڴi}Gzjӣ|m{vڕzz_t[j6t2 dɒh槞z* >ց|o* ʔme*/ p0kܸqIAUX8#^ 7TJYgIcJ~q6R–N;MxcYA@ ޡJ+7ߏ()y ۤAW:im*R;"dR[88rbΰTVb jU\SQM38Pk„ uʨ;ѣ_sݧLYiP:vXY"       Zn@@@@@@@@@0Ȧd@'+/VHw9&(*1Æ :l1bV#i&[D;v)4+ȣpH^8p`GBgw1 G@ 8^r 4X1H Y~'kT߇4'xB?xr갳 .@tV]uj1;W:Xi}}&<XP0!rHW_ӗ_͟w֡>d9vGmJ |3G i]rtҖ[fb qK|"b3sΉCչsfM  8Pʐ8o<կ_?{@9gZKQWj5*W@宾}H(7n\TC`j'}Ǖm*r?/+9횂        j[H@@@@@@@@@ ]ڵkG. Vr:Z}Dʷe\#__[ziSH!% ڪY'kA {=mf o8BfW :;Soڴ=hrC=B qԺuJ\kU ig("x G}[#Ge˖Qw Rc&=;0@YKH!. eɯ[\KFHn֓nLA&LBwI-ܛl"ݕ^>&)pBO鮂@* ט1cBb+о\Ya.>/d/ v5;ڔ˭p@ ӦMSƍs;jExjuرy@@@@@@@@ j\i0         PII֢E v`Jx5OrR̞-}ԩS/*ҳJ'(+]wtW%u9G5ʳ @i/%M jFFA=|a`azg4p@vi!dCNy睵}}x5h[,0y^{hyD'>;Aﳥ)5mZ?{}VnԆ@ 1B7߼P $wh;Uމ:g_UÇAQb-[Ft]tx)V͋7zzwCH_j+8&OQƭ\S'se+p?\jH\~Gh{qfI_}8(!<|DAT,۲-%4NAp`!<\?-5K/.Hz_Z9騣Ζ@ JF =;:Xu_!@->LӧO RjYvO?̄{        @  G@@@@@@@@ #&WZI!dVWe+"Pʨ ~E.c3 _0&HO?-mYta1.]~BBI- ;ZGĤ7Jno{sY!%w&9`ߏB~m]|Ś6mZ9$lvxvN!@ ]`̙3f>#}7zQ09眣:EJM_~)}cҕWJKH![kt wZ}"d讏E |3ͨ@؄k3 3U;́7lOǶjlaQ@ {F . {!x~v8K>}]v}wi P9o KIF5*as`dzmp[JިƍI&!{\t=Џ 88:\&j[S@-_,@@@@@@@@X:G         P.$PkѢE嚟O _H&P>SoU.zM_n0bt6HJ_1o?bu4,/0l0s'yS.39i I*M1;;m i ?f͚CK֭kuQڴiE ϟ/e;V<~ o}"J0ڲzV7+WÌ6(|VѣMO>)8Zݺ)7ZHÂ/TiM+^5dN倚d RN6XH:pmx]k@]&OԊ-Dx_^)_aIQn@@@@@@@@ Pl         $Z5d=nc:#P+5IUGF]vIuIu pp4|tmRl\i$!{o˳,d;kKW^sϬoj4UHil}GPzH_}U8- @m۶T~#,QrQ_4"4_t믗~UIAZk%-WRB6$V![?,]võw_.vR&M:(y=TdL zMԆ0x cX7ixɡZ0ՄL7rvX!PZo? u#@xV_~O8WC:8i]s_鋰$ 9hQFUf̙S X4#o/fF.Jk}ƍ\LW's+9P(        #@V@@@@@@@@RH,X^|Ճp[!P+K"Uy-C6Tzqs&OFVY2'-0fٳg33GV L.yL\ J 4* g}2|7N~itgӗ_~$\A!6p[lM녴qQȴ8q&L 9 Γ?͚7o^ԄUڅtCB2رc\u~Vh`ؽE![~0@꫒׮]s8ՁK5j/e_Zs8ؤx6, _~ lhrxVzn#@6 \t4t ԲmKW]%=tR>ҺJ#uT|?Y@4A J.͞,1jrk~L1rVO<ͽ/ hi$>veyj[         @7o%A@@@@@@@@T</& P+ߢ*o\>~2+ cev%v>H: iͥn;|=p +FP +0l09a(vn]#sz!ť{T/BVTtz'P$xyp2Ҽy(\EH rֺ!A}J+,'dM O4I}[wN/iSs.~6m]|V[M!02{q@V[78dA&&pq8Km&~M;V':L+l>ͫ>:Gsộ|GޖK y/:x?>߭J]&{ۚ|yT@.]yJԚ3'Y23z)\/ : sƌQwp:Cȝ'FiӦE:9ᛂ        7y+        *j͟??E(-ZHjժb_YR_9W dh`⋥N^~YnQз&mM /0tPmքOXK.\( $TkcXyJ5CځÉ(iܹK1kuYgZkYf:}7͋Utɟ#O~͡ZIiذP6>QV˖-&M$m:V8AM#GJ| Ooc^rxg;1B!Y[:ɡgt:茂=k6k+}VNiu@H  @v믿|33WkAV0dԛoUѷ}Kp}!s'_T @]x       Z~@@@@@@@@H[ _ҮF@qf-%_yEz@;$rԥtqڊ5tK*M& P +gX)4o<xW\5kV/ MJhp ,j&ɡImpL[J7/8%cCٳ5sL͘1#ޟ/O?ݾΐ9`m-\| ):%T ۩[x:?->tRӦ 7ā%=zH6\l3SR9 aä>wLjcN$G@4_b7ܻ̟jזoW8lˇO  ."ɓ|΄]RglBGfK/M-ͶZC}m 'pqVdR8PRv";@@@@@@@@ o,yV@@@@@@@@HUVZa@"P+U啥~frK,C49&k)=ă[2G %#/9\䓥kQ0k/{w χ#PU,{UJpȋKpЕΝ;so9\˃O:u0&5&씓s>|9{JBΕL~=_?68)M׫W/|'Υ[81_N4o޼}MsJ&G]̒p$C˅5 IOh"(>M>Uc!Ghy IO"6cG(<қo_Kq _lUl)!88:uʷL>ժte%H&s[PxQ@? t5zrq<ϔ)@9sʜA}.@ (_K˵kYr:P+\j,NA@@@@@@@+3         /nTa xp=WeѢEQʫ5k:3dodMhH 4lҀh_d Yx@-/cnG u݅oz@նmr-$\k̙˅>9OMM$$q.\Xi:ת/|nǞjԨV\Ir;+zxbd D!Z_>9HhX86m,PehT@8G!Oj@ȊӶS*"퀭wߕyGsBޜzXRRq;cs$@kZ$B/@ "=RXC0]v'?P|sv`S̝>R@ IHæ JO;]ƗSFuy-2^LVG_+t߁ZI8 /@@@@@@@@ 7#        @<6Zwt 4ÞW%@VoJ^"S{=@:=T+y-Ν/ 4)ki^G <8|zE!5eGPM6J:x|n!9)dHA(ZNIK`·Z2,qس Ԫ[oX%y8\LZrȲ'        jH'@@@@@@@@@ ]ҕ1@) @s{q/}>^E@KG)w o8Ȑi K/4CkL |yX3\ u#3V#j{ KO1ðnR>NM\DZ/9}C_ zH!PNjtBRY[kZ/$:q@gKm'5lX 'KDQJp'_{i{RQU_:8xo.]5%-ϙ֢,Tom?t@IDAT=Wz:tФI4w\ꤲ-j-~̜;w ?i}Ӫ|}jDD6_ QWO:`7zJ 92Q-HӦ]s &5$;VogֿLǁZ ^(ktzRtfD}q%O}'D/~?NN @@@@@@@@@|CP@@@@@@@@@_Ν[9sjy|*ɠjʧnUI_*ӷN:YJ}J*x#qҦƃ=iIK<#+hS2h:uLL.t)S) 91'vܱuTCҖ[M>+g?)tqlRϞHaTcvh!v[N΍7|[X `ϖF~:$D%uV$8:XA!KF^(ޒQ ]B… qy80,p`SO`:umԢVN$P+~|-"9P˿lAA@@@@@@@f޼t@@@@@@@@X}5gΜte*@5kVd~@?ӦI;,裄{YgJ??qc%\20|cGI;^:@be]*V KWKuJGY-g @ ~K<#gwm[@ V|2uK+4o^f9~t5qHW]%k'=|f|OARǥn3VPu:L^=H'8ouc Ljѣ=ɽr O&}ѿf6VVF 'cǎͻҡM㹧LIeׁZ&@@@@@@@@ ʻ!        @*jU}c֢E"PR\{3ץ G%p1_Kj|x`-P?3 PYU6Uͱp4hԿT~5!9'޽㐪wώ.h!rt]K?~m b{~Ux=7 u&mtRR˾^i=ڵ+&Gp~ CҫJXeC%_5Nn*u$]}O*iyGrUaZ3fLvZMVk>%P\TĸqJ'_t+'P+~ O|7ވCnj{MҶJ5jU#U#cwUZ w-'~}Je4ƁOǖ4hto#8hA=-=d:q=c2 @ qD|T[HnYzxy@r䠎9V]Y @xSe)) 2gNʋ@ I8@۷o:C/I w)S EˡZ$@@@@@@@@ ʻ!        @*ԚbU˼dɒȲFb+-@0Fq=RVvI۫K 1<򩧦׊ OSGK.fΌ7}kuVK(?3fQFչ n8ע))z?;ۘ СWiSޏ3&WKZ        Z#@@@@@@@@HA@qVj?UU/^8fM)_`"=[O WTݙ?~U@+^Rvwjz=x1S KCH#GƟۛo.vbոqȖ|Sy?4o^@AL7l׻&Vr'ex~yexM z*N =S0z2"V#Fhj'[HJpۘfi@zғOivi%O>[@80dy7Xx \%/ v/de??aJvZ'_Z=$pCrA)Ŵ(]Z.˽z*}f^Ϛy"z|}@6mǍWЁZ͚)Ɛc,@vNjQ@@@@@@@@OQ8=G         Z)`U5jHhɧ䏄%%$l'rh}W:Tz %LvIzQi}9%ZM*~tmJ9ĠNeU=GvNg/M }m<4c4qbg9!Tp=O*%Yk%N<9~dms~lY<]sҠAqyI'(ujfZy^-[TN22PiyEg*J*B B`(ڶV]w[.i$Ƀ_yB8@>q.Β]  ~pԷt"PFI]OÇZ:!h_36^\x(:bop@-?f^9eK#}i~]ˍԮ][[رcsj|Q*ϡjեKj1ME@@@@@@@HE@T@@@@@@@@N@xKGTn4\tPjkYyȧ<Эwޑ>$oN;-X݃!R(?WCēջ8!Novyk|ԵoO-wk=UpK7(\zt채;ZO>-.0p`Ҟ{V{Sh ӧKO=%s{ K<|.ߋO)dhF_9^ROǒõ<shQȺ eJAZ`8ɡަSrC`$O7,R5`tI~Z.<  u;wa9 M~&P"V4nܸT:PkԜF;>Х        @|        T@Æ CPϕT#dBF P?w.59JJH<&OW:`iuA3zңJ? /yg<:aZ)}D9<bAϖ?O^z:4.HrAI',u*QbU!0qİBձJp0K"BL%Q qqGiSO6 syyЙuᅬi:,73g }&Rq;wťydNǿcJO?-jC͙UK_Lx?Rfq=\L#HQ@NV,럄{ϓ9ѬۇcpZ@-i̙4iߠ        Z+@@@@@@@@(@F9{cJ x|3 Z9G'd/]wIlhpOҀҰa 7H£ڂi⸻~tIaS@dyGCn){[m%]rɲ.˛Ox:DߠAmi,"%pRݺґGVW X/ ]/;IB9<~WJSVeW+5>riN>}TVʯ3"AI CRrBA MǑFIxr`Ky[zȑqhC$-5vtq袏|P޽nod;b[rͤ+>IM ?^:8pg/:[Jl ~_7 +Ԛ~X?JJk줴3W@̙qeLZgWJY]>w[sM7S^h~|])2IZԊ]|JA@@@@@@@[oJy1@@@@@@@@ W+6ȔZz:́ZT~CóBxչ$hQ$}6ؠ<عĶJì>r*TE:{Hw)/^~Y+{U>ֈ)kq?kM? aänEpCiͥ}NSCo-J@4Ъaƹհw_.\;r_ >-6m x[o^yEAin pp=.Bܹ3ZijVM8yP+! pVX>'!@|x7        P%+         @a4 i7je{]f *恞\j8نrGzڵ>@ѣJVJXN$o3+~ޛsϕBml\Y\|w`NioQ)6(HQ+*V׵c*kAe?]b/kqQA (R5a$3I+&999y- я̚58Fj̓'+6(O` @~9`絵֒M{ٳ7L29\q.ʿ{L^,I~ 饗!"q$Nzرҧ&{Jvpŋ%R=P몫!}un_Gi'ۤ3xikH8y㍒}ͨ%yt_@@-i(@-WR Ԛ2e~ѣzs!       !        -@V\$̦QV=Oe%de5_mN`2GHC t]m`fI0X~Cs7/9^zImJ#G`!%>jy"9L:,iܸdx+HRs_ 7Ʋy9K^W̜)sԴ4hP2s][o~U]yFc*!~=M-'|GxΜ,fbҼ GVM=Pkv=YMSz_bgڀJ~QJC@@@@@@@(Zvײa         @V4cƌL'g<x ,7jeW=P|hPK'(yGrY vsys夣>T:?^Qa qtK[PK^}U 5TZA|t'K~AC I%nP>JT੧&V i[ꢯ.P)/F=vd9ZX{ֱ&4eJ3ohim֒M寇J`@i4ƵʻӸt'C39Fz ( PAw-uX&չ}ՁJ> xW;.?z&p^9(-6(.R nW@-z|0ߴiSo^3giF=jG@@@@@@@;TwC@@@@@@@@@Zmys/9YTlZYh xZ. 8@}춁/xb/o~Vo mh"<~GK,~UtD[z]Y{nN>bv^]'sԸq!"@) *Li¶m/+Gxǭz/ ¼nml1~kj4i͟[*rܯZm̓h+{_zYZW_`U3f./9T`il餓t ԩ҉'J<#z4|ԺuU3yH^+odw+R] }77{dɑG&9>iͫC| ~II .ʚ͛'%w\6} EkSy(<2i>-V4cSBԱE_Աty}cg0e >&跊}1h1W1F7!裏ZY`dR@ϏI kXs-YrBY|ڣGB2D@@@@@@@@)q5{l         @ZlBG{5k,=a,e/lV3ꢋAvڕ]9sfͲow}̽=<ˋΟ?b勲zV?w!CE\=0**GaR^6֠APж•Ic׏aWzq a*GyQ`/\h77y䥊 ~+߼nT}yKݷJh^,z!iMO2.o^lMݭ5H+aumh1̌Ԫ]KI:uFJJ t!C?de!ZҩSޙfH쓼ynw6馛ΝZ֦MNW@|L/'~fxYR? Z4ƲsxГ-V4EZ>S囏aآ?ŶqE'Vt+b yЖ+/FѸb}EOT`ˬ)xꫯxb)F7ۥj `? Zlмa´@-ne?Ma9N@싩VUȟ5B/Hj?}L7n\V]h        -@Vq_@@@@@@@@2@o3f2IX`nԺ^vu^{B ;P˒}8\lQ,<|髯ҷ~ϳ~"^5yQ%pjj@SUVY%]O%ܼh;, Y˾ZgϢѽ6/B~Y`Z}!\Ep3UOnڊ'@. 7H"M yc: B4sgHq[L @ ^|Q:5ty)$*bеuG$Ygɾ?Hgb(@]',ng-t1kSNCx s4ztfC.4Dd~|SZgӟTh\Ǜ|25$(p)cdɣ-zX1آ81N*c-Z(lyV4X6a„0}}k8bb|ud-<o޽{Ȗl5{oFl]W_M~*MM42 j5׬uyܛ_ZV=@@@@@@@@Ze@@@@@@@@@ S@-/Dg唫Nf#٨W^s1 xan[J [Ւi~z矗i飛hyR<ɋFLѽ)y[ZˋCYu|޼yX)Ͳ^ُS_=+j^֏vڅp-o߾ZkP,[tn=`'#>(yqQF!zF++6ڨ K'@,6gޒk٥ߖ Ix`*y8?fy/\&zd5[s#@n{L>< ۻwnH'>>jJ$8Bo˿X<{-f{M皫KԩSkٳ,8)W{/jذa.| ׯlQ{V4zcEرc.\XxCSnc~F/n?~ &[zVQo|I)6e˖eG_xܡCB5&ZXik-ZH^ wi䷉'Z8{* ZonvY=eip騣$+pB܊\x衇tey`jܳH7Bx]>7i0.h X>c[n?0!Tȉؼ"Xy[BWuzQ#'+*k\N/h*dIwɒ%!,k̘1Vy{PvŰni4x`ᶪWW!P #:oy4yP ڋDO0A<.";VZ)ٳH{q6lX~QyOi^*a&p-h}8!A (c,@ vm{ouv}V~me˖a,W^ec묳 LyV'UO}fIVu~ՙ()@?\~4@@@@@@@@ P1[        xS >R"hb5|j= 'T9>ӛono؂ ԤIzh֭6mõ(Gq!$˃RG}_{GkV![}fmn^X:!n++]pAPzny-RhXH:U5>i @N?^(>\Z}tС@})7ah ^?ϜVpC2ҳH:H:dXZzǚ(o?9uűMlE͛7x#-@ϟ?_[&l=@ZlY0,%ЬY0.:6䁮&LИ1cs=.,e>Av4s'AVP1l~fٖ,=?bVҬYYu'V}@@@@@@@@LT@@@@@@@@@ڶmZs7^#Pˋ|u՟|^x⋶ޗC`Ϛk{ 7`-43m 놏?XF;Cguۀ,XcdžqE[j鱳,%lo ;>;h5֨r>acEL@̜6wȿ5nwz)}g!_~ꫵvQjF@<0svGϞ=[Fȑ#umOW˖-@cyQǦMJ_=cC{%PV3X#/F`&ɣM5nt-v38a PB? vZ28h]dYpS#5gyK<̕LZ>De%裥}V}a]J'ih & |SZya~:|y^z1aÆ&FCX x`4`mҤIzRu|lq%XlsOGՋvfgtrjsŴlԚ34qc{[z%ǻ]c$8ȷ4@@@@@@@@ P43[        Um6LW_UU>^%oT@>=0fɒYy,E/կ_esV(Y=!HWK fmt)X]떟@7o}7ܼ_ux?3:#5|vN_*ӭk/颋!A)mF ¾o,i𰎾}6k6:@ xX逸J&QU !c'(tUqɂr-{I]M׋~)WalO(p-z waZKbJ쮽ݑ%ot뭲:whK5ה 8!KG ;e_[o}K[mx }ev[!L5[ oH{YgW_}5Yxq!vq4?uUm~+-fy7&}Ϥi q譟'uMs i{עErg~q[qԳgϸu        ԢZˢ@@@@@@@@@Zk- tcS/',Fl՞m,w/6*~!7z?I^ȝ)oַ~kAgU4`M:0o,~ggjq?j,u-wwHK~*ڶmAV] և@q FKÆIcJo^\G:,i2,:Kl9]Igh4y|e7J]Zz㍂:@ Y,]zxSW$;1DOuw/e]F@ E .M4ѡ>N;Ny饗_~KWk?y8qbS*3U{ j+饗 w]UO(͓pBM4|X/        'j@@@@@@@@@ ~kM#5hDXx0^V-嗗ߪ5{3f6o<+?L~^=zPO֪QE P -0~ojԨQ~X13gf: y2 idPGW6kLja#O?II[l!l :VY#yhFk{O=xɒ%Z˩c/4K>*ypm4rdw!åJiiNэ L(ٳ7C@@@@@@@XJ5         @) Z>Y)v۽Xb Yn啄VϽ0mi|'յkW=Vn3')=א!C:X(e~gu]:j9*z_ $_믟&^իW(Ν?_;ve]|Z1h} 珷zK~:w<'ҌY̔2i\'xB~85/L &MĩkeuRKOkgiSBʾH++d/a^]:W_-]y+랥<ZJ7ި=C]vYmuZˍR6&|HŲfRZe3OR0K/% /Tz"ۤEeذaѣ6mO>D떘D6׿+_8R1|tǙ>h}]DX{PV?M6Dn֑uE&MǪ n *]:gV WgwR -_>4O^oA썸&mh       L@        _ٚ1P+0\J ԲY *}Za(~:c+N`ĈdѓNZvjY֒g(E/z?'~VV]V̾%*ydߛ/:Ȋ>C=pr ,,Zt/駟<ߘ^+vɮ7ސV_]}wwoe[GtzϸUkiORYN<[j}iiIγ'fb!0sL=:\xv1H=G}5h,=E]i|zمV[m*ٔ-y7N1Y;*G^i(*6Xu[n!L0VXJf?h        #)}͖"        @!^/b Ԋpa.,I J[Wn`_O>}]+b|_~g:qQGij߬eE90KLA6m*_|Ó=h5W"[kL /0ٳg믿c=&U5jT(~gK5c W^֠Ar ˂˨?2=3Zx'B:csԚ/knN:|a,B~)mYxn]$J=f'\w-=ij%[oWzx%RN=Щl}+êhl1k+z.^ME:=7nZYdF/[Ad^O<9׋-UVfYfnCz^ZOsWQ7ٳgQo#        Z˚         k|ڴi%*.@[.1>-Բ=U9M:Uh-Փ߲m^t|L uYz嗕H$!A_ *TDps/.7ZX^axK҃ڴiݢEׅU$eY>Xh^`XjٵHݨdC޳c Z)TW/+~gyTS)R~GYاGN;B;wtI7&L fI:r-s}\|vr-Lu|0h#ɾw֪ux&ʤI#HW9̙o6OlCW*A4W<ղϦ*|+znٞL@y2y<||+3~[M4q=3>f=v-M|x؎#-U[Xvm'Ƿ믿E]/ֲd#F3Kyc=tgJA _|MyQX'tRwڏ?xC|ɰ]tQ? ?Y62[l%Fgu-誫ҵ^kA}&ԏԶ%_vxpU\[FG:Tf)4/Z>kM6٤lhޫ^; e~,y>}}oiE;y!ʋz[iuI1sZ="> x̲J~մiS 8,@l5xp嗇;P0k] ǜ]WZjS^Y CG=Wv$yPmY3vM" ϲ3~ י۷ p@x-ݵRx_5*Z)uvP]zյ_|p:te]V }T<=EW:5l%wieayX V '~~l%z585>cu_ xL[Ed~JkM7 cd>FTt٬|ja ?G~JwQآMo Iu>|ٹCtl]w5'觝vv}wm5e}lkۀJ[CWCT@Jybv,͑qlvjy?~ڶmͬ?-shel        @i ?!        @5,p"ѢEjlq• cJO &wY< $shD/,f;Db*žVMٳg'lbOXxV%mbNx}7n:uj^KԫW/q'.\8B" +P|<ĕ޽{ 'V]u0oJsIl6 _M7ݔΝ;'~嗬eA> IXT }`Gۗ:cEYNXKX!-d,jö/ۄQ?)Nӭj +؟cKl~%>oaa?fxV8 &,+aWo d?}[,4 bc9&%j.R`ҤDbKV Lj:'I+{%$a K$/.-w}I$fάrjcގ;p x뭷@ V\~M:]tI{5oVY+V:7J[ousȨ}'N~=pA }Hw_"qa}v+׏ϫc&?8#>}'2e}OY.1r/Lۂ3y뮻nbѢEa|oW\7* t]ܐh>ea`' K|5tcX3ƨhl7oHV91+MI_7ǫ2YFhL._}v>vU|Z F+\O ^W[jUg}5:7#}'!@|@@@@@tɥl9 PH& UWֳIC@@@@@@@@] :O># H ưc+jl+4X-,6L+_<~bRbc,۞#y߽]}lc ѽޫQF›d4|.ɂ뮻_;C]ꮻ Y|bL_|qXޖ[n)+v/ xw2]pI'$+zw]+N;4YLQihĈȲ"~0>}BdŒe> 70nf[V6<^oLYȅ,-[|+w5n~c߂k,PW]%u$guk.תΉ; *G>[dg{4t ź߮7ސ]ɮdK-ZTyB>O?SOu:пX|p\uz굒k-a{~t_յRe׹(JӧO[-$\E}'N;ˮ ^}sKG)aOj>NjWA,]xax,^?qn{M&Wϗ<ɂz뭧7Z.Ǜ t]1cȂ.ꪫuGnŊtrZgur6jll3t'DZE -nء37Zvʲ1c кŵg0XkL=x7گD4@@@@@@@@WZ"         UO>_@-7!_-`kjd_z`QܚL}z .GqLټw߯u;.@@@@@@@@e*_Ag@@@@@@@@@b P+{؃j!%L b򜩟Nկ_?zOW8~ԿyWڳ:?cηo&曵뮻V:|5;O<9n'NԔ)Sti]guM0!L۱cǥ².5A-ya٨C>ڦhߤV^\ߋGr} ~ܗ_f<6q]w^C=h?ՠu2oV[m5 H1ujD9o޼i&^dr&:x馛õ?n^߃ *ko:lذs{%|դy{lMüu$ִi;ٜyTʋ}j`o_id`Z)ͪgLX>,B<#Z+BW/KXDt-o+O]KDWuONyp}[պukx1/m_m]+<#{%ϑ{ʮI#lUuq8fOuǽK/B-[4-AW<3-{.jٲ.R+$:cA*w%Sx0ejέ}k8\PsDg9Ts8:ѱת@_~ӧ/?fjj ?6. y1g:?Ӵ)S!n^,8}ɱW{!U ~%qD[-8w)?KИ1c2g_ s1*c'm+]lwɃ2jڵ:'J(L`7Z:UEcanhzٍ7VZ)L87B^{ڷ6l37N_;¢F6-?o5ogVǬk>>{9}O_:^~J^)4N::{oV+LC9GׯljV _q48f-\}+:W\E}H7^:0CX齖y=O?GSO_'VΝC*X}u+W-бԡC<~,׭[/s7s76*濉o\z*mc@@@@@@@@ Pj#@@@@@@@@@Xoz;Z6WM~2Pk>|;0{졽K~mN8!|={jԨQVT1}Uŗ_~9vwo}͛Do޼p경gj6p0 /<^؃ټ[z_ͤH?iix5/bٿ+K-wߵp^_ARC,#G*p ޮe[_RNqlXED/>ݲeK 6,m='j֬]t lԕFKMޫAZ_tgM6s=BvmUV8 97iD>{イy:C矗=;Cg֩L˒%tRf+@-;ۧ}Lw!i`ӤW_,$ͯC [lw*k%$h~p[n%|zl?ukWd.E`'?Ǹ}}{;[!*:0ut" E+Bj;óS⴩ޛ-_=#!Lkwbkc{r5OOJ ߬q+[,\td|S.1xA`nAs~xek! 1d~i eū* c "}饊^tm&)7OneO]{6EwEl        @jUË         Pj:tЊ'ڦ~{4nľt,'ŋkek-+* ֨|]wu:vDZPS׿6‹G^XnUҞxE*<\TsC=o~[?xYXj8ü cQӦMCN;n!+2LU#8"~L;So*wdjݺ[kV xMyy5Hal4jBv&5jnը:[E(R\+eQX[nKƵo{14d Zv8/Wdeq} VcR+$Μ LRb%Kq9ic}N[ljW3};:,;V-G}^U4ޗxS&mE>6TG/bxҍaEG'ѵEt.ϥ[,?zl$3>1dq&cmqE?vl- /o߾a 뭷^繂9;{$hmb=,MX2YV⨣JwsV5aR 9 SO=5o%qw5LX;n߾}V$6ѬYOUN`EõMϞ=rJbuIXQ 'E>_E7ĭ=a??T={'zUӊLޫ~헰NZC.]^Imo~>ouw~Z^ꢳzlſMK/%?qD׮]rx'0!y3'as$f OLZ|p"v,5aõ_ow;,q&,x8aeTZɂ5_4n8׳s\sM?ݵ_[-[jr+~N.k|VJw.I$O$51cF6Һ>9DbSw̱o>SRTwLƯ}|©W_3<3M>} 3]@0a݉:(ѴiGxW҃RVE7tR]cT4Xs월aeSٌfڙ}7TE%u1rg)[@_ǟ4h~{j‚k~VcB>v]$J&e緧ٯ`x O}B@@@@@JO7+Job@&LUW>/k        k:d՘Y*Cŵ%ٯw^[c9T?ҋ/Jo_d:g 'Hg<%+V. olZj/Y@7oc=odA3ܴ4ŋkVX6m藙O?q"|l!:Ὰba3 VwQ9BdEXf5}tYXxBdAe8pdWhڸ#CH@IDAT"ǚ8q~'YQ`W뉖ciV --zd- KVVcǎ_, T]sM'Y,@NU^F+}WΝ+?s?OSU7֔)SԩS'Yty cke4=W>\&y?iΜ9a&?{dx9裥 믗lHF㏥NnA:4i ҰN},l\+k%_ggW_}%^Aʷ\^+_v1mXp.Av}Y[Ii\(Ѯq#`aG]z饲`jYXP|OoXke߽1 .[p^WD]}bXMhl4&-.}ms*e1_{:tZh}-o ~qUI66,N?_kW7/$}KO>dY~ta|}E>ik}uu 6{tŬ ;UI     Ժ7N @ L8K]jimjRZ l+         @nf2)ԡ̟_+dU<ЬiM7^|U{ !϶ǻ(*,;iy[c5}1/E5I YaLYAUCL^ãrR; ʶ?G2* r |^l8?6>4_/X~ս{J%/cU:QR2=*Zxhqx =^xzguaY24Iso,P+T>ثʤǵG~dr~kҤ<ٻ0) /99)Ȋ"QA.f1,bVDE0⪘V &TT$A%)HUmNd:TU?鮮]3]hAg#Gx}̑ƌ|3o;UlRwO'oGHSw~@D=%gaK/|KJ? w^5gN 5 _Y@ek][R3v{9H?OjoGr߅ Y'|>o\n0ecOv޶^zjԨ;n*ssm5~f}nߟcevqWjc/-UT\:0Nw2;2;61coj9}*mv31?ͮz>Z}7zjr-3%Fj~7n6JVݯ-ݻKLJI.߾zgdY f߽ Tv0`@Eg@@@@@@@@r/ r=D@@@@@@@@B/мys͛7ϛ\9cpL;cT'+P&vPu&W I < ^7ye޽U|m(Ik,kK,upO^K+Wn_־}׉ A'>e<.=>fvS;c]ЂKZȦsݤj&|WPqgk֬Y{&l~رcǺ-ETB,@";T=ԦMܾR(CR˹SY#TZ<6VO:p')TTiԯ4|r JDmgÆ gk׬GuT6kS%KJ7k w+/{% KD2e~Dl:Rی˥SO޹_<,O>ߥTReϪAA$[Rݻ_l /Л0jժ7ސN8A*Vgve-0g5n82<3f\SOexAȑ#ރ&[j^`Vx 9տ\tNB]-]*NC l`nvO?=֭[kԩA-/uUְ=!C,;ͮ,{%Ѳ s?L"kE+DZt=xCuYT f*^*h>AyjOk;^skGǏ/ 5Ѹ %饗(BQvʊ1B2Tev픕_:f x߆yZK]H=z"Kn1.#kF|MJ67ˍH_}%p@B Xc=Ҵ|P 6t!'{cU@0~Tp)"~npv ͪ.H*U*:Ow@ Sn__f&U&L+S>h^^(\ \h´;!mc0ZCܥ\?xlMH\g#=Z4HzIܼuQ$իƏŋ \j衇5kۅ$'Erl{lR~{uᇫJ*ڦU{O6KenݭΝ;7/i.Z9ݺɽG?艝d*0PArjSL!<1RG        y P+f@@@@@@@@@ 'Z a%P+G(j)͞-Ci蒺^~e\Ro6l|P7VݺuէO=ZhQv̖@ +Vd]~j޼7M7ݤҥK{azo"rŭw*R"q$wܡС&!p9g~BP,%"@ܻj^:T6Lz]z6;S'?L7…C G %#ٹ穧ߖΗ l_9 B.\Hk(9s޽K.;/%RT5܅_|Kz;֭\ʕ+{װ7p,$zÆ %!@fOtO?]UVQnw7CuG`*hѢ&?SftlBȱcz˕W^5k֨N:ܹ;07}'yPBk!@BlRsꫯҗ_~-sLgwGzjӦIӧKO<=v{=M8Q~m"CM:-f)*s2u~ցuۘ{9]wH}'5h.!&`/yZg!u݉_n^z}hO d~8ݡ).͖۷o?c qI6~ѦMo\16XvUn@ &%n~ ˗RtxolFmƍش@Bғ QKgSXjw;P|jZV=λ?۶m8o!       I@0-jE@@@@@@@@ s6mڤ%K&m(kRGLz X֭yI?.wn'K5j$[.2ڵK\Z-wy-[杛ڹtC\WtaÆ*h3w@ ! .&4i4yd/\r^yDѥKoMrfLR{y^=4ٍM8~-Gy6MnIJSJ>nP<S͹sCOjh_.7tmu]X@g0]C 6>N ӟG:vܿB.B= ͙2e{v$}%?LxSpzM%(RmAwtэ7z!=_|73hͪVw*U$4@Z X̙3]xw-N> w9 (ZҲ(_^Z$ux6vMa#fZX8o<5i$/ z+F+P~ZjB         P+~@@@@@@@@"*жm[/&븿3F&Uݲ ܟ4< rs%w%7qt۵d9ɖ+'z_'|қtjݺl\[&kѢʔ)g͚3fplUVpߕ}>ٳ9Yf*P@JzsKEՐ"S *>bĈ1j2D.N.d2j=? [ Ի*AI>gIO=%$@zuip_??CΒj- ǮoF=yGRZ)B"&PT)uQb]PiӦy|^xz뭲P5jxc6ئM\c56BC \R-ؒ-m۶lٲn`o򗿨jժxiW^y%rkC{wQkkU;KV Қ5r=wZ$A@@@@@@@@ u ٳg@@@@@@@@@ P+MQ U^D iQtqrU ʬxl9^;v;}/֮]ԭ[כy沉6m-˗l<@ltIs~fϞ3gz,Λ7O;]RMgtPwi頃B[_@H˖I"RƮ]IO?tG[Ɯ9Ҙ1қoFtXz] ܢEX=\[ AD |}y&wVct>=\tIڵk_ˊs{n݂SD_H"^\~^ׯ_'~m 4 *>TXbl\Bm9, ٘-fҏ?-.]cR7ݥw'}ذ7fnXB֭(,@ x~x4z^: \Һjr)QlZ+-~-P˾!       Z}=        d!P@o; %-[$oQUN Z[c&l"젴… UVһw=e-X@ӦM>#<kժUSƍebQڭM4WRhD@`K_O?ɂ Zhv-L~-p.Ժukﱂy9Ke(/kKh=ztʦ)CȽmK#+&}:TY]Ӽ!@\=V.>\8PK.`#wr+GӧOw\yH.X+.w)gW T!j2eʸ.e۶m^H-y֯wPBn,qŌuԑW5kS/ڸ&-[Wc9~V@fh KX_侳ƍ#P+ǰE^Vnzemժj]uU~/        @ q@@@@@@@@IM6"P+'=ٴIn=Sw!#m%Vn]r|t…f͚X-~=}fկW71b۲ qm)a@lŋk…9-?{mY*UYG&My^pj\)Sa G L.7h gvԫGr;PB ܥ쳌]yԱV[ uSN_ )Soʖ DI@J(! 8,`ٲe^MlLn̙_vYkec6q<1jժ17AC WkL16h㊱AtҲ&Kҥ gl+VXlUnS$`N¾Ǡe-`;vH}Oz<nݤ w ;UjJ/rnݚZ2~Œk}֌>        @8 qJ@@@@@@@@HMҳaoRFvQmpZjժqtu=RmٷYY-\M>:i$^Qlb\{}IWzu[J*Z2قw),_ܻo.[8M]n \vN&_ mɘ-4.]saZtw"i.]~SN"wŶ$mEI- p ~Rΐdϟ/Ye|tɮ!@NnR}&{u[dNsgy3fD.D8'=oȏ>*%hlϖN:i۷ Gwl_6hG[Sf6htQ.m~Obo[E R"Excඣ:Oآт/РA//f Z; sRnmGqk-[Ν;5{LZ+B+3 Բ@        @z ǟ#        @6(cM!3ciR 9q&%NnIB+`!.7X/v҃Juw-\:W\>y&./H^'q!n6S^=oɪ6m+o{3Ou!dcM.]zϸblL- )xb쾍5آ=iұm\qK8m+n̎}llZj:蠃qE a-6hDaÆ3gN6,vHt);a7~߽{ }@ OC@@@@@@@H{fH_@@@@@@@@@ +bŊUV4i:묬V$ y-aCvn-2vmJ<|{GM]A۳[ժU[rm{µ/_Qmԙ3gz&U7).q/pcK_T)-%J/-v?a]zeflݺջݼyl ]6 $k} n׺?ح{!skW6!qlb]vޤƱ +W'D&2]$7w?< ؤ< M}|- !˅2Ax X9M,Y@ޤBgK/zF  \]믗;N:x顇\]=풷w+z=-P6uK4A P6^רQ#oɮ0`%_lY>=aMԴcǎ?m`òn96hccvآ%fc)ml1N۷ok\WsƱČcvcv8B7o׸/֎-4h{/:Ɔ-P v]쫮F niӦai[fdN<49jt@@@@@@@@ ;9@@@@@@@@H{{ZipTMʉm"nA.@*@8!)&&mVcZ6 nIX3=&ls,XW@T,D* tq kYP-Eӭ=VP!oIbc6qMk.Jb۲sNo_-V-6mtkU}{lu&w`zjܸ^ &[ ЊMtk/^zIbZu]y*` /M*Y` )>y2f2b4lgh5r#e!<:8`trC[W%ӯԢԿtrp{WpKӧ.b:x,l ˢ>< xaS:l<µ2Ox?cc68h7lXg\1ŭ[fn-,bʕqŌeY- 6l(1p Y@?Dkˇ3eGe˖ir(Ce9sm۶9`@@@@@@@@>"        @~:t+^BLlBZJ}\lYj+W4ȟ~Ĉ֒.{1-ɖ6066n޼ٛ&k2 u>[q Weln-*ϱIl3*h&ŵD7wz˖ml[ -{.ѣPAqСz'IUh E:D#@*:,kǥK.IEۧˉƍ8{ _-DG#N'Q{cqL1v8cv(РA/@S^w-ξW]*ݠ},PˮmCy$`Z6.͂VwoO}ڦMpw@@@@@@@@"@V\        DU6nܨYf&]N&̗ RW{)9IfT|jr3ϔB:^O&-WdwȅiIoM.0G n|!ժr"Qĵ^Miph^0o\D< d+K|#n K)F .SY\/t![kg}VG}F+܀-cJ"5\)-#@bA*T9u V<}e!`ZϟOV6Qɦ{iT&R͚~P+Z9 jJ .ԺuTlٜ_5rV-U=ȡ[t,?Oq~zH?>d}u 5y2aZ=^S&;wʭ!.y17GnR~uQKukҥ\ĪusgO3 u @nUziڴOdU(wU}.Э4n\{-Pڌ3% !zSV֭&ſK@@@@@@@oPu         @  4mcZ6H@P xYVJIy>֮$;ϸ\, r$JԡCvfRGq=zP7 +#+\3%S$B_ΝC#s7O:-| ~ԤR:x @oϛ͚Iq|袋B0utRjO'ԎQ@6mRK ԫWOKv?WBN:f+u.}eKu|?[n]-[VӧOߏW%Q2eos§O        M*D@@@@@@@@H tQ'NTz_wŊRѢoyݢ;E3jmI'IM:GC OA.5 u-sΕ#`a;ŋK}f*E|Sn\Bɓs~}X8}`r@  IIgK]㎓ &¢nq3G=Z"2LjHW7ސfLW 矣ҝBiժlP,´i9 hт@ݻ5m4?i        85@@@@@@@@@rԩ7yƍsX-P~} PT`A08PZH2$PEl[;?LNܿ5H~p2`|-[kԨQl$\B\" HҵJ'~Դiv]؛oχL#GJEDct,P 'KHnx}?UW]+܀-iÇK<#=uFvˎ@\ ͥꬄ@`ׯ_~%VB%OZϘsVV ᵐm6$S&        @J0G@@@@@@@@ XΝ;MK@ٲҺu)-HnjY-&~4{v(%G_FZquV@ egsOJ܎-H|[#׷(wh(i _(!KH]JCA0O=%/}o/ozx@1¿6y=_ΩS+sʖ}s!遅u_~tR!)2@  lldO?I/yTZP W]Ǐ/GyD%K Wi^!K#: B,`?k'\)}$ c}rK\HY-kѢz¥*`*u,}wBw@| 5uF \6˗`:W:ʏ}eAkg+Z gZ>/TYΎNuЍ j@@@@@@@@ j%Bm"        @:uDV*Z8*!hZ I='}L,K޽3]JMJPm6]veѣN8P%݊w9hrjӭ-utRnҤI%'!u*M&}t䑉#G ԩ#eoЭNOi={"M5E89 ~9d@/q* e4OX#ϝ~N$t Բ6}$1u=ka қ2eڴiw"        g         @'jMKZ)-PkBײt-OJ3G:Tν'&0b'OKG˿wܡ%KGBR t>8eg '㤻~X5J*]:NO̟/ ]+-k o;.Yr $+#PJ˻@vO.YK*}ۼH}%{Ԯ][ / Fp+c׏I@ŊR۶W"zS%լYd򈷰jMum        W@@@@@@@@ȅjvϚ5+kJJl8۠yoMΓvVmT#w.?^jD>\*P+ttWH:0UwiРAUN0Z15פ=R-n^?Pv#eEtaRҗ_J맬v!(U~K73),?lٻ{"-붽m +`7,)-\: ,LBJHr9B^jѢ'Э4n\jJӧOOĦ0jٿY>i&P        Z={G@@@@@@@@!`*UJ&LG@jY?߿ 7&p_K#UͲ!"oK>4]wM;|p(P z\))]yT "JLW/% " *ov-q~ޔ.׳6 } srcS~@IDATwM~(edf͒ZN>Y__z 9IH%KT9" x.W8Pbժ,VP ~dCݍ}x>ﰁ5k)SRJYfb@@@@@@@@ & #        @vJVj_/ڕB} l ~ D9*gO?ߟO+@R,G b۶MyIa_L 8Pի<dCť>}\%!@Feˤn`W^ \N5-O=%yt%ҋ/e嬊d+Pd!~(լپL;ÿaԣdV^g@` uҠAN,X*i_:"y Q7.][,Pk۶m3gNܶ }N6m@@@@@@@@R$P0Ee         @,Pk5v޼y=*/On]TzD?+и4wn~[p@˖)H7&n?l9{I/nA:Y з?~A`KRj!cc0vҚ5;=Ch -*/=d4$Pn]-\NűrB8nMH{wrs86m"EhڴiY=5Pˎ@@@@@@@@(@VF #        tA%Kԧ~Z,x.j%7@y$7V`[ZқoJ~(LZ,gO/&q < ̚%]ѱc_ 2xK/yaZUVd  !K5kRC J#Ů[&7þ}{.4eM@ 6ĉ~HmJ&[9SHtz}ϟ2lA[Id| @ǣMs{ 5,`ZX-S U2}# `!*%$ [&P+szj C@@@@@@@+@Vt-=C@@@@@@@@է~-&d_&7kN:4m*m*K{{a+H< ]q4vϥ_lHAضM:l&0 ȕٳg tWS8?^:U=q(zyVzI?j Lzs%ty#(TҁJ]H\U(«W[v?s%f!2֫tY @\_d4"PV-toje}& -*uLVnjM>=7zr夵kՅ … Yf*j@@@@@@@@.@V‰        DIk׮Zxϟn/jP%P Բ6k XӰaA4+}RM7II/dV_6lؠO>Y-Z DpI-;C<XJ0_+yx9:M㏗>XC? @ uJcAv2mc}&G2=c-hvmɂ`}V]f\ @,Lk,0@,f͚jes'"OuWZh"79Y&k >cZMŊ byԄ        BRϮ@@@@@@@@@ |;vTRDnkZlbǰMt4a23g^(qte9U.]*%qta5g`z(|Sq u) ,H_zNV@x/O@g؅6mx[(r夵ki.h        +@־"        d#P&صkW;6x* Z= 4k&%PloU?WæzmBϖʖ ~TeyI={J眃G< B GUwUV<66R `x[ǧ`rpZptҸqR*9XZ:Hi\Ϥg~DR,`!Z{KvU+P߈j+YoAZ6ea/(Y#(SF*G^u*ϯZ OmVlc3jԨ+›e!g(        wn+@@@@@@@@@ :(?^;wLstR佶l)c+sm=&<ܟPu}#OTʕȑҕW9`.mԷt~RѢI/#;\\}Jwϥ-B%:/vȺsvMyt≒GD[' 7pa=]jv[W\!ٹGA jeN5{(Cn=[ 3N3|BEr'`ACƍ{ k!J:uh,!&P+Ї'nuugxCUi}{8T,̎ @@@@@@@@} ?#        d/мysլYScǎUǎ_g.oq' ['Apu箻ҥ~ Jo!\͛ϖ:w6HQ  |tҠARã?tqǩm۶6lX_ȚضMzq颋RW!?({W}]ߤn|G tC 4@ ժI'MvGΝy,cv\mgvKoY|VZ7hnw3p%ϻ\zaWhl)RȞX%XLi)Sfm~Yt\reUp/fٸ훷6 V+ |ݰtvZvyi{ wW?EOf}ƧG[vmO뙝. -g+i͝U?@-^zˤ6@@@@@@@@ "xv        8#@#!&[ SrZ O_X\qcIngZqRsT`_$Y`J3?꫓nӦM:ܹFEFӥQ+5=E ~(~vYn]oP[X:@ XpVǎҿ5ee0 tyW.JrUb}];j25kh…{npo,[, n7[Z>ȷ!X?֮ A[ ۊnn!cPo+P \ |B_H}WEQN=KMh!QXQR?TRKڢEԬYu/T->7onqcV->w2S^X6me͝;7狰jM6͍7G        /3A!@@@@@@@@@ ':J}qm&si}M[ Qկ/9tMLj>%͞-TR8ǍȞޟ405Or+{t~ȑ}e%}vz꩚?&L63-C=.xI?gOgB PTKps{aZF`\WNP2@B5ZlnZ|/kYIݺYg /Ls?³,*ʗ/RYUwBlҷ*ƌ}/S,Y2҄ZV,`˂, ۏTƷ،34f-Y b 95jnݺj 6m-M4qcU Jc k[}Vd} ,E52TZE/v.V0 }oϚ7o}>e ʯW2^?]Tv9b        ! P+@@@@@@@@@ es).=zH}AiTMf(Ъd9٩䫯)R;H/Z6a7'dٯͳ^c?8 .w/\8x٤p XԩMMC %Y`#HwɄ9յdy0vs14@ []jMB?}p;wV"E\:,-ZBS5[6UN/Dn-(+Hpomiu؝=;w Y,8lΜ9^ҥKu) zamڴQ۶mծ];Y @jR߾ҠAEɝ^1*UJ/NWl1P} EX.@ڼY*Q"G׊+}`1gqF>ܗb]ne]Z)@@@@@@@@ 5jƝ"        @To:#P+DzbEzSvx֭Q_fZַJ*u$E4^_?i6i4F%4e+Ry>/0dԥt =@ 7Jg@$aMjki] 7aZ=W`0a&NI&yaZ۷owP˖-eaQ'k mڴU`Aw~]BTV-od7uyZgϖ->O{[j5Rs!xcǎ.tѥ.@ / &(~2"I c֟H X }WGGkq]XVT[r~֮ ~͛6}9NC@@@@@@@@ 2A!@@@@@@@@@ 7{L&HK@J֛hѤX6m84;V SK.+]*oOeҙgqJW_JQ 7ܠ'x…)ґG2[9s1c$;@ u&wx4~t衩%{6î]% 2K>R?#0}0O>2w1S µk΅wrWm-@JlٲϾWw}ɓ'{dv=3%..\Xt{n. sýy@ ԩ#s4pty!Hڵkő)_^*P@Z*x825kʅje}X[n{,B'Cӽ-Z\@@@@@@@@%9 @@@@@@@@@`,PnӔ)SԶm$+VH5jxI$,Pk.ͽ"E'w.HS&Ճ?.X}vعS:,"7ިx@?N=|{CRGt L&\.-M(կ\^,L~Ǎ#L+@ lrc]￯>@ ,pua骫ڷoŋ8 l_~,쭷ҠA?\s <#d "7#JQl,Pk]$`Ax'>`)-k7vXr*V!~* Z@dÆ UDkS:        @" &rl@@@@@@@@Ajժދr7׷ʕ,P@L&/SF..H4n-'Ƃ ܩF\{w4^\xTG LctpM7in2:쳣4뙛ԛ5 C}? L50%K# Əbװ&E-n:/GO:$}:s_h^vvoi۫[z쩧zJs&bTYf^;>4@ v}pҽ2.l{{ZjiѢEAYZr-P>2,ڴi=3%j_(gj_၀ޝ>}Zj( @@@@@@@@ A8 Ԁ        (Pk̘1?E9~FVX`bv9Т8 RIw)|?9c9sIbAj4,ҠAKmvu9A1bz0C3{%}\qe=*HFGHJ((Ѣ4͌R2 ePNGuuǹ>ǽ7y=q;.5i"x\xt9<ʪ/^=)sf´g#G4qD/<ڹcǎiСڴi~G ʘ1cX):YpaN}m޼Yg_?X+WvwZn] @ lsd(矯 6bBOyHfO|u}c93ǚ,XP p'/Nn!}nC,]T*T~A@@@@@@@@ P+i@@@@@@@@"@qDdDsmi'\,&R?cɽ&AŞ|R:x0\?tj\Ԅ@j^-n-=F Qǽ w}W-[G(εo/e%f@Ϟrﱾ1c|AP!Խo} eP@M"Eyڷo^{5mٲŅUm&@ TV-=ZvϟnA#\^O>ѣGC"N\9_n߾74!w ٣{FȈ;ܹ hf_v4}z1zV}dɒPJ!gNT:`߿߻)_|"@@@@@@@@pEA@@@@@@@@H@ )S&o~Immے[Gj-]*ܕ-*M, (\-+}u8 %rcgO[BJn.H6,V9Җnv/Hk„ a5:{F?uxM(pԪ򭷤޽XyV2i\dU@"0d9oVM6u$飏>RNK:u m\r\PUTѠAa}ʑ#n6+V'=,@?.E,Tx,&ONiM@ .UiӦW5#ajeZ/>fa]&=PBhw!       ZiO         6qnfqƅPªI[Ul,llV BciD RʕRRFRr&aYgQA I6"dɒJ|ݻwaÆ.8k}WjҤIDnE*R$2ǨET!'N ;{>}g r^VBwz)0sLժU{9Ӯ]VO<;+ܟ P#w ׯW˖-sK.%J\Bdi}lT`A^VuuZC^ׇ.6;Q@x>Egg#j%oZ۷' k#GO7FΘ= Zb:C9{C+vŮ](        '1,G@@@@@@@@HM7ݤ|PS[H@iU(VLҢER8XC*\Xc_VRM-kqjǤ=*U"`@ !ܜ.J*Z4jfIⷻ^̙ *Z[Tv3fHKHov}eM-L-!LIr!۾`YL%"@lR~XSNh͛jժfU H߿6h K:zڴiMz!v{\fmu'~ҤI\&;vb^wCV|yUZ{ӧUAS.wQv) `ǯ̙3{Ǵ3lsڕW^) v8,PΙgUT)-{jgh]˔)t҅vG        @ 4         `o^_~nHRȏ!~i˖& MW܄ҝw4laCIߤQ޽ޒutfMÎǥ֭%' `T@*|#3H\ DA ,&?s .QGlʕs` X!ٹcl?ȽΝRҮ]iw^d @߿]+?.ٷF9tg4W^ڵ,Xɓ5rHwwif_jV\a. /ˮ֭$u]ŋ'P@ ,Ng)S"y-,`j#mJGgKW\!M.[}ؘ}x ʑCڻ7e˖݇@@@@@@@@H:V!        $B EpؚM!Pys jHTIZ0Fud(fҀrigdВј1RLكmHM-&3m۶~.Ls!ns܍8 D]WT5fa!PHw.( #9"y*Djm UJ<^z"5P+G} `          @@@@@@@@@D 4kLה)SD@RRFWw"uW|Rr%K=$/X˾_:156GJ[M,=hh^ @ǎYhIΜmvܩƍ^ȑ#5tPeȐ!MY!۷KGK;KyVF U|t'Hg= ~~5j$4c/0܇ϟ7ԡCa]:DK/2f 8pS+ zi_OɒR&rrŅp]~BNh?W;7TZ-U*56~нJ*IgϞm&K#|>ݧ@>ҽJO>)*v)}G.R7_WS@` ؄ZBkw}텙@"E4k,լYSS.wwYଳe p7=Եf4nda^+.-uk `b_VaУ^Az YݙM^xqPժU;NlKWRla?@H ?.=ԻdvO= N<(pϾ <@5~xYVzҢ iKO$GgIpV.ZHvDQNߦ,O@,Y4vX5sk3ҥK玏7hҥSW=C^a;weΝ+5wܓY(w߭v/e˖OW=17{Vgڵ5m4oU:KwΝ\gchԨ -[ĬLF;8$8vci.~ճi:'`ZI {W_}k̘1'%M~N4v\ܺuu޽z뭷t:?}xc@ܹ}5n蚩/\fΔt *(C ^@k{IΜ,˗/WrBot @@@@@@@@          @ D;vpS QG 3xqz*UԊ ̘!7ٱTR"rUK}& [~DRRNkH7ZuݻwEz)S(uCi6cǨ:F (_o&ޠ4э:$x$r.rFpB<=z⊐}b -v) صk]hxvIZH5НJWR`TDwy;6s.ȳ>s/±l<܉w}&qi?$xO=z9RM6Uƌ;ꫯVŮ.`%̻{݄ \Pv 2Du!;( ,v }ML :R曥/ K^6 rtIei&/Ʊy ~aYp~ȑo5kjÆ jMǣf͚yǞG}Tr>DsΑ  ;>6,P˞sA9] k֬K"2P˽=yed@- :         p&$z@@@@@@@@@ %JХ^M], JIj%0w\YZHnh gs=7gX:|kWi6ݟ}Vn"J魷|)]H5 , :wy&&S%:ե$ ,7I/1%aƍ=ܔ ͓ *VLa$S{CzԺuk/6դnjR6mg.{l+WNv}]өݳ:K|3_ofkԨ&N= wY# N- Jh[_=}ͫQFhѢ'I,l;ҥ[pz웄oN&ބgi)`r\FwO̽mSHs x}ؼy5{UY}RJc>TzD?Y`1coFYkv Q\-юmڵ;YOΜ90޻yrE1߂ *:7m۶#>S%P+`aQ}",P`~W@ He6lpQٲeR        D@C@@@@@@@@+ТE _5kVp}KQ}҅yoW5t=W_ƱR(]ٱc^y/`?t>np{z!Wk\I&߿N8qJ'Nt2VFԳgO޽[k.nIV/kYk-[d 2's3g׏@cɂL~m/;D,YdAi\pe^s{4hB-]%6 ;Lŷ}B~?$,1%~&fA -,?G7ߔ{K˞6R޼y!C/͔)w@,;>[_G̯_š+˗d0̧~-v;.v]oK>X+W.w ZŶo߾wfI,@$E.L>{.`Z;i#Jlĺ, !^? N        !/ A@@@@@@@@@ JT+>Άy '0oaZ*H b#QPh  Դξ֭&)7@IDAT:pn~j7otW/5!H3.]&T>5Gf]oY/uI6M ߱c(:UP>lI- #-L뢋3)r9Ԫ|ܐ @9е^-^qR H˗/ڳ we+WԌ3^z7['XD+V̫,x&ڲ^x/i^/߹W^oQ_}~W[oU s^{ Ҳ jٲ;6J{q/_O>^zIڵ,`rx/0a/Hk֬Yڿd[ɞ=7NAS<5_NVVfwsYf^ s9 JbK.QjNn3i$/,d'U4k P]bs}|,?ssQ٬W2b֛fB d\r\~:4`*;skTZ[>Q (dawuJ(#Fxv^`QvNҽ{w/5zK?9”)Sb /tKJɓ@xEʶe5)# 8,PO?؊Ӹ6w@~~!YVA!sܹU%        DZ24@@@@@@@@H;Å̌MvKI=R6jvsHIh(7'xZnF[7iZ[$&l;]Hz97IA $~]jBn2vgϐbtj˖-ޤ6QޫQʕ ё ]x!AtH'1…&bCOYX~P:#sCs)w2RLSZI+VxrYz4f={&E_n|n),jaA^{ Pڲ .؂2e$wɒ%]`Ϲ 'N7:Y8뮻NPQT)}޲.roټy4w\/lk/V`.ݲm۶2U.:,|˂Xi1ܮXGKwB֭-?zzFSfk"O<+cbX pR д187vNfl{(yΑ,sذa;v?|o[z_ŨdVƍաCw =묳du۱jɒ%1w;j("7pXS7"A{^"A2bݥB5PlٲP@@@@@@@@RS }jVN         @4 vmڹsX c&P+ۆjth!T{C֣JsH7KnOJHna/СU+ &|L(ZRzV[`~iSHzx7ޥXxMj?,ؾ].@Ynߨe`T`,骫.M )}4qT~ +dw@  [+LawH!זPXPŻ+ >|~7'aǎӚ5keիWر69r䐅q{p$ - XBXV~Y=lTPKY-$-f>DRYlonQbAh{,,_|qnbSFԼys=qnԅ2tP/QPH.]aÆq6?+/]_{mZ۠AS"f< >*f'`!Y{lwwߞ29o?{/Y,DъKX^wd˖}u%x\ry[bS&MNnָqc<KB!P+ X;eEذ6܍+.UV~#P+Ԟ      2go@'&Ή@@@@@@@@@D D5k|}06/݆ Iߏ=CZ5ioZ2o^eK|Z?(ul^n2mdIL_qOi:7}ƽKH;#Ղ5r]_Be mlBnAK.U:uB-H#FȅHis 1>Rn vO>^AR*?~/ SR3d#|k׮nUVY.\Yb5 $o l![UV)gΜZ`ɇտzj/<#f]1,a1JzJ(*%u۾k׮£⪧`)j{޼yzu饗W^k7Tq-̙35pdQfɓտ=zT={TѢE](}.]$nvB [\z=P#};¨,^;eͽ{g  il׮XT뱰0OX{s*9[XRm 0#@- +j|_~@3R      R֬`  jE@@@@@@@@@ M4I%SREzmJ4JHY'Jpl.Uf̐\NnYZUtR۶Ҙ1ŋ=BRwo_`l)q|*WO]믿9rı%Maipɂ g񦆀6k;C)sh%|!i(飏&MoB[ SL^= n;[nE_1C[vS܁ӾzȽwMmڴIqg(# ֊]YjxKbݱcn&\>xrB#c7z?|o`czo)q%KƮB;nz?8qbw}ڲNdWOr͚5+ǙUT;/ijFPC-P?pn{3|0       A  @=C@@@@@@@@B&ƍMAZTS]pʕ J˧쳥^ڵK2EV_}*%JB97߂rikFt;?4tT}M o6nXu?}.? Ԏ[w cbVƌIz?fd'xcZepY%^JӧG׸;a+-J.a](j/]      MBst @ s@@@@@@@@@ @73u]Mrs9NlʿV@&islZ>+͞훼&YR/jU}E6XۆH ŋ֭&?/-zmN6͛>&tv]l"E4 "QK>;80C.BzE4 # XVս{ 5j(G7|SUkںuڵkOkrʖ-[N[wZ+1덯9sz~\'Mܛ߂,hٲezĥ&Z8VXPرcW_y![ )beP/ew-j߾4Υ0_s51bxq^hmɈYY/+ ~Z t*3ԂҧB:lw穧-P+q,=b}x{QvY+,y"bA,6 Ow ('n41X8qb)nP].zdpu뭷jԨQX@̔)Sl!+vPnݺÂA/Hy嗟ܮM6ޱilIZNۿ[Zؑ('P+Ԯ||…m-P˝vT矽@A>C      KŊ:  P+Hl        $GKo\O;> H2u&h^PEB}jAtoڶ| &]r7RѢmIn>ItP莋E޴d|CDθ1&I9˗릛n Da3fȅH]DAQyBx7׫ddo%~{!@DdΜYFB栲fͪ.qpr/Ph!C eVf͚ [ ز>Z؃ m~8?:avmacǎzev7nkۂ,lx~ZUzuYHrwE]¾g~]wi6qW{֬YkŊj֬;1ɓ'{[ذeX([baAƖ[@ѫq0,TL2P7ͽ,oTww d36^ hذWv=iϷ{=z4MdhrfUg*ҥ3mǏ{~!wsgS@'2{4`4US|' kUVyg:>~Ҙ-}^].%; E +:^w"g{5ۇXnXxKv͒%w uV/‚pW s- v*Q5uZ]xѓ!IL[xu7b,VN>kh2ƥwUw>m.UBb>o7m{i?ۤ6+W. uѶm[/BR*p V .J}$|`,X @*;'&t*` x:ߒRX6mo}d㱾(P mZp5ڒu(`Jޝ(kap\vr0:>̭Z:' lS@@@@@߻*$M"5h*@ Voe~LūIΘ@@@@@@@@@ 6)mMJVݒyI6$e&0B g%KEӲ|W_{Gz[6˶t{k زp-SJI{ wlr&mHСCz'4x`5jHFrM@<6_J&ij@ A;iZ77mӦ n$/Lk´Ʀ "=6nܨ jĉ.%Rɑ#ɚ3fLޟnٲŻ~8YQ<<#W_utaLJ:ٺM$P,H뢋.JQMQxՑv=ga3fԩS0_~EїGڵk5p@YٙJbSbE}Zt*Tp]o!%ŋ-L 3 >Z.D}Eߟ@h} -,J pvQ}c}0-^…KyAg( ܾ=XٳK_.MNV\Orʕ3xArk[fϹl b w!i:      @ ˺UCt @ $8         .ЪU+2sU(@? hTakg @ _|RK*S&9q]}lYѠARnRn<լ غJt2G khhiҤF#QlKkٲ ii&ɘ, tbC \n7_HG4"}QA(`Mcƌѽj :TY"p{g]Kp9xWc{7z!RdiW\0ɐؚ7ouiZ~zwynI,f;vX 2D . 7஡'w9r.Ƣ[n]/LVZV> 6g?ւ d` |+_|0-RMG}ٯ;VZ3Ti0F X|7v+Ziq-ȒEʖMڶ-,.#(qX։'d\uUql~}MҥKN       a,`Ks Au@!@V"@@@@@@@@HMfV\9j%1lS؀UQ/`ZÆE=CԮdYU gKkز? ;Wnhi`qM,7}9פZFks@q(x1O}qt5e'v3TؾLgKG`n6 ]Ԩ^ u^~Y(`  ֨Q5n)uQ|^}UΝ;Ɩť7h"Mh׮]^g̘ݏ(VZ0A.T2e„ @ ;¦nݪ 2x#7={$JÚ5k>c7N{Uf4bfo\ -2m4#%eGK@DVi/*UVߟ@2޸~>=zfϞh5-yHvώ3}~VDt7… {ˑbCX Z!@@@@@@0sQ0G@ j%M@@@@@@@@@S^/FD)J~}Rbh@-76nXG\͛'7u&G˖6vl͙#c!X1n]ߣ^=SO?,~ԺԵk7{zj;R/րC&D 7:Kl6 p:iiLKkR X}QiC @htu.W\qN)SƅIBBwi ݻ8xhٴit_]xᅲ WZGzO'[pv$r-] #NLf̘}bŊ^[ug'n DKuɺv Aȗ/uĉ. .Tzu)kVit\ wR@- Ο?3 @@@@@@N@ v}e@%>X          wu n9cF+Av쐛5՚0Z&~!ݷPnݤ*U rS/}da| NZN^ %Əm^ZZ l&]/Ă$vbHD2|?Rra:[S.0@>ea.Z:fB^FZlժU+ժU&Hg, 4WϞ=UxqM0cX~?~2L+Ν;]M2OquKϑ#T}*C ^~ɅT>´b }k˅>Jv?@0ͫvM9Mh J2gVjEɐ4H : _$=)l      q |;387`! $@V= @@@@@@@@BS&okڴx`ya))=T4o^YD ʟ_z 6OSnmխ̙iӤͥ -$\&tFk"ĉx*cq XM7c S%p)/½.e&/SLr0d |d!u;&vC ,x&߻W3G(DH!ôCR#T@6b:ؽ-^Xg-dz?qh>XեG}~ȑ#?zhݰW^yE]tZ/<~F)BIƻ܍ @?BZe|@j ˗ݗr7( gМU Z1ϻz-P΃[5khjXBK;G:      @ 7tRL; @ )5"         ӷ~UVJV aBaa;Ə?>L5Jnrlկ//7dK_,7K'}dLpQnykͷSŊ]ʝ;vAo' ~1ubk۷oז-[7hСjժ7}t"!@P7.w5( N O<jJp4xJG}f-]M V*;^pa Ս g~!      2Yի6mRV{# .j3E?@@@@@@@@@ 4h.iP&#܄J*@ Z@:z4CڱCIjVrxE yMM&Гڵ󽎚4,t鮻CbHt21c?QYlȾ}N:^֒%KtUWENn{ \rJj+|aZvaZP <4H.`0 Pϙ3{ʕK͚5S%Ϻk\wK k ꫯ7R w3zc̔)ScA R ]D>Kg;wkU/˛W.l,bE Oj8_paw_wAu@(@V@@@@@@@@HM`jՎ;6U_ŊIűE+P+[`4I}AO?_Y=[O'% ĨWOB ʥSe wM.A-R%E՜9sڽ)@`*/% R @;w2i)g΄gm{N.TD:Tzǖ @$ l"Ԫ\ԤIXqngϮ{Ww_I1cǎyj>J(fY}ݧ5kָ 曽Ζ-nڴi~=]kYɔ)·( @j d =4f LS˘zO PT?+6 ىK}o9]NhV* bZV5-]>88쳽pm#      IJIMH?  P+Vl        H`5bĈΧ Xڵ.'b K'UFVL`|$rv˽QԵploCHעoR$_,-;C5k/vp?/F`^ 1Cj@.B3?m{&}J?. &uؽÇoz ͕-Hi pA´[ׄ ťn5J\INT]Vs7Ot~=0a8 z]*Pe!ZrPz)/^Sm۶ ٪Ҹ,|VZ0 Zj6%ׯwAg]v*U {%խ[XBV{~QgjĈ%Ncil@ 2g%(t Q5N ;1v#r@޼# +qC.Hi [[6]Y}@K.$E>      i+`>E# lT5ⴇ        Q-P~}]f K)(QBڵԨ!^-7It1Ff/ '7t(,byҼyRѢmIKMMV?pԺ/&H\{nX7a!CH*cJ;=,{ҠqD L,`Y3y{I3Ià=zH>뛠 tH;/.|$h!II&M$ͶXߵrJ=Э^z ʕ+:unYqmlt)2ӦM±nfw+3=護k矟ְa]]Y)/^QI" `       $Oo_^ ~=G@@@@@@@@0H.x=S.h71m#|ᅾY#UR]3!$pBlbiJ XhMZtN8\4noR>}-}!c"Oޟ-[cKI`h|P.w^MOͱv* "\+5ۢn@ U54yBzNk%בdM)\ʿ;wO͝;W#\#Gtg\rKUlYot&O>}0B-Iac˖-Ӓ%Kx,XV#+TLF,Y2-^yE.L[VCBjtH=/K<"w Il@=\o{ ԲJy߾e|W_-S_ɂ N]?d8?zָAV>      R۶R;z @rJ!        {IRGY;vZ/pR r17sK%KJ/uO o &d[yGSP'{ ֯ psS 0f/7u`5ap :4}t.\8zGW"Amk#a4 o=}_h2,2ronV ƍ$aZӦI.K\#u$v#墋.=Zn5}!-] Zx~[ 9^wf7izIwA|y#G`!;vLe!YXv-[g%SLfkN+Vvmt-ZI/z[4^Y<#4ldfǿ[ns] ?#-`  QH ,ܹ35:-`>%Փ ȕfϖ5nأ@av?i; Ӳ0f ^       @z&}_@@ Ԋg1         @X s9뮻ɘ:YӥKVκiݤr׆ZO Ԩ ~ERlݥ] "idKR'H}'\vc,Y.`B=6mN_KƎVZA-[H.cK#})FYBXn|AZ? ?.8"Rfa6+p4k!Z 9]wxrJǕ]VZ{{Hg%*W=/`ʂ,pj޽MeF-`;̟?w#O<-{d~sQӮ]`0 ؼy77!C*THE&o J{(QB3&OxmٲeJW/\̆yټޜ9`{yD~Am @j |ٽ9 ղ$EV7=\oTjS,m:F@Rٲj~:-$õXxL˲j*m#     04q Qo@R&v@@@@@@@@@ ik:uk69^(^=',PŒ ikRSOplfMi5f9su3眙}gϞ'ڢtj۷GoYjYr|3;       ?KHw%j%%, W@n{F        q_|LVC$!jm=WVMkNˌ'H#/ɓ%16w(\k6m:u >/Rτu 2e7ސ+%9>~BczHjQ?Q@Β}X`f˖[OЖly'Mz? EO?&NS z@.KqYw~Z.hJze餓R˱+q)-[µ֮]l>$¯l]AYpXֹֻ®uxVwB\_[UQ)سhyK2@IDAT;wnfUVtr I\=z%=[sɍYn ֲ .cR>wM*X6nܘc .ZFMB`'4ON=ԄԲ\5|UP      d@yRɒo2PfE@ Z|mR        "Ю];5iD .Tr۾짫ke蔏N;MX4sDVd7dkVzvdK|4fԪoKU$=]ƍmۤSyF,Ϟ="믿F͛c")~U@crx L '{4|20hp*jH[/ri X;L YnYQ{Kg-Yr"~nUZX2 x'.]:Ë7ߴP.^PD }gzպukM6ͅBܹ̽;.v2BE4,pG,P! NkWSJHlذ! N%ZpҚ5I0eڵc)S,/0`gN*W @@@@@@X 知`,̺@@@@@@@@@@H@#W TRةvJ˒@ bxp XսI>ԘwoiJgcYaӦK KV CJe V8 ׏'tR\r'./aZ1[rt;#F %i-#wޑJI)s֯.T7O.XD"L+s< 'h^_"=Z:\zas;Lk^o_olZnDZvfֲgn0={'|ǫVZZbſvsmBIXwvM!~8L~}O/#P`ARٜzu*w29P.w.t2yrVw&g ,Pkǎ``_!      @~S[RJz3! j%ep         g+z}W_zN˴@DC M+?sfpg,>TxXS@N$+VN˘SOIo!,%qFspU7nO?T&LP u(;A,׼+ !ti 3Fk Hoo^Mժ[6KB2+izߦ0ZԭtQR>^C,x*<'=rٲY9ºdٳgk.P}_)#=rGҩz&FC"`4k_zD?IK ڸqc2 )bc@U"8I&% jժB, *jmlrZ@@@@@@ ƍ:wy y @Ei,@@@@@@@@@ wy,X륗^J̒@RΜR׵JmxL@͚^ak Fm[8E@ [7ߔ^xAjHڶ- ",GA+ Ơ'HÆ _.` QU`P rhnr|!2 uuKK[Iщ%K .n{9b` NF *\X.V.HFi4G_)p'd xaZJEf,HȑM7I' w_V![?b;Ʋcٳ*U9p߂"e!ƍSVt7ki.ΙZpY\.;n.[V_\C|܉QM矣"8@r#or)nw ZVڷ/Ż0ϗl!`?p>hUZns?P+L2 H@@@@@@yo.Tz诏5  Hj%֢         \5Jロՠ*T P+V։c*V$P+p&;j֌Y҂%H> ,^,5j$ُ OM;vk?)SN3:zN `BKsʽ{qFREkB?N?>)ɠ@g۷{ም:yQŋK[KkH]wK!ea,DӽcR;6[r}Z"-@wmO=zHp/Z$5m*8dIK﹝0 A;wOGp, '`6l"ۇ}uRIȕ 3'PߛZjI>F[?~(LBh       ?K]}WӾߗLY .-@@@@@@@@@ KVƍտX.iQOI;<A " \Z.cFȗ/6oޜ_ݍy.wp (K.B~ D(E"{eˤ.9B*U*}H5Z~S= s rh֠4uW]tiҫJveb<H=H9sJ/tXK Kv9'םLթ#M9.9vHsQsK\v-ZQf      *0~TtĉR: @lכh         ~+TJI>X% J [`qXyr6ɂTnUY3o h^_"ݶ  ֯&"}YW#FpE]sQ0M}X`inRҼyr0r,´ӦI'N&`ۼ4vԪU.#@6oƍڵ*Tʖ:vz~UCet`NᇽrnM2ܑk iӦ>|z'~3wU;Zda7K]@srȺ}Ӧ\(didUnksb+ L[謅 X?vOj,i6A[\… C+.g4@@@@@@ }wqc@$@֑@@@@@@@@@Ν5zh-[,kMUU,s򌇑DO ʸor>,#HV[$+fA&w)PQ :4; l޼y,`YnV.^P9F yZ)q%Xc9?\fϖcvօ,`$}'#թ#.,5l(M.]wb2~(ml%xw I^]4HzyixXh-6 gf5P˔ 8P]t;3eW_-|DR1uY^< @ wwWO8ƥY6R4$P+E@Oϛ켯@Kjʕ&&Э,D9r @@@@@@ w|PjBQzu@HZb6@@@@@@@@@ 7t/ ̈m*IV,Pߤ?ҜXXI]:T!` ǣ[/H^J̙3u>WYr@ VJ}%w{8 N?}ԥ'̑. c4I*T(F1l.}w; gx sΑ}V*Y;6-dB-d RT;?<)o^VR7Q9P˶Y]\qwfk7lTgAlVߊ|uU{E ˗/͛7ge1IXvfz`*xVvv@Zj:\̚53kW|:lZKjŧ@@@@@@l*]3+xs we @([~"        @ rȡΝ;kĈZre AV"dŁi%j){v)ЩTԮ]:lQ"f.gQ]oҕWJ+z.ɮQFK5`l :-i%# ʽ鬳QtEe@ v쐦LvVZS.dV`>m"͚IA;e׮-=)q2Ǿ}^Opxm2p@tiv<%E)=w,XᇽNx@Z"B+a1 X;oҘ1%`jmٲ%BKL\3R[W<9RKK,X}U1a,hzl *W\|VZ@@@@@@}g}OSJ&H-Zct@ P+6]E@@@@@@@@`y睲MV13ΐm\&i 'Ŋӎ,`?;V.Gr44n,]}tҮ]>Ta Jܷ?)w(G]~4h%KjԨQn|G'黲z8ttG9HDi ' ʛ7G>?t5M7I|"{H@ ~"=>Tdmƍ֭ wlm5|tƍRnUƖ :}1.&OX:ɾ7R:AT` d]_Ugݐ%         RB:t_|QAK@^1~Hc35kwWHK+8td9ج`d?(:dqu%mڴI$psp Zv#/ y=)Wx$yֻgsէd.&e$dVNyOQTr@X֠AҕWnYJj ck/X+:t*TH|~G=#YK{KK-[za[Z A Xpܹĉ4C@\VR%P+EO@-`S`Z߸v{Vix*?|m޼kv^s׮wz˖-Zrʖ-F@@@@@@(%H}J='dw! @Rk#@@@@@@@@@"#?~k.TԊ4/PW9`Π Xo+$7A87nSڴ\ fO,pZ2\PDžzLG~j0WK2> XQp AuғOp@r -]wtȑr5xBY5Rxu"@</ -@ˎ_}U:4B-WmfͤMs .}_}՘v;5\͛kݺuQ]w^@ޯJCJSxw--[UpH" 4I3'Pb*˒]#P+ev/ݻS[@÷i`>}wsg컹dɒJ Ԋ=kD@@@@@Jg)X!b۶__X3 $@V2mMƂ        I%о}{رC/bR+ڃ9  KK'$͘ z*vZ~I8+)R 7Ŀ?\W;*vuR@Z2X d-{LPQG%(c;ߗ,D /b~ֆغUcYR%T)-Wc![_/*~&Z?T:tϼmrzu1< wt{UKLA`-% 2 )_^ɂh @Z]&U*=tZsq Ν;t'Z)w7}gjpՓ,w͚>lx5gɉarΜҮ](_xqh%eʔX      q{԰twI|o>#$ZI9         $@"EԶm[_[մt X֒%隝.P&Z=ٳJOt& 5k^Pέzb`C K xaN0ivrUb0\1J;uN#˥ .~+k -E;LNۚ8qaF2CZ/(nɂOZ2ze ;K#-]caȕ+;W~JپhQoU) Ԯ-(M\F~;>}zJwzGK;wƾu '(o޼_9kD@@@@@@ fIUJ[oH*@ @V62CD@@@@@@@@رc(LkUyKnMp Ԛ93 2eVRɾȟ_vD/hs% /9iѢE=ԨQn F4(.no1r8vU#% jFӻDi5YMҵJ}HCJ3g`@{?o\*V+`y^^zI![uJ.πeË2텛Ey[|8P+ ƹCw׺0k׮Z{O*[VzAiݺv!@4m*(Aql._vBv˾ŻSի7sϕ&O[۟e˖iŊHnZ1> @@@@@@$عSza RyoN2,@,@V7G@@@@@@@@(Z+FӶmҚ/.,}$YV,8Acl/o\ 8 uᇒߤ!leZ$J˚O?IժI2etY[FNo9G:Dejr`o% |-B~Zl8#xE^eجۏk!P[eow:͂Z.z^~ sIixu"_H#FHv@Frέ۷ga>C檌gc4WO4gU5}􄂰}o;u#P+@@@@@@ 3gJ;g4qTD,{@%-        $@N /hذapgKs~1칒+4cT|?Z=+ݨQr!PTRÆXCtiMV|>,}{ڵzZj[#{ nݺUዅر#T7|m~]v?]~{ڳg߷oRXr)]JV.k u+uك\Hîд]VNW.\ ~mɣy.v.>}C{gOcݣFIw%yWtx@ :=aw0- c.w;9&BtүJ{!EU|{tôTJ*|PO[nEŊKeNv`S ഢ"{c5i㝫nX:$@˖^xL==~ P+aaZEVFAn]*e$HsǸ3I/ jҤI˜ba ԺcZև      @Tl7?}v8L#  P         s?^ZO?튽 !y޽>ǽ#tVLs@n}wc>>\5+&c%pպaT`ŹW[g2-zݺu馛t嗫K.>]1 Z~}bjòƍu٥L~ٴi_YdYДR%VuZȑc` J-4+4 ܲ`;r:Զ5!~xW8ˮ!`5|.9/V4|i ] 3}uBdF8Wzԙ`A#p0 apR~r{] #a\ĉҒ%rᅭSm\iSS% Wz jlRԇzpoqln?ӶԷ~Z9 !@p)PȞT.w"<vn͂i) wzu155kz&IwlG_XV"5;GkWl{l5,]Te˖Y      Q,},5,@ /&         CjȐ!С:YA)|9;ϗ>w݊K\vv6WKXi7 ;tY\X n&#+_b WUh߫^{P(o }ZjV\[k֬qEcWzڵ,X u}sg/#]yeLJ@yܺO;I|)`,;UΕ|S-`_x4y2E~&\pjعm;͎S8ծ/Y@2e      @,ZdiigNŚY IKXk@@@@@@@@@p¢}u=(_|>mfZwK? w^C-P4`\p\(޽xlusK>H@A$%ժ?.s!bgDc?u믿BY~Cso!L/,YRUV2}{- 'ssCw4 fNn[\ƍYmp. .{Ԭ['_4O ]oFKQ z-ŸU?Tf#믃U;@<~ Ik;t5eaɽGƳ;-#$ ,UJ=[n5yZwĪ޽{>nȥ/. .u %5h'xi}1cͽ1\maw\޼VN.&":6MAg@-{M.GҥKC6KN#:      @JvyUC*VL^vYJs2 @-@VY>         !.!CBENv&bʗ痾@‘j+}UܰuԽԺt)5fiJsgiNcBٮn!N[:袋w QM|r-[lwa Ѳ۷ʵp8RŊC-IǹJEuE¼/nX]lfrf\jUbj_,t~jWIx⮪k/\Er''}Z"ѯ{yFzu´-/^Q@tm>!߽)O/ᇥGOwboVZ>XQzI)W.v7 v' :'C.W^.`>i {+UƎfΔ4xR&>Ҷ^Q^~Yƍq)] Z˺S.>'uz`?(UlK,:?8 fwǎI0sHKKeJo-a >\Gք t'&ݐ׻?~I-5 :ե+WN_!t (9,x~Rv8kVP?-\0tm?a[ŋwDC*U.~{of̑nI/p! n*,MgC`niL/@RcN/L:&JpǮ֢dۺz%*QOw^˽ӎ(pp# ![oU/ΝUZ|j5k&y'Իtr>C, XVg>je3 @ݶCEKQhQs)DBuJ]z%\ހ֭['?{e Z~V?@@@@@@ҳJ}HrIKw߸-F@jy7@@@@@@@@@ :/hvCW^)$| G[vmLH[‡6n~Q:㌴M{W w Hw<3l4 ]'m{i߾ K/4o췚Rk{4kj@v:UXQ*Ura%\s'gi sܞvS!qK,Y_~%TxՊΘ1C/-2KdHuxdAcz @|-&NBL6mi/\zaK2w,ם4a,>4n&u]h jkmtZQ0>]LիWWҥC~ 3sRVңJ͛{ .0< ;KMHK*$S$J[] Ӟ{)Pw9{d7:g/_>M>@Te4@@@@@@*`7~ gSw7k  P+۟#     5@IDAT   @ p7j|"].YR:D }}D_}eZ.Pr`&V \8WˑQӦҲeߚ JۺunP0N=n\e u֬Y_UV)Xꩧ w}RJ(Hx 7F:@,o\rUW] mY? >|z<'| *FZFPVR޽38=ꤓiE. t SX-DUB˖,@ς'i%@VZ:RܼhUP-_^'M"P+;GkZwuWxoq|}h4@@@@@@(0v/KbS al\#        $@۶meZ, i Ju@+*ffFV$r9kW(jedZISJE&/JO?ڵkKFr.Ov?B}mݺu( PB_~hqjCZ\魷RNt嗋0<#C,̤ ްaC=#zxb_޽nNd˖M/ (t`[֮]{= wߕ 8F矒e=\HVL\+}S^ vY`W_ɅzkȽKmDn_?]5Rpbov,A;@< WK.^Mgڹ~*Wܮ4 Lv[:t^{ L1 Xݻ#Y\8Pkժ#@ݺɑ_n"/ .p%'ƇXr/(۶m'ț#     $ĉ$ݼy/!!$ @@@@@@@@Ȫ@|裏Bcǎ&J IN&#pv0jWtv kN=U.CzUiXGHUlzGJ(dɒYiײn:M2E&Mҧ~E{jԨMʊDZxO3dfG,XPk]˱¤fC^;w.I^zKC[y ?$PVs;/PC`]\n\M{"Y!b3awm96'$]vdA%]"i,&KwY:#`?*4hvPBs׉'&Zc]0>hk_~\_ B^\zuos#AF@ o(]޴x;a9rО={c "\$`ǥ-ZH[H4Gg%={=.S2jz)C`>Lt @@@@@@ x.]ׯ/}t9Q\!F@ dY          @LZlpT L vo68 `!>0-o-[&)=3g24c\Z< Y۫Xp Dh۫aÆyԻwot/~Eu1[h~ .Sݺu ֣3ABW>}/І 4uT]{oԨQ#.\؅ \. Zti`o^Bvvjų^jLF 2* @ ۽ΝB`{+-uYȖ;tSôjb0i(ϝ+{\ѿW^X1W>,X;/phR  :B\˔)#;FLfmHP<_U\xt#@X O}3n5}]ZrɝGR{.>Ю]r .q`5jΘ1Dފo|!D>[      Ap?{Ke4@M@Db@@@@@@@@G ۽{wk_pIAZ5 NLB0W-TzH%YMnK2,U(Wx=.IwY`@Ν;u 7|z}1t ʖ-3leW}G* תU>oW 4hРP8roѥ\4bи{رK_XQzBC WȅJ]&%V0^>Tn يjӽ{ ̘eK:unݤGWÅ4O̟??yP2;!P+ψ.'{J23^ȸ ӥʅ\I2 .`A>!Q)%`2C5͈'JF8f{;v+}y;ցZ)<~IC@@@@@@ SHk{Ӵ X].(a  ~F        GYfT~tk͛WZU1{b~p /˖I#Gz-t',-_}t7K={ƯZsb5GGn~ӓO>rʩz.4ku=7kΜ9zꩧ܏.rm#b"(_y"5n,]u4o$`/.T-[J%Kz{^ljח+2}%F}]C+^pW_yx,P+C1rkjeSNRK|Kfu|.Y.[ƍI6P@,ysoHQ}YH!' <9;:ZLXWgQ%J賂a#     K}V~(}xϼpx" @dԊ#KA@@@@@@@@"-[6[f͚>}5k# !QK^rEͼ£mg֭r)lVau4~Y]Z=CkAiС X Ǝ?^W\qJ.qƩ}?5emۖ†(8 TXQ=-ZH\sM(lXbpٳgǩg[]wyPHK[㏥O~$G҈Ri?{@ eݻӥjԐ ,뒝$ ٺN/d+%g3y%ZtV5w-}tY_bΟ??9sJv!/Z֬YG&CՓΕ;Nݟ,Ί@ 1\V.Bs:KK[@}m1jժ9shӦM& jŪ wL@@@@@@=#y԰T^)h  $%I6$@@@@@@@@@ \uU袋ԭ["1r HB_[1w!=_\DR_^+#Rld׭[</O{OAjZhd=a#GTʕu7¼͛Jڵs!.偆([}Q믚4iR#.P_XP_I/#M-#ý=/ԑ~Qج L;ltu˟хJ wi?T\`GT+l#{}JϤ\2ˇB1 Hܙy@…];O=Ժ`ԤdwժI3g&I,p^3$ ZMUҞ{][(+:G,P>n >nX o*QE      @2l& "U 5o.vq$]( @K?I.lF        DKo߾6m>h"a{4{vPۥ9sbwofޏFbjVc ˢ$(>߽{Yf.\a,H롇R˖-e^FC%[ZR-Tnp? B_zo{o!U$M(Y˛oJ pn&7)#u(!=\HdոT`zyL Dg[l vְW\T>lw'*=vdN# dn.qBlΕ  nUZ"g$}%$Vhl}ݴ=;./w4i_{~p cL1VZJ,@@@@@@,`{q䓥z$-Qǵ )@Vbn7z        "pKkԭ[7Y퀀.-8v`HM )"͘=#.]$W+V0u޾&/TONz.e֬Y=z-q םwީ:,q!u1d$e+;%ض(W¡)}9.GYg=zLi+Vx_6oެ7\"Nd є)SԨQv}O?EYӧ-[&;[nd]<2Ӻtҽ4..TvI知k77@ +4mQ\".,Y 5ߏ{9ڵB\QB]KIY@kZ@O\طo֟?$ g~s4n#GڵsΑyƏOƻ~^?Z~:;]oWۛMȎ܎:*@       ?_j z~?~a~(@@M@@@@@@@@@@iDډ?53)` EeZ Xcea&.?(T4>>]n ?ׯ<̘<Ǝ )Ӭ~N+W-`˗/w!#tRK;w rmkڝޔ 4-] L7nԎ;d#ׯt),W\qE( wܡի˖fAaϸ*?CgngKR#}4d={v];< \D-l肣O>[zYxqi?lթ#Y`Op|Wi`ԩbӺ?mۤ jդ*E zڶ&VݎAƍ$9sf.gNJ“-ծ#ݶo.O bkXԹ'b gs4n#W3ޓ;үx d|\<u/[ozrhVZo}IXpx۪UBK,U|@@@@@@|ԠdOFGw[a" I        $@J\HN =裲"j@kӸ@j5k&gֺuСRr;&`jz^~Y5J 6Yfvd/do(ƌ*7]O˖-ݏ*%\tE;KJntM%x, T۷ڴ=~"/ o9*Ю0T  @@p2lT$svY <@իW; %K;' H@$  H@$  H@$c={_9h ص 8IG>& H@@aZ$  H@$  H@$  H@$  H@$  DI`ظq#Fs p_Vpk+y9 [62$=?8Ѱ0G֭û..{طoF*2@wvbD''"+JNH K,ђJJA;v숃&-1ԕTR|uGA`۷w-W\zO|] 2dL>+ b bQe;:-sÂR8b-j DO_`J/ 4&O,}l|4dzuѫk$j+V JJuJT Xn&| &ҥn[+V8 &){vlSvtҡ\\Ҳ֯_ЁZD2 ,}sX(~>/p9(k[Sp~"qUhZ,"4Z}gje~2L;zϮEƚ#T<3UG$  H@$  H@$  HV{/Y ]X;hvN+I@$VuʫK@$  H@$  H@$  H@$  H@駟6m}a!gox҅H/}SLWJiӦE>|p/K(Lf (3gD͚5Ѽy{wo߾`_ӇM MVÇ7>a]@*Hd*0}ղePO˗ ʓ'@E\k@*ԁהZ9ǞR;sy_nn'ۋW^IZ#>c\y` ٟMzB]>0C7w^vΝAa.Gꪫs58Æ sns1b۝~mrкҬ7`2aգGݷ \۬I]'<$pT?dgҦJ JF Pjj8+аaC|["ی)djsʥ$  H@$  H@$  H@xWgةY/`h9A-F3I@$Y}j$  H@$  H@$  H@$  H@$ `eQPQ]KCW_Z[Zzp=34\Zgn9qɗn8(=x8E*^C3|\T%K|6q5ʩ-m?1sEg/ }R f̘ WX<>rH'XP rwe'΍v2B/B*U nb ԪU+g0{&)RiW$0Š2cNp 8zZЩS'0T.]a\ 9Klٲa`B]^x'0R|mӌW `ɒ2dyl+ U?]ri3={{U( ӧ rù 1c }RV ^IX {+~}X,`  $e4a[iBKokaAGC=7 bXVmJR}<- <Ԩq]Xop4rb &w/odF{_a#L01$熣~Xf`͛/IVSs9E}eKjlpg>4Cz`Ϟ=+'[*Ck}T^Hܷcr*TT}b iƩ7o?j O ʗ?s9 e%od3oQ@J#F8hJ}`(;* xZק:@6lpL+ .@|-@-_Q$  H@$  H@$  H@@z>  ;vs'0nM윒%  H@H$j%V[%  H@$  H@$  H@$  H@$ `p*PGh@cZEXEKMrU`cEAQjD:{+WI7lrՉo-Z T8@c |= ,x?>°12pɡм%ρY^'(3i޼yg7Bnݜz2s.YצM৖-[ ;34Gu@$-Xx+Wi'Cʒ:u8Π *پ@VPS믿€nBK6: CƌFTR@ J oq]%&X"rW&p,۷oǏ?9N!ڵرcÆ ;F4X38lVj&Nf}Hq O$7o,g'ql5N ,H p0xY>}:/d+kwr駣cI|?x2Ⱥ nX8,!W`aZ HJMn60AM,ouk/>t֭{.牷3'w۪{˖-sQ_ +1n?ٿL_hZ?wBRWrʾ/Wr^> xOWfYaYsvއ)weqV {㭇}}*P9>&}̝ 3lwڎΎ;|fߖ-HJk@pz+}={oh&Zh] (P+  fLFTf_Μy8[ GV$  H@$  H@$  H@@j<%`syF59s3u$  H@,&fW%  H@$  H@$  H@$  H@$ x˗ǀ⽩AI` I b/ط'Mp޽}U-U&B 82V~6[ʖ$IKF#g:ʕ+dҥK;p3;L8RpV+dzpk |.QÀ'ϝa?^aHcL &X0Խ{wTP~[۷m6\tE^UP-10\9s,օm ,)#}޶^zS`1|v7)[v ~X$+}Rl_VKŝE242`;wtBฒA9nC.Ƨ6X,.^[v,K c6xG<H OMJ0F;a?x![ KUqa}ԟG,n}a!FqBAWXq k׮m/s?Z-D(5۹s77n0}Jr+Rg3$W^ye~8+ۡC' ;}1[oL KVqF5:^=zp.]xybVG,%zQX0GIۿ~[%?꯺}&}#Gcԭq{@wH 7U\Kh^ޯ.GvZ5kրU$  H@$  H@$  H@$(e 0|8p9t?`ί$  H @bպ- H@$  H@$  H@$  H@$  H eˆ'x‚Nwռr`!cfL .pZN@ְAc%,^ >6j:];q!?0"X.̟?>Cʧ3pXbx饗ɓ'[[lݺ𖗵j«q)_xAL5B Do֙/^+W1P)akZ687O/d2T.XZ =BYh̒<ܡ~޶qn$hLup 2c Q[p0˗=.?/5Nu\,?t~'GFZ"#OM ]̙l ̘l Lr4d+2x{/[0rpE/%3hѢNTJw gv|ۮϤTܷbEOL ^egՏ}1_ _ž]}^l}۟_Vu<+8<}}'N sfL}ܹ3;¯[}Lm,uPddղC?Z,Kͷ%CJM5|O~`3{MUHi#^Gn`lL7Bkyu*G6l@-/H wYz5J,h$  H@$  H@$  H@1 S͝ pP8p}@zڹӭy@CTE H@|!P%$  H@$  H@$  H@$  H@$  H lDƍ/GTq8ЗbFSH/ۿ_}oU m LGbi>}}.8r-صky ,`ɒ%ر#oߎo?qzp? p+~,ws㖱{n[S 8/Rz}+:leva~ZϏYL% ҠApz~mAmlXe<0,/ªH~ }a!QV)l6~:,P}kr:?>ѐ9#P8\L_ t>R{7ȍiJ IJ뮻ȋ_~9C w;-j1 (`1diG^+#`eժU:v Kecx0{8ݻ&Lp?N / :w8pGƻ+Ov!#9YfăsW9 f͂/ʕa C̽TLԮ ԭ q#fȑ#n)pLE4i ,\܉1OF _b% ]֎A H@$  H@$  H@$ f?󁀋.vޓ_~" H@2,dNz$  H@$  H@$  H@$  H@$  Hi+K7n\ۋ@_˰nU$e|@\ 4:wvڦLʗOs~s>iH6Nsg'|U. ߯_?Yz-kN L$H̝;KFժU-, 0}3"?87B%(2|ŋN:᯿J/+ժUs1c1q M.+ طo_R5R/dW̙s'{$s7/g;fA~s.Gqa Xz,믿_PHp?bرW06R%;Ҙ)qh-H2qbb&Vs0πݓ~'o-K% x}*O%U+-K'=ku`9 V^S1,VlߝzNSoʕy{a2-XsO0pu{uoݺXOs 4ѣ8x=~Mه*łYhyH%֝wBeG[xd) .Y-ׯ}}\^`HZk3~ge3ghذ< cѾ-ú;vݻQXh7Y뗀$  H@$  H@$  H@k&<ՄKyͥ vuN9%•$  H@+,q5F$  H@$  H@$  H@$  H@QAY3:01 䔃GY^Բ<LpQ dV`xAՒߥ={D۶mႺk38`X Cx8;T^c:{lgI@u裏:zGw;s>Ms}6pJN)d)lYh}Wv.yc͚5}eŝS, aUl_J93:d6fTXrK,EӦMg})SNȒ͛<+f͚93v k׮lڲ ڰa3땼x')k1bDr֬YX|9^}Ք26`)YFrv^z Ț55̺ ME@ƑY"H0ȲIѪPM~s :H*IzaB[0~){t8묳bŊT+Fظq N1!L ?Z}kgX~: J_K>_[o)7z/"nvtÆ niz6H ۘiOhs9)h =s}`s_>UNHv)﫟~,Bsw OhaxRCZWGZB&Ц;@6SIpjeϞ=o~"쳤?搀'Ф `6UTT -~+ +@$  H@$  H@$  H@عUvz6 عNo0÷v-Y$ DPV"mmU$  H@$  H@$  H@$  H@HH{ c>|xB?і̀Ձ3u ,&PjT@PXk=Nì]zw}ЮI=ρ֭;;wF>}zzAS{3_ /npf4h-_~ٙ|M-[ӦMÏ?9s3/A^ru%9w!Z bxÖbs]wJ*6יR8~67a KطdѣQD |GH_ܹsSNo YhbKc ,AMsseͰ-Cq#.૯r>ԩ,ON\vWmeۗėgw<@CU7-Gǩ~;1-3P%g X\3Yȉ,gT#ôع3ό6l[ -H@$  H@$  H@$ 4͝Y`}f : ʑ#ۨK@$?>9`T# H@$  H@$  H@$  H@$  #,9>ÊT$gLh \uGAnݖSOJ5{_ڳ63,/R="/и1, '8[ \Xg ŪU9:+ EX2 CDTޒ38W[ԪU˩aڵ s1p;g2y_\ۡFe_B 8SNxؙyS"EBDnA)S&9ZlO> bPPPU#lڴB+9SʕKuP=RJ!"l /]|%H>(Ge SO=儚Er^ {_B`)ڵ yVeYP{BeZ0` Īm{L a` 0@IDAT RĜf`6@lد͛Y6|jF ^ J e('_URK/uϘmNsq;vpfW,)O:Oe0+hHvKd1{Iٸqxa!as U/7)Ű@3`0ؾjo_ H BqowTV9~x'\WYe|곊:X8t㏁.m5#Z0[J2eFɒ)޷^\{`Ek1{'oUM$  H@$  H@@cٳ,_C ᪴( H@@\  ,bc}ŝw6붆q:(ԢZ$  H@$  H@$  H@$  H@$  }xW8I"-!C܁-CE p|evb-P!H % +0c{S~ "=6obзot"9ÇN &`F:luDyF*I⠑̝AYi 0Aϖ-ox^$t]<ءCg.zU^=gpœf zG$=Z̙3'2uI򠪔Vt,X0S jN NWthVFmѢE+la6ȑ#pԫWU|Eo֔)A?loٲW%$aL К9$2Hy/m}e_% RkԀK|0~!$IfϺ`L.YO$ьGEih#f+VxW7n-[`ɒ%8|ilbZ֮]*L+Z$  H@$  H@$  H@W9m5y2pZrXU" H@$&$  H@$  H@$  H@$  H@$  Ĵ{Fڵ+nvs91ݞTn]wPO?#3KsAN7P+ܼk8ND`"m[}{wYF<=gxے&Md'쯫 mڴo'xFNн{wT\Wc60SO={oK?ӝ'T3\~Xb(mU)6p(Q{Jlg0u Ek3{K?~<>7n\P!t]o_r-!g|{6ZvO8N]p1{ G. %{AZd[ş^g}7[IOerv~=FdH- N*ei_m" G"pP1c(H#I-7Oc.=j;_t9skpB_!_._'0HE1&Ы0|8@ǎ1VyU7vr@) vY^ZkiOI7P˻UVufϞZŊK/ H@$  H@$  H@bZa/w'S3@v@1k3|TjԨN~,-܂o֩^.]Fk) ѪS=2z[oc?tQϟڵkgtQavZ "pvuIocSE"l-i 7uôC9|ᇃl!޷o_P}&`d },vwg_wxΝq6@sx)Sm6\pϤG2-c*s+ -[W_/'-[nXdIP]駟PRP-Nˑ@J,;Æ)P+b>Z;wnʟU)Rĭ׆ gv2{ Ikܸ1̙~Enn?,;a +. H@$  H@$  H@&O;^q([6lՂ%  H@@6,$  H@$  H@$  H@$  H@$  $@-gA 0ydn:b/S$ҝGp1ÿ6,=ԬpZu@f0Ȟut&Cb1R8ei6frdըQ#J'dɒo 2%t5 cc?WNV'ɣ˗cĉ4iY ;Nr툂 m 9 ̞ K3. ?f9A0vT${M-3M(T c/%J`  3=+ tu?8`z3gJUVϼy={ $;o&D\Z>U@b;BoT=^l͛?8[juS${u_|ԫmTR0iS%M…݇"`_ 1Y}V|wEYhKP5;h΂M_}S: @QV۷|XS< ?о}{T^=&9J*--`ʕXp!?| :BJγ?>81ZSDV+Mx]Zr=ɝb :3mJ7nx]hz0-n >x}xq_gR κww0$lieQ3GTX %$_w%n(´"yL ,8_wb+L+O37<#{ӮVZՂt;b͛˖/\+> nAq'pijP: J(aD|"`#~2PK`v'~)^Vf[k$  H@$  H@$  H  zasWK/uKoc ӊvR $  H@8^@ZǛ H@$  H@$  H@$  H@$  H@q-ObذaqδW$pG5l0ZwPX Uc?zȘoX>(\8cϏ׹_u'G&֬YXd ̝;7vu.r |1P.AgwO8|㞠;$%u|!3T}7p믰M7d1"kJw_a̖gJ MZo~ժUKF6sqV'3B/(;HN?xDh (P˓Z7撀'7]^tE3go _\N1pv@t}0LLE$  H@$  H@$  H ˖>|wk#FA("K5$  H (u[bL$  H@$  H@$  H@$  H@KV_P!g jYa_K͙u[~_? tjr>wf6n~N[N7>(PW]urJ^ڹ^|y{K?~ܻ2:w#G믿ƞ={DOmۆ>BBQ\9Q۶mٳgv7n:Axc,Ys(S'7Po_g` \qP  Xf@XhոeP_ }>'dGXhXJ ۷Âq֭.,76J6* غu+]Nt/6tǺukӦMXt}C.81͕hٲA !qv ȑ9sLFg ^?;e{FHtǾ߿?#ѹU߅*7n;8@p k$  H@$  H@$  H }o*U x59@@`V" H@bM ?}5 W$  H@$  H@$  H@$  H@@|΀\s w:*J͚@^E XVs…@˖_y8}Nw/001sz|`-RVߺ/0};1܍Ŋ͚(_p_-KlY|j%Hb ڵ+ڝ.gzJEE^;zn~馴ޓl =@ to qGC$Pӷlق $P3Tj\eى'=?Yn)ZlG믿FzR%yZV*k׮u@p k$  H@$  H@$  HxyIHY; hxUn]g{$  H@UjS%  H@$  H@$  H@$  H@$  dRꫯFƍѫW/' o&Ras'R֌ pų΂7Pkv'h4" 2K/W^Ƿ}ĉXb`fgSOfq^}-Z1VRř*V Ku%Zҥ(pA'8?3Vdɂ *\K{ҥdp³N;B &n<;+;mPMO`>`|`47D˲3'P>g@jnH :8x7D; Jq~Wϟ#+-`n8![3C@~l g%\j;N'WJUb (pOO l58 bdbF,0qc֬Yޚ[k"G /. H@$  H@$  H@@ 04kz`;IP5[$ Hj+ H@$  H@$  H@$  H@$  H 8pm݆{W]uN9唄2i҄2 x56C 8 : =5"33ءmۣGGdZI |;(3x f7ꫯ,’)T2$?~4halVX ?;sTG+ *Wʗ/\zٲeA9{B֭[U?H ʕ+wYg%RJΔ/_!+=\ZYͯ|! xIছT ftO>X6`1ZF氰PQ˒ AO?_o0|9stm :aǖ)S&m`_C Ԭ6 ~A@(<ۢo@P{[nS'@MC,Y{g(\ @-tD6aܹr$c uE[_~H@$  H@$  H@$  D_>r/f7z *V,$B$  H@@(P+f6** H@$  H@$  H@$  H@$  H <mwyl TN>r`j%f?2P1/_ 8EI+W*8{X c{.¦ Dի U$ܢ ۨ6lxL<1o\27&) *e)! *Y$J(tN;4C_ ᅬ֬YN >A)0 i#3B %_zMPCg {6تKnb0hb :_y֊G.<eN-Z *HDѩFκNn"JN=UZMfsM~nP!] ~f`$ Z I#VxLӇU2TH*V_ fw>+c?͚5jc={xa2]. H@$  H@$  H@WY C_B.zt+/__-$  H@ (P+=!=. H@$  H@$  H@$  H@$  H  ,Gy}A9⬳Ίۼma>nIV `[֛oZWHIAc0vAR2Zv-})=B,@<)cyaF =ڻwoSHEEbstxĉ^uoeɒ%鹺mЍ[~q/KwС$y:m *S ի\:xy2;*i 0? ={,O /6ov ^z w"!`_u6͝fraahC|=9}t%FvfSeTbF39s^s+&Nd \wy8/z H ]+VF^y%5C 0Px1܂V d]&5y;FCksgH \ *`ce;A I4ajPF):6E*U)nڴ b(Ri7ouc0HRP! <͹(Pm^rr(Cv-eҏz`,6qPN:$0Pj `cZʕK^&h˗/Qcg؟cK7exvlۏUI>0w+X{i/jք Bah+iē9mڸwaxM7@/k *`8fLmI@FbŊLz*U}h>k:$:/ mQS`躂#SICyH e1P^?x:ZǛ}}K.A٣[.]v-AE) 0P/X/ g W@JG,pOJi>yXr%nfqġJ,L6Nh~˖-ظq Ǝgk3Bȓw'O^Ժu ڵk$Ő`I'dL3'8^f#a2ʻuob:0*}`p.y=6C(iF1h,O<DžqҥK;d b`/{ZT>o̘۞k01c_-kFW=U-'xЬeѢ^Dظ 4 2?nSV e_A##[vH o<" ,`!옎NFR zKbJpv( RVp^xM3G9D`;w.ڶm5j *̑U$  H@$  H@$  H@|{?-a(]^gU$  H@PVVS$  H@$  H@$  H@$  H@@ }A;uFxFEͲe̙?kA.]~eVVkB%Po8|Be[Ω2U1/}xuʢTu[&:lMjXK$  H@$  H@$  H   S܊ TVGu-H@$oAj$  H@$  H@$  H@$  H@$  dN OC޽;jժȳ[r??q~;=nL ` 7 AtQO2rjǠy~vtҖG^xwo`8W[T5@FnˈWXuᤓNB…S]+_W}!`Q2UE%ׯoaV'cƌ曣R'c͛vjQټZ$  H@$  H@$  H@aص 7`tϥaC`ysJ0\$  H@8N ,.! H@$  H@$  H@$  H@$  H@1"о}{9z‚ b'\M!{*Pk#`5o\}u5S``Pj84{S5*5G <X1n1f6``F`V`^`wY؇<g:@X8'Sv;as wT6owrrڴɝo_?yv-[`xѳ'P;ͥK F`jdx"e PڿN5}дRK?rMj ?y@xC?cS`H 9s>;dù4f z1Qq-`BOEuSq+h;jٔvѩHxy~‹'2LAv,q(;~aO??`>zgwC8/{|iah ۋ.ˉ}n?>"p 5;o,hӝ~,i ]l \9\kr%2 ya'ՉVJ/0U~z Qr2yO_p{ŁU㳽j2"б#p= ć=mc=EP Xvrp^L\=K.XaC Y WټyBL4V$  H@$  H@$  H@1$t-nq/U hͽ9*$  H@PVj  H@$  H@$  H@$  H@$  Hmͮ]ڀ+D޼y}YPVE @୷܁Cl-+>8(38Њ?{,>LՊ0k@G 2e) j޼$Y'Q}N:paz3-Z0}9Xvu@r@nhÕ?h53qŐ&/xr 62֮uR.H.y;u[օqXFqy[۶۷ B:0@ u\nB->e,te'yW|0܌r˝۝\~zó]`AwyW`pnC~e#F뻯Jk@bXt7}(41|[eEߧ@4RD;>=Lr!~r P{{ xiApK~,&fQ։m&xlDzR" 83g r6mK,w WٴimDŽ$  H@$  H@$  H@g%WG/x 7@H@$  O~" H@$  H@$  H@$  H@$  H@HYQKegYrϐ!CR)e @o*P+6kțR@Fǁ ۶ -/Z92$vFK/jaxe`@BnJfsՐ'N|V)pT1DUsAf(/)$c~=/eAY^ :xлI'S b,'Fq౬3 81-MyTޥN:/91ʻuob{9wIz|ޥ{ q[}1em`P#T$O 1\bCw%`>KDm@*VtC7+Wt-x(Vm* *{J34aZ3Q#J U݁'&LpSQČ5k,U2$emTl%$Ф *CNN3bh|7o?XT$  H@$  H@$  H@Vq'jw}Z O" H@$o;RE$  H@ޝPqYʒٳ%l-6HMMRM/EiD!E{IQd-,o^9,{{33sΜ93/       @V鮻rEoQnK#GkJ݅{[ :ߖN;M(dMcE֭u1c8+̤I{n}}*Qi#[Oى޼/BIդ\0VS|d&ق:V~aN@P+ ]i+\ڻW-7U$+@jc-Ć ЩNGE_O?M:Ax|^=i}{慆@Yx֔)7޽-9_kW{6%?fƐHzjk$\}^pI틐V`'/m@ ,)k' NV+jժDl>GEVrD-ZHI?3˙LLes;Z8]M7ݔgPۿmEjׯw]aL ׄ/     ĝ?cFvA\q1vhӦrK3C  @ c@@@@@@@@@2)гgO5J\;3ޢ&` /,WVLj66pBd>}W'el)`-ҥ% uz%5lPw\3bJ JUԉYꉝ3Gz)?Lˬ:K7˛7C-X -\(m2ea׿xq{/)r0B' c~'&5X0-˕ NUdllOҷ& eEgJ/5j鋤J<ŋP:@IDATK/Z ;ۉl!@d,pӂX;.YDΝ}4yzjE:rԠAh>U4C7l[壏8 Բ/(լ3,"BYg N \KZl5 !QNFVs_4;\V19 6Z_OF     IkZ3f!Z"ٱvLbǎR&Ky$=k  )@VlnL5         19rhذa(T[]vңJni `AkٲI_~)kw~c\=y}T \:/LN)((ݻw;t]wE1IA XfΔnY<8$hk.ɂ1l҅v űB /H*kVCvŊ~N pfǾK֭鯿$; w" x=`A?˂B䊎ñr !wn?mB5Iúu~xҥҒ%u , 9kԐN;M:_"9@P},0Y3iɂ,4Y#`W=zeK Udkcu- ~`ƍIs9v>mDjUU$?ٳǭC'P+_T>\nVU[W6iBS8h~}G&mٲE6mRɒ%`nE[?h@F7ƍӥ^2K|=ώv~Rَ6ۇl,PX۩MC@@@@@,|4kV`oSvL|RӦR1aG@[!         ph-Ztk޼y> &M967 ʗ2"'K*%;s$u_؂e\ >/%\Kٳ] f}i} 1+?bԿTd'M2'cX`aVI];׫~S{m'HӦa9/ tTt-]VuQ^`[6f'X Ъ_ph}x}[7)gN`n#!`nmܙt˱uDn\ ^Y$Dym?z~/[٬2;T~XkZl /uZl?4y&{7,௼m[Ff|퀦!      X`̙IZSG\pԨ1  ]$ $@@@@@@@@@ V}QS|tYFj˜YЌTztW&'Mo/-]/Q}|*Te& tIeI XYA륫l)fS#e^$ټ_3$ 7? ´ -[$nlYDh8³BAXo Deh`<:eKgO 6S> cOH9]v s>\:蔏6ԭs^jjZ[f'ߔE&֌3ȖM@m]%\v4pZejN܇@l \zg~lM=SXrwlhՃ?HxlF`A#2gy۟5U<@r_}wi&,X0@@@@@@ O Ϛ5~_?g󏣏o @@ Z)E         @2eԯ_? M[zMC-!vWiӃ{tS2JW<~e=.da/(ըq`_F&ímr Bi'b uQ.ȕ$׌zEHfof<OreijN#Fhڵ*\p_ng׈ ,"     ۷K_~)}gI6+qܹh9 9sƷs  pxw2 @@@@@@@@@ ~^RY^e2$`'['-_gI.G+ի8+Z{-dY5%sn:edؼY.S´2+ltY`!~?(=dpaZ3gJ_fY% طޒ2ô2|I1=&,s7yt晒]Zԩҍ7O;{.t?_nP4iF-0-߉]@ٷ@-{,P+4s}8@lRҼy:Y:~]IO]YnK]^$PoSnZ%KLt ѢD 4o.Mf_i6Vrȡ?0"0/)#C@@@@@ &֮f~}?8qc驧[[a;W)ӊɗF@xt         ]Ԑ!Csヒ˝[Ryd2(P O -^:],o8a(ԩ.#[7j(JJR*GI@h'Xɓ^x|H ?TtdKٶg4fTj:ֈbU];)W̎#@,_/+u*/w-W,dU+2/ 7HNdͶ;ȗN;Mzig%+OC KZ2eRObH"5m3~飏y+`d(Gv E92ãDI'Imft ,^}.dU@C ?d(W iKEm&1n޼Y  @@@@@bR_JJPAX%Cizuv~oItuv," @@&6         !:wuO>|\<[7i"ix!H- ׃u'R6 _pjuVg$lڴi:3\KtǸv,pΊtZ?H[cLӧ֮-}4`dg~^~@Q 0n!@| Xr۔Ibl'w.}v![-![]j-BaZ6^j͛'Y! Y!`!(%[!K?\iw\?@l~"[[^m+v([߾c@, S,N=Ӽw'A[Ep 42-`-L|V.)>Z۷K?>\Z\Z׮]      @ 13fHvӹJ !ZH| _[8rNKU # Y @C@@@@@@@@@ \aÆ"X5vش?1Ys18LrjՒ:F0}d1D;2jtRN4e=-݇E=LzYdgƏ &V`u `-[̙g5kYM9cH]JCXTzi}{㤆 W_jԐ|SZ.)dNķs@l XSnayWKB.\nZ.O,PH"X neHիK.?pE̶'?_BI4bY坨\9驧by.wlje@-+dg42#PTdm|-[nZ' W֦M(h4@@@@@H;&؎?~*s7\n̑6ofΔOjF'y0  @jNJ         @ Ԯ][]t7߬۷ _}_}ÆMf. Ԛ4?وxb)Yسtݒ#0|x̓^D[?)K&$NFoR2g, gԭwbҼy)ٞy>C`JiܸeV<>nQ{'dIRGgn|<"#K/DbId^rp lْc $NkU2hd@B:[[B#H?l+HEƤV`ڵ(f+u*¾}!i-i2MtPfM4Ny"P+"̌@@@@@EgϖzHj^:x+RjP3?^EՓrkf@@ T         xi& 2$Ogt$y 14LjD\3_/-_YV۶c{/L))>}9YCZ l4uh}Y0O'O"ըɭ*Y(FfۧJU:h˵J2+Gp IgVlo$y&Mcڵ̑:t>ؙ8:c@ ,2G$]s͡yɑCn֟IVo եliIJ_Hi_x7,Y!Pߤ!iE7f ~gj팏@#P+Ȍ@@@@@8c.SUK*P:TEnQ鯿?\bD8`V@@N \n @@@@@@@@@uzH+VfK_.=d' XX@8?][s,MvP\zc4e1-dƍ/R+R҄ ;'aZ%-c|1`ԦԪdaZD1BjTRE?_ z zyZ]Z`¡ښ5~qy 7vOHJIGKN ʙP?f]eΝJ Ry-X@8:vN<1i atiW7oN"KG Z :ul-v-Z\rbmTkZE P+h 4iSdL54=`t9ңJFIcH噇`;qT#@ klB>f~_!:-HժIŊI\#Yn˫VI/$YV">[ &daY9Y,HL}DN#At_.5_I \KF'y={"XK'`b鵳@e*{vgdu;hZy9`6-},Lk֬YaضEPSNfz!@@@@@@ vƜ9ҰaRNryKcJEJ#}d|4tt%R-OD@@ w @@@@@@@@@ yz\ 9* 6j(cEN9EjT1Bj&'ɋ@͚ Yƍ%+TNo Vz^+Fs7op?Vw˵Q>3$5bIzu'߆biuZ˗Olm@8ͥa?'ʕ+kKpp-[Õw먣 ,7     d@G;Æ~88/{lFS@@"ͨ@@@@@@@@@x8պukW_gä.-JYd2 P g> f̐q"|trE? $+FL ^`@s1ZjcKJ/ ؾS:tʔ>Pr5<kw!%tyuKGQ(Uҕ;?رûvڵ2u/۝m۷?^dgs.l|Bsk]+W.ΝBCyQ^"2ֶ>\7W0-NW_ Cr)Y2 ߐL |KZmޜG;wܢ-%x-hܶ],|@V :5kkZnSNkܸ\! z;:}ۥ G}sc Te%Y=A1 R5@a@iVi,?`$ Ohahj [ݓBmO#_B/m†жBvBm}ɷl=vB E2N+lm-67!+$fNŋ<$Tϟ?_\pA"rXr7 mBvj>(\)kc*&Y2i_anU$,@)    đVawʟ v-ܮn[B~>ꨣ3(P@Ǻ"Exa+B_~*)@o;fAݚ4nY][*W.ED@@ r42         Q.0tPURE=(ڌM^vRbȑҐ!gş@͚rիGs2q_|6/z=d]n/4(\gnJ>5l0nN61O,u$*%)tRHǍ.L:\饗NNF&L+8`{B6mrN߼yw~[lQNgY_iiV8ފ[`EboB2T>t_b '/`PP`Wv@/Cϴ4G+L`ϟ` ,#e=tU6YP=e ;6r{ˉΝ} @ X.,c Ÿܲc?+.H;vִi5w -˒_GjoC&!.?ᅲf,YD\ jaX67}sʼn~eclaNda\VB͊.]mez>Uʕ+{+@-+DC =χ =a6g.eۤ3ج @rn?ie -ҥjnPpUK(<.S^Oy۶+>l24O?߾[m9f8-d+`ߑ) v m=jElyf X Kw]?cL}/ZNxdjj}h@{߼ʌ_ϳ@G}ԅt!cK@-fgNCC@@@@Q1Y|wBgٰvZ[cPBNqߌaY[w(p~Ne8PH]O~Kh|vL'RpaҮ/^_;&.mO~K*BZv;tc!Ufu_r F+" E |gڥe<@@@@@@@@@ .*V޽{k袋q1cfj)=4h\dj Ԩ߆'Pkt5',qϸl)Wוw5]\Z>Sp a]gVkW"BK}b1^8A02j*/#yOO^Tˮ1BmKXP}B!P`+WަzztI)hh]xbo{"M6]Z,˾Km{Km0жAmҊ%'m+|U(\srgǻ6-IkR{N8P],X+h X[ !P-@-aÆ޾ɓ'ꫯ9NJM@@@@@ ݁;O?]ovhJu 'Ȏ_U]=7ovLq(+t<]q0v ʕ+߸m>XbŊy[vn).ɆJ*y-ȃCp\V`??o8SVc~7o]U`!YkLa%JP͚58Bmžeg͊Y A6{}l`Æ ۡm =P(͂7/RqҖO}r B KZk!Cw7~p?䓳jfLi&Т4lX`|GjҤ"vYAV'IC@@@@A¥+o%6oGyʹO,`]vq+eřmߊm|r/$.-0B;VٚWB︝N;M61T/~hg}ܱ~x{V-suIx8  1,#IG@@@@@@@@"+ySwh,5CaJzZl?dɶ3BKT+v_g{ʉd"*PKҝ'W'W7=f /f̐ʗI[+WD嘙ϩS Kv rEcfңzB?@EôlƯF \x'뚇$믿z} $aY.̂sg>[ RX1W4OCe X@GB!-v5XEֹFnw vjݺ=ڸQ.&ʂf \q.(WH] ;<+ a!,(x,5ϊ9N͊X0HpJnôiӼVAߖ/_>ᇄ,-$K V_|EM>] zoW Wm߂dbYhs 6`M ֚8qݎs=׭wQVd\YլTz}\h /+Z@C@@@@]`Νs,@k;~[0n Ѫvh'o{ݎ=X~zl2l}z嗽-iӦޱ?v&z?<˂s?{M(Yy$           dP 6LM4￯:+=E*V\+ JVJ2 HлTZxGIvҦI.[瞓 <թ; 顇?Tf-X@?BVފۇZQW}؂:٥ps0 .|lh#˭Z}/_ KԸq]޶m=+o]VtGrΖ-G^[ԿDL` +bé?I7\-߿|={^y!,ߒymڵz'5bYY۶m8}ٲ xiܹ7{7|Z nk׮H7 ѱTZtlٲN }/_fٺ+W[ȶ/01֦¾,l͆:u:MD/ 7Z;o6}'Mˑy/U6b^}⩈۪}-TH'"kW]=Z>5w`<˖-7|o]Ť6ݷP] #u){]m x`F:(o]S]vy .Th1cD{m 5܎5kzα\ -pwKGRY)zjFZr2fϊ7/kHҭE#mJZnɓ'{  g"-$:E@@@@c"Ǝq>S\Լys 2DmڴI'W-3ceir'BM4I~a;<]r%xvscz^s{xv K*Tro9_w@৅@@H7JWD@@@@@@@@"(`'X'x+QGdTQUGd$JO6 fB]> GzW+[/ 0E3 ߻3oڵgxN7l ߔ>sBg%w|mۤ@A,fǎ^h[L2^й.oC!G}W<ׯBO~h9 [: y|3#ao}C={Lwq]~ dH#F 壏>#G;Tݕ#gB}-s_xhmܸ۶AuUWy+W7Y,S#H@Μ97 ~k׮O\rFm6|6l?xTl\:uTn]-[G Ժ~imhĚ/RٲeiX3 j4[7N?=ncVZynDn%xtI&@@@@@&LѣGkʛ7;f~da6-sVKw C]Ղ o73<O[lOi:NNjv4jT^}Ur, XaՂ \3EdtOZ@%-={K.O#իY0 cwϝ1m?V~ܹޥY-#鮪kϞ=*UJЇ ., 33٭Ȇ V3jK˓'YWWH.m9o`R$}N>}sNu]ݻ`ُՀ]2ˍn{zՠA*-Z4HݫyO>ٳgyjaYtK팪UR+ 6%\ [?=O?髯Ҝ9sO wmm zaHGyF+&S/@V6`h,,y{LQ\&}!"4mZ!f͚ɂ*F;"f<ùXܺu! ?@ A     ˖-SO=~{6mhر:묳8>%^SN9E6vmݹ4_C=ƍy';"͎ 7ki7?;7_$;6vWfu_7B@@ 9?         pk^gy ݻ/HG#bw>`,f֬`^\^s\Gp}S *V,St1u\k#xқVۊvr_VO?u"˧vW{РAQJ.sd!{VBAX/7R<-+}v^!F.M֊[DXLK-، d,ߒaruݺu^PԸqԭ[7=^hi*M,XS 7_/,ŝ EIxXN>l;Êsٺkha}7ǒ"er6tś' k 5j$ ^͛{m]evFڰ%/ø( gr8i*nIrbiN i&M@- \ z۶m@@@@@ v<ǫD馛W"]wWPSs.M6M#G_O<{-XC ݗ/_ X@VŊSNޓvӷBxg"}B6m-Z3>iK>[Y |_C[Xa+zc( *U+K/nД)S4ѥ)SON#7"R@6mT.x՟%KI&zոq_O%@ vr̩5kzCϞ= _f=c 0` )m mVmڴQp$CHɋ%eEh H% @.]y\ȫ!9~¯Bt gjٱ 4@@@@@ wܡ{Ouo58lovl+c/nv{イ=z(W\rmh gݲ󸒷;%wϲ,6ҥ~QGI*U"]te L @@@ GD0          )`턥믿>.g 6,.gJ@ժ/Ix9Rx 1c{[$DqgH.Xre˹չۄi"vNҠ{6i'fz˥}7 q-Nkժ% $1nAvZosϹWz4z9rx˽zk˗{x W~a3[tic&OEna [f\ $_!֩SGfLVW\q; 9ZLB6իWkĈ{p. ,XkZxb}tYڦG!_ǻ\2Oýebu'z1C ѢEloY9-:lѥԮ];:&(NhQ,8#f#,ow.h Z~@'h +Pkܥy:t    cWO%$͝;W:t L+%V.Y{18J PŊ5~}IpR=vYn-]r\3ԥ4adygMUÆi   je @@@@@@@@@xa.mO>m^+(,Z T$<W8:VI+WJe/z:;Nn:BĻ|GRҠA3HGIn&]p[z̪<)=tqGz{ݰa^xvg;*THݻwwEBwz;?¿9J&:3HP%JxyGֲe˼nɻn03}7vg[uvw{ŋnV;.x@jzHٳժU+ya,yWqI&^xTr;&MzۥC_R˖-z܋ X_W_}Յ9nD-/|^(U[fM`LkGdnI.M3x\8>sW.WD1IG}mp Si=5m7ln׹uV| @@@@R Y[oϼ S>!p۩}k13^xڴiΫZ{^N:INFCiȑG/pe4kNu!  @#/        Ī@ڵueo[KڷOzx3'=rI*e9-pNL&}ױރFӔ%̛7} a'@̵z啒}9^VLI|gOرrW; u\ju|q׮]0a9Yq :u֮]tqIŊKO<\\rݻ}/^ .6(-F_8&L ]wskeL&R]}%z @7OOcQm۶ǂpjm۶͛\| @@@@B֭;kuu~#l߾}\ƹa!͝;WWVŊT&ý߯IJ8=G!  @  S        č.MczGfB3Rԧ4tߡ{LDU~[VR"/tRr#?~_~IV =i.[q]5wDX<4~\R׉'Z%Θ1C+VаaԤI/4/<$`Eҭxѣf*Xeƍi9-,?H(X\q+SO=nݺ%}V۹`E2,Pˊ|=믿g5nX۷o{yk=4N+za?fϞn_|޾? s8[>/)B3gʖ`\=ZۿJ8ov-$!6m믿v&9&4`/ ֓@@@@@ Io~_c%OIkk_~n7Tr˷oAΜv{w/#  @, Kӊ        Ĩ@btmɂVZsqɾi." *U zݱĿ,ϤsΑ;Oz9)[8_~E˗)IpIWR~*M_9^XtR۶-[A޽%W:TǎULx+zj1B~zħ"@t pںkk|zWн뮻.;YE{A baf˱kF7xzmq3=¥\p#Pˇ۷oPBrZPo֭[+{vN[!%s`3cTRP;vm.H.DZ$l4wt>28׭\$ @,# 8;k֬r'Ol.,k~ wV|f:B@@@@NFf͚KT[sjڴs'h*j֬v[E=$u"ժ%͛dA[[K;E@@}r@@@@@@@@@ … 15iX+H5G[ jjϝ-YTx'<3KڸZ׮8\, FZNV.fΔ ӈݻK/N>Y.4|?H<`@ƑZVоSNQ+;1~ƌ⋽⢩=@ :(2x͛'뾇lٲ%oڴ)jpXEK 3Ѹ|ۻw U^ݭqe4f^M;YX}fjDZ:F\ z-WIwis=:XYG >>ۋ]CrSO=+jaMB7KtFn^ Vjt|Z6qM-UZɵϯ jҤIu-P `h:K۶m͛Bi*.@@@@@ }ڵkΝ;k„ }4Bg}f͚9s:iݺzg[R,PeF~{w=Ww2٬7dW>}߾}.t:@ͪ~AjRW/#GVM MM`ѢE*_ڸq8 Ha}n >\]vr))l_;.]kرJ[N5kFuٳ21Z7Bc^<2 s1^0O@mGjر iҤ7no}7ey|fސRp.]_~wmE]`}KiֺQFy@@@@@~С.7Tz4:6=*W\ԝPzu4}'.L˥ihŋKZ[,wL7;D@@Ęg@@@@@@@@@ \F#l4d98W/*#(UJ*P@p+Y[ٳsf䟭e˖_?$+ TpM]P2aBm7?u+_O>\ӧ~UVH".8%%Lrƌ}v/'tY~}SO=% jРXtzݻ]a6lWۊCwygzc]+Ln~Vٲuy+o}TrY;|Hիռys/,ߖ )??e͙=v9r/^|=`'O֭[{ ,HcO>jE p“O>-[$wT\?ӽ|P={1C#9,"q|KY<##˷XYZhpnݼXy?c:mqM7'Hu;]v^ =ܓYnMfzWvѲT,3 ʙ3nO>ڵk{+¶bEp6$?X IStR-_<*B-Pi  .`.]i]le_|E @-]Z]=ϞZ[f,>sWҥ@,   ׬YSVPKmSLIOWa0-;ձտao"l.5m*]{m[dc_?)_'W=^zn\4o}xAN{lzoPuCa]zjzǦ\oL X nAdhnV+-_l=yӦMdoXe.[,gmԩ^ƍ7HLѣաC/|ǎ ?ϯ-[:eV(#12A >Ƕ5j}7n[duo85J*U[s5i" gm *xAt}wt-0@tG--R ԯs6-cJ*ɾ,H1@-4@@@@@ ?+9sf|jz~K לڱݺuSŊㄓi~9u;xΝ}#  @n(d2@@@@@@@@@'Pzu[oU۶mKߓх I7 =\(X&/,@N;M^89s=~>c۷os3rB'JU@0!][NSfrJҤI g@.Z̛7)%J 5XWN?O:$9<cǎƍuW-L>摖fx>+:kS$UkO?ʲe~Ԍg~]reĄ\>cXCBofnazwޑ}7ТS  b*S[Φ oqiu-%f}-[6Km13SF Yf!f&s==\-\Z.˷ 3GFo\&˷ǫnݺ[&Xn_x/_^Gyaĉv\۶m+kf,P2v-/^}ݘ;V ]1|>2VxgQ 2@s~LVj y(YↅLʕ@0~^][=Ty*|oA|wfֺufRm?jqVE@@@@]|Au=L~ޚ}~Emoz{g8{ժU믇s4  Q"%d         $b#?θo|rIK0ʕ 26Ӯsg}=]2[VI;wo߮w&pS6)UZH=RY"Y^*YJ$«"DFd)JEiQ&{~iifyf晙?39=9wխ[W_} :9~0w}nݺ9w}ϟ5kָ8yTZ)/x衇0k,n袋кukiiSqy#X^裏Ƽy]|Ÿ]iӦn)04:7|cƌqp0رcgƏ[jCM0\~g4h{Ӷ Ŵ*V fN[J(N+h8^\~ǢqmK8#=N>dwGW^ybp7vXN|``bA~->S'SD}~ӦM~ZxآE|2]^L/_⩧‚ puɅug2wJabӦvyh v)~5#v^ky5TO!R{ lX¢Ep1Ǹ6|W9~x?(pB\r%ҥO2ִנY')AǺ+^_ֳ/ ǭtcwr;f }`*#rϬe=JXݐ!C]{t瞰}ַʕz>֭[9 7j P^ViN{Ѹ馛_8wޮy:\xo\s5+Z-s\PO'lCy-JtTq܏TSYw:뷩S⬳Ί71b=>tP'Bqpnqwc%@rsu"s4s9UVd;N;wvm*9ѣ$SE6~ xslFg򞟀пG6{VȹƝqNxĈ&dUxtC"rޓr" " " " " " " " " "P},Y O,a#wK zUгXDz}N ~t}h;~zߕ8ꨣS '˦;#~o1D@D@D@D@D@r D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@$`ƼJ*%ZDx0aEʗ5k"MGd6|hV<#,x&"Zng"=)͞=O<3ZUPmӓ}va.܇~s}&2hD3ΙWZ5L8;餓rX+f46B?7Cܠ&?I:s¸f 7?FwԨQ{̨o{I*U=n]TI՜zMx-i'CO ARX!R>g4>N8D\8 ezf}=;΅1!.~xKf:Gk/cM {fh;=ϟo|UGaH"ճؔKO0! W^=>w#g]z `˄~]N;oH}3|鵱aÆov_`?>82DI;Z{˕:iڵLaqGz#ǺJf3QY׍3Vׇz~SK{hOݣ>*U9rtRĿ_qǣC?&$c j׮X3fpeF 6CRYHcfV㋂OY$~_+p>8fbQǼp|9_[AQks{lժU˻<ǖ3 ֙t&xn0n8?5gon(}4k3.ߌz+V 6~ xs}z8C{<:t΋'@f{Wu|yfla[Wʜ ۔%E@wʊӤL@F໨|g6.{'|$gYўŒX{)ܾX)%_3zhov&Nho ;?%?r" " " " " [>8%Qy4 r" " " " " " " " " " " " " " " " " D)xޟ^x9l zUxDt?"[2{{ۙFŤʼz X?b 4^I#[nu)@ԢP(@Cng}؀(fhӧOw~4H;惂Y?E#ܸq;c\8_P+{o'AO̙3n_D(Nct9MgX jgV?)JB3/rE8?xO?;W4tpxG9g ,v`c4b 'ֿ3Egؗ N&ts|fly)ugSS1 e>1߾ɓŠUGKvBi_xbu/G?:2hiSlwxzq.-?mi;TP}?y_p<)òֻ>G^d NF%k{ Qdo(`͟' Q|ũ}ꫯw9`,֭̃*(V/_<>ȥwL~$`kM3@:3 ]w'(t4#\f:F̀dA&@q?>-e~IAϲ zKcyx½n_AĒ'Yvλ$/U睁HS;g6lHQ VD@D@D@D@K@Z,a/)ʉ@ !zA~3_~eOee}=,_>%{&zf-*U/ŒG;֌ b<0tA5kr GbΜ9&.ިW^G 3 3W_}Ǐ}t+ժUՄ Tpfͭ;t]5ܣG,Y>l ~ٶmL{pgD~X;>̃ N_} ^z9/?o|O .޳D߭SO=ߛn 7x#;@>1>#8^x& ֺ{gϞ}ܰ[͛RdƮ5 x/pޒoF7]]D}b!կ_߭cTn{2eʸm ޹D ծ][f[K{KZfۮQf@&cx6!N?D~ iӦua}xVD;l{-Z±ׯ_u P ;6>o'uv(TďT~ѯ M@,M6amPqi \`g$>t#8L۫W $mLf-Q%@A߈܁ѓ_/_E=jS<9|G~p.Hܦ[b[ӆuff&2vnMs~ԨQ0iw?s|^q衇yέr_tc"ccҤI0rL^$ֽcL>gxtD9ֻ 9P"3L>$:0l#BۃBʗ NPAbF{oI= 0t_Aq3=~s',꧙睁ȵ!" " " " "  %)@ ,_{,bACh7AjԿ7/"P4Ŵb)E#4>z`X: ae̙Xx;Fct~ v)S0oGq=T˘G ml ;^&)NSԤ>uńO?QصRfn`:h p NHCh~ci߱T$YO;.Ǣm/8#G1N:_*XGt>9QY^ۛ7ov-XrH>p]vetcv9>,qf6 jهMSl1Z(oՏf"]Oo]E},;XrGj#\GӦMݦߞ#]G~Xb<ڵ{B~(^{*n5j࣏>U:?͇ۉ/6`{4XD SLpi&cUV2sqpشmcG~Ȃ3LaP|I51pqǁBЯ$z*yȑnsoo ze'NGQ E@Z§1'bZ7كO&AgĜKV1zV0bH/Y$-%~H,ϲ= +LCq{^n_SOUVi&yg ~7Kr" " " " " M@Z}~U:xC_|^z)OKxyBIS? =M A-Gp"\o/;(.uV'8b 3i9F?` ulٲwerA7)O8ÛD׮]L0x`'*Ѱaèl۶ p.`y}. H#r4R!%PN=&.'BТZ~`r̘1c1ݻcܸqp1{74ʕ+#8"{;v3HKɓ'լYӵPH)ņ܄ a_Lʚv jL &O02)+~=V>N5)y)ޓ &%#0\o݄L-C])R=SiH}s9o6>\tEHݟ~Wh^p㌴&r>˕+ RN_G^}Uק+Lޒo N?Ym kryuץt,-W7oKxXidv:7^:ۤ=wh(Lj>JhDs|T(<*G1XYCӧZQ\߫W/7G sCv" {-/b,q&kҥ3x=;o{/¶ 4@F\(Ch3EFڱty{8Fso;wvsGǯLv1R?I(g#xJNRBE AbڴDh)WLY߹DF5ۋҥKG" " " " " " " " " "P?|v*,+ڳd{^n_hWO?~1g4wqa\^D@D@D@D@D@d)" " " " " " " " " " " " " " " " " "h;}h1D؛v!t;Ȃv {jNJ,ԯWo{c9]#_5o`[3f@2e?ܣqX]jP|y'3s@0^7-[iu88.xM7TMc {& 3ە飏>rF~넻nYڻ[4Ъ,_0#! ER6l@Ŋq?^[G(\5jԨ]yEs4%6ӡW=o/:t  T?~ P/KjEk"CW^yʼnil{ۿy|YxݟpÔE(hCY vQL6 vӵiƭcat:ZX'E;uBY'ϝ;7_AyHFO?~6׬kxNj_"~K.bobW]"[}p?LZ~k֬ n]2KusPI&\%QjԩIZ!qʱAtQPpw4hHVdb;'K<kmIʚדNʛ;0(ҵ_dW\q';<}cNm۶dp g}0fTۓ9~}]vRJZtAy;+I"mxI0Gao&\_P˪9JP+exC:CIcyYX3}p¥NAխ[~/9+쿫AƵj*ʳ@V(VE@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rwߍkׂFsə 0?2\ On,1÷c=LD>s'Ty䑀!Mme[`C~N +Gya.R?+Vp.Uz*N$~';rʹ}#FpBu7"/ ka_Q<|Aw_.R'ߺL}y 0`@ntFC0A =Y>VW]t5D}`OiԢᅬ,4ؼq$Ol:eQpkԻ v^rpQ,/S|W{ϣqo߱[~5XbDO2rh;!ho gQ|d>lWmpu+9듵߿a}SO9 -Z伇q}b94@aQ Pہ- ? >֭srItdK-s?|6~.] :tT~5m{\OgKZ(L_`űd/&?_µɌ<~hl);&|׉OȩrOW9QP'@IDATB'Qm>8NZ3Aqp4};?/|L'olk84iR@:y)' =HsXcm]~_39}/Lts>krE?'_cAxt|LW9c3!_qD!1!')#м9ln8egeĬGϟq|[4lN:б֮gmL>}Wrv{?$w1zga.{3>NAт/.'|ޣ@Gv.mٲC AÆ cz&΂sn R*@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@&`^J"  y睞 xfxo: ϫ[g{L$ūZKtM{4ѿ Yxf\S~}W]W/1cxq[Hތ^Ҕw1x}g"@i>sy`83}ش4} s:D+fBfl]/'OdZj au]8A>蠃<7q| %w'{=P xf39=kGmO:[j>4w1Q=woXE}rY~=ϐȥUv=xVǥ/Qyvc[dށP#\Oy`[{x&JӲ&s=^=sqpM7?t̰gBv_ҌĔ! <gb}nѻXiH$XTl7Mh#L¹l uYޚ5kH\k˔)]tE^q~\O9邏N*[s yDܑG1Df}&q.sO?/h4EQώ;8v͞=; 9sf<άY;zC]vslʕ+L:߾~Ԇr˜>#꫽#FϨU:48B/@{PBZn^?W?~w,ۜdd!zw]ZR ŗ/{YIeZr֛|_un"n`݉=L=-[@>E@rޗӪB@ =?gzߠ$3#/)Y,|`~spsW;)7|~wt=q< Ep$OD@D@D@D@D ̛e|P{vbȉ$@`0`̈gDD C۶m:u'.48&gyU֗OOof+XK.,ҿ́C~:5\f aDoD8,K(ĭ]f{gȑ/^ 34 3VpLD{#Gl޼&i?Į 3 P&x[ǒ6h'+梉礓# +2Օ+W„m`lhҤ mf xp7S%L&R׭[9s+… ]J*zk:ތH„/m|gbӧ G^~y?")E;K㋿Cussxșl.v\~GѮ1n[6=;t y 8|+l"%8p }QN4B)iwpeK1@8UGJۇQJ$1'"" O@Kf)RE@D@D@D@D@D@D k,Z{{/W,+gas9CNA0A-{ĬsdRZr&$ Yyڔ &@ԬYL`rf}eBEw܁q99TL_Z nmc7x/|8ꨣԿV60;`ʔ",Eի~'GCmx0{ .[ze KQ"aw_qyL.(=Iguۦd:t y2M&LE>d?TCEŌi@F{|SO=TDƊŋ?\qfvTP!)mGEu=p/3oϔƂ9'=uԘG)=)6l@:up'瞋-~ P^g_q8@A2=[V8֢fE3E/"aϻg/LiȐ!6e\ipgoasiH&$'dv酻gWKU)7 M?\J#Gt}U'j6Dq#/*#D@//Y|ϽJ." " " " " "  w.v#FDH&iq;fSi$ :1lٲ_;sV<" " " " "JzSH$z7t&M؋6;^|1O[tE)2,\[+Wf  ub!2z)g,21M*<1ŋa$!U?oEC;rw g.]bZq+dӀV1ի/wA^@߾}M.}+!]v% ҭ=UZg:(L2Q&{ aÆyIbFh֡QK,ӧsBeˆso֑|Ӡx%\g}4*FTs'b-UXq|:QF?0hРBHsEu+&Ǵ+|i"nڵ`<+WN$xNiҤ +g0`LYJ*SV/" /g|,KΟ?lj,7o7ߌ:_5^6B_ +˅'@cqL=w\wc/?!qժĥXD -#-۶m#YF`)u۶mҔV" " " " " " " " "Pr)x;|6f/_>cA;fSI$N ;wvS;VsxD@D@D@D@D Kd/bM,9Yʦ@>|8h|q͚59Hdy睘eKQyF`<`ذ_`ڴiْ}3낂M n';QI 0E&0p@vm=pbZ<Og\Ȣ'`ENRVhfϞ:ub}'pw5QcZs\幐L3 ?̚^3f zf"/_F9\xᅠAt֭pFD"Y޽qEev:u*}QS| (UW]ƍg@s# 8f &8bt7EȊ+fE!UeiR&~ l(dۼ+"Doy'1eʔ׫W/P8f__Z8 ׇ8Sr餝]i|>sgY%Kʷ@N9u:U_5ڷoe_tfL8#񝂿}#4x` CuE|*$D`_P>x)Vq=*@R@DR0*؁@v@3gN;la6͈-Ptl) &{̮l[>ڊ^!C.?ݟMybZKM)\qԢڵkcΜ98Vؼh Oπ=]LfmCo&N^ z:~ogdSR :vfv҈gƍ%뮻yV0枫g<)Yf}:u%\ֱ\bs\ߒn~q'`|27o>~?3"QׯɄ `lLaqaOSygb&c4H]q7,/X hр ޺ukӭK(QdMY|I믶_>5G3):ׯn$Ĩ(b%piiɉ@9*uџz %ed]wqFe˖ŕw{`qs+,ˉ_z_{\D@D@D@D@D@D@RM`ڵڵ+{=r-NPtҩN6+/NL>=zȇ%=9fJxPPn]gKY:hՊKU.Cj*"'P&x&@ժѳ3w.L'M _VL;,5(֢!&Yi%J&& ¤;u`sbZ.8P`„ x嗝@ xR(Pl+B HFid);IL'ox1ɔX\ۚc=N;-'~+uK@[rxBַo_pue9C ZqBѐݻ~. FLQT)iE95w 6̉j=sx衇p3@q'HhrH㋤`HkK!/m^s˼y`_Ν;m_ЅeS8&P1&N4zSܡD D 8'ݤ 09s΋ٳgw&E޺ذ&BGrS~g '" " " " " " " " " ) {㭷O?mV߀_| BǎSZvEY){.s:Sʭ@2 HfdKD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@Avڸ݇0[i){ڵ><3jVr@yZ͙yd#L͛?$1͜vuW?3s29WcCLpF~0M޻HܪU0Et‰瞸K/u(pM7}M\}xWnݺQ@XnĔ9԰6 󞦘YgbZUZ#G}焇6mڔ;'-%Yl6mɓ'wyW>SxC{uN8gy&4i>3M㞾}zQäI$[HP+.\," " " " " " " " " " " " " " " " " ". 5k0lذt%tz}|iKS @Ŋ0c _H`+>-P@j׮턲)?(rǺBwTg6l.ذ!Ss}x?vٗq*?_ jYU3?N;턶mM>ё!ScwNUWD@D@D@D@D@D@D@D@D@g9fͲosB˖-Ѹqc?-[믿޽w3.wNPʹ@R -Td" " " " " " " " " " " " " " " " " " "k=hiC9E̝{VHa\m^`A-Gd[7f4gX6(_PwćS,WL?ԌO}A&YL`Of%0 4p7ߌ ӧOԩS뮻+(RӰaCs1hԨ:(̬(.4`h"|>MibV6mn'p֭ r ~B["iT坑&"2g'34h!ʴsIqWwqw},Rp'9i r0~>mqzӦM/{ wq|QlUHa}cڴinYd;8͛7wclͯZᓘƢ=nZZnTOZt|Rb޶~E lka+VTq~ڵk{XsP$LP@@]v٥Pq(C{=?qK/yOƓY-߽x0bස|_G(SLAD@D@D@D@DxOoD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D 3 r-x'd{隣n][\w]%`$ b2[IP+=rrAV@LX]zU*EC|iqAfJ3τ}y-XO_|&Mi(~}zpGv8;@ (\GQ.frٳewO^;cѻwo] PC~ "&ߢ_~-ǏUW]TȎׯw<~l&QP•r!9B1- 걏CO>~YaJ%Mx/|al%<(!@y3ロ[bhYf^a7]J@ժ9 j%<[Gv6\Nw߼0VI(~z @tx&lO۲eKP\s]t)+Wo3s&zJ[D@D@D@D@D@D@D@D@D }4h`^ҥK1|ph۶-vN;M理tĝ… 1f ĉ'^z ;vtY *Y${níފp@v$L7o^ol^wN=5'jժHG/ܹAݟ@Ekho} bl4`M_ۑ@^E(]zړzֽAZ@nO+Z 4m[4skt.\r+ yv/| ~tݼy 00cUZ~ {aYۭ;w $Qlc)ReX>E1WbEԩSljf]y啠A lK@[ry*6PVksA6mpo?}:Eeʔ)\YBZ!C.5dReZK (Ņst?/W^ آF/GIQ%@19_T֥E7ʕ+ƍDuq< j`^{<袋Ҟ#`w_VH=>W?J}iiLtĉ1 jYSONb1T8C0h u]xW3sEٲeѾ}{t ZrS+0aB9sc .ޝ5kF" " " " " "`$@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ׯ)3G~w3 \uLA&q d ywu}j{H;HE<xm`=h{ɖ֎hH`(XL@xM"@P,ΆqK\Æ cQ~gvb[sMuayGFWX >?ʗ\!믿w}ŦP.\k׺b@/8)QnݜD-ϚNRK *r}ך+WNm2,vCų>AznDM;n͚5Ŏu q~퇎;tR'KPc<>& )2GQPk3O!@q,}Q]9.pU}׍Zloىr\\=0 sYs/ÇE'9ޔ+|.[q7,3U jQttryN?t۶m+PwJ\\qr" " " " " " " " " "P~y@_vMguxyhӦ[=ТnHO@?ƤI[oaѢE^TС O<<;.'\4V +  *U wut y䑉GA!)E>'t=2A')Y1= l `aE&aig|9ж-P^xvrň{-Am6-fQMitR^TDY$K#6[ }S$KN,',41i4zӀ8Ŷ1T~||8蠃L@Ai~7,[ ?["l~zOKccEm͈Y`&THr81bN 6 >(8-vjc\t6m¸q0zhg,CqeK"B& jeƕs%xl:½s\F5d9.p4h .Gq*1B6sH[^x'|UW-M%MqaժǴWIDݳߗV0WL:'|r/(jǾjqL5K/" " " " " " " " "<|own{o&n{ꅪq)Z5kޅL^7Ԍ3G>~ jծ]۷Gvpk^^"* P矏Ao߾xR\Z_ۇXsJKH sfw4iq(˥og h(!Eh}Ŋtg"֤:9=rEC``4/&T)Er%PF޶~(YP48L>݉qUT) E#r n09r"PX]W m\nVv)q@2ʕsbӐU\Pkg4ˣ-1? @>}ꫯbԨQ8QB'2D:-l^6^ymN4fz7gq&NVZmS￱>+ILqn Ŕ| E|y  }6kQS.Qk[\ .]ꄴ|A]85lI&nmc Cਣ` ']۶mw8G"W(!_Q9Oys`|Qc. (`ɾ`AZ6gcN#8L%Pre-yzm= Gq 裏F -Z+{&4}S9֞{RxˀSaFREҥaHfvLr*tp;Ӟ=x)`g5[xY?"ST2M7ff(?lԨr?]lV~4qA%4 ?" k Qp</$9 sͅS_(Lm Q4XK ֬Yo5ڬ\N&\h wTФ/F|[Mr"J@[(Ooq)SBLq駟9hnV)<&R֭%JdfAZڄ>SO<<=\TXHrCz%4/+/岛"cnslq/N9B,X =]y5_NPrm7NK9% " " " " " " " " "5J*儞(t]wa'`읕Zغ}?T^݉k]Zjw>Zj(Yd֔7Y{ ,1w\P@k̙p|#tbdݺusLH:6mN0[1eʔǟq/EO> x1+ә*F2ׄs}s Gp{ Bg77n\v"IMG&\0|=#"@di߾vƞMT.h7XdžMFi윆ι<_~O!`Fށm 8p薿{~.~'6mڄ7bÆ n uaڵnm.Ghmؑ/묡 *|!6P@~x-ʉ@2 ~K&܈K[nt"}q _&Z'7F P (uLwB;{l)ijGuOSN9zB֭3BL$t|WkvKlݺBoŻDWP"ȕ/_ ^19_8`T.5x~86`_?Fn믿  ys|)zw 86r\rOrs L.9qX6E/vnŭX^F0mZ&LyEkFKaFLSO&V& j 4ȍEjԨ6as0̰< j%"H'>#Q9o3c).ng8aÆ87Kq;̽r}$ą)9~6:Y?c`^p+[+79su]ʳ@V4eYD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@+{Mof+_Pbop 0#@0CZf֌= /ˁ;F@$ S*hh8i,8:YU5<L<5"rTRdIPTKAkш/id}…&3`Hq- Vp6 4$-4 hk..EA.lCbfd/͛7 oS< s;-aygxCB|-ZN2;;2(GyOݺuԩScԨQXdJ:uPzujJ0*ӥ T4ҙ.׋-ܹsb5kR)q '@m;bL.rŃ _p/_s{ٲe9sf@5Xז/K-L{)?GO%Jdbq@Vkp\mXp6Bϭ?>؀g'Ʊ/!4.O=8 0FS^.0rH'4~mR,mY]e>xZ{IP+\:g]Xl#GCWuyhْ8k;g K͛7ϭ_{5> igs>kOkϢwI/_ sn:>  kkڮlNS" " " " " V,GD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D #4i}hժUk`oƍ x#V2a}[g= X8`ׁmDAr?q?? Iqu3xJ 3=b 9зof'80&R_v&Vs(>(jwE؟+q sHE ?w.*UT5 p8?0=Ǭsٶm[`O#,Gfo,xnh?Gܦ`2__XrMr"P 7o>Pɍ8իC> E??* #%Z?;l5=$]~3uź4kD{^z`P6ZŴIguj jԨSBxpSS o_T*5a_=<9VuCg p/mq_o cq +n  qL8F. /=5 aY仨sʶFqP:aY>nΒL+YMEO6m0qĨZG.kUcH2)S+gM7#6\B1"tR|g9*sPb|Y9|v͵?{>\z|,EѬM:,>gsLOND@D@D@D@D@2ij<D$@z/s=7L>@4Lξ4fs@ǵ}(ŏ¹ KvH#Dq$D(r@݇+Z/ L kwrfe!6of&yE8kP/A4>_rex΅ƯiX5!ooilFKX>hApb[c4.u(6FC4f@,-"P8P B뷭[wg[} hlءSVkF5*`{F(vZ'EDܦ _k.#B[`SxB\\s9:8l矓˶r+'>~Dc1/5s= -WiW)̚u>jԘdT1CcFc 4J4^Hpa#OV~4;hԗƮh;5o\~9ЫpɰB}68 `rt9_\6V/=/x| {hZj&H0? C֬kOh22< IY#5a"JaU\)8|`Р~+z^*pȑѴi"1(ה'@A}'N""{Jg6SO'3eU QG3fݺg}ٲeq-J/3V~c jJM CE ؼ#0nлwabʭ[vzqy;Ν.YzhzL#ɉ@=>'pY\%EqÇǀ0f̘D+ 9SDD@D@D@EW3@IDATD@D@D@D@D@D@D@D@D@D@D@D@D@D@D;tR92+˼N4f`4O%+ Lpu+`jQhF|'4HzaO?/18+u̙3U^sM}q}M{AliCW^ͯ|@ HUW%;f'" G۸1d jU\9s2@1"yk_LF>u2@R^{ʨӒ/>KN]v4i;JN;jɉ@u=lSGD@D@D@D@D@D VԊd}bڵx3*_d&-[DÀ=a%VD+n"썡Z/:_;,O 7>`zr"V^7bP}ڏΝ6m,ٞnP!Ks >?pfS=45^T"H@ŊJ‰Xf *W," " E@s,[sAYochܸqxeu}aū*mhRxG~cOe|ʇ_D@D@D@D@D@D@D@D@D@2ž=3fϐ)" " " " " "  VLD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@Dh ~&6slR3X扢ęg2eB_2l/ih,(j20$J DW8?(W.P_d_Ȕ)SЩS'\pӧOᥧѪUIe/p>%zRk֬ .oSچ޻RwTAA؎*XbEQ)lXQ@XPAދo 30}Lʳ+3ޫdfNIV!P+ 7@@@@@ nh5lܹHs E@@bZ@~x         n2rȨhz-ZTz5qjt6~;nA ԪY3N\MV屢.7~IzUtdwg# )RDח-e'OGw,(Bwz4ϛ(*hc kֵ  Q f޺m!عsݫ2ed0E@N?wҫm۶_W9bl5r?[#d4(p KfEbﲯO]vqZKSzxeG,    dsrÆICH3gJudsh@@@ j@@@@@@@@@)pK ի([(6ZJzl<-[JwῬZ-#lA H\J6a?DIit髯3L/H@-=3ΐn5C1B:|]M螅y\X~}f 2矗J:v YTD@ҶmQu: `sVJH]@xl>=ܣZ;wָq+W;q+Ԋ$.:duJoM -PkѢEZl'-/M     }_?s$;RϞRNVYO֋   @4 ^4?z@@@@@@@@@@}աC4tШصkvء˧<#-+u*@Uc8$iݺ!P+ڴIzYV-+E!Z3gJlA #`mܸ1#Eݾ#}d5|(8{>m")Y F4-#kI/,u.Y@਀-u\C2"*SLFc_@ 4l(͟/ق~O?թ^xAG֨Q'Oh@@(xb.wO',>ʿM6uY%'$XV 7C~@    "0wԨ4ls_H+rw!  DZQy@@@@@@@@@[4O>.Yt6zjAPBc% ><݇c6̞=ڵR͚G5[L|-˘{1uk?]wy.%N" ~ƍ#'&]wE߸^{M?=vN[3=E%@Vij.]:6Ȩ@(@-(l4e5o\m۶U ڵkZPXyӥߖ EkԉQ뮓o&O>-ޯʕK\r ZD`    ġC6{ϗzrC   đZq`3T@@@@@@@@@ VNΝ[ !YcyK@9LᇥWZ0k ʼn.:^=ۻ-ؿեd6˅[֯^U+[F1,PpaI&6޽Ґ!K%KF_7 vԳwVt^GsI;J>JAH*Pm[mB+qFHIɓ' @lHi Wխ^ZO?j׮w3g￯ *DⷋvIw%]stRJRґ#)H\ ]t=܎gF-7Ȟ#.L~3OTFz3gNw۝     ayЦMyF1CV-L    @ 4          "nU{W#Fpa"ʐa ⁥Jp< qtuQCB"6m:W ԲO[X9RRhyDZB>R߆B6m8공N{ BekWh ct/?tK;z_}%Իw!)P?x8;@ \{iK1 dͭyf-[LÆ Sf\S% 4H[vJ .,͙#~&j|z~[NRIs PX۔)ˋ+ЦMȑC}s͚㱶 7-!    &կ?_]wIv    3D@@@@@@@@b^oW3x5kT|L1W.i8i2Ue_lh۷ǯlY`lL\H/v"U,ժ%=\ܢEƊ){ ڹs+=&bE^[r馛޾dFK+ ? L{ ^BbExqi۶X @p XVKx d@ƱuAM>GޣSO=UժUcnJ*0a֭[#Fxe@s9iC:idU+S~;5Ŋ ?-__Dv@Y    ,ydsԣ'dzcG@@S@|5         s 9r6ۧ"^:ӁZ6$&^xA>\$J"P?/]*UdI-}ԯԦdSGu7H6~[~vt<*t:Kn[+H<A}Ǐ<2rԧOd/UJҍ7JGdhG y c{N~"H%JȅJP=ȨZc@ 4VpkWhw{ձcGp 4ydnZ_~6nܨzKڵS޼y= 9)g*+,(իT :tƌIe8^gN~F_V,P' NK    ġ;O~E+g=!CF@@P*ocC@@@@@@@@@ѣ _j*V]wԹ?bݺ,UapJz%e!Me~i飏?l1…5YX։'C}~QھƇ6r玦Xԩ>c۷/fcR 13(h{O<_>ᅲ@0{־}0j@ 6,Pʶm|E2"@VFgK]ɜ9k#5[TlYg_KɎ?C>'Opt6 Я%ߐQ&R\V-е4o4wnk.27_MS,U2RbKnwr     AG;GqEvo4Լy:@@@ P+.:         @Bt=͛S5[r*Uű,X+EET)5@KՃRuP+| I\>ZT ֕Jzei&Y31,4h !  z)>vF@ ŋ$P+b,褌OAV %G?9]T0 Zv+r'J|T>:FI'%߆qjVB!`n5jHoڣN{=Sݢj:t(    ļU繱~!C y3@@@@TJ;@@@@@@@@@MK*P]_b*W.,Y B(Pd n*9"-_.dLÇ>DCm>7 rk}{ߤnݤߗϗv-,4BneRrʹzWiѭaZKsWv3H[KgĭJ]H__ s4C{ ,P>?dT`Æ *]tFc@<*}}*a3gTƍoVsU޽BH:W.r&yERoK<q=(~.L"P'    DĉRz1M'pׯb   YH-lY@@@@@@@@@.B {ȑ#yFn߾]v F5а4`ԯ_-Ș,P o,VLڶMZFڿ_^=]VSsS'Y5kJKQCy]$;֭^_nLBoZ@ \Jܴi\8Kb]_4]=ry}Qtu\"_C $,DW׮RI 1I?dD`߾}ڱcʔ)@ D+͚ʃ\6.y*Y~}GjҤI[h&h{7 t,w_еm5s'{^;Y%:t(ڸ/    DÒ++MSV#G1]B@@Z=@@@@@@@@@ C5hР/_^J}HmH\#Org6 b%NT8 }RRrRR۶K/C.TzU ݺ^/˅?h[G@L u?2pTԱc">tTԢE ꘡'M(wb2"0ytԳgFb_@ >,9֭9~Fذaw0Z7H@ MC`3~mwa5i:u87DQ#PtRIܸdZ)PtҘ1l5۪Q,ڸqFX;۽(VrC@@@@ & ]$!s.Ժu3B@@ȸZ7@@@@@@@@@(XQFi˖-@Vʕ֧97/} (Ҳe-BXl+_eZ%KJ0sIy9K+VH|"=dϑ "E>5 ->|<XN=w삦Q9(r KwIGK[XY1[֞=8]W`0lڐ %`j% pZNJp^ `/TH93{Zo5k몫Jmw#;He.0jD t*}iSDu+:{'} P+4    @L |dȳfI6keڿZlW@@@ P+         )н{w˗OCZV2e\KT b0ߗ?駃X1UMpai.=TJݹS.HjBXQ6hxv=H\ /8X@GqTsH7Fecxxt517dTo,q߾dwc#I~;3fn "`mۖ܅$#@V2(lBQ wniSiƌlD*M?쳺ճgOM2qI.  (!ӭ籕_+J)~eR…qPsNƍfbZ[{4    %`ﹶϹu4gTM6ݮr5@@@ P+~        Į@a`t[Ĉھ}{D tٲeZjHb(8Pz!i̐4AYj{d+}!Z=zHJI}$$M_аFī@EHw%矏:{^ܻHJ6 -tR޼ܙ06__~gO>\:de˨>FEߺ5[Qb[LH"*P@#%p5l0GC #G؂g4AnW+tAJȰ@R>4&@usy5y䰍:h@@@@bC[^G>X*V,>sn:Fn!  ĵZq3x@@@@@@@@@ z pȑ1ХKZj!SvRǎ҆ !k3!@-ilaY+nCW஻r35{2;VڵUΎ#'uLeX jJ.4+6oƍz[;)< !ťm2t;#nNpJ. @ X/Z9zwtKJ -' @ ҵ= B(d@׮ҼyܹՃiߤzr /ԤI1FMC    ČRĉ҃?+Wsi:-   @\ 3x@@@@@@@@@(V #ꩡCN6UPlj]n)H!,.5l(u }w P;U( m$-_J#G#~E%˄F)O~H@ 3ٳ'w^ٶ{_m˱:Ç'\>NT]m;qvkyۖå.9sLnrʕb<~[PkJ+~_I7$>@HA ^(;tEl#`548c`[iaŋ \6bn[U+鬳ɓu#t,nf%zban@(WA}Za'A@ M0)S޽=;l޼Y:tE]A-*?*sNջl߾]vٱcqm]v%ضݻw{ZeAW)Te:'pķ!Y=_%*WnJ=ā[\ؕ{f`vImLp"Ep]-bŊ)%\]̋]ô%,^%rNinݺڶm^+g    %`ﯾ:,S>b{Sv-9|)=   q'@V= @@@@@@@@/RJ{(h Y8ɜ9駧/ @*=#z'\H[Y05lH/0~7DxyoKcz'6ktԦMLS`xiFy!$u5~M @:uk_vBK=zȝ'ʾi )έZhI6jAI -[\Fi&?.fs-m۶dgB=u *_=qHT 8*e[d2p=G\{)4rTi-`k߾}^}q?@],p̂Ȏ $2 J{ \dɒ'pqK.@UŶ t,='7[vNRÆ 5iҤjYQ@@@@@Ƿt}#!w~*>J?x;q   @\ d\z0h@@@@@@@@@ӧFB^QϞ=eK. G5tO?I"խdiȓGry%@|PK.. ŠEKz!uv+0ZjDKʩ2˗K}&Y"/֘_H*p4ptĻWH+ƻG2.`Z[f8@͛7G"P,g KO>k[/8({zZHӚ5kvZ[λ_>VX βEB %/B\2Y@SKŽ\*8;*q}s]cq'bb.}v=;e… aivcoa \lٲ*Wq G}yy /ƌ@- vO9m׮F%g5!    ;IݻKL]w=~A۶mS֭ޙ=@@@J@z,         eʔqR֭[%,YN WP_~̙#($۽cs^ɭY~K҈] @:vG;3ؒ}!{H^xAnqT}T+tҽJ3z5s7jE3-0k?uLW @\ b1qM@ a @3gG̙3裏SF" 'Ľ9xV^+V$\VZhvXRbaXI:=xOs\R۷oO8pªRURzur|t#[oI-qW~U5OwZ @-{.uԞk     pcyK753Mji&   @ 8z*         8޵^gyF;wk[V5uK>(=Tػ@N Q;p@_\zU´x W^y i_H+_~)-[&zk,>{Ҏ<i=-ZH"u2D=?VV :ztq (^\r8rB-"@ lܸQ>LV=rEm[iߤN ߨ飝;wW^ _!hi޽Zh.\˻,^&\, ʪZj׮-h!3+WB,L+W\!U"T Unݤw$e[ ZbwYN믿֘1cm6o9szZjf͚u)x!pK\#ZI)˼@'x"AeZ7@@@@WK HfɝI?͖-[4g=?=@@@E@xy'         >e'N_V jڴiX 4vK/I]J.upkA>=Z7|t;@ {ה)S܇zݧz#tr dFP+FI.MZII]|y`C:U '~FK'_6G@(Q֭je#@D N}=Fs5.I@n2_&pтZti1wci?|r9r ĪV,ԤIwjԨݮNXh(Zw:- ԲآƍVGO.VD]o=[j('}1bf*yCU="    @ |Զ=&I%Kfl_|rȡ . c7   @\nx$         Hڵk~:[lQ*]HITtՓl\?{n7OF@ 4w?W[-[Wm]̏?,n _3ߗh遭aܿԪt_|Qr{RbT:n&[Jy<dX @jYHK@^:tj=D{nvmر7vܩ_U?~wkuAYhK:unɻnk֬ݗ8(^6l]gsv9 {.] ֪Rt'4h٢R:˿@^2UIU    Ds_wߕhMs9Ǜ   j#@@@@@@@@@gӧEI Ս. .5]*T PAr ɅIsHeʤ#.pd@-j'}Ckݍ  BiዣFR^|3ư J DdLY3wI1B*U*cw t:,=D"Xm"t "J-Q3 GF2D.ʕ+' i׮N; mI8N;kLT?߼ܹs_j:p7ky\}:t*  =ljƱAի?oy%\'ۻBJ;w'%q{S'ukiɒ`L-r Jmڜkfwwhj .P@ڶ-A@ 6l $4dVCVfOq~N;4u==e o#I&*۴iO?T~F+Wjݺu4iU[I!´O%('OիWO7t^x/XkǎwkWjI'2Q1KÏ;~M.0a]|ʑ#LAؚ/_>P@@@@@ .tDZ4|x´ oڴi*Y6l @@@ m6b@@@@@@@@@ׯedUJ/T+, ш9/iAju]A-P`A!;vf̘3T{IJÆ2t ;DWm%[u[W^FnqVn]ǥ^75d-pky_^Gɾ2 uk ! @X,PL2aiF@2/бbN$|X}W9rrDĦM4f]uUn8_}'pm^xs=kF+VL܃aȟ?=\s=0a6nܨ?C=ۧ>}|^+]ye4O r s7"`q#-Z$YWK/͛$L='U@-+k֬@ sŋK۶eXBظqʔ)g @ v?P|˖vւ Ob[pر UB9RM6լYG-;Va) 9rP < Բ3-(.R_>}כl<r~Y@{    /'M,} RfΜ}UVAJ@@@bS@|\         @]rÝwީ^{M[nMcݽdըQ#kg[+Bպ%]s   +VԀ4h ͟??]Eiw._\Z=ܣ*UhРA|;!rRan8Yض29h5iҤw6k@Lq    Q$st?K_}Ɍ ZnC@@@ Ԋ!#        dnM#FC²l2jժ`T=+ FԑXB,P#ӥv+00`@:~nJJ1SNQr:uSn!V7%s@#i4r\Tޕ/_^k׮=k pلE) @Z7oadٲeڕ@"D=:8 $d,ri-ҤI.]ڛteJ) B zǵb 믿p6 glnrxi׮p~IJM D\z~嗴w@N`W@@@@2)}Բ_j p_.\@|،   pTw-         @ K[lѸqB2KzVZ5$ҊO?l1n Vc{8&7MVZz'Oh޼ya}E6i&Kj۶ʳXۤI~?,>@9R[z,K2D?,nÞ8QZ8%n夓Nrn5>}N:0t.Pxpx= CCDƍ>)S&FV~F#=> qciԨyԩ&LUv=CW)ŋW_U͚53UO|9ݧz*cZ~}/咆z-]s5*a齮D!{޽.ݻwWn2ZMP&qt x~i5jHs j;UvҡC臨W7k\X\achVNO @^;yBA@@@@ضNOxaZ!N6M6جY4+s>O\p.4ǐ9MO[z@@R R7 Ԋʧ,F@@@@@@@@-[a˂ECM.UlY,X0U>[BC}WzW.}/n8Q-`SuY.TlqP[V:fӧOwj[d;iʗ/5k$ݘ[,uK3f-Z#÷KfO@ \ƽ-Tif8ذaYa?zI?CNLycM;պuk/+C&MsCꫯرcURV!Λ=|p[?CsM8c߿_SLqgq@gI{\-[_GVWOڵգG, lP ԺBQ}|-ň%֤4a,^\zq[YM8P\YziӦ7Gi5r ׮];Rْ5vҥKOYA @D X֭7]rέ$@AL 3SlE\7{AX={po,XZQս= hР:w5+Wt7֬Y3tMI[nEuI؞9c[Bf`%TΕ{\) &MRq7Ajsի%~. 2D|w~W^aÍ7J~+-^ֈe͚%P&-Pk޼y$Ggٓ    Q#ಙdw{Bݩ;Ͻ7۽9;ryH}Y&->g8/dw+$+)ݟ1lC@@Gu~!         uU˖-5tРuRJ e]J=&"}i([m6+W]WNjժmy@Μ93OSބ-y&Y4ڬ*UJP[^.pC*А XNO-*{`-[E ׫.:A5k#-ɽfٮiY)\$m?^OoŞĒjvI9r䈥a1&ϰQ1. ~5ܝ*T/8]vZ~c+ *&X1=ݳʱ;K>}|>_BmK+ N)l4hV$)SF6?X03Cu)o;N>j)=: z]2բE -ZTڻwo0.@@@@F Ѳr!+g֭[S JCzc)T\ܽaCU>+&DS?ك؈  /Y>Dɿ.>B@@@@@@@@@ N]zZ` 1 BɿbeF[ya@5H_~)uV r;/g9}' 9o[|sΚV0,VX*J㨿:vLc'w?cOemӦnW,Y"[0qƍ0a֮]ݻ{L:U֭[믿G%Mb 7hСCc_s+Z؈#G-yɓGkoLkZ߿WB{x^}^藍aܸqzUVWO?pª\6mڤ.gܹ*Rt$+[%0%Э+5d4j'#5n򮹗k@9餓e۷O9{WO?tS_JY5J^Fp?wIwrKT%,>Lozv-H,v5裏4޽xl۶-J޺uk+Y^#|A(Q?$@_U^OC7`=PJ63P)Ρa`nM0@nMn,R|A3ƛhؒףDJ$2{ϛWR7iڶm/!em/7M=3|>ydygO> (e˦ '2Җ͛,?7 iQ[ի=d,wީU}f͒oŞʕT;m..r7NYr;O 4W5֊Vsnĉl:lZDVD@@@@po´of̐{vcs*=jr"CW{f~ܹs97s$~> TJcHy\ܛ(         IxO$ծ]B<-{Zg*;xk+Up{د9co\(:7n=:-tT}:u IqNzn[_޼y}-saW8"ށׯE_mýӧl۷~ms\O>wm/s ~DŽFk@+s/z'^{^֞ ]C!Cx]W~u^6?K޽炴|vσ>Of|.˻r(Q"ᾥK\0;-,;]W>Yry>8g>ߙg6SwP{=D{J0<}?x?\pokKJ{I5袋z\υ&ŏM5/kfթS ^ի,dɒ͛7܂ /z} kVW@ >Ox= ߀1b0q% |.3`HKMlGB=ci .܇1.%cfx   q#eWϽ[,ysCj'w=iG3;2exE 6n{_g l_meWR:#H}/lJ{Z'{@@@  n0`gۀ)         Y2{| /x_~W_\,k Z/w}(n>ܫgwgVZ5Ф/Џ={&l'ϼ,$V\z饁+w7'ܞlr%lʕkaZ86ʾ.Wy炝W>.)g͚57|["oE* V$~Ͳ]!Xx^\k%=Yld ZK^ݺup ڸ~i+Y^#|Am֪ 0&D *n,l4q@cB`ժ}wHPb -z2  Yɛ7 ׶&WhҤ,Zț7M;ɕ/_>/:`԰aC_57}_WOҥK{[ ;Jz'Ӗ͛ڸl,ba\-ԁZ[_䶥I\GV$S7C lߵkפmycԩq@-;.PjYIi.l(xc2gΜ]j׮5m]}uX K#%gmKҥۜ|Μ9}Ǐ<=1iԎKSzC=-"fmذرw'l5P7nJVz#?pU%>   Y@Ͼf9?@@@@@@@@@p]tQBrJ+qhdhQuki˖EtYt]=zIZj~w!g;x:_?4>Ś&L}N[ԻG%Lrnԭ[WCvnecʅm}XŅzr3>.~{~V_Q SNZlfΜc}m ͑[WCr ~z[6]^<](r0ƍ;xܹS>Äu lTj*$K8$7&MK,  U r4wn$0zR)^-`-{O.ѬY3sVH/ج^z%c[zdyrryP5:fɛJn܂޺۽>5++ s%Ju[Qzڿc ĀJ-$GvntrHPs-+ŊI}H>0.0ڝ:d>6}9QmEzU@DR (* D"(vAzU,V(DEb\t{3o%Mݔ|B̙sYfg&1+zhXBF<۴;_{cnC=8 l+7ퟦMַHK$˅Ԩvڲ{ӘIpއ3 ٗE}'m}>[xyxcGoƫꔨg`\8kJ:DTt\9sfø`0k    $n=rkokc݅PvNcǎu iו_~yy׺>v]3x&Mݻ]%kEr)X޵@@_`ⷹ5Yo@'{O@@@@@@@@@ȳ@ٲepPoΝy/ĹZ`xXҩJ[&m*-kHA;԰aC?.3<UW \> x1xgAJ M3=,^wo_X{X-Rf_̵^uU:}[XNbXV&Lyj۶ e\Mh7Z0fT'NԾM jI2ڷd}XXPnru&O vWC# @|6GcJ崽,)6aA\ߎ=mڴ_ۓ܎YNV"Mgy9-]T=zp|e,?RS|y [ I9JOSg^] ʻ#5[{$PRpz5|Kn(-2k,N;-3dMv˼8v֯_{y}vFuqB`2gy+'Ԙgղ,d|"$ڵkĕYg Ce^2 e&8{\{3lyy<sN;?a姟~ w;-gN{<|~)5GĶ/={v[!"P+ @@@@HN9EZ\zmOkcݗkZj徟侠J!͜^8w܀]+ovg=i裏*x} ?kz)nX  I,@$         KzjM2%ϕ[Vy7u*Kܹ?H}H~Kwwr_5+ (P%K^M]}q۷i5V' dի{>,/ն+'QtB`e0i&/',x/xѾ]%JB"R}(v{Z{>lep½ڰť>\r,i|]4۱n 쳏t_}]nrb/K_ˤJ>$B ǧJ_{kjժB`6xge˖e(q+Y֩]M`_s݇>s~RRd13g7M$4>J+C( @ѢOc({k$/.I^+=l5x[ }K頃zH)ur[;\[ 6&;<%̙3WE͏1UkS0S7bJ&b 5njYg~oB2t3bG"ozk'"_{5-X@-9O{yvϻcöcUݽ9;BV$@@@@غUrCp魷$w*@Jp,߮nӦM}R4/ו[XV]c;Ԙ1ctYgo=ܣRJe˖YڞIZ8} ԩSM[ƍ^p_I >X5Kz=i iϞDiY;\~5J62]#hر !QZ{'iӦҥI2{v@T-Z=k׮w4W[hmoڗ&4<̾XlAZ}5\>ѣx /SN VނFM?yd=ބ6aԩSdɒu,.LԹs,[M6Y}i\jZzQdI<'ykO+[eʔ^OcA\|^_QYvLz衇y~جY3/0?YRZZt^X}x?SΥMd@`={^|C-a0JIw!=\|+~Zv:uJbz-o Ip֮TRFv:…⭷!'e|~^wuZxlǗ_~19,q% ;oh%ܾcC ;.h;9ra1+VʲEpyp7837 _{'4qD}7xNeý7uqIj_۶mɓ'{N7fo^{ چ?g_B+̌@>}2=úݹHw22˼ytqyZ׿ /:xZ;>\S1;Ҟ={W_[MLa]\nޮks=vnꫯs?9/Υe/ٯ}w^+H駟ÂZe   \w݅S@@@@@@@@QM^z[$8p`ثW S+ŋ#G&j ]ݻgm)о} p쵛80иq t ܹ3O޲͌5㬕_~%& tI7ѫ~ )S&pgu7i:۷oz衮>֭xꩧ 4>o=&eͲ_`A})[׶?nԀ%Jx5l0g3K/4&XgϞ@&MnЌe>Sׯ_߫Mrp~ᇀ7\rIs΁#F+f& /0{۹`q`桬[+B*aӤظ10!hс?&}܁ c*7w]Hs-v0xޏ@:u:lՅ䒁nݺyˬ.ȍM2>nHlnW\q7VjY$M$}fp'OVZydu{6+\HX4~ʖ-Ε~lܮ .;_`ug Dc8Q@1gΜH7/\@3RTԳ@ygxvݡ )]wU_[?3gO>[E瑂+s@@@Ew9;Gn߮l.ʵ!e?ZpאF3k ;zI&.,p˖- ;_bl~ѢEa! GʲO>^ٗmv  #!          &<7,7w [ $ĉujrT//miر1m=4ptM 7$zk }( *]}쟽"Сt!Ca.Emڴe]y]qUŋ}r_ RڵkW_fM5{侸+%7Y^[`F&HwnmڴI.K.|+%7U<n7yܗb o?ꠃT6"^>y4xzTběb |ҤIKGGZ5;k[HuHW^)]w]B,zP˹͚5˺2,礓Nx7̑  (/@+B_zIP2ҧH,Pf͚:gWe#4?#Q*un]>]&{iâEdZ{? `,n+ अ5qi4'|.BuU6QG;geŊ$wƍ)TIenRwڕkr-  wM:|p]|*[l5j.'PGK<"׮_{rSj=f3bBԊU@@@@(1=tϜox߫裏d7/yeԩ|~u!_c!  $׳/B]JVx3^E@@@@@@@@Hc 7KK.1O>QI޽[7nT*U.WJif ZHKիKuꠁ$裏UV:3DQwm[?[rfk׿{ z~[jvw{Db9D;liH&@IDAT@cX$[$:gK͚Iwq^~e]qy~'B6F@@@@ _ܨFqCw|ugTnZk׮Ƒ#X=-W3fFv}!2`o>uY@@ OYۇ@f         өz(֯_Mv]jմfivsP6@s,5C ʖ-uuֺ%7.ps\ ԥKoFٍW_6q.7 ]ioҔ)ԩ)MPlõJ,܀c%;65o].k_ .`O6mBv^ ["@J \2_DRΥ@j.HԾ}ZtNyI&I/}TpBo ۰aC=뮻4}tM8Q4hN;ͅo)R :?xn*U9O Gp{֭ӫn^ܹsUBv@m۶Uڵuzׯ/v.] в@vNrɕ()V?@/^o]{:j(N^u&|V{ |؜_$=6G?֬Y˗/͛76F@@@@ ̛'']pt@@@(h Z!        $@ǎըQ#?>v'PBT%/t晒k/-U~#@߾}e &>t3FYN;M:(b^~Q:䘫`Cp?Z˖I7,tRjJ6d,!l@կ%di +K{H6xG,@Vtl$@Ӧ~p… d,ē.R?MСCUzujJW_}̙d Bӣ>38 k^x ԲwWѢ5UMRٲҔ)IVh,eVcΝ;xkyخؾ}vؑz@@@@'駒]{x񫗚@@@(LJ07         @Z )RDÆ ӳ. UfJCgAsYDIA4{լY3;!F֯b{i X]ML p*m֕.}I7K+7ѴtIKx$eMxE @:T2B$Z&@ ^+|4d^͛7b9M6Mk׮;CSN9E|uJì\$˗Ǹ'6Cx l۶M ,=ܣ={FjҤƌRJyW_|׶mۤ ec6ə&W^N>Y*Q"m,W:v쨙3g+zoܸ1O1    Gয়@O(@Q@@@H Θo#@@@@@@@@@O pǎz"M0P&Jb_3ϔM7/ 5OcGdɒzewy#7w;LzVf< X1M窨e7ի+K\#YV˖rJ{ǥbŤ l@ ~Ͽ @f-[x5&@ ezJUթS'Z%nf͟?_\"ٳյkW/g\?o?u]zyCVJ RI`ΝnsMt^x^] tGG#qkҤI:묳TVTbЀ'H?ڼY.P#U}裏F *f8,]tۤҊEO>)-71\Իbnz/`Z )SF .^Z6X9J@@zmܐȣVIkHj/h!ի']vdon/wK=i/_g /@?  NN@80;vhJ>>:餓t-pwqF-ZHG|,K.ڵk{[ԩSj׮]IZ@ u'CnPoС^xVrXc 1 fVg~g=2d5j`osN8Aw_57޵͙#ٸ)Ļf> 40yż abu     ʒ;")"͚%`    )%PHCH=$!Y%oONyEmʿ#-]*~`]R۶k)/e8Sʗ@ BIG!@Z "3`, 'p';Z|ywq-ؓ;vx!A_|K/(hĉn|d٣b.~^koTn]R@`KU?x}hFM4n X;m7>0@;$L6xckiOw{Ed~bŊ7nrKVG@@@@x9H}$yxJ   $W&{B@@@@@@@@@T .ȑ#u}RJa[i"3ylrG ju/_\oaP@@w|gԲeKyzӥ8E2WH?,M ]rI6)Y/u!/zv ؼY;ןXyk'C+ j^*Q"{^Xz}P@ _ \@`/ Բ ܋ @ 숿Hƨ6ce M|ywogҫ*T:uõVժ5u8ys?l. @ 񬑺@ UVZ5kJw @իWk۶m^NқoJg%}a6Lʔ)-Zx]ɟ~IBYٳh b[eDuˆ,(}& DSqwviR?Xݻz?sw#*nj̉hVBw  RFm? G\xX+<qFi Y@Xڅ۹snٲe˗{˾+2*UhsAefP72˥@ BL؟酷ٽݶoߞQD /-vI'ynu-~(#N[wߕ?`^l,[iH:=ܠ3t;CP6mÖl     oFO7Z@@@ P+y+Z         C>ci&Z\MJ}V.L&[k.n!xY`ĥ 2D͚5!۪#1cΒU :/F!`TtQlĪ$@zҥ͛9sW^n՟ӤO;܉G|r*  @T$mؐ  P`"@߽N֪U˻/_^-CꦛWftz޲eVX!3?2n? QZfv[MR\9UZջUsT%fUr+V(ۮH"jaAر -|ݺuk׮͸e`Ț,-g5xw#GaI/XZo-F֓ճgOu]믽TfDZ7F#    @| }t1Vf   $@$k/E@@@@@@@@@PZn͛{ZjV<".5l/k~`Or?&@ ޫŋpӴ%ʵJO>)x .E.`ZZIn^] )%`j[xv}Wz%I6?93Ұagx Pn~^]M` [Hs6f!D)`AO\vٲe3t=7NB?Xs猗x6lлlϞ=^ҪUd.Neje3JѢEU {jcvo7 }{ﭭeʔxlKn[RsNms'*֭[eg[.e>M6yZcP|gfhM>e>PSE]z(q XW˖Rcj9X̙3c Բ     @ Գԥ.?    6j[MG@@@@@@@@@%0tP];v7]zyPɏe'7ٜ4xv~pC~ t8*<+Bd(SNnAyQKW7AvAzCET@ gۃJKSHBڷ=W[$71tE !@JMCA XGGGAHy qB?@8PZX[7<`Y,l)b!O,&e0+VxPwFT h%KkٽJ(q|lcŊnxuN7k,d,8x{n͂Ă-,n;vfuFR_(f7 @fϫWT -|_ 2J+]{4wԵkwЌ;u]/wl6lvl     Y#rtAsInh   @ER@@@@@@@@@@ nVQF^p&.$Dl8JxnC.պ'e!7K'zKi$iӦC3f q6agKK0XvGG2 "nds~7' .DnrecTVtn )"P)qp5kƵN*CHL6fض\8?n>هtm=٭nζmۖemݺUnF>TpU0*TU0+TPV00-'Tؖ-@ˏ/QNO*sX=)˖v',?gm?b8MiʔԚ3G.dO:Xz6z҄ 믿F}|0~-%    *s?wK&׍X@@@ P+L         P0UTQ޽euFPܷI5,PUDmBDh׮ƍ/XGyvc3-m֓~XW/W2O (/vzt-CII(l?M@D{Gh!`]^5A@ _֬Yjժ܇hԺ4h4}\QUY);Wt,@ qtMrB u'K+թSر*U~gL׈#ڹj}Qm     @ ;i"ߖ5@@@H         @A :T꫐%P+$K z\/={%Kn(C u9höysi(îʋ|T~_wm[L߾ҌDueMm[`E@ ڰ!F@PVZf͚v P0k׮1PZP 7L 9 L(L>}͛7(V[ !t)YwiӦEk Բp_     䏀]+nc/$5n?V@@@]@Dh         @B tAt&L}jd 𢋤gO_G$Si+$#< W^6&ĭUK6,jjhJ@,]*͜)]~;O?{OEZU:T󚽶{wM@<^!F{L`ʕ^J7 $n:UR%l+aFv4qbUy|(QBC.'_wC,PԶ1W mEHgꢮOׇ~+VD-ZQq2    Q _/m?޼NݺUھ]ڱW֎0}*Vo5jHv+_>5h;$@J~K츴ノ*ځ-j* j;@$PZN]i2%yi>@vӣ1ڵs _Bn(<('|;7_ASN#njmA     UѴoE0 US   I'@Vҽe4@@@@@@@@@ Q ѣGW_uYl)+3_'J6}GW/i4? /5Snݺ2el;SW_}u oF:t /G^0モ3a#F-=As*6y@@w>{N3FլԤԸWO0R]ƭ֬V,s"=nk - ^̦Lh-aZȖ2e[Æz}?zaPyۊ'ꢋܼZؿEI$[n,l˂jԐWUoE[\,* ߲͂YpՖ-_V㶛²}لzKɒ3vT*͂kT/Uڔ[ve.o6A+i#_BrruW mZ@ (`Z5k >@ ,Pr0i5>̝+mF@l,[7i4JUq][:(B #P mة8pw>8ֻ 6KA@@@@< ص6.y@@@HR此#         !0x` 4H' NeZZ}ןDhl? o H}#F Eׯw%(; BX4jE!Frgt^,nMlWirij~i?˂vʼeΏ-dLi}&loWc,+x*. MlY'H~(5o.uZB2H?`nB001>j!_ݻwQ>},.w\jxЋ8tworAnZ>9fcTd{N駥ast;_NמuB%Y     ,}ԫ?V8cFUh6D@@@*dv         ={tMȑ#3:Djݺux!H|OxܹRzד[ؗYj$D .?ڵk'=K[)[lȮX֕WJo'a!|UijiȐ/¢EjРA4i bŊՊ@@@@M󤯿^\Z5y@@@(>]         _t۷z,WVM_Mf¢I~}i|\9p/T]ll,wK/S)@2eK/iŊn3v$WK!V ]'頃bؐMHbFC@7ΟHY½wUU׬)U,faZ9Z:wi?l^Cr v|\\O7ސL-KC-j*}H '`yo607g]nX.djUP!f[M٫ԭQW,`/ZU!*Pt*$ [w e띏={vD'P+"&VB@@@@ W;{οI\Wgعs;Ͻ>m˖-ڳgOeΦMRP.!  9           9眣J-Xxnje ;Rƒ ~|`¿( @깙_|E7tyaJG?®ʋN G!,H4'ж<عs/O7o]w!9S4pt=H@Arڶ5C-ppkemA|/Hm z9 \R5jy^A =lfGXPp[pk@*Zj X1g-{x"Jv#@̙iA s4>ޥߍ?>-ZryF+!    _3fH_/+uzO*DvۨQv,aÆ>=D@@2           "pQGzR 2իkժU0/*HgK;J',J^jUT||6@Nw߭뮻NoXJ2qԲaV%H;%Y̑l?mK;pQKҥR~-HuJ*WRtF"@ MJ}$$۫WPXО` @ XVMK '0`THx ݣTLxDشiפ v$b??*cEl@e冬@ XAGSO-EK.ĝ-5R՝_n]$    i+`m-ZH>`i $74GIc.Zf"߿D   *G          U?;vdTei  *%ui$BYܟ,B@ FnV}0IY%KJ/,S"=P+Gmԁ@r]vm>ϗOYY:=H*_ .lQ c;.`j۱9\)QB-,gY@T~[n ík$jqq˗s-';'jtZ+uS,|P hDj?߭ٲEz) % :Lҽ{wz"jVjռI"Z@@@@HSɓ%;GyEСr7CrqjNn<.Mav>Zų,\rԩS\1GJN:,G ,LBj2 o6=Xg[ yNu^A Q6niYV<ʹF3gJ' gOI.zS7'mFK^Z%vMd6w1HeK@ =Z5kLK"8 iϞ+94`@X@ yJ0bfa˖~Xk)NETm[|y"AH\~F̙.#'kʕE]䂿ƹOWs`k#xk@@@@$xٽٵK+=Lvfޜl<}_*E@@Y@D~wh         @R [Euڻ][ָԎ&JN&`cu~[#ի 6;{D >h=f[/%yC{.i(YRP!mLGpJŋPѣCrKΝ+rr?bŤSO; NU%U&=v߫XV ̊e+2_=9piSR2q)4-C׮ҫ}I:IM>Qp7Pk„ aZ     -{4iR~5'iɞS8C"ص! r"  ),r-]C@@@@@@@@@ *dn.grAy?S>MMiIv&@2ex/@2d.2 _+^u+NwycǎV֮]뼀    @: wz'2v늬6z'ӥ?O@@@PjRa         1 ruZlׯMjKVQnְrJJmJeyX}Vl)ԾtiMRE߱J"C`/PڱwoZI.`a}&.M~䝢W b᠇(trJ/P [Ӥų.ws_x@2 XVʕɝ;K_|!cn|GOpd6fAA N> 1gN[wRV%CꪫfM8;x?IQfTIH~Ҩ4}ֻ{ߵ^5L2? ž" " " " " " " " "^{>@<ci;} 6jժYf E9HkJۯ̋Ě@.]@QGơʕ+u2/ ?ZN: ?>̉q-_aq(E@(d3~m)Rgq矰z m5Fך8 ]A#7[@IDAT۟c:cc{eE,&(oik ePY4"@QegexkKD = PPB yZ!P$pEP&иKkH>,9<Y|1]w'J>f84hP6Y$$w}aly,] pͱ7UR]tx2iP+Y֭[C.H_;w{ |iOzѣx ݿ\дG=" " " " " " " " " " " " " " " " " " "CԫW/)ԪU ?C SPT(V s~8+rlL&(@ҥ1qDP=..o(կеk9qI"6m/E!&MwBH7f̀3"J爀$\y%|SHoJgO 2XtFbbJeʔ3#kٳہ }-g&($ꤓSS0sR(@(G9}u={4nºuk4XG)'wmqOrرI@EOx⠨V ۳g;<% Aʸ@\`:-[ cҥK㕔 C`A'aÀ@5%MA]r.Sz-書{#eȑ_œ!wWD'IJ[ 8ǾvmSآEs.IJ_ <СI -iMo?NokKD = lܸ*TH+"axCx-9$4\3TF˒@~\ Y'i3&E MP3sm84ɸ)"SL-_|: Nbg@AZҝYcrK6>6`<`nSwީ>|)hvΝ…)e!% ԯ ud﮻:u^b_^r7c͚55jI-[۲eǴCD@D@D@D@D@D@D@D@ҕƍԩ PH40w.c)@VN9+V̝2`N1HyQ " " " " " " " " " " " " " " " " " " "k{Ƙ1cK/QbX'" pit~Gh\)iSħD9b߿?U-ZDF!QN~Z\< pt@ja Z$y>믿ܲ<s￱k׮?!:f\:mgs,XЭ q#1bVlް1ePKr衇]hQpD}.V!9R@KU^=ɕY+MWsX{e?{n{={u@^{1a-YMw[cM\k,joaymsz!p)d/}o^=Ͳݫ rt6.^}5T W)@`Օ^\Wz%d`:2df\oF[^Eg+zӫu`m֍WKo՝uAM6J6Rl`R_ <_Pׁ̧DLBKf͛G|N<%p)w.eˀ7߄H>5jXQ?{۷ov g:sj`!ۮ֭[¹=\Ozc:z\,YڶKwk WZՍ -kK%ÆW\myv؇uVlٲ۷o4[}{k 3gķ~ ]{}فk>ޘpk>eʔqc΁@VY$" " " " " " " " " " " " " " " " " "(uIPҥK%eKnnO4n;*W~5v)& Gy+W4͹ר^zє+w;huEW(reIG'R84.D '{N8˶mܚۜ?X{ǎYs{)`y={9!?x{>tz’%+hs=Ɠ]tZxq(Q"cwR-vX6Jx%%`ڋ\2nmڠD 㰌² v 9&;X1؄ijKņ'4 6`ӦM:&sş踜f͚bQ !<'sͅ#hp"N Ȇ!5{0P[vժUdtEbڛOBg6s>M4:/EYQ'@ : ay΅<:) \ssd9  BOܦ x@WZ{e'rݺg"oS u'fr>X\uDp șB!w=-e˖uuDuUt$\ jݏ.,9boP_`x|cz3ȫ7=a^YwXF֗&z޾puo˗g3yn(ktkq{%o~O`U!y `@uo L \y%? <Xyey8x&-"9!v3NIg懤lݻ7^T\w]MڵG1@n Ё5'жjFs2a⮻Cし_;ĥ!ΝabA8ﯧS߀9yoRNふVrduo=`'I-Zp'{tIl.iE#NB~ { -'ә'Oo Yst@Q2:S:dyBOLN: (#!n :`2\X{tBC&,(\Xn{=lĚD@K0hO;-s~n<Ϛݻw<5.K.Kc|K-\CzǓ^{P$JcYf`]Xgz&^]5WpfI!x^mkk=O4, I'LIf#~/i Olw1D:v +9~cvX]e&w1/{ &s,Z{q}:쳝X1֘WN)R$&I:#pqe:4Ll 6>%7eٲeɓ'Gu^/w 'Ov 8)ė)qH\x_{'XWZ5C4}N8Yޒ(h1-pnعhq^~J [f}ժUCڵ=7k#sĊbER@޽{Cۜ"PFO>,P_Lg8 .LwsHxtĂ欱- ѣGX@ec^4-;8NsO=68?m㟎R}sOQ g'D%:|.RNtNRިQ#t9cp:r]nl:GJ=4,P,̘1É p25? kyKA1:ʭ|( 4m <=ĞP康x"sNfPBeG-9֞]4u /^M1N/ Gб nGDƋ[k;DD~|dY} ykZŜ̖-[oPu&ű)̅U4aΝԗ`gR_}7='qY_{kqWwNm yGμ /uW#G=o3LTeW0{+GYgRNiVϞ=ѱcG']u(ĶpBǚo},/}n~jӦ .B'UV-[`L+8, [nud(0_|^/7lЍnjT5kuw_D@D@D@D@D d3J/ʱO>;3*@(CGӧOǟ :WH|wl_ |(֧&2( ]$q!@O<ip)ꫯvNci.ŵ{cHK6&&v`cbzmoss%;'&NHtӛPD P'5'YsMggR@O 8޲j*' p?j׮햣>:c+Ë/\qF:PsK +WFf\Px 蒂)vZa۶mI/^ܽ{QQBGL3 S)BA]w_"AGf)P&'~7yi7W_z"G\N֙/zNJ֗6QL! >Fؖ/n/6{9%Sb6i Et Y)N}i%#Ϭi^=I୷".Τg֭_:gn”)S0o޼dȂlHE#" " " " " "tرn={{ӭ[7t i_*ݻ_>6Z{8r똚5k[sɒ%طoDƍŝ4h`mA 'd Qln`'cТE n:>(F%iP<@kg"Z&AD+ID@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D iAD**Fࡇwߍ۷c̙8%i~B\sM.E"Ԋ ֤t̘1 10\wuq"&ON.:6?4L$u6_&œÜ?G}._KI˖-PTw:ڦמX+$A^uJ :sȅnsB1:g1-{s@!Tz]38CV  +V#𛗁\( \W7jժ9A IFbN-:t6 (@ƺuumD :wv^"#իW:uW_bE^(o +Md}J!XH*Τ 'U\ b֝\Xg۟b\ hgTSO=xu[N@th, R Eau=9 1"?V@-CaG=;2ҫ< jÈ#裏" " C@%^+" " " " " "/<&n<6x2J*=zv"ZpbGS7n[̙J*w饗Xi#lv9y V>}: lܸ F&MЪU+lw<fQXkܹN@gwM@{h^Y*%." " " "g9` j圝Aй$(Q~;.| al&9<[@ѱ1K/ExV&WtfW^A~n-~g\/^O|';am.M2bE#3xNv?>-ZS9Ib i1|?IA:~y \(oPhAnNCs>v!?Ur|𭩫-|ɒ%Nqy;gNˢ(x" jQx8?\K,!zaÆnPB* Pe]A?0̢L.^ztէ-TPOϫ/YRTXbKMYOp'^5(o.i˨3 o5\>Zg={sj˴@.Q$%'Ei4Ǐ-'0ɐ<&I'Oʕ8q%'8<ػG]п?0m&5v߉V>}0l0ȶk׮ alّ" 9$9D@D@D@D@D@D a}Q9Q˝ǝ*'[@>rQ{l}mC/J#{3~xPpd- nl޼9 *9UH{ԩOpdUZ=zg ( X" " " " "$'Aӕ" " " " " " " " " " " " " " " " "9C " t--[K$|$`a#3fsg`:RȮY"oԊ7+/>:u7&ƴ_`k,0 `hsKgϾa*2: (B,9xEV(@J. .t ECv,ߗ(B'?bB iG _yGbb I`ծMOڵ˽۱XgRTD!NDQJ֓^5+dGtd{ /g'fr0ͽ_}oV>6U&M,32n`e>]͙-;gf~2q=8kMBM6Ŋ+\;R2KDN@%#g3E@D@D@D@D@D ?衇r 5\+R9x0(,uuL}`"/YC1ӳ9|6a+u\sB}w'|^vɯLXLb\b50hg~D`(6O:u[M7TRN8-/Dc#p"?Rp+ e)R(P9aǎѺuk)R$L?Wr/waH";w,SC.sߦlY*Y"RG سgs2>o<|7[_F ^NgG\(d Y&.RtMٝ210 6hѢN8˫3)WV-a:MD Jk֬qNҼ:[nu=նm[Wg}C2;駟v=bPo``ଳ$|Oi-Z8Ɯǡ+E Wai&j5 };zXny=z}<#0c yWD@$'AD@D@D@D@D@D Yc_7}ۃ#"I #&8K.>`RMM>B Oy<}p'"l M`ʕx1f|w[/ӿ)S&(" " " " IE@Z9]9;])" " " " " " " " " " " " " " " " 3 "1:[]`x [RĥKa`7ޘ-Ӟy&su jJcW'OƤIPR`>3)S3e~{w3sgq0-0̹+޵k>7~!輀ZʕCq \=ؔs؜L'm۶9g?Hcz*u b$b {QH"={6X駟:){kԨsjL $Vr|%*;^vPq͔T`c 1J=_oS&^xqa0l~1?⋁%R6mɣ  I`vT)}ጼN9v wVjnl8qsj;a32܈% Aht@D@D@D@D@D@DpܕW^QFsC=a'vkBe /̼xGl2k}]/oK/ʖ;v8A:D@D@D@D@D HP+w@/Օ" " " " " " " " " " " " " " " " " " " xIhE%`!U 0x1M|`sD@D ! *Tȉ;tIҥzI4C髼E a΂;5xiW裁[olnliٸz]8묳PLKME.… a;DzRuR@T3>|8Νk"~[d~ 5QH-{ѤhСChѢ5}K(dLyW@",)HD Щ1AR%W(,1K@"E_obƍI:;wvc9d޽qH-vQrða3qׂc)5}tbŊ.1Ŕr8Gڵksoݸ*ѝÉ_ " " " " " )I@Z)y[)D#@hɞ,~80i0`p90&MЂ9@~81n8t ]vuۦOM~3g@-{od8+sFA$>qϞ=x@rye-ZD y 7`<I@+LO|t.CNXŋq$wuVZi/nh:M H~?m:(Q P`oqGX/^<s D@B[. 'nJQ/t*UrǧڡĵBL}eVduӧٳ'~G 4+VpdׯD'#CD !-[}[=N$N~ر_|1x{c۶m asNAoA4GhtL&g41`36ʺMX ֮>'UA)ۜƎڦ֯_YUD@D@D@D@D@D@D@D@"$@֭[N:N[n^rJëѣG1]tA"Qz5g/}+ (\1w\p ȷlD梉K犀$> j%=" " " " " " " " " " " " " " " " " " )@j֬霴RB!y*<_e0Y|pRԥZ5ɟ,HOu:=u *%C8 #`u*0c_ہ*UnQɱxǏ's+WbN6aP_wΧ%wWv[n9szj\r%N 't+9?NXB1j(tGq}<6m`֬Y&9sQtV&A )GA- F r~ڵæMۤ9aÆnXjnV*U*m@N x≘p(\|E᧟~Jh.P&" <ov PP pjB5@q7x՛טARHD@2Ukkߟ-[8?ظqcsv,Yݻ'9 cCل?>j69sT!5a"D +lF`c6n=䓱vZ'\ qHSӧ9'.՚8q"f̘{'c_\K]lY|ڵk۠ӛ@ɒ%ۗ_~wy' 1TH(" " " " IN@|"ХKlݺKr.k38aa 3s)c{ߧ-Htt;anD&!;`d}#ݩSBq(x)M7&ˆ$ vqoz3y3NؘPeH}ӦMxg]=PĜu_OyѾ;Ѥ/EB(@1wh N/ԂsvÄ Vn&#cs[gz6Qd㪫r޾^ӉˏٳgJԩSǽ]N]v@}{`(ط1p04FX;0|8o'k3a XYիWwm {dX} Сq_\0;w菘7F  sxH2eO*ض(uh&CD@D@D@D@D@D@D@D .͛7xÍ(^x\HHy ֦haƌc;)x-[tcEN&-5hC I|En:'W_}58˯u*k6`2}]qV銀䂀rO@8ፓƍ:?A m ؜Pi^Ks~tsęF,Ȃs( ? J0N᫯ӥ '&`|3,1ӧޘ3g*(AK.uֵgCʕ3. Fy]ә}G{! &Ŗ@[{ѻ袋2K+VĤI\9{PBJ%L25\zܹN'r9t~==D"7u&EynժU"gv9b)NPm? `SOso;|>ӧSgǗ5M*m[EF,Υ(.XD8򉀧0e^=`ذ|2& |U*ZX~}Z(D@D@D@D@D@D@D@D@A5kO?='ul ݋|+WĄ ܘXŎ;0jԨsrE}X"f͖/_ (!~> r /xjFs<{ٳl@jaFB@^hѢ/_~A^tbOJӠg7ghˏ?>=(" &p'[l1do%6 y0< P9;>)9J[n1r(]_t :P"2d=Q~OtK"[$B8|z!stݜO8󫁣}!rE Se0oŨ^2[Gjd2$x$: U}z^0H8sJ*SO͸ eO>_|^uy hL@: jQH~2L hLf&Tj_$fQC?2GK&M@POd#گqӧr He@$$"" " " " " " " " " " " " " " " " " " $p饗co2Zŕs|W\q谓"9 . P6> Ѥ;G_+yfD%8yI t _|17ro۶-x }Eo L &M]tT*Cޛ@nήl^ʖHvtD4|p>BaXac )(CCv>#W0^ְaC, &w *$w&r`1cTHP|niCYhѢE] -֛^{5׶A=eAxZ/coN5]kf]m+T;'"wYgڌ=\̟?9Be:`] >0|&6 }7حDtP! ,[s 4PJړSșa͚5hl13fmqnBܬBzDj{f7,r+Cx\V7ni~;#-ݺuӉgx']5kd2ŝ= ydV:\D> &xlX{coo~n<..ˈ2_#vy?al68z̙XhQ%" " " " " F>\D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rH'+W.W2t%`|69wI'+y>_>_R>_b>)ee0A o ɬ!?Lg>sc=as83+Z2%1sibM>Tƙn3 L;[j_"E8WF 9k.fO?3g =W^3_}˗/-Ywǻk*W_o߾VߖrטET\>WN_UZWD 2kNg9/PLťa^zJ5RsyiӦۄ|&31ߜ6m.]=[&65@Sbe_ |&315#t&/l[LQgy17w }/gΏoG&$~e>ds3G>TK|h6.Qu?[?쳄l7!s]oݮ|-Y+X3H2'%>sVcycb`e˖L̕&bd"ʐಝˠU9e]E͞=ۥl/{qF91=uxveԩSK2e=zQF.'KV|7=Gpʹyxmš~%M2&:|?wt |Gǻi,93"#\?P=O]s=ĺe%.6oyn_|xin Z3Ϛ|5&tÑo]ϟEDvڶ!d7Ĉ#.Ͷ%l7nvmpڹsoѮ瘃F_V l5t3<3>sگ2"FhZB=&* H5/jwTߌWȪ-7\r dljd|7yx#o|Tpp //l3jԨC1~g֘G9gN^YVm̪>'kg&!1hȑ#p7|9]ƾX;'O}(Ę1c|ro޽19eUGR~LEVZϘGRGRЩ ^V׮]3K~if`l/{-HHHml3{3:q'3NI㏻T&84l;wn K0wM@wy'̬LoJ(Pk2x4l :Y?cNt2"Tʮn{17Ķmۜ{52qUWedxG}ʒ}Y/q΁Y*Uvi&N?vk!@lNa$'I~e7脣rM#i ׯ7g.ސ(R}4bXd%+VlҍbAyZ.]v*L03ϋskVcj%ח8^7>x]ؾ}Ӡ7ff͚>5eXj; /t'TF$c,\nW\XtDO@Z3(` " " " " " " " " " " " " " " " " " " " yLD o߾\ˈ/6o0<Ȍڶm?/=ݺu3㽶 0Q}0UO+L=\+l*J =$,wO^NlϪl1!+TR, ТE X~zbfY=f_3%ʆ}ܛLGews[GjW`&L$Gq["><tL|2QxwM8((Ȫd^٬qB@.P2'O8Q& ;/lLkySkmk$J>Hی}7d!E, 0qwwy0/\RxԭGکL,& LKgl{؞7ahF[9ttmŋ't)ЯЫ0n\K:t~+G-7_+T/qD]o$袋`Bcڵk믿vsn&w-3+DG =3fLcõGpqx8m#성qхCmKvL΍i/{>ہx#74B/og" " " " " "L@3Dri-gU GuTk8!=x{U!@?;{=]nw[½/xaCh\`k1+kam@z*dM\r=%tTD@D@D@D@D@D@D@D -hqJnrCF3%dr4i~''Ea@bO>q8N58 wmgrSb7R(X$sm^P,g(\[}n+TF}p;xp)Ae+_5=d 4 'Qx"~8!-C6q. /￟Yw^"{o&Tɓ's :+O:<׮]g)u`tPJ#UhQl߾<VZ+gΜ<n}z{x,tHI+~LaPB5w}8묳&az6h͚5]z-1QCNc߾}8sݻg}((۽r}޼yaf U*{xNKNAY:@26m2Gi=| \sM[)Ӳ#@AC=9T;>x`cԙ W?h{(JzlB9X0ɵꫯ6_/P}{`HX0gpyĂab+]ήTL鯿1j3,dŦMy><-즿;8K/駟'nv7_ #ѹ33y)a2e$wV 4h֭Vnr͋1-êhcƌѣ!;,?`2~m(Of@+_C0aB*HpmQ%ɡ4B 2x}maڴiX`lMT D@∦'\֯_]w t_ˀƽz·~ƍcÚgSOuk: `عs[|>@!)4q7FLÆ ݹSLt 'S(,?'ܓ%m7 ??GydL)PDc_xfܹs@w<\öm2b=0(7px}(ān,(I8ʜ㝘Q~ȯW~l?i'̘1#[>{t(?ӥlTzEer w֫K@틡CI&j슀Fk\JW>}{pSrRg{(~)\=FLX?Aa^|yWo:c;ӥB&S Z˖A`ig0֭g[or-QQ4m["(ջwotM7B=0i$,_ݺu L2v:,^8Ǝ۽YVk֬viG۷]DvwmQ"D@D@D@D@D@D@D@D iƄ`ĉ1M,rʋ1->~L76ꫯv hV9s8A*:>BNbuͶr3>9W>P< yX=c/s^n5t#" " " " " $ 7Bf:JZir';.`Æ4ɴ0t^}9&xIdH h۶Nj߾9jlҼMX(X/HW]^E)TSFۯ-B,)KdY$%d%K~HEdBV$|5n;<f9{3|l=vQ8mL-O0VZaÆ*g~Q/g*O?իs9?]7n/NkOXр^z)+":iҥ;s1y睧=CǏWN\> DauYgbF_ 2>-,+vزeNJ2D>'SO=+ V${;C[^kAY/x%Zb3\pR+ lCNW?[39Xѭ:qD?oOh=.d؅ 6LVę!T~[^a`2-In9?,Hچ{/u]Yfiz]9q{=\,hC&Lz?[p}ڴۭI^kCNMu{NíŹYgfwqMcvq@o1HvB~YJ#GOmӦ͛t 3lm :^뱰 ouZ v{( kgÏ?:m]zɒ% Nہk9 ri8#+Ðf̐lˇwAޒMj }dsiq_RqAd~3޾Oo}Cn'6M϶˖-}W={d![6m[!zҙ~/o<۷n>ߛn{5k@v a [\n_g, ']BZ* EB@@@.Ptiuݟ??r77X.S~;U:tfvޘ7O/[W"Gϵ Mir޾:uo5%iz^9O&[;#>3GS׬Y5X5r:+'Xւĸ3zhM4ɝ_h!  F        QTX1m =z􈸋 3!cÆHFHOYd4|3)_>9Hoq4'-FqG֭>}zZ,S>wc=[p H~"[8܌s ώ ]ҥSqƑ-[FUqEa#묩+ʕ+Gve>2s~)UT+~@mꫯwEecmądMkGw>8ݿF\7|y} SXHΝ5kqG~5%.wqYmqWH߾}#fs\hQļsE#.@*+ȦMaBb"|V#. BJ\Q>₧v]﷥6m#uԉBWO;I&3fD\,;, zB+@G\X[D9y=n7y&{# oKW$|6=W;Ҽysl}hNܬ?l>Dk{Nܮ[l%J+lqe".1#SN5:$qփ~݌\stX|6ZxQNWs;˜FͶŅgI\r;O{ݴigc}և|W;3y+|߅rD\Xh̓$^E1=&"n:;YLk#Cbl Ry{?l;~E(gyܵk׈+W-9c#¶R[v|rm?:(H/R{wgv ־+i{滽meKnׯ}qуGblgK]p: ;gz?lƍѓ~؎٩?s&`01cn7ED 8_2?~@@v|饗.}i{hoNsn^/> Ț 39Hf$m֟B^;a=9Nk*UDzuv_'vm;6}krqX4b=f9ɞRٹzva޼y6mq~ml}NvU=]c6v?Ǫs@@ R]'Q/b3u/          WU7|\A< @ zz Kg:E,رRϞһJgbI$|tYHJ]&(D ))/.ֹ瞫ɓ'e]˕}nI4H4I1Ç{kw\;ծ]`5?C\Yn) *D=+zW€ `75?ӏwwZxm~K*췘+P+w14m]_.Ft:υN]+kP.]* s-t; 8 ve)w\Q-X@֭ v M$m>]s=}.-TcfÆ , ' M]taCg3p}y]wɅȅINYorEij'Ýx3qr߲"%o^v{޷~z}~? vޤxLzqpMm³W۾ c`qΗ̘E@@rpD5g9vgXѾXcvCQ{>6|PW^yfϞ &b .rTw \x;}jgcjW" cٗQsGsijO#  3?,waP[Cw杼,G@@@@@@@@@ 6m%KhڵksdtҙgJ_|!whF,6 D#4bH=&rtr)IP/kz_=a_#Hen- B] by,g[Y t9/KhaZ6(,j{.Jkz :裷7ǯ*;_mQ; ģӈU-&`Ej2gxXz̦=ebjtF;g똜E )isVa. s֬Y_})&XˊcHW^wTn]qk~=#z-w݂n$,01r^ }񺍵nX8XMnL2;3?cݞIt#xI-H1|(}& #`VZcI,|ƶ3;߽{w:`-`@a 3ݗټ?d{H޾%#5dx̊vmzճ>[(l֧~:aZňs뗂G$Z+mֻyK `s.S ?_C7+rZcbmXڑ Vx֎!3$^eSi\魷ʏxw`s{W~&{@@@@RDi;<B<}ڲ}ߓIO'vbʕJ>̟f *Le˖b8xX<kZ#Gz'|0XH<  @ MD@@@@@@@@HO`~ԩ/o{+,ÎjgvXP}M,}61">[l5=,,š^܎'܏S+d!t*oMV+V$wt.sNC+hu饗ꮻUVar Z\^Ex7"i֞XџKs =ɺfWcƌ#.h>j(H{lB[-Ep-駓N,|B]f+ٗnݪ~iUR%v mO(׮ /}Wn?z:/m-<J    @a X0ѣuQGw Iqn뼙x5~ٲe:lh׮xM695c ẉ\{ꩧw$(pjSXXoK.D}$Zľ#_~.\=;3B>̝;W?FJ-L22W_ .gLJ<W٧zzꥦM Bq|69œ]ҡƶ~wޑgB0'|veXF[nua%ojOui6}/f}OCd$+0uTg;N{ ]`Q&Y;0;B2W知W^ |S.dMr&յk0 K<-vE/\>-% _jO,2f˗aZ"\ߌY-W cM|0$K&@+@@@dx'e_k&Y0:h]wմidAL5x\yzGtiV*U 9I;_'G3f]q#G`΁!  7;GR%wC42]je'r#       Eqad"d@NTjUhL\x˓"3gJ헉,s Y#WtZza_~-'H6mƍRnxP%~O?6otQŋ/жj+.طphC9KWd(p }xKj߾/޽{B 0 .\fR,0J ?^O={=թSG'p;ҢE )R$Չ#yM^}JVE7!qgaÆxZݕԕܕSL,qhOB-\t+õܹ/_ЋPAn~sJWY&LЪU|YglPի}@KD7Je_%+bIaVRѢI85 J> 2r7/cץsx1O픀op"w#/F@@*`^tE|pRtܙPO/sO[Xb')L:U{e![{>|ӧO׵^>H^znn0S@@@ Nj2 O;D@@@@@@@@@7o3fl_FUԣiS4&d~V_/}…RVR&;3 < S:T|OY`p~ڵyfgOs}˓UA;j׮9r6lWgY֯__ 0aLs\!Y\_0w\vm. XOO<0<+'z-L,JR^\;_, i*>>TKI-G q|6yKE"͚5K!⃔J*zW?{!L+>D6gŊ~[aڵӓO>+WӻwoUPEv<8"ong0nϞtIK.Ztnv`A) @IDATc=v}2e D .g~I6M:xp8umZ5rV2f K(mKn7ۧBV?Z;nݺxO!   \{Nu1hժU)iѣզMխ[W`,aZ&ܾ}{Yؗ5kjРA">/ Y;϶SNn;Yܜ9sTiB"  jg         /s2J׸qr{%W (QB:tit XnU.A:8iiƤi. I1 裏gdnݚbK>\o'e]vQ׮]}7?d+(_ޥtAC .+̀"/;<׿ׅ;w)_}F$y[m w%F~%o.ܱ/ҢE ]s5zUPYR@f ,tV\+W:@-{T}ᇫhQ. ͬo| -}7r/`Iݺu[RB'D:uۣ쬳҈#lٲOW"@ XF ɺ袋ԠA0ۿ>LϞ8qQlBmkyz뭷>1[?ܳ͟/]~4o^e"w f+L+5o-̎1 H;&jj}oȭ9̜6Z    @(`:Lw'۵17k>m֮]>}OW~4yd%۱1[ŋzK,W_Cze0 36mx4oܟCeϘ1C/ի3   EŮ\MD@@@@@@@HN+D7gLV*HfuV."d<wݖ/zxy+]|( }VϞQGI>5;-ftMzTvV%6EEV$WY7ޘ hʔ)p/Xxb\VH"@$}]g>t1.]vI6~}SRg%ȜGO_7E?cؤIm֏mڴI2G%E 9wجYngY`vQGy{\ZU>6}E.L֨QoZi}+V,>3d* '+`WZư~lڴiүp .hZW\qEo<uz5kQ,{* ICH睗J&a}6mN* UJ nxR:uo$\ @Z|w>t23?SxWlYtgl%JHe?x_ 0eNC^ KҚ5r% ֲHq [40\^q4ydb?? ŚkZEpS4vR%w#  *i}EP-+$,);?ιϹs=0™{b{L//]SOUǎUdisMoF?Fs^z:sէO/_>iIC@@ؑZ;jm߆g@@@@@@@@ء"vH @ W_}&M/yI Ұar2r5t!Ypk"w\0Vv%P.ꪫdN^z:Y&dҽ{K'].Wh=!(~嗲+&o]\H`a6Zq&MU` 3J 5{BV~E?,p [037o?̆ = a4 >?7;_oP K_'oa׮]ۅLN T6o짷p-]>jªw K>Z~kIѢpƲuҸqr,Ν;zz'Rɴ(ym   @ [C HulٲE:un6n{s=j޼y&D^vƎQFws'-s1֭lc*%s7c5k;_\J*gϞի\@@RQ@jjݎw"        D%@xLt~'> )utI[o(a@ \xa:ݵWWZ]]*W46J.U}}Gu7k[10@]t]r}{'o0cf-\Y/&o孠u\Xdқ4)yy|0֯_]vE 4)V=.kɅ˅F$D.Up3gXo(QBt}-h˞c@ Vt @¾`w j֬md EsX~ޓ^ϴmY}fr?s@ lذA_}sK8m+ )믿TT)euai}讻K{ۊZ>bhW-j j;|y 'H;s-FbIyÀ@\\U}6YUj\&Dv УG_t̘1;x%O#@ pd@@(x5kСC?|Ov)_~Y<:C5p@qSX(L|ɓ'7 ߻\C9$kl޼J(i4)4< ;ܺukwIgwX,9e#  C@(|@\B2@@@@@@@@b P " !@^>h,1~ErEhXp9 y&I| \ `S' Z ĂoW.8p/oŖovavߐDOuaAoH*%Qܔ]378gڶB˔aKu>9%oE(;V.-٣ԫԮ]݂ջd@ }|mOxc.uifgִi8ކ"IN@@@ y/M8kN-WvngGHvmܸq~UjUםw?+y?͂m{0+Wdɒj֬Zjǃ:ȟ\ É17;7ȟ1c-[΃9̝lo{)  !@V?Gn;@@@@@@@@" @~a]s5Zj+^e:)a\`\I@ԢEj.F u;H0r! r>K,u qŬrvc2U;  &}+=4g߳Իԧķ,qϏ9/ . пM`Mw2k^֭N:$'O/ԇ~5VLwvS5iD7ֿ/5lؐЦHW/9[ Ҳs#9;e˖zպuk|ƹyM  )*@V?8n;@@@@@@@@ PM[PĤItQGmL(u\Sx/KBI,X+%sh~tRldIE]w/Fl*x`R^-|ҝwI&Jhh %E6-ZT*U,aQy A+Wu뮻0g/Vݾvkx.qƬ*U*+~c[@JXn{; / B^{/wUU,F° ?@Lnomk$(Z.}[`ߓn!6m° j[;ǀ@2 {\ u2 Íl=Uņ}exkDL+Ɛ_1woY(E+fYinai֧v9Clۆ=|)S|aدQOϥ#p-Oߡt9 'ȅ'FcbZcS_ }ItM7nΝ[ P@@@ǏԼ.J8.նm[Sv4w3gΔ1SU:v胴:v C~w>3}swc޼ydBg͚ܹTn]?֩S-VXg!_}He-ZH .sx؂ll֬"@@jdՃj劉!        []x&дiSم~na@\yj#<.eX=w-òvMj&j^hd`rxӥ 0_ܣGY B|v[JbRpb,hJax] =X *bVF}pFxk!6+WέsJ![ڵk}qK ZJV=z}` @, բoػ} ߟ{ӎ mnhwoa녿o}z:>\>ںlٲz`6o;dc~ "gƄ}ѣ~X u~-vc_];węZ c ɰߴ[{, RsC b}d_ZߴmW/^ \=\X,tXT)?ZpL ل](a?ZMxnׯ_uv޷Q,Dnu310& = oݷ"6)]1? CiȐ·#[ N|ayYapغhχm=oK~TZ&mXet_`}@8Z޷u|8Z?}? {mXȥ aKmb90 VɊ͚5Kx`&,2'['Z- o}kono=m}^_ai3þ2uwWf*Ʒ&a_GFai6}ɰ[{m xeQ_ZEmK!saZ9L4K:#]qI'Ž].ڷ8C&NJz X3WKvNKeN{4tP-]4M[@ /4ނ   o;&gg̘G 9AvPMw2W $ F }OkFǎٱU;o†ڟp\xѲ~61 VZFkC ̞-puI9YpԒ%K},ew8X薝j[v6<)6o8zxܾ5l޼9_;&mcx?mZ;}~Ϗ ǬъhE P)?ߠ?RIaPVu|ta0 #VE, [ۺ?\[Qopom=a᭭mu~x?a?mly/a`ѣ 6+ѷ7!Zf€wrD +Ā@"ݎp)ό7>3Ve[gZ3gڶE~3Zn/3-eV;a A3eH.zK=zn&6-4~\XR˖5Hݻ˭{-Z+-~;r5rշtrۓ9 Zmݦ~g@8_   vW_}C̿w^w>pv<. ,t^Eك?ku͝}ȅvm[xS G۰JX%zo}Bt` ~o6=Hʕ+߹b@ TZՏu3Jp[)oaGƺ^ЖOɰӎnۭ;nRV?mtoþnm[gHO.] ~'k|1TNj&]~`ˑ'|w;W"ؾ_m.s4bԨ_3'`w.0g@@@@Lv I6f7 A# o~x|2<.i\;lsOJTBeWK`"馛ml/J]歍e;6Z@ڎ;~~,+ >8|̎Ţo-[Z!v}ߎm~0k{-_5   j5@@@@@@@@@H 裏]#98aRE㓡)`w>H {,]+W8-jJ.|F[cȐFva.4x%U 4k~odm>APoH/uל}t9Ҿ&Si&7K>{X"&4ЊAHS`@(+c^{h޵ vCG]37 E`딭b@ ;[lY?R#GJg)=T[5mj!`^x~i1[@Rڍy-Il~xp\Rs^93gJw mLzig_##@VNrx!Ciӂ xLi+:H[l=X0|4i"M$"':}t.:M,-?ɓ36_Kȳq֭XZ    )/rtRĉ҃J_~)-S@@@@]΀         $p"adɒdjmI2ťFZ.LFTLCТN7N:i*[ʖՓ f _ڰ!If`O?]s]X2hB;wԩSc"/+Jxrc(o1   \j%AkHjU\9ѳa M:ЙgJW_-YCf Kս{w}ᇪ[nfd8 PK%˛} l졇nY9s֭{KEO?H2E)kwt?-@@@@H55jI>+ "-Z$wd0   @Y@@@@@@@@@UVգ> R$TSٳzzdA[:+'-/Z%z0AAk/裥!C3-[uIhKzO*Z"!b ݒi3MY2 7Hw%-]ky66oެЗX>sz鷠, hZ93(jimzے;v~ ,Y"{tҾJ&5j$/[ϦgrE"kegΒ"    P7Jws~+ŋ}˥KD    @a UX@@@@@@@@@=\*?9&.wHo)}԰4v繇(V,(ا![sJ_d|tj֔N8A嗥e?6mhKZ`;0v=u-Zref),)u, *-\(}d-8luT|B710IZ$˔IEdHY Ӳ0jGH)6 `(K/U N ka|vx.^s=zXQFa4y"K.~x|mb-LL޺u/_U+G]kˋSOIGEӲ,     شIz`AHKH7 G|T@@@[hr7!         UVUng&Kg+>g>룓ON:IE1cSN6n[K]ޕ*T;^w9`sI?$& "YO!oI͚I,3Gx @ Xe=  NVr~2 lr֮]J*wL r-PDg`O SR`Ky93]O;VkK.DER!%?P]%K[ ^-پIzi@\Nzy+6m}vOL\Fv%.e"     i(cIuHKzIKeA3   d@YT@@@@@@@@@Kվ}{M>]m۶MBc`Go_A{޽ Y(R$.`pGϤٳۗ_ 2o*YaQ[m!1@ʕ׃4`9k5mTv.2{*f)j)0ԫ'hY6,_."(b'҈K|

    \z `f,@ ]kGo{b/-+>iqkU Ž7q 1J*;Ϗoxu]իWW~\Xa_UT)sN$'x C޶l͓,\ˊhƍnݠAmHZ(O)#|EJ_7G@@j%@ 3VX4ն?2a)3Maä .ȴOvp7x֬Y+B^{J. ͒!P{%=ԭ[բE,w /K˖7Hݷv ϪS'/,j\nݹ4     1cIKg)pTF_@@@2Y`@@@@@@@@@T߿;8 Rqi* @2CI}ȅ<4`;91^qm7u` 'n[a0`{N ؤdI~Xu xd;ƯZ>|:u]viLBٚ4 pv[J_}|̑l%K^^=$ ޲q=ép"`ő+]@ Jϔ%B ʕ+Õ+W4!@ 6N9OȬ6oެ~oÅ,UJ̏"Եk/7G$׸<@?n&#ۍKI&]+$(^ֲr3{ ~  R{     E yN^}US'/S=   (@V:~,         @tE5EG6ł@'HCJJFIw-Sma @"vApߨ# Î^yE`zZ?ZqK cȿ@Vzƌ~Xr+@sz *F8E, s[C6l,ƅ ۱cŋJ[t+ZvPd5U+{5ZeHNsU[`Ŋ*]v4f(tۯ:rdP26L< Y3Rjhe@ r`@nx    + uohɒlկ,8   v #         VpkE ZJ@.<Iq5BuIRHMq  L]i3]l[#}=G@IDATﶀ0h.: ;/PT)/[3g7߬k׮۷T۠X޾kիhccaqVI&`AyV$S [vHo ~l  @2xtR~AIR4F(`qs=W\r q1  P`g l^>ŋ xJ˗K?$؛êl_m*GZD0]՗pi}۵l7[݆Ӷ[W8o;۷%vWE/@V3G@@@@RE`i'ڳ4uje@@@@ ;-@@@@@@@@@YSN]z'-E[1BB5 nEHs,D, *cҖ-AܹR8t]4Bu6vAmS^Ntl{~s^z3P}K/KGi[ VX ZZ+Dk[6S% mok{l}Un6VsH@Ŋf@@Um 'b UT)~dJ oΒy$د[H.{zg>jٲz!~t(Xki޶O0ᅲ,. nE0,UZޞ΃Mھy˕lیM.;h`#     - 7HvZU{6]hAV@@@.@=         I'PxqtM:uWH6Ҡ}$)/-]qtU{2j\ס 䓷{P$t޼ hnm`AGV,WF.ۦý .]ZgyJ#\jQtyݻ, U[͐HmEg9$B[kYvr3V^fAZ Ѳ۰mx[q<غZ矃byoA Xv d@@ʤҥ@ѢСR۶ҋ/Jݻ"m׭[)ShzW}V͚5ճgO&CCeJ{M>Ԅۂf͒fvoPA__WOEUk~ń< ,Pk]wM%c@@@@@ 3gAZ&IK ]VN!  dܙ@@@@@@@@@]W^2dz;6ٛKRHI\΋N:I~;G .\O*Q""J5 _/͟/YVx;|xrdG-L˂v%zwQFffdJ!^ZHES{/IC"$-RY)%%|Wspp}>s>}_u_}뭷jر!\e];,q>ڪm)S&cyZMdLa58`Aoѥ߶\-ZCuo=˧q/[V {RR?^P۴ijEE /搹AXd+իWϊQ1B֭OB)_§燾RtR&K(rJ^Zk֬ }m$]lc-j;< YD RQ\6}Djn?XH$}駚0aLֺulWSo*sLHͼ _>Lz]Kٱzc/}4qb_?AvzmgHC`u @@@@$[_?7ͥ#_Sj֭[/   SujN-5A@@@@@@@@@ vy_~5kdK&\wԳ,F(`Odڣ*P їCe?i9u:!HCs?ˊ1G jEIO ܪ[WC o!C袋.\:؉եKP:?[miٽ{F}KcV3kyw-򧟤x+Vl>V{鬈xZqȖ_[Mܗ{GJR%ϥJfN/=6L2,;ˉ@~Xh-ZO̲"4HnȺǒO3g>c ㏚;w~kncf0zX,<ó|D_}!Ƶ6~Jvo۷נA K   CjOF@@@@@@@@@ g꜇zFvęZZz)t-ҙgkti`a@ 4my̙l%jA[qؖnyW~l)YN=н8;C7UVsEYxYsu9t/2ѲMw$oo{ײzu:?ret/~%au~i5ķ !Vxx.=,~,eB[%ȃq//=䍆#@V %A2ZSBEJ'k^xa#c-fܸq0aB )>p 7q!8P.myPwlp_>X-6{Xmc 8{ \_VЭRJt*S*Uن;H2j0#W{KG-~b{[䓷mB2D5lVtSz!#d6>Fw!    @7O7S?g=R_t:udLjW/lljsJ`I@@@'i          ,m۶U׮]u%hʔ)d;kK>++*|tiM7EEb- &r1 =ШQSO#ki(h/N6, a=g$J>ʋõzؙ޽|ÇGQ~Bh?ܻjz1iZ yϪ׊/_E.ywCjka<.`i^öٌ·2?mxW|{KO̫}ytyK}a jm@ ~uZbdu|##stR֛.LM8Q^z`sZF>1 oyؕay^z.!p}~ߔ\)}u~:uP.MjG>@8a    y OvTglQnƍS    & @@@@@@@@@l8p6l|P^ziO h i oBSv#N @SfԽixq![qP Y=fUUʕS){ImҤI1bDO?9f͚]vj߾ZjeD˓5ʲ>gqֶ\niX~8NJ;ߗ //[Kzuoee,PtaQ 2vrC?,g'|R:7^@ ,Z(LW!@ }tܻڵk7 -Im^zݲ29ae1~_rbS/KfNz&=@ Q8n$% 3     KJw);I*YR\3oذAguM0A*Ui@@@@@@@@@@@@$U\]=DQ${|v=X'n[GV⋥.Y~;L6m .@Gu7nEB2pO}J_}5j}'+?9gj<$߶c!    @XB^i@ó\ /MYCwUÆ {@@@؊Z[a@@@@@@@@@Qns=뮻,݈@ T" jҀ)H]&5h3@ .,5j 7A[wZԜ9xNyЖkš[~瞒$S+S=}G3Fƍ 7x ֭[VZ*y ţK}3~_۩yҋ@̛r}>/ xVeo[+'-wM'gRvQK#G]rn#@n =E``+ 4HHI&+b#S}tiUjՄgf  +~U]zYihr)Ϛ%=Xw( &u"[Ik <miIAJC@@@@<#Z>t]W_-]rނ>SC   )d @@@@@@@@@M>pwZx):Լyܜp7K^>-x;(XC|â#@ 쾻mM'9? ͜5y4dY*$ծyЖmU k֬)g}v9$Z&LЈ#tw[!QZlf͚iSӦMUDD_<,>YEfZeR-]*y=[=||3?^TRŊ~v] Y uVM)!@qa/\CC)pB m #/^|E}zΝ{#o0/3 3KGLx`4#}$sge^ҙg /D }8C4ܲ"  lM@ 8          *УG=X_~9,0A_|1[p wޑ7 j@"Se!.D\ v6='c`;W;0?R4v!@ Rn>}Vh`-ͨE$_Pf@-m    'ns 8E3;SNvb5 -;~pȝwީ֭[mNJ zp&ަM]xe]{Nr@@.͏ͮ)1^@@@@@@@@@rږѿO{ի`l@&ғOJw%=4xCҡJV<CvXk{wI ~J ۊCFB<˟_TZ~wz ѪLzUmk[EoFSLԩS3rʩnݺkBc kY"O $E=`ҥ aj~7?l={Ѭ(A3[jk/[[opgS>-nQ-eYFy;Q@W4V"@N _VdLYDPT߁f}f?3}G{ժUWklcǎ[m_C馛BpvCfZK >裵d. 7{-I&޲h o~s!0jKd[,X,%{Ζcs3<2ʋ~B wy眙0SA=;[F6- T]Rz]fA@l@e    dgI>Lo_jOtbKymcT%>&LдiBVfH{HH=?쇜VZ_z%!pӛo^ӴI;Nn#  )@Vv2n@@@@@@@@@r@+А!Ct9h!$!&$ȴ@ٲҕWJ_.ٹuza=E: ,%ӣc@@ Iiׯ_?[7ÇiӦa.hc@DXrm˿0غuԡC=!ڃ|teIBٛڵ|½N?t=! y!sͲ#EVLLtژ-g]dQwnD P+g    ;"a+it䓥ߏmޖzȓ7N;ÜjժaÆ{ f0->#3glX?--bpGҥլY3|ٳly_s  g4A@@@@@@@@@ D)/롇R^kR`>w6*x]=\c"Evh2<i5q`mY>zK??:uؖlv>M;֜'J{ݩ?3{M?ʂzhժUap_7EJ۫VRJ5׳YV=־lkD$L+_ ӎ ̄@iӤoNz b{ &MLmw٢`Tۥ%ӎ *mK0~V`…aB uhEX}M{o{୯׆ e˖}Ji>)SX%kny?wΞ9!<ԊUL4~}wCֈ#f͚6cQO݁;ח,NW]#C b_Km9/FC';]뮓#?*!'?ˍ    T3&M?^z5^[-Z ? aZ>~>˴xcE|Ŋ8N믫xS _So Zi   Cj4A@@@@@@@@@ ;w_]}պkC'4et7+`uտԯ{O;o{'@\s}Dڰ-ݚ>]z(lkd9V8Ӑ8pö<<#7Za۠Aӛ3gN^_~_zqrl|P݃kkW>3 4=uQ'pBxmV-қo~,)U{+X|r):SS=<M6 vZs=xaРAz,[ﯻRe]:qBqQK[B /0Lx_ /bbZO} ? do'o@@@@@ 1F>TFo~ ~,)gf=~9>#>'|ox ؏|zBv=,\rK@@@ RPϩ)2@@@@@@@@@.[N>P6[&HbܹuNN4ԫ'ҼyY+ 6L[k/Yzᇥݽ,,HTɋXG^eACҥ`6V!!z^|ʔ)ZlY(aK^Ð~%[|zJv-^!pB j֬>h]r%{B!n?1@'M`ysr-X8@kbΟs2n~"ey,۵kP_O/! {xp]zZ|yS|IݺuK/n{!xczHs9zꩧO?UV!H G06 獽"V![_y=+j_'Kw|E=gڴij߾Ю0y`oSq/N8O~aZb\s/G} oyq8 9gZJQnz&M@mkImyާVA|=-̷'aZ9P<ͷ1?BuN >ߎ}of̘1DZmM+#ɳ=L=vQrĝo O zʀ[ƌ    @cڶ,J%KF֖ô{~迵/_>`{fONjdNJ >\F믿qq.!8ˏV@p,=c_gq7nQF(|77=F6/ܽɓuwЪUZC<=qB^z믿Ǐy1cƄ=PѣCbѣʔ)N::8?p_nz>N/EzV>}6)( \!rT/A@T$^+ò, ܡ dHW pJGtQ3)yZ55qu^_zGu`|x_K-?~WE<Cq|] -^8\ 7`T_Oϩ=ؚ#[LIC +[Vi<4o雄3?sYmM!@b xĽ}J9˒@ ,\0!G@@@@ !RW۩t0egnֶ{Il~i9m*>^$g~+rS"?*Տ98w趖濩{@|p<Qf0su@@Q;:         #P^=y޽{cǎ&2'dN~evsϗvnHG!*1 vY֭B⠭8l??Q6ۊ[LmiӦi3גK/}v?r:D+pò'D2d<˷w֦M/^\f ZvqF}'~jؖbF=!Y~zg]Vx>#7~@i|GQ6N]qm0 @ a|5mϑ;NY&0Ȍ @. $>\$d    d7HIo%;H;Ԯ]G3-lݺn`8V33o!gΜeٲe; '~;ZD ᘒ:u߯3x*w#  9"P0GD@@@@@@@@@@ .pө)S08B YL@ mhӾ3>a[q-/a oTI a[~LǛ.nYk~"3gN?m𭸸`-_k׮_NOoq[Aa ~R}궵e2oqŒ3º_~z4\Xi=xw0`ZjO?Ԋ5|"iSOpG}4i=C:S/_߾}u嗧}*sIs%z1=M :˥eϡ_x>%D -ZL{U[yu}om]/{hɻqN||A]!u ~6>`Wu8J|\el#RJ~;u#L+׷W`ԩ!׃,X vm?y~ydoEiX-mjrmkIzCmUSNNX.,}C0 `ibcǎ v!i{?3ۚ@ ֯틉-H]'/C |fI|v=@@@@{Ui}c8mm%q}[NЏM-IEͷW^q Rn]M4);2W^zm۶ !  '7ƌ         9(Oo^߳g*B {;O" FFsC`.ƍ# @ E`eOnY:s? ,ӂdT!5k&+v("N'{-[OyΖ192jժ5~h>CO+CK(&Mq/,>ydE|Ǜ̖yX&gpA'+VbT^{-t?ذa`4"Os3{y?o'Fb^ȕu* ~5^Nu&+'qgO-SG ~}uR}A3 x*/>@R<9>_^3i1R}]\KYBztܾzg]{w|,L҄k,O>M.ت4 {챇m^&3fL߿>Hriߦ_E?Ndn\e˷#ۚ> dWv(iopu/c 7#K    \*NWϏ锞}6 :Xqۿ, q*Uc=su=>#X"ӽvoZ;w"  9(sNI!         @ k.yNI!~3L*}}tb /V_׊Fa0k|15@ vE][ /; 0ChgQA]˛ rxQ@.-+'tuG]?x9JzրBhm_r8NӰaB@ɒ%{M6 Np)ǀh{vm7]}/8]KC^}ܹoR]S%JcwԖaXC йs08 ݻw(0%y}_6mڄvәg:%Kѣ#~[jV?,Ӳ?aC Wv߽֬YVZ}A/2uI/B:*T*[x׮]cp!,^a^V_/{VCeȑa}Cd <8:Wy;zHN< wiРA!/ A]SmǍ8>'|n馍  lذA#F ,}u4jTͳt!l KrmHgax@?k|ʔ)fݷz)V]f-k^0/S 6 ˾=|I'K'? -[6}mGAf5S ˗G {ϳ/= =}wir Zr &X04v)g6{a*B5@sXM5?^5yHCI?Z_aic,Uy&njҡBxjj޼ou-v[+mٲyy۹ꫯ|}yfZ_oM_?ی3ti/wy(K/uƃp&n^;Kti߾}?y_Of}({o›=Hym-Qo{H>yѲxo{ 3<7mvR…3-Rm=Cvmk^@ͷ}-n|嗇g m;8o'{=Ѷ[@ -¬};wxNCC2- @ pdYB@@@w;eBd}ʎ ʞ/?_L;N5'~c_{pW73gCoLPtT6?>eZfq  R Qv:m,E@@@@@@@@ "ҊpQw;sU/GіyJ;3kyy'k'u*u"G, s%K![~ۻqV_V=L?L[_}fΜNn/o)a͚5 ^d }@:߷~j8R齠b M/>{Y^m]\bE?yZui޼yP3믿BؖE(Qbk$| µEC =xCBaBCiHYHvδiBƍ Wlٴmn'nm+WM|*RHg.dUmͭ#@25Cev oNCYGk<O%5c@@@[`r{eI^Ǝkmv!Z{=sۏ'@x|9>#6o~9aq[Vݟ  "@v<@@@@@@@@Q H?\mڴB馛nJf>?؋Ez5JZJj4 -NC=MܹNo(?*̠Qjդ]vɽH;e/d>i$}嗚8qRUt-[EP .vNɃ@  XހG݃RWRkq,N8X4R =,kNC !!S@!   @Jfv<@@@@@@@@@p|P5j?>iE ʗ>;QcIK+K]D$;Lu׬Ƈ %<`* reZ?:Um8-9}x-]4ky[oU *dMժU[nmk3LCկЯB2"-^T曥r ȫaCC}wyuY.… Uvm͟??GzmtQGW_Uz,=H'w4@ ;V}V?^ZU:!;*0o<]V{玎#    KzteKJ ϢEԩS';F{9´r   #@V:(܅         @^ٳN38Cj ! yq9Y&EhQso }ےx.ȂOp#4ؖ3, @v/. zz~%*0xmŗ+VHo Yw_ٲe-1ctkݺuVp-[jub1\:7֔)Sy򊀇 YBL/nu9ҿʶ{p%{ gS啗0[H` |lR{j9K={v?k vZBT ovNk>hz(m޼g.TΜ$To'gC lUB#GJ/ JGm/{tN'0Y$?1U4@@@@n5kn]W/el(,ͫk׮v O-h  ͖lw\nnsϖQ@@@ 8, 1         .0p@M> 'RJ>9&_-"~bWF+E'۶JʱcB ޛ5 ^@x|iΜ-n9F"͝+yaoEDZ^{߮PVvmy?S믰[~D-5@ӭS0?% Y/1.]:3dS޶rK/$ kڷ|}J<,D>@-=̞*V,Cle> '%K,bC]=wBּy<,^zǏיgi@^V @ V{9uն9ՁvWϞyjda<`&>8:T)n- $u.d<2/Z 渃̓1$    1>+;6TZ@:|dǃn2Xܘo^Ѷ(ݿg6 K,'xb^9=I  \@|#        / W_U-ԭ[7; wZZ 6SOuK2<,D:Dݯ烺9q LQikJmy(`q<ɇ%qVzG]--8z̙3u4th-\>VCMI& ; |&PԵk}mµ<`⋥U Ԏ6m |&@UUW oI8>'ppm}UݺuqA O vK~BVΝ5n8U\9O-Ɨkֽޯѣo]w5i 6 xք CkI&w2}IҞ{n(y slzժU|!    @֯^~Y_zuԧTJG֬YSi+P@.\?ܝ  Z0y@@@@@@@@@rZL2>|Zli'ݝ_|W9"0,^~-KFI#GJO>Zt衲baI_BCH2b>x_V;W(höO*[^ۖ|ܸC,5}4yduAb6#7QFpOC ? ޽ի>WѽJEJE~I~He+ws\`ѢE ;¸h\5kNO?]UT_ le{ڵ_HGK~(wd&]; chV:`ɃRh yKrTf[8pjöiӢ0o}D -ZDV2XrN>dz,zrLL^z 4]vYs=Ⱦ1%d3w>yR.RY>YFK3gi?z@@@@@`3%?`8cGiDY@@@HG`:q         #kVs-SN z۴iEE ڵO?-?1OK+ '9D: ߆OBCgcAڶaoQKCF=kdY)_V&(2e˪UV][xfϞh _SN[oe6Y+SL-իWxۯ/EI&`:O.yȑK:u"^CRlq$;=ZI1lE*VxX`t-C ,yZw_ÇlcǫWԨQtN{Gۖ;1-B˥No/{!@5kY"`zB$    dg>X:,1@@@@  ^l@@@@@@@@@xpQGijذaFr?저,tu0|I[?/Y#t)qcɃVh WCS*WI҈#laWV~@~e){PlU]zȖߎ/+T-_l2]4gO1cƄKRJ!`UeIqciDs@ x}`\M>ᇣ5xV/e-^(V@,'R~cƼl!:MtYoZXi97q9*`PBLho ڴn! "&G_&;(0ݒwyg y    h_?ipU+ihCA@@@ Pk{x         yL ]KQڵ ZkcK ŋGa mjiĨG'Tdtbln-5o.k"  X_I͚lzQ/nYm,֯SHJV꠭8pJ/\Xu })E }M/=[IkT~4h i$@BR۶QiiԨ(`Ǣҥ(ݲhdoW!@. ,Z(l0yK`ԩ!L%{!wFϞTZ%=ѣƍ>xske!e= 6(fV?^ZJE:pɷ#9$ Mܥ`@/{`mm_zMDӦMe2ep@춛tQ6M}G5jzTl>3GKgGK\9ץ1c˥+">*p@, xV 6;Htɓ']va}*L tR9 Ւz:O2%ꫥΝ3=:D\]è:/{-^&Y.Z|4 @@@@|*tRkIO1Xaߙa? |v}U[:@x'!  +@V6         E?QdD$Hr*bLx)z;̊)*(1APA1 Jy~{wXfe>ޞlwtu= ޳:OfPj\ DT(8KõlLY9p-͚53yq꼸 jeeKb}zonARgVfG ^2e<-y2miaC+˖ jL RP?ըQ:)Y(.h"իj9lp ֺukkѢ.]:jD 7ӠP;0`KorqvG.C@ PFbf O_xs6HRjUR%IkO … UVɒ% *>Yfwi똑@䈀:ʜ:5U~/SƬm[n 5jz#` @ (P]vyt    @ }bWzܷ}gՐ%'Žr …uHT.n@xЁ677@@@d(q%*J@@@@@@@@HD=:wS@|$fUq0ePB>Z;V'}٧l͞tܩk*p-3gVh3`@.Я:]P(OFeŊ *c. kEn^DBcu.G"fժ[cpipY[V\j%ʨ~ϟҊ5r=T+\KC6m\hK t>0[\DzE a֭3;03(W[7 {@ 6o}ٻ?3$Pn}´J(N*|W1۶l׮ z+qM((- S]U+|ADle#hsA2\Ž2%5~56M+\\Ŧd@@X@ׁT7sm)RL`T@@@@@@@@@ @*U\X۶mSN9䐂'I'pAC!J1;7mfJ5mt٬:uy2FH<.2{UPmO ҥ@G:*~ժ-oäIS_yZGQupN:)*Tg7o͜9C  Ԯ]ۺtb;wvZw"$6[ W A 0T)}g٬V8US}&;l̘ \#t#LGDXvbe]5MA []ۄi{AIfnLrW@_,Yb6m':o к*sf-[/uci @^ t?ZtHA@@@@ _<ج|yG54oVX~_s/7.r _̠p!@Eiƛ2@@@ &Tm          $@5?:'lz S?* ~ٹ?25d룏̞|\Yrf'k![Gy@ w:v4eaC.l֧Omu@(RC?l㯾 B~l nU\: j4;ĝ{f<>} z&MO;4;ɥq-e5왖7^vY0(0ςϺBnl3烵2|,yS[\cO?=G.@VC/Z`͚5ֵkWw\?̸J즛ƍ3+Rd0pbf f @l͘asfߵikN90WH܏WOJSS@@@@2)s?lc·=W(t2Wp 7@kt'Yg<  dV+2+@@@@@@@@@(@]SL1]չsg^|$"^rqm-2??&N .ݽ;mQV&C:f@ ԩz^fO?!xzH;5y)c֠A0Z +YV<=~E"-۾v}w.sZwBg7u*kkILC \_)`tp- ?,4nlj.$.%ks[C3~}%7lhVZǘ/@VG0%*2TlYh(`Y1f+ >GPPݬY-hqNufmۚ3@ ,t&u܉ÃQ5լ    P P{q qכ.] 9Xy^ӮNJS"l@8q@@HO@d         ^@ZSNZ:uZ+VD@f-[C:[s^l}ل A֮]f 7i(5Aa[ ;)^<|5c@ P )Hh Z57O+WO? RV7eˎsZ[~͝[%Kn5 QG5l#:(@N XK!Jԡo}هj\9oK[(l-mFbf瞛Uc pk\b!gE)yy v;?~g9sUT)gݴsϙ{'P+ SG@}.Zh!Z+V`w\u fxs@-6щB     H`V 2Sn٬l|JB \?4k 540E@@!eQmf%@@@@@@@@@80#<2%Tcǎr6S^ )PTih6۶lɒ^u;og-uP- :s @ {Xz=HĬw)ܖr(:*)j0[W9r6{϶lYe۴-_vjVS }ni|ajq+ʕ3=_~ µ5d\&S >}nm@-qFXG*vZ~s+o~7hӦMQ:)3Im )ٳSVډ']vB[ elj@(^5    $³{6o6zʗOu%ҝ\Q%p7@@@ Um@@@@@@@@@z:u)PK|\b@f͛Cw}UjȖƎ5۸1kp9|ְnשcVH8 YPc.) 7T%5kBiN6 9qD=6~x:MvA[eV4?SŒ_T~NiC-MW(FGZ5K. Qh r_7T)RQW@a{*T0;]/jfj)Htzʞ~izݚ5kMoo6Y׮f?os̙TDe5ulsA+ w RUsaA o6l~њ4ioבC@@@HnAW]^z)hcvWA(5k 3p1@;    \ʰOA@@@@@@@@ <eV^k@d駟K."ɓ'QGA@ V03ŋ͖, |cNK4;ؽC  @|_~t>hQ6{p زe=zM0uQwJзo_,\phjU6+x7; tz 4 J!)`룏>?ki$%O7k6 WSq O .=nw.쩫?/qެ˧307/=-c9FA l ZLa-Zl ͛)SPXo@ >p)'|Y*Ws b LȷJ!  D <١]vY47u^aps>V {睴J\5nРARg´!I!  I)n]})`)U5P.aȖS_{A C4]b@z~k4 0l6gN#v0[׬s dC қ#E}6[<۳JQȪZEXQH0.A]soi¥̫*W! P~W??X:-Wc . A`…7R´ݠ    CTj/hp7z6.Z~ Qe˖r'z@8/    "P(Jԅj         t{DžADҭF.yfYY6%J/=  ֬;dkKͶn V#u$lcm-aX=@`?ygUن f `׮aÆ+°~O<Ѯ ٳ֛qEaȖX6nL]@AVtVN+_>B -f3f)\룏,0۳Ǭq \S'vʔMq:X.sn='7۽۬X1_5syHbuТIT= lsmڴq6;m֬Y|ܛ|rr})H=H]|zSq "g}Y8,Zd:mĬY3̓1ǘ*_֞@KG.};6*Nm@ [h/-@@@ ^}5ROۅ ]͵צ.h8^5t@" r t 6\h HouA@@ ֙Ul6eY~y~Zg@@@@@@@@T"T#@ 3Uu}}̘1v)$*Qc8|ٗ_}Ex23>($$ *W.x @~X¬V}Ɖ~{#> /[o;,袋\W[Fr TVz[ ڴ)u%K[ի׸bE:!ON µ㱢EN;v44L̖2{_4-~Ubk]&M,!@2 Tt;{uիW2u͗W^y=|jkΗ+5|73uׯِ!\co7 W/³]C_u ߀(GAH jժٍ7hv[bTZ @ ^2WY   @omvy9%*\i6mZ5w9;'ovq#X+\ZpBy⾮}0 6  d^@̛p3Q@@@@@@@@@@ (Qisxy/_͌W!N@of nR"}쳩A[fVYz{k 23n I.Zf⋓|eK.~X~?~~Ykݺ]s5֣Gŏ9&қ- S_}Af~BgC1;`Ycf>hVى'Z:li=^mvf}=Gɺ}ݳ>^ኑ@IDAT!k.vҕ+WN Q +bC!iGB6o6=;oRȪ>.gf Y_~isY2AxS>@J:@ w{[j \o; d)    G`dsmKFkWO>1;4O?5kt?3aX;95_L<~7X<  @+y]         @ <[vmFE@of{mРA6`l/3A'?`tٲeW8|$Vؖ:m -c۴iXtG[lIv8iw6+h}[v"VH +ZEvITti+U>C8\rv衇ZX| S"M).y駟~b_~:#yy=g Xq=^.:ŊUfVFp4rUjnO}F€-u7#g;)`yssۤ?CT=63 {'xKR.5?cAPxѷ={Rps N(/'ĺN;%w ic~C ۺ_|oIQUQوɬ@@@\y]C+WOІ |[ưmcخQWAa4=ڗ輏t(nk85$S[Q;25\iN_[oudm۶զKgöa{MzJ{[綠M{^Wu76aUݴCxn7pYF|~M;ִq8~tGA@@t}VfSosyto        Lqd(=oڞx AgXmVTKOȖ¶ŪA{8(s&Q-]Ԯ]пKx͚5= ]@CqkZt_G_Yƍ;.hA[._ 麯):H[t¡*wT2>| ~PG]’:P}Q W^2Sh0~T{}W 0mU]ǹ+Y1ZFckxA^:.@A`G_c :Ry3;&X7M=v_cK͚Ax (DK˙N/+ ڵ3w\sP{5?b?ΰVjϥa8oݓq3QQT؞78V8sšoFE>juEu[¶dۛm^KA@@ w@J@@@@@@@@"  3u˺tb#G, y'k`(wf\F/TQc-nթc-@A|(п[RdbŊ>@+"z]̭ )u4۹uѷpכgk: h4Vg Qxyiaх5]Gkժ嶙G:РT ) u r[޽}N[W¶q#:H]S؊J{\TdAGMbn{a c :ۏ\9-:sS&g u*1zvL۴0BDY ~ ;8@uNaHnE 0DCϤdqnk? oT1i4ԘvPgNɓ]HNWI y)p7K/d .yY^:wax;x":LJ~3aaT8ci; ӱ)Bz:RSGt:N'`p0ZE;ux kw8 qũ³c{&/}hVFfnO Ϳ+ɚ!@̐@@@\yٜ9sl6w\wɝDrjժڪi9QsF Ҡsl\m{)K c͛7-[ :oq֭ͅ# UQ6a$jR656GjPtC jX}[SS! y˼.?R(Ku\m Ґ6, 1 ky- (vIΩc75*r@@ ;DVx%        j@5kuY>Datd@ ܵ7AV8öyJ"bRö\F#/$qA5|`r {aGb|' ;V@u -PwL8ԙ:;WG߻B)HEE˰nݺ~Pg 4;·wE'|F:?g]wwG>.{"$mV¥֭i N$_)\p6n{bvyfuc0L+5S<4; nS o={ŷ,v}ɒ`CMwlvgիgxB@rF@mֽ{YsE P+"*  T`Νk4}-j4p=;P0Yf.,xc^~3s"AlNCg)<+am߮7JG|R?ˉ:1O@[}=Wg@@@ wvqو#o1j`;ϺuNMn) 91c{炳vYNܵ(}zs~$+ rMŊkOdܟsf:jQ2)"Ѡ69 R{7mڔ2C]xE5jF~P#z 9$ g60z;w(LKW9TP q иdɒ9TSf  PNVx%        j@EW]u6h [xOA:]\{n\ sTԉntVx; ܪP!x@Es̱)SApi;|`j޼l 5%iBk{ zo9.x'tul!?uc٨Q\vRJaru\)~pH J;TB*WfǗ]f6lXj5i__HąE\uxS()*- "iPVqCA 6>wܱw-hشiS * 3C0 y!0qD;}}gqF^T!ܲe0sL5kX^c\QW+@)4MJoK, CucI}f \tY̞y&8>nl_s8Ăqx߃yq=,9܁/9 &MXv/8+͚">jC@@@ [~r j?kHӺwn L0^}uPv66P6%0e_q۶m}ftTΫ(\HCaΫEe@ ٳǷQ{Aqm Ԗ;6\B_fXwKz  (@Vn+@@@@@@@@ P ~nVKlȐ!vAe<ȿ:d[RǺWa7v}A@}f5jU 0JXlM4SN5u@<[j:> V %? lܸw?c 6m _ ڵu:t`KNgQnfA~RXV} 6lHx"fφA[ժi2)#CFqpYŊql"E߹m75nxێWr[6ݸ-Z4|)cE@E.\h ,p[t:8}Ж:  0*_e1 # P^{- w6}tڎrɪJnmABuj$}ر~Ѕ PG QҸvI>T46k,_R~yz\ /N/pK{tU0cvus&|eN?valֵ~[޼yskѢv y)FOΝ9s昂+f͚5ڵN:ʖ-UeT@D}z|V" ߇-]*WpUwCm}?h[NxԶm[Ӻuk:R)dR`KW~O~/N>d~ LZoxUԱyuzߛG=vw;űaYXY^@8PݹL2:;^I,@{$~:  $E{ﵷz_[zaE@$>|A2e?Wx]w=_|-X eLA RXB4³ ]֝]/6m2=dŊS@@ ZY ʺD@@@@@@@@  y/:,۹s)TK Q@.kWAV: KR:N ݪ^= Pq^ub=rH{7L!vge˖VpἨL`u"?&M;~P={$0a֘:u^ZtXFgcmiZȵ~{;}&LV熃 4>_O;PcGgvf.ꀋ>|EaFs1sbzƌ%KPB>K.VZѡUn`jղ6`b" ,^g2.첄.9wߵqc Ki ݎ;Z T$(MǴ:}Ȗi|fhذa+#[鏿{+m)8KTN Qì~  @6n :Q\@زLA[¶~)ټ9uN: с[rP.+VK/dÆ wР;_T]a>_`>Glcǎ-n#xۥ^EIJur|M6/J.S*cGjVt}:ߺ5UdqtV%Jf\)va{?hQ3kkgv~|J+@Kv S'5kA:u2 ]f$ML}Ph!.[n~͡$\$軗*ҏyӧOW+v `;X5k ˕ӱ;cG)بC~{i@. }ر[:_b 4 Ae˂a^O;a^ˊY ϊʔ*! 5\W^iDH(2   D W`i|6h ⋓h jq 7_mz+?F|Ք)SO>M͛[-csɡvdof~͛7 5U[_kVZsD@H4u;^        Z|@Pgwq+'|Ҋ/~s "AV}D_m})TȬr XKɈiUu KAxɓA, ݻwN]֟uYu|>n8{}骫VT)gCsWܣ>j/pIJ]w]VbZ"M=R÷t[ǻw֪| xK^ aeXle-X`v 5߆ u*c.,?y-h)N Pũz} ȗ?{c,Ν;o{.Z]ϙ߭lٲ>PR %0bKL85k,rMulsNSx•TX\}R`;3fSƦM0ĺu=utqtZFu)~8g y+̥Dwg϶-[meX:ZyP@@HB_\ß>}[nNU޵k=޷VZ6|p5E=|A7Xyhm۶֦M?|6 X@mf̘a3g!x/ҥu5jTXu@@  @J@@@@@@@@3d[oe}5uSkԨ se 9!5U`0p+ pPHXUBjVЭ*Uʔ _8 (XsԨQ>XSkƺu[ gHgRՐ!ClӦM֯_?S%<#ˆ |ilb]v 08d\ ^)T+:d+m+,K \OEau_dsA:o^ )<@a~+4H]dʃ@@!Hshж3a_)D |VN? >L'02 hUn]9sᒽ ;[tT0GA ~\ \K۾,_B",Pڅd @<|A[v-mE"hj%;B}@@@ Lb={G*s [bo1oWV4z;餙tM7 k׮v[]&is)c4i >~mX]y~se)5knV\I|最[|USu. -*_~~Pd6xЖ-;ȅv;[U*^<8WpmڢLdׯ#@h׮ժUˇ'l%%s!  @>6lo'p?O;\|Owmwq 4NrqY_w}gF_.\h׷3<Ӻufmڴ:DA|'Bjk6qD{hѢvYgY=?-g@@ 7@J@@@@@@@@\h}gk׮E@ׯ)dC,*zo [yY Wִ7nnUdVY8 E1iVsruٌ3|?;ÓT4 D\oaw}Ov]wٍ7hŊKʕUP[P?֨Q\*3>#:gl ,➼j^:N._r/p#Z]`;}%=%\bz}щ^uꗋcǎA[n%JYTAشiyWZQ6ol==.8r-ֻwo+Ydn,e k-GyFᾏ:9v>uzh6~"0; w~ʵw!dF@a:vS^   O?K*)Yœ[zB.rk'H:/ӭiӦsխ[7!L@ vHZm/bKq9`  cjeh_+@@@@@@@@@@(S=wzmԩS}ӕBAȗE]v)œrbL9pټys֯7KrniWA[*R_]0oن f: Tɺ.o'|)X+O@=zO 2NH/[Æ oA4'ׇ((ϟq>XUVTbgOj[} KUmx9v22(_wa2׷>}BlWy`u_vʖ-KVxb-lUjE ҥKSO=ezraB j|c|߲o#f.w? @ ƏB)+    $0bn\Z*%:X9א8;{{'^p{9W^Ua%Kgm۶ٸqu͚5-[vh{oQ@HXM@@,P(J^V@@@@@@@@i]vYה!@n ^27Y  $֭[kSN8q">$xM7?/=ƍ_|?|y?>$m?+V{1S(@@ q{Ctx%         !bcƌ!Xzu.Y#TYݎ]Tj֧@4{974:5!hN3h|c.|lCs5kȬtiU>\gf]|}Yf:7`b cSO5Bk1w񼙻-͝kfBȩA{w# :g+L}֪U+S'pB &M k:nQ w &sd֪U˽ N} bgq=CITzuM)T+?.9>ӧA.s֮];֏u_{̾6؇hm_c۱c-YRhg?W^={PNq#(.':ߺ-X2uQ~;yZ,g;`R@Tz[Ń gV2Ui;'zTPS'\pNj5osNJXv 7\ ם]\3ͻDmW_}e_~]tE?@@@\ٔY@@@@@@@@@K믷֭[7n)5@(WL-_n7æM)]CW?˱(U*S(4֠-8zZx[ω@%̛X4r}҃<{>`IQF%E(:^V>ݻ],_r͞=匊?VX3#e1u|ltZMpr _UX7xK. ՁGpPڴic Q Qt[[/袀 qIO<)R$ᤸ u:Ȯv\(xß)uxBO>rj? їܱ;؉ĪGiBV m:!^Yco\2:g6u6EÇ @JXf}kY<6R QscZ޽tM9mFYZ"SD?+ǺW wesw"k[ޢER²m 3gF@Q7 Mw:!   @ (;D^Glze?cky΁<þ… Mmr޽n{G+"dx*x]ɉRju u絹n:zzNm۶~f-Z7nFuUW>It9Cvuڵ^,c!ִfKOС}繴YL5}t`np%J}= H0-[L7/ܖ/_3Lk6n8]e˖ xrrpFS }_cM~<իW\{[Z7fjzX>裏CܱX310=3l%>vW5(K`ڵF'=ϋݱcTVY%+@|:mJ0-Qc~6|mF|7UCJOMک~J"Չu<>@?P@H@-O+    aÆڍ۞ns_ϸ}VFks2z}eNW_͝k 8K} xv4_1bѣq]KJRhlmfyGd*cQZ6xxb!ִlNt(peSεk|kHZ0H##\ ҹsꢲ|r?OrG\悴".?;\8JąiGyd]XqK$.䏸 k?vo<&qawzumsO_'[Vꪫ"rHDEykڔ)S"?C=4ҸqH~"uPܼF\ @ąbtYcvh}ևgu]iѢE8sv".pGOm[-m۶Mw 籿$:KlJvn5u#-ӅMD\G~?5.:uYxqDwM}GW\CqYdfщַo_wqdɒ%Lsĵ_~]K>Vӵ/qߗWt ZD)r1`gS rJ@>m]Gu9s=qE\Q9͘cB}7LM9ra3킜Y飏>?:L }ց  䥀::jlHPK&C@@@ O\0?7srwyg}СC}GuزeKi>2k?xEu9FsPr[tPm^x M5s]^۾}{%y{sV\b{/R)UVͷ 8R[°͍7=/͛}х iIk<97s!]vg;tԦ93%bi=9O\ ]u~}Q{>rQ.<:Vi];ػxKE%K d/~*J_B)Zڔ/D eHElɾνr޳;̙}Μ9wtLZ^TPqMƋPCXDG}t  !=v];cstC@@@@@@@@@bN{  `Cm4/yAb@hر%;^kزٳϚfC5kf?ƍ{03ի'[ɼy Bl̘1оyy -S%3/ y lG,jʕ2<3%Ir6/v6lyһk9s昗ļNGLlo4h`^P{G3oC齗pk^$ v%q믿b)؊+L2d2ژ͘ZR0/G/4/py֝֯_qa<1cnvqڵ3/ (0/yIᢶ,s Uj͔S{ "l 'x,Y2i\N0o<ļM6HZgԎJѣG8(xR<x{o!Vn]9^z8rާvtsq/ȍysq۷sEjԖ/}I>\tĨ0#LiQ 69mkS;j\NmVR6 ZJou>8MSN9oh:@E,Xڷo-E    @T :/P%r)-ǵ^!~qiQ{ôK~Kxcjϧ{%K2?zȪUf^b4]B&͙ALmŤ;?& #ajnSŋڏgtO?{'ݬYu֮n(??L}>{ϟ0i }W.wնV,yvb܋Mu)FM)SXݧ1ck%s/^>|-]ԍ󇩵ֳa:tpߴAV[s=I҂x}hOڵkv=  ae@@@@@@@@@@ b PBK!# ^&yO[Ϟf&y95l4>}̼GtJܔAXa&G+W͡)J~d-)՟iguM8#N 5jDWr=X7*8)}2))޽{v۶m^?PPXL^K* nOq~TLI:udr^yskJ¦;:w%{?*U`m<ѱ+ֺpO>dSB'_oS~h8QlZsp &kҤ鸼ˠtn5Ν;Qn\qT)Q8p-|nO^ Nӭ[7z uV\_Hlْ#"]/֟hZ06Jʫdwqٶmrra[v"_Sٜ:aZSྔ]5@`@*p !   d,&/رc]9;[$EiJk|" 6s;6iM4i͛Oo>׆4;Io^%ڴiSzDg)ۯ*TȕNJjKD[ z}M:=#FpmyU^P,%jI!'}woF-\phzҺiBjUD 7MJGm՝58qO4.~qd]~}OU=ԶI(ǯPCơq@@X VoAʏ         . /`ӧOKZ5,+ D@ o=oұ /4S{UN?~jE8a|qF[jU' yxM_?7ᅬ%t lƋ̙3Hv}D @.  dܵk\\+B@@@b[ovڰW￷Eg$rKWZCm?T뮳N8z!ׯF]qc=fLʺ2;/⒔-2E]d .tmB>ڧIj>}ꫯof_}klug~k_NzPSPwoku}%}nIg~"ʛgn|/6YjɲTެ7 2s;mJBFCYV3f5jȎ?H"  6j!         @Zha|]|ֱcG+m۶m.G@ &nfSN6uT37c O}A{wޱ۴i/OVڔwߵ{.gy|@ _2?_T)7g}l1*2e$7e8ࡂJ݃ׯ)gf9P5kXnk{qSDS vi)z!@\ݻw7%68\p>*ᄂ_sx ժUs$)SmذWmS}ڋ/hz2xj$O?_PP%K.wZA@%`IJdJ\h],]SxM\jUwLyW͛7[,j„ .Iw}g/ @ wn:z I@@@@((VU\ϟs1= Զ +]nT %o׽JW"+ujk[oBMe4MuQVV&Z&M\01Nh5jkvW~g Tm!x;,Y<ڽ޽{GLjKm? 돋an}hQyL⎱?p42!  ije@@@@@@@@@@ {Ĉٳ]̏>(L@.̪Tvwؑj?PTקO۴iuپk;3mΜ9u֤U˗([5JVYfڵk0 4pϝ;7r.]7n8pIY-3qiKf Z3YZ`-[f{!)($(H%%kԨL]"Eس>kOeL2۷o_䩍K0ŋ7>U@NiN:$4-xowxtNnf{"D2  J9!k@f98>tPpXT5E)ϳrWiU߬,7dvUNu})urW}:w'!  ѣG۵^Kh @@@bJ@mƍ2=&k#`ׯ_֗ [~}^vԭ[εe,U05kf `ʬ_J$vZڵo)iT=lƍ-~^p}k~:uPIiS;TS[nݺ`ajOm\Z 4J{Pz:4jޥKE9:  @P+WY          /[bl."4?b>@J@+ Zw%Q!5jC2(?l7ov eoQ 8NA(Q=@_F +VJDoKұcG_<&'N&۵kKt[Ϟ=YC+WжMŊUV.X㓖D$%K;i\F/~W7?u2\2qnF̙3voP~@|nu[lqiƮZm̬B 6vXS"6hҤ)ņu]cR$^Z[v/Y /r۶mcrwMJ',$Eիk6jq駟vۓlCx `Z󇵂5k֘ړf fVY|y;w)qSk{W7mVv~6DÔ{~\`'|rǡg {t^7!r-uwy6h YTzSm>n[,-#{hKȟ?{=0bnxQdTa+% x \^|'>a$! L(ZhK. \s5/(@`?0pge=0r u,p}߾}^R`zK.B wFD`/?[C/CJ*^gϞls=疓ZRd<]K8'x;իoEH;V`@^kUK1guLJH #%^y@ݺuM6u> $%p鸩Do!Uc %n)xɕC(q;du7l0i8V79GYSXRR;j^/H;ojr1 耗-l:XG% ۷ϝT/NoIu\`GR}:^P?ڿ;W^8p@Ds_},AKΓY׃D:~޼yj.)R'Oܫ)qaZeH$k)cf O`IvꪀCdz:|  .{sk} d?Imcq̙[zRkx~PDԶPԮSOum1y:T;-/vLk>=[jj%:ӄ ^'箻raնJNm[Fyb[n̦ Lӆ>Klե=p'5{!ߞo7v^rp*3IbiދM'%KWT/nܸEm&Ojϝݴt=qtJ7k,%_sEJwF$:}i#v֓&MdQX7  @:z|ѻKg">JU z? @@@@@@@@@ ރ,6x`ganfAM;wZ~lذa%pC/QCnu! P^rqC=dsyJuXPMxrl^0l;Kb 0/gXu6nh"0,/{ܼDɖ%+Vļ> ʐrǼ v7c=f^1󂣻 sH6l`^>g̜O"t>:0(C{y r\f ^ >^Kۼyy[t)?{C6vX2dq)+I]x #[w|ymСQ.6@Fzll΋FoGo(          >=xK/(F.I5^Β@H<[n%"kl6rH+SLC?l?P@%̨;ݵ+W\Fgs%RM0!dxa֬Yn\Z`T87!q*z-̫QFo X_szux^p B=X^\.s\zmիWwI}GrS?j2Ô QDq<+癌ʖeu͗/qG.3G̜٤Lޖ8P ڞi%>sEE|_ h2h gh"SNE"#o$yk)3f؞={LrDI,O>^jr(\Sy6f/ƴ_UM4}jS!pWl֬}GSn@#D\W^q ۴iP@@@@ VDIMnvkذj*lU9Ѷ%i<'ڏpWBye"LKuQ2mۺF]wKY]tB %Jgi-,AViuo1{*OvPpa;3U+'K?q~AROy9LwZejWZON_bk1fӽyYsz,@@ dЈ#         hҤ}W6x`_ZA@@ :urI,*w}'GQR d!Fݺu3&lٲͺaÆTmkN?t 9 \ﴦɉ?|6em`tYP%RZ5xΝMǀO<1k eP}.=%(^x?+1,dzrr< OLf裏ځGq.q'q"q5y8&Mdg}p \lD馛VZ{*U*Sˉđ:7\X^~p=SN)JuwJ2wFsq) @ ڵFeJDt'    6A]YfY:u¶hXP4?ˬofJ$_F {g2;{X?c]>}gXLwaݻww j֬%"yO3;.w/6V=3\/+… K.ٳg[F26#  y^        DH_t Y@ -[fzr  $=J @(ac=fC IJլYYyСCֳgO{7.-&XU2]\%RUVk2%`zs4Ď;:~i] 6g)"q^\ Cz.3JumD D{u=&L'6J Xlu]k²eFCѢ zMV%}m{`J{ꃻbŊ [>3VH{'O%Cu@s=g[N>N@Ə׼yq.e]fEFK8nΪLu@@ V7uެʜ          @ !#^jիWV@" W@~mJԪU+S 2Rx[KMp(I7Tzuzm't6h S=zp")W`ADO@Ieڴic;v_5Ŕ&^Rs7|w}.]mqME<%q֭[g~{tR!   1*R:ud}5)y@ `>5m4h`s̱hO%kׯ}嗮Mc.]\rAmPvjcǎ 6<"k[X«؁Lm;ԎaÆM歷z曦6EJjkA  @" ~@@@@@@@@p6x`@=c :uKyf{ᇭO>/_  Jhz-_}VV8-U]l.ּyvڦίJ+P@u7lJdhϟ?]b@>cwСC.Ab .O<1AL6>CGbAzEm Ϝ9O;Syvy9Hu"@{%Kg}ffrɴ4N:.iH(ɳB7eJ@@ Vu^U3離;.VJ$VtlJ         G@ G'xjԨa/) m_#G+]~VbŜY)Kkۧ~j)ÇK/n:Pg= 2N;4>|5l0j@Qwm|iBgqKѲeK};cB Tn6c 2e}.qFVK.1%+^x\ՙ䜀8MC ժUsǤG}4e>cǺ@ `u][+W.GHO`*a5ko%Rrʕ+7;!  .t͛Lr Q(Sѹ](  Duk9s渡*U* #%T&A{'}݋e|r>}}KȳcӽT%jԨիW%9cbdQLS`ڵ.ږ͟?߾K}ի[ӦMM+[hA; @H&@BdzCBLq11        ܃w @ Zna׮]mСVlx&A@ ,Ybcƌ{6mWr /<̨*+.:uM8&Md{\:udES$իW[޽]r^z&$I≙2b]Be˖Y|~֬Y3YA[;E@Jt>PN?t_Ǐ>hȴפ ?seزe,Y%i׮]ZEx]^qu_Ygem۶5%0T0 Fu(\ (N6]n߾%W.̽ZR@DKmÆ .it";PwȜ%3   @J%z߿ݻ L.\8dQ6vX{l֭6p@; q =Ç믿yق lѢE{\j=JvZvm+RHlW#JtfNm& [tFB϶ Z&M\%JDa-(  @N P+$ʺs"        ]<4@X`ַo_۶m{RI5j D^@ϙ3%Rۉ'h\pK^ѲeKoH@.+MZ\sFr e~oֶ}sΙ_sDB̜9f͚esε+WZXbi'lԨQqƍvW˟?阮``ZjVreYV '$ rLIWQʕ+m޽/_>}٦nݺ.8GpVT8.+S빿r]t={ @IDAT~u wS pUD Jv%U~%~u>|J*иqcS_~}+X`PC@yQHǏo:tHh * V͘@@H`ǎ6zh6l}wu]g^z,Y2]vG}d#Gӧ[rL>.kjMg8Oɶ\KCݪX˖-K{3WMO?kW9 5~-1֨QcOlC Ē Hu;D@@@@@@@@Z @ |'v뭷گjwq ."T@ lٲ.\D]DAAk׮킧k J9;r*5+щ@Wps˗/w v6l&T p~9چyMmQ3%y衇lС.#\`8& P %<|w&SDh9PNZ/Q@ l+Y)AQYWXM6֠APBHF@@~ZluQP'^袋Gewe˖K,/~dK3p ;J)o1GWT׻*ɚ/~t $e]fk֬qIyIS_Ȧ    @s̱Çۇ~hJxԬY3K.ҥKg0w|sN4i{6eϷ^z{jA3t9uo/jͺv'ї/_޵ʙRTغuks}6_nۿ+VNoXjUZCcC@@ $ʺ nǜ        P}Hp{]~G{_M#D^СCrJSt%R0u%fQ- Zj՗*U*IA\AM\Im`AIN׫W9?X"oϞ=]0A]w2/ć|wx#~Rd ТPBR ömN rd~vZS uw{M̙ܵ3u3*F-\B#%nT:rSओNr \-c7;cmԨQvWqM3W5%V\bKkKQR2*U$K=% _sr;vߗ kC(PN;~mmK:@]@BJ09~xСCsPȂ ,   @Ԟ?6yd\KmZjs=78ͧ{~6}t[pk޼u%av0ϢJN߯S->|حUNN8ԗ-[Fm}E@t_XƍpÆ W+RkCNog6ŋ'e  @P+$ʺs"        @B-@'<`Ç7|駭iӦ  @ !QW u?XP5ԃJJBX.`#(X8A׭[g |N3pA5YwqiOZ@ΓO>鮻kժewʻ, Ңc:lٲ%IIN]NR-?kwerW~6>u\~~@{je}P+v̉        @ (1waSN5#:t l"  @T (іr@ O*!D]փz[ '`J¢54E:f0 jJt5T:WVs?9)?Iݭ+IW_D(wM25'ajٶm[(y<1]h, QDXbVpaPe^x`'kOvܙl<9~?I#:)`Kʡd-Z-[ɓ'YYy@v LǐO>ڶmE1/IuTOA&d>+^w!8I%Iu:@q=tP3ƍ]@4w~"ds?)C@A@6lh&L/898RZG0@@mݫR TzA uf͚VZ5W^N?t7>OGVZej+Vp4*!o*3] z3&( /6=~;.Rk+R_hQּK%7qvu_Xu ؾ}{R{2ڔi?PNmtO]kCֽxX`y  @T P+뛅ZYcN@@@@@@@@H> ɓ]b-%mT'f$ Dy|?`m(@JC=ȯƒ'=?zH_cMzCs4 ~?tPR굂ٳǔ\Oz`]SOz ]ADC%;+9A ^S@O?mwըQƌC0p'زPri{%8?踨f.o޼IW, D[Jc(qW0uq RGa8 8jsaP E} '9MA#e '}4$PM?ٳ]%Ci޼yRSO=5{2%zjZ}VNL%c]rദa|,YbO?%]۷uQ7 %tL\>T`7?{QCAZP Ȩ׹\G(^@S_[RZ_p@A󿟀}'$Y@Ⱦ@&MΝHXj%즧   gtRwYɵV\WtImN:餤^m7U~Fq)P@R:uHzV;}Pmk֯_ojgNePr/%R,#_oŴ- tR/_]ʡW>=J}6]knPmtS_ ~S;`P0֫^ w ~~{1ky>c>NF~;:Xap37{kM#:@@IZYߚ$ʺs"        @B-@40ڰal!5Z馛܃si  zp\WE?2h>S ͣ@xN!?\׃~p voa&Mx^~n!R@ oza˖-Gynv͔H ,~B) (e)د|DJS? \ 3yI>(LI?'C7<|r`KIx\SZl-Z\OʞϷs=D@8zm 7gΜp,e+>7n=5kw^k]KIT _/ôT0Mp.{i_'`h |hu@ /똎;ŋ^z_ֈq#@BٔT@@@`Æ UKR+?ѕ^dS[D='%:SO=N9ue3%>jl_lR~/'P>p;%*vL ~21ݘ^C?Xa"Eܽ{:.!  ?$@B1'        $b@P@APq{gTRەW^@pf&@@Pta|=z^ ::4 ~=c 裏?)I|\!w?qp>l7tP{+W_}Q2p {AYÆ mVbp!#uP%RJwڴi`デ t{qNI1 ,lsW9t@@Hי1sgj@@@@@@@@@@ -j<~ѣ=SZJh* ʏ?I֯_oKLٜ3<Ӻtb{}v'gs̎@ bW]uKt뮻.{ fnrA@o…C ,cӱ.mB钯߼d^%2{$&Q)Lƍ]$%Jjg̙3]W<9EoڴiH9Q ?F$b(uY\dB.kÆ .yȑ#r.DN\HXXb!aߍ˗y>&D@6l:qڴiU1j    m%RϽlSP+oVjƍf_^6E0    JoW*         Q&P\91b}WiƽR@@ M֭[ے%KlVn]3gN)Pvm[tKd{ 7؅^hJTB@~Ǝ5Z+LXqȐ!ۖ-[\&Mؔ)S\¿ŋ9mϞ=E5(ytґZ=S%JPB.竵yf;J*>|posM՚oݺZD.@@ [nN9 G@@@@C`LEk   @NP+'TY&          @5죏>Yfٶm쬳β?1@@\-\К6mjZ^x! HiV@cܹsmʕVfMw흰 T<餓NeF^ڙ,ͮZm;ڷoo>X6mdoU^|Mk޼)p阥m{СŸ8 VoTO/+SL۫T*UC~˗/_VN >hSG:@HLA HLj    D5˟? G@@@( Vl         %ЬY3[xl2V]aÆĂ   qƙz^RMs9ǖ/_nm۶.zmwQ,K >5ݼdP\z-KmtbY~'{t.V wI{9+QjJUT>bYؼy*t>]#>.8֮]k7|)YkwJUDXG@, |W9+V,Ka6@@@@@p >l6{Y˖\*B@@OZM         Ĉ@moa*UAΝ;Ɓ" @l kΔE-uֵfE(u\ tɾk+_5jȞx S@a:bI_u4hU>|IKhֵ+IqWn7|KNe[d nVbŊ.[oe6mꪘ/ZQQb8~BRJxMr^{ͪVjwuu%.TR;.V%\Rx" @$Fg/[;LK bZ4co÷D\S}6uT۶m͙3Ǻwn?N8QK5a7M"ZCjÆ:l߾%KPeVBqƹg^uֶzj{駽@eL J(]>G@?Mu߹v1Vz    ķ̙f-Zw?I@@@ P+̏         Ycu'kmРA.ٳ'kcq  @x)bJq$ݺu%<,% yJP3|V?0,E K.jժY…s~eYXG&O'WT+ i΢M6u7oKcWvlֱcG+YիWK6m Ԍ>l[lD>%ٵks1.Vb8ZNNRuԱ.]}+)1# }+S?@P2B 1     8pkjE@@jȆ          xŋ!Ck]uU.9EJg{&5F@PҢ>#7j%/SPҙe˖Y֭]B}T46+;3OR)S:u2S (w۶mmС_͛mܸq֠A8qi }-_i:tʔ)_`ݦ?JDؤIwWB[|VJ!ұZ ( N`֬YkO?mEA@@@@@ /6۵ˬe(*EA@@TZQa(          *Uʞx +{*Wl/۷ϟ!  5\pK7o^[M<9jFAP07xFm#F0%~A jkUVԖ/XӦf|b6}嗓Twɡ\z}mذFg0j(HF t^K;|pNe(dh?:%ˋu1DŽkq1%j׮5NL Eل f͚1[|۶m$*! ]s5־}{wÜ@@@@@ f0;dDU(    $ԊB@@@@@@@@@@#ʔ)cO=K hwuUR^~eۿ30@@Ŋmvۅ^h @ j \uU.֩Sy(زeKTv((ME8\)Sf4Ѽߪ(WuՔLv;%:쳭dɒ޶h/Z*|+gI?K|L@zwNZW+];6m4E#kРAzlq֭[I[! \@wiÆ K@@@@@B@mZP@@@ H"         ʖ-kl۷o'VBmu* ӧOw}ƍw J44m޼9em%,_|qY?*&>]wezM2^y[bu12 ֺcSR-k@@ /ٳ]veֹs,C@@@@bT`믭VZZ}OKd֡޽Z3Y@z `ӧO۷̙3K..f׮]L2nmҤI!?p¸HSxve?UX] 2~*XFY ԑP+#)>G@ ۳gK_j    ĩ,N?ݬ\8 B@@,@B08@@@@@@@@@@ R t=tP[np OZ<T#U6֋ HTR^rOnݻ[޽m 5JL;w\]R={QS@ p_}ծ];f5-^l־=IyC,XК7o,Xaĉ֪U+5kڻ,J5p@1c$,iYݦJ":)dZJ~7 VR%O%Xvz뭦c]r$J;@M`„ 6b{o     @\ xMme˸A@@rTZ9@@@@@@@@@@8]*1@~lƍ_ ֈ  ˗%}lر֤I_%8ꨣ\?>kР}-kOHʕ+c:6gTkR.2/I]BnΘt"E /zʖ/_nJoۙgiƍs+f-ZpXpi M@KmbB DyeBÇ ~yֵkWH… xP+95FH<_ծkcǎ@@@@@@ضl2j梘   %$Ԋ A1@@@@@@@@@@p wqv}k{cio2>v$IHFV*D_!3EBT"˨hhɊl${YVG6y?2>88\}9uuO1brʥ^xA{t@@( VٳgUH͜93J331-'ggdɒXb;vlLA`׮]:wt_|P4gՁa<M~_E`9C _>3m߾݅a~ʞ=VtiKZ׆ 2'^&P+0@„ ukΌ3ܹBUbEرC~ҧO݋>X&RNr@K.qʒ% 7`     ?l?{S@@@")@V$ @@@@@@@@@U)SSN?݀js<͛W 6t/ڍ /`$+V$tU6,oș3-Z-ZA_~e]p[G;\`۶mYp᫡Z7J5kJgCw}5k»٣[_~J4{=l3A.pBp( :tHAAAM 8qb Zdʕ+rέM6믿}P"'`ZiӦ̅ >'гgO]VƍS}4@@@@$s"En "  w&@֝4          3I$ / }̘1ھ}-իk> %`>\Æ UjU8p:Io|Z) ^#GT2e{n ;w˒%RJ D+ l_PH,K/i„ :|7Qǎu ͛{LbfdcSYΟ?Uz]eae˖UD|rM4I -H@[`ĺO>|0y@@@@@+̑*W@@@gMEC@@@@@@@@@@H 6luԿJ*TR2e\=+@@ -[tٳGE!3 v;ך5k\PΜ93vVZV,JWCnjԐNҟx}y5c ;vLK,Q֭ٳw6m\ѣG.88ؙ0<:,Y2;w.+φg}V ־}O?ydɒѹҥKP} CԴiSիWO/B t>"    >-eTOw#  .@VB@@@@@@@@@@{W*-[̙3nݺz矻-i)-A@@(T ,*SV{@>(͛'m.yNKu/mU t޽~gիըQ#:~vaw|c} e_cƌ}.TV-:i.%P+ 7=Fc/ߓ'O/{J@@@@@;WJH*[DO@@@ P+6Y          JҔ)So|zה#G;:r䈗! ? NZ&LЇ~^zТǟH_|\*Bh?`a[*Z;w>NnAV}GէO\RGɓfR͚56mZYf=\罵;QnW>#cƌQ^O E:sLxxs޽{+w7n>#mٲE 6Tx񼦝l%P˗ mG@Vvi͚5)M4@@@@@3G\G?S@@@ @V@@@@@@@@@wx@_|vޭ֭[kРA.XM6@H>.\M6H"Zb jJK,qEaA N8*o޼V7V/u rƎ|$۫I&wnݔ"E k?4s6$}@@#rJYi.]SOa     #;wJwKUHi&   EjyƠ)          $O\o߮qi޽*SJ(Ndڃ ~&`3fPϞ=onݺ:v옟@ڴi5}tꫯiӦ:{/w{$LPs&p҂Ҿ}ңJjż/-Zѣ~.<~`ʜ9 /]H7.OA :RN;qDtV{u͞=[ŊO?WWNa & O  St߇V\ٝTi,     sJ)RHJ8G@@nCoE@@@@@@@@@@@H z)-_\K,QΜ93(W\ׯ IJ@x[oiΜ9Zb)Kb05ڽ{w͜9S?gRڱcG ޽[ٲeJ>i|3VT<3PzN?*?~=yd=zTVRvd1rx5f8p :3:r Y-[.](]iҤq{K֚5kTjU=cʚ5֯_o}nGx2ZԊF*A@ NΝ;'|Rɒ%s6`     @}={viF۶mZe̍ DAB ڰa (rʩrJj`VbVZj$Ix:uj̮V,8Њ'Ʌj9r5T˓DA \PXbܹf͚,Xf͚ij޼dڶm)SO>|XAAA1‚߷lSvu}gظqcw,tY-\P? ,Qx>N>/*]tT#  @l \|YM6u5ӧO]wM`}     w `Λw;E@@@ P+`7=G@@@@@@@@@LwgW?˧5k[ܙ/K# @2d "kݺu?. -vxb5h@uQ׮]e S@jѽJ<$YVѣQc@H8ʗ/^ziѢE.`tU,]TS]ЏpwСCʘ1cloו-[6׷YmұiӺ*4Ύ_}Uu4qD΂p)+O$P+vY )о}{͘1Å͛7:.@@@@@XؼY\"ձ @@@MJ@@@@@@@@@@H2ڶm۷kn jժsӧOnX @xԡCuV*TH~AH$ /R9rw:@K\  {jqHBիWWf9~x,YRӦMsBTB.ŋ1Y{@IDAT_  uJɓ'wdw}wt9~&JH?vXEgΜQ޽;wnM0AC f`,JƝ" ]֠A4|pI z@@@@@X3G\"EbyŬ@@dC @@@@@@@@@@ Ǐڵkk޼yڴiʗ/N:)[lz״cǎn"G@?0u֩tҪRzK.Y// h…ر?UVrwh{, _ʙ3g,VeݷDhTI $k#-=tҩnݺ.g˖-ڻw+_-`FzvZ]|9Z;z!perRXƮ7g|Ν;W֭0aƣX P+VY *0ekN}QFn*C@@@@=s%l(   !m          @> ={{6mͫ\?\~< DR஻҄ o߾.Xk߾}\y Ҳ@|򹠖/"W|ZPN:9rt?F`Z] QVYiӦ0ݻw0(M4.P>3dȠziСںu'.((롂jՒR XhѣGccĉ*P^{55lP;w[oɓYA/^<S1 ^%l25iZX)@@@@@7.],zVl?F@@A@-o @@@@@@@@@SiӪCnPɓ'… Q 8p?=[  mڴъ+~*TH?cl7![̜9S;v /-[a-`>Vrw}u*Vȝ;~ر:x6nܨ=zŋڵ GgyF| Jk{'N(cƌQYy֭[8Sӧ@ETR_+B>#<xc J:$Hཌྷe  pӐ!Cnx     %0 }zVkqx?aVd,2GUZ"3+  W{u 2erH¯Gg@@@@@@8^ZDʛH_gÇ5i$X:t֬>vd   \ӛ#         !PB7NڶmѣGBjԨ)S(88?:J/@%ۧ._رcaڴi֯_/2f5͞#G=gf͚}Mcoj $oԯ__} ${$I*StiKNjr!\6lp߃= Q{nĉ?~w|ߴiSY RN<[O D&P+ه9crdݻm۶J6slҤ:w(v>qi, _߿_+Vŋ5{l>     kܹEsFkͫ6mDXv+ c%   7jͦ#          $LPuO?}g`sx M>]/_@b@)z:uzm rvKoٲ,JժUqF.\X*Ur!.]TlYYƅ(*UJcǎE%,P+cƌ, @"P-OVT P'޲$G7Oq, }ݲ5ɣ={h֭ׯ +z14hB,@TcǎEzѥK,xHWŒ^%@-kpdmިC,-2!nЮEl{Fȁ   =edZ@@@@@@@@@@@\ԧO;2e ٳUVz(W /R+WTʔ)3gN}l'udĉB)7n̟1cF &'Ojڴi?~ #Gjnpݻ롇rB]M}7e5j$W 4w?̐!NO>D:t/nZ K,pرb {(*Aq=#<=y-LTŊҼyE__ 2D;wmw-Uۧ^z[CZ`}7uwuy!r϶yѢEթS'I=m1…-پw*Y6o%қo`_p[&Ydݻrέ6mh. B,6KI&}]|ZjÇkРAZ~RJf͚}xȲF]y7gdӧO;xFY S%t&恶DH -6bm9b8zjY2<7jY}B;g,_-Ȝ39_dvy@?ۧ$C2efF@@@@@H :%ޥ_e׮' ZڰE~?Ǝ jڴyv!v-RpplٯJ}>cw R^5/_Vt\5\t  D ?y@@@@@@@@@@կ_ 0m65jhjr?Q@$~Z׏?-[믿6`=~]pނXhmX֣>۷@ *]v:B{O?U  oРAh4 Yj (\ƌ+e%D$`Ǽ6`& nqy?>pϺ#d%zg#~*zVca$%Jp؞={{o(P@K,qAdxzg]Xkuֹ}`hӶsի, @rʩGnn-feʔqe!\{F9qℛfX0.]TO>LeA]!eٲen6ydٹo架Y7gQ5=۰l` KċOEQ5sLojݺfvke;.;zM]{}پ$rv`1B j+}ۛ-L}7C1}1 (`ھByҠ ŭH@@@@@,.]< )gΜ[ Բѵ)STx"YoIjʕj֬ iQx"ټO<񄻾nݺYf`)k)dKq   P+Ṙ          5yQg}wp}6w.]Ci0 A@ .y~uh"{Zj.*UY8zXp{2pATT)Wg}P_9sF mNbM6s=mk.-Bl:u*6V:PqZ|, -,TnhA'>H@WC,\B<;.;w͛7ߨ`.[Ǐwiꡇrɕ+*VxˀÆ رc]P nA\V֯_>}hȑ^ Ŵ4?b7ɓ'믿?p76 cV,B:YXWդIP߶ L lW^:O/;Z֭+P,`,lcǎiիWpR;:ӧO\ P $-@W}u{v,>tPmذA5k @)uk}_9=>$:ms_  ,e}h̙a;y     ܹ\g$y.ps=-֮- Z$ծez:,"=sM*Okf:$~vڊkv5\w/w:  @ Ĭ@@@@@@@@@@ 'Nv?G @>f`@M`ƍ `_|Q6hM\V\GyD6y:un~ZI$eZ)ܴ… _{.$@B@"[L!]!U^ݝ4iRȤ8( M)Q*Un'`/_V4is1ܣt_~'J (yڀ3ƍS,Y#Gk+WNܱc& *Td{O8q…7yc~Xb *;wn7-5kVf&MTٳgwRN- ۵k.\ 9o,H%88؅Vn=oY(Ӵi\/8ydM8Z^z%> Yߵʹi;^dɒjժn@$;;zlYHX YW=4|ZtØo,^ j~Bw}Z}fz\8nqy}>  l2-[}Վ(     )0guꔻ΅k?@@3Hl          x=ܣwyG~7}f m۶պu뼵 @( ;vL/^_̙3?W;('pa-e{,0uӦM Lʟ?,X͂mG}T}X%0,^kV,V-TF >ٳ  eH5Z zvs@oWVRj<@@@@@?{.|/_Bz-mD"]E6uMsuV\k{   Z1           `5kt:uꤟYEU"E4x`=zԇzDS@[TR.I&.4$Ν{= U7nd/_삻"XH`ŋoX$[lqLn,l̙5p@LuָlF @of͚%Jp`jv뮫Zٳ_ dWEX ,AlB M}zeߋl޼93 v> P5{[`1/ſBĉ zvs@o/UN5mT&MRdɼ @@@@@͓{F{/_BB쵴x-ҥK5\k{   y"oŜ          >&`[ Rh"[o)k֬nQ=  *о}{0zh}W.jʔ)7t&njСϟ}0~)\ys-+W\) op^=.] ӽK/u,(n76@*UvZJZN) Ԋm&1?믿B&qÇCI¢Q{?/;Fܿ~WgϞ*X;6.?:m;f{gY Qy ʳN>]¸ Բo bycd<@_xwԪU+9߰avډ     p{ss]:[֡Cu65lzȵ|-Ү]5͹sZ$@@ZQbf@@@@@@@@@@_([ ?s6xN]vՎ;|k@ ƍ72e8#G'N `^^=mذ=gC7mҥV,0+?^ѴiSF YrM6d6M0 `]v`ョ4(lpCjȑnpf ʸ9 T!ZRNaOB'TF`7£N?S< mz쩷zUd!E=Z`cjZ`o.h˖-n{N.\kl_~-oQl?En 0$O\>:v ɕ=˗O-[ gF}SΝ+WuumpM;'0^- WPMCz7T΃H làH/3-V ס^۷owkYdqjv9eʔk!81ў;!KEWP˗z>z7ݹ}.ċ@YҧO/GY?}mе!!͎@ۗ^x-sC- *`ѣeEA@@@@ %7k*Uno\u=vPdZ$o]7>}ky뭷TN8q [J"#`)6%<A.T`ZG:,*(((Y9 [ " rï}*W تQ}]V/_͛W%J 9W^y}Gk.Ղ/Ǐ_?"U@۷/^3 n"+0x`լYӅΟ?Zi $     ̝+5w@b*   j,c@@@@@@@@@@@ܹokΝ)=z([l@1cٳx! 'W\Qxb],L2RobvWj&MH 6Lfzۭ67xCʕ+]z҂66+t&L u%O.OTAl֭3gΌ}_>Зoo~+S@;5kV5m ޽ۅ0@iҤqZ{Ov [@C_ƍ&M(QB,@\ $>},dɒx5z#/`3 &yIJSJk׮.;w5j͛7@̙3롇rQ:yd ׿۹[4rHiY)RPĉE-1!$P+ :K'@%SNS4hBO ӊ%|V    xR*^H  Z>h6          w .H{J.!CСChZ &`맾} ?֮]ɓx9;e4HDPdlYǤ[NZob\I| &;      ~A+c   jE(!         h :T6̙3;wnuEYfU5b:u*@@Ǐvigĉ ײ)ĕ@Μ9h"5kL 6T۶mu…j@ 88@i}$|yZ5iٲk ?P~VXݫx?yM*j֬' "TpaM0mu]*e7}NSr,޽{~Szj.l!jOA@;:uz!߿߅w+@@@@@B̑Z`)"  DZ%I=          $0aBըQC#G =zh%ުU+eʔI 4ɓu! ",^Xz2eh۶m%kܸq.^v^g-#(+yx{Jj-YruWŊ+˱(Wv!P+͚!C>_?W4 0O.jժjÆ .<(Zم ֖-['Ԏ;Ծ}{zN&N8qհ ?>  ={V/;F]֭[炵nFD@@@@Gsʕxw @@[֟#         @d԰aCM:UРAdj?Sʘ15k3gŋ"B7@o SNZv, p0`,ٽwfwYhQM2h ώ@WBƏVW-, [~+h'M@-;D^vߗ1B{֭[կ_?%MT=zpWfj7 ޲@*_(jia*TY0'|GW Ԋ.Iߪ@-^@;,<9GSHᝍU     q&`?,P   jE)5"          @ڴiժU+͛7 ;Akժ̙3̙7­'@@ϯe˖魷қok۶m^ny]G:uoE;I$:((4nTT`T@ڵ;X 6B@(o޼z饗4a+}_>}Z:t߯9ry{zɓ']{˧͛7k5kJʹDw!tywCi ^(p}*U[ƍSOyaKi     7X!9#U    ۔!         @,Ykiҥڵk:wkתjժʖ- zŲ(   &Tnݴj*;wN V߾}>/4iR 6LFr_|jVPco|VգGo -I Բ!7ѷҧOkg)SzRJJ:fΜ{Nٳgpiƅp=z4._/mi&լY3 Dm)R52Q"ώ@%-H̙%#_s"    @IDATd!h=   @;ά@@@@@@@@@@r̩N:i͚5ھ}^~e^\9Ϗ-s]v.xp)@(T }ٳdɒڰaWFO?իWԩS*RM^Ǔ1c''Fs4.O?ƍ§,P,T=ߪQƵ6C ʟ?*V'|R[5jHAAAnסCuk^hѢ.ڰcꫲ՘,t̙\u{j&!xm*X;˗7k C@@@@GT@@@bjkӢ?          Ē@HٳgSO= TR/^,  Xx [N=*^:w'Y( <Zrڶmڵk~)QDQ\ iҤ:WD w,`Y7GK<#ժ%M\Ŋ}+ , ,Pœ('P3*l9q;3լYP%Jz*WGyDle׮]ر&N肿Ǝ+VI,Ξ==^"@l tڢE XB]tQn.'D@@@@^zY[}[h   c @@@@@@@@@@xջwomݺU7nT?tʑ# =Xl\/] @޼yh"`Et;'OJ#G_|2eȂ@(/`A.jž{XkL@TO>a: *KNL&}? 4H6mҁ~/5j*UiGU߾}]KӧO뭷R|믿j̙_liYٟDyjf 1,pe 0@ ZJo6aZ1N     ? x.ԅ R+  xZ޵=h            ,X0pK"O" S۶myfeϞ݅kNgϞҊhڴV^-I&A\wBFח:u*{^;vԙ3gn)!@V0q89SLjԨ ?\!C1cFUdIO^kZx͵oV>e5jo{'l.J@ P"܆Yx.]? Ӳ`-      Q;Wz)k֨,ż   Q P+*Z̋           \a5o\? B9^y͛7O.]V@Y gΜ5kK >\k#.PyjŊjذիBΟ?- UZs ]?痘gO|)R6o&L5ĉ|nB6W~;{}䓞 PQOg'NhGe˖Y6mLE[̙3[mb,nܸrJׯ_)~I5J@f> $lٲِ!Co߾pBHm     #_>@-Y"@@U@`] @@@@@@@@@@ dri;wիW^{VXa*TTRYÆ ~s΅ G@_~ǎk&M9r[/ ng}GƎ{1-%MUرc_jpB 21UKx1թqx>LVX0© (`ڵ3۷Ϛ6mj{ZXluB{￷^Lj.] T3Ԋ,I  ;vʕ+[խtҶi&^$      3W,):@@@%A@@@@@@@@@@ @yk߾-_y`l֭VJיBƌc'O Rm@SVZ~zoժUF.!8[KY s̶pBtFAv)r@-I$Ј>^4(U'pnsd.P#PXV޼yw) :~M:*V趙oK<,X|M>}>}:J._lED)_Lo8_TJ   gΜ.]۷OϦÆ c<D@@@@Q`l|sn6[G@@@ P5A@@@@@@@@@@3f6m؂ ?nݺّ#G~"E O<L@' ÇUVY٭_~ Q)'NOt!=\2*2`_!@lB&O.a ^{Ծ.[AJ@ "P+}3-[֪UfŊM6oms{VBѣov!7n.\سl˗w!G%J{ϟoϟME/^XbtL,Y25B@ FmYf?:wli     @DvUf.}<   #wrL @@@@@@@@@@A mڴ֪U+7=z~8q+ /X]'(ZA\@8p-[ YΝ;m~"qO\֮]ol#G hM$+ΨիgEuT=I<U;yeJ>PС,aBg5n5kdVL4BV`.H_Z֭k͛7|ٛoi:t{'xJK^@3gδ]}ӧ{BIKN'I$1oO$MH@%}',wn͢&͛gk׮u ٢D@ԩm31%nKf sY^xx&x>"EmdlV@kժկ_߶lb?|C1Ɓl֩S'=omٳgw!H Rh]3k9s J׈ߝ *?s.{zsT[y'N,Yدjcǎs @@@@@H]oyN۠AfU%MjX ej   f%%J           qıeڗ_~i-YAMa K_c۩SB҈F#Q%JtH"@@aF_޲f 6CAhB +V~w{'\ro ~Y4iK֕ˬuk3OuZE?ّ#7>#-sĉMطoqχUh ٳ[~y1,W\.|vQ[x'%-hٲe̘Ѽ!\~ @]}N>mǿh<xFj鸁 @;wzy2gl_|u6nh5k &@@@@@?H6x/\[`3g(   @ԊD@@@@@@@@@@ dsB?k֭[C{nShbŊ6`S@^)DfE T@mҤIw/bYd:Χ U QǠAo߾Vxq۶m[T>(:ujt~k5h`7kB|'Oۉܹs{7?`'NgΜ!Pzࡇ2ܬTdI˞=Fq@FҥK6l0{Gwޱ&M]=0     %*Y7紬icV@@@ B@@@@@@@@@@Ȝ9ǟmlܹ~߿B=.]:+XuVZ4@DRJN* [nXOXTV֯_:nժ 4Zzu&:… /_>ѵ?/ꢠcSSGmti6|ѣiy2]Q'BjVpV\cǎ; S)_k)U}pB: zꩧ\j*U,YdVH.1k,;{g=s̒$I/͠>\)\9rE9C@ P?qD&ڴiS+_mٲźwnI& fPO@@@@@~7]fh8  MT@@@@@@@@@@F E֨Q#שÇmɖ?~0 2X˖-mԩv97AM~N*Yd9s@„ O>qFjc= tikN Z-^ؚ5kf7:u@[ ?#L]#74qYBf7'lߑtH׽A-d7SK`ΝPR2dϞ6l`ŏ߿*z]m>۳gOb~A=z͛ƍg Rзz-Z. wD\rpJ{%x @P5ըQòef֭Zt@@@@@ Hurȑfl G@@F"          5xr6`?m.LA +Vɓ[mСN) T%HĎ6lx<s X߾}mȐ!. bĉAE nܸ駟ڴil޼y'O_.:L2پ} ~ v_R6'N zCa)gΜqY eظq^}wkFh8kZjP͞ݻwd[b,Yd^zn @ҥ-f +i&炣@ &Mu.顇r! U7@@@@@8G)Ykάp@@@ ș.SA@@@@@@@@@@#޳+V8 вeKK&-Z>C!bs|@ų5j..\u^͛7M6YR\ٶm24?*ʖ-kW|Yɒ%C uQ.%1QR1s tm1O}.pad!O PˇL@@@@@@@@@@'؋/h?Cqu /` @@z Qp:PW'ӛðalΜ9{nԩ9sQORHaի/^ܶnyD3e䚳cǎ`jVȴqҥ֭ ;LK/}(/p!} Uh*UH".tm۶С`, j2dFmϞ=Hm{oҤ%N8M@C@-#F\r] Zr}wi"     @@ (Pr٨Qfs3G@@L"Si!          @^Z 4uּ|rk޼Z=F@H BDL24i+35l}A ,%J:#ڵ}g={v4iRX>PofϟwA|eI$1 =1YfzWwE@/ַo_{]Q֬YゴuR     'pbooV@Yb@@@ Ԋjq          C{urd۷o&Lh=Cvڹί10UX_?s'NGk׮bǎmmڴM6Yb\eJl۶mw0FE YfŋVV2C [GqװQy7n\޽͞=VXar岟0ef6lwOv n} /}`Gs\-~w#p!rRF`֭VbEQ*TTᢡRv킕ҥKwGM?=S֭[7[t9r&NhO>M6ƚ4iR¥9s; #GBʖ-/^hzσ " p z饗,}[ӦMmΝ֧Ou     B ^<3 */"  R@-_2m@@@@@@@@@@+8qXҥO?7ڶm?g/l<͛ڷoo]pNj@@(ZM֠A@2uC%JتUk׮g{Ə5J(ի~O?uvIgϞ֯_ (4OfaֶY .}y2}{#paט?x-;w9sz>wܹs]DC("C T$NتTb{5k=Mۨoƅ*`KaN} R%D=OA@_OS;WQ)SjR@@@@@n*,ٿOu`?MG @@@H8֓mLA@@@@@@@@{=;x`D^k@@B@eϙ3ǦL:bܺurʙԁp(v}Av=zN8Ǐ_ɓ?x6λ@jX|mڴj֬ H`cv|%J?UT"E 3f4Y}쭷޲#FXɒ%]hB\)Fm-[tm?O5 :_:zt&!  @<)2y~ mkl#8}Z!i6        @AD82@@ 2l₵ԑܹsM?xU 4/^F4@p ;vۯ .RGA?Կďub {qk *Pq-= ҭ: G)=I:A3gz %#/ Xx+b kѢ.`%țM@`֠A{{}>#d*D3f_}eֵf,{3g{on 6m۶m>'[}N >70KZ_|x:7K]]Թ 4<5kV˞=%Æ ^xU^}6Znm'NڵkІiӆA;B+k}6j R[T+[:oQ}wdȑVH4ZӺT{q:nSn5hP ]yXWw tfΜ錴m7 juH:Ӷ ijޮt.]kO>@$k.߿ Tg"ZYL8ÅC0ۓmbCO<+\K;~ S:ѶVG}u ҭMrx"#D!+ wѾp/Gh9rp.\S®~m~ yRgNP8P^\tFʿZ7hڲeh#v]!ހ盾ɘ1nL2VFam{ڵk8E;j=d56h>|IIZPOiVH7QZc--EyC零ÿQxޢecZm雎yҭAXD -mߌ3؏?l֬.S^vKFT!   t>X]u}ƍݰiӦ+buw ҹf*5Ww@xǽYZ-ۍcހ-{yo_U^s:s6(k֬W̙3¾(   jE|9q;^        Z@@P ҠΜUu[B7,YuZ ͡ Z,]-Zd/]URVΜ9]': tuAƯ[z^A[ٳgwAE5 ZRK@<矻ݻwo+QDp5֯= >|+W/gN1(8s믮yk?|x:ihMKdt“-xEA7{]Et_,ꤨXb.HF؇[oCWZI$ ̝;E8_ YHjRNF! 4Z`\FbbLOހ%Kx~^ҤI\ɗ/5sTxFEy2(dJ@Ӡdu(ԁ`L2mtܨA7xCN<ƍ Mǐ dԭsz  1{m˖-n;ުU+V4p[F@n'@x@@@n%W\i:'Aצn޼Ξ=^@,]/sDY ҭq˗/ہ\ru>ZAb:~؝[͛7ix PN@@i" ԊD@@@@@@@@@-  @ fu, Rg|'p mȝ;ň#[G@ /5k]!/k֬qEqʕ˅h\N>}%\KC|ݪs)R`ŋu~z48 W_u5j u_ /رcSNֱcG3VgjӦ)8~<΄ lԩ6|:yꩧ\M…Pyr+=u)Й˗p_~͛gzL7 ֪Z P8>33:B7|c*U/…%!ԤI\u[:Pɟ?)`ܹs܅ YM! Sܹ]2xO1 MmݺC)(a z,qԋ; p nÆ .L %vAZyq,X{N{ ~%>=Alĉz깰S&R@BC@Xδ@@@^2K,qחرM:UT|ܡ7D+Yd1뀜ƩSk)`k;QI:*TtȶRi@@BI@/m"n+@@@@@@@@ P  iӦa̙vs~[!ν}On˖-3uEZC6TG zQ̙c)SgݺTUJ` L2ŅXl߾ZnmAH_~k.XC*ɓ'zGV%Gi76u7nȚ,Ӊݻw۸qܠ TXmDA-~ >£Xb#kծ]ۅkŎ;+sTyѣ=k8z-;~m|v|W{Q3ƅn.?Gc oеߩVQ?lV>carc.\(|*VO>d& R(_:u G5O:e;w޽{#zʕ˅v(`ĉ}͛8B5Q8  u !P뎸@@@@@@@@k Z! .N>f͚xrPLױdٲe-}@h1gWv?oР2e {׹ȑ#]V̘1/lS0lboM4ògƘ< \tڷoo ޽i=Fv9 Z/ի}/ aK6yd믿pM.]/ g'On]t-[h گx饗L}=WBӦMkon:+s߬@vZˑ#G8*~.U;) ;׾)O=LE \gϺP-}7eO([Ƶjղ~Ǐ  @4 ڵ}_ -}ד3gNd`XQ@Z%@@@BGɓ.DK%zRUZʕ+g{o`yKu}Μ9z3۷kիg@@N@[/"n+@@@@@@@@@@@kդI3fĖ/_n'|~'W9D#l@IDAT3})a ̜9RJ?//t ;v AOj?Aeo(m…֡C+\0aZ7+^k֬;wZ׮]Vvm:g@j@ Qt̩WXЩusӺ#c     .rJkڴI]ɓ' fժU#L:^lYӧZ ]s]ttYm֬Y~Vk  (@֍&<          V@7˗ڵkgӧOG{#Sɓ[ѢEcǎǨm W_u>|M۳g <@̲enԺbIb@-z?$LjժoƎ~Gֻdɒ6j(hc Jp (mܸ:ud{o$!'ϱBI5gn / raׄ)RzS|V)HMiP7+w7{>m;@v+ hUV>}\Hk˖-ݶk׮cs O?Yݺu]W G\@{/͟?߶ms1=)ο[VJʭ3$H`#G[u|;vPf     iz\rSLíZZha')S͙3֭[gŊ3Ϝ9:  (@V0.Uڄ          .k ֢       k6αmذ;+^8@A(={vꫯLo]#k֬nasi  Z6          @ƌiӦ6j(ۿY:w:~-[l`_: R[_̙3ֲeK<7mdڵm_sjp@|ln}riϿzK~g~z˝;gY *w}.f͚ Hw]+T`3m(Q+,u %K[zUX1j+sK8 6Fi4) ˑ#G\MO`ʔ).vȐ!.aΜ9NSԺ҄ LZ)SH+fUTqkڏ?heʔ VP; Yhۇx S) @0 =zԴ`Z4iӧ;ƍ)     xrÆ 4iҸۇn>wnX u駟֭[t.\lٲ.h+M@@@ @ E5@@@@@@@@@@@ Ӻuk[-ג%Kg^$mٷ~kK,qO%W_ҥK9 80 h1  Z~8           @XLE+b֬Y_ٳ]'6lFYڴiݏ[liǏ7uNAS`AK ZʪV M$KƎk{:X&MŋAҺjFBܶmڴi|YzlAk}&{ٗ_~i;v6m˗}6:,ɛ7 Ky:֭b䧘^ȝ; :s P=TtFۿKlȐ!xv…?͈''O|֌3\ؑ$2;P8ŋM}ڵk|BF._ɓ2ed:u)Sڈ#\֤I~$Ih)F@@@@g}߬k+UdժU5kX -tuѢEK/YݺuMP@@@Wѡ<@@@@@@@@@@@[RJY.]l.`KdWRuYNI:WMd*@( ,Xz)+Q͝;ҥK AVZN(_t) ,Wۖ=ږ-[fYf5up`m2B-ZبQO>ָq ^M8_fΜi/u|(#@鯄׬Y3>jm۶ͅ5k;[uue~ [gС;}^(S{uV|@m c1bf|AS7|5j N*' ÇFy!w,:gp}A     -U}ܿK -_Ó%+V,{w_~9sXɒ%ѣ@k@@@/@%@@@@@@@@@@@ {ョ3>Ȗ.]~:yd"jժY),֦MslܓgG`ƍ3O?mcǎ{'xGKn(SM6ͦLnF@׮]ԑ{˜9넁W,F>k?7ν L0 ߿$I{9q(|i}6D$duEѣʕuǷ9;|.o̙VJ;sLD'7˖-eϞEVx?(} o|2Ѻ߶"EQFyRKm۶֭[_J.m ?7o^?t5]_N'TVZe r۷+VX…##Fp-uzhE{7vgN:erVgrI&+fur[֬Y^ʜQΊ/nM'"sZ7GxW.]jZogiGx5ktZ.]*~QGv &,3g==u1cا~jŋ ,/ TJ P R;c 4_yCf#s_]UH"}Š?hEFƍS>V=;j^\;w_m6mU w9U._tUWO_~3ϸ]²?eʔGuԱ!CIS@Xn;M-[f̘B%ǏoM44iDU     @ ]s;wk?;۽{;_LjqL:;l2ҥÄ@@@Ժ^           @ ΪUg}} J<ɓҨc΃x~( ٳu8۵kWPVۈ}M_%KkٲM ؾL20 o 1sQ}+ĉ|ճf~>PSNLZ-Zpr۳gp΁3tYڴiMa [d רuח[1cF&`ڵk_?-Gn9;x@.HP/_EaF{uGF;x?]@(g\DSHVɒ%M!{#Gtرcۀn O\ٮ];"Eh`ɶyf_2G1BYp͛mCY_#=PM >UӦMs/f_`Oy˚5kc vScVx~o iժB-=$I6Ek:ׯrV55j5j̙}Bz׮]kPR_i"    m[_~ʕ+8;hFG+֕E\nnl۶mG@@Z@@@@@@@@@@@ +`kĉ.,GשSRJ:+V̾H1>}ڴܼy=cObgZ-Z)[f̘­2d zGJ*=Pe\+\yD67P׿ꩧ wRd/ 83"kY(rZo{wy^eH|' 燐<حuG}91y:믻\ԩ]P:dcǎuCGS@@@@@ݝ9s{=_Loc:Oc~ӨTDxͨw1|G{w=-&  G@(1           D تRӖ/_nG)SpիW=aK7nBBAA_;'NTIAs=DŽ <ԩ4y .qUfA}۶mB ۶m)[&Mlٲen^xb{饗\l*n?>˗#F\3?xWh;5L7n}VxqUi]Rn]LBHz႐j֬:ֶ/ggo*(D?#: *ϯ&}_%W\<#GwҤI.pK-Zs6o޼+ ϴ3Yt .z']G3g>lٲܹsm޽.Pȑ#>OTLTm#^}ln3DrkԨ=nzq[OhK.n]8m4ѻwo:Jڷoފjqnu{uۿmܸ|k^:%#e̘ٳq":XzquqvR~_~m?s/ՁZ=\j$ɴn:u)T+L1ʦMi?[ns':ƻzNquc2eʸTRUHuYxS)Mĉܲe! t\F*pX?*<@ O!)RX%L^ǦMW#K     Թ$IZVСC֡C\~`SִjtLD?;Vmu`ZFիW?]Y\9w}׹̙3իչn#գx5Z@@@jZ#          ~.(Q"nݺ 0W;vp 0Q_~ik֬˗/y˨^0 6BX|U+f p?^v#k&ҰaCS2Cǻ_F 矄 ϛFW 4 2Wc=:N2v6mژB ٹڢ[eɒuc;vtO<ʖ-k7oرc;jˢA޾ӎ^ԩSdXF Cg}B\vQ;w}6J]Ձxa}V5:! CݻwiK&I*WI&N:#njcٳgwiiaÆu:] iGyRJ ̇z_5ڷM6i}㋢mY͚5s.\حn?mN2d ={)Nc H;uگͦ{)] Kw$@+̙usxxlɓnU=zϭ[uj2;wnS'ZV.SxQU49>S{H7t'N7fSL" ޠAV[ؤs؏lȐ!R G;$~[J ~>?˯$J)O>I#UTUgur$Ћ}Ud'Hudod7Au'ڕW^鿕;Ⱥ4$z*n?p[՗W]uU4#˖-+V !.Es˝4s6 Eٿ/?Nt٥~]tgY6?i֭[XS2-I(rٟD?E,E6mkFR* G3Qx:*vgjJrㅶ&7oOݤI+5-L2ICfmX  hjㆶ~Ju衇3|xCPW}4)ܟmUl,8@d~?SL睆\nsJ2ey.ٙ0aB*2WT/6Ifz?V@-?4R$[f3+:_fbps=f͚D*SA*n=zv ~*ҾD\<%RAIvyj_~钖͞#J'靂73hР<<O?5 znj|@FJ$ga]t6mGT ʽvR{Yfֳg(:؛g:8^ٓOvcSC~%OCJ ̗;Ŷ3{o;lժU.S 9TR)vrM@dK^jy.?nj^C'~@(.֨RJq-B @ =gj׮]k/ 6,ٙ:˟\r˗/g^{5ԩ}qm}w{[ZwdŊ}],@H-Z~~W:t>蠃>OV,1@ @ G!@ @ @ @GAL{/' @OL2²⋶d;ww}_Ҁ;쳏]p#A$QC R*.b_p7oӹsg/Gq ˖-!g0lР˺V^>JPAPpS~7X>}n0\s)FiHQIX݂V5C-#6w Աxد T̙3}իWQRt7nKt,-q4uײE2{7.SڵMP_UVɓ'gٳg_|Oy}l2Bu>o߾0Mr<n|AEbͥZjtIG%MC%A0)Ր!C<Гő$Rt2eoo1[[ۢ(e]\JE)+&򸙻n}Vx2 q_6Dڙj ]wrIj_}H7rY]F׹YL$@toԩvR} 1>CSpʗ^zt u["*] k @|Ǧ~" @ @A@I>SRXgg>SvFYN8N;4u֭[W:ӂV2yYfd51C{9H?_} 'i1 @ @ bG @ @ @ @@TXFa}u_(Bq @ %дiS۷=ELb-;v,R&M{$=cPty6~-8$J&LQnݺ9>O?ueY. ?]w5|ʕ+mƌ&qt[nqў46l.\X(hF~<~!䷪iu+xC Y/5(/wS~/mLIn6JV`~~5w}篽+Y\@ M[oCjժ{m )A|m̘1Tq%ѣ@(V9SN)Xw@ @@F3mڴ#G['|:ҥK~'xž{9/qA^I, { {ya>}RjU)#΂ @ P *۟ @ @ @ @H:u,NO?4%S @2jw}>^j;}E&Q+p~h]sj G}4`JA~+x JD/?+ еRn*uчz g{*(z2СCB ֵkd.3 ~- 7`/˟$/3hM WUZ*i:, a%w|lĉ>Ȏzג&H˷"TIbܩ4F*D395husؖk~'[Ǭd^iAX8yˡlOa$TT[E%Kd:}tٟƠ̆7+I_( RB@jǪO&MKV[ҵ_Mjou}*n:@@&Ӏm۶.̄:SG@ @6PW^],H7nl{yw.uSO5=W~gE={zEϔ>)N Y?=á4jԨd rz!?{ C@ @ j%.eC @ @ @ 5j԰gy&L/j^ daE!@ @*UK.6p@{wl2X\rSNVZ5o.3mrĿ0|r4i2d=_{7\أ>W_/[,[G2:%"$R@_4B>|xvԪU.϶4w$a.\蟅Q=`^f31߫ڵkZYf?LI$ӧZH"(2 (￙xet'lcʔ)fyW^zvG#<{N3 Gp}ȑ"\PKtLR?Jj󸂎+,f\H(~I'U3+XK/'uy*L2v嗛d *TZJ*y ;JOsgxbذaV`.뮻|QkOlsGR LpΜ9_H-Nsќ֭sj+];ÂT2 붅7|.:nsR[ULK\|vlbƌֻwYZ%9cwIIR0I:{챔JX" JaVi^.(N Z֒%K|gVXa~թS]ճ;t_~;Ӗ.]'돞1r/d-r!@ $=F @ @ @ @L`ԩY}͊gEC?_|1N( @%@4+ `բE([V|VӦM`Y k̙YQ뒳ҬI"YDV<24M7te˖͊VYQڵkgyY.O̊pʌD3Y;̟Ң$Y[ywyH:E}yQPHjճgϬ(X@V$ɞwK#ǏjҤUرcs|I0H$A.ES9 |9Ȋ^Ru} +%}9E$3 (Gs=զM_#IHV$Q(Q#FE~#0QxÆ ޏ~tP=ܓ=K#k=ȊY/ ^NP$+ ,M xcr$ϼb$zFF&_] :묂T)KZ䫯ZJ?o%nd6KQ0HDc=6+uf/Xw{f]p~>y]F"a[v{qY:vf=6zE"ҬիWouGyd|p.]oK(PRA$'_YzI>~EͲ"PV8 >H$I12)  @}жm۬?+\eER4M8^в#9]T/]_%Ly!ϴD^~~ҹs_|zsիWV$!̾Ξ E#jW^IY  j2tЬ /0+ ɳx:Mux$*Q}G P=tOfҤI @ @H3z~Ny睤lKϪg o.gqFV$螡{#^(E#[vE%w}cǎ}/+Z@kjԨ[Q[ #1EA}Pa$kY^Q@`o-mX< |+V،3,m.DrHLd/6m(լY3LHgzjRA%1c;Hc4ĢvI'YKJdtR?n~ OrQn$Hj!% G7| 8׃Hše[(())/;n7ϐ t\dm֡C|~J0*UJr7wxU>K5^$kH[%1G([v) 7`;GH/:N2"5?Zٲee˖ ,%PǕ * P@@P[>[${A:ǒ @ ^@IDAT@\ ƏcMy*UdWa6ۘ#,_ZKH^I,N7]?1sz^wٲeVNQ,Yb:uFf UC @^fcǚp@)QGUH`L@ @ @ @ x \^u 8j(rڰaC;C~: ǻ@ d>sVl}wb{--JQf ̙3ǥj:th.hz{W\"{/iR/KڼtEYϞ=4Y$IK${HkРA+C d9kء{y.?I`ذa.V8C|IX)T%/k޼u$ g m48 E1m4o_vevϯ@B۷I_VQ 1D2S?qLnkQO 뮻j{gO$ҥ)@[Ґ$:^'xN8ᄌXdO]~~+zWx馛ꫯvW^o1$}:'iVȫV-Z8+ȳ/$@K駟~vِ!C\%P @ @&簏:(8qߞ:vyy2{Zd>\XNɚ~̮ŌW^=Y\@ Xߴgǜ @ @ @ @ƍm„ 6rH\KAmlܱcGkԨQ`F@  .4ɵ$QVZul)jŊKR]v _TP!-L:$,/i M˛4~I` Z6ml E~̘1֣G.P+Ҋ2sJ ,Z{GLBN;9kڴiJ4|MRbqMtH&M#<҅kÇ~tW^ux]cqA3k֬#FUT,I-ꪌ7fg0=$/o֬t*SLIUt.u'\"HWfΜ,*gkԦRVgz>@fL>EZZzvYgV[m @ L#aի?; '֫P(w*h|.86>c=kVFtu @@@&C?; @ @ @ @@^ƍgǏ믭[nvaiD3<ӃET I_$^b%n9clΜ96x`;ꨣ _HPaժUmԨQ[\ʕ+f͚[.'(AoK/4Qdt%:ClmߪUSvm؝n^|t=s[nqVϼ꣺mIO_좋.2 Jz9LᇗUNK5^q|VV=v%oo=lٲ82!P* V,I:4TֵHu+aYZBU*Vů:s, @ dovWgq$/6c/ NZ=KkO @#P+>n V @ @ @ @I#vZ8qb@WXa[o5oڵkgm۶5,c=xi%i[!@Jo&mzVjaCYmlo%e&?a/vR:KO2_k-9tlB9II^z%ڵ t\nD. M?pwmcǎ-Zyg9bܹ@ , =zȮ7##a;srR'oDdmN?-MZjsw}F1d  U^F1"%wСvq;rH;KEwmKfԩ)P-[T5ƅ^#K1Rj/5kץ?.b6m]ve |O "_l֬Yی3Z?(2LvqGA;hIմiSE&O Hpy뭷HsvM7Jc.@ @2#ʕ+WP#<{1MV1^{yZLږa;\~X+m7WZWL믿Fe~ָq㴮3@/tiYh)W&YuŊ]تU+￑.`X  @@Vjώ9!@ @ @ @ P/0S\Kyڴib ׎;JAZli͚5 *kY8 @ґ \% :_zuߡCl>Y:uѣm~}tW3\ 't}+10gyr-VJ>󡮃̙c @ͺm)Xsʕ}_!z{vYߒ%K[nvgn[ou~С~IŸt; $/T%oSO=5K,\˖->}ẇܑz5j? 9oJB-H~G*PӿoTl"͛OS$(҉'‹Ee]'?wyǏ5uYO\¿}7Mr1dC)k}U{{")ֵkWc!A'ߔ73gf @҇BB1' @ @ @ @ҒELŧOjƍj]wuYh³>+_|Z @@qP0X4iRh뫯_W`{VrG5Yf>֯_owy|.AXo߾\ìR`f9饗cǎv={jI~y - %oq.يmN[, 6h {w]F$E5k=yWo|sO\twm{jJ2dI6y|E>vI[oMӹ":_w vytr-++$Ѻ˼:e?Ί9ク{Υ{s Kڨ6O?t)[ͯ 5rHP_~ֻwo]gRG@6:<t鉖u5i:wd{e֦E#˥ + P_ܹsm9rgI%)1}ݳsflm)2 ?l̘1Om>m "4X" @ @г?k^QG2N:7e Yf]wBٷ+ҟy ܘT @ Ԋ!ԊsB @ @ @ @ cHW3f@ ,e˖AW H\jՌYO* @ d!z{aĉ.RO>V^m*T2A%)=HrM7?b;8 ORqƹ7ް֭[_oGqDH2$VhK)I~$$[AռysxN?!0g{m.XJH;tP6~0;@0$駟n֭sUwR`~'o/_>*]uU.&oL .BvmO L@mlƖ$[oڈ#\/XŊ !6?B-tBJov]TT)+\ ӽz`?~vI'Ce,IŰE6lz~ֿ8|Fto}ԩU"P$lVmըQB *˗/7]ꘪah$<;ФIS?Ihjۤ ˁ $Fg}ҥKK.?+X֕u @ @ 믿nv0`˪U؅QZ虄_~]GzE==cʱ @ `߸gǜ @ @ @ @x @YfY_~I¥;X+Hv5mve+SL3` @ /0O4mƍ.i߾Vvx|E'd]:{m'R HF7tPI~٥^jߓZ>- O( J4v%N֮]I U˖-='l5R_g /XF2l^"~ԩQN_}MmJMJJf ROU:H"_ *M?nF9rNk۶m%,C cZő$=LǨ=s.W3}?=?<^{5{߷8?g|}Bµ z%֫W/u`>s{;#R:Ǻx饗l̘1oova.+SL)S2V[5y5j 3c okiۭ[7jų{/usJˢ~x<H,oo|;^bvriVgiHζT@@( ~h/_oXrL{ٳh"UUa9 @ p? z)CFIuQG\km-2glرcW_ÇŋX=+-Z:u2ge) @JZoDZcN@ @ @ @ J?} ʥNB .ے\KY‐6lhq @ PZH#Ɋ'|M}]%D[-[e˖4ž'O'x_vvѣ߬Yb_I/-}xlIZ>)?xwyE+-$o%n\޷P?[齣M>qylݺu.:M9 Ίْ)εZТ"!,#/QO7SjPsgQ跡ce5mԳ,3{S{@@n?;~3b=Gݟ8c#5ԇ[L<eL@ d@?YZcN@ @ @ @ @ BU / Cϟ?V\S+Ha[첋˷5j5j*!@ P|7ق-B+F۸I- $jJ4Z~_ W {Itm#ʇrqR ^WV 6ؾkG}wq;4JOC矛a)XNJj׮kBRE@ZO?PSO=$:JMKKEJ UVfРAv{P:5YL o[l]͚5X}衇h$UEb-\$5oc51._|Eg|_}6Kj:smƌdLm,Syod,$!&Nt޾{R&I`̙6zh;v?UU\مֺFi߾mvq?gb,$]|ҤIG5#իgxg]7h u .Mr يvz׬R%sJ"_zts3@ԗ=v[9o9^Ib,]Irg?c d2$V0ds.tW% @ @@qXlY[fW^χ|Ð`uLƍggŽk׮vG$A @OVV @ @ @ @(#i_p)RժU[zqCAP F @@I#wfҒ (=7njժyoYmcRrDA%Ppɓ'JH~C.IIN 2_Ճ+蹲KHVN9t$[nfX!j߯\O6-hk^!%[ |+)4C _^}Ui%,餓N2$KvzGL/]'<.I2)?q$LQ;@ ġͳ$%mĈ.ҽ+%{onڇ֔)S&ϲ0>:6Ι3ǯk( %$-ZoB tJ%V $[nIUZ3=O4tۜ;%a.FԱ?'_nb@X򿒰' lSϲd@SǤ.իW/XaL@ @RD@C'=SKtL/޶>>~ST_kO2يrMI>=wɶf_a @%B7(B1' @ @ @ @ (Z_ø+{H +ؒHAnJ !@JVpi0B={hk֬- *f(m X{Ko1 ڵVZyy睋I]̌+M 34o$aI/rڵG0ƏoQF.֔HC>IL-[nv?ZIqgSO=[nTʒ = {$Lh&#]DtƍJjIkO##H6SӦM]Լysoݦ$J$me\:,_|aːD\!IML Sm"㔮5, h׉rJ$ےm-6 dK-<ߗ25k} 06n;eI%aVj\? @+_E+'6ͺ%y(8jT @ @@нSFϔLg3/_gTVn]_{wجY3Fv5Y3eM>a>/sF۷~bŊ%B @ %P+~gǜ @ @ @ @@$ۊj\/\2& J$R0Tw @2F [*8}שSǃP7[Z'˵xCPnт~UZ˖-] I\rW& %j_ZhQXDK^oѢo)+`ͮ㜲=)M"Ԑ%tYmwe]+}IL:霠0O?Q;ߔw}w?ϥR.! at(԰aNɖd[ѩ'^#!$K&$ ʥ9dnV@(˗/7uMJj/N*UKX( @ @H_$n2nyY ˩ 1c?g+j׮-}> 2e$jRFVV-],XCjs{ .z-[1(>lkݺu +q6e8q{"z%1i" (q&M,QռyLkuS}RC$cӱ!tYjGbuDK%-W{$8JY#I@۬vaF熺uB4RfXbp;?~3k 2Fن qy5ExZmuP4T3?܋LG׀:^Oΐ% Xۚ$̺yS6[W\YhLZ7]3j=uI  dVJQqhu. ГZkEq|qH' ^}u|Q }&1o!Ĩɧ @]7HĽJQ,ɹԩ @ ={ 믷$$ʻS$ )ݛ3j9݇=YhUr݃Ms*Agq/u=U=ggBWMʕB @GV V @ @ @ @ lN\Jr$VkB6 V5aBM` @iL@$ 3b%[z\I/_^QD6QtfHN*]}/ǬOϧ ,V¬cEVz>wR תRKr^0+07nj\Y˖"dKM |^Nl h}`uc|%Vm͜9*H-IhK2DH_Go\KCڵ}֭["UU@.>0`}z/M.yœO>io|H:n:0au]k0<<.)T1A<,իWwC彭 *Se $EQzBuFP@YmGiѢ!sdz{6?UQW\q"O))HNtaNA%!"%ܹs]5x`Xֽ{w?v%b'Ku'T_ӂJC:W[!]NׄʹU u{\~=bs/*?Vƃ8KmȺT]H# _YnV,[(^o'n$tX5A;qjg) IbeqA>Ұǰ P{\~}u>-[G'$@ @ PRСf]g~̮ʢ{.oE΄wylXb3k0~k=V=?{sy%=ǩgoKCc38zO1zH @@'P+mP+~v @ @ @ @  zyFAiCpء^Yx!*+8AaHJ@ B@c[n Z{キ 4TCfZ b֤IO%RPu-~l ׋A~^PY؃\+VX)WsUV͔K H,m԰a=?ˬtx^ѣGo?]СwmB  *?Xdee٘1clРA믻t޽eR@ |~hȑ~ (yK;wKbb> ଑$93mƌ?[mMn"qY˖9%[Qܿd22?݋=[ (+v\pPI]0+v"S @(>G0? , Y:Xǎ]զM'ߦb @ fW]efg6pY[%]8T @HZE?; @ @ @ @ -^إ[ fT+ƍ^ ܒlKꅜ*{F @ LWΖkɖ+`q͚5"ْ$W~-=YɤOHET\K-Q_e##\f\+ڪUV*@II'!?k,ڶgvኂɇ+Z2)K~Ac=f{4 h;ooI&A*8oӦM>KrVZ޻W(OTC+VF硵k]-9:6OTYWI02E):jժHtvGZʕ^sw db!;XϞ=]xVd5)~:6EZƍ X~"r_o_2sB Y䙋t6, hel \9~M-GȴKj~!NJ$еR ea5  K@}_'|}_ N}ȓ| @ d$c7>#̮l=2rU2wQs@ ;Zo!ZcN@ @ @ @ @& p˖-` (d[a\SrrH 1DU ͛g;:(tHj긢O1Cǝ fו%Zr ]Uױi]w}m۶=ڜ]M^WM/|ɶ>jjJ~b8,4f̘(`ԡ]I~{$vI]L$rH֯_?pwڹ[|%ǰa\%e>} ^5b'݂d+rbzn%F֜W$aJW0KY C' ۆ(pE RK@}[P_G5gWg-\-aW$  @ fQw]}믛uIu%B-Y@ ZoZcN@ @ @ @ @N`Ŋ.ޒt+6+P]_Ag6$r իYB @@Y! ҅ӧۚ5kLA5kr- F*;E~^I4{ Sd# Q$yA?4GDdKC]cJ>I$R!K$q C|ye 4/_ZA%VaCM _Ӈa>S9/IɆfϞm)KBW_]+ico'1/m, HJO4ɖky@IDAT>M65*IʦUᄏV.A)9zh{w](Y#Kv'yg<|. 1Xn]x2iRSy'gm֥K:iF$9u"ي|fnmVM$"4+0KXQY%s_b @DH~ϭ>SR^V^QTuVbE? @ @=dv5f/~ 7uV *y۔5 @@@@?; @ @ @ @ "+^ - Ct+K믿f,+rmmnN:Vl @@, 0\tOA 5ƌWX$DIu-Xқ/GTӕj׮- -VfL.%Vk껐,6KCPg뭷vIUnV^+pKl{VZ¡˗Pؼl2^_գZjVjURʕ+hRJ9K b0TBt,Y$PYu 9/M4;Ը==C|< y.0(?0ǮK]F+,Ʊ6 Yk)@w .㻤l-EK&>ckEkJq12e >^x5m<~U^=eU}G@RxkacI'do=v'fvM {ٹR4|\=l0i7tMد_?۷ߣ(xIL %M$38HdIb7QY|1[mU>jַzn5ě q0+=6  $ڵkMeӧO~k/IPGhP]7ʇ @ @H@N͢Gm@=,z'fuFeFL@ GV|4B1' @ @ @ @ G@c[駟]|kժA-%ʝ% )@  @"i,4?2$= 0R_(PE!CڷgA! Q7YfH-[VںukfL TI70r7r>~{ 凡iuיe-ϛS G!@ jſ}jώ9!@ @ @ @ ZK֒%KLY¸ &`6!)֭[7[ݶnfc@ PJR ښ9sIdV\%ɖ IMQ.졇N;*W4b H"Hnʕ+}]v-7ܠA"@@"- b\a\'|҆2c=֥X{ ˚_5~zL߅r vA=U, q_R%\sݜ0.i;3fw}׾"U<:u(">շ~ۃ}hF&*v-;eP&馛w}HT {Q֧O?f,%K.o"9Vdiי<Ø?k-y~>9Bc=@ @ 32#>Bl@ @ @ @ @H@ɵ`+ O` [ FK @(/_<(KdSEJl)+~f+a)I9Tj<5-^޸q~T =Yɢ\KrjR谄eֽ'|boh͞=/kݻwnݺYNT+ TQp/YAuK%r 9Mb5n8ko /0WE"gqL:,1cOչI(-^լY֩SիYH+A[1q}g'L`<}vxZ~`ɗBD/JJJF ?|gŽ%:0ԕ*ÒfDTR>Jê#LaJ+Wlj'UA})LGϱ@ Sj&IBָe*T[ hѢh$@ @ #gv]ޛ0*C*V̽}-!*J @ EV?/Z9gǚ @ @ @ @ P@nݚ" x寿*pJ\Lo@B "A@Ҋ/2hKׯ6֬]mq"qn$JTJ4*kEE[UKs h|饗ѣMxsl//uޛ7ob6}7_Syڵ~ ޤzpժU>TIq# 6L)5\70}F'ON:l]tJ?qرܫW/4h#W%v%-\LBb ˊ 4_IuzD" WRbEI:zrU}ܹ;KRtWul9cSϚ OjӪ= Q… }ְdZorʾYf^%qvWf @ @@p&v̽dvfU.Ćj @@$P+BcM@ @ @ @ @(on?6T ZB(ȭVeq)oaF\>*   &GQmqNRۉ ~jժY֭}nӦ)h*U'F!]#*Qі[p)kVR4^b])kC^&3`_w5N=T#~m4i}^.%DM ֫WJ.EM0IؤRb'& %RV4ߥR| dX)]?sO>f͚{.NpԵkWܹeU%|~v~߿{.TU,O6oGG%ɨ֮](^V$/aׯ+T]-χWZeg6$=R۶m}l[n#Focƌ񲫬ܹs[n^L裏M.,&Է(u58*G\`+Z~{I$A>)Y!ަAqJ֭r>TJB'MuN#2&;tի 431;mVJA%DZJd!'$$pC&d5}ܽRjɖ$k'R "B@;|Ϻװ%KڜJ|FҬMR9H<& @ @(ZqfÇos랝̷Sg[ A"/ @%BrΎ5!@ @ @ @ @زeKd+ȶ~PTjU/ J+SLtu!@2!fgeb[vO_o֋`K-ܱc $P7o"ؒdKvڙ !&%W}ְ"JV(TR}E̙3mȐ!>\`Æ #@r.|Gzww?KH%V[bh駟,6Khm۶CRl bLAҤy WIҷSzoIfDYzu5Mfv$&&{̎SY˖-Yf6i$0Ex7[S.ikΝM`A$֊+< 3e՗*rʕ+Z:G}%VS)ɚc %f񈾟A*& ,Y箤g|젃*4ǟxviDZIIIְaC/;wc6($$ҵPDK K 6>I$¬P."1…%[ h1WOl9Dzge@@Q#i&[xfi8H$I4M4,B=J @ @pK/p>-![U>=ڶm[x BBAp @(jCEsv @ @ @ @ @.z_lVr͚5kG F`ѬE׬Yʕ+ca@ P\8v  잧 /VnNIdAu^Ub!<&믿ȵ$ڒdKr 7ʗ/(mڴ-,2 HM@{յm֭vWСC(# $zI;zyZڵw=& |䅺hʕ)9HTj^nI8"!SD}SIM\O?_vI'ٹkvX]I&ܹs:ehw>QvJN;铲s&!NE%I#!UC)k*տ)9WHרQ^g#>*UYZJx*d!UkwRǧ/3[h{gI F:Ey~ [z3dɒF?,%͊fuQVZ,KuVguD(@8ϒ{椉f#t"E[*  Pl G;An Imgɳ9{ò @ @o f^su]kl̘{;ݻw/^G .ԩSsx$ @(njEsv @ @ @ @ @3 HnݺTA`c†P]­2 K @Ewm}}K qZy9/'DTa $P0y 4 $TKr-Ih~swɵ$Ce@lذau]v}y%\b]tU2gw2e{?-[x)wҥI$3*H;/. >-J[CٴiSk֬!7gҥ/zĨ+^t,e?FmR+ȑ# /$ J>:eymo„ ^%SqK8C>gRʪKJ +>L[} 83(+!! 溰-\ӵj̘1'))s!YQDK1AR }z|;^h4K@R'kvA5ܺ@=Ԯ];QB!ȶTj)XD -[Y{+r3 (T$y r ڒFgW" ͛[ٲe 9p0/5jkIrg_:¶̙cӦM3gڦM~ֵkW/\֭/lǞ# gPo/^R+$':{'JU?+I˓O>iϺF}_:륗^5l01bzv׆)om={ 4Je|~vۛoi)`ؾ}kIJ;K*Eeg\R%/Xh=㏛wɮ:ѣYȒD@!!zEJH+qDgiXҬ *ѲD=6󒭹swʶ\k{>SնA7)Lg@@I"zjABHHpߣR,ID&A @ ~,Қ20&Nh}?C!g5ZΑ-@ @i J$SjeA @ @ @ @qrh+aMSplI2-ҭ RoXH @ ^5~СfwiN`^`ѥK{g쬳fk{ `O?SZVT C@2 -?o޼ʔ)c͚5< ڒ\B@} cǎ5I$bرN;4ZjٳCh~XuZΝYIY# WpB_j믿]ɕ6m,YYځ}㎳oڵk /nɮTuN\#V+_|sJnko9/jLoKN4 FFmC aÆlbȑc?WZdjƍ PBG9 {e~]wuVzu:uUT?V=,y,Ķm֩Sǚ4i&7n&NZq3YުUdK-4 A`^%QdY+L} J٪_QQְY*x|ڜ @ @_}ev f/lv"=vK?p+i\#P+=*L @rBSDsv @ @ @ @ @@&6nhaYqEK(Ѥ@鉷$ۊ-[6 !@(In5Yfj:Yf%[ε龻}u/䵍59}lڴi&Qu$͛M9[%R,ѬnJ`pi{M=SW`-^Z%ٖ{f6:ȜTvgc @شim~_5l$s+*ҰY*ce @ @@<+V$˳+olps%$?{wW!eBqb)@ @ jeYXV A @ @ @ @ @@$ J[*|+ ғpI2[QVptrE @(M@f*)X曩-]4hK-Wr>3Zh%ڒ, _$/RV(KkhI&^UG!kݗXC!?].XKr_PpZJrxlՁʒN> 9zٲe{%mOR՗-[:?%_Fg{gn4hzsΝL2~{C=^^@$!:v7|v; C zEZIII}0p@߿խ[7 u ~1xt͔(Km Ұj.]c YKQezq"6wZ\2 ݭHɖɑ @(a~TVBRQmʄiVtX}-J@ @ g[o5{s˘pٹ{o,햶mfz͚5W]) ԊG @@srΎ5!@ @ @ @ @(SR %JÒvm߾=+ȶ[rT^:SQd 5A^z˒-v+_`]£KH"іX(yȒH.`A[*U.S |%J_?Px^"ubgyA@R,ŋM%E &6)0uYwSP|y+bӸU\b$AC)i$IңW2g{|7ov)X߾}#ߙ)SxQ֦MT}'ֳgO;mذaO?m_|.껋 }gI裏z r =z{9r]} /x1\QEmi8qM JA9B{橬Xb% @pw34)NG}dv= BLuwx9Il@H@AnIBB ֭[ */lݺu^ҸqcJ4,q ŅWr?#E%DZfI~{]-RJG.P &̰aÆ֯_?׿e*U2|K26}t)!ZJF/nKrN@CJH+))]被֭wC/~v=K̈B1*uQ,CQL ,94 8g+lst0S Rm[ PT .?-_gI4gmܸ1$r4~&#JA @ @@>ذA{L6B3K:gܺ^uٳg23}T@ @` 9CZ9gǚ @ @ @ @ @ SjVV_~7/n\f͚[5~II Q۶ fv]f'`. 0Q.{mN 15C*h[*CQ $,]ңYI@$[Qі0VM6D[V(ϋ=CƎkO>I*ӧO/k6 4pB;2mp$r#A ,ZKW^6h ѣGӧ[m^ }6rʕ$Ί-M(ɄD$@ L6o^jɖwuBZtNі#% bI@ ˊ-?{۷{SXOڵk, @ @ <w.3R*U2?GyĆ oׯ_+Dj @@.@srΎ5!@ @ @ @ @@رc[.C[tRÛ6mJsH Hu3J.ABSBqL@D߶PGÖ-[P +깎;Zҥ}8W>;9/Y$EZ_Y?G,gÇ.  \x6wnh̵ ]lU'PXgwG{?I(Sꋖ,+Aq=CI׷ Rͺ/ࢄ @ @(n5{1[n1szСfW]e~ΑwQO`{1*UGsذD/?Om曦 J_X+*jܸ:Pٳm֬Y:vj)y`f9s&J%)({g1‹ oFTKV{lamek, D@2}߶nɮ>G.|o׮] é$珺رc&O쿛g}M6-K=XS}?YY] }WbyR,ɑOSkvgI~RJ /ʔ1vK睗KͳŋSK\MwbbݭVԵkW2eO(X״aS$[mio7!!!hK- %?zBTEbW*UxVT%B `oW]u%%%W\az) ʡHĨ[n&$j_UT$*;cر_~>P7o5jd~HKL?ThDAsk[y@Z/hIi&!CbI&])[lD/R԰aC8p֭_lܸ%iT+cE=YѼrJjqZ--B E8H@ w8&}5}RAIsgEy+>(]y|D@ @Dp 0:\ۭDy X @ @ @ @ /+V4e-NR`+VƿK\߼ys(hZzҭilD i`1@1%;f睗,r+;Ȭ7l})yIaLY%o(m۶l|`=hڵk{`M6YHEr@zLY$7o^hK1cx醮<!-NI+HD@IDAT9iiZ9Fōj[)?Ǧ\D~n֔Yj IOxe%液?v8餓RF3{1h\B=rEDKA~wիMϽsϵ={[TĪy>G˗H$ꫯW^񟉖`'*8X4@C>-ꚷd-A$]tUR@ R%[z(] Ds{\=\wW=rb"ԪUTZh_usDfذaJ}sC9d 7?-[4ɀu@ gt{®]ډ'h۷o!g̋nRߦ;̷{5{r# B@.du+E1dK=\\Y۶9Hܵ<%Z*^;/l!>ƌt[oWbԿخ];}}yɭ[v.r:u_G"E6U/L43K)mASbS}:caV(!@ @  =l  @ @ @ @ @ _YAղ8P~-h+*ҰǢa. ~M QVt8* dX`5kY{)3pA}Rɳ$[R[?s$5$%QPUd>DN`%&&fAl#~ITixժU~? fIE~mʔ) i)z>$Z>|~$oW^>Z9@ݻw+Ҏ=X1JR(NJ$hS"P*0>!Vfw/8 jҤϺ$ZAw3H mIN(=Iا:H_g=3`J{]$ҹ*^hbE(% Ń>릛n2 -- ׻<ri;?T̘1?p-Bvo~f'AP裏TLټy~ɲ-x4c0'7wmJn7' k2>3]#<76ڵk};P- .W^֫S"gJ8}@ \ 6W\ᷧ !gF}FF@ˑ>=OU$6y+0m4ըQ?=nѬ $@ @ @ sT/Қ6\_[PK}~.og=~}V/k^ٲem۶mֱcǔwe._x;#Mªw}C3#0`@}؃ YgeG}owP+~vyGf;<>6@ @@U @ @ @ @ @E~YNsĒi)qlE\ V]niv%X6 j>ݱoRK&N4\fNv,r^hsv1jGqUT/^C6^;/^>x '^[om)rNXI3?O/3cY ۥJ&IVzY\fM~ݫ15iXB6% @ @ #XNGg}݊V?o4~A}7Rֻ/PJpVaYfn+w%~nɞ{9ޱRq @ @p}s( @ @ @ @ @ ! *rqhVQAYr+qiN׏AcKxA p7-:@YXv$fӧu^DTFI D3rr!>`)S\oLA?A뭂 t/&|P;pf͚ej)nŮO;4:uI%Y+"\.,,N ՛ ,\B2Km-\V n6VTdr̆dFYCҽZA>h[l-ZpK$Tq9j.5HZ4͛G'ۈ#heO?uZ(+f&Q C (ؽW䄀OuT\nU"$kذIvk(I"I$ ir)^!VVN:9.j)?#pL'd)jϩ@ yV0 Ps3wsm{M|Wȵ$RΣ01=P|cfBh(eևAv`*SX}ꩧPKe g1~Ќͼ\;Hj;sʮ],=$A @ @G@Ç=Yfn֫WG}J9lA3P3_#O4ɏg7ڇGWꘟ|I/WzB83g2y$3SZvm^lmB @@ 4V @ @ @ @ @@FcOW#;I׭[+V%HtƍJ? ҭ:v@ \W2;0'tҵLȗ-[fǏKWnڵk3 ׊++XIwezWK/EXQo %-={/y^r>49K¢'e=>Z! ViӦO<#CJA2 Bf)~ .)rH.~7*zÙ׬Y$ȵ<@?{aY)u 0`~v}DJYgfͼ% @ @ P,_nvM_P˽.8k/3ÒgR]#ߕ3:.R{gsuiR? @ @@Ul>JN @ @ @ @ @8P5jQĨ`KE'ұH+d\y:|X(nv悊& 8GٲeM9ss=g7x1д *f'ʞ_|K&Ld?QFymGnO~޽{{ɖ{챙m\;4{vGV\tlW]u (" c'';ǮjZU]v>ǮE{P&&&ڷ~k[n+ETs2ʗ/I!LHLӪU+훲SQ?]u*VT%IUnJcƌ. {qsFiȐ!&Q[oesLʢ ޠA0&L={Ǘ_~i^{H- (T7R}(e'AKDgh޼y/w֊Mt(w(($!X^s%Kd_٣.Ѳ&g_$R}?Mgs4 Ey\ݔÑ[S%+3dVll=V1J~gcD!j;/lD2]ٳ_{\D;Lm+{챰1Jqw\fH)wTp-Fx9@ @ yUB|s`L6e:7*[I'O=TܹM2;0?=/we{|Əߓջ'N#Gr?@ @(62N9MN @ @ @ @ @ş+rvSqE%[\x^h_`0$ӪVZ*!WToX+SLts CE. .?f;9YHNDAd h~OWJ+VH)mcۙ9s__~ҥK}G"-KBD $.y饗Lۏ 꺩|r_ꏂ>sO}۶mVV-[onW`~Hh߾}6;u\ge}IAT?(GTQFV\&2!PEQ 7mA%AՓO>i\5u8<*=M>Ed?_'=lL'Ӑ LKu%zw\WRJ~5O$MT:AAdu]Xfے宻2It礓NϝrP>Unwp{bM$;vޫW/h?ڗѤzE}jͨqI;upgqFtq?glܸq>F=wJ?h 7Zzۃ +Ru; !AK}0@ @ @œڵfwܑW^3nr|;8֭{]oѺtk֬EО{weôЗj<+}ak /`Æ :g?R?_? @ P"~%9I@ @ @ @ @ @ H&A-tKӢa\Ӵ~lL ȵet8HBU\9vsCL͉@̜ 5vc_X[]4]ɥ$g}lҤI.`}^c;Cl^5f &Nh|ܥ SO=#)]JO<z4BU\s XIUCE{%K,uYoxQg z{i2[ڨQB aӔ/^˶,Y5WI]}_ RdCp]/&Tmi8,VTE_fz-_͘1KT)]z6rHxgKAj,=\_{5_7Iu '0ZorGIy]b ~gG2l[ڞ.s}5~gM1 7l%-첤A@F'%%6%7gmM>K%W@9I@KIկkvb>Kdܮ];^i1@Lk-ɶ$ݒ|KK%jVRҭ%?U,ELv0'cT@x}x2O k4KM9)p"Cиq|]~Ő/_%/gSc>F:/^?hvQ+%7㕚EةRJ(KkQqV&5  @ @(\{M˛]{`3 v{y7ٵkWꫯl„ ֬Y3weo&1bEuN 2nC#ܹsu򮬞=_#wt:ۿoޅ }… ;z/wnl @(~ŬV-S\ E!@ @ @ @ @ '`QVfa?3.]ڢ ӢeC4f %bNdV9gi  D zm6l֭[GWTPe˖YDU0UIL|Tf'Z&UfS ݬ$ɗʻ z-[66nᆭK`ӦM hzjbId[AF; }_#JTl߾*VhZJ%Jݫwd[mޠAe{<+y =K. ^UǓ7!h;{e =zdIҘWt$ݻVI.ɦHxngڄ$@(\3ljSK=sܬIdVlIU_u9']ËST{U}IժU [fqWA<g(hQAVp>'R\Q9VdEiXeI @ @7Nsܘ]ydRf+[cק/2sZ6m[.g+W8BPb@ @ 'jZ:rΎ5!@ @ @ @ @ &e˖te\Qoy Ğ(f&JOĥuVm O@Q%~o`?n6`٨Q悒:u2BfϞDhבBN@,YbQVW a%ɴ,*ْhK5M rx(p|D[nH-ߒQYjT֯_P;Ns̱g}fmem +HLL"$/A>Y $zꩧ+)"}GZVY!F}L@UwNL RYN yI&dX]ִ|HKKüZjyYfX @ @@v 6z٭+#[L?MBc͞ @ P '^:竲& @ @ @ @ @ %P\9SD&c$!etXB.Ke5Oy~%$\T+pKCNOE`gif/lv≹w補O?5I $"ARo'PD[A{$RJ>e[Iƍ[Ŋ;B&P|yk׮ae+~^矛[,[/RfVm5k֌*@ 'pews^^_h Ǝkt&Ol=zpb&M .n'Ӓcƌ)YBm۶EIN/knѢ2e 1F̔ٹ~J-zqsjE[x9=?+* R۷lPBx=ۑ K$:tADY<;I @ @ G}Sf7l`]s^{c6;x`2e}ȴb0 @ @%n=S!@ @ @ @ @ 䜀2VT)dNo-[\ eT+Aʄ<&cwf;V^T6m؟{-[R`&M3㔲C@RIT"F'Dխ[7EmI${.+8$y׋9rr(HC3g>K@mD/JJJX}Ua:3Vt钮0K/_nӧOiӦr…~e˖^uGAKև b@~bp*yv 7(_~Tbi8:.I֭[SI\t ȊN׳U @ @ $sG}6馛{E\R\[/"]͛7fʖ-k `A@ @V-SYbN<NV.@d @ @ @ @ @K@ ܊o鉸4M bS2evIUBM28f66K/5591o<,1c9*WB-THlK"QF*ٖ$[AUK"AX`M2 VZ1ߤDS4?,SZ5̣iӦ֨Q#/c) SO'Z>}L׌=3&!>mpI d=zw=?%KRVXa_}wXչ|Iz Ilqp^v lܸqߧםY͚uJߙ`76k\+gְ,wcһv|yvƍ/(g aX?ׯ_'$ɪYf$KR Ɗr^)}@ @ @hoW^1s!߇*!!co: R\zܽ{wuGÇgIpB @ Z?V|6́ @ @ @ @ @ Ph lڴ)EpGe]2oߞr!K++UfL(l3g5kӦx'g@@L:VK)+I&VƍM-ax}1!$ D뱢$K/v%S !R=E.8N$HLLN8XSq? HKr)mֿ[nq?Bu~곘;wM>3fؚ5k=i#C=Ԑ PͶl27իSVT'>ۼ9KmkdZ .fotY۶+-[Qmh;z4HuTjJXHsd @ @@<=4;n2k4=7:uuܹG@ yr"9;ք @ @ @ @ @ Pd lܸ1]![Rx/KlRD[QWFUVv-v"6]x3$we.xy!:@UX"l+$RTT)T+*يn A*ϨhKٿK[x\N?8/jll)+x9 ($ݻzEJQ/ZKƎ˽zAY=lw/! 4% 5kI%G}d:Ohu= @E`)hKm޷ST'J;\?wCx34Iv\ҥ?dX,G~EI&%ƊeE{I_|G @ @ ΕEZ3g7WtH0Z| @ "P+djkB @ @ @ @ @($} WƷlْKnIhXʔ)fL.ufO>ivq]]Il~Ozқ*wDĂQFRDcQcQcDcC,hbYgtC:H M.{Wx 3;;;ew;swVn5ir\ ʂ l̙6k,7ִ6l A[[&%,Bo>B-^ o:&?~ JOOf͚و#lС֠A-GY@A!_U|~c-Zc= ! ڧX|)`s.AR۲eU[fU>z֡`uVd]]vE6\r>ð4Ok֬y.     L cN29ҬW3Z|@@@J^@x&           @*4C4A[M۲eKWVZP4~_z-35fiկ_Evȍݻ]!D[{\A ռys1FSWH8h+##?g9#t}I`J>h^$oFZw}=ƎCliii6` ޿*³|… w.]\xR$ @TM5u̦!(ş6 ()ظqc`pHXiBX|ySխ[ n\fM6}zf߫پ}1ͬ{6m,8< @@@@@fj}#G F 9gvc  ZSD@@@@@@@@@@([n5n% mwU$܇p`8Ѵ+W.rgh96Kf:Z PtR[dIdP𖿭e5}W*((÷4O)`@iP1w9sf͚˗/wGydTVMA4(\DmڴiӬGb,=@FP%m6vXjp40`Y~z]³yWV#Y BAۓ<3Dȥ JY*|Jt[c{,]} VpHcڵ /wm7۽۬F l)lcG#     PK;^x,43uYfas!@V.x  $%@VRlIj%o3@@@@@@@@@@@ʰ={"a\>dK OV%Ԙj-pņptz1KMwffvUfcVr#@wƒ![>lKA\ RT5k|Ȗ-!P6mb Rؖ*ڵ+ml;w ҥ(&lE-M0!(TƏݾ#lС֠AB qTP4(HK>1H8co߾nܺu!®zbŎ׭[oÆ Y;H@|(UN+_|lY_"ؽsCf6۾=68 +!8Us|    tUF43Ƃsffvf4r%@Vx  $!@Vh           K`۶m.+m߾}Y֡B .Çq|Pqp!AC'gY43@Pի] o㏑ /TV*MC (SZA[7nt]v R0 P(Ýwi_~y 9 (i6vXw<5x`KKKEҨ#`oqY Ϛ4i)ZjvG,hwJl@(` NJ7O+c},۩%? gϏ r ڷ?- W     @ (=}fbvf%4$@Vx0  A@<`<@n"           PRTLv˖-ԥ燋mTRPpV@R_c@ %&|K֬YN<]V-}(-+VApŋ}֏<ȨN:h -pwĉHŊmѢEV~}kڴiP4Ĉ֫Wp+O;w &ؓO>i@:4heL+WF³5c ۳g5jh)|Qc @P͛#YP,?;V_dDW0j׮MXf04ܱ0ΦO7x:rZ<ս{tGFC@@@@J@5m<`6jYf7dfVrV*_"k./{Ё~aEkbTAQFl+w-̴n,(z`~,@@@@/eͮ4V-f eKK.x-߷ouŝWO#  9 P Jl=           j1c̮,ð_4k.ݻwϹ Jҵ%t,+PbE;-^Vy[zuZe@(˖-l-?բE լY3 ~,X (e֬YnZ}FA5vkiPƭ[w8%=V(;qaƉŠhn0?Ν;m.H+==>܆ f 4 f [΅giӦZjY޽#Z={4C@Jx僰8^H[Fmt L>ˇ`ƕ+WZ7RS h~ւZ>lM¦涰V     Pt ǂf\9HJ߷Ae\]q}GC@@ P+Iij%o3@@@@@@@@@@@HI jHj*:bĉf]wUʕL@/bZNl;蠃r J4O4@ ;x[K,q\ n)"MF5lEC$賭pȖTĿFSrGDmvjJ¦YwO{IqYg~8 BƎ|liii6`~'0e9s-Z;t³dr$dd1d JڴiSp,qlx͛]pzb`,?,;CHB!Kеә͘q lʹ[ /ٺw?ձYFC@@@@ M`n69҂~r+0_j.deD@t蜈Χ$j:rJu|4@@@ Y#P+y9           @ ̚evfSZP$7 ~ِ!C= 'd}LI~OQCpx<߭* qATHXC8xOǎU8v^ʕ,Y PVvi˗/7k?O8wP qƑ&M)eS2s6wܨٳg0׶m[;#4hP27F $0a„lòO Ch1?~ JOOwÇaÆ1XwSI&ɓxjp@uVw<ҳgHV޽L0@(qHxX ӊ YfP0v$ +* [\^c B:C:|usYQ![]j"`c@@@@@5.5;bX^ \$=Skk_|Ex6   @3Y ?           X2 r)l .0{kM7=9=a r÷6ol+v\R@͛uյZ4B@@@@2.*ƙzYp Ԇ ɜ.!P_}/ru#F{?3@@@ [#P+ s@@@@@@@@@@@(͂ꮽم}}xbG,2P"7 * \c/k* ؊77/jժ[4@ ֯_%pky*[͚5]؊7j*Tbظqc$\m *޽۪Tb;wBCta[]j]tqŶ¼09{oݗۼy Rpk8+m۶E-\G:R|8Vv+Vn P.yja[Mdǿ     Pv>-8Gjvfweֹs~xn{mݑQ]x"@@@ P+Y93           "L5#-KʕͮtVk>x+X}(W1pb*U\ ?&<_ !@ (e͚5 ĵ~ȊTT·Uy<>>\Kc g[>`ˏ8Cca+,?V@jղ;wFҾwa7tSd^Y]Vzz5k̆nÆ  5NSh֔)Sxz2c},?I$6ʴ-[̇bŎ煃Ppt,[ǰZȂc::ulu9ݺuP\AB@@@@T O?58lHJ5cʒٳݵFm.tJKvg3  $%@VRlIj%o3@@@@@@@@@@@H >lϞsA,<^ { (t+pWnA VC< ֊ p=f͚V|oD YbE$tKc|ShL8`+6QFVbEp~_T&5w\J^ yk׮nA[(L:&Nh 7MI,k-##Åh;K`le*d֭6m4CV^_8HxBڶmGQf+?by]vE(CuXڟ cߧ`@pHEl͟trf>`KςZ    7Xp<3+՚1#z3;{lv> WM6pȋT\ٝ54@@@ j%/HVv<@@@@@@@@@@@bxI.P_POXM~嗨pzHRmo{\aQ/B [[?޽=YE?p"Ӹq Ű_(h~P}֬YQA[֭sSVZ` 6ω+kowQ-3:~xn֬1†j/Mylʔ)nP԰aجW$@먣rᲥ݄C!}M6°r:WU8O'8_4(A_| dKEv̱ 8٬J 4*dK5    E/wf}\u[&L0 Nȑfd}s(jov۞={kg}E  Rc Jގg"           PAm˛5jd5jdPDlݺ5aڼys$x ڷo_mV0WlVۉBc+VwD ֚5k|ʕ+|ݯ`5WJ-WIyȇի#![3gt ,p5.]X׮]ݠ#UV+Բ*}ڵ}=sd)GcǺ}[ZZZPm@@QXxԩn?Tݻw R (n*$7c[j\0V8+Q 'P7V @PTtWZӧg: CC;Y3r?    G`"޽6m?f\b:u2.L!PVZEVwޱSO=5r @@@ ?j%GVv<@@@@@@@@@@@bؽ쨣2 hvMD/7{}=-[Ds2'*U$ )ˇri(m Zjxc;i~ lHnUTQ=,m63gN$hk֬Y6{lo>wm۶ BL g@NgqM8*Wl6l0vƦPǻ tk֬1†K6ر#q Кsa[ noWV$?ʾpH̙3ݴ>sjw[-o)xW ./^x?;e{]uU=Ǝliii6`x$8 )M)SԩSX{:ACϞ=#Y> ȫkt\M6) +R:..+} A7BP4sPݴ9ݦ`mnuh6hgy{,@@@@PA>}̖-;UU/6;p[o52Ă)RtCX-QF%.2{'1A@@ L@) Jގg"          B86l`ׯ2P֭[m˖-YWAb=?Ѡ*TUR\SF,к *jSt͂zˑ"AMwWN?=3DUC@ sH p@/޾}{ܭpWN\z.3P-T8A|?HD>MkP蜀?k\I6mꮁQEatgaZ_3ôU!|3T uc~CGpߡ' Տ[~Cߟ/ jյ"~ڏЏokr>D @@JZɿWj%o3@@@@@@@@@@@Q@H*4 ?*<ıCqEhv jPهcOZ n.G*b /|d7v4>fvi ,FаgdhxX^" PC|VVxMߓ>`+$222\رc>--- c pR嶎ž[5uT71߶m6-*zEC/>K /|ئr_2/c6pm@T7I R`u]ZYCj:XP4z(@G,8ȼ_i{A/[8WW(:m;+HgƮ΁UX<+?|ر?_c1?hbi{nxZy}Qرt^(v mfWUO[|l?:^h    Pt'>2̛7-Z]׀x?G}VP߃V?h֭sqj9í}AVw>Z;u}uJfY}jiM}cjqff Pߖy;]k5p?/XL5ņJ/cw`nk }?ws3Դ 55\Gر7`}ky5}?W!  @ 5ZL@@@@@@@@@@@B  ?D MʼnnçTt@Cݺu]xN:SQZ7PTt_5{9 H|5m:zXk{bmڴqE[h0F+B 9oc4KTC)|u[~whȏ -iaڵ9W~F8dK a\kD-p-5,]Va,*^jSq#g}矻[ԪU+d0+~u8Pz'/_ܖ,Yb 3g)K~?Uԩ[Pc;o.tInϣq„ OZzz >| 64hBVs΍ vj~gϞnPxBTH%W@c N@,^@*6 [eoWd`>/71#(KZlGRؖnPٗ_=̂Zf {~ԟA@q܄X6_ yϧA5 -+REi>H8\tXvx_&^?tN̟X}S:QXtxi@@@@ :;eʔ0#HR8zZlε*Īm۶5Mu5yܿjΏT~VXVԧuyQ?:rn-8nA(y4m׸8Qk܄B5ڇئ~(g>'jo* H2q/^a?_ϕf^w-+k]^};s\m-@@"@V^KV@@@@@@@@@@@I`͚56=L*" FШ*4"ܹ~ >92?XWRAO'K'C TWE4-ۏMy*)|m\ě7/T(oW,kl mMd?pR!ZBN-w׵kW7[֭[?z}]S's1.JAUVTi ^ďU.,!muE}}tVph YkYFFfV<)=F 1-4S[kPd'zX}ES.×Lߍz*?R_;i:N7,Vƍsp~KjL#  %s'G}d˖-s}%FS5$k.Ot QRΟ|ns?cyw sbֿY@F+B.% PcG>Ck+K~C8Vol/9|~4;s{}_料Cߗua5@@8 @NW1           om۶?Wx |VUls֩S'J P \+;.j4*2⋎/hSt}~T^׾[8hKOj Z Ҵ*]2o{={M0SO=k$?ʨ@oK֭[_b͛7:,^wP!*5b6l+(gpxV 頼*@H¡X*6.֖Ӵc*DXP_8#i=$}n;@RO`>~ ̞z*uT&Udwiv 9?-^AŚ5hz.@/A*ds,i؇hH2 Ec]ಎ|HQA5k5V?h   n9H+4KS'tZj\3}gAG t9cկu]r/_,Q \ʬoD`~^ԏd? y+L}Z]_krWck|b8<83iQc?ݢE wi  5 Jގg"          R@}n<}tW^zaݺuur<,73fD +LUPZ{+zir#c@ 7mq8+<[l5Rp O'pXq{Æ B~G4VW"R@-lCb÷t[^dϚ5+*h뇠ZꔾRrSc=f/+} ')i SL^{m¤?x|uyOO_>&0zgF}Y{_qפֿ'}poTMUV.;kA-Q{Q Ώlt!:1ߢE\3vڑ⣾i&M\R)Bݽصk WoE5Vf)kLC۶m#}T^1   @* /矷W_}՝ Kyֿ;CRyn:C_xb}{ʹ>A\6j 3Թ9! ]C]iA>k*UՇ! (ԟi  FW Jގg"          d#0{l{w߷I&ۻb3 ͛7f Uyٗ_~>AT؋ 4N=ԠAP݀ k}*0@Ed!\駟B|0Wx޶m[p.$ 8뷷 [*65kDh} kP?dA-R8 *SC4]~qX˯x[ΰaK.qŢؔx瞳'ӟ.s 7`w_xv郂 }ص^kgqFض~T|ԨQ6fT\s5VZ5/vj~w}t7uTgX㌌ P>M="Z Rq0eE@Ъpo^,6$-\Ŋr@ Aʕ 8ڇgm Z:k⠻`vQq5훕ch5n&-ZU1GDkUMp8gѥK7V\i   Λ7:yeo5j(̗.Qiഭm6;8Kg:tp ָq=ű RȜ9slnдBtMA Ҡ9q:ucyML@>*XK=i+t?]n]ׇ~D!jPbժUl=y!@@#@Vzj%o3@@@@@@@@@@@:W_u ;wvE߸ʕé 6qDl2]ti@J Dk <*VΥph^x~Ճ?s.y7nt[>hˏ57TDM>KC9?q1 (\m̙QA[*:V**B3-)`wus9SAp,^nF{c{ǎ9昂Xt_z!{_{my޶?OnYzGۖ,Y%u<9m4osuziڵw!B >+Xo5F@ 9h_S[Bt*U!8vϖ BNhۺ@^g!Pz4o82q|}ђ{RcHO޽{#/xA[0 Ν;]p֬Y\hjm5n8+,o=*no{N[ή:wܖhT\Bw3=k^z)Z**%Kk~D=_:urzr}:tHx&  $@Vj%o3@@@@@@@@@@@2'0o<5j+^R% K/uF`|'ڄ \ჴ4+aÆeLE( oi:^VyTQa1> FD[~㧫U8F@ *pӱcA8<իgҥK#fb3Vvm;#Tp&G˗/f͚e)En~bQ-!C`&jp ^e/Scw .gϞ=-u۷?MA{ Rpx)̋@a ر#KB|oߞe: (*@,oP0/ +3@H9 ا~j*AaW1N ={tc@pTZEN:>~6mwÉ'ȹg   @ظq]s56vX߿#(V{nywΏ=vj뫿>33x^Z_q mX0dXv?ש?qӦMVn]ׯwqQw~  @Q 6ZL@@@@@@@@@@@̘1FiouɮJ袋\12FT$̘1cٺu (!b@e˖|»ppLxS|x︬C)DLo#jժ%tK[T<<05Z Z~wߙرcTȖ(X&[&j/n'u_~wy֢E {sƼNn~yse{,*L߯ϮjFg 6uQX 4ضm[f0bQh+V |  QB{Ttc5[1 G`׮]8/4 *`> 0` 8N8\r    RK]C=dg}vJ_iY]q /~aQF߼ 6?>#[b/T81c}uM<: RG`6o<ꫯܠŋ[:uOt*I&Ҭ   @ P+@x&           PT@oW_}M7drJn60wwﶗ_~ƿEpLC@$ (ÇlweHGP܆rPNU8Hik[n m@.SglR|VlVmrP0m̙nA[ \Uk֬yQA[*uw ^ +iРA6j(kӦMȴ m]s5vSO=eEh_Q!<+ԶL4]_:tW P˖-3]7AyWv8 <#ٳ8VD@(j%&D@@@@@@@@@@J;\Hwر8p`^6,*V/ڭG?|;M!*R~ab+8 @#y@IDAT@YP ̕9OKԪVcJk\~^p-VHK)^zQ݊_n]Xbe~4-M/\fiPDr }W^yvm. ǃ]wew]wu~6|,]w5o܅=v].,ըQ}%X@مZepDwsVZ5]X~8C#ӚcH͋7T^=b J@̯+W_Y-7r)vqǹ0\-!@ BZ+~> kg[JB   *sN2d)_1@²Xjs9߻ ?>'kaܹ_֧O+_| %%tmo}֤IuG]P/r@@0D@@@@@@@@@@J7|coM%5tP*ߘQ۷oP\9u[ aÆ`iv" &܄sr~Nݻw'(ˇl0D4_IZV*tiC4ݰk׮('m Ҡ׮];=jC Bx6{l;m9Y{mӮz3f;&q< 6lpnf7x-[v! PR-u{XAX~ ?NZʕ]ȕ@< @(J^8O?mo5muY֭[\^ H@ ?~+uV;lذav/   P :3mҤI%&̩y|ĉM®S|髯j>>liٲe.(]~O>ڶmk^z{+h@@ @V2ZL@@@@@@@@@@@ <#v'p!n#٠B?#bн{w۸qTzj[f\Җ.]+pAM;vӣGիuEC@P#mC|Vy9=6Q@~J4/Kʏ}U>?O2h  @Iб>Cc /_۷l ?ƎkouŮ;sf   @ :߿VZe 0{l1c͙3Sv)ةjO,@@ؾ}{T8W8+tlHƻvJAժU• *w^۰a+Ԯ-lS|SWZ\TICx:|[T⟞38&NuQ8JZ*E+xiӦowyjWح?$}5 +Y~i9s5m42; [+?)K/1热4X9UVʕËd@(۶msq~wL?iXe[`͚5SOc=掑n6Pe`@@@[O>Ď9y'S2e&Ayz~A>Xצ~6n84hfzk4h @<ɓ'?n]cK<)! d'@Vv:GV>܋          zK߶7xN#]aN8 b{nʅGiy0 (ĆnśJt;ƒnyרQ#nWUVMZ;T@J\ᠭG*4-le7(0DDžQӾ}ժWnm۶.]Xvܠb˖-Yfƒh+0zhW(L[]vM6٢Eg26 Ν;* .KX>+ʕs+ry 3! ,/u]gk׶[n9H PVO4f{]`$t   P wLO؈#J:YMo}֬Y3 byZlرo:uꔧe`(+Wxtͯ~+5jlٲl   P+TYHVf           eK7o߾z޲w}TV4]3<ɾm޳_~vavUW!X#ԩS^R9ID@R!g[!]~P.?cbR@ ]0/4χ`m޼مbu 7ҾTv[O5hZXeśVHb^W^zk?櫯~o U&(OVZWh 1~8P=kk֬qڵkzߊXrΝ.Z AYݧxMn>vӱ5o,߂*8o  )}!Cط~k#GtœqTqĕW^m0WE.[׹[w}E:~裏\'V  0)ĭ4}.r{mРA%~տP-Ž &Ŀl  %{Z.]E;MնO.?.¦v?{lwMq";1ewN^;/_}U+#s'/,T/,*K)ۊ+woawq.>ia @@!@Vc3@@@@@@@@@@@J ީ8믿^Ћqҥsƍs?t7/W +km0,^Wݻk.CBg}V^m>}O'|{ɓMZN'z@@ TP=P7h*iӉB} 僸4nԨ ϫR`ڵT(z֭.ȇn\fΜ cMaZ nikRSk[?ϮhTc!L+0zgmС֤I[j z],;Ӵ3fXn{>3S֛o鎋g3鳛Lg,t8+qLk*Ua׬Y±AC@H}ynᄈJ/Yj\m&? >8V@^S"1B^ω\ӧ~ʎ>^LǮsAS+Q@e˖٢E hŻI .pZ yŻb:   @^~e[`)U@ARcƌ_+?'{VaZZu魷jsl>B? J>1 OnU2}<'SԏV~=]ãkw}wMѢ!  @ 2@@@@@@@@@@@RX@EGw+֞«Zv'9]N'P;#E,䉂~^^N?۷ aT kv5\c_۔)SLN}3@@"رcGTHWv\Zh߷|.+ޥ !Ro-CJ ڹsm߾suT|͑`%=χ/ĦeW^.R{9=T/ۛqub ϫ`ݻ۷~[ۯATTlԨQ0zn˛oٺvm8V@,1 + `+?/7c=r<@@R(W_ٯk{Jn6mZl6|wNHŃzb[xa1O6vyuN??nvNyN:>#yIk.,/y(XK*ۢEz)   P@}q ֢E ̚5zi^92:{ 7k;jr5S| 0e9:}_Bo:u10VAkċs0-/~D*k׮SN9*Vh~ƥ8փD@H}O^= ?[p}Ao*aTZ@@@@@@@@@@@T}ʕvw݋+(eԏ1"E,䉂~^^n6_A w+,9sLWp?71u5ݻ]}VvmWp ݟ܁ „4ԩS@^Mun R rś޸q{^}*.))QPR(KGs̱s9D}̛0a UZ&M[n1j͝;7E~3l4iUT^"  Sɓ'gtϗ(O߾}]|Ӯ,ۡ Xr\DfͲ< goޅ{?P|ǾVP* /t}洬d)Kz?b"&ZNqͯ_~~}С6nܸZ^@@R+Pzt)o          jz5hРp^ f*O?m=+bcƌƍ*vZ޽]ڵFe_~m޼َ>hX_뱊l>Z˖-]xqE>VN;?E PʱaÆ_y[t+%!*"}>駟 Ǯ^[ۿi&tWؠgϞ`h5\x7| o_^|ڶmkrڵkK4? +]>S?{&E}%DA"(" bbF(@ Jd%I$$[[zfzo=OYUn}[uNr'@@(4vȑ#amn4S)XE<҃رõ%U:u-Zݓj(+I_߷_~%Ryڵ VIF钣լY)]"Q/*(6cpIKӂ L՟5؛oi+W.]T֭sf[۶m]DA; mRj$>qԡCS~re{߻woS kyԨQJ=x`ۢE,%X.uԱ?Õ?pc>ɞ|1.XcRς v,Ԯݸ/l)ƠdYmH'%V]dsm19}ҵXև~hsε/4M?wZc=JСC껨ݪϓj&V&uXСC{Q@@@DT㛗]vYOV5cǒ/Ψ6t߾}=Iټ⋮ ~'M~饗L2KTҕW^iII}j<_PBzˍٳgې!C\n&{Loh=5h\Wߵv T֔߻0D^p%zݑ~Dv WݓI3f>>>%JbR7?VJ.2b{>#a^86@@@ .L           q)pg\3xɰka݀)ФI 0lذ@:ݻBG~wy'p@=^ʕ+S{LѾ<\?ꑒI.,i޽Lg૯rMk4mI?o4u̘$gmfơ9&  @ؾ=ֽY1V$*Fu@@@@@@@@@@@O@#+g䤤YzzРA7o^`AЇO۽曮z={'uiM`Td@B.0^CZwUVC=| Nݻw/^<{nˌ3={J6v)[1sߺ$e_Õ)_<.8hzFI~HcQ.  Jߠg?4kK鷶~ + WhO7pCk׮b̙PTpn~ժUN~#F sUp|%U 5вgum͛7'(*wzu)8XɏCj)?  !i&4?31'Mw'VZ௿rE(1~o+?5mԭSr&SN@mM*Gc)QBj)*%NdIɯCrˋ.9t%J@HW MO?=P+pc":W?V-ܸ_Op_iLGOkF:)Qb.tz׮]nv]tq#ԆFr MorSm*Wk]v߱:i2t0VI@@@xӧO@ cZhQ&Mj8#J0^BnkR_ B{lٲn֭['8j'NE~뮻.Fx/s?R[߉&ssEqڮ%r#멝^3fyAt|q+խ[7ئ ' /oKcfT @@@xQ]zwR5ܘ*/Ψ6z!G%3/uY/JO~_GąDtc:3L_>_xNP%?K Ν7jB"{̋\ k2OQ$uIC77kذavWgg͚eGuu_p)F߯cF/D#f4:C@ ޅI"           (/f?`H~KDHWXa طo_۲eٳR5)օו*UrTHvڹK4~.Q 饗کzBp~YZ&./z ~0hCo 2eS  @d IAnꫯǛwKoQќVZ{ǂ S[CAnxKKm,lX}SSF$n&wTwޱ6mڸa  -? 2pVZHGvAG; '6Ò%K\R\%h LJ}u!u> Hi$t?Nsjcf?pU_%KH=NIv^6hm}be1QFY˖-cJ@@@ ;_{?lU)۪j[mO?ԍѯ[%Rb^zɝɓ:ݣnRR͛ƨ&=&Kҫo@}iJkpN=5N_7o^חvꫯ7M c=II{uк&qVGRv Yo .="&"獖f7Ʉ   Vt=) @@@@@@@@@@2^{y% ̩@.xcѣ Y{9ܺĕQB0M+WNQun#F0Tnۇرcֶm[SSZNLf -/5uۍ7ڬYkIkIDhѢvg$  ~c.[6md .`wZԬYӔ|5qۥ͛wn0%J֜9sf]DT%KLd7-b۷;dJq_)ROqco9vmGk.l  @<&LH3P޽ 3tP];Wj(]t/ƌl~9~N2t|ҸBRSjJ1:Wn]zdTǏO՘S2"}OL%oVIdٯ_`1Gqd+BAԮ`#JR   .a%R23f2Q|Юj;ӃHmEwPYc+i?R%jR[,)t|E5}7 vS XHJD\T,7or$7M6}|&YD4~gk+ϟ?y}c{g=['s^   @vS.]ڍ G\nRxцV^~{s;wнaW~el2%DouD>uʪ'/S_y5jM~ߘGr 2@@x V\i@@@@@@@@@@H$PT)|G'4}YM֭ @AO;4Oyowm??{0ow1c7ntKQХ4i$_vAsy:uKz0v۶mSO6)-fE5V.\8G?y,\lҥaeOsCCʪ^zvۨQR}~o믷o֕@@ V( g&M\}oܸUX.wp}n+~c+и?)m]+}m#Y*Ϊr뭷Yho DRN$(ؔ)SCl6  ĜVӮ*1bDO,w֭O7n׮] ΡDv7uwyg"mn?Oɴ'`7t=S'Fc=W{Uw]ݲe J.]L>sLZf9%b>pKc%7VxLDc1UnJ?/}$cNNR_%mRoZ&hRwy?|ڵ[4NC_4Uk&g㫭:tm/b"Euˬu?xwW @@@ ?iÆ &͉VSUIXiCknݺ/^y+Po7Zќ9s(hV~ZE8'SV6l'~_ 'L`~VldS??~c^p&WN#/Z}>n"7-~^ܳ =_;@@@ { x7>0!          ĩ7jժسgO)xڷoȓ'O+?Pr(?xٳg~g xE?n:={:K1= Wx&Xt >|8wە/_>% n޼ynr*UP+V,=RUNK PNW_}u`֬Ynp(սL2gy&0h KFhժU;BQ\vڀ2pm=  }6m]F%E7  YG OQ<^`o~/Z ʤ)I+w:u{ ~6`j\mڴ l߾=ťQyʕ) Ʈ vȑƶ  Ĝرc^7DMn@5 \}Z>rik< @*T(%YJPԩS':MJmj׮cٵTݨ]\?V$K/aS@*['jկ_?p饗G"_}%h_yI{/+K>XyԾ 7&s39w t4ӧOO DrFDc\䦺klٲ/)tK fժU/X_jz7jȭSRYfuj_)z j/Y^ZwgZ^O<)dŋ."3gN&քC#  VK^ԽɵuS/6ƗՎy&Ox֫?^z+#{k: %MO*x/q?{uw?~ uݿ@ɒ%],XP?I%M47#Fb\]"='[Ϻk/ƿoח闑ܿi6)E?^z.?3ׇgdpy(F@&9n'`J@m5F@@@@@@@@@@@T g_|yĉH""۽ 4/9[&n^@z3yIKeú7=^Bt5/y]yyqҼ@sϙ,SSCY|Ke^+^xK6f^N%~ ыKI5_ٙgi^Fg{:Aރ%H0e4iy-Zۼc +^IkҤ 8ߝ%  @:Y'D^Pp[f}J;we˖׼Q)3 YhkӼ%s<@@.%s{׾ӧy}pQ?Nf>a jD%53/07XԎhKZe^d7q)HID\CuR5TѢEn-[tcuηXbLuu]g#G[o5XXg^_w͂ SOو#K,g^pgեZ   I?qKVi[ɽ-9j{OVԡC9sy 6^i]ǎuotqzkvYP}F^b3wʓ'v?Ixz%rKd^'9ӔR~[,tHMKdC׳fͲG}.\h =zg}C@~;v,=/=ψZK           @C͛7wv*BPK<7.*+ԴiӒ&>kD)SJz*`@vUV.A07Ν={Jdɒ%xb7o͙3tSƔ(Ki% WN K/%V8! Y@@T5krw1 8*Z.]E~E@@ ; |W#ի{q-K.O9]-화WdR(<|'ڶmP+a0m@1ޛ>ڵkgKqx_ ZӦM駟:udSI@@@+͛7ܹs]žʺk2dlN(3&%U4hKVL۷8S2:N_q_h_yI&MI;'y{א#" dj*N           ]:,5k|.o ֮]^>O|sN0 *d QuO>Qp. EɲP&%*Z޽mRdIKnK. ZI^I$.G5kF)  dXVZ fK@ `]v&NH2 ns@@ꪫL_^xnָ-gΜ[,~hgR_Lhkj%%\Bk6St 8ׯ-^ؔJ*9L_믿n}j%nԨQ׍   @\lԨQvEY֭]@'Wh 흙'駟ZϞ=]"Jz#=c?ZxҥVz2F;/k>>v>i&wСC?o>C/=G   ^ w{ GE@@@@@@@@@@7%BzwAL21OMgqA03'OvSv9p3^_ @IDATy,%7{g]`R%̑#}7nl5j0%Jˤ@WxWjELņ  @ (5\cK,3g9眓aǎA/MI̘@@ͳ^{>#7бcGСլY3z̝+'^)|`j׭[>ԩӉg)дZzu{7vڙT{q5k x;fS[on"gdK@@@ X.2;l„ vgg6]we S}cʔ)VV-Sa6m|1Ux pc7n^zV6,X0O" Ĭf%JMn֤IV3&+FB,T @@@@@@@@@@\~[n%*P@V*{M)wvꩧl/:dC… ;;wn}K0vPKȑ#Y(aF"ږ@@}Yfa]}sv $ޫW/2d־}90GA@@ FO=z *Unɮ:kР̙3Fj}JkgϞ˗4ҤdZz%Çsp5nk.ꪫ\o͛7.G@@F˗/wB _|a+VFg5N瞳~zmJ랄#G-[%ѹe˖.VLW>Tlr!i]&N}1c-[ڶmkv)eI@@X Vگ nǞ           @8z < )AE۹s?AYMڵkgJ5m4:u}.jw+4n84gC@?m{[$JL|-ؔ)Sg6mNDvG@@ k lٲ>#,s֬YVpakѢ]}ִiS;3 R{H@o[4ik*0OÄ́   ?7ovj/1;gޙ޽ۺv{'*#XƎkǏEYR\r6%˭Di(]@ Vto_McժUs}M41*Į͙3%R? L_r%֢E ׏Xr=j  -HHB۱'           Wz|6dHM6. W2$/d (W_}!^zY.]SNIڵk]-&oL-?S#6F@7xx߶5kljY7s=~k7hFmK>R@@-pqX믿v?8p+fF /ttsʕ18;b@öxb;w͞=fΜi7o"EM6uT    &[waD*^ziJ<ձcG{Wp;@ t1?Uɵ_~XKuEZjd=1Pe@ tŊ?Q#._rm׷.̮J7{F@ IB۱'            *0fS@{=lZR%[CvyťIv?i=\ʕ{1޽ɓ'۝kZOHǕll„ d s=7ű  P_.X:t%R\ Ʉ njK.%Kj*駟կ_.BW @@@8˗Z7R>W6GqFHkVhQ߿yq?f/%R(ݻ} /^sŊ-Gó%q*yf[lYpV>|uDvJUrei# *@B_jݎ=@@@@@@@@@@@';%aڲea﫯͗_~{hعs}_W_}e۷owAoFk۶թS'v+O@@N@~i\3ϴ={Z׮]N; Νk/Kf͚D@@t8z)*f% ڵk;jҥjժVJ|yYRұV@ h Q[b)p^k)M;P[%]իW   oSOlg}qֹsg;3yM6͆j~,YgݺuSN9%f֯_o ,pi_M 4*V|9X '@#GlݺurJwC?qϞ=nSPè/QoF@EjP+v           F@z+ĉݼh"˓']xִiSkҤ5hЀ[a2rxΚ5˦OnSNu=se5kZliժU*q,@@R-a{2|禺Çm6h ={]pַo_馛/(uF@v6mKd[J szꩧA+W6c0RJnV9rd;N( ;v>W[ͫWk֬1]5/^%Sr9Ai Zτ   @f(a믿n#G_o]tqx~7=z >ݻwvY޼y'M~ǵm?L2P}/Tҷ+H"i:.;!)ɜf!#jkǨIUTq}zVX>  @H&6 nǞ           lݺզLb~M6=;wnS5l%R-=͔>zXA:쫯 u4=l|WؕW^i]v*T(}*A  ݻ7ް^{.nڷoo1g)ۘ1cLZݻ]zL   -͛7۪Ulʕn ;L|B .P˗:+8*UDѺ #G\[[I6tV[?z+@.!$s$qV|   JaÆٜ9ss֭of͚U(?c7ϛ7ϊ-ݕHFx< rڵ=*Ur/L<,YҔ عs'T_a>o%ڡ,Kԇ#O?ߌ%  BZi$J{"          A`ƍ۬Y~K { ڵkD[ZV^%{ʟ??;ŋۢElɒ%T2-[˺tW# !pqwޱ>̵5de˖֪U+'+J:tȦNj&L/2Vu:vhgyfV<-  Ԧ8jVc%/RQ-`ܹsj)Sʖ-f.][4+.y׮]{f!)Qf%~r۶m]\wMݔM8+f}@@@J3vX裏 ƜX+vIkӧOoƾ[^p .XӦM-O(W|O~!1)Q?ϟ-Y(Q͡/nŊ3-5k{+o>۹s `ʚoKԬ8R,}7tYcF~6-^csz@@@L<%2e޽۵6lh 4 /ׯoY%9VZƢΝku׮]ۚ7ofD+|ulOB!Hٟ B-8`g~Cͅ 9r?A}~?C?+t}J̦m~ak%RB-&@@ M V@@@@@@@@@@@ 0J/]Ԕ\KQ{uG+V O\=>v{P94fh@LhЬ4dcUVu*Ub1=,?tP7aVZY=iӦYa@@8z}ߺy\pԩc5kִZj9csNVe˖O?dK,q^++X]s5.Qk@   ٺu)PliDO'PKs5RHW\DUh-YO;4-'M{%MSP[iVhf ޽k.k&ҡs鮡DMJ8Y3!   JF4|>}KDdTS{VZ5RJp>`'kTWmŊ|rkGA*5j3{Q Gɓ{}%XWGgBPK-LRI/&^~^UI&W }y. );@@@ j$J@@@@@@@@@@@bO@l ~WS)%Z;x`1t.V{SO5zP/kV9kf=8r-e޿LV`Cz@U?!eW0Db DZzd'=駟ڐ!Clƌ@w}u<@@Xu83gN0ʕ+o{o *g R;B/_>hL~~ \Rmk62ׯ_Ge֭iL   @z h| Uhp5q&]V'f7Zx^kFsNKm*BgӜ'OJo1-J @fY0f?:/T;Ssk?x8pYEͲǑZ 7| ~b-Cm11}NpC@@@J΋/&Zzu0a{2eʸqж^Pߊ^~_#4+y\Q$GϪӤDYUVu .:u(~3}B :K?!’ˤ 7P~D+OhZp}:]>7jnC ZVb=~֫n&٨P&: F&GR„  #@BP+v           #^kм T C *?`1o=zVZ }t.iҥ.۱cG\K@@j,_%R« 6ifJ*`|$. J2%U,-5+p1!  YA@A[5lɡp uj 0TPؓ+Oo^rE)AwCA5: K#鵟<_j&@@@}%Yf]˪f?Ֆ-[L՗$<';Artϩ_uYv1=#[hоBm&^*g~Z^~z^ICK:?Xjr@@@ HkBB۱'           @ cvЋQh3g*J)0޿0ɖ6ij:MJnΕ+ ? s2e]y6akݺXdw__~3za7tɓ'֪K}@@Hw%RR;w!Mj7KiYbŊY@@@R*]Q;_k&R/^q'~ }uQ[/2-ٱ   Ļ,pHɵ4A~B4ǟ^sDK3 tzƸq9["駛qC~C0\/ ]~ߡ7;51   Vڿ$J{"          dGњ77[le3B8|m޼y?[57U!Cngqhv;L2^     E̪W7<8-{    ĂWϬC7ވQ@@@ »D6g$            (Уf&edZ|ms"m:5m>S[~uՆj*T6mԩSl@@@@@@@@@@@ wYfEtC@@jʕ           x25RkLl\ti{'矷kDRDr쩧 6ػk[n5%۪Z <ϔs@@@@@@@@@@@ =zwرf@@@ P+\(           |cfO?mֺj~;RUϛ73gڢEK.zʔ)cw}-[,KE@@@@@@@@@@x-w19Ҭbح'5C@@8yj!%           dƍ%s2k֬_ E֮]ۆj7oط~k5j԰.ƎkGMJp@@@@@@@@@@Ȗso2["'   "@B ^"          Ķ|YfÆv]#]&MCֻwo['E… [Ϟ=mʕW_YBy/_ޞx ۲eK=3          !wY6f  5   -@Bx           i>Ĭ`4s;>.ԠAbnP9y6~x[vu^{5;묳m۶wߥHG@@@@@@@@@@8nEF2˕+8e@@@ HSF@@@@@@@@@@_ٰaf矟 :+WkO=ر# 'J3ƍmĈnyeY_+E@@@@@@@@@@xE ƌ1+Y2#1@@@bAZp           @۶uj֩Yne?|NG}4˞CR?Scǎ6g[`5hzmK{VXԮG@@@@@@@@@@81ìg5k8NE@@\Zq@@@@@@@@@@@ йyɦ^}5+6mu,X[oْ%KVHثnݺ7olOoRLұcGW+;;"E<`W/ҔPm۶VB0`mݺ5p           ǎu`V;z^!  ď Zs           @Xz4,WTW8G/ԩSmɩ?+snѢ}vZ[lРAV|ya6cƌxZ@@@@@@@@@@R)pSl֬f rg6G@@$@@@@@@@@@@@@?̞'.bkݺ@- *?o6maÆٺuK/ZjٛoiϾ'ϙ!          &6jk1  Ĺ #          *f-2eζEj5ӥ^<-YF.zN:ܹs<[.V\@@@@@@@@@@@@ B_5_'^l   H*          dqÇz2+[v]tQ,~6~j[o{̎9׷#FئMG/ªTb͚5qٱcDzr*          ėo,QVTikܸq|p    H7            f۶νjԨ U:<.СC3رxbŊY߾}m͚5.V}6dȐlp4h`#GM6Y~>;Ϯ*_           I tj{yΝe7n'=   ď@|?U?י3E@@@@@@@@@@b^`6w5{A          ĊfnvfmݺvAB]%JXnlvȑXlYs˶i&ǣ@@@@)@Byݨ5           Ǝ5/;i-]ԽQF:ϓ9>}nG>b(PKPpB={UR.+Syڵ8!          @7ܹF4ˑ .>w'p6߃f/e)kV(/WTB+RYl_jlacbfs?c˘圙x뾮9g<:u_ t%A@@w           @ c;r-)u ӄ uU#GL) Ԯ][_~v´&{J,֭[k̙@@@@@@@@@@@ ÆIIʕbΞ=)S[n.@@@R' @@@@@@@@@@@ ?i܋uXnʗ/qUO03ԨQ#tSlOh̘1jѢ ]wTjZlyCeqrL<4g}V}{=o^EU>}C)w1OJWVX]2u]jРAsoUpp֯_[HX*UtEFFrʚ8qb9q*UJ}ĉW&L޽{kĈSNcx     @JXڴi4~oڴ2e3"    D~Ç?WVٳgɓҥō\,(lB@@R@6           ?Ԭ^k hӑ#G`7P} X۱cBCCe*V&M7߼Ѣ8?iӪC7o6nB^y*THrȡ{͛7o FP͵we8p@իWwm,XL4[tr̙Юkҥ)j'+     }(kΝ;5~xT"""dV^-[gB@@@@vzuYwVc}R^#  G@^R@@@@@@@@@@@'FYJ{_pA6lP X_ :t;t.('$N 3@޽{'H z)㏄% [o{j V5g),,$^ *PTpalҕl*Uc`eߟiӦ²:vVZiذa.ʂN>@5nXʕsemօpY=3:u κSLQN/1!     ,iӦV6S+V&MV[lq |T@@@@ Kw-'}QL[3fmy.}^"  L@T\@@@@@@@@@@@֯'Gbl? **_ōY@Uݣ16`NAAA V֭[x.,) + dɒEzҚ5kd(QB< *䂧vqotgb\ٳU^DFFO>K۷\x )k֬˖@;Μ99s渠̙3+O<1X@@@@@Wg}V ,p{rȡlٲy@@@@_o%Owu9u]1 ~    @ P+U4@@@@@@@@@@-sʗOSb֭[4ih̘1j֬|AM4)m۶~:t萦M& Zre~[x@-[_|clwܡk̙.,B~ijJ˗/wkwQ]t7|g,ec=Ms?v?w /wD2dڶmnݺx$kW`$~+P^=M0O>[[{5{k&TM,P»4-^X64hР8:׉H >裪UV#Ν\rzn-F@@@@@@ 믫sjӦ]}߾}Qz_{5rvzVoڴy쥛윧zJ3fԊ+ԳgOpz px]wiȑZ6ۮ];թS'7 0~խ[mϔ)T~ .p)Qn/С,T^KnCozB,رccծ][  x ɽ]Q'dyuAi;wɓ݀[Vɒ%݃GI.]Z5jԸbyk֬qm`߇KO0,8lr{ի۷_zlN;Y[9/Y"     aaGov^pb~KٲetRW;SۼMvO}n&M(88X?ѿ/ﮫ^Tl2w/ʎ)Rfn*\ئFɓ'էOeY}lr,wԩS 6}++:@@@@n@`&yHK?.Opł>} իs5]_R!  [@z@@@@@@@@@@@  Xm۶-(_{55h?^dTBwRb;ׯׇ~n@Wv۾ eaV6 $h۾+5leZʕ+e'ڱd?pѢEkn̙3{Q;=+tҹ-[T:u2m0޽{ uLܹ]P|H6,|wzذa*T@~>KWaw&>}csr4jԨˊ ׌3\{;.X"     =Y}qB֭+ts³Ν;5k*k֬{Av^Gƌ'v옫^T.]dd׮V6yF>tg!ZvOn}gR4iad̘QCuWW-%    osgyJoڶm+K3\1x  ^R{O@@@@@@@@@@@dE՘6m"""{ZjVL6ᥓ 6ٺM{q/R.\Pǎ6\(QBǏw(P-;tʱclٲ[nڱc/^ sKٳ:{;̐!; Y@ 8aA:u=裮~彞lۃb o,Yn;C{@* cOZ\`}Fkʒ%+񺄅Gv\ZЂ z]     5Myʟ?~w_w-[|ce*V=݋{LvZu/B,BOe_|+{C.e%/U\YӧOwa}u_˽YA@@@@ {KH'b4i}T֭]l~ٗk   @ P+@@@@@@@@@@HVˤsX7 ѳ ټysq d=(]tn)$$=xj*yg֭[5`w7,t,>c|Tvm9rDm0YЛ w#q#     ኈ^v?f͚^}(;&(W}Dx…ЬYo5n8>w½?]v<;w;TVtw+X6#    pUW0A+y<СC.uo`ݺus\̾1x  NRN@@@@@@@@@@@dXDj f5"""܆Q`A:o޼1_@OȜ9N8Ⴕou "TJU^]~d!C.$Z1Zji͚5޽OϞ=?gʕ+/ӧu>M4I1wx>o߾.xnQްـYNYdѐ!Cdq}7-4SN7Z4#     ,< О={+۽܇2>O{3F_6l믿 2Zjc]?pM8Q.v轲X/F@@@@<VIsI-[^N3gNuʘ1ڴiu][_(0V@@@.@V i           Ǐ(%կvcc*{3թS-={ֽTT:xAFxM@2t=?‘Ν낺Zn}r,ʓ'+}.hڴi*Qn&M|Xgώ'`^x iXZ[KhK֛ocǎ]s!\ޥXT)= ,զ}ڵ֮]ڴh"9r$}7rjg?    @8zTPwaCco~X={$]{_vK@@@ % ]چ          cy2<Y1+hf˖M:5eʔs7߬gym+P[Κ5K *{nͻ{qۼ^z)k֬ԢE }zԽ{wjd[M۷owKcAZٳgw@6y/ӤU߂l5i$7moӦ-Tn]كO<C$+VLիWwz /nbҥ p,X׫y.h`zGz꫶`{‹/MЮUjŊ]ڻw>39/,Lkƍn}֭niP >\VѾgQ&@@@@@U zQ\37M6iРAʙ3fwO?TcǎՆ z/Z\^gM5p@wߩlٲW֭[/e\rf͚2rʾڽ.@@@@ M'O8W޾ޗ=n=   G iL           $ȑXIżfF\Pչs߫K.kjɺ ¥lJ 6L/,(K,C1+yeW~{TuͷϟG{@, 粠0 ޲$ haZVgkopk?裮Nld:9o2eUwO>qo&f~$pI}z݀۷F?s~p lj ik6g֫BlLgЎJj}Z:}+vMVGQ 4ŵ00&@@@@@Q GF*\^yOոqc͘1C{ l6[??~e+~t؉  _ xT<…JG^7qDe̘7.}.   "=Sj           I+nT~Tk9R< ]&Pf͚˶ܹSŊӏ?ke'6nΝE),,̧k{'[o|=      @ȑ_zÇא!CHA@@@HO?-}~mK͛Tzϥ7f# X?.6LL(           7HݻKOKuۯWbŊjԨF}r 9sB5g7@,Y\ڟ'jiӦZ`L2:z^}U.\X*TرcoJ          ?gH;K%KJG   @ x           Ν')֭L2i \2@``5jB6lؠ}?V͚5qF=C.hwՉ'| @@@@@@@@@@v&O2dR=@@@ P˯>*          @hTkdz:u?zU_" ϟ_?-[gjԩjР           >T?^sXBڄ   KjһA]@@@@@@@@@@@.)MVb͍7… x#4iҨC3fݫÇk*_5jɓ'~"          WKHm&չ   @j P+5@@@@@@@@@@H&#Gp)d@ l \xҎ;RxKiȑCӦM4w\eϞ]ݺuSPP}]Oq          :wjזO    >!@O T@@@@@@@@@@HμySG{5jP dɒ4hBo߮x@).]hѢE~           :}Z0AJ6)5@@@S           (gH[J{H%:%ϥKKB-Ljժ_RW +ݻwkܸqn٨Q#+WN|2!         J_fΔ&MM4@@@ J&x.          t *SF*\X)kVeZ]-t͒sOJHծ][˖-K r%{}f~7լYSWkƍ~>*          …Ҏ[D4H/@@@S@ԥl@@@@@@@@@@@  %խ+\pttoTǰ%~~z:u*~pVR>SݻW/fϞo]M4w}ϧZ         4# 3.AkWm[/ng @@@ P+           [JsI=zBDjr͚5UV%(6 ̙Sז-[\V,YԥK-ZTÇׁR:C@@@@@@@@@RҼyҩSRҠAҹsRnR)4@@@Xל!          @҅ qW´Sʝ;cs} R|r;D @ZҌ3m6O]=ZAAAiɒ%K@@@@@@@@@@t{ti_ogVPG@@@(@VJ|Wi           #l'UweΟy$쉟@5Ԋg!PhQkڳg>cm߾] 4PŊGL6#         ĉRh#GDOTʘQ:qjK}@@@R@]MMͦ           I%Х.]W˛Wj<}l@ժUoſD Qz_ՅURESO*$$$3cl0!         $Sܹ҅ 1ytԸ4rd}B@@@ J*i          R%{)0PKJCKinjm߾]G(UqiϞ=}BCCJaɒ%Fmg@@@@@@@@@@ ~!f%X~mKÆIG:   I#@V8s@@@@@@@@@@@ U T.s sfSYKx N)Ȕ)|AZJ˗/W[sҦMkƍux          p|#OΘK'KiUs?@@@HJRk!          XK)0$OS" XVHHΞ=Wh]f͚ϵl2… lZW5\e@@@@@@@@@@ ^gH3fHQS@Tn4h?ZQ;YA@@@ Jt.          FJI+zv??#i/I.]8'T~}͝;7؁          psHgsu̐AzMirLk/#@@@HL>L̫R6           @8w>SN)22g\h׮yڽ;@ӧ޾-mΜ9df[7麨:ubż{Y"   j@-@@@@@@@@@@@믿~zر#Ƽw^uX4wkt,.npٳoV…=jSѢEݲD*Wfz.ej͚5c%g$Ǐ_m3z ae8qͶn,/;wy̙)\xV_'[jZ3ftᅶ;` as7tbof[L`~27         @|_Ço>zh6 ϲ>I/ ZVL9wZOV'٫۹3gNʕ+jΓ'/[Zd&@@@Z@z            :tHK,ѪU\@4C6Y]\R%kaΝ;jiA,xqfլE r={VΝs;v=`n*44T;wXvrZHlUX5jPݺu]&Z+Tk&Z O^w>ɾiҤ-ZرcN@e .dAQC٠ ) 8elݻu 9000j]O.l#s֖fkc\E-#G7۠ow6o[7d#O-@@@@@@@@@Kٳ'[G-my'h. *_/g쬏bw#Z:oK/""!%tiuxһbE>-]G}wOBBBQNvM *P-d ,~EQPPk=%    !y-2! @@@@@@@@@@@#p͙3G .tAV~Q!Vd=T=n[坃m6W? jР4if͚ϓnxѣG륗^rdX?ꔲln @^[@Ͷf γA}&AV6( jժڔ={vdMx׽Kdc1{8qℛ-֣/!gt}-pXm콵Clfw%_|[Zp     pII{%q>    ? X;vhӦM.Pj֭λv B m`)>>y<퉻_z}zĢٶݻw+,,d-d[oK*2eʸӧA@@R9ϳS<+5l#P+A)@@@@@@@@@@W 6mf̘5k~nS YHyɒ%.l.iӦj߾UO:Y Zƍw^z^S,٠6(}xFYٻn'XP lP Gt-D曕;w9G.x{>K8y/e[no-m ӧOhl\$ t%׋)>h/@@@@@ YJV~.   $s\f֭[k:{c,YJ(f *Z_ECPVrZPܹSfo(%)]t*^'侜ʗ/ *- bB@@RZ Ԋg"          ~/p M4I}.]lmVZۀ d9s͛z<j׮2dݵ4ѣ YfW&U̙3ھ}{l6["y@7hEK,2!p-o`6ظt *.[lnfζ @@@@RZ    ٯ]6{;Z8:YSٲeUti)SM2ISN)$$D6m҆ d!f6رCʚ5*W*UzU뗴j   @ coǙ           Co ӲNS-ZPڴi]U܂MB~'_~*TPlm,ӻwo=)]4컱e7o޼9jm6bB9TX1PKy* {8KL.BޢgoiO)wnRJdɒ$l˫@@@@-@V~i   .Ҵd/hݮ?V lJ* Zvݼj*^pA7|j׮뻹jժ ZS@@@ jߎ@q&           w ,Ј#4gvmz'u=)kL<*~?^ Zڵ  *ģ48Cɓ'Ge /`0@_|U#FaÆ>_浪 }7[ւԩ`ZrEkΜ9>˖-Sƌgsκ;%K+N@@@ Ԋkɓ=Hn 0}F-4kɒ%_믿jJ>(‚}*Uʕ+,, Nڴi [zVZ8ur̩5jvڪ_ ʜ9s]@@@@@ AJF A@@@E`Ŋ7n :rի>o^EMkR Xh Z:u~GK΅j=j֬ҤI   bԊ[KV8@@@@@@@@@@I xG4i$K#GT֬Y}V={O>={ _~YiӦj^w}/.{P矿s9!y.\+Wj޼yZp/_ӧO˺u P JZrUR@DD6lྫ]t{mtTZU 6TwY    !@o@@@ X>L}֭[J*gϞҥ (=% ;vLSL_|E)((H??'OXa#   j_@q&    @IDAT       s;wTu}j֬*4vXW<#+N8QٳgjY=zÚ3gNǰ#ݫ3g@7 :qʖ-&MA.'_|_Qjq ˖-ŋ`ozUVj۶J.@@@@@ P+l)@@@7'|Hw}zGTb)cرc}=nݺi*SL1   I-@V Ԋg"          >%믿]v*TM Ufʕԩn&DUHkBT}{= |>S(P@WϞ=]_ĸe>p}z׵zju]6lZ@@@ 6l8@@@@@@@@@@˗y.cҥi%;SzuZJ2dPÆ k׮(5y_? Opn@rʩlٲԹsg]V{qEXaZXG?f֭ͪ[k Ѷm㏻zhѢz駵n:l F@@@@@@@@"C[oO?cj˖-۷/aZWc [n4g޽[˗W>}t+@@@M@d           @X@G6mԨQ#M2E2eJ)EyՂ ={vlRGK{™~gJtxx&Nf͚Xb+Wgu진[x.P@N         ~$0o<-[V|MmذAݻwWڴiT7oe˖Uti?B@@@T'@V{i0          $ رJ,oF)y>і9sjΜ9.{UddOz*ƍu=h tc+\UVuAZJS…J&;wn_ruڵK;wȑ#UP!=ڳg5"        Nܹsd˖-լY3m޼Y<AZ|>\}?OW^ԩ=   .@ֵ[q$           sq!M2E3f ϟ_~~G{~٬&Mhɒ%:_*}I >iM4I yTLkED(Xh֭[o߿?N         @ Xfj}fϞ>H9rH P)>}z=Zr תQ6nxp8   @R DzA@@@@@@@@@@H8{f͚a{' Ӓ.]?X۷ow.]vUj5C oOɓe'va[lQRdNuԉ=viĈʖ-^P4i+(SLzwSUV/Ŋӎ;osԸqbP\TpajJvt իWO&LP޽]-{ĉzꩧt-_V۶mm9}t=3fZh8pf͚~A%JpΉY {\iӦhLiөS4uT͜9wWE>>lڴ)Agg`uՠA|wtڴiZz;[n. Iă/_.wgŊ:tK.H    lFrwMu    @r ۷O7vf̘p&g}v XyiܹeorNw 믮n+WNpm@@H)c J &B$B           v i=dݠAlRSLqQ66lذ}'}Ye͚Uj,YREٳ}rmܸQv{?w!c˖-S^vݻ+cƌn*TH:tpp_~CPPvYx/~'믿ֵ[hQuم|q,p_~XϹs>}رc>^|EDǂBCC9,qk.Y8}?")""B֭sAI&ٳl;_l sN?^!!!M ԇ  d$2٢           _^fҳ>O]Sջwo]uU@NyU߾}]hѣGYtչsgxJ++W۵lٲ XpM:tp![bŊGOwNǏk9mۨQ#w$ sͲP:I4vKիW{oՀ޽ի;_잻뮻\vvޭ[nŵ't{L:r[o9i=V^jժ.sȴz@@@@@@@@@8qBӦMSB-n??jTtY6mo19}`9rЧ~5k~gΜ v   y33fS@@@@@@@@@@@ ;V˗W6m:"##g6bLd߃c0^]K..i֭)jR,Y]{^eSEџ1yթSGW_}u6})R{y^Rw[%uzeרQӧ{]׌3t+c0/ZhMoх^.JV| -' e󮻴7-JkӤBۺvz@)Y=O7n/mo׊l-Y=ʧpviٲe4ځ        믿_|9/^<ˋ$ԟ.)~Zsu6#>~ǖ+W.5J֯zРAiQ%u   )o"(6C@@@@@@@@@@H\`ٺk-[7L/R6_x *Tȕd/w'ʝ;֭~[۷5ŷ܂?lZt{xƍ.@nV̙3P>ȽWk׮Շ~W0tM6l >܅Xk?ƍFC fY͛7U۷oX_%-Ɵ??mֻWb̜9SEUÆ ]9)96 tjժiȑYڽ7zhYV޽]+Wĉ?~}\}!Ι39o]{?6 gFrǏ뫯r} +r KoiY?AO^:0$]n+ZvmwN[jĉzw]?g|A-[6z2opa`~̍, g+7p{bR:uQ Nߖ-[܋Vy p{?c>},Y⮷P 3f ²" ųin,@ѣԣGwY]wUV2lիGyAWI_ܩF6m yA ,LNhҤ ޳ewv}d`{イ.hld6,<3%r9cܹ9{`0 _@!7n },B m @M7|S#FpamF=wS;9`!ejhׁbOi^Ybǂ,@&{Fڵcn1]cvN,4^5taƮG[afre$'Pkǎn2eDo_p/>2~v9dB@@@@@@@@[?w}OXZ)>ȉwOaBe$֟.]wUz5mOaBmIy9r?nmذA[vʱ~5}dSv;ٳg>?2f?cZ9i5Y_Fj0   @hV           ~ 8piTP}K͚5S^d':c컅t![N[n]nA9۷Nً_|.(f.pʵۭL ӲVi&8qBqR-˟,$~gӐ-Z]vm>l 0@K5שS'mbŋ]Ճ>+]F mӚ:ujo[бٺ&++PvYmY"EtRw+.<ɮ,kqA\˗/w س (݆1 +{ 4HVgZ ǻꪫԧOj$snJ(ׯWegs]NV'3 вe˖ɂ+& e1' ‚cNb8o<H3gN>/R;y{\1̵`9 dΝ)S/l tbmJXUݺuv+Vt r }Xc', lʕ@) p7X:ܳg,O<6~{c yu @@@@@@@@HoիW+22RM4IӦ$9n)L%7q*P &x_|ĈOd߿_wcǎС_? 2cFo_v1!  @h@@@@@@@@@@@Wɓn .]nԨQ:{,pɛ=J*nQٲeg۶m݋^x}رx[艅[]qn,XC^]tq/^7hԯ}۴i^ԧ^xY˗7B@! o￯FiժU.t˻KsȂl ճ{֛>I&$oP{&3ȂYbSc{4x`7*yF]g+W.Nvn,΋Z͛Arˊo{M1CU6BVٴ}vqzE/]{ :Z75iSBuz0? sYs}(}… CI@@@@@@@@ z?SۧЎӟ2bmo`}-5f9rayYcC?~e)SF]t]_Gha[/vl2z;n ?fiUzqUI5   @@@@@@@@@@@P^6BƟY `jcSXXXmZe 1ڴiSqO_֭[qFRgyF} 7ܐfm,dnȑ#eU+VuX^S>}ԭ[8q ]K5\JytI5vX[d}mfuٽռy4b]wunzgJk.8p@1)7mJ,ЩG}ԅ[yI$OjV4`9rD)! yۿy!x^]ާ?6͈; bE@@@@@@@@J.~XaKi!QџnShOq70>8ӖYn[]HXy},੘lܸ̙_ޭKbnr{ǕTX;szqTI   IDɜFF@@@@@@@@@@yTRڼys@e:tHri۶mqDnEھ\rGj' z-Z0-+逸Rǎc-_{ @@@@@@@@Ho/\yqһ-V?Rۧ񧌘sǟɟ$VG/쳮׏2~f֭v5kWHzzʒvkԨ=@@@ XjKr@@@@@@@@@@@ \{otC ĉeaT~uUM{u[nu? - -%poŋ "[}ZY75e*<<}br?}~Vi}gnpoQWv㡇rAhB [o\+V ƪ7qxwnRe!NjR…*ʭOiXm{wjܸq|^zm3m49Ǝ)S2VZSNiҤIo𞡱*Jw1m;L-}*_g+{9uIwq^|EW u -rķl" Zt;K.IÝ[y/b ʤ @@@ ^.b(@@@@@@@@@@@ -*Uf+BaQw޼yuUWi.櫯rAW֭SX(lRs̉wHҹsgꫯ ˂arʹ. _9w{yQ~dR]h#<%K 3gθ@{; nAfo{){B' ڴi-͛7w[f?5ǵi.0i֬Yۮ9sz%i'/p685jVX႓~7WE]hyʤY]&LІ ܀ ,ЕW^' ܲg=[}v/V^ݕrJ,5c |{]v.Ўͦe˖7[?hb'OtP 1e #*Σ2;׶̙3gѷ~0{㏻+رm`Vxqn_ #A,]v=ŎǟɞUv<9f]/v/cBXh    %`9kMP/    y,Lhxx.~ A>ewgShX+X@i&M㶾hea6%0}$k}Z@뻘?~'g׬ϞdYpjAj>-lm\U;i5իY?ȄM3޽?UR  d1kY{O>Yd*`w@@@@@@@@@@@t(ed{a9Pu3p/5_r% ڿ,^Xb `ҥK`X+^U ݻwJL",X~瀝=klkFyIzdn1zhR[]v2K-Px 62P#Gd Q@KΊ'Np5 ~H8+ןgP2 ?0'|҅Eyelr-oC1-OΏcegX\r'SNiΝo~ x?\`XJ>SO6 tȎ @@@@/pUw{     GcǎP>IPZ_Mg\1&Ֆ$}޽*U*MϞ= 6Sn]˗/+TTП1͛7u֮3Ⱥ( @@^|RY!%GNVJ@@@@@@@@@@{YJ*ѣ~hQ`K//LЂ jܹnv۶me/w^څ*^f)ScǎՌLW $п5J~ QF;δ> L}IVۯ_?AO(P[P{f긒SNerڒmo{^kwyG+WNm    @ P+K~@@@HZ֧~aÆ[niTs`LL$O XzDDDǏ3ԞA9$ L^|>LW\qf̘M!         @iU\q^`n]u@ bBdyl~+׿^zr̙b@@@ #Ӡ@@@@@@@@@@@@=4yd-ZHj R-YدZ;w֫   d  Ӻ뮻dC`SjԨQb l޼YoF:u\sMcG@@@ %jD-j)ߕ=@@@@@@@@@@@BEPBo\V˿Ҷ؎H=馛ԻwLe^^Ht۷OŋOp=+'PF n:l:l%JCƍW0[#@OԣGYxVz4zhw[85p@´B@@@@@@@@@ݺu5c ͝;Wv%O8QgΜ V̙nAիW1cƸO´؅"  @{72           Ν;zJo7|SG'vR^4{l 2j%c yԲeK͟?߅k=m۪|w,l̙kpΝ*S;'͚5Z) R+`hYe-^X ,PDD+ZZRvtE*G@@@@ gVһ聆vC@@@o@%KG޽T:((k޽[FG}Y[#|RJiȑ+ȑG9rDK.=ׯﮣ^{u,?w\-\Ϳ˧ QFB k%#y{ b 7/[L/+R7:綾^ٳ? @@@@@ J{sjD@@@صk B>6m[oU7|ʔ)ϢԤI4n8͚5KEUnԻwoU^=p   jjr;D@@@@@@@@@@BZ`߯ &[nѿoU\9ۜ^ 'xB-?ɓ^IzG]~=znX袋c=k9?VXx욵3;gNR%\pe]>-ħjժ KRL 22 b?w邲jժ7n&MFʖ-[&Sp@@@@jeQ    @Zs՘1c4qD:tɺdd6eM֭a! 7o( ^{M:u d]ժUS߾}brQ3m4u![ViSdaqf7w ɂV¶, J*\,VXVa8Ce7[Ф+6.8X/Bo٧Y     d\2    uҥK_yʞ*VK[7TӦMUpᬋIرcZ|-Zs0'Nu* 2s   J&P+v          d8 5j Z~S_} ٿƎ?P?կ_?-[ w.?zd_۷e˖QF(`AB6lp[i&m۶MOv5ۀu%=.H9s b ) )g׵7oݺU6[֞={\%ٳgw״Y7׬Yj%    &@Vڃ   /!M*})_R;'-_cY?ZjI&uaaaWi*Y?˗WuWUV_6@@@ rHRnǞ           @Oav@IDAT믿Vܹu7oUsʕa-fÏ93fh8n&{jܸqMC•֭J*iڴiհaCEF#`%%`DyԦMԶm[€,,ly‚7oݻ0|eIΟ?߅M0Af7H HTlFwv[۷o`}_݀^3ʔ){eK,yzN<5Mz}O ʲSNEk5t, β7԰uvM2!    &@    n93*DXKUDhu(19sFk֬q}-\f r:zլYSիWwsj|uTQٲe-[ gm'}˖-ڸq~giAZַܹsʕ+jԨGxfgL   @f P+g@۱'           ,(ǂL¨,rʾuWiӦZgn[n;-\P-Ү]䅂uY:tPbB={ԬY0!Wȑ#ڹs s>l=lW|= Ff ۧ L1?-̞#tp1>dod2/,ěo `B@@@@[@>ԏ   YUO3gFhM._?aJpۅC-/\j׮]߽e{q}` Z~vG1_|џ1:;Ӗ;wNo:jvo)6[mîOgYø+Qma^pXrʩPBqw7   @$'ZbS@@@@@@@@@@@,f۶mѳ,o>}6^h|m-X >q{q O X+TBnoK)мysmذA[n%'ДP8ž=qgoH F3*fx}?rr_=v ) fyh$emc3+w  p ՊU֑@1 Ƅ    dt2    ""iӢB,/ԬYTVNRjhoZ8p@Reٳ{Uҥ]?F/*fЕyX^8V|^ӧW*Wqp!Z_fsH6 ;ڕ0-d LU*R$}ۚQj_jF^u͛7[UX0ܹL   dl)            i&0fqNA,H@+ɑC~ĉc    @ ;Z%KJI-Z_;2bjeijF@@@@@@@@@@@j^Z^xaf gzO *֨|SJE@@@@!0pԯ%Ϙ!m߶l   s[$*@B6l ڵ j^*R$ԏ"cojݺ/lÃh;M&\ElҦMR o@@@ P+j܎=@@@@@@@@@@@ǎS Txq͙3G9r&d^>WZNZ5wd˖IW_-u&O@@@@@ ~M*_^L6x `vE@@@BYAįӥ*U:v/I|mԨQ#,YR_}U7gN9=a_R@@@ P+S+{"           @Vț7ƍ+WY8=d0-;KGK| N&>    d:r夦M쉌d wJV;   YD "B4HjJ*Q"s!=qi4pԲ%aZ$Nξ+(2ΕΜ9oq ciE|A@@@ $# G@@@@@@@@@@@4S}[ӰfB ~[:|Xzᅴ3jEzeo_iPhm@@@@@ķA-P @@@gJIK5kJ+K/5bw4ԯTZF8Ɨ}:wz@Ν."#cW#+߁ie}@@@˄           N;ԲetwvڪQF doBHyuǥ%CaiԔ~IiXҨjA@@@@R,pM'{2R& g     J3gJSJӧKKUH:ICH)w[R|VXOP;z4…ҥyYe˗OQ   A雂\#           @8}Zh P@,pbVxAiDif)_pQns-]*s6,A@@@@BMk%:{6vr{Lz   @DDTִi҂ҹsRfQ!ZUZzȑvK;Kɂ ҲeK-uw)@@@@ ERR?j%JH#FH6R~i9ƵkjΜ9۷+P!|y ӲjR   @: T           @f([ƍɓ'^ldAo9/>$j'     ;Kr߰*U:u_@@@@ -Ə, T))\7tSiOBR_(B@@@ ˄           ^ W\8q"##u7ӁٳғOJ7,5n 2A6[oIo!-_ C@@@@@L+3tmQU wݕiC@@@t ZJvvꃶqi4pԲe0-kj>}aM2E NS}'sŊٳu; /XP:p P8   "@VS)           YCotaʕzAs^࣏-[W^?[:u*UQ8     *9[SU;#   @8{VZH_YS\YzŨ0#{~jKOgz oȚ0aJ*-ZD{EH2͡!   L GJ @@@@@@@@@@@@ :uhԨQݠ>h<[8zT0@ިNBUۊa$-̍ @@@@H@ddNE_>vfhiW]%{>(ZF8@@@mJO6 wr#s@@@@@@@@@@@yK*n:o%E4Do_D҃Fɀbd.g7F6F0@@@@ȂӦMNضl٢[-| =o] 24kCﭘSH >YhmjroQZѮ?C/^fIYxիW~[ 8    k+W;V9Srudz+Uj=gszO{{w"usuԵn]@@@NZQ0 @@@@@@@@@@@%Z2Qԯ__:tД)StꩧfI3x]bT 7&Q?hK+K"=H41!    ӪUeuիWZk׮m{hk/S/zdRpBZCdbǾo{lKIЛ6mŵ6+fږ/_SBm ug׬Vk d[Ŋye@@@h8vL3'֘1Ғ%A֭!C6mbw|^z%}ᇲȑ#Gs(k Keb8   D@Z@ @@@@@@@@@@@89K9a5lP:uÕ3gΓ넳%K?5usK='oRπ#    b _ 7;e˖VȊs9jժ/\tYg^wH Tʕ<mۦunW+f  *v)b^*UR*UTjUj,EʫĜ9   Y={hڱCԮ4pԸ3Ν;ízX7|sbqD;vHٱ\{Q9#    '`~m[j?9rCbFZbP… C@pYٶmʕ_}8{b\ wըQC(3_5E@@Z$رqEfΔH ѲBZs 6袋.ƌ#+FM-ٚ{.nk^xAڸ1ƀ@@@ҥӥM!9 ~2C\@@@@@@@@@@@. ]>LW]uJ*>LyF_H|#͝C^_{0{LzA顇rbs@@@@AO? h…Zl;yAիWM7${RJo5Y@Do{ŵ,Y[#{jժڵkuEK@@@ hΜZV)-*n- "i#+{oׯj)RD[bZg;^Z+VPV"eD)XP㏈vIg   Dk`           d_+R RnTtiWU!GJ{K_/S*KPP+ݻKI<#V@@@@Iܹs5o<_Hkݺu~˗矯kVwj֬i̙3XPKn:t/h"/R7oV9Tre]x~_֭ e   @ ͚81ք Ҏr!vƍ\QqnŘ,D{R4ӧ+_|D46+41!   6( m\           -ХKm߾]={Tɒ%u-}Lz4~|p)-O_e~@@@@4c }oxb?~\*U__u[b2cț7/@gEۦM?mzqFqgv%I&.Azcߔ¯e@@@ k \W@kXiL،԰a$+Ujͻ_~6l&_V4ӦMcDc+P Árq @@@ PP+un\           ѣnݪ[oUtm۶!޽ғOJw%Uw j۷ϓK矗 Iu7\    @ lٲESLɓ]Zz,vhE|Y2d+Ux 7D ;q+MwÆ |QYf7ÇUF 5kL_~7o… a@@@ vFZcHKHEJ[ǭEjFnaoܸq?E;PF3t'{^f?ܝm#2[   !@APO@@@@@@@@@@@H /;vcǎ.X]veꇋHN hUڢY xBMzQj4wI    ]o\r18q.\4mT<7nڵk+gΜr:Eʔ)ovCwSNՠAtQ_쮍˪ޮ];69@@@ Z쑋К0AnTo<|p7NvRztWe˖[."Nزx&M}a:K:tPǎըQ#ȑ#@   X2رrE%[odmULbL_|J.iӦ)O<6nv#FnݻU`w=,Z$ժ%:nV-n@   iضM.N M.5mv_9F@@@@@@@@@@@ =믿^_}.4#, R|kUܹ5lذ?&C.]+#    f.3￯?\V6mt5רUV*^xby#G -%֭j֬d   @68vL3'֘1qEZ+B5*V,6aɵvYl{vi9Fx衇| Eێ˫\YNhA@@VꟁSR)W"           #+W._ԨA>EF\S'2 j߾}$='L.    @;vP~TJhBw֠Ae-ԩS'i%'Ĥ@ٲeuwjĉڲeyO:uwсbrn @@5={O?nEȔԸ\sBԩr1㏥Νc}'=zٳ_PL+Dku&it>Ըq<a   DJZ@@@@@@@@@@@@J[/   .J"vԸqkN+RrEγ^֭[/ʵcGV}Q-ϬVX;R_n[w=a-b ]vvڥFo ޻w|I]q88@IDAT4`9r$߇}m[oӽ)$0jn  DkaP            .PHM䢗]vY( m׮]Uvxgeۜ9s/lS2':̸:gGݺuեK?stۼyzXk4@@@@ ̝;.PJ`i&7IeݻwWƍS9,qH(W_'p"Of?D*;ع]s;vЅ^u  dscǤYGjԐH}2DڶM1CKZ5{a]qZlFB )Vz|A;3obguVʔ)3mAk)]/~MB0`O?+RT/-cO=&N7xßkה)s߷5)mq/wߝK3< f   @ du @@@@@@@@@@@bAZ-E~[.)I`'UPM@ 8=4:OÎ%(\pzH/4sfJKb״O>Dvܭ֜9s|B    Yয়~R˖-}s[%GBqh}nm2<~  dY%~=L @@@@@@@@@@@ jYf͚i'$ >ﳷH}J#/:r>Ǐ_׷~w# >\t>ݻ۷oVZYW}֭[թ#]|R&)ӻᆱKIh.L{{4{lΝ[g}>e k}5k Y:sQFv'|@@@@ XloTv|'uUxرce9Z\j̘1>sO?/Y/-N7dyJbdau%F7qZ;kߋ@jР~w=&?0ث [Jb{v]Vo2>e_'t[oU^zƍu]wx%`6.=l0YFm۶#<keO6>@=Ν/Km߁%Z6/,58\Kl1n!,aSO߳%n㲱͛W]x0 @@+W~YH3gʭ6z-UN_R7⧗^z_`qh/P' '$HRc?v_i_kO?+֦M|| zۺ+[7fn|l*cIm uw;,UTbu=:E[lsu|O5hVx~ӎ;|aוּ3+_RqWi-.e7 za-g75O>/bϮ̂@[ /Fȳ`@@y jW@@@@@@@@@@@~ZViӦ2ejԨ q.K)I7o @YRK`IQI7W^-ZdW\q㓆Z-Kbŵ껳X-; \YQKaX,Ʌ֬М%DbzY 9s)˗/WV+XP~׾Hؒ%K|#F\});,m.,EV 1Y /۬YwsN?WK\d738ۼyJZIw޼y>lңKrbߗ5_x S    +ܳaLŒ& cݻW{DeXq~İv EY{e~OI̟QĻ_Ebd9fŲxS=Tzu_P AY~[-[s{KLh"կ_'>|&LYfϞ&MLW_-uVR%8nZ"xpBqd.-kŶ,v.]|Lgkb|nݺ>r-fmMJڿo|ٳ'6K+eE,lr̩#G$O8ǯ-o[!/~S%=VOmZ6KTmMKDm) @@JѲBZ.DE#[#ٲ%oyWճgObU-XT\F,C{۫^S#M6ͯbZ֮z_ڊh^x[lZ%v,m>ŦJ&0gω /2eŋl_QY[`AXtY>- L.>P\ʞ+VD+n6KNhqN: j?@@@#~ @@@@@@@@@@@@p7@4&O`@@@_% jS3-\Ѕ.٧rʁCȓ?/t۹y.k+pInC]B@CuEB\8πǎ ,%LJ :\-^"SݻwqI-u.I?7v]K]ѬKp>B׻B[z+t,5;E '}Kp <׿B'bfSN9%c. Gߓ+품yg1Kn. ?ߞ6{^opM9.aI~3rH%=98o@@@@R/\wAWƏmof/ .]:PpШ,fg6mڄ5*``KIuf}_.s #[r1yɽM>O>dTWXs yCǚ5k揹cz?c)X \P㸑 %۷m~.p5O=T.-|C9;tk׮<.}%_pK߻_lN'33j u;  -%K%JX@- 14*eE:Xn@@"[b0nI$Nq @h            @L *TH.Aԩ͛oy0x xqSֿ+O=z\q+uY ]6(P@/^: )wj׮z{y%?\#FK귻K+V:PԿ^uUr 0yz߮9z>?Txɛ7ohvׯ/Wݱ${9.٬\/1~6.]߶<4tPrB'v'$=*ST%.Bcڿ[%ThQ߷/Bf    ob,{[˗߱Zj;רQCȕ:䏹̲8+:%Y{w ͞=[ƍ׃-YHZ%{?MIlϮUn]͝;Woi k;X\?Hܟǃ&j oqMW4k}$ ׬Y3qժUl/|<.m[9$ȑ#k0 Sٲe~Mۿ1o @@U+W^.\*UJYͽ{KKJ˗K/$]z+W2rN,r%5\FwVqXGX %q~?BԩV^3gך}G>ds Ao֎m uw6oצI2\5c' |w}K۹s_%ٵGvرL^ =(Z}kׯ'_gsrHnݪ?؏g3   Ue             =cƌQǎբE ߬YOXDzクLQ ԲIŭWX$(ԩS]">A}Pbn0%\\q'G01 oʕW\`Պ+X%H<ܳ5ژsB[omoٯq @@q%\           dSyjĈ>/ dI;ŸϟC誫JvqU^wkEۆ sm4@@@@t"_4vrM7E}XڜlS# eهu] Q\,x^zZѥǏr~vb{Çw [n-pB-<s ;~%nf.J*6k֬PL,+ֹs()C@@.O[nlYSϚ:Ur\7JYI(b{x -xr-<ޒLk\nݺDl;x_7iEА֖%[;f㳖m;V>/Yj֬>}h͚5;=׋qѣhw .\X}7"Z.,X|vy`5/ٍH@@_"S@@@@@@@@@@@@ɒB :T_:t l)0s4f\)Jq+P?B uu͛|G-%i#)m+V?.DVkݺucXس>[jyz(EIQm޼Y7p.\4c ܹ34?Kbo#V,Ѯ] wfHY1{N1>c[!E*^8D!̭Il0~Kvgᮻ}/gIfʕ+z@@@@ M6UN|T+v%֭6mڤz 3%1`+x__fg1-kO5X+KiӦJ-[6E~.ls8}f8no?. &,>tP=L>]guOIni^zbA Rof^b w}z'eɫi   @ \)~[,[vԻtV륗K/+mďo]}OdBkN}l#YVHotwoKN8Q˖-W\~[;fҺ-A[Khm^pm^BHz1+zP>_g駟< n.\K.>իճgO.]Z} \_|".3   @T`            @r̩;v|xd1ZX=C7tOhk#ڵk]zGeCy晾%fx/K` ]{+Oj -jܸ9]tE\Kbo*awq \s=W5r1 D`.K2cVtZE}*TH#FP˖-o_~]5YK~z/@h"?\ڵM߾}Ef >ݻZѣG=+5dUV`Jb{^=H۵}FeZ\6sq v5o<#SN޽{>L[l1M-Y6kW kصkWfkѣ jHQ|&g7_G˳'bְa   @lh            @pIA/ Ύ)%&駁@?$vF]A+p\J "PR+~pDB^9֣G+p Isw~׀+ u1Wd)pε>\‰}.I wܾʕ+\R=;.!jB ?0 _W7p1߇\@Ν6׫ڏ% ̞=;t7|p3캳>;>Ďfa{rhnݺ;ޒ=x衇.٬%: i07-0sL]$~qI;.s`f@@@@ .)p[Ϛ]v`ܹ>>B>W脛W c7I<yx,f>->s=ȟ?1oZ%vIj1e7npƂ $7f̘i㩮HX`{g}? Edv СC~fpYg-ZIr|' (Q"LR~\RmߗK7n\ xؕ?%p ƒS\m۳풌:u8s=`_Μ9]w]Kɔ2W.P`Akg  d݁'7p7U 2%>8r$3G[f_O=c Oi LJ?w}' ,QzM o3X ֊֎>m ;ZAeXsEŋ?!v>YJ׋s-JBmʕ~9ci֭Kؿ ]l+uuEmHۛ>} ^}UĞ][S5IZ]֭[[ ~  Q#`Yb:$hx4@@@@@@@@@@@@ zԫW/zdF'9"ը!կ/} M2e%zВ%K%vK~\b[ r 3Yrݫ+VbŊr;/۽]qSK:؎K+E.\ ^cۑK!Ex ~㥶m!sN=n۶M.\bOJeh>.sqI}O/{nٲE.A     @,駟K]R(zܹs+h.%1 =R12ZloܹCChГ6mutţB$;ö}v?{ ;I(nNB+>ǘ͛.Hwu^xbrgItuرC/+Q7Dd-w}'l\.x"gr@@H_[G3fLrkf vⶪUn)r5sLB~]WBk?%\y_KxRv,kے,|6x`s=~=7s[Kt'^itٲus 4Pҥz†.v.`͛'gm?nذi[vv{@@2WsӥM3w,vw j7x@@@@@@@@@@@@,Ent-wQΜ9OzNW?M=$-[&4uRv>}Jm!WL'=X/D@@@@X悃֊{ѣGBe_|E.\XӦM M5XP '8NH5 //mݺUmڴzN:?DVLV>_^z)Da@@".E֭ hOAWOe5i$̭I 5uέpәg'}CQ3TWލWZ27j@@@@('!W/J@@@@@@@@@@@@ n&T:v]viذaʛ7oK./ΔbZv j޽'uoNN@.6xRP+u\    _jժdǓ'OV>}4`u٪QFyB+RժUK|%y;vo-!qԊ\~IB)RD{N]x'Mf5|pjJs矟E@@",g\q"Z&H3rZVcQ#2^~'Z7|bZUwTϯ jYK.լY3Y&6"ڿBC@@@ T@@@@@@@@@@@@fϞm۪VZ5j-yM,ʕrR?&M믿N}JKG}twIkȑ#}B3fD?v\%1    @ L6Mոqc_\kUBǎSGѣ[~u'g#_~|A-]TVnP~X%[nСC5x`oݩS'^vXG@@5McHcJ3gJǏK jNr5i,`5h&ڟ#/[LUTAFht%KO|bHMJ#*\֮]vdIU?ߞF    d.kAkj߾:/Ο?v 9x;Se[vnmhѢoO;4zh}gI?~jժ`&M"-[&W)cAO;{*SL, 1"   Ġ1z &6L_|:VZm۶.ukbS12d XRk?cǎՌ3d:voQ׏:@@@ #MWDkUq\AKrEvt,гgOM:U?c:)ϚoƍgD@@H jޕZJ@@@@@@@@@@@Q=.{UW]~A7o3a?,ծ- "|3( y^cq@@@@ >ɓ'kѾFu 6hB]vKrX 1b~ڴi>D~ժURڵk:aÆ:S E@@X2髙3~r?KTjF @ t޽[ to$U+ QEDK:A@@RIAq%           İ%KڵFs1<;m%VK9rd_X9H:I=3a    (\q$vΜ9~_|/ըQ#5h@Ŋ1f5kfϞԂ ?~5mT-[T֭]z2g/   Eǎ h#-Y"-*[$V6r(0CAT lذAe˖W_}͛p(骫$Vs@@@ 5JZ5JW"           @ XԇzH?Gy$g?}tgg)'-]f|@@@@bQ`޽Pό3d:2fרQCՓڲf͚ʕ+W,N1#?Nsի/_>]r%jҤ5ksb   {{+5acTr\mqbo^(_'HL8㏥.]#G2@@@ Y j%K J@@@@@@@@@@@@ zս{w?!j |KX+(!}e !&)0{ԨxtIʇ    d}jΜ9~>;\l+SV-թSGuwN= #7D ~w-X@?߬/GL2hVՠA]pV@@X2رrEǥ hk'Ugt [oU+?3f̈Le G @@@OZN_z;D@@@@@@@@@@@,"p|ܹ֬Y>LE"˚S[֜a%H.IA3[@@@@ 6 (.o믚7oϟ﷡C ̙S*UR͚5C[5TbEEWZ|~g-^X-ڵkTT)_0}۷.B-[61s@@ch3FZD*ZTjZ2DjF*V,CM@ 7o>HWhdqCٷOn\Q7,   @r4B            @Uhj׮KRTƍEW5?M/No~)0q@@@@4>V… `jWǕ;wnU\6ZjRX%bx 6n(+|OXbVŊu9B lٲʙ3glMf {~׺=V8^m[28[}yjժQ=\ @@@3cHcJ3g5+eO po֬(k?.%-\ec8   ^Z(z;D@@@@@@@@@@@,*w^x㍚:u>]wuYt7={$SVݻKq;xq饗;L<>A@@@@ +;vLk֬bŊP1";~!?\rL2:]!BVh+  mݺUׯ׆ oiݺuѲM6γV@_ΊYAJ*J*.}Uȑ#+@@@ ̉+e,ZV6sMCݻFcxI)͞-}m& "  $)@A$yZI!           dWKfCO?>}dWJo-\&`,СC\F+:@@@@@ f?^ݲF9:p@h~EgN?toKVɒ%u)c' 9rD\.+yf_ c7n={sPB*W/fʗ/ڷZvZT^@@@LسG81ք ҎRqڶ7\j "3fYfZbx4]W髯iT@@@ (@Aɿ;y3@@@@@@@@@@@@l 3gNkV/xb{Ĥp9b5`ʜo ڦԫt'Oߏ;     Vʊ֤IeZo"HViҥPN\fZQ-+e[R%JWm+^+"E(G.x"cǎiڵkvjųB2[1`!5ke˖*[lhp¡kA@@Q`ʸZcJ3g6z+Uj41!@IDAT@,4t-ZTGփ>UC޿_ʟ?`@@@@ N@@@@@@@@@@@@%W_cǎXF3<3kM0Ff|u7 Ez"EERDDT;QT,XN@@@@@ Hȑ#.HiӦMɁJƴsaKVpYkl[m_eѢEUH䥭s!od|.~W<}h{Iwޝb}׮]z5 ^,ˎI=|]/N~8--8QhK{ގaB@@r1ӓBF,oV骫Z**p7kÆ 8qbTU4thTU   -O{a9'3"           (pk̙j׮5jQFeX´rdyO?]][KÛs    Ķ@޼yUB7R `m۶gfaN~ӺuhѢd!Qk`SNQ\@w!\i-D76 ʓ'Ocuxmq|I!M@@@@@@@m+W^Zʔ:u֬z./Z L+_ #о}{ϟ_CJ-)5ա"   dZYFIA            o7ٳU\9]x1bDDI<"zTnDOEQ&pejQV1        pGJSJ={JjIժIO<5pe4yԣT  @xU;v;s{={Eݛ@@@=jkEM@@@@@@@@@@@@ ʗ/L-ܢ:GձcǢJH6IO>NONE-:r8@@@@@@@@ gv ׯJ*WNjL9RjZ0!oȐ!RNRɒ9SGΊ]wݥ hƌ'rXDn{J^   1'7ZD@@@@@@@@@@@@lȗ/x 5h@ݻwܹs駟D\9ݎOK>(U;% ԯ/'i:u;@@@@@@@@rV`Jiy_4zڵjqv@d7n;O kWًZpn@@@"#b)@@@@@@@@@@@?o]'Oּy԰aC͟??='ɓ4NI1H ͥsQ*        gGJSJ={JjIժI{KeJJ[O%AV4h.1+]Cs;v$D'G@@@ "jEB@@@@@@@@@@@@ ^7n9srʺ袋G+E۽vcIŋg]4ұc!T@@@@@@@!;aä[nʕ5FZ&LH 2DI*Y2NS@OVL?G=&X&9@@@ ԊIk@@@@@@@@@@@@ y#|ԵkW}:x`,r4xףJ*Hܓr;KE ivi,cOץĴEV.lE@@@@@@@عS6L\9Y3iHuki„!CN%ˆ"(^Ǝ^zeX?>'j.}2%p,   +@V^j           q"РA}ڷoq-p-{SK知ÇnЋ/J}Jy<[c_R%g4@ؿ@@@@@@@X8tHz!駟2•+-2e²֬"-]*-_.Ԣ7oQ Nmxۆ (11ϯHjG}ณ@@@6c"@@@@@@@@@@@dnM@ dC.]r%\r}rk5, O8PůJ/-[&=?SO_Z       W®:t.4ȸ-gbtiyD 骫ٴn-,q9 75kM6ڸq9|C^z)SGbeE•2@@@C3C&@@@@@@@@@@@@xǼrP!u}^ht~K:u~+䅇%4o^hQi+sCcv \xt睒Nl:묤%?@@@@@@@@ ktR׮I'~EulʕRR˖I)fԫt|ԷԢş(<5@(U< ?b[V=㏤*QA@@6P@@@@@@@@@@@+]M6UBB_rP @@={"Q'O'U>1Q*_^9Sj(7GT˛skvj"z* G@@@@@@@L` NϏ/  /TVR޽´l&Ozj|:wQsQ{d69rD޽{ѣR/mf@XXeUpa7ϝ[«f}IZ'So]={x [Wj:xw^s p p)dɒ:SUx؅e       #d}>:gn߻Ine >#g;~_i-ӱc /H<"G-x5d<]pf8~_ D3zU\Y7pE|ZlvߵwiݴcM$׶۴hQYy~K͛w,Ž}7݃ӛxvgB@@@ xNWpNՀ"           AOF_~ p`b%ԳgO=) İamڴI۶mKnݚb}Ye&eӼ U1UHTti*Uͩ˗/ *%Z_tRZ*y^z{s୾xA5TLy晪RmFY ʸ$@@@@@XRNc5@@ ݻsٳmeطo_eKH_ `-?` ,B p-Z-m[œbŊ7Y_%tMҔ)|.#ڱC^{R?c@ +ڵ+yiXWl`ߵml爥0{-u'~lmݏS6_Z   ޟlYi$yXniַ@7D@@@@@@@@@@@@ K,lh̘15j&O, ܲ[nA ,j׮s=WS&MT~l<+z 5A@@@@ ~ԊkMK@@~=o.lKPW"?DpoDp(,/m~ؾ_ॿ$zBBɓl5Elzݬ;~u釁mV7Cl[ɬ,dsRR[_ԳY3+u,?> !R^ @ X{jlԳgmePLOQ!SvϰC_{5w}ߋv 5vB݃m nߓzi~Xٵ 5i\mKvN=sGَ  Zjeގ#@@@@@@@@@@@@lڴɅY/+V寿@6UT)E4eD6@n4v0,4ॅAIc[TZUիWWjTF s9n6 ,]Tƍ)S캜.ʂlS$5J: auP yΜ95f\|źKtWaÆ'\9    .@V_! D/ iƍOy)-#dߏ.]څ?d},Ÿ+n][S,Â<,DŮMl,`%uЙbhOɮgrTlY ^9ZQb^? :I]Bڏ?Ezエg+ ''{m[S/¢'iO Z ` ^cMi-"9Y[-8+^' ߲`쇜/4'3ko!eʔ9ni}iS@@_@_#2oǑ            I ۷/E,Z cIBY0T*Utg- ,xR<5khղ1?̖66/_ޅ8N~1e^:u 7[ BѼys5mT͚5sp8 xbe_'O٠WڵSժU+ϟ?@    9*@Vsr@@ :k׺>֭s 60a!J ^0 вͧrJTʄ/pabZbsp]+|7K$/#[qa[R/&|lכ bBr!F4xpJ{l{OiQ FÑTZ4m=|xXڽقRkv϶0-g7?ZB7g;ݖ+Wv c@@NF@y;D@@@@@@@@@@@??~G͚5K?.] sT VڵUn]7s9RJn0OŽ!yժUZd.\( eAIՠA]p 5``OXp'A۶m[DuAKΝ1chњ={妛nR׮]հa    C@q%  ~z\2y^z~7= 0+~Wf U\xeĠ]{&_/mwbӛwy!\}^^ک*T 8UyWn3ԸqYUZU~-o J$ݻw'O{Tuȑ)R{c˕+f?BxKfc% _hplQ,g,P,hZЖgy8%\   @jejS            @f٣~A-g*Z5j䂛?|\zu2 }/֜9sl<( 뢋.%\fn$7بQԯ_?M: ,ֹsguEjՊ9"eРA]=[Al+&@@@@v Q?@@,aZlY_~ѯ{~ ARJr"lEaZLDRBfDcnlUVi߾} (cOOTfMըQ#yiydU)\'-+8_m۶% Y_HR^Z.}v~v6}؂쳥a˗/ͥ~   je@q$            ,`I̘1C|GYX|fԴiS5n؅ %$$$J :tHϗ])S] rZ-[W\uF_#\?T߾}ݠ)m۶߯/\5kx 묳l}v^%~7ntapb gqk.WӜs9]dKRr==#@ ܹSK,qLS{ jK?@˖M7>a.gk&Wa~0g-3+  ėZjeގ#@@@@@@@@@@@@ ٣/RGָquV~.\Zh *ĹRl4*0a;?ܵծ];wM@@ ң>-_suUil _]oG}ݧ Ei$    M@vŨ/ ģ}jAgg~֦2eʸ0Zj Y8fɓ'hslڴɅXu9 9suy繹A.t+o޼q"D3@ }\W-Cl~zwHZdA˗U,@ HرclcŴЭÇW ϱiݷl|Jc@@bI@_M2oǑ            {ըQ4|p?^GQfdJ[v,qd0cǺŋ}رJҀDӦM߯ nO<+5OvR>}Կ-[V/9@@@@rS" X5c 9sdϟ_uqATn]7+W.yرc.\<[ ͱMrի' jܸ."_Bغu~'7ϛ7ϽXw+ZZep0g~K"}xŊajc8p}K ײvÆ U~})R$*ə@@@ bje@q$           đIhĈ:| MСڶmRJőMM-nݺ䐵)SSOՍ7ިo rzxzG+UVׯl6l믿^o{-7[@@@@@ nq· e/Nꂴ֮]B,@QF.,L+_|) %`9˖-ܹse!ufrus,XI&j޼ ț7oXDXxSΜ9ZJyQժUu`J pJ β@ :=* 1-5!!Ag}l|PL=NLLS @@[@ۑ@H؀           $ ڵKz--_ &ӵkW]wu*Y$L'` :T~/^ .@ݻww[?nh`3tQ7ovAZg Ooѝw) $p֭[w {!    @DԊ(/# i XHw׶mtiiӦFƍeZ Hx6"@Xh͘1C? [r .~/2]qW;YCN)d5eM-Z4˲2G.]aÆ2d, ٣{G /z(NZN3@@@@^P3@ѣG իWbŊe=Uji0-A  XSjĉv*[Zjm۪u*^x.n!UG w =(-r„ Z` @f͚0[?SswC=d(n:eazv;w\}ξ+ezߙ @@K@_2oǑ            c[Ry;B ѣnV*T(ZJsS?ЛoW_}UǎsJ?T`FXzGݻwW~7oްcv#€i;@@@@ P+;9 ģ={_>_GEjӦ Yf BgX@@@@@@@ 2 .tWRE~}Ymܸklْ0ȰS*Q!'O]p߿6lؠ>H֭Z&MzR rytwB ztjժUPzHi冫H~'Ԓ%KdZGGTij  q/@Vܿ@@@@@@@@@@@@ 8nI{;C?\ʕ?ZsN裏ʂ޲sڽ{M6zGqw뮻 Fae6       +VPNt?K.*\pW!@ ͛W۷ח_~e˖B*Y̙3l@X֭[p:_kҥٳ8i(-A{Nk׮ua ,P5y bB@@U@h2 @@@@@@@@@@@""`RkN'OִiԵk׈'Z ݲe~mmV/RT+[ay7n\/3'ILLO<#Go߾{5T멧j{~Lgw-,\CzW܀pYH|,@@@@@@@,8xN:{Ӆ jСjذabG zHժU־όY]veCU=WlkժU:մiSuM۷od/kFW\qj/ R&M#ߋև;QǎUdɈWuݺuz뭷\P JJkrZ̭rU_}͛܅d b1w1YFװMOLv׬,,l=Ov ֚;w,YBNۛE8)ݶGu֕Zb^|EUXʃsСC?ւ tѬl^k.Yqd"=YѴi\Pnv}#y_ߞH{3{܉#;oPV-Y_U,bm5kԐ!C"}ZG@@NH@bg@@@@@@@@@@@w=ZժUM {oXwz'Rk+u}hS>h޼駟#^ͷzKŋWn"~h?SO=K%JaÆz'ux7-[Tƍ+di      ɓ]VF4g]z'[d\VcնDq.|sbJmz"}f/𩄄vڲ5&Q• ;{ァ *DEN(P@~5ku6'Z!=Dt uϵ~B퓙s1ᖓKᖝE7;bZcǎՀ\?;SG*p.@@@ @i&            z\H (OS8"XTN '*JO?=W׭'C qSNUF#TpaU^=x _~۲j/wެ*r@@@@@@@9sj=CzUP*/^"gQ9i8}fB%K(bŊE9R]{5p@uMÆ ˑzpRrJ´7oCi֬Yn=y(o޼T5W쓝m2=> =m}HD[34i$uD=8'   ,;c*@@@@@@@@@@@@T Pɒ%z&r-髯rM_~g{Tl٢W^yESѢE]UW]\!XÞ:uvءF3ΐ s&w"+VCΝ;[nʕ+բE m޼YF҆ t=hȑӧ+={tA@ÇW߾}'oQ ܀8{nٶmեKtRp 馛zj <~&MԫW/ɓǕoX&O˗ .pu-RH/^O?TՓUt~Y}~W{>kfDzzuYg>Ӎ7ӭ[N˖-^Dbב͛6m_R=z>cY] jݺ|^7=[fl@[ϟ?#] nڵںuJ.eT6 ?UVYV.!      ػw޾""~1N9հ0W`}/^z#\?ao^ժUKH_Qa#wݹqϻ>%VQr:U+cfb4ԩjٲerw+gժU_>χ ru\Mǎi>3)NόCzP}I4h bMڵa}ljڴ 3#3d>#;i!~WFӬrtc5nE@T~ Q ;qcƌgߢ=|gU|y=s~jZ0ݻo>bgSo-a/O=Юղ?hm+[VR>~m}֬ߛU:?g>L6MK~_Ss_MoFmzmH0aBX{2?97[)Sי}{]}g >ѸQ[w~SOEc5  ēy&@@@@@@@@@@@@ jժB}:u xfop7 [믁Uz뭀7AK/uϽwx@7P'p嗻}`j s9+PD7B`ƌ7/>ޠ'm@D5k{4#D" *K… vS%KqV/o`?43;^P 2ryS$ ^z hѢ7xF K~wM/{Hu. r; [)kvȦmڴ xdEl`(|$裏7o|:xxko߾O : TT)J=~D8۹P@ѢE^JյPBUIANak4> zj\L33c5/ɐ!Cʕsm\+ )s֏l޼9ХK;|KӬrL>Y6vځ/)yǛ7o^W&z/QY./1_۶m]^U .pa~av?w\-{7Zn;'tǼ`ݶx¨g{_'HHHpD׮]c^ȥ;8g.rǺNGzBv ઀u֖^x!LܗwNg%!Tp]Os}mذ7kǏwv^SoF)a(P@ ƌ:Q@@r߁޿AIrs+r ?|@@@@@@@@@@@@H%/*[駟ǝ[o5k=C$n%/XJ=-~iyaWzWJ ҽ{R?,/˝sya^йB\lyy r+ /kx<ɓ'oݫ>}UGo yT}A ~%o}gnAofϞKo0'M4I^&yaiQO|;CSɏmgϞ@ԤIyD m&/K]EY{!N; <7 {m}'׮`e˖ɶ} 8 Z!/$xnEEܣFJЖ-[ "oYb_L       @N ;V^H+UIs3o M |p4T3S+W?Ou83\K.DÇw}?B3cg nxNa}gl vhҥkܶݻw~Kwyʔ)>H{4se^^ x~t΋z/kտW^//,[0/[6lXr[@A]qp%{+֗ю{̙3u RTVZٷ~;1b^u>y _|qɞߴilMܟݎg+ O?K(!{?e8eߌ>qio3jCKḦw̨?7jS?NP8G  b}ˎ;pw$I@@@ G?I @@@@@@@@@@@@ Z?UPl(gȑ l=U}8*Vjժ TNWa6>&zM6Y|ܞev*Ub6UʕUdI3t86 Ld% j_dn_Ofnti .f͚rx ҺfٵתN"5}t{vH_=]tUZ0W|@ݫsnmHN|fx7e},kԨ\ ɿgw_N>8p>k絢im-ӻ?w}]Y8kBͲ8W[}Wp?S$W"JW3(8T @@8H\@@@@@@@@@@@C ֯_?.)111˗/w=fϞsjŊ,gǎ.(,^*l) |۠VNi a=|pre˖ ]r%n@?ZA "5Yel2Y%Kkv n60K.L^O6M Y0ɉ,>       @ TVM .=d}>/_^oW'֎;իWk9߿?EVӯ!1) 8m^h[,Y2neS/^Yg+>q-?Mk]l_CM}fc{ Y9S%\ڴif_~=³>CW BCfBuUbsLăNO:vX57{5{Va͟??91{I0i?Y~ '?+b}qzr֭.4_s_>>p>kI >L}\siizݻWև8xv}gzD۵rJ{   j>F@@@@@@@@@@@l?7d2:IB.f:n}i˖-n9stȑ䆴,Hk[:`6Hv cp ꫯ4azʟ?*xlA ֭ ?߳gfϞ|z"$6(AF^'Ntg3Y?AқF´ZjRJ]' u P^=b73.X`)́VAF"u? 1eʔ,=gNm?K"l%%k${TJ_iQZТ~BJ,EDBRv/D7\{_x3g<;{?o߸_~g]E=CZj}Y*T(iR5bZ@@@@@@@DZRǎ]_D?` 6oެ>}`>HFTRkVϞ={no=Kg[Ħ_CT1  نoݴB >kmSO-t+*VW_u8kV?ڇU{jrmE"6(6;kQ&MteW_R:>,p+!iB9Ԇ|e.=zH]/VBx@˗/v&Tìc׮]k. 8Pݺu :>}nF=3ڴi>b}mH߁1U6lg;CѢE]I  6ض/17Kq)\+ y7n\p|Y(ܾ}gJc) Lc=tPYP^L@@G@->             &Sɒ%+I+V0a_~}թ[k^{׭~kĉ>}|Iqn۶ͭO2jl\[+(e$f1c01cƨ\r{4cElߡÑ#GVۿ-6̙M'L`.Vĉ:u~g~윬0ðat1֭[o'PܹݲY}%'OT-TZ:."ٛ -[؇ 溷Xh?|ʗ/;-Om=Mcg!}vmq>uq}\Rn>#CZb?b haD7pfϞ"~ڧ?6DDDuNg6mŋ^l%vv<'Yȧ~0B K߁eCzWsNǹ1 vfΛ7ßyBkl5c3]#w?mcCغsu}Y k׍g56]`{il۝曲o9Ls<@@@@@@@@@@@@@@@4!p@LCM 0xtʔ)xw?xEuWX"xaRnXE Ur^N੧rOL3 ,.]m(^|ŀWTeoFお+/+f{^Wȭg{_E0WL#_n]+vcvKVZnsV^W+\vwo %r;KkӖ-[q/W)x\[?@ʕ^Xsvbf$Lny x(zرsE˖- D>6o{X VeCtV\yֳƍ׶?/"p ppe#^HU rJ}D6?Ycg&Plx!-/<`/hn1뮻]ט> xVcڵk^@I+ x!kpv@x뭷r:t(}E~'미dׯϿ_\/l馛ӧO?k"{ɱcvO͒%;C>f>{mǴ~/!~})W\n*T|駁Aya/*0lذ+[l`ԩt?{!Q/2zCt|g8us 1 (ܹs/xAO#jClѵ/־D}Ɏ}9۵W]_X>:;pzAp/}@@V4Ooviao$c@@@@@@@@@@@@҄o-XldHs¡QR88=^yC h̙Bjsֽ^(y2ƒW);{'Oyp^6/L^ y!Pj W*xȯ"[K. _+%/h,^rx@ٳ(K|عDA|N1 2k륗^&/LH9rH}R/'ڽgq^XbJ= t+'{ITۆ. ߁ݟC"}zaMھ}YM3B9\Ls6 65Fnsklޗv_^rl?JykСCw~:rH*T(~@@H4oT~e׉/66B@@@@@@@@@@@,VSO%HORxj=Cjڴi}GԱc׋ ~֞={)dbZӦMv5wh׹7'Mkٲek.tw޽'O7ߜhNJ &SNZ`ԩڊt%~wUPA{Ϸ@@@@@ JTv Z`ʕn:=O-C8>S۔x>ҿB2zh 4ȅͽjԨQZg XG}~׵kWB\ {Iݗí=tѽS\G\@U {v…5d5l0.`]@@Zqj%tD@@@@@@@@@@@" X!wީ%KS#v7ntQʕK}ժUq6ٱcGZ͚5Srml٢}?o6lVXW^%vnvyTFD?f:ttE?vOΟN<Ν;hѢHNT @@@@@@J*ԩSOW^}ݧ=zDx#ܞ)DaJ<_ri}wuad#eH۴H.־}{}z饗wܡ[+V<{^Y \%v_BG OKv^`}M4IUTq7o.=ŀ  @:?f0ڄ           $/;j׮] &+TC]! ^У_|QݻwO>}裏t)UZU׿\0Y6$Y~X֫ZFRʕ"y:q^}U 0@u|B %Kc5\RJiʒ%K#{]_Sr~    a4 5k[oV׮]eEy" gΜ7|OTLGSNʜ9s ~_jȑ9sf۴i.,>I,zj5n8O,zI  @طO*P@7O_?: Ԋ            @8~^x5k_1cFȑduYp,LeN eڴi۷>w.]1j*իWO7p&NH>*VP@@@@^@7  :V\w}W};mۺ {l}@ X_%Khɚ0a"""Ժuku+Ls9صkƏ?زeK5kL+VL&qLHwvO5uT[N{Ss+W~4@@'@VZcK@@@@@@@@@@@HEk׮c=3f[nQ~TFTtJr X{N˖-s  &w_h6m,T AxϜ3eϞ]͛7wA 7sd0^#Bg{ܹ.c С KRșLRL2EӦM?E~\7x4hy󦜓 ۶m_/Bt!Zgc…= @@ Pl"P+.Z           ^モ[1޽{ӧs^ ?^V^駟֕W^K=OjѢ+tfEʕ+{Mػwڶm+37n+6%8k@@@@C@@RC4k,s?\VZԨQ#5lPիWWƌSsVp@ Ysq,L˖Ϯ![U`~4#`!vTi8և\ ȩSl,P@9!Z *uV}n{]h# J@@ GV@@@@@@@@@@@Rŋ5dM:UŊSntwhѢ9Xf}3FGwܡ~Xe˖MC$~vޭVZaҥK+؊Lu] ̙3U|z    )F@sh( p'Oj./ԪU#Gխ[78VVMYdIgJHOv?~ϫ[T)tM.oE]2OV#uҥМyi….+P͚5UF 7VPTt9|Gjd;`ʛ7ի4h߄)  Z jߎ-@@@@@@@@@@@@ lݺUoF={ tʕ+ pصk&MqƹV{U׮]]';~|IkjҤFE\,.#wQv[okd@@@@RZ)h@Hw7|# qڵ.LB kV%JHg) ~0:bŊ~n0/<O@,SNiٲe.Tᅲ;wTlTJUZ58-_2et@8r -e?zYV-WvmY^tdh   Ry@8           Eٳg?Ԍ3\VVԢE ϟ?-s޲eMSSΜ9նm[uEuM> .]w%+p롇RSy% >}څ=:q Ҳ    Zs-h  m{l  8~waA cɒ% H>;vO? Ⱏm۶)C .|f͚0֭[]hm?꯿R̙uW} ߩXj-Z4Lτf!6Μ9͛7²qժUڰabeh H8%  P@_Toǖ            F<3gO>_| ;U^]M6U&M[!'`E,d>3YFsvj[M7ݤ,Y?z^zI9r䐅FYȖ]IYZ~\A=zgQ޼y:     @ v! NĉZbE0@YS3j  AÓ,,~N~YBʔ)k&a]tQZgH֟iƍjV\F ޲!gΜ*W*wOjٲee!{2eJF$I!`.-$kڵ_huK>~]R%]צUTQ"Ey@@H@C;D@@@@@@@@@@@t}O]ە+W.]UTn]lh-YDwi;vռysw3f̘2O0׀;(_|իw=ҥ֒ @@@@!@V<@3  >2gR?@_fgDsҺѣGe˖`rlܸQ6lpˬϊ svqa}YO  _Çоuֹ{Ww.p3^z ײ;ŋ+{m!DK G޽`gTRP+B6ڲ,Yc@@ҖZjߎ-@@@@@@@@@@@@hΜ9k-ZH/͛6%JPժUXreUPAVX!iX>?/_F+e@Q͚5UV-WµL"YfU&Mtmyʕ+W4:̎r!,kʕLnZW_}u6ͱ"SNuAZY)YN*X`w̖     j%)7C@T ׻ qU,ߐ'Ob30bŊhѢn 33Eo޽{}v7n۶-sapv bhpQlYϟ @|Omj!B6B vH"*\/_>B}0*piw޹s,զ:tj}$Yo߳-P9_)   y             X!Kt9ر X9X\9WNJ8Q)~ǏצMo_՚5kh=,<ˊ\s5Zj ɲ7m47߸F5lPZR˖-U@54oeZcƌф {nW4[nqcuUlR:uJ?f͚F ]M]vUz(b& E@@@@ @@$`Ao@ljFAӫPB.@,#t ,dΜ93iK߿_ևHXGhȦ'O ̙,;@IDATSfA(tj}W\@ %A ײ@ !?owcL2c~SyZEɔ)68qݟm1t޿o2 Y7?hզvΝ;:S@@@ jŚ :            @ ZjY蓍6Xa%Ktnj)Z+,!Cmt͊ X +a9XV kn_H"2 .X 0ˑ#G.piʔ)/t1ծ][v _Gim.jƌqղB(XfZ6V^ ?Slߺq:rP-Z~<¥ʹ@@@@.@V@H Gu} ߁bAHڼO.U@7 Dʗ/_pb ~Zn᯿;ful ?ֳXAl6>=6_| S@ MJ}jS{aG~ҥsN=֦v_{[#v͕+ۆ Pɔ7qwo6}|>2>xY'k!ټ}:MXYt@@@ P+jߎ-@@@@@@@@@@@@D?P 6ƍyfeE%<ӧwř?V/dٳ'j/trEB _/aS+^;X) Ͳ1K*2eʸ e*1 Y. ך5k+`!R~֕W^y,)r{+6`TeS e,5JbvLX YF+Wt!v۶msRW^=eS0     @ P+\K@H~J-!4|;9sfZCΜ9]eh9rp}"O/"YL2ԩSFobԂ5,%teaZ6|TʮEh8i~0y{0 _رc~$4t mQ v~Ȗcm6۽v͖-ݨCYݓCvm1>mhG6BT]Aj~ZLQI @@R@k;D@@@@@@@@@@@MXXQhر#̊6YC,Y@_pɦǬY*cƌ.(t:oaEO+џѣ ~v/lJYqB  < -]=}+U\9e[V+VYYڵk]1 3WX1apV‚l$͜9sp4k+a]1 ;PY[}ҥ]WJb@@@@@+@V꽶  nW_תUԸqcuхGAN!OSX_ lB>B,YryNܳu%B#C g e}6}Qv6G#Ԟ#O/CG?ßZ?c`}bSbfaS'ѝ!b:LÛd}#+F{elCG[n_>6Due}Qv18݋݋??gjR@3?,4,4h4ȟL^#  @J P+W@۱%            Vy+[N #EFӓ'y < y=N؄I'miJXp ך:u v*^ jժԩb-!^m޼ٍ[lq!d~ ó}-8}^ .ϟ_%JPɒ%hY) @@@@&@VZ/  <۷oW߾}5n8կ__*UX |hߟqZ'_dRQYUCOam8_T{/<Q/3~Щ臀߉/ȑC6Zގǀ @l,/lX?4ʟrE<{S>w#O S:\en94+|hWT~?<ߓ(OC>mݏyێ@@Hj;D@@@@@@@@@@@ҼHX| ך2e~W(P@z jР+=6     @lٱQb@@ XXƐ!CsϩPB8֛"     A             <ŋW޽5|ڵK;nݺ@jܸF%+ŀ       ';\r^w>}fΜ%J$I͓ח*TΕK 3K-[J&zVD@@@@@ (@V@@@@@@@@@@@@_^͞=[{՘1ctO>*RԩW_}U[lI@@@@@@@ҐƍհaC=_fZhdSJM3~#G:NjNZDں5N2     "P            a*+W.uI|ۧɓ'/?%Kjժn t1        @>}ZC Q ŋkʞ={0ԶtRQ&nQʓG4)LD3@@@@@RZ)RP@@@@@@@@@@@@,-[6lR|٣/R5jЛo+OӉ'R       @ ܹSM4Q޽էO-^XW]uU$:%q[ҸqRϞ1lfo7h 'Mf 9     a-@VX_            @*WjZv~aZJ͛7WթS'}':|pv       )SB ڴi.\g̘1I[iӤY r0#6     iH@4t9U@@@@@@@@@@@@%PlYW?~w=ڵk:t|yŷn_i E@@@@@@@ իW/nZmڴъ+TFHk%?nQ޳~oFuv~֯O#_@@@@@&@Vj            Q-ZT>Νݻwk:uꔺwﮂ ziĈ.p+Y       @ذaj֬cj„ 5jgϞcTdモWO&$^*P@4)Aw@@@@@RZrj            D%/_>s=Ow^W,wzTHժUK6m,C@@@@@@@ L8QUVU|ro>Ym:vm)."Y͐Ajݚ@Eeg     @* P+_`N@@@@@@@@@@@@r̩:hҤIڷoMejРA*U*Wj@@@@@@@HQO#<➙wU-rɓ$-'LKoMV$1۵V֮MW@@@@@%@V꺞             Ț5Zh1chϞ=Uvm5J*TpA[?,Y@ !       )ƍ뭷҇~7xC3gN&yu RjҜ9R<ҌD;hzRBĉvv     JESA@@@@@@@@@@@@ 2f̨ 7۵h"z뭚ΝӧO'a       *rJ/6lؠ sΉzvRfRҌRѭ2KU>mF4)eV#    $ZI@@@@@@@@@@@@HqҥS͚55x`WP̊uMW T`A}ݚ5k?Ώ#       ^jUZTdI-[LUTI1BACC)SdkJ];_5kP@@@@@ / G@@@@@@@@@@@@ *VkժUZ~{1hB ~uФI'u8       Q 6LZRΝ_*_|Q w_X^ҥK&1jז &NL6pd@@@@@!@VʸN@@@@@@@@@@@@(] ZxmۦAi߾}ԩ+>v-hъ(@@@@@@@-p=Cݻ^xʘ1c% }Uj,Hm+M     )L@vh.            *PHSsў={4b=z`jذ|Mر#\Ov!      "ǏM6շod;'Nw٫':$[[I&src"    Rʕ             yꮻ̙3~7N =bŊmذ!ME@@@@@@H)V7믿V퓭--gIgϦf͚%[{5k/ MG     )E@rh'            )T Gj׮&L}iƌꪫ\V2eTbE_VJgH@@@@@@@IjԨV\yN:ּ E^['Eʖ-[)9.Զ4iRrc"    Rʕ            ,Yyzg͙3G׻ᆱJ*tzG+3@@@@@@@R`޽m6}\rRcTdZ J l աCK+/ڵ֯VH+gy"    U@>            $@ ԠA 62[xZniӦVZ*ZzBN: d'       W ""B7x:NW\qE5RRLi.-M4IrRƍ]y5.&NLVpl@@@@@p P+mC@@@@@@@@@@@@ KN5Y/֯_UV{Zp+vV`AuU3fбc҈        [ܹs&/)ŋu% K/!&LPV9sdjY];㏓@@@@@ < B@@@@@@@@@@@@H*T3<+Vhƍz'n:lRW;–;tPv@@@@@@@tM=_.VX|`/V-/K.)6mҥKաCdk[8nph m@@@@@7@@@@@@@@@@@@ ̟?_}Qr4hf͚Urc.r=#Zhvء_~Ytµ7o{OK&kk:u\ZѣձcGu]ڵk_>lɋ/ּy#DTzu-[LVo߾z饗t-رcnD'@@@@@@@(p=hɒ%T\9mܸѝFL]cz?o!~+ihi֯_=3~wնm[e̘1NΣGȑ#gYfzߑ `E1>wC?4w\}:|8`a![n%4$M @ ݻ}_{i\:[KesE@@HCjͩ"           )`T 6 [;URlRǶp׻(daw4qbbU:ur=kk_f2E@ lҧ\?MZn C@@o:@@@@@@@@@@@@ E;vLڴi# z's`-L_v/ݻ׽߰aC{ڳgY[@SO=͛cǎσ:uʅ'jJV0GQ&M1l po޽eC q7oZn-{ѣOzOM6UϞ=_߳iӦk׮};yt3g7߬w}WvrAn3f(_>}h…:c͒`BdE?| -X =]^zo]woƍUn]jҥKډ+υ;xc}KIv|r :4½]6<nq~MO?YŞ?쳮I[Cd}]BɄ< @>bt-{믿Kݏ~k"?7K_Eܓ   $ZI͡@@@@@@@@@@@@(pk5{lW\UYQ "nV]qn h4h@?W$)Bؑ?l޼Y5kTb\!,+e}ʝw CX#+2eaXvUB}seG@%z6Tzu:tܲ,۟ۏ} >\SNڵkfc^{5P@m>j˥$/aĈ_@f;tl9r87wq/n/`e? >f`S9~ڵ]_lٲjժ-"ٳ-Z-[3w}6tYӧw}mucOS@)pAwOڴiO ?_~TYq2 t˝;,p>s7JB|AGPR%ZJ˖-sB?\[-.oy 9s {2+u嗻ꢋ.:g;     VEǀ  ?zɞ.YD9sTXSrcexaƍթS',XƺvO?=0`y=S .F|ꫲ/Sy*R{fo!&6~o[f]VBl={nf/e޷e6X_Yfq+ @eϞؽR}v׏16R_ٽhڵ*[ϋ/M裏~tӧ`\S޼yYرc]_ *3  6?]͓qh,"           MxAZ3\e-[ * +`AB`(]haG'OvQ=\V9\)ۮpn-[HF{!Cw9u> 3Xe d\f:߿_UTь3TvmӭcN>VZ۸uV:kH6 ,_\Vꩧr֭[XVlܸqP?gr-+y$ݺu2LHv?w}n)Ypk6~x~lw  @׏W aZ`1Sôl?=K/ȑ#1aZ   w'p6Ð};Wv +P%R]UITPm%]% YƾDe|g93yΜy#@V<@F@@@@@@@@@@@]ҥWD!"]{}v Ev-<ՒZO?ֵkjǎn_,YܱBHy)QZlŋsk~eF'NtZa+Pbz!Oxo뮻dΞ=N_\.o֭[y晸.>bUO?-[P >׽`}4~xWj ;}"$VܭpWoCe9sʊߝָqNg?       ӧOרQdc7wcѷ_z9[')+Z5={… l_%ۜgͳ x|yyRb?            @AA~}iQ+V{^Pނ y-[6wď?xőgΜѡC}3pqƹBFC Q׮]e>t5רf͚Oŋ.>kj߾;x)Wt)I'v튾~ `V7o К0a}OH"jذ~mٳ'ѽnV|kΝQ믿tU\9W\zsE@@@@@@|N $$D?zbZv|r.ՠTxi*D]Wjq]trpqx;SWѼ(yJԩ7(P=XfC95jPZdn;wN3f̐XH֘1c|HMaXXԩ׫snɃ>֒c7d @:r};wlYٳp]jٲf?>e"';飏>wzɈ@@@%A@@@@@@@@@@@E d[dIc~'e͚UޢPVȊY8UB+reMkFBhtwTRz7]W۶mճgOwgy&BFvc=cǎڰaǏG_ 6rŊ0`)?T O${6/~R/_>YWKN^Jcǎi޽>@@@#@Vb8@@@@@@@@@@@@ "En*zw] ;`.`W޼y9EuSV>Ж-[\!iE˾}C9sf=.aÆ\ʕ+nʥN:E>=yȑ#>+$adΙ3f̘)\cǎU>}ԹslYlٲ]vÇ5w\U^]o*VJ*i᫯q܈#bZ{=~+r /hʔ)3f,X@@@@@@g+uV}k 7 ?pҥxIm MKjQloϞ=uQ7'OFhs.l.ל^?9då;S͚5s̙3#n'kճ>[kOn.w<Ş'dG|^;wn*Uu-dDb}϶z 'N@(T~Xݻwwߍ~u79 .~u/^7꥗^r׶G oM[fM͹xe^u"_   O 꿲#@@@@@[WK@IDAT@@@@@@@ȞKo[~iWhРA ҡCջwom޼3_|P;vg"XtS0 Ѳ^|E_UT_@Es8 슾X뮻N.+eϳg 5{ڰaS >X- {\qƹ"H׼ydŚ,X l8q+qm/ {;ާ Tn:r+U`Ȼx    F*U)2   /{қoJO>yOۜE@+oS ̣^zI+ye\fab6mRɒ%UL+`õ{nYG ׆q)8#mg*cSvL{@ }Di%=hߓ"4R;… ڷo=s挛hᑑ"k@@HRÆ ?#%x            $Y r$_H2gZ_|,hZnµZhG1]C@@@@ MJS~n $IgϞnuƍ*\paaI9rTn|8#H'K'Jߟ#?lL8$$&EA*+'}ԤI@`f@@@? P+/XpOL@@@@@@@@@@@@={QEsIfs:XΜ9 *THo4ee̘}+V)̙3FVԵkT7B@@@@@@#h"?^}Y´AAAn7ܹstg}VUTǎ҂W_IGN kw,YsŸ6~' NeJJ} 3o5iORNh  @ 2)7D@@=j߳E            ȓҖDCj*ݻ7J\lYA x*Z+`       "pYO#jݺ:t萤^wYk׮MOgT͗M1hT~ ԯ]SL׷P<~"G"   n"  (g@@@@@@@@@@@@4j$U"98uꔶl͞*lsoVƌe+<<\KVӦMշo_UV--    ) g*D@RHgxjѢES._AE 1i{Ya9@@@@@@@ƏkjԨQ JѮxYհtҢEi(v".ޡt`A"NP@@@@@t%@Vz9             G 2nӛo]vV׮]ߪQF*\y͝;W.\H @@@@@@ұѣG /'P*UR_|!h!q4g#Gގ'Bti[Sq"    +Ig@@@@@@@@@@@@@ W!Chڶmz)[N-[TԥK͘1Cg pG@@@@@@s(k֬}nݺ{ZLmwC@@@@@@8pV^W^yE:tP 4m4-_mO n.3}<])q >;^UO:.\(eΜwz 5}5   +tɳ-            ? -=XZx԰aŽ(H]gj.\N8jժEkU\9u@@@@HF*U#Sf@@ Fիkݺun_r/WGxl%@V_h q&            @(P@j"T{)Ե+aZMx/ Yf=zBCC|riFӦMSڵUdI=.t+,,̗B@@@@@@@N:eʹ0-[N>~XժU_yRϞQO }~}y@K ӊV7 {LZr;m9@+(7O@Hnk&(C@@'բ            @ XXV\_I:u@W<իÇ+$$D֭Sݵh"O*\+d7g?WA@@@@@@@l 2i&y睪UvӡQ8!M/ xҭ^aZ\P!i @|5|:Ds@@@HZ 0@@@@@@@@@@@@]\YXNPB.PxqW .5j(W^*T5kѣGk靂!      @vc;_~nт[؏X\Z$m2fmh" qG@@@I@T؆            @˖RWZU*[lA+pת{={9)S(0`,xnݺzd6       //؉qwF۸e4i_vpUbVx-Z5)8ʶ& oʓ؂  0_ӏ_<   dLlj            @` \sԡ)"F>s!@ ̙S;vµKUPAÆ 7ܠnI/6nܘ`M6j۶N:8@@@@@@|K`16h4hPb8`1cL{.otrV撅o@ҬYRRhUSz@G   ?h4:H@@@@@@@@@@@@_sW 'H YdQ֭5qDY(ւ T~}7NUVUٲejժUdbYfyiٺvXd3      ŋݸa=Z9+V3v(y.bL6)dIf̸ZFnjx @z`fz}e   @lj&v@@@@@@@@@@@@X7翼ۊի'+@VӦM5rH۷O+WT۶m5sLխ[W= z E|7uTeCCCu-hرI@@@@@@?ݻw+<<.]B .nݺ-YjUXX ܲz:tt@@@@@@ htFτ?\]vؖ!D^-Ϙaԣ-H0k'\)]+=9sxH[=?%UT W%|ͫd@@@?E            /t|P'6/UjРA.Xxm۶MwujԨW_|n&mذ!.#      ܹӵ(SL5kڷoKK0%is^xAڻW3ND]D`dDˍ@@Qg@@@ p.y>=G@@@@@@@@@@@,_)44Tu SNp89}ʓgn}2g,+~e?2?39n,Y(5kV~f˖Mٳgw=3>-y@@@bhHRE92#؎ 9[7yL;e?mL+xULcVǝ?_|֬YGyDիW2g1ș3/ćJݺ]Բp-%ԯw^ *= @3k Fs@@@D xyS JK &?@}@@@@@@@@@@@<'Oj˖-ںu[7ݻW{ѡC\q!Ue?-([lȂVo\PEA0Vyø~VȻ5-%KDeʔQJZ|yW8{,?@ 081g Y:wqƹ@1-"he[,c+0jV->S-*rxUǶb8sV qLaL^[.~ ղ‡9r|GΝ[w]cv>     j%&B@_1cǎ!  u<۸:u*Ed˖͍O1(em*z薍QE_\vw~SH{VjzBBՠA7H"!ńGl<}zIAACTT37h~z߫c>]@7µJ* *9,+VTeA@*yx  ZI Jg"           >/p?oV^~A6mrVXnᆈ@V… Uyb)|QV Yq.+eExY;v YҥKjժ][k֬Yb{@ ̘1C{oeٗ_~ʕ+_q^Y@[>,lǶZAo!A ÊX@ 9,*c `(ci];{ ز-=ضEs %OXH̟?[]Պł   %@V\:C@_1]ou.<dPEu^Z"Tyܹe٘}J,66=ƈLOvaGÿ5=c{=Iu&zT"]/_` l-S:-[^(i?lʪU~z7_,^;Rd(Xy&jǍ˨޽3pCE_c߱[y.vAתU+b@ @@@WϿKK CRzNVR8@@@@@@@@@@@Q oݺl2Y[,4[nQUR%UXхXA"_X8jYQ-[x bqBCC]$koռys5iDVԋү@N4uTYq,N?oV, p&+ 9)rȏ0Rx>eI3+ > ȋp*TȅkYD+}"pƂ   )@V`@͛7qs;uڹsgD`u*UYP#³!Zyn'f6y1oؘyC,Lؼj&̑D'ꄳgjҥnbOX в 55k*{],H|e*Ck|07&Y^=~n}ٴ@ @@3t;D@@@@@@@@@@@\ @\R3gqFeʔIuu2kvAZK&VjZj,XuֹV֢E kNUTIʥ9|T YZh.\d ڲBeF^,T)[lZժU]@oR…#f4O:Vop=Vξ?>|%KXu]2eʸ5W\~A@@@@ !j%Dc@@ lLc͚5nݰal q!P3ge˺ ec^, ;wرCZ0#m۶MvqoQ6Xzu|n$]f̘sjٲe͚5P< л~Ʌk-ZHK,mF ׺մiS7o'邜 d/?i  ZIMJg"           i&b M6MӧO׾}\VZD 6TӬm)ycǎi…o5{lRbEuA۷WʕS\R@̙3_#V+fgv’̙3 <%J@?)Ba2/?#,|͂ݫ={Do#-+g)#ʕSܹ#   Zb@ҋٳg?jʕZjV^ƺ%KtaNdNZpVpppzƆ6n_daZZԩSGuuk2e| 9,Zl͛y,ŋ&'K{.\~m_YsZ6µ]Nj.5״]|4k@@qt;D@@@@@@@@@@@RU:M4I~YԽV+h,_܅͜9ծ][{vfh$?i&m޼Y[nXwޭK.)((HŊsHld,D˂XH {oZ;wԎ;"V{Zh}zW+ dE-yoī5@@@H~ߔ+" @̴d-^駟d; iZV-ըQq S}5k\ BmذA/^tc 4PÆ ]@cȍ͙3Gcƌ'Ou]nKf\8Y9x?{GyD%J45׌3@@@ !j%D)cԊم            X믿S*SLܹ}QW\g 0 jܸq5kgϮzHsŭҸyBak׮uqFye˦ *DY˗/eˊ {|/m6js˖-:yk³`- ^[=!C D@@@  W" 7oٳ]uy+WNT~})S&,`htRXBJ.- jٲnvȑ#mlȑ;vBCCEϞ=զM7m ф 4qD=zԽ_>R~\@ %57@@@J@q&            B3d͜9S+VSO=N:_YAwy%޽{9,Y{FMBrVLt!Z'NpaBUZ56TJj גV%N`߾}"Juݺu.hB,nR͚5Uvm^G#   @ \ @ײe4}t}Wڽ{ (-Z&Mxl hժU7߸`5Em۶n-TPzr#ozi'sp ?3@׃Is,@@ :t;D@@@@@@@@@@@RD`Ν0`f̘ի_+"K=>C 6Lzb./R\ ,,L6lp׊+3rʪU U*[l)&n/ \pjY֚5k\!E+t9Sn]vmnߗ̙3Ri    Z@t9@RM~Д)S4uT:tH7xnjʍeȐ!Vѣ7oK͝;WgΜQ ԥK{ʓ'O60n\ÇkkFO>ܹs'2K,/o>7G")|y]<\@@җZI= Jg"           *`W_}U%JiӦM#/vE}.€,`G", 9.]ƍw߹BN:… ^zn ˚5kb/_~VZB,n׮]ʒ%ԩM„N"   j:D@ }T4iƏ۷N:CG'U X蔅$}gꫯdڶmG}T< _ÇS~={d -lcɛ7/4 ,|͔gfʸrU@@Ot;D@@@@@@@@@@@M`ڵҥ낟~ieΜ9ٮυ] ѣU~}ŴX@ ̛7OVoqJ* Y L2QO$JZd/^֭[*W\j֬Zl*Zh    Zq@qzKw_ݻwwZW. 矚1c>7T\9=z-[6`:y)S}>|J,mF^tI} *6n_O;@`fʿLyc  /@V_#nǙ            @ׯ4h *Q(YXc?]*44T'OVVb=_n={v5iD͛7W-tu D M,`ouavêYڵkֲe˦I)   I@j@RV`ҥ N:.XB2gΜ7N`5j>C멧?|6ƨΟ? &/{µ~i 6̽WR\hk|n   [j%ȐS9@@@@@@@@@@@@j.^ݻI/ LjDvn5O?{U6mꫯ&DB Xa.+ְaC/^\T}=zMV:{o .\XFҥKk.*-=N[oU˗׆ ӊ +Ν[&MqƩE|@`f&k:4!q    @ ],n@@@@@@@@@@@@@T8-]Tz4zh=۷F !b ޟ1cϯ:-/O?T}v!C ڋ   @ 4j$O*k0a6m*+7hki? ={V 3_d̘1zO/ơRf!fZR޼y`(P @t*|Mxa@@@8rD*XPZXj0H"}@@@@@@@@@@@@ Svj*-\g#b25I, 5?e=OTZ55nXV$f֬Yڳg|M´|%ED/_^ֶm۴|r-ZT:u_ .9s&X      @̙ *𚯾J'L+qY;vy.<ЩSq?waZ&gDŽi%qBXjU7hkwɄ1 0_3T|TV   / G@@@@@@@@@@@xǵxb}7Yu &OB3&@xx&Mr'P6m\ִiԢE @ڵ5~x'Ԉ#Tti.(:D@@@@@H# Vׯ?i&yinhرckŊV֭[& }zA4i7(Q59q^g  0_lk&(C@@ҧ@%ϒ>F@@@@@@@@@@@@:u:v3f{p ^zIVRXe˖ =cʚ5kz@5x`Y]a=p@@@@JF*U#@,gϺO #w-[)?C>ϟ/SCjժjڴ>r XZݺusϹ@ @RT?)o@@@  /6LS 2Sci+            'NP߾}ջwo´".]5tH[~hţ&NN:[n.IeQ=\(Ir_!ZΝO<&MqڹsfaZjm;S }<>@ڵӳ>eO. /{OZrL_tҚ;w_v;cƌڵ~wz=z_F#     6ֺuk_^+WLO9syzR۶meWt/RիWwŅ~+ZvEW03<:ȊH 4cvCPPƎ }'W{9G M߯ pUV7ߔ`K%<<\7nԺu(ڳgb̙PNj3{D(`|kǵh"͙3Gg\}1?m^ߴ{n@kބL2-[Bjժ 6$     @:ٳ7t PB:e»1%nWr_/^|Ço߾ر6mۡɶ}͚5Oe1rȑlM/z뭷4am۶-.j*UgOMxlR7o /Kp ׌uk޼yQs}Zh!F|pLk&S@@@ P+^l           i'p3ƅ]ʕ+Cw̙3륗^UwiȐ!QsϭCr/V0sz7\8pׯyw3_֭[!C[nEO?/P6gR 6/_^}IP{3يD^|OcjY1,YR/VհaCdE@@@@@HSjʔ)9s两__#c<1Dr+_]S.]tńcl^D͚5զM$_#~z=v³ZjҥKkXb^ ٯJ۷oKq. p׌%ի{A+V 7ܠo}J @@@@@@@@@@@UH?1Âu, RJ1vfƏ"E;8Gرc#%烞={͛7'e)*`Zn vY1-_ ˓'O)888Es^xA-ҥKsZkg-}nK5IIm(m]}< &'&DgW =裉>7pYz뭷b;ܟ ?VBYcP7|ŋ{%Cxkvh}l.Iv:䶭\2b|j   D P+@@@@@@@@@@@@X`ԩ-9UVԩ曈Xaٳgm۶OV$;o}sWZ}Yf֭>k֐!Ck޼yovc?GrʲQ Ν[_oɽԭ[׽N~mr_!bvڥO>D\sM')cӧOwA 5k +.wjҤ&OqCsӧ>z(si{]?G`…zduɒ%̚5Kvm ׿'OFK胙3gb>#m>6=EwܸOO1-ZD&!!!_>,3C?c}:uꔦLKvu뭷 6$):~F_~Y{ճ>6mڸɮoEgAe'NиqԥKժU˽[lqôiӼ)UgąᆱkV Hp{@@@@@^BlƑRsk\=14hj߾Ol;nJLE4c ׼W_}U+VD49Sl˖ۘϲebH ?(Q5jThcb[N{6Zcx<snԨQ66vm6kSj2-[;bAHw͛H%] 5w~9iҤ(s2Fe=6'WY_Fc w5?y5z  _5z           ƍ]VJBtnvYQ+c-b,ĊXȎ-{ѱc\]jҥWlRVL'رcu-[kԩXX *… Ok^V[)rť ,_UJ BTVM6mJr-RT~G{B }{q+c!~dV,jʕ*Z>SU^gYpRzdz'NT9-B~gy(P@#Fp:w>,LЂ/+VtdZϑs›nݪ>}V-k֬/s#<۷+{.lT0eE T1ckRq}86w(6h[`UT)ge`wHɒ%c9Z~`smeʔwm۶M0a b7p~{վ?-W ׳0-{?Z@@@@@@?Z, qXVӦMݘȼy[5bu6y,\駟=K/j޼FTl|?zl˖ۘOǎch*a:"c6g N5ڣG81CƄc{=3g6h;6'%buo;nN̙K/5I7|WOkq @ PUR:_3,,L+߉+unSrd1_|)"\@@k ~z           Çc Jٳ+D5tPwف6l[! A/q{*U\++Э[72l0X2m4}jҤID  $bA~wf 0 ߲{zô֭['Yr,l׉łYd]_vm̙SAAAs۞kgwwPRTiǟ!H! 9KD9!>.(YP% HFtȂAA~oo =9뜢+SO\ky:u*}z, /܂:i֬֎cjf!G$fomj\3gԿ/e /^¶3~mM?~笳ܹs˾wɏu v>ji6@@@@@,`C| lݺUϗСC`!V XP"k -ke}*WBޫVO.1ؑaEŐPk\eYbmx^O?ul-ڴ+U%Khn'O=@Z:ydZc"YR5ϿC @=m{[n:s{ߤ@  x_3 P9$   #@@@@@@@@@@@ȮaΤI\) gϞUj\hXKٲeݺ]7v-W\6qWk޼y8quLQ|yoT)R:#=>}-*W\U|F XQցXYub^`]˖-u%hڴiNc>@s_,8.rw 6p… U֩Ye۷6wS!7XO-,;-DA`.]au" 'ON=7޹3PE mرcz?eu ,тG%7@fbŊMXP6*W~{b},aY(}w1pi}`e@@@@@0M!]=1mߥzzeiZ/'5.woyߗjû;d]^Yk/lm64iD=q3F:ur@ k $q… 5n8Y8dBc3sLom3f( z@@@REZRP@@@@@@@@@@@@ .޽;^~z>:;-[7Y 6x(9st?-}myZ 9mҩw(BTJ.}޺X`ʮAV2Cy*c\_k׮]Zb:wc[v?Gޱ-liӦwϲ+WtJ{Xn,x޸vZw?;ӅnٲE]w #<~x;K=׫[B1NhC.2o7@4V%{;d_~ejJ ;>)';֎ ܹsݿP(e@@@@ NآGS9}FՇ" @= Iڞ):XBbxڴM|ȑ^L$Ĵ 6T.wCɒ%ošv׸܃-O6'jڴiڴi ղ`W^y|n!eD7o[qZ KB4-1@ 1b~TL 2$ޣaz={t0׿Zt{ r@@je H@@@@@@@@@@@@ s\|ŊLzرc:XI6,X ƮʕsK*cyZ}Q ^ Kٷoԩ8-g[n!:5bĈdO벥r: |Իwodǵ`= QڱcnTYW\/BoF~z[7o(gΜѣ5n8YOo1 䞛1 LJ{[9cǴΞ==z:5k\p6ߧx+O 7%&L%\z?a iZ_z?~܅}g;vN`mlղXlXdz-[z[ԚFv@/1ͫ 6Do۶mF֩S'=m[Ə囹k(C@@ZY:R @@@@@@@@@@@quεT-ijT`AYeˢm vmQDHLӦMV͋O?>h"PLuu؉ʕ+e!!?]viqx@ڽ{}FUׯ>g˗/jm3gNLҥciΜ9n_;O?sE-_p|ɨ Xݳz)_qΝ]=x:0!%ܴ p߱ucw͞=ۭ:݉k,F8q Ӳ{yb&GqmcSC>(wj1      t" :thS$g0`"""\~({`ɉ.RۭӾ(W\L*fe!\OTc;^MGɮ_Z -[k|ש~jw mxrvcڟ-YuÆ U^=-]TOڅ탹`;b@Hkƴpؿun [l-۹sg27~/[SLUN  d̥"            9Œ5*UiY=Һuk=׿/܅4iĝo߾}niӦ܂NC :oV%JO<6)m۶-*`69rЋ/^s4iyȑ#]N:u .`Ygg[nյ^#GTx߽N6xS{e]s5Xb*wϳuoN8ٱ~-Bl´>s 7Bl]wݥB i„ j߾Fυ꫶I[n[ r,eQAY`Ahɽ&7 1l6oN6Xmh76ĮӚ5kr㫯rf5fժUKwygf+ǏױcbՎo˽{ .=n8Wzulw)M4IV zjSB'1~" ʻۅm~7S@@@@@֞6|p;Z`A'XBbx yj֎oe]'kg}%X{Q];رc]׻ᆱ!Cr?qm!-\i/ v}gz}FtJn{9{\C _y][K/egAwJRԩS]~1 $^5owfw[ w;{ifQr @@@ K .'A@@@@@@@@@@@PΈ,:eRe$&]=֭N|zٳgvb0[i馛t뭷O>.Pfɒ%7o ;m>w\xQ"138p mؽ{ŋvmذO. AeA!|!jT>L H#rOL2ut׸qcיI=,@{Zr:2e[H… Ϻe֑^A0]v.$(,@ЎeYg}> 4h,k)Y'f*_ Aԭx6msXpѣU\اeY_f`Yg366Y~gծ]%o@bQ֩СCev $N]tիHYNnB,H+O<3grwa;dDYX믿:k׺#իW߭-[:N,Ҭs;fuGBߧ~?!}kӦkX~ )'E@@@@@ Mok_شiS1vĴXG-k:$vHjOPJ"{ڕOמcTdIY]Ӳ>eqkK.gx޺vjdO?F|;+ o!'N}pA{&ه{@XXXЪX|d-@AKh ,SjU7Mh7o^= .P%Wy4Ђ+c]Jip`R[nUJb'cשs. q:v옊)B˂3-Ye`u?[u]?u%OzzifY#~Һ@@@Po jժB @Xr:TV4>cdΜ9#kعsk mݞs\ENge.ZZ[ܹ]ӣ>q+vc4ŵ}J?7|S&Mr)9^b?J Ln.Njmx[lRT`M2>XٲeTN M5A۶mɓ'ݿC%iV}]X  YK`>)"B3Gj:k-kCVZ s|@@@@@@@@@@@@ @/TϞ=5a]k޽{u5$X{LzJp`Ȑ!zh"5h =O͹H Ԏ;OwyɲA1yxkjMgώw\d/PkϞ=P~'5j(V)Cu8vXYuf4|p%   Zo@UǏ .t;vE=\s^aRaAVOrH,wޚ>}*=֖W^=]yϒS'3/_͛k4hPH;S8@ Bx_5C{J@@@ k+'            @Rz衹snS ԤI"/R'B6n8Mu_|: z JWyN-[Tdd> Pk v-2'XyR,' ,paZΝׯ_?HnlAZW_}j֬傛2kdmC7NŋW'   @o jժM( $,0uT׶Q@ԩS;)8xz)}wyG NQ?=?{X´J͛Wϗ1 L5S{fjr<@@e}iuP.i蕍@л&@@@@@@@@@@@ɓ'u׻o,k*ZT=xkW@J@X}s ѣn&]zip6:ٛ4XgINR|BXA˲n:}.DkƍС^uؑ@b,D@@@ Z]X mX|lFA@ ?~ 6LzC}w}Wy >vT pʕܹ-N%KLx'@Hk&)7}4'   bj%H            \,!  80_ Ӓ/            o VZiԨQXb&zҥ۴sN}'.$ך"]4i$M0uU@mV:tPUjZH͘1CӦMsӽ{qƺh1    @ۨBZꭔ@@ ̟?_w}f͚TudSX~~m3FrRCp©{T€ vvTX  E`>)"B3Gj::u#uQ@@@@@@@@@@@@+`o-^XwV:u/ԩS=!p!=jڴ?#Ehʕia'PlY5k{:q4hUʕ+O>͛7g? j@* X֗_~O]tʔ)x@Ǐ?O?j"L+9      \~1c{N\r.fժU .pQY8R6mTV-M6ͽ}v=3!e׮aÆZ|JuI=zжm۲eM;wN}L>]SN+Rd@ kHf@@aEM$            'OСC]GJ*Tp\{!^/ޙ3g4j(=:{ }*,,, O `g)̙38|9rDKV-ؼys5h@rzBSZz-Z qӦMʛ75k:# 4iByy )   @o wEjD5@@ o}_^_|z傆U^#Zd{c)Zh(}W^ywH2p.@x_|,}䨱  du J{"           i*`C ĉUvm_zR|Ȃx YVwq+fQ~BRŋe˖uXzuY_u뺱J*n]HVB! k\zuh!Zui[}%6mK/T^xaΦ    j(C@ { _Z`뫯֭[UdIuAڵS۶mU|썔jom@-̙3]ʕKmڴQnXT,VX𫯾ŰsnY/C{믿uz="X zK#FΝ;]wݥkֽӒjX￯ѣGkc{Bʞ ! +fFl  Z|;D@@@@@@@@@@@U裏4rHYGڵս{w7֫W/] '믿pB?^'NԎ;ԴiSs=ٳ'}ܾةm۶&M{2Qk.YgK-̙3l2K/Ut 7nݺQ3YK:ۼys:cq֭ڻw>h"""T\9e2eʨt*UzZPٰ69] ]BljOܹSaS[v7X`fS hNVꦅ 6MNvmtm-_ʓG |c~StJvF@@@J  ֦k@ tڴikPU1z겐-ZC'Nynܸэׯݬ/ژ.d!fef5r?Cw„ o`ٵY ժUK 2pϣGٳ5o<2kkl׮ Һ+{;XLN i   JE%P+v           ̘1Í1`kYuuEvڪTru8s:Zfhɒ%. XV-jJ۷wAaE rSX'Oj^aI*=cǎ(hUdc%daKŊڼ*TPc!:tH8m~ORo϶}ǗR-[/_^*TPwKy K)_'{hZ~FLz8   @ P+_` @`+hȳ@/f(q :uꔫuX[ʕh6RL7EfpiY zSk' -[і[ .hadށM1,,,&Ǐ;,sqqv]I&jܸԩaЭyu~+;,ѯtjѢ Ѳ ZV>uG@@ P+a P+.#           Y@G/^FgծS)Z|dYؖu8Z?"2IÇ]0u8d7]udUUuU^=ִiS׉R…ՠ  QGT޽{eM- teΙ3,F زݛ>MmF ޼}{ug͇JabO8!Φ6uM?S89r} IJ{,/:ԋf#""\guY;/i:駟$ ز- 0u,lB|4     .  nf0v4h|mwKO?-_{oEmܸQ7ovQ[Jy[V`k`q@IDAT-K(‹ś6/k˲ڮ3`ڈmFk[]{݁lV_k²V`XJUZi)`K}b{,Te3gθvSn5jPŊcR\9=vZkM`9ٳ'+.-k۴X;,6Z@&TX  d_ J{"           RK֬Y:N-h۶m rc,:&ܹsB>.p`syuze YC6b::@."7Z0 )`0/\c^ME2B;>vN xo N,x˛|ϱٹϞ=v[g{7Iw_ωEtтż1oBϮ &]ly![7Xˠ$d+~Y7   @J# @: L(=nԻ?T+)y=.dS6sN7yk 6XlY7`GNyk@$ks 6eg;v[Tϼ6#ojF%K %{L2-qX9{8fػ,{cٱcx5卑?j1v}, {%v},J*VZڵkB|v  @5SǮ   @& P+@۱'            S!`k޽.LL:ֲp·â` JQiҥ]Vց B ղNuySF{j x p,;WF/0pj<e;Uml%υlթ#5j=ZȖ21    @Z" @H̘!=)x4dTF]{µi`m_XSya[ ,paD}`EY[#yA]4p^&1 `ݲWv}owYWaS/`˛Zg`]+Q ѲO@2B~x_3#9'   >j%ߙ@۱'              !aMhe sJ)0daCK DːrR@@@BB@ @|KRǎ?!կ5h*TGyD      $S@dv@@@@@@@@@@@@@@$&ը{B6n5qt?dvmQ:$d+3]uʊ     ~YziieKi|43)v˗/;v^g@@@@@@ j% @@@@@@@@@@@@@@M7i![6 ٲ:]ʙS ?֑!     6o ƎՓN:vlH\y+T۷'ncB@@@@@E              @Vjc5ZFe@@@@@ػWziHR%VϞ=ϪCp¬Z=      @V: s @@@@@@@@@@@@@@ VlRm,EFFKH9rHB ޗ9@@@@@ 9" .TҝwJAc       @AJm@@@@@@@@@@@@@6UH6v]-[,l![5kJdž  Be@@@@@$p?)3CIe ڽ{Μ9 s)     '@ CYr$@@@@@@@@@@@@@@ K T,x ں5fȖu o?dF- ۲-BC@@@@zsICó^]Q |abP-g@@@@@@*@VR@@@@@@@@@@@@@*I6^}4¶m1C ¤![l./s     dVzJZNi lZ| ;vZ)     dGU              @* T(ح[A}}e*22z|eiօUH!     /=dݥ5BSҥK+,,LvJr@@@@@rjeKJ@@@@@@@@@@@@@@(_^˲sgtmoj ޗ9@@@@@2Z知[nP+V\+%K&M2TsܹsDڽ{w      @ P+S].              d^r$6v zU:Uh!     ;vHIc_ݥ^t(S ZQ`@@@@@BG@й@@@@@@@@@@@@@veJ6v]u Ԋ_]-V65O@@@@@RSa%{N]>*tz´A&P+V!     @j%H              )PԹo[[Ν+GkyA[ŋ{{2E@@@@@ i'OJo-RX 4mmڰ!>,mMV6T@@@@@T P+A9              @ .-uZ?}]ivJ*Qۓ)      ;'}Ӓ=~ai@iĈ4{L͟?_E9GD Xֲeˢ>3     $E@h-              @*%uB׊OGmX%="    dgY/z ʕ-ZgyFCUӦM3QnZwNԶl      P+@@@@@@@@@@@@@@2d]}*̐ߗS يd     VxBkZ_CԫW/kN R? ڷoΜ9\2UP9     Hօlt*              J:t^ҳז/հtioO     YA`.s1c3mc֬o߾:u>#\ɧJҹs~zP#"     @jm@@@@@@@@@@@@@@,*PԾx`̐ѣ-[6:dQ#|2ޞL@@@@@2J/, .(!}tfŬ;CI&fdɒ1W)Nn޽jũ @@@@@K@dX              ڵ^=:dkRO@-/\˛Z     @ =+%=tR޼uŊ0`}Yi X>fZ       @RJ#             dE^,\+2?+ ,;'.}~VrޞL@@@@@2Bo֯UD=zT={ԥ^oҸʕKj%r@@@@@O@tX              @,pm[:|8fKCCJ:?d|yoO     i%z4`4}Ե4iTzgt͜9S9sc֞'%Kj߾}c      Z @@@@@@@@@@@@@@?z93d/^lEDU'S@@@@@#=RҜ9R O>_ʕ+lT |޽Aױ@@@@@O@tX              @2 ڴ!,dk2)2?/_I%KJ  ڪTۓ)     @B'NH* *)"%oRXXB{Jׯ}ݧSN q =&P+NV      @<jŃ*@@@@@@@@@@@@@@RSBZq#fĉҋ/CJ8?dreoO     _JO>) כֿzISk==eH@DDZ)dg@@@@@ZSs@@@@@@@@@@@@@@(THj?zOir)2?N" *^*U="    Kয়G.nM?ef0i&-[LsNl}@ɒ%e˖@@@@@HH GB@@@@@@@@@@@@@@W`AeKᇥ?~Y:rDZ@z9L믥nV,d];i@ix:~Mf۷O#GTΝ5|W_}ʕ+k!U.     @F %-]z&-Y"0I&{{ZUsΕlժU+abt`!      @V@@@@@@@@@@@@@@BC@WcǤ˥H8u|APٳRѢRÆRFѣoYDz 1Ν;s sΞ=[S}M4Qڼyn*2     ?6L*YR 'bNO={tٲe/kLBegu]B@@@@@l-@VT@@@@@@@@@@@@@@ 3 /hzX֊![|#_ҙ3Rx?d jXV-{l͜9SwլYSw^_!6<֭*Vb%8    _JO#͞=;jY(dgŋ l@@@@@2ZQ\@@@@@@@@@@@@@@1CO^{+V HEիg[oV~<*̙3j>f +By@@@@K`2ɗ9 nʔIٟy-8j9b,TfgŊ9rD a@@@@@@ >a              Y@ _>Y3Uĉ萭K37ސNCj|![-ҧ~_~E*TW_={:_UW\qݫɓ'k׮]{=7o5n8޽[zXoٸg5lPO<ʬX?7|SW?_~Yrέjܹ7o;n>߅2dUϝot_Vc:o߮>@K,QUR% ><믿˗PBݻ3ڀ@@@@B\NO?-%5m*-^,5iB=}뭷d ?zt E16 8=?=zOU^PR 3B`֭㏕7o^wW_}Wܩ3qD?^rekաC[zFhZ68p@-'      Xݐ@@@@@@@@@@@@@@@ pur|LҲe$UR>RZEI[K>*_|!UCǻ+ok5j[EDD覛nR=\- вro6V°U:* 7<.,­neZm.]\'_kڴi. .s-|-X V΅ k׮g:[nE9r7|}:*aj޼ {ꩧok-S@@@@BMi)}%-L˂.RlРAdvٳ{㏻{Fh+ڶm{vLΝswqGU|g͚/\={&wA-2eR? {Fia&MҺufWƌ|FXxqW       @RJ"              wH{=KKC~Q(fMi\9BZ>TZ64B~Wu뭷oWJ|!aWk̘1*Uիf*UԦM̻uի5b :u߻˗/w>kZukڲ1 µ6mڤ}]w¼ϟևin~o9s7]u6`-;F\:EQ1Nw}[nugچ@@@@BQ֕/J@z,%}'3ѣG/v,ȑ#:z ȊӸq\=SL3B{^B~g?O=#9rȡ9s*o޼zu)wތ|FXX1W      @oG'a6E@@@@@@@@@@@@@@#`![GURdlwޑV@AQ#ذT|z{t:qℚ5kdW_}͛'O>Q,*PcuDk۰c7ԗvYu}?jժnYٲeݴk׮8 7.\Xzb!_VV,e_ru~k_^缶.]bŊ 0 ھ}?mhҤI `Y|ֹ.    $aԿ4uԽ4}TRJx9}*SY7xN>BںK.='9s[Rv=+_|ԱR̞1L^uuEwegEq" Ԋ      @"J$!              _ < Z::dU:yRʟ_N\Xlծv![7nt2lͮ_[qum+e['6[cO&Ms[8V{qZeZÆ S?hʔ).P: 71̣Fr\#GtaZonVy{g裏ޕ    /JC%լ)͚%]qEʊw^*eNް`L_zumwsB =#3B+SϞ=5g3F]wڷo¾mfQͳp:|+      ȑ @@@@@@@@gN൪?  *cfZ7-3›cfaZ`h¡ G'pDAs9p8w}>ZumG @ @ @@mAY_JEGiڈGկ"JP_jGi1Ոm8(-Ss_uU rܪO>V[bU/X6u"XW<%-"׿uƌquEv튐K.$2tkQeN k'x"??GydiJfRy8?zk> @ @X__?8[0I=I&ń w-ޣ^{<{¦00{ꫯ|ywA(f@|J  @ @ $D˹ @ @ @ @ @ @ @Ymq1uEGU,{eqElID׮[ooDi؈'a|^_<;!Cz1/W2f̘1bD"AZzhr)kg?ٸۋ\wQ%N>ݻw\y啥s΍n!]tkqi+Gj- @ @"]F|s/GiS?i߾}{/ŻK ^SNMaJ}o!Rzd1{キ[joY+ @ @ @ jiOx  @ @ @ @ @ @ @@mkGG\|qD|aOT|6,b؊s7ݴ"dk*>UqB{u]o\ۢW^}8k[oXDϏ'0iҤXyկ~5}7Mq\P;eʔb}dV.(ۿb<'Cd[W:uj]0kX,71gvm# 7s̉v!:ȱm1`b-sA @ @`y k|%b-#:txъ={OXfz=һcܸqETM'm+mcyG/^,!><>OE޽W;nݺEfA @ @ @ j^< @ @ @ @ @ @ @ @` ցgʀ;FlIDokihn~8o>8f͚O>d\{' >;9x饗sBlM{챕~ '|_h+." _B'z#Fc9f~o/C6h nGkFr Eh3x+U=z(´9"yiܹűEtԩm; @Z+}h)6N Xfώ#<3J"F8찆];餓bW/ﰸ_b~Eo/F*ޫmYJ+# ^~n?~|wi>6mPcUW6eyGxF̰]v٥xWoi^sE#g}bUV? @ @h SDq=Qj՟ @ @ @ @ @ @ @h@ z![?^աC+68bw駟. P2lj„ X[^E_~Zgu_SV$ѫWO]s{vi9%^{-5>*]v] @Z-I'4F(e /D|r+B~a -,ׯ_\p1mڴdMJ^D*#!̘1#:vzo߾w+a}y) @ @ @ Z'.Pk\I @ @ @ @ @ @ @ Ȑq*ZZ@6"C _sW @hYZ6Zh&UhEĺ.e?x'bW_~7vB㏏{.D5 @ @0ZK.$@ @ @ @ @ @ @ @h&SGQїs#~~#D/}T5x ʐV8ܝ @ @@s5+?я"X#Z5jT\uUCrݻ|P] @ @ @j- @ @ @ @ @ @ @4!m*|{>hEk<dM'h4@ @ @/PʯOx?;Ya>lp 1o޼c=?B?믿~k׮6X&@ @ @@\ @ @ @ @ @ @ @@8S+4iR̙3g!={+m׎)SČ=M}#Yg~/}hrV^y&g&@ @hpqI7G>mE?8.q&u5\A۹s6mZC @ @ @@ @ @ @ @ @ @ @hdZfϞ'N تUH̝;sѳRb̘K![7pr1lXСnѩS;'@ @ rO8܊:`@ĝwFoY+ Pk; @ @ho @ @ @ @ @ @ @,жmPZ7kMe֬Y1a„Ƞa[הފ9sOG#ǵKDVk6Z;vlug![5!;F @ Ьn)[ߊx0#ڵkVC4e x.%@ @ @-X@V ~N @ @ @ @ @ @ @@@c+jM&ӧO/^y _ z%^xWojďW.]5 J5 @ @%YqaMk z5gΜ9sftСo @ @ @@,A @ @ @ @ @ @ @ А:uAL6-2l/n͎^馈ދh&JVkU *) @ @hO#=7bu#;bDurdV|w*Pk<$@ @ @MT@V}pM @ @ @ @ @ @ @@a\cޯRV;Ѻu![]T' @ @+Z O<1w"~o~3 WciճgFW#@ @ @x @ @ @ @ @ @ @  2ls"~"dk " _ u @ @,/_Ϻֈ8(5X^ww,ХKӦMkw @ @ @`9 ZnG @ @ @ @ @ @ @׎z-&LGLRz2lkP![ @ @Է?iĹF q=;Pw^sXi jO @ @ @@ ԪS- @ @ @ @ @ @ @ @`ͿWlƓ'GjQSVnG @ @`in5*CsNĉ'FrPk:vX̙-  @ @ @%🥖 @ @ @ @ @ @ @XnEd=4zȑoUÆͯCFt>Z{ @ @j0"<#>8#l ,ZC 3fX%@ @ @TU. @ @ @ @ @ @ @ZkEdgתloY5p ʐW= @ @-0kVyEG}FygĮl_v;̜9s @ @ bjGm @ @ @ @ @ @ @4W>}"z .x㍊k c @ @Z@g}&EvZ'Go2n +СC3fhi @ @hV4 @ @ @ @ @ @ @TfD}/ZcίeDoeYga"~Ϟ @ @fč7F|'oG\sMGdV~K*жmhݺu̜9sI/u> @ @ Ђjo @ @ @ @ @ @ @,5ֈgZy.\5d#&MvkeVUV)_iK @ fͪt@IDATX≈]w8z̉ˆ3ΈXuՈ[nkD:v(P0C @ @Z@  @ @ @ @ @ @ @5 z{W'Wٺ䒈+ᐭ^W @ @Hh*"3&">ߍ8ԈRޑB:t3fh5L @ @4?Z @ @ @ @ @ @ @Iw=冦LFjŷ-+m  @ @F\~;q;1bDeEk_zϳG2Pk̙ ռv  @ @ @f( P>TC"@ @ @ @ @ @ @ @@} d@{Tro]=d8o]8d+ @ @뮈o}zZE{lD6:E\}uW?' )о}5kVCB @ @ @@3 @ @ @ @ @ @ @ @`y T=yzq߮VC#V_|- @ @J,|yӦElqĿѵ8B!ڶmsi[h @ @hf5 @ @ @ @ @ @ @HUV}ZǻVٺ첈3Ψv5l +m  @ @%G{s.|ff=D/G hH6mjH`m @ @ @f( P>TC"@ @ @ @ @ @ @ @@c3b*j_W?)⬳*@ ֪Z3xK!@ @/0o^Kg?^)(9&#Z^[ 4@j^ԏne @ @ @ jN  @ @ @ @ @ @ @ Дzu׊ZGƎʈώšW_zVmSҖ @ ~oxwgQs#uԯ@۶mcΜ9ۨ @ @ @f- PY?^#@ @ @ @ @ @ @ @@Xy初w^A+^mCZ|- @ @ oҾ}ĬYgeGGk|O~ڴi#P~(B @ @Z@  @ @ @ @ @ @ @MO{vOZ=dk"9"dwC-_iK @hO=qZU)mius+J+EleĶFlUZ>Ӗ@ٳg/  @ @ ,j5h @ @ @ @ @ @ @h9ݺEcE-:C{,b؊z?qҹXauЊm+myދɓ'uʔ)۩V֏>r˹s'Ĝ9s"gn[Z5jm׮]Cѵkעvҥr|l$kR[_eU6{ @ @% ->M69+׏?8rXvƌu̙Er8k֬brTsZ[Ҫ\USmݺudhMy}sԪ|,Y;vXlw)TJƪ={|k[,:74ۼXOUZEo-WeQ 9 @ @ PWZur @ @ @ @ @ @ @4Z aZd)ZuE'![zEõa[k]vi2k1a„ꫯ\jYy啋 ܖCro߾!Xxx.\0z W  >ӻ{b}_J_ׯ_k~,B @( K.?~ηrXS ZT `9P*CSmP2吪rpU9,1/zk c9?-h|<')UV r(X3,bp<^ꃥ1v޼kuoJ/Jjݻw=zfVm>ǭ/;$P4C @ @Z@񜍒 @ @ @ @ @ @ @-Nk׈O_Z;hR]ƴiJۏZSo?|eY> ZdX3D:ky?ay_uV+BlgezORְ%@ @ @" P.J!@ @ @ @ @ @ @ @f!PZ;ۮTZsZ7GQX*-p:딯lY7LK+=P<#%NjoMlA(n믿~ׯX}i"sA*3f̈'K/TeXKl|\~M7!CİabK֭մ @ PkU`0%3D ^0d)?缰վ1Mfg(Q߾+bG5}ʀ{KV?~|lxnb-߾]lVJ+5w#@J`w,xꩋUtK+0sȠ &jkg9Ҷm"(ÍG9!!Y Ν92eJ[E-~<\rnZk!}K/<2\_}#J!;cg?k^3 @ @ *~{aŜjq@ @ @ @ @ @ @ @j>搭RUiCJS4![GtqN~ͽZumѣw|GlMlEfmdK?'Kh?p3& ܷo>zyc=7;nᆸ[E{Q,nN;E 7ܰ~nrzwիmΝ @`j- h8 }cܸq5~ō۵k Z{C jժUuRH`ܹż8Ə_YsM4),9w`_? TYXQҋw=~4 @ @h ZK+Pk\I @ @ @ @ @ @ @1"dGl=LD)*u[8dteVieVҺu]\KZ̙GzcM7/sr-Mw)]੧n-n3fLo>k8bN:->!hS5&MK`֬YE`O?9m &ļy9YdmE]4 ׯ9[zz[O3g,B^z"`^(r;qN۶m'5xQOb:thxZq) @ @hz Zz;W @ @ @ @ @ @ @ @: '5vlNu~Vi 9&FvZD5W?F+"|"8C<0_T@`Jio1q]wq8C裏Ç7hsMQ?{>ϖ?:Yԧ\3D+ó2`W!@nqs)g πM6$6l2dHp;,?GD @ @@Ε @ @ @ @ @ @ @ @`2d멧l=DDA[5ܦM*DYs΍n).=zt 0 8∢: _H_Mǚܠr>~?;wzRK35kVtС7 @ @ % @ @ @ @ @ @ @ @`y|qQGa7-W=Ə_~yv-^y"\)9ҴG]m53s^Wm0zdHTjݺu|[ߊ1cW__zT 7fΜYVVzhJ @ @@Ft @ @ @ @ @ @ @,('%\R,+/u\ c޼y&L?|.L cg]RS;3뮋I&2 @h_җbڴiqƚkPseim۶ qt./G-i>\-뮻ns-"{ 6{b-,tٟٳg)璿/ /~:2p(e{ Qj5+ϫ>ǐs?\o߾{!Ry|V5ϭYm_{b}UWճ>իW1֗ʁ7|/q$=φn{Y]$Y:tPk @ @h  @ @ @ @ @ @ @4a\O>ѯ_]wo}q1jԨ8#eU\=7Wx`92^Fnp{ ϝ;7OY;c=+Ь,gc 6(s\=b,z.L=iҤ8cE:83SN"㧞zjdՒ\>ua?ݻwV@w}XGq\T/K|S?jci`\>O  @ Ac~_u֑,Kr^!M90w6Ay^5r>7x"pkEqs'qZӦM+ZGuT~Vk,Ym;?P.}cf]]R2lSNgy&x#_@mݶX=υ[oUpeV. $"n2w]v{A9*vd;^&lR/p@ű6(}bx :v~nե;"OFnݪ]>bĈx駋 7޸EYf]iiP @qŦn:a„]eeg?aY_2j܍7EX6X2%28 ۷=3̙Se\(mYz9ʹߏզMb^9ϩiN2H{)B۵kٟ_?2+K3g T yh|slJmUӼϫ/ǷX7_&>OS9翨jM9E6kи[ZkzZ.w\s58 Vg\,ƞUoyQs|W]uUdWXU-ݻwq.~?x^E ԪT=~Yr!\.ƔWu)9N;Tyzv͛\sMb~~EVxhVjh @@ݻw曍/D~"CO;׾'O.Xks )<7KgB5tx<>q۷o17 Zʒ[_fM7T_DչNΛ299o⋋Qoyay.a]9Юr^X}o7ԏyWoᆘ1cFeZ=أؽm>,[{,豸f^e*g]R+7x#V]uߑԃZ m @ @ @@3_ ɀ  @ @ @ @ @ @ @4AU^M6֭[<#瞋^z)Ƴ>[[ Uڶm[4URۂ۵/_uYW=\~y'˅scË/Bpux' 7ܰy @C೟l\}EPQͽĨQbWzō7Xwż\p޷ C9$:?~|q7M>9R`92>OG.]"UKyU[l _3SS?j:`|^ ~sNWng+v?ߕYic]ouA6W=VT=1ߝ{'2@ ˒ @ @ @@]jUy @ @ @ @ @ @ @ @`9 NŢ7|rk[JgւW^e X\.e֬Yij=G O4)&LP>}W[mug˸aZvmel @׿0N:QwxΜ9V[E;^̽<ȸ뮻jw%͝;r>׿:cBU6_̞=;.",9wqGtAZ:|qmcʱsYR%ϭ5[ >_ϫjq}WNXu.Q-uXߟ>;.{fxvC+nJ @ @4MZM5 @ @ @ @ @ @ @4s^z?c޼y+dC ){ꩧVØ1cbĈ}7sjC. hbR^.{_~/_vM6);υe_{GSNj#Gc뭷5G @q t=ڸ+~Lcqߞ|ѻw9 7Pk7s޻8s-GrHyڴiŶ!ToF',8{oEt޸/´2ܷgϞKߖdW4@֏|^ÇM4/fU~5y,YmUgp,{wR\1cFva/t7n6Hw9v֭A( @ @ |j5gkd @ @ @ @ @ @ @ ~O<t$SL)[>_Wk׮quo㏏?<.+R~o;FguV<ک뇉'aҤIűv5,G>l,zkd_|?裏Ϲ[osNUy"v/ w}}/^z饸+?<6(^Xv &ĸqGű_|_G?QI @W`-,'^zixo7^s5EHUvVM7T|ΰ/< sLq>ti_8S=Px㍕mm<%Ka-IP.$2ST5!:W_}u2GYfxꩧx믿^2ySk:VwyryY֏E*;;[u]#\V.v[d8w]dZx䱸fm!˱rKtA{E>ô`E/;}45|W>R @ @ @$ P9=Mc!@ @ @ @ @ @ @ @f%駟^U= 2o9> `Ūˋ*EXV.t3;".+W]uUt޽>~lKׯ|+ Mg9#\$+eo|p\}h6M6$Ǝ[,_^;/ЫM74f\rI|K_*ڬ(vw֏9fHU.b?thݺut1~b[o]<\3όSO=V5zɅ3Cۯ[ @![SN-27xSɐp qQGI'Ty1C{3* :t{'ڵkWsV[a ?Ok}8,BƌS1`eHq]˼y\W_-sd[ fι/bU'} M.+-}j:VgmXԼnQkQ}_20C-} R׿U:gV}>EVkXo3?)r|{_.՗%ul3hsύ!C}6m1 @ @ ШZFC#@ @ @ @ @ @ @ @-X |G)^wuF.M Wj*Ygb[|Ibٷ6mİaG\@:|oٳt0aB߿.r\?idT/{_GΝɓ'G޽j*\4:CKM_e.Rw}Ҟk  @@sXyKA㩧.j1@ 345bĈX}?A kz950gώCk\|e}[nΠ 2KDzJWf~ԩӂ.ep΋ڷozނsh֭[Xs 5༮ϫ;;O?wE{I z6kk3-=D˿%_Qe֬Y?o>}@e\K-'xb~& @ @ L0{"vء~v.w5 @ @ @ @ @ @ @ АUW]8o?bȐ! y˅ծ]` .?nsqᄏqn ҩó {"w8Ês\ssk /3PlմSSk:oiB{G"iڵkץi5 @@g88WU}E8I'~x!c9`,oyl\[Xri۶mdKYyQ{6'[p.mTݯ^C+kQUQu=!ÑGW_y?Ο3dm\.}*oq՚<۬6ǚaRyRnynV5jTϘiGuT˳?^6DcyA @ @@kg @ @ @ @ @ @ @ @f'йs[޷v۸K+C`gϞjѭӧ{ Zd7;uwy,j*ݻwSN9|ͫ}nA};3V_}]}#@ \2SOOgeV[m\U軸6}Sy~U1O>U]h>uS}o4cEVoӟx_SP&NO:u^ @ @ @ W*-^ ٻ({o4@IDAT* EHDv5T`$Ē,7j4E4zD5Q.X" ""MPoF 0}眙={ @ @ @ @ @ @ @@`ժUqUWu]'tR͛W_2Op@{Ѻu SO=?cĉ&>믏򚄾BƖ/_L}GƍsC @ 4o7:9Ǝ"9k)ҳ]wOs1rӧOtAGn=4WG :*R5dٲeG 3gbԨQ[D zh4iҤ'D˖-+Z&@ @ @@jk&@ @ @ @ @ @ @ @\iӦ>Fi4#F25{cǎAEΝc̙1|&LfFG PZ:+w= ={-Za/R,]{)Z`…;۷oSOE 4Og;wn<qq ڈ7@F` @ @([ l @ @ @ @ @ @ @ @R__$iGqFÆ xtUVO?ݻǕW^ P@}]1v-^$3gNScנQ֎̘1#޸뮻>&FIP@VbB+)_7|3>hڴipSHOZwmhРAaY%KrAcw-[-[+owu7/ղڧN;c^- @ @ @ *;.PvJ @ @ @ @ @ @ @ @*+0{ӟC?Dlk{҄/K >}zN:5[DN_3iIL)tn]w]v%[v kРAĩ6lXwy[5. @ @ @MUz>ZS @ @ @ @ @ @ @T[UVŨQ_WoD:wwO6Q{d9sW^_~9 z7cʕѹs,C>}_A5S@V|_@MH )L(M<9{-JǗ.] nݺѶm왭}ڢEHdLP ???R3X?HklϞ=pd)d:ǥ0N)N:ڨ7pC 2${f @ @@ * @ @ @ @ @ @ @ @,\0^xx㥗^~;VXZݻG= _;vXc]Iz+[v0iM[O>$:njʐ @ @@Z) @ @ @ @ @ @ @ @`)+iye_q^"F㎋8[nh֬ܛ @j@ݺuc6֒ "N;-kH>(+Ѷmۍ,r @ @ @@D] @ @ @ @ @ @ @ @.иqmEqѫWĻn @ P^1rdEW %@ ̜93Z  @ @ @@jM! @ @ @ @ @ @ @ @<3bƍ#z"7\ @ PCDte[XS`ڴiѡC5#@ @ @P@V \F @ @ @ @ @ @ @(@N/q^q3g&e @ @4fE<`E2lԩScwܘ"%@ @ @ *A @ @ @ @ @ @ @(+xՈ>%-J @k v[D'q{)SSJ @ @ @J! Ph @ @ @ @ @ @ @ @J#гg[o}={".,MM @ @@I/sΉhذ$%\C@i-Z|I㎥B9 @ @ @ Ԫ'@ @ @ @ @ @ @ @*Vq[o?#}6k׈+Z#@ @@m_",82b$PySLԩSuB @ @ @@U>'@ @ @ @ @ @ @ @!DѣGD~^lYu~ @ @j q1mT$0uˋ;֤a  @ @ P*[S @ @ @ @ @ @ @ @Z#3#z:dkkl @ @@^y%7#.t"@`Lڵ l\AW @ @ @@- @ @ @ @ @ @ @ @@% ~zMFWM7EWr4O @j.0dHDϞ{]ԩScw&M @ @ @* Ԫ> @ @ @ @ @ @ @ @N`"Fꪈ/83j @ @LfΌxላ.*TB@ L:u*.!@ @ @_@]%@ @ @ @ @ @ @ @T@^^WDjGtW  @V_b@ qMu @ @z{G @ @ @ @ @ @ @ @@-#⭷"N:)bР>(O @ ,[qѠA MXpa̜93vuMGa @ @ @v Ԫ @ @ @ @ @ @ @ @UT`"n9⩧"%hgu @UH"r>YVꖮcǎ%B @ @(@R)F @ @ @ @ @ @ @#ҜԽ{Gp@%D,[V-k @S`Ȑ"ݶz_ TGqEf͢}ձL @ @TZU  @ @ @ @ @ @ @ @@Q[mCCFygDϞcu @=4#F>9N:@_  @ P>3fDhذIhѢ|Q+HZ;w^9  @ @ @%UR) @ @ @ @ @ @ @ @@܌_sFtqUsA @Jֈ7 vܱc%@jYbjo @ @ @Lj) @ @ @ @ @ @ @ @'o1xp'GpBħV\Z"@ @@Uˈ;aѱc- P+ƍK.bI @ @@U3 @ @ @ @ @ @ @ @5#~:#O7 @T)X8QrZTt@MHZlMlٲ @ @ @rU'@ @ @ @ @ @ @ @TF>G,]Z-k @/p*Ѓ&oFnj۰ @ @(Z倪J @ @ @ @ @ @ @ @@ehE q={F]=& @*N`1c"?\ѡCk\Kȑ#W^$ @ @ @, Pk U@ @ @ @ @ @ @ @T?'|r]曋=_dj|"q*w߈U*w@#FK.$veZ?ѱcxg:c|-PUaa"@@2$b}"Z{Y1(U{畍y][Y~iL2EVe%@ @ @5L^  @ @ @ @ @ @ @ @L`1iҤ"Gk /PzC矏ᆈ+xɈ{H+jIAuɚ{ TT%jgڴi1}H P Pa)0fرѠA,r9q#-)4wCKu^yeCUA`ԨQzU @ @ @@5 @ @ @ @ @ @ @ @ j*ڴiS$C۶m=_dp"j1~D׮W1{gk)ll{WY9SU P)_~rʬ'U'O &0JhJ"6c"پqƑ[<9rd.ClW @ @ @ZC @ @ @ @ @ @ @ @@67szvo_" ֠ݺEFGr",(N>= TDRR Kb*I+> {PUa͛7f͚j_DOQ^|y8l@ իT @ @ ܟ, @ @ @ @ @ @ @ @+кu5/I n>\5o#;,S#t瞈xK-Z|ѵk׸ M61us΍G}4>8b*l(:th<3;į~fm ϧri3gNt=~ӟ[lO{(7osݻw7.VZ׏/|0>쳬GqD?;?o޼GMB\XT]a)Lpgd?C׿.Іa#VXO=Tu].nգG?~|F\ 橹u-_<;%\Ç% 6,'c=P~wKw}E$쳿tz^H7p+\:jԨg= '@ @ @@ݪ @ @ @ @ @ @ @ @F !իȢ;s,XCOp@ر}D. *?cxY`A+,xw=^~hҤI*L!ZrJVzYȟ8 O_yYH :c7M{\UW]w}w=c|' IY)G?Q,\0;IaZi9W^SWx`yWp#ĤI NM{wk.ٳCSP+TM+{K>##쐖N;-RKq #Re>:RO? ޓ5:tiʔ)}g?<=8p`V.???fqtAqiE M^Ѳ=, 2Wy׮]ʒ} fm֨;ȵ, +KA\i=zt\wu~ݗdy晑KRU:EŻ~<Ma^/bvN:$#FȎ},,q/YӉŽ @@=ba{}޽iӦ#W_k6tc˪KY6jԨ,ΎܳR={'ܹss)Dk}UV{,D2;)&@@uh{&oz;f̘H!W<|U/B#bB @ @(eP* @ @ @ @ @ @ @ @.04at':r!?V]W~~~b־} oyL<9 *)8Hַ;w .?9V\GuT"DO:uʮIڴi߿vvEZ5kiӦE;-K.^SɲebŊYWAhI:ٰa|Ig^\pAGy$~wyYRWA{e@~^2a>V{D}~>u)ʂSHV+U&%8b- .Y>V=,(}bCDE[;g.^8Rȯ畞3jA]/Ri @ @ Pʢu @ @ @ @ @ @ @ @*Z ;eUq Pݩj^zوn"|2";;sfRyի =\{dxQZ\ʦ%&Mʂx㍂뼦Бssύ;3[_{wceeRSIÇ·<8蠃?0+/x}E#@**Ugջ={鍽PɴlQ}]vq衇O<SL)d2s?Oc5T?ERcIET0G{fѣg3kO?i%>ZԞ畤`I˗/'F=jҰ @ @d`%wB @ @ @ @ @ @ @ @'2r91jTgEt1lغr->(Om۶f%FƍcѢEYi>~ Ak⡇֥K?׏; "IohYbEX%Ҹy0`@ֿTvTZk/bΜ9kKUENX'ƺ)tJwqG y)Ǐn!6l={,{X*bv,?DgLn7ooX-+k-G}4w\ԧ @ @ @@s@ @ @ @ @ @ @ @8˗׸1UĀRoDuViE{lߴܠA֭[v^Dn\6,;_lٲ5NA?ϲ@_y啸 v}Ma$)HN/Q^C)H2Ͼ͚5}{XKt] P7"e(y暝m۶^yeM7{J#0z FFƍc]w-M @ @ @+[% @ @ @ @ @ @ @ @ܹs㫯YfUNWĘ1}F|pąF|eD z"MV{_p@\},n]v7|39,묳Ίɓ'gSL38#&L;r/υw='uyE :th61?8ӳG ``4)^zie &M}Z3K.$&)%>:c ۺ;`dɒ/~?Os_2+of;. cIw}7 O=,Q=bժUY ?{I Z{Iv!N:SsNKc=6wݬsˉ'wmVg +A*,Q= I"rXRo5>vEફʞ{Npu4R @ @ @ܟ- @ @ @ @ @ @ @ @%Rp~FSXSN05N)_GlmğѣGʕ+0?< Z=#5C҄:tɵtSN޿*RNEb6Oe˖m,]45jq4h`/^YӦM9͛v:رlu֍-Zlt7=kŊY[l v(Gg.]l_~s` yeOx㨣v);참˲zu @ @ @!0o^[G ~5bH6ZF! @ @ @ @ @ @ @ @, *v\qeyyt @@X=PzX/  @`}_l =3+X#@ NGydy1lذ8p`ԭ @ @ PjݬWJ @ @ @ @ @ @ @ @*_`n#u֍c9f׹`]~;LvW_q?A6۬{}m>r!D&Mj3ZT@IDAT @ ,\8D?3Ts:wk9z^ Hg[ǪUbF.x̙ׯSxJ!RN;-6|4hPz뭱{&E @ @ @E -Ev @ @ @ @ @ @ @ P5&L[;נAXlYw7˗/n)~_ŋ9akI&ŷu;@+мyXpDv~*K#@6 G=߈5%>h׮ݚ#ye6BK.o=^{9rd.dR @ @XS`޼>Z  @ @ @ @ @ @ @ @5Nm۶Ĉ#bwY87vĿUl@ @Ta"V8*] PV?kG~eOZ{G-0T @ @ @jUv @ @ @ @ @ @ @ @5Dn[q7Oߙ~aC#. /j@  @JϏ戓OrJ53f̈}fڏ?x|cws΅6 @ @ @e% P$C @ @ @ @ @ @ @Eyyy {:,^{y>q}{7ިEJ @@  @xhRW |qꩧFzcĈqmoN 'N͛G֭9 @ @ @`Sjm @ @ @ @ @ @ @ @@:ub{s]3ty%'H @8o~߸r&@d3f̈ . vixsz+SdSsٝ:u* @ @ @M)z @ @ @ @ @ @ @ @#ЬYc̘wbキ/7:8Y1o:;@ @u-瞈 YqL2%>qGɓ'iz+ N֦+K @ @lHTl @ @ @ @ @ @ @ @u]g?Pl 3;;=U%&@ @6 {o̙k|ЈO_=J/0nܸ4hP.sHZ~4hРD * @ @ @R *%b @ @ @ @ @ @ @ @@ f۷G [mU,^b;b>6mB\vW5;vŜ$@ @\{mD/=6#V#آ &r0aB 0 vcǎ/&Mgyf 'P@+ @ @ PCU @ @ @ @ @ @ @ @@ qlٲXtiW_q,ӧO4iҤW 뮻&NzgzG?ش&@ @ ̟ucEoD+WFsNT3gYg]t{/z3fL 806os̉%KDN6 @ @ @*k @ @ @ @ @ @ @ @JH=o'tqA t1^OωqQy&˯^i @[_׉#O7⪫"fͪi@Xbbw1tx裏:uz@SN *5 @ @ @jmi @ @ @ @ @ @ @ @jn뮻ۙF^5NV O?'x{nb.DLR5 @TAZ,~iuEkq &\Fݻw+2~ӟn&'unӦM D۶mjq @ @ @& l_46y  @ @ @ @ @ @ @ @%JD6-tn   >P+E iqdBA'ioѥҌ3d$D@o1!N9@@@@@@ Mt@@@@@@@@@@@@@@@OitPPt6:% x4}ԯ4qݳޱ?oc   ѣ׷믥~=k@_ݻk߾}_,Lʕ+:&Tx@@@@@Zk@@@@@@@@@@@@@@@ZuJ:Cpp\eiTuN`   jyrzBJR!ya  &hԨQ*ZhӞqUp wjF@@@@@d/@V@@@@@@@@@@@@@@@@ lVZ(QB+V NbijҥgK9)   `G"3 /Xh. (i&Wo7ng0kO @@@@@d':#               _ ?^gΜ YΞ=`]|tŋ~ԨQC&MRԩ*U^!Cd̘QO^)lv ,_.Dҕ+7UOy&*W|ߘn=w;Gŋ.vbsiҤ Y˖-[2es  ~#p?~-؞mgc4z ɒ%fͪ3~u$ 7]!>ҭ[7*nZ ]Jhq·     @ P+y^wz               @Xȑ#.xj!DD-;JTI-)eZހ-={,9rloF˗O3gΩ7oVʔymH~a8p@7oݻgϞ׽{.HBb[,@µʟ? * ޗ,Yҭ#-  {ݶm9x߾}n|}gf - ԊF{@= rq=+˖ =,_jZj Kh Z!     <Jם^#               m'OjΝ!g]N8qM`+{ 9M4nԩS_jݻ{B.ҥKnBwy۫mv{þ69whoǬމ5o޼!HE-9sk,Ə'J>]6M1Ck)yr乴 ڵKKk6|8w˗/ƍC 6mZ7a7jժʕ+ {°l6?m,݇/^-ؽ{Ϭ~ *.[-Z^m?+v)SFe˖uKjw&K,n;@@wܳauVbaYVRzms>nUT)5jȍl,gϦW{}llc6yl,;y'ڵKOwv6δgd /{ƶb%Jp!jn^ IY_y[ʕKz0@@@@@/W=%*^@@@@@@@@@@@@@@@, ٲe6m&S߾}\^C# *X .l!DN&o#ox}{ jLTx&x/] II)1,7`k$iz)E yht=ronBKjݺunB~ xXbHpXr7zT&H߼y ~Y XUԩM(  x2`T4xo ,jPY ^z3M7²,ʻ@@([O\B,k۶m!7kUR%ea 4p F">&yMbZ.]p$F@@@@@ arΕ6Ls&T$@@@@@@@@@@@@@@@@ /_v=.dzO*޽[W^RѢEC,{)… 'bz3 ܹS,,rE& l*W sP{-IH c 9M<2c/.Ǐۊ{> U^]5ktTHaTl2Y ,[nQլY3eΜ91.DB@L4HY̙B͛’mg*U,+WX¼˚5k\؏YVC섍7vaaqK5$66l:wpܸqj۶,.m@@@@@ P+W@q$               #m6-Yą\Rk׮ٳg]pV%dN-[VKvI&` ;vhӦMn .'ܾZjQj׮Bl{JV6Ó5zMKgW (GLm *SLQW {X/^3gžөSmݦvکUV f"@ `"@VZɓ'kҤI6Jկ__7|s`- ]` ӧOdɒ9ٞիFIY ?_paY3F۷wmI$ N     @KEV8@@@@@@@@@@@@@@@t,`g!9rą6UXQիWWժUUJ.]:Grh]͛7 m{n;w@լYMo[V}\zKOh4i} @\ עԇ f}w9p߾}ʟ?Zh-[iӦ Dm,hʔ)nٲee˦֭[PÆ 5(Qq8y@9R:uo9QFcǎp      D.@V>m%P+2!                fΜYfi޼y:}rʥz˜,D,6tR7 {nIFuUft-`)S⸅.\M(_hٲe*]z!ocǎiod,YkuMYf `@ Ԋ+IA8p~ >܍n&ps=rʉ!֭[UPTGk      D.@V>m%P+2!               G>}ƌゴN8jժEn5k*eʔ~b_6lдi/h ҭުm۪uʘ1c|:?WuI=nB'x[oM>p@YߓO>^xA3g.n@ jE@O,PܹsUzuӅiKOZ͸r g3fB z饗Ԯ];؁ygΜQbԡC}G~яÇ`sE{h     ,@V̯l8@@@@@@@@@@@@@@@Xjx ׅ͛%ٳMn+Voڵk3w\ 8IէO͙3Gԗ_~){ʓ':v(xի_Ÿ:w;wP(´%KOvҫJ(o6z7  @ ,[L7Vf͔6mZ|ruEie`VZ֭SŊթS'UTISLۓQ> XWXΟJ)9@@@@@ZI%@@@@@@@@@@@@@@@8UV- .t([ܹsճgO(P ;Jb-={v7I?O>޽{رc>OBV` o6,YRG\I\3fs=[ꮻ҃>&M$Y: C&[hE4}t5j(@{XͮP~7)S j޼mX-pa 0iȑob~.\@@@@@Hj%J@@@@@@@@@@@@@@@TѣzT`AۅiXBk׮O?|hhvBd͚Uݻw׼y܄mڴqATf!lvJf ,PŊ]pܔ)S4yd+V,VurLW_iٲe+U#G^@@\`Ĉ*]{?~{SNJJҘ1c\=3. [`*ȟJwŋ,ڂ     IL@$vA               @` 8qBS"E_׾}\MjS:Q/&|߻w>So*Qz!wo%j"8դIըQCׯW-"ؓq!`X`uA< qK  @4N>:wx@7nT֭Y LJ-_\ox 5nXSQ'N~SO)cƌ~.]:מUh      $-I;@@@@@@@@@@@@@@@r劾 J&}uMiӦ Z -0k׮0a^}U꥗^R"7`;۷_)948p,(K.ڹsF=J  @b رCZÇ5k,0m JJ6~Զm[UPArRss 9sfd͚m˝;ɣB p~tmO4m'fxΝ;wk B@@@@@$!@Vt@@@@@@@@@@@@@@@ ֯_=z?P~OMQ zRL{W[ְa\֏?JM6xjMnlT@vT`A~>?~ەu  q$n:z*PV^yQTʕuwj*S˧3gԩSpcǎ:tΟ? *];RJ^0"xΞ=AgϞʒ%ߙxC~H     /@V_B:               ~&Mh.&AO UT.µl޼ s{w%@>'|ѣGM6Z\N͚5K7#H{NrO-Z?w^E7[@hH*_^<80K+@ i >|X5jPB믿R{zgSuݍ/^rA;v֭5|͘1C .f=zp}K'OIFSʔ)_+˗z~>     ? :$-͝+5lO-׈"              $ Ӻ{tRMvԭ[7(?~e!pv)      ZD%eT;@@@@@@@@@@@@@@@FK.Z|ϟôLѣ3g“*6x޺$+WhZf}R(Euǂ.\ݲɻO8?<('UJmօ+n_ {W\MNA@;#Gjڴi.8)[lqWq]Lo wۧ?1>(U^] О={4l0^Z*TkK.EYݻdjmI T޵kO>ц 3gN/^\C q2eʤ|_|~^ZHVnuPÇkʝ;Ѯ׭k~-YdQʔ)=z@@@@@-@Vh #               Oք 4yd)S&_Ֆ*UJ?O M!.dc"I*m&|&N*%W\_}K gK&~9;> `ƍӖ-[y4# '`㝗^zIݻwO!ˡ b:믇ʯϟ߅}:tPۖ:ujuIk׮r뭷ɓ]fM:ݻ=#zsT~}'|R@:^pA`v?>A ԫW/w8p@NQΊ=.{ҥ~^5kV     H W1>!               t$6ur*>KI̙W޺&Μ9s""O_`A 2Mܽ|?h!M.\Pt&pIvlٲȗ}"<8N.\XC  VwƇa%1ڵK:x,(cƌyeWK,֭[ҥKoZ *nt4~ܹM:A2O?ucA /P ,SN+!CΝ[6{#O6&>Zڱc|ڗ@@@@@@5A@@@@@@@@@@@@@@@ 2eʤ~:G~W||_Uv>cWC/e˖5}Nl27avÆ u]wiذaj׮חv][orM{=zP~aם_Xp}v1Bwz%l[SǎեKZ*sιmw}w+Wtm~wf=cjҤ5V`S͚5Sn4zh&7A)Sdu{uۻwo>Ʈuݺu}_>O96 }x;w w0`ڴi-Z_C-d{c^{N`-   O_-/ 4gdk̞={kWcX$en|iAO<Zl|WnUF wӧmlgVP=qDu]ݾ6v3K+wc9[h"EB*Mݸۦ(vJ*9GZ蒕V<{lgjS[ϟvټy^y啐0_{*Ŋs;ST$=$|ɐnbcЈ;b[AAAa-?~}tw+&'IʭdΏ?A= | knܹA3gTRY 2-[)Ju6Mns_^kVԩ]մi:_'ĉ=v\|gi„ XRJ& 0 $#GGga\7nt_/^1rHUREWּyMo/SO=/[ؚw21cƸ.ݻl˗݆cA_.fM4i@fiQvmi?Z`kRX 2QFʕ+>؄h\.\ֻwfiu}Ξ=+s  \ %c@ Kjڴlle ^,'lo6fܺu2f›mdv|g9/ڶmԩSNqR[qxʔ)#{g{ }裏b]8X)lU `is|dZ- 8PjՊ9le0˂ ٘¬X곰O6ƠO`ԨQ0ЁeZB-.w;Y@z֬Yݧ~5vDQC{]QȖ- Ëb76#     1H#9@@@@@@@@@@@@@@@|6l&r8&0,+6MPnd>Gq[_~ٽ?.LUVns tb\r|DlBnA)Rp]dX(VYؙ3gѾ6&]:YM>x`w^vm4iL޶@NUV 9Uٲe ,Ym+Wh…n?MީS'Vpaf ;v 6l50->!YMjn:3;wnPlx^Ǐwײ^z~⥓ X]'OA@=SܹS%Ky%1Z[uFr7B,8]tz]@΂PBS@IDAT Ƃɓ{ @n u_bʕ+^5nGiӦ ɶ舜C잰lZ ~B視k[Q,?8.X{Cy V)R}o GXw@4̙S     DO2zǰ7               (`AO6qz̙}<"v˗/&C (SNi„ ʚ5֬YۤŊsr?^#Gt!\6ay%K|~;[ c-ae̘ztzС! [GD$o)U{[bE*.]ڽImw+iӦu?:f&);ݶ'|-*tP]{Zn̪Wzy_~r%7Ѽݓq]|޾GV޼yC~Z[蘅my }%F}d.@@ 98C 1$#{&9Zec={7t(NwfXq*U\@4Ρw6g?Y۳uxϝ|DPucB gx.(2e˖N:.y5'xvd)tHu LF+6m$^ޠ]+^{5KO?>¸-B 11;wn-]4&r       @Jb'@@@@@@@@@@@@@@@9(eH*UH5[nu_yX-We,)83.Mtm{mvJ?5O!ބ7Izx¶&r力=6+W.ל ^Ӭ^u͉aƌʗ/-|&~T{FȖ-,u͘1 *ծ1nKV,6*nݺFO>?1k'St>({ƢoF) JX>qѣmGV9@@@@@ P+ 6#               [|ڳgOlŊSL4vX^:> Iwޭŋs no.\p`Gd6 λ--Z:F^|9VZn_+u^>>u2dvoM_f͚rG6ʕa]Ӈln݁o&7Sd@^@[iӦ:uj6җg;vgUܹ5bu'NO< i߾ gy´neϞݝ̙3 =& Z'NWGڸJ\U?v]-*>?pDlM`Q|siܹvj}͒zQ[`ou)ҝ-J*z#6ZVpplQͫs]A5     D(! @@@@@@@@@@@@@@@O%KTϞ=Bk9t 9&ի jذ^u}GEFn2 2_3<# Ա/_Ro!bW;n޽p}ȗ/8&n:t6n:wϤI[p&.]zӫM\m%DGqBnݱcܫ9y{odV8^C׵k.ѣ5k&6y$9s?Vwݼ&ī]멧s=Zf֯_Fdzd~:n޼Mj-[}S^ X_ 讳ֽC@@ ;j9sf8[c*Y_G2|>7, .WfօyWFr㻗^zIVŋ5a7Vc/ b{.Snec/Booʔ)9>Ķ?B`ڴi#۷O?oպ1ro 66b!V9{ǮoaZ#GtڵkCNv<ױ*ywlǗwO?|l,j}†<=.jժ8=jY {g@@@@@@ <1=@@@@@@@@@@@@@@@@ j)SzׯҦMLJu1yd7Mm;\Ըqce̘Q 4l2͝;M~SPPB nBp>qD)SFgϞ/+u8 P& ڹs $ɿ{-[gD6ѺIӧNbŊ&zulBm۶c-HwuaT6t̙C=t_pA6mR…eY4H&:ۭҥKi뭘a\ /8Ss/s~'uq7a~ܹUJy睮nǘ1cܤ6M|ݡC7Iy,\PlVjUwcI7߸_,RƎ :);UTW\9^{?5ۺu}l~ þ}wZ݇ Ɨ}Bvhɒ%.}  yXwȽ yҥKݸtcSlƀ6>2d~G7~* ' x~pA3f̐H}*T;&K+ []Oe&WVͅ???-&Ϟ={HUa׵lM>,Y(G!ʛ#GhÆ nryznBl <.6 |6mdk2]|M)UXŤ@8&/Wym @dUQ<6@ l`aSO C!gd tyׂ,'t0T*"|kD 4iҸ;v ˜-)tڜ-[6jSY@菫ȇ?e6iݺ3h f v`=#j}pO>ąK}bUmłv̙# `9D!>i m,nݺ4 4Xy5_}_su E@@@@@ rΕ6 $hR'8               XK.p{1ݻWo5'4MLTrOk*Ut_!̊{N̙3u;D6{[oiĉaW_&kIXXC?%&ٳ["L7|׮]rk&яksX\yKcw&׏DU}nuɟ?8@@ =OzTFx ukFl+ bʡKtX }5߅Ӳ~B:ªBzؾ߱c ԩ7n?-mmbaZV-}ҥ4iƎ+VZRHq!iӦu#sh~v7֎f5n莟br@=槟~R%|Ӳ~ZROZry󺐷:?E@@@@@-pJ@@@@@@@@@@@@@@@Ht~X6pl2 6L HvE{n7ho߾Q&{rhpwľ};wnѢJ.}+ҧOc~IK?'|2A=B:vlTdɒhߕ8>Zh/^,c@@0- 뮻\o >1 b8pڸ4cƌ, rʕ@- ZvVXឹwٸB,,¹*Vxݱ"v|?ojGe˖խ[gX @@@@@W=%>*N@@@@@@@@@@@@@@@X`۶m.T^/ J2e$7ߔMlYfnf KbC#F{UZAu%?;C̵nݺ˗QFnoo'}w/kԨQj׮]"S"#// ?S+ ]ϫUVZfN5kF O$]v~:zΞ=ԩS0Țc㮢E?t)RDjR ԴiS*U*]xQ qGډP⡚gow̙ѭGՐ!C{Xk׮nl}ݧ .h„ 6@@@@@CRܹRÆɚ"ڝO#8@@@@@@@@@@@@@@@b-PD -^X~y}z\XU+ *TZok>TRiРAn+]t޷FC`ڵz4sLSoznn5d^wy,T`J6m]xW^U~\ߗ_~IVs @H6_7СCվ}罷7xC,[o#|rr̩oF6Α#G!{3fLxb̙34i\.?Dq}Ĭoƌʘ1cCm o!lqQl<bn͋ɡ     D)@VD               @Nw}z饗Լys5jH/4i?'A6v|OKfni;;vVX*UDw®n֬O֭[0q)_| ۈd|ӧO{8q 4ԩS2֠  @ O^?+Ο?_|2dȐpL> X G}´ʖ-+ /| :wt0;ٽҶm0kw fK{@@@@@@ e&"                .#Fd" Y[gsSիW5m4~\炫f͚7aZ޾5hMHq׶Sz7+WT5o<͜9Si#6U# Jʅh?^Gvs gOV%z7ԇ~uiܹ:yfϞ>}"E D >|8լKF/_vr@$      8j%;gE@@@@@@@@@@@@@@@:Uj„ Zvʗ/=zPB۷lr@ "*QZl4iҸ .\(TRZl]3gK/v*XV^ ƢFE@w߭)S6*(u5i:vݻwǦJc3ϸ,h{Rkڴiոqc?qG=Cl+)SY([ƻ'Nq/W\"큂     ĵZq-J}               RB :t<ҸqTtiթSG~83pxR8y;vm.mРA{uV)S&}8qf͚%K꣏>RpppRlҧ#G>3}ǚ1c˗(m  @rO>ggKn>A>VX,ЉلKN>w}WŊӈ#_Wٲe#mH֬YehsN7oԶm[e˖MΝŋ#I[BہS Բw@mG@@@@@? PO/ B@@@@@@@@@@@@@@@ w۷mۦ9s\rzW?~4p@رd,pA-[/>nOڳg{=7 | u]ڴiyK.bwSLQZԱcG5i>J"_F  EaäI/,O4}a}=z-'xBgr!J~W_U"EԿK۷o=g [n@#Ghݺu/N?-RݺuA1lI޼y*U*ba      Z@@@@@@@@@@@@@@@DFG&Lp|[馛TlY=쳚9sΝ;'`aR/k5kotIFeرceaTAAAא}mٲ},\x/tjE`1cƨrʺ;/_>\RÇww@˗iӤ󼅟ZրòE(      pZכ@-_@@@@@@@@@@@@@@@d$`"[ Teǎ!Q6؄TdlyʕK9rM^]fͪTRyW :qℎ=>|XwY];҇ԩS@*Z +^ "%Jrpolɓ'pӧI۷o]N:O] RbAhV>e˺W 8["l={6oB,΂ڬd˖-$̂l@w|bOXw*O ڰAZ- ʔ)a֭[UV*{`eq6n,L;ׄ ցc>i*("1T,WEƂ%"vQh4&DQMLE%رEE@@@ Ho'C;Գ9<0m͚{}7iR?>{;vl|EsNE2nD /3@! YMϻ{!5m/fM֭1  @ @ @ Z+PkI @ @ @ @ @ @ @*@ J/7χJ-oŠRUzzJ*Qne)\kM7Zje˴^rFҜ^^r/X .\ejÜ9sb\|=o̙Y{S@V4i 勿\>ʮ髯/>ON:) Z_׭2dyذa1%O5kB5j} (<-K7hlNӴ鳘.-Ӝ>g鳕iҖfT?F)ܫBwDk. PkI@ȑ7q=E =,:iB)*ezKX)SrZqkzKsZSNlx8=kq98xYqZ,3MiBpAi\|ސA_y K+#~7Ϟ w"L~iNI.]]vK@ @ @֩@5v$@ @ @ @ @ @ @ @V!^BN-z~N!V@,tKW5~\Q?sA[Ӗ ʇoЮwpbs^_haF~/e3~D 2ܹscfqeWg8}fYiH|@>p+}RW@j޼yl2 DK94 @~\J bğ쳑Ew^iEn\W{YV HӸxƌEXi==}wEc46*gsȃrӋi4rùҲqYq+&Y෿mY`]yGiРAҥKC  @ @ @@5Zs;g @ @ @ @ @ @ @ @e(駟µͽ?7{q'~Wwǥ  @@a *5 Y qMCDtqpBnyaZa)[ݻgsO>d6d^}ű&D߾}O\5 @ @T lc5?ՙ @ @ @ @ @ @ @ @e)PF8#㩧oxwcǎѺukbرeD&@ P.&Oo"2wÈA"7U.nF(P!twܱ@[fͪRJ4n8&Nf8 @ @ Z+ @ @ @ @ @ @ @ P5j{K?> 9䐸馛UVѥK{cΜ9KJ @` ѫWV[E?w..@@XxqдiӦI&1iҤ /"@ @ @V@V: @ @ @ @ @ @ @ @` ?)ƏOSW_Ro @*0xpıF.&b?!b̘.hР7Z`„ 1o޼fmue^_ 2eJC @ @ @% PbO!@ @ @ @ @ @ @ @ ԨQ#u떅jx_s5FNb*F]T  @.0`@D.{1jT1|x9DԬY{lhQ&7U@ ɓ74 @ @ @\@VG @ @ @ @ @ @ @H 4??裏#n-{wΝ1{lX @*FWD׮ժEbdBvZ(s&Dfʼ-5)SjG @ @TrZ @ @ @ @ @ @ @ @@yC7.zꩨ_~yѸqٳg 4(/^\` @ {q!x݈#tp]! P`رѢERJn԰aØ:m]t)瞘5kVK @r+ڷ8Ȉ%ZiZ`6P+;¼ybܹ @ @ @ , P\]#@ @ @ @ @ @ @ @@vnqO?7^zE&MG/ŋפj @X/Eϒ mÈur9 @T&Lf͚ly+T^ӦM+oM^ @ @ @j4 @ @ @ @ @ @ @ @@Y TV->xcĉYְaâK.ѪUbĈeD&@|ѵkDkGnģFs%} B =K7mڴ ڲ!Pk] @ @H| @ @ @ @ @ @ @ @V)[9ov 2$;۷on::vwuW̜9s(@ @`]\ܐ4v=o"^z)b%~u @`]L2%5j.*:ҿiڴi6 "@ @ @ʯ@{ﴜ @ @ @ @ @ @ @ P&m۶믿>Ǝ=\4o<~E&M?i⋱hѢ2i @Tl8ܐ4G\kW~O`1hذak|)Z\^7)D @ @XGj @ @ @ @ @ @ @ @MZjѵkxcĉ?1F?яUV_:^X @`=|]B]#Zx晈;㈟d=\LXSNj_:QFԬY3f̘Qx" @ @ @ *N  @ @ @ @ @ @ @ @#gof :4N<߿i&wӧl @@x챈m#* #q|W Vj%ڵkǬY h @ @ Pj{ @ @ @ @ @ @ @ @H!Z^{m;6 Z޽{G&MN-Zq @e/:EsLג +YۦXӳ"[lŪuԉ3gk8 @ @ Px h @ @ @ @ @ @ @ @BTZ5}J|7*B TZ.# @ @ jkQ @ @ @ @ @ @ @ @l*UDN{I&E>}PnݺE?y mq @eF#.l[ C]RnذaJ6m=T5 pt @ @(Zr' @ @ @ @ @ @ @ؠJ\xᅱ;lbߣUV1pUun'|r1jԨ8s#Y.nş2eJ3foN:f?8Sŋob7xh_ɕu/RV_.]w{-uY  @Z /1{vUDK*Mc.(jԨݻw Ռiֈmc7DZ RA-K3.ue (#9sDZw|ܹss=/a @ @T^Z9 @ @ @ @ @ @ @tŃFaÆ_|cƌ4@ $cĈꫯF.͛ǑGO>d̟?*_˳z4hPV˂ _YgW\qEUx>+WrxvXV_ VZt1}٢SKSt  @`-*rcܰ&;/w"viJXO?͂dSpO?tRnӔ VѨQKݒҌK]Hj}ws V^װN @ @*@{ @ @ @ @ @ @ @T*^z)ʢ>|ɱ.m\juYҤrݎ$uwǤIo߾1k֬8ꨣp޽{LJ~AB5k]3~W_~tAqf ʤiʟmx'N¹RpXo7zũ.~Nl @X`ȍ#+^FV"իWw=vqǸ;-T=4@*" .4~KբtoӴqp*R@ ̝;7jժU-XZjTR%Pwx }kX'@ @ @W@VzN @ @ @ @ @ @ @*1cN .jժ-](-[,Tv?_|1He>lnYڍ7'O^z뭣Eg/K4m49䐢~z>T"QF9EJLR,fϞ+_,ܼCW_<.~N% @`MϏ\gD׮ई[qmi,`hӦM0G^ +8bLݤɒG7;ST+8T)D ̙5k,Kϭ]/B  @ @ @@Uy~ @ @ @ @ @ @ @ @ #0o޼8裳pK/4&Loȑѱc,,'SO=5}ݥҥKqYP鼞={AcƌESXW_7pC 0 "58ꨣ#c=6HMi;)++MsN/t4tи"-86{ٵǧLoC><eaSW^ye4o<?Hr\])a-wy'h׮]tnݺYW HS|o [s6 @!0jTľF~{D߾ Sg;I'lRӧ}?O/o93Qz袋gq-3ΟcI̝;Rj-Z{կw].tիW.q{~חA @ @*oJ}&@ @ @ @ @ @ @ @ʻ̙Ӳ@{. J/hNT)_6,{Qsg ѣG@Szs Zxqu]ًS՟,h+dଽ+ҋ_~,/υ±Ҿz*+RW͚5}ѻw,+Kl%RoGqD}5Dz|~z7r-OİabȐ!/"gH)` V-S /Knv1DfϏu9i&;6iӦTߨQ,kĉٱg)(+{iӦeu|qi?'; @䆶)4! -]%iiL/ݻwƯ*۲1| W^y% Jcilr73tN>8òg裏fi<[|\=2H!S)9UJ*ZZg?Y\{q뭷fA)T1;L //Zo @ @ @j @ @ @ @ @ @ @ @ҋ#-O>$ ~Y/OrJl;g=IB7^g}|0 JRW>)xOҾ׿5+;sOcԨQOgeSkO/ ^z,VZq '_?TLרZjTV-6d+sԧ:+w߬io~0R <80 3Ki}=nKt)Sderɓ'geJq>+ **[Iiő^\4g1bĈ/~˿Zjv? %[^>Ĵi⩧pT< ,+XݻGϞ=cѭ[,L);߷o|//.^6J&M{7 A; juo][D&M9V7xcP+$UΚ]wd~K&@ @ @@- @ @ @ @ @ @ @ @\ TZ-ƍcƌY͛7϶7n\4ZEs+jՊ3gfZ/e۷o{g<}ָ^'@ 9ӳ4l"PQ*{zEd @ @Xֿ+ @ @ @ @ @ @ @ @Qy_}ե2xYf뮑*tn~_ŋq%ml%f _26mݺudA]|Nώ{1iҤ޽{+[l<#ճhѢѣGT:h֬Yv ov.XS\{ѢEHU}#>(ƥ=cY~?҈#ж/<ے Pj\k䆣q晑 #--@BRl*@ JAԳJ/JAݕu]w^  @ @ @ Z;?g @ @ @ @ @ @ @ @e,pfY7|s\3f̘:th\zYT Jӳ>)hc_.Lƍ噹Ԁڵkc=x`qq9 '7xcVnʔ)rԨQٲ)Hn.q`TժKa̙ٱcf… [nɶի{Wk.5j~v<:]yY:v[ouEuXY?:tn-&N<@YL&MD^]9uӟ)lYx׌3Wh[ozh6YZA+ @RLqA >xш'ȴi믿6m,Sꬳʎw MS1OiԩSyqaE>}Ꙫ|R+9s2]YL @ @ @Z'|5 @ @ @ @ @ @ @ @v۝㩧ѣG>?+"R`Qvqyދ:* :3?ώ|1bĈ8>r)ǀ"rY@R {"GzYW^y%9ȿ >ۙVZѣG/~ժUvѶm8Ų孷^xat%d/$kc J/OaL)D+{6.i⪫ZnW`7c=6yHAmկ^;)4kK5}1pv-v ,{wwE J%OƉ' /Z*Y6 @`#GFn|q5x6,+;,sή^~;wމiJcZE#YHn?~皻ᄏI jmwWw=n~x㍸˲}=P7[ @ @ @J[B @ @ @ @ @ @ @(p> jӠNR֬Y/^hQ3&j #sUTm&[Ϝ93j֬5j(:_G W2o޼dMb„ F-o6 vmv+α (0xׯ_oӧǏ~HnGydvOMIv->'}+Z_̞JN)w vCJM&Ɉ[nl=_k&ݺE.3\ճsaT1J>U^ ?<ΝԳߊ(GR>\L @ @ @Lh(bРNڪ @ @ @ @ @ @ @ @HA;LUVzGW;[yS2GKNLaZij$6,vu׬? G`=4B ѣGHoݻw={>{[7 ʗ^zviMK @j </^\Զ5kAcƌz() UVV[+j+׏o}C\5 @r p-\q7ˤ]СCcqǮӺoh޼:Sek/.vmK׾1j Yo^.yoz裏.>0 @ @ Pvޕ  @ @ @ @ @ @ @ @xsgo8zHAi֭[̜93{,\w͖_|RWM/ZOO>ƍgZ[neTVmr6 @S ]}~_+n:jԨ.VA#P`֬Y"PaÆ^.M @ @T(Zv  @ @ @ @ @ @ @<kuʈN*O| ԩS':wO:5 8Ϗ<0% @` ,ZѫWD߾Gt:R_jFV1^^ jծ]'Ӓ;cއ~@  @ @ @BUhwD{ @ @ @ @ @ @ @ @*@?q6;W_eAZ)d_z+ylnРA\pѣGhٲeK @Z ̟1FOD#8"nfmsѿ={v @]`ΜC^h~_ P)Mׯ}i @ @ @Z= @ @ @ @ @ @ @ @(Cw9?ĸq⩧zřg7={ƠAbeB&@ E"<2rK´vݵPZxSLl"@ @ @X=Z4 @ @ @ @ @ @ @ @^zvacń 뮋O>$:wlM\q1jԨk @F`#~;b]v0uTV:6lXY @ @ @5g: @ @ @ @ @ @ @ ҋ-O_BFԪ>[*@O?4}􉫯::v={>:j׮]YHTj4#io_9t~= x^[O-~m̛7/4hP.ۯ @ @ @UM @ @ @ @ @ @ @Z7W-~%Kk(bĥ"PYڵk7pC\wuGW^YQGku9TRYTx\f P>qYK>@ZRVƍzN @ @ @*@r @ @ @ @ @ @ @TN\;RF'/\Z.k׮ĉo#GBVZů>|+q(?8="~ۂhFTkF*RVfVYN @ @ @ej-kb @ @ @ @ @ @ @ PFo'c Pz7<:x7cСq'FM6F>}bƌPI @` |UġFoq.D @`رce˖8 @ @ @@@9 @ @ @ @ @ @ @(M78∈՗~۶i6 Rֵ^ VZE޽I&}-*~K]^A @Et$#j(JXօ:*Qbm] @ @ @] @ @ @ @ @ @ @X4bkH[={.Njժq<'Nn)ƌ]v-[ƥ^C]83}K|Wy @z6,g"[YI?kVG`ȑR @ @ @j  @ @ @ @ @ @ @ @`?qDKI<>[ugz ><f3h۶mqwӗy@to߾ǴiӖ)g ѿ}El JںTOyHB|Ml M @ @(SZe @ @ @ @ @ @ @ @ Ԩ$<+-TJ^{Eld۟l8֭[5\G^x!n I&ѽ{xb…Y|ɘ3gNѾ}:tk+ @ (˸޽#2C*`u\ x^+WKc׃*Pk=઒ @ @*mI @ @ @ @ @ @ @ PN8!b%}{{'W &P5E<I&ŭ&L>8Zh_|q|͑ c=w[ @!0eJ1DtPeƉX# ^`Ȑ!&[o]m@ @ @ @@! 0+i @ @ @ @ @ @ @ @`9?aDÆK,^$D`9"@ j׮vZk1bĈ87|3.\TR֜9sr! M7ݴ1 @8"68*UV^QJچvBOcvjժb @ @ P i  @ @ @ @ @ @ @ PRj =z,ۥKD%K&@v۸ꪫ[ @|g/k(x>#z(b XvEY)8f㍧Eݺs_ɓg٤P| WZ/>-Zds˖-uֱ;f[o/oxwbȑ$3Kmb;~;R_zg̘̙3#,D+KjJ )!1|U }H!XiNYO ԗ|PE~v2Kwe>+c҄k6lSNsݺusuc7z}Ngi̵OXw#G?]jڰ)3?fIc4^I5˛S=jU)YҘfEAU@dUDӔ_[wD֤[٘dV~;̵¾ұ4)8Kw@2zPZ/>NJilE阉@2eJo; @ @ @5pN#@ @ @ @ @ @ @ @V.^>|xyYVzQ|6lj*vuעvM~s\Y,h&k}1nܸ5zxcYzmڴ^{;SțX3~։)*PK/4R]z1}ɹxV *9|A~jeR`B@ i´Ӕ)RV H4Ѝ|G/QLAŧS<@)ڵk}>x%U Vym]!@IDATE}+#jqlFjÆ + SKط{9ڸql=-s/1RV O(& @ @wPRTDIC 9gIT` IPW뢋 a׀0A(($3 5 zfg+  M a+lV                _W_}e}l^G+|UV֬Y3_iPh+ m…6w\׾;woӦunʎK}C&p9۱cmٲ6o۷o7oGY^Qx%&/`Iz9XtM{ٳDžڵ%/_>nR@4U\ݓu#UWխkɭgD/׷6VlȮk$NaHzިOMz=4/ī~LLxaG A\  c0sBHp-PROyߌ(ХKS(ާ~G ^<> oM8:     %+Ql,֭#n^" Q?@@@@@@@@@@@@@@@"L@+DKD7[li۷k6lhٳgZ:k׮uZSNiӦٳg]V= 1{p] ڰa6n7Wp>WQB~!+W4ϟ?C@a R8&]W|۶muVDխH".X/]^:als'@BfxYg1_EmñcsB =3'=KP-[6>=p" T8p(V׭G7oe ӤCyEwWPI _@2~ BHV     v~ J["               VZe#GզM޽ *^xPcO8Əo'OvtMֿ0@hpPPޚ5kL{5)PNAZ_XbVjU7URAK.i2ՉƜ^y7oUVg}%Jd@;Fm/v->ۗEd ۷ϖ-[fK.+Vʕ+]Pϙ3+HS5\+@ ݺu[΅yիW\|Vn]xаaCӤ\rEZsO "& @fs/|˰T!`OfޭPO^BmUc^<5)Hs|*0>}<9/TsM &nw&k׮N??vȫ ^u8p9rrquZ.@@@@@ vAnǖ               dZ۸q駟vwxkӦe˖-Ӷ; S0ш#scP[!d@>l .gW[ \Ȑ†0AsgԎpa [jnO?_]7nlM6f͚ٳgX8Ph /{ve}YϞ=VF]9@Oo=zӦMv9H,/S?UVuA?e˖wIF,Oڰa \v S֙3gB t饗ZzܤBx)fr=zԦL8R"    B@T`%X@ E@@@@@@@@@@@@@@@ L4{174h4;vaÆoa zkV#vZ;w͛W((4iƒ6lh׷"EPl@T (E˗/7-ZO8a pߓ-Z/bbbTڌ@-hh̗i /&:[rYhdӤ{ʕ+ԩS.z`CԪU˅h)@`<:e l{R>}֮].27oyfZ%JOܮLӶHir,CZ\"z#JN<³7yd۱c,YZnmWc4UV>JOՎ2cǎ4-]Բgn-Z;I5J 熚%/Щّ#%^8?5kٳmΜ9nڽ{Ę<4ibM6uˇB,o>[d &]h{! #mժP=oeOڛo~e6b=@@@@@&@V8ZicK@@@@@@@@@@@@@@@^֧O8q=6dBB|V^裏Zڵm.,ćdL@O0>s@ R^vܵɚLs8'N̙3mԩƍRJv7M7d͛7'.ZvBN@L_ B3ڷh [i׮]6m4wTo48J6  @ؼy͝;͛ +PiƮZ;zQt[ݺu7ވvjEm@@@@@Zi?jݎ-@@@@@@@@@@@@@@@j-[XǎMZl2M_~uk_}5k,O] p)/߷ӧ[ŭsֵkW-O5RE $A@@@@tjfOl               *zj+,xb´2DV^~GwڴicSNphXdu]nXժUm̙{n=zuԉ0h93S 軩ٳmϞ=6h [`5h6lhF'Ofjعl8G ~S?leʔ-Z>l>}l͚5}v3fJ,#u+悧Kqۺu Vx3~;w.|+W.k׮]ו "      @V4%               @6nh qQ͚5. ]*0>z W  ?]͚5͛>]voٲe˖ ,P@w}6g۲eҥKqJɡ )vb={b>V㩧ʕ+ 6lL>֬Y3Gf ʕ+gsM0:d-B'oEjK?С(P RH@@@@@@ P+NE@@@@@@@@@@@@@@@ }ǎ;ZŊmҤI >to#G{]JnlÆ ';^ [ڵ_~.Ba<XK.3gm5G TPꂵ{=[d ]H^e oٽΝAXA]vu5x`ۿ}v[x4v\(pE> ڷo96md׷VZ#(lƌv7GJ      jE)               .SNĉ-oȚ!Ȟ=iUZ=ٱq ,X5kfwva=-[6r+M@ `ٳg͛Zj6d;sLaE*;z쮻2SL+:ud \zWbbb2H ۗ(x7ؾ}m4x VPi$k}.s j[@@@@@@ V9C@@@@@@@@@@@@@@@ go%Kڇ6~x{g=OnvkѢ-ZzYxE'|bׯ^x!=b(-[@- 4 (+l'޽{Q>lԨQvۋ/uMM}]/ӧcǎ … ӻ[GL$f;.F)8]vֳgOk߾ܹ*ԩSm.W)'Ottn)ɲelְaC{ꩧr5kƭNj%p {w[o5 2JTR6tP۶m=7SƍoCb:[bub      jE                p9{]0r('0a77l/Enھ{?{  jRre?a=|fΜi&MSNȓX[BB7/+fժU.UV[o% @ k lj6cY~kÆ 3TRŶlbC B 9M:W۷o1cVő-[sq;sM<َ=֬Yz^@׭[^r/IlYuZ=Һ]z|Ϟ=k7p >o?ӳېm0{f]?J[kȎԎwBR㎤Va9      @J                m'NtN:4ڪjpܹs3<14O}tKxߏ6 ᇺ_~ey£kc͊314=})LW^q!#FE`5z>լY=+aҥF}?OwV~x˒zX"eIm.GO?5jT~,O<.Zf͚傊8Uw1 sz\     dv_k]!               ~ RJ.vomذ~gZ_-~WǛ=j_)dNצ w*Uʞ}Y[pۉ¸^{5+P@r3}~i: >`׻ S=T޽NV;v{:WP^|ESw˵_cr'}ϻ^t/mϞ=vwPM6@ɽk_|m8pM8ƍg/6m4w>hF+jZ)Q=CVR%WCa}U%koɒ%.dJcǎ6j([n׵ӿ^ɝxf%u0`s=vF!b;\@+W96YSŋIPzN?~<痞Mzx[Ν]S |r޽{~ǨXfr-[XÆ -[@uwPHԩSr3Xɒ%- ,O3O>q}+~֭[M9; Jm#R_ҟM1/VIr1#GgvvM6u}2q+mƌ.f_ž{9u~W\^'qxm7ߘQ XL*}[&eOS@@@@@@,'=˵#               viǎ - vP =l0k֬ G -[!Comwo5x믿n[.̅f)[n=z50pW(͍7[[h<)S09>|8nP`'>fJSdJMK.$ڧ @뭷‘TFtuיN:WQBlӦ x&L`_} 0yd?B>#S͛7ϭ /_>SD$Grov :ݫ~׮]FnS8)(A%SR=z. _U Dн QJ&MW^V|Dۤ<*TK!Nׯw TS(<-/uFm P_t]Pa[j[bի]К_;ul2ӧO}J$#FΡ d=߭|]Pk"mWp"j1t//{nݺ.0R7p{ޥYH̼˝낄;(5R)Y2Zm۶5=kTXৄ}jժ]L=՟5=L:WԿ ?1GwR@ UIsV̾.8ZUUXƍ]0UGPȕt=x%yr۷]~s#R>SA-ԟ uCڵkP@@@@@rjeSN@@@@@@@@@@@@@@@]$;˗/7h+ A5BST?n?m޼$믿M6;bSB7 {Vlܸqn?ni J>CYR`A)R."[~#p ۰aCZ$~ŋ5joBt-{])49s9rK/^qϜ9ՠALA Pԥ^ P߿(A|.(ꫯܹs[J}$z۶mn Ri׮ kĸʽ}O`[SQ 䜄*?-B_,Y-Y2/ן5߳'QH! ꉖs:Bwި~:tsι>k0`{s=?I*?\N ϵC)'T*sAGzS(BwO[(,aCae/|.]@ϓ' T %e @߱ٳg7&y}Z S0Ms宅իTղAM T^]x$7W[MKwC(az!s<F@@@@@@hڌ               ܀8qnҠUTcǎ.]T˖-릤v鸀 bQQ@~4ymذa ء:E  tKXk֬WPޙ3gܲ-ZXMֿZaO|)O^iٲϟ)ʿ9L4 }Ƚ[7)] ;vlM^ޟUo> {z0¿v _?A&* KM)T[]%^Q{nw-y׊%\r:^sQ ՕF@NrC*}ݔӁ<]wuA{9ry-vV͞=;ڛb}&x ۽{Ov׻*I wș35k̽g3gδ%KX@=>+߶RJ٨Qܹ0aBM { VU%->*Tpѣޢ4ʕ-~]zIR Ç. W8.I`Dͮ*4P!_uhNx؄ϯܹseM4qA:tH>k.X!^fq-[~ĞMc^r"@6J`-6o5--Ko[={Z>}l֭_5 ϕ~)UV.`?ÄkR_6e^ɓ'Eqsۋ)q #Ŝ9s FBԼl~@@@@@@*@VV=@@@@@@@@@@@@@@@ -[ .lK. zgǏ7$,[lI(ŋw͝;7eʔqK,oyߜ;wnv[sƒtK/4PaE]xZQ]F{6/AΝ;m۶ml{{̘1oY]Q=~7ovm~:Ϙ1;TޟU"`Ė%ܕ?H.='ֶ}nHA |5טBRkCڎ;Br`4tc&|~?~&dp?}gʢE._~}]<̛7/#bYbĖ%UٷHK2aRٳ;SNo9n=tæLk*-]b'\>WT7oxzSNFAW=Ovӧ:E@@@@@ZY@@@@@@@@@@@@@@@ hPھꫠ7An-666n??nA*^4k̭=gΜx[-^ؽ+-I!Zk׶&]QH\/<+t(Na ҽRJ?޺'xs޹sfqs/o1^%aV^]* %3fլY.,?VVkĿ9>rHܮ^{]w^hEF?3*ǏwAÆ Ν;y"]Ek'OyښfϞ۫WnM4sA{rio=P{pB0aB\qgw vz衇\O֭mС۲eKw ϵ}Oٸq{6|o/۷/ N~;Co\ҷHg̘Ữ}(hL~gLV,/*KJ[UY S.\-K:k 4Ȗ.]j}rʸ0e~_~k+U_ݞ~iw pzi ߑڥZ{^y.EzYn)t[ O)@@@@@@ =#               @$TVƎk6lo1hUʗ/]uU6yd駟lҤIy:W_<` NQ8 oӦ\=wuҥ guuOݠ:N2e\`? P=5jvi@^x4X5zٲe74 vbŊvQ+c&/hfrZj% (Pnf裏L]gw@IU4ѰaC gϞua}מz)6m[O Y}/~%(XFn *廒!^~)B+X{1;V (ݿƠ}X2kժ K/FrT` Ԗ.KVJ-Sr\ݓtL￷/uָz>n$@3,_ܾ[2d HMA*HK^>@)*`̙3fVBLSX]cZW _hGu#%Jphr$ό@OjבS(7bJ}~`K01Y 6‹*`J}F깿k.ɛ7o#V@o{~*UP@Bt:uRdI{zRuORJ4<~]f>}R| z駭p=H"E$y/PXP^=jޣ( AٳǫhѢzǫH2o>(h¿] ۤ ٳDž\) ؁T3hؑ4~Sͻ1R9Riu/-: d0Gyą-)LRጡ ;t@/SzNMgއ*DLA TB.ZΥ0I`̴+X%ַHL\M4q=ݻתV/'XK}&ZAN ɝ;wS ZڏBJO[e][k~TRxt68nZSBZ^zիpQ>>U     X{٬Y,@LvBi                |?ҥKdɒɭ)/L|̙ɮjP-Z.\7@zF׃O`G}z!+P@*G{2:t萢[o5RHo߾D:35uG|T^'|     dw2Y3ꨙ8jeH+@@@@@@@@@@@@@@@Hիꫯ2eW_}e\rIg :u ¿KҿS,Yb#Fpk7Yr-֢E ˖-[k/ xG;hmK… va'OI&M!Z]v[oծˑ#dԂ^xEmذJ.QU"    dZi&P+vl               @T lٲ qQݠ(]0޽{]Yf͢T5 `>p/^:wW8H8+?6nh&L'ڼyTR.;z"&@V9p Ueb?EVZeʕmMe˖ s-9<DCl֬Y6c 7]*Vh]tqSV\VۢU?B]H=>Zzf     @J P+vl               @ (LO>.'!CDQLFe>ծ]ƏY@@+G[}ȑZnm]wk][l'l̙6uToMZ*Uon&k޼e˖-dg P+}~lÇ͊34|A9Fk.6m?r7W^yh͞={~@ J6oGΝW U~h^zĵ桇qن \}#R!"DP @@@@@ P+@۱%               F`ȑ.\r6|p7ui\4d8p :97\'Ooɓ'ێ;dɒ.`K+hVZDI!p1w5kiZt QhL|A8 3t%JچO'{5טcVT#ښ5kl6g7޽bbbqִiSkҤʗ/ñ=DmŶpB[h+H"ֲeKkժ5j䂁#)k׮z¢HfDԋ@8 T@@@@@ JI!P+vl               @غu.k׮/ZժU3U (>d{7aÆ6zhB!~z1c R7x}+/[*T(gd ϛK ,p!Z B\z kР]}ֶm[ /_LY6rl_2u3]ٶm͟??nZl9sƊ-j_I55j԰ܹsg:@f8wmڴVXa w\_B`9nݺ ޤyl٢D#GP0ZI      @ P+@۱%               R`ҤIc0[n dkΔm eveÆ sAZ zkٳga7֮]ksuӼylƍn jժ`ƍ0["Em O?ْ%Kln~ +P5iZh&dLF2iFgy0))6ٖ.]ZN:e9sիK/jժ&"-+ Rlb]f]r{}i(4Ze]fm7oސ+;W^.XYfl .jg[ LAuֵ:uX5H9[G}\]-B:uMIB#*jC"͆#~ͱi&[bk{)'GVreY(T![-[%`4 aGgΜq߷ *m^W{!W\dzQwϹ_Ov]>?@@@@@H\@]YJV J               @>^y7o޽{,rAOh}%-DW0! Y˙3+ мzVHHk Alٲ֭[B !:.b0 IY) KB.4aI 46{_Ho"wY&.G'N*J*.pRJI[WXbbb"I >}ڶmf7o64y7nﻥ:UV-{;B]Ə; L@X @@@@@ sNV@@@@@@@@@@@@@@@,%#Goiƺwn7p/^ǎs =/N :.665NA_|q\%t3.j?(Q : ,eٳMIԇ@{+P.}J|3gθP~S P+p+D@@@@Zj|v;D@@@@@@@@@@@@@@@ :uʅk}W.hJ!( j۶jʚ5kfw:цW^m ,sܹ *B:udݺuc0h;7dΝsG R&Wx? JM֗.]:nR%K EĢ{=#4)+bn!t-yE_AlTbEԦ0M Ve@j%Çax-~,g0T RAz֨OMzV, &S/~(o okN>ApR³I}#Gm |S?Ziz˗/vIY`ʕ+]Y['@'@@@@@jH; =5Z               o={tSllX¦M§lG.ȅj5m.RUծ]oYߜ8q֬YUV٢Elɒ%vI7yƍ_~vךڑԃ0-9r0iJ(NAJ;v ORd>lx%W\qA &VhRTH|(нQw+СC!7?~<^elѤIRC( B!ZzP@(qYrieUȘq;/Q Cпߢ8ꛨO?kA*כ^]111'OgaP(~;_D_so{M R)W%%(:^(UV+)͛oRߗ|K/*TG@@@@@@T d#{,U2                4X~-XM/vU\E+\KV OLc0 dAw|i۶mn:\ujԨa5f͚nݺh @ ; oy^(7 rRhº| T$6)I7o^Ӥ{&@ES9w>}M p_~N:7^+$KgoRP o"/Ls/^D @ )pUfGjFc!m/t|aI'/g%-0H W^:{l Txo(Շ- ^F)[l?귧®Μ97?M%5y XQΙ |ռp5-F 4pSL _Eȯ=.0A@@@@@=_el,֭LÜu4@@@@@@@@@@@@@@@&NW^qPի]¬on˗/wW k/ ^k`l(  VNfd 9g\zmy(KCM RTEly>~׷Q[ԗHnRI8y}e[B4OMQN}0U2VT>Q>Q2DA\w}}      @& P+X               @ xaVڵ,~ΝP,`,/, \+^s q-ZԽּL292Nw[! ^8LP*Sh7$'Ps/(+@ Uxajk/"<[<6ujwk'Vm_/Exak{$<Z#wΝ4zk*]tvYoIwQ%᤾N{rK@ q ,{7ԩSu @ @ @bs @ @ @ @ @ @ @ @opa%T~ ,-Yg}> @@ \uU#M'e @ @ @ @ @ @ @ @ @ @ @ @.кu 7Dzk믯" P  P Ç+"nq+ $@ @ @H٘ @ @ @ @ @ @ @ @ @` |wGꭾ2DL+{5#8蠥D+'ԃbM6nmq @ @ @*ʯ @ @ @ @ @ @ @ @ Pimq^1iR]F P޽#6XZwߒK8餓bڴi裏Fƍ߀3 @ @ @V@ @ @ @ @ @ @ @ @uSZB @ @ P-Z6&@ @ @ @ @ @ @ @ @@z# vZ P\~āFjUjw}rH|Gfj @ @ Pjո[j@ @ @ @ @ @ @ @ @@_W_EN`u">N^sѢ}O 771|h׮]P @ @ @ ԪrD @ @ @ @ @ @ @ @ P[nq^1mZŶ5(GD|I![{dM8⡇G{ @ @ @UPȯի`t @ @ @ @ @ @ @ @*D+#78 iN# PNCX48zو \{1p{cB @ @ PCjՐi @ @ @ @ @ @ @ @X@f7q< @@e^D߷w'XW&jw]tQgۛ#6B @ @ @@-Un @ @ @ @ @ @ @ @ P<0"-`A0znmĦ&!CqWiV @ @ @_f @ @ @ @ @ @ @ @ Pcn)Kk\A @TŋǼybܹ#- riiw}- .\f;Ee^dI.gۣOgN:%.u֍ԫW/ׯv~I6l 4(\nܸq4j(JZ7i$6mZz O?GuT.Ը˫C @ @ @ : @ @ @ @ @ @ @ @@ǎW^qő $t<}'@:[fΜg.\f͚m~[7gPv¦R4v *rίXF&FVE/d![oҕҒB_uڗҒꔥ>C7o-kF5\sZ+ZlijO!@@E qa+y @ @ @TZUF @ @ @ @ @ @ @ @VgFw_)D<̪ @ 5mڴl>}z̘1#[hV * N))B}:tX&iӦ|Tύ7³U"tKe4T)+k%:mϝ;p7o^9sJ #KhK~Ò}>`uQtY{ ?i&Ҳ:dy7x#ky{4( @ @ @5S@VͼFE @ @ @ @ @ @ @ @RՋvc)(@ c4iRL<9LzԩZ-Z`U4t)mw-ײe,)Дiɇhկ_V.K >MʸHf͊h|Xڄ  ұ[뮻nk.۷oթ[R@@5jT$  46: @ @ @@-~ 0'@ @ @ @ @ @ @ @ @@El]D~ム VA@M?~L81R(g}?,@+NJEKV@-آ00iuɶf͚=v5H--)SN-j۶msα馛7|Ha[)0N!@` YVno[4idwJ @ @ @V@U" @ @ @ @ @ @ @ @?ywGUy@9f̘cƌѣG;3h ?M xYP JKvN:帚V@f"b2w?~|;pIrO=T|QPP.]D IK JV@ u]ϾV͕] @ @ @*lU @ @ @ @ @ @ @ @ @(p[l1p`Ǝ4H!@ƍ˅F)HkY;[ν[DݣO>(6lرЬrI\R\zR̙3'>{>h\wuhѢhԨQ[FϞ=c=zD-73?P }^;7|Hay  @ @ @@U @ @ @ @ @ @ @ @ @`7䒈+\N,S@ zW_)xdѰaҥK{Gnݢk׮V^-{RPVZ f![n=:z뭸kbʔ)Y ]Ν?qlvْһ r/b>4tHAx  @ @ @@U @ @ @ @ @ @ @ @ @`Ϗx_*Ǘ9lX R?-/BL81 ޽{l6q[oi5h`l޵y䑅:uj5*^xꫯvרQi"-;c暅 @tgy&<}Gާk;B @ @ Pjkl @ @ @ @ @ @ @ @(@.7$ e!C"='F@ ;6~lyg㫯;guVjP (@۶mwْ?qҤIK/ŋ/~/=zdA[դI)G{~ṟ={7'= @ @ @,E; @ @ @ @ @ @ @ @s 'DyfĞ{FhQM*\`YO?4:v %nlVu5H@ t!;lI-ϟ?? JZ#Go1ԩ;how}c6Nh@5xcO<1:(֭[ G @ @ @) P"5E @ @ @ @ @ @ @ @j.pmq饑 }UP`Μ9OuAAAuYgE޽cM7%#иqիWΝk1"n83k׮Ym}u + r=3Xd  @ @ @ P @ @ @ @ @ @ @ @׎o#n97kȠ jXdI:*ڴizj4o<z衘1cF >< o$M>㣏>ʖ;.u[lE\K?{^UR*+ТE8sO[o5wqGչs*tlʔ)Odߟoq-3g瞥+z`رqM7U{_a&L޽{ܹs^B'X&@ @ @uk @ @ @ @ @ @ @ @V^ 1xp?̙)'_>Ӹ{?%KĘ1c⭷ފNiӦ^{^{m@IDAT1baZUQHg}!i.)KVٳc1s?{Tyy6JWxm^Y=6j(:HP۷={fLUoy˗_~9 ֕v'|))Zƍ;k&l~{yYg}ͪWNB;DÆ 㥗^UN?  @ @ @Q@VmL @ @ @ @ @ @ @ @2 ѧOiE̛WƓ~`nŋ?r-`zz?u|*^귘^~)ee=Li߾}c6]֒‹=gvN:(3W\%[B-P;ïɎZ//~oRe?>L;3@~~4/CKz_sq饗駟kVvQG\pAwܮe6lXv6|l5  @ @ @jS[q @ @ @ @ @ @ @ @ @71cFį]~`nFAAAaK )|xnݺuQл _~V,i_Y|a-sZ#8"z꩸[nYK?^һTZ_qQc=6:tPbv_rH}1bĈXs5W1g @ @ @*eK_o @ @ @ @ @ @ @ @ "v"qYѵ(o_~9͛ݻwO?=ڷoTlO[/iӦw?c67ѶmӧO?[oE-㏏޽{g-Z:Os)a7tS;[{wѣGp q… }?OsΉ#Gf{7 JAJ<@|Σ>3gf}<b*c=i:uj3BjqgG&M T~O81xWyѩSb-{V_.^zٻԋ/C-lgx2dH>~{|q'F )oY;\k5O>BϾ˨SNySQƍ^zE:/"3<3w)Dcyl^` O?4o rwn9'hnN?i~KsllNN뮻rZ_Pidi_u>sGŏ"=%+ /;Ck6nH93bv:V;lƞtmeaQeM6[N/JOI,'K,y,>6j(/~7xH݊ށ\w};{ɾkJ?<* @ @ @!PuU%@ @ @ @ @ @ @ @ @Z*x\T.$!rAR+W_e!(?/,|\@W<0~e)'Q-k5* Ja9'tRGǎL{wp`9,'nݺK/OuRP IƎive1cFl7d)#+Jj'}а@a]T¼RrvmJHah)׿u4mڴJw裏uFz[>g1=)Tk=BRS KAC}J%;SlYֆn|pV?=)k[n% К3gN`^{\6{stoܑϧ~:ڴi@TrqEΝg) ^q\R%\y 27zY_Ӽ{F J: IA/)$&tƒBWMK!Z)'Ǭ:YKϞ=c,^zѸq,'+z+ Ja?i)(ЭO>of|wWN>RPV*{Wn?$mƠAКRIsK,ن f!u/ޝ.]>)_\}9/BFYY;\kлwHaTw^eWݻgmP4ǤRXziYӟ٦9%B*en㠃.{fk)l-.Ww7O9wybȑG "0̕JIi_W)HY;RZLcIOzjY`AֵڗBJ^,SdCR8f*GuT|_+_E벼+j裏U @ @ @X+ss @ @ @ @ @ @ @ @ @ lUj"??b򍿠 yh׮]?{vf͚mʖ[nY;̚5+RUZC ɂR)oq4o<ϟ׾}laRG)$+}{es-Z)5\NF F (/cV IYvZVDsuӒ\R8ڜ}_U[ND))? {衇 ޽T R\*k)(FNX,Zi|}իW%y)įybl6Gm~ݗwLa[)@*9$VT)ܜl /ٳ#Tx`9˛'ǝ>t[n%?sҺyEw_@zSiݺuߋV^}~YM<@I}bzSb!@ @ @ 2VF9 @ @ @ @ @ @ @ @W]ѴiĹ p^Uԯ_?nlG}Tx,(TRFK/4^l5jT;6;ָqn)#NO?4<ݻw̛7/kQؿ?yW)+PaÈ +.ՠAx+Jh)Gcu׍o=:wÆ [:uꔽ3g5m6{w{~:XZ e}UZ^Ve6Zj(˼I?C9hS%}EI1M+ssk/~˛'{i&~$ ʟ+zTHI}{/?)Ĩ0YbGҽ!U~;Pk:]w]S˾ojx @ @ @E=W @ @ @ @ @ @ @ @ @j,мyq} *@ZkH2yL0a;t}n۶m4M)_kߘ;wnL:5up;#R@U;.R@ 75m٦ӁEe\?pq?<;'qّO>.+P }}Wq gc.,UUŋ~;:;_W]NVK,·RY0\߾};҂Jm*NZ+W}淒Y K%UT)\]w}u KczSI!*d"ԗݻg]zꩧZO|:K>i(i_b#s)믿~t֭ؑXy寲˛'S>h{DVsX,182k֬l䟅yG /Br).6dԋ_6}/o^zƺ{ng}eJx^Y@~Uƍw =묳 @ @ @ Ԫ7G @ @ @ @ @ @ @ @ PUn)#rY;e.)(ܔ;yy&L> .Xk}۷ςRRϟxbĉٱ:};v}\;%\RH>}SN9%},?ΎY@N y})@'c?]yq[lfz)x9餓b6c9P~͚5+ܗ;=zt裏΂%RpH ;CzwqGպux'~:Rw:t(lF \NNᥗ^M m0q 'guVwhIl KAZ5#GFB+l۶mg/KlٳGzJ`/ƥ^K?)Ȩeyp +˵RSO=>`ٳg.6nx]4iRpK}O1zkREeҥKt=k'`;r"B{.6ҼJ *KjinLe9Z˛'S[ſ|RY !LCv/3Krlڴi֘BR_\sM:Ѯ]ȇ9IZ%wqѷo߸;#URNfN%M6zea|)3\r-q9d)hY,'Y1ͅ2_uzһ~E -\k3 @ @ @T@/ *m @ @ @ @ @ @ @ @ @@ X(b#40o& )To%ԭ[7ZjUu OI!/oqRS1]{.0nEHյ^`AvUWE Kj;w^])u| :Ka \bO_i{USU_g)n3<*tK@ KA{V!@ @ @+0}fȈw~[+*j @ @ @ @ @ @ @ @ @e͠A;GlԫW/b+) 67o=zXAv@ZLaZo>[O J8ʪD.J FJ#}涎}'.n*+j8+g.Ka[> Ju;{j 9#z?_{&%p{,k>l~d.DIR?R4=u,ܼLEv׵)LY|N;;\c- /ܦs66R> }٦:ܱCƕC߁\}ײg/(9?iu~ @ @ @TSoj:8&@ @ @ @ @ @ @ @ @~_2# Ѳe9rdL>f)dl7Q ZE|U%4\vşꫯw9wѴibgޏ3f:0iҤ(8UJat^x fmVX*ᄆf-&M,xe,z_JNYMSKjp_E oYx<;vk&9HAOյ[1x G}y=,RW5B5kVMW6o8sb]v?Yg*W#@ @ @9u r H @ @ @ @ @ @ @ @ @`U ̜p{ڛ \uU1` [N3_N)DnРAqwĬYrqGnZr/^'|rОEEϞ=3Έ?~9qhU1":"]qquUZ٪k,_ =C8f̘,O=c'V~tҥ?~* *{*ٳo߾1dȐ+K.uV\n喸+cڴiz:O @ @*Z r92b+ݞ@} @ @ @ @ @ @ @ @D ?ɲ9ׁu7|!PÆEtPĂ VJh~ɒ%O=da4m48\Bs7n\YkfJ+RRVG?tfN`Re˖E?ڮq :4{x嗳;.=zlk׮0" ~bHͥzƮtU G @ @ Z+(_SI @ @ @ @ @ @ @ @8ȅEuFh|eDcu֍=3[̙ÇǑG.D޽cM7ttPH*a.EZ0w,XjĈOG}]v;,lZ tU97o_lvs՘p* @ @ @@e /G%] @ @ @ @ @ @ @ @2[o-#= p@ǎwVOVQf͚E>}eY?38#::۫W,d+mmEOM@5HK/>l+QNyN/6hj0] _}U7 ]tQ\yQ^0tc$@ @ @M% @ @ @ @ @ @ @ @TGΝ#.8+"q\:t\8HD O7n{Ζo9ƎO?tKK!'۷v!vqlݣGhذa &M^|H˛o/n1`iI&T)#GƱgTu @ @ @ Ԫu܀  @ @ @ @ @ @ @ @ Py\1lשS;|"RvjKe6dHK }xeqYgeaZݻwm6fz뭣K.ѠA(ԩScԨQk-'OFed^.ZlY&-Z_~y\{q]wZZEWw @ @ @ * @ @ @ @ @ @ @ @(@.O$n-b]#{,⠃ـ*I`~Vѡ-"[N9_|JٳգGr-[nym۶-ڤm!p`ѣG[o-SL~v9~_m]5lذWP?~|uQ[o5z: @ @ @JU] @ @ @ @ @ @ @ @ zE{lG{D+ߖ3 T@u *i۷>8[񂂂7n\2jԨx'c[΂vmYG?;f@%]>M`Μ9fK zwމ?8-ZrIoyuFϞ=-Z6*zꩱFo=5`X@ @ @ Pjՠi( @ @ @ @ @ @ @ @*]{".,b+x衚%PNdMO>1cF3&F#<i*M6M74:w\x~v *QSΝǏc.|Ggtއu!Dnݲ%+B: ?i <88㌸벰<&}'@ @ @~;[3Q @ @ @ @ @ @ @ @ @` N"8' t1n\l֭[.-EG:}x>?8[ s ,Ȫ6l.^#-m۶um6.0gΜ8qb|g1a„OO>)\NZ 0gB4hPX"OD߾}{Ĉ{֔ @ @ @@ Uo! @ @ @ @ @ @ @ @ @*|r=DѨQU>f-X8raR=zNurIwi~%K0BƏ-of 2$MVX?zYVZo>:tԲFÆ ϱA|W1y4i2K>D+ɗ 6hjCͶSH\ jѢE5-gwyg}q7G˖-k  @ @ @ Ԫ @ @ @ @ @ @ @ @ P%ԉ4(gψN"ܲJvSj@Α yxUڭ[n-%ՙ?~|g˄ ?ϖz+ 99sRj*RVѥM6_RWNf͚-u5[`q.nƌ1},-NmSN)S,,\~K.YxV JKzs?|7_,X? @ @ @@U=^ @ @ @ @ @ @ @ @ @Z lEgGpCĜ9r:]Cr9<En *FƍcM7͖.;'O4)&O-))mS`R OZhRͤ[nԲkG Zke˖ٺkkF%e{>k֬Haji i;-)8,t/ak)mmvelu:)N!@d ĀbƝwm۶- @ @ @Po. @ @ @ @ @ @ @ @ @& \vY>j_e,P`"^{vtYf+ JHAJ)P)Rҗ_~Tѣz`SRiҤIõR(SZZh͛7_fI}lڴRK:?K앖Fe tjoőϟ_Ns͖yn}Q2{(:ud#~BR8ZN LKZ묳N~'xbL81 :餓~X&@ @ @ jt$@ @ @ @ @ @ @ @ @@me_w߈'k4zcJ;q)^ԳӗBҲfy)*5spYf-7dPn OZpaҒµ4h-~RK~_ݺu#SҒĒ%K6VtIUEE~"-i,ŷӾꗥ>RX0֭[lC:dSXuin,^>vex'UW"@ @ @ Pq*RK @ @ @ @ @ @ @ @ P>DvXĩFnDƥT@% @o3&GJ+\qnh׮]շoxbq=sl@ ,NJ Y] *-,+RWJ|PW>|WIA_),_}𬦹ô)TO\7mڴ4hP]=G @ @ @I @ @ @ @ @ @ @ @ @U"]IUoYi%D%FEP@%$. JEUD1AEP@@K$;{Ϻl,;s]sy_?ʔx9Q* +'e&-X@V8dtR=.4k̙[#Bd; O:d5x`5jHgV4@@@@@@B@@@@@@@@@@@@@@@@@'PAZIr) _B+P]}f͚e&?@@@@@@| P'&B@@@@@@@@@@@@@@@@%ғOJIgJ.W'GGV5)#'I˖TUvm/_^ ,е^b)$`hʕ*UhkȖ-ׯeUT?G<ƍu'n?@@@@@@$@V8An@IDAT@@@@@@@@@@@@@@@@@_GuJH/^^r4…og QCPAFׯZhviԩ&H۷WHH]ڴiժU+=MÆ |DvR֭U3ʕKk֬ѻᆱ̙3;U@@@@@@0@@@@@@@@@@@@@@@@@(pT4xtueߢV!KG4HGz=.|'!>@RhٲeR|i&w!NwT4r(;uzҥKkɒ%?~fΜ2eDy<@@@@@@@@-@@@@@@@@@@@@@@@@@+ >4yT:u y*жС -"pa5h@Fĉs%8E+ 'OիWO!!!՞7o^ըQaرzꩧ\w﮳%O#TT) 0@}ц ԬY3!,@@@@@@@ 1ٌ                 ? /ZR~?{H@,R҇J.$$΍]TfMmٲEWƍ[!xeR᧴iz޳=c} }9sG}Zh"r-wu6oެ]*]tIW4@@@@@@!@VҸ@@@@@@@@@@@@@@@@H3J~+oVtY H:H/(y2T!Մ [΅τhA'мysI&Bϟ?VZE?V^Fŋa] U>}<-UzueʔI+Vg}]ʜY K'ONmB^+O,b;wjժŋk޼y*X`l@֬Y]TԩZjxJ~ʶmtmٳ?gΜѦM4vX͚5p`ȴ@@@@@@ u/ @@@@@@@@@@@@@@@@@0U ׉uaB ݺIkHS I&A5c eϞH&m۶UhhMOJf탾gWztѰԅ aU\9f@@@@@@@ j@@@@@@@@@@@@@@@@@'PlԸ*\)?o@JRfR^ҥK. 1B-ZPv4j(O>n@ 5jL2^XTVG'Np{'W^i7@@@@@@@ bb7                 @ d,';'^o@>ҪU(2>i2dBB/Hn2dpy֯J%Jmy>@nmذ!0O \fM#      p\P?                 Rzʕ;6mROHV8Y'N#,Ϟ=..\2uJ&Mstٓ%KKﶜ9s*wʔ)Sf; T(l)%5k&yn&? 曞级yuݏ%S*`O6zSNӧOٻn(~=44T6_x126[߳gOXڴiyvz nzmL6ҧOf3fwmicwc9]tIm۶ܹs]_c+k^=zЏ?G@@@@@@(ԊM                 @;wFo߿?lIeo`uM7, βq7@@@@@@@?<%E)                 )QB)֮]իWy͚5.7ɓ',ꫯv붴 - bӧ]7(3Ҿg-[HsB_4iҸp }طiz5mgB % 4H}q)@@@@@_<ŧ9s:u|=L                  E~7-ZHK.պutye̘Q˗WŊլY3eQEUԩRE&0-k\wunK$ݻwp?C =z  qVUTQjTzumo|-u*u(<(Э[75b=p-Bf"+$YܺuOo߾^uUaKeʔQeL pK[ϕ+WFYf_& f-m̙nyȑ,,XbasIOJBҘ@@@@@@@ jTRԻ؊                 \`ٳeytO^7x,rn, b]`۶mZ|-[ɖ,Y'N(K,.XnݺW%`wW*dZSV/{= >\mڴqϐ!>s=) &+]viÆ a$nܸQtwI(Q…)]{•l{N{0%KǏk.Df-[\ٳg]moe˺ N[lQH֝4h'Y!     W@}=                 pѣG5m4O1coe˖M5k#?u´,TɿkjTiΝ}){հaC5jHoŔIÆImFyի|M :4,<̙3ʘ1&M&MDqHZ~d+Vh͚5nGq ULtuשTR*Y J6m /^Ν;yfmڴɅYk_LT|yUX7p*U̙3_ P+:#    t;D@@@@@@@@@@@@@@@@6;VǏׯ* ~I;\re$SG֯_,B,jժj֬ZlbŊSwOr\!<"    $yԊg"                A)|r f̘u$G@@@@@HVj%Ig@@@@@@@@@@@@@@@@@ 2D˗׾}pB >\xÔrrȡy󺐙={… )%=pa%OOΝ;f͚ɖ'OUW]ZqǏ?նm[(P@s͛]1!@ R.]|r[N5jP׮]U`AeߎL      \i~@@@@@@@@@@@@@@@@@'O}ݧgyF/,YₓP4E$ŋW_}?XkLzxH^[i2Oī7)Ci՚:uS,P+[l>AD8q^uO]a 8P;w֞={_Pb(W>YH}X}G{@@@@@@+@V`})@@@@@@@@@@@@@@@@ԬYS .Լy\Vԩ^/@vb :uJUTѺu낳#W*D"4klMOG1cY|=ٳz8!.]?\8l0uVu҅6 ޓٱcG8vX-Z=o`wY?@      M@yq4                 ݫڵk+44TK.UjՒThL(V,X duj͚5IIU?.5o.m+ߟǦMrZq͛7VZ֭ ?ԡCI@FܷW_}/B_V@U      @p4@@@@@@@@@@@@@@@@@SԸqcKNrȑ7NcO]tgIqڥK4sLM>]'NʤJϔ)&MMꮻŋU`Aד 䍨R%];Nɷ6lP6mԩS'=qj.]~;wM18`vmʘ1N1Qm裏e˖v]M$QFGѭ* ʓ'O7 x ?^SLь3taגՍ+W}=W^UuIq9񱂖-[ݻ﮾}֙@@@@@@H Ĩ:@@@@@@@@@@@@@@@@@//jΝ駟m:tHgv:'O҂/"OQm|LR}Ew]۷$L״ij̘1ʙ3ڶm+wl٤ᅲ~Ezm #=*VAū={=w >|֬YˎnsڵZjUoV#Fp.\Xv]WbŔ5kVnӧձBjfzK&LHQaZF~1={֍x =ImMh{s\u| ݴ0B 4}7ck=      @d"@@@@@@@@@@@@@@@@ŋO?k&Z&.]ZO>OI6z"kAv[A=N?RN~XeʔzЌN,Ԉ)nժIIzIs`9C0; _K.]]VթS'ժU+ryؼy в~A~,A%Js۷ϟΜ9k;8 p}zB|~UK.P@×u{z@V.kA=.ǵ}{Z[Õ!C7.|;ٓطk.>_d2gƽZuEue}oTnb vc篿M6jժٴ>F7:t=vnvw=[-[t{^[-^X5jP="}=YG]`!NgΜqASNF 3ϸo g;v. 2D:v_·(|y\1^xOdD g( @@@@@@ 8B@@@@@@@@@@@@@@@@@+`G.]R&M͛ Zt,[nq3w^6% y'Nvښ={lۧ~ꂷ}YYF|& 0 8k7l (\6mҥK^a>#P-3P4iҸU^˝|'a^wq,ɓ]UX†~gɓDž$fV2e(1]乇y6 I iӦ z|+رcZ~LgCvZ0M 4pc?l̏|[Q1VrDըQ|Y,ζ:>}څYXeڴie\RphiӦ/gBa.lkٲenwutXu\wݻVBkacγwH%ŒsBz뭷>|]XEu[k׮MpY      @tMkt{َ                  ( ,*$$D+W5~xeϞ]aShh,Ɏ9s (X pxȖ-w5^˻d[in³"O]uUJ*jA`O؎hV|1P3,X;Yɜ9stY}w:zիαp_v"+W\];yf S{T+ޤ87O>ɓ5k,̙3G>en5iD?9<5{l]O޻gϹl"Y5\~L0{6lyR:tҏk"\w@,{}{,Ɣ]v_w7S@ʌm1b瞰&͟[G ޷o, =ҥd     $X@R                 5jp3gL܊Ֆ)S&kҥz)eVX .\vL 7Dնm/N2;worxٸqv54 \1c}4M}.$5yCF^ Ԍ3t}]VСCeĽB.; d:Ν:X{mʛ7o@uk+4% 7߬իWu:v{f͚^`Mm۶EoW˖-5m4Y_]_G_}q_9r³vޭ;v?ݽl ]{>-:ut V{^ҦMͧ      J&!                1 XD tX@/^\3gѣrʰ,]v:{, ĉZlY~n{͞=5QF>516 eX;,r@<kXb6 .,}<R< //1Jׯ 6l_1,P6Zf*U_U5 UիOj=ǜ9sTs*TpҥKUV;wnwX#l |y[HՋ/Ufޓhc+Vйs4~x]V6[xwg;}6ÇS}}c۶薾acG}3gθl|߸q^z%ȑ#>77P_($tUԴiS=j޼yBd&` dB@@@@@%!(@@@@@@@@@@@@@@@@@ qB1Aŋl u |ʔ)nFWMڵ]xƒ%K4g͜9SwyM[xX0Ԙ1c→I&;wj֬k|iysɂ'o+=;wv,Bn ӧBnaSNUզM}wڼy\ z]`5.{.… .l^uge}0-ZYf'ȂḚpºe!-2d+Xhٕ.]څgO<&ZX ];y";y{0/vsebҥK5c ٳGS޼ycPWdI`w޷~B -{dndpctt9~a3ia> .TܹUD Ww Nw?O?6#`7thkx%& z6 W*޷jȐ!-ƾ,\& -k9f˖MrwZnX؆ ,h#մiShb-  du)lO'I*[VdKyBuŧ~^,B ~oYН=.]:`珊-[x ;ڻw Jh(n:t FP[oUwavht},,˂z?U'nBM F:vXȿhOy:h+×qٮZ8_(>uG>Ǿw#oLB,Ͼ@@@@@@?}{NiN@@@@@@@@@@@@@@@@@@()S&M2qӕ?Doj̙URh덮MuwF{wG.]ԪU+ZUW_yvD,|Zū?Ⱦ;s_x^zJ.p1>!     @$NR                  ˧saÆRƎjժ%>nݺյʖ-zk[+W1q=={(FL211c'7o $&U*RRҭ&VI?gϮ޽{AGͣ-UӪU\ #7bŊ.)v~_dɒ7o Sѽm&`-_{~%Ǽژǻ}OI} o_קN~wuMݻwW}=RCTH{     Hu3`D@@@@@@@@@@@@@@@@H<'OC8q CԩS'^|^s(b3gN[z|8SN9r.\oQ>ڷoJxIÇw}.[ `˟?oqj^˖I7ۜ9sT^=M2E4VZ?~Or}]4RN8_| c|gux@ gϞշ~?#<^*]DP{D@@@@@HKyHW:IIqj%KB@@@@@@@@@@@@@@@@@ 2D/J.jժ/g=zT.] +5M4ʜ9sZ9rH2d uVY͌3ԣG|`׀)qnA*^\6M I]xQ+WzO?T3gSd= ?~\} 9|>UFdS@`֯_/Ri>snLl͔!?xrA@@@@@ Ajş go0g"                D/`֭srڵk;vDB"ɖ-,;_0-뮷~2iYL׮]U\9۷OK,o!´WU֬ҨQүJonG"Zʚ5kԿDٳ}KNIIQ K,.4r1b/ծ][%Kԫ 6$f&];nR5|O{Go$Rp5B;ppZ     IZ %ϔ[H@@@@@@@@@@@@@@@@@%0uTuE:v=zhѢ*O0`>#eʔI}uAHHHu&si<ϧ4wTzvɓ*U6mO>$q+6,`!A#G7|:5kUTQT\#!<27qDM0AK.5\6mTٲe#4I _ޅY2!     KyHsHuԊ݈#@@@@@@@@@@@@@@@@@ uA#}v5o\?n Y`ƍ8p ̙3[nz'1cƘOdo 4j$Oz5kUo_~ڲerΝxSpcj̘1Zvˣ aÆ_>{) ;vLgִil~ڢE {ェV!sW2%j9~L6#  Ws?wV-ҞB0K43~,3fF&ӈa Y1Z EтJeLBcUy9ssޟ~9"@ @ @@*<@iI @ @ @ @ @ @ @ @#zx+>:v'pB/j׮]bơ ,_<|cԨQѪU,8헿eTRel|ѡC>D^ݦ)gYʙg\rɦ9 )HGt_LɶmƏ~իW#fPS(:dse!Z)HkĉY`v D`-뮻..j @ @H =Ux;-  @ @ @ @ @ @ @ @ P"&MC{7V\x`ջwZjSY,zժUY?6lX,[,:85ʢKIOF;#/5\)lVZBg y?>zx㥗^ʞ)|{ܭ[hӦM/_>*V ̞=;^xxg+)45}wӳ};rw`+"HSNca"@ @ @C@Vᯣ@iI @ @ @ @ @ @ @ @-';ѣGG*U?ir!y?N:%z|>, ycĈpڵk 0 EvmKKN?@W_hذGƍ7M 8Ng9.=\3&ƍ'NFѥKe]sٜBl-͙3'^~lN_|1>b-f s=G[Reرc\wu\ @ @ @fUxvZӒ @ @ @ @ @ @ @ @F`Yփ>k^:co96 <{ڴi1rl5jT|ѭ[ӧOqѴiSeO>Q\uNGk5keY`ժU&L^x!&M}^bETV-:t۷v,oLю}ɒ%1ul~5/Y1SL޽Zl;su]0ʕ+mz#PڵkǠA⤓N*DkM @ @ @@U+PvZ @ @ @ @ @ @ @ @ @T ,^8x'{/jժ=z+[`aESK ?~|1cD ;KoqFzܬy>ѽ{ĵFrJї|ЋE=(e)0K+dsBҴ6D֭cvzԢEhҤITTiHAoV̜93xxbƌ<ޖBR[;uꔅgըQ㇞^{E.;c7.%D @ @# Pk PkL @ @ @ @ @ @ @ @'yl;vl,\0 JZݺu.]D׮]UVQ|F-2c{」W^o ~4- ~ (ڊo8b޼yQ^\oʐoӦM˂Oi~?ҽqѼyhڴiL۷j2UtҘ;wng{|l9k֬l=)=;S ckӦM'ޣw$G}BJT; @ @@ * @ @ @ @ @ @ @ @()8g &d!P)pkŊQjh׮]t!ڶmE Rà֬YN^},%-/^g$J뮻Fݣ}eڬLV:wh('N!}orv[n:-3go-gϞ(P>ի;P07l04ho}z y=xw9p4[[N,P-dEѲelY~()`KM @ @S@VujNK @ @ @ @ @ @ @ @X|y5eʔ,c5B>B;vN:Ŗ[nY hr7q1EO<{~)DOcΜ9YRz>0e hJLِ?fz"/ժU+ [nlټ6,jH ,[,R… ?y0 /X+vm>oRXZ&M4ג>W]uvF @ @ʼ@jNK @ @ @ @ @ @ @ @>(RT _Y\2 F  I˴f͚YhHգ|ze͚5YV ZtiAF~F ȟSJ DIc͟R}Z֭[gsZ\rq7F^bСBL8㌈M[p)?QF(vIϔ4 g}6F^t-{ΤgO Zz:TT)RV:ue sJA\k3w9=T\Buυi)s9Ugszn/Y$/^\L#٥uZ~֞ʕ+`{P> J=dE{:eѧO\,QM @ @ @` *%Ux;-  @ @ @ @ @ @ @ @ @)"Q=Аe:S VZ@*VUbʕ?,#+?#j}}Zjm/SF Z{N&7=q'facw^¶L@Gr3I 7G}Lk]G?Ose\pAMR)*SP^Z_;(*yp/ +XO4ӳoO[}Xv\陜i=55s;8/0`xwbԨQ2g @ @ @%T@V/@iI @ @ @ @ @ @ @ @9.P@Q $8G @[n*oSELya4;c۶mc=믿phE@ p;3 gώ?(9䐜G @ @ @@U @ @ @ @ @ @ @ @ @@ 8;.N=ѣG^R^ S}".0bg>|xlv{l|c-(r%KĠAq??ѧO={v^hѢE"?  PwuWt96mZ] @ @ E @ @ @ @ @ @ @ @ @9"Pz+cĉjժy΋e˖H^y߅ 3@;,ʕ+ @.\]tQqG N;wnFytDOay} @ @ @e[@VپFO @ @ @ @ @ @ @ @9(бcxgkn!ڶmO=?8SgϞ=*o@~͛G\vXjU=:w?`_|1=h߾}L<9/x7N-lnAe{.  @ @ @R. P_`#@ @ @ @ @ @ @ @ @#PZݻw^zŊ+bȑ /D>}\rS#^;w޽{j"@ @ @J@Rt1  @ @ @ @ @ @ @ @ʎ@O3fN;?я㎋E26ҼKFs~'M]v!@`V^w_*sF:ubYOz*RKBj$@ @ @J@Rp  @ @ @ @ @ @ @ @ʮ@Æ cĈ1lذx'p{삔ydDW_6X+Vmݖ[:hٲe#{챱9%F  }qA>SbV( @ @ Pjz @ @ @ @ @ @ @ @ 7f̘vX 0 zsΥS*V8묈oon1k֬ҥ7wB ,_ ~a\|ű;8cbܹ1dȐlw6H`qF-⢋.*E#3 @ @ @$* WI @ @ @ @ @ @ @ @ @`#bK`Եk8cٓsQओ"?bĈuKZM4ue|"~9;c :4>7o^ 4(իF @ <8&L~{TT @ @ @\;UQ @ @ @ @ @ @ @ @("v)Ǝ^{mӡC5jT%иqD7ܰn)PYfno̙3'NKkڴi_YE]u6 @,=>hٲe92 |7ώի( ?yg?eaH @ @䞀@ܻ&*"@ @ @ @ @ @ @ @ @"аaxghm @ @ @I@fwZ @ @ @ @ @ @ @ @ +5jԈ!CĘ1c7XfM8XtUvT h>+Wmڴ#<25k/R#X >}zѹsgL gxz=:v}e @ @ @`?6 @ @ @ @ @ @ @ @ @\rO>>СC\s5zꜬWQnѣGĈ_^#Z]`ҥ1xq]ƬYnVZ -F.]O>qE ݗ @ @ @U$@ @ @ @ @ @ @ @ @%\`w'ƹ瞛={_ G}t VjFdv38#}"F,u-8 -K.$ Һⰼ/5k7M-jTrUn^zEn^Mj"@ @ @ʰ@2|  @ @ @ @ @ @ @ @|@JI&:u+SuMo„ 1jԨkb#~/[,>SCXF^bҥq }l^Ah83c޼yqqe5իWou F߾}SN??z表Yf> @ @ @ *ް  @ @ @ @ @ @ @ @ @ o>,\K.v-Ns o={6m 7P:Y_ڷȶF"t)*mJ[9#0w,I&q=duG:ubYr)xG]v1qxK/rX!@ @ @|% P+ k @ @ @ @ @ @ @ @ @TP!;8ĪUub֬EEѝ>lrI&E߾}m۶1qĸ[b̙Y]ʕQO ԪW7@*NHk&L~8㎨UVY%1n @ @ @ *aL @ @ @ @ @ @ @ @ @`s /_>:,Hz.~Xb.mߪU, ,5]vyYxO'|r|xһwQF;6 :pR@ rN`ʕq]wEFei[ 4 @ @ @J@zM @ @ @ @ @ @ @ @rHy1z+cѵkxs/O1k֬o=B ߺ/v$֬y?\(G  Rwm۶#8" |4iR<ѣG6fe6̱x>  ͚5c=6ڷo1"[/4 @ @ @ *_ @ @ @ @ @ @ @ @ @hʕ+~z+Qv֭[\|űbŊ9A1ҿQFx|:u&rD6B`qG-WUv_6mZ 6,vy雇 ->5kĨQ_~ѨQ}3gw:t(}6" @ @ @ *  @ @ @ @ @ @ @ @ @FsNnݤ~hܸq9rwCO֬Y,/Kk׮1yr<0u뭷_|ͩ5k+)RLO+&Mg{_n"~GŻ۷;Pȩ=zij>[od L>=.읯W^1k֬^zJ& @ @ @@iUڮ @ @ @ @ @ @ @ @ @XfMAsmz\X3gN̛7/2WriSLZjEnw]\2WK:c…1|xm/.9?,ؖk+;sڤ\+K=eD`ѢEo}w̖ UC-rԭ[7B cƌjQ x;@IDATJ@zoKm]wiӦ /{lTZP @ @ @=@v @ @ @ @ @ @ @ @ @@xK/-/رc\Y93@Sfb?9,XW_ٲ;uk\|SOeu{YE5kV ժPf[׮]bٲc^ʐ@ K׿5 KtD_-ZI''O~ӠAom5(:ߢSXlY<;Sz[bQFe{_~yiӦd L @ @ @B *$f @ @ @ @ @ @ @ @ PRK~bժU ,)vammʕ3<3LUV]XreN;a„9sf|gf͚,[n==3[ٳgM7rawi 6i ̝;7N=hҤIyY]p­ڪT/^ݮ]ӧOԫW/n Uu֍FmlSoAD̉'ƕW^?OgqY0[oC +; @ @ P*+ @ @ @ @ @ @ @ @]˗HaI˖-:io}^z|=P̟??N>e] Ҿ[o5FM6?YK],X;s{QVlw ;J*yu]cԩzTRwy1z3fL&O]veѬY8Sދ?< z_:x?8?',j-_YCAMҢE;vl80ۢm۶e?i ԪT}t3p#ݤ>4hР^԰aøꪫst-_|l2s{_]vV¤IbQFH5)_c=6qtA) ,T<[;#zK,ٳg… )d!|;6\\,lgѣGG JO?eUV-uԉ8 ۗO:G PBPK/`t'f5puVZŸq⪫R[/kǫWiN ^SL &ܹssaeMWWgZ`:ƍ߳ 6md͛g &D 4t/4-+]v{K}SN)SdszLg}+W;fobvt2 @ @ @|@7r @ @ @ @ @ @ @ @PO>YWyUUc+Jٳg2s,!)j}S Fȟڵk\-]4XjUz#,4k,/^m~e {IaW 6,8n)ƌ{g|BqwO)nȂn8蠃SNjLaUk΂RTo/p6ǔ¿=8㗿eV837[Hp(szѳ>˚@ LAZգGxǢwޛ!jիWo:N:8CTkժU)0i)m>Ȗ)~U/~gcڴiٜBZ׬Y[neo> J!]vmFJJ'Q @ @ @Y@V1 @ @ @ @ @ @ @ @6_, hzB*Vk7x# DH|[ڍS4 Pf͘8qڇҔ>uW=\1"k¼va7]GFeo,뭷ʎ袋^M|H7i ;/z衸[Я\ձ6+VD,YyϒVz7@ 5iҤHaGQ@-[̖?O¿Y:;a}g[xFhr%Ξ=;g͚)l5wfڪU,,WULAZM6ݠwǒd @ @ @M#ai, @ @ @ @ @ @ @ @ @`/_!y睘7o:oРA^z7$P༕jժ-Bޞ̙M;.Æ ˗ãRJq-_)t+Wf!T׿"kȑqg/7"”BչxH!bCBrk2dH}koʹpaΕH;3 ~;cOTV"Li[ :{E&fflӯKLYO?t /0[ԭ[7 Fܹsqٻܹs=X63M2%瞬}>}ύ}o$v @ @ @@ U/  @ @ @ @ @ @ @ @ @`4h8f̘uL81V:u@?|cCjΰf͚ß}ߵR8bC9$|,پSO=58#W^4zSNԨQ#x Yzuz`[. ug駟?s &ĨQr[kɦ[@@p Ѳe8k׮1mڴ,ܯK.R})P+vmTn<KO?3fdM7xcN6`ѣG4j(T͛7}7:Hmv}袋GڧЬSOe]wѴi(_ޟn, @ @ @%G)9J @ @ @ @ @ @ @ @ PH>}N WnR`k~:g?cd~u;3mKN8!r,xfBiN9ׯ_\}qoћo}?)HVZ;fXi JS!K,jժmjb]wmFݼdL^q饗fcٳg4i$veM.[xbѾ}[r D%gZ!Z |mH2W]uUv/H1qwN;֑rXhQԯ_A)T' iǥ{R{S xo# w> 6lXsgġ)omɂC۴i?Oⷿm~;wtޛOcK.͂GGviӟ4Zn+W.\Z @ @ @@5yS# @ @ @ @ @ @ @ @ C3f'ڴ\3*6]կ"+ [0`@\tEY`_|K+;ģ>^{mz֭[}qmz衘;wng?ŸS0֭Zps=7 PB1tvmבJW) "?H+yOvmWpu]Ip5kf_qѿxGb}{8p`bŊ8䓳Rʕ_y.DժU ŕ˗gHd)(:믿>.)#ڵ#kUms|G=.N<8s6okC-R^7.wfOsB Spq6pߒ߂ !~v9w4r KY]-z3 @ @ @6QnĨQ{)aU.r  @ @ @ @ @ @ @ @ @`8㌽"6̘1#.]:tիY Ja)!6l̔fϞU5m4[nL%KdV*U*hpfm >J RJ['|f͊f͚Ŗ[n]ܾ1~aP:j՘zҜryj*".8TۦX`AȗB*VvZqV[m2~^zҥK̜937oA xkZd?wRi2woʕYǕ+W.JFI_ @ @ @M# P TK @ @ @ @ @ @ @ @ P*Tڵ֢SV&Muw(W vY700iiϖFѩSmݻw)SoۼСCV܃iThѢ>aÈwК7jՊ'\/E KSz7Y渀o}nWO?BEShoegŊY7]%cwv)~Dƍ9m_FnH}!@ @ @(9JεR) @ @ @ @ @ @ @ @R.-dk.ZZC;. G馛⠃ڤ mB4xMyF5_= w}wwWƯ~\wCJc)#gEe%Fr,(^7x`9sf{@ShOf͢iӦѳgySp>K @ @ !P˷ @ @ @ @ @ @ @ @J@ʕvxԮ]jX&ƫ~z|q5\5k,6 #^y^&OӟbѢEQRR1쭷:?R1:ߒ{eSp֬Ybڴi1ulSp֊+"?4e˖ѦM8Cyٽ&MVR^ @ @ @]ܚiW @ @ @ @ @ @ @ @ P ODݺFEW1@]`Ĉq 'drK>\)`Ј/X0W*RGq ?> zǢSNqD߾}|}jXGwdɒ2eJe Z|yvhڴim6ڵkgn:ZjիW1) @ @ {YB7Ւ @ @ @ @ @ @ @ @ y9޽{tI8N=Ը+Zj8{~y(8)Fi=:=}r~p: @D |Yp֘1cbܸq /'|իW tP?JHM @ @ Pj+l| @ @ @ @ @ @ @ @ @ 4h sN8fҥKԭ[w9K @ @ @ ԪB7P @ @ @ @ @ @ @ @ @8c]vc9&r˸sΉ:uOդv~ Ԫ&5b~, 믏)Sı{nSLu͋#FĠAeȑ`x㍳38#[PI @ @ @@uU @ @ @ @ @ @ @ @ @KСC 6,K駟~E:^[@{N7tS7fϞ)$Ί֭[WI9%g͖G k۶mt=?d-Z=  @ @ @TZ.# @ @ @ @ @ @ @ @ P*:uğs=㨣.]d=zAWsKl'jO;Q&M[nuf9~zUpD@y ,X ^xgQFEӦMି[)\C @ @ PjUe @ @ @ @ @ @ @ @ @@)v#G:+n?YVV[-LR~ .cK8pꫯ뮋;3V^y SOf͚Uq #)4kذaK/e˴iӢcǎYd aaÆӡV @ @ @TZ&" @ @ @ @ @ @ @ @ Pv M7z={̙3+̂zl!j}]U1Q}gѧOc֊k6?hܸqm15J7|3F-ÇS*g]~GNjԼM @ @ @Z-u  @ @ @ @ @ @ @ @ @j/н{8qb>qEŨQ[oUW]m @q":w^)UW];Gydԯ_EK@ zΖ5v؂h۶m+"ndMN:Ы& @ @ @TZ @ @ @ @ @ @ @ @ ͚5!C /{.]]wrTwƌUU/K<3馛ƃ>x@rr ?>R@^ZRֻ_~eʚko#-2u-[\T'@ @ @ P{j՞{m @ @ @ @ @ @ @ @ @bk|qꩧhҤb5nAnXVgUפQ4( JAnb^{դ) -0u{1jԨ(L6-}fqoynݺF @ @ @Uޢ#@ @ @ @ @ @ @ @ @>`YV >{c뭷VX`;u$>O=To./rݵ (?ѣG.)xoZ\eUk׮rG&lm7K  @ @ @eU&> @ @ @ @ @ @ @ @ @5EC>;vm .K.$ի\@B,X㪫>(z#GڪG2eJ³Ғ5a„~&Mb 778w]tɖuY$@ @ @ @oh}Z @ @ @ @ @ @ @ @ @ i&rK{}ݗVf)P`J%̝;7\sM7.RH[ J< /ǏO>phM<9J+oF;GZwm۶W# @ @ @Z, P|S'@ @ @ @ @ @ @ @ @~-T~G=⨣-"vZ WYo爦M=_G.0s̸믏sfl:t({Z @`?S|ggYfe׷l2:wgz 7uYg@ @ @ @@Ԫg @ @ @ @ @ @ @ @ @LSNkUW]g}v,\KVz6۬UC뮋;#5k~zꩱ+א ,RhVnIYcƌ3gfH믟ez:g;W* @ @ @U] /TA @ @ @ @ @ @ @ @(GlѲk>hD PF_޽{wRWjU~)ϓ&DtKp֒Ma[\qKxQӧOb5׌s9'N8hܸqj Z}]s?G̘1#JPǎ RV.DUV  @ @ @-[F {.=zݡ @ @ @ @ @ @ @ @ @@E l/Z}4s%wzFSN9%v}^{mJ~y晑B֭kG}v)b⛜;7b㍋?>ꪫG))v[uQ"PR~cƌɖW;L)W#؁֭;'zjnx}ڴiyy/  @ @ @y#2F @ @ @ @ @ @ @ @ @V \w]$T^GWHLx,Pk5׌/rfϞni|gq%ğs1cFĺFL>8s%gF_b&\tPԩS6{-X`A?>Ǝf)D/Yfe*M6f.?- >@ @ @ @hɓ#Z2$bjT}rʝT @ @ @ @ @ @ @ @ " %"zXY , caÆeY)|nݺqg7)&///;v-[" @ I98i]˼y2Fh΂^~fm /޻DתD ̜93 JaY/ƍgSk޼yt1:t:[k>M @ @ PJ/*Pv$@ @ @ @ @ @ @ @ @**FFD~\mI hU a۷of)lM[-[>(R(MeөS`O>Q>RA;cn{OgAZ#GݻgAZ;Ӓ.q@\/²E/.)0+-22&@ @ @JRW @ @ @ @ @ @ @ @ @)p18jկq´Bvu8CO:u… -X R ' +Wn!WE+Vlj^ c1|8SAL3ݓ~8c}){#uH=;@zЬ[r3fȦQcضmh߾}l&~gcM4)t}b @ @ @^ /z @ @ @ @ @ @ @ @ PV hizo1{['|2ϟ_lwygwqŞ(/\K/mŷ9w,LkBR٭'tR6t{>}ĸq. to"0eʔ &L=͛gY:t(\Yg[Rz))߲ @ @ @fLѲeĐ!;P3TYUY!@ @ @ @ @ @ @ @ @JmAզMDAވBBőG>6lF_ȑ[ohky_ѳj^ o/ JJ!BG+׿ƤI裏;/RАB*̙3'ƏЬ/2;6}l)ku²ڷo_΅f+t:+_ @ @ @U@@VoB_J @ @ @ @ @ @ @ @ Pu:*_QSujd5C૯O>yY`Ax[oEpVp-⠃"\Y駟#GF ٪_~̛7oHPϗ牳ώ_R\M)s̉^z-1LGeAƍk]pBRO.'J+E u}ܹsN̙3~‹RhQZRHW SI]eƌ,:wmQlᆱ[DnbW/'44iR,垫䓞?>{S%=Rg=OA>)*=ŭs6l)+,XP7~lI^v^z:5{-`RUzwR4Ы?ӦM+ +޳t.Y6kfZْ[n]߀6{0"y͛7waefm8'F -_~eaVz7 ܭzK Jao5;l~ @ @ @'@IDAT+B@VjΕ @ @ @ @ @ @ @ @ PJh2x>|xYV iժUt5 JU%_Q%}'YR.+~9ұczcmw9 ZQco 1c^T">)8+ܓFڴiSRhT o⠃RhT Ī%M2% \/% :R@W$MxEK [c5bu׍veRW./g)[ =/),+euۜRIqm۶ٺv lK_m*n+ @ @ @UzyZs% @ @ @ @ @ @ @ @P ^x!^|ϢQFѭ[%R RRȑ# #FĴiӲ=zDZvmHHJ²RZnI!k9NNԩS' I=ELB6mZ!VShY JW_}O=Tv?RhR:\I!elAt9 K78{/su@.0+z̙$R8Z J˽sӻW|n @ @ @5O@V@۹ @ @ @ @ @ @ @ @"B6lX fX͘1cbرG ;-UW]5v-wh-.]D jH5Q.0kxXVϽo)h`V.8+^gu~`ƕ;[O @ @ @ *|Km @ @ @ @ @ @ @ @XСCo'|2 q?Zlkӧǀ1p7o^&vI'>u֭93I>7x#[F}Y,\0V^ytM˜6xHLJ8qb|ᇅK)$mYSݺu:[RPZ qR&aYEgΜu[nvڅx.s6 @ @ @@ *@۹ @ @ @ @ @ @ @ @iӢ_~qm[nep qkQ~,\;Ae2'xb%(#kj+Y֬Y7YRzv7lСCURϏO>$}x뭷"{YVw]lْ¶ׯ_u7D6mrUf}]a`VѠ^RPz뭗vnUtCߥ8K @ @ P1J*Pv$@ @ @ @ @ @ @ @ @@o߾ٲ`8#⤓N7߼, /;#뮘:ujqyE QW =oF1x1bD̛7/:vm]FΝN:۹֪@z.,p-oMfZݻwv-vZJaUO2dH1hР\/=#z=z r]paRֿ,Hk̘1QNHRiժUL8qۜ9s"aY)4+e³R_4[rAYu [1b||=F @ @ _ZX-Z+> @ @ @ @ @ @ @ @j@ d9bС-ZRv kt!Rpʖ[nYՐϟ>l}sEzb}?v}h֬Y iTEI&ŀ" 4(7n={7r_,X׿ tJ *ZRܹsnݺEǏ?X *e_VYe,,+xpT^VX_ @ @ @j@uZs% @ @ @ @ @ @ @ @j<rJr]w z;_I'C /<;˫W|Mz뭑{QG{wjTfc5A~{,jt)N>8#Z-͋/.처0aBvj ?>}"Zi?WZl.炲r\箳>w|+ZO @ @ @. PwXV\I @ @ @ @ @ @ @ @/p}3<3 4^L;7xcs9Y`T Tiڴ >Ȟk}ѪU:.(*0vظ;;YfE޽8=w}wwe,-H+f J]\`VZBrP5pbnq+ @ @ @ *Uz;W @ @ @ @ @ @ @ @ @F ̙3'9x_~qAVɍ1"zH=sѢE8 ѣ㢋.'|2~,h=:uTh'PC5\}YDŽGy\n ]7w# @ @ @TgZ{6H\I @ @ @ @ @ @ @ @+0w,iذa/ ZAwzm1uycʔ)+h$8餓bM7ӧkC[V=.@Æ cz*zj\iРAnsxމ)[5kmV;` @ @ @U@VmM @ @ @ @ @ @ @ @ǠAb뭷^JM*Zm۶~ٳg̙3\?ƫ=\ <8~߮qرc~!-Z5\3}7|Mʿ_<0N;=ztԭ[,UkR;D#=hѢR6nܸ{Jw2iҤxײ m٦2΂zmݺu}qǦnZOs̉{.f̘c +쯬޲Ƴ>Ĉ#bvB4h]je)wE=KSN#<2,0jߘ5wb/޽{K{~K: @ @ @%P. @ @ @ @ @ @ @ @T/> z꩸ꫣ^zk4څ f!7W^ye=̟??;vl<1|8餓⧟~￿kz0v3&_֦0 5i$J J?c ʆb-裏κP@fy͚5o=kR ';w^jce]dyWҾ/OI/S .#i-w}wp駟f!)/-]w]J%M+沶kwYu @ @ @"I @ @ @ @ @ @ @ @*(pwFNb=[1CSNF;>X{ r!vv FbtjBk?{,VYeJReZ&Tr\O4) Ywufwh9[/?~|~`_VnoY-~}CŽO>%nL2% *Zk֋+ diAkhԨQ]Ӿ傢 @ @ @,P @ @ @ @ @ @ @ @TSgy&= O<iI!T[lE{J)&fM6$n,ȪW^?ӳq1"Obu։w=rVϏfS㦛n?0E26mDZAo~m݊.:(z?r!@شi"j]r%Ѷm2VSw/B+2ZjUҞT_}^G I%//NXZ?KzOr" -fMpzקOHIosNU'O}{͚5c9&{ +Q9sGy$Nݏ={Fǎcvƛ8Sb1?tϢ[nq5dbI]tQΕx{P?G^xaؓow/K/4<3T|wYRWQ|+G @ @ @* P'@ @ @ @ @ @ @ @ @@ H5cǎmݶBfs+_?SO=5}xwcq_;wsf۟y\:>qHBzkn- [@?=|꫘2eJ@7|bRW:u..͛|Aw+׶+~:fϞ'xbev[l_;st%е֔BnRY۸q,%"u]3?1o裏SN1cƌ,j֊GzkZKgII}[iny񥠩ZF- /G{{fAO{GlwqntEYvkz&R0VӦMc,7l,@ .BRպ뮛5saE =ztߎ{ Ka`U\{K[E?ӲP` #Ѻu+-v4}4hwJMVv  @ @ @UMYGz @ @ @ @ @ @ @ @48J˽sWgA>)N^駟fv IeY N :th ТѻwXokj׿;Cn Im0}7;V:(RV*i\7pCyvH[)DnݺoF;~lѬY>CK/ZBҠ:?|,\0v횅ʵ^ov׼y,8XV?KzOP믟k#ԯ_?[?:qOE]$s,⎥߃HFe]&dk.c:6k֬2dHFeAf)+%^vQ%BV^yg .zp XRR`n-ZNՔo\L @ @ @U`ۚ&@ @ @ @ @ @ @ @ @j"0{l)K JB_a?st!MkݺuNAi kv?sb_Ƽ6ds1lذxc\zzr\r]#F/>}ą^^~aÆANKj)`*M7ݴp)xj1cƌ,$mYo ٳgomݖ_g[o5ڴi<:֭[e*eyOJG *ZҜ쾤T߉̱h?KNu2|ͣo߾>D *ZrnXƍ Mf|w_Z߂+*WD\q紸*ʊY[oUb'+jRT)RL% @ @ @*EM [' @ @ @ @ @ @ @ @ P)%SzWMǧ~+r,-#SnE^1cdrsmvg}/u ϺcС1|;vllM̝;7RI{` 99rd%Vnr!h%z~4h;[mU{Ā'MSLܳE.).{k<ֹw',Q%c+t!Đ!C`}7vu,plV*l";вe˸˲ 3<3:w@T'[߂˵[Y9s_UYg ~}{/N= &Z/rC%oѢEVW_]~6mVZ-rw~,#7>ʚԩSy7]u=\riy ;+ۿ}NYSo)4iI$,<ƑʛofS[ }Zt_w=Pw^:hE,X|p 80^z8c"-O)\W^u͛;Sy5j"ըQ_WW_e<yHߔ͛\y)4 @ @ @U"@ @ @ @ @ @ @ @ @@5H3ݺuA 6l /0 OSllYaÆ-r[ow[xe92vyXi*tV_}p +jtw6(r){5D u:Cl^;V[m5kV KQ,\0[bѡCM4naoiG}tBm OltEY8qbD:th *NceaZ=zȬSYRŵu<+8 \s͊FUT7&N0aW^YqE](Z&MJEWvMVF  @ @ @@r@ @ @ @ @ @ @ @ @j@ syG I'͚5u]nSO=5?&OE^+veHSN 80Xc8sCK>W\Д)Sd̘1t7FO>;csF Sz3Bi'xY<1dȐ5jT*ySo_fmsiea;C\ve-~h׮]lVYo6[Ɣ{6nf #Kzoq4o8sヒv) [o 6 6l}OR%)U}˂RIե^m?gפ:]t/Xku|韻;vlEuyt0eʔvڕG#qƱ+/׵[yΜ9馛fF_˫tZҲ{W.7o^I&ss+s΍ &DzNgΜ:'W2?S2֡C,$}djgّhРA\RW %K![2}Es_/7guVnvgwګfa~ike\Y˘ @ @ @<9eˈ!C"vء Kjo @ @ @ @ @ @ @ @X\`֬Yѵkرc<쳋,^_qO,u)_^jq2u]1zXguV*(sW\\rIԫWB WyҤI{,ώ;ls;G]c$ o9=P!@ @ @XJoΕ @ @ @ @ @ @ @ @q7z(v,ԨO>5n{WtyJU/ݟS8V[m{no~SnEOuyWYe8i[.Nu3daZu֍_]of9Pr~4G @ @ @ j6f%@ @ @ @ @ @ @ @ @ x#uVpo_?|pHBjz8qbvi裏^ziiӦOj~~o}1r-5["& @ @?Ίw*A$RD+`T,?$OBeD%B ر +*"Hxvܻwޅݻys洙y߻w'/  @ [                 Tyn- jܸZ~U* C]xᅺUnry:,@kҤI8qzk:c4d5o޼R^7U.\G}4ܟ}YթS' {۸Az-ZcV>D{׮Qٹ9UۀߺXo~V/#     Q`R{iҀQ {&P+{;f"                R`Qs%VϞ=ue裏VAAA(MO>]W]u|Iqw$鮻^Ӕ) UTA=zP5ʴ&0~NL͝;WM4ёG;. okРfX| XKzͨ;HIjI:mea[mll!-Hr1@@@@@@ ZipJ"P @@@@@@@@@@@@@@@@@ bJ=ҥ.Rp AXLÖVH<󌮹M6Mx r!i)-Y"nNdEEヒt,SBu^^9 *[p7o:8P >CoDuA믿l>a֚5kԱc0c|uAU/=.ZgYx вoe|,0-<ͻg}6_|E}o5nX{V߾}իWpo4yh3 ^̙3+hٲPm,~V;tP!wl[%A[eaqkJkGse![V?=̭      P~7$P+{;f"                xJcAQcƌѢ hN>d :4 VU4ydw}zU~}y:չsje I￿h˸,6mev\TT~[/^~e͘1C}Y8Bw_u޽xoݺuf 3J̟?_s՜9s³Fԩ_~mݶ=mL\o[Ж}m;$Y-dk]_o~&Њ      PjeoLVvD@@@@@@@@@@@@@@@@H(,,c={GO<֯_נAdE-^XO?z!M2EfbcrJ2֠A|'( J J~XQTS6QyF^{IjUTUd5sLkz7 *l4xu9 DP4ۻiS͚5r*|ꭷ_K¶msWV3d{h-Ydo~Pub@@@@@je3@@@@@@@@@@@@@@@@@ aM>]O?tϞ=[ӡCKXv%+j^P )yw5k,͜9S,( 9uaaZ 6ܺWg[L?_AFG'oXAtYUUӂF(x_E:ǃ@AN_|E~6 k j߾}㎲]va*{̑n_VP ذ$`˅mn /SW+@@@@@@B@-H2n P+c*"                R`aR`BfCv?E2 "@IDATĵ{}n={pc iҤzYX޽պ&lܨ HAHQyI,H+ 5m~'Vo[3FAԭ4|tRf[ގ;YГ? > - K_}Uqͮ[ndVA[lf5 , mb ϻwah̻}ɒ%a_⻬_~FfdJf[^fTR op7ވ3neu.-9[ 7^S@@@@@@r AVvD@@@@@@@@@@@@@@@@ȱU~o-ǭAavm' ײ![P:u½vťXц W}ٲey,fY{Gչsg}vS Kۚ5 O}IAVQp/,T˶Zvv*ك̢ ( A̿-IsIGK?,ի'zjdk6 `EAzJ v*e'׭[ִi0hޗ 6MD҂,l* ^hͮoc&Hǵ]V?oxg˅h\2 ߌ]Z(fcmd'1>-5g|*B ,X+u೯⮇;gE@@@@@O] ގ                 [Iz,?\`A~e!X>J ,[\ qa\c{ M}ANaiFe,) 5$YiJ2/ ۭt{g)5*ك[תUR_ f7 jVq(4˂nmdAKW?^;VSOi餓Vm*{o/_DnkSQy_^YUۻg5@@@@@@ P+;7EVvD@@@@@@@@@@@@@@@@dlƤ]ݕ~k˦9x=ߵJnZ=۬v r}Y9~TP խ[׫חn4B,QhoX0ۛ7ZT 0v- زRЖ/w}        U|$9.1              P}kKw}V~,};Ois+t6WݱmIf_c][|l|xҼ9Əs=/^cضq4jqIs+,kkn_in+3ߕg1\ďS'i\m+mLRm~=>7Uϕnl}#q[ys?&-?q5e&sJ_"ӭY־T-|k㤹I=MړvI͝;VjԐnaQ5kJ~>8IfuۚX厭TǮxݵ~N\Ju|3iXi8i" csʵU[=y݁ҿ%T;j*R>zvw |睒Yk? ٲ9e{(@@@@@@@Of4@@@@@@@@@@@تe/յE~_|lsuXWm~K_w6^Z?6]=]_9-=:rmL7?]_icsmKUձ;+m]z_@R XI|ˤ-1v._on]ݕ~ߟ+qZc^yҍߞߚ^/S]g2u7>Ujlٴۜy~_2KUw~mrqJܮ-^f2&>'c uJ5//w/LX?s!-֯&MF}Va쳥sΑvu[^ٶ9j5t,_RFᇥNb䕀eud[aQKoT>Q~I={J;/       Z@@@@@@@@@@@J"`_v]Ԟ59,Oisd}\wdRjoLTԘ߿Gwm|ҘTmv >8]?.][56:[p_lwD}qq-~Ϥ/չ2Ƥ;tsS3Ҏuo/]=f[M*6iJ^|Lcܱ?֯]wҜǭʲη񶥛\YlS͋Ǐ]ses3gfvYֳ%뷥i{Yǖ8nVlm\\+ѩǧ[e9GyS޹#i]LHI?Ư;Nt3ijw\+]_qߕ\]x؍ǏmhsC  P{IcHw-}4xp5dTj5jԨt@ӟJ7LVMlYh\gƍ>~LeﮡZ& -#ynNyurQc|L/y\I]cziO_'˴ֈ-ﱻ\_ÿTtsR][tImz~iM'5]_2~M6 @@@@@֬/ zi睥_: i׮_P@-#CΕu w5nk5.]),y' ך5Kz%[&M}KoJ[U޲\c9Va7MPTmvsuǩAEkKwΕny߫_U\'       MWѣ% ֱn7@QT8Cb;K/-BLE } {ץ^[oއ`=?dkWvm7@@@@@@@2 U_ @@@@@@@@` 륍-?GX/1ܘQ6Կ^ Od_|\hOYmlimTm,kv7?ד?cl        UGoƌ{O]ߥN6:Q4Zr4|dAF^(.!4vwEp3r$i nc7@@@@@@@2 Z@@@@@@@@ raCVJIRӍײ6;׍u=NZ'ݚvWoC?Y-8(8ӶT:u$8im?U+oUښsŏw}[M @@@@@@@@@@EE3D!ZS^5aԣ@ "P_J7 =t^ ȍ@61Dh|P5}tReVrs       Z1@@@@@@@Rp FJ՞Mikٚq玗_+lN.H…^Zœ\[?vJ/:Lqcw.Wfת@@@@@@@@@*&p4nt]gI qtIRUf*nڴI:t>ZfI xN~ ֭- ·vUݻdM].%@@@@@@@R @@@@@@@J(TVZ)mǥsK;6كPd-N=2y6d\Öc?NZ/?A@@@@@@@@#ɓ1c'7 F+nJ.´m) (ᆴ)P_Ew̙Ҍ?JVԣGImo_9B@@@@@@E@|y%@@@@@@@ G6EAM~`tL7l< ʝ͏IH7&[# GJ ;;vk2]!t5kysƥ J_9 ?          >T;V7NZX:{cF秭_֬Y< i}o,"lU 4(|PM7E޶[={J       @$       @~%TZiAOI_s:Isҍ_s|~EeI.4)^wK~7owc]i}U7ޕƻ1ٖnm~eC@@@@@@@@@uҘ1_wsImH?t9.Tmw 6իsv#GJIZlYB`H:E~]̚Uu_Gnr{G{߾Үn       @^u\y2r      T@<blcn~R{x{حu\YB,4)=iGϱo^XdeڛN+TeM@@@@@@@@@@#eZxyd Iվ h͚59N.Hs, !Pio:(E͟_5cFٶ~}*gZ}H TE       N@t:!      FAG+]S.J[u29g1~_zϪ7 wrmvos}V}uHsŁR~?'>/Wttf$@@@@@@@@@@Dr7 >f œN'F<*t tիWחFnMs8 !PIvYS \N=[9ۯ^Bɞ}# ײ-۴7e!      X@mpz@@@@@@:xP;6rSZ)ڬVPB`&{P (/crʹ^8m\          T~_F_iZiP [G]w.|r-*?fƒr&ti9\"uJ}FO?- zYM .e>H5kY       @(( {9      Py8$eRVwkOU&Q3]')7.4݅<&מq|LZe-m~b @@@@@@@@@@@` X!sO5w^ҙgJ=tguFkv_l5Gy$8U]Kvҗ_J3fhAA Vf, ٲ 2kY(W>RӦyv      H`RU+i4ijt9Ur      P9\ 񀩤~LYn-(qV *f_ͅ;'W֩SL*Lu-fj0@@@@@@@@@@@^~9 Ѻ~@:(H˂alVӟtWDf>{աC]K/IꕳeY}$`kt飏5DׯdqǼe@@@@@@;I ގ     T+?\Six?h*>6]?6ոRO~Uu 2ִ~6@@@@@@@@@@@*J1cߗzFN;MjҤW_}?CJzm+?\;Sf̘?aΝ r,!Pm,,sH p~, @@@@@@*Zٿ&L@@@@@( ҅Mϑ֭\+Ͻ৺uK¤\@TRկ/5m* *ϯ2u}vY;Ug.           @> IO?h=doZ'JݻoyǗ\r:~:@6hݺuxŋt.CΗgA^U+nvw%[FIVI͛K}FZI={J       P *׎     @* `(euwJխ̴?>.~!P. /$)ksX؍'K@@@@@@@@@@@@r ,\(uWϟ .xԠn_m4rHvm?~8-ѲMi<^{=ܜ^=oӾ_HSNf16n|$`嗥E0><0 j2@@@@@@KJZIӦIl+Uu/+G@@@@ ~=v?]=UisSYݼl|j֔\h~TkPjb:e鋏l9            @Ҕ)RΒ,HSlڴI#FЄ tO=m&;h%xgn,ۥK/)Xj-`Ana}KQ֤I_*ٸ]% ײ/_jٲZq       P \'    T{_s]8UrڒT\T~kǤ (DLcU]{5zGG@@@@@@@@@@@KOcŋCB-=0H6l&.=_8yt7Gu7n',k睥R~,,Yl Ҽy=عse![iSBt#      @VKJZIӦE.E$ m#    @f6D!VR§u8iLYxiR͂\` 2ucmq&:6vc@@@@@@@@@@@@=KmJg-sN5 9餓sG3Ƙm$0j(M kr"Y8۬Y<"@/^~9 ײ7ސCGeZH:aQ"      @JRҔQ @@@@@%AV.Tu{`[e~`\Yޖm[,wmnnyK bC@@@@@@@@@@@@ ;D!ZҐ! °5ܼo͚5:th4KSNU>}6Qر #}W_U~Ӱ0d ЬӟF _J>]p-'Li(`µ:H} g       CrR    MQ8 *k¨R ,AVӅQeRZscTu rm$*_~@@@@@@@@@@@@ VW3& ;uWw>[jӦOsŋ@ݻ} QT~_R%aC7¬,T]0kϊì6ը2@@@@@@@@@@@@*0{4zJK+ .|TPP6ꢂ`ҲeԳgO͟?_Vhc;:u/T DE6As=nw_nk}-Ȱ@@@@@@@`KKV6`@@@@0M*F2U©}op饗CK/?y5kVϒve}:tZn;#@tZRSu΋{Tn;Xpo~͟?_;sɠ j: gd!زgo==+[' ~ >?8S@@@@@@@Z U_~n@@@ȍ@aaIZV@, *up+ \8ksT͛KmۖMqc]idC@@@@@@@@@@@@%wGAZ| H*5iU ?3f}Gկ簂´ڰ$8gYd6n8M:U0)tRtM;w7n:K զLco-ܢ~;}cu릟g ]_~~iӦsj{E+ɓu=bf͚zH/_^G#8"&M_ziӦTݻwzBvqGRt,,^nA.,k5&HqssݚAV(p'x7ܰatkѺ1$`kxii・C<(PkG@@@@@@ ~@@@@Z [[!WJ rutK9#feT[`1ҟsDŽ[Џ             i GO?)Ȟ*Ӷl2tA~@^vn0بo߾ڵ,).ȝV.]0+ WꫯP+ta .L,µ&N._ohYȖ\#HС. 80<?αkӟZrFgjZ1b>C5l0ka].P/K/:{/~|Ps OK`0[ǎe=0D?Ofm^Yf.xƶi#xt ^Kk66O]wu뭷A\ѪUdA2ի6 fp-u@zRvV/l=CF(ll(dž      yDRG@@@P_d͎3K7BAt[AU?aЕ=0Bʤ6{owu<†             # ( sJKÇGE>YДW͟?_;Sx?||rc0ʂYE3W^εkjq-ZȂl1c. B^xtM7P=?a9ٶ~iܹZpZjhn裏ԴipFkڰaCfA\<@8B^~/p={_۷4HO=0X*ḷ,WAU^w 9{GzjXjNl9S[AXYu ' 6L&LuoݺuZbE2!@%:k=P(L+iԡF{QnU@@@@@@(ҥ A6M0ӫZy@@@@ @aap傮LW\ȕkcWw]խTY0U=xF( Tc\ڲ}(k@@@@@@@@@@@@@ KGKSH-[J-eAZ;|uV.LV$u5 b* ի-[7|3]v-nҥKlte?pd!XmܸQeLU^=m6:thnWY5\=GZ60@5j(?G]ez;Huս{0먣Rndtϰ0| ojԨQLfa?|s1aY~BTU1W rtͩe>.PBvԩxΝ;_86M֭-D*QV|K\ pQ8$`k+-p1       JМ@@@r/0i|iQ~,H˂>5iDgb^>7y䑺[)jcvqGqrZ^TV#GJ?`Gwy -iT46Gzy` dZ3"viRXE@@@@@@ P+__@@@m.iSt傯t][ұjp\ȕUo-1JzUn3ӎ             @֭|P3FAԮ4bt9R_?B iGyp$O=zp^zTKuq{P/f͚嚊5kքa^[.nKztwj̙^xArn_Ϟ=[ ~;M:U'xbe߇Z;v,c>LXKneAgsUB馛ԢEqO:IA.kG~AKD+@.a4cg駣@ 1|µ,dOJ&7      @ P\>   7,^eRZ r_aRF%VXq?l] bC@@@@@@@@@@@@@* 4z4ap'): B IAQmuQn4{l6l&MO>9xί _.´6n( Lv-\ׅ^Xܴi&y智袋TZ`Y 7ܠw]{:ujYh+e/) :,He9CPe˖}.] >}nFY_>niF'O.~],lo4$m[H7,]qp-{Bƍj @ gE|hrgp{Q 5n, (qDb@@@@@@@ O2K8@_8vҥa駟]vaS#xrMx@IDAT(s ,ˎ{oOoN=T7Rɂ/Ю ÚZh_6lPfµ򗿄t}'+o ;2Hn?)o^:JwygJyY·6Nv^0o_ŋcVXQuQV~pw      @AG)E{{   GrWҞ\kcWHի|eW}8UXt              YQ's' . (Gd{ti3Ҿ+ 2:3+'mVp̸qi&Ks,jmִv .kANu7nݺ:% c=dYsx}ü^}U_*gZC_eAZC -ZHYm '*<СCxEmڴin͛.])Shߋ/zR-Ү`^X˗ߗjHfY .?]A^f^tAzԲe˔Ё-`ald&4hPl      luKV?k~*}B#  T5XYЕ J'Y6{A(I(\UnW6kL:m              NAT[{+ ZW'tMo~_ .j}QÆ o& jE[Xv-xf2x¹VXX4VӦM]SrڵW^UNq'fu]kilDZ믿Bo D=ܒ īF@z ؗ>ԩҒ%R۶G(=TAb2n@@@@@@Zٻ3@@@*ƍ%!X+VDaXxv]lvP+ rVVƏx3$5[$f@@@@@@@@@@@@@^ƌx@YS:(Hws\s.2oӨQ*υq%[E+Կ/-\PjժsΛ7/ j8pvo@z 9z(\kiƌ~ݺUo#@@@@@@ޖ@혉   cU$eeR®\VN0 ,*~د׫|Z@@@@@@@@@@@@@@'d4~4v~IÇK=UK/_m:蠃*%Uk8StqU}yկ_?iӦv]\rI:͚E &ɪڵk\&!@~ ,_.=tR۶Q֡F?        P+{ZOe&   %6I.aKSu+%[' M?@u\˖m. J1}AA|u@@@@@@@@@@@@@@ سSJGK=0,3vyr3F҇FY3碽H3Gzh7NYSAӟJG)u옛       M(6   (vҕ~[Ha%kGVle`jxF             @> |t]ҁJ#FH/կOwʽ /jM>]}[j PhGRVz)idii2iKµwz:.@@@@@@.ZM (nZ 1@@ 6DX}v8nZF q(˅a0G\c@@@@@@@@@@@@@BǤѣ :K>\s|K XV[y u[n*d,d(qG;D߻pQGICHob C@@@@@je3@@@ X`eJ²\H_Z}-/,ʂJۛ7ƸV6i"l.-              @u#iXixɾâ@j׮2{><:t^uu޽Bo쳥ٳy*4,d-04yr҆ RޒηΝ^      y,@V/.Z1@@Hظ$ʂl+Ww~rɺu% rc~+ ғ@@@@@@@@@@@@@@ kƌMڷ, svfE Pyzi153      ZٿjeoL@@s̓$+UV6DZ?x-JJWwXv roG              [O`,iTʟ_*[VP!eXiͶaB@@@@@@@@@@@@@@ ;GKFI6H-[JJ*(G>rܹsվ}{3ZKҩwyG 4_d{$8~ \Ƃf{^z))d_ \@?^0AڼY^xa \lX͗/!     -@V>i=KVZ:<  @.]$jK ɲmeaY, Ȋ .:              '`<_-!}TԷo HQkGB ' <9r-[ڵk+Ky'5x`~z"رҐ!ҺuRRll: ղ // ,`B?V=uvG>t@@@@@rZV"$  N .N;!YK ʗO*SFT)/-4±/v]A              $غ5cA<۶I:HwIx@H'Ne˖*^M;S *T=*U*d=;l. &ts>~uҤIɷȽ˗ZZREfW/uk~' @@@@@@ { !P+r;J"  iNB,kǎ˲?O7,*Wef m+Xt9@@@@@@@@@@@@@@ȉ\ 9R|yi@ sbh3G`ժUTjUmٲEqqqqQQQAUcEZ{ Q`飏J^Գg \G&@@@@@@)@V@(  9 $$H11?Blg+پtR*,eAYD K@@@@@@@@@@@@@@rWڳG*뮓 ̽gdMԮ];Wlll˧kՉ]y7KXƙ@.bE Xµl\YSwoYC@@@@@@%@V@(  @'OBodmXcۮ]ҩS9kSTTTZ $_Y~V@@@@@@@@@@@@@@$fԥ[oI}_<5fttuWכzIAH{u}x/*ԫ _~9rY)k3uYܫZ'O-  >k%]vY W      jEnNVvD@²ll,iY˪^]QCfϕ+K b0              @3fH7 ?oÆҲeI+;|X@֢E҅B*VL/@ y_o޼bbbBVZH"X%B|GCE1 @+}tԾԷtRR{      jEKVvD@I7K?Xں~hj}̂j ,,?@J`Ao               с`)>tK&M#aZJw97k Dg}V˧z{z/֭M ھ]Z5J)Q')S>>sf[, ڵtJ eYsbe @@@@@@@@@@@@@@2V _@k4-*%{/A) >} +!j5i$&n j%:$/+PRWIA@زEz@ڵRzҀfU„      ^jE.IVvD@ >CfЫg!Z?Tt-[Z              d޽RҢErRjU|сpgd@to9Xנ jz7ϩKHIǎ &Nz8*) Lޓ>@ڿ_%em"v!      Y uV\Iv&P+ @@BQi:iYeZZ}fVuᅁ଺uO/kՒy&@@@@@@@@@@@@@@Ⱦa jgy;i3*JjRYZ駟믿|^k/^\111*V95n֬aŨQҝwSuFHEIϥwߕZ*QB;ժU*،      Zi$Zi$  @z U5kYemRBJ5jH]ΪWBOP              @n8%?~<| vi)s) |8%_oKDf/-fuoҥl}_ ( ʖDž Rjs…sE_ze[{waZDZ#@ { [N>%xѣտnÇ믿7|1766㳿jU=Mtڶ\MLKsZm64>o ^lg`EM^Lɒ%vv@ %cxwb.D8Pvl\A     dZC%@@R7+W>z=gFU~K >Kʄ              ,СC.dŖrȑsĒ|ݞBUfP?h£0*[baVV֖i`l6ZOm? l~ؾ~?\u?tƖk4Â/_WZg3=⋧/`cӁc{طo_y꧟~ݸhm 5jU㌿wool:uF% KR[ږ<|ѿo}p;OKVRg{|'zi4˗Wr\xW(GR`BiH南ҍ7µ:uJ-+ȱ@@@@@@*@Vg@( y{ZJZBZ<ݻ4=uRg{\              ,U,TłTli-L%fZvO!.\؅(Q-Ù,p%8)c?ŖV8x ^ZK^õ`?[Ќl28myzzK#n:y,;g 9wljp jlՔ)SƅX0!@6n޹svڕdI Ѳ`LgQnRZk/Wec?s6cPMu#=1’vo_lBhH+|2 ײRJgUTQժUP>1 ^>(; ̕+瑨 @@@@@=jE~. Ԋ܎  @سGN:{_]R>.]ze͚y"             9R~~łSx_*y޽, IHHH_ 3p Slݟm>6n2?kBe,'xZCizJ4QQQIBʖ-ry\-B 9Bjrǻf۶m͛emݺ5q}vl7ׂTbp'?^?hvsgafwv㜝 ܲp5j\vmw 5D.jU XM{Ν兛F^/%@@@@@@&@Vg@( Z ZXKsn>ƍ&MK[0r-C@@@@@@@@@@@@@rwX(Ν;lAn,#x޿Y0_CK Q)S1!yX[pWd׫nYVlaB+Wvغ zvݼqFmڴm-{d!~0U^]ժUS*Uv{ήupVm@9l!h~88p v_S֭Փ?} Ho'aäy /~{;G>@@@@@@ 9#P+r;J" Bqiii\Y3K[>̈́              "m۶$!aA, JHHHle]XXXPpxmB9Jc% X6@__.mi-|ΟOXRO4d" !P"[l!E%KD ;իW1o޼914B.L@ڵk`%[u˸n#Tta5`j6OnancM|Y~}5h qKܘm:CC@ G \3F:yRS4Hj*Gw#     $@V|jEnGI@@ G xܹe$ lyz-Ƅ              yca[l֭[GIlea>~*W,-@%J$a8p ײ: ٲצ\g.]Z5jH2׬YSjdr1!]k/Vtt/_&2Y@R|| , .@_|ql!Z6[h@ll{~zllk֬q={nv4j͍7Vft饗̯% p6gµۘZ_K*Tljb_@@@@@@ 9$P+r;J" 9BfΔf͓͒~Q*P@jDj&0[k&@@@@@@@@@@@@@@L/}Z@ƍlY~։'\+ y:_zu̓Ҷwybi ݻW۶msz·\WV-UNdaHd ؗCpB}lAm6Y05l|T^=<-K#@@@@@@@@@@@@@@\'+WjŊniJqW ¹袋\8NzTn]ebŊ::g'pAe{6_[NMhӠA]zjذa?w XXڌ34uTM>݅.\]qjݺ *Xb!{k޼y;wnݪEkK.o~B G}'OJ}$ *-^,m+=ԣmC@@@@@@ w y%P+r;J" Y&oK_}%>,YC7{UBY<             J8YҥKh/zSu%[!ZÄD"k.7]VVJ ~uɛT&MiӦ.Ɩk׎PI-YD'Ovb/1 ܹ:v͛Bȉ۶mٳ]PmٲEe˖W_ݻk׮.0'6#@ ̙#{TҝwJ%Jd^8      jE.LVvD@2UG1q>X(/.ҵ@TB6!             ^B",X =zTŊSÆ CllJ*M d Zr-[& y:uJ.-ZUVnnٲ}tQg.>>^s5aر*vM6o^EɨS/Y*i&}ך2e :y:t蠛oY7tcO@ذAѣPJתX1"      %jn3  @ 8!M7H/p J;K fyi              +,eo5gk.ҴiSNc4͚5sA)QQQtr٬ZJ?-Zqllԩv%=ϢXB}޽[[֍7ި=znݺY*@ ~$cڴi8q[o>uIw $eBR 4tt4`c޿7@@@@@@!@V@( dқoJ| Ɂ}}PPN              ֭[NYfV mVmڴQFT@<&Cw@ ;vLK,Ѽy\Pw}{bŊܹtU.gh?sرŋ>}W^\rIqqq9sO>vm԰aÜڊ(p;K/I[J={J?.5iP      @: 9$ZQ@HWϥC}(PjNaZE롨 @@@@@@@@@@@@@ȓ'Np&Mɓm6թS',ӡCլY3Oi ׮]BO}A޽znZQQQy$^x0TÆ Su_f @8%?^#GԜ9sԾ}{=ڵkE ɧ? -Vz)e4$      Ԋt%@@tƍ6nC~~tJ@@@@@@@@@@@@@@<-`!ZSLرc_ԩSk_e zi:y[ {tt' -X@e˖U=t뭷2/kݻW=:u衇R߾}Up}{"Xj^}U3 ~l[nF1 ޟpzYi|Zm䅞G@@@@@jE~ Ԋ܎  9 ̜)=>8+Rr\-              y^`FݻgϞꪫTD< ={4yd}ǚ6mʗ/>}讻RS*+}B,LVZ?BregY sN .믻,h D"0u3ܹR΁`sHi&     I"?Q$  @gջԵk:ӄiEI9@@@@@@@@@@@@@@N:ѣGiӦj׮vޭ#F(&&FcǎM7D  @r4`}n ) (lР^مm%$$QCjٲej޼^~e?Qtt4aZ9҃l&Pre :TׯWٲe{f-9 ]tV>]^`ԡd..-      %@VzIR  iҥJ?,K/p_ @@@@@@@@@@@@@@ XՇu 7ܠ-[hҤIUh3ʰ!w ,]TO> xg\R/k{|/2)0{l=#_~7߸c_p^2C>}Զm[nZbLSJ^YIq2e4p@/[Zʅj[7֧~RmȑըQ#[NW|2_y5 p8Heo߮zKvzC2 5jиq4qDرvܙaǣb:IfI3gJGJZOZ"      J@@2Q`0k{ώ3 @@@@@@@@@@@@@ȅb.xc ~ZUTɅ;]J_՚5kҶ}y??S_|94v-dE9t͛7k.X(3[c[23hw¯ucW_}傕,R>&oK8/kb}u7:[zJ r{J*]ˋHyEZK{DLL͛UqqqҜSk= 7mڔcNC@ kRX)om7MX#@IDAT@TiƬiGE@@@@@H?ϒ@@4F|P3F򾃡(މœ              @ZF׿U;w0l~9W"E*s `Cz~L>>gv;LR&m]t$ vw_S;vv޿Xɟ?3szGeQv,Y҅+ٵpUW݌䅳r6?|=ڰa*UMjԨQgSE_֋/)S_~YƼ;YuGZ.͚5K3{ Q|6m4h.]hϞ=Q-u @. ו7H< o {      @. !\ G>tsoK={fv@@@@@@@@@@@@@@ ' XpS>}4rHYЍ(Q"'v%W/fΜsϖ-[ܹ$@g?mᄓ֎ͦʨGEE̚bbbn:ըQ#!;utcLJ^JAf16Dr;v?u^$̨2 .ԟ'sS^z͝us=N}26 .|RJF@ nYZBzui8n]c2Ԍ      1g~ ,cC  @4HC0 O3y@@@@@@@@@@@@@@ ]z)5o<իW/]Jmh,j֬^z5cҥ裏TJժUK~6oެݻwiĉ{tu׹:8ɓ'O>СC駟?WjS*U:.[=_zԩ믿^W_},Eq;Ŋ o5sϩbŊ5/ZVɒ%տ.WYfO?MjϞ=g ASZI֭|R^/ݵ`~:t166] ֞{,pZH)pBl :0.Hzkmkj {Gٻwvɒ 5[¹Ӻzͥu 4q#. v2v ܽB zTvmwߴ¸llh֬YbǏX^Ǽ?nLwJ_rv^xAަ`}I>5ͽ?|b4j(5ov= G ~wnMVg|S?ۘN-      QY vU}Rӟr{O              /?O 2ۼ_yҔ)S4p@;7=Eि.vvK/uNr7*{M-BC*YGqHw}XȈշn:^ڕ\=& ڲBu, l.$Ÿ>܌3\-mmvYmp~FqFca? P2 RjGJ},P.]8 i?~ڴi# JiذaС.28bA1t-Cٹ^o вsoAm ТE"jRN\X3rHy睉X?[n½,Tf׮].`ɿC]Vcδid0ue!`LZj۶du5vXm߾=ڑS +1b~SΝ]xSWN,olsyYgpǴPsvppƍ_ҵ^~[={tʕsc2ca[sK w6 {m,t%{=/jyaw_\dXȤ3<ýu^C53{c) pŋ˥%o{o.      Y!@VVsL@S˖I I͛nY@@@@@@@@@@@@@@ C,#.(#C nٲXMW_} _u JzWlU 4kX]𓅄X_B@6l} /K K =zzx a$R4g=,|¿̽H".ɓxVTdIqW;vLfraX tW,& :m:tVZQFnY}+Vt3 IYrz->eAQfdL)uС] _2 + FKiӦM.o߾.f͚۷׸q\]7~I2eܵc?53w܈dއ~ȬGq-˦onzݻw ޽ ñ{Lw+qR&OOsimeӅ^µhAk6ٵOi'2>&/S~C{Mo)e\^spǴ^siu5nT?=e] j0>}{g׮]]fwN ˳v=X[-`o y7}/~tH)m ŋ_VҥU~~3{OK3]bEvh m@*P4|1 N7J119C4@@@@@#OM@@ +J%8:D@@@@@@@@@@@@@ncQ6m6=3;vlb3/-)_|nnDeVWfʹ` e;Z}dD6Y0?Yؒ]8qB 7( jڴ,@S&Mie, wڰa?XJ*n,Zje2BbIfdaeSJH?_&v~yEGGWw~sC -$Ƃ,-8•p~ .M>לu&q81k=לn#PFS *X+v)4hb~̽UVy/ý{}zezvdee[86޽u?!eC%o@@@@@Mj妳I_@@@@@@@@@@@@@@@@\.`-=x֓k`_~-[>}СC߿f̘fw֬Y㞷ǻ`jĈgVYY>w}W~VoF={LRar+'\ٔK}SjGJےK]XZq]s&΋M+VL=3+VfѢEgѣڽ{wɓyΨq}3ri;cF;#>} {饗?eҳZj]vfh]\ppZG#ח2eʸkwڲeKp3}6N¹G?/։'J^$ K9so#Q=5{sRtTԲCү5      d_﹡e                )<3ܹ AoS#{o駟#B z5j(駟YfFjذ =z9r-Ҭ#' ]vɎ|r5iDg־}\ub!#e'|´t?m6?$PWaZ;5f̜9=uצKD[jYH?mڴ ޜ)uU%4n8-]4(֯_?mݺ5ڨQ#WnԩmŮ)Ǧpv"mG8}gH|w﮿/[3]}.40s ù9Nj>\_zB,m64-Z=_#YZ5wlܸ 6xOϗ uԮP}ݪl`0 |vvl{NZl_sdnVOk_Z{5wyn6[-1#_sҲ>ufٵiSϿٳ߳~cX?{ڵk?YeʔqWZW8Bfy.vM9m4^\sw K5ow= ް;7KW\!u&oLС<*u#     }P;<  @IgK0@@@@@@@@@@@@@@IB/:w+R … qƉ=ttB,8#:=.BFbŊߖwX}X؆M*Ur/bo-[L_|{Woll h֬yM:Օ+;#4a3F/1,t_T5\x_nݺzǵxbז9sx?NzWU0 );x. _zʅjw 6Zn,Hl޼y[|ASJ,~ۑvƎie-HwV ڄjԽjPͨmH _`B2C{o57&31@@@@@@ x%}J>ƣZrk/3_&%dLԊ  `o!RL               !`F]`XXfd7qqq.ʂOjdxk.]pIO:f?mEM+=V?. *WZ­?K4 P`eڑ(eab;wt,2Tlٌn R[r ]v/.˂,,x z1%:N}3qHp" {wec#u#G={^savnpk0-1q%?dݛz`F^GN#,-o1¾,˿ !-BC/B$Zr>!a xh y}I/$﫰      D_}E5K!S<!@V F@U@s<              o:t ֭k6CkQd{jYMFLTd>G}Tzk2g}V~i[h̙3'#vޝbS8}2 . 5)?G8祾q6߿_|Fycǎz衇ܘjA?uZl #y1/\[GѤIO詧RϥJ""= i>@j$]@@@@@CjE~ D^                d jn?F[У={ꪫR%OSh޽{֟9ggSR\pEښ7oj }ׯ1-dP  pmHSG0/5"d٣ɓ'kܸq:uʗ/>}hĈ!_ɪʱ7n, 6|WW^?#)4\?\?"bB1$YJc 5mͪh կ:ыU>U1PJQc\j 3C]=N"!#9o=ʞ^u#NsCnO @ @8ZHjͺ+  @3$ PkD @ @ @ @ @ @h'NSO=z _{^kdWj TYy啳" -SW^ɓO>Y *AZ%P=z4۷o_~9vЫɓ'W_}J}2;s"瞶䍉i xc^UW%]N, @ @ @* Pk֟@Ys% @`j @ @ @ @ @ @ @V`Uͣ>ڸ,8ƍԭ[õVZi UݻwoV;n'@yz|xgM7Fm 6 K.d[>(g{'sw^H.]6lmݶ kڭ о|0adGy0z @ @ T@VS[5s^&@̴@&s @ @ @ @ @ @ @ L<9#GqJ(O~aeQ*zeYr饗΂ .n @Kxת^x!RۣFJ )k-i׻w*PoVȊ+X/ZJx#w}w`TF]wk5\kV3~>_HKߣ>ZGyq}ܹsy+n%Dk 7JBef_N-9d%# @ @ @@5Y֬۹ 0CfI @ @ @ @ @ @ @5I&Ua*Ç3%ڷo߬ގ%̸@m ϖ[Mn-Y|֙ @ @ @@5T֬۹ 0CfI @ @ @ @ @ @ @3(_l )>#Gl.?Z&Ob׮]õJK,S\tEӱckh+}Qwc̘1[֢v=@,?ơ5\ߗJK/]+ ,@5V4S%0i„ mvp>}wU[}Y>3-wy 6lXYYy,"YeUj5W_=坥 @@ ~5曧;UC\ @ @hMfi Ԛu;W @fH@ 19 @ @ @ @ @ @ @JF=l|WowСC^xp[le *sk}\#e J_@ z7k o(Wj^o=*˕K.YݻW!teYj 47 P%@駟j R*=a[:uߖYfZAp%lo]xw2Kpf=<^H6˻ZBVZiZsf@mj&$kpCR @ @ @ Ԛ.Pk\I!Z3$ @ @ @ @ @ @ @9$PYƌoq)CZeYE%hSq-Yh%h_`ʲ^tڵu~ 6Q>k%$zwkz+SSW Y+Ao%XJLӀ^³RHԒۊĉ/fĈUR=,GYw^߅RKUl^2W+mZ|Y.aS|YVXa*meM.<;q&|=ly~ɀ_ݴO @ @DZT˱Ys% @ @ @ @ @ @ @ @V/0sgϞU7xxT=j,@TM* &Lv;w[%d>|K.޲wyS(ice3Ocmo!^%?le>߸{wWtYǍWSrLUBJL eeUKB@@ Zn:=5jԨ*\T_Э|1lqwvygJVY'֗M;/.JyG`w_y2.AeYΝzHY /[}/1ԬG|7hР\tEyGgmΛ6Z&^[ɑG  @ @ @ t\+-Ghg|2fL @ @ @ @ @ @ @hVP4`×e 3)MtTٯU)aLUj )cεcs5n7XR^P'MTY]/!g%f}ؚߔ@z(δ֛К.KLb 2%;6jEכI;˻Jy6}4]/*!a˻G;i77uhV=<,?=YUuwY=Hi_ kZKH/^i -W]uU>qYara堃g @կ_2:4p{ow#@ @ @@?[ۓ-}imwڞ @N@V{d:L @ @ @ @ @ @ R¶J->@zM7ˈKe.|i K}}e cڦv eiZ4 ԗX=iа-KK /6"P޷%X^El=]_h8֨Qk63rZn++^}MCtRm=?CJמ{?<o @g~.$Wwd?  @ @ @6# Pk@Ys% @`j @ @ @ @ @ @ @8>9sCiq!h"޾aܸqKp|0kV?%K!@!P,ζ&_2 @ @ @/ Pk֍K]I @ @ @ @ @ @ @ @)pGr´6*n]<{7}QG=z##<Һh#K,w^?$7Fe @ @ @/P@i @ @ @ @ @ @ @ @Z!7|~ о뗁fԨQ9s뭷f&lA>h_ FK&>x~  @ @ @Z@@t @ @ @ @ @ @ @ @9'p׾w; @XdE O>dգGtAYzsG瞛&O$P~xSA @ @ @ڨ@6`  @ @ @ @ @ @ @ @xd-L.0aw6h j[o+"/B.ˊ+|+_'ڍ@&nn @ @ @5`N'@ @ @ @ @ @ @ @ @ Fvɪ@thD \= >0d茅|Rw93r\tEy嗳6dUVi_C"p{%c4 @ @ @@ @ @ @ @ @ @ @ @ 0#%Dkݒ_Lפ{9 @mt9_<#Uq={̽6jhA-;-SB @ @hAZ @ @ @ @ @ @ @ @fI$ߟ 3{. @% 9묳2z? 70}y睗qƵnZ&wߝ* @ @ @/T@ʫq @ @ @ @ @ @ @ @Z_k9+^NK> @/0뮬=zn)w$@@ndynhc3 :@IDAT @ @ @@3jDM @ @ @ @ @ @ @ @ z~[N_zJfFm/8#G/~|Uc>"@@(aZlv[ @ @ @M@VQj @ @ @ @ @ @ @ @.&w׺ϜtR]#@s\`<2dH_|pYz$Ç}6 7LZ  @ @ @_@/ @ @ @ @ @ @ @ @h%G{v]wׯJ @@СCv\uU1bD< M+Bvq\wu8qb^ @` v2lX{s#nO @ @haZ @ @ @ @ @ @ @ @_J?^ϿuE7"h'={UZW^ye&L]w5{Ή'_~H&fM"@ @ @UZm @ @ @ @ @ @ @ @Gr2 <̓}ه 9:uw=C O?]o駟^oɞ{nshK.0W^i3* @ @ @ ԚU9 @ @ @ @ @ @ @ @ }4ydsΙ\fw$@I`Vȩ#G .[ouV]u՜qy7[p_ 64_m4N @ @huZ#a @ @ @ @ @ @ @ @fD` uI.,[3˝Ĉ[Wu]yᇳ[cI=rV]B @ @ @A@V{xH @ @ @ @ @ @ @ @ JvRK%KҹsrggM7k4 ^; ѣsꩧO~z .{7g:_.s#nO @ @haZ @ @ @ @ @ @ @ @>o'_JҡC2xpK/k6|iX GqDyyYeUrGG'xbtZر _|< }'@ @ @4@7" @ @ @ @ @ @ @ @sH]vIƌI Iuky睗^8_Pܖ(lI #Gg?Yjr-s磏>E6/0lX[  @ @ @3% PkL @ @ @ @ @ @ @ @@K81{GoN_N?vΝ;hW/x><[ @@ԩSo[nSO=w=oRgq-:F(Jvt @ @ jgn @ @ @ @ @ @ @ @ڌ&?q&as9ѣGveOC?aVYe3'\{Yn2dȐ9q{$@@;vl|;k - VZ)vZFU=[dWϙgY R{f5_~CIǎ8aɍ#FE]zq_KX>|xB/P ^vm2nܸh\1^.]r{̓>M6$?O2ח}ss=ӭ[~ԅW_}5O."@ .Kg=%@ @ @NZS۽ @ @ @ @ @ @ @ @hC}I-,+/W^7x jzƭޚ;q׷jfk7nUaRh3M炕W^9GqD`ڏeu͹瞛ѣGO/e 64Ǐ? ={B?zn%\2sL<|[nU;3} h5%SB:J @ @f܌ @ @ @ @ @ @ @ @Cg|%/4(k){.C ^=ztseʘ1cr5T_rl{ί~*~BW^y%}G]2o/-_|qwެZ9ӳT!&Msϝ'UwQ5٥K򗿬@8∼Kc=Я'|2\rIr!Ի*W\qE|͔>а߾:>v؜qyᇳ [Vͫ @ s=9bP{`J\Дg˪wo~MW &\{䷿mO;,-|}Wwg뮫,Ryv_!@ ^Iy~hy}# @ @ @@Kꟃn @ @ @ @ @ @ @ @bemS I:g)뵠~馛bgϞ뮻{:R5J)!Zp@VմCeUXI ƨc= H)V_׫p5~o6lBSyԃ3JJ)+|A&LPzGΝ+na^}լkS½<ȪW_}u?7UJW~v,  ~A+|+UW]tw5w .,2rj93sA P*9,k.Xfe@tg̘1XW悊_Wys饗>+ogv +SN9%cǎ5<yw66ѥKj}UViܷjU(?(M _nɿ_msFE @ @hZ̀  @ @ @ @ @ @ @ @ZT#yꩆ0^}(RDJhɀjQ Z,:ulP]O7^<ƃ^)זRºu'ȳ>Gy;VM(wyOFm_=_Z¼Jǧ+x`F]w5%$fcmC=T+_ ڲK/Nx_5>M7ݴZ+?k.h:kZ\P|f9眓W\CJ3i瞻hgny|wI'T`~S`M޻N;UieZ?/| zjY~Za|_' @ @ @@ @ @ @ @ @ @ @ @ 0gj9V;oLVYeXdE#GLOٳgK62|߮T>6|w}bo߾YsWVϟ`rgPK8p`.첔q 2 ++d\{/J]  FV;b|Ӛ q.8qb6p̾[Mַ1L?scgqFFU%l6˚kg62JPwj/ G޲.+ krK @ @ @Ԛ @ @ @ @ @ @ @ @Y 䪫~>/3OYg^ze7nO.]ʷD*S <hS@>(]tQ>+M_8Ykd-S}!w@x;t( =ZX_t0* @ @ @@s j.I @ @ @ @ @ @ @ @ lUrɠAɶX|u\sUW>O>d~ӟVS=zιSVN;j_bY6FY+C=4 ,@?gˀrGd}駟^7vj9lذj9%Hkʲ.[b%d~wmiĉ:mElW_ Vr|7wq6l,Y6mmTsfU%ep-dG]\Y@_~yXN;E6dpIsA1zUH٨Qr'hr7|Y7ٳgve{թ% zZ?(k.7HN>9YzL&L9U-;- @ @ @):qSE Мݗ G٪ @ @ @ @ @ @ @]sI~Og ɺ۫ <9cpСCJյ^~87|s~_?ynO}Ax?-R+[{GqM7gnᆔfu]~yWS}Ѫ]6`ѣn_~v?)gqFU?J {M#FțoY ۶ TK+2dHJo~,2|ͫT_;Ծ{+hW\q_yUAE'tRy{UL=P}׫wn/&Mվ|TBr˪Nk.Xc52k%7|۷w.җsj套^g}6^xa5?uQ}L؈A=<+W^y|Z{*pM]Z\P]&NX*hZs`'_y啜9s/_r~ԩ翁h_1jsЛZwyuK_  @ @ @u t~{[h]5gݝhC6D @ @ @ @ @ @ @fdO8c暼3[mUk=s;ZԁZ~@bJٍ7ޘ>;RK-C9={l1Oד7N-h7i[r{Kԡ[e-c7]N:{  @ @ @! Pk֟c?( @ @ @ @ @ @ @ @ݗ{o$Zl´f @LUKys 7tPk-첵evϐ!Cj:6+I-7=z$:M{Oi3}K @ @ ) @ @ @ @ @ @ @ @ @` %tkV&Ys5[,Drs2T ngdv @ @ :{ @ @ @ @ @ @ @ @1#KV\1ʆ/|ᇹKfvw~=ݘ #j_ɂ )~<#]xgvb~UZ%#Fdذa?~|&O78nmV^yhB -4C99'pMɏw&@ @ @ @ @ @ @ @ 0>0}dĈdȐԂ%XWܘ /̨Qr[okM74 | 9aÒ<+O5`O&9$K,,P2uVǎ<|5t'۰ @ @ @ S@ @ @ @ @ @ @ @ @l4)7{Mn)Yqvk7"@QEY$?O[nIsAe饗G{n wW^I~cZ^=4><ӟto}+y7>J-D!d\_'rHC~z[ @ @ @ګ@:p&@ @ @ @ @ @ @ @ @` |_ ; @9-СC|_K/??w^N=lv9ó.cǎsO _ɍ7&\}wҥK1Ǥ1FPѣ!<ÒuIfr @ @ @= ՞k @ @ @ @ @ @ @ @9_"9˒-spg @@K޽{= >J&LH&NOq+q$eYvU;վ^')u;': e٥ǵZ`ܸ䡇#䮻U>_%l} ǩouIZ @ @ @m j @ @ @ @ @ @ @ @qK/M׿N9 @h޽{O '+2g}vfJ9rfE1PW^IFNƌiX/eo4,|ieU±ʲUgM4%i-\%3ܫ5|IڵkRjW_/xkX^`}8o PgIz*yGs5|X!4;I6,`v%'ЗwB!@ @ @@ɵ2Î @|^J?}޶\O @ @ @ @ @ @ @ | ZMk @@K()2eFLoJizdUZ>C>%N^߿- ԤRCаaI%PwdԨԮ@խ[C]lBEiX.pCT K5]k睷~QaS%ȫkI M*:~|Cm{uܸ}e9u}݆}2zִ<ʾ^*˹쟖@ o:bD;9ê_>YsdJM[nZξ}%k5{i}wv' @ @ @`N n=b9Ջy_Z5 Њj @ @ @ @ @ @ @3-0iRr}bN&s /*la;h%PМPJ''G=s!ޭ%@]r%:gϝkaA;BVOw[o5^`޽„^:מ=%ljm[~ke;oכ.^oΝʚlC.z7ߔe<粬׃:vޝ\B~;g,K}jY/_0+W_M&On{N ٮWZ)YydB(}^JN8a%@ @ @ږ@Y @ @ @ @ @ @ @ @ @`n1ד?1>nǓvj:|aZX#@+PhJXAG}zk{%ᇓVz]8,ÇVuWK/=oF- o|w<η ufsKV l՗MՃJTY/KT}Z?=wCԼ6,{3'k *e bR-PU9ZKߟv=Y!,qEn6ڨ!GZ~Mw}Zg[^ @ @ @mQ @ @ @ @ @ @ @ @̚i5|7{n$?l]7|)* 0m}M,q@K(aE%@[T609蠤odu=k.z0|lҿZkJ%eUjs4k *[՗e\_0 ~/畠UXjwk%h` R]/ҥaYk׏ZzhW^mmY~OooNvءx @ @ @'ar4_sZ"@ZଳOƌm @ @ @ @ @ @ @['Vr U0Ф|IB[,djABnyfjB>n/&Pn%QO޺nE aF{Z[j}ٹH-a_~zOl(KWϦ  @ @ 0ƎMuKn=)@qfTg @ @ @ @ @ @ @ @ @cxW !Z ӚR4@ OC{r-K-S|NrHR;'߰ɘ1 A<ʧiv!nmꪌ1"Gyd VX!;c5)X˺SO͑ۻ) @ @ @UjI'  @ @ @ @ @ @ @ @,7LL>*?Q2a'CK`}=Uv/9Y|溓v4ر)tlUR~vOoJOUϞ=_J֕W^YlBvu;'xb^~O|&M4v 0c{Rr3v @ @ @Q@V{|L @ @ @ @ @ @ @ @s \p&ON_MƏ7r9$K/Ƀe:OxC^NJv)yH.:u!C駟{O?=,Lvm3|]v%s D(%0˓- @ @ @Z>  @ ٻ(7RAz& +"zPpؐ" J WR"ٜ YBvIuMvvv)ݝyBF@@@@@@@@@@@@@kxQ^tBk?(կ/8~ t$Juy y˷ }{X1yVҐ!RɒYB4p@۷OzXn]/^`?~<άR~ժUK&Mv?^@ x9v*QBz饫ǫ      @R P+@@@@@@@@@@@@@@@@X L,NRJZ^U@GsW]62d6/G'v4fmRt+)mڴzd:f!YzRܹCiŊ|ץoԢE }؇  @dҠA y@@@@@@ZIg                \J)RD]$je1h.̙ޗ \@Rbyc=g K%/J7Jm\'Wjlٲ6l߯jʕ\*UO?TO։'4rH.[wﮗ_~9*ن1ԫwZe{μ     $1p@@@@@@@@@@@@@@@@ X@pZ,HJf֭GIr]_@)йO/5n֨ 9"5i"uK>Ռ3kѢE^P]1=ʝ;p(}:+^) KNIzŰ#/#     IL@$3\@@@@@@@@@@@@@@@@G`)UՐ"ťե+…:k Z];ya?RdR6R4nZ`\LiӦKCJ3Go(oMF}饗^ŋ0+T믿VFtP}C@IDAT g}WW3f\      oj= #                R:wRhdK77OT)a"$[o*WpC1&F>PjPQCZVф^n&q:p@C jժW/ x$,йd< !:      I euV@@@@@@@@@@@@@@@@@ Μ9Çc9zNB=,?yueP/@- ۲mOt ,½,%%-UW^} ȫG,FBA@ &.Y͛#-[hǎ.w7ި[n%" +r(Xh]1,,&O.vVFl,tB|:g_Jdɔ3gN+V̅(QB,Y]}}^w>T Cȯ&uΝ)/H~Нw!6=pw:t([,d{ks֨ngh!Uì }|XǨ²5;GB fB@+_sr9µwmp#?|.+VIժI<#}W      pm?yy,͛'ժum&S&uƏ                @\ ݻW [Izn)[{Blɔ)S\v+VuM-H3/hժC^4z[s̐dȐ/^܅Xvm?V!C%-[Y sA6vE&MThQ͛7bk)˻~ k]l_5|ڵ3f ˧*UD,+VԵNc>>zaihi8{L^RD¦| 9^խ[WÇWgϞ}X]baF( -YfuXfm[Ǐ˷o _Ș=ZҥK9B= @aڹesJ ﲢ?:w z(4E/@@@@@@HCϱ@@@ *(P-P/              @| 8p@+Vʕ+#V&[, PB&R.yv~"/݊XHJtG P $N ~={f̘2ݻe/KVʕb J:u"_iӦ V[Ti|[C@@@@@.@}*ZW5@@ ԊD@@@@@@@@@@@@@@ pY}w>|̙nI[v իWW*U^ݠر믵k.UPA<~eʔZc@kx;ںuZl邡|LYԩS4`:tk.(#TN%˥`4iBgÚ={vb4^+U$RKˑ#G (`6lO?ŋeϞ=0jժb ,7~oŌkaZuJ5cThǰ     ZԊG" ~ ;!             A0?PÆ ʛ4i-7n)S4t .t$~ΝOPB^G (0|=.C bŊx;S|2gάnݺk׮^(B"\$6p }ϼ;;˷nڅ.]:#!$pQ=3/]96nޠs<_u7kYfrj @fϖj HŋZ`Ə &~S"E\@ծ][ҥu@ o߮iӦi3gXrw}jٲrftN~I4I޵9A#     $ԊLV8@K@- @@@@@@@@@@@@@[.|)O<ٳ:u4iM*HXxD߾}fz7?tV@D(0c uEɒ%ӠAԪUD8գG}W{Ȑ!ʐ!Cw\&zTԻԫe/uֹΘ1ctUռysVhx#p-fΜDMrU^=ukOZK=+=@-/[X%28@@@@@Z PD@@@@@@@@@@@@@@@@ tGH"k۶mڵ+aZ]Sϒ'OnrJ?ޅj/^\}QXX5 @RkKkƍ "gΜ1b&O)Srn&u(U.5O>ÇJr4g=3ڽ{/^^i**.]:駟ʂ|+W.=ʝ;{1]6}H(N-yzԾ꫒w      N@D2 @@@@@@@@@@@@@@@@;v0'|݄#<)SH7oui}4eMgUbUh 3fpm*TH<̙3zt}hѢj߾/^w֬Y޽{|zף<.Xc,YNٳgO>Q @RpႺuƍGIJCv 4jРFrJWv-kܸqn^m3ftAfرc:S27{L^C~;wNڵӻᆱN|2e5W}֭{ǿx>S˖-գG8=aTgaP]vYի_|Q5k޽{Cr'O~tŅZzڵ*\*W W:սhRٲ~KeA@@@@@V@6@@@@@@@@@@@@@@@@ :tH?yw@4k.}ڶm[ ΋^Þ={\ևdɒEo\`m[Ç#ywgR&,lnr 9Ɗ+jȐ!zj*?Gn @0ʟčA%^,Zj߿֯_ӧ륗^RFdתeҤI.,uZretJ*ر^y!N?Vh)+0-gҬYyeև 69ە+ s.]9;&3i;1>}ZjR5aY_~pB?Z .ϟW-4x`=jӦ h|W̙3NNtwkɒ%ҏPi}}CJO?-J      Z9                @ X8R owvse*N"~a+VL2vXw3_|5[^=B'ݍ5j衇zz/^DСCժU+*T(կ[Zk8qRJkԩuXPԩ:h[͚5+f p˗gJ @T믻w̙*Yd4{vǶoP'*Wq;k={sxf/_pk=z8 )~ɭ[E g~o*Tƍc{naQ"-e˖:x`|t#d̒Er35bRJҺu!=:     (K                @Og}^iӦ#؁Vj7Xpk[nJUJLҟ\[X0֭[;!M~ҥKe)<<܅|Gn>a{WwuٰaC],S .)S^vqёݻwUUtK;w;DOtۗ/_^Y{: \r{B 6,b[|w)k֬cGiz)[6yyxgh@@@@@6k@@@@@@@@@@@@@@@@ٳu)wC7>?\3fmݦ7|S9rhȑ#o;/Eõ1?|0"w4uY֭կ_?7zR\>gL0@zUyqyRIQ1#     @BHP:J?@@@@@@@@@@@@@@@@,f.\8")kZ0&k,ꡇhVnXo7?x Xbav} /]@}/뫯5kg"j] Q^yFmOlRٲesw}j޼ 0* ^o]$D t,P ^ D{²ywMxyB{:uꤦM Xx]VtׯG yՅX-^ !zWX`!W pg)QoُKJɛwnӦMp5 G֭{Zq7o,B,@BlmܹsgWgTvTbx \O>jժ+o۵kwձ/^\SLQ֬YwuCXԃ>肦Z̓}{\{UhQ[uc6ؼBX=% ~GX-ZpA9vsy ڰa~' -Bٳ+Wbٳgu M4q7P. x[)/YuMwRvQ@@@@@@y                @]T0{믿v!U9r><쳪]}QUVMB`W^тD͛nڟ*U*Y@F"E܍m?ÅMKN{ 2er\ 1b?ԦMd HO ˜9ҤIqw˻*VCc&{CA],&ea? O^ kضQF`kBe<qFYtiWS?~܅XKtZMl9RO=nTg{uyHgRQԩ%Elʾ} s Jmov!*Th}bK暈3]xQ-rHB7|ܹsհaC+WN;v3<;}Z[wbOv4h ʛ7%˕Deʔq/Ym[Lݻwk…J2;QFnlO,00cƌp>Ϟ[lޝ%Kgmlwj*e#,8u=igvwiӦU>}\O6+;v+_ s B@{݄Xb>Ǘw^Ƴ Z"     @RrImԌ@@@@@@@@@@@@@@@@ O^N 8ʖ-^R4{lWv㊏z^$?=VOjt,}'ڿ֭[&Ml.ltO?euO?ׯw}oSģ?痈Xk}ʙ3>#.\X&M_}m'WaXР͚5+"t~+ϟ?b۶m[`k.{イ`3_h?] ع:kׂ֬܂w}F#ߟW@@@@@@` LmB@@@@@@@@@@@@@@@3u*,,L3f̈:c[ 7]b?8}: .M66m̙N:)u={֭/^8bە+s1x~3@7r;vƍU~țYG@Ŋ]uß) X׵ gP}iݗ'O٣΅i5h@ٲes:uJ2eʸǙ3gGcşv|1g=h g^zn@(_rYqrʹ*_~mXdzyY \vʕ+.]/{1O֭[hN||UX@}Ox դIK1_{UZԹsgՍnl 믿. *UըBj|)Rhʙ3{9͛7/u߹z/3gθZ >ٳkԨQO|ĉBl_tu}Ь^ziӦM#q> n(t@@@@@Zd                @Rx4w\VݻU{'s?|Iw#} Fӧ,F*Pnveʔ_K/իWٳ0a*Wnҿh"CFKcǎΑ#G\;vCؖ~kU:tȭ[8?㵝}>|ۥKkf}^3,$E ~y衇'x^rF]*cƌ.ФaÆ6lw?"$Ttzj}~z{nmݺU/fEw?ókn:u6mZ+zbcu{-rk?#8_㏕L7ov㳏|>M4wĆ d_>>}4c gX藍׊ZYɒ%,hf~EaVvW={ v{7TfFnRKZC*.,:.7nG@@@@@($~e@@ X!͟/=|2E@@@@@@@@@@@@@@޼yeaMwar3x#nn7_ϣ?Κ5m7iDw} Z|͛3gBoRmݦUVP ;TfЦMwn}.Ď͗/ʖ-낹4hm;NOP D[ӧOpe㵾kA>vK0jժ,0+Z_uwS۷ɓΣQF1MX/^܅X8 HeʔqA6ڵk 7nԩ?\JrZbc +Tɓ'G{[>27V^\=ן;w΅ZZЁdዾBZh;FT /wqBv},L[n'.V,\B,̮_r@9y'yNqWoljʐ!W6&^gڴy7߬={y,x׿\eϞ]˗7ި%KȂ-Vlka\6FBes.ʾ kHv^聾TYm۶m=9bARڵk5}tתUk-DBYGBo-4iӦzg\, y TdY-T$r?pL,$,< q  (0t00(               s7u믿4|/!~nÂf3fmx?)Sh ^`3gvaZpe+ß1UϜ9,rWUS `{=Y8C.]:Naڱc @ɸ1pႶl-hs_ ￵sNC6maYpSN}ݿ{ӥK!_^YנA\Uk2peiysyaR"\       $?7Oۖ$ b=hbMǁ  j^              >|Xkv7>}s=%cͧq1nHo7OLłZlիWkܹ*UTbcAb-`0w0˖-s(,L׾?zꩧds{(q'0ytڵRB^~e _~ R΄7ĉc67r9u=hذaUid 6/ SE[t&LpnUR%]3fH<#m&=Bb@@@@@@  @IDAT7@q$  Z~1              pD~tw\w hcNJT@K(;j޼?Q%KL(] @P<讗yuMLXJBM6z7 /$#daC˨cZo}駟Ohz]h/Qر#{KNM4>˂- dSH+Vh֬YjݺLEW_EO۾h"nl6V 3KJ.^^&tإ-6-      ԊFV8@K@- @@@@@@@@@@@@@SNK.8q^uB`7$=QF{.Dkܸqʝ;wC` [lQڵUhQM2E]Ǝx@=Vn HjIKHUE/K/^Ӊ'\lȑ#;NM`…4g>| ˮ NBw}z7Up}pbѰ]$PTRRncQ      hԊ[}z}74hɺ<~͚5IzPݻwiӦԩ $YgPr*G.Pxq͝;W;wTjcRXHSO=EVC?Lˆyz- ٳg/^, 'I2e` u(QBK.UZ/%B 8quơ"`1wYp̀pS`Vi< DvK*v[>|Xwy yR,,Y2K.~9j۶rʥ}UVڵkF> j@ٲIT~}y%cD})?P.\HC ~o߾]s6mujÆ QFH51trJz))y"hڹs,XG-[V{֒%K&o"1…8tMjҤ~޿&OO)SL khZ8r~TpNBiD)<+jʔ)o8p!=nbs3fxAO_)K,|;O>R:u~uɒ%ӝwީ>@-Z j^,Ȃe-ϾSɓnߣG+WNrrΜ9{Oܹscn|OdIi8iv#XD9@@@@@',+Io،@SפÇ&-!             ,0sL 6L'OVզMRfM%O< #hk[ѣ~ծ][ݺusZ)S Z?hH7oV^4qD-[V/Zlɵ> {;CÇ+[l. G~R+eq}fw l[T]?h֬Y.ʙ3lka[yT(k/X-j*Y8n2eT~}5j}ӤIh!~/M ^~9b     @"8rDʞ]7OU+ .!P+T g@@@@@@@@@@@@@mCiȑnYvrʥ͛E./^5-۷o0nSԩS',X0E@ 1|M7ΝvΝ;oN2Q?<<}#G zELfѫuk}nBiիWϣrQ([BU\-*Ur= 5SNpWX6_]bҥUF UNtM}$ ?^*RD^tA@@@@@ j@q$  Z~1              [lqA!㽻|[Ei]wUƍU~}B.}څPvE!ݻ_k_TZ5uMm۶Uԩef8h@4ujU͛7kҥZl{.\P,YTlY/_^ʕ!/^\ҥK#gq!o>mذAjF͟_țRxvx.wq[2gRG"ضMW5JgOɛFxah @@@@@O@ ԊG" ~ ;!             !!p4q; Pn?߅ϟ_kV5twH"! EpB͛7;X|{qKR3 $,LkرOO?)k֬j֬ Alذa _] qb e˖MڵsAZHDۥEᅲ4>$VO:ɮViZf,hٳJ< ,%KpbŊɷdʔ) ~^EGѮ]dB6nܨ'Nr6yzʓ7O% k54ȮIR/}^~ZuS"-I~4     (ԊJV8@K@- @@@@@@@@@@@@@W/+@_}%  tRϞ.u,YٳgkZ|\`FŊUR%c >+Włl}J"ʗ/5knݺU2dCO Wسg[,)ӧO d+JYAΜ9SfҶm\X-Ժuk/L,$='3))/*~[?loذAX-5+ٳgWBRpa/`6Ym3gN%K,!=IB-4˖ޗWb!M7J(![ʔ)݊},x yDyp%/[lo*N?Q8 $ vE ղp-/     @ P+oZH@@/bb'@@@@@@@@ Uo&%M("cP)-"q ) W2%R-!RJ4)w>g^k=yYZ\w}@@@@@~\ZVY&'֭[eP3gP6%qpy iذN/q۵1 [sѲe|,lǚ'쇯 *@Pµƍæ,rg}tqcG+V 7s54-,^f_C!-44ӲeKBёtj[n#UT?Kv^,X Zh/_;vV)SFkӫVZ.(g_w|SjJC?|x.Ȏ݋/]4駟dd㱅Y8C܏08+\7 Hll.+|l5h/w,Tµ֭tIۼ(Zf@@@@@!@VZٷcK@@ %Rbb%@@@@@@@@@@@@@@ W Đz.No.B,do/ ڰao^{RoRN: T\9W 3k=o1BVۓ`T|yJvkԨ6m,4 @Xɓ'Gè,ܥXb:ոq'duٵۮa0ٳKc=tPN8Arʋ Ju-.)3ez//{o܂lYR|^5Tzu>{_JdUR%/^<}QycY ]f{^rDz,{o!Z6fsRn]J Բ`-{M(W75%GSO;am# Y K/I<"'uV$XB٘@@@@@(Hjeh};D@R P+%&VB@@@@@@@@@@@@@rE=g^=&tikܳ6C-c>X 0*{ ~8YNa_bEUPav*YK(l߾ݿ6߼y6ne跇g| X@=ln0D˖@(`U3fW_} Z3dVW͚5}{Wrςe?m۶͗eeׯ46XOzuB6lPz:(q~?)к予ƌɟ+ʵ`+V'+ e9z[VwleʔQٲe+7,˾;vyvVo {g'zGms IJPecYm7CBfs{RKar|Hև] "͚I :xRwGNG:tݛ׵c     $ P+Qfk @@ P+ )@@@@@@@@@@@@@ ~=4t瞑qy6ml-[l0L,t g(vY`Iqn&eZL 䄀,\P-WK,]Y] -`Bkvw .YhVeڵkCZH SXX__zms n;dSe!6S6`<y+ ݽɂbAf!^A_ރ`6¹[UT,DOjҤHք rqUHl\C&4sf$Xk(FH(WX'8     _lʾ[" ) +!             iXT_6LM7I=z=>-K{X͛e!$^{ ֭^5mT%KWooZL W |Nc9v۶m[_k]b_v0{Y S.gB} w[i]jvlaЖ֭[}Pžl,{hFzᅱ*^J(+vo)Sf,B kM(&,_YV6RraeipYz)gK.z5*     K@/oǖ  @JjJ              @ X!$LF [bɷvOd^&OVZzR1@@ '\֕:tdٔUtx~L{i3?lM. ,~x$`BN8#rwҀGDҙgʅS;@@@@@#@Vuoʖ                /U>}ѣ'.zaHQ@@ \~I%˦D=)#q4uvmhtRʑ6ƞ^`=kϗ{O0ŶmxB׼#5@@@@@@ };D@@@@@@@@@@@@@@@'I&ի'Կ$H몫RI%  @Z^|Q:Hq@ *T>[0@Hp'W(_sV-{w#\\EvŊE&LΕڴSYS̙b      j6!                J}JuJÆIw-ԫTt^Պ" MҨQR.g-Ptիӥ="a[;KիKG Wiܮ!mFA˥&M;L:ȵ>G!     }oǖ                y$ucRҀ7KK7(-Gb  y&;Җ-RNyVvy P=Qc?\g%PN$TmR%fXu?vmj/A@@@@@ UЏ G@@@@@@@@@@@@@@@ gI'$m+ի'}4lTf!o8C@HI`Hi=KiuVB"*PYVI/(խ+ $5o.U.u(=|y*Ͷ۩S#WhF.X26f!     PR]@@@@@@@@@@@@@@@@""dh}cX۶iӤߖ6,"4@@ %W^=W*_>Y UF^x!5{tmڵRϞRZaI}H&H\a8P駥+" "A֭+,-     < 1                @w; ꣏:ԩet4@@ ˗ؘM@, T7NjF?^:trG9sb6m ݥ>f͊j+Թ4eJmG@@@@@ U`G@@@@@@@@@@@@@@@ _I?/%  5o~},Yp5  oJ*DBnr@ A@ٲq"Y˖II{-=d[5kJ^*f l]å>ՠҪU@@@@@!@V8N@@@@@@@@@@@@@@@(SHG%]qt3L'<XիWN@@/ҹJKg D ĆgYgIW_--Z$]r>GKw%M&ؑDϯK_9_}%i#Ttrߒ3!     @zJ+"                lԾtIRR~kԫWWu== @@8KJӧG'|"@ -S7C:UZV5JjLzeE jHҰaULSiSi@i gիΒԑ~`Z#     G!               T`6CRz=i8Q#.Sҥ5dȐBz  `Sti9Qe q~JK[PyԻTԸԧ4aeKVy'P\4ewRǎҿ-ի'n-*5{F@@@@(lj#J{@@@@@@@@@@@@@@@@|.`oD[sm#4hƎÇk-z  y)[&G^ւ}#; 4h %VZ.uK+Kg)=d$|k>X_ZTz|yKik6P?@@@@@ZP7@@@@@@@@@@@@@@@@ ,Y"]xa JIw).i<o߮-Z@@XR6Mj.K<@ n6ңJsDB Sn~ש#]uoܾ))%KJ#9*}tRӦ5k[JG@@@@@0 U*mB@@@@@@@@@@@@@@@RϞ-}AAܶm:v:Twu;@@X՜qF/YSZݥ#% [`]Y"UH'(RӆPjԐnY??rL7׬)]p{Ҏ;m@@@@@D@L`X                3fHG)}tҜ9CnV1bJ,;@@B-[r u3ib%㏗U/KIJG%YP%HÇG/ivL ~Ezi:s$ SЭo-4M!     E@R(                P6nz<jUoSc]]&L'x=0|{p{r8   ~M4I:+ PTw+/wkY`:Uھ5Ut\.Rz qc裥A E@@@@@ R@b@@@@@@@@@@@@@@@@F5^yEz9㏥5kԭ[7u=h=i @@$I;vHm&Y@,дtĉڵ>XץV$ `C, -U~ŋ##9馛}ڷ" h"     @jj                Vڵ;O:di|kt]Jȷ  OBeZ*W({)}…҂GB֕,-[KAkeb)H/$B+#vo"     j'!               ERݸ4{ᇑCWB{= >\*UJ2"  oƎ9@ xt5һJI'N8#8xYSOE·Tmy ҥJSDBzzKjD:'Uo      P+]               <[7KHV>o+⋒ը!]uU8*S@@@@@r\@'@@@@@@@@@@@@@@@@@p t9R׮Rّ>nM-҈#TdT7c=@@dZm nR>/+C#ZQ#NHPƍ:!P\4ndtҴi 'H$'CnԄ}      j7{C@@@@@@@@@@@@@@@ ȑRܹҤISOIʥޤ?P?kaCMf.+gݼHXo >\˗תU񻼗_/]FvT^=wqtQ-[!Cx t׊8dMFxLV}ZlX?RɋڧsˋjԈc=o䳅m[U"{Jz!oR+/~M7EϖJ$06lH=     !@Vn(@@@@@@@@@@@@@@@@ l(u&o/u ͞-jFYF]vue[sM￯M6e4xbOyA[MM6{\3~zn >s:}c~.ϋ`aZ\p>9ׇ\E]j~f݇ر#Zt׊8dMFxC A-?xH^|ϟi8 5iD?tUW:q^wyG+VW_Sƍs~M?:wK.dm;{\=nf^ҿlg} 3gn=믿TT)z뭚2e cpi n*[^կ__={袋|HaĈ!W\q_ҥ6l>3:r0gz'W_B ڵ }wm۶y?ֱcG$11СC 5ʷСCwK/T 옆gV7Oޥ?zz{7`mZji;+g?Yڵk֭[G۲e(.)Η뮻==MXZPݻwD[A$:7RG3f>{J!.裏VӦM},_|>nkDcLnݬYcTN?fY}[n}4^z%)S޽{"ECM+ ly뭷oɂi.?<8 ;h~=~̻ uꩧF׉&7 |G,/['2;VVN{VNl߰ϱS"wQ7^Y3'ׯȑ#5}s ʊ[9M=q9A{^zzMlzk\fcfe Hg[ᱱص&;)cɊ֭[lv8e\ZpM/}e=}^}UcUZ_{Rþ@IDAT;lTƤpFŽ .Mߎ}1IZ=2[]v{o<]}2rG 8x[D"^fHfoQk T,B{Y9Fo$#它\nRze~:?{=HKUߞ     @  VZ@@@@@@@@@@@@@@x X1?<MA{Gs.\&paW1 *Us1eu-4iR/|_& =z۸`?D+pwZ?3 \(HySN ۟ \8D.wŗµl◹hVnlڴ)pAZa?]e˖{h\M!C. '8餓.+Nnqe~.÷믿Guu<:.)Z̎ u۹D./g01uNB;%Ku?]96+̎pBhnj߽ \YF}Mk׮SN fϞ [N. gn~q Ux*΍Ta嘉[lv1.\vj &Op7P +ޖ?l<.+p!F~r_d}Vz衇7۸4W,Y??z͝wvi iy?.*qD !V+Q?} <=o7?i;Mr~A1?TtfomJ +W֬Y ʹe׿#<2gȼy9jvߤjnۻ<57MXv1qĄ>7v R֖=cS*c_l Mtlm[ۯ\s5 \/>W[1Q߲3^GmYԫW4i@dL>+"ΑDhQ;G*aCOkYnݵ+%uq?ITKbt O>/r$9'p*OL^)@@@@(?3w S  N?J>(@@@@@@@@@@@@@ -[y˄ s… 2e`mj֬ {s~YHMq;eaӬY|pClvCXؖ}~'}9bYԭ[ׯgYcǎ,$׿ݦm۶~н{~}7,ބZN_?FNG}t`3̎'aA16z`A?_f,<^1MV8'jd|c~e:pwHOeeA+?St [[biNfpp,% =z+U'RcMfվʎ 'X@M*cco&Mױ9 SeJ/Zfyy:| Z01 CzŝvܹoZHT8%'+'y`2,'=+/2jmofO,(t>*,vTLꪠjժ>86p|0Z%Z[bEtY*cGfh!$;l]aU5 lY~۷#8b;'o=XmvZ<1Ke ZP}VT?>N5 KM7%XH=?rw2+SI-wt)6\Vݫ.1pkIshG-RBx%+p \g6"@@@@@ ZqPR\TL                E\`"㥗_^]4H*]:uwyG[l ~nj{|tq?;}z\ؐ_nmr~BB9BEȨ~r??|9[ԱcG-^XSNX]m1b\h\@\Ћ\0_n0{{SvmP.*~7֨Q}\٩4Xvٳ=D<\@ʕ+i?xxVtAg~z˖-.C˗5jfbS*$;?e٘B٢Hfj+9f@'3F.N\sMxoR;z^o]ƅd֮a[]WT-));gɅ0&czf֏ml9cxcUtxʘdŧ2;v/e>.T͚5ӌ34d_OJJj%;#0m3Z]~2+5SeER9G2;GДy80[ɓ%iRÆ #~I^*)mؐ?PkDK.ƏH}J_}%"J( @@@@@  UC@@@@@@@@@@@@@@@rCe@Z|}\(LpBQe]v'K؂x+%KwaHw}烱>syka36.Q`dR6_w,bմiӝ1X{9ըQCCA䷳Uy͚5Ͼ@ܜB7 7v6mڤJ*T s+h¿ .3g\'1M>t-Gpl{cl1 m0|%3ᶱ|m2S)lؗě6d܈W֭[]9k6A]8Ƅwg^^= ׌J_+—i!]& 6 ^KfvfXG[\2ا <~+zzu'q#6)Ě::tPnK":sbdTƎxά%;5(c2%YMܲcovnN1 %{ha\}ﳶUN]B񒕽ǎIVV*chck.d7o+-K\T_?o" [KH\~zH.Ե     w~                @3 /S0C9`a1ŋ3.sf|ěo){mٲE\B}.o;tǺ|N:Xhĉ}l3g͛ea0y9YM|3Yʶm۔ԬYӿx ;OvLSsd)f ;ՌWeA ˖-g/ݛ:$_*c˶ ω}uYqzؔ߮?_6uoe]˾c˗iZ|Y^fSV/#G^Ǐߥ *x @- P ̎U^ϰN36%r{ s/w*d2zޥ[7_cZT}vYy2%]tEq;2kɎmǰ[v uָ݅˗رc뤓NR=|o3IYC3,,/6-U..&\\ ~H.["Y.OJtoݖV ~!r|?ȥ K Ք ,l=     Q ǚQ'@@@@@@@@@@@@@@@@ XөʅII*(%.s1~SjȐ!zw/ˏ'1)||V,'k O?TrKs7W]u[oU=\RcA]eZpW>}TzuZ꯿{ԯ__{5kVK.ZdItY^oTJ_==\|Z|ba?s1ʹUV-icIl N8n5='\ Ev|s΍f| Blcec}*u8&2Zۯ%?dI5}c Ą@+9];FrVؖ9S @Jr!rA?oOkoB@"AN=$͙SVk~ZE DuuI5jH\ iA     9$@VAR                 PPfΔ:JZB>]rR=mV[H[vN,[/ W^y*TQFN]={TNuW^Vxi^:yw~G^pl 'Ñ,&Zj[ֶ-[nݺj޼_7/۷}uecbA'Gyc10pPch,6*駟0%uR9?YE2l[IޘoƇy:}Y~G,ta>9{G["o,,ĂޞsIy3xekOdZaVZ^H7x}ȑ#-3O>- ǖpnĉaiV._2R틃]ʡ=6vaZV H8pOp?S^ziƯ~[HZ*$x` xX_8z9yYyLffbŊ^{Mcƌai_~,Xmh`J2S+IeY0N5nX,Maeu39zB3ʱMԖ𺒬Ϧzn#v-)& 裏x&Q=d=znҤI0a! +e}.rǴFlV1He ؆^f!Ljg}ѣGGҷ|qqE*P:{'ѽr> V$rdv EN` Xi*gKeFG,X.V:+w푻/,hv?\rw"a pӲzo駟~]c.<"p!{x|PT)A 6,7]w]j\EаaSD@ԫWϗM,Xd^{3<#+&t s=?ؼy>71s3z'5x (Wlٲ=~zoi߹]E㷷vtMi3L }옆NV\pVc=6p!&h[X~6~NbE߻`裏6Vf͚,vr(\-8}~wX#Fv[?k"-; ~:Uo~*ѹz 2$ji5e}"+cL':3gvi~;.RJtlcz!uJ(\xᅁ /p-Z6lsaBk.ؾ}{<{c硝;}ɇuմi`ƌ~l I'Y&lcߴeO. _Oj֬鯍O>lPf vև^M6_|ԩS/%WGf}+cfswٷ,G ]4gUKzl58g^$s$+oQ򓀻qAзo~_(p 8 x!?նheGXV~&AE@@@@HESOᘲ(Pwc;  @~ZOZ*M;X@@@@@@@@@@@@@@ ?nA㭷J'/†YXoСCBi&,]JpTrarXY=*ȅP.;H~ ߊ\TjX]|rxߵpBկ__.#Һ|޼yjԨ\zӾ o'!vkjΜ9uw}*4Qڟrmիeta$ᢝ֧mܸQ.,G.\nS`}dʕ]9xe'X=W{n;.]Zݺu:Y.TL.L/oVD&XBtW_~ Bx}GٳjE]@@@ U F@@@@@@@@@@@@@P å۵Bz sy}N;4=s>&@YHrX"0x`ie 8q{n 4hPn2>,p& M#Gꨣ. @ .eam۶Ր!Cvڡv4jԨBvZ)Rf3U$  uխY3R 䄀-֌DR.H4`R ײΉ=QF2y2mZ$\4ѺuR˖K]$w@@@@(\jexl                ^.Aru]]vՁPK.KhӦM7⫯x:;L}TӼysUVM+WԂ b ;W6͜93wp ڼywkժŋWjE\撟6nܨW^yk׮ŋk…otqi9^TƤ4KB9sv)% NyvOgrS+.ysoiܸH}voXVVRŊI-ZD^O=9ÇK_/]w]$µ7L     7u%?  P~ZOZ0!             @~2Ej.1c}IO-;<=:=R4i:Z3o<5j(ǎ@@{オn:_\߾K/T锃@ڷڅi] {ر#,{-ohSO-K˔f7ޒF&NSµN:I.4x@@@@@ VW&OZʣJU@F@#@V9V@@@@@@@@@@@@@$ҕWJ !([0$XR=e{"K+Ȓ -[Tti+V,knWTR؏~ӦM.0!@e|1)/O>\vfrF# KF?n岯նmuRy]½^{-R͚RǎRRӦ@@@@Z?ų)["               7ߠ;u74g97\L2yeo Њ}%7aZyϾ\e{Θchbi SR@"RҘ1ڵҸqrԑh!U&u {Z&+%n+pҼyҥJFI.zҒ%z     U@zdi               9?:wzHzYBg F@(m[$4& #ҥOzJZP??Njte>H/_ҬY3!H+4mt#HuH'$=aC@@@@@ Z8QK@@@@@@@@@@@@@@@@ M9HcHcFpD@@  L"խ+>$UC( HGҚ5ȑRFҠARfR͚Ko-mX(aefё@^5 .[&     @ PhgZ               X`:uk/I" qsi  @@V@Ci" @PAjN6LZ<򷖞=s /VǥWU/)UJ:lץ+ "գ'R@@@@@j%+@@@@@@@@@@@@@@@@ ,[&l)sGkL@@H,u4cZ@ ŊI͚Iw!gUW:޽%~1@ŊҥJ,-Y"v4}zo`E9/JA@@@@_jAm@@@@@@@@@@@@@@@@/M>8MY@@|+`aZ[oC@ժRҫJWKtEgHUH+ *-]ZD5nZ=[j^zEaCysػxok(ʞ,Y"%BED-n{[(喺-*%.V".٩9|p93缾o~9gKoHwAT     .j ;"               )X\jH*Y2-.LA@@ #X@EIef0@(-t /,@W#}AT)zuǥsS2BTKҦMRժғOJv]u@ّ#-"    ZgIM                @H,Z2i4P4K#  DG, @X]wIK{JSJMJ}D/RDMciHU3[MY3i0i.}]*ZTvo=C@@@@8@hW{@@RC` iԨ:@@@@@@@@@@@@@@ ,\(h!խ+'ʕE ԨQCk׮= ԩSVΒ%K  $` =SKfXR_[ޗٲ%`Svѣ=@ .5kIFߕ 믗ڴ*WL'UetֵdA[U$6G@@@@/oR"̙Rɯ'3531#               (`tEǏ'L+_ôs۶mu1=z4f;qiFV/" @XсҕWJuT@W,ln^4Znj9JRVbE3={>ʔ@Sr.}L˔*i/Vn5uK.Y@@@@@ | ׆!               1I͛KMHcJwPΝDn<@@;W:\jmgfnr_L[  dI1BڵK=+f͒Z?_;\='\Yzyi@YSOI^(i#}i ,1)E@@@@E                 @|K-[J\#}3g|G\fR*J\r݊@@ ,PA)+񫔱f6'N=a7y} :?+͛W^ 'Tԯx\vbj3d 10(KX1鮻$P@@@@@CT@@@@@@@@@@@@@@@@*|ԪU LO9z;P=V?K7t,T 6l=o]KjɓRnq?3 @rJz&M&Nԑ,nzƎLn+ܹ% NKiV駥 Fegn#F    Z >                5RE?X.,)ٍ[tV?KX,2B@pضMڲE_?zE_2˪Wiх1#@,ukw͛+]ZZA*\87uBׯRbHfo[` H#f,     @dD@@@@@@@@@@@@@@@L&it5KI眓nJ.+BYds ,f͚~v  $0-Tn8dFUSw9rXd@ իKO!E*}g4cԺ4qԴt? <Er{٪Ҏҿ-Y}˖RɒcIWG;     g'0=D@@@@@@@@@@@@@@@2K^+SJ f2رO[K.  e!FA{E"RF= @z Xvv&+H?,ԯwtRѢRÆ /H+WW/#]&w]ҼyڵKGKUHuJ#c     @8 ί}C@@@@@@@@@@@@@@@L%pt jM&b"pꫯV֬-+Rxqկ_?)p,  rcǤe-!o8@R,=#d![,@(_^7p]iϤ_jԐJ/n T  m M0}!]rQNҔ)ҩS@@@@@_"               wJKH'K%KqcTa*-9ܪ=zpJ>-  FKJ'NHuQJ8/C@X@[7Ǐĉ})vIqV\9߱ڵkk̘1ʒ%lٲeSp˞=is!r3o9ٖ5k֔ @@X/qGE l}Q9ro6yuTTT;8ki*\kMp4flsi[[ʕKs[R@pțWj>K ZH81/_ ޲[ QGRIm~ihiPqcBn] / @@@@@  .WS@@J` ijz@@@@@@@@@@@@@@ R֭ԑZ>H.(RG?<(lÇc؏m~[n#U¶,µ6׭ĝ'O6ۗϭ?}{nf- G`.X1i@E9#Oڻwo-8/}{fpjqs[Ucs\;6@1 TPB:]Wawy>6Ed@ [&Mf̐ Bp-۪UKdE+Z#G})q1.Ϝ    Pߤ"E3ƍ3pHj!.U#h#X@IDAT &@@@@@@@@@@@@@@8\Rzr Ksʅ(@TT߯={"vk!ZSڕnc[>vXݷ,eç *۬3g͚U-[l17tPt3۸v{o߉'dqRm oAbCl=CȬZȖfoa(lP@@ ,m[$?=Nͱwء۷޽[\mv7mX cMClpxp;*|lIiԨ,=0y[pmgz͡mnl7se l>~fq<[hѢ1vD1[1Tg-( @jصi['ݖJ+\\OҐ!r>_;*VQRWa =ʾO+7+WN_|*TUTw - ⃵,\k }\n]M@Vj񝝹iӤ!CaZ]µ.,s0z@@@@"Y@zj%ߎ3@@D (&B@@@@@@@@@@@@@ ,Y"5h =䓙fqZn]̶amܸ/n 9r$B.e!vݷ@$[? Őqڷo_L@0`bolX+9r!UL/_ ڹA@ \%IߟҚ8?N<5k~իegsV)F e*+Vz1Ҡ ݲ]w`(ݮ_>&ˆ+WK/T\"m%pP µ&O k]} \>gθmZcXu:w6@@@@H P+ZɷL@@ Qj%@@@@@@@@@@@@@J5kH_-e͚)cǎ_~ ]eFb+W.&Ȃ[R'O"&Ǐז-[b,6 m>seZ+V%\ou>T 1Ǭ aΕ6̘c Qr'+VҥKc6 ϲڜ”,XRJ1[}h/6ߵ?ZJ?_רQCjՊ,L)` J&I>n|0TR۶Rr!}gc5Kz}/,[E+pm!@@@@|;D@%@V8@@@@@@@@@@@@@L!pW\vT+'N-o OEւlQ,Y袋.C*T8hF`V{KdYD0\k>(BlNc8 RUV= @ 5>LY:p@25j],Xo6gy^ve.gr_<,|־t_j/_e˖9};uWnݺW=EAb lW֌ɓRp믗 }4M`>ii`CNwo[;A@@@@ JCV8@HZb @@@@@@@@@@@@@2RҸqRv?.`ҥ~[bl0- ʙ3,0r~c1,P6 ۟jׇV֬YE5d[Zt .8{E@ }UX1j԰aCfٳgؽ{͛7 r[dN:w͚5S-sΉEfµ&N$ԦdZ͛K'ƞ=rJ#x5D@@@@ W@q&  (A             dh[n ӑ 8p@Y4|YѣG"u?jՒm0?.`K. |>d˂-,A>dq*RH @"D>}"aM ۱cjZz ,( .I&\r.e3f_Cf-Dޟm]RNvTp8@ ?ך0!pMB:u҅&Lph4w$ "?w), @@@@ P+/ ZɷL@@ Qj%@@@@@@@@@@@@@Ȱ[\_}%l@FRv8 @Qǥ ޅO5ɥ曚>}*TÆ:wҥKOG )iӦi?~ *;C{J(92xԒ%p-+-[.Z睗F[oI}$!7z8@@@@.@V͂g@H#j@@@@@@@@@@@@@s+Z=ӯ9FႽFiҥYn&kNUVM2X`ƍ.d>s͝;WʕkV.[l@Z/uKY 6L}wQs4h$A`5-aYO@zmɜZ_ӏ    Zɷ$P+v $J@D1q             NQ#Ii|)Koƌzw4n8ӣGuI˗}gh\`׮]>XkZx5k޽{}ʖ-[O $GhQǤ#9ggsdoE @&ԩS/jΜ9>@#@6.I8p@2%嗒Skի'e͚Z#x ?^JժI}J]JrE    $@V_Lx6X               $F`@֠A ӲGZjUVʛ7fϞ5k' L+1/ qj…駟Tzuy睪P|M9r$BGF@2ee&o\}ԩ-gϞڴi,<0yrV dq -[̙35k,;QJ=q#e@7Kv.w- 6C.^:t(ͺv[7]/.j֔G*YR華sgu!    @& P+ @@@@@@@@@@@@@@@N2k\v[^.*9qnjժO>馛e 6L;P#@\m۶Gk惵{=`Ν!C7oijӦ^y啐vw֭zw}/BHΌɓG{ڵkߤgտծ][-ʌ@ /6*fKXi}'~=%z)R$$=W_֭[3B-43_~Ewu.R5kꪫ|Hr8{7lnp .'5n! "@ T"=4c[RTT Txqe%rߥ#wIyѢR~ҦMқo\UN曤ı     @:Ԃ               Ȳ^z)(obi2rHUs+Zx, d_ٳ4qwgRr% rJ;tɕKߤU Gk FNgt     >jkAO@@@@@@@@@@@@@@@@ \>=Wn1g[># EW"շo_իWDzs9n!jԨQU,YfaFE"=|Zj{lٲKk7ߨ_~qU-p_M~[:tЉ'²t @ X!ը-iӦW_OlN/hʚ5K]q> )-W=K|7%رCZ%\߷db7aWo߮[ uz¢Ot"S O%3-O?חJRח_JǎEkiF.]ZDrZT4htHbj@@@@@ +g"               a+a\RigyFեKm,*U*giٳgORXO< ֔gU0!x#Kzmy6mN:ƍk޼yZ|, @֭Wu՞}-ZT,6JU@j^<.9 … ]{ Ez Y,dɒ -?z)͞=;t dXw_꫁9ʕҽJK¦  F˰ r.Q.|S.Qzatiii;nF    +/} h@@@@@@@@@@@@@@@H@~eHqGYf&Mz{lz=?룏>rM1ckܸq8q."=*V֯_G}T'OT,Yt-o;vLzR˖-uQ[Z`9O>*QYlu+@K/oO,?~÷L-[hȐ!.W^yE~={kg%1B#FP\^{5]wu۷? m۵k[ܸy{2eqرcu[o*kk[=>/׮]+^_|8ȑs:.qc>пoSg@rԶm[h"(qsM6ݻk}v}ݪSR1e˖Y@~Q@(wRj1?~C-[q"o<÷ɓ?.YD_|۶r6WXfn /Vͯ YyH8bs{ a9}Nsgӝ;wUW]5g<[=gK<.9s3?C=3g'o޼}797? kߙJYxljݬKk^#oop$#@ T&Ҷm#jHj.)~Oi%Y/=r9r$qG@@@@]!               $G gON ?Z馛RvQ|րdPV~m84vX5o:tHÆ [vu-]a+U䃨-o>0W_}}"Y^zl,݋'OX}sC6lؠ-jΝ>jСgV]Owys+)WXџkd%1X@#O?{dˊY{_Vݺu}? ?,]fbv, efa ÇA `9x``ӦMOԊ_7xgԩZhQxo;oe!l0UVszY (W+Wv _?', @V _,! dmӦVnڻwoǂ]ʙ͓,ւ,$Vmn_v[]-Xγ`}FzwԸqc]~> H"1q ( \P!?i7gS2K?vqݷ\Y1{lBc㛟|p&]‹۷o{?\6  V^(٥wik ZM3"1.wO7.1\<@@@@HRJ@@@@@@@@@@@@@@@@ 3 Bt-ipa եKm([^zj*[c=͛'[L1ZhRf|WP' zGqv?pjժaÆ>V?~<>cvΜ9s|P՟3gÑ>&MW^jР '|I|b~Xhm]VZhr?~Ypc$4+R#F8p@?֯_C/_[W_Cl_R5/{m$֑#G¤rȡ*UK. KK,U`Aֳg6v>#`[YXa%e֬Y-[6ft^UhQU^7]֭mKSbƓm۴bŊԮ@ST͓<$?1|]{: .֪U+6 +-j~njLQQQ;w?V6dz駟[1c {KYno֭.]W>cN Z%K$4g<=N<.9s> 9cۂ![q6綀֭[p;@ͧ-,y?01~Q@P(`KY_Kn%&)-I..8 w6] Z&Lʗ tMh@@@@2@_e12@@@@@@@@@@@@@@@@ M~EcB{Ҵ)ݻ7` s9s{s*U-?sL;vLss 7}ܵv~g)SF+V&f^yǏ@ZRr҆ ;wJݺI\ urmۖ=My&ֳ]K\F*Wzf@@@@2:0s"               )ؼY9Rz ,P)l'"]v[oSN퐈gcݻ>{O&Lc*THuVmڴ鴱^xqѢEOGz*~VgNŒP[6oYSLq̙3n͎;; sI}|I 6̇믿VǎO&kиbsƤ:? 1Ӽy/ԟ&MPb ;vl둘yq*t7]4i=Bj\J #o}実Xغ4d?#rR:ҀradtŮV%9-X .x[ 9@@@@2@L9j               kIŊI.G)dg]Kʠ;LU-h@~teg>m/Vܹc>y5駟չs +_|ϴlٲኊRݵْQ,T"EG>u7Οm xc?}јǩq'ƌôZwyC뢋.9rZB¬$Ԏ?(?^ܹS:uʕ+}{fҾ}|gF N 0Ra&Çkzדu>'! qKj9;C?CF,nӎ;dUl.,uw6w'4hvL$ qz=c \^[%}gU4hd ܥw)2-nu ksֲ͛iB"/E5    ZH%                 :ʑ#t?w+[>(*t-'cRY?ڏM6{gw,cǎ~_^N{W_aFo=ꟳz~g=*dV$v{ꩧdOSLQ޽}[aW7V~du7jHe˖U:u'&;u %J) :tVZ۱oϷEcK_|͛w=Bݺ5KxKdٲe?2xknoj+tk„ >mҥǎ~AfgϞ> 0бӧ+v<|E @3}b_p饗`~ߙ~v%q9VKY՟Z'_q~|_i@j.-{nKd!69bz3݃{w9*U*)-*Xl^^pᘹb칻}=ztMZb?-1s`&w9|}\>wm۶C~wy~w'oƌe}j$4/}Oiq.\_LHsΑZohp\d]+-i҅4eeիQVrS +ڕMS9    D@6Ep:  IfI?]              .Z@9RoCYʔ)/@?|'OPv!ζ 7n([~ٲe>Lɓ>dVZzg5m4_0]=ŋqKi`1B~֮]'|҇٭9B'NaY| ʬQF, V+^p{XK/BfݪV篿icy|@TTM*o޼ިI&n!|kaSÆ ScSyΜ9e}½}jƶ,ډriɒ%g֕W^m-nS˖-uebfkڵkRJqSjUfUǹsz#~Qׂ,_ {85zGBĖ/_Sp:1cǎֽ{Tǹ $YwaZn*͇l> /yˆ\3|jڼ .͇llۡC~nos^g͚5czkUX1fݱ/mۜ%Ksze ԩSs΃?y\r6NwKFGGy8>U~}мeZ1ZO_B|~"lai߹vTΒ`o,0־KU\9=A @}4|ua9Pr`w]Ȕ 0kVDrҿ%wN:;wJj\@@@@Sa$o$(IPtP@@$ cri$              'Nȅ"H/~ܺuhZfNjѣGJn{Q…Z)zիuA$eaS-exeARI)dAa jJpb}}쒒1ؒ!֭󯷵c u(P 3tfײe[-;@͎I;&9ѣʕ+ș3YSg{Ǚp H% l4=z[ڭfMA@ Ӣ\iN/ݺuÇTaxeS s^w^>-1gL<.%sl9ؾu[}O` 6 ~IZмl?Μ9SǏal_$WeKjܸ2uY3}{];h֜>繏(lv]yDzܵ"    wCE N2k@@ L n              F´*Y2+NFU|{Leʔ3<믿>5qJl{-TV*XԌ39"O޽[]w]>C~ "5J/Nl>\.FA@ `9Opm wuˍX~<8T e֭[w=eV_pݷO6MbcǎU ;@ #2,5i>@N别^=[_9CuzUi@)_?;l"g @@@@ԊK&j%l  @J'#             Hi}Yt[W^k˫o߾>4)W\ҥKnݺx{;wni&cBc4a„]ʖ-q~@$F4ĉohΜ9nA;ODm! pڵRŊ嗟`C?nݺ)k֬$ nPS$ W>,]u5KR۶wz    @\j%~6@@ Ej@@@@@@@@@@@@@; uٳE0c@IDATF®{ڿ}]:~_^zu!@ X#4tPo+i)@Y`X馛?I΄in4p@u멧ҍ7ި,YiV8XooV]*I"Et z֭[/kSYfC@RG*6?^ڼY*U*e[W]%:mU-mLTrs"BXʚz@@@@^@|;D@%@V8@@@@@@@@@@@@@Ni"iŊiw>}Ժ[ԡC8;wԘ1c'j׮;Ν;+g@  ,,}>;zjFÇCVZi &N/9s?!{b?Ofذa];K3%ܴz0\Ll]}Mu_\M?LcO<19j @ @hM@Vk*m['PmN"@̵@# @ @ @ @ @ @h:-HX#9묦k\5g_+_Zk>nmf*sU7c{ϝwޙEY$;Cvu*dϬv{ @4)WJ>=iFC\s5)%*h 86:WNuO*0r@9;m_W&g*_4\rqb55'@ @ <\Ԛ{;{ @$ PML6"@ @ @ @ @ @ @M/p嗧 Izjs'M;#7xcѣGo߾YwuŌ\;*oV~SK ?~|_mVuxV +Z& .8U`Nk"t5WL#F.˟:,qYJ\''\,u]{ee H.#PevRvlUYy`r?w%{w^wJ~5Yt[3;EL @ @`fZ3u@Jَ 0n @ @ @ @ @ @ @br-֡MyAo4?_ʪ 7ܰ.lA[oׯ_4jt{,{oЬ2J8qbXb:nM7&l6,Cmkhw}/S{*lE`رꫧr_R:˽ǻRJ[*s'0a„2P%RZh:0vwN)޷wg&]E+pm-Z%`k iTCS$>3R4&?YKWQ  @ @L/ Pkz9y%PkNlK Zsf @ @ @ @ @ @ dgzh7Y:9OT(#G<Ù4iRUBYgZYs5kde;<x2jԨ:(ew}uaz|W RmFiQ3 @"pa3$W^Sz\|J2Vʔ)SnTҿj4@ ?;3UI+rK\\rlVvm6d7C#Es$PJV)%h^{%{"sT]l׿&dwqDvZ% @ @Z@\Eٓ &Zmb @ @ @ @ @ @hjweMӸ2<{キ.e.T&LPseõV[.VXAPӜM )U#<#SKLIHͫJJpܺ뮛[.%Pn[nlEr=Yy>nܸ:oN)~{~麁 ʰaòe 6k\y:%*Pys=u뮻[oU_ZtMeE^z"0ztKE%U^g;!mpNZUJw|{̓NKuqw$ @ @3 ԚQjʖ @5Wlv"@ @ @ @ @ @ @M#'Mr!MӬ.ِI&GöJC=Tlp{,'NU_i+Ee>dȐ ZBYSw}SK ?~|ݑEY]mЭrԸw*AK45S L0-9<{5JqWROi*U:SzW?ouzG4^`ܸZµ"V[kۅɓ%Pu6Y{L @ @Q@֌"m-PV$@̕@b @ @ @ @ @ @hvJ[.9FiRlj$1c'H A*z$5^y|^x: i)\..teRX`&N_~9/R^xᅺ<4W_%aVPe]~  @`>aTl~{}j|r^GUU™yz^Ӣ.Zo5f'k5Ӝ sQ=p#}$'w  5&LH:喖o|#yd%{qG2'>w؋ @ @# Pk @ @ @ @ @ @ @\2x߾]#czW#Lc @@rO"PINfhM7գ/'@@2$=y{KƎMp%YVZ)3I>Óߞ:lM @ @5\J @ @ @ @ @ @ @ta^Jn!g. M%PkdQZ POF@4  @BK5$c$5`@w'BۺԷo\pAK(v%O?ݶ}mE @ @5lL @ @ @ @ @ @ @tQ?)+}.&P #P˅@t&%`:-Z@r%Xrر_R>dh z^x`r-/'mN{x @ @) Pk~ꪛ @ @ @ @ @ @ @\l}]M],2i  @@ F `x[`8K:+YzK_J J.9'fݏNn9pÖYo @ @毀@v @ @ @ @ @ @ @ @ L\qE>]K`>}ɓgX% @ju0ZgWh KZµ. 2$9d啓-LGfnK&^~xr!ɷ=6 @ @ 0jcG @ @ @ @ @ @ @ @'wjhEw5@V`"@:T@Vr;vhkrKrɞ{\~yT ! /rYر-aY뮛pB2th2|xr9%%M&N @ @濱# @ @ @ @ @ @ @ @M*pq^{%?Q2rd2eJr%$Ҥ,m(Z&qc @O$k1*W%]`ZGF5߱ DvZ2fL?E':$뭗|-|3'眓p@y*'@ @ @`Z`X$@ @ @ @ @ @ @ @z &SrQɰaK']Rr=Bo@>ݯ_zDtn ]sͮf-%@`fM755 UMv%ϓNo~q W%d]qj @ @@յΗ @ @ @ @ @ @ @ @(0`@һ}aĖJˠe+LY'?NK^* PmZ @,JVV[e_`}f(ߟm]rM7%~ޗWrN;%/8s @ @ оv& @ @ @ @ @ @ @ @@(Z&M@XB MW] ܸGtO "t* Xy&@@+b7)ߞ|C7'{#JKLzG @ @3juc @ @ @ @ @ @ @ @*Pi79㌤OwK\% D,Djut%@`~ ֚'@><9[´>dܸd}WL8"|֙ȱ  @ @@y^ @ @ @ @ @ @ @h;jFfuiCe6!d49 @@xde%#Zܒ,\ɖ[&_#9t&',|ҫWrUv%%lrµ% @ @N I @ @ @ @ @ @ @4M K<9ڪTjM<{ٞ ~?Zէ&[`͒K/MFgJ @`nV^9ᆖL#90vHV\1kt?#@ @ P5@ @ @ @ @ @ @ @XEMXꕜuVҧO[Kʵ+Pϒ @+PC{,:Qh]`M[ַֺt%{]w%sLr'lKN;%+|SW''vj+ @ @չN @ @ @ @ @ @ @t2܀Ո YCxҤZ$@O&o=S``=H2 }6ؠ%<k}-Zk;92yOn%epO|"*Z* @ @% Pk~ɪ @ @ @ @ @ @ @L̾}aÒ#~W@>]KtGiСݥGA 4Jr%{)Xkn-G#w%O~2}X#גoOz沼n>\qE2ayE @ @@"PU@ @ @ @ @ @ @ @hWz%]RˆL@jdZ] j;?,hK`@ ^m\zi2b`2Ut{ߛ|[\w]m)_JrI =䮻=hWL[Z @ @=M@VO;K @ @ @ @ @ @ @L' *DtxAK yҤ.t&@@ Zmn] @6TV:Mc}I>8y7cU/9ǒ?WK֡5{G @ @toZ @ @ @ @ @ @ @ j y;m]DOd.X$@@ (&J@֬d'@$ЫWrɲ&{_W^nj 7QZ¹wPr%[ou% m%@ @ 0P  @ @ @ @ @ @ @ @@0 y |ߵkuh:E&M @CJ*t!.* X8&@-{nrmqM]!C/|!d[J}4okrHrm҆ @ @@.r '@ @ @ @ @ @ @ @)S[oe„ )*x=J 8qb4RU)pRFF+ͦ̓>QzO>u۷i/ ,@ʼQZhnyrtK @ɓT5F%P렃Qt.ֺ֖0=L"9d=̓&?A_a[m5w |s-駓?!9EM79d]c؋ @ @@3 j泣m @ @ @ @ @ @ @ @ J+2]yWk_\ֽuy7ǏK *e^³:vڭ:7sʤv9t *[%\kjTR /EYh-2_⋓K3Wl *!]%\ k ժ..\_y;  @ @4@f9A @ @ @ @ @ @ @:P`„ y /LWʺ_~9/Lq!Z%kVS 6D%D[nr *M<WZ,RTA8UZ+SL˽Nz \+aL87^y(in`cAc3MOŶl-Yz饳RKM7]vٔ2\-^/P2תKDp/: t3Zzi%뮛|[w~.ZGR|Z{;dNv9ww\5 @ @hZ-x @ @ @ @ @ @ @ @`> gy&cƌ˳>sե\毼L(UF@S b:thTBJxS qjRGWA[lм-.\Z}9kF6QFՁhe} H+!`N? i>p,Yay9)PrӪ8 @{含v@`nxRuX`/})uiΖc|-eK#үõdFnF @ @*+ʫr @ @ @ @ @ @ @ 0%T'O @ @fՌgE @ @ @ @ @ @ @ @G yGZFRJV 9*He]% 00*!Fnav} u/_K ,Уuvf^zeСCgޠ5oF}͕Fyg v!n%1Fb-j+gUVɪZzlhuܼjMqs$ @@C _ 0_kV @@; ઓNJv1Tc峩܃uTKyZʩBr-ZmW0E @ @ju"C @ @ @ @ @ @ @ @@x饗CeԨQF;vT%\"*D[lEL )*AE%o_L, U[o'CJ[#/<)\e*Ap]mղg5֨KY.eEݡ7eɓrg @A@<ٕ6 j3  @v!{_@iY}|Tȹ綄k;\kmkMf @ @ @ @ @ @ @ @ @@ {seէJYy3t >*!C%@^iJwXp\˳u裏*QK\)W]uUzL2%zkeu֩믿~?o@cIڰM @,P6۬+Uf! Xk0V @@ |'\O5gՓci)<uyObS$luk;L @ @r @ @ @ @ @ @ @ @xrwfȑs=eܸqumfʚkYfo.h]O`)e-Ǐ?\eĈ9묳K/ۗ}KlPaÆկKLق G hkU)&{y49d=f @>%H;@i{W"_zKs[N9%8wjm!@ @? @ @ @ @ @ @ @#u{n:D#W^IX[ho;k}gMz\- @ @̩@?2;ٞ @?io&cǶ}[ @ @ @ @ @ @ @xgr+ȵ^~ve뭷k1vIr=oCJPޘ1c2dȐc=뮻f%/oJ>:Tac*m!@g'{=A1,W9˒-H=6ճb @@r O~|Ӯ9mIO??yɤjʜf{ @ @@xd?M5́?3M  @ @ @ @ @ @ @ @ u]fM6ɠAr1d<y衇_:z0{@铍6(~x9眔x _2nܸ|r-W R}~j%3 @:T`T\´:#M7M.%|z<̞{&[n*|}1hRK%\xawi 7,9餤-Aɚk&'ה( @ @.#Pgo& @ @ @ @ @ @ @ =:Dgj4aÆ+{qug~m^ho :㌤oOL?9n{ @ @toZ @ @ @ @ @ @ @k/Yo2~qK.W^)SdvʻNiØ1criUUXtJ#񪫮ʑGW_=ugN=\~_fʉ'ءM)N/ccԃ/|pn\ve1bD}G?ĉ KjdI澹_}3X if lo@f;/ӼW/xl XVneKz@R)#',K>KgM~<;|ɀޗ\|q[=Eo  @ @Zպ @ @ @ @ @ @ @ 7pCuuk=ܬMHw}wjP̎suЅ^X d_dEbWr㐴zsJz;6/N%[=s_;7m)5gyfN9l5jT y=?g >ٍٟ35  @`SO,4uf#Q{3|tA[g"o& X5L~u#k  0$<ČK-|#ɕW&O?xb2fLr-Z\~y2qb1S @ @jM @ @ @ @ @ @ @4~'>b-}s}w7||_l*iLq>^;eyNS ZkOzNnn?\7ֈ*[㫯:w uO뮔Qʕe&GМx^=lFMm: "@M$ PNt x+ ,@?.a̍ 0'޲C^wO%dL?sdO~29j @ @tysl @ @ @ @ @ @ @YSNQG . s-ssfYRK-%Xb7;aP9 &׾V ymLҮ0Acޮ>v :.-XN=z }7W\q<7w.Z&(μg]ۼGz@ /)h@91o^mߪԻ{dumN`l/o @`>yEѣgI}c>GS-(dA#Hn1=H  @ @=F=( @ @ @ @ @ @ @z?|K_gګi|\ve~W0n-Rxs<|#Ї>Tn58d5:d50K.dN?'?I5M)p __Y8t5ǟ޻~ | 'G3x|߮_K_ )s9yg~pyllNǚ]Jn $藕W^zFYgĉuӯG?ʏs=m1it_j}'[=hvk/R_|0oy}.9zᇳ;fرOfm{.'|r},9C>7.rHFY_g֘ɿ~N)(7Mz83pGy&g]ǰara՟AovnmɑGPxgay3~Ζfu֕U9 0%Pf--祼o"@Gj >u@ $]gJ}W?g2徻=^kv7h6n۞FVgZ2rS[cϏ]j0M&P}M^jF5qsF陸#CI}wk'f4q4 @ @`j1 @ @ @ @ @ @ @ @ʀ^{m@Ǟ?eH]w:(,V7tS~;Nt39-yW?߻k V+U%7MJͻ:_~TpJpV9f .*ӝwY|R>zTֵu*v*O6֟|ٲ$]M/R:p uXN kw; /p:,jy *n ,@4iҤAQ%lJOy^}m4sPRJPcPnzXjAAG?;w]~zT#FeL]1wqi\[曹ꐬ~\kfrT7plKZ97eݑGY/򓟬ՊgJXUOŧf&s:mN=Ԝs9ks׸6tgu=|'>Q|&i(A}%Loر;|>gFf> @v.*i27q:n6sҗidIv<^ -˳+%<:V;k:رו [[ݯ_ѣsgT='V搔ЭM6I6z2瞛VX.WVluF!TrKju(Wc2?묳I.VC͸q㦮kF *IvZx>;8ŭg0Tg}вo*=1(%ث1w__zRY.ӓO>Yrw 4+|FrW\g[B:6|@{F[J\{u+ԡlz?~LlWB.袔а9.dKXUٷy5T~OqF7Fs8?3|65r_})Lm9KHV +a%LO8*!%/?ggwͶej @y(ZҝzLן套zh[ .ϋ-Xܖx?ьV徾ٟZmx7YֺTɞ{ N=6U0xv;y~lset H~k[Y;JkM9%l֒{ޓ̽6 @ @jb @ @ @ @ @ @ @4!C#GfNB34O>3iy|&'?ګ~oiCe}f"\sM|FwuW_ u]?<@J֭etNJ`X Nznj6]k ,P6Zlꀧ=/)/g~ؗ :]kv}(^ O?y[Sl4k_U:{{ߛ뮻.~zw)DehK/dמئkL_/~^j Zi#>37?7i@i;9u_NqVc ܳ]?CgX V+soRJ@Y4k-?/{ @@JV k" &}Zz饧[-#Fh~M/Sk:.z*T5;4O:*9d]| od{~ @ @@صڬ @ @ @ @ @ @ @ JxˡN:)&Lֽ?CRK`zu5eOaпF8pG;s)2u}YXdE+PӽQxGg\5_^A'O5X#ov}naǺ cX:VBZM彎k[5>4n[u^זr61q:sΩ媫A4ݞ>8W\qEV~^KpXkSc҇2Agx<3n=\sZf_|٪iP~n4O[STJW>N8O>A{'xb\pAj26YOz@ukg{o_|L]7n\U ~XJL!*-*T8r˛}V:{'Ϗ 9sh{'g3S}O IIv.(wb @ @hM@Vk* @ @ @ @ @ @ @ @@ ug?٦k[{6va@[Vը 6~׿zYxᅧ_Vӧ8}YQm]إKҤ4AP"T4vjDc"I,$$F4* ED {/KYκ r|>Ǚ;w9ߙ;sϣJ*ٳݶ./ԃ>Lw}%ۂmlYf{&M3fJ^Xxu];r䈛'&&&g:6~;rIHc!#JժUS\\;?A@-QFnUzgW9q-$s֧O$x@ޔ5?/鵍@((w{Qޣ@` DZÇnI< ;u?/eyoϞ=ڴiSŞK ؃2Ϗum@ >@w&3K߾paä>e     @ @@@@@@@@@@@@@@@ e˖G}$ 馛’2{nvAw+ lI&iĈ zcz#czS*U\رc]:v#}m綼yf%3^6un!h˖-4ydoϔڵ~z7l_|b_mڴqQeʔq4޷o[?qD9~7Ȃ}ǦiӦۅ99r;tZjUVn`ePv=Ϗ>?P˜ܰ<˗/Ouۀ9i]쵅]|*UhK195@$c (T(FիWw6|?AW^y QF?sw}ݧ:br'; b_`ulz68dZȓbnI/^\wu,ǂ,HyI/RU~pyE.lիeRhcs e!^]r%n) ƹԩS'}.dkԩ_]M4Iq̴^.\ؽm!Ohuiy睚?Znl &h͚5.`˂򗿨\r.\sխ[7 eL/PM%Q/?s ]6l( c6XN:\zyt6lI㍴i,84=W ~1e!ed܎k粥787vh\em4bŊ::߳c7NQ|l٢gy&)Lcm@w l;wݻBڵkoV~?o߾~V,yay֬Y},f+V f <~&w ۲jd̙.ή9zf=11K=z8yx统W^yEMe!W_}{mIs>?3\׬]y]R#X@@T )#ln6G@P`y&M0j{9WnFyPŁP-i#=PIFcpT}Nƍ_ S,=4q奦M[H?秆Sw    䁀w?}=[1F P+N&]A@ P+8 B@@@@@@@@@@@@Xp.cs J^XU |ڱcYY?7y5y4a!QfJsPx 5'Ǐ?g}VcǎU׮]sBBe` ѣ>Cݴ@BS'W^֯j%pfֹc=9%LZ9'AE@_,q)1Q;75ioԡtR~R\\06!   @0 ]@@@@@@@@@@@@@@@hݺ,XSjԨQzg4x` >\]tQ6.^ti1"l2m ltZ={T :/ZhCmeAkVM7b̙3Y֜9sd76EFZZi/ RJfZ}2ek!i#=`l1mB@ | :v ѣO> kwt]Wµz ~@@@@  A[@@@@@@@@@@@@@@@$`!AV͛m۶U&M4d]wu\r-;EGG_~9tM Ћ]}7|nx9RNTҢE Y)SAkfիGov>?[]p*hȑ#] YCq=#A* @ l&+MȈ@b.t09haسR^k-ZH]tѡCB.{c.R5 EHeaZޟ#]}4hteR<I    |gv#              %СCY>n8?uQ\s7aoըQX{z\c#M2!?>Zdڷo#F*]t0{MjE'nW`9{ލ7׮/@T`v_yJHQ+Tw yt<>3e^i(GMGsZ҇~]5k3*lC#cvm%$ Ҳk*H]']ĭUhgZ   !P(ћ)@O^ #;ó @@@@@@@@@@@@voV Yj7o ɓ>낣M@W^=G >ҳ)1s/FN`-{VPK>l036@ d:u Ѿbv'X^0!rTN Xk ~d   NB-{lclu8"[{3               A.ЬY3OJo$e˖;w.R骫?%KA8q>sХK3oYW}ݧ 6h…z.L˜"~Y$!!3jl dM`vR^ hR^HhTxm[3^ǹի|M zε@@gڵ+VH_-oNرRmB@@@Ȍ@Tf6f[@@@@@@@@@@@@@@@BYqƲ2b۷O}i̘1o2eWڷovکu*^x(w#P٣Jח_~ez;w߯N:hѢ%22M 馓 䫀w˥C(P~ȑ`6mGw:ŀtAz;땱' HE 3HgKKF^ZҠA5HJ    dA@,                @ ƪ_~Xo6mڤ9s?ׄ #(""pjJ-Q\x*RHB\ȑ#Zd{#[YhV^(5o\_|NuQe˖ fGʚ{! @v l[BaK@ȍ`Ç{ЏR:th4Z@(hYyeiʔ@UoR͟?_ .teڽ{ jԨ6mf͚y&M l`Ox^ *l٢NK.շ~uKVZnaÆM6nXbօ|i/  P*@'"@ tH]v@ @R(SF@ٸQ0A?^3ƾw4hެC@@@ Z\S@@@@@@@@@@@@@@@l Ԯ][Vڤvz#Zl/\Pu!sYznݺԩSGKN ]n:]֕UVիuPlY5nX͚5Ӑ!Cܲg&sWIDD`{2  y *ZT*Q" @Tw~,Xh͚5Zv[ɓ'Сcǎmb ^+eժUsVREVbbbR rSò[͛]HƍݛԄRJtIÆ hխ[ׅiEOI{~ɪ @H!@V ^ A)k-Z$%!i#=Խ{M'W^֭͛맽" @Ν套?ƍtmP- ײ-Z-#   @ b'"              @tt6lʙ=ILLԎ;\%/suE{mOqqq.XrʪTRRX[yU\9oH7$ 8qBwN/۷'mʶm\֡CF˂,l5klٲI۳~VBB#" @ P`oz-Ъ4ex4rdƃ;- ˽ m Z @ H@Wۏ4pdZ-Zih    Ǯ               @BڶmjǏ֭[]ٲe 9~ђ%K[VoY_,Ȋm2eʸybRm+S߯}i޽ص[gYvJ*H ^kh۴i۪V*QQ ]/^ZOYh jUvݢC @X l`ŋkڴiԩ ՚7o  ,Ptvm XkxFZI5jsC9<    C@@@@@@@@@@@@@@@B ::Zjr%|8bAY|uY_~祘Ӛ4iB*Tpּ7:j1 sI@v/UM{+i @j ֲO:k׮3g eOn! @ ԭ+(_}z9:v 7=.!   y)@V^js,@@@@@@@@@@@@@@@HVJFiaM{uL;k~3$^>]^-?pDyLe듇zYW~0Z~`XѢE ,8D)τ@V<67yqL  @ MVS9  ֪QFRU^jǴi\`z6C! 'B{;µR*WN80e@@@@P P+mD@@@@@@@@@@@@@@@ ,¡TP!([?!_ͣQ䨀 &r@@ / ~[DakիWOӧOWNԿ. D'@IDAT@~…=m?l޴iSM6M3gСCj=D@YSzi*iˤ矗l}Km8    26                ji lxtw`3@@ je]@hJ2EZ`viɚ4iMF@ ZFn;[~R%i O6w    :jι                Mx)::;!""j  ݁- h2pa`'/ĉ+衇Tl y#PԻLi6g +W_i GA@@@%@ֹdX               a'p8ZawR9"#o%$s@@-gT@ Z:;X'=zʕME@ J&}ft-{IMJ͚¶o/p,t@@@@@ 8 4@@@@@@@@@@@@@@@FbbXydӧ%@YJ¹ @\~֢ERrsݠ5#Fh̘1ڍ  DuJFIII[K?.U&)R||5    @X ֧!               @r ԊNeWJH>3@ *[6A @WeKiɂ7k;o8: dXP!⋥W^oƏAJå/pul   dI@,               @| @ȈR2ْm@ /ZWO/im?. @LtuҴi -Xܪ[Wz1ç@@@G@9@@@@@@@@@@@@@@@rYqrH E BS@C}0]BȖkXq-:OI=z`l3 'P'-]*-Y"-TԱ4vt`##   @x DWw                 pn *[,pҞ=RBBK%JH.-"E3bB@E`~L`i @ {? }wٯiNIS'TԦ䓿c R`)Sŋ#ZRZ@^f$+O?-}wHw%]sdSw"EDoh   Z}~h               䠀jEG`T@ Sݠ%KR ´R @.oTVgOIA>s3'嚾}S-@V> @ Dy#[(}4>4B Jo+G@2.`)` /.v+ K{E`Er=m?N}{" @ 3mIK+W´zKj0{~̘Ckg@@@C@P                /Rtt";J*}kކw@@'ffE ^:ymΝӿ>w &Z;wb &P?K?$͘!խ+TԿ4ml=    Lj٠-                ǏT6СR©7?..Y dE`~L>@vR*imȐ]ȸ@VυJӧgXl y'`G_v4n}ˁy^R~'-_wH    :jι                M Ԋf%@ ,קTkԽzIJoi.`- s_==uJ /B@!Pcҏ?J3gJ H< U,/}q9`hK@@@HM@TX               a)@VXV:uaRTTʕ6nR) @Ȏ ʎ"@Rzg>{=k@  zɾ@^׮…u@_P!sg7ۥ_{W|PZ"A @@@@ ySjD@@@@@@@@@@@@@@@ q4 zO>㶞 @IC,R!0tAŊI={GhE `?Y:u{|t,e=K  L9l4wvtĉRFR۶?)8}    }oH                 "ǏK11!X@T:v",RԻw+d7@@(U0 e`OTԷ/!!|Jiz Z"Y֙;vLI35 @:cI6H}&խ+wT4hP`]j?ډ    $goo                @( 8|h{eHGD_ֱ CZJ̉ڨUKB:uJ<8Hk(hK&H 9"]rre۰@BCûtƍm^xAZ^r D@@@-E@@@@@@@@@@@@@@@0DBL \si3;# 8x0YRڜ9n"~/.N9@+ 8~<.Y>Zڵio˻  KKÇKK+VHH*խ+u$F T34zC+@@@@ =}@@@@@@@@@@@@@@@ @7â;t4J:I"RϞinΛ  @, @ /Y@MIey/׿JNlf>CiÆg @ 6m>H*W.Utҗ_N_h)   .j"               %px?11/z4cǎ(.!!!v_rzHj-6k関Ed*T( dIJҮ@$&&ڻw{=v}I8q•ƍ[iٲ ^}>䈊x~)%ƺbL {s9 dv4 ~۔ǶPݻZKժ|?W -Ş\NΞ,Md%e{Ϟu刈%/=@r<0m&@`۞=~/4vT4l4ddA[L    Zj                E?P1γn8p7xnڵK; ߊ-9r$EpqmZdϿ[}l'0;KKUxq/<,@VJ.&`eʔQٲeU\9WJ(6# w gh&`7k֬Ѻui&W6n[nuea7瞆zoQ%{Xb~|^ORF YiР/ND X=z4inV?Mޝ͛ k۶Y+Ž2^0^.WڴP͛NoSfwzdЬ3~U?%)oa[~-\m,h%e}_:LemdB@ 'PZzu'wk%VXF@@@` P+X B@@@@@@@@@@@@@@@sQW eWl~+۷o׎;;wԞ={dq'li?t¦XUŊUn]lS6@tF՗^yH=Ȼ@ .$U,l^>"oA~p9 mZ_+*UJWREUVurnv,# @p x"338MAlݧ/X@~VX˗0-<...) .P׮]eX _^܂_XhK||b|0[_ݛt/l޵l2M6=;mFbmhժӌ߂xA`=?Zi+?ϢX=_ʕcb`^^5gU .]zTy;2))y|yTT{ye{.O^GDD(~ڲ_;}&Ke[oXIm9:;ɋ}%/[@R|/y{u֦&C,۾Ky, ⇄m_&@"_*M,ԷT4xtMw+΄   A,@V               9'&r4kׯ_ʏ?~I7nL@ddۀeQ6o޼[䥬7Z ב?Q@v߹}<~v]uѢEڶm 5 *S5kזZj1{  ^6^W7/^ٳg- Ҳ@-W ӧ6lJ]JVĊeѮdk, &.L˞#ڴi۫s9#a{2+`GɃ\//s B:daG~`Q`#[c{;3@;?(\g1S{%|lJ¼,`¼bךls]~Ifר뒇+B욵 tn~un<:@G &F0 PK?/nֲx&@@@2Bdm9  @X 4jsgXu              r|#]tvTN5ǵj*WV^4_n }<ɂRjUURhEEE3φڂXVa7лu뺰 L+q"@L .y1#;9YO?TӧO̙3o>fۮ];o@.e˖.% .6 =,\ [d,.ruU:tP…}0t, B-8yBz|~~NׯtBVXswƞ9gΝnn~,Xmkmd!V]W~pVe bB& ղ=+~Ж-[]j!v~'µ- xXYL/@VCzK&H&}T4ltR*Gz   jeݟ@۱'  !2F             亀7&.TޠRr~8b -^8,[LGuYuq[В A*Zh冀biV;/@K2eʨYfjٲeRk @'pW{#\_{ӻwoW]v-Pa"(;i$W-Z8 0@v[؅%uB, k֭l۶MV쵿ls :qDCDD=Fp˻6c:Lڟ#^i@ԖNTRE+Wve{]X仱dj 9xKJcmu7KzIQQ!   5f{u;D@2$@V@@@@@@@@@@@@@\ J%K8@. ۷O_~+6… eGGGI&袋ԢE ܸqc/Kz`*pvXRoDoF_ ݲe˪m۶j׮ڷo6m0tB0 @vuW^}55?ʕ+5f.j/׿t… x~I'N~^ڵk=k]wu*d,X/ ˲ 7bVlɓ'Prq éXbRx-[XYIl, P>>[/۷oOg|euUV-RF Y!d9ZyoȨɁp3兗J7( &կZ@@@ZYʺ{"  P+CLl             @ |.H\?ah֬Y={+˖- X^҂,^xrTNǎӒ%KW_inn[HCVԱcGuY_|bbb©@iSi ?4iԩÇkСLg s=+z\҈#t7v`Em?jڰa+tf˛6m҉'ܱ"""TBTl,#J@8} ղpA~~??zhwyYfҼVZKbŒe!gYOjC <n-uE@@K@OnǞ  @!             o- `8@`_Nӧ#[עE ]%7tF# sBV\´:֭z۲{G@ ,J/Rzp ˗Gɓ`zuˆ2&`O?^}U顇ҭb3V[%8u, k͚5]օg[iǻ͋)5j I^l}9aYFػw:+0/[8ݻZR%ծ]ۅ]ZJݺu  P+f@~ ߔ?QhXEJ-[g86   @ 3DV@ȐZbb#@@@@@@@@@@@@@r]୷åcrP 'O̙3{iʔ)ڶmjժݻK.K79[kqƌOsN7hW^}m۶*TP*ek@PqcyHҨQa9kpAZcƌQc"z'\iTc/gѣG//=Z\b+keղ,{.b,+ L$[ 6µ|`5i<մ @@@ ʺ>^?-[&e+[lqUEGG, _~R8iepli㏲5VrA~(]cbb\\ /Е&^ڌ}ZX@( ̟/ߝ_)!!6}͒3!   `je: P+v dH@ 1             .K;v8@6oެW^yEo6mڤ:hӧ*VXn&M &Ama^ȍ7ިiGE@ WOo6d,{qCճ>K`Q.)S[oUDDop,yɒ%7ou/ ^A"E\KƍeQFZjC<ؿ/_~.p_Ė-[VM6u]tZhB *' lg =C'hV馛$[Gfo@@@ P+@۱'  !2F             亀7^7i\?HC`ܹzGIC QuKc`B l..^ τ @APA9R[U-[wZ~^u]}Y2!o>e^ vwfbB-[绲K.Xj]P[]hKf\K ܝu @ F ^t+thymKV˖-պukkΕrʅ]"Pl .G^}U7N.֕WJ"u&/6\zI?@@@2*@VFގm@@@@@@@@@@@@@@@Cǥ0Xtiԩz'`K|tB Hh&g Xp3i׮] ͝;WN:% غuW{E0GZ &F<8PVƎƌ\gt-R^Ryq   '#ssd@@@@@@@@@@@@@@@Cx)::X{neZԸq ֭[?7|~͛o]CeDܹS[nՖ-[|ڰaʛlzaÆjڴ7o-Z|@."ɓR"bښW۷oW='|" `?뮻 Zld&O^@ҥեK=3ܹ, @ 띅()3gԌ34zh]km~RWO=%=ҿ%]sX׿nI];,N@@@Ȳ@Do  K/IFGn              +-Z$}E. ko$H W^Q۶mA ;e=?daرCk֬ѪU\Yl.]* W]@׮]AWQW@'ӧHi$k6(teP H""xNӋ}IQmI$H(Hd9KP⩨3"*gDE=EED JF2}{nYgwggwvgv4ӡzQt?(jf/WY ͲPO?]s-դ y(j*M8Q>ݻW'|.y.5^;w52Pw۫g^xAr_q\ `B [F@@|*nT4yԩS>=8V8K                @B %,PUʗy|^zfΜ+aZ_~nF5n8WM-:cׯ__:7ӧ /T|GwuP8:̞=[wqZl;ny}[n/={&m9眣Y͛77ߌh]P!ձcG]~9r,:@{O\p.\W^]mڴ?-[,b'_twd @p9~(VSFԩSo'=\S͛7{I'?ʹiJ]t;8BD,G>y˖-9\zY;o-x^u:g/1b8ôԩۅџ}li[}ho›3HHuwgy?x衇ZP/ ڿC 䜪a|vׯ,t0/ %/ͳsH씗VVMe3 v-⟋լYSvV\G@ [H{t)!Z{K+M7,Y@@@ Zs               민Dsyqv@;ηN/+Xd^|E͟??Wd>Ȏmu@&LN;MeK-ZX֡{u~>o<}醁9yX |ڴiSpە/_^|K׿TǪU3}ݧZ7nGuު[_?y俔;m4EZl`; \a{T @т>Xhձ~G}>{{`xԩS'ggcǎaèQcY-/ m֬?|U\Y_| ͷg6mU/v!Kevޭ aM?m۶-S J;DZvxZSO=ms/*VzqMC aZkmG~zg}GqեKY8… eרQ;l}y @X`߾\ xTT)*| U,hB?ƏbŊ/`z_l2tg$[![nEO<+B rOԢE|f8qze_ ڧD߿7VAQfmԁFUʝ"REZUa9Q…uuש~9PZJ`׮];n,P./ %/{Hh˴DÆ vܮRJg-׸q4uT5lP=IyrT @͚rr@N=EIBh  '   P*SG@@@@@@@@@@@@@@@ EVw};ÇXgy1vUsNm̭aڵڵkpȮ]ꠃ:`Yf/-&~}ncJE[ϴ%k 1z饗jժUٮ2{>P:ްaZh! ٲnݺUVl};@ ZQNx +p `fb%K!>|'{~Oyrvf+̙9ϕW^Fx㍜.:byZnrɂ,x%!m,O)7J+hv g%"- 4gV.}ɒ% |ze[ϩsy|!:>{(+Xt.벲mk;Og֣>--ў0 &`էn%4h-uaޝlgE}@@@Ț@tE[dk@@@@@@@@@@@@@@@@ ,P+YC wZ! N᭣޼,l^'|?\{Vֺu|ʖ-};6n胈Kj׮Fq@Pɓ}xŋղeK_^  f2:ujɶٳgx}z39QdرÇH]{^eӦM0a,:?~}q߯C=4|z뭷t=h9vc9{ :TzR%|VFa!;SN)sEa~;!^r.ٸfjZHk~GzO<è}Y&wf=V ֭/Vw޽9lY줓NgvzHrlkXXj9FYhnvݷ÷ ]ŀԬjalV>`ߞXۆov\Z„飋/gYֶMbZi{?^~e}駾gjmx ˖-ԴiSye32?oY+WTI?|u3=7YHg(}{ƾOk;0]>:X gS@IDATmw}W6Z0=x,~'9F:ugBNw)*,,ą K.9mcW_}ڶmgY&ւ.rog왔}2 (`w%r^颋K/\NO3   d,P8լE@@@@@@@@@@@@@@@j,?%:ꫯquwHtlV`YPZdw^Y=&>:zK/[!BYAu:P+|رێke2d>YfС9q3^{M{(L4a,/GƍnwSO=N:u><m"M7l>Cס]z1obAUauZm)[HڶmۼuC"9bŊNywNȑ#}։ump 5p}z@BSfΜMpc9jrwi߾W\/s=ׇ~3h)+wƌ^ik#Xo/.kPF z?SV? `v9XPiP+{da[nSO=3 sazlTR. h7тy e9|dop|@ '\ ܟ԰=~~gOC   $@@(0jT(Tr@              @ǎеF)eAW_ pо}Woz'ZCȅ) Zj\r.|*ԿoSZ5l%JN86mڴ կ_߿^~/υi>|puZ^q իvZ|d23e<uJxe6t!~?y/s $a~dɒ!b;/ ,]YxN.d,et\(oӠAЮ]ra_۹. hf޼yn}\jvZo:K u [ 5o<.gвewO=3~ j{1B4h)+7\,̸,MM7ݔ^vom+Vd]vV@"w.%Bpd]9qDoh` bNk~w-[jC%(˱v Щ i3Ѵ !iۏfikA)_χ~8-dmkץ"-ܹ׎ ֎4rlzGzp_Ν;C.\o~Y4?+ -V4 ,dzb{؅z_j>Slf&[8_Gy$|/s`~Y ]a{rYچh~'L޳VNNdْ=o4[РAT#(`O(tꩡP¡СB -^gC@@@).r(P4q                 ?;%W~A-u/(… ':\f͚iҤIڲe_|rF uRz|]*U\*S\zokηK.cЀpv̎ゴ.@.pJ5k LZhaN;Dsi_ڵ\Xxx&a7?~uیt]r;KXg/7xC.Kkرvv̙VZc4n8]&M: r yPB_'{OcpA ]p8x2@ ufCB)SE8+"wa ]p>o`mM6MSN2kGjo[Y^೟{+2e{ؾ֭+{/)}9G3s iχQF~־!^pZyF޶m}Æ գG;?ۈ(AxHi 6G\_dEH3SFI>(?=h%ێ@@@d P+ٮE@@@@@@@@@@@@@@@\j$N5jԐuJkTHCѢ)]kX'dwܡ!C[*Uhذacn1\sY8_2:NСx8dM=RC09f4Ρ-RvM`*;lp`vZ߁yaum߾>sپi{㥷l~Uα'+˭C۷kݺuYٍm@@=qƘh̙3,L{iyV)#n%2Xa~,d6'NCzԭ[s]+Ga[afXb<e}OZ-VZz@zCVKeC.ܲeˠ6Qq&x[<3[zva>kӦMiWu|־ ڪF{]#}dѠF ;ֻwoY0?ӧO4x> D U ٓaN齿M | h?iY(; ܭWr{6ʅ}JW\!*?0    4T@@@@@@@@@@@@@@@ȆjrXsβy.9g+]/pƌ)B֬Y}G裏|(S߾}Uxw~zC4Ioߜ\k=9hYi;ޱc8+WEM2"-͆Uc3;G~A^x َfsh6iobyF:V2/zHÇo]2Qw./W+}`\TNO>?@@@ _/.#'                XVm Xҗ_~瞸t}ztA7ٳÛYֹe|(itIXf۶mɐoѢZ'{mY4IocG4MWC9D7nԸq»!+VP*ffΜ_{,^XGuiRJ$Fn!\5  ʙYw֮]Qf  @'O~sfԩ[nܼ>'ĉe!6XB4iC*7g};ƣpvok֬Y֭V\^nj|[ދ7|N9Mf҉';S-R޽}`k`A?F`,XzjA96vim>ii,!Zz]SPMO˂)x㍪R^}U=s:x> QU(F;Zvm5o|8p`I˗/[S{aE:)|gݝ:uҰa֭mۆ;/{n޽[ڵk;j2e|;vM۷8֭c,<:֬Yg-̆h׶ :%.L18!.ׯ7[n-3ϭws:T>X3kgC? K_~ѭު *]W^gPl;ܜ^zYf+eީUbFVVTti.Qhluse@ @5tG]o9\(ڶ/$vY~ 6]Lm`? 4! ܹs}\eN_|E{ڛAwܩg}??@hMW_I^27܂Es)Pn~ќc46x/ڔ*U*B:p)o߾޽{\'!בu:3|?>:̲y: 7_~61—ky䑡_o{mcΝC3kmnBBguVulrAlo9TLN;vRU\8Wu ]jժFڻw/|:3  q?_ɓQ:e&/r*;B.=eb=U B.>)2r97SSPS׿69\q@ s=꣏>r!v.7db,-ws4?_;,cie˖O( y%J:X[>&gF3kF}.S֭TN~{Jk0m99dbŊb.;}iժUrؾBkڙVwMvLs]sܬzevLҾE|!㤭 iYb7K |nQ}\ڶm+ئ|P޷ўGffdc\ef:su-ۺt颿ڵk^V+cw,5k&lUTo\.p@@@@/3Z۱'  ZQ1             q(ZTzW@~Yg^|Ejժ@{D{t)d7q{3<YCgui~{u.nb6v0?3:駟4k,͘1C~*,:?|RTZUwy'ZLE9:9V_.)駟W\N&˽{Z| WӮ۶msmW3hjܸ͛j] -jY&bu4mT ޹sg:ܙV2 ZS]LF0 g,o#ށe˖Isj%ͥ({^zJWCW '  O                 @طOD}pvGy{ߑmu;Prz [:thkӦM{N;wvqJ*nӧNϹH"~)LVXֵ^ h޼yZlBʗ/zc=V;vTٲe}YSP!F۰@iW}M&M\G'|4$ӽ{j}Ql6mJ2eh~}2>\u\֩S'.]:0~?X"bV4mT ٻworδl 2drHQ|Vد.B -HkڿNP C=Tk֬z_~E5z{6D(l vaa?3׭X[v=7aZ~̙35~xba%\2vU;wVvTxD>A ðdZI.GnYYϞ=5bĈqI~Y_+{bX,([n:3}'~ܳiԨd> A`JC_V\ޭ N>Y*T p   @{j~jnǞ  @TjEF             U`C:rN8!4vSO=_ uWbŊi%/l2 2DBPL'4k,l2}kΝidjٲe] @R \j # X[sѷ~:):X?Z I +]~ %Km۶Сڲp*ǐ/6mtydzzDrMݫQӦMԩS5eUX1]{k[G}-!rP)@}]64z\tWK'Y  p@@J@@@@@@@@@@@@@@ Z%U.)\q=#uV3F<6>}`֭[H ̥wGԩ;ӧkϞ=m0qDr)m:@B2$|%0'O5j⊄s~P]p;wn5_W_믿+ ,-dVZZB;sA o>͟?_$>sL?;TLkNw:vmY~ʯWB`̛5v{ԫ4hԦM8@@ȊO͊ցu@@ P+I)@@@@@@@@@@@@@, ,Y"խ+͘A~Y,L7ѣ7訣%\:]jժ( XgƍXsҥKuii޽ *t-Hbڴihڵz=tgzY(M zw[oׯڵkG] `/lݻ[n,6D@ .|.2>裏OޓI^Z7|^~e렃JlՖ-[Yf,q)V߸qc5mԇhA[ŊيP P,p޼y=|;w~g?]b?{i֬Y8e˖C>.ZsO N{v.|tWK.@@(=5OVv D%@VTLl             @\~AVi|aøcطoz75~xmܸQڵө֭[Nc(]Ȗ={7hĉ0a$f͚>G:cU~Ν;5m4M1E@ Q.QLbkÆ 2d^z%uEdA {{Lw}ʕ+:Rgyf %lٲŇ̙3O-`~wvE4TFԠAYxMp@S@b ~8=huJ.?4iC -~֭3jE@a gƌlӥkNoWٲe[n/Ca,&kPxqթSnYV0Zp+Tg@ ݻ~3Ee\g7}npZjA B۾yV P+z+Dp?-z_髯BK/>89ωZ#  XR!P+v;D@ P+*&6B@@@@@@@@@@@@@ _-zTj\E9,0w\}'~No;رlС6m;CS\ؽ{{M2E_/ _^+Vmݺuk." Yy_߯7xC{5:4tPj/۶m?#Gj͚5ׯ&/T1-0S Zpax\xl\.X \fA2G5kc}(WL`'@ 6l~w-_\K. ˖-ӊ+d6*Uz i%rFA(H.CYFI*(]|4hu   U~ Ԋݎ=@@Ԋ@@@@@@@@@@@@@gI'$m(/CQx,hƌ`-N[۶m۫M6jݺe=>`x:uOB~mkƍ몫%\ *T=ok^/6AM|R`o -VZ5h\\@)O׮]5k֤;gmܸ1 Ppan}5j8 ς0YXF}$=D;j@q8<   =5vPbcO@@ *bb#@@@@@@@@@@@@@*wKOke-[4k,ɼ(YҼyg)RDՓk5iO-HF:$O7u"oɂ:ϝ;O-[J.ó,XR6m|jy5 @b \b]V_oN˗יgs9G]tQr)p>l'Nb3gTŊug/VgK`Hz?Ӈ[cs,L'ձk[*UcʕeN=o 1@ ݻׇ^qÆ ~Dڦi7o|@Fڀ= ݳ, F[VhE ׆!@ ,X Y/ %]xtrs @@O]@@J@@@@@@@@@@@@@@ ']z{w\C *]x [}R0]hsc ?\u֕Mԩ5j)q]]˗kɒ%e㯿pi]Gԣuz_%K״iSfS&E/Et߯p✟~1c *mꤓN҉'K*8&v;yd}駚4iT38C=z ' Rb(x\:XȖAO B{RpX}VeTg-F Q)Yȕmڴdmܸ1yY$, +m^0~w}m}K(c=VݺuaZ"( 30- B}}~,8`m>؏AV0vp4c2euN xKغunq-Y֯},kun eLD eAp]Ŋ2o {H_ϥ_o0WRk@@@D况_bcO@@ *bb#@@@@@@@@@@@@@*.n\CH`߾}`'F x>sBֱr`OUVcʕ]£utl:`.RHPDRN-x:ۭSz:n^e޽;|f`vPfc͚5ua3h *qE?^l[P^> 7HMd@,@pq/^C,ٳgkΝ^z:#h[v |r?Zy£3`[VرcGmgBAC^ۘ6B,+uA0-]4m`>XoD6ں`>Ҵx*VXz`y. XЕ}G7۷H-4+upV0ot,ОŤ eLm:_j^E>ն>uXDW}w-KH,G }ҷa  ,Y"%=tҵJGl@@H|5"P+v;D@ P+*&6B@@@@@@@@@@@@@ >*)PxΠ-5kքq~$L7l;yDd[Giu(tn7ZEAFh[gҙ{=S:H:O# v>+V YURŇczLc skkX>"u& "uF,C@Ԥkܹт.\YX୅S{p xlZpaY6ov:TkmPXmܸjҤll`ޘ&`mPk7A[~1mQe.$[oڠgg4|Ϲoy4mple}alvLlu £ӛ¼mѼW=i,x>`lަS/` Ԗh&ԖYfdi}?4R8[e%Њ%d~Q:|KfͤcM9F_?3e,@VA;dU<\O:x뤳ϖjil  Oݛ@@J@@@@@@@@@@@@@@ !=hQ\Cd(`Mh?u4nSD\vt5WȵYr.   {jW@@J@@@@@@@@@@@@@@ }ܹq= #pL 7NrYzi}1  @ \bR $iYԩW\Z_mYC( @ -F{NڻW┿qDN@@@ Ǿ+{"               !`ږ(u =-_/zO][&iŊ    @Z{x1ҍ7Jo-Z%Y؇=hV˔g5kXIV& y,pAҵJK&HK&5n,=ukW#  ,@Vt               "kZr'9-Pt-3HӧK͛K.MG<@@@@eH]J.}AJpܹ)[ HtYRRÆ)cHsD  *);K7$լ2]'@@@d P+ٮE@@@@@@@@@@@@@@@, XVɒYލ@  /.]v)To(u u$}q>:QN@@@^?8BOzYµ#%lgOirSB+Vw,,d?=* @4m*=СkII=zHSI8(   @ jŀ.                \UDrՙ"@|3ΐF;)Nr\Q# ΒnQ:ΨwQ     -S I _RZXzEm[믥 /L ];%@Bf̐֡@80顇R&_8Qj8o_~D@@@|'@V               @%.5 Y:~ i"G[SOi@@@H:uRBF_?? m[jN*WNI:Tz=iݺD=u@@ w:HziCYjZzU's*p@@@ Z]X               H@|t19rQZ5Gŋ>}S#[s" @@@QLKۥ y$ j@z}쳥*U K/yF'in $@aKyISH}hu-`Ӧ$9  #T@@@@@@@@@@@@@@@@ ΝRױLjUiHiRx`X   %PԸԯ?K!M()-_.oRR RҰa'H7'ֹP@rR];ץ ^$@ZK( @@@ #2a                ]%ũp *tiZW_2CI۷a84     :{IMٳS}T"eYUWI/$[6ʮ $@)-drpixAGT @@Gj壋ɩ                @d *Q":"YX1ŋ~a$ z1iά    @b )"u4pҢE[ok4`԰d[g%!}cGb A@ Ve!C W^oG-w~    @@@@@@@@@@@@@@@@ _/.#'@ r)h#zT4z{wU !   1 T*s4r7ҷJCJŊI?.u$+'k' ,|ẏdG@BhQW/i idbEF"L2!.@@@|%@V                DعS*Q"!\Yz!i"!C g~   $@G<y-i i饗)S$ ][UKSzQitiϞD; @t{ҼyR׮)[7ln]te   @jeZ@@@@@@@@@@@@@@@v.#@ zc҂ҩJJMHo)B _}*   dKä޽'*%!$BztwP@QQDQDQ.W M{P(%! ?kxI9]3ٳg֬\pJn19wNhmlqr DN&@"g'6Ν~zRB @S. PkI @ @ @ @ @ @ @ս{;if ]49'5Lvۭv5 @ @L'nɕW6O8#)A$[N $K/o#GQ&2$@3L ;,)߸wNk5˅  @ ЮjO  @ @ @ @ @ @ @ @ |aҭĎ>RK%矟<`['myԽ @ @ASFȗ'C$\{%^*s'[nsLrСH3l% \pAz%m,+ @4Z( @ @ @ @ @ @ @ @ |A:@~ 3o-dvhL  @ @)kFq%GC%?ɂ &CV<$+p@ry)  @4%eoNzj<Xqs?FV- @:@a  @ @ @ @ @ @ @ qZ7#-$W_b*'i @ @ښ@ ")c&zWK.I>F@&.?5·ʘﷵho\yek7B!I~dذYF  @ 0aZ. @ @ @ @ @ @ @ Zݻh>FL9$_,trQow. @ @` ,`''ݖ uW&ݺ%e&ɜs&k|[Ʌ6ͧZ#TDP`sM{.mO8"y)i @:k @ @ @ @ @ @ @ @@ **h+:%{}}-y@/  @ 0)&E1 @ @ @ @ @ @ @ @@n?: '0St~x{4&^qf$ @ @`vKKMn19Nhp9gFI 2קUB&Y`yiW-Kr\  @ aju؏V @ @ @ @ @ @ @ @"0|xá[7h̓zjҿ;'l<@m @ @ڪl%n,ߒ.g,|rUN;% .|S>$g8%0 Ә8󮻒#JWgR&@ @L%eMWJ{,2$d=W^I? !@ @ @ @ @ @ @ @@3P[ɫ2dȐx㍹ꪫN^%>LY+@/u 橧UO:FG}^v=?9'?I_>_MtM|Oo @ @ګ@jUVI<0gI^{-TDJ]6odU.}{zOLfZk%_Z{*T.>m,mi~Xx7f--o\s͕9眳3Fɺ:{#5H7@>}bf- THO  @ @@5YgC%yRlAr{7N]4eSN>T]zY[K41; 0 NK^x!9?O#?y]G  @ht @ @ @ @ @ @ @ @@ 9)r]wc_lXf6믿:~ϵ^ . JkjrjvVWתV_}~իW~32c=c9&?2jԨ]sGo-RڣGYj.,%ϯ&[<}K/7U=c9KSNiiA NC=={f}M1P:s￟~f. MU)aZ'tR|%V'?_ws_}NȂ .kTiPO뭷^$V^}|㘖mtÇd׮>*ϊ+o;e]򗿜Fպly0_InO}5{WΝՌerL +߿gô%6tӼ)ɷ~;x`v}ѣG׭(] SOu&ݬ+ht*,U_k_٥\8oҔw^)wɯ:HmȐ!-nvkZ^ @ @S`RC'?ArɠA1|2sS O>TIySFY~UƁ&481 %NhnFmu {/.L1 %NlszG ~x G6ޔ)_J;~ @ZsJ @ @ @ @ @ @ @ @`  @S°ksI'e7E]s=tׯR>} YJc=:+'xb. $z衇}=KU8}~U*A=\ޔ rl[o/թJ9o^֡AU3u[ެ6JVcYfwoVY[)up8_PʑGr%0lؽƯ9眓bU&-[oU>*if_,^GWU.zh嘉WK@׾2\{5L'xwyu\_uҥ;cRUľݮzJ*,H 3D͓[^m)&`*3OKU~/Z(l @ @&Y`ee]eŧ_{m#(W#HV]5UyϤ j_ Mcs=Kc78q2^J6lXz+jc %Nl @- t|3Ϥz~9ar5>ږZ- @tΓ~#  @ @ @ @ @ @ @ @O`zWUZ > fZ޺~u饗ڛ:XhՋVZ)v)/r>(;STBJRK-C,zw)t9s9g5ys-ǔRˆ>9AjuVV-eO )7x`H?~]veKZwA+9TfCyᇓON5gST9$O=5vMSj /fc2NGܪ^,2Ћ'usꉫSOkd˳TIy}M먉 @C`q @ @ @ @ @ @ @ @(n/O`պl=@2Kcچ2h)OU3I=tkK ]/oqN:餬z;sסC%Ԩu(u0wu8g]9gqFk4wQG;اzAFQF5YuY'7pC}o[ jW֭U-Xf\yyg궔`uN5Cwݜyv}/~17tS:C5;[n2Ao xm+lmLR2I:1rF @ @f2lݯ_c)c:z;*w>U}7qcYdfkI}` jl_{,gϞe&w,qR7X.85K=K|ڨ@{n.ߒNHZ+zswC!@ @@[l> @ @ @ @ @ @ @ @d tֻ>k׮nEY~ R&m}lՌÆ {Z/?ػ>UhwjfK.$%$ C'TJѺ뮛~8{Gݞ}ݷM*+{X^^{ tT:_и)K*u կ~Ug}RBN9t-kmȑ#Э . __}veOZu#SOMZ'W]!@ @h' ,T՘Yr-{N<2#՘qfR%ϩs=w5-gzX1)oE@){I6U`b'76۬U @h jJX @ @ @ @ @ @ @ @R`ҹs?un)3*ę(ԯ'UW]>G?Q<;l$I(%Xin9#һwjruA]lk)]vXfZ=6F_,RJٹ袋S/E/b>Iswи̻{%L(;ejW[ouXbvipuM4HxW_<#un 29mt_r +$W^93^#  @ @&GkdCM䥗R&c#$o䒩BS7B+y&Zfu֖ %10(f }h[mv[r I *Znc;& @ 0St)z @ @ @ @ @ @ @ @L+Prv]L}ӟs=K/k|͗?޷ 뫯:%lTf&Js]_~jYk_KϞ=s%d-Ygc=rꩧ4^6 ^zB%UJs16lX^0 /*ollAdrH&cFO>Ykczް S~_ցmL eRʽ?z:w]x≖{~|W}]UW\q9}g{{ׇ3.]lY~կ~Ցg;wADE t*5Ռ뮻Ǖrw}7{lfVqW)0 #/B5yzw.wGG?QK}R&-?^=oyy'}_ՄQFMҽ~o߾w٠8~=7w}JzG}{g]-A`{nc9WU5",RwGXhOJ>yT+I6RL?f].Ze[!@ @h=z$oqDrɠAɀYg O^ƊZ*{3*cFm4ѱıзrX~812N-e2.T:ЪL1 %NhU3l @] T#TYnd57u4 @#Щ_+uSG @(PT%믷i @ @ @ @ @ @\v#s%~7ceO>}>PB%XQrxg`T& 6,=YOvr3|Fiȑ#P_u@QΝ?v;S#-U͘ڳgϏoGkMb+GOoסq=.ZggI^j%W^m*9{YguߗOݜh#wydrif K{WJX!@c yˤ7ݔlzM @64Yi7thrw4] Kg9uIJ:|~Xb{C/“2I:'*:<w\#PkUJv1߀SZ @̬N'/PkI$Z  @ @ @ @ @ @ 02jjPL$:Pk&궮N=$_Js2=4eOv&o @S nQ7` ?L#He[%dke2(?xVpe+'?q(~ @LS|)?ՙ @ @ @ @ @ @ @ @/l-{,ko jK,g3.;-^|ZwmjBjFșvɱǾV~wZI^(_&~# @ @ڴ@΍>B_sNGɬ&eyYfO;ݻMG)XeKGM?>e߇NvI֔: @& @ @ @ @ @ @ @ @@>3 t*LktjIƄ-gr̙>W @ @oz* 2>ҥ\쳋:SF8|7dkq] nV^9_R'| ͇ @:@A @ @ @ @ @ @ @ 0n>H_|{>^X`%J+%ށ;kX`9̵%F%ErQIy%/W @ @@;}SQ /'|2o߿3s1G[.sι\>hr2rݻk_?-'4(ϗ.(yZ%GcP1N @SI@TT  @ @ @ @ @ @ @ 6JVmmZE$йs&n|Kj%vXRS @ @:@j o߾m(jU 78p`ե,1on}\}rUrujilq:dkjUMh+`cMv9YelsmG @@;N?8&@ @ @ @ @ @ @ @&M`[I;Q ,|rI'%Gɹ&K/M @ @`foFKk? H[n]S>-~8<ܓ5Q$ @`,2l}*$'|c% @ @L/УGjhzi1jԨ 8%dG_n\-%}tlfCs6~K/M|0mI]>J @ @= jϟ @ @ @ @ @ @ @ @(ZݻO0 @8V^9CM*9dq] @ @Z t9}mJJ2x.еkZɷ\pAK/5B6$K_JI^8y?O3gL[|m5$?u'uN @@tEO @ @ @vr?@IDAT @ @ @ @ @(f =OG{~  \{Y&w}^216&+^?M;,irjq, @ @XtѤoqG#H뤓AX#Yoae['e?NVZ)sc!j'@ @= jϟ @ @ @ @ @ @ @ @(ZݻO0hݖ|ǻɕWj)Ք,Hr~ɍ7&睗7ߔ @ @S&УGFY3$%`,{rɨQ[%]4ϲ&@-N;$^}t'G=> @:@ } @ @ @ @ @ @ @ @Oju6w'qv%< ,@z2c:uJ?<ǓUWMneƶ  @ @|S>$gO~n#m @ 03 Ԛ?}}'@ @ @ @ @ @ @ @\`Fu=g S.){˒SOMN81ANim#@ @ 0:W33R%瞛m @ @ @ @ @ @ @ @@3P[iRJ Y6K杷Ѽ #믟,HmDΚuVcoL @ @3@NɊ+&sNSW$;HsQ_"Yf|+7yi=d*;$lx @)P ( @ @ @ @ @ @ @ @)P&,EVV`^c,T7bY>z|7J{YnGeBK=H^/_? ֪R֭Ν;K.-دgfnڵk\ʾYg^U_^ӣGzinBӘw=Wɾ!@ @ @`lEIRޫ`T_kkO5o]O5ܜW^Iݶu@Ǵce̾2N_˺v}e|~RQUBYY}ucu|[ٗ9v_.ce~bKo7^7[\G!VM.0w~7Ygdݒ4YrɶJ @ @`rjMc  @ @ @ @ @ @ @ @v%PđjWmi+P&:th2lذ\y睼[{z_Y2)29exLJ9~YZ]kĚco/UK䟭'{{B]ý!_5ʾI-p5쳏wٳg&5\U{e9'681G׿&?a/%={li @ @hUQ6ؠ4쳍aZc \qEru''j|yĴYq2_n7뱷K j5%oї2.?@ê뉅[5Keu.!\u94CZw5q2^_z:L\srK{yzo)fm1<,.K.u)&Gizkre,\r衍g#$ @v$ P}XJ @ @ @ @ @ @ @L@7S:@77ި_2du9kU&_)8T&p,>.cL jN9#˾2ds)r椙k"1p2qgsҲnm MǞش$RD ?R׸J,S jl=ܙgy2|͗;9Ӿ'P=djjP W"@ @ оK$_Q-UaK7sIye,_[-Kwo6,e)nfvK0Ugo7Ö^-c2?X|UYlSJW됭xz\c gsr:`<)sVHevGKK`K<39wK;. @ځ@v!i" @ @ @ @ @ @ @ 0e%wG֔ͨdJ^kl~]&_,Y%$룏>e2b3DD5h.oih;;JYzד愧eiYeղ4'l-62kYk Y+Xu)`f ,,zJY$ʴ(.x.V[%_jris- @ @?*h{VKx YuQYv٫Ъ_U㭯cͱױK%j\Feo߾uQw/H[JִWtYf%eA/ZN`+vжh-n QF},̀ܟe\Z.Y QcrH7S~]uEc  @̔fʏ]  @ @ @ @ @ @ @ @!P&6>6*F/rW_}*!Ze)'.e"fQY/hZZ 2)bNZWa =K8ZY_KV3lAk t^Z9޽{,"YtE\/)A] ler뭍I-7$TAf_3 @ @tt8T…ʸfY+]էXYZT:UUW]z DTcu7`rrxo/'-dUBKy.7x#C G=-øJ\3\ ϬZvyEi{Q/~|'lgeߊ+j @  ˝@ @ @ @ @ @ @ @tXս{^X^/~饗 .W%efmV-T攠.6lӬ L.]ԓ[ .'4'm.o2g4[,K,D,-%\23OpKnw OZj$@ @ AJ/u+2ƺ/%j?TaZ;LϞoW@VfFo߮YfUL,t*Hgu|Y E(cz2&?9i[Au {Z>ÖKkgָ^~V]vm9ԧK/Mn%UVI<09dy_;\ @I5iN"@ @ @ @ @ @ @ @ڡ@ ֭6 6yĈyOg{V7CJpPY6|z袋hM?dM@Ϟ=Ig{Se ÇܖnKVYp zȐ!-5=[/}K/t5ĶsƤ-'dUXn-fFu5&t @ @ 6, ^jOl-6K{1FHkۮ޷ d]o5cTcB~sg))-PRʲˎ8_[-ZZp:CJ ѣ:3}]dER5i%,%tK.㼦\`㍓{M=7я?)9YɁ@ @`* ?ϧj @ @ @ @ @ @ @ @' Pk?_=O>d? C^xᅌ9L(RKmYJ)e)ub6ݻwo _}ݔSYJ]s?g}6ov}jY Zfe˷,%kf)ϟxcf%\{$@ @hN=sϥ_|:thKg*j:XnV );;F- @` 5\)ʳW_}5Ͱnn?##F[:KT͐o߾R{%Lr·~.$?i'gg?;: @' PkY @ @ @ @ @ @ @hcÇ wjcj#y7裏,=X5dȐe2 r-_?ԧZ2AB >Yqe\5PgykqySz]kJׯ_V^y庾RwG,s̑\uUcr|&ߒM6=' @ @"PB~-%@kРA-XhZpv, cz-6% 7>QFW^i k 80J _>묳f%RK-^e)|wK.㻌c 왜xb%^6SS!@ @` Ԛ.M @ @ @ @ @ @ @L[>U_z<-C=_~_` W_={wKVS!@` dYJ]2zz2ͧz{s}KSNZRe[WnwO.4s䳟M.,jv '@ @heL?c,o *a9}Cm]wjju߾}u=AO5)йs,"z})W_M k.lFN:e%+~^zteF5M^<8FVOd}Rj @@!nzj}2eZ  Sn:͞=ۯ_Ν++ZoKr|4h +ł$Zl/Y0 mp%J߻M͛ŊKaH_]2 .լd0ݴ+   Y`>5K\Nty*^                @~صK*^3-_'<餓tm۶>%cA+PT)iƯ–-[4c M:UӦM3<۷|ݺuS׮]աCٵ.,=TԻ4f$r    @^ ޽[s0M>=xV}.o7n5jUWiƲuY)ޱc[͛7>ZQ^zIjq7ڤIj/ؼVbEǥk _n^i0^@@r_P-,-" Gw-mPpH@@@@@@@@@@@@@HOʗ^~9Qz~,\Pƍرc5k,UtYܬMNԹsg/{w*(%ʜ8q_KٳG۷W^UV8 \9RQ=aJ@|)qT4iܿ!2(@@.б\qs~knV [kʔ)9sVy7YвeKnگ͛7WʕqCpE7 ںxbY {+4h67ik.pfFI7$){tR# dQ,ENA v@@VNrO@@@@@@@@@@@@@b8$o3v~"eEnF7|SWVVԣG6mT J{Ɇ?Cj7n}sU:unVTk魷LA{@t ep  9$@A8ų>c߲ZV( kNm۶U ?wE|*e͘1C_|_Vڽ{w&bu2eSھ]?6,I'>W  D 0} je͋@@, PP+d\             @-9O?_|ѯ+WT׮]էOqTR\ U4fۚ6m%\~\r"Wٿ_:pAO?ZΕfi($+@@!l1l 1W.9બ[]{xЭջt jJgh( vW_}>L`ٳUX1utpݻ_V5,FA_6L\9" dCl%)W"               -{Txbz7ydy晪Y>C|ڰaƏPL+!=D ? ԨQC]wONzjWOϻD@@@@ {n .BM4+RK.{ &r @ʕuEڸqz-UTIW\qlNaȐ!ZxqK>[n|rUjZ3'FA@@HL<\               ATqQo1eSС 3uƹnرU> \nyGrA)o/ BoT:udrO=z쩇z(׺h6l4kҥ:|1/lRVXc=V:uҹ_gcqxqw~nݤkvkn    v?W_}N8M>]-wRܥxhΝ}1/㉹_߾}^yPB(k :A{ɓ'bO9y˷؜ՓO>h*N/J Y|eAYZҏ?*SLt1ַ+W>ŝUVcƌo-Ƿ/bC R.i&M8QǏp0mgvmvsMfG^zo߾zUHkN|A,9~e˖6jlD4h+?P:pQ_x]@@@@x7Un]w}+zj=> x… ]y^r3uVv1͛Sj/^ x+||ҥ)e\yNc߆ 4uT?BH{ks]\9 2Dg}磚7o/buI\07Nz-4  @b PP+A@@@@@@@@@@@@@@@8 $RA-K$٭[7Y"ӧkذa*[lG[]{{ֲeKp 1YAK/%Ϋ e뮬\ h3=1'Cv1]tQϺջwoC˗C=+K.Ѯ]R=^TVMx ~0``^-L|"))ؑW=]@@@@l۶ׯ;<-_\C1'ϵx J.)s3n ޮ];׌<ֿp ݏv,$y7MGoed~|ѽs8sξU?~|n4'm\tdtGN9E< "  MIj.:               $`gp\,-3gΌ9ad^FyڅEilܒf%qʕ+]~q/dcYu3H{vm8qBP[O\]M4IOBdoׯ_ V;Vlٚ6m(+>H飏%_.ejE@@@m_~EV ̘1C>ʕ+݈[{˗Wٲev(ڋv,tmcY5Icʩ16ol95Y֚;wM~:kU =?K/{gOu@@HzLG@@@@@@@@@@@@@@@@ w'FAZ;wԄ &%K4rHYQ.?9sVҥ%{JK.."-_\ߴo>Y!\}u]wi{ ֩7}t:?s矯kƍzG5o<)SFOi#ݛEq7jڵϣFc{|1;L=?VjժѣGkŊٳwdrI&gՏ? $Y2X3 ~Mo&OMz?N:iÆ zwO?iȐ!jѢA5h?~*8~v.Bs \3Cp켌ڱϒ7|mW4v̘1zͪ]OXNt3%dˠAd}׿_g4B&Onپ}{3;>p7}7>C>|nn{6SjUEK^{bV(֘}lﻠťm\Ǎcw?lQ,n36m3x kgNbŊf͚y ;Q;V_V%=z.ZSN ik}ys:U(:묳Եkהk3{66m!6pc|k_۶mu뭷y[jر~G+O?׆ǚ҉(;d4琑uf} 6u1ǨK.It䊈Ic|)N>9;w@@ @5\F               I j}yXA%Kpi-e2,0ZKKhˢE|2NKiI< 0@f , %2=l_OiA1#FCj֬/TJ\v^A>e dIiFVˎ['h|"1+gDvB=WǎY+KhKq+vwdɒ>qm%S<}F͒2F&=lKؕW^oa,--VLLYڿjɲXLK$jٓnZ.d? @@@@ ~m_^LˊX"3Z\ӊ_b,hu1W_{O]wjٲ/loj[\aÆџObq?>ڧO=jժ/ҕq}ٹsg?`>V$K.[bk֬9fOZ<{~nRxŪd˷e HVv|*+e1޽{ٶmu;h<["52j Y?\,y|q Qi%Vm֭[=gcs46pUW驧}i~۳gOʊwlq۳"kܬY*&@zKfs9dd^[t~#믿>mVUKnnSҖ-ٺ!  P`(U`5E@@@@@@@@@@@@@@@` ڻW*^c_^ziI+WiڴiJc[׽)O8g:1[l׊5jHm۶q͛7{"͛cïK/qKt";S=z;xm=3PXܭәg雽[}%[*UdEY2 e8Y9CԣG߿ڭ?Æ Ӝ9sg|_ c7e֭xз>ڵk}Q9+v'XM7cWflj׮>ȟksBXQ,[f̘iӦb[gǂ>֭[c6b&OYiA9̬#{pB_D0k߭HnKޞ4\-I@@HGh:9               $]uAdE,dɒ~8VCԖ@W_}OFSOe˖%k P9S}B1cha_M6VSo۶%{G bI 9HڰbWZ1[++|d۷Oi Lі-[dő,QeG{m$~XҒ~$&X- %mYfbi+15*SXڱWZ57KBjm޼Y&MȒ^Z S`@IDATlp}`l3WkbGpmzf͚kE㬸dĵǏp ].\.\R`|Ƃ    @ [іV0bViʕY}Y]qP(_]GqjԨٟvŚ-V]lY̙3-no>nũ Y9D;->m,ZLf#ccW\zPXݭZ0U\ʤI{nl礷M/o ~ț-W#F#cs;ޱO9?7 Xm߾]={L9-]ll<6֊+{g lB X-W&,g-r~\`ٮ:hm "f徛O}.o,@@VNro@@@@@@@@@@@@@@@3/QBj0Ν;}2nݺj۹X"EԌ-䃣G#|vɓ'ga%KhժU ]H7'%tYgIӦ}g@@@(z;<_`^z#UW]]x_y啚?~J1 6SʕKd1VZi„ >ۼys~zu{sҥٳS+_DƧ#ێǣ A|bZbuZіus3:*gx!,Zh!+գGׯslci'X~,qWA`Mgwޠ[+vgcNs:j lԨBlIs{9颋~%WoO>(]v ԭ@@|#P8ߌ                AA%"Gk֭[ߤ%+c=;v.T\)l#VթS'^RYR;냗9]xݺug?utܿ>'7߿,e%HcC,D3ʱ}^'sIuf6k=N;MÆ s%tuשFA >ߞg;/a(_~9\H1_    V,Wm۶:]̆˗/-RBf\2e{zub6oa|.?cC:24X^vUm/cyohݥ^ꋴկ_?A,Μ9LN,qvXH*?ywS^mٲEyl`ցdsCіD~:Z?ؓO>^{MÇOZ:v+(7*Wsz>mqr[l>^عsK`^#vR.NQ>ͩQ_܋-/oߞr?/D 'rn&{8qNzZsi$2 xp޽~>#FP.]xwɖj 濱2"@@"@Ahq.               $@"Բ䗟kٲϟAaȢTVȖ-[ʕ~ E.UT9 <8-Yr]j往QG};'ӳcڳbZFE*8fh ,C뮻#]v:բE֙nwϱB`Ǐ}e駟4vؔbXv҄ R6Z1{8plxҊYQ$K8}tرC?g޷vOUywpB_D|1+^n`kk֬HKo 9|cƍ} _-V̊5lP˗}v2Wl,s=?XƑgϞ2ǩSqY>ռysm Ukrei8B|Ґ!q@@@@_|&M8W#cѹٗx6ƞ?,֣GըQ#U,iӮ]{_dB /\eʔo-?䓺+կ_? >}5[nrE_"W!G[\a簲_>{]w,k|kq|W`wo5+rōRٳC?vˇnХ^oٲeq o\AhXcQ;̓-x?a>B3fs֎;~L[5o7EUX{nBs ժU_9+WJ*!W*:d֎D΋}!WH_QޟW,.d[XѳB]vl餓NJ#7ٜy>k.䊧.=e+ڜCf4r܉矇t/袐+l]TiVP!7 ݛ]  `>5pBv1@@xq rn             QfϖZ/>:)yv%++ģoF.I*Ąy֟l%+n.wpEsھ}-[c9,WZ%WPKX\D*U*. LА!C[.Q\q*)DğrE䊍$ok֭rR} 5%_K`x5 v2k+mӾ[g`d֎e׮]r|\2?}3N;sm%Mխ+^zI.!\2Pbl/;ꩧRϞ=5l0Dt-H/i E`F&M:tr@@@O;J/=؟@;w'C=c\b6i̿/7mڤ *xuQYZxmb)Nڵm/;5bie5fݾ.^i{03{{ţuɒ%Suş Cy ΋f<7.aW ,9l,=~x~}*Uf6wm!;΋c[lѨQ4b-\PN?I6ϻyD? _ C2># Y?} jeߎ+@@('!             wSOb>Gqqtjɒ%0`jխ[7.&EzP!禛n%clLi\i]k"-m_m?FVXmĉ%3gz-u%tZj]ΰoKcJnX78Sy@ Bp"  b8mz|q-6h@S߾}uFn=Y>X[|y|&kq|3Zׯw]uq? Xᴏ>ҲϢE .5\tbXT8P3'\\["Eb@@@?ٿ+@@@@@@@@@@@@@@@@p96RxW^u>|;8nZ_|OZ\|nr,͛7ۿYvmLIkn=m%XO;4կ_?a,Y2͟\u‘#G_e=\Y?>wP}x)ib332ev\    G.?Uu޼yz饗|qC.cq-Zpql[%zl3}%JȊe39drQPOFWh;owءN:iĈӧJ.eK^=/摥;{OnFn)["@@FP-I[: $Kw-mؐ             $Ho=49bk^xtʕڵO8g A+Uȧ_,Y"Kińx81>pVZ1cִiԴiS]r%ׯ,m~ZNkRz]P4:Ƃ䌀˙]H4I!g  7@I=F9p zUxлu]tQZrSs6~ 4H#GԾ}|kQ ꫯgO?ٳUX1utpݻ_VZ mrcЋ} VdnL  `>5rCAq%  bQ@@@@@@@@@@@@@/;YgI{JE9}ǹsjz7zjjJ=z)D~oIm\ʗ/}^`:u>CYB q۷/"WNcFpCWmIwޙљ `$s  @(uXX誋XL?ݻwZ۷WvԶm[կ_z,Ir1$yP7oN5%JւlٲE3fЗ_~)Sh ~_wSN92,SLAH1n{ڴ^|Q:@@"|jQP+F(NC@+@Aq             'jQ %K,%;vƍYfbŊС:u䊿tV }@`5aM8'ܳg,駟^zyеe`fΜ /_^-[T֭ڼysU\9;D  @s~ʹY.^XPH5j67ikN.Λ'/-_.=t%{@HVS(};D@bVLL             @^z)\~5ʾW" 1 PP+&&NB@@@@@@@@@@@@@ O?-zOe/4e]x) hBڰaC+V,_[08CbΟ?_flWjҥOTծ];VT ΝrBJ@ ࢩp @@(Onn:WL}_k_L&(U\95jȯV`b 4a[ݣ@ .{ղeds . ?(QYQ"Ezk۶eKe-_^؝#+)#խ+{z$[˖KWAL,/%=ԳA܌K@@*|j9fRD@@@@@@@@@@@@@@@W/Wώ:(ϯv͛7k̙>}f̘wyG9wqB:'p_?xU\9^]> GoѼyR'Ĵ߈VZiРA~۬Y3*U*zZߖ7 ^|19M/@@@@b8]~ شiSJ+83w\+ھ}? jYa`=U*}*Z4ρ#[}9NK.-Z gYQB f͚"}[۷߰"EDp($}m~pq-ۺI n[s0:H[_^G sC@@\ Ғ4               '{w(V|޽_V^ZP[~aY[T ʊkٶvW^=YBQH^j* sɒ%ַ~+[lbs1h^մiSR4/{Av *K$} @@@@ 9*V*b19/^8;hƍ4+eE0]?fKZv@ hݺuZ|~G]l/e-r >}yC=4K=bXG^;vL}ҊpsO6lk͹fuqMAyHFp -+RK'KF  y!P˂  S?.}Aݜj"             @j{^}5-;2~M .LY4HW\9_X˒Y:u꤬VrF`6i0mD.u);ر7zGDVqjԨ/Մ93unON8! +`]mVM$p`   +JB:z챂1?`%m6{s1ݱ h5pY&mw,#ԥORٲ.  @dxJ@@ (hO$g}v8A+,+Vq#]5ի5rZj,$ͭ[Nk׮W(~w^?ERG߳ڵk… 'M}X-+e…CPAjX:jVDjBthHw)ٿ{\DŽ@@ ʾW" 1 PP+&&NB@@@@@@@@@@@@@ 7,M,͜[Z"?Ki-[Dv|ǎޥPBROgŵZ?[8+V@:2-k.WxT 1-IniӦ+e0#b֩SѲN2&L\>qNuRo䣁1@ Hw\  P (U mZ]zuB;Vp'ťJqu]Vc9@l޼Y6ljE~vաҮ]% >shi|@͚5S)R$G7)ւ7JP~8>ߤV|%6Y~[EN9%8 @@ >̧f߱h/J@@@@@@@@@@@@@@@@ qvO%[, h}+Vʕ+S%0aOYD(H:}PF[В%KFkcmR% c۠֯үs~QGD:u )fZTbŔI\Ӥ#ݥg.,qJ@@@@_\rjԨ_olY"=g->sE!=Pٲ\\_;0j#*U"x8p@/"+eͅEٓbd݊,xU|mEU&ޥ&!ǡki<ig}ԬYxm\jTn%m@ܹҐ!RM7I0,@@H< j%3G                +UDn-bWj*sڵ>h~.^XVxر#KV*Uj>}K$ m[|yYBؿ, bF[bLKڵ+ʖ-*q@%$1f*|K[kڶ#gA@@@@ *T [Vz k؝}2{Ewnj0{P Kun"b]5` ^[sCIu/^ PH۶m+oemŲئM܀mվ[lՊ\ʔ)Q5lυ\U0/f^Ѣ{;…zk߾M#PsH>c:u$+ղexkEJڂ>zUkWy!%Ya2@@UPv~! Aǥ0@@@@@@@@@@@@@G`b9'O驴uV_Xk E"HВZqȥH") =4/W[-9-SK XWKi%\-!fڒd}V}{?mʕbŊAp[3xm 28*U*a}X Xۥ3)ژsEՠtNI@@Q:p '׹s%O9E]:DP裳P-كX{dq`߶A5m,Zb\o/[_qҥKV{v{衇{E5G}~wsW}mi_.uz?u?K[D.#m3}NԬY~mM!ƍ6m֭1ag{ KH'X!ԻwoŅ  10R:P8#               @r -.P{$ެW^÷V$)2gd`߶+\f % ݱcGbIA`k >-gεc%KLZ"[CqIMjn KT}㷶o]stW{03j3Ym1O{NABjժUSÆ ~P\ͶAbJ*kݓcD uz^{-|}@@@@/jߗ>H..լ)/]wI;K.Lb1 *nݺ1]c'Y,[~FVkQP ɶv… qѶA=md >m\>xmy[Jd[Lc]ݛj=`?`m."}}[)_yTZU^[~0]NT7[ ZH}}k&> 3}w??>>rp“N o5  +.]'uda CAx֌@HvB.JA@@ }҆ K             @[QI#:X}زB[3(ؔvkE{  "S'~bY׸S.]Ki >#vڱjm^[2QKm,g5hR mk,afzYY"`kkP@ޏu-i5Z2+ekd$o,oH+t9GW`FJi$C'=C@@ :v?^zD}I4իcĉ 9p! DZbБ, -Y=~OoklxuvŶl?5uwqSoǂב1{;u˷m侹FX}fkd,6bV,"g{ H9 صXf92\ΆۣԯԫWx.1pp? 3G:5N.Nh6mvq%.FD^{M9\l[7?;!C_33=9F  |jR>Wcp%               ݻI6fd>%KgͣV?5z@JFf͒߇+@@@@ UҰaR&ROHmJ.['=ԣ4jI\7l\ ]voyӇdljUJ{i@iH~wg[qd9;G%]tɳZ?.U,=Ԭd~…:,%KJ/(!=@0ߦMet@@ Y(O~#               @vp2C ތ%k^>\zI7v{n *иCҽ&h7    @ l,=Ԯ]ҿ-h!M ].չTHw,`4jT8FXh/ DFuꄟ|TF#Ej,Gfp^ ;?_iÆpjդMC93|>BZ8<9s f  '@A{&@@@@@@@@@@@@@@@ {7-2xMۥٳI2@  \uԽt磁1@@@@ؿ_#$+sR{<ԩT vԤt9yۓ gFy'o̭V$知NE][.Ɋn,Bƍo>LڴI;VjZz%U+åAq㤝;NJ=Z!cN>Yz =G@Hn%=               #`JHM#p;vH_.+'͜)wAޔ@ ){N7t@@@@ VICJ5jH=zHWKoK:86ȭL/N^/&]rt/uo!C3o>[zIcm+gX J={JO C@@@@,`Euƍ X9hgモN.L*[6˷vsg[1+?㎓|PZ&<7tԻTt=O?ů-|I4}v#ҎҀR*K*mߞ    @L[H?,թ#qw'VNǿi'S*$R LII+Spp!McH@h(i[gt}=|{~Ƶp+m*ORF1톕P`di4{6j4a+UdMB'Ե4|TtҤIR( - QCSz]iJiB/,չkҶm=Bnץ4}dtQ_9  @ 瞖#               6peIDWօCK_#vBBSm@իRA@@@@<d}ŵjIIg!-\(YK%KalJ*n=puIKկ/ &X!#Y# VNҎ T*]r[{yI =:sfn^x5k{wl  j               $j)Mq$0md}4et]Rtp #P҄ /]ңJg/@@@@kkW)w-@IDAT-sߧQi5̘͛!rRҕWk ^JI^(M*͟/v4dH8p⋥JҒ T?PZL7αU+iSGksrávs4thA# Z~~@@@@@@@@@@@@@@@TJNѬB}{E i\mB94A8DW/뤟~ 7bcn&MJІQm@@@@ f͒8CjLii"JR&E~ҙgJ-[/@қoJ=L5iس'W:H㥉;Ŵ'7jI*}H Y͋RCIVݥmⱦ @@ JH@@@@@@@@@@@@@@@@ R(DV~H`ŊpK.U]2СRR=C6fϖ> EQh6    vrUsJ]Jŋ'`r^{-wyUBn!w(WNp֔)RժRNRÆ#mPxuH-pȑүJÇC[,1륷ߖxC:$i͚6v  )@Vb7j               Yl^Xt+L,pWsKO?i4yDZBn魷@ `U/(-Y"]|tҁJ7,\UC MV՚6D @@G@9@@@@@@@@@@@@@@@v Ze@@l HG-#3RrmZ |taС ;t)QB:uA@@@X.}hlm,ϸkWXk-0{֯"hca JJeGE|4sf8&>jZuTteR(mY`rßsN8h V-~GK۷qk Tz\D2DzEɂC㏢o +.@zѢ5@@H|@@@@@@@@@@@@@@@H'eKxZ`F`$u,g%}Ix4+ABϤnݲ^ci׮c)    @ X?MӦ[o@^{MYO{SNZL[}sIӦIÇ'f֭ZI'J~+sԳTCҟ&si[NʔnAZ8cRÆ҈E,Hzn𾜜[E@SOL                 \[CVrl͌RG].]СRy&P ғO'ŋg,i4o^˘    P;wJw)oH?_:"?.GHL>>D0 1#nnE`.xhX=:tҁJIkSMKQ -+/ԭteӧeǶz=#RҎE_'j  j%y                @UL+(%B!i0Mifh׮n)iA@`J3i3S @@@@ k3ΐO>\jղކ-0xp8|B:H#ߞdmAZCI˖ÒYeZ7([vTv=4owW_-߹,ĉ9HU  *@V9                ZKg RPeAX9-^0Y(U ĪJԤI{-Y/,+KpJf[6?i e~lYN-*Fx-[l[^|y=bŊ|S@@@@w>~ LF볓LWIk37<,)NVp]_FCJktIukX[=^+7Y:d}{ *3Q@@ P+1D@@@@@@@@@@@@@@@l"ޑ X5)JEZNzMcnj5n85h@-Zx"@X:wCw#4FO7nܨ 6(itpVfХdMիW4ɖ[S2eLe,\(ը1I*uOuZv~Z@}4>,}ڵkG4[ώY)Yp- ۪P+WJ*OժU#Sή)    $С]c~uaZ&GhE)=trr";-5k&stEV*zWWzai`S|8HH:TVMzw3MS\&ON:)e[M]8*  @| *'G@@@@@@@@@@@@@@@@ \Z)t][6m$|2?~ r[I`ǎZfV^#L³cIK3 9QF$4JNBSŮC y6?:mɒ%i~[t/{уjndQX [ͳ>?vMR@@@@ \.H:Ē4I>; @@@@@@@@@@@@@@@r%`ZejS6J0K.$ r(3gjҥԩSTX~V\ǂhY8VȒv UF]L6Tvm>TjU‰O-(@nJ>+W?>z۷3Z0\7o޼wm۶]ґp- {オ~ew}Ud4@@@_``~/ (ڵɂ)*YgIźEw'!}\WⷉHuJ/ 'Yu( *vB(pUΝuׅ޽FB&O:t_}$U4炣" *@V               @-5_l8etERRK[g_qƹ#~e@ 6lؠ~Ii6~V{P.{: B,  >|, 7 j\9mæMdAs l{ő͛7GaatժUS5t1yj"l|A@@@ GI' "լ)nmb9S>bY;yqV5JjT80|%OhIҤIo5 r}+>}$ǿk- P  @ 'j"               @jnk!y4ttyOKU֒ǫsαZę-[lٲǂbŊ~Rl4=Z³ljBŋ6cYTPA[nk?k\E͙3GBBBe[]ԩXtQ@@@@ @Kz[6Zi#H>Զm$z9Gj:Y[A:$饗o?+ YT꺤b-Lk*$լO. TˮaM]8*  @| _                @>.;bq'tԵG4b^/RK,QNb߈5(D.-nZx B,'(+Vԁv,dM6iwj֬3E"{> 6̲6o dz 0o̙8q~ڵL2`{5h@׏|H@@@RLOߖ&OJy@\c#+ =seATbŤnݤsϕ  _ᇥNcuf$!r}KӧKV4kGVќ ğn5B@@@@@@@@@@@@@@@r+ur&(I&0n\8@eecI5pہy9ېG;wjK#E³,LBTTԫWχeus#\ZpN!,'O B lpڵkOfձ- B=?&M3Ɗ=#o^FtAĒ   .YI'[#FXԥK%R W`[ny$[4 Ӻ2o_cpk.EJ X3Ƚ8C i}j;GE@Y@x>; @@@@@@@@@@@@@@@r%`ZKjS6CnA9Rjs6~xqB[lт Sn7ce72av΍k7 4ի'# mB<g=[,d˞3/S {WgOƍ]0e9Cf͚y   $H,}iփ_ l&=t啼_.Gz=Wj6c3&JI~~gaj{KH+&GiEY&HZ)S$WPP  @ 熚!               @.%\nR.үJ'J眓JΚ5ˇt)w;`+2BZt͛s}@]vD>$˂k;s~z衇QF*UT.f @/^܇5h@zjZJ~v)hϷg}V7ovGyjG[hQf4@@@(R ! PkO)0h85njּ}υ):穧$ŭ~#R!Śuu҅JH6rd۵@I^&MQN֭]ժI:i4gsՇ## ZEQ@@@@@@@@@@@@@@@@nV-XNr?CAR,PGA 6mO?Og̘ukઍe3g}6mT+WY}Wi׮]Bvs!$x=DMs\ڴiC"@@@BxaCc=\D m߾}A`̙?,VO9j~IO8 .=W:` d^]zI+=-jJe&{S}/>v9,,Tk$>k?.pd@@ P9"               j)Sa"0mԭr<4eԶmW_ij2`ZSNՇ~觳gΝ;UF smn$' DFOt =F>ov[9эpzHQ#  ))_/KI?g(%K$PkfD .5hp E+VPZΝ +Z\99R`]+rJQL tf({-M,ԡܻ;ɂ(  !AOj4V"               @ XV۾dlh}Ծd͝?aZf5n8խ[W-[LF:ڔG9shn@UjU~z7ԼysYP̲e/AC'_~jӦ aZy4gsH\ .?T7jKü~z|jҤj֬.LcǎՆ @@@ ^{MڼY5 sWK*;I+Ҷmfv>RC NZ@=tᰥUR%!˗˽+ר!}\߳dAnQu  #@V8s@@@@@@@@@@@@@@@(D ;bE8HeץaǻwaZ:uʿۦN^ztn-裏еѣG#G[n~n0G PL2>hoɓ}'|+ fU쳏:t'|R+W,ڰk@@@Tx9/ sXI_^Az(Z\{-=қofRBƎ~[3IR):u,LﭷUղ;C4V@@*ha               .eTtB7fͤU.;bٳg$P+ TY4|OkVv|%\3g_՘1ctEHډ什 R~q;UªUYN>d믿@@@ ֮__/vM/ٵ+uRٲGMV&YgIݻ˅KvQRWS%E]H_8H֖w$Wh i͚oeÆwI#mZu  +@Vw@@@@@@@@@@@@@@@(D@"!% g-͚.bZuرS:ꨘgعs^}UiFvp n={Ԃ 4o<}jٲ+\ 5 @TVMݺu=p-VXQ_~0ӧ,Y'   &^nN˼jenK|S KX֗_~)W)\ƜPA>\cCFBrH>TȢn]g'|(u,Q5  )@VAo@@@@@@@@@@@@@@@( k*SHAcpYFrRj嗥gʕa\2~xu)-N}qٮ[+XTݺu5iҤ/ ƙ3goWǎ5x*[70a~gyz뭷{2b>    Sk'Ub?3/ZE7yK;N(OSOBLZ:{+ ڶmiӦ?ט1c|.J)SF2D>]oRjTzl/_ܿO ŊrMp9=#馛Թsg]uU;>.OksC-?פK>Wa#@@8 P+OC@@@@@@@@@@@@@@@ lBV v Y6 IT^sܸqSZjǁ> 4(2G>)2#Np >PgϞqR/_ڵG~p[ij//^3a 7kƍ#d4z'x^&ᗃ> *5p!1B^ꫯ_[ok`֬Y9rd̻.,s~jၷr֭OAmD*6g3g_y5o܇%R;+   @ \H:d}l ԲXKtOQdW_zRZ^{:Pr/wm/c9&sƃJ`"Xׯ_NC,Y>'}E";=[_TR鬳$TY!r"VX;C{NuIw^{{z:T42nJ҄ W  I @VD               in%P+H1CjBrc qJ(:?^ZlvGHNA ~s1V {yOcƌQ5R !ZkZ 9iZ .͋~* E#B~Ū\iӦk:裃1M320h[0h,kݺuT.*UaZ}ΝN͟?\i?(   d"`g}Wڽ4ɮg'-[Q=%X {Q% }Ōծ];_w]b^z)_w; li~`ĉӧ?x[s8p7f_dk}$}ta'Lc]OEuMܹS#G:v}Yai\잷ݾ;<Ӥ_xBrs(  I&PI&Fs@@@@@@@@@@@@@@@@ ,Pmew4`tIsυ8-ZmqazZh,XľKp~Go^Vk_~EW_}:Hlѣ5i$կ__{or>+WGr~ jaNex롇!,6x]dr->$?۔-[Vs4hkF:uC,X{Q60jtp 8n8_3?OիWGќ9sTэrףGr)';cC=4ٹݸqx t#R>SZp.Ruݯb=_O?H:u|+jw 27+_~,\.aIpdϘuW^ҥKuov7W5M=?\g?xٚlx7eד=3zcɞQsm[{>۳ߞY͛xb7@K^zdY)ݗXژn=~~^ӦM, Qj5kfY g}cpD9{@@(\ ڝc偭Oފ ~W ~ ./ˬ/OnF24h|;駟|?_|4!~J)u?3iZlZkVmΥ]7^x tsnKVVN,BrN8A}tur}r>A+s?<%1{ݒ{d'jbl_϶.N&Ж;#W|US=͓^/^gA[.Evn,ה#f%KdAuҿȏ{7k;ѡ^m}wl){o«c^mE9p%H{-rբ   6*.@@@@@@@@@@@@@@@@ 7PTt^¶y7Pfkת]v~K /v#Fp  ˱/؇UE7 h!*6@n[~ .A3XN4{lu-mܸdӾ08}SPܳp?PǏaZvΝ;\-D˂[,d믿Y%٠@-̯C馛daIݩe, (Y`ya2άέ]{O?lG&9? ]?W^=?̟?߇ʵn zB8/kѮ_ 6:\.;Ǭc9BjW-vt:'73:,FY𝅒YOcŊ>t﫯RժUe=n-'rSL s쳏~wqC ѦM?Ӈi* ;ލjvZCl_Y]g gvm\ =,@ОV/_5kȂgΜm >z}mmׂlv-D,z+Xژn Z۬}]Gks"-0Bn8C@@@ Fec;߷jm߾]O>zltǎaߏ< y%7egѳgOY_N~wM'x/||L]Jɳ{]~۳Me}B֟df#<ҟC 1+][N,Bٝ#{71c ]tU {_!e]siϺe˖O=Kh,V˘k֬G6lSY?cםQUIW^~_h]XX)?k_>B?޽袋裏f͛ 6HMe7l[ߢE|_FwP4ɽ#{/{+X2&'&tƖ  q#(  (0|x(>xv             iӥ (7L3(;оB B3gݡ![nO>SLqׄB5 mݺ]owuWʝtI~ w$ʕ+.t(Tx. yꩧ<_rZ 0 rArn` X %? =˱욷WE< 淍^?yﶽ$m㣏>t`~ukO2e3ÞY M6s:}}zn@PJ"c9SB;wAzڌZ׶m[_7?;ڵaQtq~nP^?;Jvڵ=hРȮbicd,TV>Ykĉ~ ZL3?Q 6,TVD~J{ժvA   (Pra]ڬu{?l[_J6m|_E[z~vF}?7b;Ϭ".]r?.>=~Ie^dZ\M(6Z YYfwm/9wߔ3H]K6K3??~ FVXߟqؽC?Kh,8!C;9 X{*U*zG/xX)^u[ Ԋu^Y޳0c%5c]yѫ~_X_3l];}_{̿|s(TD([O U,2@@@@@@@@@@@@@@@H[M)]:i0 پ]V]'*V,!8ꫯʅM N:Ph"}7 %#ߣ4k,| ^xAnL" jРܠ~ S%7\Hd]7\>cZe_/%|#ƅD_91B-Z g͛:S*U4gdz:QW sخc+v ըQ9/[ϟw7HyךmcXq{&MlUVi,r?r,̤5kꠃ HgvFV̇/.-:D-8/nJ=;w֘1cs'Yj97`<Ȯ?8ȹnܸqd=;.L.\P=_"+fŞ,b߭n4!k3kñ %/}#,\0ի'/t/&گWN\׺닔ڷϼG}f̘^ON ωl`};v}OZLVvBCEv =@6RI'YsFzK/M6ɅGVtapK yw?fgl;Ϯ_//˗/zƎ# J/̽j}I"M"w.U^00֯սkI,u>a}M6޵A.+ۆ*Uju2\_o׮]{_W_--p{{THgGV{?,M,{lV# Q@<9               ė@EnPភ~SZ 3>P}Cr~_p>·:,|~HXէO=9ɍifǏ6έ YSu~}W Ap7x,L)Xl]̏~֍F5k֨UiԢ}ʬiD/9 's2*-u^zXX{~[s8e^,MXژ~~߉ŋG`~"NmPj*)   3^k/󷅙X X+ o$8vF3wlu5jzꩧ|?.[۲W ڟS ^|Qά[hx-[_;n]rĕE_[ `vȮx+K&vUZ5Ax,}3gΌ9~33Ԑ!C;4 kpV۶R.R+H@ݻ+W}rA_PS{'bwmcfvM-.}a 7jӽ̷]ˎ~ZY 'M&zh얝  ZE!@@@@@@@@@@@@@@@@@ҥ 9˻5HIfIvyaAlK0΂5koyf=z?ʕƍ}f%K^zia7Gu~ -[ޓ"@һw=zN9 P9I:uғO>׵#kXԭ[W7paK2;}QkܵkiΝܹ,\m)Zjzg26/ z?رm0=8w8|pgl~w}ڹɯąԟ%X~}47}G߱ s1;wnFKѣ8ըQ.U]_~YR%#[;C۷+:h鯿>~Xb 'N{N郂Z?ʔ!u҈UWlJkׯ_7lOV}AWv}ݫ֯ScuB+LS~)к4{t%RvҽJ˽s Y]S>-w?SxV'{bywꩧgϞY]S7=V^CF/v%>}Uʽ)nO>Թ[! r                #@VMOv.7gEel 9+6Hht/UlY5o<e>9)o݇}N>]7|s3Un$I Ҳo?k@ .iBF~76o<ߦSA%+Tqƹh-]|>d)lO$tJfvڵ?/رwU|-?\( ~U >kłŬص[N+X]cy~XI5m4ߚaϹ?N\#SfG6k3kAg\v͈<6f]Fj?L ]vm?xvDn$[H/(D!J 3    P$? 5lۡ-dԟb$ Wr7On y;^d}w3<쿯_%} =nUQY.h,Wa#@@" POG@@@@@@@@@@@@@@@pYE.eoiJ:7 r^lmW1 l2-X@z ¶l yz6`jm`j"VXQ&LpnkF]vuƅGA,^OcAZ+WV:u| -R+p 7n˖/_ 9|pudQC=(   @ $Pdɒ*WN:$okA]F}"Զi߈m]E~꫑>;auq@XUIϬY}z̾vXˌ3tw .׊Xs,VpeK׍70+ۏ7.AVN{%LK.Wu+yW a{1%,q֭.XD3rjܯ_?wlχݻYS'DjiI.ЅI. Jzu [ލ嚺KO>??>kziF_|Eô5ep>q%.?`VN|4dH|VWrtirn # ?ء  >5              /Z4l~]CBJB' K>8vs\'Լy0԰aÐ "[`6c AC.)ZjZhQ f G M>=U.+Bt~]Qeŋ!Gzz'#w9C9YtYCn0H s9SO }~ 9#v;!7@d 9^:ujܠ!7έ ~:UV\po]㶎]5k <8#߶5>ln_;nW?υ\xTDY?cLڱc uw}CnԐ *}c8Y{Ы=_|1d}{5̙3qݠmݺuziXڐuysnذaez5k,OvB{kƞ iה >K3Gz\hr-dcCnl_Ffook[ . #OlB.oK®۷oev_!ڴiS /#Ȏ04 ߖӾY)} A?x_!w#:/W]uUc?{EqZ轉B X(bA "z`==O#6DND JH f573Oyf{ϛY}~~Y_H8p EM<G k=7{fd;}z{ƓSy+~޼y3ok-ZȴcYܞcl9frwa^[6gڳEVtϬ3WfС]Yݛnn)c̙u{mQʕ~}35aZO?KT߷G7LyQ-6͟YZf'gMa  @Xg aIYlC@@ F>+wre*X@@@@@@@@@@@@@G믥˥yXJ2OBBYh/wXrAr!ʅ iܹڸqwSDT- r}['l$7\ݧ\^lذAnMЗ=g`U\ylݺUŋ !:F# &:XqI(Qn[ 0@˖-SϞ=uUWKnOG}ߖ˅`7#е=dzFv7M+%77rhMX6dp!]rAKk#ɅPeOa`sar7I_%P@@RA@T@@@@@@@@@@@@@ >\IZVnDjY2nt%rNқoJm&^ |'nݺs|?|eddDjYxNN5F16dnr-nzI߬Z pc/0kp~rMV˩/:ܿ-[h̘1z׽p@ O>r<:&~ք R@@ZsAwa{>haH,)K;3 ʞl28pc:X)=]g @ÆI}J-ZH#FH+-g_߹Hȑ?R:%'@ZKRD@@@@@@@@@@@@@@@O`Pl> ć+=t9 /HX0ͲgIĒ%.]:7ha7Sg:{l/pw{ոqcuY:3 Q^`͚5^-[@rʩZj*sqB'>e/9N,Pkݺuh&K%^ǂ 5%Zm-T뤓N/=zBX+ܶr@@-~0RQwƍ;1nyyпs1FaZ˞3_~Ú=\x7!lQryv_܉Kj>!iF5k x/Γ4Z>@j(6rǏ$=3V?ٹ ~XrÏ2%DxݱSZ^J@@)--@  NOZ2vuP2             9241A,|,\(]t4cIW\b|YԤIGիW/Gvޭ &xkdUVM]tV zQF>jvR߾}krkѢnF;QbƎoY,G5+Op2pS>rvt3Z˒˗Δ*o}  Z|\J#͚LJ|R 4H]w]XIl}̙Iᅲ6B:ᄼuBG.p cR{4mt9+>c.p [9_o.7zuhwtPV8[f|ƂRywv[~pq㲿X~ZP?uoh  *^ߧrrc@ظR*  G@=              77z\K>y'U[RÆ(KH`.1nѲ`ɓ'{UuutAӂŋVغulͺ/_>KHj/$`5i$m޼ &ڵN9ٶ\rI퐪Z:TU  M@yt.ٳszc+p rҏ?Jiiǫ  oٿ /P7nԨQ#)/`C|eiHڶmF_ ʷ^Sv.]]\L V cZ# "P+A0D@@@@@@@@@@@@@@@ Z`6)=[]nIn9k' nh9 4kLyڴi _xW^yEܬ5jP6md0j*U*>!MQZaE"믿jԩ^~w.tT>:ՠAfG 33t5Gk@@@ .{Ge*OE-[^0 K*5o.=t=bƌ:s#8E^ ǒnE?_zٲu֍0 qwCg]n)ib鬳e*@@,@Vɸ@@@@@@@@@@@@@@@Y@άYH˗K#GJgyY\@J.N;[e1&M7|&|H֭SB-[-Zq*W\M@vޭ &56mڞlذ4xUWSFF~ep J{L@@HD$fS;1ۗ GFugH͚͛O?cY}=xt1%K$>Xj{\Kb}ɍI}$7*#$-M:TIr7'UQQ\  CbK                [ nUjJ;VY3=_:wVZK oӆ ?p5mTM4>hխ[WŊc(ʕ+5go^3gmR47}r }޶yG\$,   @6mJWmd^wU r/v CzP+<'{eN?]KɶۇB;,ZTʕ+k̘1jL|=$vuxqvB)lEL> D,@Vt\               (mZy/I}& $g E u,X樣?븅l-\P~mz-=CdEёG zkU^=o-_|S(P]vyU?~G͝; Ѳ kzm+WhY}~8`)f-{ȕ_BV"%چ  @ h=W_Bw[2UP!i`gM}IJTlYթS'Er~ ,M"zԦ4ztsu o:Դih3cXQTI3"m+wcQ@@ JjE b@@@@@@@@@@@@@@@@ 1,PxhKbBq㤎Ŵ-3uV͛7 kF hǎ^GT'\˂8/|˶l&?@ ݲh"{_~?,D+w}ٳ4hzySS  !`Z^||uLp 7=GZf̘f͚ɞ @ZĉYg5?Pj~u>}hƍ*S'p$&K=zH<YI%Q,Ծ3tҵJ?) @@ _j勏@@@@@@@@@@@@@@@@ ,P+==ZX_:4&$' @qgښuf]ppc!7Zdܹ;lٲ^uծ][~>k >}?,], ̲;Ɩ{!uBի'cA ~VB(2@@@쟾Ŋw.g}F !|->W_-)]v4}wߩm۶Dr失c /t N?}wqoسqƹ777ƌ\Y/gˍIwܑM  @JN"               :[u6tҔ)SOI_y-Ppa/#t ;,^ _d믿 &^ʕ+4L2Uj֬;,ǵ*ɂ˗{Xu=[7TLXh}X؞}tYGqo[BqH?P+--]    1aT qqY@* `^~YjX]tl#pptw$ j ^z{M*UԲeK4@,qkL]z`jgHO?-psXz\@@j7@@@@@@@@@@@@@@@@ ۶uKU6=ЙG(Rca89-[l-Z$[-|Bw.\ߴiӞKK(5jCo[Z5M,iA_, }7jŊ{ βp, VR҉ YW'(cQ=ڵk{!ZU/4R(1Oj剋@@@ JŊI;vD0IJW^:v OSTJs¶%  k8ko[Xnꫯ=^K:X/O[Bc*pBb@@| O@.G@@@@@@@@@@@@@@@@M36gB (,YЭ~ȫdeddx끮]~lٲ}z,gԩ^xl/-SR=[Sre7 e=k+V$crZfY^zϾ[r͛71,;?让K;?-`D P+C@@ 9ӥ,Iz{,Q$ bIL/^ziOoڵ&f#iUzHnLCi;Cͷ@_sQÆ|yS[:u~88ZcҢE9H|#խO5B@*1U}@@@@@@@@@@@@@@@e؄,!y .~Uz>6 ˗5:h'-xkŊ94}t/ Ȃ֭[L?5ŕj@e˖B,¸l}[+TϺ-SAśC`ǎl]vl۷tG>y{Ug-@ k@@@braq&H%KPjm3)ni:i(!]wu\ڥ:٘رc Ԋ_Νƛ-vfg9 :vN?=冹X@@ @@@J@@@@@@@@@@@@@@@MFV嗥o7f̐ԉ;%#@ୌ\sN/XȂ,`Br Zdw(ڲe~e.\Xʕ. ޲t1[K,)#`?S6mƍf=hÆ ik6o޼[B7?k~qβ -, wz~|X@@@ /NVܰX҅uir K/zN<1eNGc(p5O/.]h̘1X*ЩԲoǵ|UfCO| stKEHsȗ)# 'X$j\                +mTT6/. s"Ji0ۥdS I*PXZ5oKo߮u9Yo پ#ٚS߆4,Y}o_nfM[] +VL-Zھ⒙;vY_[]em}{B,;bQ?Ͷf~1[+Th[;>S, Z[q&  DO=C^y<SJsHŒ_,!#͚%|/L _>Oqz{-u͍^=s /`t;?U.}Ծts4E@D@HԸ@@@@@@@@@@@@@@@V*UJżaSH^(X"}Թs̫@ G $+ka]Z˦Mٲ~Rm& nZfA,BXR֠- t:jA\寅 :?ne߷ڂՎu׮]ܷ;wZVY4$]$m߾]]v7Nݻwxς=:u V5^]>ԯ/tSOk@@ ;H@@@@@@@@@@@@@@@@` J\ Py1鮻N!CU 8 *[ƪJG@+@^ @@@@@@@@@@@@@@@@ R1PߥK/Rz[BUf@ dqQ/@ u0C@@X +'GJܠ iSh$}Hv{tR~?Hǂ@4scԫ)z7(2*Чt=s3ۥsCS&IU@@"p٬,                @l*'OrرRӦ…Mu뭄if @2 ԯ_MfsdA,@V@@<ʕ;A`)Hի=^p,h./ Nii0.TzKG5`@f0d,UJjgBgAK͚IݻKV@Zg@@@@@@@@@@@@@@@"m[jj!vtRRV-@hР͛}S %u  $I1ҥgI]q\X+J/ ?pc> Swݕ;]}(j@4wF+&dA:K@@  A֗@@@@@@@@@@@@@@@@ 6Uq4͟/k'=4xkR2qn!$@ J;A#H=ݻC}&P+==F@@ 9$T N$ aPA=ZE[*`wo+5kz5#ppk|P`>}5=_vJTI5J=[/^R  j               $j'e׼NYxVL\0y{K@rhР6nܨKv*#Q P+  a T,)"{pZ "]tTXw5;IEJ]] It@RJ 3=n8FÆIo) ~r@@ j.F@@@@@@@@@@@@@@@[` ڴ)ep^Y8@ I,P˖y%i$Zzgh  -&U&[rޅ'@IDAT7O?O»Y\9嗥ߖy'[Jۂ*=$`@RӦ35u"YwK(@@s               I%m[jM.h!-%RbIu  @+WVJ4wK2@ 2"s*@@ȿ@…//0dtR˖ = XX͕WJ^+X PƗ^N:I: iOiz魷ի~^{uUWIzIg'zki  Lyh5               @?; jVYS{  s se*@vb64F@@ coAo-̰xB*]Z/D(R$TԭfMؗrb>.X*Q"jϢ 򧟖5:KZC@@p                xYif)=}j(Θ!U߰TTpjte'H'/VGK@x XּyY%u!ڽ;P0   @|ԑ}7T̚%͜zޯ_|Bm'҆ $i ,t4tt嗥֭ƍ=+1Q6m3ϔ>L*^<ܫ9/R W?)Z.P=H?\ $@VN*C@@@@@@@@@@@@@@@@LP&ԞIxB_lr+W7NX1髯mʹ@ׯma@ v* ķq*@@ҥҌrҊRš+P EF`S'F4AnnQ:}7OOG%P+@Ҙ1RvR[oIii9ȡ \{K=zDVZ(C*D@VP!               @ }v;vH;w "E=ҥ-ݻ^o:wڷM Jx@@jР~w_@ n~V!f39!  kJ'(-+լ)u.}d-ec.s%EVƎ HS?,U"'!ς@~ܣunhԩ#vsvӪ㏇BŴ@CO@@@@@@@@@@@@@@@rsx#! zٶM:di[pt?@l0|( Yoye=> S?,pVC   +J"mڴbv75RɒYg%_Svml4KBnĉ _N_1"q}8W^)}᜝%tԷ4cF⷗" A P+w6"               @ui&UK!z; /wޑ5 MM"Ƃ @kV%4wp/<@ v8@@@'cRѢSQ1dԳ3dI`p⋥kׂ&M8GDફkzfΌɋ@nRK/>ڴ =^mu  @ ]                p@s??HWK驧BO =hhPxyI]$M*5lXpf@` )##C fh5R@@6  @ ;LN`ŋKvK ̞-͘!]zi5U{fdcgas _RҙgJVEZ ׅ#`^}U1s]"c}6Lr5wWN[~چ $ZvGh               I(ŧJޓNn%>uR    A'띥_               @2I'I'/\XI:ЂiP O*[V9S:l D&РA͛7/ @bmY@@@X ,)=S4iP~"ؿE_]%B;iCEJcJ;~g̐#4b4ytu4jb4K-6^}C @@ ;G@@@@@@@@@@@@@@@@`yݳc*^y垗Ґ!ΝVkdkR͚+@"[.\~_0, @M   \tԢEH.k%Ə. j@wS+K,=dyz`{`A ͛K<͒)+WHcH˖e'د]_ji`# %@VAS/               DM3$4/Rd jYJGJK˹5rK9Q@"`Z;vBr" ߳65    /{r(#ccJNCVPKλoۥV,8/Rُ R__%,pRŊ9H'$!7  7                UHm .L*V{ƍ}eouIsf?k@&pQGyy@l&8.C@@hF%3S_6YlF.$Y{HrٳSN;gazG"]gjזz}Kzԣ_{lK, ^=+-@c[;#  P+                8<&&5@Z^}U5Jڹ-HKoݶ, D*P|yU\YjE*u Wp^   @{l`{^^˥x}B.0I/PғOEd}`|yDJ ~QNgW=)1;mۭ6\ 頑##so6'fh1ŃgkSžcllGTRK0{NjLG5*mR+-曥wߕ.8H-<#M&OZD@RQaT@@@@@@@@@@@@@@@lիWkժUv͚5ބ&?~}e(&:9]NX5j|uj2WB!\yY_d~? I7s[]U\9o-ZeETR5iڴYFTR%o]TBʭ>G@ 7uj….qLr}ȟ;=ep5   ]̙sz=Xd/^+Vx95 q@hQn\`5333iӦ=A;e֭VvŞԨQCjR͚5UN5l[322TdITqxu鬳X)UY¯lV1CoذAo[?Dr[,¨l[R3Wz.j=u,1kH?ogTu?ǎ}ٷcn;ʖ-6l[gkI/  ֊}SCҩJOjY(R˖ҵ׆>Gs)  wq               I%`-][7-_\}Bl;x2bUX MfL6n 6.]۷ln([m&RFF|elD~6Mi[CƏo-^p}&[^)SzfoTZ[9U^]&5P6  $=L2[N~A6NaXQGv=S1 {'G]Fwڶ2=  @?/UcW%# ))}=Oi@@@@@@@@@@@@@'\[h.\g !-H&… {e yIMVR%$x,׭[煒D6A2;_l;̛$&Gq7.[@,BGnݺT'?3X@@@ LOp{i֬g¼"N~~^(BZn͛aÆjР,<{h΁4l崴`>|͝;WsѴid`˖-ۡCE't,0%z< =~d,k cDI›l lgV6Ƙu s c1B/ mkAN6nu;{Vi!X,ؾ}ecvolu ?஬ 6i%gˌkL^xۨQ9m iytm[.S8Qj2(  ݿ㥎#)!u!P+u==G@8 'hA@@@@@@@@@@@@R\4~=Mh |e ѲOfYR06)Mv}BD w5TR:#&Wׯ oBÂ"뮻t7d3R@G^7G t."  %T Բgޓ'Oȑ#' Y*ZڶmO{^VP[,thʔ)ogiƌ.+S׮]u9QFQn1.L;BSW!=ߺuZ/xㅶǚlnݺ=C .ٸd! ̎jY/[ G۬[KB 1:u<#dW0#=RY"}j3_v"hC"\H\]"  @4Ԋ\@@K@8 @@@@@@@@@@@@@ L 6~سΞ=[s&?")"̂%mҳ%JY%;xboC L'B駟m۶yMP6l>ڛӶ7&h+Qo,B$pqǩE8p`J@ g!C$g(   )*Z&M;CÇ{-u駟N:cǎ*UTb:m͚57n>S5 iҠz;{^|k-hU+2寱dRY~WjcEKi$ łl?pժU+WV2/SM`Zdfk6X*KRjUGgdd1 MLwo/s~Blj*MSgAղzX8GrE@X n/J@@@@@@@@@@@@@@@+jnҨjw%KMh!I]tm2 /U&*}"mKN8&͛煭Y۰adRF 5k[7oc9ƛ41{YFMZj عS@@@ (k׮uC{Ϩm O>:sդIt#_TeZ~KPW^yE :V\sUD|Օ*tQi^pfΜٳg{9s[z CN>do mXb|dg˗7α7ʂl? >co5E>w 6ưmKEeBr,7\.LLzAᇃڋkq}gIZcGur#Hޛx! )#PDtA@@$xY+t @@@@@@@@@@@@@ ۶m³&M)S/^[vm/&:u(---R@,[̛hf٤UTZnvکM6*SLS@  {&Q $wK| e6&!  ˟5i֬gyo?]Ȱa\nQ]tE+բEWƍ /{OJe][oUzh:r:0+Bs:`k.YXִiӼBll?:PV-/B,ȶVP!I'i&/H>sV ~[`7i5ƹwCV@[_Rrv+ A" $p\8ԩSLP@(@UU㥎 !@4  P+X"            žk7Yx}Wބx۷oWjԶm[/&kٲ*UfQO lܸQ}ɓ'PBjܸ?xp nB|SAw@ o.bmٲś:= 6a--}  $@2jY<#Gza>7|.B/,*q%lOkպ] KYH˾.L' dzdo|hN3fhͲ&Myml-W\2u$}-dl϶Knذ{vm![[m|^zرC.N:XnYryҤIrnjw #գV,! @M P+r;D@ P+,&NB@@@@@@@@@@@@^`׮]?[mߎ5tlYhQԦMթS'-`b X›,&ϪMإKu'vGh \r:ꨣRTn#@<nM.$XxF  $@2j/_#FxA?tg+---9nRzm6zGtR]uUJ*ũ_WBOO楅0_zc0&Lвe˼pM`c-ZxAu Kќ@ dffj~m|ʔ).}"gڵSǎg*TϞr}ZLx4A1i驧|5tF}pMOBU# @  P+r;D@ P+,&NB@@@@@@@@@@@@R`hرz5zh[ ܹ:uMĈIy듪S6mĉgy̙3UD 3|gOWʕ^T7 @`֬Y}/f]7X@X /-T@@r@=zGTfM=:38gP`ΝzWddve۷KիKw)Ys LguX*7wqj߾ w#}͚5K&Mr_˂L2:ԥKzFFFu6m>e-U˗ԋ/}~F-138 A P+;FVv\ %@VXL            Z 33Mj^y*ZN?ts9֭J,x$sN}8pK/T+##CM4! 6hݺu޺vZXBWM&/eժUKuԑ]_^=o[͒@ LMza=PWp w~EӼ_  @ﭷ-AY.KO^ziٲe:t7 /3*qۘe61a1bVY[lSO=[9*T(%#@,n:qD/^\gq;sT  @eb-h„ zgfl oQ_z# ޽C!Ε+؟oasÇwA/5i$mV\rcc, ??]{K~}9Um@PQA@A R, b]? E.lUQE)DDAPzQߓ7I6l+{S].]zr/_> Z؞_͍}Y.ŶQ;6eYfwi.4.D@""@VoTH@@@@@@@@@@@@@@@2K`@^>bذa6g馛ʬ#.%\>#[r~>XKߙxZjv!۳>kSܬak֬;s(Qn?)}ӧǫ @ԫW͛1 P07*U0   >[o'Oq>5>uݿfGaV´֯_ou16m̙3}+´'~%f~~Yϖ/_oqÕ.lܽ|;e>{R~ f\q^}x_d\0  ⃀               @m۶c=f 4p}ao}>hvs4l.]ؘ1c䫫V&M 6 L2֮];klԨQ>>;x kѢ6x`[n]fg@ ԯ_ߖ,Yb7P֎;Ԏ  /pW؄ }VZ8c6K>I{qfRxze{Mh7x-Z}QkԨQi(-A jԨaz gO=|hٿ;:'hVEO1'8$s6s+nH܎}>cr@VV}G 402e;+VXxoK-L}r;^"<?_.eq7+-Z}->MmmذavꩧڹkoV^vGS߱o݇/p f%Dq 7k`N7Yp\2_=^z|yuޫ^{&n[hGnܶ!hWW?Z%yL!P+3yz  P\tDV/b;k7sկO?N?t}#+믿ovY=|xˆ "wkoָ\`۶ms}FtVB 0X1ヴd.ҥu=Oϧk_~~ŋ 8Ɛz)]8%ybٳgOu.?V\|yyf6#h 7o'{i]^}/vݣC  @Lb@@@@@@@@@@@@@@@ S8 #k ֪RJR(矷Yfy5 ϭ6W:9zh?BԼys;$l ٦O-'cx; &frͼziFr'_|ѮZ($LaCs̱;P뮻.y|$}6s*uF-^[oU}l2B_*uGkOmi]q4VmQDom&c=^3rI'&S5((YS[Sso裏7j#ƠG}|<>/-[_wIRx 7Q>1c\-ߍ{7XZ#2INuid}nmE/X_]vvu3-Λ7/Ny@ Ytv.#  PLx3Ϣ 6cMVG}N_k/S(ԣ}wcFKov)ۡ+VafFI&{;S5JZ3fc_pٳg1mݺ,zC{/Py_-LAx_~`믿5lРT<92#;}fwemʔu  yje{N@@@@@@@@@@@@@@@h2s=h7xcӳ϶/=ǨU]p>8E(XcFY 駟DGqDСwy1/>lX>mQF=ΧSxSܬ RS8o, {cvk֬i2Wbm&-;ֺv::oxz6!GO<8[p5hԦ`Ⱥê =3!ΓXTh۴Nv뭷k]n-[ZnK/utx펬SΜ9zUR%kժxS`USh}OM8n:SV/(*M&vgGM,YOXuMmա _/_<ϩ`{2V}y٦D{":KN`F6j@   @qX~ zjׯ)p^ZޫW/Ay׬SN`W^y*Uʏo#|g}N;y䑠 jfe˚u^p믿|BN\k=ƵnO2ec:w#7 2;CsUԽb?YXu{[ݺuM!-Z\|1Re~~ǦƢWכulosE@HF@d8@@@@@@@@@@@@@@@ ZN?tꪫwL*D*K.YfY:uK.;g[&LwiS~Sta٠Aꫯ1䢣FOڵkg;&S E/8(6M«4ߜ9i@IDATsBZ;UVmi^gIN.EY_:yw[l _禝V$ҶxMh c=U*O=_vSGa˗[/}i۶_*dK%?bm. jذ[AUGdW>˗5&Q֤*ꎶM_ G׿_O#hG:r}_Ǫ/mmCОX I^z6t@ Utu@@k :Q]s5v!JtO[nP*To14<@}%JK]Mw"鸟v&S'=u2Ss–t[wmTZ*UTawe\)gL>}Ǐ'ˢo)QZ=Gy.mژС93kʬV-#3x5k.,s9 d@b4L-               @ 0䮻*4 6l}G{wmիWoٲe 5yBPF9lU6mx>S?If7+Z֭}XTfcɒ%ֲeK۷UXoo쭷8@s=<9cU>cƌ!Cc=f 0MQ>oM8~S܆'KvM7yTk׮v 7 nZu-(F%2P+rlB~W zO}1x%I~Dn#r&lMϫc%8N˟~^}UP^# k["<P9OUS] ڨm' & Ѥ2פz;u&*ib ? kpLPo2mz/y;v5{I'~^G6+QȢOY^wz=ܦ kך~vP&M{B׵hE팬/|dXdž#y2DŽj&y  P+]ԋ  @ |֮]T { =huo/̙3y|ɡeB#ÔtUt=(ݻwŋ}{tvO{ťl`ƨFmӦM  63曦WmUuWxn{カ}Շ]vŞ|I?N׽pUٸq 8t>]~VF =+dNPQ QQ[6>wO>h"8#4~vw֭[5JXf4Fӿ?ƤګvAQ~/\0xi[>jժMY2{|mc-Sxc fb"y5啪mxaƍ'|:UpCṋ\T՚(LW/s3@vuҦI0:>|ڧI 5^'&fkmƌ~WM֧+mWڶmkhN!8PjBh[οs}׾x}UpԎ;O^>~"DMIEr饗`TkRsS{ըQ ߶~&Pz?(4I MڣGD* zgwdʕ~]xZ6Dn;S+.)K3*u'Җ*"-_i} lS{Z@,JE[t:IJԩ8c`Th?/c9mSTÆ M9}_TtV~1h S_4A^_۶mw 'xgގh:Mgq]|~VMN&/8GLv[d-c/ޱ^^={3UQ )~ky  EQ@84={guVl;vmVh>q5kZٲeyYt?W]E7ݓQUJ,*l8ͅX-^=3gf gV8E]4Ϛ.a#'&ilJo߾ܹz5ʮ*6m|`vox4(HuVRr+Ǣm«t^)k:g~Σ~=&tAo6ݟVJ8hqc9ƷAǜRt[%޵G*Sb"0CUT!}QNlH`:UPu*P͍T yP7{Ca@H`   @ʪZ5'j@@@@@@@@@@@@@ 4 ]{w:Ra& USz+^Ѳ\O_~q!1~PοoѣG.`ɿ^|McYK/.yƏQF Z`*?ǻОSLZхJnv\} $ƓS݄\P_riӦeY.'O׮]>O?_7{lMFBd:7_׿:I91?x֭[\L2YzhZjРA赞 6lMW_.(_~?giҷͅEѲd‡T.*J7ac2x2^[_t=qܤY.+M9r}GuܴiS֭u/ZmNS.lÚ7oYdв.]ɿvjXpBvu,7m}Mh?czWi!w&^U_P~,(5)^ytz{)(,Yʶ~{Y.g/~ 0m\`ZɓfΜ~*\naB3T;8/_ƍ'w$=C@@ +vjךׯu罢(5${[Z_=;/9/DTqWCtwѢEak}z뭷fi|DbSN֪U/U+\|EҦMV9lj׮Cl#r8 ͛7@>΅{>ӭ[`U ҸUPt߅Keo,J{C~_1@֕催{Ld|,t8Oڵk((:uh\0(.Ȥw~7_Ϛ5+%{|AN4&ȵ-|a ѮgeLrJ\Q<2]QsթK_YY?y}챻de5iաC[y M@'Jք e=Q@@@@@@@@@@@@@@@@ P6mj|򉹉:Xb*UӧnIkƍMnf={-[ ]z&W_}֬Yc;wÅXfBu\&ǻ ̅XZB%D}/C,1^/[orvvi۶Imʕ̅7i\hYXMg˗ϛ4i.ǿW^=w:\(ׅK/d.` 1|sSBy)ԬYpAh'bĉBv̅ 5)xcccV?n"HsaNvxT& 눊 ;/c.ݔ,nW&4="KEn[m۶;MH3Yd&\z&[5hnr]uB &C]ģ{P*sMj.}Qu.q.$\PDs_lJju& /;÷ۅO.k^@(>FMLO>ؙg#X{"? ƍ۝ @ܟ?㎹>@@@ ӽhuFDzGڧ~j#Fs9't<.tozFÅ{xsnxEeڅm`I) &ۛu_֭k=]tEݫ :_8cc".J.Nh|,s k6:449x`?Ӱa>.?$ȸZN:i$t1L5#uUijo7V2\pT)scWf#Gjp5ݭ?3а.ev=   P,ܟ@@@@@@@@@@@@@@@`4Yq:BRJE 4-b\sի}&֭=:O?瞡uznL )|e]*σA׮]y4ce7ݶx++`OWs=M`ƫ'rgkv m |M?o^ z?omȐ!$[og;J*~RhvXM+,N5ެϽ՚|oN7tTVa)g@2( *~+=B@LS?SA?={og-hTsÏ Rc={ώ8∘>Bgtjƌ1FW(.7 9찂Q-?k`G_z%\b}ßE'^blgxd۶mmܸq;ղeviddǂST`Wi&6XRW ?; Ηex_uD0_NXX/7E D;M=9{f{b}W|ʕfQs? k?Wfnz]Ӛg!{wqGn qGaUEuG|u/*uId\{uӧOMzfz.]-{r_G~BMdڽ{wӤ2cMqXmiРSv=3jiUf(`_JSQ`^ꫯ6ym֒) Ν;[ڵ; ͖&}TVN%VϿ>˗]vumj;bȑۭOxkmܸ22e6퉬Ou5־}{G5RV-[`AakAb"l"ZL  P8ɓM#,yםS;2駟feԩAm}/tLA+M4A= ݻwrU)xgϞmKŊ/VXRQ_A1_Ÿ%oMԽ>څfk֬ɷD :=?N B}0;U\ ]/nVx٩!-'/c9޶ } ."Ǐ^ިnذ񄠮DcSymKE_xc~xX$}~QS++S]}%ƍ37m5/pòKbx,7k.v.! @ @@@@@@@@@@@@@@@*Wl=OoAFT.\ۡ&S&pر~>`IJA[`6?曡I5Qsϵjժkg϶_|OpGyVZ<˖-DmɔE͛:|ɒ%T?0Ĩ$\?>M 4)G}duPMYB{뭷#z.?WT/^2o~ʕ+k4w&6MzشiS[rQ4gɒ%}Rpc=ff{!QS߽_~l JOF R} Oik:=P*tO좋.6E"}^׮]}T:evȏӤ4!S c  @PBwN%z_?O9mrtV*&(cƌ*U:Tk93O͛[p^B *}*Tp'r\} .J\7&#CMAe)^ckR``L5/uԩ[tuƍ~ƬfΜi'Zi\[nn©v/4\zΉ'klKc_Akuֹpm} ?M0}~#Gxsq5j!CuAhI&2D6&bRl2I-]6md~M6v{*2wJYKY2nyˎX=^5쥗^}5֞lC@ZE=               ieÆ .,nhJrگ?}Е&{:>DK5IwaQ2wyO1LJ<fSW}?ৱcIe˖-}Lٲecwߵ;ϟoĉ~R`262MVfzR;N}QDyvаXU0&SQ?[%GPS5)&SPˎ?x&S?4I?S5k|jrAO9iҤPХIKcUz>KD~ E(KW@TziA '`|?6hr=zx}RY4;r$3իmQw`:ʗ/o j֬Q V*H)@HsSb%7&Ӗ%JSPGN˼5)PKaPzYbA8ӢE ;#M:Ks]zMl{]f9_z4Q?d|mQp&7,ڬI]T;A(]ÂGrn4h j˩xR?X6mmVp%Vy@>ZE   (LKu* ߞu\myå0gN;42e)Хrʖq{2{Oc>dHc8*/!b{キuQQZ( 8G>}Q}ԩ@^J.owR ilG!;ZSnO~PqtYEA@}hSEAGۏ'j jذ?>C6j(?Fr5\ klNl8T4F@ҨQ#_bshEu]p{j9s(m۶~lL2Xu]T;wUn]?v6kxjLtI>ڢ{7cn,LE_aƺ&be}Oc )LKtnad{)ʈ_憋lnBTȘɍ't;! EBDWuE[4@(<O>i1[𴉖             $& /|B֢]C՗b9?Ο9yЄ{&p@ ʋtsɻ@TJ]  oJ:YMmƌϦ 4(K^w(0Hu ݛ:^ڏTZJ,S:5@ K|i=W:QZq'fcƘ LX/q) wASzk>ƭg8>c͛7c.Uc:nj׮۬c*=z{χei7*\pNh_ץc""_>kSږ׾f 3[^D9vM2U&aMS}]#g}v1O'sw;٢E>{qvfs\!7ƍˠ 3a:E@ ,[f 5ر7P5@Bv@(jw>!            @& ̞=8 Vy睗DsH_խ[^{>*iᮻ#G<;lsεݻSO=m_M zl!Vv&TD7RQ&OlCW^yʔ)cW^yU|P9jv  Pt$,RC27TL]  o%.5dR{w\{3ҸE$1v,ޢEE7[ĬTم%\Ö;s]P I%ɼ[.&DJ}iBT򻯛7ovt{23;X~=~N?({wZJ2+742q 6mn?=@@ j%[Ho$!D@@@@@@@@@@@@@@@  4I&O1۪ 5i&_5mO?O<0mf>ZUtYl´?ݪ?6vfRJ4ѧO?Q\9BIP ܘXŸyѢE.P+uVSc~塱]j/bW&j4vG8Tw%P+iİݰ `pWY33ܿe1k@@h rhw# [{w-]ZI@@@@@@@@@@@@@ ,[?cwس>k͛7뮻Ύ?xh(} 4ƍ~?.2k׮]qbJMPۦMD>ņ lٲ S~_ا~jǏˇ{^MڥK\B'd'@ -_<5%W$˳fͲ &W G!QV4s83'@@T hz&xD ^z٤I?VZ#8cH@9zyCyg#FoZ?x`߿i|sα޽{[FFI+u:W^-[Иqg+cf 2ďk /xUTj=sMS;PN놜}G1w .FKAW8{o̍çR@@< n}ل f;橪;@{0 Z-@@@@@@@@@@@@@ ,\|A?!WժU /?9g( ڸq+WP5b~/2[Vd;5{^?O?d}Қ1cR8&bGy$Un @ *]7) @ӬF 37kۧVA@@ @- \Zq^u֭[s a 䃂.2{ a o=fJ%_OAyfSـL ڵ38N>dҧ)iXzusu1zǒ۾fulȑ/رcᥗ^j X+_|H))~] MlC9ߦUdYf\`1  ZG"  ;!            ER`ժUsϙ&4TȖ}W^ԉ@ YFm#F1cXҥ}ݹ #ҥfի¢զͮ߀ʘ?ovfƙug  Z9_OV|#@@$@V8@@@@@@@@@@@@(۶msCo'ѣnBnN;~Hr+ UGe>M:]m\թS֭k 4ۚ4ib5jmu !k&馛"H^`,sAf}gּyp$  &Pf֧O;C8R'Yge-!Mo*ne\2#/ȧ~jÇzˇkpvQGGkF]dYz@.}?eZϞ=N]Z2e U;{}8^`l37l}f־Ycr7P@((/               xv>`_N;oҥuOW^=(LcƌѣG֮]O%,+++:M,y'ۍ yU-\05p( M+sox   @.rV8 w}}h5\c;caWn d:t1k׎}PfUu\D;+ԩ 8о+{w|֝wi+W4fGƍMc*.oٸqO>?֭kG}p T~\J͝@fg f$P+3Ϙ5mjvUfCD߇  @a 0; @@@@@@@@@@@@@@@ TPO*^|V~}kذ]r%6b[bE <f}vuY-zvEƍ%K駟^zY=RҥcbirIAAHZv2U9Z   &{~nv Jlbϸԋ^z%%͎=֬T4q}g?-Xy+#ZZ VSy/MAruamB [nӧi\ZҕW^ik֬ofΜ# `GqD ulT  !~ر$~͸/̆5D @,W @(O>ivfKn9@@@@@@@@@@@@@8믿D 'skҤr!֡C?& P _|M8ѦM?͚5u^5cW_}? x*;찃ibР(pKE^q* i۷?푆2Thۛ{d(F@@ J:6c$.̝;׮z{뭷LA[7t G:J(Q8XDZK*6l=pBݻ+m݊Hk9f raQԏ駟˧~j}-Z4f~Y۶mM6ֲeKkܸ[) hJ9BFkLoכtutSzwKqzVٸqf;^\?|S̖/7TQ|fo.ѬjZڇ @X\ل -~KgJ.u# N@->             ֮]k,aiNAZϷ%KI뒝sʕѣGҥKTR>n3=( xG@uR@ hC5[l]ST)   !P+x;뮻lĈ>ꫯSO=ʗ/227x ;<\ȊKYɀrfe@nDqe@ْ݉@@ i3H@@ !bb'@@@@@@@@@@@@@ 6mdSN/Op ^z~zwm(Q"H\`ѢE N5i_~m۶ƪBڴictk*Tx~Z|rq4"VW_utc[J)gGeYdz@@()P+x~{衇l> O /Zlˬ,璉y9r>}X͚53ʧU+s s\uv֭~5kz &Meƍrʹ:;#*ѬY6=5g?p8gi[Z Bʔ)&z:?Ǝ-2M. uC>(jBofjf R@@ Jޚ@8@HH@ @@@@@@@@@@@@@ %KB)Hy&^iy0/,QF{ +TǪ P8o惲4Y&\ԄuZ^ ԨQ)E>HnݺC@0auV\ɤEnkyYRi9"  P,cVF /`O?VQ ' Nɴ&M7xFa .mE]d'|)`&ӊzƌ15zΟ?߇k)N>z̜96n+RְaChР7ᮻPCF ~zܹ6{l?믿mJD jZczdɒ%3/Oyyf^3K-q@IDATW ff. $@Vj%oǑ  @Bj%N              _6c  󂰤ŋ4QYd{MWR4&H[dvR ~w3gi:-_v6m}\rhºMI5kfUV-2} yФZAO+@ im   F8j;ARoRJ=;Zw/6WXaƍcѣ?eNc˔RZPx[F֗0E]~Yl 5 ˕'udn5.g^ll=>جD  ZG"  ;!            Q`͚5~l.]Xvuֶ뮻W6ydOlڴi.iƺvj5mڴH)mlߔ lt)sA3s| B9Z*Ԉ2ed/.uEKsQ:wf>/X*Ok /(;sh<^z ܗWcZj;%96Z^'yYfʴOdM0ѠڵkFVfMS( U@kʫ"#@;\   Qy-[f_}(G5ShQF.x_{ChLBy-н}׹._|͛Maճ͛%\bm۶5p/?S25?4m?r:> ӘAHSTm>IjKָµC? Sv_Dt1umٴig 5&E9?G)Uأu|dq05c+Cjk{E - 33vhųo7ivfƙ&gN@@ jݐ@@@@@@@@@@@@@@@(aÆ#[ni`bc&M4Bɽ[ou̹+# i4nG B͛ :Mx+~k1<2G ×ϵ^1`,Q-55&ZXdbAИBAji="X0]N@fT{Nf͚e.3z\_%҆ 3kl`sQ  @J0#               PL4\#]rOZzhB`2 h5\tzMm]07&ˋ\'ܼN^e+ĉfOupdX JhpݺuG01`1X-[|VxV`1X7AeNnq_ B`<|Q_أZZЗ짤h@-̖-3s< jeل j%Jyf}]Yfu&z$! '@VYs&@@@@@@@@@@@@@@@2V@iL=U4 f;,ԋ @P֒%K^i1Z75Zݡa  _bիW?o/_F4ffvQůo(Ans .T{BA  R6#}J7Pwɴ#oL?3@@ɢHڈ                  TZ@8 rPV29ld5   a#Fuja+y@!P ͅA4X ̙źڹN&NSa=L@@b(@V1|S                 @j 0X"@JUlJ@@@b,_flvqŸt .MVX64"B\j٬Yimژcvf $@h2                 ]@?_@7   @Qx],=bis(Pk˖L-, j]hʬ|yS[o&vf5k]xa&>" @Q P([@@@@@@@@@@@@@@@@@\ (PkӦMf͚\ @tj+}k@@@zˬKJ5,(| ڼ_Rޖ*e־ل 7j+[lPc͆ ɄG@(*jwv"                 @*UQ˗/OhAX@UX   .v3;8flcɖ5Y*%Z&DQRQUJ mZ=""K]$d_;cY;ss=X1B_1#RGΛW:Tz]wIw-_#   a@@@@@@@@@@@@@@@@@R(^8Z) S@t;   HdVCi$)gNBi׮#eD9Ëh\JG| u񣏤5k6nG4ͺoC+q7M F@מzHkM  ޟ@@@@@@@@@@@@@@@@@f26^Iϟ?ۥE@@@ȗH~ _?lYqcgKó*,6`(UJ3FKi#aZI[0z@ZϗoK*`.Mx$.#aO9rvԲ 4o.CF8_xqii0<}@@ kZoZC@@@@@@@@@@@@@@@@@ rrD j#P+jO0C@@2 ZU7it Cܹ% 3 J /6Lu^ LE 駟۟R n;}p{   |oJ                 Zau: -{G0<   @߈qqWh2/ zp@å7#,]+-*W_cK7vKq일ʕɿV@@ TjJz@@@@@@@@@@@@@@@@@D @@(8 @@@|R$][0eIwƨ !FbC @{ ԩ#*$S$+J?.=pay P W !l@@@@@@@@@@@@@@@@@@ [vE *Ԋʠ@@@L XVGJx6!sCM]HvL\wY8x̙ )ի'vtpWy F@иR+                 a#`Z{޽{æOt"Sʟ?2O@@@/4Z4I򾒢 ~ցaU:' u+#5n|92'`fe>*`!FI?$ ~t;@@P J]F@@@@@@@@@@@@@@@@@ ,Pʶm 7t"YԊQw@@@` $ʑCB'`[+jqgJ:t,n6c :xPXuRRo@@x                  jE fxd]GFi @@@ ,PdIi̘*C8 4B~f@>G;묬i3VZXHӬY2}@@@@@@@@@@@@@@@@@ /[ _ɻ[    Ʋ5khݺuf+xÆ Cc(P !@¤,`ZjDŽMYN8wo㏹YXVRroni6aA4v徳+{쇆ٽ-[LfJpBjJ,µʔ)es+_ @ #WJc_±͛~e2VRE5jPu饗L BzZ2ESEz_up ]~g} ݲ9 jР5kn5r!^6/Zcsy!y4HvCyl M# @ !                 pTܹs dYMJnBc8iddGΝ/BSN̙3vmh4]ve[]fL_/(ZyɅևłǮ{v>8]## :uiӦ.,ig=[h]S'ץ]Yf  @t ]                  -Լcǎd_c# j  D}d-\/^6 ԲK([*Vš,{S-aRѥqjvKlٲŅY,lŊ5kƏ͛7'TafժUs5jVZf[9sL؏#jyDkh}2e֯_%JxALSf\V^r½,m۶ gBf̘oFo "Ep- +6Dˤ>s&P+ 5|6iHۃX9U! Z @@@@@@@@@@@@@@@@@[dx׮]10R@Bu#  !|ro6o]cǎդI?;S]t]3R`Kv]'-Z>3zҥZnۻ{ESK94q=J^]x  @d #                 j޽;} HI@d؎  ,`Y?~g/m67 *nݺ+}͚5]V҆#w;~H1/xOoZ`ϟnӦMƍݮKv;fMTRIy JjI b׶l٢W_}UÆ ʕ+ոqc=Cj׮ʗ/˝* [=uVM8QZ)Rąlq`h(K&DHw KK{Kog  yjE9                 [ >>^vJq$ P+@@@ ݫٳgoя?肴6mڤ8թSG 6e]4hN8!I$PhQ5kWyf qi:|,͂7o3a$;F'%]Yh~ij|ԡCYxLb)Vn6w[nFnV6mԷo{}멧͋HGZ# JCJW]%u$l  j9                 dZ bݻ3] @l #  ~I5}t͜9S{Q2etgO>jҤN=T/pčH<%J /t7[fr3fm֢E {:dAm9r>@#4e˖oU꥗^_>vٲe裏_~eZتU+gwi%;rZ֡C>#ߑ+ZP'͝+HE@ :A@@@@@@@@@@@@@@@@@ $ڵkWHRb\3R@@"Y`ժU>|.R+VLgyz-UVMF[NǏ׽^'L+xxhѢ.`롇ɓe/ey.\؅4jH%Kt>_Gc~G"۷GQ,7Ԃ Թsg´R8ϹrUW]~ASLѶmԸqc]s5Zvm GʕB9s·3/N+V1@n\G@@@@@@@@@@@@@@@@@ آлw}CQ-`ZeD  DoI&ۼydFO>ݎT9rN:vaXϴi\XM.]w^5k̅XMŊ#uo/C" &gϞڷo Wرry~lHY /t~U ݻ+...zʊSReIz}{yeY*m  @4 {4]Ɔ                 k.<@L XV@@@ zUF կ__."}ڼyƏN:0SQ&j׮i>3mݺU'OVݺu5x`UI4iB6nܘɖ8|֮]N~~itI\b<\ù--_~E YӧO׈#TXZտ14lP|IGf.^֦~M:|8=+>?2>@Z~@@@@@@@@@@@@@@@@@@@08 t( P+ N"C@@@ B֭[x@e˖՝wީڵkԒ%K4`խ[7BGFrȡ-Z襗^Қ5k\XشmV+W?@"ܹ mT E\_ղe,i7UܽkukȐ!aOeiN?þQϖnIC)  @Fʨ!                 AjEɢZa|r  Q*rJvmX,4'k9RM6Q3XSV4~xեK\S|yO[ne=W.B;VW]un}*VXM͛}Z_^c5em~-UڱCkQ5, Y,@V                 !@Vv&'kT@!  @ ٳWyiҤIuwx.&wQ(J(B/_CWJOk޽h2&̝[:p &уo;+0:JX֨Q\ /5fxyLi !(YRBz9i UA  M                 @ Xc` B)jҗ@@@1c\ִi4qD͘1Cmڴ%>uQ .BJӋ/:u/Y`4~:r-zgB -'p뭷jݻ>^ k[7y Fi@E@h9@@@@@@@@@@@@@@@@@T,Pk߾}K @J{"  @fo]qڵyP:8uY/V֭uz%=0Q7֬P\jewf۲ir)6lXfLK7x:tM6eejO 5>>ق %@VZB               1!_{U͚5j*VSU  @ Νu#cJt@A@@(Xh4i˗kΜ9dAYQ>s=eE{Iذa^um%}=/YD]tQ/<:KWaa„ 8p`}ܾ}|A5mڽ{wjc5tP}嗮믿B\}u}wan޼Y#Fpgs=.]wyG,;4zho^;vĉe׷`_~Ys;uڵ%O :Үc͚5>|9v-i1k,SO>*8lk{ͺvi @C@8@@@@@@@@@@@@@@@2 x+V7V b \2 #" @Μ9uf7@x7a   G`…jٲ ]1cW吗1o<eZJ6I&Cޮ]yU>YO?o6dmf>H 65\ٳg'[W_{OUTя?n!d+F '_vB2kZxq֭>}>Sw._S莈G rვ*U \|{C_y.x*۵k]G ,ςz--X gB ڳGZ,5vM߻AdYf*T,+[h! b^f^@",G@@@@@@@@@@@@@@@ vAOx.znp@P ʎ#n#@2;v譑KA@@&`R\r 0aVwŹ0 P4iDzfC޻ᆱ׻k!i>eJ9B~zɣxqtg;Brʥ#FWJPT)dmzPH Q"Z ڿ?}MjԨZjݻSL ,hf͚z^wf+} lMo7|ٮ.* Ho߾X N۹s2S_rR~SOIWg&E@XofbM"               @ \R_۲`*E ']gC53g֊4vH}f3kNqB L^+_ @ +\>#͝;W=\ғ@uFMscǎ5\גeYG2eʨu w=>|x¶`=_ǎ5~xY8a8 z @IDAT .Psxdav[Bj![\iTW*[V{   @};h@@@@@@@@@@@@@@@H={G3fݻU^=u]BMesѦMjݺu;ԸqVѣGkԩ\ RJ%nmƍjԨ#[Њ-7f /OasV߾}_oq'P*Uԭ[7_-g_y]E&M_۶ms}tE6oެCjΜ9;t蠋/ؽ@ P+v=#G X;v  E>SKȦbs ~>~„ `Y'NTA/UK.ш#h"rM78P~hYnn._~Iڷo:w|Nz2{8ڰa E@MzjI=ײy󧷊ߛ;&P-ϮQfl^{Ii117x>){gC>lW^-]]*xiCpk饽Ϛ5 ~2ϯ* *d ȳgכ6mw ~phe_m۶O?lX l޼=Lz{;?`';Įd^ v}Vڼ]m=$.X|~nݺꪫwZaᅲ;e%ibfΫa)uq-\>å#]&ysåg@Y@p>; @@@@@@@@@@@@@@@-}VoųUD eTɓUjUoمU%n\o'[,n, ݲ4}lqN ӲҮ]; hny_~uaX-*i Bn ,Pk t}>VZ/;uP@bO@;` lQC@@ Q ~;X}'o#67`߹[ }o*cǎu\>@ƍ]pXѣNZ/amݺUgE-~Zܼ 75,JjՓ܆@ӡCgbǯZJ[lʕ+]M Z$c2K,qyu];w -I/ [l~wfʹG1cnPb~pd 2曩Ν$n+X}b;6c;-[ VՙxM2EW^yeꊥ-Pweذaܢͷ+\wܡsK.u[7,Ϯ ӦMS5\pΝe׉`5u+;j\YXU u~uW^kvѢE]Z{9f>R^灅Y]v 렅quU#Gԅ^R6R{rk2eʸ?J,鮳ׯwaq_cs|\b8jy B?ܼ͵ww.K:s/&JΞ=۽w` ݺusɶ9-U>íxYkRy[Iޟ^[  @ @@@@@@@@@@@@@@@@ #{_鲅+O9Е-m6u-V^=DJR~ٸq_^̙3G[oElEm_тlG[҂l߂ 0.ϲE"m~??~6h {kBQܢdw]iJzh׊-FAmb3z!sAgFԁ  Q.`U 6tߙgPK(Ԯ]}o}p3fz):tmk=s=geA;~vXpb*w[]۷?ݛ9 2D֦<1$; !Qef_JG_P"E ~N<ģ;yvޭR̾z.駟vAgW_}o/P6wv9?6ݥXb.C,Pk~?taH7xWPl±,m0:uÇy: _ t1߻`5Zη~I:SK85ZҥK ʽ=.YٵlB^ ԮWNɅo6mw'h6a~A8yY_^@ڱ]ViAgq;iG+|^>3gz1u^?CY_j>}s7?_ /5Vzp@@p P+}C@@@@@@@@@@@@@@@v^|3Ieʔq /y*P,Yfɕ'l[رCo<+Rv٢sUTqAe˖usZrNP|r߸}mq< ;p[K.nț7ocAӦM_EF?cս{w>@'NLwga^~{~=#Ė}@ ޟ^HlF8@@@ ~SX1XRUX+L2E6g`W_U׮]c> xb̙.xjСn>US$??qW`s/իW'4c,6?caGVl֭[ݽHi$a ?xda,RreZJJ[l={Bml>_|IM>F[O cpJwk<vrwk>t1byIC?pk,Q#ްaCR=<+۶msi]NiHz{$-,*iϣE>A @Sf U͛O(h<YeRߧu^s,-?v.y8_|P^t{c@@x7a                D@ΜqZfV\y(N:$TR 6 nK[*iY|yM=oԨ7n &۞={4qDYp-/w68p@Gָqd:uY]Iˮ]qƤy  @/Zs#   `mZJSL `nP"Ew#GTXP=tcǎ:s{_}ԩSR;I!uzoo-Yr;V,jΝ /ؼC=@>/}N%Kz:z4ofV콘̚5K˗wyc/KUg-)>zG@@ \ 3A?@@@@@@@@@@@@@@@@ (W\-ZK/*tʕ?Wٲe][m=-Reſk֬;wߥK*TH'Nԅ^Ç[n /6o-[ … B .^-+VΜ.}v-[(?{jK~S[G[ly晪T[`ί{@@+`Zޟ@@@ />o@,6lpG&E+Ʌ4Yjʅ!./gaZcǎu+m۶u(b k2ջ@c5j#ދeڵm 'Ǎ?X>~۷O|͛,a,LBzS;)RKL~?#.jѢ[/wA6DI@"y@5j/7Xp͉'γmKnџ_m<~1{%-nں޿ s۷w:_~eB]k6n&Uf|6lx ɓ'yԮWGrټ]2d7l^.8zheXNgl֥^>{17@>/o[oY}nhło?s7o,kըQn:΂ 4uT/(Pm Vx~;{I@@ ;/('               AJz裏b قezr =裲ìԮ][s RBumiɒ%:hҥnѫ m;vt7N2-g _etIOd oYu5$,66z?ϯoYw=\ժUK;wws/EmLn ٢W]u-8rH(hb]l޽{nݺzǏ'  W`Nk   @ѢEw?jY@QVڵ&+7pgڵ{O?~mF ĥz t'y晩]X9X) (Yʕ+»7n8/)\H?L>fZ5g̘6|Ɯ9s܈bYyݙYu :4al6m* ರ[t%jժo\}͝ѷo_gm[6gdXۘ1ctYgZjvfսs9'*W\YtԴShuo,9ddUg믿^3gt^YI:hbItsmX7tkɮi]y}f׫O?ԽJ(!;*GZ5j /voZOM0A d ޯN gbw~m 6m4i" , ?Yp>/m׻kUP}YH_޼ySOyykS ԦMyzggґ=g@&\Hޯ@8N G㶲@@ h&ҦMA@@@@@@@@@@@@@@  7{וԐ!_gϖn@[nǎ.<J\l1ȕ+WŬr̙4r rȡʕ+4Jܹs'lN<Ą=سgʓ'O"m VJXWj @lXP-n( zTN  Ā@"g|7?10qѢE.H,"lݺUc Im"cۖy `ǯ/36wbY~I~,,xolB,7T s'~ݙp{;ǔٶߺ'0@皒Ͻ&S e͟?_'|*UtQ5Z-~׮]:{\A㏻ܹ9daٲB? oÆ ./9':sfsl vomn8U ~t(Wԩ>]CF0|Uy!rxd-Z$Tk-QTmyo>Y]/si`WڴP'n&"TK酈JGD$ ²ZL1}11}<               +u8@[, WUVM^H oz80-+e˖?`jРqـ  @FuA3z4!   ԨQC3gTN ޫW/R+jWӚHD/4OO?Lmbǂ[ju|I[۷O5INÆ Ӑ!C\ͥԬY3" :u{I(\H>d ׯ^~eu]Nɮ>ErsK tw8/-z:hΓ'fj/ (P ;Fk3ôlx.}sO;K8hvC@_1A @@@@@@@@@@@@@@@@ J￿)}.m<   @DkpG@@>@cƌѽޫѣGgQ6m<֭[8I|||rVpa7}O;4 t={]t+B*TвeO??رcS*;j2#<@s=7r1WSf}3H &wjm%駟;CFt[lqu]6up=z5yd/ KH Rڑyp|su]:øZӦM#"hgOiy[{e| '@VSF               @L FFL:EzË  $'sp^a   \oY^zﯶm۪aÆz衇JQF[J޼yu5ׄd֭mۦ)SSN%ժU CY= (qv0Bk7`^zGɼϤZ^Hk.Fi ܹsbtkָq\О1ZbF_|{>m4uQ pkݻj*Yv\ٲҮ]Oȑ#l箻l2CmxY P5 Q(@VT               @, xb o؇WR˖(@@RBm@@@_R* 0`*UV \K7tSAJ~=GvzI/ó>[?1)R<9VwaZ>hBٱ{3(_^ZJzٳgu2{yΒp&C1x2  |WD@@@@@@@@@@@@@@@@@@X P+V{- ղ@H*'|$P+ }2D9S;6F@@ Qb@@@@@@@@@@@@@@@@@@b\`N`G`   m5p@[N`5kLժU?g[h >|XzB.RٳG'NԲed5 l3@\j@-ls 6_N.\}{裏dAVNZi6h u(+e  Zi                  1-ktTPL30x@@|馛nr)K,qǏSN9EիW}^;x`. f}ڵN:$q1c(Wk׮6m(...Jx%(sK**&FiΜ9:Su9o֭[7լ]/3Γ'~WY_$O&P+\ۓOJ۶I>=_  je6m!                  ۷ 'D`2  D@ժU#hѢE;wzM2EgyJ(v_תUրE 4tP]r%*V ̚?z˗k̙ٳJ*YZ>~&M$ Y}ػiӬFZV1lMF髯.#  P'                  +cG))ƃ   @ TT)7vҥ3gʂym۶=lH:uGn۵k'[Um lݺU׼y?kviii.W]mĖj<[m^\}g^ݺus`}G\ߓt駻P-D(Kk$BOc^Νr'zH$jŤ Q"q                  "`Z5j$Jo'   e![gyf.lɂlYpf̘^{M[lqYVF-Zp[͚5SӦMK 4-͛7kʕeŊZl,4͖7& Fej߾[Zjc%,_¤'xB&M'?^~ի;uQGcǎ1`~K|rSNѳ>:K)))C HaK_驧k@(P@@@@@@@@@@@@@@@@@@@ؾ@~{@@0+P VY,_~qMK, 5}w.i޽C,aÆ.x·li%|ԯ_?xkuUJDZ={i&mذAׯwRR֮]5k}4{ 8k޼z3 jݺuBqxB)==nቶO.jɺ馛k.`{G:]vQ=y-} ҲH[nt%SOu`&M>3Y 6},kEWk06M+@@d*GjA@@@@@@@@@@@@@@@@@@ nvj֌1@@@uԑ-zʵ. 6YbVZիWÞ,iܹ.jƍ^OTjժ`-TժUKv/5jpa//UVUʕUJDKeW0fcܹ3j˶m۲-[n݆ddVfg 5mi?>?}jyOM *Wvꖑ#G*##C?zAm6g}XPbڵ{rqY}r˖-.,>GBEi:pʗ// vmӧ "1+۸w)=4f4zttV! @dԊ+"                 U61MFLA"`o@@@" ԭ[cu- MY~,\+4@ʂ,Tʖ )[߾}vuHWΓTB,hgTUŊ.bZ}.cKfffpz`hVh_X -[G.n-Dۗ@Q7[EKu´}xΜ9nYx~'Yؖ$%{O( Ap-{_\{ޗm EBž˷-{SXWZZ ஁j.D}.@ߗ<>[cl.eoFF^P]t  @Ԋ-5#                 56 MIA"@VQ8@@(XH--{Ν;]ݻaV=4*} q0*5hLG51[HV,kU|c[yxJJ Ѳ۬(ir Px q`u-9;laZWֹ@,  vZz~1mU^݅pYXx`ӦMݾ94Y_/=t]ҳϖm[8; Zg͙@@@@@@@@@@@@@@@@@@IۥZb4@@H?W SvƏƎm /<0/q#jMH X`fRPOzW+@Z`3iV,AֈUsjhiPN"v**F@((Em)                   ;vH5jDah   @>LS*#Ƕu`lǖ@ΝxhjYY>_ࢋ]#@JF@q@@@@@@@@@@@@@@@@@@V`vf͸C@@V`䬐#,x2@JkWis@Y+I/M$}iv" @q*"                  j%E   տBvN#P!k5==".PgSqڵ$iÆF@߾R ͥ  PL                   ĻZ~  $U…R~{~nc H X]ntʕRSmJ|ƌf͒^y&@N*@@@@@@@@@@@@@@@@@@F`fͨi A@@(/,HO*abpSROV_D ں'Щ4ltū@@ ԊC@@@@@@@@@@@@@@@@@@(S7#@2@@j!UʩHNj1hիguaΘJuV-i۶k6 Wi&ix8@@ ԊK@@@@@@@@@@@@@@@@@@(w9`@IDATYԬY̊8@@@ ,P㣪I42P!j ž4%%fO)]TJW֨tҽr KN@>"@@@@@@@@@@@@@@@C`V)tٶ-렝;o}22¨]@@@ Wrea#   7J[ 3S:p@6m֮V,,b !Pzߦ@ZY)(ݳr>\*l[R5R D@r5                w4gΡ{7ٷU&٤Ud=@@O@ @@%iӲ(9&ZM[(@ ~/SN 'թ#_}()v('\ԬpgYS6ONj0Gk@@^v&@@@@@@@@@@@@@@@=.ʕ˿彙<0x@@mz&*   ćwImJ_/>'_.x$i n)DBreZ5iHN Ԫ%yEJkKwme  PtnǑ                P/7 3SQ@@_`ɣSRߏG@@@bG`tgi/-E$-x1#C:2<+u!p@ݺҦMngKdRS[#{jҍ%=/=# @ U@@@@@@@@@@@@@@@J@eKG\+YS/y@@ ضM)   !H3fW^EågQC:Ģ1/@VV%jm^5RWY &j%uWYs" @$Ԋ.u#               @D1{B Hm#  6,Zq   $Œ'@;qd܍Z@ *U={ؑ]Z )I=Z0AǨn*C@B B                @ ,ef~.1"  @6zjj'   @t ̘!U uuDRrr?3ZH ԫ'mPN ڻ7VǢJݻK  Zyɰ@@@@@@@@@@@@@@@^~}餓̠Рt1Q  @ "  gåJ u;#W~Rrݪ^]lAҤkKV+HӥX^i$/b@>                @t\rdoK СRrٷs@@ /@V8@@fٳN 첬PгY֠A7R@FҚ5> @-+{fol rtmv?h= *@֯!               @ sdۅ .:  U@q   sWVRϚ. }j_/efF ԛ@Y[QŢJ_-n,6# @Nrp@@@@@@@@@@@@@@@bJF ӥ_ݺԵYC@@ Ut;D@@M`niRОHN *TժI}@ÆRFaC$B9TڲwoG={JIwA@]^Cڍ @Z#               @L \|qDcxnИF@@ *ԊB@@@" ̛'RǎE:;WZU4v$ I_~ J,ZM e-@VY_Ώ                 ʪkWMbWI   ?mۤT8@@@A`\7RE0dTIJK#P+ܭߟu˿#?IVI??}' $_Y$U               S ==]{վ}ܭ~oҩn[n8;~.6Y^y~(`qF-]ԅAg6AW1Ѐ-v-{6]?    xp3   0N>9:BNƽV\իWk͚5eڵZ~[ٓ*T e\5RaS>k6nUڭM|t=:Sd[?fh}bcnca26o޼Z,ׯ9#sm֬{fCzZsdl: o Gxojo.\~_>F@M@x@@@@@@@@@@@@@@@ ,xiݺun8 Pl ]ߴiSp4 VYlBCZjKvk l¹vsJE][,,%##C~MgjVR}/g-W& ]'VZ*  j{   p6Ln_~EKT6[,Yn/_+Vh˖-XHVCf>u=5hE6>eP (VX𕍩w\Ƒ-̿u (3fu ]6n؅kƑmkB./\j[w&P+^tSOI=& g ī@5^B@@@@@@@@@@@@@@zDn³&7bVaFdtԩ-lg=hEm޽{]H͛sCϟ&P7  -f쥥& ]"0&@@"+\VdC   رC #.+WԼybF-rmXWRSSբE Էo_ԴiSfkbL[ndhGo[٣UVɮe2uTw?##axy NؘtvԡCmVUV<< Բfj$2{+#,;K\ݫ__ziX骫A@ ԊKL@@@@@@@@@@@@@@@JB&,,t'% ʶl-5Ըqcl2bł(  !`Z^0@@@ @8 ](~w1c{͜9ӍZ%թS'u]CU\VOBG1gk]ּy4go{U:da]]vUnsW^j߾ Vw,`Cސw}\ Bːs%jזnIzAϻ8,]C@ Ԋ Jw@@@@@@@@@@@@@@@طo.\-@˖͛7-0˂,E:ܭbA@6` [*6޺uR/˗/_[))).X-ڵS۶mݭ=FA@(=JϚ3!  ظ1 EL_ ,З_~iӦojҤ E6lFdddhʕ_ˢE4qDw&buXM/;vT5   زE]P   @ )y9PB JV`…ObAZ6lPժUջwos9ի[6lX'RJyw5k W_}Uw}{N:I'| ٲ%|oSs愿?{O{*ach=H7 խ   @@@@@@@@@@@@@@@@Xv~G-ǂUwN}Zrj֬?^z=X7^4œP+GnkC֭ӴikҤIz8GOWBa= ryMؿ?Z ĿuI=$#" O6"}@@@@@@@@@@@@@@@H`˖->};ea<~ ԹԹsgufr%]E ʗ/VZSOA ԳYf駟~￯cj7 Zjjw^zFe;;   xSã   !@Vl\ZqF[o)S(33S}ѕW^-3 Piii4h[<=1bZhs9-?Jv ~Mu?ƽ*W.1UnMv%m Q.@V_               $… W_EB .,˂rF=z(џ.?6l([N>`5|͜9S3fԩS݄}{U&Mt1cu1i_@@[6m@@@ P+.Ν;]+>L)))8p^z%zꩪQFuǵ@z4dXG'gapƍsz\p."u-- 9 ԲI'eo@J"wj._3FzjA@C:Ԅ-               e(dM2E~ݰa ӧf[X3UD@rr <7tP، ͞=[|[Ə뮻M4y '@. رʕ+u  @) XVZxBN   1 a-b%ZiSO7P tYg)ɨ  tEOK&LpZ6.wWK.J/6ח@>UޝZJp+q.PtȑYKZZw! c4@@@@@@@@@@@@@@@ {3}.ئuֲSժUuIV\&ֺ馛\aZ1~i>e &`_|Q .=sj޼}YuY .2ڱcGS" %yTvt    ?#8B֮]/֯_6N;4´'PlLn9sΝ{UF\HЮvu#l)i]jLI)隩/~{y}Ҙ1Jچ &@@@@@@@@@@@@@@@@Rؽ{^u 4ț?|YF#GԲe˴xb79ܥ^f͚z8!$@zУ>Yf&7n233]_ݺuտ=ڴiSbK@@ ֭j .   %*o>=ònɍM,ZH'O\ʕ+ hh߾Ǝ+W^p[:tYg1Xm@-/kR ;w{oKd"j{?KғOJEMh "@V.(lB@@@@@@@@@@@@@@(y 4i, 1b7n{ռ[+Dq%vjD  /P/ 6mz&lذ ^{M6%@HXAZG@@@.Huֺ\ =jժU73"P^ѐ!CW_믿Vzz{RmŊeТ;j-\(wr %Dϒ*//:G@@ K@-                ذaFf͚K/U5e-_\ǏW߾}edQ@h(W Ӻ{4g͚5K=z߮Fŋɴ@(q-[]īB@@@2Dٳg먣r \s,YÇzQ:@k7|kת]viP)t3ft۶I5j$`*WFiz@@@ ZԊ+C@@@@@@@@@@@@@@@Xt.r5o\_|~a7c=&|H0µlB7|SWVǎugk̙ Aw@@ QJ+M?@@@ QTIFo?Ǎ^rNӦMpBqZj6!?gKK^o y=C:e?Ҥd_{O˾g:eZP6W^)Jcǖ9+ ,@VF               P͛7S{nM>]SLѹ瞫B]?s|j׮]NK6ɓݹ۴iS*6Ӆ^c9F}џg?KGy׿oY1F]v饗^Ґ!CTVR9ƍO3?a-%s JF@q@@@ ZRR;#ۚ+W0f~7Vgct?|M{, ;E{nvmҥx*O<많;jذak5rȨիݸ~^AU-ܒ\^x/۞;w|={jԩv:7_jZ~EkUe-Ph֯/zUVymǽX+3 J@ %@V@@@@@@@@@@@@@@@ ?͂,X^:u!eزe /vf233b wnkVy]Ms.& XXԼy?V} oǎ'Mm۶ETkK9DžE&[|򚈯EM6XVeo-{]=#E;oo[{y{W/z5k+Wj/ԪU+ըQC|۶w< Pzem)gB@@T%"Z䗲ϟmYY9 .eip7SfRFFFY?úCucߵiӦnJX[p jӦ{1pne„ z=-vڷoV^=7z饗NsECG-}󍼱ȴ,W޳NSkl\qq)6lдio?"9g@@D P+QDC֭,,Xf͚eۭo߾^zmINN.hxi1FN:I6Y2229؈-.6d6ڵkկ_?Yp 5p?,FG!#RV-N͟m7͛ڵW@@H\yC{.$rzxw뭷R-Jupuiʕ^ HR;ʿL9#նm[5mo!.\( ƖŽ-Rq17w}:cu%v<ܻ~X>fϞcjo?wY%5ܷ~_~Ywې!C\tIY׬Yv5P/8[mQt+33S*TЭnJ*Utwuֺky;<e}xW{6,̚7ox=fw];EJsǞ7|Gqki$@Aš.SLq9` .pwǿnd&q饗^MڨQ#u]oN+}&S @l)~=Ԁ   gcۧ{}Ow^u]k¾KApyY񹍏ۍהԘvim۶͍Հdž >[V>8x]{OM47/l&MK,ȑ#eHtknƐllJ/Ƴ{glVjx)B6fƋ 1Y}^{5/Rr[b_R Wg0҄7؝z[|P7k*9hO@:묳JQP[Rtռ6PG/ O -%tYP$og9hch{d{N6~?aRR~}"  c@@@@@@@@@@@@@@@ : }lUVɯrY &kMgYMgt?;&ֳ+{|РA.&PΝ+{u]r%ڽ{6Q]Ղq9縰ώkiȽ z]](O[0=³,n6e&P횽d~袋\XڤIt_OxAů#oSSS]SO=%ؐD@~9ھ}{7nZd} Clg}6[V~C3& ”> S"@6oo#@@@JS±@K}gݐ}߱cGPИ՟8\~cyYNIY|7;- 8q,Xƚ%5faコfW\aՖYmw_WqHJVx}߻ޮ];e"RYêUjԩ:suw]Jʾz;ۡC7k>#ݸeθr8㤅n7g szP|ynL<ƽ9y'6O=u!ef^_gwܹS{۹ސRR$ر=bz7P{_ vzOF=}7MQAe_)hٳg4n@ (@@ /p"X7IMForංgz5jBDen VPW_}B{z!Kn7VP;lG/T7j(w\} $3fI{yϹmk֬qۼ@RRR`Ŋ} y'ݶŋބ]vmބn۸qp[cy@FFF rUT)M<=mڴ ޷/mcwݕ+Wxn<]]}n<؛е&hpr xи9vxfmwyg \m˖-s>~zp=9Wк=W(o.C8|/Z=M3gN7o"MVxn\JS{̛,7VLvw@ "m pEJ@@HH5OttmBNG@jO~ȾKZ|ypg/}sa B,lk|,^p|nݺ[݀JzIYwkh^e]rX{.bwM_x`ׯ378Z bya#1bD_~/ ;Ƽgbb}涅348iAlýK\;|M4q־,rt-L~)yB' ggΝ6[hnێݻwq3-" }E\s=nرc]}&tMn'p?Ba@6dIM)@FA@@@@@@@@@@@@@@@ a}ԩ>Sܹm8qRSS?7jݺʗ/}ɛFޤa֭B k&oR?tISJq:\ r{QMX+ևN;9K8}yL^7nZpap޽{˛TQ[l7p"u& MR䮋Y[1c+M6Ujz -껟uY{Y/\M^zI^{>;9ꨣd/7ᢆ |̛(sؿneժU6 O?|+t&oEy!u|(\f͚ r{=9@B ^Z)/ Ro[oݮ]{>Y)gb>US`fEbV   Q%`Lʳ]Vc>=/J<~Ⱦۊ1ܾڵkg$ظ$/,8?>BC+33|1U\z:p@+UP\b~菍< 6V Wg4qhbUp ny9`@IDAT (sկ/M,Wϯki, )MA \utCIܓ?w}UժU;$cAO<7n??v5/e eRիWW;mܲ?cu~sȿ6lc;˯*E+691cƸ ;[lbЉ5ݎ!X-T%--M6a|k._݄Y< &{qh;g͚% }SlU|-L ^C xv   +`C.JeÆ .7w޽{v1 't",MC Ѱaôl2y:Swް pJec6+%q" kڴ&L۷+u;ȂfΜ-Ͷϫϭ֞*+3N8[I3z7wc֭kRn{mkTHO=,@z!!`υo\g\}^%YRSShU|kwjٲezר݆h+ۉ @ !              ,`=m[͞4}Cݳg֯_7|Mw嗻Ir+8p;mڴC7sH1vWVM|vڥO`fo@z/=Mꫯ*--MrNp}tٻxo\kt-lJiQhQCI*YJoDZRBȾ}gϙ\ν3s_89|3wON;ҿCHgg KV:R   j\D@BByGr9n/^,X I0qcL_\?iRlmźyY^\Kɤ>K[{}>hZn$[$1@z^Tĵ'iHJrG i4i&oPҥXח_~( ևv҆ ~L DZt+               6ԩSթS'oP ^)7[Swy7x[f4|p=jڴ*T.H111ozCaѢE3gz76ի=oV ;]gǎulL6`M6Z`ڶmj`6v͛m! )%m \;!V^zi޽O>DRv߮ h֬YjF8qnAs͂ *ryKZe={,^xٺ= \r%)/VFN6fݺu1 ҳE@pHsNw´^{5oоZ?s\sz촿6Y)STzur-q-[mMw@ 쭜&P+e)@@\ Բ0- Ij7n>j-+V $ԯf!td}zSJ/v|Æ S˖-e}ad!) vB)10 ޽;SOj%nR j5z?ʗ/_\l /^̴i25+@K}7AO:lJC#P0@=Po??m={zzy'J MVXMbh}讻?\HD@ \.  @Ə (@@@@@@@@@@@@#7xR|[,~UnV kРoժU>7Mm.B|nn@°}]_}9s/_Bt|?w  Z9r]~c7 ls%yHk¬7(G.WfM.gjԨmsz!;a_ҥ .saR)ncUUX+M|UW_܀_q]o޼y5k\ؙꫯ|. |/bnD աJ*ɓ'{>78s}O;)@@,)PP3_}ditn_<>_|P>3?bqgtR_J볰ZL,:7p0:uiW}gB|m۶Yүj)~#G}Fw;/4]}.+^=]x$|[lܹC߳e姗}r1yhߩK?-Z^k{m~#Fx%ׯ~RNSo{[ߵ[_dγvY_eݻׯTg}oǽx}'TX=nС䫕1fLޔ#=|%J${gIO>Ͼoc#}d?~;$rV]v^{{sZ7ѮgSrG@ kǔJlvC˄  " #CtE@@@@@@@@@@@@L`׮]r+ԃ>(7hX2uٿV^J* cǎf7P x=v;G &vpI]紃C!HIB:4uTo>:tHk׮ c b\x\(\L{`1SH\ NÂw%~vV{~Pk8B{Pz_noذAF^\ܠY^Bu=ETX7ߔ6\}zeR}9眓Iob܁ @ ,Z$5l(~\*_>݋@@@@ULm-]:>KF@fr^K/%_'Lp{]gEj>'s=>.f`_GzYX Ȑ WҤI~`HYO_(Kjژ^cR)'~8c?pݺu^]d3kڱcu~|eVU2IKKgK;&~x΁W_~;/ySz[}GC=Z7k}oþR7IjƍwC^sA ^DV}OT?_3\@[q$  &I             kƌjܸh䩣bbbu jӦM{2}0G}Tovu͟?kN'Nw@jJf͊b0~[8ƭj{>ڽ{ァmjСW^ @ lPL@m۶%kR&NHnd,P2  YI@tû>(]hO?!C>O?~J(MMveD[F\#Ƃ*V~H7nwJ_}U 09s6&M>ӦES2-&|\RՃ+@~r tuwkUnԨQ$fWr ߟa_~DŽ ɪ^zɑ#fsvڲm>3u9"ô)i޼yag ,_\ӧO ܷgulٲe\rW xFKG`2eJ6=բE"@ k+aZ   @4 4m*ׇ'\t/eG՜9soimڴQO۞  RVt-jժi$ɂzKK,ѪUoG\seE-) *H\\pAި Y۶Rl~a{ׯ,XK.'྆"E' /  ^-U.M&]~XcǎժUThc# jkn={h@@@@@@@@@@@@@@@\ 뼁,f̙*Y7H\Urer-:ul>%͍FVֺZ в:ux4hg ڷsNYm&´2.q]… +x&L+RD qVH眓~   D@ǎ8oǑ#G s玿G!u駟&TVZ^BBvq +O|rw}*SnfլYS˖-oM)ʛn^ov;Pkx7j߾}8+ݻ 6@kKZmڴIG֐!CJT ZgII               ilqi͚5C;v,#5ɍ5J>=ڼy&M5j云^WJKӧ'ܒ^zIP߾}>_KIu@\v ̑e 9 @H d@@@@@@@@@@@@@@@YbŊnJ_zs=A)gΜ]7V=p.&@Zb~o^x,YCtҺKtwI&n:ʞ=;h  )U|F"  DJKӦIYG?X 'LYfiƌ+T@mV;vT֭U`̨D ? ?J,믿^/֭r5nݤ/!e_Xbz{ܹsx |tR <#R(P[io4sL8B<C@ xv               ZU={z믿kѢEk۶mʑ#wزݦlٲn@SF m)2P`˖-n/x gm… {{͛7}ݧ TRX;. D]RF[j   -H}Hos"0"y8nfoޱc~m[uI jժ.B4#5HL͛7oVթS'?ٳgOt'"л\gR˖Ծ}{v˅F]s-5)j<&R#0x>5K.9c@@ ts*  @2an@@@@@@@@@@@@@4 XO?%KxK Yf7Yg5jxZ5kTjռRJʙ3gɉ q6 ukʕ^`ֲe˼Uԩ yx *d\% v|-@ .- 36@@(\ʔKGGhE /,)=4`9sU-\.)R$ ng.Y>G} 6PBKueI&^_ILLLЮ0غuk-X Ҳ><뇷Pm۪]v.f6Ѭ4{v8x֭O?TٲeK,u H|#5jh 4kvBٳ?r8@ Y+&͟/{9 /ٔ[q$               @ t#lrCi_/Bׯr! ۱*Us+W@Q,@ N8 haxyժU^=>rWRJz`p7tj׮ ̀Zr @@ quKK@@@(?tu |'OH1mnޕW^V]f/m߾]SÆ ոqc5hO ;vL?-ZN_}ׯg}^xZnѣGiӦ/ἄzu΃Tӽ0~Zw}e-/stEYfP6OrugT'# @ J!!              D@޼yuƫÇVX!mpoFӦM.1MٳgW2eTbEYV97-瞫~|>J.zyGd2!pC믿´5PB."p jҤd!oLi`g1cV5b=jٲԩYl"I. T @]p4r4sfO@HM               D@'NB֯_ ̟}6nܨ+4@7| ` ŋne8:VH`޽ھ}nX-[ ; L ̕-[e˖޺=9s @@ ZaV1   !CK.,,\'9 VZys*ַ/x(YִiӴ~;ǂV*Ur޲K}L#pqۂV^́k­\r^ZΝe:uO^n}TzYiЄ={vwق,\k̘1 E+?424f@,QCpD@xj                a :͛7{C6m؂,owź+Ez6 Jh>묳8|vڕ%&رÛ-+nfOWɒ%.b/4sUl1! D{MjE=   @jj\6Lɓ96B){son† |ro^b,xi^ @ *|Q˔)Ͷn}Ĕ1Om-0^el-4&dz4:/4f͚V˗1*in>}c~&\nN0A7tڵk-[&|`R_7;Mt_ҽJw%!/‹Q4 @-               @޼yUR%oNH )m۶‹FK,h+W.}ٲl<۶ PB|zdy1E pgσ}i޽ڳgO2xlO-Pɞfm6[[B!ohP%Jpv!@@hp QΜr&@@@oaC~#ʝ;wB-Zj״f/?4o@-m޲e6odKY虅f˶II4dHm֭}]|Zt,D/M%J JsdP_% .#=d(@                  d BX\9oN%=e![6]BI|D/'Oϟ.xiI“6{l!Lvn2n-hۜ-[D;l!i6:$m`e`d&xX߾ Y^u!Z cphZ d( Zu$-eKoL  *`Z"   @"馛> B>M~ZjysB'Y_׆ yӦM^>?xAPuj@_YV˖6[_on>K>pNvp(+75S X˖6(^LLǶ=Gq wc.)ĉͶv1o^m8eKNJ'kK x,TvhѢ.؁ҟԪ+;.  Sq  /`Z_Oj   O>)׏#H\U^ݛ:%-Xkǎ>-X-[c<|pRr-H CLOюC; V?[>Ĥ&~]R!/,,VX1UV-^Xf ѲՕ 4H7Nz)G7W^yE-Z/=z$~p_ŗ^z݉ќLG׿瞓δjpa@^@4@@@@@@@@@@@@@@@ + pEt`@V qGe g Jn:.e#GozN.tj7X^ pˎ zܹeAV`}_m*=L~MT_~k@D k   P+  @ɒҽп^˗K5jkMW$ X͕*UJU3тs2 Z( ׃6n%^?}0`5k+&~pyU¥nFєL߽;ƌ;#L  lK  0A1Bھ@@@@@@@@@@@@@ XtTv(ye#=4v/ {ʕ3N\@ r&?Ƚ k7Ƞ r@@@ULmy,b'NH I_}%e^CSo+pTdat]= (_|Zp><<^=W"->l*TW5B;bŤMç^P>D@@@@@@@@@@@@@@@@ Qx¦EhYtڵΕU,@@ vbcéF@@@ ,H륗ƌɨr@ H&IIO>ٹrҌ3O?O(;k|4xp4&t4ztdU ! jEm               d] ʖM:5ȓGKZRz5ij~}eKB@@HOS@@@][:TzA"*IO=[]V-9R>-Zqi0k5#!T=GZF3'I@X"Qq@@@@@@@@@@@@@@@0 *\X~9.]>X:yRjB"7_" Z@P S>   CH\ u*= @VN{wԧ&пp]uн'JWK= !Pԡ4ztDTJ" qjE-                ,`ZEoZIsJIeJ^+ը!MY@+@@ :[JF@@"E Gi4i*顇"Ț/ ]u?7Ȗ-L[L㚥å>}*U"T;bGk1 DZr&               $,`g@EIfI&5m*+//%8%  )سG:vLM   +Kc>4zI@HW^v:v[TdIM4I'O֜9s?0'%=HV*G@&RÆWu* @  "               @R;vd@MjrIkJ{QlYii۶Q,@@HZkm"PO@@@ zԥԭeKVנ @ X?4tԩd} MW]uz[݋֭[:$ⶽ~B"T8BG.NZ:B@@SP-@@@@@@@@@@@@@@@HZJFS^|Q*_^G@@SZE   YU`$`AkWɬ@@8P3駟Z$ Jh;v =z$;Y?x^KmFTթl Xp}#!T@0 P+nA@@@@@@@@@@@@@@@ XVll G.,=nSGIUJ_/-Yh#  @ZZN   )P'}!:[I@h\ZTAYjJZ,~ϯӧO?G{HKI<AQ!#t]Ҕ)Rh@@ @@@@@@@@@@@@@@@@,Ph3+#ΛWGZJ6MZ\Bukihn9mC@HlA@@V[x9_|3Z[I@0ɓ ]ϗz6l_5jCsȮ#9¦#Gk,TwL3n_TgOg>5M! dZ~                Νj/G%K?.LrcilKI)M@IDAT  ;L@@@ |ԧԣlYL@hD{i$?q`?ԩ]ѣW3ҡCR0s=94 4~{i,@@ H@ V@@@@@@@@@@@@@@@@ ԋ@޵֭oJZYSzegjx@@رC@@@3F+ӷlJC@vHгj4n?XR%,*FӧOwViذa@:jh5wTn:_H@~=/_y%'r8 $(@V,lD@@@@@@@@@@@@@@@Hm*ZԿg5fϖ-lW/bE駥SWG# DΝjEǝ   @hr-!o/<P* @ kL֬7nvFӱD kPZBs´ґ@xq=;8@<x"                @ >F 嗥?t~X*[V6L ϕ(@@ ,PpK@@\X 7 < `]ᅲ.JNE11tݵxAGԠT\:u2\ {!  ZI@@@@@@@@@@@@@@@Y d72 ]wI'JII֝y  !   UH>̮GH@&oH6HªEQÆ /H_FԂk  Zq`ֆZ@@@޽믗>0Fk@,pR߾O?I? YXА!RҀҺuѱ>5ɓ瞓Εʖ ͵(.7MһdC@ u5-E@@@@@@@@@@@@@@@ v P+#ojlRv…җ_JҕWJkK";Z  -`j@@@HqR׮UWI}39@ ֕&N=4gTtƍ AQi $fB RRc @ ~!               @ J!TyGZTW?PZJرҁ! E" \l*ZԿ'   )ɓ,X39@  KZZzyi\Z5'֒cת%Z%͛'͘!/8 ȕKW4I:x03kµ@\"Qs@@@@@@@@@@@@@@@jfyLAͦN֬:u ʕvԪqq@@T kxw'   @_yEjNj^ԝ ##!X! *=ԬeK`+.PzQ.,uep4&p0-. ^}               D _hd=j]4vR~m0-K{@@h69Dch   @F!ԢԶhQF\k d@HK;wJMH6%_{޽M2eeˤ!C\?#wX[7w(|p-C@  {B@@@@@@@@@@@@@@@@ j*å'fϖ*UwUR  ojTG@@@ N &FzuK_@(UK+Z:y2~dϚ%M.}TBdzH8PZB; N@yq4               CҁRѢaR!Oଳ5kɓŋΓ:t`xP<@@HkccèBT@@@ brzKjLj )-$SO?{ڴ.t AB=3DCkh +@Vzs5@@@@@@@@@@@@@@@H';N!*&gN{w_ߖ]rԴ S,  @S    VEQzDd3 @Ԩ!]s+tT4s ń@4 (}lY4! j)%"               @HZ_`nU^=jK;*_>䓔Gf&u }RRKӧKǏgl#o5iU(iܸqf@@ =vZ_G-B@@H9^vƏOR)>Ty]W{=:*}aLeNh5j$)"dALd6mjդ1cBki# '@VYR               d@Z|>_\ ׭[)ShʕqaeڵZ~lSӦKSGC\YrU:x0cZsN}WZ|yo5D@6{m=   --SFq}G _?w_Sx:ӉbQ]CJ]'zTl:^s{4`4}侢 ) P+P               %`%,z͝;WÇ;{:7j+\zX jԾ4xT裒w0ӹ_TDc$?ف D YhVj#  H&I<"'8U$*XZ5'c3sGV{Lg__ʕ=#_Ǝbb#j&N  ZH)                ۷t9GStU Gf̑#Gʖ-ї///$&q3`ACS|nĪbŊL2^B IODv  *`jEͣ   @vWi^ڳ'B*N5H1\Y1V ǏKo%'4g?X+%  Ӳ?>+MW\¢T@ 536               YFikua4^~::u*U֬Y.L۷oo͛7w޺袋m^~e}'X{1/^Gٲ_ ??!CW_UZW_yYMuM7yaU?~I>#mӠAH' Z(w?N՞۫p^q /sʦjժy-?@@(n, @@@P .}/g矇@{95kL󂭊+뮻ӳ,*G :# ޽ \=G;+*㏽`{\gz1`2cRi^+D@;D&@HZ)@@@@@@@@@@@@@@@@?C/}3f¼X;~:vn}ׯ/cbb}>}6 =^}Ur6L $`as} * $ =mlB@@@@@@@@@@@@@@@^<:y^u,YRe˖sӦMuYgiժUހujtm]٣}i:q:u{ 2WR%;TR޹6؜].]ڛ ,믿^k׮uA taoi9rDǏ޻۽#wq끕FiK8 ;x^}8{l65+~{gQʉԥ6w 9KmH\ =JhB[N(@0;&P+nE@@"\ _>iuq;O"QT?"~s_)[ooVB}ט=w[iƍ25}W^yWQZyh}*TСCuwhuGBߣX~ o{=9݋@"^}EՔq")4@ rb.               ؿ? R: .p5l{6'8]ع6|>\n ˗/իuz#GqΦ^x[9R7_9sxyyk7߬u֩cǎ^ӡCh۰aO?y}mSGIQCFJg%G„  F@Vll 4@@@(-4|4sRf҆ i,H-0ウ4i ep=GK/%JwlU>K_}Yt~* (u.=G D@ QeȄ I@@@@@@@@@@@@@@@@ |E?{wS=cϾLv %kR))n)O;E;) Q.ʾ ٓ-\kr͘Z^8ι>Ϲ|mAV{Ѯ].+lyZ_vQ뮻NǏw;rݎ;\tUz/tm>}Z(+W&LIO>)pұcAUU* je"'5ENI@@@Jm[i2?*Uoj nSmm/^TZvZum ͛7//H?J-[JK&hW6F ]9Q!Wu* @J#               ?8R:uJ"-Z貢XB2eRe'yۙٳg/& "##6gz׌fYVv*{w߹A]M6kwwc=/i…ʙ3RM4IW:ΥKԩS'޽;jY/.sԽR"RҾ} s{$ag`k@@,P+"G@@@BCBirɚO7Ӷ"Y)!=ML펶N:@n{ܱc|I]O5fYiTDo{t/0,dI飏|ލ YOXC{&do* Z>1               #VO /f;npٵk6nܨS oeA[olj/.?Yjʔ)W^Сz-wC< ۷owWcAZٳgWѢE@,[o![6/aX/^Ԉ#rR͚5UQ:ӧl}eVzXb^O(7rBĤAt( ?^KV…_ſ[  A&@V]P  @Ҹq҇J԰woW@5q/*Y'O=kwqĉڿ[f͚Ӻu*}=̙rХƍ/Ҧe/AONtC@b/*cۊ                 x2}unpBiFހ-wu]N:J&QF*Wz!ftȑz'y3,EDZ/   ? 8ZTNۋ49m4\Z,&MRvԱcGuE:tвe˴h"̙ӭms֠Au3f+"k;0`[浶>.}?3ƝOR=^xQuQ޽:>j۶{k3wK r@GE= " @@h<G              `֏\F8s7iӦM*]7 :q9s˰.]]v;Qxxe{a3l۶Maaa*^;o?L2)]tQ;yz̙3g1cF۷Obɓn(X%R\/W_VFNPPN>.@`F _<KfMy%';@@I G*\~I`@&=4~#oHY;"@۶#5y`]@ȑ#TH+Vcjۣ… n޽{ݶϘNi{꒳8{VGCi9q @b<"Z%U# @ X8K HB N)7%A@@@@@@@@@@@@@@@&26eC4iTbEծ][Wiz:C8[`AZ%KU|Blٲ]eq-Lˆ ĺ_ʕ+uew|4gwHUJ_|!v -´`@BKcGDV-   @`Xx'xO,txq`R@ܹNe ԶG+w)S&3SMo&-^8Q:0r渡!аT;Q_j @BJ#               @ Xg9rxBZ^( K/X!nY/>D@Ucɓ   \@6oIK H|@Q`hre),LZJwd3UwoiȑX7a !+@V^z*               @ x:jլY+1͛7Nh޼gh3L3}mذ!J!@@SJ   @LIӧKFI| U*\Ӗ,C hsco馄G@ +}#cI?$/U@ǎrNAC)A@oMI(                ࣀu7o. {f _Q'N::=SF=۳ۥfͤ9[H s  @ t4ZAvY   ݻKMH]HjI>+  Sd(_NeFNSsDo< P.]{O0@ʟ_ZP喸`$T sf[7{)M@^R3@@@@@@@@@@@@@@@Va J6mmX d͚UZ=zHjpi,sg:*Y2]X /    P4o;0?<締-*QB2p'#\?,-]i+4ƟzzKkeK*eA@ uS@@@@@@@@@@@@@@@HuOg wcg}VڱCPs2em+ޗ  @ W#  -&#m U(vԱt`hP{@ {H;KuHnf4daZ ud{"Pt睞@ЄǶ Z~               A(`J~!1#ҦM҄ ֭Rj{B@HBo߱C!  @BԩW_IKeJFI)Z N_I>+.4I3G*_>BH^<-[@d P+YX9(               $ugHiHmJVI}'](5i"U.M,]  :}z)[@@@]-륮]% _C׃# <)T4zg~Fu`9$@ӦR"{%9& )@V`^7J               @ DFJG7@*UۥseLGz Z5C";'T"թ6A 5SZ@')~uk|y:p8@@ 5.\""R@@@HFUڼY6L xqikSC -pfMH? L ~9Wҍ7JKI3g`֍R#%K  j               @uX`=LlkYԪ%My!oJ'O^}ߖ-@@tIV|RG@@vmF< ڇ^6r玽N;Ǿ5R߾RRӦҾ}ȑKܒ\ >*m"͙g Z}}(               !/=Tr yJ[Ǿ5@rرcm+=T4hPrTdS@@ )ɓG   @LSOy/%-*#4itbڴyKH =eH5jH~+Y֭?HݻKYDI8@ŊRzһY9 %@]J               1uW̝YGwO>)MN,B |SڵKz =r>sg̅2D:~\jQ^[@]a϶Ö    yf?t4mTԥqc(۷ΟNK_mÒشIJ ?知͛=[%J$o8:@^޽_J @j@@@@@@@@@@@@@@@$`ԙ]tR :#wrIy^}U1C*UJQag-9{VjDZ! 8tH ;    \-puR>ҶmҨQҥRRҊWoϒYS*TFFJ:]%$TT4|T4gےݫ  :Zyُ:u D P+                uH}׏<"e})uٻu4v/RJRfС.]q4gN֙# @ XiIe   Mu"['M$%U.5l(M&ٳ{oZ{SV>+'%=נ4o{y^$ Hch_% I,$p                3JjIaaO^3@M+u(]+͘!?.z4~'D[OoVӦ̙ޥL@@ >,ED$lF@@@ ,uki ̙V<8o)W(^;ti[ʒ%BW ikW)o^Oώ%K{#<}ud@Ҟ=-@Js.@ P%A@@@@@@@ @@IDAT@@@@@@@@8SliR@0 X\fRΒuy)Yuh1   @Çb=   "-Էy4mtԴTKbb۴ki ڶ2dHRp@5k^4r咚5-OZP:rD4Iԉgpv})/ вe( e@@ J9k΄                &԰s'U"',* 6>F_Ljc'yFw]AK\hw;erhїe̘Q]w3eUB 8_'   @ٲҰa+HSJFyB+u&u.9Y 8qℬ;rmO<h$֞x|tEvo!sʒ%KclvaWzܹsK@O,m&H[WN{tmRժ6;?)2@ xz iLY A@ ba1               $Nt6mڤG6l6w1;Xq  *Z*WbYXЍ7ƂqoNVU& 믿@. Ԟ={m|“/_>uz,,Wʗ/*TpŠ"RY^hAOx^=zF9BwL:v:'4+yo];UydrBœ 8y`?=D*7gTWNm]@+w -0eZ6\tE{vevI02PDfe0k vyehn}ڮf̀ Xӿ3   $H/ yA{%')?Cw4胵'Zx?susx{]I+g֞am=xtfM~LۏjS- z`%Xϖۼ{Y{O<~TpawvRMaRWp'Dk|ivZ5m[9R:P-)gGP(UJj@P@@@@@@@@@@@@@@@@@kرc.]5^ /W5o\eʔSvd 9Ոcy;۾}YF&Lp;X'z5k֌of:W b&$ѣh&zS[v1w:XJc+kge\޼yݱZjWcZv-[掯!Cխ[Wv;VZ :famޖYҕunh!Gу,ԨXbW!eϞ]f>h!Z6'+ d@ 1tBEc>omvZ'7[o|h_~nFZVG@pƸQπ    .Ԫg?\?^v9QRpnpo%4nY\nqiNއ֜i09mrl}?.["-`arIcH?g @NSꗉ  A%0r4x?<jQ@@@@@@@@@@@@@N&M˗/w,4B4iheʔ)Uv:=-X 0 Q-ZM6jܸӡӣC@ X(ў={4ڵ 胅c`AC0 !ʝ;wԼ-- Ʋ"RK:+-ouye Y m[ힶ?;=4(P4~ֵJt`?uf@LɖU͚Ҏ 7`  -#G.\ ܧ N>DSiv9AJi@w,|ɭr7>L㎸Oʵ''vuIYKrTR%UX E뒲 t,{o[DfadLf}%TVrxFN<9 ϲJY1n3֮-]w]EP=Ο(< H@p 9vQ_q@@ P+)9             @jXGlƍĉtRȑ jٲ6lٳFR&c͜9S'O֊+@{W>4hbeD >}Zk.wj{u,D?up) E͛ ϲ-@!۞`pehs6Z6o?+>)T;,XН)Rզ V| ؜ [Y39[K3H)&  ,@V_<@* Xk9U3YjU\?JOi@ P+ם@۱'  Z>1              z) =鑯M6jҤҥKG%M٢ܹSSLф rJ-[V={TN3gΔ-LٳnXe;ܩhx(3=c?shAYi1/ʌ*p97`bvϟw-ZT7p+ŋ[Ʉ^߷'Pw+D T\=ߡRc  @ @pA?5ud[07\B6>H孯5+ٯLM/:D?:IE3fw}_~}kMT^='.mgM^~M/vG 8;prȡF9ԴiS|O-͚ǎ h-]*'Xs>kζhծ:M  @P8YʜY련@^@_boǞ  OjF             ,h 2Dk׮U]vʒ%K*Nj*5J}.8vM> Y@϶m۴e˖qںu#_mN<c=e<6FDD^)1A(`y߿_e. )@}$՞e$fCPNTTgZ15 ~)0qr\ @ Z08KV@HZ c{@@@@@@@@@@@@@N;/6nvfPUVMb,棏>믿Z pÜR)X'Ojڰae۝/*<<\ t;eNghZ  ^,`}WҧOҥK\re˖U "kAV2sxPt8O@@8Q`B³-'J:>bl)#vֆ8|}nԮ][-[hRJž3kNܹs5m4}ײg7|:vv)_|IRS}={$rBפoMء-BV+WJ&] %UkԐl̛7agk@ lD7H멧${π j%x;D@| P'&6B@@@@@@@@@@@@H :կxlg,!眞ƍC:O<*K, ?X͛7kڵfcgϮ2eʸMEHNT  XGi&7Ѧ6ڲӧO+mڴn筕*Uҍ7莕+W&0gb@a!.Уs!A@@H!R gKwGʓG ^˷߷o5wڥZj}j۶m.]~F^-X@&LpN8͛;Txxxjԧd=aZv ڿ?99_nx-#'p{'ǽ֮ii8ɂ.\zc䴛J6]K/JٲIUxneA1W{馛 @guJ{" > !            ٳյkW0ۺR̡u駟'|zU,Yݒ%K?kҥZl/EDDZj\әMTR @dpN/k9׮]tι ;~ͫ5kVZQcL4uhzPA^=OgU@@HRS  K{$ [:~.i>IjݺҥKG@ lݺU y̘1ʐ!ke͚z>-˞@;rܹӳiBtóZU "<EF L9l Zj%^@۱'  Z>1             @2 DFF_վ}{39r$Y93ԭ[7ɓGSNu:4rz4 ȑ#Z`-Z䎿2f̨NM6V^-5 LspӦMZ|;ZmYz뭪_923g_V.8@z98@@@ %J e΁@h l / %r:8Dv)} :wɰZ'#uWVc7Txx ={!kvo//> ӊ%mZ9RfRʞ ڃu |Hٳ ZWw~`@@@@@@@@@@@@@@@@`8{:w:}ӣG`_խyZfڴiZjiڴin`_2\pA?fϞ+WTܹztEuQ*Uzc@Tʖ->[ʿ[˖-s?/^#F8ȞSݺuucժUF H~e@@@@psR,R֬O/]:_UfM :TrKמ'@'azj 0@ܳx]Y9[\mS4p`%#\@R~ҧJz]@t+%B@G`H9S'j             8ղeKO8qjW_F jԩS5k[oFgΜQFԸqcwz7i@`˗k޼y3g~˗O-Zнޫ (]t]tI4aԶmR   @\9r4P#ڌu @3Ν;6l:t,%n>5mSwq+nڇɞ-2|b/[  @Bt{reBb[@8tHzi~Γ'A@@@@ ~^{M 4PZn:´'c/PBmRG3OٲuWDĻNI+'O;ٯy~b \@ҪUҚ5x vG@bKI@@@@@@@@@@@@@@@@ /f̘iUZ5C kѲp{GWvY, ?ݻeKtwk޼yQY d"lٲsG I&ySݺuSΜ9TBIaOmsZSW@@@BKŋ$n|5jL3mRXp7Rܶğ~z^~U] ׮6nNix( @ ԫ'.-#'л) !ՠ                ]`2di;[nU̧@4i4~xȑC]tIŒHVrCbJ;=,mtz;v. 6L5k$L+U'GH6nv}? ,T}Q3P7P@ ZNF    KԾ}{} kUʟ?̙>/oܸ/_bŤM'FL:qBڿ_7O9RrnE@dMS @&jR@@@@@@@@@@@@@@@/gϞ뮻ԣGL ݻW{)dѢE;ޒY?v;8qbҥ hѢڲeLttT{￯͛W^'O'|_9stiXp*[ :>oF2$^HB={VVVTL%K|իWkРAR^|XK:Z+Vd̘Q<ϟKԩSPq9r䊭y@RjwH5jH͚5 @@@@Hf{?k,wW^-Ti'fϞ,YR:kn;={ٱcGʛWjPKrπ ;{B 2!@HERS#               &L͛o'P߾}JjĈPcǎcǎƶ<΃ʣGAJv=,H)% ZFP;Nol~=>>w7lؠ5kihj\aŊ5n8^6_/@ ,Y V?"aggׯ~>'u@@@@H3fh5j$IC񙹯Lbn=C uW.<<\J(ۧX{P@@ 哜lC't $Z @@@@@@@@@@@@@@@Hi#GsãRz}/j={$0`7lΜ9y'NP5j(͝;W͛I#PjUu=X4i|>hClٲQĴVvY7tSvX珍7*^x!݂jy2eԫWTSbk-ĉ?>l{`ʕ}>tzԭ[xO:[x6(]+s{I<`5 Ky$W~;Dr[w-[a3   $pYG]vսޛUg澂 o;MBw|=~jo>}z? 4CKj_Ώ!,н4}{#Pu@7.)B@@@@@@@@@@@@@@e{vqBʺWRE֡_…\uqȑ#jݺUrըQCSLI^u,4iӦ:v옖/_._CŮ: RU&0iӦjҙo3:]ԡC * (gwćp/PBQ믿zլY3/31w1筛w6UVg~=zk1) ܹO2,IFLRb\ϑ#e&C@@@ (&M$k32dH/5 x#{)RK`u.ۼTR_6 @ 8|c4@R @@@@@@@@@@@@@@@R~4h ){ٱM&8U駟Vu͚5KcƌowyGFXPUƌUR%[뮻KgΜш# ]߻wo(P=o\ǍrY!bzd7G}&Mhԩ->֬Y# /uh`ŋW-twuo>}3h ^6 .͛ W_}UYdq9V\k i&uU>`b{؁|=ދҥSѢEr%< Ng[c5{l^R޼yefCpnݺaÆ}ӣ>~M8ѽ7p>sܹS͛73<\3f̘!wn=^~e1D g?ԱcǫM+/¡C:Cmg}ֽ.]z=>}Zg)wr'FmtŌ/ub~YD ͜9S7|5j~]` !+b[N,@cN+,]~{ʕ+K.Νsr-z'`]?v;po駟jQ=b^-cb~ye   y{Rkyfnݶe˖8={wU$_';~|{vU8f9رCUTÇueN|a|mObV8z^m;N҃s0@xҤ:u?rB݅ @{Q@@@@@@@@@@@@@@@@|bŊURxbY6lP^ " rUhw֑#Gk.7`B,ԩlٲm~nEDD!\ԡCnMݺu` l˗/wpIŋГ7x#*+ !ʗ/^{ʎǕ,<(Pô~'YG|vogΜB,PQFljժ9Yh2{?o Ynl٢ڵkĉNR܀ pXۄ  ힶ.gW2}9B@{Yfn>rTbE-$)76)S&3K в sԵgYתU3gN7 6n:w}^GAq}9_y;yjE@XX)=yxx] :[l!l-fak!3Ⱦ+o8mw^xh?[,~N-҆W@@@7{^mSzgK,qGn[d~ԲeK-t>=3:;~l/ckO>c=7ٳ{Fl#]w]!kӰ_ړ⫫Cp7vY{ @ 8MzUi|q}WQHBGB^YE:"M, buŮZEB"K]@R {?$$7ɽyƹΜ󞹅x?>GD@ kPLy                Heߺ0΂9ul٘1cԮ];wh pٴi9΂lY>}|AZXgkVᆱ߅oUua[ ee:?tPzey݆ \@B֭\F^h׎ƺ8 JP6,(Bl6 M, !^Qf;of3{@… ۴i՚4iʷ mic*E"`? ! !7©8r/n]o¶U^4`wgh֬z׮]nhYuzmI82c@@@0_UR\Uv[egΜ3B s:~{h냹ѿӻg޽;~FÞ={\V׮]եKYUddftOUFmMv{h9xFHOSIo+! 9qSUj                XXMN3=uZga9`Ekݢʕ+XutoSN.Pjժ.xfC? ;;OŋuoA5M6M?e>ٝ.^}-*Sʂjrblضm ˉcteaEcZ^z7nxXVlĤF~B q,³:|pb ժUsk ip3'H0>|T₿C6oܽ̍ FU5{lYHiِV.ϋm-B1CJ{o@( 2smk 35^et=smft-y2e ^3mEse׹}/ 'ۥfƔGҼ}ZKJl]9 5?}OjݺuAڑGM7m+ ɲS ɲ^̂iw~]ve.m']z+=)   $PX1w_?딝{VW{cgK.uχlk!?{;p?|{fz'ni, ̿3+2{vL[+/8-E i'wF,F@ BԊE5@@@@@@@@@@@@@@@F6oª>rRfڵ^;%^Ԗ[P'6..N-ZМ9s\i^j')3IJ4xĒVX^4HzlaӦM.&WcA._|^|Eu1Tj9{vaGua(Q"zԨQ]3 n'tPs,L0BrNyvDzŞ={ԦMdgleҪCZlZV-7럛:3%#j]*!k3kPlxtY՜ ޔ )y z]9Zg  [He7|r/ߋfjCVK.DӧO׆ ܿ,@;@-̵ Xzb   y)P^=}׺I X%wBd95nX;wvl`'swѰzj,S}je4`ښtzsNm߾]v1 @>C馛@PĄ@@@@@@@@@@@@@@@@8uaPpoûZWfҥK:駟udWRWP!)R1c$?;ܸq4v9EԬY)/tذaZlx QDM; !(UJMzH1 Zyϡ@@@@@@@@@@@@@@@@&MTreM0!EqƮGyuf`z٠j䗹`#JN}@IDATd}._leXx{%we˖ (ۿf͚]@Wdڵ駟^>|+#߮;vw<51|/KHc;w[ӥKaiuAeʔq<NL/GVy!-\0։ hXX_LؼyTzu5h dϒzLӻ6]D 7$ޮ Wڛڡicj_Uߺ@D4l!P+uA wT_qƠ[ V:ӮQ^|E٣G|ts3Gz+=X   @^ X U !{[=gB6q\'{l~Ң e/`T;|&_v^zԿ/^<;E/ @cY!("@CC#               jnp̅ L4I;v믿nM}СCav6mJvش[VW_}51i֭Ct閛 A2{ bdĈI0'֢E -_Xڜ9srp!-:N6l+-SRgڴinޮw}WgynF,Y-7nl~X_9)Shʕ.63Іmi0 !c=nPY~ilԩ^mm&e۶msSS 쳎+~m9RWv!~͌3dax8f-oΝ-ad(`?KoO-)263,;tkNO>?tisqO9ؾ}{׍gs5ڶvY7d^~=Ř1cT~}i%K\x\n#YŊh3#@?8/^ǚG0S-SKh]c -7a6mォꤳoewUz+;,@@@@ Ly;r=jJzow\\mG}T'NԠAeG)'{;p?*U|y-\uÆ ze)3gϮikUj~w=c.@/СT~Y @ xÀ  Æ(@@@@@@@@@@@@@^'p/*XŋN^g nQF x(X[^N[op#<666pW0r׸q=8]ݭM, _|EG;|?㏧)ѣnklٲ/4,+gycǎ^z饀Fܹs/e֎^`[ r s^hQtSÆ ͛7TZ5 6v 6^BJ*gy&/y $ xC f+ #r^xT2z{۸qcPDzd'\W_}{_{1:gT[uVK]vݷm6^ tMĶ3G/X#`f/^`P p8qD? mWz|jj j]ÇY&+pȐ!Ez5j(tҀ٤o>`͌fs)^d^yWLzCF-[\ ^8\ _K?Vʰ{Z9۹}icF$ǁ>]~a^W'3pW +@ :g{ 0jLK2.5~"W]aeèQ^ȯ?^GZl;L{;A@@ ߞN7k,дiӀ:NY*TvB s_}Uf͚?[9i?;3dE;u /@H^d،Y`)WE#^XP,y^m+VXj")yA[*SLbA^ y!{n}xAK[ 8B%/$!嵘rޘ8 6vyΌorLSرc5l0۷O^*/TF[qk8W!@.x?~nYg&/VwijrvIz:x Q2]ig{,c@@_TVV/b䘀=[իWӓ='ɱfPpF>zlؿmhѢ%s?9$E0lKj!iO>0'ʂ5b2?W_~L 9+vtK:(@ }ݻ[@7Oj.mY\@! ! P+             uvEiZtJ.^u<׹s +|«iK3gt(/f0. 'llѢE^V+Svܙjg*,z Ɩ4P˂R:ȴ])˱PσS(Z[rkY45q9s4zhM8vmݻwX*Uӽޛj!@ t¨NG뮻.h*  y#@V޸sTY`ӦM^F(QBӦMS5#Km>^ pf͚eMnn0yd}?aZnsXČ5uhlW\qw֭[ˮpfq˗ϑjnI =yIm}0m@}ex^C>N֖P/5ZMmͮÇ]'=eŹ iӦ->W@;vjժz\)elY)&&Fk?ӧgeàV}_5    dNh"SM4ȑ#̕[wEgyfEMw}~Xw^ux tMYȗ[i~|D  !! y*kSOIvi588             @ YF۷g:7+YdJ}ǏkVz^~弯P58t>cYx̧~´:uΝ; /T*U3w?~\7xƌ# `;S_}V$g{? @w2dHX'H`5kf̘K/uA]tQX Gm6U^uka  <"wI?7D7H'P+ V# -PT{UV_+W z6DB!p 4H/C\r(2@`ҤI;TD lyQjDiU(0m5G"]`ny/%͛'k @P@(<4@@@@@@@@@@@@3իW]Pif5ygs=1 ΝfΜ) p .iF+Wγ$$$$;v"Ed#C >|X6&J*t pBey۷oWƍwilR111aUTfڗY; @nEZNg_˦D@@H[@mX#`@ofzv'tmPBspqV=ڵbŋvPa@ Lm"-^ @x]@@@@@@@@@@@@@@@"AଳҒ%Kԭ[75mTw U:۷O7x 2{WtwDTE cц-^oK /f͚:sպukhB 4ȵ i ˉ`p-[3  [izN=# rH                vUT… իW/C޽{îBӧOW|r@iaZ 0`ƍY֭ӣ>8Y`9眣%K`-kYp͑#GR+e @ Xx_|ÇpÆ *>>^۷ѣUbEھ}6lؠ#Go߾2Lˠ;5j(G)"G)@V/j   @( .Gy֭nvժUKCCy(ʊ0ŋgϞ:묳kԩZ`aZv. `^(U$ 'P Wmj DkIO=%9u             [`ڴi[\]@Rlllnt.n5c ]s5zWUT\Aj߾}Zl,Yľk/*X֭ƍmիƪVw oN8M6=WZ傣,|^6mk׮Q"@3@+0p4iqT@m'-CU`n|yi<]pex֋@^unO)Z6Ν;KÆ i悴:tR#w:߳nV\Bn?xuY<3ugȦG[{Z@OvZnf:tH r!g~դI 5L>sO9OoS!@T.ut}Q`  @&'j @{FS޽UJTaad =ٳgkر8qz꥿oE) @+V>ynB@ P+jeݎ=@@ @@@@@@@@@@@@@H`.XkԩS~X={TLLL(m6[oL2z衇t7`ט\صg1ZʅX ֭[u Svm/駟8ڲ^a[t8 y pm޼gmܸM7lؠui˖-N>>֭ F 勋˃Z!3^zꫯ 5O5D W'+    R@HXtyM0A ^G]~ѣ{V)8zΝ)ShڵkZjBӮ*oc^! jRz|$DZY?Ujeݎ=@@ @@@@@@@@@@@@@X`Ŋz5qDR2`s~*W\,<\s#FpUPA M7ݤ… g#VvZn~z}\ ,HF:TfM7_+@Z@t X ]ghAYB -Xl`:u^[Zgzw^B2GK?>H|D  @ !@Gѧ~!~ڿy\r qqqi5sL͘1CfrVϞ=ջwoժU+@rXCڱC߳(@ Z825CV@ȼZ7c@@@@@@@@@@@@@ # x{߿.BKӲuV7No6lؠ֭[[nq*T(N\yϞ=.\kӦMG ?SbUZj^u*UG #t+ .sNeY޴э:lHgv&-DSN6K'|_H@ GHZP:LȦ   mMH 5w\wq4vm۶ Ԯ];5nXyX>]{> y={֬YㅧVյkW7֬Y3h= eL /]qE5"y,@VOZYcO@@ (bb#@@@@@@@@@@@@@00^o:o .]Z]v׹ر)<&N˗L2ӧ jРAѣGC{,{ljX]*Ur[+WVŊ|ʩo飯4T_~ю;NZHh:?,˼J*p5j;jAw111L+mP\9(AXRjPZZ[7J@@wjSJjuϟ{DjժZl-Zy- 8vVZKqѢEsbz7.BuAw+ P" @x棢E>*SQ@ _HV@J@@@@@@@@@@@@@@ ,h„ nي/mۺ."Pk޼y5kpڵ.PG+]s  3FRjZh?dAsNY8?(P@e˖UOSO=5hrmzLY_ݸgϞ׻|,8 6DŽd)RHbhtUVM-,˾/^:Tj l֬YW @ x[}{yA:T@@ P+N7E  wZ`/^%KhӦMΠzjҤ6mꂞ~eZdak7믿v:²ޯiƍJ `B ѣn"*L#@ P+링@۱'  ZA1             @Xg}¦fϞ}yWphB͛7wa%KY~֭Ӳedaa6Z't'NpuA;vyGPRDUҮ - CRN-dȶN Sv[V2eXt^۲xYg6kcccS<i XYؕk\޻w|ivЪKoM Z~}bxbc*U\pt0 +ull9ʲ?Z{퓅Ɲ;wN9^~'|sYgYfjҤ;N>9 4#,$iP$m4Dɮl HõiѢE2h26M9/dGSN=-BR.&)Ӥe }4kYj/ggÇ9Z`vr? YpZjaj~h!I۹f@Z+VQFO>b =' &m4@@< P+9$DݷP- ڰaC|_~q/^\zIQٽt[sO:{Ԧlž1RN9=9p@=_O9VǤaNS:u\=Se@@ fI;Jk eɔ Zid<.M@@@@@@@@@@@@@@@N.r7{Xu|qFݏ?fy=Xr"9N< ,xAKTzu7y普c̖RKZj&1iǍrJ+)i vڵ+Y@"O:F`f& K*fbYǝ-ϣmv鿶}i\].]B]4!@ x?E|:   P­,L{hZ?vyR`XٳH{'>?9qDjť<|Ɔ} !_2i=\j1  ^({H5J<87̱@ȼZ7c@@@@@@@@@@@@@@@Ȅ@Un]7[ X'w JcYY)Cn,BlEgI{;v̽ON-mnZmmOBRޖĸР)Ygh%ڟZG{vC3fPÆ DIԡCw% K0E@@@HDecf{xYFjWׇ{}<Ogh:@]{Fw{5~ ,v@@@@@@@@@@@@@@@Dq&U hʪ^TR%-ZH^z.YV#MT 5kx 0@dj%`@@@@ѢEecr2lmGIݻwp[6@@ Vz9iB"@ ZH@@@@@@@@@@@@@@@@@ J.‡ZlB>/+um Z}2eB[&!     @x 4h 5l(v 5                xEԩSճgOuUƍx뭷t@GCR^#     }J&HGFG{i% @d Z#                @w7z6lX"Y+Wjҥ馛r@)wTLDVJ#     @6JڷOl® @\O                 @D (P@/ʗ/vڥ*oj׮??!h=*`e.*"     @>^]jF;V|P jE                 S>ʕ+hzS\B"pa=Z1 I~@&F@@@@@ O:p@*Q"ZN[@"EΊ3E=@@@@@@@@@@@@@@@@@ nM4Iz#Gz8 _~ٍm@ J@@*S&JL3@@@@@@ WJGJS&[  a#@V؜ *                (Э[7͜9Sf%\=IBrzuUWRJ ' EK      eJ:IcFAci" @D J#                @n mV?_ws,>}֬Y=!@ }#     Ro_i,yϽSa@ P+5@@@@@@@@@@@@@@@@@hԨ-ZiF[lZSh׿Ν;~lڊ P+Xl     @>M*\X|@ jE                 j… UhQ{ZjUnc!_|x mXXVXɒX      @ +&u.@  C@@@@@@@@@@@@@@@@@ *VN:j۶/^vuB'3Ϩyj׮]5#@ R|T@л!     C}/lɇI -@VD>*                y!陋|g.袋.'|8 u>}z)D@tJNwV"     @t(-+ %@VD.*                "PHM8Q}U5jԨp2zHm۶_e- Y2+     O8W/٥U @d x_Q                  Y[orݻuf(A K},XEeivBHHJ6Z@@@@@H]o_OZBj0mX @n @@@@@@@@@@@@@@@@?Ouk׮]zg]iP =ڵZn~F vj)B     䙀=bYS3@<; @$N"a                 y{ׅjp ڽ{F){l.oTz+~@@@@@0>}$ﱣ @ jP @@@@@@@@@@@@@@@@@ ZM:pSFт8pxO 4:R)?t5B@@@@@@[/țsT@R Ry@@@@@@@@@@@@@@@@@ ]tѿo-X@:uQ"O?gM}"XVR`     D@FgHGei4 @ '*!                @d njmذAڵӎ;"A>֮]Cj*W\XՍ @x !     }H&H'N9& J                 kѢE:tڴiM6\ A;Tݺuu뭷dJ@Lq1     Q!лͥ a.@V                 +PfM-\PJҹ瞫.rCB`ҤI5l0ƆED﨣GȨ/D@@@@@[WjP?>wQ@HO@tX                dS\r;wիvi,ݣU`޽;ԯ_?i&Zh7dQ !;z       @2޽Ǔ-f@\ P+9                 D)3fCԩ>h#!뮻C4@h P+8E@@@@@ x ڽ[3'}@ P+'T)@@@@@@@@@@@@@@@@H!PP!?^SϞ=5r[0@F_]JJ{C iilb@@@@@Zڵfͤq㢖#@\ԃj                 ^ &&FÇWrt7jzC;vhƌOT_WO6MwyF;]6lЫtQ;t蠮] $$$[n5\K/4 H!}L0"   {'Of=+BwtJB4޽g^]*X0jO}@@L~i@@@@@@@@@@@@@@@@@"E z衇t})?,Y:ܷo_n޼Y[nM6nܨW^yEVҩO?]o[VD U\Ywas XKG/@fy> GS@IDAT@@@@B ߻w~'|;:%!D@^RB4sf՜"'ڂ                Dw:z.a7o%K7̐⮻R=Tz 78t;<͞=_gyF;vP߾}U^=f͚ڽ{w6Ț~{O}ʔ)B ,PzPp    dW/X@O=8 vm?~|v YyJP  @cV}I]FL( @>g9                 @GӧOפIԽ{wYXU(se&LVH|VkU*U2܎ زe :bސ5 @Ćl    ֭[շo_?~Ӹq/kѵ^lgΝ;մiS=^z쾰o륗^ҫUV's='_`A 4Hׂ \Eeo6w+cNvضmz--[L%JP5'qzSN_Bx W[1CmG`;UG@@@@@@@@@@@@@@@@@-ubiAWgF_|B,jʔ)ZvV^nuM 겐+;رcիW/=ںuB,XB:tu)..N'NT֭yTOk޽{ռys}z'\^zZhQZ0/:]-R& @6!    @ >\ڵg킭ʗ/>}| 9]wu^za{VYM[X݋ٳ ʲgr^z.lr/Ϝ9d{ngY^~sY9e_xwsꫯVLLwM7iȑ UV 1{cu96L@@Ŋ'K*@ P+5D@@@@@@@@@@@@@@@@(+ :~cקux:|'uȑ .u3ϸN0m}jȐ!ɶղeK_wmΟ?_7pu4rD@aP@@@GǏotaX\s]F w_*2a *aÆէvڷo s?Own٨Qr k׮-3f m-kӦMZ|u&¼j(P@w{ma.Xb>غu+#..ҩS'nݕimrk >h6@{KӧKJ @O@;'@@@@@@@@@@@@@@@@TZj#KB4%,_U&M4m4ߞle˖UV=z$[g3 >iYݲƍ';ʴ>ǫRJ^znwfa[ ~']uU]2d]@۱'   EԾ}ua_f'Ot J_bb0zh?~ݯo֬lڵkkݼʕ+i]9WdIwxZ`jq:v 0`[nI[[k.}n]SLѤI\طzyK, V{T}H3f&0@0 P+OUC@@@@@@@@@@@@@@@@([fϞMל9sREݻ-[[n=:l+V~ȑ#-L5\ AjpZ~ǡqqqjѢ]n'`Sv ; !") @@@7ǎQ kOmڴqS.P@67]v /k֬ц 4p@X7?eÛoC QVw^}GnlԨ,4+l *V7xCuq~{}7~H"ir@|&PԶ4qb>kA"4QI@@@@@@@@@@@@@@@@&ŋ?V׮]u%xSٱc\ҸqTJ}+1߅r?^Ju2O8: vҥK: 駟udY}mPB>sw~Д)STDh buB)@@@W}…Z=+VLyrؼysE'7mTs{f` >I&`.$kCN/8~ZlN}u5gW?l'hΝ'-g @ itСFZ jyV                 1c4`[oF2o];vpVXƍkڻwov;v*V_K\suw%,lˆ@ PBN`ŗ_~E&O2JgF?L|.Kݥt&A@"cA DEb KФi4Q:,IoK3.m3s]gϙSsfx~[>իW/*mNXje'0F@@@(PChժiǻau|>| :4], Һ㏫RJ޽M悺tu,GUllVUvmEGGk̘1Zl:ڲe+ y_WsaZ_~J@BK@z@@@@@@@@@@@@@@@@ ؠ?5b <ٳgoeʔQ˖-u饗TRڷo~!'1of-_Ö⛂ 9i$رc=zׯm?N8M;w ܥ_~Yև_ i;f 6LKNr|~}` 4HO<4:o^ *Y2{@@@@(믿^7n]:uʕ+{m\[/^j[nuۼضm-)&&FƍSǎ[o߮W^yw^6,HSF z&~DDҡ}gi׮]o-[nB 顇}жm[݄۴i5k+p@ T(ߟ-K@Hi-A@@@@@@@@@@@@@@@@O>ִ`-211TիW/teXoLϝ9aPllV/mP͑#GGuM8QCMm׶. *\f͚$`W]uN>}8pdӮyfw#<#_Ç+0֣Gu N-;de((    @ Xhw!y[9stҮ{ 4Pƍd|*[o{9͞=[Æ s,xjvܴid\ӧOw|[*UR߾}5sLw΀{ŊS5dEFF]]w.$yۑժU+ 4ѾGӧ}a>v옞z)TÆ O@_bI'O~[@(Q m!={v?              dرc 5j(hǎ*Tʕ+% ڵ ܹSǏWɒ% ιzj9r 2Zx\.Ϝ{ؗnӺukEDDhܹy)xHBn @@@RTZCt>}Fjاpn_~E+VPUf󺐐8ըQx; 64? VZnrѢE߷o߾t}O`>s挬n}vwQ'= 6vԮGU4nԣG>8]E@`^)6V5Kj6 ..Q0"                a-лwo)S7XYr-Ʃr'@̊)22R 6̊Kk؀ mPօ 2 iyt8t\|L    ([oGzt\hթS'==Dm/Wyۂmv*TJ jҤIK @  T$n-CV>ztur@@@@@@@@@@@@@@@@@ }{uLÇ77aò4iݺu1G@כsGuEŋ)yx@s՜9sTZ<':+pk9tM@@@@C *UJ:t yW[$ӊ λg #@V< Z                *P|y;vL>=þz΅:t腞6nܘ#]jT6/wռylG#G)Ż@@@HY 1|Oƍ||@@'pKӦI7ݔO@r^ "o@@@@@@@@@@@@@@@@@.TҥKu嗫hѢRUUV)111S88q"SKO{j֬yayG}$ +{饗Խ{F/)&&N@@@@h/{zj| aZ9N @ T,j%zmE yS@\                auj4ho߮ǏuZpaz]T)E89_|7z4x;ydUD6ބK#     @i$)>>OvN!Z!@h                 ( >} *'N]v6mZzN;wn4w]ws;cC$wG@@@@@ 7,9"}U @2*@VF8@@@@@@@@@@@@@@@@!-եK? {>ݺuSN4j(@@@%r@@@@@@ժUWIc@ P+ D@@@@@@@@@@@@@@@@R(WL*P맧z*؛#?n5mT|"##s P+Pu@@@@@Ȩ@ҤI=@ȘZh@@@@@@@@@@@@@@@@@ d|APF^zl[C6oެ뮻NUVĉUpm!(p I      ={JJ3gEsi$ @ #                6l( rk5ayJHHH~Y`˖-)SF_}/Ȇ$l& ѣj.@@@@@HCࢋM:ٍ @&$ #                &PH͘1CƎ[oUN fl۶ͅi(QBӧOWҥl_#RttxV"     @h )M(%&fh @ P+o+Wte} "p(Z,h   @߾)`ACK  Z*U&Lȏ 9!@VN(s@@@@@@@@@@@@@@@@@ DJ,S믿^>~i%&&(P@ÇֆF34h EFF:W_}U?dmV_|OҥKFi L)::F^"   XWUF)9#qGك @~}=ʯϟ~#9!@VN(s@@@@@@@@@@@@@@@@@ )qkȑ#oO>D˗/O=?=zVZgB.rP  jůP{*@@@r[஻D c؊ @~SiӦ.A@C@P                 @ ̘1CӦM H 2$ѣ:tt^:uJÇWѢE JxZLh    mIV;I>EEIϖL  p@vRR҄ c   P+                EtM7)!!!hϜ9Zf ??m|t]PnݺiÆ A_.C5@@@*UVd>-:% N&%P+ A@^ @@@@@@@@@@@@@@@@@k֬Qt)Y TJSddy䑔v[nw={6hmctk߾}Aa# GkALLn#   'пmڴ9;[@@W=={~ Y!@VV(r @@@@@@@@@@@@@@@@@ LVXe*!!A Ll27.c{93g(..N]vՉ'R;} @+@@@Dwo@_%YV_  7H K'z[X" 5je#WA@@@@@@@@@@@@@@@@Bot 6hԩj߾oPBL2d,4*M>Tndfԭ[717`o8&@ =נkA@@@B@LcG)2\cN @B\X1B&L<@ P+ F@@@@@@@@@@@@@@@@2'`!Z7F7PP]8Tyf>( J>EoTՊ+nݪI&SN%? @n9rѹqw   wJrj֔5 6B@BAgOoÇC5@ W$@@@@@@@@@@@@@@@@@.@vzWk.6yaR>|?~WSjѢE:s挿aAd;vɓ}v=䓪\V@PbbBu @@@}n :׎@E[s_|.-  P0I@@@@@@@@@@@@@@@@@W ::Z>M>݅lM:ՅH۷O oӧuIO:Hu͂9!!n7`sDD r-moӨ(uu"ETpaiM֟?0|eVZZ`? RG:Gc@@@@ Xث-[٫-[9֜gқ^=ږ6%ݼy ͟_MeLոq\ڎ U՜9Vc'kkڶ3! .KKI&H}Ki' @ PB@@@@@@@@@@@@@@@@@/IСC:x[>|XGqmvܱctq|, ҲHm- +ŋ[nڴVzuiF-ZPɒ%tR_ޭRJu U e&2!   ) XՆV7ՌS[ھ$c[rw=Pm^-׭]p5EzxmjV΄ @zz ޳8@Jن=                 @X޽{ݼo>®eY) BjeBVmL˔)jժ,XVX!;KHew ޠTDDm[J (º,nKoN3g\ؗ 6@f60D7lؠ5j,;wƌ8q Kµl6sٲeU\9/_Ͷn̕ nߘ׾}   9)`WVȑ#6V ֽmjiMVdKv [͸t)>yd[nS{՞m[|}L}t] DymֽezVSڵ́^3RZONfXo=K[O+d^}| %Jpsufώ @ o !=4})@Ȥz$ #                *`cڵK۷o׎;lwu3pAD-f/J*jԨ,%Kg ^idmS-=Aj-8p=ӟ~ɅY P8@v+B WTI+Wv=S{nL Q%^ٜ   !`^#luk^ ҫMZ S`#[:r}uaH^pRm, Y˓zkV^e5o eyk^u֭}^RX(}ޣV7޺L 5բ4aZi; JjӠ-                 gsNm޼ ,e˖$K Ѳ%-”,T-[cccU\9/_-m Iڷ٦6yZVF'Oʂ{K/8[]goaZVժUUZ57-mQ."7V@0XE@@@ ,~{~W \zeEɧ… ! Wk'[Аu bB -{lﳬ :|-[9y(guqz&־Hֲef$pv.fߡdZ @zI/(w{;cً @Zj%~@@@@@@@@@@@@@@@@@ c 67j/@kӦMөSܙ6hdY"iƭW\Ysttt wbs )R={{iMeر?[֭[ݼpBm۶-ɠfZ5ktsڵUNխ[ׅq1phZG w-=C@@>ڵ+gyZ8EEEc-Z 2eʨt,uѢE/:a'`uh xBYؖlYe^(-wޭ+W%,XPV7liTXEDD\h9@'г4tRv  92                 lF Zf׮]ׯΝ;AmPT 4Q-ț-HPBcYA 5HUT͛7OP4ޛI&P'Os-ޛSK[/QDg s   Y#/ 0{on,HѣZHPٲe!<Ӳe$A=^`-XA le!s6[];ӧo>yAw ,ys-TrnRy붭\rm!Nn]K w# @V6rI@@@@@@@@@@@@@@@@O8uZb^zN8:d*Z(]vU:u܀6cóӴ:ll_n%&&7lؠY֭?޽Em -5j ..4 ԃW   y[`.>..N[l֭[c3,DB  C.޶WXͶ^ yw w(٭TRr!llYf#GWhQWSz\zu]tEQ)?@ )}k@ xVr=@@@@@@@@@@@@@@@@ 7jѢEZt~-[L{umR j۶>^~}.]:,F#(PVv%9{j*7\RӧOo'Om&MiӦ.Yf%Q#`Z=&@@@]mBƵyfl!Z'Np, Bok7fV,; @ɒ%eszRjYֶmےYXy[V+5kTڵUV-;9r\Gg]ü34@ WU~n                9!p!}w?p_ .].SƍULh@ Wlκu뺹{6Xֺu|rkn`a ٺ+tWUV6@(j gB@@@ l,T޼~zmذAܿGDD Ʋ iٲ[ںU CpC@LL J-x˂/y[~S/by5&@ 5/T<@p~)B@@*0rSҞ=y @@@@@@@@@@@@@@Yfy޼yZrlK.ąY(P]xV…Cؾ},nɒ%Zp BK.Jmڴu]>Sń%ТԶ⋡.Z  @~(UUk~z#?v>#p޽{]vժUy͚5ZzvᎵZX@SvmlAZv#eߠ ?m^vnSѢE4hK/Tu֕q1!"pҲe}.- @ ɫXҹkNycgJ@@@@@@@@@@@@@@@@wǏ̙35m4}7nU|~nfP˖-Ud|gCȬ@*Udsݥ,6^`ΝwyGÆ S%\VԹsg7gf ycǤ3   :ul/_.GXBwvv2s׫^znB ]m9 X_ͭZ:={ЂقG8Y-~FqƺԤIUXknPڵKU"ڀ jS                 [?ɓ5g7hOڵW\(@  ( {qW߾}fϞ^z% ~I-rҥKrJYk/ӱcGY5jԐ՜@&PB|5$ѣG]ق7R@IDAT_yaJԴiS]~nJB %"E)Ss@  eþt@a# F4@@@@@@@@@@@@@@D`˖-O4vX-^XիWW׮]u7m۶*^xf"֬YiӦgn LV~.ʗ?7Vh   QTvV/l}GݫyiܹZ`,Y'OhѢjҤ z-/RcƌQ޽eZz.WLp,p|Y#  d/3fyZz (ҿlR 6A.Y)ϵ@B ԩ=}i…w'Б#Gサڵkۻ`KaBYBV"Ef\@ O HMygt @#  @@@@@@@@@@@@@@D`ڵzXbn ;C5 LH.pQM4IG d{-[VʕSllm`Њ+J*I &,@ eR8   cJSj Oo=͢E4eM:U/vZM6\s5.Bә@r_ !!A?[YYdaVرtf~oU;Uɓo̫_ @{Զmsį_-XC@@@@@@@@@@@@@@@@Y{9M8Q۷G}Ν;x84L DGGowիH]z饪S߯;w~߈{{}Ly[v\U|]tj׮/Xssݺu=yOs}*^<!  d̙3Cm۶L={TըQCYGS#Ghڴiɓ'رcСCQQQa3$`crz ȷ{\*͚%mo.t'!                Y$`a9_հaCwUViѹ7ͨQԵkWȢ26@[osϥ8ѣn[oUK rҤI袋W_D;F$&&6=裪Su~,kZvOꪫ .c;W֭[?Ozw|NҎ;d.\P#G]#yȐ!j޼{Ov}׬Y&믿>}?48ZwG*^K~'?dT7   Y /_uaK,O<aZYZl_adAvַβe\iӦzݽmZwҥKիW/ժU Geߦܴi}PN#Vg111ݻmucǪد_?W-ڛr5wݺw.L dX@ q                d]ͻᆱɓ'k̘1[nV]>ױgΜ/BǼ _NA ͛} H.ua/s2%M6)..N )!!A[lqAr7oVBy9֖ j.X/ofV-\(׫oV\|y(QBRw%^zna{,XNzW۷}vW^9sFǏ&ߗiO~<ȨGc„   yVGiժ:v( =  ~?ݐuSNw gݵ] :? Fl[Fk޵qmCaju7ʕ+5j(״jF-ZxV#]+i*w=4n8_6=CzUF g_@ ere9 ]@                UԼysUTI˖-Sr%v_7ZfԿwsnU7 կ_?s³S|]ֽޛwy{3W(Y>?.{n"""Ըqc=:7x VZӧ8UT WYݠ . -}Sjش'Ȩ/MŊeLG@@Нwީmۺ !]#sga4 P6mr-c{+ضԺ1"5 })qqqk}^fF`}ʮfg:ېR-<4sq+66VÆ ƍ/ϒsƄdT@[72 ❀                9.uV7e.]4~x*U*ې s3Bl)1,X0zKqիWVCnimMސkd6Gn?PO^mo\zk K_);۞캿WSuv]=~"#} vlBVk׮wܡ={jСxs؆UsJ;w6@Rr;ك                yH7֭wy'NO?7N7hwޙ)|yn{L%Kt8p@cƌٳn:hB/8K:yQQQQW@1}Μ9#k{ァW_}UVXw}WUVMr/6n@kn6Gk֬ш#\нޫN:)=} 5rH7-ܢo~p=C.;'yӳL? kAdn߻gc۹ 6T^t[_'L?u|f͚宽i&5mTs4VlGyD ?osqg%<3]~>a4nc/rnP6m2}ol`O-_- Բώys=z\gئc׿ 8ٶtH"P+=Z  }Yڵs5>ȅ}^'ijn)Նѩ=SpXbwAl᫯t[˗/C\xYBBPBn۳gRz>vAoхa 2D%Jp{GugvKa!v6mbNBlT>>}:[VfMy^˖-+{d{m& ͋qڵs!z'9oھ=bl@ cH!_q8   XҜ9s\Ăg;^?B͛{S:t[5Y=x:x \?uw9:c7Zj6YjJ{CZ٦GLH]Bjd6k+tYVSӪK[M/W2en`=)-j魵{MUOv/Vl8?GyDwqԨQýwd-dԩ]W/>Ƕm…?.^6[f}[EZ5.ԩw#= S}I'O @^;U4                @`߾}nPjÆ ]xmڶm[~Gञ={ ]:V\ŋ.dk~)7T*U\Жw-ZU E)1+W 6"" "6Fـd_t,$hѢJ/ydCz,… '9lPUv֭z'cl@أG+$ kdtMj֬ɮMosz kpfd}wq"}}A:n_4ئ{䱱3gʕ[WVMgΜqAsΝռg{P@-߯q&@@@sN`5̼6%YixS 4k,kG->SJ\MͻN6m\j+VpAo_e![3g\R79rD&LPR5@1󰺮)jލջozMMV#}}gvuiVh?RN>U L_R<i_z%^kaMv7~x}݊=? MϊZ-tԋ.}nKϦ4nv]}ei=S;&/M  ] = @t D(B@@@@@@@@@@@@@@@@HN:Zf ɢKfelFl@I֮]+ 2Zx^z6lؠ!Cc,Œ,nݳg~78;?ezcdI2u @駟' fF5 RKa^MOҺhz-]ǜm׊+@ujĉP ӽ´uBtA]qzwչsg02Yj_V-qb}i' /Bc}owaϣdɒeNVjU~!)|)rJ   /`A?W_~cjGhA;^kՋ[l^[d;'ה-[jʶ/´`k``ۼe5Izl]kz}r!}Knzxj}NO-<3}5Zuu&ڻW_V{ۓ/ӧuZS|z+Azi 1cF0MG咪ysi)B{@@@@@@@@@@@@@@@@K[ouaRcƌ Xb:|,1`[ݴi ӧN뮻\wSܪ m>o};6tqۚ4i習 Z_^JV/g}+|r~ڳA!`?S:䶍;V:u]U`hy'lcY[VF1|=?}z'^xYHMm |O ~4nm믓1'ّfAZv|UTIݻw״i\[.]WIBhżmN{5J+VȒ6o[7tJӧe!dm!*`ZEhh   @ X=.S6mdLs)Gfh̙kžsv^BHvڊ֘1cl2pW߿lߖ+^8P|||ۦ6sLwލ7ޘ̾Ho]ګzKo>^2׬UWoٲ{k<َVZ)|)l{Z%\L%ܶȑ#gɾaB2*`Z۷KKfLGȯj'O@@@@@@@@@@@@@@@@EPNksmДuV[ /[wSLLƍ;ꭷ߯o]?O?դI?7@R:uJ&LO? ЬYܶg}6@ӧ+ر{խ\ [ܙ{o+xZNرc;kUW],כogy3eť4~XВMYÇ"{ܵk ںuks=V{.^}'7[~SO0 |;v &N<,ɛ~߸/ SoذAܵ`?~\/vi,YR5jԐe\d t,_W_}U]vu[֬Ys-Wf׫WυsYك>5-Оo펩\ M6{oZ*sف@n O#  %`Q'O_s5.lСC hMW $m_%/^uho'uF5l0.]]k߾}niZb4uTD 衇\V۶m5bٵ-ܬf͚+b-ޛmjҎjj]6,$dSj50yt1B_~}WuGz֭sw &o.`v3vg-Ӫi-*=ﳔٺqZuu[=/ M&+Wǭ=+tY<ރޥ˴ާg,Lrj+|6mܰN:iOh6䶀W|_~vK? @D<"\K;@@pXH=[2$[O@@@@@@@@@@@@@@HKs6nXuɞe~knTvlT]vn/|r}g>ࣨCR7,(MPD.*X @PAOT9˝ET,HDT@,!g7nI$[^cnfg|9 ~'y[M8Qv-עE婧/裏/+Z8SRcS6Q]P01 6|YB͛;z֠AL,heAXVXm۔kʔ)^ N6lW@ u-YDv˔)YЖիgoExygš,D,Sxqy^gѢEUNn+[DxZ?믿ѣG{[` tk.GZeS.]K3yPv۾}4k,3 f#x>vu]jժ;tbbhkժϽk!kngy9; +'om]F @@"@G_rUXY6bcmڴSO=#FСCޘ^Nƣ"oܸqkoծjl=-Xŋq@O[f6i+X8{^h8k 9|JըQ#ܹssf_6gc]wzǼ=/Ym,ѮBVZ;wjʕY@Pvƺ6Fic3f?YWk_z%o|Bl 4`Gq:1}?{~Ax≪Xbk袋2vo2^EsZ1nl}l|>6m?mݕW^nYP8_i3{?lx,?ׯ}ѷoLlZڟ gn2|gg)R柺BgT; Z *xsO/;9mn/oV֊h=,TP&ƍm3 Z"6̎gK,8bKvŴ{E?Xmn;ooF4ם~~Ojn6EpsbnGz)/(k۶m^^+Y_+j*X+fl2-] G, SOUΝգG psHpu]ow"@@ P+>s4^O2Ecǎŋ0r %ӧm}@?ZU4-;װe˖GuQHoG_W/w3 wY!CԼyx@ .qJF]@@ P+7HweO@@@@@@@@@@@@@@@@@ <-ZмyoOS%&&j޶%JPƍBVM6E%GC ">  D@5h o/k޸MVtyƫ:tDFc0yf}glߚ5kfy"e:ǨoRvmܷ}N+7mڤ?POݻwk׮^_2e# ׌ Gi4S Q/Z_ DqH6Dp'              $paz1ZrN?o޽sJNu @.V^o+i?9i߮ QFS1rԤIt#ZYf0:KVM81z@@"E 1jneFJ ؘz ^Yf*WkOWϞ=խ[78 -pWj^}vtM7. FiƷj޽7ofΜ>H/V"E?_\pWάE,sr$,V,p @ l(F,͞-u.7! @l@@@@@@@@@@@@@@8vm$+vڴ):KiE6rņK.Q>}ԢEX@ؽ{W|^ӴiTxq8p@V贘giU]ũ?3;f{]vi>/6Bcj\4@@(x Ѓ ,[ G1c̙}yA秝vlԩo|g^ lVD DC J[n՗_~/ Eꫯ~/Gիl^lHuD峪n]OBZ䢹Lkr~WD@@@@@@@@@@@@@@@@x8rDڲ% YB ղZ}UN5jHZ~dyz㍩cYqσˢhѢaneʔr8 \)K,n@@@hٲl۽0sO?g}Cj˫C:yUfz.!11"^ >tR-\P+W*99 вAk׮W^?:/pr Ԋ"&Q|l`o@@ƍx@ڰ!x@@@@@@@@@@@@@@+ ( +ugcZ~< ҇aU~Uw?|MVZU{VϞ=գGkÇ`/kƌ7o*VYgbŊe9+- ժ`_:4Ruk/ r3D@@|HLڵ[hٲtFN@X@_؎8իm۶ԦMvڰaC*T(:Y@ؾ}dٴxb}ҥK]v^I'SN9E5jԈ@ nUr|y,^ׄ [ٟ0͞-u P+kE@Y@c&              ػ7pBm =IRJaXܶ-R$￯ӧO>Ν;ժU+uM;wiʖEC<8xg}O?m ~-ΦSO=UK%-^M6hH4Hn@@H P+R ͛7kѢEda[6^Z*U7oN8!dS; ݻwƿ-,kKMk׮_\9olJJJRfr=(tbJ㏥3ΐ֬?h @L KV@ȖZbb#@@@@@@@@@@@@@@(YN^H+V,{X=UT\ҐCDCi޼y9sf͚/R r):uI'y)F5|g~Yc gϞ: - ӪVZ"KkKCJÆUq-  DZ{yxvڥe˖iҥ^P-wn ~VL5nXM4 l]ҥ  ZrVXm٦uyEUFԢE ojٲZnu̙3G6Yώ;T|ykN۷WRR7_>cU@`K[d.\Ey~;BfԩS'o:d?C4<wH_y}G  ģZx׹XkY?Y̚5ktիWW ԰aÐTZ5;a@ {O?iS?{gM6Ml´,TĢJEHo,^ׄ j%k                "p_s+d>e ;!@ [.k=k>@l jM@@@@@@@@@@@@@@@@hض-YPw2!͂%T \.Ru6 6Tn]o:sB_Պ+iժU^`믿م,O9^[QEbQKi! []v/ȟϔZ` yOV&M- +UTv, @l c*@@@- SNnj[c!:ׯO;K.޷ÇwUV&ٟ۸\J.WXQ Nٟ8vݻwk{Pyfof4fZٲeCڵk'{&լY[._|^,"KwoituD KjZ@@@@@@@@@@@@@@@@(8rDڲ%U(h_nQպw!aX5jHZs+C/S&eWȑ@ZdS=Bbk֬O?YYw}Wrt>*THժUK 3l[UۖV g ,&oK [h[RR."/ȭ^z^>})ħeA4@@@H/`[owSخwO~pիS|vܙ[JHHPbbʗo;XB/hB B6g XP۷{֭[e0e Cb?`tg~Нg/6U^]J ٟ +`ZG˅J.Ð @Z!@@@@@@@@@@@@@@@@8V +?+<{ J=+D`կ/xb:5Ux,!P V}A)v`XҺuiڵ8z/4iѢE^c~0. ;ZG+hm DZU<99+j?mVX7³)8(:oskqf;z}ԩㅱծ]ۻz"Z@=t@@@ lN8+/id-[V\V/X8V Yu5kքc>$dc~?/Wlٲ޲?OULu}Vw%׶9vM-[pֶmۼsv\fSr&M,{&bGllXx @ :tJO>K@ P+9                {f60 i.gK N}eۺ4bJhѢW7evaG\.Ykm˜VX̴gϞt*UTHDNgE$R"ͭ Y.e ߿+j@Bs+ j?~ܬn K4?8͖kԨ݇YFr*μVDNd{@@@ȉ-rYS1[W;VII n{tQcܺuk>m<ƒW^.¼2k%]j lٲ O8q:۷d8ڼxy2y>99Y6m^p>OY={On/s[gc~x| /~fce+ge#-C^V"1%`.u#P+n*Q #&B@@@@@@@@@@@@@@@A`NBٟ\VX0u*WNˏGCXH+(iSV–_}ƌiӦyLCyW6lЪU俶@(+i53kV/jERp?ٶܟN' m]=s@* Ɋs˙>xl俶¡i'_$ԟ3kvM<6°6mЬS%hi @~ >_@@@ m/ϒ~9puHIIҵ³,H˞d٘qM'vdc; $$x /?HɟzK)~8qF?C+э?'xzddc̓_ciǛӾ'k6^ع?~/gj޳1{nu6mcYۍϯpۥy~`m׶Mvٲqo[C/s?<}@Wwo{~_@ қ@@@@@@@@@@@@@@@q dmڔ~j4W OUN͚~\y _jĈzwT~}/T/B+iP~aU[O ST-[R«҆XY ~P\ԖO~Q)S4 KmUVp Wp/+jYQϪU:8_0/ dǡ!"hc@@@ \UJx֢Eǔ f eR fl ƈs{/8)x94?M Tӽ )Ɲ(ʙQ63 ǟqiqinRKwKᔰ(?+x6^fn?DLٳwo:w~A *ƽBl9MC@z ΕWн $@V$                q/iðP,n:V|hVRv\-=D6m_cǎzuxAS9+Dd¹, \R5mۦ:ulF @<wkD@@q_B. A.LIn2կ_jxV:sl*W\;Oe|~X~n|Fh[Ej-ګ֭ HԬY5qts^΂ @~ 4l(4}:Zm@H P+C@@@@@@@@@@@@@@@8p X6I.OF.3'UոԩSESvgb@"yWkŊ:묳駟s1puox/)SjofnAO>n&$%0 -Bx\k    '}MhxKK*III҅gծ3xyi0~}BZmǦM%%KoZ:HK7(sܸ4bTx]6'B@ zj=H!DZQp"               DݡYqcӎ}w91\94 MXVBh ۷o5zh=QNp 11qD9rą &W^va :sz4dȐ@ Z[Ω#  ĒҥY~+:$%&³>[@Vݺtq-) ,}t҃JnlH.,<˖^~Y:LO?^{Mj,@ ziߤˏ3r@h P+}D@@@@@@@@@@@@@@@<py5Yb ڻ7+%Jj0:?Dˊ3&$W @p( ӲvW[nQ͚575kh)?jٲejٲeʺVJ#G5\㊱jsCB@\$   @d-_eZPԮԣt睁 xfė'omcR2PSO͓A۶ jI29xI'I6o^zꩀg&@U1C4(O@H@<                GH[= kӦm TR%u^].%u{li @8;/jʔ)Tn]{*_|8ǰk.RY[׊-Sf;PsW^m ks   @ >,!U-Z$-XoTd!H&rK I³CstĉWHFB:W6[oh9?N_H']w] p r~,@@ JtO'P+ A R@                ]W|0˛7K巄)114 ˊΝxb##giĈԴiS=0`+?LtUU0-A `ҤIzᇳݻZjiz4h .\8!  UP,^ׄ   OgJiiiBZ:t o/7*7>OBusH^*%tyտn֬?>{g{=Us  P{K/Y`*+;@p DC@@@@@@@@@@@@@@@G`߾ð҆cmBes*U :ו+e+0GC"M$jAZשwyGs, 0WvժUxݺu@B le\տlf @l Xayo*@@@ L βŋL߹-[ʍJW\s"E'С@ƣJzITZdXzѪܸd!n[7o+l{#|a u-Ҽyrͣ5 @xzr4@@@@@@@@@@@@@@@J`ά6m }׮PbW!XVJB+@ zd_~YO蹈0t*Z<rd[7uj5lP}#<~]8Y /@ Ԋ   @TSjx֢EM۷ˍJ-ZB.DJJ,"O$O}'=tulY~@y(ۯR%g fΔL)]!GB7ƍkO'P+=׋d&@Vf2G@@@@@@@@@@@@@@@ [Xi6n _[VT Mӯʕ ޛe@ v/gyFcƌq`k6m[u8nG҆i4iF`m_sNr Hŋǻ׏   Ikצg-\ڲE*\Xj<׿[ߵt˄ С{xԤIV[G{tidB:w7~^Ə>@+лdZ?=@ Ԋ˵!              ĵaXsСPCðjזڵK]Wr겅dY @ U`͚5zꩧ /hѢU馛Tzԍxih2i6lМ9stꩧfE-ZP^O5 GUX]0   QeZ6XP pCYmJ%KFTL66m{ONcnbZSD^O8AZ@@֌OKKG^_ Y ǻz=VժYm{  @VR+Wa_T~\/J޷o^uee{ʟGvòK{j۶qo5 kD@@[`& _ ~@hְaeݗ+=|y)`SR>sIyy8j9"-_.u}JۋEZTR䓥SE ! zIvw!y/_Y1g@@@@@@@@@@@@@@@swo(Lð4Hɲt@ 5 Po#Gj֭O^zDwӦMݻor<99Y[lѬYԣGϭު/\>?v @Xbbr@@@ض-/ԩ#u ]}`nY*@'9e \)'Z%4p`OdlKVEj!w\ d;/,UVt@ )Mp@ Ԋ%"              \ԀMR7nx)UԲe:?= @ z٣_|QO>֮]?~ڷo=Q=W^}UYhFR 0yW/W\{ڷo_u]=zwr|v@\@(t@@g;ŋZ W:Qܸܸ]`n˕+s9] tN חaNO˗q Vo@@@ v E {zuq;i,[GOmۤ|s|o0-[0ղeȟs%K믗>[fǤb"@ >:t{+}1Z @TR-XB@@@@@@@@@@@@@@"}$?*uk.,Uռyk ' r4@8Xz|IM8QJҍ7M-,G\eX]*>Cxqa:*AC@O@@k{:I H6{ Ɇ6۷.80 ZG?Z͓lFh$-Z~l)V,[V4I:@ԩR&yzZ @owj C @1r# @@@@@@@@@@@@@@@ v 2 ڵ+ ln_/W *z ^! … 5b?Q:u+ h{^ 999ZʕUW]1chذa.;;&@V1  ҥLN:tHgcu#Ğ=t}g|N>?2eJ]lE iߥ5rcl:`=ڵF@!yg߯}dx^V"(@V,U @@H8xPZ<58B-l˙Bs, Y  dK.!rtOxf,PڷF_۾B>\飏 D{ @d)pҩFF @ @@@@@@@@@@@@@@:Ç͛ڴ)}[>t(2-*8V-mP, ' Ԣ! ]٩SzAZ\3Ci:tԩΫ@=zMe_'X5X Eqh.@@Zkժ𬯾zKrM7=+a>D->n\W_Ž.mܸqPwwE iظ~{rK3gJ'=*@W^zIoC>j9 @nʍ               y,}{Y6[4 JL2 -rJ=4i/nM_*TWwoG}#Fx<) pU1   Q`ŋAo-[J ?´_W^).{GC >H0@XQ?? >׋/ݻwo ^'%]HɅI&}r- &нt4kty{ ¡1@@@@@@@@@@@@@@@,\.nMqc5k~?sͅu@˔ êVMj"t]p@mOC@sȑ#;aÆ3f R6VINNγ@.Lw}&NCqF@ gpN  X&4yӦ\hU#G .PÆ 3$.'&J5jH//u  xc7b*@H@-nTv$>!Zy˱@@@@@@@@@@@@@@@@vJ ñlBCB_vUP2_޿Ǝ}V?9r U*aUh  ۷ѣyf]r%z뭷믿jiշh)ׁZV{zg ԊOBp X- @@@ qѢdz!{xmvr>H}Q-= ,mȲ+Kd:z.C|OjImۦs W"LUԛ5kmN}Xz䑛~^<@˗ה)Sܿx~%\"+k4l|޾ށ Y1(\p.@+o,6-@ ԊG@@@ o/.L~)pR{hYnHћrJatС;v|A{)ްa̙=<餓Rևsaĉ+Tvmo&O>@gqF8Oű"@o /,TkLwۧO}댷ȏrz)/Zjlٲ^}5q%KkzyD*V,z/꥗^v%o_8:묳T%sYpoM.+nf|u 9 %駟jĈ^qf͚ibAXY;85`fEb}=@~j/^\ п/q` *BCt @@K`.S,Dkժ35Y]&%%*gK5۷l\_E]BЮ]; 8… ۶m]w坿sZnn&z¡9ǘ:Ȕw~g{ڲe>3g *lU6:l0Yڵkk3˗Y6pmri]h?>\97ݻW SO=n!v.ok?Z>v$' @=4hnd3?S=PJ]$Z=O!_u?D"P+d"7@@@@@@@@@@@@@@ `WY Vph-[VxjU~u{rŵzꫯjŊ^^zyŏWVnݴao뮻.>C_ܹs→K{uYgy۽޾Vd,uw|:*5zZVB,4~wzV`Zɒ%bM 4_/B&O, ֭[^x )S?xWKz'?uI'eE+bXV-}:Sh"=zᇽ2]l7}<o] `pfEoj[!@<(Y5 @@Uo ;abE))IrÈn(0Ggam_}͞͵hB^xzr;vMy)=HaZ裏jΜ93A{g-YfSN3^hٱ޲e\+W%\O?]ӧOwfx@-+,eE-ݻ0qW` @lٲEƍB'w^ԨQlI&WjJ/^i" M6O-e^6tPeA4@ \bW=֮A@@xg.- ̗/,L؆v,<=ޒ{,hիR/^k^@=[m_|-KZjNG GߡUXm߿o:P;ӤIt 7x]ȑ#e![Vxoܞ&[N<7 *ٮG8FtuARx0vGVQ@@@@@@@@@@@@@@XzYV.k]KHHCð֕ }8B(,gKWְad0{Ro^z%]~jժ^=W}ϊYwpRtA@T ]@4E`Ů1i4&`%jD5FEQ EDE)"X@E߳qWwo_cnfgwpϊ?尠p-QIW\jʏ|L/o>(:xWGsIN i`CCͤ6cƌX7y智kOa}n-Mי0aI׏Ig}I_7 >Q\QǢ\sգ>~wQ\1{ex_a&@۔m^^c}^KV8ob4=6ސ!C福5k,ZH~ Ǎ;찜0+X7_ۦ{{lx/ o&4'r۩>n>\z饅,@#iZ\%p@L6#              .PP@Vp,_^Hڰ!wo\TQ0,br!a78v^\kex~ {g7s%q\uU!Y ;BΝ* )h.ժU+-^8G㣎:JѣGt#ږmusװaâ/;vl4jժ3 rȵ^oF7px6.27*|n^oۂȅ? #FqO=vax:묳BP)ms6ڵkP}¨ z/.[ 3P˟x *c]@ }֬ } @@bpX* . ǰ{W˖-B\-8Cc\b~*=q{ﭺua,1r@۶m/& t+X_5q}9}qi`v Z%]p±kDѯOB}>"iy:st7G} {.b5kĈjڴiN5tܸqn?',j׮N:]s _ k5k̹I6m4a„h[: Dn P~?kU, Ho>Y!             T@ '7qUrV^0.0=k֬h7],'8sԱcG͞=[~^{EaZa\ Ef̘!5LtZjNT;H9Pz矏tRH*"S=PuGaZsN9BO]vY޻r@rx-TrX~os?>罵$@?(s@֭I/?⒬n@yjyꂱӧO⫛/=@Ba4@@@ m|,: rg-_/ wCj}vi9駟F 6̙ i}w:C`p}q=Лo>@ ,P|L׻AZ(my@?#>ꫯj]wB?Sքc=62l7O!\e ZW:y8!z݅^u~y?V[%_pkٲe"^:ފ/BKxb@J]` jCÆ!              -ZTp@k, Z2u+8 pI]B`?`:3sivnhG'|2 5jTT6'͒%K`œ̙-Zl֭zgyFGyV' rHP!݅6֭[^z飏>ҥ^\v~{5m4m+V Uy2 %O?i}߿\*s/Ds|ɺ+hС9x8d}? 7P^e= @ѡp    lI Ϛd5i$ZJjՊo2.X;CŽWz?pN8zs9礬 !v 8Oy۴펟>N:)+ܯpQ^:Z~m꘴&MD}BkpsxڗK=E@RxY 0$~vק@?^~(-9HϽuFYs-50ϽcFǗ{ {9-܃>X:1{&B(K#-\(5jT…qw@[F"              @`}[ Cs\ )Iqf뚹T(pJ$M -^PF:⋥BPIKijEBm=t$qԻԺBA|6Yi'{Dolĉ˭Z#]}:+*ղe˔tavk1n8 2? -Cx9Z.*6#T:CRnmV=|A_>*r-0Jo~:@RX>Xo E>SOU۶mCIzK5L삲<~m~sÇ\c\TJrۈUO)Zn+gE @ p}ZGVh@@HTqSqY?F}աZ>w}R8&Nˤ@NN pxٲe?&]vw vQew}7@>VVر o)tpաCc43YR o8=7q^{%s(Nd[oEiڴi9pqڼyTر=S;cs(Ǥ\>c䠥!?ʸt5Ze[|xηCH&~QnϽ9o>~9}cq5ԯk_:o-5t\ ho. @J(з9%\wGl&              @^-S"$+lj² vWkHE\mmrrUilѲ[C E<}Y}ӡSZ={OGE:"M.BOn.R7\r.Hw7?Zԁ(CX(;6 B͞=;T$Ojڴi {Cuɓհaèz-W_i\yQՙg_ѱo1ڹ{. *X=/"\~z衇t)vp/;"/U~)lC~_y~\1iޜr VCS/|Ax Cé Q{~{뭷6zXk駟n) %sЯƍC nnSϽ>}ȁXEif\Vu_!@x#{ @ T 'm" '6CmkF@@@@@@@@@@@*J`ŊP²/NR g Jo"m46W`ѢE:ה)S矫YfQ1<s!9r19Ͽv.Tn]]s5rYg3AZ]tƏAo6mw\ʅf pC Fm.ԡC(HkTEr8gvs}fRUB>|x[}ծ];^4c@-([n /0\l[Νտ~jPElދ733DYo?-v頃ҝwYMddWUt6@@J-Рi! Ί\[jUmDhVq׮ Rk%3fDA-.,wȑq?_ׯ_?WU֭UW]IXn8@/Btla1{wi?*-|c>ocڥݻjժU!dž6u8[;.'駟96Ey.ի̎IϜ9318UO>YkSBU6 %!`k?iEWkU|ZU ' 9}p[ z4·;ww›`͚5s0:v=FGC([ W_U.Ua @i w}S-%WeUc@*X@ ~X=           %YoNnSX1p,A"MK`XlYT鮻>\V՝ksؔ/9E69/ l2YQ$T5rSH+Ja&oڵkBf͓ן'ZRzr xpg}V͛7"F\~(#T_v˿/VEa傘.IC2]`ReW3}o~@@*@j9(P&h9l[8<+'-\0>@W:S}:hhڴiZu9  H BHJp&Э3tRR̙3uaEGep|~X:\'Zް3'KHz",+CI]$-_EQ/N\k՜9sMo4eͤ])my5lذ2] Gk֬?[nESNՀo_~G"|h-vsժU%V\Jr֭[>=0Z @ >T+]  @ ,Z$M,94+~=PNs]N j^WƍSkȹ;Tj˗;³z!4@(ҥK;u 'DD:u*K^[m:R\"*kVTsOS|zX/ݪUK  #r³&M>@ıOf~zb m_Eq Ym:xwڥO,žbm81c=>@Ħ:QHlKBƫV_o]7}E@_?q@Qf@@@@@@@@@@@@@@ --t@O?^Bgfl-7PFբ!uW_A@" |wQ@}ݧu֥^vک(}e _UT)ȁjz74`-@4oQN4~4@@J.b $̙=zH'tӦ%_g6/UVzDz}/ciӤVNjhC?\Ϊe6i"me"Pk}j׋۷׫#G.ܹgσ5~jݺ!'կ_sG@J.@U *ݦ? an              @16l-J` `ʕ+];5aXmn}n=jR\ ?_ 4aL`lUPkѢt?jUcj@֮M,Z[&KB@@)SIró@ݭNf}tnxVW,kG C^z)שBvYm$awwA;Ѝ7ިmyHF n ޽7{@ jԐ?`E@ ]G@@@@@@@@@@@@@\[0 8+y0qSðvAKb^Ʃ9$n@@HcjС9rdm[oTVx0TRa{QG{}ݧjT@rN@@0ի? rԩcε]:PLLpda vBߤTfLmfʲ.ݭW^yet骫ҿuVG{}~7Yr) T s۳4f Ze'@Mp{8\             +cJ;|ô֯_ooHJjZ{`,cyQS  C`Æ z5,T7n\<[>8PĐ*QNs"z9@o߾)(@O6`3  "˚81wǼՓu zZ*0\LX "jt9c)K]-{^yBٟؓ&Mh tEwgiԨ4bDccElDHW~u.@ P$Y             d%f-^9ï*:5 Sq0Ǿ-S   =BG}TrfΜ?\=i Tл7o @V=X1uO  %rg}yuJ]*I^jۖzJO論iӤ_ (ehF5Kڰ뒪SǏӿo Mvz 5h\% @epM7Is @>|Y              PKHXM;P+ժqV˖Rw@VÆIc@@-Z SN_o>3Rણ܎")IݻK]Jkgξ P1/u4c4jt5{v-%'j֬䓥ΝGG@ zB3F:l{qf/@@@@@@@@@@@@@\`ѢMbXxr,Om8DAs @@*/ÇnӜ9s4p@s=}+Ng-otV^ѡўl<d@4@@_`Dx֤I$|SԦԣtUó20[`d[ >X:DÄ `oLhR{ |K2E:D@ݕWJTF T@ZҞ{U[Zeg˒@@@@@@@@@@@@@T`ziMdS^&~0tIUn  ,_Luwkҥou @!M4QΝ5zh jHO8PZ> @@qyL;̝ 8<%! toK={zH餓yFj(z.Ux#- IԺ:i,uLr@(jE             T*/ï2^8u_mujVNETC.!  @V^c=Vmڴ-ܲ;M: ~Z;nf* ֭[wJ_`ӭު~@i,n]bLMC@(%K!6'JEC"4ac4@4n];7$[tAرҐ!CICJƚXF l9s}k+4a?H&j"Ȯ~}u1$BWtɽ)@}ws!1cGF6-@֦}@@@@@@@@@@@@@ \ kSX?z;UV"*9E@8+7l(U .!  -2T;#5zhծ][]wjV뇆ʜovm7=#:Ti4(@PUGoN8b/;"!jUZkg  anpfΔ6l4wN9%7<1}GI>g 5jH{:@ z߅             $BW JyC6zu֭qVϋK?@@@Xb9;6ڔ}ݧ!CD׆#FаaBѿG[p@Eo:GU$z-T=@?,[ .]Zy!  P:"MϚ4)16-^Ӹq"4csóvءtR@\yYǷww:´bld<9sew? >8էt {YJpe @ 3mF(L@„@@@@@@@@@@@@@D.`@|ۼg4H yDQ,"q8+׮]M   @ ,]Tx&N(g _ns9zGtkܹ:4|puڵB#PY{o5X ԪZ$  PiVJ_'>LoLjP=Nss| ( >wH\m[9ZfϮi{v/+KKgը!U"mؐ?\r @ s:ӥv2w?r@؄9             p!?z?b]Q,9ԧ(+rQ    -Ri $3@!H^ZJrK쳏4xp"iÆaXZIzk8U@@@S/´Bô×D?^{NϝbdzBQ odJ;TZ_Ei  T/6rLRNRҩ&;&tH'3;zuf@IDATk*K/slKy hXۜ9sݬ+U`*wM`O~%9gw!3;[lZo=@@@@@@@@@@@J5!fUʕ+7^Z|x:<^~ŀIN7Ϸc?@UCu@6®j/tk֬]q_W+$x"J/︚MCp1MM;HkѢ@r6H..q~oKG!@@@xq|};y/:x~Seă*8ݷ]bi't= }@}]'we?W߾}5h_{Mnv |}QACxb͘1Cڵ+5 @jܐ%  PY/(矵$$"Xb/ᠸw>v?Mܧq~ӨSNV[m ~WRó&MRxOJ!uqq `2F;˖-s|rŃ߃{Oط~q~ڵEyyu֍[8_xa"L]y]g-qԪU͘bvJWΞ-.eZ K.I =Z9Rz {R1c.(w~Q|Ο '5ίwɃ_>׭CUA9uɃ_xЍ{LCI =Hj~z69Tn*!          d.]4gG7q繠ln pb.px\tA?66{qA(/q z{f ?@q QF@69}}٨O)oѼEC t9)T'P,G1{.kւ @E 8k޼yQ`ChE]?7>uO'_g6y܏?ZqV%$yY8SwsJ|Ow}Dh֑GJݻKoU@ ||5}8ǔa{… s~q?xA;]H'{$yN~{ݷx oG_Qa_9$uO!T-ZPnR q?@)*} K|> s_\y3p5k2l2 A'tҴio!DAm&³&1UO" *J1*&vc|L!}u8k8yp_u|~>P~ݴ[az./7B?7/cNNrߋm=(yyN|!(|N|UY}e{'?iƏWjwYx]>OmcR3vNsǃ?3v|\<8~rO{駟W_x/zռys =i&35 }ߡ7d@*ZAd@@@@@@@@@@@G]~ , ΅^\ w);ႡA =jժU|)h(l|_ʳ% hپ ڟ:ujJXX ZG.}4]"~pr]Zp@p,}yݺ}O Խ{Y.I  YAEqq1"q?/'ONn8|yq?Cx؅\ ɊEvZqrtǞx^Wo8g2![q(FC2~Xv}@,G>:fɃn"dp |֬Y1cF(?3={vT>r\~]vQ(дi| vgZś?CFxp߇y(uÆ>+ !H?H:_m`_K&vߋ:y~O3fLy!m]#" 2S@{| |I0}n>֥Kppl_oN>yI:ύ>͟[} ك_SZRXk'^~_=zأ5}Q<8qǥֱ=  P8j@@@@@@@@@@@ CG?t;<]6KvA;wf㰢˙X&yߙ.??.ɚ]dxpax8x:uy yMH&wp=8†TS=Ns1PJ 5ԧOziz4@@OV}7cOk i<r56vq]_w_qP<ԩ/1e">DfߊCPv y:{:7}" 9`coUtxW@QmIv?3B\Z. @LELBjԩS駟F!ZWT!O|Zl-ZDcW6pPPL8lΜ9BO<op`tE[tKA.F^b(C 2g}ubBFXuEq }SG˗G;]v+ xs4M6gؑvm>fx{#Fȡf>^GuA;v[믧6VԄLkgoU󛳥rt͕BuSîz`yƗ^zaբ!  @8'qM=ß^w_ݸyx:}Ş&‮wqI֭[<뒧]8E;rRr?QPd;q?Rݺu7{pu?_]օi @ ڷj!TzC|'Fcw0wwY6>V">7'y5 ^z)O}ܪSNQlWi7a\Ln.``{?CF~ӧOo߾gFy&ց PU e  PV#] e         %_~ .pM<'q!VӞ碭qVVveL`mɅbc_ۺ.F]{pq)7oCҰaRS'Fuks+( +Ώ89ӿbY@dTAC9we@@L9x|OX"G]0I߉Zɢ_' F}?q@{^PP 8b\<4ov#KuNe/бcG 4HW+ی5,YD B D~qOnT#H瞻q}l kE@ oE]ܸq,Gm6 crAL8a?lw}T<46mh=8msð-6-XwhN/i q_QrLGoi-^X 6\ȿW^QCNhG&L{iŊjҤI(Op ?AzAZ5~тn><ԳgnCB(-C6;k|7cdžsF!1C{[xIh)~ZzuwaQpie y!]C^e@b| Zų'Pxn @(ZE         @C3gjƌ)ci9P˭Z*$qzpM60@r 0CBW={v6lv]qwޑ)*v~9/دG~hܿȁIqHG+_js1wEXۑG)1& @ _҅J˖Uvv@*Kk9r^y{\}B+:uD1a_ք7[oi̘1Q|>!#8"' 9/ 7$.䥨}e~ iXn.+- D}Hs=P)kE>NPtҥKyer㶮N+~i!HH!LV 1e>cgCm׮GGqիW LI.3Q /Dߡ|,I'$!)2p/)ͥ,@jߎ@qO@@Hj!        я? ?>S%͛鸨ò\hA8.d5upx!@A.k9υ>Q/(wuhtPN:-z.|s_PBRŏ5p`"\,)o֦B^*a*JRS    Pӧ|r o-Z͚5&9߿\hT/8m_AOYqm\I˄fe]EVX?\.>mڴP?_v**Q˖-nK.f͚lQk03bYõ j BSo7+ܸ9u\B@@+b?whH~CBo7}vpqT5k"~.d!o@{ܗ =:uc^%[P ;.y~!,\"-Y[ɶ! k׮)Frws1QVc!PDAyL 6 ) >CϳXt zfZ}{O>~i͟??:gazESiH_~[o}y֭[㏏B*'J K\S:ˆkΝzդI(\Ndg>?>|F~8z?\reZt[nJ~#@)ùxhQ""@ U|>o=@@" U$&n        T?w> gBUCڌt9*мy([ !.S? s F!{jv͝;PG \Un]vAYN{Kbׯ_q+@@@~q_~ UVz88!T#@& ӧO tCׅΡj v۶msٻv?" sɓ~A?!,JKVm Cx3*_'|zƲ5)М'|J2eݶws=Ruv R:Z*ôVzP8.#wG@|Pd >< q^}jРAjٲe($0e=3Q̙33B)k$@U~ }w q?S1bnf8lCd{ipO(;qD>!9 ;KcH @ U|So=@@" U$&n        D`ʕz5vh7n~G:t~ԩSI@lXhQTX~ҤIzᇖd^aw CUPj]ptޔ   .b^4 ~)ZΡ_~ޥKu1 r@ @`UViƌQ@ BvqճgϨ|=N18}onQq-[=n#GaVqš@"WH @  $ :TլY3uY:մiB_o{vZDjµY=wђCh/@V?6lШQt]wQp֩*hm$-kg?#zC_¢(.R^zՕn`KnJe k6~]:ڵkW*g!-ߡ/;#@ 8P+t}լH@H82e|IuFP i/qPJ(     Hp̺xbYtV/]x -!9s&GX :2db$ҥ}u !`;h4iH ~ҠAmoCtȚ5vk׮(kG$@ML  @`ʕʹ;wxiݺzR(:2eo!/?^ &wwȠA@0,HRҎ3F @0}2ol M`۶mҫW/)TlݺU;h|뭷E)S&I$@$hnO?TWX!m۶ѣGkauȑ#zScꪫYpo& $@$X0ѱ~$@$@9sF={vmG{Ra+٤F ]tsɚ5kdݺ@$]v)5k̝;W>s)P@tU!0(W?P,͛7'N)ԓ رcCrˬY$_|$%)BRYjTVM4iES",H ssԊ @ IHHHHHHHHHHHHHHHHHHHHH ^tVXQ;xwagӦM%MAO}2fܹ̙S7i,ZH{15sIj~WL0AJ(1oHXHHHHR%K߾}믿.[M6/_>۝RK̞=[1J*%؎&ueg6m/^\sN9Nqca_4pqk5\ĥ oO?$K,~ɵ+AECϞ=53gJJw ?'|rqJ&n/^שSh1K\ @0-HHcDݵDJ$ (駟nA9v6<™c<իB ҨQ#=/E2(&`0~s7o3խ[W+`m$>zl]2clhzV$Gwh܆~RhQٳ?fndÆ b-s ΜYԘXy Aآo:4""RHgD=;#]31`}X8V]`̘1CΜ9?v,[Li lCo߾];\~~yݻpB^yɘy SN#< d82dcKg.]$YDZb!ɤd} 7,-sm}_'Նתir-q ԧ~*g}V_wu'WU"^_mϗ/ 6grJ]q.Ǐ}dϞ=F_رc >\]`ri=+k ;n#?Yf>9j(=2yˣx nI`eL`AÇ/o]J>}j{:x|E꼺uԪUKnVs &а!IHb@[cI$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@ jժ2e8q,]T5k [M¤XL(P+Tw}RlY0}8ؽ{w-cW=͛' *u.SVtM}WDB*سgϐҦD8WwylٲE;BȜR>[[Bkw,cwc_6p &?_v~X j;%:'K($[_^8ͮ^.ٳG^z%-^F mSrIFpX֬YuxyժUWػ.\X)BMnphWG2P|~ pC Fd4qHHH h'NΝ;k{Ni'ː!{bqNC%%O7ia?p@rt߾xd[rCAk.- =kNڴi##FH6Fׯ*U*jLv@ϊH_u # $DxLltOtwFƍ'sQH⍀*9,Yo-g{IH V9l E`ٲeYJ*U:Kg eYa8)M:8D@.]M<,PVqPb*':pG6oެ:uO?fHHHHHD>VZINd֭ұcGH,~?wch{?6 ǢEը[eU0 ES)5NoI W~GH6>|)wpzJ%&StDȜ9'P4ٳbUG2P1       yx}GJ#m'KN[B4ډrC%%`ҦKNƌ#۶m>([rCܢˑ#\s5nt'xB`ORM@n5]p?;"ϝ;'|OB(Yds7SL2qD=wu;UPk2{l[r{fenl WKΝ[^~eH*؅ H `SݺԊS& bWpMōeHHHHHHHHHHHHHHHHHHHHHH``v#O?4E&\|7z"ɓ'DGZh!ׯ &HBx2~x=iM6O<-;wJZ^Y*]Vk}-hpLڣGj?(:bŊɐ!CLQ&½+Eѓ;|rrЧ[As%w+RCfҵk+Zjٳg%ꯈ<8A?C;]_u6l ٲeݻK˖-u/ {[o'oٲE]Ma޽B(;Ўw! [zr{Y}-,'vn'ڀЯ_?W^>!i… 5k%3 ^aHm-߻1<~&Z?~<ѻ1+Ǘ6E\ [ُ>Lw?=:tH/:/~_Γ'ugZ3رd^t`kÒ%Kv%N-t8lnlko~UT{GhPo !t:?+oMHۭ[7]'+i7NVZ%חz*_|!H;GΝԮRJ9j֬( 7j8x.'%{⭷*+V6ϔSeöhYMvNؖa}7& pώh"~cs#⸵3|HE@JHHH n qe]ƈ&7 } +Vj7|sj#^(l+CZد̸%{<_>Nv"¸,1Fpq 9_6(CЯy91*@IDAT p1dxGӧO$`D iD#Lu1][xյ`6 [Ό3xҤINvE4!u`\Sc8p@͝;W*T 'P3A-… {!b*Ʈ N W>fkʻNNw<}Q?r1.'+XPdXqx:rH=v0\| 1D T34=>ygiS(Kxd4$@@Æ"@$@$HHHH {ϲ`̚HHHHHHHHHHHHHHHHHgà&+[ʹ&[0b+&V\,RG-5RB,5RBDpg̙R,5q]cir`.]Rp[ZI&Vخ[G sYʹ>uZiҤO>nV6lh)Q!U `CMеʔ)Y`KreK Y}$sK zYj򻥜4e˖vZ7p`lO9+G rk),tRv)17KQx*ϗNIY?qUR%o6mڤY -#(#a,%ؤ0[P#O=rYJTJZʑ'{jܸ)/rrjb~ʁ}v7PrQ%KZ#FդI]7%wEo# #%ȥq܄iӦHgɴվ}{Ϯ@mu>AB\ߨ٧AXg} 룏>ڳ$@$@$@$@$@n \pRs$f%!ލK %@n)iK ew^;Duq'*a PBzxd?aX9 6$L>'ҍA ii ן}YO`p)F>2 v 7u6e[9sʟ?DtTرN%wWZv/`16+ByD} CPLQNMV|`)nK98Ęt;'v9mpsӎmR2lf͚5ӶϔGR=}_dkvwyG`Ľ)>(ONۊLD&k<:"[;rU$@$w J'Nc.`H>JRzLaƤ#㮻1JFP^X`a j7n]͛b5W|?A꫎㼂awS؆b@{_sֺ|/2hۨuf)%/aFeW՟X >ʞ=sjڒK=`6laƶz*']S/bL+9ungE: }X_kʩNxId%TiṆCn 7c'LԺuk=ڔ h,^8UGU2k%9{an3`>tOtwCɝwi ʓ s(_,5 HR2{$u g    $ jE.&                0|hhRR-59ݲq^B)c=<V{Z_n HwA@v0F* @&nlnl4n B=©]^RqI^,sM׻_op 'Ʈ a~MgϞziԨggts"}x.)}Z|~ESZ{*l&ނZ&mRkiڴiWd]GD¸HV@oa)A?+ uԧM(9KO}d~W,押qp=wpnt\{ӽ38Ag/_>TN$`P&kҤxh-H$(I^xHHHHHHHHHHHHHHHHHHHHHHb@"HÆ"#2oŋ18?WDM%#q(,۷N%K\(z믗N:+[lL2L.JJQNkd׮]xJEXLj¥w1thѢڊ*Q _~(ىʉTVM01B2SBZz[9b5W)&w~fj"'ˊ+ʩS?U~d5 C&L I༘P]<9e˖5Eny]5Y\G:rQ.rzJK .,&zq^&O,ʡ|P9r㚾ět}QSo_}X uD Y7m}Af$@$@$@$@$@$@a&˖d/MzjJ*ylDn1ƾ.}4h@NPR~'hI-&^K7sg ;C ֛Ug]F9RoQ'l{j9?޶ ugW^?Ă2=Z3f?%⦷+=YqvA߰ ʕKGMI9v͜9s}ŋvD'LAfcVzoK7L>npu]k6qa[Mҥ%az`Sqm#ά3 pA@@$@$@$ƍ'O6mxJoݺY.[e'E ;Gnv%!'}~i](QoQB;2tPm8@B=nlslPy"`{nWאڋuq{mFQ/{?"u3z 8C /2 @ V 4VHHHHHHHHHHHHHHHHHHHHH @P A 8fܹE9#;7kLƏ PBsz2}]vGH/(QB>y^Sco4jH (dwh+8 6`ȑ#! ҥKԩSe=4:g͚5VZ%o|;D#'kj~,u!gAk׮7wiv_vxk5kx~۷oݻwKun+uB]nKӮxX~. ̆`؄ֶmjG9e^-%( sH>,sHHHHHR/*Uhd8ˊ`?vn^m6 Cwd7$Bx/_dƍ)j{K7 ;<ٗ BNg9r$J~`8nt~RDwN7oYp| p QFXN!cB(J,str p\7![vK't͵N;^8 ͊(#F&M$ʹۣ}"Eݾ?gOٳgu?1T۫w>&    p&PT)v !`#pmrƸ$n'1_ ,kʖ-[dsEv+"{2d#blƱxeuŦzĉ=+* ;9D_g=uAَ/\a}if|PlNg]1ueʔ7թ)~X^"SOΝ;'>6sL;T7upۧ+tF7ה;߯q;v},}=7)c\e%O?kAx G y: FPlciĵqgR9j5]rAoL$|dO /^k!Spa={to!PA+8ԩ̚5Kϟ/ݻw8KD@Yuюt'ң�(azi'G yLy~G2m4뮻<j'b+վ  8ǽHHHHH ;+G'6q#v {y?^lYm[nʱEyޏ>g"@m ppggU?v0c{MogxE Rg_m}8ҭ[7,N!XUF OP앞j%Զf=o޼:ҥK%󶑹i[s]㺰?ןx aÆEs5 N7H#o<!~pԩ+rU+"r @D |1eʔ+vz"Rw|gr; *ڟ_Z4h\s5z ucq[/cRmsL{sr%K z/Z|IjpSpi{=f˖M@P{gp=P{$ǸjzQP 'iӦ2cƌ?{a^h$ng}s Ν+M4I5YN8 @ V 4VHHHHHHHHHHHHHHHHHHHHH > @+i'D%$k֭"gttP6Ѥ(9?vco߾r-2i&R,Z(#Mf-\P-**UoFi5kLrʥ;@| ~\tTLN$L^새~NǩfB/'{˾?)p\xDYYF2e9`7L}DxOE\NMB#YĉeA8p/+pl p۪U+gLTL[c?~ԩK      w:tEz%<;w] d/\0gΜD4_7$Jae{=@mǵc8kD6pύ^'?;XB$w˸qT=z ;bڵut'^77j8xuۘǏ[oU;E_2(TNZvGsP_Rx[TzѾ$@$@$@$@$@G=z_~YU:$!=ZR sϙ̀Kc5F"` ~2p@ٻwyڦ.v_`{6kVGdǎa^NPy=W#{F!>h$gB d̘Gd_ cXQ'l슱l-{q~ql͟?_b[۪!b[ؽ~W-({Ӧ\הӳѯ_?ɐ!<3zfٲe!W@hsGfgO= J\ 3_4z)jժm{X#qOt[s5-x9<|;#@cƌbw}wddž> %w1L֭U7`\'Ç_|Qor7d+8O|+WfHHHHHD3gΔJ;`HigxImy/6Kg?n%pwRM=y2y1ީr2o;8 ǻ1y ,!nڂ`7@3foT!.l\Ơ0w\ u`S=իWnm]4_GI xG9alР=W{i;x o(C8 F G&f)Cxe6<˟ts]㹹83 ;9➇]-b>OPpҶm[裏Է߶fqFl# 9 Ug$@$@$@$@$W0?pFa2 0@@Lu1fv;0ܼs@ԧYfj,-nDu}Dxg]l~W=v I._xjz9?A!?q^n8X@*y2!P`Wלw%Z`@L͵嫏#`mH}gWu{믿mǧԷDIn(ݺupe[uk?3R ³$O6@}>0-yCT d?uk߹s.{IuJJ||wXQMJV*TÇSU6QF[&ELZH{.k 6j{:y''7 `NazHͿQpHHXpHH'HHHH {ϲ`̚HHHHHHHHHHHHHHHH?X_YɓuekY?nYYXVϞյeudY[-XM7YVÆUeUjY*XVҖUe(`YrYV֬>̡*JβdI-jYJYVUeժeY $ԧU+jβ:v=,woz衄RT_Kg)ڵkŋ[2eRz~:Sڿ)?sR9P}ԤfK^]O`YxTgGpS}|eo |O9!UP+j_^J*\R/^{55R=|4ib)CG?B'i)DE-5ASF1uR"cXo>KM>T9\y(shNݧ]KM+;K9m;tC}KrS7b-/UH\7&o̙3[1~Q?C}_LѾy7ng^}UK9߈j~$@$@$@$@$@"pROٲ[[x֖mg/y5h(a]MBe<6{zoK)W,&,LۗjԨm9h+q;rmo tw ;H[lNnk+˜lnX?;> cƌ,+=k;iJ(~,%y6;֭[z}6eH)gZ<` S6 :v9L@K7*/E6%qpÎ[5왱|pbj;1S/X [w|3(^+:*aŰؙ}$@$]c$@$@B3`WSBV;v4=v)Cpk'C@c$mgȐA`ơ` ƴMgq)z , 1*< r_)16m/er_R @L%={cbž^hw7nߵ;1bnmJϺG\uѶXa& Ə*ɣLߤi1ȶn&_ؙ~7Kgҹ>{۱הx;~0VvuiC c tPw3?ɲ<}:t(YʌBg-=!*7B #y'wPntuwe Vg(Y0 @|[o$@QE=D%jDenc    yyc"U%               g#r',}C;;iӊO!u~RCk]dRm"Rs҉\ RuH޼WUNVe2ydQADD9M%re(s9ɘ1(&gҋrਖ਼rV j('hȑ#r*cV(fS=&)qI㢜x^Q%ΤʕSQ(zk)?_q#ߩ&m|8۷o5VS&3K{ۈ-H,A C&/@v-%K~m =} BΜ9̔#{I%*4`5j(}MɀD%1g&'    H YJnD(P 7:л[{ lFm)5(DT(r6~7,ݶũx~WscC|ۣ_++qNཌྷ8Bum@Ϝ9?{=^uzoJqZ(C3lJ]޶>{Z7끮U.;^ 7D_9jς &hx߾}E /L$L}C M6ѣͮTx۷Oڷomf]eK޼."|A~tA $>l{'C8sYwF){zcČ3dɒ%RbE(& Dp+6LDA$@B@ոE E7N"SM!J5 !  V`g"               w<+XDUvV,F K#Fe}Hucmb\߹SLMj859_ce{Zqk۶mSرc%R7رtU oe1@i"^|E2e!ֵ`q"y[j\΀"!r8dh S]N7uB*ϩ-ɵ/ښ\LM9p w_|!p qOz!)\% x@iȑ駟ʎ;VN[o{q%bթn'ڞRz?9iG ?e8D\jĉKs3eBS8bŊiQ=k\o!1Mtɽ$@$"et  "0gܹ?UU*P@tU0k :D!N4m4PB TvA)O`o4gIӦMSRaKҤI#Ç%f1"~or!~I͚5e;wp Nuy(eC5645U05}6uGRCwO?<|EgR#Y&H%.iP䧟DѦF$@1CZ'eJ                    #ZeD-C=fįM`>T֬:w{<]7] F_YDڴIW G$?XO\D?\nFɟ?tAڷoŵ2f.u ]C"Z֭[KٲeM+ezoq>?`0GtܴZp/_> W;  Wy~ٟ:uJfϞ\>;j(\%e &!i7qi RJ lnԨMw+bH,؁ܐM-pV8)*׻ɱM;Rx(0 @fd͚5az :T;k!1Y.΀PKҢE -ԓ3giS}/X+W(^e7,]vnjo1b<>{nYxg#Z#WT4 ;V'ɑ#~=64[۷oHK*ŠA'PuG lx(.vu]G7o/"h@"uw!;v|G[pTR%RE1_ TFF ̧\ZԲ9$@UJ:A:7#   ""?/rXJՀ @7UĦB2yKhU4"F@ KT8n{s*Kc d'p/={/J*Uعsv0i$ٰadΜY6m*rvgf͚%<`$GwY;($Mm|َ϶bƍᅲ3gʲeׯ/~     1V\)ӦMnٲEL3pYAHH @p}޵`wk׮-mڴviQWUNwe/3<}rW7|x<);,EHH " @j#pEyW@QյV:uR[3ٞT@`ԩZoJSAC G&r"ɥ_|Q{9#ѽ 6>}Ȟ={?ŗk7}t=ITzƍ˒%KvOc8 .?3}et(]t*=kְa"C:|xT6J*ҪU+ᄚ IH "4 @x)(^zEE;0`̝;W ܺukX?UR)n@XbrwȠAtұ5 jF1Z۷Oڷo/>K cS=/jÇkBH!HEQ9~\ o߾{I=_{e i&-N dfeҤIZd:E1;  N=lz쩟'}JX&)Q}ug=Zƍ''y˥N:RŘ:qZayA]vKٲeM4.`gѢEҨQ8&¦ @z"`RHHbUjdIHHH f ǎlXq              "F@҈LAʬIgJ|uhīS2-FmPf$@qKCwޭg <&\9sFҨEҥcf8g *hp@$@)IRk˖-1 ~]\rIյd8B` "3 @8p[N6lؠo>- A @H_%v;v֭[=?ؒ`SؾV*˗/0%-ZE|"xҸqc9t*T(E0O JfD$@$ "}$rB`[uN &KoC9Yި_UJ`۔5qbn@=*_};VVZm{ւ;9s !G&EMT({X{9)eԨQZ@0 EQ\+)d6T.a'Ν;RJZGy 5["^+" &M0A4kL+[ZVj&oo +5kwg}V'HH 'hyg g̋HWQcD.< )3$             p#(eħ춽|g&m0ī| Wگ_j᪌}E@M>%DP' \@IDAT &pI=X8g6K8DȜ9+WN;g._^Q:h&m p0Gپ}l۶MȮstYI*U$adQҢE[M6bGhԩSo%K5\#;vݻKO\Zqy5ڲ,Y|?^ Al6ƶmj!:u0@ `EdʁΝ;wܡC`nVM&[29so-3gΔ Hn\R/+Wg}{?,ժUKfHRș3Jjp 8#@AO8Bgǔ$@$@$@$H$@$@$@$@$@$@$@$@$@$@$@$@$@qJҽm{Jq5'1`?4=17nҧKTHHɓ'=B6FA32?; D L޻wvl C0 N}9@61B $@$@$@$@$@$@ @h T;vKcӧO m a19s^ΐk$@$;&hGp"Ͽ^s%K֢46jS8+2'[n˨Q"S@r#UV <2 @h?C @rXVF w%^u(!e5E>ꫯd\vm-xҼys^:ݡXϟe˖/3f̐-[ʁ KZ{Z~%mk2eݙ@xiӦҬY3X6֭ c.]*xNvI) d"=(ȑ#DI+W l3 O`͚52i$0aFsܳgOHH v"0 @rV):;$   W8&F"            HF.$Jn=2d $b01" $0ڵK; f8ꫯEjΙ+& $&&&pE9x1&Sΐ_~E9JPЅ#^8sv~\T)^8HHHHHHDȑ#ZX Zx/3~I=y?3 ls&*TH @AL#F؍`?:{… {F%J?؋N@iFɣf&1'c<ГH]DbHH"ICyJ6lY^Zs$e+W"7ʘx;wؚ5k~Pҍ7(MBNFRJ)32_I/Ul2|Yd;@jذM6B`˂"@Ap]d/oѢErIɛ74nX4h u֕UJ w *W˗O=lR ;˗]d3'I*2_;V9v옔+WNHV~*FzKp$[\N;W#Ma5IRoԪ%}HٲAl @LV觉ZcJ   pE ]ab$            H ߗUNN•_c.w VTɵm/s]6F"  "A-kp&Y BzOSfl)RD2wqŎ%X!p%U5:$؛)S&-W\9e Yd$@$@$@$@$@$@ƈ ~c֍ &M)P~1f :(Nu] "὎}'Q}t6`؅a7 X!f9dQ![- ,(G}Զ$@$": kE$@$~cukpij q"RFJxDwQCH'EzJ$sfx{m&GDԩSziԬYSe杔1L`2u!9ztqn;WGM:%UQ4-Z+1LV=(A,kC׫H҉'cW.5jy |b %n|ZÇ7߬g[ d0 @4PzZ|㏣6 @<Psj]E7 KD$@$@$@8 w L,^ŧ3LWa~s{|/2bR}݈Sӱ̙/RُZ8  @ 9sF;hsfo1L87jIXf8ĶgA|+{&)$ 1I ?Z'N80!zy)RD iAHHHHHH )l9pfkD؎x_5΋!;`?qaہ3 ;i؏`/B|(mڴ]$Bf؎dbSnVvܸqQU ?@$@N. ~$@$@sxr߾T' g) %Z%JwÆ<ȅ q`N"o#KTrRD $0+PQ *ED@әg3' 0`@ofٝ]fw'i;tMu=[K'J֙ri yй0Y'O?v|ba']Alq >)"}Z=Ƈ~.F - -[n.ܹvuW7v֨Q $vhs6{-I&gMV\p@Ƃ?5KtT_ ,-@^OK~j׮]e!Z6wJ*%-Yo_ij'ʹ Yz.Y׾c[3P'f5wokPr9n9e獅.l>gJn3@.XzXw DԊjo@y5  Pl'      @nR>x*B(!#'vs"$=ȕ+u)4vς¶Of|+  O)s4nȭ[n~̾cf:ul0֮];xlS b@ָJm;.[,#d ُ]r+dž0:֨QO!  d]Zi>9vjb~c!\qX6vѩ)[eY Yx~Oe+V ˈAlp]4_,J9映I>l6z߿;-r@wQr; P.;u.ak5k& ZӦI#G& 7 ~z!\?Jϰ ~A@d|Ǯ]kkWѲeK~{5o\Md7|E> O>$7۰1vi m۶.vygYE,->}}eZ9#~͛C~ժU >[Zh!6m.jy0^~ZB,Ydo`>Bi3F a,sϕΕ^{-ʝɥx3gԬY-m}oO/Y}߶6V }o^t.\a,sW_}ld%Tf]tn.1ւ@LxiwodB)#dZ% *D@aRLl     dIPhᅦ}Ut>ѺdG{Jzp}J0*^XN~ZغDr@@EnxND "izA'̾Sf֬Y3[Qa[l!!݅m/pNcc!2{ ;կ__6J*   ]WGq#]aAnǮcwD6z ?Z}S[y,/:n9 ~Ocߪ4:;Xzh\tYGz>D5$`@}UG)ƳJSN9%D_.q@ wDv rk`,{rգulap2ru+)%mdW\!wb/kMuVoN6-:v!6X]Ѷniu\FyC|w믃6 /FkesX Xwq HAK'?o-rE@\yc,>{lP.ɇ Z3gm .FG?Zؠ냹}YxdS7smٖP3 Ms:߾w>\]&>;lwk G}|^e7~ZѿwF߿e,7Ծ39Է%ߧg۵ko>xrOۼtw1ߙ>]޽쏟G 5_=ʎ        IphTIv#oq¬*WMEl݇nn ]=ԧX  & Xvvc#f2Gl:2:qm?dys;^S[|U܅[-:.taJX'=Wpmuhjҏ6ocsd?okעlwڶmFp:CG{.    `6Zh&ZcѠhђ%KY>%:X][Mep|N=6'*[-Yn^G?D oϵ:{lߌ^w_?ݬnȖ6ꏬ(eg@N:Oa:ҭX@@}³|ˊrAaH;K]Jg-u(n-W_Qzc}6-ctdaN6V`A'6Z}uvoL:5?5\[HGdM?q~cf|ۘvTApزhﰐ1 =3Z_̓y3OUtr׳)CDV_}}goYcc4h~ $s}nwocSY}{c3nkjw[Mc44g2<0={瑍v /`bǭZ c9& ew"e~ca=ˇl;nߵmG{7ql_VV-['Sto6?/ogCSwd}Bg=6 vىzM|@ RW}6        @ b\OW>dco|ewo׿TC^\`U0יXe%6>m[%@@@@v4Yf%bFXߏXhj|7c1Mn.x:lhska7/i[9bDEYG֡M㍶n,&:C4Yl7,։Qn#y:;.+   _)|u8)?DuLئF:V?}Ýn$zh}OǶFcfi ~>c_vўz_7duDm۲c_dA$1xS:p/f/}}c1 iwkWiE]NŢ,  z |M]F0X:HGN-g*>gM-l[nAq >l }"۷тb{/A?믃?m{{bۿ}/ng!:lWƛc_@W{ jӦMp~a3}x ͅ3@:_?J       l$`7ؠ*)/vYq~yFQ@+&{hT|0mDV˹/e?   @ X>HN:ZShSp{m_;4{mO[?gαc;g61F?ey[I߬l7yc:Bc@@@@ X]_Jkj2>\qMcu챯Gv|'ɾ'}ݏM=?yys Ze>ǏN'S_x}S[;ʳѣ5k֬A o\NÜ9s]v%EY@@(sW?8<5﮵%Ьs-r9G ,æd矃 ׊ ϯgCy,ock6Z^>|}Mc.ةuC, e>rPPjwKr]/8| J P<{vm1gg9ìlh֬\YI? .>?'cgRt}珍Ҙ+e@zrurrSQfJ Q۶m[(i!fC}_-X~f6ߧ׬^:8?{T4~cRܬ  tF(\'Vb  PqY%@@@@@@@@,pxl\|Tqymt6z Jvp&@ )|;fU0ˀ   9s` JG JbR6@@@@|}Oum?sl1cFuGUV2dN<Ġ#rcui`w;NŢ,  /H.[V'͞N͓>ft #u(o/  ucud5<&,#`/~[S⋂P- ҸrsgiL$3i'O_.8!Yd}sIw%zjР${9jಖ )_ *u*NB_\ Ab] r9ZPu@t4_!ʇ       %4e!SATnMvRP+heAUkoj]/*z[nZ         /{o9眣#FNvX^`7f;^ϭcL@@Qo6 βO> , 0|.7N&LP>}4l0,P' Z`;ehs@@T Z%}AAhg믒ݿaCJeu릲+.|PV]1l@ҋ/JcBnE1B.X]bB.L:4Re  ˖IsHW^ge@vpٞWN;H&fQh @ ̙vV ]je       duT0m]tJvjME*ljf7/އTEz;.        p-*vyDEdWNр78ʖY 6\hЫvv,@@@@@@@@@R 38C׿\أ{k׮6lz *.gգGp  !vgahgY֖[G)?.}Xdj+%]~tmҸqaeYPN@piӤc-|" бhQ&2f@~Ґ!{TrʊjےW3 ZzP@@@@@@VB| Uqրph {ݺhTEۼݘ]G 6+Ll         @*6s׎8`|뭷`>}y' WB4(z?`@@@@@@@@@@Rhٲnv]uU0anf5Jz ͛5E K /: o&M]h@@x ӂ,B 7v(5m =Ν{--px+À;8Sv ]ϝLU@l}eN;MZL[C @LU;6KN@ P+_c@@@@@@ ,*ve^6V-phr~;Z(VXZ@@@@@@@@@2PaÆA_u5Vw:( 6uMOfE)PC SN@@`Cի>0<_~V$ <8ZVzGdǽp6TI:T:Xi@GӥѣڵVL@6M:.#C YZ+ݚH^#3ϔ{,&LD]H_-}Ԥ_@ .^ʀ      WhxU`hU TЪ 6nSԼB@@@@@@@@@@M5Z<\]{ΕG5{A,hqSyn*Vu8ŋ룏>ҭZ  X\, qli|i͚vЬNb@ F,0W\8;{Nzi %so3F >LZDgL+9E @͚ڵa֏^]:0idRe~@ vEPA5@{9cHw|      @GAUe@uvSaPjx52}V:m~=7K*@@@@@@@@@U //Ow\0N6-:ܺuk :T*Wŧ\Y$`kwr^xUw=QX   P\*YI)կptEax;H'9)GC5ϥGo? ?^[78W$W=еk&"XlX"/O:hɮ7N>  KNDZ~ʀ >jkAI@@@@@@rhUt«89+WJ~jvӑJ4+koE_fS[í5ZiY          @={Ӎ7ި:K]v >[j*|E`*Vum6"@(_7p͚YN;v٦TNX_p~ёG@EvƾI³|P.H]GjV!e(0uӉ2TP) j<Eoli\@M% =@T JM     X`Z!U>_7\&9>lyQaW*WņXǍрDmi̚?v         @]ӵ^qiȑg .uHO)`f1yyyZk iXr^}U;Ja@@!͝ax֜9uvN;Iut睥ڵ{`bN:uU#$'z/ora=|ޜdiyeV)- Ԫ]X@T:J<@ ,@@Uz䑰 AH啠      VINGFG6WTE4ccU_"         Y.иqc=Z#FwܡoV߾}5tPo>80[,^~eYr  eax{}$P^]]v8# jF@x;H[7+:+,tp$#@-)0tI @ wzDj ,_Y,)OiBe]!9"ХR۶9rҜ& t/ED@@@@@ X !Uyh.޲ /݌ラM& &,Fn)ܟ         Yt@IDAT z}6l.$x㍮CիW`+@'|RݺuV[m' %apв矇Gb:ȅJ_gmfeQ2@v X'JM,RMd9B;NsO餓䮃Q罶P4V"@ L&ը!k Pf>PkŊ2;$1 !r0$ծ@'`!ZժIfU<9FJW@e      PuR4*po>vۢ V-ڵë⭏.{@@@@@@@@@@*J*O^xAG~;Z{*V[zdogڵexĂCqy]r% C@$jGgSbAYu]VpM:$OFBSZ-Vf ْU и+u< ի g9"@: L*\r:2!P2{Jdzm!Ph)@ guNai߆ e/@@ٛsD@@@@@2N[pկJBlYab 9f >ʖU.meAV4?'}z g-           tAw N< h:];`bFkiٲeݻw1J̦  ^%3gy$rem04먣y5"@i cJHnZJ?*TG7DG]3J?W_LC6t:`@ j$P+^δ<[nfӲ Hc.]Ӹ ArE@@@@@S`ڍîbCqذǶ5/lR% VS ]86ʯd@@@@@@@@@@@ vuWM2E-M7j]y8p; 4fϖ. Owmκ ;xg%'@ nV^]3 WOzykϗ~[Sg@J[`4;B7.>7b @_ECҨQrᄥy$d@rQu}!(P1 M@@@@@(m% VѠEe<SZe46 4+THtT#     x^{M׿s飏>}jᆰVZPr/@@@@2T{GaÆט1cC~xl=(¸#O:4|p]tEA,䫸 I|ImoZ]~ݬ {||7W_裏Nl da`gҊ=ۡtYg@ 0-c|*UK'}x =3ѣsK{Ck3h y:JpYwU:>PzI?uNY`TW +QI/O*# Բ~l(M Ͻ:7=L͑kԼ 7ԑ}W@r@O@     )p++zC|4*vYyE5BZ WE\E+WN @@@@@@(@SŋӲeˊ:;w=rБl J@@@_uY0`~iY՞nݺVGqʢ~pKaÆ;vJM@۲@-֮]t^:Gx'OV6mԮ]W@B ɲ, ͚=;ZjU&( Ͳ-D}{:g@5J:Puk驧I&.$ȓ*֖fڴiz\ВKZJaѢEZdlʐ:f͒\Սvn]SD\I͘!UuS/FEO7*/t+3)1 .aV&2" @V.ʜ#     &^VD_~ W-PDC*aUE|.W~}$ڇ'*@@@@@@Ho?+A'A'|4*fP  Et@@@6E/ϵz޽{믿ѣG裏V˖-5dȐ ·Jkhܸq뭷Zg}飙3gtt?U\߯н,G}T u~@Tf>z}:vZ:K18-rP?zKr`7k֬HW_}ՅwJԔ)S|^Yop nmY:m\ԯԳ1dis PRjQ_/,Ub>X 6ntRX'ikz (Z}@lJul Q@@@@@W`0,]E-_*9ٍ>*:Vv_6̖sFbs      H^zi;keZvt) @@@@2F|sOGi̘1Aш#tys׭[7VٰaC5i$|-wQ@~R^HvTG *:Էo߲:$A@JE`zi‚ W`n00뤓- r_@ F#T Zdk+ aZ/SgjԐ~ZBriHS~v9.0m\vm?h2-Pk +4H >\,)Ļ=u{}uWLf@(_ן#    )`hЕ>~ٚ5Vd _-OV[mU~]^|ժ@@@@@@J"h„ nB_n3QcN?tm6kuz_Vu5:kw:ݍ֡Ë/[ƍ-ܢyi]v]tAr."^:Xf2DӧOc{N?{x =矃2~ի/z`oթSXj_     (vqGu]꫃nI_N;4 w?Wn-X@zNPkݺu)oa;hXߺm:@ P,9     # |xUt\e~nzH4X[H5knreAX66jT<^8V2{ld@@@@@@@ ct V+]߮g}V{챇8Y!ugm6vs :5lذcÇ렃 #^ ך4iR1,dF`:NXO>dg(Cu-CN,\ˆz+?v nlka]>PkĈ}AgB{ァs v?    @ P#eSV[mc]r%A՝M8QsLPgA͇gy5j|Awy5Z[o::iցNIEdž>PCbXjUP7{W8  P"~*Κ=[{\d_ҝwóApVvR*%:OB,ukv%YHŋ) /v ޷o dG =˥^\ tIAX'|ھL2E{wX+UVN`}augqF65guVОgȐ!u).g4m4=c!} ¿,DX8ܹsewpk} /^zI*ݏӍ\Չ7 \zϛXﴯ.>m<:"L'?[oIRlp_}uewXgl2\mƻֶk[޶z`¾\D_I@ ֩#DV"%#e'2ɑ@@Vͩd@@2/V6M4~M];f7.T]Eìml] qY      ^_ayA@nmpֹ۲eK͛7O+W:y~| 7x{:??:(խ[7\UnԨQ x˖Mu_ُe]}պ-:z=ꫯ԰a DEZpjժek׮A'Dk֬u(k7-[gAuQvu I&<;Y0    d)Y7T- oJp? m~6mh̙AmtM Syx@:k/}ײ| :r05@ ["[^I#ג 0B|x֒%9̄Y~~W (9#@QׅPɅWuTn'²h C5c {Ag= :w]~f.e= m}smXu)J65& PςcrX7,+k&xlYvoZl{lڴi0C\}`dOB$JG!YO$ܘ Xf۶҄ b9)r҂~m|ihh=%.@r֮og޶6?)GX[Pn5=\L>]={ ~~ᇠ`5kL5\Iۉ iw ᅲWPr_`!P۲)     1VaW+V$ClY  rYEv.odZ        Pr?uPЩӲY[,:ud?hz0yW+[hZlúu\D-,xjժyr,!yȑ9Iu|DVoWV-اuRju6n:~wJ_^֬YSsGzY߉c   Ίg-[kڼy~bB,@Q#@\6t.ɓ',x P˯׮X 6o×_~LaƱmj3}뮻޲656;NӧO: Np  ,p;4#   /@On~׍7ިO?]Ç矯3<3+!";jbmò صkצvq?ўwg-@@ 4g\8@Axܹa+[kut`SW&`|t5rgԩSbkSup֦Ɔdڬ$jScϷk ԲFnݺ魷O?XGѐ{^t2s=A8][֭ުN8!hc'? ojdK/Iߖ @aIgYz5?ifj}u!e%`J˗˅~' !m} T E]6t2%j[jAvU]BMEi(]Jח#    ׇ!X>*/Ы|c FfU` +?uWdxS r_@@@@@@@ 6nL_~,Y.l7no˒7c7_wŽnw86r gyFwyfΜZn喠S*]NBL<@ 2D/= dʸHk7(jj,ZH͚5`@@@@LgzPGk?Y>#Gjܸqꪫz:+u[38C_Ə_m) TzUjU}ѥxF@rMev ³li\²v~7óڴ0&׼8_( $O nݺ`믿V:KIlJENԹsg=c:#\?e׊\p/vܩn¹/BM4I'|zk5j(xΦ{]h͒f\,'&-Ge8mHV`*7gTviHO&7)UFVVRΣ |R߿NU{!܉vmZ\ E첋dU'gK^ƬF(U wv    i)`[MwFO?-wctuI^*{tIRa.]w9 UKP֭/wacJ/Zl)!4l܍Ҕ) /Ho!͙#r\ᅲ>4?>|?!+w#l/w_:;5lW'L+- )      ):@uq?Vsww!Xj7Z':阵EzG]'h}$#,ь`YM7ݤo.[ Up9~q~gr-[,?3Wo'/13    @f Pra̘1A=%\z(?Sݽ bfw}|&@Ea ũ-iYu?c! @n OhIӪV ˽  gjז:H}CjN#B,`U+s0,#]Ahs~L. = "۱ Vvɒpk~+O/K7 !]ptir7J86,oӦRݺ_[!      @@F{ndذG:ٵcmz뭃)8{_|2MŃ Rt?Z0^{t~uL?`B :3}X=nӦsOլYSn̯,l„ ֮]}רQC?;8pﯱc@@@@ Sŋ_3gtO!awƍua; ˗/+`A e#;w/@_g)R6'Q@@ \̑?7G:Gw;O.E[髯g& jBwf ! Lp'*K,OX"_Ë"L ֦Ɔ^N6ƷS[mSciRXۇiժU;8[$ ٲolCl[7eʔ|+aB~'O?ԩg7kOeCq {!//O??iAdѿV΢T2Bw?MEƻԖE Qz M `" P/%@@W[@@d@@M~n,Zg62¦ Z[u&ױcUg      %Pv5iV#G駟.gϞzgt 'hĈL4)Xf^xaQޫ׫K.zuu_SOo» qƩJ*:0+넨e˖,+Ktoz,_?>Cz뭷t5@km [e76?z_w}Z]vv}c9FK. ['CV^`@@@@2YZs=ѣGkƌu]5l0}A'YޞwqGY}u=dyAENNOcZJ~~{IٻԩS)%zO>Ԏ@ؙ.`[x{ԼyaUJmJ;J:0L?oʏ!v\[i%S&MP駟V>}\j7G>viIsmVW]u &%>?t[nUE>(lh\c7cׯ_?Z׫otΛ06 ̪z?:g-yԯc   d??ѹYfZO<,h-k7n| ,YDM6̙3եKR)uظq㠣#F1) PwQޯo)Ͳ- ϲMS b)Y.U+fQNEN>YZPjlC y tdYb7vONͮ-|8æYp6XY+Uv6+bf }WAxv?1_/\x4y2a P+ rQ;iq!(pIn3[g'}Gɪd2@\x#,lQm3.\d-ED \޸/I BpJUr; $%@ä@Hka!Wh/Ǯ/5װf㢹>6 Š >N4oAX        vG@@@@_9͏3Fw_5p @As9XҥKaWow}Rxַo_-^XM4)cS@_neAYeY><lpY2Y~c@ygMiҤХlzwթS7` )6- :liܸ4vCV& ԫ\ᮺu Z.$1X`)af¹ 7 Ê}Cl ²ǿl+KpC^5㯏>ǶP-@@@@@@@@@@@@hѢ&NJ&LЭ.Yd:S4x`l2} %X1g͚5pwꠃ"LԄ1 +jYyyҎ;YChխ[e @*^xA3Gz{[d=BYf7`))SzA?{'E}M/RUEHSDP-Qw؃$FXb+{l1jB좂 b=/{w[^x ;.;;ߙC3Ҍ :u* ?/^\P `׽pԠAz]vq}WY 6iR!\!5ׇ5@U@|}h7    Wx;a°6, Wi#u*eae=       PߨZn,wӐ!C*j^   Լ?~Yguտo͘1#7,k:\vet6@zGpG}g}V=X%s@Q+;,ˡY3N'Mٸih֑G=FqMi3 z+vMٳ@I,(oVw\ @@r HᄏbxָqiRw3EGyC{LzB^K-_ח~XG:hGuMh7dS`({wUlΕy!z P+uҥvixB W!@> xv}lkB@ rw@@@rX`2 1+ceNj0 5xWna0            @ tUwq?hĈ+uיgm`k1PkY_[n%q쩍6(f  zkw) zm!0.LڴԳ 'HrXt|s @ &u _-}I;(]}tY^ZU/@~9,\j;R|R߾K @E6Tj\r6Z @vʎ#sA@@@p(̙i0V`UMt(jI͚bŠ6mn$ߏeN 8?!            @v6`]qonM^{n Rǎ=:+X}>5୷@)jJ"   @ C)b(ʦɊC7/ aWl"`a_ִE N>7!            M6YgN;M zkwNvu5;/]@zx=Bw0ZԱ{Tu<@V-M{f,_rѓN* r @vBYG:̏ P+tiN&U4*+l}v!}hQ(!H*]}5k@= X{@&ԪI}   3' ےЫ`Uz@ZkWk]զԽ+k0ڵKύ             Pv: <bڊ @M̀@ t$9{Ԫ7#@^ -4qbW @Uo"   @M 8*_9 +e=ò<]p@Ov:딄co_r;o9ӊW#@@@@@@@@@@@@@*g 5\.HC O駟 6ؠs@IDATj\Ds[ ^|E luҥ؉*իTև~;,?sukњg惯rOrt px _q>C@@@@@@@RE ;n.9jz/[;@@@@r_hԲePB7 5rH^(ṡ8,a+9qŋ+2}k$T뢋.z뭧N]vx ,,e,O'L|-zFRih֡Sm8ט#+嗒8 a /Yk(z5!wMױ93}%w۷oNXNe7:(    @n +[V&+k gGR j{C@@@D'}';8S?'9^; :ImWW3E@@@@@@@80Vs5BZ@@@@<'O8lzCd >< ԺuꩧSNѺ뮋TuC%EU?@Uq~O>dnFVi!#?JǧY18kXi޼|ihy畄glkkA{@!@ #?K6vZz.]N IZk|i9Dl+woRz+AbVfBX/!6L>i=WVV-D[GqU,]@b   e C5mZC,)9 kXݺI;쐆eq?~n:%        @O曟m?    ?>U l5tPp tWco~$isn/뗿Ꞛ*_|@-ϧv4>#tWd<@*5KrXohM$9$š[l!%}tս԰a7 @^0laZE 9+pei?Ǘ^ͤa P j<βBoTbּCYҿ/U':Ȑ@K;ZPL@5 Pk    @̝+9 'eev萬ٳW\&MJվԯ_-ŀ,mu ZQ{        @ "#T(@P` Q@@@@X<~hO 9T߮kFr s9G[mO^p_[rH| ׯt@ԩ_wqjժ8 U.gi)SzugtixVL WyX @N \_u\W@. vy)Kg!l˭m P .\U. &2dǹ@ UlH.=D?- @ wj(6g}@@@4 +dy,?6~Z808[~@Y*lM7Mó?>-ma54E 䕀kjb鷿]3!IBx#Ϗ6JXkx5,[W'n@BB?5"_*#9}i ERZ_M @^ oG@@ SgΔ*}bWǾ~E-֭KpPbpo ;W        }JۧQ^R    *CO;pA=\{k׮:쳓o׼y, {Z`AU ԲˬY~Qn]Ipo3  Paq~׵M>ix p6kV-a &*e .9eWC 6:Kӟҩ1 @ ֗Æ3y>RFjN׎@B~s{'P-7c26 @/3uE@8çY   |o/L4eZA4 k i X s@@@@@@@@Sਣ//9~xqZ    @! sS 8PǏJ'x N;M7pCF/tzf rϟoe<\7+5#T0+mmV?Lƀ @6\4wJ³ix&SOկBݺ)ld PejKW^Y"s! s=|to[kʺ!P< c"`\D`Q4@|+m sv"/@V   3gAY_|NG?擳xqIs}2Cv%oٲ5B@@@@@@@@`e*]vY_6޻>@@@@[~h}w;StGPsт tE}2ZӦM[aջwo=jԨ  2e,g}yj_65otꢚm&Q<@<volv椓j@~  'HtRz~Z?pVPLn%z֮]Z/~!]z4ttin! ߴ>@V.I@bzYW@@@aX'zo+4\o|hXpÒq/>@ndK         t(!nZHh%j1    ?>hӦ ^!vt%U /b͛7OW\qEgϬL_|յkW=3Zk? @V&x4i,ŌSK:YR+# =JEIG-xcϜ5SOZzACsu**UtR> G b0 В^]z\hm@rU Ojh Pj:!  X0 4,+NcpӦ)\d'Up N2v.[zY        @:J:̙    @ So f{Ncǎ]R?i1bjժAV`ZROF\XAܹҸq%Y?^GAѻ8Ӟ=&MLJ5E-j-Zi9\rl l~uMW@M bo6\袚j Ef2klKX:' 2EZ > |\3 @ʶ(C@@rDξZ:59ӃnrDht0sXH:@@@@@@@@rVsΑZv)gI@@@@*)@O%xY  ŋWBn! պ[UvU>?@yUӦMK߶m[=Zgu*z PށYq|%_c҅k Z!+z1.n;Lwmh98di4a  I J Jw-կBXUΚ̅"]ͥ', PhԺ* mX@ 7( B@@V+tcK֭p 68=St9aj<@@@@@@@@.k֬Ywiٚ3gN2s熋p$^=]ոdn\ln5? 'Ϭjt!FbCظqǿ5mT͚5[all2w@@@@ 8/g*ǩ¨! #͜93f-{&9 4gˡ;CN Bբ_k/i.rB*_V5g!PǏ3[z 'cm?5*f|fn۞91ײF7}?_' CяžZK'4i|3 䎀F>8 rhV ꫴwos@K'W|,x9z~1ߒy5:3s};̛RL=w\R'&>!ıW1>}T4yG~_" VKd侀O3}zg5v?/niwqǼ}ܞ]z{}k˷oޞeenǼ۷>دWzcy~ s^,?*B7=}}ҷw_1dޏeMyҥ{6ݣ6{ /{>>c:qJKM~Kԯc@!@sX'1O jV_@@@ǣO>L)cִi%Msek'u*{?"+}xSbFSO2/.eM\dޟ_oopAH⠀F?2O=<҃|>Q %S{(N㾒>Q #GRSOIZX 7zڸ(ṟ.'o_&\òJ@{;,3Cmoc]i ЪH{uWaշTo{,땞zUO/*;7qGoܿ91 Cq Sځ.mUq[vܟܗ0ޏ2>Qz1̗F|,;>߾vqk}ߎ.x\S?q[q.qş(,- ֋A]a?QzyivY6B   KGhx.&}ˏc         dMzH￟L? 'Oq1+bgbm" XDL}hśAe-=ztR9^h8hqԩ<~u_(]u9    P|cz3τ'\zPIhРAI0UllLCv6 ky,=,Y$3fL(dz2u]IMy睵.$k :?_>u?ǯ*hcfVBmӕ.}vye^gNt?Gۮ"˱f,ЙYӏw_,r]n}1S.@|$0+gyk,'zRm&}v`|^cڎ䮀*coK]|]v[ 'ȼϗ`(0-/ct(ޟ _b8Aq}&Hfq}tCpzTG /P++@̤Js^Z@3  T7J]&>S(Pf} 9%{ P!Ҧ*IGߎo-PYV @@@@@@@@`M&B}'NLz޾p67|p.˦&v1 o;P2OCqC7.Ѿ}{uUݺuKF_UQ4k+@@@@P+?,X;OҥK;Cg}6 {饗?$0￿.ܗ7eʔҚ;w@y,©wbz.5g,\ :+uq>s)j1ErEG\~n)3<+_[ IaM@, 8(17RÉ}_sM\0,YE<p-T7&1xKmۖ,v M 9 6-t*n y 8w9z.&T]>;dD)o/n۫81g+y[s{dO% k뭷~\o{-q&x[ ,XP.>?CL|,8\>Vџ x?nJsq%soF̀5+puС k,K t5ߡKo_mUG@ D K(\" iJp<2Bmp1=XV!A`@@@@@@@@@\@7Ԙ1cB.agfN\rA;[:$F1 ̙3' r֤Ivgܹs(.+rKGM4z[!   رcuwꡇJԹ{~%,̣G?9l:c"f[p}х<@0F.pGZjU2Sn!. AnZ eиqcm.zux.Ȁ%+.BfƏOq8@@n]c[i!sez/X@߂ 1,Ŀ];7ԩS' fS6'"IW8} -P ԣ栮8sTx3ythZkʴBdk }5Ԉ*X,ZUYzɓ'/OogϞ|}1hӸ-t_Ͻd@*-Zl|1͟e=oz-͜93y]م%S.   @>}*:餓{|X=su~.Z7a„>7%rkf:v1 Ѯ"1uQ~kдipllYݺu[>1"а#P.fR8Y2:<쇯HvpV OJ6cE@\H޿{.;Ͽ\l;dN]hޡZ _L>}yPI ,! ݉Xo}~{c -X}}bBN>'ǖ$W[]wߕwh|\q_&~;|Μ9I's2qg4iRYõ~KCPmA:XsY{m' Y1(*>Uy;^ K&N0,WxE.>4~|:NpQ4e aRz  1Nґ"        @ 8,^?\ofm[o߾jݺu E檀'3F]7L>;-ZPCW^D7v!   P.8b]wu;wo?W .~,ZH=nV?I{:T*ew]~| -.5TGcln|.&/hi,D=1\xg%iԨQճgϤ/-؂EyԠ@U׻ׄ^C|,hxTwE(3F!:ؿjժ6( qhG j3 @fϞBXVѡ[-'/7hӦM3%p ҳϖy$6!7n\2m[x;C}wq{HAo]r?}>؃[=Buح[7zUkX胿)xџװa$'~w;1B13 =iw})V_(Km[䓥/<T@+@@J T l/Ch±$$kX i8?EKY ‰)%pnXU4P(        @ SO=~Z/BrQ/0`@2nvN~qa$+b]X^|E=ZӧOOvygmݴw<@@@ H`̙kt'ۧvN=TjժֲVŅʮ*qZwuuyN 2… ,{t 8.YD͚5[^LaA.,Brkvn4V PsIHu,Ze:؄SoǾ}j֪V8X@]d(f98+gz@Oó6pU-o e ㏚0a a!5mڴ-ZHBb`qyg,QC >E0XiU)ľxI&oPqȴXw)JUmCz뭰v2u7۾ݻ' BQh4ud{ߙǏOFϛ7/ߖC v>}M6 ! mBBhT,g@Rd;wn*;;D?y5Ʊ˔)S>Sap]KPVp [j\`&J@ʿjUގW"  ZOB-Rp%=7.l1dBGE,4WǎgdžG@@@@@@@rF[p>裤PN;$ytpq?ER{}']@@@ [Ŵn :TuYgSN9EMW_%Z7|s?Ix K/_~YJ?$K,/n߾=H\1cg}l?\hg?v[mvj۶m@e],XP8V?gWO!lRvسB(eN>BrZ! !B:,A!!믿~NC iOa%&j׮u\T~VOM0KB\éu߿|gCskcC0o [jsCf@5pЖ"`9,m6z뭓z0~s/|"9ot0sպudƁq_kL"Xt??l ̜93q] \t֬Yo.18:|  ]pJ P.T*@@ T-9!PKJ&IpP%}"nE+'zt;        $uO\t^{V[mEA[\dz'`7_馛()V@@@x=\u '&N%\.**Z?\{^.[&TҘ\mԨQrpG .T (+_//~ꫯ_׼yk;*wi'i& fn Jջ[0ó_ZD!!FYfS__?\π Pq)S$a %,\PmQBhqZwuHUE@@@C믿^;w.́5r)" 1B{l0t$'O?lРAR==:@QF¬y"xȢ$䥗^J,XvIKXҦMkx5  iUyP 7Ty>G! ? ̏#3pd\j~SXY6mZ%kʽ{'֭[7K-y;_Jϝu9sf~駟_|n;Ni Ը7nyآEc7n\mTK^K` PhjU%Pv@z[@IDAT(ZbI(Kѳϖ~p@,=* 'q2.@@@@@@@@XdO{ァAOLCP()OZ,-ZH?np׳E\@@@r_>Hk׮~X[lE7ZSOCQ.]>uY֮VŅF{7:Qc=BI UϜȾٳ."^{|?.x7g)0wBR%hy:~|Zْ뭧<)]uଞ=&M ӂBjB࣏> .iЯC[hqsB6tӚhDpAzxtg}>}$}!&xE4=)=x oƍs%ࢊ̋]d# ']k< bY1<+ԬN0$0{No-H] -!4f RА-Rf@Bz+y"lrC>d,}'dž<1ԩSUW< !Pv_O>IB% &Y'@̙3GO>yTf͒~>~&}t?;W_%2{^Ї;f_f@! ,\0gLr!͛nE"ej >E¬&Z#Pv@(ZbIE"l*.=FIjٲH0XM@@@@@@@@0a~_'z:([8+%Zxm    @ L:Ul:v]kruu JX3W]uU{: pb+9RM        /zk֤p򌋾j*MXc:$^}UM2E]tIµx@@@"}W뭷^R𦬰L6h#=ӡ:ꨣh^Cj{쑄խ[W^{5x≄iͺ  &]K!@(4 Ӱ!J;;2v EENC~7H.29HCJRh* ; k.)$>)guaZVN 8=SPZmB9眓7JȤI}Thk?}:g7ߔ; ʟ"Pm>ua~aN:鮻Ғ%K-4,X@76Ls6|ƌs=0yX OW^l||ǀwuWGQnp@Rȇ̙. jC@@cŋ:'].R`E<9= t@@@@@@@@J ̚5+oIУ>M6٤Գ@a lVz5d{IEJv   矯O?T<򈚹,CN9ѦjČ3`1u|SE^G)S$_ L?zzq~ `gϖFNJz}ӦS +IW^"͙#M(sB(. E U@@`޼yK'^{mş;vk@@6`$DkbC%pѴi m4`V*V,m>d7|GB?&ǩN=T]x޽{E48X|uɡr."M:UW]uUb^Dܬ*䨀W9d_szs4 atʿ U#@Vո2W@@VuO±nu sL: &)HI-+        P_~v[}3f:jY^xAosXlYr!!,2{СCyڵkϖ?{hy4@@@Bp믿^\s {c_|EvaI!أ:JoO9!bȑI!cr߫l:묳ba_,Ao]B.vm5YoB{wRd]'2K?;j²4']ڟ;-0w$|%ZlYޗYg]~zժU+ŀ@. |)|vLoB }]vB!ci;H-:<?I'Il#5nkH@{ z)=z5x`խ[7gV~av{9RцlszjܬʪRXW~6LK.,suaPӧT 1 C&\;\w A$_oY}N5ow'C8tvq)5~Ǵ9}ɶOs9(|hFqw͇F@ #  s>kW NO %'\ci        Y5kvyP o>Ks^lL;3)"gg.25T݆ZjeoU<'z4i\HͶes^zK/?֠Adɒ"   @.WbPkIqKnm }/^/ lq!/O?)[ز*/Xëb9= /0)y饗gM=tgΜ)|'4o޼jk٣^7T5so0=Tw?wK={~ X|ɂ/<o>Cļ ԤJ>@w__ PTVi"#G>Tr~ڨ TIuZl@ wՁ! +ɹ Sӿk}z8sfuX~Cyק(oZ7Wl{MUoeի$ ڿ\=?_wVAg;__]r5Cd~dc _Y߿e9UߴvX69|`#d{X1nOEרQ# 2$uX[*ap쯥i9gqz&ξJ1i ?Ǿ6m9п.#?SC?ӧjg.6!PZ{wiҏr@ jeSy!  P>@s>H'Rv%*RV@@@@@@@@|/FvK_xX ٳ:,NwǫsΡ_~Usc}S.\8avPl,7Σ]vI1jӺL@@@@> ?uTs{1}]b /$E? LN2p>wI=CrJrJ6i$)vmi…Y3ΐ:;ʾ2tI'|r7~쑯ҏpITvnq#<2AHCb}s{N x [4hP+ iE Tƌn]aPTj\ ~o.;O5J 2% r&o۶"@*,_&a3:5kwm~αl>{7wōت$P2Jgjv衇靘Ĵ^sbKA`W/r-v9H`Ju!M@y@.' @@pQL$U"c' @ @ @ @(_\r㎶s9sxSOYΝ϶֭[RǍg͚5s09I AOs=/ڤIl׷?V'9(RߥZ*UG_9k:ǃ`駟7[h{s„ v駛y~>OYXP?#t}ۗ_~5jM8o߾}}X~s?ý!@ @(9|-el%<v;1K/7VIJ;~mfHJ6?$gcc6l*0`f#aڪּys{ǼLe#0K/])e"qj#vZ"l>;믿}d g@ԅ5۳Lr*lغ}Qm"JlO9NAGvT^rAX\3q  $ہ+r%1K)SVB{#1|p/`&}s=׏PrS{M7b?=?ڠ {1kФ1 ꃟx≾;ܴiӼXƚo>hT5C$:^_vߓ]DjcJ6)"M}#whlk_\es I}޹ƥ767FS^:i WLΤ*EuB^yNْllef!&g7|sƱ}M3+%X=˩ թT?Ӧ|ȑ~i!uLUͧ]O>gGj qJz_{1xjǨM(l-w21I Cr ?\\A-wV7u.@8z\ܬ[O>v{>:KJ^Levmd'@ 93=NB @ Z$pQԪU-!Pƍso(-ƌDpj@ @ @ @  FΙR)u}8܇s,9A&$圢F1fG1g(}G}sШ[ns9)s9JO'9;Ѽy38ѤI>UgZk9ǖs2SZpΩh] VN;mItDSDG}t{DQT'|ㄸ6]KHo ;}>ť F>Э$pn@ @@#s>X+e+q,.!ەsɦeF4OFW^yp s|9'~?4*[HtQ#'^va> t۟3n q~t;aSQ;cd5$F愌"3<&teٳgtG-Zo hڶٞ5=Sra;=][مe˖ҋh-:ٚ^}]BU׸2kܹѺms}n]p绰{6EuY  Ac7lʗL<̤%$QGQtQt Q^EZ{3EEgaQ D5jcw@PPc#@=SVcB䠧k׮~UD_ܙcV,r$ǤT4{pZc)O #G~]`na 6vr r"ʕٖF9Slv^ +OUqu$;MBZH @ @_|l%r-[e]-v*og>i$<3ݑWp}We )${}}/ܧ9l۷ﭷފo.ڲDև^wjICp 6{VI}Ks[ ԕUiL75_x uG8AUӢ;?S~dÕ(Dr]cퟭ̒CxO'Nn>YCPKyD_NzCc9&lO>d~:(a gALX2INFC&c@Ve"::( eN_,.)@B'>jTɓ'd޽~ɟ[}mT{W$,ƒ>bx$loԒvJQF$_J:OcK!oRx㍽( o!Ю(V^;8 x|Zk|x^}@pq>!dG~'UIӓ|$[N;- ㍴McBȔ|f>c%=vWM'%B!PgOW)[TIǧ;57e*II/q|euQYuᇇME[ۮ'Q1c%ƪJg}RBbЭ[HXcB)~Cl; 4nڶ:rc{Te.%q` (j>[lxG5,ǏIQG߁&9 (n&V|wi׈!@ 2=5n\O' @ @ @ @gN`ʧ￯T}xJkmY9'(~{5OGyuŜ3Ms +`9);w9?2P9j(ߐ!CR1}1!ߦs::IY4?O~/\ys<9 96`sNꫯC^J?/hksLMt2l̙&!p\y5Wyr]Jxn  @ А ͋ _[I[NhmJLz!o vh/:G_~)=}tscvw9'7k.Z隕{pN]9DI|Vek=e'(gMJ ;phao*~;΁91sě9i[AڤYNTt=saumSsoݜ#^[h9گ 1c\!4\g=EkfHk]~o{ƍ3w lEG!4dѴo;G%!]1 :tM^z%&Ɨ8as ~u]/hȫo;v9 sBĘf?'巇*:ƫhLK1CȳNcQ[{=i?~V5Ei5F#;n/F^Gkm-&M+b~W>~pBgxt?hL򑯭'߸Cs|;AT2 gA ҞmlV/UVOkjZ]]V_7]w_S'SSlOxV5Sd7e/l+<4~xmz/bS罈hvUIs馛ՆsZ~W_5wu9LӽN;4rOuAN׹sJ9s dz5OuVF@y ~([n93g 8imMW|Ou 7X6mL`ݺu|pCW+OZDuAJpFTT @ M@t!_[I6EW)B[!3_y.asϵZ|N+%\zWk_$'5ӕT[ذ3^Tilw4!B9/Vs+bj*ۺvtm$h0k,ԩS*-[nW#8%;,^viMr7,!?y/t$Z&0ݽkvfN\lU̶{.syw3D#^~BL40@]j9D@%CS`TO1d7K@V"j'9{wͷox^I0qDkǫp zq$r ۋWV/T84v?|KE8rCaB煲MOI$b3xJτ cǎ֣GJ'qAN5 @@6" $9-~-9-gZO/w 74O/_m,g+3#Ӷ4:.fzm0 ^N0Rut {^ ?͛7qkBԉ;t{l]IP+fZƑwm[o;ڪ{iQ'żգY wxߣ%zގ/a*H2޽ &9 @ihAvH= @H4狄@ @ @ @ @eJn;Lj%o.D},?c [xOx0KN#B_+6-1>/5tPkٲ(r߾}駟N9{P< XeɑЉ'hnNLW2Pr椠v'Prj9g_NT ͓] ʋSo6lذJ @ 4Ho}'^j4h 1cTJ[o7hJ ]G^zT4rV-m۶v3F 0}m [FSNyWXa'wfHP>vWK9%mk>6l裏v"'C q.nD6to;Fj w~W/ALk/6Vׇzrb 'C>s0_|i=X/Ow/btMM0R^;cq^J=%b5ydםwy/9NjΣ䠦&AbTᄏBN!8RѣG";|AW_}3gLˑ>W(\KEcᮻZ[p I39ֵʕ*>9p|G>c: |uuZ@ @ ^ziQcs -2md#BïUW]ۥ3k.߲Ȟ~IrH0v饗;/aFPiժUmD8WtJ)>͚5d2eJa%ez:A*Uٰg̘qqӧu0 ,gz{;g-Z?|ා9;338#UfdlFvZ:k߳>ogy/|89Lo޼^4L% qAuP:_}.ܐ9XVC̞~ڜ#6ӬY3 74Nl„ekgN;+su1ǘmIcR @@@Q ^x^lGBSI |6$d[N% JObZF"ѻkJ[f{xW_mGukm\rI8exnvߟ5:,#lI4HώO==qIO{ ±Iyu5\㗓NҔ,*o6o-_~IV]j_TU'*|ʖ|Te{4fQ{Szٮ7S( \e*qhNq覛n5T3ԮʕF)Z`]wu~uR/7g$9餓lWλv?_֭[СCUÇ{aR巜CJl ־T7l3;8zo[ӧto `'oZLU/o[$w~#@@ %X㓞R@D # @ \vYiS' j#+V1 @ @ @ @ !>揖]vo[ YS]Fȉ^E|ITDN+rRs891,V}lo׮]3 SΑp4mڴދeFEÆ  ќ9s<ŏm"`VKG @oG;vYt9D|8q8oСC7Zo"ϟ0-,tt^'fOfso#\9ը9Fɓ##ψ-o;BR;#'H]tE1Ihת4p@&83զոc믿~llу>\}sv$q}ᇑ:4~C_8%ΙkƱ4iğO[vԑ7|ӟC=:w9hUV9r41wi\.F^8s}^K3=>ުYu/&1RN8:ՏMJ MG9o.D7nܸ{k9q9igeȧNU[ܜrG6rVeoVGJg7IuUVe7%{Tmʫ8U*dqf])SԮʖ'+r і[nmNtv}m6Ɠ駟^^O;& cۓ[l'%Y.5vNN6jܸq"I P~[)s3 {~ճC ߅8>}zD_>:*IL/i@:ُSu@瓮GjXJ; @\vSg-cvf3gc"85 @ @ @ @Bg5'e)tM_&$e'9ɓ'[.]9-͝;לuls`;43c>s'u.8? ,… MssN&s4ľ,sjNp,G|909/Ҝ#'sћqN9JW<ѲeJP֜i=裏sZ#n@ @ l9Ysl]&lg5k?ޜ9v9pǶTH[sBm7琴({ǎ=Xk۶.|s>K&_t;k2,|o|XZ`9}8q6ggU֭[4}}bT6;žMZ`ێVEGeXd_~]w}z쬳2'fN,1rh1 GfƙK33 ]'5Z1$&.$R@<v'L4IJ5g]A3bep1Η) m?o>](uD TsmNõA\r~C1u(bUӸEB<dG1gRS9v[ ԩSsD=R6b=~j{Y}L'bN>lo> b_N77[{m+(6ƧD\`Ç7'm=KbeȷNUW/UI/g;c==Sҷ.N8ݏԸT'YqN"U(;vҘRWW 4N7SՎ1M)ڦ6ʕn8vk^_ u_wMylǎk|؉DH]54)sN8{O?K.Ŀ#1b F@u3WmZI/ PWp / \Wg- Uב\@ `^jszD4H @ @ @ @ PĪ{ol.˕v`e vm؞wl=)rT=USȥn䩧jl]wuuԹ~@ @@mOlu׵}׮>]_6&9Ȗ EΛy/b_t~;mUCO:$Xrq\KHgT.HW> 9q>{۵k߅:&Of_!%0kܸ!|\uU'wٖR?Vˠgu.55\Ն]ک_uU^7%$T5tԨQ6l0;3l I]'CH۷7{e7ɞ*Y li\af  ߿Kr9RIHgΧ>,ק~:UW[o$O4w_W;sJ@ UEZC9 @ }{Ϟ@ @ @ @ @Nk׮ꫯzr$'=]tQ?BO͛7AJC?ӝZl U_>v 'جYGrnJ @ @ ufr֡C/T'hc0963×^ziNu_jAozIx-vCzM@ 7`'|đꫯZgkӦMb2PWuB}m/:(~2Ἄ3F,Z('bAM*WF&;Θ1cr2ΝEj%(Av͏.ֵ39s*bs<$l7y%رcG;l=m:IH5N/qXwͧ\I-g׋;NߥpE?'5/{]~3?xtB( KE.FRI% @(M_l饙~R qvf M @ @ @ @*:u{Gɧz*ZVYʣ>jgy{v駟n-[,ܑ@ @@C./)_K$Gr)1-%RV[H6չM6'L>|5iҤn Z%r瞳n;_uU}9yGX֭kDn&T~h4}u+$%-͝]B @ \$ηWFx$ #FX^J*/'x?~KϷLN)z$f~W~L,IСCOmՋ=#v} /`ݺu=ӋcH$C9o7ܜWU즛n[la{キ:n:t'|v{18c}yV:HVJAZ.;%3=j3j۶z⫗D%N6D8}8E/=owqkgN}۽Rρ/@5NO] Xy;om'<=ڦM`cU;B zl@IӓZo5g4g3<>RPDPt) @D\xaJgHI&AT# @ @ @ @ jx3oމN;d,Lag$??KOm}#G:L@ @@'p[[n {|{o#i9xֽk ,;[fmyE^@Y|ϟ(86l-҉Jo$fB?,{fscn֣G`VJJ‘l@$=w1u2y\yK"H+5C-,C E rj_$V A$8'|q裏/d_{ Ծ-uAmSd[{o6l3Ç[.]2uB#. $@\#N˿5jԨ'ٗ DSz)_~\jGͶ &Mg1]we;eTfL}s{g.W;ecƌꅹ:avsxP=]*~lխf;X*&@]@PpjΎ#!@@^.쪫̦Nkwv@I(%B @ @ @ $w‹.FersAفhݻw/I@p vwx |wq֮] \C @J#}pY Z"0eTNLw뭷w9њ6mZKgnIJos?W!+39]@ow0Tǖ! a'jH0~"7[lhe˖CX NeC"}/=~yeM7ԋ1:w؆ڷ$= ֽ6zh{O>]z%U"-!}!?kO{!m۶N뮻ږ[nY^]tƍ.?ONdu5e$:B ̙3_^x!^M66tP'"oRdǦ$бᇛtRYfLA5$V*GB wٵךr`Pv A @ @ @ $Yo믿&L`΋ynp |A~9:` C9t7  @ $I&{a~_; !Z ,s9sʁ-bj-Dh"{饗졇N;eomժw)grۣGB >s3?s'pVNS5*ɉ&KC 2&xb{p$4  ZKXKƉTe|+5E`oW^qK/m뭷IFƍw*m9 jg&'|d#:C "qSc$SmMxD d̓hoBvP/, SӧmƾM{ĥZ*{f(K*#$rW_5_ޓ`)ҷo߲?@.Çߘ kO" jΎ#!@@^OsOzڝ PRJLI% @ @ @ @ >(ѣG۷}h;{xdlرޡ}gܹ瞶8T@ @B@N;4 _~6pâM$~;ZGuhjӽ^6c [mlM6$?`[~k)D M@"w|w(Gr+͛PYr+B$|ƍ]Dy>9ƕ0 a^wr $… wޱ1cxg'SlڴH4G%2$+( Lq\#]ט[oeheXarrڷ AP+~-g}46_~ݻ{h˲.?e@ h |]DSd󓀒ڬ$2x`[q8u{s1fIJ'*U^}콺BEe&e$֩S'NH) Pg.PEȶ1o<[}}E_U'n@0*PGJ' PjUV}Ԫ̃5@ PtgmvmAE!PiA$ @ @ @ @ >:z/5\ӆnC!Cx) U_O?m?w,g]; @ %{G흚>vꩧZn7Q%~_Fm.]z־}Ui%_B/8U^ !:U%g{Qoi]ZRr;yLQs9S˙C8 `߸}YOTݨ,VZ˖#ˏ#@<o>ӫ %qsz_O~Z{SS6m# ٳ];C?~dw{y߾}8_;ѣyԾmhZX"-f^"-3gδƍ{۝'%_>= !"XhɎ. OԼys/$M76pCk֬Y08sJ7MX}k^QgJ+2[_$6NM'@dj 4:tHvHכ{l;?:Vufy'-ZhXPmQ H@k̘1~S@G95l01bNJ @ @AO?&Nh{챇J#H?os=ގe\O@61 kѣ+r+r(֚qUWD$yj.gXWve9%չsVϒ ͚41W..:K:uP9 1ɓ}EC?trF߳gOZNUSSǎm饗.Ԙ_~i&L4IHKVZl 7I[2,Ss7ʩ}2ӦMd9st#_Zd˓z0IA 3-%DeӲ8㪫OͥP b6}SOpp(#oQާz5}Ї\!޿$%/RT?Fs=3fyn۶m=DJnݨ c&tͽ&S;ANA¯ ZH@ SO5~sڝ PRiAI' @ @ @ @ ΃>RիmᆶI Aygv_s_~駟z=use-@ @@&oѣ򶨡Caf;찃- NKT;kz-oo9}`:dȐ,G9 ~ҤIi} 9sO^6mVX9x\vXm'@ ̞= *~THQsMӝW=/͛7^ve_kWn ,W8G9Ι9ųJ'aP &  hR,L_1ātb]v]kY:t@;/?OM2ŋ}'~.8/껄KX څ}=Ϝ# '>-}l?,C0CPAq$ @ȋ'Wtf5r#PN ڐ@ @ @ @ %w/l~mGr!'뭷 0;ǎ89.{!S͛gǏNDtoh֯j+ 46hԄL@ @c=fW]u=֪U+;蠃l}:%-bwqI|w#<6pÆ_{r&9| G5ka^q]җA$|Z%*Yfy/w('aݎ;6F̤ӨtN+YZncx49 $CDB;.8<8 D:uꔚԞ[c5Ԯ];Ɠ$ꪒ Qy$">N6LZ_|O B{=@s͒͌P7ʩ}V?mvI.^GܦM ;ՃΞ#A@PW|j JH.Zj)T=$+'## ,[meNkXӲ{Te2gCfڴi2\cC?F]k2iPYmPf │>s4|Cz~»0Ҡn2[gN)!D@P˃V8 Eओ̞zʜCvg'r`PRI, @ @ @ @bWIo~.g.1-}(GzJM]WrD(]rأu5ɱ|O&Mo߾^`m~ZkK/]& @ 9ko{a$P.=zw}_zlxlٲh8qbI|,Z3iڴwP''ur&9򪫮 ّ#0gLQuoINvLb_Ab(0ɩWlտf?~ٻ.{fϷ-5ųT}hQpCաžʃ3L5 >T&]k۶wJ)zmZִꫛD(E7%,n$&$铞 @9o*tHvd.ۮ)M4 oI=G՞Snܹx`$d&$lmgv9ISRQevmYf;ޏ J%-NiC}[>X`A*: =.²yϓBСDMnNɉ !V Aq$ @ȋ'رyN()4X@ @ @ @  믿lƍb[G .J[05CC p-'q}.rIKt+JYNkֿ$g}{}@ @YXx7"GAx5'\Ch@G }0WV4i, I@"ݣ3gLM'IxD}|֬Ye*`^c$ֹk'rj"U{"X4R_g( N2$nIHA<RPgGf AY|S$ +vepHN0;'4ɓ\ÄyhGe}}SOǨ_\Ƽ6~KDŽ:@e~^bJ@%Oqň5#pfoe5!#VAq$ @ȋ_btfN%G| @ @ @ @ ̏>&NE\"͛cØ B5# Tr"ipZ4lWN͛{'@ѣGjٳ'Njv)8 @  Ⱦ1vX{ꩧcʅ zA_^{q,`'>oFNlCaÆY^ a ^9v-0i.gyr-[N18s9{\uUS/f/;qu^PQsŰX9U$g| & ha/=۔x"|hժpDu3[z✛X PS)A /~BtsQ%V{)khH*5פ0+6<8O/ײ{,> /H >xKCJ@9oJ(v5O_\Ee$+]܅2;_T~eYT'NLpПYiQ~K>>L2oj;HMu@Q+4;dseE饝CK5U]̍?s[j%? $ԡ504(5A @ @ @ @(aX O2Or,a:>ǜN5?"ֲ>\veKNIe} b!lH68<c-k66m2&9<ҥA6 @ $?`/zMBBrاO04$ۇ#5yd$z-k.穲H L`mm8; Հ?{aܹc+yp+ ʉcc\3M͚5_.nVu-TɉbI0g*oAe.'a98U u= %aڤI`ܸegwuf:ijܫM<$@I3q9 W%U4$7/#O"!X_}mmx &vME}XMG6g?R>c.[MQ?I/RH3%PN[)TiY4הI8Iϟi%$L^&M:q%Ac=bܹޮy|YVr>AiAP-uƧ_Eten!ܛ=[m6K&cz~C?&c2sAC9ėU P}jUY8~F3 @ E^7E@ @ @ @ @(YK9O&lD>$w ;卵C Era9{~&/ǮYbsMJŋsNrXeӼy*?9 ɦ(gr< >zen׮oϵ @ 291bf>C;v?ދU=&vwd3СCj$.el[˲Yɶ#aL.Zyjc</B f'pڵO#?+r׭[7?:;tz5=>qĔW0śyds?=laR²lfҟjg^\k9u9(O*[YC*+Myǝ.fc<2w9er(;'nE$殹D ?Vgm]0 @(jk,|zh[|LZ3VzgQ%>i[q(.٦xF}M?Q?Ɇz/LeO: Olesŧ`Slx 6K}އ Gcd}%h.g:8LP1 @ 4Drַo_?/Ahڴi)ӧۘ1cl̙ye4Ȧ%g!CĻ:wl=z6!PU`cG̓3Ǹ@TXpV6]-m'91=:wnyɤ)t8,>lAtLvⰬw(p~m83fiҲ9ٺrH|b;@ "۷o_Prĵ4WF},=[º(_W&8gϳ lNtkl7-̽k10qPȨ>km~Q|,A $!a4Ɏ?{STʎW_NOuvn:+H ]'[w\V`5STˡmO6>w ZŤYqY}TUK<[җlyOS2LÄL跄~*[n*_TkЏќq^!>1rb|fl> _e" @4_5 @ @ @ @ P2jvThQ>;,r伨S65֘kqsU>ǵr'?^= @ @U_O HgNCStN:L_l9*jarF*yóᙕM7nߍ/&~󰮹f|mnӧ`FMuu3*+<89nsϒgUӴ~̶lȊnݜg|$# @ jϫ6.Ǩ~6xFo]c|~LKMSU'=K)Lp_w qC(> ҶmۢGGu\`zz=_qᄏyv;_m/csc{^`zXb*R"V)]Ue*{*CLP,4?^Ƨ_N;muz{6JAOﳄr>̳avRyu R$ZZv @ h&&@ʊWV@ @ @ @ @@-Їk!2.]ZN;u)p @ @gr֪U+?sR8= 6]d30wֶSr:& l$3 fi "ZfUdu\!ufWLs @ꂀWwfcǚ=6lS hl/蓼"H;hLW4g!V!@@Z+dN$(laŏ¬kV] T"гل 6@5 V q( @ȇEf.Ϟ@ @ @ @ @ @ @ @5!зat.5kV8 ̟ofI@KU|߫W`ֈ"ZU8ts~@ C .~gr @i:vF@ZZe 2{ry PԪ_ @`Behu5+M!@ @ @ @ @ @ @ $8,;4;KBHC>f]8k83gM`xq0: X!ֿYf-O@ !0}٨Qf_oRsb $ԩf:%5u  V2 =;짟V\.9 7;@@`"&M@ @ @ @ @ @ @ @Xe30_9ĬkWfI4K>"[I0kN=bY$ 4_lֶ^{5̒E@@ j U@3Z@ʔ@8lu4d @@Pas*@& ͖0/> @ @ @ @ @ @ @G]s_bCN,^l&qA4+h͞]!չs`aU$ @N@m3;leMzjI @$ŏ!PNf0رrD^ @F@=e#BP+!CNj!@@ HPk}@ @ @ @ @ @ @ @@qu.l̞|lذ#ⰼ ̟oYA@ʹ]za:똭Rѳ# @E+76;D%@ꄀ= jNRlJ<$ t.ZyN P%ß @$@ @ @ @ @ @ @ @;[nifg&a'.ٳƍ] ̛gvfGmִi}sCiԩ~Y!P*$ꥒZ @@M ل 5!@@> @LAZL @ @ @ @ @ @ @"=ͮβ$畅$5}z!mژgYubRUFɟ @(i7`fS  LZq(Z#@@"s昵k2K!@z0{ `@@1 U @ Vp  @ @ @ O=@IDAT @ @ @ TޫtT+j4 JXb`IF 11kbI5GQT EX׳;;. Nrܹ sgϜ<  Pw7F5*Ǔss Y&ڴ)He,a֨Qɳ,@@dػWĽ\V@P~}VYCBի  -` ƏW(_j/GG@{               @Ev3K&TD b;wJsM5gd.]Yg{ @r콊@@"/);[="9@ e$KdOAV #VF< @ t޺bh= @tH]oΆ I(gTr6&#              1 P4ntEҕWJYY1P(Vafi`5+/X IwzF,q%(@ @@ o#H\hT@ Kr-8*L8իJ^ƍi4@J1x~%V HlF(@B2B  pwKl               p\ K}tGggMe/ۤԳtү,k'n{  $[Ҝ9ҳR  Z?I'KմO  p(K J|#tҡ"P  P{H+I8<               @K{K/( V1`^^fN}$j&HuGYoD@@ ƍ !k  ,` ZNfڎVZ~ %СC;nb  V9# $$J"              @ yt7Kg)U,J99ҼyEg͙#!K;IN?]6ծ]́؄  -g!x"  !uy͡Rvx 1*` .Q-@ HG/UE@Z6               P4q'[ҬYɳl믥{5%K veA]ʕ;@@@ IzIE @X4sWwj@4,Vn<#B@XQX u@[ZQ{@K8x"              $@]wI.]rYqM3g\@FYCuSjNJMrf@@U`BWj@@pRj.e+SNR7@(l)'GZ<1@ Vrδ@*PZϩ@@@@@@@@@@@@@@@0k&Lƌ^z)rXϗ/.8i_u y%#XnѢ*!@@@ƌDVKCqPI $%j҄Җ IP+##  P˾ ]v] $ԊW! @BP+!^F               ".=4dҠAk_>~YfI۷Kh?: n5[u#w~  XZz;4p`{>كs4@P`2S@dU={̒@HLv!I|CB|iDKZђ<   :7W\9)O@@@@@@@@@@@@@@@8S_x5-IEg}dIUu f]xa0?j?@@@x LBU3# CKP+^xJFF0_@H=U+ii3-ECZ1@@lj              ĊK]Jt5jƢf̐/zYKG;JZ(  DS`rv2yj΅ @ XB3όQ1bBjYc:T@,СhQO@ V4@bKZzP@@@@@@@@@@@@@@@ o/]_KÆIdgɳ,i̙W k"Hu<+KpGd  $cRJJ/^n:F[@8hKyO$?90.ͥ  &`CϙU@ q3  p`$:0/F@@@@@@@@@@@@@@)0b4at RÆA@mJ0k g5jq.@@(]?A:ezEKYQU Čm./dT $ɗJ! 5KQ;'BRZ (@j+A=@@@@@@@@@@@@@@@ f͒>(>Xڰ!H5ctwɳzjNv1ڏ  @ H9}5@@H.`7{ j%E@xKբ^lEɒX!/)+  [hIڍHA8  @wIU[@@@@@@@@@5ɓ'kԩSLU-??_֩S2     @E xݦZPz+] 3 _ kcIN=V%b@jrגZw~x 뀎Q;[˗4\?_,dp~'뻀v#%j'@{x&  _={]@@@@@@@@@AKND~Fݻ\MҼ믿&V̽:T@@@@"-uꫯ'.LEWO:$駥ucӥ[SN?iY7n]Z+WZ>4?  @E ' $/ɇ "j*e'+ :L͟}/[XJG/W_/?_PkԨQV5gKժqVu@D("@Z "PJzvN $A4@@@@@@@@@8կ~?P-UXZX      ^|z}A> eUDYԷԤIA"o^xEL@@*J`Lj\nݺ*TDHfԻ6-s/_Ç//xNѴ vad];)%`o>׏#@?q$@ Hl8E@ r娞!         'G}T~vܩnݺkU}Ywܸq^-[{-[~~ijӦ/Pka 6f͚Zjiȑ:ݻ |I=#y#}z衟ًʺ{nۀ4zhM4NJ x =z饗J+8q{gqN:餂6ꫲiݺuUNY@@@@@-uWɳ,z1x-hR}IIG!yݤQ-UHtYWK^>g}?`  @ 0o87"hȲeacL8S}@֬zDZ=,XVZc(?|oV Ŵ~իW몫*x-8xYx1b."41cǎ<3O[5ydM2?njtwm۶^yӟI 6FӒj`\'UfMedd,ciH vb!,uSHD~D|_&Kjyi6yY8. 4Z TKBA@@@@@@@@@( l[oK<^P.]4uT&gy:v/_|ŲdTe9s"\r%/] a^E{=SSOXrO?qgIy/6m  ‚>,^Oe8wߩW^stWjذa~98… uwy9s };@@@@@nNy]^iPy}RӦiIT~QᅲxW߂DV={F?u [`5oD3E! $%wH7\؞szSG1'o @$MzlY ?I4 ӻW(b@ @R P+^n p *U9         -'h޼yz$V g~/K{nYrZj, &>5iҤ 3ڋj5j>hw}S"l7,.}~+g܎sQGybh6K5|?aVFo^TY Ԑ;v.{x֬Y~E[ KfIl@@@@@vHw-yqiպ԰tɒg{OrRü.X#yݤ];5:=4g-z[n.` @@ |P^KQkƟ)XBXj5ƍdɰFиqt1hĉxMw٭[7_Yx h\ҥ?/?ѮSNȒhyxIKe 1XrLiō۴Yzu >ܯmwk1*LNNj7<ݡCr&tZ@rZ3H \G(@@ ^^g          .0g/qԳj֬ȋtc8pjԨrd[XJ 6wU[l%^~e?%úꪫԶm[Yy͛7guX_~˒db <$YV,g:u]TJe[۷bz_Ou5Uۤ㏗;سGy;KzUZP?7"gB@AߴƗx Ɵ0$*oDNĸ%jڴre lܣc -'|+nZظLSiŖ\ҟe dIc4k׮aÆiW)Ss:޻vkZ+ iKvw+9_/8҂4ΝRId$ϗrmJD2 TNB2 &P)lU@@ ZAU         @{Zp{WG|eeeP=\+,iѢEwŖP\4iZj!C{wY],%zڋ4f=cr 74iE=u-… eA!c     @}'͝+͞-͚LKw[Y t+! ̻w7Y!c~顇,9zY\ -?j  @ /ժ%]|qa^/Txr  \˖IMj4: I+? m\dh81tiϷX_cѸqԯ_?M6M9ݽФbu~ꩧ\?LOF}74x,'CաCrV&EbiXM%gʍ%Hh? 0>_g\x3!@r m+-^m PPy>  P%CS@@@@@@@@@@ ZՋ)S9^tj^=z-H=Te-m;j֬'j̙ObX`[I '|222C QFtM `;^s5Zv?|͙3oɓiӦ~~.WO>Dr[e    I&s&|t*:u~dZ^7ZJja{H#FH]&}ԗ_.uT\g"  +0ag(|AGjuXYUM4^58]"]veǍ<1W^y,~3zj֬o_nݺkժ_~Y'xꫯsl6     @b XKOF?kzeG?J`"}j2M"ڔDoehVZZ}Me|!`3   ~*Uđ8         @kiٲeׯFYK~{;l߄   4m^@ܫO?ZhQpl@@@@@ ~^ J/y]bT/)YWe)M(-X oS9Sz9[[[/_YZ]K2֧@.ϷF@K;ƜXyۉ'? $%ӲHCZdjhIl s >\ӧOה)SD|Ν;[ns9l;>M? 4 x yHKFHx|$|+i   PA?.iӦ E@0|"        @ݺǩU;QY0Km6?(Ch*wȍ7Iׯ6y}v?V۶mUV2?hnذ[NtթS`[I 999ZV^ʕ+9{6I,yW p s@@@@BTv~Ȣ% ײԱԩS0eN_ + P(G\ Kwogm҄ [l?}%㤮]G:#'D>PrQ(Gjժ^wi޼y:ü[^ƭ˗+##p:r֭~] >nqVLMM K:q q+ U?){n6#P YTx$@ [{G:dh1mDp ƍIc * !  POK;cl@@@@@@@@@8x4o _W>RJ MhUn>TfMѣʲ1ܕ*URYiٱ-͛Zڵ+!!    @--[V0eZKJ{[WjV^t,y餔@VA"{.Hj֌g=@@W%KVKşgZff OR @X?eAMj…oРD[(eP@֮]{g7X+W쯕vHK:?O`|'MSc.G}Tw {"wˑ5,@@Hub uf{P@@@@@@@@@@ [,ĉ|9%;@@@@8ϗ֮ fY,7Y,K- `Z0g , !zju*UaäkIFC.T  P.I&u\-%`I>% h֧cIYB7|kd)/rݺuu '%W_?n>[G_JQY~d Px  P&j@@@@@@@@@@v;:w"~D9w߭;#QC;@@@@PfY˗KvULOZ ϶i# \@gծ]M4OkiH6M㒫tR͚5r^;%#|O7G.j:h%ZbRݺuٳKكQ`?_UڄhVzh #@By-i  Ġ@~>ceJ              ۷KVI+W;$Z6bU.vX0Yc22 fY¬YJ,-[) ц ]#@@DDo)Z! 9K5thǑHDyU2ڄ "ЦddSRH<H.j%Mk@@ yy$Ԋ29C@@@@@@@@@@@@@@@;wJkHkJWN-M[bU*YBV$/ov mݒhټ~YJNN:Iwy[gZӂV#  /u,vZ<֞:# }]֭nΈ@l&X!u/5  -m;u:+A_Z@ajC@@@@@@@@@@@@@@JL_LInYls7mRشTQ#Y3TefJɳ,6,|K&p]wiҤsZ3#uK۝@@@ F,/JOMpt=@@xQJ˓4@CXLjHh9s]4@AO[Z  @HUv+D@@@@@@@@@@@@@@@@ .6o.Ld&*nyV)?hUcY,[nNӧpKes,%բ ?>F3f4bڇ  @ !5H5j_1 )`IU3sΉRG@>`AEs"+@B}9                @ $XˡBlJ Ke-gjQ@d~/Yߺuҝw@@_8CS\O=%tXB@}^|Qڹ3HeAj lA@`塞,D@@ڴz+x,?_ߑ/l\lj'".@Bd~@(w         #HIiӤ',|Q(@2@IDAT%?# @ P+@U 5Z @@@@@@@@@ Qt)%=v@@@@xa\)egNjU0Y] [YԼԬY0YMɶY-D9 XB}^{MRi˖+q 6LA@@(.;KUWI~$v3G@@裥7ސ=Xr wa=y췩5)|]iDOn]\T;u~'  @ +ޅ  @Dl@s^^DA@@@@@@@@@@6mg7CztR%<    1-`;-!֒%ҥ|& T{wЄ gVR˖RҩJ-Z%Ѳvn2C8;ZZPܹx @@UlȞ=ɒ4n,MD"؊ ԯ;_O-M7N` ~ma@b0>?1^GZ+_J>X|B-:昊gGb]Z Q?@kT)77@@@@@@@@@@ #ٳg&PI@@@@ irrŋEo fZ˖Iv4UHԶ4x!vdI,qՓmDfͤO>~37aUg$V:lE@@ rk ;%j@裠/}؆ R>'Ӳkג_~)o/ժeC: 8z$Ku&ղ}V\83 $ԊW:" @ <9nE@@@@@@@@@AΓnaߊY A@@@@ XsKeIll)??xݼԦԺusk@@@,iwx'UV0#(  P@:RҥYr뮓7.HӧKފ)|]iDWAߒCjը!uݺp6@ HoE@@掸8E@@@@@@@@@ .0~ncwk@@@@")`a*Bg-Y sgsyNA⬚5#YĎQAC%K0֬ة'5A@@ Q,VhdZxdCa@J8PZˮ7T3x XXڰA/NGZR(?ѣGBj#992 $JW6  @ P+f_*         قkJ;J@@@@( l,͞-Y27Y-Kh^ԡC0 %Ѳmv%H6OOl~}a`ۥeˤd  DO`sJժI&IGQ%@ؿ`J^뮓5d6-,++ZM[M^(}Il̀q&$ 5  cvGnO{i         @ ԩ#r曒E92I@@@@rΖf̐f,L|ypR ӣG$曥=Yii\)ę@.gYϝ[T>[Ig/&E@ݻ[ڸU/T@Z{n)F*F5!KeɴTJQ",r8HZ1c[V߾IKA@2 PT %Բgd)          P^(?Rn4|x#   .mgNkH))R۶A+Hyxo1G'Ф4utkIyyA¡CW΄  @2 ]5,{I{'mE@ rݺIK(^wԨQ͑HK5hPv P@aJޏG@JߎJ},-@tjã  ! Px2         @ yCsrrk./޽`r{M^,ܲE={RH{vh)^`JMMmJ*۶to_e/۲[RV#_    (` +LeI:HҢdz>yTV"$@mnۮcQڍMu ]߷͋v}Vm]{[?wh[>oݺ[KA@@ ۷o֭[ɖiW!6þú[V}?egoIo-}t4[ù@~8LܺZߓ*i'ojjkg;6Cr}Q6wvv-][=NA ;WկU%Qs~ΝwMps{] g\jx.|_w e]7Bpw/HM>#oM-9s&{ѤIow߽>[.n[yl^>sފ|qn(= eb?@@ l`^          q+`7nٲE?`F۶m' hmc<|ق6NvcYiժy:vݼ& PzF5k֔MnruQdK)    @M.M"M,M&F^_tQҩJm@jQ@D@fm}ms_ۭ۲[wqs Jl}6wDT}v9Z{XP5맶oeC7n}q)  -`AWXe˖iڵL֭͛ hwȖ^l\/FiӦL-6mڨnݺ==GC@`?֗dB:%t}XTW:YYy䯧x[٭oxPl~"[R\ͭv,sy HZQr^m>uZ`s75|w]pn|>X—ȗiy:ȏ/nlz+x|7/:aM'`}K3.|nypCoݶY.`|n?^79\TQn]-7 }}Ϸi=;tQyy9  #@By)i ĢK0MA@@@@@@@@@ 6x7_m'i&dܲ]_ٍLv!kZ`"l7@ٍS%MF,w!SSSnr6/iRuRʂEns6/nj1.tl>w7 {&=qقCY` w3m[\1>ԯ_`W^6lПܲݨFA@@@n}Ia- aIJ=$'u,_/@ ,[wM`nle׷m͛7]am7>nmiӪW^zm6Y=RRRJ,fI;Nm}>on}.) "gnέ{~ lsG^B6Wvݲ4hPdr  f͛7Oג%K &KwЄV*++{=Ͼ;--8 WyR>Vf1^2^6͝;W?nb?-ڷo]K.n? '`'G:٘L6^lW)4!-vrwe nn۬ʮᓻб1-jz]^ڶбɍtskMֿdSKʾg]m+bKIn,Hƍ &[7 Zʑ8H1ص۵amg}>o]lٶ6_Ͻk|7rNղe0>]B nkBܵ]]#ofgskm +7o!tnv]aϣ X_f7mܾc7ǒgs>3 7tX}4>7ݲ5kR Pe}>oKBB?oMyn^[ƅvl,]o{Jgn*n^ $u  PJ~!V@@@@@@@@H`7^`rl[ݨZ,nu ȭ nnZb|Ul6a~K`f3܍-X_9^&MLM6-X@n}5    @bXlɓh͘a.%kG#]~y0L H<~ 6iZ3˶)41SFFn}XɂtEےl`k6rnys--q{nxjA]Kd}Fd@88 ;sLM>OJe,9bIlI֭ulTwH~uKkIǗ[ =tҥz-?[cvqԣG/Iy?E@+WԪU k֬Qއa}Ua%鰩cǎ:e O2nweύbu:\U'$dGO'6_}n6B%Z?Rf͊Le˖dc.c5 m/0m_jPc7 w [m_h+3Ǯ 6}X_[v7FaE$ .7nl#kD費NDf-vɽfй]Z&KCA ޤU/2> <4qR+/+e-[&LP0~1<^}qIPB#/j:{.4j̶]OKesKFAޒp  @q~~          pvSfX|\3??vl,y~"[`Edms妫8Xhm@IђkkosKee]^l[srr Nak7 Swg)n.h    $uy14u1R׮VKc ?) @ XiëW.4i.ؤ'-(]$ ^m]x[S\? nis'hm~߸m Ã\ڶüf  @y>S}嗲ݒJ#Gz}]R)K,\ ܩS' Yx4Y'{Ⱦ}ɵ,yl#\u@ ,(%V@66MnY6.gqֿ`2۶m$vɾmn}[srd6@%Y&(m={sҮow Jr x_um{],Mv]%Xl|kɶB/-v7V8KFfR]mr x|ЮX=vݷD6k 7u¾;@^ -skwω{_~q^993s~?Z枦w e[`gFx8]"|D$@$@$@Lh-[fĻRF~p 7ܠSPe@x+_*ϡGUVƆݨQ#i֬`WD$@$`͛u MN0LM&aqL1 $M*vVlmΜ9:-2aWB}(WP<"_iAu-G>`˖->7 oAvC2Jߥpl ammkʌ3;e˦6w㣏|8#sNq^^^{N"?A8'q!gx;\+9r7Adߒq=xawߩ弿)<6]>~Sp{M4ތ[ C51U"_}%RF89pHl*bT ěU0 6/jLc ΀Cpc=Cp; tFLnE<D;-4`Ya8O [E$@$@$@$@$@$[b̙",qf>B1Ac[/F$ PV,Ʋ<LqmPA(b<ۊajSDJ&HB@0d@cO7nc]b]&d`<7 d>@ӧO%KѣGRJFn*_~ɓ'Ig7AFĶmJXN}Q)7'PRjJ#BC`~g Mm!a\ cWVx׷sUד}TcKa a-0l+!RZreacLAE[83ѦTh y\aŽB}"L$.n;l3 .H⣟;~#oXxZ͛:"qݻ7@X2m5?Jة9sb͙ut/i0QkVb֊HHH E1syNiA^RY%                4T믿 6l) $cX|y)ёH n1.nv&fz1@g2EܹS=;-G:`?ZYF:^(>y jώ{ @HvY"% T20Hc Dvaڵ?]8 uf"3rʱ?SyNHTw%O?=F5d1$@$@$@$@$@$@$L S"Z~*bN1OLl7& (ـ6ll!$a%1J1V@ؿDPd]k ЪT?8 ĚĚ8# "˟A7|SO#mzwge˖={Īp χ'Ol(~իW/ݻGeR1 E o)@ >s͚5*uQ` q +6EϔkI Np>Þc@[PjԨ!5k_KLME IzB 2~/J~ H'O㱘fXbt!@_A%?S3J8/"BJܓ(e~1~A/ac _$$ +ev1 o&qfH-~Bdˊ)D𳢠µ_Lo`$@Ag=IHHH $C08!2gH!7$tR $@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@1'm6YbiSرcgjժc"ؐ#Gב@@PQ:ALS/? g^[.$ʁc=HHHHHHJK)SNL7#.Ҭ)֭Cj̜H DYj\vMHŋױlca܎H <v`griz :|K7#FpdתUK_yȽH%p @@1c+b$W1kq8?vX?~vɈ/ V8TE@RH[ j=aSKCϩ_|NN]R%V{XZ m%~ 6bs͐[3/6q*5Ͳe˴?Xr^'+RU^]1fRȳ܇u}7l<]zR^=?8|@ ߃}ZA8ˊfḔ+W#-SpV $$}ۺuߢ! *y# .V_Ez(^bܞHHHA=vSE:tHǎܔ@*$ rVHHHHHHHHHHHHHHHH FlES.٣WlY:踰&^8"~ptEK.Z 4FuܭeIHHHHHH׼*t߰}{ƍ") !50 샀J+VqlV-c7 ONX8~t}ȖbP!xmIH |:tHz! P!o]Bg&Mg͛C=:bC o3 `Yx CBxG]hVRE(F닥$laF *{nE[V6kLń("ck"+bWT)b~;Ǯ]^VZ\bT+Yd4 ˖-[/Hw R]v1"CɓmذAM$k֬*p{o |7oT dJSߜbRō:lB {SbVǁZ$@$@$@$yGkWWs#H*d`TYY                ؾ}̝;W4,Y8:!%Jԯ__r/Bh }fY Cm8;sr9άn      $$`bL,bWI|D:uiDR6U&HǏ ҥK5#GTRRNˮYԨQCrʕ0fEH%?8^"%0lٲM vr&=K$@CAG!O<@n t~'2l0iժ<36qk̚@bH(O?ɬY?V?"W\! 6"E$Z@m3*9 C㬳2ߛH֭e˖R`qW]0{v5-ܿ?Ν;PB?x\i 3e VXg}Bwjڴ={eɆaleƍt*X-|=U0 5x5C!HE$n= ׫lJ`7ž 謧V\)>;I$@$@$@@Dzv97""JI%               'NȲed2ghѢd *]tDb&$@ \CEɁԉ Aڷo/_|̸ Đ}"&;ȕW ъYcXE$r; 6<| ;!Uxk7D[N]b|by+WN߮(YΈȵ"ǒ9 @X`gAdrwao͔ qwjUd+/V1 %JϷEPkӦM鬒ڵkϖ-ZH=Z~Ou.$mۦ"D{%=ի':tkFJ(t8s+!C<{g<̒D>C9s~j>+VREN;̂$  Z7o<ύBV}-ƐBvLٳG Bʕ+U@ "eX.@UV9r $,[E k֬J<"[ժUKELׯ/~¶%*FA&g=IHHH"ED|Pቫ͹ $T20H*, @I&YdH޶m[uʅC. @ݗ_~)sk\skHHHHHHH ^kygy1D8_-{!ٲūf,H `\ էM&gϖ;vHŊ@_3iҤ\ve?do&O$8aYp@H"[ՠAi׮\uU `<< ȭj$ޑΝ;?O$=x0aaF-Te"/TzMeA]vɸqdĉ7Hʕ=5k֤`Om.! Xedƌ: UkuUt1qF1ObZo5"?{*;;O6ao! Č G=}Tclh" ~AQ+U3s+|dĂHH ZN<)7oVE}>|X7n&[h! c"Ȝ?.8k, m6]tI#)R$saC`< $%=ֱc LO`rرcng}V[_ x 7^yr 7wN;-Պj{Ҝ9sYZʂpnݺRN)P@TIH 9rDVZ}ҥKeeEM Ɯ7o. Jj'm](V' "Pv97""JI%               pEx_5k֨_Ϟ=5hܹ]Hƣμ&kN[7|mVRљ7qkF$@$@$@$@$@M(=T{p"_JHt$;vѣwߕ~Mڴi(W\) $57ʇ~nݪzA/`$ߤ><D(# L>};`?$z%_|L:8ℙa2HT:x9R^5w3޵kWcKTcI @!w1cT61! ;0OફDf|Qy➿o_ҭ[7>Tݔ `-Bl VCʕk̙3eݺuҳgOie&& H֭[eĈ2a)[rĉnƍRX1馛TlҤIQ/6mӇbZ }Y9 D$P@J7n/2o<փ>(%JkV/_UgRR쀲9$@$@$@G W.3D$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$E_|ԨQC{9 8͚5kK 5QԱcG2dHTp!AΝ; fQwq:h i2AiȑҦMy'cYt,+o޼r˶m1N7~!S`IHHHHHG`nLID.LL83d_H%K˖-ucV`Qo9K$2s<;21&j?.M65s[c^lٲIndy:u,^Xھ 2X  Hp}WAn֘Gq<&').~ طo>F&T\O$@صk4o\n{o]gNv'p܏a%Bߕ)#WnUWԩSG{ 4ޔs%=_~nZx پ}{zs) R[vIV7+#3;WL1˩[pTRE}dٲeҤI;q- ę@,65۲mwgHʆ gG}Tb$ZZr= c'tW DJx+W,\]sa|{1/?xXKn;ۡoh֬){ úڵkˬYy{V VHHH Aȑo[@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@H8C hM6iO<Ǹ9#+D0u8"̙#g4'Ojٱcʎ;Ns]~7ovO$6_As N8))+#ȑC,R S^xL0!#Yr_      %_b~Ԫ%RdC-&`H)p6H f0/U%d˖- PB1C8N8>;=p?@IDATw?GuO?-_̛7ψpާq%!-Gmۖ(c=HHHA*&qWC:vȦ,ZH`D;%BnX7ӦMkfnC$@Q!tRx(YdJYn2=uV7n 8qMr_A{Aq~X#ApXM9W"aLɓG xqaOmFDG} QvjcShj"vz0h!zK˖-SlWD@қw,Buts_Ϟ=9/bywқMT ˧~e  DHdgoF֭[~13=yr%5Nk!~>v?[>3ͧgFؤһ[abT8Wխ[7Q5ĵ 8D&_H @ y lA D?#]t#FhzJrh+mݦZ}KmjEBnA*Vi|zR=4GzĶ]t\Uzgƍ[ Φ<,vg-9R`"      ػWL7RD)WN5DL%ɛHH ;&;vg}VB8pMaÆ鷆~͈oӧk%KDdZ\* XR%Q\̉HHH ` !+|GP|1+:.~r AT۷oݸ DG}$M65Ng˖M!gd*wydsğFc͚5KwsDgϞ=ҩS'GB?~y<RժUeŊ*A3&F/ ja o^ʚ5k``\ ;\8y!XH; oү_?y3eG=.Ձ+ KJ~zAb9蚃N޽ O5d3̮ˌ(Tz7r9vTYh8gE?t5i:;w +HHHHHH 3`{`ԧij?1> F Xm۶ʕ+%+dzGcHSG3qΞ=ÕW^iF~L^6f#$iF,XdHHH+"wu.\&1Yk[Xڟ]2d knwv$@$k֬Ν;СCGN;-"F"xc_EW<;~M[_~E6o,Bs֌| Yɓ' 0oFOqׯ_Yϙ9r]v:!0&^yiT_z뭷ŋSBP0ՏW"/}Hwܲv#O>7Aw+m-A Jok5oY&RnxFi$Oio*URw}W^z%i߾;v,들bXm   |{1)L$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$0a9˖-#զMLԩ:#ć~NZҀpի@g۶mrw "ĵ^GQg}z3~Ȏ%K^(-\P?ynҥKiР2|pYnɓGz)#P^n=zTF!_%^xr-RxqO0eYdU]ۻw\tED_bL6MVZׯƵO=|g\D67Hr05n8 n/lRn6[LL$p0uD{91"AsΑaÆ? PݻwKK.C7H?8~mC/8Ajj D4#,FDBre1ŌɈyv̟H xeÆ z4cƃ٧dz9ķ)CbŊ"nq~#Gfo5q &  JGn!vX J*rUWI&MܹseҤI?K8qBرL ֭+̚5KNv*5@aOHѢESw@߻ b2 r Ϡ-h3.' }ځc"%{>&X kQLڵKm'NbS=܄}&ڵkզw;vPqmإze̦3-aFkўٳgˁ06]=C﹂~{^lmAZj.ƌRZ4Zx KվL%`pH\]K`k=rH}.Xb5*ܰl2_hB`#gk]CCl.k}$lݼ95ޝ`{Ā>zWtاCa)XOwP٪9h޶c""q'z27uHO41N6B ? ++H <>37=Dp"9Wv9\ƎC]úן`c.W,":3h۶m^RB9sޯ_0FBY` gvD#JϽmBϑO nܜ n仭C'k?5_{E ngܧᓈvz{-d ԟ; lC%A}m2Lp_;˗/fԼys\rq|r8)8;1A(yG9s洛%pcS#pp6lu=z%KFBq̌ӡs1g 6q4]o#i1Xw}i-gm'X9~=,Z0NC\veq͌S@7c-r?Rvٳ1>={ )X;tӴiSJJ$@$@$@$@$@$@&p{reHj9p>qNtȈHYl)٧dz9Koo6^Co-%c L$@ׯc Js0V @kہ)l `PR%o߾jbxVke6N|馛tA6lc>2B-mɍ64턿w!䅶jCaDHVgDTHلz#duٻw*O@*=4cw؇Έ|]5Lc"i٭[7/Oƈ\9>+Hc,{ 0oF2Y]m`'Xzuwj3>}Mn1t%D[GeEQSO9FFtt݈8FL)R\HcOwP٪9hhBsHw][#(?#i{$ X%#ϥNx9FH'x39FM3fn6ª,5܎^=p1{a{cHX57q3cٕ+>A{*ʌd ^NxP}yy7vR~b -{\|^׮] =ˈiܞ;`ː"uif cx;8)0 I$ 6&    h]1 ,y@A(d                6YlP?6QG+2nݪ t!yuB8F 8x!`wN^I LpП:u.ۧO2+Yv B^pC.\C@ bTBPY&86-[V1D2"0p2Lq, &Fm|A͚5?~?B8arS΢Et!``&!h':tg֭[{;jm'lrm"M x1 &ÇqkpmSl @b8m98Klxfil W3vYg9wua#cd sgH u 7B"W= &k|# 믫]w;w XA-н{wm:nlv߻O< 5f0)K,Z7kG Vwp` mo;.#T&JϷ &FLn4%R6h fC x\(۷OK 1Dܾ edv`KlDK8F,Hhuw}_q8%{{G%\_G+"{c#j(=vQ >\ڶm+իWO|B :MFPK ({P~nm1ml?y7687oNrzゲ|c]?X\Cɛ]~)lHM{ʹ瞛朊Y.Ğ_ |`o?k8o޼}17kx cD?=|gc4e~ !y*5ֿ`lΆ{膧ΡO_w#>4Twq3b'wgjS_-\S6sOlj<5[hNof;V&9l& @|`׮Sew"bSJ$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@B >A ɜS-&M$/:EOj$NrHX+}v> #*ju'5"߻ d<7zvyr 7fѴ T\qHA6{֞_,ieϞ] bS [k{ Gl:mZ[Di]_[Pm۶w~EK%bLOŵ>yc/jĭp'AX_U Çv ,~qktYǎ+W^yC#Ի/}o=6Ի[+]g_Vv'6nwjҤ\Rf̘!wu|wZ-ZZ\,O4X%״Rʏu9-rM77,c^5k삍{zFjZw [[&#]vc|@/r_CT;ڵK '<ƌ 2ЪUOTWEI0IŶ7nO<Cfe̙!Kز(ƳѱI&}eSWw?i'F?ܼӳb<>СN/ !CH޽yo.Y p!&ץKն{zkfN)7)!V$)p1H_>f!|˅2<G2׿+eg4M]usŚws'=ךm8LP-[ٝ@J @d xь7m3e07                 Ȍ{9Yt OLkC)[lAzl3/RE խ[{ Ą hѢ&xb]_Lɝ;L2E֮]Nb_ܹӳ,3{u7̑#:ui5mT ,>|XyBZ`N8%G1eXBn-駟6's?ꋄ:s98b{ Hn;C>ly䭷Ҳ4[/]Xo¢tk`{'Y3?      WE?_̸ȣy|bXE$@dɒE=2{[bgs<;#gr2g_^v=?h3Gpo|{uD$@$@$ f|M*[jU{ܸqr!O9K,1,feEMpg@. B̄z;ڧO9z kɒ%uUV&<*Zv6 =_~憉HbAJ*jGد_?6r(7eDryo[|,O>מbQ;v:>zBs2zh=NvW\ Q 1<8X2ݺ 䈔-+RXk6GY3?Vcx0D-.bwcˎ !?~T`A} $߇ K`߃;H'n V lW-`;GbZ̙"[n'xn6~ǖAh_Ş!0's ヒvsI|tZlv9na{ c|"#}!o$_~9׀b̓2ǎ++VqX{긹[v|}y Vgn]&T50}>hLp^`9[='H^k8_xw˛ok-mb B\L$@$@$@$@Q Тys2O~8sFPfI1&0buV eq$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$E8;9stnѣ^k7keҥK1q\~p@.;ӝ1ΒesQJX©QFe\{qDtzt1NqMSzuEtqFse&ȏc8Ǐw:ƹ1N9qE*qPtgYZ#~-[1Վq*&-DO< ^ر1q\8 -/"89g:bLN#lٲ1di&܍=`fLx裏"E8`h`8k֬q;<=Æ s=)J07h1N H,]T Vyuàf6㠭ƨM cm P:v옃cc\T)َPzkw&      #pc @)XqzqNv$@ywrέc&HZBAx6dz.K|Su]F1jvL[q˙2\Ǜ%HM&H5D[MQgc`l`uFA:/^f/6HsOL`Cg##Į6UV鸑2 )_Է[o^y>w"$<?{0{14ʖm_tA#fC!ܯ/znv0bN…u$6mZ`~xŸ:@6?4Wp{~9R}S/YDq48ojW_}_ĪX!2.~KQkvOn# 6`װ[#zW@ܫs9z\^Cg u8c,(ӈF| ^1nw{w@m^_ڈ;M4{;KWn]}}9|f˃]s96Oּk?>sx* %ܖL_u\r<&    H'1JxD\D֮)[6\J@WE}TK=: Jqv/W\qEʴq=&lذج#pP+:$[n2eʈ Djt7NMw߉qfO2Ad8{FJ5f1H#=W +FpJLp z ~&@.6)8Dqb4(T9vNpN`ohp}x'[XV`APBƙSȘkwV;l`bHrdĉb^e$;K$@$@$@$@$@$cǎ%"Z 3#y;L3~30@2-֕Hh۶] )P@ 3_<)R$`{S a痑Z3zOhK"^kW_5#,]oYCכ)xHÆ@mV' $`T' jaG|3016dܹf$R Ar$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@! IuСsI-Gի܏&Ѫ-[ #|vAXעEn +3S[3z<,X =lڴ]BaIHHHHHGhDر"=&FX[L 1bELL$@&@Hcƌn5d[1uI9xG4Ƴq{l٢Asu;K1b!ȴ /?_̙A3- dzq8UW]%O? <8qHz|lZ=z6gZjU@#R9#   0;&2bDp1-dk]̋Hnby Fa܅HHHHHHHHHHHHHHHHHH@ dϞ]nѩYjJn6iܸ1)A _|r=Zn-+V Z9r],+3S[9&p:u'ށ ,Nv܇HHHHHH NSdf>}Dx@D8UŒ @ f{"ZF_ ay#XZʊىwi<;YΟ`G;w\m۶?\jԨl7#  HgLׯ/ڵ9@i2=kf1ctYO1$@%p7j_1u'l /҈2x8vڕp"x60YCO<]VΕ+W$@$@$@$@$@$@ID`#!&3ψkL$@$xhʔ)+ի5Ʊ ?gΜ)n6H r6(?~ xF0\.` /HĈwN/REdĈ=:tѮgTg>ڡCɒ%K6*Ikm ?~iH pAy̽f@ܥo߾2d)VXrM]IbDj 0ud<gq$@$;w+1cC e1">@ybT2! JϷ e@ߖlٲ;jxg G ~)r>pG-[&W͛Wnfu9묳2bqDZBw#,^^m 6We'OA_5jd6lo&&C |I8qL̛I!a[?P 8ղeKD` SR5?~\`Zv8qBʕ+'ՓuRJOIv xl߾]VX>L"7n,M6Uܹs{LPP+|~ $   Ud$MUʕKS'Eq]ƍH aA@eEHHHHHHHHHHHHHHHHNVGiӦ̙3K.͛Gڵ%K,Q NòtRuZ;w|Rtii߾tAVHHHHHHH s}D 9.gkkL$@$ n6{leƍRX1iҤlAh,{2 #G./Ei09rhVZI6m^RfcF @BBQ-:tG8㌄+-[䮻ҀH{%3$m* jyM2 aPy+.\cǰU n_ѢE8ee<͛E^xA䭷Dv@")STgժU:MC!_|(Y #g?Μ9FIǎWp`wX|̗_~+xdɒ)ˁ #H}O\z}ƑWח H"ERHZHASP+|vܓHHH7qW wjsnD I 0+E$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$u'OԠpW_}%rRG8G8p`$  ˖-%K8֭[KժUIHHHHHH |b%&س~I VHbH`c>(> * NDQT%*ɀ"bœf|9{3(3YQD |7 ,&|ytOuu*~hF۷OՖ-[Ҟ]DŽU!PvqWmt 3TNReze:gȳ"@^ Ϻkt]w^uUث8%OnA=z1td -K׷P+(~z+F׬Ys]'SiҤI˙G"O>I /mH$_(쳏wn^СJڕ$TL彗K&0mڴԹ?Cm۶M%qrX}K0^E ̝;7u0`}]5Jku)Ă RÇ8W_}_z륒4o\N@ӸqcUZ5_o@6]G,еM60T JLBN@@`wnUI@?4* l%IƵ喒jO]{ %d@.u0r6@@@@@@@@OF(xz kkNn%,2eJ*@| W'sЇf͚- `j} @@q~BU+֭s|=@>s 4($SԩSUF{U*O ymUW-a P9s2:i2:Y:xgN,Wx% @L4)i{B{N%&ٳ?prf?~n6=W^s1nc&e@.]SBOg曩9sw;7і| 8ۏ;xIR6|su%sδ!dp]~;,0LyI_+`o8p`~LSZT:(V' @0d M2z$*UTIrR3ΏQVL]'O'7n\oT{V[mMd{4V̙W# 8qرcSS'% JQF: 0rŜ$*( Jo;@@ $@*+Hoh7%ԭt-G"] Z@@@@@@@@1cFj z`8z ,HꠤPʠ݊:*'MPA~w ;;Ph:uqf@@@"|RJb8?oN8AI"^ p{a͛5\Snm*`RSSM"RSF+@fNjuʔ):Y6mRm۶LիW_ry+*@< @ 8M7ݤzJuI'=XdixulI{YO9P@dt} >L H%Uqx'ZkRI{տ7pÂoorN`>|6duQN<שS'5l0w[.$m4}R)/0k,U=?a99K$ lL6l9 >$*1!Vx'  PJ:(`"q^{-޽:Kv-_ K mD@@@@@@@|_~%5q{&k֬FɆ DL͚5K#Q<Fl$?/H |&'sPO̙UW]UM4I lw-roѢZA   ,s[J7K_Uf:@ o-ZjsUWmu. 4[o8ܦ]v5cXQuuc'pıcǦGwJӖ[Of5jՊg+ K-@(_ҥ;8Z}ճ~e|}ثWTus3lHOH5k.A SrA]        !q(|$X4dAR7(E?(Ӓ}Vt` J*E%uW}ǩ_oZiN~jNEA ܦ4uTr t[ϟU>N]r#S'bfqG?$SrLz\R2ӧ/N@s~k:Aƍkq/̗WU,:qӹ91ӯJ"{t1h[9ZWX׭x7y~7` Rɵb =p) =kN7ߤH{<*(8u=Md JHUz;މ +p)JnIÇ^8 ,tbCR-w  F@@@@@@@@k}?$J&&U P ۷\8 edt)z@6z`9іKݺuZH|˃__e#T@Ap`%.ϱ8P{ڰa dV   /,~@ 7H'$HYl P)s{8ȁ ȭzŮ'TٳgM<95u3W:ȱk?vӭ*;}|_ YRŧ+l)ԱNRd @Y$@ k>IPCV[:u.]SV\' ~_Oo_~xrAWw P@.]ߒPC\͛JJ4zh5jq~!~'UշbT߶Od%"E+(ϞQcvO:~xoիW/[b%!7$*MiIW_Mעxg?:{yen8>gh^Z쓿/;; O{{[{9w}xϒnᆋqmNZj\%#Oyʿ3]ݎcZnݺK%s}%1(yO.@U\_<8$8P5*9Ő$H$mv]+jXO  ׎(\`ĈDwo%}M#N;Mjje,Z( ^ ʉs$Y>&g\۵k-[-/}}yƍJhd-6󵤓9W oIU; L8qquB6n@N4;9ǩ5\3}g?e[mfZn7r?K'`wr6Oc2v]Zůe&sÞ\J[l$R &RxCc(\p#ψ 7C)x=~>/C6j(!Q[~^*kǎ~,yL[EV9Iv1d)F _w^sU_N^|~w_38~իy  V,%zZ%bE  s5_y%}|R:찒-租n+tH98S$q<ȥ        ر{I߾:gsɱ9=28(\=`|bKuR{5p#CˌOI8b81_^jԨ88mL'Z   %HOCsΑd%q5 @ $1MwO>+Q_ԱdT(Nbq>]'iwYf\,pɹsjl <3W'xH/n w҂5=}_$KB%qMr7$AؤC-mz ?l[ [Tş}6$J>iC̢cQ[)~ N$儹.w6ۤnMA}ݞNgi̘1:~T?'~b+K׷$ԪNQksD'Ș:u꾙#۬jժ  |nG3]/(ygcRlKrxkXkN/%>X2D9׷KO/n<p2 q焘8)&s{vzYkJn WpU +1J<_x{W8.#w +bu|Tqe%g:3?Ʊ)iL Ni ~ҮNRP((Ϩbz,຦|N8N2^ΟՂ y:N9Hd,okر,? Vk@*H`(eKWnJIǥ#Xp[#H;y`-G%z+,^@yRa        '- ؙ{Or-uWE )SŁHA@@@,V骫~Xn\B&>pI{|s_un6ٹ`;=x[pc7O`Zj*۲c{Vݾ68v 7$qAao;_~e^Xu{x~ozjm,LK7K}M<=]}#ˌy J H.gfy\WilJor̘l|J)m)}>ɏA4=c_Y^ʼnݶHmn. 1wur+i, #=sBm>-xcr-O}xN4bx^kԨQp9Ni_~>q޿b-x_jc2Oc<3N}9Ac x6^{ű.S?/q1 ׺{S#xߥE;rV#aW.ycq.8]Xx_9~idXq}\}?8-;=^To1?G(ɴHUzyjގw"  Cɔ)҈Kv{9ViZ (= J֭C'Νv4fɼȥ+'@@@@@@@@*[PwkBNB`*U*{K3kAqI〶ySQ2Alyb*zkjR8=`ˌ`GFOc-o?砭0>_Cd[&- |y-y; Ł\q>}pX E@@@>T:xi8+ϗ-XQ $faHIA,חhmQo۩cv $mn.:(׼y[ == `Uǀlq mضnnuu[wȫꀑEUo&;yǿ{1Yy?swo#m1gaS;}yq{|t5R߾Re SޖQ7 u%6{oi}V/BxE0 xHw$N>Y:% #*f}]8uTM8qqrj6 I6LIФ߈Ca׈j_ :N=>"M^-߿Izӯa,NV6jԨdmqϡq>Kv2Ncd?= 著/ n?5m)egYnTPoKݺI7qr퍂 {0| ib?x#׈S߿wbQ!EsCQ)sAqަByv焂Sߓ𾦟+yX;Gx|xwqIA_{1iRaӘd)0~ĩۀ|͹!1nw}/ xnߡ8-j} S| {>.=~#m2yʤ^7 &LI {=q $*#Vx'  ʝMwI[|P:%v.~W_z+$rЗmBr-oAi(@.u0(^J@@@@@@@@LpيA LE iݥ.]B2-yZЖ>ϹzZ] N=*}0V|;ΧN<h8-.8(.2^uuԧϝbOյk$ EԀ/H+yELd@@@H~BRV|R@2O૯$PgR_r@k-3oڢ$޿z^zIyGիS;s;8۶  +8$ۻc[w68}Io|*i? iY˴y6pOc{ƀprnM<eA94q1WIVziCbCQ,ג}r";|{`F‰X }ǵxe-@>=1rL+J{)vZf=HgkW34s 4>&}Vv_ijL qb$+VT/MyucIbI= \(@.]ߒP\|bxmTqDU1Hď͟N997?%-X*ۥ|u~nI ysۙ &M1KlkrSl_Ju?OA`e&L:Kի%M-ɱZxoxn4f} ^F0 ~(~~d&"F Dq~οbis |/?'w+@Ac~=PP͚}$G3\:!by=]*;5_wSgZ<8-|&mg.;9c>7Z::ɱY%Z%5/?>%% Vɜ {U1@@pp ɴ$GN~ۖIqp 4I8P<8tھF%?7.$jJr%V        $0w[믇DZ}$؍F!8hխ[I'W ʷҧt!;mu̷"  $JK}&tt9a\> @ |͒YNJJ;,]xaHբE|;E=t:_H'\w8Wg֗|k7_ip%_~#FH}* (TԭtAaJ=y@L9WCߘNN>Yd PU $ۚ?<"N91@$&hVvq˼KGL9I<@ ̞bw:QC'~ſg('@]vJ]vFre  PY~ҷa s%}T:8_W' hYPc$$ʂ .d6FN=Uc%&) J Pkx3  D'aä>ZXszwL)fkam0uԩzBb-I2SLyL@@@@@@@@^qB^ }ڷ]Gz)l#'g%Y}G@ {f }@u$cG驧kΓn=oVkȋU&Vd1I9{ɴrز;%אLkr~6߼dU  P&]xaHH[o׊lA:ac3^Z^Kg҆fv5 ]Yޭ'Z@]/d>>Gy%*u֑t 5>҈a-Kдzۇ; i#լ@@@@@@@@XkzW €=GkWv&ֆ@QI$+uj$`RQq@@@G`dBp/.߼sR@`"x'rc''r'i'i5oq_}%ytecJuW顇reoJ[n)=t>=$^XSTt~KKNDr(xRn!f  YC>;᧞*5iY}}N:IzHHٻ%Q/$KP:o': Z c?<jE:7s$Z(۷2EVL`{9F@((DYt7PwE&*l isggϐy8ABGagp~i~8kL@@@@@@@@@<ϗ^}U:0XcGפ <ɉ<9*ao>3+n^   @ <Ԭ4g3NTA;Nl "ntЫ]}vBY?n)<ɴ>\c0hc[oͭdZ t$M&9aX_3HjJeɉ~) @iM@@`7KHCJ5k.y\u Sq[݁Ɲ?"yjԐvUkof        ^ߤ7 A:_i $0@rKC2L.pՑ#ѣC2;6Dk/饗?-d KzI:H-ZHd|#=hv$ǐ]NVXXcL7&?9=쳹 @ t͒8;Z&s瞓v-"M4(y% TJZIU[ɴ,XV盋+޽ b?7 [Z}z@Dw uF=s-~C7#K?/}RÆ҅NGe~         PqIHl u.M*9(gKGA w!C}GG@@r_ =>n・=>Tj>=DrA`ƌ㤍7Ƀ_K. A<>ACO9%$ʅ.l^xAj$$OrT'˪yYg] ɿ<äqBp+|@Dotx8it!K(  _}%~#s a>5_|!::*b ~q 8\Sr|(\pArΖk :4v}D t )䋀}:KO?ȯȾm7)  YgK vZhCs[d6Ԯ-bBIJE  P+9 @@@@@@@@1a ~n]itRzX!{mH+9p;x-@@@LpvG YxBU+mBhbڸqҔ)'KCHsH&R撓 r0CB㥫?}4vl>uj>V81yLQ^]:魷#|cý3  PU! uH~kl*Ӧ$+yߊ*o^3ߞ$# | @% tS$A`B=&oz@[O81KUZ+~uvB-4lXHձd@`y$Z# ܩ]6DGV 󯿊x" YSCipiBgئMb@@@@@@@@@L{S2`Ir s#Γ6޸LVBhV>S7/7C@@CZ4aH#]F2\_7ߔ. |gQ~(u.4w4`J:fkwzO=Z+KϏխ+}.a\<ږtS曥Q9Zx忟W  3fHW]%`XE&I^*mav uV_UVM"\:Q>UlO&?J&ݓl[>> aN(^a PN燶󧟖^~YҭZs] E5Q}*'aՒ |C^6@IDATR<8ŝwN#~!@Y P$Y lù;ת]Ni#=LxӲt!N;ATž'@@@@@@@@@ 'Kz|o.(c'K]'5iN B͚{صO+v^   @8񊓱rCHmV.b +(!x{ys>*Ugf( 3KNbl[m%rw=s!~i%"!| AE/8 $Һ^騣^]gn\^|Qz9ap]k|oVOr9etI/ @ tSؾ}m@9 ̙mnJo +~=޽M;ܭ*ߵKB-+z1'L(_[-@B>~l= TYK+N< VNý{KÇK _,{l<        +,ࠝ춛4qt̙#k @ӦҀJ%ZNA@@@_j\:4w) #h4bDHYNDZ=&5j{z$H7qeҸq!TαĵvܨرK_.5k&W{xv@ˉ6$lBz%a@|HCēfIOK;X?_r 7,2x' ӤI% /vڭ3| +ey'/ի'>ԩep9%@B:  /J;J[BI)\`!CWj6tH/<        &'կ/]u@@?|tIR͚ٶGl/+иqbN>OW#  T5n%$@wBQB0!}I$9H.;zoJrP]?@֞KrBHWCr .V[-;z]%'ryR@WZ[m%u"qſgla3B5! ÆI\}Ե4f4htR깫Pt꫇+1EmE&={3_|3 @% |6Rn :4}طvVdZ.  @ev[o焙_&NL\sMelJNiΜ _mpuޒܮع4sfn+G  V6 @2C3ٝyW5̌mXeF !2y6@@@@@@@@(N`ѢoBpO>Sr{]AŭFB,3uPSrQe@@@pݥK.nAW[7;DrA`t?9&o8$?_첐ogN>YrbJZ:`%Y l0        y-믡Ԗ[J*yλ`@$N^#P9 sR [WK_@pn^t9!Hnqr5}\=KqGQ#i5B`q!Rj$q3d ꪫ}G@n ?Wʪ@? =zHKeח}ܰ#~[U! KMi@{z!M6MW^ye(kB-חO` 氳 PUK^ 䝀D7o.W~r>jդCЁ=g@@@@@@@@IPnAtSΝq>}NiOV2KA0o2k@@@xAC ?47ΝcO@7Oz I [[O:TCЯ9sB#m^JS XP뮟K7,#9d3hdKʊ Ԭ)_Ґ!̙!ۭbbR׮8gω) dSOvf.Ock ǥmuV~[ȉ g@Ǚ"        @tJ) "x(2s-A {IGA~)[ #F]&謈@j:/ŝv.@r,  "0iRH '͚ui;$úޝ^Xw'?xſg@X { ' d}ڇ ?7}/ =(  Pw!a|\.ϺKyCɾMJ>+=THZKxPZyxe@(\࣏V$~饗u-   '!IkLA(@\+pTn~6A+-= J}ងN.xzGYOƮJキ2KQ >@SI>KLK*p Ko/[w:@*F I6?$|Ei駟OCޚ$=؊٠,Xc)>Y[ne*W_1DA@.xPxzH*RyBJ' j.sro,@0KUr'/UnL^y睷yWZ>N|1Jciೋ P=I@uW_ܑGyGt\߿Βw?a @@@@@@@@G~f@&NDZY`+Ox}WZoTk„֌    r ,5hV#%9?.}Fa%H)]qgҷ*IOSJ'ࠤw!5jy|OדO^X_&Mnk@NҐ!)+/Pj6l4cFӠ&HN=P{w)%AA@RIHݞvK:0(?Wwyzꥣ:R7V>rPRΙe=]tV[moV9 @ ƫj d5p, 3&$fw_w__~*= P|Y: @ 8y}ZZI[$7Zk̃ ;9gNl v 6?<([x  r[  P~I#I'_C;єw#|{y&Լt!gE        䪀ԥKX9vl >x|sRCƊ ֈ   ?(tm#HClXj.if͖5U'\wHRv]~ i5BߟurU  س oIW]SuHݯԻw8\ $ZV7 l?ct>#         P ?oK^٨Qٮ! ;JZH"   %0n\&7b4` kyI-ZH/q4d}I:N`Uxmq#GJ:IݻK[K>]wēw߭?P>VZbxR%|/+@![o믖->*y 8/KO<9@H.9S17H⊐Lk(&:JrGI]'=zu衇'w)>UVYaXI^_+y@ 7M7I LV[Pdj*S~E:X3훾~ZիWX #߻*Ra'GѕW^!eU%+"֒ߴt7KNFAH)  @~<Ըq$;[o8dY { (         P>cJ:H^*]x4zԥK"@<7&M€A    PŵkK|"kWثx _CSaNi}BR]v^yePDkWS$`$:Lf OD_C$%6$f}Kuye|_ҽ^+clyq 7\`・}%ǀ8묒W" "C!?9)|#wԬKs2N;-yCztA-Z,6mL VM"#_tEzꩧ4eʔ! PKcHk5Y Ph)t?^z5A(jՊ *U*v @\/?m;žΛܯZKO:v<㏥/jqf/@kwfygåN/zU8jm}QKӢx@@@@@@@@ ҝwJZI"}իny WfMA.;vBP]#KG@@&\{J:KJe @8GI7Ƭ: -5m*%9ѡͼJu{KW^kQ>K7- ÆI/qO<1I(e+16].K["[oIW]%]xaH7k֒[c $$t=,@ 8gJmM0dHH6/_$:c=&~/I6@R#b@@@2S_Igb@Ǝ}8u[/<>yr!P-{gս{$xa|+js~=OR!EIIG830 裏r rKCYbϤ-Cr/`fc:1@X@I]cǐ7.f̐xBС/ZH'pB' /h+<I?_?Ν[ʥ6@B2U}]*q=.dkw%G+oHUy@ n=$;\^q_r%jժMXjZr@ߗ.TRe@bjԐ^~Yi'K )   +0eԮ4hԯtk#@ L$tRzRӦ! :ט1'=TZ=CIr#ӓĄ$4/TG ڷ:JY 7.oڴi RA~e_#+-РaJ/,W :>4|/]U 8ܬYᅲ=@(6'xp-꠳o%}Miu+ :V=Իw{ !.H.Sל }Z%@ tԶMN-aÆ]CƏڴyvB,$ԪL}֍ K7(wt!}q~2_׍ɛVvm]?,iPyrWZ{l3@N{ ?nn5h7N:ʧ ]/@@@@@@@@xIiĈ0`W djI/v* [v!  8 9zǎ6dwI>+|rH gH~Af< +&ONv' WqX+~Bk!}de҆SN9%IVOW^ye/♕p[dJVvq$ޟӤ *{cks^@XzUio'|K/Iz۹pB{z.h'{.MB3fHk-լ FiJ.>T.!䷀+: хJ'P+? ٷ/ m}hOv?LiKB, 'p5%H#s.ҮMΝ;/y o3'vXtoHRZjec@@ ]`Ȑ0(G[7i)M5_Uy+Pk`$vƍ+o' Ysnڦn~gW]vL˃(         P:[n;L:σi( ժ) d~/PبQr X:h yqS>A`K@@@rxS0vn`Ar^!G*Qয়BPsϕ5 :J3F:∐y'!nFrФ.L\pN]qKez{nXd 駟ZZ͓.TD1jѢ=?ުK*" $dh42FB$e!4( 2e EJIPJR Toyw{wx޽w=>{Ͻo5fN8~8'5zԷS[VqJ%V!8iS0Ƌoߎ[n%ujn]L$HELɩO?֬I!?O< +иqcz뭦!YDD Y AE$vR8߼W}#-zVhղeKrʹ=% fٲ9Y5ؾe;LQꪫ9H,\Нauxgeѣb\iZ[C3L.,ch9aA(\p m۶e~ְ{Wt޵X`;w3ǓGhhU?-|ٳ3 -7OgFa",dِmÆ mkE@D 7 U=7b{d6.71Q4(7EIJx Q6gc{6>\9y0^7Y'˯9~9v5t/O*LE  s/4Q=zᱫ2qD<)g􅵽9f==<`j-Z@V\?Ktp =d ̂vxۤ?g1%[fւ@0 %H]naR9s`h N[|rM:۠ C0gG&SJO^<>994ؾ?>Ν .EyVAh߭ȾE{~Nϳ@^Ѡ]vOj8DHyanh 4pf/Z wg[0ʖcX͛7;ӭmY Z`./8iÇ@`Lh׽ f Pp~ͭ5'n UVСCACU%((}OVMW=Z|)qϐnj~ju{'tkܰgϞa8G}c\ AZ֌Cdѫ@z-3zū݄ 裓OϖleT/Gڵ3'Bnݜu]"1 hJ" " " " " " " " " " " " " " " " " #p=0 p;V{$?wE(v0A/Vk5j(twO>q]8*OqTWt%s]ϟQ8=]%f ʔ7AL5G|w晹iwOW^W\%z1/ƹSN9ŕe9ѼXbܔRfg˙=^pl V\"˖-z(vh8\q7p@3,iB`q]^?Nj25^zo駟lNZ<5i!$C:RO_rkEӦM#&(慠$" " c9=F+VƮK ^ӫW/\tEKS[zw 'UBD@BtUBOMn gB  f*Zya,5iXv NJyA8/ =Pg*O#PGKg~\6t!R}CD@D@D  0#aNE`.ZNd'۷jWAA9}==:u Nو@ 0dL|2mP%4%@&u5q_M`(EB@7@=иqcWJ*YܨZoݫ@0-z*`^+&"&4P8xPX˦:S#`H@. h4&;}EIVemܹsVsXZԿ{25yyMM/2z-<3{=,cPre5 ժUC3~min{gR0Y|Fhx}~!ڇqvg9ǝ4=KT47 $'$ e Q2f 6oޜ5#*\2D%_ shṳ̙6ͨCW_}ՙM4 M63S^D,[ }Ϟ=1eמ OVM%N&MAYg*a^ѐt}\s[|'k*U[ݺuA<+D Wun?r @߾@nw۶m.CZAjhk)h:m;-XL8cֵ֛!lLsh;ay}DKD@҅@t!" " "VvKm?]Bie.7q1X⠃3HtRԩ4hQMnm#|;0]B<k׮]o6f%;u*y^20sl33]M)Qx~ܹ3֬Yc:ӯŋ^pB; `e6AnB j^{⾓̕lO;4[.4 Ì3Z*1s%by~Gnn/v31Dqo*šz p6-ZVٳ"!S@KݱcG7:xKm^uRzE|c7n.Ri8lYXߥxs˯bkРAnn~p.B <6m#7h00U OϵG/~Pvfu5k JS&P((fy8} \z)(>(ijgᦩ_k)ޟNN8zz!b]h}4@{9rxT~},\НN:+L56ͮ]ch4fgeQW^s?g%6_ l\l s;.؟f9׽̜7n+Vpu2̈́q0]j0HHsmmr(H >z[3٠wga_R'ۺkbnyD,{A=g8T!_rmUN鮻B6mrcl3204bbCGhűĸ &8xG^bz>\8r̘;kutrЫ@ZA%Hjy>y%Kz^jI]] yy4Ygk޼7o},Û2euL[γT^f38#w}פIO?+V̫^yf{SF όv zPޭ ./{8udpg|wuW>,゙ex6Y?g\ޓO>YgA/]Z(#;-$9C=|$/'" " " " " " " " " " " " " " " iJ`r+[2M+jD%Э=| 6x{wuy=&2Ŋot;ٿcz&M8&.& v gB1L`)#Ѕ?31NτwCWkYD@D@D@D@D@RGy6N<~5嫣 "⋞w5W?GCE-Zx^~y‰HƸx=qTR0yvj۶mF8>fYg_[dZ9eMm;L6-7t˛:=ýoРlٲr%¶m7dg=Wټ`۾=>쳞{ӧOw󌃹ĜkXd<׈6:;(g& ƍڜ2l}'<ﭷv9w)k{W^nFT}8GLvV.ɗ^JOO(`Ziɒ%NL MF7^ڿR@@U"  #@}>H׾ggO?9ޛS|O4w}b]mׁ׀TG3'>5Wg&K/UP-|<73_>G&ˣkd)Gp{D)3sxj&ffaGqv0P*H~ff*/ȓzR&f춛Iv.PLѣGm?3fVǶkÆ ݻaÆcN`g)4^/f|bt357믿YB /whlOO23K.vlBb<~֙Bq&xgzkn| 5tjώ}rD"&sgHN53s]D#i0}Y-X 1;$qfBPmÓO>3W&ehچ~z?v{.ijϥ d F1T'~L=\pNǺٖ m4L~7iҤLB,X%ksO[C-jÅ:Иo$4umPUVc$m}]v"݃mH}̨" O;!WyOͩf<>%  9=vٲe.&7!\pNǺeO ԭ;;cjrjz#@?naڴ~>}'؃2gjgf&֊O;ǢxW!Ƽ\Ygh`.#-",d+Q~D@D@D@D l ԯ̙ԪtŌ@N_ / !q' w}o6cg,.Ԯ];QG{{{  gl7 X`֙{@0,P8c_D`ڴixlٲm@ 8;,0fq{쑱,ؠ|Iԭ[` @:u\Ǐ2e`ܹnww>jU`ɒ 7`LRڵw%J" @UW۶^kmʉl޼9L$,cnM+h.Yfy>:#.b+͛7gi8+VX_yaΡNۀ}a} ,"8ՔJm*+&O?S]O;͟ lSRQdނ5ű#g~& l( º&+& Fj21ṯXc\ۯ_?kY-0/Λe٘D˽rNСC[oaXhͫߖ9/SRPAʕ\쇉S!>^hjص'abnތdkڵ'N%g&keFD@DP`gVa5i8a&Rǿ{Y 3E񬀧OVu: r@&3w^z89J>^Aچ&NsRX3ƌ/ܭ1;v,nU:TsUЦMIg1x'NJo\p;EA# b 2O*:QSID@D@D@D@D@Ru{ O_Q_҇;,h 89Rٲe+ 8bLk,/yW9LOK4ʼ;W^LúŋlW2~NA9*yEW/+_H. y&өy3s j͝;炜 {{Ls5zU9@6dj?Č32ƽXF}Y"ǹBSU$8ہn 9J߁!J-': ֹ <:]@>H g` aՉw;c 6O ^M?S*UeA'| amٲ+'$1&c$VfA>m۶&ߪuf 3 WȂA/s/.Z%"P {/L غ՟`2&M N̒c7neƖ8'gQH'bE!.\tE&fjJ" " " " " "lږs|!W^??+⋀4΁[<ZӦŒi|-'x%vSXƸ+lͫmذ\jS Ƹx?Fka9KҘ1cPZ5g5{LfPs*SLld;y&$ 期.N48:&Ǐwb6lp"3h׈%5zq_# 釦W_}ՍԵ -K"7+} p≾|}RO19|`g COe'qƹfi1y&<&L iCe'@V˗} ƺ=Nl~ ocRdž樛6mr'; O"}챌ѲBch*HqfQV4`[䩧¬Yk ?dXJEI4NMA=?ܕH3PX841~sQ볳̶s=!wq(Uhfbi^#on/tS–iܚD}-ƠЌ)'Onڿ ,N-B`y0fJa1rr.hmC'yOoн{w⋸˝z0&vB(-OI]5u~i uws +_'w GuuPɓn`1Asrᱹ]O_E"Lj\3+#gRc3=gd5frn[Xũo*G8o߾裏ܽf͚ǾB5WZ}Gx]y%l<6GD 4j%(xA/rg.`" <6:u\qFAH/QD =3 ;)ț}%]r4;\4:3b./ /sub _J, ϙ3'# Pb -ج^V_ $`zn0ܹ S?oނ5)&bKA bc9!U=CE Dqh4Zz5V\oݺu.?CD21H uzT ytLV̴Rᢩ"Ӱ M);&LZfZYqqj3SxV&M7tI8)t$q1q+ϔbqq;த%;`-t[^/бF o!.e;G2m\\sk|:>ccEh"5I1HsBk?ЌM6Sz~aײ.r0^~Xfs9 ϫS\X1޸qcz%Z_Nt"< WE@D@tڷ4} / |)h3-0I-P¼|ihodu BUb;.胅i9>ZcŴrxᇱvZwy1Z05bHJlD06-})P)H\S]v]^)"o) {m|rhJƾy]42]ALJVY߿9>S`-bD ^)x 0\aZDQm{6 9rP" R՚`{Z6ƹRL NK?sK0>w Gdi_"sOKVμa%Jsg1qb{&$nj IU{Zf2#|wyz{wMԩ[XC 9DCx{7dcX,쵟@2%(Pg{^ʞw7mZ%ONq#C8oVoY'kРg| ۽7)^=yv1٭_hQF91٭[`{ޟz= ʞ Pc\mo޼yF p+]gM ݶ.,c%\Yy{z,x={tHf-ܒ<+R :ʗO" " " " " " " " " " " " " " " ">ck_3yrWH3Cxy>=3qa|=r)F0L;o̘1= 䙐S\;K}G.K/ LʫQFh$+8aL'j+8)E9/?|'rd*{o^\Iw}8|g3qpřNk,2k ͫtli޼5I%%ҥx{,/:uQ>5JRg Brs &XP̙ezsdeFF=L2Y>n I}-ŴD2_?d rOQ9o}{ 6,h!^o֠ӧzOʹ.0Lt̒Fې o 7w1+5IWؕgʵi5^qbnyLx@P>CwHzX%Hq4:.15uYMRb"u#I6m=]#=W{u' ^ݝVwG6K0 xjsYfvscg9@@VH(@ض F`W/H-C~?ҥ_F"``˰@Xh/yaRC*Xpˎ6,x p2O+ eD2Q\lpgyƍl2X+,h9Sv۷pٙ6M6 ~_p*N=ЧpEl,IID@"9v;O41LqA&#ҥK[د0`SkX " " " " " ԩuoɹfҪ@oOɓ?@)' bɞz)\+Of9÷~ je1& ۾yf7 21.3a0Lʋ76 ~^ϓ>h7w׊M<35™4M)2ebȐѹA.6^9*U\tK6-[?| ¯TZ f>^e|.Z^ݴ!Cp:LD K{20|80{6P}tPl'ِCۡH'O4+׎Z73O#).AnhJlo2cbx4r?a_Ԍ_dY h-[iBeC:lŒ3I'eGyUm&ƿ`VV]`Ѻ!c@~0}9_^iSਣC,; kgO?TX>Aƍc!i3VZfm;!G&@ gS)M--­—_Aubܲ~<"ثALT(̟?4.k_j\WR"0lpp$͝;מë _Up6b1o<=3]]/r8fRF `D32VkA ژ,X&MX)QjeR!E@D@D [[s睗^ pnLdĹRTnMעN@~ T4&`ة}}cz7,^ TƕWD@B`X0н/L@hEs֭#CD$`ڡN>0К9ZZ͚#f߻wos=)Y*i̺]wၻ/%&ނ Kvs/WoŠd`o3MD۩ Dc)b퉟x>bJ" "S#5?[<߾lɔt4awr'['i7FN4b[e(bQ +W%KtfQwFPKDlڼ"pᅻ֜F55w iS} ggj>}sXtzqjVB<$jQ" I@`z{= 4s s6w$$j曷Ƹq[? @ҕ8y t)16୷L*dk#D@D@D@D  Zc8~19+Ud9p+JQTT)zsȐ!.@C" " " " " " " " " " " " " " " " "4˫]B۶^&MqU$$(ϛw4XaIau&aAsQaoE:TD@D@D@D@D@;CEݹ@z<8h`寿7 ) Tbrٳ'k&abh׮]ZUvܸqvH̍O=oA/>?8IݺuX Y{M/D۶mn%6$-]Ƌn݌)n烛3 'ߧ3/*%RVV" "{4~_re[NK3/-ȦA2ލp=sR%ȯA.7=kc8?.B:EH%J5kҮr '`}u+ɔD4Rk>YTVF 9U1}|%QN|DRQw_CIqMGoLk6L4 mb\=OʪZ|q+V}g'T)Ox*pu@U? #D 1TDDu3Ouʀ3 aZMV.qD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D pcs WW Ҭ⪎@B L,c9" ++_v-[n_g}\;HfZQ1x] $yw E/~Uϻ(gHae4NR*@<8{o74͞=۵WU, q>^]~=(]xE@nd.&" " "(pi;\'Z箞׹GG=a^/~ΕD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@rOtAeM7͛=\rμ)*׬|9@͚;iID@ lݺ;vرϡHx)s{H GnHwW'쿮X콷?/U4u<#ҟ-@2Y嗧}SfBeK4i bRVY[8∬ڜ}I uT"dĉ;:p{̌ʕ 2tj1[u̜yfO<'t\H "?GVdݓG %T @ϞȑO?48U&c@9tiy&зoޞG@*P%,#:dXkl\71gJ\:u>??=Z.~:?uQ%/R'9E@D@D@ ?4j.3-^w3D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D078lm[ॗ.]NlEԝ08g-LTW(^N<[L=*tݜ@4GFQ#3hMDXV-bE_}8/[ueMf۷4I ;4riew(l:μ/tO&c5k/ 4;I3&yo_D@Þ#ƬZ4k}`Jࡇd"ŭ"Ν?R`e8H" "lMfZvm ky>#qŅj" " W^>L> LcJ'pe?ZG$#:$UQD@D@D ̙0`䓁JHYPk<@9u뀍CD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@ 큮]af7SO u˔LUh6-}VD@HS^0mfw&S-}4D@D@D@D@D@D Ah@1@q%%y3 \|9p{Z|4j+E`'Iڵa&;w;ˌf'!-E"м|)vO.uMqƌ(];w*ny}r0A tKPe#" q1R>}.N.P}8jݻlOCj1sJRUicF]>%(h+V]qGA&_ӚϹtH4u=<#GMRr-כJ'pI@J~^" H@ZxUT&HK-[iRlV#0}lXw\ٯ<(@:`|M7 d2f޴z0T\ŁGf㳚48嗁m"-" g/ V7Uy(\D@D@D@D@D A7yM`DuelD@Rh)Rϱ^Rsn~8xW߶^)]e>,X8^7=೅2e:EZh XX,-S(*q)Κ5;k`sa74Ks͢EӬb$sox10lz50d@x%)ndPgK.ņ rUm7@Zq#ӎ" " " " " " " " " " " " " " " " )H`&4Fƍz+AU yg|:X`dOa&90a18o^" @Z0lԮ]} q(dw: SO~:BD =P̗㱃fG9jxÀ#UEC6m|j~ 6pyT_?oa)Sҭf]#8_=LDNM&Fiv2ŊQTH"|\/cLf}o].F6X:0JqVҥ_;@a'@m2%HW=n^ݻk UT"p-Fa7ԨpjٲTZ*sL PkWsa<…ҥ:5UD@D@D l sP;~Pm Cc|y`#D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D ^ 4i|@v~9Y'e& ?t6P.`9~_5{9jot%~H^1?kmU/ l P'7Q" K'ڶDr<_?dI` _g `hK}䭍Jn?K楃7 ھU Uƥ^7Nj -[d* t0D@b`cb)Js&sOӤB9F:998P@ `_/~V]}VnI˖ԩ@2x#`D@D@D@D 1(ҳ'Я\S?j2cѢD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D  q/I M4: EеY_ r/y@9rH;@Æ-"%KNUR/4:-0}:Pr~Y4w{dJxzs%JGitF`jرW(AρJ>7֚2_ۤIG)t8H`H }6mr[m/Ը_t,ncT'X x駁5k wT}F @ŊOf5C=^zd̹Y5̵ 04hŐE *$3jWHe1Ѭ(4} |YZ-@ s!T.Å*4Y?^Z߇yމ$7+rNp@rFZŊ*4;oo׺l0M=5Kओr(haS 8:@`}{쳁[nIZM!e Rh=E@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D Y lt  tӮ%}m`wݖkLDY~o^yxe|իW^ tx`^]y$#ڵ RbkN Dpc}$c T&[n6@IDAT 8@jM-.s]͚=Meʤv=U&y30h0`P<0nЮ]rYKM}=o?[>*^غկ4Sw⣏k=8){xI0@l4}ٲUW]Tx!EU+w3N;4p u=PM `ɒ%f4?$Smذ3:ܕKQ+X2*X:{b(X8ds"9!`>h$'91ukŒOӧ^d̟Lyԩ2LDD 9LKa2 [ 6?."9J[xK#03z` {曰q#}a>׽]d'CȜER@T((" " ":w=FLw ɅIZ>xP[@rذ8 ॗ,Yin pn~'<l0kpꩾpgJYg9FID P/Zcg)и1з/yJ" " " " " "PpMu(R'2*L^uM/x@ժ…+3$Wm8s@꾡w/Vr]t(_~hG_t ̴* (ݾ=←R] ݔD@D@"j`Dc,L+29m)H®t*ڶWA'i}0E,m7di˟6q]w@f[uz'D?o L~{*DeMGݻ{ǔcS }E m.+y@_g26􀣎&_ _{ysfL4*S`f]Xg3fFYUJDޤ-" " " "W^ƍF7c ^2fǦMD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D  Ph䓁 ND:ksޛ\{qСEc9a9ǟ@Eٍ4:@AQ)hkYx|2^SD@D@D@D@DpX'0e PBZ@Xx }Cҥ-9GKL՚ܩDO_yoww{JPYSGuqEײJ$/W.-ZJuhl/Y?e*@A9 M1[֏A }5t{^xVkyxvmj((&^D*C,֭}Kʩ)M^OJW%!8顇g'$;e")IU7*ViJ^b#Sz3oޟ/mJOc pN@V2' UE@RSJ" " "hvԭ,`X%i1 X;JXߗBJ" " " " " " " " " " " " " " " " "jN8`EԉO~oh]v`4ա'''c:7U}6ih4kPwvox!˥@~X7*Y7.'"]8fNyslX7 8A8nOG䓁2e9sYc|,JɷGOOS"ޣe)#"PXl0䤓|C4TT!w߭W^#_IY98X裏4D@v!@"6E+R5 +p@F{eGD sH=:+ϖ:s(@a&@h4VHN MpD pUH+֣?O'RRԯ^.[D P/" " )N(2`@W$jQ+[CUuv'0mи1`'SREzm_0{#S[jVR`ӿtt~";6eW(̿[yD.4=i7<<(Wp_T!@C^:uWc9Ic-3`:`{wc$*6Uni|)'p?~}t#^Kb]F7*_>TnG3;oδu R6.]n7Ԣx_^ wjO/86kY(Y] -* ƈZ0 qТR^R*ҢhEҢBȒ=Y+YJ[$$(HZ?ϹS{}2ss>yg޹Μ>gZ-" C-=A'@HBk;$#}+@*?7wݕM0*" ]3S`Q~zt':c<'ǀwз/믻GYP߁ m~ _Pܰa(+V o |0~<0z4PT܇e-.R$\P+>~KD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D =Mڷ T5+$[Ln8唐Rnn YgW^ pp D@2  %8w=Y5X8ܹx5+B49|M6ohwu!܄2$hEeˀ;3$X5#+NVkD VhĆrP*S&1I`8`Fy{vP[GTG'h~I9sajLP]A2sګ'zęp]CժUG_#T5a„i@r#s7&a}"Åm*DBM``PCMقu|sj֬ V[H$ŁΝ#ڿ"Ϧc$KD*;:gjx#gձC`ȐY(_>Kd/WN"ZS`Ao*3j&_XXV^_<p!.K®˗O؎#FD?)xCqAmr'O];` L{*@P}@XCqرxMছB"L:f-ZӦ }vm[HWg??i|7AK^B]zid]{iIG`3UF]w,]2 RlE@"uk#]-2Z rEAn"& [ ewagcRJǨ_j ՋVP='h1 V^}Q3K̈́I54l,IA@>yLF.&@,)0 Xx}ΉRjן~z(_~}:u _%Pzw(ܨ+" " " $+E0WV0&d]U&" " " " " " " " " " " " " " " " ~!C{;BAV bQ924 8h 2 }TE ֭!Q%K"vs+;dgUTHZfZq_u"@Fڷ[ C֮ L_'G U+A$pE(|啡2 ZѰjU ^Y7ʔm CưgА2(q-T(( f xA[7tiqc`hv4+Cz%S{㦛'h {8p`:`ܐaB͚n Eno/E>S,Gᇁk;qR7%dJ:@" |A:kyDi-U]:5w)@:͉ h"yŊC V@zp8;j(J@Zя w9z+pE1cPOe%%B7|3E PXw{i6^D@E`͚ہٳ>;\pA/YC&}?ϖF`4vVț3v*{/mA2s " " " " " " " " " " " " " " " "w^?Q{Ձqɂ@v@;@Jn9$6jTHbEy_[S6dub+A#@I3#<0kCB16O? 5*KGC&pK\|y?o?w7xxj?4kt= WGH7=]?̜=7\(8t`j`,K-KYICBZ ,]x&+VUiQonzA\AD O,FÔ@|BZ_w]_NCnMePkJ`ܶo"z{uLg]kID_̉}^2С*[뮅bC+5 `u~!"N2J'}[D@D@J" ,\ի Hqb# Cxik<pf,2R Q:41#CgH,E.(AUCoq=&" " " " " $@ki*̝ .ʳ\"_۶%.n6?Qp6Vbw֛N ~xέ#@" 4sr>"׮}6m@c矐8+W^c4b;tw.`;ڵ6mBe v T\DlِsF/=Ljժe" gJE hpw)"Rl~  A; h< LU+Cx LD.&6mNg~ д-nXܡChY#PR?,Ѵ@:짂DO?b虹 ⿯4ڰacM{@<pY5_qB3όm lAV  BG o(M^ L4l 7S59C_ SHA5-СxU`A^+N ͛Ck4 F)'])>~f֓O)]9$wgj P 0z4EM|_T!9\OuTNj?L0-͵h|1!}{.;]u4^y%N=1"M5㮷QD4 ԩ@P+Eu`^.vs׭y ynH\|1UD hҧ" `9fq^ӧJl4:2zZ]J#J.o1/VW' &@Qxi%26쪇a_,:?[o iv$$hBZp6Ow aݻg E /l Ş+K\zMonM{\O?8[D }LAD@D@D@#'a֬1C#ʹr6jmArh@z,^اp=at/} Ral0u+m۶Ǵ(4͚3JWOAɒ?[᧿ F]M\4'p]>w%Qrs[!i}H,XyM 2BwQ/ڵ~-$Vi1cyqQq֭[&M2WtsWt9˕, z˃9˃E:IJ[v+V ŋSQdPPW]g2{^()D.ұ2T2˺ y ?iө7}WNB.9Ӳ&zӧw٥Uvoii'[A3͛aC@12Sf?yЁW 4pbz믝{ +W-\b OQKesiH)ӾQܮn¶L=(0p`JOLКqƴ6&&~c ܲ7O`s:Ws7~c#9#}SmaM/ &?!b/Əzp }4K!ov|?}&N}n{y30nݲݲsݏyk~ |TC$fTג :LX7zj0._ߩ̿ʺrF4|v^:<@Nz43`TgSwΠZ&L_MqTAJe!x'W.o,\iu?\]&|^(-.peyeemlo+xJ2-S`:d^rƍ_Lf;qyK_oz2ӌ7/YiW9'.-[A&ޭ0q"L4h2;|Y`w{u̻ny~Oߎwqς;l:*TTIu>GD ϞZ8+" " " i"pU3wFV); g>ӆF?DX h>4(G 5Wf\|hxŐc؉ pPQs'vGc.G;T7h+~s"S~5Aw̠GA|; @s i7X:GM2 $ֹdcȅ99X`n2Ec9qPcNs PdsnG " " " " " x֯-&>R(~8mڴs_Nr,ײ,[`Ye)'9 n/s?,90e<Ή^9`npe5Qs\ti+靗1TSX8 9b,z,WO? hDkB #n <Ц p衡mXO? ;Ӫ7zӪ[vP[-PˉźyPKnM7mz1249']n+-m*U`|r!|yӅ238(^q k+AAb&U1rb:us72]X4(6u.,Yw}[)繥OoLL٥&tY(yN9tAv2=eB~:<`0o_/ 3|2mQD`$H~~mXa: \|oi9s.z|,4b[vNlsL>aĈa:*@ Ԭ>ݱ`?x{!=Yn\q'oYߕw%/,1-r²ˮ2w:䐅;[>a\'w+Ǹ9\&0!{][O]>IAE3^\ڵkwoL#.0gsǺ. L;.0w ~̽^hQ^eW_aZj4ίyr }_O>Ӛ5ksgfZqς{= +N3?mY=a[wfǩjժ[h5ʤ%GHsV+" " i"`0ms4EקuM!F B\D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@JcFZO? 3h0Û1/x gb7{4o\s ХK|܂z튷89!qbrSI@(u*T9p sНH _xH\9_H?z!Aā&n؝W\)b[~9 | G7ۙlq$ze'F82"/" " " "0_:T Q#\(C>b,pv%QJR,2eWWFO?}\fy;93]YF(Frc(>FvPSJ[x1!Z7ҝu3fhepFZFsG!2m2ݮ[ngzu锦RLʕ3&nuvFdtWh(FuF$u1Rwݗ_~w}ך.I.VGŊmtC9Fzǀ '2mb%$|\;w抑ރ,W=okaޭJ*eWb-|~+5}ε[ԘN|[&[>9,4m;*>H2NDdKce[T~ L7 Źwݼ}φ_-7|k.9u8cມ;ׅec_5j$4z{Ny=;m;>V"/xy ;6Q^=t ݺuÑGaM޺g&KѴ njcp<˔+prJEuDuB~͹m@~cslσkC e[KZ#V30H+)=Xq}AXeo`3r;?kב/&C|/z表_>4ibf #@s?K,˭nZjy8#йsg'm+۳>:涙 q#?⦙3g{uFl V дiS;5j~GsrsgSAD@D@D@D@LB}̝ #䫉?IE{9}WvNPh9iTə>9qqEQds)$>gL)FS#72lY)Fs#⻉6}OX8HhF۴5ТOs:vxe ]`ޥWv]zuiNZ1TXd6 6up4{mX<.f)D4\/鸣;'*ͱV5I~go-+]|~)]O*.]h;X_&c:䷓ 91fS:x|;ϼaÐ1RO4V3Z )$@J]9 WzN4 MYb~m6FN!,]Ι[Vsf^8 `30f[MF8S&4\Ԭcfz}T~N$vf>|ƽ|3MpbۧOWE> Qۆ͌)D2 owel/>ON؞u[~R_!s 6 ˖ z8xÁ1c~%?&Mʕ+mO '-ZvD_[l6b̛7ӦMea5X4b]$&Oy`Lq=楗=C! 0O˶Z5s>+Nᆲͣ>o..?Yb>We>LϮ5+g2kwe=O[f'K}N.={c 3bmh2zvԩcۧґMڴkn %Xf >S|gxy#/[u@RN>C̚5 oɺ8ۏ:(kVv)5kY{>kK8I4j۶-NPd|7:QXM-}6(Av^ W'b́͹wMa9r`s`h<: dz(^D" \i?On0w΁ " " " " "7\29oKt|(N1NV4zWeޝ& E+Us}gr>i{D})3Nu Sȩqřj xnP= 40B ,L_|r4ceDUo9D|c5 ?ӧz;.mˍC3|{ޡC 2!Q0}!T?v"LtcX m_m~qula;,]IJ7OYhѝyGg̓lU|?-se>;޾,nrmEnq $r3jԩ4HӦMZ&M裏'c?XCwys+l5}޽16 ;K/_ݦ}ӈvP1FjE4[3oK% P&[=aCK@P+~~2Ԋ!`4ֵtķ0pq;f)DGCkK[9tvMsk4jn(." " " " " " " " " " " " " " " &`NھSe?*3%`ЪG@zq&;-I]Pp@qN E<(]m/ vb:nn[R2 (GEA!7'3+|it_ ;Eg)>Ł&'IZHFF%gL9((tD?S0O@E8'M>%L4qp;)j4s(Oz~;K jD`.F Ì-n{m7'3oee>c xn),,O.*o~قBzt̗!)F4&mѐA!(H8N|3R0ͽo!߳4ge{YINLhbt3߱|qhذ!4h`LA43}]xa(eFldȶYr\{ hM3@e{B`mi 9a>CteQ`y"\?׷o6YNطAYTBN>Rc'tO.o`ڠI޿TRKÈDaꄀ1cq4#/4F/zK.Ę;}7U3O-cq˖-0+П8+h4sY ]u9׫mؑJ߶f/a}'3C̟qI&7ofϞ3fq6|&;s_s2y:Q22 +f}8ؙ8nNa'2ŹB&+*!4ۢ(e U9- N1ͱ_wXTz # M 9.5L˖-[0Hs,HsPn'@8 hD-hDo7cϿƸ8eE8&&t>d,p?֭[ŷ\eu&ZҊ"9hg03Ǐz64kɒ%x*)I%7'SGٿGf@'|b zMuQ6-Roir?Rw&Xۀ8?f\wp)>qNZMgOvlSd~M4Qmi PDy g'1!2|dh0=Bwmk2`{+; }ܲo T>Xmvip}دip-X5[` \&QH .fFDjau9ѥK/^l ̙]PY2i)¢];`L]ϱdž'LH9u 06Wfٚq]RJYS"gz9qzݙ`-XO@7a#r?aC֪Uipĉ& #2ɓ1~x^DƧz̶w[oHplhUHFBs'⡇im={zl L4$~tZ`6p@а!pI)֊kVwTZӞ" " "̘uӀ<0L_~i+U@.ҔL%L%+;$Yv{!.< +C(ESD@D@D@D@D@D@D@D@D@D@D@D@D@D@D &[m̴ׇEŸFG矟CzgiњTPX)L1.;-$)CBv@5'byŊGuNm$"<(S ΉĹ9đb8ۙkqP8)69M$$Hi." " " "wZ<8;,Z ռ;V,dQpS6>34n1c5fd~6† Q@E#],4u,&=]`tr T.2 @IDAT6:S+\5Cbz8>4bx ?]X67#>;M6qg' +Guiw&6)ָq㝓1΄XWICDrAzӀHf͚e˖vpe000yvԳO2)&F7TMaYrldy&̯q*K0c  "@QZ$TkL!pmAO#c94nQ/ Fk܉`s z3x*,GKsHoQ0l9SN:t6 VqT2ԊP+~vSD@D@3442m⋏lU6\o1N0G["``}uZj^(&" " " " " " " " " " " " " " " !e'3-deY;We Dҥ}@FZFWc2Xf?MF) <@P,B3Na\\: ):Ɖrڵ02RL{Ӛ4qin\r۶md+p4 "/f͚5 6y}ڢE {[K%$Kf{MioZ#N[;?&R34`Pe M {_qJ2 g#m~ibD#K 2Fb,F7 ".EIcUN̿xWk\yU9#wg}ξ a;&͔h6LN޾ D@2&X3pΉfze9XVgٳf͚k`4 :ɻsx#UGVH@wРAV~,>)@P+~2Ԋ'` Q3a !T> `:?q@$ WH1mۀaĈ[9DSagas eka: /n'!RsN9VZVH"SZKD h*)J& JsX6~MPf/Zh&еB`_o!k3sLkwߡD؃(ɦ>'?hpBk E- `C޴-gL?ټ`Xdmٲ5Ң1$EhC3yaٲe`xb=8J(P ^^4_@# sL*}}͛7c6-Ҭ ir :u2e:zәO/5-h|k4+ѵ/qVC-O)I ~+i|JS"i]3X]PDlUYaٍ&qE0oC佃&*)N4po8v0A~j%N3nҬӦĉMY3s y3fMr(ꨙDt5yW%uf+y;K1.0dwޱҥK! ˲;z7^5o.>X E9v։RJ.iӦ^uH4@&W_}5^|E뮳E4l7&MdM_aw|(]iHa 7`-|7}gS{׎vTngVbHjŏ^ZӞ" " "L[ N>!ll͚5b qX ;8t,J@Q9VNd^D@D@D@D@D@D@D@D@D@D@D@D@D@D@D h(ܥ `ea->R?:>ss Ō7B0|%{^6((drbQ2*U E8Z"E@r"@)ݧ~\M 8It!'Z/" " " &@QMcz̐8_:/lz(μ,N""4J˞M%'lѺuk.]:+]РZL:0*Ɖ@ݻ[cdCwg&*>(TԈfc4>Pd744ٳgO0nVe˖M<7OlK-V,$o> I @Co(ҖɁm)' *T;f*>[mڵXh,X`Mkk} 'X { ʽw 4{&u326Gu7AÊǝ׼eybקscY>dQ0fL/7BmCM}Q44`OAr#0x0Luˈ-7XQFmVRk㏶ .}9i4:Ըqck:=0"x4 ~{g,h~-Z0-ѬY3,Y2Y;)`lvT裏dK1b^x Ž;sqgfM=~rƍ[qE _W]gFRE@Z񓖡V촧d<Ν[a: .gءcIGq<XQJs ,}\2J._]D@D@D@D@D@D@D@D@D@D@D@D@D@D@D 5꧒Q> 3 FT55QFf`cEK)B"u\Fq Sz@EF{xm'" "wԷ~k͵h֬YFt'ФI+w@p P0hs`t \ )lOZkJwrNqGTX˗\rի쓱⋼'Q_ގeT~ȠV|B૯26m/^lEiշo_+ixhѤIu>رD}`fa4NBJkpGQ]4L`ܸabP5J2/lET2+ؼyͧ9c=֚je]h<#Dd1ȩZj{k/k"5pNv 4v8?8T1JwۮK_\rgm͢iǾ 9cQ?B~0>_\Z4Ӣ)dS/6†浲KA"y С੧iiSMgXeMϳg϶ӪUlc9w5a^F3_H!,YomC"MhKv!Ui~ }5~˭q g~57tƎ͛cָ̏ζ:~sαFkp8m۶TwR/L/Kl$ C g=E@D@D 1S@1SO ]* +WT)yɢC[(Rxw_ P+w@/3 ={ ڄ5F]F?q͔j5j)W]Ae˖aѢEvJƑ-jdn0( " ~#|{&[|gխ[^ 9TXoW|D@D@D@D@r `xaP`ذ6Jj'Lފv~:ڶmb)DS%Ɵ{9+I)=\q(UTϜCӄbi*9VAH`ӦM:uM .4.Ew^a^Ǐ.oޚ'+P'P`0`1իWOiL vHz[#.L?kEdֿkh|-[nmMOO>dkl:94UMViJQdh\l@__,H9iz1rط"l 3m+"?,R\+\~ (z +)W^#jJ,شiSW&P/z ̛y'@3.Q gu5 NGO`jfMrL-K[9]4l֬aMƍ{g2]Mp~m`e_O [;v躤xC ƫ>H?|=SNI>clgoc-[vm'>1vΝ;O*6(Z~iUVe?;)" " M'42u67="˗/o+*90\!:^gtk= ~HR+ |vC *0kVR9'exHa: Pqq8O֨Qp3EYjժ d5"D@G8kT\iUjU;8۴i8 ;E@D@D@D8~qL2jz"LA'|w}7>S<3ѵkW+rX"yǬTh ]vrNZ s%J렰dЮ#Ixt "@f3_m("G ?#F[}?40f9D'>4裏5\00@n{/k3gϹ2Pkq_hDP8 NƧ,^xP]Am< }Y0-x8ѡCk7v_7 gľ M4Aҥ ]D@D?h;~ 4Qa w@$m{PtxCbvs$<ŇVb#ͤ(O3l2ɤ*۞ؿ,_e |/ĆcXM!РШ`Cо}{#ʺaR >< ެT.',ctIִ& A_B`˖-v̙3kӠvN; =zߒXmO:si-܂CbMeK.#}mShѢz)HMn |؞þsN>yXm}EvѼc-2 ⿻2Ԋ%>;@1:27mڄ:lS he$`"n`8ݒF@ZIC$'~^ j%K#>}ŏ?0bixyG5*njsSm  O2B, 4hd~;u4+S Ȫjժ[g]~=@h|& \|րG3'h{=CGCT66Ժu5jr_( o>(S-V^mt[ھ0L4cMf '0vXy{7駟 4Yc*$ʹ؞M7)g|#oaK`#o" 2Ԋrw՞" " " J 0^vB7'@uE,–eˆ?iL}zY0A2*ŷ'>f߾_ ed\71]vJ'Md ;_#PPAǟ/Z}C4ګW/+4c#(_7wVD k/`th:駟Z\ n}QϔCZN3gM]vVb(i$@Iqz'5VFS[:beTw3@ϝg4i֬1Lʕ+qeL+wtUr$< Uq|b*UE P 8v'``<3i0BAXQۈmԓsQ:w1o 5dJ9hpƌ2СCx*c6CQ83Q!jX!"Qw_+swXqi_yxФI+GA +?Fg  b4=KM.bA#+V,йDW&XߴdkR(6R̗PÈ#dm[vQ6m"6jɓs5jdkW=1Mh/âEw-@&WNj)W^mU'NLڥums"W~E6_~iGlM5'9^4vWHRJLs3Mz!K7bԨQ7MV=\YƊ:=mڴA…}{EID@RKfr &Luց:;vcwq`y#Hf y6.ipg3 4nuE P~}p#}hXLs; ڳ>pqyevh1i$ر#mz 8]W@C 6`˖-Vj).aEM$\-Zmhl_={N}8뮻l;;V1h; ,#) ;}ݶ1ձQ,  ө>Ǿ|gnOtP:ήs$ AQ "00 {^3Qkr$@au'ʖifKm#" " " " " " " " " " " " " " " " 9`_xFh>m?|*Usph¼y02|Q+NTR+QfΜ~VcD@D@r&PR%\|x7q(P֮]Z/" " " " "`pL0) |_|:''>h[^8/ڏ=X|Ai |5bqX(ͿD@BjԨa5^uk4GQe˖ :)ɸ| t钶"*4y|w5{{S g%Rum#CHTmA4  cZjA(%@-! R\n-O}sM8}AŊYE'|sí+˗%\bt|ݢFCmR>,>#kvlQ\EX9q6~zӯw5ǠyiڵzHmfƗ'hH?1x#l8m}QG=2; SD 6rM?FѢE֮]Nsaر2eO"F7l `iqRKW3ѷo_7nLyyʽdr:$R #͋:vz0FZ .Đ!ClȞGOvkݺh! N (Sמ" " " " " " " " " " " " " " " " "@]#СCr_"T9s{?u,%㎔"'x ih)?>?~wp \2&MC"c_:pSHWtDpè ݻ㪫k@zjPԕiM6ԢE kz Fnul#Kwq^BO>aSuZ NI4M }gY>l0z*>Px/U@q76oܶ$3v<ji`֙ES23c +Lu[K*pίsՆW\ә+nyNc-iNC `{ӱQ߱c{j*ǁ"~ NK|o$}=D?$m%OQ#[lz3</ׯ;~i͚5m}W_}h v|Кn0 ͚56:,L>}`Չd|X'ѪU+[6cސuv5#{=K$3͠ IJef)IFgj%;ybuqm]w+MqFr废~L.>@իǔόԟ9:䒍~XS-WЬ(|1"yXo޼_|1.t-ͳw*Dn9眃'x"GӦM1pƞsһ{|ISaO孯=wߊ)D7(kہ<l6xw)vCr' CW*l[Xiw"4@+E)矻U￶c7;r9сd?lٴ 8[D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D { 8x9ssx5ओ`E<-[%;lܸo^}Ք @_ѷo_P2Wҧdɓ'ӦM8p /D&aS]CaKi4[j9cSTiRc7q_~?LitPd\M5hڵ)t " " " "8[ˆzmb2W׮]AwERSh7ߤTb*t>裔Aދ[nSNEXرc͸63͇aÆ hicƌA$!9sXQ"PCKAd+gMOٳSxQOs|p%{ k^CqdlSH,S Zl KbЋ-%VG`A6K:4rȑVP;f t^tmgIv<}gsoAβn{LO֡CZΦq۶mCcO O2*TȦDK90^%iOC-QH2?]0J!Mg7!m-9\I} 9kIg>"EFYgeH p cXXBSσ~NK|o$>C4C&\=}>nS}/soi JQhΜ馛r/~^Y_d a=˵^O,@d ݖŋ[A \=G͚5 'xwcDu5s̄&lb_Dm6>I?嗸rJ.]?~]WX1/_hr=N=Qo(h+WlۊYNw4sGM; h1v4Y9m ͍ٮ4~|n/{P?su揽G(:[&y4w&jժh>8> 4b`{l^2hZpa˅kcutg<сq?mo>~pUW {ϼuiܹws-wu<В|$RqrD_W2;TIpϱ?H}x||{8X4r0 |WELD@D@D@B0r$XP\jbM{ P0r<?Jk|r ]@M(_R|(&n޼s9fZL Rwމ;gqnO~YT2datUx$rNQGny'xڇvXfwNX4KAdEbn;ػԩSQhQԨQc'&Mel#FQŋaB$(8Oj%3UXO?5)!må;ۭ̩.#8zKw>.lҦ믿ޚxyOۼ'4 ZHwZJ{#&ysymҽ.R_D)?N d~GWrcǎ;OMq\Ahڴ)-[滨Pw$-Sfr۶mXvvciڢE [ /l`~{=\Ǐkp8{Zq-{ (k˵w`{AET+b^^}C$dl;;ٙ3gdĖ9s&k"fkwߝ@=Yճ?:޽E|xMp֤C*j y 5!CUiquJiy]"؋mguqBN,ȑ#.Rl& J܌3wj+sr[M8Ɯz.Z`ΡEIJb3>4ځ|goz`L1;b oL=flM+V=Ӿh+$5!`!0~ȨQHcJ%0S;A-&h.T: ~PFOw'IbB뮻)K/tx_(sx$W_y;vT_}w>^wx{rk&..;c!t8C~ald7Nzm JɔqM6q_~u]5`bX(B[A&wv!`!`!`!`!`!`!`!`@5z.&U(Yye7[[F᠕ +孷ޒ=zH~TKU I~ZD Z5?yR>]f DP֩9 IfaѣegL8#ۇ|s4N XCJB{lnO;4W6"@ q,Qk6=;;bחzX ￿YhpJm3>qgϝ 7@ȿk_tk 7n+k)>[z(VBnO_UⱐEzt%1\%QL$T_o?s3B0rg%poQ?-rCrͧ,[ޛ<CP=l0 C0 C2t)ER0MXUbZ| |r%1bI!9~a7z뭝̀N8aq cT:r H4f<-d:ƱbTALd_Huىwa6 lz *] $w>|,} 8)G߾}kR 03f[w6iM9政5mBUVrGy]І!|C./li'ز ]tE6>BҚ㿲k #D\r[]u]VY$km=?v<f~sw'JN若#`Os5U1AJгsE9;D СCɥv~Ϩ\K\ߖp1H*HE i;&Rj QÆ2>GqÂ9tMiAg}|sn U/>nOdP;^~ecc毛1zZy݄1sp9їG1&㫛nɍjC80?$$NhYK(U OKA~Re O-?|dF{ShK믿v~q ||Ma)$XP(c?~Uo2lex^L"&7'VP"{3ϸ?,<;3kVW\Oj]O ?Rxep?1sUAm<ZEOo뼿Qsy6łu! >@{3Tl |7Dy>Ⱦ^Yۖi0:tk'w^7Fa,Bq+[j~g6rb [gK/waNC纘 `Ԟ'I>!cre>C=;6I,%=#c ׈F2ߎ 5 Br(  y|xZn&#_Xx"ӗkF#܌m>]I;kT!S6:@ٓv98[;~.vlʹo9XY sծsIm7qJ j{ 1 d-!`!tRuEV Ut!EQ޽qEhgvIA.f) ~%{qtdHpw'@IDAT]DDHI^"T8jpՉ'mDXW'HEo5M<%qW^:+R]N\?Ef4묳F:a %Zk\sLD+X/(Flڏ !n“!`w͠ C0 C0 C0 C0 C0 C0 C0 CJ;,2nʄ*8}wi9$.TQH3"%u>JO $%iH5E37ћo?./]p˫>9_*J}~g.tStJ *i?Ə-F($.Ruq^PF =,uS/-%xL'0`SFJ䪝gBwA W_}uʦ#]BH3#%\d0RBHrs~_ .%cgr G^-rG]]>\G.HH!CDx=Eq.m z:B=JU:°/T˝_}RPHɐy\'%O =%JEHuxTBŰ1RcwopmU><]lO-%mӸ~dr-=RKetV,C0 C0رe;WV.Y7ȠfDY>hWqՁx$2 ]!6)"nv.O?ԝc,%qnv&t'|%A+TE>o}B>Wg%ʕ2ɾ@Ĥqqt27FW"u˔`wGCW6,wѭOY Zj<+ uJ^ 8<< +!/J-Ϩ?ގ䊹li<׬1V"xggv"?&~5ǹ~L ׯh8EOTؽf9(~fH޳j{۹cϝ΍ǩ7xõ!JZVJԒ+;m)4; &!eTQCZBBp}PA WIy>(psӇQK]Z㽤c9;+_S[A'W/:GSGVdZ8R/橹~Y:"麤YYjv2?vbyσ:mWa'AIDZ?Ҋ? 4  R$͋'(U OMBB,U& Ϸ-6_I{Ql-{>gp,nw)NV_E=x':,(U~~{>SEy#)ImUHo ׵ *6˟H+O7S6ӐL F* ?:bHg꫻30w*T.]8*Zp5jsB 801J+j0rH!GbY-({c=ڍ,b6 r\ke\'ه]4[N3 >4뮻.رctwG۞x≮N*|TɎg./.f)NTڞOV2v$}BdmY׮]/3-Ά=UCsOיd=Rõ^@}ZuV8Z$R}F5f><~-e,Iy*p63IR}&~8)%K94A4!$T3.mE>ҙ@;"C X{n?j>P =&LpxP}^PkR8N?t/$j.IYu0I~f[>g2 VC0 C0 C0 C0 C0 C0 C0 Cp@@S>5GNە;8~Q an rO iT[@dBKyA$>b_mv"atvea_)"/|s _|E.xHx."P#._+r>?> >-? !a!I.AMq'{ j&"T-_O8O/($x_fud! ,ĊBicI!e '<-a饗vuۇB>qwׁ\r;/M%+!*kؙ{7gV6C0 C0@>Էd`#k{ )?'  I΍ 2` !&E[n_'ɾ2nCXjW4?/2/C#GuTy%`\B;N'乍ByxUZPb9q/c/6y{\-g5ÐCő>ZsnCIJBf^=[j[]& o4F*YO_^@ɬBBCZBo.]$!$hg%e;Kc;c=ܧ>r~~# #J%1WnHN!O0Mg~xN '.7|}.;+}4BƁ!!!q/;i^<-$wG!__R_(m|2fH}Clq~{8I .pr܆Yb%ܱ T,,7drq5pef4z&U&fDGw}Z*Ky (ǿ76|}DS%G!JYl;)G#DʰŲMe^<̩UD|Vl^qUVY%bJ`]cXƙ8=BX7/>0.SAR<օډJs_rKA-GD!믹{cO?Oٳgh+)ZZښCbBy睠ݲ 1數|kʛwy#o;/4. sq ɸ! M#+ۑHAjE.mIDScwNgSH۝vdg7ʵק=lMP7},!`@;GE]wMB @QR{s'0 k';C @=zu&lϝw)Æ 5{-(!l$j(r)фWc eT'\ru׹}_l&\~C/DdĈFR0`\U\̕zX .2aBmҶT C0 C0 C0 C0 C0 C0 C0 C0Z9,Q"\dEVZy[Og7t(ٞ(Qg.:?}G":th Ȝs) /p.%qV.]ԩ<ӢFryKۋ)CVN+"P0> ]$?,2d DXmxH7zs[n2 ZuUz"WTN W^y8{](Y DE羚TWII~]qһwoх۹Z>y]w9PxP'WɜݖtQ巒/moRG$\`}@)S~W.W]]JHǏbo[ XmCҺ~!Jn!e8!`!` [^&-熎sw_e]/(]ڤ܉}˜{;V0d`"?B ՎNjd?$BȸuJl|͓U%sIp]?p+ZϭfK(]SJxHc^NysN8^js-5*b6Ԛjhgg6ɞhgV޳gDs!vׁc`8k:oٸ(r6<Is>jZH#BR}8'1H#tcb理qI ik|I)eJBHHחT}Clq^=+eWI￾c.,%CImPWݫ6o 4<2}'vl1>`3";Jܖ;HL "n:nRs ?/4BbbѤgȏ,DYGBnD ɦ ݧr-IvgLJ}pڮ暹,9g5Q칎gUMMy+~kރ~Nڗ<?7nlZh!ygڵ#8bY?}?pCmq|VC[a12Q v ݅5Ӿ)m'JX_>IjCڎе-0S3uVZ 0i\-R4 C0 CiI--\dĪ 83E-?\F+/2;OyԆn(QehgdꫯvQxxb[m`4裏dM7 L`~mɗ*j;x2;EX%e!`!`!`!`!`!`!`!r9 Q_!xBdeEdZkXC1>0iDOi! 4qDG돳>[~4`m@k׮r2Vp8V_k` :* M:sذJS !:ez2Bqu_0>L3|wҳgO'P3DoerNaL8CQE`#HE*U/L}B[J޽=4+u cVzqRu8'?$$NhYm -t?JۚBwj1FAc<| վcCR#E1Ez*^*o}s&B~m"WMi;20 ry5p,ʻ;s/Wiŷi]{%-oޗ}Y(0 C0 B}^3kGB8Pcu1b0%ؤk9kqc-@P:AOk BZiR1_QU $vmZE ^ x?~۽{\?*UPWmʳ閲΂СCoS4喧Mj'ĖvQGfm&l{o9RkkPL& ] 34RkEӵlug=۵kW9b='xbul^-U-hDkRnĂ.(6Å1N8A W}^i;;Umve={yfQJ 6L dK.qkKmdZ87i!RKl,`9&Ri_/E80?$$N(Ṙ[RX=.)x{v[O;ŎY[/Gei /o@h/g.:b+RXƧøZJܖ;HL "0_.EK g}V=\{4j%>QrSNJB3]wkC67|Uv#VӸ)WN1''||?q>#kTJ,Uavdw뭷ŵz?iI9u Cw-% vR?\N:$A)mKbv<Pn{+?!:uoCa!PW^MP ‚!CH9PD,ׯ#$zw%>ܤmZ/^IzoCFa0 C0 C<;%+^Ҋ}' "#k81lA(&4wqn6۸7X'H:iAH+PʾO}r!82KHR&B>J#"gs5o~BVa 7tb^Zjn)[Q-QbNPU'|GsEw1[r.b喧DR A@PȳmCԚT @١C':Vbe65M޳ÛA?B嵬w}W.Q8T*?*ǮτdUWu6q.\?,?HZ6:N!2Q$[\N {WW_-ޛ1/;3P=tVꢷ#Y)Q,r, ur mokV~gi1c8;*?B<>j2>ѣGmfqCmj?w0\ ^xÕVYd%&'S2?óW8-Q%6 *sl؝Ө|=XJÃ>>ozoCۉdŧh#=0WYj=DžCA1`']k0 `NcW ~+ fAW!:^Fޯ{vDuׅ%w}UkSZe1YNmmڞbvZ#@Ml嗟~i`}4..T,i@uN!vÐ#t-'6V=V( jBǎ!`dwrdе n.q!@^ }&02Dx GB|X|`L`3wp ι % JA>?`0c=\g߽{wLj; swv ]4 GHiwTaÆ9,.R־s9I@PK,!`!`!`!`!`!`!`!`m8i5zMO@"*mL=*<ò.8©W_}&裫Yt'RXCzt E+ @>Q:A%p:9;j'E5zAmW-}sEg 3 !Ky"R ,t `Q-}p-Ȉ#䨣^zɉy睮g}&WVZ>BԍO%\" 4GwBg&;eQز.|A!`*>,oW-  zQ8U%^p>!(6v<_~]m|}!s=WC,uVj`!6){""lض a\8vu T;1!eAw߹-_Iqc9<*k"e'6Y^q9;k<Kba'Z#e ]wuY#׿#^b"܆ ӺdԨQȋrJ9#l<8M;r嗻gZ֓CG}Tˬ3-=;98V<""ԙSkTClćv}T:je%fZeUQdl@9?8@~3dU-Y?dNx!>i1o}?Fm0G?|BxaBw,6g篃ߒ_zoi4L2<y0%>|6#NJ%3c i~kfb-ܘ'B|`-u?c3&( B|\K !sYpW GP;ǙgywKmCƁ'UHRKi IS'5ҍߧicg kj7,U._[\к!xOϝ |eo-رcsDTKvQPW^W;#"U;W/1r(moSC{qOcX&/}}kƉI<^ۜtG" }{P㱐gs|?L|MQ]fƼq3LipBF?;y+ew9)/z'?6R2߉X(JC/9Xhxօ BI+)(}|Z Q/xJga\!lcσ>s1GMB1(1>pZ,0Y#f} _ Z7 l/~XpF.̍9e`΁oWNm*d]XljÃ-juC<߶5Ay߭$A-?`[:q${\9k9[䯍m Ă!`!`S^~׷(zp\rH;ґ"Ut3NxHů"pS҅HG /"npF:hOkR% u$ԀWH\: -P\NjD?K>+D:AHV\qHI"NJt`ΕQ )"uʝOGjse9rdG|G*";tMr)Q좋.꞉)2R¯H W.dTiBJɜszy`Z #]@ۢB~/DE#]_P%}I±Mavˋ2I'~Ӆq#])Kߏz)m~xS誫~z E֝_gq˗s3fS?%ԣhE}EEݺusiH WZ_%#sm~reU;K|%Lw 1٧fs'H+eR9p\ }׽KC0 C0 HQ%BXkƘ^{Y07.`tDxak/]ߥlRԟ5:tp q֐Ke#i Rx\ڌF?| ?J տn\s)y=οA #,tuBƁ!!!qS$0݁CmV&WJױؖBײTH+!j#ꕿ_k\?wQ:I3nk@MfrgxeW(0S,_n5jT0Ij8VAڜ~05+~>>Cms_bcK(?箵ZyCbH@ã*⫑O^H0k̿;Rj&`C0)+h)t=YHK1uy^yMB>~f\ q|nh3wGh^\?:}Lcaw߅'*\h_PߚCiσ*)ɧOBV--Ν;w"GEݘ7~~{'l++UM(U9c/qbs]l޻~_&& kx]eU"MLc<8k|M7ցv~x !eJG(eW|;H֗2znB^AVEG F|RTQI[TI[ j5}}tx C0 C=""';WQ9EiRE'D&KH'ڝדּ:ٱjhX`Q'o50CPqWܾb?PxEL*x<(59d5UQ"OKm+AࡇDYGDe+IΩvUK0 C0 C0 C0 C0 C0 C0 C0B8XSOJw9qZKdyD ).n%ΐ^zItaD@E<)OKZ8_&i^Sgh޽E}D-B E2h Q&Q_ UWUd}o?_ErfyRLeY 'r'&]`mb%&r?DWBWO8q(CVI %%u>>4Q,mGj˄߮u]'0*щ((B.\+G^IJ'x`VEtѼ( 8Pzf!`!`]&ݻ\{mN\ E6D ]?*)ؤKvO;1Om)Bȸ+ 0?~o3\ޡdrv^|_nvQA旟O>)*FtMRQ2§ܦ5Ok)s-S}D_/6 D-sKm} RyPy=g}k>;0GOr衇ʔSNY,"SroZu`_y_>xVEl~*^UPN:$߭tJ~!C;oOR!vjmߔ}Z]! Q9i+pklt- in;T,KD}TtmQ:4Al\+!`!Pwt͎BD ٯ⊢2xyLJ7NtEE^84-z -C0 C0 C0 C0 C0 C0 C0 C(,iV2\pXp',09чo}E:j'=;K݂A 'EX z.^LFMOdY8E VG7,致h6rn_ (6lXŋ^]x}7D.}`ǂ!`!`@uv#g2(UtR]E#%v lOo)X2vByq-iQAn{wsqrhkL5Kd}q9;wnsyyyc?(s,D`=pdY7+rZ6 @0x+չr:i%i,kH=#޳BjO_0׈j YV%K;h~O9Ed=ϱ!Zw3h!}AHF,Qջ-.YV#Ūؒ?yq=f! Lpmq%bAVm!}ڶd\B#zzPR8%^w;wQϺs_ݚVu[o/E.:|q"a?:}<0B 3? vcxT';;:#B|M^e„ I~H>mjar) )Bzl'X _^O+$.0vO5k׮A8;R\ؤ:>Yd<6=fEDH>LiWZ sO}ݓiԎzKN=To'6FlxmVΟ_~f6Xk.C ni2ύ0!"qJ{q^VlFrk,)9l"' riTg_;ԪIWi!`Mȑ"ʅ  L,FGb>h{+F] 2AIPط!`!`!`!`!`!`!`!`,iq!OVl]dg)޽{.3d[aNJ+(s5WUu~MD9:MPbNy#;L^GL3ɳP~WwD a)Zb@v袋;O7t%g`ԣR,]HX؉h"~C=DX]iht*-wOd`䩧XTgjއo!`@PG}5@IDATLTu];BBg4#x-aV%lTBǟ{1q)M'A^{AMB2~ 믮G?3f[KTЈ2*O}]1 Awk-ᄏ#RZ?Sn7Gy//[nZ;jےr. vPBJccǎ;6 6N8qJΧ24LV O;F#v3B3ѣEȪբCί ;0- #P.(rHqR@a~ }GV[mLՑ0~+k㑬kSH8%\9Q ,)SVCcj,{NMa<Bv?l馮/K64;c=Bp[WUrEMLˍ,Bo{o+ m[Չ(,'g}Anz' Euԩ<ӂa-֬Z0Z)Ը1ɺѪ5z!`@A]T/:qQpѝk3p`<t̮Ǔ>ۖL({d 3r!!`!`!`!`!`!`!`@;A bZk|KDJrV nUUOJVDҪJN. Oah]eϢuYcB(,!`,>~G! yFw_#.JC.*({dܸq2s;ˆmVؾR 5(1DTk!>n4PZj*B72,N bZoUYB>oWqW_ՕPE+2秅xEav('ÈID P}dI|;'n/ӟ_k_r";oC+ cٷz#xgTP+]w c#Htwܱ#G~u#TÆ mƵ oƸ{wP;!wUW.{r _dE}ADrkp=;S3K˫t8}UQmy-#`ZXYLC0 Ce0a:!eيPz ]G#{^Ru]~v!`!`!`!`!`!`!`!`#p1"&k)dϫWL^W"FB NuIP Y F'Nt$ P[V_}u%ZTE !Pw ; EcǎuDS?}( &Kֶ!`!`ԂnU K/u{]vqdFY"6S8n2 .S1^:dr"^noVtp#Ic!kvꡇ?ks#R7}e[ouzYb[RF޳=#[YwyO ў={1O~{N[EBhVA-ǘ1c@]w/gAܹة}mkޡw 1e|?bu6V!x OǯiE DXכfi j CEh1B%gyƑC#0p8mk|o֭[%Igf9lQ1AQO:3|M Af%QOzB\ a(ľL(5Hd.|ȬvH~uɲ|7N$ꫯvm.6~ZY> -PCͮCsj O;ҴC C0 C0 C0 C0 C0 C0 C0 C 9iQ ].#2dHX,Vi@O? k++Hm;uTqv!`!`@ys'@(0ۨؐtMJypw6̈uQ,ߚ!o y_0蠃rb5˴ C3{ 7LK= [E? @ !0~xksJ߾}CqrTͷUq eҥK3Uڎ{eɸqd7#ur qz(f§5(H^ÊSyY" h0W^y|嗲:[oe;vlY Z#\-yWEŽE>ѣG;d!°|VXaMg@O >\6 K/I6ՊB431Ȏ;g`Z@ =)‰'1?=t*g#.z:"J@_Wh[mU8v0[izIv^J2".*5FHͭz1&5+:th}@"?:ʽ+F>L+Bݼ\3T~INGGq/6CٛꪫSNq_Yӈ#ܜ)|fE BMo{9p<䓔^fi'->I!P{LPrMPrLC0 CiXb QgJPLp(=m8=,Jﴐt C0 C0 C0 C0 C0 C0 C0 CG%J8I*$Q$Fd@r|RKȲ˖sŭ^'pY LnY`TS7->E< ClʂT ->朗#;ݻwV[MV]uU֭[ !`!` Jr,rWT3#SO!}Д fD?#ȃh^rc(ȨeYJ2N/wغ 3sC8q 6̉(@;sʮ>n0azڢM6DnfLVv>{u]24(N:8@\p"\ҵV׬d'*)"=z9dRDAD0k)# l۶+Rxy'ǀO,Ҟ7#b72_s=eюy7]-0Cl]gf/wMCw<.B:.cW M{A;{G~7'(n}v̪svڟBWhK>xhy8~pXl{rm|N R2rH7bK5|kr)_P+!`D񣧟~'S0`>}oԶ .@9'G dvǻ0,׷o_V^zex-Q7|S n#Yg\x8Y02 jU~LPrLC0 C)yQ%dl]y妬Bһd[n9)[oM/MK:?;0 C0 C0 C0 C0 C0 C0 C0J#p"g)rբjJmя>]o~Yi_E%=t.3;2fqD-O- i|Xb %G\Lfat a!Pڨ5^sZcǎ>p#XfV[]Lv!`!)]ɌEXΙ*ZمoQFD7pCG[lDz#'cdm ފzBpj˂!eMgQ6|sADb0r[) p5\=TSFm$[llT_K [#7Zk'7"\$goD & "~(2-+G|9"g--~7G3i3c!t@q!@D=`@d> z7fr$^|Ŝo `GW_F4,ǡ="j}^+!` t ޯ_|ȾYdۀ_ c!Xz7$V_sJN(w86VˤUخ+b&K~2qĜtn*v8h,:񂶓w6vRj裏ʃ>ƨoAd P~؉e梴@Aӗ/_|}ked͘mܼ.v:묙,k3 qO?]8 gI?CpA">+5!CrPʆN0 C05JtⴹL7ր":gҴC C0 C0 C0 C0 C0 C0 C0 C8.B_>x,'Kks eT#X6PU `".#b)B<ս{wbEUA ◎;/! ax7]ok{XɢK.2 C0 CH%CY`tndj_);ąl!@_vVr_VP @>g}7l3G=^HyF~iy,gB {Ν;7jYֆO?$?w}{fM6=L34޽g$hxI۠ɻvı?ml,#ccU8\S0{R V+ jQC\"{}DL Q5F]Pe߆@ p*|>Tu™f#B9iԵi *_C O/-k50hZ_Kh] 5cDrKk@H&9i,MLP+Kȳ3O48El_ȏ3 x#|"}eVUTl9y MȈMY+e9Em"krիB2wc-E#gsfb;(x]~s.2NtWww,F HNBH<@mȐ!N [bJU^(uO;sIs=K(<< Sz)[z@eVeq jUi!`4tG__cM[`Jҝx$$QRAjгs C0 C0 C0 C0 C0 C0 C0 C6 1/+;!!;,?NZ$ dDP#?cyW2_uAF Zh!teMK=d {;)z-;ޖx>:©f@4 C0 Ch"FXMT2C=ADY!UUԩ̔-!P&L'|ґ!(DZ@ƾFqUyflBV bVYe}[V !Q"o!3hH{+vaiԨQJ(;‰}7NaDxvڵBs&?T\opAاOc9ҪG$m:.Jb+ #y3yidz#!\UN q?>+!Gw%W\ё6=V5+o;D/ĞM` *#8t9F9| !Qi+\"0SVO> ~ 5߀_mS42#~_ ^@ fӖ6/eWWƴ tqi jj}JشǏ/W^ylfɨvmU@NțM5+%o[hN-εҜoR찃 'b<ﯿ0K|dW!P[`7n\N4(v &.Yve 09Ý0)mGf)DꫯvZsO} :u*/f.%hKcm٦ϱ^x]w=W'f%0"^Y9;&U`Zcgg!`M;Boi lC]/9xٸV C0 C0 C0 C0 C0 C0 C0 C8IT]'9j\d\Qf*%^{Z3ZİAd 2U,R֭#B\k^u3|-B\<-!U~gG -dRDS'@J dR?;vj\!`!`e ǡrqRGГ? <}VXAr?B7(+ 1$FLkQnVs_"hsPBX]YH(`TQKzb,n:k%Ys ~>-%E|굲DL.n+|py$,lzNCQ!g[D/H-E?_t.vy4Cʈ1˳0*B /RK< U2(?pj~mkܷ6Ψ5ŖØtA 1g> ~ Cf 򁜝6C/>,#Bj?/1MPvW8@ G3\ k2gqtIv:X6l5Ւ::f2Dd^S>l]&@.~祗^rsmq;wvsl=T=-RltE3Z  yf&G-K.a;cO>d;\rA9!xZ(W::x]v#8B{4o7~?C-Z"ʈ#dРAnt 6p-rm#f 츣p^ cE0Ԫ60Aʱ3 C0 C`E _:"`Cⷭѹ=.-JRt)G4R5!=m C0 Ch][{okw}YG I\O; | };d있~fIz cGHfgO4"=vZ'2˸g򿬊Qe2Po!>BDg!#Kڔ7yQB駏| ;v{^i3ge6B?MƹUc`^pD>sj\sثW/z@Ky4;EjtP^sE%iMPe1,q~3xYk|G޽?N#'De1foęOcn7! !"0A;ޯ}8m }޿!o@M(ͣe[Cq2~>K?+7NAP/ c!]^j>}wncVʭ*3ϔvءPU@?beX0TGE@Ddz| l /# ػQL8Qƍ>P#?A}KDJ%0ihvƐa&ag_-_.Ύi]}lrguoTnNZ766GyD.r뮻TsiC9眳*3-wT5qwN{]"Ẋҍ7؉gՠ&v9lvj \ ԪVٙ!`@S!D`."':8o7}aMp(K ~BjE"!`!`!`!`!`!`!`-M(r%"{\uVO0 U(]|$J@+Jj %2H $TxDyE,ڃ.d?Wj c7bY|X(IQ7dq<]x HwޜVǎ["!`!`@x u)IB>0 "/? y1<hW!C"B[޵Yh x0J;+MvKD( j3ɻB>ZѾd6}zbXs,AD.PtPLZ$i,ǎ>vb> /!ОC*:} f<S%pycbZ!Dsl?2|+pnܧ6ym|М Bܷ!߯q7|+4LI޷v8j>sgݻ:51L:>*Gͥ^\w7}'|RN^y啺2?HrK7g^ СCeт_ڮDưd9K劌)*Z?|V,#`ZXYLC0 CjDt7.p83lk`%0 C0 C0 C0 C0 C0 C0 C0Z]w$;,r"\5R~ %i,"&rY,) -o }< >XړPA:H,F؂!Њ ke/Xߞd 1-OHN;{֭[}F*Պw0 C0 t8`5EZ'^I5SwO"1O JRZHX`GvҚf [8H!߆x28\ad:q-b \[lT1@ŵ3˖]l\ǐRp= WA$M<ӽ{wСCH6>]w۬gn h1P)BC//<{C> `dĎIVH6v%ADm+>꫋dIEn}p6(Yg\|h5SZ0-CA[{@ fX|mZ}_,cd(|;\oFhe5dLn]^*>DI}_COwf--coq_q{(x6 ~ ֭[s}KTE{I 0<|!#[o?+|~GC=˝rb]CO'5r+vh[o5X믿VsmFkvɝ/q˵ ~F$ %n^zYdpY1u,j}.Pv  @R r7f%PY5L 1B@䁸3c1       D;N:nv!M.XCvjo?XEc)a'|wvX@L/첹 'Xl~G}nxbPvkr@M\0AcR-ZLj\nˬ@͚5-qƎ$L 6K:"/zˬ48lT\f)5p8#FKSC @pK!E_Fpp_W_hU`|s>u*r[>@L~?﵏c6tžjQ)gѣNsxAz뭗;T_+|B¡g5~x͝^ۆpB Ocƌ%r=zk̓|?O}2S풩( nVΞpRf 7^Tw~ucH@@@@@@@Hl~ҕWfS䪫d`!@~%t0L )[X.;`OLZ?1Z~ױwZ?x-ζ3`Zsc~X.m~101!\L ~|hwIA@@X*9SV]X"&||<9 Acfcq_)1Mcp}(r@;;8p,w@-wA=?(!s}T\nˬDk1ˬ| E_^ e5.l?cye6&Qr >;&9yVLN͆@^nEahմ8xyr,(ο..$WI|aL ^u;7ˢD}WNKJ/(fj>3=W5:Q`֬Yc.wN_n6m 5wj||͆mDg,^Ӎ} v튽x}yПux=#kNkmv|H[y^C:ކ{__/E; x/C{0Y ( W/7C!~ ~ikO!?)\!n#YLjPIrMi!]fu/ABƝ 9i07 7?>䓹>^k4hР>f0,lUN$iSVȇo$5\s6W|W%ylO븯$ŕu>1S]!T ޝs<.b?b/1-wM獼}>ƍ]} ڏQs3낇B&Kwޗ=7.$Tkt*۷KyKI^ ]_ 7c=uعsgmf`' :R +zr"^;l]~My;S4 ǂ>1b ؏|,[1~q@"; 1QEp|9^W%ߪM/N*uLsSr[/j\nc@$꾗ߴVyVLTe]Šxvi~C\f 2N~37j![.hLYǜ BLL][TjL徃szY0@e^6c"e˫}exg͊M{ĮbJ ^}/NjbR~ OS_!)4ztjUzuq()~9]eA{}\ׇ>vk_K[.[EZV6|}.;y_/ۗ]5Zo*mms?xm~'~O@>vv@ۘ`:  -ed}8eI2?[~^x}T{ݸr{*P #WWwO{<^up|]UqB6om?۬M߾q]ny ޥ_V_=$J<|뭷±hs=^V]u\b6`y7rA띸 ^}(dW /S Yj DcGNh19Rg}d'[j3T8(&rmyxl㪊_[q8;8?q**/X)-j;|L?vcʺx sE85<[YCz~uy-C!1҄po߯:I|dy~P{.9|N)d^fe|}ǽ^[|?>o˝C^/tWSNON 8ay\7a>7ba:|AC>5i_v'1H޽{s24$\soOs4 OB1$ Xc iT*J¡bSOm2 C!       Pٌ\rVJQg2[C!4fLf}t% IJ 3T2~88?Xw|7>\Y?>8G_]Pb0*/r@H_À~~Uu񃟮oW-:C-`_1pXe}CF@@JY &=CtilǦSC ra~~|l[]]XS>n]<Ǘ>ܯ1bcb1h>&FםmžjDE[~u Pl嶲~qyMX]cupa'huˬ?_N_W\fݎ/~烪+ns,q94: R UQc}h=$Z߱7XbsLR_}ԁμml{tqz`mb\&r~/.Uݭ|V\&CeVlz^.=8ˡ}_)58p[)lb}kֳk9sΑFrBJvΏpq;ߏO nqέxy=_}?^W۞^mH&m_ގo⵴:?X%&h6AO\7~|u@^'ٳ6tSHh:b-iz){/>suCmS^y}V {=b}zzU} 5.mn߻2;!nb24kk@C L,9X55g\$jMۧ~Z4q\`|u):qucJo Jp>\klI)Txii=2)@Y!?#r%Ί-䟻%_Ow?vx+sk{<*N8 ;OqUx~}&qK$v?Qx|NOJ$!N;I$y@ML6h\@IDATX^\\yuzEDy OG켌xY=59/.]:'t2C)畓jM + ^?B}PD@,+H^RG.b}@A@@@@@@@Ȧ@(;y7-Ijod٨J Qgj@C <%>\U~@/vfe?Wu~!h?4R!m?sfpa]1"s:H=|žqOkyx'FX4X'Bb".'h/}P/I*_>o v ϚD&J?v6څNV|*+ 4nթ9 D`H6٤&;_HD @@@@@@@@³i's)ʫ[z v-[ubmZkIwAB,?~?<^LBLԤ zk?  )0cB@乸(V3sbKyDq$˸qҺfFB\~rN$~(>EjIOZ &Y|ū@魿Ufi}|_3.ͫ 0!ϩJ#Gn͠E恿]߾}}wd32ƞn;?Dy0d$wb1wz8poZZNzDgo0ʨQ8b#g96"PǸS*^;uL *BN\!V@vm 饗"L$5nZ{'ĉIb]:ipep5`̥*{e:tJfN:lx܊oYfs6G84O-@l?j \P']|b@)8VHNA@@@@@@@Ƞ+wT :ԩrepfds<⋧ԫ`Bv[]kv xuK޽Zo,]{IPA/NC]j'pС2&VqIUR3H>*xb[֤I*p߿.iTk\-ի }!x2d}]nj۶fvIGQ@ ھ oD$ Vh1dL`tiX˨~Vbdi2j4ME|MC\?.u(xRQGIoUi @HFFZ Ysgi$ÂW        @V' tE yRPkV t'e  lUwg   VO 1(U GzLLkM5pܿ&i 5m4r~KK]HԴt9қoJ}$Ҟ{Jۗ1MG~*wNw"N9S"^j9 j sg)u$ZM;j]~_5FR&Ьt_HQ,@B"39H_JmڤzT,8wI&>X:鮻[o]Rk1A'@B3j@uV! aߧ @) A8_ș=ZE[@@@@@@@@xUi$ǡV;PAB!JvU=: ZI2Ƞ$x4kV@@@(s?;$s)A&1"UILTJ"PJ?@V'G.Hk--xwsqO?xwVZ 6(ﶛԶtŞzI`Qjέ.&V]{{N:)[^zi98ٓZ̺6!^!mݦi!3ۆ@wjM6 Okߐqt!od )RIv VzhsE+ɿXJS];wߕƎ__Zn9SO?-v*@ >ŽY)uDP&J|@ <4uC@@ 8A7_Q+! $ֺʿǻYC:li \SVlNCmrK$ ҆JcHf?D]:'0x+ҨQR˖WLoon]oP>z9YgIk%왽_|:CrI(R@fʹeر:t;|922F {Cg?WȻ_`SO }gAZi  0c"i uJ_ZU>$0OЫ${o+Z;,=s@ |śSB P@FWl*0a "ʕi 2zF        @"'5i"9NQSreT]kVj%S]Q*.ЦM%S@@@ [ߪULm[@B:h)*oZ%モ 6T:,՜B`,iXDRNJ+I'\ޒ.LqGi Q Ɖu2$#GJZ1w3_xwj޸8jذa2 !hJ@Νu'p#i-r^zi:/u\| +pRR酝cG 1VӦiuB'*-w]Ե4iR]f8Ȣ@gK,xcrܶ6B/*dO Z^1T.@B]x@L 8neTJ[,y:*M@@@@@@@@ 5!֎^zImTA+Z/ޠdd5e$Q@BnwPyBQ'Ǟ=K 7YʫSoI5H:sBW_MgݨV`KOpR\K-pEzN#.w GtHU:   %'ЦMPƴi%4       EI!V[dPO$Ey >XzL @6HrP3  @ 8܂ airIxt%K'TM%,dI>In*MC:vVYE: ^}4eKҙgJn*5m70/@ u?,gRW*+4sf $jh Y#$I˱ǖFN~]wU>`IϻB5yٳg:\|IGS[lvi}pЬY U Ƌ;%+|̿O?INN@A] Z(wP+5D x]peϽ]|4qԭҿpNpf @ jܧݥ(@BR @nMZ}i˞,"Pg.MB@@@@@@@!& (&UjUISV]UY5a P"z4cF4f   P(\Mtk9'IXo%`Iᅲ_ai3*] >Kec8+EO$'gv}-Cb|Ug}$ =2_'PpuEIU2 ޻4$jv ʾ!cѰFj=[otLM4)['p{\Ҳmjǰyu/hZ2YG ,6L:tiܸi7-EZ@D H_C׮/HoRC( J% ~Zr\2 _!@BҘ@|﮻@Z%7Wi       pJIЎRhSum Vu:̿;,4;^{%"o4C+@@(crh)m,en-I`cSk &SOMӼ4Պ4ĉiI+-t/H$`YgIm$;oCNq!@1{N~{i-#0 7g'Ԛ(cŠ429v9(i2ݔ9*$Pջw\39]`VG>)S.oasAӖK}"  M{! UU>DdHU2 @=~19R0x:uJٽN'@ sݻKN>Y~iU6K15 #WH 2SKdp@&Co$V iH#VCz2.@@@@@@@@>8 q;ϜOm_06C](GVRÇci3   \6a{t=R>)RHoJCJNRiuh'?^:0i夵֒*I5vh {Cx3S .QK.۴ic֦nvL֭6,CN BN!  G$wO(2oz7]rK.I'e]V뭷>l :]F1_ҮJN4DAHUs!@MZS{5n=:WMoKI,2҉'J~޺S3@ $Jܡn^Z7c@R-p풳RpBp@@@@@@@@ E7$]tR)X2uj2bjx.]sMS';E>FK?  dA A5BM#sz$sIl#9y8pK&L? } ߠ[zO$'KN@ ?,m}Pk$NU:̘Vmu=[(cu+aN2C,f7 oyYgmzf)X0﯑#GjڴifcذaZeUqH|$6+>#-G-Qɓ!CQ6 m^J矹ZMロZQH@&ɽcH| 9uI;J{+_| P3{85.B p;" Pcܾi]j<_D m*8ɪSi@@@@@@@@${O:`A8J]rhm:د_&V &֒_? zQ@@\nv|LH/m4ujvBͳ/0v4ntt L}wiŤwv2!_+H.|(nzn-ہduҙ7in=Hj98Yҡ6~] Y͛Dw@գG}G7_Hiʔ)?!6V)D?c\@oauY$9⭷q$ @FPYTj"TևnQ; 5Xzi]%|]ht᭩#Cfo֗<Z @y /͘\|Jڇ       dCB!sQ熨-qh"4iRcLi"@F՜"  P~>Oߌ/w"=WoLݩmׯ' &T+Iծ]ҟ6- 'RnT˖M4t?*@:K{o#o6vcᅳ݆A9*~=UBi}DůAqزeKZdErh3`"$ 6,Iv &nݺieK5.@aI˵/#)' ) @ *P\f6D5]Ǚ~ Oy-'0@z CJH`y%_ @ip+qiGZ @N`(ihV@@@@@@@@?W_nUj޼SĄZZkL 1t?@.h!]wݟ?@@H5?M O9ō6&Nlq3&j"pMI3ΨɷNc 8'A, >K>;`iƌuW謐mu֍]mgo 8dKDzMT|k3=)Lqo*SҐ!C6q~ߖOS__{ypl`(-メQ+ 'H.+m4it'H<" ,y]Gu wB dN;j=(${Y|w )䴡AE@$?_O)ÍC۷o|PhkN;4MlԙZ"P[jV#@ xט׳1w}/Ge-{}9.+1(?IrO@b x_f:^Z7f  EP8oT PmJ?(͜Y-}        @z.ILңGUzkZ}ԺuaXk.Z*v͇ P6Ҹqk@@@Ȋp2g]ZH>i)Z`$!'zJ./!m*KK,1}ݹd\r晇2-p5HW]̯m#uו&Yi_sxplIM)eG:_zI:Թ!k)D5B>7ND4$oչsgZ^y2oSO=-2\렃 Ifl( 'nE6JMZ6GiUu+p;&|O)"@i J~*qk\k$^oi :@jjUm'dQ8ר3 P(yK$r@@@@@@@@pP%߿ᇰʱ8x]VtE۷3]6 NMo. Q+@@H8J]`9(;AK}~7vN=䷶r]/{QG)$ g$)iI+9_H2D{챇6x9??HJTA_!9Hҝ~RnsU.H}C ).jrPiM}%ҤZ7ceѣu1zx(+N:I/rH4fng}V[mU.m=2P gOGL5@) P&mAX,ްmJ -/T K/'@@rp8?3GA[b3< /Ӿ>iҤ$hZcՁ);,4fK~*r5 :4d2e=9G zOoŊgK[o-yD7!ѪUVig̐Rx[*|>bYe˰5bĈaÆGZV fO*}E'( Fˈ@ c$ [j)ϲUgj5;>H!1tɵ[lZ#X`j;G p;sz! P p?NMn`| ĄZӦe T@@@@@@@ȬYH;$GfQM7NGЯ ɃE4C 8Pq6ҿSe@@DIU&3fN8AH#304WH=zH]6x[Bm ɰQwޑ9&9gU1:֙!K P4J={&Ayى7#첔_K[r 6jg^&]$Իwjxu#$CB1vJIk|!i$MzTK!\(ϛ7_qT@h(?o1@`K,pDz}鮻嗗8ud] >뭠 H%# aߋR.nUG .(5o.M^*        @x4ct 2̎ ouo.-4ztzDM@ ͚)UF֓!  PKBrƎMq%͜Y>Hzž6r:H0~|0輶 I裏|Q  HUv~W_]ZkFd&?H /\1\&M@iӤnGRɹBٗ✧M s V[Z P&&I#[& mi@@@@@@@@(=wbM5qp[r;'MJrt mm00 "0  VZeX{mg%']~KtיڥW [nA{oYֳk GygcS }6.RQ1l O.w_|EB3f f͚%+Ű[5mڴʤXgULU1VOy \k1v,Hu6m²V_\ڵ%类 ٨Qi}>פs̕0(E V34 qҁJaI mmݦ6($QO?tHA֎ Lw 6!!sks9:rw=TshD"=4`4a"gT#@4Q8_JquP#@ _t/KI.t:뤪T@lp9%"@B4@|ƌ|[5)=@@@@@@@@" w}i)MP+=3G$wK^+0xpwVHo=  (3(S P-]!Bo鮻7/[^>@kzA%p ѣkTo^z=DAL}g裏駟^}:d'j":TL :n1ٔ -݂ .{,'њqD[jfX}J`/w'rr-wK.RK-eY&$X:\ &QbWw .HXc4dsZřENDm,pRXU( x8vXzaݽW؏a5gm/׸qt-裏Yo %PRji)$#vrhjh#OّP+;3ڱbNN})kHÇK~V즛Zy1頃[.)-E]4RJm- yv@}(|S͡XZ5        @3SO:tJb0|%єhD騞=;$VIP@zR*9p   @z을ZԤq`⡇V׿׍SUoV[MZ} ~9骫Q&p 4hPl:Yn{ IL{('jI:v쨍7Xڵ%[LaNQJɽէ8،34mڴ\"!dNTO~?&߲}]vp_~\y_7uF*J\VUHˁZKaJdY%̆\ y(EpB[%At'q.(lOJ ѲBc'jtI'e 3 4kL;C1cts8hrB-Zhvʽ|L4`N;7wOjs4l؜Y VVDbP 3N9S 9) @Z>8e]y4x4d>WN] Pj(( @JY  @5Nچ@eN5qbe        @C W:ǜS.-(S(CWz!v%H:}  pRg @7$}W:Ԭ6?K.}tcՠ`[Nb\V8Eɔ__]x z뭷nXh4 vK2ȝ9-Ro2U։ +ݭJVɴ` b\֬Yq8ǹbڹsg*nEکo_q% Uu됓Kl"u&m¼WHQmJïJ؁Rxj8+Sp0\Ǩ⊬ԸqĕWԪ=ܳq+T`kri\kېѺ}c=B뽵k6t)vQu 3i 6L Pnn '$| $\Y6MZ骫!:H'9_B Z_|RG jw@HرI-LipB 8F        V顇'30__)!q[Z@`n/v4j4`ܾ   P,'%5I@jlsVHT9ֿ͹ΰUl$@ReTn&N^}aKÆ Ӆ^6m4HK O}I޹D@@Q f*ǖfp喓vs`.Z;P/uEGΝfGyd.` 90K/ &ɳg9iV׮]uaK.ZeUԱcG9Q4|݆.o裏)k]z $zXO?}vc:k/SVPH _UX4U&>P3F!IP&ߨ>믫o߾zRK5j}xa8SNuOC7x>@xmV_wY-[,lE;:Ta}&'hQ1jX{6!@fG (|NdMۜ=*3޽J_pG  '3cRi@   dQj{,9Sg+Z_~)͞]11<        @U.}BpQ 8C"=䀥@&A nkm  hLbLi -'RogԶx!O.a®oL.fΔ?ޫϫ|PcǎհaԴia!0}\G7XZҺ뮫;.$JzGm\Y!3+o9|aw%D#V=f@mF.`qD7=:!&Azzaz-9R}@7@IDATSgu6dɵ>`r-3W1Y1DPAO)-0lZl)-Q[oU /vi'Lh4|pM2E~{H:BT~!Y Pb $ܟ.x`5攼 J~@XC|ysi)U@,.} 0nJoJH_|QQ3  РN( }.ug@2>7U4Ps)@@@@@@@@ "⹅iIW238%]!&I( @MJ!B0|   @1+ZŐfYXm5֭nݤGb+spjZqty I/axGo߾z;v 'wСCCg_璴 8P| ZJ]tѐ!C4~xOd뤏,( 6ݕ6~J?͚ 8)MsĈĚ5o@pS7⋹Z;SK[}|lSn+tRr~2!ZOA]ZP+{#@¥2]zg+\GKbeVȓo!@ ,2қo6x4w4;SE@^~\{ԻwFdZZ}T@@@@@@@R.0v4n\`Ӽ󦼲X~kĉ3*B=vޮ@J3rd@@EY3nI3Q2#/>=Di$%P##DK?!hQO>]zj.P^I~pjv-[G{'ds-'8:묳v۩u _ ƈ@F~6 N%Ϛ1c}\b7{1ߞɤ_}%-hokĈC~NmiGSwei;SN9%$O=BO=TZI$j .%xXb z駋T&@B>)OÐK4o^1@ $JIf>U} @Z _gW?\ZrIo#-@l k٪3EHU " jp߭M#Vg+ N@@@@@@@@Lc@lR5hv& j_7y8 5h&91@@_iSDٍ?A|2r%ֺoIaa^yErb'jֹ{y\zii>{'y-BfN83DCf'%fTvԻwo9w}Wo.K -P%ݺI_/}HI!/6TVk;"55>Ro-HJ/Q#@@M ĕ5m7Ɂ'NwB>J TuA[oPp1 {1yرc(@kر9¾/}ݵK#kVjk$Ԫ_vBy` P"^#lJ-G[7 ~S~1Fs&#/@BcjeoQch8_C$K:I; {/46cB(Nɹi| d\ZT@=8Z7iqemJ_|Q'        P'Ӛo>5Ja մvJ. F@N\m? Y; @!|=ئMgB\B E$@$@$@ʔ@͚V@ ٳlm @иIPI>KU(+xqoOH 4 <$$H1$]h"    `!Z ,Gvڍ@ԩ;k?~r" Yk|([h4zUKPbe lٲիWq(Vvڅyxra„ 8t|=J.ŋ':s&dΜ覄 C*\gɓ;vx`C&M̽[׮]MUVH #GٳE7̛7/^u8pM M%ާhܺ߶X; ėKIB jYV(0w2D$@$/ zq`2`n<{2Dz^HH;z\aw4 @3 @0;F @EH PP+HHHHHHHHHHHHHHH :ve[l5xܹ ؇@@61 @8H[Ͼ% z&28~ܷ6{' K= E6m58ڽСCqydۺ­ P!ٳKFPHEH \ ̙Æ 35$HEF/'NH4$hZ;*I‹Y{ !b=N{Rn܈O % !Sy#Fǎ9|UJ>2>,S ~@hHz  0#pt)РAu%8Žg$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@g@* hb&Xg+qm>[%N;vWHHHHB{gP8Cb_ظp(_X6-b&߭(@Dj"oMÇ~AEp<'KƲe,R& lٲaԨQغu+N>-A(KaΜ9)qC@vjE|y\YUP!:tH3TT`ӧOǥKо}{+d aG _|";|?Y*Y`A 4(Q0`Æ=c||5}\%U*DKHH PP+')oYkaI mSC>6*bϹsCϡM#5ڠuͬH (HlHH$TZ^d!p:Z /2J(u]`(P,YjY x%.nc8ds @޼7 A$ʖuA=:0Շȇz 6 B$@$@$@$@h8 jE·$bTfMQp}޶ ^(  W_}yAݣThc`I&z]6ɗFQCb'O_|\ d_2@߮];Q|^3tΙ0 /q/`"  "EQb"s -gҁg:t&N(\{l'lq4h . r%0lX=ӅkT$Z6?H4lH@C͙9ܾ};~WYD(HHHHH (d@l*,O̝ ̀mW^y[YJuK;\[{*3sL#"E 1Jر7nR8vb_?X`F? 2RiӦO?ٳgmEP)+UbӦM10a~[f9f'OGe,Y$F^oH"jV}~k9=zwQWA-RQ`6&u!6*V,Yl{-T | P 2usI>Kt_\v?o׮]_\r7o4jz/RlE@#}QV-(Q^xVҘ$ (^h r] >>}\3^ C:u%Zaplp $:ԊF1 Ȱ?cb A cF!cc@N@\ 4HHB j©:d#aOX1Mw ^,~[eԙL2򦻬NRA{.&               #ixhx뜟CA-?QM[BVC$ZҤՅɮ>IEw­4* ނR5V8}B3 *UCB|v qn+_zoz@}Y~WCF9Ǐ\s[hy"&:J*gϞaQ>1ˆOKzClf{c… ݻ7VZAqM41cĺ=R:u#S@%ʒ%)̜%TtSEƒs!Bkט͙3'ҦM#&l߭ '"ΝT+WXs>ge'yxRsғO>iK͚50fݭ[7޽;c!O@Eft +WNEI^<#]rz\. #s îb{D$@$53!s-c` hQGs!.^TEO8R8 ƿo?jݺ۹H x#0 @08sزZphc*U4yU֭[Gp˗/EYHHHHHHHHHHHHHHHР۶A PP+~V ȜrL$@$)ԩƎ}>}`ŊBT-Mva̘1#ҧO4$@$@$@$@$0 j6D69Dʗi>oG8e ?\9~2q?~d_xI!w8Fb tIM:SfqJ"7Gɒ%crΜ9FNZIʛ7/go5UZF2e{x^{UP+}zQGS<`ŒUإ"^r @SO9D}-TuO.4iRJ6mXkS4i={v[AW]sU`8v=.]GѣG[oaL[g/f ;1)S/ƍeqۢ皜qL؞eˢxv& WZD$@N@u#;?翃0H !3'з/pc^c{ (P48q"H:@39@؉c_2qO*J$`wcwڴHH tIfM/*aQ1y֭{ęӻk2󭎻?^ uz+W.WSDO9sqqt+V &%K΀oK9rDrw)+W8gȐɓ'6mW/w}PgfUdO.:VZիW2% u+\0v*o'мys#{nL:L3Dؠӳ$Յ >qp gD}>¯tI@QOW91 @48Kcj*m'?%AffD#4)K/%lH  t /yW>Z.F:tcǎȓ'Q;FW>n2A>s|9r_,/wiڸ{Ѯ];x MXr)x5П ~}Əqp~a ]YHHHH< p@b,úus 8MI,n 4E~,mϞem\θb \ى~=/)1(V֭J(#~fjOo޼_5N6رcBE۷qpk<hٲ%x h]*pu>?6XKO_tp-MYS+T!'WcqVˎpuܚ=*6ս{Xji N6l\f ^yܹŗɏ7|#6ޝeP6l`K:dc*UB2eL~]Ż>쳈:b#[Ȓ%KtnK6mSNW_݄+c߾Iވ\W}7rVWA >f DlrZ>>BΘ1UT!Co~0UEt^1j}}%nbǗjC@ϱ={Be;3ǫqgX>СCqRXNK˵ xEBH%D}ԷAHuEEɓ!/bڵ&k-g>&1 PP+ j$@@@ ɐ736*S&M  xg1^kҮ5>R\q nL$@$@$@A@m[˪^= 1eYٲ > pմ5dj?C=dm۶-ȼ?y;HXZb4ծ]l{,q$d,f0V7u?,x֕+W~GtSF-XHhSm,I# fS{ĩú|%BZ/j8En+sٳg-qjժe1'zK1cXaըQô+1" o_e}$@$@$@$@$@$@$@$@$@$@$@$@$@$@$8R,e6CnBGۗs-+iR:}:tȞ Y{V;FE=C TAFw>[6>Zc$H,h9r4iۚTRH{rl[͛]vS٭ϓO>ixgv1]CL'Nh%2(ytsx#$fS3>(~"df0SLFՙ{1E/\`>ۼȠkE˒@|~o\9=ﰔ&w?$EXczX ,^7,UDx+ 7>ĘߦիW}@<3h 9#0a=:Y$E?Xz[n5>AkS7+]t7]ܝ" qdY Zֹsޛ_Y*TDLغx%ڤ-_Ğjdweb>unHr\T<̙T BEryn1Iה)SLP}ٺQ$͛7R2ߎ(ӰaÈ}A!C5ǎo3~ɯ" _JK>nZli“y|R% +RE@5ge%ܙ3g6y|ƍ[*xYŗ; jE[ &s*VP!3'"C*zD _uHN+K˼J=z0;E?Ac$C}q;X齭SPMj~WZNA-N?޲ҧOPQ7 j07^?}|bnHƅHHTO^J,`Nk}H%OxÜ~5&10vǎ2+Ww ǪN@kHH ^eYǻ.oFcGؤIH0fO< $p,&M+Tɓ'm_~%}QdȐ!"Ot?Ƹ|'~ x@@JHC\9_5LZvc;؎,=p[˷*W~8fb;@KF4i^#36Z'%$͛׬o%K>}ڼnݺcǎ5ȅX cpΝk;?^z歈f97׍7ʹY}Y kl捾;z\&t7׻r#&"\3fȑ#U9sƬ +ܹs泮G/X Ν;3mڴzsa{9sftez/^ ¦MñoL Y2okay8zXյC.\`|q+3gOk" )4 Kݻw7z([c1jt>͛q* eロ&b8ab"              o7ի;BD5m›7N�eI@Eq-1 $sE@ E C SqHӇS5xo rJWwߙ@*4i)c\=ˇQ{gWN$@$@$@$@$@$2fT``!&]|ގv֬$uE<&to 5nv:$R4{L#}c0|,]#GPri],ni\!ƏM%D Wly#5}t_fs=a_!CN:~j%)mڴȟ? dz蜡p f=畳^'WNV\tBgq@֬cSBLa)S&XbQ1bý$CzOAWZe~sn`D f?} #<) o+?z_Q"%}pGyH%+ɍPɍ0#+r;|x׮QP+" ?G.La(3G`죿X1>:}U*L_PCP+$Hxi,T4Mѱc]@tS=!o޽{c*2@ /__}8`C4~Wqر[Blj887G,Rz*nܸO4͛7j'C'O6t*BO"6u     & S2[XS'sPf͂<O1Ǣ4cߝOI$em/m- 9pxw$k"@,G i-  HuN[ U+Y€@\갗8ܫ+t$^:J7mڄԩS{t"JHu&s׺uk9?|RG_]܅ƍcfH \ם?8-Z6ӧUr;%J,۲eKD=o6/>oHHHHHHHHHHHHHHHƒf2PC@K] ƎF{ (V,<8*@@jܹ :+h$g\I>9 ]0jyc*Ni*\>\6"9N2dS0I,M}ݥ|MYkIHHHHHCJqHw@}'0l0S6X#H_|E3fB&CŠP#}ާmbo*9@ %̙#4}1E>cɹ4C5瀮tYU$Ye^?1gt k׮s^TeL͞=h%~2IR%K5N#U@9ND_~A޴T|:t.][vu^98M,?eK~zjƟp[_Kid:39B~nL DvsP*_|d}_rB,Ypys:K;hU͓̿^0S )Z$Qo/^h,F2թC@\Pzu[o>q`XbtsHHHHHHHHHHHHHHH D \ * |cOR%h@m!vK\I(@޾hIA1 @|ԲeqćQKO_H) N·Qz#ʏQ}WQ_YVjj*F1Ø1cFS;? p m @w?  |vyTD)4om۶Eǎqinސ/AB_0@HƹUשV+{*<5yd|} >~ j%k"    pCJq Ϧ?Zo_Z1Բ&MgmYP䜫t| ! HHHlL`ʛ4FlfcͲdynSw6{a*R%Rq0bg#թS'KCm*U~wK-l;~n:KL>-/X#-Qٗ4iRYf,6ѫ^x=ztvq8nK돜D4GDS8[avX~}K;7nXa8YºrJ}Oq2              ͛%X]wYVW% QRQ6C fH X8|XY֒%<%bn9y_}u'0jSZߧ={ʇѕHlJ<;,Zg0ĉ7Qr/ڵy/SmTߒ+F-2J@$@$@$@$@np@M&y%$,p^h,^<޲DX*PըQYܲ(">l`;o^ĦYY\c[ss^W3B>:[+V4cjnUP5l?b-[66qԩS[O?ժU+{vipYOcx"0eڱcYtg\-:5Yy:D,̬ WӦMk,K ?6@/HZ ?H"bL~J|sSV6yкe̘ZjYOU^=ԵMږO?jƏÆ6ٳ'$bPݻwI}T"XXXօ :ϚSy ݸȥ@~[=M@/!rٱ._VZϱDwBD=?`)]wѣ1JޒIOPƍc$>"j\̲lٲ^Ǜ\rBJ0d+M4AsW)L="ZliJ.վ}{K|.''[oF]w-c*iv¥K μQ H!=>wYڍ2^Wwe"x"ĉٳȚ5kgWo]TRA ￱o>.\:!+                7̙@߾_=-Z ˗5kFO'0z~0 HC` ㏁G).·QKߠ/fΜ9㭏`tE 0˗/C=aHHHH pJ8}ݮd^x4 >N.pyݻ~([Q])2g &w,If J-[ۖwdrʘ6m$vk`nyNx\#ج=rFn՟~ 僈?Ego 8͛? oұN5hDvp\r@D͐-[60ZFs1P(MCAO.-S;ׯӾO ?Lw'hܷc0BpI35P \ycv?x Ps(t}#Ν!Ϲ@"kH5>DODDX|9%ˆg]zrho߶ZQ(UJK$x#;fHΝ<`d@B'.] snWu%Kfj{fno[ˌᘫ?/ gVsЯZC  & sȔ }wW^AV-C ڈѣEʚ5k*d#*eGdBiܹ|>}>ȏ:už={0~xyqa>pr~I;&Ɂ9sM +N$*N; j ύ)7y8K<9K@UdU~ v nv6_?LpByo&㙊1@t{T DVk`n ?6-癎фJ NIO׏3E{KIH q \'{ʔqk隂%l=TD ~%F?TP!s:$z$KhA#  ? qϮY%% DH8n߾fw3g~'GLՓ @`] lX#1ߐ-[mKl4̟w.L]W@`Ƨ$&&8?ش X11-a$@F@7n SPk8p@u)*U w}w@dc$@$@$@$@$@$@'SOг돉ƺu|߁1D `:[oa"zo K!%!7lPrQuRNbv\ رc}ESD ٳ;sѣ4i )A\\Ov@t{LJL⯿guB?>CtڹE'}%ʕ!70lذ… Xticٲert &_"gΜ7} _ >"4?# #nL˚&đͫWƩS\g ͚5wOO@.*g$@$@$@$@$@$@ڴ38t kwKtQwqg@וg mLd} ԨQu )NџULa~`B ʕ6] ܻ"LSQ .]Bq KgsB)lٲ/{'X&6 ׯ;FTpӦMH&wm۶P0 ɓ'1b 8Zߗuu;%ZfȜ~ܕ_Ŗ2ft0S'UBď"&箕/:u ѓӨ(ˁo 4[8x lf_={R&MP4(x_,_xQ`xbժUÚ5kb*ugNjSBU_Y=B% ?jT ^?Ewpw,Y ؅sĉ1;&TXKtɑ"M4AΜ9丹;vʕ+裏JLLE7gw'-V%.2xYw+iz̘ob FkI6d7wV~g$ ?m!$@$@$@$@$@$@$XD ۶M͚-[gxoMѢE SL. 4h|,ѣĉɒAC O<-#}E}W^ȑ#jԨ?%pI|&8b֬YѾ}{V%3Z'N0rɒ%m HERP+Zԏ]@vI4$ n޼\&&_X"/^((TTIқc޽j!ߪ{/fTP+3@< PĊg"     9.쁬54xVվM2:t?f4i*gM$"l AaHZaxe  j68l$2gVbO$@$@$@$@$@$@$@$@$@$@$@$@$@$@$vi͜  l 4n]O<]=,;[Q2#Ф ~=HH :w~|x4,2 ;qEo1m`T: t^f@Æ:r$*YBR ; C uJ۸Љa& d{JA$@$@$@$@$@$@$@$@$@$@$@$@$@$@$`GBZG izWGaa4@\gϷ4HT X"NF$@$@$@$@$@$@En]߀ݏ> ?pkT4dΜ9ؿ?v d@L̙aY?tQ㽋~Vi+*>T~}9ɓ駟ЪU+_ʅ+s̨\#B_~JU2oVZȘ1S [t)Ξ=3fE"f)jAz9r!d"B`ǖ)<\-{I~G >B@QP+0AIթ̛D [xzHrd)lKh $6tO?VvJ>YVDԿKL8cƌIX%aPJ6O<*g&$Iw}&?3g`([,TȨAF`tҥ &L;v۶?Mϵ8p#C Qz˓'8z(v܉""[*lZsĜZ)S&Nl~&bn 6*nШL$&M:`޽5s^+V<[ R4DTP+%oNxz$j ;r?re`dGLW_cFX1 %rB믁L߯PAFZv_  hE0 '@A-HHHHHHHHHHHHHHH4.n)Q4!%1$@*l:χ,~])&)JliX |9xl$@!Sw Yw>V      ՁmۀcbbiFo{` jjǝ{b8w=xehI'dΜ?~jN>%V:u}vtJBƌK/$c;[n0-_].3gD޽Q^=d˖ SO=UVIrF88t&Mm"wn{Ժ@WGuG[A8HAի)O>1nݺᡇ2 z8z&M8mvxuŒDxwWgvQ" J*_:J7 X\ZHHHHHH ddd.Xȗ 2/ o_ºI*>}}FE_UR$ h \YPF('O$@$`O*U=mU$`GԲQM$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@ H,BKys@Eҥ7G6M}%vԊKlػyX8X,$@v"ڴƌUHHHHHHI uj!"X{c׮vFFnb<&ĉ1qK>DIqH :YI&>|8~`/^ĦM0tP)RĈ!ipҥK#mڴ(Sヒ !N54?H b- >@%;RJ2'ŊCV0o<9GT֬YcΧ͛7֭[,n]' IAD894+@AD&'KbVgKR۶m3~C D!BC1l0曘8q">ԨQ#DznE@E\4Gʸq; JU4ib͍$@$@$@$@$@$rԯG2=e+Ax!;\wJ*Xr%ԩZjG̙]^sTOB 4 jeHH:0M {o0ZOI qPP+qU                iZl L {^l;h`|6ЍZg!8Ȑ!>~ M/ Y 6J {?]p-l5$@$@$@$@$@$@$`gy@D=Ł~^'woyҥ1n8<䓸ТE (Khѣ)kPfd6&9 2tȕ߾}58p49_oߎo:;$^֬Y+WK#LX9_ K$I^X .ٳ8uN>m^ɓ'q?U3jذ>SB *䚀 L&}.fbs 0~(J]0s̠&N7q/v͚5ͳe,ShH =;3*T _~Y?dCG_J$@$@$@$@$`o:6[;|jschHx)okby &@o>lHHX2 g2~$T\'58:O0 @bؼs"qc`VHpZm>HpmMb$('94y(f@P̞=/^{-͡$@$@$@$@$@$@$t}S6 x-3Ď7uM6ظq#:v{wW&K}ȟ?z@ťK1dn^/@t-#ta;v,BIߏkAG)[D.K,FK2fT+]t%؝w)SAOk]vHd]<||o/ŋU_F0KEO h8w\HOoʙ3 Xj<7o^kʔ)E@*Ud X 0B٪ }^&e[ Uc [.O:)D!F@J.\s_D%0\"ݶo>z8 /Sއ&M @cWpMZp/ @x*q0۷;Do X1vE0* H  QoCC  jgwIHO@h0&  ?Iˌܹ=/ǜ$@$@$@$@$@$@$@$@$@$@$@$@gNl?˚%[?l6}KY좤iզE/PK +ʒ$H"*}?c 3fsxs9{Y>o@@ 3.?~OWS5kfƜ?瞓*U Nռ"*N:)"`%=h~ @% WlzO_@@@g}W\V iъmϝ;W;vW_}Ĥv1zYiwzF}4xtr:y%E r̩2exSZK~׮]MH*eS+VQY(ݻӚ$l![v+W.ȑÛ,,~k./jΝܷ֭}_{B-=P?' JfaX,UD /4,M~i*ZicF)`Z$V?mh@BGxeYך7o+]Jn޽ըQ#/1ƌ@{Yf;իW/" !> X[TTj+G ԢvsF  i zȅWZkK5jSv}76m;LYʕ+@,HHo! a $Z@J{ŋA[t P+WD@@@@@@@ KHIo!w!gmjWUoEړ,P^+*{R*=G \q҄ R˖KF@@@ eJ6륓OZ_&Y[o0Wׅ^1cƸkexŲyD@#~n)}}TRޔXH?k*o޼yZ;v BR ̲0- % {w.Bկ?I RW ,gyWx%Ko3 Բٴp L}6t^>qe|F8(ྰ>c֭.wNw.ke!h yZ3gJ#͞-1%1G@@@ \pZO,ڎ_t'QG)SM6jԨƏ:u}…sI>1JPp@ A^wީ֍}_aH~W@@@@@@@RYQC#y؏פ[cߗD~[:F߱3 ˈȴqc;ǜ   D[E i|[z%+%_;ou}鮻9z`Ѝ7&B޹S4/$VtQ,`A(Ui&ĉ]`B{3[ msLfϙH@ ϗ.>T;6JF K:3˂hDYVZ3g }zobŊQvp\G=pC` P+]\<@@TA&Y_x I?X}{|#<] :wf͚SӦMTaGMkjդ=62ƃ@ p I{F _~)wTxv.!E[>;I@@@@@@@@ "]uT4w_a2gE*V,ԡ1-^ڵ; z Ub   @4r:YՌwuU\1W~}=ׯW)g%ޣEH]&g#mۖxOko)ti=!@v\wl5;2W_,ei֭R޼HY'Ih2̣*U馛t 7hŊ:;^@ rIwtٳgUժU5dȐ7LF=@ܹ% c!  -pQvŇJ J]JeHw%\)q^V6mtg{Ӟ+?E ^}U:Uz)ɮ!@4Ԋzd 1CW/"ad]SaC6.E!       @]+#U(M"R۶C0gdO'jEcM߳ (@~aX:D@@@ G)=xTԥT4icݻu?%$'k: v b+p~XcŶ,=kV{1Y3暺-j?ٱC1Bٓ_[Ylٲ⋵6fi$@*U4k,/L:ڪU+Y&F8C< iۤig܌4/__+@@@D@-1c˥K.^*_^jιȩ_~s9v;iTv^{tUR!FJ@;~:ubl@֯(?       ē ~㎓_z9iB]TONN?=z}!P+I`Ao=#b s @@@@ sʕFΕys={Uo]Te˖eތ!WuY\p ;KK/aI'!1Lش@L&ev   .\]HSH!vgZu׻k*%СHÇKuR P+5G@ J/v"? /PZW        T oi=tҥcع=,? .F_eJkJVnv,TdD y3y5A@@@qҘ1RժRҷ~zW驧Jl#ܢE% zQi'̙rat(ji([6.Eej* a) 1l5J ҇Jzt9Kt+VTϞ={,]3G  ,^zI#G԰aԠAOMBߖf]d`$vn/#  dI'I?.h\{uDܪ.@-0otuwHv '@V)#BjU,mb,`Z6ĸ,@@@@@@@B)e#~K߼Z)O Z@IDATf(B5e)֨;߳Βv>(̣ k+&M-uOX>   !ж4w_xySΓʖm =ݣnAӧOO ꫥcz>#WS'exP g arjJ?ش@,G΢ ..,oE `ȕ+(K&<8^9shKQ&Lps piҐ!HcCC< Ok   @z"͜KO?m%,ڈOT6n:w֕ʨ$ P+G@ FUVbj_0@@@@@@@6m" *HK\#Էd['}tEam4X?.¿~ gHcƄ,b'p~aۿAC@@@80cGo7ߔV\o t֚5k2!cҰaN!~lLid}!@|qt~֭'zqjaFrFdWp ˋ/J./FFC @j[lٲ?$@J\jժ:, dZzzυ8ij"  Y+P4e_L[REjP5Jzg/kԵfZ P+\"DT`Ni\ɾ4@ cE19^       @ !=tre/K*X0\v1J޼Rwzk!L I+VDiT;v%{! .T>\ Z'+|{/A@@@ X9HKo!-_~N*3۷x&FFR^ҵJjkȽ|z:RӦ;C {K6HQVǓ> P+{e)v·W˽s2Ŷcmr}NUXQ=]d)[Aq@˧_~Y=n{ڴiSGXC2D*W߿sX6% r4@@@l(RDGZX4I*^\?cb5+H: JݷznIicY#}! @-;/ժETX1t-@@@@@@@F.p54t~Ν"D/مal#FH6v-+Sl3Gm[.8̙sAvmI-ZH*H< [GVbF0j@@@Ε+$_ȅ*B~/ĉݛ[ރJj#W_>ߏO,]*]|dCz}?<|$@ɒra#$ΘcMH/o^e$jSlG0FX   vEӦ;-TtYرҮ]qvaChѽSJ ڴtii۶03ңJÇKkgL ĭZqj @" |'tɉ4jƊ@ XL{wΗ!       @|7ސ+#YEV~oB믥; qX$8ʕTƌIlFWy>?1P3>o^   "N_}&M^Gy~]4jcGW.,kȑ{GdņZ,as;Nz4h/dW+$M7I H&$Θ:R 7FZ}W`V)wn˗3۫gn͛kօiKk[j4DI&1c6nܨ:uoMGs*ȅJÆI#F}oVI 3{Q P+k!  @XJֲ0lݮT4`oaI[7Bjds?∴ݟt}Iq22+@^ ! 3 :u#rKȶ)        GU .+#1yJhXa!2"˖Ef8 ?@5t XQIKVΝm/Z   d@Ӧ94q4{t EI+J=7x){{ۥl)#-Wh/6Գd6He9,XJ+֮y<͛ =8 tC ͨ˾mٲﲬfm|_裥}ŋ}C ;daBZ0Aʟ_:W#?A@@@ ;Ft =v̙ٓ-˂4X`X(v};%[8ZZElǎ!-{K W_/+gKΞe$ٲ%)tk޶I{N4j =^?Qfm'i5*H@.vWd/p Xx1HkJ۷KAØ5KZ:X;'   nwwf̐Ε4nͿ6ˤ~c1kRr咺vA"?ڴ:v^|%+&p@B@X/riY$@gh        xӦIK͚I%JH>6mZF7ON9% ݠ*VtiNS"v͘1)@T*WƎM<{Tf    E;C^xA{n]^=7$+fbqgRpOwecHY*[: XՕ+㸓t-M[weʤ~7Ke! l*% 6M:9B .SOszQoY_U+M#.p7l0]q:s9r[LYSnݥ<4=:h:eD   ]jդC%;f?h4}TƈҖ-{fKy[xnqcy}m[\Fl KEC@X |Uc @D@RaC@@@@@@@@fΔZ>Z!ٳwߕFΝ;?vp>hq"P3DVLFvܹ\0;f "Ф˩sO@@@@ vsK]$͙L,"*_^>7OjS?{ vmɮqNb>\alV+5 =50>#X]J%JH?XhY*]:J# X,L-ȟ?<}NĞZДMŽ+}!C{q1[anBRkScG 7Of 1cD~Q*f;w<*5*hԊ:eD   }}ҷJ~*+']zTt?D ##,^\RRkM4\5ֳg{cG{wLR~%"@R?Q2@XN6K 2.aQ"D@@@@@@@XMRݺ~ф/Əj԰7[3tt4_.]"U,ZY3رټ`<0>RQ@@@IaCw}] 9u u$mtg3nAZ,%Kgի=\W|Gk|eò}/3fHkքpt9vmx   7I.\i' 5o.-4/`STۅ?>;njRvCT̙rsFwT/OOvR*.ţ! @,,PjXe#bԊd$       ,`Ա_Ҕ)Rz{?p@jJv#t7SON<1BP*V$P+qERΒq='yI1ͮMOԹv]M.{®RZBڶMb%KOGq 3&HZ d_hݞ,b-PaC        Nŋ H0A6Mjx|n߮]; DdHFJҒ%q"Ԋ₄%g!#Zi3@@@S o^{wi,VM:dI˥s/Jr~ο}Ng, l`@aX,Pk"/b/?ySXAn?/^(THR? #:uyZ lڴo, yq@jK֌3gLpH~C$.yiȑQڴi5k$@G۪.%Υ| 5x@@@ɾn-'-]$;ԩ4iBjVvƛoJMJڳGע1Uejm͎[Z&һJcJW]@ R5 @ dsSeEYX1~       @b E]$r_ 3-R8p4h ?:u\q5xdoucQ1.7sjŜʮ5r@@@Z`& l_sR͚СrEM۷˷}!~ kz-p5HVɂ6ۯalM>@ ,}HkJO'߁@>.u潯:u8ng/J+\_x    ď]xҷJӦI',]wtqrEΝc'_[3b"EBTKHm}p-kV7m?jB)z-Q[Ѹ;cI>XaA.R24})P ~DO8RRi =! ܇ٳݱ{B,\@h q_w'-Z}w_ihXZXZ2gaѣC1 :A<k3@@@ؾϿX@P-;ŽY U?]gXLYSZ0$=n}/dg׮8?Ҕ;iK[sE P+1;Fo ʖ B.`l6l >        .jtUK.)͟/u?Hg.l:무ڟYwߕt "q Բf;hhN7N4@ #vnIR3#s5    Xڿf؊9:wԞ- 35X8 /ĢG[/}sI\C r"zn9F"(6=ȟ?6g'ey $;DCP*Wo\A]5qC%E r'pg}}v_i8? /0Z! ۵y7 /C@@ͩ!C$;GԑWx?!Rݺҧ֎N;MXѿ<.@Yx<&0 s; a7OOGAE$=A@@@@@@@XFryX†JIÆI\ %-|ּ.]xWzZ6svd?(YR:H?PQ=ʘ@۶ҍ7JӧKgy*?]JM6m3mvW%yСj޼_ԧ.o7pWp[{ pB6̙suWJ*G˗oϔ]… {=   Y#`Aڋ=ݻ1cz%۷ovݮyZ*+R]Msj۶m}&{̊'l?GX#'?ۇrvt_ׂu{ʕbI'%ؔ'O&{<c^vKCpj^4hoY2Kɨ?JgռP,xηP%޶i~qɝk݉6lMvƍ޶QMd6vJa) d]U^Pk׮c߻P!pv\~/1ʫZEш#롇~cvywڵqxe㘶L~ߎQ?;ҝ\cSAb! NW\.}?Wt',B!`ų.? 1_8ϱj*_~g}~g_&ܶn{T;=c.e[^+P @@@] ]8=Zm,Y3.-=~Ua$l߭ۤ-[(nӮ\ymnH]xDoEpm`׌T%ob+װĪ9s䎅[v曥JyG vZcH@HUojR1?@t X;_       !XNzAi?|RC A7WΝ=㎓N9%DNZ!KM0bE$w%P+ k믿~:bmǃ,vbj.LLtUn~WjK .dL.LZK9ApWx 5ZF+lrե/ݖ(QBs Rq@@@ Z W(f?kO;MC?eپ+LV F4%-j I rW}S:w.,YӶ;}aɧARGYo ~fLVڥJta]jK ½[ [!m=vkY@AAV**T ,<DVvmi$ ^;$P+kH:mN-nWX V??"Am\l{ȶh6mvFav8?5vQW^l[2 \-2eʨty0'|l:` \f͞cv&{`07c0ۯ5wȶ[նS:ft[ݶKw׶Ӛ¾O,ֶjlA8Mpk5v2 ~X'OUW] r'B#v?xZcrw(h3>mɤ;X<}~{%&O}>?ܶn;I2v߶km;/   oۯ)r`}׮/=7Cyھ_-nmkO,8+dOkWIS_w>:9!yq烤|kZI'kڱ _Ymt;lfsD^ktZ4! "R 0@&+rٴ0@?iڝEC@@@@@@@8pu]jR' JK^*w};zjpU*z)KW+m&j/-x@}=ϊ#`X??W8)(d3Z]ܘ]h RV͊ URe P]K0_, #uvk%ŜA=ffE,X.$!ʕ+2   ,`_ +Ztp ۂ8?#-ǖgիW]re@#^NyqiԌ@@@ ?HS$4twvGgH9}=?,_|d}IC훴v'Ic_Cw?ւ6nHw}Ѯ hlՂm*T횛ine"e*{^j-,eӥ֭VB<; j%g p MP!@LnZ۔9@@@@@@@b>AҕW3]2߽{"_зdqv$0SnZ}':0'y\-5eJͶ.]Ey!sѐ!Cth=3Լys/͔1~cv|֙MVxՎUڶ\PԶق0RJQFmֶ iZ#e"Lt-mv pLy[ێ}'*wLxv}}67nK.D\s n}ߎ'N kɚ1c;wnY`}vۺAb|VYdk[nJ;[!j{WˋYknfvJfקԏ^f=mxAg;wJI-[JM;IJ#.l@5kƟFS5@V41B@@@@@@]鲯]]WOr C_~b QmJ(+Fc\_lcq)-"V$ֲ`s"RF"{Sp]hEAS֭iVt:.^ +tΜ9UVZðuvq[w}+*fE+WV*Utд"4@@@&`hPP8 vIZA5WhU c\@S!WuGۏQM۹׷sߡK[xӢ+``r.eZ~}nuy`6mٲeEy^x, g&lhT4p4zt6/Xtj4X<@-y_~{qX(}իWOݻw,,#ޏW6)imЙ3gz#&Msm?ژm }όYfyϝjAM\>[\l;۵z?@@@ 0 /He,)hdSrcuBG_omO/SE^77-lJٵK, # Aoc׎u(իWw-Əlnvx!Z+$G|v d+YZ OBHc?:w>+z!wŸ O"DXˌ@@@@@@84M$;Ҏҍ7J]'q'f<^ dĉ0g]t&+`IK!͝;+_k޼yI-ɎOZpMvK1%}Kٙ-`VՊd1?(;;wnovi1L;igZF +_F{;B{ܸqڶm6l *>0!>daÝ`ka;wVǎrϳw3;ָ\Sٱ4Q#|k[g@ nm夷v?3١kzﻴeK $ sZUoUݺd,EZ^[n}l?O=O;hTLի;^q7eٽ^X^['wr+_a ZaXK@ _X-ξk;4}*6ڥgz:utWzZõ?wr+4k,Ws+r"Vl~,H˶sh}.\ }/næzy~'h=[DžɍLHz{֝`;)4i}nw+NLf,f~ɝvۨDnvޱsEUʀ6?:LdF #`ן|i&O)SxaWJn_)ʛ7'fU-s(:[Gv}ԴiS)R${Z犲J@IGN8YbH&Pd59I4@@@@@@@mҰaҀrEenYYrBںu,P+GZ˖QetV\茇͛KsKI_ d}[1I&>W_}mnc R[1}zEjԨgbOʖ-+Zn'Vֿt}A7@BFԬY3լY+ZA@@@ kzEѭ0ŋdY:ر{U1W-B ^P6mry'OTD[ o޼{R.ł-.d-[&+n̊YqȈKw~22^.ҽ '۬q CҦ[NNy'→gϞ[ea,>#YmX0Iڵe%WzThD`صk_|| +Wz;vE^W{OWSN^@_ H[oyA-RuW{`2-u]|mЍ9 ի,;Q}p 0荸qcre驧76FY+Gf9@ ,Y_ vH˖-qMAx_?a:5"˫cǎ:Tf#Dk]wCqj# +,(\mV,yƓ;wmyE+뗽Mԥkq#      {P/* 9.Tvտֻwo-_\Jer.KBG-xԷo,{²Vվ}& @IDAT\)Z{[\^ʓ'bc8d#}Wŋﺓg0]bżbgy*:.]: {"`'Q+rh[VxZjŒV @@!*Xbs3}7ZjTvUh6:v@ nl? oLWB ~Szuo7c##Wwʖ~vw~!4b%P1bՃY#bAD;ԡCBOɽuVKo{/w5:y9}{=M6M;v p6o\M6UݺuuG8`| {ҧĉTgumڴ\rgU]jU/ɎA]`ܸqeғO>g`s_4x` 6Lo=zy֭Q#7TDV+#B ;x]ǿ3ד!$:>3j(}p,pwc 6d[ \ٳg{-ݮ=s.Bu]ʕR5MVx% 3?НJ2<^v`g:t%+LDz~ޘ%       *kk=H+VH={* r BՠV uE.N;-#\5i"*Y2:b$~hJ| u" p +4ꫯz1Z: ;j߾ڵkڵk'DQ X>+hExK֭7Y:  @x^%뎞#f͚3gjƌ}+NnȭinMVBL}@ll… eaydE`iwN:{5j(_|(Kz -[J<7ݢ#N\F-FVQ2uv\`4hm۶DK -lΝ^V^BPfo^ufѢEժU+/Ȃ42[Z;Vs\B y~-DȾ(P pK{ZhϟtK޽{ky"Պ+&Oڵk;oEPs6zƸAd ĉe<dgYKwfI2@D:u8 Uʟ?t .@ 4DH2y&ijڴ*P9<ĿZ_G93R^ XXʝ[:΁!@jv@@@@@@@@P\ԯ ?ʕ;9rX|Wl_gmrEUDu,@ht9]#fMf lܸѻ`/vou% N}%'OYC|I}W^QDx֊>6q閗]vW.MC@@{ 6m7Yw}'+caYjҀ[ TP-DOcM--ۦMdlM??Xg zSbłq qpuIw)* a/㼣&uA.s֭l{;Ynp5[k7gΜ+Hzw{(_{51 .ˌed<6oެwy OUD uQ(]k"qsasJjx=z;-/lfa{Gd[=[ܝ(fv{1ǨL2c޼y7Gnz:uK{9x ԢEh ,Fa > ]{]no)[*X0   @ رCo.X@5S>^nUE6 4]l(.ӧz $&F JP@Gï%w^ 2Y~-g@@@@@@@@{OKx0{YRz>Zh }{'@{_裏`*`>7ݻ{UT/֭[aoҥK5dؐ]VX?}F ݻ7Y}neZbʖ-Pl;Oh=d׺tJo߾S|yp {& ]Ô)wN>du'="P+}7nӿN,drQ yJL?- ItM޾~;t#&]qy&A@@1b^WK7]pzeghe˖޴j*ٱ{曽kF<[1[ @ uI+D lŊI7FC@@@@@@@u"t≙7?t+ׅ7K.=L{}v*V-PΕ X`w!ѣUjU=.t| ]f],̥d_xx+UtL]&3C@@8xۗ0vXYa対JEp ^1y& ,PP!h›aΝn\M2śm۶W~6mT\snEWntoFdd5J Co-[%vfE4/29+x뭷 xիk^I c+o̘1:S5h uM ҧp- ~f߅}Y5JEB-x(yݻwkݺu矵rJO%vԩ.eƎp'~jذbPl?}1c֭{K:묳dZ~iY/p嗫I&:sVN_p6.>߳q, @@@ [,|O>޾+~lB=Xڐ;SO=z!=c=zȮ'!@d4 !p&Rtn"2w+N]@@@@@@@T` ͓^=vaZ4`jJYbQ۴ij<#80Ieb]]v s8q{ ,ʛ7ob07|WX^UbE[!  dX˫Zj7nZnYfiڵzջwo=냥 E9rVZ{͇~Op:-dذa X膅Т'Ы@zdne…cׇCY֭[ծ];o;B!,h0CMkX}~Z!ʻK_}f϶޳>[kזL<ٝ4OVp0,g"`ۭ/žBWΝgE_-6hWxqլYS:t?֊+K/5x`U\Y~;?rQcA@@[_~qתU6mx;~k`Oߋގ˗{1]}ժ[.\Y|s|=@h lw\4ƨZ^,@@@@@@@ |"wAԲ\aiihSc;?\6Ь'KJ%h5FW]cLm09D)cT!$)CBH"*C_)Q$ )TEB EE3Ð8$     8o#6~ϟ?`CK/50. >WEz7 MC̚PP' D?.Rp3fv$F@PHYM              !D-"3g@(_~RjUb8a/Ü9Gž3=ߤ/D;B6S>G;_"I6ˆ "#F0 W"0/H._L:H:ud޽J; GzkLTd* #<"roc" (XtɈر l7Iډh4yK_EJZwYP駟6bA@$@!n6fy뭷eAzcYt̛7i!(&@,YLnDpNݬY39|pˡJwy 8[oݺU^|E#@WZ5)]|rN;3gN,-I!R\~})TdàSZKNF店lڴ)je U'N$*LHHHHHCܹsұcGiѢ` ʕ+RJ) sMHE-ҳgO3v8Dh$@qOZqY  x#eKRM#jAL Z4               g^vm!:^,@.rMVk׮5q#->Z <puԸ6It)* ٓ qIʕ~H-[L+Ug=@ [nn:ozDckW4      ̜9V5ziAxc zHH V@D b?,X @A|X)&բPȞ=A$]BBDTCJ IrL$Hv+8q@p CG>z2?cDKvi߾zcjժ203;4;uٲeS>?/vWZe x )^@@L䡇?P,q]裏-3f̐YQ U/X>)VƳ4͎{z4      $qw}uҧOI>}|Vym۶u4jԨ!2$@ PP7%  ٮ:I3A %A-ءCIK$@$@$@$@$@$@$@$@$@$@$@$@$@$@$ɐEnE.kU53BZ̛7O}Y( .ɓMiQ袛e׮eIѾ7HFhD,%Mc/jDaڭ[ƌ"uRP+ioٳL>]U10̆gn؆9+ݻWFe&n"XZM6 &p &0!T}uǎ .]*^[eF$@$@$@$@$@$իWKեur=Ν;wޑk6¸5DѰD3D/1:p1B.0`R]qHu˜.7+5馛dرu]'5k4TkEBo?Z''53DΝ)QIM="$zҪU+#^͛7Kǎ=~ KRJpC״/1"{ 2x>R+-ZdA(܆'C?ĕnAK|ʕ3m;ôO?TbŊoF7 \ĶgsgϞ 'ྷE>PMJҥ(R.dz.媸ڴi2e3fɓ'.B:2B n„ z7Bd8v,)l٢VfL$@$@$@$@$@$ '?w⺘E3|p3"sacRZ2eȲeĉ;f;b, cr @hlݚ$E!d*$R$@$@$@$@$@$@$@$@$@$@$@$@$@$@$p!5kDD*UѸ DRD$h %9]v 8|}v.B0/_ImP@Bn~Z#N CiK2|,Y"Փ/X2g,T\Y ` !rӰjG ̙"A`ȑA)@ u=_dz駟~5hH @7uTm+ic)Bb`AC/O k<C3 |9 `UguHHHHHH UΜ9#nɳ=UPm۶2A-?C[jSx+=~֬Y꧍6'˃a>N:w\cXˆE˛7 4H'.]:>#ZиҽSONjg? F ik:Ap9$qc7eEM䣏>2}5AѣH{'ClTsڵ2nܸ)G55]VXa; cJ5ʼg/ Y ,haOOc 9ǽb0q6pC"Eȥ^*7N<髸!]WT)cYU6O>Kܹ{m<-?BĿ1 ##h"NG:y%ж¹(G&    HzVDhE`?qmڴ-, @@;zqc  Y[.cH PP+!+@$@$@$@$@$@$@$@$@$@$@$@$@$@$F^u}"*-2{h0ڵØi~7tMa#rLr|裏JM`d̘QoSGWQ͂WvOٳg Ҷm[9@(=';˥dق%P$Hl܏b?۷wyG7oٴi&8 bnI:wlذgϞ!mZj5#f`xv7,\¤!x Kyiڴ۷/T GTv,L4c:vh1~pT45} {~_<ᨪ4Sg©\ SNrmW\!={IJϟ߈L8QEK֭M_],e'ѴuZ~ Fnx&_/W;wR"n.GC'dذaҥKnWSD{b-B {1}>X̔)Sdƌ!@F/נM4x*bM-dHٮY9AkqSjժ-[6"AT`C柀/,<4kL hUZjfLDƛr.׏ yaŊa^}U#XSpNV԰,ӧ{}7(POݪ'?j1,rKS%KL5TZNa";wn4Չ:H \| J&W]u4PZZJ"%|&Qk?[Dm}b@ Qh;=#Fȶmf;w.d9&ȠQb  ,y,L!"6m/중 x&8@K|io-#gC%h_B8v)Pv,|ڵk j*.[<3Q˘!jOGЄhޟ8DտRMcw!^l̙#KZΩS  v765L>,~+i:ˀ`Ʋe4ơj!_B,f=dK,Cʘ1c$`|"O~:\FA)Je&k:=/]U.L}T!u/7of?̓'1v)^r%ƛ}?Thx+zXd|{ scdž:鈥wxRVz nݺI͚5塇}wnv PI4N 2e , D-̐Y@$_(;L$@$@$@$@$@$@$@$@$@$@$@$@$@$p!MDz7NTId$ƍE.mciӧ/62g,wyN!C@@'O4ACz)ɟ?kXp|(m/_^O{8p@y'{ҪUdy%K0B,]*rȭT\A-w>gϞ5m޼ " >6|Xԭ[}qBF (RFBU&8cG h?>Yf 0M<Z SL1ׯoPmܸQڴic!~` {lo/G@?A6(Ta > RoLVód8]JA *!P~WSLEa1QLثʌ);v0m0GkFKogD-_{5'I ٳd͚q60-Z$`!EYl̲oL6#PQHȑ#RHFȔ)mڴ 0]<.HHHHHECv';} WYw q?? /|WxH x߅wPg]v2ïIo(BP o?ʄ LJB>?C.Sow}-{ks1سg ȅѶv8`;_\B!|>w}몫ɇRX1%_?Uw%OF)M5ʈk-_\^u'I66K4h6hE}砣]n>瞘_vs7Aúvj|²db7x'E@hMb'{~]n9[@roٴW鶾coͳ۳׽傸ѣ] g ;vG+Wdۡ ~I9F;*^xCO*UL9Зx 7*d頏ԩly$7.. >RG젏O>FLi{7Y_ >Q_};OjGzfv-IMflg( w߲eK&;޵wq: ƪUg8/oLoca))e?'^ʕ+M_k(q cu9sS_s"zN nL8Q4hpn 6uhA cz-}'=}k$ p}*a2o;gs1rd|{8p׃scQ<‘g(ӄ T @ `s wV᳀{gΜi[>FK| =|K6y|[̹|&vZCR }ߗ//0kQϋ ?vE81F$gO#  3g,+}z?>B2 0de]yeL%-W4SݨVwT3s             J`jƲҥœƫ;uZqQo4R, .d\;0WW&Ol|o3x3c]u=زO޴h. }b*RbiʰyZõkӳ߽믿6V -e]G Ni8m۶pNC_}Ч6 G7.f**f5ku@&'r%H4Ν;M*k-1B?yՎv͠]=>cS8:[n1@!<Ƶtqi4Vޞ^磫P>}߹詯?sϽnχsCz 0 V_5`[n5]nTʵ]x \0_׻g,x{;g|@H'@O.SWNXF>.i$@$0?FC DU_iLE<{`n& 6N'O%z믷˧jo3 |Ŋ.K~0{7\kھ&MH6\"]|ysΑȊyG:UN5a[ (6 @h߷i;;R2(;@cfs:L$@$@$@$@$@$@$@$@$@$@$@$@$m4e+r:udD 3 j@P b A 7onobD- .A~{SOPja|4f'i 4Zaeʔ56p~Up8s`&{-Dh$h0ii0=rtǏ7ED=<ݟ'/60ж?H)WZ5-.vP21]` P#F(m)£اO>.V \!P6S0vH]0lA-3AmCpcVZeѣDD 2O/ ffqW'PV`;cʻrJWޗxb^˓I=|}ڵkM}Qz֬Y}[W+{kɉ}b/BXح#.{5?R>'^ 9 O wJ87@@EZIg#EuHr#ңDр_ٳ2aQ()XXvm5kVQ EW5kɒ%.]Z֬Yc;vLM&9st- Z/ 2NZpGƌ jɓ"Vo*1YlhP ZJ_<R cqx;Y]}f=Dɓ\[dL9>R@,Ѐ>Ɋg9L?>~,Y_~?z-[VΝ+:Qm#} :l3}t9uh;>o֭͒[֭XBT"&M:u긖tbk":0m! 6gINiN>-*c5˝~;y@>@Nٮ.*T *JlQ6e:rQ91C`peeA3zaNfCc?Ss<kH?=I)N=@h:F%J6N!QR3~WШQ#QU3~zn|9m)Xϔ}vrH-ȑ5cHHHHHHA ǿ/Cj_o~b|mŋ7?Ⴤ_S{9ۜ;sgbaÌClX[u6K= .q 8O#HL{ -[Deʘ) B IZ yXY)              E]}WdFG?1-T B+yj!p C,ORz3 /E1 vZ V@Aa`ToJΜ zj6p;rgAygTݽ: vzZ}{H  fźy{WeJPݻeڵr]wYKٞn#: QFً\v[߿iO=E6mذA i1{bjfͤub҇A6p\'F,̗HHHHHbΆ h ~F`>̈*㏻*?g4?~#᤯Ek)]WAi^|lsۉfl^68^z|G}]Νͱo9s|pkedy~v5ݯ'Oiߟމ}B 0<`72b! ~ eg枠gR<<2MxϬ={۵i{} @c, T/6uTiܸMB ,! 2p/Mr|>k[_|!zj#+@׹`_Howƌ*U>@ի()ŗxi6?85׿磝O4m#{{:S{yx>m,9_MA0ucogKo˝3k|{0yf}Rur|$@$@$@$@$@$@ `Ϟ=|E$?4 >H'D_N\8CyN})iؿNE S=2 V2  pL@pǛsC PP+Hp܍HHHHHHHHHHHHHH nuEzQ' (* Ҷh`E`ٳN>m%W\ftf͚Lٹs2+S@+OD#GJVLuBVH@IDAT+M,Yjm wkӦԬYS&L v_%hO@l[&?$D}ɹsmNkѢ)7߸s-ߴiS3gym;Ю;~ԨQDiӦ&~G&09y﷓7$׏x̐HHHHHb@cǎ=4 0c P< p8 'vC#O>,U^!nݺ۷ˊ+ctWtxusE.t-r#{$\s/WPL:uJLbh6ly* ~A|y_9r]:^tF$( j/i̴ǩ}=.|vX|lذA<۵k\mGEs=}_#yNYuՎ;RJ?| pM@4 ba9uhޝfs@Nk;1ފGVSM;g&;6?ᰩS1-+cmٲE7nlD^z%Y~=!͚5u֙u-J`1嗥y*p 4       2!} 'F`}I3m /wz8- >,~ NZ{x)^pW'pSˇ1vW/lz@gqY:uosŃ@_3<EfC(89{ 2DqAlV0_|ҨQ#+7n,/?sIDuh1@4չҲe? i=d$-_۠ ׶m[)Ym!\!nɵ,?ue/@j޼yk%or 8R.W^y? P{v!`ɓ'eɒ%. |*_BǛoiԭ[791y pV82M  Bb_Kb2X{ $ ĕRȨQ"={B@S'̙"1a>~#@%WXQ_Xz-w5mdÆ ҭ[7LK`p?߼y=`:q 8ЈR=&KՕiOmfA 4Xzt7\@(QRJ=! k׮=zG > vq1W6鹖c EF!#Gٳg{ZAg+D`yl׮i3 5A֠AA/L:E̙#W\qybALk}ҤIL6={v2ey >\|IiѢ 482;pxC$}S@i&L0bTUZ|#ML(m@/f?6{ §0;xg}&3f7ӧeڴi8'#Ho&!ʌ:چp/ 41n@I7 @ `[Ǻﹶ πT3xA r p-BYfC`9~IvҤIo>ӧC@u}-v_`Ncvi W>8wS65_>ї^ݤ?I=2W輻O }qnmܸqef|Obss_K7u?'e iȑCK eCKyz&z3;~hhRj~jhg?#hg  fВ~zKe2d{14@Y O_ K 4T҉~)t;Mn3})ѶsRʢb`昣.`>4?625SZu?,j)Riڟƍb ?(ji6KB-@3WñNZhzQI$@$@$@$`Y³bewn|xO;`,QwSY9`?˗/ﱊ3>ҥKw𫯾ݖ YժU3#gϞV\Zw*UX B误EE-`  ^nkȚ5Mhdǂ%u_/ >%}I|y^ˇ≱zyyFc1{ggBЬ뮻c 9:NzA_U~6mj<@޺6 ÏvFx_2*8,o 5woXo:g|};_N]33 ӦM;W//k s.Η)[t_Ƽ p||ʞ=զM 0_߿WlYkkjԨah_H+k;'H UE$E(`h$@$@$@ p"}~߾xφޛ-_o˷o.)4\r%M5۩uٻwh | Z'=|Ck2ec**Ӈqzߛ(T@?`H޼yEERzD5AdĈr]wo!*Ihw,)2tȣ{kI./F{g].'~fl""x:E׊r׋Oujyh `zKWl)ývٮLa=_ƍʔ)S[ou_8-v4B] )ۍ)V&c#dz*y}x_2~xiԨZsNyWDE@EL?)ӽ2}t{>2w@ν@ҏ}xS7sN=" F,A ){󜉵[l ./t=XdQp͚5j*%2dHXg$@ L;c |m/Y04͛/WbJN\s]B39}Ot1ml /WBcB,XcB͍酏sE.^=|$bJģ: $".::&Ba#+D*W :`dž\j܊B=cRvm75OWmK.FtW_5|%a,L !0D4h ÇO$&r"8q%(]բE ٱcL4)#PEfA$@$@$@qKUбi̙3O>aiݺ/J=y8+RSP55e VH Ƀɓ'KZ@eLP%,'1CdӦ [(T w!2`@2gرTP&٪gĉ*@H),ޞ@{ٲe*967u4#GnݺwA2߁WxGuc= ?O^fٳGV*O ASرc-ĕ7oJZk`uֹG,ZǍ7J= B˗/+Llw}B?HD^|{}qn^\#9sڵkǏK/L,1MnD{mȫP!ޞvGF'bZ evL0?-@ ofvO#G#<"ӦMs?]m64i?P6m$cƌ$yQ+R"a0<|~palٲh5rmcRA,s88i~y|d͚^|yiժl޼9Ŵpؒ8X      H2etYׯo{)S"%s.pȑ3waG#oYj]HHIA2th;- бYHd4T(WBZr| l N ?!:RfO<ȕW=`ɒ%&D,Djܸ-9՜E  qV$Qs!ZpH͚"F  @Zo|nIFBDħlٲ*_Wo`y#D`:t _ΝXС bA; ںw.tzFP: @|;&, J5}|'f4iD5jd|݁CG`Μ9&xІ ͚53>H Q l߾]Nj;P hтz}ԫwoE{O=TL2vZboٹS@6 Tӧ]G{Gp;wx%ĽBBAN7o.O? 0 $iv^x5jԭ[W^}UXbɥ|߾}̙3B8_|F-jDq/UYt,ЇٳeF~aQפ^~eӧ"H_|E؊\Z58s='h@o_ExBkWan9stI 9s |&uL:"rŊ:8qBkE{DdUqkFz.KN@5m:wy5{c0A $vEСCVߎ|O?~J̛7OOn^#GDuIvxS3.%Obm ayHHI`׮]Ү];#.޺ukyU;"Dўs(_% 4H斖QFxWH PP+B9qO  I޼" 7&:CCڝ; @h6y];'w 8IxjLDn!N bD K +K73 l(iS% \s52~xAp.5˗7Rd"y`= C:t&@2&VZU6ol&KRL+ّ iz7d֭?J/nIr-w 'kgΜY ṪE"+_~ԭ[W 裏|ݻwVB{%DFٰs!M ϥݥ-_Z+b,m0-M;vOH{BZdKbZ f͒+V8LFlٲ2|p9vXd a.|v+ڬy5.}iZM6\.-\\zr7Kgo]ƍ'{1;FP'mDHEڷ $%~s4@ZeʈO*FxJCLp3 G&Obr~Z6oK"8̟?_|A]kٲl۶M*W_}ud \HHHHHH</6bs6lʕKz-A+R5jd81r! y7oSj׮-O\;K&N(Jz))TPgF n-zt| BOc!T;ZQEl_P QFɠAG~}qLAB(C@nݺ, "CP׮]%_|~!ψFB6zd߾}visM6iD/k֬1:ul޼-^X(M65b]FA(^;x?z[|y7Yr̙6௰1bTXQdb8QѤ~ HHHHHH  4h@֯_/u/eBE`ΝZ`A0`v]Sv'T ^ٱt4X  &k%fbb@$@$@$@$@$@$@$@$@$@$@$@$@$@$& ;'MD mEr>\4DJ{!14\ q4cBT@ ]$D jyE Ok{Ov-|&W mK6lؐ XXbtY01N:w^H0a`DU&ٳgkK[yMpc%@B8q7ӈ̘1#BD; H^+cƌC>xȒ%_HiNgIHHHHHHHHHHHHHE'OK_E uED7 V#TPnRJo\D#t}v|Y>ɺ袋hѢR\9$B ϕW^;`Io>3DdDڵZ__}%q2ZV2SPb2jٲ"wnX9'pi裏=(W]u`!>s>}9 "v7w S|1. C[@?&\`Aiذ'^z2Zj=jܹ2{ly1ݙ3g.(Ƒ#G.X'?#*TȈA,3N~dɒ1\,_3 &!Η_ƒ"Y&j Y/      OjԨ!8p@ƍ'|yΗ/3pJj"\"V2I&ɦM؁mۚ7H1gIHD8N7Jm$D:F$@$@$@$@$@$@$@$@$@$@$@$@$@$@#qWG~~-%JD,{f֭ l ("+;"yQ\ȑCtb̙ԊBtM惠|ԆIN#5r%ta֧~*2P-Db\ eͮofD tUZ<#Rti#ѲsP O?-I:] .@q,]*Wsa$zl ڵkW_>LL"C ;ͧN:S c~ϟ/s5+ ƍKfͤRJQPH j(5̘HH -8{VsW\jͺ@t `][N$@$@$@$@$@$@$@$@$@$@$@$@$@$ !-IJ^cE%|YeDTL`7 1YD*K4h`#tB #՝:u2SN a}ri)P VuX" &y:rrJY| ߛٲe3“O>)wq 7ה? idjrAb"Crr%E5x@`)S&$Hߪm6ٺu];fu ~ڵkxFdBZtF#hx啤>~|nRi3QM9sF-j&e˖ɓ'q7|Sz)ܹ/~H~|Ν;eXk]z:zBz,!1uWZe0 +qg.7|@ }2dJBzΛ7l} lxwBG4gp#rӦMM~[jժenժrZo ݸp F M6F2 $(V5I$@$@$@$@$@\wuviϚ5Kڵk'wgWn>&ҥpBo^5js99;6KE!pvvZɚ @!oH޼hD䧝zI{OW/{A 8Pd׮f:L$@$@$@$@$@$@$@$@$@$@$@$@$"0g |ѠV+Z$ҧ4.0N <(997,7'q̠P\Mq)pWUsUW˗/U#^yfH ݻu.#4 tώ; :=5c)RĈbŊnߣ@,#QQ QQQ߳@(ĉcQ/'1S}Z۷i0F b:tH>1blܸш7w}O2e"TFLvD:uy#OsmZS;1w3fxwžqFygm{M$bٜ:y u;1-x)gnذazW}1V޷/v'Sck 3fjaz^~饗z͛7rğu=ZwjINg-r);DqG`,ǿK i-`&o?^&L۳իW˳Ow߽N܎$Rl{ʔ)qYfy ]DI!D qq*SF.HN./qM5T؊@ |o*U*]@ɒҺu)3       "q -w.:uDN@ݺEt8v-)5\Pժ%-uVjQ!/+v`s0YAӧ $+fgQ`ڵkwvY|\&I~jΝٳg{6n [H5\ z"gB@@@ S59ZJlk-<(Oe!BVT=zWµl.WҮ[05.)`5rJX» D+cXV:ʕ+{Ef ˪RJڏzEgnY؞}v-Z4#];W_.`l*]ڿL7OJm ~0R;^icU{>{j8L`M$, Df J^` dիW³ /͎cZZ޼eLƶ:;Ν;%+V,CMu.]ApѣG޷NoouY޾+xB {/ -۷d-[#Ct{ IrG6n$P+ɛ#  ,ڵky;n7ꫯ_{aO#F*Uqr?hmߡe\`ڵͶÌm_y~N:ya:^3^8Gnl t#G @Jt߳Y|!       h (M u?PYL.r ~/{ ]dҺ_Wʔ^(=\|@ As=wؐ8o޼yl׭ؒKK6XviE6\r^t-dk.beP,|ٲe~ Lg{y:!~Xj™@@@HB }~'yƴU`UVh4i$/ɾc[aSo~uz g; _WOY>3w- SN>]ӦM]jR-Կ/(`o;e'6geCfa[vTllY,0 U1J1f{AOvBbpَ]/8}&>d!fYضSϞ=p3;~Yw_.'`߷l=n.\X]v7o{7n_P-{>SeVپ em0Zn{?~iGjӦ72rm1E@@@ +nݺM,f>vX :T[n}UV/e̩ۗe#<`kph"ټp}am?wjռc;wԩǘ@X +IA@0vҙ;ax 8[WZC@@@@@@I`?HQ~gcMu$W{"kcazJVhx#MJGKs<@ @PtUV=lEG|K, PSz?k;w<\V/(Xmb/z"Ez!]&snٲśX .gv}͚5^/se2c.XW|^a?+d? ُD/ڶMd sG@@@JhѢ¦4p>A==cpRp.-8<^PiµKaşmYidm@pۮ[Qs`o߮;vxvmns9p޼y{c3hv\Z{Mi)L Aپ+@1\ͮ[!wm_3>.0hr!(u4[2 Op4xkM o, *ꪫٖ;NdT=^=f,ʊADKkރN9>< \ _Vf;e2VoTcx{9's% m{cm?`2w#j8 x̎[NpRJ?ʄ@<@-{Z0#S}|my0Xhan ȴ6 3x.hσ}8c}c;vBl}i!VB@:vڵk{cMLƉ'͇츤/c&eK{رL{u{}~v28f\C]kܞg׶}[MVH>#b{,pfإip<(g!fJ= ]_}Vj=6ZgϘ1+m'3N7l˃߷vXͶo%dǂ*6mm |ϨcA#ci@@@}o&kn-Helm_#. ~{qОoڹOf_a$2ζ6m׃և`v_d<'P T,³2m  lX? @ZsSb ߍx; @@@@@@@, ?~֘1RFjw^BXqprtQW7C=, \x_HY&cA*`?N e#Vڊ&Y * em/?lxi?j3U~G m+h? ^CˠϩaCwٳ u dB@@@ +vds& µRpkdtélǁ>b2 g 캍p[; .3G g B2gZ2V *mAzD'O Kw+zOCJ-A; =!CW_t$^RӦI'; *S&G1[O&MVȴfkXom;d13vgญZ]ZPOƁit>ǖqmd׃p]+|~?0g9.>/uiKʌu;Vi!6.`Zhڵk؍=Z k^vSr0m>VڊYmE|}A[ V\n3GeFfB@@@ l>dD1'}v1ʮ9Y f?ukŅX_Ȗ'mFЕ1+nbۏaaB$_(m- Y *]:ݧDR}w'[ɝi@@@@@@@ |{RǡVsJݺ5AZw ("|rZŠPƏ?.,- HKqͱ>[:cjb۪SGz5bҠAw+>6@@@Ⱥ?Xh,p>޽6m] 8sY'L曍\wK>UԊV`*Uxs* N .X WN6_*mG@@@@*G j9sY'`5O0@6-|KfwxZ$;s <+S&Ǹ@bG.bTjZ!0t+e6l    Zi: @~@i&'`Zk6@@@@@@@0s]uo)}Ա#>$V`|inbbڒ-'ԪDVDrŞ_k@+p Ґ!~UWI/U__~3@@@@ ;KgK7 zԨie@ ,}t6ٹS6LC*T(0 A_@ yճ>GyD~:ڵ+<&p1hqkHg[;Y#    Z@H5RR X@J@      ySG1Cz5iLS')W4aIWzRVJ,ЦgcJ]+jNcdd @vʖ+~'-Y"t4xTt]dB@@@.j/C)"5n,%mK!xi+ӫqm.S8 vW 3>}wu .}u$yV ѭÄ1Xo@      P+R"DU(V,DWdIiݺ#      F`BN>Y:U1B=[r)7gRVr$`!o+JS m+mDRo5$ 3&G@ 9k'Tt-k@@@@0 ر>^|Qz-fMS(]?RZ*=`A+N8!=QŭF@p:tпowl5iD-:<@Bɣݻw't t P+]4D@@@@8" ~=6&MdCD ilIYqڷ^Z(A+d5 @ .X =4ny N[(.    e%cS{{, /pKCJƺwK+u$լi/VW--i@ 矫I&jժްK&,;wn X} _x##C@@@@# ud#@@~zѢG OFXֺu9x"OA@@@@@@?K7$tҐ!ҏ?JݻKyFrHt:_)>Lw6m>;[D@RbҘ16E"?Գ9SN ~MRJ@@@@ 4nx':u>Y4qYzi`⸲5=|4o!O *Sf@…5rHKuH4,Pk%2!@,P+OH7M     !"* @46n}?F %JHkFy@@@@@@@ ++WJ"U&]w/_VZ`/md!peJ_V\_~,8⋥%Y%Fn'j#c< @0ҕWJgKo)-\(5h k'M2    oѻ4w԰t~^3# t*LKim1ߴI8^=MZ叞@t~0vR_{1=3z+q!U{M2!@6lϭ}봈    Q`/|TDo]'P+GX qw        @ ^-vt?) i%ϟfH)%`{R5YL\YVlY{wi(ifH4SB+о4qSڎ1@ di,LiSz<C Ԭ)M*թ#5k& c.B^+h!5fԊ(!@j׮ޏsʪI&?~|MSD`ǎjȶdzaA!    @J4AH[\(|/T%[A5&@@@@@@@ _gYְa]wII}rNFt*=װKS= :QԖ?$%jۍ"@x,phi zu#FH h    ץ1c$ y饬W/PG9 7,]vaC5sh6!@V}ֺ6ip!   ʖ^}USiv>OKfK2?HG2eǁjvgV >3RbiCVnaFa(^\n?X_Vz. s    @˖̙R~{eZ梁u֭=// *!5nnёl ,E(~ǺձcG <8`'zj;.~+eT`i1!    @z N3z@/mNVր_6%       @2ÆI'$vt%҂r*r3֍@b,P^N*U[bVj o/}ukj Q(\X}1(Vv޼~"   @ qٳ%;Тt5/ G |vlxH7ѣڵQO;_c@\Ν'z}+\e\@|siРAap ڵkWY`ժU7ʔ)5<'~?fȄ    i.@V> @o'P+ʬC ,)[wy@@@@@@@ ;wjԐz,Hd|i|5 6%Kʕ+L/u{AV2Fݮm4~|@-Pt~ֳJ&IjI]Jfy<   IjU?0w5kJwozI_@,sΑ:ta2C^VG=FQg$Ä po]oFvč7bIF+WTRܹ^=Oa Ȣ@P+D,>@@@@@ eJM@"@VXHW;0$OWƍ      $K`.%+֫Զ3H+&W ,]JVBz0tt ~ _Qʕ6ƌ] s+0?HsH&͞-ի'u(}U    @".߿q3ϔfHdXdEdI嗥>&OԑF3ca!ZH}ĶmZKj/F@ j_|k֬Y:}`^xqԆ@C"j*-[6$@P+@ڮ@@@@ɓx d],׮m       pxݻB/-Y"]ut=Rժ".sesϞ=ڰaֹJvem޼9˖-7hIӟnuK'ˌ׭gsIwM W}`l o/ *@# -]~teҨQCIKgu&X@@@H@"ңJW_-ptir$;n{I+G;O=[% ij0'q';F?Jw-{oF P+ʬREaÆ6mڻ77n_gqF q$Hʕ+K@ތ@@@@ u8C@ U@  ȑ< @@@@@@@ .Et}҂WH,tR6bqR\*WNAvܩ]E28Jyڵ³2,+ .+Vܥ_-3g20+Kرc~![,1ˮoݺU{ͬ+*Te[AȖ].]Ze˖f+cs e3m;$`ZVp wSX@ ArI:'H>(h!5o.Y @@@r,PKw!4xԩS  p /z&O~[S'+oCA{J63jUca @"*V>/]e˖z饗te%bլ#EV\K"aJj,ϡA@@@@ MY! i&@Vmp:WG7]       cE,H/FjL1b*i\ؒTRL o.p.\%.,.]˗kRY>eaSr~T%Jn/^ ³wP-j4qzh0- N-kYwZb qXPeU\\o_L 4h ƌ!P+s!E!Цd`ΓN;ֲ- bB@@@(`-,cGo_K?(駥jc@ ؾFhZ4j$6"` ?l/^\5if@ E￯>}xZwš$Z}UYetK&@@@@@@j"@@ j8@pp-{y@@@@@@@ [;~ROV3,@Z L&o"P+}׮]?Νo~}+S ?E}*_ DXb+pٸq,Z:\c9ƛ~ʕ+p- e˖&O]nܔ?~UZUիWw5UV-o>ٽI*U+KGm;kjQ) 68CD 4k&}\ФC%HuHm   @ /H^+pt)> *P EͰ@ ҄ r~;tB=b7WzIc.-Ce/@ܹOFӟ$;wh9/Q}McB {SZD@@@@ jEuo@Xm#]:@ ,iZRn2 @@@@@@H{IJfx/Nr" @V7үoƛ[}w3gvuB,w:ujժy'ď01k̛7*V͇Z^hc,XobC|i֭S)b穧ׯ_ ۲uԾ_2܎;.FX@ 4l(d?,]u4`t]|;6z   -`p OzUiPsR{܌( ء2 ][KcHKr(gzd{챉d -WBo>묳={d@2ۛ-lܸq2dvܩ zjԨ7n]V^}6R)?uK1@ _|z .!gt    M ]&wDjFUzq\h^#]'.-]qi9e>~H׋/JW_vxfx~ZF !pjj߾w|5kF2fAY^@؛"    Q P+[~#DF@l*:jeX       p 8P.Fh4|ԠA» e;Uafk֬g}?\_|f̘ݻwt駫gϞjذU bInsVժUيvwl}-mҤI6le!hM6Uftg{IpaqIc*۔q @ tȾ+=_[onA*R$L1   _UӟZnQJ\zH;wfC rj&e@    X u~Mc @|Ԋ/#p$+:?v푖q@@@@@@@Ǝ8CjN*]Z6M=0̬,]*pBVd,|iܸqT~}wqҥ&NyWdXBF=ܣ .@ie ({^ӵqF/$O>^@C.ĂJ7K.[nQ²vΣl#$U> "UWI/U__Ԯr@@@@zl?5$X>({+´^0Eoi ʓG*[6z} @ʔ) &m۶:s /) ,Pɒ%UX$U#V'cB@@@@D/@,c/_WB pX%u"       0~Ԭ\QhQi@ 7@ [˖-0/袋TT)iF~Zh#G_7|B,k׮TRvW!(X{j}34p@ڵK~Vڵk{LlW,Py3 +(ӻ`rE5%+P=gNB;    @lwcǒuݺ=ǹbZA t><      )0mtҙgJc?ZJOF@"-r X[1ǥGts*W#FoO?QFSN*P@AC'`Z>-Z? cСjժ^;v]q3&t]C 1ȟ_R|E믥SN#     p.+#ғOJuH}ttȑ[sӿNUثt?=-B#C `JeM6fɔv .Ԗ-[1^w b.ndɒ1o@@@@@ {Dpe@h #>[RM]jb<       @Oڷٚ5҇J'Km=YBV6U_wݺu4w\Z`맲e˦+ ㎱@\Զm[9{}kNrW^ݻcƜ7gwZ9 @oWJgKo)kj@roW2%z    woc:RÆ>q9#C |ZI/m_/]|Tk!wb f %J_t:詧 CCf͚%;'v \+B }aj6g    N@ 1j&8 w>֭;x*       3fqN;MZR=Z6M:C@ "˖IKK E1o[o+(h"}ǚ:u:uαr@ʕOhź+t7nݺ0aB֘f-/Vx @\5]zH| Y3ϔ0Fm4@@@RY|y?̙'K?.ڕʣflKS% P[7i|w?C`jiB/D Ͻ>z衇t-W^mBN?|1]      Jk)#5m*ڵiH@nW1.fbV:; KEH^'jƌ3qS-Y$`m J:+L' .ZTʛ7FX@@@@@PjJ@@RFl.mْ2Cb        !Εv ,TfΔ.DʕOHX1+ *֭[VZ7رc5x`s1!@@:묳{LEzגҮG޽I+GgHGW.\SG1Bڵ+$    O_ƌj֔^zi`qp_B켐ͥ}JR(T({ @ ~6mrƍkԩ)<ڶm4o<e,`AݥJy%4     P+2" TD I9m!      aG+VpWY.] vo%lYjYF-[]N>][5jTw}e`K@8q.իWO+W<`h|gԦMQG\sz;#ڃo-W^MO~Jss 3j '/B 6Ηz뭷!C誫҃>f͚iYS,?!M3gxꩧɈ&@- eB@@@oK8}ۖH'NHX@@4 P+M7UOjӦM^!   & $W ߥڵScӗ{Yn4Vy,C9'0v gAt)Z@0 q';&4d 0@\svؑ.Vpɛ˗e>YfqYlڴijb 2P Ua@@@T 1l[ -v;@0܍  :Ar;`΄      D]e\M.}_H}\;YQG u-v ;FRWGc=$z*UJ*[_޼y̽x/o(%qݓZW %Jx1voVHY'DQ_~0aݻa-e'EO/ŋ¡$ʕä5kty#֭[={׾lM2E3gw?W@@@HES|);ݼԱtENiW\/}rַd?>0J_|!m& zBjy~Bjl)F&ЫW/3FڴiI(xSjU៨v׻`α,mdSqi2Z@r\?=19@@@ 2;mqlaK"3vXh@ {Į=ZB ( *$?g       a"8ޝTۗ,ٳo"BІ$E{~PIҢZ(RQJlYS!+{۝f,w;wy}qs};s|ߏ<"#p4ztuR_SNUqPOpL׮]:|rȡ : W^jݺn;Z|ۧnS9KHXwB MuVY-Z… PkePMoY[x 7 yW&c7üʟ?QFM6;IG} &xϝ;Ww}`Ez>}tO>9du^O2ErJx   @, ء(wCЕuI0}#7_JǼR;&gq7f?<߿>sU\DCzfo_~M 1Yq|ĖCZ[N?ʝB KN_@ R|]KӮ];y5L5k [s-ˮbK/)p>9}OOLѣGm,т], [{ߦCtW´l!-Zжmۼ={xAdlOW&X`mW\e[0(4AKrK+/$ ,^&M wݻug{AէOy~ qy#=5kdJ'JB,3{Æ nٲe I>   1,xq  ")TPB @f*U;g%w',X ;f1ԎY0ckev|d׮]{v´\q^pIMؼpT\C%GӁjEZ5 @Rf*k̙tv݉+һǮھ~띃M?Zp,  V2@@@hؽ;{K;mMޒav)SvZp;ھșQ $ȕK.)7Fp nq      *Utr_ ./7hrsIyk̏@ ½/o͚5 p.]hذaIkaU6X{A dS_$Bs Flx@CHg?FeA"6hk;wL,`!qgܹ^Vxu]^H^tYgiСެZFŜm0Ʈ]z˷09眣wyk{5ZҥK -1RbE/4&-W7 cZɋ.3g6mt ;VlP j۶&/\ lLWti-Ho^DfUV"@BgsΎ\ЇX>DرS͞}} *\dV:qy5qD/dт|@=hS[vw}]ϽG[駟. 'b#xb!Z˖-°JTѱczzmrqà Jئ.ZFZmw-hѶmeQR88`3u&ifSph+fja#Giپfnvڵks~/im~>[Nx=I@@@u;M2p*U=IݻK[FNσ9bׯ5K3ccm{nݺޱ;e;1:xKb!v,J8=={wL`JYzc:>bSG`ɝӃJydOXj 5Vi]  @ ؾey.(Um0PzTJZ ϏvM]sf6;OVx@@@ uiz4-)Nu;{K;vGVöuo M@ ߮s@#vgY,R P+u>A@@@@@@Z5ْ nUʗ/Jk@ x̪Rgʌ Kd v ZLo*}u^{/3ϔ t[olٲn5k\b*La!KnݼM?>p\JI %%Vwv{Z֭[{/'O=Z( .~Xgz꩚?lH+;G}پ}ڠ3V cAlt8,w  `m0-m R9SޮWv]= lG,҂le7pe!Yb۰Ç'9ZUUh$3ICc۱? k" κ[x /K/Mf`ʹ~Pp~|?Dvq\lsgiɒ珄)l?쥗^l@A-;>}o,3Pl?@?^q#5Jiڟ:t{Y|o@@@wŸZl.t3{%qk{pv -7u0ǼR;&g݁u/ W0;e,o>K|LzGK'axe;'qGɂ@ND@ 켔ׯ:QBݣFyeR u[~ ) :w:V*Q"tˠf@@@I`Ϟݮ!$#簓ߟUmvo 簣K[ M  rX nť|@@@@@@@ EJ=$7@tr!()› E6UŊQL6B.-[ɹ3[.+Y'za ЫW/o* v/f͝;P>L .<*h+0}ݧzjgzL$oSӦM |R 蟼yjΝ:3ѯM6Ij1q֬Y믿VX*U2Hؠcƌ 'ըQCSL> ?֗7z-^-VԯP4;2@ |CCGOmۓ{aZv"Qjf^tE3g >}~eY{ H^ϕW^ݻkС,r߾}+W`^˽@s\OOk.]*Y֚IsדSZ;m7?fՉ~@C&.JA@@@ :vC.d]:,iѢU K ς919waԤIwvW9 iksjc9>>^^eOC,]v B] @ ~ؐ!C#F+H87.Sc|7\j rxض{[@@@@R8xp_-s-vJC ԊMo@A  ,dŊI;v${       @ HU >/=nt]ruG@id eAJ%paAotW{K/.<7YCR|ye2e ~sAu |X`A)Wزi>*U|޼yIK=I& w} Aٳ7cڵ,㎓ݻW-Z,þ+$93I* Ëɓ'+Kiٲe"ڶ>0xb_ G '{eȶeM!ܭ[7/Xs^駟|I^>| @Kۆ}Ǻ˽i-4u&JJ/m$5j$j%}E ieƌ:tPeZcfeVчS)^X%.,^xAuR{UnD@@@(THrp`NGJQ6qc9uꩧ3ΐkҤI9 &>1 *WJ(?ǏOh}m[&|W]_7'|P=nt;֏}o&Ι3gz,TBD)    }̐Ygh6&;LVl1'ܝos`dɒ´۫e;;w_ vjw@@@ /*u.{Kދ ejE  ''tP#kj?      DΝHUH>+0@-G,L2.!PRY0SG 'wjM<͛vڕ_~{m۶9]~{zJ򙅅؍%O?7H}hXBp9ʟ`˻tȂlpC kpo >q 4kLUVgՓ?m]ڒvYHɓ&e,Y[LX2S~wAؠ1V,(]7¥ he2elpF3>3z-Y Yb֙gx?[hǃ>e&MDiҚ@ ʖmԶ,pʂnje˖ya?fc?ba@V1QZۑ9soipe֭Mz(+m"=ڛx⬎?ޫpš4i.B7.]hԨQɫu&ܮo;rdyr13Y{ڕ믿^=zslpN; f?湑m_uz׽ o1fm۷Ypa?ox'{A/l bd;{@@@@? S܋ +6m5k&ς=bL>;a'ycrڎw+crVi-Z z+vʊo{0q<s^e9'tˡSjE @5sUv]3cƌ;v}Mo3, ̙3ǻs|QhbT _/Ōx@@@RKnIޒa[^ؑr;{K~ϴ^L7T4GA@ /Pu *͌>Wtw3vr      v||- {}yl3_c\@N:>7KX:8|ժUs)R|Æ (P{SN͟?n^t-Z8}_}aÆ)>p5hקO߉'6|_|5jO}KXMo7hkK|.Yk+W._N|[lIw\^ s>"WW76lL:WL_=Mw2&@(Z{{/mOo϶%ӷo$WF; Is{d6usˁE&S#}.,4ߋ 5MG7e˖'|20= q+*q8  sOs|\LG!}[ _wRJ^{-9GyOSv+ qm{9{;Nb_i'f-I{ⱜöuo Mv[]K= MGA@P T*tt=ZF3HK[DzKc}o!!< w~[!     D=SOI#FHGHw!+|46#@fƏwrL 7϶mtyk5꣏>RŊ.L%KLn0C-_\{w7P\T޽{zjU^] f1~InF0 Ǜ oq^ ~_A۷o֭[箭GK. Icƿ\@} /?^a(d.cD[7iVht'g!oᶝdhbzvŋgXXGɷr)?~~7ovӚ5k H 4Gޒۿ Fʓ'Nm rl> {;j`fpua*]QuE m?9 %*%r@,w8@F._^zYOicz_\wod|Ʊڽ{Kc$ɏӥd|LVI-]gRԡsO'+N˺c:ů=GbI`С8pn=ʕ+W,u/ji&+Wλ /~pAࡇ7ߔVfM[ՓFΚGѷ9}#  ˗oI'v қ{oI6`-v$|+iCfPueynk@'`ź^bA&m KG@@@@@@O?- .(#vt]rG%'W e=/Q>3o^v&LlR Ӳ`5l,( R O^Elu \Ee֣ ژxܹs~,di۶B0rʔ)0+'xbBV^;x_W_}uH[ܸc32'"@, IkەEJۣIye`´ ӲbV,@+ۅo׭j`G޽W'<5&ݲ J0+6o[JaZ6ͱ^Xb7.h7   D; ;qrI/u,)pBh[;QՒ3Q+J^KyucH`</`/=p0e| ^m.YGQc3 ]v(P 0H܆#GxZ&M@2oլY\PJiu_|믿_ƍjQ Ii42LD](FȚoۓ:uꄬ~* X/K< =CH}J7dSf͚- kw؆    X`{I~(M\?h%k%eʔ),,F+9uh"[?(%=GZloZnh p,:uR%ǽ}^Ӈn^g,ZHVl)N߱cG:?7-POqdZ@@@"W`Ѣ9ޒ-lnY6m} !!w@@B.@VȉYA 2V,PNA@@@@@@\³^zQi^T,_"@ _/Ue΢qP=Zvc7;|O?,ZBlUsꩧ~BY±ϟ?K9rl٢ҥK{.sgyf|ӦM߿ƍk H-egt!.c4rL,G܅ҽeP+JO?-g.!=w!~Rb!ݻwߖZQ    /Юt;4~իuws=\AxXbΩJg!͡,`ZIeDp#i @5j mܸ>ov,܅6iO] aRueħ %mPR    @ ٹqJ+WT͚5Sw@ rF} .@V 7t@@@@@@"RjWKkBx .hŊ#]vB><Ƹ@f4am޼ ?o=LkuÂjԨNgرc#6L˾21%{ DA9|.M J S@IDATǤ_~nUz rei*+Rvm5Brܹscw0P   @< n *$*$2 w,Mڵ /PիWݻcXDVg$Lؾcm/Q!imŊRqK@@TK5lP͛7׻tz)ܹӻF'+9LB~gl2h&D TdgN@@@bMdRK>͙=Yq/ L+־\:ԃW d@|ҁY^-"@ #      @v=rjɅsHW\9RA)  /pjU< .eTՁn rȑ#Ł@7[_܈r}Q*U4~x~ǨMv6 @ŋKs-Lkt睒W.J޽զM]s5@YV1!   @ ԩ#7p;Hjɝ|رccXB0 /~@^0/EjUuͦ 묦N믿]z}t aÆyȔ"tқ`̙uNM6MoR>G, P+ @@@@ P+V(A<"oТțW*XPھ=>O@@@@@@@ {N:DK/֬ N8!CM 7KbGދ &hҥ]t Gq ϥ}n;}FիW{ ʕ+jڶԊEC@py 'M$U& W^yEYg&u    {ݺI+WJ\"u*wufzz;K7n :t,yZk% @-  #!`׶<'uG:tPЭ9s_~N ̘1C-ZB)@ UDff>@@@@Ebq'@ P+VsbŤ;#      @l_jԐSjN.C=Z*W.2#ĸuVDƎ.𩧞R Ծ}{:p@&jexu}kݺ1eXB={T޼y^.p.N@D@aY5ˏ t3fx [Vs#   @L ?/}}Tܹiw;(;qM7i]D_ƫa2$ҢEKsghV&Stm[nM|w=Յ^yNoqFګ.H">eF>yR6m2:+#@&Ĵ    1+@V̮Z: )jEʚHj-@@@@@@@+oUjJZJz9< OkHS3r.ԯwyG>O;wVRԵkWo@}eR+ :t6lZjiܸqkf͜9S6eΜ{Jv-qZ, @ ~ 7HnӬ^NWOr2ߡ.H7|z3f&D@@@Xh<Ǥ'֕fxsTRE]t OA I=$=;eQwlڰA\96C/@e܎] ӤI^:Ɍ 򮵲sjcꫯk.J`6djD    č@7"DZѾi, Kk       z#G\7hda6(/J*~,bCaܓ y%\SjӦM 7]z*FJС^~eBBCiΜ9{Tvm/D멧g n: Owy 5N:{>eرy#l۠O>ڷoŋ^/k^V9b eQ@$_v`ȝ;ViƺQ@?[@@@HK\9魷31HuH#GJ5ٹQFiСgde[(AA hV,L C'pj\p;v^ժUK\sM 4{bZmڴFtH@8Zt@@@@ ,&E@ 3jeFyZqV@@@@@@bE+rcsn]&M˥^U^5 9VRJGm6* K/o5lPv&L 6"?e-ZUSGHHǢ@ZeKi,.UɅ '+w} n.]P?=/>G@@@<Utҍ7J۷c/|>zL@SFI9!RRܐ ij@<3tP3ƻfڿ[oZn=Mf̘C}Y"@vɦ̓    $ P+ /@zޔȬj<(Wg^C@@@@@@ ZPFwiXrZ,r!L 0wܪR'yٳg֬Ykj,5go^KH,e]ŋW1w=&~nn㼟."O< ㉵{߾}ۍ}vر#G,eAc]|yUP ;묳*UzXrn2V^HVܬp:ĩ>åGh}- v(< ɮ믿^X6@@@ȠGqA[:$-?o5T5jԨ 4,D+U/JNcb>B  rd) %PD }'\g; n棦&Of͚`}RW^?f}Ԉ    ,@V4=ڎ  @X7@@@@@@@ fR۶wI}w 9+WJjEN{hIp V 8t6nXؔl޼Y[lB~w-Y$!j׮]R Բ`- ٲG\rfLUq#>|8Gkg³´b%nT +WN9)S9d?ea L^rh\~} N#'}Tz1ۤ;x.\ƍ-Z^pH    p]\Ѐte]wI\"]|I^}YuMZR֭3$&W;l-GR:@B/!P++4MyjرYnVtt'#J=!"@ lYJ    ĀZ1 @d X *T@@@@@@K< } VRF![#) XYgoF@p@XWG *TUxqY%ڴ==[j>K @8VR!C{bmZջtRfԿW-[]9r좘/{c!Wxg^X,P-X1,c! Q.p\:t蠦MjԩnF${3(5 G Ud@     94@(88c+MSQD;vh      q,0gϗ ,čMV':-ykTvvGm*TaZѸm ÂX (`uv?TB&O:)*UzS?L V$@@@6yK*U["E7ԬYOD[ho^zIᇥn BYL [?;ww"d@ƍ5|>|Xˢc#Ghʔ)رclu {JKJEAci"    U@r0@x P+:}T|kv!      qs-?rI.7ht9@X_[:YY+uŋmZό XoIgtNG@ vnYZJz0:p`yQ;/v:JO@@@@ [V,{$ilV-տ-Z([#O`W/lBZC@ {*WJwA5yiH/uΜ9.:bIC@ ,PxqLf8tHnl213ąi@] O˥{U'Kow @ lݺڅeNr@9znE:,ujҤ:w;L2'0vt ҽ2W s!uQ@Ȩ@"E\P4w:u{,UǏi5jt?(V*M     je>F b5(@;4@@@@@@|ԪԴ4kR˖I& 6:   (haȑC"i,  9]rW]%mOSצMRFcv܀ %lGڳǥP@@(TH>\ZPcԉ'?آ;3ZJSK7$ ]_zjˍeby7@ r3gm% ݾ=; G Xdø79,9x@@@Ș@^z ʑ%K4iR*bx5{w_?iȐOji@Z;CSL[oVZiǎQۗh3uɻuWfEuԁ@%     Js@B @VPc8x yfE@@@@@@ ,\(k'5n,4}҅, Ȱ%RzМ9>PHK n3Ӛ@o^ZXܹRRg@ג >KA@@@2+`={J+VH:ttܨA~.lĝRRң]p6n P+L,yvyiժUjҤ֬Y}NǏ9眣˧6 #@,PT.@@@@@ jԊUG@E@hYS3^#P+^5D@@@@@n~AO6oN,ڴ~zMۥOˬ8|h @"RӦ4'C@BwRŊRG7u҄ ґ#!   (YR3FQ*[7I=?&2g4  ')=p4FuWm- *p)rpjܸΝM͒v۷z٣?P]t93@g    @4 k6#D@R޼޽Ql@ !     Ĉ?>4i^k# KY^\tNfJڵfje!j WuEO w!%ؑ!i42/`&OlF]?Q@@@@ ~A]{|P6a| `A7( .+yg46Fj'+ͽ &PlY}Zstkܸq,kϻᆱZjiĈj >.R>v:ueˡ"ȘZbj@@@H~_ΝL9s@ ԊL@]paAA P+-@@@@@@@ %~.\j@ZF4I{C=@ /bUddE_HS'F"OmϏ"^եœ|+I߳iO^D֕|SZBj\[:DgK]O@@@@ =ܹ~eˤN $t6oNoN>6+xCz=p{FjU,}m -P`AYԝ.![n"љhݾ}j*_$ֱcG=䓺 U$ @-,@@@ 5KzI͚F^|q+V$@ j*@H.Pwowy!@VvL@@@@@@RJ_?oKI^0 D?H Fz+i_$ ̝+/8T!`'+A l@`qIm3% @`V5d:@@@8ZR%H_-ծ--Nd \zm ]f͒>Hj.iXVV-+k.@ș3 ΝG}T;w ѳɴ 6$z':ZV˥ O?= +VH˅-HI͚= * ԪZ5TS/ ~믿^3gte˖ڲeK'{Q>} /,P+q`-+۷oא!Cv;<;. ēB(`ZKpT   @{i;lյkZS [j7 *@Vu      dUO:IZPz ֕We"@ AֲvjePэBV,,oӦTN 6nݤ\R_e@2cDV'Z eS;   Ħ@СRB0&;k\~:t6l8s #>+6oofIMz_@Wx@8֭U ǒX @ {oե4viK&WkuۮLi}VZDڳGjV蘭*ÇKcgc/ iq *]:ma $8pl@*۠P,Lz*uEH@ "%!l@> S Q.>D( 6nJ~tICp XKkHG ?a6r2uX    (VL.x@;0 DQQ Q$(+f(fs˺ak\#( " (H뫱ƞg[SsssNF-Zd־ᇛK8DTK^>2GAؑG5}kiˠAf]@|UIN-Zd+G Ntw'G rJ .ڛ+W-zو#~ن2HKo(4 @ @ nfkQiج[< E q~Ӑ*I@ PZepj%A jp/ @ @ @M`SN1kݺDᮻ̦M38ЬVtFzrf;{DM`l3eRKnߧ\-.5(_şجY׮[/JB"%x!qڶ5;3 *\~YDn @ @(CKO/m'HK^yeld7}iYlrV/a#0cY>'9ADtS tVXYGkU"`AZÇM74@ ,XPAÆΈ!@ @yDۊ\ـf5jDe@@P15  P~( E@X{m3Mf_Q @ @ @i%78o֪fnf'VZA /73Νs. HI[8hl̆ 蕜 60{B0'?%_DT='@ |l@@6 |v ЖT9}Ƅ'|:uM@ ެN3#@ @ PBࠃ:/_?B@4C2EAL%]TN,^\k  @ @ @(K`\3,z:ag@ o|X׮]Oj~ԒCݺO@^fZu(dG]i+ nSB PY~f\x֬xuDT+ @ _o6{v~pLK_Lv%K:)f]\΀@&HPeLL r|.s?5AlD5k)?O?47p$@Z,X`ְadM @ % _{.;Q9[d @ cZ IA?Y\ j}  @ @ @M9Yː!f7h6}٩f~׍C,?4kl*+ jK֞ziNb&! ϬN?ߦY۶n.3/9a./HT[;~@ @fW17ߘ|psaUl!9! 1c̖.-LC s$բE'e@@,ܹs;õk׎=o>X?tz꩸se?\Zp vc>7k(# @ @ uԟZ S>@!Vf* @ `N` Ԫ@ @ @ @fWͮLN8  Pڵ piQXld槱ݻٰaiL X{m}4Qc^2*IKdKQd8@ @(7d%u]su[o]tQ8:?7R5ꟕ˾=?|G mje8AԫWώ;8;vM2q x85Ǔ/_lRHS &gG8-dC=@Phn8-hGU2Q;J P0Ə79MRjBs @ @O;JD^}z4[gz<ծ]$eUqWydo݃6{E^~l3O'@:|O?٪ [mСCm5Gĩ" VXբE _P\,+e@зnÆR[ @ @HWr~fZ~-gB($%VBu   j),]@@Pz; @ @ @@~X_6 N+YϯPZ@%0gܹf]f6R/<|`ֺ5! fFzuʕU>}r@b}y`]xZ_/j*y+WvNety'W-ԩc믿5h9oG7i6xc,qI8 d@ XFk/нωs+{!g˗/KS\>zR-ߜzjA-҉b͚5('}+/7%^nҸ> @ @ lԯ0u٘1f￿}lڴ5k~Èw\ĵ8Ғ~п к!֣گ>]%e z;h_X2v[ ;H>DQׇ~ЗZ25 M5N$lc _}UR-sH8͛g?s=6k,=y[mC+ەZa]ͪet ߨ5zkގweʫE-}'îj He 8UE٦6< j9> @ @ cԏ>(u 㬣þXkR_VuSa_~U:`ϛŇÆҾ` 6Xl΢ѢEaØ}-bԾ *KAʒ:@@D j5jT 9 j}MF&Q@ @ @  n+dR307`HE c@IDATdcZ%" Aw.RŌO4{-}xvdmʔ)qg϶ M00DDU7]wҤ01SłdfӦMmM7u7-¶f۴iysYB%pfk3~W_EKKF+5"s^sN >|ml2}駟,?hEj&!w&z;z&DFM`v:$x0[EM$\2)T&grj(Gu]Ʈ .z1@ @ HZ:eAX D"v;n-n< jfZF;@ b:'8QKbb t~yۡ@էbE} cPZöxsq!}{ZuJC?CPzRQe($0c9&5@@v0dɒ2Q6i[teɞMK߲!m} eQJߩ1چDߤ5hĉتU+8q )-eJ%o<}ڠ=J6hSXoР)N7b*9 HP |xg @ 5W]5,ֵ!0YU cm{M+z_XvV/zÆ֬{?+؏UׅgÖ.ve_V$UlZԹa_+T@ UX@@p6m $xq"@ @ @ @  ȖvMfZ7;Lss @5l̡[Eq>mC͋R'ttCa[E  ǎk&Msikgxb&MC,9J$.wNJ^9AL͔ĻB /`7pɕoo޺tNT@rzW\púDA%51WnnBssUks7laӦw觥P7Tߘ/I5ˏ34;8. ۵=)>v]DuݫhGG: N S 7/Cm+6l6h#嘜@ @E@m? (@hk[bhGGnZ GjKHu]S2Q9k:>V,u7SkSm->ݾ \<ԩŮy}NRZW> ~x1CrG(r]?8K-!@+[w}g,mv;6-e˖Qڧoݫ0 }ݭE߽7|z` R{/|jo^ OKv 3`Ic#8#j PAB @( ɶeg¸^-\/)\j[՟ej=v[`oMasse,b}Ήg,V`Kv` cMV۱롟-,Lu-Em7[o+eUmU}1z~̨{@ @ U7*7fAc @ @ @ 8ff[n17i좋>lN;w׃dĉ未u|ɭp ef^ufr8o{̙3}1$չsg;smmqk6۬ʎW gcy 8}tkʔ)6~x;N9Y׫=z=;@&ݞ7ow((cAe: [luر h0+{&ks&&Ukr&G;U^ W_ٸqJ5A;:1ypv(dž!Gx}} @ N@mz (nuX2Z8+}\ -v m ~n[yڱ%~0/^I\WnFի/kܴ>w_NbWBA!zD܂EuG9*3 w9sL"M!Aw;W3`fjwAVwBXRJHU*yTڊKme*9ֽnD #_~iG:ݖNj4mԚ5kV&6o~$rΰʅ{A @ ! {Tʖ> _R촱A}( BEopwi'0`u ii[.MVC4 jcƌ?Fis'qBh~m۶ї"Ir(LP~rDw=9nԨQvvv`G KM&MVlA<KM8ۄ JbDFGM&@ @(Tr(vOjGFx-6]UPK>өSRh B$'V+l9V lѪUX_m|I@ΉSyP}\"[+/VUP# =3̶ۮ)P@O@3g,fͲٳgF9y AR]Cnݺƍ{% -i]e3&$uoS r櫶PM^:}t{w4ZUmٛ6tS7l3b-E~g"@ @@%WpV2VKݲkŊavhAu]4gKQtS*j첚0q2tW.Sٌ!h۰+ȎKJ+_ vW>Ӟ4 B n?HK @ @ @ P43Ӕֹ\ L`(s%v%]3⟟  NM16 A!"|~}Y{o֭[[>}뮳]w E@GNn&ɾoxq/ܶzk߿۠wrxɒ%W_ F9DPPϼinyZ8-TP  ZT*%&G+x rzShgx7KM&@ @5jk{ et;^uP;+ZGN$bx \'Կމ+9vv.%eXbzd&u j.} }O6;K%uٽ`?YKW^~6d]x RR=vLʱoX{oȑ%SVQX7*MAJB@ @ /Kϟo!_)eO 8dS _Urk2!JEb]qũz^\nݺJ!PYz7PP樂 ɛu,Ml|kRYLPK9[2ԫW;&sDAPQ%%O?^z%0!$]w]kٲJW[ni;L @ Tx=D g˗&]N2B<Ȓupk6H/(mA\K-'~ K ͚5CMe"N@?ηI΄ '>>>s2e}~dE^{eq*C`}TIm۶q/_I6' [oe.v[{i뭷lw-TM N"@ JD @{=.tܹv=FZM6UYvqGooѾh,K T %TlA\+,`3gδѣG{1=+\_ӦM!> X3Qv@+gdI^B` Gz'*L @ @ @bȇwpʕfgivf Ĝ& T?*DsrNv޹Bq2iٲe&= P&MG73u @LM) %_ (HZI:}KtOu '+2gE?Rǃs7"lONT1{|H^" @ k]T[QboA\K6,С'jT4 t@ @ ' O,uU2hvq!lFަ#i%bF8p K@:({izj/% &-r0m4K2e <;i帳]v&z @ P~Wm^WKWV\!! z#! /ɡ:(N:+/o^XKb|A/,ǍH_ZJsZ9)}hزeˢq?NpŜEy@" Dzq;ƸA?ǏbCrdZ~}.q>ڶmkn-Hus'm4ibk4ve۝EKtƂHX+i);Fc7wZ-ARQ}}jYNp*KT =C@pmY[jM}!>* U @ @ @I` 6zsΩN;좋6,R+@E@5Eߪ䛯$k (wOcV#U=4i矷ޞ{9':9t( I 4tɋ\϶zȵ5N>dm 7L'>cC܏>;ԤqYN;d't}i8HoŞ={It_x&M>n?QZ'6m;vWzr wێIX @@X^Q⹓'Oq…tj Hfc9H"Zr|FMԤU nӧOQ ?~=n\WJXK nl׮O3&۔V˖yWl @ / ߶7|yJ0Ks;F Rhd@ӦMMq}-Mᄈ>~Cdoٳgiu& A-73@!@ P]V^텲MUeXb/lʮ*lu7lذNL@G4vD1^ V[QP b ,\*n6N45t@P+4I  NMp Q&#@ @ @ p>m`s-29Z@Q1œ@@QVJW{eƙ~xR$ Ы٥M`ιS9' Q#<̙c_~wykxSZjye]fv={씂\>SPPNGer0(r"xG{Ƿ;v!wu @% l֣GCr 1}P~6)tMvYg&Rynf߬SN@ @ ;[/\}>uY;)́XHB54@ }>]b Ͻ79r{|mԨA~MQ}rtOr ysw fÇ@%KC]w۾֭IK~Zo;m̧~-]ԷW% re]5#Qn[\8 @F`…ޞ*ĉ}x/nBn}3ΰ6m(@1X )>_b[ؚ>k3QSb5kbMjTl֬YlRlC ej!@U#} ! ;7w@ @ @ 'j]sقf'h6hYӦy_5*@ Ll7f{E9F@O?s“c8CªZsWHE ~v{a^{Ovh&z6`;cSG}bͳ_.N{,޽{w[L-"oCA!IN;cB{={ws"Γޮq>8'xyXB @-[n%t;vX ɒ@]v}OB1U@qX?3 SƒC &iֹsg/"є F_SӧsT(  &믿[o7 :Ծ{okꫯ>u:RxZjo/}]xޱG}d#F6o$ݻwoׯIdK'~m  @ Ȧv㽘9s|6pCngim۶BZ^ @U|A"_|M4i%`xwܹsivi;u䯗T %΁  $LJ @ @ @&n^=@ckomI5l!!)` ]U"0f9G fn[dQÜ3 jb"oI'd<_/p"'`v5xwxϙ2E@_xtvmL`y҅@nлom#G4Y@֭}z{J @r["m7.]Yger.9}#@_ 4k% ?SDS4z)ߏ޽ leպt=ۜxy!= *c3pb-l=pcQ\7iX˖Ց;yB{9s^{՟ @ 7[#qժUkyC=Yg8p|ɦo4BpfN  @ y3f̰#Gڛom;^tɋ3w:wxVo9@H@Æ Kmႅ رc?l2_'ӳgOoոDA-@@h܏?S6Q#K  P.j @ @ @9H@R/7f1f9XX@,_n6jٝwAeb ֻwړ%A! ?Wt~X!@ ^'UiR.$T N;9=jl~ժUnj)F`}ꩧ{qI{t *B`73<ǥKK/d{[z򣂔2H{$@@\ω  fK@A( @ @ @pͶ줓vlTJ2J7~ŬWfCH@cȦL1ڵ+Gr-:~6lXN@ c:,{^CL+cSOXf:Un/̬;w]p֬Y3꫽cڿGA-k!#@ ԯ_ߎ:(/wy6d8pk @EB,ᄏ5mMBv}76i$[|1"y(& sS/3f-X{1tM-Zxב A-OΉ,f:'҇ P$%;2KlĈ;sEL0n1(2묳'6a' Qw}"QxuZ>4n\xuF @@HD륗^#<6lT{=߿xb{mРA֭[7Ĵ!T;5koog} 2~pJ}q6L=Pǿ~y2eje8A@xkw  w1nE @ @ @(Ozk7smEqDKП%on֥KU,}57Y,"R03S|kE^tvuLfK@ kx9sc;m֬YY,Yu @ x&M3<Ӛ6mjt}wvڜ9sL7 @p ;淼SfF_Ö[ni_=Fa쳏ըQʥ,X`snƬo}ja*\z饶ەW^Y+95~'#e J(*W;cmVRSO=eSNzX.]|vB @  ֽ{wܹM6͋雄nݺX-\ !]W xkRybFnND-[@=h~ 8Оy˔ UbTPZlwͳg}~7qm۶{e  _~ٶfT?~:gȳmSCD.(K/do=f4 &+?,vʧwisĪovocҷ8g+ 8?>i @ "'kYϞ=}O)?;+7+ǃC޽o@T-ZnB(]8J㕣@:mСn|;l֣Gnv.e_@P@n$Հ ' %KJ->V= w@ @ @ WuNV 3qG?7{Vʞ T/>r{~p{K,;?ۛ5kf6lXC U_?K?_$r7/n-nt 5IO?uN=P-{wN| s$Ĕ+aѢE[o٫j?sVi"&N2&LqS3XiK_~Ç1;I$fͲz;LL!*G}dcǎ{LgK @(I&ygiXs7| K{h$^.S'xi׆׶h.^YKjywZEyڟT޳..#}ڭj^xN9R1-g1A  \s2'cj7oKѽ{w;餓lm[]> 2ÕT!@!2=ک+)6g\{RhyA*&;Gi'c\=qHOvo ,"SJ} P%+e \#PYzfjڝ2[0&/l:㫷 9&j26lT`o?[o8MmѢERA >ܾ̼SxmʢIw2^2v]6a}g>] L'#e&TL~+G[޽KI\.ݗ+rx݀/]U3L\jU!BLছnGy|MyvM74gE69*hX/m ;6uT/Z u.:~=Zp @*J@"'ݻwW_}KHUtV~"I_}+)VgVޅd$&;L4(trF-b|}ֱcG/p\'P{o&M~j)Ѫwm&^/š7o;T*MZڷoo7|vgSSOzG[eHyv7pNQqVC9;4hPKgzz)7o/G]&cEqS*a좋.q:Iqz4mpܹ]V^4VXa]wVvml5jS?祉Yꫯ~Caf ΢_\ &Dgwt)1;:ԱdEl]ϙ~}]ST?41Uaʕ~<ߡ%K+D[W%k&Mx%C (ꘜ+$S{#Zx4}L7dgAe5ji"N:r@4'fsεSO=1ZhaW]u5n8٥ۋjjY9[x @ P$d=l0ԾV;FmߋvK楗^$d裏{~饗v_v /`cǎmSN9ŋx*mN*xv-n)QSzjw+ĶOS)cE)]7cƌk3ƶ۴ihZy}i'#XyytNgBSOyJ^%!gzzCe?)Ytk,ӧxWE딌{EYh"_'?ciTW/[nv!d*]X*U&'W5Ecn;oqt3%MvϪ7(<ݣxA*c=X<%= l5lذ8+yL@D]HRfd3HaÜ)ԩntE"| = @ J@IDAT@ @ R$HH߾ȧ# @ HӦ]J_=. nɛ\nE"GQ }aҥK9HMe˖;&UEK7"N(w{gE0޽{$ȝwYs5#<@M8 i8-M$8g'wTsqڒqNJ#9فλ{9NZNH~8F$T{=z#NT*>7ɶ4w=kD<ؿ#9td.ҺuzL<9&GxRwcǎ7y:&FL5NǟW_y*9uFt8#x`duy}:N̼>1rI'}+YJK?FvqG59W.\0Mٳgdĉ9G)ɾ991Q=RpN#:筷ڟN_EJr#n2(7m0?!pj2Tw}=e˖Ey.sq"Npc\;<7)8&DB9-2D rCcBV2 _~n/G4htTp#N޷;sq:j:O>O GN?s`&fS:ʫvRS)8wi*e9mH m}v]z}gqRYVmJR='%˧}j+;s]sMgyN֟bTt]2:'Qp}u|baW/Ƚtb]wE"WK@Aw+ߘA߿N,2F-l.%9o*W 'q͝;7"[͠A*Wv"lO9 Jol}ѱo|Kva,{?'M4$+ɾty흠/fs608>iܸ+X2X0Wym<% |RTtݣdJq=_r33G4؃~*CߏPkX vFT 'qG'pXT?S'`oxijjlJRq[~] TYMi~{_~akƄ;z;(M6}M_2HfT56?Clz7ϔ5{Vپ~;g0޻{"s5ԼC?Sr߅{w#(*Ha#@ -n<0ƫlΡ|ΡUЈps U ]x\ @ @ @@Qot;sdSTէ K9眂"D!YA7lb<G@N{5-ANşF'nƥIGoV@룏>xM kftT(M ڜ9s|&Lv y_s:(x2rM 0;ysEp (t!]kއ[ϨoG;$]s=xQ:uxGߡ|jժUux4-\yFmT[*PiɑAT뒅s\HNSYr(_u7|ӗENP]A *&9 ?CzL>ݧ+a~_XgJ;O ʤRq|/|]*sH 29zc| w^SNTd ZiJr 1rR%) JS\])H .]F|K/o?o6c=SmITސot)Yٔ]=uنT>+>y+HJ8$㕬?I${&LwT ջrH;_|;v*I:/?#T꧴oݗ_bC1R@ V&~X\5 D<Ȝ7|W^gi&6{X*A*Tю%l+r>\0k,*wޥÆ ǣ$n+('Fj׮m?ΗM4+ɾtiooY>rl:/ػR%j(ʶ+R.M|*Ck"\Vݷe˖ʎ|@i9|(Kݰ#|Ƚ6~?Mᯱ I{gDB ?> j)jMfQZSJGQo_2[ҊW)A#1֭[}^;'5\.RRgI\KS4GFP 9RǢE3gSKاO_q _6t3=l``컐=)q믏H-BVJ-B @ K6l,eF6@B_rw2!&B @ @ Tf]fGf}oUL!@|ٴifج<E[z]xرf]m5(8F`ٲe /n |aʕ+M4;~7o_5%tA6j(sc-MӉ<$guСC"$#жm[><+ ~nE79os?hu5 YgsG57Aܿ{'e͚5-227ݯ;&_h38>uu*uIEé/Q;4FxҾ4mĤ}z91ӢmJ_OEx{گVɞM],R_СCSMm\2+YIL$OR.z:!6sf}gɝRߘ?R_dط?E}`9oG(!0}YVЀ |"OO? ':ea9/ʜ`"Tc`dkl=Αn7W^iO>dSí 4oʶWMNoIզ^yɾʻ.|k׮6mu'Y/sK*QJ3KTTʗ}nժU)HRdC\26n\a@ @͚ƽ\ D }7?ׯK(*Wh<[^k GvO݄M{MԸtͽH{*,F[R,T/4hkJZ|rlo癨J!*1=k̳X4Y!]}_+r*7>># u:)b zC`© 5 >;RB8ڵ5D͖,)R=@ @ @ j!0bf.hذDPӪAH੧41'@fv0CksB@Ҳ6*p-r@Fl޼yi/X0Kmܸq>Jd`cDQBMy; Zp,I !p<6p~r^*1:(I%=+3BvH޳ f' aBԩSM{)Sy#]3v 7X=sN$$rS-ûX?:DrFIOF)JO.sI9/Y-13 F3F&@ߴpKJ!%^ )d):MKWveBOEˤb%1M9rs ? >8s>T.\5W^v-w I @ 9_&>sCfͲ8$bŊڀbkN:y}7:6Jz'RS*e xeN+2Vuo_l+xeS~kA^Pv@vl~`^{mG}/_nd;Jm Ef͚ƍGk}/yJk„ ֶmیC8}jAܙkz7OJc̙3Mo6`;$_2Le2cCO9oʽk/y䑥&K\IWPaCQ4 uu1MoL[ѡ{ѓUPþ.Y&P`o[Do9BQV,o6/yYgJ( @%ЪU+;sN2 B"jÍ19䐄U3'ȱ K%-x0JLm-:J7+K}ޯ>P'TF*輪I\ԧW$9r-W_}U,X`nm{]D"f3f1@!pqy[C=s7dС)̏R0p@m駟6W4;k׮^#W=.QM/vA876Dr!t-%mTʗwiK%tޣTK9|tO;t$G$T0 ֌!@@P|6'lmڴ'?CT<&T(SSʳq?: l*^Q'ץr_W%:״Ei"L>8T\Iw_L0.ep1kڴmᆶxb{'JӚ/'~ݫ[nҋhuI}M;A1JgKtAމ?13 @_o\l=χ"',駟uF';c-*4h… #&j) BoOk;UljCVo_yޯΫ\ 'TF*輪9N;c)L')to7< q|wwF/ݗ+ooo|JUe3͉Vr. P7onW_}}6a„kv|yy駟J˦oizRM'5kz{N&M .0H9s֨Q#]-xXHWv?O[i7t);־⋴}˅L^]/|%%j,iW]jRnW*yV圹s̩mNmaZ}( g>6 ( ("D(k@1a9yu]0+fQ sX&LH1 **bF ?o،zfzf:YkE`d\`]w:F&'>|x9rdkIy 7T^9a''=IJzz`<7dcnڴiPǯx݊,_X fN\GAJ[/_QpM6$ci t]O=T4(#I_sG S/‹G Fہj̘1:ch_~yQB{>oр_Uo9 . ڏ9]U Gu Zs5eŁ<͏#}Cݿ]w?h< Nψ#5ly衇F@tpDꫣ`^O?$uYj웹PNM<ſaNz͚5TvS߶Ӧ;QV:0-?^I]8O<noOPkZM? /} mE<  *dNhcrH4"np"k&ڻS;It5jB|ɲnVu1 ^$Ngy_?#e^ ^E*矲[ҵSyeJk5d\2>^u]I*x?^uR׫t@ӹ6NSRkO}' SiI>Oi߫hc\)$מvt'(.*Z+~g/'lmsWV^+6޸d}@0N9xm4qĬp(=sΑo?{Q9sxS]<^:T|W`L?t(ef"gHI=?SGǾpvء:}=7W^n=ztm!0o)5NceVA@ O|T8…yR!TRM^~em_A+XK-ǕLz?n((S=.SI-%Kx{XIm%e}?(߯yB=#S:_Y:noJ\Rk꧟~*7q_۫9eW^:vO7=0p-{ڙiMUm0>}-ss|\tqm|l\-N:hz뭧iӦSN^lWȄ 5$p]Dݺ53v5\H4k5š )H_ < @@@@@^J$geI$ H$ @ -K$ZL$F:RXנAA!q"XV Am!p9$i/m2'OChTe{/q,۪￟ٳgb7N@dͬꫯIu^vUWE ah` aPj6 6 sWFϻuOK.M~087FHj'/5L硍De++lxyu9Z'Bm/$ cF}G ʬ_Fx2_c6+b,׼6,q'G4$)~/_}ΟtMSL~k'Bwؿ!PfSmw< ND_kkV"$YҶ*Pʃ0?`Fr9뗖mimQc/cTK,I{BDЙ8Ëݻw?L+iR{9 Ol6m$B+{Fsko?P@|np3E~\wDIأk'ko_> !PXJK4o4LE9O=Դي6Xƃ[ҵSYe IKlwk^וT^s9^q2, 4ktʒWYIOY߉i'y;e'Smޏl>%ړF\R{?^^{)~~?ns{QH}~< |bUWMtҥ*urfB(C}!aUs饗;yk̙9rܮ߽{_ToN}eqQ(xw5#8"-7?,ow}|B⬢> _GO5~g>[ 75_ϓVRYr.KI?!n}E.K׮]ƍBb=ܓɿM6k߾}?OʺF*s]ϥ+_:eL5w}ѱto$]]aÉFsts' P~*v19 Vz!@,;Ac~I&z־駟&BW5N?pCK+^mjOI>%ۗWR[II}SNiv{lCbp}v뮋2,;Kl{ zvT'U-BE~ A"PBGAw7Cb} C[H:ꨣׯ[rVE<kzs|9R%@ z)]p0aB /WQk_($UHHk]vE!༾+:WTz-s|G?InU^(%];UllKWI{*[>-mqkOJ;N{RySw}}TIcv߄xo"ұcGuY 3Fsi /$l'L)j_At*$mʊ}nYH2[SWee}*J:rrU57^tK*_+B&QMV^u1TylFPhW}f<Kk Uߏl=2Ϥp{&Mآx(Dxn9[UjWUDz\L]g'S% G]tΝ78cT%Sm?Su\j*뽸le?|ɪ_>0V';V͚5mo&cZ]ǬJ;>rC=[oU!a<6O kHic9Y'ܿc @B- Ԡ)5hU- pI')gr|+Ƨ@@@@@@ &OϧNC+C/'kk$ w};j=Ƴ`kנA-i!ʦd(=9\XjlDY][n SN cwCRL쫐)_Z<Ά;Q3f @Fߥ&[ax^zi4yviurb&@ EZ)F*cتU(BA#(R]{8^ց?U뮻N+sMʚ=nXwzflmt=='7n\GSOE#8B[ouuZIBʳ֭G$ TTI'}$Ԫ(#P I{dB@@@@@@4W_M&} ߾y@ zqX]TM&uJ2jeh^!A$Ԫ^{<W^9PZk3,={,w\{ ɩGDAIUee˖s9'Jh$lMt+\;-^|Gz<l293oҥԩ#gCP=ɴرc{i}[o%id=@@\p;խު+R:Kw6lOuvjUVf[r"߳$t@gIz{-C>#5dȐo͞=[SL̙3ym9 m}˫k&ֶLqzףlO&MRݺu}q7jjذa&v6rD`Dr@Y3)$՟աi -{4~`tҜ95˼;T@@@@@'#GJI}$½L (℀XW_IkQT9#ѩtAJ' M F6Ç:' 'ꩧR6 :,8Q׍5̮**O?{ ) [IXŪ@&^~0d|0? PAbLFh"=裺 !^FN@ wktH:r/g@VEJ Pyhy?M6DmvڼQF}^wa%[tw8A7S pPn/]y啵[FFUkEB|8t ҁV8 n%sqծ]PӦMT |>cFAs3V[m-:k-]qEAURE@T~?J7`ϞUWeu1) Uy=rR>(]!:ٲ ԯ_?Ma2/$k'|rA{」6uY';ci ,YD^xat՜S@y`rW_=me|ކӧ륗^ҋ/^xA ,P-;j]v*・ZaLB3LB|< @ k¹Փ_aqeXCnM:)`J1@@@@@Z'1Bz1WdRvR0@l3G)e`BRzZeIGQM!2*_~)nF7uc=D${PƉ " ?((]wݥٳgG{<s׮]e>H$_2}'QB4;q$̕H9jeɁ .->w~3wމt- @}U֭,`…+ꪫ3Sv pP:D-4i^yM0ASNo&'wC'8\I?TjF!XQ@ ;7$7?>DI6lU佀;8=ܣG}4 |裏@*ضtYgH˨& q-(Sߏ2ypZRH8E` @ 8ֳ>G}Ϗi ݧ[ժU :dM~y\ۭJ%oꫯjQ_/֚kZlMWfi"VfO" @Eԑ|?EHpʄY и(YP       PkoLɤ)NbE3!K?bU9S9F6ćȐ;'kvX6f{GtGj]w矯3<3oe {Q1}DzݻG lk&%iU5?>_Vw,SLٳJ-َ8 imѪ?L842!TQYf:3׿5Jxwh!r_n)UG'p2-'8ޫvAu.*yͳd @Y[G]mG}'N35JD"[uj=~7ߜ$[9XuU){wE7aik?6ֺu> . tM+WnG|*h!K@QIﲱd h(Yp_w1       v2V6S0@!:t'D@_!v6$p2-'"V&UV6 87,|=SsE=؊<ԗ_~ Hޅ,Շ]C[ҥ'm? Psᦰ7xh5kVDӉDs}[lN-SU.@X{l)@r_[mU4_s5zCiĈ:cԭ[(iu&&6e˖EsOG׻vy'^mժmlv~QLB=@vP+^ᅲZv^@|̞@ݓ6OuԩQ▱a`ȑ# N>Uy5ֈ@ ,YD3gԌ3~ӧ֓cpS^ԻwohѢ;%@B:T@ 7&V6ʀi:ٓ     @O'=҃JC(*j P/Hw-yf. Z2VzԜ@=HKJ!y)kM6gSN9EJ^ַ*6wF ̙)Zl>8/_.p|N .O>QZ/=q-"?7|(x'Q-RCz`s=.x A@@jFaÆn9_|!'76mZt~-sύvrʼncǎQ{ bA /Nwމ9@gWzr6L{Gxmm۶ă~(o/Gz 'l'|uEI}x y5jTԗ섋 P d_E(9$4ܜk_|1_0a-Z]:yA_S*9IUC> *©ܭ%GYQFEm?q9ۨOBg_3FN 6 J>N:E}CC@V> }ϳfҲeTNk.J\xF}]oVC_+Ū dBIdLlm @B[W4k1&@@@@@@xd"S %Bi᧚ @lqb+1VFoP/*ZÇK'JjQ9*Giȑ;v.RnպBظ^|Q2|sB?<q:EL+HD!'TTƳV}_Fmf͚śb䝀`gϞqi=Q}vD6,JL&Dԯ_?LP Pv; @ 4nLB(mڴi\A*J5gΜhno/KmN2/jѷ/Gz @ 4A7|W^yE&L1chɒ%s~p B[_oԩS'Jv?)`_h<ԷjK %ЧO2VAU"Y(֎;FСCJ|^ʸ_I<O?ҥKu6l%rr-ndҞ\s͢m6KgEkm#N>Z/ȾWڵv$o_ݺuj'O遥Z +Фa!PH *\|I!1      @ |A2w+ܠ'uB0XOyZa S/$#c#,i"9@ճV`РdB+kHȨlQ0?_Be'9䓣zFo믣DZW]uUH-Zc}@gիWh>㢽xzף>iӦoעE}.$;v)\ l͜9S~ދZqUW|-+6l3NL!Z͛"  n+~B^<$BTnݺE2T~!~}7:^~Ǎ%}>V-[}+L eˢDX{u,{q߬]{'ׯ_}Nw+H G2"@&wU 9-$w t(<      @@%rkY*/ VRV! e̟/w4zt+i x{#Ld@RғOJuţ@T@.]tm/_ƌ46l :7 n=sty&@@@&l=z(u €z_8\|'^:ۣ|}z9y@\KiӦ!ҏٯ n]z x/_b[,ۀd-?y'Q.owРAEmotB> |oB[e'@CI<9u!G?pZ?nOML+`Mq,~T39tI |lٲhu_{I?#}UYfR Ă&V&A @ l'N;-O@ 8)VϞ=KҒ%K+u2uNVRqSXݟ9~OP XxuɳLW;r{];ǯc ulSXPTP"d@ԢE nˆAhH 0!     Jt K,)G+D@jU`Ri%'aBNuU GBCs?Ρϙ-[n)ϗ]v&MzHNs嗫^zQbmF[lz͝^R'n2e&O{NoF4w:ꨣ4tPu,hn޽{4T4H9`;8?| D"QGҁAK_~% FT@g?v4<{v2kiqyaDmCҷ!cu谖ڶ]7 dp\  @ƍNrۙ.5OǾr._g9T\viذat'ocs{BTLdo/,7܏-@+~uS\OkIFmT6ΏW[mlɫ*j>De@ 8Q~{GQ U'<<{l}nvqEKœ#I-]w(emq䳱Z.$Cq8A~*hp99V۶m{~^;D".Ԑj~&@ Z`iڻ4G(A3;&'q_j\>ӧN+,}qok~y5ה@. ?~EpjE!-i{qءN:= Nd{t{\׮]WH|o5ֈ?RC@jB \ |h q@m&\"     d@# /nYa tuA %BrK P3cͭrSc$B@iM|  8ĉ 0AXAZ~́yh4rhՍ7XNB曫sԩ6`4d˛5kVpwմiꫯF(x2!IϥM(Q|31@@uǁ/=OA81xHSN-^{zk~ʚx^zTuX^keNmҏX|rqS>d nʏYFv<@f~?4?z@)N/\>x9|.oK?9B5>w}$Ԍ3tBa/uL:^: Kq?cD-pC}xej[_'r{ކnݺ!]vWq, Pj~|@ )_ *q>ppO<      @|E2رR˖##ʑH1@,ji]adyA)^NC:&V ԑ'$V$ DuD USLf'5gΜDUm۶- v@ 8uY^<@u7*O<pՒ`@vSxxq.k*ۜ|Ϳc./Dq<xxtXSDv|\<9 7P={, LqʺuK9th2鯿*$*}>49rԾ}N>   d\ql~&5{Dʩ N܉H%ӊ^_5^/yWz_wJ//Kz?EįyMn{q@A/[L㶉8y~)|  + tڵVs΍fkgΜYԷ~]|!^&gs|>K/yc|.ss?=~?.}-CD~''۷oQ"uYG͛7yqE@y \)-D@z©N~jU0[E(K n؂Nn':Rqjj{/BP?Nku[JjRᶤNq{Siݷ>Vu/pIe.ז-[V~xveYS~E5?v9/} }Kmc/Y&}Gf~( y)=,H.jW ܿn~2w@@@@@@R׿n˜`]ut 7Y@@ (0AztfxM&Һ떿.k P%j| p]v%Oxᆱ{/?M8Q}Y7OAv=Kʌ_2](g6Ar`36 n:J4du9;t (*&ܩS?8Pv,^O=MHDݻ(^lA=pw_^AK<;u#W;si$68]@j/{<n]֠T=8>'(F;_R{ tq@J`<~ T'%?HÇ"  '0OSŏ@^x?vp/N~<:9kԒZ>- ?~\|_.^q~/},yVuq]Rm^ƳR4)xݒ3S\o$ݶq>;#R_#~<51!P\  Rv9  <ɘ9*~.ZyVc?),1O]||'=2W9Qjxz-)5AY~+ϾNTb#pIG TA`PG@jX /kѢE{ݗ/˸Ok~mY_}UQk;K$O[,Z%2"!xRcK}vxYRkZj[W&eYKkuqimb_w{ߵ~?nG2.x^*=NvSxm5cƈOh[/6ҟI}˥. xR@}!`B,pB-e      @)^V]tt .?\a u)e@*)ozܜ L8febKlpB!\J|p}Fsz!Syg+ $ Br".֊ڲe(m}jO7B 6?~犛yNxPx< WM]t^sH+9c׏zsK}:yu)Dzg༾.'!7O.@B2DRNB *1==OZ}Rhj?nDۯnVq?kzۯ2n+sYy3/Sg>_/6м믗8cwMnQ߿lrEZr(' @4lO9T$BL -\ՠ      @ ̝+]|4fBpK#P2J@@G|0 CF >oCEX4|R:<(UCdkI= I-Rh_r5|vZ*   @~ :@S{Nz1$ J@ʛfTY`w}*o  PS=MZed|>jBr7Ê ґj!d|]v!P(K](5      @v ̟/zFҽJ]$}t$#G@=A2$AGAmͲL<(;0j# @'{K&͚%rK#-fI[nMMO>z衇JZ-'^U8QjD[Ekv Ҕ)|W@@@@b*n2'+-(3Tl@uoy ?:l& @ L T>\MeaäoTKj֑!s&k:X; @9Fz*Y> UX\:=ރ'\^|1J\~YǤJƘ|si? $K@T ,Q, L˖I΄      P{_ 0 wޙ|DZ'(j핋=#_$_VRÚp _%VhL $=ti&6@(LoudK|"]}uTZlR?opX~{t{N?iԼj3~Br7JRd@@@H`դ.J^cqd֋eQ!)J ̜)uTpզ y&0avmjUVrt-ᆜ@V͓5"lv U=zH}H\UŢ0 wI;$]zi2-H ^C>{M,[ﳏH[n)~2vxy}OjqV Y.Ф'&}w{Z0_@@@@@@dPX'Һv?N>97o@Y= ~pIwRPgB P雷s@3G:kM>d`f_k0U0^wu馛 K;kճjF%jj{R:u^㏗BI=4wԽ^GUs<   y.йرҽ&'+MVx @r^z%8p>իW 'cΕRSNO}-Zd_( )p 'Rf97 "[RϞһJ/,vXּ_?駟Sse|uF.Pr}OZ1 @6 4n0P3KH(=zo2      @M |INu҈J":@@;(6 PkM~E)ƒg'j`B@fϖ:*پ/}t9RFm.p衇Ag̘ӫZ'n]iٲdi\2C u:uL    PyfΔvUw_i?$H$OT @6 i4hР޼J䓥{,~%TD`ґGJ<#5kVl}گ9Z {MS%}9RZ`Uij *иq2mr#O$ʧI]@@@@@@ .LpڦtuYg% qQ6@ ~A*5RxK3DTdpsT~|@|xUɌuKym$WJ><7:g裏 ׉'KFSJٴK+F:ufRtRңC@@@@vK^(]vY2OWx3| ^rN*1VF@ чHk;:V=fLpݤ)SWY"@:NҢE:k %paZkI]TX Ԅ?JÆ%F+$߃/S+H˖KJ+AJ\<;,}} XR@hD*0EE @yo-6!&@rE੧n!СCuw@yry풃O3!@zI͛.k! PHw%'oB9uE@zܷ׾?M=tջz~okg#r^}ٳkjN 43! @M F jzJhHZwy@@@@@@2I矟Lu@3NK Vf|@ 4jt R&.[B3f$H!< {'r@xqmCN&-[&=4eJ2iJ+U>jfQ'O%ѣ&N gVZ[zdp]Β~9K L@@@_o?4n4uԩtUv(>E!%0! +O>Kv[$ӊOzD'_8P5+~%%Z-Z! PG%l)Y@L Gٚ3:S8u,5m*R>֮:%qp{^KSZy\ @ P++8j!      PKҥJ'(9?!f5M# Pѣ%KSOX4yGZ{m?jY&0hҥYV0 @ 8q=HnAƓ&IKmWC`72N ѮPk@:y>y'e6ى@@@@;$Om"D`Eumx @ Fw}wᄎ[ʅrUGZN!~y1ʅ@vRQJ @ Bқof[( %V[)[]oc[@iWZIzk+  NKEܰ\ǀ#     @ Zn(]xtK睗 5 *pү* R Vm_7<;  ㏉hFI# `{Rn u\iZƍ-B>(+҃J?,=|2Y3!   @:vƏn-yݡWI?ym|@]0l0|&IgKv ~ J;7N業  Sl'pB{@**X"qԥhկ;찊n&q9WP>]L5bDF6F@ HE ;=-X\/Ԯ jן#     @n 4jT2KGLuY+J _9V|Oיռ;xM=")AH)K /]pp]N;J4{tMRv[nJVywQӦMSݺuճgO=cX}r`w!C]J8CU   dKN4ttA6$g]A)P L.ի'9Y *Ci1cƐL؁jBzYow~ 0{1cOLy $G@rUZz(w v @@@@@Ȍ/HW\!mt9ҁJNuRӦ[A@:͓<83%gB:fHnuMcl0@ZuU驧jf@ 餓$sbnGn߯vWE`Y"j8ѹ馛t 7hԨQq7dI骷Nkmv99Xk@@@_woiTɁnZr?!go%9 (po>c5\E̪2u옼#-]Uţ0ԪmѢV@'JiXi)6E@t}ңJH$teEmZ뮻nvؿKСwKG4 A$ԪD@ H+d+& dPZdS      wN#N%o.u"-i,K@Xƍ|q%Z 88Ƅ@ Gz\F@w??<ٶ҅:%0re]~_G%pxb+ԣGQ;ҝwJ*mQu*   @ ԩ# .ԫW2a3!PKݻ! P;wuo?p !ϔKIO?-z81VB Ε7jRA@2&K"}}6ˆ@_yUf vzj5'͟/͜W+1 V~_j $C NHpWp #     @9KHGKmJg!4{t:aF@ Dsϕ( pB.]kl4Hziٲ'{B@ ӧKԱKuI}$5lx/]p"CN:i뭷ֵ^\WZY"$ -B+[D6iOQQZH"[NJ ,%|13f3sg:̽{߳<{RBrŤóG!   ewߕMVs= i"Dȑ#ձcGu]0CʒH o-K3q+`ʔ0@rEץ]$>S /"İ`'g5hp1>Zg%>\?fFb߳yo!#bb[zb]Z~? @ 'fOC p FSK@@@@@@ w vtLb̆' D@K:EG}E |5&V,֭g%Vi- @ -sΑVFFE4uU=o,-QGwf=@IDATɓ'ؽ{wuA;vKў)HK7_[&!   @7Rn>?…9˓OyW|Rժ6Z Çu]Ɛ߫~nC"\s<;ҫ#\G HtW  S# "xz혪:E@ les>D]@Q˖-ٳ~[^˵?1j+;vju4n\GDP@ VœjPҶm-@@@@@@Dسǟkl``K/ {l"f@xXH3F[*P ^ZE;Q`~?hYgEcY ',M@H ؤ.'o,M(}tUR~7O?Uխ[7+Rդ(^$={kM:UjիVBr bJcח~%e   (prP~`R . .g"j,9駟~Ҙ1ct&ߜPՓ֯l~#)5l(77J,@ g!ĭGJ[mh1%`GK'}~#     @b+ OViS?/K%D>o+-W_A8#uCjxMH D}ĕ+KmH+-Z/L|)kj*5s(ÇWLK)ģ̙N:]v;gϞԻRK#Fe3i   *o$u*TreDBQ"@@(9T@@v{LO>$"a6%?rd3';b@`v?G1PY @ .,ℨ[( UB@ nY8Q4I1ӀTlYooq͚ҡʍN#]~{wDz'D^@?@ A8Bں5AO2{?Z=;@@@@@[i &U Fo^yErkŒ@~RM !P䓥Es$G o, Mž6-oʣ@2n=?~ԱdB?>֭SƍUE 3f *Y<'P}8pF!CN% N}̭@ !N#@@@u%ŋT|пS@T ~tQU-* M7ݤ^zO@ir}I;K&M@lפLh@@ N9Ezmi(b@<4tryi[Lz7` [9D:zJtgw"O -pҖ-m@|/|P@@@@@}ޒ*Uv4֬!>)\@-DRޑe'Ug$Rik Xpu)S⽥@ v v.5lk!gv7o7QGI&H"iV2ꫵdm۶MUVԩS3;~\01O?P#!   @x,ҢE~+'N O˖V-6K-@S`РA[SOGFFQtڵf̈QrY`&ҥs G@ 5yFziڴ8o,C@?jl-+AK+VrZ)D"K<@Dش, R՟~-̮]tarʔ)<@EՈ#\0WsϩQFh+%@"iLi ⋥m4@@@<QO>V8C{vfnU^]K/]lI]N~L{IժIKk]Ek>뮻NK,9(X>zԣGgy&@@h;#@ a,x]ܶ-aLCj#@T *      G\{rI_-!/ @~?$!W|ekU)'5NF<@ dT\)'xpUm2ߥK7x@} 3υߔ.@@q tҚ5R6ݡ> D-HWKK%Jd\g}4T*Uv?xhc-s̍$Xwp :fE~q[$3gϞ d[` eupԷnJ~K,@ Z-gz $D߁DZޓY|@@@@@Ȋ-r=,<嗒ETH $_I+]tzihgH-Mnḽ2@ ϗ7lXF#\)u$x_,~'jJ-҈#F6A7Z 'U^ s Ӭ&ۤp"ETR:㽉߯=Xh"){n)'ퟴC;>pEUUw߂lYJ}mZ$_S9J=zpf])Ẑ@@@m+ ,]{d1ԑl|X^%玴:lr'rE@ O>GyD/n6i/f\馛\tDVJ}-]wԸq>o ޥKG @ T$M"-\(Y_"AL.@ 1 FN?=6pX-xֽ6dc۷o nh[c/6wnrܻ?~OsU^=/kS裏z+v+5.]2ڋ@ #Y8e# (۶%mG z,E!'!      0~_H]&%uV,Ԝ:" {q.w+HOZɰ=lBMvsH d[`4g9s-}(>Mo.۴iSk;W5c/4W)"S]hÆ С[|ح>,wmɭUZ5*ݻWvСCkɷ/]BzeAX\:̭kzꩺ[rpmk(בgoFoYC b-Zx'g_7o /?\?뮻3Hځ;]puDګW/=C9n P+W{mjذa<9{N<{,X@={&'VYn ,٭… {y^-{]:<&ڂϓ&Ir14hPg}YvΝ;Ureu]e˖vf[۞~餌~7H0o1O{?SnѽIg>I|Ľ"TJЯ7Ku sf͚j^/{/3&ik֭ߡ-[I&^^+5I;p@@@t:žvB.؅\}uA`fGEqC8S @O~[|^<-\"EcWX'@bx]۟@ɞJq?eq ee{?X{jʫ=ܹ,UtEyAM·ed3z^ElA{/>O}LhР\_nl?%XаqiI$@@@BpwP?u!U$=4#އg\?\- [-k"ʂaYڵAV..X{7n]ߛ;vhذa^Dp;Y8?ڵlOy.r2>3<]6%VZ2lC@ |6ǂj͜pÉH Č-r}SRÆc]}!ݺuӦMo߾\tr˲d=S)Eh租~u뺺=r-m&LƢf6Vڗ<իn۾}W׵u]wn)ozc}m.@\6F1&U&Q]m>}qys`VWm)1ӻSGz!rcۋ 17h (V,:4BSl sLGAx@cyp;O>MG@@@@SIs  Z>-ZHߦM@.].R6DNai̙9޵k׃\4\G_^g\8X*y.pQGᅮgt_?2%\8ׯ/%._|-m^_NNÆ \୤ͥK(Q"q(n/7|3)?Gno[D9&`6yǹEEM.Vdɒ-[xΝӧw?5|EW\1]`BVJ!  ֎k7֝Yz}Y }ŋjUǰ' x衇7x#O:餤laѢE^￟Gw?}^#p@˖!,s< ac;|q$nHB[#@6M8̆FnO4&"ą 8@`/{ -[60m4*858;r16Nݹsg~5XPZ4a?~߾[;q;v76:R߽.Vp?)R$i[Fu1OI;{/x;:ywncI[[?٬Y9h@@ BG!m)R~L@@@@@)S5K.;NZL7N:( @@ ϗ^~Y(8#Wի6Wxmʼn#PTdQH d$RKիK_-+{nFG|nڵk;O YcJnB^ ؓb?{pYgoiȑ#&Muu?:S&7{Im֭|l?-?hΜ9>VWKF { m_rH}s '^ %7 Z.~mosncw7{s< ju&׫vںճgOﵖ Qޡ?( vuJ.0pR=?ׯ\p*رnVURE:+Zhǥx5Ƚ'Kw}Wn½z>[n]Y~f>'I!ne{{$IzoQ.[}뭷-#FP˖-<1{NTjU}ᇺ ;iofu-T\L TFκudc{=7ۛ1<ߺyʕO$ iFPkA $kom lGj)7`'zDM@@@@@@ qMRrK &*' -G@ -?l[ni6+7Rr!dب+D{}Lt]RfrrH*e>'+CpMF:th+Xw&[Z$楮-j*;w}>-Nd,cK(#:ǂYЬ2,V{W]q5k}ѤY&=g'EM3f$_~%[7YdϏcZjyu{I^$X~gynJ goذaV 8 x=HWvԩS'jժ,NR(kɖ   d*Pb亐Z=;Pu#~" ]sϹ]@fǎޢ,Jgԭ[7}^y)kO$"`lرԙy.Rg,@@}x@VM3G'57J!O@r.`׸\\x/xQݺ痼/m[$ XPy7j1OzcQC+kyQG>X#Kƣ'M|+-ҔKrJݼՂpe߲eK mT~X~\.rŋDXZ> =b6D@{=h9#@@@@@cvm7MH|5j@PlC~:Z.҈;+)}ƸS, )%x{5?H/,tR}1xϛ7/)\`WU]``!87iL)RD۷oݤ,Us+ԨQ dvB yAB c{;< oޫ-lh Z,-Y䠪"mڴl>[\(;_`mҤIYnvM_vmc٣͛73L=+=X}z饗ԵkW5/\/{Sg!Y|7[qÆ ;Z/{_-VI;8Qҥf}l}b X=k{ҭ>ޱcG 6vt^zRӺw^/;#kuWxoMZ @@@;J=$]4 !] = eI 䆀0@o:tnLj].+V3O`/}W:_X:y| emwЛ TI?_ڽ[n|ʙ|@v-sn|0X4>d2?֭[gꫯ&`򪫮:'=o.Hn,xH Ԋ@@WZ{iy P+ 5B@@@@@ f̐ԑ7J->HnQDR dM`,7_[;kDz7Z+3GB :5eI l(eɻw #'=9Nj3gw3E,ձ4x_qT{t-p+>Z  ett-8QV4m4/PW3<ws= Gk:SZ|yR>Yn]6DZl.]z^Pjn+5ǔ[jŬ.cח./^>Z[lѣ삁6oޜ45+W8դ2k-e6w;~v2Bg׮]ugxc9c+aܘ̃> ;ȝB@|jJ@ z=炚      HxIzRÆRѢ…Ҕ)R͚@[@Ⱥo[նm֏)@@pjW4 ΓNZR7@G[z] (|QG-Z>ZvF&M@y*Y~ez'OXP`k)xkmn[\[xq;oW^yŵ –i% UD /ұ cO5;(y0w}7)H\"۽C݌nݺ:UF o_~ņ@Q2e_;}]ȕ`LzӧO1?,MO+V>}{& isNC#Ge%by\8/)E<-\ozH6ߒm{D_re{8-$`z3w_}^J^c rCh0P$ϛ   TŊ֪UR.mI/}y\y`JyasW97.'% Y>]nLaCIbƜ.]ڻz,jZcmmK>L{9/hWFu|.^X˖-[{1vZ?-񵔝1ށ*WNzEujk@ n @"$p-@*bL`Р@c8 ʦmn;uj63Hx}'艧     95˿Vh'6 qd @B

    зo_点ޒ _~TkޏV/{ӨQ׸5kz7?`}$ L.Y >n .̫ٺK\ ۴i:6kOoMy \q ~cBA0l@@@ _|Ԯ(yg }v߻@sß/9"$]S曽kZcǎ _;VZ^_a]k8s-SY4h o,ЧOܵy.?^]pB;o5M@ ȹa`l(ӓh@ srWf.|'ezL_~R;iEhTX+fc]1YFcQ3+{PEmp<ݻ7'Hn״bŊ6ll\ غukzU-ӻևLvIyduuҁqÂyɎ<@g>:3 q#! @$zL/D错W/$%[^H9OŅ IFI.4)D^!B      ̝+)͜)]tNx@@ ++VH5jHKݖ# |TdTz'GM`Ro-\9jG}@rC`2gq㤊Z*X07JK={Ժuk-\P?֭+|*N[,P.Ѝ\@,[=Z  xfo.7؍CvKn@,Y20[޽{&)_~Os &п@xBBfL{&Rɒʚ{DzE] @ L,Y_VΝKm.v]cǎ 5%5mT+V駟wuԻwo߿?.hx@ZUZo<.E#@@@aҜ9YgIO>)ÍwTn U"D]Gҥ[ w>,ӲFmڴIJ@IDATQ ڵڴ <@4?7*S&jB@@ (Plt[3" {%ptY e5zTR%5o<*9s̗T97&M$eKCKdV9 V9@X@s"@8NMB@@@@@ -Pڵg̐fϖ4HlZ @NVz}TX1'9q,;—9! ]X-uDETԢtҼy~R}饗aÆ":sBy$PtiMvTbŢ~=dI`Z-_O |~>SOeɕ@@@Ȯ7|/tʧʧ]C|O;o-)H3q HLs=zƍ {HƏVFm8$+<]cuS:|Kkn|yb__!l,ˡ$@2'RnҵJ7ρjR@8_c³6lYSޟ^Bm_fMgԹs۷o_>n|宭z!@8 33B@ X@{;Ev,{#@~SrD@@@@@ ,}LcEM" ~cӡt?rD ʮŲ@G ܪU,##%#}teСRժtYgދ\%b#l3)nlw߭ /Pڵ?U۶muUWEE;O?,գL2k^ 褁d,e;;   y!PbE|a.]z-=?v7Xd:vv?s2w\0pJ~ $`v>a5i$ͷ7tSOrʥ$ ڱZ͛Ν~z≢LT zh Mz! @P[^= !-Z$TBV*!Ĵyei0c֔W#GA wٲeluiAo㏧KBl`l9Iۯ\ԾTZNrXȪBB@H X@-K۷P˗7 Vd)@@@@@Xpx ?H::tHD@\`Z^{Ə?TFrTNÆ st<GV .̙ M{w#͟_]Sl(7[$@b֭*Uv?/pCW!Ĕ޽R׮҅J;f6~H(P{nYjR:QR.r㡥o/- H g! @ ~߲mⵅ 8Hi˖ت3E@@@@@ XP@Xy܂…ӊYt@xX@[zX?|iO~A:Ī@Ӧ~ X?FU௿}-v~6ډ'paW^ĉUxq__4h *] z>(@@@@S.H-رc_iӦ3]aWqzժ%-[ @.v֍@ {ݪ\s&LI&8ṼOZj;wѭt[wA@_eDK '`qJ͓nMMjVf;  \jZ:\iy Edʓ@@ |) Ԥt˗u %yĞ}rW^ݩ1 cI' =ԩw|@["f]K.ѷ~?_)>{އbŊG(_ţݞ!   Hmڴї_~!C^w+n<ܽQu.mߞHֹs% "P|O +`j/G}$ IB (PR%w iJڦ_ ~qRr@6m9D5H   I}H3fHKH+KSF! @ ؼ'yw]KՅ_%0M*U'  }9I͚I]Ϙ!ڱ @J~qrFSnQ ٳx,㏗MD@B@ 1哶oOJ]Z~     K+*UkqeˤK/\(@xS5K;V*Y2[KbQ%x}⹣9(P@jP"V- Mrw'~IzQ? bnI {?/_PΝu]w)^s~ gkknݞ\(,@@@@  1|=UϺ0NW/W~ xg#9`ZW^yOeLu ٻoI#PlYTk*T8J_}U}n[]ٙMR2yX E! @ ḙX!m*B$@Bؽ{.2X M6Mu 0Ip%KE?U*jzjh\\6ظQ*]:Up@ȡK6s .]f q.ືԽԦԤI76FWclYT8ʫyRvQ~^\P+.N#@e'V,?_P:^vv@@@@@ȺUUWI+K|#|?x3_  _H\#]t㍡Ǟ䵀:. ec, @ K[}Y@Қ5R׮rFnTcǎ… ?ѣW@.tYթӋZx=#{@@@ȡQG~iԱc~l|>='fIG-׏  9նm[7c_;]kQ~XΝ5k޼Դ\- hmt l$)]u6  uR+k'O*Ug='@H矗֯ HG;+V9_XaK{J'+@@=w@ N''fąԲuo@@@@@H< վtY_K#te@@^_-ե|JD +ʊƣqߝN&@ 6fΔ5jՒ6lƍj 6PKȺ@5|ruݤl7+;Ґ!׻C1PY   qА!+u%qjҤ4_)#í_ /`ڴi!;,PH0[>9-ypظQ*]:\ DZ OʕRfݿR#]+G@ZMziOd(;@z٩J}6d.PcR~Һu }jeߎ#@H&EZaa$@@@@@bR`G3h/>|,f'J#Ĥ_>@*T(&AD ֮N;-AL3HGiSZEIϗ.HڷOnQ=i"U+r*;L\d>S&L:UnFk߾i6@@@V2{nѽ:ᄆ^?e;R$Ε <P. @ڵ]k O>Q͚5c3  .3uגpczZe˱QXK6Ie$BKi# #po}ޔ^: woiϞ1 mYgIƥyZyyy$ =ftRJr#_X+=Vjι q*@@8=4+&J#     #o:v/[&%}Ԯ@HG~b^+'KkiV"/a?ԊhL駟"]G__}sK/J[TOSao?-D.bק7o֭[SNf+Dqϐ^(=`W!   @UVҥS4}l@N_KGVᄏ*c˥[~Dl?mFH)ЧO[.FhΝߥZdf̘իȪ@\pajܸ&Nlmg5 G G6&ߥҥs # @ X?,hʓOJ+Fie @Y#rڶU뇐V-)+Œi6~E=e{?W`Je#S\\{=5 @~SrD@ K;#Ÿl`* @@@@@[*U/zKW]%gDM||Z 1-[ڵARV\{?h|D餓R>#QZzj4֎:!wuHEJӦ]$kۄc|yA{@ -ĔaÆi„ :u>l}ib[$o=0sf*@@@bHQzZ~^~yލkoʬ{dG??kTt晱Z 3_ܪ=AׯO%\. 'nj0 0 ˗ύfиqu-i_;OoT( R @W ѣrdc4Z֮.@Pu=x/Ful;)+TԡҶm~;]s1ٽ#_ح;Bb%`=7 @ A 'fƄ@bR inL4J"     A6 A -2jߞ@Za@0 -Խ;2M?^noF۹@4 X@"Ee ^(!ˢ@ yzExrT7oK+'EPZl;O7M7ݤ;C?34ʽp$ EB@@@K}r= _~U ~l>[`wg,x6@  hÆ ^P- chB_g̘Uf/sB ɓVǎc4xE܉任MϞɷr lQ;0) H  "AT%1+(J0!PT0$@0AA$% Mٙ =3zzz}=-mAD@D@DUp&O(Rv@hC*" " K"E?zӦ@Ά / ԩ{qd_h n9=4x>so@$3#!" " 1% AE JV" " " " " " " " " " " ۶WvM1}:0ld pTD@D@D@bKA~0A4 v7#c m]GZPڴIh#y3n]o3/OL4q@۶?Yje^WD@D #FǨQp:ujklW`Ŋ&╙燇i0sf<}Ă@qձlЮpUKMw䊩X<~RHoLg7tPS(մiSEY~>x-|u> ;W4n=0@O_R툀@V0SOC5kŒ'}" " #A1D?a*Ur]=|Ww@X_ j7uލ> o_z" VĈ@R1ڸ6+"keHP+Hckxwf puQGp0(![&&vbZ v QV4m@ 0#cm_ofJ" "o4k^ϞGO? ̌ITVD@ o&lРZlݻcΝvG}$)0Sƌg}J9.OD@D@D@D@D@D@D ⋁F۶aݻۤHr}x&A_K }_9,Zׯ7"0rH\8j)&S'1ڰ!Y0p`Lw_~_OED@D@D }Pۀ+[n Ǎ˙95D@D@A`@|hPhqR5,^^y%{AVE^ƍڦ#" PP D@D@D@K@Z寽@0 jg]&l3xzeZZO? <:{ǿ@ ,]d0+ `ש㖪!@qjՒjĒ@cm[D@Ӣ]W ɂ˳I$leP$ǁ g!ѣG{^z>2n?3@x75PϑsFqڔ@ 4j{晀8Əs}(ƍ w.^w+\8%K^2ګDJ$I_ʖnͺ\KD@D@D@D@D@D@D@D@D@D@D@Odt>}RyX &(P&0n0p |y )q"oZ " " Jo?ws`-[OI>? 0g&zuOD$yJ޵O'O_~ m{l`(u@;HD 5T2N:$0AgpN~b]v=O>(4"" " " " " " "z; xm\9"[ wHw/0cвe*AD@D 5vp۠~ʕhѢ6on5-<8@P:o\0;m$ пb4 и10m0~<0P~rٲ*{N䃢ZݺCd\3" " ># JÁn %˛o߳ó7i~ms_k}p$@t@8&SH<2em@D@D@D@D@D@D@D@D@D@D@D 3&R`dcSO $4q6uID@D@D s`[8f۶J55UWH$ #r ;*" "i3.uv֭ŋ d.8Zd 'Ť_|z /  aE}-" " " " " " "}{`?]tQ]_}H" " !0ۗ EŹk l/E wF9Gsݺ@LFE + jee%" " " g`\P@ `Ĉ3F`РID@D(UP4j')cS }4p@ۚ%.|~ ~{ 9OTD@C@Zᨭ@ *yބ~("EԊ"LmJD@D@D@D@D@D@D@D@D@D@D+ƌ Php J@%ڌĉE 3PbE੧?XCE_VGZ:/jMb (_ED@ҙ/">3xt׊]IbYW#{-Ŷ(59*:m[Mԗ" " " " " " " IHBZ?x}w =ܙig5kUzjVD@D l߾}52?Ba)t?l׭H':)_]Q;;>}_Gߊ@$;QR$kjt#gK/,x7/ -EFD@D OQ)S`6=<j ޿LYDkti;#Z[vD HP+Ͽ^D@D$僓&<0"ݷo7*" " " " " " " " " " "7\{-0bD 5n|3oЯD@D@D@O}]w^H`IFȑ0IA{ʕ ^SE(E8'Ц >@ED@ґBx޽HH,"(< ~m2SP(վ}{_>5u.$ÆEwښ@ to_]uJS~DA3x@x{,XШUPO?46nh'6>srJ Na(rs?M&U*믁sC}e"9M%厜t$@1צMa| O"" "#KCq&V>hGTSb.+qYVӂ(#S1#QM!`*" " " $ AD׾E + jeeݒY^Ŗ-u[E߉@t9/׫*" " " '{E?o )ձ#Y%+͉P$Z5K-D8,߀KtK?Me'ŖÞ=o("ڵkguٲe-B&S"Bѭ;wm۶&YM6j\{-0p`f[B>7$'`sha-}O޽`q"Z @ժU1d,~=(Q"U\nX6U$@e}/g_1nTo@zPV8;=O>]yDX8wʗspB"[}GJA{1Yez!P4p @~ 7+HP+-8e;$訪"" " " " " " " " " " "x&Vˊ+KuD@D@D@bItg1@LBCG6l^8x~"I`*zlZ-$Ppaĉ܋-" #g\i1XNbZL+j-:f߀#Fu[d3h.[ٷ~{&[`Gqڕ@L PD sx/Ϝ7>hd6-xbSD@D la)9;駟Э[7smO" @-a]Xfa-92}*"zL_b@D@D@D@2")<ɚZGD@D !Oy1͞ }t&;Com R'cfߨ"" " "HNP? [D־}]@njș&Ogǎ?4Y vó={{n[s;3jNop7>c< 2רN n~f % N … g)bv<|o)af&Řc u| *" " "+{}ݻ7K?}}}p[gn=>ro_>˽}T>U;q_C|se=׆l릢Ef2g>z_ٽm+֭c͚ϺU&Yx&s*T?|0NċGJ* . b̙&+E6 rwp}Fpp+\3`N 3'\jr +~ա?S7}7'l:hv6jօ 'Ʊ6~{yX$-+Kcժ Ɨ"u)>?%mΧ5&ܼ#MuauhpP;gη-s9f;ц>nn\ǣ"" y!@[2m;yڙP5{wxwow[{><ۡjwovvew?vy޳Njѕ+W52 |r{uvcw<& w2%ҥ=zO= Hl̳0`Y[u֙km~zزe nj'߽Wrm ߳3e˖9U\$jޯnl lh|@H(9?'М @^9{>z한~vSQCM=zǨk 5I.2q-л}fn>swag 얻gj})kgd|2""=k6l`nQ=9O1xw/s-ּW$j昝cB26Ǎf74 7V4cíO*#65k v_~oh)Ui@#no587Dۥٸ܃NG;{Bb[aܴqUs_%Eڻ$/ j%SE@D@RRD0RX,ߢ t"@g͛7g!;m3dNt۷ot. W0nS/ʗ/X\MbCrlS('jCuy$罓s' :s2HNtW~ltA֙t\J8|p,Qo ,Iqj(ի8DKE@D@D` .8sMb@TBLf{|*,|>pC<@$~>3X.=~:Ϭs~ g6S̛7W_ tR2a|n3]psg}[f*" W:)jz 0d3] >;ѮD{3Y7ٜwۡ-&R~v6'>r|FsϪ-"|6uϧnϫ.8uy\nKl\Lxk<˚3[[gN3SM33,6Mwn7ϸ;og g=Ɠ&wɴop]jy7=4߯bmipΩpPwY3lkp#B{m!}>Oxٯ5y?q{_>Ėߓ7A*mED{)<*" " " " " " ":{kg';;C#xH PlQc;m 8ꨉWMvڴ9~v.ykvuo!p6 FUD '&|}w<K=^x_rgFt/^%Ke֏mUT׳f͚|#o8%>S{C?^j2$ǢvS5[Oub HP+wH'lt__`b7o~;Ryf-sUvLJ͜[sF\$cL7FuKoƦ98ҍ]߹1_sϲnug7r7:6nލC-߹zִEҖ}r2xGRx<'^2^閻6\F*"L3h";^ݍ9' #7:C86#Yӎ{{_쬍i}gk6(}xJl|^M .4U˽׃mڔy91} 8s(gukhx voRb\V:u2M.xͥ[րmsu"=ԊKmID@D@D<zc\~Dv~7͉$7n܈M&*NYޚZlK,.t 59G\:cKAGy\"ŋcÆ#Lr3J㬷ԼK8p4فac XM QM*U2+}yPH]_\?Ͼ>`&|tSK(~}{?;&ZLl%~V-Z[vD j}\|qjFxHQ>[\É67sogvۇ~x=ٜN @o<@ SO/jVy$)b4Ͽ;29 e9qc<+ U9TD@Kr&wxgo3m(yw6 g`??\l׏8FKЎmLpKC\oy=Y&S\Vy ,~}fsLRE@D@D@D@D@D y pN{%8t:=7ϱlB]ή([ji[wCjpFZ+.l/BմWm0َvpg*x &g9g iMl:ZYW&ym?. )/(iPoH7o#{~ ٽS}%K.yssȉ<*Iύ17hby7~ ڶkb2FD<:t`wP|k<8].^C PÆ M3&$ 2ٿ*" " "x7rBe2~vvJ{l7~RWp|U|>L<2fmA'9r gr+9)&S_ enlWp>}:q6g`ltc"NvTD V78||7rla^shxbq/3MQG\+/<ܸ}ŊVkرx|Tn݌:J\+Κ5+c={sXh Ykem(nUrW ߜ>+p6>\.Yv^bϡ@IDAT]'po?%cH{#fD@$Z[L~ule xc6+髤% $AQÍ13g xۿ>xԼd0TD@D@D@D@D@D@D@D@D@D K*zxlj-tXub tv u#+UOAtQ5*tr:(3@NC(]kCED@D_$gw 31Y㽓Oz[`'{~07!}YW+`)oCX &{QAq["IE^,g DZq BL'h?{lTKTD$.ϡrly|>D9N⵪qPTN6v޾sI]>ͳ9W"AR>wy/pwE@D@D@D@D@D@D@D@D 0sʕXjUƴzj;O!--BG@#@M'jt2 =UR]S'e:ӱ[իW2լYSAE@D <>nkog wIߧtNwD c뉓<}{.10#@55'y䑺|O? ؁ I(6h"w? L}B\B9laNa@>- d$s |泪_R\q2)KUP%s5o>+3+hi7u*W?k;ݮ./ 0iǒ^2} R[\>g$;8ϾRڥUD hq}m(Noe3wxm(xͺ>\jJ볙>WJk:ڞ&^k#&ui\"pKF*"h #l䬃0$2~Mت@ 0,mnZfw|G .GPwNG;j6>^DWg=Xw\VH>!@qaĈ4i}F_I&fk&." W8qbfڷo/ؾKso&I6Ll?m ?΃Z!H@d3WH:uЮ];;n| SPwX{c])~YgYG2Ϡ;Shڨ.r\x)Ä>F m[gN㗠VϿN[f

    θ,|XxtG۾d1^n0*" a̜ 4i;ì"% g?{yd9ΧkN DvȬ"D.K(iu7|6\r<8vXR,8>5!?B'Cد>D#: 0Aߏpؾ}{2Y;Og}VK39PJ@ Pc%L:X&LI;BpĹk c%TIF qqoh;whѢ#9; h'w1y%0<'+OvNw]6M{*bp9K'\OEbI6cSkn5'>9-&=~esm&3f y+sDa)&nӦ=7SrSL 'Nh! /2+W6"Iv-A$9Qj><)>h۝|纮Pʉ.k<vUD@rO1.?/^ۥ'{X^?xچW{M"1|m娣%\;5JycAOO>ĎxZak'{_uW_}F7nlYzm-U O&L`E)؅?W]u_%c<1)UϤ+'ʉP%0?LO?Rq>'^G猓/aÆ~R袋skt|[alȸqlf /^W^y%nԮ];ȧ->L :ԧ Q$㣓@#NXKgdM +) 38 et<)""?{l)Kiw"om#F!C0k,kh)uqE[3gbȑxQ8sNIy=x oCΝV3zh >_~1馛ХK)S&iq۵y.pI{jx> HP+%wvD@˖0z5>ې|vB"h__{-p(@1/dCNj͛g+VXL&А<! ,l+`BVkP\AĠ_&KaB6h c_>LAED@}Xy7͟?L s⽐|~ӷw?833 i?LTR@n)SRt$"  1y1~|,m"Ou Y+fhQ%s YTED ~(FK&`̈́x+bR<s{X}mq[XxZc&nb |աc W/8QU( n*O^"x::XH]veg9grc6goI>hI<'!Q;rbj.iKbD{m6SX`A]Ir嬯uѿMJ\S9~^ $+ahg.,\{ƨQp5\]wdm!}_ C=ӨP/u>ͤŏ%Y)1!GL&|۷ouJoM{+J(ՌVH}۰aC0Kr9-ˠ盧]zk/)Ƨ߿?  >_|Ÿp^1^z%|=cD_T³>kȗ oM4 ;x`}ݗqC0!}i~HP+K /IV6 |t2"lI'g x5(סΝٳggLL$Da&2PT%_&mep31!5l0TlوEMW]j+=z[ujO" 089aJ‹ŔRJVZ&*0@"J.ȳ}@l޼&K,YҊ0sD9O.D3Cpuy&e"k qKP*^&T"iӦD7\ *ؾh2Ǣxɹx L6 ͛7?{$R/kGছqt`E t*θn*^*v_+rygq=mڙ$=XҦlt6LڶRL 6.R`?Z_[n7|l⤍o߾&UFt[nI޽/w{߮!O/2~i+>;|G 5%ds*e HP+VZyg_@t3F&!NFMi:4j PL㓯CHkO/3fW_}e)"@N:)c:W>ƍ@bŊYqMI&`*" "(˜5kfΜi:蠌38IUD@ 0cj~%ϯKL#\r ~m% |a&^'ZMjE| VdWNh NҮ€~sLFy&PH}[nI,Yf3E9tͬ)HZ@R2c)ׇfDSbY`c?&&mׇ2 L TR׷}k&S%5ūyQ@О@w@QڛIh+Wl@ҎqDj#"(A!?ޗ8Z,LJޟwifV)6ٳ7؉L>\P!{MMI8+aJ;NQs|_ĉb[(,W?SNISEâ Yoٳ'.aeqL0gu{9^2_[/.Fڵ~P$DB@H(%vƌ^I" A-¤G=ެ=(fGߊ@رc>sL:N Bz 7;0AK2WI技@Sp Y&ubNƉqӦPX8Rpb[NЛlIBYJ, kVʉqNz;9M/ӧOnj3OѱiԨ _ɉ$NiΜ9v;EK.iӦ=R9;x`+UT)HSN[eT=|rs=x衇J~3Kas^?א N_:~;?.ڿثq?S(vθ-kԨ"ED9ڞD}9W^m:i.7ol{.iLBnݺYh '=òFb8%.ZjCzQzl6C?xFi=g۷SOt "&?Z6FNTZyg_@z+ 3M6 |t2"l;i`ƫ)@1O]D@D@D@D@D@D@D@D 0({ܸq?~ .Pu(b`a-Ɓt"otc _|iӦ`|ݟy&8Fۥ28qdr&`?߼ysP\rw:"1hx8gBh:iJ 3)s:+Q D3e̜93C "L.w!Xv>Wp b(*" "_ $w}gk&cŋŠ919ETTK`֭~<{0 )ׇ.󨖉_ ?6i 7QuΝ8#ФI U?UK@*=7jē+2|O!;vy;լYSb|{~lyoˆjjqu>H&$lljI;q_@MƀVDeX~i*" q @@,it59NlJ%햜( ʅkz?O?J 0Cݍ8*]tNEkQti 2ڪYm`Lu][n\ƌ.0pFTUL@Zy*A/E@D@D jx0&7jԆ|D@Z>:6aT8XG4^Mi|u" " " " " " " " )IܣFѣmZ&zsA֭FA,-[ ɓ'[&f҃mK.Ru`" Q'~ Riժ,@?\\LLC>_tE8s"Ts5AE@ۮ$JƬ}*WNգLbI~1gʠƍۄr5@lڴ&SfrUnI 3S I)4h`'/)Ь"" N+VX%8ymS&MRJlcOgō7ޘC̏߾}xѧO;v`lW{G0:J,s&NvCSe|恾}$+Ƥm~$wvDodEmڐHPG'#¦2BPf5(FJk_ 0t-[fX^|6H裏k.HKt$;w.ƌc/^lg;w/\B8iyUE g zw0|p8O0Dž^;t3a};L lw݉@`c~t钄M^r%&D"Z,͚5CmM-?ዀ|V7oO&c2?& mӦf"Xt)Əo ~d@&A{O"g 5TK@*寽@<޽3f̰BܴP i;0EqrϡDh!" IM"[#tⴙ3衇IXFI}yi<َ=#G97-[DҥYFD I1,_|E!6lK/NժUK#y$(֭ڶmaÆ) s3&~m8>v䓄[k׮6 &)u]l(hGӏ>Ȉ|W݄ۘq*E@Zy?;;RD@D@F_2Qۤ6#Ɉ)8.&FR% P1n8 2&ES^Nо}{TZէVD@ ,\uܸq#֭km제ZωA*Vh'&Q0I}#$cǎСC1ydEpy䑩w:"HLri~ӻX0J p=mߗ B̽+U(c6A`0K"wꩧhѢ @G'"R$̟~}ꫯPre\|~V~}/_M|ֆVXbσabQFىZLZ_K@+gC-c2e(*ˤj׮M\JڹEڈ+?)tKq:1Q"Ÿ5kd4\5HD@$Rp̙A1sW_K.ķB/"nf+ԛITBf׼1`;}i\0U" `&`3 ?rC+MrXkiP ~urJhg cX%>w>gg;^ ~,#zal~l+;Y j坝~)" " Q#D+ lMjC>" A-(G4^Mi|u" " " " " " " " II΅ ~g믿+0kmr< 5ZD0uT<#`b` fQ8Ϫ͛70uLL@Szu;ժU Gu("v܉aÆ7b/pWkA hd0HhĈxW7O<1|0[;`bTD@"$`Kc0cJ`V7ď?hO.+ YnjcEjiS . uzU*UiZ~ްaC8nʕ6y^hJ*%@ #K'V$_~bW]uZli5,+^%^= X{ѣd)SڢЌLj"" "{#݃ⴗSDx6$Ed^7;tP < 7vN9d?4_D w}&oߎ.]X*}LSO>*%} q;afNK NV&Z""?"j-a;֊N8êWj M6E Oe" "7fϞO??s~Zj׮ڶmXv-(| 4}5p1f(_&|zx$ 4>ĕ(zgB ul&na#IV" " "5J_nHZ<-6ʼvvմRi @`7 iC…qmY!-:&}b"&ӧڴi7n?1YWӺu{KŊQNԯ_P$2Mj`_|?8ʕ+gz&x~jg#ߢxwm'|:য়` Rҍp_ |r"2 60` 8e^P@ٲepLD@D`6H޲c9jԨahL*li߾}vﴑz表YftǢv ~Yq2&ԩMX>$J6#"+_ m.4oF׮]{^OUbX{X_AnN-YLvHǨ"" "X3:u*)b^s583P@60{PlJ,n'x`.E@ґǏo}'OK/=`"ܹsѤI~ȶh psWe] 7q:O#ĉE@PT/s>>#Pދ.wTFD@D !lbxߦ0g[n }$]ޝٳr ЯVy;t7j*{^>>kC(N{#p%u~m޼9z=Wy&~l+;Y j坝~)" " Q#0z4L)q(?ڨgnHZwg5 xOdz P'mKD@D@D@D@D@D@D@D@F`6͛ѳgOtNy;JD R{9HIZMPz?믿?bXt).\ `~d%KDÆ $ iܸۄ/D LhB̎;9,ho"?{ o zgPL4.EZaep!`[TD@rAjU̳J.~UcB իk(bLf"lСֽދ댒jѢE3Z'׮] {ʕ4~¤?@zЎ;7n~a0؜ UzԪU+fD@D ]h6x`0w*TʇcSJBk" " " "g|^ȑ#Qti@?/֭[1j([>}:j֬[n|Xxq6ܴl׮]xmC&u8_}>}qv>`Fޓ+\`A_sKvmxWnx[U^~9*C܎+G?ߛo*UJX8.ߍ)#a!)p\C 2!W׃+۷om6̫kb~+w L o-S{bI@Zy+x" " "5wȌUD@|@ڶQD@D@D@D@D@D@D@D@D@D _+լY3l˖-C&ŤLHz@O'0&:l4^E $d)=z!4h&Nv'c;?W^+PmfBG}Ԋc3 6lXU2 s1 p=X'^^ 3g~iz63@?ŸB+M6?j,AJ(_ծ.͂-d%sN?־}{p 6 sJT_Ggs:9'LS$4]vYz_lv~.Zߞ5 ˗/G5;={" " " " "v88qI'YQr ߿ĴjtlPB;C-2+?B7~o߾<%ӏw&Ca"qڀyA_R0qۯit„ S}ܱ­l˓}GV.]DwUרyᄈ:(U|' bN: W]usW_ꫯw}73k||bIMj@g޽gK 0_zXr%>s+w1->SsM82x-Բx^;B/X-+V?#>=g-܂MĹ̛7ƳoqFH+יt,ӏvVQx]2=T{>2mڴ{ <~Cbkk6~+Q \oY<|1:t5\QF{ik" AXvE@D@D ܖ]r#*"3&-]h" " " " " " " " " "S`N&ds=RJt9m|˖-|ܸq`U(,vZ6Q4&K>TGGd͛7g_m h L;vl݇~o2/Rh;{ou5/L`͚56ʢEl}ݗ0L1Q}=O=gxkw"k:ٛ ]mۖȦY# G=&l>k2iq뭷GoƟ1͆ٿD:N:I6"WvI7[7ۿ%ý;4OSmĉ6.2"хZlqmY'Oţ0s~P#1&e\}#ޔ5O&M62JS 6^zEaѢELr `\%AD@D 裏Ƌ/9}ꩧpG&]9,X`9qdZeKkZoڟ@> *{?W^ySLAZ0`G2ƞ(٘q 7)FZk}]%.c1i/P MMz*(RN[58<hlj3O߾}3VI L{3sf[kkѿ+b׾}{?DER|0ޝ" Q#`bmIp6$" " " " " " " " "^(p$ nڴ/ B>. E3Q)瓩4k ]tI&'E[Pwgf i%UKl"_4? 6m *[ljժY'F:T\N^˵kƐ!C6p˲g~7Z.F O?t,>x2%Q}=N"OH¶'P,^5j KFYBcdL$_}:0Z$|it>bb(ncM&+kذQG(RH2s2lHl lۯ~7Lxbkk⽁ r[ . {h9 :Ԏ/r,_cCQ3(^w S(Q" [&j[j%uyOBKuI1­ߒޝ}|ŬR:wlmK gϞ77@_|kׂ0]t rf*@IDATWwN/_ݺu /Vj}㎋I64N#!iڍxPc+3%']WϺ~3> 3aKǑkf,jKx#/}_CDdXʎ;b…xгgOnkua>cqj ۏtcm3/1c஻Y|Kɒ%q7}Z ^~m۶MS6>6k1lذb|=WvS}4~+俉V})^>w6֟?MSh(6D@D@D +8]Rt8"q$'P4'`ҥ:u**U+ Vx"{L]ϳ$(ZjtwíիW:[xWB8?6a9j [nΟ~E&OիWgoQzueZ|;gH6 a7GF/S aX&ڵkBӿzjBے<Ӈ;/d ߒP;oԨQËGy$f̘aE (BvڡDURlV4oܶC=d<+8>Iy?VӽPL+; @ Vls/O&stPQfڟ{Fϴ0FB+ԲHZmV2_2L0'bѣ_+ƷDz|}r7IH`k9?3S, 0F7Ē6];ųO ѦM d:uݱcGLWHO??[6K@ޡ ϻ# 2-R-"K§@t/؎=lt6@3}dɒۘ6m 2iРuv vBn?tg_yt`YJ駟p>/ro 1޽{qc9s&89{l~:f@yw}wl2ˊ`/_ hRvǗR3lBmu?l {  \(> P("ŋ.ŝA/ AJi;e}G;3;#Wwʹ眿lfkVĈt{1oҦKp|= +Jzcuo!ʅW~tMλBy]9W+R0e]|RWc: =̢G]J%88p#/(ӧ\>#ls[_^<@愴1pwu8sC3fke-OV_O zXr%v',js?xyGd&~gtz)~uYo2ds@9v <`3_;ﮄ'H^gq?} 2鱇މl!אf9sc=>c8IsM5Fm$`u]<Br)cH'2k8ꪫwne̷oG:\^_WyOƢyqCqߗ)k3s ._|q$T1_23`W_gٵ!`!`=B2)]w]C(5<&7nr-N)8{µ}|Y\-iͳQ4e2X ngsYZO;\^,d>w!+u[՝O#mk6E7N?>%[h )K_ޞ’c=T>;O? =R%g8;H{x/UY(FL%R"_{]C}䕍wOk]\J)٘{); `v.7|sC.~5BuDԉd4losIyz!#|:v܉U_CPHKo̫3hUWu}\)9k y}=mRK-яwF葒QՑtz'yeߟpLP'\,gl\|LU 1eH-];CDȹ6;#BޗO8B7qT17n9蠃"u_x!cJd%:;,Dp%feĈ :^:,`u !mRC<,"B}s&RBH%?ƫc&' 殌-( @\\JRoe%~R52ԹE30CCnY'`RVg%o˅qB^ycqe^:eWzCR!ʼ+R_BvܷA]\,)+/7K^95Zuu5lذ"8dm@Lœ}O!TH ]D:?ڈJd󼬝FFG1A(2Ƥ%#KKy!됾hA^_WRZ5 ;k,Stw9.Ð?{ިNj۪HWRw2sDݖ93o_}qcҨFůDnتji'!v%Yr_ʕ=Nv?]St݉7ߜ"%b ѽkkE;sK/Խq_?J9@IqmS:wu 5"C0 Ch663wX@j\b(:Ƨ)bנ0 C0 C0 C0 C@Y]QzA+֞s9w,R;\)ѣgݝC9N3!5J8g ݊jó}O?w̘1|=Y.hD8CcǺqW\˻*7FqBşO:`";r<0nBHo]d7vm9V@B+ʔ80y8Z yo/NR6ǏwQXJ;OLs9s ߨ<,+&G gm= NJ_;oBN"p4OYy' )?ԇߗG/2 GcdSjy5i56A sUW5+ -a0S(Rf!dw7 {x>dH!f(12}k)7F+4Lhq!->E?7t+ [1 +2+dH!ʐC!ctBuIrp+^=Shy|I=~>)'c򆷾M9mDsPO;Q+yaq4sF灍J'/^_wqv3ey2}AZLtR}i᤾^9{H7HχFN&^eʾe1iT:CEL·|XwqN/r R6O34ȑ#\olZa#o82R=(RuU 01B@6C肀?~s)xqOEBNy:P!s G1#Zҹt\Zt(_ ΍O==6lXovy5ͺFy2ِyMpyйN8CeРA:0VEt'}yUK]—~暆o\UdB!6N:+齦-[Ҝ[N:E_|p~7ʹvaG"voVWEv"D.eq=j{,oHSOٱQy晣8ǃ '|oݨ*$FbQRu^[6/cK{8%v[l1wP7aR},!`@b &gĒ7 M'v`!`!`!`!`@K 03*$>,2'uf(_}gN<;oN}WhRj*QVES W_} vl'zđB l+zRBNQb@Qg8hcK{ׇ|BWKG:kx QknkXK%矋S 툅x}ڍ C@dIDXCE~~Bü-!?6P|\`ĥnCfTW^y1oQiaC\37Rop eA2݊E 6B+}iㄐ1KX,o\NoȐBRO兖//ޖ!xR?^ +{<|e>4W[nXrl_H{ZۨiVjm EީNvP/2f>d %q#OUц_K\-ޤkym@LĈn eJ#YvaZ柡mD%c}$305I'T(OΩ1ߨӓ؊:CsW|Au.x27P yCD__w:OU8.Zژ_o=cxj!`!`!3$\YɓeH@sߋ.79?ʒ!c<-==7s2ˤ9di^󡲡"٧ix͐w!$u6_J+ֵ/ /Pԁc屼Tn |DyG ۳>x QǔrMLvPv5w>3}61+ɓ8n;A'[dMOּ}rzd￿DyΌr1Ǹs}?mY6i+g!yzYuW>х/h=Q62ERi:hvY֫ ]gk[uוpNk/J@v/oy<ŽްVX-*|U:-X˲!`G@r*+>{#~L\5.w덴F܊/^j]ҁ +`C籀- C)FSyC0 C0 C0 C0 Ch(jIOSC=T~ߥFS#89w}'wydظkCaiﻺ__ky2kl>Au '8ѣG;>1n [m#|k7v}e80O&wr4 :Z8^cXȸ24w'<qd%${B˗l\/Eo-Gx1wכ'Ҩ85j}aK/>ɩ߿7Nۈ:4y}UuO7]zM!q{k&創܍8؂nYT_TR\88-!`!`2#Ty[=#˂pFI{9_|giy7B\0it:uS}ԓ8^!2w3]IYs=e]wuqgo 6ؠM^Y*7xRt8 }omK,+U|s&ȇ*7pPT#A< L(NI+~JY +y"qݜ~ J'.[Ru?;s!P]c5dȑ2f7Fq#("o!.P V ƍsZe@i~ر/8RB^:)t:+KMU\t|[2 y㈐8u} kV %<\x"k%’A?~D$[- srUf.!k-:G_gyﻺǔ|&O~dzC\モnb3L_}'>cZJ6|sG~vG37#\r[b-*Đ#m;/ |[s;-o[_C1FH_H]m#xZWO8nT?dcFgPV|W~_NjqV]uՊ$!؀ 2FYL*u:V~C020BuYš=渱t+#5 Vҹ;IX]vk|7Btfׄozs6>T}-|HvIf7,]vO6yr饗n؜苲)!|y z~>쳻CoQaiVFݨ$o'=)'侵;)w9 tQq' _oVQg^ lIY|$>䓆5, `ZR5 C0!`%A@}矗$3 C0 C0 C0 C0 C0@K/z%I0hw:}QbFl7x#Zkdfpxy#4%.!'ǐe[)N8G))WpH~݊.ߢ.G A|A5p@w'}b gQwq0{=2 x'ueKGqR$i8j@oUVq2/s<`g\4L/8F8B#1";it(8 _Z߾r!]G}s5@w`uSxY}}^YzO}*7dy-㱐7HB e_xʣyMXYI:8DZ,=i8%%F<S6>g!b^S̳1Pϓ]}}Wws/d*gqF2f+C) f+*_/ŲZPT9H:qV+=ͅ¤\ܼ<O2\Zuv_狖Ԛ~!2w3]I')Á;w:(AVye?Γ5|~y7hxZo Swニ; /t8sꫯnmʵ9#H9$syoHraTWߓ?mµ:z8>c*z衅W <ȓ ycZxC"hNR.Zcvm7AsJLjϐr@h.$z;>KݰK[[oKnk=v&j~+i:T[WChuthD!^5{NYfD"Rkt+#Uh\yvysz͚f]_lMO:y8EZ΍vUR ^i3U@F_}UGTd:ǵ-oN\;x'yů[nq7l%=0~OOV!rQ/gβWΒ;e 9ȑ#؇o]n=,Bү_,2zA|rKG~'%{ѽik 6o[9C_& "0B"P8 C0 P([@D!`_|QHT!`!`!`!`!` ,^}ղۊ'iL$ 9~wٹ={キSJ^uU#p;!~٧vZw5\#(A <7t,I+Xk!c=&|CtHO>qiHYoa!C(wŃW> +F}|?ʣ^ivň2q/oH*Nӟ`nȐ;8ql<|8e}`5pXCfȃ>O Nb!{"{2pҏM:2|=z\6{zW鱓.BH]J7/1X`^耼uN;ФBu8Z 7g'.l8Şط=Cܼ4C6xcGVr6\Qo\Ie!r<LYrߐv')dHTZ޸2|TzǓ}Ȑ%X@IDATQ ')n=2q}V+jYiOƷ6e'mcZ·4 :4Zwu]S-IK{W/c1򮼠%ܜTm6 !0u)}b4?!Z3OW'S/7Vcff'36G&:uL>uzH1Dj曃ymK^(:+'?+b`AX4f%o<?'d~WWH궖w)?ɒ7Ɲއ=m)= 髃3Xe:xaںaHq/G=h4^ h!`m:ztmq3NFV$+xeH'䞐w!+u6 81BVʂg8`ȠW^ F76iϗ>_YC\pA-mW|u(kڤ׻'XG;=Mщ'S_UW=l|:!`j+WQ%뮻,=wQBH G*2_#wbܗdL }]<\,1\\:mS6b-w[zl7c>RUsئ_s5ξzfr)yptM7ӳYsYɚp=$o#k쳅&UOi>cyqޜǓ<2]dr>!wu׹JzaяWR"CH;AӟG{<ٕd}y>ឬ<'~LE|NJo'Ց@g ѽjk -tE3E_>j x C0 C( "rΉ_4g%r䑢 El5.m7omd*[%Ç)_VC0 C0 C0 C0 2!J"Ɖ|eoPI'C~uU^}beu!(j&Jq UW:%UU9ǢdA^:xRT[4j(lL]S%_qv;SɡD_VWT԰Pe%G_9Ve;Q2ꫯD8+pW.pTQJQÇn9>T1PԸ۵]{o%^5w:z5pP%zEO?-J"o𮩣xQ",Qk:"HRZj)Q'r'^>ٱ!`(1(9\}բNE2bE{>mQ糺oϽ+hATqSOq>'WOK~>mw{RݯQ>M%6sO^#C>ޞCp k49ki52w(u8v+NE/*ы瞢KI̹<^)hȸ2/z^?-!ʢʗ7P}>MPD9C v;q9QOвp]H;H~PJ'Ǖ1465OL7S#c7\ې_*i;OV1SJ4hېSgG"OˊQxXc@1D {oWFxc駟~4rzCOۈzӍ?רvG:)8*nE)W#J*Wva_֬/(AW%{V]7:CO>3P#m٦}\#08^7Ѷ C0 C(>Hh\;<'R"7W@>z~YC,k 6u‘9ruj٭8sny9l[9dҹк):EW!{)#.h+"/^W&lRHԵrd(ˮ$DR"v _y/kPr9jfQRum jB|唵N/mj#SjPJd!Т[FE;E `NER)[nxcQEQY̙bS C0 C0 C0 C0J:T..B,RħRH{c?m?tϩX.;„)ؙ, Zonq'e R[|]qTg8@A1+l2$TXLQA$d<[ [0 !;%AsѳH;飏>WdRO54odeų܎9}sc$bV(OܢJ+2f踨9<rXh &W^ys;[l&7)[~z],ûr9{Vw}ݥ% /Gyĵ{ ɶrS3{Ni+!`!`#_\uUA]`1fm&/|"INqNU! W eUYu)27XEꉴPt].H<Iߢ5.sL5T_Rvm7Yb%+yT.b; $8Jq|Bfȷ7V-k;?ƙ^+h=}Ueu PP+)0Pg9(Q+? d\wu˜qĘmQ7iZa%_B9 3̐Y&_̄r28*A(Ϯlnn|e@\|3oҎuJS=huו7|Sz)ǢYz)7qZcǎy晧ǩB;QctZLJFYyT74j}0BxbO!`=X0 r =Efu±!`!`!`!`@#̗_Hűƍ؟Kq7 d?cy=dZ-FIw =Xus@gС*4]a0EaCeR2c܌|Gșg~*u֤NByoq¼^{ɂ .( /sܓ1"HO{C[0:W^Y}Q[SN9"q\iB_v%w!-m>S]#A 0):^gʭA[8a"S9dQ rA/"t /ȥ袋:GЗwyNNa)NMU"n.cv)G]i2H~", :q1j(GbT|MO/K.u~S8-d<wH8C)bȽECABKB#Ad[md$AHiǸ}MnRXw-B&8BA?K/ TX[kq2NWXaV,0 C0 CU cA/:r-BLZ/뭷s\ D'{fjaW¼;nB1b)o1i\}{oK9|}"xg^ȑ#e2:]+CZV M6 azذar!8;t`̘Бoo0=hղju͑]ve{t]ctx G%\QV| [[G  vZlffLDz[چ!Љ`=唝Xʼ2sEH!Qe<o0֚xKĞ@+( ȍsn叟0b"tf,.yYW뮻o|Px/VS&SO=˖i] }Zd 4?:'_i,;%Л$^S}Vh'?dywLw>i]^ߙF~zõqvݖ M jj0 C0YԸ9FଳDX?OpN3P[FG'gqx㍮Q[o}7;o!` ]z饎DGi \ԑH>ͧh&fWAI.J" /8!_yG:'-X9Y;gCcڳ>[>E9nС7.6^scnT_H:_askdt544P+)x2 49] ,@"@[zǺvI'TZh!n)Jꫯglh"-Štn*4;f C0 C(d#F\ dW_9CD05ʚ% 8idTo%afsJ^/ӌx>XoOz$Z~=8(P .@n&i !`1|p'K/9~mQ3;Ñ>X 6zf@?336'#%L%Xd9Jfb,[@Px_l%lAr뭷1և~H/d]tgK\=ɚ{^c;Sw_a>bN8pbKH Y{e 6p[OI]s=Wc9ꨣcS`-2-п)w64:ANs=ug=I+??I'j/tj}VN<11cdfsFч=91eChU( 5[!<'p)8)^HpK;:ny4{ C0 ChO>3'a D8БuC&6п)B,4ׁ堜|2vX'=zU->cq!k~8]b%ZFSo|PI>psȀ[#Ӳ` P_|ѭSۺ52}hȐ!en[u֛k.G13e9-ԍ7l.XD C :œYg5']@t}YGzݳ;W\"DlꩧajxY0bYj"93[<@-6̯Ev(QnMhWtMUR8_CәgJo~炌qu }NPEqY<1;v"y0gU 9Vɱ^P^DP~IC0 CPZD.XEVPPGp̋LD눠C1h+!`!`!`!`9|}W2,# %@b54"q+vnrw\+ÇkyVT!Zh!7_HR !`:g!@6u̘1NvL' A9%@`'wm6l# .\{-'whwuE|% 8Ee 7_] g]a&hg6|s.D6tR eڲZFUl!#Ԫ;{0 C(wWEVPPGTF"\#ꌪ:3P쐊b!`!`!`@[#,쫯bA1'IDu'Â*NxUMU}2-x7 CO>L;Zk圐m0Ʈ(a{=8 M795l=r}9a?ԀH-@ y&NAqD5$6f5t}=]M6Yb%5J|O2\s9=o}N1%igfaE D b;VjC='*c7.ߑ73d,\oeq$ȏ8o0 QYfȲ0;v|2:w8\M=N7|=Jj"ùm霫^vmc 󞩧qح漰noF/B ƫ8}ԉbNY+Cec =#G fi&GZ}: !P~XK|嗝kQ<;2skሐ]w]G8XdBw\tE~®֋뙻{:(9MSq^|1;j%b' C ) o=wv0Y%;K,8 ׯ C"2 #MJ/ƠZvv*|E/TƐ|xnNٮem{:9c8>P.2'mv=C.:twqFǐr)r衇:Ыթ3X{qdB{#`ZׯjՏ=i!`[(:,4ZV *,WeP.uFbT0 C0 C0 C0JO ]J5nڍu jW+ʓ`}*wN `u]rw:a/RK-%8_qc sFтkY. cH#zHd_9ǿb~ /3 I'T`!`78gCby[eU'+ Cpz 3Nq$&YЄP F@AٱLmG>ȭmQ-NMq0zh?vD8NM駟c@8W ]>3NfB+2,q'[#ybL(gR[~fpNfgf[pe'/&a0 H d4-TfBeY5 C0 C`?D"Any jqĈ,=lMKd@!| 蔠dz>8ONisᰛu895J~y9N'ȖX`n !t>3A?5&8ܕW^Y C1a;zKvi'<ےZ7w p|K5מ{:}'KɄjLUYF R!?jk mx*g3L+U5;PAؼ~3GUY CF[w}-] ֧~nG|"D~I;i`0l0\nIo?? *siv66vlenK \W_#8Bc:9 `ZgZcgO!`"Bn+4ZV *,3Pg(v@%[ C0 C0 C0 C|mwB,ȱ'J:"+=ٕ'a]bX o!zsM``o[}9׷o_gFblY0 Eaƌ40H40QKrW Τ9?.6HJ#sm7{֮?˽!`!`k`1&HP5L2$2:94rdKb>a0 F88zNi>so{۬6svv;6=7!B]<sስS`dRX@o u$]V zx'uRN>`Hxꩧ$ -+W\Cv!8̶!{P!㉜y0 <FdmE':TywFbO0~J>}lqU=Φ5f@5c,=˗_~YƏnG'+.K,{CG}Tf9\vT+=z2j(GJ9\sUk4M.s/XYgG䍌Bm@2e]&k}n-Xuk꿊w^e)#ԪS#Ԫ;{0 C(]w1}wZd%@JP ufA9:#@*يh!`!`!`-v%_qEݓP}W}|_9W;3D`aq 8s&JG =Zx {}Qd8;XH3$P@:wQ|_L5TYveAdYf `!R06g  8Ǚ5={kZz-#3qr 04 cРڔTnP!С""j,ޡtXqGǦ) 9Ȏ#SQSNahYq By1h1w]a1>f癳6[{aHY`~ņ6#`'+p23~qjj0Z U3%+M.N>ɞB{!`*UVC0 C0zȟXeNeR콎$kх~mϹim@ G{='7+{߆. ~] 9'r6s>[З;v;ћgmf|%Fxt 3ݖ\rI.D j* 6̭[mB]t>wёjAja! UW]1b0~~Ž C sEmŸ;lYߐS 4+˘,Q7oX C`N& ٥_C|]{I} %B[:Bl,#p_c{VZ*·zH~?.o?V~n\z2Fv!`!`!`!`++$&,ʓaXL-J;aԄ ɲp`J@ړedc#ZqCOO?6 ʓ(Jz#a쎴Iּ@@#QPo 0x%0 "xb-zO.9Z2k[qlK?묳64O!Л0pk8`ð{!c[zo߾MK@t"&C(e5yx-BW&1<8({ K٠Ch94w1Y8o8y6[1e^!8ȸq\ סk駖6GkŚ<:@7G ߩ'cOB- ٫tF=[) C0 Ch*O#i$K <\s9ٵ=6-MCT?]|k?(ΰYI -N1кt?ЛQ:afsȷСcc>8[-=C`yXӎry0ΥC']YHEs5x;6l#.| /tdZ;SxdL/[o-ra>Vg׿_D+OAf*{Rn iO]r2X0 E{ ^V19+ +q>䗴3f_ܫD >\>hgZk9Fm$v' 5\#w[NIh#GtyꩧdmeTc=d 60qU=B@v9 7;zlvmk"ZhoP5B' C0 Bo?G=h- `Z%:d݂+3x ;!`!`!`@ FIU X}1窷jB,@:w%Ɗ_qtsς!ppr47{ƉH2KI#ao(0V ( qlTLd0*EY 6xVv] wYd-bN&W%o#:Jz "=&#?h8L묟ۍA+6 pB_ L6/,eC~x'X~ƌYV=XN>Y7YVgyr jQ;(87S~S /3H -"O> 4)k|ւ!P(a` wc^N34ΈS`sXPeX4!P: 8K6fc}EZJT)Yd&Uo0~Sk@HD?gq.CϞvׂ!P4qCoDk<+'+xh:5>ZtZ"7(馝h/2"]׸4,C~_m߇=}8cPWy8106`; {Ǡ~9%6/8@s7plAY?~$!}R}\ @#G}T3|>gTC># Q-iJ2v0 C0 C| Y<> c@Ipj N~f0g8!idi{/BO{g~yd&>OՁɫmN .[Ñ.tu7BQ @}e]yؓhѮ0*>߿BcxP6;<Քg-6̍Gzybg[oÇ;լ{ZIn(L2Iy2ۂ9 : [-X&f%m0l#%r--\za Do#.Kz\$y% V]!_dE,~V̱DҧOP-ί" .pج9aȜmx96ߨ{_ /β;kg ?/jlVDoF"Oo"0`o"#rqm\H+CP~IC0 CP?\Dh- `Z%:"O?-uFbT0 C0 C0 CD?XAԱOǏ=0bMB1/ Chg߿Yh)Ѣ +Hb";lpbM>3~1[މ9 i7 !dXkX'}Oϸ8йoYeJn4 N9hBL(;3^G>>6`,wJyMo2&T3߭2y2l=r1꽡??~|0s,g񍘃.ٟ6Cu?o{> 8{d˾o##gf#h>[M=r_5;d. z0{z C0 C0ʀs.՛ky2ޓ=^^QVe^ftk=e_s);#n2/ם`lܱf͚$^:xdx)}D@D W?Y0K?m?-[ZND+USX˵Ή5h=$6>rq}pVp@IDAT6MυCKjs0}?@|8Q(;Ό3\WG 6n /rx>N(E"EHG[9p1b"@cs̢ ~ q]/dfEgffNwW){_ ?q씎5IO"ǚIn<:2fh;S~pmGdh[Y`ŵ1 nw`^m\ڊ` :KRd|dV" " " " a :N(m<1gd8 Ǫc tpcxTdNA,7#ƹݍ@Y^58r8<4Ζ+E?˖-l眸\<~Cېpߌl^3gz8Qx-KX-5A109#pn`? r*ŖVHH(#a|+ X~ ]ѣ}fkW(&(FE@D@D@D@D@D@DȞ!N芓 -7&*U0a,MZcp,Ar͂"YN<8y91WdK, h1<7 m6oAVXi%4 i˅e/,=qbYh&]?^qKӨB'.9Rpa~޶\`[ q5hDL#IgLփG۠~pp8̃F͚5yq5R\ @ ?[Ӡ8 _6?\礱>u2r|vߵl-Yc.wON;ǦMQ{!Kg~-FSےA`$?m=UZ\AD 8@y' +KHNyf3N:3L-(yl3iYmv":c vWhm#Z߂F]PPn Zns Npݥ`{l35UL'*~U~0lp:ronۂiwXg\XCp8DpigCb;yh ۃ6i#X7pMp[pݥ`LǸi7~b7]TmƑ1F01,{aׅ61~ƍӖ#27m<-MD 8Lȅn S;l js<`1K.l\ڭ;[:>[\;g{3vw22>#Ӥ:gu0vhLf|G>`u1NJ uc]P S>Kݷ8K>rozDUއt15 ?(r ɸ{L>[%ؿ {0w}o6oaԕ^tNA4rWH=:?42g3JP+J/ _~-%9E .>^e:1໓޹*!UuLUݺ]]:wYMhincF[6Ls[p|u컻wc7F-|7.hݍU+/v.n26_T(hҍQ/cܗ'axZO? ty&6n|a#IϱN g)S<}i)g{n1 !+N<ϫڵk{|o`ů)X;@:}=W_yc/;)" "  %@%뮃$4[e E(f&L p`daX(1=.mN?=m U`*["uEz!YjM "zj8ŋ祹\ 44įP6 RҼ];-hqM4j hea 9M :1Xp5}thҤID |cqBl;%Bb7ə4 \n)/SPbjGp/j|?Z~|*5d/WAD@D@D 琩0 *@X<JbrXrY.]zytbLcA,im@ (>K,'i ɊN0F~Dhs1߇~ gq hJNw tA֭=Clgr^a%R0`g6a^*lgL@c^.4sȘ8A9sH1r$B.KCao iFGy"H4B1s"v@n0bp:f|V<69]0Zʻ) " L`:X hm|Ϡp֝wqFz:]|.l9Ɋm=(4nɛ0` ^l]lYޭg{88a)vN=WN6'\4i?޺Q "v|rFAD y:u|8G9@2p.Ѳ!3Ct=z$ 'rIESʾ(bOu"<62췲K:hP{ԭքVztXl_Lwb?؍mqf|v'l;8QPGk;">c#^&N[Uqdml\60Vؖm$îb۳q78 9p Clnq fns n1 7.QXڍSs Ǻ9 " "E$#>wn`=n^9>C0=sk>c.SvhCA5BBQ=Ws6_v`θio\ E9άR" "lU"l|t{_ t'r|2rZ ǽ2\'+Ѷ\ c?80}a׮rg}tx   l k !(j(N\ |}Jr/9E-S ugZG 1ɓ92myw`7%W}$ʛƙVMtOfeTmD@D@2ٻ@I5|+" " " " " " NcxBXN+V,&w~ϑ2}WrSeWo?==(Eoh6@B xYN$믿Z|7'D+'ս{<,nQg$Ђe`fd{ h͙3ܶ{YW]utEH07ވCSN3obtaG0NS(dN:pz' \p[F!j.]SbԨQh߾}kآt`s\wpꩀe⡇{&݈!8+";t퓠VԴg: |/Esab~ab?9^1'9z"@ ΁v: wcU:St_H>5LK~_0wF?s " Vlo.Vu#1L|~$E0xA;~rK/3fZ!J݅% = C*U%kEڋcPnݺp'f\5k$SxN2>;^W`k]bwG톖-5M_ؼysԃ) 0 (" a"`]O8(h/tش)б#LhNtQaÆyBODvߟs@& 7$RQ2k KGΚJ""B]>‚H">p6D;n2Bd8KM;2%7Z@: PPv4 " " '^{N6AD@O""g P ꨣ}//A4M(93Ɵw}G] I'J,a"@-XVd_ jqLldI@fVf_?^D@D Od IZuTZ `z8 cE `q=rų=r4sxM؊gMf\-aO.-[nv DuX1xM? X tн;p睾;*BRPtرfֵ]wC"+G DN_~( "\|4,] Ԫs)wD{o5^ B}b#@A- )@(p/=e N44q j1P@GZ "P8P8*" " )'PJ݇vHuB(3$ jEM" " " " " " " `:yWN+(Q˥ cq\ ]Q `ִi#-QR2zSs"Yf7=ZN$gϞXT3xÉ;wnx֬Y?wi'z83 9z` ^E8g_AD@b%X~!lsM j5WE@D@BJy%ҋb:_~ɹ" " " " " " 9J?|+'z-A1XAQ,iI]NRk"(^r|YK,[_fWQF<Ν;)U)R'?z̙yZϷf'u7m۶8(E(On{;SCAb^SQ7~?n= POO gWT(ςb|e?G60f[np7E@D i~xm`4Ff@]wJ%uƫLaԨQv܅2eʄ,Ŷ)<þ֤Ic[:WH͚Z{[RG^Jqش x5"Z/\z6lTlwZe}6/" "Mh6 juT6Lup&*8HAD@ox"pY@FCv\DԭA_l0GÁ W/gQ" N`9Wg{M_/vM9T; j |" " 9C= 7T CAD@D@D@D@D@D@2ixN 5Nm bmm-cDV&[E}>-amYjd# 4-]4O$+(&zP|yԮ]ʢ':ux._%-ϽL_ g^\VL9#W_O>K/R[,+P*4@~ aHJ@͛h"Ss1xpyyqೈivছnW\!j/8{mК;0m?أ; vLH4Lkm"ջxUVXùG }sU6NQLu@v#pv@.!~_IqӮqX)֫ uN:z47҄~6x)1˄ U&" "S6>(ʊ@Z _*UZ \D@r!-[U%E@D;|\vl??0rrkpW_ tEG?si#\U+Vd_T#n1W50JepV8J%" "蔐!1UE@E@Z"8U'x)\׮<- P-2 O"ͥs7nKi"yX`׿[Ybse^g`׫UfB{$v}LX`(DVZehٲkF֭=1$%糞dNz*իc}&+|YFF PЫ];`_w)o|w:t(J.o96m>wމk-1hBQ(&~1;0QX8߸BZ8\LY|؏?zDnE9*\*D%P:#0a層kEW$zXb@b"@A-N78䐘N"3~њ>`C?z#欴c8A-ꔠV+[f!~0g/Ѷ@r ,_)Vr9+wpi'`(_ꬳƍѣ# W9Z2e3N?ݷv/ S'` ZrKD jԀHw)q#WMvSD(L@ P}AZ>C$:FRDGL _ŰJk3Sf睷 c9,:fwhq њ8>`E~ofD:wJ.&<ްafϞ'of‡b@]vhJx6lقk.;spf{7֭ۦ&/CZ'Y[vϸ*`b`Fa֯_U#f2뮻}13Mp>Ȭ) " oZȑ~gf,e>#Ss`/_(M < |0p5FʕcW{ƟS%U2:X 0=tL]{q K KT!д)0t(l|%sʭ@_”)S0n84jԨc@`魷^>'`X+L{t⫦:wxkvZ;{xO3iaZ )D@D  SO EůsNq.ޡLoh֬H"P0o^v)lc`=S%l T-JJ@ 8'J2he/qVd(:BVOnsGr|ljb9+=AKns]N9WQk" '~zO kɒ%ybYN4kMrv5kݻw`Ek/ 4;gAᬙ3gz1ԤIO8>QH/^'iQ|QzKSt)0r$pME=&2}| ƛ6իs^aͥ@  CED@D@D 1/$EER%`ժD|D@D@D@D@D@D@RA௿hvmܘdY0O a 9d[Q8V\&" %@U6XD"5|Y޼W7:fM#c,c.uE%z)8o޼<,hϨPZjxYLWX1mԉ%0d :GuƍKD'[sK$#/VYSxjwy':ku]x(Tq6 xeW+|!NtTF*wbPwĈ,F9s򅵬}%T<_SΣH ?cp1);NaxpLhQl{}^ڴ8iUJ칧l6u+ax G;^GGT-" "P<Ԣ n 瑽s?'>]\&On8`@O͝"P&r%y3@?l '@{gs] "=b]D@D@D $ :Ore`ݺ" " " " " " #r1Ksi.ǪQh,6'n`Dܴ&" %by%Ki&˗GZ<, /?O4v(SLr c&vZ̚58ܹsAQ=3l۶m1x`/nڴ~`S pI'_ĉ''| _m. P΂L Eh?Yԩia%$`ZtC&Mc{ _…[蠟>۟ТevF ^|ř]\9pzwz 8NEH:gS39~; jeELR96AI ?4h|/ռyNlSJ@Z)ŭ@m7/몥 @( HP+ER~^ZUKD8~ #`as!k׮a={ <4ln=Pp5Wǧ@_"U_RJN_LI5 > $d,E W^TUID@D 3 HP+3J$X5H-:;tX4.N맟|`)+TTP N]w y(-" $~/_+ޮw}Y4jժ儠O:SqϽt<, h-ZjGS93=-^G̬z ^*ֹ3fLUV>03|X xĊf0?\p>h\q%aPb"@Ӂ)S^s|Q_J(! A\ DD@D HP+oU?$KE\ bE[;z|! cm\yhMD@H`ʕDȒ%KmkYU^=O(syi-ə~l2m1+?К9sXeʔ1ǾqQGnvG~x6~xON:?0j(/_>J"!-g챇穧? Sشi3#mrHJXSN8sD@2)E-iotI3=9ͼ˚%~ƥ^ukL:0t/a]vozY.ӼB ,J%JɼI=5WA-I{1zr3EtOD.;SPkժ쨋j!" "zMF~ڞ($V9@_*-" " 0y20bpU=8vtuOA}Ç[Ǟ\|'q<2s֒ϞsX6 QyD@D@rrҫ!'@AC^HOD@D@D@D@D@H_ d9aȘFNˉ`ծ_0' " G௿ҥKD6kdP8k#-#x(u衇OͪU'q6'{Wk<+@bk ̹o[lһ9*+ҌfGࢋ.§~j*-pI'et-gn{VoDFз/@/;޶&2`4k׋)վ}g#E@RB>?|g$AJIQtG`ӦM}=`͇&a+w<> @Æ ;2rNPKBlY~UhqG`Tu芧%W8xM`퀎{=Z5 'U$@AիCY4JD@D 4n pn΂ʀ˥"d89 " " I&`S\= |"e/" N⋁Vy!k<+Ӯ{(84ͅLctj[G)%ʹ"rHU[bV@H,8z˖D@JFR%t(N%KG@:P|,.M#h_J:wW.atf(DziMD P()(Ҍ/_nF'u1 fQDk6#eVVg=s7ol޼쳏'uwxqcΧ뜑xBX |z61rH;F̏;;/hٲNvL ^ϝ;~tq&ID !>zEQ |f(@: <#@W\bĹ;u>>0VNT^, jѮ}a(S8p%:?ҥI{Y0z[7ǀh{M{_5`~}w x p:+$E@ڲiO.e."-8oyc278l]zѤ 0mp%up))*"2 \vٳaJr֪NGa@IDAT@B 8ANhLD*W3XNZ%DE@D@D@D@D@Dr iS;,_Hy=*7˗D@D Z*O4+(|Zp)E,.;vKsD689X/n޲8`Sn]<㞀VsNW7ĉ'͙3`Ry= VSOƌ)5TU43@S֭[v >,/aQ^D@F`zॗɓ_t?BZa}n NV 75rF!3fW_ˇv! 2=8 "z_l\m*}eK3&:L/jED@BDre0օP*@ # EV*UPt;e*n8Eh2@blZ " "6w #ڲ|r{]v%O$Gy}Mfvm,/6C}]̙3 w6 eUi E۶mѠA3бcG5 5kf49]7r']vc tMQNf4r5 }7qE/hH3=AG4.k(b2k,t[/&񘕣#C瞃>HX }4`>56+#\ROc ?~Bk3&*VLtOD |V xu j+Lp8ֆ0q/|{@^0!sW2x@Ӧ}cD@D@D@D@D@D@D@D@D@D@D@D@D@"q &s_Hd~p:&г'DŽ?&OhcP2d9w.0bp ?tP" !y] |yU|'9 ~" " C9@xT|*8P+E`_Ъ/嶻bZn .Z&AO?-2GhkLT -PXҡC4);5Or… XoԫWh@ ji{+Wă>:8 |ӧ~7iVG\)_ۤ8@_?ڷd2n|Qٳ5_ƍce~))SLC)'s7&2]L켳/wVLGu4ƍÏ?* !Ь0oO {pD H@ZAJ@ t jB ';۷&j} {lwD H%~sUpN,؟TH<'UJV" " [ |5@Æ[)%" "I=x?'c/-v.̟/pꩾ/@fo?lY;I,/r NsTV"$X ʔ+r wJ֭˕" " " " ";YtmN \{<(E!,-Z_ww[(N`˖-XlY>,'dlk eLf͚^RYsРA ׮]ʕ+D5+ P(YN<1J^3ɼ 2mڴ爰i& 6ÇsxMp' ;jPsƏo9=܃J*͊hFGO=~A-^)eTP{͢cǎ뮾 7p) F>Æ Cͱb k4pk׃Ӂ .zntHEŊa+#CKӁ%WW^&N^z X&63θF*S&PݪUPRQD@D 瞀xuT&l!~Mv=[jz@8 PM4gT*ks̭.8SJr??\3xbZS뇻*@(0_>_c'_:~$@D@D@BB`HP+$DK%E@D@D@D@D@BMdɚris;EkkUJ_NڸШ̥]L;4\D@D@$<:ȘbZ7or uQyiWP~+T: ;P\K@~y j.X<6f̘Oc?"TsQ'axMRʔf~n jeTE@D (5eJˡ@iVS%" I'(IO@x!{)Jo=Va>`swO@* 4o 3f^}0[ˬ%@$,E@D@D@A}4 " !# A]GD@D@D@D kPjjN8VAƍ[whБ[kډd7dm妔$_,^\,Y{*]4jժ e55e}ͪce˗H̗G+x뭷@;gON<1(ָqcO8 /byPnԨQ8ӊ$͝;ۦf^.][n #Zdgk@G=y|5KY#F@ pꩧzbD@њ::XuP}l!⫯ /Ν;{8Rl(ңpajղvGq&D&/&2OU4ŤI{(=nн/eРAֆPaKAJ@y?P'Ф p]ʖy " " " " " " " " " " " "  'f 3cU" "  jw6AD@D;1!6o["g/eC5' CnHTqX-[˖tuOt9@ uT㥽E@D@D i̧W@TK ∀@ Dr? ߃wy(h݉gU Ch" "~w|7`rZzX"(z4RF {^'恽aOf垘ϡ=6oތ?0O@k̙&ʕCKݻ',*W\o4뮻#G):&%b)u-ছnB~#`wZ ,;h6hz̀ƭsօ%Æ (O9*ha 9L`ؓ"Z'm?cElLNA%z+?xԬY*ˆH!t>=ऀ(?tTRDH]4E'iD@`~c"XК8#`] œe6^ܓsG{OAJHWhvA7'" " " " " " " " " " " " "P:}~vDx!,D#Ц G*Զ86kSpILj@fs%Uk0o=ED@#}|ko=tn][5 n0q?]vpE@߾ LO | :NOյjzN{0 ,Y'd0`x{kN; &x^{IL+x]Xv-нgqڷo aQlaÆѣ(v5'x"Fer~Ws&;g}68Բ~41- 0 bS`i8ѨQ#Ok5(_Lw'ri۶-f͚U,t\xL57xwT2EcСCMg3;<pfp*yѣG{iYfiܸq3f L21-w?7T@Q;{nSBb>ƟMlyosY]C(Yظq({gw}zG}dɺ' sӦ˸`Mgtk[|\pN>dL6-'S"R|\y%P/Pcxe_NbZ!x*VPhS| Q,Eh3~aݿ뮻V2{}W_]n;bNZj׆ϭvKh*H@&eWlCʖXheoڿ(649s W6&s7_kcm1v+` |~aA s\%"#K.+xc5k_(SԯKU/ " " ! mhm#Y{sfl " " " " " " " " " " !V[ }L@V*NA A@. o.MK1snnp=8Z9R='"Oct_~4L04n՟p MkUD 8<]氶9ɞoIFY;b_W($P*+o lo&b/؆Ŋl [zJߑ54ŴL"/ ŭҢs3iºw޼H ~_a_uԅKJ*h゙sg0햊+&g b 6l… /PkyvM5kxa}>j >ۻX?x ژ:'vqꫯ0d,^˗y晅_3kM(H;,) yO-0}={;3Ex)ST~~+IB1k_^sbZ4,D[n) yK/VZtd{ L:TPt睾/-Qc+=:re 3f̰I,Œ<9,8A'0TPߦ(3T3 2O\X@o-[,lׄ| *H>L<⋷ tOi>gTa$PA-aͤ;v,0Qe&eZxuPq+]5Ap&M?g{DžC 1&h=VÇ{YeXo6l#FDM6 #ea&S>D2k[|OX pu<éKSoLezٲe` " " }];oyxVf6p y°dnHD @a&uNTJ@K0goU\J@[֪jy$parqn/7_ikKH駟}?<xѥKp1cڜ ´i -X]s?x$ժz~ Nm.V&9ɞo@n!*dRV^WD@D@HreO3*@NoȢX[BYF,;(V[6OAD@D 4M4g c^Q0:juER6j1Z5Y<'1r)hԨN!r&hoy=X~")(m6=ڏM=39)U&E8Yĵ˻VX矏[~+iD?+,TF^ y)QZ)[6rD'S}ݔ_ SHhꨲdΝabUT?|A2 hqO?7E4__瞋?|`y0z꩖O3!Oav㸞 }hֶ U6m ƽn K^;K.&׬Y3ô@$,8w6gELnVѣ@A2װd⮹rZ})" "? jtRH8nf jq9~?gy&(z5o޼~8Z[/o_|1&OmwZ7p1f^o.nM6:tKZмygh6/t!" @j<㉴@ "N*βT" " " " I},~$qBYʢkP5L(ՠV,ns VAD@D \֯_U0kLWF` 7/]n]$\֮]K,)מ={udc=<&Q;P|jժ9(ܹsf͚kעbŊ6!Tm۶^B 1y #a\s5x1x衇PP=*WxvdϱM< :p7ߜOg_n]zS}' {ЌpB̸w_9O sLj6 g}4 ̙3erΦ\E ;{kjˢ@ r-޳" ʕ&X4c+} rlQ OgtZqy@>TBK jٿĺ"Ϣ ?v-*NhQ"P\Բ/|)ШQqsɭlx8яnj׆ qq|'u{ax< [A<ƭgJ•WqZ vepI'ᬳ; m0 (1ˤ$ECSQ9\ 1nݺ=V~" " " " " " " " " "}$~7\[UwH~JϹuV0 Wjzw &.ǛVQƍ ?Ў,6jm_i>5j=A zUܲe }QYwWm }tM/Xx 1̞ <Ю3yyY*!"Bܸ'rP-a\)~~:BD@ZD@D@D tTBW6Hrٮ[WE@D@D@D@RI9YrBY4sN c~(t.[" " )&rʨY_25kиGN4K.yinۙ!ttZzR矸{;`)Av՜瞋tzB>s ;^L-:uxJA#ɓ'{F\WAddF%*[,Q<?'`}]/g :բ  Meo !%4H$—")"JR*}i5SE9hE"CDR?mcO眽\{5oMPPWIヒ'zZ w} R|{ ϙ3ǜꍳ^U{9,^ P+^~($k… Aqz1r(ꫯ駟Ƅ CRУG ]dKwWX0M _6uA>Ù <3ȑ#ѯ_?p@' GKܵK͉tToGqϽ{]? |g"?2~.}N­$ ,^|13ȏN_y9]L-e+Q{%)ˀ0ls~{aT=aSvԢ85X'T[-R݈\,ٻwoό 6,뉑Gq͛h uu>#˚Q_Ѡ[D EUZV tRCh)mk7n;6iCm}q>ڶm*خJH |Hqp<N;ӉIP+9RZVN;ANb /u]2~P,ZY:%Z6;lSbC^Cuml/_è\[n}lfa tR_?3g6e5*HbB;iAD@D ?g|ygq}ڵMN?h}1^{GXwK]" " " " " " " " " " %K Vp>H,XXđ9sat >LWD8UZD@D >yi6>CD@ 47'Se{M_Ɇ'`c͢xc8c-Z;W u{`aF+\G4 1Kk9ѭb~eylSd" iJNO!| Vg['ud(W.MO%N&DD@D@D@ҀO( I%0zU X1xqib4CmW. 9]J@ WK{5{!ϻ:;\6Uz!.y{yGy]xޅz7{ر[מfM gJы$L`w}޽#c{wIWB{}vFsxޥ^ꙣc{w#RZ/]w4ϜDo^ƍ=~wdžL3Ϝ͇֙cPϜ{>gbG9vehӧ{UTlPg*b&C)sxeD03y|]qg<eH"``([zנAM6kS`ݔSxl_={\9]=M؎~0 LHkժ;&FSWzuMsa1nvpc[ xEmO K" l1!gv˖y(iimz>Z-_&˲LЮ\a{HƗ[x6eWvm!l=C]O}eI}A~~>|{{s]"eiҋUfd;/ۅ&Lpwz6lp}$,SھCk6+'WD@D /벱{EXte<?!NH/b⋮nY>Y?L,|E hJV^eND@D@D@D@D@D@D@JM㰶Vۈ=(Z$XXıÓk, KS"U)& Ou:AGd3잵'*xT}$[,` LdCJ*yrM|1 ,V^&ش`owڵn"О{9`Degd" iLG;ᄼ L䙦gO#zr_P^c]OV0 )H 4p6 j%gI6iߩd킲|4A1I'ϛ5wb'KD<|yLɁ켳gN5=LD31orB2-"֯_*hQi3(PVF Dž/͛7we.⠖p]:+ 7og+dQHg̘<9y0^9^3Gȉm>?⸱I&.@P$pŢ/Z"q;f?㞣|n@؁8sh`tljq]"ŧ~¹k`9\`t^uǘYV#޵ɴ,(NV"DaӚiĤgZʕނis^u0{ (!t_Nt(E(H'/]")\6lKt=j{jHEܛO>)J(:֦IPK@TDAD@D 껷8ɮRH\O{m/.ג@fXjQU?2cέ`>aBZcbOeRJfe:nMh 8-ZG )q$3gDf\z֭[iNQLԮ]&h17s箙D{Ŋ]6hi&ݻ'W_}m!q/_&a O„\aF\.”)S`"o0={6L+t'eJ>m (x<1ʝ aɒ%^W,"8v…":(DX01 Z.]ܵix׎ fXbow=-VKhx8l:||Ԭ {.+|g6A8X @ǭE ":vJN*="~nn:OuJL|WyFAX1[Wfկ_?4slNV +ի\_Da2wŀ}mƏM's4'B`'P\پ& [Yg`uFq[rz_{衇}z4hGe矻l+ ךsNNqbxZ/F9!C\=sΰIu.|~寏E)!aG,g'nD0ñ҉mk1;&6JOA|Ӟ~i9Υa3Hcw0&irRϺYVH_E3Hn6(^;1 #sDQ G@$@Q ǩ*D@D@RCeMOMD UD +I[Z^k*Ԏ|ě'DƨM>ݍk8vA9Ga"\Q˖-6_LJ/H賁F_K/GpM H4H{D9]|KLDpv,a:JD@D@D@D@r@K%;]9 .,˗A,O58a|Ƶ\d/ࡳhYʡqQZcc 5z!,:= f/~0h2?3+`p1D ;*Q(\ٜvi:usRI'_4:C[`[O?4h '8B1Qw&Cwy P @nݺg1`UA4f'Wc .xwq6:oܽuUvZpuPb ?&Gߒ&v'A-r6XYg0AI8.SNg}QɍA@ɬ钚YP/2G9ӫ$HW}] ?$PP+nώr'8輨loGe03qQەu.BJku ){mA$(E )E6lXz-GSءC׶g BA.sZtXXt-X+Z;'m"Z/uջ--#<ҵ]eE-(EySF{E9\[BbA㽇<&^ٖĺ)GgvPP[oEfLo&OH/\avo:O1-_;E@D@G_囍c2d$Vo֬YIx@ܭ_j TR%=^$w L>H)X`N II&"PX6ə KPlj@|xE" "@>Tw5 |ӟGOAsaBS_w X"57o )a"_q 7F90¯ hyvU"Zj"mhaƻvwO')t&`P;nO͗cQ5BLϹ'iAZwo&_˗/(>|7x+on:Of(͚;ؼy vF /}8p`( SxeP@Q-O283JzZ;—l:8m ԩ6 n&v{^~Xd 됟A>'MƍG:4N)!ZHc۰z}'IfMw}I`36v 4igL"( e;+5 bJ*mbsn5_YNO?W&/*{w3&&LN: lIoE~KEeaӦM[4ĭA>}\m"F" "#8̆X?tYIV2dHfXO*^{Gv% y?WND@D@D@D@D@D@D@D@D@Dvءt6a|Z&A2w}ܬ>HGA_" %/q֩u FljD!@8˗ƕEAE@D wSSߥ?Zjl >O"I7OQc{D[`ڴih۶mH7~_fP۷yBx^zG߿֘<Єwg=CZʍγ8?&Q-E lOBnC/WM3:y]xqi/A#D^LPEy 53ۑ#G:[.(6FN5k`&_'8΄lu9؎bZ]wtw? /[H%ZN!5kA8żӑi9]ttzo8=^۴ 6|y0Nv.Q i+yr&aÆX+b(EW4>¯ ]ͳ5|ס+x>k [iAZᚠx=byiٹ"ۘޔٞ!ZmDd"P.r`iG6^Gj2XXbZ}>_v`C[Ŝ)Jc݈Q4?xu`@ȳ0epe&h=-e/M_=Cf-.[kP>RDyS N=AxxPTB_,O]`R9$b{J<&ڞ~Xz62'lk˰hXMחi&*T2bZlg=SO&XR Ëg,8|)SZl_`:t3I-ru{챇?ǾdbF" "v 0USg֯_5ٯ>zqVMFի]-pc}X{&6Ld梍m̯݊,L}<,ukvm`s,S}`X+@- h|38ǧ_|bxظw',<~sI' cm$'4nح{/:?*suM^kizf͚N e#A-P48m9Yǎ͡N"4Q=;àѹh*dѩCLi0@JVh8q"?xټ pʝU!F1^{ W]u9sszs̙\7+SMqB/i gؘ;NPE8mxos@e˖ZVA8ңHtM.h+^/ (t/ڠ9+-Vن4b0&(si=쳮\DqYi=)ø LWmڰO Ȃl) [ PPkÆ_1|pW{`7^W^yeH#Xƣ7o^v'Re|\Oc=&,S?BZh;z> )ab`ߞbV? lM6'Z3dV &݁=O>RrYD0}5NeE|IP4SN`h"lrEauqz&lYʔYG'/w0lcq ~=Y:mkBZlihBb p6'uК7oPY_" "  Xa嘳>9e^6wXD;[ >,%RK&" " " " " " " " " "P4]\M8R$c _ N2X U7i@,b?LD@D 5fǐV@P}7ωyG#7;s)LqƍA"nϹD5oCц @3pW K8&[n er> (L|$3d%"P,-gl;19&2I24 r%}g.Bא9L,'=L{駽 .kРJtA9{1cҋɓ'{kO<=3>ʔ){^'֓MBlP`(x}֬YXs4q=jժV^k99u_+n z_x3Qйljas'&˳./?~;aτ&MX*E=U$lPx-3h_ ޲^"ׅ9s'vWS7 L_}wM`bbnd#t&?Z*IJ_~ٳn=;CLRE`ϻRϫXvͳrXpve<茘yemHh#FX7{ķ\ݴ,gfu&4ŠWaD\X,7|z u&]tE^F.E7#WH  ᗅg, iwOp }6(ޟ&AnYwgeUYaݝmAL7f6V"?vpV|k9{XݻϪU#!y^rz^۶}{ XꫯB d;7>`\a‚cg7oG͚5]KN=Tτ G`ҤH-'c)7*KG+&&/8O[2y@Í}XA71Lŕ²9lpA eHqhYD@D /C};W=X㻂?ܭ ;^/h lɮ{ Ah_HM&0oJF|]S9w\>'XXlc'!X Aeĉ@FcɈu"0¥5T%N}tr$L@]ߗHqwg̟vg}XQ~_|EvڹFk׮9)+߇z(4.[`P0~yUL'pbS0m3Aኀ@n׺y|K/RnDϿ8[&" " "PVSTܕe1cV̞8YK{aW#gKL¹^z5̑;ΜL9nӦMi`*a4Vؾ@nR^wvyeZ]C$6}Ql2#@-мys)oy`ds6&׃>+Li}cw D`s&;nN; jhs X_"^ "V~ EZСCqsr]w(}ЦM8CA}cZ9`"l0жDO&bݺu?>&BϩP[_+s7 > WxZOI_/r嘢Q+^yh>u=衇D}B"R9Im3#F=T\vp;$eZRF[nL:gΜ`YoևL\5v S7UɿoQ'RH StV%:6oCVawA۶ma:&.XXRv⭈Ww|:$-l3Ѽx"SfP;d XϒU~z?־kv:u='7&jqн{MR.:h r5F3Vw`:&bH6Vxl+_|~h3|g|rg]hkd;u{㧟YdU6yl$`i(%BҴJr)WE@D@D@D@D@D@D@D _z jc>HLd, S~)Z=zc9qbfX2֪P>0ztDHD@2M#uz8 I)"PT{ kn p E!??|((rI:u^غQ-?0){$R)Lz ^}8(b8+PkaVDcҥ.K6 Ū8mWw|lIDLfZ{J<ڞbWmEY`@͙ h矻!VV]are}̝k 2[-Vw cmc=/{9L7ʹXE-'D_E@D Ԭ;,Xd~Zj1H/[b&RE@D@D@D@D@D@D@D@D@D@B ^pAN"cH@N))tNf^=OiGE@껱}N$sNر@^^-x㝟 p)Ĵ_I5UF >MU\ WD >ΏP0<[)E}叻8[ҷ)GZ'"PP_Pb_D@D@D@D ' T ]YWE@D@D@rE(wV/E觊d" " Mp,.wnheʔ11ZN<7r[s@ uVnС;lR7:O'Bȵ)qrJL6 hwn(kѢ9~頛r֬YK.O>$4]wU, fhx.jԨᮧLI~5W2o14h?9>*,9 ^֭3<~)`s皨p3ICVZ%+쥗^oeT+ʒFcǎ߼g~^N0vXBI 6:lٲ%>$Ā<8nP3'y\oߦsi&e˖ mӂ#b ЏEGvXd(ۓa"EaV}פI1y2LV`ȐZd4M 8c1gΔwa2z7?2(.~bϖ-0!m"ZD} y~ed{e)")ƲW޽3%Jg X[7l_|EneZ3~\t<*svgѣGIR* *]E@D@D@D@D@D@D@D@"0*ԫ'`-Xx`ݴ]D Ԭ EZ1F.jH:^D vٔ+ED TMp껽z34DlL,!YƧʧ}ur%@k:u:RNجٍ>]-K _ҟ(9VHH*h3VZB'>7֭J&(nc%HWtt)`\pų8V/eZ'N$rZ@t%" 9@.,/[bVZ5'egU^=H)"͛P8iӦaʕV*S|80ă.uj1Fgcv;ڴ5rb#GL]D 9k5 N(/կPLdQ&1|'։U⊍iˁ7YFhE2!*r矋/M6=(lM.nx"?NtrD 4k4D@D@D(; 8X@MEcE hJ3W" " " " " " " ")ϰ'"P\*VW+GZy^+(*5K/!x\"nɞmi9|YOqS4W&(Kc;vz*K3l@jae_r޿JSƹuߪL@Ÿ,u]Tx :RD@D@D@D@"oc.$`>CY & O64:w)uPSTZfOH2+V bYUu3a>;i׮ *UT)8\1cFH@k̙ظq#v}w'uyNGabRH3N;Yq)`ڵxwI}OD z]JUiis;l4{ۀ!C`1Ǥ&,{E?SDjoPK&б] #U" ) xb~aio&ye={jernvHC7 .]@_֬ "Z+'" " Ke?)g" " " " " " " " " " " " "P\6m UZ\1* cR5_1wH*" "PEjמEƇeK&K*ƏN88HKH@@>]֭kGn@9ʍ\'"" " " " MreC΃R/" " "qp8r <_S5M@LhqvYޔׯ_(+W?(ФI~nlٲ9@KYXf}L6 _~ Wlqsݻ:蠃 #3Ϡ戺}]^9F ;KJZA-K/>wYzjg߾}ꫯ⬳2Gs+ղe"F7^}U~P.Z(#F^zCl"5Wi"@D P}͝tAMEXަ\|2{T)x@:"&nr}ټyݵQD E. j=LV~+?tJ-P\ȩ(" " "P @B-Xf fugQ4jJ:_D@D8l2%E;;'?|~.\@?:t-`{7vaH%쯾  D~ ;֭[cذahnJI%c)"SѣMR9WяЖL#:LKychX>JDQ~} 8?xi,'# iڣS_<ʞ);֕mXW@~lEt%]WL"M``Р|*`d_DaRHU+`(K>2'{oW1d ^{e_#(.*.ҊGD  |pѰ{YD@29pG{bɒ'+?wfφzIA$ RD &ڵC9ӧßr?W6v)JO("g"" " " "*W֮L(" " " iEe :>?p Ԭ tФ ppOt$%FD@rZ{Y"Y Z|94f`E6mjRZH/(͚5+$5}tkZJ*YfׯVe" &@nݺ9q@E(:#d].<h}7L n]bwC=Φ})'u7wY}?g("nVW7CED! O? x"^ eGH"ۍ2e>,% /av퀇׻U " %DZ+VPVD@D z?VVXeFD@D@D@D@D@D@D@D@D@D@D@D ZU{ԊPD@矟TE@D iS #G!CZ#:%R'7zy(]$R8E Kq}o 8O;@n_ ~ HP+P@ÜK"ήr$" " %j0o^EMÁu{ʗѷ@^DVoU^Fm4E dl/;:,bŊ H9}6mڴg} {キκL$6lh4*ŧC)SgϞ8̙3d!YV8p@_`z`睳2LupСq8Ju g}ow( r*~LQv@Mta5 e˖-( о=pA@˖~@F$\tcEAD m;?:N$ O]w'koO$#"P\W֬+x@X :tȾ)G" " " " " " " " " " " " "P\~>8@|=lp1 S! cƌ{1q61IHJ'?|80lXgVY4%pi`KeMP+MYɲi$ Td'6mjёLD@D@D@:Z4'?tF췟;}B$cɒ%!Ѭ.L!7N]:qge fժU eʔN@ʕ3w}QHDoq)g5 g 0򾓉$y1b Dnݺ9щ]e)y22F6u)̉ W^ *pYDSsNP . RBMK+V];@]w5jeR(9#Gn6_~9wepL (S\QCTG5cwމ-5{/y{'LQ.ib ~,SE&" " E!/(J:VD@D@D@D@D@D@D@D@D@D@D@D@D~5vQlu1@R >`.'ФIRU`" " %D`„Sg[8 ͚ '9YR z(pm8'5x&"{|%p@t)p-hpbe O orf\H6M|GksBZ?DC?'RHKN}&?-BXVxbPTV^SNe{QJz*%YAϢ?l#4')bG2Xv|7pwK.IMD 5Nc*i)I { 80ػ:4%؄]#ؠc1~xVꞚjZSm@J=JѮ]Z%O&j*馛lҢZ@}8-UvQ+Yxy(KiN hM6 ;F^:tQFF'7b)i/6= |^Ve9^"OljVAۧ&lf v6{ĉ&n ಬ vaÀ[ozXS&D b#/K9f\?s38gJzI`;0x%&'6D@҃ڵ /o lTq~G: `}qь:1zxE)؆&!zWd" " " " " " " " " " Isg؜L{[ӊFHE@D /ի%@ PS_0dp@˖շP}7F/FƠAp1~;S>x`}?/ c\jT#^ { \~9{ֆ -@Pw7`~wxQ` `֬LΙ.O@)" " " " i@|It"8pdVʳy>>#믿s܊hڴ)8 '5c-˯e/?}uhݺu$SO=ս_4]tɳ]r@u0ASV{V' +K&[E]6m`vKMD F>W[HD &sF_ښ5kl`yjHa- tD T8= Gk I 4NܐN<ֻj8$`(_\KbZ%w$'0әuDe6;hl%sؤU/=صLD@D@D@D@D@D@D@D@D@D ; plM7[" " > h7oFsSm-@@@݀DX ~c8ƍ",tq4ilx'SzܒN*M"ؾv-&9w≙wR|r{}ᰋ/;,ԋ@LD@D@D̪X@IDAT@D@D kȞGD@D@D '\9_<#ƍaNSԺxE@D W5c dpѬ˗#pn]F 'E-Z)U e" iCOij(5FCPTk=taoFl8)!9Gv>6n܈Ν;cΜ9!Q_m>Ķ6}v ;7xow*y2e^_}U <>hQ')ժB).HK,-rJ 4_=J\x֊HK+dW_%Ah[DPϒZ׍i '>@NnKK۶{l[%#P_.zBsB1c _eLqutFuAZ'P?|yLw=w"" '@A-MN>W("[xJ46b֋:w3 xAY3s Vll{'L AU38tvFQC" lP/8`i-Z/?Ƀmu;(B}D@B@BONJ6IP+N2+" "<7oT6`<@y"Z lTd fe˫ًjVtiԬY e|6}k{h^m(6(%H㤽D@D U ߗNz CD#n42點4zk4~!f n:}jsnZRpt@|,O!@ e8˜1#L7~/mE|s31Jʑ$BNZ֮MdO#" " " l<3οiJN=f̀M) SD@M\t)y7lfԮ] e}83p)3ԪU9Nv@r ~/4+Q@k&xZGq:tÇ;!,HKo [oM8`ҷ{m`,@ ^}؊Z رÄ"S]㫯DeS:!sp '6!4P2ٔ$JŸA)fZL0AAsTz+p~~C|Tm"Z |&vk/ڴILbEXZ8C S&MC|ObD}O< gQ'p`?;sXYD S,X $E-> hРκ/ 2'@{7$?G[5kxPtSXwPAbfty{(Zz'@ws΄no|&v䑙jQD`ҥA`SN>vtLg PcGM~*,dlj o/*o@:蠂o&M`pv W]סSˉڒ@A \r 0z4l6Q-/hH_D@D@D@D@D@D@D@D@D@D  t\|qޔ?{'Ep`NsDbD1`1gggx* ΀ D9S;N[=3OVUvkO[" " MPBS(@Zx͊@@ڵ3.[o5;@3bkvوfmWs-vW]Kpp@7E@ZF]bk%V>-;nM_\cɴf Y~fl@}bAjj}U=^} !E@D@DLbvfܓ h9+fUD@D@*GD ž4˓e7|.Xi,R1A֚o,$ZsO>]!{.&" >SeYl~{֭[7c9JrNDD =~ J{gL,|Bs McƌB;/=Tbd%ޜ4ېo.&[r5a`;h [m+ y;\$6a':u*@U 0"yhLk]vnIɴ`^kֱaKrPMpwhcH9 f݂ܿ eDf?\]w߭Z|+3x*" !ЫT8wCLBȪLarIO>\6LXED|IED@D@D@D@Do;" " " BNN!C,Y7kl.l\0(5L4wIH;)6$Y={NBFF}vQG7 hU#+7n\LEgy~mֳ?>&"YR""PN?8h*}y')ҧ"NƔzN6fx_Q;wc9N=E7탐Y+7رcLG޽{.@MxCscA$Z}>}믯m3d!ٚ 8n |I'BBb\%򗜑f]Ij@ H5):Gavf\`v٭;~U:QBԑIo7ǥ87Pw͆%"z`8u)Z$%|eUVF tNRlͦLɍmT3x" " F+V]uU㼯"" " " " " " " " " "P>sG*" " -#@BYg5k׮eӷE@D@ laK2k:5D@DXz-TzGM7'lȆk'0x:>T3:BG(s Y} 9}MK qIuf!@(V@4" " " " '0J+g54oU."" "6_|ELE,OT0]о-Sfm& f @ O!vYgcb2-.jĉ_\X$ Hɳz꩘l8Z04j뭷?_jUDz$'")ldpzôj ^xKV@lOf —+!ab݂e pfi pRD<"G^{?e%C`͎=HʨW>JU]:{ |0\nAQ_%кܻ NlKtӳ3O}H5f>Zպ:0 X(A"" " m"fodYb6N?첰u.喓mAn*""$Ԛg5HM Zݺ2|)j@ }7_dG13_`v=JJv7 v! VZC,-'RB-a\mmKJ(j J_^^y嗜QDD@D@D@`|$(𥗚!&D`f֡ôiM#@~4נuw ZoG[; 3\lƠ @ڵkg۷b |1i4~~~S뾏~5oߦ_2f{mҤIq1vXxg1gD}_}1~ֽ{w[klYf?E@!@|P}'ɾK֛[}ߧ~[9.^ 'x:.֧O%rH&BJF9}?7W^N;Cb2MlTr2;xPEDi|=ztl[la=Q&?9ϧt},#ӵ\r>֎ @}ks }2P6Q [y߇y#LJٙf/퍭.KEGUD@D@G1cK|=nj|I~F_u 35<2u1m_mS:000{F?" " " " " " " " " "Ȁ |9ˈk>sٯۆ$Yg1Y/T0~um5^ h NʂYGrBs9oc5_>WZ f$Q`N\m_+s_>lj=ws͍\qvkQ?Nq˷Gp;ܔGZw{G"'1ov=/-GBW&wQ;L0leD]Af={bz,.]5$\!.5H2!|mYc_/W8l%qjڇqkmW3Aw>ί2̕Ϗ}5fd`o2d]w5\Ri{&"P)ӅN RgyD@D@D@ r( ~I;3Iȧf6eJ&F'I|%>>}!CN >=uE@ d6`@n6[o:SOowYc Vb_s,EĨ…D hgu֘܄2[rQ"=9$AߩSDH>],Ob饗IHNMKʑDA=}.oOd>}޿֢*5ٯ6ַSC1"єlN[!!QGeׄh( {0a袋Y$Z/LVYehkS{D05ٟzʾVjjwЧbH<~q ey+j^ӷr\"^uu_mV?VXa;#*(T*NV]l-8 *PJ@@mXm#_C{#4{\Q50sZ;+q9> Fwd&RɅ|ߓ2QS͂\+S{/s9gt:uS=ϫUPA쿿٭6ނE1 RfYu٨ߤtGmy HC( !L=K;el3CY9l q;#R 9R&uWQ۬l^+嬅꤃f^Ӵ)" %!@?_h|a+u8ׅƚc uv. RǗ:Lq%?945_>T\uJvZ." " " " " " "mu_GZ2d~\)6rcws}$*k㰬w*v3"E^#|nٮ|H.Wrӟ\rގFf+dvvZ&.9gd>C|16>L%I})>&k+4lm?9]}OmWH_GED0|xߏ5qX>Ax)}}-u N--f}喳%C<#ht>!Kd)Yg yx~8M? ͷ9>-$Zhl%ρ;vj9tS l͞|yFij/cz~N3m7W U`!g|™o?kM{#ÿ1blztkX_w5NM`Ӕ&zv@86^ rE@D@~O`.3?,-!XS}!`2%dʋh*(< ۍ]}k7N~7ESs(nZ\Sm -p 5|ų/I#-߇'`܅R#W,r4+X`b)^PI&po;=%ގ?x1bDH8 _h$+YBpMO[NME,OxUGwdއ&VGLߊC}Nc0٧z?}(a9el.^{?KߟzU7ַr &BM>4*X7շaG5OkSNWs^'>YRg'+?R1m[>5Y{XTg6Vs=Ss7֟6շ>SWo2eJi;Mӷ2>:ٯ}i~P^=[m.Gk؜ ^^& '`Fe?NЀIkxi5(+cϭϩzwV[mvc56Jz=VAo .F/2^%OZ&;${O.Kʗi!L~ȂLccS'9VsrN)ۼ?Cea>w^C N]M0gYtEk*U!ۛMI5|YϞM/m/mxuI[Ԟz&\ 00g?]R: P~ϖ~>҃W$MrNdu3W1ϯ7.'EvuQR?h:{06LL09o3Z1p3d>O\6Sq1 {uWO_@ _1^+m=詏-^x %|>$絏#Ս)>P'ֹ;N mM/|ƙ>Gur{JZJ6mj+ƙxRh=\q_r?S,d*/djJg%s Eˍ?WR\Y1ur!#FH\}ԮsL!|/z|5LgUP&ه oy/2d\3@]3,/f нBn=P$0=Z20$M$k_Og^-o}a|獾FjA(s2%\ws&|nIMB>a?߾);`NغUv[ߦf/nν&W}Κq+0|X π{8dSヱs=^{5{WAɭXXctq$:&"Y.] 2B|XglktdF< Ʌ瀤]?py>(Ν;$+g~8?=L y}B/9'd}{_w1DB_x/j1#5u~};NvυOKܛ6\?sٮo3oO̟>290={fÂx05U>;ӓNsB.MK{| }>*" ;L7QD@D@D@*F@B+'J  -8W:a +^gp}\iCg" ""B _=(=BP\RL_nZO> ,m 7lN*d7 I*4(2ԫT)JdFwtf?/hpA‚]BPG_QQVe`4pI'ٽva!m"Ѣ |',$e΂шY^0u>S>WSE)ߧz?1hBI(WuS}+QTEɾ4 (&T"$i=ѠF񎱓TxQ~Bܜ59G_w7L?KK{[G^q̟&OzR]gi6'KnK{:];4ݻ2mn a*sR%y=gO-1XGcd--.H(g(\#2.y?{f'VmY$|kY _H d32NtEYr>坅j-k"zk3 UW^'דW._G,-1Ƹnӝ3kw̯W( do/m晍3x?$֓N>Xiy5{˗||:9ΰs?$ט?P¶~ߖC5tS*/j@e s3` dn$ѹܸP# k>CN"=Q!ʕ݇ne.-TLLPNCc:m7[|6?u-%lͮvWF-pQ@/Nc=GgXav>'Dz |Θ_c>j|Uj@U毼4U31%z,B+`4]~>hLODŽIc+DŽE$-*zL剾H5PkD&lnUY(ݺuݻD3g9Kc-1Cs4j1Z#sd̕|̯m) l,YὧW~w3u_s~F 25~ /-"{*' np3p7M-TB4 ED@D hBS_ jyc v9rYs]m9(~+" !d6p٠A$nKٹ7 3PVZP^x`|F `ɚQJ j'|8+5JlPaFPL9`)pṬV8qb8W;b@5lv74 =IV~,W1@ 'ɢN Ye ^dJ_cowĝ9i_?M.-U%&}chjf%u7Ē~|CVdgOUcӫqw5?Mnӷ;q\I|?eg 4\lݗ*]ziP36`:tmJ Oa.XHJe?N}z=YڍqUi=f藭'[Z,Y*ooFtF~wAf%%w"I]tA_ Gu89UQaر-SN:E9 -!AYHZ|ȑ9oXpd.% 8>6%;9: OU 1-؂\6ɶa:d[}|ul+gs&}U@=@=] K_\IdA, ˏF2dK4.|qYЗ0Y`;wn<'DӁ!Ϯ@ zf]vJ;SvkMڱ170NҷbW#6czgy,_V<:kxG&'ZM-0 /NԗmUp#ԶoZ#FGy$c`/ZkM]HJFV gyf3OB%^z %?lÆ }7I5Xv˴+t·{B2g}6"ҥKHmr]iC٪f}ZS˹ 2#Vrk.sKWeß犸nc5|}o'}<[[l0`CzWYP%j=;RD@D@JJ@LP+UMW ˬw6f~,Ś(H ʋl7L(s2-x]ډEE2++Ș_0p=C]]ץ:H'}/v`R%٤`zjyiyHxoMe6% ;(חYf)#x}8%<ާz]oUz=}%^{:a„hAss3!.gs9vG.",Lio>q>69_u@ ik`S ڍ|ʻO^}.Cx%r!f=gP(;zozcxW^ۖ*uO@ud@s̭|n=w 2r#lcwi `]Xwi 춛*fw]cW8ҼK /Gb 2{OD+M5\o;Q{xd2K-eHvnp_ '*rMfoAe*uF'c%>7ID^Dl>)wG6Dx@\<pD eP(PKɅ_ȱ^':˩N+/>u~F㊯cFMtՖr W}LI/cΗ?1n }|m#JvZ*" " " " " " N_ ة` Gft.Jʷؗ%<_!Hdxu'~m%09.^YXw;C/d[6SiEN`GNzSjJUы|\ɅB@tm ր/.hE!ݰ9 vN +/&9Ϙ9l unԥ𪴕?vwC=dÐdDSnu=ص׎a;6$9rd\Hov!_i7h]!`?BƦ)}̚ VW8g>e1:>q)sqF%$H{ٷSAKp!8r 52^}lYUEdI {7&( ;;ړejZZ|+xnH}H&p.fm"c#ĶwWrEIZo+lmk/ovLsK}璘$+ԅm%mn]{埘ƢkJRb&4e*V nB @#t䠘ᛧ@!x7I'YPZrBq; ,vx()PXI^1bRh0 H:/ RParYǎc:0( 1.:s*S)$Z*X^1Jҗ+5 bؑ@IDATާRzߊ3oNJu='^d?}+d޷22ƪ@$&Uzy/޷\epc)ijI}^|1'{$.(zNA@.],?v1SU!ת`Ik :zm!3,Io8|r,f131yꩧlرabatka]vUW]5ʇh[ۦ7y7s&L`|MtXwumֳݻGljdQDTHfg&lq 0vy s ^Nxty荐az:d9Iȣ>7Q6`y>E 1Qbu[Wcyplȑql$ d1d]!WZXVm]]A"3ѧO;48hZy5{՜ҩ@x I+_~9c;6|Yve ;w)Xfgq C#hyсqY1d%Գ-gPB-'ZD@D@L@*߀2^  9lSpR))j~CLe;t 9fgeAU"EIjzfAT0jBI FchK`.믧:/\D_|15AK$?!@駟f-40xbGK}a\1z@R):@D7uYeÆ ?JM\;pig!1>+B]7OUJ 7f>himeE샯"[rk=`8cƤI,؞-.? xb3f=h-/2z>KnO 祿bKUTkå^ƊCV[mҟFX{5Z<wq5;+$ .0Mj2սb±{zegq%9~[´C-$@kˑZ&@Oۄ /ڷ~fL3PVOE}\IG !bM> *P4j5GH@hBS!U8jUzOfkm$:3tTh@Ocى'}!e#_(&^x{ E bHK @X{%lʈ#IDA h/N `,J"0з#SOy2 S_ (#X "P$ۢo)u8QbJb-v5 7#ِ(+*'| D馛.hw1MsbK!X*S [ WKf?X2BZv0;Bw#s3fLԽ Y[o=cFS_o;v qTN. AI-_HCAN:1k$"PSHă%!u s'xׯ&J: `o0)b|a!1'O'85jI;V@Ϧ&e\I7UxRZ_6JZ|_emit6|cXgiۆu+,yK@V L2e. VJmb9+ջv@PLJfc}z8j.þm #08 K4ؐxr_^hbRG  /;o|%^V]]rJ-;.g;0;Cų ‘P{キukV+] uYC#<:t萵Kx{vꩧڸqlm SoHooOg;ZSz;6G,J|K.FYu>?Z}!ڵsZk/"6*(4-]SBE@D@DL4)V RpJ؄- | -A3|(9(f" "<@.Vn\},(W3D& ^0~% /2[ L3T`t"PCQȑ#cQ`T$]|Ņ>־" XO%0,SJ`TW"ʩHF~$ay%Dơ@(q"Q0(I1J079VU5[|#We`:T \_oX~shPGJʂNV' Éػ۫sGֽ8i.=6viZp_b;}WHm"6ӏE j{s9Cl17yf_nɍ Y_DV[me$K(DU@n"&駟F ΋?ptơw>}kQSx6f>hJ H9,Hg}'X3ӗQ:4Cw GYC}٣O~] T*Cq V> ;Z~QX`Hj֫2IghH Ƙ> ڨ.Ճ2ưD[ yUjka#2M#\Ȏ)Lj~[6BK~7`?w/lF(+V8bB? :xҬy:vmnb:I<m@HlzY#Ǝ.D/u;25;.N8;QUQ{oLX%'xuQy&d]:>Zq> oʱ9s19fki|S[AqrԨQDZ/mu։r!dC> ]e3>tiEW樼wXk 678jZwO>*V" " "PRДgZmn̮Zhjvm>TM@5qu" uJl= 0k߾6AL'1c$Z$"@J ,(UD@jz*M|ƍ"1Bݻw U Y`LOFv:k+WIS-­^R N,(Ql3eYlW}+ ms{fR78EW歌S}嗑Yqo% RkDCJhVO,1}٬Zk N\|>H i }u.g1puZQ[g viĂcYZq}رSirZ9:d@|Jqn! *"pf?+$X N{ 7i'pww::}]"PV̱v]wEFiϠx&EJIo={]pAZͶ|QVH@8&\HED@BO>y5\1hުaAoÂ-+rڴߌ+1,vHa{]9~@V|w1p ϩc qF}DWڐ!NSrN2@Bl3 8#ɳ k)l2:L|07E"G-2\>~[n]D |]JQ ԂSQ?ї!Z:6+~Bvl$!/:t$@JL'N]Fnʔ.g4eYzҤI>+g}bi>sα /0ki@ףG+\#B]5|ɱbj=` l6lX5ήsVAGÇDZeu׍q<3wF58Z*$1ɘ_Xgp|mKozIn@>9O?k1nRHݵk(DB%iP" 5FXp$A4!8$馛(r1g c ede>e9,uH!qƓ ~q,k @WIძ&@  O>d/7bEa&0I5h@?M 6r{m޻>^[o:(!O=e^ {Nw\/x qm1ԮujlgȚp cd:؂O?%9""8!b??Uwas)DGs(VsT&4](VK|U9(1:`$n~f]緘*1bD ,@ hoqL!-"z+&)=z"cDIHEZ.eyG+UWb.µ@&"PBc>f̘دR Ş={6l(KxT GȰa" h:o% ${"-ǎo6G&I>MԃUE@j!h I $B¨àӭ[0o׏:vV. dlayꩧDZ}ddtV}WN/" 1$%-&Y3`СCz^_ PuHH9tC0|/FiAj׆ł .+QD@j6nх %A^bUzZ~m1) JO;/~oۥKطR@*" " %/B_Ɔ8I~;YjqGa^z~v*9}. >#OB>|x:udwy-袩bWK0`@#-R^ L f^[KTZ^u?2dk2 N_W.9/8Pqw޶nf[Y(D*V" " "PRДgZmn9]!J E=" "-!fKte6\f=f6 jR}ݱ&ʆn=zc+tM_W-" m"Qϣ>pH.EM74!.s9gO<9o{1`"V0|cbX -MU;D@2N~Gy$* $';SL:CV'y( Pܿ+9++634S/)" #@=kaФIlWɒ0%qR5Kg j$cwKTVp N RTZG$b7(?#_o\`6Z%:!4X8SKqCpj /\ 78SaUWN;Ssʃ[G-3l\r}ֿhr.ol|:(}mj1[@aC*D5~$g!O[v@/bl°_N?џy 6؉6l~veh-*%3Ż4o*ۀvm{ĤJ DmvqH|9昣 g)|ȫ6;МBlfU7L7xc&~ĉ[np j-d>;`饗?>TBKh#Zg_@I hBSR:jv1!yr*Jg@D@FyG~ZoŤ rs=־}B J0Z ֊@ رcc?4thI©w=ed,vvqǘԦk׮JNX?TJ$_Ũ I Qjc2qDHo?GĸEY$kdq*뮻Qz.]o߾pN)8ZfOdR,u%4dvf}f!8Ы!PbN뮻HpJ0HA"@%$~zH@^LwqU\j$ϗ^Z T[ ׿c)8e>('_@e EF4z ?9[l:묕iL駟?57|cK,Dc1BED@D> ! 2<ꫯF 7жzh_⋗U8jUN)" " " " " " "_ڝwIB E[niB7B( ƍK#y:c{1+ v)XISVtuqRV2ڽ\}#FaÆ?뮻nx_bŌg@W&"P~m#ΓO>|͘`[nֳg_$ƚDN$VI3g)lb:tPOÃ\P6IůjRs4-+^ 첐8? h{w2drcqCWM!YǢJzv&4%ř)VnGrxY}rPc " !f&[T5jk C)+n0jf PKE@jdA1~u1׋;HZ!rY˶jj@kHu7{/~{ޚCV7$\Oeފ'ZmkA'L<9:` H:][]ke}dm9,[ս'xTZF,$%,`rȾAz_[L jՉ-Rf!_vH`!Yҝ 9±p_|Ŷf:ofQ? =`DRM fCf/\3xw{>l=yv3~ 8 RCaj5qb bC5| U]#*" " Ef92.0Lw1N?hbw}6zhڵkWo 9"&yڷo_Q裘-XTh3LS&dD mØ޳#F$J@Rpȴp衇/RHJ+;\lY| yë^6`ݻuQ+UZD Riqy7O?mqe2'AD -8쥙Rd$6ltv1iR#p2F ?Nj$'D z(}]p:Qocǎ5d]wJUQD up\mբN'O>Į8&"]0L<@0aB ƀ8"DJon>,&pAdZNKT:;&Ox6lXw]|ŭW^1hA/:@h oK/P_A턒iIua/6.d"z뭷bpSO=5̝p j_X;eo7t#&O!~7lg`*V" "./.￿aǼ&#W^y% u]Js r#ޣ*Ya'>\rI%Os%,11+/'] U}wyϣ/l[lE[ve7 $;m#@m 5\b}11fm^1J3*N7޽{t_yc %sva/D R4yh; @ Ou!0' ix ۷څ (j4?1ΪU!%8)ƽ$zs)vbt +@-5\5!R)F묳N|fnV*چNF7瞨`% }ŶnkZS?gcƌ^;MAߵ^yV͜}+ z I c9֦'4hP魒%mcL%aazZ⠃`0'l$f!W\ۃ$p$UdZdEٴ/DUg.UW]Ν;^{eӟc- Kxdt[ fuNcE}!pK0?Iik㎳E]4&8AzҤI{_nL|"{#2s~ .<ěoUxYho6C"sjY$uzwݔfO2}z衘3<rl6{J|mVd]82Lkv2ythxRrtoUcSBb{O$?Ŀa=}ζ]v1X8\ffvڊd*" " " " " " " "Pn_$Yb%|`w"M艐V BrB$.Zi9|^}A/}@/`è@{g~x=l0SSL[n%t?8՜ ²vZ/4=@!RW /qzu]c?2$S$Nk&Q2l0 ,3.6tR25jmvꫯ~;vqMVx<x6Jm#> VvyhK裏6?_&!G%bYHb6`@%9*eSډ'c)}ٙofW{ǯh8}½fnp1K>~L" " [jsv82?_|1ҥKJ@_~^xᅊK %Jח^zFvf8{Ը!9h͹ `rz7 }\}so'fq]m|0R}kZ}k[ǘr3qk~S5xEe]6u}7i*24qĘ =z~$<=&ep饗`*aZl94tp <(Dyn?k9M?˯y1z-EZZjͱzmou׍Atn|W^U7J!%ENs /ΓO>ubx C?16P_*,?>qrd<,g7 rzFw;#&&^XIX=J>s[do8a_˼ k.܏$Wh_ZZo)R]{[R5!.~ac|V!J 4,kr!1p /p JkǹceȐ! +}mQ%yhU뮴켭=O TRh<)eWoki*,(mA>MV2XO[]vc†d{n "˜RͶEXfeLb+4jVToܭ>ɀKg[^Jɷz7 8H:Y8Ӫ\+ `౷~z$X [ tggu}Gv뭷FTv2sA rnzy@\{9l`~WaK/>cxr)-iZ*RKIJ$$ا#<2ƭ 9E[ESHjf%0Nsﶵݻw%-JS,{bƭJ1Q駟n؛[rF? jU|Oǡj6#G6p>{LHE[HB,5srbcGljU5QV=վrݾrjOsǝ{ؓ?@ֱc63}^Pn.AD@D@D@DrBXS2/z&N2`uI' np?쳣 }i,3(Jҥ}^vpp-TAyZjE7W]ubQq|K8(.׽!)&IK TB -$#P:F"T?a|Ɇ;}ZkeGqDѴMmOK£BiSΦqk^L+i@%FvvuW;CK>'H/ ʼnno}WR}a`X$̩FQjVjmcqkb / FC=T+='HKDc@Z <?4W-dع 3[|q ]}#`$Tp2N:a#q }쟵ۦ[35~ܯ$5\Z6X9w[M?|c5r[ɓ'=(=" xs1meOאnI0\UC-7J,D^HVh_򜵶^< lGK<> tPJqT .$M"l`￿DRWmݢMHB?lhxR%rB:BEe2^|г$ĞY `;cF VߒAF-SR bϞ=GɄ?l5m+*7\HVh_Kdt&n%<;V1Tb;;w hM`5X#yji #b¼K6tАpS>g؅Us.R͡/4=@sy(P쵗kW?36]ӟÇۼ}9d/`~ٺ[Q0ӈaTmw}ܸqnp7|sSwJs qފɚJ}1NS߾}?vg/p%4jP&Ng%}r˙]uU%V)cF|6I(}$q#$nLcyg[.]lqHC;WՌGYxWz}2,wyښMQFE_ kUj@6O]@pj%ot6 (&X` XL|cY LכܿZD@D G ͊%9 *_{9jR QVbn '`G.K"%6*0h rܭc;ݺu,\}g4 %x.q!{mBwi/[k_>?)oU瑆5[z1i/壊rVo9Yx2nM\Mj!qmي=Dվ7su]g$CR;:t(,')qbJ@H o=4[]s{so }?OIŭ B˫=2j ͸ s* 4fihpvo/7VW^KWYl„_j]4 ȴ>kі7s$'h+KHH\<$|73qUѷ(P+$pj\tE1Q߶n(\fnT .5_WSh^Wh_ .+_-W.BSq =w[mՌ .)1}G>x/B7 -cIl /D1*%2g9Wlby4ƴwmGqDq׌3BP袋}@[ ؖ!nJ=VzO#lLX2bx6w|^螶VsgUb\sM{駭GQ?OS}O*B@ *9'pM6 /0$lϜ/ 1[sA ksH bUg W_}-B q?6i4-Yp . ب1Mn^k$b I'Dmؑxe]*bX?,LkpYu0)'+f-Rvv+D a",EՏP.yn_|ELfL!^|Eߝz=n&uYS.oDL:r֭ =8ۘ{]s~1F GY)%0cJۥf@* X!l^!g} _aH)S@8'O:(XL }S-" "`G9 ,.D@diSTE (P@IDAT#\;rR ťťxq--"Zpw)>9&6d7'de7hyܺasdmCeY /kwۆ`GhY!ь3(~st*kV}Qg5\?s=Wx 8pc 8+g}d_"bdG`L 4v}i焔H_hIZPi7ihT@{8ݩrXc"8hc'{{_XwmIW_ޡV[9N$l-pM9ꨣvi~hu]ٕ&Ԝ3y'tt 7t}]Nvm7Y|ś![k/_8|{W&p5 2p_r#T9SGʴ+yZ99G(e4is^=Κ|}B{キS\feBn/=U~NY .`CywV!1WfEРAY5+ TqNbdFhkc:dJ}T/(wN^MB8%Jq,Z6,\@ޤ,'h3Ϝod͚֮F8\Ixpn=U6)u뭷80Kg-.%N;bq RU{}@4_WfAk(-M6TF]?[ߪkYu+_G䇥F{ " ,BkTxV!sN矯 կ#b[ u-nGrFWEnF'cW8/ bgw8\?9Y{u{#GxQ{he 0龽f^r W=5ȡ޳V(if ὅ֩“ȸ?(TGeݛƓnriw@>!c!v4/YִS(Wo_O4SV(mWI;Xk̮ls 8eY[2kI[sP^ cigiF\>Sa z|+J+VT?αOD[ou@[!`!`!`!Г|8,rOuQT[—mP:E ח?$gDھF=cj[/'Ðԯzmt]vOFy`3/ 5C h,e@[:(CuF}.tɾp5 )~-H!Yrfւ䗦hnWZ_N φ`?ZYR=b양_-| K/ chL#ognW3Տ)ks3:ImI{o3n`/"{l/TQ` Ap;Y7.E&y{"IF:9묳N/#v4dF^ ,Q=E`N l*}(s}w u3:isB- m7렩ԉya"kO|utaQy4./_P7G8: "E0td?Hs=pΉ&1LeHb/_!x%eK Y_6:~<6\OiǤrZ5-O->ߓF-Dh>2iקchs姭ѱYfOZVCu3|W^x槳칒"%C0 C(|;5KPBzjM2IYZf]F` 謳\ᆧF#4IV# %:9 xi0q"#ΩP8Rε!mvHM:yH #u~6l3oN([ёrkgiHE*@el2Qnsf^^&S.Ru0/ZjuQ_F*$D_|1`#c=gD#`D?|N"j*؏9{5Iy|T½HG .U}ZHy#DgsHE-o"ֺrE%h饗v#Uvm;3W;8r]K.i07w F 'nvjWIkGf%nF:tUV?uw*gD2 mUVv"U+,3N-ॆ#@ yTUC" Sg^AoT"R;B[U { 曵|ЕAoyJ[CI7_ʆVAcHG9Qm0YmcOR_u~1_[jLh&rI/פF42mkD桴:_cbns.=o+u`hk"җ_~ƭ*}!yoaMPfҧ~[˟wy*qGӕ 62|5mAzX"Rp*o1ƨeUun4Ce%YY~ZC %V $k e/w▤sY$۳>7 mTO: dE>#d,*ozh»羴qل~ :77~釓iFh2*^HdȍyӞ!PCH&'ic!sLZ91!D2ԏ9&}ԯ=FO/%ڣ"uQfy{RU*c!`!`!``']h ;[ʗ e1tnne䌜<`PeޮIYxrOa ̐;'\vy 2 j/[j;uP}(*AfmK)i-*'Y Uy@ւԡH}ft5K)k!u? 3vѩ 0e Z:MgYr~ B_ܓǜU? IYwI޽xs)1oU~9ގUcd $]~Oy}#|Gz?lGG` 6`t'rO-D?6tN_՗JhYH?^6m]wH}eL\pAO M΂BZs8u4׿$Sɳ."sFyC0  V`S=_S8͍*[``<:7|tI]0(#5/Ddz!w\p]wA"x+T.2({)ߖ{Euom}J|B0FyO!<JۜQ/'3<`Oy+tM6Y4׊*vmz3~Ȑ| D J`u/] ( XX@<ꫯ^{9vjW iGЀrk/C9T{\]"\?]g"#C Eøsq믿9:)ƕLQ~D!>R^c v9з-T:+m]eUT':3\2DŽs8{I'>czʧ|WOG}tz2%yV`pP1i{jT2eh2 UJ(pi(mZM"ּtȚ09 IMi }Z*v Yf!*{I42]ԧs.Lba˘[ky2RՊ:o5|NFZζASrֲ"Φ%D>=+kBKGl%PoVur"Y{?CzAO9 }Z|z饗/.˚xy) owΞ%g? )K@-꽎 7&r]IExѬX@>ꨣ;Tlad,Y  yZo%5:UV(-s6.wJ:" O%!}TV΅򤳰o,rڝB!Yh>}r@-ڇ\yqƩ8Wr{7,O 7Dn"wȋ!eB;&i>=s|F8#K6e9Yc3d )92d!sLX̚cB=$;<^g}|o,U٫VC0 C0 C0 Cp`YvGi][—%,>Xtn8t.Heo86#k,!PÐbũ.; N]6a 6 n#*Ej"m)GMB@-byd gCuB,Yr(I>-Z DW# !C9<ӣ; 3<'H'|y7}l3gYzYsZ/+LC#BȻWSN9e8836dȐ4pTTz~BNNGhZ_y_4>q?<rOZ^/(P}РAU!:D_*mNeY}C@8/ڣ>;<|"z;t"O*\ܽz=í9|hzɃG6: &hDb;E.Dq= )jP;w*j 5EJ+ǴϷ1. -e!JkVB昐r[]}Uq1䋹2Erɚk9ܼHq:şs@H _I[٪%ꜰOW=]Pښf%뮻7xyhR[.5yZa)?<]U%t6 /ЭU4s7m 5 !sLH99H[8У** {@}~. ͣ/%A{VVo}R& z-$ѭsZ_c'Ѡ#\'ڑ5l:FK/YIeCi_m1~~򐽞.hų!eeو?#Ctl2'.]s{B0yDŽNtoQ7%>A(OدZ4OYsyB.k=繨+*TV|P.2Qۺvww-e_DZT{P%>C Y!YP>RVY!4ڽHܧѹ϶{ Iga4fխ^yBBH9iYV0 yϲLҾ9+`.BC.W# dɍ}e1E{BއBxj|_]9&Kŷ3h,4B cB61%K\ҾV'wqrW䠴ҤNt| m6!`!`!`@@VѪ$YR_Bh7KH}饗::;ݰ;zy]OSO B/b;iĦ$A䭨$EIEٹ"駟:YfkJik,9qZ>V4rӎ!kft5VuO紲5t}p3ꨣ {}y51HY:#Yzi1Y/cΪyh]ogtR̻a\~ĐDSmё'r?z?VdU&|8M6Ϸ)]?I4 }rqBqbGy믵Ӟ/^ԣќ -K+Gйcbn#-B{-^H ԩ"oRYos9rc]pc7ğ >Y߃*ctuBy7-'s 赕9%xZ_fg;3Ykլ~uykuRDm`q#2''Zqy?!!W ZX@ji!`!X@F0 C oDԡ0'*wqi E82.sN|(2B% u'p>ܯgԣ"]w%pp@[8aHk/Gڠg7p*As0=Pj=t>|P0V'!`") Wڌ%UU:zQ~I/U6vT95Nƙ/ёrv&J槝vl=IiƟ i# ePygyү>0TB +}k4wyg~MiPV8m$ޑZEfzBezO?״6!sLH9֍7Dӌq8!svD:b" v:Q6ԅ/ %Bga[mU!f3^KI5mJ :E_Ǫ?߈V>~]F?n0P\Ch9~$F狢RNh;|9Dyfֽ?g6[UP.v@f=1g@%/lGI︬DC޳$}# %շs~M,霿}Ϸ{l'//}|+x?RN{4y+um=ٴҾ;SW:Ey`L; Qf3q-MR i}{,r擤sgݗP2DŽmcE1!gYkYk䨣A(*\ǜjqXmu4 C0 C0 C0 r '8\7)ΗLヅ1jn6GlH>P-Fx 4>y$Lt_4;2ۍsU P!mΥ &vMn 0Fح*K-T7P2ڴ nVѼ] P$ҹ3w?1tjJfypA+BtFcBdYz! $kR_fY:)ͼ{1n }W#{$M|l߱?a BNNG[it {Gz!k됌 ob߮_ ~ ăGQ0Є]HwQF}rK .90z2wO0/~/?xg.'(hBc{寧F4 hv!sSI[f囵"&4ymu8FF~ZCu͋3ԽĞ}Wj!`!`F^w.e-vm'W]u@sv4 C%2,"[9k$~+ߵ?ϷVs#O?õG՞c8:d6s@QAoeM5T/fDlck^舓78a[#ulkHYppZsqH8}m(/p{p ΋.{6tSWXy$2jfmD[U?Iu|ݚF[4/׬6xښCH9!M(*epM4sZ2]pnz%Q箢y=IPtgCfK#"xJĞsc/3R'hkIﭟˋeݐUVZ<kki֦OԪ72S8u10 Ce6ĭZqobULU4.O_ 뮻p${!쳏ws0vB:>c)8.@(.s¤:q>L+EYda,N1YlS+;.+!Y8G4[m't_=6˓nPFX)'Y[ySjU,6k"(tw_y뭷(y+eSm+YvIIҹrCƦ i \V96E1y̙/ߺxqo wQJZ C0 C0 C0 C^Ξ)}s`=2 M:WG-u]WDa#*ƉsOL6QG>#vdx_[P+9CN8Ack9ikArnVѼ2׶גNZ%K*%ts[)'gtF,c_?K9~d}WBͺ/k?̻y6묳@ A~e9j^Ӷ-5 > (*4>[A=\H-B`CE%A|S| !Uk4'4C}裏w۔SNeVld">P~}O0~YgYg%s1f;e_G=SFp+bnV5:f'<'xBqm>>'p-k^|Z=5/r^{ъ"אyjul0 C0 C0A]Wj] 0P󂞴]l@ p"/A4a m4^0׸_fs1J|nVe3G" ު*7+s;}W!CX_q`p!8&lRs8L39cS5I|؇A+ve5{͋~/%1t 9xJu&@AŊN,SZȌ. UN︬gy`)G}[ӝ8-\}͞o'l2CBH9Կ4y+e;վV?+`>hРš@_` <އPCuz&K*/1!k2DŽKS5>6տoj`' G(/|rEU9VC0 C0 C0 C"[mg[m՚_bs-=N F2ž&S\}A b{بFv=o|_6'\6v+8 <[lQЩ!%C x_[P ѝ:lN; =YFkAhVѼ2ZJZ%kTF{=:2Bfݟ3gNYzYkԮYfߕpI }|DX7zm?Gڈ30c.h /,wqGejϯwZnFυِj<=l;iWBh4'[v}ͯٻHyܖXbf IM5xe%#cO?u]v@@&$f`#oz+'Ȏ;zm*c=&L3,ÝtB/Nuˣ4f׳ӏ"fUpZk'ާym^|!t2=(=YkFp>Ez ?e]R>)[mo}N7} C0 C|գhTƪ+ELkYy(Zj.W$oH#5*fmHyA"Z`"eE-n"pN!`#SQ ֒2Ⱥ29TSE08oRTO[չ-X_|;B9_vtIp1>C.oh :HEO1jWhjڻn@{.htOW$._#gY5~w?ڥAk@ckVB昐rVZi%W7L]jӤ94reyI8kUCK Mf-"d)A"xUHښ>൵l֬dyo-m&Ҡ!*Qs!51f'EYaW\ΩB[=mOYf黬5+sLV9ZmMYbROO.:>̍N8!a"UtEYKQg慼<.z'tN)w{Fc1Ft'O? 10Ji`ߨY+Ȓ!&6ɓ0ۿ@~.ϋ WWYpZq7 L5qrf TN% 7)502u:kh5pv^-PÐbiogCd!,y0):!(>Zfe*cRoPhU^MqH;;y1)䞤=]m_g}.u.d !RisB- i(\?P ~e=ܼl*Զ<)a\܎t}G<>!둼!Ikt_%/7"oFt<멥3;NU/LfUC!>kj|$cB'CmZV@ƏCZsOy?!!PXuU#|zeW:XFdWSzK!`!PlAS^(P\Ʀ t7kP oV|9tFCFK.qm=8CmeⱢ j:~YexNES~z7Fp4DB0C?Ȟ>r)=܇&1F(ݔEp̈]vb%Okv%MZ;R8%E1)U!QȼNԝN8j]I%MO43\U'=MAd}{]y=7-B[CI_.ٯ_?I>~g5 !s 6*㷿Sa2,M+l 3]w]7 heTO#o4%yȗJPcIq's='~NTY*C> q`3֬8pac fܓJ[!kVXš|HQSm%`X֚7f5kZ9E$CUOOฐ=N kXc>"!J'XVwNU1x>awQ+GUU׹.> i XX'{:_x( YB]ۿjIsy6"l*W*t+^̩WeHyeF7k?RbB[xo `|MSە9<裎oza^Κ3Lsr'J븂Zv@-o(ξS*#g/$ Nwa'GCވC,e$=kEǬ5NhY!FuGO0\,/`ILKyxԡl4\ȾOx`yy7ըkjYzLz|?SIkVik,ݧN&:8I[ύ+Ԃ;>X|kft^ƯƮ*Mg$K2M?&dLiezW9K'%]@.D inwa?0`QFgu 8?·Uڅ/q':cs/24:+~KԮtq}7z\=yo&W'x",v7@BCZ ۊ/E%lsГ1Eg;ꨣ)tJNJK[\|B~dP@ J# P@,~3(mϋ{Q`oqj'H+ M]8@>;5~e5GDOIkv% }n;PR]^9p 3YJqҊ @U N%3/ښǘ~e3c m͢'|mJkHB昬rv =}hOs\$zL9i{1}ݝ820J"(N g>ikVXB#5.mmE[exps4 *{ZIYD_ۦIZgp^*p]o%ݎKl࢚Q|bcw- C[n CZ0,"`_민$Z\^^^WVYW㏏4turM\z+ɳ&#Cyeo32C=4x≝~v) 2">i~kV:Užʷqb-tE@$ikAښS\-L}ԣ\3y#uxϫHe~ ed}=_o昵^]S:)Y^oYmatbZ!2"s%w,O %'phDQeֲs[嫈vXXtlOWmGϴG-El?n_F䭷D[蔮s蜞}o;@ɾ.R9ꨣD?nTײDjpcNT#`aOwu 7(U5j5`s>G;>XTI;]r=nvWbM7}Yd /N5gUw;oB1q! fZpjC^ik# hI袋{Yfɝv[C)#igm+w5|͝L{*A BFeǡ4݆O"mLsLL/I$vV,,BJ[CQP|OUȝw)5#[oŪ^ du4 C0 C0 C0xD8Ur[%akj^nk { cƗ c<9]``4%UHFU/[l![n 0N8$dVZpn]7Z?D5O_}wUʝncChuf7 Z8$ht6Wλ׸*Yo8]y_@Z_~۳i=Eڛy-{sv&͑]T}<(Jv%ᣏ> i;82`}ب*[p)|8%Xy[i{&\֎ȸ\sY=xpvvt`0s"#*}饗G#G ׿de-ҿ3N6YJL98WQ'xWO>d7[o= 8P(tM҉f7,nM(!M[\z c(-Ҏ:9e=HML[F'Ƚ=Pgx~ |f7\u :]L0ARsKy.NNJ`q(nF!o}k O?YY\3W2\›m8{b>^A>>䷿38c!`!`!`!\s%W]uL 6@&xbgxe9 @ |/gtb/Wat‹{7^*/A>y+l+h?7v1[l1N,j9{lu^C8S2 ]m[d`X!kHBs1SrHEI:)#U­։!⭷* 6lOE]lsI/*衽h?[ձI\firF1 <.qӨn/:`p@o".-+vrs1vmW)=dQQzIB_Ȕw;BrQ4+>̭9y?p .@y08F!yŨn+^Jۿ{c+_ vS(oZο"mEtKz뭷L-YoM;mT :TjY7d'c9d-tAW4O?7,;AQ!HN|g^'ɊJpN +`[ꋴrmNwYt+0?.$2z+VYe8yR}$>lwl-|ҥ;QF@/T;C?쉵E]$w*mSR"p衇:yopW!+y'K ݴK w=" kP+j!`t [t d:y~2:E|Sdi /zkrO(C{՜{suؽXɆ!`4Wy xFoEʇϒeMCQ>qi#/24j#|,m+P1GӘc)|,rQt[ @&JJo+k38l2ꪫmg]jaGcRqvr+K-y8 $eB5_.@:e,unēѰ߽JO<[bp裏<A[ga5;(w~-!P57h( 8,8*Q0: }'qXmChT2_IQ"{T<k?DԹIeC?,^{,̒o![%`MAfOz tGˀoW'q^ A.)f/^ziǓ~*|l6e`}Sq!:,v*nLs38jVCSwZj)s|炇́|Fq4ao%W8_Eϋ920O<3STQ)5Z)%C0 C0 C0 C裏\%q+-L>=JkGx ;:ux5t4]w]nzk_"*uVޣ Rf_*Li :J` OWWa70]+}Kz~Cׇ x駟:ף?^%O?]ve9ĩ靧/n\O>k {S̢?;uM6YKuy8 y> zһᄇL52s p=lSO=[ן/1yskeEC(}uQ+9GGS֘ ~;dW,D=hZΞ4 C0rE4Y,V#ʼ(K4:(3+,+vU0z?E}D>4OeβvqRL9NfP/^xaYa4xزNcA]1 l?.w}yr:0r\sMxd 'ΨBw;.Xa_~yl:sV5VUC(#_|񅣧VE?BW 9(-֧~! #5餓=h`\ ]e>?v{bV ?mRwWdiYg%R&v?c-@YI5 ;gy"P6ۈh\ug-4Gt=Lv_+09QG'qBWj{z.iPswd*cRÂWv~NJSN9,"Ȃ .Y2 CHE_~Xyw|ꩧy`&ȿ#{G.뉵3<x!M~dgES, s'u:9gq kjZZ{ C0 C0 C0 |owOq\-d|jC0<["#X : I&Kb 3s|MY*"džO?%r/ P9|L -C0ZG=8|B<>=I (،C7_}EiРAzɹ[lvstAj_5g__A.h=Vjqq9۪ۯT-T\2?7>rVxK.q/lbrAe |^wuJPM7Tb !@^/%?zoZ@ֱ' C0 \Mp*3 8Tȥ2C* sL5p`.YV6ߕ:!`Tn`Q"W\1́W:A7߈2EϿ6Rp"NʐdD6LdE ꇿ*pĂfx衇pg( L0AUd4 . @\tE ]wU VE=}D,f67h~U,߿?ϼkMk7@/!5ez2!>HFydG3[l1'AgigԖ9TA^C@0$acmP[2 A?0^}Ajf!`!`!`- /:@ |?".crG Ch |? t-wqOeP@ȽZ2z 5)UW9^jURE"PC1V=rEM>º:8mAay@G!O?-O=[Pb/ǗL3sxe&/wFAr-Yge"n[NWﱔ?Cչ/c=SmC&Ur>8*%"vW5\駟^mVs8ߌNK!q;z I_b4HW' lZΞ4 C0rE4Y,P#ʨUF\%L+vU0*d]Rُ*A+^䤓D6?>,gߕK(V?>gCe" e{}>',E0O j1hCa=n߆!GMB(̎"%nzޭo3BBc_y{=VY@* h+^uXǁUiik0"` J GcM1#OWYZ`o!-׬}s2 ]e݊F@eKseY9SU .@n;Ecq"[m%YCSv_kr " K.55QqKBD Dh _'>5o 0( n#3J g(6la@\"N(Zu)sMW7kL!`M O?`Yn~ vZ^1&[+2 oJV}Q'%[W_u>COegYf;9V!`Th,z |oGߵmBUf>qQ*B˶\tA:ѸDweKԓ1pǪ:r'Y=" /L ;eM&r9:^e+ ^{Mn&??__H/遧h 6@g=>z8U5zꫯ֜mQG-D]eZΞ4 C0rE4Y,P#ʨn(m`%e^l|W!Py߾쳏Nj X!VRҘDOT׫am6M<_"r5"*ޢzw}(?#3tPux< em~;W(PJ=& ozمExFWq!Pt#. "@'tIHU}E9NA- Y úSpSNNq!` u{CK1݇2'/M'r- LeiVU79ء&=>Pv:}e55@W[U&tX "p<P]}5Ѹ2dq1 ꫅8^s5e5(XxXCr nFhwf6H6qNʺWKH'} A[~g\}VU<`%9gꨱv@>,r^z$kzD8Ac/NZs S[ Ag,!PV>syGg^WE_rOS?yG-֯X/C0 C0 C0 CO>]`Ƈ` Okood@<쳵#vȪ]`-:jl!L2ȟ,=̎7E[7탿`[o96lY zm=حr C+@|駮Ns{hMoAܼrg/;s1fu/{лKvm776Qz|WdvpC{a<0r;<뮻^uAy|HQZm4:+xE|E7#;=@#˖ Cy>; Zyi e]V[n9Y~e &h>?a'Z@ :v!`!+RefJUku!܆ed@**VmwȦ>>u"H;GD.XTST(ߋ2(D$ryO= ?3 ~H0Y2 "^{ Q(BZi9GLo1 t r1B(c*GHk@OW9.BbN/8me^Ys=],Ғ!`UΏѱy=myUۏxAhE] ?U*]r%V[5B_SarEVnU9CꎫC;U/wZ,3,cylr 7 b)dWtVXA&|TJI_r>S3ֵZKYgjK4X̸-(OmB I$i-!P$:tK8qi 'l򁛐 3v=8o3>i| 痙u5 ,!P0x?4;=5?``8Gj0 C0 C0 C0 }g׆M3<>-D.0ϧox4)%CENgydd䅖 Cy{bx@C!lq Ah:zk#y08_0 "88G$ֹB}?ƥw6պ ՠ]z-FW A[oUV^ye9Mv~>Z>:v| CWԊA֏2(:p@Yb%d2WO:veE7 C0 B4[l-P :*\T o2P6+YVUC,*Vgd"IVD%I'yc.ReEg}(G b?,?ST=iu> 4ʋ(19?:A @37i&rk@z%-!)).7zR|X?zR%CГb??/tq5|Vo\s%po :jxq.`5%!"/|e[:pE9=!km6Rz5.b lf[_ȣ==Kcʷ`!O?}s=|6n- /, -;x#"j'F$ E3 C0 F4-P/hbD:B* tU0*M6XKyI>,aBT+* H*.8(D@P"|yG_TP.T޻}-Tc>8 5c;zJ_75 m8NV!{rd}*O5i+ Y*/(ccV~sDYYi9 ,oZʋ?mt# qC cKX~cdӋwD DRd{o_~l馂c/&8|;ZgiGkv55{yDdEE'Rv5){-N}P#}3d!b-cgQaA> zH~a ύe]V ,6Zf|-h0KF\?' m§s4?"7徽v4 OcwA]B $okD{WY.sgpcmkg Du)0Ag|,@h1K'P+L-GC0 C0 C0 CNQyWa~xޫ4;9ă+_ƾؒ!`t]o}0dA^vfYgs,s}f%jB%:%=@6U/* u.?~ 6$(;Ao?LK!`!zC:[d|Xztg\ω)z 1,b>~rW]$6vm[rrgs96YnS(Jtae] 4H~{+mlлoY8 :蠃d-l[oYm5Qz-cV ?"zW5(8k>EA1=ourd&އ?/U7;oE5j5B!`F4Yg:9Z¢l|SJ!OCFsb&hS盦|zauQ]R!!*w.e,x|<ξ?8A  xE ^P޵:PAu|ppDB'$>hW^{dM0-N=M$5gqذ`?+{2=-V }Q"?ܥ>~fGh+kVֳ^w"fVִHPn2Q>O@{$0H{=dU/*öo(133쇯?h>ZM~w2ZsE_\Ĩڛ`ԵjD^;B屗6H6Y"ڨ%[![dBIRQJhA(DTD|u\]ݽ\˹k9\眙ys̙.7݌Xt _ط/vK@ lpH%ֿXj} [ZM)/[,ZxR9 ϳPID@D@D@D@D@D@D@u/\Wq87eۦfs˜v[(iK<% p#aFczL90gK՛&!@U'j)5sd \8N4YHg/$t\K:q*S-{0QoAy8:ީ}SٓJK(C6i$gt4^|Řݏ?;wF6mb.Sc_ꫯÔ)Sbrut0v'ǜEIV2NƍO0r,xa+%c^HQ\FZ{F'oժUtgzWH.9 7dT(9*,*" " $M*fr8YʝNFIȆΆ2dOTkXypG [nn=\̆phXrуHlٲ1A7c+)') LG2U3FbƭӅ Op7fY@z 1.VdJRk[m*Yw:~c =5Évm*ٮ2R(UFOiQ P*(06B)8蝥dmm Cme  $- ]ٶ *zҩT65mcV;c2{Ds5؞meK Sl[ʈΞ 4k mN#\PxcOG 4㏧br|5裁?jAT ׬xL*#pk))\W/M2WLJ/#ׇSwĜ/-tޅi _<N*UĢ9\_()9H#x9sA`N:y69=$pp;ܻ򪄅'T5C\f8_mK,' u")q>Ǩ5df+:b  hL? `(kL͉D p=>%ؿ&lfu8}3Z[3JX?_0'V>?dǂ} 5>3rٗʡV=3XD@D@D@D@D@D@D16]an3rNRns~̌9.G`ps6%zAd m~%\ uCfjk'4" :!u䂎lt:$m,_: lYr-\/ʵgP# ([2Ⱦ5crqHxm[~qw3T>\;?DxFŧ6ƥjdnݻ;{rFӰaf뫗z`Ki7 +esiA~)mBNTЙ3RX9pmIxPB]BM׈@ h@!A$_ 0sfoeeL51cu3-g>* 7w eɖd̠P|0` xĠP)xa4bOm F paLfoE1 {o=\:`5 ^UPӧ_Q*;%z4m[/6m+{#`mk[MeKxV4öUTk_]e![ض򝲶f}U}61e7 $1!A,;oj$@Dl?=668^mO=y3&j[Xm4!~78fejmrjiπOޣSO/N=sN6zh~ObryU͛Z~8t\F@߯E㦫I@߯{t2y2\ 75{/ppQʣM* 6-Z'!g9l2SwT03jcs[TP6NE :8Ri;XWՈEΥ(lrCoT4\'硸F`1C|U/bM*G;^\90r͞мU4޽d֒s\:ӵk]&{#i|/?S#p_cd>]+ +طp[,~&0H|}Kq[?#BF+[0$[}O|ñS7քF 1ֿpk 9ʡV&+Ot 1(+?lتx?SB07dmS!@ٳg;=Wcq1NԽSƍڵk|nџGa޼y3g!1͈:(u1gZQ0eʔ5[^zhҤI,6h0D=㴷~H+vaXX'y?d PPFOWm7t1l3L׌)v{o~:u=_GK5AX־Llm55>KsF}NnFɔcYjyȡVѸ*H: h447á<opE:WE@D뮸<B;Gw^ >$(M P&a㖚 Bq)A%1c PɄBN&LM)>-S "G2A>S 0XP'~$|3#;LDŽx->yMo8Z>r{-r E9JDOJm`j+G3jemkMlSٖٮ2Ja)魏QVkOi|{ܷ6);bCm*ٶ'K]eʶD$֦ڶU-e,X 'jOX2;9a}/lSmcV1TdlGmW $Vϫm~Kؘ5&jSy*ӳLD3ܿ3vpE++ olj֬f͚aȑh ]:XNȰЗH }&co׌?ΐ:t&L:v m1#Ssp=n.v>b X̜~b̉%T@e˖<@QQ#8o:rmnp >|[6*Rs6bzLM%hXu'3sRF%*2RI))ײzI8.y~otUrsf6i󜶎Ls^oK@޲M,ԇ/rVm)Xrmr58>(Q03~cipb^o6@j W@>& KcؿZO61%m} Y_b)۶#wv|B1໥ yC@ p;A0m%ǯ]r2.1rNm2\q$딜'Ty_e9kkkPcaLy}`k \RoۖRH󼉈Q΃kCr^aMʰא9&dXp[c[jy!9n:1ljX+R8hcJFny %dl;~?8fAp?g-Md,h3WX9fݻ9͛ Usyd錊N1u 7@=]0gJu`oN[O>ܧ ,w! E#駟⭷;.\06wþAZb˪VsB}ܜ,s:B|-Z|>Ӊ#rGs ppʕ1Ktɒ?]_|q+nS!ڃm&ivѸoqmcp\k[̶r.kφZ|&wizsM7=SYDjЀ&8Cu39 HZa{C)p, mиFcR xN( /q6nv ތ ?=sR?/A( 'MBMA&b۶dɒاqD 65;ʜR(ygܕ+W$֌&9H_S񒍧S}镍EtZZ6Ц 裑/Xz(bPFxt@Z mhwYzʶ9T F:ڢa3)*D 6oLV\m3 Ã9R-8mq6wDe5AbTl2E*PхeVH==枀ɓSrDpMEu6ħl8'X&8\k|Er;Qc͇r."Oc 9D6glipm5o*hsgeip;x,~}Ω> m[~"׳ms Z'"֙3>WlaVv'69_-cy)S_Ivo61xu~|hֿoֿXb%yG٧$k_Al#֗XX4Q\ " Z"D49Olep>8~[A׾Jխ!vso9?lsĜ3b۶swL1fh9D]Mmv0mn0 ns7m.ʖ߻j+:摨ReVlxڜnsl6<@4 {/0h\`4Z~Q*9'8.4m\Wk,r\c0m9dž6Vdܶ1%EM-5}'6=~X~M~綍liM (XP!1i>ǥڶ<͜\ 7]LWmkg 3&m2 DzR;frpL, ([?eo WwC^u3:uު (2:)裏K'CZ?M`Em3edN{ H:Pb;oߌժU9u:蠃bNVRo;^v`JZt`e)ߍo>+J0-wRY{vz/̅)߷qXбNS"̗WQL>28NCsυ;8׃N[H^ Ee[c66:X<8v~19M?y&&j#im(i,e_W`YG'yX`n9d K@'lPt$4IPG 3bppIeVHwV>6ZD $fN: n"x9N;8LQ#g&lx#]8ω`4&F`cf m) >SE Km&<(5&(E.0Gƅ v 6&ei ql-q"k [Tތ`[fֶ>SkGVvi|Dm`Dm#`{\Ϋ]6Un2;)nq[Kdp Tlaʾ@!|8*!?lwڱ5} 'Bm;>e^EEo~U3rG1cx>޶r;Qq>Oڸmcebǘ " "fl1c-c?`߬>_aغT tr5w{l}L?ak> [p.>֒%~|Q^_:{R`@?ܕ p>DD ʹ4UTѼ"x#0hpȑ4N7)su>~ŝw[{u<4hPhD@D@"v"Fs9dS2]Nvn<tk1^rCعm[7MIOJ3IY5jԈLCygTR% R~ [+3rl 43\hӃcO>A*P^$nsw=wr#>}Yڹ~oqm@<h_D@D@D@D@D`df " " "PPv B|2H9s fMgsu( N.zε*WzBqQ8`$瀞=о@T Plp_ 5[Q}w pۀn7O*;3@A;#Fy̡˽zH bsNJAި d$|Od\ة+{-(B^K4mδCR@jʗPAD@D@D@D@D@D@D@D@D@D@D@D@D@D@Dh/;˲utU{骢h\ͽSMW'fMnEsB`c_jN6mrN.mq|fŪU͚O>eO?K5W]D@@6D#uj^{-eQ AU@'T嗩uj \w5(gZ@C@СD@D@D - /L \{mnox#sD@M@U{( 88`0r$P:phLFxB5O/*J,\W@ҥqeᡇ*jD0ktj$p@U r*伇U/:+8B qcSWիQNsZ t|9п?t){~NԕAw((Q¯mϚZ" " " " " " " " " " " " " " "<Æyyʶ훛:#; )@~gz?Lm@nXyܮj'" Q'pqEy^mdQk.C_|O=ٯN*TZ?࣏r&"+vA,iht樼F`F- MgHnnS*@ȡVH+" Z98UH93 ͛wFSi3i'`xoО.n)Q" YI@"6tIݻ˩V+# <P&pQG}P s}CTPE"@T8TVU̗@޽=ܓy!7]˵TD { СBD @ΓzJa.k֤WQX+m 4bʕoxJ$"@fjm-(~:thtlF\sRM`;g]r `8C}Lu@X0[[ZGKD@DqG[w8_ ߢA砃/Oc秞8NV-jUu'9 [r n q\9s7 F  wp~m " "PrUjFr@V/S]zù]cND6mF(|Y@/F" &[oW^? Z9ʼn_@ vr/b :֭ +̜z"-PsL "V=tS,X!5ޯ|y?#L'3*V,N.VD Pk2 :tթ|78M@ɒQw 6aK*@ ] s˩$@Y>p(ژ<$Goh;>yj9G|v/pU{{:?pKvMKR]D@RI6V(,9*,1/" $p@^eceDy/L^=@ V"Z—SzD9Ƨ2@БOjyM <pH>#d }⯿°{\`@Uz/D@D r'=4([8[m ̛gլ 0'ŵ4:on@r(. Qٳ{']/" " " " " " " " " " " " " " M[ԛAףh".j+д)0gNHH79J7q'" 'PЧn88S{Kl,s}뭞ǧz/wvh~`ŊM@NʡVJt؜P.9 >8 R%`(? :Z5p>yH` |UD uP+ulug&@R?p%U5"ظ8,n@Tg-7/* [D U`+Udu_?fͼSiӀΝ9 3S E0hl|XuGy!\) +&p!0q"p啙.; :wqӖh'ezؗ)SADI5ƍ{; ST 4o̜5_.o?z+r%;UJE@MLn]@M^d>; x!Gѣ]vɦD+ӧ{#&O. \D~([ '1IofEAjwyb' жmi3^SM=<J9jSr0>N5WR[{:f" ' g;D' ׬HeUMذ;sxIoڵsv4^{MTD@D u`+ulug#MW^B'p< "|)s@:EOիgwTzj:JTdK?8y!<" AC>N> i(d:sgpQe<x=`R``E 9g}$3V&KE@D@D@D@D@D@D@D@D@D@D@D@D@D@D { W(Qx][V,1vrM 0!y:*" (+Y\Q틀D@vG={E%KD q]iGSqǨ@ G " &Px+jql4elƍ3[%`BW/`VӦw=Y?@j`hSD@D@D@D@ C`]P0tD7!'k_~h> .xi4pt6ma ~ӵ"7NfN8A&TJHLFǩd٥ pO=_" &g^Pk$nِ>=zofzHhhx!ᜋE-!#&<D /*WHy5`2Y*]tEE1wݹ3@4r|U^Q߶uWD |;+2r_AD@D@D@D@D@D@D@D@D@D@D@D@D@D@DW3|T&:J`Á3v}6[kru@ٲQy{z;:`ۼ\}˛2F۶~rEcFyy̜ lڔ)?(0ZtM̛Kw0U/wå " ! ZsE@D@D@D@D @@0)" "[Ԡ.ZOl)(Щ͓O]>p%HID@RK@RWwLӂW_:vSL=+E% @ԪU;:T4Z+Ц*7 \?=ӽ`YgoaͶdHFAJCtNSz%%Knݢ"j@J]wTЀНw|̚?^%ꮺ@2}7Wkz@,Z4l' LqPtGD oO䓁cWFHD <6nʅL*@f Ц̖)lӑ{ݑ/3<⥗-.;ݒs==GN;[l+9%Rll+ʛ.?>;֤⧟z[: {n5Q)D@@*J+" " " " ! Zy*dO=xMLƶ'@5^O;5UD@REljsXxm/|4}:S @*ϱȅJp Sn oLcʨ҈ t7bP?ў@x,_<rJr?xvmnLeK!D.&y3@# G`2`;:6w}I'-9Ʋe*ﺫwnc yw8b@GY4$C,\7b?N<f#5淐ل =>NGڶL6Oe(z z]D@D@D@D@D@D@D@D@D@D@D@D@D@DF،s=_a}% eN9QOAD@ [PVAD@D@@RW;j]vpޙ A?};Ҹ~`=<Ǯ]5(: ^]+ KiS`֬^sw{4z t눊sGG7p~Qȏ3 " " " " "PrUjFD@r@~s/4ouLEu*Wh4BWR*r=E@Dp`pt@zkG sQLJ9Z9IJ];`|~}q;:2tϞa/ʗiW\qZlѤIL'cSMTzG@ бB+oӁUQTswEgX|l/T_goqw#?-ޏo5kF ThQҽNAa-K!ZmT8gcm2Yӯ]x"qyTm͘!Z[Nt|-ggTj( 3TAʩB,޸q^Nv9竭 / " " gѣ/=NyAZt1v,3}|2У~@Vvv>C$"f3e9J6l߇7ؗzOw߭ļyPLlJxE@&^O3e" 9O`*(" " " " )"@Zk֤溭@ _gWpI`.󆹙nX̛rHsu.8t`Rwo8 aQi*]?!v6u@W;`~Cᆬ`(( +WK&t邽 C b3_~+h,X): "B3I's948 smTδt/ÙKnp3yv膡%v-@nU' }|sbgZVPKAD 7yvND@D@D@D@D@D@D@D@D@D@D@D@D@D@D 6m =6l Nн}8V-:J_$ 5 OX)JzS7/^^-hobҤI΁8s&9<$[*@VCxL*@ ȡV$" #pI?P\Í+us*Q4=x%о"T:V^dt\2CBӦ.أ "zTlh+M V-Ë/v-P" I#p-@Ŋ^y!i7Սr@ɒ%qEaXAXysmW ȶj@zp?ғr)~/c{YիWv*c 'N%\b?)~8xBS܌ D09. :([8 9 sRD@D@D@D@D@D@D@D@D@D@D@D@D@D@CZmwejz2yg}?9.YC`gdMUPXg@*((ꢎǗ'{'PN\K3gGs@9MCԓPZGH'wIg+S:t#@IDAT/{X.vq 7yD8+z$ " ! ZškE@D@D@D@"M`]4U^D@"K2?RV=7ހ 4 " L@BfM`t`2c3WNsm͚6M/2y'$D@W_9D(]:k9眃͛7ǜjH/N;/OOgH*D09 Dݺޑ %F#yO`HfrNW%'@Ї;x#@+Wn~K:GZOwޅAZ̛Wt@ 4l?MD@D@D@D@D@D@D@D@D@D@D@D@D@D I>…^iN!tl"paСM7eSUVTT)/w=c'ePIt[r QE ^b]&":WV\#p^VSSgᔆ_֭堶"I޽#Y}UZD @F) " " %@gGPy7)qG䓽=+$-[z݊><9" @`큃φNJh{E!7,\t k0k_ᤓN&8n8.!@͚G/"424@Сjy+" Q!p@pFR֓O=pq gfˤE@D `+ՄuZ;բ!e:բqTx}oFnd/D;Iݻ_;TD {|3ȢB#P { ]P}:|EE ૯P*Arj \y%0l@ŝd*!\q?S*Z GyS]sՌ^Zμ~U TBDʣl3y'DRQD@D@D@D@D@D@D@D@D@D@D@D@D@D@D~ p>b25t: ޼B +0jsG@ [-i@ /<0~KW^Ibտ ,X@NA{i#GqHD@Æޱ^*PPB@QŋJ-Y,tP׶m71w\}[D@RGa =%6qbK{sOsNv@XСWXJrP7\z( 8lO1{͗_~<}Ѥ)[K/N; h,U E@jeϳRIE@D@D@D@BF@B@TH+W) )P+W hh+@: "rG@ީ?{? u{r}tPvwfm]5q۶mQbEg|,J,I:""z5k'Y@u֨Q LuM*6nLY"ˡVҥ㤓Jn4}0iճgf}Gߟt׊n;z?ࠃ/1ۼyI|7Vzu` xN=u[ 6lFڵ^GNɓ1 tTI,h5D@D@D 3Og';o"Y;UP:tfV60x0 ;zOD С…U׆I!V x5.]% 뮻Ν.P9}m!" % Z婻DjEa" " Lg(UJH2EV-`<O>(_9 ϳPI{ZP!ﳯ*'=zutEGD?DΝO?J1@ .0n@ '5zbѱ>w xq(Ǩ_~UD 놨 !!@N~Ço[0~ d7n]&s9P*=tn ,_sЪM.w߂ߏ *To޻`,eR  ,XuQ-D@D@D@D@D@D@D@D@D@D@D@D@D@D@Kॗf̀*U3U8p ڷoz vw Mmٲ**" "ݺy/tdѢpUd r݀/>;rN8$``ӦPE Ԭ?WHN3S9G_=pގwo_}U̮nGt睈9ժXQ@D@D Kt7/]X&:uVME@D 6of! u/_w>)W\0<AD <`+N=S[gwO=d,8(ys=7fδg<" &p@Fy; wU8QdI<#a-bhջWJY8gBS4DD9<:Lz9`W &e˖4z-4E^a~}R%`?'zT,L5ks}믿/ `Ξ-)">[*lE`CS'f' /"͛du$ @ݢM~C" 9Oʕj" " &瞀4C/PH aÀ+hcC[nԩ]wH% >ux;, /OTx?P*p=mj|9з-]; Tu?(e9}mwp9]UUND CP+C@ne9ʍ'Z |1@Ml\zo   sU" "`+ʜn ̘wEc "U9 8O~t횿#-c?8u֍*B[ԩ_WEe:g:EaLH| ЈO=O)'D@F֯ԭYTƹ>+WN^Ytv{쉗^z p1_!8p~ժkSxG6G];TLq7:cbhT b@z Psb " " " " " " " " " " " " " " "m>*G7;Нܮ];ԯ_?۪moҘud/CPAD@D =XqGABj}ev S~'PX @wT<:Xߴ)w=wN9LD'Əj.8H ثW/,_?|tAYY')@ iI6QOD@D@D@D RP+R[8O?ʗlA!<N;/ӘYFD@D@' [ѯ%zS FW. <.: 8@`l4Ia݁vVC㏏&DZrۯ8:w,Y✶9m $@:q~abJԝ4i*T>:6>оHF:g;/W\qSڻ#渱dɒɸtfa4m PJT8q@R+=w)qqav( jU`}i9I?d wSYTPG`FoxAP;w. 5;ȰGu\UZ(*U78c:EL1p]F@?d=:Zn'뫒U8 ࣏ȑ(o͛;|  _Abر8 b*ˁ . J"  Zx *@Cl}r*e܋~p+:)v ;~ɼ~ĉT^yd6j?aƍ R2" [{3fe]8iN#D۶mCT+^{y%Jx'" 뻕c{2W˽dk0|wT۳gio/wlڔt_mr~,[ >(/^ ~#)%`Noq8]qmpx(#dɒX7A3[Upshpߋ@ @׮C~C{5tڵ\S1tPku]1ŹwAC-: Kޏy"t>epQ)D 8A:YTd9cX̰ʒh?/'" " " " " " " " I"f p|gh֬YR5qӉAn 7H~P""Zx̪@Sn4lu8e< Rhڴ)>/v߄H1dAZjՂo/3d: LB-kDPֲ+kY] -PEi*BKoe_y1w|>Ν;{}Fiw/AF´O Z6ȓKlGJ+|-6l@۶mѹsgױ_ԼC:z4d~W܏H<HynA$@$@$@$@$ܑz >TZ})oȐ!%%V^|&޽{ Fg^_G%I$@E Aq:u (J3ʕsIVo4gƍH=@AD=% ;w['GoznE=FVE %J83n'֤W^:>1w=$@$@$@$@$@$@$@$@$;DNfe @ժ}Сh,NIB СݘAډmyvײWZnm=TTQ82z~"^*Z¤{|3 gHxIc);_sCāwRJ$X G͚5 3ϖQZSSF;懪Pش Jl *]mڴ%-bѩ_|9`^]DN$@#y c$@$@$@$@$ TPK D? Zu@qN~kٲe {"|سgz1uT#~o>4I}ǐM.@EKïK&7|?8] M@8jԨ8H6ѣG~C,YбcǸqajU`jty{`$  ت]tiH@ xyә3&m\05&{Z3f0e˖E߾}Q@{+MK/˚PB6lX\ [8kQb˗/+VĆ :n:ug/݈TJyrxW_}e_gHjCw >}:=jشiS[e{ ɞin]V-sN쩤tnGU3O_*έ:#M8vsZIWRžW =ҹҹ#CG@[.$<~Ȑ ;ӢE ;Pϫo]tx3RnA% SL#@H/ynfa iK> 4&;rT/w"h%sIŒ9~ <@˖]):Lyg! [h 1tJcT\~<4Ϲs ̙3kΝk| Ra1,KRwg&5Z5H @xq4",$@$@~[`bWueK%͇WsxhޮKڹ4o}'1$qt\x3VJ)U7*9/@֝r@~C*ѡ&Aw$@ihTlY}Z2.dв.Mik~GI@ncJ[u>mZ˚6-.y:ǔ(Q{3<C{r~FN5}eۗuYVzs*|C2WB$5w tw>zD bZsh %.ŔuSwbSHHW<Ϝ9)h|.דZ# $      VYfYUZ֑#{9A *$K/QW 7~:Ǐ*Vh}kƍvܒ/Roi<\J/{O=zԎ֭Ni"~hs]tI^?p>z \ի[d%? Dojݫ. @t9{;;֬ҥ-bYӧcǎIQ%;wk{WQf䉁cGy΁ϴ2Vw ݻ-Kssjn#j². @ŬH'NI~,kɒw4'D乥aCj>-] hOXr32SI' {9K@y]eIzS Tp͵Q".m*3,$@$@$@N 'zYk ^8ۊ;|2 @ $͛2gښ5k~˱xС]ʓ #Y9%r믿CΝ;kР{g$|hɌ\~W_}uf3T\vլ:%'Ϛ;w]k>$_x.]wBX?qG{DaE4l-qq4HbSvjر#,O,i3g NE/W$tʖ-8vyNkbhC\EФWc]Q@ W\KPGVܹ %F^|E{so5\PTx]rݛ%G<[7M$Ol!]vY =ڙҹ͹u>eel$UGO4ySUXI￞-5Yh.d:P&M뭷޲y8;IX?G 6^4ڿ{{K 1b6̙Ӯ'/g}fW񯤅&ߺ~SR_qH lj|$ KZAjIf)JroY>hYny} j͛y<ڻry3VиG}4vٳ5uA&˒j LY:%ߦ7sBKq(@v>PՔ?92RyJȑFlÆu\"X{C%      d;܍HH \=?ٳgiHDgqM^&}eʔ8uY8&1:8d"~CA$͛7Yöm %mV-⸌CD:Э[7{ɐ!Cܲ.)R"ypM!m_̚5 3gΌgϞ}XmITY?t ,[P"zu b$@$ ]2X8zXrw\#@.-hӦM8;W5j@̙i&H:_+W.n5Z^']|A]:\'NL4 M6x6Z)@cΜ9'ޛ{`ȑ[yca9M.+>9nJX!(T =vݹ8Ç2Ǜ٭[G2fL];:>RdIm6~'9މp4 /^rhSi\y/(]T42q ej{&LN!pC*ܹKBpbzo>Dy;t&iLR">r)'l sek5f`Jq)˗/ǘ1c8^zyK;`T.-O/"N<+W6\ ;wȑ#駟;={vk5JXΝ;gT{:1) ロp-IGvB$@$! )y@|͘aJkצNcǎŝwމL2㥭 b4V&?c%OFٲe1|~2V9@ mژ|_ TW7!VC$@׮ԩ޽7&v˟KO4)Q%O nn4_={ wŊ;֭[Ǚ[qi!?3rRg +W5k&    'ywNJfIH 6 ޕ&zdv󥧲Ii>-L{n"ܵɕWi@U\\j[7Y&^z%vmQ?s[C'U4]QK&~zl1z \::> $]A.`8M$ ('R--OFlKTQ m-Zڷ"xPJkq/\оUPnuܵ\xN.\7Ɨ_~is} m(}xh#fh6k ׇ:7v''@sQNs+K,N=9n+m0ZsKӴx:'`TWѣu.=\;x\ewu$~iN7 = {1n8 4(.>HM@Fx8/Яi  < pfWwgwsܹscFطo_Վ,971I޵qU  p li &Շڋr k н׺:@6>T л%:%,]}k\':}[G$q%A&ĩkyK*LIǑ#j(M;  NKӀ @I6$|jIHHHHHHHH |=ШР$fI^3 L Y96D$@$@$@$@E@i|_  %p*eWE J^U:+vX!PJIr-zp}?H]S|׉pR''$bd@IDATa3|׶PWƍS_  Bby1yd7/^ٳq<1}tq*sθuN[H#3bÇF N C`K\3f^xBޖ@\'6l(MW_*[h!bbm}Q˜a޽w^ik׮d>|8kx#˚rO'2ZsfoϭHGԎ;Y$R*~*,'rn >$`p4bZz|G ;@Lc-$?$N 7 ޓ,A# zcDT5|4ء48~ ~}/ <ɑ1Mz*5i$3C+yҥo9r&pBII"^jժe?{J& k׮mòEj=k_N$ kI:%f$@$@$@$@$@$@$@$@$@^P0h8 jMdꫫ?w]NP?nJ(5MTCYKjlzC VCԩzuM )ۨX(TMKC-+GK䓖w/@tx]s_-v-s Xm%>H`]}V…9?#ς|):/f,W.3'Ve=e/5=?t~KtCT#(W<3x\"H!@H9R3j5F X׉X;_ gذa[/ | ZnpIHHHHHHH 4>.S&jƲΟςJ*>8w *XGJ=͍#}Q+}vyDK\X;w$I]_JqOADv\6'}?\qL#( -Io=m6.n8}ڒ\5r[H g# 7]c{3lj\;^_dcYuX+cĈ2d=4s=WK7y3V ST$>kWqXɵ_u;}eUnbbnْj2,$@8~ܲ,Ixb~DP%e^mʍ6͒q\ScsHd1uh 3$5 ;@I   p8pțXU+ְ@x-`P`@ʺB) S&/vUwX% (V >`ذx:"ҒPAA } ٲe d~Oi?~8"wq-n?9?l޼:ǯ `@^=`$ gNǛLIH p4OfE]thQvmf (Xp\`B//Uz Η}iɤm68qٲe4NK篺*$X)뿿 N4k}+jƍϭHGC͹#Ny^~so_sOQ_SO=7$x';3bE _>cNq巵 ֭nG˖-q1))D!@ 76HA'@ 9}ছLs:[hJ=K.Eq5@!wy'g䙐Q૯YjUE *^ۚݸqЭ[7i}9rq~̚u[g޽]oX8ד@p П3|Y; Ju0cP\hr:܏HI`(]:̑.F~?J|ByHz+* e@Æ]w|M %NDl?%KʳK.Ot$eݻx>QmwQgǿ$2&'݁+~K\7? D>74yU%84νLX+ @8 $}I^ {/1tS~3Cwh^00?Wcz3V wBYvM]_ѣSY!% P[H zLtxykOsB̏sW/`z`ɒ[o |-йɱ+Whhhn*Uu&+}]Iv:ʕ#LށBK[ jΎ{ @@ &8Uu8b$~k])oGG$$O<L R6TdU++qĞ,$@$@E:Kt0YH UTiS@Fڝ@?I$H2G!xq}aڴi"$|8!/Qb!*!' RPrOTȑ%<>dW[fVI $MDw:u F ~L5EI%VTW~?h 9ol-펖QF3lw h_?k$o;Uy4Z$̺I 3￀8ӠAs'^~~Ns/h,ؑ#@6@-MLJ5<,'1گ|ThWBM:,Y~{zBq׺FV\ hIOŊ&…@4`4M$`HR C [6@YHHb>P}PkY>rHVTHFk7jU#Ѷ-P:{~nI$@$|W]|!vO up 8ݒyʜ} {/Zl*gbȐ-vKTԪs*Д?Z2{DNLQW/Hp[~|rtQ~2cҥ+Dv:މl>v킈AnDGQFȞ=L'Qpb /\XnY/|d? 4o@6PWd2DQ̝+7,n k6b Q[Zi32dW\!g_$d#۬+UÆFQo!ʓO>)1#dn%6n܈֭[G\fz`FHHJGAxr:T @0a/'d k(ƸHHHHHHHHbUծ L濘֒%K *3*5`&_$ъk"ܹ3MBH 8{}h< # -J,Yɓ-\01g*cƔmojժEDx#RS;hH\RDtF@ ʸqM7%EKPtMrIؑ믇MNu&!/6*:6|8 %Mܖ[7H6͛eJ ѳ$"{v݋/lI1DdH 9& I@ ?g%ܝHH b"Eaǎ4P+'" Un@ɓ7 ޹s$Ξ>.Aӱat՚.bZEif݌ի!+ug!ҧOb޿ot\yj9ÇneH豉NQ*"[F^LK&OMBMXH@߾@&tz?ժU+: >{1-z_BcRDȈGzilQ#N60^ExSلBZIPOW֭mA2eDUR?fڶ>1fAݺuC4hs߾0F @ȓ6{i( @PogV5ZJ$@$@$@$@$@$@$@$@E@֯v0}:$/b|pOMv,aHY# @x PP+: @$3yrt\Bb2f@tlryҢd {Oڵ7f̀%MKWe4Fc25lbKzJS_=ѸC@.wx G ֦Mm6{^HXП2ǪhD_ Y.,$@$@$@&pIx1PVa$[С@ʺDBA`'Y[x~3[!pW^B=&~d^*u53g[Hb>"ٲe ֭['NSk^[EŋȜ93J.ӢCԮB}EZOh/ &M Z%x;tĘ/.Kgz&z(RhhQ#!1P:"J$ v6J _#"n@$@$#@ n-d5'      3?jʖ$t*Eq+@2PZIBO{wH 6o;VZT?2e1 /C~9ŷhݺeDǎS1n\吋y8PdXq#If,/} FIQ}"NW]⹳bȒ%K8͉r,Ջՙ7ǯs9b5W֌AjՒ@ |w$@$@$@$@$@J [61  %)`XulaC_ *@JԩɁ& h%pdj.^$$nxLlڴ /VX!Sj8yr3~y֬-bZ;w!\yec|Z's#`ǎh%~y"!CL<<4~'r/-㏞Dy%2cX?ӊ3}%8~܈tH1QgK) .lO? .bŀW^v^}=-S-BC@E"4vm\ Z.gFe7=vJE xk7Vyѣ0Sڴ"pm@L9DESHHHHHHHHHHHHHHHHE`6n]cr1^sX}TXH z8alDO  'ФI] FdJH?J J{ψL\wD$ X6"@#I lL'M?if# @9?[%               p& iro[BLA+ɒYHI Δ):^ ;W\q^{q_@бBq;xutb.9'[OH *UҼze% ̙zz#XZ Xx`P@?W;J};ЧЯ1,$@$$id m!    H$@AHر#N'Z*~y&]ą ETg,YhC(@5jim6  X'k>hj4H!PA&\+ӧGɴS<4u+0w.#С Ķ쯿 8 j9϶XL@+dmObf#UP0`930~94w,I@'oc 8~h[ wnr!'IPF~_ CZ<HHbwT嫉R=/ B,![Tе+P($/ phu" 

    ƻ iq }d嗁+?Dv_h= @t4&,$@$@$@$@$@?/ D6.]獨Vd֧@ &!) @GIHb@._L IRcbQJ*C=#d"j_G"FD34{ٲF|bE`3^D,$@$J*5ׄeEPAmrsj*+c a# |/`2re``Au72΅<6L6YtDRjm5jK8Ƅ\| +ZԈs;0Aۗ1c= TlRfIHHHHHHHHHHHHHHH e>Qk ]"-]iV^ wN;6\O$@$.p?#C#ht8G% ȑ.H8Ǚ3ߌ#w#O*s-#KaLz,>PX:|W(_Ćv3:bɅʕ qlH$ *,$@$@$@$@$@?/ D69L1c"w I 9c̚{]ܓHH 6 \uPqVtiӦŘ1o\0 -`xg1DoX8pCw @Ǐ́#49 TU$C3bEV ;ػ׈h`gz0B4 *Ypv//_5#}>;SِRKL/7__m\ R'PQH2OvHHHHHHHHHHHHHHH }$(S&qQJzuq,$@OZ    ~{[ʕ[`"17Dg֬-FLKD5-rBM@͙(r:k c񉀊98(]r;*V,A)#,y i% @l26^ @&TS+\HH 2cjz"fZX*bЯв%Cȑ&g`[bm$@$@@%"[ZN6A$*)ScѢ&nkKӧ/M[I:rLgMb=LJύ ޚ5FBGo)VL$@%#^hek$HsV~_|1ղ0Șшʹk|yU€wB PpI710{60j߽V(`) dtNe}2gNi~f,`<̢i@@ɒmE?,Iư xG`~_oap,0~'  Hŋ[=jP$,5k2%\e         H=3:$&=|#`߸Gi,>U: &B$@$<3-2Ȋ`к"EaڴihHmNB ]:}{8_T x1G,m$;# D9\\#qGC*UwOsͦͻ۷Ęxߕ }P]MLef,?c3Ҥ,i- @lfl,HHHH4j,Yi#" Mܨ"JAQv~*~\X\m$@$@&@-g_kذn[Dȑ/ѣG˪Sہo+3/4BZॉ'Nq !a$@̙"!\͚5AQظq#J>)r{F]T@Km~} ՗. m Ѻ; >u=8kKz8ν_>}oEuplݻ$Q _K\P`peE@e^ |-@A: @p O]w%;qبkɼk0.3'  ||e’7/? pHHHHHHHHHRO7L4Hw/{x#;7t)|}HiTPKtDXHH @7/ E&ߋF*n{%@t6ƍ`!~Z {/pu&vS'F́fG"??d7w$Rz@OŴnEk4i74Ο7~[bZ'|>zH"`0f 0iD44,$@H@.,$@$@$@$@$@p);O-ܗHH ̟[ɽ p}U VA$@$@\[CG;۶aǢEsVG;v%(S8ì@޼ѳmxٺT[Fzrʹ7t5i*FfΤ  gЄ<=@$]`U?qWX X̼BeIt|̞ rKs- e:ٳo @PzwSP+h]:0Θ1~-$$s[BPay…5ps  :n<T (Z;^'0x0P1¼g@9˄9X: :tmf܂HH GTtRڂߑ !q#@j_S+'4>Mp)T8*T`pH  h~ M)S$ZOIH <l᧟Fa,v͛Ci Łw߅u^}(R8س'TV/ͫdIF+@͚qСx9Nw"Ə7y6Xā_}u ;+GTxmGIHH PpHHHH|#@A-߸q/ &XAvNM=c_|%![i&>b!  `V  D.EAZS & 8J;-nGzW7D3@Ŋ-IH ^XI0F(4kL'V`߾}hm8@ڴ1\O4DTTEoш  ;w ̟ !$Wۑg+_5 ؾ݌X܈ FHakҥ@uZuԪe~oG ueh_;C,$@$@$@hj#]:cGς(z  %s:. T['         x賫gMS'uk@-BK孭iՖ-co- ɓ. j)k"~wca6ٰzQ0gϜI~=:@޼ /aM~9CRr%Z?]b{i~{c8qjr,Y=[};w_KSѰk!jδVyG`$`L`@( @$V$%H$@$@$@$hrq$@$2myGI6WpS  BITUt}6qoM)*?uN-S_\k"uM9:ysFsX @$߶'ebH8^{CQ-a&ImUIU\k"pFGP~؈\Өy/i^6M}h" Ty~`jU@G4@E7T0̘{.7[@ 3IJeo dHHf6n^Dr_HH|!оNn_hcrq $$p40nϮ,˼zZ2H*^-  D.SԊcHIBOng5mr3kxI 6^pZ˶%qH۶%KRofY}W-Z,!m\̃De4GPr%(q{ :rdV}5#&I[ kx==HKqM#Z,$M2Ie-Q7o^4u}>] jo1p;h $G`XY4ĉH!Pp=]w5jsghzy3'K/!/A@B) HH ŋwD 曓kIHHMLP19*\G$@$@$@$@$@$@$@$@$3]Ѹ1Bo5&`N\@޼/$^O$@EOA:nH cJ 2d4FIG^{ h8p jwSf&F>hL l Tԯ,\}$9u ~Dr9 05"#(iQA-pB7شɽ%*հ!н;УZ&2hLFǎ@a3$  K kV jː @4$Xxh H@嗁sMr C `]$@$@$  lB-&^<@9 S_ |۱RW ޳'tH@[׬ 3%&ujB$T]?ԑ@FD(\p!ںW _eK W.qc; zԠ%K68C\K|$%y:z,u^9t,x pP) ?h(RȞvA ;wb$"P^5$@$@$tw E;uJIHH{3O^Q/         D୷gLZ46eˢJ,#г/S`;E paRP+pLY @l[l礽زМR+V-4e].,A@cZV61GNre`lEQf/#{ysS߻7b{Dڵʼ^H|!:۷˖|/ߓkNW4/ ӏ#HJ@nYHHHHH%ZǏ[ ' tW_ <Zc,6?{goSBT(*A26(*I(54*C ȐȔP"IBۜN{ιg߽^{}ٳU`@x%9@IDAT  l%%nh;iRF1~G_%Pn|LƧ|Gp⫯qr+" A1 PBA@ha?SNt'P&pݞҪUT@S^ψ/LJQ(V VRnZ]RJ7ȹ_SItSO*Uׁu<ΝʕwR,p|hL<p }ଳ*UCHO#hקܝD 3x/]3j@v^Gd~' O >@G^%+<!ձ" " " " " " " " "^χٸ;wf]o*~=Pg^ZN]@VJ."PdV Қ1};]"ƗիwRj8 /FVo6(X"hc"#jf]>1Vn Px/<+uT/{2g~zw؞-[]\{-0s&РZJnR-VѧZID@d++" " " "  PS*<[n D 4*A T <sA,$" " Aڲ%ہNӧg<מ! h +<<_|_o/57mIGD@ zB=4kVQ D ^8TV #G)o5xƒEx\G/kvmBPr%޵A1=` j0&;P =g "Mt 8F 'O(iw#nxϡmZ<x r~'wA'm<0p'ܼ`l "mTݏ3&Ukz@܎v9@^=~T" " A"%KfD3/ -v4/N,Z)$/߯J" " y# {J7={f֭M7e^5AओO?PL}{F}l{%H%磈<GT]BC )HcS:w-(ELh'p!@NZ;?A|?sצ$#*"*Rn3X d:s0S׮`ey?z+Ie_`Il L My\UǟToN;3 vj쳁+:=np NQN9Dr3yF@e.`u%H&{" yd**8ˬKװad.l輱jn!^nؐ" p5f/#{:q,;P:iPԊp=+o0Z, LpfY81 9*Wc+Dq?N{:EŢc;:vL͘)~KF?^]G+GGٶ-kz5d dz}Nr2i+pSO%J칇~';|_g臡$" H@dl5YD@D@D@D p$&QD@D@ PP_z@'i5 J1mK" " "?{Z d8npҥAWժ@j@$->ͼ*pرy;6YA ap_lOCc SԬo@ƞeB n$" BNխZ1Q2ZKvS9G)L>W2"?jy(_YPO$磏XzYD@ A曽XR7``]R?W|,.x!/c7_G{ɓ=:uAw+R+!mߛ7/>tONg2}%Q?xy}KID@=ZD@D@D@D@D@K@Z%E@D 0!?ft0("+@vJ: Q Q!J" " "l|&M/0u'ŏ|1tժ^z\kx+l=# ~34Rb^hlB:12dhDÙy PحiSF=G詧_h." &е+#\]XNbD0ĉMDUrU6"w_Oƿ/n:Xw^*`? AmÆTi?='O?\ O8#FxQ625(cr/#?\ܟ81c0{&!)qm6>{S{swP| }tގ" " "ڵzmBt'Ċo_.UGD@D@D@D@D@D@D@D@D }⸢hCgF7>5T (^ }i;$";1`D@D@N@nyg Gz5a! jjkj`G9C\‹tH۷^lۖˈϮ+45d]K?ޫ?Mz" "@MID@D@D@D@D l_󛋎H%wgөT3%^S/P~Sd&_-ffqbz-s._MF< ѱ*:WH= r\9c^%" A#xw"QVO8"mƍV(+cay(tH)1رzZbp1%#5??Hٮ'Rl L\p@RѢ'Һuz();qYkQdڟsyω+Vxߜg%  r--sD''1WHLK1Vȉ@Æ@ŊW洧@p<5QYID@D@D@D@D@D@D@D@D@r"0>0m=ht]^P%,N\{N-K9u&>6O&" D@n^]{wo}DƄ.1A^xIF`Gk^~ob]Z_}gK-/\tQ`[wuxbAF?xٵqc^Zlnغ5wd+",잒@~ 0_7/" "Jhܵ+C{A}R~K|Ԩ 9 @3*WH, lnA-4\h38'{i󷘗?m޼قYku<ӧwީ3;q]qfL=iǎi Bi*dV/M͋EnԿgVSbxn. sǼ-YNqܒ!C9YiшM̏p Ik ." Go=;؎^n" $iDiӦ&j4&j_A)Ǽo{Z#FxNNܧ~}.Q4i-m4 xI{)EG*'76SN'ܶ&d|w~7wix+L_ K~?K>KP;>1W^+eY%: 2ƺuϪZ{AyS4砈`֞B\"]D7>8>N L˗8UK 3|V&wgժUMt9wt]l6Xӿ _#;sI{(ge??Q9֠UyHS[_6l3gӦM1WW2JzCo3حKSo+Wq@fk8Mm'_L,]tB[( fU]+L@qeU:LD Ɇ T[Z$X?,x}X\/&FvZqо=0w ojŊsn s,|%_L$}0ARт0[V+yug޽a6K@.[-mV7E' _r п'*Uz8 |o\-K$qe=ribe2ޡR#]=_䯑j "5![DHJϤ, -" "G;Â\O<0PDB W^ s [@}D@D@D 03sbԩD hhDcB_uko]2@6@';2mNts?\ /s0/!FǤIb&Dvh × 6(2{,@יNw lQD~\g2<>^]qg>hs lj*#5j@@[ٕD@D`7' .Zx`k`F%H'4 c |J %(JyA/2c_}=9ʋ֔)@m{sxa:$0ߟjb=~+crKBqpg0jչX-M#K_zև}}\_e_(˜b`EX/DaNCKEM&?@ 7}꫁Cam122I/RpV&ٿ‚mݓ/…S(m%CDʕJӜsQtLt0?`dYd." " B{ ?ŋ˗/w"'|=ꋖG7Y?}OZkqo3~ӁIa-NU,j[Z;n6%%@3槟~/\ljǁ>oŸ1ŋnc$ض 6.B|;? 9ı>_=P7YgLjXRZ;_-\0?˖-scO6Q8 |??P8mh{nh.Ƨܚ t ] a{>o)MLPqm<-e֪g[V$r]ݛg;_D׬.ܢX؝|:)^mv̮H}D^g8ccGexAy@ |(H|tFH7{ƍӭ]W_<R@^=-nW3])Ī@ }@^=*"7|1p睞8[v *+" "0oѶ-k@^Ƃms4p{iO4T*1o /|@ZEe'C˜3OgF eUXϔ_ s)(N~`) vB 9M;?(g2eOD9q::-$2^O_oNJ8؂OFÆ U 'ʔibG̃^)"_|Zh_]w]Dh'H4~' l~N4i?bgNctNKtmw>>vZNnW}se/Q/0OOٷ'#9EO:)[tVN\L~sJ|`NetJrI~}N*TpΙl'?}Ц L,kl9\=tV˩HC+'ek '{߇dqLÛVtı$:=~(HW%`=g0E >Μ9 Rv֬Y=gIqZ<#v"WM=;hNɲDݺ9 I|Q`^;0,'&DT~[@#/{w?R0Ϲ)Ea,>c8 s]`V\Nwz07 & \|< "dKD@D@D@D@D@D@RڦLòiD#〾 -S$ߚr#Ps-gIx4hPߦfXߕ#sh{43d{*Oac0QK Ф'.@N%[♧)Wևf?p筙8_/jųgv)F)f}b.LK'?>8m.sN^%Ĝ?>5w<8<剭]r p}0״G#INLУ/H_<3s8Э'&7i35Cnvι䱾R ysOؑ?*?f&+{D쳁%K`~|HJ "B}cJP+zv:RD@D@bJ@/41$8[aڷ)@6 %"0P7񃶒DC`OF fO$" " )O?j%P#DcA~;O`W@ Ƣ0sO WtpcĀ . 0qZ ?O`]@~xшE39 ƉA+V MilOt8ze3ukOHbZXh3*g0c=6YjVd:Y\|򞁎 -? dQ$S`4vκ74ݻ3mE:Dzj7_\|T/>/fRab.LlCtc_ڟh{b(n^(T܇BuN9fymM/7安XN9xPɆuؖPwsaۻ~;0qkYr' {i N2/ąǻ 2}I8X&PP$Hc;apN :A'yYlg&PH,-=z4ƎnbLXdvu\`'(ߧg\x)O>><͚5s9&&z"P$UuNH,|5jo83h/}~pYһn0Xq/.\VfM4n-Z0ߦӝQ2h<8ȭ sOF娣E@IKO>u)ő@&Ԋ#^e--(Si`?BBTiپ1[cfطťUЉ/9s0m47f,ShaXѵ}B0@6Rd&@0S 8=u`J_ykMw|jL &1ɯLv~tÜ - PԌg |>W5ldSD@F@7g#E@D@D BSLCjρs6oti5 $"PCL3h!UXhfLϽY|*` BSȂt%KmZc ;;_ȟS L;$$@h l~x0//oPXDaJfũr8!!Aq +E@Bj}xh xqfLk:\+%' jEnz*?st((`C-ּ{ ŵ?뮬 pYߵ J_3/_V ''::b}. φR`prLg8~f`ѕMkoٷXR*%ᢄ9dkc?뇗uŭ__ ya <EN-XM;(? vO?9St&mdN+n&#Vlj 잙NZ-"PdYuXf1Fi}-ÿN, "7n `N4M^Z݉n͛7X{TK$#{f?l03ƍ7pS5rϥV%` ! 8Qthڴ)Zl . P`XMMJvUD@D@D@D@D@D@D`̙裏&F/^܂tz@dJo_oNMbs9\rLugYSyp0B=P?[bbZ%sQGԙnl2uGDs`FgmcB3$OHqSyѷNM\s$" y# ż [Z4," " H@/4?ΧP${ SHU3Cw!" 9!9"# <(0Z6$/1N ]͖7`~3'?PfځiSܜJXpP,Ki1H~E^mDV4gP4N[%JpZUTAժU3M&PH?ݻ^|ɚ+WL:ݵВjҥKu2Q"07v[wN8}:`Cɹ 3[f5Aiɒ%&:M2ױ/@L rX|G=<( d ^Wf?81~ȟSntVCl/ CDaQD =w"gD~so?N&{6Hr>3 nЮ]" ! {pUKj jiڴiN@L!-R1 z81gXDr6hGq豭$" "5~71Çm.N 33K`: sJaѣGgQxE]6mڸgN`u jHC" " " " " " "`~' > iv[0׳WJvR5j 6}Iwd xpۧVzAcq)z>e)őWY5ٻ-h>'{ėi~qʕC#n k/0l0)6~1F̫\̱Zz[.[C>?o7m4Qk}2|Kˑ#-{nٲ;ƍӰhk6;A7[LJ[Ԭ9o($"4WE$=;)" " 1% Tf Tsĭ0su M,3`e/"Riqp)U5U0W6y[*B" " "%:@-\M pgw \(Zed4#PZ sFl6-e)t,fŀ 9ƇO_عs+$Cs#,D@R?~{ƺ1x/>RL+iHP+bjUVUTT#Щп?@m>o2L7͛&"~v/[{ϤX?Ѣsk/GVf5?G5jHԠ .I}o:7ov[ 42LX0>6v|W" # {ѩA} }p,A ۶mNQ`遼vӷA뮻[C9$5^`޽{wm6m1\pAZhNXϙ#Goi'4<*:&*| ={b ]~}/9; }gx`֭ѹsg76ɸƃ3Z:UgE,x$ƲG=˓[F j%o۩# {m"{LfٮOq+ j9E?vd]vi!'Fn3"'EcbCnJk?ڷKG_Z^QT+/ںz,u|M^x&$byj]U/HfW$=;)" " 1% Tf Tsĭ0؂7Ӧyb)q;Q2QqD@Og/⪀'@ěo-x#н;H VD@D@Ҋz^|8͟?pgw Q4p )@ժUCrҊ*+)BG:}5ktZ QG$8NT"<hF!]\n:Ӂz۶m?ό'iHP+z>Jl!bn%H5G퉹DZ"E`;q=ly̙FA"&/=C%)i$ .CQ-_E1x(Eq:uꀎv$p fY2s7t̲['8hh z"WDJ%L@8PdʕN=뷷n97mT\e~ۉu!;VjϹ_E HP[@ؼyzgA( Tjռe&{_;l+0"IK@7]*36^ .$z6:RD`lů0`Ο.gVwݢQ#MM} fo7x٭_g{i_ȞW_<L)%=/m ΋d̀ 3Bk\33nّI9 g}6(:[JJ" " CZѳӑ" " "Sz)@e&@5G cq!4XwDHO<<,=,}XEL kcu>r[ .EW!E@D@-[0k,gGC>N?Scqsog+&Y-U\H^t:ŵ<~p,Y&pܮ "_J䭰J.)Di|Ygߧׯ.)Tks::+WΉjM<9Ltq`@޴}; hgf_]P^{~Tw >жU ΝF3f'fL2T 4pSݺ/JDVÇ}l|s{[]~/sƗrME{``ŋow"'*&4-"f4zh4j=zp +N$" $0:Rw}7.\K/w`Q]+W믿.}Qtle$SM@ZF D@D@D@D@D@D@D a( պqw J_7z vz͛~`xpl$ƃ˖yQ." #Gz%x&[=ӱDG@nq(ٻeE%u馛Lk֭.:KzlXnLhѢ"09FE3_{[V@ ]B/mVVj-=t͎Lr73Rh"Ntn٨[.,X#8"*Ҋ@b,HEĽkD@D@D Kf>ʘ]Č{|Mùeb2HcywExJ, TB]t>,]BshڴĴQ R/6G?ӦMsNիWǘ1cЮ];bj8L)L0kI:*$E aŴXM6D-&!P_p$f,ѬY3'ߦM7oOӊU0)SO?t\yIc:=Sm3i>;kBnG O-Q@W_&"0=E F~qbŲ2 0w``c7~<1- :9ZZz  jJK" " " " N@<*$=<0p mRYL \~ ;p1^ $))" "tݻ7.R'ua[ou:tsZb ~ yKID (>€j;vD>}A?Yfǁ{92PjѵkW = OID ~/8&|g(i%HW=Y~=峒$9ýkhݺʘjl2ZDY, {}N 5ɫ@ 5u3~&R /Ѷm[̟?۷G PNy=z4lOLફ`h>cf&HP$.u&ID@D@bF?tA(t±c~z衇4#cր0l0'`.J" ".= tCA QFT?,_>}:J(dP&%H$P(^xX1mVPzuK ^vm|'g#5?ȩ2\w(g/ j/s(w"%~wԩS }RFO<1t(b޼yR N;4'm6SOƌ񄵊6&LC&UDeO  tvp%@!dcf /o1h+cX aqv^{%AH$""$" j<WC%>e|34J"K |=СPqc,ϠD@D@R  ѕ*UrVO?4XGug܇Ays9Nx'."hs<`V2oΝkOw\pʖ-N)hܹ3]"s4n O7͛7+q[B&a峈XD ']Y "߷zUfh":}*$3͛7wvcǎ5A?\`/ R}\rn믛y(\^ 'oժW(gDtb7.9%H3f8qQ >~!(`[ W_ժU,P)Ub;ǮaÆ+bEV&CF8Ѭac`> |'u+`!`9b[cP#Ti._@IDATZK/7V oH?P' 2p¨P2b/ AhDUAD@D@D@D ?QBD@D z}^y%eU _|5 4 8૯*@|0@fEBnV"y){pEvj׮-4r@(egYogM0H=z45jaÆYUX\s/=cD@"tg\_Z$iy(Q"]$O>k)Y?U*PU:urQ.3:^|9 v᠃J=$1s>0JNsfu%qMUX0sƌsQ88[g1MEk{Y" " "[:NGq99(LJa[o{}uc4'H~KoMq9KcǎN|˖-8Q;+WAMͽkAl.{C˖-M(DukG_/[KD X$PiD ] --/{OowlcD+r>J[!@_ӧc۶mWfΜM6i֢5$ r倣ډ!Cnć'(n~-%@!o7}W^yֈ@З$n<]D@D@D@D X$PiD@D ?x!ǕD .< X.2$ l2x00ओsB*@n݊{^:k˗/wA~ax(TPyjG&P\9zN xzsakPB'GMC͸rLK5%H7/׉iٿƌMPDE Ԯ]FZ)Ԩ)T5ʉ׬YL&Qr7]Ǯ*)S&j@zO? fAZjxо}{P\O(c(u7ǀ0n8,]_zM1"ע!M>C:l_:(@a;wSO=i +QX1Dlق͛K|5'X&"4/GǃJ'o1.bnl2E@D@D@D@D@D@D@D@R p,Nnբ?ع瞋m۶H4\ 34ƃ% B'kWH1w F-c;t1dܪ_"~aذa>E3KAúQ#OXˆv`8 `ʔcE t/r7;2 i{o吠VlED y .yN%R`V(GD@D h@꫰@ȑ. :tfNv/}N " " {Xn3N:k_4i;O1+;CNk{OP43D~HD޽qꩧX)vҦM~8q"wv9U3 7S;w`:JLয়`ereOLlټvN.GH *UBѢEݳ"5jZ iQ4N:.`-qףtҩPMAD 't}y7no )Vw߾}1hL2oj֬%K^z._v͞=["[vaX}MWʼniz(0q*H%JDw!PBWI@zwnf\n )+^yԪU+SD@Lx+1}t')&Q1a'eOoW_EO;4)Sƍ\r%ѣN )RJ>  4, ZVJ," A`ڵrE9A(uꗒAF Tԯj(":СC/;=JNpx뭷PF K۷o/2" " " " " " " " O~I3f*"$R(*$ ^9J"ILHZ&ds GI\!]D@D;v?hΝqƹ癥c 2QO>N\AȾwO=T"Os16(lٲKL  YfڢV+Ō@ʕOcŊ`֫ gq͛Q^Hi<}ꩧ]v1`'Ƶf. /`F'z+֭˟{x:Q?sehV<gr۞1Z'kY*mNp) JYj@Mk\ P; XO"UŊE/.=^r"wPH3P*?7N˶'kky/^>=ܗpcʕYfXέߓ Gh|=`1' `LG 64HD@D@;ÉWD[nҥK^'x?csWv" "~ Ro*T  .tϚcE d5~w.y ;h<έep[;UD@R26){1 nݚq=~ū/n|ر#6ll {nfsǛols><'` @ÁիNڴ~!c%3Dآп9.2gF9Z7d]q]"!=u͝Q9 ?8:X'khŭnذ'N43rjpc\[TV)Yu"Wvag6x019dޟ%ؙ [Qo6'ձcvMtp/z)bK+D>W;8W{>ǙxO~v@@t<`0;,#[A瓵Eqk& ܳbk>dw絞؟}Np,?tZyt<#q7sg`@l:VP%0X6 {r+ g4 'k+=zOy睗CSvUVwg[G npe_o&=+ۃ;~:t(.\e.:LD@O-X~bЬ^ډms\,ʔ)ݻ\rn_?*aVGc,S߾}A@jj<65f@.w=VZ4++@2(`3sc +VሼE"Fci<8#- {x0a/_nŗu^4gѸ$-ӆQc|qi6e$OWJ*"  {Oo-Eqw_$(dL[>:KZn&֜z!_嫯uhzlZr6.iթk!D9- }xss7S){kr\›/Ƨ~)Snm}3bCUc,Yf~C+~/WD ; <0<E@D@D`'DKU+'aĶ&" y'0g~[[oa{& : j"IO~ПFe /oq _ouc:3b{4h C.]O/~Q~'xkB|}iF@ 8N!" "8DX:*&@n g7uaf jƠK\;/|9$ ޳/(bAP;4zhlڴ |N2ukb=+[pT@y, lܸ >bZ `wN%:闶 mڴ zQS~6l^2'c'ШQ#|A}݌/tEnhxGJT_$( 2G91 R nr*l/Jg]Yg Z޽{v իFgqpA @s;wvhnr۾-[caP#94}ly}:mD1^ }&g;s==u5EzWLt^ߠ.̡wx{O<: <`ÏﱏNy\uE; N=T'&4~x]a Q'*|xyᬳryO4-|`,SnܶLG" Cz}I+{P2r_^Xr{VܞIOɔ@)ľ )x{ /n6ҥK]~dw>oX6<9;DX >^fbr^ =ڵ3'N8`ncR8e#GaLyOhJ"wr= g75~]3qi8/U~۷o|:7#сGƌcή$" '`޳!^)g ϗݘB֭}𸜾$h"ݔc43 UV;;pe) !ۘgn,dn~Er61bۅdQG~2{l&-@P>wer 5gVڗ>xw_1,vr: Y^sh Ykیwӂ9y\x2Đڵ*p In0,H[g`nk\Љ'ڊ\ w3rGnذ!dBf2! f&ڕdAC&䎫UVD=6bb;4ϐ`6aF\!3r!oDB{M<9ԤIL~7Cf2ڇYfMD1& 2 ꪐ۷owU\fѣ;?v5/Dv2[p u&K-[v׾ɰ`Bb;eiAC/S=ǃQ ߡйz}){$%/^O/ɇf3,^Ȅv=;uWs][DD\&y>>LH-d^Y>Wa#T\isC|S~[?넉u嵔]m{vi0!X0cƌՁZ}ʭI+{P^~_f#{V?IʍevWӳ2>3琉҆.dscǺ;˱_v!?q] SDr:&ќ/17ޘJ}'|ٳΥo+ŗe˖NYI@|Fn.3My2|'}W^q?l<'WBl;-n?cc7vAWnذaZj1oׯ_K.9PΉ~l?]7<_#ĹM?'輙Q}4\ہF"} W9aLMds{o&9ʧRʌ}Z?F2kxkn9f]USO=?ЧKvc ĺ832>@۶mc~!CS94q_wWEvBR2dͤ}{17b/=NeO1b{Dl~'c}!uIes}آ?kr]w;RHy;8wL0! 8B4`eԭ,ZY&>sR1w2cD W̄ZT=Є, 0jql)y0.7uUD@(fؓ^("P8ԔRX Q.*YD@D2F(FP,z4֭[v7n *.xw8U24DbM-ܲp:EJU0k]}߲h^|YG+Fc7|-b+F ji_)c wqoX 0.\"S؊ELwK BI14/-XCA~m]|3!Kaꫯx׈#]\pwA0{lbsR m$Lc; K^]O:$oJfh:_r% ؆:'=":tIT0=XH4rZXǏ% dfz).T {՟BԢФ(>RvmkDۇD]ìtR|:x`3֬N//2{-t`T%a.b}x+{sث*A-?c/??,O5٘ȻS({n%ќC@s]ɷ$⑳frs#O><,2 F6Hj~m_>}4W\[y93C^)JP+Lj}[EMy晕v.X\ݎ9H+ Eٹs?e ڸnÓjL̃:vc9 j%Lωf~ӧOwmO7{4y,sm6Hs#e˲799c̯- }yc9i9RHw?#7I/'{S6{sOtL_G}t992g#E W̄Z)@vh&+V(k͚GpЮ]YP D^|1Эp6*bE@D@@֭aGdڂvD`@;6m 3Ěk?s\=܃?Xb p y,lj:U9}: W_p9/„gΜ 3d$,oYi_1"nV?`LdĬ馛V.3l;w޸V[mU_V`F0-AN>f܇iɒ%裏N:xv^+6x=`b\`Cw1)wXU6~o#%=ȶy&[[yX0zD`8ދ+f $&r7. ֞.ߟ͜^EIEnkՋ[oE׹(+\&XѯxQxl06o*=MӘ_콘ߓ 4lB"O-՟!׸m+AȈ)UINΥ K/]w݅:>tgq{;&LX??7tL\&Vjs m۶nl[lwU" >gj^oK*o>k*^d}sfb^Ͳ8`΍ ]EF믿ލvmlUC2xXA4FZ7|sM~=%Ll*;_ STb$g\$?czy/]=Y3y|laG{wqrHE)/81} ޡo3f{꽯>f' v>!D]b:j-"%n6!?' 6}ȂK.Izj^|l27G{2IID@D@D@D@D@D@ʙ;'VW3M=ğ1u5*)4{͚5bs90Ob\/˩yml^Ta"ZwK~jFLq>ޞx$o퍉yN=Qӧd $3ճ3IWԘϊÆr+n!3Su gK$&=/T(~ڢL4e$[x"4+ksDP|0dhLP-G~6V "P@ _E/fJ뼪5" "P(G &* !oW_ Yd~(:}qbC+\E(3[(9]t:SH,.]w޹R<BoO"F$ EPpW[IcA@cRG?K… &3.~~C:u*>2 f*biVUNl?~޵Pi xmU;x`wZ5SNx7@jtdb$J!. QL.߿Uهr[hdYϻTAD*7 vDI/y=}d'{eޯҽyŮ%b HOBlԫg4yL8%:|ѣL #Ǐhҡ4) y@|esFmO?4cr/_w}׉庼70O?{+~^~ՉA~^jHWR)(;4ݻww|DfΜ9n-խY?}UA>CxĖۯjhfɻ] s/t|>wMUD@D$ pܼx✴ϸ"^Uә9rH70o_ժն dž1k@s|G}*?9^k=\=E~${q~ӯz%BEލץ"_-AYD>WaJv 9p CXcBf`X`ͅC„#U<֏͙@cT?(^~iE]M V7Y!hX5|Yn71lXB3X<-Xܡra&tˎ珵J(qcX所䅀Ā؋BD !I.ǠЛ@aNIkJP(5>}gC>}38:z;A1TDǥ(&/[nɓqWd-;f!Ѹ駟v`@n!W_}eϪ6lկ_?fkv&&7OdL/iO+ϓyX>ՕF dC~?A(E^S^5ԱcGP8s;Y1$g e뮠#m|0lձ"Pqƽ'L[1-!VP^TDdJltiU!}OPUaVݪO39ls3=? )r۷o4̳[5sρϲL^k4d@( nn ôi֬+3S; '- qV,^`r{bg\1h>8uE_}㏯rGGD"_`aLM:?s|7|\x.jZ..H;%U*4d?*bM"qqcb3ճ3c89qL9^xs]˥n0ܴ)pM%%r&Ed~mQ(Ex;>w9#7/{Ş4;48Ѹ'a*w" # AHD@D@D@D p27.NsFU(4&Mc1ci ]/@^:n` "#" "od 4袋]|Nk۶Ϋ7YgGyĉi^` ܾBI)~L^pT帝à4Yݱ' ?j_)V *dMb啜Cm>}ϲ^lYE?&I$kU W_-qX|񊟱W ce"J?# %o؉mӦ}7ݞtd8;tV5*n"ZӢZ{۸.?ρaLկ:k/Jr# jF<할Vp[e֬Y't~^7{QH9ٻqLL©Szsf6tS;!՘Ş/%+|_sO! ΢rLEP\LO>zN>j+`„p)KOeѢEl2V_[|q}ŋ+3;1 }J%EVrƌ8=H*0q"@wn"2ŕ(~wsV" y$`%Xf -i!(믏D6(,Y 4m\zi+pt} Tى@4n,_`m<H䪫"5#.]" \'" "{q1Qȏ?Z*{!b+h7n[޽ݶ>m002nܸ9DL!b* .~_~s9;3\ven1': h6 ߑT2c*ɇ?c&v}K8qh;F&@ msN}Lx)bp2KwWXf\r%H1Ǹ E,ؐ/}w(TŶ-m3 ͌uN:U3aܶs=}5rFƌ9=3&eˍ>1~iذa >&~~#v[O>q6?{~(ދ3BysJ`ҭ9gyίX`w~8?"&fC@a/bOJ" " {Wׯ_}̲yג9| u]ݳ''[ps6 sr>$tO#Nso51;"ի׊׆1kyWF̋^ЖQ)|fs[rb! {gc)2e+mz19Ǚ3ggǏ 61X J'`aH,fI$bK̿8ba _TcTЏ͙[ v('|rD :tpKO"\@z<1ؠA>/G'o`_w}ȑ#:Q(]`ؕ$ Ŕ`SJ" " " a 0AC\.9.zr]W4~6(iV#&w_ꡒE@D PBDM4<ӡC5_j*Fc#&b0BqԩSo4֣ (|<6m81)17x"La]2[!C1ng;NĥTm>} qbo˅^k̑QTk$W_YѣGXUѠm:1S [X/@C,]3EFJ Q`a ~qǹ}F_~hüyv"% 7Zs=BѨD<#|?N:ɉyw˖-#iTNOt͝Q5/)B0rytIcF6a^<β NZ~jt p>og/?Sg|QG9'͙3ޝwYͤON{OޠRLi>|Hv/T jn=4a^Ϣvl=؊{,H﹤=vއ)l߯va:v^^;`7)/62 Cxxr;l3$ d-w 7D(IQ.Kq5z\cJh0&qU@9=g9k3.|`PS1}9TρIN|%Ω1R}{3ߛ6myfa/d/$" #9 Es!蔨a9D۽-_<{uYgwc8^?##|Df -&KO%SP>q(B6hР &F")x$6hê]`XdM@#GolJ" " " &w@zi2*>P7 ,Yh,vZn1 ZD@D u?ɎIL߀Á8*ND@ʜĥ`Ѿ}{S:tPTD`h0mʕ+ab3(W_}e ._*0lSg74ng_?e{lva)MZ5!1nE^k&,Cu0!Ubٰ ٫ "-e˖SNO fmގO?>Ί{e{ $^{\|+a[7}eւ7^9&xo30 ?O#:Dqy1$3<sbr\4sLpd spt">ccaܸW]O K/ }UC(5,3Z@0)7>z̒j\ B''94h h_gSrĽK@ 8L/ \1_*A!>/iu]{uCȻy >}nCQdslI?A߇X~[<^ SD@D@D@D@D@D| ̛7kY nx≁oOoq?C)_ۢlVi@6 <=,Xr%|pzd5//s{0i3{W W͏ cךSy?>jhJ9&@K.{W0w ePn|wl"楗^Z%Eg!; . r-WgL:|}4cto~|<|vfL/"sOߚs JGLfqSOSaڑjZ9cŌ903/U_x uoz}1G&Mz?.]jfCA@SVtJ@4 Uf ye: 0!E]ߡ8 @{eQԢ |9g{:v,j" "PR4[,lB;}ԨQ,Yi\BCȰ&8޽{qׯ_Crp$oaտ:"}7 ,T׿[)@fh۷/|yt^Q>s J!G j*G?xT^4$(؇ E8^=\\)϶T,ҎL.rn{qltW:jSt*qsymVNd|BkqLfmv2/1 Njk jԐLJEI` M$"g3p3 O=w_)T t 4_xᅅBrE@D +{v_~Vyb}cwvf̘r!U' jy۵/#F`̘1|mHgիW/,#s ~@>}os 5 8l~ca6Ml9d@@q馨G}k/V"ٻEY׿hC_>|x |֍7HAgFLƴm֝I&dg{.+G&ϕPq&oӓL6X<H$ル8QsD@BA@#E@D@D@D@D@ XlX5~@l^ӦEy,A*@GEv0 zՃ_&Fky睇cÚk>D1AN)rX['KdTvm1U۷oj@)\3>Yˇ~SLWV; gԲeKټysjݳbQO1_cX/8}<[y:3a0D`M vA^ۅmaJS*Y^bTٖ̮Udߐ(y}/bKo\1K9o7E  J/RQ4.>ꨣ0tДc@*PBʘTڑɥUmx-7V~PKI]|N$r6D;wv:m+L 6 g}RKN16)Wi" "P*(nB!nݺE(5b}/'vBqU%(Vap`ԩX{)Uֻ?8#`8 w F+ ]5n8t($D!7|_61+ӢEB+9>Gq=ؼiG,’8L{0Gͣo>(4i|գQFԩS`)# ([45`ur[rb" { ۻkQL=`);&26?Ӥohœ,N嗁g(34"73&ګW/x>e!R79|=/Ƹq㼯Z&`<$:USt VzmڴY\EW:uvÊe"!ó1j($:|M80 @XI}{$"@3<:T\s5Nh VЧOprUO+"<ޜ̙3} {`@7VPiiꠐ9s*^H4SॗHI@)i"#pc=z4:"}iUE(\V-/UkD, 0P'9:VS9oy]wݵ`uQ">}n01.t۷o @U[o /d6;p> Kh)%&Gk׮h֬{9(I&b:nyu7ٳ'~"o/ ছO?]7m pS֥Kp*'(w Yۿb;'xv4?SOżyp ׫W/͜gw2Fܓv6S*-W6ipgl4]Q&ηN,˖^M9Y Mx+Sfb 4?JP+M`]D@D@rE@4"[|%8Ts0*^>K-\Y ^%79&t^,=;񫯢RD@ʃ- L-ۛZgjZ)"efCC]?{-Z~'Rz"'5j0!k <,p0'@.]hzȔmVEJ"F0MLz:uꄱʪ@~m'dN1[cǎh޼9,Y~gp\ @KV3~bJ"POÁUD@rE@"| I`ܸq:t(N9\uU& B)@{7@mQj"E@D xA}Æ OX7W8] {G*LrD@*9lE@D@D@D@D@D@D C .)SOQFD߃TV-pQ̙3ѣG \wu1[5)(`Ga~F)E@BE`(/20wnUr`m{݊-KyjdM@nY#:ٻUFHߐ<|*o.If4*駟Oޛog;JK0~<0r$|9p0{vmG9S+79LqC9~@q"P䯘y\tBvm`U6kJਣ`&ЬF{OGb@zQP(&Msfa=ߢ9Qu 4pmJ" "K/ dG`Ȑ!.rpJ#@qv ͚5+bί}$"kZo۷oW_}5E*٠SN{>@p6l3g#C{p^0@᱋ĴSoF.]жm[ (k*|FKL+W` Pf`Tn`eukL@nyV%{x_G_$1pXbZ)2n.{=L6MbZQ/ve1*`1+ZL3۴iƊ+T䔀9[eV%2`az$Qe""P.$U.gZ փM("" "P, kwPCKl8pu)SOm "b" "P6oqmɒ%;v,Xc \phb[\0E[̺hܹD"eF r'>,7+]w2f7t"Xwq^*7p<<- K0yrGŀ۵0ض];$S5D@$jIPJ26V\uM7(&e˖tMq:* (EgԨQmݰCŢE0b|NPkСN,/ogvZJ-XzOb5}@Ο?t/rJ q;qVcN+s|:t@׮]YʔQ7|3~{NܛD@D@D@D@D@D@D@D@D 6l vagS3zhs/; p6HkvJJ?K,#q>Zz!"onT#ٻ-9s_W_}w}A?z P615MrxJ18Sܶp%@Ӧ0L 4mA.袰"P$_u\ht=K," HДD@D@D@D@D@"8wXID@D@rN`ua9/N@VfZ~*8KVY`lhÝwAS@6#?]pVZ1g}p}]@+B`pYF;[믏zdn>(/_SdN46K'ճߞ'| xI-%($rLqvX!kE@`$W_Xҥ ƌ?--]C &l S`k]r O?_tP{챇9ܹ&Oe˖aʔ)8p 4h xM.Cݝ̴c0ܺj5] >{390_|7[[u]jsϹ V^|" %O`#kq⍼*O}9)=l0>qE@D@D@D@D@D@D@D@D 뮻.{1\~9r$(N[`>&M?cǂaJ(` af?*ID % jD|н2Mw@V&"PLd%{8VU37o[oczgXGq{7 J3Gi_BTW/asѸ{.cL?mΜ9%ϱoΦc˜?8(/9p1-K@)H/Y)PD@D@D@D@D @xX3UV" " "@۶uG-" N(|I}@n!!" "PAA ,5oiӦ`8ǡف߸}…y@Ϙ1cnf?;bSmk eQ(ԩSb L>vfm/{xΉ6ȼCYg&0'c}E@D@D ;[n%N8lx‚ &ɗ qwQF+ډjժ9;Yf[բ=ҥKKjW:wsgϞ*>r46_|0\$"2 KQRD xnO>{O.{`Ϩ2ٱcGorqǹ0m%6K믿ZLQNK(Xv5נf͚g#K7_h_̼ nN:)LtdA,vYUn˖u^[&" "R" " " " "3ʕi]E@D@D ^G qL"t䁀HଳAM^*`!" "1߿yw?7QNL89g5i֐!C/xZID ~w^xl֬Yyc{ϝ(9XkWa$ @.@08|1t(@nP&jմ &c)S࣏>r⍴=ȠR-ZSN9o9x VvLG@ZhSbxG$2:| /{'oKkZK[Ki>xb jez8(4 j PPqRDTCnLٻe>W\qfΜ5j8:ˡD)Ÿ&dɸ%J"OLl?7f fL\]w硇J}?fOSs{^s'P͂iD7@ |]tRf4XsG#aisWrߏ CX 3X OrU]߹"|E@D =tԪPfzko(c 'O.\n!΃ oC{&J2 gv߿ㄗ% lٲ[7o.r-]0 |8֭ʾ 2`T1f4mh覆}NThiR*N?ogĞg2~<@۶AT"q?cZp{΁(W^J~ ?n0tI8cܼG9QˏU" " " " " " As\|DqڽG9>8_hefC=d~77p yիgi|R&0q"p!xh/S!6|rT|0(k(ywweSP{=ꪫke˖Nl[/"6ӧ1D,Ps/6'΃ kxbv=]|Ņoj71\rͰgX^*E+f~$9;)" " M8CBu:r^a3]?T"{4X=8J?}\~xʉdI_~qA)Ea y 4Ŵb6P5jM6DAY ^8mr _\i J؅"jذ!UVd(SC„`AUŒ' AOQpb޼ygD ,]sq'n59)HDcO[7ič8UV Q%K؈g}V!0LN/ q\ąc$Odx-,2pT໿o}6?(w,+@'{94^fgY z̘1o1 HU7" "ij{@]>Fm^f%".~ڽ+>"<K PM_%3n:JD@D@D@D@D@D@Bv> bKqiӦ9?޽{/i_tСl|!_<`$slNOtsa9_+-`Yyh׮2}? ը_b᯿k <pA [E@nٻ$[f͚wѣNL*)Tyq{ݸ>¶nk~C-ešP˥\L~;0r$r%p֤LW_} r?[<@;So.Uƣn\QzdpbCZӑ" " "(=3TɁ+T#dj0C6gϜWt}" " sƎ^}h~ABK?Ák ™3 mU1լiɠ ͵;j{[_ע0vݠAlkWI}駟xb pL,hqaP8/.& Zx]+Opɰa\ԫ~>:BrA@ZS=&553gfr2"MQ59~s48ުg'E)EQϩ5k,#zjj-[EU1'4{<)+0͚5+AQF͙oTs(&,_|I&j׮m={;q-J1q 5}tp޼yxp%եX>}'(@J_j@)?>~b(7p61Sh1@=P;C)5Wm  2|b6E?'*Y _JC@_ q5ϝ t0aB!j2E@J@ jeNG@@(Pe&PTfu9&/]ůE@DJtpBw`%ME x"k*&" "w -N؅@uuA[6Ά۽y})Հ\l7~Mo q%V(zgҸqc'HI wOlhkQ!捓(D@}8\=g +b&1?~mѢ=ܹ3vqG'ZmP4A+^ypE^k/'{Fo8,tD@V/* zDUҪ)ٻ-l.az!g#/ 6uŽ63.A1%X:urKP4sbxY-RKڞ#.&X*h+Lh^JG@;al}rsU W@ jL@n&7\Ðp[N^аb9|]X (R|׾=,$s@EUl . ; 138ᄲE S4 ޺uk3*Ҹ[H hWNl,Go jŵ;[όdm^ rJs+Vpk~NŪ& S'+@~j-y3g9?Ɛ!Q3;&bUM@Zi#[8qg}vߴAD w~74@?{kogk tyOQX+va@d>{, qys@0L˗/w#tҥnZ"6q yc#Ot[S` %8CU+h/ Ȟ3sv:pb 8m40@K+Zl niΜc ̝;{(wi'OM׉UkE@D 8 0X .ok# 8n6a_y$b>ps)kYdfI01lGuxԩ!$ UID@D@D@D@D@D@&xbgqs)m8G1*28ژ!^C32sL0>rUk֬vuWxy=tFuQ.0?$ꫣw>l64ۧV@Roiweq…Jr$ {r8%ĴMƌA^c$erݗ_nMa*QgvUmA@8ak`S?b@ _13 AHhӑ _i^ ,`! _E@ ^0\sMF. ~;y UD@D@NR4Bz饗a/gQh7Sj >ռys_uc0+ <^XDa?25j8au]bk[YgJkn_^0x[3$yk~.4] ̝kow.?[hpY<ޚV-Oau&C?htx)ЬK_EL'tNq~UR"c߾}##Ů=a)6$"<:l1Lx)@eCD/>20$pւ ܳj7ܽtM]}ҰaC7^N@ށy I+'ysO ˀС[X?%p;_~9wpd "6Q8sYۊc ̛7mg9,ڵcZnٞ_VRV[Gs|M̘1yu4h4iNKFMS9@q/v\p2qԩ vN*^eᬳh뀭{tW MdNrz(`SꐩwHIBLsg0vl+YUfb^OyCT}(rw+Xէ O>`>~RH´a\ơ&qTD@D@rLND(E4ҥϢVV-57{,'5{ԑy%?QP\(hMWƌq0pko믿ŖVOmg"Z鴙6p OO.e힠Y75Ч0dH_$"P<@,K{꫁޽iV~OSϣ7ߜ}fAD 8>`Zo/{qwo|qLı޸[\8>{c*Gpl}]og3.1XWl}8LOyB')^x s$R7ܰ9&O^^ _~J>" "'N:+"% {N] ">=ܹs]O>T`0D\೮,y}€ |yf8 =Q"j93@`1 ^ʠ=ƅsLp~$\k؏xs2\p*60HQf*-%" Jz*}hQp޴Ac5Ҷ,]ָݕ y=S֭Ax:>S .VU\5\nqhܝ1c[GLD 1"J!@n&*"9ٻeNG̙ݘcc _&pL̅1<(o\LX~ml<.9Ev|x^aL.%D`bY0:o_?6\|Ÿ+&lTv wXM;$ۀv޹*ꊀ䍀3G-AHhӑ7(ּWBt} _=)Ev!IBG`a/aBWEUHD@D `4믝.`M]b+S4.S`[U=E.@bWUlx:΄/|Xsl,ؗ'sh[-Dnx]m[LIDBtlg+"`$eЦMpKL9e{,n㸊؅ۼ)UcQcS޶Ԝ9bѢн%N̵'9yk1Sq{&pX 6Y'XaKo [:^2'`~YJ" % {U"3o\0Od-;yxCO[(^pDHu:gb>7+S_F} 8?/ùOknذoʏZ,# VI" " " " " " "P{ZT1?/x&o>v]M~s{FvyAM7EŴlJzh^.B4H /N<1|uSD@R~5R='`%_?^G ^%WM>S oX[_zcb&q덇8qkVŚtm&M|?wزeKt&L(F9#[b&t{yɪSȭA1ŨdDC_9+f~.y:RD@D@D@D@Jz+Wd("$@#?zz (*=h}`hӢqu=!@LY\>7A-:d'Eva@1+x.Ŝ,g[ngk`8`@t>=*g u[mκV"P, h=8p)[;_ʏmדKxX|`O`j 7qD~v8cC;N' \ ] r1,@>&9$!" " !%?%r"@E7Q(]u͘K'   گpZ{r_q:%`Zwh4@;,{jTZu?&plMiKr {r8Ƶ,`B-d|'"A歼D ,(z8b(3lX-|0lS,xHK̑#{-.}-}vWbZpFX-SD@D@D@D@DX Ԯ XQWE@D@J2``/~Z ^Yf.." "Pjȿ&M2Ѣ!&Z6lc=1ہߏZ/u}7hQy:URzY$Pg^-U D"s^Zh7`ΜW2A6 *p!pO͛ fc꯿$ke*" " " " " " " " " " " " " " " "P`67+mc+E Ҁ]E dQ#d*Qj"" "PB,z: j"qW 3nI'EE3rAkmI?8l*"^|8hӀO\vJ" " " " " AXoqZy*/Ȇ'_|u`1Dh tL|ygk)KGað6۠~x;8K,RKY˒RdiQiE~I{Z6KI IJ_*ʚ"ɾE!B~iD]{ݹsf}<3g}w9s_~͛kҤI~ִiC^zpwE8%.,˖O w vƏ@@x P+mE@ b3H@ ʔƌyGᄂ>N0… nݤK/%461AشixG]vuvWUa.Dwߕ!̞=[5jp;m_ed}7h U&-s Y0@@@@@@@@ llKҲeEc[Փ9M_lLY,z@ u9r$ko ͬ^=a  @rxpjď@bҠA҂R {n4w.yg+R/xq0'QݺС8k@$x   IR  `Jvz'3J@ fv!wK,͘!~4~̚Ê@{.谛| *͛kԩ:s4%lܸQ_|zMhK$M+riҀRBߤ~ ~9(g6o߾r,`2Q%}|νR@HV"E@Ja~e\5uٚ?NveNݠIp :$(]D v"P+Z׮+K +У}S[/!v;7N0N ,ԯ/wtq 7ȽX0ԨBxC:ᄰv @֭[Y!ahm@R+`عLK+g9wj P]tJ[g+xp@ڳ'ZJ@@@@@@@@2R3Yp#azt P+Y#-@VFSߗ_J;wJs<=@'`w-#]"-ФI^7?R wH7G{ԏaX>*THz]#Jڄ$Z]  @ ~ b X5 !}TbE iٲC,ā@Ѣr.Rn]uuk4&"q$ 袋.҄ ܅5@oh߿7o.[N$:(S_~Qz .~; spiǎD)@ \6nY:$믥ciӤ3 G[YD e˖-~MK@'` =a V::`wӳؾ]ʓ'ǚ@@@@@@@@#%tuK/ڷjז9:8aP@]0=lTtƍal%mB m6#H˅/Y:X@.t;hs' .ԀԲeK*T 9sJCH|" X,v[oLJ &w\0YU_z@4lz.}@- XRZJ[b'3SNg2+i}dA#FHeH_/-] y v uQ`        $1H='͝mrؕ@,- ~IlF Ppz Ԫ[  aȝ[zi$ 9rH]H+WJ:*Uz+YE7#`J[ֆ ҤIRѢwzE@l ځ  06Ȉ @X8B7N,Tkv!6i<)o T/ }u]ժUS>Zׯ/@p F$PI.c^7 ׫'%d*z`{{I{MWh("R> '3J/-_,XX.8jT  g6&H@ȦCr \>TB-ZHgGR+`p         &M. L\4dH@-àtXu"@F QccL?@U @ .X: Ŵ X^KZ֭ϖf̈:b'mԴfrĮ-Hfyw@@T"  jE>&-oVڽ;ͥqZiӤvVn #|,I"i&9Nݺugh]tE?~jԨ7xCh%ɛ!R"M7e cc Vz`Y 4ǥ b0V@Hl| |yGU; M4B.%P+!N?="rᩋKGa5kJK&D%@֡x@@@@@@@H.,Yk-ڴnQ:,/ˁކC`)(!]q4}z&5 ={^*U:w.[Bz1)4f @\xnd&Zqh$@lˆd-6I͞-}IzR*R@ eغUʗ/y@@@@@@@@ y:l|mRǎү& =|{qF毗5"@ EVƙFj9]=6<- "PtȍVN/`c'Ok餓n6mYDO``rSs䓣.jF8Z6b @@$@VX@ gLl>hԫWD@ Yׯ Nʩ  4fuEzu饗SU^=_~E ,p˞#@+4AVԩtgst(_^WG$ ت];0ނ?Uq+ro];wb[4b(Kޱcʔ)Vj@ 6H&(Y&u$+ח&L_sd}Vڶ-QzI?83NjB@@@@@@@H,7LӦIÆIcJ*H6~|Ϟ' z@·mhi P+-Zi[7NkX@0 yTT0_DE[EIկ4rTlpBy( _%n-M.M(U_ @" [>! T o^)Ki˖6# &K. &^WRF +KLߠԻwL@4 ]V:v쨓N:IEq_η֌3ԨQ#7j6nܨy駟%ÿ@i^/@p\:([{GHKsJsH6~׮q_h1?^:LeK&iBiPt都@ ^_4Lų Z*UmJ `&6PhruTCr2PBJ<-        ) \ytԮtRXQ_`iV_ZjEGZ@2K g #2kȞ=1r7$sT[Z@ D´>H0AV-E? ±h  @ Xj[u $@ND_/M]I$pҘ1x؄ZIv!W5kָWuuש|.8]}՚f>_u=sէO5kL0A~;:ƮE3"ԣ4qtRқoJ'iJg%5m*D.QFI'sUV)ya@ 온T)ome%>NykzkXtN_VZ        {W۷x3ɮ]YS_b6Zx_|!%Ux}G$@d\cud&fo(b  DSv`̏h_;ӫltR̙'Z@2D´lM Ӳ_  @8 v   &`'2lIN@/ڴZ &=ONɤv&2%>E8X殔\)wni i„`_; Q ߸mT?cR4;+!CSO6;:X DX&N>@@@@@@@@hVZTڬ3ϔf̼qg}w$_̞=z9}KϢYYkA@ 6'Ϸaâ6G N?=:կ*Uu6mA`N˂0-'ND}@K@ڞ@@ $I[14@4 !tqRÆri㏗>TjRbG.F ]a>g]L T*Ut}i۶mڵ 'h}GoVիWυ q*?4xkҘ1qډ(5dIGᅲF6n7 ֓¸(Sm:lAϤ B >P:tTK@T ,\P+WN,SlRݻپ_u\{iĄmўh ,^,xbj^@@@@@@@@d8(' jՒVZ>zO%`#P+Zԋ@f ڳf6@D__nsgiD@ ]jٜ!ÇKIKvEwԎرCj"8Q]  @Ԋ=kF@H`~-;H@^ o^\5LPOHIA@ OMs#Ĝ.%'KQz)̙S>@2OLwy '9K9,@ tRǎ Kiگ|6r/ 5x :iܔ^cD_ςu)Sɓ:unր-`a芓-ıI'IԀVNĠYHMH.w\Esi4U"|#+dU         +PGҨQmŊҳct,jKH[5`*F xwޑʖЌF@X ;QzF?@ P+)=B@jm@CP$H\ -D`֯U-J^'f7~x}ݪ]˧ziРA*Rŋkݺu=zt颪U*kVƉvcݙ#ʓGY_re [W &׾ H˂v B,L}Q@LX=Se` q,`PyoD;c% vLYԻ鯗W"VwzQkJ        @F \vdaHv H}QSO̘;d1D qm[R_/5" k\^Ε~8֭aėUrs Iv,m> J W?h-*`iK6w@ mC@@X@8x4@`?%PիK.vi~@ aj*ZTY35a:GG@ ~'pܹU`A5mMN9'>C@ ~.\ܹs}R@8Pҥ08F(^RpLiam +YRP4F !>2J@@@@@@@@8Hǂ*6ƶN];YDBlvY@ .4gxrM@@R߾#$ai@ ^ʔ|SN;M)oRҒ%Ҕ)g?h5 Lj%֦  &@VQ"@L(_^8Q;7rLX)@ vī-ZH>(y^ *@ /_W^yE۷WyYxqf͚s=WGxb 4HW]u8t#-ko ֮Z^r|RnrA~R yI#ߞx<{dYhVzҞ==V~f!jUr)Yr O&P+# u.rZvM)M]pA8-z@@@@@@@@1)6|i4bE駥HJ L.ծW:@o>yUFʕcѤ@ t$]ztuѮ Ԫ%7GW/?vZ@< l̡bL*Y0$@ 0mD @@P _>i˖8l8MF@UJ|v @ Gi@/7~=:F@ v.ei7e˖:c]MtVZ6mڸCyf}۷?& ΰ6P(RkR&`#7H;VʒETҺui<9Ѳ0-ˬ ,x~}l@ |7TLV` QjeY#'}Q0KV_,?!OsHgSi+        @ h!-Z$u"uti - bdS@ ʸmyқoJ[g\Ԅ @X >"am+B 6O-]*qG0:uѮGn]ߤO? ƝWh- j%ﶧ  Q8DIWA d@ȑRnzV@ t̚%ը!-_ge "m۶iKyըQ#UsNM3fL={q:ꨣB @䑆 \IJe5> w.O/m\ГZyE2 6i"+ X5k}vNA@vVH΄ <ܪUpׂd BN?]5@o:]{xT>r@@@@@@@@L(WN1#͚%xԻkW&Uągl ĿZ  ~,.w Tm[ @ZS NOËY@ jb3@@D }CDA@@jZ#w.Hr{ڿ1ǨJ*ʞ={2rg.`KKI{D}u 0ꫥٳso.I ()`-ǎ8CB?ii4 n9T6r  `duWo~Mt&NаakFKW\!w.Hz?43)XΑN#       hLZH6I'i4"ӧǸ2H@yƌ&c@EU+;$ ߥ T*}I07kٸ{~]`,^`,T({L@ P+1+B@j٤h` Qp#zE'jPXūJ=&YEΝmԩSխ[7;Ds;{ scB(Θ1CO=.b.\X*UR.]ߺ.Hd6mڤJ=ڴi%JgUW]竪]my_#Q W.iĈ R2PG\~~1cSu_Mza 8B]޽{fܸq.&Mub;g9zgԢT嗒kUKO :䓕'OY!kA,`,L&d%-]*5nLbŏ>*wN(sے޵q~8r3%b@@@@b@IDAT@@@@ 1l׽+'5h 7Op2o{l&͛'ժydM ] b_}zKڵKj6ۋ@@^K͛K+Wƶ֟g&I|́fs// ,ٓ롶p|ux¦zi0戦 ħZh5  @"'Kl yCi !pRҝwJO?}RD{ww1csΑ֭܆[XUXСCݤn=b-/q뮻TN˗ Ψ>}({{4{loOԳgO5i}og͚)ShRy?OYBܯz Ky!9FUZDCP!@{~ѯ~u&^Zk݆֬خoH X\VzmBڀ\W~x3e ܲe^ Y^.7--|{8s~L,ի<        (SFn̞r/$Νk7W cj׎Y+d@z"l 62~Q# af9R*UJjTڸ1s[/2&sY[r YBjJQ: i诛5d@W7U.Pj"S%w+@b/@V-@@H@j%ƥK  rK0'=~O )p]~T4o^t©4hݻw+S ɜx-ٲe˵xbe+\(d] `w_~Y۷WE7+u…u%0wUR%{vxc?f[֡q jͪZ/y'pRҕWJ;v^up,Y lW^N8!1qM~:b|_ԩS,quz~VaåNBnRZP5*׊aX5 j;'P+d,q"Pre46YAjؾ]{hQ8:plXb6i QXu"        p`o7]wI?,z4iҁ3\_-CȮ 3ΐMXnjժktw;̝vIbSL_={v 6.a{.~m<6o췱Yfn`w;vߺutʗ/_in{pۿ3g];Ng}zoN'3X`ڕu]uQޞO d@raӅJg\Ԕ@elW=I.$fģ?4bo)}ֶbWV\#kתcǎkx O+uUW9OꩧҞ={u]:uh[bOd 2h_'Pno} v)s\:}*UJ{ƃ]wbC'~3ߓk!^ @fp|mQ^\ 5j$=C|z3~iF:n]_*-޻w?# "7Ծ}Z^Ͳ p?R@@ ׻ݴS14!C …3J*ݻ=/K{8ha4aR@ Af#t g/SX mܸ;Ss=[`gy.t˟?^*V}'xÆ N>dMx.` .j*͞=ׯI<忯߼[n{׼o6pݲeiϻA8~cŅkr)Rۺuy`x֮{w2u\H 9昽jm矞gow FX C cقZ o(H4ŋ}ygןiO.LJ>>LfdL=/[6͓82iŬ&EO_*Eo5 ƍKaBB"xoAA@0C6DN`Dvj @޼anᶍ z@ 1wBlBI "ᇞ n5-!]ko͚5{_4yd?||9ʙg/w!w'eAYb!X5oܳ#e̙~ŊSsgs߾w{_y8pǸ?Ԯ]˝;>(Xw*f!%,Kz&nRΝ8+vv&.=&X߾}*[y+{="ZM4a^x_.♚} Li7vQGyeʔٻH;:w1 7 DtJ~F6kWr|mElװap^, `>Χr7תeƞ7cơy@ WLV7i@@ pҖ-Q*@OJw)]{4dHK Y_~W,8tF%n%K}A:utGjZp]ީR+W,4f ,_ǎ&" П鿮x%\Y 7 vaÆ^_W_>|5k&w\rowj֬\~iqƩVZeF!%6p1Jb 56__~\@{p饗ʅRJrA(Ztywuw~ʓ'OP=PTj՘# K")Z*g-oC?vtRFpkXWg~þŅd?>l?a}+?XC]I>ǁv'ڶmիWkڴi~}MP#Bo>g ۾[jVl.'pB-ǨV{N:}> |ʕ@|#h%JH+V9 jةQѤ-J=zH6͜NݱZTki;N=7Eo@@@@@@@@C6rcNzHnȡU῾㏥ -YKx{}i2k@8$7l\aS!Y(ly/yAl ֭ޔ^e9e>T̃7e'}gYgGPډ  @ o["d@^Rvw&X>#k.)P4{vpц}f]tZ'FeKgw<5jɓEtVb rn_$x³-ǻ \p=7 -~e}ť~~?XiݺL" ոqc?B,0B*Ν{*x.֮]fi̙/UDr1)׺Ƴ7CXW_}7@n!ڕ/u,u\RT8C0AzyeKr:mߎ\fhkXD^Xvm[_>.5u{^oX/nݺz'.l{]Ah}CRuk8l\ôsWW^yej͖ ]zۗIݻKkR@ɜ9slKu  (PZY-Dm>}`}{[70CÜ>Ի|          J \=}J: v7& G"Z 3f__?c" ԴU7'0 ~N@fR&R#y!=te~Z`_KdN*O%"Ɠ,溡 $@=C@@ j֟#^.j~`w`@2( M$i#]rԷ{maB?h͚5-xq?-Zt ػw }߶m֭[C)޷ 4hѳgOkN-r!+W.y)6_.UBx Y&9.ڸe?"|vՑƑe͘1ý9J'NO>b[FKlܸQǏW=ԨQPi&I/~K(G["XO>)G@$ JobB.<Z\JJaKr>ol>VVMGݘ1c#G?$peM+LZfMY@sW!oҥ,RR>i̝@ ,Pz:#3HAVL  mɝߕՎʗsI%=ҴiR^g@@@@@@@@7BݻKK],d^x績*WD9sJk;v"@j"ZK< ɍJ +pY'H|#թ#-8> φEo]Z,檰YDoG|*owGIua60}u$@I}W  T@r@7K<F ,`\Upǎ)~t4WZo4fn2w\a! NRlYuQz뭷4Ϯٳ"I&@$ Gn:wwa ~҂ >O:UA#{HC,;mVX#Fs~@VZzem7x>rBo޼YkF'xbPb`(l-;}ȏ"@r^{M^2O@2 /K/sNpҀrRF)g}|$Hkǎϩ/p9lǂڸԻKŊ_F.]T\pAcaݺuS"E4rHgllر:~[۶>YokWHx Ԫ_~"@ SxrW(q.ǍirWA}&ӫ a<{X~n@@@@@@@@㎓^=F|ԣUιjDq6ۍ@ ,P+{v~i wcХ΋=@@ 3sӂ|vj֔t.,'B)`Srs<rI?&LdqY0J EjL?^9) /[S@@@ y|h:@wKO=%u*&#pMohAU  ֒5khɒ%s1~/NY!Ch"RR*\,[ K.~Wz\Ã~0V:uT%^TV_vÆ U}f@$ +d7Bvģնm}o;-#e`)(Pȟ?_w^?lupQ-'F} LiGSCg@7XRv0 ܎/ׯ} I?(136yBs@MlsϕW;*8?|cŒ'nVePOlrz       $]c$yFTI;v UvO^'H ʖ-xC`|`N W (UJ1Cnޚ ?`0LJ`<z*Uޒ3IPAX8Fkb>T̃w(}gk$opyZ GH XG2%͡(0`.RU\s~47] .6^$@~>c%-OR?cʕ=o͚"73Vʕ++Q]xȑ vm 0\h;Wzuo^{lڵΝ;[p޶m]0#G |炯"?.̻K6Zj֬鹠 υcy.|k޼Nvƌ `+U7ys'6;vfϞ߻+={K\Bϼ3gzglkݵk+W.oذa{{.$7+ d=wyW_EJlyy^^9)=feVa\'::w v/{ܛRJw[\d ﯹ@QzrפIo˒>[v6{9snwh( `y7'X;t1lJ@ ]4")6E ϝ964hc!s~_~y{sBsU#   0^    n\KZx˖o U6< q}NCJxӰw>35ľOs@!st 3w<9aSN<۷{{^<.}s/l3T3oysMey/xyӿmKD^@ R"Ҕ)Rz1n P瞓zHZ>C8V/>Ʀ @$ώΝ{zLbt/5m*ٱ߸qRj -^X.G.$B.bO\\;VXe*o޼Z?ۺ *K[nU|>v;.lIs }z"+WS.˿@jD.t/\( @ -*]$p'^~ t P- *Vl"IrZ#G&9G \ @@@'x    @ C:ho_essTթ#=l[I@ O<[25$nQCi2wz @4-ڴ,Ǯh:@`xn. xA)_&@-s gAӦ{K.DŋMJ饗jرϏF2\y啪PaZoJ't~aZ}imړXࢋΝ%||ժ$Ӯ$=fLIO>\]KU"; &Ieij%´REB  ,o@ J.;I Xp6W_ʔn!LwA$Θ!]qERvN#       $@lKJ+j%5j$-Y0!?Hn.0$  6-Z:T>´ NM9s ]|O{-K!@X_v#FHK/$ٓ1S 7OYS*RdDn 7o}RJڀYHǻEtg$@o pp% :P @VZqK:IժIӧnz1旳oOwu`J}w%;^#DGp  +`Zn>{  @I/ /Yzm)O,$С|t}){].I+V0zyݩ\W5l۶x;w>sҥKOEՙg+]PgS/ VoJeJLETR?Y<<]הkkЄ4"MJ$}99gxzV{?~z?tZE]&zYOAREzyd WtޗwY7 /i /\N]ma>Nƍ`&yl&~W^VᄏEX<(&i'J6;EZj Y*Z_4A8KH@</><&;Y,v\rIT?裐D_ׯ_W[>R]mv״io*D >>Xq,YErp8S8p`8<        @ j*x%Z3ٳgOa.M%)=zϰC:x},v,W^>5l.OG pB-խ[W<@9~(@ ̜@r@RJ?z+{3>ֳ=_M3 u,Ƈ2sq]qr .裥[oBj4ojƓs)Tn]rƤRs@A@@BpͰ e-㏒c[ԩSY/N^<*OM qUj&x @ %9VV-YUo/Cp}UrU fH([JAɳƌ%t0aYu ?7;G <ˉKP.NkϖN2% &ZG7Vi9:鬳C&ϤnS\LM LYr˄֖~Ν6HO?\{NdZr'I')$ܐ?>| }>n駟F nx2$Z;),*zR@[o )Y*Rǎ$ҏn!       a>PUVQ9̫Kf ;H_,Z;Hu_ @ V\azmKHB2ҕ@rYɔ{o3 ! -]?Iڵ.좧~:baV.8 :>M'٢ .Nؓ/Wl  Pl߼y ,fH[o-9ŲLmG`MjԨSQV{сޱ&/i$ nr!jܸԩ.]7ÅߢZ/Rx;]?C0W^!"yV}42NMDWKÇg\ij4o\_&L1c7Lt5B{uY;Jw-͝\˧&5l(}H}CL  Z9Rg% @f lT4kVfV@ݺuC Nvヌ*W? i-c]l;8z ,]*=t 8K}82        "{5CoA_|y[M;8*̷~5[zx}iCӣ=JN /'Va‹I_'h׮gp kq4jps5mz͛ڵ{W۶m.۷/^\M)vKzQimD[9@gH`B3N.Pz5i <@ Hc8E@(=5"VN !P[ /@ w[;^wH˖-_2X|&M~+ԾM6Da7=䓪PN?tQPY!2m9Ak4( @v xQB/YG%sv5{ײeKW_M ߡ> ɵhڴaKmѕag=x>D* ,OTH% WV|x~sZV&N YI־bItm!B Vђ֢#  P6ah7ߔb=rI!hU2X}=85jH7x~ᇲi @ Z:l8\ 1Nh|d9_Nuo}{%ofk) L?+1@@AJre @ѐF'$~9 AsVW.lH q7>:|\ jԨQzGu熋FȢ۪G!CҎtWܹs5yhHqo(Vv ,PEo'Z-?}kժU,uvFK 6諗^jv&$FzS%9WSOUx.R߾R׮qoQH'Zg@IDATD@ 8a  P+?גz4M:EW_}f87nwoS>lx>b>]wŋBNQ         oqγYo5gN:Ԫ8}Z 8K/)λbK C'7 ]zBBA@4hL!ɲ4stUfxy/>^r4hƊ'FҬ4SGG!Gu8֜9Y=:!Pj</CIjN@@JK'IUZڼ @ 8V>qBX~p /CoM ;jY?{J`Qk ]TÆ U'dkt-~Eɲ&LӇ!i]vE뭷Z?/B(Y'N5Sd`Kʕ+iu I?k-,\Yիon[3g`Dz?RUӸc{K;(uE+        A/47R}ЦM7}Ŕq Z5Ss&}ByiSy4n8MCbp{j#ǤoW1n! @ i.zSձX/^ᴱ:6٤n~ -D R74itIy몆 ˠNaS'NN9%}V9> edɱyD!~Rժs P` @@ 8Ap @8ti=モ}"kk2SZ$]va!SNY#]ƍӘ1cرcDzCuv릛nF@OK>E҂+ϝ+y!sH?Ξ-͚\/O>r8`JMJ+^zA'k=KWb49 r &ȵ%Vţ ^[`[-/K#yt≒P{D))SY$޾瞓^ii        @. 8։'vn{>I!$OoڵsIc}]<<'yMn]Y]J+X<)Z˗/$>B;63?OZ  lt94smz֧4hнj׮Utn1*1f,{Xcxm/VS:|R5>\Zyw~ZZxM愽cpyq4r6G@V.@B(  $PA@(v<Ѷ]; cst@z 4n\[Ӧ T=.!]zint ?$Աy ~qtPNuTk&M@S'NݩE+re':JTq«V <̒DYNxE'ɪYSpxQ'6k&u,ի'9!I(tԷo\㎐3Ju1 9z5#&d4,.S%cZ5Nk3Cck=t#H&]~9ɜJSB$o׾n"Ո}@@@@@@@@K|aa]Iݻf%zjH㎓*fyF')XdՏ/knF~F HS934Y ' jٳ-^PgU)$bڷ ;pz@i z~qk{L^iJ%%~=zH>TTqس6m zFf?th|kҟ5@uK3@@X7 6Qx5  lҁ=cg@ ԪUUӧО{ woyf7gӦMf9aV@뫯 ZjjѢEH|2=,JβAA@ x⭷z2q%`^&MŸbM,MS۸L0_RV- \=['rª5uu_܋:rH]O:l&O DV-пr!Bu  N⤴N KA<3^;,u'vuDծMZtZN[5]v)<        k/ʗ]4Z{u9H<"и8S>)hv.,Vj.*W]aN,[PUT)F;{x_}u4f  @ lt]{E|SzU57^0{?(Fd׷ 'Hk;H;$'R:? /w,^,]BRBkWG6ʶ^@XVo"   H`@@( _(4H:Xi・':$މc"~+g:KbbtZ4o<7.JʕSƍYݻwK[t}y S^( oS^Zu `&L>Lo:q5h 5ioN__dM6x`eRq'yCN!ߋ$lu 'N5[g@ 7 9ywߝ$Ǡ*TǾ?_oqr-'>0)5{2J߉WUo=D2UI8        .x0w':\i]o֍|t k[>7Gpו<ό)p˗P_?W&OA@p|##}queYpl}YgeprO#j-wZXkm=%džYx~}p\d`ߒMexIS>G_@^ |   @I dxOA@ij^.D#Nby%F4iͤ3Έj=[7,Y.NKiӦEMYZh%:6\%k R  ^պtqoOT3G2D6L1B5J?_\YjTrN͆kK_,]tQ`߷{Ss8-4KK@@@@@@@@JP`5F}s G_W_I[o棎g6k1P&MN:)>G.sW P˾ @@QZ3@tߤ_~Z_өuwމO/:thX(`z:n4h]{?R}Q=Z;>W߾}uUW Vpt@ ^'8ZVR? uH,}Q,I;V׿R;ɴ |4l(Ҍ#|mԻL80DG?' dB:c@r^~!HS [cK.fΔ\R\,^j>N˿&O-lU,ɴp @@@@@@@@X8iԘ1q Á.̙lUXB-WO_P!zI@`e`ٲh9X^yEjA k%мtq3j5J2JK-ZHuJ(9ic;,^Voŋzƍ_^]!6Y[.+8&o'R8KzVMc; gPy@ߒ:YjRzthUɵaH@@@@@@@@GIƎ?O*iK͚%y=A ҭdZS>(!\ljz_@JZ%-@@rZ i: @ 켳4bTz| 3( Rp%Od^7^xq8_~"fOz&\5^?\mݺ[;v$ֺ@ܓŸ7-XPO}t5V[Imɝ?NB;{䓒'a9eBPܢwIvE[JMkѢ @n , Xg vmi H?5K/Lv-Rѹi'J Rժ{L+@@@@@@@@DdP|*/ᇒ6gSY,ol쳒/S@ 7{tBUR%7:A*Iwߝr'  : xl[{{/ J/ pTn=z(Nd\rYL0AjLgå3b_~;OI-JRӦ+ZsI鼜7$'<8>RA#cF'Ժ}@K%q@@(D |2YU+ ܅ .P4dt{+$N9߆"(XkWC7VVea7|!!'N 4B2}q1D[>?FA@ 8j8օm::&@ Vrd@@:8 @@V'y/O zT|鵁wB֕ =TYzei=,WM%Jgy;!q95n8Jխ[7]q~ӦMsnkY}~/ @ 8K#~t%n^l^1\d޽ `>g4|&*/>\jN8Prb`  kO?s gO@pڵ"w߽Vx`һ V~Ɣ)q|ʉle3C@@@@@@@@ 2[]yerq@fωZY8zE^Y >}w_/ n#@ ,Y0b*UysΒ9'^g;  @) xMY׮q[:q"O>HsO0h W$j:NrA*07(-^?W^7VʺuB8H ʺE}_~}- CAr׸>?t Gj$~@(m'  %%`H.N&>" @8x/z5k&|4qԷ e)~+j7 K_|hԯ__m]H=(qVUzl: @ x-zZګԛVo8wm>w2-i$ON]UII4rR@駟Gə>Q@`U^4gΪyҽƋVwsgwD«zM6?$p        i(P4y4zt.dipi8pJq-7O-.s/zkgϩd_`J=VWO|! d@R˖q=U=t_+֩#9NN;[| &PtRϞ'AwN:l{ߨԦKSm)}Ȗ~͠@JOZg;! @jB>]F@T/^%?~HW' =Dk?l t}]B¹L-\g gZh"}KU%኏p5mEr!j TbEy[V Skpe/*Uh˷MfpWVMm@ۤx?~|j^v1c>:aY]U>|{l.΋h9V5 y Y(p%BʼnbGzx'NOJ6Z?lo=*zLަ>Rk2r( PO]<ܫ)  AHg_"#UvpI%}5a"'~-iWLA@ ]մT5n<-D7Oz`l}|?`/K<*fg[T뱑[K2S;V|c$Q`Ȑ!g}6G@k%b 0U ;k8Ʒ}=\}/)xL\i SF!lg0:!i;ɝq$V&^/(szxg:)jl?cdƌx[y +l<)8I0dcl, s>@@@@@@@@yJ֧'[ms{VP)5ْL^ɺus|dSMra0ǦwMց~;@Ҟ́*jO|d]M#Y$`d[2߼.>({u lX47j!dۧH@@ 2\B!DB$(78˜W!U\Cޞh7ONݕ-vFP8S7qކ աCߍ9Ut駇$[QFQ5IBܣG*Ri (^2yI&X3CRWuwD }>M6Qv Yڵk%*P5xtY>N_tts]: @ V~t4@@ B<$*>  &?2s̼:k,9pxj-$yniG 6lZ3D %^bWX1/)ٺ=]=# M7W5d$`^r

    301 Moved

    \n\ The document has moved\n\ here. ``` _(Note the `$` char in header field)_ ```log off=0 message begin off=13 len=17 span[status]="Moved Permanently" off=32 status complete off=32 len=8 span[header_field]="Location" off=41 header_field complete off=42 len=22 span[header_value]="http://www.google.com/" off=66 header_value complete off=66 len=12 span[header_field]="Content-Type" off=79 header_field complete off=80 len=24 span[header_value]="text/html; charset=UTF-8" off=106 header_value complete off=106 len=4 span[header_field]="Date" off=111 header_field complete off=112 len=29 span[header_value]="Sun, 26 Apr 2009 11:11:49 GMT" off=143 header_value complete off=143 len=7 span[header_field]="Expires" off=151 header_field complete off=152 len=29 span[header_value]="Tue, 26 May 2009 11:11:49 GMT" off=183 header_value complete off=183 len=22 span[header_field]="X-$PrototypeBI-Version" off=206 header_field complete off=207 len=7 span[header_value]="1.6.0.3" off=216 header_value complete off=216 len=13 span[header_field]="Cache-Control" off=230 header_field complete off=231 len=23 span[header_value]="public, max-age=2592000" off=256 header_value complete off=256 len=6 span[header_field]="Server" off=263 header_field complete off=264 len=3 span[header_value]="gws" off=269 header_value complete off=269 len=14 span[header_field]="Content-Length" off=284 header_field complete off=286 len=5 span[header_value]="219 " off=293 header_value complete off=295 headers complete status=301 v=1/1 flags=20 content_length=219 off=295 len=74 span[body]="" off=369 len=1 span[body]=lf off=370 len=37 span[body]="301 Moved" off=407 len=1 span[body]=lf off=408 len=18 span[body]="

    301 Moved

    " off=426 len=1 span[body]=lf off=427 len=22 span[body]="The document has moved" off=449 len=1 span[body]=lf off=450 len=42 span[body]="here." off=492 len=1 span[body]=cr off=493 len=1 span[body]=lf off=494 len=14 span[body]="" ``` ## amazon.com ```http HTTP/1.1 301 MovedPermanently Date: Wed, 15 May 2013 17:06:33 GMT Server: Server x-amz-id-1: 0GPHKXSJQ826RK7GZEB2 p3p: policyref="http://www.amazon.com/w3c/p3p.xml",CP="CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC " x-amz-id-2: STN69VZxIFSz9YJLbz1GDbxpbjG6Qjmmq5E3DxRhOUw+Et0p4hr7c/Q8qNcx4oAD Location: http://www.amazon.com/Dan-Brown/e/B000AP9DSU/ref=s9_pop_gw_al1?_encoding=UTF8&refinementId=618073011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=0SHYY5BZXN3KR20BNFAY&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846 Vary: Accept-Encoding,User-Agent Content-Type: text/html; charset=ISO-8859-1 Transfer-Encoding: chunked 1 \n 0 ``` ```log off=0 message begin off=13 len=16 span[status]="MovedPermanently" off=31 status complete off=31 len=4 span[header_field]="Date" off=36 header_field complete off=37 len=29 span[header_value]="Wed, 15 May 2013 17:06:33 GMT" off=68 header_value complete off=68 len=6 span[header_field]="Server" off=75 header_field complete off=76 len=6 span[header_value]="Server" off=84 header_value complete off=84 len=10 span[header_field]="x-amz-id-1" off=95 header_field complete off=96 len=20 span[header_value]="0GPHKXSJQ826RK7GZEB2" off=118 header_value complete off=118 len=3 span[header_field]="p3p" off=122 header_field complete off=123 len=178 span[header_value]="policyref="http://www.amazon.com/w3c/p3p.xml",CP="CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC "" off=303 header_value complete off=303 len=10 span[header_field]="x-amz-id-2" off=314 header_field complete off=315 len=64 span[header_value]="STN69VZxIFSz9YJLbz1GDbxpbjG6Qjmmq5E3DxRhOUw+Et0p4hr7c/Q8qNcx4oAD" off=381 header_value complete off=381 len=8 span[header_field]="Location" off=390 header_field complete off=391 len=214 span[header_value]="http://www.amazon.com/Dan-Brown/e/B000AP9DSU/ref=s9_pop_gw_al1?_encoding=UTF8&refinementId=618073011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=0SHYY5BZXN3KR20BNFAY&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846" off=607 header_value complete off=607 len=4 span[header_field]="Vary" off=612 header_field complete off=613 len=26 span[header_value]="Accept-Encoding,User-Agent" off=641 header_value complete off=641 len=12 span[header_field]="Content-Type" off=654 header_field complete off=655 len=29 span[header_value]="text/html; charset=ISO-8859-1" off=686 header_value complete off=686 len=17 span[header_field]="Transfer-Encoding" off=704 header_field complete off=705 len=7 span[header_value]="chunked" off=714 header_value complete off=716 headers complete status=301 v=1/1 flags=208 content_length=0 off=719 chunk header len=1 off=719 len=1 span[body]=lf off=722 chunk complete off=725 chunk header len=0 off=727 chunk complete off=727 message complete ``` ## No headers and no body ```http HTTP/1.1 404 Not Found ``` ```log off=0 message begin off=13 len=9 span[status]="Not Found" off=24 status complete off=26 headers complete status=404 v=1/1 flags=0 content_length=0 ``` ## No reason phrase ```http HTTP/1.1 301 ``` ```log off=0 message begin off=14 status complete off=16 headers complete status=301 v=1/1 flags=0 content_length=0 ``` ## Empty reason phrase after space ```http HTTP/1.1 200 \r\n\ ``` ```log off=0 message begin off=15 status complete off=17 headers complete status=200 v=1/1 flags=0 content_length=0 ``` ## No carriage ret ```http HTTP/1.1 200 OK\n\ Content-Type: text/html; charset=utf-8\n\ Connection: close\n\ \n\ these headers are from http://news.ycombinator.com/ ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=16 status complete off=16 len=12 span[header_field]="Content-Type" off=29 header_field complete off=30 len=24 span[header_value]="text/html; charset=utf-8" off=55 header_value complete off=55 len=10 span[header_field]="Connection" off=66 header_field complete off=67 len=5 span[header_value]="close" off=73 header_value complete off=74 headers complete status=200 v=1/1 flags=2 content_length=0 off=74 len=51 span[body]="these headers are from http://news.ycombinator.com/" ``` ## Underscore in header key Shown by: `curl -o /dev/null -v "http://ad.doubleclick.net/pfadx/DARTSHELLCONFIGXML;dcmt=text/xml;"` ```http HTTP/1.1 200 OK Server: DCLK-AdSvr Content-Type: text/xml Content-Length: 0 DCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=6 span[header_field]="Server" off=24 header_field complete off=25 len=10 span[header_value]="DCLK-AdSvr" off=37 header_value complete off=37 len=12 span[header_field]="Content-Type" off=50 header_field complete off=51 len=8 span[header_value]="text/xml" off=61 header_value complete off=61 len=14 span[header_field]="Content-Length" off=76 header_field complete off=77 len=1 span[header_value]="0" off=80 header_value complete off=80 len=8 span[header_field]="DCLK_imp" off=89 header_field complete off=90 len=81 span[header_value]="v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o" off=173 header_value complete off=175 headers complete status=200 v=1/1 flags=20 content_length=0 off=175 message complete ``` ## bonjourmadame.fr The client should not merge two headers fields when the first one doesn't have a value. ```http HTTP/1.0 301 Moved Permanently Date: Thu, 03 Jun 2010 09:56:32 GMT Server: Apache/2.2.3 (Red Hat) Cache-Control: public Pragma: \r\n\ Location: http://www.bonjourmadame.fr/ Vary: Accept-Encoding Content-Length: 0 Content-Type: text/html; charset=UTF-8 Connection: keep-alive ``` ```log off=0 message begin off=13 len=17 span[status]="Moved Permanently" off=32 status complete off=32 len=4 span[header_field]="Date" off=37 header_field complete off=38 len=29 span[header_value]="Thu, 03 Jun 2010 09:56:32 GMT" off=69 header_value complete off=69 len=6 span[header_field]="Server" off=76 header_field complete off=77 len=22 span[header_value]="Apache/2.2.3 (Red Hat)" off=101 header_value complete off=101 len=13 span[header_field]="Cache-Control" off=115 header_field complete off=116 len=6 span[header_value]="public" off=124 header_value complete off=124 len=6 span[header_field]="Pragma" off=131 header_field complete off=134 len=0 span[header_value]="" off=134 header_value complete off=134 len=8 span[header_field]="Location" off=143 header_field complete off=144 len=28 span[header_value]="http://www.bonjourmadame.fr/" off=174 header_value complete off=174 len=4 span[header_field]="Vary" off=179 header_field complete off=180 len=15 span[header_value]="Accept-Encoding" off=197 header_value complete off=197 len=14 span[header_field]="Content-Length" off=212 header_field complete off=213 len=1 span[header_value]="0" off=216 header_value complete off=216 len=12 span[header_field]="Content-Type" off=229 header_field complete off=230 len=24 span[header_value]="text/html; charset=UTF-8" off=256 header_value complete off=256 len=10 span[header_field]="Connection" off=267 header_field complete off=268 len=10 span[header_value]="keep-alive" off=280 header_value complete off=282 headers complete status=301 v=1/0 flags=21 content_length=0 off=282 message complete ``` ## Spaces in header value ```http HTTP/1.1 200 OK Date: Tue, 28 Sep 2010 01:14:13 GMT Server: Apache Cache-Control: no-cache, must-revalidate Expires: Mon, 26 Jul 1997 05:00:00 GMT .et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com Vary: Accept-Encoding _eep-Alive: timeout=45 _onnection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html Connection: close 0 ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=4 span[header_field]="Date" off=22 header_field complete off=23 len=29 span[header_value]="Tue, 28 Sep 2010 01:14:13 GMT" off=54 header_value complete off=54 len=6 span[header_field]="Server" off=61 header_field complete off=62 len=6 span[header_value]="Apache" off=70 header_value complete off=70 len=13 span[header_field]="Cache-Control" off=84 header_field complete off=85 len=25 span[header_value]="no-cache, must-revalidate" off=112 header_value complete off=112 len=7 span[header_field]="Expires" off=120 header_field complete off=121 len=29 span[header_value]="Mon, 26 Jul 1997 05:00:00 GMT" off=152 header_value complete off=152 len=10 span[header_field]=".et-Cookie" off=163 header_field complete off=164 len=54 span[header_value]="PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com" off=220 header_value complete off=220 len=4 span[header_field]="Vary" off=225 header_field complete off=226 len=15 span[header_value]="Accept-Encoding" off=243 header_value complete off=243 len=10 span[header_field]="_eep-Alive" off=254 header_field complete off=255 len=10 span[header_value]="timeout=45" off=267 header_value complete off=267 len=10 span[header_field]="_onnection" off=278 header_field complete off=279 len=10 span[header_value]="Keep-Alive" off=291 header_value complete off=291 len=17 span[header_field]="Transfer-Encoding" off=309 header_field complete off=310 len=7 span[header_value]="chunked" off=319 header_value complete off=319 len=12 span[header_field]="Content-Type" off=332 header_field complete off=333 len=9 span[header_value]="text/html" off=344 header_value complete off=344 len=10 span[header_field]="Connection" off=355 header_field complete off=356 len=5 span[header_value]="close" off=363 header_value complete off=365 headers complete status=200 v=1/1 flags=20a content_length=0 off=368 chunk header len=0 off=370 chunk complete off=370 message complete ``` ## Spaces in header name in strict mode ```http HTTP/1.1 200 OK Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET en-US Content-Type: text/xml Content-Type: text/xml Content-Length: 16 Date: Fri, 23 Jul 2010 18:45:38 GMT Connection: keep-alive hello ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=6 span[header_field]="Server" off=24 header_field complete off=25 len=17 span[header_value]="Microsoft-IIS/6.0" off=44 header_value complete off=44 len=12 span[header_field]="X-Powered-By" off=57 header_field complete off=58 len=7 span[header_value]="ASP.NET" off=67 header_value complete off=72 error code=10 reason="Invalid header token" ``` ## Spaces in header name in loose mode `en-US Content-Type` must be treated as a header name ```http HTTP/1.1 200 OK Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET en-US Content-Type: text/xml Content-Type: text/xml Content-Length: 16 Date: Fri, 23 Jul 2010 18:45:38 GMT Connection: keep-alive hello ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=6 span[header_field]="Server" off=24 header_field complete off=25 len=17 span[header_value]="Microsoft-IIS/6.0" off=44 header_value complete off=44 len=12 span[header_field]="X-Powered-By" off=57 header_field complete off=58 len=7 span[header_value]="ASP.NET" off=67 header_value complete off=67 len=18 span[header_field]="en-US Content-Type" off=86 header_field complete off=87 len=8 span[header_value]="text/xml" off=97 header_value complete off=97 len=12 span[header_field]="Content-Type" off=110 header_field complete off=111 len=8 span[header_value]="text/xml" off=121 header_value complete off=121 len=14 span[header_field]="Content-Length" off=136 header_field complete off=137 len=2 span[header_value]="16" off=141 header_value complete off=141 len=4 span[header_field]="Date" off=146 header_field complete off=147 len=29 span[header_value]="Fri, 23 Jul 2010 18:45:38 GMT" off=178 header_value complete off=178 len=10 span[header_field]="Connection" off=189 header_field complete off=190 len=10 span[header_value]="keep-alive" off=202 header_value complete off=204 headers complete status=200 v=1/1 flags=21 content_length=16 off=204 len=16 span[body]="hello" off=220 message complete ``` ## Non ASCII in status line ```http HTTP/1.1 500 Oriëntatieprobleem Date: Fri, 5 Nov 2010 23:07:12 GMT+2 Content-Length: 0 Connection: close ``` ```log off=0 message begin off=13 len=19 span[status]="Oriëntatieprobleem" off=34 status complete off=34 len=4 span[header_field]="Date" off=39 header_field complete off=40 len=30 span[header_value]="Fri, 5 Nov 2010 23:07:12 GMT+2" off=72 header_value complete off=72 len=14 span[header_field]="Content-Length" off=87 header_field complete off=88 len=1 span[header_value]="0" off=91 header_value complete off=91 len=10 span[header_field]="Connection" off=102 header_field complete off=103 len=5 span[header_value]="close" off=110 header_value complete off=112 headers complete status=500 v=1/1 flags=22 content_length=0 off=112 message complete ``` ## HTTP version 0.9 ```http HTTP/0.9 200 OK ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=19 headers complete status=200 v=0/9 flags=0 content_length=0 ``` ## No Content-Length, no Transfer-Encoding The client should wait for the server's EOF. That is, when neither content-length nor transfer-encoding is specified, the end of body is specified by the EOF. ```http HTTP/1.1 200 OK Content-Type: text/plain hello world ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=12 span[header_field]="Content-Type" off=30 header_field complete off=31 len=10 span[header_value]="text/plain" off=43 header_value complete off=45 headers complete status=200 v=1/1 flags=0 content_length=0 off=45 len=11 span[body]="hello world" ``` ## Response starting with CRLF ```http \r\nHTTP/1.1 200 OK Header1: Value1 Header2:\t Value2 Content-Length: 0 ``` ```log off=2 message begin off=15 len=2 span[status]="OK" off=19 status complete off=19 len=7 span[header_field]="Header1" off=27 header_field complete off=28 len=6 span[header_value]="Value1" off=36 header_value complete off=36 len=7 span[header_field]="Header2" off=44 header_field complete off=46 len=6 span[header_value]="Value2" off=54 header_value complete off=54 len=14 span[header_field]="Content-Length" off=69 header_field complete off=70 len=1 span[header_value]="0" off=73 header_value complete off=75 headers complete status=200 v=1/1 flags=20 content_length=0 off=75 message complete ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/response/transfer-encoding.md0000644000175100001710000000341400000000000024110 0ustar00runnerdockerTransfer-Encoding header ======================== ## Trailing space on chunked body ```http HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked 25 \r\n\ This is the data in the first chunk 1C and this is the second one 0 \r\n\ ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=12 span[header_field]="Content-Type" off=30 header_field complete off=31 len=10 span[header_value]="text/plain" off=43 header_value complete off=43 len=17 span[header_field]="Transfer-Encoding" off=61 header_field complete off=62 len=7 span[header_value]="chunked" off=71 header_value complete off=73 headers complete status=200 v=1/1 flags=208 content_length=0 off=79 chunk header len=37 off=79 len=35 span[body]="This is the data in the first chunk" off=114 len=1 span[body]=cr off=115 len=1 span[body]=lf off=118 chunk complete off=122 chunk header len=28 off=122 len=26 span[body]="and this is the second one" off=148 len=1 span[body]=cr off=149 len=1 span[body]=lf off=152 chunk complete off=157 chunk header len=0 off=159 chunk complete off=159 message complete ``` ## `chunked` before other transfer-coding ```http HTTP/1.1 200 OK Accept: */* Transfer-Encoding: chunked, deflate World ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=6 span[header_field]="Accept" off=24 header_field complete off=25 len=3 span[header_value]="*/*" off=30 header_value complete off=30 len=17 span[header_field]="Transfer-Encoding" off=48 header_field complete off=49 len=16 span[header_value]="chunked, deflate" off=67 header_value complete off=69 headers complete status=200 v=1/1 flags=200 content_length=0 off=69 len=5 span[body]="World" ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/url.md0000644000175100001710000001231100000000000017440 0ustar00runnerdocker# URL tests ## Absolute URL ```url http://example.com/path?query=value#schema ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=11 span[url.host]="example.com" off=18 len=5 span[url.path]="/path" off=24 len=11 span[url.query]="query=value" off=36 len=6 span[url.fragment]="schema" ``` ## Relative URL ```url /path?query=value#schema ``` ```log off=0 len=5 span[url.path]="/path" off=6 len=11 span[url.query]="query=value" off=18 len=6 span[url.fragment]="schema" ``` ## Failing on broken schema ```url schema:/path?query=value#schema ``` ```log off=0 len=6 span[url.schema]="schema" off=8 error code=7 reason="Unexpected char in url schema" ``` ## Proxy request ```url http://hostname/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=8 span[url.host]="hostname" off=15 len=1 span[url.path]="/" ``` ## Proxy request with port ```url http://hostname:444/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=12 span[url.host]="hostname:444" off=19 len=1 span[url.path]="/" ``` ## Proxy IPv6 request ```url http://[1:2::3:4]/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=10 span[url.host]="[1:2::3:4]" off=17 len=1 span[url.path]="/" ``` ## Proxy IPv6 request with port ```url http://[1:2::3:4]:67/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=13 span[url.host]="[1:2::3:4]:67" off=20 len=1 span[url.path]="/" ``` ## IPv4 in IPv6 address ```url http://[2001:0000:0000:0000:0000:0000:1.9.1.1]/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=39 span[url.host]="[2001:0000:0000:0000:0000:0000:1.9.1.1]" off=46 len=1 span[url.path]="/" ``` ## Extra `?` in query string ```url http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css,\ fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css,\ fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=10 span[url.host]="a.tbcdn.cn" off=17 len=12 span[url.path]="/p/fp/2010c/" off=30 len=187 span[url.query]="?fp-header-min.css,fp-base-min.css,fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css,fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css" ``` ## URL encoded space ```url /toto.html?toto=a%20b ``` ```log off=0 len=10 span[url.path]="/toto.html" off=11 len=10 span[url.query]="toto=a%20b" ``` ## URL fragment ```url /toto.html#titi ``` ```log off=0 len=10 span[url.path]="/toto.html" off=11 len=4 span[url.fragment]="titi" ``` ## Complex URL fragment ```url http://www.webmasterworld.com/r.cgi?f=21&d=8405&url=\ http://www.example.com/index.html?foo=bar&hello=world#midpage ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=22 span[url.host]="www.webmasterworld.com" off=29 len=6 span[url.path]="/r.cgi" off=36 len=69 span[url.query]="f=21&d=8405&url=http://www.example.com/index.html?foo=bar&hello=world" off=106 len=7 span[url.fragment]="midpage" ``` ## Complex URL from node.js url parser doc ```url http://host.com:8080/p/a/t/h?query=string#hash ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=13 span[url.host]="host.com:8080" off=20 len=8 span[url.path]="/p/a/t/h" off=29 len=12 span[url.query]="query=string" off=42 len=4 span[url.fragment]="hash" ``` ## Complex URL with basic auth from node.js url parser doc ```url http://a:b@host.com:8080/p/a/t/h?query=string#hash ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=17 span[url.host]="a:b@host.com:8080" off=24 len=8 span[url.path]="/p/a/t/h" off=33 len=12 span[url.query]="query=string" off=46 len=4 span[url.fragment]="hash" ``` ## Double `@` ```url http://a:b@@hostname:443/ ``` ```log off=0 len=4 span[url.schema]="http" off=12 error code=7 reason="Double @ in url" ``` ## Proxy basic auth with url encoded space ```url http://a%20:b@host.com/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=15 span[url.host]="a%20:b@host.com" off=22 len=1 span[url.path]="/" ``` ## Proxy basic auth with unreserved chars ```url http://a!;-_!=+$@host.com/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=18 span[url.host]="a!;-_!=+$@host.com" off=25 len=1 span[url.path]="/" ``` ## IPv6 address with Zone ID ```url http://[fe80::a%25eth0]/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=16 span[url.host]="[fe80::a%25eth0]" off=23 len=1 span[url.path]="/" ``` ## IPv6 address with Zone ID, but `%` is not percent-encoded ```url http://[fe80::a%eth0]/ ``` ```log off=0 len=4 span[url.schema]="http" off=7 len=14 span[url.host]="[fe80::a%eth0]" off=21 len=1 span[url.path]="/" ``` ## Disallow tab in URL in strict mode ```url /foo\tbar/ ``` ```log off=5 error code=7 reason="Invalid characters in url (strict mode)" ``` ## Tab in URL in loose mode ```url /foo\tbar/ ``` ```log off=0 len=9 span[url.path]="/foo\tbar/" ``` ## Disallow form-feed in URL in strict mode ```url /foo\fbar/ ``` ```log off=5 error code=7 reason="Invalid characters in url (strict mode)" ``` ## Form-feed in URL in loose mode ```url /foo\fbar/ ``` ```log off=0 len=9 span[url.path]="/foo\fbar/" ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/tsconfig.json0000644000175100001710000000040500000000000020045 0ustar00runnerdocker{ "compilerOptions": { "strict": true, "target": "es2017", "module": "commonjs", "moduleResolution": "node", "outDir": "./lib", "declaration": true, "pretty": true, "sourceMap": true }, "include": [ "src/**/*.ts" ] } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/tslint.json0000644000175100001710000000041300000000000017545 0ustar00runnerdocker{ "defaultSeverity": "error", "extends": [ "tslint:recommended" ], "jsRules": {}, "rules": { "no-bitwise": null, "quotemark": [ true, "single", "avoid-escape", "avoid-template" ] }, "rulesDirectory": [] }

    t p#8׸iޘRJyl|۶mo\1Ma)X?;p]9ϸPx&u_X{w&5c:3<&Q% W8[nyI]CiذxC4[{! W]%#uO _'Jx"-H=O:%WZ=w/W'g(٦&hud!q{b& - V3W n*řB$֋:jԨh3r8\:kc&W/> Ph=z[q|@ Z\[θnhԩ4x['"Z<\stcɘeʕ+mDŬډm%oC n{x[_J45U@@@@@@@@bwJo$k~8!4zGdyޓeyntXoV{ۼhѢhA}y󢒤rqVޏyzR6phzzDzG h- %K;ևJ_.xc4Ly@@ ’${\S^&䯃+u9rx|]\8||aHX1N80N_O7\){z5$Ϫы/}[oU˖-uq餓N։'ĉqmcǷi(yV6;J@(ūӢ94@p7B,xuꔻ^aC6>3KsuY;>/Z/ _~e$$LwROl`;Lߣ |oq'OK V[ɬR'V K/4:ԭx²6k,/q6l#'KkWI vJ@^ |&xJ^Fz eIG*eNI&Oyy|B2/&KQ%'d/RNo;1MNX$ v9V>~r:wBsw_3S;uQLi3DJKBDڥe^ 1x&&pAxE%[)@۶{D =9 뤲w@(;/ad=I !`A.xK;y@ , YPꮻ ɵh IEUWժviy0U6ly=a5!Q[G]:yVXZҲ4 *+r@R@@@$l9,  Pl>s?^ƍϒ #71rM6)vp I?N`ZX3gNÕCf'|RrqB.5>lkرQdqaO {Իr;,Njf@IDAT ҾeSi e"^Dא=X*T`ĈO>>Ν @ ӓQ7/%2d:I}a9ᯃZhB|p4I5$ϟ@uA\*0:q 'Kx4k֬e^2I֮]Cs?        K.[xŗ!굷I\ ri7p4iD{G4k7S ҇N!PRǴYXRN=IuZO?T/?8+P(u:HM6q k*t%ٶV(ӑG*~ڿ?k*@@p\'.uM-!f̟`I}, uBZaUTC.ἭPX]z!KwGy7s[TO=6]yܐ?a(^&6# r3  ,╒Py;@ `ѓGWΥVZQPl'rEdGO|dc6Зp0D&{r';igՂ zЯfի+iIӤn$4?k @ Q=znqZ[+$:wBN,3&JD>p(|㰸 :vup . .!+F_uh(0S h ZluB xd]w-@O'8 \[ΐ;vl15s̉zQXk6t5&O\rf"l\ G㗯ªKg\/ӤifO+@@@@@@@@h筟:Zϡ pҬm&Z2D\lKR >A7Dk=&M$ύԯ_d[믿~;Gs<.-΄ZW\!}q3i  ֯׽KI`+a9{#5ٖyhT/Oc;kZlYHt SvYg.Ӧn$w;W/rat1ncP@HgjC@@B 1QBA@`8bĈ|u̙y}ue @hSNo %_5sʇZx1;\] SNM}eci e Сtqʐ+FGxuDG]ÇKڭq23f'|}r`ٳgG /ҋ`K/tEilp"vZf*O<9j'&BL?$;S^ )+1s=/w9 ժI! %~75*ߘfĉѹuF&<9ꨣOԮ];zAsMj?Vq-XQNէO($ivqGWD6       ŋ5n8=:J3fΛ7O+V4o\p@~^'j,s΍}0a:iay}A:^G `KZN-ool@@2[ V[ueRit$ kWl_{M!>FÆ+l!1Bx&˭4LkXG].d֭[tn^ku]/8uYK@2_(   PlkIF<~A| &hϢtغuh2Xz -F <)cjҕEiȑzW]O&駟C ɘZIoQjH:xRKNEA@ScO'jz*+CH+|}JzgQ?PqTg͚B-oh^EAjp=:p( qzHN"mڴQ۶m뮻}QFkn <Φ -P* )G0}L.GE%|[nVa@xFcoիW: ]@6l3v%]2eJ4I5z̙3$[ƵCث-)        @L815Iœ] ǭRJDUV^k6Rt8ذ@[ύӧOpoiwkv_۠AԗCNU|e9z6O?N:I:|㲡G@~ XN?Ɖ\+_}%Ғ%k?ܱ[^Iu­,Wljk}FUhX.z׽{wr![]χLď=X|{ @(ara~ !2o,ԩjdK_/|8L믥w>~3G Ph{wՠA4~xU WڵkW=p 7,نpt(V D |w5iD{k(cݺu}K`opS%i b)  Oo?qbLugOIWҁa]QVÒK揆8YiѢ_KzL{ ü>)3P@@[ɴTki[Κ=6Xo=8VÆRR}+ctwƌ:#x^~9ӭ8SR{Yg1m @& ^q?kR^  #RȟBAQ_(xWz,+ѣGH)LjMP٠#Pz(𻃿xj2&;/Λ7/ZеkW„t-Nک0Yz5iӵ @BtI 7ܹZDZ<"j9~u ߉az}5DO#P|ڼyp с؉ۋxp}~?{z%s(# ٚ.f @FT*{F459}t[8p %rR`_뮻[lEF#@ 8^nݢ#_| |=tigI\ @3[D; eIH?-R.!E=)ٓȮ!GI?g~iyf3,9}Νs3]HHHHHHHHHHHH`rJ*q5.Tԭ[Gٲe H""Yʕ3[ǎMOQ;[һwoc1lK"'5&J6 F'DڶɚUdD&  @@L$ mߐl 4O;;SU&)\$[%Jmxq5q1$}jժɓH͒>'4VZ%CB f $@$@$ 0Ch@ٷ/yȑ&",yS^jH $d=~H$@$ RhI#:ʹidՂYX< /A 25xr̤ffv饗yg3pvG$@$@$@$@$@A_%"      Hj263g44PMժU~R^=Mn޼yG$>{x`C 6H2eiӦf&gE*QroȮ]ÚIE&OYX+=<N$@$@$@$w%ؾ plݻE4)2+&b'ٺ>^}$b\YfI֭?رc,:Xheʔ)ҹsgiР|GϠ7$@$>WS7n|ᇲrJ[tUZj%e˖(: @z dҕo$3nHZ]tnqMo:_ŒEDڴu:' dx#~*{wQQE$GY3 8qBK0a 85kVi޼ 4/P@2 c p M5k4[>}ȑ#&=?rwߞ;g-VX"s==!0$ șSDٲDUN3qDuXڡzuҭ[7iҤ D1!E]ϊͲ,\:,s*V(:t5HB$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@4>/JS/͚57|= HJhѢr7 ~gT-}Ҹqcɞ={Be#pqɔ)[I/(2zh<&J`$@$@$@$I `V-K$[HW{ ]w}~Կ,o-$B-o sο$Ӟe˖rM7￯zKdB䚱 aiCdzɚ8sf1q $@$A u:B$@$@$h+Od߾MEzJd~wt#sH%K䭷ޒI&IrLB,Y2ن ĀL 1cȷ~k^zKVvQ9EFMlHH XSFz]v-$녣=g^YHHHHHK⥫EYIHHHHHHBFTF2:uI AVVZ`8I' xɓ'e޼y >G5IuYO_O#~a/kZMHd` B$@$@$@$@ !pȞ=ZH$[ۮ]"W<,*V̗dKW|^H,煽޽EyȒn/xfv7s°=-#bk6 :]v0b! H7+F#g3IHHHHܹEQUV" J{9Y|1ꃡ_:u<4J$u]fCw5GNtA$zq5:e.plK~HHMFj:-&QE3_K˖-5Hiڴy̚.xH^fM 8P,X aÆ&>j1.30YHHȚUDc D@`˖-˨QK/ݻ-" 5B$@%PD ضn*G6@wl nlHHHHHHHHHHHHHHHU1b 2D?n|I^0$@$n2w\7ny_ti[oٳ;mL)`x&i1/ E&   $"|Oŋ5Rb"Id\L-<L%?[{^" qY4\2M*^*+ҥ@릛|h\rWFHcM^z\o K #iꫯBlHbK2}tA ` kO<ϟ?uGh+ @L _%x8 @ 8p@^z%cW[jUf͚5R+ ކ?> էOcZTÚ[ٻW%=T6oSGfMS/Ɨ.E%   c|h {:xT/FJ++T(vh$KB<^xE"'q/ !.[=K?NӵM}[Wxz!ٴi&b6moxr># D"jB$@$@IMq^)SF|IG\\]iE17i";8~cǎҾ}{{8nJh]cnKJԨP- =Z"mb5\L"v-[f#J|qFt'jժ dfI<")2}";wc*/y=i< H"7(GCX1gU"HU-h.%yyQ*O>Z~"O;'v~ix~ѢZxX5 dZn|.%  ~xv˾HHH x7$@$@$@$@$@Q'3I$gA,$@$@$mu K. *jue Ƅϲ}vtӮ:$5|bg߾}h"1cԮ]ذf\?%i'swԩ3իy񬇀HހZn!^s5㬾OJh?zD"ŋUHHH9EtJ(>(ҧy=,<3@9sD]MG0_<N$^,u֤iʮ]L<nab^N(Αsv@}'LR~ɠA$K,+'(ѣtYRO̴ JRum'8 1՜,a& CVV0g$[ʶm(\Éһ3s5G5jԈh;h,o"a9N:X֭kjM2Ez-'O1cH"EqHHHHHHHHHHHHHHH#֭['v@#h..߈S[!O,ڶٲ'^-çUVf=z<7NGۨhAOTB-j1r6I$@$@$@$@!ЃpCqx*{꿿l"!;/U/ • 翇Z.|!^_WW_ .@zZL\ ux.ULx}Ő}HHL ѕ<8vG$@$@$@$@n P P  XfI^SjU4mɴ0L2ɦMdqOk֬)=vc^k$b:uG2#pvZvj9zyj̞=[}>zp8U(t?|[MsXE[5j$3gΌMGihZ5DcD͉CNfU  p9$Ī^]t(:kBdZP -[}gn{E$B4[i[ulٲwܑѸ"mb5/tUutTx@1b& Ly&' ;v$c?vz!X? 8&Z'O:!+Λ7O*keN tZwuWBW;wn D$@$@Q&ZQHHHHH 4ȑOHH~U-ZH̓|$qkɗ/wy / Nd<;\#4)dS'@ִ+Ym&:uJsb,$z;w.tJg 4iD(~i]p~Nnfc0·~E"~+RWß$@$@$^#͚h)"({"QXJ 2$Af/D:`O#W'}r^Nwܨ3!U䩧;U\UFtRYdUea>ٺukg' @ Z?hmctK,z`1+`>&Y(E8&/]޼yeڴi&y`ƍG|%              p9 J6mW_p7=e7mx3d #JOۉd&+j\?vIÆ _~I*'Wj!w|%$%    B9PAEcp=󌨟ĉ"gn!pdYN0/Uq9995u\ IgH4Ab!  _j ]  s4HH -&gΜo崸=z̘1CƎk a\W&O,s疦M;#?~rm_|E`okС}>S#CN_ŊwRxqy9sO>m>[^zfʔ)m޽RjU?A_(o̘1a A:t6i$@`ƍRfMy饗̸JeѢEE*U|t9Uo>y嫯/Xy) +&Xy#H ɤNcG_p,F+"} Y ј s^Qٲe?j1yqG HJ =gǏ]weiu& AR5Ԝ ~Xvid?~PԩSR`A:tՆ^ѣe֬YF7\D owxMJq352_)tµjq =I k+[QZ5(N,#+K?H ivHAEi zzҪU+yǣj웁̧za:  [ ejk8;i ʕ+Ijc."0a Ѽys7ӄZHX~fs)kqPc !\?e!{9|РA[o?`vO;)áBzW˖-lٲWM'rk$5jԭ[׬Ɏ7έR.               lGze|&F8;'I~8_h9P<\ 6^FQF;pB'44acken S;P9gw6p˗mۚHvsq?B]m!'%K;.$LJ*\rɲk({5zn݇{w+DK']O 06Mv4$@$@$@$@$@q"95NAOJs㍢1A DP#s`Mz.^8ynEn&WZeĹQZ|#c^{}"i @ h   طO#e͛a(BT bY EI61;wߋyLpvUH^u]gh@Ô:dDX:4Pد_?ӆ&Ki#T?g϶49Gnxq]6p;\s L55µociRvnݬsZ8&l4ɡ,]$՜F=s%ZiLh0M#qۇK`v8\$HˬO>iFt ljN8YÉ<߉Nn &XK\1>3p2ӤFBH#_nifv<1pW1'өS'#+ų@Fp!*P~K Y 44ɳY B+=uԩf Ms?hHHHHHJ@HHHHHHHuƏo5@d %P0 vNN}գeq5N`g9y g_Yjղ4iblq֭[glq`c.ab([`g^]D v{q?m;Ը? d:wCą0ae`D7bFf^_~//[ر] fo~s]=^ _a|7. ܡ>8kw昆 ؆-y8f(Б$%sCsZxNd;@Ns q Mvxnf d(WrTHHH 8qU t W/wa^ڙqb- o@B&<޹}vb,ɢ $G2Çc061,@pl0 d!߶mC֜9sL[HNHaA IlȔeM/##av!8٥zVٲeƈ؉p,҄ZHe"EXyZmڴ㎔6+f  QBp ڏI+?|Jf͚#ƄD_vyꩧ̱˗Cv1cU,\wvc@0ә3gCqͫܲ[?G ?ċּV5,D):E,z5yp=":7':sf>C5.\̃xŘ1oTʼnvZ##q 7`V3s½֮]_cj_T."; >nN@;rXZљNt&'FFҙA8VAzt]dN6~XHH"#\BL!# b.e'ԂNp4NFП5h4pJ|^N]΃u$^NNt{"Zc4n8eokq 7'p:$|M#"7>Ul 4\P4cn\81LxuȖH%l{/b!     H$<%      l*V>1éS8_h99w1pldΎO>6]v+Wɝ;OTB:s #rr#m;e@vمh҉S͍ѡ .lث{7nWDr^tsk:|/~\+'#    @4U{5|[ &ٳ-رठ ^+G<@i}..t/0 Z8ώZ(N|L(ٰak͚5QlM @"_HHHHH 98屐 x3޽Bk3̑#yA%W\f+0K{WKJD&̒RJȑ#E~M}$'NM$%KL9k1 gK.]I&ɍ7ޘR;,I4BU[ʔ)#gʱHvL"ǎ5>t b( ,M%ݺuMe>t萌=Z ?γ: .@ʕ+g56)XZv.˗ٳg&D2>Sj*|C\d?~aw]ΩPBJ+\?\ܜ DVJ%R tҢE\]Xn˖-jժ d:/ RB\'nϞHǎ";w|Hܮ d`:u3G[D^|Qt #:bӏV1wNqC@]2&I~&{̿5ׯXB NuYҥK9qhr%ɒ%}͹1ώVuʕ+49QR'M8}n^DHXӣ3-LNt3ils5y6dQ'Mο~z]vu'UUw=4 {믿Yf\@$@$/+1Մ;m,Nn 'N}ygW[AbX?4N$S2bX QԹʑn Ntc֭[y5a-GT&-ZN6l7.A?8|gf75~)Q|8>              .l6o0NNG ;8^'62vb-[6y;qj=zi⧔͚53\sShQs~8;9T8N@qrmKc~36olر~$b^kXී=JzJ#$DzIHHHHI_L ( 4h R@xY?6`3#X+N {v<71'yi!~|. @ $axh#b{$@$@$@$@$@$@$@ |4ϔ)Sбs=&#W^-+oa1h79sfUyqFYF O?do-[L G h%PNa2 W^zꙀ]}+ɡmlj}pC-SO=cʕ>Їyݺu/ؼ -~ln#v^7 a}%@umypΒiAv$E\p=qs\ \܋`Xs99~ZZ9"-. j '      HZ/̘1Cp[o|Ht5ŀƮ0ܱc.J^(RH=pZ]Scl %A *doh_SN |2g3N,Bĉf?n٫?#G޽{ũ̋"⤟TNut2֮]$bԩƸؿ~ư? bΉߧq'ٍ2k4;NsQTD$@$t"Æ4IDtS<-Ȕ)"6j$cuW8fNg ^ә KcW+f yx׉OT;O&ո8 HJD3w(,YGAP: w6/Fjk8Nj ׄ;i sN 7: j ?X{Cĵ6cn\,8eQ^Ǐ/GCf!j&Ԇ \,iE -;'H X; E.ofN_b9aOCT@?# h欷vDѼmձ-b8-OLn X,e:=zTsFRLAIaʕ)M.]\bEsެYRdu' =Rpa;v{o;c'){饗L0:EKZ ΃A?Oεh|G\R~EZrU qĔHH O*Esz7EgwyCE4k&j0\sƍ˾}쏒 85iD;<3޴:8aÆO˖-[ ǣ9經sd\3{~o3w\sdNup: GsAq!'}-L53J`kJn+B۷ѱC0mG#A`۩xkN 8`l` @V _Ǐ/[^{MZjP8@vDnM7!     p@/%%s`]9y..Ev !]|bF15j i$@$@$@$@$@$@$@$K ޔ;J~R l6DP;Em۶cnXzi -` 믿n>{뭷رc#aawe8C2-2bZ^|vwۓ'OoQ.۩S'y7 k.S~30]V`A<?a6m<b MlpB>SAppGA:,?o!A_m_M5ova>>5\#5Q5R&3!A(wrcH~'@8Wxq~̙c`8c=f,];H5j(#oc:?n/`puיdk.z 6 ~EVa!  @.2Ɖ8/NAN+ٯ8':S8 Lp kd$ z^-WVk8qz8'urc][@ %#Ț5kL$ӂnlقɲ}oWu+loӬH/1fݻťl. 0{h5EF . E     (R끘,N{>m:ynPNaر&o-2}tH}(<|?y $:# })^ϛa(BT bY EI61 ŋ-MrdUZ҇j+'↥- VI4h,54=\K-54Ϸ4IYbq5uԳj9M!rփ>hi@jKUZjlq:<`UT)s,K,v[K8qG] gjimճ-[fj9KY9r䰺vjr-Ը|Y .0`+Z?^jj@Z0ւ u1 ~oڴi ig3KyY/8s[ ˱̚FL2Y52qAu߾}{K5`l0_{ոqcshs3,4YA>K uEk /tA`CYh/c]r%F.ѥKKWq SM\gi21WKeJ$-  O@V֫Z:wtna89񮁩kܖթsxo[ʒj۶9J0]s o捘_VTZdC=6MBji3yd*U8f hBa3ϖ-is{/бps{pfUPֻkU^݂=t5lTD KZj@ҼƉl^FKgr[8љBQg:zRn2@VJ :[E\TM6ʕ3Qi;IH Q>2eq@?O?upFh"/6wM0di[ki^ ӄ[5hA؉Nߧ<࣎>o)\^] Fb t\r5yjlauE'zY8ցϰ&y62r3X{IdnӦ4ibq^0N+}Wցlyq_uK3&@2䓉雽 _w 6 5j%q㘂oDW=ZvN `=Z('N8$Mel~1}5{챔naP>N?;6l0.du/qb'̎(5NocZ,p֩ll՟?)&>86 1٫_M֭[[;wtX!^kYܓʇq<<{>Tw:     H`֬YF^paTGGŽpޟ3gNw}7/Z4h`]}j @%c}Q5|)w $o.,2oȵ&ZMC'o_4[e[^"o^)+ @4ߢ kIӦM駟 B]цM#\(<N4оѢhvA;Qjj@>?pE~UME|ԨUta˜ɭrNw>,?)SF4yY'hpsM4a=~ F@ O@uGo5h~kI8u\4Zg'Ol6W-\M`(P X DE$sf?5Mi7D~X{E in' @Psl*ҧoV='QZysoyDIwFoGyD/BŨw- ,h:hM-4lPԘT. Fz˃]l"n+2{H4SHHHHHHB*QFHHHHHHHLv&L0}H vzsEj|գe p62iΎ s߰\M%P؎ qo0AE zzqEk;` wm5:d˖Mu& !{壤f}7}6oKA4q% *u׉//2dHЏrp\eVuq閝 @Fr-K,Q0s`z.4Ev!#%"&$^Z}N{<$h"SNZNe]  >`Q˄ZQGIHH 2D gс W)2&wlN$^[5J? `xZp.I;wJֿ2eJHk.,TI&a{G"[n%l=7WXp8} 2ZCў8p ܹsjE{nW6V/_Nc#ĉE~G)W\>vHΜёp7nqɇ~dZ 'q#~'PBƧ}&@mD!&VG`hGڇb 7Dcǎj޺uk)UlٲE,Y"6l;iuuN7|#&M26ի/wȽ>\m[dZRHHHHGL22|pgVXQv]S<|:d|2K,)KIP,  BKKF,I$@$@n& n: },@2ygЛ&8|1bUtQڴi#X `! @X6m ?{lco]hV P֭iD/D 39D  P!S4ȣQ%8jzm^DzK{#n&'>}Zf͚%cƌSJl٤fV5 Ld:73$rF4BժU_ѳ8yy΂ߡO>Dvmz(k֬ ,}OK4{6\ = IH I|o }$J0M?qDپ}4h@JӦM .Hd/a>hPeCK/.YpƾJ}4 O~i/^,+W6H\hhvŶD@c5׈,]*RFe3$@$@$@$@$@$@JDx 2yd>E1͛7z kX>kܹS (  +GwqsKYl NIr:W~ƌr iѢ &M]'RȐ!_]v2>*퟽ @߾}ڄ ]v67lݺz`^P6M$$s|X_H&Ԋ5aO$@$@ pBс˃-"'wo6G$6olO4RlR5k&ժUcpᤸ DF`2sLch"@dK(J2"HH)?yqwzaD.q͸4?:@Ocǎ9 `.^{1jذ\yr9O$g%{삍-[S%9k<5HZ-o޼}"zw8H pW`rwBIHeߝA7ey\^n VbEQFRn]Ωx}cb/}4?Sϟ/z/bֈfQ\9O/#JY$#c$     w#      .C&8!lljՇzzL)[K8ؚX"Ν;=wٲeO]tꫯv 6e[6U $"DZݻ9     e;rwDoo<2W3gIIH"'#L&rƉHHH 89u@wMی 2N3c ?~An/_|.b DݻMD8/8xǎR|yi޼mVjԨn<߆yJ"Sx~P @ +"&ҩSԻHhOْEM6u$\p FRvmԫWOj֬)rJr$@1&ŋzt+VHn|矛5Gș3\uU'V^h9 7?dɒ%c&VSۨʕ+{&!U&ux"CGBL!r="o> w <3sI^7ސYzw0.Q7|I˲e˺LBC$@&c}eP+ք> 8$ CPF.^(oQY @R8p`ۜ9sd׮]RD krݺu+`⤾ 8d'yf4q&pFDzH0ѨQ#q^"߉"]j#Ҿ}D$  $$^E}/(7oTԻ;L$Ҫ7Ƹw^믍&@ `qjժe4?|o R ĔÇMpy8U۾}Lpy8vׯ_$*]tLHt:|ٶMdDKYVUlFG " F@嗋 S6cǎ7|cy晹eYRR%tM5ml{kp% 3h=ȓO\9:     ;vy%cD\O9x`yGM<̉' cgţ$@$>=\˄ZN( ā'4q. .6߼]tQ @p5$BFkܽ{wy&ZjRxqύ@F FӃaeˌaŋ7!G YWRO<ؐ<HH 8yRW|\"#LDmgOfͼ7Z$^p@gz1/b@rf+THI8t萬^Z ,k<꫍Qe2e RqcE$yxsDẲ D.jy֜8ryދHu4}Wn/ejf[qFH{Y~iV\i~VX!(ZYE,Yxo ӧh!/茏HHHHHH A诒 HHHHHHHoYt,Z; 9rJ*ZqX/_^r1Q@ ?|lQ`/UT)UN< h^P_?g>P     /.۹sgABgyFz!ɜ9DwdxSOi'/UW $dO&IHHHHHHH .L|uVX g̘!4+FA@!;v@v0x$wC|k֬)7௸ ~?#+2xH¾d"j-?ac<HHԟOKdQ%8Dd%amQ$vDL%\DB: r;v$Yd19rlڴ$A]A+4N[eϞKC$ ikKvZT ɳJ,i;udCBB\d$;7) 1̙3嫯(5 ѣAM\.d3gN_0Lg~'thhAQP9`AglObB $'$>coXsqɛ7y~]wFA"q{Ei1Vr]YHHHHHHHHHHHHHd]fG}vו+Wɓe޽ߵL2RBct `/RoJIH௿˺u+lD >(_W6md&VB6j}1}WGIHyHHHHH@|H+Zƍ_=/ cHHK/fUT+Vg} @jQ}B$@$@$h+Od߾M ߼}Q: o@y,#@#EFFp:0\+ҳ DN&@"(qɳʖ-+XZ1 ^z9g \طsυOIHC"=&2|ȍ7piE&N3 VZetF̻9 f2 5mL;15ϟ\ 858I`۰aO8!Yd1 T;1zJd?‘zszA\H$@#PH׮"O>93N25XnϠ-Z4>W4^xyΜa@q$2nNW4x&qA#-c _XNa% sHb=VHHHHHD*^ZHHHHHHHclແd:` s=WJ.-HUN K. .n&j۶mq36EىcP l*Udi˗/5% .2dHt&Qdho~lHHHHH ?,3f0 ySN`ć7|S^}U駟^zgNg  tH̎j @\ dϞ,/?~+agΜq[ ֭[a0B}˂Ry֮];c a$c]c=DԞ[^x!>  iو&e3FSɒ'QFlRhK-U#5\c6ӚEl)ɵW_ѣZBLS$9&^!5$J#pH3B_eӦMv%eH|8ݪU+,NxZ, VW}O?sYp,^8@YHH "ѩ<)N~~ܥK^|v&M`4Xu[1A,$@#pI u:X#B)QiU&v[w:o޼g{_ &2v,iyRh              T -ZT7nl6lٲ% >-R?QrZ`_ 6ٯ~ɒ%S?YHB]xņMT….352H, _m+d̙" A*@$@$@$@$@$ `7?.uUҬY3&ҋsN& %=C/,$@$@$vL+DHHHHHHHHe&Ϳ߿.oذAm޼y믿`ר[xqclkE]d6Ds9Mr}I.yQF0ylm=A7nh^ᬹm6#$A ߔ.]:e×! ۷:&lgH$ H[h 3$=0(s.~x ik׮!+ dHHXbk?kر/WYWFID:umg              H.iӶhӦ۫N>s/.6.X$?M]ؚ)RD`{'b o.^ ,xF|C$lۡF,)DٯZTٲeVV}}^J>M%2H*nr xW_- .YfiAҪU+W^ϦyUv1>ٳ'ߥ& $9JHHH7#@P@~DKQq,i!oiXHO$BenٲEP>={@ce{%JhOFd X"_0~ED8T#i0 s1cDuyAW^qpHH ]_E/YoQt5'#֭L.2uHÆI9̈u 3C 8"h]lvD0 B^$$l鯿Jyg:jȑ#.wKӦEX6Fn^$ulH2*YE+KrnϞ=) t[A0]5^Aŋ3xϡW `m=tm쵠}j|egL|eݫB%GA?YL$wu͎HHHHHHCPF$@$@$@$@$@$@$@q >om6}v:t(E 1>k +VLh;IH¶{}F }Z}^k=֧vmiԨfƍz~~y_  d&l21B/lR-ܸ+dA擹h"'Ng5lP]w.x, @ly~Ht@@@@ 6N:ޒֹ&ԶAet.͘1ûTR)+*W|(!Vmذ@&AGs7m2-~d@p[NtfѼ}b+ n!]uTt(y"䥀7nݤ3믗g_ v^! XG- jKZi۶m^9AUۖO>kXLL2^Ǝ1}-VblB{Iwzۄድl0=ކvPd"wq^)Xikkb#:\-u~Zjnx @&۷A3ٔ'@6;7n",[@4fzO%; oˤצM"EžM"#`ms{צ oׄѭm=c'{d1֦}HTO.]*w`Z95y       GC- 4HPnX`O,Y[[dcǩ[`L_pommmzRr 1~ᝄmĠ-[A(jXGxlu.]^y/:tCjԨ5Ԭ.D]&%wV.ptIT9#w:I.Sc餓@jY)䎇sxҎ!mI/^-kx[;ǖ+Wj޼yޱmlbokX;'h:ycKp`.w0kIv{ӦM^{)|mmQOx-`Al ")~,V[J6b=yoC#ళdB@ ZԊ4    I(`CT-iUoB&ړ?{nrOeN5h։9x:ZԴ&k^ncԷ=A[(:v=CxK @G Fv;ݴaC 6ٵJi'YE;d `+T2M Ik{)JFApsR.D(7CR6o,e݉:SRimk?/'*m–K'       Gؒ>O&ec/y A_'Y'o!mm} =J}rU-xw_euA}R?T)XI [._Z_;   ] |U~}o k-w}իW{m`@Xv)7{y2eʨbŊQZnz3]%h-\x. +uQr@@@@ n~Uz?'HI\"'5l7 &;òNw*MM]Adl0K}렜b߻wXzMbԋ]lmz Z:Ig%w1RM—Y|4Ͻ,Z5{4`r&Mfl1wdbY L\Ϛw3Q{JĿ):ԟn]/5܉T‡ 0iC-()l@--6A;(hkkNO //n_ɓ @YAά@ lLvO?I3gJ̵n   Iʕ%zy  X7[M0n,X[Pq{Wti(Q"]{7ڼxK@@ 2I*O@@@@r*m4eD&{?VԲ\9oS&HQ=Zn´t]?^7O:Lqcw&N$\l&?֗_̑,8=/jTW[׏|ն4tёˋ=#d]Nŋ8)^ ^rŎc,X}%F)e| bn-)q4uߞ魷ZO 56IPWzsի>+S!;@TjY0-;IB ؠ`=#g[%UZF^X5g;Y 3#%kԎYA@@@@@@@uɓm('{=mi9G5KjZ: FRՎ!@ 8R u'HG5   @ *{Kƺ~mN< M+N}@@@@\4}tRٲR~^6lƍ9KЄ{w[zi$.Z~FqY& 7(id ޻AC$=lpgO Li XpW^*U:ܐ@"wC~KmL+6ر҃Ad͞Yҥ҉'5v, H ['Vrq:B!x&dZc @T8dɨdE&  ޿T@@@@@@@H`i4i`ZQ11wfԴ~}bR"@&M7U'Vy   @'K:Iwg=[  lJW    L]'vD~'֡C_~N.T*V,pki%ʕ̑j;Ϛpm"'{5iF/A…%`[؊˒/`], ˥SO5#LScG:vg%[;]kTv.ߊJj8m$r"e-),   @< T7x\Rʆ @ P+M#    IÆIK5kJ=wh[H?@B[!V4m8OD3gB?rԷG̍ؾZf̐ϗ:KccdO_xA:U=oO}5 X@- \us1) *+UR DE`b~'d$@@@@@@@@ |S83k5)#͚%U&5myJԺPnV5f}ԭ*    J;3]@ >bP @@@@X 쳒M_4xPkL%:3Wэ\{Gzhc 6lʖM w@@ K/_REZ?'        G6k֭`9,J;HMH-[s+1=۟}??1,Y#  N`?M抴x U #cHB@@@o;wJO ^T)WcH.DHk~M#VD(uxOW_-Oː9֨!!M(wС!H#GJ8C~i<[ynO]Fe j߳]…Rě@֭1[ )!`r~Zz}ɾ,QvJLP릛nRʕջwDT @ dI  uݳt5xgݏ-@@@@@@@@ nEڳGz*WnJsR_x.D[GVfq+F   `ժIKI_  C AD/D@@@") IgKݺI~]z1?8uDHH"~0iuTL{QzMWsϕ;j?u^]]0AZNZ^ҩJ:J kW?QKRRѢWH{&jM(7 5YYa$DO*U)KA><>IH-v k's"2ƛ}].(H*T/,@*aTlT$3@Z` ܗk6T ]%        XgF9$ OرuI_.=DrՏ ۶UX2֔:!  #pMRR~P)9%E@ gʙB@@@F`o_bEӥ ~cm.Rɒ S} |ti~9sIGukiLϤِͥ͛LZ5?݋/JkJ6ߣFY-A?v̳Վ&M efIBȝ-^`_~n<;ӂ5h\P`jTs;OVϿXxK\믿Z@-- @ ,W.Y!  )0n? o׿۷OjPh@@@@@@@@5ݺ.(9Q ) V$ͅpIҌ;Hw!g   [C- #  GB@@@H65k!CڵzIK/nE:ĮեiSB?0Xcm el~le!Æ- @ gKN*MFYPR/.gڵƏOSRQIɂV۱5HZIWcI)S< X@ǒI?k'$@yZKek" @&]rԩԥ4t1ioˣ        @uc%Js^NOHK7$B9DbŤ ->   sc  @2 P+_]   J`f'%JI<4: ,ը$_}&G{=/Pd28@:bgGKW_-7K+JcJ͚I%KkiAvȋwzI'5C"!{tiI։Ǝ=79h,(=?C顇+y EJCmu:u L@@@(ЧTԹgO3&+@,@@(    ۷K/,sta-H*HSJ6cIe_K-ZHktP˔%͇,hj"^مJ ~zj4z,@rMJ#͜)i_3۵K} @˖ǏbM&1{^~X6%$ʫG9Uओ/5o~bErŃKUCI--dR2eԷo}=@ Nf  #_RnYgIK_}%qF"        )u"l)ufI cs"L,]xcGRVJ!*yvtSOIE$D)$   /l<رҒ%ҰaJ#jj"   @#Ա?WHwK>+m M i#*\f~YAgv@B wg~1kGկg'Mnm5>\G?/ %A|-fTb& x֦~)cyޒ^zI*S @@@@@@@@ ylWK',N=Uۜg!@6־^=1P6Δ   ~+@ !   QغU;v?5Y (aܿv 'DPqݦMR˖~׶m E+NNWJӦIS%scA.]v4zo:u׸ukC@~&v:<];k]E @ Z:DixiD;<0" +'͙OTܼ4iR̊B$K}HKHŋ߹ФzUojS"un1o1s@ Y#U@dwW/\( 9dz        +`O`WqnIKgK+KMH} =/ j@@@ .{Թwo,KB ֓!   Yؽ[:URLڵFZ 瞓Zl"m9)͘!͚5Mg}v~YgRjL2f!<80'o֯^|jKQ;`aC[jEF>@L'S@ .{RKX"ŊI.u&]|4th C$W?'@33^,WjK|_~pOO< ,:! @۟J*E. @< -v}㏥u㱴 @@@@@@@Ƚ@($u8Gv=w~IRK'$h!}AV*!e5k" F^}U1$@@@iƎ糰v @d V@@@B:~t9\i:Mb9E=zE:+ijw-_h"i&byl-[SNVH{;Mlr?.-]O{%?oKI"pԧ[$^+V,O?%^)1 MsΑnAdM[aänzlBc^@wo믥F;{ك}.[~7].{W5n8A)& 6@ݒ"! _f̐?^"]u|ԩdh        =fBu%k5s]/kaL*RGIR1@y6;5@G%Y:Vi\5γ$@X`"qP@<OB# ,=}}/V4v       ĵsɍ}O7jխ[7o0|m[(#wʕ/ڵQ@@@ X;~|~ @$I]   B`Nid?LRR2kIKO=)P_iӦSN[շoo͜)!}Թ~lB@Ibz`Auiqӥ JSM@`8jRT @@@"-wdBAr}|RڰAzs…[>H۷Wǎw|ʕr&҅J޻/U*U?S e k8/Ge~w\6oLZ?eJu&M6nn5N>Y:iKn @$lݥK/,H'HժE2Gŋ0oI"y'5~s #\W>= X@- t; @Zݨr#!ĝeԊ!X`.Ǥ'f6QK߾RѢ9-OD@@@@@@@VW/T)ŋt:#>,W'Lwع3!oG駥u, Q@@@ cJnK=Dt&7@RZyɾ@@@@ -;U h!-YOvRNR3,qOh׮:,=: SRſPM6~toc qP8-B(-5YG&-\(ҙg^,ز60W_VKk$J Y^{M5J*R$E@<n8xa(B XKNkK:IW|VM~]@]n&]sX-9NL"!e/JWR"d${dst-EH 2z.C@@@@@@@U`$zYZKF^6w>_llX^jVo;..J@@@,РԷtmQΜ@#j$A@@@XJ>fM_trMae^+Wzׯ^zIEz']2dرC<ڻ/"qbBW\O>eT辙ZbEԊnHs[Xݳ3gJ~*~qcV.{y;}i<%ιCJ1lq_vT۳˒u侎]CisyOssHFB +pt6J:$a1C;WjD¹M#G_:uhܸq9SO=Uǻ]pN?:gNH'!Mҥ_ZCxH]cv GMrzT~Q_[#~7sj׻E eWrzMXu@l̙ ݢc=66H'אHg.2$r!`aN:l]6uנk=5OE@@@@@@@ZZ]-,v2V4ƖnٲEcΝ;kɲGL6ilAI7G47,XDUJ-`_ҷJ~(=Tprי!  dO{S{fַs$kȖ @< P+_ʆ   1شIzqqc騣G;Ο/X^&j_ԪU+y䑚"G)R$ͧڤdڴiڳgOՃGmCnĉ>j1"荛WdsmpGST)5j?}4bĈ4h*ˮMn?$}n쥲H6nlڵ/P" 1G6޷o/ٸ%KyQG%   @vlK7 L>ztvpsH@@@s]/$mnן҂[')|rKfG,o:(ݝԯ__:tPYm]E+WM>@? L#)] ,x4۷oɓo?Ν;&?C\GD11C 濞 _#P׳%ebIYIxm"a?}g>^ޫ?lؽ4a=ݲA% )&nTe]C=TݺuSfdI }E$w'̃CWN|TX@IDAT:tgr^#8 ?h]LKRNlic䥀bzj{2e mVEٳgfOoq,^G;Yή]_@ _倜gqlNle6]Zh={x;v p׮Cpя,@~ѝ<\~,ᒝ#ɂBHb @@@@@@@@@lL /}*J:6Eʣ鱥sllA\nok˻ xq> -_\oX<ܫ즳PZ̙ҴiM~@@@ 6?L>rҥS?sE IF@GR}#   @ ;g)[V. I?/m uip]. \eA{=/If(u:݌f]tq-_|M]m*++6nݪ9sM6ioG`] 鼝1\paoEE@-~pfNx<y]_]o *m96Β T/ŪkS'pXn.Ɠn֮z6Mv)x_뼬Wl-Hv;gi X; Hz~A$!M ~~g)kmTJUPAwʕ+;kD@@@)`cl6-s (@@@HO?\? T)Z~g3f;ծ][\pZl`ֹqѣ;8ut=2?m߾]<͛B I,d.Y@4eٲE_o &+;v쨿K2M|ǪhѢYyzٹS"ڵKz{9/(e]MUw&?EK{nܸQ>u:E0WviW_}U5k|ǒ}]\e2x"2|;$}d{5tP,Z/w=9l0w!]I$噀,-, b͞-'!}dݚ6MؼT /#m/吏z z>u?FB`*o4i?iwɈN@jk ZpK rUt-ӿo"Y;ꫯˇ.ے&~뭷kyԩS*_]N? eق<#9r^;/xn]r XܱT>*9EɨMrJ~^@Uܭ[þvs3qD/.X.PT;gnz衇w^;olhZ]s rGgϞ^۷~y n>Ο~q8s-^ R^ ?)U.y~tw{@Z`"ݫIu:i CHo-j2O<1e Kous8onI'oʫ1OF}2f%VusciI۟׃@@@D1AnXSn9۞si @$b"c    @e҄ ~ -77 r$Jne 6Ml&(~饗t 'ujժ>#r):|X]fO(R6)"$Շv 0IׯW6mԺEK;w7޷~M=yd/. hY sMm h뉻yf.\؛[ol7>Kϯ3-Zh֭^6Q7xgie~,nf+xd&q9x]wyMoyVm+Oeu,ky_ꢜX:gew՗_~~˞[gU>~- 5~- esw}\榛o6iXCy'Q6uڷ _|~w=fдaI yS"7Mf,7R$"`j`67:uLzqmm6 ۂ[!CxmkY`m۶y@- em۶)Adԝ` E~t3D[-X eM&`ǰ{NExa; $"d֦T@:3ZC^1siZ[>k 69 k3޽wĎ9-? $~{YfyL,/ ^lAl_W\[x6 2jev. Gn.~ R W)Ϸ@GBo ysE(yw>cWt/co7{wmh(Ey]jbk-̎SkoذA6yhyʀ]C.]; فK݉u R|r/^ւu2:O]WoIhkX\bj1]cﺟ{k@@@@@@@@CrcA?n^˖-UAH+V/7㧭_ 5J`ersI]lzժUce'7Ƨr9ac+jEF}2^OnGW u}>\.]t@n   #p7˝oϝΑۇ; pI  j3BgAa(B  )dg &̟o fSuBN8?:PC svڐ`:t=| ~{,ԫW/;rl3sL.t1DŽvrnbm>c- !7{6ѣ]}nn~[\pЦMB.L/enA=nud4&NL?(+tʗ/4h;:ۆ\ xND^Ǝ=??uayYʎmNۗ~9 , u ޝ5>_7 {J]ٮwGzs9'E￐WEHrei_5vBwق%{ɒ%{~oMY03τBEav|KB XӦP⡐$ !4k^yos=t*QD)M+GSWp{Σ>9\0-oy xpP!wL =x(woJ6Sv{uY){lvð޹ *%Ϡ.^cwSO>+CիN/Oٹ sycP}]E5=CB  ~s:uqj%#k֨u + ]O-[Q͛prB%KL݄+V &qʄ㏔< 8=zz衡fܹ!ֻcs#\+ԼnPhܸPh׮G@@HPƫ$ G@@@@|,}{! m_?o}uZGO>~Y暠);Xp2Æ#[Y6f7,+9 \v&r%XX93kRtl>BPwtS@@@T_U )#rĞ @2Ois~B @@@H*{N: BNi 駟aäsW &h֭j۶mʎr&PZ 븨+lӤI/^\+V_mwGZj)۸ίm7ٞ?~\ )ΈrG:t)];og8 ҉'(̻&֑jԥԽt%iu駟V ~z}ކnAr4eرC'|>;qz{_{5omAF[l믿ɓ'^{ } ޾ի_꾽o)M${)WϞ=e_~Y.Y\}RWMl)YŊ f{ބQ(ZTj\8P3Gi,cGij}U}4|4fwNd oQ.}=C{dA-I\p.r>'V~ڷofқo]6Y_~;hh޽cXA.#%7䌖;Ԁ'|߭"#,%%Z?Ĕ]NK}T8O9ڿ!yVߒ۠/$G{ /lܢ(-l}xEgC,Ѷw'w}Mwn%!O^^_{lu6lX2GyDzR~"Yva Ql0A2_{X%@%)965biQc#hg ?ћsgǚvDA?Չ?:Dmqj֬J<U|s[D.?c֭?V oX~]/V1W`ˠWА!r%q5]'KG@@LCcRXcCFΰ @q P8Y7   Ib5OheNa=uUuEL2$KcA謌pټ.R 8L `l2Y'=,Կ`d\_(l.e-vbɯ֭[kܸq9-Z xɛɳ>Fy|g '.ǘJ.)[r?p: [`ի{5:u9眬5j&˰JnAR1KlY6l%lzm>Kt)D.:ch',Z'k$:G=߿9׮]uɶڽ}'T"KGINkIf]}ñu6% VK-۰a'U?sR١C/mu]%6xeKIAXϗ6֍rY 8CźΉXGKbw%k#yii}g~ΩߕՆQ~ٷ{l(: +^Kvnn*$k˖-˶{_Kp;5k.r ~bLezs?o:Kݻwך5kd[7o3yd>3Equ1x⭣% uHuV>X΀,b?K/x6-fn7 (mo?}嗲ΪAzٹҦM`RM‰%m:Z]˗/5=?3\0Y [=PfZ4SN.ƒ[]]$xK~.fvn\t"[%"$ {W[@) 7y_ݨ >8vM:i˺@I+Xڮv,m}O,S- %]_/hAJ2KD@@@H7W; ~2Ej@ .3@@-3B(GIPS!CBcHbN/#E . +w_i=BCٳg\P:u,U^zRJyk׮rIJz!:蠃B.i7%"r-s[ p8qbu V4*4~KP7裏=c /0dYlYl=KvmYuB5j]6kZ,:/W^޶,Y2tg\?o[kfꫯf-VZc7|s UW]܂>pCj ]r%}koéBeˆBGoW&MB.J˾p@{ ކ\7)I)iuyM n=:Ph&z<o ۶%~þܹ۬s +k"@PKB-[B JHJ͛C/+/4y7.Ըqco6c{/m.a7%͚<>|Z^Jp "9tز%P\PCYoU~Ω]iohѢE?ΗGMsijMzN;4oZ~0֯_Xbh= $r?o=A{JV܃_{w燪VZr%^ h<c^Scܬ6lСC@*`6̙駟ޜJ+9)1 Tεw%?w .kSm6mԛ85c]gذaY뎻'k,￿7… 8㌐K5KzڵgI%5ׄyR]#cLTU2   D`JT&"   $7߄Beʄ\+fco;RЎ;[,+ !!߇B+~VOLhc,ly O?nyYu P1Zx}xF$yIkwk U    CʕC+BX?U @ s|xX.$@AdSp57T&RWRS"=D(t!.R%PhʔPhߦ]f͚y%ұie̘1.fuD |ԶWhYD-0%*z2vuWC%xQA@wi KlY2 k#Sp:(~+r~)nݺyN;fo -9Q^;3C={͙3'k5s9!Keo߾ 6d-3e1%gim߶@VZyy׻}'[yK~$׊F']{lӡ;;җ/DY3\> {˩6իWdxzI$;P \.LA" X h-Cq8$+Rx392rmk7nwhRvoW{=[ {J·,-ϒ :4|q#VFjk߰zYk\xKUR%/_cWk V%!`?F)Vv=T5D@ <|l gؕ㜄@,VfBy]1»dלlס]؎Wumʦqnnǩ=v|l ?袋SNi҇3fx 츺k׮^;v6mZ{s:ϚI#`y':ᄐBk֐K<4U"   )x<@@@@+qNeݺu^޽{57~~ `c,^B#.AN~IP֡ŲJ^}"X̞=;tfS߰]zv%[1?G P1~7"Z߰>NŸ]}!W/ƃnٱXRv$Ԋ#@@@REh.]Fbs1~.U>]$Z*@[`ji]>ڵ+ڰX <4hϱ\*J%t޿~7":%4b4nR.gH'.<۲pBiFQ+!Z.v󹎆rU~}dNrA:fϚql gO/^,^5j(Ļs˘1҉'Jo>K%L7|\k~ oVcjra!E[LZ|4i"+|P p G.ydۿ\v~N%~|ԺWR_W/<4۷oի;3׬YL .`WnM8PSzIc/w *gK',w#t!Rs@ )=4`\4|Բ=yS۹۹MAoچaV^fUV-m vhֆl kqSOI{ǏID]8KC9ȵG>nFo3SRSfguώ]J*ޠF7۱Ub_uv߬4dHW   &cޏW0~. lS ͖MBx |@)M>Rp6p*;_@ Xp $Z&M:(QkWGɇE#;\g)h5?(ש;KZ=D")qM-@nw}, ǖ`kTpɨA-0r&R@ C\N/Ɇ S.(wԙc+ fiõmGwϴkx_|1>+a qgɮq4vXuKxY(@xB.!/PHv'ƌyԷԸqr@@@Uo@@@@ /p~ҵJ7ݔrq]7,:k3j~Q:X7 $lլ(O.P[ꫥ%' sV   @,ѨQҜ9R^G2O ,|@@@@ '/hYJ$rԽTfN*鿹:tЊ+\bXC9Du)C~-VJ4sLVw'ܧzKCO䓥?N8a<>U"Kؿ!G]w=U)ߪkr5ZlyGڰO i-_q* l,_}%ri~QKvs%H#GJ\܉}vm7/iM|Hlh l޼ {WlK/{{v[ 6c9HZ%Ӳs =Xʛ@G,ϝ+n?h6lh# 8>. k-~k_.$i ,>MITg~Z$mH-j"@@@@@@@@ B!Ͽ7WsӵQ*QcK6VZGޟe&ѱcG/_>7l}ēOJG!}Ըq@@@ҥKuKR.UWti0ϥGɆ @ P+>0   @ ,\L1^R߾g7p6''pfϞ-.բf9FR$SbD^}Ui] K→[n{c̽e)RVӂ~IMt׉Įw@T/i.kT  mIyVBBoݼ (]KT\s;_w'l(tS-j~xߺ9DN*Esׯދ˲azntؔwQcIƍ\N`_o'YRtT@@@@@@@H੧ɓO?\w<%Ԛ?>J eʔQժjՙZO]}u֝jk;w5jj.n* &]\l O/*r@@@rQ}tVڰr5_`\Fl< U#   )?,Y%KeC]w{N.yNj)N6mZjU:]Fb?hQG||M;FQZ`ZKuCqDT%fِpq]o7bPkԩnZ/_Au4Ҏ;6vi2rF:j^X @ dчKh"~?"N%>Q@W\q,1L'꯿ГOS^1] CsO+4i,ɫ% o|͘1 >q\2E8K~K,q .Pǎ) )!` 6Uk CaI+мGjL2$iH\+v}}\]餓$ۇ        %_rCbԲeVoFJ@Ν]܈ܹ~l^kNZ VfOƑWJjБGnvIKLY˝~K-tgv35mZō=D]|Ö XJ:,W ~B-B2D@@@0jo5k&kӦկ_a{@ bo@@@Xy;r}Kg' xy:=ԡ ~  츣4}zo|[2U [>  Zn(vQ}۷KLxz-.FޞvCuC{.}WNНw6rI_|!xHI\JrerkNJJQHਣ_߸Uzfo-JJRLdɒӧϟ.@ \ZiԨjLd ;%.s{_jN) ))`5}&nէ qغOճTteRz4k+qc8W#       DDKo- *ק;,LLA.CڤIkں8+ =H nU.͛Fx&ȍ+R@@@ -I6izg˅^oD@ f$Ԋ% B@@@ s>Xb 'HK%VK"!Sd–]:O 6Ww׫vUW}yf~#OkR@JժIcD৥JrtWꩧԌiZnK3%zFC+W.o%!V?8Vx!裥m-Y԰!, MtҺk]RuqhNjܸ`N.) 7;w}6mwǖiӱU:meUi5Y @b?v^ֆ sHKuʵHKm?$Y c@@@@@@@@xV.TË5~ʕѣtMJ.t3.o,9-Ə_6 iŦ   *гgO7ƩtDk6H&gAM@@@H)u Ҟ{J&rS]7 USjl\{m"w_["p=-Ej0}(s1 찃tşP+PZl.Bqj„rwGjJ\YI>ol^C l(?-H"%C`w;D~þyO7F^F" ԫWO/Lwunl_H{FoQEgܛ'M}5i^ԵkWg#&Rrt[@IDATel @A,Y˙-MQ%77O6M]De.@@@@@@@@!p%xͻYf 8KU4KBdHsΝc5̑lN;%K    9Zd鳬  @Z1@d   d~¤4yF:髯o^r1)&` Ԟ|RzJ x67!% X6hߟL:4oQԬԯ\"i*w$KKQ~Ji ,Y';V.)tu^c@ ttVZvڬ6mŋthv?\O?=7ᎁrI}q'mkc=d~ڮ]l}gTRzꩧb` P,P먣eլ@ ֯F;N.\ysiDۤ T@@@@@@@@ K`'hf޽MJt1'/֖-ilT~UR ҥ ~ ~.@@@Hb%K꥗FOU['iԨI\[ $JOC@@@kJÆԑ,%Ԛ0AN^*jx{ l$wg:̙TlSdpHE #,ArD]'OXOغT;O>6oN-J-[ f kE ʔ):X__%V^{--@ J߳:K 5\ҥ}Ԡ/M$+'jz<.89v  @J l෹}tJoG(ԫTr5{|~Zj޿QE3;        @,…J{K;ye,>iZ_KSq?cm$vt|>{!aCyckyD+?K@@@H@ \̵1n "7~%ke l/@BM   @ ҩJ5k 8*U^~5ttRIZ2rҏ?J=$@i ZUQ}_JZYE X-Kb・ .;n\)}tR*K':X;iH^&'uSi=@ oR)H_,9++;i@ljh%:?0|̙3uj: ށ tSH61x>>*A &O)ժ%p5.ɮX!#u'Y$        @Rb@2uѬYSն!#ռ k;Vw_kΓϗs@   @f 4h@/<!  P .tV   @2 XP>;qY-KҐ!ҪUҫJ',-Ndj[f_…~o#kJ dCHbu6.45nεzCĵլOw},]ج{ѣZ_}lR@]ڗ4vۭثB@$WN㏥i*'UX@@@@@@@@ |~*Ubh"˗w(^Yg]yzq7觟B)R{Y31՝; ?.EY*E@@@ N<(]p[];ٲ*i|v @H3J   @j ̚%]s##3K sΑ*VLmֱ7[7ys?JT ^SG 1eʔз>ѨQ-`d·Ԅd%$eKI6GK>(Y'ڶlut뭒%aKν{~p5@ v^bK-Z ~, zz*]m]ziC7wz8f`gZ =D׎@~pi -@s矗~QZ@2DㅡCv[G)YIbH`dn+`!:HڼYEO?k\ ?>Odsyf[@J( {s>xKz6l .x]PחKQï]s%,1%<_9rKp;o@WP?GU`j?G'k ]J7J呵[-[Nwqi}' (?ΝK.5mi*l/        Gi ll#6Q \sMx׏lpM"J~oE&&\#5j$}4zM2C@@@ aÆ59K//|dq{/a`E (@B d@@@HA}-Ŵi?HL:7KeAǟפW:0ek_:å+_̙ҾnľLA w2e$lI(%3G ӎ%}T[W.ԾdނN_R_'Zv%ٴyWJOev.?@ m~[XKFNAo?ircR~sWKhz@I驧cQY;}IZ65        @ |*5l(r~<5]+I'ӌUzuT+=nc&>Z:\)OTƀ ,ٸiIW[$0B@@@*U㘎'8 Aۇ{Y**@2BdFl%   @ l(ԥTd|ԑzKZBzC3η֭f߲E%9@q X2O?|4{㎓-nt!PPK5eJAߕ9[γϖyFZXZH.dӟ}m-M7I&HvBA ,QE%W8ɩ)Rt8$?VZ- $Na:z/\q^"cXg޽TZ%JFw|ꩧQFnIAH+7G8LIc>ju2;]sfiSɒh=Զ4id߮v~Jl!        'oa֮Ԩ!{ln5@ p'Z?Ə׵iԹWW\t2b 7}rJK},@@@t/aF`c瞓l0ˠAKf , #ĉw0K= PX^З_W˻1ܹٗfǂ 嗥!CϪVcgN:TbNsl? /tɠWTlg`  @ @ns) TS89w?:S[%  5n,dחMۂ'ـG񯍖,I@@@@@@@@@Jm^-5j$ 5!ԪUYxOvN8AzEG܄`(QB>cJ ?GHKw!K@@@Hv?6xLn- @x07,@@@bsˤڵŷ.X!'%/_ c)-q9ou `qt+2Xv#PkW?%֚3g[gv\|r hJ*S^d;[х d')[mJǏ֯p46?f͒Z䓓zTsn[Dž NJ3fH-5o.}^qŶT~g \VUʶs۹%HGJϟtǞsY;yիW/y@ %ڻtISi2R`=Lݎ}wۋ3' 7N&]y| vNC%&V~$@@@@@@@hߗ6oޞ`c߾RҢEÔDln.@OzM X ŋ3(ٶ~dt,5h ͞- hIR@@@A[L%K{D{/r*@@,    @q̟/ $5j$YKuEMS?x﮻GXg|Ѷ:zV?hs0 X£gZ,uX=o#GSG ;(hAB>g:~ϡC eMH/,{dI=TzL^E ^ӵ$5\(Μ)qtqUWI6u "~~7Kv;ӷO:Iׂ,9Z5z{%c?X~k_ N:ṁ BcH$ժB 3ό<1.%s`H̦vm`ر~4KlKHm        ~'mSLo H[T?>bZRn+t%^૯v$/n^{M1@@@Y%eo~-   Vax   $jC\:x?ܹM7I{ULci'`-tbɴח>FiOJӦEnn.\Z8j:S]MiTߊ䬿,= yxW(`/ɹ-*}l~>}<-` -OBA X{Y;jɎGZZ#y[jZ5Uv0j?2٧z2mV "@B~ zKAH-nZ[%rJ"ޯdZwISo1        @A&O=&H\RХ3&{<6biȐLHm1eݻK-ZI>@[VY_j   @ z7~꒹d48 FA@ zU,@@@6l;XT‚{=LNp>~PeˤZ,R,% ,d|T^l5        & ߯*YޣJY   %`cƏ cRF&NLfk@C!9P @@@ X۷o6vf魷^*{T\]?3H#YgL :uqbWx@ XNsqn~!x ,0%e Ԫ=wA1Bj?^I\?ֲo~B6Kֶ[@z4l(}tNJWǶW5co&Lyd}j5ě6j~x˪^z~| )&kRRӦ)Vq@!gƳ69Dm7˥2eۖ-Mc;5B@@@@@@@HK'((?Rid6R!W\|-ƍ=DNy<.ǃ6n,M" '5kc   dY,?*U>IY&   VEY   Q&N_{i"ϣ&Y S /;Wxd_ZRzM[7iRiYbbF|,t%^F GߪUQƍ:w,A˖UWIcJz1mGz@@ @~m;/9Sw_w3/O%_u˖-駟nݺ9FAH9I$oOSaWv:c3τ&Y}wHgO?I֑GmwT駟ۆ-@@@@@@@@p)SŸɳK9S: h"]z76rK0(O>w-nv7OӇxEq   &PGusY+voj) R    @<[XnV,AKKH#5o.5k&Խ{ln]=E8_%#|\SHvڵ')Yb›m@/'}&ԏZ)Wf=dU?,? Npt Vעo~ɢ/%$R n۷O"@ 1v^cGKFI;Y7kA lP9q%opGj>o 6g?\ٯ%qwkDZժUSO=71 @ _j$e7#[`&vy ޾dmg%^- $-\(}5         9 Xp=zH_~{Ne:WK?`g#edOd&xBZ(<.ʕWH{]^iưׅ]>C@@@,mII* bQ@ LA@@@ o]v7f6lؠK[\ϭ\n%\ 3[)gw̺N)kirt-auβ`ާ*=tD{2[ =Dϼ2XF*c-zMjܸ{NŵۣJ#GJ?.}ւ_Ο/ &`}E kou.r/Wv6R|ZI7'huk.WOoN;"|D`D丆hclx nVe|[3REN?C퓢>   (n6k`]*UGSK.>܂u cbGnu%vHЮ"}qwζ>YR}1$/VsQl_ P\_MV>[R{YW\H\k׮dׯ϶/E,va:$a371`_}E'`WO,',RxW $ؚ4I.Ɂ]plBlY֜ fp?8Z¹dz9=i˦C7Cr~!`_ctAsIgƶR+iyo֬ `ul^Z{_mWcл;[%ͲY֦"5w{:fvf$ٲ`PjNv^hm4vyo,C!`A %nĒKJgqep]v~ɻ.\qkF}nv vMu{I6 굝е'К0oom\:xvr ^RU5jPZT^=ﯶt7e;ka%a},ԩ5]L{?m/vA[<ZۖU?>p``lB/d%g6xve鮻aUksϕ{Q%HCDs@@@x XL; q,6C!xۺl yVܒdvow'j*wKb Zvomx9=k[ nσvo XJRs9>}'VdY. `)4;RÊSUy/M>k˗/nq[?uǢdɥ#RpئYUkD قǑmYv`lPju4':Y2lQ!ծ.e͚5nֱ:5mw::6<ԯε8^O댼ݳ/WXm? YbbS:Zw~>jE~EsէFo/va{ HY őh+:ˇ+W̶/4Ӿۊ~lKpW}2w^s}.P[fj=ڴ/0] /Vlb~h-ph,%@FR-dγp?2O|ng6lY2t](̘'cɚ㎓-ٜ?D?u\b'7dN?D~_x#0{tr}US֊@A!s;y6`|ɞ%JTuO?ĝ/O'KgK,d*ӡǂNJ۹Qn7Dl"o6JSuڹip>yt(X-jc{-F> 2q͗>ڄ-#Z>9}~@_d0(;ww[N,y֏?uo>AFdU܎w$WP82m„{k?q\-`7;@) NWN/Vp{5L[]K'hQ kmsZ:j@@@@ VW$A@@@#`ɰ[}7Zp~/[?X`7lyMD[OvpӶ>EV'y>>6XQ=A| ^n]Yߝ{{キ5k=>ŏn6~>He‹}?l}]!n{ww?~XV D0"ܾc"yl,Anc76f!|=->~}ƢQ\8% K>o1_bظfc‹b^H>#_:l s8$Ԋ&B@@t8ASplǑˢ=sm/ί|lsJd -hk>>m=\l:昭YlhZn kA}fϣ=iq }ѦEƂyxJDhVǼJtX;ip8fmڤ"4ͼys|m[* Y@bXrpŕ7%7~alѢE^gA0dɒ [AD0dyG Rא7]Z,Y4{l;aիWO{챇w 4nfËDZ,!I-uw0_qX=f틶]],z~hA'}[Gh.YGQ[2$`$%3w-(Y6|_ ~.}w%lR.Y0>HDiC{lE먝iW/9Kw3m3w{]۬[&I_}%wq\[X:>vK"OH睗X>h>(Zmy7Cxt}R 5PH)=DXvAf?ZG;ks'Ws։:EtvΓ :YZەZgh𜒧wgˋ,ֱtxCA] "sNo-ۇ@l,I֬Y:JeǮV8X Tk׮mⷴޮsض,iXp:Vڇ% ngW˜zKqdK*rkV-K<U>Rǎm[AZy-@@@@ 0ۇ   ,`IOZv1V,kÆ ~>'fSyq6u>:6 D,Xy|&MZe˖-vzoVywp4~]l*(-<~D*q_D Prr>_r%ϽG["g>6n6=3ۿ>*W_YhbNBE@ĊP* +EET^Q {CE)D{.pϟ3L2s̜o?Ϝ$NvY{}C,z%V sD$@$@$@$@$,hdk>[1]x=rG1% (a}>1MYQ5>"6#3~C?|bJN4NI(dK^ jǒ1 @AS,|> "}yB߼`DrJuj*9[g\^ŝ`(}AHiw=08 pFnVۏףVZꬬr2rqj.ieT)ND^{-xp0vZs WgZa #= ޢ:hŻ@,B MQl}D=o(ײN=蠃 !#'~w"# $"Q?B Cd[mEEو x|E: {}"_/9g(v,kM.xÄ_ hakFԏˏC:8fA]C=[o_1o"H^͘H S0D?s}p[8Yh.д[Fm0f[.jy}h 1~"moB\=iůޡW-R 嗋wc@#%… wޑEҥKQ0'ke1O( _H sV` [|0Fh1юjذa9OfqK||SSĈVBxi|0kxt,ud|L\H/e~HHHHHHHHW) @YyT@n2F#(JSNo qm)WXal2]o C9D7o.-Z-[S. kcEҬu+.ug0K"6/vMF2fEVa(cU ^pck6/)eV2     ؼyY~sw}DݹD %r ;[,"Y엺{. `MׂoG=P{%ƄYbb|JKښxn@Ӈ})6aO$@$@> AT\yxr!o,Dzwa09A W8,^n P"/Kh 0a$ȠcnRg?1$t^XY|C\Kja"Fh!a(U/|d<a4 #k\7kxݠA؜l:#a\ ;[9 \ e`̊k}0>.DC0y7&l=D]sGL0#] .Bf|1Ĕ[;# Œ3IoaSС"lm&;ddcKXJ*կ__X@VL((sIJeva2f)Wi xWOȑ^Gw(9.XlTgFxܹBg5nX?L o/0fP8iժvaҶm[]w>+1m61ss?Ns_gA@kL~3&ұO֘sHHHHHHH pJ<O$@$@$@$@$@$@$@!"L6ӦM 1t}/6?XGZ7NY`,Yf#~yrG SIgfa,S/+WԵ|OuVsHT\~¼@ňvc⣏>R9\k/#bm;` PP?+I$@$@$@$@$<{] X 7+B H(Xq-}wOX[6o-H}`l1gKB#PþV 0'  ؠ *5Fu+r劘P.;a0jb'6mT?0` C6nܨ.^‰/BAlq85 3v7T@~` Cd]vEE*P5kuM % Qaw" a #DNtEg&C~08(yb ϱP¾r>: =|9VeX5k'\avɧ~{Vi^(kR)SDN?]OGܹpƒd0Ă=@|ho0VDJ*pna ",dx@`;/ 0Ix@@IDATkas3ck?X@$@$0gȡq!f:)3-իWS)s5(*A@ ԲeKiѢsCcpF1&?b uQA#0oH>bebd6̼6-!@[?{@$@$@$@$@$@$@$@ poT<HHHHHHHM6''NW^yE`?=.Ġu|`M?5ӧOWAٳg ֌D׮]51d>;~Facu>ba0C3UV> vA@Z2hԨ=lq_pmN[K$@$@$@$@$@D[!1v9RNb;nA+G_AA@W~|XQ筏D[UӏBO6 jM OlqW^\,05k  +A [`T enZj֬y(0&ȑ*3w%2hVtniee˟?e/*T`ws"s֪UK(ޑ5%Ȍ@߾bD8h|ELc3f̐qUPH :m۶:up<spo\*AO.]IO3@GND.L3Kz*e,ɑ W) b Dϫ] 2 ؔtQm#<vg„ jW;h)8O> [N׮cu);SW hl<;')rB(Z3tR]ߎ!pwТE i޼og}"W\dZ4IHHHH u`7?Zpl{ "6@8^$2+eiqKKc5ڴiSLd ܀_ +.de}->b?}ZZF@!/&IHH'6h|ø+/ZY.]ﯿZMkk׮YlR?0\pD 6c?AL;c]tG| \RN*o:Änk.1m=0~uC!)LRB87ԺpB2$m=CBR%LPE?F=ħC!C k;|ΝE&N v[ yhij67{j ec+?> x%ni00@4 VZ;b0A߱h$0 Nc؂OcC \B<蠃"֮][ſ!@$@[1"#rYsH `sGV:|{f̫A\!: ekn|=AO`%"{$rnT"+V; dF$WɌ"       f̘!=;V}*!-ǰ8G-^Xƌ#/8cuSO8e إ͚5K?p[L͂|6m*5k֤0iڠ ,X5XӺukiӦo^/yLA, L>H2f>hϱ+VXD-vS,o1ap OX -lY-D ЅxԨQCX01> @!PH("  l`&pewS+]oq f2yda/fmV? lkac>yҥKUt>;v]C$/2e0a>Qd.h_BL∨3gT#[ b>:uRǏD'ƍ'hy|ZTEL"0@` #dE|~ij,ʀVcQ"0FSb7閔f gCʎYL LYvlWpifn@g$cWZu{". ZX,WK.-xՠxOa,Ua08 W^u,믵u֕:uHzt5/W\a`iH'0lD؍-6ۉeQ#98yg)pNҳgO֭:Z~,Y"/i8Aps'k#F*f3yLx*HHHHHHH ]%iJlx< K4x nD޽{nt<> s̑zJF%sի 8PJ"/84ix7ZvaM4QQ(3W~'7o̞=[~mA_uf!9ַyRB*WVx ?~Aa>|Ac`218Mj~\K@yK~ [baw@hf͚7[V Qa[otd= Fѣ>.^XvuW9ꨣcd ` N*'Ne˖|L6MTOֹHgE"=\qaRJgW<HHHHHHH(*I HHHHHHHH @p|=DN=T9K`SHCj*5b]G 񞫯ZڶmJzQtŊK/k9E?piذ!}HDB<`m;_kZn-]tN8*PP,2 @#gʕ+u=5WUV `TF ]/߫mrJ3H0@p ~gfݺuE>x-B2eTl%6ϙ:q+>l 0'  ؠ *'T`譹bl(J7߈1~CEFLw o^7H$@$@$@$@$@$@$@ 믿ʰadСj3p@s=+O7|Sn6]޾}{ۥI&H:4g_|QuWVMÏĴ#K2 G31a]_KӦMgϞe} BA^HHHH%w}7y؏_V(VZl!Er$@@׬Ycv1Mo_:_u֕C9D}ԯ__m]! `B$PCĦQSP+lŒHH|`'<< B߅tc`N}Qmܸ?=zH|3, / <|3TA({@x5ܼytYN:$ӂh  Dz-5j $D` fhB7o.a'"tXxbywTo޼yqFkaA7TRyP"fH4 21|`n0"J_駟.]t@"=f]q7.K*-ti1KaĒ C֫C @bEp饗s/\.By̽%0w\ AT\yxr!B!Ht]wz`H xp vI V[x׵.e!oEa~K_@<꠽QF2p@aDPÇg}&]v38C:t0l#(Z=S#qjHeR0ziJdj1FaĸB\ #Ȥ<$"#b=8*f;1C8 o,[L <;0] aZbK$K~`:=CڙGutIw\fi D11P"SydH0Z2^pj 4H{,E5kӹ?\瓰HHHHHHH"PUbxIHHHHHHH  6I&n+&:u:nׯ_^~r ?r)T6/ L-[oVҥo߾j{YF 3{m3     |r>*W7n4h 裔*Uʞ- @@~gւҥKUb[}-kh)l=3M>(da_ jM OlqW^\;FΞ`%/Xz);cw# O=#6mrWF/nA0ףG5l޼y"$#x@J*sO?].aÆQ2&=;<#p>9"dI s0>]cYhӥK >5H  ?1B}p aÆ`Vx( d \=m41c̞=[;ql1 4mTWZ5Kb2$@$@l2Y`~Νy?^{% @!QP+lŒHH|`'<< BxrWء*C | &<^|EOT(nРAN;&C)R3g\r%:A+ROEoUq*vǨ<3z!N;4)W\Բ@F0t7K/$]v8~YfFq:A7Z1BoJ|r̷SCQ!`sEƎ#x-b*Q] /@ڏ;89cuRl),KB$P0>C4i꫺@J**Ďg(sO@|cJv\+ۀ)@}$fIE)H%StIZGJpJTYXǑaÆ 梱v_ -[bRzump? 6J&~!      #UIHHHHHHH +:/pY%ڝf{N^zDjժ|$Jt֬Y2x`?ڡ]veRnDr 43gɓ7,tPޔZysQ    'qF8qK?թXmVX;0_lN# 'qLC0%Kk4رtIZjgz_%(d)  "   Ah\Ѽ.U!|yZ}t͊Jɞ}Y58,]c9&yH&d`8rHݻr-JqrQGYZHkrgڵkk@>W& ∅pyUW ޏA6g*T' U`A li@X ybUň=RɊB=3B3p߽{wiРAҒ =Q ٯZYn@dbwNk駟q=m%ģa@$fhU&Lm䂩@ <:WУGye]v)~ _ވ +Vѣc6o"M6 }'Ȩ^Z֬Y#7o6c[M4,â:u xȷ*$@$@$@$@$@$@$@$0h`O?->r)H'pL4I5jlnذA r'_/qf N`ѢEef *D "A    &^zI.\>Zvq.$s BOMaAA2:  Ȕ4y\kv ~ ˴iT&Û1 88!2ds=rg˝wޙS~[ ˕+Fp@%U3ΐ˗C=$zYǑCW_-ݺu{W{ IlLq5Jq^Yp lHzA8rM\_+Q?% ]"9D1bbDLd_ rÆ +WB~e˖%KI$P ʎL ~ /_^E(?l?쳘 gv~.([4lؐ>&` Vu2@"?w ?ҳgOϜ`n"[K.ŋ˼ydܹ?K*UcՅXQ       I _̫֫R DM2 Ə/GqD)mڴ4 jE0s$@$@$@$@H*_0|]|qI׮]} $@$@M>&0+﮻4O;4i޼yaӇ}8lŒHHHHH diӦlrQ;8p`VĴƍ'իW)S6m#G/<'y+QuA<CW\qEX/!lb=z7|3Eт<?p (9p;w,e]#3f~6CK2_| ^xae]wtP^8++">.xA릛n~Z8UFY11PDLyNbfŸ5\ eoLy>r\G|€CIL:UK#7Zp [n1,zů*k֬' B>cC9crKϿ뮻dWt_C9D-xys>`HFSNgyF[[|yC~.\(W]uGɲO_#~'yǥO>*7vbPu&￿Q/촓Gf %Kia ,1-ӻ= *91;3ٟtI6W(USڎAWa38CĎ>hodȐ! 46K? m[D(2=nq]Ѳ.]Oyd҂`yЇm޼:5u!eeZ$-ZObD&Čg1C7 )0QpʎEy.)Oի8Y m% "#P!8,',gXy7>ooIUPA-ޅX~=?~|C{UQ`㾃I&b*޽ @N7LU3l"jb'&yRXs| ;B`֭K;oWcѢEς2旫U¼m46mxfeIԎB3}O\w@ cXXSxD(4hB(xQ*ǜ<-#wHHHHHHHHHHHHHHJe˖=lL:ꨬMY͛7~넋kﶥ D\;3Fn'[MzWuM_,XGuu!xS GzGNc6[GkV.lg D֊[j׮-/u3X#Hv.\ϳ=D]Ghl)Ѿ\0M'ƙ⮥,rrPkժ 0@<@}Wo# 4ٛ(idY^     H8:#ՠdvj~`A-"4kLsvXibV8c34Y{T^]fS4}-00Wp<ݩS)̣pG\Y\2e駟"fY)lɧxcǎUGkp8]|`{S,a%ӡCxgU 0C_t pI\8˦A-c!Q{Ncs;~{;T1L'A+9;#=z%Kszc^̙'?[uvcw tpgZg;r2=&w*S$uqZ/FP(ȏ ѴiS "5!g=kgaN=O;|r^5GqDѥ\ABS[~{ܿoCC<0t39m]uU*,W_ tgyjt?'C[jUMJ**otupp)݀7NXyKMTx 2jM_؟nk'=,ƽ{QFzߝwy? BǸih @@2EvMs; `SN9Egd~{˶;3Gc1T߿3[nE>3}`^z1}ij s/p;ޏyO /9ھƍk[i`N.1b`!<|Rnb              (q5kvXY`߇8\`AОfgA8s!He q-r"FGOڴ#Q_>~6a:thNۋ~s#r'qHTl+孷6;\A礓N*"_Oic^-R1 qLD?|}~:>6tG5vIǴs-=Pd][yE6 zcjԨ!S0n8m~Nu^lD͛'~*ѣG 6!kӂ: ~Fz>ҹsX rJ=>`d\}*Ɏ~6rwg%l7> ?3wg xϞ=[~"-[Vz@n,6Cwi:mTw;I8/U_n'lc~4$86ng`- XӧO9s樽}Rr!@ֶ!kȖ6y۾}{曽-wL4IƏS[[/&|[:5Ⱁ #Æ :4+Cgl e`LHHHHH )z͢ħ~Z R|\/1#5JV}~-%N?*ߓɗG#Q@TmKcc#.p R_x0@I!PXKUc9IHHHHR9sL8QS\)N-!!^;VuIrҿ9SÇrW>xwq]wuYg%;v"AF2N$W^I;m4MJ3ίJ0m\B۷o,%#FP0(W:焳C r>Sk`l /0AlEwM?ƌƑ xcbofhـHƫ+{&MBK'Ux'>ދ/ z߭B]mC$'Фӭމ |0 ݨQ#UM+?x`wG^A,z@@|˸g̘!gwnG^D A6ă/]v>:>{YPCI3U͚5eȑ^pƍEJ#'OZ`!EH R?УG5~Kpt~Uf!Wed$ eʈY$ҳ!j1"E&Ɗ!L <2em3tM*Bczi>H6l(ĉ_*E36g`{%e La gŸ!Xbnݺҭ[7zUkCʅ=2Q?p1J*؂_B;J,iQ6WuWP7lؠcC|R\?Ɠ1"\{vŸxb4hN;M p/6]T T6Rr~6ju?}C{$>=oK'ox'Ks\:uW_}U0֌g%GqDl.c@Oedz"q`>*|̝` '8kq#:d~R*|b\y>ScOT_  2wm⭷ފbL1Wrueoxj;q옉l8gv䪍u,pk4ʋvBӢE '=4+H30^?ʠ,^ʨY<+hςv j2I{9:d22}%5m+)_1}EǙ93]F11:֕\dm:YީSX~ޡ^mw٩Pcµrk:;t3^glnɚw;w;A})=64TDZc;W[o8W0ΈcHOlC0GplPeC\^aӦM|O}^ySKՏ{lz5΁ˡdj?~s70"~}ɮ-~t;?F}. 1^ۉ1{ s}ƘPWX'ox⿻u ȧ1/r ʏ"YzugН͛7x 1^u (f~0/D3siwĽpBwqx` Q^ܟ ;%OX|I#^"q1nnNՆ(߹ ?evsٸ:)SA%6Y<w6K8m+̤[fZ~.;O~~+Vڵ:8y%T@IDAT.@eњO#Φme˖) <.+&     (&W)fx: @5ؒla{|j5X+njX-[8gy,\Y旉T=liS7oZlas+o^5WַkQܵ"nރs[nvW-4n8Z?@E?XG9H=yՂӓwB$@$@$@$@$zK/*[ӹ&v¹yK4~g[ٲeq>}8mڴ1Nu6AT~/IT&ZT1+W|bAE][7Ia݇Ϛ= a-J 쳆8aÆ1#ăM0іnZQ i0/q '8n1* }Fk 0nObC qaxp!(18er;f x|ٰj*.5\-Z =34I :«`"e8禛n p8:G8>~+mpVxֱUXxś.B 6@"3U:N~ Q^!CPYk@ b,[1߳?xv⋡%78uXp' f٘pO]N=w}f#~z!O~I[cM^up nG^ w}[+~C $kz}]w:^P;D m9p jys/360"xk܂Z~>?w@lkq:XH?mZ?P^8p1\ۏA_c h\,ȲJݎͺSӏ{?ovjժe HM6&~CX!$ƟSNu 'rrOW lC\aAvy9v9x ;CfNz>\cVlZ֫WO80`o^ :TaSq9 dS!2"@;W\c nӆ( d"j7) ;X6) ըQmvy LvT:i[Ѧ~Dz!lXg1패 ,7nIHHHHH!*ᔖ 7c?uȅk8}E^:vi~t1i$dװZHϏ͵o+1B^=li[q/VIB\pMV$_׭Ԃի;p`m~ٻ+96iZb    Ȉ.]̌"Isd8W\o" YGhl)>]v:Ɔl8 :,+ $bk~:i'8@l 8ouG}_Z2O>?c~aIk5Δ3_K>6k Tyßdƺd3]Ƹy3 @A0.LFb˕+X)_~]n #$FC@,^X`Xz+"[{163gq(ň8 1cQGo"/,,]TGb8P4Wd_LU51\eֺuk-1N{O!fI!رA~1bjb98#%>FoEb|W(UVcP30* p 2jԨ~Gz#Gbe]&FIHԑ7?qG.XQ#7U]{>SO0M#31\vU>RQ֬YcѼys1тh)ŭg!s 4)% |W6~߉vԯ__DF1G3Qɼ읈$?Y/~`qT]31K7/l&>ýO hGNqh}jDI.]Uu\OyA#Wu83+Ʊ~keȌO9$ges8>+SY6EH Yi%fAo7"ڷA{8$g!C ƄI BLH&L3"r"Nji{xb2bV06fDdׄ}֭m]?BIh[;6ӾW\i|[>(c1FC1FmT\YmdP+Jub#˳p~/eubK|3I7y3o{]'Gga|BЙkt.!>^wqbkl'x=s\rI1ow_'>%*ca|cFHJB7BeY,vlԝ;*0FC3jÍ!'_1^fx5I]v#I`l'>1wHwi31gر"oa$<"@cxOn8fv6m3g:.5[,&~ʗigq0蝗6@/i.\f`p}1u#} ^N@$@$@$@$@$@$@$@$@$@$@$@$@$@$@9'b" y\Ӆiw}wkmlg"qۙ=o^=U ^& }O ?ku%J֓ݓƹ\q~$;6Wnӯ\ dNk;dIό#x z'[GWBX%3~ tM8Hw+ ZL_%úk;n[q"z~ yM?켮8/zk)g/7 iy]WSHeaÆB*VAźdȡͼ;/y'    : gSID*0ϫ uYXPְ`XiۻᆱHt{QWǎp!ďi!>8ĠS|~0qgOTf=(?1īc&fV\[!`pf5kTg?p4vt!n6Wfq纜~˕LU!h"s.}6D.Btao 0`QݬݺuswLv‰/adq 02Dwy*!-[s|n]LND:W0}h?x?nɯN~U+U$C6mڨiD3N1zRN<<Kg*V1piӦL :4b3$~*Ʃ}1\@A>DTmo?ٳ26geQ?_/~W v-;/Ƒ^ڢfV9 2bڼ"{oݢQ g1%0/0S}jZ߿ANq߱^m?"yENkhm{{~wU.dmo`flim2C1Ln6]pXgAcJBr9Aauyɳ>,_\uÃDeI'xBepߟ[oU﮺*x$_tEI0F܋;xn&M 7nI{5M&`g|@^Frg^) zN? FN^pCN(RFC9"E1lf)vW[OOmf0L5߽ʂc2 ~ʗIcq uC,Qkѿt,r,fQ} }veloy+.HHHHHHHHHHHHHHI6ϰ; :Y@Ɏ?oo~ccmi7:N\? ־KHvJ=-W: ϵMjz|Sܸg!D#L4I?\̂O͢13 &яB?$D} `zWq3ؒM3>VVM}jͿai${5νmPThS3F5~◝׵M/Y|z^㏷{ݿo e v\hܸqayh(Sx WCW^is9G(_~vi,-ZhI'd}iӦVZX8r6 ;uwA] +`H/rXIo}CEl>lambeĉꬱ]v*N3v'.߬YT{9rʉD ##pZ8w0Jx♉%G:uB0d;xq, rquw)SgϞh26 g$'B<>`,:r!Oz@B>=ƽviۼeTcjǻ׭['=\xᅁgmΣ:Jm>̨~m,}{mc;"h5\)cX#9uւ)݀){AdڵqIA` BRurO>`57E0ϱO?}tӳqcDpO\1cƨPƚH+x='eyw3c]s;,ʶ+]{Tc\'l^k_~.׭ˏ+W{Nm`'5a=N?sPV8&    _bmݖ> d`$Vǖ1}[%YO+!? wqpH6O>?c^'A͕R7 u ~EG16~" L3 jZ3$@$@$@$@$@'pYgKkcJ @" veXQ7ogΜۇ/0>Chժn8}.Ry;S:FZd=\GO=TM?lР(O~W^͛u8N,j?1K/$ Pg8K.J*!% 'r4KF^zx"n}]=2Ll7ި% 3C=$giw}Gʵ^E .lO]nݺPW_-+V(.`I}W5kޝpn{-駟##0"| `ƍΒQ/mH.&{'">ꪫΘ3g\q6ɔt2~{ƴ pދyqy睧lx=V3f(@ǥ0j׮]ctX8:uj ȍoP g`Ϥ\60\ ?w}Wd6V!ebZ$/ڴ*pbڤb2ɗܧҥK3&ݯn0s=-1^v ؇{"Yvِ;k2C1 XEq?68Xׯ_N@0OP!kozkK8[[oqϹ}lx]|_{2k,7n\~LQT)[69n{@n~3     $@Dq;@ȩgϞ  mcŊF"\@@zp6j(u@۽{wun)`m۶ruw-[5jHӦM|?p.pΈZJ_}G3 )l{Ka%)A ȫqo#<¹$ _uٲ=:zg-{;[.ؾl~R1YL"wV[".\l?|}^2$Q1gRB|]L睈|!L8Q|_'SӏO?~LiF5@N[_n>W-Ps>z뭲h"@RPjU/?s8}m~wAx s*9^y(cq#a6`<X tc׬Yع$?IF[3f[eaøI 0_yy`vtm7{5n\@mf/܆WYpm7`Wi!0x8H2:-[f;6h &f塇ҹ[n%a.ڵ!oBTm-*䅁HHHHHHHHHHHHHHrEİ'FX͵[m[l,3l oF$T6v۶8:a}>+I _&ÏlIaomL3؋Ž2eOu%OeC?A<}ej~%[~Dvﰯ 3 >??N_?.B۾훡P}ϑzt'ص^n 2EfƖs >6o,XtA Au~CgLx^*p3{?6_gnPky.͔k=ʹ^[.s߷l٢u7n(sյA#n/)4 @$@$@$_~ K3}z2,J`k@ddyFwo3tɩVcD[zט;84uq̠c:ɥc;>c(\verrJݷ뮻:i|GNÆ 8wNr圾}:}qc*!F81 Ts1b |.]93#ᘁPy~t1|IޚA*K5bQ΁.AWM8rz`q!y4F|p@Sn][o2v1N@ի+oY1zzs03c gڵ 0ر2A$yN7/wmڴq|cY3|%\tg8Ycf-]$.~z/ׯ_ߙ?>h׮c&G3U]Luq9 $;eʔ8vMߦz^φ(E3{VZvۭ[7Ař3gu@uk&[Gu>0N c#\-Z8P:w""3N"Tu;> ػtC཈w8`RfM'`Oq>K,qY}̈́7$1jz3x/66v<=6 qlb" 2-A/گb"ی?rfB_Jxgb2&M8K.I]E!'e$g|rxsʎ3jTegv@sc|ÌX;~c1`ڰnyja"kG}ok@Rש苸)'/3b/4ߌFk ]{cj(ƕRϝ7pmG R*;r(nXYd}o^|c.vږ/ٸ8SPQ" TEP,k,cIGM1^@QAAA@DE,XD!`AEEfe{ww;3wnݙ3MCbžsH8t>R:TNnʐ]d/#{Ŗ3|wG8$g[vEuD>}h̻)B>?sF3r2m]/eN.'\YcHT[C2hC Wы]Z ߈={F:g\:n>htH{?qW6=_kʖW %R}rW}K/4~%Azzt}p=G[ZMeE3z ij~#P>f}9tf뼹sM*C<&3!˻QQYܾ $}]=sb{ysE\lB!ctNy4qZlH8W~}o#|PP[,^"9dGſ8/B' V%t\幬zjFQ:eu]^q eyLhد5\l. AY/>@?B%J{G!B\D 7+<7Y^ >5ccRI0M!2'CI>,kR[6[,]Y9U*]'_cC>2(6pjϖn]Kfi㍋#z]r% c{+$CEje.N~ssJHX-KCex2[^}Ie-pƌ k{V\/ŕ[_W*qT!D=\'jl6zZ05[됭L|k\!\WcJYO|ߖeǏճ۟ IFY2['tRT_Zm-P3[u>1{htrQ**_bj{2-+a'l̕y P8fRH.KT:u b*:ޫzYysmCTtoe)kTv\[K_oF=zBrdN:gE>w=׵^UECH3: ECFu)XH lIއ+r}RuQe,W;]y^XYWe+>@@@ z암9!   p;Gmx≜׬uUm =uۖ+Te~zOem*kSV>uFCj?O1Bׂi{VWԶ)Z̾.W3[[B~m#!CDm6C0\ PI7XJ!  PqLQxw!BDE_خϫ[_VRY7t?*q V4~e_Zͫ6/QQ,bUVGXٲ7WKkVVbl]cb:؝wb ݮZG}9R3C੧=B3EPZ" '@ڳ%с oyI>aveq|P_~y,  o-w_938722{-Nie&+sR{^1hР.9r+\]bnxeU>&ȭk׮yYb\hmst{xN> 1=P{ݑey`Njc!n̦ƟyuQGO>}`8~]|sMwo}Ϭ5χܤjJ0Ar%O~X V L~W#s}k\?Դ|Rù.7µ׿*$OV;o :}' ž4}Ei775Ϥ3U8D$I_|( \>СÒ$)NNزeˊfVZΌ7 '.=Ti8)!0q( Ү￟s20~2%krI|9w;vlt}СQBP>IP+s|xGaQ/Kk}aȽ@ϳQ8!ٳոqfYki|tBZ2$nE~'^bocNJ=Lp<']tPlѢt#1Cs*G!7N?I [K9?k  yXa`L=BO<1$ yXZꫯ>uz+}Oyoed.;FJK믿~T;.DCtz(#K`nWѰ+Wr`r;AbϞ=kmٙ rECS;褓N҅^|//-P\m,#T%N]v;#z%|ݑypB]{ߤ|뭷ԤI"=`tPꫯa&MVΜ$uMΕo1c qQ#?_w_~߼φxѰZ8>V\?,fXF@M+s5jR>@) 8WykH!v19 k+'rnMguVTp!cǎS<$(j19Ϥ3iVѲ&MN;M/B9Ưsuz뭧7X[֞{6mDG2 @BuR/!V$t l1bvm7.zG:jqY>{ァ޽{ B{Z/e~Mgy&Jfo&OŋG1;sν>JV.˄I@@@@@@@(y%u[~EmP"}& Q/moq^'iРA^֧}6k3?w}QDvXuUsX  E"ЫW/y/BN)n5XHJT|lf3g]B^K׫WOu{yT(SZ-Ϡ6ò:~)TzgO1]{ .N;D s(|'@XǢ@@/uB3jԽ{9o&颋$2@bۿ?(+ <Ȩ A%K駟teiذaz \6zGדȁܨjȐ!ӟQBw|E VZiBY=֣ƌo9 <'(5{qdklM-EhѢ!|׺ktGn՜}y.(wLRjzK7<_wuQ[o5gU{L BPdU\?$c;ִ]Y5݆|Rp‡S[O>hJH!oJW뮻SOe˖Q`'ԩ )/uSD}2qvmQO(&saÆY_]w­EMH]OqaA |QrFשlH?o2{yNMOFN֥KVeUy/)&"d֬YS`J  @W)MB@@@@_첋^jR6ܗS׮]5p@*ٜ2j-X@_I۱L%RY^{lu~ugkҤI:ꨣt駫UVel=J?^`˯FȮ!W\!57\렱NFn y1Ǩ~55/2+ٚ?~a]yrSBDs9GkF3B}'ԭ[n햘<Dn\@k.|9ݷ/XXL)MVA* []YL%QL"EFB |$,V:Yuā   ^7jH;\s͂[gVJS_ofpСr8bM0A|ItZ'|iW%+ӧOB+<H5W\qŬwJnMVg(h>JtwD.$+hVREE/2yY~XkY>($< Hpw="  @W)vw@@@O_{-;եK+k\3wyQBg'[n7m&;s{N8A6mZ[r H i}1J;y1r-tFI_~"#V7+  /2J2lذ(";nfNGɶq)_/U0Pm)''쿒;Qı!L|wy׮];qr˜G,%A+`'HPj($Ԫ%h @eINSYٓ:+/_b޿pXV:ӟ-\w P  .h99K/޽{sύnt*V|MX믗}:HrW/_|![ c=Vgyf7s{76tSx:Cje(h'[jYg?Y\~)I*žYXدr0Ex"5(+\w+Tb NR3DyE A{ݻGA4hPd@>=:GsF f@IDAT%sa֬Y5jT4I}]o9 N"Āsm[#Mdby| {wN\W ϟ*\o^f͚i뭷2M:A/9    P@1Wl   d[!1!C3矯UW]5ۋa~yp `<4rt8 OkRbZ.9~կ_(Ď;bJ*TyIy)|'u矏3{~:uZEXa@@p]~}QT6H;wƎ;FYׯ_B2ȿc{7x~Gu]tQnݴ;D1pHmVkB EqB?C5HUM0ގ @p'Wf2_:p˖z&N /nO?-ZDI=Pmᆹ1358qht%!'7߼s0{kM4I=B+#8"j$MlZ7:]QraÆϠNwwF ݠГp7 ̙3G=nzI'iՆM(t46L~HNfv̭DȾ) usI\j8)9;qo[mUԨhm6l_VA"ƌ^}U3FVx{U"wv`O?]*I({@8P߾oKRʊ!s ,I8\Hwyp 9_6 (<'Һ曣DZNyEE`_|EtkaÆ>8/9Y    !*_@@@@ gygo+AAByf̘o{D}5kesƋ->+!=Z[l%ubSȭsGj.^vб=~7wn%]w-Ƿq/f͗U ;@[Z7 D wrVD3WmjnLv]w{ѴiӢnү_?5o}ƻ^},8P?A>=MJem Go+I7o<=oõkF >hk׮KR6 Νk},0O\? VYT (apNS~.D!µK8رc7_}رclS?ǀT$?kҤIQ-7,wzKk.l^m]9fΜ%9r|߿*!2\{׿J/(  f͚/\k'G\'ː|')4 qP':-\\zjРAO':~.dyv=C_ʙ:u6`     @E@@@@;w?|vmQ . JD5_m]}պ["Dټk 5s~gEIq26l3>k[o=?VSq&wq}Q\8Q\RUP;oG@@o?@O8QzZ:Ve۶m\n:6mZ@`U@駟4yd :6k⣏>Khp-ԯ_p @b)+į޻ VVZEXY@$ $9N[UF(%=I>2)a9O߾}J jCAXyzDŜ栃2zk}x =#QVXA;st:q7`eJo_ C wp8@>@2ɃL>Cѱok[سgOI.>e+ )SDǡ}V^޽{˿BFkM6FVjJ$Vc P[A駟?FƏO.\~z '#}6KTmmrBUxw~ה@LBi@&;YC*сH7\W;w)HNO>d,O>F9G7jҤIfUhtP1'i׮]0dW_}%s678>D|ͣǢԧܔ_~kX7n\T#s=YfYxՉ &Łwa%Ǣ+[n/W, 9rc>:8E7/~[u[n)]3W\?J'Cy2< Sz|4btW($ .ݥ?(wʜ8q|ht ȝMDֺuhnJGG(ifϞ5v{Xd{[lE4ر7olJ@ ̟/mBcf u%@q=[gr!:ղej̉mz!͜9S;cDkjaw0VXX@@@(0RR`   $TAj=jذ:(ߟ>ݖ駟d9΄*y:ã~9Y C:g'8f-\0޽{P \8Xo qUy4(sv-F_{\hXt#4ܹcqdV+YC~Az}_w}}ǡ9O- υC/!ly֭[nݺK(G`Μ9;v^|{;=tiob.]w"/O< AqF  p pPSA>>*~µtI')HOsʔ)rb-=L4)9wXSNtݸ&ȣ@h" Ps*jc?\jo^]vj۶ipk|@^PH%o{0[o~ |~Pk6|5pȝ;hx    $^$~R@@@@ȫ$vm_=M}ev͝;7+q 'w׏6xϟQFiĈ>|x}Էb mv͛7a% 6t_+D__~y9K+VZiIZ%)(   8Σ|GKF'4WW[ldk[/I@S.3/ @\U'8cƌjK~=5j% e<6i$~S*Jme 2@r!;*yҁVn5w , <:?Mjmc9hʐ%7WՉBxtW_}U_V]uhٳgԉCVXab+^׍w8ǡFjmڴ\|Ǣ'o`JoMqkEo}1#Ho6:iL|:!U*Q2$.Ǣo2 DvNcѿ] so>:}:9ۚkY`Lqr\~(sPUF^?kUH%_ yX]7tɓrך7Pyt2ua˱Ȥ QF7vFnkMOӏO7v6liƍD@ ;v٥7T*/t= :|wlCdmݗGA ٳgk̘1KFc_堶n~[mr(K L6M'Nٍ?>ɲ}ڻu릮]jWK jʖ  ,E4sL}1N`d6Ngr8VfXZk) ̚5+$!|>gy1{g^/7`5h`e!pQ P#jci[ M) @ $9Nn6FY3JnN 1v(іNj*j+]ːL7ftEģU߃+Ӝ nh Sw/rt,:I9Ez"k7C'm_~Μ J 7NcSϏy;C>6#ox;ȼoFM[lM6Du™K |K~},N0!:6b5ֈ;随E[OJ餓 *p |qP, ftiSOI{- |+OV"s_'έ:HDV^y(h7ML#Jy\7n ]'*Nz7ht'x(dŖCaP T:)䓥+𭼈K.ۺj&͙sV\qŨG^eU*#/gCIET_ԨQdn2~{CX@@@@.@2C@@@@wN&3h =!(anr-^~9ܹs5|p 6,Jb6n>VmNᅬ⹸ϺGHð:;cvԦM(r'XyM4IN8c_c#CJZ    P_4qqiӦQ"m_;vYSi`@pܕyECu4~,]X/'K☳ @v֬8ևZűXK@Hr|\ċI>ٿ+߅];~18+f}L&C |7^غu71Q{ۨK9|>=FQí*:踘{?_9RQ1@~_OZ3~( "h瞓N=5uns9(Otkp .:kN'OrM;P'wC1!k)E'}>nO9sDq6l8![DY}>Ek,*_-~J!B d{@, Rπ I5I+zEƟ #G:<-]W@tSr՟矗}W{Nh;F;i5֨y'    ' "   @ СC5dȐ(;=q-gW{|gQ1cDNw}աCg«Up]Ǐhk'Pr)ۗ;{>~ܷ@ ~?I}O̙Qdݱ |̹͢;u V6  p~eqRxjPIu7n>cg-]d_`Ahzщ> +%KO*8ўˀ@ 8$K:b[X_jv`-@'  !I5,I>ٿmpO7rO shnFX7hhp @ Jes_O9M:5?cyt*?t\޺u۰mW_5Qf? u|.W-EǡޮqjdM\`INuC?vGPNa6k.jؾ}+e~!oac UǙ|,0>"kw :XqqccwJȺq詏Eo$ _~ {٩dI*e), k{T6չ~p %\}+[#9p5 7H]$+ꫥ"  \׹.?~ѴI0cY>3:i<̪?(n8w%}Nǯj66kw[O͛7@i):WHD5E\ h@gO%r^cǎ+oP"NK p{/ c÷z+zw]AnC3    @a _k   pvK9r^xᅨ͏ tY]t[o%)rRv;ƍFwh3GsR%rx2eJhmg=D\^*Z 8iO6m}AQv'NGtbT$\k$*ۅg@@@ ??S'=k~}؝'}p\'lhtz X'eAsq-rL*0aԱBc)T[2,   $'ɅW1͓\ŴrI>ٿϸ &O,7rr8Y{p+~DI)@ԁE=8sݕK\a`cq`b' qbOݰ\Y8aGWǃ/>c AO?QNר\|,ǡE~݃8>]QKʷM`y֬Y;D>xɃ~,ǡKVn^ X4XxXmՖn>>|ۿQMXoH\b?]{XsXlժՒDoR0_VPZ- +r%[|suPyȟ@859wuo[;};:v2uC/i_G ?ƏYqF6srF㸁1T)'G裥p&?[@8SOh p%Dk_/{w^uQI&)?ިQl|_Sr&y>I:Y|dDchU@ 'yϠl   UJg[SR@@@(|'r W_}5J/QB@mF<~n~hݾSvN.qmQN˅UKk ;vcq,'f66n]wu!᩷zaZ nI0t]Ocz0f`NOv6  V,  Ծc˚o|Y#@NZ ~ ~-~®ʵ/X"gq_LO0/qҬiz=L >Gܗ1$ueMNJLC:8. }Yj-A@ IN%jsde||d)s;}(\ĉ.$ B?qfv8@nzl\A[~稁+P-+< 㩃 4eY Hc˖-3x8k90ch\+b("gq1N1^b9XAO=B^|S)7ҏX#1詿|,\hђ"O|zqcƥKJ򁏳8ZF0Nl`>3}#bYźx7sӏC=5}W|,JUh+_{trY!t%($`Ϻ 0 ?3|KvcSc!g<|*QCϲX Iy4t^7rtLYӸd2sƐq-Oݩu6qǸ^׎j|^e$C3ΐ|R7eB| (^R^$Z{psQߋs)'J}_.|_{/ɼ{p2ly||#O{ٮwnqr1z@@@@ WIꖥ\    c~SN2n mĝ|h 6X2x>NJ~~>g( c{p{֭[GIڅ۷o x_1cƒ1nǕ)=~ޏݏC"}m+fo8'qsqkc3wM\}}SjGZR@@@.k[cӟw=G!ǃM/<ƏX Ð9.*~Ώg?f>>ume.?&~C=vxtI8}}+>euW$o~!eqTes)KTNM]OXZS@,@4޸Fwʰ Ё+E9$߅Kl֬YQB 'ňG7(L]FK ָ24+SǙ׭[7dxeuF+GWeʼbٯ5x]g'4ǦMF ռ޹Bݦ^z)\ˁB;/moɵ60WKf)nQ_oYǢyeqWѱ*^feǡ_w%yqeq寿&\n.Ep#~,h|zꆎnȀ@M{ >8H:҃k 7]h7|e{sUEU9ļ*ǡ櫏ɲnW[O}LM1/`ˡ]&NT忏W(T P JS W:l:TR<({)NֈqgfkL?7uHfM?kiϻ!_<'q|:q'\Y\Ҿ7{NG @@@(5    5u%ɩNپlj<[43ۉm6~mm3Gqێ}n[l$؆!yv<~C Mۨʼn8Rn+ne n:nǓS-[z.>~{HӐ8cǁBܷ=q?O}3\6n{cMĉDdr3@ o,ubM@@@b8 ~캁Y8Ư:FJ; ~O|ō0>ǍFO=?8teϏBM81cN=u< /H={fgBзԎ@.KԺKݻβYJ #[tNWS?w,kx03TSQǏ-}~}iY'SmۅF P^ҭǾq#Ѹ1iyǏq#i|mXu6ucg@H 81;xﱇt} @,Ri  J@myfy`q'${]YS#J<^>~8 8G?     {A@@@ :_|񅜌(:AڻMOf{?l+e&fSNs?viҤIˉ}y=phޯX-}<6l}+ݧ" ?"q2gw_w8Dg&ǒ#~G1%W£PnoMB~9  $W!=.C e׳'s8^Cu\\i?ʊz>Az"J VQ-:#~OX?88Dfrcz<?.׳,X@=^ùf[NPH:ԣ%@BЏ8Շ{]\Ze TC wȷҁ+ZJ]]7#P@h%xPuB8Kߒk5kVxXԷ[ȑFrwKFImTydB m &{%@@@>PgM%JeG;B!@ L"u&o/ XD!(6/ҠAXHuW)`@@@@@ ܯ&`@@@@7+E*@B"p6   $}t]ҿ%M*#vN pxii=%ǦoذܷB%W:/#   @֕vEili`iM /7OxTFSD3ϒ Pk$Ӫ5^ТEGH H\SEa@@ g$7xMuksol0  >zL%} i6_~Y:}vn2(w{SIUD@@@@@@@@@@@@@"__:d%uv^R~H j"@^|QjӆdZB+$*@@@ȇ +H}HܓJ5hԢtRfޚ.cT&*pZIN5eJeu/@2obY.F~XI@@&M.\7nMR  P(| !4lu:]XX0,RvI^ر矧wM=J@@@@@@@@@@@@@@,칧4j4aǧb:ݜ9Y.sE8;gIZ* 5)    @bVZIcR=&5n,qԴK_~"S83Ϥ*wQ:5! V"7kN 5`t%7K;d@(J󟥏>f͒nUm7i͓.LSixm,@@@@@@@@@@@@@@ ]iSK3[7NAK2DZ8XzIilMe ?(qci・>'gT*ZwRY*o@ $9qbdZ;$u"sr)A@r.k R 6XZiœ/  @ < O>Yb;SKb'L`bפsϕڴ6LTG';W8P:0i5Vx             ck*ֻJ; ~Լt9̙%@(r wB>} z    PW?\2$\릛 R^[o? ,@F҈R:ZNƀ@H/[ĉdZ;KO4 69D?>eT$Aq,Zٚ$ʎ#sA@@@`\S:(i0i,/HH+Xe  @h!=˩zըQFz̿X.T:쳥-֒  @a lM*hj%ެ ĉs}s{VYp֏5A"_^|Q_RI6,OKaC魷R:XֹJzaCƍݥ3\L_?~Ҳ              p[TROoq՗^LGSqvܱfӿ P7 !   P͛K.'M&uV*;KMJ' %-ZT<:nJ5cԧw9X,y'شi Z#C72>XvTѣ#x" Jvƥ@IDATT^T=˜\3mrXf E(0~KW^))lYaKFcF#Dä3sϕ&ON%*[7Na              YX}u3S><S'˜+Z#խ[[x$Ԫ&oG@@@ >'Ԛ2E󟥱c=fͤSN^zIZ8 6ZF+-XPKe"'Ӛ9 C:ӵr˕J)g :vV[-HK*~! d]`3TsgiSOnj! {Nް;i)YAX ,\( _7XjZ yssSDvMA@@@@@@@@@@@@@@jQNT̖W^eXHzU:v5y3WHFT\zn7G@@@@@@@@@@@@@JVET2O?2ϥukH=.Y @ON,ϸgGw(>   p/N8Q: iT7=WrK*Z"U$C7dZFI/x{p G%+@W_r"HNU@(]w\pҳJZ~mE@j|t챒k.\('~԰a5f[Ȳ_J>(zԸK]H'x~?B& І9@@@@@@@@@@@@@@K'#;h`RҝwJ?XqJXW><rTtj"   P NtKK *74zҤR5Q6L=Z:_j:G>_Jɴ6pzvaZ{K!0yvҥJ"=t*mo)@@X>j8S 7 9M7qXUB@`^T̡C^~9}fȇ ɱ#U*?Q9S:lwiӤ&M.֍7o[UɴjG@@@@@@@@@@@@@@r,8.{!)M(m?I-ZH\ ͞`$PIڵ:sH @@@H+nJ>]zO鮻mS01t}Vz9C_-*a ^vI#-*JekV{9K$ƍKuG<ԢEIRPh@@ qksTNV5*qE@ $Vˉ$'(:TsϕV^9Ŧ`${C"7?\>]:TiDiL;~VK?O?_@bU@@@@@@@@@@@@@@@&K~*x4~|*nN;.^\nJI`@I=J]{e%VY$@@@JN`n!xpHkWV~Kv =zHO>)b%*c%Ӛ0aF38#<.'iNz},SL@@Zx@zu~}gOi]7(1 @ tRұJzISe6jTDaUR/R9i9aVcI)-K#m{\W_}^3f=#e#    {Sqm().JB(J!P@@IK{hןd$ $[4hD%Bݷq<kyι/:         @ .,u,}4qTijդMbk4lx%E l[I/@t@@@F!,(g+INxB:Hn]_4sҜlV+K\CVnj׾´=N8A7έ\=2jU2aW¸L  -`c 60e~tR۶O?w $m ~S'{K*ROhk, l"M,v*[^Cd%KC /RJR3Hbm%p9қoJ/,]m5'Z2ѣu7^Ys |Tt R^} DŽ  Xg)}[?H5jH;Kw'~@o@K`&駥*UnݤAZÆI+GW[iM|IǶϵh!,鿋z]aCɮSc1d{wh͛Wsѱ1              1-`?}9_~;|tҥJV D4Rh<je/KG@@@4,8 hZ% isT/r8x.Et w4rD8 ]ʐ@jaZg\_ҥu%dhСt}cwo`F@֭y^L>Y5g)  wTt]H JCsdDF:u)U.=tRKe[gd3g駟*n+W.#/g^@@@@@@@@@@@@@@b^CV;知u7ߔv.2$?ҫJ_/ɓ2s"   @ XʹJÇKWKcJeJ&WP:,_psmK. /^{M0@j9´6n U=T@kkqe#4kR9V  yݙ_.SUH/mY āuꃴ ,aF*AB 4yԻTTte}]HsH6fԹo6mƍkĉ*Q.!              VCi\it[v$ҷ~}w ._ArW_ٙi?O8^   +PԺ/zmGJzʔ9Gz%iݺmK$C+nA:L%Viھ}In& 0E{@t@@ CvV>B*W'`Y d^ ?7j'>K0C:XB WOHMH,}4nT4vv4kt|25d]|źꪫ\8.\8 e               ĉ@oK?,t}R fEqI^7I]&(x(2J   %P\BkY=֭taҹJ*_]-N>]7|U+OeǏG>(^~X'{ֱ=%'Lkǎ0~VQu/Sn7nX-[Ky _{0~O%  @S:wAG?c\^&\`zܘչ.ܥGєc;Q@S@ 6l c6ea#-X ]wςհXXzy];T)vmO*]ZUr/_=zh)=w _)B@@@8ҪUK/IyH]p+7fg+g~7n̍Ed{ ^u (a{doz0-[7xc6ܹsϟoFv)aUKUj %*r>!  }1iB믗jԐFAY @s_SצMR{I?c;9aVY.0otRٲRRFwI_m X!!u$yTԳdmw!}rǾ#P!#KO{`'/VZ{I949j@@@@@@@@@ "qw\of:    E߆> 曥_FV6jז^{Mڶ-ڜvOZ";vK=*WdQGjc,Mwocw':K:C@XR@@@8@Cw}-m*]qTtž({4}$τ  @fʔ,R{evɼ>%s1.%E c;QB@ ^yE:4qki4ᇥ?{TF INꭷݥ}8e~gti:y;8"K[|yΓN:)ph @@@@@@@@bY rcyKv@@@@${/pզ\gRժ#G3ۿ/i!]wիgY 0w n= "BkD̀    Pt啾U>piz}{u%@E_o,kh$'$,+V/ͲYM^lY?KH֜9sd^3$NM:UA$=T @dErO=UjZ:ɂ,@Ò6#7@@2ʕ^F'խ+Me`A "h j$vdנļGv*T>XrF頃bt 6l_rJ' ?lLxL a7ٳտ_~e         Œ~@@@@ F gxCZHAz)kYHyxuVO1~~OZ.t'=>YB޳եƍ5JȾ6ؒ;7]6         @t |O#Km@@@@rW{CYyHrIC}=Mw{ՀZ3gΔ:!^z̧Ejc{1YK=)O99iFn @L lO[BAP;1#EsHᅢwn|~}jVn!|kƸF{:9X     DKmC@@@H\Qzo9_,qzpe=    =yDʟbKvT]=cׯw5-u>6lL81MբLi-|ڵk{nÚVK'6~ou'ӺXSǎ6[ [ 8 L9#b;@@ 9p'|s ֝||@ s˖A~AP/hu;u `g/&s+߫;w»򸐘])1SL '>`˖-{R3cAT{$07}A>Wrɒ%f͚z">e˖ î.]y+hH;zy( IeF6kݨޡ gJ=X .:Ms\Ur{}2e"eɵsJA0|xc{H}+i+oC+xju&M 1eٗv%:leq./_~9i ZjU}1R%mUf7r)"ZS9#ˍ Cਣw(n%, @@h h{';Y/>jРA9nذa1c;Xs9gFg _ "Og}}ͪ ϸ=Pe˖I99ifn @ |U\^ vrou砀}=wؚ5{S59ؠVp4߿Op{wܑ޿(    @ {\4@@@jz7qĜ[k6 F@@FLo + W1\IL&~mBTYGj#[d"w"V㧟~J:~HVZ۬1-#\vm:Z)8n ;)򺃇 @@@H8r夞=9sŋ;VjL*SFZiiǎqC<5j[^Пqr/Kz d&N~NH[fMkD /.KUT  .hKnPW˗/x.RŚ1cF8^1B.K۷o R׮]B %ݎܨWN}[nR|Kb{{~¥&M+iϛ|>K/oTF䘲*=Fuʛ7ou.]B+$us;^}ÇUVrxI~\똲OZppґGJw!]vd~x5   3ƍsϕ D7o۸6i'}뭷?X}fn۴lٲ:=4vl˝îիoKpfA7G5NyG_ƊNc;44,~RTtԩiIG˽HK=4U7.iӦUV"E$޿ @@@@@@@@@ 8[9[4@@@@ K>+:ldivJ5dT-7ݭ^?ƍhѢI/OhѢGZEygUZjr\0Wxꋤ&c=͛7y9CpR%Kz lUB@@@/`d7P瞓;lV:t/  g{uUn]5E?+N꫓kd?x_~lI#-gɊ$`]4h\z ㊨YW0ݗa۵k O ÷?^b#n{ԫWvv㚯mۤ /L6Gn0-[Bm8t Ν;qLdݔcBlJkqUBhB.\zgoinqdڴcʂsܧx/Fj,L 3')7:@@H;Gʝ(%}tRڒH0cL HNA"7ٸN)ϡuuYwvX-ڂןsa5h 7!i}NNnmNU1c_c4nXW/ 7&mU#zЂҬY>`mLߥ:uV'ߗaϨll֦{hs{w\xq        Ě{|Xoi/    3DگVj!=tҙgJ7$lv=7mڤ%JͬGGZEZ"V?t5h}}"KH͑Y+! \\i0    +K{K_mE*JӧK J.+G={Jg[Uڍ8Ae˖d\rlSdp4r?.fÆ a]xqBN>dرc]UXVZÀ#GGM6.,h/bEl޼YkO}J\#]r)r y/#aZ۰_~0- ))[VfY;f,,O>?詧RB\YWy6i_ǔ$}*\]Zo/U" C mie96 D@sΑ>\?KԪ%Y?YIjfYHioAX۱ zouڇcMW\qEc;ɘX֟y6vOqߗV #L+qY=&wtR+Nl,O$N60-(J MGq w?         @ pm.:7:MF@@@[l2'Y`QNrMϗU AP` &h۶m)fz֭-rZ"6Ms]A-[XNNzjrjݺuGu o9D% M qI   @ժwW'JK*Ib^ ֲn1cFK)R$|>Rq_)^NdwuWyjK#wS Һ%PvIbeʔnxO.QEޞ֭VʚڵӼy>Mw)d~TX13M;w ,Yy(K]L]yt҇Z4#wǮ-VFôɷp I M~Lكv\YQp JTU>{_ݬ\p ys)on[Rc꯿J>3#w|gI#ć^z/,   ]6a.: ӪYSAj'ɼ@<Åm\Ǟ8cylBof.]Z#FЋ/(7n H@ ,Dfz=%7ސV ȱ&(pCz-r>aC),{{I~F(>Snwrg2$|ܾ@@@@@@@@@|oٝ#   !x}{&M>~A:,:RmIKe˺Cn:I3X].L˗/Ed,mZ"JJ,) 5kVdږV#=59OΥi^}L)v *qTPt1[EVxJ9=vﺵ?aZWG l;‡w?A;  KK<,+=ljǕ3v~ovvߎO?]x.Tݦݏ}S%\->G6})/v㏗;'Ըq4    %#,`c+~9GʲU>lٸ[>C}衇vnNZ:|K3-#+vFZliW.P~l rM` i`ˍoIólx ۴@\Ìo&rwcw0yT4lor'KGK7(թ#^y~åɵnZ#Gt㔍yfbw         ޱr@@@@co}bjդg,aZ#F:>l|v ԩ6_v?:Z-HM[δi4|=CǍ3fYnr5iy:ɧHW b]GJ:wv$]QY&@ի]wW}ڴ(h MRT,]$ 1x>ٿclg -smGuTuW̛kuǏw(ԪU+pQn&.Мp-[+n4ܹsxN9_~ `l`ف+gTR0eʔpjժ˗/⋃ƴԣGgMztΝO.4+\r< :& . lc̓O>$|n֭Nj  \`^vY-SZ#wGd [uAApa_Ouu.cʖ6bĈ7+~1>kǬ+T(P lG {4~ŊbˊLÇ\]nx.(l^z KvܧXA8s ʁ @@L>#}C5dHMZ` k)\q J\p۾6c;/r8c8GqNK3<g_s{9_M}Ng G u*pkm 5*6n̕&(X4ƌ opaAfAp}A0qb_&}gaÅ  4iw}7͛#   $WIMW@@@@|oޏ݆ @ Ani   d}et2kSzj۷aGݏBV;<;0t=zc;njc%˗/ǖ66{dH3i8'T)֭eJ 7s/컉O?;j֔u9 uվoi֬6o,lw~7X{E@@@.~],@@@N9;@`n7݊S"ij@<vKOWz{x>ٿ{ߥw VtrASHVժl^qW: 5ci$n݌/Wd^ +´~gTWͅ9 JL9*dҋ/ʅJ]&uhCX  1 `Z6&ЧE`-#p#ͦ G\ZM"4~z 51te'}β-X}Qt~Bvb\TB<1o<5o܅Ε҄ TL7D@@@@ JmQ   d{g'KCL@-@@@`/kI<#UWI7(oȨ#}=یF ,    -e͞=6M… 0N;MZVZTz!_|^d-fDK.х^k p5g5drfҝwJ_.x`@@[ 8iVjF.kժPWL/vti*UғO>xOߤS%7ڵn{H͚\^;ͿN;W+5m׮SGnO:eZLMZk,w        İ{8_,uE@@@.RgaQX7@IDATMg%-^,4`dǮZU*U*|:ҝZQlv~orO@ܳg    G ҙg^S ֲ˔)S_%4_*\~;Y]MY('OW4 j+>ԩ'q㪲`3Ȫ0;vhn@jҰa /7=t9~ց  @"|;>XV$ ֲ(U(*6 ۷Kg {xqIi E ó,:WW[eYeg+84nŇguT67W jloڴiԷ"        dN3ǫ@@@@&ik^[j-vOeScƌԑkkڴaQ ֲگdR%pc/'K'V;)nʽճf@Y#.-k GL =zu~dT o ̏(sNWsnRlWu֭QVm/j[Wj'З+Z7eV@7:4kV=լLgUV;T]f_zyi#]+JʩV@@_w}_}NZ2k[";˖'I$C;hpgH NhiƇfYx]~Q1%$ <$M'8;}̅    )u]    Ue$Av 4j   9!x_N(':3pcjڵ^*tkrʫ[7kCMz>Ko:d{ se@[4KF@@@*^FNM:U֭nTi&I`j mt;Lm /3,j'\aV +VL'~&M8aҬZ>I)@VJhpt]R R۶rs?KJV4o;چ  '} 7̉j@׏%ը`z6lO1'uaZkƳkH,=teRjA>}+|oH66_Ҕ)~c!L+64D@@@@@@@@@@@@@@h\r!CW?)Tjǎʗ~xZ]J?M--k_K=-a&@    EUsW%o߾? U µNQbmt-CUby`dE82'Ppa.<_Rwf[&S0=MMW^6>ZnMZ\9oΓ'ZM{@@/HĉripK3gW?  }'7,5k&,)s4iذײ%wޭzc3h}޹Ӈ-y*WN*]Zj6VڦoIkJ}OǫT>               @4 ϟ濙 UVw3ʻwߦ-[jĈQEu:YظQ[E:Ķ珖@@@@ ʔ);w$WY.ӧRl_TѬYMԭ[7X:pPk"e6=jkz7}{_ʕ3d^oiE~'r1 +k'=qu  ijhed >` `aB~%K?LV4x;oAKL+`K|#}x|Rj 'Z$*               @,XPZ /7o{ァ#G::W'ʕD*-"E#<"]C=W0_v ,@@@Ȁ@͚5enI[nٳp?Bhƌ:&SK?U_\@%Jd`%ꂄ꥗x3uWשR%p2#@Vfﵿ& .RFEIEfzY2  dLଳ$̚%=ԼtI>X |(nƖ %_r'Je".,կ/x{^6?;, ̊g-\()xtrr'B-7nlF@@@@@@@@@@@@@@ȼ@QWm۶Ѹq4tH}U|喖:K-U2Z%,Z$+=tDi!Z'   Ĝ@]M򰫤n:Wu>`{o>!w)]c˛뫻j5P)_V֜^1aZѵ2zMWB#:vߎ@@H.p҄ r#ȝ|%U*qԾ3=sq1 њ6͇,/hYj1Ŏrf~*p,;튇^-}Uʞd'=}ao^Ԡt睒]*{}K[٢EB"Z6feߖGZZu1R D@@@@@@@@@mIO@@@@`} >[O?IK{/]H=zH+bh M@ VƎZfIŊIVDµ6 >egxc]vYk/~ 2eRy"LV<⋥NJ[´Rz=+~Jk, :t頃ŶmH`V,pFc@@@@@ J,o=ڎ   d{g'KC%ШT&ٗ#  d}YRrW௿C8]$tT^gL`b_{}HZ^9!@VN(@!ρ;~\zs||k`&@ CzM5g/{R۶gKGUss1o5DžHpc'Q.M#FH;P+ȵ&ȊmEHӦ "L+GÕX0Y̙a}{nݜkkB@@ظQ2DWZV#ز3ϔfH;TxN;-{@@ "y³fϖ֯'Zp]dTB"j{m J,X ŶM+ Ͳ@@@@@*1    {s @5,@@@ m6bضM3FOK_҂,`ڮѿ [~]@oo"ɉ3   $@ٲ 7ҥ~u(ysC /a=%C| NջNSVMUP͟+ 5I _uPyz);+Zk'?ZVR&ʕ~*,;}oCNŞؼnq>6sgV@@[ˀGi0'oM:n}Vj)SF:9 ~uo*Tۓzhw*}|HV$4+rhfyJG!{͇hYp1!         @b pwbnwz    vM^YS2kֺ2[}.]%Q&ٿ<Ī=ZpJ.n@B8͜\mۖuacy);LP2ĎiZ|yi; X+ZT:(cZieݖowq8iT\t%RfRY.  -`!2#GJO>)͛?S~dLX^:P買7K>gy rJswgY1ZN*V̩VVY H,^ic_U, ϊ\…w_@@@@@Q߫$V    8{6<d@FR͚YD   ۻ ƇҀҋ/J;vHW]%x=^qФ4lX'{?;G@@@@'pm…µ}V:pMU'OsqF9u,=О#+xx_?? o aZ\[ָqҘ1KhmK-[JEdf@@U>[t/&HO{qq9EXh}dTơ4nUq#Țuv~fYPV% = G;c ]mogL          @VpwV( @@@@C"znA7Nڦg)ժR)jd-y iפCݿe P+Y    sժI/}'l0R%m[S'c]۶)oތ6~qw}͊.\(/go-P͛FڻОZ;V:qa_}U:\X=_#   @V r/HO=%xo]'|駒}v<-Rdˣ͂{7e,,+S>=Ȝϝ+}Xxֲe>ނօJuJ/(,#bc,emR5VTa˳          ,@@@@`/:~jbuk./;ev5X=Ν-sf%sy7en@B`ti_aìX"ˈAVю;&ևD7`- ZH\Yj·kժv;'LZLcH6;xԭ[ȗO:D_7ccMrnJӧKi/-XTzmBf͒Y]}τ  䖀/=}ԵtMR)[d'cYt<>>/rxס7ӯq'aN в<혲bEN.Q?ǿY+`W'͊ܶlꨣegŬm%KC@@@@@ {@@@@ pTx F5fy,@@@KKU`rΓ|9ifɎ=5ѯn?kFGhEjS{@@@@؛(G|ѣ_}Wkr{F,ʂ;綢2u싅?Fݹs-۱ Akڠzڞ7/ۻ/ |iYqh+2|yR^RfR‰&B@@@ Z;iP_?i}{[ VKIA{gRÆb'kYI'K[.W_ܹ].Kofu+DtԗdzX{'ˊܶ`3lJuuUs/          ]]ۃ     2kcY\9_W_~ZziS馛|Jw”u_~)+ LV֩f~cր   ĵOH~*YְaR>RR$\Z5ϰu4vdaT6Y#v4hԵ,-XUkw#l=$}Qn:߲Ez]&#.ud6eEm`bZsKI $W6   ]ŋK7,pzI|ݲTdymm޾]?___:U`x,\D BlP/R ظ_gY֯ylvmK}(._>빗q\;2 AecT] Ͳx x          {{@@@@`/EY^ XmkF0AOj\:XgOcGHXUj^}Ԡ}-Ep@@@@z$I|õ}V>}!H6Z_$Xqgϖ & ֲv/K/XnaJ6YAIy|gʶ[p+[ߎ:$vH O&,_[ /HꋭT   |WHC->&/>ӧK*$6>n[g< ΄@" 87 в6.bSr>Z&H#|tRRf~@3rZ<DTTL!!"2ϳf׽)dL!C2"3QF&snݞNgs>w^}a=:ٶ⫓-@ @ @ .&{͙3ŷύC"wlҤ^hg&פI` ̩ lZjs-n-6gN(ZEZR5;D R3"/ ӹs~SLqo.hQ>A} 6/{]MP~T~{S]|'V?!@ @ r;&t;ݰ$nrfcǚ=YEӵ>e…jY䔺BD:倝mV{A85DD:X2,#OLdq<8k|a[EuNc+v~Lɻ~! ::C{KC^SEmFKnK f[lavE vs, @ !EBa~w>knӫ˚W*_˼y|okN <^NOrCT21+$e1/-nE<<ŵ֜;Q+gLcQ?9gͩ׍5r_EKcg4 믿iR(ghVX{={e֡YNE giq~hӦ-Ң=k꿑a8v3;mhnm.9BBB @ @ @ @ 2$ fdw[>Z'.!Zl|Ð-mv'?g-?}mkXb5Dԗ׉։׸u<ۢ1X'ⰵb< @ @N@ &]g.dHD+6mqd3 9͚͜}gb)?oN Gl6mX۶mK.֭[7j|Npk"=4f7l]z) dGfla뮩s{'f̘jKLǒ}<=ZBhѷ }EYp DrKk߾mvֽ{wx㍝@u[JJKĕtt P 4s¦6zY2( v[TQ/5Æ ,)J%.s)vZɊpX˹88~_,Fְ3(i)O)˷VT,q8~-C>.ĵ DT2ng\kmD2kEZ3LL %ufӡ? @ʏ|e7 Dcd|W=~~;,ymN~tךgtbö!ALkͻ֚Gys3!RNdZy֢E p <<󗀼$f_|zWl7EΌ p6crtݬȊ $%Q$ XC @ @rGxܱ&@ @*//EcâxkJ/(?w֩|u<>:p΅xږG) d0W|uN>A,~-?x_q_k__ɊJXKZ['n<\+[@ӬcG!C @ @*9s{gK*AgA7؍7+UIgSI O^GmI/t1|wJLg=^zo{RqȞ~֯9Z43{y3^P^0g܎^6~F4F+M[w wANd߮VZ;<-s\bi.9. }74irƱ=XJ71 @@Q"B M 0kIFVIhq-  9A{˺=eqZ䓻ۊ\Ωw3jYWWujծ]jժr&[VbrM胆)M@h9y1?)x 9m9' [J.c̙luW^{Cm_ka @@$9OĴ~kmk1c[ٯpC8@9Lpƛ8GVcqǧ#,:q'98jN9i>r2_F#یD֢9w|%kmFjZlq.cr>Αh YZuXEA \նq?^$믫\IpVՕ@ @ @@N ST@ @@P|zCu:l'ȕt,.ŋ/ Uf9L?Æ f>3իgp_$<4TMfܸqky/}S;SX>IA5p P! YpBQpè^* Pde vXˁ[FPtNL-cI"N-o9{' ZNz%˼E:$[nE v!@ #b υō76/a֭Zsyđ^t+VCa-a~)/G7 lmVŖmۚ|% lN{('S_]Ŝ[l(N?ݽs-sI%ϊy3a%e'Ua @ @ P`W)p @ @@E{ԩ|j.\eZ_+:\o+q66ʙE\+:~ 1͋Lru֭-( Zip @@"}#Go^}Uo:製M+ ٷ^x{'[Ѣ"ŋ͚77:]zKwE9;C>`0`~^T+s q.ǓO>i<ӣG;쳭_~͏GF/Z  @Cw*hJW駟n'|rj]D.ŨQh#K/Ԏ9QF%YuA{*)Bܩ$g&+g(+mE%}W.;o\_9p+ٳ=9lK K@ aiݺVm]CGO xH`evVz9{m%n%@ @(O?ۄ b"Z ] F;ңAj4ʎS U0@Z;w/J,PVEV]fYϜî{,Y.gȒpV2gNQ]꙳ ZD`uꔬ|zbsEXZ/A0Kf UVXDCt) @ @ TAīTΐ!@ @D@~_~qZZ'B_}Pkb+6!)@oV,Zy:>Z-[kQCo$1l@ Uai @@^x좋.y+8SQB,˗/|ی3@D6mZeLUr:6mZvWN2渤_|~GuTAqe׿e?.t5ء<*sj9b dGw#PWU6ۑ;۷ -iR9i$r^loX%E>JENu -so٢vdM`ժU#4j}!Cx/_j/oZ $PȂ;)]ENUEta;̓ 2 g/&L[xx.luolرwU2v.k>FI-Go_(Qanݺ߲w/rq  @ Px.]j}3~mm…ְaC֭[.<#dOK -HٸvuWѣN)UeQ$L3Ty-isϢⅳEE# 1,WVDfX(?DBYa" DvXoAR @ @ @Y ^%kT\@ @#s8q?/ŖhϪUA>fSqZ$썝$IQy} PC.q[+⭕?aʔ)^hKvn)"Uȷn>7Z/\jed @RBܩB1P JJ,7wz, P$|_'$ۍ5򎟝;w6-ڑvz*4 䊀Ĵ[{XfϞm5׆:D;_+`Cbz@ @r?}QLo A iXO[<+ףe@@ ƍgN)\IPW^{^{eM6-yf]gv! 7կobvm-(rˢZ*rg1L!ܙkƊ bYZJ:f-ZlYqĵXQ @ @ @@Y ^ S? @ @XrT|xV2=n>K.~ݩS'wZyGK!P5 ,v]%駟z<\k[%׭[7wk-lAŨ!cj(A @cp 6rH˼rU":~G{U / W_`jmhֽX4Eߢjꪫ_~v}YÆ KX ZH (dUU_N:_ȿo"T@P2m9q&Ez-sFκwmnj@"0k,l?IĕH<}ymvw@ @ ̟?^y1b&B h~"̻F*5qD{7"%NJp=ok9BZaҫksIS[79m/h7̵,"!,g*X 4bVBYA0k Wgna @ @ T8U*@ @@Xt}6f--jʶ~{[u׮]If7O@ }_˷|soӦѣ_!jpMֱِ!Uc @@U% w}{1S.;jIosyn /> .R;S\n^z8ʵM}V~}{vKuZ (dQ5U9[.{]ȿo\)TE~5/GvIym 첋_kΪUV0f@ iӦ{gcǎ>j ٻ֫W/ҥ ?0 @ʚN瞳'|z-^{Y>}uO`Ŋ~^,nӧ͍9(C9*ޮfmVonDV,:#VvK_Xg6sÍ:u$բ։"YjQC~6 @ @ @@E ^"6 @ @b DQdQbBa+rժU>fRaP@J?^o^vכn/hܸq!-%u @*/ ~[ڈ#lCl~SYAlSOc=QFY5Es9حꗳ:Br @$B8%׷:{ 5 j4  @ 1˗/ A fHymy< 9rk9ꨣ|.\hOE]dM4-<@g}A}@ %)h/ǸW_} 4:p)@7%k57n wNhڴiͭz?xk.r>}If?h儫 X&3':3 ^H +ynuYj۶~jԨ}A @ @ @ @ J`ɒ%> } sO;mvuY~CeD@o_=\7|co_8 wqG۷_ڷo_FZ@ @ ƍgJ|ذaV^pN.xbk\?mʕ.Au{vI d^oܪE%'0h {M+S߁~ѣ;ֶjs49ibrB fF6sOD) fv%+a38{lBHA@_y`ĈݫW/ӧ_6hwr|.[{ `|s' @ H`ʔ)v3>j*(tGo>=- z!'0˩Xq_O>q"w}hֆ6wn5߁x-f0YӜkc57N-%Du5k޼hHVH(KkA @ @ @U*U ` @ P/?ctt}g[!mȑ~Q-[y䑆V§JIgO͆ ݧ @ ԩSxΝ]VbP>oRjժٺ.@sHK\{;lQlCT" s99; TC"[Fgyƞ}Y|pv)X޽I_6!@ +mvO?(Tn݂#@!/ﶇ~ؔlS/v'#Ե2[,QGqcs\ZȒPV`Vد_?  @ @ @*  @ %0vXש[ݿm݈w, f͚e=1fԩtIvZFtIAO @ʎD`w`&"'J<ގtUWY~lժUb [|-Z~w7oEf'O)SիgmQw{xWosP^wu^T+U|Us6tSGQʖZe˗!@Y(d!p- ]K!*A`ҥ>)ﭷj?7vwq֫W/ U `>#58 X) @@V>3 lԨQ^@Ϸ.]du/AG@ξw]uU5[(%{="Y%F  @ @ @ kīd !@ @e졇2`+衇j'pt$NB̞=ۆj>On|Gyg:t(2 dKAlIq @ E`>dHv mIغu*_|a&LwyFŶZha~׾}"ŋcǎ>Gγ>*\պΪr/W/i @ %?p v۬YG޽{#Uh@~mȐ!6sLk^M6;yϕ, @HI`ޙk׮֨Q#CL+%1N@ w*Xw x>?uֹj՚:d 3_L+ @ @ @ @ @ҥKE:;|lĵcĴxI #мys;smҤI>+ҷo_:F @ @ $rwrd"U:^{Ikr :wl't=6e יgiÇ8oʺR.@)\r%pBwT[uf /J(#Ui @ $E֦M{ꩧ{h 4ȋ1{?f袋lmBcґ4:}t;G Ut;ڵkW]3}|zO)N`c>x%.~+pvvG|`g*˗W`h @I`֩S'{mر^Hk-(JSW'tbW^yey!+u;鸜3[nm\o4mZÉM_~99=6ǎ?~WQo959k @ @ @ @ @@qÆ mڃ>hv}6hР.[JK`ѢE#؀qƾdtbK;Ɗ_8ov+@\P[O?C~2o :~kժ.ηx/zA @ B/vN=2r*{`7Y~}[rmر]z /s*rJ=uW_mZ**:nj߾}L,[6½^Oয়~k7o7ܨQ#3Y]CP # @ @ ֫W/?i7t?kՔi7ʟEr>vyH\I&!9.[{g/RQSSNA|M1Gz>;6Lpq-$]xLWw'Aׇ59|ov6a„ B @  (wvqٸq{~z-??]xq#烙 򫯾2Gb}gMLbӦM3+s[Y?g޽#;9]@߼F_*; @ @ @ @ @([sε~gm]v/>C*l T\9=(i] ,^_~e?Bc:QTHu<cϧ:W#G?#]+.+!afqNǐ6rWyLɍx\7C} @ @\|>QRˣ6J72} xjK`a&wu^<*=z1bZ 7θdέMP/'iӦv'g]s u ^:uT jU‡F!@ @Xcǎ]چn! N5j԰SF.2`nw9oO\U5"gb}XjUduonmV"SNvڕC.. U]~N|w_lP&Mء?pgϞ>>.8yC @N`v9ؓO>iW]uլYBԶm[;묳ʽ:'tR6V5ۊz@_N?l.k:uM6lhת5׎>\ 7^_ߜhB @ @ @ @ r' nݺJmˇ"}y`ri6-[ӹlcS#c };Pf#gXvmq~nNJ2J s5i @ @9&fmf{qɫKeL~u]ۼ30\jժ6(i˗T2zk;3֕POskFzű% AG}Nʋj7!^{ͦNZ&%I9\Iۈ7^ޫӧ ׻=wdv{ 4GvpWVjfuA @ ؂ O7*C?L3jO?avgoٞy,x7kZha?]prJ#?ܾkmٲe&-]Ԇ 6lc -[&E:/]d^{vܹO|@x6V䠒?n|]yCӦM}?nO=x.#~h<"C*{+$ƌc~m~<뮻ON>dc v3g{7ܮjk޼yLm;֞{9`/G{ХK_qеz̞=ۺvj߽0-uz7tw_O?}Գ￷=@mϘ1i%]q9ss1^7\i>nNf>G6qD{'|h֭J,LA(?gu]>O, T3&/bSfϒ^*F:Y]+Ao6ϫ}Kw}l՟~gŋ裏6/|ub&MdwqGk|o~{WBPqѣy_RςA @ =[ꫯ|nJTNBDzL4ݜ*NOAd72UuF?Co++M]*_<(GfqǚAs=\ %|Il/\6 7^Wܹs:;C/7~D.wsi_2g&>>g}v#'FV΢#FDK, Nc#cKTV-?v]oxzQv6vmȉ\q~{֬YqI#qֱLJlҍ#SSwYfꮌEĖ@ F_%+hΣ9۷𗟋91ftsZf>':Hvms5dc4T#o7-!L5ٔo=]vtG.>r"Ծ?Nߞn~Yttr! p8?4^GNHۃ/&]c2p"aю;XƭP= @ @ @@*ī"q@ @@~oFg̘LҫcFM4~%Z@Pt7?߳|eKFNPoؙg-?bwi'۲e%NJV\K:'TS/NMuMsɎeN֏dcջ'?lW|JM|}ӻx7]c0]u;QXڸK޽{G.iqIP}.rIo͛:MJ@\  @  &x{L|>\ K 8S;xj$T6PKOAksQ}tA墪5;w){r;r'\y RQΏSN9בx.tBOP.]3LTdt,S^T`s‰ʹJ)N@@>(d|[} "GۅΏw^@G` %_oiF 9L%BQRdA95$9B}J=mڴmoG"SA,+j) {キm/:cԆp cDzPc_4 ㋒i"gvݧ$*2j?CPpZ2\֩S;ɇzui&Fgq ҼyaÆa7#W9/kǏH4K>W X(ޕ 5qD 箻ǔx[rW`ޅl+ѸcJ賄B4.]lG$0v_`O @@U# p> FV];IA*枙iGHYowܸq~|>0QPKmfcC1Su~^[x86g|6M^~ 4(]IųFi8i ΔC=䟙( @ @ @OxgN @ hv(M~g5m47oo[ `XQEZe]OxuxZfV=#V=:t-ZCX3W7$6{N'&dDzN֏dcyd)w6?SwCy{p% g=%UR5k!K/.h]Z~%;C2p?jUF_!@ ! !%f2}tK/U){]գn-v,=- 4| 䍌u0`9*i[bT_dVm$kB`bz>l.[O!o6]K 2dr!䄙1cF5>  @ PU+?˰ r!*NqOkTY^=]vs[o9as"XqzsD̉" &s6pZUOM6$Vnf묳}w[׮]c;8sN挟VV sF'|⏻[HbK.5dJΝcU!vwm6*v8,/9#<ǭƗpXvXs;vLdq?'Ns\rmc=Ѹ;ucķL%ǎ]xbtK쳏Αg/W+4+s4po=ٌ#WYĿo%k!@ "9*VqNY=3if; sƒ>9fO:vm{lO~mC߶g}N8ةj8Y|6 ˝s=/NU:Ԯ:Q9Qvs:Kts\q m @ @ @ @ @@i ȷW1]toc[jcgs̙3ǯ'n~ș|v R#x6ϫ$qX3k/!UlƤV|{:u'1f\ (ɳov-_oN˦MfG@ @ TM=tƎodkO6Ul)d72_/M'ٵ`K^|!NAFbMZ<6'ٻMBLQV*0P@ "P2+WVThrEgϞ6j(/8:%GN,ra %W>erVB䐸;[ov~m8?~w?K?ĉmɦsӊo7~{M7c?wBׇ}X/:׬Y3\Z 1'ީ9}YUU)j׮ms{>}n_~כoyS7|c뭷^~W${ϊUdGHE^m-^xa+Ct"Ӹd3p_k )1zzu/#_C? @ PnH6uT`ZnT9m6lj4sBݟ>umIJT*C~]wp<~ů㟵g3 m'qz}TZi~o.T%=">;"dz8 @ @ @ @ @Jc;a9sfN>tI ?Hk\tة*Jϛpo,#~R]Wk__N;4kԨ|6tP;c-mU#_}Æ +K' @ @U@ƍ嗜QJ;TJLK糵fʧ6\ڵ6iҤ$_gLfS7|3fLVA]XbXzS!m.שލLtx2}H+nSʆZeÕZ!@ #IVb*)weȽ +JmWI,Ybw} >܎>h_rL>}M6Xmo޼y>-_EqƅCڞ={vl6YGkRU$lٲMr?W^?x;xjy5~i)xDAKVl_Z2eʔC%w>S;ꨣ|[b:%sq)q(YC MV~|IW @(S{キni;eQy6LslY'~s@][ l` enSOnHSl׮]ж8jYt=3VV-/p}wxPts\qL~.IHn @ @ @ @ @Ho߾֩S';묳,J1ĕ+W<`Æ 3kvaW_}+9?vڊJx2n|U~ȥ+NՏT⏗f{mK^{4hO}g=О>3}Lb%u>{.򪊀qC @ Pl^@&r} ڨ&*:ֹsgou?6pW^v饗?`Gyw9}tq'˽㎳1v,ӆDT$"{M%[oo5iOv-xPi)ɺWYxq1gb~7c 'Z߿6QFuG sc麱c\nYD;cwYq3Ϧ,!ާ~_Q78p@M4u%W\aM6u&:%xX[RPNвn] ~^עnM{W雇r|Vp*12n @@8?_ Dq^uc=GEiӦc_$btaO?=kq[oIuP|vEYƍu_K. PIJɚrsu=/wm7lͬ{lݻL_z%yٌ3l1(]}H=&GޓO>0gW_)ރ .6l0_'L?0:!y>D)X /G /؉'腬d_>[dp A3Ϙ+YgPtMs֦<>0AJLe]vk1V9rIMeqgw/8t_Eﶘ/fފnŊ&q4=#>zE!@ P$yIT+ZJ:4 D6tAͷϗvNOd3]@eΜ9~2To6UbCXkNPd#cA$߆gֺ7YkN8 $հaCtMzeQQիw1JfoJ5w>4*rڌo#z6du #5W%ջo6]}K 7ݗ?ɾ5Җ _it( 9s4ѣ3t! 6iTVZU~J,$. sh 7Rsn㡇㎑ڨ^zضn}ᇑ3:}]׳gɋgرQ.] ;NQΝs9'jӦM"H-]4r?:u]29#G~=]/_Kϩm Mevӑ3:Gu\2rxm&Rq7r](kCשΩ_wGM"~K}hk&r.vx"w@IDATC3x܇ bN0,JcȉyN>]z5z\nUޑ1֙646`hѾߵ[lY$jwM6\A͸=ƑON-T[[ouѿ yQ:@ r&LɉG.[/ޜKk:n喌A3i '٩[netP R'24W4tؾllWGN|̳MGGyd#\&q~Ŀ=W=kUn>|РAw۷ADoDι%s1ܞ4iRV[y)@ @ @ %@Ju@ @@i(~HUt}XWVuQ|as{qy_Y)ovv_bݽ{w_b++ z>ٌ/qsLڸdİ"<׏MS\ȑ#8Xlc#Z1dq9}U"1d6BU22@SPu(xaQl^{%;W˦D|.M7IUEQҜO6oh33Գ.mLq \x>Ϧdc7;@2W]uU6ɾ5v[oׯ>HN?B@*ܹF6ѣ;C9%pmTiTVTn6lWg.w@ *]r%֢E s"R}9r؝Ȗ5m4؜߾+[p9a#s ^Eɓm-0'^-I9DcpK/̙3Mӹ9G g5ƜV7.]`s!b%sv74FkJSk%7-a\wIJg+^.a$&7{cI~ .Oz~gS_t3';͸=\9:XO9ygN/H_ @ P9!$?s*Ot |P'auMԎEIeft6pO炙?7'm N6 2K;ճ-nǚJ;v6\qLlm92sn ֶ> @ @ @ UrÑZ @ @IxE _y愫rwqɏnݺWvb]W/~g5ki&ihu~.n2?X'XJZG~$$ϫ> /Xjūǵag]e#뮿z4i=-8v+.I~naB ӬcG!C @ P >>?8' .e]m:{Z66l)d72'W^>}o;B6nowQϙ$Uy~#Gƍgydvmo߾愂1~3X:JrSl6j7y8/s"s>mrx -CJFALWUVU'teFE]iGdQp֨Q#4hO]1|gEI>m[o& Zg^C*\SQ\ƑMm>=_|av]xᅶd @ܬo{gD$osv582=BәW6cP"΅ ztIU{ƔxNINUznݺ.:Y>PܵL_~ֵkԪϐ@ @H$ ;`wyzꩉ/U|^LٔnV6leʕk֯_?{gOu} jۣ*8s]M'K".DU_|WFĘu5c  @D?$vB"c P ԯ_.";sqP .d>mիWiFoڵK[MzҞ?믿ݟ9r=qvekeopۺkgqָqTp @9+ 3sU%u[.]% zaLf"8*]E)'U9x㍶h"o8pժUD @ @ @ @ @` ԭ[ IH롇}衇zaNZjy78\e[ >әW6cּy2Ɲ=>U{پ˖-ۂ QF֩S5}vٳgСCɓ'Ga&L 5!@ @@e' cwy{[֭+*/:sL;Ӽ֤I|dBZs57ΔoԨQ-[J$r&dEB=R%VUJ pUWwPRTiǟr dD$$ʊ">WUwXW]sD DD@D$+ (H,9 2Wkf`&t9EUwW>Tͽ7n]HG+i: v gm ̙R&gYCJץA;B6  H g渾3{jkȐ!3fe˦;sj֬f;~nfWPV-u].,ŮHS{}*WLNY)^z%ev-vV۵p¦M7o2Xawd   +e{iGElٲ ?7߸?"}FaÆn-{Ȁ X0}Μ9nl21W\-[Ej#  ֈB}>~3gN6mꫯVɒ%ӷ@ 0 volOm\|nYeT`~<[ !!     @ ^%1G   @R-? =~k3im.VXR}On;w߹ULjʵn޼ (!"&'pURkvX@@@ x,XkF+Wv[  fpɆ  2D2er%gK,qL8Q-r籱:sg :e^ v-8Pot{j۶m^ԩSuNàjI@C@8 S7,Tع|r4 'NҥK5k,͞=ۍ;D .@_~ԩF/[l#@ Cŋ?-\P6裱+Fd͚5]@@@ y{Ք)S4i$W)n.TiӦj֬Z.\8yc)"X:C3fp5z>|j׮vک}&@@@@@@JXF@@@Tߺv?ZT)խ[׍שf@~W:~VѣXkkݤI7?8 P+     1B֗}ݧ׽Jl>۳g ٙE@@I`׮]۷,?O]8cJ姟~u]7z}H]f9=˚2e&NJغu)rNaa[oQŋרQTz.BPeAcO>:uꤡC .2FJaԊ3q"ZAR\@p.VY^4rdX. $^ *`լ%KG ٿ ձJBwUv3ܹs!Q."R:_j*^bheZٳgwZj-8g@@@l Ҟ5km"5`]ZeˆG_vׂ hViJ*.lI&+؀@@@@@sګ @@@He}NJ/^,>=U8p_ج| N ܁p}h@ t~7Y?Z8Xh V.r+gGHuǏ(f͚*t۸~z#s̲ < Fu%hLRLl@@BCm[y*YPϰƠUfMw`#G88J_{K ٮ &נA*W@@@@@@@"H*t9T@@@Hȑ#6˖-s^rmh@Zk+U?Z;l̀#\[ȝi&e}XPvRJN! $K@d1   vn~]w/PϞ=]=رc#;~):::cD4wqA{s3qRZl[oU۷W̙ӵ,i3 2d={o߾.4Ȟ2 7 @ -z!ɓ'5m4^裏а:5@Hx@ P+cc4JNj/J/ yY a5p}`@'p1 U^ʬ, UxqpӦVՂ6o&ALB[H{nm۶͍[n=mhYnsc|ٲe={vq   @ ؽ5ආ6Z*QC]$߱܅ es"{mk<9rk;UTzkCG@@@@@R"@{   uhuUutӦM:p@drJkk{폁muLc۷ǷkС9uq8r >|[ծ];ؼys'M0d.\Ǝ˗ghzիWRDJ@2B=}Iq|twϧك/wX4'N VۯTX9 6Z%Cl\es˗O\piou\Ix:&&Fp*i޽{= qNm OXQ˟ G>wLSAرc{ioFhЁ~Mm4 O=Jr!4~Tc@@@@@@ hVl@@@2Ra[]^ڦ}nNe'vyyvub [ k=Y'vm~S)g@ P+?G  $G`ɒ%O]Pʕ+5kVկ__M6Uڵu嗻l+?]Hŋ6m䞇6kL]vQZd; w1cȂ̙#.Z@kTXQQQQewjѢE5kfΜ:>S,G.О3Zq(% @xXKj$8\tp=BڼY^gX0>Fq@ buOÓʼ6+Ze`u!_۟Z%q-tFsȡ1鿶unU>zhh-#^BhRCOhDŽ}G;00-aZ`9{B\/@@@ xk} Yv{.YX1լYS*Ura:S|y-Z/h}YXPg͚5nP~N p-Znݺ~@ 칷XM6ͅXgڵjR*U7~'vJ¶fÆ  [z왾Xl?CZl@Y\!rҸ?,U&J^Rr,7 @ ITlZW NlwHұ_)ٯTSb~nm8NEimigUNjI"mI`w^|kLWOljwm=@@@j$i/U 7t *^Vy1*Yd|U-[π      @( ^%eF@@@`k'گmmjmu NNns[]_[=FWm INIk^xr]Ks+::|bosmSk̀Z>@@@K,ѢE\ȕzeAX` .F{Ffўa6v킴9?سrʹpʕ+ڵkL@ ctR{?7a˖-?U+ݠPB6w?fP Z իS'KI!.@,b@   ĕӻb@@T+_xᅩekX;|jVܟ|b+:mmCb4~o[Ɵ~IU+/{(YMm    +eXiĸi0K͚I/$u$bQږ)+ƔñFفC\+;yLJXaV.ߏ4p>L ?PK㏥Rv.mXZT4H.iHwʕe+,          tY6qG*C@@@@@ +K/MӸ_ :Rθ"@h ̙SիWwch O/$@@Hk,YB-[zOl@@@@@ nQpfRb.y4lcҍ7^Ҁ[ٖϳgWq4ullG                 @f@@@ }'P+}      7JcƍsJrImJFImĽg Ij4.T*5]vY\ /H?.}4tTV%y                 @DNQ))  -@Vh?J    ڵҳJuJeHO(U$լ)Ԫ4kyRRLrZؽJ<#]s)(YRs㏥c/&M@@@@@@@@@@@@@@@@@ P+4D@ ڽ[ @@@@@[Ii\{euO>:v͓6n^zIjX֮zwxzzI+WJMHKzΰ>d@@@@@@@@@@@@@@@@@ n) N"  %Jĕs˖(/D@@@@H}ǥ3;J5&Oz,֭{NWOJ:t :4T"}]4|x5gTj-{C@@@@@@@@@@@@@@@@@ j%ߊ%@@8/eV_6     !&+M*  +&5m*͚%/-_.e؁SqOnAڹS?^ʑ#v&iFZBSGi098@@@@@@@@@@@@@@@@@   @BR<Һu\Jʆ     GJ&I}JEH[KIJVI˖I=&U{ m<رRR}iut^ rS\|뒅1                  ,j˙  !Pz ѺZ_{6xJ+G$O'+R V 0åK[j8 XY@@@@@@@@@@@@@@@@@2L@ g  (@V$u@@@@YAih[7pKO>)m(}tRrᬐ6Ƕlԯ8EGoBZٲIO?--Z$H5kƽM=@@@@@@@@@@@@@@@@@R&@VX @@ "6VB@@@@J`^飏B^^ڲE[鮻%!U]\Fm6ʗ/_H? {qoUxq(2"                Zzf9.@@ P+(O B@@@@*СR6R"R~RlҶmҴiҭJEuS,psM:vY d$ҲeRRzKGt                 @Jk"  p{o9      ,`AYo)h!]xtRl{I;vH_|!tT`:,w7p4ԧϧwVo>̏8bEi 7wޑjԐfrQ@@@@@@@@@@@@@@@@@ P+7G  eڵqSE@@@@.M_R*QB?#;믗. .:Tz5i0FkU\8+jդfͤ}@@@@@@@@@@@@@@@@@  ɡ  je*\e     @['=TTRرq!Z|"u.)"ssJ.=԰f͞=[zʘD^-Hniȸ@D@IDAT9 ך81A8t@@@@@@@@@@@@@@@@@t P+ݨ  RRjq-     -j3RZR ҿ-YpDžh .u(ȑ%ԹtOHGV޼yպu£#͛K:Hzǎ ,(EB@@@@@@@@@@@@@@@@Tr   "`\*     @,_.=TtE/KuJSJ۷K'm+e> G^VdAfQQȑ#եKe˖-!lh/ϗV{́!                dZ@@"Q⋥+"9f@@@@@ //JF wfͤ3[ޒZ2gN8o֭&L֮]EgϞWK?$-+ p@@@@@@@@@@@@@@@@@ l SɁ  @jqĄJ)'     :'OJI'+'ծ-)k'͝+m$ԤM ?='7VW +R|%1@qߝٳեW_N"R@@@@@@@@@@@@@@@@@k?@@ ,P:\*N@@@@@`gfI7޸A%KPĉRϞҢE /ȽGe2EzABZQԭ[7eʔo24 J? }tR?M(                 @ '# @JR,ʕY~J    @l4}tmRR&'5bDSU8HKJWKK_ XK˗kŊիd.e|2.?.zJ:v,J@@@@@@@@@@@@@@@@@BH@:Y@@ <,Lre@@@@@,gd曥 /Z͓!Cya>[=U9lE]`>k*Uw9uFRR԰aS?UP w;3qv eQ)                 @'"" @ZҒ%w\     11 7HEHIӧŻrK4pz!iʔwԸqcUZ5YEسg ͝;7Y˳P8!-/'evv-PgϞ:W;wo] |'NTٲe5uԌ/L: S&˥B ^>_~.}ށ.d           a)@}<    @ l۶Mt?#=y5km&Lb1666M @l@@ Xg[@@@@@8tHGpayڤ~ 6l5O{|%_U~ '?М9s?'{< ?>=.LxS`[jI+hݻ7/!XhX~wnM#mPA1Cz-w5^ݲeOu'W@@@@@@@@@@/꣇h@@@@"G`ƍ7o>3=I'|r㏲#FK֦M+h֬Y*_1ݽwȑn@S@du@@R"pW1      }K:Ņh]w]sg6ofϖwT)D*1z뭮"O<}({.xW9stv^`馛n8qU0իiZ@u^?:.]:Xn岜qSϥjդoY-ZTov6nV`!@@@@@@@@@@ ꣇i @@@@"\ sЫy&kYK.D͚5_&:͟?`"т& jɣ  +;T2Z{)9    T`y!8RVqnWaL2DϾR^%2P`Z%KT,YԴiS|:wM6W_ t W/HI?>͛.]h˖-ZlFڵkոqc2wp…̔)Sպukvʇ [>oӦz!۷-I&SNFwjw%^؋/薳,e^⛽7b_~#<]`c=߭[73ܹS?ڵk'  ;\\}doOYٮ'|R=+w>_~e,S@@@@@@@@@@}}wE۷/è>z_    om͘1Cwqgmn5k91cƸ> ?߿CA7׿-G)***p[? p}R$L2y@ Ej@@8/'P    BGʛ*Y4qԧ/_J*[[G Yz7\qƹ oV￯[n%~'`/;_s8vL^X5qijҤ٣Urٳ rΥשSǻNt C{={v-X@­^z%w-*(֫WUe۷o,|*FZ֭[]H ʑ#jժq{ *]Xܹs.T^?S./C޽}{׫A*U7 \&~j0yҢEsNwQ 裏:? ;{oC)7           @p /:qE>zG+    fH_bҤIʟ?^zիCɓnsulҲeK^Z3gvK4lpgz}ggZ@M@sbi@@RMSK     T&‚>4.D.Jy{˕+뮻N۷o_5jߎߐY >6g8v֬Y=̤wJ?(M YRvZe~raX>J: aEkyKe/v[u,*PzuEGUy~w7*Mvɻ&k*T}e[ʛ7Xmǖi޼yիW/_^~ k(66օ~߽od˖-~fJ.,[o.C#Gt8p@ƍرcwmu \UJz&m,)ĉZpϧeϞ]%KtcʶZ           W \>z")    @x ^ZNo]`4hSK"3O烽::5kc}@?irH3le@ P+i>A@@ Mԑf42Mw@@@@@4lRqYT4e}!}{t8y}]Ur~;ɔ)?[A5k .t˖-^_qnj?Ϝ9{i׆ VrX-?ϲpa\]dKg}֕sݚ0a/RH+]xT[|BPW޹5VZ7K&ҙp{K{ZZ5jx vnbTrԡTի>U-6l~ѣGSfMC=v5̝;Wl^}d홤-ˀ pj![@@@ I+WJ{x    ﲰʔח>LU _9BҢp۷oׄ Կ͗(QB۷mٰm67ݷo?ްk.7Ƹ5(W3o*ZД rSLQB[-&O,kW6mrS{]yرcժU+[uuy׮wzΝ;tݺun Һ @}l![6Oz~Y`ѣG2e#5kVu]:~4i[ƍU\9թSm+1{/4{mmgg;g#          @dS-du? Gg    I`G>D,Lkȑ.]hҥX'NtҰatEo?nٲoݺ5="Lx bS{IfX@@R"`Oh    d3;|*y>:Uߤ֬}V^O.`rέnݺ+ 0@VrIӧOwY(/>[c {&TI?O?-'}Tٷ}YeD ueaWvf͚TVM5jŋ]eƂ GqM4Iַ~= zWe}W@.n6eObԫW/}7n8tP7OΜ9էOPLG͚5SժUկ_E{uY<-0aÆ?wTge  }ݧի'8eۑ|yyJ2DNg!}ُ[ v=u-          ^uCL}t꣇ڵKy@@@@NHo ²"luja}6)RD%Kݻ]WE׮]l2+b}TEz\Vl4sLeɒ%~ ѣ^x\֭[kʔ)$d @Io8-2 ΝnDIM&Hx}'z J;vI(F xCy~]Z     A/pX\`ر /WQL^xd0ij+VTK/S",^Cu(/*.-9ÇM7ݤm۶O?ҥK\r~ mذAeʔQtti ڵk^bMeЯ9rRRPn+yfAVBɓۍN]'*JE‘s      W@@@@8@k̘A:q"C]vQ}QLW !J^]z-   @ݽ}cs־Rv/f>|X\p ,Můsg 2 b)^@@@ U5fNM@@@@@ Y^2M*Y!+ծ-w_\Wӵn:?hi[Rz曓eF#GT֭U@G֤I$,*$W,-C޼yO[59aZ;k֬n3!wܪYi7) ֚z    %爬˟&=3AH@tdE@@HͥResl@@@@HTaiW/HcGiG~.x@^P͛5jjժM" {H:H5ją%b׮]6mzUX.Bt,M?{m[bp                l†͛7'{Dx2P@@@ǥ3#G@@@@T8p@92.payEqA4<#4g4pTL:M6}vM0ٻx)z4iR+ Q@HFX1&v%h, E bCTDPDҤ;ϹY^o˽{gvv9ߙ;9OP9*VX[IyS}nۮ;^J/ٳG (XD"먣4׬ZUZTGZT@@@@@@@@@@= ڣo"   $ b?tTm۶1|sL*Ud\@@@@։9mԽ;      @6m&O&LN,iI=$st!<L +W.}oQ=;cY35nӦ^xmfkWR%j{uo6^Z۷ĉ%[ժto>-          $@˖]U zɄ.f\ G{sp@@@@|l2xW)xW/oߞ$JRҥ3-+UV-ݱ/@ H֧# $@Ҕ)Rʁ    &~+K/I#/.u"=Գ*=P'NOJw_RLj.UF$6ʿ[:oqe˥>.Tnw->S@@@@@@@@@@HMn2eY?j    @: |2'N'"Q]h1   @cE+]    "z4rd9fjH&S4znҠAL+YK:㏥+HdԿ:Ԙ:&@ǎҼyM7I'-X%L                  P+Z)C@@ ' 4mZ ®@@@@@ /zH:Dn]ɒr4n~˒%8T)JT%u$ ZH6KK&}Toߞ2U"                 @ P+O1D@H=~?YJL9@@@@@0ϗnUj2c9R:xi4iZ'3ϔJ*̣/><#K͚E k! ߖz*mJ:5%                  V~X@@ X.M[@@@@H8sn6>Z5JE5KZROJHS4n7 *uFI-0hht1gHK6%u(<                 $JSL@@IGWĔ@@@@# I/]԰ԡ 9H~(-_. .tTZ֍ҥR~R߾_[b$P/Ko%h!M[@@@@@@@@@@@@@@@@@ ,  %6LZD:B-;B@@@@8 '͞eDi*Y3 Γڶc84l&왑rYHp^NE'#-ծx          gFXBRE˛7 ɼO     8~gy"xW%xwI~̓~Cx8' E,@B"p  &pR:.!    @ #͘!dI֯Z.<#VV[vJ^"zuYPH3O>ʕyO|R_2eKiذ'_(1          +а4~cTxz~ݯ!    @ 4 ^^^ﻈ~~/N %BP *#s(@@@Rn ~% @@@@@ v^{M֯<2g>oI @@@@@@@@@@@(H&cG~@@@@H =+ 8a a@@I[7\9i„`9    S`6ixO3+VHh-7 5lRrlDBSJ|۶I஺J$@oIf/\[n+I2'@@@@@@@@@@@NR9xУ97     8~syW/i߾s7(͞ @@@@@@@@@@(QB8k I}d @@@@@ J//J/ D;m(rj99D@@ o~9s+^5@@@@@ gs.o6lzJ:LCK/,ȑҚ5ԩҕWJ5k'G 1~Zڿ?s߱C:l3'RYeK2%Z/uU^Rق!          h\ RY{Ojw,A@@@@ x'~Ń~/j/1OBP K/Exd  9 t*U$b    "edIOn)e?RRZ5HeJxh:i⋥ճ٘E$%Ko ml2DBi߮RQ'iBi>i򌩯%猿/|@@@@@@@@@@FcGC{,k~E]@@@@H\ Cy ^] =q (Bj!6B@@ Zҥ3:c7.-X@@@@ґGJ"M9_'r'Kuf$VMzyiziDirȭG }V*U*:+&{1cr_oH5_~-,Vi}tY3          R`߶vˣo@@@@_,_sx n$ Q`@@t/CF밑@@@@x)}{iŊlf}'=tRҭJg$$Z/ +UmY@*%ٓsM,%;WRM ,>m=⋹w           Pgn_Խ;i̾@@@@(* =_ ^u^U:Hhj%p  ,йT4vl:+Pw@@@@رC"K3#خT$YibiPm[qc{-W_,sIzIEwLB Y̑V̾P\4b4o^%5Y@j Hn޼g:X@@@@@@@@@@ .`1 ͛k;`C@@@@hkooo/RR@ $Ԋ10G@@@ QF>=    !`,IVvX~AÇK:Ho-]+=tYRaE-01c$K69${KKJE<,itR()V,ߘ=mr_o@@@@@@@@@@@p O*T<3c"    @ ^~~g/N"%Fb$@B[@@ C``o+@@@@RO6m2ݛ}~9#̙cI]@V,E 5vH2gPԠ4}zw5ko"^UJ+WJ+ztRٲ7k-ld?@@@@@@@@@@b/p㵶}Je@@@@b#p~oo¯X¯o¯ /b^@$ V4  >G-8jTԙ"    %_?_2!sڮT)CSNsbbyukFe-A>nMkj"=dy'GҽJݺI%т'Le|          "Рԡ I^X(d'     '  PB^,pX@ 1@@@ wG  @@@H  ~ю;mjΝ;k.7y?eLMy{ huc-'<9M;kc ~ObŊɏGNJ=r X*Ƞ~.]Fʖ-+?y?eʕS9o.R^_Dti8.mX êU?qZn6mƍ7?d'~?QUREUVUjkժ^zn϶ GϩJ?.vد˘C on3SP .K˖U%Kۗuُzݳw@IDATnOC^S{>|~n?+7?oS#6Ӽ=gD>?4y,?ˏg<           /`q0۶ms֭[DNmycZ[m8mdWU; mm_mGkv~շomZ#۷Xȩot SbE7tAnj@@@@H 6dSc}ia}>>Э[pF{ٟרQ#ܟQn].Hj˙  I+`ч &LLjPp@@@@ G 26ݲeKi2}vh#6oxh`ApmQMiʕ m| ~j,RUi쾷e>ټ4X #ye67:ʚǖF`X^<1gw~>Ͼsi>!r#%l>e/2,a!?Ogf G;?           @2 XΟ~I9mv{͵y?v3[v~O6}|dyk۾|ڬ~ַnZV&m?ֵ5eom^u[0kk~̚P̖yYmXb$rZjUUR%[`mm}0     (nm4o Scҥ/gu衇aYG}{e1 =۫?7qҿ\~;+VuxVZj޼Zh!#8Br/S@$$;a@@ ?]5Zw1   !`d7n 'tyk~X y O>5_~DLe7ze^e>ٖ '3I|lǪU,IJFAnn}"`0t]{pc+a@@,G%KX|cSN9E7Vzhb}^K?oє)5ƅc׵馍?JUVAZcA [F>s@N-gF4X=#VyFK~ڳ=4r\s:~2Sug sĬό;%:լYpַg {hwiw߹^Ǝ޻پ>5ڵkE[&C(\b>Tdo  p A4sȐB#GJwܡ)T)RSd$ i"?|Α/@@@HjK05>GEYVh^,U; rj^>qM-y^1 $ܲeke[% vw ~ %*[ wNLK7̂ # |vv=/^<>^oN.es:tҵi5KTA|mpKdtR͛7OѢ>`uY]tq㡇^'F%`,u >fԂij5)QdpOf9[ DZ7>'%twR`SQAe%la YG߁=gؽ?ԞoFz@@@@@ ^(9   S`ZbW\馫Vիݸf7fB *8k,42|*CڷےqgkmkjvڙƺuFo՘"8TU+i)   @: ػӧd[v}jX۷w D}jX^bO8pm۶%;QO"B V_ $ L~9*|t K+_#8炒    5Au>Φ%uoɅl5.D$Td>v$$ڔmP C-X9X8 4ZjȩשSl)>Ћ/_~Y˗/w O ,i-Z$=o޽]FK6gYG;O}u{&)ynv=?]=7d7ٓiwʕ˔(k"-i%Hf]ve 2\y߁=kd}m>|y[@@@@@T ^%.uC@@@ =edf-%Pv"E*Ͼ! ^-/fmT-Ʈ5KۄŒY[d}_4hsÆ ըQ#ױpxf@ -HJ"   X?֧sugXҬ.]~5l>5sLY4ީY2=zP>}t駫TR@HU@lH-KJ,$+%NcBT{SHI*_>!$8@@@}'kb?( `'?Z@%KY`h"hU\o1%Ӛ={&OY%Zv v(N?D>i{F e˖6F6M  `,}۷Txq۳1|֡ua~jO܆٘A@@@@H2UQ\@@@Xb,oђ%KtR}wnj|@kg:>)vXR-b!e˖prk_,ћG۱c;]>q:شiSY\Mb_Z?@@(J#e̘1?~>#Y)XW^ԩRP(/RoWO>Qjt9N(3 UZq *@B_-RmT;'~v5bt+G䑹#5G@@@ v0˒dY ~ޖ[Oa[%|,#*U]3i*`CKaIK>ujl7m۶5( 6TF2, 3D^c=>@M4Q]"֭['H)׋/qƹs]vՕW^nݺ]$|_~%lA>4}.{^ y"{c@bXgI,~=wsƦM.]{N6F A@@@@H0UP@@@%믵h"}Wnj [ڵ Y[]K6d ,6Om)SIZ`}йŬYR8y-`m-VբE lM-WZ{(9   {1aY4G1k@@@T`.Pg6ZR 0\r.΂,Y)%J)v%@B}\/?ktHmaOF_.Le˖ߎ|mk|j o,'A|`I7m>M}Kicj\#@4[nu,Ois'ܲg X>M6     **v    y:Hu&}v,Yҵkժl@-Zp1>*O? (r􉶬{vԶm[7ի@ !HB   *~?^w}{syP!o{Wli<Zv,7֬ PPjT@($jd<)I^MPNzW;   $%/2S ЪU\+Uf͚GKc[ *$n(U\%ݱ;Ϧ6Z.kVL{QGnݺq-{"|޽1bN|ꫯAHL^%z\2_}MUA-e-\v-Z$k )mDyk|"K^C:Sؼy,ַ~Y֭[pJ.bAllٲKi!      Tx =   d'>ׇ~>Hsնm\;>ZmڴZ8k/ǀ.f}g.]*{:v;NRD?["@HU`Bv  $ᆱk}tDP̐ݻwk̘1{b ]wu+gl  bE@b+@BspS?5$&UWI/ծ:r}ן#  $͛7/c= Xr#8"&u{qwy*WAC=z$H( z$JsJ@TZIz(6\Q J6ՠ4xkB_I!   @߿%A;_}lyz\PQGXK$BP]X@ X?Kc}hɶ~UVZ pǎuqǩjժ)o>Y{5{G]sJV6Ε={jW^|q.Qla͝;׍`O?%dYbkVP!b @ ޽%/9{a5ܿ,A"("j4A@ /j%.K>tҏ?*xar}Ϟ##  ޽{]Yfs97ov 2ڷoCx  @2ؽ͒j$@6UV.XNҩA$TڵJq}?b'Kꪫu},%Wt}颋.c=e|qރOuZt+%i۶mnݺq.1G'O?$h>s~Bԩc=V려]v*UT ˑ@@@@@Jx:@@@K'OW_}UӧOwmO>dvini%JH:P8,vZ͜9SKg ?puݍRx  ,@B@@@ n{w;\A*Uĭԯ_?Y_bR8 P+@@(]4p@iĈ 76ͯUԧO}WzWt)w ra1 E-@B/Utv?YiRŧ\q   /w^ czWo/UF\G֙j*G@ 8w\Hwq,ݻww'` , I&I)mS6ԬbŊ>}>l^Z,Kfo֮]*UOvO:$iӆD/E~f8 %.`̙Zf*W9u릳:x     *   i*o>5j^{5կ__}չ瞫c9&MU6'i&K/7t A^zB(Dj"&B@@HiK|ɜ6mڤaÆGQƍu5Ȓi/_>{buH?\s裏]wݥO?=N(4j%;B@@D[o߯ӧ"9(U`߾}:sG>Sڵs]/@r(|  ,0d$қo&r))   !0|8נA+fM2uNҌ8OG}zkƌQ?\#,UnI?&NH2pnިQ#?~'֯_o]\%J矗-$q">)A\r޽akVuџ'}w9lb@@@@@@@@@dG~aYckn-QΥ^J2d;"$Zl2|:sԹsg}EX    ٳu=G%VCl,_ŠA cHkj  .Юԭt^ʏ   @[HٳGf TZժU݁sVX{Lg}F/;rڴi3xim6=.OժUݾ,i??lذ+Լy"%Go;v&M RQT"k(cxzꩧrJ}ݧƍ`D h.C=䂨؉|,=M0!{o?񪫮ҕW^Y:StkȐ!駟 uylƍ 6tY, 4i#K<$ #QΝ:묳4tPq@kS[X#38Ccƌի]2ρdE_*         PX .t?@@@(83ue>}'[l]wݥ.]k׮_]vZ{_pֿiVI: =36mƏ2@ zjEoŚ  $J| MţP   M0qjժ,/ԋ/;.ne [Nsє)Sd<xh"YBKc5zF.o6oYR3fo߾-?~_d,T5zh-^He˗c[+V/ dٶr.Yҷ~.]_Yn6Dm52,a%Q|I,{~|GKlد_l/[ۥKփ>Xkۧ~ZM6u#FpcnfY,C|XDx>o"k=rHY ' Fo,X'%oA@@@@@@@@@;v:vڸY۰޽{'W(mbߓ}g/_PU^k٫W/ >\C Q߾}]ˑHCZSOx2qڴiS"    $`R,Y~O,m[o~q\?O ZF-Z\{5H^`Nvi,@B4>T@@ 5w$AsF}   !~zuz Ba},жm[]tEn%JboN:$]|ř֩SG^z}?4kL\0Oϔ+e$ɿDGuTν?w0k1Rv%K$~ϖTgy}kc%~eεȓ'OV*Ud~\b|YbE]s5z'{CXDK$fn%]HS AG֬Y:-纛nI 6tX/ Kڽ{w0?koΫWNPf@@@@@@@@@ -|I 4H˧ο@,{d0VbݎC͑`]wEq6lؠUVW^qI2eJ 6La_=:=>WMVXd? @ P+N9F@HEQ(kG@@@ȟMd.6|g:33wF[%Kfj&h5c B~[2EgEurwYn W\%MI_~ƴZ'NTJ\b(vn Pmٲe~ԨQ#f͚_֭6Ғ&ZYfd7nsNWO>D]L\4tOκ<ڿw= d,%zzŢ~v :E9Ϭ\~/Ǐ{. nZ2>@/OKe|,,%c@@@@@@@@@Hl9AgW]uyORe݂;Ek߾}UXm~mRvmuY_zn /Kի;.>Hg    @~V\?P)dq-[VgϞڵ_~ԩS]+IO +V^0g7o:襗^*ݲ/@ I.,  /pqR.wH   D+t1kPE/_|Q7oa=zwKfשSG 6Ըq_WװÎaka ,>gb|d>|^y:C5tPժU+b׳}ظvZmV7x,N~/{ QRԠAk7tWրAfn6\r%d]f'Ov׿y[tGƤ _z= k޼ya5֭kxb <8\Qά[NFoͻ[|ׯw:5 lܮM3g'ԲeԦMt'uq,o̘1?C.Οg}-ݻWv?%0o]vW\}Y'Kcv޽{dlcǎ;)֨QC#Fo[+%ьlݺuLJ{ bOs;/V?b?[!?5ٵ#G>}s18aß'#Xkn1C G}bNF\BX{8 ?fޯ,ͼbjJ{nvyyE5{/8'٭m~;`dS^kiq-*TPNd?fj*.<9PEӼ 6sYxjaqdV~fʗ/^xA-Zp^z^@@@a^_X 9[˩O {hs%w;5XYbqaÆw]bc5X_.@@@ ֭ z` ̜*0bD(tKv@wqylBS@@@pBAPizMPjBAQ( ~ ISpf(R %*TjGݼ- Åo6m B . UT)P' At h}s?) ݄xP +ԬYЎ;Bk˖-vڅA¥ТEBA"1W KEq[n Q$>n_h5 U( ~BUTqP\V ]]l3fsv˂PٲeP: -dfaCK=ӡ .$1s #ݡ:BAAZ(bWF:nA…P((عA~7 BAbP˭$ ۵i+ BAg(H殡;#\ # 9sf׷]GvM c 2$ s9n]?8zPd+tWJ( dz-ٳ'Tzuoҏ?cסr_'Yv4hP̊$ A1^ڵgj~l>H 90gtRW / Ox d^ub1ӳgOwž7nM|ld9s2س5H*U     @Z V"  '|z-X ~1N, X ?Sڲvi/ԯ_ŨX faE6߿?t嗻e>n{ 2; x: Y HCAB0N͚5CAg{WL[1Xn;V|EoW]ﱢT}Q>/+! CƍsW>̼/К5kBCub7,ʖvvC˚Ԏk1jZ}| 7oqt`@ !ߌ.g    @y睮?X(wk9a+K^98sMX<~:~^O,g=s}e@ȿ [  @,H '\qҥ]N\Eg͑@@@8qk\aIy+C5jpMV 6,58B%dNǒX"2eʸD\n?פI14`D#Dogq#X$+?vͱAmȂlYjYiA~0;K9dY`,)uߺs5O5j(w8[ώoImY [YhjY,?XZ-/1cծ]-ڴ$r?KHƮȄZyH̒ ᓫٶmڴqu[n}?o<֘>Hc=mױ"jUmmoKr[б%yv >W,_[dɒ~Džq=Gn "7烪gAcbŊX>. 烜/?r)i?X^;jժL5(\7ӎ%i      '@J3J   <3Qq (mZ{Y+aeK]?wqm,Ю]hkrk3o}F(Pt׻zpyy2km}i38k]bЭ^^sԎ9-+x=9b&kBhl9-zZ޽{])&MΡq~Q8V^1T ryGs84dȐ7,IGѣG)ScD[.>H'@@RDڷ^yE:@@@@ jrk eb$c= y,޽>hW *id щ?շo_3F ,Pܤ ݲe}Y}7ڹsgʕs͛7/kٲ $ /m&HajA#5nXA,cTn]Y]Y_OZRnmކ M+CeseO?*+ ;vDvg͚ ) $o$kr׃kنuֹi~sQG71ӧk֭nYNUT ׮ k;vn:u>mӺu>Xy'H)H6Sx\s5nAb8ٵ駟*Hb6s4R۶m$rYw+Cd^4:%`gE&HV軎k]Ap+Kv|~~ۂ\ߜ][jڴij׮]~vv_쯳}P "'烜/Rr)i?ؽ}ƍ Hf>x k.R^@@@@@@@@H%SS\۶5j$dլOYprޖ(Q"nŪT>h"}2dHcYg?5ji}姙ч%K=gM2][Xpl6dms'K,qiYy-k#RJɗ1_p[l "m ^Y#F߯M#o„ !@@@@ |Y)DnͿ*yR'{iӦ.qH߾}ow]\6?ʗ/-[dMj{c>IQAH " "A*" 3u]5bkOŸAD!(Ad诞{z{=suU]]}ԯkzGMf;wXL\άYf2VVg:.jժ力4iRbuh]vB炆)S췹m۶իs<7wW_u 2Uc+TQFه~htpx%¶rZp63T!&ooI'dC{m8wbm޼yͫ3L,V?%V*r?( m#{̖e,?E?xfd:Z>A#+VGn0N{_e&         @>>n-Zb8m>3OE X˗/7oE㑟6Ñ|*zl޼.EKl(h?ȊGS#u,@ ԊǣB@@(AAR[nM=+mժU.tF Xڴic|mذ!}0aիWZlicƌqaZ{v6?BPoUuuTG uԠ@ԁl޽룺d,:?-VP4&NةS]tI0^4j*UdG~)I?(P)sUVscǎ ^3Anx,uTO<ѪT.pwLCN35Ҡί?WBB;v:F1'l ,p!JP,λxG黬_~,ӧO,weW_}%9={v̶Us{쯛a62lYf;wvAQ;0ܹsℛkz=W^ T@@@@@@@@(n7põ[^dIj5j԰7Zd{xG|X2|pm׮]{̙3]` DtRW:VvˬrʮBQy6ls9裏b|춥" _|MTG5>Q Jn+WU׬Y#~ڵke˖2? 5$R^x^|EȒ2?2נ_~َ:(_na.,^u*f͚.J˲.͗9K u#u6lr:7;udt V9pB׉255նmf<넚v1OA3tET;C;cr{{.O/9y. u!WZsGy};<;SꫯvןrŴ Mwvrs~kY{-8gj!5^7]Ot.PC_zJAǨ_~VVX.}ojlyuYw2bpANin+=Ba=\>Ea }|Ŋs:^wݏa          /֪U+;mܸqqW;I}^."gC!Ij;x'mǎn]љ;wzveٵk3,y\~F R{p x|o_n&OCn̻dva_C~O.xeg&cg)H?V?6}/+LK}>tdA :u;?qSNfPXYɒ%: AL b>3ҥKU     N}\hyPVϿjyn~ >d쟞MsqǙgrG@f=D3fk~OPڵCeʔ ;4mڴP {B*$| ,{4 u!RBNU&믡*46 Yfj tQnvE綾:hܸqeW,qoIuAu t[7m4ԹsP~?3AwW 1Eg[t\CAGмy]?B|Vt]߈| A#poϮ[#xG(h= Dދ?Ij    ğUP#@@@b-ꃢ~%jz._>Ym'_ QoekӦMwSFڔkɮͰQ!.]kvW\ “\Q=wO>quԏ7tmj֬;#C^2AbQA,r+/]3ߓ]?gևIŷp23τ{_MՇoqUڹsۤ KʪUfٲo֕]~ԟbZ˂1ׇ@+i]8 p챡op"Ԕ:"  [ rm-gg\~ ̮~wӳ^"+ %=˨}Cgf;y]Gmná@-PB .   Pkךtل f[ĕaQ׿l͚Ka(yYfcc98Ƈ@@@@ GyĂ :YcAHr!EP7c h,(# :QYdA -k ʂUu̖-[,/-Qv :YС˂/7OAC :YdA+'藟3^z܌N>d :Z`WwkAY~EtrsnN^-hfAp hs1k}@v澳A Vz#z!dX=/u# 4s4rFT~,Q9sݗڿmw>lcǎg}ւlֵkW-oGھ'Ac= B]Vfq)̂ 4Ӿ{^qkfndYZ$ ˘wpŊY]s~fZer`Z}Vf-իWޏe/쥗^ ԂSkݿb+^=     WI#~!   ̙3]9smf_~ys.)k-ҥK]ک5{֭t~ڵefW]<@7U{46-Om@m2r3ѲhsʬlߡAX-[.B^x`5&wϴY~sj۫07h2~6M!cvw 7H,N@f-Z=TQւm#  FG[n-[#^'ZEn0ZFy]_d{~73b5}6i$L̞R. lj%e@V@=t9V\9B F2*5i q~Gߔ@@@b+BOܹswvYgYZjxJ E9rDa]ǏXY*x9nQIQ >PK?TAjLל,r~qܚDcɓ'ѣ7ް 6$:D|`k߾{ke+X&N'p ]`^) q٨>J.B z*Ss=`nf sxYӌ~,{+kh}ژ1cLɽzK/[Np@@@@@JrO@@@ 聭o1֯_o\s]vek٬?doJ<9UaÆ 5kY~v[kV麡>?kwzEPuf#@2@@cT+,--ͅqu\D k/<<@ $03  $7}q{   @^*UdW^ySSS^[nuS֩j_kх:jPX'tuQn|پ7VUNeeO,P+7 PLNC3\si_skh7~loֽ{w;\V6n^y;3^z~ǣ>}LR¦sHPo̢`z µ;8wO0O>D e]sG p&^%43xnfVǼ.[rk(g-[\`:uHG@@@@@@@@H%JYge pZ>)I/R;cM0@2Ű^<9ݱco׷ŋ&ϝ;x㍼RuaU(/pW_}՞}YS!C6lRX@@@H,RJ߃:w잗 *$NdSDj̘1vu=CV6Ǘ@ CnWf=@ڵfd6avbJ.|uY"k jn8Ii   E#w^:$( fֲeK;]F׮]n_*9~[ ~\d(2C hSVvk .Ć lܸq6vX7n߾݅h)3ϴC=4jY< 6uղ),6*LKU}Q\7[n toݺu4իÍušr>6A>HPĉmcVlYГO>B25;    #ͮ"   KVF ;s\mVC vi{o/lԩVtikڴ+&[lq՗/f͚> Ö@ Ak쩧y>   Psq@hҤ{nR*U l [vyСCG@ jE"@ZP2ǥ71ÂQ{YR   @㏮:ӤYɒ%-%%5QVΝر4FժU|| lڴ)ݖ˕+gH4P(Bou Th6x 'X"]{FBTУHÒݸq 8MUxΣDvm?`)S  >hwкukylSoI&kPqϞ=w`*T(H5     PROv@@@l6qDW~vꩧ1Sz6o!U!/[(Q"sa+VO?/AWn .:tUn$Z s(   N`ַo_4GYÆ ӽϋ 6|p PL*&D巆tʯ…f͛=ٵFdYR   @| lݺվ7nd7#Hwuԩuю:({A@v4uT@ imذjժsw @j֬Yօ$; <]yZH M6h  ]m۶ʗ/oڵsZjlҤ 1<%믿5ک͛7[2e5K.ֽ{w֭ըQ#v"    D*1aP@@@N`ժU]o^N??gv"}v~/>fΜN9%K,.'"@V0@@@ & #ׯ-Z^z%߿LC̖/d裏UW]~^!H@a@'@V,$:p)6'47GJA@@HlߺBh ʕ+w(0D![KN ֭ӧQ-XJ(Y ڵu Ka6p@[x=Cve}Oٱcs=v[޽W^5kCբZ={?liii. Fߩ9s޽{B ֺukk۶ T*UDē\0{l=য়~rMFY];4_\x     'WA5@@@H -[_|a|}W֫Wzi=c9Ǝ8#@?\|?~ھ}sַo_SVV {@! Ul@@pڨQ /GyĪWP/wﯿuͿ@ JjE b@(ZӁ+~MqY:k̬K^s~GǑR@@@W  \g)Sj͚5ˍ R` 6t!? TUVM}+h%wewy=.'t+ Z.{g7x)MZÆ ߛ`n۶m6cƌp =r ꔯ`fM6uavVV谋 ,s-].\\PLwS†.k]     {ޘ-    gvZ_M4֯_okōjK߮];TRSĥڝ?^ZZ}w~/ Rhֱkzrax|GQ$ P+I,  N?+|#Ge]fJ*v u]g~{Ї:Vڔ]@~ q#@VW\Q'iY~f[hG9 nH    ';wA3sLl2j`:ʚ4iF~Vta@ fЫ0 T~-Z:/_ޅp?Y(ԂXJmvwXƍcvCzmNgq=cVn9 {/(O tF5r V@-{n[dQw{FG_ =FFZ      W*s    ڼ ĉ]pOjjkw_dIcǎ[nm+Wά!@>S?駟lڴi.HkÆ VbEС}֭[7;cjժ Ah E@@@C`<{=c'tR|T.Akzj{  ޽{'Pm@ 1JD-@Z{6QS/+^p~̏O#  /54 Ѓ#F+TKWx~^(x }:_[u\:*Gl4TTɎfʕ.D.Lg'ĥu@(sq?/]㊭UV8/C^)3     9 _%'!G@@@ =&O~m(XE}j3WTn#7ntfΜΘ1önڜԮ];S]JJ~JSK0Q]@@@ gvZS83xI.*˖-sAZ?U^nVc큘"1 P+ @^ʋVbK:^š j쮻1w4   ضm r7o͟??М0SNkР ׫Wmpn]% ~ͅ(XG,: jw\!:>lq֤I:? 5zwlȑ/X޽.SO=lYoڳ>kSNA;Î;,> ]v"˕+gv~@cZCŊyG$عsX–/_5t=?p{ԭ[79t{U&     HWIE]@@@H+Wp-nT[޽{Zٲem:(kڴkϯvMs=Y  7g;w5pVZFhly E%@VQɳ]@@@ vhԨ{ƅ^hjՊp l6j(3fծ]nKo KTHHQi@d P+D=gcq, =οD@@@ 77ov[ 8;vp(HG /C5|ơ44UG[ԡVa>bٲeQan߾=\!}`G }v;O?Ԟ~i\ÿ!CEp,~^y{mvgСC裏NHj*N1$GrZj^@a9 TrHxL2#L@ P~ 9"§-൘"    ăU(P@@@Ϟ=;ݨŋ-v RM@Z/FZPKyv [`-ZӦ͚5ssjT Yg@ P+5F@@*pt=SCύ3 ozO_Snx7wuŮ ;묳 @Ԋ"E   eЁ+>KqUnڵ3;`c;>   @Alzj9hG=H_+tիWw 88a Q@ s]vٚ5klժU OSJ*lZpՙ=sNҤI0` jݺu׮6!&Mwyƌmup /4]aO܍ ѵ(|gӦM+S}Ȗ: 9ռF0 @8u{ȩY RtCt}pS{΀     @_%QD@@@ ܹ,4|2F-S[]PJՠA_~/ƯGEzX9]d R;t'bŊvᇻ#<8  <j%ϱdO@@@[o垫?؁hz{F޽*gjh2e{ƠA\V˖-s}@ C\F@ /jE+֥WbT۴4 ^| sS   ̯ZB7|G=M!jrB34栗Y PRt-@Tnjׯw Ta 5 QEPh`9VZ5еQFSJzejx']P5ꫯ8n8۰a5m5|8p5o޼pJv|H/k|n䠎3#躧eOXB"G i ];#{ g{ ?2eʸo݃;{?@@@@@H6$e@@@(^j{`"ҥK]T{@S vz-9 ڵm5UB~enܸ1\Tٲeso ySHhV^@?    L iÊ޽{wL =[#B6ol&LcǺj̛7viz~e@(zP@Z{"Ё+ym25טٜ9<2{w3>   @< (xK BMm۶n(4C[I/Zju b@  P(,QϏ ` uJ,_fqZ a(:&Ol_~kjwvS)))SN֢E TG~5jԾ)uTSo8Jrǎ]\@"2}";{j]u4Yͫ4r^4 )(-tyw>DK* : qSd3e     Y _%kA@@@!WvZj$VpP%دtҮ?6]]dmMҷͪکn޼yoC~WGR׌@@5vAFgr!QǖȭZb=@@@x7G=S@Xb{ϑG'i&MEnzgzi=SCٳ(6@r/@VX@ S"-\Es!'f'lfD,   (@ uRg/M3Spd>0! _i)TK6$q WCFu.c2e~ Ňh9UyS;#׺c@_l6k֬p#˗*(hHS;𨎪;)k^sG w[茶>P -[#JuaÆᠯVZGqDa15U#Ws]j;wv瑦۷/p#Wø98,)2 ){ݠWu?_G3~!r Z濫̦D+d6u#_3{ek|cGyMkM5F7d5딿^etGO_G_=?Z{ /A} 2 `S@@@@@@pR8l@@@C@m*զ\L֭K7m3N}[]lPT/}K-jmk#تFlyFk lƩovu6z~ۺvjǚ2GNUffE[}_r9U?5jf͚93  P+  $eL>=L ִM+uqkEy\ =g@oih~i-Na͚53|h:t`m۶uH /@Vc@ AJjҁ+h|?쫯,xȫ~|9soŚ    =urS3u0SXjއ7y-rG6Wd0չ0 12wn̸LԀ)4r:T,?6H&5Λ;w-Y$ ~sk֬q TAYuUAU^pc?ܚ4iB ->:/ՈhM2tzu=B|49 iS~_N>*bTA/qL9+tir?q{Lj꾅@@@@@S*yܨ5   $p-?U?q j٨m|}VշcUՌ1̇*U\-`3d@ oj͋@@@P ڢEs44trJ&gj(4+2KxQG@Ctr{  x ͮW RE@@@b/c>8![g>`Ky^!>mh9j˟}v^x#QN;y?-Y^VSQK5xg+:urcVeZqF7!1|S:V^ݪUYmd&N?S8j6vٕWf       P({YfYjj tܹ ~.4[ouvYr ^l@@@@@@@@@@@@@@@@@-E@@ V5{N0;|=@@@@@P`ʕ଴4:uVR%ر>u'Re@@@@@@@@@@@@@@@@@(@Vq<3  cvfW^iֵY٬[      S۷۴i,555|r+Y5k̅f <:wl͛7wcZ! G@@@@@@@@@@@@@@@@@ Fjb@@Hd07Əᛉ7@@@@@B6ppVZZ϶g] :t رU\91vZ"                 r*  7r^}Ղs=77@@@@@ _&Oƍlٲֶm[޽tM.@A[@@@@@@@@@@@@@@@@@@*B|6  @< icvfY><3kK@@@@@oݻwی3Yiii`WFЬM[nmp@|C@@@@@@@@@@@@@@@@@ jE@@H&o4Ss1:լbd;@@@@@ omǎVZ5ر 4RRRXfU@@@@@@@@@@@@@@@@@H@QM@@BdIW_5k쪫^z(j6@@@@@oݦLJKKUVYRe˖ֹsgKݴI&VD!j                 @Ul@@DS SO5lD=uE@@@@@ 9sXjjj8@_~1-b7pv*T P                 I*@VXv @@h rٵך j@͎8"S     +f͚pxVZZM<ٶnꂲڷoo};hխ[7~w!                 jz  ċ}٠AfovR3     @tvi?S8@+55Ֆ,Yb%J&MЬi˖-tiDGR@@@@@@@@@@@@@@@@@0>   +hYvf7l裹+!     -pm׮]VF 5dܹuɪUA@@@@@@@@@@@@@@@@@H(  @f>k6xYnQ6     @6ol'Og)HkݺuVLkӦ к]G-R                 E@h.  9}ِ!f_     'w^9s)4+55MΝkPׯBm۶rNP#@@@@@@@@@@@@@@@@@Z쀳  DC̦L1{y >)@@@@@ X"]xԩSm۶mVreرRRR\Vڵ!>                 1 P+f  @ -k6zYj%Qf@@@@@PPִih-_J,i͚5sYw굖3                  @ Lj"   ٳϚِ!qYM*     P͛³,55fΜi{ڵk[JJ 6M;vh+WNཥ                 og@@(@˖f˛]yY۶fm8>     P֯_³7n-Z6mdʕ ~nk=zoh5hРk                 $Zu<@@ ]bEVN;l4 l@@@@@ vm3f̰T… ݞp.]X6mL2 T@@@@@@@@@@@@@@@@@r+@VnX@@2(Q쭷ڷ74JtU"    cKó;vXjլSNvg[ lȑ.LkرV^b,Ʈ#                 P*^ǛE@@ &5kcֵfP(     @lݺզNJMMիW[ҥe˖b]v6iJ(afͲ>}!bժU+Aj"                 @4Ԋ"e   oofCuhv     }ٳ----/שS:wl7x~LP~, _¶>#R~@@@@@@@@@@@@@@@@@[@>  *pfSiڴYfy6     PWN5%ax֭.(Cv '؈#,%%jT/N?tٳV\>                  j%Ae@@(J31ì_?ɓ<(kö@@@@+vZ3f}G֣G_7~]s56j(ӧOԋ ;w1]֒%KD֤IܹynڲeK+UTUVً/h|5j|{~fvZ.]ߖgĉs}]Xp=䓾l{O>9ux@@@@@@@@@@@ oǗC@@@@@ P+9#{  @)cf: d<@5nGE@@@@B.fÆ 6~xdӱcǸ_Ֆ.]j2 @| (*--RSSt{nYE]³t]VZ\9 K[WzC6lh_} -'xzUn6|pR͙3^u+]4Z           C68      j%qd/@@+ڵ߬[7GzT@@@HZqĉ&Mذa쭷ފkNz]ݨI`ӦM6ytZׯ8Zn킳}ܹ5j(4:urV=~[o#F؝w?t]ؾ}{;t7ӵ{Z9k޼[ܠA[v_)           @1M1:*     $ZIq @@O}{7<؂~Ց!   $tR s饗wTRx!L+ގIv={̙3]xVZZڼy, RRRnsvYٲeBRMSn&{G쩧+2^ʕ+g_~yY͜wyq.U}Y           DǑR@@@@@@Eu  I-p9f3f]vّGuԻ!   1Pͫjsε;N8;묳6-ZdwY}[r :4]}>s{7{AӸzjS7Z)G}'|f͚e#Fzgeʔ[nž8q+|6rHkԨ 6m3t_ڇ^{-[?o'OJ*YWqڵӭrv8 @:+V,5m4۶mtN?t ڵkl~^3Fm6m?N=T۷ok'|}ֳgOw-5{y]زe}ᇮƎkz~֪U\_t>|رÅxz}vWW_LWQ^           $mo'*D@@@@@< ڬ  Qz6,x&2    @>~i;c}.ꠃA]i Z 9]Xߔ°n+W Rpe)3pAY Q=S\ؖxy`c9-WxB:ۼy[rbA߈믿^}ݶtR_3K_ 믿Gj*;ӭ^[0`խ[׍)I&O̙3]ոq{qW㩧{͛ggNw$L0j֬i:ur!W 캠뒮I <|+]ut]˰aM]cNmmyw(E@@@@@@@@@@&NC     1 P+  < լV- j{9@@@@]°=\2dկ_xSѣ_6jְaCѣ[KW`̬YgP(>}[d)̪gϞ.G^{5楲xb2e_)KA>J(a7xoTQxq*T`s`FZ*Ca9k >]~nAmWa@wܹ mZժU5ٳǮ*]?l=]|֢E \mW^yŕ[T)7b۵kW|_}Y{]HV[Ν]v)Jו.(#6ɋo]_z%kٲi&wmXL`           @\ I5@@@@@@ >,ER   ^re?4}WWN@@@@l[` '`'N1c؅^P Ѽ˗髯j{N;ͽVӨQ#ƣׇz&ֿӡCJ*vgE!_;vp)롇2(seˆ5S^=S-[f?7plݺ{=V)K,Ym\rn9A ֭[g'OTKKKs y߮];;[oW R½u)X6m\U6nk֬q}{gjf.h+|Yzċ/rBz-;CƯޭ[7 -y2           ķmo(C@@@@@ U0?>  <٬W/{sAVC@@@=0mN@QC׮]G.4P+rҥ 0oh>pZ[NbArϺ0_v߿onᆌ5I%k.1cF8]UVU5yd\ߏԹsN>6fǏ"q<(]*W;ŷzK7nԡC4{l=ԩ+SӐ!Cw^vmZfjԨB6O>č=$$Dl4o޼+ܹsyV+f?y+W.kY7o^v @@@@@@@@@@@ ې '!     @r(=E@@+x)>0Vӟ͛ NB@@@@nkN۶mӴib;ŋC=-[֭kY_|Qvrؽ{U>/PNk„ Ç{ h_}UWر0{GTHEC@@@@@@@@@@mdA"     d+8S@@ HK͓ASsKW_\ڿ?]H<߾5u'+*CS@@@@ C Ly\~}իΝ;5khɪURbŊz'Oj˖-ͨQԲeKW3~[믿0 XqUzu=q^ڵ쿢ԩNeʔ߇}T6V`A[A+ey ]ocBc!R Ҝ9Rܨ"   ~/w:uֹYVTfŦv!+={KNںu+VUJNK@wyG>F{.Gj?#^J4+pVnݔ>@@@@@@@@@@@@ y x      R@@@ kKSJ:I*I<>8@@@g5y=d̮pº"#GdH:t|bn-Z_W@jժƍ\[VӦMSO?d'Mtrk:w|%E@@@@@@@@@@H6 IH@@@@@@ (w!  nAz_?>U,0i   (}Lz wXz7qfl .hڵYNѮxSXXFg5jHsN53SW_uZplIFm۶4)uمف           $6 sI؇w@@@@@@ (!  eoʗ:w2Sg    @m ѼyC({nEFF h-_\NRլY3SᮀVɒ%5-[6tKj(9r$Vy-4@@@@@@@@@@@-@&kf     _Z3C@@2رΝR^R&f @@@@HɓY_:u긢Y}ujժٳ .\@@@@@@@@@@@@@@@@@bb7"  o%J]HTr!    @z DGGkƍpW@kڵRҥ]ѬCuӦM?.F@@@@@@@@@@@@@@@@@GZ@@G _)SH^+u(-^,+>c     |tų"##e,YG*O8p    L{#.QΜ4ƍ/n:EEEL2 ӰaܺYfʗ/_B            mҕ#     i*@A4b   kK_~)k')}C@@@V\9eK.^K}-<YҥKuQ͛W7FpU*4@@@@@@@@@@@@  $ 4      %@@vO?zJƏ3>@@@@ aṾJ6sj*W8+m6e˖MիWWXX~inРrsœ@@@@@@@@@@@lmZl3e>      @g  dnݤwޑZCf1@@@Ȃ" s,站Db?Y^rΞ=Ey뮻m @@@@@@@@@@@Ȍm2]eN      Ժ܄=   A|P*YR+Na#   @HK~+EEIK{gyLp1-]Tڿrȡ (,,Whm[W^W` k`      IeW@IDAT            YCZY>3K@@ȑ޽]wIŊI7ܐeD@@@@ 7f}R+Kg fW)mgmذA/^T zȭn~޼y}M:@@@@@@@@@@@@2y|;      s(@@@/$8 !͝+5iP@@@@/н+tԷ/,%w}WÇ}E܋]QA={(22_@kٲe:q˧f͚B]Ǐwʔ)^            @ [@@@@@@VQ  @lҤIRnR?Hի   dFW;wNϟcn_pAQQQֶM/^c.M4|EѴi'Kْ#GUʙ3g_6%N>+V*sNeϞ]hV޽ݺN:܃D˖-++V\9m[*TJ_Y3f?+:¡z>쳸f            Çk׮].[coٳg۶e'bj ]Y>+d&M%Yr1ܹs#V r.Vlˊk\b_;vh er\,eY[ʔ)߶זͱ[~66@@@@@@ (\@@Gn]iL~;}U@@@L²F[nնmܲ}v:ccǎ.pe+[J.Xe|ɖ+4Ǐ˂3hk+fO?s1CT\Yǎ[oηp .hҥ1            ,/cŲ,Geivr 'O@@@ (Z>TC?4x"(ɠ@@@:+XdEb.7o?ӧOȑ,eu]#Y8Rʝ;w͍eL Ȗ5j$8V5a,eY %,j!"E$v(#           @"D[nl<!BE֬X g7o^>o)^,d@0V%RNgs/ ,\skwŵ,KVjXʙ3w(k@@@@@@ IJ#  @FMzmiT)iȐ>#Ə   @ ڵK֭ӏ?_6lؠG\uU.Tzuu#ZjxVʕ]ϊj&/פI8g-^X+Wtm\ȑ#:|sؖ-jE,ؽ{X@@@@@@@@@@@2sO?iӦM{}a7A5kTNdY+UbE)S 2ά)q ɓ_+#'OZ;vpk2o<{̬}RF ]J,_G@@@@@hǃ  YN{}a#+[F@@[vVX5k+"dlٲUѝwީPX*W "`՞={9:uJׯעE|rmܸQ;w]Aoمׯ/[6lgO           ŋyf^e,/`˖-[tWˊT^]M6U>}ܶYVR|dEloںu+Tgs,X@'N*Vԩ)\p\]@@@@@;o:SF@@G{ڶE@@@)`u)""BK.uE*P4hzoWݺuRH̉HUW]f͚%iQQQ.0kGV׿4fWh j5n Sxx- @@@@@@@@@@@@ Ξ= g-[LVrNrj֬vmU[jԨ/@@@@@@ PP+Sf   Թԩ| )U   @>}Z ,М9s4o|XŊsݻkܸqV TK-ڙ3g\+VBySNeEj׮-[M6n)Wwk@@@@@$$7i   %}tuRҢERWg!   V6mҌ34{l߿eŋj֬:v쨧~Z*P@Z @<}xOxmƍvܹz'5x`]}j߾tv骫g           @9V7|N/ӧUn]]s5;jժeY#&@fȓ'Yf'|r?!Cȑ#m۶.c… gF     @VL@@keK>X}H!   ~D?(f   A=z*TcǪSN5| 4Hŋ d @lԲeK.hǎjذnF͞=;8 @@@@@@@@@@@ؿMʕշo_*UJs /UV84@ 9e.cEYfꫯ7߬o69s.     R@@@ c t M(=ks@@@ >|XFr!@ L0njJ*e0RH59r[n/e5h@rZh>ծK           ]4l0WƊ]ٳxNzk M[ȊٵUaH'NЇ~nMEIS@/rJ=Z5O<i⸌$ꫯ?رCm۶U.]ύݻw'kG@@@@@@@@@@@ ,裏Fھ}{WԦwʝ;w_&|F\Wf)iqw?׿y           w}Zjiܹ֌3cψ+׾fʜĵ/L2+eE|Mmٲ%'~-ZH_}R .GzW4bKwƎJn t[[nС 'O&kG@@@@@d PP+  [YE&>|:sϕ!  ͛ոqc?^k׮U߾}Ai*!!!8pBCCe-[?`s֭u=,;nܸd+>7ɚt'WTIӦM?O_>hG @@@@@@@@@@@܀ h"mHN>#J\Y+sbEnT)R={v 6LժUKZv}Fk̘1{8~xԩ ^72v?~WkժUըQ#Y-     Ϟ+#  @>H][Qڳ' !"  ;ԦM̚5Keʔ F*IZ˖rCA>}R,ĘQ~h9sh„ zR{C@@@@@@@@@@@ `|Po+c1/d3ɁWψ+׾@2KeN}Q͝;WљD;ix/q}?z븏Jި(;.3ץKtۖy VF ͛7O\sZjM6p     Z ?-S39@@(yH3fNR҂Re@@@ X,uw6￯ 5ĜߪJ*z'UT)ӧO-SƍCPB/^?\K,Qu}[nmF~g5jHTlbu,$(K/N:ɂgyƍ͎+X^u7NoeҤI@__~O>q'x*^^{5 P"I=vٍ1B9sJ,aÆry=ڙ3g"""tiglٲ!ڵkTh֭j۶믺լY3mkƍPPzGvm/_S{ zݧ뮻g)qbu/Zh>}\{j߾}*^@@@@@@@@@@@\sghҤٞ26̕+WO?uZ}vuU??Pȑ#/5m4+.`9駟Vҥ$rϪU|}Q@}u $) $xp|2'oy\ pnf?A 'O֋/?P}=z˺8$y@/sN79sN:3fyϳ>E)gΜ5/ey*59Rʕsyuֹk#|XvbѳgݲZ_.\஑X_L8Q{V=l2]uU5     @Ȟeg@@@$-*͚%#r|9@@@,?,-4or s׻П_Ws,{5h S+Ajݺ֭hVD? u݅,eŜIJa!0 Z;A>Z     @V漯 @@RAꫥ?fT]"  dj/T!i+eEJ*}6UVBDkժ ZmӦM}־W^zʕ+ REEE :tȅv ;YpĈ*X;߾$v}f!k۶m2@ZHH^xwg}?eܹ.ذaC/Oaի#/_^Vk;.ր\}մikO>ڽ{:vV޷f[΅630i$9rą-f u=mRmSVhs܎DlݺU_uwTTWZYA3kڵj"E\;{~in$)uVmE–,YJt           @\Cٿ+ / D6m/![ M8 X"l]?#GtEZ`AH}zg=[r@IT/_$,,L pş,b_yWh.mE>cW{qʬZJ̫$e\VO?w} 693/nɞ-     @$WD@@2@&Igy0r@@@8x`~t_AuѣGuqѣ6m bUZc'Yoҥjܸ"##]0ڵVOܱm۶u틅@re˺c`h-6 s<-hsw\&q#啎PB{3Z͚5ݦW^XHΚDGG^2eTbE߾nZ͛]-{ϊe҂nv/m޽t|ynO3gC^_V$̚*Tn,j =r Z;4@@@@@@@@@@@J=w*RHZ]2YI,ay kr5jP^\fݺuh|/4l;gDz>sM:՟]'.Oa$v@&ėY٥g>4leYZʿ/%6R2X+X贈ŋy7U\9s͛͘S%+eٚ{%J/^ϻ}6,CE6'-Ɖ     ((A@@TEz5ipT@@@$իWڵk3lrm6mڤ jٲeeÆ ڲeF˕+9f͚U:u5ѽRJX\'{3$$$V?Iy1dYHwѯիWk׮.$n2@LYQK[Μ9. Y) _zޱ|?J.zKw;乱ڥcil|KG]/5YFv*Uo@@@@@@@@@@@b X3gh 6t^&3W4p5.}e"F\ez콸r!^1H>;/13K1W$}1ϱmQXKJ̫$g\Zr[@r>K.աCTrX,i؆ _u:uJfR޽c +Pgĉf$+gy,?g?h      J{s  @ b    .зo_W端Jk*;vֺ:?5euQtBCCcz9zѢE|ubwq .o>ya<3\uSj~5e5ٽ{vrʹץJRTT]q>}\X z#<7%Jpgz9Xo$"QH@/^z@C@@@@@@@@@@@ 6m07.."6lpWjٓKeHҥ͊۷q$i3I\.\ݗl)WIθ ,Nc-_\gϞu }j(EGGxb=s=*vmɓ';~_\pu K„Ӟ={O"`1Kl.1clPߕ /de\^`m,[Lyu[aÇdɒ裏4qD7ӧsc A 乱Эg[liZJݣ.=Z[nճ+           i,j֬YzI\bz7o*Vz)%]WZUɓrJUsN6g$t~j_[.DzG s纷taI~/%*Ix{SN $s7hѢ:}~Osްc_.sȺL2曵zjݻQ^ycϒ须K:t26@@@@@22eb   ӇJ5kJt@@@ [{*PNk„ PDDN:J:pn۶ͭ,Xga2 3lŎ_)xXW_}[oUvΘ1Ol~D$e|vQowr#?x{n_tVΜ9رC7n#<"E}~?[j+[[׮H iڴڵk'{&Mv*^{lʋ9~ͭy݁Až^yY| CA@@@@@@@@@@*uu>vX=裊'nN8^ZA}'tEv$c޵[[aÆRmڴѸq\Σu֪\5kNMZ3l~6/W3>/⭭%{_s4qD{p,cɓ4iBCC5`/X6&*ImԬ53Bpk׮uϮ>}̙c׿UL*UJV+mԨQʞ=}Y/ 2Ŀ/X7 Wڵ]n.Xɸ@@@@@! '@ψ.']}uF1c T`Ri|iĈ@82Ϸ|&u.4ktRHHƹ@@@ mB|h[\EV^zi;6h }w.`m~5,tl2W[nի](+$~ҥK˂V0B}o[w|Z\C.e5{^9st& 4pE:vufΜC >ܹәx˗ ~XbZxVM%4 Ya)+f-22U:sj…{\1jժ@u]믿>B Ϭ-Oرcǵfk:{6lؠJ*lgH9[ػp2ooz!"5 BU@(M@Ox QGOE @"( )$!rw{CBnYe>7}'bM7|nF*nx"C 3LT7?a|ޯ_׼뮻ⓟd҉^ҥKq׊7Yes/suJ/83[}8fΜYy`V^_՘߮׳Pc_?g!@ @ @ @-U@JK}rM @)Ɠ_sӟf[U D\s5ѽ{J|+2|~dT6㡇*B/^\yd]Fz}݅BQ4{NXsmV`„#"f;D#@ @ @ tlCs5U @7ƈE~?n @ Jǁ^xaq'_\)fThԩSd+;FKXK0ܿ|3qm]+Ftvccu粼s7ljV45[_55tСVSYΒE;w.^Y{$)CdVr)k^3Z ?a\~EkUJ{:K @ @ o@IDAT@ @ @ @u'aO\sMH54[mU~qonWZYmy[Xڊ=zȑ#75ڷ5t79ixhnV<>WMՙÌ3be5EyͦuHo^eu~3д.YS:mFjAfiyƘ1c[7|U7j&͹[_r<3qE]ti  @ @ жƺa @Xk8w3]K9 @ڈAP?O|"^kڈº!nJ/ڭ[^l-X˶4X1Y|'7o^QwYgE׮]Wv @ @ @ @ @ @5jT{6."N;-<@渼kŰ&N^j+x 0`CVg\ ̹ w:Ӻ_yo|#;B矏oÛؗ*v+~?~q]wE޽Wq  @ @ @Svн @ L_Gcm5.:eߨ L{:/6/rF~B @V[੧fmSN?>2xB@{'馛b*N<Em)5 @ @ @UNm"@ @Fg WnqG}tnѮ] 3&w;#HXW\QeÛjs= ,Ybbŵ{n|?ϋw}_>UMxƌq뭷O~Fgw3<3:ҥKx+&D8 @ @F@ֺqt jef{\:^>b⠃K>/=_q @ @ L~k}٧(9#nEO@+x n喸_/ 8Scͦ8p @ @ @43* @XϏ p}?àxrH;w^w_,X.}ifΜ]vlx7CѱcǵH3:^_ş/sOlfq 'nm3h>ϳ0 @ @"Z$  @ Ќwn)b"<27/5  @4{M6$>'}. O'@`=3?|cXQwƨQ6rݻ/@xNjus3gΌZ#8].Wzg!@ @ @Z@Mˌ @@6-b}m-oFb첈SW|WTr'G˓#fs$ @4_jӧO_eP_eNlƍB2+[ðFS:??EQ?ٲ(,|׻U, ~B ,\0?zY'sFϞ=#X/رc_~kw#g @ @ @ @6"^wbܹ), fmb-Ν;4%ZY?9Xg)r;ڵk[lE@'vqǢφ"v @ @ @ @ @Xl24Y>OӢ raÆZY+V[U-s,4ȟ _R^x9 .~8裋unϜ @ @ P@VC } @Gw##7 _x3&@ @@+)STaY'N ^JCEa͐!C,ٷhvW紅N>}bܸqE+txW?OUq୷SN-K7lJ-u)6Y~z/rd½ɓ'WݺuƎ'tRl6E^o3}S۰… ,2eJQt]hѢJ*ݲH/ñva8C~noYK|e @ @ @ @ @ <.]Ë̙SѼE+2G)Ν[u oqQ'UEٲ&/ZtY@oe-cڴiꫯV-r˶`۷/{e {QemN6۬, @ @ @) Pk}6 @V p5cF=>We7 @^`޼yUH²ϟ_%2fȐ!E e8Vr_7h/н{~틶fXZYe1`=HG-3gltzN`M6٤ZgA`fkϐl={Hymd8V峞1cFQkE,+YWYf5D/h4,ɶ;P#e^Y @ @ @ @ @ @K XFQ#Cګ)kj2hʔ)OAGYWH *õ&iרe=MuRӧ=:~&or58ٲ&'koreNw%K4n\V5}Y|Zk @ @ !jmu$@ @ rK;G}vu׵y @43 )b'V[徆!7;v,n` 9 ,KǦnZ~E!`,iӊ®gy*;w2­,ZYثW 0~{Q,`,P,C:w,`7x#<[sr;L={vQW,˖h# 7ˀ\ov1a„"H-  P]vM/c @ @ @ @ @ feE[2)C24瞫2piҥ\6kbp:Guz\-ùv=@>f޼yEM:ɺ'iϡiڰabرkYp8- @ @ @$ P%=-c%@ @U leq{qꩭjz&C @@3P '*uӰ,* n2&hʠڪ1{V۹?[Ӿ}f:sj)YԵ[muƜo~-Ú yz嗫~³;5oseVÖE]t) s YlةS":Cz:vڊZ<.te[xq/-Zҩ7ߌ 0+/[Y>rʖSPfbˆeV`!gr Z @ @ @ @ @ @.u&uuuE[ݹfmIdMM0))Sğj;k2)NVdG4me]M)kmΦikZcSzU69ڔܔ7 eYڛ-gMߔmu>)ʚe}o^58ְY @ @ @@kڟ @ Ь=4⢋"9'b#vکY @h*) % i@!Cȑ#mk,s 4',+k3,7o^QWf`$tEneT <',+aU~L8KMkD-lm\ ˂†eb./  0Da6/[k!@ @ @ @ @ @x{2x*B%ka\ipT֔83f!] *5 Z^5K[uMn5iڛu7MeMєu7徬i,7gM[ܗc @ @ @Z@֪A @*FEkSRoܟ @ @ @ޚ@l @e"~w+S#n-_ @h!5yUe͙3Q&eO5jԨ8C2(w9: @ @ @ @ @ @ @ @ @ @. P?!#@ @M EoWqymb&I @ ,Y$^}UekAcU0ְab„ vտh׮]u @ @ @ @ @ @ @ @ @ @5j O @hɏO}*kQZŴL @@Xtid֤IVaZWc <8veFUWW;_7 @ @ @ @ @ @ @ @ @ Ц|+cz&K @@s䒈{8؈ѣ @ٳg2(kɱpj=j3 lO/k׮9: @ @ @ @ @ @ @ @ @ @ Z @l0#~v8̈`Cqc @F`AX&M'7ݞ7o^5.]ĠApѣGW2(kȐ!ѳg @ @ @ @ @ @ @ @ @ @v$@ @z}g|{'^n @Zŋcʔ)c5 z׫v!pۮ{j ߿u @ @ @ @ @ @ @ @ @ @݁ @k,pA\qcD Ɨp @+tҘ6mre1<3 tMkT P-  @ @ @ @ @ @ @ @ @ @@ռ @ @#~Nx衈Nt @X3gAY p{ʔ)hѢjzj7.ò:w\C @ @ @ @ @ @ @ @ @ вje @! кᆈw+K#. MT  @Zo aYϯֵkFX{ 2Ѿ ѣGu @ @ @ @ @ @ @ @ @ @@:Y @ J W":+#ܳL4 @ZEbEXĉЬ *[5kV5;`#FLXV~st @ @ @ @ @ @ @ @ @ @ڶ@͞ @ EO>ѫW ! @4{:ujP2 +excҥ|ڵklI[رc 0`@o߾  @ @ @ @ @ @ @ @ @ @@| @ @`v;DsNü@ @1cF0 ʰW_}5/^\ݻQ0֎;h{1hРԩSu @ @ @ @ @ @ @ @ @ @u% Pk]I @֣]qqQf.M lΝʠɓ'ǂ 9t=2 l{g2dH/_, @ @ @ @ @ @ @ @ @ @6@ % @XCC8Ί?>bM'@hofd֤I6qĪpߜ9s9t) Tb92>hէO @ @ @ @ @ @ @ @ @ @U@Vs}2E @|wq7߼"@hVK,W_} Z^PVfM>wkᩛTX[ou7jǴk׮:O @ @ @ @ @ @ @ @ @ @@KՒ @ z#=0 @dVa5lM2L+Cʥo߾UPcԨQe 80:v5 @ @ @ @ @ @ @ @ @ @@m9% @H_%C8眈kE3 @@3={v j.\Xv6j5a„b;C RvZC @ @ @ @ @ @ @ @ @ @?jB @-F+#33"n @  @T`5wj;wAUXK0(W^9: @ @ @ @ @ @ @ @ @ @@57s @6@]/qd @ &x2e*òf̘QC1`"+vg} x㍣]vy: @ @ @ @ @ @ @ @ @ @ZU  @ ;"=7b"]t @*tҘ6m*N2kE{;G3<+_ ղ @ @ @ @ @ @ @ @ @ @ <j5` @X++/""v.$ @5kVL8QXVɓ'ǢEٳQ0vmh; ]t!@ @ @ @ @ @ @ @ @ @ @ej(  @ \>}"8Ĉ^av @67x#2i8V<\vZae ֐!Cb̘1UPV/=z(O&@ @ @ @ @ @ @ @ @ @ @ jet @h{GqPSOE(, @u.hѢ2e*fΜYݻcǎQWWWc1"j;ó2(_~9: @ @ @ @ @ @ @ @ @ @MZm5 @L#>3ZLX1mڴ4i ò^xᅘ3gN5vE`-"Ǝ[mgHVe 0 ڷo_C @ @ @ @ @ @ @ @ @ @ Z @hAxGg?oqIÇ* ^eBgM2%/^\wU0VbœO>w^}+^4hPtܹ:G @ @ @ @ @ @ @ @ @ @oU@[t> @YgE\w]9D}w3a @E`޼yXMñn/XnݪǞ{Yl+?袋j,O=:vڕYgxa_cر˼n L6-n&Lqג,=ַ3a @ @ @ @ @ @f6 @ @ Zj'i @y"?###9͓ @-N`…1yUe͞=[NbUXȑ#3<+[߾}sv??",+Ye{o<+ M>=xӟ$P!>K.-=cƌ/c]w#Y-_|x饗" @ @ @ @ @ @S@um @ @ @n=] @T`# .ZFDt8nNC`ɒ%1u"(kҤI1qĪp^\ڵk ƍˠ<&]eȐ!ũy38yL<#1jԨ?ı燌U, CLG{'ᄌbqYgO~xǵy~c6[ 8 @ @ @ @ @ @jY $ @ @ @@f0  @B+"n-Sҗ]X@`5 ~ÖYjdV۷Q0ȑ##ʐ\4(:v\۽{"kM7-B7f+w]{Y^$@֛K/|~=:tP[GVs{"C @ @ @ @ @h]mZ4 @ @ @mocmfI @f#п>G lf  @E ̙3 P!Yeɓ7߬F5 7n2AYխ[r-xGt)N=Ըꪫ?i\pbGq[>lP^ڡCS~8~3<y/B1uZmg3<Ol<0˖aF~ѻwXxq^{m9k_Z<ӵ0OŕW^爋/8~}W7?|3CYgU裏.Br7pCdVaGܑC -|ڴiկ~5xٳg|ɅAI @ @ @ @ @ @h3m۴7 @ @ @6$о T  @ f>ZF @X`Ač7XBdXDJ> z*N,20"&>5\կc̜93Ν=\׿EG>"b*$[VzѧOϏKFb>\K?W_}u1o޼rJw^کCo?>vy"jq1S\?]w5N:"yaeXf׮]4FUO|\V}{vۭ\vaE{㮻*cb~H~̚5ؗ0\r>`yg?/R98}__| Ab\rIL2%:FT @ @ @ @ @ @z6mZ  @ @ @@Fm @h} vBAЪkr @XdI0iҤ6qb]nf̘Qe`C]]] Cr{"úw|.^dV^%Fǎ[ijK}fV~8St @ @ @ @ @ @Zz?_6}nv @ @ @- jO  @h{qQ'[69fKc5 SF}}}Eѯ_FXK0,kѡC(06|_Zeѭ[&62L+ %- @x꩟Ŝ9n ƌFx`w}q-Z 1bDd?o?Ad8b;1o޼:th̚5ؗ!Yˆ %V+;k7x-V~eWtҥ6,2,^y??я̙zkӧʝ9_%׵kX @ @ @ @ @ @hmVoަu͎ @ @m_޶ @  7"9O @E d@äI4(+_lc5qEVjeW\{G?a|~FF~3gN45X@; @ @ @ @ @ @Zz|mZ[T @ @ @J'!@ @&}F< x-W^y%y䑸[ꫯK.$N9cĈѯ_"a뭷q '_W+n8餓k_ZySOӋ lȠo1G?Z{G;zˏp]h\y1  kױQ~jxeG~ cq 7ĵ^qmÇF=⦛n?u\/Wt @ @ @ @ @ @Zz6]n @ @ @ ͜ @^Was#nS6AX N:ujL4j'N< Y78 Rlb̘1Eܗ}k1*]gώO~qgǰaÊ3<[VL07k֬jH/Rџ1cFOX_]b}_Wq-{FNڿ"4wg\8Ë@r_[??OZ-BO:<@qiӊ__yrAZ\pA}{_;Cn7OC)^c=sqn/5.?~|q^fخZ @ @ @ @ @ @mE@z^7O @ @ վviۛ @'E:`@į/m~3.Z8_Ùws}2ˎ7qQ Xu{ @u ̜93c5ݞDgeEuW @@`M_b hϏ ʀ2 j=o޼JK.1hР*kt- *C ={V @ @ @ @ @ @ @ @ @ @ @-[@V~~FO @$OFrHēOF[ hc/)S2(_d:tuuuU8;w} ʠ7޸:G @ @ @ @ @ @ @ @ @ @hs6K @,W#v!K_b'mL`ҥ1mڴeM4)&NXW:6t3fLAY2L+C, @ @ @ @ @ @ @ @ @ @ @&@ @@8/eXh3g,°ce)SbѢEB^cmv1dȐF2,s9: @ԩ??1bˆ;lQ=Ǝm @ @ @ @ @ @$ަ5=Ms!@ @ @@sr @ZqE\rIUWE|˭v&FU + j5ʡk׮Bv}eѣ:G @+P_q! 0e}˒}(H ҮCiѦh_TR'JJE"$ "5]ifyܯ~{=s^gMtJ(;@@@@@@@@@@@@p`MQ     .@VF  @<]wIO566 bbbԺuӂsۏ@@0_ޮ:w>L:qtt>A@@@@@@@@@@@Wۄ띥_      @j%§   @(_^2iH s縛;|Qm߾=A8V,{AT-,Xbcx  *Ч4uj{ר!իw|            @8 0&*}B@@@@@ P+i>E@@rRҲe/8qvܙbPֶm۴{n?sʥRJW6mڸODD8^   )pRTtH³F 7$w            m?@@@@@@o   .@][9Rz@ Xa_nݚཅiY/^c+Wm7n|ZPVtt"B=    KW\!M {W            䄻L@@@@@@O   @A矗Kot$ŲAYٱcm)X`v%xGEE   }Hw+#"$_.V3^!            SoS4D@@@@@.@VN    @"뮓|P;V80їE e:tylٲpMU\9"E   .^W}(W.fgA@@@@@@@@@@@@ ' 0&'u     9Q@x3   @ҵJ*u|cǎTòʝ;J.ʪUڷooYuY?~p@@@%/{Ko)?.<)ꕣ,            ~)x     Za}{   6[oF̑ڵK98*N:ݻwk֭)eڵWW`yX˗W˕+^)SFł   5e ?X@@@@@@@@@@@@ȱ̷ɱ#     @ P+l  *PԴ4f Z~?-(+qpuq . N:eaYe˖U|@@@ }ZIҎҵצ\            @ 0& G@@@@@R P+u#@@@ N<h߾} #G?Lq'N$iÆsuEǕ;wkddiϯ (mBTX1FEE}(wF|YJ,! `۶m;mMeyYue&    @N:w^ڞ;v̅۶x+sgg}m7ͫjx[jƟ3cVj$g6[oESG`͕+=^V|VNJeNk      dZY@@4 پ}o`Nڵ`"̶Ze JZ Kn\-ok,&fʗB?dܒ/_>m8tRkҥ](}ΠD޽{>P3;3V~>,]eխ[W;ve+Wν,   +`ǭYFVʕ+~zm޼Yl"-6aς,VPM³yѳ|e|_v(Mg>]/N87Y`E]V{f‚            }Vd^z56,@رc i 2Y}͛& oJ<&6iiYݑ=bȂlkg|oiҥټK]՞^- okjUX@@@@@@Ptꝣ  A-p)mڴI+VO?+Wjn=tk Z rj߾lYJTre@3l sI+ mF7nd/>s`gVZvz깭i/|L;Vz{$gO`^Pm[n70@cx   <gĉ5o<|5kԅ^[-Zp[Mv{xb-ZHf}'̞[YVաCY(:             @ ܹS9,di>66l[HYPF_ѐÇެVFjTF U^ݿ=U`0k @vɒFHn>G@@@@N@J (@V͚5saJ=s< %*`ľ{pB޽[w?ڷoB˗mɊƷcG嗳j_Bc{oೝ;w {KS ʲ>{bl@@@ؿFѣG կ_?u-삳s7mrܛo1cƸ ;w}ݧ6mڤ       $`>V    @ X~˗/O?³=\r,/f͚ AoXY_W\GzTn]5jȭnuxX@  {H@@@@'n@ P+o_gWs͘1hYHR˖-]q;O-ZP…4*l@jl6lPTTgK.QN\ZVЊ+W.ݗ|Qץ-[ӥz=֯۷zKeĸ6j,   Ç߿ ҪR @)?~\SLooFm۶Ր!C\x         bb'@@@{xb-Zȭyfwe jРׯjIs9] (-d̯XB?[G=v옫b![M6Uj![.ǂ%@Vh/Z    @ w!Z!sθL:cl9`/%hn;wN@-RbԹsgvtExxZr6@rٲeO5e7~Ʈ [|#Jrʕ~Y11cƸ"Je״BsIy4ZF>{;w0X:{)S`aY%KTDD8^    iӦn_?{U`c}} &l}СCyO       IXib @@@H}n wv!Zh᫯J{ ѢIp9$ ]%JpF={T۶mWt$-uVM8Q~,XenM7ݤjժ%}P2߿_^x۷O6[T 6xoxk\6B^|1J|RWhر5Ax!ݳ:+ՠhΝ   E~G+T=G7n *]س        g"|3b_@@@8_W_iڴi/\`5GlmӦj׮I U:[/^vN:¶X@ {@ @@@@@o *@Vgř€F^{MPn\xQǎ X3K`zwGk׮Յ^H;v5b=zT'N8m ç}nؠ3V ^{۷˂Z,kʗ^5jlNU\c    K.ՕW^~~7 y[bNu=hСV&rZ@@@r޽{esJ{=͟?ڵu͛7iUW`ӦM:uL)={Z+-[ ކ2P@0t @@@@ P+oMG/~ kd-[vE5kA{ȺFp%!`?Ço!+SOf͚. nĉ.`]tҪTiaY:묀C҆ N   dQ4` 8P/rʕɉ_|.R/^\_}J*3       ]@@@@/p)}=z 牎v/^s۷/ۛGGGk٪W.BUbEDž_^6i$Y]RQQft8   Xd/PB;Yӗ=p@8{f[yWݺu5~x=աCvO6Y՞iDW_}u      {! C\!{W]te`\6; FFFO3N0A֭~.PөS|!N   @&M3fz@IDATvkԨ, B v؞-؄ҥKSf?y6qծł           $eW[[oՋ/RjKZy۔5Z'6zCi֬YS"3=oJmڴ)C>ɽHm]z4w\͙3G>`vv#     @"f1E@@ P7|Sqqq׿!_|kӧך=~K.Q } hȑ:qz+sٲen;SZ\; dv=ɓE($eKOZjv^}ڼy[hWvO^x3lA# [j EI/fA@@@ ͛Xu5ڒ󉔞سq)**Jw؝:u]w;b}wg@w!{ߖΛs3AuU{>r& t_׹sg}Wz=@@@@@@@@@@@@  ~SI?v옫7߸ Vw*]tڵKcƌUjU=*SϱuVٜ>@qWdɒ',YD'Ntu.l^kOu]ثͲo>Q"E\]ԶqdunTzu]pm6YH\fқٳgz'G#޽?W4_駟/L:ݛ~Z%7ʿC0cǎե^˜      Z}h=  cl_… gTM0Amڴqf̘5k`,k~ـ7̵j*dӬ(6@* 矵vZlRtEx{mʖ-?X;vP.]RN߾}@-;~Ӟ={daR}Z6(, PXAe+ڼ~z7>K/O²l@ծ]jYx p{ձcGVJ3Ǵ,faTG ;Q6k֬YLbl{_s5С>s}嗮e 2ąmֵ1 ޔ|?je66G@@Hয়~rAT'mt`;|"/V )6A^3 eo׮J*&MZy=MJtel9:viD>[FQ޼y-Q;&MIpjN           a"`0ĴiӔ;w6O|Ai߾֭SNP$ T\͇z euK,b+W΅#\Rwq;LLjdX9sy+I3EFF@.4B?MJu5OR7reZ%f_^Z-obGN]L^[p{YaY-b?g6,]Ե)Zc簹7tlͫ.?t[nEk֬Q]ȓaÆ.@B^Y+zMKu;h?Bz6_3СC9眣ÇRKGԩs{dukX@@@@@@ rvi=  @NAC-'b 7 ٠5e˲e"d HA^ّ#G4{l7)O7A·;ouR[xN<&Yڳݻwg@ӠA?oߌZMn3裏dl+W.G}T6OW+J*> d5 TKեKLf^EIp+YWq>)]Ν>Om.UW5      @9@@ 0ܹؾzuuږ-[k]~saUVMwremڵkԨQ*W >s`1[Rc7]5mԽo _v}ph=\w|)%k%/%>&60wz7ܠ.[ PAk^PZŊe~am޼Y?>@/y?zx'"3|cX@@@[@O$BmMh &LJٳo9ݳ"{Fd7n:޹ۮ^}e6+T^7kLC M"6ю@@@@@@@@@@@@ob*ڷo qqqz$ 4^%tA8"Va=l-[v\ӬY'O_:'I\jvt͝ѣG6Y@@||fz.%Jp_[- 2[ ,rn.ЦMɓ'$^K.,Ot 7Z,֟F_V׮]հaCowM$X]Us[ _r&󕼟% Y={=P-8      @fʌrN@@l<ѱcU}Z|yƜ,blF/ŋUViݺuStidAN RF6XmϞ=.oP :eKnKxKbl+ׯ_gJ/ v<7 O`'[-[j޽V6~[Ѳ5j} o{˅5o^V^k!   @RcǎL私5kLo:u}uF@ bV/o{u7W^.X\ve.pȑ#n#IYrjժ x:J N7K93 kڴiv7#     @@HI7~70&=.-ݻwפI\X`_u S_|k]_rIl68ѣǧmSidS^uM2E\sLſc^dvl '*/ ςF5zW_;ٵ7NV4&2|bҜ9YzY.   @Ӷm2%T+O/^\6n˖-ɓrʹeʔq-Z111}I vJ{e@@@@@@@@@@@HNA׮]㏻:{5B>s Pxevر W]u :{mOIF' VK.Q߾}oVZWov'LeGa˼yx.P\\ƌ˾>}z Lw?ϟķ}2z.U/׭ޚgT      ]je|ؿo6H.`*8eɓ'6븝23| RNTHYSD/ڲ~7? zUlY]ve/] ZΝ0{WK{ァz݋ɓ'V(|ذaDV^ۮպ r=@@@Nh#5**JSN=t~_wιs&hŋ?~ ̄76^~}-]4˗kF/\kڴi 3Ԝ@@@@@@@@@@@L`ĈZrL]Yg?Cit5h֭R{8py"6ocȐ!ڰaz}Fd< ވGY_z"֡CznVl_}?\;O*kh\ UVhǎC4gݻW^ѣGݾcsl1cFCJ޼j$hDY~nWQFA"      P+ "PIʎ|}F ҨQ\g}vFfΛ7ovf˖-3oS}?'NTǎ5zhvm5|p 5e=Cp1_ۤIO?*;7߬ٳgϞ|Iw pꫯulcҺXT=Kp/\+dמ-[:# z=B>Smڴ)O{XVѢEUR%7 >-[7W:M0 ^tbwyn9@Wzu}YyiۋWp/@@@ /믿O9H2/+ok= Yzŋ~$wv~sٳ'_v{9wL234ʂ           $`N6s=g y3GyĝtMNHjԤIUR}&WZ][j=,dXM M&[EšeK]t WG _Mi;h uJ5O7bcV[o"=ai|,,w\vN\kdΝ=9 # >bE,Ymɒ%5b,`7fծ];~݀5+}N7,Oj֬aW)=HԩSݳhV6A .PA\iĚ5kdN̞:619c 7&9k=k2;g{=?MWf͜Mz        ~/͙#!   @*T 2d>Sl*s͏ȟ?ϟ}5~7\=[nE3gts:{qٰ96R_ f͚%kb\Uzu)SFJf[ؓO;o>Wx.tXF:t,XX kyl2՚'6&z#V;ӤI\!r5(::Z_bNbYj׮??Z%Z'j5x`e}dfeY˗/w5QVWd׮]_+…YpڵkݜK98ՆywσՐ' KUXe˖jϳe˗Ovٳg5b絟g}v.s=jŹN6#[?={TΝU%>eo񆫽b?S jˈssrرo|9@@@@M N[h 9QB?$,mۜ(}gɗi$X2A ȑ#eɂm˽~z7͂.8p ڝ}~1mٲŅɃ|#m߾]ַ~͛p;C3fбcrD 6mڤ#Fcǎ*],jժH֭l 3f6n( $:tbbb\`ѴiM*ٗOf͚ hҤIZznEFFzޡIp}@@@z_~QeτX2W`u5ר_~/Uh̽(gG@@@@@@@@@@@'PD _Ӗ-[\HϪUԹsguYڵ^y74:Ç]T:u\؝+_|vء#Ge˖Y(     A'@V (t"P+oh=nۻᆱme˖uE}gΜIV6ߣv[ZnJ*\W]u֮]ӧK. Z4dKC@@@r@ƍl2um![[S:uJTV-|>ӰaB",򑏤-xK'K?Q @ P/Z;|߯t 'dĈ۷ot.;n矟Uhg޻.S @ @ @ @@ղ @ @,P~{rW}ݗ?yg!o&~3VlԒ(6luY5[('V ~֬YU]N;]v٥Zzo߾ J2- Pe??'@ @ j'j< bjGsdG?ZKX'O?t~VI%(luСV&Z&uرNzZoq7Lz,ƍ+RŞKv-k֪N]O%/zk]tG' @ @r sE˾~9өSnXdԨQ G/})%B @ @ @h.Z% @ @`UUV _0߮B uj\7xUmh3g'>ˏ/ P?C# @ @ Кji, ТjǷ\?:Iu,P*OA{ケ?)3fH.]I?o}ʺvۥlѣGk3gN{jc`2|ʲgРAպ뮻fwLΝl<~9I3ϴ @=7Xk;6믿~:z @ @hZ52haZ[^rI't nʤ &T!K%\-ӫ>" h(V[ni5n:V& ଆ uҤI~zV[lE;ahژԒ[7},6-m9B @Z3ѣGWqҽ{|~Wke֬YUߞo /?v;saUc 草 @ @ @ԍ@y:B @4Q=U=RӢ5>S1cFubԫW*\k6KYӸ߱l4ygΜ{\Z~#5y*D7lmU7 mO@V{FL @ @j7hSZ81PL-Lh+Ə_m537xY{Sʄ~o߾|ͫm{jDs4gΜ<^O˩N ju3  @h廄k6rK?<8{veHT~ڗ%4w]}{}ݷ g}ҩS8<}&@ @ @ @Z@t @X)_|1%X駟^oXJRYK ܹs6d*xo"gϞZ7hs-C^K/TҰ]j,N:q۷>%!Բ)mZtx Z> @ @ԓ@zzBmZ@Vs&l|I'L{ q*ANe}DT&o{ݻw馛V2a[ j?\eRWUB䯲I_źa-fϞ]Quرr-Jق>uӕ<ϭnR~zq+ۊ @ @@} ̘1#s;_;y{ޓw޹Zv*nӏ%%}}UKyivBJV  @ @ @ @ք@5 @ @@= :$%X瞫h,Pc_άY~Y7nB=z_V/bݴknvi>^R'eW_jE+4--lP+`ToJZGSR[B"Z%@ @ @`U Z'@) Pk9Zi: Z@t OO=T&OU&P2ӧO_]v&lpsuuIYKpTY䄶2q뭷J)F]^ʄerX$2!j5,:tFmT ^}i %lRBJPY9;O4Z$@ @(0sOʸq㪵lݾ}7%|/QhX 4{]RNa-a%DkڴiaoA @ @ @ @@=Ԫ @ @@K()yK/l5hf*K}Rcѥq-)뭷^uo%Ikv.]RRϤvi[RNPqjx}7( R'eqk!SR?.ɼX7-VհZus\Z-9 @ @( P5>Uc"@) PE>73Ϭ. (P#`E'ke₨īy5RS[+^˾R̹cǎk^Z&͙3g^tߢY Z%-;w^l8lP.Y o\/}O~2I7+ @=ȣ>ZXM4)O- @hn]IuѶw)/r^~xX°^va^ngqA[v=zh *naU~g!@ @ @ @ @ @ @I^uc+&ijx-y ַr^YKXՂix_j43ixmyR~WS~2)Ze-T ۯLsvU=k@UKW OYpmҵkתnJy" @ @ @VL@֊y9 $AR(6`A.0H} -Y`뭓gIwjq @ @V P~׳gjm1 @ @ @ @ @ @6*PڣGFSfĈYwusw|sr-|${7v @ @ @@ hB @V!ЩSo~*c-L#H>K_ja#ɼyO.( @ @ @ @ @ @ @ @@O!Cdڴi;HVInɯ @ @ @`Z#nJeڜ̙Ӗ}u ۑG&뮛זJVY|r?  @ @ @ @ @ @ @ @Z3rdʔ)UV>}؀;wN?3fu  @ @ @ P x.%@@lk=ծ!r_zr}ɵ&뭷rmtl@r @ @ @ @ @ @ @ @ ̚5+Cĉsg-\C6,W^Y] @ @#Q@IDAT @`N'@4UHKn- \}rɏ~l],Mb ZMs- @ @ @ @ @ @ @ @%̙3'Gydvm߿]t#I:uJJ  @ @ @@ղ @DV2èk'H9&>|k]wVZ@V(  @ @ @ @ @ @ @ Xycn㎋=oM5od̘5qw$@ @ @h@蹖 Æ%'&? r̘rHү_/N!L R3 @ @ @ @ @ @ @ @:8餓2z\wuc=ꮗw$Ӧ]t @ @ @`) @`U ?={&\]''<3s֥ O@v' @ @ @ @ @ @ @ @8Sӟ4կ/<0;7:I @ @ @u" PNn @mK}oaÆ j[O}K<첤o{ow#ɛo&S @ @ @ @ @ @ @ @hMg}vK/ATC`d1c궋:F @ @ ZA :=4_^ws$?'\կ&ЖFn"Ы<|H? @ @ @ @ @ @ @ @*PJE]>ͭ Kn%9s  @ @ @I@V3Aj {\qŊ^|Kߓֶnɷ!*jJ]m @ @ @ @ @ @ @ @V_#Gn;w<䭷cWb @ @ @ZkM  @IĎ>z~ּyD4]|9&93ꪤC+#k'?2W @ @ @ @ @ @ @ @ʜx9s)SזڗM6Iv53f9H @ @ PGa  >d؍=7꫓6jH`Ez"^%@ @ @ @ @ @ @ @ԣu]c9&#GgQ]\j Kn!={9H @ @ P'A 6 Hv!5mߨO;NKJ7_Z"VVu @ @ @ @ @ @ @ @;vl8&&-p:4yg @ @ @Կ@FzHrÓNV>P[e/ydr)h Z!.' @ @ @ @ @ @ @ @JCҨJúۊtf-OƌYK @ @ j)y%@?NVvH٩M:KwOFZ]A`U ZU%@ @ @ @ @ @ @ @Zx  Ri2*ڵ[7\ŭ\w]2o*  @ @ @, PɄ @4M`#L.im |\{mҭ[403y^ @ @ @ @ @ @ @ @,^`ĉUn햫*:tX-ho z{ZPu @ @ Fjo @@} }w}Ko[G?z*5f޵=':ۈ  @ @ @ @ @ @ @ @-Uӿ3&;wnCYߵHmL  @ @ @jC% @ s緽 dyWj3f$t6!2%Aۀ@ *ԩ_I @ @ @ @ @ @ @ P/Rݻ[o5VmB Kz*y&4R @ @ @U. Pk @`J@'?זּ+pɔ)I>v.׵{3{1 @ @ @ @ @ @ @ ֊Ci׮]nѣUsһw2fLA @ @ @Z@V( h;&\rɴi-}4˒/O|Bn]Mh)PI.&@ @ @ @ @ @ @ @2ӧgȐ!z7rwgϞ^kZ^X @ @ @% PkYB @V'&%?j[?)NK x&P<6QZm0 @ @ @ @ @ @ @ Ђf̘8 SL´ӂzr]6,81yѕU @ @ @^@֪7v @r t~}ۀk%grQ0 [k']$S3 @ @ @ @ @ @ @ @ ̚5+CKMߞ-ܲv-n I @ @ PWq  @ 9WK/A`yɧ>NrIKV>}ҽYԩ@ @ @ @ @ @ @ @ F̙#<2sOn߿HttP2fL @ @ @Z@thlw\oPj5e BmY:y{?a„ 8p;Xw7`ܚ @ @ @ @ @ @ @ @Q`޼y9cs뭷f7oxl 2eJ[q @ @ @Z@h#_Zsɥ~3|'u6~ 0;lCuUE @ @ @ @ @ @ @ @6*pI'eR䡇js'ݺ%u @ @ @Z@thkow\;ﴵo@ U;C/|ao2{<8p?v"P] ԪǢK @ @ @ @ @ @ @ @@8Sӟ4կrWzjs;'n @ @ @! PE<&$@ڢ׿L\zi[12r6maG}4f0wu(Pz;K @ @ @ @ @ @ @ @6$pg{^ͥ9蠃:d6J>}ڐ?:lX'} @ @ @C@V}< @K`͓Ojs2skMu[xǏOǎ[/|;u&P;7߬N @ @ @ @ @ @ @ @ uE裏ny߾}ӻwmi#I:uJ-X  @ @ @-C@VxNzIQo|#:56 F}5y%_n?kֻCvUGCW @ @ @ @ @ @ @ @6&pqȑ#~7Ç_hp@_7&~%cƴ' @ @ @j9JO  @6(&$}4NJ>z&L^u$P&VuHW @ @ @ @ @ @ @ @mD+ '>;rʻF}駿k_[1lXrɴimiJ @ @Zh_r2wnrm rH6y-yǏdGH`u7߬  @ @ @ @ @ @ @ @ \wu'?;Nk#^!~ctӊ_  @ @ @U' Pkj ,믟~gi&5R#F$/tNYK'zꩧ2`ş`/:%y:ꐮ @ @ @ @ @ @ @ @ZرcsGC;3 &zH+3fw @ @ @j\JhV}.+ךYՑE%W^\qEfKX6o޼ 8p'9BN:tHfϮ @ @ @ @ @ @ @ @ СCsj\]fܸq|+?aÒ[nIf\6\I @ @ мSk @U"йsrUW6AiBkPӓ!Cޑ:d-X 뮻2rl ]7pCeرk3zJ:vLY%Mk @ @ @ @ @ @ @ @`jELZ!5jT: ?N8VjOm!@ @ @ԛ@z{"CX2jRNr̫O|"E/~_H\䬳j(%LԩSկ殻w]]S&}ׯ_N:餼 9êЯ~8/RB؇1cBF{<0jfLnr1dȐ!ڨ/37 @ @ @ @ @ @ @ @ P>Um[oű6tӪ.ɸq㪺$>&''޽{زj,ٳS%\\P{q:4&pVbf͚Uw=ȑ#kAawVtKnr5פ!ki5_JKKS @ @ @fhLh @`5 ^'M LZTr>MOuC=3OUaU aΟjbO|ӟn8} *A] =Sk d#4Nzꩧ뮻O>_||#p!ɳ @ @ @ @ @ @ @ @4ԩS]vӣG%>hР@-˒ +Qdy9z]v-ؚܲ/劃:([mUuqR 5J]M7ufxAZn8?mE=s_TJOHd۷o5gϞ //* kzo;_~yuǧL*Ve_پ˪M''̍7ޘrn _/FYmu]o~Se:@s94k(h߾}:Ԓt钳:+fͪ6#Fdv[~ {39sSC @ @ @ @ @ @ @h%iȐ!)5@,Z_dѡ@o/ 0th T-m~+_Ʉ 2jԨ|)QqnݪR_pYR͗rβjZ3ЇJpVrg?jCrv)?p^~XL47^zivaXK4 mx%@ @ @4@jH; @W?HjHW}ݭi_R2~|rP-[t9mY{֒պv{xpZ-n?ظ{yS&=]q9ZU&Euׯ_uNW^յ޽{뭷^: @ @ @ @ @ @ @ @f1cF8L2 ӧ2[-N?|u2On'ʰHƌY|կ~M6d|)u_JCݗ>8۷ꯔÇCUHVCKR륄d/ρݻ7/KR.X4 @ @ @4@fhC @k@3}MrJcn[.(p\uU6 Y/wyµp WǎS&ͣ>nݺU-)Pk;kR&n=#U0<) mITe)]N8'?9眓]w5sO`آmGqD*|렃~WMzgӿo_. @ @ @ @ @ @ @ @@5kV'殻ʖ[n\ciqƥwuM[яo?^՟3gNQF})?яR,Ku @@]yf&ɈuX'L%GphׯaoUx֔)SVY͗rT)5]͛/8sNoST&MT ϬZ)jK[T\Ժ4Kc @ @ @ Z} @"ХKr%MrJ.t v7CImbYs=xwݸ]6x~o/tβޔkriU|+_ix2iw_Wkao䠃&=#G?O>9/b8t]wL.+F?ύ̝;34A @ @ @ @ @ @ @ @c=qM7ew\ 4hZ{on]Iɘ1YΝ'ejK >+T˻ׯ5U 7߼V{y饗2tЌ1©RfY˒jL:qMK;N @ @XP@ւ  @-P`KQr)Mhih]g_N- *i<~ /*<=Xuc?|3y衇}w\f͚nuwL+\FJ?]]wKDjguY'ԧrꩧC;lM?Ӫ`FYm_dL +dž Vm]|DUoΗ 0 7vA @ @ @ @ @ @ @ @5 :%WUwߕڠA'N|W}EiBawrwJ=?ư{GYZ͗r^o-Źq- /T;wnPR>..[lO|FQڵkRC_j?Nj=Yj]m @ @ @I]^k4C4AoK6(CjBC.m ڤd&Y}%P3ֵ#<23f̨&W͙3 Ú>}zथr2j|ͫ sσ'xU&IknE.ϴiӲkSN׽+p /mc̙ҥKty׽U(X~ҭ[5(r쳼 @ @ @ @ @ @-FẒQ @ @` ]+o~3_~y>&ݭ+޽{; >|n֔Ԙɗ|+ ,K9Yi߾}z5U2{*DW\0k֬<裹[c[ 9Ir-i% @ @ @ @ @ @ @ @Jȑ#SBSVjߠAr7ھ}Æ%?Y2eJr˽ދf)Gyd4  @ @ @7S;!@uM.<?.|[ͮ&y{+dСׯ_ @ @ @ @ @ @ @ @u)pWOgSN9Y.dҤIy7InɕW38#/Bk @ @ @Zc]N @VX99_N'fnM;67 .Hv޹ -pi^rW/& @ @ @ @ @ @ @ @I1#GVAN=Aeܹy^{5w󭦽ΝO~򓟧]v馛z뵚 @ @ @{ @`Jv%x;+~+VNgN:*9餕kU @ @ @ @ @ @ @ @-c#s=w wիWƍJoM|+vWN`֬Ò7N~kU @ @ @ @ @ @ @ @-?:thp~РAC#I:w>n8) @ @ @) P95E#-L??9d:X+L\{mҵk+a @ @ @ @ @ @ @ @ l<@ 2$FJv횭5$Pkq*W uf>h @ @ @*Jy5NXLrQ'>O>k7~Z1m6ƍ[klWjgmU  @ @ @kF㚹 @NKdĈ_%oy{O^}5㎤S;N##@ @ @ @ @ @ @ @ @/Rս{z֭[] cfvZR+Rӳg%o+ KN=593ҥ8  @ @ @kV@֚ww @j><H|0kݺU ѣSliA @ @ @ @ @ @ @ @ LSN;voO=kj]r%9×xa ?m''<́Q' @ @ @` _ww @)6*9d֬yu{MFL>;g56!@ @ @ @ @ @ @ @ @yO!Cdڴi;ҳg 6|̛7o0lk2f ; @ @ @Ib @@Xw זz+$ori+ @ @ @ @ @ @ @ @ @f̘8 SL´Sԧ% pC2{N @ @ @Yj5+ @/e%?{\?=;79c˓vozB @ @ @ @ @ @ @ @@} ̚5+Cĉsg-2j/y2Ou @ @ @@3jDM @Z'|sɽޯuVrIkL @ @ @ @ @ @ @ @@} ̙3'Gydvm߿}wX+'c, @ @ @, PA5Gh)%j}CI^|z[vZspg @ @ @ @ @ @ @ @[`޼y9c n);c}wX*0lXruIZ @ @ @V@U y @@ M+]CMfͪמ~M|#| @ @ @ @ w`VU{tI) %4H*(-W@BD"\DQ0VZZ<1v@IDATw`8s滞ggZ5       :uҸq|!LTJ(=#HJGpB@@@@@Z1T@@ d$M(]+=LBM߂ƚ5r咆 {pU@@@@@@@@@@@@@@@@ W_}U_|ƌ5kƠ( &LH @@@@@[  ,P4z4bԯ?͛㥴ioN+                @^4`}7jԨwFZG#}8"     DS@hq  HI~(z✴sdOsHiP/BB?                 iSÆ S˖- 0GvV.\N֭>@@@@@@b&@V8@^~Zz iʀV0"EiӮ=tzcG嗥&MO                 ;怇.]B:tq|pʗrF~Azq)sf^=i;.z     ZD  pOjP:p&v$oORݺRҕ+ҩSWCʔp+@@@@@@@@@@@@@@@@KF߿oFRNԫW/K7|ώ/pwR4H͚IKg^[T @@@@@  ppXr嫡ZK~eƌ%._~MJ^ILsHfBC@@@@@@@@@@@@@@@@+|r-X-NR޽ƤIԺukuEݻwO@8'%_VRP$t^A? @@@@@@ SAG@L S&_j5k&SJiaZmjrp92@@@@@@@@@@@@@@@@@~HC Q'xYd/MԊ؈#@@@@@@ Y)C@@ر҈R9ѣ˒-?/5o.>gT                 A,Yk /Ç R஻oxhjEl      @dB  IÆI{KÇh-$kڴYl8aCʕ;@@@@@@@@@@@@@@@@4We.^xЮ L0A7o!дԹ|ja@m@@@@@ZQx@@ k'%=ρ3_~.] {o@@@@@@@@@@@@@@@@@  .9˗/kڴiSΜ9q| '}j^@@@@@@ :jEGs@@D&нScI nj ;$&.~4uҭƘ                DNŋeY$Ih;@ʔĉRԒq{      @;\@xCZVN=sF2Ej׎#}{ifNk                $cȑ#a6Egݻղe0勄/?RPЍcI}A@@@@@Zs,@@ $K&-sTeK%ҤIXc                 &]MLi5mT7oW_}|Mbi„kkդL N'@@@@@@!p%I@@ȜY1CZU][7OJΟ? .ŋk>_tI\Y]pM. mI4%KD?<=;|饗W.TJah                 oVٳ:s[s\}V%!Wg[[͑۩RRڴi}5Fҹm۾ƍ}U|U4h>}hѢ.։\ Oi(A _i֭]-n[kco޿L2)=!     \ P7@H$6aɓ˩Stž>{7M83gj7tu"9 smտ:n"ldKԩiҤqB[D[n-!m_!C'                "`!W>Ǐ-ǎs?[ ZB,X[NzZ~NBԤI,YR{`ە-[6}~+`Mk.سg>r{n:6Tphwd̘ѽٳgwܡ<.[R@w}CC@@@@@Z)3F@ :z,fkoIc'NpKmgXxM< ل > ʛe,Y !æR:<48¨RL)R/!?'O\6,ba-W\qcqbm[_xQ]ՠ!_p… .l¼ml3W %,B,d+SLntovmdgvOC@@@@@@@@@@@@@@@@ ޽ۭۧhn}AWjxjX@Ͱrwm Z'!\jxuJ+񶽵W_$d뷽!!Cl[f-6[)RDVdذaؘ,\+W\nə3[[R޼y] C{6lؠe˖?ƍg{׭{]YUjՔ#G.gp :!CVP,Woaտ-NZm {l9[g˂ΝTg[ݙhѢ][Ŋu]w?0=D@@@@@(@V8@M i:|:9rD6[{eoB6vv\"sd'O:oBشigllRM˚5e!mUŞ- @@@@@@@@@@@@@@@@/m޼Y[lѶm۴cm߾ݭ,ҥKmaRضȰhv[,(6HKYz0X[,| [r,Ɏ󚅊(P@$- R…w8u͛ jҥZ|c!n%JpU5jʗ/ r 5kW'KX_vm[Ο?~&/[O6Mt]v*T ײ/~WG@@@@@bK@ؒ:  @ C O{'>ٶB,X)dI/0 Kʛ7ʕ+%KeYlc!v&{i$:Phl W-k֬qk`gB6h[6ћ+W.yMNWnl#               *`Yk׮պu~z޴imacP* RJjٲϯLƛ$IWjXVxɓڳg[vB,l.ٳt ۲k+V-ŋwaNs| l2͘1C3gԒ%K\[c= S%Sht*J* yʹsd!n6.[kSiӦUUӗUvm <@@@@@@ xBG# .QlҼyMH&]x1xҒM\ڵkWD&dYv2f‹BٶgY葷ΐ!w k$`,µlm8p 8Ͷmbג&M9rOZɋsm2mN;5Q2DK:r$ʧr           $R~!>x   Vww˪UzjWnɗThQck v*T5,YX *`e.͛emذjXвҥKL2*Wʗ/ή^?#+`֋/ָq4~x۷OVC/V'͚5˅͙3}j֬7o~ibW%_>8v@@@@@5A@ Ԋ^o߮m۶i֭nm۶&&]|!UTʛ7fDwqGbm"MڴicNG vΟ?߽{*bAp {n>},I$.@뮻T`A gWX26@@@@@@@@@@@FGW   /^f-\-K, ϲs i*Ulz(4믿fXʕ+qF]rŅlUXQ{>UPz6a<>goq!Z״iSXPYbi,XM0}`yڵS6mt뭷& Ɖ P+P    "@V0s@" P+b:&_M ڴimsႄNΟ?lɗ/ !"`?eˎ;\.g!\6aZUH}n]X1ʕ+P(G r:           PGH!#  DYZ|̙sgϺʕ+ ]*W2gs9s-[L/v"E |xb![RN߄^X)ShС:ufͪm۪UV*^M|1bF% k֬:uYj,y      @ j=n:^ڭ>|yLTpa*Tȭm J6mw; .\;wj˖-ڼy5ˑ#Gg&RD *U-rK!]M~565           CGHϙQ"  D]jL   ? +D3rH}J֬Yոqc5lP>ҤIݦO~ p%Wք k.WӓO>A/caҹsgWgUV޽ ,&,Ynݺi֬YjҤ(w܉\#J|Ϝ#    jӡo J@=M6iΜ97o.\(C <ʕsAZ9sڅ9EرcZb ײIU/M̜9^U^M,]&M/}&//ƾ)WD@@@@@@@@@@@ }@Œ@@@ 4 M>]Æ Ӕ)St-yjѢUdɒvWj{;VF]=:iӦJ2eۗ.\P=ԿY=RJݟ'K.믿Էo_= z"6sݫ׫M6Zp*W&Zre!!               @ \xi(P@Æ Snd5KV=l?mݦ]jΝ>|fΜj֩Sֿƍ`~0x|:*Tp5] *jժi֬Yxwn     ]@0~@@ٳUJ,XPSNU{nZJ={T4). p-.]_աC eJ(ѣ7@@@@@@@@@@@@@@@K`*Uz^{M;vЋ/t҅u 3ɓ'p#GpQgqE,X+eʔQ9ccA s̮5hЀPX0      9R)"Q  +(W\ݻjժ۷kɒ%z'O8+D@Ȓ%ڶmӧ.oĈʝ;z)Y&@@@@@@@@@@@@@@@@ ?gըQC+V֭[ꫯ*M4 |dt?%K'|R7ov5;Zn&Mѣ7mx&MRΝ;護޺iƒ}j֬}QjR      @/@B ڵ˅,XPk׮ըQsNu]y( @ٲe?>;wΝ;rʩqZjUs                SժU5zhM:U_}fH mڴӧ~wmڴIsMasO_ј89v&M/R*TpZw\      a @@ Ξ=7|SEѣGl2͘1Cu֕MY-((H5jPoJ:&4iD]v>>}Z~Zh̙36oذaz{E~W.]ܻb@{이{u]ϴl<ͻBB?2~VTɅmٲEٳgWŊSOȑ#               Z`ͪ\RHիWVZ7#>yX"*UJV_%۪Uԭ[7)SFov=/ d5;UyXiӦ .A}FsQF{e?O6lNra}?ڶm~!$O\+rC؁     ĦKQp-@{%Kx6mfϞ &t~+W?pl;۞={d>fr8ɓ'uyM:U'N{-h…ըQC%KiȞ={\2g= .h۶m1bCTD8?=ڸqa9'(ҥKѣGpz김W9RK.՗_~B~,Xu*iҤJ:ά.]Gyj޼y;$YfG}/B GC@@@@@J@  ,gW݄֭ ,Y2dlH| *_̙S۷wBqòe't26{WJ*c8Z¸3oCm`>`O(PoH".@]ڵu                @ XMƍ7o^?^iҤg=TR]vZ_=>:ac}ꩧu֍pR$I\x55jHG;wѿ/(Q"z~i8q/^;j|w#޽ݻ֏pu}>}zqѬY3+WNh      @\ bD\" _ |'z4zhCɓ'~fʔI2di}oR#|3Qodvޭ-[F97ܹs[{1ctqu!8ٱ0-xf͚a͛#F@@@@@@@@@@@@@@@ h֭ފiy]#>kxc7Ec5|pO^Jr…ڴi^|8OBÇ](VܹܢE ?~|>3ȑC>}n{ذabsI?c\ @@@@@D  Y`ٲenʷ~ƍPMsܹSeʔ_}lb5N=ہnݺ.LGx{d_۷o< 3g~uI˗עE4qD9<4hncaZ\kN61wqcL2]DnQX1iJ*ur?J*UV~?:                [jX ʓ'O… ~M.]r58nIlٮKX&>[[Æ ;`lܛ6m&P+X{6di߾khY'|MYxqkyrfڤ… ۦ YgϞ=Z9rpk/&rs3Ǘ_~YM!               %0w\pcA⻝| %KW_jX} ۲Z1W\z ճgOW?&M4W͛W6˂ƍ7!-OclRS:uO?iԩ>W^]fjn/p5iRN-j- HxuoN*UҪU6e?;q"9r9[goteo/^xzbZsغu .4p@W;޾c y_@@@@@@Z?65@@ Fg\=]f_ߌ]wT9͛baVҥsyBNRJ*,ǂ>s=35fȑCD嵪Uڄ lWʕ]MJ lR&=#^;SwlL4IΝsBo~W7B,,<,8ʂv׆\r-oMfk6h:u5qDYpd>a_x i>9st[Mt˝;w"ڰ²,l޽zec6l( [t Ccǎ!ŋG{њ7)K@@@@@@@@@@@@$"tBb1cE@@$S1cxՁd!>iӦ … u%W#xo#zӧyXۑ]'͝;W)_"3NZ…fɒ%]*R۶z2Vī?cx< *͛kĈ~LhF"SĻwȜcMY}[\5VLl_?^ƍrʹ?TԤ ,[n۷|M=s\gu-{}@@@@@Z3j@?5Jʖ&a%c, TedɒڟΝ;cǎnRٳ>5kvZM&SyH<*V9sh˖-&Ь]_@͛7˗{mܵ,*d0kGk|/iϞ=]K/&yS6֣G;ǝÛ孽Y5fa^l/C#>oذR@kNz}<ޑk.~=\~ 2dxkc;SL'N|*]֭_~CsbI~;vaB7 3~{g ~5           $zUgO   $09rh߾}k ~:s2etͽVW/B|z1iݰ - Ynʔ)DflڍC BPγ}^ZL~۶mx@cƌG}6ҦM'Oʂo;w~W>g͚`k ˗/y6m qZ׼b ?gkpgÊl.\x5wltJ* -[glylUNo)R$!ωv׷PmcbB~3oR_vN!           TJۤoI @@@ A TVMG߈:unziӦ +|*,Ȍ-2Sº~Loܸѝ^`P/%^M`=3 q^z\% * 6foSjUYm' dfu};?T\ցY~zc!rA@@@@@Htj%G΀@M wߕ/z۲`N:B~~Ml!G^ YKvWo[/_\iҤ vdQF){zW4o,Yҝ7sm72(~0.]([l9r wI&+yBY qhcZγc}zU g}V-[1?ӭׯ/xcB]Bdɢ]IM駟ohʕN8Q;Ύi׮dcdQfrۑc޽0omʞy7Azٳ̺jժʟ?ʗ/a+T,huF%K0?M>E%y= kw[ۤ>kSLoƏAoMxݶg,/c,>mذA3fpdt ɕcǎw]O            >_J5_    `jL<9^ܣGw?SOZ&d_VÚW[۾}7n>jXk^-#Gϑr}m?8š*۷M6#^Ql$2VG} ȎX>H;:{lW?̛oIg# lY}ITZ8:D@@@@@d@  @ L.=Mo|}yoKKd,+{イ},@ >Y Q֬Yk J6I̙3{N'NpKٲeS2eqmiѢE`… ﷍ylٲ.ɂ|l" B&[[+&w6&~iFu?コ,¿lvrc*W:&X x@`}?Dsɞۼy4sLjf SHa-y\ OsɣRJ`.gBhIzB}1od,S_ިQܻen 4/,zjMaPmل'= _( r,h+&|gK/i.g{{o??facGߏ7~]@@@@@@@@@@@@ 0|5}c#NISN`Q   !V͂wNI|+M4Zpױj*Ww$IZf͚4X xbUPArKY2g, )/_vB ,¨F4ZgkQhlv~DS( :6njXmc`&vٳg]_ g@Çk̘1̀\Mx](n9u|AWs%%V$"M6 ։_͂4h{ޙ2erFw56 $KL-[Ԕ)S\ba}iZ:"zݏIM{}Q;cAoǏW9ylz\I&)UT06,Pj̴o~e _,@@@@HI|A^@I`۶"9U0%)exM,Y C=֭,*#d.@Z]6&;Y Rd}l]X~uֹ@pɓ'$/? .h߾}mr& U6|?`>}ns}l'ؤ'{&3fM m2bDƑa/]&Y=Ӥ!cag}wE5MlM㽉?6{·DO񹶿wlb߾}UF لD ̣ş!R^L=           WԨg4nTb   yGtRY@WV"O &MH VQ ۇm!2@@@@H y  wWQH&H=w݌-[V ,Ќ3o Nر*U} կ__EE I&o3~i[krEpƚޟM\W_}ٳ}_=&Mѩ|            )SJ,ի'IcHIui   H"F>}̜9Sդ]H(.=:~tw_ 6d}jzGdN2d(V߹s lܸ1aZ k@@@@@3$AgW $R;䛼$2]TԫԤ$I" gK.5n8*TH6pY|\ Ǐw}EvzTN߹{ߓ!Co#7'@@@@@@@@@@@A)gO~'MZURŊ02ƀ   ڴis>p[EHO}ڴiz饗i&IF-ZP~-[1HrztA @7ٳG*Ur&Otݬp_.Bx\ŋKcT     &[@["D ]o֭6%L+'WJo>o^cƌQ|TJ}ڶm[XM>|իٳ5kt_L2Eu%L+ @@@@@@@@@@@[ }z~LڰA6reNW   _ T%C]V[V۶m]X̙3t -^XǏׁ4p Zj4h Q|ymܸiz| عo7sFė@PPS?)SFm۶voO<酰 vmۦf͚s}5~/!@VdGZ    @)wv $XҷJ|##wԮTHOÎH^g1@feʕ^ȖmYٽ{kR,;wQU:[E.]v .,[ʕ+pؿ6m䕍7jÆ Z~W#m[\XpY`RJy,D^A2bZ 9           C҄ Ҙ1~YFʙSjPjXjHrlX@@@KSbƌ_d!L1cFUT͉R+dm.+`s~,YD/… `o}9>^ծ][ul c߾}e!R(Wu7{:ɋM6א!C9g*V;S</ͧm H a     ,j% +'E7mۤ~\_'uԾ\p-II.[=[Oټ+u{':诿ұcǢ5kV3YBt饗F z۶Ο? (DQQQ~ܬlٲE7oJ={wCӦM=[VX1/A -{XH Bs            iXi8iɬZ HV 5   Y߽`- jh"ܹ;(W\^V![[`SRds$ƥvXB˗/ײe˼i\!dϞ]+WVjTzuomh2eJJ³v올сb!(m[)+-vٳgvhv-BYd9-8Ղp MZ @V8           %iT I M6k]{dʕKp^@@@Vʰ k׮ $s̲`B `İ-+6IPl07cs 6mʖ-[_yAZ],x^P2+K AdI&lGբEP* brvm ;T*V7VyO.]b/Y7n,mŊ%KxuӧOYXP%@ @-@@@@hj]4z. T.F&HG6n]6m:$Օ8Ojp}!Cѣ“z- r}Gb-vdV,::4޳XvlʋoY ײ`m֩-SL^ ݶ2f( Jkc]}frTљR?~bW{։Ɋ7^{g%ضzZڎ;R}4u:-3ά ,ض͌YHj;H@@@@@@@@@@@@\p.M.Mm͛'7Iʟֺ*ʕWʍ:3/   !`XOP6mڤ͛7GLYԶmۼyNl97l^K. -Lb!Fv0I0OIJ``ΑyF`bs8pKĶC_,e9c/9rp/ .R/Tp޺H">K[hUh +{m[ 䂰`{Cޱ9ww!\7v -XwʾGǎp6 ˲k I%@VRIr@@@@H Bs \p[0y4pҎRժ]wD ^%. .YrX$ZI-[JRD.aRLM]Kxw:Ă `NA ֡%h]3Y\Y'Nwy]¶gq!]AǷ൭p`e)4,ض[lmg>r${, }Vz M( P+^"v@@@@@@@@@@@@pr_3Y{FUT_`   l ,Ȃ`{ r@دm~$t`ǎsW)mI.dk7H#mn؁]_[`Vd_vN{,j^Ynn=ס϶Y<`[sʕ{B7 i+VXd^Ж:;Z PBs=@@@@8Zg3@p}d4ujLOJ;ڴ*TR"yelSȅ.I!Z-ZHoS/LR%)~{5y4/iF¯~q諯'ʕ*Vk/C ԊK@@@@@@@@@@@@l̙~lX៣P!?XNvmr<7   I`6@id~rڊ @ @@@@/>r$ /p5hzeNөUrׁ+D4`!*kVys?覛#qhG#ޓrkϋ~٥^$fjڵj֔>Xz~             iiJW\Νm.KLymin-_ײIVU2g4ڃ          @Z1l!cҔ)~֭;IUF ػW:T ߂,쏋\תQCJej+O@@@@@@@@@@H P+R,BRѣĉ~!U(o~V*)AT7,Fl@M}-â˖IN7kRnRJ,~TJYx;eV4Hk,             @@4R~i`.^,͝+͛J$ ت^/ժI9rm@@@@@@@@@@RZ)>QK@ "Ǝ CvBz @l8JV'p6 ORÆR^RVR\z=cһJݻK_.͙#٠['-Rjw=7ϗ[SGߎ{oE@@@@@@@@@@@@| b²:v߳0- W?dc,tpUd #          @x !'w4j5ftTԵԺTL5] c!ZK6IuRw!*P>(-_j=.]V Z^R &M{Nj6[y T@@@@@@@@@@@@/1T_zȯҥ1_v?ϛֲ+KJRL=@@@@@@@@@@`~@dغU6L'iDd\sRV̰ -[,JW*[61gcw<]}pauYʿp,9r,\Bl쓕b          I-@VRr>@  ,XhY…RΜҍ7J}'5o. +R7HwKMJK*eΜسFqK/(}8Q*R$e-*HgժҜ9RVUWI?nFRi             @lR:~ ƍoԯtW~l٘/[[ɛ7,l#          8Q N1i4i0Y#*$h!t RƌP!x! Қ5K*UJz).Ky# {JEFK-PwܑўحbKt-RR.5              KV5։ҟJ6kbL$}We![+l,          $T@J '4v5jsTԦtmR:R4`!p~sH_~) iRz ?t={gJjZ) /?ݑ#//=j{I             RҦʕ cǤ+%K)Rґ#^y[eQmmxq˂          @Zl#)i4b4|4qtT ~ `A|à-wڷ=߳GGK:I6h #uՑ׮ZԵTtҖ-_K2ĵ'!            W  ʕHe =d,d+ؘլYC6          @j P+5mڊYs%ШԫtRp2vE,˗U߾ґ#R6mg9,cq=I}Mzm+}QdYPRΩw _>eK馛!CSOi)            lt, ǺS۲atiz4i&4iEO/}΂          jEe 9 DEISH#F!ZkJ J"eZ,$ҷnQ߾5yrn/.ԡCdB%Y9{ھ}_ ZoqDmϟ/:$իQ͊1 }7ͥnƎr0v@@@@@@@@@@@@@ZHJƧVs^i2ɂlmƽ->k\˖ú,p{yz>^!         LR} @!hoTt=RRR4Ir)N'}WR^'n];sBÆMM7Iiӂ]OH|sTٲC50-9S9*TO'>QC>ԲP yw!            )ժP'#[˗ǬVZ^mqhAV-+9rO@@@@@@@FgH@IDAT@@@ P+5DT`iH?Dk,)]:~}nE*Q"I/lʿ-'edm=qdLo L %u$<)=HIݻ)|3J~eHSZ_/M((o*G@@@@@@@@@@@@(6?ƿ6mzAK)F++Vexi} 􃵂-¶bB@@@@@@@@@A@p HF(?e?Hk*)_>ys'&M9:U Xп.-t啋\K. uU+U${HO>)+syFvC*VXBN9Sz݄ 2%&TkdB             @ȜY\/o_LmYֲeҨQ֭1{[Vek ُ-@@@@@@@@@@ #@օq* GZIi#|T6KEǏKYsJW_-tRTaլBV׮]SJj_GC}^zk˖-z饗wtڵƍ3,U-Zժ_B4Iʝ;Y.I@@@@@@@@@@@@@/#T_b7f^?`B,lkJ믘m Whm[)UJ*\XJ&f_@@@@@@@@@@F@q, E?9R3GʘQj@z-馛%.z@ /}҆ R˖Ku4smШQ\n12nJ.yԫ7t~K:uR"EN=(_/e"ժKD.L0AZq"A@@@@@@@@@@@@R@Μg:x Blmeli:1.sfdɘ h¶}ǂ          pjG a!`;r4zida+RÆRlaQU*{H={J| >,u =?#cƌq[*^xGlL*w~V_|۷k׮[@-cPm_wԢVʔ)s@@@@@@@@@@@@@/5T_b´֮ Zߞ2EGڷ?"MP!)ײu趍}X@@@@@@@@@@N PtAV` ?@B,t:׮-u,|TzVERr!Y.] LʒEzyǤ9ܤ:(sOμS*_%cm=v駟jϞ=ڵiE&IaؾmS*Ґ!/(@@@@@@@@@@@@@G _>J:Qi:?hB2o4xm[1\osٗ-@@@@@@@@@@ Ԋ;J{@ X~8Qڿ_reK馛sJlƍ~h>-Թ-[cAPC=yd]b8XzK]j{_x;CGyD ~?7FW V_4J^p}Y@@@@@@@@@@@@@O CtiU;OfMLЖnk74S}H{7?BbHV[          dIy#@ ;&͜oR֬ 7H+5o.a 4' so)_>̙ҥK_5\hҮ4oR4q˅?6]qt*V?|             ٳK+%*%ex޽1GM-{;w̾l!         &@VB`fi'#-gYXdʔ*(hd (YPѣoH=g;{q8*[na [C9Ձ\޻1ϟV"]mС*P c^z^-h+R$\kJ@@@@@@@@@@@@@#+T_:~.iژ-۶2eԯsgQ9rA[+&*$I?[           PBjs-HǏK_L~(gui)jyhx l&u, "u$'ϹUW^Ѳe4=wK;H;J}$e|vמ={zξc}ڧ7oep(Z7ɓF$MԷTԺ4ujƒ"!            P wnJjq7~>?`+ 6yP鯿"E- زЭuѢR,q_w@@@@@@@@@@ |98?!ZIwKJI͚!Z HY`F" ̙M+M 5lxv_~a'5             A9rH+%fEEI[IV,tֳfk7+zɟٲba[KƉF   SL5j(-]4lhufl&MM      J@ %u@ \n??@ki)S&nݤoʗxFQ#/gIwںu4d֭~'Rzގᅲ,̭b,ZP'f Y _TkM0I.}Դt'n\hK~'/_>'\C6             3JKLsC p+XϜi$Ih;_1a[m۹rJ  $I4fo;w&qիW㵲5       Q {%1566#'`8.G?,/-*gYez~h.<қoFv6m4}t-ZHy=S\풦Ν#Gq ٹbŊ*X&O{Æ xbmٲ%prFJH-.]_OAq585i7/ƱG:t ,/ պ%fɒ;1.Xԍfy/kԐT IzF3(Yf9z@r>oVjժk׮ꪫǥeϞ=url䲦wP*T(9ps&3z;}-,/]tF'¨ZT@@@@@@@@@@@@Xnn_sC'j;dH t+[@@@NضM*P@n>~>>퍉'jԩr 7hҤI. 8[R+vZx@zre㏓ @@@@H@ʞ QQrAA~h\ߙʕ '+~j=T_kРA7n9iUӦM #֭[yfeG S۹sZn} yaK_|! EڕKr=oVg Z|ҤIŋ'gSN9uF1CzϫS>/g-X'%Ouuh,@@@@@@@@@@@@H@LR~9{HZ%Mr-̝[ mBΤ   *vZmV;v };l L @@@@@@T&@V*4]`j?di$i~|yY3w믗2g>r"Э[#j>M6Mǎs߇fWt5\_sRtWx]ve\`ݻV/Zյ}v/(tm۶?Ԃ #Gw}BoBnv؅ _~onUj@80߉PS3qʕ+jҥ*ZЦMmÎ62dPdv/cO;UTI*T.=MH5kJcjw*>]T}4n8*UJ?T`6ouCٛgGS/^'Nxst OԩSs<o &.GyD/߿,T+4lȐ!.wآE 5m;_R'X6@@@@@@j]@ \Ə s񃴖/ nAz=?HD75B 1.u2aZdӰaC]y4k,cXgg}VkV-ۿm۶4rHR~KyG߻ 5kXVƍsϩyzu7Ԯ];}GiZj^@XǤ_ծ]\tlb=ZjZ6?(}<۴s^H˧~'|s4^zyaM? r]nٷoyPB腤YX|u We:u}>s\/>b&xY?~v B,kܹܟ+ch"/ 4$~n]p;)ϭrk+wK1}ߦO}ObgΚꫯz?O^G>{v- |Yb رc2fuD              @ȗOR۰m~-++VH&nb3d![6. ]@@R޽;|7gL2^K/h{^XUhkm.ɓݻ,tkԨQ.g7B]0zo(o}؜7Q{Nu1e77irwM6^o~vpXr7!Vlt7kɒ%޼?'5      )E w'SJe' \Y5mtTBҬ\!Cr]"pq\IFC.)uxʥX8JhdaApcWk֬8dxPٲe},:XHu“.RY`΁Zj}UgS\9o7|zdg3{hsm\hyɓ@/ I sY\-r&͘eaݺub?ou:}ނOqIagmѢ |kc= .eƍ^'~Zu Nt}p|=s ,vs\hQZ0{kB z~ŋ|s޳ Z BNi0/.'=c֭ \@@@@@@@@@@@@RΝrc%7 ۲{dn[J冷2<-@@.ƍQ.4w4=|7ǏBl^{-7ք ܜ'3tUWy86ݻ߼:uR0e]+Wjyln'ZjaaXs؜16a˘1c9q^~~a/kKΕ+O^P|x' #prsIώ|    \\;00X|F=:H]I&`V.HiYǛ/ ´f͚͛7{!L?xWŊ^lٲ:X̙3Ǎ2hРA>YdQ*UNDO^XdLYWZR1 8qN8}c@,n#*d~]Q2{^'ٹ[۲eR^h}z-];}pZjy{9ۗ@he6@@@@@@@@@@@@@+'dj3av^ؖ5¶Inƍ(nʝ@@H:{-% |7Um!y9tl%y3\eKӦM9YX*/w}7suysG{ァtye|*c-6g}իym>-"%!5OL@@@@@@ P+nAp<=;&@˶_eXˤѕW$W 8/#ҽJ<#uvnZv+W.@PӮ];3SO=-[xl.SN>}zթSG|r-YTRgNG-~SK̋_]VX[o_~;wVs1fٽ.ճgÓ?NgAb5\4nDƎ;x:VvDYWPDcr!mR1Z|yC-l{+Km( G#\˲sakrϹtraY~wo#wQ9e=O>wyΜ9>sve˖)gΜ;wsI3< A_pzyk֬ b             YlH] ~9ӎǎI6ZAؖ=7dMv`IYȖͩ}9s1l!  @rȑ<唝ccm9yd愱pKΝ@/ zwdd̚5KÆ ,̫Xb=u6m\pd/|[o1uy%=\      \$.}t!/:mذAUxn)X3faÆv9{9FXϓO>^R|A 0 0-[^|Ecш#\l/봃 pAuS.2w\YH}~Wx?}NTtieϞ] ^&7`g-;w:z͚5籍&Mx=Y.֕?|aZvPӞ={ɎfэSWL탫JEš,hʂLm1L׭[;v3.iPvзϺ.=]ҩڳb6wlyhȆ«ZhqBNMc{M? $UTկ_?߿?SܨW^yEwq>svfVV{Z~.ƍ\ #!w4nԂ5$$̂@jسx?rdﭣ,{(_4p@uх#iӦ~YQ̙]Z,YRTW_}US2euV=sNd:ww]WvG 7#G=ʙ3~G/@;fXxք xb7Y<7R`^UBOh?,Aɂ{Pۻ *"UV)|A7aW;x/}zg<e[?iҤ$3 aa]u{,x?=\~]=G]w /)]t^ڄ6dm۶=zAQ1xqHW^inҨQ6yOV`Ԃ :4'O}U^QF.Բ1oK1c .|N'O?c<1cx` s=              @l~MbaYv۽;dn XB7?7A l_@@"A?yd K\0OuWMgy|6*TBo\*W+ݿDۼ9g7c֬Y|87p&Nxݿ_c<*ѽ{wo>Ѓޖ.iׯSD oN{BIl'  K@~rZ    (@V8gؼв-+-[.gƅkа |/@qk=cǎɂV^-̒%^|E/(M4,C^PN 'coҦMcqڴiKz|oe͚ Ӳ(~էOYh߂>Қ۷{Cv+VBzU&TK>*͙#n6I2$8wF0XKt`Æ ӝwީ(CӠA`$;qw^| >|veCuM2Ӡ1AYZB{67KלӖsVZZro:enXh:+WNk[o% ׺X+5l(/ e^Hٳ*ըQC}mBku5{mݾeʔ) rྀ;v𞓲e&tj%#.F@@@@@@@@@@@@T-1Fm![7J=1L67Sö x6f?cƘBػ0+/4EQ@) XFcl1_,I$jLP&jXATtAtiw&g-wwy3w)gϋ  !P/y_ڭwL_>wR-ɟQ~ۉ^Vz)ET:.) ꫯp$J tLEM2%^m۶.\(?*u9,ʕ+MRs>̱Ý[9v]SNlf͚}i!,-,e' ͟/9vZlY܉ENal sG>خ]xm!ky{6Ū$@V)Y@@@@@@@@@@@@@!x+mmίX}͚I9CR G  @jUWSAcdl۶-cfq3<HSfј@hc4WݺuPEQm\_Wɤ; UC@q9K@@@@*ZJqT!IƌQe裓گ`*©"P>Gze[7* X>S>}tn(`tq?Iz EaN/G%NJ S-rd徲:t &h}%Y`tEAe#H\P,@Vx             P.6I~+o·.UTurn%5Ђ1  z@ZUs    @;$;.n͛KG)=@UME˖I>+R^ /HRׯ_s9G[lѸqP(U:H^{ms S$=K5K(8pcF2sEܐ CH,}aaZ>z_5kVY82#-RYN]qg{;ҔnW]u=в!{B@@@@@@@@@@@@@ԩ#iNg6ɡZmy`.GYjԐv5Э   PXE|%Rr(      @(H r& Bc,h9vmC+>a%T'(͛KzMn]EW?j.;{q-6׮lzK/$xb|&mڴIWK|Pn驧w52.KCuU߾"             TZՓP,_y\ʚ5I÷:]PdRFF֖4GmڢTVC@Zu jܸj7g      @e~?e>\rxرR!]Jj~;R@ q瞓V?_:~_˳y L(=ҶmҹJW\!kxhÆI',rtE{-k@5osd6Y;`O*-]               lْC kfmZ5iSZ!p+̇{~]5^  @XLuW%aEA@ /u& ZmJ@@@@@=$dX +@kpiG&5j2Kxy̟/=R. 7$O{NjX\~XS'ۤDjܸBƏ<3%Lp3Q(LRF@@@@@@@@@@@@@~ 3F8g֒%2O?0k~ƬVj [^jק         ZeokH#G&!ZК1CWOW2DrVRj9)J\`RgM:m7m*uVիWJmY>iJw)_dR:ä,ݲzn/aR@@@@@@@@@@@@@@4__j.YZ [aene(5jdoĕqfק         Z%Vr[H5nuԳtI֡JuV9Nb Z%r{I(I'I4hTV7]_xcISJݺItyRUOGzE&]=u$(+Ն Ϥ}v9D@@@@@@@@@@@@@*C\;w.׮ J \_|ٷW^WVjWfR_#@@@@@@@@@" Unj@) ['gRR>ҥJG%x (KVro^yEzEv4p4ttIRO亮ޒ$Dkz_?{MKqlz;qc:uJviUXF%J á     '@IDAT         @ںo_l,Kòeˤ-[YP:mb ps         ^jh(Sw$@kd˺w qRezX J#0cF҇&mc';NjԨҜj;}}N;MrnJ 8S{+c`Ew$߶MPP@@@@@@@@@@@@@@JWvmU iŊ$\[\ge=zu-.öz\N@@@@@@@@(-JK"SfhvԺtK&9,Z`&i(ד:gԴt'Auu)9g87۶<(cwΦJ\ GcI5Y~{+ ^)jM"Ҙ1E #             @jRfIҥ]oCVn%Kɓu-6n̾Fz0ͥZG  @IqhBY*iÆ4~T~e,G@@@@@@"D?Q@" l(}4bD3aBr6/|tR߾IVE>OزE䓬-Խ{ҾK:XQ;Dϛ'}4n\;~2wt>P骫zJB~}-N9EZ i^#dIWI;]βys% ^a[o9# MJG-䱸r+ZI{ @@@@@@@UQYM 92 }$8 -OA \)}aVxҦM{H}JwݕhuXmWWpܤΙ5?s.KݻK/]pA2 OOpҍ7Jwߝ\yRz^:$0+3 p9@@@@@@@@@@@@@@p\ wm|yefI^tvmQ# e)o4S'6x #KokՒ??X      G@s8*$#;KIߞOT(!eM(}iVu`KI%$ӶmU~H:%I)ԅ ,jS{JKIG%u&!U͓>;iC?.w^E>' s_aZ ,              @: 4l(v܀͛ttidモl~_rVjmyӦg @@ Ojז @@@@@@*ZqDF К5K[W:?O ϚKɕ      [@}8 *n4fLVĉ;9ӓ-8T ܹòRnח_:pk^ҿ?'V̪ !XaX!+fNlݮftoHrgYW:,{mhR~ j |toH\#wR:Uˠ*С?3GھÆ9"              P8Z9 u ~N-|+,?_쳬X!d+iXo w| @E8\\}@@@@@@@b D?Q@6o>Hz$Dk8ݺvM³nU/ )c)h9y֮RwЏ;mܘLs95mے#qRjuA嬵jIkN]<ꐗ0z0 $W/k0{u?/SWR|93ӥOڶMNr5ܱubiɒ|y5tn]"MB\w]){Ss87g2y9hobYegK/I{Ksl=@@@@@@@@@@@@@@/2v-݊U1M:$xl aP@HgAu<6V(3#       PԪWcO[E}YVر~ "hQzuܳt|y؝r+ =P|>|i|rpVnv:h[fs9d(:uӦd`%;_JVϗ,Hw$Dŝ5۵:v.4 - NW*܆.Ziv:{d]]vI;_iӬi&c)&k`˫8P˥wM>+uo-BV`              @ xVZؽ:X$kyχi1#kci^3"x  e!{ó<޽֭b@@@@@@J[ؗfUF/ޓ_r8u}IVI8o갞0;4Z>߁<qG4;ǡ*wO`갩Pµ p:P׬\Sx:o^2ǡ:+ҠAZa[\]!6*Cæ{2IC{ѝ:AW/쳥NB<ޏ~+͞Κ<{$/c8=Zv=\41-+aäN8Cz?I%Ar뱤 i#taU^ @@@@@@@@@@@@@@) i۶7BW93G$!\9@x3xˏC ^,k^5@JJc=Hե/-@@@@@@(ojQ)`TDs## &뗄h9H[֭I(_'!NP w*__r`Oԁ= S;'zP۵ M!I'(M:ap _2I^=#T# u+ydc(Kޚu              oZ!x+u>uYk?F¶ \z   3iݤe˒,IA@ 9th^ϫ@@@@@Yc[TfEKr8P߾I8 a ͙#͞5  !Dk'ACmHh9ċR>j|:QfMiugM݉Ý lM *C[uGÝw[ӦM-iSD{N$}4yr2﩯K˖R׮RyI;K;&HDAN<ѷNz1iƌ$<ץOӟxK6#vY?m~t>um3ltl@@@@@@@@@@@@@@,,hP}1cBTJzǞO z>#Ǎωƈw$s&=i^?{l»Rü57#gM}.y|y)kcq[J2sN8piH \?(B c y@-пԭ4th>O@@@@*@ rȌAf͚9sd֯* uXzG χ 0uH""W:ODBJ0M Bi۶ڷoQҍ罬CUuk%!;9#xLCp\ʅ1yLBmѢE漟wx@*{s    y T@-_?q@(sC'@ѱci˖-K4&oF); ̜93!eڴiQC]_jϞ==*3iH%cPa8,k}ڣJHOv=dʼnQ ÚTN0Զw@p'_FڢØBO8/}¢(KHW^)򊃝> ˓ux`VuxVEs[!hr[ ɓ'˝K\DEh9Đ~{֭x(GtcJm㠴P>X0@ڴ)6aZI\#}w3F暈QXӊ%P:GKV鸲U@@@@@@@@@@@@@@)t֬!'BW~h튇 A\QI漗>9_i!)tcѢEq9~vS/5ko借u (Cl-YNen!S)+6vv}\{챇\s3 lL@ PD    @jG-|GO:k֬8!!r !/ q rP8,fR&WwRpiժz޽{렃AzqR5-[ u n]QZ^SUr8qcyB;tb!!v8eʔv&Ԍyh}?S};9[u"*m-t睊ڷ að;3gNf[t;tƍ;tح[#r8Сwnn;x˝v 4n -l{$[i\jZE:aVZgҒ-SO]ֵ%P+˂9@@@@@@@@@@@@@@S J p#ە:uԠ\9O|Ɗƨns,@@ 6hXc…o2{|P<r 2g b+B֒%K[ْ2Nµt=iY=F@pjΉ@@@@@l=PkQ z5v8@?\7z@8 A:LR5-[ &hquŋpQGp]E24*|2;ל}U5Z6rH5J~Nٵk.[[ըQԗ2_E=u;,kWGqDyZRE02}YU+z6vhcƌQV88+=u(UOj~8zz͝PSitEjڵ77MզM){pNU}g y衇_~qmj!P^y@@@@@@@@@@@@@@µV{ﲞV) >^C8|+ly|Xu ?;fIZ |%}Wu޼yrux?GcN5He˖-Z06Kc@%ضm[:`=իWgCBVhmf~ ;@@@@Icԧ~zKCcbC9$eܹsy fIcRM%35jl¶EG[/ J+Yv{m1"28ۡvu?PaD&M>(=zFWmz+#Cx@’?u-wy'Zls;t֭ۡ[18b Lk'n({h4h>h.GeO+.S?8yx<ȸ-:|N:ewP'{@@@@@@@@@@@@@@Q`͚![!u$x\瞤on54H&|r͞=[f͊wuVj`7qxVYfv_`Mt a|a`8ϟ7-1MƁZi߾:tWyQ@$@VUڜ+    /P&Za7ԫi9,d}_#LkQoQE-~̬5D`֖-{kIOZI( ( !Q:"ի֧W"7wq[8@GuTr~%/6Ruk(gM۬ ߞ{. ^=fafqǵ /~8sQqsЊk3fhvRWD~{JV+_' &hȑ>|xxy3NI'$TӪ|tرqÄvxǫEew@']"              P<ɪUR i|K(g];+[E ɚ>}z\MOgΜ:~i8&ִk.3@c5 -?bCشi8[!oΜ9Z~}ϩΝ;g:uƬ3/G'@VŻf1    YõB{91"6tX?cԡCʹEokذaru~ϊiɒF:U~+HzA!Gz5yd.:c@ƍ^$@FF&N7x# O>uQM#TQGNj~U%I*CF_z%-_<:0N PJ3zk޼yqugA[,OrTɃ'v>}vnU:*%@@@@@@@@@@@@@@Hk͛qLRBWAed;ZƵN6Ux<gMF_~e\l˖-VZj-9uѸ3+'Ccf-^83`+z୭[Ɵoڵk\Gf#jU a#    PIJ4P?8׫8(N|6lXI9try'z[b':S~ E:Qϝg}V=Əۡۢ{LR$NV.Ae˖m_ի-'֚?_QT 755J='Bġ)~N=Ը]㡱*.nSLQǎuӞ{Yt~Z.g:@Jd@@@@@@@@@@@@@@a\o|﷧Ys0M&MڸaYF ~dӦMqhք /uYtN:Aq(2k,M6-:Hc8Lk}~={T.ER PP$    [D롇C s=W'tBA l٢Ç7j׮ .@W\q:tNZcO5tP=gqFSmJ[v/B?#ۡ}vi}m~?øsN **5D6\~{ꩧOk…qs}q2=OKM@e~JV}              @4rl8rEV%uRFFrكBVΩr.S'ȁ1}>䓸N4ISnݺ޽{tڵBSErظqc5q8t0]6 Fջwor!T^NAM@t"    U[`f̘+`hٲ.b]xmݪ*g_a֬YNnFU'̰atwĝPGD\z:Sⰰ s18*-NTf|ǵyf]r%k*ĝ|A{gYgG^+'Nk}2dHXV s"|?0C2|?M=5R5G@@@@@@@@@@@@@@غuP0ia^9K}%mۢi꫷5f;V˗/ǚѣ: y`]wu:餓ū'A F;0`@PA8~_k:uת[ni.!ƍO{:Y}.L7t7oGկ__/P9FA ,X ~_?#{[ny睧5j4m/ i%P+@@@@@@@@@@@@@@@X.+h+niJ.]YKlڵ5uk`~/g7z8ի( %!eM8Q|A\Go6ʟG} 8r%6@Xj!    @) )Pk]iС:蠃tm#(CcɓVug![{L{:u /P7|sz뭺+5x`[8*8{9kСCl 5je]ӧSNQ竃#ؾˁ_vׯ_(m]vE<ܱƵgϞK{ynyD%H崙C@@@@@@@@@@@@@@*ƍ裏wѣ^y8eҤI={^ 8Puԩp#Yz[c|Wկ~ &9|V\Y87@@@@@@ 7Pa!'xq(u-W_}U{y2_N2224j(xqhʷ~tuQGk׮ tWhȐ!iy^k֬ѯk9k,g?ۡ;ׂ |Fs9G};H}ez͛7׿8LkC,M't.r٤}eryO VXn{7tS?!eUi!oFY:s?|?i曡g(v.O˙#              ]Vu,>#͜9Sg޽{7[WYn|IqjҤI|1r[l2=C[ѡ@Y{V1{o~={Ɵ;yW{̞➯a1N}u]wUV8\m|::@@@@@yjm޼Y'|K7N|)W_믿.}>ٳg'ФIuֲrʲ}a0S.]/qwyƌSjܑ ?c|=P< 5|8!&eY~Կsԁ&eUsmwi=P-\ފ~ׯ\=r)eYS=-Y$\С*wJ-RO|'               z1׿+G tIU_ mڴIoVZ_ܖXB#G믿+BΒ۲TEQ:fO~.cڴiey5K1{ :΂xeӟ`w}6lX뭷Ɵ'@@@@@@&g5\ ]ve~^W]uUu%tEFeRܡ8a7p|}]UO{NC~XfM=CtGϭI&qhᬳ*cXvN<8@j(kԨ  ٻwogyF/ֱ;aqwI77xF*4Q7x#LJd);){2ŊvOoH~_i;Gq@\f|?iyssѢEҢpy|?c@@@@@@@@@@@@@@@߿0@/IΝ+ոq9kU_e˖OΝ;g嶬SN3oc 80(۲\Uų$|*=va Z-G[n%犻0)խ[7#9Xɓ'U"     B @1cSO=6יnݺvI (CӦM_:3ȩUVqCD+tQFz5v8̧nfm޼YO>nUwy8nܸ3Ecywm_z8Ws;o~O2%sպ;csǮ,n?O\pAi*msO̗OV{?+W/+z״{vm7͝;WC і-[3<3nmڴI\rڸq?8УGP˖-s=go!2>\ e˖_!P~"cq88-'xBu֕{1*sf~m=+V?P/rӰaC]z:2׵qU޽>n_͛]?2ѦMFA3~.{2{YZ^~_=Czᇵ;yz,m?O5a„8Tc=6>3fāC?tQr[q@}>?xnQ{۶m:,'..YD￿n"t<,x뭷S_-P? *n{~?4h#gqx /QFi̙r;se(|I|SΝuwxNsWvt'jРAaN^fͲc[/ Ǟ2|pWwڵ/_kJkm7=rO yԒW[,{bAm1v)-:rGoFҵk_uqC|pOi?*ǒ~gQ               U[`T={SNyܣ{N/ֹ瞫0ޓxh]tQ<r.Y2kx{㏏o+Ƒ)rEڼys<&ZT6^o&y|n-{jΥ'us[VйdǗXv_}pWOߗ;v,x      >я[JbF#VFmyY>2H)㦛nwˢИN;-CG?fޫ/›2y&2#'^w0`@ƤI2Ǝ@e4n8/<# E%۷ψB2>ǯvf 5}2j׮裏fD?.gDA@v~ĈQXUdԪU+# (ϟyN&]@"HG V: Q0^XbIшbCEP@ t ;~fֽޖϼ^N{޳Κn}Fx^Z7ϻ ڎy.\8v0 x7uCxA^-[v=zt rnJn>;iqB s2'8ͭZ x69Y=_\{Ν/۷+/({|GVn.z/8p x駟=hҤI{x!ZnC/\-g۷ϊwc͊/Xmwx7]{x жm[ׇ_|E?4h#H+tc&ލ}شZJc{iB}SNn;^Nh}/*dNK }'z^r?7^@Zcǎ~Dv>?1WGs%̉&ؖ ]#틑\]lHbx&FzMk}x + /+=$o̐-O d{"X>M; ;.7k               @F^RZj C*W! ?Y]m`6l]'3g߀Z嬦ѼӧIk޼Yb6 1 ?LgWGvi}H sɓ]۬ xZ+}Z](eHDRGvO>(WkK.$`5mVj-]x/-SrC9~9kWV~?׷o_yѨe5{;9yΓ}9e@r+r ]@@@@@ (ϟn*\2[1{ҤI8@-۹AMW zJ*,d&|[οkr)ٳg,nY&@:^ev#:w|v(l۳YxPAUx믿oq=8|A& y`);wt,5͘1ͳ5x!A>,-<`cvF,˶Ϻf7#Kիi{>c}bW^=π Z-]?pdž{!/O<Xn]^6uǍڼwިl/X=pQCFHbvHAh\9/D;b4gۿ~mC.|'oݻN}x}jx Ԋtrr:               @Vo||')Jd4ςVəg:6,[@ZF~e::2Hew, rmٵkWhQe5/R6m8F wjHDR'|YMg׶Ho6׶gy&;Ȑ!y}q"Ԋ>_?fOQx?Jc3 jI    ı@af\^UdI7 רQ#m߾]^Vhݴ_}nPZF%榼`:g}J.-棾|ݻf͚'lٲvءcޓwؽn&խ[WeʔZ6 /-k>x7ݟ^X{AZn R+|hL?tꩧ ҿoYFoڴɍ/_]֭-[lk׮-ۖ_~EovhLx78hm& p&X6ئ`:,5kLmy7^z}쏜/R Bw^؛|/>/n۶-Ͳ_… ohfqÆ sO~?}Y_vZʹy7oƏ/A 0-ѣ;f;3֎/fuMDz emȬ/Fi_?}M4b4˗]N7C7UZL@V}ߧ4>bIكbŒi4 @@@@@@@@@@@@@@@ JYtȮQW Y&M\#[צmXvxZdh~YOމ'/2J_-\LDZG6ɮ~GVa{աC*U*ՏC~F$ d2svO[==lٵeʕ+ߴi~4hs`g2ZM @dVҌZAY     0@ShQ}7(H"Gl /`|w\rc7҇XP([iڴi?A[rּy믿ʕ+eYU$-oCc@"gf`9ꨣuVjJtٲSLѮ]{K.UZ#FP*Udf￟f;9n>ܭhѢ孽1sgϞ|Tg҂,](Znܾs.\肥s~Xl>P?dgwN'V}RJ.sq!}?o:urm?Ϧ WWE]g{OK.Ze==3w K!55of}ѿVi_U?h.h\P >r ?>ߧq,~榝 aϙf               &`5_w"쭤L*y=IV/ Y 0慿OשSMZh ֑l̖d5%Yʪ\f9gv̙tٵ-_KWb`g8ZfO9~jeT30bHi;    @ U\9uAJjc7ݻw^uUW TP] jjܟ+W#Gj\ДfU;w?+4}oܸ1wVw{{̙ix,3ƅ\.)}Oҥ5i$vڹ2:vXgkt!iƅ\y.O>:uj¼loRicyXC-򰕬Wڵ<ѣGg`k.,i_kվ}{5JC Ij۷o8O?gewN'ÍDq/\}7fg>}ݧK.D6馛4h u]ׯ_h1 ?X={ ^zcrֶ7xC^ziǶ?amڴ)__h5(kb쮉f]_5aÆ+}nn:7ٸqcV;h}*4~ƼeX>dYް>Y.›               93Vۗ5sD_g# ~F,Y&ׯ8udL~҇@ٳՑsrjDfu;!'"wveI}0ZF\';לozz-Z'|2', FjUf     &pD<';< ?uG-ڼ͛?<^͛%Kԩ|AbaX0 uU2e믿Çջwo㏡yYMnڽgqFVGzʵ+p޵k 3@ y Ֆo]*Uқo_~ٹ7D_~gs~4VZb{9X͌a!77xm۶eHϳ}#<"Ӿh[M*;4}tSϞ_|;\V9=0Ν;cq>{H_-;p@͚5Kl :>L[l0mըQ#s=`j&d59\s5:c]hR~'?5kPf}1Zx닑\Ѹ&Zh >X 'B,j~4[ɂ4sio}ꟓinh٦5kfMA@@@@@@@@@@@@@@H\rսj۶r4/yCVg4/f TF 5m4;3ud?xUXQU\uUV?/Sٰ}v7L/!=n+mڴ)T+Zv wx]LgkeU̯FQ5eX=\?w'F*!iv쐼ˉjN3?@@@@@0Pv!,W_}V^] D PÅ֬YYL`AN={t<.pB떱,]T{*Tm޼ٍmjd6dѿwSnOr79/m_m nժ[?v(,ʂqe!. fݰ[Y [n mҿkcƌ X0S޴i\ڨQddϙц3<3|,-˜f̘B,'t9N;fqxYgn9_spc7 b?7~_iF0&l7-"´~m<,Xmžʖ-{O]tѿo|ͺ+3τ2H6;?~ sꫯ~;V-rbee~~ jC?-“7nd;#F觟~}e]'|r(0ۍDy3g&;gG~]of0rUNmŬ^Ѻ&Z"鋱v,]m#ż^a3w/֯_ow}Wti7/Xh} k~>d46 m~c4kQ|^6gy@@@@@@@@@@@@@@@ )N:$͝;WӤIݻV_N_Cį;_~qER̯!5i$WjfE_ {饗԰aC-[LgVǎs9C崺+/Ȁ    ćw4a߾}^f͚UVeL~ndԩ^L T\9PX"?~VZؼ&M텿.R+V,8p`sM`~$1m߻!αɪw:|GF]xq V xA*21 xUsЦMq^P;'>9l\r#ǾK2;wYE[m 4(`d3Yn-c6CVcOm9څ>l_xB!ߺ"/ͯVZǹm BXKiCVD^AѺ&K_hnW^y%*Dۗ C:ڸq3b}\ѣ)ȵgdV}~iG4)/g               @> X-աu]6msV_%vu1DŽ6~޼yԪU+tMz'? ::#c֬Yj+V,ӉxZVVįɖDsږ_ydW sׅ׫VٓπV[#bVjpYͿ*UuӬ8v]_@@@@,wn4H= gÏxG5nܸ,҂rM2Y}߂ ,k׮fe.]{ __~>+;Å"df g !CsmP *aڵ.K/-H}w?)]i :u>cJf' 9cdC8OG^~,3aG 6teȐ@,>sG/S߳gv>Z)Mj}~ͭ\,.ӂ}~2h@AiČe               @ݫz(;wׯ^zEM6^@A> }DH׿X'6X p :bCތhl_FmɯyԶ>;ev-tի5f;?> - KPBa9@ [DUxClg@@@@@ &EK"Eԩn;V?tgjʿoS'tR%Kތ>,ffծ][M4}F)S&,$,\r{2{;4e˖邚[nE˗/wZ_}Ao5c =#s=W<իWǕ;~Rk{pm5k9shҥz<5qYP&ow /{7ڪ5k,c3[nZ`.}?^&O P@@@@@@@@@@@@@@@ (QE(-믿W_}U>֭ݻuY*^x*5vSOr*uej$md*U6Ѫ#1>?c1NeىDr9Ç]='>7|+G?龷# 9rԅtMG@@@@OP"Ν;jСjݺ i߾}\Xӿ/M:U򋻩ݹsg 8PmڴIVC =ƍ炫,@jժqծN ЬY+<,p!uۧ yhѢjذzBJ.vi=zh?ٵ3[o; Y$cIuV=5jhذaj۶m`>V/;^w6lʔ@@@@@@@@@@@@@@@T(_~Ǝkɒ%4VCcǎСN>d.\8UHR}nV-]T%KW\z*`Ģi˗/״i駟ז-[du~u릋/XV1 %`h5'b~"    9QUVi5j P;tEq3J=$w^wc<g³&Lx'ԪUnĉ]=pUWnS&M9 X?B E1ޢ_w>?n&:cc|$nzgMJ-ܢ|o%B O?>/zwlA}Q"E\4nOMLߧ1tgJK] ct1@@@@@@@@@@@@@@@(իWr>cuVW_,/I^gyZh4 8.wiQ>P#'\d& ,ЬY??VwoΝuyQG.g,y4)X'zV1VG@@@@(@-˖-SO=7|SnOUTa@\ l߾}~y-\PݺuӽޫO?=;,8B,lj׮ KtQG/4q+b 9r߯o%dǎ>|yt^\;=/n?Xzb:5>PݺuuwꫯVbb~]3f̙3yfWkd/Uuֲ)-[I'E#Z>VҼy4w\}嗚?٣e˺:wg}ڶmg?@ f&U$evɎ@@@@@aƍ.ls5\ݻdɒb CO>믿qƹЩ}jW^\cnn:TFR2etW D mY/l٢w}YfaÆO3f_|4i⮉W^yW⸓Xo&׮] .@T.]TPm9Oԥ'S/S HK#F               @B XBg֜9sk…*%JPӦMu)Wոqㄮ'Gػw,Y 믿v/ *ܱc .jk%g@ Z?z'/<#    io Om۶Un\Vzg _M0A|vl,gϞRJGnVTA닝:uR9$Z`&M$sQRܵ-/^ӧG7oVӦM\ JK`Ϟ=4qDW^ZjE{&~Y6&ӟ~uC@@@@@@@@@@@@@@@r/`T,Df…cݻwׅ^ʕ+xɴªU\?8k,C)-[tZ:tp>fƀ@^sf=hM6y7ʪ('S!D+3C/p}>pL-[V۷w}]vjҤ{(,m08kڴiwuꩧkE]f͚e~ߧI}zqs5koJ               Hj^X͒%K˵m6wGuԩµ,`˦k׮^RSt-ATطoWc Ȳ,{ڽ{czl h 4Pɒ%S6#@|Ժ3I(    I'@p5 /5ydzdvnYgO?<*TPL#FnFΞ=|Zh{OU?묳R:' X?vǬ/Zъ+TX1jJg}+UnMDwj…/Z`uֹ׿[np+%v@@@@@@@@@@@@@@@E`ͮΑZc5VZ^?X# زp5j 'X(c@?^?,&@IDATZO~z^r/hf آT4mDD??    +@EBXO3gjܹڳg*T},D mشiϟy湗mذAEU]pV۶me/0\nNjX%Kuia ǩ>:;`!$}Cd!v۷wƐ33^`&Z(ō7;6nԨX:>'~_NmP0YHiv\`i29mis>yٚjZG               ܹS~؍k͚5@CRdȪUիM,S1 @X} [n]/ ڶm[˗լYlLͺ "Iɫc&T4f"    @B xVz믿ٳ]DXTXQ'| Pq&M԰aC.]:f;Aۧ˗oB2žlZj^mڴqAOpC~7̙v#PBpfd/닍7VݺuUH[,;/oF-=xd 9g .\ ǚ;]j -Lо-Px<}Ѯv^T$)>?hϿ&.[LRٲeeAzh/UVMX6ߧԎ}4su?YNzyE@@@@@@@@@@@@@@@ {X-{tPV cu8Ǖ+Wn/mF_1zWK?mذMؖ9x`-,+_Mʮ6o˒%Kf]_ k-C!6s1xI'鋵kQGs%{nw K,,{  kEx"J> c\mߧ9?O u&/W??               yطo֯_,'<'o/`w]Yuqǹm,p˟V_cYlj*CB\2!ZJWc RǎwK>¼    ā@BjetAX…|.`f` 솳ԭ[WuQZd[nR3۵f͚4UVᅲwvl.eKҸqc%Jը ع&6@&?4b}>y8$$1 :۸qc~?QA˻~臢)4 }ImRHZI_.)vD \-lC{ك#6X 'இA[=}{租~r}B]lya? QFjҤ.%%?P6}=KK7,)M.v?1               +pa^OxMoٲ%TKo:cTB7ie󬞏*W\h)S cRm۶M[n=e7/o/ޮ]ҴjXllu~]rnE M+G3ΐڶƌtyk#    H@p,@fڵ.l˂*9Yx̯ZB|,znlUTImvn1ഛ?su 裏v-~XB/\}ʕ+C$c}qϞ=[ 쓾/ p YP}7bx?~iA>6w=,P P3~eOѣc= n{PC5Ѿ;.~V/X"ئMiOl0; 6=h}t&Oڃv>_㌶=zd@@@@@@@@@@@@@@@H|a5\,\$ϳ `u^.Wv/*[l=UB-#Sn},kΝi^;vHo2zٲ6xd@8 ,Hg˦3rIq$Dәg 3O      @B$]Vvv.`X8ݴ>|phSv#nYݜyM6nT*UKW% <솧˿qx6>o⛉4 `Еp2 dQ 1 XkY_PDg4|~$}`tXw޽{C}dxKi}т{ڴc>EY_02/Z?W͚5],^x8gٜ)SYԦZ^&!C ӬY_駟B}Y `6yv+Vt~MqA?bmk]}2h?-v,\pjL# ~4Ѻ%  's               B _Kϳp0$`u\wq/6muy&O[&{+V,͸dVWjXM[^Vj׮}z_'.|>KV6/χ}6+0Z^~]![@ i:!iƌ`VbE@@@@TH@HN -^[lqctV7 *&Lvng ߰5:8oMO:<'nrZYP)6ʕ+DK>7nt}BmG ñP>~?=U?/Z_ΪY_h3 /ZeF'õ_:gõ.L^WVD>fD fBzI{8>Y YϨ/Z?˪/[?[fcQF}1k{4UIZGo]hQK>rtֶC&i,FoyDzlm@@@@@@@@@@@@@@@ȳ-J,HX郖GV%<)mȪvSf~ЖmY}^~-'d/;i۶6ێ?v::n6ljXo~xxm+!VϫO5ի]*U_ruy=~hZVc?8@RO+NՈfΔWO=Z    -@Vϟ0{Mg;frF d?nvԿUЈ燔X`WۍΣ>ڽ( `1~_?~Q_~U_g}{x.8/~h2/:6XFõƏ'yZ^C X }3~hAE{J o8lzzw@C->MZxi` x8@@@@@@@@@@@@@@@ՌhC߯i?pʯ?mc2 Q@ց%7qwTPCZnVƟՎkHe fum&OՕJelغUzi䅂Yi bE6  c͛aZ&M.ծM     Pj)@p>=\kn쳃ZRr򴕖$JJӜ.KڦҰ Iw)/Cp @@@@@@@@@@@@@@@@`&R`XH۶,@myF^ԿtlJSȡ"q!nԥk4maZqqR8@@@@ȕZbc%@>0Ҟ==tr咅kw\v[} VPg2EBW/i´rZd߇O=%m4                P0 Zu]wIիK0F@ c+aZ%JH|µ#c%"    @(gDX´&M kM 'k ׺RcqzR ԧ77}Եt%kI ']iPNz嗥޽c|@@@@@@@@@@@@@@@D +I7J}J#ծ/@fϖwjՒ>~0    *@D=s7 @%KJ=zHFIoK*HIUJ]jOH2e?A;VWbŤZݺIm[4M2B&AsFY:tB; <(yԳtҴionz                (U i`k- ."bk )lԺ4}4yty     Ǻ "PtUK7J/$*$pTԽ{6@jeJ1`֩n+^<JlN6L9R>:4@@@@@@@@@@@@@@@J1]t4wZLg)u(MTM1 aGKZIKK_}%u&     @ D' (Pt5õ^xA:tH/u[oI;v$ciS< g%iɒkKK%JVimt,ysifiOn!               yI3gJSa*g%}Q-#V`^馛+J1C:{C@@@@b)@V, @ʗ}L >\ڷ/8R%KwޑvnXlʖI`Ŋ`V҄ RR#6wKHLٽ4Դi7"               I)оҬYGK/j%$ei K[Ko%%YS4@@@@RX@>4Hd k>05th0Hk㎓.L=ZCPPeY |Լ5*YUM$)Ҽ@sJ|@#ҥ3_w@@@@@@@@@@@@@@@@C3j̛'U.]rԬY0hG z-[ʫ;%}t     !@VjgZ$1H]'M,m =mtp-7fgOR3и TStkHg |S>ZAG4;OKKcjҢER^y$+#               ġ@ر҂RFzL6~58<` @ $ntyҠAwH3gJuf@@@@Hz@@ =VOZO?-k00Gڻ7\hm l9(vԡosQ r,0Բ3ה)R9 +                $@Ӧ;H}'i#]wԠ H_4V>\zQhiTZ^ߥ=%{+qJ@ FV SlW6ô:j E >>yj=ҝwJ[K#-X (*Ͳ2                @ XȑRNICR)N#I,nԽԧtUZAg i     @T@GR%馛i$aqwҾ}fZ[Bb {"E,pׯ_*46FI㏥M_ ^֍                 @ Ԯ-=jt]wI6vJp @ AK}'M ;,U*F@@@@@\ k:VDHT*U>֮Wi͚ջ4a.(B J>yԱt4eaPGʕKҢ l %{ԬxtRBQD@@@@@@@@@@@@@@@H@ե!C~Z_ZoOq @ ,]*k'/'-\;!#    Q P+l @ VnE1C'GUݥʕ}IeoA UPɳ-[N={SBAN:I3GjղX@@@@@@@@@@@@@@@@RV,@YSzA0 D_`^顇fͤ;~Z*U*b     @"  xC"8nj @~ X֘1K_,]~ԱTX~m'J+R" [aZ7K}|s*R>XHPiӂ+WJw!w$@@@@@@@@@@@@@@@@ MJӥm#XE"ضMz9nYuD`!@,&M ᇥ?Y^,WM@@@@@  \i0 ptKK/U"]lERR'Vz$9ؾ]:)|{ء[7i Ohٺu^ur-*T88xP6,SOI ]Kq                u%?)Xo礏?Gz:V/@ c@@zMAiǂtxy"    .@L! #:u,PkJ[9s㏗nY>]:|8Ge$x BFI{JݻKô6}/ .}>cF7nMKY                Gir+/N:I`@F`,Mwo۩0'E@@@@ PO uJ+}u$jդ?'\+un@Vnw}K.JIzK6lZ-[7JI?ZzZ,B                $PԧOśoJIMJ=za[@ .Vz:K*S&Rqqx     0j%̩@@E~} Ko>LjV^]3@ QZqFKPhI&v.L=;ռy6?^k֬-ܒ J)9s+U(͟/TNJ1X@@@@@@@@@@@@@@@@8(U1KZPz=ijE kg>6?䜓CJRD *I%Yװ EsUȂ$Q@QD䌤!U0 =3sʪuﯺfyi޼0,AB,}RHM*Wi@@@@Hj%˰@ClY[7ibiRsg8kՒ""'~pxZ B9rԪ7i?KzJ*u)>Efͤե#Gᅲ&O: !"               $Tͥ qݻ5z*If t}^%!}_sqh     D M (WNz?%K,L륢EK~Z;vP>}tw -wߩXb.%$Z<|q**J?iZ3/Zf̘̓9sy]qg&1N$;c =-H&V"m .tS(F                @~G2MΊ̨U˯%|7nT޽ZJoY,޽n5lPv#Gq k׮ԣGYk8%KVI< I2     RJ)Oq"@ kI)ԡ4nT\O?U/3'Ok.}n|t n'_I ֭K /)~m8cJZ^\_s |6)xvlڵ߿/_DOw* ~4jpKh"               ~G,}SG4{5\0Tw?eBvP6}v͙3ǫeaA^ۧ5kgϞ.4iA:akYNjUPlkʕ/cgIJɅI;JW3޴    $Rf a)PԽ\0d*mJGKժIŋK='sXv6m^}U|ٲe#<OxZ;wNn$T#QoDnu:Ν;5h =cJ*Uvp)|+W>.;NC|/RR*R &M!               GQ 5.I&H H I͚IW_- &{%DkU\{J&Mooz5eom޼YFRt4sL/nuVlһ^PbԫW/߿;N x׿JPZJz)wn@@@@@-@VEi@K|7A+WJҺsuRɒ[֭S6me/u[HKmⒾP-%=|´,m`iH^7۷o_eȐ!z]3^%;e6̚%5j$]sa5iBL!               IMĮ֯hFcu*TJNQB:_1HG3fj4mT 6xbo;d޽[<@tSٳg´Ν~-8; p7B֕V> ;     @\i:1@H|l% Z:TrsԳղ$骫sQҲeMhժ׉K7|obFizcupĉoemVڵu޾gmTJ=sʑ#?._|>@~,YW_}U'N(]t.t͜9S,-2eR] YI=#}[h~ $ Lm>sOʚ5-w}7;vP^ɖ-:t=$ ܱglKǎ}{<<~!<ԿX_?|>#㏚0a*U{*K,:;u_j*Qx (P p{z7`oWjռw+XgĈ6lI&jРR()0RҜ9RZr[Gv.!               IH Pj:tȫ+QP!wstMJWAf\AѣG:E?WȂnϟ?&~Oo2ǫodlI*UO,ys_ƌ z[TXS2zhU\9p-\+yrNN\4h~l!    \@ K@@ ZF.Ij\<*SFz%C߹O?Tk5CleCZn킽\[l2F @ڻd( ,~ * m`֭7 ­N/(}lR]۸qc/;з~I&yY_w³,',Dڱ0-[ZԬY37lC*XN 6կ_)qF^ؿomݺU5uMcZ.; rFZx{z詧>}B~g~a׮]Z{#GqF%DuwZS~W݅:/-pΎ٤`Ss,4lȑZ|.]1T4B"{mᇷ&(͞-GV"?n               @ 2TW^yEVjPTݜp{W\!YWD7,u"*%}t622ҫzj+c5P`9_n߾}^}_~ūwkʔ)^@O@w}X*QD{[C3vp޹@V x1k)αE ,>}d\)4Ws[e)eƸ@@@@@R_7" $˩rASڵҼy~HM\Y".GKkնm[QEUϞ=u7jذa߿lREJ/^\7tw,duwz%HYٲh"(feAAc yٵe=,XMʮ!K}?/}Wˀsy]dė_~5i]gr:;e~f_|, S~ '&{5vؠS?ԥI {Wuf%wD'7ΛUƍH                @2T+zk;S'?ˏWZJreWrR{I\-Xjʖ-ׯUzUN8;Zp(gΜbu|SF_\{9YՄZ4O3rHobbYX/cƌK?].LołxZx <ⲏϱnZ(7d,XP;wٳPZj)K,Zr71+);WY콲8^;eqM坲o]}nH/5nXW]uDŽx@;7Kԧt$8'b@@@@@@@@@@@@@@@Hs|RS;vL`~Gpk\C>Pկ˒yiKɕb5]Q:u9sYݡ oO?T V2e۱`.[L|jz7׎WDJԣGY׮]d㌹;vheA -}_3Ȃx@.Oݏ\     |oJ $eWը'dZn^^{MPֲp+ZMp +V7Ի?%-d7zm̭ޫNp?/R|l\'OV-T6['jՒVo׮^|1~B@@@@@@@@@@@@@@@R@is~Gk ~޼қoJHzJ#hQɂ\9{'LcǎźСC:z sUKɮe….ͥűħ~W&d_xqi [7iz.aZa@@@@HD[# j-%0c&-+]uԣj{RZ5Yc矽O5kПMXWYgҵkWv,0˂Zn& iӦ4iu뭷gyFw=H_|N8QFdɒʚ5 _5;߾}{_ă+T|IWZW߽m6K^eʔ;)P.]uVjJ73gĝ={G*UJjRʝ[.xԲ .|@@@@@@@@@@@@@@@@ ^ n.;_'^%H)Kҗ_Jc![7}B )O<ڽ{}QTTWiS/w5ErBbo?~kŧ&Ν;aÆ?[~7uYƍ%?^Ç?8qb]`"""TzXKVbE駟O?֮/)[6@@@@@Ml  @Jpڵ?õ,F ҥ*UߖV[nSz1bDE6"o޼zcI6B{=o2eƍn`K U&mԯ__{#<6m}K*rˎ;!łrȡEz=vlb6Kdd)f֐!C;acqēW_V%wl:`lZ۸x6~Ӊ'c\*YLŎVe/[}{<{1gYpXwv-ڶm9szMZ3fw[n^ԸqԫW/VZU ޣGIWk׮ &mYxW4iԼys}'ʗ/__;ճgOٻ;"[eK߁|b kmLٳ&H]AcA@@@@@@@@@@@@@@@H?w_fpHM…!w$LMDx-&ڴI.lJ}1۷KK>* v|F@@@@@@@@@@@@@@@HhZO{qaZ6^zIWWtVGD ۤ iC                 !&tҷJWKW_-5n,͟8I^ 2j8IeJIGHFI˗K=FV @@@@R@nI  @,͛7kڴi:uDjV,>TTI[\z̞MÆ 7{|#FHZI>*Yp[]SQLws^O.wSʔ)(i$ϥ1cΝ[(                @sʗ֒o3.jӠAԻw.>[?knl9@XT#i@*kׂP!I#    &@i |D@3-[kM2E3g޽{fͦrjĉZʖj֔WrOXkF)k֬AڵR~җ_Jh5cƠފ@@@@@@@@@@@@@@@@B$qED|W_ MA,󂵆CH-['mPEW\!uTR8Vh08~\=ZittiG9¤t@@@@@ j@HQQQZ`Ml͝;WGqAZTd]_O &PZR˖~PM&!GxإnZMVTX'dR޽&N6:tRJyIuOF\.ѽJ'*TGE@@@@@@@@@@@@@@@@+c?4cTvu`q ٳGgiҥ.L:NVժYԭtq 7J}mRFR.RÆ 'D/@@@@@ :[ZF@ E:tH?e![-rNµUtzu]US7ݔ!:\+_AAZ?? DVԧN7 1C tg/"#0OfK679@@@@@@@@@@@@@@@@ P+f͚>}hJ6kk;몫*kW; I$'ɓO?ƎOY*Z4     G@q@.L`׮]>}5ե_J>rAvSTT]uZJ;潰Lnݺ7PT=\֋jItIGf̐nMj\0@J!ؾ]+?Hk+vC|sG@@@@@@@@@@@@@@@H9Yvy>ʕ+]POMW!-B/Q[Ki$!3֭rԷzTC~]tIft@@@@@ Hj f@@ nuyZӦMӴiӵ}6KkPO5jӽŠ䉻 _?֣>.|M @::sH Z3`t#wg'JYȅAZի'R-                @ moɓ>}飑#G)u:v^ED(/ݣ     (@V"sk@RM$Yd5i4͘1SGw E*U=]ye]uXlP\)M;l0nV'Nܡ/:uJ鍦ϗnžՓҦMa:ٳ-׾} 1͛K2i                % uɄ4mۦ~Oj5Rm^~^2شIKϥuox@.)c`ߍ@@@@@ZIg@c4ߥ?M#FLՊu17+UX=5kVOO?}""%~6lGwQ_P[WUK)Kw1P\) $ (^-U$YV6R#m"               ZDvN8ɓ'zkԱRneQ?v-̙=-ʍi;iD)W.C?HlG@@@@7@R?tr=MsLUdbI. l)5m*ȑ9_U7H^?Gor ,Z$թ#U&%eȀKb l* i-Xg}Urb#               $Z -ri&}s߿Qs:Z>M]PڔH!ZJ;wJ"u$5k&O     @ P+Y>V @XjLIskdL  jDʞ=y3XzIIzMks% i;Vʘ1 1 h>iH?Dk4)Kys{4iP(                @ 2(͝!W_T:>y]sػW2Қ?_*^\Q^)"&@@@@@/@@@`ihiP-)ujaC?\qc)[0duaTm۬_nݮ;wJyy*QڴR֬g?nʕ q2g>Vao@37L!ZpZZG@@@@@@@@@@@@@@@U'}NQ*UtFQ^q9m0_炴j.(]HO=%wap5U iTi(I;nY..q!    B@P& T`n-\,teKBwd T,kݺzQzm7 2r?1g )}'J'J'KٳʕRRN]^0C,D&8? 7m!               $ vҤ9{-ХR%iѢ_.EB>Xz=NCI>+,x)]e' (m$ը!{Ԫ#G=G@@@@H\ן# % %Y(kM.K'zuR̗xdGrZltJ}Rbn-ZHQQR>҃&cT)]}{əSZp*\̠s4ǩK̙h .YH^Ro bW@@@@@@@@@@@@@@@@d(0qԨѹfa[#=,*p_w%ԩR"2G v  ϗ""ҥÿ@@@@@  gD@@ }*\ nõl)S<J8qBU>_~)Vl´l_.]+٤%= 6T4pԤ/4ud[,h &!mYVVRѢ/"               $}!{},RI7J  L#G~=͛P_J ]h 1W_IKK͛!ZuHS'~     @ P+u7ʕE t܇V@@@@@@@@@@@@@@@@@.~cԬ)Ù8@79p[Қ5wKT\LNIilm5"#uv;d ݽi@@@@@ e ?G@ ElX'e,5n4lµFKj,)X!~r[,,{%sPE9sbab,l oQmۤJeKB.֕!               )]jpC ջq( !%}ԣltR׮R qw@p,u߯hi#,{       P\:C@d'upٳ,Y&M .nPey0-$tsBlNrZ,DlYiժ3lP- [+T(9]wIw!(-                xcNgaZV/fSC \6KO?nݤnя,Ұaʝ[jBjJu;     @b @F`&oCs9Nkr.ٻz℔/k?o_)s_g֭*U"#wg֨QM WU*-\(s:bZQQsIo}8sd,md˝w!ZA@@@@@@@@@@@@@@@K+ǾX Lֱ p2vm饗z©%%i4)}z֖h5hpZ[)1"    Z  µϗr攚5Z=^S3*%oeX;vH/%=*?wҤT~)IRZgu H^{M*_צ3>O5K23{74O2@@@@@@@@@@@@@@@@ 1JV:u ]̙Ocp.o!YV~mkoWr8pe!Z'#, !BY$Q2@@@@@$:9  zJ;WZVUQ#ˤ&O>J5dȩ- VW]%|=M_g,<%*JZ@13IMӗtT$ Ҳg;laZ1~M]ZHUiTc@@@@@@@@@@@@@@@@ !TM-Ҽ9aZ =#p~yyoTFN<=}TڲqE8tMj%YvÇ޽mXwMV0z@@@@@ |RtKv! #`Z4tdMciaM^xAP«b#a?8Olxmi.ĉSIb7 }cIqob= - =,Vl)̜)}?e:P!qc~uJӧTƍ                NWK%KرmII`"Fj//u*lw͢ե%ٳHk,Dk&]_ye!Z^+Y0                 &p5/HٳK >.D`RА!~`֋/JIiӞj[ɓ0EZ]v<{)OjHYСR DV-?B Hy&@@@@@ !#@@DxAرw&#%U~ פk4j$YRR\֭'8!YY۶RnRRIq4ʕ1c~۽?DI,xw%@@@@@@@@@@@@@@@@B#Ы䓒'4UC`*魷…矗:vSS=FŊZ&rI {!ZÇjB-BR¯1"    [@| P *ڻ7PT$ե+>n?tbv]GՑ#GÇj͚kt]ڿ?B^{2dXÎEǏޏrpUۓ'OV[1J`km4i\ Vj65Փ.]:ovڼ4MˏP{82ZӧOL2)cƌkX,Ys͜9w/),QiƎ/r,,mΜIa$@@@@@@@@@@@@@@@@ 9 X 6hvƍڹsvڥݻw{[]rjjq5I!#VO$PS$wܮF.o}[ t"E(""[sȑIS2XNSOʛWʗOZD2BC jm۶M\익u֭ji`0A4͚5~Sww֢EPB^Ѝ,[v^ o&NjՒz@@@@@BԺP1G@2E_9[sX'ץqٳ[m?u߾} "\M@s-"elbəaSĕ\u5CUm\!W1Xg ׊klA]Ю^ЯS n\a1Cbپ҂l"Nlbv,{1ڤ9[sԪ~M3`/;vH&HK&eƍnoJ{                ]w.]Z|]pP>/`'e['߷oM=\u*jX=a\o!]eu\)]ʕ+j^K,)‚@8l,4p`ܽP%P- b}?%.k͚5^=# ®baپ i ;꽓¸lk!]gbߵp *ZIuq;BN$թh5k懬%ױ3.@@@@@-@V~@.A`,7-'u䩭Cy]MkKn]]?6Q$fR ,YVlX @+=?oYq6A 6;}& G L̉yW ghl^m޼ys͓'&wb.i8?Dk$ծ-zUTo                @٣;vx7˼+ XbVq!ecL Z.kj!_˖-{Yؗ1VSjբ \}` }4|\x\ܭZ~% ;wnO?y5wҤIºJDX-[VE­ ., r¥GmٲE֭Օ+WF{XBea]UTQ5W KʋӨQȑҬY{鮻&Mj%w@@@@@'@V @R*لuVo_(22 ^&WtBQ֌*kLޚ-[\ Rfo͟?j:)̙3:D+k֬%#`\el{nڵܷc6v&\2f(`?~)9s>ѡC9~]s6թsXݖAJ]~sYc~}@@@@@@@@@@@@@@@@.p̥Xɓ5e^ ީZjZbEJ;8kYP`]|U|yկ_ܢڵk+K,A+ pnU2e~BJC=Ǐى'_Bwի{T>C n,Z-`˂͛eŊ~5l[]͔)S"nxZI*5ooe@@@@@.@VR@.J֯_7zMbo޼ ?ٸ]vejaFqS7-[^>N;JI.<*]reb-|gw_Ǝ+m(Q kРΕ+W$7ɂf̘Ժuk5m4l,͂FF \*5ih?.,)W@@@@@+@Vp=i @D`ΝZfV^֭}E4s*TPtjADZ ,pamݺU[lZXkddd02eʤ-Z[-d&'d'[`A@@@@@@@@@@@@@@@@3fi=z ;հaCVErWSLш#4qDI:ud=ZղaA XlJt$ b:_j)j-͛7Oõ{nU^]w]t<&LBM5nX:t^J*AG\jt?D͛b䂾nҤI.q3@@@@@V@}4t @'`V\X":@+d,9`AdA1\rVG Y X܆ {[lsk׮ƍ$*7-6Iޟ%KtұV{zbPz @@@@@@@@@@@@@@@HVo߾e!5 eQ͚5S|B{bCƬNGC|)(Hib0Jh:KҦM+#Xe[ V޼w߾WJԶm[オK)m�Ai֬Y^-GyD:uRΜ9CƱg4~岽UeAZ+4     @ P+I?>: @8~/矱˗lL2yJ*%[K(ŋ{he̘1C1B(`mq,`kAjժ5Xgl+W.ZlYeȐ!=)@@@@@@@@@@@@@@@@XdwÇ{Y;vwI辄o߮{cVBǺu릛n)ܻN,tkժ2e~}/i]jԨzeptR}e3:Ν;^Pr+cٳTڵOhED64     @ P+Y?^ @زe~7-^8z #G(u*V YXO`kZ rܬH;vxZlge˼;4ixA[+VTJZ                 @x X _]#GԕW^_|Q-ZPڴiûaл'Ojԩѣf̘oQ/֭ UСCOԳgO>|X>z)υFI%ב_;ڷogKy习Fׂ,D֕+ܹB̤o9r\P\     @ P+@@ q6lؠYKuV/Bwl"*T!C,wEx w{,Tkɒ%?t|\Μ9UJkQ2e6!               V`˖-^xրtתk׮jҤW&wNϙ3Go&L S`U K.ڱc{1=3 h[Y޽0cǎ:utο{vɽرĉҞ=Rr~VR͚R4a08     @ P+>8 @R8|~'͝;W͛7{Y*UUW]Y&W8#G#+@IDATE)ڿrέUZj^ TSٳg?OF@@@@@@@@@@@@@@@ɓ'駟zaZٲee`5ۙ>}q{UqMBBOBQtQ(E.xћ( BIHf Z3s},r9v옼2dS{'T/_6߫yI6m믿ٳ?UI[n,Ǐ75pNOH?)YD~!Zd剫H *P:=     <ZO+  ݻwe˖-o]$88XJ(as*U$ix#s_ ,,LY%t= 2eHY0TCj֬)2dp~f               <ҥlڴI/ԩS?8-CBBdҤI7o޼2{l)UsO9L`kL2E֭{%/ѣ߿_}wܻi<)1H&" xz&5      P8s@Z <<YF֭['񇸹TVMVj^{{{;C ҿ!ܹ#ʕzM{:gF@@@@@@@@@@@@@@@T@Cڶm+ӧYfI qٳgsΦ^ԩSW_u.Æ 3AxǏ4i8|BCCeĈ2|BKnYYd "}x @@@@@ P1D@1|Z,[L]&+WuJZ/H)sszE$! #7n˖-[$yҰaCiҤ4jHҥK$,$                `O3fHݥEcO8Қ QFMpO1ߛnݺ'J=PqU]R|yYxxzz:t     *@@@PP^ZΝ+K.iܸJ%}@wlذAV\i=ڵM0qA9@@@@@@@@@@@@@@@I䭷2N#FH ajI{q%!1*&:u%KȢEL͕:TA'OYf 5n 3!@@@@@(@VB|* @&'|̜9ӌuҢE Y$K, @R]vɂ _~WJ۶m{#                s1<#G h8R6mdB}mwyGM&+W4uina.ǎ^zIʖ-+˖-770lƈ     @ P+>: ֬Y#G͛7+";w_~YsS@õl"3f0Z ODNC@@@@@@@@@@@@@@@ؽ{TZU'EKZ3^sJ۶mƠE9s~/ҪU36={H5o߾g%3_@@@@@Zϔ! 84Hkr9ٳGrȑ8(@ I ܼyS;0aq1btQ\\\ G@@@@@@@@@@@@@@@-p})U,XPVX!I$_L>]:$rJ`c8K… RX1S/x^H :v]lb - G@@@@@ C@Y 9sFz%;wK߾}%M4rq+<<\ԩ#)S˗yObUVaWY6Ϥ?],l2UZU>grߘnyfYty~~~1fL׮]+,,Y"Ǐ'|)۷oERH!7-Z$X`O> 2ȴiӤbŊ̌C                2D&L lٲ91 6رcܹsҰaCyWx\I,X`8FÇL2RdISAp I kN+ɓ'INZkB\2 5ug"ᅯ\tIۗ`kat     sH\@@ hhi@αc$cƌ fl 3;<<@s                e̘1aZ}h0/,)R#G/gcɒ%:ZQMÒKiܸ )WnEDȑ#/ȼyӊi wyβ=uݺuo/ҥKŋMMtJ'      I&PD5o@@ |G&LKC4T(i?~\tdz£]Jmn˗7H: uo#uԱ{X.]L2ӹwM-Xv@ _^ çvԳ*SFիL92eJOe7HvDh                @R1cҧO2X"F'OʢEd۶mңGs̚5+Z!|I1GhԨ*UJ&Nw"6m˗OH(ҥK[Ξ=]pI);v۷B@@@@@X# ")! $p!D<+W.e2|7oʲed…2vX _5 >Sɚ5:u5$$,i׮iFdذaCٳ4lPvu YF/|Yb׽Yh PqK4ib]n6moVN>m׮]{d.*M/_^}2♙3gJ)_m;ӛϛkȓQ_|!'OZj @۳m1:SuF jb @b߰P4nX7onM=                AAAǛoV"͚5v~5k+W.S ZVNƌ#ǏZ!Y1MXv[ԤhРAL=Zcr)Q3'7Ix.]3gHڵ>}?l͛WΝkXt["3qDSu&Oi%m}_|ѼֺPZIDi-W^yElg0϶mL]=M-[6=zt)+c6O:u#D@@@@@h\=A@HӦM2eHӦM|5DIڷooB͸'Md4@~APw5Lݻw7BΝ;k´EP(}aZׯ_7R+W?H͙3,. JJ4UV2bs5 4&piu1 VD["EL.-m3!X:& E%:moߖի_?( f?Ȍ3²>}c믛)s~ yt>c z7⼗>'gɒ%g4j: kt9sfxA]uڶlR>sR Y۰aСCE1 oر ZnL?zkt!Z͝; Am^1=;wΜ 6uE+4^",AC@@@@@@@@@@@@@@@]@h™bmSqZcK/+ ڵӥKiҤ%ӢE SKeղk׮~ϟ7?>3ׯ؝ŋlkر{J$Ǐ7#HlZIkh]aÆK)S4w $ovbCu*Vh4Nqyyyc~~~昆]i &և:z>||#8^dɒҿBk{q5kV'Ns.Y[)m6X tjΜ9%cƌƎ+>>>)SDtኆPi.^6zhٳg|f1.ڵ&LEX.\Xta6 J6 ҹ{mѰ7 g Vl⺗.n 3OF,x 4 w7n,5]3`Ÿ)4xKHCtA3g4ߺuKt)YlYD~gjkРkoҥh:뱸ݳk&qAv)jD(AX `                Z_mSS펓'Oʻ+:u2^cԨQC͛gj̞=n|4\K~hVӦMkZԺuk5kN_?V>Y륤JJf/qhMmjPW_}eB{ ۾}HBυ $:Dځf:)[w*nnn j8#RGɟ?_,X gΜ=z;u."    $uVO @$*U.]JtO<#c}4$jbӦMCy뭷d2uT\YСKHX?d˖M4PjիWԩS.Ұ-@Ν;7n4T5oߖE)pC:(P,xYa{6%5}t?ydɑ# Ȳt16up(Ohx[k۬#ZLە,Y<3\uޯyN;v vy駟BZj[,+]ϫyh8>?kKg4,M_cq >\t\Qs\󲮵&>󰮋ie>Il*15ѿ4@@@@@@@@@@@@@@@@.C1ԶFǽ{/XmkذlٲE.\(X6ksXz]P!$"C #GʠAߖdɞO>rp X_Vm%{MҪUTt鈺C 6mژ;!kL;?ʕcJ&M"j$G\G\]=Z֭['*Tz]ۻ]E'     8?uN4@H]vriunnnQr咹sW_}%|Ӝ`¡!b]TJٰa;v,Ri]6iӅRuc{ݼyStnRZHc—~9sf6l ׯhH4e]l{j-.^-.WsJ___Yl5t9|y?cBdѣ)wtWWW6yѽhY Ӛ8qt)x6/Bk3뺘Vܝ;w9ECҥK'Yf}䳄z@fϞ-}ICd\                N"Eح_(>-b'N1Z[XNϟէ&}l޼Ym&'OuΝP[\s h$mZJС ߲#jM'99     @Ro @R` $af͚IݺuE4d&)4]իW/ ӦMKJǎu.npႜ={6G9,YD: 5UV&0UT]C{+W";. B 1}#>񖺘JV2b]t1ANQ/ mzsϽϟ/ 6nݺ4 mmݺpz[nE7>.2zڦ>>>~7z/6f׼l< .ltQm WJ%l'{x[%28@@@@@@@@@@@@@@@@Zg@xأE{gʔ#}SH'=ի֧=:owww)]]E!P`A4ojFG1zECBBBᅲs՚5ku2GƓ5kVQqvaj;/_޺%{@@@@@ZvĤ+@̙3,^6'-yxx/fvʖ-kܲeKw-)SPɆ*6Ծ}{c"4iȼyd߾}fDΝܹsz!_4tI[xx6nh>nԨ̙SҧO/bD… MVz=]b]kϹZi{5ʌm۶+,ΚXlڵnA"?> uOFC{=ɜ9̞=[;sŋP,F}6GlD4믿L8%} ۶m,YDRN@@@@@@@@@@@@@@@@#Z-J*Pt__|1%v{sN]cN#}N5k|cx!s4Mki=g6m$sRJZʌAiZȪG ѪIdy7Mjo͛QGGZOJK9s)Vɓ'     I^@$@ xyyPX"XRTVЏ⊳gϚFnٳgϾ+J4~xyL?PҥKg]v~C 1 ?tH^L0.۷ vz饗dذa}W^]'*Utԯ_|A`˗/7cqҥK#B$}MRhQڵ9b.^9p|'9[."\lܹ>H+AAAh"sMMȔ@M>]N8a?ތ .cf2|8p^i믿n4XLMt3gΔ۷˽{/4RiӦ O2E#:twU0'i?sD@.:VjUWcm{075/=?^\jUFq1cD ꢥ#>>>wϹ` }Ȍ@@@@@@@@@@@@@@@9v올\n}jG=z􈳶EL5:b:u8֭+Z6LHkd̘ {t~Wz#ZSdܸqbզY~M>rU:tɓlٲz1vnk&7nÇ;d6l;w5ʕ+4cC /ٳMɓ'ˈ#u=ֺM2asL^M%;^?̅n^h=)'ҥK2qDϥp±\diͩYf>     8F@-Ǹ+ J@w~WmJ˖-➄6 ]XԪU+믿:v(3zh5 I4(K.i.Fr=lWtY0 =|0"Jp͛7Kٲe肨"EȶmL.&pҿ)Y >ܜJ]tһwoiР/_ބs"(]a5 E#0,UW]Pc-3.y6cglŋKҥ[/yuQ~c^.k֬1niذڪWBm}ߺ:7nXv!9sLe\                C+"~adȐ!Z&1ƥuVڵk':u2u9:t`jlٲE}&hH:$}ui)R;cTVv9pΝ;R4?zPuQ#ޫ`Ǝ#%u4|j{L26@W_}+>uRJeh({Z||g)S&ɖ-\vFҚH-Z0U!ufM\?3iS#i{3F.wMLC@@@@@܃^@@  hСCe̙&ދJDӈPuEƌ=WÎ4&(uўCý (`_ r2aVEXMÂtA>?L~邑ZPP\pAgE!}5n2YQ߫.JI>uk:Ml ݬyiO2eEzH̙#}ej?~t 3 {vEw`*=ٳggWtƞPt=bL4nԩ&8nԨQ&!7S@@@@@@@@@@@@@@@@ hRJɠAcrArRٴH<==pBiٲ (_E'n:pEIf2ݻwKJDCF)/_6AnVۛD;55itM7< Ӛ5{zڿzӧEie;^ߣ *1@@@@@ZI3_@)pQ/ʕ+K>}̂ ]@{z#FŋcHZmܸ1s@+W< eG|3pkʔ)SL&>2>C@@@@@@@@@@@@@@@_~j*[;8v옩Ӿ}{]g\m5iҤo]_w,URńi](77gq[     @H$gͤ@@ N"E7|#HH^zI֭CRF ~1ШQ#)Zh'Iʔ)c@ŋ .PswB{օ^sΕٳgKPPtY:$ t!               IVߖ;wJ˖-Eaʗ/T4h@J(!cƌqd#0n8ٻw~?UǶ#^ej^u+u]>6n޼)k֬]T@@@@@\i1'  dڵ2k,Yd$O\6m*͚5ڵkKTzҵkW&bWtF-p..?ߡ ʥKaÆұcG                @" 25o.+W*U$ҙ$a9sF֭+)SM6I C.^(իWoooSI+V~޵mVF%3gvȸӇ:otÆ ND ψ9     8ZL xXB4Fݓ^zI|}}%J +pH)Rh8Sd ֭['7on6///g*@@@@@@@@@@@@@@@@.`ĬYFf̘![v=Ad 4k̙֬eʔ) C թSG%Kf3rFovnMCh ܸqԷٿ1D"     ]Բ+'! 4f֭l2R3J͚5VZRZ5р-WWפÌ@N8alܸQt;w(P@ի'52 RLD}s                Hhh{2vXׯ9R<<>>/J*UbŊ!C4Bn IΝ;w^ٱcf lٲI5v&H+_| i،@@@@@@@@@@@@@@@p  tݻɓGOnj8$N>-=zM6eGʐO>?[o%}lv|`!!!W_ɐ!CzO?ILxB@@@@@ԊK@@~3寿`ɟ?TTI*T e˖5Hnݒ˟){]vKbL^jLV|                 gΜ7xC6ol~)2v|3G_|hM BX@WIQ@+)R1cH˖-"]uVVvq6l_\]]z:C@@@@@Ԋۈ3@@<0A:;v0a:{]<:ٳg7ZK%JHɒ%hѢf@W `>tm~s˛}UTʕ+GE                 hEk|G&X&M4]gˬY?ׯˠAL@{,W / 40mʕi4TPfΜ)חI&IA@@@@@$@s  ?۷o}MܻwOܤ@Rxq)R Ґ-}.]u+xwޕGOt;ry$xO. 2>>[oI6m= q      ?j5@@ 2ZtԩMkV```\SHaµr%Cn3g77kx@bЅM׮]/Fi}     @ P+>: +p]! ײ.\0aCΝ;jVL$k֬-[H{]eeȐA\]]#А,]ir\tI._cj"gins6hkooot                D+u\/_.X„k+WN֭kjժֺp*v풵kʺud۶mu@jժe7o.Z@B 1ݟ~I/^, WLiР٪V* uWXXٳGV^m۷;___i߾4nXRJ8@@@@@Zǝ" @Eõ#‰44H<ۦaZI2fh^u%]tf^;/[^-d±4 ڮ_.׮]H{=իWE'ٶ4iҘp7+MlgnHC@@@@@@@@@@@@@@@@~zYf :v Ӫ\VJϝ;=oоΝ;eǎfۃz{Ml7?iҤ1ghk+4Mҥ3aj{=SG@@@@@@@@@@@@@@@@ Q ܹsGv-{1A8saSE'Pr)r2edjsКZڬ(V1Z!V۵k… rMXcp/ ЬKʕ%C sA ) oEk~2wqSG2g,sزgn~+5}vNm{~^{._,Ν.]d6O޼yM}-[i     8Z,  8>YZ^YaOeQQC}Ԑ)]dUt!mP""EX4,jHVpVڴiM8 @@@@@@@@@@@@@@@@bx=z؆\@Qi ɑ#GDhiOBL@'!@ZرcrI9{Z+W0,+.wTh WЮ=6" } }, "node_modules/ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/binary-search": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "node_modules/builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/chalk/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/chokidar": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.2.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { "fsevents": "~2.1.1" } }, "node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "dependencies": { "object-keys": "^1.0.12" }, "engines": { "node": ">= 0.4" } }, "node_modules/diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, "node_modules/es-abstract": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.2", "is-callable": "^1.2.3", "is-negative-zero": "^2.0.1", "is-regex": "^1.1.2", "is-string": "^1.0.5", "object-inspect": "^1.9.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", "string.prototype.trimstart": "^1.0.4", "unbox-primitive": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-abstract/node_modules/object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "dependencies": { "locate-path": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/flat": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, "dependencies": { "is-buffer": "~2.0.3" }, "bin": { "flat": "cli.js" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "node_modules/fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" } }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true, "engines": { "node": ">=4.x" } }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "dependencies": { "function-bind": "^1.1.1" }, "engines": { "node": ">= 0.4.0" } }, "node_modules/has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "bin": { "he": "bin/he" } }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "node_modules/is-bigint": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/is-boolean-object": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "engines": { "node": ">=4" } }, "node_modules/is-callable": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-core-module": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", "dev": true, "dependencies": { "has": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-regex": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-string": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "node_modules/javascript-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", "dev": true }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "node_modules/js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", "dev": true, "dependencies": { "uc.micro": "^1.0.1" } }, "node_modules/llparse": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/llparse/-/llparse-7.1.1.tgz", "integrity": "sha512-lBxN5O6sKq6KSOaRFIGczoVpO/U/37mHhjJioQbPuiXdfZmwzP1zC3txV9xx778TRNFENzeCM0Uoo+mE1rfJOA==", "dependencies": { "debug": "^4.2.0", "llparse-frontend": "^3.0.0" } }, "node_modules/llparse-builder": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/llparse-builder/-/llparse-builder-1.5.2.tgz", "integrity": "sha512-i862UNC3YUEdlfK/NUCJxlKjtWjgAI9AJXDRgjcfRHfwFt4Sf8eFPTRsc91/2R9MBZ0kyFdfhi8SVhMsZf1gNQ==", "dependencies": { "@types/debug": "4.1.5 ", "binary-search": "^1.3.6", "debug": "^4.2.0" } }, "node_modules/llparse-dot": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/llparse-dot/-/llparse-dot-1.0.1.tgz", "integrity": "sha512-3e271C2LuDWBzhxaCUDzjpufamoEBuTYQz83QyMixI/i99BntCEk6ngHWOhhDb0XdtNNh6qAfRmXyjgNP+Nxpw==", "dev": true, "dependencies": { "llparse-builder": "^1.0.0" } }, "node_modules/llparse-frontend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/llparse-frontend/-/llparse-frontend-3.0.0.tgz", "integrity": "sha512-G/o0Po2C+G5OtP8MJeQDjDf5qwDxcO7K6x4r6jqGsJwxk7yblbJnRqpmye7G/lZ8dD0Hv5neY4/KB5BhDmEc9Q==", "dependencies": { "debug": "^3.2.6", "llparse-builder": "^1.5.2" } }, "node_modules/llparse-frontend/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { "ms": "^2.1.1" } }, "node_modules/llparse-test-fixture": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/llparse-test-fixture/-/llparse-test-fixture-5.0.2.tgz", "integrity": "sha512-61KI5J/b5uyRktD0y1EezleEW6UfaxhHkn1adLKNVemRZzklE+SpLakr251qo04kb9jN/ytk8lllgK+yFOj4cQ==", "dev": true, "dependencies": { "esm": "^3.2.25", "llparse": "^7.0.0", "yargs": "^15.4.1" } }, "node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "node_modules/log-symbols": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, "dependencies": { "chalk": "^2.4.2" }, "engines": { "node": ">=8" } }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "node_modules/markdown-it": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", "dev": true, "dependencies": { "argparse": "^1.0.7", "entities": "~1.1.1", "linkify-it": "^2.0.0", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "bin": { "markdown-it": "bin/markdown-it.js" } }, "node_modules/mdgator": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/mdgator/-/mdgator-1.1.2.tgz", "integrity": "sha512-S2GvsLIznUQ2McXfpe6BCD+IqhnRuHcBO7krqnvnsHgDpjjO1mLhr0vZtVa5ca4WZET037g3G+94DznpicKkOA==", "dev": true, "dependencies": { "@types/markdown-it": "0.0.4", "markdown-it": "^8.4.1" } }, "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "dependencies": { "minimist": "^1.2.5" }, "bin": { "mkdirp": "bin/cmd.js" } }, "node_modules/mocha": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", "dev": true, "dependencies": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", "chokidar": "3.3.0", "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", "find-up": "3.0.0", "glob": "7.1.3", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", "log-symbols": "3.0.0", "minimatch": "3.0.4", "mkdirp": "0.5.5", "ms": "2.1.1", "node-environment-flags": "1.0.6", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", "yargs": "13.3.2", "yargs-parser": "13.1.2", "yargs-unparser": "1.6.0" }, "bin": { "_mocha": "bin/_mocha", "mocha": "bin/mocha" }, "engines": { "node": ">= 8.10.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha/node_modules/ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/mocha/node_modules/cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "dependencies": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" } }, "node_modules/mocha/node_modules/debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/mocha/node_modules/emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "node_modules/mocha/node_modules/ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "node_modules/mocha/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" }, "engines": { "node": ">=6" } }, "node_modules/mocha/node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "dependencies": { "ansi-regex": "^4.1.0" }, "engines": { "node": ">=6" } }, "node_modules/mocha/node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "dependencies": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" }, "engines": { "node": ">=6" } }, "node_modules/mocha/node_modules/yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "dependencies": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.2" } }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/node-environment-flags": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, "dependencies": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" } }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "dependencies": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", "has-symbols": "^1.0.0", "object-keys": "^1.0.11" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.getownpropertydescriptors": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.2" }, "engines": { "node": ">= 0.8" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "dependencies": { "wrappy": "1" } }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "dependencies": { "p-limit": "^2.0.0" }, "engines": { "node": ">=6" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "node_modules/picomatch": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", "dev": true, "engines": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/readdirp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, "dependencies": { "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "dependencies": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "bin": { "semver": "bin/semver" } }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" }, "engines": { "node": ">=4" } }, "node_modules/string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "dependencies": { "ansi-regex": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { "is-number": "^7.0.0" }, "engines": { "node": ">=8.0" } }, "node_modules/ts-node": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", "dev": true, "dependencies": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", "diff": "^3.1.0", "make-error": "^1.1.1", "minimist": "^1.2.0", "mkdirp": "^0.5.1", "source-map-support": "^0.5.6", "yn": "^2.0.0" }, "bin": { "ts-node": "dist/bin.js" }, "engines": { "node": ">=4.2.0" } }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "node_modules/tslint": { "version": "5.20.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", "diff": "^4.0.1", "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", "tsutils": "^2.29.0" }, "bin": { "tslint": "bin/tslint" }, "engines": { "node": ">=4.8.0" }, "peerDependencies": { "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" } }, "node_modules/tslint/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "dependencies": { "tslib": "^1.8.1" }, "peerDependencies": { "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, "node_modules/typescript": { "version": "3.9.9", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=4.2.0" } }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, "node_modules/unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has-bigints": "^1.0.1", "has-symbols": "^1.0.2", "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "bin/which" } }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "node_modules/wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "dependencies": { "string-width": "^1.0.2 || 2" } }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" }, "engines": { "node": ">=8" } }, "node_modules/yargs-parser": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "node_modules/yargs-unparser": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, "dependencies": { "flat": "^4.1.0", "lodash": "^4.17.15", "yargs": "^13.3.0" }, "engines": { "node": ">=6" } }, "node_modules/yargs-unparser/node_modules/ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/yargs-unparser/node_modules/cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "dependencies": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" } }, "node_modules/yargs-unparser/node_modules/emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "node_modules/yargs-unparser/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" }, "engines": { "node": ">=6" } }, "node_modules/yargs-unparser/node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "dependencies": { "ansi-regex": "^4.1.0" }, "engines": { "node": ">=6" } }, "node_modules/yargs-unparser/node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "dependencies": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" }, "engines": { "node": ">=6" } }, "node_modules/yargs-unparser/node_modules/yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "dependencies": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.2" } }, "node_modules/yargs/node_modules/ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" }, "engines": { "node": ">=6" } }, "node_modules/yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", "dev": true, "engines": { "node": ">=4" } } }, "dependencies": { "@babel/code-frame": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "requires": { "@babel/highlight": "^7.12.13" } }, "@babel/helper-validator-identifier": { "version": "7.14.0", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", "dev": true }, "@babel/highlight": { "version": "7.14.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.0", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@types/debug": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" }, "@types/markdown-it": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-0.0.4.tgz", "integrity": "sha512-FWR7QB7EqBRq1s9BMk0ccOSOuRLfVEWYpHQYpFPaXtCoqN6dJx2ttdsdQbUxLLnAlKpYeVjveGGhQ3583TTa7g==", "dev": true }, "@types/mocha": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", "dev": true }, "@types/node": { "version": "10.17.59", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.59.tgz", "integrity": "sha512-7Uc8IRrL8yZz5ti45RaFxpbU8TxlzdC3HvxV+hOWo1EyLsuKv/w7y0n+TwZzwL3vdx3oZ2k3ubxPq131hNtXyg==", "dev": true }, "@types/semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "binary-search": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" } }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "chokidar": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", "fsevents": "~2.1.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.2.0" } }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" }, "dependencies": { "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" } }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" } } } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { "ms": "2.1.2" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" } }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, "es-abstract": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.2", "is-callable": "^1.2.3", "is-negative-zero": "^2.0.1", "is-regex": "^1.1.2", "is-string": "^1.0.5", "object-inspect": "^1.9.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", "string.prototype.trimstart": "^1.0.4", "unbox-primitive": "^1.0.0" }, "dependencies": { "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" } } } }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "flat": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, "requires": { "is-buffer": "~2.0.3" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1" } }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "is-bigint": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", "dev": true }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { "binary-extensions": "^2.0.0" } }, "is-boolean-object": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", "dev": true, "requires": { "call-bind": "^1.0.2" } }, "is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true }, "is-callable": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, "is-core-module": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", "dev": true, "requires": { "has": "^1.0.3" } }, "is-date-object": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", "dev": true }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-number-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", "dev": true }, "is-regex": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "has-symbols": "^1.0.2" } }, "is-string": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", "dev": true }, "is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { "has-symbols": "^1.0.2" } }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "javascript-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", "dev": true }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", "dev": true, "requires": { "uc.micro": "^1.0.1" } }, "llparse": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/llparse/-/llparse-7.1.1.tgz", "integrity": "sha512-lBxN5O6sKq6KSOaRFIGczoVpO/U/37mHhjJioQbPuiXdfZmwzP1zC3txV9xx778TRNFENzeCM0Uoo+mE1rfJOA==", "requires": { "debug": "^4.2.0", "llparse-frontend": "^3.0.0" } }, "llparse-builder": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/llparse-builder/-/llparse-builder-1.5.2.tgz", "integrity": "sha512-i862UNC3YUEdlfK/NUCJxlKjtWjgAI9AJXDRgjcfRHfwFt4Sf8eFPTRsc91/2R9MBZ0kyFdfhi8SVhMsZf1gNQ==", "requires": { "@types/debug": "4.1.5 ", "binary-search": "^1.3.6", "debug": "^4.2.0" } }, "llparse-dot": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/llparse-dot/-/llparse-dot-1.0.1.tgz", "integrity": "sha512-3e271C2LuDWBzhxaCUDzjpufamoEBuTYQz83QyMixI/i99BntCEk6ngHWOhhDb0XdtNNh6qAfRmXyjgNP+Nxpw==", "dev": true, "requires": { "llparse-builder": "^1.0.0" } }, "llparse-frontend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/llparse-frontend/-/llparse-frontend-3.0.0.tgz", "integrity": "sha512-G/o0Po2C+G5OtP8MJeQDjDf5qwDxcO7K6x4r6jqGsJwxk7yblbJnRqpmye7G/lZ8dD0Hv5neY4/KB5BhDmEc9Q==", "requires": { "debug": "^3.2.6", "llparse-builder": "^1.5.2" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } } } }, "llparse-test-fixture": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/llparse-test-fixture/-/llparse-test-fixture-5.0.2.tgz", "integrity": "sha512-61KI5J/b5uyRktD0y1EezleEW6UfaxhHkn1adLKNVemRZzklE+SpLakr251qo04kb9jN/ytk8lllgK+yFOj4cQ==", "dev": true, "requires": { "esm": "^3.2.25", "llparse": "^7.0.0", "yargs": "^15.4.1" } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "log-symbols": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, "requires": { "chalk": "^2.4.2" } }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "markdown-it": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", "dev": true, "requires": { "argparse": "^1.0.7", "entities": "~1.1.1", "linkify-it": "^2.0.0", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" } }, "mdgator": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/mdgator/-/mdgator-1.1.2.tgz", "integrity": "sha512-S2GvsLIznUQ2McXfpe6BCD+IqhnRuHcBO7krqnvnsHgDpjjO1mLhr0vZtVa5ca4WZET037g3G+94DznpicKkOA==", "dev": true, "requires": { "@types/markdown-it": "0.0.4", "markdown-it": "^8.4.1" } }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" } }, "mocha": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", "dev": true, "requires": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", "chokidar": "3.3.0", "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", "find-up": "3.0.0", "glob": "7.1.3", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", "log-symbols": "3.0.0", "minimatch": "3.0.4", "mkdirp": "0.5.5", "ms": "2.1.1", "node-environment-flags": "1.0.6", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", "yargs": "13.3.2", "yargs-parser": "13.1.2", "yargs-unparser": "1.6.0" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" } }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" } }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" } }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.2" } } } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node-environment-flags": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "object-inspect": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", "has-symbols": "^1.0.0", "object-keys": "^1.0.11" } }, "object.getownpropertydescriptors": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.2" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "picomatch": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", "dev": true }, "readdirp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, "requires": { "picomatch": "^2.0.4" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" } }, "ts-node": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", "dev": true, "requires": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", "diff": "^3.1.0", "make-error": "^1.1.1", "minimist": "^1.2.0", "mkdirp": "^0.5.1", "source-map-support": "^0.5.6", "yn": "^2.0.0" } }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "tslint": { "version": "5.20.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", "diff": "^4.0.1", "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", "tsutils": "^2.29.0" }, "dependencies": { "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true } } }, "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { "tslib": "^1.8.1" } }, "typescript": { "version": "3.9.9", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", "dev": true }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dev": true, "requires": { "function-bind": "^1.1.1", "has-bigints": "^1.0.1", "has-symbols": "^1.0.2", "which-boxed-primitive": "^1.0.2" } }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { "string-width": "^1.0.2 || 2" } }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" } }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" } } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" }, "dependencies": { "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" } }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" } }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" } }, "yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } }, "yargs-parser": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "yargs-unparser": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, "requires": { "flat": "^4.1.0", "lodash": "^4.17.15", "yargs": "^13.3.0" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" } }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" } }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" } }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.2" } } } }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", "dev": true } } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/package.json0000644000175100001710000000330000000000000017621 0ustar00runnerdocker{ "name": "llhttp", "version": "6.0.6", "description": "HTTP parser in LLVM IR", "main": "lib/llhttp.js", "types": "lib/llhttp.d.ts", "files": [ "lib", "src" ], "scripts": { "bench": "ts-node bench/", "build": "ts-node bin/generate.ts", "build-ts": "tsc", "prebuild-wasm": "docker build -t llhttp_wasm_builder . && npm run wasm -- --setup", "build-wasm": "npm run wasm -- --docker", "wasm": "ts-node bin/build_wasm.ts", "clean": "rm -rf lib && rm -rf test/tmp", "prepare": "npm run clean && npm run build-ts", "lint": "tslint -c tslint.json bin/*.ts src/*.ts src/**/*.ts test/*.ts test/**/*.ts", "mocha": "mocha --timeout=10000 -r ts-node/register/type-check --reporter progress test/*-test.ts", "test": "npm run mocha && npm run lint", "postversion": "TAG=`node -e \"process.stdout.write(require('./package').version)\"` make -B postversion" }, "repository": { "type": "git", "url": "git+ssh://git@github.com/nodejs/llhttp.git" }, "keywords": [ "http", "llvm", "ir", "llparse" ], "author": "Fedor Indutny (http://darksi.de/)", "license": "MIT", "bugs": { "url": "https://github.com/nodejs/llhttp/issues" }, "homepage": "https://github.com/nodejs/llhttp#readme", "devDependencies": { "@types/mocha": "^5.2.7", "@types/node": "^10.17.52", "javascript-stringify": "^2.0.1", "llparse-dot": "^1.0.1", "llparse-test-fixture": "^5.0.1", "mdgator": "^1.1.2", "mocha": "^7.2.0", "ts-node": "^7.0.1", "tslint": "^5.20.1", "typescript": "^3.9.9" }, "dependencies": { "@types/semver": "^5.5.0", "llparse": "^7.1.1", "semver": "^5.7.1" } } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0664523 aiohttp-3.8.1/vendor/llhttp/src/0000755000175100001710000000000000000000000016126 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/src/common.gypi0000644000175100001710000000220500000000000020307 0ustar00runnerdocker{ 'target_defaults': { 'default_configuration': 'Debug', 'configurations': { # TODO: hoist these out and put them somewhere common, because # RuntimeLibrary MUST MATCH across the entire project 'Debug': { 'defines': [ 'DEBUG', '_DEBUG' ], 'cflags': [ '-Wall', '-Wextra', '-O0', '-g', '-ftrapv' ], 'msvs_settings': { 'VCCLCompilerTool': { 'RuntimeLibrary': 1, # static debug }, }, }, 'Release': { 'defines': [ 'NDEBUG' ], 'cflags': [ '-Wall', '-Wextra', '-O3' ], 'msvs_settings': { 'VCCLCompilerTool': { 'RuntimeLibrary': 0, # static release }, }, } }, 'msvs_settings': { 'VCCLCompilerTool': { # Compile as C++. llhttp.c is actually C99, but C++ is # close enough in this case. 'CompileAs': 2, }, 'VCLibrarianTool': { }, 'VCLinkerTool': { 'GenerateDebugInformation': 'true', }, }, 'conditions': [ ['OS == "win"', { 'defines': [ 'WIN32' ], }] ], }, } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0664523 aiohttp-3.8.1/vendor/llhttp/src/llhttp/0000755000175100001710000000000000000000000017435 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/src/llhttp/c-headers.ts0000644000175100001710000000514100000000000021641 0ustar00runnerdockerimport * as constants from './constants'; import { enumToMap, IEnumMap } from './utils'; type Encoding = 'none' | 'hex'; export class CHeaders { public build(): string { let res = ''; res += '#ifndef LLLLHTTP_C_HEADERS_\n'; res += '#define LLLLHTTP_C_HEADERS_\n'; res += '#ifdef __cplusplus\n'; res += 'extern "C" {\n'; res += '#endif\n'; res += '\n'; const errorMap = enumToMap(constants.ERROR); const methodMap = enumToMap(constants.METHODS); const httpMethodMap = enumToMap(constants.METHODS, constants.METHODS_HTTP, [ constants.METHODS.PRI, ]); const rtspMethodMap = enumToMap(constants.METHODS, constants.METHODS_RTSP); res += this.buildEnum('llhttp_errno', 'HPE', errorMap); res += '\n'; res += this.buildEnum('llhttp_flags', 'F', enumToMap(constants.FLAGS), 'hex'); res += '\n'; res += this.buildEnum('llhttp_lenient_flags', 'LENIENT', enumToMap(constants.LENIENT_FLAGS), 'hex'); res += '\n'; res += this.buildEnum('llhttp_type', 'HTTP', enumToMap(constants.TYPE)); res += '\n'; res += this.buildEnum('llhttp_finish', 'HTTP_FINISH', enumToMap(constants.FINISH)); res += '\n'; res += this.buildEnum('llhttp_method', 'HTTP', methodMap); res += '\n'; res += this.buildMap('HTTP_ERRNO', errorMap); res += '\n'; res += this.buildMap('HTTP_METHOD', httpMethodMap); res += '\n'; res += this.buildMap('RTSP_METHOD', rtspMethodMap); res += '\n'; res += this.buildMap('HTTP_ALL_METHOD', methodMap); res += '\n'; res += '#ifdef __cplusplus\n'; res += '} /* extern "C" */\n'; res += '#endif\n'; res += '#endif /* LLLLHTTP_C_HEADERS_ */\n'; return res; } private buildEnum(name: string, prefix: string, map: IEnumMap, encoding: Encoding = 'none'): string { let res = ''; res += `enum ${name} {\n`; const keys = Object.keys(map); keys.forEach((key, i) => { const isLast = i === keys.length - 1; let value: number | string = map[key]; if (encoding === 'hex') { value = `0x${value.toString(16)}`; } res += ` ${prefix}_${key.replace(/-/g, '')} = ${value}`; if (!isLast) { res += ',\n'; } }); res += '\n};\n'; res += `typedef enum ${name} ${name}_t;\n`; return res; } private buildMap(name: string, map: IEnumMap): string { let res = ''; res += `#define ${name}_MAP(XX) \\\n`; Object.keys(map).forEach((key) => { res += ` XX(${map[key]!}, ${key.replace(/-/g, '')}, ${key}) \\\n`; }); res += '\n'; return res; } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/src/llhttp/constants.ts0000644000175100001710000001413200000000000022022 0ustar00runnerdockerimport { enumToMap, IEnumMap } from './utils'; export type HTTPMode = 'loose' | 'strict'; // C headers export enum ERROR { OK = 0, INTERNAL, STRICT, LF_EXPECTED, UNEXPECTED_CONTENT_LENGTH, CLOSED_CONNECTION, INVALID_METHOD, INVALID_URL, INVALID_CONSTANT, INVALID_VERSION, INVALID_HEADER_TOKEN, INVALID_CONTENT_LENGTH, INVALID_CHUNK_SIZE, INVALID_STATUS, INVALID_EOF_STATE, INVALID_TRANSFER_ENCODING, CB_MESSAGE_BEGIN, CB_HEADERS_COMPLETE, CB_MESSAGE_COMPLETE, CB_CHUNK_HEADER, CB_CHUNK_COMPLETE, PAUSED, PAUSED_UPGRADE, PAUSED_H2_UPGRADE, USER, } export enum TYPE { BOTH = 0, // default REQUEST, RESPONSE, } export enum FLAGS { CONNECTION_KEEP_ALIVE = 1 << 0, CONNECTION_CLOSE = 1 << 1, CONNECTION_UPGRADE = 1 << 2, CHUNKED = 1 << 3, UPGRADE = 1 << 4, CONTENT_LENGTH = 1 << 5, SKIPBODY = 1 << 6, TRAILING = 1 << 7, // 1 << 8 is unused TRANSFER_ENCODING = 1 << 9, } export enum LENIENT_FLAGS { HEADERS = 1 << 0, CHUNKED_LENGTH = 1 << 1, KEEP_ALIVE = 1 << 2, } export enum METHODS { DELETE = 0, GET = 1, HEAD = 2, POST = 3, PUT = 4, /* pathological */ CONNECT = 5, OPTIONS = 6, TRACE = 7, /* WebDAV */ COPY = 8, LOCK = 9, MKCOL = 10, MOVE = 11, PROPFIND = 12, PROPPATCH = 13, SEARCH = 14, UNLOCK = 15, BIND = 16, REBIND = 17, UNBIND = 18, ACL = 19, /* subversion */ REPORT = 20, MKACTIVITY = 21, CHECKOUT = 22, MERGE = 23, /* upnp */ 'M-SEARCH' = 24, NOTIFY = 25, SUBSCRIBE = 26, UNSUBSCRIBE = 27, /* RFC-5789 */ PATCH = 28, PURGE = 29, /* CalDAV */ MKCALENDAR = 30, /* RFC-2068, section 19.6.1.2 */ LINK = 31, UNLINK = 32, /* icecast */ SOURCE = 33, /* RFC-7540, section 11.6 */ PRI = 34, /* RFC-2326 RTSP */ DESCRIBE = 35, ANNOUNCE = 36, SETUP = 37, PLAY = 38, PAUSE = 39, TEARDOWN = 40, GET_PARAMETER = 41, SET_PARAMETER = 42, REDIRECT = 43, RECORD = 44, /* RAOP */ FLUSH = 45, } export const METHODS_HTTP = [ METHODS.DELETE, METHODS.GET, METHODS.HEAD, METHODS.POST, METHODS.PUT, METHODS.CONNECT, METHODS.OPTIONS, METHODS.TRACE, METHODS.COPY, METHODS.LOCK, METHODS.MKCOL, METHODS.MOVE, METHODS.PROPFIND, METHODS.PROPPATCH, METHODS.SEARCH, METHODS.UNLOCK, METHODS.BIND, METHODS.REBIND, METHODS.UNBIND, METHODS.ACL, METHODS.REPORT, METHODS.MKACTIVITY, METHODS.CHECKOUT, METHODS.MERGE, METHODS['M-SEARCH'], METHODS.NOTIFY, METHODS.SUBSCRIBE, METHODS.UNSUBSCRIBE, METHODS.PATCH, METHODS.PURGE, METHODS.MKCALENDAR, METHODS.LINK, METHODS.UNLINK, METHODS.PRI, // TODO(indutny): should we allow it with HTTP? METHODS.SOURCE, ]; export const METHODS_ICE = [ METHODS.SOURCE, ]; export const METHODS_RTSP = [ METHODS.OPTIONS, METHODS.DESCRIBE, METHODS.ANNOUNCE, METHODS.SETUP, METHODS.PLAY, METHODS.PAUSE, METHODS.TEARDOWN, METHODS.GET_PARAMETER, METHODS.SET_PARAMETER, METHODS.REDIRECT, METHODS.RECORD, METHODS.FLUSH, // For AirPlay METHODS.GET, METHODS.POST, ]; export const METHOD_MAP = enumToMap(METHODS); export const H_METHOD_MAP: IEnumMap = {}; Object.keys(METHOD_MAP).forEach((key) => { if (/^H/.test(key)) { H_METHOD_MAP[key] = METHOD_MAP[key]; } }); export enum FINISH { SAFE = 0, SAFE_WITH_CB, UNSAFE, } // Internal export type CharList = Array; export const ALPHA: CharList = []; for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { // Upper case ALPHA.push(String.fromCharCode(i)); // Lower case ALPHA.push(String.fromCharCode(i + 0x20)); } export const NUM_MAP = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, }; export const HEX_MAP = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, }; export const NUM: CharList = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ]; export const ALPHANUM: CharList = ALPHA.concat(NUM); export const MARK: CharList = [ '-', '_', '.', '!', '~', '*', '\'', '(', ')' ]; export const USERINFO_CHARS: CharList = ALPHANUM .concat(MARK) .concat([ '%', ';', ':', '&', '=', '+', '$', ',' ]); // TODO(indutny): use RFC export const STRICT_URL_CHAR: CharList = ([ '!', '"', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~', ] as CharList).concat(ALPHANUM); export const URL_CHAR: CharList = STRICT_URL_CHAR .concat(([ '\t', '\f' ] as CharList)); // All characters with 0x80 bit set to 1 for (let i = 0x80; i <= 0xff; i++) { URL_CHAR.push(i); } export const HEX: CharList = NUM.concat( [ 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F' ]); /* Tokens as defined by rfc 2616. Also lowercases them. * token = 1* * separators = "(" | ")" | "<" | ">" | "@" * | "," | ";" | ":" | "\" | <"> * | "/" | "[" | "]" | "?" | "=" * | "{" | "}" | SP | HT */ export const STRICT_TOKEN: CharList = ([ '!', '#', '$', '%', '&', '\'', '*', '+', '-', '.', '^', '_', '`', '|', '~', ] as CharList).concat(ALPHANUM); export const TOKEN: CharList = STRICT_TOKEN.concat([ ' ' ]); /* * Verify that a char is a valid visible (printable) US-ASCII * character or %x80-FF */ export const HEADER_CHARS: CharList = [ '\t' ]; for (let i = 32; i <= 255; i++) { if (i !== 127) { HEADER_CHARS.push(i); } } // ',' = \x44 export const CONNECTION_TOKEN_CHARS: CharList = HEADER_CHARS.filter((c: string | number) => c !== 44); export const MAJOR = NUM_MAP; export const MINOR = MAJOR; export enum HEADER_STATE { GENERAL = 0, CONNECTION, CONTENT_LENGTH, TRANSFER_ENCODING, UPGRADE, CONNECTION_KEEP_ALIVE, CONNECTION_CLOSE, CONNECTION_UPGRADE, TRANSFER_ENCODING_CHUNKED, } export const SPECIAL_HEADERS = { 'connection': HEADER_STATE.CONNECTION, 'content-length': HEADER_STATE.CONTENT_LENGTH, 'proxy-connection': HEADER_STATE.CONNECTION, 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, 'upgrade': HEADER_STATE.UPGRADE, }; ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/src/llhttp/http.ts0000644000175100001710000007730200000000000020775 0ustar00runnerdockerimport * as assert from 'assert'; import { LLParse, source } from 'llparse'; import Match = source.node.Match; import Node = source.node.Node; import { CharList, CONNECTION_TOKEN_CHARS, ERROR, FINISH, FLAGS, H_METHOD_MAP, HEADER_CHARS, HEADER_STATE, HEX_MAP, HTTPMode, LENIENT_FLAGS, MAJOR, METHOD_MAP, METHODS, METHODS_HTTP, METHODS_ICE, METHODS_RTSP, MINOR, NUM_MAP, SPECIAL_HEADERS, STRICT_TOKEN, TOKEN, TYPE, } from './constants'; import { URL } from './url'; type MaybeNode = string | Match | Node; const NODES: ReadonlyArray = [ 'start', 'start_req', 'start_res', 'start_req_or_res', 'req_or_res_method', 'res_http_major', 'res_http_dot', 'res_http_minor', 'res_http_end', 'res_status_code', 'res_status_code_otherwise', 'res_status_start', 'res_status', 'res_line_almost_done', 'req_first_space_before_url', 'req_spaces_before_url', 'req_http_start', 'req_http_major', 'req_http_dot', 'req_http_minor', 'req_http_end', 'req_http_complete', 'req_pri_upgrade', 'header_field_start', 'header_field', 'header_field_colon', 'header_field_colon_discard_ws', 'header_field_general', 'header_field_general_otherwise', 'header_value_discard_ws', 'header_value_discard_ws_almost_done', 'header_value_discard_lws', 'header_value_start', 'header_value', 'header_value_otherwise', 'header_value_lenient', 'header_value_lws', 'header_value_te_chunked', 'header_value_te_chunked_last', 'header_value_te_token', 'header_value_te_token_ows', 'header_value_content_length_once', 'header_value_content_length', 'header_value_content_length_ws', 'header_value_connection', 'header_value_connection_ws', 'header_value_connection_token', 'header_value_almost_done', 'headers_almost_done', 'headers_done', 'chunk_size_start', 'chunk_size_digit', 'chunk_size', 'chunk_size_otherwise', 'chunk_size_almost_done', 'chunk_size_almost_done_lf', 'chunk_parameters', 'chunk_data', 'chunk_data_almost_done', 'chunk_data_almost_done_skip', 'chunk_complete', 'body_identity', 'body_identity_eof', 'message_done', 'eof', 'cleanup', 'closed', 'restart', ]; interface ISpanMap { readonly body: source.Span; readonly headerField: source.Span; readonly headerValue: source.Span; readonly status: source.Span; } interface ICallbackMap { readonly afterHeadersComplete: source.code.Code; readonly afterMessageComplete: source.code.Code; readonly beforeHeadersComplete: source.code.Code; readonly onChunkComplete: source.code.Code; readonly onChunkHeader: source.code.Code; readonly onHeadersComplete: source.code.Code; readonly onMessageBegin: source.code.Code; readonly onMessageComplete: source.code.Code; readonly onUrlComplete: source.code.Code; readonly onStatusComplete: source.code.Code; readonly onHeaderFieldComplete: source.code.Code; readonly onHeaderValueComplete: source.code.Code; } interface IMulTargets { readonly overflow: string | Node; readonly success: string | Node; } interface IMulOptions { readonly base: number; readonly max?: number; readonly signed: boolean; } interface IIsEqualTargets { readonly equal: string | Node; readonly notEqual: string | Node; } export interface IHTTPResult { readonly entry: Node; } export class HTTP { private readonly url: URL; private readonly TOKEN: CharList; private readonly span: ISpanMap; private readonly callback: ICallbackMap; private readonly nodes: Map = new Map(); constructor(private readonly llparse: LLParse, private readonly mode: HTTPMode = 'loose') { const p = llparse; this.url = new URL(p, mode); this.TOKEN = mode === 'strict' ? STRICT_TOKEN : TOKEN; this.span = { body: p.span(p.code.span('llhttp__on_body')), headerField: p.span(p.code.span('llhttp__on_header_field')), headerValue: p.span(p.code.span('llhttp__on_header_value')), status: p.span(p.code.span('llhttp__on_status')), }; /* tslint:disable:object-literal-sort-keys */ this.callback = { // User callbacks onUrlComplete: p.code.match('llhttp__on_url_complete'), onStatusComplete: p.code.match('llhttp__on_status_complete'), onHeaderFieldComplete: p.code.match('llhttp__on_header_field_complete'), onHeaderValueComplete: p.code.match('llhttp__on_header_value_complete'), onHeadersComplete: p.code.match('llhttp__on_headers_complete'), onMessageBegin: p.code.match('llhttp__on_message_begin'), onMessageComplete: p.code.match('llhttp__on_message_complete'), onChunkHeader: p.code.match('llhttp__on_chunk_header'), onChunkComplete: p.code.match('llhttp__on_chunk_complete'), // Internal callbacks `src/http.c` beforeHeadersComplete: p.code.match('llhttp__before_headers_complete'), afterHeadersComplete: p.code.match('llhttp__after_headers_complete'), afterMessageComplete: p.code.match('llhttp__after_message_complete'), }; /* tslint:enable:object-literal-sort-keys */ NODES.forEach((name) => this.nodes.set(name, p.node(name) as Match)); } public build(): IHTTPResult { const p = this.llparse; p.property('i64', 'content_length'); p.property('i8', 'type'); p.property('i8', 'method'); p.property('i8', 'http_major'); p.property('i8', 'http_minor'); p.property('i8', 'header_state'); p.property('i8', 'lenient_flags'); p.property('i8', 'upgrade'); p.property('i8', 'finish'); p.property('i16', 'flags'); p.property('i16', 'status_code'); // Verify defaults assert.strictEqual(FINISH.SAFE, 0); assert.strictEqual(TYPE.BOTH, 0); // Shared settings (to be used in C wrapper) p.property('ptr', 'settings'); this.buildLine(); this.buildHeaders(); return { entry: this.node('start'), }; } private buildLine(): void { const p = this.llparse; const span = this.span; const n = (name: string): Match => this.node(name); const url = this.url.build(); const switchType = this.load('type', { [TYPE.REQUEST]: n('start_req'), [TYPE.RESPONSE]: n('start_res'), }, n('start_req_or_res')); n('start') .match([ '\r', '\n' ], n('start')) .otherwise(this.update('finish', FINISH.UNSAFE, this.invokePausable('on_message_begin', ERROR.CB_MESSAGE_BEGIN, switchType))); n('start_req_or_res') .peek('H', n('req_or_res_method')) .otherwise(this.update('type', TYPE.REQUEST, 'start_req')); n('req_or_res_method') .select(H_METHOD_MAP, this.store('method', this.update('type', TYPE.REQUEST, 'req_first_space_before_url'))) .match('HTTP/', this.update('type', TYPE.RESPONSE, 'res_http_major')) .otherwise(p.error(ERROR.INVALID_CONSTANT, 'Invalid word encountered')); // Response n('start_res') .match('HTTP/', n('res_http_major')) .otherwise(p.error(ERROR.INVALID_CONSTANT, 'Expected HTTP/')); n('res_http_major') .select(MAJOR, this.store('http_major', 'res_http_dot')) .otherwise(p.error(ERROR.INVALID_VERSION, 'Invalid major version')); n('res_http_dot') .match('.', n('res_http_minor')) .otherwise(p.error(ERROR.INVALID_VERSION, 'Expected dot')); n('res_http_minor') .select(MINOR, this.store('http_minor', 'res_http_end')) .otherwise(p.error(ERROR.INVALID_VERSION, 'Invalid minor version')); n('res_http_end') .match(' ', this.update('status_code', 0, 'res_status_code')) .otherwise(p.error(ERROR.INVALID_VERSION, 'Expected space after version')); n('res_status_code') .select(NUM_MAP, this.mulAdd('status_code', { overflow: p.error(ERROR.INVALID_STATUS, 'Response overflow'), success: 'res_status_code', }, { base: 10, signed: false, max: 999 })) .otherwise(n('res_status_code_otherwise')); n('res_status_code_otherwise') .match(' ', n('res_status_start')) .peek([ '\r', '\n' ], n('res_status_start')) .otherwise(p.error(ERROR.INVALID_STATUS, 'Invalid response status')); const onStatusComplete = p.invoke(this.callback.onStatusComplete); onStatusComplete.otherwise(n('header_field_start')); n('res_status_start') .match('\r', n('res_line_almost_done')) .match('\n', onStatusComplete) .otherwise(span.status.start(n('res_status'))); n('res_status') .peek('\r', span.status.end().skipTo(n('res_line_almost_done'))) .peek('\n', span.status.end().skipTo(onStatusComplete)) .skipTo(n('res_status')); if (this.mode === 'strict') { n('res_line_almost_done') .match('\n', onStatusComplete) .otherwise(p.error(ERROR.STRICT, 'Expected LF after CR')); } else { n('res_line_almost_done') .skipTo(onStatusComplete); } // Request n('start_req') .select(METHOD_MAP, this.store('method', 'req_first_space_before_url')) .otherwise(p.error(ERROR.INVALID_METHOD, 'Invalid method encountered')); n('req_first_space_before_url') .match(' ', n('req_spaces_before_url')) .otherwise(p.error(ERROR.INVALID_METHOD, 'Expected space after method')); n('req_spaces_before_url') .match(' ', n('req_spaces_before_url')) .otherwise(this.isEqual('method', METHODS.CONNECT, { equal: url.entry.connect, notEqual: url.entry.normal, })); const onUrlCompleteHTTP = p.invoke(this.callback.onUrlComplete); onUrlCompleteHTTP.otherwise(n('req_http_start')); url.exit.toHTTP .otherwise(onUrlCompleteHTTP); const onUrlCompleteHTTP09 = p.invoke(this.callback.onUrlComplete); onUrlCompleteHTTP09.otherwise(n('header_field_start')); url.exit.toHTTP09 .otherwise( this.update('http_major', 0, this.update('http_minor', 9, onUrlCompleteHTTP09)), ); const checkMethod = (methods: METHODS[], error: string): Node => { const success = n('req_http_major'); const failure = p.error(ERROR.INVALID_CONSTANT, error); const map: { [key: number]: Node } = {}; for (const method of methods) { map[method] = success; } return this.load('method', map, failure); }; n('req_http_start') .match('HTTP/', checkMethod(METHODS_HTTP, 'Invalid method for HTTP/x.x request')) .match('RTSP/', checkMethod(METHODS_RTSP, 'Invalid method for RTSP/x.x request')) .match('ICE/', checkMethod(METHODS_ICE, 'Expected SOURCE method for ICE/x.x request')) .match(' ', n('req_http_start')) .otherwise(p.error(ERROR.INVALID_CONSTANT, 'Expected HTTP/')); n('req_http_major') .select(MAJOR, this.store('http_major', 'req_http_dot')) .otherwise(p.error(ERROR.INVALID_VERSION, 'Invalid major version')); n('req_http_dot') .match('.', n('req_http_minor')) .otherwise(p.error(ERROR.INVALID_VERSION, 'Expected dot')); n('req_http_minor') .select(MINOR, this.store('http_minor', 'req_http_end')) .otherwise(p.error(ERROR.INVALID_VERSION, 'Invalid minor version')); n('req_http_end').otherwise(this.load('method', { [METHODS.PRI]: n('req_pri_upgrade'), }, n('req_http_complete'))); n('req_http_complete') .match([ '\r\n', '\n' ], n('header_field_start')) .otherwise(p.error(ERROR.INVALID_VERSION, 'Expected CRLF after version')); n('req_pri_upgrade') .match('\r\n\r\nSM\r\n\r\n', p.error(ERROR.PAUSED_H2_UPGRADE, 'Pause on PRI/Upgrade')) .otherwise( p.error(ERROR.INVALID_VERSION, 'Expected HTTP/2 Connection Preface')); } private buildHeaders(): void { this.buildHeaderField(); this.buildHeaderValue(); } private buildHeaderField(): void { const p = this.llparse; const span = this.span; const n = (name: string): Match => this.node(name); n('header_field_start') .match('\r', n('headers_almost_done')) /* they might be just sending \n instead of \r\n so this would be * the second \n to denote the end of headers*/ .peek('\n', n('headers_almost_done')) .otherwise(span.headerField.start(n('header_field'))); n('header_field') .transform(p.transform.toLower()) // Match headers that need special treatment .select(SPECIAL_HEADERS, this.store('header_state', 'header_field_colon')) .otherwise(this.resetHeaderState('header_field_general')); const onHeaderFieldComplete = p.invoke(this.callback.onHeaderFieldComplete); onHeaderFieldComplete.otherwise(n('header_value_discard_ws')); const onInvalidHeaderFieldChar = p.error(ERROR.INVALID_HEADER_TOKEN, 'Invalid header field char'); const checkLenientFlagsOnColon = this.testLenientFlags(LENIENT_FLAGS.HEADERS, { 1: n('header_field_colon_discard_ws'), }, span.headerField.end().skipTo(onInvalidHeaderFieldChar)); n('header_field_colon') // https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4 // Whitespace character is not allowed between the header field-name // and colon. If the next token matches whitespace then throw an error. // // Add a check for the lenient flag. If the lenient flag is set, the // whitespace token is allowed to support legacy code not following // http specs. .peek(' ', checkLenientFlagsOnColon) .peek(':', span.headerField.end().skipTo(onHeaderFieldComplete)) // Fallback to general header, there're additional characters: // `Connection-Duration` instead of `Connection` and so on. .otherwise(this.resetHeaderState('header_field_general')); n('header_field_colon_discard_ws') .match(' ', n('header_field_colon_discard_ws')) .otherwise(n('header_field_colon')); n('header_field_general') .match(this.TOKEN, n('header_field_general')) .otherwise(n('header_field_general_otherwise')); // Just a performance optimization, split the node so that the fast case // remains in `header_field_general` n('header_field_general_otherwise') .peek(':', span.headerField.end().skipTo(onHeaderFieldComplete)) .otherwise(p.error(ERROR.INVALID_HEADER_TOKEN, 'Invalid header token')); } private buildHeaderValue(): void { const p = this.llparse; const span = this.span; const callback = this.callback; const n = (name: string): Match => this.node(name); const fallback = this.resetHeaderState('header_value'); n('header_value_discard_ws') .match([ ' ', '\t' ], n('header_value_discard_ws')) .match('\r', n('header_value_discard_ws_almost_done')) .match('\n', n('header_value_discard_lws')) .otherwise(span.headerValue.start(n('header_value_start'))); if (this.mode === 'strict') { n('header_value_discard_ws_almost_done') .match('\n', n('header_value_discard_lws')) .otherwise(p.error(ERROR.STRICT, 'Expected LF after CR')); } else { n('header_value_discard_ws_almost_done').skipTo( n('header_value_discard_lws')); } const onHeaderValueComplete = p.invoke(this.callback.onHeaderValueComplete); onHeaderValueComplete.otherwise(n('header_field_start')); const emptyContentLengthError = p.error( ERROR.INVALID_CONTENT_LENGTH, 'Empty Content-Length'); const checkContentLengthEmptiness = this.load('header_state', { [HEADER_STATE.CONTENT_LENGTH]: emptyContentLengthError, }, this.setHeaderFlags( this.emptySpan(span.headerValue, onHeaderValueComplete))); n('header_value_discard_lws') .match([ ' ', '\t' ], n('header_value_discard_ws')) .otherwise(checkContentLengthEmptiness); // Multiple `Transfer-Encoding` headers should be treated as one, but with // values separate by a comma. // // See: https://tools.ietf.org/html/rfc7230#section-3.2.2 const toTransferEncoding = this.unsetFlag( FLAGS.CHUNKED, 'header_value_te_chunked'); n('header_value_start') .otherwise(this.load('header_state', { [HEADER_STATE.UPGRADE]: this.setFlag(FLAGS.UPGRADE, fallback), [HEADER_STATE.TRANSFER_ENCODING]: this.setFlag( FLAGS.TRANSFER_ENCODING, toTransferEncoding), [HEADER_STATE.CONTENT_LENGTH]: n('header_value_content_length_once'), [HEADER_STATE.CONNECTION]: n('header_value_connection'), }, 'header_value')); // // Transfer-Encoding // n('header_value_te_chunked') .transform(p.transform.toLowerUnsafe()) .match( 'chunked', n('header_value_te_chunked_last'), ) .otherwise(n('header_value_te_token')); n('header_value_te_chunked_last') .match(' ', n('header_value_te_chunked_last')) .peek([ '\r', '\n' ], this.update('header_state', HEADER_STATE.TRANSFER_ENCODING_CHUNKED, 'header_value_otherwise')) .otherwise(n('header_value_te_chunked')); n('header_value_te_token') .match(',', n('header_value_te_token_ows')) .match(CONNECTION_TOKEN_CHARS, n('header_value_te_token')) .otherwise(fallback); n('header_value_te_token_ows') .match([ ' ', '\t' ], n('header_value_te_token_ows')) .otherwise(n('header_value_te_chunked')); // // Content-Length // const invalidContentLength = (reason: string): Node => { // End span for easier testing // TODO(indutny): minimize code size return span.headerValue.end() .otherwise(p.error(ERROR.INVALID_CONTENT_LENGTH, reason)); }; n('header_value_content_length_once') .otherwise(this.testFlags(FLAGS.CONTENT_LENGTH, { 0: n('header_value_content_length'), }, p.error(ERROR.UNEXPECTED_CONTENT_LENGTH, 'Duplicate Content-Length'))); n('header_value_content_length') .select(NUM_MAP, this.mulAdd('content_length', { overflow: invalidContentLength('Content-Length overflow'), success: 'header_value_content_length', })) .otherwise(n('header_value_content_length_ws')); n('header_value_content_length_ws') .match(' ', n('header_value_content_length_ws')) .peek([ '\r', '\n' ], this.setFlag(FLAGS.CONTENT_LENGTH, 'header_value_otherwise')) .otherwise(invalidContentLength('Invalid character in Content-Length')); // // Connection // n('header_value_connection') .transform(p.transform.toLower()) // TODO(indutny): extra node for token back-edge? // Skip lws .match([ ' ', '\t' ], n('header_value_connection')) .match( 'close', this.update('header_state', HEADER_STATE.CONNECTION_CLOSE, 'header_value_connection_ws'), ) .match( 'upgrade', this.update('header_state', HEADER_STATE.CONNECTION_UPGRADE, 'header_value_connection_ws'), ) .match( 'keep-alive', this.update('header_state', HEADER_STATE.CONNECTION_KEEP_ALIVE, 'header_value_connection_ws'), ) .otherwise(n('header_value_connection_token')); n('header_value_connection_ws') .match(',', this.setHeaderFlags('header_value_connection')) .match(' ', n('header_value_connection_ws')) .peek([ '\r', '\n' ], n('header_value_otherwise')) .otherwise(this.resetHeaderState('header_value_connection_token')); n('header_value_connection_token') .match(',', n('header_value_connection')) .match(CONNECTION_TOKEN_CHARS, n('header_value_connection_token')) .otherwise(n('header_value_otherwise')); // Split for performance reasons n('header_value') .match(HEADER_CHARS, n('header_value')) .otherwise(n('header_value_otherwise')); const checkLenient = this.testLenientFlags(LENIENT_FLAGS.HEADERS, { 1: n('header_value_lenient'), }, p.error(ERROR.INVALID_HEADER_TOKEN, 'Invalid header value char')); n('header_value_otherwise') .peek('\r', span.headerValue.end().skipTo(n('header_value_almost_done'))) .peek('\n', span.headerValue.end(n('header_value_almost_done'))) .otherwise(checkLenient); n('header_value_lenient') .peek('\r', span.headerValue.end().skipTo(n('header_value_almost_done'))) .peek('\n', span.headerValue.end(n('header_value_almost_done'))) .skipTo(n('header_value_lenient')); n('header_value_almost_done') .match('\n', n('header_value_lws')) .otherwise(p.error(ERROR.LF_EXPECTED, 'Missing expected LF after header value')); n('header_value_lws') .peek([ ' ', '\t' ], span.headerValue.start(n('header_value_start'))) .otherwise(this.setHeaderFlags(onHeaderValueComplete)); const checkTrailing = this.testFlags(FLAGS.TRAILING, { 1: this.invokePausable('on_chunk_complete', ERROR.CB_CHUNK_COMPLETE, 'message_done'), }); if (this.mode === 'strict') { n('headers_almost_done') .match('\n', checkTrailing) .otherwise(p.error(ERROR.STRICT, 'Expected LF after headers')); } else { n('headers_almost_done') .skipTo(checkTrailing); } // Set `upgrade` if needed const beforeHeadersComplete = p.invoke(callback.beforeHeadersComplete); /* Present `Transfer-Encoding` header overrides `Content-Length` even if the * actual coding is not `chunked`. As per spec: * * https://www.rfc-editor.org/rfc/rfc7230.html#section-3.3.3 * * If a message is received with both a Transfer-Encoding and a * Content-Length header field, the Transfer-Encoding overrides the * Content-Length. Such a message might indicate an attempt to * perform request smuggling (Section 9.5) or response splitting * (Section 9.4) and **ought to be handled as an error**. A sender MUST * remove the received Content-Length field prior to forwarding such * a message downstream. * * (Note our emphasis on **ought to be handled as an error** */ const ENCODING_CONFLICT = FLAGS.TRANSFER_ENCODING | FLAGS.CONTENT_LENGTH; const onEncodingConflict = this.testLenientFlags(LENIENT_FLAGS.CHUNKED_LENGTH, { 0: p.error(ERROR.UNEXPECTED_CONTENT_LENGTH, 'Content-Length can\'t be present with Transfer-Encoding'), // For LENIENT mode fall back to past behavior: // Ignore `Transfer-Encoding` when `Content-Length` is present. }).otherwise(beforeHeadersComplete); const checkEncConflict = this.testFlags(ENCODING_CONFLICT, { 1: onEncodingConflict, }).otherwise(beforeHeadersComplete); checkTrailing.otherwise(checkEncConflict); /* Here we call the headers_complete callback. This is somewhat * different than other callbacks because if the user returns 1, we * will interpret that as saying that this message has no body. This * is needed for the annoying case of receiving a response to a HEAD * request. * * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so * we have to simulate it by handling a change in errno below. */ const onHeadersComplete = p.invoke(callback.onHeadersComplete, { 0: n('headers_done'), 1: this.setFlag(FLAGS.SKIPBODY, 'headers_done'), 2: this.update('upgrade', 1, this.setFlag(FLAGS.SKIPBODY, 'headers_done')), [ERROR.PAUSED]: this.pause('Paused by on_headers_complete', 'headers_done'), }, p.error(ERROR.CB_HEADERS_COMPLETE, 'User callback error')); beforeHeadersComplete.otherwise(onHeadersComplete); const upgradePause = p.pause(ERROR.PAUSED_UPGRADE, 'Pause on CONNECT/Upgrade'); const afterHeadersComplete = p.invoke(callback.afterHeadersComplete, { 1: this.invokePausable('on_message_complete', ERROR.CB_MESSAGE_COMPLETE, upgradePause), 2: n('chunk_size_start'), 3: n('body_identity'), 4: n('body_identity_eof'), // non-chunked `Transfer-Encoding` for request, see `src/native/http.c` 5: p.error(ERROR.INVALID_TRANSFER_ENCODING, 'Request has invalid `Transfer-Encoding`'), }); n('headers_done') .otherwise(afterHeadersComplete); upgradePause .otherwise(n('cleanup')); afterHeadersComplete .otherwise(this.invokePausable('on_message_complete', ERROR.CB_MESSAGE_COMPLETE, 'cleanup')); n('body_identity') .otherwise(span.body.start() .otherwise(p.consume('content_length').otherwise( span.body.end(n('message_done'))))); n('body_identity_eof') .otherwise( this.update('finish', FINISH.SAFE_WITH_CB, span.body.start(n('eof')))); // Just read everything until EOF n('eof') .skipTo(n('eof')); n('chunk_size_start') .otherwise(this.update('content_length', 0, 'chunk_size_digit')); const addContentLength = this.mulAdd('content_length', { overflow: p.error(ERROR.INVALID_CHUNK_SIZE, 'Chunk size overflow'), success: 'chunk_size', }, { signed: false, base: 0x10 }); n('chunk_size_digit') .select(HEX_MAP, addContentLength) .otherwise(p.error(ERROR.INVALID_CHUNK_SIZE, 'Invalid character in chunk size')); n('chunk_size') .select(HEX_MAP, addContentLength) .otherwise(n('chunk_size_otherwise')); n('chunk_size_otherwise') .match('\r', n('chunk_size_almost_done')) .match([ ';', ' ' ], n('chunk_parameters')) .otherwise(p.error(ERROR.INVALID_CHUNK_SIZE, 'Invalid character in chunk size')); n('chunk_parameters') .match('\r', n('chunk_size_almost_done')) .match(HEADER_CHARS, n('chunk_parameters')) .otherwise(p.error(ERROR.STRICT, 'Invalid character in chunk parameters')); if (this.mode === 'strict') { n('chunk_size_almost_done') .match('\n', n('chunk_size_almost_done_lf')) .otherwise(p.error(ERROR.STRICT, 'Expected LF after chunk size')); } else { n('chunk_size_almost_done') .skipTo(n('chunk_size_almost_done_lf')); } const toChunk = this.isEqual('content_length', 0, { equal: this.setFlag(FLAGS.TRAILING, 'header_field_start'), notEqual: 'chunk_data', }); n('chunk_size_almost_done_lf') .otherwise(this.invokePausable('on_chunk_header', ERROR.CB_CHUNK_HEADER, toChunk)); n('chunk_data') .otherwise(span.body.start() .otherwise(p.consume('content_length').otherwise( span.body.end(n('chunk_data_almost_done'))))); if (this.mode === 'strict') { n('chunk_data_almost_done') .match('\r\n', n('chunk_complete')) .otherwise(p.error(ERROR.STRICT, 'Expected CRLF after chunk')); } else { n('chunk_data_almost_done') .skipTo(n('chunk_data_almost_done_skip')); } n('chunk_data_almost_done_skip') .skipTo(n('chunk_complete')); n('chunk_complete') .otherwise(this.invokePausable('on_chunk_complete', ERROR.CB_CHUNK_COMPLETE, 'chunk_size_start')); const upgradeAfterDone = this.isEqual('upgrade', 1, { // Exit, the rest of the message is in a different protocol. equal: upgradePause, // Restart notEqual: 'cleanup', }); n('message_done') .otherwise(this.invokePausable('on_message_complete', ERROR.CB_MESSAGE_COMPLETE, upgradeAfterDone)); const lenientClose = this.testLenientFlags(LENIENT_FLAGS.KEEP_ALIVE, { 1: n('restart'), }, n('closed')); // Check if we'd like to keep-alive n('cleanup') .otherwise(p.invoke(callback.afterMessageComplete, { 1: n('restart'), }, this.update('finish', FINISH.SAFE, lenientClose))); if (this.mode === 'strict') { // Error on extra data after `Connection: close` n('closed') .match([ '\r', '\n' ], n('closed')) .skipTo(p.error(ERROR.CLOSED_CONNECTION, 'Data after `Connection: close`')); } else { // Discard all data after `Connection: close` n('closed').skipTo(n('closed')); } n('restart') .otherwise(this.update('finish', FINISH.SAFE, n('start'))); } private node(name: string | T): T { if (name instanceof Node) { return name; } assert(this.nodes.has(name), `Unknown node with name "${name}"`); return this.nodes.get(name)! as any; } private load(field: string, map: { [key: number]: Node }, next?: string | Node): Node { const p = this.llparse; const res = p.invoke(p.code.load(field), map); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } private store(field: string, next?: string | Node): Node { const p = this.llparse; const res = p.invoke(p.code.store(field)); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } private update(field: string, value: number, next?: string | Node): Node { const p = this.llparse; const res = p.invoke(p.code.update(field, value)); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } private resetHeaderState(next: string | Node): Node { return this.update('header_state', HEADER_STATE.GENERAL, next); } private emptySpan(span: source.Span, next: string | Node): Node { return span.start(span.end(this.node(next))); } private unsetFlag(flag: FLAGS, next: string | Node): Node { const p = this.llparse; return p.invoke(p.code.and('flags', ~flag), this.node(next)); } private setFlag(flag: FLAGS, next: string | Node): Node { const p = this.llparse; return p.invoke(p.code.or('flags', flag), this.node(next)); } private testFlags(flag: FLAGS, map: { [key: number]: Node }, next?: string | Node): Node { const p = this.llparse; const res = p.invoke(p.code.test('flags', flag), map); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } private testLenientFlags(flag: LENIENT_FLAGS, map: { [key: number]: Node }, next?: string | Node): Node { const p = this.llparse; const res = p.invoke(p.code.test('lenient_flags', flag), map); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } private setHeaderFlags(next: string | Node): Node { const HS = HEADER_STATE; const F = FLAGS; const toConnection = this.update('header_state', HEADER_STATE.CONNECTION, next); return this.load('header_state', { [HS.CONNECTION_KEEP_ALIVE]: this.setFlag(F.CONNECTION_KEEP_ALIVE, toConnection), [HS.CONNECTION_CLOSE]: this.setFlag(F.CONNECTION_CLOSE, toConnection), [HS.CONNECTION_UPGRADE]: this.setFlag(F.CONNECTION_UPGRADE, toConnection), [HS.TRANSFER_ENCODING_CHUNKED]: this.setFlag(F.CHUNKED, next), }, this.node(next)); } private mulAdd(field: string, targets: IMulTargets, options: IMulOptions = { base: 10, signed: false }): Node { const p = this.llparse; return p.invoke(p.code.mulAdd(field, options), { 1: this.node(targets.overflow), }, this.node(targets.success)); } private isEqual(field: string, value: number, map: IIsEqualTargets) { const p = this.llparse; return p.invoke(p.code.isEqual(field, value), { 0: this.node(map.notEqual), }, this.node(map.equal)); } private pause(msg: string, next?: string | Node) { const p = this.llparse; const res = p.pause(ERROR.PAUSED, msg); if (next !== undefined) { res.otherwise(this.node(next)); } return res; } // TODO(indutny): use type for `name` private invokePausable(name: string, errorCode: ERROR, next: string | Node) : Node { let cb; if (name === 'on_message_begin') { cb = this.callback.onMessageBegin; } else if (name === 'on_message_complete') { cb = this.callback.onMessageComplete; } else if (name === 'on_chunk_header') { cb = this.callback.onChunkHeader; } else if (name === 'on_chunk_complete') { cb = this.callback.onChunkComplete; } else { throw new Error('Unknown callback: ' + name); } const p = this.llparse; return p.invoke(cb, { 0: this.node(next), [ERROR.PAUSED]: this.pause(`${name} pause`, next), }, p.error(errorCode, `\`${name}\` callback error`)); } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/src/llhttp/url.ts0000644000175100001710000001516000000000000020612 0ustar00runnerdockerimport { LLParse, source } from 'llparse'; import Match = source.node.Match; import Node = source.node.Node; import { ALPHA, CharList, ERROR, HTTPMode, STRICT_URL_CHAR, URL_CHAR, USERINFO_CHARS, } from './constants'; type SpanName = 'schema' | 'host' | 'path' | 'query' | 'fragment' | 'url'; export interface IURLResult { readonly entry: { readonly normal: Node; readonly connect: Node; }; readonly exit: { readonly toHTTP: Node; readonly toHTTP09: Node; }; } type SpanTable = Map; export class URL { private readonly span: source.Span | undefined; private readonly spanTable: SpanTable = new Map(); private readonly errorInvalid: Node; private readonly errorStrictInvalid: Node; private readonly URL_CHAR: CharList; constructor(private readonly llparse: LLParse, private readonly mode: HTTPMode = 'loose', separateSpans: boolean = false) { const p = this.llparse; this.errorInvalid = p.error(ERROR.INVALID_URL, 'Invalid characters in url'); this.errorStrictInvalid = p.error(ERROR.INVALID_URL, 'Invalid characters in url (strict mode)'); this.URL_CHAR = mode === 'strict' ? STRICT_URL_CHAR : URL_CHAR; const table = this.spanTable; if (separateSpans) { table.set('schema', p.span(p.code.span('llhttp__on_url_schema'))); table.set('host', p.span(p.code.span('llhttp__on_url_host'))); table.set('path', p.span(p.code.span('llhttp__on_url_path'))); table.set('query', p.span(p.code.span('llhttp__on_url_query'))); table.set('fragment', p.span(p.code.span('llhttp__on_url_fragment'))); } else { table.set('url', p.span(p.code.span('llhttp__on_url'))); } } public build(): IURLResult { const p = this.llparse; const entry = { connect: this.node('entry_connect'), normal: this.node('entry_normal'), }; const start = this.node('start'); const path = this.node('path'); const queryOrFragment = this.node('query_or_fragment'); const schema = this.node('schema'); const schemaDelim = this.node('schema_delim'); const server = this.node('server'); const queryStart = this.node('query_start'); const query = this.node('query'); const fragment = this.node('fragment'); const serverWithAt = this.node('server_with_at'); entry.normal .otherwise(this.spanStart('url', start)); entry.connect .otherwise(this.spanStart('url', this.spanStart('host', server))); start .peek([ '/', '*' ], this.spanStart('path').skipTo(path)) .peek(ALPHA, this.spanStart('schema', schema)) .otherwise(p.error(ERROR.INVALID_URL, 'Unexpected start char in url')); schema .match(ALPHA, schema) .peek(':', this.spanEnd('schema').skipTo(schemaDelim)) .otherwise(p.error(ERROR.INVALID_URL, 'Unexpected char in url schema')); schemaDelim .match('//', this.spanStart('host', server)) .otherwise(p.error(ERROR.INVALID_URL, 'Unexpected char in url schema')); [ server, serverWithAt, ].forEach((node) => { node .peek('/', this.spanEnd('host', this.spanStart('path').skipTo(path))) .match('?', this.spanEnd('host', this.spanStart('query', query))) .match(USERINFO_CHARS, server) .match([ '[', ']' ], server) .otherwise(p.error(ERROR.INVALID_URL, 'Unexpected char in url server')); if (node !== serverWithAt) { node.match('@', serverWithAt); } }); serverWithAt .match('@', p.error(ERROR.INVALID_URL, 'Double @ in url')); path .match(this.URL_CHAR, path) .otherwise(this.spanEnd('path', queryOrFragment)); // Performance optimization, split `path` so that the fast case remains // there queryOrFragment .match('?', this.spanStart('query', query)) .match('#', this.spanStart('fragment', fragment)) .otherwise(p.error(ERROR.INVALID_URL, 'Invalid char in url path')); query .match(this.URL_CHAR, query) // Allow extra '?' in query string .match('?', query) .peek('#', this.spanEnd('query') .skipTo(this.spanStart('fragment', fragment))) .otherwise(p.error(ERROR.INVALID_URL, 'Invalid char in url query')); fragment .match(this.URL_CHAR, fragment) .match([ '?', '#' ], fragment) .otherwise( p.error(ERROR.INVALID_URL, 'Invalid char in url fragment start')); [ start, schema, schemaDelim ].forEach((node) => { /* No whitespace allowed here */ node.match([ ' ', '\r', '\n' ], this.errorInvalid); }); // Adaptors const toHTTP = this.node('to_http'); const toHTTP09 = this.node('to_http_09'); const skipToHTTP = this.node('skip_to_http') .skipTo(toHTTP); const skipToHTTP09 = this.node('skip_to_http09') .skipTo(toHTTP09); const skipCRLF = this.node('skip_lf_to_http09') .match('\r\n', toHTTP09) .otherwise(p.error(ERROR.INVALID_URL, 'Expected CRLF')); [ server, serverWithAt, queryOrFragment, queryStart, query, fragment, ].forEach((node) => { let spanName: SpanName | undefined; if (node === server || node === serverWithAt) { spanName = 'host'; } else if (node === queryStart || node === query) { spanName = 'query'; } else if (node === fragment) { spanName = 'fragment'; } const endTo = (target: Node): Node => { let res: Node = this.spanEnd('url', target); if (spanName !== undefined) { res = this.spanEnd(spanName, res); } return res; }; node.peek(' ', endTo(skipToHTTP)); node.peek('\r', endTo(skipCRLF)); node.peek('\n', endTo(skipToHTTP09)); }); return { entry, exit: { toHTTP, toHTTP09, }, }; } private spanStart(name: SpanName, otherwise?: Node): Node { let res: Node; if (this.spanTable.has(name)) { res = this.spanTable.get(name)!.start(); } else { res = this.llparse.node('span_start_stub_' + name); } if (otherwise !== undefined) { res.otherwise(otherwise); } return res; } private spanEnd(name: SpanName, otherwise?: Node): Node { let res: Node; if (this.spanTable.has(name)) { res = this.spanTable.get(name)!.end(); } else { res = this.llparse.node('span_end_stub_' + name); } if (otherwise !== undefined) { res.otherwise(otherwise); } return res; } private node(name: string): Match { const res = this.llparse.node('url_' + name); if (this.mode === 'strict') { res.match([ '\t', '\f' ], this.errorStrictInvalid); } return res; } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/src/llhttp/utils.ts0000644000175100001710000000100300000000000021137 0ustar00runnerdockerexport interface IEnumMap { [key: string]: number; } export function enumToMap( obj: any, filter?: ReadonlyArray, exceptions?: ReadonlyArray, ): IEnumMap { const res: IEnumMap = {}; Object.keys(obj).forEach((key) => { const value = obj[key]; if (typeof value !== 'number') { return; } if (filter && !filter.includes(value)) { return; } if (exceptions && exceptions.includes(value)) { return; } res[key] = value; }); return res; } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/src/llhttp.gyp0000644000175100001710000000044200000000000020156 0ustar00runnerdocker{ 'targets': [ { 'target_name': 'llhttp', 'type': 'static_library', 'include_dirs': [ '.', 'include' ], 'direct_dependent_settings': { 'include_dirs': [ 'include' ], }, 'sources': [ 'src/llhttp.c', 'src/api.c', 'src/http.c' ], }, ] } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/src/llhttp.ts0000644000175100001710000000037600000000000020013 0ustar00runnerdockerimport * as constants from './llhttp/constants'; import HTTPMode = constants.HTTPMode; export { constants }; export { HTTPMode }; export { HTTP } from './llhttp/http'; export { URL } from './llhttp/url'; export { CHeaders } from './llhttp/c-headers'; ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0704525 aiohttp-3.8.1/vendor/llhttp/src/native/0000755000175100001710000000000000000000000017414 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/src/native/api.c0000644000175100001710000002234100000000000020333 0ustar00runnerdocker#include #include #include #include "llhttp.h" #define CALLBACK_MAYBE(PARSER, NAME) \ do { \ const llhttp_settings_t* settings; \ settings = (const llhttp_settings_t*) (PARSER)->settings; \ if (settings == NULL || settings->NAME == NULL) { \ err = 0; \ break; \ } \ err = settings->NAME((PARSER)); \ } while (0) #define SPAN_CALLBACK_MAYBE(PARSER, NAME, START, LEN) \ do { \ const llhttp_settings_t* settings; \ settings = (const llhttp_settings_t*) (PARSER)->settings; \ if (settings == NULL || settings->NAME == NULL) { \ err = 0; \ break; \ } \ err = settings->NAME((PARSER), (START), (LEN)); \ if (err == -1) { \ err = HPE_USER; \ llhttp_set_error_reason((PARSER), "Span callback error in " #NAME); \ } \ } while (0) void llhttp_init(llhttp_t* parser, llhttp_type_t type, const llhttp_settings_t* settings) { llhttp__internal_init(parser); parser->type = type; parser->settings = (void*) settings; } #if defined(__wasm__) extern int wasm_on_message_begin(llhttp_t * p); extern int wasm_on_url(llhttp_t* p, const char* at, size_t length); extern int wasm_on_status(llhttp_t* p, const char* at, size_t length); extern int wasm_on_header_field(llhttp_t* p, const char* at, size_t length); extern int wasm_on_header_value(llhttp_t* p, const char* at, size_t length); extern int wasm_on_headers_complete(llhttp_t * p, int status_code, uint8_t upgrade, int should_keep_alive); extern int wasm_on_body(llhttp_t* p, const char* at, size_t length); extern int wasm_on_message_complete(llhttp_t * p); static int wasm_on_headers_complete_wrap(llhttp_t* p) { return wasm_on_headers_complete(p, p->status_code, p->upgrade, llhttp_should_keep_alive(p)); } const llhttp_settings_t wasm_settings = { wasm_on_message_begin, wasm_on_url, wasm_on_status, wasm_on_header_field, wasm_on_header_value, wasm_on_headers_complete_wrap, wasm_on_body, wasm_on_message_complete, NULL, NULL, }; llhttp_t* llhttp_alloc(llhttp_type_t type) { llhttp_t* parser = malloc(sizeof(llhttp_t)); llhttp_init(parser, type, &wasm_settings); return parser; } void llhttp_free(llhttp_t* parser) { free(parser); } /* Some getters required to get stuff from the parser */ uint8_t llhttp_get_type(llhttp_t* parser) { return parser->type; } uint8_t llhttp_get_http_major(llhttp_t* parser) { return parser->http_major; } uint8_t llhttp_get_http_minor(llhttp_t* parser) { return parser->http_minor; } uint8_t llhttp_get_method(llhttp_t* parser) { return parser->method; } int llhttp_get_status_code(llhttp_t* parser) { return parser->status_code; } uint8_t llhttp_get_upgrade(llhttp_t* parser) { return parser->upgrade; } #endif // defined(__wasm__) void llhttp_reset(llhttp_t* parser) { llhttp_type_t type = parser->type; const llhttp_settings_t* settings = parser->settings; void* data = parser->data; uint8_t lenient_flags = parser->lenient_flags; llhttp__internal_init(parser); parser->type = type; parser->settings = (void*) settings; parser->data = data; parser->lenient_flags = lenient_flags; } llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len) { return llhttp__internal_execute(parser, data, data + len); } void llhttp_settings_init(llhttp_settings_t* settings) { memset(settings, 0, sizeof(*settings)); } llhttp_errno_t llhttp_finish(llhttp_t* parser) { int err; /* We're in an error state. Don't bother doing anything. */ if (parser->error != 0) { return 0; } switch (parser->finish) { case HTTP_FINISH_SAFE_WITH_CB: CALLBACK_MAYBE(parser, on_message_complete); if (err != HPE_OK) return err; /* FALLTHROUGH */ case HTTP_FINISH_SAFE: return HPE_OK; case HTTP_FINISH_UNSAFE: parser->reason = "Invalid EOF state"; return HPE_INVALID_EOF_STATE; default: abort(); } } void llhttp_pause(llhttp_t* parser) { if (parser->error != HPE_OK) { return; } parser->error = HPE_PAUSED; parser->reason = "Paused"; } void llhttp_resume(llhttp_t* parser) { if (parser->error != HPE_PAUSED) { return; } parser->error = 0; } void llhttp_resume_after_upgrade(llhttp_t* parser) { if (parser->error != HPE_PAUSED_UPGRADE) { return; } parser->error = 0; } llhttp_errno_t llhttp_get_errno(const llhttp_t* parser) { return parser->error; } const char* llhttp_get_error_reason(const llhttp_t* parser) { return parser->reason; } void llhttp_set_error_reason(llhttp_t* parser, const char* reason) { parser->reason = reason; } const char* llhttp_get_error_pos(const llhttp_t* parser) { return parser->error_pos; } const char* llhttp_errno_name(llhttp_errno_t err) { #define HTTP_ERRNO_GEN(CODE, NAME, _) case HPE_##NAME: return "HPE_" #NAME; switch (err) { HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) default: abort(); } #undef HTTP_ERRNO_GEN } const char* llhttp_method_name(llhttp_method_t method) { #define HTTP_METHOD_GEN(NUM, NAME, STRING) case HTTP_##NAME: return #STRING; switch (method) { HTTP_ALL_METHOD_MAP(HTTP_METHOD_GEN) default: abort(); } #undef HTTP_METHOD_GEN } void llhttp_set_lenient_headers(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_HEADERS; } else { parser->lenient_flags &= ~LENIENT_HEADERS; } } void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_CHUNKED_LENGTH; } else { parser->lenient_flags &= ~LENIENT_CHUNKED_LENGTH; } } void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled) { if (enabled) { parser->lenient_flags |= LENIENT_KEEP_ALIVE; } else { parser->lenient_flags &= ~LENIENT_KEEP_ALIVE; } } /* Callbacks */ int llhttp__on_message_begin(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_message_begin); return err; } int llhttp__on_url(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_url, p, endp - p); return err; } int llhttp__on_url_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_url_complete); return err; } int llhttp__on_status(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_status, p, endp - p); return err; } int llhttp__on_status_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_status_complete); return err; } int llhttp__on_header_field(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_header_field, p, endp - p); return err; } int llhttp__on_header_field_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_header_field_complete); return err; } int llhttp__on_header_value(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_header_value, p, endp - p); return err; } int llhttp__on_header_value_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_header_value_complete); return err; } int llhttp__on_headers_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_headers_complete); return err; } int llhttp__on_message_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_message_complete); return err; } int llhttp__on_body(llhttp_t* s, const char* p, const char* endp) { int err; SPAN_CALLBACK_MAYBE(s, on_body, p, endp - p); return err; } int llhttp__on_chunk_header(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_chunk_header); return err; } int llhttp__on_chunk_complete(llhttp_t* s, const char* p, const char* endp) { int err; CALLBACK_MAYBE(s, on_chunk_complete); return err; } /* Private */ void llhttp__debug(llhttp_t* s, const char* p, const char* endp, const char* msg) { if (p == endp) { fprintf(stderr, "p=%p type=%d flags=%02x next=null debug=%s\n", s, s->type, s->flags, msg); } else { fprintf(stderr, "p=%p type=%d flags=%02x next=%02x debug=%s\n", s, s->type, s->flags, *p, msg); } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/src/native/api.h0000644000175100001710000002007400000000000020341 0ustar00runnerdocker#ifndef INCLUDE_LLHTTP_API_H_ #define INCLUDE_LLHTTP_API_H_ #ifdef __cplusplus extern "C" { #endif #include #if defined(__wasm__) #define LLHTTP_EXPORT __attribute__((visibility("default"))) #else #define LLHTTP_EXPORT #endif typedef llhttp__internal_t llhttp_t; typedef struct llhttp_settings_s llhttp_settings_t; typedef int (*llhttp_data_cb)(llhttp_t*, const char *at, size_t length); typedef int (*llhttp_cb)(llhttp_t*); struct llhttp_settings_s { /* Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_message_begin; /* Possible return values 0, -1, HPE_USER */ llhttp_data_cb on_url; llhttp_data_cb on_status; llhttp_data_cb on_header_field; llhttp_data_cb on_header_value; /* Possible return values: * 0 - Proceed normally * 1 - Assume that request/response has no body, and proceed to parsing the * next message * 2 - Assume absence of body (as above) and make `llhttp_execute()` return * `HPE_PAUSED_UPGRADE` * -1 - Error * `HPE_PAUSED` */ llhttp_cb on_headers_complete; /* Possible return values 0, -1, HPE_USER */ llhttp_data_cb on_body; /* Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_message_complete; /* When on_chunk_header is called, the current chunk length is stored * in parser->content_length. * Possible return values 0, -1, `HPE_PAUSED` */ llhttp_cb on_chunk_header; llhttp_cb on_chunk_complete; /* Information-only callbacks, return value is ignored */ llhttp_cb on_url_complete; llhttp_cb on_status_complete; llhttp_cb on_header_field_complete; llhttp_cb on_header_value_complete; }; /* Initialize the parser with specific type and user settings. * * NOTE: lifetime of `settings` has to be at least the same as the lifetime of * the `parser` here. In practice, `settings` has to be either a static * variable or be allocated with `malloc`, `new`, etc. */ LLHTTP_EXPORT void llhttp_init(llhttp_t* parser, llhttp_type_t type, const llhttp_settings_t* settings); #if defined(__wasm__) LLHTTP_EXPORT llhttp_t* llhttp_alloc(llhttp_type_t type); LLHTTP_EXPORT void llhttp_free(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_type(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_http_major(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_http_minor(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_method(llhttp_t* parser); LLHTTP_EXPORT int llhttp_get_status_code(llhttp_t* parser); LLHTTP_EXPORT uint8_t llhttp_get_upgrade(llhttp_t* parser); #endif // defined(__wasm__) /* Reset an already initialized parser back to the start state, preserving the * existing parser type, callback settings, user data, and lenient flags. */ LLHTTP_EXPORT void llhttp_reset(llhttp_t* parser); /* Initialize the settings object */ LLHTTP_EXPORT void llhttp_settings_init(llhttp_settings_t* settings); /* Parse full or partial request/response, invoking user callbacks along the * way. * * If any of `llhttp_data_cb` returns errno not equal to `HPE_OK` - the parsing * interrupts, and such errno is returned from `llhttp_execute()`. If * `HPE_PAUSED` was used as a errno, the execution can be resumed with * `llhttp_resume()` call. * * In a special case of CONNECT/Upgrade request/response `HPE_PAUSED_UPGRADE` * is returned after fully parsing the request/response. If the user wishes to * continue parsing, they need to invoke `llhttp_resume_after_upgrade()`. * * NOTE: if this function ever returns a non-pause type error, it will continue * to return the same error upon each successive call up until `llhttp_init()` * is called. */ LLHTTP_EXPORT llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len); /* This method should be called when the other side has no further bytes to * send (e.g. shutdown of readable side of the TCP connection.) * * Requests without `Content-Length` and other messages might require treating * all incoming bytes as the part of the body, up to the last byte of the * connection. This method will invoke `on_message_complete()` callback if the * request was terminated safely. Otherwise a error code would be returned. */ LLHTTP_EXPORT llhttp_errno_t llhttp_finish(llhttp_t* parser); /* Returns `1` if the incoming message is parsed until the last byte, and has * to be completed by calling `llhttp_finish()` on EOF */ LLHTTP_EXPORT int llhttp_message_needs_eof(const llhttp_t* parser); /* Returns `1` if there might be any other messages following the last that was * successfully parsed. */ LLHTTP_EXPORT int llhttp_should_keep_alive(const llhttp_t* parser); /* Make further calls of `llhttp_execute()` return `HPE_PAUSED` and set * appropriate error reason. * * Important: do not call this from user callbacks! User callbacks must return * `HPE_PAUSED` if pausing is required. */ LLHTTP_EXPORT void llhttp_pause(llhttp_t* parser); /* Might be called to resume the execution after the pause in user's callback. * See `llhttp_execute()` above for details. * * Call this only if `llhttp_execute()` returns `HPE_PAUSED`. */ LLHTTP_EXPORT void llhttp_resume(llhttp_t* parser); /* Might be called to resume the execution after the pause in user's callback. * See `llhttp_execute()` above for details. * * Call this only if `llhttp_execute()` returns `HPE_PAUSED_UPGRADE` */ LLHTTP_EXPORT void llhttp_resume_after_upgrade(llhttp_t* parser); /* Returns the latest return error */ LLHTTP_EXPORT llhttp_errno_t llhttp_get_errno(const llhttp_t* parser); /* Returns the verbal explanation of the latest returned error. * * Note: User callback should set error reason when returning the error. See * `llhttp_set_error_reason()` for details. */ LLHTTP_EXPORT const char* llhttp_get_error_reason(const llhttp_t* parser); /* Assign verbal description to the returned error. Must be called in user * callbacks right before returning the errno. * * Note: `HPE_USER` error code might be useful in user callbacks. */ LLHTTP_EXPORT void llhttp_set_error_reason(llhttp_t* parser, const char* reason); /* Returns the pointer to the last parsed byte before the returned error. The * pointer is relative to the `data` argument of `llhttp_execute()`. * * Note: this method might be useful for counting the number of parsed bytes. */ LLHTTP_EXPORT const char* llhttp_get_error_pos(const llhttp_t* parser); /* Returns textual name of error code */ LLHTTP_EXPORT const char* llhttp_errno_name(llhttp_errno_t err); /* Returns textual name of HTTP method */ LLHTTP_EXPORT const char* llhttp_method_name(llhttp_method_t method); /* Enables/disables lenient header value parsing (disabled by default). * * Lenient parsing disables header value token checks, extending llhttp's * protocol support to highly non-compliant clients/server. No * `HPE_INVALID_HEADER_TOKEN` will be raised for incorrect header values when * lenient parsing is "on". * * **(USE AT YOUR OWN RISK)** */ LLHTTP_EXPORT void llhttp_set_lenient_headers(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of conflicting `Transfer-Encoding` and * `Content-Length` headers (disabled by default). * * Normally `llhttp` would error when `Transfer-Encoding` is present in * conjunction with `Content-Length`. This error is important to prevent HTTP * request smuggling, but may be less desirable for small number of cases * involving legacy servers. * * **(USE AT YOUR OWN RISK)** */ LLHTTP_EXPORT void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled); /* Enables/disables lenient handling of `Connection: close` and HTTP/1.0 * requests responses. * * Normally `llhttp` would error on (in strict mode) or discard (in loose mode) * the HTTP request/response after the request/response with `Connection: close` * and `Content-Length`. This is important to prevent cache poisoning attacks, * but might interact badly with outdated and insecure clients. With this flag * the extra request/response will be parsed normally. * * **(USE AT YOUR OWN RISK)** */ void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* INCLUDE_LLHTTP_API_H_ */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/src/native/http.c0000644000175100001710000001057200000000000020544 0ustar00runnerdocker#include #ifndef LLHTTP__TEST # include "llhttp.h" #else # define llhttp_t llparse_t #endif /* */ int llhttp_message_needs_eof(const llhttp_t* parser); int llhttp_should_keep_alive(const llhttp_t* parser); int llhttp__before_headers_complete(llhttp_t* parser, const char* p, const char* endp) { /* Set this here so that on_headers_complete() callbacks can see it */ if ((parser->flags & F_UPGRADE) && (parser->flags & F_CONNECTION_UPGRADE)) { /* For responses, "Upgrade: foo" and "Connection: upgrade" are * mandatory only when it is a 101 Switching Protocols response, * otherwise it is purely informational, to announce support. */ parser->upgrade = (parser->type == HTTP_REQUEST || parser->status_code == 101); } else { parser->upgrade = (parser->method == HTTP_CONNECT); } return 0; } /* Return values: * 0 - No body, `restart`, message_complete * 1 - CONNECT request, `restart`, message_complete, and pause * 2 - chunk_size_start * 3 - body_identity * 4 - body_identity_eof * 5 - invalid transfer-encoding for request */ int llhttp__after_headers_complete(llhttp_t* parser, const char* p, const char* endp) { int hasBody; hasBody = parser->flags & F_CHUNKED || parser->content_length > 0; if (parser->upgrade && (parser->method == HTTP_CONNECT || (parser->flags & F_SKIPBODY) || !hasBody)) { /* Exit, the rest of the message is in a different protocol. */ return 1; } if (parser->flags & F_SKIPBODY) { return 0; } else if (parser->flags & F_CHUNKED) { /* chunked encoding - ignore Content-Length header, prepare for a chunk */ return 2; } else if (parser->flags & F_TRANSFER_ENCODING) { if (parser->type == HTTP_REQUEST && (parser->lenient_flags & LENIENT_CHUNKED_LENGTH) == 0) { /* RFC 7230 3.3.3 */ /* If a Transfer-Encoding header field * is present in a request and the chunked transfer coding is not * the final encoding, the message body length cannot be determined * reliably; the server MUST respond with the 400 (Bad Request) * status code and then close the connection. */ return 5; } else { /* RFC 7230 3.3.3 */ /* If a Transfer-Encoding header field is present in a response and * the chunked transfer coding is not the final encoding, the * message body length is determined by reading the connection until * it is closed by the server. */ return 4; } } else { if (!(parser->flags & F_CONTENT_LENGTH)) { if (!llhttp_message_needs_eof(parser)) { /* Assume content-length 0 - read the next */ return 0; } else { /* Read body until EOF */ return 4; } } else if (parser->content_length == 0) { /* Content-Length header given but zero: Content-Length: 0\r\n */ return 0; } else { /* Content-Length header given and non-zero */ return 3; } } } int llhttp__after_message_complete(llhttp_t* parser, const char* p, const char* endp) { int should_keep_alive; should_keep_alive = llhttp_should_keep_alive(parser); parser->finish = HTTP_FINISH_SAFE; parser->flags = 0; /* NOTE: this is ignored in loose parsing mode */ return should_keep_alive; } int llhttp_message_needs_eof(const llhttp_t* parser) { if (parser->type == HTTP_REQUEST) { return 0; } /* See RFC 2616 section 4.4 */ if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ parser->status_code == 204 || /* No Content */ parser->status_code == 304 || /* Not Modified */ (parser->flags & F_SKIPBODY)) { /* response to a HEAD request */ return 0; } /* RFC 7230 3.3.3, see `llhttp__after_headers_complete` */ if ((parser->flags & F_TRANSFER_ENCODING) && (parser->flags & F_CHUNKED) == 0) { return 1; } if (parser->flags & (F_CHUNKED | F_CONTENT_LENGTH)) { return 0; } return 1; } int llhttp_should_keep_alive(const llhttp_t* parser) { if (parser->http_major > 0 && parser->http_minor > 0) { /* HTTP/1.1 */ if (parser->flags & F_CONNECTION_CLOSE) { return 0; } } else { /* HTTP/1.0 or earlier */ if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { return 0; } } return !llhttp_message_needs_eof(parser); } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0704525 aiohttp-3.8.1/vendor/llhttp/test/0000755000175100001710000000000000000000000016316 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0704525 aiohttp-3.8.1/vendor/llhttp/test/fixtures/0000755000175100001710000000000000000000000020167 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/fixtures/extra.c0000644000175100001710000001123200000000000021455 0ustar00runnerdocker#include #include "fixture.h" int llhttp__on_url(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url", p, endp); } int llhttp__on_url_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "url complete"); return 0; } int llhttp__on_url_schema(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url.schema", p, endp); } int llhttp__on_url_host(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url.host", p, endp); } int llhttp__on_url_path(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url.path", p, endp); } int llhttp__on_url_query(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url.query", p, endp); } int llhttp__on_url_fragment(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("url.fragment", p, endp); } #ifdef LLHTTP__TEST_HTTP void llhttp__test_init_request(llparse_t* s) { s->type = HTTP_REQUEST; } void llhttp__test_init_response(llparse_t* s) { s->type = HTTP_RESPONSE; } void llhttp__test_init_request_lenient_headers(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_HEADERS; } void llhttp__test_init_request_lenient_chunked_length(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_CHUNKED_LENGTH; } void llhttp__test_init_request_lenient_keep_alive(llparse_t* s) { llhttp__test_init_request(s); s->lenient_flags |= LENIENT_KEEP_ALIVE; } void llhttp__test_init_response_lenient_keep_alive(llparse_t* s) { llhttp__test_init_response(s); s->lenient_flags |= LENIENT_KEEP_ALIVE; } void llhttp__test_finish(llparse_t* s) { llparse__print(NULL, NULL, "finish=%d", s->finish); } int llhttp__on_status(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("status", p, endp); } int llhttp__on_status_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "status complete"); return 0; } int llhttp__on_header_field(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("header_field", p, endp); } int llhttp__on_header_field_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "header_field complete"); return 0; } int llhttp__on_header_value(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("header_value", p, endp); } int llhttp__on_header_value_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "header_value complete"); return 0; } int llhttp__on_headers_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; if (s->type == HTTP_REQUEST) { llparse__print(p, endp, "headers complete method=%d v=%d/%d flags=%x content_length=%llu", s->method, s->http_major, s->http_minor, s->flags, s->content_length); } else if (s->type == HTTP_RESPONSE) { llparse__print(p, endp, "headers complete status=%d v=%d/%d flags=%x content_length=%llu", s->status_code, s->http_major, s->http_minor, s->flags, s->content_length); } else { llparse__print(p, endp, "invalid headers complete"); } return 0; } int llhttp__on_message_begin(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "message begin"); return 0; } int llhttp__on_message_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "message complete"); return 0; } int llhttp__on_body(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; return llparse__print_span("body", p, endp); } int llhttp__on_chunk_header(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "chunk header len=%d", (int) s->content_length); return 0; } int llhttp__on_chunk_complete(llparse_t* s, const char* p, const char* endp) { if (llparse__in_bench) return 0; llparse__print(p, endp, "chunk complete"); return 0; } #endif /* LLHTTP__TEST_HTTP */ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/fixtures/index.ts0000644000175100001710000000500400000000000021645 0ustar00runnerdockerimport * as fs from 'fs'; import { ICompilerResult, LLParse } from 'llparse'; import { Dot } from 'llparse-dot'; import { Fixture, FixtureResult, IFixtureBuildOptions, } from 'llparse-test-fixture'; import * as path from 'path'; import * as llhttp from '../../src/llhttp'; export type TestType = 'request' | 'response' | 'request-lenient-headers' | 'request-lenient-chunked-length' | 'request-lenient-keep-alive' | 'response-lenient-keep-alive' | 'request-finish' | 'response-finish' | 'none' | 'url'; export { FixtureResult }; const BUILD_DIR = path.join(__dirname, '..', 'tmp'); const CHEADERS_FILE = path.join(BUILD_DIR, 'cheaders.h'); const cheaders = new llhttp.CHeaders().build(); try { fs.mkdirSync(BUILD_DIR); } catch (e) { // no-op } fs.writeFileSync(CHEADERS_FILE, cheaders); const fixtures = new Fixture({ buildDir: path.join(__dirname, '..', 'tmp'), extra: [ '-msse4.2', '-DLLHTTP__TEST', '-DLLPARSE__ERROR_PAUSE=' + llhttp.constants.ERROR.PAUSED, '-include', CHEADERS_FILE, path.join(__dirname, 'extra.c'), ], maxParallel: process.env.LLPARSE_DEBUG ? 1 : undefined, }); const cache: Map = new Map(); export async function build( llparse: LLParse, node: any, outFile: string, options: IFixtureBuildOptions = {}, ty: TestType = 'none'): Promise { const dot = new Dot(); fs.writeFileSync(path.join(BUILD_DIR, outFile + '.dot'), dot.build(node)); let artifacts: ICompilerResult; if (cache.has(node)) { artifacts = cache.get(node)!; } else { artifacts = llparse.build(node, { c: { header: outFile }, debug: process.env.LLPARSE_DEBUG ? 'llparse__debug' : undefined, }); cache.set(node, artifacts); } const extra = options.extra === undefined ? [] : options.extra.slice(); if (ty === 'request' || ty === 'response' || ty === 'request-lenient-headers' || ty === 'request-lenient-chunked-length' || ty === 'request-lenient-keep-alive' || ty === 'response-lenient-keep-alive') { extra.push( `-DLLPARSE__TEST_INIT=llhttp__test_init_${ty.replace(/-/g, '_')}`); } else if (ty === 'request-finish' || ty === 'response-finish') { if (ty === 'request-finish') { extra.push('-DLLPARSE__TEST_INIT=llhttp__test_init_request'); } else { extra.push('-DLLPARSE__TEST_INIT=llhttp__test_init_response'); } extra.push('-DLLPARSE__TEST_FINISH=llhttp__test_finish'); } return await fixtures.build(artifacts, outFile, Object.assign(options, { extra, })); } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0704525 aiohttp-3.8.1/vendor/llhttp/test/fuzzers/0000755000175100001710000000000000000000000020026 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/fuzzers/fuzz_parser.c0000644000175100001710000000215200000000000022544 0ustar00runnerdocker#include "llhttp.h" #include #include #include int handle_on_message_complete(llhttp_t *arg) { return 0; } int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { llhttp_t parser; llhttp_settings_t settings; llhttp_type_t http_type; /* We need four bytes to determine variable parameters */ if (size < 4) { return 0; } int headers = (data[0] & 0x01) == 1; int chunked_length = (data[1] & 0x01) == 1; int keep_alive = (data[2] & 0x01) == 1; if (data[0] % 3 == 0) { http_type = HTTP_BOTH; } else if (data[0] % 3 == 1) { http_type = HTTP_REQUEST; } else { http_type = HTTP_RESPONSE; } data += 4; size -= 4; /* Initialize user callbacks and settings */ llhttp_settings_init(&settings); /* Set user callback */ settings.on_message_complete = handle_on_message_complete; llhttp_init(&parser, http_type, &settings); llhttp_set_lenient_headers(&parser, headers); llhttp_set_lenient_chunked_length(&parser, chunked_length); llhttp_set_lenient_keep_alive(&parser, keep_alive); llhttp_execute(&parser, data, size); return 0; } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/md-test.ts0000644000175100001710000002117700000000000020253 0ustar00runnerdockerimport * as assert from 'assert'; import * as fs from 'fs'; import { LLParse } from 'llparse'; import { Group, MDGator, Metadata, Test } from 'mdgator'; import * as path from 'path'; import * as vm from 'vm'; import * as llhttp from '../src/llhttp'; import { build, FixtureResult, TestType } from './fixtures'; // // Cache nodes/llparse instances ahead of time // (different types of tests will re-use them) // function buildNode(mode: llhttp.HTTPMode) { const p = new LLParse(); const instance = new llhttp.HTTP(p, mode); return { llparse: p, entry: instance.build().entry }; } const httpNode = { loose: buildNode('loose'), strict: buildNode('strict'), }; function buildURL(mode: llhttp.HTTPMode) { const p = new LLParse(); const instance = new llhttp.URL(p, mode, true); const node = instance.build(); // Loop node.exit.toHTTP.otherwise(node.entry.normal); node.exit.toHTTP09.otherwise(node.entry.normal); return { llparse: p, entry: node.entry.normal }; } const urlNode = { loose: buildURL('loose'), strict: buildURL('strict'), }; // // Build binaries using cached nodes/llparse // async function buildMode(mode: llhttp.HTTPMode, ty: TestType) : Promise { let node; let prefix: string; let extra: ReadonlyArray; if (ty === 'url') { node = urlNode[mode]; prefix = 'url'; extra = []; } else { node = httpNode[mode]; prefix = 'http'; extra = [ '-DLLHTTP__TEST_HTTP', path.join(__dirname, '..', 'src', 'native', 'http.c'), ]; } return await build(node.llparse, node.entry, `${prefix}-${mode}-${ty}`, { extra, }, ty); } interface IFixtureMap { [key: string]: { [key: string]: Promise }; } const http: IFixtureMap = { loose: { 'none': buildMode('loose', 'none'), 'request': buildMode('loose', 'request'), 'request-finish': buildMode('loose', 'request-finish'), 'request-lenient-chunked-length': buildMode('loose', 'request-lenient-chunked-length'), 'request-lenient-headers': buildMode('loose', 'request-lenient-headers'), 'request-lenient-keep-alive': buildMode( 'loose', 'request-lenient-keep-alive'), 'response': buildMode('loose', 'response'), 'response-finish': buildMode('loose', 'response-finish'), 'response-lenient-keep-alive': buildMode( 'loose', 'response-lenient-keep-alive'), 'url': buildMode('loose', 'url'), }, strict: { 'none': buildMode('strict', 'none'), 'request': buildMode('strict', 'request'), 'request-finish': buildMode('strict', 'request-finish'), 'request-lenient-chunked-length': buildMode('strict', 'request-lenient-chunked-length'), 'request-lenient-headers': buildMode('strict', 'request-lenient-headers'), 'request-lenient-keep-alive': buildMode( 'strict', 'request-lenient-keep-alive'), 'response': buildMode('strict', 'response'), 'response-finish': buildMode('strict', 'response-finish'), 'response-lenient-keep-alive': buildMode( 'strict', 'response-lenient-keep-alive'), 'url': buildMode('strict', 'url'), }, }; // // Run test suite // function run(name: string): void { const md = new MDGator(); const raw = fs.readFileSync(path.join(__dirname, name + '.md')).toString(); const groups = md.parse(raw); function runSingleTest(mode: llhttp.HTTPMode, ty: TestType, meta: any, input: string, expected: ReadonlyArray): void { it(`should pass in mode="${mode}" and for type="${ty}"`, async () => { const binary = await http[mode][ty]; await binary.check(input, expected, { noScan: meta.noScan === true, }); }); } function runTest(test: Test) { describe(test.name + ` at ${name}.md:${test.line + 1}`, () => { let modes: llhttp.HTTPMode[] = [ 'strict', 'loose' ]; let types: TestType[] = [ 'none' ]; const isURL = test.values.has('url'); const inputKey = isURL ? 'url' : 'http'; assert(test.values.has(inputKey), `Missing "${inputKey}" code in md file`); assert.strictEqual(test.values.get(inputKey)!.length, 1, `Expected just one "${inputKey}" input`); let meta: Metadata; if (test.meta.has(inputKey)) { meta = test.meta.get(inputKey)![0]!; } else { assert(isURL, 'Missing required http metadata'); meta = {}; } if (isURL) { types = [ 'url' ]; } else { assert(meta.hasOwnProperty('type'), 'Missing required `type` metadata'); if (meta.type === 'request') { types.push('request'); } else if (meta.type === 'response') { types.push('response'); } else if (meta.type === 'request-only') { types = [ 'request' ]; } else if (meta.type === 'request-lenient-headers') { types = [ 'request-lenient-headers' ]; } else if (meta.type === 'request-lenient-chunked-length') { types = [ 'request-lenient-chunked-length' ]; } else if (meta.type === 'request-lenient-keep-alive') { types = [ 'request-lenient-keep-alive' ]; } else if (meta.type === 'response-lenient-keep-alive') { types = [ 'response-lenient-keep-alive' ]; } else if (meta.type === 'response-only') { types = [ 'response' ]; } else if (meta.type === 'request-finish') { types = [ 'request-finish' ]; } else if (meta.type === 'response-finish') { types = [ 'response-finish' ]; } else { throw new Error(`Invalid value of \`type\` metadata: "${meta.type}"`); } } assert(test.values.has('log'), 'Missing `log` code in md file'); assert.strictEqual(test.values.get('log')!.length, 1, 'Expected just one output'); if (meta.mode === 'strict') { modes = [ 'strict' ]; } else if (meta.mode === 'loose') { modes = [ 'loose' ]; } else { assert(!meta.hasOwnProperty('mode'), `Invalid value of \`mode\` metadata: "${meta.mode}"`); } let input: string = test.values.get(inputKey)![0]; let expected: string = test.values.get('log')![0]; // Remove trailing newline input = input.replace(/\n$/, ''); // Remove escaped newlines input = input.replace(/\\(\r\n|\r|\n)/g, ''); // Normalize all newlines input = input.replace(/\r\n|\r|\n/g, '\r\n'); // Replace escaped CRLF, tabs, form-feed input = input.replace(/\\r/g, '\r'); input = input.replace(/\\n/g, '\n'); input = input.replace(/\\t/g, '\t'); input = input.replace(/\\f/g, '\f'); input = input.replace(/\\x([0-9a-fA-F]+)/g, (all, hex) => { return String.fromCharCode(parseInt(hex, 16)); }); // Useful in token tests input = input.replace(/\\([0-7]{1,3})/g, (_, digits) => { return String.fromCharCode(parseInt(digits, 8)); }); // Evaluate inline JavaScript input = input.replace(/\$\{(.+?)\}/g, (_, code) => { return vm.runInNewContext(code) + ''; }); // Escape first symbol `\r` or `\n`, `|`, `&` for Windows if (process.platform === 'win32') { const firstByte = Buffer.from(input)[0]; if (firstByte === 0x0a || firstByte === 0x0d) { input = '\\' + input; } input = input.replace(/\|/g, '^|'); input = input.replace(/&/g, '^&'); } // Replace escaped tabs/form-feed in expected too expected = expected.replace(/\\t/g, '\t'); expected = expected.replace(/\\f/g, '\f'); // Split const expectedLines = expected.split(/\n/g).slice(0, -1); const fullExpected = expectedLines.map((line) => { if (line.startsWith('/')) { return new RegExp(line.trim().slice(1, -1)); } else { return line; } }); modes.forEach((mode) => { types.forEach((ty) => { runSingleTest(mode, ty, meta, input, fullExpected); }); }); }); } function runGroup(group: Group) { describe(group.name + ` at ${name}.md:${group.line + 1}`, function() { this.timeout(60000); group.children.forEach((child) => runGroup(child)); group.tests.forEach((test) => runTest(test)); }); } groups.forEach((group) => runGroup(group)); } run('request/sample'); run('request/lenient-headers'); run('request/method'); run('request/uri'); run('request/connection'); run('request/content-length'); run('request/transfer-encoding'); run('request/invalid'); run('request/finish'); run('response/sample'); run('response/connection'); run('response/content-length'); run('response/transfer-encoding'); run('response/invalid'); run('response/finish'); run('url'); ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0744524 aiohttp-3.8.1/vendor/llhttp/test/request/0000755000175100001710000000000000000000000020006 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/request/connection.md0000644000175100001710000003726300000000000022502 0ustar00runnerdockerConnection header ================= ## `keep-alive` ### Setting flag ```http PUT /url HTTP/1.1 Connection: keep-alive ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=10 span[header_value]="keep-alive" off=43 header_value complete off=45 headers complete method=4 v=1/1 flags=1 content_length=0 off=45 message complete ``` ### Restarting when keep-alive is explicitly ```http PUT /url HTTP/1.1 Connection: keep-alive PUT /url HTTP/1.1 Connection: keep-alive ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=10 span[header_value]="keep-alive" off=43 header_value complete off=45 headers complete method=4 v=1/1 flags=1 content_length=0 off=45 message complete off=45 message begin off=49 len=4 span[url]="/url" off=54 url complete off=64 len=10 span[header_field]="Connection" off=75 header_field complete off=76 len=10 span[header_value]="keep-alive" off=88 header_value complete off=90 headers complete method=4 v=1/1 flags=1 content_length=0 off=90 message complete ``` ### No restart when keep-alive is off (1.0) and parser is in strict mode ```http PUT /url HTTP/1.0 PUT /url HTTP/1.1 ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=21 headers complete method=4 v=1/0 flags=0 content_length=0 off=21 message complete off=22 error code=5 reason="Data after `Connection: close`" ``` ### Resetting flags when keep-alive is off (1.0) and parser is in lenient mode Even though we allow restarts in loose mode, the flags should be still set to `0` upon restart. ```http PUT /url HTTP/1.0 Content-Length: 0 PUT /url HTTP/1.1 Transfer-Encoding: chunked ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=1 span[header_value]="0" off=38 header_value complete off=40 headers complete method=4 v=1/0 flags=20 content_length=0 off=40 message complete off=40 message begin off=44 len=4 span[url]="/url" off=49 url complete off=59 len=17 span[header_field]="Transfer-Encoding" off=77 header_field complete off=78 len=7 span[header_value]="chunked" off=87 header_value complete off=89 headers complete method=4 v=1/1 flags=208 content_length=0 ``` ### CRLF between requests, implicit `keep-alive` ```http POST / HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded Content-Length: 4 q=42 GET / HTTP/1.1 ``` _Note the trailing CRLF above_ ```log off=0 message begin off=5 len=1 span[url]="/" off=7 url complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=15 span[header_value]="www.example.com" off=40 header_value complete off=40 len=12 span[header_field]="Content-Type" off=53 header_field complete off=54 len=33 span[header_value]="application/x-www-form-urlencoded" off=89 header_value complete off=89 len=14 span[header_field]="Content-Length" off=104 header_field complete off=105 len=1 span[header_value]="4" off=108 header_value complete off=110 headers complete method=3 v=1/1 flags=20 content_length=4 off=110 len=4 span[body]="q=42" off=114 message complete off=118 message begin off=122 len=1 span[url]="/" off=124 url complete ``` ### Not treating `\r` as `-` ```http PUT /url HTTP/1.1 Connection: keep\ralive ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=4 span[header_value]="keep" off=36 error code=3 reason="Missing expected LF after header value" ``` ## `close` ### Setting flag on `close` ```http PUT /url HTTP/1.1 Connection: close ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=5 span[header_value]="close" off=38 header_value complete off=40 headers complete method=4 v=1/1 flags=2 content_length=0 off=40 message complete ``` ### CRLF between requests, explicit `close` (strict mode) `close` means closed connection in strict mode. ```http POST / HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded Content-Length: 4 Connection: close q=42 GET / HTTP/1.1 ``` _Note the trailing CRLF above_ ```log off=0 message begin off=5 len=1 span[url]="/" off=7 url complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=15 span[header_value]="www.example.com" off=40 header_value complete off=40 len=12 span[header_field]="Content-Type" off=53 header_field complete off=54 len=33 span[header_value]="application/x-www-form-urlencoded" off=89 header_value complete off=89 len=14 span[header_field]="Content-Length" off=104 header_field complete off=105 len=1 span[header_value]="4" off=108 header_value complete off=108 len=10 span[header_field]="Connection" off=119 header_field complete off=120 len=5 span[header_value]="close" off=127 header_value complete off=129 headers complete method=3 v=1/1 flags=22 content_length=4 off=129 len=4 span[body]="q=42" off=133 message complete off=138 error code=5 reason="Data after `Connection: close`" ``` ### CRLF between requests, explicit `close` (lenient mode) Loose mode is more lenient, and allows further requests. ```http POST / HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded Content-Length: 4 Connection: close q=42 GET / HTTP/1.1 ``` _Note the trailing CRLF above_ ```log off=0 message begin off=5 len=1 span[url]="/" off=7 url complete off=17 len=4 span[header_field]="Host" off=22 header_field complete off=23 len=15 span[header_value]="www.example.com" off=40 header_value complete off=40 len=12 span[header_field]="Content-Type" off=53 header_field complete off=54 len=33 span[header_value]="application/x-www-form-urlencoded" off=89 header_value complete off=89 len=14 span[header_field]="Content-Length" off=104 header_field complete off=105 len=1 span[header_value]="4" off=108 header_value complete off=108 len=10 span[header_field]="Connection" off=119 header_field complete off=120 len=5 span[header_value]="close" off=127 header_value complete off=129 headers complete method=3 v=1/1 flags=22 content_length=4 off=129 len=4 span[body]="q=42" off=133 message complete off=137 message begin off=141 len=1 span[url]="/" off=143 url complete ``` ## Parsing multiple tokens ### Sample ```http PUT /url HTTP/1.1 Connection: close, token, upgrade, token, keep-alive ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=40 span[header_value]="close, token, upgrade, token, keep-alive" off=73 header_value complete off=75 headers complete method=4 v=1/1 flags=7 content_length=0 off=75 message complete ``` ### Multiple tokens with folding ```http GET /demo HTTP/1.1 Host: example.com Connection: Something, Upgrade, ,Keep-Alive Sec-WebSocket-Key2: 12998 5 Y3 1 .P00 Sec-WebSocket-Protocol: sample Upgrade: WebSocket Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5 Origin: http://example.com Hot diggity dogg ``` ```log off=0 message begin off=4 len=5 span[url]="/demo" off=10 url complete off=20 len=4 span[header_field]="Host" off=25 header_field complete off=26 len=11 span[header_value]="example.com" off=39 header_value complete off=39 len=10 span[header_field]="Connection" off=50 header_field complete off=51 len=10 span[header_value]="Something," off=63 len=21 span[header_value]=" Upgrade, ,Keep-Alive" off=86 header_value complete off=86 len=18 span[header_field]="Sec-WebSocket-Key2" off=105 header_field complete off=106 len=18 span[header_value]="12998 5 Y3 1 .P00" off=126 header_value complete off=126 len=22 span[header_field]="Sec-WebSocket-Protocol" off=149 header_field complete off=150 len=6 span[header_value]="sample" off=158 header_value complete off=158 len=7 span[header_field]="Upgrade" off=166 header_field complete off=167 len=9 span[header_value]="WebSocket" off=178 header_value complete off=178 len=18 span[header_field]="Sec-WebSocket-Key1" off=197 header_field complete off=198 len=20 span[header_value]="4 @1 46546xW%0l 1 5" off=220 header_value complete off=220 len=6 span[header_field]="Origin" off=227 header_field complete off=228 len=18 span[header_value]="http://example.com" off=248 header_value complete off=250 headers complete method=1 v=1/1 flags=15 content_length=0 off=250 message complete off=250 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Multiple tokens with folding and LWS ```http GET /demo HTTP/1.1 Connection: keep-alive, upgrade Upgrade: WebSocket Hot diggity dogg ``` ```log off=0 message begin off=4 len=5 span[url]="/demo" off=10 url complete off=20 len=10 span[header_field]="Connection" off=31 header_field complete off=32 len=19 span[header_value]="keep-alive, upgrade" off=53 header_value complete off=53 len=7 span[header_field]="Upgrade" off=61 header_field complete off=62 len=9 span[header_value]="WebSocket" off=73 header_value complete off=75 headers complete method=1 v=1/1 flags=15 content_length=0 off=75 message complete off=75 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Multiple tokens with folding, LWS, and CRLF ```http GET /demo HTTP/1.1 Connection: keep-alive, \r\n upgrade Upgrade: WebSocket Hot diggity dogg ``` ```log off=0 message begin off=4 len=5 span[url]="/demo" off=10 url complete off=20 len=10 span[header_field]="Connection" off=31 header_field complete off=32 len=12 span[header_value]="keep-alive, " off=46 len=8 span[header_value]=" upgrade" off=56 header_value complete off=56 len=7 span[header_field]="Upgrade" off=64 header_field complete off=65 len=9 span[header_value]="WebSocket" off=76 header_value complete off=78 headers complete method=1 v=1/1 flags=15 content_length=0 off=78 message complete off=78 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Invalid whitespace token with `Connection` header field ```http PUT /url HTTP/1.1 Connection : upgrade Content-Length: 4 Upgrade: ws abcdefgh ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=10 span[header_field]="Connection" off=30 error code=10 reason="Invalid header field char" ``` ### Invalid whitespace token with `Connection` header field (lenient) ```http PUT /url HTTP/1.1 Connection : upgrade Content-Length: 4 Upgrade: ws abcdefgh ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=11 span[header_field]="Connection " off=31 header_field complete off=32 len=7 span[header_value]="upgrade" off=41 header_value complete off=41 len=14 span[header_field]="Content-Length" off=56 header_field complete off=57 len=1 span[header_value]="4" off=60 header_value complete off=60 len=7 span[header_field]="Upgrade" off=68 header_field complete off=69 len=2 span[header_value]="ws" off=73 header_value complete off=75 headers complete method=4 v=1/1 flags=34 content_length=4 off=75 len=4 span[body]="abcd" off=79 message complete off=79 error code=22 reason="Pause on CONNECT/Upgrade" ``` ## `upgrade` ### Setting a flag and pausing ```http PUT /url HTTP/1.1 Connection: upgrade Upgrade: ws ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=7 span[header_value]="upgrade" off=40 header_value complete off=40 len=7 span[header_field]="Upgrade" off=48 header_field complete off=49 len=2 span[header_value]="ws" off=53 header_value complete off=55 headers complete method=4 v=1/1 flags=14 content_length=0 off=55 message complete off=55 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Emitting part of body and pausing ```http PUT /url HTTP/1.1 Connection: upgrade Content-Length: 4 Upgrade: ws abcdefgh ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=7 span[header_value]="upgrade" off=40 header_value complete off=40 len=14 span[header_field]="Content-Length" off=55 header_field complete off=56 len=1 span[header_value]="4" off=59 header_value complete off=59 len=7 span[header_field]="Upgrade" off=67 header_field complete off=68 len=2 span[header_value]="ws" off=72 header_value complete off=74 headers complete method=4 v=1/1 flags=34 content_length=4 off=74 len=4 span[body]="abcd" off=78 message complete off=78 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Upgrade GET request ```http GET /demo HTTP/1.1 Host: example.com Connection: Upgrade Sec-WebSocket-Key2: 12998 5 Y3 1 .P00 Sec-WebSocket-Protocol: sample Upgrade: WebSocket Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5 Origin: http://example.com Hot diggity dogg ``` ```log off=0 message begin off=4 len=5 span[url]="/demo" off=10 url complete off=20 len=4 span[header_field]="Host" off=25 header_field complete off=26 len=11 span[header_value]="example.com" off=39 header_value complete off=39 len=10 span[header_field]="Connection" off=50 header_field complete off=51 len=7 span[header_value]="Upgrade" off=60 header_value complete off=60 len=18 span[header_field]="Sec-WebSocket-Key2" off=79 header_field complete off=80 len=18 span[header_value]="12998 5 Y3 1 .P00" off=100 header_value complete off=100 len=22 span[header_field]="Sec-WebSocket-Protocol" off=123 header_field complete off=124 len=6 span[header_value]="sample" off=132 header_value complete off=132 len=7 span[header_field]="Upgrade" off=140 header_field complete off=141 len=9 span[header_value]="WebSocket" off=152 header_value complete off=152 len=18 span[header_field]="Sec-WebSocket-Key1" off=171 header_field complete off=172 len=20 span[header_value]="4 @1 46546xW%0l 1 5" off=194 header_value complete off=194 len=6 span[header_field]="Origin" off=201 header_field complete off=202 len=18 span[header_value]="http://example.com" off=222 header_value complete off=224 headers complete method=1 v=1/1 flags=14 content_length=0 off=224 message complete off=224 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### Upgrade POST request ```http POST /demo HTTP/1.1 Host: example.com Connection: Upgrade Upgrade: HTTP/2.0 Content-Length: 15 sweet post body\ Hot diggity dogg ``` ```log off=0 message begin off=5 len=5 span[url]="/demo" off=11 url complete off=21 len=4 span[header_field]="Host" off=26 header_field complete off=27 len=11 span[header_value]="example.com" off=40 header_value complete off=40 len=10 span[header_field]="Connection" off=51 header_field complete off=52 len=7 span[header_value]="Upgrade" off=61 header_value complete off=61 len=7 span[header_field]="Upgrade" off=69 header_field complete off=70 len=8 span[header_value]="HTTP/2.0" off=80 header_value complete off=80 len=14 span[header_field]="Content-Length" off=95 header_field complete off=96 len=2 span[header_value]="15" off=100 header_value complete off=102 headers complete method=3 v=1/1 flags=34 content_length=15 off=102 len=15 span[body]="sweet post body" off=117 message complete off=117 error code=22 reason="Pause on CONNECT/Upgrade" ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/request/content-length.md0000644000175100001710000001647100000000000023272 0ustar00runnerdockerContent-Length header ===================== ## `Content-Length` with zeroes ```http PUT /url HTTP/1.1 Content-Length: 003 abc ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=3 span[header_value]="003" off=40 header_value complete off=42 headers complete method=4 v=1/1 flags=20 content_length=3 off=42 len=3 span[body]="abc" off=45 message complete ``` ## `Content-Length` with follow-up headers The way the parser works is that special headers (like `Content-Length`) first set `header_state` to appropriate value, and then apply custom parsing using that value. For `Content-Length`, in particular, the `header_state` is used for setting the flag too. Make sure that `header_state` is reset to `0`, so that the flag won't be attempted to set twice (and error). ```http PUT /url HTTP/1.1 Content-Length: 003 Ohai: world abc ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=3 span[header_value]="003" off=40 header_value complete off=40 len=4 span[header_field]="Ohai" off=45 header_field complete off=46 len=5 span[header_value]="world" off=53 header_value complete off=55 headers complete method=4 v=1/1 flags=20 content_length=3 off=55 len=3 span[body]="abc" off=58 message complete ``` ## Error on `Content-Length` overflow ```http PUT /url HTTP/1.1 Content-Length: 1000000000000000000000 ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=21 span[header_value]="100000000000000000000" off=56 error code=11 reason="Content-Length overflow" ``` ## Error on duplicate `Content-Length` ```http PUT /url HTTP/1.1 Content-Length: 1 Content-Length: 2 ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=1 span[header_value]="1" off=38 header_value complete off=38 len=14 span[header_field]="Content-Length" off=53 header_field complete off=54 error code=4 reason="Duplicate Content-Length" ``` ## Error on simultaneous `Content-Length` and `Transfer-Encoding: identity` ```http PUT /url HTTP/1.1 Content-Length: 1 Transfer-Encoding: identity ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=1 span[header_value]="1" off=38 header_value complete off=38 len=17 span[header_field]="Transfer-Encoding" off=56 header_field complete off=57 len=8 span[header_value]="identity" off=67 header_value complete off=69 error code=4 reason="Content-Length can't be present with Transfer-Encoding" ``` ## Invalid whitespace token with `Content-Length` header field ```http PUT /url HTTP/1.1 Connection: upgrade Content-Length : 4 Upgrade: ws abcdefgh ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=7 span[header_value]="upgrade" off=40 header_value complete off=40 len=14 span[header_field]="Content-Length" off=55 error code=10 reason="Invalid header field char" ``` ## Invalid whitespace token with `Content-Length` header field (lenient) ```http PUT /url HTTP/1.1 Connection: upgrade Content-Length : 4 Upgrade: ws abcdefgh ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=10 span[header_field]="Connection" off=30 header_field complete off=31 len=7 span[header_value]="upgrade" off=40 header_value complete off=40 len=15 span[header_field]="Content-Length " off=56 header_field complete off=57 len=1 span[header_value]="4" off=60 header_value complete off=60 len=7 span[header_field]="Upgrade" off=68 header_field complete off=69 len=2 span[header_value]="ws" off=73 header_value complete off=75 headers complete method=4 v=1/1 flags=34 content_length=4 off=75 len=4 span[body]="abcd" off=79 message complete off=79 error code=22 reason="Pause on CONNECT/Upgrade" ``` ## No error on simultaneous `Content-Length` and `Transfer-Encoding: identity` (lenient) ```http PUT /url HTTP/1.1 Content-Length: 1 Transfer-Encoding: chunked ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=14 span[header_field]="Content-Length" off=34 header_field complete off=35 len=1 span[header_value]="1" off=38 header_value complete off=38 len=17 span[header_field]="Transfer-Encoding" off=56 header_field complete off=57 len=7 span[header_value]="chunked" off=66 header_value complete off=68 headers complete method=4 v=1/1 flags=228 content_length=1 ``` ## Funky `Content-Length` with body ```http GET /get_funky_content_length_body_hello HTTP/1.0 conTENT-Length: 5 HELLO ``` ```log off=0 message begin off=4 len=36 span[url]="/get_funky_content_length_body_hello" off=41 url complete off=51 len=14 span[header_field]="conTENT-Length" off=66 header_field complete off=67 len=1 span[header_value]="5" off=70 header_value complete off=72 headers complete method=1 v=1/0 flags=20 content_length=5 off=72 len=5 span[body]="HELLO" off=77 message complete ``` ## Spaces in `Content-Length` (surrounding) ```http POST / HTTP/1.1 Content-Length: 42 ``` ```log off=0 message begin off=5 len=1 span[url]="/" off=7 url complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=34 len=3 span[header_value]="42 " off=39 header_value complete off=41 headers complete method=3 v=1/1 flags=20 content_length=42 ``` ### Spaces in `Content-Length` #2 ```http POST / HTTP/1.1 Content-Length: 4 2 ``` ```log off=0 message begin off=5 len=1 span[url]="/" off=7 url complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=2 span[header_value]="4 " off=35 error code=11 reason="Invalid character in Content-Length" ``` ### Spaces in `Content-Length` #3 ```http POST / HTTP/1.1 Content-Length: 13 37 ``` ```log off=0 message begin off=5 len=1 span[url]="/" off=7 url complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=33 len=3 span[header_value]="13 " off=36 error code=11 reason="Invalid character in Content-Length" ``` ### Empty `Content-Length` ```http POST / HTTP/1.1 Content-Length: ``` ```log off=0 message begin off=5 len=1 span[url]="/" off=7 url complete off=17 len=14 span[header_field]="Content-Length" off=32 header_field complete off=34 error code=11 reason="Empty Content-Length" ``` ## `Content-Length` with CR instead of dash ```http PUT /url HTTP/1.1 Content\rLength: 003 abc ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=26 error code=10 reason="Invalid header token" ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/request/finish.md0000644000175100001710000000202400000000000021606 0ustar00runnerdockerFinish ====== Those tests check the return codes and the behavior of `llhttp_finish()` C API. ## It should be safe to finish after GET request ```http GET / HTTP/1.1 ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=18 headers complete method=1 v=1/1 flags=0 content_length=0 off=18 message complete off=NULL finish=0 ``` ## It should be unsafe to finish after incomplete PUT request ```http PUT / HTTP/1.1 Content-Length: 100 ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=16 len=14 span[header_field]="Content-Length" off=31 header_field complete off=32 len=3 span[header_value]="100" off=NULL finish=2 ``` ## It should be unsafe to finish inside of the header ```http PUT / HTTP/1.1 Content-Leng ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=16 len=12 span[header_field]="Content-Leng" off=NULL finish=2 ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/request/invalid.md0000644000175100001710000000655500000000000021771 0ustar00runnerdockerInvalid requests ================ ### ICE protocol and GET method ```http GET /music/sweet/music ICE/1.0 Host: example.com ``` ```log off=0 message begin off=4 len=18 span[url]="/music/sweet/music" off=23 url complete off=27 error code=8 reason="Expected SOURCE method for ICE/x.x request" ``` ### ICE protocol, but not really ```http GET /music/sweet/music IHTTP/1.0 Host: example.com ``` ```log off=0 message begin off=4 len=18 span[url]="/music/sweet/music" off=23 url complete off=24 error code=8 reason="Expected HTTP/" ``` ### RTSP protocol and PUT method ```http PUT /music/sweet/music RTSP/1.0 Host: example.com ``` ```log off=0 message begin off=4 len=18 span[url]="/music/sweet/music" off=23 url complete off=28 error code=8 reason="Invalid method for RTSP/x.x request" ``` ### HTTP protocol and ANNOUNCE method ```http ANNOUNCE /music/sweet/music HTTP/1.0 Host: example.com ``` ```log off=0 message begin off=9 len=18 span[url]="/music/sweet/music" off=28 url complete off=33 error code=8 reason="Invalid method for HTTP/x.x request" ``` ### Headers separated by CR ```http GET / HTTP/1.1 Foo: 1\rBar: 2 ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=16 len=3 span[header_field]="Foo" off=20 header_field complete off=21 len=1 span[header_value]="1" off=23 error code=3 reason="Missing expected LF after header value" ``` ### Invalid header token #1 ```http GET / HTTP/1.1 Fo@: Failure ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=18 error code=10 reason="Invalid header token" ``` ### Invalid header token #2 ```http GET / HTTP/1.1 Foo\01\test: Bar ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=19 error code=10 reason="Invalid header token" ``` ### Invalid method ```http MKCOLA / HTTP/1.1 ``` ```log off=0 message begin off=5 error code=6 reason="Expected space after method" ``` ### Illegal header field name line folding ```http GET / HTTP/1.1 name : value ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=20 error code=10 reason="Invalid header token" ``` ### Corrupted Connection header ```http GET / HTTP/1.1 Host: www.example.com Connection\r\033\065\325eep-Alive Accept-Encoding: gzip ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=16 len=4 span[header_field]="Host" off=21 header_field complete off=22 len=15 span[header_value]="www.example.com" off=39 header_value complete off=49 error code=10 reason="Invalid header token" ``` ### Corrupted header name ```http GET / HTTP/1.1 Host: www.example.com X-Some-Header\r\033\065\325eep-Alive Accept-Encoding: gzip ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=16 len=4 span[header_field]="Host" off=21 header_field complete off=22 len=15 span[header_value]="www.example.com" off=39 header_value complete off=52 error code=10 reason="Invalid header token" ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/request/lenient-headers.md0000644000175100001710000000313600000000000023402 0ustar00runnerdockerLenient header value parsing ============================ Parsing with header value token checks off. ## Header value with lenient ```http GET /url HTTP/1.1 Header1: \f ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=7 span[header_field]="Header1" off=27 header_field complete off=28 len=1 span[header_value]="\f" off=31 header_value complete off=33 headers complete method=1 v=1/1 flags=0 content_length=0 off=33 message complete ``` ## Second request header value with lenient ```http GET /url HTTP/1.1 Header1: Okay GET /url HTTP/1.1 Header1: \f ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=7 span[header_field]="Header1" off=27 header_field complete off=28 len=4 span[header_value]="Okay" off=34 header_value complete off=36 headers complete method=1 v=1/1 flags=0 content_length=0 off=36 message complete off=38 message begin off=42 len=4 span[url]="/url" off=47 url complete off=57 len=7 span[header_field]="Header1" off=65 header_field complete off=66 len=1 span[header_value]="\f" off=69 header_value complete off=71 headers complete method=1 v=1/1 flags=0 content_length=0 off=71 message complete ``` ## Header value without lenient ```http GET /url HTTP/1.1 Header1: \f ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=7 span[header_field]="Header1" off=27 header_field complete off=28 error code=10 reason="Invalid header value char" ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/request/method.md0000644000175100001710000002157600000000000021623 0ustar00runnerdockerMethods ======= ### REPORT request ```http REPORT /test HTTP/1.1 ``` ```log off=0 message begin off=7 len=5 span[url]="/test" off=13 url complete off=25 headers complete method=20 v=1/1 flags=0 content_length=0 off=25 message complete ``` ### CONNECT request ```http CONNECT 0-home0.netscape.com:443 HTTP/1.0 User-agent: Mozilla/1.1N Proxy-authorization: basic aGVsbG86d29ybGQ= some data and yet even more data ``` ```log off=0 message begin off=8 len=24 span[url]="0-home0.netscape.com:443" off=33 url complete off=43 len=10 span[header_field]="User-agent" off=54 header_field complete off=55 len=12 span[header_value]="Mozilla/1.1N" off=69 header_value complete off=69 len=19 span[header_field]="Proxy-authorization" off=89 header_field complete off=90 len=22 span[header_value]="basic aGVsbG86d29ybGQ=" off=114 header_value complete off=116 headers complete method=5 v=1/0 flags=0 content_length=0 off=116 message complete off=116 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### CONNECT request with CAPS ```http CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0 User-agent: Mozilla/1.1N Proxy-authorization: basic aGVsbG86d29ybGQ= ``` ```log off=0 message begin off=8 len=22 span[url]="HOME0.NETSCAPE.COM:443" off=31 url complete off=41 len=10 span[header_field]="User-agent" off=52 header_field complete off=53 len=12 span[header_value]="Mozilla/1.1N" off=67 header_value complete off=67 len=19 span[header_field]="Proxy-authorization" off=87 header_field complete off=88 len=22 span[header_value]="basic aGVsbG86d29ybGQ=" off=112 header_value complete off=114 headers complete method=5 v=1/0 flags=0 content_length=0 off=114 message complete off=114 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### CONNECT with body ```http CONNECT foo.bar.com:443 HTTP/1.0 User-agent: Mozilla/1.1N Proxy-authorization: basic aGVsbG86d29ybGQ= Content-Length: 10 blarfcicle" ``` ```log off=0 message begin off=8 len=15 span[url]="foo.bar.com:443" off=24 url complete off=34 len=10 span[header_field]="User-agent" off=45 header_field complete off=46 len=12 span[header_value]="Mozilla/1.1N" off=60 header_value complete off=60 len=19 span[header_field]="Proxy-authorization" off=80 header_field complete off=81 len=22 span[header_value]="basic aGVsbG86d29ybGQ=" off=105 header_value complete off=105 len=14 span[header_field]="Content-Length" off=120 header_field complete off=121 len=2 span[header_value]="10" off=125 header_value complete off=127 headers complete method=5 v=1/0 flags=20 content_length=10 off=127 message complete off=127 error code=22 reason="Pause on CONNECT/Upgrade" ``` ### M-SEARCH request ```http M-SEARCH * HTTP/1.1 HOST: 239.255.255.250:1900 MAN: "ssdp:discover" ST: "ssdp:all" ``` ```log off=0 message begin off=9 len=1 span[url]="*" off=11 url complete off=21 len=4 span[header_field]="HOST" off=26 header_field complete off=27 len=20 span[header_value]="239.255.255.250:1900" off=49 header_value complete off=49 len=3 span[header_field]="MAN" off=53 header_field complete off=54 len=15 span[header_value]=""ssdp:discover"" off=71 header_value complete off=71 len=2 span[header_field]="ST" off=74 header_field complete off=75 len=10 span[header_value]=""ssdp:all"" off=87 header_value complete off=89 headers complete method=24 v=1/1 flags=0 content_length=0 off=89 message complete ``` ### PATCH request ```http PATCH /file.txt HTTP/1.1 Host: www.example.com Content-Type: application/example If-Match: "e0023aa4e" Content-Length: 10 cccccccccc ``` ```log off=0 message begin off=6 len=9 span[url]="/file.txt" off=16 url complete off=26 len=4 span[header_field]="Host" off=31 header_field complete off=32 len=15 span[header_value]="www.example.com" off=49 header_value complete off=49 len=12 span[header_field]="Content-Type" off=62 header_field complete off=63 len=19 span[header_value]="application/example" off=84 header_value complete off=84 len=8 span[header_field]="If-Match" off=93 header_field complete off=94 len=11 span[header_value]=""e0023aa4e"" off=107 header_value complete off=107 len=14 span[header_field]="Content-Length" off=122 header_field complete off=123 len=2 span[header_value]="10" off=127 header_value complete off=129 headers complete method=28 v=1/1 flags=20 content_length=10 off=129 len=10 span[body]="cccccccccc" off=139 message complete ``` ### PURGE request ```http PURGE /file.txt HTTP/1.1 Host: www.example.com ``` ```log off=0 message begin off=6 len=9 span[url]="/file.txt" off=16 url complete off=26 len=4 span[header_field]="Host" off=31 header_field complete off=32 len=15 span[header_value]="www.example.com" off=49 header_value complete off=51 headers complete method=29 v=1/1 flags=0 content_length=0 off=51 message complete ``` ### SEARCH request ```http SEARCH / HTTP/1.1 Host: www.example.com ``` ```log off=0 message begin off=7 len=1 span[url]="/" off=9 url complete off=19 len=4 span[header_field]="Host" off=24 header_field complete off=25 len=15 span[header_value]="www.example.com" off=42 header_value complete off=44 headers complete method=14 v=1/1 flags=0 content_length=0 off=44 message complete ``` ### LINK request ```http LINK /images/my_dog.jpg HTTP/1.1 Host: example.com Link: ; rel="tag" Link: ; rel="tag" ``` ```log off=0 message begin off=5 len=18 span[url]="/images/my_dog.jpg" off=24 url complete off=34 len=4 span[header_field]="Host" off=39 header_field complete off=40 len=11 span[header_value]="example.com" off=53 header_value complete off=53 len=4 span[header_field]="Link" off=58 header_field complete off=59 len=44 span[header_value]="; rel="tag"" off=105 header_value complete off=105 len=4 span[header_field]="Link" off=110 header_field complete off=111 len=46 span[header_value]="; rel="tag"" off=159 header_value complete off=161 headers complete method=31 v=1/1 flags=0 content_length=0 off=161 message complete ``` ### LINK request ```http UNLINK /images/my_dog.jpg HTTP/1.1 Host: example.com Link: ; rel="tag" ``` ```log off=0 message begin off=7 len=18 span[url]="/images/my_dog.jpg" off=26 url complete off=36 len=4 span[header_field]="Host" off=41 header_field complete off=42 len=11 span[header_value]="example.com" off=55 header_value complete off=55 len=4 span[header_field]="Link" off=60 header_field complete off=61 len=46 span[header_value]="; rel="tag"" off=109 header_value complete off=111 headers complete method=32 v=1/1 flags=0 content_length=0 off=111 message complete ``` ### SOURCE request ```http SOURCE /music/sweet/music HTTP/1.1 Host: example.com ``` ```log off=0 message begin off=7 len=18 span[url]="/music/sweet/music" off=26 url complete off=36 len=4 span[header_field]="Host" off=41 header_field complete off=42 len=11 span[header_value]="example.com" off=55 header_value complete off=57 headers complete method=33 v=1/1 flags=0 content_length=0 off=57 message complete ``` ### SOURCE request with ICE ```http SOURCE /music/sweet/music ICE/1.0 Host: example.com ``` ```log off=0 message begin off=7 len=18 span[url]="/music/sweet/music" off=26 url complete off=35 len=4 span[header_field]="Host" off=40 header_field complete off=41 len=11 span[header_value]="example.com" off=54 header_value complete off=56 headers complete method=33 v=1/0 flags=0 content_length=0 off=56 message complete ``` ### OPTIONS request with RTSP NOTE: `OPTIONS` is a valid HTTP metho too. ```http OPTIONS /music/sweet/music RTSP/1.0 Host: example.com ``` ```log off=0 message begin off=8 len=18 span[url]="/music/sweet/music" off=27 url complete off=37 len=4 span[header_field]="Host" off=42 header_field complete off=43 len=11 span[header_value]="example.com" off=56 header_value complete off=58 headers complete method=6 v=1/0 flags=0 content_length=0 off=58 message complete ``` ### ANNOUNCE request with RTSP ```http ANNOUNCE /music/sweet/music RTSP/1.0 Host: example.com ``` ```log off=0 message begin off=9 len=18 span[url]="/music/sweet/music" off=28 url complete off=38 len=4 span[header_field]="Host" off=43 header_field complete off=44 len=11 span[header_value]="example.com" off=57 header_value complete off=59 headers complete method=36 v=1/0 flags=0 content_length=0 off=59 message complete ``` ### PRI request HTTP2 ```http PRI * HTTP/1.1 SM ``` ```log off=0 message begin off=4 len=1 span[url]="*" off=6 url complete off=24 error code=23 reason="Pause on PRI/Upgrade" ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/request/sample.md0000644000175100001710000004035600000000000021621 0ustar00runnerdockerSample requests =============== Lots of sample requests, most ported from [http_parser][0] test suite. ## Simple request ```http OPTIONS /url HTTP/1.1 Header1: Value1 Header2:\t Value2 ``` ```log off=0 message begin off=8 len=4 span[url]="/url" off=13 url complete off=23 len=7 span[header_field]="Header1" off=31 header_field complete off=32 len=6 span[header_value]="Value1" off=40 header_value complete off=40 len=7 span[header_field]="Header2" off=48 header_field complete off=50 len=6 span[header_value]="Value2" off=58 header_value complete off=60 headers complete method=6 v=1/1 flags=0 content_length=0 off=60 message complete ``` ## Request with method starting with `H` There's a optimization in `start_req_or_res` that passes execution to `start_req` when the first character is not `H` (because response must start with `HTTP/`). However, there're still methods like `HEAD` that should get to `start_req`. Verify that it still works after optimization. ```http HEAD /url HTTP/1.1 ``` ```log off=0 message begin off=5 len=4 span[url]="/url" off=10 url complete off=22 headers complete method=2 v=1/1 flags=0 content_length=0 off=22 message complete ``` ## curl GET ```http GET /test HTTP/1.1 User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1 Host: 0.0.0.0=5000 Accept: */* ``` ```log off=0 message begin off=4 len=5 span[url]="/test" off=10 url complete off=20 len=10 span[header_field]="User-Agent" off=31 header_field complete off=32 len=85 span[header_value]="curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1" off=119 header_value complete off=119 len=4 span[header_field]="Host" off=124 header_field complete off=125 len=12 span[header_value]="0.0.0.0=5000" off=139 header_value complete off=139 len=6 span[header_field]="Accept" off=146 header_field complete off=147 len=3 span[header_value]="*/*" off=152 header_value complete off=154 headers complete method=1 v=1/1 flags=0 content_length=0 off=154 message complete ``` ## Firefox GET ```http GET /favicon.ico HTTP/1.1 Host: 0.0.0.0=5000 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive ``` ```log off=0 message begin off=4 len=12 span[url]="/favicon.ico" off=17 url complete off=27 len=4 span[header_field]="Host" off=32 header_field complete off=33 len=12 span[header_value]="0.0.0.0=5000" off=47 header_value complete off=47 len=10 span[header_field]="User-Agent" off=58 header_field complete off=59 len=76 span[header_value]="Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0" off=137 header_value complete off=137 len=6 span[header_field]="Accept" off=144 header_field complete off=145 len=63 span[header_value]="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" off=210 header_value complete off=210 len=15 span[header_field]="Accept-Language" off=226 header_field complete off=227 len=14 span[header_value]="en-us,en;q=0.5" off=243 header_value complete off=243 len=15 span[header_field]="Accept-Encoding" off=259 header_field complete off=260 len=12 span[header_value]="gzip,deflate" off=274 header_value complete off=274 len=14 span[header_field]="Accept-Charset" off=289 header_field complete off=290 len=30 span[header_value]="ISO-8859-1,utf-8;q=0.7,*;q=0.7" off=322 header_value complete off=322 len=10 span[header_field]="Keep-Alive" off=333 header_field complete off=334 len=3 span[header_value]="300" off=339 header_value complete off=339 len=10 span[header_field]="Connection" off=350 header_field complete off=351 len=10 span[header_value]="keep-alive" off=363 header_value complete off=365 headers complete method=1 v=1/1 flags=1 content_length=0 off=365 message complete ``` ## DUMBPACK ```http GET /dumbpack HTTP/1.1 aaaaaaaaaaaaa:++++++++++ ``` ```log off=0 message begin off=4 len=9 span[url]="/dumbpack" off=14 url complete off=24 len=13 span[header_field]="aaaaaaaaaaaaa" off=38 header_field complete off=38 len=10 span[header_value]="++++++++++" off=50 header_value complete off=52 headers complete method=1 v=1/1 flags=0 content_length=0 off=52 message complete ``` ## No headers and no body ```http GET /get_no_headers_no_body/world HTTP/1.1 ``` ```log off=0 message begin off=4 len=29 span[url]="/get_no_headers_no_body/world" off=34 url complete off=46 headers complete method=1 v=1/1 flags=0 content_length=0 off=46 message complete ``` ## One header and no body ```http GET /get_one_header_no_body HTTP/1.1 Accept: */* ``` ```log off=0 message begin off=4 len=23 span[url]="/get_one_header_no_body" off=28 url complete off=38 len=6 span[header_field]="Accept" off=45 header_field complete off=46 len=3 span[header_value]="*/*" off=51 header_value complete off=53 headers complete method=1 v=1/1 flags=0 content_length=0 off=53 message complete ``` ## Apache bench GET The server receiving this request SHOULD NOT wait for EOF to know that `Content-Length == 0`. ```http GET /test HTTP/1.0 Host: 0.0.0.0:5000 User-Agent: ApacheBench/2.3 Accept: */* ``` ```log off=0 message begin off=4 len=5 span[url]="/test" off=10 url complete off=20 len=4 span[header_field]="Host" off=25 header_field complete off=26 len=12 span[header_value]="0.0.0.0:5000" off=40 header_value complete off=40 len=10 span[header_field]="User-Agent" off=51 header_field complete off=52 len=15 span[header_value]="ApacheBench/2.3" off=69 header_value complete off=69 len=6 span[header_field]="Accept" off=76 header_field complete off=77 len=3 span[header_value]="*/*" off=82 header_value complete off=84 headers complete method=1 v=1/0 flags=0 content_length=0 off=84 message complete ``` ## Prefix newline Some clients, especially after a POST in a keep-alive connection, will send an extra CRLF before the next request. ```http \r\nGET /test HTTP/1.1 ``` ```log off=2 message begin off=6 len=5 span[url]="/test" off=12 url complete off=24 headers complete method=1 v=1/1 flags=0 content_length=0 off=24 message complete ``` ## No HTTP version ```http GET / ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=7 url complete off=9 headers complete method=1 v=0/9 flags=0 content_length=0 off=9 message complete ``` ## Line folding in header value with CRLF ```http GET / HTTP/1.1 Line1: abc \tdef ghi \t\tjkl mno \t \tqrs Line2: \t line2\t Line3: line3 Line4: Connection: close ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=16 len=5 span[header_field]="Line1" off=22 header_field complete off=25 len=3 span[header_value]="abc" off=30 len=4 span[header_value]="\tdef" off=36 len=4 span[header_value]=" ghi" off=42 len=5 span[header_value]="\t\tjkl" off=49 len=6 span[header_value]=" mno " off=57 len=6 span[header_value]="\t \tqrs" off=65 header_value complete off=65 len=5 span[header_field]="Line2" off=71 header_field complete off=74 len=6 span[header_value]="line2\t" off=82 header_value complete off=82 len=5 span[header_field]="Line3" off=88 header_field complete off=91 len=5 span[header_value]="line3" off=98 header_value complete off=98 len=5 span[header_field]="Line4" off=104 header_field complete off=110 len=0 span[header_value]="" off=110 header_value complete off=110 len=10 span[header_field]="Connection" off=121 header_field complete off=124 len=5 span[header_value]="close" off=131 header_value complete off=133 headers complete method=1 v=1/1 flags=2 content_length=0 off=133 message complete ``` ## Line folding in header value with LF ```http GET / HTTP/1.1\n\ Line1: abc\n\ \tdef\n\ ghi\n\ \t\tjkl\n\ mno \n\ \t \tqrs\n\ Line2: \t line2\t\n\ Line3:\n\ line3\n\ Line4: \n\ \n\ Connection:\n\ close\n\ \n ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=15 len=5 span[header_field]="Line1" off=21 header_field complete off=24 len=3 span[header_value]="abc" off=28 len=4 span[header_value]="\tdef" off=33 len=4 span[header_value]=" ghi" off=38 len=5 span[header_value]="\t\tjkl" off=44 len=6 span[header_value]=" mno " off=51 len=6 span[header_value]="\t \tqrs" off=58 header_value complete off=58 len=5 span[header_field]="Line2" off=64 header_field complete off=67 len=6 span[header_value]="line2\t" off=74 header_value complete off=74 len=5 span[header_field]="Line3" off=80 header_field complete off=82 len=5 span[header_value]="line3" off=88 header_value complete off=88 len=5 span[header_field]="Line4" off=94 header_field complete off=98 len=0 span[header_value]="" off=98 header_value complete off=98 len=10 span[header_field]="Connection" off=109 header_field complete off=111 len=5 span[header_value]="close" off=117 header_value complete off=118 headers complete method=1 v=1/1 flags=2 content_length=0 off=118 message complete ``` ## Request starting with CRLF ```http \r\nGET /url HTTP/1.1 Header1: Value1 ``` ```log off=2 message begin off=6 len=4 span[url]="/url" off=11 url complete off=21 len=7 span[header_field]="Header1" off=29 header_field complete off=30 len=6 span[header_value]="Value1" off=38 header_value complete off=40 headers complete method=1 v=1/1 flags=0 content_length=0 off=40 message complete ``` ## Extended Characters See nodejs/test/parallel/test-http-headers-obstext.js ```http GET / HTTP/1.1 Test: Düsseldorf ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=16 len=4 span[header_field]="Test" off=21 header_field complete off=22 len=11 span[header_value]="Düsseldorf" off=35 header_value complete off=37 headers complete method=1 v=1/1 flags=0 content_length=0 off=37 message complete ``` ## 255 ASCII in header value Note: `Buffer.from([ 0xff ]).toString('latin1') === 'ÿ'`. ```http OPTIONS /url HTTP/1.1 Header1: Value1 Header2: \xffValue2 ``` ```log off=0 message begin off=8 len=4 span[url]="/url" off=13 url complete off=23 len=7 span[header_field]="Header1" off=31 header_field complete off=32 len=6 span[header_value]="Value1" off=40 header_value complete off=40 len=7 span[header_field]="Header2" off=48 header_field complete off=49 len=8 span[header_value]="ÿValue2" off=59 header_value complete off=61 headers complete method=6 v=1/1 flags=0 content_length=0 off=61 message complete ``` ## X-SSL-Nonsense See nodejs/test/parallel/test-http-headers-obstext.js ```http GET / HTTP/1.1 X-SSL-Nonsense: -----BEGIN CERTIFICATE----- \tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx \tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT \tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu \tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV \tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV \tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB \tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF \tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR \tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL \t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP \tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR \twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG \tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgHTTPAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs \tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD \tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj \tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj \taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG \t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE \tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO \tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1 \tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0 \tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD \tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv \tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3 \tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8 \tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk \thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK \twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu \tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3 \tRA== \t-----END CERTIFICATE----- ``` ```log off=0 message begin off=4 len=1 span[url]="/" off=6 url complete off=16 len=14 span[header_field]="X-SSL-Nonsense" off=31 header_field complete off=34 len=27 span[header_value]="-----BEGIN CERTIFICATE-----" off=63 len=65 span[header_value]="\tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx" off=130 len=65 span[header_value]="\tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT" off=197 len=65 span[header_value]="\tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu" off=264 len=65 span[header_value]="\tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV" off=331 len=65 span[header_value]="\tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV" off=398 len=65 span[header_value]="\tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB" off=465 len=65 span[header_value]="\tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF" off=532 len=65 span[header_value]="\tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR" off=599 len=65 span[header_value]="\tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL" off=666 len=65 span[header_value]="\t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP" off=733 len=65 span[header_value]="\tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR" off=800 len=65 span[header_value]="\twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG" off=867 len=66 span[header_value]="\tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgHTTPAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs" off=935 len=65 span[header_value]="\tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD" off=1002 len=65 span[header_value]="\tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj" off=1069 len=65 span[header_value]="\tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj" off=1136 len=65 span[header_value]="\taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG" off=1203 len=65 span[header_value]="\t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE" off=1270 len=65 span[header_value]="\tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO" off=1337 len=65 span[header_value]="\tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1" off=1404 len=75 span[header_value]="\tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0" off=1481 len=65 span[header_value]="\tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD" off=1548 len=55 span[header_value]="\tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv" off=1605 len=65 span[header_value]="\tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3" off=1672 len=65 span[header_value]="\tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8" off=1739 len=65 span[header_value]="\tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk" off=1806 len=65 span[header_value]="\thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK" off=1873 len=65 span[header_value]="\twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu" off=1940 len=65 span[header_value]="\tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3" off=2007 len=5 span[header_value]="\tRA==" off=2014 len=26 span[header_value]="\t-----END CERTIFICATE-----" off=2042 header_value complete off=2044 headers complete method=1 v=1/1 flags=0 content_length=0 off=2044 message complete ``` [0]: https://github.com/nodejs/http-parser ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/request/transfer-encoding.md0000644000175100001710000002747000000000000023752 0ustar00runnerdockerTransfer-Encoding header ======================== ## `chunked` ### Parsing and setting flag ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 ``` ### Parse chunks with lowercase size ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked a 0123456789 0 ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 off=52 chunk header len=10 off=52 len=10 span[body]="0123456789" off=64 chunk complete off=67 chunk header len=0 off=69 chunk complete off=69 message complete ``` ### Parse chunks with uppercase size ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked A 0123456789 0 ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 off=52 chunk header len=10 off=52 len=10 span[body]="0123456789" off=64 chunk complete off=67 chunk header len=0 off=69 chunk complete off=69 message complete ``` ### POST with `Transfer-Encoding: chunked` ```http POST /post_chunked_all_your_base HTTP/1.1 Transfer-Encoding: chunked 1e all your base are belong to us 0 ``` ```log off=0 message begin off=5 len=27 span[url]="/post_chunked_all_your_base" off=33 url complete off=43 len=17 span[header_field]="Transfer-Encoding" off=61 header_field complete off=62 len=7 span[header_value]="chunked" off=71 header_value complete off=73 headers complete method=3 v=1/1 flags=208 content_length=0 off=77 chunk header len=30 off=77 len=30 span[body]="all your base are belong to us" off=109 chunk complete off=112 chunk header len=0 off=114 chunk complete off=114 message complete ``` ### Two chunks and triple zero prefixed end chunk ```http POST /two_chunks_mult_zero_end HTTP/1.1 Transfer-Encoding: chunked 5 hello 6 world 000 ``` ```log off=0 message begin off=5 len=25 span[url]="/two_chunks_mult_zero_end" off=31 url complete off=41 len=17 span[header_field]="Transfer-Encoding" off=59 header_field complete off=60 len=7 span[header_value]="chunked" off=69 header_value complete off=71 headers complete method=3 v=1/1 flags=208 content_length=0 off=74 chunk header len=5 off=74 len=5 span[body]="hello" off=81 chunk complete off=84 chunk header len=6 off=84 len=6 span[body]=" world" off=92 chunk complete off=97 chunk header len=0 off=99 chunk complete off=99 message complete ``` ### Trailing headers ```http POST /chunked_w_trailing_headers HTTP/1.1 Transfer-Encoding: chunked 5 hello 6 world 0 Vary: * Content-Type: text/plain ``` ```log off=0 message begin off=5 len=27 span[url]="/chunked_w_trailing_headers" off=33 url complete off=43 len=17 span[header_field]="Transfer-Encoding" off=61 header_field complete off=62 len=7 span[header_value]="chunked" off=71 header_value complete off=73 headers complete method=3 v=1/1 flags=208 content_length=0 off=76 chunk header len=5 off=76 len=5 span[body]="hello" off=83 chunk complete off=86 chunk header len=6 off=86 len=6 span[body]=" world" off=94 chunk complete off=97 chunk header len=0 off=97 len=4 span[header_field]="Vary" off=102 header_field complete off=103 len=1 span[header_value]="*" off=106 header_value complete off=106 len=12 span[header_field]="Content-Type" off=119 header_field complete off=120 len=10 span[header_value]="text/plain" off=132 header_value complete off=134 chunk complete off=134 message complete ``` ### Parameters after chunk length ```http POST /chunked_w_unicorns_after_length HTTP/1.1 Transfer-Encoding: chunked 5; ilovew3;somuchlove=aretheseparametersfor hello 6; blahblah; blah world 0 ``` ```log off=0 message begin off=5 len=32 span[url]="/chunked_w_unicorns_after_length" off=38 url complete off=48 len=17 span[header_field]="Transfer-Encoding" off=66 header_field complete off=67 len=7 span[header_value]="chunked" off=76 header_value complete off=78 headers complete method=3 v=1/1 flags=208 content_length=0 off=123 chunk header len=5 off=123 len=5 span[body]="hello" off=130 chunk complete off=149 chunk header len=6 off=149 len=6 span[body]=" world" off=157 chunk complete off=160 chunk header len=0 ``` ## Ignoring `pigeons` Requests cannot have invalid `Transfer-Encoding`. It is impossible to determine their body size. Not erroring would make HTTP smuggling attacks possible. ```http PUT /url HTTP/1.1 Transfer-Encoding: pigeons ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="pigeons" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=200 content_length=0 off=49 error code=15 reason="Request has invalid `Transfer-Encoding`" ``` ## POST with `Transfer-Encoding` and `Content-Length` ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: identity Content-Length: 5 World ``` ```log off=0 message begin off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=8 span[header_value]="identity" off=96 header_value complete off=96 len=14 span[header_field]="Content-Length" off=111 header_field complete off=112 len=1 span[header_value]="5" off=115 header_value complete off=117 error code=4 reason="Content-Length can't be present with Transfer-Encoding" ``` ## POST with `Transfer-Encoding` and `Content-Length` (lenient) TODO(indutny): should we allow it even in lenient mode? (Consider disabling this). NOTE: `Content-Length` is ignored when `Transfer-Encoding` is present. Messages (in lenient mode) are read until EOF. ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: identity Content-Length: 1 World ``` ```log off=0 message begin off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=8 span[header_value]="identity" off=96 header_value complete off=96 len=14 span[header_field]="Content-Length" off=111 header_field complete off=112 len=1 span[header_value]="1" off=115 header_value complete off=117 headers complete method=3 v=1/1 flags=220 content_length=1 off=117 len=5 span[body]="World" ``` ## POST with `chunked` before other transfer coding names ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: chunked, deflate World ``` ```log off=0 message begin off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=16 span[header_value]="chunked, deflate" off=104 header_value complete off=106 headers complete method=3 v=1/1 flags=200 content_length=0 off=106 error code=15 reason="Request has invalid `Transfer-Encoding`" ``` ## POST with `chunked` and duplicate transfer-encoding ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: chunked Transfer-Encoding: deflate World ``` ```log off=0 message begin off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=7 span[header_value]="chunked" off=95 header_value complete off=95 len=17 span[header_field]="Transfer-Encoding" off=113 header_field complete off=114 len=7 span[header_value]="deflate" off=123 header_value complete off=125 headers complete method=3 v=1/1 flags=200 content_length=0 off=125 error code=15 reason="Request has invalid `Transfer-Encoding`" ``` ## POST with `chunked` before other transfer-coding (lenient) TODO(indutny): should we allow it even in lenient mode? (Consider disabling this). ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: chunked, deflate World ``` ```log off=0 message begin off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=16 span[header_value]="chunked, deflate" off=104 header_value complete off=106 headers complete method=3 v=1/1 flags=200 content_length=0 off=106 len=5 span[body]="World" ``` ## POST with `chunked` as last transfer-coding ```http POST /post_identity_body_world?q=search#hey HTTP/1.1 Accept: */* Transfer-Encoding: deflate, chunked 5 World 0 ``` ```log off=0 message begin off=5 len=38 span[url]="/post_identity_body_world?q=search#hey" off=44 url complete off=54 len=6 span[header_field]="Accept" off=61 header_field complete off=62 len=3 span[header_value]="*/*" off=67 header_value complete off=67 len=17 span[header_field]="Transfer-Encoding" off=85 header_field complete off=86 len=16 span[header_value]="deflate, chunked" off=104 header_value complete off=106 headers complete method=3 v=1/1 flags=208 content_length=0 off=109 chunk header len=5 off=109 len=5 span[body]="World" off=116 chunk complete off=119 chunk header len=0 off=121 chunk complete off=121 message complete ``` ## Missing last-chunk ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked 3 foo ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 off=52 chunk header len=3 off=52 len=3 span[body]="foo" off=57 chunk complete off=57 error code=12 reason="Invalid character in chunk size" ``` ## Validate chunk parameters ```http PUT /url HTTP/1.1 Transfer-Encoding: chunked 3 \n \r\n\ foo ``` ```log off=0 message begin off=4 len=4 span[url]="/url" off=9 url complete off=19 len=17 span[header_field]="Transfer-Encoding" off=37 header_field complete off=38 len=7 span[header_value]="chunked" off=47 header_value complete off=49 headers complete method=4 v=1/1 flags=208 content_length=0 off=51 error code=2 reason="Invalid character in chunk parameters" ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/request/uri.md0000644000175100001710000001067400000000000021137 0ustar00runnerdockerURI === ## Quotes in URI ```http GET /with_"lovely"_quotes?foo=\"bar\" HTTP/1.1 ``` ```log off=0 message begin off=4 len=33 span[url]="/with_"lovely"_quotes?foo=\"bar\"" off=38 url complete off=50 headers complete method=1 v=1/1 flags=0 content_length=0 off=50 message complete ``` ## Query URL with question mark Some clients include `?` characters in query strings. ```http GET /test.cgi?foo=bar?baz HTTP/1.1 ``` ```log off=0 message begin off=4 len=21 span[url]="/test.cgi?foo=bar?baz" off=26 url complete off=38 headers complete method=1 v=1/1 flags=0 content_length=0 off=38 message complete ``` ## Host terminated by a query string ```http GET http://hypnotoad.org?hail=all HTTP/1.1\r\n ``` ```log off=0 message begin off=4 len=29 span[url]="http://hypnotoad.org?hail=all" off=34 url complete off=46 headers complete method=1 v=1/1 flags=0 content_length=0 off=46 message complete ``` ## `host:port` terminated by a query string ```http GET http://hypnotoad.org:1234?hail=all HTTP/1.1 ``` ```log off=0 message begin off=4 len=34 span[url]="http://hypnotoad.org:1234?hail=all" off=39 url complete off=51 headers complete method=1 v=1/1 flags=0 content_length=0 off=51 message complete ``` ## Query URL with vertical bar character It should be allowed to have vertical bar symbol in URI: `|`. See: https://github.com/nodejs/node/issues/27584 ```http GET /test.cgi?query=| HTTP/1.1 ``` ```log off=0 message begin off=4 len=17 span[url]="/test.cgi?query=|" off=22 url complete off=34 headers complete method=1 v=1/1 flags=0 content_length=0 off=34 message complete ``` ## `host:port` terminated by a space ```http GET http://hypnotoad.org:1234 HTTP/1.1 ``` ```log off=0 message begin off=4 len=25 span[url]="http://hypnotoad.org:1234" off=30 url complete off=42 headers complete method=1 v=1/1 flags=0 content_length=0 off=42 message complete ``` ## UTF-8 in URI path in loose mode ```http GET /δ¶/δt/космос/pope?q=1#narf HTTP/1.1 Host: github.com ``` ```log off=0 message begin off=4 len=36 span[url]="/δ¶/δt/космос/pope?q=1#narf" off=41 url complete off=51 len=4 span[header_field]="Host" off=56 header_field complete off=57 len=10 span[header_value]="github.com" off=69 header_value complete off=71 headers complete method=1 v=1/1 flags=0 content_length=0 off=71 message complete ``` ## Disallow UTF-8 in URI path in strict mode ```http GET /δ¶/δt/pope?q=1#narf HTTP/1.1 Host: github.com ``` ```log off=0 message begin off=5 error code=7 reason="Invalid char in url path" ``` ## Fragment in URI ```http GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1 ``` ```log off=0 message begin off=4 len=40 span[url]="/forums/1/topics/2375?page=1#posts-17408" off=45 url complete off=57 headers complete method=1 v=1/1 flags=0 content_length=0 off=57 message complete ``` ## Underscore in hostname ```http CONNECT home_0.netscape.com:443 HTTP/1.0 User-agent: Mozilla/1.1N Proxy-authorization: basic aGVsbG86d29ybGQ= ``` ```log off=0 message begin off=8 len=23 span[url]="home_0.netscape.com:443" off=32 url complete off=42 len=10 span[header_field]="User-agent" off=53 header_field complete off=54 len=12 span[header_value]="Mozilla/1.1N" off=68 header_value complete off=68 len=19 span[header_field]="Proxy-authorization" off=88 header_field complete off=89 len=22 span[header_value]="basic aGVsbG86d29ybGQ=" off=113 header_value complete off=115 headers complete method=5 v=1/0 flags=0 content_length=0 off=115 message complete off=115 error code=22 reason="Pause on CONNECT/Upgrade" ``` ## `host:port` and basic auth ```http GET http://a%12:b!&*$@hypnotoad.org:1234/toto HTTP/1.1 ``` ```log off=0 message begin off=4 len=41 span[url]="http://a%12:b!&*$@hypnotoad.org:1234/toto" off=46 url complete off=58 headers complete method=1 v=1/1 flags=0 content_length=0 off=58 message complete ``` ## Space in URI ```http GET /foo bar/ HTTP/1.1 ``` ```log off=0 message begin off=4 len=4 span[url]="/foo" off=9 url complete off=9 error code=8 reason="Expected HTTP/" ``` ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1636920323.0784526 aiohttp-3.8.1/vendor/llhttp/test/response/0000755000175100001710000000000000000000000020154 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/response/connection.md0000644000175100001710000002606700000000000022650 0ustar00runnerdockerConnection header ================= ## Proxy-Connection ```http HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Length: 11 Proxy-Connection: close Date: Thu, 31 Dec 2009 20:55:48 +0000 hello world ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=12 span[header_field]="Content-Type" off=30 header_field complete off=31 len=24 span[header_value]="text/html; charset=UTF-8" off=57 header_value complete off=57 len=14 span[header_field]="Content-Length" off=72 header_field complete off=73 len=2 span[header_value]="11" off=77 header_value complete off=77 len=16 span[header_field]="Proxy-Connection" off=94 header_field complete off=95 len=5 span[header_value]="close" off=102 header_value complete off=102 len=4 span[header_field]="Date" off=107 header_field complete off=108 len=31 span[header_value]="Thu, 31 Dec 2009 20:55:48 +0000" off=141 header_value complete off=143 headers complete status=200 v=1/1 flags=22 content_length=11 off=143 len=11 span[body]="hello world" off=154 message complete ``` ## HTTP/1.0 with keep-alive and EOF-terminated 200 status There is no `Content-Length` in this response, so even though the `keep-alive` is on - it should read until EOF. ```http HTTP/1.0 200 OK Connection: keep-alive HTTP/1.0 200 OK ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=10 span[header_field]="Connection" off=28 header_field complete off=29 len=10 span[header_value]="keep-alive" off=41 header_value complete off=43 headers complete status=200 v=1/0 flags=1 content_length=0 off=43 len=15 span[body]="HTTP/1.0 200 OK" ``` ## HTTP/1.0 with keep-alive and 204 status Responses with `204` status cannot have a body. ```http HTTP/1.0 204 No content Connection: keep-alive HTTP/1.0 200 OK ``` ```log off=0 message begin off=13 len=10 span[status]="No content" off=25 status complete off=25 len=10 span[header_field]="Connection" off=36 header_field complete off=37 len=10 span[header_value]="keep-alive" off=49 header_value complete off=51 headers complete status=204 v=1/0 flags=1 content_length=0 off=51 message complete off=51 message begin off=64 len=2 span[status]="OK" ``` ## HTTP/1.1 with EOF-terminated 200 status There is no `Content-Length` in this response, so even though the `keep-alive` is on (implicitly in HTTP 1.1) - it should read until EOF. ```http HTTP/1.1 200 OK HTTP/1.1 200 OK ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=19 headers complete status=200 v=1/1 flags=0 content_length=0 off=19 len=15 span[body]="HTTP/1.1 200 OK" ``` ## HTTP/1.1 with 204 status Responses with `204` status cannot have a body. ```http HTTP/1.1 204 No content HTTP/1.1 200 OK ``` ```log off=0 message begin off=13 len=10 span[status]="No content" off=25 status complete off=27 headers complete status=204 v=1/1 flags=0 content_length=0 off=27 message complete off=27 message begin off=40 len=2 span[status]="OK" ``` ## HTTP/1.1 with keep-alive disabled and 204 status in strict mode ```http HTTP/1.1 204 No content Connection: close HTTP/1.1 200 OK ``` ```log off=0 message begin off=13 len=10 span[status]="No content" off=25 status complete off=25 len=10 span[header_field]="Connection" off=36 header_field complete off=37 len=5 span[header_value]="close" off=44 header_value complete off=46 headers complete status=204 v=1/1 flags=2 content_length=0 off=46 message complete off=47 error code=5 reason="Data after `Connection: close`" ``` ## HTTP/1.1 with keep-alive disabled, content-length, and in loose mode Parser should discard extra request in loose mode. ```http HTTP/1.1 200 No content Content-Length: 5 Connection: close 2ad731e3-4dcd-4f70-b871-0ad284b29ffc ``` ```log off=0 message begin off=13 len=10 span[status]="No content" off=25 status complete off=25 len=14 span[header_field]="Content-Length" off=40 header_field complete off=41 len=1 span[header_value]="5" off=44 header_value complete off=44 len=10 span[header_field]="Connection" off=55 header_field complete off=56 len=5 span[header_value]="close" off=63 header_value complete off=65 headers complete status=200 v=1/1 flags=22 content_length=5 off=65 len=5 span[body]="2ad73" off=70 message complete ``` ## HTTP/1.1 with keep-alive disabled, content-length, and in strict mode Parser should discard extra request in strict mode. ```http HTTP/1.1 200 No content Content-Length: 5 Connection: close 2ad731e3-4dcd-4f70-b871-0ad284b29ffc ``` ```log off=0 message begin off=13 len=10 span[status]="No content" off=25 status complete off=25 len=14 span[header_field]="Content-Length" off=40 header_field complete off=41 len=1 span[header_value]="5" off=44 header_value complete off=44 len=10 span[header_field]="Connection" off=55 header_field complete off=56 len=5 span[header_value]="close" off=63 header_value complete off=65 headers complete status=200 v=1/1 flags=22 content_length=5 off=65 len=5 span[body]="2ad73" off=70 message complete off=71 error code=5 reason="Data after `Connection: close`" ``` ## HTTP/1.1 with keep-alive disabled, content-length, and in lenient mode Parser should process extra request in lenient mode. ```http HTTP/1.1 200 No content Content-Length: 5 Connection: close 2ad73HTTP/1.1 200 OK ``` ```log off=0 message begin off=13 len=10 span[status]="No content" off=25 status complete off=25 len=14 span[header_field]="Content-Length" off=40 header_field complete off=41 len=1 span[header_value]="5" off=44 header_value complete off=44 len=10 span[header_field]="Connection" off=55 header_field complete off=56 len=5 span[header_value]="close" off=63 header_value complete off=65 headers complete status=200 v=1/1 flags=22 content_length=5 off=65 len=5 span[body]="2ad73" off=70 message complete off=70 message begin off=83 len=2 span[status]="OK" ``` ## HTTP/1.1 with keep-alive disabled and 204 status in lenient mode ```http HTTP/1.1 204 No content Connection: close HTTP/1.1 200 OK ``` ```log off=0 message begin off=13 len=10 span[status]="No content" off=25 status complete off=25 len=10 span[header_field]="Connection" off=36 header_field complete off=37 len=5 span[header_value]="close" off=44 header_value complete off=46 headers complete status=204 v=1/1 flags=2 content_length=0 off=46 message complete off=46 message begin off=59 len=2 span[status]="OK" ``` ## HTTP 101 response with Upgrade and Content-Length header ```http HTTP/1.1 101 Switching Protocols Connection: upgrade Upgrade: h2c Content-Length: 4 body\ proto ``` ```log off=0 message begin off=13 len=19 span[status]="Switching Protocols" off=34 status complete off=34 len=10 span[header_field]="Connection" off=45 header_field complete off=46 len=7 span[header_value]="upgrade" off=55 header_value complete off=55 len=7 span[header_field]="Upgrade" off=63 header_field complete off=64 len=3 span[header_value]="h2c" off=69 header_value complete off=69 len=14 span[header_field]="Content-Length" off=84 header_field complete off=85 len=1 span[header_value]="4" off=88 header_value complete off=90 headers complete status=101 v=1/1 flags=34 content_length=4 off=90 len=4 span[body]="body" off=94 message complete off=94 error code=22 reason="Pause on CONNECT/Upgrade" ``` ## HTTP 101 response with Upgrade and Transfer-Encoding header ```http HTTP/1.1 101 Switching Protocols Connection: upgrade Upgrade: h2c Transfer-Encoding: chunked 2 bo 2 dy 0 proto ``` ```log off=0 message begin off=13 len=19 span[status]="Switching Protocols" off=34 status complete off=34 len=10 span[header_field]="Connection" off=45 header_field complete off=46 len=7 span[header_value]="upgrade" off=55 header_value complete off=55 len=7 span[header_field]="Upgrade" off=63 header_field complete off=64 len=3 span[header_value]="h2c" off=69 header_value complete off=69 len=17 span[header_field]="Transfer-Encoding" off=87 header_field complete off=88 len=7 span[header_value]="chunked" off=97 header_value complete off=99 headers complete status=101 v=1/1 flags=21c content_length=0 off=102 chunk header len=2 off=102 len=2 span[body]="bo" off=106 chunk complete off=109 chunk header len=2 off=109 len=2 span[body]="dy" off=113 chunk complete off=116 chunk header len=0 off=118 chunk complete off=118 message complete off=118 error code=22 reason="Pause on CONNECT/Upgrade" ``` ## HTTP 200 response with Upgrade header ```http HTTP/1.1 200 OK Connection: upgrade Upgrade: h2c body ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=10 span[header_field]="Connection" off=28 header_field complete off=29 len=7 span[header_value]="upgrade" off=38 header_value complete off=38 len=7 span[header_field]="Upgrade" off=46 header_field complete off=47 len=3 span[header_value]="h2c" off=52 header_value complete off=54 headers complete status=200 v=1/1 flags=14 content_length=0 off=54 len=4 span[body]="body" ``` ## HTTP 200 response with Upgrade header and Content-Length ```http HTTP/1.1 200 OK Connection: upgrade Upgrade: h2c Content-Length: 4 body ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=10 span[header_field]="Connection" off=28 header_field complete off=29 len=7 span[header_value]="upgrade" off=38 header_value complete off=38 len=7 span[header_field]="Upgrade" off=46 header_field complete off=47 len=3 span[header_value]="h2c" off=52 header_value complete off=52 len=14 span[header_field]="Content-Length" off=67 header_field complete off=68 len=1 span[header_value]="4" off=71 header_value complete off=73 headers complete status=200 v=1/1 flags=34 content_length=4 off=73 len=4 span[body]="body" off=77 message complete ``` ## HTTP 200 response with Upgrade header and Transfer-Encoding ```http HTTP/1.1 200 OK Connection: upgrade Upgrade: h2c Transfer-Encoding: chunked 2 bo 2 dy 0 ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=10 span[header_field]="Connection" off=28 header_field complete off=29 len=7 span[header_value]="upgrade" off=38 header_value complete off=38 len=7 span[header_field]="Upgrade" off=46 header_field complete off=47 len=3 span[header_value]="h2c" off=52 header_value complete off=52 len=17 span[header_field]="Transfer-Encoding" off=70 header_field complete off=71 len=7 span[header_value]="chunked" off=80 header_value complete off=82 headers complete status=200 v=1/1 flags=21c content_length=0 off=85 chunk header len=2 off=85 len=2 span[body]="bo" off=89 chunk complete off=92 chunk header len=2 off=92 len=2 span[body]="dy" off=96 chunk complete off=99 chunk header len=0 off=101 chunk complete off=101 message complete ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/response/content-length.md0000644000175100001710000000651200000000000023433 0ustar00runnerdockerContent-Length header ===================== ## Response without `Content-Length`, but with body The client should wait for the server's EOF. That is, when `Content-Length` is not specified, and `Connection: close`, the end of body is specified by the EOF. _(Compare with APACHEBENCH_GET)_ ```http HTTP/1.1 200 OK Date: Tue, 04 Aug 2009 07:59:32 GMT Server: Apache X-Powered-By: Servlet/2.5 JSP/2.1 Content-Type: text/xml; charset=utf-8 Connection: close \n\ \n\ \n\ \n\ SOAP-ENV:Client\n\ Client Error\n\ \n\ \n\ ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=4 span[header_field]="Date" off=22 header_field complete off=23 len=29 span[header_value]="Tue, 04 Aug 2009 07:59:32 GMT" off=54 header_value complete off=54 len=6 span[header_field]="Server" off=61 header_field complete off=62 len=6 span[header_value]="Apache" off=70 header_value complete off=70 len=12 span[header_field]="X-Powered-By" off=83 header_field complete off=84 len=19 span[header_value]="Servlet/2.5 JSP/2.1" off=105 header_value complete off=105 len=12 span[header_field]="Content-Type" off=118 header_field complete off=119 len=23 span[header_value]="text/xml; charset=utf-8" off=144 header_value complete off=144 len=10 span[header_field]="Connection" off=155 header_field complete off=156 len=5 span[header_value]="close" off=163 header_value complete off=165 headers complete status=200 v=1/1 flags=2 content_length=0 off=165 len=42 span[body]="" off=207 len=1 span[body]=lf off=208 len=80 span[body]="" off=288 len=1 span[body]=lf off=289 len=17 span[body]=" " off=306 len=1 span[body]=lf off=307 len=20 span[body]=" " off=327 len=1 span[body]=lf off=328 len=45 span[body]=" SOAP-ENV:Client" off=373 len=1 span[body]=lf off=374 len=46 span[body]=" Client Error" off=420 len=1 span[body]=lf off=421 len=21 span[body]=" " off=442 len=1 span[body]=lf off=443 len=18 span[body]=" " off=461 len=1 span[body]=lf off=462 len=20 span[body]="" ``` ## Content-Length-X The header that starts with `Content-Length*` should not be treated as `Content-Length`. ```http HTTP/1.1 200 OK Content-Length-X: 0 Transfer-Encoding: chunked 2 OK 0 ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=16 span[header_field]="Content-Length-X" off=34 header_field complete off=35 len=1 span[header_value]="0" off=38 header_value complete off=38 len=17 span[header_field]="Transfer-Encoding" off=56 header_field complete off=57 len=7 span[header_value]="chunked" off=66 header_value complete off=68 headers complete status=200 v=1/1 flags=208 content_length=0 off=71 chunk header len=2 off=71 len=2 span[body]="OK" off=75 chunk complete off=78 chunk header len=0 off=80 chunk complete off=80 message complete ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/response/finish.md0000644000175100001710000000061700000000000021762 0ustar00runnerdockerFinish ====== Those tests check the return codes and the behavior of `llhttp_finish()` C API. ## It should be safe to finish with cb after empty response ```http HTTP/1.1 200 OK ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=19 headers complete status=200 v=1/1 flags=0 content_length=0 off=NULL finish=1 ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/response/invalid.md0000644000175100001710000000304400000000000022125 0ustar00runnerdockerInvalid responses ================= ### Incomplete HTTP protocol *TODO(indutny): test `req_or_res` mode too* ```http HTP/1.1 200 OK ``` ```log off=0 message begin off=2 error code=8 reason="Expected HTTP/" ``` ### Extra digit in HTTP major version ```http HTTP/01.1 200 OK ``` ```log off=0 message begin off=6 error code=9 reason="Expected dot" ``` ### Extra digit in HTTP major version #2 ```http HTTP/11.1 200 OK ``` ```log off=0 message begin off=6 error code=9 reason="Expected dot" ``` ### Extra digit in HTTP minor version ```http HTTP/1.01 200 OK ``` ```log off=0 message begin off=8 error code=9 reason="Expected space after version" ``` ### Tab after HTTP version ```http HTTP/1.1\t200 OK ``` ```log off=0 message begin off=8 error code=9 reason="Expected space after version" ``` ### CR before response and tab after HTTP version ```http \rHTTP/1.1\t200 OK ``` ```log off=1 message begin off=9 error code=9 reason="Expected space after version" ``` ### Headers separated by CR ```http HTTP/1.1 200 OK Foo: 1\rBar: 2 ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=3 span[header_field]="Foo" off=21 header_field complete off=22 len=1 span[header_value]="1" off=24 error code=3 reason="Missing expected LF after header value" ``` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1636920301.0 aiohttp-3.8.1/vendor/llhttp/test/response/sample.md0000644000175100001710000004463600000000000021774 0ustar00runnerdockerSample responses ================ ## Simple response ```http HTTP/1.1 200 OK Header1: Value1 Header2:\t Value2 Content-Length: 0 ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=17 len=7 span[header_field]="Header1" off=25 header_field complete off=26 len=6 span[header_value]="Value1" off=34 header_value complete off=34 len=7 span[header_field]="Header2" off=42 header_field complete off=44 len=6 span[header_value]="Value2" off=52 header_value complete off=52 len=14 span[header_field]="Content-Length" off=67 header_field complete off=68 len=1 span[header_value]="0" off=71 header_value complete off=73 headers complete status=200 v=1/1 flags=20 content_length=0 off=73 message complete ``` ## Error on invalid response start Every response must start with `HTTP/`. ```http HTTPER/1.1 200 OK ``` ```log off=0 message begin off=4 error code=8 reason="Expected HTTP/" ``` ## Empty body should not trigger spurious span callbacks ```http HTTP/1.1 200 OK ``` ```log off=0 message begin off=13 len=2 span[status]="OK" off=17 status complete off=19 headers complete status=200 v=1/1 flags=0 content_length=0 ``` ## Google 301 ```http HTTP/1.1 301 Moved Permanently Location: http://www.google.com/ Content-Type: text/html; charset=UTF-8 Date: Sun, 26 Apr 2009 11:11:49 GMT Expires: Tue, 26 May 2009 11:11:49 GMT X-$PrototypeBI-Version: 1.6.0.3 Cache-Control: public, max-age=2592000 Server: gws Content-Length: 219 \n\ 301 Moved\n\

    ~W zcϋ pnB qHHHHHHHHHHHHHHK vӑ \tEtITQt L2ydٷo1Nlw6h"xNvڢBfc.aÆV6msGRlYRJ?kmXґ@hc9RZl)*0 V_~iÈ.lju yщ ηTNDkG8wG1q%K=7;?K8Ob%Ho|gyI_, H-^c^,{Yg)Zgωs*҉0L[nGLB>6k֬p~pdN2aO^ofO$              @B    HG'|c=(QlnKٲe>r8`͛p;E|饗$ďl Ĵ*TȄA͡n53J w_/ ^xA~mcdoF6n(-ZHfivqs0Lh߾/zozgG(@Ppqݼy|?]~̜9S.Knc lVA0bٰ!hXZ@.,:t9 3fHΝc&oTo+Ƌ1=ւ30×^z?wq`Ӷm[kAxpnc~0Kt? dq":7 dj9cذaC1]f @|`ٷoL8Qg[^|E'x}Ce; B'$z-Ӿ,sLKD '?/9 ҥ|ᇦmm,+Hn"Xh\ Π{O3yK뙰m^%΁A!o7D{JMG2׫V2;\iӬNZćUF ~UW_}6!;hX^.XyI|1;#}^YgzDvÅg8G+K^֙nn/D>^5]^G8x_^3v<ދh?LDqE oDG1Y*w}w 6 0YN/X&M)p{) D$@$@$@$@$@$@$@$@$@$@$@$@$@$@QCh<HHHH \}2j(ٵkW{j[c~&.s'A5mTԩc?c?0QW0`@bŊIfEBI'd [qWǠZq6~ϟ/~{p?ֆMt~D;iPƁ8f<1c;CJڵsS1;ɓ8_|;kNҌF$6oz`d#{!֭/vm'{Ae%@6msO |Qxqپ}5Ȇ 졘kر#x}l]!ǍVZ}'tݼ/5O6m$]voVPW3gl۶-7}wA{=^e0*Y1J=z+lc#-p{1k/yD|x _8p`VLDCdʔ    uM9'ր61c1֮]kaL_01I@&U<3q sDE/q 2͚53BݾT"ᥞ%x$7Z^+_K#}^Ygz>h8\xĞuh^VHǪ{yWJWVk//x/B>]4i"T7] 䩧2K8 "+Wrl:׬Y3c@$@$@$@$@$@$@$@$@$@$@$@$@$@$@Y @!,@%$@$@$@$.nFT$ӭX"|`h>7o^cP#au '` ~*#Fk… 寿'|R6ol/ҥKKϞ=kQDˬCpz}wc-OO>r ~`9|pK/5mq2Ę(y֭? ȇ>} Fpt9YnfqBRt_oFQ2N oHpkذp,޵r7o/M_< zC y Q /˲epظ0Ԅ&)>lyLuYg!ƍ{m\~'2"q[t#c hʏd2]#O(ܯa0A=74֋/(9SN5"$nq?\n(Q?5V6'sϙ #5kJѢEͱ| ȗh!Þ /=cǎ ֋>q%B'L`SpE3gDpM"rp ۆmvXH"EޥqY\ @&O- w|C6fx;˷L{!YD+e`fߟo5 4 Ais /cKzWDzܑ5kL F'=.kj m'pfL4gEʧ危g߸q6L/y-.MڭA!p|Wphߋs11^{nXVH13qi{sH埗Lӹsgs^2/}"i 7MU?҄sX矂EҩS'|G5֪"lX~X>xO,&/hazy.3.cPGD_{&%!\Qpռ++u7/QFo{^D9p1Tb)+VS9"\uY+6GeH/Ef[c43A;ٽ8w|}Gx @Ν   h 8οdH|G@g:*`h=5juThȩ_>Nݺu9sdZ=;:Q!Gݻ;*P䨁W<5*tU SC M6fA$:j<3pRKrN9vt9СCm樁O Avt6usPjA|ոQAc=f`_8::x8:ٿSNs|Ό3/;\{g8*yyjpDT8ʹ뮻8SlYs_N:[sQ!p}Nr圕+W&&3ڨd'P1װ8$3@zh'(TQQ9oQc[GEL0ϩK0X>x^xA?ի 6,x}6xؔ9/Rd8JG5e-ʾd957*T<W_9jXeV_~y%\Q^0qPHïiӦ{i͇JPMjiضq#    9:ۗM h@m6 | Y v=e8f#"{mN?+W6߁RN 1իWw#ܷZo|i3?ކ5 x'j*GLŗ/_<3;xbMC*/^<;]bРA/vC MA~3Ϙ}5}n7 3NtIxa8h?mX*Ԍk^.!iC"1ӄjj{O'e퐱}Oў5k8^^b+O 9 e-C]w/ܳ?T˩]vF; \9x.ѷ&ZB}!3m: >e0'Q}qGۻmMh09NRf2+_:sOVǸyoz 7;ݾԧm#%E2 1sbqgYV@,=΢~x)Kl~7Ūy /s/{~pd@x'ec XXj <ܯXL'sV^m2~ :*3:1ӻwL_zN2hy6-xc1!xG}G Mz CG$@$@$@$@$@$@$@$@$@$@$@$@$@$@&0%ϸq񏾐 ğ<С9}$ȵNyEtPTQUKET(bp!5R {ŊJ5 {ސ!CoT с&:P[ ^":Ff;jfWD;q,j jяxآE QNQ#3;{<_o!ҫ!w^:8_Ə/-[LL@|gE4)@zUt-ț.^ݻ5xqK6_(JTAdp%p뭷ʳ>+cƌH53e/"*pw%7ki/ 'G}b֢F?.õ^ v𞁑Ɇ N:{ggҥk}G5gJʲeGG Unrjբ?IHHHH WRmN>^rl?Cm9wאsN>w4/PHMDʔ3GY3y${%Ko{ׯ^G|g*bC*$*'}'*bTB*.{i ΁|)#zC2m4It3Tά:?gC}$Kkpc?RK[wr"/i{pu ou(o?҆ At2aѣ褀 &!L0A:wl1|[n% K_wDsxHHHHHHHHHHHHHHABJ?IH(è @ U!ԵkW[0r5j0u5 ^ v#m@|{N _| :ujR/O x9s*U*)c 8:Q#ĥ\3Ϙ=(P q7Coɓ' gϞ9zjٳ&0r?.wu_ CN5^%g릛kYE+o)Z4K"    H):\qd=_}4im.:+lH$3ca=餓/7"YjՊuw A [*B_ܼysX!/1q cxX,Ni$^A N@J*r 7W_V2^ٽ飼rʕ+emۤyFXϗҥKD$U^sM{S0͉W'Қ,#~'IwyZ]'[DɊ{h8>eTt|e˖ՉJȧ~iIE3 @{zɬW $ J,i /^,>˗/!%K^]Vwܩ9EvD,0;b^`r7JժUbΝN2EJY+VXRM@TS>yʓO>)-[޽{ˤI(A,>38Kjժ(VMCxx S~tR)W\jD>BՓ=z,#GMf>Y~}'[lnIƎ+K#vfQ=W=m92eD C  $    2rY={L '`Ǐur;رc0u!e\C , L+,7a.H:udj06lؐhBI*:CΘСC>TzDx ҚEDl G7k,3aۅ^( aN䯭Z d$ħ_:x`[omJ߾}N3$m֔w.~~L<1aN߻OVT2u䣏>ӧ~{~~L TtÆ 3c>bĈ#c?޽s ";~UTL:ХK Qdl]rf !/&             G]R}ƍ/ @ `Pd {ψUXAp)g}|g/ÔzN:2v<ү_R`= Z*&V=eQ)Q8z+[ 2 x?#;VQJ_7Nvq8߂﫯j&'=)s>f%ns;reɠA(ipg}֔'xrRuf7Dy$ r:ߑ[7M In="V4-i #HHHHH 9ec&ȩ4BC7|T&NE DOG$6W@wߕ_LJ,L0t|7z 8PVX!@  Ɠ%I"oモ… K3sҽ5׈&]'A&BD $Iч 0n'PgN> HR&äg6B?BE}ns>K/T>SiҤ,\ДaE2Jeo(6oޜū GE_lfʹ.<5G @$@$@$@$@$@$@$@$@$@$@$@$@$@$pL8b@$@"@!HƆR(^ٷo_yOٳ'Ǎ_FByUeZ s̘1rwGA{~H~ZaHn&w枿h6D֭8|#4Fo]}YU*1|f_^8s̑oQ~Gݻ~RlHI@"/yGUyw}r 7AQ킍 _WTW7q؈f ␡"9P,UJ"jkضjE 5n $O~'#4a _m\%KԩSDF#,s\b^XܮhѢ]n!"G}`#T%/4L$|F@}?Oƍmb"mڤ*3f̐3g+wm!r뭷W E#j-h"6۵KڻaaH+i">%^     2k'#;Ν;W>sslbj֬)7B6lPj׮M1K H ?la-UF ޳:ˈҧuI*Ue˖ʩRoL#              G$@q&@!8w$@w^6l93#k*3֬Y#/=\pY[|[oիYf^|E`E}VT]䦛D|0Y΁H+ q}lM`Y,Y0[$ҽsHHHH T ү GOoɐH w}g ~CIf͚F$ .k6%QIG$@9L~hC*˗7}VaÆYX& ^_D?D G4b\ ̖-[E1>,5j0fʕ3Bi$@$+~2e-믿a[~Fp¹"J6mjD2!ďqǩ08f̘T6J$@$@$@$@$@$@$@$@$@$@$@$@$@$(7&H_L{ϔ@@ 7Fu֕Jw.4K}Hv8Tgꫯʴiӌ1R޽0-[6axa<+\>qQ/B;8i۶tQڴi#'pBǐV˖-3yה)S 0Сl߾ϭigD b=~xy>SbҩS'XD!aDG^ ,YO8QTXQ ѣTTɫ7>oB|r/ deǎ=(RDGFtR8Sg:    \DqD[OD:oq MG'>*E /^<(UR(w$%}v#??Z!5:kKՃWǂ*9E}"|*\Rs02ڥgUT1eX^}ꩧrF6L${lժUfY`PBk+{RV- <|KAzȑf쟧|r]w%)'}%FHHHHHHHHHHHHHH"dD4Hr' AT_ ,^XF%cǎݻwK-k׮rK%m#?Κ5ˈhFP Y\s\`Df̘!/jbw)=\g&L P9x6\$R/M|! z|`eQ~A/.]iiS+Xa#qu !!i#v2"#   ?mDED>XU+77P?{GT!7iI7nDBY+W eA .'xHء3X!*s @BTXcAQi8Uh_СHX< X,FիM+:cLYg!Ѿ^8YV<",C<.vӦMKQ_G9ko!^Z5Ddɛ7of!n3eIѢEC.&Kxţ>ڿeHHHHHHHHHHHHHHH@ P  A grI'/SN~ۈ۷ψuIڶm+kILX`4Gɴi̽ܵk4nXuf2Pӡ%Yė T b~l'5f͚|I& K1mϗyȟو⹁( Ґϋ:sSL3g *H+i޼ʗ/トi@u%s5W_}eR G^:m?ϩ}E)Y2 i!C<Oc@$@$@$@N`JQQOwM6O$7\F 6Ak,q_d޽& ‚ !Yh/~qґ Z ֮]kDT' HuVvM+WΈ;B "Tv"  *ojșCXmݺu2<95&@6rv肉ؿfiqM$Y;w_Iׯ7طe-:d2RO9nnl af0@ـ: &~~gN=7ccHm@IDATHHHHHHHHHHHHHH(ø @P2P% @@ n'O6-[Iq-[,W|A`Ϟ=ˬYji !>A /4e$6Q*/zdFUɑʕ+ARbW.\iaOǗ_~ich"c Cm<Erg ё00ZpEYبiӦQQ,u5?yNj+ 7da0\P=\9shѢ 2HA-2b Fa;QCgzo`ݶk~sHHHB@EuejQAAO# {p@.$vg7B$.V$ BY@BYǂsHG6}!y`hE`!D*@0}t L(*"%m'^L)gٱca[n+Ɔ}G>/r' vmL"yl: @R ykƍŽ<YweИϊuҥ)}W_<`8yꩧwޙ' @ P2 0 A `$@`%f裏O>1b;0 ~RfMɛ7ok|*Λ7@B"X=D IO7(S>,$mj)6|B %O AKj91`֭[娣2D?!"{g ҃V)X@E_;"V,dIzJn d Br f}H @7($l[,+&ѬBdTRf ',1I {'6m2XcqQmLXhEw- 1*+1"Ed/bi~5qh6M}4G2[ a]BL.ﰍ>%JYZj\e\oޖ2c8،-ZBb}t&^@t1O?o @d?@$n(nw%"g#4w\3pn0+\URRZ5#ΓZ)Wl׫ zd 5 Wzu9묳ҬY3c36%зxȬY2g `p5jv9Sh7D~'#G,˖-+Wm+Wl|hР/^W`dr7._Ѣ_w}'00ڵkp$]r @ ƩGAY,[RJҨQ#iܸY #U:D@"VDunaq `:L*X1*A*+Js H .*j˖-kA!ʉ 3`KȎ6KN"'{zh{}V(ξ?3CoDeܳvXb2A@ltE=*?#t۲v< [_®b(gQ⽦0&3f\~)={~e$IHHHHHHHHHHHHHҗ 3$@iJBizlHQ0ꁘ…  !sA3Xbj *AX p͚5F8 Yѣ۷ʗ/l{qa.#ЫH:o!{'CVXa ~C?Bb9SB RbEB@(oڵy/"VzZ|N֬Yئ^ }>CBX~$TR[lO6ُEzz^' 8"/Nb:dz>7N:k}Ty ,jOC &tC`$5}?  L(r%iU~a2;ST@$#ٱX5<ޏL[˽ q,CH >I,vm Uر#CTƊ B4 ]/!Gtr%I!s4 ' H]Y9@]#Op (#Ge>- )"XPnS'ZO>LY:/hƤ-b2IHHHHHHHHHHHHHR S1$@$U*9^G$0rݰ@ bK֭ xLV\ J'z ruBlGWE@X A a62ԩctg;"z5y}G5iܵk@ B|x>YCK YL8` 9aiӦ| ›AI!uȗ!<x*U .=#T'*ZafQ^C> "vAAZ ρc9-W< QĂl #^1Y!$<D:Z4aH"vA:+ i"5|#?jqqHHH x-=E' % Jd&i&E"h@.&6m+Q,+gEkq \Ў 1H+޶ k)\-.ho۳g޽yd袋; 0#B$@$@$@$@$@$@$@$@$@$@$@$@$@$7JzD$@ABqK ܬu(8!A% v/oϟ?x}6!zc5؃!{q!Ak+<FD &H7]MTTd„eC@yǚ5kv= rux|0v۽Zk rȇ f FRPn}Q!_B>#dan'+ A;+5*Vh6 5es3S ْ%Ky5ܲ\v6A~%Aה)";&>Ґ جAf5䵛7ּFp!#pXL!* Y;9&"}MgD`$ C C!B*`mHHHOEkn뷗矋yfnJBCmJhu6Hb}8nFN$v&[l[ھnmw >NaDN1#F].H[?.#Ųo߾kom?#9`(V][b]u/9I7Sj=i{FY>SXkBS~ [EZ|e{} ` s|:`e-?-CC?XPn,`p=^z^l cl[k<t$   1ݲed~`d:              + A0^$@$ p:p8:sB$@$?8Ĕ frV o]=J3FlV%m *ǠH  0x<À@%!d m!a`? #ܫѤ[oDzByfM> m۶Z-②᢮1,ayL%O<CX cCnODs L`iƂ|ɽ@oґ d[6G@q |ȝX~Er/.6Bt|Ҥ&q9my 7ƽ7k"u*k^ۼeݺ&2jT+a O*V,mH8 +P1 D|5NF 2T$C,RdHHHH7^}U_?Qq D)-"s-C"_-R~Z$$Cm@naH :tmBvmw>muT̰x.mt8L--ew~׺בyq }XNfבhԏn*Y_@_#w߃{߶= RUVS#<[G䦛ȃR@0=ۡ"(Cٲ-*Gm#CY߽DZ>wiQm,pv;ܾ-/q:tPơ,K}e{Olى5ˊq '؉{pBù*6hLjT}qض,Xpex ȧ0qv䥗^ʉ(xy0޽ɓ':H$@$@$@$@$@$@$@$@$@$@$@$@$@$@&t$@$@$@$@$ `tɒ%Ұaèp*a`5TӁׇ;> 淃ga9c@:Pa@!$><:.cEG[HkfUjB݆vۮ?}[q kc/*sϞ$ŋo3X1@q #?bt$@'C;bPO0GiCjs1E^zDy1'&o{eȑ^pg˵^+_|) @.#>AW_- Zj6Fի}GFHHHHHHHHHHHHHH@?:&0&>/9LEʖr! Df ?N"aCߔ ߌի|XR"v+Ն>]bjH yD?A$@9M3f̐#FT#}UWI>}tb3lǟLO@:Lfkڴ4nXyǒQ#             Hw4L''   K;2@ă)Gtn3LΛWbӦQ2o&_6$"c|~t',2oAD ɗϏeH 5 .G8wP@(T s \'O@,-bIOQ1   ptpXy,1 WP`_ D~{Xq@;m \oJC&'ɍ߆]'r"/R;&8 #'H$@$hcx۶mͲQ3QFevblRӊ矯YJ&'|"Z- I3ё P7Q#   9='a#\2 ē -s1e<v;OkDv9ܞZH |s3Q^U1-P@D:KO/7Nrt$@'p(X!pAcfC®-9eȚ5"vk E#c$@$@$zػ7 ˝@*زETFd@}gE {SJcesD*U>\}t$@ 4l)ŋE 'j}ݧw|uҵkW)QKzmsCR4'ТE i׮y,YlYLg2#              PM:     7mD~8 Tn@8pB{mE9u!J_H X|w__KD4y5S!# n0/]:~zB{A.O2eB'|`$(t`_  Hd}&ӑ @4%KyzN"W_^+8N@z.{WC:}B6mm|              aQp< yyaD=6" I A+ mXK/HdM x9sD%,؄x\Ș1"g%r "KNHpH  i"5k/^X vr@ણXQEN9%ƶ/R$ IA6oiaI8,xC?F Dg;âVSE/'= / 7Iru423q$׋~hsO`BK/N߱4#EI !ȭ[{]Hҍ):{ѣ>*=L4IF!;vrxҫW/ @j+q(K׮]o_+%J0Y(#             %iC3$@$@$@$@!>LwEx"`7wI hB)}  EL @XVG?C"+3iJGD ćDEN:) *ҳ#o=NbDq i2O̜)r"[  |#N(7";w'HHH sgg" d^M$>yGnK  o4GcvZDO2$r!\: Hg.]Lm^ם;w~Z'+*/_|̘1C(A1&_UFxAHHHHHHHHHHHHHHJ5֯QdHHHHH 0n[A'><@&_"KokNdڴԓ@:XDТً$qljL DnM;4 #UEڶ7 <۷Pd"_K\9yYQc\E)QBE.T{E^yEd܀d<6\xHHH+FaBL^ H  _{w| "R ᐏaٱ#$@T LA$@$@U4c 6ȫ*[l6mHJH*V({~XlbŊ$/FHHHHHHHHHHHHHH%5 @Z?`FG?U嶴1='ۅ bGW *o[XBj 3(w߉4h  #PH"ݺu"g['a+/ҴȞ="&O>; YH"; (s"~(rHncñ1  H4 A&pxQdx6#pwW0sQL_Dgʙ}tW              PyBpHHHHҍ}+[7R,X7 n0:ԓ@:XJdt?%Zw"KԬ$6o1d|HRħVv"O=%{"ܸQDFED,yvDT O=U:TdEO%+ $D[.]`rXߑɋ C"1ׯ_8-#~ZBݻIm|"ÇWZE|,O$@MF*lvZiٲUWKW?餓ꫯ6| !ȝ}Tۄl"M"O(Q?*D.J{koI%F"IV2S١_s~۽x|Ϲu=>}oXy@@@@@@@ H ^# Ĥ=#dt tbt1Ew7&LHqVf@(1\~$_r>;-(x {ǎrDrh; 'HMHݺI=$)͚m4o^0g`?l<#k'gye+K-[J}YEWi @(PK7oh@ 2,ؾm , 8?7ŋb݂#'pҺui|GH\ꫯv}~I-ZpR]U1cF 2 n_Çp)`ڱcG32       $V  @6ҝwJeCX%!ص+X{6/`(:$d~*F$zIJT)iFij)W.AȑC^s+ F׏#O >+a wV8ҥk[t)w{m_?')*@Q ٪Af;kE  -1 & O =7%1>G 6,Ҋ3sfkEHY^zzOkԨQb;8WkV>}`ȢE\s *Ureus=ݻtB ہ&       $-@C6|  >(=u1Yw]?% ڴ[3'EXDZRz9i*i䓥y}YСWz#P`L{e+4mv܃…^ThK5jHv_Ժt-+H'y  -q!b{DK"6`@nE+ _ciܸԅ@Y}>l: He_IAH@Awrkռys܈hw}zٳgR@ 3`M8AgIM       Y#-YJ   t4d4xdU`׮gqGk?Wjז*U&N R$s"@4<`KA٣JͥlY髯zVz H-M@ 2,n+a,$_-_|)m̝/_[t)W}*F# $[=;p@ʕ+zCO@ ? o/uY`K^qtoKwu^${@ vi!zg4ҝ$n:ˍV]ӧv… RF UU]tc=ϙ3g:jE,rΝ[)!       u=;CU  EkgF,żD@\PhF0!@ ,C)nb!ҸqҙgJ˖O}Ehp-AS'{wޑ^ ^Ԓ74yt-ҹJKKŊݻ=)}ZA@dϞ_ yh!;6[fMilB oh*[[ !]6p٢E'zd뮻N ,p狿w U\9[{@Vj!zEA@@@@@@@ L C@@V`jrT!HYvjG qa.A=fA?(m-} !t饙YkdtQ##H(Pxح}۷KkH_~?ui4ttRzLV"n-zԩ {@B+`aw+kݵ8 €9) ԱԣA|K1GR}J&MLG ,rbpB#p;os`@{iO?]ov^} H~bS@@@@@@@$L  +pts]wGoGص+xQ$8|)_Sy.0fda97'JӧK\#]yt Ҿ}S@@ Vr*TZ[XzX%_ѣ޽ҥY{츱|y*;6k`?Q@AZ݂ -'`lw?fOAZRӦҠAQu 7pE )PhQ|Zh&6]w7\r Zpax6VE]wݥsjڴiޏgδ/ ޽dFt[u֭ Bí}P ĝ)l  @ {݅aÆiȐ!ztgO>ԩ 0hn3tM5p@w_y\" @@@@@@@e?9>C@:]F .huC$&`?ܫ ڶLbA`zi,KcicǎҼy4l(}Y` @ ʔ5z{.wiN駟#Ν%   BMZnIbi4ɂ%) G elϓrX,%mԪ!.L*VLz̯4;wPxq"-PD ~neUbEK˗׭ު%KDvi}Xu]?gk{r.M@@@@@@@R 2 >F@.gg6o Koؽ;eIsǮ@6ҿJ3fĮ=G >X*TH. ;zVev o/t@`n@ V,^=˥F,v,(rۤJ~WplYxqI \ɓkcE~"W ʥ9 ty  moTWoϏyJ=zAx0QC., F@{>w~v.vƍZj¦zw-ݐRvm=ә]u˕+Aicf@@@@@@@P p~Y  @ l (]y,ٳ l8vI z/N:I&NFȨ1˗њ{y9tҫeGw UJ;;}̙֭ҟJ_}%=T~0RVRŊR"gK={J>+M$Y.@HeȟCU^]-ZѣX"ҥO^z ԒE-@@@@@@@B @@G知ޒ\1c pbD`vp,LA.^,\EY"H`8="?OI@:ܹRRVK~yDH@ҹJ}=Zc\A@KO</ дt5[n̅ yo_;[Ld$o=ڎ@- ŋM,/$ a￱@@84`wƹ ԕW^+giUqi7|Mܹ3[eᦇ-@@@@@@@ uAΉ@@"\; .ۣYf΋|R/@dbqN ܱЉccE ӳmA0cI[KX@ FӤԧOki`?l!5<"ծ--\(sdŋKyᅒ 6Li@M o^ CM\VXQcOXd(lv⋥rðq4  TlU!I gΜj۶>3?;a;bUZ՝P|8:9vz={h))       @pmB@@ &M&OF.{ݻW͛7O\رcQ-8Kb7W|2d.0iW u˄G,DeKi3֦o܎O\eK.Xey. (-*"B`׮X襗"anPӬYud֮,_/ yUL%N>YW/[7^DՑFW =O ;BA(cfTfI Ea'üKrI^+Òh k薍+W g,Q+CAbŊz衇t}i.z2-[V={T^d[ٰasX80&_֊+3g}V$G%Jk׮2}9Bs ̛!m5+C@@@@@@%@@8xP.Qj^jT:uN:$xIvn굲e~ 4۹sggVZ%NA %;…ScYm[?Jw]!niK\RÆ Ӳe^Q.q!,X {MA ,`]XyD?_jPr9ri 5+BPAjZNw}=d~(]qt1t饒{W/sԧOҶm@@(ۏSB'` AΛ5!* [jז !2T$if4uӎs?{`]_DӵիWgoݺ5I{zwzힴ5k%7JԎw'Kܘd#xɒ%2eJo> C @@@@@@@"@dZ@@ 쁶-yI㫯҃>^zu]IΛr-~dK A@[X=k`ai)D-tRw];ׯ*B2o\믿ɩcqctjV6X1O:t0B@ ܡN9E2顇$oҿJZ{UHؾJ`P@ `$@IDATiT\8T@t/zS\P4hPZQ^}o,-q$268}EN>~=kαV#ʔ)yr$ >|W֭}̙3:NuɕW_}}&Mo״i}=;L0o~GV;VGֶm6kNZJ} @g\"2k6t9rz=cԴ0/d@Ŋ}]tu)-\(?HÆI6BjԐ48e!^  @& )7~&WJu 0@Apkբ9WiɍC  .;?- $wFw}׿.Xr͔[M]LxR6Os,^odfOڦ]wMJ?r( Q$P͍kD}v]~;رc*.GG?Y]O|F|3fߖM+u+>3ނ{N#FpS{'>b&VR>"m/X+W尀P Pi@@@@@@@)  DڵV+(!?no"ҥK+G[pb\ۭ[7?d1NB燒YТ(b7Zȣ2^vegyfͬpo!d6ʽJ6n؟ny뭷Y=iSNۻvŕ.]({2FOz뭸va 6jG?3/N ȨۤYҡ6mҒ%Җ-[tgxoؾv_r%^Ұ#~C-k8}=lqKV4 H۷Zmb ?VryiC.ڰ%FX=϶ˏ?X˖-5wDQgj(Y$+]\0~Jrd~0XjVc0d@rSa%uǐraAh؀0Xŋ=,w@nixiݺ-@"] GpHEd6Z8V`Н_J%K;SO~,$78u5k& _ mt>k)Ofݺu34k]{=īh Hq[@ ˗ϿVoZW0p@%`_$f͚x7O1{ؽv\bXiA)sHqvli/R{t׮]!k^7R@@@@@@@[wD=Ͼ( +~!ya6!$ЭUy{z *UӧO6m~хͽz(~3fܨ+μ\ryW_UV</_ܹs.s!+q馛&y 'N닛rJ m۶;t3 @?"z܏7theJg<&ȑsa0Fjܾ\]iԨ?_LE˖-\`d2exE>iԩ~ʕvY CgÆ 6nO}mqr8%Kz[nޓO>N}08tʗ FQsϫY-Jco9FM9@ ֮q<=)UlI;,ڴcZFZh/ uꔽm_u]|q"]v:uk+]~-Mٴ zwm tT7^L}jmxR63}r6Ss(Dy˗G|W @*\;xn@[݃QNIϒ-믿s܅5jxcǎ=„ n0JY7ovfy/Z܇ ?HPR{}0bQ\( Y n5!       @ΰMa  S`|i'yO>D{͛n̍Յ;M ?;꽽Sld}ڵw}W.$R)/U=03{zl>GOcm2rH٨ @.(Vo+{ ,(p~嗸ɉ3cP(5} Օ U /W^rroMW>ܟ6h׮\d< gu܃$jР>35nX7pC_)/syu$wA H?(+&q,-[Q\奋.O }m"}ԯ_N!bEtiukvVܾr@ 촭뢄NS`믗F7N:H7T)ˤA]۴GĮm&v]ӖIfjq^̬s]L͵Wk#%z*WѳM  @ԭ[7͜9S .?j.]qLn$?Kȅ̙#B)7ב4Wʩ-+ ,柴^LM4S.Sn5ێ sTȼY       @m@@K%{.S_+V_:tHw^|g4i^|y4{Sq3Νi7ZYl8ϥ-}-YD;ӟ'.D}x SO=p%E|Ȗk[oejV׿\ E\~t E>B(+cG<4G6̞m+͘Coo3<_7)3m#q&O[wb̊.-M66m8qkoh nOH/\W_}V\K.Dݻg&bŤpTɂY#r],#]u\\=n{(n7[Q~#`-ZHw%\u4| ~w)I>4a~eP@;NS@ BxB:Tn`F4.L"k %vm3+zܺϬs]L͵ט(!L0Y# u+W_lڴj׮5n,_YO}VGNOJd3m۶-Ջ`+^~-Ͷmm5S@@@@@@@W u.@@t |\8쳇/UB,(1HVX%5L1;8a{()a?N:}Æ u룏>1c(OmVD Pټ*V,دM>~@~PԖ']x.{9?̶Cӧ߄;3\nІ tk…~b3S1/,tp"}nf7ϷLӤcw9o޼SIJfvnÂml&NVڿ?iRUUKr,ˍIay,3w@4?iXY@ ,#ǎn1 DR-.|RݺYeG^یs]یkFgư 2l6 A]ҳ??yϼRJyz? kqk9rgׯQ387]s5fI =,r?6m _hux]h:sa lڡCغukI}GUXs=k0n`6w=VzgyWc1j IxO?yސ!;&:uϫU+j^@hc$W.ҝm߾={>S[&wޭ-Zȿ˦}]v/Yb_Wf=TPsznޣh~N:Y>K7v[];b?/ &Okj@@@@@@@2&w3tTᇙR d sûک>zKZB*Zv~2e.\͛7_~ z M5KڲEWj@:sD` v܏M2`4~`A@ & ӹ;W: $;^OfO͵͌^{mR֭1K@@(zԠAGZuE.\P.$2{Ҹ.H&L Öt׿'D*~+3Gs\wܨQ, )8@@@@@@@0 2 7 MBR Ȭԥn.+5o> 6]/2(;ҽLZiѢL@ DÆI}JYPVj$2km4rtCɅꦩ fF@ M|`H c~7 CjXj$^҄ 2 CF"[X8~/@ LF s 68%N;M.H>W?0 ϟ(ضM*Z4;H2$p)Ⱦzc7[0} Vժ][n*r5jDeTt|ktџhEժU_hԨQ۴qFis͓B)Gh}6m^̍dT jhuAm R\R!=W*^#нwCZr*W}ݴi>        ,3G@@HJ`>K=EA$L) i#m"PD2Iya @ѢE5h n>S UaCR@@ Rrŋߗ:K818)QB: &Mv iY @& X @ ԭԶԻweL]v5)_OJMU&R@W{S'ץKcå1c֭bŤfͤG^:x0\{C@ +ߟp*@ nIڳG:4ZCB[nܤ9shÆXu"~%KJ~E -Ppaw/_+W_!j,(駟VժUU^=:p@dw:Z;wnuU#FV]Vlt#        a,@do  օHI+&>S@ ضM*Z 'Ц4aBe)gFuƌ CNwq/^ZNѼyft_5  ' u,bj4hT|n|9RRe˲Eԏ  ܷ/#5,d˅HC $kp]zpi@ k,￳vԎ @JԫW/=Z7oٳs/kQtK__z5`! ]3gԵYdEn.TS*C@@@@@@| 3ߔ@@XG~ V/еkW{RƍeuUX1S@@@@@@@J Ȭ^@@,jդ^z*E vJnљ /4aBWʪ@ ]!J{׼ysu){J t5[Df' @ +ٱSO)TRÆR9O? FY*:dAFϊHT`Ѣ ǥ2eQ(`E[ % *'O]ve2e/_+B*U$mҤI:tP1VޥK7x7E(yZPB&F       dAYgK  X؅g̐Ǝ~ZʕϙG l'hޥMm[/}/d3R@ <,U+('РA͞=K/ xU#GVZCgWz eJݻKFI6IfI={J? o rpr[K+WƮ=GB)@d(Y) pTԻw2Gt +}j~9ߗ4^!AF @ |8p֮]w}W[nU֭UjU=ڸqcv>D=X5k_Յ=ݶU9`Cn!        a,@do ĪR:6 ''l)i2 A/#lcGk=jIw)s䜼FعS6Mj @Μ9u7ߖ ֪]r g(V:@3ϔyD?_ZNze)~Jn]C8VĐA1j #M.dJLi?,H+ b˂F@b  yݨ|W\q6;MK:tph># 1ر+yv%]]v@?s)G}4^ZKV|Ҽ,        Jn 6B@H/+ .U,=4lMr7Ϧ fB'eKP]&{r xC^+Id`dñegO8M>t }kYWgϡ4  IzI|"٠'JriRJ7KSJdCY% AF醥['`hf ΰ@RȑRժҳJ[m ' "`AV盂 @ ԨQC=f? p.pȿ;ܻV[t =TFaHo餓NJb̏       @~UXVMx[/<bǕ^[` Tn @vq"]r >6ծVJvFJȊL %/Ժ4xpTҕWJSH/)#]{AXvDu"a&@dm&Y#=Dlm`&0ς}WZ6L/\DnJϓ&N.(+B*P|4w\'5l(Y0hb! ?= -`uҒ%ҥR~Ҽyr\KeJ={$24G 2Y/v\Ry]'U(=iS_;gdsA)HVm / &PNw=ewޯ,Yf~ /I<,b UZ5AME@@@@@@@  mB@@ |,!=dh!iN8@ఀA/~=H@{IM|rJB6l 2TẞVNќ99ծ>|<=t4bDWpB@ իK+-X t֭2e޽iR{'-@ :H/"[u~ Xy<$VC "U Hr@ qkFg0_ʕS5s̄vfNΜ?ҒPOW\Id̘@@@@@@@ j}b  1*ԲeIwhʑCS={8 5lPC\";}ݧΝ;q9Z2ehMXP~WҥK*@@@@@@@H$!{Z@@0wB +W͓ R#`AJA 5jH/xҹr4t @h&L,C^/$ld\z{w@bSt,=W?F,DcG|yۤKcӆ^#G *$@q^#@(F6m sXGx <ԥdN=-P0Ai= @Zo/;թSGrʕ+뮻N ,HW^yѣբE mt&M駟yI8)K,Q͚5@@@@@@@ eK@@_য়䰇@3G:#?5$'r'7!@߾R۶ƕlAq|G ,=ף 9fϖ|֭[~XӦMS tg֮].Y8?z:xf͚ϳNlFx.r^r%#nPq}JkŋUVנ       "@dli DO kN:U*V,B:A3M M6L*ZT}9 $ػW+Mkk?-[Wł"oUZ&Y@(_^0@wioΝED$?^pЯ5@<ҧJrtµٴ 4 w\Uc@FxޭZdYjUu#x+WN7t|ɣ~w'35j$ ;s $2ҷ*G@@@@@@HN t @@ hrѫF飏|;H^`>ҥOH@ɒȑҡCp,< UӧK;w֮m*@IDATUZ<-B*vp5I}t@b[[>DZZak7ʕ]~mz#@dlkz>K ;ɾKe-K"[-"iQTZTO=ڐT ExlE5Ȟ5Nus{w99|Ԫ81& ~ɓO/58Q0p cIHH@zdСuVyg5eȑrԩ ^b\ڵeҤI%?3Fdz$B6O |HHHHHHHHHHHHHHL@Ma#    oP e\zKo_L#]ddxwpC H ƍ R 97ש#;"۷̛'ҫ'ϧL.#$!ȣG35 Ě|Y ?ҵkWy&׿]TGޫ#  s%^x'x $mob#IHHHcȑ#gl8l;q℄N:%6n`(j uYb6},Ylg}JNj%o; gQ VeϞ]{r$0:HLxfgV3:ʆjFP&؏?˂@{w eyٛԩKTfKmT=5`9#Gn|9=zssȡ|={fc?j}}t$֮֬Y%{iC|ժˎd޼2~Yٹ*WDYE(L[” 7m@p0M9l0e 漽c6- e @lV^޽O /؈/!H U@rTI A'W"-[2@?;}~9p$ScZ/ foSz*flTأ}>0v8b9ro\ь/b?hjvslI1v)folS0v[b;wnmb8ё @( EHHHH `X:c&1L޾Yc, B9.cOB'0>̟?-chGc`5CJaedaԭ;Z FMTA,{j1(s>0Ĥ%훙ȄILd'6 $ݢD}ljö@^2}9c0!!9ctnҍ:D,P.!2eKtr]}1DYI&7 dž{C9ȿϛ 7Bk$+NjEj׎U77"G9a ߜ31 +CnKT= h,?PPJAdua{ao/@e$ m!̰Q#N{oPv6·sH?696 /L?AG$@$ʗ ,P'a09\=#QxuhfD%B{SQNS1y>ڐ#7q~zmoD:q.л3Xao&"O/~|6OGn7NqcQnF?&IA( L[ 3vr &copLo?vC**]MxFL ~@bo3cL [n.Ō9a[ ^(Si;=:  y _AOlx2&$@$)̠dx? DIN/Դi@m۴ ͶuV?~I>baҥzzLm}GqX Ou/$ԡ} fվ7bceʕZ,}hva!/vd_x6ҥ6 AeHH'Ν;:To0i^hq̙R])39ތCIczd]u\bN4vnBC'3^hX;4cwC4f[3޴;0v x:              #c    `B #aXg6Lh6L>1{' 0h4FvcN2e$& =0Uu*潹(d3Z|O?'1؄-ŋ= 7aIGB_ f'(vءϛ<~؉RJf6S.`I%ۏ5(30YȻaoD>ĺzj]@_,pfc~8}t$̚%X^ޔ`o7`rD)퀲\rv}i3`vC<E 6uSݹH#` uKD;{ô޴# B "/ ҪHÆ"}\O8B$NIKL4 Ě"͚%^/5k~k~wٰaokו*UJo5mqŻ Æ :b}l 1šclf8a6xb 0KoaRW$ߧ1ڄXtB8^jL6Mbp` ]H^U 4CR %LĤNF0IWZU!?!r"K)W|CF8u͝;WOl$WD !/7.H4O+$L"j 7D;&T1hSfw4e*V'Nll@480E0L 78kfvQio @hJF SW/*UD_EU Mͽ#ƅR~Q䫯R3}^Ia!VXЦ6"*蟅 ۶mD,l?6ύ3l*TÇuv֯_۾{}l:1~Z|y%~oÂ]解K#rTė1%  H@cqF1lW`c`a1֭m#*aB[C,xx {Ybm…z 7eO1=JrK= @8KmO4|[>   @W@ `DY0Yn #b/ca$lq #Mc 1S=~lb=hn Ml9͞=yKh\h'k 7=`&ui#z39Aψ홽EBY b_t$K0ٌH1 񑗛|K.ѓqR@n"Kab}i/`ߘ\@L28g?ݎ&#h_Ƙ&h`6 SµWDHҔ"=&J`HE̸j`I *wC{Exw(Jl\IA 0 Yde]-[& ,ŋ˒%Kdҥr=x >hr>V,A<ē~7Yz\ҷaa08yTQتU&իW} ɓ)K*jl<Ԓ A֬Y7Q`h6sw.cۅ:*lV:SHdJ0^n_ьog {؝@lٲzC[ K~| HHHHHHHHHHHHH U P2U,E$@ABA' @k˖-z #A Ƒ0D;qℎ7A$FH|Ō{ٹs42F72ƛ@:pD 0# v饗jNDb䕚&닼F"`; WZ%fC9ǣG{;2 r2<NܾAW.K,N||PKz+w!IW1GL{{#o~B( L;0 ǸNGBDemlǀCv5eأC|5L' @f [}B-ZQI }P21zDMEfKKL* {YB䧟!I#M~R͛7O ?W*'\T>X"b<+=~W-=Ao1UBVZRvmYwyF޽EvNWL7 @B\+T%l[$[X W0bT:=3nKQpXH]v\~ZT{b,HHHHHHHHHHHHHH :" %@!Ȥ}u)qAeʕza$aH :py NxF`vg}vsbI <`=0 %!UPA aoɓ(8PPzy8``ptҥl2qGfͪcz#h?t$߯rcիDÇC+LrƆI0:TX3sEMPNxS#v6{#h&T:"rr+:҂&+QΘm۶mW K NL$ DJ`xȠA"mD'$@!ļwA>%80THjStytH;i0̙3eƌz >OըQC*^8 Dl-Z$ .ԂsUA2@0Ze [ݺu}ş*حf(Y+d$2I[cũ10.hǖ?LIHHHHHHHHHHHHH =P2=3SI$@>A l߾]EBl*a #VƆx @;v' Q%.fD  0= D㳲UF"}&ҹs4>${$< q/Cbvأё &_+VZ(jժ+\LٷyUݻE NL#p_[| Wxq_{P@HbOѣ6[(6{Xwa$@'pO#@" P21Uw՗ jā@PwZhuFR=ѧESNI&? X, ~@k[CH]O2k,?5mҤ4nXgw"=PHHHN௿cϗj5luO"0u .l$60VA1}C8bS۷??m0$@$@$@$@$@$@$@$@$@$@$@$@$@$ }$@$"("/2_~Ey-\PA_3$6|Q"^06n3ڄ&6}qm\Jp0.%*$jBHÆP7oެ'͛7O-^XW|WAN>pF%Kd6lؠoj֬7L\2a]_::4 &S`֯_/R6.Vn'`0*wq'$pN" F?r,Ϯ'GbL„I8;IR0o)ZTd .H15$& AIӹ_kXMJKsH9#D:vQ]$ryΟK;7m$GV1ZE诼VF 'Cs'ӧO)Jڵk@ҬY3iӦ;2D[7+DG$@$@1'q9shCccY1& *毄jeK3=a1_vmtԩSGʔ))fHHHHHHHHHHHHHH s(9~|H %U"6 Ν+?6nܨ'`UjA/!&tg2%edIWpİG#|PD N~7CA.k׮Նy]  inͼyNO޷O$јw)?M2EN*YX1-$Pl('f͚R H {ϙ3GP׃+D=\;!>&_W,]L +Ҫ(4…cpB=  }TF+ԂNHVz_h?6[0 4.()H @.ѣEF%,O|R nU%&Ү]bPI .64(S<}'NN>s=PXu|Ҷm[8 H 8 cUg- &h;:ȝwީ;dҀ[nQk ё +0Vr+XuK>bDCΑ ZcX@rҥzYfiݻw%\"i7أ6HHHHHHHHHHHHHR S 3}$@$GB~@o֯_/'NԆӧOUVՆ\sԩSG)|H u ;vL @D@ MX}٩ !)S$[79!nɒ%2f7nɟ?\wu^\ċ C`Ϟ=ƌ2ydYzk޼hB޳gN`GD" Nyh36m`r4B1 ml# @ _FOl߾]ʖ-+_P̝;wyHC/2j e2H{fxC{?I" PH"={FPܺyf裏 9r[L7#!C8X{ҹsg d+MZhPq&<$@$@iK[crZq+X F \~LG `ibamB nZnF " A[eHH  AKA gaK/ՆS^=ɗ/_gyH  a #kժ?5?Qڽqs/Ç o ' 7 W]u>& ğMdҤI2a-5kVm߮];d˖-JKQsO%2Pc"6 ؆T 6" ^# !a,F6&=zT-I*Q \EƎ5CҀ &~'H\2 *{/ŋjjj*L׊+_Z.y@ȼP#$$j*56|gR ̓'O&Qdb3t HfgϖCʷ~+rX+%KL1$v01A,B {jŽ;j\r&HHHHHHHHHHHHH u P2u-SF$@ P2  @`ٲez7|#[l  #5kE]ٸq[W-[??=0$bQQ/NEO8!:u{v()            HWgk™n   3 >|XEV^]V*K,{Nvܩ}z*ee˞ ϐ @&ɓG 0ȑ#%gΜҥK __>!ߣ۷v)Y 2D A4xԩE cIdVZ6Ek֬)jO:en!EQ/|T\YJO>IVUD1m&FR@֬Ynݺꫯ @>Z,~ںuk?~`R $3U咫U9x0S¸ EM0 $=k׊>}/ϫN 10}t!E Ν[~aYn7}wB z1< ?$@$@$@+ڵ*UJK޽WCF-;w$?H!g}Z@Sj;v5jH:u)™            HCL×$ ?J1']otAnݪNɏ~t$@$uem6m믿ʥ^ΝX$,Vt̚5K4hhad;sLyGxHI@9o^6mڤ'u?rK~ɓIxF~$ɒ%f ̘@O?[՘Lyf| @Oŋe…RL;ޓG)& H%Hdp-O=H"%@!H~pN@i"JO;VRǢ`gϖ'cRgpL {?~K6mcǎr~덖)gIHXf^lRJ\R.]*=*TȉH s9چpԨQzai,+ ё @2d25ƙHH\"gmYZ.Zl1BcIѢE] ސ @t0A bƍr_tEҸqciذ,X :O) 1InMJjմ!.W_}ue2I2K⁽{ jf;pw}YSE 4in޼Yn6)_2ydYhC ,H1T B?QlٲEyϤTRoʉ'<$@$]^#E6wcF@ _>{!L# ğZK-pbUXBZdŊr-+hC ;wny_~˗kQTf'` :+=B$@$~<'!!8~ԫW/`0$@ƍSNҵkW]HHHHHHHHHHHHH m1$@$@$KYf-[VV^-??^ Ekz({ϛŋs='UV^zIG0йݻwˀEZ,{)N[G\ݎ֭[D]h1СCZcǎzulr!]^seʔ}jB;}y-[BG*W,Ŋkja%Jx"{/B:t 0_91?tyzӡ6eУ>t^̻ [lr=ȪUW^Yfcǎ@"0kȱcxW!bD1yiaT.0ɒ%5% HOSN *ha9sСC"v:g٤D{Oy,P `qt3h6,Wzuyvot$@$@$@$@$@$@$@$@$@$@$@$@$@$ ( oq$   I&ꫯ &L4I> BxnHQD,Y tn޽2}t-qȑQ@z7 Sׯ[ڵK` 1e_MJM?o^u&?!]B@ek+V3f@ i3={u]s&LCgE)v;ߌԿ@ĉr,#" 1y8AE͛7ƍ%ļ9y衇t$YJ%x jbHɒg\ o09bԨQ2e믥\r1 /3oذA6m$A,u!ChX╦);JW$2  $-nk;#Y bWV $;u$w}?~<2 pê5M_ 8'!H5t@G$)>Rνz xu]qK_}nF,zn!?Q_s9sj*,^E.\䱴Biʙ` I7Ԣ|̝;vs|e/I xcNyؤ^r.R' ("8q|'EIH6 x ?  pvrgbt!_xƿu1*9<(0:lԨQL E*7ԳgO)[lLBVvmodz-x}մiS޽"^v_|L}X΋W5Ff?J<`+VL7o Q1y'A DiщlzDGbErwy?H|O9&f,ov@?4 @-q+4|p6.y=`u2UJ="+VdYFZh!WD]sΉO TR!s瓙-OGdIlJ3)3~' nc]e|3Wti駟ԩSҶm[-|~(HbC@UT;=6~W GBGI"%jBz7)WOd՚+ '`} umB7?.CݖT6B!ȴ|L4 d$0~x-.>jԨgIX %Y/7®^ g'"'… ˴iӴ$ڨt$@$@$@$@$@$@$@$@$@$@$@$@$@$eg*y9 @q-_("Q[lO>D~-Hvʛo)J#F~[ɓ' V/PJ| Bݺu-[̪2rH۷|2vX)YRhQ?N/blٲҠAٵk۶mrKe߾}3go&5jԐ_]'jw}W}Y|A篿Z]_z%-8_`A]τ_䫡 &@yٴ"l8Y&{+M6zN@ebPpRVۤ!}89I 9Yfڣxwh;̂Hbv'}gZ8ߗ_~Y)b>W\A u(Б @2P]8&t$@$Wf{E4#'ԸF$s„ vZT6q0;wJj a .Ty>ܸ/X8Ƅ1P.>.'i1v=ׂٳԮ]HnppcG_|Qeִ;X8y% & 6`SK;/9CB3T">~E1싂Íia d߱x#\88DG$ϟũ 8~ogv+aV^N-Z[ WčJi/@IDATUuVg6u4DEMo)o~Ag9uU@_MW"W)ʣ`m7Ҋtm,ԝN@eE0_s^@f]uU֡CÇ%&S(!y *EK 7^'矷hxė% յ`˚<,H } !q^ui c"k8pg8'^Bຓq=*`cJuN¥C`m~3{WiJ_dkwa,G߷…"L$ @JNsb7+9s?J3:g9FEЬnMߡYz1M|+lX.\Mbw4áqBcT-m. Q^C$@$@$@$@$@$@$@$@$@$@$@$@$@>j{/cIHH VD)az˵V2Fe/j}FA @G…&/mnV}yp nݺY }xb|„ &0({Z0ҜGٲeͿz۷o_ ΃} |9dP1Vt_~ 0`9y_3sn:-Xg}O>Ç9IP0D$Ǐ[j~~w{Ԋ>M"aX)n4^FL<18G/s-}5a0UTI_[`9{A%ݝҜ͔hF8WY+# [  A`f9ɇ*#?t7Z#8҄-X]*12+9' ϺnF"ƍ=Z?{>m۶M*л# AS)(ǎӌoH*.b8@l!6\ {Ajx RK5v[nݺ(Q"k8ႋ\q:lxc8eOxs#މ)c>QB2rH;ļ{%5·QGn0O?鱖 6LЏ6 ޽l%)%JK/"ʸTۙ"JEԪߢRPBNE- w-j*CV}qItܹSH8*^tQ[ޱcGIe5]o^n{C.6Dfˈp2o<2BML%p)JO_>?nޗI_f4?.Zʭ2i}O&(O!4hro>p9?,={o.JRxݙe[ECQݷo˗/>JSܯ\-)L=i$n%*j-% +y^)SF׵y[ԽCJ0l<2q6[i:t(viѢ B:jB5ڂN$_'eo_"Fw%h=D˕+A JD&O% QL~H6C$d!oFOoyi .>OԁW{9Y` q-^"t&@94O Wt|ȭB_&x>`ҀѦ#7E'/c۔)S$JܳzjH#;'qVcko۶+kc|HHHHm[~= &KH @B*ۮk֬WZkqP"p2$pPם/Z:O_~O:CRyEG$@$ի'9s̰ht2HDQ9/tl4?+ fnLa n2@t[n4^uqņጝa(iD$@$@$@$@$@$@$@$@$@$@$@$@$@ ! @0tF. 2f4hPRL_SNZoFYÿGFoV 2}Z_h1?ќ`g}EdJ(Ş~Aڵk+׾}{8qNHݿHs@t?\= *={v/^ cp1 }n*6mxЉ'2x@zGi뮻N~7йK/TO,Z~}˧NW^~{]gbN^k<>3!z!=A<)#Lҍ|X{M7fAcvKx:(z4*'rέPJet33gއ~] !Xu W^y\eARqsF^p-b1 xQmV^ܹ/H땃ֿ՛oY 0Q acI<=_uDRݭ8_G4 @a"oۜtfr%Ǐע5j.qs#vrO͛_J   <)@p߈{ :Av6с۰aC1ӷn\/\8aG>Hx" ߭X[oiL?dS~ 5LHHҘ@%"%KF &}{oG1|22љ1c^bŊ|8Ҥ˛# ~:,, vOa.?6#;Q»&`eWTI16r¿={_kRQN\B !/gQc=&-Z =1>'6#DZDmwQ׉O2eΓ#FŋqJ;vo6-Fg΅C\Bph?(7U'yȿq+(  M2zgկMj /J;T#jzLŲb?\HI5pzqO>pi E9t+}8>`7o^4AA$@$@NcnXgRWW WOsRt{(D9J`ienL~FkÚ8KKz-ܢ`SتU+4io֬P,|7y6Xvp#             W E$@1 Ŵ"1^zHb?.wybݰa|zqk&Cnj"G]vZ`b=/2zh}lX6mڤٳG|oŤ@)o޼Rxq}~~[7|#HD-Z$XyԨQq;Agx۶m]|:e}֭[9DŽ)wB|tʕ9 |7e Dx M8Q0 ~p(f4`'Hݺu{￯'qի駟|ja;xqA2e>6yw^H-$i;crg-w}Wpeo?{B8lС>/;qT. s!5h@Ǝ+}тΜ1xIAVwoܹS $ODRF o en S.q)Ӆ 9 }ÝNP>21G~o܄ dƍJ,YA b(/֭[~VjG[oqFѢEoSNz9=ׯC'JP\TPQ@ޏ ;{9-X8"n޼P߰Uvw8WghSQĤΡ܁8+ Փ^xAQW,]T^=CiܸVƍqGum d|I…*ÙDnR t}m+pmٲ@_a:q|B.~G:!!`QxabLB]ň#JϦ7{k9/:I&?8 `M++y BiM^+Wo7O j۴Y{ܹss_xԩ; q3}c¸ԅr2pꫯ֌+=ۯ_?ok8p.Yåu,',fă>v AËfIH a, ֩SG/摸^6uMGমiJNiXl2ܘ:o9o(}Hc(dl6EpƟ8 gDPi7 9nӢ]OtC@q` gF<"q¥E-6tX!0DX=Iܓa=W-`iȑz'CݖTոqZ#`IHl0^uq$yjL+uΗ^z E9Cdnl6m۶hԪUKy eê 3؀pqv2lάGl`S|3±cжk}lRHHHHHHHHHHHHHH HjW\>  "Ǐ1KJ`uާ~Z5B'ңDMe((! hBUx^X|w%r)} ~S"0&lVNV"~3xlڴIl_%+Hս<?-q9 %Wu%B؈ tMux{0n+>,֭%,JDDǛ7oDuHpyrǭ޽[Z #ygm''sɍtۄ>qB{DAMmcǎ%*+V`6&~n ;C({|pIHn8lvxGOH !쮻DԐLx0tH5\?^mՂz,{ #AN…P}\q?X0~B#b( g6}0֎w޺o 30?OKxD$@$@'N6 mZpW)+G93;~_n/ب?1@vPca4&NN`OkzNY8 <쳢gyFu3 E$@$@$@$@$@$@$@$@$@$@$@$@$@"@!X$@$A*2h 0}>jψhXA}ƌ_ 4-*{t5h/ƍ|cbJ+C 6sέM.]TR 8 _yN;~$~kP{_N8g͚U08s*W|/_^ 7o^X %1gԨQ˜9s?뚱 7Fl"^T jϞ=e}>sҨQ#A5.#v._.M$@$@$@$@$@$@$@$@$@$@$@$@$J(Joi! fw_rKyBט1cO? ԩ# 6TZjaQ% Xv^{wRTwJ"(5bXk51kbC-Q#FRA#(" mp/l3ٙs9̘1qٲejݺ,Xl;ᖩ޺UTIzhs_YӃwW['}LUX/Q:[G}6pmҜ~𿢃Ϝ)k'g+Ů8|1N8QKV=ԯ_?Gݺu#9?Xʌ@ ,Ѷ#ƍ  ]y1p)(DR'AQfa 2ԩr@Ҝ9R- kG yn72dx&Svs.̅Wr2c.,zj_3<3f-n{Nh&y= ] GP]vm vkb7:ÃZ$h  N>QMj}Qp8?7J      % d~Hqi6Ŧ! s,? |Mi.ٽ{w^s֭ZP4H-[df-6ZA@Yx/~ 5l0QEȺܭ`?mt!E4rH㏵yfu!00 W^8 K)@@ۮOӈ#~ײ裏/sw!=?_J+V;6hN:97T\93*K-@@@@@@@|@LxNrL(iO&gA m۶ !mܹs0֮];L@g[:K[_|M>]֡UVAȓجY3${Kns,wd膝;wʂ}> :[@X&Mp }ENT|Е!MvᵅoYZ42ks0o߾^z6$',. Ud6m Oi߫)S^UVڵkp`ƍ/`A3ݝJlblcB,d -,֎,L&$&5 @%4W |i3Ν|S: s̫R,\F;7i  )TX1x@-[QF魷 ں,ntU\$$W;kRC@ ,_\|A΍;X0?\^'` ,>'Fh}Ƭ)ʱˍ@5@@@@@@@AςG @F x\\@WFWʅH`ǎAuڲ/ ={v T^ ,L֭[zÀ`^7]vnݺҥK)[ufHSOI.[t-駟tZ'{PCȂlر#K Gs ~@. 糐ʕ+uۦ;xOc>qxmu҃FC/.1cF ;Bf ڵSժUC_/ XdIp`m}]eXC 5v``1 `}5kVԂ6mڤҥK}J ™|g yeHo+4ujP5[ߠu*z;׼y;- EA'#-˗/ mbvኅv9do3Ѕ!9.W}HsJnYX,0O׮]4l0nBVr,R#sN-\08nc?ھfÆ *RM5jgƎ!7nV@ JE ȸ0h!0L^(qGÛ@ F{ F`ȑzwGi͚5,;f/b@?S>eAP6~'ڲeKO̟r$%海Y?, yjժd={vNrE*6X`mm\`n ur_5[Xp17ظ~ضݷ? <ӥl `!- 췘??Y r?TR%I@ &X b{DBzB, P(b5ݻe7=zƍ'jͪUwGqDpGs$Fڟd駟) Q |_04ҨQ'xe,@B̟??`72~+6.[,xSe"6Z_G2Qk|Qʕ+m:u StI!L= @@@@@@)@d<5Y R?4nBR,XHuc G )-kזBZMm^bE5j(x?n (2̟0eK 1;?ر/FF;S !YAl (*[?yqTꫩ+kF ؿv 4iRhmdv;n}ɁX򕲄D"BɌx̾+6ZJKvd۩;9kc^~iS ,rxP3  F~!v3f̐oh7m'=XFLm>(߮M7 h} p=51E2j;,F d>}m޼9s ڭ[7u5xl7crrR)%A@0+\:v+6i7n`_u֗˦~ <شiSpQɨ;j֞f͚`=Rjj~@@@@@@@ >AǑ WX4 2pIB]|'5Zx^:]޽;gmvquZcݺub+ ƃ8 w:R׏bW }=;+F5 k|ak U4jt!+\Hc?m6]lYNxuf# m?a%1 PnvoԾ{>˦PS?xA8m-. شr~Vi,0btirx} Iضm[3رFKy(]toة'Ď/4Q ~{36.;A< @f\wY+%B A&Cu؍h *x>`^xi_-򫯾 -(Bz|(iٲeh7V7W#,{C78S@IDATR`~G]vءCu)s琨%M*z2Լyr@H΂&~=?Z;oX/̞[Xw~/[?13σ7isM-ԂK@@@@@@@/@dY R-[~Z4(EaFunil74,l:ժU B^,%hAM6%6qؾc֭ڵksx9]yo]R?zmj~쀥 |Ե܅nrwbw6Pwu % ])vתU+GNOjl۶܏-m}l-{ زm}mc,m5H~*!<v2X!vjw_`m`1bc`S؂cqB۴iS.$ ~ގqP \tȦM4Qn݂>8wʵvw #0rt 37M_0h 4q 0h gcQ*U :R[mmm#=a(O?lmorov?,ҞG"\`-۾6F۶E .ưƅҩf5A(+o[nЎl~ o͹HǶ#ymib# yb[x,! 7;v?V;g}KԾ }bDfco~, @@`O3ԵHT " wǎ 8v u8ݟvئmЎyl΅Ğ'i~Zkcc6Jk&S(ڑ0}QC·f۷oϵRlghm۶ ٝ5fLSMr;wSJ͛G!X_w_R@@@@@@@ &b!>\SOr6ڵkW[=g|ĦK.yCWl.wP0pd,2іiUv9X'½7 =FF(hΝAZ::Zk֩:mbqYMm[Ўur`mj)cvӬy1 y.xXlkmSѦ_믿۾:}۶oo`?ԏ~`O@ީ/mc?M~otئv~nsئ;d]pjs\;`@g@=HQamA)m m[b_ۆm!v?a}t`S[yxbo \4vȻ}!X!1ߏ;ľf yGۿ2XΦ UV۷Ϲ9W!€  @\@Ns );v ƽ- y?Z F~A 9Οy߾ؿfyS`cs)M\;Iq^sUVl[l?s&v>݇4vw9޽{ϱkz0dA@@ F~Y7X n{nK}?FZM]o M7_oϭoov/>oV߶޴߷֎q* 3> Pt;?ТE`,v>v|7oPYf}b P];bP9x;Oϯy;lM|݀l= X$_tx@ >EmBs:_]vIj˃vJܖ;ZcbΥ8sPK-;obkSo =}5q{#Kw)5m `Ȟ=A܉,F@@@@@@(XQ  @Z -1K:G |H:uVoX^mSw;w<E,l)Ot'CVrSmwh);[И NvҤP~PnB_ԙ|Зmc/,ԿvYg?SK~v6g0 Eݺ]RR Dm’v~`7C5M :n>c #T~ksG"Ŀ#Cea  Y!A,@pv^nTgcV eeboy\XLc/j^ߙ J"Y R&blw~yckc߮6M}lmOJԷ)fJ^zJ#?,w"|r4cB. a6@@@@@@@ 7JO`pKQ!@uT1^GtŽ;Fk, '0ot)0xv]gU#Ǝ;oo5R/`CٸJ_}UzP@@M\V̶O"@.!%}{ H^taae@ *@$@2S }T2S-rF,͙ `HcI i餓Z_       @=_@LغUz s36.0sTԸqKJ<-[˥3ntŋ~2 tgĉ[&KB@@ X`\Y @ ֦kmˀ@ ӧAY@@ Zn5lcҮ]UWIuJ}Hݠ@@@@@@@ qA&Ζ%#)xuɂ.(` %vPVRi~]f'N5$`τ ;V*_^:¾@g@@R!P^4X7DZ.Ad)ذAV-~cI  SG2wիaâ7ӟ-;&OS+R @@@@@@@0DFy@42D:v4,j      [ x<@ gK&H^P 3%X/0wtA%_5"% ~J@  <8jN}@@HA ( ɟ2 & iP@@@*[6ڧG iӤ/>L_UK:\W C@@@@@@(AQ= @{.z yA)d֭wIv$_oV^ֈ P2 E*rx7(Pڝվ~F  @L=kF)`mkm EƒU Ki(  @^CKh^xa4ҥys@@@@@@@O@4زEzy$ F`@-`!twhg@~gK[W^GرRŊᇇ p \|T@@L 2>Q*ЦMڙAa$(  oV=ZZ*wjUۤ nݤO@@@@@@f"²ӧ ='YUWedP`,\9y"!ڪUT*"&`A={Ja:$IB ܇Anݚ@@A]+m @: hm93kA3M LD d@H.^-ԹRѾ7$M ڕ-*@@@@@@(Asb.@ -sKTfZB"@AvPٲP@ Y#غu"Ȃ J"p5 /d)@@"`AreQż a]k%2lLv = d@ 'H<#-[&M$y4rԧTt%҈/3>qj      % Iu"CT(/0kԶmW "Jo P~< W`ΜAK(@҅JKw-̄  %mX<:_@hF^ cG4Z02  CT)#7~tҀСX#@@@@@@@O (1 J1Y|g @fΔ"!HRJR_7kD(1RRn_DM7IIo  $C^ZL6@+`7^ ~}ի4@@ ZI&M$-]*=dW\!GpDe"       2 B,җ_JZ@ BW"!H%:@G`Xwol)3%E [褓 k )  %Ptы3f>k㵶^ke@ 6DKPZK@@!`_.)^-Ԩt}RRwHSHH2J:@@@@@@@w֊U:'Kݺu, (P`iN D$PA&p,@ I%`,,iDϲj#  d L29C"`Akm Z`h WOuIX?  @*W8Cz%i*ih騣_oPjOg@@@@@@@ A&ޘ5  6L+*V5K*~Qle @fϖZNX  @\f̈^@d\8Y@aI=  $CࠃL3@-`mkm Z T@@ٲGN:U2i$ZΓ^{Mڸ1e       @I,EB s?H+uQ*3M TP!-X jP@B +U&u\70J曥[?P3  @ -+x+ @(z͗T XdRRժ. G@@NwG!-V.  ٿܴ$LeA@@@@@@ Y4/FB'0tpacK G@ 좠m3TP ̛'Y t֡,BG`OL|fe(KI @@ `AK ̊ Zk%2OV̂ +WyV}T@(7XJ2$[ 'iƌ".@@@@@@@ B|VTw9RY.#E5KjӦ PrZYrK$K >X:d =z 0c͚75E@@ ABu"^ke@ YFK@@E~;^x#rcRR7K|"ޝ.       AfN@ cOڼY瞌A4صK=[j6 MQ ӣA*dP  |#]+zHK奿=E`  dAn M@[z~HAVn@@ts'(=l4qtp޽uK/~[ں5]kI@@@@@@@ SOz!@ ̝+ ,R_]*!X@' CP,1#z,.D2B`xZ5cnj@ t/]yҶm+B@@ c,҆KSEH_ 6߅ ӷ<3̌ϑZ  (C_fI7$͜)  լ)v4tfMK@@@@@@@ H @ \wԲtUiZi/`JZNPR`t  &H={rOJ6H/t@@Y l;dZ0 J SϺ@@cn>TZLzaiv+:u#f7Fg@@@@@@@R!ePg @ ~[z]ǥeK0ގS.jP\ m Pl~͓ڵ+"x# @ ƏIY%Y$PtR$E  $QfMiKRV k6_ B nTF  Qڒ+iHijWCԬԱt_q̎      @ V@ [H_/sԷo*J:@] Զ- ٳ;Sv։ Ps+,A7$w);@@ #PtAŅy@.`mAS_/U  P3ϔ^~Y飏_|Q5y5҇J;v̔@@@@@@2S \d~'YJR5H Y6mҢ>]*WNj2F@?^X1z@V! /8顇BR   @ 4lHd~T T|T J}֍ d@ٲGK=&-Z$}t%'H+ժ% ( &mڔV@@@@@@/@dMY" 0@֫հ`@`Hb Xa@ ̘ 0H@0A=%7K]J  @X,rɒr!E|-ڀHuRZ;E@@;K#M&-\}|y4 fM㥧-{x      W >@ ۶E.jw4(+gu @ᅲ~Q"2 OHRIZAE(@߾R.CbffA@@" XE~o@Zۯ3 *Sv֋  7N;VZJzYR%nLؠtҟ,͜*       /#CVy& fEߦM~=:餓\ KY~m5v>UHAkJ,릛nR֭->訣҉'X727? ,Y"-\H$_-`߼f_sU\Y5C=裏jKR  `A;ZgmO<+n꾷uת~"ѿ/K/T 4ߟS |9Mu}Ю7CA`/B z~aھ}&M,SN⋃}nC^tM7iܸqlٲzʑ#G7x#'7믿 E+);.XVA fX&z_7E ,g|pA;dpx|gm  @Qj֔;"   ж9hE89d L8C@H@zj ܴI߫\X{n*Ut=sokC@@@@@Ot~u@ ̝+#x\Lj@X肴k׮:#եK K=sug[p~֭. d/Bot9 鲠E Q B8 ټ'|ryB رgϞh_6lf˱H6?<1 矯ҥK@wuerwc^#8"0+V!c(`A.P l޼VvX뮻dIֶkN'N ~ܪU/ D1RGuN0Z(%\炶cƌQ޽?!n[fW_}>`` }ϛ7/Wk\z6^W\q;`H$Öc( ٳgk̙ *_0d ^3ʀ)okf`x'9x&EHV d;9& @6 X͜}ڀ?{Y^U&ݬ@@d {ݷ<wՇJ}HCÕ_v࣏;[*oKG@@@@@( 0pY  %ض-9O%[F-0z%`)]LąrZ|>},+¶y=ܓ3'|ֿȮ]]]WL2>}w\0O?B(>hɓ'Sq!&Mחky;y>jԨ`y.x!s9sviK/4  W^k<@ _RHdȐx/!?ueRJE\n΂]clѢE䧟v5/g&c s9/שS'RZ;6XF#.@8x`oCYlٲ+Wmܸ1RVsqv!#5k֌[.x>a„<[^ժUuyi…?~|0϶mۂ+">;w(կ~u|9.LR.0R.K-lڴI5|]yA\r-'A`\iS8,E 00e``[WӻwoӧO/}ʞ!3'lol>…}Ah † /,߶۶ox^z%r)r9O>pܹ~mSW)_By&Hπ)fɎe}Wz뭷p<%G@^F;uπ uH5jD4zkߧ 8h$B@@R-p(}`t]ҥr}a5N~ZZ%%@@@@@@x DwD P"g^r3j޼D @B,L#ڵk5bĈ`1 {o2?6uuV-~wygNNfc $B`4UL I;vl maÆs 7n\5jT>l?luz'I>s9wSO!oݺ}D>^.>}Uz#d=`o% _Jg1g7)  5"r_FH'-Vm 9gR^ G@@ =ur}+%ttAr7px@r]j5X?\h/o@ @@@@@@ AƝ"kC:/w"cJ V'ZA uzaBbPR%mܸQwXpaޗx~=rnom4|p+W.w,L׮]\_iAy 1cgɓX-[\;XdR X8D J֒%KhѢ\K~8[hIlϸ|ꢋ.LvK+u5W>ٹsgꫯN>Yg>"/T?4I.hT;!>!fiXiZA8x&$_M A.^,w%m@@bڷځr~6oErn u1   @\Uẓ7~am[eK[%럲{w7V-ˍ$}e@@@@@@%@dx U3ϔ>Z/%"pY.`qǏϵ)S{L}O?E5sO:u}gzvmiS s=WoU^=zzN8[Mʵk+{uۭzK͚5Sʕkԩ9˱[A#eY]V2XG󶟰] U,mp% <8=_:(-"ۇkꫵb s9믃:}ǪQ}e'LZ͢JSUB,`\l4gA)?pA(gѢEoua'"HkK?kaX vکW^Z;<[m!~OpNҶ f.Xfv>YM@7K&.9F3R @@ >8Z\wڇ@ ڶq`Ws$_h ^=dm  u!J3fH_/}t)rx3ΐ^|QZ6wM/1^n}8      @\B܆ΊDld@(/T|U @&Lpi]ZFE\cą-F*V4hPąfE\Vąx맟~t1 :4Ҽyӟ7n\{&M`^[_F"cƌWz˕+E!C3^y's^ڽ{wM6e˖f\WiӦ\XYFΝ^z;FH#7pCĖa#^ziąsg*ٲeKwA +VH䣏d@|l} "ovVZN:O`;+Dli7ޘkzaK.$g[k6muL23<3j*ʜ˃m-/RXF8㌠VݻG\qąGlqiE|dĉ{ *_$mDʗD^x!IH;;" #+X 3i 6 W;Eζ)| %J#iaeAQN]έ;*iN7wkO*Y  +ti>~E"ToHG" ^rf*     @)+ 2p ű@ +x@i`3H70K[uwF۷ך5k4}tG=BB{A/O5ӂ7UʅFinv;wwҥV͛7k޼yj֬Tg/0rtI;tרQN-`l fҦM䂁BXmmz}Pmp}mGUVm_ֶmTB`J~{ݷ|,3ZO޽ ƍC]T @ Iw--^,x㙬/@@ ᖬҸx |kÆuI7ߜh2X{iXa9 ԣWWiN׸Shj@IDATOY  !lwޒF6l9D:Ti~^%      f P6x7ސ좵G6K@ ^OE?=\hb5h jEH{^zI.x4=K)W 62{9_=sY  2/ n Y( U  1%u,=x8GBUk]Ǖ3]vd=Hv՝ڦV7yҭ@@LرC7N1":.YbAPH 2S—-ժp!@@r l۶MSLsnm6.X  i7y*vԩf@{yV~T@@@@@HA)g v1)H}J< Q {^/N*$uݣ\RVJ2Z-dt\ ldػ ԫWW3FOoϘP2BL2Zrꪜ ? pjdu   @^e˺nA-[ s7>D翯cК5uԠAK+KCԳ,իK#GJ۶]2@@@@@@@0AFy@ %w4m  @Rb +/Ȥ2L`h !`A=zGY)%*P\9 >]RW'׸qkz#  P" %w8A%R @x-ڄ g%ٴ)Z*U2@@h.v O믿ڵkQڋe2miSMyN:ϪQcN;m^zIn+%E@@@@@@ ` ;];R_e**0k6C+G_Hݺ@ ذ!z4A|!@wu'Rժ.    Pd2e ,2o@B,Цdm $C d(@@J&PZ5_{ƌ׻[O֟{l%խ7mvFAf͛5oVjѢw#      Af'L@ W^)RϞ)/@-0sd0 @r,!k䮗!OϤݻ#(y$W^zz7)xqr@@&M˔P@9 3 ͛k\9kc   e˪xuiذaZ|.\_K/ Gktuոqsp |3]~n:zU{0     ޙ]5oҤDI2EJ4"CHe)\\p<%C6jR"C%I"8:w3|a ߽Z{[(D,Ļ4WcpBʃS" "(+{" ԫhPLD AmD"" "q | 3~#(sB!NJ_/3ߧ" " " " "  P[?$>a B3f1ٗ,'AذABA_" " " " "ʖ-# 70ohp5E' ԨQ4ʕٚ KD@D@D@D@D@D@D@D@D@D@D@D@' !G'pUaE"}8 %_D ' T~;p@Vw^/x1 @j L-e^]+_883{,Y4!Z ̍X@q;y&p-ҥ?(~e0'\rQ1g̾c!I%$O%" " " " Bm\LPG&%bv"C2WRx@Hdt@x!૯w@zjsWD@>*ڵ v.-?OD@%0gNѡ|s qcY6פ A*D { >P*g^ND ]g ];`Lc]囜@tMxqZ" " E}e0'{ٗ,'Ad}B/'P0p 5ȑ@FaEkn_y%0s& ezCH sE@ Ue]??}6@ȗ_N;Ǵ%" H xJs1u.֪ԩ;qVL I'm?e|!@!CW[R@poRT䓢#^ի )" " " " % @j,:]"" YA}c_0X}>KB+=[牀;=x)`J`TGN]vѸ1c&+wJ@аJ@@iOa^'d@˖@ٲ }ڶ-/^RGB:։'.YEF'ED 6M'z>ܭ[ȉ&P cneo nw>d9m*U W'" " " " "8w,Z̛\p{j( /CB$ !BJ@pp?8xओ7F. (HD@@f#v }C`, ACR}1n>GGD _\ ,Y"!|JGaX6 曢rXNBhme0cx}ȱ~HD?$h:Co?x0Pf~+b" " " " " " " " " " " " ";$;J10.(d Ǐ_w]E@D 4o^$z+%4*_>Q(*ֶmHou᯿NK]Y mdSx(T`ǚ)Vr:㨰M@ .HD@D@D@D@D }hsE␜ǁ-!/(xR!@tE{E@D L`V yС //цL>ArpH2Sk@&[\DD@D@r}r"4U*vuz{`lSN^ԞYRNKD@D@D@D@D@D@D@D@D@D@D@D@򏀄 *E" x1o{8@O" "@6bmfs,7D6&Mʗq(lj;(!~ z|!>a w,' ysqT!?E@D@D@D@D@D.:Xx衢"/]h૯zU`bGM|Xa }};T坠2aO$AQ5 w 4l4n \u0kV-O? 4 x"~,m?Ig KCPl;G'rgh-" Ay/Qr" !Q#=)@.@jE>r"P((ٺuV'Ю;E81Hȉ' !|tTD@rGL5D 6oh*" " " " " "@J@O+WSGm Ԯ s0v,ic((ٴ)GBq(N@By \vYxn)Sa߷/0cp!p@ժ?іyuM ۷OC@ B$@~<^1@d9ٳ6m<@R:wF}:௿B'@dr%XD o}t3f߱'aT,?E@D@D@D@D@D yvŋs!C9s.enV`rC{D" " " " " " " " " " " " "iBނfu.[Mt/3*vk>vmh=ڻm_eLO|YH]ʕ+E1C7s&0? K>@ ظq]vͧy˻vj&NGA[۲•,7v+7\9,G*Vh $D&fM᷄ +D  pE"믿v31nltO\{Y7jfq ;95_Ҧt@`0]_2#ٖv n-˘n^=Ƈ;v: ];k;.C4~VXiVjE@D@D@D@D@r@fk~xiT`8rw ]'8o[#k!ȶ׮3]7v];l' !lC4`"~ ;xw.uaHI[h7ݲeIz .vE>[Rv s>;vRR%]reD.; X+"PHh<{ڵvYH8ĉP@ ݛ3?]μ:E\t7Gry"Mo)RJRvi'TV.<.'FԜJˉ@$K2ŕ!,G\ĕ%m)?Ə4^{ h.YGrg/lG.tvc߉>M+. n܏aB/pavkgִdi zA~9c5;[k5qx|tt㒝0NfϭɅnۭ>Μmc-R™"uOumw^nAvto5J a~NZ~0]od:XhbWGwwu;hkv;q#网Hk֬?իW~ D9X=h>w>.k.&| xns˳#,#\~wd|ht 9XPmo^fm'R5NQŕcļxve[EwuWf͚V\d+)Sualo,O %]lθЕ+d "lwvB/ٻ ϶ ϵkwӦ[eѿqm?Nq\_[;ן5؎µW0L,ɮona 5Yʥ SWKWY'N'L7\uױfvnЭ'^ȵ^ ݸ"۬)8ߍ+bB6zgЮ0º`pm \kkڻxl2krC[g?׾m9ƝjsEUE@D@D@D@D@D@D@D@D@D@DH-R$vz;U]*@~nadecc&;\g`{=(fcp\\Ge'j9ױK^s BPWGPw}6^g=X|nq]\g㘝ޅr"PҀ WXaE7V\^syq 1q4iԨQx3y\. NTv & }G?@gLv5K,Q\sh u#kժͲcO3e/d.,kD NڷOw /HcY…S,?"/Ƙ4sb;mrk$}Vui Ļ$H%EY~+GߕG0ns.:OXγ`957`…rABmFZJvlǛ;w.fϞmsǾmZAEnS\91G ~wv '`ɺ'N~8,of͚٥E8C>XGD@D@D@D@D LW.tIARD@Ll$Dn$\msf#]߉ ۮ}ޅ1ӥ>cow(7ؖ~׏v!p}_u Z29a[؆7ϬSٗ44˨yXI#D@D@D@D@D@ Jal% F 4ir,k;m8$ұ=݀648A#1I5hK-6{i?F3(nӻfGtmlGrle:(I[Dr=g[[8N!Xe(L̇4$EBR4uٜ!x>7P;G;Xp`XۼV؛\rt5#v$/X:$hɮcu(s-iж"b\K.ª~]Sd = %.8'm3p4%X}?3VJ64 +Y޻Y{`J6,)EQyv:uؗ k#:?Nlt0xpt,P F~Qʉr:ÑGi}{q䷢ _"²<]]e'2dŘ>}LcO(` q[Vni|r;*~Ϙ13gĬYځlc۴iS׮)v8" #ZPK=!ϟo^=wy'(To BRK֭Dr0d/3." ~^M[ sC;}ַپυlwwCϝpa_~g`['nsWp6[klna 4ԶwEB2#@GYol9Cn61fib`- b:uo쒫ܸ$fۃ\v`,i؆&vkglڼ6} mik/'" " " " " " " " " " "{3F>"KN*:gĈ :hdK#ʼnR:mg:Rn[FQkD!qpGCm;v;Br%"h9r"b X&8_)PPɉ93(u^4.y(G!R>t~FQ/ xD#}$pu / AH {`|vm+NbŊv+WXFrO}ʗX_2 BQNKGH>c,7PЬQF(]8L'7AvM|!q9r$&Md90K.ڵ+:uꄝw9_t2~xL0'OڵkEϞ=qqǡcǎ"N}y," 0D |A̍v ΍*"i*Kw6ׅ }f]^:G1G)-l64#u8AmطL8e 5 y"K A'@kTgnmz'X# rcD \nݍ];E$X;N Ꝙn >z3}G@d,K7X(DWv:WLeь\rۈf&vc= z rpe-[0 /8rzpv0cg|PWE Ufoॗ^ĉ@Ν;cAmB.Gaر5j>S+y '_~8#S("3c G+"Pj,5´x`>18D+@Ji R@NP6ElNϷkN&#ُ)HۃJʔ֙i#~* f#3͵d|9iTSӑ5iW}XL㦀D@D@D@D@D 6rΆ? ( q8PJ$rƍ&`kډrj ҦkM^0*" " " " " " " " " "!B bQz;(H/:^1"pnaG c(DJuYqH7Ӡ~83!),;f\`@FE"]uV[.v@5 \"i˖- L4. ,-[9蠃@a֭[E8d.ŕɻзo*iF9sXNIvyg+Xf9#Bj7 Nۉ򻙎[l>Z!bȥ) s'0c d @.5Xm} gaES|( \.!Ȓ5yC@Bq+k38};7X@& |NPmG‰8!m(Ƕ}.6UT@d)c2P}QS~eʔɩJ2n"+" " " " YEcf@{*ҾvV?M.'`{wZȉX+W 'p'\q8hsvږȉC@Bp/-39Tnsrv:5jX79^͚5=iSDP pfA7۠[/Z8c;i|F.{ >}:(AGPzvp5oQD[ b㚃~';*߃6mCa&!RG=X uliԩSm2sL+Ⱥ(GU1r"֮]Ц6ֻԶm[k۷!ٖga⩧-v_|E#z&q)XII~Ĕb< }Yw?i#BBD@rr)' !3LfN 30Qa@nP^t{5k>Cɉ*WlS쎃̹sMϽb_:88*Nf3l83'tG/gd6MD@D@D@D@EhsN)NzicqH͚5 OA|OٓDryhαn| V96l͌_H g+&)I١ÁNΠ7n\l=vGND@JJN@8mAׯRTF n@H J+wN8MK|ӟ"Ee}-E(T%K@7vטQGΝ;kF<_ O(QR'OƄ 0e;؍4(SȨ,E7@f-_~<i/žCԩuf˒MDĚI7009qEU'yG0l0^ ?2 $ VAZtڵ(" "iP& !L7j pkt*B-ٷϾcNvL AlqNd(4P;ds̱ (e ARGfС?MR\D@D@D@D@D@2I,bƌI#8:pL't(IQ|9-?ȱ\5퀪Wr&tImQ(" " " " " " " " " " 9N@B9~}g,J!".4`X׭[vRt-|,W\pD@D7 Teʔ´yG(<#2ٰa~3f]Ssv (BA4LKB,4`8 q`ܺuL]tQGe!+W@(}ٲe}rժUmvm Wz2I˴xm_{( ?yu@Twx"dz;jՊzvfbau`D=/~qGFz }->ht͊I4wFa2WvL0cǎX ;u 'W^RJ.'1q?t`r]I`̙8_XȫϫuZ p+ v 0C52-/" EP *IdR2zСQ ;")>7dX`Wn'5ܹjذaN#ERmg(2qDOhڴ)vZQtupiED@D@D@D@D ݀m4ɠiۮ];iUV獎d1f[-[ࠃS-<ȉ@d?ٲexW瘢GGD@V@đGOz?袋A}ЪU+ )CiC[ Qbz93ΰ2o}U)"0x0hLSD~W+O`ܹvFSO= @NRτR~D0a^2ʴo{xy灓D'a!*LY W?"  ݑE~>C8ɩ?Mr课j+y{[bK+" G rb ܧ!)Lu;SD@|d;$vj8x[mzE w^ڂyVSN}̍RX7kV~ J1GFivflcf^m~jyD@ڵk($'#ؔ [n Jr%HD@D@D@D@D@D@D@D@D@D  AƁoI2j(9krnƍqGSNvoΦ%'" "PD?&M'ӧO֭[qcʼn'  .#<]֬Yc; ;L(H̿~i0#)n{EFtsG8L'Nɷ~< T: SN:W" 1Ш_ǣ>3gZ1K.`Ǹvxӎl D@3f 8XEv`DY߿ k׮iQE@D PT.pV ĎƎ;jH./j~^{ ?`}<)ڝ>-y7l?p;qdʖ-hb(mq-z+D@D@D@D@D@2H`֬YP0Fkeʔ`@6ฝ3fX;w7nƙưC(+N" " " " " " " " " " "(MeM6َ^zY>ll޼wy',Y Xᕞ={B"Yw! I֭qWb?9p}QF6+Vd8 W]ug+$wW>S;NZ|G90,*;w\f ̟|}$}wV~Vtg5bj_H2}7B!@ +Wƀqg}Zj裏&LqUa#`]%YXw]MK/d'Qׯ&N@&K07ڵc;4E?,'" " " " +´#@ l׫WC A۶m_cԩHO>^<7xMr}ӥ^FeKޅN~fq=;s6D)-q~ =1bQ޽;7oW^yŊ%2)d8蠃'GFcvmC #p?ٳ' LB2i|/~4Lђn̙77FI&YAt' +w|:t3r-V1Dx2'cń˗/oy љ[#!BJ/̓ ߾ tSO8\~A%#?ɖKQ=IjժaP?xާ\!д)`r" y@Hlgk_}9TX1#t9$WN"G{%N$Lo*<\uNq|3`^}zL2}}؉Gb8%雒NGAbvq1yd;ذaCA!];wy\+LYuTDH?ڷo;~wy˔+:H*9:c %[rd*ljza}F? 7tc„ ve*U`_m-iI^/l +),zm!u`V )J#@SN9[wJw}Yf7/`J*ri[R曶nJ} AD@D@D@D PrB9:@L}ߴC32]GNg{@:?ɕiۻ$2qWi7W~\S: '.y:f)[j]'" " " " " 4h䚂TzGѸo6#{CbȐ!4'#&5IL@~$> _~98"E]d)bn$#*%ۖÛ8zzh;Xv2e " W]uUI/?füy"Ir" " " " " " " " " " "үIJ,7t8smGƑGe1LVZ5)G-ӧN8vmO^x!=P_ϧ7ў_>Z2b_G}ͯ(grIM6ȨPy}HtM:o޼ M6;SO֬YF#Q^Lx c9>,kPO(bx2@ȑ#B,Oθ~׉D̙_ݖ|}Q+5h vi64BqgaoAy|v75j֭[*WM̼}]XzjLo3Ζ*:<8ugg']v.t!Q)vA.R,[~Q",Y0 +_w} )j6 K\֧8.`+:^\ͱ zPYX=3q=%A1>` Pԉ̓ o&"Z4u:mh"hud?mΦA&5Jdx'e׻4P6K,k֬} xDx} mMb~/'O)h3~ '-LtŻq?qM9+hح[7twƜe>]'dO>d+qL&1JD~섿\q֌pL+h_M6sαc!d'gߜL V}럟zDl9ī icb8>fco(NEн{lK\8hͮ|v uԩY9N'*n" " " " " " " " " " YD ȥ UT)tw>` CF.d:CmٲņdDBFL3K!#2|Ϟ=9c-d>#TN'|bO!#ԩShܹӧLgnZjv]ؿnwaÞ0aBt}\sM= k23q<#2!#hA&{ʕ+CF8p`hɡym1^292aJC;C詧 ʹEL\gtH\t܆89]"<Ljdkܽ1 >3<%7~)롏DiK/CF3dC?^~δ[^#xgc̳Ӷm[{Kuy䑐 r]PG}@DX2⥣~|Sʼn}>XňM8oeoXy#'72Eb%]4nߕYlbDp˖-C1wMywúPCF9ļ e O(I8i=<݌-SzVxA: 3d:?wn5료1,v1PlsC թS'T12 f9]w#v7Qz_mf#|hj&kW]uUK*ʘXF|ޖy}Y۸p3b&qa{@p؎0bDp'5Gȵ; ktˉ!aC6hud?mL_[D6o{@PD}#]z7b!3gLk̄Ķ>OdD<خ>i^}fRᐙ*?qĉm-~ڀɎa$ڈՆ8Vb]8KG8f8m$.(dޓB犀d' fG*!bLt~z-{^~h ٻwo7xDl8zgUO={؏-OLTN1^8bDC|m$5osˆ 9z-Z E8I'><)JȁFNO 鿟x'z\</kvh3e>>5vߒ%KAD<gg̙w΢O?̢(B&vfmaÆpXvY߼ϻ{jԨaŭ;#.s=:>>|] _g#QKrň70&wR%JGio;~{ۃg 1:~wz ]mxNzyZOyrs023̙3aZCyWN|w%d AR(̴\L`Ez_`幷zkL34uoyh~tMΫP=~lPPLhLnLoϙ3tTR 7 ƌIi0\r'9cSw?uW[SO ?Px~1<7\$1l$84l7kd; ]Yf@`-*!pʣ$ {ܻi(g%'"@ζ`ѱ#G"~|NO{@O?}99"mئaBi c9q7ӹ^xg?pC[pbDN6K{1.~\6g-WtEO:70 _w涛 *}E@D@D@D@D@2D`vMO*1ưu'ɋe)w<:Q._c=`Del|~˖- #wS̠N3jֆ/C t8;j&5T2mxm뮻T^ļGN`2G`s722w0;0իW|385Ɇjذn޼yx+XLL~Zj٠?<0ݏ?hy}Ho^k?q"[/w_NիŋѠAp9gt;ry 錐]gcߜd3ؕ>N|7laT>^}IΙv{O-?̀a<׹o^>mzq~(Ya҈ۺo/k]z:t6gĴm< 3gNWH4?*Q(h㯿 'vkuxz(ma8D3r '0+w,w̜h ylyb)f,A]O7Y`AP^E)K1$s$yןwo߾Vvҥ8cA[yy;㮏NgW$+.i:Kv]81xu?j(Hy,> ܳƎ(в.\ɊBxXp0׹έyh ؾ}{;k<_:>EiKCW.D$wNuh{#L+Mq''RmTbIX~*/Ν (+IfTunI34!w`QL(@cʕN~4a5n8'%K杉+?,I/<|ϻ9߉΍u<(ꫯqgqcDܷ4;=y/A0RqnNBЯ_?[Od=i 5nz7vٲe&Mφ?wazv6-8P򠃂Q~@h֬>㔶U2%V'4 ;W^}ݗtTJZư믷pe”t8!E@D@D@D@RG4~"M iӮ@0hgs'Hi?̗ؖx`kHUooz?cƌL*?<^{5; '`;GDS~'$^tm8~DrxIu:\AiƼy*I爀@ q7o t\R>!=\pz--db'a.(k?${-v߶D6)m:G$J7>Ɓ9g}7Ȭߦ*&Qr" " " " " " " " " " "$w\rvP1g;ӰqMIΫbŊAC`80EԩSn@+]tu]mPYtΟC" +O D+^|~zoӦ.w8CKo(4@G~-|ڔ)Sp5ׄ'pF^HvX$.3ׯDi+-k7N\[rwo\7ߞ{]v p~1a]׮] 3E{<>ȼ:'K /eڣ &.#K^{e(3=rHp2o4p)F@N8+?RDua$Xap0뭵je]{/֩Qao.n[Fٳgח3Ѧ#pX(L[?fbGD K v3G?Yx盨M0~bͿ؁RÃ}`=\8 zZŸDm8+5NG 2c-0m\\sE@D@D@D@D@AiX5[Rect1t0h7mi:(;1LmƓfoAz:Q]8Q[_D6-#HDrpӃ|~BW^y%ns9oVq"o* A3fӄ  8kY.:'FBa8(E:)u`G;X{o!;X&Yp!*;/XÞi޵^kEK(hN*_Gn#G~p=k,_ܞ?/￷ݚ~ϭ@1cƀmHHGci.بQg>$;iNIȴFad#zv;gqc:a^t7pqtktݺm۶>S婧?6Ny wg*Z:K6WZe E|8S ^K|4 ~pǾkZE}V|"㟉{[oͨplSW^3|͉NO_6<[%;iвeK<1yw9 &MZjGP|ωwz'QNJα̡ǓO>iE%|K \ G0^ B?3+I۱cZh尻ns]lX3,O٬M7w6XB=zt֕Vac_;37`:M?BdjժÇ[j|l8;8yMI멏e˖ٳ89~ sz˺h GWn8Qv0\^z'&>pqhʕ>SCI__󹃃@ Rr@ о}{ 6,eSqy[32.vk;{w}\ݎP?,[O8[wHF2DKR{=Jv?<:,6͘Omf7,#Al/wqGŮ(:uxuxoKL,[#6~vbcM^O[5kɟϾ^Nr9k,kKr]w;n֮-ƭyk7y'}$N|^5  J޽{'riT 'ZqtE=U0`yH2% ^ND@D@D@D@D 6c06rسŒw^x^t;~=^!9' t zh-L@:n;ŏ AQAL E1g@τ(>1+"0a$ (bE z3;=zzz~]u0fF ` z`:h+E{|Mgic~߷˴cJ«A*Lَ~ 죔AY鼇;v |z w:hcYa]*3vP?l?}wʲoE$$A0vBy:mh{QǎX:d9f,H0+U-8KkZj hK|U[ ͜0] Ha¢%_`nx6|v:tHAuI ~L$Q^ g&.vm0QM%/_0ĺߌǏO_*:,aœ^COڵ ֑W݃sӹsuR]\q?L&0&l0ĤIrYr{ Oի\kYؘk 7y&Qt({~O0ᄉj{$jժ?SĶu[mUŒ4&ʑ0a`;KI0V3E(c{^?]?xtҘ1c9dN iu|οꪫGmUzfاOg<|%S3XLe>%s&+ZY]v-%6$"P>벿;GRi<8wYw'a0q, .\8nukvBQZfܸq;>q_~pl 7,|#(dÇgvڛDs.$a=pħF-d@>-{ޒ%K"zG@EioRQY6O R:}//i(mΗszsOX٠-իWOX38믿rWetaoy0Bo4i$`DA=ҩsi!p> eFAic8&y\e+o!{xϨH0sVʕʼnw%_|Dw ژ0J%撐$:},ww$̮+a~6$l7aJ M(>oK^6.{Fw>-}I$U+q1$*0 N$.,a J/쳉ī&o&2%xC ;(fϝ۳nyn]& y|'c=«K;(~BE,e!?߼WtJ*cQڻp:c8%Ǡ=8#叐l?7KL5vUd[SٳgU)m5y= <3^GD`{0ccvѭ-Z:u&>S&ZR5@IDATv駟Z%AT2bJ]Y+b!qlr㕵L~oX0Cws5l/uuZF$w}g ZZ0LV%?`b))JFc0»ub5Œ&r+Leues΅ "yHur|_+V>Lfܓmr&S/s5; Jb>Ԕ~2z7/FFeUk\پG?FeJYQ=#xxguM&QҾ*['GHOOƴh裏)VV&L@޽a^xg`iU^B9=/Bi5`M0ٌ,x;aBy= Bỳ0{a}qnEO\=fix>]`^òtH7#KssxƠA`"Rc@h"y&S>L0k)'g.:mT8˓O> !-oJٻ7?u !L+D@D@p=z$}"P dblX8u}kԀ3fƔRo"PH7;{05uS8l0^Μo|gPΏӖD& \+W;pL-`d:U粎SlgNڕ7VQ&pQ_xꩻەmi_̛ }hժ-O^%̮lYۄ%SVxZ}:RRV*=}S>l4hv,(qo;[*[r_LdfW}[ze,]8yl#3됎cYǩh[GHe?܎%d(lDEqcYw,J@d8[niкukFٵk~ _=FQj)B\%/BdmqL/LYfQB+ԶҮ4Mh1vX <=\pӧ)PdQ#q5oyxQmN} [ʇSs  Ə^{ 7tS[V/x袋{]*e@Ӧ_:QxRZf֯]v,5N:$S 6,$mk'/m(΢ȲOd; "iAecD T?{W ϱ0 r<7f޿ =Rb;a©m[`-"BQu"I$k3!J>F̈́CB!B|qAs|?ryg:/qBjk:羴m& UW]7hi7mذi1˥}I jl8n2LhwZ1y!E>/ NwL\L7>fbrcy8 R;ѡC2k2 Da u,t96Aĉ;I&JK% Y+:GA:u*o߾8p)!QR V+FqKerdR7—6ȴ`5 饗yځJKlgƢԶҮ(h}gL~x衇lD؆ Ą/4o={v}8޼l[VZe+[|h:,qhܸq oc֬Yx'+*8އv>䓂RءM̙a=Ɲ&[swaNpط4jԨضP6L?O3_Z6mն|GX8]עz3*"PAlFDīM6٤{Ϣz//[n6_q2ڰ0X iu`@)J02h!B%<'P&5(p)"vhoڵ Rg:.q (sapj 0 g+^M}o[GݺN8˦-^ٵ9ĨMq$" " " $`E^4?{Fً4?\.-EFz.&L/>+R1/2qe 1矏o9'yq9vP(DWQ;ùa ڧz*\=sLK8+a_~" " " " " " " " " " "ak%,e4a>ܕe&@ƌT4fDR| PO7GzZh@_IJ#k8Z}ԨQѣh".8cqc뭷.}>}:nƠ?gA2fJ+V6mN;턓O>90,0bĈ@(Qw/oLxh,e.kU)f߻woJ#w3_G_5x^zMLѺQ"<P=*V=E Kt9x !0dȐཨK>X(KB @q]k$#i$l~=)nÃc-E nؿsܐbp;|A8Ι5h nG'߂c?>`$3ą^ڪl8_Zh6GC>4Y- "K*7Rě8j ^ί /{Zjx\dHcx}u~;7,R FCaРA=;8tA$f"7bĉx'1l0 Q{nWAh"" " " " " " " " " " Y# !ȬAtn:_k SNرc7nW*L9ֳJ"PBv,Ybo`„ ?~<m۶8߾,~ܹq(@XnA]yHSL bx @W^Qvmǧ[oOӮL䭷savQ/rQ|*ϽKcȑ#뮻W"=f͂ݫ PkE2T裏ƌ3p=N<#tR?*\}{ sť)3_ZT@PT4( AfgVvvС힂N[n |#H ŋ-pc{̙3x8#Pv8.I ` "1HI'd7ig>ԶY- "S6 %K4H[Φ][9L!%6DX 0@ы5?^si0:gdK/^t~8$%`pcG /8NpG[n(ڌ$" F`ʕ#iGq /r)EhJD@D@D@D@D@D@D@D@D@D@N@Bq?åoO:50$L4i{7ڵk첋Q_ă7|ɓ'T~}Bi0R+|/3k4N2$0iԨQ AժUDžV@ P3<3?>8|Ɂ! TQi/(Қ,X~>#/z GѠk zh)d+g}6xぎ1uN;M03HGݬ]qL `_~&}k(a?LYцN[@ĥwq- ?}jD@mf^y`vu]إuYc5{leS dX(S16UlbF^02,u\J" " " BtF3LE.(#וLAG]J|7Yhe 6ϾL>N.hk]U/vIGu̞ | x"{`QF?mb: Sxs_I@D@D@D@D@D@D@D@D@D@D@ v.ٛoo6n#(hٲ%Zj=3(f|o'" %<ѦMd2s2͛7Dpgo2.)c~m 6G!l vZdJ" %p"W_} b(נAV@{/^{aY7#aÆ=Рu]ID ECJ:v92A5;iLYJE(fGݢUZ('_gy9]} <ʹmc_ _C<3p֕I.b& }\>?[ܡCT^v0CbD"Â\^xh87/ԭ87}"|9`sXcIeX1y9,tiɵf`36Rʋ2sY~$q'@$AΕJAof?b@a/ dh74i$73g lۻtSr*+@dt3l8O/a$"P&e˖} )6}tԮ];p#PJMʀS" XnWz+nf{F,<ԩTnBd`'RD@D pəsL~Kv OlkX-Y`cI3ؙ@ жvLgz7s%qwaTڃ Κ5SN)S` ?Rq} liN?D%G@BEC4ҞaVS+'dhZ,$~{A,N¬E@*@믿G| |i ,mEµ4{Æ +p$$](T tiENvR^vL;3ɓ]4ὌiCU=sUW0\B51%trK15$E_3 FɎ;D3|%`yD ,F1UfM]^tt:swZVD = L1?FHEի=;I/=UW`;` oܹ oNJ"0kHh*d_~[o<j֬N;-vm3x7s^x :8Ju._\{HØ@_}ѣa}qgo )@!($B8jc Hr'#߫)ѥ ,1|\R( } 4eAqN,\0תjT)2{Qs̴.iU"XLbv F^g ~\R3, ER4Tժeڏ@!9}6΢e|Orb2ϵ_Tìxɼ7oOd5XlYыdDH S@xw/4 ` 4jHWxB4)~))۶m[FT)Æ']RҏE@J O? PW^8#%\lСC裏%ӧOp8d@83$ǎF^z 0#>8ED@D  Y(*T* AW?`naC`dx/ƿa./r}t\P>83gN0oFS%)J"P(x_Xrl8Yr^yQHSԂZ9QDӂU2|^ $s*H[p5*!x+:=s% )Q1U_jJq8řr~{0A.hww$MqN{;\9vw%T8&1)N>Yw4믏'׃+k "*BJ.S$!j6u␾P$$" " " " " " " " " " q$ !8Ƚ[X Ctkb>S))"QpUQG7 LA&=dE EPH`t?8:6(9͛7Gf@OVZ~4@6^ft3g?c~7Z>:!c曧؛V+}Sիښ~Ev"5Z֋^ <_~9u=z@׮]̼͑Δ2J?o"Ãg&>#x8ӂw,igú}p xi4@QHdQH{SXa sJ"P$^ ફ8L|+l0|bW^R 7m (\)H65p G*@T Pؑ>2Ex{ +|VC?ߍz nlHQ fA(E!exY) X" Nsd/E*/MiD3J/HfN%/{F߆뮱[&@;.U,8~!@&f{UCgW?! %}74W? s D+qaq!ЩSğ\wYB2۰HQiqLj BL.[59;W  :F,Y$PRX ˜P+'8ڰa 7p[Zhk˚5kXD|V*Xo89{G:iF®4Er'>9D8trQzX0ח`.*!gh3bÒhLEKI5=PxN;. wz-'43>Q0s_} K Q3w-GG`k#Sؑwu@4c\exj8s=z &|h+Bٳցܹs1Z.]_cǎȑ#u[nٳ'{/=uH{o&l |'s:@D@֒& !! '{&!p /~ղ?q))9ԩsd`ИB#_XGkg3:A8y)9W3!qũeo) %>)qnJ" " !a1Gve^OHmhFFFsås,$$" "1?{^aL;{-b:m&3mL;tgj"ft3%E>sy܆6#CX* |:o3M~fg*,(^lՍS1"V@҆MJw6%_aҸqG}Jʷ,?|:v΋zN WѰ)=׉:&: |sœ֖.o)6t@…ڵ yP+ Lkv`'A[͉RERIo6c޿cn%p,J{W9qT)o2"!_{=?i-98 {-+e ,)onʦ(dr6W,1  Afs4p'Âu˿ٝ՚t$@$Kfڥs4yӮ B`ɒ%M z%EK:{=R،B^L՗^T/#U\`@C:EL>@;xRoÒ5 6De A #zai>9C18xQ8FW!9(I֥b2$$Dٽ\⌜dQ'E!}/~)4d/OG_y;}|Sgyo 4dZk_mY%CF2ҥJwyak`Q⋁} 7q>^3K1cƘPpcnݺ5k/i-[ (򮩐O:5}Q twN:⏝;wp }0t(K!{w`⢰PH" q {n<"QD$Y^b~@ /4̾),<)}~$~Ⱦ#й}I9b4"> <;iPɬg9<ĉO͆o&}D/ (ikF|R6oKPr샣,R,}ONn9m۶ 21)3CX W/,F" "RB~TdVft C q3>Ac$}go p R8Pg㘿Ϝ;:_r\8l/9Oq?9F!\( r2~#v^`/p^N岟`[g 5Fδ*%tΉjH̒Qb^ҋCC20ao >Ӵ/?s[,{ hq /TP " " Im^ϗM܏xs?n.!0_}x1o.ö`p_ex۹-ZϻLH>SQ ;=vm綶˖:QH33E"L6f͊gDQID@D@D@D@D@D@D@D@D@D@A@B٠}ƞ'n\Xp/ ;b}bS7M"qH3S,Uw[£ɟ9,\4d22\*ӸYzG_e-Ay*Q/DKNӡ0bJ"  <'\;|>9Q qwiYϼ^^NyϾ_%pft(|ȝFS7 4T2LѣѨQ0c,ukN/4p!M7>QJ8o₾o ; ?ܧ$-`ٯ}όh韩}2_/x|'CC|"9HW\azX8:H"O.x gO\@>*?`܅8[om˘m2ۼ'C)@AqKy.ùY뽦+? t<8\kW@fe" ! pQ󇀄 \Uj \rt_ݷ_"s pңF@{t9wv s~?"@Q?Yr8<e1OdP.- /PhZE@HG{d*"ձGb:G65_܆bLD@D@D 'hqyx/%U-@œ6,`c C3m%W&9CA="?M"dD ,v^۹s! Nrx'ؽ~GG _|j !gϱL;;H>SID@D@D@D@D@D@D@D@D@D@*C@Bߊ@pbŜ={)|6^zishYSNynҽ8%'cJ 9qLpIfn%רQ#eI@)m9Jw_\M!EoLɏ߳d^t-;bhD T%PV-'bQXF~<J" 'y8^Peذ/~4 .{=/{7A292.,K[{K?}Q_f 7.vOeyQa&.2dCJ"P rC'd׍sL 4)mk~qdS`i-F`?D}Ky2/󽢴/CX} 3 _T&/9%Fr39p~KIp57wd _~ W r6NW{q瞙?*& *~E^\KGE}}$E!}bww$?&Ke{wg/~'y?Srm-23}*G/ g 'ʵR b "P>,\m=kN)oZ9zr`7ƍ^6Mw/N?G!ǹ999qLq-8Yrߏc_XO/3rY96?'?{{?Kd 0NM𢚾gT敓iVG={6\jc!P$h|,Pِ(nMM\GYlne;rɟMF훲mDID@D@bK6 '۟12Ar7mRvS2˰ѪUۘH¢u~~ėO|_^ /ٗ$/ߧpZߴgįg ߏ ?#p>,}~GI*BbtD'*{FDdtޥˍ7:cnѸ;W7eJ~!(`vNsgw~|%3G?&}56La0z鸹YSg =V1gp=Ncͅ|OP| @0 AÙPrE@B"_N1n=0}zş8!guDyPPD ԿGesɜ?s~˅ k qD918 eoЖeLޮ?B_$y?7mrZ,"My1r'^Y<@БcB, >r9Y366us̒$XD@D@v XB䲷3g{ {d`C'uxB2QTW_~ok&Nߞ=wm\a-?exc.SqSȑtz; =s Cc`+/IHw;j6ω-" " " " " " " " " Q% !Ȩ9;(8t .].8œġ/ίSI5: }@۶U?FD@*KNa^*7^wuy4gdceyQ];'ژI!>{.)J5LrHj?&Q sSυ?4>|ȉSzϣ@Vt5 AÑ8UmW΍3g„*Wm:}ۻU+X0G$*iޱ:wvM5]F%kjx-sJ" $!3Lւ;8E'/əbwDU/HG-UѲ_ adzQ)" " q$.I'<IC<60p.^|( 9n,x͠($!M3R_~D!9?BٳaYuH1HΛ+nl RTeE@D@D@D@D@D@D@D@D@D@2L@&݉@*琲@џMt1ԩYgun'|?E2ѣj렣@6 @b gh"+4PsД)ۖ/wB^-[\y%,Zs$f=Lc d-" #0g@!0\*d ;q lefSi@IDATTO?č7hV ՑΪ2ߣoݍn-з/pjFD@D@D fV&Lp}87̔ <;tB|^1_˝S(MPID@ cǻy3ُf{5r cd4a.j@|KNIs91Ҏj>qj⍴e64wsn]J" " " 'q΃ i3~G;#yƉ lFj ͽz?E!sW٢E4gI03بO5k0$O Xm馫!w`fp-+ğ `kQF?<ʓCSh?ϓ %UNH?\x!p_;QD@"IWXWI@_]رc 5 On8;T&>p;"O8tm@@S|a4S 3o={V݁u &n!`6ڨ»E@D@D@D v\@߸KR& >}If/\  zu'Iz NJ)D )@\ ,\_޺^qm7꧟ƭejOPL1i\).~cE!\~{ :B-ߖ-*^6RgxpI1)^S}7 /|]C;1cܘG8?֫>X>dz:x7`νz'W왂r|"!o7h@w C278-āZ Kj1Ǹ= =j?"M4H$8Qs5' e:rhth7ܐ"Pw=:dWkAIDƍh+.rc٭[7G8J#@\ BsP/t5E oE% {oHK!^|G`,__[5e;dn;'֮ *y};6[ԿW-B9ڙg H%9YG;O>'`xG&sAa"Iq& QyV LoI(4 Lqe?)bߠ˼^BUUR^D@D@D ZVS<s̺fZPQv?S]]\/Y;H3f wȢ<3h!LOD@D@D@D@D@D@D@D@D@@>'q&@-N~>Iq_9$rKƌ$D{u~ىBN 0_z):9}{`\6}D@D vI"Q<]g^ z: 8(Iٳ]Isz w\- E")QCŁ8,fQ,|+M"~%y=J, v 3|sgg{=&N̴;mǏ8َx"p@Ӧŵ|"31̃ ~ߨjQVf4T@X+a)S<')@!c7:__)T;4:uj\7q(d^6(?Z@in6jJR߉@2}wݻWl?qmMl'nዚR йʕ8Z",U^D O }+OOUedPe+t zk`̘ASc>&{<LJ&&^j+'jIaK:xt>rU'=}V2=:Kc$Q"@,%.YlAj: B&g B{_S r5 ^4H{Ò",<\^hu[( ڰ /+j^Zz CsRDP`@|>9R~AQ>|&Q' e ~xa {N %3y05i!) nYc4#" " " " " " " " " yG@BywJT(X8sz8E->8pi-jt:`'dI6+ND@~C_T#H&0z4ho"{YΉ:}xrotТ 嬫 @'x97kgbG$ss.8a p=/ 8<`:AD _}+_΄+{?8Cܹ~M~L最_y9MrCsQLP) 3'Oڶ9sM]_ܲe@27͞ ̜D"iG@H^ *Ff̀Wv_?yoM['8o*{OWՁ-t珙R"<[ڷ@e|ओ*h m1ך5h0j:,3ݲ߮J^IDl'xBb…T7t2ص4Oԭ \wp D@DUY} H2 QQt1NP1>*| _|س6{\) ..3E kV-_ q}Iਣw|3m:u_O <0G tU >3#i  AQȽreΣ$" " " " " " " " " "P$Yu<8|` !_ V%Mh8+pY9?],ǎuY9v*" $0|8pO?:AUڤC0# z(p.hP;z+WիWu819.!0x0л7P$LocfGvÔcF9s335ovw5=4kz+pAyS=UDD jg 32;nN,裋sȋq㊯'ATy;@Ql{sR:;{KԎ#n jP u\O0$!Hp h֨" @ tP|Bh5/7=cp@Zf}lwoֈ@ q9g0w^R*J4 Hz9Ono"g⩧n wsuvaptZNAg9~H{p}.Xg+5XDF.}@Љy\]'@'ˋ.W`ÜRlgjݺum&!rt19Pi9dsڊL`pk5E _ܲF<1)suGm8bTg(xQn"ʭPEhDCD Lvrx=Ϥ~lmUjqH/<̀;~BqcX%'Jrɀ~l}e(D|fdw^{ h۶)f>OA9Z)>vfp4ओ}~|Z[Іe]7tǀku-ZۻL:u*wlZD@D@D@D@D@D@D@D@D@ @Dy 4" s.s뮛DcƸ R!լ t[Vt8YAG`4fZEKA6NQQ7(N-R[D@DY,6".=g ?GMm`#=v_|oVPRbEdfj``1" " " G,&O<v\IP\#: ~{k VD@U@:1|"!ЪFJ#@E2m>eCq.8gfnW/]^ Y2PϜ<;qXy%6>Fdrr{d1]ÆIgxE`͜ᥗ윜ƃ廆Rqkw~ P&yp;cҟy}ZKD@D@D@D@D@D@D@D@D@D@J'P&F f;fF3=@Ν+|%mӱ .D@D 3Hu|S>hO?H+pP׷-"},HEϒZ+ @1>ӽ?^8rU]v`OQ s7t̛" " " 1&sn7 kNMQ|S ǫj@~xvN]SDZp x$"P18! P,Y>p;n-s{|=9@"QrO>]=&8/iS}X' ˹vb-]N;&$Z/" " " $/s:C@~]ybooK`sq?} L쳙.5 }c0O# w<ڗ]q $Fz% Ht>]3  ԯ_` \1 ݤȑqk#"uxZIԩH3i2ID@Ob L͛RE@~sFp%nl„1eu]}-akF[oUQ"HtD@D@D@D jx`5DZZ}!Ыpn~RID _yj$_jz@ld8"L`=D[4 $mbt΅:Aɏ?h NOD@6Ϳr ulGbEo w[O"(#;t~I7kV֛oD6h^~T3nݶý7 w d}8͍S 2ЩP <0` #k/" " " " " " " " " "/5F*N7g ̚_vߟ~YE55rſ' =  PGtG hd: 2PA`tࠃ&vj\$" "=tb#aD@3cq> J!/g-ZS% `J1͋_~?~|%G>1:^_}3Q`] UD@D@D |5nn$t*T&@F ԩ~SՕ4/4!Hb}NӦEH$" $pNk}3WKrO@B?Aa#P(xC$EӍkrnbGvJM N,NW/`$YWZ/" " "M}-[lu`uq fͪ~ygl8gG8dl8*z6y:t`0য়\b㤯!`@ID@D@D@D@D@D@D@D@D@ ɓ(@ٮ=<򈛬Rf ,Y&k/B!>{,ЭfOD H]O.~8P @'B֢˟u" "W42lDSrIB? |U.kcxdP'˦0 qh BqNrI~:=hCy8I=(dE&d-q ek;[w j'Ov휐;8CRͼtફ)S`+Ǵ^=꫁mqv4>/E@D@D@D@D@D@D@D@D@D lUI ҥy 9F"Q'jĉ.Ws{NNQX#|3E@ i}!@-=?Q>ܕUk>eAD@CB$J`Bࠃc&t.0e̺w~ [oH($]|10cЧ=$ 5ZD@D@D >C'RRu)TBl? N+\z% aGE$nLrڴj%q'@;r\{-)`-Z8A y^ Ə8СE)HԷ/kmlw}, ;MOD@D@D@O{Vݍ]wm6=f#t jbz75:8]vFm `N?#~ٲ%ESC" " " " " " " " " "V$E`$Ħ34{QhwYƎv `BIthhdrN/' t_Rm ( %>lYVXGA#D 9`=g^~es|DՋO&ЦMs8 \r JO;.wNO>}QJ" " " "O8׾^Q҂O*eZlɒ"!}+_YJIv!$!ٲVdm6޹w;3wys,3ss|ѤI ˗/8O6Jп/M}W_E@OZ|^P!eD(m;p^}&T6O}jՀO(zC;ȕ+ڵأ`:5kyh1 $?Wi'n^z XrGD@D@D@D ?O> F.'6TǁsZfU7Һeφ B^ڷ9F4;Ɖ@1 l]t\|9Z:SB6z4!+a:\D@HYHS @/цҪR%?Jv+" "P\GLI.{6h6ֳgOm֢{>%}݇ C +S 6 5Ci%H6<tPxk֭Ci/  y$z$E)LUV_"$i'rA9_ N;aШUs>S'_H" .ް T~p*g]lS~[ou@x=` fzS?o[T4jVЂ>/~{c-|Ĵid47>.\ y0UYuCD@D@D@D@D@D@D@D@D@ 5 r߰aȑgEK˗F'\M)l-0v,ا,]Z*P" YJ`DӲv K/-椼; x^ʫV" " % @5JPx 3-7>vrHKZmVW_}5nv^:i3aN%" " " K`c m3(W.sYg=z6w7)CLjd7:WAYgW9'kfW[H6&O;m7ߞBC" Ls@Ѯ]~,()B{_ yg?h._쇒d3vz8ݳ޽{6#Ij9>Z}fLju*< Y\+ ;wXN[Æ|H[D'pY ɪ]劀@jH25UK)1ءeG.d]SmG:˺  5֬V@* Ш%J+7/sɎO;@QAID@D <(I! OR()>}.n=ڟC[èn&JRj^>|m)z뭉.Z兔.}7p-@־|Hfd_8> A`J ,\Xp>hlm@f8X`&kdT/ҁo 2SoKdxA`J`8cG_p4`m\s LX xe?mPzhAW?%$ի}ۍZFњ]}A◞#wh0>`0/E-9⋁# 6 " " " ANQ0d+FmƌN=NUWg8as)Ҫ<_gڵ K{9sWJdd2R'0s&p'\L)Sԛ :8餬zN@E7_m9r0ݶ3}TIRMs̸.^P֦jZq%yzBt5ZD￁m\rIϘ1>,xRJ\p8#qWԩJAc>*W:>" " " B੧v9'vCX套ˁʿ_[D@D 7`~jd$YTI nv⡇-K헺v$muFX"̱5׫V>>_D9x>ItTȑP̌ 2yN2/_fd}=egq%|Ϟ(Rx_M Ԫ{C?ΚU$ QNsaCJ̙aʣQӀ44:4 Y-FM"q#dRԬi! D 5gR&Ө*U|'< AIQSD@D  ᅲd Lڝ]o€^p("# 2$ep`i2K yS+E@D@D S;0n}mCRt{Ro̘yUD@" p>akq[^2 ?@8~g7q @Ŋh/c~Fw ;6z~[ז0cUD@D@Dx Gllj'hov +S`Ф6mĉɯS5)!W\k8Vr݊^yX 80Y3w3]D@D@D@D@D@D@D@D@D >r񯿀s#hq0~x%N̰}b7;#fw]daP1EuBD@D@D@D@D@D@D@D@D  l}RMH2m~;N+.7-xϞMU1SQ<3lABW')ka?|41Ǝ;O>Wr-&p:._ڷٍd :^LvuE*moDZ"^&e,M2]4>,yUJo O? ԯA&ޑ UR%)8c`=}:H7Z⫛VMӽ(NGC0֮*T*F#֠5k֘mꪫ]u.\b~s=MhKj}ؼZ/\ _L[osX|"j|駹]y27DlI:%cΠr?h#$@m#%BP& V "W^M6W^tiC4 {EH SK\|9_@s C /D[*2>+iZjy"^@[@&%nt/j} {4dT^-ZȽ#Os5z=mm^"M_/J{kw) 49眃L88\1о;`ɫ"+͛ JxbR~&:udìYRtTd' AfyϨ^/I#,u3!?0zyX*SL{Agq.*L8AYga޳-ѣu`ԩSݶ+bola1+1$.3QmSy k&J%fYfqq"m&N܄MV`/zEHuZYej5_|E4u%@Fժq$HpYXކL-H2mjX}5j[%݋d$) 2a:[v$VEl}6~ @-[c:6dnܜC g ŚZzo b)o>( rl@R2"u%#ώ#p;0Gǿۉ<~ڶTvXumkm ߜd֭1yds &:A^ ŋ/&]ckz"`ؐ*Ā E:`瓱33f<7be2uUBYv⳼er'@QCN0a60{-%*w9h/ܒ$sPŦht/IvLw8T{``6K%1r9{oU\BPc[%" " Gk H#G[nn>r_}瘑8.k-o>t΅DNQ:wމ^z-mTJA ЛR4i&X.;f͚h+S805XD@D@D@D@D@D@D@D@BB@B!9QjftQh{=or'C[С+NtB'c_,љe˖ΈۙV\ׯo"|EѦ{<* a޽{֗_~y0'#i,9eT(Mv(\_nٳ1tP 0;#E>;za"sPœ`zc=\x汘)8}/+VghͱEh ."lذyLP>}G!>ґ%ZU3_{r; ,UV ]LA .pt[>WxG183oFժUϏrbcA)y;fAb˃e\>ē}}ΟV=J" "E~,I䓁3aX=uJJDB\Z_Ȳes,!To's~Δt8WE"1u8jNr ؼ7LhRf/ Ӛuk_|1֭[l c['" " DA (*þ]-K>u|;ܐ;EA7Z{E p)pdclϫG.6jN38R%l/]jɯڙ9= _jp/a[hI k*~WŌ;4zl߾}ۑߋ!D@B`$bE So)ooo CtVPPX%0lv0f AuFZhmp^]˥_kբ0kQ"t/Ι9.jJC}PX.=gW^ A8tASjon3o֭[W;gcZj1*,7pc+H[m?pZ tC_|0(:@ q }Hqe-t5h^5eEᜑJ*Ef뮹,n+_D>(7"nUF" 9I~ʽNt>SѮ];i)N5m-qe*`ʔ)Α~Ŋ&zB\kA 7m;VY-$1 Ȍ;77;#w}ו㮻¾f!y嗃iƉU\&1-]}_&5{ƃ>/v4k2P&N8̚U"GVPvhTصaA׊CMufܹ SN7--51KkӧOw]<Θ{u F Eb]+ /hxFa/'i~P(V vO:%t'O ?ֽD N5ko߾VZN Q8`զ(-x'{̙3]e̘1PآE 33k0Keп"`2HGeO1"PBvr"Gk{=s͹z[9bqne>b$Y)ycxzLDѱf-矻͑D!Ot¹`(emsz"b${{Q<2oc 8Fda;pHΛ6Y;̙W,9٦=mD+W.Skas,U3fsE-D?f<4m9>wEaRl3J Y]"sy{cs0G)loϱaÆ9Wo͞=D3?r>RD@D@D@D@D@D@D@D@D@(- KmxD YfZ3Ho,qFkӽ1,tNyoLų K.qmo‹<*s/\c}xqW_-قLN1l߾+0g xfdwe Rm&ܖS>cڵk+{w-9c޽{H9[%{3#9Vڶ.^+L]Vtx<ry3vnDf늉Ѹ|O+ZQص,I:4z EZ^DC}M}.[t#Gt/2x3uϜyrƔvZEo71;\`"n { J9~ڗ I+e Ҫmj<\B9Ή{mt._iyEb%ޏ8O<)O{䳘Es]a,lFޣ~ccLeK܆m޼sqǽ2"ű92ϜT=A,)\~<1m}ծ]3oΜ9ގ;Y7oXm~b8`;ǏQ1G6T͠A5࿯@Xs]4P R˂IB@Z=B非F^wk}oya!{XTz=7=ڢV@* |gBQu@z:*W~v-[ Ƌ6 br< n9_J~!NM/\gsžE@y;{ /xޚ5onp(mo9N~\gʻ>޼6g+z\ n>}\9L]uA; ԫd"sw4NO{3L<Էf6`@C7^nޮ)ҿ+_g!*U<%u5j6mL3>سg>,ti* =^`o~!UT,@@`hB P/R%'@'J<}Rڒ>Ǝ=zo=4 6:PSpɒ%9yM5(.&_~n[PhXAyСC$+*r`%oٲen;EXs("SkWŹhE"{Ld6.HsEvL裏|`M,RЎH<&Mr(nrto>ҥK>ߝ֓J"9\஫472swXеnsY.j*Z1X2)$uAvZesEh" nްa9hF0kҤ}1>aDB+)ֽ)E1f?D݋]eP=)}.F8b5&cCi W9n+_{s2z^~@uUoG?.[jgg`A̻>L"XMzس {)x}Yg{YsD>8a.hGo1%E9|R PHLpOsݳze/&^[z:{g9'Nҫ@ v%H{oy&vۥ}S *lr &D`,zx`f9y9|0Bc6,TN[vM̽>m_3R1C6XaW-kL܇Lލ)(D݋x}٧!L$ݞWD \cOc֜ӑ6o.*Wv9m@ ̘t \s гg䝓1!lX7^79] fXZ{z 3E֭{M)< 4X=z`РA<, y//vcK'+,\cAc6fO" " "F,=ak}e枀a_G&iZZ*VKzU*JC3kW_]MQ"P*fCvZFXP0 X`XЌ[7 B96EԹg曰ysnjԀͧ'Mkiyn9fYfw̙iӦ9ep>ʱ݌eGfAj "`n5hv 6p;y_bε . T+W^:-]ؐޚ⯿ СC]7N9a]ge>C!Q*m5q.̃p㍰g%#:ɘY?:t|Mz&8n8gIګ)$+@z6 2[7"yZHpZ y4(O?9H/n/c-Gq,ʰ9)_~M4ᮜ8t4Yr}&IR̢ Ex ZD1`{ N~&"Ŵ(iJm)r vlR$"l"6zKL4`aP7EnC!(pw㨣|~x E"E?69҉Jr"v An3kh$" M'=m~Ah׊X ywԝZAcN;4^31E`y_>`i$Tص"kYaek_حk8@27%{w0QE gC1kXbQX1aA!{Q;M>-Zr@1b3>AҊVkU(KЖY\mԵjUW]8'uKm'(@*|fޱw%cu<`5|wROSP#3h޶g: @;iDf>7&:сN тĪjժf۵ (T1ul2s.и?_k~fƢ5j` 7l"`*?'#2k^bfj?`%bR[eҴq-fiszʠJls[_6`˗w~|Zy&MA9D@D@D@D@D@D@D@D@D@%`&rJ" | d5}[.' ]0N^z \|j:\Vm槟~ &nG(s/*wn9q(,/Rdx *#Rz #[lu ut1-\UTq%Θ1-Ulr]|p})h81F{饗@1 6_wtاDȁ4ٳg[Þ`;:wJqмiݺu@1/Y2dˏi`u\+s`%ҩr„ fj}>EC6|F =U]+Jz-+bGB> pX~O*@j Gْq/<"m)\|ꩧkoaN:_=y4U0HڅA ;TJt\0nDP)ZD[L";¢2)~GhӲy~ l:_= &^;l1hٲesY~eKAX:sʈ|6ΠdEY^6uݞa(M#>\G RA[nj`=^/6.)h@߾~s6{C=u?ul<ǹ@@PXMcְ|S YD l85bn1~<3v"dhy9ظs2^X9h@OGί [vsVXtw~iѢEy}~W'ܵk|GX2t| %FSY`02֚vaj#^fMX um)(sai`;(d^@9s6OĝZ!Q7?䣏Gˡma&`& J"~WhbJ"hKE!F(@% kˏ}qi a S #%]0} '4)ϸWrÂ-$m }x9]wog 9ўӂib7 p3 cّ1@|"mvs5DD@D@D |cavsE u =8Mf`VZf#G_wrofo} X9^r٪ЎI&UJFCrsOs ;Mdb0Bhobы suSNq$" " " " " " " " "DԦOIJJ+=L{SM<邏Zn ^ݫ *z&qn/21gyaxf n۝w>0aaogn9yk^Ŋݶ>gN12QE5׸./k۶Wn]W^$}[l\qo$ll"иuywsp]+Ly<]x Z0ֵ_~#G&^wqG sop_xTص"kYP^KF_=o=Wc"\{ ? wqb._N<ϛ6X %vڶsE͛7/p{S{&hSF7%g"9ŚXvm7iA`Ff{ᅴh!"`vyއp>y>K0坓6]I!}EZwsb&YZy,+tjUT~y+>x +hvewsVV"&;"6?S ?(;8x+m7ngª3i"n3x41gKަfr3=&SgC@f0s%9^$eD}HӧS ?|oɓ݂$|?0#.tqZϞ=Zjy{v"*CAAQd10N R ?:hO+sʊ|]`k:t~{M6|[%~;z;n){h;3 ? ̝;7'FS2 2KQF9C{ӧOϵL1 b-˩]JSsb},W^=Ϣ;#<#YOvm^qީ,)`N#GK.[nۯ"K";x oc^+yNBA׊~^+(JX$q\~Gdb&l#Gy;ϊy(Zp}(1}KQ_};WE? 7s}C&TDU0{|Р z+N=_b!hc`kdž]tQmSv/bog;h8 a`}fB̐ -jo 漍?s^ϗό`ή\3ŋ}^seHkժUh] /0Gg/5aBǖ=;6q&.B?EvD#sYz5L sAon˖-s0ZM --(= *NE +<С`?3H+֮]Z&cKYw>]RmZQkYF( nXf >&؉~3ׅ;$9|+BpqcXcދ6lO룎uKz̔DcE س(PBV.; h6,x>]xᅘ1c_ :Dvpi裏g×͙+<οq|I7gN0fn.TX8·Y*~aoJlM9ydK4-NFu6mvr@=B$Wk`Ο6+b9Y8f̀~l^)Cؒ8ʔld2&j`FO>IZ5*XҞ4~7X "8S`k QN. k`AB~shͻٞdrodƍsǓ{ify&N{^tOZjPDΫsPD%g&N?Du#EwuP,X2jqرONС+W,oq#W>zNjS'v\]a{MNyf$ UEE uxw`kٲe'p}0C/0n8IhFdG`(aˆiZ*"݂KӁ>}NX75l&н;@!hIoN25;l7z4Sl ) UO}ǺF=&~?h+ZgΜ&Mॗ^,R4z{֬Yh޼  -ќ1ӷjY0L;^#"Pr,9CnL{!}v*~'Ovb{.◜GrCI`di _y8L( ~0%_$bŊDrD lJN"kr?ND 7(^hH~o8kyKc1lB(0lX Y38ŧG㏁ի}?ne'ZHIR@4GE\gdqІHtP Z#;^fojΈYDhO? F1.4(w}qYgelڵkO?͎ΫqPb19sI)@v4 2JUf0`eppiWD09`ʕ^{#O2@o}U3v'>~#<ӵ4^qť7n h֭ˢB11fo:c_ovt%" " Hs r/OA;.emr_9T1->خJ"1lxᅸS$x&Ic޼$W" " " " " " " " "r[yՇmLI!0lp#9ByҕQw֙u,R f!:w:%'pg= ({ \{-гg)T*W"@N!j*$Ԝ0Mx%9G_檑"F.W@D`ubMk˞ YNЏJ"^s|yJ)>7o&?ltj[G}Kmj@0p%(/;#9uTV"嚷^{;_6ݭ" YH`D?Zlv]]NWâЦACҼ em|E7T,$~8]Nv^]% x/N)#|~'δ5QjU .22e&6`Q& 5ZQy|q=b݁u d;?q{B=N`@3#=Eϯ"-ڷEt׭˖HFd&S3Tiڴ) ˗/ܹsѯߵ˖{ NuGq?n"S~`K2nb{N;0 =y& AGYol ߟJlm*-S 0pԠA@@gjoӯwuʂaǘ'j@*H2UG>Ӧ"ߞo6o!lzV[GcRw͡j+"x+W.!ēUYr| 즠ދ@X}6H Xxylh9Mr'&M+u mp_ΨOYInݺjU34:+" " "  <|in )/I):6@4UH 5%GU;@&@6UWm!Ю9eM #`ӵ6}7@aS%H6zᦛnW_of+-hcfZv=| Njz{n&0t(б?{a:}fWK .}*T`Px'в웘TJ62? K\_Zjaƌ)f*V}aA}pUID@D@D@D@D@D@D@D@D@# !H}RN`BsφzU4.S䓓PGQ3A3g7~m'('=}VOӋ#ҁW)6 /bVTXدfTըzDL#S胂J"PM)fɒ%8ꨣl\{&!Ոpļ_5CuĂ2@֬FzHs2 J)187߭ڵ)S@TIa6^1hd#*USNy&{>ܹy:7j ThΝ0}+՘8q:{abb}DժkXX0cYD@D2%ξs^=_gkF%ցT;Oh4A?mušU@:88x`ҩUjK6`I1]6lw9ZLj$l}jP"WÜ}ĔR;}s=TFqsC5w)g!/ ',xzB6,t:uJlʹb!Х +$\ >5P֮\.pIt͌^$᯹~GjQNlٲ{o`ߵh} eOp86Hź B@Ŋ1bS?(ZL 5b"a" " " " " " " " "1$12;iƍʕK6:hy+WbL6 ZN:1Ppjaʔ]TMb*@PfէD.0[o Rt2u뮻3g4C=at9HqNP]żywY/z-" " YN]'F aٲĖ+ЬI0I& }z~/nh8H`nܵ4h{,s'-[/ U3ܭ[yom&J}4~z^)Gt6оpWS#~˴?" " "P27 <гg"@'t&M2,HHm@ժa>oʘ7} 1ۭQ6\͛zU!" " " " " " " " "$'%St؆,@IDAT~ v^fg(Ʌ!U*nu(n$~XJ" YE` ?`Qٳle`͚4kT6gڵ%Gb?TehR5\MMk~8fϞvaXr94\˗uո:jnz:T@xE`*kHիK2\;/(]e@0d*hQsۼp!~ۿY!&,^?@+EQ0jVN`}Gٚ$/l (@jh5ׯvR@6ΕWO> \zi6PMrx AXtZT^&(W;8L}Lo`\՞cOƔ)ml9ƌJ" " " " " " " " " YG@BYwKCÆK5X8d2clԩ#Xٵ_D (P?iP.Pf$$@焟Ne˂wN֋@dgӦm_ Gϣ"P\;#0 <)O/ݦ6hB[o5&Ol3!쀚," " "P"Z{Ub '0mCسEiYaC$"*kzH88PuC@lVBE8,,e aQhs_|{f :3䄧y7Gڴ/ҵ@׷ow@ 538_55kUVVZӧ9$h@)kuTE7{YmuTD@D@\ӿ䡨^=Nj˞+TN: 6nϞ>gZO!ȭʴ?%Яq#p~  Au0oԽd (>z/Q^3kz;(l|2~{E714e\?|J" " "(|_ 3nɽUҁ@9mA^RB}ZcG`ఴJ") 7Ǿ{[V@ٲk#S1N̔3~|!3= 6o`^wb~pOOXg}/ ʕCJp[3hѢZwxBD@D@D@B@GJ2ylMӦ:TrL0x1g1փv A9h+m pG>Ǐ4T&VI/"й/~%(Mrߒk}G{-֩nHU8cҥ 0v,а!,0`tirV" " "Lkcph~|5_Ӣ6H<ڸ1} 6vDI}f7i{{vHޗ5C>3pHӖPID@D@D@D@D@D@D@D@D H2o\|McLdb>ixNq. Ѩ+pXs tz."w~7oF4W/ A)? Q~}kWK9qf2>lG~+xbˢêV =^U(`}bp ޟ+W˗K_4Ǵi[tm|6`9߇ƍQ`Vk^{*naCs`Pe`=O!v^}KeBst*A2^]~A@oy 7i;oܸDa& B2/gy#GG>E _5ths< PvPZQ>{($D{(L4v,&Au1j{q!qQYE@D@ro@ؘLl1(̙8WzLh #E>y{ q;Rx`Ȑ@;muQ ~. ln7AD@D@D@D@D@D@D@D@D $z:x=Qu@:ew lMjSJ9DG~%%@:|*@& l}杈2y\=;|WE`MsL HՁKUE {(k<"@ 矀 S㡇J2Oe˖vk;1c g/<餓f͚L!F$?S$" " " Y @#1tQoNch!OewTKz.<$7 .Ja/{X;xA`=3τ,ج|W6/Z(`@A9s/pXL'[+ޟO> a?PDKG;RD@D ̼R m 7(ƥ$$+WKN D bp)^J"P3vJJ@chw8tS•QD@D@D@D@D@D@D@D@D $Z:`<)yeBOj,4"kѣkj u]Y‰o^e\#@!H?,^9@'gxkN;Gt!_T&p_g_Pd=VOB[m "P:jy/1@׮ͅJ"I*UB^Lb.tmd0^n7c-p\Gd2c:W \p@;ci?N " " "%+t H2[O|PMGO%߷/!TRͽc=(0{6p_ABV%Qhv~~NA|Pb Pr@Ōp`Lu*F-qkŷGL%vZ 6g(^D1j ~;`AJO{@,͆/?L4i[8($ =D[m"@ϞA;B EE~K/A4kPVID@D@D@D@D@D@D@D@D l5~Dzjfh6ի F{a@׽dF8t% a4Jv*&>{SQpPN~:H/Z7fJy̧x$`x'dr2?GxL(N @pd@m{{x9s&6tS|GN Jv۹)0 & W:@09ժ?k xEяoI  'bs̾JI7t>pE:6#vT2 j@= ?p]矧?_:FѳF(ܢ$&@ܒO>떴]@6 4hK3*/f3ƌ#M6[o%P\~ٲշʕwflɱB{DQzR\vp]eԨҶoQ СCTcڴnqFQȳ " " " " " " " " "'I[%H```( 1ʶRY2q2G`=|0Zڙ),$"8@2::Y2:4o̘%L tuH u]o8ֈ@ H2@9{z)6ip"&'дiS,{9T;.]`N-EJa.0p0 աD@D@D@"A^֔s"_ <;S PZ/JI_~ 0nlzL Ag]/.>:?< v[B]|?N Y($$@A|&XBw/O5չD j(@=hP uE *[8(&OZw(>aPDO0uIآRVCD@D }7 tkɕ~X8Q<HVs!?Ed{=z|~ג/Q @[;Z$:2R#U8Ş?_D 7Gɍ2(K`:T67V){[m!D`DaH:)@ |M-bB"@gx\AӦ 5PU9wqV\i*x饗v6jժRtE7~J%г'?<*g" " " 7c⋓ۯ[S*z_M>*W* AFd&_G_|\sMQrY믁^v1hZ>нŢt=/ h1cF ΒeUC=ȋMO"[/ v/"%b N{]w[loE@zŏ(z$N_[n)Y )@6 bټ6ʝs}7pсϚrQ0.@bŹqKXb*@ |x}Ux:Bt 0z:}b\ D5 D鍎t$M3gT=իJ / \WE@ lw3\<#wl 0wn.^y zꃜ67/}*" !lyc P1 ϶'Ø1t>_Fre|̛77x#_}ua /7SNu{.\w>7N: -XID@D@D Od5D؝\æ 6GKш6~sE2{0b(`ٳ[kYRO`=V;Fꏮ#@|ZgpC w-$KE ``a} Uf'h~i`}E]kD@D@D x~:/^[ҖZ/!pg"+`R`ص_$oÁf̀~XsU!CGx b%"s˭+!@=wuN]NBv2j1Ǥ\:jv5 hnuNT=n_mXd#lSh0#v^r'!\Zg28`rkdֶ"Yttv=&zkgD/R@ lK=dԪU ~-=PmsY`Fr~Q J$`|/)S" " " Ix}`DK)EnU ±reìFvz;$޽#!_ep࣏/._}ٙi`#Q<宻>POM6 .Ǝ ދΩr/>P~ǏO$"d*5uep]sK`ŊB8pB +8 q(`p oa~MA2XǪUX<O:.ZM|Wnph巓@0#%N I) xD^k fxmu#ihLXf 0AtvF"-[8U^W18yQ.B4v!!D (Q͝U((;{vPZ~o90cp!B@WUmt6ʀs֭7| ;SN˗c@mN .@CcҤI%v^@߾9] e^D@D@Dy'Ьp(zy,HuS*,mgrI%&oG3%P$*֋@yuf[@r^?Y7`.o}rG" no}^}-[,b @S%"z?m7Ԭԇd p5Z XW,+pqc~ ƍӁΝ6R>Ri{ j{=s@EE;=t>@,J|{U9(@mslVK"]L_|>Zr9m詒D@ *_+1f7ؽ];`L`W[@.bF;}yԯ_#GDm30yf2c W\G5.&NRMfK.N)>LF_GM ˺T8<7\rv[/ 8{W_h|AA9 b6 $7\.^ (;瞹[\r[z)xA# J@X4;g(GqH s<Ʀ*;Ԩ\u@Aȁ z۴CtSL(ʥftwg':kX^<`0 $2-%07%(? nО#l27zy/^k?qOSx OYʕW7/ldt?ǪU7j &C)E3WǎLo[,^x/py@yIk^srguԉeF!y8n#~VrH>'˾zyx(fte2xSJ3ѧx8JT~uU2ׯzO<$CB?|=L%= sF>.-L*un{rܹV7nܢ]hy.{=j7{Gl\;mŭlInCPsv1狡$@mx~0}/s;c v;K6iNl4}A+Agn=; -˱bm=v×4X{|aİM>ɇewND m2/˜d2^̯#d~}+8sw6ڝwְ6e3Wv \xaNmڮ‚::@Z=Vi9>{FSLcgk`'vQB~ ;p~WnٳC. ‡sB[l9oƦ@)kpR>Oy?{cklbߨ[ h/{Is/S< I҉#x?mӶnkyM4q?UTb |^Oy~B"^< \OXw{˱ΕΚtWգMpkjs_?}]sNÄwHB3Ӂ7h#p#)'B]h{q7;v6ڽmڴ8$(eD |~0A8hol'V7,خ}[s^]vp;?e?v_|[lq/J/FkKKm695`6 (@ tٽkRO}/|.u:g'>v.Ǜj--'>7MNg9q_s>8e?]v|8~[48/i6~/iP,v| )i*7MDfJ" " "aÀnm} e|fv'̷̛yQ ە-<>8ҟǴ_2dP2`7ހnW_ ð>"P~|'y&з/г'Rci-GSH8ehC+-Eylhk*m]jŊf <`'cߝ1?͇m~sΉ65oD@V'0`k~h`b0/~.X] 8p\<;CJs>wh}>^[K'>y2%z|χF-@m2NK,q~ζo~b(%|,,Hx1<~lϲxm5[xa;>ru_;d=?>ޏM0 |-sA? lqJ" l.hp}~U+t .MZIb["\WYuǫ\gCTgosy"RQ?sH(%G#޽a %`qف 7^ntvXk@ d/c`=1&6Xsr^ 9uT7;NLh^FLT`|\>\vpm1H1o։MRpa(Dߘ NVunR |W:t`u# ̙]\ۉ'VrMx{xOb/ʡcvmf͚.W4? 0Gx ;)~{&: Aw`It9'HHz̺JG'/"Z^sXltA,+ ,pߏ|.16?76hl܋s8giP^lư3ᶹ_f=>2',kfJik*~NzkEK) p'[[x-v8~pxꩧ9J7h[um\;-|8?䗽=?F?zo' xSI;p6xA|\I8en.s? %v6$~أE@a?BB[]gy9RO`qꩁZꏮ#/j}0k:ΠcFR4x0p0NI[zF>ᄠ)ʧdwCݺe'zVڶ0||gbLh3ijĮ>ޮy&E=eՃ/'lקm )%js?F{|6}z5}=,c#p3D }> OWouϹo69꟟#BAgyOo s~>lcx^3HI!{,\g뭯fw몟.c=뮯cؘuSBb"\gYwYf[?O÷mI}ȈW9XoY%*p 8|^fgFOS6DD@D@D@D@D@D@D@D@򁀄 *f ~nzqJ" s2~xL49K",{챇5qbT(‰/ӦMç~6lmڴAp:(9y ?}ۦM:q)/7Wr,=p%;Xiܼys {gV82'OȎx@'؉ x/<흉s?(  t@0,Sh;TxعwϹMhc9-Rtpp=Ssb}ΙKK子1ny lFZtAw}[x9oɘ8q"Ǝ"\wymahݖD uLi`hꎫ#ض`N`~y=N| 8\fOYwׅtx@R~q^q}X|6si8_J"P~ҡߐ$ڼhzW~ּ{{sb~X/=ms.rU.7?zn%rrsݓmZ/ ~cؑo-R1vJ;yJP=7Dsm$(,m$YqdG׮mګo_OTQ 0p]Z2ٳ`e-'@H{Zeq0?ҷ˧_ɥgO`ଳg}+@3}:O \Ci{0ۗ_~4~ H}i  riۈHLQ3/DmzΤUXP{&ih ziTL`?m~s9FO{y{ۼ{1#?6^0[}>V*lzogx}V{dGY%:ց/sW_}נ|؛;sü/Jbs>w5ռ`aHwFE6lW?W|z笿NJ>z+so)$@'+_gY}sn{(~c-/+>y{:_K.#/ :8(x+g`OQ ӎ8?OA6}L櫧F{{ds$E)+Zj墳1 )?4jTA!!ȵnƱx9z@:xg/ gm۶n}ݱ뮻#}~-٩M< r!8#\^6.V'>^‰N tHOreCtsw9Ϲ>ViK 1I )JC5R567 DHwy'yأ#O>dbÅ^;]H~gX{YH%O]Y9;Ν[<Гw_NFlѩs:z'e.wRwmRu$*xq3~m睟L!_0߁J"@7AS=y0\\G s))# !6 d Vcj^xBDSJ1aRn90fc ύ<+'@\L8ҏl9o~"o>н;/&P>5%(/O>v)N!V 9r#bL-i#![ك{ZƋsҾiܸ Oo2w#%(5> X˲Ӗ;\彽so׳<(k{|.}?a_6$J}=F_ NMc&>sX)sa?Wɷך4i'nr릯~u6@럹k:|u.X.E\}epS?Q< :{I'sIlj?Rt" " " " " " " " "}5\n>a=Zt]v3ٳ(FnP)1믿^,vȎϝw g,DQ p\Z R(+UX(BAW^y1`ͳD]tq.(Exm,wjـNt|vᲟYEXLN^P 2?2#(=M&sjMqH{ SOk UoܳW^8#}KвeK\͕31t9@Ep8+':2q0[bO,^ ӳoFgT,8D2t"r{fr_~ |r7_A;ПY+hץ ˉ} T2lB!y͙3 xrN .D1>i2ufD}%fzDܴϳbŢ//aqG iWm\/|T dx2 G< ܕ+Wv'.B`Mŕʭc~c|{Q}]Ǽa7`*l}@ +P |07k6m]vŽ _d1|ooSCކY#s>Y]>~O>+ :ձOB)7 0EK.zr,ʵ  A˕`9z^x!pD7u(5n8sNdGѻcM%yxJ47vM4 = #=I;t;ω 8; Ç{:(w/2^2ʮgo&u]]~58ymxg0:!V6`0fy}=ֵs2{1m:vK靓-XE~^씊niL9hN~9X9Д4H%;,ge^oiʕŧ浧 "VZ.0sچ)FH%KS> nON~7T9D[YfyІ'Ž4,u$ !䯛śCG{@IDAT!{ y  rJj/حG4 @Q2iWVnY, R}>u;!+,{|ނ"ώҪl"Ew悦?Mi#2p; $xC&>(6EO }B͛7wAzOS]H)Їԋ>S~vzl>4/^3qN;@rhgĹ9{yRP),}FeD[Gw05X1c w_0lOMҥKFANς-Z6nVZ{&d䷓~b? \}a]ĺl!UE!ʺK_))[Y~gGg4W`ܦ*virෑ#Zdȴ(" " " " " " " " yJ@ByzaU,~CV 8Uqt߿saWQË^{9o^zᬳʻH;k,'uN?tvir 8+d}y뭷z϶^' @%HGNБ^GE^|X?gdG2:U>.t9DٰaC4iM>*'s8AdK/ "D~!F`g(U?~k;15 wsd6 /W\qڂn G'2]y=&ṆB%Y8m@!6Fg;&{'e=0Cy P2N;P(6z]wzWjt` ~Oѱ.S1V#8@/?X-;Kz ϳ^>>WӴi9䵣8ĀyJ"K̙Cg}Ew6mߏ|b &?'Y9Ma:+}-}( ڲeKWo{oSq 1.XW8XPj~^-8H3xi3.?˩R@ H2W(b4b# F,s9v 6 ~?3p@w5 |n*tj׮1umEx}N貃͚@xͧ~ۃ@ժU oVt6`v:zpb1/_D\InFKƍ| 7,xvP|DN>c:z6YW5kxe>gmΥ糈E`7̡-ToW_}5c=s6d8KG`#~\i =zh'09HS'fMь !q9o;ǥK첋s* ((B+YF~#=́wʶ7-p)s]+Pzx}8G~K{'ǁ$M8Є8q (K#|0 >ZjJq#ϵ֒d.2qLMEց(L:.jRLˀ7OOu0s (tgcȕy:d>~|N3ߟiO~U裏ꫯ_wL1|[1P8$|6>jca?Rc8ivMg)ʉJ"P^degj m8m۶ߜw_(y2-/n-gs#`<x`9}gӑE@D@D@D@D@D@D@D@D@d<*ZW"ow~MCƎ .E(1d+ds#R\PMz`)v3ぃV9d:ca>fڵkђ3O=mah$0Pֹ _(qtժUr-]pL\{WG9. Q4;mt q9TboDa|9˘65u~lvn\ZJZ":O ӯXllp*i*6?PHHI ]B`߈o%&d:J)&pu3)>6OZR0ִAy}4}Rv,>Ä`eo_H[ ,Hp}0,(L|!~&MQ/hG}TS9ѶG68LgRJ-ry @NoX#PBf/ia4' PD|>OG2Q\m>:$" y|f3I& $W^/ĸ_ZNc[R%}eb8zO;⠃Re;Ύ7^TV hB|] o}ʔ)N$!-磘n&`lts<%C>q@~UW7 OVD@D@D@D@D@D@D@D@D"$Yz/mLu¢KXST\i It<qw(r9R.#< -آGnt8c9 YRbf1q.X,AΣ#gssAժeЩ@ 6({Bc⬳`" WŦ(;!23x^/ C?'|Ҟ3 P'{Per~DyQX"lU. NdQGGȱ|gdدA~ KQ}6zQSkE@&v wF=T>ORE`[qWܣ]X2?~H/S{>=#qG~HD z)DŽY r*J`ٲe'u"_c26>klLD6IrspQ͗" " " " " " " " "eՉXg1قK)%I`Y{^!yߣG'׿t-VX5f{hЧOt%ˣ\A /td}w@FR:l3 DaQF6'FVeS6 #ɝoO? `c߁Zչ|NLt.Y.~mf7Orgm. 6tM.~a'%Q3A?k̙8cA6:&sp[:u\[lsH1}uh`:? mp~+{hQDM/fAڃb *Aw ?n hʍ9 F)G|dHͤl JC†ӁJhB[_?ছ7 ʜ8w"lrʢ 0gOAr(GAUlc¢0 s`pڵ}G@'[o>olyd*EE,!!y>)5iy.,p@z'Li]6=P~WcU)E 1 ɱ>D\bIcxI'˷D,:,1[o=':{!uXIL~PYoMcOĞ{ۧ4(ܒ ))!*ff2<^@ H2̀6: 0TJ>lqx饗M|D6뮻ΉzȐ!RJ"fd%y睇޽{CNEOM RΥsdE&4'gϞ](b~I9xa"@'7-믿&:cPcǎ8Ü_>|{ԥNj80:`];@& QFˏ\r ( /8|)ʑZBh6*p@Lo<1Pqn09b{ kg:?s4i8X裏v8!_EcA^Ɓo(Vl2'ܔ9He˖&J -.@ Z >} rӭO- $YYE, KSE]w(WGfhhYgE&[y3Y_t3/ T76Z(pqDX>h41_Ђ}۾зx2BSSQK"`N\pЩSI[Es=;4"y'|~ಒDOkȑ2};IJ*E-)PHvg6yi6AT{)ů| s3xM-y#l+!ͅHI |.0Ց[`nfsϵ6yEJ)COUP4QW^11]0X 6j*y.T|&Yvy|Mkwioٲoa;&c޽{w'zcEQvE iYtC~8 3B1b)Z'Mk$1ǫ&?G<(pA ]m B;:0}DD@D@D@D@D@D@D@DHvJ'c @>tR@}qB tn_~>Elz++tM Sxß{_0wߍ'|҉e77t{l:{GIDp?bLzg@!c8&::Gxc\Ԃ^QAf͚ܫW,ΝkvE,Hky"{td4tPh nN*HQ|e֧`M{qs׮]mYHʘT*Voq(v p.+Vo1cƸAU뭷<@t t쐹pG͕Fƍs^yԪU9۶mӢL/CATLO-^ٙo-YOL v۷GÆ ^OD@J>9^}~56tS%<<#uQHb7Ga/2qZjZ"E6l xӯ.J驧ruT͚5EE2F`Nշo_l9?i0(sRC57VovW%dXhh [̈́Zm9SYM9s6mrTZJ6i=g}6RaN{;!з~kŃu ѣA[hQcUt兎Kl[n\m٦" y@9j('Da2:^q[nN9DDv "*ş/_ Dq:bTcBRH/bx7vgtp;Sd2Ӷ"`A|17NO[no9:PsrO(|)?m Ѕ(hFƋ/ 7ЄBi_]wu鲨," "R]Owqv~% AS~SM@B5-\h:ҷo  5$iv#}FSG:\NZJGco6hPreM-~ 馠raN]TOfsuٳ g_D"AeDRLb0` 1xfp^{ :P) ֹsgקЮ];TR%Tt8?#yg]?쉦}G_"~:7t58?ʕ+QIDO'}Eb-8$,g;}W8>LJ}?e!@(E]侻-4iR H!HU)w;,Fg.leTD@D@D@D@D@D@D@D@D [։u!׿kJe8p ^z%0D ĕ ȞQx-xM2.6e/ ̗d&ɗ~.:R%Hl{ 7vBtڦ]wIl1yE TݻwLJ~ifΜld~^…f$2@(y@[&LpV6W|@#:wY*f;䣔m wCyׯF(sr_vi' Ti^q3U ot v[NK;vĭjcltL9_uUQa=,Q7 q' ؤ*^Zd"n >Ec(ڥQ\)siڵ+X#Q!im4j(PDkM<-t99 U5tBvJ)b|#Gı5k矂}vub7|J0ɜ:em|h0߰b+CF&Msϥ)? oS)_~!EaȐ!`[O> -39~z3,쳏kOuQp `{QO;4UT%\j5 ~I?7G: ɚ{e{cܤv S3JG.7[I%#VJd"߁IeMIjd3}G =ftl(鼙]s'@CM>݉d"Wٶ'ӏ <Er25`he.>0\p 9dVɁBYB%Jb rpFm&D.8S&$W%˦(yz)ԩ㞩SNv?#p3/[¿|obY?0`*S)6>3囑)0"lq}/&[fgϞ%g5{':4(# P&} y-=\qNP Ju6 >黈;S`J's /llK2ӊ@d]tg,e,Bچ.w̟~ ÓTNԣz4hRG1:>'QH 9`\)>^W 0Zr)՝&6H1ᔀÇ[ξ.R4c?;9x'FtkOH,4؍77I|M6qJꫯRvܲ3ϸAż{*RlY26oqbOXpl tO1^taq)'T*_xx¿2߿|KcuS&γ?^v;QQc(_#5eRd3C!dn`ҥ.B:LO~螃\V ŋgV,0CաCf3Չb{챔z6s:={kÖ%Pvl.+HDgx8%Nljժ^zN'Nw[G!Qlޟݻw_(Ŕl"e?AS~?&<{KmQK10wKet⽿)AH q Æn$uǒ:A)gQJ6RSF{vs)8|~Ds1NhN&}ft͈._µdє>0\׹KG=v!9ߎv>2Y d;cǎ=V`Nٴy[k}ݸ馛\;tE1-\Љq+Moc>ڂd7@5!֥L$?|;"tRM|QG?uQx's!wԖ-a"74:x ЍZ'7ի$" " " " " " " " "PQtEE@6EEgUTdQӊ9-38h_?լYy^bEBP]D_dRۙSc_dhE&Vۭ=mklGqD \J኏caM69F`"PgW[gB_?6b٦ngζMh}(+**o%L9)+i:NM,<]ʵ][jVx'X^~lJ}dc._wų-.N.$yL鴡ؙ8=>x:)֭[z`{2yefOjm,yE@%_NkJGɿG6-9f袢NmڜYlo$N5- )2Prh0/**~DF,*Z0}L;9}YĵKSu0{Ժ iEEݻg3gtߡ~{v2`gͶ<~AJ߰ ?nO Yt!ucRZ`AlPt 'gv^w~,>Q) Ѱd"&*TTj"L)sd/\mݗl7O%B:}L?C+ PmE0cwl<򩏕|7YbSLqmu,33 b۱m۶.rL&]dGyjg!֥L+SĹP Өr>(s|̤{Ʃu#pZG" 9VE@D@D@D@D@D@D@D@D ֮4n txwy'c^{T923,>,#]1ԩSOd瞃SNId:{ց?#VR%lN>dwmxtQFa]vAVy9O?.mڴqy6 \{n `[8$QyNF-7G<\D={ ۭItV{nuY++cE;Piu?B"*Rt"־;&O U d+%w +KY?_\ꪫ0q]/k"55jJ#`ΪhѢLzyw3D}WmѠA\ξnbD6+ކO&YI &[%\0.V6,E7}뮻f?C dN/q(ҥcb%Kwi޽{Q %'KImFR*ƙ,>ڦ}3>6;2tGR/\1cDjm;׹D@D"΅}_\Rd~v,~13ҽ+I8O$~lo|zn.&f+MQul~ओ`6sx1Ԯ<Iׯ_2e|=ƍM 7#i37}Cy0L}>]dFmI:N>lXƨ8wDvw .tu::ºdpػ`f̘}N)S~ln7. v>>{5w_ʳ"6tR<`y8묳p뭷#< իvl<]'KcS~4co÷xZjPۇmk/}{I&~:U.N3q|W޽1rH4m4*تe"Jj|QGݘO<&ԵJfc!k'mY˚rov`J" " " " " " " " "  wr@+]/9t:iow#F+tGaÆSg@EsR?(r@):N -y젣(Dpb!':57\:~mFM\xn؎@gu~I磬CN}u&LQT} ;Ry-Us9z6uϱ=zksp gqLgދ:vy"4I~@{i^m<{9S|Q>rI4 ;T3n/BB"`0FOҾRdXoaΏUߕnghIdK.dCލ+iBCi?2Od<:Μ9X?9cڣjv#dL fa^ bL{n12Z6푉g䱃 r8_Y <|ސ$#&yrYNB4*Ph r{A ?DTiGlhv腑>ΊX`Z;z;Zqn`_~yׯ#mE:읆!`T[\ SSWE:u!tJ ^;ˑGNN͸'j H9;wjk:mA^F(֒O>/t}eVx.VR]f]g/ ve-/$'F\pb mD6N%NtT;Eܳ@ Zgt#OzܚQCXNF"8cn!A Y?祪cJi܍Jiirztx>Ύ\y49%~h5*F͗h[uY쵑w u;Jkx>Oi}H 'zocOZ uNMCˣmHcMj;-7iHBRVpi=6 蚢 K~y#k}v hyhKe!kWլOk#X{SO_q} v2t_sl_^Z+Yc]dTe^QC%rF3cu6[{Ny_G.V6*jكGS5opD Y0̓ݲg!`!`!`!iBffaР(b9<,fQh*߿JwDz*^]J wy*E;Q|ZMD1 LCp%TߥvHI #%p׫ c*)A16CU974E[oSu(PRߴvc(OVG7ޥ>sch0&QfwOR )Q_ \\ўcsjTmݸPz?od)aMu^M+KD63S2cW>T1ӍΔ%?)e5^>R/8RN9G0bU*wvm+s|Hy(sf:ݹ9J.%>硇 2mZ͋%|wL12!mL"wfܮD,. y {tUqlo)Q9 r/BV}WZicۜm|ވ7q+ccDu:2xPHܩ>,QX#5fwf^:8Y,2!RKwj%vQ1>2%q..c\:ʝK̓7+IH*#$!4)nr2)M!{G[S!sz}k,Ij5֥OV;e`t<0'VQD.ee(2-DGW*qBddͣZt| $ FICZiiנNίe}E+C9GiYc徴=Zc IO}zX }ՙvq,68d_NfԨQ6s7c%0w$ɨ:ďU[=F+Mut5jL܅x}+:ζ:: : jM>yʟ.B"yv1R.ʸe0 C0 C0 C0 CU.EvX%&uM.ҵK0ǰP0ȇIS\6a,z+' ~s(#r'gD( Bn2g?)0Gڶ뮻:#0@|UUa܈ 1/ *Pj_y??-;W<Px"Hy樣*A5!SiRZgC(`(4QAԊҨW_(N'#0hjZY mg=E?O=OmD?Q0nFQcYAr=d4N(CKf6W'tRqڔv'0\=g1m܁xC `VrcAU׿VSoa>|=tBM/Ѻ^{P"c\?:OdG=d` l}XH6  Ҍ#|~8 * |;7z9ID~ _IF2ORvֿ!}G9JH[|S*(w#ʉB_^ OcZlSZc yg3a=!#S$d>>˜yd΢"]Z;0-Iu Da2rcsx tK>p5.#+o$ɜ#qOO#E}6 w3.۩3:p:-W%bΧBiuρWXb> l_-8%5x?͓.èH76/ ASF862Pka l]NBh;2iHڇr:xIqǯ qĝӓ&#OH<]原yZ}GD<>@4*m5>LȍCju,[{s䏸ӂԯ 6 i;)7BVVBpK+yu!]vuP* I!kWܗZz ֜K1o;I/'ϐְ9dT|jBAGu'xWZVg(k{N~imV_>B@ e@~8jE1.Bj!`!`!`!`ԆXe7߈3DnQB QQ3W_}(D*N;&i\wu2Qgp E_%>}ȬZG ݱ* *%*bMhegvS9QM teI'uqxP%a/&I/W?YpEsUyLG.TIP{({L=sM7T^ |.Ң/{]Ege+{N`ʧ*U%%5s'^[}?辙*MPbϖPŏeiz,UIP԰GV^yeQD5\ӕ*[k@ ]m*v)f19ӝ ! ]iOꍵjgy5 8o=.--ʥ#~y睷f 6Y>yUAzdO?T<zk&ЮXHn֠6,dl1c*M&uw\a|AۗP:Cz_R4`y͂3ў8&(Y{{}+o/J*"m.0棾\~W\!Q%j";n񘃤&m|#"2BжehЋL?ȸV~6;\ԠDi{\?uO S5}z;N?e)ENQ6|\xᅲˋ#Usy}2qca-Ң$݂ܧ7~=Uƕ}ǽFVkub"ĝ˪益ݴ1@_ou46Oe]\яۿo >R2q _ >6l>1d!d'!Kh[RHo3ClV|Jxܵ~jҔ߯ɂcvbR+%c&KbF!`m?}3#/?ߞic{6M<2gPn4NT90Qgmȣ> zʭ'!FEɭu~JI2,4@+16-u@ 7?K{.V|*mRgQZ{u'￿X'Qsc Y]T_8未d4@a|m4RK-% _A./"sqh;ŽuG!ʿrF?BWrjgz~@ZHv}w9r(NXܣ5z/YׇiqH]=|B#mhvrsa'͇Bk[@XW[JZc%ȽF޾ߴ0bĈbd.;kqI2CvQXgOGmQRai:5ڪ kQA ]ElXV\QDU0-!`!`!`!`@fR7߂`/tca+?YP$4:~1ڑ콢߿ۂqz+nE^CQ6mXx%x=QYZSL!6+0 oֽrexvJY꤀3~bx _:`-@kQmF O>+(!5 _Ϡ(G v$Q{#|?sG8rJs3kެ!mjd'1dgOR,ڞZʓ/նA>|L3#`G.KGsIyBZ۔rPrUHFCĉ1!J A\zuUrȱ}{ZDGak<_?N:qGqN;Ho.! !O 3d|]+ q%m^BHY ix!#Q#3JݑC^:|W]?C}'B⪷OyG;"SMBa/[dټO}J\?jٗA8~ay >~q50'EV}W5}{%N1(~ꩧ[|;rAƞbl0lFj*!cz*f|ȳI2yrV4Z쐸K?4Ƽ/g?ğ+ҧgRV#ﰬ!PeL@FUz;Sa)r;@_UvP)Mz̙kicqBxƿܸ˓?x<z5l4W97z_d&l)֛m&ld]нBL2 izX̉2A|.{Q;U Umq"w)XYv̑}[^*w[fp*+d_##*ק>Ѕ~?wCکxB1\"u Ŀ=NԆ =ti2~3#qߍ|rس!}Z ,XRiyۄ/-nGVlO!m'H sO?$T'Ԋ[y=A1krg9p:=m }ˇOG+T[, Q>U :ㆾ:qdTIk%[M@w]T;Y/ QOH\sEm3BRet8L&E[O:)wC0 C0 C0 C0 C1dcpX1laEc , p+ r/}q2s?S4M(/>- ڒArQ@Op9+UY,)!k$xssʕ(Ah6d[n)=*4!, GVЩ!p +A8QCTm\D}gns#?x:9U(M7T6h#G!F/22Kx,;o:fy*1h{Æ1n:_)yh{*+~>z<su\NɰܹD{c/^He{Ɖ']&!mic "%nH~c\p:kBk}kq]C䐶 Dm'FR70=#oN:$iRHoHc>)^;7P.,ͿyG~~רꫯvfiQc[ 4GFzkYn뮓38ǵjBSF݃.-/L7tri<-$u1PV%K/uiXj2*@T?/w]<)9ewUnj9H qƵK/x.?oq'2FƝ~%ZJFȘ&?Ԗ$oze'!K5ma("636ۿ;?W>4tA:{{챇~6HVdR:G?dȷJ0 $EǑ"NtWA63Ng;.DL+;YpsKƮl&hrCi2g^q6"r1[F@};:6ͣF 3JX!)?KnRA?,M8b9.rmQkm7UDRR<^deE*F@UTIR#XwuGu䩩7p@\=CONųV"g/$9W5_mNO<9yG:Qa%pk)w0بw2ސ>LqE8SRiy yG{ȟ!+W\gBB_8CJe[yryHO9Gֈu/XWkզ&?u ![c$UӟKԩ4=ZLAlOVggQTgW_l<4!lQ۪&^+T@괈zhg1 C0 C0 C0 C0r[0*#?r$,<,t0l09CNxz@oVRc E5iI O(f]O>Iܾgx" !b5ŧzJ lF"%<<,&r8%d;2ͽ[rJ}k(Cr8D čqKB]4AWm`1[[mF x;2E#_tE]:I.E[Pja?,^`WvG|VN(̇{xG8h|ki{*U^x=o {\h\'D.wRyA˕<}{˵z5r/eoYfq!mJ!c b(\->f.,/%\iqHh;WYear-YЇw_GؓƷ!iq(QBTҨRBf'~ߨ4xM>23SqPp2w 2{W]Ȝ(`c!>#ݵXi~L8O}zizrלtF Ae 5GX*cH޽'7%J K 裏.^>TBMon3f_y8(dƇs+HV]uUIҵaڍ1M=Jv2.Cc|߇Wz6|8t$ m C^NU].4'47ܬV첋s|BK\H|K;q!YAP،; CCEWgO~|@=l+_ԄȜg|]*$YggY'Ƒ k8YYk82&&%IqbjhD5G,8:T% D B%]T<00H:k8o-b-[3/"^GƬjo\"Q>MԱMH,vOP8u**ngw:8U&|iѲ"g/$9W짖5tX k3 u"SeYNxVߧqu5R^~_I:ܼ5"(]9yW[Zmz `H15z`ouFH_K!u*Fug8l`uNu֯1u8Vg>ߌ%Ќ;L;NԱ\Sii2 C0 C0 C0 C0r'f "6 >D HFJ)q?sFQ>}"Uvbo {‘*Ysj颜qǹ8h&RbH3ZʝSHI"M<.6G{n$Ϩ M9$XEJjH"]$LyrjQtgy3Jr.&0_dE"%Ӯ;ĕU1[^{H =`͹AZQH}n-RH"Ut+ku 2$:#T3RBj~ ߆oȠ%5i+{]n%Utר@/x1W^y+JZ<rVBޥ*+Y,xy?j "w+(>6܍71^Clq=Z{ d BO8d$ i Cr26;;S/~ː4aFh8Y:jGi,X1:f2BbVL/?p`cEK.9Oܳ^2*7 9gdΌ'dhfX% :ԍHF̙ШEmToHǑp4]2ldA~\~^?JAp-TFELEE#G3tXbMAE 2RB')Ry\I=G/T> YG _p"gWW+kX49~@'4-X )Qc :Aݠ4#Ӽ6nیwg5>LȍߝE'-/<:(c_:'fnr1@B)l< OZY %~t6+N{P~ki+yU<X'<6s5$=ƫ"L>;i@:.Aۇ4/t#]:-+8O޸/C.5#xN;V[OިSl^ѱa=6oIRM#dLu'0V]5Rro!`!`!`!`C@ͅ fxyi"%(m[o YXd[p#Ńz_sF2RoP~xѨXT aYFq;,BC=U1 [,bl r-W$(bgM?ԫy馋Pqzr#$IiP.仁鄘/KKGrfB.DV{y$q id#H 1od[WӌR-Y$[M @326h"L~OH8:eEƍ7ؑՠG>mq(+fʜzv2Nj.CI~ҽaK@%쭫i7h!@z3]J:u03lE^hGVR\%Zj| /o6=}O?3(; i0d_HGpiKH;FrD㤑ϸ1r|m{o T'F lWRl8۠b@ȪJk7y@A=sxҟ#P@_덷ϗj'R I}v#dLSsiV kũm?|# >@p26h4}B%BIi2yrҙֿpOZ[*)'C!6;VB99')4CڏHu*5wf}e#p_x,$oڤdPvO"`O2TZk 'Rcg䧕Dic,X:ƁT:D̳32g!X|mdCFُQ\z d}=*[:Vߦp՝ʹ&sRC恍30_"HcL-#]׋?Wm.RO]ix}/tq6{O+kmv*tx+?Jߙ?Iȵr:xiqƯ&K q%Q8Cd?@iJ:@nI<2U:P1]q>ykxi}H ',X{Tj{:|9?M[<$/c_ ^Iض< OHYI-8Zc  8Pw}v*']'rPi5<6{4'{oāy =KքI78rlHQ~ Fŏ#8zgtM|M5j(ٕb邇((Q(B(?/UɞQ2((aBϋu[}E EIx&jT,J5FyT?-v%]U0%s.~Ǵ ~+ِWҐ(lf\4%"UO2x`Q?2d(y(Hs:gdm6eC6JbMT^SRQeqqs))QTu,TaG!mX؂KQcQekՅ~XH[LTH\sV%%7 ¼ YF+?0*<+ԋjCm'VÏk3kC'+7N3"sVitL}VUyJw#ܱ_?E8ԪZD[;!1buC!/ .MGh#{vɁD?_JIԑQB7Kǀ5r!*\z>,>ZirOk !˫tݺi-y@5ܿn5xdƬE;jI}ZIgUW*ڞм;m3|L6͐g,pk4:Iu48#E5bGM }b2+dNdU^*=V?icU0Bo@8' (Nכ:2t~%tw\}em}ݘ{6t1Xc::x q(zkVmKE~NYGTh ;"+$;LY C0 C0 C0 C0 0" @(9DEI%$}Tz饗LjT d#( 6LXbL? QYL^]* bf'x‘ȋB^;_xG٬6=y!y hUVq$/r]$!tu]'|S w}e/VzUЗꪩYg}BMܐ2'lqyHqh!zyg916PB ّBڠ04c[%DѪ"/\BK}CXRy9ug 'X%s Lc򗔾vٍ79b-O>AGux ޽{<]풀f])CRtB馛*:rl&45줮9T{H G{-ь3,=ͨOxGCX;tL20ךEJԟ+8K`|h*] ْC0 C0 C0 C0 Cc`OF`D (TL38nis ,2,UAH[o=G2 3T|Y4%)0D,t3)?I3G9xh3I 'e8e}Ђ뮻cnᆮ}K㏗?&4׌ErH ${rb:x9rqsYy/s1rI'y'$Fr7!{NHdj*ilA# ,e~1ggF +ԕ3ۅĤQ3!tH!<@?Ap܌Ԍwijgu6F}}ek/7b.Ӫm|{A?$B(WW,¸fiiIw(H:b iR+ۃZyAvZRȧAn¨B? a` tkđq AV؍Ώ?W_mW DO>R^NeEJt~|7rq9ri筶ڪ%s|#e3jCyw*a!`˜kurGWV(ҳe;ii4[s1cGe,9$n \!GrL!dMQXcն@:-]@#Yf@F^N8AD}#_tTAqN/zꩵ姠)ǹR"_,Z-3|]wݍiuD|-[y\@IDAT @"G-Jx&"3kyIT#_{5Ô,D&!nߤwZ $=n!DƄ= }= >C>:Y^xA:;]ؐw:DŶnNcXkGbAbi㤙b-V{m$:tgTxKK!3y v~`cӱb.իW<%@~WUtBSNf _ k">~=EɖEn]DX0 C0 C0 C0 C0#OƋȨQa]Rv G gu֚o{<1yI?#FpL03HUᣏ>R -3cegT6MME{=9/w #+#@έ n; swtiv+& %CI %$G ZH?Xd%d<%#;S;GySd>\vY>|SM%Ж@Iu#u72+Lm< 'VRPQmdL((T!'EZ݉$]v{ǎX{GwjBx22H OS,ڱ8]GYcv#|MyG\kCk MLϹAѰnDi7\ PGIe'ED}dfͻhpŷ~{I'R?W_-_Xd ?:Yh!!CD0ݑv%u\a zÔ"k ]s5Cv\AYS9s .pzw{キ·v͵[/R7?9iٵ@7Yc8 yG!)\y݂!PD@E`Stn]p~"iC0 C0 C0 C0 C K2K4;0.uʨ fpQoo\xԲ80xDx,c!k&kc/2/Q,4 ~|7pYy啛:O$3|: dEtHyկzj6O~q63:ټϥ  ChWpxSO=!GD6﷩]8FY:]n֚!DȂ!)tw:ǚs#s=aŖ2M6 dy's='w Ц ȥJ_8)[7cxUQh:s1V"|*-Ϣ}曷25nC0 C0 C0 C0 C5dkpo*wL?ᰨp$;W `F_w_9Rum?Oa&'xlfNip%uF+; lwqm ^G[(;SSrv 8|#t[K k;zC '<)~dFVe=cnrȑ2B - mtF݂K|zˢ!Q`3,X ?ug RI蚡i:=uzO$_#]w}#n{'J{yr˦nZ1Y`ps뭷:8<)$G̳Y<I<ȓOvN AO#g1`7vi;'C ѣG_+c )I(3bŞH S`WsΎ#O(Fv0rNHq/JOHC|<SLT7? F|Bij{D]QrKVJS@M>_x-zT89(ښ@C}2HJD;\]ArʸD=6;Ѯ3 tUNj!.ƚ __}Af-@wo9*ad-P㭺}"/g 8E&5\Nn_ C>Y;D6F5xdq|^j|Sg.q-8"dӢ~*H!2~vP_ *|ű&W)D묳ӧ F0!/,%ٕU8ǜ֒ѭPNщqqA=]{]6]mXC֯kEDXc9Ek<^/bNlwk0C/߭ٝY A-_j,E(oFJSq/HB!"SO-r%AIСC塇r$y(.cK:O(.C Mdե8Aޓ{NIߑ^>V5Lx=dcVpM6Yd*)ř i_~2,83<7x9ϝ%0w}Whӆ~pI|ɬU"d3c/dDG[i*raN%-D}|:<7"&oSE5jl.X"pQoqmjOVFlk7&騪2]v%h|kYTKd)E2+ GM!C_G+PE M ABJ:Gk|g eXkQS6/{$L wk\>O`zՕT佌GsW_Pb9!Baly7և=o:d #c66 pzεq>J$u͉&HZj)=Bӭ )yvO=Oe9}}8N{)Bީrcyh4_.6";\ǣ+a0 C0 C0 C0 CdnFy;h/y"h?fE]nn;E5u10&B\f{:a (yNvy4%1@̛o)穋/ÄNH5w-( n{7Fx"c$ޔ~Ў HP >!Ly/ǴC~G M"[ p#@I'$n~@$75'F >lz#kdo-mE:ÖOl,Ԝp}Y($|ST Ƴ1?7KSmv#*HQj~睼ėi"~ne,ddM#RS=h BGs$6u|ud }q34m38O;fԠcFiڄ>@{O6X r~ #jp"U=at(Oa=NyPKn|9|<.y> rˉpBSii#)NyeEe++w:s:TLN>Y!ȹu^>!Gʵ"EC~S"6$:} LL>`yH>L?۾{ּbwdCkq  3:1{<{dڸod1DmIyi8q+'7|1Oё#G:$E|zIsG;$tˍq 1<@`Aeg6lӃ&dK,?UC t_:yqQEN96X0FM6rK7 &C0 C0 C0 C0 E 5/*"}WP8nޛM2\prg8/r,Nkv믿߮UR JAhYTp=).,ojn:)u兺rP_RIyq΃}]w+o ocJҢPe޲@4d%mĈmyu$AZHF M_Fx๚ʞ? O>B 䡇:G1 SEqZR`̇1zh`"~؜ "u ̳ Ɍ2[L-BijsH us^vEԏ]=c+oLV_]䨣/ݚYm5Q"Κ- hΑeIEuD([mU $5+#l. D _":qo%\RIХV\>/ǡ }Jydx|c#7Tt7K'z>Pol^/gO6G{H{W5oSrTSMD[ r5 /(G 17=>!uϟ\NO=cYӫN}9Ytp;zh甁y8Np|^+fzDFש΂Ll/LTǵo8 C0 C0 C0 C0 #`DObr'm?dgub}L>zɆnܗe G}Q䦛n_*."j/Hc,KO_}%c]yen^c!>@yZ}5֐J+u|y7l㱡8B@!diqJG(|~fpF(2xMC"@JEbE?:8 HHe:3_CC[7ߔez'vdcQ|8!`tDA"QHG)8rH};V'/ybHoƼ "Z}qN*cV`P7ʎCd&1}=u4/G>L1NA'qŘj& `DM^kQ˄nO{waT8w'k<#`FWR?o8 睌&l˨jp،;d,X;<1Dr8פXh,?;u' ϡбbLe`EYB-R7+2Ϣ, 2ֽ8 D'!_yeEC0 C0 C0 C0 C0"Ȏ^19oDkU2}58Re\~;NW%s.(@!FjQi<1CxZ~1^!\qſN]mСr; sm GEBsBRʷa:G1kރ>(A{ڳqa`Ԁ (2Hً={͞W<̎=PG M1FptF#@~NJ6n$$3&^X "ZNRhhu".G:Q.+=c.(e~ {4 JsX>71"ܻwoG Tc<#U/$*_5dk)$ lm޵!@[C܆_ (|1HrJ&qcemGSb}ؓ>r##٥r=`km^ȠAm K!P3&O K/tӚak1|rJ|k|*0,%Pv{Kg2䪫Df[tPq[w߉콷mrS"8_M\^~eyIqi5DXgQ8d9H-,(c):^0{5AL.gi?Q{}EŊ@p$|\F=r4 PF>M^\ӵRCwIMN` w}j-h48KD'>+Cǘ82AX=d[~wL5@7΢[-uqA=9˾=m4uٯC6&.|kUCt:[8Ew˂!P OaHa3{ I$e4qnI'5e|lp t 1!k=䎔 c0oeq ㍧ǎG bl/Myz輩U=ŀkyD?XYϷwu DnKGhquykI#|˗[i%)Ae{_'9C>wT>.^>!kf{'`c21۷{= t5hw-4 _u,-{GRD+1^o퐅C,s(_gU!zK[ ,W_gv^ǥ='uoM4Q݆o2=6h9Kϋ PXGNr9@C0 C0 C0 C0 0"Ⱥ랇/TdEĺ$o_e!|T,XTbqE[yef%=HPBL?N)^ziYeUdVryHsӀR-hR.PzkBb5\ e2+C(Kz%{WDoqYfhMp=@~W:Ei* pcv FH~a[m&l"vzA <*|rfXW XnW{n_>FJ_QQǧ\eVʩׂ!P-*u2+rQ"/:?6ZTMBʏDyDT~Q΢p>_Y @FG@?dygRq9*D^ncXZ r}/Dw|r ǻB&Gu4*.;C9/ auYQ\CzJ[(cc܁IF@Oҋ.,nc!BLgQN";)| j,N7 L$o(Hnw212)A|ec@96+Pk;_/sW\JA;PʠA7H1JK6P6ge8('PJ8qc'-(UM[;c{i&pT< on_ʸ1=-!_f̈Dc|/ˎlqesSCi4Yf~%.SC_#3r}dIq9c9<5F9J4y='d2C ˅6ƘW^a4/Đ oyK^F }|彜>ߨg://W63i_*mMϣk7y~!KKi5`RT? ~,ⱐ< ^y7{ iՐİA2\s OtBH6O9Pl}9`A(Zex<7UBL6ʋbG}Ϲ{X]ߵ>{祠dyu5 {'8IIP ZN-,L~,_"{w{QR|=|֏}&7yd 80խ[73wXN ͸4?]r+ d?*bY{x/sbG }&41:>O>wԝ mw4g=&qg=?^{B~ ~_ cn3Ukq$ xwcyO߅z8}% }:c߄lD %7ZwOA n/>M8y @69yml^1f Юl55y7ϏL9Tm^E@Ƒ)C%Kk2>+vVM AeHF)yؗ?8$*,wwd:~)sqJgb߼W&?q qx+3?>S'}{ѓ6^{Nq;35~r,l>9p3_FRd?l"g5WyN'gɘ|<# 2`[Ng|jS7Y,\ktޥչvyH*yjB-g&ur;\9k45k9D;{[9{#\]C]F<t*֮n7f>6 Av3f~0!cd8pphHs5kY^ӄ9`C}tbc@::΀xIq:sB@,U;&FctʕK:9Y' 9qt>y}8ItbP\#rP qL:Q8ǽN(\N)Gq⧳YqRD䓋ɧ=@ׯ[888?S ( D.%K 91AcGs4Q-RFxs:t>2?'R rghs|I tOg=;Lp#<{+p'r=z4zxp.Qr:wYb޵($P Lsex?=-VB ,0g >ЧӗAwYiu':>you;}lݻyÆ4N֧W~oe(DB~k5NҟF"EI 'ALb0P|YyeO8W_ZE#!&*Jf(dx=PIJ跠Y3`jwOk:>)>_ /ږۢ޸$`_Xľ6*Og,gܾS EطF2C!u>w|fZܰFeg<)&7uA䓚2gC3g3O|":BˈdbyN{{.s9gt3p9͛Ko ԩ WCy;# u<\gb-}_5=ߏ>_>R{UӒq'w=d7}E=IhY!" " " " " " " ":Lv[и10h^ %@ŋcea VELό*Svm`V`"\ۺe:fGZ{$98`iejWd ̜ t u^,v*P/YGx_ے%6 [`ֱO[ID@#@Q4 py[G˖E.*A$p*ܫEXKID@D (f@6Ai3ȕ ӤV3Qɻ16:B'PpSO#FXA *E@@&Vh}J"e*[v ~ TfƍAllp8g D)@\z'NʕvС*@ PbJ"N%KZ_ݻΝ]yؠ@IDAT@t4:SJ۶vr`*D֭OFG diЯP@LQA" " " " 1B` OŰLIzH*_<>C|'ذa.R# {x)@u#3gw(.Ѫk0hpV"8<L[hIpk#:uz>1  P-> rZ$@,̒%j:N`F:#w%^#>CॗÇwSM gN%K Dv*t,_me@ }70i/_%@ 7Ln7upHKT"}W^ rwl%"p옄 բީͅ  cwl%" " " " " " " " "L%s@ժeh'W$A}f)9v,F7Ĉk07 |$" " " "F{J2ux"(Y"*u~ѣ(UyGi>|aCv9D{` l'Oo_mE`*Uxط/)/?h!vu" "p;x}Q#`:O?FVToOL޲I}p @1ȝ;S7DD@D@D@D@D@D@D@D $6{ ۵x߰g E@D@D`n;lYm۬0)"" " " "YH˝۳0U!H6Y йsg#TLganP|y|DC0h3N$eˀ)M70q"Oa3C/ &MZ_VCF|S AoDCIa[,YY Ԋ\`F>4axa``lNg>KA\tQȓxA׼d P8P XEJ" "p=v\'󅈈@rB@@͚_"pЧРp$O /w4," " " "V/T3)օ ]t 6.\dVP<`_m&vrXy#D3|K/:vv׭AV5x5`੧—r0ڃ?dŐ0uwc`%$Щ0vgq=bW `@h`Q%3XFl*A)ŋ[1;uOݩ&" " " " " " " " # !H﵉/,2֡HX(T(W+rHTD@D@D@D@M|99MII`ӦMȘ1#-l}_oxӦMC2eB'N}R ΝS ہwߵ׬LӀ"͚#GKSRN'!Cl SOGDk"e A/A~j5ٚ\d=BEĉ6Bb)YF,"$)L`<{脗@J6ˀ[W 'el`ƌu*[D zyo_ _eD. Ԭ5'Iॗ f*+ 8`k={,^uv@[7VLHM{Ũ 0}v| _ ke_PQ@=O;vĺu`3m^{ `"(BR8`"{{y4ZcX*4ANѢY 7矟C}7ǏIZ*ѵ,Ybƍ:EL AFJ:E W.l >}N׷ Ŵj޼M|Sb_f@a[P([I@08`9ı'%9|&@ÆA(G.0 $~$"PWA$[>qGFE@D@D@D@D@D@D@D@D $}){w Jh%ؼx1I}d'w^" " " " "@sNϙ_vZd VJ@|0n8,_G*ŪgϞDцȜa;۷w/yʕ]v숎}*E"Ibҹ3@Gn%-͛{opt=jWO>(Ʊ3 ԭ HL.Z$g9x2D*ot:֭.mڀ!o p0})o#G!%#]'qc+M/aﶞ,`1JufŦÓrOۥG+~+ﴏ,I>;yLKqSRK`>{d\Alj@ +| 2,[+J" " " " " " " " " AE>{w;9XzР!Q8:c@ѢqvW(at$$ !ȔLgfB53oD?C2Q#Pм90jr%k0www t5 ر#j H3 ArbE.y')HcP HL7̭Z#% !HoѴ&q/9sx4j< LS \vc޲d9xhg|x`HᇁOKN:VD@KQ :7z4p]#޵U@B e$ !hPVI`?ŧ}^ud8$" "KXg"Ea:Z,Xl d:" " " " C̞=v꬚FcnjH(QD X y1cJd0QfV^z g*y@@eItIs*8g_J" " "ǁ>6utIL S͛{e$Y?N.T/ˣ(hWY vTOlxPWdt3+@ر[=S_ Ԯ 1C!`LWz!`ؘ**"cZcT]`q}g޽@z3YA}t2ˁZ`X^-~=hD E:Aǀ_:jN8BF `jxuRZ\" " " " %8Xy0 R6oތGdɒ.Yb ?<&NK/Ԉ%}^='0]u`M\<t&qcPs 6on+" "˗;wZ1I(V =82*MfMS:8֯.7'#; A&v8Ձ6maD,_V}f1 AyP0Bm  71HD PLcF੧\5" " " " " " " " " 倗Ѯ4(UD@D `~"ѭP2ٲª@8pVYc#ZM6/يJ&xgfuYW^y%4ho۶mKu:=tnx}v`tlYW wТ0ie{dK vm{Zw@ P-6R(B0IM"3dU%0*P(P~m:|M``>`P- n]{5j7x?3fRGyhyf[7ObCΝ 0hD M<1ԩu$" "vkY+?8W_PeU' !Ș?"Bٍh#ez`̙Ɖr N5ʕ+ & ݎ58>f~ F` !ޗ|(RXX4q[#>"1s%ڼGTcছ|_Wn]+JlYċR"5̚5jũ$ɓ.x9"!ȳ46GcqL d"` wn+re2."}Jl OW1L@B1:>8v,icC .J" " " " " " " " "m.F*/Z T@J 0rѢ@60Q?G#_t)R 3FOIF_~^%РA3 Z3ӓ+@2V] ]wLP:Pۘ3` %6sαyv{mE|g]];k:_|1{0o^ʎ"e|wZݻݱIBpW oo^ o4 ҇G1qTi{S\gO`ժ`SX$c@N+"YD PzBBfM`X'_|ocpS'e Hmo(P `P]D@D@D@D@D@D@D@D$V2Fى|I" 1Iq{_R:0caL-[4 FyAID@D@D@D@HNTpdK(Oٲeȑ#|r>|+WƐ!Cp8{ P^=``F;qg& <{{[~@:b͛tVH+g]#YJp3'>:$!H/&@n%!H7d'̞ sb{i}Z ARksiMNj@p|ukO ;o\z)pU%x :vbj("rc g?)^%л7Pp^Pvn^&)pv>ݳP\qڢu" " " " " " " " "9ۘ˹vmyv57;_ہCaIM=#]Bѣ੧2ED@D@D@D@KBٳ7O&,Y@D@Ŋl2 6,\y"Xv@r@>%0}֭-ɀiʎ%Es_ tK5W]E@D@ @ٲǍVfݺvr+ d, oX=w AFU PbkO>y}G \}50xs@.Q #@6KXA}a{>Y$"  @iӀMwo>nۢc=c(8.ӵ+y3_"+י-禥*[D@D@D@D@D@D@D@D H2Z<}}wE@D@ )p:FZ֭nv9d ŋ?#ؿȑ#(Q=BB%QӧGCٍW\GX ^q…V49VΊ$J"IFoi'g)J$I+o W.%p @tg%'&@!ȬYmcX7q"@zܫ c&Gf6nLx ޽5Ͼ}S@P Āӧ e#tPiժ^`0k];{MvX|vyi 8!:" vP;6T/Ȗ fNO0Ϙ<__{&" " " " " " " " & !HKu cWuE@D{?\ru Wॗ-[#Oo\&l D@D@D@D@D ZA]/m&!(b|0rRjU\2(,<0L{uO<)# 8J"1۾}9s"V2axLyW^i%&& !Ho4S:&&kS]3B@<-[Ç۠J0Ӧ luaZ@ t,^l%sRR /haڶf}uTHWQzh஻`_&6@ @1f%p "r"3'@!͛0$xQ}MR`4p:'>trS89p8GVlJNз+V`&2kfJ" " " " "` pT_oR ΀VFk׮hԨڷojժw s2g5;T{ʗ08)嗭@ĉ@V2nDvTA#@!ҟn˖@,A#" "kccF2{FuW_2Y `bMsؠUQ%[0cQnct*ۻ2dt C)2 NV-+n'jB+/ (԰!Ц РI_<T+_1 }}v_WGƋ@@0~o9r$6@X E5ke&)" !Q&7/0t(p}0lqLt֯OQ֠bm`q.L/{>cq"|OU`:_[+lo9f0)Q䧳sFْ + ^'kh:(p)" '`Ƌ0s&7t\\3W_}5n\i/_?&_WA{MBIҝx/X={6L*UcJ:FagyNV`_ɤIقcDX[h Xȝ;R%D@D@<@`EƊ(P`aB:OL($~&_ A߂ 2Фwf^>Y  uЧ{a@5pP!re)g*S*cB7kPrPDFbwi [g=d6)ZM5?4=>6mѣ} CfB@@BiCSL`ؾ};v؁;w-k.1'$Ͻ&b?#GYOBiT?e4ъ0,YotDWYϬ G&%qNH|ѣI ~f20(8:ɓy%?˗w+97FVD@D@D@D@D@D@D@D@! !HwTF'VWE@"JƏ&OX@vu)+_ҥKQT @!H_$a#/$tf&g.]h߾}(̈́>!gJwR&@p2`ǎWݻ[aH G5]^Y0/{r%H+ȕ(%E:6 M;zjۍz5mI};d'm^":O ?,2z-Z+VD vdn+3Ӧƌ. w TL(޺V/[+D@D (Hx1PP00D bFuX1XJz +Yw"$ 7n^7oތ[!ǿ+.[l')HÒ%K&HP.̉|߽;'n?:Bf "<>O.q.~ʕ+O c򸸉R5E! ,B -ZŊ`d\h." " " " " " " a"0UFx+g@<$" "| qg XAqAxڵ3u%Fr7mrr*.%J0˟ã>?L䜦IUW. ,\LaR^{ T)ȵVݢM5㭷5!C*OD@D 6m23LLad*&)p>L;' PRB6ĉ^@ݺҏ7[" DL:g3- Κ +'o&"&gC9$9lSUF*[H )Ji^J" "D~\&4@DOF =zD"w)'`tBIBg{ݻ6l4\('P1PaiHv2t )H % R:bi$w grپ}{s۶mڵk`f\&!Џ 5YT)Ν;-fXIfNMS Eν蔫RD@Dl^~x%Aছ=ܖ4|pp@lСBljHwMyTHg5%oH.u:u;D 0D{a s U zJ[_JTW!!Px!c7eG eLywx@+A$%+ Alޡ!`T; nn*`t A&(NճRqas;MZQHR^ID ƌl|o͚E("  V ͛߆{F*#l 0bDcݽZW Azeܱѣظq#V^UVaݺuX~}hٱcI(H_ /UTAѢEO. ̓'}%u(p=[{ qn6?0B~g#t/-KP\9\d)b$" " " " " " " "p&DkHoMEID@D '>ƍy 3`oT˨gO?A """ " " " $@!HEj5q\~X|9뇎;>0^y);eLd _Pʳœ GӦDl=vt|Ъ(\8vꮚ#0a(N]RB]~kESO k8mS0/lH>}lO[C;?lw*U OED,Y[nVp-X1&"d˖ۛ4N*ED@M G`7'qhۡKKț_XFp+?XSs24L(?\~駐6h^BPlY^Tx  )RR|D@-E=7lpRsغukI@$ۛ8 (D@D@D@D@D@D@D@D du L9tT]iF3΁kLn0caK=z@"EC-Oe$" " " " ~ @!|`l :P{$8rH443$ژ4td:&4h=ceQOnԩc'p< uD yel4fQ`xW!PE@D@@cBǏFLa ]~K3' ~*!HL'!ȄDe @ӦDB κvPB ѼkfTY+ %TQ& B>ϷM}WBj <1XU2=ooL/ Ԩa(@t| gcR0"hW" n=m=ܺ&&ݰFe@߾@޼?TI9l$cѣGCBL$%K`ٲe7l+қN2eʄDJ&/ (yW -gƈ#̻q*T^^{mʨq@H2` z:k&b @P%%|ufF[@ā]^z!Hڶm^}U^eN'x1@L:N"AFj[r;+VO?~<`|3IyY_U"3gXB@>i3I k|M<0dtPh:LT 28SD@D@D@D@D@D@D@|O*@t0*. 8q":epUpaK.8nV1ȉ@/2~g7cW^ڴ緂|޿@X 9Vo>$+3ε"~{D}|,Q"yn5J"Zq[_)iށ_AqZj7n *1c`~_]t^2xOz\r%S]藝T9~<=M'ދ.sߖXW/A{Vp@wZ@j < lS'uIEMLt~;Ь0~ન i.~4<,(P #F LBLEzfVi*'-(O+J>!QY[om޼[{KNKQ:VM9{<y.}$&: ~EQQ=Z@D@D@D 6l="#KpZpRf@ `Mb)% wй3o}˗7`u};e_yh>Yj:@*WW6nL|_m5Lڼ9{2d9)n_ AleSXoQ-o"-[Ldԫڈٳg(Uٲv <'yns.a=P];`>[<[ҥ6Hmj 0p4EgaSW\. Xu"6A*p@ v{|"`@ʕ/S%ԩFal=қc$F 5k*9rfB:uPxqf[=[3f j@`V/9s,]G H`PsNV8afo(YdZ @gAf<`#v%֮]dB4 \wd mpՀ&F~ƴi@j#" "~fI(sadΜ9Pf.~Sr2<cK1]i埍{EHʔ-5iE=ڵظ16"'W\<;4QƯϾP[M2%0|> ARhU)]E@|I G`;gaC` _VCFG / xf D(66 Xb4,O<1E-<9ߒ>^ k׈xq-Q02u.#U{vdH?;݁Uo/l:ʽucƌnDqf8JIJ`ӦM,$V;H"XhZj[n}űcǼg,`;Z$$11198m['(" "*7F̙S:EB;t:}?p6vqDqc`ҥC/3(wάX!L].YcڷO]:JD=F'۶}\z)0d35jGk=+Ux@ƌ7d /ͲPD@B}O?m==^A:v[޽OUz4'ә?ȏgF2e0c +qmZ9պ"*m A lU)t z `,/Om7?E藸};EwGk#T/*"A֩c5-]UG[7;ׁw9-*}[ZGr>ݞ F8DF8h!ڶm-[]vXf nvcG@Z5k^3vD@D@D@D@D@D@D@D-t=I S&n^Nna='LF&G 3rt 7aÆHfx/XL'>g0yz3mׯr̉>}Qi8@/k 1ViU7"~1/ݧ3nu5`ɒ% {rеkо%?oR Щ﫯QJ|QAGbL;m?믻gKR%aKwe&[Է"/XN7??͐㏐.|dyn[/'5pYRZ -/t0SH0hPSUJi?Nj?xf28O-)*lBOH V| }Q>W/ſ])2,yg4w!ּD@D@D@D@D@D@D@D L7x%؈6Ɋ`G= 9F˔)?yGq/Fc$ 5pPS)v 0א!@@f06ZgɂŦQ'ꪫʄ诶" " " " %@wEqI/%iR…C  }9pvgd {裏#]vٳ+rO'КfG۶0ImzڴiZSV^O5n>}W\29lH$8ŽX%8'"%WR'%F x_;hxi~JQ `Dbn+R]0S8/?e@K/p sLW2Qjȟ??-`ݓڞ6'3 N&>#OAD4j!7Ͱ]_>.a0%LRI@ի?~*^"p /3!=Ub\8.7DG@ H2QTo׬ ޜo PaCWۭcժ"@IO wW@1+›jr"=G%"`/+ro]dooqkI4H2k$e~m `phs=$<Y&0y< o&-幱gcO0!tiӦMA_^;(PkJID@D@D@D@D@D@D@I XZ$"FaI jE(eL˖-tNx;VoIT1bD;&)R71};]wurv=r Fs:nQ;̴eT86`ժU<*VmۢW^&кkݻw… Cǰ{ʔ)!ʹs^3Q_2b Bo޼/21x/^O?IUv9WلMdY{´xz5pU0 l 3`:ĵ2X$?#slƣSc\R." " " " 0ά;$l 4:XJj{m`fv.٘nO,c*U*$YB}Gѳ@%I`:;Y3:t/(,MyBBŜ篿2~_<4XdI 1(PउIr"Nr3({2)}f͚={llҤ ի?)B;яŭ ӯ dϞ }죿p-o<%slQ8ePLfQq&NRx*" a&`拄R\!ȳ/_=s0x`\d8FM-Z*9A{AvIgXOXfY BE}ހ6ƍ/{+*-3Թy12ԳTR)=KumBG/H2rK~)m_hΜ9w6l.PfGcǎ dgɓ'juߞUg[?c!%nc<Ğg's>@I:e#4?Y?;qn{׭[cL7~IVi/R%ɖ)}IlPDSTG?e_hSI_39{9z>9,w朙y֭[me_" 6r#<ҍs@ c_OAߧLz:Z J&7sDvDڣ}ˠҳpR9l)[qiƍs-L0Ybc"Eo۠ӠAwޜ9s~g裏y4j0`c *u>Swe˖9H}t۽{s:~A \r,{:q,@m;2ч$ӿ(8%K:Υ:΂ikV{4 |ڵ[~z" $0uJ1gvǜ?I8Җ-[ XpN;4~=<Fa\n =wͨ,=L2|}EEҕ@Ӿ;]q/"2Vy~Ɏsl>8[mAt0ǩVq;[@=NY(>ĺ2U=y$3L戀č|uzֽ\u̞8!q)]wmNǎSw8cl<۸}}uyw[}N>&='YL,c,_vpcC Nn>2֓CD q;ϱ_~ױ581Jwwg!XW1]r[F&:͜C¹>%{+ү% 9r?DŽL(p?>,,& %u.C]o0`8nw] y_j*~u?j=%{mw0^±'s^im;fXb^~%vj%X$iժuV=%+{n9ze(/ ]oUafr KM '&_D@D@D@D@D@D@D ;^J/GB5EM_Qꈄ}xBK3uXԩgw`_R߿?v[e矻]A~z\n;+Vt,{J/a]weӥK3 , {O@vsN߭xf͚>wYv|!dh%bT u+Vyg`YUzAj)>U{Sx]_:~a:%W:s_UVu;G.s,S+;'sV=bc"ᮝ>81XocW=+;ܺÜ9@bvs T7tcziw>>S %w_h+yBcP'^m Tv!KsӽT|fr ^/VW\1Uc/mr[67ƀRB~OסP_fΜ0/^{|!HAQd(GDtN&dAslP|_/.O#z_/fV--Zp^ڝM ׬kS$Q-B"IIX1Wr倓O6lHJ3S֨ŋ?, >L4qGeʘoAJC?4mg ^cƌ6mcٝ.rԭ[|Z 2н{w.H#,]jYsϹ&M ·@gcF0G3  ]矇X2llF`T$O?ժus~ \y%PLb_?ߣ FY{_~n=FH5 gq5՚ĐQH|Qˁss^*:Y?kŅ^aÆ}!Uҁzf|>V`ڶ-֭y-d"`U(Q",J=[xX?m'w RHࠃ<SG*W9>,=" &`ݳ`B`R`pг'P"p3rmYjo_Oop8夓o#9ܫjAN>\'>{co:8s|͙ Y^x_&ăK/ԝϗH|ʨXD@JMJT4^,T, 12#G];vܙ)*{.'h0+;Fr/yIr >%{h̤kYMzʍH=ܦO>$x puszĞε|2rX EfTo9ꨣO~-A.;0}ݱڅ'P(-iMbݠZGv Mkqoos 9s%7.\n[˔(NQ ]c -իWǩƲ}|^iVJq 0a9V?2F& X&>? CUeq u8d: (iq)U`o2bcƌ |7/=H"" " " " " Q!J*>?:UIp {uF2e,_sp'Di~ߧmz}J[zgo߾Xb0o[^}>Tx 50jTd6K9f )e \o BCx^SvT~YD@ҙ(Hs@bK^7f=@ H2C]_ZbhB^IOMfϥܣ.3bo}"n۴@0 75kca~pwd>݂G[3&}|M͙^5N<ϊ9Z_vǘuC?s~8}]?Of6m@sr*اXON4_z ҄u+1JuBmsO?0UǻwdW&lF5R˽Y|^^o, IE6m^*!]{/¹׋2E_DtA)rL.KLî^2Fza}s_~)/G$tіh>wڷo or?LPLٳgc-ZZ6ҠA{N^L4 .^~*j[o-sS&P 3ցe7!er"*TmG}EժUsS/ DW[nݺ}ggN'J>aQtP;lMe1nժUBg1/6f+@޽lR^x!{=FfAb"*!@͚@^5ClÆ6n"o[^;k׮{Lɓ^$!g&T[ BEHGLLuJ0Y TRŅ,(إ ?!mYVZޯ)zT¤=/ۇ;gϞQyn]a}t(T+dوץp%_D9>pxv=ω TD@D@'`:(][1N~ cš`$ E )ҥ/z-cS,jd,X`> b՟_kÒ/o-ND ϒKlDžK*v0|Iy"?|O_gO']ySÃb`l1fϭ>Ĕl?lGy+BA]1m4)Rƺ&`"fc ~5_D z,<o*LH ض-:u3F F6c7ǝ)"kܓN]!uC|yo+aHs^r'O Z"ҧc ;\;<h~_e(|H=0qD71Yg͛7g?&c\>Ǟ\+"޻ ˷~ۍ%;ȯ LqtL pΘ1#sN>hϛ7#Gt y쓥[*" " " " " " " "/i@v,X'lt2,7.V s/޶m[*0eZ9/u-م^2o dM},E/1/:u213f+yg\crPzt(R3 /~?3pWpb/ǐ!Czsa< Itbʥt9ꨣa|e~ߣ~)}q" " " " "-[͛eq-J5@8餓~3ff&5k2:27jr redsm:}p˃zWbڵ` m\‚ GN=[ Z~Kfu{9ߐoΥO>-ʡ>~>Ys2pMQgMoE@D@! [unŒVt?b^K IN`v&Lr#l[(L<80- H TH\M7yWmH$>.z" M+pEiCDM@*Ǿ}_(d(֠'d_~cn[&C3)y9`Сn_LfYPƏr+G# }k@P!ߋ}׭r(е讻Wok&¹'a^VkEN /<1/){)+ͻrp |ͼ7K5(طo_;ɵ߆}z+y纱\{ӧ"0řľ;ߣσ _Y8('Yj 3)VID[o-͊F'hx3`f:T1ūe_B Yle0EuwA~YjkN;β :{챖M+o7uc)y^_/mdM9nb8_{-ЯoѨQu: 0Ǝ뮃]{b:Νq臛4>{:KbN8;{#9L}o>N|dY̪YRs,(Dcn@h,"8-[7SX඄3FɽhY_ʄ¯o= k*|Z32-M$RW 5}@2=zd!etҏ?2vF)}}I.rw=x֨Q#c}~ø;~6Gd,5{m<^µ'p%woٳ'{J9iӦM98ps:ɱ`]3 ) իW},Yҹ .4oرu&;x#.tgǎvl-R~SO=OÚ5k:uu&M`}:b]iGXGxb:t,SөS'wcn >6p;sq{LuK |8ŋ;N2s啎OjymSƥ~=iD`TQ T=?60 k䗀9}u:tӸq㈫bev;u?}x: @S|yg޼y0ZVUS{yuxTX1AQO}0k۷5?unfrիs{~6lXsYg9ׯw^оWKc}{erh9ig>r0 E? 8+;5fW^+8lВ׹;vYq:&&Xӯ_?gܹnuNO^X'U7C|ӆ@ i6,t `8@xg//1Oŵ?jw 7 Y:g_pavnr0X6Z0w/T)qssڷw?q6lŲQD Y yD|q[7wovO?u6Y-O]N^kvڶu*U~sOsM~C3cOrǞu\}-DX?69c O籞Pv,A"nqT8_~Ypտ},TfaZgkt9n-/Z]v:~᜛)^ѧ;c'iI'%L쫊xnNq{_=<2v9u]h11@g̙2>v1??Xbna (e79kg(}{N}h%2w,X 4(OZ%ejժ=#+VpL3῟y普 zdcvssDZ2oNQo!*" " " " " " " "oqIҫWԩQN@_KT `~r\U Izurf v)YfZ-A-=˲fl۶ Sn]7{i^ﻜfXP+of1LN\:lHĒ%)&ZC Tu]%ad`x`K7O?MZٳ~=OBOb/ zOI" ">nUD _.\s@%L VC;d 3x`Eݏ֋=;w’ٲ'['GcS!8S^?n s~aA{etfn7aJXrL}+h߰_O2 ~8|7lgWT)ۍ9̙V-!]DL?<ۤ;$2(ޟfO`t\r'X;N!ٖ. <,ܟ^a_~{pl^><({v\`?&1UD lz? mסukCٳa}5C(8jM? :uO>ϾO* atw.ׯ-c̾}A͚5ׂ[C)}3!{nc=W q>6 5 %1Jw0pU+zu=ĵ=W[ ̉@Z^ؐ! H8RLrJtCzZhjI=wRs N?Zcs^߄3V h6>s6f{q0!xUT+`n%ԅ{z):5ED@D@D@D@D@D@D ($#%;xmӁ>}'<6KBD0(hs Z(٦MwUYf.7HeJ " J@٠R)" # ıO=[fiW̏bYi֬Y,(ȢPLh]繻+ 5DcUO駟ƅTPIy B??QiĉO&>QaJG@㦭R@8fy0e ģ>}J0/ I O|W^ g,[2"Uvȑ^"ŋD&0k˖ެ+`FKhͲK*o^xMR,ٛƾ-H&氯OrMK&dĎ@~^R [}Xh6\rIdu1)}Vv󀫈@88I`ܸ$0&MI!y7["b)5;+k[3gN0?uc{E+aBtdJׯ{{ϣ 4cYLAL2co!gP&Mce@(-TS2]%ʴj/p&eر=pzDLӧ{stϡࠃ".7x뭷AM\{d!c$!" " " " "v\repTvm7#f޾};:l`'{DsD@D@D@D@D@ N`ٲe_S6m /?/fYfi6QR+]16b \v}(\0.0J>Ck.}-$W^Aް+U 9Tm%" 8lX}y08dO ?ji$ AhdЏ"slM7*T(g|IKp}Ov 7cƌqǽދ>:t,+7Yl?robn& ؁" " " " " " "$63g²t W:1 mLuW6*"P GW0`8UEE[HH6˗/G:u2̊dFr|'A&xؾ};nkwq=`6 @IDATӁZ2/7:R嬳wܑuI͚adW*dn:=\L<9}, A&4[_D~`r:@2<& .&)+l yn@6b^{{ Ql#E 8࣏T`J}H~ÁM἖l-dnuL#W04}2_2mHvM_Ä6 RٗRҙB>i@qΝ_wĕ|A43J5spӧ} h$vgLZ"s:y7߂D {j" " " " " " " Y H2+ (f|Mai-'@o:{S=.Z9YRA qHM2EzȂ/lX c:~8|Z_x 4'.  <$pOWtTM'+^[|]ڙAd"XıEDQZTBIt4dJ^y0=+4iT0QJIMh*" "oo f`\߁3cNqN1co_ƍ1|vm[Ѷm[|T[ǔ@<8x@Hλƍ1cƌWO%'~}h|$3|/Сj$sq˟Ɩ-[ξt1eTʕ+1qDY'pjժ/Ljg9s4m:-_Z2#p^|UD@$]йΒ%?.YV$$l2* A& Iݻw̙3/K/8m@vرwy[fo[Zo?ࡇ>^~ذaΝ:!%5ZD@Ri?H2ǷiSo#BIOhJQ4 hXAPK~`׮@v Á>}|0cӥNW3'#Vk@Cԛn}|MK,PТp mio" Zk},y~x>P'zu֭O9ԪU ?xօ#" &@^oCwo-.<ٯ3/w@A }֭+-$>Z 4aLs,ķcYb&L~)["R5s A֮];%ڢF$:) x1dȐ3PE@0h#*p%^ S/^Z˗N8+ R D@D@(RDBY`ơz ~UD PX*SxyO]|!ȝ; |8tgO`ذ̍8{"̙[ (cAllHgLdC j(Ww_=lZ`8fвeKcقiW%+i\6yPT:U@`֤I0%cdm 7`b;0~ 5'"˾#L+@4ilTƵy˖-=ݍ3L֭qM7aؼy+>ӌ;|]Npָqcn g6mJw|jxnPy,CcO>L@ o?u `RAp>Kx^y.z ƍ?ZMBYMi.iW\9*(lrDQ`UH/_}+vpVUf͚iӦg LO]I/)K¯l~͏7|cnLpexhժ:(r!)C  >:L p%@׮c%T؇ݘwuYQ_E@D@D@D@D@D@D ,[,TL)ybÇOE}0 uUGڝ (ӄu:{yd@"E@D@%P$.(1c+Uu"%۶I2J(M$gh՘z|;g,k]mtgl_/!HD_J14&51m2-v" "`#!w"ks?{i8d<qC AnЯ_?W66%(.SI(5 O8 a_f7N'x".\;,9 " "eۀ}3|~`d <+{{3T3M"¦H#*u UR8#a+Wty魷رc]9TՔ)I?*NLڵkK\8b0>LWLxb7929Qrn#-_R@O;e@(mWӌ%ӿdsiAll <,lֹi< *" " " " " " "n:!ҡPEbM"A1/܂⪫.URY&33ڶ￟̖6H 0sH!РRۈ@ H2z8TWgj -NREJ`F`O IcZd/aCNkh~ 0yoG qۀh@JM^Ćя@ @͚01xMcP3#F60ݔϟ1&Mf5bUx¡b:!=PWmܸq׫ D@D (zG}NMTw5j^x4))\?xA TD hQkزeK7U3ԥK 7.]~=~'|73І;o? o҇VZn=5jȨTȠ6ۃ3}j9/ QZf\h~ƍ-B#ԵN VB@&YhF`4FfO=7]]P_| "Ppy?7o>@ԩ~WB. ͸k]'֞T TI9 fάM6GSjPT@nK[$pؑ<%|qTn<1[NC*HXx /,I\ٺPHtwdC<1vۓ&YD@'@$/O7l]n2:Esy=Vnu}#pE!9TOZ5` T B`\RJ%PY " 1"p^ s"$wA1{S[nL _SD [%- P q޽{&%]e˖e Rd𫯾rd+aUV4Q<`0dm٘2M_vou6~LWF#d |S೦eOhn<줿mzdآ+" " " " " " " " AFKkYԿe+[6Ef@.@&$wp@ҹlE" " " " " " "F'O)R&в%:r ж-0kPn%0Q\qŋ05&+CD ڷCےXC$P:))„L)Ղ~2ܽ{w)IAr媡T:&ʕsL26~S:(")b I)DNFN[lqS395~PqG]|!FN0䤤pT#=OFU NLtT+$NF?=su=z<0k@fTD |A!YΝf̎`P!5p=EK$ 7|/E@D@!P YUk aUZ۶ R%)Sn<1T B1Ea! X|+Ȥ|m ~K!:8`"b-8E0|2ST&vJ6ޯQ Ӏ^Cx#Ltûoy7Q80ҲIhv~nvm<.SI,>G %xiڏI2F{uv&0x`?ޞ!UW]'KaÀ-$n ^%кu@(@ȩynIcunܸ>\h} oCCt ?QW@rߝP2T9~>6KYnϞ=2=鯿r)*H! )jIaM\5kִN W)+x̍@l H2|U{8pπ]$ AHHӟ976[́aBAD@D@D@D@D@D@bC`ٲe&R;6Vȅ~msϡs4"'jSG%yx/1iRm\{-PX5Q * O]q,8| (] @ )X J+ hNE ~H~#ǧ%O DBs8i V,Ǎ1KL^*WDL'ʟc( AH}k] zJvU" ")z5 !)I{SLzV0ذaCcƌފӧ[RhҤIxhQI'w}?܎@`nz:tMs=Kl \๝| hnsۏ@(Y8(RDvlR_0S, ԯ2Plk.Wrun_rs0#Csys"}AId%KY2?rr`djռ, +3X_pA v*E NV|қ֭x `Vb ,hi AHKcG3fq5v)`޼ynQ5'%DMdELBLv F3٭}" " y([ X|䵶@:,(CmT)6uKS׵G*;RIjL @T :rgN/M{wHzC6; Zu:$!hLznXPLneğsy4` 5%L3G,VS+GhzK3Rd)9w311bn?pPI5=4A7c=&!ȄXD Ls >]<07>~ڒ]os? |'&(eD@ǎ\1(T*D W3ȑ@#䞬*VkZ(" " " " " " " " &hU}$lR,ϰa3X/Zu`ю0k\|1,"T)5[D@D@D@D@D@D@IBG2JED)Z[h۶Kt9sPDYƊʼnƍ)`ҹszJ|yz.JED@D (IJy3@q&ҥ݇jLRLw=X_7Hܹ3HhY+V? \M#sFAG>#r'6UDڵaH{׏' Aƚp?f v-pMp<HN| ׯ!){o?~}ONL,ᗆ  F[oM,3Ϡ)UUFV-Xw2?ct0˴c"EI~﫯j~{xD*Y LDEe#@ओ&7Q#Z6&{.0w.䓞d">E@D@D@D@D@D@D@D@D  I Jgq*xy9p#9(a>\xq`}{=Lؠy&E@D@D@D@D@D@D (٫WZ]$*c֬Yd^K/YE~"}L"xSoThڐD'v|NG?u>RџBŠ-J{(x>,p^B=oZ(" %s'U/;w}oݺ}Ao0x`O~SaلnF.iA17X ^x 7 EBOb„g,6k@{x>ۻƇ!p1̞ˤNԒd!@=>y?& >.h8LA" " " " " " "(;w嵨]v얱I~6mN:$7;H͆y(way4g!P>B-Ȳf@r6IW#@%\ :(_J]T4uk@Y0G}|'jժMsWϛjRUϠ?&20Jx SNs E9~zV+ Wqʕr%oٽ~-64{'iӦ{+ѧhAq} L (S&&hg" "p2!4h$%JI]d ҥ'UEK~I2goO> 0*&OVR9j@`/E 6Y\ۺ7=V #x۶ctza@ORk@VX.dΌ$ڷoo}pwbʔ)ݹLx`t`ҤR; 4n9`\L(\@y+Ӣ'H&[H ǃg IA AH[o7kTq'G#?(j0ks@.3_E I7'Ȃ[oA~+~'"P*е+pml䉙Z!?__믋ZҩVק3"_|1ENpE%}$@s Þ={ض-%kVt&d?g+ҙMv{xhW=.±Z5@ 0*pܩ,3'pn&Ə ~ld&l2< A&QJ?.bK -guѪU->Dk<Sj^D YZ?O櫯-#\+$ %b$O\ -j?"; f1L ,Y~xԨ}.$H3a;h3n];\`)?J2?ԂMJz9E(nzoZ " N"&O|M,X Sƚ55\)?Ej;{ohH>X7jTؽ?[W@X蘊@N8y2@\fbf;rZ[E z(@@Ӧ쭷 <, VM" " " " " " "J` Q4N(}N<ѣG[_Q{~Xzu Q'0r$P*з/@%н;к5pMsYD@D hʗd//H[z(T)Jr:z(w%}YK6@tђdrV-w&9oc7-" "Ł#.^y#~ͻ7y-/ U 8gz@na^zܙ^4?R xbAH4GJP닀&7ؼ8`ThU@{_ P>pԩ"qsgLܑОE@D@D@D@D@D@D@D@ B@Bmӆ7z0t\_@́O@CWytxp TD@D@D@D@D@D@D@bGBuԉT)zQC"NEdnD=|ck,K&5;Gg," "P91m qZ2ăx{)[6{K}P{M*1cKs$P"G4&;KM=yo['wNJrިgoj'+%Hu PXGC`4SCg[׺^}@*"  At' :'8X^2ÇFWn.1(T(s=vzMٕ}s(VȎrXxi'^:L ~:@g+عs'F2[#ıC=0qC9$v@=jH:ur!0*A">gJ'f,+u0j7TҔ]p®M}۷uJ2MO 5[D @$߃GUOMr# !嗁*Uvr_/K)@!=!`9d@T)yKK$,G"v0qs֜}6`l~ZDBJ3DnZyˁݻkB֯_%ޫV L"Nq_ Ӏ_^ oM#]닀@0ّy¸'{go;5jk} O=  }[ Qݱ"@-X: AƊr˱? ,h7Z`W JxqN: `CKŊ9q \uL wuU F j2aɒ@߾ހiKđ@֭ݽ"86mڄ>q5/"h'YdwމUV&J+0MǁZK.VLiez‚ PR$N=rHY~0ڂ֮J b Ν<$aY-"N8Ķ_bmE xO_t\}΋ҥoy rL1|Y+=Q"S|B%w̝O-ؾKJW_n^H+SǛ:vn&Zf?#z / IqCQ$(DY8^5|O<}|5xqwNv%|33O}T" Fy}f+Wd"O9%IA( 'o曽~#@>M7/ ș_;Wc-9ު}㏡P2L!*CJE( f˘  3υ QiB3TJ2"J%mνsξpK`J쳁lr!W&!\}r+7T)y O?=uR" " I<qҪex6".X(G/Dx5rM̗]˦=<@cc:Remzdݽ{?aР@?Ńwsi\a)8O!OBJ" x@~j/ଳ;k#ERJ8^֭[>@v^:{9h UW]S)M`988߀sv*yDAh](d7 AzG.i~"^~<\ҥ@d#c A^ef`iٲ8uKHc54kₑi17-(v\(:Ot=Ǝ ƍ(@`L6=ms~@>8$GcFe'a֬%}_u:}޽ v!=uϤX:w;w{"&0T%@K/hr 4~:ZqŽt=pc睳NC_\3yKHcz~+? ;p ?OD@D@D@D@D@D@D@@fͰzR yU)!ФIzӧiYwI6 NXd´sx;H2>:zŰU@~EtTD@ )|le͇ծo\(p(·:Mv,3 .[y A QT];`Ŋ@LhyŖPI \{m ٵk "h:HDre`%޹g aHCr8lӖ q|)!|+(~$6wʕE y-h^^t.Ƀ`PolD!H_Si?7%Y+\ C .;(˖/Rx,_'i4SOA1FCॗN+KN:WD@D@D@D@D@D@D ֭M7[bkW^ye} LࡇBƍѳgO \T- qq W&N-. 5+͛'!Xl_D@wRZ8@A6;W[I hA0 {)J Q{3V?~-g)nO)ˋ⥘:S|Ce/" " qPk-%i1KR<:z(H/>8fƌ g9J1/ IAҶ/?' N s1uYL[" L>UÆ*\s 0dHiGot?%K? 1.yTE@HS j1)T}ŋqm}qip[}; V2BЬйE7mۮ}bD/f΅UCU8yGQRID@D { xa%KTh|꒻(Rz?% IΙ ǝ:,Zj;_T &^| ɑG k9xR+cۥx^EV Q}^췣~;>r $Ĺߔ 9旍7^}lpW? \{m򲯤%>?g̜v '. ck=" Πw& x7MH ~,&ڊ@A%Tx% O8D7.yN&>|2Q|͝i}x8(5&Pz-5p,`trFbmqKKJ{E@D@D@D@D@D@D@r@-0ޢ?EoKׯ__"?kNE EF4:= cHAO8Xa .mnG AȃV5Oׁ} &z}^rL@r;.y8 ;ƌVR{yl׮s~" " " " " " " $ЬY"Jr)lmv<ƎSN9'Oe.h8JC8FQw]{L3g+8Q 8n.sV@D@D HNg|f"黣$ { @ &@yګdSpb~ k3&p&g}Y_[#S[(@<{qNqoxW'6m S B] @Q6DIB.[M5~.;_((4gNAXt-_լ PSL_ .SOߵ=e`Ȑ/컯ߛ}Y`пP?s9 '(mϓAD@D@D@D@D@D@D@>Q^V~򯒪QlB={o׺ _|q=_+ڱ#ǁ /!g8U_D@r5 'ESyRU# H2#n!5p&E/%'d ,pF iO!LU sY P 򩧀.]C -˚ мys@W_ rqAH  Ȇ=x …kMSx$Pcv\M?Ƙ8sK& oaHno嚥g G$υLU+~m}@?p}b;sf{s;W$"%>}\pAtfnx@`n7ѡCܬJ-" " " " " " " " $ !re"}HNү^lଳ֭w^2wv$N]#N2X '@Z2PYi6 [o5~ nmUQ)0ᄏ9] ;wFÆ @U^=O^y%@ıL%8pW)3od;|I2}OB>޺S|' Rdj6 aK@B﹭oV |0~`Ԩv2@,M#GB^ B6 j//Pۗ-tR,/_#0}:@1;.ÉN]Uk?sVqIROI W^ \~y/ LxS^<2;i̚c鮿,J%N}}$Gjl/WeA9`@ ;fM'[]#" " " " " " " " 9KLD@M*2B'#A҈bH;PSh>-_܌ 3˯XlK?2doD ŵ_J@ r x`=+E\fTT7&V6)L49 rjI, 28glj"FTq Zjn8 TL^|Etk˙(<֥8?Ƨ F{K_ofK>/22ʕ+L%pW˭iJI\s|͝0.8&@ф79$b۞d ~*@aªs&kkgwS&ˠ{' !HO"v6{{'I|n>!!=ɓaÀg ^RwYB+Rk <p ^{ h۶"9Z}=\ГOb7>mݗql`ы'yժU7|Iωy~ϑsϑm^l8ϔi߁TPKشtQH C.\,Xk>IDQ`%8$"c-nXt6D .hʕnae]V`РUu[׷~m=YKGZCqσm\_S{Z6?u Kns]tM3ߤܼPLBWZ#!:oe[o5f6?i~&^ij]%YdBbX` [8m9B13^jh|+q,>G;`\5?_3_pdsfy_^pүi| 7dT^H\͋q\d -K4²+@E ?#hҤ >}T4K];w/̙31g|S~hqѢB#?LQ]_"ǾK1f[ۚ H.׷q]]&ZeJ9e t2=N" "jسu^E PJ"iڰ!#tIr ~zn5d2iɋc/h>"戶E@B"YXp'z( j+" "PhO_ΝsngS)U0oމ'p.9{b`XIF9>fF4"m^hϗS. os\8g9r9 _sr"\GOt"uۥMONIM62 iS (z>}_%qNf}96fT|_q%L"M׋m 2! 2'9yr]~˒ؿ>N B10-mB>J"Mn8'B6aOKY-ƍZZs[&MԖ AȃV53O\8ax@N_w]&7If19nR>q®S0;5"s9q9Y4kVpvǕ27IIYNr"DxB䚎  s=wߦ7hH|AQG5 Bzu1 vgM:HF>Ѡ.kvc@ l[3h-P.CqG;Xj ?>}G|N7xFm돵1+p~}hYǁK54 B 5SO㼖}3>͛J'PЦHs%3ق#mPǠD@D %8iJi"@_}6"E8$BEΝ㟗G)ɺ+%OzV)E8DkJ"Pf4iwkWS'Ai$" " Ls༹_k?rO .H/ۦ6K>YN3Ciw<2(yr?WN1qnܯo9)xK ɹ BrAyrΑXfamE#(`_?ٔqc,PD2zߕvhBY.췢?~} P6e*@* pB>_|/&f-7P3a3agMq{smiN#5hPO%NS/#(ЃBm݊=c-oPXE[bb" " " " " " "P(8{l)i @Ci4i9k/jr*L6mZ" CʓB _$tc`! Bgl hp12VO+>>߭u;?'L>9w?a?6l6`[jյJM!dUxG$0oi}̙3`?4in(-ZAۛNҲоJdjILD@D:O4Ӽ7[K40\ПR||u{?/}+R P__?SF*FR%"4J"P )À^ lʓt\.̙Spޜss&^po{ и.)!`%ø'c~@"s;\p< )wd%^#-"BHi-I/ ifEŻ{v!иqv'@#C ǹ\?{GD,ey}qbS5u]B'X VUEɯ\}N'X`3ɘƿIf:&S\bu;ң9FI=!hp7'QD@D@ '^}@;ǩ;.{ʔ %pw}焽>7Ӱ/4xDC\ nSKݺu ֐ ΅2 P&:y1NnsFq{} 4RH1Sxty0j([X|9vqG''~ V㣲ੰ  6P؎(n1mL'C(۞pB 9bDTVULuw E!D@D@D  S{_Y?XE !qޜK]3`KJ'9(Γs8_W\nB:ΏOcv31FnaE{`W:Hi,@h kmzM<x"l(`_&*j*8Cϟ_SBщ\~}^sA*@,?/(J&nN' )00llAU,d+`R3I+2ܮ;ǽ 8\a"ׇ>mM)r" " " " " " " " "r ZW#M>SLq;O4`3<"6v #{J TT&hdbOB͡CWلv VR9.b7 m "ѣȚQmFTB @> w@Lkvv(0ȱ  ǚJ&\s~'#e3` &6AAHH4.JMM6֭."r!ӇR;8”3uɓ';;bРANBزeK\xxL6̈́믿Gyi7n"ǁ сCA!廙@pNWeCPtRbNiYaW/JT5jZ ti1 {J|T .q VD36|dZ`6OA( *" "ak"w|GgY G_LhU.02ߞsPώs\(9c Xd87y M6u6e.H_yQȑKdń!"c@<%jG߂HDƍFZ8TܭlyRH" ʠ>0(ٶ)6R(yѺuk'vNq=kժU˴re]B .tvK-5(rs(^J46=P* +aWC-zK-Wzz .c׌$<& )`E?>|D 0رcmz<&MK`uѵyHJ%`Xzso9SAa{]vh߾Hot7o?8c$-#y)j&"=D`bSSL믿vA,(Ņ(Iljw R$\h矻Ϝ ?X‰aYfniժE.\rk@zwyPJ)%{xW\?۹sg{Nn%:pPsQ S89лwoԫW/q=x =M# Jg'|O<:?TvG* q*gW+Y{-0QtػxD J3?Sbb`A.֠begXSP8N946UClr}@Y