flower-0.8.3/0000755000076500000240000000000012561016723013101 5ustar mherstaff00000000000000flower-0.8.3/AUTHORS0000644000076500000240000000166112561016565014161 0ustar mherstaff00000000000000================================== AUTHORS (in chronological order) ================================== Mher Movsisyan Ask Solem Lukasz Marcin Dobrzanski Alexander Koshelev Gary Linscott Tommaso Barbugli Miguel Gaiowski Matt Hughes Romain Commandé Andres Riancho Jet Zheung Audrius Butkevicius Yulian Slobodyan Rob O'Dwyer Horace Thomas Kit Sunde Adam Greig Luciano Pacheco Miki Tebeka Michael J. Schultz TJ Kells Geoff Jukes Peter De Vries Sabeel Saif Hakim Gaurav Dadhania Charlie Marshall Benjamin Drung David Thorman Hong Minhee John Costa Iuri de Silvio Balthazar Rouberol Alexandre Ferland Florian Glesser Tomasz Pazurkiewicz Benjamin Toueg Rob Hoelz Tadej Janež Corey Farwell Thomas Grainger Tom Mortimer-Jones Konstantinos Koukopoulos Samuel Cormier-Iijima David Matson Paulo SantAnna Sanchit Arora Ilya Lebedev Wendy Liu Mike Helmick Ilya Georgievsky Raghuram Onti Srinivasan Michael Kahn Gaurav Kumar Simon Westphahl Pedro Ferreira flower-0.8.3/CHANGES0000644000076500000240000000654612503641346014110 0ustar mherstaff00000000000000Celery Flower ============= Here you can see the full list of changes between each release. Version 0.8 ----------- Released on March 22 2015 - Google OAuth 2.0 support - tasks can be sorted by state, received and started times - tasks can be filters by time range - --conf option to change the default configuration file - --enable_events option to disable periodic `enable_events` commands - show time in natural format (e.g. 3 minutes ago) - format_task option to filter out sensitive information - exceptions are shown as a result for failed tasks - performance improvements - improvements in monitor page - improvements in docs - improvements in logging - bug fixes Version 0.7 ----------- Released on May 25 2014 - documentation - --basic_auth option accepts multiple basic http auth users - configuration options can be passed through `flowerconfig.py` file - --cookie_secret option for setting secure cookie secret - new task info api - --auto_refresh option allows to disable dashboard auto-refreshes - `received` and `started` time columns for tasks dashboard - man page Version 0.6 ----------- Released on Nov 10 2013 - Python 3 support - SSL support - new api docs - UI improvements - api error reporting and validation improvements - tasks api accepts `async_apply` options - --debug option sets logging level to DEBUG - tasks in RETRY state can be revoked - --xheaders option enables X-Real-Ip/X-Forwarded-For and X-Scheme/X-Forwarded-Proto headers - monitor update interval can be changed with `updateInterval` url param - --broker_api option is not required for Redis Version 0.5 ----------- Released on Apr 23 2013 - broker monitor for RabbitMQ and Redis - HTTP Basic Auth - --auth option accepts an email regexp - flower state can be saved with --persistent option - database name can be changed with --db option - number of in-memory tasks can be limited with --max_tasks option - task runtime graph - --url_prefix option allows to deploy flower on non-root URLs - flower detects inactivity and stops inspecting workers Version 0.4 ----------- Released on Oct 16 2012 - tasks can be invoked via REST API - inspect timeout can be changed with --inspect_timeout option - flower --address option allows to bind to specific IP address - tasks can be filtered by state - broker url is available on workers page - long args/kwargs are truncated on tasks page - Google OpenID authentication Version 0.3 ----------- Released on Aug 14 2012 - flower --inspect option for disabling worker inspects - websocket api for getting real-time task events - real-time monitoring graphs for succeeded and failed tasks - api for managing workers and tasks - tasks can be revoked and terminated - worker view shows autoscaler options - worker view shows worker's PID Version 0.2 ----------- Released on Jul 24 2012 - configuration viewer for each worker - improves UI - adds error pages - warns about unsupported transports - periodically enables events Version 0.1 ----------- Released on Jul 09 2012 - workers dashboard with auto refresh - worker pool control commands (restart, grow/shrink, autoscale) - worker pool options viewer - broker options viewer - active queues options viewer - consumer addition and cancellation - processed tasks statistics - active tasks viewer - scheduled tasks viewer - reserved tasks viewer - task options viewer - task limit control (rate limits, hard and soft timeouts) flower-0.8.3/docs/0000755000076500000240000000000012561016723014031 5ustar mherstaff00000000000000flower-0.8.3/docs/_static/0000755000076500000240000000000012561016723015457 5ustar mherstaff00000000000000flower-0.8.3/docs/_templates/0000755000076500000240000000000012561016723016166 5ustar mherstaff00000000000000flower-0.8.3/docs/_templates/localtoc.html0000644000076500000240000000022212326704261020650 0ustar mherstaff00000000000000{%- if display_toc %}

{{ _('Table Of Contents') }}

{{ toctree(collapse=False) }} {%- endif %} flower-0.8.3/docs/_templates/page.html0000644000076500000240000000014612326704261017771 0ustar mherstaff00000000000000{% extends "layout.html" %} {% block body %}
{{ body }} {% endblock %} flower-0.8.3/docs/_templates/sidebarintro.html0000644000076500000240000000054512326704261021545 0ustar mherstaff00000000000000

{%- if display_toc %}

{{ _('Table Of Contents') }}

{{ toctree(collapse=False) }} {%- endif %} flower-0.8.3/docs/_templates/sidebarlogo.html0000644000076500000240000000032312326704261021344 0ustar mherstaff00000000000000

flower-0.8.3/docs/_theme/0000755000076500000240000000000012561016723015272 5ustar mherstaff00000000000000flower-0.8.3/docs/_theme/celery/0000755000076500000240000000000012561016723016555 5ustar mherstaff00000000000000flower-0.8.3/docs/_theme/celery/static/0000755000076500000240000000000012561016723020044 5ustar mherstaff00000000000000flower-0.8.3/docs/_theme/celery/static/celery.css_t0000644000076500000240000001503412326704261022367 0ustar mherstaff00000000000000/* * celery.css_t * ~~~~~~~~~~~~ * * :copyright: Copyright 2010 by Armin Ronacher. * :license: BSD, see LICENSE for details. */ {% set page_width = 940 %} {% set sidebar_width = 220 %} {% set body_font_stack = 'Optima, Segoe, "Segoe UI", Candara, Calibri, Arial, sans-serif' %} {% set headline_font_stack = 'Futura, "Trebuchet MS", Arial, sans-serif' %} {% set code_font_stack = "'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace" %} @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: {{ body_font_stack }}; font-size: 17px; background-color: white; color: #000; margin: 30px 0 0 0; padding: 0; } div.document { width: {{ page_width }}px; margin: 0 auto; } div.deck { font-size: 18px; } p.developmentversion { color: red; } div.related { width: {{ page_width - 20 }}px; padding: 5px 10px; background: #F2FCEE; margin: 15px auto 15px auto; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 {{ sidebar_width }}px; } div.sphinxsidebar { width: {{ sidebar_width }}px; } hr { border: 1px solid #B1B4B6; } div.body { background-color: #ffffff; color: #3E4349; padding: 0 30px 0 30px; } img.celerylogo { padding: 0 0 10px 10px; float: right; } div.footer { width: {{ page_width - 15 }}px; margin: 10px auto 30px auto; padding-right: 15px; font-size: 14px; color: #888; text-align: right; } div.footer a { color: #888; } div.sphinxsidebar a { color: #444; text-decoration: none; border-bottom: 1px dashed #DCF0D5; } div.sphinxsidebar a:hover { border-bottom: 1px solid #999; } div.sphinxsidebar { font-size: 14px; line-height: 1.5; } div.sphinxsidebarwrapper { padding: 7px 10px; } div.sphinxsidebarwrapper p.logo { padding: 0 0 20px 0; margin: 0; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: {{ headline_font_stack }}; color: #444; font-size: 24px; font-weight: normal; margin: 0 0 5px 0; padding: 0; } div.sphinxsidebar h4 { font-size: 20px; } div.sphinxsidebar h3 a { color: #444; } div.sphinxsidebar p.logo a, div.sphinxsidebar h3 a, div.sphinxsidebar p.logo a:hover, div.sphinxsidebar h3 a:hover { border: none; } div.sphinxsidebar p { color: #555; margin: 10px 0; } div.sphinxsidebar ul { margin: 10px 0; padding: 0; color: #000; } div.sphinxsidebar input { border: 1px solid #ccc; font-family: {{ body_font_stack }}; font-size: 1em; } /* -- body styles ----------------------------------------------------------- */ a { color: #348613; text-decoration: underline; } a:hover { color: #59B833; text-decoration: underline; } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: {{ headline_font_stack }}; font-weight: normal; margin: 30px 0px 10px 0px; padding: 0; } div.body h1 { margin-top: 0; padding-top: 0; font-size: 200%; } div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } div.body h1 a.toc-backref, div.body h2 a.toc-backref, div.body h3 a.toc-backref, div.body h4 a.toc-backref, div.body h5 a.toc-backref, div.body h6 a.toc-backref { color: inherit!important; text-decoration: none; } a.headerlink { color: #ddd; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: #444; background: #eaeaea; } div.body p, div.body dd, div.body li { line-height: 1.4em; } div.admonition { background: #fafafa; margin: 20px -30px; padding: 10px 30px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; } div.admonition p.admonition-title { font-family: {{ headline_font_stack }}; font-weight: normal; font-size: 24px; margin: 0 0 10px 0; padding: 0; line-height: 1; } div.admonition p.last { margin-bottom: 0; } div.highlight{ background-color: white; } dt:target, .highlight { background: #FAF3E8; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre, tt { font-family: {{ code_font_stack }}; font-size: 0.9em; } img.screenshot { } tt.descname, tt.descclassname { font-size: 0.95em; } tt.descname { padding-right: 0.08em; } img.screenshot { -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils { border: 1px solid #888; -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils td, table.docutils th { border: 1px solid #888; padding: 0.25em 0.7em; } table.field-list, table.footnote { border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } table.footnote { margin: 15px 0; width: 100%; border: 1px solid #eee; background: #fdfdfd; font-size: 0.9em; } table.footnote + table.footnote { margin-top: -15px; border-top: none; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.footnote td.label { width: 0px; padding: 0.3em 0 0.3em 0.5em; } table.footnote td { padding: 0.3em 0.5em; } dl { margin: 0; padding: 0; } dl dd { margin-left: 30px; } blockquote { margin: 0 0 0 30px; padding: 0; } ul { margin: 10px 0 10px 30px; padding: 0; } pre { background: #F0FFEB; padding: 7px 10px; margin: 15px 0; border: 1px solid #C7ECB8; border-radius: 2px; -moz-border-radius: 2px; -webkit-border-radius: 2px; line-height: 1.3em; } tt { background: #F0FFEB; color: #222; /* padding: 1px 2px; */ } tt.xref, a tt { background: #F0FFEB; border-bottom: 1px solid white; } a.reference { text-decoration: none; border-bottom: 1px dashed #DCF0D5; } a.reference:hover { border-bottom: 1px solid #6D4100; } a.footnote-reference { text-decoration: none; font-size: 0.7em; vertical-align: top; border-bottom: 1px dashed #DCF0D5; } a.footnote-reference:hover { border-bottom: 1px solid #6D4100; } a:hover tt { background: #EEE; } flower-0.8.3/docs/_theme/celery/theme.conf0000644000076500000240000000007312326704261020526 0ustar mherstaff00000000000000[theme] inherit = basic stylesheet = celery.css [options] flower-0.8.3/docs/api.ipynb0000644000076500000240000004120212561016565015650 0ustar mherstaff00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# flower REST API\n", "\n", "This document shows how to use the flower [REST API](https://github.com/mher/flower#api). \n", "\n", "We will use [requests](http://www.python-requests.org/en/latest/) for accessing the API. (See [here](http://www.python-requests.org/en/latest/user/install/) on how to install it.) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Code\n", "We'll use the following code throughout the documentation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## tasks.py" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from celery import Celery\n", "from time import sleep\n", "\n", "celery = Celery()\n", "celery.config_from_object({\n", " 'BROKER_URL': 'amqp://localhost',\n", " 'CELERY_RESULT_BACKEND': 'amqp://',\n", " 'CELERYD_POOL_RESTARTS': True, # Required for /worker/pool/restart API\n", "})\n", "\n", "\n", "@celery.task\n", "def add(x, y):\n", " return x + y\n", "\n", "\n", "@celery.task\n", "def sub(x, y):\n", " sleep(30) # Simulate work\n", " return x - y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Running\n", "You'll need a celery worker instance and a flower instance running. In one terminal window run\n", "\n", " celery worker --loglevel INFO -A proj -E --autoscale 10,3\n", "\n", "and in another terminal run\n", "\n", " celery flower -A proj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Tasks API\n", "The tasks API is *async*, meaning calls will return immediatly and you'll need to poll on task status." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Done once for the whole docs\n", "import requests, json\n", "api_root = 'http://localhost:5555/api'\n", "task_api = '{}/task'.format(api_root)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## async-apply" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/task/async-apply/tasks.add\n" ] }, { "data": { "text/plain": [ "{u'state': u'PENDING', u'task-id': u'f4a53407-30f3-42af-869f-b7f8f4fbd684'}" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "args = {'args': [1, 2]}\n", "url = '{}/async-apply/tasks.add'.format(task_api)\n", "print(url)\n", "resp = requests.post(url, data=json.dumps(args))\n", "reply = resp.json()\n", "reply" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that we created a new task and it's pending. Note that the API is *async*, meaning it won't wait until the task finish." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## apply" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For create task and wait results you can use 'apply' API." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/task/apply/tasks.add\n" ] }, { "data": { "text/plain": [ "{u'result': 3,\n", " u'state': u'SUCCESS',\n", " u'task-id': u'ced6fd57-419e-4b8e-8d99-0770be717cb4'}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "args = {'args': [1, 2]}\n", "url = '{}/apply/tasks.add'.format(task_api)\n", "print(url)\n", "resp = requests.post(url, data=json.dumps(args))\n", "reply = resp.json()\n", "reply" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## result\n", "Gets the task result. This is *async* and will return immediatly even if the task didn't finish (with state 'PENDING')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/task/result/ced6fd57-419e-4b8e-8d99-0770be717cb4\n" ] }, { "data": { "text/plain": [ "{u'result': 3,\n", " u'state': u'SUCCESS',\n", " u'task-id': u'ced6fd57-419e-4b8e-8d99-0770be717cb4'}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = '{}/result/{}'.format(task_api, reply['task-id'])\n", "print(url)\n", "resp = requests.get(url)\n", "resp.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## revoke\n", "Revoke a running task." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/task/revoke/bcb4ac2e-cb2d-4a4b-a402-8eb3a3b0c8e8\n" ] }, { "data": { "text/plain": [ "{u'message': u\"Revoked 'bcb4ac2e-cb2d-4a4b-a402-8eb3a3b0c8e8'\"}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Run a task\n", "args = {'args': [1, 2]}\n", "resp = requests.post('{}/async-apply/tasks.sub'.format(task_api), data=json.dumps(args))\n", "reply = resp.json()\n", "\n", "# Now revoke it\n", "url = '{}/revoke/{}'.format(task_api, reply['task-id'])\n", "print(url)\n", "resp = requests.post(url, data='terminate=True')\n", "resp.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## rate-limit\n", "Update [rate limit](http://docs.celeryproject.org/en/latest/userguide/tasks.html#Task.rate_limit) for a task." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/task/rate-limit/miki-manjaro\n" ] }, { "data": { "text/plain": [ "{u'message': u'new rate limit set successfully'}" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "worker = 'miki-manjaro' # You'll need to get the worker name from the worker API (seel below)\n", "url = '{}/rate-limit/{}'.format(task_api, worker)\n", "print(url)\n", "resp = requests.post(url, params={'taskname': 'tasks.add', 'ratelimit': '10'})\n", "resp.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## timeout\n", "Set timeout (both [hard](http://docs.celeryproject.org/en/latest/userguide/tasks.html#Task.time_limit) and [soft](http://docs.celeryproject.org/en/latest/userguide/tasks.html#Task.soft_time_limit)) for a task." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/task/timeout/miki-manjaro\n" ] }, { "data": { "text/plain": [ "{u'message': u'time limits set successfully'}" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = '{}/timeout/{}'.format(task_api, worker)\n", "print(url)\n", "resp = requests.post(url, params={'taskname': 'tasks.add', 'hard': '3.14', 'soft': '3'}) # You can omit soft or hard\n", "resp.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Worker API" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Once for the documentation\n", "worker_api = '{}/worker'.format(api_root)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## workers\n", "List workers." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/workers\n" ] }, { "data": { "text/plain": [ "{u'miki-manjaro': {u'completed_tasks': 0,\n", " u'concurrency': 1,\n", " u'queues': [u'celery'],\n", " u'running_tasks': 0,\n", " u'status': True}}" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = '{}/workers'.format(api_root) # Only one not under /worker\n", "print(url)\n", "resp = requests.get(url)\n", "workers = resp.json()\n", "workers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## pool/shutdown\n", "Shutdown a worker." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/worker/shutdown/miki-manjaro\n" ] }, { "data": { "text/plain": [ "{u'message': u'Shutting down!'}" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "worker = workers.keys()[0]\n", "url = '{}/shutdown/{}'.format(worker_api, worker)\n", "print(url)\n", "resp = requests.post(url)\n", "resp.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## pool/restart\n", "Restart a worker pool, you need to have [CELERYD_POOL_RESTARTS](http://docs.celeryproject.org/en/latest/configuration.html#std:setting-CELERYD_POOL_RESTARTS) enabled in your configuration)." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/worker/pool/restart/miki-manjaro\n" ] }, { "data": { "text/plain": [ "{u'message': u\"Restarting 'miki-manjaro' worker's pool\"}" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pool_api = '{}/pool'.format(worker_api)\n", "url = '{}/restart/{}'.format(pool_api, worker)\n", "print(url)\n", "resp = requests.post(url)\n", "resp.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## pool/grow\n", "Grows worker pool." ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/worker/pool/grow/miki-manjaro\n" ] }, { "data": { "text/plain": [ "{u'message': u\"Growing 'miki-manjaro' worker's pool\"}" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = '{}/grow/{}'.format(pool_api, worker)\n", "print(url)\n", "resp = requests.post(url, params={'n': '10'})\n", "resp.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## pool/shrink\n", "Shrink worker pool." ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/worker/pool/shrink/miki-manjaro\n" ] }, { "data": { "text/plain": [ "{u'message': u\"Shrinking 'miki-manjaro' worker's pool\"}" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = '{}/shrink/{}'.format(pool_api, worker)\n", "print(url)\n", "resp = requests.post(url, params={'n': '3'})\n", "resp.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## pool/autoscale\n", "[Autoscale](http://docs.celeryproject.org/en/latest/userguide/workers.html#autoscaling) a pool." ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/worker/pool/autoscale/miki-manjaro\n" ] }, { "data": { "text/plain": [ "{u'message': u\"Autoscaling 'miki-manjaro' worker\"}" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = '{}/autoscale/{}'.format(pool_api, worker)\n", "print(url)\n", "resp = requests.post(url, params={'min': '3', 'max': '10'})\n", "resp.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## queue/add-consumer\n", "[Add a consumer](http://docs.celeryproject.org/en/latest/userguide/workers.html#std:control-add_consumer) to a queue." ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/worker/queue/add-consumer/miki-manjaro\n" ] }, { "data": { "text/plain": [ "{u'message': u\"add consumer u'jokes'\"}" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "queue_api = '{}/queue'.format(worker_api)\n", "url = '{}/add-consumer/{}'.format(queue_api, worker)\n", "print(url)\n", "resp = requests.post(url, params={'queue': 'jokes'})\n", "resp.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## queue/cancel-consumer\n", "[Cancel a consumer](http://docs.celeryproject.org/en/latest/userguide/workers.html#queues-cancelling-consumers) queue." ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/worker/queue/cancel-consumer/miki-manjaro\n" ] }, { "data": { "text/plain": [ "{u'message': u'no longer consuming from jokes'}" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = '{}/cancel-consumer/{}'.format(queue_api, worker)\n", "print(url)\n", "resp = requests.post(url, params={'queue': 'jokes'})\n", "resp.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Queue API\n", "\n", "We assume that we've two queues; the default one 'celery' and 'all'" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "http://localhost:5555/api/queues/length\n" ] }, { "data": { "text/plain": [ "{u'active_queues': [{u'messages': 2, u'name': u'all'},\n", " {u'messages': 1, u'name': u'celery'}]}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = '{}/queues/length'.format(api_root)\n", "print(url)\n", "resp = requests.get(url)\n", "resp.json()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 } flower-0.8.3/docs/api.rst0000644000076500000240000000014112326704261015330 0ustar mherstaff00000000000000API Reference ============= .. toctree:: :maxdepth: 2 .. autotornado:: flower.app:Flower() flower-0.8.3/docs/auth.rst0000644000076500000240000000522012561016565015527 0ustar mherstaff00000000000000Authentication ============== Protecting your Flower instance from unwarranted access is important if it runs in an untrusted environment. Below, we outline the various forms of authentication supported by Flower. .. _basic-auth: HTTP Basic Authentication ------------------------- Securing Flower with Basic Authentication is easy. The `--basic_auth` option accepts `user:password` pairs separated by semicolons. If configured, any client trying to access this Flower instance will be prompted to provide the credentials specified in this argument: :: $ celery flower --basic_auth=user1:password1,user2:password2 See also :ref:`reverse-proxy` .. _google-oauth: Google OAuth 2.0 ---------------- Flower supports Google OAuth 2.0. This way you can authenticate any user with a Google account. Google OAuth 2.0 authentication is enabled using the `--auth`, `--oauth2_key`, `--oauth2_secret` and `--oauth2_redirect_uri` options. `--auth` is a regular expression, for granting access only to the specified email pattern. `--oauth2_key` and `--oauth2_secret` are your credentials from your `Google Developer Console`_. `--oauth2_redirect_uri` is there to specify what is the redirect_uri associated to you key and secret For instance, if you want to grant access to `me@gmail.com` and `you@gmail.com`: :: $ celery flower --auth="me@gmail.com|you@gmail.com" --oauth2_key=... --oauth2_secret=... --oauth2_redirect_uri=http://flower.example.com/login Alternatively you can set environment variables instead of command line arguments: :: $ export FLOWER_OAUTH2_KEY=... $ export FLOWER_OAUTH2_SECRET=... $ export FLOWER_OAUTH2_REDIRECT_URI=http://flower.example.com/login $ celery flower --auth=.*@example\.com .. _Google Developer Console: https://console.developers.google.com .. _github-oauth: GitHub OAuth ------------ Flower also supports GitHub OAuth. Flower should be registered in before getting started. See `GitHub OAuth API`_ docs for more info. GitHub OAuth should be activated using `--auth_provider` option. The client id, secret and redirect uri should be provided using `--oauth2_key`, `--oauth2_secret` and `--oauth2_redirect_uri` options or using `FLOWER_OAUTH2_KEY`, `FLOWER_OAUTH2_SECRET` and `FLOWER_OAUTH2_REDIRECT_URI` environment variables.: :: $ export FLOWER_OAUTH2_KEY=7956724aafbf5e1a93ac $ export FLOWER_OAUTH2_SECRET=f9155f764b7e466c445931a6e3cc7a42c4ce47be $ export FLOWER_OAUTH2_REDIRECT_URI=http://localhost:5555/login $ celery flower --auth_provider=flower.views.auth.GithubLoginHandler --auth=.*@example\.com .. _GitHub OAuth API: https://developer.github.com/v3/oauth/ flower-0.8.3/docs/conf.py0000644000076500000240000002121612561016565015336 0ustar mherstaff00000000000000# -*- coding: utf-8 -*- # # flower documentation build configuration file, created by # sphinx-quickstart on Fri Apr 11 17:26:01 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 sys import os sys.path.insert(0, os.path.abspath('..')) import flower # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) # -- 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 = [ 'sphinx.ext.intersphinx', 'sphinxcontrib.fulltoc', 'sphinxcontrib.httpdomain', 'sphinxcontrib.autohttp.tornado', ] 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' # General information about the project. project = u'Flower' copyright = u'2015, Mher Movsisyan' # 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 = '.'.join(map(str, flower.VERSION[0:2])) # The full version, including alpha/beta/rc tags. release = flower.__version__.rstrip('-dev') # 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' # 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 # -- 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 = 'celery' html_theme_path = ['_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 = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_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 = None # 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 = None # 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 = { 'index': ['sidebarintro.html', 'sourcelink.html', 'searchbox.html'], '**': ['sidebarlogo.html', 'localtoc.html', 'relations.html', 'sourcelink.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 = False # If false, no index is generated. html_use_index = False # 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 = False # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. html_show_sphinx = False # 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 = 'flowerdoc' # -- 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', 'flower.tex', u'flower Documentation', u'Mher Movsisyan', '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 = [ ('man', 'flower', u'flower Documentation', [u'Mher Movsisyan'], 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', 'flower', u'flower Documentation', u'Mher Movsisyan', 'flower', '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 # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'http://docs.python.org/': None} flower-0.8.3/docs/config.rst0000644000076500000240000001153712561016565016043 0ustar mherstaff00000000000000:tocdepth: 2 Configuration ============= Flower can be configured from the command line: :: $ flower --auto_refresh=False Using :file:`flowerconfig.py` configuration file: .. code-block:: python # Broker settings BROKER_URL = 'amqp://guest:guest@localhost:5672//' # RabbitMQ management api broker_api = 'http://guest:guest@localhost:15672/api/' # Enable debug logging logging = 'DEBUG' Or, using the environment variables. All flower options should be prefixed with `FLOWER_`:: $ export FLOWER_BASIC_AUTH=foo:bar Options passed through the command line have precedence over the options defined in the configuration file. The configuration file name and path can be changed with `conf`_ option. Options ------- Standard Celery configuration settings can be overridden in the configuration file. See `Celery Configuration reference`_ for a complete listing of all the available settings, and their default values. .. _`Celery Configuration reference`: http://docs.celeryproject.org/en/latest/configuration.html#configuration Celery command line options also can be passed to Flower. For example the `--broker` sets the default broker url: :: $ flower -A proj --broker=amqp://guest:guest@localhost:5672// For a full list of options see: :: $ celery --help .. contents:: :local: :depth: 1 .. _address: address ~~~~~~~ Run the http server on a given address .. _auth: auth ~~~~ Enables Google OpenID authentication. `auth` is a regexp of emails to grant access. For more info see :ref:`google-openid` .. _auto_refresh: auto_refresh ~~~~~~~~~~~~ Refresh dashboards automatically (by default, `auto_refresh=True`) .. _basic_auth: basic_auth ~~~~~~~~~~ Enables HTTP Basic authentication. `basic_auth` is a comma separated list of `username:passworrd`. See :ref:`basic-auth` for more info. .. _broker_api: broker_api ~~~~~~~~~~ Flower uses `RabbitMQ Managment Plugin`_ to get info about queues. `broker_api` is a URL of RabbitMQ HTTP API including user credentials. :: $ flower -A proj --broker_api=http://username:password@rabbitmq-server-name:15672/api/ .. Note:: By default the managment plugin is not enabled. To enable it run:: $ rabbitmq-plugins enable rabbitmq_management .. Note:: The port number for RabbitMQ versions prior to 3.0 is 55672. .. _`RabbitMQ Managment Plugin`: https://www.rabbitmq.com/management.html .. _ca_certs: ca_certs ~~~~~~~~ A path to `ca_certs` file. The `ca_certs` file contains a set of concatenated “certification authority” certificates, which are used to validate certificates passed from the other end of the connection. For more info see :ref:`Python SSL`_ .. _`Python SSL`: https://docs.python.org/3.4/library/ssl.html .. _certfile: certfile ~~~~~~~~ A path to SSL certificate file .. _conf: conf ~~~~ A path to the configuration file (by default, :file:`flowerconfig.py`) .. _db: db ~~ A database file to use if persistent mode is enabled (by default, `db=flower`) .. _debug: debug ~~~~~ Enable the debug mode (by default, `debug=False`) .. _enable_events: enable_events ~~~~~~~~~~~~~ Periodically enable Celery events by using `enable_events` command (by default, `enable_event=True`) .. _format_task: format_task ~~~~~~~~~~~ Modifies the default task formatting. `format_task` function should be defined in the `flowerconfig.py` configuration file. It accepts a task object and returns the modified version. `format_task` is useful for filtering out sensitive information. The example below shows how to filter arguments and limit display lengths: .. code-block:: python from flower.utils.template import humanize def format_task(task): task.args = humanize(task.args, length=10) task.kwargs.pop('credit_card_number') task.result = humanize(task.result, length=20) return task .. _inspect_timeout: inspect_timeout ~~~~~~~~~~~~~~~ Sets worker inspect timeout (by default, `inspect_timeout=10000` in milliseconds) .. _keyfile: keyfile ~~~~~~~ A path to SSL key file .. _max_tasks: max_tasks ~~~~~~~~~ Maximum number of tasks to keep in memory (by default, `max_tasks=10000`) .. _natural_time: natural_time ~~~~~~~~~~~~ Show time relative to the refresh time (by default, `natural_time=True`) .. _persistent: persistent ~~~~~~~~~~ Enable persistent mode. If the persistent mode is enabled Flower saves the current state and reloads on restart (by default, `persistent=False`) .. _port: port ~~~~ Run the http server on a given port (by default, `port=5555`) .. _xheaders: xheaders ~~~~~~~~ Enable support of `X-Real-Ip` and `X-Scheme` headers (by default, `xheaders=False`) tasks_columns ~~~~~~~~~~~~~ Specifies list of comma-delimited columns on /tasks/ page. Order of slugs in the option is unrelated to order of columns on the page. Available slugs: `name`, `uuid`, `state`, `args`, `kwargs`, `result`, `received`, `started`, `runtime` flower-0.8.3/docs/docker.rst0000644000076500000240000000047612326704261016041 0ustar mherstaff00000000000000Docker Usage ============ Clone this repository, build flower from the Dockerfile, start the container and open http://localhost:49555 :: $ docker build -t "flower" . $ docker run -d -p=49555:5555 flower flower --port=5555 For more information about running with Docker see http://docs.docker.io/en/latest/ flower-0.8.3/docs/features.rst0000644000076500000240000000141612326704261016403 0ustar mherstaff00000000000000Features -------- - Real-time monitoring using Celery Events - Task progress and history - Ability to show task details (arguments, start time, runtime, and more) - Graphs and statistics - Remote Control - View worker status and statistics - Shutdown and restart worker instances - Control worker pool size and autoscale settings - View and modify the queues a worker instance consumes from - View currently running tasks - View scheduled tasks (ETA/countdown) - View reserved and revoked tasks - Apply time and rate limits - Configuration viewer - Revoke or terminate tasks - Broker monitoring - View statistics for all Celery queues - Queue length graphs - HTTP API - Basic Auth and Google OpenID authentication flower-0.8.3/docs/index.rst0000644000076500000240000000102212561016565015671 0ustar mherstaff00000000000000=============================== Flower - Celery monitoring tool =============================== Flower is a web based tool for monitoring and administrating `Celery`_ clusters .. _Celery: http://celeryproject.org .. include:: features.rst Contents ======== .. toctree:: :maxdepth: 2 features screenshots install config tasks_filter api auth reverse-proxy docker Flower is Open Source and licensed under the `BSD License`_. .. _`BSD License`: http://www.opensource.org/licenses/BSD-3-Clause flower-0.8.3/docs/install.rst0000644000076500000240000000111612510076510016222 0ustar mherstaff00000000000000Installation ============ Installing `flower` with `pip `_ is simple :: $ pip install flower Or, with `easy_install `_ :: $ easy_install flower Usage ----- Launch the server and open http://localhost:5555: :: $ flower -A proj --port=5555 Or, launch from Celery: :: $ celery flower -A proj --address=127.0.0.1 --port=5555 Broker URL and other configuration options can be passed through the standard Celery options: :: $ celery flower -A proj --broker=amqp://guest:guest@localhost:5672// flower-0.8.3/docs/Makefile0000644000076500000240000001515212326704261015475 0ustar mherstaff00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = 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/flower.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/flower.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/flower" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/flower" @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." flower-0.8.3/docs/man.rst0000644000076500000240000000732712510076510015341 0ustar mherstaff00000000000000======== flower ======== SYNOPSIS ======== ``flower`` [*OPTIONS*] DESCRIPTION =========== Flower is a web based tool for monitoring and administrating Celery clusters. It has these features: - Real-time monitoring using Celery Events - Task progress and history - Ability to show task details (arguments, start time, runtime, and more) - Graphs and statistics - Remote Control - View worker status and statistics - Shutdown and restart worker instances - Control worker pool size and autoscale settings - View and modify the queues a worker instance consumes from - View currently running tasks - View scheduled tasks (ETA/countdown) - View reserved and revoked tasks - Apply time and rate limits - Configuration viewer - Revoke or terminate tasks - Broker monitoring - View statistics for all Celery queues - Queue length graphs - HTTP API - Basic Auth and Google OpenID authentication OPTIONS ======= --address run on the given address --auth regexp of emails to grant access --basic_auth colon separated user-password to enable basic auth --broker_api inspect broker e.g. http://guest:guest@localhost:15672/api/ --certfile path to SSL certificate file --db flower database file (default *flower.db*) --debug run in debug mode (default *False*) --help show this help information --inspect inspect workers (default *True*) --inspect_timeout inspect timeout (in milliseconds) (default *1000*) --keyfile path to SSL key file --max_tasks maximum number of tasks to keep in memory (default *10000*) --persistent enable persistent mode (default *False*) --port run on the given port (default *5555*) --url_prefix base url prefix --xheaders enable support for the 'X-Real-Ip' and 'X-Scheme' headers. (default *False*) TORNADO OPTIONS =============== --log_file_max_size max size of log files before rollover (default *100000000*) --log_file_num_backups number of log files to keep (default *10*) --log_file_prefix=PATH Path prefix for log files. Note that if you are running multiple tornado processes, log_file_prefix must be different for each of them (e.g. include the port number) --log_to_stderr Send log output to stderr (colorized if possible). By default use stderr if ``--log_file_prefix`` is not set and no other logging is configured. --logging=debug|info|warning|error|none Set the Python log level. If *none*, tornado won't touch the logging configuration. (default *info*) USAGE ===== Launch the server and open http://localhost:5555: :: $ flower -A proj --port=5555 Or, launch from Celery: :: $ celery flower -A proj --address=127.0.0.1 --port=5555 Broker URL and other configuration options can be passed through the standard Celery options: :: $ celery flower -A proj --broker=amqp://guest:guest@localhost:5672// flower-0.8.3/docs/reverse-proxy.rst0000644000076500000240000000177312326704261017425 0ustar mherstaff00000000000000.. _reverse-proxy: Running behind reverse proxy ============================ To run `Flower` behind a reverse proxy, remember to set the correct `Host` header to the request to make sure Flower can generate correct URLs. The following is a minimal `nginx` configuration: .. code-block:: nginx server { listen 80; server_name flower.example.com; charset utf-8; location / { proxy_pass http://localhost:5555; proxy_set_header Host $host; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } Note that you should not expose this site to the public internet without any sort of authentication! If you have a `htpasswd` file with user credentials you can make `nginx` use this file by adding the following lines to the location block: .. code-block:: nginx auth_basic "Restricted"; auth_basic_user_file htpasswd; flower-0.8.3/docs/screenshots/0000755000076500000240000000000012561016723016371 5ustar mherstaff00000000000000flower-0.8.3/docs/screenshots/broker.png0000644000076500000240000021124212324702473020366 0ustar mherstaff00000000000000PNG  IHDR🚾iCCPICC ProfileXY 8ן˵]ى=KH%ZH"J!k"$%d)JByy̙3gΜwUK RL \\p 0yOT% 6;,L~Q>@ Cp- ̦<ԈM| ,DAl_a{[<vOG&S "tD=XpߠpU:>d_=8$'+Le"BqOs%,4|H @lb}@@?sozSaF~mOE8#!{,6;6fFO/j|oK_?#c#^PC4LޱN#Sւn++T[sZ^ ޟbb/Emwk.j/(F*dxLREn42@۴D,~ULP` K`~=i}TßL-9f/>|?A柵 J#]'~Ko*i?b1k5Jn:Q-G&T=@5Pݨ_f! ekȌ~ zW(/o* AഥuпIF7")?C6@k#vFlfCsY6h]dT῎-[l%|@p/{"(AT}0PRPTgW{nL؞ F6A+4AB^:f|)1h~NJ@h=` v\nĺ x/H S 8 A1(W P@ ]<#`L0p"A?$ ICJ:C yAP8 %@P:.Au6=h-(fya1XVa H8NOp|[.9<(EQ(u!GQPPiTՈj5ƢIh,fhG:}>.Gסosu Ãhb1.^L*&SiG w,ˆǪ! f`ck}wEljilpd]5qxZbnE^>^S<6Y>6>=`l{|$~ lfy/  9 %  Յ[DEDDD^҈]s;"V/6%!n./^%>*AЕ(x&T +=qDIՓNaO,bʊzwt]@vZ3r%>;kې'w*o\5< ¢w0pbKĊr1JJ:/_(*M/]+ //+PVQQSy ~ՆjK5l5k{]aqZڂ[[iuP]\\}`xkC[oݑS$ؔ{{)6Gܟm hy:=;L::;j?lzc]]u*ݷ<գSTiCFoc{-F̟u=~788<>4>;<"ח1/WFbFr^*z-f\u7oߎy7>D⇜IɊ)iޏ>ND̬̦~bTYs/s.s_)_7esΗ-l[h]]|=R?v.;/O]ŭI5[nmlD)PToeH wA!\|׶os K|?.GsnllE`; 2BC4 O U+7c,1c8Uyw av@daRg#QYΰ6Mp0ss3'#pIW.(cyRE2dO%ɇ*)nS")M*DJL95}FO1ffyNͮ93%1.p>OSxdkiIr=,VU_\]RqmRݭ %; 7ML"ת&g;:[V=~mDG`/Og?3ƒC*/4_ꍘZ y<^{:8C>̊Eq eߛ~|^Q[4-(7pBi4ՈV@WcT0X.L$Ӌ23p łaŲ1ssqps;yXnf@".ыb?%nIKJ I/KJg5(+)vREGeF'< c9|-Sږ?tJtt7)JFƪK&qfZf+wwгV)f6Dg;a>G̝y?4rA>q}QOO/u2Ż)h@ Ltg=DHGrRpŨԧэ1{c#q&@ 4Sk19jq6#qxቛ';N eNd}9zf=g=p5?P!(~ɪRSpEFbo٪z[Mе njߊ\?tQNHӹ-o1kl}P㸮{+V잵 zsXzo:]χ?͂Ug(AL%h9z@z d$5>-b@sh ua_ěH&GGZNC7?b1VDL#f ^~)bpx_EӸ!g# х8JM?ɰ̘,\G2&=g dYebb{ɾ‘˩9ȳ{υ_+/%'.l*=&f#&>"Q(-%"A\&XVF 4JnWQUT]W{DW5"甞.g27mzyݎVSl>;m8\\vI+{L>Gw |b=B<҉r8U؎x}ԄKٓ2S=Zf>|RCYم9w\и]YQQSuj5 cu 4}l&Wt~{l}gp y0RntķY/~W<.S^Zli|uZ=@$h;eBH–p4\?Bi{e=c0uE*6{A,^DJs Mȧe=NBw(MldHdglac&2ד.yRP{ޢѨyK+:eze5wL0'౐ԷMyޮܾ֡q+.Cw9HO#w

,H۫&oqdjЌlЧϾ_~ }[rZa̟kˁ˽+*+y+kޫ-kkֵϬm((e3@WbXX)X+FQu0P}tF{eЄ pHYs   IDATxyTՙwh@AvAQѨcqɄ$@$Lb' F&#`NH ȾMC[uUuUq:u4($XUgyssjBx B[4M; C4hG\oo]醪.6`{X !FٺO [ho; gyrsjO? (J__W+DyT<2Z4}D13W! gzĢUUUUUUO%6 U^Z4ݮȞ`rp-J$CS+AW+JǁOgEz{GȔtT#I ;~mt>^W+J\W+J3'E^}U^/~NPWWǗT---pYlbLSn(?PtCӍlzb1V\IYYd:t:%'SAȈO-qKΞ3mR^{s)WίzgGa8bM?]~?)9Z~{Wgϥ\9_W+?|> x<|>>ۦ<- -Qӿ#8>Ky?]K <q[.J߭J_WG߱mknn4X~!.Lɕ_XrnD܈eӆHrǓby[b)#"nt]B({졬~R((Bu"555رO֟Y}q6QG3=Uw߭\8)Jz+k֬a_bJKKٹs'g2ږ D25fK.QZZZ8v옫J 28dK.,_`ِND"-[߿?eeeUPB?~{2p@r6:Z|Oo![n/-e˝OwK۞+C+JoSYYI8RPP`ﹾ+\ߗbFQ__Ͼ}TTTpHMM uuuv6en'OjW^t)`}bwTTTvȿlBUUQ_MCӬQ%(FΫᮅȐT@fu7ir4㻝°bGW4uΝu{ү_?$r3wOgOӴ6jGl3;]ak'?fqE\AIgSW+???ߞD"4440nܸ6ekAVszBرu+Bw˫WiJ9gӦM1”2,)HCCx<᰽*ntK{غ]۞~κ;dRQ^?ߏuc8::xmf1.\W].-ՐQC@>BC FRO:wSΟYΘfWCOS?}|***{m:tB~~~[N1=JKK),,t]~3_?[2w&>tY$)SW+4Q+JYaǏ'HG"q5gp+笤)b$ !ڌX olWӴvs^Ί=gZi@cРA0M7 F[nk0]vj*6mDKKd8D3ke3& iMh r4!$w2oVa* ]ta˖-t5垵I9;jG^^[0tM'rl&Gr?|r2rlts5M3C"HyHː \μn}W'W+J2;hFS2B5],iV:ǃ糗d^ft9`o=gX|rkϭN:XaPPP@BhB3'9|_e̘11zo|vc4xB&Q:/hg2i+v4aқtΚ!JLA[fzӈtuM"]r&??p8l=i|:uDccc^>ϙ:.ryligl=4ZrͲ:ut%_wyP+J_opG . $iEAAkK-RPPІSsB!t]o@ b# g5d"nݺ6Sk U4Mcȑ x<]ܛW~ȸ4e[OeK>%#m4*a  qF[/b_@vur=NxhllMBt䕹7CЭYpCv=e򃨽Ug̍m_̫W[vJLF)!x<qIl吗B[܀S\\.{΋HJJJRd[n!+**a,57ΐٱcBO6u$?໬}Ft. e{He?e6jR.y8nf~%- ,kԞ.m.mX#.R ޛAGU3imwkFeў5_Y'NH$1bhׯX,cǺu K<kFAA'OldG/thYYG8sD{\+<(󁔮w{-2 -g4Fpu9 nW+J_QqŭqϮ]BmmZzx<jkkiiik׮vVOH.]rgMSץK%,<:!_'N׋ t!eBG nsmV\ 7mZπ_ :Ѕ]H7@c) Q4~?C`ì]jvn:/E۳St#hx#{K>>`ciqou+RlP:Bz qr>\cmk"L' .¬{u0?)-6>İwKeg)QGV#h^+B̚c9 ~M.*Qȗ}ƽ_<ƒl͍oLyK7f,Uϳg~jx8xcuZf7o6-$ɶ~k$vKZ R0s7 4L?㴯,"];wϷimm%//϶| ]m;---rِ\N6%M[VIfʵ=me'r?]/c洙vQ+J_YK$|>C~R% bXM:"aݻwok/F bxMc8Yqݻ7w^j U_:X'"v 1R>8~/uNa# |}B%dI6Z>9&>“+WL (-8`1x)-M>]_>\I@31:3 \9arp@yan}xɓ]γj5`@8_6Nh&`CvOCDximm_uI}\tEʒ4tΧZaa!-r/0 }nbˇ: ;oٳʳx2?|f eС𞄟џ-!TԗC2g%^\oՄ|k0Suh%,pb)2xM!X3 7*ʄ?f5tMbÂ_0joe|oˣ mwS1]ꅫm+Rfg89D"Q&L`͚59>=x"Nii)xp8L HOY$dg_ӌwcG"`\g~gTWrYpO#[GL}[X-OG9?5YOW+J$r_;zp iUyy:~ht#L/tK#r3lhN<"ȑ#8I{/t e%ƏoHo|~呟SfD Q^ThSq| R8#&n&eƗ8 9^ 4&=Nd6{)* 8rZEiIHo H t:m3s\/;ȿ={m 㔗نpP(fyG+ۃ :LL'[#V8˦[RGV_W+J`B9L.B#2A9,\IgqpxvC:Yx=NN 2^zjB7K출?p &MD~~>P۷j*ve;:CN5+ުN~nhrt䆒Ӻ}wt)*o npwڗEΔY/]ٵk>EEED"Tg>|tږu{XUW+3ҿmJT(V$KfyA.9RFR.Kn@,ϊ_x^{Xn뻼D٘wN:tD#|tȿci#dRBRE>YWKF{4;w msD)ϲ8@`'x Ay;2_]4Ms}0g{ _W;ÔW+Ut3ƚ>ANgUPL'(2wkL8n>~8MMM </Ŧ<# )YFe25EEEtޝݻiMMا$ۆ@~=W( +m_.LW+gWBE"O3,8h=eOCɘv9X?T~?>ǓSPPPPPPPPP@Vs0&ypfMjǵ&+!͒iF&Cjlo:- !Rb$#-+++ljjjtvrBflJt9Yϒ@w*";bvT*Xſ]G.#VoA+@ Ў>؞&>0G~KOᴍ5*Gf͔}9 +++lhGU{:!vgF@ʔ1Fy?xZZ[[7Ss^? d.PWg$sw8)ZAAAAAAAAAAAcYK/̖-[ٳ;/|>D<ܶ#`c-COzؔu24-|fod^m\B4?23jkk7|r/DF9sf{޽{gpc]o{/lݺ!C_?=z޽M()) /@)[KImlذK/}lOd:S%Nfhe˖q|>n:8ݻw.[nhͶ \0k֬6aO=_י9sf;8 y^y8'weSC)<o n@syTW|dܑhd7ͦhÈ!̖X5y +cʲƒ͋A`"3͞Nį.)K8f%M`'}k6V`ʈs:l*G?x`,4 ,qx'8/0f ^YQ22bgM$*@~~eÆ q sK. h"bx=뮻x I#C|1{=JJJx<: zHgfH[z7n+P+y$pz477zOFcCuuuAG= 6xb9BAAA29: ,׿;ahPEy5{;V3m3?8=ӦNa3u\ _k.oy4t'NWNf8h')++ohyNCS#yy!ݧ7Vs︆M7 ѣ>s&g/OU]F3oN2j|и4 _Y[Hc{M~9q S.2>掁z2jPwc.gLf|y`OΥ35|B|~T;ɬcywt>y}]Le.~_{{5U=L8#NP!)q Jk s9f\4j&oqa=vE) X0cw gdZ'$Ek9ѽ (>oEd_ye:n4Eٲ`ï{&g|@-p6#ùl}ߙ4ʭ=Ġ|r>=߹]Mv{ l8Ss夢Ėe64%@wr_#oYϜ-UL2CE.̺mvx#*{%if{,X0 `qF8N@n/K_\ēq}sc;L%N#‹sV-Dݶ0A˄*xqzWVƀ˩TWv$.i73g"\MtsYYbh9K ?~}@t'//PNg`{ t]Yf.231] 9cT8uU{1[5 ͷcpb÷Y~ <0g50qӎKxgǭ; 3s9]_( `srDqF| װFŔ[¹CF1~+0zʈ fˑs"ySzҧ2=E[C[_VU۵ xЕw& ׏V't C&x+(˹yWضm;'ߔ*8t]筷bUp {m$=WAAcƌ>O^x<΂W_ꫯgϞG?u8`|o 4aK !|' s78un \k]CCb14:rm6,^@T$SrU>k.S4s[1b9I+0KtB K{54Ěغmt/n{g),^> jocb܂ܧTOomiH.2;/ ?|W̽Wb̺Ä,hp-bĈ*`&o>¢?/' 1c.c332l$ظ|=Ӥ@?C'qwMc9q0nC,Z]Q!+PX 4ޥ~,&ߜkK׍>ߏ,\K'L`ȐiGr4ˣ6r n&^uGg>eSzjEfnv%gԕrkGS?hZiY)Mm5iA4tkh`}vwnW%Zqֵ+6yek+}T(z~0!p< Nvd#Nw?۸YL焟0`F) hL9G ^C+oncfƕ+4^`WPSn>BIAeLGs'rLojځQ<>$F3|?au&Nһ_G#NB<=zu N GxaS >@`~uO=-l[FO%;Hep0\iON~8s.-ʮ iiFZG`mGZmO__Yyp?-a̯mPejOl؜&n>>%y' jkzs8`1m~>4lѬmEk?CSB2~LJ"㋬]{x ?Ջ뮻.mL4+Yh8€:d(~xͣQ n:vލ//B4+V"! qm:Io['I3l}' \8BN$gΝ׷@>Y3xx"NKK uu'I SXX`o,w/}ʸѭ[74ݻٴiɇ7ndg 9,؃=ۀ'x9sL6̜ kیkR#%bGOrv?>s u');+xͭ4B˺u{3;,/>/%ˀzdzl=RGݑZh{9EN%C.e8PSSn`Tʤ{#9\ G8rg\l-! Qrpk,F ǸO"w %|u!Bu;,1o dƃ4ղ9L+͍u}C)SF!ӝX\q8zbPvT>Z˽afCQ-_}!B[VCX]V\e`ˀ]Bօ5ֲuF;*s5&75!JAD[444PVVJiI 1n8CCA @qI1+Wů)' wp;[:}MD߼0r<3uAՓ/)F3ȱx{.Q>`${~>IyFiL| CW,bC? &b^va}iUT]6-u9{/7x`i8A;ϚTPhxmtVqk$cEC#a|>B3G$ro;fj>jˡCXbxH$B4 |>.za#0j(]699s&fJtG8+e _PL9t0Ŕ &(./unDNCAqyg i)w#pF$RRQw"JcC# +( M/N9ʖb׮]~zIKK /"/fƍ̝_~ms9 :{n!t~4>%…/D 3.("DL뺽$Tg_PP`ĉtԉ $ v8lO0[Y$C/Ge=ƽH9kLx뭷?E]Ͽ@yy-o5kIl2MҥKWjGM_!Ǐ{Y]!Ν;Ѭtq!WEr]3UeحaOq)3BZ͗d1W˽gyz=>zxİa)--M{(((((((((((((dG<ٻYBB @Xe_AAA juiJ[ZZjJBZ7}_$$d_'31udǃ{{D>s=Ζ-zhdUc5׿6|N}WͦF֝u4橚GuNbwoY_us ~ه"Bșl=G'N kEhvOkVզnXP;b[wD]=Qޚn9 5c }K κc붻޷ V` 8WsvݻwXRNDǜn""""""ҐnԩS:|Xj819rMu6UECҵӦkqtvTXuiPW<֌*7 trT.UU3Z(MDDDDDd2KXXwfn@X]3`uõqҺa?Eޓ=1p[Uby'Y]\4\D̵` ""???,[,"""""VJkk0ԝuщ&?8뎯sΆyS?UӸ{w6q\WJDDDDDD䴺bhDDDDDDDDZ>g?=mo@sNUߚiR-OӖo=)Ӵ[lO-b{4m}7֖s;+ +_sTM[tvF|wW67jH+~ůW_+~ů},""""""rN'`K;;.O>DDDDD N'fѠ[쉈N0F%"dB"""""A Hg1`815-i9/8NML".""""r~"g"LșH'At2-r&""""r~p/rSC " U"r rڹ=sxDLa={[YdNTngƳ>^g,gT{3GMd](n*4E\DDDD^}ދc`'/;mWX1}cfwi*F70vW|W!F0 TU^9?k4{-}O2¢wǿ7sf#uW1]`H5%mSМ.wW4_ !me9Ŕb!&V[I)ye&"{n;m6+UcKѪ{Ai~4:NZzevJ әDp/CZ)/?3]ոj' tJ ܿG\ӊ &#~A>vE9sJ*!{}(.pZ"""n#ؓ''XFc4o߉6n"/oar;^^KfQ}k\;o>FZ̕ZBj ky VG3a?ŷhG\#>~J4q0w31~iDL؛'WhNJFs9;qRp&f?ى$-Q q~4Gc9;f(}`_19>#/9#\_9RQda7cI is0:0l6c+dDeK.`踇(ٲ$K̍<+^׺е=*^^,rG|16[v6Kځh81s UU嫯ag }r,SK/7sO'~kVR(as$xJz Z\#¼їݧޱBguwkk+6~ EGqxoS2[.!b3o|TBڃ}~!'fq(O49N 1=pn Hl vk>{`BrT #b씖sepi$8bz$|{G{ `J>.U]9^H,PѐFMF_!d8ZǵwL!8bQᇡl'Q<Mڅ骊KH;OЀਬlw=~ NxՍ_i1i%w %w(Zun+rs)KRR]^EAj)A31t惁jɮ7؟Q0U]we:Q_0-ujH<GX>* ).sm[*+Y6 t}"a!#+,ՔPaGU 6zF[:Vrt ̔RC|&|Sj>q\~w3QflU, L BC-^$*r©܏3ܿ{dPHxkvEb~~y-͉"""r>h)5uegmW}X.:sh4ٽ2v\ӓ]-\5y ~2ϐAu !(לn.LƆ:Gٸ * wr~q=xؽ?}sD 1Gɡt%k_u91*_r%i)_c4?W^i !/""B@w2n[e݁c`|6W_3/#ndqmc)OB6w6kgp5W PIё 9uu2#pTm?(y6zfsby b??S`SRÌqQ=))Jk5q1w{p ?o\">=P^^I@tF|>|4`̘ FA9p '鿬= ;nHf1eg'cH/M2[n./Fnsu;|8t,LBDΑ[tV秳ʒ(a 9ExI7E1 C{P,~pLL Nd8qW%#yU&a(=cCkE%q%Wb<ȑ$¦w=Na= Kꉷ)0Ew1^z+[LY+s\]XBLn)>/RS{ctOzqp׫:c8 fr{ )*#f_iLpma4TzYeu7q8Z&'0o'2X'9B?j;weMˑGр`hw7Wܹ_7YLPȰ^E!$8XA=l߿i#&z8LC3T%hٞJ'CRʎp8"Э:ch4Tn%}'a"G'_3$j*2~9w#L$/-v>?_ ؼ?XF؞#I)A=}$3J I߽ǮLj lyEMMYG>Mn6nc#Ofw1 x<2چhr1 `(#30dcDO#|~``̨ier i-^35olCdc1@Ð̾S7 i<$gb,l\֭CU@nH8`d RHfoi1Ӹ#]Kk\3c2l~2r4#}03\K|v]&""":N'`̐c#'Z>8F~ztl Sx6= c1 pUv3!| OƘ.D]Blrflaz*):ufV5 (%3'˵ qCېwY􍏢tL\ 8 yNOgks_C^t((8D c Pr(6njIaH V)Yyo&2 {_(Ep*&#ԗ"GzN~!3hd$CI@+nڷޣiiT&ƽHF䌟0lu$MeĕEGFa/K`L^ɻ0v<> hI>;( s|^kJ kw`pd #Fn&_q IDATc+,X3V+e֨f3TU8Y{M2::G0so}{3|t,IMфw#hk~Zt&'N&wSG'2ش-۫@׳*me@ɯʼn}-aF~E0`2l[9\}/IB|FVSw &xW6T[3}d2RZVQ,x_ǟ܇#>ts$>ɔOک"zCnqG:Y KSpDL`P|^Az`'5`K-2G YfF É?|;#C|$ɧa kzӤ&e3l3tQs闰c)kݻ|_` ueG]rcad{f%%q*b㆐("8#y㺄}ʠWfmi Z'ق)u39cG1eϱ@ґ0Mp]C` +8mUD`vɈ<՜+c}ku`5b卷*^Y!y-ɳQ݇ _;8>`c_]C' d{3A##o z&~{>j,Lcl8p: X |^K_ߺvDDDD:5]^~v-!Q)Ƕo LZ8!r&@\&E'(jpl8.]N_7oumr浩`hb$RߛAa 8x4"us@ph9v_ D3cIM(*qŐˈ CRRO&a4IJbrϱK8s=9l%G)e@Qy%Y Yܢ )?0G^hn#D:(-/TJNOK\ ϴW{ WSl-t'\m}ɩ8մEm>׵׍xFEt#YL\}_,cPU]WRTTNFK^N2_2d)vv?FAdrqtpHF9F?{\9k>a1PPj>5Ϻq} `DK{:CrYMY1>b_Ш0g=6i>yW-"q&B]Ը0 YĄա 0 G~krA^|W>DњDZ,} ͉dۛ0/'c8kY@*=HkFCcna}'!($^o$h<5; ?9uUyMQ'wS4lg1^֧{sH:o*rMpr''\mڲv?r,1c]GoΑLaP?+%i[ JPE/j ^Q{,\c,W\:C9bv%x 3(`߉ KɓH"{r9Nr{va ٠j8J א8ELNW ڲR5sT<O8}&\þ&k=nF/ 9>~FL6noӻr^`2S }혌FRwpa O~Kшt#kJsqx?[>6|oOM&F0V/ڪ_0aCn!~M&e.""""tbxN"z&scd*+ NwDo\svß8~󀑿gRt8`dNWs<#\I( rÔy[[8r(2vo {N;2. 8>hG=Ppj r2~YxouuD^cbJ3Wm]Zf;'7ؗ 8JnmϹR$mf+8i;WȦ~m ؝iר]Noj!>G۵v m5_D5O}uk#"""~a͏ebn+82Ą.$''u#/gZ-fLMgiV@@:?yI~r~1bv<3H^̻nRe6'+m0`=7ݦgZ p czEYMM礁r QP׶gs~]t}&""""" 9o&^O;,;.n&]gA99 9hVFVʋ.='FA 6@v6n^.|?(9?8liM9?G;`3iDDDDD\t)"ISEDDDD)%"dP-""""r>p)"JSEDDDDNރ-ҩșAdz[DDDD[)9?h3NEDDDDDN N*9 NΝ;lΎGDDDDDDC1GDD[DDDDDD p8DDDDDDD9FɄکgEDDDDDDΜDKxl/P-""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""=%?8egn| :;N=ed6l>=lxB;g{ג[EDDDD7um/VVH:@Ax9I2 꼐߿o4E`KoODDDDDD%:G1[x{_ّx0xn5:>As;9ǩܪF#]G߳iom1c(*M'5= lLLtqXsQ'ɤdPR#{ {Ҹ3Lp`j6c1HGq.G%#5 s~-4o:V ӲChjްOdSsGxEisY%s0=b+sv8lrԍhEGv} ?̚fYDz䑟p0 i;oTo4nl??vkXۉ4ѦGf/#P~),1eâY|MmY M_鳑^ìiܲ`_YޯI[xXySo_@|K9v퍥\ӖL <L.?_+X8gl̲AgF4G6=5@>4o#w=|Jas\FW+_y&[^nSmyGZpK6ژ鍶9KůlnJVjߙU^~mY,o>,&MHHhDX6EDDDDKkxO6 %}U"￳eg{_/])KDLl|X~ {-k]ڨUg؜Vd>oSLyB\`0SRMe3;i*m|utX]?>'̾|U&`XN?}2Igj<=qr_z,>c7DY?㏿`|e$m +H*,v{5aM gŶmK籠V?e덏L&`&7nyy沬ڭ,HFkO$61Mx+Έ#Б5F<|2}Tt{ w5L6yI, >Vft:Dn v|sLRǚb5 5]vgJ{tkQf'6'D63l̆sk9X9;i=Fd;^ \О_x%\M1O7tQm][Xm]DDDDDg vS Vp̪&62 ĹKmݾL떙}:;-޸_7>$ͭ%."""""vwJ/DDDDDS?nlmI'F l|-3BHI[n? ٝӊuD-qU- i=̙3ǜlk-k&C-:vp o|BE[j/>u| \DDDDD`%4NYX0Ӗ>]9#/f0 k|w[fu86ʲ,|ф195KTuDͳ_Ȓʝh-,vHOo+o6~6~)z.7zƶܜIuF7u%>̌;-8_{]b!q&jR}:8el[=Ή9} ̓ƉYf-~N,tBkydsmv )^Yz"FF-)سW$27-?!V.[S7곺_M tEboagVTDDDDDvKİgX#a6KWdӊi_wY9ռT//mm>2]vk+"""""]yt6QV@VnvDxL4!/Cr:M"]VKn^vTV_(={b^^mԜ*ϲ6Z<3Kj<6wj?,|~TSY~]1-+J;fA= 9NGKCQi%vD5Esڙ߯V r+*~~~~ky3*"""""t:&È xRE~KImK|l{y>;e!.<j1Fu6uÈO88cYDU߯¢;DDDDDNږU$6^]4s^ǎt3f /\^.""""""J v+lz%ީ^xٳW4REDDDDDș4f$ +^Fl^.kUyf`L[2}%"""""NS x:ջJDDDDD/:tq9w(1i;=-""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^`vޮRDDDDDD¼Zi0ZqoP-""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/0wv IQQTVVvv8ϏBCC1 9P]]Tuz|~/a)))޽{wv8""""""](,,bz'f0),,pDDDDDD J[ÅQ^^a`nh*|?o."""""-߿QDDDDDD(%"""""""^[DDDDDD `xl/0wvrr:>`0c$"]>"""".`;{x?_6\N g̪wy r:ˏWQoDU ݽ1N~___ ]Eo:8UXk?AZrZxH7aij/"b#,3׷XW_=,O*76 ol緦7_ #|n+DɵFtv IDATQ{<+1ۙ}6j7'/s5?kS|zK6&'87.Z;o G*ҾdwiǮlH[>4,ϣeGz%\o8pvGƱŋCx5,j.wcCnSxfRDDDDڦK`Y3w׌ڔCx_d]Ĕ{ԍ474Y`piw;G 9?=dꦈ֟.T>>/>flrlWy:+6K?d3f}\7mrCG|쒽1E0UV_uymM]stM}FCĦ_=mөCl X^Vy:mF|6ǜ?C٫t:|0Tjt[DDDul*{Q EG8(,k$sYѫli_g5k~J|?yrS>%}C 7<§4Q_r 7G(9ir§۸xrSǎgx$/&቙w3J)33檚y ,޸ W] p W߻yV#^Peamy{XMzd훔CMMGv.acܳekueO3s\sz 7s[n^ErMܺVBE\Sԅ^v_}6 Z0i:~Pe﷚sɜ7LcwLJPo>d՜ W9Ǟb:z K99o>徯DDDDLuJlb+MNS*sVLqIk&Yǧ~ȇ~OHb*ob?ثO]S/߸˙}+w-[1Fr/-3pl䗵5ÑW74nX0es&\ 7LbxaWI6Ɍ!zK b '(܂"B[,Xk_CګX~,m_w /হr__?vW~1cTz/?Y$r~ k iE[qՄ&t;7^yum{e69p-З;;+xD~7aG#u|`sDžWq }@4l6ozW՜ c[,:yp8LOsɩGI[_&ro vee[DDD,u)/?I7`e(O6}Asg^54oӐiߑz|͉юdRdz,փ]/ޅex^2[/ȵDXUD}ٝEC9%J>Ҥ -Z_[?c-uzYy[hju 1rLsۿ+? &=J߫l@O[lliqVn[1waҿ׹ܼE>8՗7+/""""e*`Y( yu1~>l_aXՐG ;Kx3Vpm+&? ݖ ,}1>ݹ(oЃzp$nОTR`g&70H幥w6 0o3}=;+`zϭE (Y/ 8ȲWF4<Է6bkQ7ڍ~\2Զ3^pOy>}fJ>@R~lLܪr]zkK +M=+=<8 8Nfh8`K! [;WLz'ke0?6{x櫈thsm+nf)*ˇ_3[nAճm WGu/"w;n`ډqݯYR݇wsi鄺9~u4<_}Ƭۓ-k5߉}g4^;Յo """r2``76a.~؞};g[vAϻfE&ۑ,ɝ_شi_~!SzB,\6|L<$x$8@b{kDW>r`$瓼i%>>̣+g,5vMA44SlFHw0Bn ގm 1!u*Dbˈ\ @@Xs05= |G3/Xrv:O<6RJ9xX`=u!ƬM?ˏ,:{pZw`Ѵ(P)?@e'{q'V/(~H{w%k9k.()5sʁ=ډ1O\;u_\;s>|޿E9_eQmDW ^OX8 .a%y*?^ Y/&X7rm} UいT& ~7o=5Wn\cCۯ x݁*gnU^o6/b}3=:,_l~qnXKdI]sm[<@ X}&~*羥!b(u+Isp{i﷊kn8w\->u15}v5|9{OMY:Y؛V xC9>$V,%_eA =ʉgS[_㣩׸PAʫH~F!NБPEiEYø?`_e"=ǵ: coO[e111;n^]tcK ڝߚ۸gR ûõ+"/ۿlIcZΜ`Ñ'mw,A{eh݆~RXMxX}dLfg;h:zE{l.'؇9~^M~n_Ħ𭴷|s$I*:M}$;.}%e~Kٴpnf6#ήy?$I:6p܃-I:1OɣoGI$lI:I:-It|utI$IE`K$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E $I$Iw&NvQsYg},$ItDÇcbb"ڨ$I$I'p8%$I$E $I$I`-I$IR`K$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E $I$I`-I$IR`K$I@Y hkg?ңvKLLL }'zkBm'R0Օb51>>$IY-} RXXț2~'ͥ(س:.2Ve(Bٝ,FI$)\>#h?䖤%L\لpu+o8 yāٸ^Kps݆~tUbml N9%L[Mn]<銸$I*WjS~?Um,TZKUl۴dK)eddkȣQ uEyO3!9s (+kTo+j7#99%[JpC}V撞K֗M4ʀ]̽*2!?3Yk))o?BAY{LYMEeH$IQ %;y%9D7B[yjz1 C!7ntoL_:C_frD>+kZy/&e"J6:i3X:"۸􉩐*7H4$6 $q>f bc wʭXhF7ʟN#x&Hl/xvOn~)d.6pgT \{y6m"ƫywp J$Ia-}D@NTrC V^dS~ ُ#) @6{H_>ͺEX 9;pOO \M ;.Ư\òW憫^GXi HmO4$fe`XZ*#qIOxK0t`?ny[,Pv\s6(gfA /eFoE$I:L= =UnKjX5޻i#ʪ/sK`8/MHѧSϽ$x/(`ET)@ls9rMՍ8RlBb;} _B J !#jXqVB]I͖7Of/IOL4!.v'?_8PxV獣. -ڒ؋8܆>ZxWž3Jί\;ZcM{^m%%kǓwJxsϙz%I$sHd7ޘ̥+k;؂c傩dJRgĽ 2ElXs'w=ә21Q j ;I]M{HI-f#kkHxzp 0;tVJnvWѰ]@\,nE;2uLj}ؙK|WK$I]BÇþwV:6cnc{SVV$GR?5ew{{pr|7f*,x5++kޗ$IUaW-&&1@bbb sd@*`7@b"k-@0Hb%I.[v[+(~N23|GVǓcG$IꪼD\:u2wI$m^".Y$I`We[) ǣ I)I=/"xJː$I]F/X$\;8)m0^$u)pS$I'$IR`Keh I"[(%$}`K$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E@l[>&&%I'=[u#YYUAz]UnJ>KםWWVQG\f{$bo[YƍoB'<￙8;e#C>gI$Ĉ%╼v zf=¬(,w))?l>(eC6_KzLJreϙU̴EqQ|1ϥMSy>V ِu)υ yYܵeO}KdrtvO&L˘Ʀ?` 9!R]>wnO>pQ6P_h8Fx@şx`mxlKKS]QI'ԡ*g'5I$:ݏ=7.Au.1%$TsְkA>S{fÿz+O8@ ^~1cW?eq~ߗ>uGF%p$;c9\&A?t%1o8K=݀_ZG=E2*w…߯{_yYx $INN4/ 8 v=Oj[RzןK<𩛾KFSHy9S3\x`&tpvK.^!>qem8V~.RsEo#{M 1i/w+=$INFѽUu9!;Wc}弔^)텾oW!Kykx_1;? NEuFv4] { רb| Zrzm~-ks: ʹTXhns_7OV!g$IN`7_>ľ|oU>lܟVDUuOoHVg 6*h%8oMs<4[Tμ<49HK%{vyڑZ;~.Rד+G|m0(=ؒ$I(_";=yrP9W9x u=CSS蟿_ᚧzM›q;ssW}Y,.5?_Z~Zf猡o7'ď]5NCxI|p*~̙yԸ~WVqp*!f״k3stl_ؒ$IÇ#AwPN} b$P]NyE **C! ZfTZ 7>DP9!˛+ʆ~i=4ڿMzd[e_`@ jt$ƣ\|:m!Po|JF^E ϯ/''q=Zϐ3ov$)BpWTwR8FHHً IDATƑl:졢HL GhHHlJ9xmj>  ryjF.K_K$)jNx}4I鱮@W/Rv6gŷ^7_e<0-V{s̓ bc5{6W}9)aI$$VO@xKhi␺5U#H$wR&؝e%!u5-=@$IN.I$IlI$I"[$I0$I$)L%I$IlI$I"[$I0$I$)bG[GN!$IꊎK=GN9褰x]C$I%$I$E $I$I`-I$IR`K$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E@lh 7&&8F"I$ݬx>9z C[hOfClɧq/xbONҫ++   ,^O:f0ĖkdhKcnJ':5?Nvip~b> ~o6(ܰJH pV6\rWe ]s+v(!*wPD\nr~yq111՜1\b~?9x4 (JV,_GsM%I:\"ϋPp2bMVo!kl"Q*ca]6X)#Oh 2 ܧ%}LT,^0E + Xv5?rX99ŋxv*4פCbsxwAcFcmAYM~^Z@ֆ ),,dYL%:6Sϫ 3{l[ݨr,[@=#$Iv > ٯ96 7jYW7j =aPwH$uV!geddkȣv ҂\fՖMż@a.~ ʠe'ַ>']a߹6v^3_V( +]̽*2!?3Yk) uO#-9!CPV1̌d B򄹬ܸ-uMe=3 A/ȡ~s5o>uTP\r3XPş[jBO_GEWo=axZ*? I$u /.[&x/]#3ƒ={"ld|Z:k.Igee/x T234E]<b훕ɜBvd&xlXdj[l"=u"yed쉩G<#Mj0|i~>zU$ ~CO>(0󾋠z{qp 0Ń# /r( f8wZJ_u$[de~4_|4$IN݃ޚ϶m[زkӦ-tt 4]Ůp\ׁl].AF. hAUy}ׯ$1T _uG`5ЛH!?'b@:D[bE%%01s bhKJB_T&^\1t ޖ>~))K$ v"1fۧ,y 1>[k `ť3ј-:r=DCG@vľ@\l ul,gnә21Q j ;7 y>#Ǧ=- RkRRX^˟tҩHF'*KNa9?ka735|fܰ[Lk<1'=n '?)6]WhoyknWAj/"tI$uZ1Drm]-m9LYYƓ ,ٗ>o}N)+&\DzxjG815.k-b[}Dl-R ngGw%uF!9f[:&;_u%T W$ilum}[G(Hbb{Q =z5:ۢ$I$ح%%g Ynۼ.Jg73ObG)}\ݍ1wZ}$INݲ`$FܖĈh"I$IR#]&vUG$IԙE5]$I$}`K$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E $I$I{<Xx4+$"I$9x4+$89D'A$EK$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E@TpV=$p8z>7'}** 5+%V~Yq|W<"7q~q$I v`U%^,޼#4^ΚwYG QRU-. Cǿw>h_S$IG5@[111-ҭ' diˎ$niaZ[moh Nbg_SV] @sKGn>OI$!`6Kctocy៙?!$|_8Ȇ%?~w"6UA?6Û{zƌ ?#Ϙ{{jf$1_BPU[% 3.y@y_~Wt?=0-c>6T?ɞχ~͌H?~؂o|6פ(Mϧ&w㯙1.^MI Cs›rL@{>OojoX4^4!<睈SI$xZx!s/oi$N 0 ~3v\_GS0\ t%P070}<_|Ƌ1'\q@*¹kص sE/T.za3䊤8 C? fɵdOᜑ񝕯ܔ4|Iոv?ͧ$D~F@oGf$IC{x& ݁>hiK.~'FQ3`{w@UuCE.w}75O*z;W@+QƩbOUqv{ t`-FҴzw9@zttlښ+ <>Q0hhP]X+sHD)I$uuQKnsʀ}@Ou￳1txKWiS'ɕo]c?K$@6҇Gkcx&vάݶgFލڍBG\Q˪ٴd.zEGumߑ$IuD!g5Jv-3o5M}nKGnn+:H|bM@MvBՇWT3M=`)<=ٳe=ߺaVjqI"%ٹ7< [r>}Gv$IRWՇ)qc=s+)!]q31wLťN7ܝ7'3ӰT@\sus@jͥCSS蟿_ᚧzQ/[7?0ZPm2{+!6ug[sE<>w?̆cI3;,b~_l!rG{+$I@ÇÑ|Ou\t6ik⪦b$Mʪ+ &&wW>v7ir+tO8ރ4:[긭C::WP]EyE琏>O5|ycÐ$I|vHHlUW` qIk $$vnctqHHk㿽?M$I˶#ubڑquݱG3$IԵtI$IE`K$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E $I$I`-I$IR`K$IǣѭǣYI' I$uE%rǣYI'CtRX.!HqI$I"[$I0$I$)L%I$IlI$I"[$I0$I$)L%I$IlI$I"[$IJG p ^_o&Gգy>|Ya*v"BIx+BTI$`l_ټ,[몢x Yg/Z(,,y$Ԡc1vٶh"IN,6ƵTzt Bi & W]]M  >&fŒ:V[#KYLL,zB(M$I:=إ.Err2ɤcSQ:sYas'$זO`E^!֒>k6"99E{c^IHKfȐ!$Oʍ; )Q2#v0ysIˁ—6颌N`˻j~jehuΩܴadC~fiRJ$ Ezֻ\$.QԜؖl"=u"yed쉩((#*'7'1d6i_8T{ iSYsa:-cWavfmq-]RgwYsI:K-k*XK)K~T4-dhshu )sHMgҨGm$I:B52~u#˂|RX4jܑw1~67\]Ƥ^+zqprf;HeCq~8 ΕQcVF΃2okjo>i> ?OBsN$㒞a~'t$I:`6󹚪3ο~2K~Iz=dĤ9t'M8ΑkVﻓW gŽ.!ލp YAI:b4A$Z޿[}3玜;q9@U+OK$IV]{%ذV@RB<%kǓwJxsϙ 5<%%5K@xqL~4f:iAyOw`P b ny~*k}΁\|C* -/o$IÇzX!g>c[]VJi5P =z @wVWVR X_o5eeOb0Pv4gnLL TWRV"6>`Yjo To[#(eńX6tO\QVF$&AqtBUG)Ip8 =8qdʃAJILLl%&&&v X-뉍=DVtּ/ ̩SOV[8r/i66H$IE%nd=ѭd#{(upQ:}ZN!$IԒ`KұJbmIv $IR-lI]͒$Iꬢ.I$I>fL%I$IlI$I"[$I0$I$)L%I$IlI$I"[$I=n,^wJD~j G^/P^Ok&8B$IYn$TQʆ5lȿޟ>ߟ3#ibK}|ޭP7 vPV>o|Ē-LOFi~>5͌wArnJJ΀%IE=ÿz+O8@ ^~1cW? T IDATeqڇZT.L"/]I>QH9mvϸ3}W.! {]{w:oyks% 9#o;+_a;)i $IN`_JE>uw(y0=g fڭ3PeU'b N{hE9Cu1zYy# Xä4]0$I>:Iݲ} }^c<ŴoBU\ݷn/r&}iy\?}~9Im揜hkTy 0gny{l 9J$I]Ur֖?㻩 5O~5'o.`g~\ǖN Ub_QL76٣ySW,7 {[w>̪]jAI$}Ei;@b݀ ›q;ssW}Y,.]oR`\Λ@Nh/>[~Un4H]aWٞtd 5eC>Ȕ>A$I9|p8tX>Q;gP`bz_km[ZTsH۫ b$P]NyE sF5e rQ$l-gș7F; I!p8`Ĵ{ƑkumIG]H !ļY;$IR`w$hbl-|Z;ۛ9E$IǪS?L$I[$I0$I$)L%I$IlI$I"[$I0$I$)L%I$IlI$I"[$I=n-?J:I8H$+:. 3o<J: l,^uA$EK$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E $I$I`-I$IR`K$I&ؒ$I$E@l4: Wf3/PB\*wPDipJBA+k;K VbccP,\t }İw[uɥC;mg֩"W ClSo8^+$I꠨$؄Bx7`A&=/(+ckX6z)ٷ 8>Jd˒14:ܜȶ33{ OaPfsȧ6,a✵G6w%O͂4|@*K_}'bL$Iꢓ`:rKRvc:ƒ߸ [WjVt =4IPƮˌGp8 xxRf,%P}3ʲ?do3Z)X5i~T4 `ڢe`* 2,m:+6 %IDPe\ AYNH&9k<ʀ]kImV1x`*2!?3Yk)X$@UVpP]Mu\+jH f3(}7'%g`<_X2) 6s $I-&jN y5maR'S0h<1rrs搛}.9t/!ϤQie[Hz]Acg&Ȟ[2V d0|o/Ie٭0~H>vm &}%I- v7lQId?2 0`!-~P&="c.?YǗa@/Nr`83ϗ/ײ3u:~s| lTx'QR`ybFJC)Ԋo%LiZQTSZeбZ Q@@yiE3-4Mg! 191 'pI@p|?וd^w/rfݮKلk;5BuwG&% n[ɸi!cFI+$I҅$av8o)w]y1hp|4"J+S~M9־46Ű!>z.ӗ@;(*A'0kbs/c5K%- :KndƿP=ZzPLlW#Y,.YKxHA$I:5 -{r =o,`Ћ*N%*z(=IX閅レ=8ƧhE9&{HnwJख़acWu%}kFMe喯3G{K$ImKMΚ>_ `=fȺ+7Һ()%}$se9|*)Z0y Gm0)Q>CH%~V}s֐Ƽo"RJJJ())""IS؛#h-y+h64s릍⢽p\=r0/Y\R=EȞ9eM&Zʤ>@f/M:68mY]U)Bq=F(S!3&dk-|*%ItrIG5?W:+73mɷXR͆"ZHF8%olڟ VGC(¤?Dmἢ/%I҅#.[u'%%|ɅRۻ YG1I$)x )]%tdh/#I $&g$I$}HX`K$I lI$I`-I$IR,%I$I $I$I$I$)ؒ$I$[$IX`K$Ig[Is$I.Dg{VR'9D®D I)$I$[$IX`K$I lI$I`-I$IR,%I$I $I$I$I$)ؒ$I$ \N)a%I$I:y"6_wEٻfp'Ưp1-|/ޯk[K^l~%ҥگ}9Dſ=)$I VbNo(7~E\~3 UO1}8 OVu OH,ZͯWĶR|-罺w;X.UI$u Y{ ܕ+УoY7Ne{̰t+!^4s};Rڱ.EKbwJ,I$,ȸpsZSKԎ}l`Vz7gpsz6Xw9̶?mj9KyX?hJsㅢ*$Iah`n86d|[?5{@?b1IDڒ#aɎDDI3+7=sg԰qk[#3fWt U|V.^pNffR0?FcVP/&K$鼗 _zw?<:㹦pf,AsW|$$kIbܶf!_̹?&0$T(q==DʵC)nt%طur>ߤnjk_f+{RUUJ$Bk+9Pգp1dsx:7y_ѵ!f|_JF"Җtyx`q+ʱX *tpO|U=ͬ,` {^FyN{\E_$I>r _7peKW.p-Lox0iKp9:6[ًuxh#/'|8~;XZF&RFm%ssČ*`mlh#ZY.9K$I؟]y4SYQɛ;`pzC?O/w=wkgk;vs Ґ$ҝh촇xV-* 73CrRn~I6`=Շ9s+_K}4$Iڗ .vUw8@Ϲn58o4PSBԋHJJj54SN%K5c4q~QvU3mNC$$L %BJ%5vaJJjJ{s8I$yLrHڛN̖9H$t%&g$I$}X`K$I lI$I`-I$IR,%I$I $I$I$I$)ؒ$I$[$IX`K$IѭN9D$IR`}VR'rs:핛$I K$I lI$I`-I$IR,%I$I $I$I$I$)ؒ$I$[$IX`K$ID' ID,k7t3$IZ;+رڷX~bX_O?WVmՇvZj;w_ks ױ6vB3^yKjmf.It$IRNOAo? Dؾt&pvl.muađL\Ҩ=e+/,^4m[Rr5}$Ik{ofAJ*ns<]Y|I۹*L+!Mg8z(Gm7 uX/I \Nn?64X2$[ҙ(^G!pS$Is~?l+VJʭCRWVȃ%+DΜޱaÆq+YdDUd-[LaRʶ&'=tӳX~u'dԖB6j!Y N-T7PSLgꢦj iٞuPWʂ?S Ș};$ID"cwg ; X[h~K^Fk(\DŽyt24`L*k+Ɲ}b*j+]M洹}kVX,j3,?7tT PU}(Xc&R07tӏKW`˘|DR>˜wSi(ܒ|~NE$Iv1;Xr=!%fµu=o'[BUCƁjN yПܡRA(YyC|k kI=>{›MyK:3~$dNegK$< (ugl fiDQ  QۿYC=z¾N| $reӁ0Lf>iL>Q ʑ-5\~ V&I$9E |weAZ &Ѹ"ܦHsoz Lr˟ 9P]2cq%KֽBQQE]P3H^{x+{oe7=@QQlYc9W?c7V$ItI\MkóYroacucZ%UtI[wRQQFᓹ,}m|7˧M洳8@LQg&dǖe7t{S=NȻ$u,oQof$I:$t9di𹸕ėKCnUKO͢Ȟ9eC3W&1A370*35go$^Ǎ .M}ͺ%<29qX;m}k?AgƄ̖&^56潥`<=?&Ò Ht*$IR+IG%%% }[gBw,ќ7;>PK2pJIIGDj!4Dv#5"_wx$U񱆺:jQÄ{ |ߥ!TUC^'cJK K,;/NJJjQ|\f!0;HJ cǿIg&)b>Dg!I$اRhQNgI$IRI$Ia-I$IR,%I$I $I$I$I$)ؒ$I$[$IX`K$I lI$I`-I$IRF+7n%u!$I{pg[Ibu *$I K$I lI$I`-I$IR,%I$I $I$I$I$)ؒ$I$[$IX`K$I lI$I;V{߿UG,;}xM|X,v4.f/ߵc}1NKj[ݿ/!t5n YE69|fǸ$It*f=\z{m?ǿV`5lx, ~Eq$} x\5l|3{[Tģ3rڍ?ͺ&*IN!9vmc{u Լ=))xsmЃP]ѭ@ !B}q?_PTg=fQߘ}/[_狹yj85-T}ymk [Oc| GV/KE\ѥ''Y4ƽ}ŦqRJA7ƏXлo송-a*w5 ޻*.9J$HXxq^l2Ӿyȟ9&>>f#D4ƿ fLo:Bf0􄲦q$ GZ/(ᄖ]C$IgU w Vzlc] FN%R/61u˭w&5=> ֓>އs@ rUA9\=n[H:"@ڧZm= V-I$'a6ѣOh9L٢{>s; څ-[}Sn79#%5};~j;{8Aۥl|{8ε>W~JQagfLpI$UOp+Ǟ΁عMz͏J%p%<;!^{ecOj,__¾C-+XsTfsz`8΅#-]\ϧ3 m@!vmZs}'I 79;Q]c>բ)s#|mqct}Irx o엹T 5]̕pxљULMmnb \Nc'|1ǕfqE3ImIqwMk?k7Ι˝W]$Iy$=z43O =6=o:>ޘW5:HN!5%;j; 5Ԧ=㞃M\_PWC]R©`]I NxFvY,>9$))).VOM$ ɩNJ] }[Ӑ$Ib H |{(Ԧe'J9]I w=y3I$) )OVv?"tx$I:_79$I$e-I$IR,%I$I $I$I$I$)ؒ$I$[$IX`K$I lI$I`-I$IRF*F: I$]J=mg[I!WnNt $)`".I$IR,%I$I $I$I$I$)ؒ$I$[$IWIDATX`K$I lI$I`-I$IR,%I$I @r"g/E(Z~1^xnUtmsq!@,o]/s3+y`?}V/2j~j #Exw\cS$ITbV:Tw|V.fk=ċVBYYeee?scF.=Sr~VO&C.#N`,+mCxsMg[EC|V.& KM$IWBVGV' ɍ+ǹ'Ʀ['W@vi^ynO,kY݊o{Wc,FM }W'4lH0%L-ң9p?Ӓ$Ijy v}2q+?M)WWVHNVO._@zz:L x&rg 6;`JzS).*Rssx8l1J" -Enzzҳ<"ʄ¹Hѧfbes.cnv&dzw^Er~K^pLwȄ%BigH$BN*H; ֖݀]/AJ8ܸ"o|õ4)~"thͻl(@.Y :>*2c ƚpˆn-3ə `Ћ*oo9i_t.$IR疘k× X3#[vRQUEEN|d2%qg5nhor(㶷cVPQ?<⺸U57 ,fޓWWSswNaUG E Y?_˩8$#ĨVAI˖# 0}zJ+()ZuWvoS $I$Ok8rfIl3ѫnw0KxnInMJǍi<@ b‡y0;.5qt{? B򮍭Ҙ]5 %Ca &ǖ[=c}wFҩ ]/3 j:Uu{f6ϧmTS4@^=Zn9&{Vqc(>hHm9GDj!PmgJsHG㯡1?sOXL:s.I.X,w{ltS[ ÄwRRR;Cç-NJ$C$It!:+CF:]!vU':I0O$I$)ؒ$I$[$IX`K$I lI$I`-I$IR,%I$I $I$I$I$)ɉ4rۤ$I$IHHݬ|7Wv7\uo&>^]V+ h!+]Cۛ ww`77SG.]ݾ g}UoqI$%FN?sw U1qiv,^~mJ5lx,9x]_xbY>.,wVS?V$:I$ur Z~U!m.oZY}Φ@cX+TŚWN/KOnFɭiwyB~:?ܥ XC9Y {qBOȑ$I]_*pwKq @A7o7:,_V̚S<%6kIb5e{PT2{IK,Jh{s7ëVj_L[,ʺU`vO/r,gg?cҖ.gGu~d-f_]KK |E:]dL kDη_$I$ ʁ'>1rԪWYfgzn.Ӗ$Z[Ͷ,_MފEϿmacTdff.;>0?[/BI TOL!~2{$9>_LFM`HO8<:=%{|ȇG 7&Vd/y` ??5'oZvޏNI~J8wΕL_v ? Ht2$I :Eߤnjk_f+{eP#ez1WU< _?u|:eFΞui]ap}[O_GogR"}PK}<>)7-w$I$!vg/`/jp؁m+y?z5;З-~kh\>- [zl;J1/$mbw1(j8P+$~ = BH'ͯ.tiha6[g^.vSz'$I9cC|!-H+kw{F6&l=nv`vJ#O2^;/`[}{s듭 Z'ϯ#zH%.>su5 L;@c3 n$IRB$Pt%/EC, srYX _I%y~7Y^ɾ `IZ7 's0vnka}i=>x1Vu}^`z#8 KW~ׂO@su~\v^޺ʊr=9_ҴR~&ITF=C(XKEyh sy)N$Itn$h'ĈDGbܙۼ)x]O`$[<-h~:a~5m8>Fwk0 ίM៳kc#&~nKWw75FOp0wMaM]q\*̜q9Om~WN߯LGx?.ѩÙ>! ħ[ޏOtkI$%\ѣGc=_tlC;lu5WsBœRRSB-sZ*POMmXzu|zZ!RCɤ特K]!lyu!UY޷%: IX,V~ѭ!RíW}jOXkKQ_GVA-2$I$9/t6 Î z\']<$ItJM$I$I$I$)ؒ$I$[$IX`K$I lI$I`-I$IR,%I$I $I$I$I$)g]g[Is$I.DgѭN`{fu +7':I0O$I$)ؒ$I$[$IX`K$I lI$I`-I$IR,%I$I $I$I$I$)ؒ$I$ \/rkW|z,ctSb uuDSH 5nr$I$Pǁ7wft|5%@WCm% ;)k'ʻVP0~P$I$%ȹ/Sp_J4 7 7 m bvɜl1ۆz&oR'?/?cLx"If6 @>ڲtߙwgذa,YM&'=tӳX~u@]rg4Yj)\>e{VBv7וÓˏ7e3F)Ƃ)-43g}K~b(E֜Mu!,*<^~E i)Ȭ<+YJȤHK d+{*?9xodU$uR=a޼%y!E~^@{g?HzZ Q3 U@&+0!`,Τk{*K9[$IŰ!=9F?Nۡ\}=_~ANdNcpŀ>-c\30K>\ǠT}>;:xicAz%]=asNN\0@HhTo:ڟ+[$Iǜ4ʔ!eɺW(**K @M.xe:˹xE!%Xlz%=XCU\oi3cӿUHB%k1cq) ]27ݷQkV$IR>~M%POUnOD1P^M(ÄزntoZ؇STZAEN~ 8@LQYpek,؋$NY`:-y@$IA;o%I$I҅[$IX`K$I lI$IxJJ! [I$Ikؗ$_JwVrQD!I|Rޮ$Cn?NC$,)s4~C$%I`7(OLt:$)`IG%%%iZJ#G[ UEIM\-HbS`K$Iԙb1%I$IR,%I$I $I$I$I$)ؒ$I$[$IX`K$I lI$I`-I$IR,%I$I $I$I$I$)ؒ$I$ࢤ$I$I/V%:I$I.p.VD$I T!\R, \Ȭ$I$I@X<̢F컖}IENDB`flower-0.8.3/docs/screenshots/config.png0000644000076500000240000022506212324702473020354 0ustar mherstaff00000000000000PNG  IHDR>G@ZiCCPICC ProfileXY 8ן˵]ى=KH%ZH"J!k"$%d)JByy̙3gΜwUK RL \\p 0yOT% 6;,L~Q>@ Cp- ̦<ԈM| ,DAl_a{[<vOG&S "tD=XpߠpU:>d_=8$'+Le"BqOs%,4|H @lb}@@?sozSaF~mOE8#!{,6;6fFO/j|oK_?#c#^PC4LޱN#Sւn++T[sZ^ ޟbb/Emwk.j/(F*dxLREn42@۴D,~ULP` K`~=i}TßL-9f/>|?A柵 J#]'~Ko*i?b1k5Jn:Q-G&T=@5Pݨ_f! ekȌ~ zW(/o* AഥuпIF7")?C6@k#vFlfCsY6h]dT῎-[l%|@p/{"(AT}0PRPTgW{nL؞ F6A+4AB^:f|)1h~NJ@h=` v\nĺ x/H S 8 A1(W P@ ]<#`L0p"A?$ ICJ:C yAP8 %@P:.Au6=h-(fya1XVa H8NOp|[.9<(EQ(u!GQPPiTՈj5ƢIh,fhG:}>.Gסosu Ãhb1.^L*&SiG w,ˆǪ! f`ck}wEljilpd]5qxZbnE^>^S<6Y>6>=`l{|$~ lfy/  9 %  Յ[DEDDD^҈]s;"V/6%!n./^%>*AЕ(x&T +=qDIՓNaO,bʊzwt]@vZ3r%>;kې'w*o\5< ¢w0pbKĊr1JJ:/_(*M/]+ //+PVQQSy ~ՆjK5l5k{]aqZڂ[[iuP]\\}`xkC[oݑS$ؔ{{)6Gܟm hy:=;L::;j?lzc]]u*ݷ<գSTiCFoc{-F̟u=~788<>4>;<"ח1/WFbFr^*z-f\u7oߎy7>D⇜IɊ)iޏ>ND̬̦~bTYs/s.s_)_7esΗ-l[h]]|=R?v.;/O]ŭI5[nmlD)PToeH wA!\|׶os K|?.GsnllE`; 2BC4 O U+7c,1c8Uyw av@daRg#QYΰ6Mp0ss3'#pIW.(cyRE2dO%ɇ*)nS")M*DJL95}FO1ffyNͮ93%1.p>OSxdkiIr=,VU_\]RqmRݭ %; 7ML"ת&g;:[V=~mDG`/Og?3ƒC*/4_ꍘZ y<^{:8C>̊Eq eߛ~|^Q[4-(7pBi4ՈV@WcT0X.L$Ӌ23p łaŲ1ssqps;yXnf@".ыb?%nIKJ I/KJg5(+)vREGeF'< c9|-Sږ?tJtt7)JFƪK&qfZf+wwгV)f6Dg;a>G̝y?4rA>q}QOO/u2Ż)h@ Ltg=DHGrRpŨԧэ1{c#q&@ 4Sk19jq6#qxቛ';N eNd}9zf=g=p5?P!(~ɪRSpEFbo٪z[Mе njߊ\?tQNHӹ-o1kl}P㸮{+V잵 zsXzo:]χ?͂Ug(AL%h9z@z d$5>-b@sh ua_ěH&GGZNC7?b1VDL#f ^~)bpx_EӸ!g# х8JM?ɰ̘,\G2&=g dYebb{ɾ‘˩9ȳ{υ_+/%'.l*=&f#&>"Q(-%"A\&XVF 4JnWQUT]W{DW5"甞.g27mzyݎVSl>;m8\\vI+{L>Gw |b=B<҉r8U؎x}ԄKٓ2S=Zf>|RCYم9w\и]YQQSuj5 cu 4}l&Wt~{l}gp y0RntķY/~W<.S^Zli|uZ=@$h;eBH–p4\?Bi{e=c0uE*6{A,^DJs Mȧe=NBw(MldHdglac&2ד.yRP{ޢѨyK+:eze5wL0'౐ԷMyޮܾ֡q+.Cw9HO#w

,H۫&oqdjЌlЧϾ_~ }[rZa̟kˁ˽+*+y+kޫ-kkֵϬm((e3@WbXX)X+FQu0P}tF{eЄ pHYs   IDATxyŵ?}; 0@e $1PI`c^e3O#/OѸ#LDd}vf]?Oߺ=w1<0vW2Tuqm_.SJ}6IJ,R^򴖿5Ǫ-|ͦ-m{8(- [XE'Q֮ ÿo7i nGJ`VccX,@2¶m"`km5w  5R]-䷿Ѷf6ڣ![=:ۣZ lm`0QhR-Kÿ߶ :ÿ6l۩5; zZÿ#2tW/Ërrr}[<NЍ{6c ~2ߘ]~MolR|oonRl+X%|F:ކÿo7 ÿo?:TT*8!L²Jÿ 4] ÿ?֮|]_u"PȻ_SSÔ)S2l; 7= T'Z7.d6(ћQ &ytCz&~6$[^G됴~ERTƽlHǭc;m7 ÿo7)//g׮]h43g̘q_N~-l̖tidd˫uc̆#OGLo~FJ:t=%Oϓm`ÿo7 :VÿoÇyԩSF𣹹d E~A yR')JeTa7lfldJEYOz[_oGݖ?[q躲uÿo?S ÿo7gѣ999DQ(Xd*x뭷ޛqȏ⏺#zA:!Yϣa? !y%!E/SI1֞ nGtRo)'[gufrM\ ÿo7 ÿ?;ׯX,F,cl޼h4СC30g̘qd֍/Đ7:(n1n\|oTMǠI2'[')=1xAk: ÿo7 gzrss_RR† D"a*++ٲe  ڲeE rbhz!zQtm Ho1!STFCDzF >GmD"={&(S'O`Zڎ8eGi^=*۪5=4z{ގh^|A0]vG~&no}]Gb}6$}uek/f7 ÿY=\s ƏiF^^T&WM ƍN ZnPѡWLϗL& ZoXz|mI&-:I6}~'dekRnss3k׮p xO#%J-[غu+G& }^MdxOLb7}R'l^'Lٌÿo7?444pg3o}Hy^ aÆ J*[ofٺrnE߉'23(- ,ˢzW.fܹ˲ܻ?}fШuI#U>{k~vYC9ĉt.B |}qqVXĉk hBnI;C+cY:I /)~2.رw}QF|ҟ;[CW`5۶m_~m=+"}+ e r_ä Ʀ-UuG巔+u:D"}u^'قo=^/:2K4X|ÿo7 פI&eldJ$x%㦷Sr>aV69 CAzTx~ [~6/ Fi`GӮ0>7K/זe;x p3n@ eCz&\8@UM 0`&^w^s'L͈po1lfx<Ç9ӄX',PE/q .ଳƒN{6,QooHuYsʊQaaa%rԉOl\2? ٳ'@fȑ#$ o'iP(m;QVVF([oM$૧8_)C^$eucY=GSSPȻ~mn/QqLR'}bmk7 ÿoVgԩ۶[& 8j%#HZJ D"Nhԑ:' ˣz*qRٵὊ).ھ rg7DTC*fˮ5_ gO&B!Rn.GXbra s]ؼwY{#=Bck.*;BY6croM//2gyz!0RsrV9-VPυY V#UV(W8u)2\=i|g ¢JvM3eY*uq+N]G"@"'nŰ"t}-AzB7NU]]I'>.+,e;Ne]y`J$ؼy3K.?K GIqqlR Y-YuZڤczq,宐ږΆ_'K) q܎iCYįlꫯҧOJl9QD0cL&ЩS'"۶mC)EIIc$O,R}iog)W)SAIEZJc>a''IY#x;K}Bm*@t6< ÿo7w[n=^SS5m&T:WV_rBC,̃|ȍeA0@0 ϲ( / G3 L&Sr#9t'TVL+7rATn;ȩk&"F7ܼJ )ˣ0G$Cn0q;H0DE1Z7gsYšCҥ $ Weޚc|k_cܸq} C aȐ!|hRbڃ&!WDQA`B)`woWX4K2Izu4+~s,e;n>[َdE)\zjoG?m9~qU ~*eL)+Eqq1]tatJ)8rCHGP垞Nӧ8֢llk{r'"XzWc?1ɸ+/ZGD&=:Gz;2>yO@2AK__g7 ÿQߟa_?:woY3bde\@%IN8%Ŏ]Wk \KJQةKxt]ԥG:`/J4`RIȡsg,!Umt !A^0b4בL&mh RgAUb{2fϠ( -N,1c3[o(** .`ذa5 B5log?1祜w-koR7VbNUSrk\$ܒg8+6S{9Ξ0啩,Dzܤ'q{w\t|Jqf D<W3lp"ţp-G$eǯ dUt5R[[KIIIdgk1D,%}AA999:tZFM?/yEHHAd&zVHYz:[Y׫="Ȩ֣&W/^/)S&S [8 ÿo7+h-^LSB q$UC0p)9#O˶mDCArXEbRA@ňoNPR1EG x<͇? Q`Q."?l %$qSĪX>6vzizmѣcl[9Ϥʒ 5h@7"іZ?UlW-id؝.FuΣ -P!h)P9BLl\eǯYB1`/)EI-*f҉ # +6oP(cY޳~4~>ybP8j᳎9|0vfȑ`YY_Ǎˊ?LRѣ.%D޽{3\@LD?jODݻwgݺudDs!O^2P2Ro'^'A^W}?ľz./$ BDIg7 ÿiПHn@|VV"k7eQ؅$;u++1Rq8ɤ*+Q(@'ÚmhH$MܶiH$YuMTpW!i(U 4DJZ@*HPT]QJwTjAնmo2L&ٳg3)lj# wh'#J٠'Nle߉{@UόP2,;p] \v3KgϠS^5Jݼॗb;}v~F}#7kD :y(D3z*q;h +M붱g^˦uX:r7d%e 3>|]gRXvm_:_)w/YX83o}Nٷ@TNv}G\p{'>8XC|lHؐhbpzn={2 +R,[;S+<<[IBzb?1w.]ͅk3⻯P:p8kk>jR+ky%$b㫿敓e+ vzUh<{pz6u+:*G9i{?68v6;()lqmO|ǯK&,H3gTI(l>qĥc/:[o7 H7A_R%tQXԷ/E]R~;7oa(*N#(2innȵ,`]+RIQYŶXfŽ(+?^=O$.$gTz_ JԇΥزCvºu[Er>}C e7 ǻ|FضMyyy:#i]h8Za*ΑrUɝ,x7~nѤĩU3+00'1ԼHÊz.y\E:ttczJn]&/Uq+R(;>̰{_gb|P|^d}?a&kY ư-sX<Γl6,?'T7uK/]rRv6jV~җL:~kbW 27PX^cvn?Ӄ?Lz}%JycRp8L4\o !}; /W$! @}}>a끶^,%IiqM~ɤ7ZMlӯ?v?Wǟm9ahgld ÿo7x<'''.`@#c\*N@Yg{FO&b164xΉeD̈́Bz >#QʉTqijhdu)' 3fDN'Q#Gm^7`ZY1j"ê8K !JLBؙT%ɀ)`z4˾O\IPL ?7ԫ~|^s(yb WxCCз\%orxRa9N'b{ea Y5Ħ&KLr&L5O IDAT(pqL ?z#?ZH&YuGTS,Cü]oҝc@X'SPP@MM ˖?yrsr[şL&ͥ_~޽ʌ_\\իwM:=bO<_!=K.TWWS^^gW&I/c>A@-\20Q1|M@h'XkK/ґ_Hu;(=K|fo7 ÿ_?@H?-eTHr݀${鞼(G^F.9r  Q*0d2$J=hN:ѺDDT=z<{jwt/ Q;ܦ3= - ~:Ӂ,/[zu ~63ݻR3wa޽Xq'k";wEEElݺrrss'c>郯>@ΝAR б\U&Kѣ+zd ު#~K4YՑ_ǧ!dnA6;2 ÿo7mn$aGD78kRYI'$xP<oalѩG%z/=zz"d *zn݈Fi۴R>|8w&pN?:u*箻jT?\;J'z;K63_|k4û\K9@yF|xq^n XqFE>_”;˝[/ErʬEg7pz?w},}A;7IRz *מ=X}h8wem4H{+~>C{dm[8vْ<7OܹƏr v| 58Rp \VB)Eee%P&>Cyz)o_L4rG87|"9!t\rrBSN h :nSwYsW)S!''X+F@pP _ޱa>[ի֭[8#Ξ={((( {EZ2B KUU?nzCdxG1?VϞ>t.Pьÿo7 HD* !Z ϶tن $˲ǂKrܺn\)n\@ZH( J c,bϞ=ՋgZȿؙ4:]^y^y"up%!lDd 3)K۴ẉ -;gQN*8{he)w ߻ ,={{nzsrr(**bӦMTTTPPP@^^^F -ƙc2JW~$, ]*2I],.%>Y㙎YmY [f ÿo7G)ZWH A$)ºt=b@Dp $Z uщ`շ  F%ukkk7n=Ώv`3w^QJq)7;-+,Ħ`?HAAM$*]{O)Gg',ϙ'@:~FH$Bmm-^'_ eeecT.kE/_-=*LX(i|DE~`~`r ÿo7? *dQHbjb/KO~2$Hߘ|)t 'Q!BDS(H$ӷoNE &L@CCCi눮٥d>_~%(_d GokA yٳ~[#e"dO`+OC@N HA?o$R,eJĞRόÿo7 *rli 8*upJ(j=@ʔH4AG?t FI Ap$݋eYu467 w#biގr7ZJh9d Ѳ\NzYt%{']eKri{-Â7?y x~oKD;>ː1T  PtcI/22$z$-:o7 ÿl[E믿W YtTCEnl.EA_z#H~"-+@o8BG?zcv3 GaժU0:+:<|WaSjj ߶$I ӷ7oBKU,I4>>c_>c>蓙_hR ÿo7?#<ڶ3٦O_HaoDR$"УJ ==Rף=b,ɫE[VVƠA4K㧎ͿJL:>[Ԍÿo7 οR +*#H#'475TZuX!sc/;W#''`01bĈ#FR kYRI,jǵ+YV9Z8ɒ٩[$BYOY-[zkTw>]WU,nooo~[)B+dvEe|P^EouR VR%RGLi9сO&۷X,q{{dIej3;먎v5UM.7 c+o&mhgq ߈? K=Sŏ Q)BJ`mf֭ 2F1bĈ#F11m#ulڼJBq?*gP ²-O)vGϕ{ l^lB ,wy]IȂ%%YwNlS d(3ˠA())!//8F1bĈ#F11@bg.zy\ (ޑWDlgu>ؙMx`Ȃc3"Q^xE)**2ε#F1bĈ#FXEr6nLz?Bd7x+Vp=NvGE=esn&K*mqX73ge$ Y/V)-D5yCw>Aa(Ν򜤊: V j=)co2G)))gϞAkTj~x ر};Æn`M8ͼ2tf層N>[m3᰺,gfƮ8r%]M\U-wO䫸J{s~gk:);o<ϐülWJbiyڎ JmᯜɭJ;5kckG|Rբ9מѻTo:+ {,f-Oתz^{c 榩2'$*~XGHtybT\M_1bĈ#ֲifaXd dĕlժ^Ѷ"77 o?NMM %%%TWW3o^Oc"h`lꨏS؁a惔wg;׎K47p%sW+<65%?"OU.vr֭c*V~<}ֲe5>@$z ,NvM',z@.c0_=̝SofWG?mhF1bĈO@jkkٳg7C lڴJQ/*]55t֍۶D"tܙwyCc67|3x_`Ok׮D1cyRDZ<,ۺZuDeQ^^: v6𧗸I~{ܹ3yyy\3&R]t+رB@[voi?|L?-I&ib%7posľm,=FռD&1+E A 4^%kg(Ƞlar#ǬnǒS{?g x./dYj& ^X;w3vyvrҦR)cx$P>*_=q@#F1bիWL&ѕ!CХK x嗙7oDd2E>k z=7}_ZŨ%GlT~u1:4Pµݤm۶1w\vJaa!p3fPPPH2wҹ|0 Fk]n@ @n]9p sarrrȋ䵊5QX8pݻwөS'N>dFMM?LCqF[n%CkM~ws~:_ߟ%f^IꞸ|Ml.]JQu0tg,Q^:6 흌&j+;ȑ#$RH$/^tFӛ1vޅo Ba `[ݻˋt=y塔bQ446z)x7ihh`ذaa,"JQZZv5<[Q$St{ g>oN9tV-8G^g`K5:,q pzp$KI=᭛{H~8Kf\/5>xJN1]>}/Ɠzp? =|-ӘoB~jPƑB~NȔsIK; Dݙ?p,gO=!#n'_w2`'{FhXHF¥'[_J{wVozqf}@)me޲֙ض|.KtxYt_1HReyr%I;pGˢkx^w:| ~_QɝgUotŞ6=0JGqS)Ťm/q./OK3-v#7g=m<=u+yh]o.a:Żgq#Vo'G316z ~FݍTG3Vauqzem) sua<Oڇ9=,\WKsd< 2?LS3_ugN5 IDAT_܁e]r\FMuظe5Qpe'R5bhd?x#F1bH$tV׮]˨Q:ƍRιl>)¼yB,Zpv@9i۷ӧ[ Q+mW;+زʬ-٫Zjx#:u~׳j*Fh{6Vq\V465:YCȩܠ 3q~`;hll$73m6nNˏ$A^t_ >ix[^:X=ek] :Sf7c`@w?7NFC_⹇ikG;NrrCe?{sW:7uWjW m\~zsNl}i07Oo3ezZZ8mCû_M;y,:~q@l/.04D(ك.OYS)ȪOne~8>ޥ-J6&ѥxq0u ե}~%_wsOtcU2iӯڇrnw7Cogu]1sTi\.ˀI@ߜx7~xފ 7[0koѡ Vʩ>TfNv*\6յQٯkXF# GNn,wg^ƺsFEmy@Pi*-DNƍg87}Ǣvr~R^WB,,`¸<'`uͥOEuR`Ӿ~>{4,yY6bĈ#F#)+++䥗^⣏6p%{m[b6o&K,墋.W^-8[cQQ!_~9XE(x4._0r6G-ɖC YU{xL0?0cRp85"//OGSrXX 5GNe9Y *[]ʆP(HqQM>ߤQ'mٷAEZBHcC߳P-wlW?=go%_v5'#z/{ Y%{O#YfYu0 &M;ɩ7WSN\s`$YypEm{wׁ#U8f>~`.6y'${3zto`4'#߼y.ܻwWA 8z43Lf/30bDN2rP{b `fYCXE;`uT6Z(O'^"$sz) \Ku%2D$q=:m}ZrD(hdZ`(]QNGҶu,~spxry S: *3<\(z*v "= R ︃k*%(˶MC,B$Q(φj?8~h37|:r5q.LrιRTTbR)R)8ۜ H&׿kg?zoldRsYz[?KVpnʹ뮻o~C*"p};'QQēI=hKl9-|(OL^E,b8p ̹ݺ <:~Yy;k7y:ҥ 8c,+3O?+qBn$^!'wVq: $?\ĐUT7 ]Snok"!>RkuN! ?[@]ƩMY5Ftl?xIq0;c\e:ppA57Q+AsG2k\:+NlL;dJͬ$I4p, no@),NxD=P$3ϷNC+Xͽ9~̵B(Du3-h28i\@>P(ӑr?usZȃe?;'sEϲ$ L?}MBVOof 6 !-AN~%UC׷R g¢,zvvR?{+oFwKp(!a$ƃzCn1wqbmg}:;9_?ӑCrTV 6'dI`~4a1bĈ#|),,ꫯ>੧;N>ۗ .綕)}uG8qs9lذ˲ܹ3_yͥ`0O? &Oh޶ J7W39DKI$R)Yx1;wlk.DZ/YV,y[ňc9r]vy۶)))!`YضJVӎoii)  [oi|M,Xy|Tיd=!$$!@X#TDh]j+zv^x[-j+TQi" *ȾKXYYH2I&3c&d&$0!@G,9KR>=m;:o^s$Oʆl~{Q0orOHeGvۛih3rVro=3NUUt?|o>|^|2>$O߼r(W^a"":r /GK\VT~B*N2>gt@vk/  o/Ӛ~{),.(>(rIzqp d3nP@Ƒ9i*eˡЉa,4Jgz=Tg=8sӌ)~TUw#m:+xX^;x<wy~*N }v^ǴApϲ{c xbzӼ2vl@G4R[] *:t͋)A80)I\x%SF dȐiݾyZvҾX/s(ò!2hY~|U=8ly.x@ wx9Vx@␁]~""""g_VV0aZ#F(ZgW;Frr2III466r뭷r饗t:lӷo_^]*v6m~)SۯFF_*/'"l6</^?L~mrH0z[~~7ZPq~ƚHNN&**;OY `n[n'x^}USHJى2֭[;HwW^{0/Kd>{<ňSyﲫ'] @;8G?n0g~q'4 aCOΗY8= nos1Sm|5?e/&&5~UUo-($-坕t`Ґd?9[b]?dFvkVz_n_{ŤE϶=q$>|ݮ~n&'\<.7 fw;m8 ?b.?'ٳ_~0`ʔ)̞=u?_Vz@ Zsŵ aokR*ui$'eZ\$}QGDD~^~epvlGdd$wy'C :ȕS(xz:\n-vy7#o9{࿴=NOU=&;+szCZrp_Xep {xz Ks|Սtk[ jgtpPX[Sp~OxϹ}MMMWncڵkYc;w.Or}3hРN5W6cjj*ϱ455@II }>.h#&5MUf oWn6hT[[È#;yHIIaƌM&+:歑Nsŵ欿u0&:}i@CC=no3QyW7 AZ/kFg##/O~^}UG\\\ưaø[Gm-]En٩Z;lq$u8 v״i/(8: 1:j'9TerO94zG d33Lk&|tI͘Pu8S%!+מQr v5@v>+~]oq|'mtp>!ڷ^kwYBP,͏YƒȎi {)9W`ɡ/gǎ<s1gq7v`whvGcK}oYnٚ?<ɍfq1JJJDDDGvV_MjgF40vabЧOv n7pZj?99 ),,$;;l⨨￿VXPb!..~L;`РA滦ibl߾4,FszKbnvZ*vtͷk3oﷸV~God:Xs|Z#iՈzQO#rմB&""""""r,YBc/)S;;x +WK:loŊ 8pJ||%%%b55MM`l۶ʹȚ-}[%m_b oz+2qc˜737ޠ۽yܵ[ݿu#L4w!;{@Ga!22ۍR؄o6}=q8vڟyyGZkuffwGDDR^^NBBB%EDDDDDs٥"czoo]G06Wզ[hmݢ_/o[ZoÖY|o+xf붭}-- ZL?%%ݻv-t墤۶CsuV0Ha큻'+OkF״iX6*wo&%46x<]_+~ůW_+~~oڈ$%%9SsvZk1o[a6[CF5u'ڮɘ~{7}-LmyG!::8v` lcisW_+~ůWl___O]}oj.5^MlلiXlSSKMͧhB[w|AfP'jwN؛v?@1|۴T3W|:G7j۱卋d[:B{-~[Y+~ůW_+~ůvbئșo;Z'M$mZw^w`ׇ}z[%BůW_+~ůW7Mc~` b6Τy0z_b? o8LuԺW_+~ůW_+~;񛦉yi -˽L0LoiB˻oުX-obގwjsqH+~ůW_+~ům˖-Cs2>4M|G 5_qmopNyw{; 4Y,l^bgODDDDB``Z,JEzbDDDDD$ =؆lb1`\LLl`zEDDDD.ijHoq 290șH/SȅAEDz\|Ex҉A'*OD".""""ra!}&r㔯0_=5}Um>o};{?z;|̸qcpwMM[".""""ra9;&n%bpS^u.䐝D9|3'#vD#yLqMJ\v4PM,`5 ,Trг """"raio^_r][Y?;98AJ^-e]mɂ`X΁? M,ċkϡu&'qFŒokY8QM-vRFa-uR/eY6oE&x I5MK߾n75nS`b%.)P\NMD%Dyzl20Mj+}GÊ >DM9} \nՕbzY;gh,[3/?.qHqdcwCEֵjbz"#,̕B )Ig9Gˏ7g$FSy8{0^2eĥ}CF_ʹ9,c'%]3;87&M0X lhJ|צn۞>g aa_]cKc΍yjTy>ߘϡ}:\nOd_Ș1'gWK7Fb,,l6\El|9ˋIIzrN3=a.πO/}cϼ;g99t/EDD䟞x^(KmΚ|yh6q X \7:vl.M۝gݳc=opHGawy~c! IDAT"=M^%a^Uq%9o[O{w+vnsW{3/$'6?m128w1lֺ>f'c^sy 2W/u؞+|R)y݆KFN0&s^?=(r5Sm!:lyYb!{O=r'6pdauOۏٜF.gKs{h0cNi6cq\#ĤF'e. *J? 1qSQ~6{ZGOPOc .eء6N*Lp-I$Ą{= 6?[Kss|?^9[&g#%8l$CB-&yגBH}i;SS]RO"bcIIn2꾖s\8JqFEAE/c௻/ws焩K=Ǐ1,/|RݻYڥ6*vC,luh7.< 3>;kC%DSxԄe  #>dM7_Gohű=99dAoSUq 8hJ.H+O7@ C;^೺#dm)t#_6OQ6\]6[fk-䬧7/i)*X ܼG&g+g;5;ږw>V ΃M?xE9k &*.X>Mь=p6lK|_oojoH}?6"Cr3pf/b}15Al˟Vڼ{7{;LGYPXfKbi/{W0 ct%"_GJ$]/Yg2<|U}D3RwL333Ϊ,gv߽c0kV;2}O89֜+UqzcDDDD\9rϝL()nO'odew';y4k/jPGT%X<|K|HAdiIM mٱCzs4V{h%eT.1o1/|bw<""qsԤ~ ͞ǁHI8[\jN$%FM':caI*(zuX=9R#v9Y7pkhFpp졼J"nNan=6Bpck;b1py82&)G^ҚA^\v=<.gqSg #!=̝GS]=Jr7l6 WR=\-Q?/=^{bnjd_$GɛS^ {c1ǎ|L8≜Ę'n$ +p#6a؈5r̃&^*N 62!Uڱ>8p׌Z:vk1 9  DavIm6cM+|+^0FPz:8A|Ol7^ͱv|5J.nv{4&]8~p=e0FN὏W73{Rؔ#/W^!AEX:,&gj7mlTkIOFEdҨ ", h"7foKaگ yŎ[e&1v`EGСќٽIv;ڙSNbmN]vvS)Y'KF;o``Kep~>߹iW&3c4CE~ }mXCgz}z * '.Jve4^BbS, h@NJ9?qpr-1"}* (#N$:.12!5cܩDRka'8E~sm?dž`ز{/cXpv4}^4ic_t&2rK =A0d4l?cgP~ɕ2gyǺ `i''s";vU7rO~}2r¯;mhXg7pls?==CW"F{[i>\n"=EC&lxK^bZ4.;S;q)9⮋1670|#K=F[w^#&"""5 6}²Ho˯U[XƓ~W0EbXHf/UF۪leBrOr~%:.KPͅz8ur?eTǵ*-q'$(XO9b(.e`n:3pbSCMNh'"v}zG'I&9*(.!5j$@ TQjmaF$ hR\~Я}io8U!1ފ22?>I8iΑ/; Mـ(tt;v}H~-,!2GvM'#s piNDMtjpͶ)LzyQY"_Ong5vz:JUx9 5Wr`wI]'"@ش_QS 9ᒠsM iPkȊ9 @-GK 0_>ChW~j@pvobfCS15Dnŏ)_M`K2bW:|yAm]'kPOUfxx;7s%Xu UI0#g{Q"bL%A]׺eO\ԗ,W2﫷c82Fd|{>/*?|? :Uq0c&>Ȉes~a>ZFwDc1v+2ga[8zl;M|7>zAsèLF??b`qmیgI'?gpn &*;GLOA>ߵ80;X:Ԭ$9?&{ؔ!}Bߪϐ\|ÜZhܙW).9ntq3Z<,{YQz=HWx{\ =1|tqon1}WIpgÉ:ѻc$ Y73޹}B^ PWDۯ'b t:jA*\KEsZ6,Le]SƐ<o"8(8/ޣ,?AVFRqx*JfP\u}z!$D9)lYZYFhj\7/]=l;3nih"x*q=a;Xo9Rv7ͺ Ɔ-l/܂569obo3GM*wQjz0[-:uәz2h+€ 7cqW=8_oBDeߤolӫt_8Xm4H7V,c:u%qbj5u#\qq\7/n}g2ODsV,05;JiU99iD!ڼ`Dy mL[䤢#6l+ w|Εq} wq uzv*^%l ISHE=I34;Nj$MM^≏16)puClte\#}A7_AT\ρED']ЌADKym'm};bj-.\`YO_ߺ[O8 bcj]]I>v""["q:K{hauI,}SMU"2HWSU)D[#-Vݯ9f8/"D{dε{h Jt|>DHUmy^""""Yűպ:b:bS1~~k?gæ9jc_c7clle^GOq/-*=7`4-~8Ic;_u4?7.F84_gr8R'qijNN[?v6X6뎖rQBs%\PGLrU]z[R]ھҽv_ 8sp j\Q9FDDD׃U_6%NH"۾' rdӲ3(zXŒ2(/](."R.Iy_gWDDDDBsA'eO/D& yi"6ξy 4)p™^ u|EDDDD.4"~>{fFb g,""""""҆v_-"xYMi\.!yyuMBD>=Yrgvl0=6Me8z( :>̌,2ҰFpQ'q563&->Ӎttfn&2ze쐴Elv:7=N'6KlDF7P',SѦTV.7MwsjI>ġ'woN.CY15h[}3NkZ. hqI$%-Xhxv-w7cT= ,W wX+I25~.dgkF?%>`|g=7N_\3O}n\sH7,`M{Le ƬQmYS-ZfCKW37/};{UV]s_ovy,X -KtS=ߚKn`DDDDD҃`{n7TiDqG• lZyӿÚbiyHg6A.cge;4(r~p؇>H^;i"t\a=7] ޲/P5@/>v?=CAzgnރ&k>-A,"""""r>`OdA6ZCk_Ǣ'+Xpۭ9{LϒƵzev\7_32thGz;ǷYp?R W4//~L9L]_ `|]-a3/]Ǽ)K! IDATA?˲b Kt=̳p>}v+7 <{1=+7`hT~rT>ZƳ>n~W:ʍ8ou$Nt;&^=̯O%)ԡ{}@= sXz1&"+#3ƋN׼¶1!y⢯1~x.YYyLA{/%<7NZs13k,f%(Mwi"""""3z vd#ߌPÿt;SmFrmOX+_lB=y9,Y0Sgkbۉ[$w[{Q`zϬ!O|fOw[|n=k:? J: tOdG`z55wҸx4𲳜NbX⭷⭕+Y}8(X& p+Hqg1[*tfT{]IYqc*x^ƿeaE>|M"UkBV` @LobuPw1:/D1<6zkaw\ƜLgM Wr%Џ|hULDtڈnqcW."""""'ScLeHFYmbcsɦ/aMFw.·x$[kt\wTK\DDDDD. { VTK\.&2dŬuNg@I(4`KR=~$LkӟKaǩ/_zk! d{29a-nࠦv3QGya{E! Q3g^u,XԻy M')>Xa~~-A#DDDDD;6Mov&vƖm?fQ/AÎ&-{/ٲ9ۆ=YY7 JTdC[zL' t7PY]f52X;aYAk CJbT'n~ٌ͇UmwW9AJ{g.dYmI8_ 2e<z yL Y7rwۋ宻yl=х1Bs 7țef.\pk͇7}CǼǿac[ckڙ:)gw*A&ck^dQPNǏ-Ywogӄq_љ呀.U-bUyJ gK;fܢ4qN(pY,qN xnB 3"޵kMKydS;D7_=S1(_ł_}vJY#Urg3z&ˌE+yhf׏y_2[==s0ϝ2SvbO;3ugg6^Yy<dἮ0uo=s;gZwq7bf/UDDDDD-=`QeOq̠-fehvzӘS>3C :!\w-e .x3;Ljej⻿|Yv恞:.Q |7&DNsx|;ݾѵg}=y3Yx NGy͚}= xyˎSY2_6gE +"""""&bs7rrjv)OdfUeEACD%7/%!=u漪wp=Cgd"3=WGץ; 5#{?,YXX\Jm->)}J`]#x՜(;n(RRHKjCGW'e QQQ$8~WgTDDDDD4$bRcIi&.u{%>N6  ~bNywh7n>V83iDnޙp=x`5o;I"LNNmn /ey`1j?_!0L8z{W [j\AӔ`efwΜDG+ {3i_scV5PrDlbZ{U[*l7q 72s%""""",LT-Nzw{\?ZE\JEDDDDDO`l0P-""""""JEDDDDDD@ H( %"""""""a[DDDDDD$ `l0P-""""""JEDDDDDD@ H`eee g455aQ&ijH8( %"""""""a[DDDDDD$ `l0P-""""""JEDDDDDD@ H( %"""""""a[DDDDDD$ `l0P-"""""";8J3$݈-UZZkURmjKkk-#K/QU6ksc&d0xxH{yggf T`8 l'0:ہj%!!+Wpn///ʔ)?nnnGDDDTqzUODDӧ}bDRR5jpu8""""j-""xzz[˗]H[D:%&&RBWqS/_+W: REuX,uםpj0n\; [DDDDDD T`8 l'P-""""""*EDDDDDDeZv#)}!"""r);SV9,P~ |'K'I#}ZXNM`zzʙ[).' g1u˗w 3TރtGͥߙ ^xk3YxχkҨV^ߙ#[@ׂrnk~r{42%=/>Ғ{m|aH>4}MejG0xCroJ=7""""qxI6S9sg.ة, Cy+t*?3 Щ,:.L'ù4t&rO,|ShEzoB|lobы9}0/"z~:'8}9ɉ4-sdSTʅp~:ZwI3vSum_;~(Grp&+cScTO&׭ٽ>s.""""(+d,u麙quVY>s|6SZ_#g'Y`e(4'3˗4`JlKN;[Ds.ZX>ERmVn V6F[ ,|k)2eck3c ޤo ,"bqۯ1oꞱ53E~.S@|8 ;ڮy=7_gFh(ekeY0e#/wbbx _^qꫳX2{N}i׾d<2އjeѢpwRTju[DDDڕLfKU,_Iʀ3sY%ZLv =9oF~tDD桏+3` g)轃0Cw ̂\e^h1:sKbfxwajp{gdRL'lϞ|M]l8h=Ϗ~U7v2c S͑erV ^JaH9)>TyY[FOgct2i'lc,O><$Sn7knIescH^}q3gn{h9%RLr0^0}d3|q}W_H)*,r HO@m.DўC֤QߦˊEpNyd9,ڻ3dG~ ˜=B_w[CKiĿ\jc-?{/fpY^s onq7պ@[ Dşv$1r|RG/_51v c~BRNC) cX/@_/2BX-`IlZ?ѽ3 gTF 8}dS/gCoRgp˧8\r?wn4+vcŇ3dB/NݲW?r)'پ=熿50,K~ݩp*lb:0q.5e7ş2Iie2xm_ʛ ^oqԲ@Q9\^_z1zp8=M,>g_ʗv`[/M?#?{_ ~=%w9(O9 tj4z@29|){nsfң_3m{dn[ƅFҺ{7[t0aP1b&.""""׮fqV ⹻r +BlJ hY)^`Ϭ_/>W<[$|뛀m[}AJ W]&YYpq9~_iI\zI|!T꫙4KS\*˷>^{oޖ@J!?i M*F/TMfM3[SJiؚf5mj{۞*&%_lj\Ͷ_JmCH}_0~\73gV$ž͈0];ؕoa1 {5*;8y[KZ0h"GV2W9fn~i%o㯑~rA-c;M kO;2?`AJ7>KH%ma\'gȡőn:CۤSۙmyiʽC),]/_Kv_hl0M;Gp9{}ðP ^6h5s/ +?ME (w)Rs>cY9!B_|Shhp;K@7FC}/g9#~^8o;z;d2\~=KY7{żZ@9gsL?~gnǓ&U0*g=sk0#=VYx 0u1!5nn0z圭[ w9+53-?QCEQ>+BNZ?K߯!s=ɺSoӀ5C2_+M1q&|2%[2n>{=<ǤAh^8ޱ§F0N{|WFc~?} A1sx:O_qk5|.r>nW^{O}?m5 v۲͝ӑ_N/6qtrqd$s6]Ǽոԋ\o1˯$nK7's%Lﻳ?ੴ\'9mfRrθe"s(nҐ{x쵹y_>Yٹ;vڵkh<&q1 xPx1!T0xmy='YygG"_*l]yEDDDnWVV+oj/6|ookn$GkZ){o 19rYrع97v 8]`[N#G ڵ_9tOT`\RS`nB3N%8t*Ws}М lkcZK{EDҘ~C: ێ l;VJtܢT`8 l'P-""""""*EDDDDDD@q"""""""N`pǎs""Cpʕ+1_DDDnikvxnW^9uP;j-"""""""Π[DDDDDD T`8 l'P-""""""*EDDDDDD@q"""""""N[DDDDDD T`8 l'P-""""""*EDDDDDD@q"""""""N[DDDDDD T`8ȭj:F"""""RkMYn L<ձy )۰?NnopV(=ZU{3H1;Vߔ񉈈nkr#1i\l /@3v3aXoށ:F8_^yoiSύ?ŤN8)ѮkNH/NiODDDNl)!L 6:ҲN _ǶZfZҁԴZq I7]voM/jm?h`u?<_>ES+""""%l)~!ڌa@VqJǎ`^9͛)G0nw|b9i6-{MЫyoV\bx]L1'/*u IDAT͈#t:M3qXL71lR0qfh-)Y9}D8Gf97MeI.%ͩp1}>e3vQ%leb^BS1ű{+y>| tfȤP|8 g0 %!Gc[Y?o,7:me{04xot`Їoи?d{ F cČ,[8fkV%{/ebcO~-pz& LJ'ϚeL Xp ~͠TjЙ#:>?D9: +sVc [A>L֋o]rz|c[G)z`_?d٪0k^a^XH|y0Ki\(ulν E!== Ϸny8eҮͽ@=ъje01tֽms/V(`tmU?aβiuouR{;ێp/Zu|WҜbp26cZGVE'0|;WlILɓF[J^>bplr|;n`ܼq6 7צUnr4 @ guiH)4==/1h޼%{1i=PՈ9MCu9L7">c]ƇNi ՙ֭1j. .""""P-"%^ֽaϬU{nm|a7R#r3qdOUn>|R#l%0攳椋y7tq@/ٲs7wfሦ9er97-&{3X TFėqI6w7wnaU4Y?~_l/IV"""" l)1w= 8|KٱAAi]bŰQ})rdK?!읏X/ㇷ2$zkسl#NMye|xK:~\,f #1\2]s>ݯ/'GXVܥs0al8;>J?^xmwDDDD }M{@,ƌ1#/4{{cXJwm1n472)c\GXC[s!25'mƆGJo_N3h0vNz+ƠI~@zwoJh?7^y?Nc޼*>۫ט4Dڲ!t5 vNL1Q!s iR rիV}ש8*-$&bX>k:ÔB|l8;L Aظ؇]-,n@)i||t;Fد+9!><~Nl{ $j{ƒCۣ.)))`݁)y|y%x%""""YV`H/|ϼ_[f =nMAch{ BӀx+k?GbsVN0=l`s{7.>w<}|,M+"R]QNӵp{ZbvDٖtR}n_fDJX9S8 l<ɐqcwq@OϵO:Κ#!c#f0xt@ۙm?'t *wF8yDֈz>@ӇӠ)$:qؗYv>]e-+-ɹ~+G^S l?T,_/Ŝ/m+,1SWH 1B4X,EgXHʺ8qXL.Vm`4S;IҀI?p'5q&Z@"In9oT$z`6$m/[I˗¶3'[>mؿ P'j5 Ĝg%0xĜ y>~9t!6_'MgPD- Ⱦ'fT8#Zu'hV v̋>u=imEvK'`v#܌Y&$K/ I` x8S_kx6Aϯs{[&w11޶}A6|/ί|=Y:e8gDDDDDDD;+ K3/yq·|9 T?g% $I0@,>e@DKO/.ANC@>MC\_6zZ0<+oW~޼93!""""""_`~雧q|w˚}x{FCY5Ȏ ix߽آ/s>3`4xlfr_ 'ekf~g eڲ݌;0q]zw^H MlZŎ^\Vn{Q}/IL0zMYGv?gΙ>.X`M;ˆ_1W,z#D;ta-+<0DDnVnYOm/$" 'S6%m{ QۑUg)VDi̸$]Y#;=JDDDD\D+""ʽ>/zODDDΥ[D}K\=""""""""""""""N[DDDDDD T`8 l'P-""""""*EDDDDDD@nĠ.ÊTz,!v OވaEDn6LDnk;/ltu""".""""""*EDDDDDD@q"""""""N[DDDDDD T`8 l'P-""""""WpV}n`$).{qjNѹ%;SV9rmZ@0[=Cejdꚼ}L4VjNja+ H8[cz8W>ބeQfwt>ڹ|{Pxc&Pu_6= +ٱ֩ރ<9V>9}gJ{q-Z=k_XUc/ m[TǘG1x/O% uo窸F7W<[-38ђw r]}"Tsp(WuޚʠQXŗ3>|l3ԩ}3{D`MF5:nߜtJ;FLREJr k1~;C*.э=l=Y"W]7Wc$7DkmLJ U#ҘIx65Q;h!>Q5ziX59րٛۤcD7OE29>ZdbЌ.Ë zw=SBs_,G/#8! a^p/ab; ڰgV;˶1 3m""""" ؙhW'뉻K0%k]}gy><1q4{QV= ZJ}=>3(MzY[Nes zxYSJ_$V fڬ[3~0z}C4f,Ya5'[c7gk11oͶA]] Xsy*6n{;`t;M G}?srO DVk>kxD4E{0bô&v8 KZG_bfX7/"c%1}@އİGe@ȫ7` Sۃe=$Hмu1xI9a+two՞@/8Z|@ Ձ>Y d1_@jбJr^>;札kB-99_dP},uf_3 ~|*g gh,\/]s涤cDz$+ ZѲzyro71b)9-Oй`v֒1M!,6uCμcg<&0]¢]Q5K{#XM>)1$Vd2n:¿7DkǏ x?#?2w _& *X\bfŸ'*co[ *k6KYiIl =ʔ}X0n~yqcsbnʑI6,9pGԂpBh-n4Xmʁioac?o޻‘륨n'΋涤ףcUJ5XʷOҼNun{grDpg7s.M²hNOږrcDDDDy\V`OR4g}v?y5OGonNqsڿ ^`ctx<+DPþTx1X+`hP>iOG'm|aU|{9[-(c ΕU;3қ|39Kc&6l[sme.D@my1%v}x$>5"QXMEX5}.Uۧ:v_ŰzMeIOOec&@O#e|+?7q @ph>y,r(ϯϢ2vֶx~5ROSSt'|D>(ٛJUES @:=oXe޷y}W3hd7,VS1t!g ?ãj1Rt($pY;}ݧنJo^ο>(I݅s\9[?:ȸ ؔ: h.ro\{hiRfO%)_͛ʹ!EϿ#_;V]4W[tk3H̉s, {GFD[K\#-,mw[2+.,EDDDV`)}_0~>w_5cZ<W?o+01ϣcm9Yp=þO >f?TⱧ~Zpz%C[` uYtO0.Isv$fKIΕqa1CK$gQm2Lfv99a|7pm⻁io' Æ^!m%׮q(ǯ9_vn[ _!:{/5__mg8+Jf ۉXvfSm=\DDD8}["W VEa$CrwH 6ьGHF;!qΜ+Z0H~Fr9?nFi EdF1m8 P9-^U^+6fG 쒞VPMH: 4<ʝa`F]Qܤ$͢=3P՚,ŊSg&9 3N\,A^}eW},h~Ϡ3M|߹{:-i/q`BMjPCEȭ˥;&ݗҳ1C xj]ܚk{0ex^?>-[0M ݅y",׾֞ 'tq,{.Xx޷%3X~f9h{7j ;d_o?ֳiw;K8} l[[wɚ֑sCׅѲ6o9#6=}miz_3np~6e]zw^H OKV+#OF2gΓ'8ZmIJ$(4|+t5s7_<w|)w#1n8W%g{~^hnN;cIH 1rg>N -W |̻@[1DDn$GDDqVu++gPU]N-,l!_eIÏftY+'V T񬐧['Ӯ[Lb.8܊'kԼKyϏ'Vum@O|Wȭ%+ط#G^H]2ϥ%q2sqNDĹnFQZ湴!"""""KDDDDDD[DDDDDD T`8 l'P-""""""*EDDDDDD@q"""""""N`F +"rSLDDDDJ+4Ê4.c]DDn;E\DDDDDD T`8 l'P-""""""*EDDDDDD@q"""""""N[DDDDDD ZYVHS\ۋf9ΕȵpIm5d\+V/V]XMQZْ_Gz 5Y6Zf3'{G2mf*>#lL$wx㾂i$;{ʎ5S{r-q a1sª8^ިgfs IDAT-*f~:ْ̗u3{~F@Uq mTy. bKг~O ca9=.b֊I\>\_GRٿX^LYٸ?5zVɔ)4,"""rq vi"l'٫A~B%)vY#Y` ?~NĮ> C\H[ TU>TM C`~(={̠: 4Om')9 ģS, Y` /x<Mqn<wp,WuPޝlo"GusnVUƥǡlL;usq1?/g bL'U+Kք?*.'3okeS .`Q̨ٚue~/Vbǥ<ѣ En&Ξu%#d(jIkf~/y>pb˼b⹯qƯ[ Ggc2cޥ ܞʚxb , |u/^|3󖌧kuz>vs}vu+3橶scwg*6n{n*:o :fTdN-za#5r>5wY} ZuOko)-³:&˥C`(lRGdEi\DDD93̓k%lIӫ=eߎwv$`;&VIl|Fмu1xrb9]?ɻׅ[=B/A>fb_!)w+?rdߏ<޼7}$6ro3g)ocN<޼75nr""""r\!g^_*3.`?m0Fl}RbILd&tE` -kTҦV,÷G|T<ށ1޿3U3`q'&m<Bس?z;PAc}|Zٶ}Nm]u0BG8^'sbn?zsH8rʻ}w<#㗭37V2k`F&xM> y$XRz19Fid_ .cH=/ީ˹7E]AjDDDDn.+@l]||cްː fԶS;}7b'X♵j1>'χPS j6|U|<ʔѐ v7ݞ3:GUj)>fGKpͭcaY/y]+s+\q穁JV|vFWK4/5>2 ysUOa񉈈3=Y? 4ӧ*eQѻe=ě??7 oțga,V둖,`7t-(>=ߞV\<^' oSS,ݱ ТS@ĺA,DO)~~).S!\8ǎj< ,d'& ?`q]9"""";z>؛;>nOO]\qr]3kTE-u]>vx)㣯UdvHѫUyl[VED^.mTg)\5]""""""""""""""N[DDDDDD T`8 l'P-""""""*EDDDDDD@qÍЅ=7bXJe""""R7nY1MF=mm煍AD䶣[EDDDDDD@q"""""""N[ٻ|^ҍeRJMl*[pa,X.2R*(/BN(vؤ Z찉m)4!5?҆tKӒ49~>s{r""""""*EDDDDDD@q"""""""n`teZ]nUx]s|sHm5}όuoq?giNd!\_ɒKz=m,!޶ˋ3˘#vgČ/}&ӫn5xSWE\߹ykfxx13iM&.1}LX7_Mk`6.3#5rCɝ:9~UFsLlib.qmm[Z'[1[$O%:Gws{|ˆj.rԮel-ˈQE op_Ew^4E;yMߞ2R)8t*ڷ+yE mP͡'[nz?go29,>\1&X!CϬ`ȖdZT>eO1.%w OvÚh"6~4aX^\ˈa׼6?%}9 SC0bv`YW|< 74΅NY8KUq.P8Jetj9Me擔siCh~ Fͯ1z$R9O8s(޵=1;Qr kI)*+IZ2Yztx\fx$O,&5u,x0o[,zRs1zg(|`)]! `sKhY WjZWv<-$}l +8o ֿȧ3iSK\|>Ͼ}ս}ե6NsdvD7?8s8]ĚGy*3tr}زK&5a&͓j-Wn@||1'۪g -,/őShX捈 \mm:-[ݢ@9scЈ M:s~u4.KLi[6W jqLڵX]hSЮĘ,;+NL\3Wyq;UF?t7 eң Hz޶y o?\3~5dZa,ɩ 8DDDDcA Wml|q\-D0*d wrt}v$)y^Jې;Qs({8q+‡WNx'7{ǢVp6"52ʁ[`;Ыhk$Ҽ+֌x =E :sSx$8Y굀lvEb=wS1^Uq)lҗ b㻼z;j8jeǼow\?Vv̖䥋zu ǒC|U/Zk^$=t)Nroz Hx;o3eswp_{ hDm&f7^~x0pft@Q @ գZ o{Egl>E++gm' U-Xk/Cr(BAH]wަ]9KPczn`1C_B.3?ɲl13qXlϝľSxV~tˬ Q>$ihc]YƣV?B20|5kqK8^j?0rMTr]j4{>~?9̙O]QV<ӶC1T";WKj:d1)jqYk _V2vI˭j@%\e!"""" ~\B::}Igqaows/5kZnM\*z+\y~M^ dqNl\vWb.aG8V97mVjN+㸟+}.vj,@ԯwI}^te:c%"2W޳V{774Uo9F{v.~\ӡp[u 5+F`Yo(7'\-4MU(ƊhnA+"""""rHʪ;W~1^}v'V' sWJ;湴>/Ol:2}gn[lgUygDDDDDDD *EDDDDDD@q"""""""n[DDDDDD T` l7P-""""""t-ѭM2)J)V݊4G.LDhG.x:;.q"""""""n[DDDDDD T` l7P-""""""*EDDDDDD@q(r[//JDDDDDDDCt"~0'C.`52w}6fK.=ȈnQ4^^^dYۗq37~Q}bV7>;+gӬpb>lN׉b"K<׺vx`K<# VMtdki.5B_#M~1ʘ3k*sM"-Yyߟ(qq5F6?|KNిȭ񃾼ؔZ}B1xyow`Cr? \xf;/;ׄB-;vl %oMIDޝ)@Ɓ ڸh@ix6㍅q 5!/?$eb{wub+c kLhlNyoZWqs0dsZ2fQ )5k#C_aR`5d礑u!fk,<3 Ҥ':j?Mg3^x^&4u,LԠwxʕrw3VЫ`JxeCמP7gZ~b}b,rvWKEb|e/r[ROǀX_N/[JvOMVDDDD* l -usSld$+ͷ PIw;)N6>n/X2wrzb8eԄmpOsLeФ`o>зIД_}7!t2bWT,t.r#ڕB}B5K""""w(Y@ay^ ,כ.Cmt>}9s,r*t+Z<:4|8OG b7yiiL2MJߜ@qe`~V< 9ltj]U$ƢFb>y"wSCr/Ttȝ14mݓj _5Q3Q4} eo-a.fjWjc,;{ȞE++V IDATX|8zep!Y¨ռ7r5 ^Nb,T4ƃ1kywn^en:@Ȁ<\DDD`|b;,0[ww2vhY 58uncy.${oW'ߝ6?,?~mп&;r-&ϏCʜq, O\Bb D@nt/:ǿT%|=(ϴl6cݹ7+ǥ1~ƺ/3AIpsK8F]kgg7`|""""R<cf>h04b!jzoUTՠ4$1"3{p?8#/ajp~gnD$CY,P t-gJ"g>vi1yh}DU?Vm0WKEc *ňG{:*V=Lp #`bS}b3M۟ofr[{.n:aN8^6*&/ ٿp k6j{V|<-?x-MT04rYc˷mntxܝQ\Lk63Wr,`JUDD<0DDVs+7 j2JA.pظ"kȖ\s?P'"""")]Yqʎ;+`5`mL\jnc ^^^dY;$f|ix03^uǛ-\ĈjΝ[{6S;vƳIo2u=Ws6Yy假 p1QI:j9ߢQE op_Ew^4E9w=?dH-vϙ9c÷H{%-drvp@ne$eju ^^r8ԟ2lL. u;gV~dDB@Vv*__òNk {Iػ'|A*p@4Ah?F׎`,/.eİck^~ɾlEc) \!zpX;+>{ BY,%3KIė'eeݵ)u?iH u㉜#=äm0o[,zR4~Jsp̗] ܓs?ջ,rqBrNXdp{ zZ< Nʦ$ ;^YODDDD;6&7/(̬3xzN{'Ya̠] &n\^,}a-{=D, fBߕ>U`!xue29_fѲ{oΫM\|Je>زK&5aoy؟~Ň޶jgXhF)rkKg޳,Nݧy{x-"ߎg|F=./|(^SH%M̅6(JR-ۋ3? o/4^`Ī3WLc`\JI<0[UCP ?˙+d $;m;ן]#//u>&*7HJ==#&&@-H7[1]Q^TDDDD*nr<>2kbӯY7&[#Wc2f:'`"nMVnVXmFQ?!Գg^xc5bjtPLs&6+9c勴4~LslWs4a :Ń2rN$[.]TG'Gp* 7]1]fpgm$+G/ܡdX_ܩ~7:sq ]sZeqWA6y9}kRfYnM\+%ju_j.b@qf[$Y|ݯ`ByHEk&rr,` x;OquNDD\gZ=} ޘߠӠVvay޸ "%t_j.ތW$SD*—ܑu80Q7 ~8 q0vݼ&䥳d_PlQ։DÃ7Xr3 ;罉Kh]φ@|sOm|iX)X2f >L' Xk+N iQ4;uwGvQoM̜vmenV.jp\.i[tM qy%#%>1{oѽxf8Vſʠ o~Yg0de,}@h(xiY*OgGo53@9|h{߃];I!8kC9Xz>;<}:ȝD7PsƱjO"O )!-{Əj#cKfLNP0N}Sc^b.'Hߒ/8F?j[A:ugȦ=Tə#oZea%lVUf?Ҁ"ޱ>F`39}jÙ+\\S 1;%fy ++w60 ,X퐟Ȏ]Krsthv?+gR7.͕(I匡\r\<瘻_nCkAy+7^"""""w,8ucfbӯXI7lmsȺ5ImtiҀ_@f5q&䇳P/C/ypfrtPLs&j;lwQv<.)]K}_g]6tu%ݱ' v<ܤ1ln j4GC6jeO6H{{ѾCVn,\Ϧ67.U9Ci4(<)/7BkO% )"""">@ZpHpW~o3$pjߥ?5\CvR$L? m|_eedq:cy.i{ob9|'2.|C~L?~mߤb^Qshűp^1m;mVٳ.sJWGy]g6hEV4mЃjȎc9K-:<=9}wf0~ACZK7*|W\y?[Jʛ}ϊϿFѐrQHzl~ؾ1& XȠU5 #}̠'(oKs=ܾ_Ùɐ8&}%Tk15]l>~u\;-OZ?0j^ec>~/UފO_j4GL1Y+wڛQӨKBq\]*y>*+Jawc/%…ȴ][DDD~zyy=po0m?:]FgqaoÅ_5P[ 2Vr&jwƥ_,rn/3[>6.p,ւy/70չ*Kg1wbKeW~ɠa |L/'>vܪ\LK~CDaZo_)xjjFZJlJA.pظ"릖\G咽Ct!]7?7NzӬM;F_n] ޚKY|_ydNJAiV 6C{{0z5s8CfuȭJ+""u[`j&=4r;jЦ [_pH l r@H[DDDDDDΠ[DDDDDD T` l7P-""""""*EDDDDDD@qCetzbJet+"rSLDDDDʣR .uUF""7͞[Z&"w=x:;.q"""""""n[DDDDDD T` l7P-""""""*EDDDDDD@q(r[//JDDQqB6ڔ'yygƺ8ó4 'Vf/dɥF6o"///2,c؝q34n[$<:q» X~9Ȳ?Ch `gx-޶cu gXF6`-AUd5@uBh.;Αӿc_0o&}Bh߹ <|TϬ`ȖdZT>eO1.%w OvÚh"6~4aX^\ˈa׼6?%}9؊SC0bv`YW|< 74΅NY8KUq?%kvLD}B}mbd$M79|'+'cx1O¢hLm(*_&a`Oe+-!.O c,X.O\`WLY!$&-O雠’61x{Zط7K$# = _w%""rL_|lfV}ފiqu<=Kl'=Γ 0f.7C/뽞sXwNXBpQ2OOoK[B*Pp` XMʎeP9>>޾PZm9GDn.+ύ9gx548gUKY6//ށDZ˚nR͞=9y@ͦck'oRj_ѸUGeAS^Téxh+O?PpYyc&L^L2$y>ǸymB?>c^6507-5+}ʣ793ۢ~IDATzC۠`۟+fKVwo/.#04b 3{e\>_83qc*!f'CD#}b:vcǎtɼu1Čƒ%ud]$ogޘi̛C̼$ӷ2&r6F~쭧lғ= 1INoEҒi"c?S̎HI'JSSXbvBksɽ/İsz) ȱI0vGfIϬSILsX(ye3%e<";vKJVcq0.Q-0eecʳGr> `#@^yUB|XH,NXL,p ^mlohW g~-1c۝nr<>2kbӯY7&[#Wc2f:'`"nMVnVXmFQ?!Գg^xc5bjtPLs&6楲0ZCĸD<匛:N77xR"0.3uq|qϼýV/bw5^{$cIsx8>ܨvLB(jb!3r[^XPf #bX: YĸYI 9&R?k~L)$¥D%3r2K_s{36D!fyތ]I3II'6_"a4 jW {~ё1wBh:F{TVW8Ο!H>~Socq6ÚC\| ݣfӡ8.׼C?7vP@<`:Fx*A&Oƻ̘Bi;Qv<7`ͺ1%/sѱ@<'fqoP>LOZ@D7c/k<`'iVh6؜x//E{PM[TI~ \W !9둯>?6nY'I4Lk ;6C `L\F كD]%|oGxŏӱm{ҵM#VkxZHs`q6u;DD*@Ƕ? y0&~^`3XqvΙfmJzy9l.+LJ>+@wތ@5Hȗ^ブy@qL\FTKLl~ޙD䬵4U8k%͂ٵ^dEDD+3axɍޱ(f4=·|M<}r*Xv**Z24 `7~5#^xB{NTj*#> orVPbof [m]BDn*5!m}:>SJ@\`1`/'6T M=א]aE.]|C28w8 wsw7yXǶW{:v%gQPV MQ ̺ 110 P{{ M-%ox iT?˗Nm],_bqb?Hub 4*tm;>gV+䝇NGaԯZ-2Ʈ T8>Frc Ic+c &4h46Y#'8+0s,|#I9#}}IDDXv7w:*ЈM`n`$' >޽Xϛ<dG :3(ֵOѮʊǩG ',~*ҍcر#^6E֨*lsx!f8-Eط䑼d27)yJ;NJS[3/--\ m`(cMT۪zi}"Ysܚx""rXXBl>>QdG:-\m2I2/ x{aYYd̠V2q6i##fty~/B')?qBBÀ8І7?&nb6qkٓLXd~qOnCm1^ǩ08xr8? ,u]+;w((-+xθ0v`rŏL0~_ y3Zt/Hy8u<]5Hasoz)q| )F#F9E&TDD`‹ aD 䬨4"{ m8=&mcOJa61D\6(Vt[mJ;DnTYu 2DMdɴ: 2ש8&nUC-E4j;NL,x(} r;ݺ~ᬃ,!6wz'D$F<RJG^/*VZԽNZ @zN6WGvni}u86RZ4#eAn01@Z-ukXky'crl? {C yرMiy =;vly8x}g,w&>>c~{ՋV=0 0 g8{ъ7=ٰ(EK%Q0ν=?tO3Fpd>\ZAQK{*768oʨi˳r+&_gӊvρc&'ݝ ~~Yk/|@Z%]͍ 1}h}d㊻,ڃjm^|M#nKL=B0"e0ys')2Xu5c!6df<ءf vӄ+RtSgAa^=j0.iZ;? NZy N04_;ec1 O;qqmjn& Z7f} <LQo(DzH$Tw?vc&ӖaaM>R+k6I\8N=)['g{6:_r" C 5p7q v0@6/1mkUP|D"+lfOz6b[@M@^[p@0M̸?:&eH{lrsdl,kS쮃ʲgeh4!35bŲm[9۪~8'Xm)۟rt\vw7@gDDD$%wD.KH[cYGcGߪɫLzM_5߬0 _x٭#2 k6`' vwu7NFYLt&"\qǾxDDDDF`$l$P-""""""JEDDDDDD@ H(I%"""""""I`Bk{X^LDDDDGgs{X^sNc hRȀ30KBDDDDDD?3 P 5DDDDDDD؁*`&t*'~*h_6eSIENDB`flower-0.8.3/docs/screenshots/dashboard.png0000644000076500000240000027220512324702473021037 0ustar mherstaff00000000000000PNG  IHDRD{iCCPICC ProfileXY 8ן˵]ى=KH%ZH"J!k"$%d)JByy̙3gΜwUK RL \\p 0yOT% 6;,L~Q>@ Cp- ̦<ԈM| ,DAl_a{[<vOG&S "tD=XpߠpU:>d_=8$'+Le"BqOs%,4|H @lb}@@?sozSaF~mOE8#!{,6;6fFO/j|oK_?#c#^PC4LޱN#Sւn++T[sZ^ ޟbb/Emwk.j/(F*dxLREn42@۴D,~ULP` K`~=i}TßL-9f/>|?A柵 J#]'~Ko*i?b1k5Jn:Q-G&T=@5Pݨ_f! ekȌ~ zW(/o* AഥuпIF7")?C6@k#vFlfCsY6h]dT῎-[l%|@p/{"(AT}0PRPTgW{nL؞ F6A+4AB^:f|)1h~NJ@h=` v\nĺ x/H S 8 A1(W P@ ]<#`L0p"A?$ ICJ:C yAP8 %@P:.Au6=h-(fya1XVa H8NOp|[.9<(EQ(u!GQPPiTՈj5ƢIh,fhG:}>.Gסosu Ãhb1.^L*&SiG w,ˆǪ! f`ck}wEljilpd]5qxZbnE^>^S<6Y>6>=`l{|$~ lfy/  9 %  Յ[DEDDD^҈]s;"V/6%!n./^%>*AЕ(x&T +=qDIՓNaO,bʊzwt]@vZ3r%>;kې'w*o\5< ¢w0pbKĊr1JJ:/_(*M/]+ //+PVQQSy ~ՆjK5l5k{]aqZڂ[[iuP]\\}`xkC[oݑS$ؔ{{)6Gܟm hy:=;L::;j?lzc]]u*ݷ<գSTiCFoc{-F̟u=~788<>4>;<"ח1/WFbFr^*z-f\u7oߎy7>D⇜IɊ)iޏ>ND̬̦~bTYs/s.s_)_7esΗ-l[h]]|=R?v.;/O]ŭI5[nmlD)PToeH wA!\|׶os K|?.GsnllE`; 2BC4 O U+7c,1c8Uyw av@daRg#QYΰ6Mp0ss3'#pIW.(cyRE2dO%ɇ*)nS")M*DJL95}FO1ffyNͮ93%1.p>OSxdkiIr=,VU_\]RqmRݭ %; 7ML"ת&g;:[V=~mDG`/Og?3ƒC*/4_ꍘZ y<^{:8C>̊Eq eߛ~|^Q[4-(7pBi4ՈV@WcT0X.L$Ӌ23p łaŲ1ssqps;yXnf@".ыb?%nIKJ I/KJg5(+)vREGeF'< c9|-Sږ?tJtt7)JFƪK&qfZf+wwгV)f6Dg;a>G̝y?4rA>q}QOO/u2Ż)h@ Ltg=DHGrRpŨԧэ1{c#q&@ 4Sk19jq6#qxቛ';N eNd}9zf=g=p5?P!(~ɪRSpEFbo٪z[Mе njߊ\?tQNHӹ-o1kl}P㸮{+V잵 zsXzo:]χ?͂Ug(AL%h9z@z d$5>-b@sh ua_ěH&GGZNC7?b1VDL#f ^~)bpx_EӸ!g# х8JM?ɰ̘,\G2&=g dYebb{ɾ‘˩9ȳ{υ_+/%'.l*=&f#&>"Q(-%"A\&XVF 4JnWQUT]W{DW5"甞.g27mzyݎVSl>;m8\\vI+{L>Gw |b=B<҉r8U؎x}ԄKٓ2S=Zf>|RCYم9w\и]YQQSuj5 cu 4}l&Wt~{l}gp y0RntķY/~W<.S^Zli|uZ=@$h;eBH–p4\?Bi{e=c0uE*6{A,^DJs Mȧe=NBw(MldHdglac&2ד.yRP{ޢѨyK+:eze5wL0'౐ԷMyޮܾ֡q+.Cw9HO#w

,H۫&oqdjЌlЧϾ_~ }[rZa̟kˁ˽+*+y+kޫ-kkֵϬm((e3@WbXX)X+FQu0P}tF{eЄ pHYs   IDATxyE?owt$!ar@2 AB HQuQaUvuYve] IBL&ox~힙$CwU<ߪ֛z t:)ԕaa0 RWO6!KROKR_4JP(PJML91젷F>85'h Ҟ On'7D FwzR).]Jeed޽.('o#}dyS=כ˛y$|c8Ğ6GZ|EѿE|y{꿷EB=E_OnCǏ4MPP(D0hooQHp8|oOZ0Mӗr#'//dDFuu5Hð޽??FpzeH^)!U-|7bs 篻q__Ow]///ߝoAss3DoH?I7M3'w4P#xӽ#toCx{O(/??{^~4sF䫿~Q:vcO秏h>N/v4_E?27_/Mx}hooSj*D!~${Ҁ5h>t?D?ď}$%_:OPJvW|ri/;E_/To_?|=z4k׮3fF6m/BW[[[R+m| qx}5! L&Áhjj"J<x<Ǣ>fh]z_տ;=뿥E_/%\B,˗6lG& "N4P(NO,ݹ?b*'^ƻ!Ď@ΈHwD>ݝJ)$ >H$@ 4Ml޼#G wן9}qwU~\1.t_-_!'_q-G"/_Θ1cXjeeeTTTeFf>nnnV^"444H[[TWWӯ_?JJJT(kh4Zp말~~u|e2֯_ψ#pl] STJqoΨQ(**ׁ/d{uϟݯoXp=D_./{_~ejjjAѨ\k߯|6&vA:SO=illdСn} gO :[]@멭k3 XnuIY`(oQ6Gð9,+aXil߾Çn ӽy\ѥC=xw ;_fWNayv}{?)t"3ftׁԤu(͛7STTgAII4NMHR1qc{#Gt<Oox<ΦMz̯ϟsliɆwy!zw,4bY.wSt8},tk|7,Sy7'oO|V!///^A駟NEEEyϩ}PJ1d0Lt: 2-[P__iEpo> wV0 +~n+Id24662zq(_gk̙E_Mەqt?>%i*frPiWQÞOh{V>;Z0IA_wKhoo$B:R'өA".7 @Q9}ߎ=7o'[~|cݕB_AO/oyozv;e{?ֽP/w/E=/Y?zp8ڵk8q"%%%9>0ukx}qz6H lNT4{m[?oݽt444P]UE82Maib:&(xꩧm0y.G0Źz;ʴ`bb¡Pn̅20 >VxN0fP?.إjnn_~g]#T\eO-WOeyB}~R?2 ޛIo7S_Eѿ&/~s8pL&s>cY7mdgG}n`f({.`* ֬(hXG>]cϊ;A#?9?LaGSSUUU}Mqq1x};s9(^Ӈ5kt{h*޲E_?Q u:tJ7uF9Їrw+7iʞ$-1 A)kjBXfV`ȁ~l޼L&~ e=~?ڎo0ox{NH֗5h(Ps9SiEXn퍰iRw8?l| J.`s9YtToe\=vGa%9F] [{ݗiTWW}v鴻$0 (nlG|hee%{,Do\xQX )_w;uxW~7+ Z]>//?Q߿?444`0H :w*|:Dc{+D<~s9"yA TZƫLLJozu"x0OSK0~Y (Tju:RJƛSJl^f{+x3SOX{Gι)ӯRLx(TPR^AEEnph*:x%+%VZʜeg.qZQ(s_3o??s͜ٯ{1bRn}Mkc#_UrCyDFo*ϴSgo1oXiXii-63ʶk7NۋMes"0ayim/_=# /wVzxO4D"R__inn&NNijjb3x`w ^(H 9\zEpuv>&555ѯ?;iNc@Nq0m>W˙4Ju7ZZx;+#aSv=/+̯bUc {^2_lJjgǫM̿|}{<b˵<2GgWR?'{/+ϬKu|t͌T'~†*ǵ񥤔bӢ{QGF^2okuڿtnc|?}n_<"+ef/+A9ij:׋24` \sg7 8)SD"N$aʔ)Iinnr;ĝk˯|ёsz;k/^я7{Ӂln:/ڏKyo=2_Mۯjw9E_!,yI~RTVVRRR¾}زe mmmj(**-:vq+++38.8vAyyyA{F(nG_2XϣvvvRUYE:mH9+cpZ\,*` (EYCYx;yI|4:D0UO}Z6 .g1;_MT(ӪE y E:!LLs_8T }SeMek̘n!~1/_½gO>oe|_ek6a{Op`,ͰVܥv!^ (uR9qvydd-R)];Ťi:;;)**rzo<=ih>M˼}^O?kf1}IF9/Esl={mӟ?_q{c,//BΎ^~e2BÆ c92 TT*ե p|:N;]R)trsL$ 1tPN?MӤA^|pvD}A1hҹa>p3ܤ;kfOcࣟ`5S!>O}! 0`g~o#wqo~/^ǘ>Ha}Ywٵut֎)%5\O|ty~;E,&.t; OE,o?չy/^|<WoG|_#/|o_/C!^qg)HI$$ Rk+vgg'dҵL&I&n@ΟC2tq$9E] J)q(gVkK?|J)*F_-=qRxؙGog_Iq75sXѓ 3壷/^zƍc6ݗRЏYKbo`DЧ~(>ÉS0.n%ZJ_O}aKC|0ʏrw1WsR r1[?nF4uMW8 Q^:usxtcWŊݻlĉd2˻dyň]y;ӴcI&s{~׺Kchݎ_Y/m[M0ziGy$诗SEFFTѿ7_>νVٓ[-OXN PQQAggg\iC;[^3#0`>qiqmu)c*8nYLٜ[l1_/#Z=Q~®?GHZ[,9їxׯR;% ?.ˣKR~LקRS/W~2JY"8lnv*"< Y>{H\gܜ:a+ o7pG{{b{+_Si ǝk?i$2 'O8\̚5˗3i$[ә4di8H$:guoðލH$b]n^^=}wĶ_:z9O/HB}߱2GEr:g?WE_Ϣ'S^!x1'o?M?:I<-6ކn{/zKq8iÆY3>Kkd)a?zǿKΒ~̜9ӭ_.`0](yyMH!)4dk+iBʢ9QUʓH+"e ˙gUD ;^ &TgAf6o'RZ <2 ";t#sF{'#h4;ߡ3 @ǁr߳ Gvqۻ,=?)wcsi~{Y^zc4M-#~K//{=غP(N}$B'+p>~'~; 'ˣqcǺKOÙ4@vݕ?K)..M6l2n:XQv@> 'ݩIqs܉y\CP8F,˔|k|祇8yd˾ |VgP`$F̶Y^Yg40`ރWvw5O4`͚59sb18@߾})..,Fillw>=d2])wzg{7ox;I/k{>E6EE0Kgh N3z#&qPÛ=iuN A àRJb1:::ys?~?<]{d}(@ά7`!gYrqԵǁU *"QZZʁX0b}# IDATSUUEqq1EEE}R7-(z6*[?muu_޺_E_E鯔سg 37ﻗ_O=SyGP_׾.rz֭[93(--%H?kӧOgܹ*'D"qFF ORL&1MP(D4,'\z?⽩xw?}~7&~k[wK/vs!'@6Ia}Aw#{rx9i`0|חhx3iݻw.3b}^VNCa-dӳ rwATP'(:kBx>p3`DgҊ3yCv0,5 ۆ_Vde^lXACk-Je6r ä3֭]K4e'kz췤ЍH&w3 g,^/蟯D?c0ݝ0^i?wNoǼ~mۈF9s kt8.| cߍ}àNVZE `D{\q~RٝA ׏yyyݬE_/N00{9K74UXG&! Gzt!4V0ߨL2p@ à wd'R %we6rڿq#lik&puBaX9wWܲ+'ǏYytz}] u{;J_]o[7gY_ptW|N_E_]鯔H$*td2I3`t8`n7=aB@ o'@ |P¨߿_XS8p&ǵ+͒?B?s7=k`pNX pF"kݷR_ /_ /q㯔Q__o˲#kdW"{[dT+ߓ*{EP{R OAI"(=¿W'UBaWv} *p#sCec~e Xg#;z՟k{k6PW͜ {A_ /_ +0'` @ @pPJu!(?o">B_om?N@ggx?=.+{OHC/)P dD ;0ӿ.:C}ЦRt==q˱gߝQ7ePoWD}֨;>ЎnᯔbΝ~iDQ@ @;(hkkcǎ**:!Gk[JP|(;U.E!f7L@ k7vVEJP(wݼcmGAnV.':} :Xi)hY/@ GYY@}9e"~T@DPan\~秉FLegrWfs;39H߉mC9-b;p&6S6RYY]s*5/G ]())9lEW^a޽B! `ʕiyǀxv"'{ᄏ˱x/}K,XAvm+JsřL:WzCV'NB]VVz:uǛ@ @-nʐ!aѬ[W2>}PUUEuu5`L&իywԧ>E$"~rנ\; e)vH YW_yXIa L>k3l8w؂xRִK&Q8` ֖XQθa?CmZz /2h U41MEsK O 8 4`wᄏAvg'm·QFI|A^I9 ZG^zi~g3k$=9KװgRHY-@ 8?իWNdLx]]}us9<3,ZT*E:aZz@W gcoMKK gM9H$B:&NݸÍOlx뤲w= ޿?oD"s!-A+] BnŞk:-ѵLUVA0`0H8>( Zill$1|p L<wM{Feё?%_җr~wZ>4xO$ڿЫYD5OG_qˍ7p}΅/[7L;?_ɹ78Ϛ_-&X{p-_nύeͯs3?5z?Dam|Y :9hWvOڷ?7OvV}KGbuq7$lk/?6Hn῾K.AEle6?x`~+M7- @៯a-kw5oz&e_ @ >8p ˖o~_(**vԩL:|综 6,縳YwɪWfƍMg(Olrkas o[z+Lwg4Ce~>H8B4 HȣNn n2E\Oѿ_?7w~x adgs+fjhO)šCMTVVwt yܤbR 6dg츁Rk֐4h!p4))).JuPƂ 6b2h3r|m0mE[KZ6 ?X!T%+0Z~ \:;,z7!y待TNmWN&O|VHӚhbELn:8;_7n[pa`C\o3:{2{< 03y0lE@ A~֬u0aBo޼L&;K}/=9b$V0] (l S)ٿ?}kBr^e/vPԶg;CDQ {ZXI 2D";vп_Q+;;Ak!`w;.QL&C8%Y'Mb]8d2DR]?ZN6^Ls6s: |^]̪86FVg}q<ȁ8p܎E\:$c?QZ:O/d^[Oڻ~+w/µ&mg gr9 Öa6ī+o;ȶ8`‡Xp%w{gDGo'q[rgf#Iº%ř7Om4n|S}}4vj%\X꿮7b[ՌܼzjռWrӥw=Z:kjmGN~{x+1[t@r O-Y"H_`󳗴}igR3(@ t*?q&ͻK/ҥ˘;w.zj<pF:u*o6pqΤN,|i."\0~gCAyTۻZgIiiine" S^^g*/e5@("0 #0k#`[Z FGDzU6txSSeٙvioox6C()*nzX-om!6rQ ?hNע%-9qZ=o/q?xU[P|a#}/GΉI: [~ Ig55a `雞ҭ0rF%}` SF%4~J[b ^ KwҩVLT+} ;~j B 7 D{Ռw?p s}OrW_^ @ ȃRӬX{o=~!C0gΜm"O0rHƍ{b\m۶**#זg]&vj dC?+uwv3i"gM9t*E&cyٲe MMM]Ig2Yۧ+oL:M:CdՔ2))f2 0#`m6֮]k!5kXmر݂~x{G_-P"+/Âїx6~ g8y B$"cq<[.DK~~/_8o$`cd3r8 k"aEC+4id3gK]hlOL6ʓCj3 N&dכ`Q=TN 3-@2}R=0HӁwVZ&zSC *gM90 F3n|)z|f%-${7<σ`Gfr ›jaC払 g'!~ Ӹw;+Wn'.2v5&(4@ SO&7 mmu)ZwWN "ٙ *1 3fpڰa:; D#Xt)=oiC  Ȥ3 20x$I.\UW]EeeEN i6kp^eϯ[о/3СCzy3cȅ?g3.2gOO?CII K.e݌UGEe9Mlܸ;vPQQi;>1zƿ-&Ć;{oF]ˎW[ܛVyr5y 6[y|¡7ryxP"o/֋:~5M`nV:'RpW~~mB=^T3FTt],vKG۸6|[?*n.0.u?nx 0x%0 w+gἰp+an׌H%`9+~ܾv3abv9 F@=Rw/l֬YÃ\s5r ƍ7`ܹCP IDAT}9;;8kYl}P]]MII x\],XvO @ 8ɰ{{ֲg *[sf/_/s\+uL&Ü9sxhnnF)Ņ^HYYY]c˖- :].yV4N ܩy7-gf^isYQc,{k Cd t&ۨ箝5K@ Ê#ٙ쳧s9twaѢ\pL<)ŋS[k->ZA(-+(TD3mh`l޼Y reg6"sv97\ZPZ` ~}L[]ls; yié\aw^Aޞ݌?'@ @ G:fٲ xQ iQfG%ʓyǗsȳn]ey),lzP"vVO笁hnn^ @ B"EPi37_ǐFgWm;c͑c:R3}K=mlq;(=uu5۶nExn&@ \i84hNxGشifS\+etr*[|mgSrliuf=>R8@ggL&cO @  )..P~ ? vΛӵ{֞6>ì/֞wdȾˈW{(dY^0Y>@ }kD"#@ @ $dš #~Txͯ}ρ5]׿fx滖W>NtDD"5@ @ ʼn?@ @plߛ.isԏS|z='%  n| 7A¿_¿?ߍ-M @ >M L @ pX"^NUUb!L7cO `@ @ %Ә{U9`0L+{vs<{>/^eJv?}<q;P"'G(u#ti [p@ @ ؛dy%H-LmU}/ Ϊ^URYh (}ʪ(Cq&A !o [p@@ Ácʹhmw/?䤟õ~!̝3}/zj ``/ @+/=s3o(=xPo!ѧ<kBaZ8f@=֭TN*>R\035v1{*)+i4DD(:U㥒jK7TD^_孫2} 3CۡN"(T[ĪJh9k'@ Nz>N)ٰ7e?WJMt:g[]ۧ i\_rv+. P0V**NEypѥnEϼؔfΙ2q# (j)#lGz"oohJ=.ϥ,&( 4t?Sw\sV6uQCY\eGi QQCپAw\\5gCi ).EY|z\JB!R-{XXvp/} PFug/1[SOx5\PVsR I{Y"DqymW#k)V00r׸x$ڄ\g| K+3\x&w?g̝r>5 H5=B3ǎe;xj_kt҆A{g7"&6_Y60k*+xr@6e}J m1|;g>v5<9p{?رAY0VOH ͨSzz 0MlsHUu??ɵ(?**! M[!F%zfǃgrڀuskD3tbϱd&&3st*墢f co|1~q!ԟGN5ќLEΰrD>8!vƜgMpl6 Ɏ"Ph8@Z @ 88=u@q9o Lн[;i"mkظoe}pFTEwUU?gH !@0A0FUVklZSiŶҊjoϣZz镪5V(֊b@Q L  $$!!'IBNHe{^k6^D s21 <>;w7~A1x mPWQLL9O%y=02ǠADtPN֜$5e_Rkk(:Z̩Jo.`` L5v4 2bp5.LWWy3<}mkk):z> GDn"Q3`АB;yTlշ7z]Ïo ʟ7ؘS]G*V"B׆ ե ,!x\z0{]SG oc{iO% `1JsOqJw{xl}#m: 3QV4 _@> Pup򤓁V%e}# Ȅ("Byx3wna^/j̀QGyQ%gVCDݶ%Z*0v1{vq^lB*q= qx{z򄋨^T#(|9^DDD.2D!'wujiO7F\:R22n WN< ,"?[|- 1͟e-XLB(okwCepc17 v䐵c=5Cq]}p}{䓡ޔ4 rb_ F$œ0xwyL_éBG0<̞:^:Lیٜz^=WiUDO":(Һ Eڃp)^®Tg-sYDՏ-;ڷQ[?Htlfp>)[y7@_+@-GvGiϩC)|~kӿp:]zV<pR㢂[=7+,{LUX̸vO`,ncfo[ `Ǝ+VǍ~oҿŹޠXK)(p3+ޥiDf~$}~oXܕ{jr3|ZXl@ 5oa x⥓  ~DFdn #N!4Qu-zf0+6+Kl5?j.)q)C-8t 8U~~d`FԯpGˈ󪟞rID S|VΜ K?b ǘ#eVSlnjw>G wa ȐfbCu0aj<('0zolA-櫮ZD`{o㈺q;:Xk?cuv= Ύ;1:ʢYQn`∹L<.+wrecm?g0&řB;q~w'%`/zw|Ƅk~q~`&oL]JNaSm]2Ʉ;6M)1ft>"g= \1 n+^}޶8̄ &-ZDDD`wvC^Vk`U uU fjr,63FXC$o 0fS8~lM/S0, "Lp؝$İqO2_ '^%;`XBIsbf_7'f b $ػqC8p]&_4͗9|RR'Ofb 667} 111hǾ&l=3sl&SFz 3ǎp%Sdb҄X)aO5>S~UelgyUA0$n>cg;̳`w[\~6ZiO/.7v`7}u/ [lC܌> (cSRRzრmrMLq;\@9'j~.=U]oӍݘC2&n&s'<ásh_\gwCC;Y>S] p甝M-Ƞ ֆqO /qc(GF}=-h3y_P9~"}) SkL'|RDDD'X-P/ce9s@6XF* ``x,-؍;aqN"(:*2p(C=8ɡ"OO9]RGG+)ao\Uy{Ǫ jL ftѼ,n&+ 񙻌`yw$Fej|" !osl r00b%I‽s"r]e2=vU [7?9 ͿcP(mT0dFc7_n9b~ʜasvn,gpmUuL@,>8eg?@`؈%h MfBÂ>;(p n3zj+s}&Kq6Lf,Mu:{-᣾EJ+-_Pԉ'ʆ&ɳZN]64jbWUQMj$K0Cc3y pjm6I7aQn%$3м-N_`W'&Ɔ`r5ڶSlw}E(LTTYhf\|6|Ż'tiLtc$$aD\Q:ޢzE1j'iCןI`1q1$Od A32ć_eC"*b69R˴)$\z=!á-Opɡ)DU)dX`R~ȖTeDD}>kuHV } 9ue?&f 22<)7 0fnt9uO| KGޭ#ǰ\ :.uc=V pRSj`5_Ewo'0ˆu GBG/A@Tk&x%creg8G`̦(<͕}՘;+bp%sCrT}aGɀb3λ/ F0403wol*osΫ6;xME"yQ9t7ys7>d`'жpi1C$Q/(B hFO8ZAoZ^u:c9^kʘ)\w\uy(|Ӹa`rvȤo0ml:Βh\M7^ @]v߁%z||Ma71:^Fחuuv3a36xlϩ0o4-Snf)LW?, ɞr3>d,0p \{X:C8,V<5l&X6Τsf,ûx/aXW&y8wgች{=2Z0d1a1N.eHL*7]ߗyd뮿vs~x6ٲP5'Q?go;@ulط|!0t #>#dz6:SUCHiTo_8ju)O%ywX0 pU$h-Ka`z~w F{s*%1b ScEsȁ\ʝ{ӣX-븖_4"C;_lz<ʠN3/ԧ*. 8r^ *mRp IDAT*x7vmm51&"(ӏ a1dpB0f$q˽g8QҷO8+9]c[,}+9] PSUإEz{mNl hu_okX-Q1O,q(ޠ[ރݠ_xFd`h4c2ml~|wL,L8qאܿ$as=G1!r2wqw_7pPgtި9>Ӓ&o*5$vP|"yYKwSJcʼn+9Θ$grѼ,jXw=k9$gw:hvz\kq6Oj|r*oזz[:jb@,r4ٗJX}i/7޳na6SSml=Csѽ&""""rqP P-/YH`\ ރ-"!""""" șj"""""UahHOqwIHO`\ 4D\Gi0lEDDDDD.zMHll[DDDDEDz98XOU)9a`ھ}QVV򈈈|l6׏"""""""fpx<.Wlb`x<`;0"""""""~[DDDDDD`l?P-"""""" EDDDDDD@("""""""~[DDDDDD`l?P-"""""" EDDDDDD@("""""""~[DDDDDD`l?P-"""""" EDDDDDD@("""""""~[DDDDDD`l?P-"""""" EDDDDDD@("""""""~[DDDDDD`l?P-"""""" EDDDDDĎLOg])FZ|җxY,oq3lzl&>j>d6箉L.=>lۜ%,1K\rHov`C|lv斵<7SߍSn%-k1!].?\>vWDDDDDDDz?!efm;O[ٞBVw2|-""""""r}vBTmPrcy};ؾg[qN߄;\DDDDDD{8>W6T6k2y#۶p_HoEOdF d7ŞJmYvS˙$4Fh'1ad? 9NRv'l \<fDh2j%M,!Pe5em'[SV̭} 9SSQq$ LLx[C;_)cam^NaIJ8SSذ?f cciZMDDDDDu gŒ4jun`sS9 hgp1 ^6q]fm(μ<$7?sW!ǛmҼqwhexi[ރ=x4mY`o׹x4\;_4nd=w'JJ7xg/牿dDDDDDD%&p0>v&vΎ|%:2^`Kc sp >sLW)3;_ܝF#'~'}bLo/r#md<, 9)쓬_z#-OEڤ?fjLc_Ƕ#-{֙r[Ѳ|uz:Ͼ{(tt2nZ3n}1[V I:th!`̴4j2{]\yjOީb?8 e2K[.-#΁惷O:'lII"Ob9'WhezUٛkܖXρ d,_zH3+La6jGDDDDDDl,ܲ5{%Y|[J* |vUeMhpc7DVZ71&t&t5@xmO{溶h܁eϐsSfisӟeGHX>ZH8|:v\s]̻*ܭsuyGkۅv,[<ܡIܟ[BO=ךHS6D$V,Sj94v4iP?tQMOlD!.j[fhwVka)yI3uZ\s&ASnj->wo ,MV.e9F;YV&yևH7ؖLA@ c,;$&=5>o!wU1m|LL0N =6~frW/ⵙM]J 4[-`bbb o&_&XZ+syl7p 3MIlHf<2_xe-ͽsO(iS7eJ{~Ͽni-oj:ÛeÜh9Dj錈_7r(@;i+ew:Z\[c~ڹ-;|Qyѵxz2-#ya4 ̻iϱ|>n!i6)췝x=$| OwV\yW䗾,swIp>;ғh:;eΚYMDDDDDb=D&1ŪS3QBh}x )#ZI$~tbyżv󖺴x+o;Wկ*VaߑAu$gyso/oOEl"49e*>lo$b?^=4^fӲ}_e j!}kGXŭN-K?#GtGy ܟ^X^|f1i{ޏ$sßzEDDDDDnL0L~0 s.kz nG%%TTrYCLdPuo//5jk!( < 0 US^VJUٺ **N{EDDDDDbb`VU]9[DDDDDėl#0.ll?P-"""""" EDDDDDD@("""""""~[DDDDDD`l?P-"""""" EDDDDDD@("""""""~[DDDDDD`l?;rg)""""""w~x LEDDDDDDN qP-"""""" EDDDDDD@("""""""~[DDDDDD`l?P-"""""" EDDDDDD@("""""""~[DDDDDD`l?vGaPUUn;NM&SBhh(}9z>.&mEDDDDD<π0 j]'O-QQQA~:t}\Lz[ۊ40 ÿ=؆aPSSCPP0}x< sl6BCC!88@7Ť7HK~Ϝ9CLLL Xw?((R: {>.&mEDDDDDZ{t:{4A>.&mEDDDDDZ u]q1mm+"""""Ҕ8OW#篷HS <]): mm+"""""T555:t'NPQQjILL$88K@">z-6fɡBr3D0\%_ʛ^p=|h-n]W@7(5Q Ӊo/Bmm+"""""T999TTTJ\\\i ػw/999;n u;ȝ?WS/XzTd9 uլud~s=74ー퓮@/W`֢cNҹuֶ""""""Mh}a6kqƍINN{K֕:S^~⍠gϼ_̜_702G@a 6X[-Q/~(7'w? 6򹟒<~sC!Lv[elQmEDDDDD2wG-\7v ;ꣁQr H wqmRY? -NѕQi8N|Ģsѐ_v|8{N +iqg<(4n/h&a^(ىG鏼Cʭ4 LNIF1&]6#zm\k0P\͡orX3KsS,W?u7Qe|KXv6x!yҼIq| Gt]i_UWWG]]]v@@@cޝ=g޽Au*lY3Opʘ+o 9d?7?d\ L"*dr` lwSG8h1Z*%W o>`1fn7MܨI{n=Lj+ĤEq["<6orIA;국HS~&ÅL&Sͷ#99ە~=~Wwp:AhX6 :o =M`8,8[/kb h|%%%}o~u8Aޞi= !Q&>ܸS䥥0\.*sn ݵ^z[~t/7gs5,YGNqxZ?۷a9c-f:c,Kᵬ=K4t>b`>Sd5t:h6g= ǃfaְ][6 Պ㡮gX~PPPјoC=ZVo٪` $jj,ln+_WWX60p:8wti0NLL$''7RYYjpHLLJrvnǃ50Ʉaq:^Ommmg˅b !uݸVo555ܖñwMpQW.&mEDDDDD2 ÿvC#s=L&f7LX,N`=]ֶ"""""" d2H@$LMߓq1mm+"""""Ҕl@AJ ي| )"""""""~[DDDDDD`l?P-"""""" EDDDDDD@("""""""~`Lk5:CQS0"M0L~˰]/ 4kˣ甯[K&J IDAT+]E.6'输Zw %| kw*Ama2I3"""""""m 38${~k w"""""""~U|`q&lEDDDDDD"-=j;[^M"""""""~[DDDDDD`l?P-""""""֞.0N3L\SgTǢED,=OEk`vϨӿu;##%;[5ܒJr.'xo[l{R{(у0\9nZ@, Zg8 ;ɾ MHrlhOMzvlon! *n.ܺ7d;28IZv;sT9߃ݬy3;7J3\5RТ"t5tw֯I@m޿Bdڳ'5!&ҫ|-ړ{Xr%+cL,_Rs-/~̸u-6gf_硙1jN "ÿhF_ɬO7ۖEe,~}nO졒IoW!^ I\?;6SV"zmLi[W2#<߃cSssX'l`vBpUc@@oW{_i=T2k`cmh#+9̆A{b = 7#[9_2.', ^[wϜ- ^yY?c.{/63/CI5vgZCvf<$ŸH+xd pBY3XCko?tO^Ad=h3`9A6m]˒餦%Q% KoS ӟ"k^{>}b)i^KӦkRyR._' !&6Nڽ?9Jl_XyMmyuaU㗬xJw[ YfZLjbv[۸mʔ챷L8:Ȋfg_p浐ϾW}CV\>rRӗ~yl>po3}}^%{ֲ8=/^cmz #fs̾~Ό=FnL ms&(߱%p"}>]X7i$III$ȃK{xF|p?L'U{cqӟz`%?=[,MH塕&lؙOw^W׳AR idybk۾5noăK.M5_{zH&MW=gixq|ϛzEl |)8^Bt('`wTڄQvvj2S4\a\Y  eN:-giLU}y'{OplWJlw; unn9g}#_M_n<|d?Ny$ ѓyn3lt Gl$wt71IrI114%;.8 rppr\Jșʨ>ҥ{Xbg>9V\rֱQM'Y*s6|5dj[pnzۢrA;Ye%,Z@A{yϰbg,]7âm/UKډzAtesf;a`Cwx0[Vt~a4?0!(716 4 c9*e=5.oU{FE)Crw_.T%{][B{fb%zBnrAE':e1E`Z6T|y ti I ɰQqvfZ~'o'J{-/+ЗwO绠3_ jE,H⦅$;D_z?::ͲTFұ08 HX5\os;B=t}ubR1,~ݧ/0+Vehz|/<2bog cPyZMj=4'1ٹ l~Ŧ>ڣ\$KskW%]Qk,`&/n)m7zߔiq-۴ CK2f$ڌ7jitki)(3ɳYvQvPup'%1!=bEiP/N\`zA/3œHyp?O/&%-rivG+fjcIVCb& &>H=UDQ|@S:X OQۓ+g $,12'n.]z]:T>¥ƥ@`8 Ь^ve*P̟bOw-X3_@ѼG?# ;*ak8fJ+F.xZnbsX/}|9JS1CXjoojfq.y5 P0%ǦS6O5U+$~MJt^`-WWb2)<0&͚äP]BẾ4%|@m[ZM'_,|jq9~˿У Wۯ{Kg@ U{ )/UQWY*߮ j (4JזXB;nW͡РKe<' h Q\vo׶Vϒ^^bϦk|=R+o+nR׿[WO@g4:'km:?kV}}^,=F!xz1OE/ަE% ZrV5U,3omtwTt+:}ԍWWi|M _A8xYiݼM: //T{q{y27SKU=i=`ﱫh)S?JIZ[ݺYM^vVv덭J%^*֟ޕ=j,_ֿmobPb|vƵ9n]{@u8p.Pe̊ʷkkQ&r`?SɍQI-kˤy&P:E<8r<7FM:}#ޞR򗭶gۭuP.vUuߖk<]vgDG"B!D+ФrYrs,YfܣGh.k-y; }teƒ߯]X <(V|5{U}7YKiƢ"FpSGW_үscb8QAB:5v',+f {I8T5ضx5iAcZǩ(ǜ{Ö>܉z SNNKN髸x7ü-C.Gv27(S,SΫJH;<̷N!4Uޙm1.}J+UPӋ?B-uUc'̣g4kbpO)[eFfc`f,veL@|o$[~gd췢;+=Z|u';{LwO=]k4 :Gs~oV7M>]WGW^=%l!,1hO,Ϟ@5|kKpchI {GW_Q<6~xڃ} I@(1rԘ -Fe#@!,M*-MVE1 k}v*c`{H?<˧#5Oq]w~!b]W=^H`8IX\%i[~iHŘp8U؞rݼs/0/tb}MEa!ѹmUZw-o)oOAs0;;׏30#&֮5͐N\<ʣ$t>"q)濃]J^;BZ{K̐sӐ5c,=\=Ql=f'|ADq0(l6m}^Yזfh4>zjA"+Oژ9%i( EǢnfEsE`0P(P\X3vx*ՁJuw$ uQg!Ir+6Ś5iΕ+5åa93 \3]+%i{,a-_ީQ |#Ϳ~-]Ѱ;5' _Gi %AXwv1oag>x٥eb+?xkۄ)MwКc0)Pׅc:qU|2|("0hz><2Ody"|Cr\(;ؓqu\=IL^*PtwFY"qшۗ+m < hKS. toa뇿9͠ 3 =@H<ŕ3z3恼R/qKyzuk*Sj8t6쮨S/;60Q$󟑪ݙ̜[A e]YI%dž綯cyy>_{$i>y2sA: ^N(^-~JN7lȥHD2POXLBI(sAbdb"xyf*74;诏.*LeaPhuU^OwfWP+췈C.RNJܐ+x!n>:G6O9XpVB;}prlm r2Ϙͥx]m#{>O|ήR #c} zS\_ұ|{xob.(`Q!W1#|\tn3)t'dYsj|[^-oݳ)俤Z.'gh߄?M.2xky_#P}/Gʯs{g|׷nJNЁ+ Ÿ_kSWf>f䐣/EG j/kV&<E+3nSBɥ2eҰnSu#:;oͬIWC7yɸPc%_FJ6" k벎:v55C}CbfͫKCZrdTkL:7k*䂫W?E:gz3}(U ? E1˔yx@E]b׬tU_z(BݑsާkH'< sE+ ;T`ۏd pf  ?[N*9(Șu_0@ZO3Վng,,s8d0Pd{zP|_V֗rӄV:RחM5-bsEIJI?O·kѦFs`؛V0.9 YYz'~<@VLcU*D'MyUnuJ' ϗuqv(~ZU(;J:jypQ '(]ˤ~ lQe?̂۴@Ւv Ḿ=Qq yo>J|f;gAˑga`]|i8-omb+ÅX51D-~~Px^u(r8o$~C`KI$N*(6O^EZ&Oij(j6dPocRTos%0lĎ 3ːo3^C^zrޛx_tDbpO!ݺ< $3\9͎Ӊ=v zҵ6S h?绳W˕Q|eH ;hmbɠҵqwTDķq#񤆓~b@gBZ+Wuxsy{/hرm~@ucDJ p*Ϩ 5fϰX5<&s"ll?!n N{7\JM~}j> |; 6z4W dgI\<7]֦HAtt%n= αbʛ| x-zsY۳K\3Ӑm1b9oeq ͓FԌoK+eAVU/sSIM^;Ӿ0k#kC.xyyr>#,^.|F:^^?'j&bj|h>Mۼq# < SZHWOpi8j>4Hx{[vTn]g4fdEc8R`n/YĮh_߶ Fe-Jո05/ 4!~Ǚ:ui- _Fc{\8"2z T߿I jԋŭ L8BM΍Xa!C ľ1~VׯLҟi<48Z+9d]Npsso=#~aMهWcDM<l9hJ#yh`zѡ!.OBv&oa<$g cbLQC!SSdzqp5]B!B![!B!` !B!v l!B!d-B!B؁ B!B;B!Ba2B!B!@B!B!8V`_VB!BQSz4dF#v+ {Y]IqE%mfI"ji݉]M\)B!B![!B!` !B!v l!B!d-B!B؁ B!B;B!Ba2B!B!Q\-WVa:é@b`@&wt(B!B:r[;Xo5V%~W<PB!ur;??Fӧζۛ-ZVqwwZQ?"n{^mMm\d5XTNuYq;plTy)CM ܽNXVғ'GQ0=vzM`'1TtŜGC|+> SNNyINl\[@ Trt׎ iŤQ,bƄ3ժy'i3ۘcF艛*^PXYѫ#b]W%^x`;vLuF&M,9H1 k}1̩̈1}YJFx a Grĉ(IKJJiHJ@шbW8*lrF#g$= }l?3C{^ȧ;ܽʱxݳmScqQXHtsz 3ػi2o:Zӑ gX@Ӻ( a &,wkkYY0´>cC P)9Qq4njxϔmG4Vm͛0{io4wT-ZĐdI5EARpʏE1V犲`@P @k{fڮoƹJu`xu=}Թ:J]w,;Cʲ9.֤Ij$'1C_O\3e1%ijvX|S07ټM| ?hɫ`?@u8=; Kٕ_?ʶ?22/(on|sJo;Zh1ItB~1v8DЪX>>C\=GAv'2@@)a'v|׷nJNЁ+ Ÿ_kS9W,[IHܾ @*UIG<Цg>1<Ƌ܃ZL2As,ƃ8%uT G9:,45]pOژ)shdObJ8 ߾ȨĩYgόḮB9MM9s*2><MX$+{c[O VX3Y9VqfiKdl[߄G0.ѓ-ɣ[~230|F4(L[Ch .b~04Nik,[^q؊B}SfDȋ;ZY7KTϕֵ!O񒵇H+dC6MxŵcArFwF!lrJ^OQQթNNNԹ~~l!td<ZuǕIƶq}Э<Ưx5LUgH2s;K|;|I']~JJ<^\hG;''@Ǯm eVvV^ʷgsy|7FeӴmO! v 5y}{|dn\cly*9|tbt[.2M ߓ} NewjȽ 9G]o[}to߅# ڵKersaݦ4Fuv=ՁKiYɇqoq7P2~ګ8\eY2v9 g><ϫ+C9j5wu:BC\k=MHanFƄ%~۪Yai b$ 5 T[+WKPh#nK@q/9TW:Tv6Bt:t:kl[Mɷ+Y ]|C/,[eҾ5`YV%uʀaܑ{W^]1бۇ,*#Ŀ~_hR^߮J77T@ku(s^چD ca!"st37O #d~`αo)JrJ ֲccR,uKk<.['罿>e2Bl 7{'yƶ{,zѽ`)j:GzQk;[}UWA:Bj`@ IDATvwZ2(߶1 n [vW:;r'"{oOąxe@WOY8oQ~@hnLs8{'.UP+Wf_sh ߈_ca89'k YŜ~:ilJ5 ڵ#ԍ36ugP2eqqq$''遠\Irc6f}QU^0G`EH'tC7Y Y9$~IϽH ozs8~%1x[KiB؃Ͻ=[*YGX1y,)jm< 1uz4gH\1D@z3DsrH?ac#. AgpXpO㍩/?4cʼ̞5 Je,NjyHʹhҳ(8|Nf,#t ,](fZO;o-ih0uZ08\"##[]|uFF^^?'j5iD$F3jQ4ۼʁGyiC4xŏt`pK׭C%quΌޑgٽyY&N4QU_l\)WRs,Q_\Υifor"-%bic)x+Z7Η&449ke!~ޤ̶E׀46->sk[;mN@F_z'pr63( qw[li }`,=IOI5{|KygZQxUg+LEyYLiF%bXӦ/YGO_Fc'Yɰ 3'F.dx'/0vb)<>Be QC](Zw(L#%tD"LSP9 +gQ3_*0) [l*+x59>DiJ?fJJLbPPˍ",δ,4TMxGa5ގ :;#U< xz˳v[Lٖ`S(V#PeJT׏l&=HQg$)P\VP 6a7Gv&}KR -MwyDn_IH>?k~Ko`,8f5ڌBUN5!looovJNN:Ive8z4y>`򽥃ʻ~Gӧys;Z^U˴GZU+aTꩠ'BIu#mf:iIP}sl_s7iTfJaJL*gl.9d]Nps[|/ /t9.xvHԔ !h^v$W ^;:!BŔ>jPc:!LfϳHrF0&0B!n;5u<{'.qǹ+_%B!B؛ B!B;B!Ba2B!B!@B!B![!B!` !B!v l!B!d-B!B؁SQQn&]ne !B!5GAv+h4l &×S}Q{I۪YR:Fڴpiwnwr˔)B!B![!B!` !B!v l!B!d-B!B؁ B!B;B!Ba2B!B!Qٲ?<]éՃ yѡ!BQl!(nZ[ty۵B!C`sBgαۋf-qww[e<3|6Mg4MN~G hۍCS [;ln|VӌEET_`QM%2RqtjܽNXVp.!j% 9m7'/j҂SOaZ)=;5r406rd^/(Yϻi[NNN\>]qœzQ&0<%pU\ri*#L؛>0߮:ATyg1K]wxv(WBgW\o?B-uUc'̣g4kbpO)[eFfc SC]O/rıox wf|㫑oaw W z3@SO8w {PYhu&>()4ެnʛ|r^a<ͯ{JBXbОfջY=>!j< Y ,@%ይci/3܃}I@( 7OE5i*8}?BO)l(DiSDC<,z{LQq7-Q3p Ku%]ft%̥Q\e5 uf658<0|˙9{9e~@Ccܔ3h%~# Ĕφ%jF^HI/^D.L²oc5uh3R PbPN7W?W_BC๐ åE X϶s{vcbvMKYq^Wv9{ŌA3sݥK'35S2'8`{fu"v(*^gϬțGTuo"B.6p+DåOlAhk1^<`j{fq,]kAq^JxAGDkw YΘ¢ N蓾`.ezOܣ: ʊEoǔXv(fJ%jb֚YiiUCܶ5;-bNᄌW713r.grnh\o)qq֐ 5) 6L\ͤ^ۨxzlqcy4Mzu=ٺM͛JQn<+-i>?3n(UvÕ#|ά2x&t>#iR[JI ɩ:J&^X{ 1_Ò؉S~j q.FՓK'ўczt1g4B[WD[/}OȑgC_@d;&z=Fxڥ6\&ٔHlc,ܱisxhstd./ղGqFͣ~OXut.!* 465̤hf:okAKHhy~FC|Iv.|~L{M^ q4^P-dzvfI9)'(fq 73;l[}fqju{Γ95^iq'obdt QU^ dT`2ΤTzTL+ՃR z?`F>?K)X@^_6aJhD"M%yz،L#/uPV=:^h(Ѫx]ˏW[*s;u|]C6퀽n?bqv_gwfFf2ۮ m{u a0 go;͆r5Rmn'"_Dl JJtis(6s;h-LD"c[f2&H5[JGq$u;+L;hx;z i:vͩФ͓T=ʌ;w1NDlʗt\JɌ66.2h ?8 aOqLG:#yRc4eWL#3Lk[}( ؞nm ?ls}֤]rC4~o,dM b-L&SW!*!ݞyNQ0p@k|hqRRӉUԜ>fz7oN.x]<)z3u-?h7\NJ `?I~]x5@[~fGHHݑ,?8V;|-&si :7q2'cf6| D7߽ekcH"^9$/ j4wSV(oLge^kck7vJX u)RxLOH/1Rv݊3'lEY+a6Snw7\NH!.ޞӬ_ոʼ}kI xxDh6{\fec2>4yZB+>w{ֲ F8_XRsz" RK^Ԍ#xSO}b!:8!wdfV<3Nxē5d<0>H.VD>pi">w{i JlnQ=9֧n*,{ՐZE- efBD >=&[+>8(-L P8[ρ(sym~عauŽ7ڹwf(W7dڭ$-x: S0 tx|8~.}p@,ƇLސcJ_[9/n1r)Dl7i.a/-b /]ċY? 2Z 8;p:hџ,^A.eZu s Ev~f,?_§+sxq#f2q;>8dn8~Ձ2Cӽߥ /G5a"ηo~A0)bG^5c}rӀSuǻ(>ʍ‡OWgѨ[GmӉ]y w"??bϩ1)_Ӳu#;#-Sf}-)ӺpPӱs[J\/, c(Pxo\²m^mrFk$\(: s*X LiٜF\] Q IDAT\n,{2T|}idݨq.{z-dNx -4ײ]i)o~RA܆۵^wl{ZsL&-R^3}.--9֊[&pVU+m7ǘmdqR[Ǘ(flbo*^Mm%@; Gfxbmg͹FrM&n" 俼Κ,~oĐc*ܷ_/sjݔZ7CWSߪ8ۭTQnJOO[J]j[1W}5sx eFumִQa ^ ˭WqՕ#r%@#p)ʭ+q&#z]9hs۔hõZiYR5NPЪm=PS|BV5JƘpFRRِ͂ǚE:ɤ-Iv)q0͆-)kߝ{Oe< B*tnDJwYxqĶxˈe8f~вuKvrrO/o`W4ouwkqnz+9}'&)ӫl(L_Ov0*40 !6cv1c"L8Ÿwq=+#9CԾl_Qu.){VXWc;W9$vrrBѠ8bwP\+nKL2"%XAWIre` CB!}LU C@3yHY$9#uwg# stB!;Uu{~;˾ܻf%?NN8zܻ~m:6?ߌ90Ơ8;z%[EYa*~}łl=|.*"J??#P?Գ0R[ˌce^6NSݫ%uWOqõ\+b!mɵ\ M>^a,"eU Wn!D=zs`O^S;f!, { A YCv>r׋Y?qQֱLuZ銦ܚzE䠍D iq±`_p.]L²&ض-uf͢TjT tSpCQjy%-aNa6Y7c.3pfwtx>`6Q*h4*,lZx'ǂ\܃Znr}S:uHMM_ZN 0aN үcDa/aGcV=yy:e xq[ ͱLx~$ml Ǫ}56R+X7Hwy'1OHތj7'뗷m~ n)wЪe7݅s+@#`&󚁜t7.ƅ rJ g 9p(ǒ*hc& n\Afr;UDM^2e !=@(bӃ .;{O?;z2}Kkem52s0 T턨j7z05VB?lOrl`➗tBlʯDoeJ@|1rs/thw nI!vUak&9 v~~~899UXOI[dz~awbGr't#Yث/'b垁y d%I ZߴOs'SZ_e8~dĕ9:ar.rݔs^Gw0YS^o9gŲ3"}=OЫ4Rxy2Iysl*&۵<}Y'v44n@FMi&bvC ''TNISz8d8񈿷rƋɨ]Fzj7Aw*:&Mܮd݀ ftY:}riQTI!' "ϐZ{Bؙ9)~!3 h w!VƆm^J.#S]İE<n(fSQ\JvA@uvtL&mNQ(89U|\Zb*:*FP1^~^H&M8СR #QL/G%pEmAr>m>%׼;c;A^q/cvDeazs8P?X&64i\Y\phW4K+9OИNL>T F$#v/Rݘ>-OL-Jر_fD XjME|Т1`6bC|CpȦφrU/8vRC5!5~JV&vUk4@#Z]^pt k6@;<`R$ Yr j*-Lofvy͇fKզ:ݛfuhj{lYBb_v?A#ٮq`5Y2!"kG f!l_Βťɡj9۪gYe%B؇ x"ǙuK(=r+g3NH`6Xɢ}uȤ+4K xvNeٶL`n ^TF,m@^A]|ʄO>88ÿFq KP5WҦc?2XJ z=28{Za]g ЌtWՆ ?HMMMvY%! 8gjÒpV`2)ط%VM#3Ll'DUݼ#~28o?2& n 't0c[A)tI+?uVw{hhuj ̈́-LE~ϢsAN#ֲ6v'juW^6jOǨaZARc;#gxBVC)؉O#.$nx(b-@'1mΑ3xt㢏Ao{Xi02i+Ɛ *3zϳwj8o ^2.lc{ٯ(qrEam./ޚSu(ƏWWÕrui!n*2^g2v0"5#kDviB-pV8LRj* :,S=_f;!Z]'h7 ڽ%:ԡC& "xcfpVET0&#([oR/\ ))x̫7NJJd-bE=8a+P9, ~lwgrkYYX'/m[\jNY'u6 Ԋث fl.E\L'=-Xީ,G& ?%dh +V[l]jj#Yx*m'R m uί|RȲEL§Ф}k[?r3ފ SCI g902~.;U##YQ;7pάnW(9^ԾY14cg䣂BWKȰD1FMqqeySxj,QД n-ׯEQ)16bP/Q׭?7>c@`|(N~0?o/`\cxٓB{NŎI.5[СCddd닷w vRR::wl[9txT%l$=;fۢ'*Wry>Ų8z&.TEH??y|t3h](\rϺxmk__ ҍxh\-^|aev,S^*HK=͵JJlLuHMHY~swq*}˻D_x)ƜK>7v1eFYZY?ET;(ӹ&pv+6@Ơ=wܜ>TOY^t7zո)K+s4 qTf{;,c`7k֌ӧOs222ʬAi֬YtV Ol[K.Wrc fR4,_9hs۔h|OJ*-cӜ%Z%U#=q ![ϑPfcD턨jjJfBT5eyR醻qAe$ͥ q7rHIiݺ\;99b'wff7o욳?B6SVrZQ%?}4MR4l(L_0*l3Oq&nǟ/f)ĝ cPi<+Ih4h4SWj_~/R/CD   _cJ#iUZ n/9:!B!9{MžgaL13a!B!5]B!B!I-B!B؁$B!B!H-B!B؁$B!B!H-B!B؁$B!B!H-B!B؁$B!B!(- nƤ|mB!BҥFeXp[oE_Vo)q]wتZ}"52#ȸRާLB!B!@l!B!$B!B!@l!B!$B!B!@l!B!$B!B!@l!B!,6|pJѪB!->w]Gv-k#9pCB!+\sdgYӃz o\]]pe3y~<VBKY,!:1hRӪS2ʋޱβ'~b̒ ''y6mz86? 98Q苳7[5^sǣ\JƵfCmN&Ϝuiץ NNER : N}3cq=ϺҎnTt?Z1^1w9׈YJ> d0еCwթ_f׮pI[.;aٲ%4~|T'=K߿*3(ʵDv^-[ zpBE_1cW hWGMz^hm {eiN(3G$Jj6@~D|'C׳gqхc VC|2ltж' <ϺFP=m6 'csd;ʔφ%? DxY3E'c9$x qp.Pxg3[iBؗtQyzs?9(YWւ/étZ0`"~:7>aNc6xf:`=Lqtx>`6Q*5#>'[GcG%.X;-5zuꓖV%1$_ZmˈPӱ" qu3#r&V2CR}تg2.[½bVgmh>FhH\zG2EqZ9ww=?sf̪ϸ bmfB`;wo#k_Yl7}l'o~_Rh`+3dnƐi )93Z74RGg 9ɿp(>_0kc!;1xX ɧ?H/6GbsA F,)2ɦDe܀tVcUL[SG#t sB6.¨yc %$[WFƛMLvǪsYz^'Uy)Qv _! SULhky6 }Gcww4jRu;t[A^Q!a2Lۜ.P(prKn~\f,)FPI/5ECBzqL6!!.b.?1{"A^'W0졺ʜ<ؗ=J_55{=PgH]0;cY4GW)ln ϓ=Ә>ɳJL-Jر_Xk;8X IDAT=jҴ'W=}к{0NSJ؂V75R]Emk!S$�gt^ZIUl+s}J:+ԋ4il75/ )CntܘzHu$0RGv qyK2\+ uohB@k̩6fѾ%FXnRUU <ăF.<mp<87J#ȯ*MEjӷE5"6blN.Mg͌مͻXƓ';!(3M&~mܟDGVvUi@Zټm? GwmY K Y-H92/TZ fމlf7G|hM8[mШCK\ܽiVGk:W'}cSTk1OWkYh)# p+<㻎]z61˹ w6b[XgT- xV˴};WKr۬g9Ye%B؇RQqf.=aXD;VFkh.[B`+  E vU= ++ N*<}8/<^s<kygwC a^67>;6}"ʣ|kU0^ɘ=Yɑjl>eOt }yfaȟxwtTY@a9*=ku]5w+6 *.JB 9ojAXDT'k՘ @GyEZ݀ao=ǂZ֐A$ [E a7ۂ.+Att4 )E1 52yK \;y|'㷿O*x-Bit 6,uݗCہafo%9J^^~e&eر-W3QzE^#8z&.d2f¥_Q|[vǒ{wb1//鸔Wml\^tN2}Cu::'H^mM$$Ȣ(o><{%l8 / 6n[|%\d_5iק!P<>+,]x_`Q|4i)Dr<٥!hqRRӉUԜݞAi)1`օBTh,;:С g5|1 Hcx%,}(9813>K: fZت+Ľ!W=Ωƌ!bͤY[?懝 FPǑ,pxg҂4o/O1md" >Xj@,ƇL/2̜25e2Z^$L_1.ŏNS8Q>t5v) vAMwsʴt I\kg@` K;;̞Ϸs*vL״_n#ȥoKx`_KJ7\=t\~EW-ˬ'ØJ7nŪ= J[ gZ%8?g#ygڷt6aWW%[^VgB!BakB!B{[!B!IB!B;[!B!IB!B;[!B!IB!B;[!B!IB!B;P[ :In} !B!UKvblފg+&k._ܻdlU-پvxd܉]U\)B!B!H-B!B؁$By\T003츠hThVXiZӾj_J3[LsI*4+w4KC--Q'Afd2mpPի9}9sB!6 B!Ba` !B!6 B!Ba` !B!6 B!Ba@;ɍ zq?Qw8)]]iԷ/_cPB!6tp&FKOܞB!w`gggj|2iiixzzҸqcqvvZfHȌm:CTP(U{&uUlԞ$ǩA@@QV|2I>[a,ϔG 8T k0*bL$A3:viG-;QΙG95x9yˊ%Aws8:::6WAQe($.\ 99;ҠAu^JTT&[eY vbˈm 1 _q\_UYbU.,\咠ӑݸ5^8vʟBbBV'y) M׳^9E#O/: (y*c<+~ZԳFxNT;K0kM&X.sلN2?6rrm(7_լ wE*%@!`GGGӵkW5PXa許2kWMJ5Fe2QF3L6d& 260t W]!`a1^ܷt2xܵSᤴPX~emE}/d$8o, < ?NK~Ԏ` O1=Eޟ\m`ȸ2/2HUN|wΎf B s3}NɁ wxI9Zz/y{Le]Vf0^ː94t+s#v3l//t>'n-9 !Dg;%%@ HII]\̫5S=' -nOڰVOwmܓרqo)5/h4rG&20a.q=Uɽ_s{ &\ <:vQ ~;mýkъ{uRv"84/ʙҟͿG5V=Q9\ˍڅ,Gϖ%8o5'h2*Cֽ^ӛϠ9Kɐl⅟o?o4v>Ei㕝:f)7^xF=o<uS/?t}}'lWc_r4zm9pjt.M:dqiBNu 5,Gpr.EͷKWw60]<'NڙhC-dF8ԅZXgӢ6~|b@;k %q 86"p=FeH/UMBQ\;77\nܸapi'V0iw~h=sqA3wnދ?E(Ft//bB Fx Th4bKB1@,!dWV|I}|3b4`c\&(wCKӖ%VCx, v!Qy et`8nN+@')Z7'luxԾNbϓP=[=<^[*&4ip Ʉ z$gGphҕ(W }__/$wHRzxS0{k gͻ2Z1ͧ:@e d[0c_䣽W츥cBT_v{``0X]B@M*JZӢpVDdR-/f,$mCS^=LP7^o!b3D` aӺ̊95~}jV+PYjhJ"VMcu`<0d[ssE.1w{M^ g?OÇ~+nu ímNWl|6O<OO~KU^+j  0(]!8!>c X,G,uNԙ>ǚXѡͷ eV9}BT9 !Dg[PP(LqUظ;[Ŝ7_Os16#FH`6lY΢ Ƞϵ^ h*x"3y7pꨆ NlE(O+kߌgu s<\66x,叙\$l1ՃuE_S[Jh *~j%5\sr{8A&,鹮h;pgpk ~hMe#-E'aRhͶ6왬u/h|\y.95? gp,\j,L`хp 0p\Ϲ?&t|?"Nت'80)oYIcVT"qf]ȡ^fGy_]*l0/#:a[t`_m2YY hL%2Od`wo4rӉKʔOƒu>l@?~H/ }ϥiMQb#\47xbѴJjr*E1HII: H%i}fYC8&Ǣjj$h-R!O ѣ=:;ir2w 1%߭`1ޛ+j9 !DgK$&&Rvm ;\.ⓞ;0m18~xa|B?6k+ FYv=Rb\=%H#}$=̳[V3nvV -\H#-5XK), +hB&@ NZeo6A ۾qtO1ihyZ=ﶨse|H"w16M&nbXwkh~p@+ /)ڹ2WgL`A_ȕƳ3G$sdނMJ>=ǰtB*&,2IRthO`ZhpWVH=e{x\\ fo$≯/egfftgo[o1P!?E^^ɖS#ke9|0m1NLLDA.]lb2ff0 Oij eg,[@yJoz,ycfDgKgm@%Sc2iFpqMӕKYX}sI3q*oOۻZܴ5* Nut95C؛7Y+߶>J}wzth4(Nw²J+e#(3q-%@a9Nfdv˖-"22t˙lٲQiy*I..,e_"s̱޶j\aGJ51P!-$؞tЁvY}εNNN6xYWw˻[P^+Ď^ֺ^`Riyܥc<־-쒢}E۴EYEkFqFw"}LTFU {'$h44=V˹}_ޗ "QUZ8Ln#tq4CB!"b,Wo_C; !B!-V#%B!Bؚ$B!B! H-B!B؀$B!B! H-B!B؀$B!B! H-B!B؀$B!B! H-B!B؀"//ϤP(l`]6kK!B!*]Y[& GVD: 9{]/\ҷ_Q_ĝFw;{۔)B!B! H-B!B؀$B!B! H-B!B؀$B!B! H-B!B؀$B!B! H-B!B؀Nƃ߳dN).* ɨB!w†^8ȝ22d=r'Nw(B!Bq2M6q[Aƍ˿η8B )[xg!1UP(ui)ȧzPˀVm+⫊+d͞VLyyLpp޻g͞nӾATd20qq.&Ѡ1]Z4~'J_29{_)/2ETҼBM̉?8 k{_6q ▒c&ehz0ߑ | <}PQoB%)/%B4Yt؃F |-։z3QMoqe'=2V=?Lvzww==r@D֗ZNE(n#s|.Fl{MaQvY5YOߢĝ. vlE(,MlkWYZeR5N&e4?(>KOo~ ofЩxT"ve( IDAT8)-:{Y_}*3d$KK7/Z_^WЯ"v ΗXx3;sr$ތXFФL=« vB51F{R6q-YՃo:矡Aa?r ڿ;ovQ𼹬K2(J٩Ʉ0U (=LKZfr]Q_RSR$˙y)19j \}q60#|.r@v~w=4ܾ0 YsG\|\8߼R!'OWb*F]Y˘吝 wbσX\Py1+: ʿ3/Oqi$ƭX'. eŰ6 ddIJ8c cV.ͶcxvoȺr/ߙwxW٧Tb0#@&x}ׇ0/hguʍ5U+Μ^-Q^}PM 9哖q}=bSX:7im'JLvI +Cu'x6l)Ly$+Ⳁh]7Oo?؋;/kcz473{;{r~b%JH\K;mhɻX ;7I $]A<-+qk-ѕa[Apq=+%$[Ŷ }F^y3O{ۢ=9'p8?ɝi ܸgW.% |uy &vtodqL;~xco{7&Qe,f`w= -w*wJzud t8}O]D ӣ܈zt=_ ur!(kIojv)Uҧչ;N 1z4qO@!}P؁] ˲iɍfN ^xIyOY㞃M.L6C+:{̓ZP gc1xׯژc!`XHLzNg&-c O‘L XHf_2m Cy(b̤J:Ԫ]- v{LWnn.yyyV`( f0ВwGǽJiGTL紗#>"&LF.sy[@}b9O"X )Yp5J$OJ1~ z('X+k+xe@ =ɳ?ݫh{y^H/fqSv m*^u0Uo:eh&`.Wzaւw}&4n 6;X|c\/V)^}n Zƈ𿋍;8'n'~F&Mm9קG]Ӑ0̄ &*hL"}VPھń,H27û\?;ͬ-)`gm4'7oZ6pn/zV-tYqAۃ9a=@'cw}3^{'ǚ0lֻ0Nw,ֳXKg/nK0tAqA-}P؁=(]\-<7Tf#6d /Q^tl ;`([af]NsK ͻMJBp)5]u˨+uvK  n \#o$v7 alI`崕ZCrN: 0[/+z b5|tVD#Tr8KSWsIQ;7XPxgѕo!&S{2d7rsh_?2~ZZ= kW :9j B3T8VgegRM6ɮ"gV a щd NT?c[XwMiZ,0feqw1=^ rfgAq1P؃>5 K6/c~Y@(I3\rlm˭OT16vh)gF늍d WO>b X&>_NSu(F 2hS/st]nt|8h.H@"^޲MqڨH Rݶs l9~ӴhcDTl&q}D1l$?^r1a+֭Ue:v N3uN&h9||Sy}cƐA|nd ^g}\\=Ξ7ֈaKxћ!ů(.L,{cI9v~jRƺnͻ? ;-)9s-wA Q fZьY/v121b1\,Xŗ[Nr=%C?0a lEN>(i>,]ABJ12eࡦI~:sYz& gl->LPzEϳD է0)7קr%tM[dω<7':BZCF6`өħa,eÝx׮gqWpΥ,y)4l1ymq-I沺ǰ8^oTwzh RlI䑫 R$+$HpdZ<3jƲ0&3VIS_eo4ħ1e{SVOC} Oe:zDsC?zE- edbX>$7•y+|#p# l]k`F7_o[7$cboW=C?!'ygA2&JEMEIɜ犕j V^\㝟`٬L&̙ww5מiMJ3 ;c__Vsgsh sխJ'cqy*ۨ>' Ƒ]Kd8to\s=WARgX>=׳gc،̯xәl-x ͎`td yttD Q@gThSSu"#;]Ok64`_M'J{g5u)^?V˨#pxJ<ٺ²e^(^mZۖ9c>)EZhهxg~SI7Ŷ[VʬkL%Ʊg׷_ղu[㥂Ԕ(ނ~rX, ^*EqAYwVwbUX)+k$KQJYM1PCΛ d䂣ı|,(+Xyz%dSgkN_LY"?_[]|=%b0fV,BWnVX]q{;{]Y{&>#-s>#a; }߲rPau ϢHϊ['S&**3^6rV6Z7%Qz\lMr&`9{U%U#-rb 8okj.jcjJ\\L>(I Wke9J7D;k{ ^ Tfzf]J\nR^]ف(}{zС=mڵkm~'6w%W=hX>Ϙe'ep(C.)VE۴EYEkz=r(BIQ3ž {yRoL~&A%vo. k\d#u;N8W݌ zL&>`u$۞\T <݇;!BRT>Y\(UVK .pb*EDb4Cky}0 @郢1PnrOՆ<0|?Ea… $''ӱcG4h`իWd2p#,+a7\NClQQ1PFrΰ8ʜ` QS%k׮Vk,""¦ v2ʬ]a3)ՀD`2 (>Kf^)᡽ UX&/;±xܵSd$ϱ9~`2y接SOHw/+ygrdKT9woFȫ%݅_X>v'GPy;)7`~Y#f٘_qFS/ֿ>6nNd] 2/ҁC0QM,rҲHN&9:lcv5ÜHL-gl2IN&#)c-*O+jo_ή;?Pwc?K-xV̧ w%א)ڣuw_u&j,9 {I=ܹ3;rgg+GY\X6^؆z؝L[ d'5+UB؆]F +Cu'60bC92g[eغ71f}9wsL,L\K r723%\ڤN#Kw@2bV϶/=j˵x]Ax@ylY¸Z\sȍ&?d5 Vk+^9 Ͻ;KOcGS?ϝi ܸgW.5_h߆-mLJ]K_ wF0#&r :fb)N:iCOk4jD$@a)G3b2ɬ֕Q{xif( 1c"Ǒ2up-b-C~kz,l^+3iYs6*!Ϭ8,!q{crss˳:DPP5~|2j))/ -$fwcŜ<O;ةHkQo IX|'UF<译t }NOLr2ն#LjU7Tzfc\&ڕ7Mࡥi˒q h5?yB>U)PFwOQ>_L"7WG/!-Oui^Ǔ8O\<$_N:I#$iK[Cia\ې]v~i*Ows)~hO#?P)=HpFLz"7JGXV81?@?4^b/+qfKAlqK1PJ}_%7O f5nDV^4TCA1?O^E(ބvz$e‹<ڕ?.XbxBT;vK [RY,5- BZAȤZ_ZYb90E'5aPk?uC6"6 J~!8G@D'Fn`<1~vIQ>5x=/Lr ДvEvュ@]xaȂW+"QȤ/2h$/ۻ\ üSj-қb vq֖i@ӎmpre\lgu:и iY`ҵŠ23퀪0.] *1FR܈;CBOd|&45׿t+@WGͳ nE(O+kߌgu s<\66x,叙\7rsh_?2~ZZ= kW :9j B3T8VgegRM6ɮ/}9 8:'k37{'yA!l9 F*)=3w9p!=D׿-#]'@a9׀dQp^jY} gw[n=*5Ė8(涖KqL{bΥr]7GemB',+RO_~Еx6?o)I_&^Etj,aV 7뇷0?_~-v!⫰lxMn Ё~ŧQRv `D&?tNCn:q [X2Nn:aΟ*qF^ H)21'q8 hJ];@))ع /%IDAT; xP DM)gVEՒ3ݶjDz+ި<ǍgHIOɼ]5=4:+P85z< 0f'̦X}6*P8G^s1p`vbl]Q_'&&a+VMIXO`]s{>5~xq#'T5Ю\JDcd`Ou\ǜCuMF@&\(J= n.k߶.`G9 o4 Hf5ޚ-R>=ǰtB*&,2)׮qHydZhpWVH=+eV%nw)iOJT7m4_6tɋ1P؃o('0bd06pRtA?~2M|q9Aһz\8 HJ|373/1-N!lEgTZu>Lzz:x{{[LjxxxХKغ tS*JwWGF㊲H^s';aY2nӨ']GT%@a;o֣G jec.`\K9A~-\RE+d2ge˖DEEIzz=yח-[V] J7<t|.n1KCF-L+\=BpuZ7%QӹٚEB!bդ(Z,iik0y[SqUo)xxHv"@aJ5W׊Pt+;L*77$؞tЁvY}εNNN6xYWʻ"VP^+g^ֺ^`RqioEK+h[me))gsf{Qᝇ;J>&**g=I`f3MZ1w/w$h44qUv2up_D$ؠ1`2n#raX`CB!(Eә^ΉۗUS\=3}; !Bۊ;A|LB!Bak` !B!6 B!Ba` !B!6 B!Ba` !B!6 B!Ba` !B!6 B!Bad5 Gl pe֮*@D~(Jd&q5FN$A|qJw>e>Nsc/k+oTeFXdi᳹ciTSy#+ u^+/{fgNě:j)M`ǠswxI=5Zxuu8CڹacP"F<|/{s= G iqsk{Ed2rfÖ|kxKwJLӎ'f̭ Gn>y)y`+֛,+.:Qʘi6WhN${m=?iU]՝';~ݸ{G)>P|%n<7 2&~ qalgg~&1t Ov NF㏽̝ERgL]yOcψ]]f> J~*Wekw$,6CaۼI0[1'"{xكӇQPgԱs>W&ikZDc+Z>ia_>>2 ˟~ k~9V ĭxN& {,>O\ ͫMV1yƟnmM,>C_/GGi ob̒dD'| G!ʱtj~`o,a4 kD%>TR&/~-+30W9%.rTr] {sn=HHg/y; FFqs0 |7=dz1]}JNjX޻&7(2elL`8?>3Twct2),EU̚$2uϕGH\C~G2ovFlN}β0k|6p8p8Vs1:-`ո z-bFA `okS}S4CGرo[:$_ׁ[xm,~8ڤvo Ć@tt7 &.W3wP9l!1>2wŁcT5M{o{{Z~y}$I ۿ=SpFu}新&D7 8rMA HW_~ά@@(աVp"ǿ"+S{KK"U-K%e\P|h -64jov8lfe E!G:w;[\Ì0oq45Ċ6Wz+s> 1~eYld%4.ΟtMKKW/ dպe߶ЉZ6 [z8Z26k˥Kc´]|t(=s[(Y;s+;6{2<.4z<#rYm;#1({dq%yMťЮd<2U۲奱H |Tτj߂ʟ9_E28 U+'GXmNU0 i:rKx]ȀFt ˶eQI_l4U'ב@񅂌4 <(^W_&1l `4~9SsjglxN#yC1z Bj_GW}ALM2e, ԪmG_ӲSH:[e긒|֏ґ8LD'Jrrv<lΥloL%(sTQlSi$Yb]gsӘ۹5&Zyrݝh=cYYtkt]S[ EEE.oNޝu4Ͼ=* : + ϧx1إJ;ٖ3,{!6ʽϯܒeK*_^ޚ8~2&ʽ?ЙK-s@\V@g2te"N']d9!00dzpV>m/ߞ:3ȲQ_f{wVun Ai C 1Cƅv.WNB)*OU#Uر9XK=KP|ꮛ5X?t.s@fd9<\X~nk\.ߌ`GhƉždeeW'86 Ek1`&C<%V㶳o7>[oKh*r؁ r@`cS1/fo$Vs 6{㜯0zdfVX5Zk@,(rk&ϐ@kJn]ζ0977Ss[[Zi=~~~L^_I^U~wۑm`|KiU>0b0F!)A]7͍gL6fTiPX_7Q]C{ >n6ZunxzG&<> X,X,gm0ycFzL{A=(>3r;=dȠN>_7EDDD2[=EgQx^ cflѾnHk]%"""""""^[DDDDDD `xl/P-""""""^Yv"""""""᪞j`f{Zsa6X_+ 1QjEDDDDDD~:dd`3c"m): ]s_9Y|o;I㠖^߄e0Zi3Sǰ9Zȵ0,Xk$cWv\`H\.^%"""""" EDDDDDD@("""""""^[DDDDDD `xl/P-"""""" EDDDDDD@("""""""^[DDDDDD `xl/3 '|`0V!"""""""5j?`%-v\.H^/[%""""""RC| >1N^.IENDB`flower-0.8.3/docs/screenshots/limits.png0000644000076500000240000021643612324702473020415 0ustar mherstaff00000000000000PNG  IHDR>G@ZiCCPICC ProfileXY 8ן˵]ى=KH%ZH"J!k"$%d)JByy̙3gΜwUK RL \\p 0yOT% 6;,L~Q>@ Cp- ̦<ԈM| ,DAl_a{[<vOG&S "tD=XpߠpU:>d_=8$'+Le"BqOs%,4|H @lb}@@?sozSaF~mOE8#!{,6;6fFO/j|oK_?#c#^PC4LޱN#Sւn++T[sZ^ ޟbb/Emwk.j/(F*dxLREn42@۴D,~ULP` K`~=i}TßL-9f/>|?A柵 J#]'~Ko*i?b1k5Jn:Q-G&T=@5Pݨ_f! ekȌ~ zW(/o* AഥuпIF7")?C6@k#vFlfCsY6h]dT῎-[l%|@p/{"(AT}0PRPTgW{nL؞ F6A+4AB^:f|)1h~NJ@h=` v\nĺ x/H S 8 A1(W P@ ]<#`L0p"A?$ ICJ:C yAP8 %@P:.Au6=h-(fya1XVa H8NOp|[.9<(EQ(u!GQPPiTՈj5ƢIh,fhG:}>.Gסosu Ãhb1.^L*&SiG w,ˆǪ! f`ck}wEljilpd]5qxZbnE^>^S<6Y>6>=`l{|$~ lfy/  9 %  Յ[DEDDD^҈]s;"V/6%!n./^%>*AЕ(x&T +=qDIՓNaO,bʊzwt]@vZ3r%>;kې'w*o\5< ¢w0pbKĊr1JJ:/_(*M/]+ //+PVQQSy ~ՆjK5l5k{]aqZڂ[[iuP]\\}`xkC[oݑS$ؔ{{)6Gܟm hy:=;L::;j?lzc]]u*ݷ<գSTiCFoc{-F̟u=~788<>4>;<"ח1/WFbFr^*z-f\u7oߎy7>D⇜IɊ)iޏ>ND̬̦~bTYs/s.s_)_7esΗ-l[h]]|=R?v.;/O]ŭI5[nmlD)PToeH wA!\|׶os K|?.GsnllE`; 2BC4 O U+7c,1c8Uyw av@daRg#QYΰ6Mp0ss3'#pIW.(cyRE2dO%ɇ*)nS")M*DJL95}FO1ffyNͮ93%1.p>OSxdkiIr=,VU_\]RqmRݭ %; 7ML"ת&g;:[V=~mDG`/Og?3ƒC*/4_ꍘZ y<^{:8C>̊Eq eߛ~|^Q[4-(7pBi4ՈV@WcT0X.L$Ӌ23p łaŲ1ssqps;yXnf@".ыb?%nIKJ I/KJg5(+)vREGeF'< c9|-Sږ?tJtt7)JFƪK&qfZf+wwгV)f6Dg;a>G̝y?4rA>q}QOO/u2Ż)h@ Ltg=DHGrRpŨԧэ1{c#q&@ 4Sk19jq6#qxቛ';N eNd}9zf=g=p5?P!(~ɪRSpEFbo٪z[Mе njߊ\?tQNHӹ-o1kl}P㸮{+V잵 zsXzo:]χ?͂Ug(AL%h9z@z d$5>-b@sh ua_ěH&GGZNC7?b1VDL#f ^~)bpx_EӸ!g# х8JM?ɰ̘,\G2&=g dYebb{ɾ‘˩9ȳ{υ_+/%'.l*=&f#&>"Q(-%"A\&XVF 4JnWQUT]W{DW5"甞.g27mzyݎVSl>;m8\\vI+{L>Gw |b=B<҉r8U؎x}ԄKٓ2S=Zf>|RCYم9w\и]YQQSuj5 cu 4}l&Wt~{l}gp y0RntķY/~W<.S^Zli|uZ=@$h;eBH–p4\?Bi{e=c0uE*6{A,^DJs Mȧe=NBw(MldHdglac&2ד.yRP{ޢѨyK+:eze5wL0'౐ԷMyޮܾ֡q+.Cw9HO#w

,H۫&oqdjЌlЧϾ_~ }[rZa̟kˁ˽+*+y+kޫ-kkֵϬm((e3@WbXX)X+FQu0P}tF{eЄ pHYs   IDATxy`Uյ?͜002PQQ'j[Zh}>k}jm}9*Z#"(`(  w<9}OnBVs/ Cc)hjjc7R_, T׳үMʔ5z7z=?m58=R#3m~Ho7 ÿo7 ?JJ޽{'!BX6RGT6U_RNDDte_UR'H zuH?^IJ mfx|~o7 ÿo76c3g`ڵK Jׯ "ꕓBYWL-e#9[# yEB\?lV,: 0 ÿo7 ÿo]]f"{[E3UUUlFj{ΖG*W-Dozm5d3z6b éwmHz=;Ii7˵lo7(Co7g5OD"B!~mm-sN-7|zAơG?t"ЁDƅ%z5J$n(]ϡď__:z~d+_׫=]2tOH*ʸulz0 ÿo7 /;"ر##0F,z"''h4J4 1hР [o;57]QB/H'D>y!L7G!$?$eJ>i:&=ֳzy@ 诓N]-d댺nL~ÿo7 ÿo7gݺuňbL2M6F>|x3̺R7 F'7|׍c/y*[бt:_dd2%;_8h~^Gÿo7 ÿo2@nnnVKJJX~=H:p8Lee%7ofРA[7oVWNM8DO6#.Cm T78$}*(WtSXV?mH$صk555DVeD= ~>Jۙ{ZwգrOL%i0$ӽ{wzEnnIumq$v'lLLMlW[bÿo7 _fz! +L8N8O'߰-l&L&[ul$e Nָܖ֬Y9ꨣ(,,l4#F7J*͛7eƎK(R>q3#T8nOr&fNz F ÿo7illNcܹݛB֯_ }z@D/T'U2XSúEoerlقzȀf'SܣGV#YE]n6X ٷ}3eѵ@ː1(* *F9V/el۹ ׻sѓZ֍@ 5&=z#5,_I&QQQ9מ бܶvBWVtT'/_Pҟe\ضm.cƌ!///#]{_?w5xȧvO"dK+u',]_*듡^^zE[o7 y摟͛߿?HlSO0ng#7XŎ5kX裬{u.]qՋE4ɺwe_UݻSңGu6Wcnfܠ v/$,aONRڭk,(޸6lY bXe#zQ֧=pTAYaݺhߐt~Y?~w+(mR5?v׳y6uf~D:?r:o wii)yy[ݻg'ѷ}_iկn}NRu6)u,cY7q8u=z];26fWÿo7 7nHAA]v%''X,F4Ox(CKABTF-ц{pprn>Lz6ЉAA&|vJIyylcum䔞X$jxc(RNIr|"5xٰ=W_1g ;#ݸW׾jMYi7zt- 9Lzјl[rVQG j@Ѷ[dqhvʲR,?4X9}5lݺHP(1Jl}} 2$jVﯗR1Yשze NM|zdO/`Y ÿo7+_&O5{)@ g^LrȡT XQ ҫ ³,c;K3 oeؼ>=.CBnbva\x6>WI=F |ѻYlj+QbDB90IWl9ĩ-F 9pguVDJh"^~eG>lN=4,Ժgc9r}v= [J<7(),[X(GDʵ,KĈ̛7޽{ dZv})O6d:k{o7 [)oSRXX!mvl1?/`ϣg"IjZ()&8QRL22/+{UJevjF) B PX!JZ}KLzY?Vu ÿo7;_`mR*U++xy9!! A~>F  gYXHz H&)qr*+&\\ 9[J *7PԷ[aJn^Q#!7R$Ң y3ֹ,bt֍bɄAEFo1C2aϾ`aÆ1l0z@)yh>+ B0 Kf+,iŅyN$:9fUJ7lYs[fh.<ۇwUԶn8ΪgJ?e(..[nٳ={z_)E^^8ñ~T^^cgZ-mphOND$A}}ձ'&wEEk>GtHog}B'Y?/ _&h)C등Rҵ5K ÿo7;={2_--K{[L d2IQGQg/?]q@-W) t.]OBv[Fp#V*I=9v%ꕳm]`7& R8\L~0T3uz$vMϒ D7HJlR]]͸q<,68I>۲,ƍ3<[oE >#Fd8R.` ո8[Sۻ̘B ӞrJ߱I>`[XZ:YN6[Nю>Ri͓Tw}{Wq[pelq=a+SY gǏeIO:ԹxUbD"9(eGYFM8ʎ_)U+޽{F/,,Bc>XJrrrؿ?%%%"uD_^}De rM-h䑲?:uMWGD"Q7ĭGM_:_RL9 9p0 ÿo<q/JWNV7LQ^n)*+еH쯁`v7P>vzizmիcl[9Ϥʒ 5h@ 6 і:?UlW-;Ur-Vtͣ#P!h)P9BLl\eǯYB1`/qEI-*fI +6oP(cY޳~4~>}bP8jˎerѣXj5#;aBVd^,}w)XH$|3\@LD?jOD={dڵdDs!O^2Pv2Ro'^'A^W}?ľz./$ BDIg7 ÿyПHn@|cVV<{e]Q؅$t;1Sqɤ*+Q(@ρ_%ꭻiL$MܶiL$Ye7TuW!i(U 4hJX@*HPTvSJOUiEնmo2L&ٵk3)lj# wj';"J٠ .le߅Ǐg@U)).dOx_}w1rp-,5bJJg{5(vzf;^z~o(9؞p;HG82L8cYB~q %%%ҫ`/(..sg>fع还gh@]f ޻{n}c4gYD x(D3z* _9h +kkg5vVqVb& LIAY1pz`!mיq8R]|,]})'GüQS[p /too²}T-O f>Yߺg/ WӦ0i](5}/n= s?ɳOf$TکW(v NsV`_*]=Q?y#YqBm_̏_Y},!^3nկ0U-lau|wHIWu*5UˏrJ[~āmlq lewPR6ض ccxV2~sr"7H$BSSMMMD"ƍGnnNSAA^i}пl![ne 20J=\LO_஗韠dLO?aI.D"mR'')KD)ϿlkOĆÿo7 !v}I]EaQuNlߴ5˗PTޓ.FQ6l8kYΩWڭKݵe>@xǫYpk s'ЬĩU p"Ou'Ծ`CaEҋ?ct7rn."n}1v%v.~h*b8 C)`d7T>ߺɉ/_25,X^gķq,b{I6n^+ާGմK/;)ltٗ4/yt>Ş5d\so<=nOzCd2T*%J)0hfrss1l\\H`0Hcc#`Gr_xtb'ћ[fYǡO:6I&8jY7[*K/OtxFp8RN"Dsc'[DK9`qC&q4>*LꎨXӇy%ަ;bc8~xjkkyWJnNn$ 0;wRYYٳg}@GlG+zw֍˽LD";el'hKBa&21`͖_pE:3nTַx6= ÿo7VbXF+ (JwoBzeZohxz R H2SK&ARCNIDc:SxVK~"~^O:f'oFֱv2L$#yYGk/:_Mzuf|.;:mΌ:ÿo7 mҍ7srM*" - :聾D/廾^^o]@ }] ]Eѣh4m6W[<#GdΝSNez뭭X Pz2obkS8˹ca"Ĝgd˧)f>[gtHQ%sO坿r8|ؠRn Y2R>g̾i' pOE#rS(U/^P~&_6_kxa=ڏgh6ӟvu.[R裏&J1f9a,gŊ}^-d=z{ҫW/O}p'0&<=s~8_O28'^O0JQo$ummvF; :; X߂c/k Y篲_c7 ÿYo-YDI")rrr2T݃ŐzD@*;8dJHIУ#Goh~=_#d{T)ŶmۯǍKqzϷ:;F?Xoq 'd4B}A/? PWC4 H!ey{,b $ QPy떖EhR)*$U}S߼;ov@{6D,09ے-dh`Hu:=}]nNˈ>U;ӧO_]]M^(**ʈꃟ)zW=mCCTTT|j_&qS@:OzYg2 J1VWݖz Ҍÿo7 G  8mڴ;D1RQA#:R \zY|:HJR,}vN8%1ֈC8 J9… 3p\B!裏xyꩧU|2yPc< 2sr zNY:M C8'L=-k`ڃ1gnO޹f9Ε[_ISNV8 ceJ!raB'e:{G_eoY֫VG㌌;vp8]iC)@nn.UUUf\?/H1ҟ7D)<>)cҟ=;[}uI]c[ ÿo7^T*%B"mC AH֣7e3ȗ2u7FݸS vݸPJyϏ[RcYŮ]ӧ%%굤mױ3it++E8*J@9Cظ+fRiW㛷9+΢]Tnq-\RwS_XzΝ;իWFɡ7RQQAAAyyy'gX(_ȳ 2'w&u,+ctdg:f}"mg/`oGu\f7 ÿo?2CRnh^="7ɓL:bFo'hE'B&I/W6 $H]ȯc„ n/KG:?ځU O>wydzWGE)q޾跬N:`*r> !7Ғt=Bʲ8D3H]Gt.%kwo.ӵ(U"[9>l7 ~ ),*wkW5 G iDP1V2֣29HXʔ:= = ÿo7T*8spRAw)T5P(j{)"i^ )O~FϧLҷITWWcYv0M-#XMZ/YC,W^V%䮻b^ tWƭzl^w˰5 ^~>D 1`-*,No2d 1g.dz}X :x3 ÿo7e%dV*Րer`QQЗuRHJo,zQ$ضYr%L9e EE465Jz*Xm]Tm~5?E1ۗd2IQa!cӦMTUUQXXXEqqz}'`'MdשOO>d/:$*iccÿo7 O@ +!w#p.H:RUEaAOT@*&hKu~?䖕1deY֡씻R'fEy+!QVFR{D7QZiydYD])wUqe1 ?ХK87o棏>1_ @xzOOSb%vGuYL-jdjÿo7 #_)FNGqZ[K{lW:-v|M@1bV! b #F1bĈ#ꢔڱsp{p%Zqm)mJidAU.Gο|-O%]GeDidM ~2 ~7 ~7 ~7 R6֎;eYC~ZnFrC$0}w N4}w N4}w N4}w N4}w N4}w N4}w(!Wx>ru~뽓8Jt㝀Gʱ-S I0 ~7 ~7 ~7 R k{U,Oni$|v*#AyP{i^k&]OUK9oooV;]QWQ[:vT|TIQ*pZNt`*w&eQqn&Yh:y gs 4 ~3۹Idܤ7ҫW/T/!%\Iieh\OϹq޼q/Xd!]ҿ$"h<me FAAd#F1bĈ#FضMz6nHee%p ?*gP ²-O)vGϕ{ l^lB ,wy]IȂ%%YwNlS d(3|U͐!C())!//8F1bĈ#F1rR\\L `j}zB (ޑWDlgu>ؙMx`Ȃc3"Q^ዎ?RTTdk#F1bĈ#F9,lظ6 yNOq1rϼ?KKoV)UJskO&\1bĈ#F1bζ^xkү__ BPaRdƹX36[؇eCwȿZE=Ε.rѡ3޽[uVFIT,93:_Ci̙޿k0`!1bĈ#F1b]mƲe˸<_XnFp~T+?=q<3|XEݙ4i>ECWq ۣ{D_oB{異gOws ,hnYW`Yrm+LKcvvk"}v,uJIIaOC֝6mğ7n$''@ J<gȐ!|9j ~rgt nug̙pl^.KF2Yݼpen䳒UVXx`Ku6Sxh?o4G,UXa}m#S#F1bg+6m~tޝÇfN9زܖ(ewۗݻw H&,_ou;?z/A-Kv3)^UiÊoٳ)--#HΒ\|Š=ROi'D|p Cu$U7 ԠPtt9N xY>JII {& z^KR;`W¶O>a`ߑCw 'WƟČ_uG\v[i4 [)=o숓+WbpU?ΕX" ʎZ~bM'e'pwN#3/!w?]GXxt3Rd뼇pY_It<+G}AEybrۜr }*gĈ#F^cժU$Ioteذat~'/3w\d~rW2zoVI~ξ}g b#W@*ֶ~TG(n֭[3gݻwp8̌3((($; ^>yM#SWٮJ~yn7Q {ݻ 9p999Eߖ(,Ν;ҥ {,#GßL&yذad{vPd_P%=lMoO""W?f|Gr/\$O\N?c5Әʽ|617Uwa>i<}|}\w9vUD{1o3,BsWZy/<3Dp㽷0,Ҿ\6 皛altM6kboC2yΪL~3y(^'MC#YJ o]FWfG`F arҌ99C|'|c|\WCx?yn?fW'\5ޏ֙_3ka|;Ók'x[Nh_1V.D=;u?oaPAU",'S:I _d[ ?/ЫڍGnoj֮}`tw,gzp%|BtGi3Gt3nV Q;TP?D|ՍTj>JC@DωxW)m\?SonpanI@b \3(Y'g78cp#֟;1\z5Gn;;X{f uk5ӇB IDATG~ װG?E6Nz nbSDzikixV[^:X=}ز??w]Q5f<tU@W6oI< E)r<+xqѵ7hep ilaφ0g,Ym3"'r5Ch9r2uV0\s z,~x7NrD+>~(0\VO 2/Tg>QE{cy(嚙:.}(Ǔs*,|WneY8gƪ1kE_ơ7?@ 0aWkdҴ]&x`nno>oo:6+1W%n`0W~g0b4E3(k(rYTR۹ʩ^u䢩RE̚OQ%0B8_]6n>k([7"$~TvϲnY" {]^g̅Xd2[A4/ΐR1Q@ISdc5 τ r#F1b.eee\z饼K|z.|ϱmOl7dɒwyӧUgr[W,**/_˲BqoGjrly>;^[Z'ɤO䣏>欔"g$(㤓&-,qx5;<6"b-QFYNրJVW! R\Tnįl7k(`cxa6vfHqP466,&~ݦ.OX[p]/ `uD,]xMc0zhV[V=Lη<*nI;׎抓񔣀g嬺q}sX;!9Xܗcc8]}v1gv ZcqT̐Gg2k_X*} rtm0ѓP=ś7Og}|C-ï2ADh 4&KO"[\0L]MfP]MtW(3i[a> >9K80%܅{(| >oy*v " V wP$ D-]PaW-A>EY]od`IU"By6U A偻"Z(pEL~ H:$;*c@A${/`U5Me'~Qo䎋ZgʣJ J{-.:WnoOc̚?ϢK;'Nq7bĈ#F|*2lP_t"M~a+it';MWou!>BkmI ~ W^gڴs`9F/)n10fz '8Whk]P8gM Mv`zÊ}ܑ =z?%`3=Rf< xx? o 0`P),zd("=yVs'_ʤxn]r'WN9@d4~{mgZk+]EdwΤĩB{ {pN^gYӧr&i]D)h3ew]gZf-O_?j;o,rwn\}M?>sS=4p+=-8 vJX;i> Ő[mGzbWNahFL „ Yxd\9̸F1b] XlO=?<\}>mNY/#;ȱNOgXE׮]{Gnn.A~iP0eʔFaWrDH$…^H" Jmŋپ}{;vO$zяOWʴ,Wmf{R,F,رË6ضMII ¶Pzv|KKK4hPe˖[oi|M,X޽{Yru .~[Lm4ʶeO1m[0s"0oq{Xmf޼eDe8V}=dp@ADFq㝣yk4Zht{ ⧞bǻ3dhg/LQoX'y|=3$ !a"ZPuj=}ZSNϩmOi[Z҂u+"dLf&LY„_/_{߽L^uݿkkEoH_cXTStrU}=Cr{AŔV9z]oz5|ń[Kqi.g.~9GrL(&IBRL΄Hu%+'0irC &{mԺ\{p9.1{ѿsc|#X0+/GIUm;u"-ý0AM٧^f_iUٸq cJ?@yy LAP{セU#Bk'QZ ϯFE񶿲r11l ;UNUY?Lc//<[`צMM3U'ި#$C> ^?\fƘ1D;m;]nڷ:+8+rfH1q ѻrtm:HNv`z?@DDDSvv0atz'cƌ(ZwWPIm]Ǐ'55;q\l60`|glcP-5yT_3fܸq|_OF˲ex803(4 #׺ma;g߰x=58_ZZPhTbbb|ukѳvLp$^y3N 6l]0OW_0z?Kl8͘3e<{N.wS[f>Hm0jŷz?K`OY2;*n:NT;{̮}]~x'_.k[7)@|/uWK-;xA ~R&wp0mD*um{01'=+=/xz]{Z/bRMGgN{G'ß~w"7 nw;c$g86wW?|?z:y|z{O^v痐د}wŸf' I{c)$[sX@?{^Bȥ0Ͷ)f֍WT/ O8WCe M%@&[9^7:4f=t[TPP~Ō%ރ'Emϧyh|Sݍw .!Čem~{y=:8)r{ȹ1y3Y.~ˮ_յ_,iۏaA\[p3e;<aC?5>.sl۶qƇMb0ed6n#:/X۪S'8lߠ߾MMԩSu`-GۉOf{n~߱hуA#y`Hg޳ǴIi[T۷_~0bƌ̟?}?V~@φ^DZۅ0η=)v 55;뉊4MRSӈV-8x /2t:x NKK MMM7K?Ai"0koxrG߈:ƌ=ëJZZsl11 1_tZ+fs۶7L$Tv{D=0|iо՛]͌d,?yW8p ml6F;M^tcbHI颋1 )KR:g !NCj`'UeHL.;˨$yer X6 awг&jbu:Oݶ , _k j|'&&v~Yq$vzʼnݴ#|h⭽gRh\V;2PNaa!v\LqqJv_N0R>Snl ,lm6UcũSzV^GBBBO?4eeewͰaúwMعsiXcnw*vuͷ 7Xv{QYn7(Giv7r5_3\3.lUee%˗/͕W^3Š>|5kȵ^KAezjF$Ga%1121 nǖ0vaZ֗MFBdU΍rʠkXʿ,`|2 7hvowmob~(ӦM'99DDDDDDDvy睷bXzz?5o'nN3O0Y{cAA6OaMee%IIIf/G饱1x630alM{c۾E{;^iLYmtIhm۶/ohk \{1 #t@NNNۻ""""""3n2Nnn.b&&M=H'#ۆMvbX[<նm]VmU 4Mhnvz/c0W_+~ůWŽjMZZ:QQ&젙ڻk1wa6C xG=u'nɘ7mLE|. ́Atk} onB7>5xeNw_+~ůW_+~ůU4462f-uhzʶ5z&~+`a5~nu-\ڎߦ R 48|qoo $ رɶvZ4W_+~ůW_1ș;ڿ/0O,0xKq3nK1۴w$? oK[_+~ůW_+~ůo&֭[7l=J;#tI`Z k3p F$daҺW_+~ůW_+4M, L/ Ѷܷ%Mھ  d֭Zնy[&x7;:| ůW_+~ůW㷭\,""""""rLv,m%r|ey奷DDDDD$LfJEŢϞ4fX`!Hz %"b(,7`\Lq!"""""9g*r&""""rqP3~l398!≤dA4'OD. ".""""rq!SyƗ70:Jȉ޶i׿M⎿Xܼ6j8󅆈\E&˽g}8{Ѱ#(FSŒBM4-t X y/,\ny\חͫ%Agpo0$6>B٫mX0 yg:_ vE5(IZ\1mm˜'kNz*V2ƶ-uf%`[ѣgK}U3^B?ibӳ㡮ClZ QyLY$DޅbwU蹚-&^~K}uoXaEtޔ3oys/EDD^`Oxb ϼ,?k7UnvɈ+_ gOS%ֵjt~}EGY2W2nHJN=\<0ۜsR;O!_M`ȨsV|`U&tQXz:{-RV*oD;~2p3 ^LZ&``ج4b՞->=63 =b.7=u/Sc}eaz^"GI^~`dDN@ 1ko׭sޖҀ߁HHEEX ӌTyt/EDDI9KϞHŽF .:n{MUb!g?v'7qA9S~/?`wkjmk{-x+~ 16d|3~GAc \:l?* 2bl>Mzh F28y;eA*PRMT7[o ?R_۾43daPSu( jjhI4VӢmͭD #^ӆdesЋ /^775kokq52xx.k+*Xruغ: fg[P|N'G6zq,VApijheIa3,XZw Nw_%yC)rf78{7Y{=Z'cdeeo'74gOXZbG lu  ;K' -N8Ie׎҃7LoyP0h,fs\l2ؽ&`KéS2lHF*R}Vקqi a~O`,6яH3qCGr0iLHFM0 wM7cmfiW2!VRiLFհg '3u,!́ح)5\2JE9.tHr;Օ\/#[h<@Y#HErb_${7߀yOw}5j.>u/{4\88qx#2Kݏִ>`P*%+^]xvy|.ʂ`KJOC""""}߃w[۲mTu):LĎeڸ,, h&/n[aگu<_E3qh6%GO7((cϑ#]Gka_4]J*,;wʼn;l_&fd߈#> KfNnbh 63|@(ά3(k<#%yl\#g{}s 7!ʒ 9p2/#Ł%) 6Q酡yӰRރp g9T[N&6^ O0%=`K僡y3"9ɜRtva4)Uτ!\8^_/jZ6bBP@l!f᠌ai`\6q6*`wP6Ssgi_ e}2A^GصyW{#>< c6KUg.✿ 6*x N x!^.1b"NͬA$TOhOx72;{/ļtr^$.UlnнOMDDDgLl#=ح# Ѯ7μwl&`MLA]@ Qa!)Yw~j{mgJ rOrϐy5>nKZ 4qA*:k1,mUNJ)9Y[sh|^ZмLg `d;[#Onxs Vĉ>3( :.#=f$AݩPnodcRF{)<оt; 1Ihnҙ~ÏNPN{9cfȨ䌚x8QbI\w)U4GuA𖆅=CŸI_"җE~Ͼ| XVoqJR&;wx_Yrd;S &3i#C՛6uyj7.=Ճ/Wou0,X nh,mqܫ/8c[sjWf͍)~O9GJL9ކ \:<yļ5\{ 7hIymI$&S=Z[g'aRDDD?ج&اOKIhZvmw/u4@0Z-45n?@S<)LF˰> 6X:KtNX#B Y}ttGKv$k8XU:M! I&)-(PiYĮO/›>c]w=rz:&CQw+66}Xp590 lhѿSu&U[=68[{;45YK֧b`gcXBqٳz}_`F~,x侻fgۍ3w X .Ӣ1$$f`_Ղ:^+K:wfFk7>wOŤD/2 '/{tӒEKc4yKY<Cא82;O7c&oI֘pH `IB}@9F٣7 u^LUm#.3|/_9tEx8X{ 3|l]'NaP_}}ٙX Ntжi̺v)1'X&"Oɚ^g5z:S|Ṍ7wjx>goYC7"zش_UWd1hM!kPNI@= 2}`y#ohEwABp~ʺR:r:_"[qz/'q͌e|YYL;!ouP%~n %U{8Y`r4לbSov҇cyuQq&ROkݶ}{fn+MlY廰fsYcno@hni8}'pRM}1+7cncj'Ehˁ8р%_o\1[M^MAGv%10h,~>a53! 8 n>gq .;k2xULa>۳rR'0YGj&a6o} }TF6lƒ}+O|曛/e %Txz-*lP'lnݤ`N{Նi˶szR0{NLv33r3'>{Õ'eXдN1ݥ۩Alo;H]q&I1.ۖV,oYKk}ӼVa&U7-Do5KJuLv7bGE3yܴ۰]o>Ncqլ8"gVwnٶoɱOiȜ̛3JQi r+>|w0隇ouvW[7/Q1j>WNo+Bn'E|F ``X(<+fP)'-VWG8odˍ#Z\TU|bϹ>J.s㞻Iu+䜋{ˆ$8]i#[̹1t}4vWOfܘ; 9,V{YH0M_6#`/n̍T65Onz.'gӲe%prx_3;gZYҩO218پQvt;2}=>~vg0|է6rd )12kQ@} ^q{_➂X强ss۪˯O.IlGll-R'FY>qzw{Ϧh\^8VF= 9>4:!*d{-5lF5^a;^mFRElpvYZ$E,W%"""r>y[Uo^icf3Бi X__ wӇv 0p Ժi ć%Xbm3/G11rpplvv}LϟDJ4.OoOcEg&mZwK+8H] CI{ߎ]}R#wmhlo[NmC{n?FK ؝~}/|6#u=t~a;A [k-tWI@ož~~F}Y9Y|vS= '1w}* {qn3+&M JL,nDSPNDDDDDF}Xhv;iE|`sFϚA 6@gYI! Ǡ[DDDD`}4􌆈\=ște?P&".ҟ4D\DDDD"n(/VC DCE\LS`+98h.~wEDDDD.JEl398تO+9 iblݺլvw<"""""""(RSS[DDDDDD DEEdz^ZZZ;& bjbz[DDDDDD̙JDlP-""""""JEDDDDDD"@ H(%"""""""[DDDDDD$`DlP-""""""JEDDDDDD"@ H(%"""""""[DDDDDD$`DlP-""""""JEDDDDDD"@ H(%"""""""[DDDDDD$`DlP-""""""JEDDDDDD"@ H(%"""""""[DDDDDD$`DlP-""""""JEDDDDDD"@ H([Зn|Uв%+1/ρaՙ3=Ul\^&*2^u|EDDDD.6uih [lC$t.e˙웿iHtL]8ݿnFC/$6tAX#Q}!Lu¹ E/)E=Dc1 ?ζIJpKGwu(o޿,a+Sl4;\^[qcǏQUՈ(bMVv/JORk#1uy9d$pq1\m6V_魭ࡃj$fH&.2fYu-=lw:1W!?RY#z=mrl,_b} 0s<*;^6[*YsϬ_4%jVvlYRyIg\FW~K2zr~rGWIwrpOnיMVh}s) w ,dMOy̞L^Vyf@ IDAT؊7/$+|n=)XX>ٰ?5<kn$4՛ՙtu(~~ <|?"~[Ƽic⪟'s1!c.ť_a<}wx^K:M̲͛|5V0-!6-]w:K?c,xdU)`UP5xdv6o1^ 9[UW I~/ FLp˧Cȕ>ž-3z\X|j\*?4Md.-뻬&""""">N>8Ysc|~S&p\1VB_^4ojXl`.=@G@ sSVFZX0Q>c&BǑ{^o^/ZEu;%X}>vfO?c&#J1L(d6>> YY]v_زŰ_1 "u.H<$םC^='kpAl{o#U4(okRjn < R{g)f1S_|:&뻞yw^ٞNnD8kLYY}CS. Y3g^}_.^]IJb [?"""""rq|zt쮾iy-0dذ|b=`E$[6}03oQk 8a}]{d{Xit_&kYHt1 =|&[S3ҒcL`ab z@mLwo]x{D) ﹞uK'j R@DDDDD.}0D B/ )t?={`HdZX/>ᕻ Z˽m-dL|t.х "뷙Kvܚ6~p.|1nᆠf/k1/2gƥ9pqs049C};x|, ˀ2*N$WO}EDŽuWl["""""rq;qf-~zYw{gVm!7翖,d!nY=)Qu.9{,ܹwϢ7 {1y]ΘAme),V+@ct.sK;gCٿe0ut&.ήxϺ}:{ζ-ݪ`1 kZ|-A)."""""@Tț}^X}^9Kܞe^,1zZ}sɟgWu+mK?aS23>5"\b[У1 =R.wl:ztr{$u.z7y(XO]=0zwxo,9#.-gò{^g~O-j޶L<~*_bv[LpYMiE%MxOڠ,2'C2M* **+b b5D{䒐:Fu :,},߰Lu 0:G8 j&-cwK˩o`6 ֓8Z'9]߄cCZZ)5=Euii@LL I]"3MՑB':Hu鯳c.qgx甝tæwʿoNu"hMVG ygw#GgD9I|j'%+ @DDDDD.8O;};!..$ pDDDDKBivI귝V/-ِ'wEi9c\Qu9~ό"'5r{<'ӗʗo64Gn ﷑g//Y-,"/}ȥr"o{b/Hd Xf?8a]K6r&Sږ QZ8NqOΤ˳[1-gwbNeDkROe߉9s\VqMȎgK:{`3 e+lw?#3~I?s%aO᳴kE|ʿ>Tqb__1Mި,l^g}(7Hll ^E)\˻StQEjtaEwFkyzr`pEs' 6 Op_K;J|%yQG7ƨܯ_p+E}%K֗>1Nhy1t׎c1X`ZOĭ\ ~:6\9~@/_ N@hqǍ`PGm#ع=亰0pr _o@)Op2w-;+W5q4C3|3\RC9.-;7<~#'NftetҀNwH43?F?^| _竽Y(}iY=s魁CvgC)ymhƨ JӆחJ"5Q#&4u =4f<'|u9s==-F:2Mpc,<>w}Ő=wA }Bzww~Z/pȹ$ NoMN"mkZ?6PTz5׻3?pjz%""""Uiw8Gwi|vLb;=xf\b:wcgl!(&j~~7`9j8co'I#Usi͝L~Z?aSw'qׂgI3,budĥ++ێ&.g+eҚtNC`{~Y{9iSX?IŷNf'0ޗhsz=;ƿfO=GZLa \ݚ-ǓxRR?9H8αٴ ?H]9gמMK1p u]ؽ,t~&7!tI?V65^Qa=  A`ܽEչ$,[8txl T9N}ꕑ^YpzTW9av1p-“_mk7_x)_d?{M|u ֭gٲ{;>eV.S?׿iZwǓ\e=ïD8W:8 `5gf>c՟?@4k[Cz- bU.ϝ"Comv|=kcN5l>܇եKl[ю}w rs[d5 /".^1u맕ؿ[:5W<^'# Ԁl/w25W=<'Yd&4VlՋP/бoc<%O4+OM#uXs_g8TL+ZO X%"""r44A&7r] _]g12UoބB("@&\\;oy@ O ֱ4(˵ik} Zȇ_ON6{y@0ѼSr*}ά2{ֱV]g|1v 1WN/xռ>>FtᩙKц֗eC.404?%K0) .2ު_18;}Q(e 'r 8J'Q1-n*M _]XOɺ͏3v| w6nM|eiiZV{mg~[jӪ]@ذz.]y|TvNcϓE?y2.&VI8Og4l|&ʷyҘvldΒ[ـ3,}^[|~$.wn䌳 l~^iD?9 3 E/65kYkx8-ٕ8$3':? lgFoP?OG? ޽YpM#>xE22NbYv3+R4cō_4y}j.c S6SdƾgWZ'fV<0ʉ#=4y}XL[5:oͤESX{'#WȰ^a'uKHy2.>+ >NbIkc$DZ[o3mgܿjE('l#g/stE>2 w07Feed X}[v  Ė/ӏ{oC /_ \mRW/`j'sWR ah͍ -Vgz[Αռf=Bԉ$ѾSl6o#,['1ѯ2'> 0_}m ʟ7s$ fT \0$<(K nHgr\{Zi >7gπ&bzb4_`ؖ)gpnY8prqeadooKλfq]J5 QRʒ3-' lk,ɹlNeek'!Ԯaچʬڵ֭[)Oico/\Y: ?Xֶ/2Om>AFwFGzGh6[)'0Z]`;ŕWϠT˓Tq+BTク2+`n,ob%`yߝ+z6-!;iQWH9U[D8+޼;NZ{f;Eno~ځ""""cF[DD.z3!"""R(DhtZDDDbUtTQ EDDDDDD|@(""""""">[DDDDDD`l]vHBCC]aÆDDDD֭[<2L&O SEDDDDDD|A(""""""">[DDDDDD`lP-"""""" EDDDDDD|@(""""""">[DDDDDD`lP-"""""" EDDDDDD|@(""""""">[DDDDDD`lIGi\aXL ^ad۽roXaaώ?,5޴q4ֳ\h""""""Ry\.@oRcY~j"> oFG@}f+oQ0oƶ]h= /Em2q|G+7 \klQDDDDDD*70|?mK ^7;z}~^K@>=q]""""""R2]syC85ZQFpeN iqeYFEDDDDD*n]g _G"}m턛H;; H&%#h{uz-'y;Ot)~'>v /rٙ?mr[mHOCI ;r`][9@K9~@xDy}dᛯ2=="gv墥e><f IDATc.Ϟ05n8+8))$'%.v.w8o60&>ZtYgX7o1IvW'l3lZxqz''7"B$'YMW|\=%>>7DJn<˙#bʂVZ̄AlޖFƁmuX ;-)~.)B7 $mJz?z.7ccZ^]`1c*5bH,'D{LIdSҜI3QL6u-""""""~U#^k!nxV+Mҳ]p!wL,haϓunjJyb4N[jـ,cw;ީ[0o=EK3toMG'GS;Ű$E~ʵhE>JrWu=n/UlEDDDDDKMHKn-ShE=+^)ďO=.Qwp} boUNQmi{9ɽ<r~"8rνv[-""""""N/C{ $fT%( gn'}) %0+!a۩5q)zzo77IvoXGg ,Ϥgx&>۰]x֬b:{H3LcH۔YLy[ŗ*_EDDDDDğ`sj5mL-x>gOX5GVBe]FSnޚ"%!x앉@)-""""""F`[F^Ʉ=#L!cf0(K<-M}}pϫӉ,Xiŵ(SEDDDDDb[J^߉Ha- EDDDDDE\DDDDDDQ-"""""" EDDDDDD|@TMβgٛ dY2"=A>/rf Rge\ G?k] jKTvYγ':^֍ s6 ݃@W)J#\fԵ6boN;˙I#[S_+""""""Mې8r}`vV`]_+""""""A _lN,.VDDDDDDRcDDDDDDD|@(""""""">[DDDDDD`l\F[V.!8XK͆0HL28o 5 yL(W.c[YlBkB0 BlsJeȒN,K k{{,eXwH`3]'_)>] >*gWQ|ѿȥ`gJ>;$%gFY˝^ldCEcoeH1%dqͼofҡY8y 'ڙ>o`]r~H[&G$";%oXֿȥkLfB8&MsȶjE;ha}uqqoeu9Q#%UR\du' 3&ѱ0wLI/vrNEfufCB *~=S[~m+bEo,!u &@V9@DD}Viլ\}_qlK.w$%nu;)E my턛mlZɜw>g~Navֿ O0gBK[V{p(#'O"9?ݾg ˮ֡D1qx]UkF=6YK\[dD_p`'@xz-{{pĎcݨUq\t܎p3@8&n").A'~>tƚ$$^;<؞-g__A5w2y\ ]u~^ͷuٲb?>"Ƿ>; }ų^w &#mvԴU< m9C} sW݋>Ibr$'ADDD܈ztVt=TOc QDCRJ#"IJN"nDNbH &׵,a76_8LpDn=x]?A! S}#$&%A S׹kEGҾ/?=db[h+auh(m R~RsឧQp HQ־?Uwp=h 뉍 ND>X(1-_~ޅgsSj5ߋ'KR mU'$Lַؽ8&!g^I)8:O iBHNv(!_mA[ %_-0" 1 ,ٻ3`^Hθ)h_Nj˃<Цuȇ# _uBuҍyD֙aܛpudHLg /,p쓴AED꩔mU< ID X ֝uwxV',`HI$v ĉ̋;Z !R+u</uqaF; 6vjމ)H7nDvFϻΨLY2j-V&  at6 "*ܳ~{'Kr|Nㆣӵm^KzngU8BlBi&v;v;B%%/t>]e;NlVȹczNQҺ [?ϟt߿=׳sWw"k7OyۂiN2NeLZS؝Jߋ')0z8ZO6lԲm􊮃d*FFZ:iz8['˻Ε\'ʫb޷A5kS%BIDDviG},|(Z|]hʨ4}Sy DDUI`lP-"""""" EDDDDDD|@(""""""">[DDDDDDL.0L>+p}VHEZ6e}(Vr4Y릈HR?+""U/G}^N""""""">[DDDDDD`lP-"""""" EDDDDDD|B-Red9\#Z`vsm|HpfuʥElQٺB1LUy=>`xp؝8xa\?1 kԨAXXkU1N:+ Sk"rq]Z`W턶"Ճl"Nf ! @GrxoF_uc5a2] ~rRYBuNh{ R=\;sڳqZXH~Eid_O['=KG`+by○trs bhVTd`qY0HS?[yU~p]ZHCǙ$FdҔ *ŞU'w˙.[@@v*!щ'r)Q?[9оu@Do[ 0ۑy[QRY^Yt:1؂>XR_u쪬_D1mCJ2?G^LULí}5r F6gX?}x$v.[Ӳ 7cb# )THᶮu,7syKJ XHu~BNE`O}O0Y7cdtiD&͠ oQo3qQ&}AGhLɊMLPH95FgxRJ{V1vOM(޵Y ~ߝ.8oywǷ߸yĝ4V ED.2ӏ.gRઈ9p-BK̛}G~9?oc)l7۰ϸP6Kpae8:Mkꗫyn`w0ޮ魶"Unr  V(A}{yh9{qV 9}'9GYY<+,us̵jy]9ЂTRrrӃM(שv=,* fGi>;}/v^("G}}O[Onsy_7,ڵo5 #w\PY9'jlRNguOf/` sN0{Z*Y\RlwT㷈Xa`AO; nƗGy?Ə#l'\[J܊Ob|L`5u8g|l|gY [7A833M(펇<'| :3,&co#a;ja-@m\.\GZ.dCDb*K?/~^<3y_JWw At\YXkC-,eإʛ;0b3 1C`X͸\Rm'#z_ёMp`*Ew6z ãyI: *}kyns[QQQDEERd'xMjgQy1,F+D)kgt:q88-pz_ad1Q';#zfŅ6/l-Ӣ~ 2.,skn6 3!* #G솁}Lxe;\EY)~(zATtVn mY/4]+zQ@zNӃ۠>JNdدXƦN!nCLN:<Yؘ$O1a`_Ot_䦁|x/ goc2|}Z9bE7<}'^\ kGHI AWeݮuՉI3swf<7Gs`-!ݖk3ujՖ&f8[l1ZINTegv6 ./+{=@:Ҧm0Wd}]GƜn|M O|e&=Ǚ'&M؀;cD>nc]#2a޲c6rr1es {W0 x:]s`bbNDwidʩ[ @ds'x]nzЁٲID"; >!&63<;VC fcw8?_ܲ_nuZ혰)ezˇ- mޗԊȿ7!3ˁ%(&pl%]D|+ĂYn#۰dJRw ,wާ-m@  l7 0hk| ùm &΂SX *jJD*N[Jo䥿/Mfb^?ZY\Ù!1٫&qUgLS;H/4VLȊmt0׺s:P~ gV v:M=f|Wsޛp7L.LM̿3Sxd% E.1=~=[ 9ɘmVm"_>f+!ŔSR\鬙G}ʚme7Ҿi N" 8{mM%dz;wҕ1\ڡ*L`9@zNWtD'~ї1` 82 |FCd;rsvrT?wfO[O6ʄ[ Ź#/D綡8,@+.٭"z E.1~/ b|WR9YFY>:OXG~Ȓ% OakI=p9Rb:r]Ç+D 7 .S}C%"AY_>~!$j?vǎG8'=/Z.,O^NNNι 0Hu&9ƛK?5 F@n2pڝ#3ϩܲ].m6嫗T]~EDJ;'v6' mbyecj׫GÆU9ֽďG#$~{pv}\,(tEx҇pu].PHS> 1k?f__>k{rML|3<®+y=Ҷ{D$y幃-i;u8`qpyi`Bggr菟Y;@eumޥ!}3?ŁV2u%Ϗ)x=| BWj88s亼ӭtb_l;@'x9{⇸lo,Ox7nQ涉[Y -$?ȓ姵=<џlNyh;S ,'LSaygդ-!%IwV)[⾋+LȻM,\ IDATiJމB0.TF>xq?2sۻwV5"2|y*󆣟Ӿ^_&n$kl6;T,?@xD//U~՚OXVN@տh:K5jq_wkdf>< ͳz8>&kKӿ_MϚ9׹onVXHePSN'. FɄa89W4EAv tKߗap"<2 X8y7ds:dudQfi=`Hk 6~ ;ֺӛzMd,;GfvR'+O?[hޖkY\EM6Y`Hڧ52m{Z}ΑTeUOT 0O+w]`q{ԥEWDDź"G_D`HQv E2R-"UBuq򦺶KD*H@&Uz`R25.kjD+֮sfφV>&W5qJa;H[D*=ɄlG=wED*&@]_"Ճlo)'>VYt'-⨟/# @;}Du^hh{ "S-ֆXHҼn-Vܥ.d9hLP fs/L)Zu쪬_D1m!7 Cgd/'62H"#-8ErG2$- 7}FGF2;i_yط?姝ړ mg;p&·I׮ľSe(37჏PRXHu~BNE`)dMOBQӞ   Xڥ16."&e"oXDJLA`M Ms !(%Šy0QMDj-!Y0=6'v E_sW팺7Aߕ_8MO'~b[ψ|%ÛdR"F1c1l:wHPw`WeU"Sk.F p3:4y<)S!g'B짠Yk S4pıخȨU ͰdpY D'06s*&_a)_G2};;mЬC8JǺKHaKfRu|"~UQ 1!b:l;@_OI h׎Ť3$=v݉E"R]Iwq|/GIDjJD*2ӏ.gRઈ9p-BK̛}G~9?oc)ي 7۰ϸP6Kpae8:Mkꗫyn`w0ޮJ@MdO6ת I{r9[ "}=oO1GY)̛_O.99z@"#gϞ^f@/ Z ?6)94iw6` x# tO4+שv=,* fGi>;}/v^("G}}O[Onsy_7,ڵo5 #w\PY9'jlRNguOf/` sN0{Z*Y\RlS>~),}=ix(6 SimbɊ t-%~Iߘ1̽f5_w5߭ 6ۑyŪM#i;-m[pL '>ģm,a|\J9ω-_ m3Kg% Q ljrr?r!""SY̔}j=癞W]L|7Zjpۢ*{܁T0ٽfX͸\Rm'Iz 45; FnZ+(oH9u46}`֘-bYF旻1 V7 f1eviN3e;s?NxV7,+ٓvMyzb2!f/6z ãyI: *}kyns[QQQDEERd'xMjgQy1,F+D)kgt:q88-ۻ(tT 0AQE " (8#ʈNTDQEEp@d !}IBUN  u>Ub2w;԰~tnZ˲߼ׇg ?wt啰t^ЙQ+aոȝ]v;Ia}m^>sĹZM 3_WϥCL rl4:vH7>R+ĭ`.Lna~+F?^HՋ+>gXx9#~g?;ֵ p pv)|7ow[ҡe7ߖ`gSsҘ3!sbh۴y\0IOgIa[㾫aɑWJ'漓I6F2ghvD$R`^ w6]B~aنe,؊'L"oL˓Ǭ}qU|d.4~L^eu?AT٤ dwХe^J^pea[?Ɔ_LXq%Iްn?{^NrL7F2@wo3'3erW-c^~?@Wn폍磯0l~_U,P,˂>2h#7xvCF́ld$"'f7=#IfrnJan2g /@jnwqjo܃G:q ϲՌlH"6fd!?,iN=#V%ogӽVy;}HDZ`~7Jd7&es%䗸6 4"#QdoMò,w o?~ ϛ=GsYr*j@%"@$y6Joۥ|d/>3#N'ugl'&iS~f4-ZoWa1sr'[`'sƍdN@Na;k&* 6h!w!N@O>ȸ g`*E0.yD;nwlݍ}$].ܮߖ}^#گT %;SD-{_] Zsj@ p SCR؝+|6 .cd'z3`ȤK1LS*+={+;nZKҺ3ddeSC5&G$ 8  Yyk`>~ˏ|}^?iFoE/ܘ] ɑwud\{&`;: etҞT'.nۄZVz>IO&F`aF?6 vmNvmw~j+E$2<}eLMY|G}OrokQ`Yl=zg W(=>byϴOM(^ D2$gmZg~|>p׻~  gGbE98Y}^/~oY53tR~5րe O!7eY -,4M]KDW l(y!u(.Orڜ{nmjݐn ^d dzrnvo)O 6V<9Q;i$]t5-/ ]2rij@%"q'ո4l®]B^xchىdٴ}7Vf3pAbhFEU~a}NK]ib؊ WȴX mzOxlwk2&Ư)<,F}}F]Eb @:JsXv/]zѻo-ܳ3cfM]p7e @RK0X#{^zE 5ʠyֲr-7yxR zPdGxP[ @;΢=>{fj3ފ`@tZELҶ7]H'/hף?dN":Өs :D%/wl3a[YUF?h)+hٲ%v`0?@6m?[ukYژp6 ul|_Ĺ3t: Bχ\,yp:-|ύvv(ppE9"WkW˲4-"!s̶`0m&ڱ!o4M>eY/MCE8  "E9 b&GFX|Vq1z+-oheqc~_S*?p8Q A@x̳a(-t=T`H><HDT`D l(P-""""""*EDDDDDD@H"""""""Q[DDDDDD$ T`D l(P-""""""*EDDDDDD@HiZaD{D/S]֗eY8[ۜnEN{VwSDRxQSD l(P-""""""*EDDDDDD@H"""""""QpJރ-<|ݾñ״M#,boG}ΤjN9(VgnR06"T*EAo?ĹuQW˲)911z0S6FB#9=g+gmۆeYv_"Ul"a vcȱbfϖeT5իWg]860 #ሜrʳCUȳcz R5(>'N{$ޟ 껎nWrH}~n7C?L0X"r)V^gKo"/F:.`^x`ŻW} `4諄g'șDyru<Xt=-&2/ŽQ'q߉,=s>xۊUGU=//g*Y/" }ob X`ZLlۍv㺶y/k->nwc`Wˢ ٳIoۍiKkp` ?m\Q Ϫ\׶.Ӆ;_qͣ`Ƅ~~6/"gX(hBDX͝EX`jxǎ/=alK1Y&_q; j&-F)мf%g1'OaIT[L_tx1e.Ӿ<+}MٵFf|JG0}>>}V=L:͂^>gcX䶹1Ӯ ddf*o W4H<"UGUxTR<[ޜu+g񳸠\ #chyа0;8ps'9߉ ΌdIJNٯşky?P nfo6бCh[[%S~I.i5]v30SrZ^^b_6};?LVtط|g4p R* "γY,]#9۠E+tSO4~}}W3WACO'S`[m̚2o# |9SnשPE|ۗRUy@$~_{ꐛE's߇L7hƵ e\~Z`Z=l{R-` #U8@.laOJq^XҖ[K+"Q;z%CX<i_7Q? +ՀJD*lp r[C>C?~|Exk[|ϻO?^QiCog7_LƁA?z IDATnj剣z&3+9F`L;M2'«s>zIkl\{'G8d +|兽drr >?5ؿqsu_;(vR鎵qg(͈хݿHf?P49;gCXHbКdomS̄e{vHfgZNfCDt$gfGCNy::~q IAe{`PGD ™rWEkvL,u"|0v%eQ޳@$5]&'wBI~o[GCb5;t]K^^m.>@]Z/㜳Ծ2w?˳?ƤEaY Lcܤ8ǎcxdQo+,߶!7{.O}{4HDPL>{Я?4cf/e-#鯓FZZCdcUܞ?#0fGC3}.-h#"q'Ҽez ֏MkbYд<6΀μVԗ^Ϋ:3j%ןc3kwn/0,gVt8w5^»i!ctЁ?d_bFǎIYBj쳸K7xa,>MtBh_ݫMVc_ Mw7$I3N:=*{!ϡe7Kְm)n9W1} 7#xzRPG>;S჉2澱=#{=Wac+" 5-g3p+0}/tw)mXƲxzT.rƄ 3g>5\,˲,3(?rg0y  s>{Qpcvæ.&Պ6ȸLvVufq㓃=/N 4 hnҦ#S-r3GllnsgĮZ$"y˘ !>>ٟNgo)ǿ3@MpE1%pe!Ic}jRDj@%"A$9kӢ?s%ޥO f_>;rSt́ʝ7`E?_{?sK.eWi X zXE¾MdZD$~ż)N7R$׮͹֦ 枰EV ͐<<+7f߀?qijIEWs⋟%+gT"w"Y=|OMc͆-ڵ?,G>MLF9MwaeO= $ftP_]6lG؅&fO x}LK//Vq_'ޜϖ}ٺ&~/.z aą<,F}}F]Eb @:JsXv/]zѻo-ܳ3cfM]p7e , ֡Ȟ_^iF D2(w,\M^~.t9%4֪G3_cj/-[_sv $FzQt\Uk,K3""YxE<x #H0h [0c{Y,]D l z6Ͳ, ` bm=p#M;TIkPbIL""V<{KYVe;0y>}YGRH|S-"q#j'w#;1 {mG"={"T`H\̄e}k_ f]JxӗH,*֧r;V=~Q-"q* RUKDKY"RPNe%"% lT`Ip1*0p*KZC9mg+x˳U@$ S9lܸƍt:c Ҽ^/;vQX"r(V^gRHա[$j&'w=yGSb0 ֬Y0d75:G pDN mձjժUs<_'t=:T`XEbsc1 KfubJl6v{g+0HiqPfΪp@jP-"a*WHc5 DoHՠ[D*AD_x_D3H%[DDDDDD$ T`D l(P-""""""*EDDDDDD@H"""""""Q[DDDDDD$ T`D l(P-""""""*EDDDDDD0M2 #j.߳ j}*W,D3HhYg~7EDN!Y'brXD l(P-""""""*EDDDDDD@H"""""""QpJރ-8ˋu(g6m`Y1&U.+֡VʳG&M`F_DCH۩Su֍u8g,˲)911z0Sl6bi<[9Tl Èu8"lPlxiT .J|AÅ"$LpۛcQTJxUvp8u%xև]{1ۘ ],Y%owf,ao NrF?jw8WUD$7ϖ7g*Y/"1E^å[KR0z; 499;rN297仨xʂ)xsHK %w~tVЍ)wv p7͞oqeu?c+\ 4eԌ\7|+k6)MbzO7(p3 '?ԀJD*lvs6KWH6hJ:ԓ6p_xkw;qFؖw̧n۹HCp7_N@[u*G|nsr^'t=1z;i}5!w&-wWGz_xu\-{6i)ʵ_1z<+&p[G,0drt.~.:qYw׮& ؙT`H &>2sO &:l}A?D(T* "ʳ-LrʝnIz[ -2Ëm]spɺz>>xQDV$~˿M K|1i]CjW("4ΠKDG߃:/2|"3Zsw-ٷ1s~pw`r*9i67 ̔=d%Ox^]`/ps泌޶v ͨwlu4:K%iP1ܙ<`Ca)W-fJfNnz6]в;dlidf?DDNHlxf{t>?T^Jԟ37)(ַ LӃ3j`cyVe%vL,u"|0v%eQ޳@$5]AVla&o/L:P;^/X8 \ZQaچs϶sl789s,y(˲ر#IDFOZ¶ٶv>=Fqۊ<7b׶p/fE"[(&=ןyrƱ|˲nFIKK#--cf1*nQf{X 3# lzi2AgcG5,y}hZq}} xg@g^^ +_]/LVO1 ?q޵;K~oH+:Leݴ1su\:t/g1Ocǎ }s!qH܊ v . ^fm :W/cQ`4ZׂzGݼ=n K<~[mCOX7g4LH.h>;)l{Э}h[\"޽ln/N.%ò X6OOEߘ'Y.n;eΠ^<njR{dg8iKo}fdfg(^ۘ݇X@|GDN(;9@WZ7p &s|4)[/^ᶏN~kS@#2>kE޴;Q{1,ˢyc,G s4%GpT"R DgT&]7K3 [1tR}zh016e*;7j6OӢ5ve;.q>>-wAzv0gH F {n.!{`&rwY _p[䃌[hh)nzf[ s 첟Gv.mwvI2v +"ٯۖDmpqkM3EV`૱}AXk_5yJ`[J3}?A{ e_Daf t)ij@%"q%gwoeM7rIZw L}jd$>7o oY/P/4͈H 6u!49ÿklgU'a7>9NII@jYf&m:k>"g/rv~dLlЖ 8d2&|jǤE-9[=4jZǿ3;iKO^SWZUIX'1HHEwnïsޥO|:5,#?E7tcEΊbzG)4|"矯d3IòlY -,<_˲غv9^[ E,M;stOHwrxHJ\6[g7些{²Y'T><+7f߀?qijIEWs⋟%+gfja"Y=|OMc͆-ڵ?,G>MLF9MwaeO= $ *jWm `,c?>-l6p?2->V? zOxlwk2&3gċYndgU$#:Z1kХ~=;3f5L~SVϞ$Ͼu8'eW`MD$"r-7yxR zPdGxP[ @ul΢=>{fj3ފ`@tZELҶ7]H'/hף?dN":Өs :D%/wl3ap\UknX-[bvX iӦu[nw:ů gp:\9fϓj DL?Ϧ2 rx, ʉy`& #۷sNl8<[Tvl* ]ITs|G WqiCw4M|>_Ĺ3t: Bχ\,yp:-|ύvv(ppE9"WkW˲4-"!s̶`0m&ڱ!o4M>eY/MCE8  "E9 b&GFX|Vq1z+-oheqc~_S*?p8Q A@x̳a(-t=T`H><HDT`D l(P-""""""*EDDDDDD@H"""""""Q[DDDDDD$ T`DA lv?݊TjQ/;jrп7݊D'XӨ~_`'dwK]ޭ5o :V y?Rȋv""""""" vx#E4M0v fc@ Cp- ̦<ԈM| ,DAl_a{[<vOG&S "tD=XpߠpU:>d_=8$'+Le"BqOs%,4|H @lb}@@?sozSaF~mOE8#!{,6;6fFO/j|oK_?#c#^PC4LޱN#Sւn++T[sZ^ ޟbb/Emwk.j/(F*dxLREn42@۴D,~ULP` K`~=i}TßL-9f/>|?A柵 J#]'~Ko*i?b1k5Jn:Q-G&T=@5Pݨ_f! ekȌ~ zW(/o* AഥuпIF7")?C6@k#vFlfCsY6h]dT῎-[l%|@p/{"(AT}0PRPTgW{nL؞ F6A+4AB^:f|)1h~NJ@h=` v\nĺ x/H S 8 A1(W P@ ]<#`L0p"A?$ ICJ:C yAP8 %@P:.Au6=h-(fya1XVa H8NOp|[.9<(EQ(u!GQPPiTՈj5ƢIh,fhG:}>.Gסosu Ãhb1.^L*&SiG w,ˆǪ! f`ck}wEljilpd]5qxZbnE^>^S<6Y>6>=`l{|$~ lfy/  9 %  Յ[DEDDD^҈]s;"V/6%!n./^%>*AЕ(x&T +=qDIՓNaO,bʊzwt]@vZ3r%>;kې'w*o\5< ¢w0pbKĊr1JJ:/_(*M/]+ //+PVQQSy ~ՆjK5l5k{]aqZڂ[[iuP]\\}`xkC[oݑS$ؔ{{)6Gܟm hy:=;L::;j?lzc]]u*ݷ<գSTiCFoc{-F̟u=~788<>4>;<"ח1/WFbFr^*z-f\u7oߎy7>D⇜IɊ)iޏ>ND̬̦~bTYs/s.s_)_7esΗ-l[h]]|=R?v.;/O]ŭI5[nmlD)PToeH wA!\|׶os K|?.GsnllE`; 2BC4 O U+7c,1c8Uyw av@daRg#QYΰ6Mp0ss3'#pIW.(cyRE2dO%ɇ*)nS")M*DJL95}FO1ffyNͮ93%1.p>OSxdkiIr=,VU_\]RqmRݭ %; 7ML"ת&g;:[V=~mDG`/Og?3ƒC*/4_ꍘZ y<^{:8C>̊Eq eߛ~|^Q[4-(7pBi4ՈV@WcT0X.L$Ӌ23p łaŲ1ssqps;yXnf@".ыb?%nIKJ I/KJg5(+)vREGeF'< c9|-Sږ?tJtt7)JFƪK&qfZf+wwгV)f6Dg;a>G̝y?4rA>q}QOO/u2Ż)h@ Ltg=DHGrRpŨԧэ1{c#q&@ 4Sk19jq6#qxቛ';N eNd}9zf=g=p5?P!(~ɪRSpEFbo٪z[Mе njߊ\?tQNHӹ-o1kl}P㸮{+V잵 zsXzo:]χ?͂Ug(AL%h9z@z d$5>-b@sh ua_ěH&GGZNC7?b1VDL#f ^~)bpx_EӸ!g# х8JM?ɰ̘,\G2&=g dYebb{ɾ‘˩9ȳ{υ_+/%'.l*=&f#&>"Q(-%"A\&XVF 4JnWQUT]W{DW5"甞.g27mzyݎVSl>;m8\\vI+{L>Gw |b=B<҉r8U؎x}ԄKٓ2S=Zf>|RCYم9w\и]YQQSuj5 cu 4}l&Wt~{l}gp y0RntķY/~W<.S^Zli|uZ=@$h;eBH–p4\?Bi{e=c0uE*6{A,^DJs Mȧe=NBw(MldHdglac&2ד.yRP{ޢѨyK+:eze5wL0'౐ԷMyޮܾ֡q+.Cw9HO#w

,H۫&oqdjЌlЧϾ_~ }[rZa̟kˁ˽+*+y+kޫ-kkֵϬm((e3@WbXX)X+FQu0P}tF{eЄ pHYs   IDATxy`ř943F-}| +&0p }!& !6x%  0ؘ ᰱ۲-ےu_su讞H Y3UO}֡jCAssX4.B@'bBg 8y:ߑHVOgT=ћMGgzMtq4Bxa9ΰJE;k5Ϳ_Ok5?06 !zgsssboBLt z*x߻@_ovk<L6l߳)G g#QTwflmlݸkjGe"4aGAM/p:Z6J2zk5Ϳ_k5ͿͿ@8|d29\*˖9J9JF@6x^GW6":܎ ,6 zU4j]5b=wa6w([S|ϚͿ_k5҆Ϳ_ﶹNNVm!Ն^s% S / "%QntԘUqPvDl6f >ٰU{e rݸ;YGJʟnFk5Ϳ_k5/ _F&GK6!ȊwGDt#FRfkѺ;Bg8UV;b&ӫyݍyUL*NͿ_^6}w}4?i5Gé?h56l]U__x1P` /U d3 Hm*J 殨̣9qN@-mlzym ULnRRTƽl \ŭbS;_ƭk5Ϳ_k_^z~g4MbC 3gν@lFfly܆P;[n=y4jHd>!܄T4NP:L652$'[5Ϳ_kUͿ_ﶓ㿦^x acB&pVT5<@-0b58uCQ|>T*Lw9Ĩ׳mp7:ԙJzL붻{& HRA 3[U"䏌HT.Y1KTDJqG$fĨH! QujJN*oqE6,WWk5Ϳ_k5_ 7nH4%Ř>}:۶maÆe3gνb i0YZYmwC(]%^n2gk*6_Suː?LOvx<Qluv׵3:[ΡQk5Ϳ_k5 GQnJ0k_999 4;v0|LرCB$`*(IJ R.d#XrQ5iG5jT*\Cal܍4Mve>vޱ+zhjӨ;xSIW~yzӻwoWVIwUq$"EMrؤ-Tv^k5Ϳ_|3k,"9rɓ'3ydBD֌OlݺUIdwTi2*RZy5_2ixܕV -񙦉'L#0>wt^vِu^rrN/jg_k5Ϳ_媟?E's{Xv[3*>y-՛rN0D۪v0jLh?+^[ )dDoip"x?4a% wW^X .s N K?_&߶w&=5ɭL!JY[* L0:YRah_A#G7ޠO> R__O"p#ucS3%j0MP(Daa!>/c0NrĠ9/J= uPiĨFUnLE-S.k 8eyj{6Nk5Ϳ_e_^ࢋ."??K !,_¸ pdnj +$~#DV6R J& Qv-| ",}7pc=+l&H552o>;:x,{Ca!La)L a` y4⊬Npc*ToPaOZpA~ àÇn-U'9Į](--%C1CMꗟ \Hݲ#.G`.ĢYկݝ_^Kŭhx+T$Ϳ_k5/#br,X7MĿO!VmԞ 5>^mͭ6ܻ!DutkWD h Oʃ'am0m@Рw"6U H5XmAFCC܈b6HHʼn1A%Tx]MT J%SN9~^Eô4 )_~9_,L۷ogժU|'8^I˴\:Y50@\9֚ezr a,Ά_:u ڃC6dh_E4:t(:He@*Eh5L&ɡ`0Ȯ]BF-{puГeQk)]jZY+ !]-.'uSqT1Wӫ?<OWGZUHlW]-K:v4ɤsc CNQ.|@gm$#ih%P`Dq CA^yyAooBߋ "1C 툏 -apzI~~>d @⬳V!8qc_Kyy9|p,UQ`(B$ěn|&5e4M8rV4´Vw|0-Gʊvc~n~dӰ|SҡV91O)ٳ'W^NB '???ґgyOMSPsAn6w'Nu,_*6)] pj\0FtywuSpN/'>YǭO2]G㿬_k5*'6KeRYAid2Id¨S|ohZ R0ҧOX #=So6?7'7y&LF*I94$iiҫ/fS7@$'H?\o.- $If^>FuVHTVV2~xǠ )8oǏgwD 9rd` a6M[x_'pj?36̴W(-ɬ4L aXh%am3m7[VMe$~_g7a{| y܍ߔ'L#^ۗ6UꏨL3 SUUE8uĬ$eX*b`TVVfLrpWW)߻ ٫W/6nH4͈C:`(:A_ܝnjʔ[~VqݓT,GͯNl CKݑewݓZLmI$|>nQ8\fe:Ϳ_k5&B<3 2¢+ /: bM,Fcq |̼|E=i,-fMܖ̽V^~DQ~qmڭ@XFP La6 SoSl߳ Ӵ}LZ}%7m|N̘D"b7ofMb1"G*e eee>|8 !D"9r$cPU:peqO~h4JCCTyM-STU"!H>+Xc; /P}vl' g4`eC>;J9m{3ejYR@TV-YFQg 9$H2" 2i۵}Pb;t0! T>h1e]MxF%)Sr!ZU ׶cSkvP9tM{F?S]{>[\ˤ[^pV1K~m 7i.'W= v/kngٺM =Ī5œ c:/HL&ijݤ-$67X'-0K[ j=XtSa|V]=eXZ‹.b/{J eWp׹dr IL!7N5lfogKrB$hl^ ?LB CB IDAT{p =w/d{n`myĶJ. q. 8vAj$&?QvIW3NXk! }S ajkk9 :ğL&  83hРϡC۷sMjRը߳gO)--u3WNr2}w o˒X!` ewʺT,k_Jw#uV /#Bݶh?dk5Ϳ_O`>X,alPɕΖ 5"脪9`$3S__K'Fv &ILj\Y:P%Uꓑƍg=aoJ.j8e8׿,} lcM:n_͞P45Y_S.z_䴡AMu$p7+ͯ\ׯ`K5Ʉ&6*Bȟ^6#|׌kb+`X@L83~RZJ_wS_J!sYlg l)>ϪwjL/<tAL\FzPqkwJ +VPYYɚ5kxN'I ޽{H$Ν;)--%8OIbꠜKSS=zpʁ:ʁ\ŠQ '@G2鈳:x<gԡFݢQxY*>K]6wWͿ_k5Ϳ!PI?RC5IXd:YYNL<oՈԩF]$6yMƑeR뭊lHOHCm:\mW5jN)Ko0Y<@Q /uJܨW#9Bu"!H" ۗhZi俦퇙NkkEr%=@Q޳8e2tQ{z^vq)Π!m~Xh4J>}ؿ?{999D"mFYYpP(!{rKkkkq9H[9qP?!Ga.ad< t$g*fu6Mg'nsGU\zk5Ϳ_r/'3;L6q5yIoU$WiuߪDF$&\u+l 0Yw08q>P؎rx`ڴiX±WWEiޒm7#Nb;"pr9~/N'$"]}OKg+0 'j;~937xv`0H]]t^):iE 3ƪcT7.9ָ󫓞ZWଊ; ,˗vt_=U=Wb'(=k5Ϳ_z˖-*$#A"%I'@dw]Q5ĔLZ< HH#8UFH${޽^eL:j7 YrW|2+z?]ڕ.S^vS9/y! Hnm!0@8G: bU;:%[eMFBPt[ [Riܹr0s-ZhѢE-Zhi׳}v =._O0 '_طmh"xSj_7L@ {ˁk'-P psN&``f`98PÉFB!kѢE-ZhѢE˗Lx}8^_# ; "G]6V´o@fvazmG7Uva+XǮ] X68gW1tt! ڵ]v1j(JJJ)Uͷs޹u G7ܹs;3pѢE-ZhѢE-.{av}96mѣZc}Y># àS2Kɋ}*7}NȄO#„|z0X"ӕ# ڂ` U!{c# w^0 zA4=fiE ?wlOm۶_'3|p0dP~Cru e޼y=#x̝;$;VG}tvJ|RCeE-ZhѢE-_4پ};#Fan9yӇ~qA|>d~5kp=?#//urgLÐg<`_^̟?B+V.+a1H;U|o}0.iQukTԀx8R]@P6~'*cKyljF뼛1JQ]]'ݻ9bfweh2o޼nZymwHv63\K,g}qJ &Lg]U=!jSd}OU Op27|oϐ^_>.g|ZhѢE-Zh9l۶QF0rHV\I2{o0ofOh4Juu5UW^]W C!&&a.@&,y{ h)zI$ 4;7RX,F,##LSa{vFձivW7Z:46w",^EiHP,|5ߥ&ѢE-ZhѢ uuu8rJKKsٶm[u8 ]MSPWWGII \s i ѣ+VvOAP*dP(D0dΜ9HL' =yh\ܪԡ,W999ANC#˵=3уP(wƏOKK T={rWSUUŞ={#Hx06<#*%$t18v4M1~Liʂsݗng2d] A 8{s9,KWG+`*ObxiT ۩nIyJ9%ZM3,F-ZhѢE/曬[d2iӳgO)SxWXhDd2E5k'Ct-K#QWWG<' )үFo?#-J]vpB3g<䳷%tWe*؉<%>|!''P0!D`paOQQz*FL&yٺu+d;+h?Ͷo1HV?d'ʼN%(̹ޱ/zOruYξ|Bo$O:`} yI'lY˹2.lx껣Yn3㬧7+ .[}13f>xiL?r:U}(mP2Z}M?<3ameɺ3jUWf]K'r`9c .kN f)sN^+>ƌ93Xxe+=1ꇮ9 oG|\׏rB Ooj#|??dyd38}_yrr_}N4D- s7 eiS܉Im?&p%Q^ۏ,mq y.g4ley\vR ݍmxgzW?mrM=xgxf]?خ7C );;/@7yǸV,W=Eopӌ/<om@[%m)O~x"ș6c{6=;ǖ┫oA>z<ЏI V_IƏybc?f̞̀w]hѢE-ZhEZ߰acǎv[JlhiƢE|= jp={п[ʿ\Wznv׮]K  :ے EEEND-x-WM4C! eAsK\߇<r1>3%hnn& o(F00M0`-Ή}@4ࢋ/檙3m vyi">GY6.p}5 N78mΣlQZ__Ct߸F~1g> -жYȘ_^:k5[oǓh]`N:p Om&pr9ߢ欛nbxS+ `5}&quiŲdXX&ב _?YR}8eUāWAjO-jϱH~'B _ (m{$q Z\b~4}SG ?b@!mLeU8% /Mi%avhѢE-Z| Dn凘{NOyfnzN=@>H8+B.xJJJz<9퇦U}|ުU 6c" #<˦MַŐCwqP,^w|tk-5@rGOR C@zn:m6 +;c3yG,] ʭF!&>څ0emUy_ʙsLi}#m]uXi%.A@,˝Nr;LtpLcYa-i܀dT͟IY7ޮv as-ZhѢE-Zh5|իW`ӟĀ :='@ؾhW:N=T=\lقaуW_}@ @AA^gy!`Y;/ēvLBuD`0e]F" Jwٻwo}O$zQ_'gDf?ΫڜWb1ٷoI4c64D!(((`С|>V^;ClOc[t)K,ì[Csf˩mkc̞̝ ;vӯX=yմɕX- Μ,X*? ߟ6hc,|a)G"'iKV"I,)**iUI*i&Q,:IR TTTKh\ϫK)v>мs cࣼ/L8󯬡!r<ƞQ^4UJggͱq)A=*jXlN;i@ ТE-ZhѢ ,}7MӤWhhh`߾}QXXH<窫O&ϧ9ylOy, ۹S H5kђJ_ロ^J3[k=Fx{z.H;džY}a=PYYgRTTD06t_A2+Wh{͛73yKzRu+VnzJKJH)Θ6n]9KٴglOsx ȥgwY fgvss˹~cܵ.n ~!H_4r*c{X<~;)5dC3;9ُvТE-ZhѢK&k֬aԨ^'0q)ZÆujXpX[Vf̙! Ez}ld라BɆ c m<B԰!jr{}º:!(*A(tN?:~(-:m6ϟO<f$>p8L$!''Yf1l03]sN1z߼y:tY%Fmc+>_H$}y?!-ok$mHaJ[c-IE 3ɶF[YHmkeb 7H%Oho @nzsC -xs).jz*}Ot? ΂hhhVkmoo3-ZhѢE-Zb&<3gd!X|9+V_\~ay(.W_}!C}*W.%ѓgy0M6<ȍ7#;MLnx9x )//g֬Y у?a !~s( Lڞ~倡5{s vCDQZA@aa@Tt a^7A@<g?c˖-D"gۇNફ"GsSF ,vp?)L/"~:A!@>E&p~m~AЏKF~F?Xave? z-ZhѢE-_پ};@?OE>N?t֯_c7W_=2ƌ9\|ħ?[UUŗ\¾}8x @O$_0֯_/0tGQ,HINNdz ghll G~D"Ǐ%;w3<WWhѢE-ZhѢEK,]uuz<̳_Naax{33! A.DQQڵ߶ntگZmjo-rQHC !rgdL&3I& d&|cYzQQQرz(`}"(B\\CUU6nϛêFt*u}E3]ϮqI;ow2O>wS<%<]B EZ=6 sP/"3,jɿB!B+fgѢ,Yo[ꫯpn}'W(SWWGjj*hyץ:tHU4ݓ=)_4G᭠߱ T#<[=ߊck<5޾{M*ϲx$& v!B!#nm7Vat.=_\*xx͑z]]ݧ2=~뫾V{^٩GFz}$$$|tB!B}DO>:]N,]>oKwOJ<ݏ.P5=>s{}SG[L,82OIIcz.B!B1v8xycs=#g_%~_%~_%~g?|_ GXŧ_Oߦ)7B_%~_%~_%~__S\\3ST, TS:}?QAp쳦O%~_%~_%~_/UTEJύx?wFuUUwEmڨﺪ϶Žh4jo7$K/K/K/Kuoy!B!btRUݹm !] u!:!B!TUE(Ib)\SB!DPUiE!DZE uB!Bx[5 !`R4 !B𡢢S_!"-B!"*bI!BNd?!2B!'2B iB!D&B!  !Bpo8ǓNl# C=!/B!wgFF;;91[wFiXKtՋzEêbvG:mab(I!BN< Mw߹:p|f#.IOtttiO أ:t:JD? N m9N :h7aDE=;ipGl]Tz YqP]*FP7rj\Gݱ4ZX=#idJuiou=RAAB!lZ|ovfPĬ ^bo#iQ Y4u?ǑKFj>˼ji]`!s" ?`ܐ2C,X9\5az X!坲sǕ̕Io{ĨPɝCgxKY!6=I+o ˩6 s+j8h\܆{=r|7Om*m m\uy.uuta:g3^GFrWAn Zqh@ao-|\KJ :6qež/6Qfw1dmU4pJ!Bxxf befZ$Ȯ/_C X~vrJ@40r\|l]kxwjar #~zE9㟸cLʊg˩r7Zĝ:NιdOYg%qd;yɧ6qUf%x+Ip Ht~gqH!=}9i̤ I*?:a*4F3k|R 턿]:&ba=ϼ>ۂrB麒 IRVrKL^$*VK}ȯ{)s!B2&pqKA;@Fvx]Bihm.r/'+f"+Vq;h]kZOH N35+'>o.Yg[kt A6z+S'>]sr R3yLSf>JRoSq j2iLٹ=t{"!wzhU/tRXa T42uX4kH3X>CRTed'AG~ZF[m;&w- $&X4$&@ME'QvCqgSMgMD&eVkԣ'el,q1Z^$'Po ".h"#9Yūr[5r{l\'YGBV z407Qr p4t.޳rz7 6v.ieWKughjwONƘH43ZMs$dM{3OU0n 8-͜01!?e\Jz *i&sj.cb{ۿxw+9\{ݿ2s-_p8eZN @Gbv, ^p-)X0#Iik]uQN>!(0@YrC0յcuP_o'#M@!BKɐtﮫpP]_v\!L88|x#seVWλ-]z.}$ZWE{~ˮj/{'3uU|ggO`+(L8KqKd‡ȴ:*#RvNһe\I/,cKIxsK*&䐟;/[#{S1p~;)םWV|ZB3yٹRii5Q;:pFigO21@I} ˉ n({W>~Yw*||rJ*8M&R+74n&-_<=ѿ}REcp+_rT9t H{t#].g3{w͚oN0e8 n)fŐ +o&t-Ws+In+Noq|\^@Wnv|1qxJ*>gm V2ﯝ͞l:'SU+Yo%t(J&Ae5綒{D89%UvgIj~MQLBx$[&#>֫?>*[l)9evgMTfM?VVCzV!1Gb&NZHM`\NP Tql I7~*㴰4uR G"27~&96cȹȚ9*8pdڔE\Vp3\\CLeZRiғZYoT؃3~ftu8Ic0c?әE_Ω\>:V4% &==H'?g^ ϝ#9{ s&eNhXoaտPhj."!s1 Zjpf1>AGKSXXmVuVs096̱Dl=,˘Yc9M#BHd!YEETT >ߎ纠@I`bd+CzL'˘7ڒ13˿23}>o(Lif*], MM"Z(Fd/>a ;5Z!i1ut|[')DFMcLJO7_\:wwO%o( Z`=ZSOlݔ4)Cj Y9@Μ`?1Nj~lQѠh4q'nOeI&ںqqS)pܜʄ1Y=UW%+s&ʙHؚsF0PqfM&ڐ8PQ*e0~ن$tйJ BG#;;G@6Ze2xdˉ$=|"}3df>4@ u3'v sgi DOա8rsst)?p|n"uGN@s$f̛ǜ42S&1FkA?zCo]5-fBK".aQ4r"y IDAT\b4sTہ]rKɭlӜ2 :pA,!o(6i/veк'`l*1,֊F;!褦ֽ7[.@Ѡhj9U[ϸt&d| 91l;ΙLs%/e&͝7h'4T51cx&eT5+(Eg] )R~FiuTu|_gΞfYtwpExR=I 8`Qp,@6U$^ߐ1g=s*C6g鬬Rp:1f}SN[3!w.im?%LQkOhYI=-:mKܳhHEd6}]PqgiZ:5.:u/&}4I:͗1kB<727z$3+o:~vT}9=\ʽLsѐڈ 8B!V;ɿ$r9S[)ln$ށnbi963ӎ=:fAUX.l=g=_O-!?ai6n.ZbWz)]R$mZBdAk[>"¯ٚ#8̺Dg1@]} Zm MF2261tӵuv|B+Y6lM[*h96i@&BAk;1㱽ĹzZjӼ?Nk6⳾)șĹ/.#c1em̚y7טshF{! 3aߗ?fM%=9Sxx}Sжi*H ޮQQQ@4sXңj&*} Q=%""zb !BG nOvJobf|:_(eP_wVy_) "<- mV駅cȟk''iMCr7@c~KG=NZOHᎡkȉ_y @'P4 gj˸"IcgQN{ZV$hl:ꍫىcYMM;:WuEi ywy{G_ϚY9xf|`4nx̧#L}>{+ү5ykvw#w\KM5gquד=$B槿cM--@\;oo=-:լSq6`T[Soaa:So7"Դ3-1 \n3i4gr/>AvWduX:l~M,"t㈶Dzc!cqbG'-g! W2-= ?vvQeɗvF|ɷ4'3Vnӕ̉3y'gQT gbqf]8ƭӖ ܲzP:@L)R}y79EVɌ5T9(BqsO`+˸[hxY[$`okqL#!fWw?{#iD>-节n:&l$ur-vvy WCiU>RAkoeG_Xkm1, wu }|vp? 9vurƜ3qKm=ϹuhU{:5N}t(h5ѩZ|UʘBV,NbiҺo+M\=4`P(0jϓ+rᎍܺN5nϘLLcW}g*":&d,]8K0rp1>m)mόީÈHV9G}[3yiD~7B!h~޷NR5q4SxfȸRDC;mٷyƅ&:&a'URL8')$"]gCT&QZx DaZB!b`x|5K #&d,lޢ?RmWj;%#k%YݥT]5(Qp,]SgO0;isʬbSS^ӿn(CRbvPkK9+[v 8;SeeE}GحJ('JvsOcx[tZ+:749l;['>FI!"4TUEwI˿ `P"pho/8L}YI6ʂk<&WfR_+=ϓ U ))׻OKs_:y|2CBȔԞB!3fHZXꩳ|xr5A>bYLsP1r=., u"h{B!b`* ̈́#JV]~+q,TN'ϤB!B CQMtalϾdLkkB!'sa2)b_!BUUۿB 6/B!‰&BK2B!B /UE !`nB!"k$BH/B!‡tBA'B!D8QUd?!l2B!'?!2_!BIbH/B!‰L'C@&B!DEE)ɿB!B1JXmiin:!B!B "^Orr2T%B!B!F^Ott4Ţ:N\.WcB!B! RVr2_!B!TUEB!B!F9IB!BQN!B!b_!B!$B!B!F9IB!BQN!B!b_!B!$B!B!F9IB!BQN!B!b_!B!$B!B!F9IB!BQN!B!b_!B!t@q0A!B!_1z-/_`QQQCp騩!-- ͆u8b!+++a|m:HZmCq\F uBKhIB_555[qp\K7a򯪪BPTTaJu$?bpԄ:A( јPrI+B +DIŅ ]) u4!0Kse*=0#!D _AOUUwVJsi[:!"<^6o4߀3VphAq$s(ڲ3. 4hޅ]V L8#ԡDB@FS˿_>x'_MeE*y/Sλus ]1x6_南*(d݊5)Hiso ;ƪ9~C-W-`kQP=O~9P^dK[&*"XrϷYd_ym) 8s7n22((0k&+qk}v[lCs&z 1IޥC0r}B"-b0i\.:XcUUZK=aj͘Jnf-Ձ`S ^u';G_ S|Nl=TWDMwoM[^Le|-׸e|7[$۟8U \?eSox}e;ߜGWg SG{o.߻Ƕ'[vs])>>Pf/i T ʻ P#v?w M޲lzfuUȤh˗:a'cz/ n~<ئC*rrrBƀTU gC=p TpFe[r𳝞ʶ鉞naŌL:-~|w!%Ŀ`<|m{緖e<_? y'XOBO||-e֧xy|nSpfղ'I_zϏذ =K;g:>[L&v({ʮ{'\BV1n&Ky37§ ~}h-K& j;عEmbv-y[}}gybsPbT?/ kN{Z}\#\dOtM~vIII wy'QQQC}UUپ};̞=ӧ9vJ"""ֱyfYjՠXVVFII dΝKbb"Nߏd"%%e˖ϳWG*owp.4މ@VVVra, iii,X~8vl6\.: {n-Dpܶ!-? />cot疗ع%>{6msA5[˾7w,G{:$5}(wravzGwz9 sÅly8@V1./v֧yၝLɤ퀲lzl+B=?!hz쌞[ai^x8>_cǎiӦ:##6oZ9Bmm-,YhZZZ8|0INNpNbƌ}&&w"7n :u9s܍[MMMquȁXr%gΜŒ3b͚5}k=RRR/%&&zsƌ? TgǨ̙3ٳg_~9GffX,z־Oq\:t{ztjV: . ob 䧿%?}k`R6۷4K}K[;WSQC\}OE 2rӉ (:NEPٛKn&yb/mlpi9m"^-~^ˊSܾ9>tO9 1:!D𕟟ϙ3g7n}GG~!_Vg}餴Jzz:{=6/^]I[[1 \ves8TVV2vX&Lɓ'uttx;NvvEaa!k֬ FGGjx Kdl8=ڿmcT^^N#;;ϲqyc8jkku TNqWGQVVVE!>>ϲ<;}Y̵F.BmoĐq-ݭG,ג6e Wep%Ml)>Ϳ y+roz,19*9AÎ>6mA9kowbÔŞwϣJwm_&+H2hi?2+Zv|?1퍔,_>2kg_"6=ӯ-dӆA7cF #ܹsCb PZr}OX,DDDPSSW\]^QQARR&M`ktuޤo„ ޽kp8HHH*LҧLyy9zRRRP~b_i{Cgϲn:^{w~;#ջ`f馛&nGVVV.t:">>ijj3AggX|}?~x&N@/]yoFb$t/(wTX@  W# y,|}k&;=ӧzLd k}S8< =t&yAX^|ZN~~]_k*׀g:S^dN;3 ~8l#o!v|H"ޠ^+?Po_Zÿb]2w>WF.ss!߹^>XS@qq?UלjPRr}E!''gCFF_Azz}||<% u:݀cЃJjj*YYYl߾俴&^{5())7o{ZZڀ8qs7z[###innlhZ .`}dddPWWGWWNsΑ􍇁oUWWĆ w+mܽ}ގnGף(SZZJgg0󝋾[%o笸'Wo)τoe;_≝/)W೬7*A<؝= zoIsx' 4w/=qoO$EŇ IDAT/OmO=`}|'=Aa!޻C#rDG_zvrA3th(۲G]#`I֋yMp@M+4v~yď^MA'(# !mܸq:u>ݬ###7X,0&:u*IIIX,V_bm2禛n&&?Պ(.m̘1~C|N:EQQwRn111~ :;; j,EQhnn3ɁHOO?P@:;;n b۱l~Og%** &N(^ }z/ t.vs c_< ? wx,_O⛿{Z<=A@LO7UƯulڼ b.o~=}b-Xz;zO-s<`)\>c": ٿoۗ}26B֭)WS+՟ V?ȋ۾CE 3tV}ٞy<>9edLE_H>rss>jkkimmEUUJJJHNN=_555~DGGW_a2PUcǎܧERSSIJJ"))(--%22Ʉn*:}wݜd2ݻYb111XVo/,:::trဉjukŊ]kײrJ"""Xvs[@ƏOmmɓ'Xlw怜 ͆n>:.l\!197諒NēCΐᇭ-X`N&>F n~j_J{k;V.30ioo!݄-ϊb?lx}tww:Ҧq6q#N#"BA3)/q ci(XQ ͌1|IC>㽷49OQFZ.-g+kT}A]{QXXȖ-[$"";k|G\s5-::y.+VS;JJJ1c&L_`0PPPh`0h">3TU%77{ױcp8{~w}mFDD Ǧ_H?f^TYYY,_"##={6~!vx͛Xlfǎ\.bcc3gӦM;Vauw4.KA1h ٍi(\?_S>Fb/_P3c'8"1RQUUB\.l6ms!Ǝ{Q{w6 Nt>蠽{Ccǎq7^p. X1s!ߕr}ﶭ+:z,66Sf4IHH|TUup[/dr(yB~ko7:1BA\ EQ.(w+$NŻ˔)St?~ iiiڵR>. 2ӧ{rE#Fr}G+u8#R.OQQ#Cpi,_XzC!*F# Ï/Y? V+r ZxV\ /@LL o~`eb$a/r}X̞WKΉ?}ei@ Iae̙̜9Ltt߲ 0o< zY8)-{B7R uL43qi 4{߷wj4"!5|cɄB;(J~e6iF5 1^>OPRΉ\Kc̥WWwO!#97-h\JCP\G[[$ɿB Ҳ'.Ɩ.-3]]& !^8wknnu"H !0)-{B7MwB n盛YmE#!ɿB в'p}wbs˿!3ٌQD|$Ba0ZilA#ejuB\¹@N̝!DC!#eO\<,JGp}hji['E 1\¹*FIb=q%o$\4jO0!.-rp:H"ɿB в'p}貪AKR8~?wɘ%ɿB в'p}pnZp&V5ш`-޻U?ݬXe87'\$NZL!J[03ICG;N;0L! i2|! i49\Rb-C`$ƖmYuז%}(%[X-{G]6}݌w^`HI@ P `Kr-@2pH`hЋ6<hX%t2h{~AsE> S|gW =AlHɇ/kb^9Dɖ9<9q+˒REʿf׮]CYD^MwG]1= {r- ɇl{SkMR Z% p>I9Wm6/'N@Z0)p8ynڎDZequ{,1n@0˞i=xh\!`k R->Ow9ǒFCN>^~el6̜93PQ1{='~jzM>Jyood}L>X㛾?^rJD&<[\T?p+yŜTȑ#477lٲcV۷p8(//oH߃v޳Mm40 GWN[)T^Y%z9}H^Z-}=N~*BenNizACnf:t݀s3Ln2 +0ULYx>-c8ƙS9;FpZIK)Z-.`2*3}A:9|Zs-0Ģn9D x:tH>o7~? t q忽ݻwp2}tV+۶mt2m4V\qG'lzr5 fU~>v?:Sk\qxwF]z歸mNXǣ﷠jI!~+љ xFy zۻ&>|{@/XǣwS:s&s۪_*,& %w>? k%_kְ+i;OtL_u~i~(߲' fndZE(}~²'d%*~oz}|mJeiq8.,ˀ_ZZʪU(,,̰2ox3-guo|Ona]JO;[QN!2>.\"=r彷 kofN`9CosȽbuH&lyApww!9%D9qԵ_ ߲moL2{e7b{_+`n]}^qpOʵ8(}~$i1[lԘvJspA% !IFUV1yrB "VrgmUY&kC""`pDmd@M;Y9NámGK/Ee]G6IdB~LմgJzhPņM3ѱM2;~Fϛu8)n;A&PeO06je+B>o'}v5E#7dH$ Z&9uȞEI!hnG$JJJ)))tТU]V]ulփR9U;Y1(l˙ ԾpwY 1ʿ{}G_/HTci Wߟ?L_ ݌3ThWp85ыAo8 Wx=5c/[7^J]  t˞`lt /cuaZA T˿JPF-3f̈yꟊ?x&>>bFIZq _ooRDRX)QAY{|h'Dmp=+XD\Omm2<kgFy}5mOv/DU+ B!qCHA9 ˖D^]V?|p}JYدAI D,jv N&b,(YbJCv, @`T08t'D TP(ʂ"xdGp8@[Ѡ#RMf{Z,;"zmYsD_۩H/ܤq1膷|h4ĴO4A#@v;榛nʵ(AZy=~EY,p{?Zq-e1.xhGd/RXX~d?Hيb0uQPK@ (5LmodaVeLnfqJ%U,WGPFyYYr~ QeOpXM iTcs0{,l{x&9s=)|yFAJlքm䀲KNT}dz@|n?n)/˵$P^kDIZ2Oi\ 3h.䠖Y6En>Ğob2MڮBn;'eI2@ `lZqu{,1n@0Qeo(]g_I&2CC0wכҍ[ }ӟkQy-a#E%S忯_~Fee%3g̥81n}G1{lM|5Ց#O`޺_!1&2J ܉]$I` diΒ$D,Ȕ)7X)Dt5GxAT:s- Y 8r,[lje8˹3ClG#*p*:|t5dB U ܇m=-oED_觬+T!Of\F2y^;-c8ƙS9;FpZIK)Z-.`2*3}A:Qe/ÆMIɔ\7[%mN4KhyR WLi露dVF huXA>D˿8N(<7b΃+޽kӧcZٶmNiӦrʌ;:>aӓidVu~\~Orŭ?࡟ue뙷9c߂F'()ׯDgڇ6j:կ]%6=]%w1Fw)V ʹm/]HnxjM?ֵ˯5kX ^ٴ :/:z4%gF"γH JHC.Yi(y~Q\~mWD+f9H(1P=p0q[?!wonnxՅbPKKKYjKE7'Pk{YZ-쨋av'lwِef s.au{9ta5WI;>l IDAT]E켈˯@2gs م-A^uS׊~7X~"Z=1Oݴ:Yz=|\awe Lx{M/Az qۖ Z ru0qL&4;.ww;9=PhrPx+[ ?!IFUV1yLX?!U<}\Jn ?kS{mHDd ~ZkMFt޴s+=voXtPȝn疮}?_xq2Pȏ ̡6#K8^>=Taft,ţG}.ꎟfc8nlF4DP{ (/oofgx7_ K)QAf[(œ mbUE 9[`;ߜ yW_9cq cy g(Yfa`|OzI~^5`:}W(ӟ@ HJM 4c۞CI*sbBΐ*7ešؐPj'x!" JDeEɒ%j*++Yzuo5̙Ysܑ^>7 0c_ o7pǸ|_ݵ&ʮZɝU&]`j DnX$@}O2>z3eWC$Ɇ& 䫝Gؽ/8̊ud!:=[-*\_Þ}ȓ/gGfE -d@wSgL =(ٲ:X/TyEts|{XcE9&G:[F8n/e$3'b^G$+:N1>n{s-FޠD*-s+OVJ|x1Obw! U<]w8R\QV]φp8@[Ѡ#3mN>LjBR%hN?_NP;{OY.|2 ÁL!Fc5pT׹I3bE]f'DQEɈlO<0X0+l9`٧WO %F &#4 ݣ\]lvqt2P A"f+.ƺ*y~+6\q:?_ 4 ̫@~/ rp%v!JS&J["m#LRL3VӅjH {Qhok^ v^{E>` T*U=Ԛ % F qEO$cAQ CoK .>'{#}X,tws%U M;P6Nc|m 3xPD5%sfK/q z}"]ǩ9S>Lp8hk4u So8q:QKƸeDGhƎV_abP%`WW(gDpfNBl$=l6+*ȱsO'=O^UX,]YF0Zr/c٨d̙'ڭR]٣-5|A~iRk>s_`"T^4iopk`t9; 2(t.ľ]uU)+'+f"%?5#`:CyyH-yG$;r,[lje8˹3wx.{WYUT\8>pL*у_YCR6ޞjq/SV*ˍtsH3g3,2&7jkwgwJd9h`2uÔ9,^XQb+hAl6ΜjYD4cNZNjq)WAŜ)+ÇgRi/8%g}+q&ZcG#y:?J֑XgF$-ni:;+fPNX,fL&3g~VnʅCcyKƕvv ^ӱZl۶ ɴiXre]M4D~U~>v?:Sk\qxwF]z歸mNXǣ﷠jI!~+љ xc~Tu mtݛjqbXǣwS:s&s۪_*,& %w>? k%_kְ+i;OtL_u~|9<|iΟBX|N܉ܤʲ*<Ήa0-ym*]_9VM+n[׹#%?M'1ZMa. WH*z8)DH7yyWWe@/--eժUf%R OQ`,Sy-Ԛ<,^V{g ; ]6dYƧ܅KXs^6A{ܺlXɭ@W.-U"V,Ğ-q:.$gyN]+E`-pj$c?Wv,fr }~⹠ @1+Yxp9Z/L*2 i`9ӛN#y؏O2RNp2_6P-Îy c!H`NDވ_I!-O#m rC-|HhdժUL<9"OH@O>~>k7^Y?W\J]k62c_жc}#f~\Ċ._Ac%!2@!?kn&jZ3hv : b^>=Taft,ţG}.ꎟfc8n|m}b(-~!Oњ?>7tMMM߿ٳ[)..Pe/G3YxL=KWWxǂK7>}aiZC<2b/1#R ='!h &vżsEzYC! e}[vI())捻$~"E:X9LrͫKsD]MӋ"ܱ@+/ Wź0ֆE/8zK) K uuM3aL8fA-Bn\0i`|حÀ*ػxS1&"uㅑ[DfoAn9}4v+V`Ŋ,Yo-š5k1c@HQsJAh:;gLTvw< K2TeLo=zMnJIĆ]6Ɉt㗡Rs%EZۛ5 n{r0uD|Wg̈MfRZZի)-y|ʔ#' d***(/oofgx7_ K)QAf[(œ mbUE 9[W[8i=wql<:!bחsl<97% 7 oӛغi^@8`sڋLMpLA6 @a Hcc#saΜ9j,YBKK ~B>XŇKwlmv$^ ;f}/ǝJjաfd*!L2먻GxCl 9)mSi#>YQ,YZիWlߞdr::>&M᾿y{-[ (/T}&tsͳN>~evך(j%wVtR1$nco#(aYJI5m6o`4H' I64aOnvad2+=kXoY s} {#O[I2ʎpiM1 ٤`0ƍټy37n|.qtz\.N39T^?.Gb7RӍWJovTpK|I6tFn"JΜ9~xLjBR%hN?_NP;{Our W èn5pT׹I3bE]f'לkTQ25vh4 9L05xG1RE2b <$ p뭷yٻw/s`pXgZM0$ %<j#%~ܮ8/e3[;lSX>?$#18Pv-b^wvt2P#;|_Ɋ&dhtRbE%%VQKJJ()*@R OkϽZa}G?^'0`(C叾&E# J(*J,@nX,8p¡C8t\xz:č7ȧ~,˜9sYc˲L}}='OhmmEƴO~ #}F>`W9O%|ߢ˦|`gByxo {85э֛Og) Ƹ (BlUt1x<\.uػާN _Ӂrv|6F*_ Ba䍍~ .=.7XaYG0^_hkk+9s"1~uCDJ=3<WL,AO1AD q3V˼ .2y)*~F^z"0wu׈甂czI2k.Ȟ yF,sfXhՉԝg<&g;:i% `>24x>>X8-'.Y:x?:]Snw7#7d E+nI-eyd=EYL dZ@ @0dҤI1կrUWz)**J8|p.r-~$S QbLo4Wru@G(V ov'\ەZ_Jo W~J@&<PMdhmÎ%3Vȹox饗8qz2pWqjj┇}a:QWWѣG;xɭl1t{,1n@0Qe/=kH4FBu}LŕX ԜWj> 'Kɑ+&HlCLvˡw~\9Fxܽ1YsOʯ`89c۶m8*++9sf.ʼnvTQ盃zzAFKe֭kRk//_OɄdDF1hT}& zIJ\M!f&ʶmp:L6+Wf DMC 5ԱZ([C?303omsz:}VO QSTu/_δmvZ"ߍ5lXkA|:}i;0VUd1a)oc]+*XU_pM۩~j/c¯gH.ΡD^4g۳ Cݏ/ m!EB IDATz;OHdjY]i$H'/;8?XID%wOHix{4nGۄ؈ &Hx4%eWfY"14?ķ# %ZϻX,ii)V0q9 i0S~r_WNϩjMu/KԽuѱYm.,La%,҃n/~Z{ ̽km,[l{91;/b(LBrvaKh9qԵ_ ߲moL2{e7b{_+`nE\@ HBro~6= Xs/D'=8?H D6IH}7|iK?QFѮst!2%qAA$ ȪU.b%7|FYo)6$"~ [kMFt޴s+=voX4wMPzsu\Z([~̈́YMKyPwJ\OUl0Ky$cgY!"? %ZI܏syf*LWd$D #b1NJZ09%ZujU8T,3X{-IO7L{0nJ<.9fyЏWʯ@-V}ݎ$IpwSR-˄ bj8Gd3]ʙ7/͍mՍЦʊ/c9SW^].ϭ?㟑w\ PWׄ+̈́n*4AI_0i`|حÀ*ػxS1&"uR3$/(ma;#Sc ;dsB9TVXTHXmOKJTԼ2e9aIxLvLRn69\ `ߏUJƕ3bwJKKYz5#:m:rp/9b.KҢ˾XrY፷`I,,(lFeill s"z3szVTDnMNqA{б]O8膈]_bϱ}V3H,C8n7uӼ^/nqse%N '҃xr*m7Ph|)G$xp܇>Gj+m3M`Ob(#aJd2 {!N 5(K,AVSYYիS?U.9^g3Il3|S>՚6nz';]k쪕Ye`@KƐMeK"/oݴwJPV%QAI Cy{ɬX0 JkXoY s} {#O[I2ʎpiM1 Dhs* mvkpÝ;Z$QȮӮ+ݾg(W`tTkTl JD6eQeb% OYsn d7̍7 EP;~-w6Ulx{? :0(*U6deNt Y.gb5fHW?k뫯sƁGgĠzNE8F'҇czI^poon2+3;#>yr .Wz\χTȉ#=Q\&Fv?6wdA"gILq ?`?/0`0bjOD2 Ĥ2dcGI HԾ6i.(͟Z uTo cnbe6?!)7ޑCBÕ|gIQ{ p:(%?J5:J ()2iFp陷pQz[yL@ P JEJfx_@'h;)_ dmٔ7BroU6?H\0"߁ ?M#ͱд,I[rbMp{)/'%BFc'eTj?PFyYYC ̠"J$gaлJ8٫w|i6rIJf$dq̩M=$DMHwOv+hd3J/ɼ:$pw3/FNԛnn[uD0]=2}@ P>JO8Zވ{ |k`8#YmWVPJҽ~y$!5jkTfQe?U6B  Gn^|cI]rgƱj+y~P, ' x Nu˕Q]M2oAnȩ/f3gRj>Ju#|d{y!~n9u-տC֙1&2JEcNmaa6weXtwǶ,Lbc%KrhL}(m~P-aD̽ r-BFIťf4 (;fr".~Q'J¿#G̲eYVoߎᠼo=#},2g8h`VENE3lSb!JsmhZz U|r#ݜ>)Ҍ+}w4I,r&߷ǿƼU2zosc4j0a/W1e\gV 6SgN,b U±ke'- hɔϫbΔsDiuqS8j"82kp@ o/T>6?DܯOf= o07{l SY P E(ý=x 5̞=c5^'éހY n'<&&6G Gƕvv ^ӱZl۶ ɴiXre]M4D,/*OK{Y5فB<; c=V6w[hEZ?EULY_ , txnJb4ärn[K~rW%ń$Png3ucV}ev±W6m: ί} o@ gg4mOXǂ&NzVBG^- r¥Xb\r`j@pdP nOϳb Kihʿȸs`6ᮮ.,ˀ_ZZʪU(,,̰2ox3-guo|Ona]JO;[Qv'lwِef s.au{9ta5p7lr͌ .r/'fEX~=[t]H.l 26㝺V[4ղI~}Y{k C9rRczGnhɜ 㐂XASJ&tvTp9RskHɛ<6{(9=~9q)t.)hfn'K%Gz< (/bGJ(P> ZߏC$F#VblAZ?!U<}\Jn ?kS{mH,~t+m5QбzNV΁ӯph13?l.bRpղ?Onj2Pȏ ̡6oIg˧G*6lzyxhE3zެyM[~Aj(Ͳ׏GJv?n{E% 3$M~14i>d/+P( J Rw)yRH51h- YjM0\II=g,*u$k|ɸ?ڪoۑ$nJJJ29hU6@GkW#>>6?z Tμy|inn6EL/<[pr&0\]뼜:O?.'x,-5n̈́n*4Qp85ыAo8 Wx=5c/[7^J,L4^?- '2vzbCPcdV[AbRUFԼ-AG$T\QBm&hY8!iV|%X].|qƌ^-^J 8+Y (sɥ(/oofgx7_ K)QAf[(œ mbUE 9[p7lʋoFJͿtv=̓"v}?Z|#Q{q?z t 6k.+t.(ӟ@ HJ3ڲpb0:"o:Ќ": [9}姈Go/"^}#jcYDyl&e[$f/g\]Q:e: YyUlv[Vdik%EyvL(i~8N7=ܾӵI)fI5h>ȿ5 j!v%)ʈQƏD&~F J(*)ZZ8^RRBIQ*jx*mv^{EvךEh4b4ʥ'0`(CEHƂoE%C5Aw`L4^?,Ȣqyď<g5.gAѸ#'PƶRp>zR/Tx.pKo{;}ڲ-ǎb'NX'mC@a{'B)+0b:i3) \ mh3&lئIm ɾ9Xvu$se-9Z,Yy^~A99#TOC-{JuFFŗԊRRcJJB( lH?DڙCz%&ijA?ј*b-j\bٙ|^-kWI"&YHc3N|^da>g9N}ff```P~6)J /EC GQ\ٔG\Ӷ`BE߂i}7^ F*]M|#>%P1vpa=mC *]xk"пdHEH<5N!Kː&R<ȉ1zk,&,,9 6 S]g߾}HW`^mE@*_YQ_"±]]tu%`q3EQb۶.|s k`0Sd/6##CS9 {736zZJUȹK-C-*JnDiFgךSȿ 4>1uQSttM6zdN;6~u揕xqwpwr;xzG/{XN㌯u f3ze* 1~C7I.n2PjʹA刅}ևBm6}jR$gd4^h)NQjN[P1p?eYL]UAyL/lΝjժ<O>$~暪;{Ybvu',YɒSb%@aZ<{9 T^;&2tFX,p-NC=Cu> u89{{,i> -8gvgsmV\Vdq;z)t,]’E-ck``PIKW9DGg29_lىґԘTOCnPYD>ji}H\W}Xe"mP*NQ&!h׿4 G1j)WhddC"7Eѿ6l'زe \pmmmx<x cUO m`ہl^{ͧ/нϲ9䎿ZƑ ÿ;S7bX ,1V̦Vcuo;&|z&,s1R.tou^=P_nOAr/9Kh8k׮e^{'Y +m˿ȿ )")/4~@g=Eb ZXMŷ^+BOCHCIpUԼK 뼼kgG)b'ݳ+L,FMj2S!皈őf̪ jO{zi> Yj9Iv`㺋::;?1;a.^ix+R z$/d^PH ?`Mξ$_+`Tn"l d@ U ? IDATKl_?vb_q9]{O`Ƶͧh[n f MA5>X L'C·P9G8.+*!ƿ(XbmzZ|>u~gc+o4ԗ堉ptd* .RřԎRmPg?I_tu\$UdM#6[Zq֭DQDQtfW-av[9\1\Kbk҂=E$9gǏWmXi3^'o1wpu N%U\y`;)-Ml8Kjf")FtGig"3.4}=vG9%Y"ز6 E^sӖUՠo cUIKąd\vݿZ3X4'Fi7-UgF}>(̍7Hss7Ұ`KnŰ[i.Ӌ3246V x^s㼯rFG֛EB4|b9 &+ux/hcnA0gd(JcƯooEk?|۾/]:mӫ`ec/Vӛg*#ԊWDCG4G`)zZkɈ\Uf?W%?pHv8F 8Ϡ5"CffHr$< 0 U7۳=UtMDp-L"3\IHCCoWD74j_AEIEcrq\ +@ W~2x?_6= 8ٳy?ɸȖ'7_u38I\>fq=6>zƵ,q͸$T=yʻۜN^c9(ģUGaÑS)0:VOV)H"4æ\}G9Y(μ LE.R(z".8j҄Yˑ((3EI[d.ߙm"zgJ /Dgg'7tSﺁӛ$Ú7I5C'j:ٵD5".͏H3OAxv'eМ̀KXfWƔ|:W\q^ziV18v~q ,Jz5#a)Y .RaEQ}~+i ʘ۟av_}>)H"X;LJH4t&?o'廿|~V'k>ֵ22p:k7lo~"ӑnsrk7_1iDQ!y>ʡ"T]zL%U=óK%)^6h0*]``HRZܥGO"RmİoWd4BJO-D|Ў PH̴ΙǛtL |YUhPKC v%!&+8;Ol;ƒr0,Xo)G4H~½D E&F,M$TgP:F^FpsmpK3<뒁D/LY"PWOQJLk턡!hsYJ6 >Xu.i(<( Ez4}+<K}K[KZ`A-zluJYY`up4LgeS7>RiDfTXȘ^V&I\>D5TmWE)o9QPppe&1;"a;Z?"%)sm4[ڂ Lq0 JWGOj)Hy|Cٻ|zW)^ZT@X~je}ЊF2j~}ĽI(bWhdUɥ]gL?qVGV/Ju6# 01]3_y}/XȝW_CA-Kd/P\w@JTOɻZH2O&e]F{pTO@]Vײ%1{S43j3::lNF9֭[ ,\fb6O+TOլ3Ecx(t!-ݐ/^zH"oԫ,rV&+=23B2xJӍbj}' DC(&XgňOtIB!6oLoov>]v dLE7RF<\y啬]vlR9}._ƿ/hLN>rK-AP{mT^zNuE vu.u3+;EbធqMN;AH@JX%<?^ fEEc'jn{^qۇݮ (m.RFEI!Nb۶ml۶~oE)uE!طmۺe̥Rs{*A)|bVYh-d2qrQbGQ}N/襦7kK%h&2 ɌRu{T٘2;lSA@/l5>h9*xn恻ǺuXN{B%p=[w'qVnS0< MQR.heHByb_^6^Z릦fvr7-)'"h{Xm3!5MN Jqq=[ s'vgBNqCXV?LmΝjժ<O>$~暪;a9~]n,YɒSb%@aZ<{9 }B;&2tFX,p-NC=O둧= ^y%޷^cK{\Ã==4vE| N@9XO+s}{ E+XYPv聃F:.aɢ50zEW^Z+RaY1夙L&dY&H>Rӛ"<>!}DkEX_6e&a66: Y>Rgz3>$ȟ`X6eGPPc5QdyMS)TCcgwBZ5&9nX8DÜ™Aꮵ'NeLx<x ~?cUO =}_mCx_1ӻ;w~H[os7ͷ,[PDHd'_Nyws <9r/\ǝcw=nk$s<#h28|0筷bwO%ݷop^IKfy|}I=xX,YkTfSodz?XuG4j &ńOFds|ߢG]6Um^(DB5?_E~r|ڮ'ykd쿙qh_z4+>|]̻=|`QGcCj3:Ȉ}=h'te<JՍ<Z[[Yf Um:c}ov^}2S Ccb15x`˼qa켫X}ݙlkvXN3-Fv N.&y鱟pH^ՀjW/sݕ+wk\>|z &fafH1F/Ɂy' 9U2R+E0X6 :YoD: ga.rrr^EhG8ٌY׉fAqDB(VkL4EEN'7|3-M*/#wMx<2<=W"+ybzN%Z㞯,m\g`:=Hۗȿr[ }'_c"8OܿSy|2'klY ~;/wq=p[QWv5~8_˽o |U9Fe~u=K^v)lݺQc{g~E@|p>Jˊ|ٌg СC|͚a~+ϝW*8&o]w幟gHe±utnF;珫2~Oe?O*e.Ÿ}z^YǞv[>w'y띝YANm![n6`M)_׷[TwHf-_iʍ8ǎt}\ 6~-j'{߳iڹ@QgF}>tYf  1GN|2UҥsX@ۘC|ٵ1=x,"8*Xc/x?ci>! O$Xs)s㯷-X{䳊Bx7U/2(q#_/]ajɟЀ(\ zMQN L(s-CcQzP\}y8&Xi0VS:25>XMASz3_wDҵՉ˯6 l%  G0ChOJ")NU_Q/j3 (!wys~$ r=˚J/w55!Gc6qr4 ^3?icG{xsf9܄} y{]r1{sN㸘V6~w _sv¨tˁyس{mߣ^'HZϮipB=gcw_ClC[~8fzl#P>~7ߟ9sD"444>Qj3U%ҩVsvcU>9TH,18 :m_zY^&tD-ΫA.&opc]e~Keý6e׹JuszC}#5&yYsɪ h8tnmI&]nW7s"E/f 0vw 2Ș YǤΪ.wo7w#5=ָ+/y<ҟu>a2T{j^xL[-xbvlHIA3kto!![HIDximf (wmѮUAMi~HJƊmhs uXTxxorTb ˕̩-Q(VֹGFFv7n"" G #S0#bVW\q^z)6[aog&:L±yoHXhjJ#yŭ~tXQykJ䂠2gz{*S/`U1vjWᵫƎwt$9o'廿|~V'ظϰuXO1BNgmODt:ҩ*޹v8NI!ѱ *^"{6cHhÂ6R$!_3e_MN}^n$LbԴs2]kN}LL"Jߨa}!.%#Ѳ9i &{`e{m;1sq;9by8 @^gN;K-#QxS\O`!@YRaJ"q=,] RFim``P&z쥈HmrJ| YL`7&Z6kY0Z2@,ŵ&{Kzm= ESS3=LBIaɸms?Icn.9XY'uEI#Z'5ʓ[:Ro!@P.{.B5$AHc2)jEr˶~d)MK]zn l t#!Nh; jÔEgWrʔ_V gb`03Cd/|ZNI2S ) X}S / *! (jZa}ɟP? i.ߔm뒩;vgd$9YbNhjUT ʽ2=?b EՊR[rQceAVü3ƧSrSs}CdBpbXRyvcO N+rNu\S 'n%H,qaN3cG냚1xX֑v2dr sΛt@z%QhHb'|/JjsjBڐJ0#rxZC׭sb3;:)yoK f2Z]~zXs\>BCMK))d=sw[]x~\<L7Min@bU$]ylvX`2>2D(p,s[\|9Kl/7T>dP(;c""S{9X^T9!UѿrL4ZxL/Ed+v#%,^X@v&PmN1f]O׿ň>h IDAT # a.hTWâd; {.JW7lƿg߾}P!V`^mE@R :YR۶mW?R*Bo۶u˘K|Ux]َ"{0" ٮ_ᨔ͖~6Mj BCN٪ڕf6EI1VA)uV1 C9w ~rT{Rlw=_^ȈrUJ87/PNB|ߵJP(K-cBh_jji&^/̟?bnb'uXpaݺ;C}sfKT.vׇws٫j'!!{s蜺[졞3Tï[2 /!m.>D#?IHh(F7hu)F ϛbfcI).k;W}Te^SM T~92ΔRnU(?:zbKLCD3q, ϔܹVZ5'5\Ss+vG՝\H,YɒSb%@aZ<{9 }B;&2tFX,p-NC=9"#1 ϙcxB8fвs/ihY~6іieQq`/AhK0 n=p H%,Y2D1ew8= *h#Ӎzsᖈ(Silt2O1v`"!; k6%:>E掌ER )-P% &ML>*fz+l/g <\j^IԄl6;(1Gorf)VJ+4*YNtw\,DSzQK 'N`˖-\pxx'̛7իWW=G6ܷm޳y_6C>;kG*x&CO8b!*&hhXy3Zս{xg~plxwR럍 t?u?$oDv3xDhMxgW/q\]5[zGdݏ^7-"+~d5a15_zsөLΜr L6|0%*[]GWFY&9Кj9)9Q8oA'GzXҳ1XX Bn2Q V[ ݅!oҀZ֍2-UOX}-{Y.g$Eڿa7`^:l݆Js{z7Ё V֬YC}} Iv`㺋::;?1;a.^ix+ӻR z$/d^PH ?m67 |#Xx2ZruaݼO8$Cb`j@^by˹;x5}o>@Wr3_03xM^m?TZo3nP24؛TƂu,̛VO GFG "{NBjF+mv%<Vu-]>Ĥ[B >(K씈Y;^5wXPGe;"̨Vvߋͦu $X}?SY%õ$=,-#^ıx{oի6FܴV/CO{xŷnTnR׾DW|?~jKc_̇Gg4JߜLz B(17iNI209^'չ"<#W 됴Z':OFBs{7(`3uM!D#,<FiŷʭU?!Gp8&io}f?0zng{Z[[馛hmUO%؎M'Et?Kc3?i?Q}A4vO(Y300 zPN GBBCtB!ߣ7BɐHh+E9=~2*SdoCRI)>!%6tHij Py,&a{dTF O+x4{IZ44CԄJ`io8=#՚V1 Åղ&K<Tl#v U6͠| 1LtvvrM7h_xG4_k=ry 7ys/o_-o?-;ܸ]V:,ԛc1sRKV]G|e.d**Jr`QbV Yu NXs!VVYmnƳg~ #y؀Gg``PKg9[0RÑ.3ץ`֙ k%ifgcr2a,}K1uMHBCBc7oTkT@ ",l'G:5r"y*m&b)1NL# &gqᔢvti#VG11hN:ՖH,h`P]W\^U_ v'+3 Jz5#a)yŭ~tXQykJAeϰT;Ao/::&N1ݾyā|qOaMq1GYa3,8tCk\O'1'(B|C5㨴:PTSq2Wc عig%B:ji1Mm;X<{Eٚ$H8$ha}8|x߄̦ M T;9(bǴ&,!%Ϛ"^mS_$ߋp\[/KkF4۩Xm'<П4}96Rm[]8^AMUT _Ainnd2a2onn 3&W?[v|Ιp̿Mf +#i?9חLC f#e>_hHM1mQV=EHKcr1gp:ReNr0gmSuw +~}FT̉aV$ڙH><"!E=W^1qimLJTg6OǾ_O)@GDpY>яt67oE./<.&ӂa6z͊:Pӛb4v'4qc':G=/fFJ>RBħ~uF|rҐ:{>2qQIvuOoC_Q!&/Ox刔 Dϩ21=GK"E)jz%&MtM$?ߡFL=ȥEr<_Nߍr*$wN)DȻcAf*3EQҩSr2.Wi-jsw${{ZG2ɷjltX-uTk/XT$_#d +sx/sF{1 s̞s _|mR(VF)^bJlӘae.vWQ*Sx,[FP1FRf‰@hc[AɞP>U= 7Jl6;b{?}  &xbfLYVz1! &oʢ~z7p;g9׮ud/eb:-x<Q"Pwӛ]"Yp!Wd>bT]N.NL")$DVcF,,rLRo>bb)^¡-ܢIJfb*A 61pl )d߳`&ڵe2<<ѓ0pFhIݚ4Rmg_x>k[H2 I$s]fRqS9H ZڨQ:bK|j>wTD:l6jy!ԦΝ3o=48[O ;W#{‹/ȦMcLXED/dҎM PԝFs4D#RsYUrW50ĥ[\K<;i_}x~#U5[H a\fQ,-U׮6v{Y*gonA?UU6Á(`E3&LjiKL=?2GpH&MMl$8 57 He-1~!NɁM|0kInsջK`Џ dgqⱴ1_g)*҂2Eѯ$DRG1[툾!+(ƫ )un~k>! Xg F8II泒~"lڴ Kgg',Fwl>+mH{ӻYn.5?xr &nqӉEKj͓=! *35 "uFJLG[.: ͽk>?:֍!%7N-Rf渺!꟫2Hׇ቟8>X}'L,۽b+ BЈdxDp74cY%:Ą=ydWقǘtAlxtFt}!vfu_073)ܹVZ5'5\Ss##Ǐ;N^d%KN(݇bh,hCLtb1=6bat(>kpGi;<3lyg3({{,i> -8gvgsmV\Vdq;z)t,]’E-ck`0ʼnBxp=v^@[#{)y?.'WRᰝsT (p`R*FjcQSj3cCBe!:}CQduA1IRʼx#Gyb)P`)RhP_fkA;>3Ws7yz~Q Q1A%FʛjsÄ;i[+N-'iW` u3{}'Ⱋ jv:ڵkY󹅪yIezqJ//?}ﴁXdr\z0A$&3kSm>0bMcs3TOBW=1|~4b$C9'bdתchRJ JQQ!!L c->'dd Eɬ Pqa/yޱ֊ "?^ $VXS͒^lqMVtNS21*P4P[Q q瑜]e7߰P`B(^ՠzT='.200ʚ5kz o<#s=w Wz1TĂ^$I"jna Yay?/`|խo\@h N.&y鱟pH^jW/sݕ+wk\>|z &fafx"ĈG].bRw|X*=<eةo^UۓXr JZ hBW{l(;c#.pdcr{E%=ZJ̦"SU/s ߟ.;ZqQ{Q5ԈiБoӤG?Ge`~gt!7]% yE9ER@B~x$8Df5I J;62udg-`P]֭[Fd͚546V2av[9\1\Kbk҂=ER>R1t+7mxՋC|^~-8ö`f: \̓lj IDAT-Y6<{F<.}W]4}1o2.{>`;l`0p?+5jKka#.H8lv1Fo41{0'y!\N;( uʤBz~ݘC%K]AmlMvFEEzZOD*H}y:aCJ\%ݙLv(xx(WK$AahR:"WF"قsEH2-3df ύr:xe(EE#NKZԄG3>QinnoYDe`KnŰ[i.Ӌ[2@Xkc.Gx sT,vEQ17~ ͅ|>FTck?|۾/]zJfA"V)aXBQٯ_^|-\I|ᩨIQ7C3TOTTfӾ4&o)(H*)OpLm3|u9~"˙lww7AQ 'v&Y~>_kŐ%HhW+"''# #hĚEc5! F]*=s/:ka3RȀR+;4Zng2jmm妛npSvrSgipq'm =ʣ=yG_Y Є} .>J'e(!/RbnXb e?d\_dO“ʯ>.<[9~g6>4yO(i`0E73^:bؓt!̗Rjl^ղ f:)H֭Up|}͕x_κiod;4ڋ냐'WRhk'R[BG %4|7 )[Lh2eK<Ҋ_4;v`ǎڣY~-l2O,g9f8V'+y4ʥ~]uywv=ne$)o{v.; , 񔨠IM ("hԠWPuccPEwLϡO]ꚮ5}?5TWWWUWuNS>=Û_{CB]x6r_[c!=Cug(>kGRޟȾQZ-W\eqymo{[[(n9Wʾ?-{ן78A<$g K/ ./g*}c;߂?(P>.N^ ]S7\a}!1RVfmb 8vlIPD?`G/O#p{pwد|@;O8q̺B6C+5Ȟ`MwlUeX(@ {1P(|2LG rX{Mv=g#O|a3l7ރntӿaF-+@ Ʊ`ƍ_7G*<iaB9PK P\ڋK}%^ F;Zf׆o`ѬץV{2McdNCxRg1Y4^}w]/zn(ȶwډ,.8g(g?N'G|0 TB~ ΫVK|_۽sp'-k5ނtpn[qx9.sLNSas5y!b7nzWk7Uxsfx{װ8WOOPaO\D޻/ J~;M|Hp(d#6Q V _a~̂eY,|ppY ì.N'wI/z ~XNP<3~gzcfɟ|O ŢXMeA~1^#{6:!W%VkU.Rc-} b%ONb9zVT ^M3g;y A.7ZnVP=#@t-'E#񚴝/qޟ-ufI|hRQl0)'_|%#wՐ7t/Ƈ v6gtjC1c{~+comcr݇oۅ߃|K38_l 0٭. 7^!<\>2㛰+ȫ Ϋ =v>;q8s1wJp>]}~~pk 2ף;^,6$ Lbsܵz[ 8%friuT^oV>(a| %,Tv9LmvYqޓ^-dQֆuDL%R ۟җnn`gN)ہbӑ=IZI*%HiZ](jMq&Qp(~K'-`D+E)YYBL6^՜/Suge׎:y:9>h*?_J Qrcs?Pkprλejs*#p_e 0ޙ+(J Y3niuM w/~449Q7䤙IVm4GȤ7P ">o /zqTFVEj=l;#oK/ Iѡy$kAд %3q> +bX %8yx|gհ-[5D 7wt^`a|yo_wv}nqnF)@ً4aIF J;A[cfu\<p- I¨q }7~߇K/WSٗ|DsU@W#s#J#`V[j\y# kЀCA;MgR urŪ%& |tǻ\h[/%wr~.j0ё8xwJN'eD`w|"ZPrTNCV;0i#[Wyֳ-7Ǯd;ŔsʆobUbUמ*U Kvljλ`@lކZi 7?2@} oݹxN|܍nxJ XOj$Ǒ.< ൷~?v]oPlR7Z֖&``sAyn'qvv{N\Lqy V@FGonI쪡# ay/1H lC|;q˧މ r&=CCXUG_ }m@φŦ"&bR\4㙏KVv4BP0M{x?:D>}M-CG}YPek}y#v(N8kIةTY&_`쨱fyhje=ګ]@9(Mv;9>{/ƿ5G %`t)Qnw | 66Q7ޟ.R<Cex8!!nDsIھ}w^'qM*c_ ݂{ _l@ﮏ2]p=6^\w`}x`sK/3?7W} ?/92G"/j}?.;{YN8xx5Z'.، /A8//Rzt9=/~]\s ]k<'ߟč_}.>OoߌgS/o&kElL;{;(uVjdZ]>Ic*^ekK002Ppf\Q) ָfDAdz}Y;)֣ПDLnѪ qy(*eПBHc2Qũ nބѭ[pbEòM}a>&5 &Wc&WM]7`.׳9IW㮉Ҵ^kPg!(_`f`{oHވ-_76O 1=q侯bEiT'1Ӑ8~놗t7x5X~}d8X V7os ;09F&rXG;٨JUȋfUay.xw+OPN{$?5pIR۫ "`ݩ#CN|kEydt Rdw%D$V^]NGwy ;EDi6+59L/GeN;/5BUúo_U;k/u +Oe29[#;:)qAK-Ԣ>Rky.zם.mwWf&ⷍtxXi!.8)1cH+'q>scVY_ȿZ^UaϜ'aA15) _4g6AFvC_)w-cp5,/1'2.7JˍXq %E^gFS]7}տZAa' MɦgjG:[v\ "2FXyW_iixvØM iו!ٜ+M _y<Ơcp;̦9׃WZ |Om! WsBPրR߰+^EDn!ozjSA< &G\JyGzI )Ew͞GU:{*eCekMg<4Wr NOMelQ['u ag)iޚ&ҫ址1뽟 [~D IDATo1y*$iR!Wl:F& ]^umpiI4l=c;AFx O+̔kQ2rF}b b}`T/S.[ |U-5k+ ī^]cur|q$"s0 |'⼉ }#_/ RtJgSOH!WQY\V>cl_Sv%uL$JL # L2_:1ωv طoyT*uYx @g#GࡇBX^`Æ afC+??؋Kw%X}\75Tá?6B#NJp7M  qӠĹ9nDĥ[_(өA*<ÇiE* O7'9܈9 `c(׀ٚΫ]tsά;l$I[u\MzP73Ο0Yyƴ~.j6gQB;|;7,3AObv>9]]i9Dxum*G BY?17~7 6a;^WoƍqŢkaծ٤Ri(;m’{iC `jdžu6Ͷ]Mi&Na' d< Fa.6.7LrIL[+qYi97}Z zxd-1u3C1cq'.%Uoz)iώ2}KHj]kror;cZVm?,3u Ҵy 1:[ˊ"tjS(\.+4>lH j?-[`˖-`YW\q;EQp "rUzUg;2*+Vha8Ve+j#yXuJ5DƯyAҸ/ ͤv^%9dc(C._DHbJd4Y:`Eﬥ3)I :^"A.EVWof>IZffs`k:Mj8L>B5Aiyպ/ kZq(C 5s9K{n]%4 T*RbZXbg?dPdtCaڗ< ɹޏLTk Q/uᶰ\TS` 5ܵ|Pr9'?A.ݻm۰m6\{Wq849M4 O=8Ás1ޱyǣן>v_?9Ցh/[c3O<:k ,Z-ņWVF|ت*av8&ӏn].,#[5 s2,px֔BW|ݭ0a 4|>(.eccu1gHRcۙX)o}++|7|38={^G? M[\R>W/Mi\xw~C ol|DC%?ӏ3`.Vޏ;jyAgm~,&X?OJeo>]]WSowOò͗` Tلm ?|v.OqL Bo:2~F|oU$1 ޅcs?V[yq ё { ްSrm/z^W'yitN=/]%tvW \rq{Vgmo fE\vxwY¡I?Nؐ)`0nIdWp|hmDk͸>by1sgQ8?']тy vz70MF)J{ꏓl6ݻwCO? W8㌍‚5!ݳglApYg_ 2[!hfPwwۄMk)Z@늦ma J5պK>~»D+m4!K;6Pos2i0h쾖8/⾛-S/Y+~5ϩX WdP4z*WH%S#h2؆?(<U/:^NDZGEIAօGF!:a+]kЧ>B~wǏߎah^"0╯|%/#4M\wuׂT):IYZN:L}.|4@ +d k&Z4j(:%6x+2\ǺjܒnT4˰2r=Nlt9 B)75EsQ T,ApQF w?#rR juSJוŏX`dC0NxyB>BW #NkTd3GWympPPBt ,k^:(FŽCTVp/Ν;QT6]vdIFHR7" kl]ӑz1U5DfA\P`WO 63j gMmc"f,JT7! g5CT4tj|X& 1tO'Z Njf&x{V*lI"Fhn'ۙE8[f@V%agrvǬ_~5b̨u#D GXFy Jg;B[˿Y{vĚ[pr X~Rq2pNGuS`lx}~[돨 NL1¢w?L p=eGxR~=gXqD& h{;=>،b`*ƅR5^aK#oȈ4y++KG h'oOBEJ3% Ia(3 ڙa7YdY0]:D+?bx]$ KM}+rl('zM$ nz=$I(W)DRaܓMBԀΩX(Ĺӧm3QUdjr8q_[;'Gs6" F&Uܩ)p^2GZ}L Z-X689F}rT+i~i B^\¨;[Ǒ QZv+&×3F_p&١[lc4g䪖=+R*'XBp >XA P(]Ks %xşr"ӑh5H䪱G@>V50:O+ABW8:}=raMEvF7+qLh9m`<#S;gz&D:߀phVoYd)D&UW]*NoRqp$ʐ^7l"H+282z8mdR&APIN$Y&T¥w:?XOZP)!jQ5ǎڷ^bк(uV#=Z^7}#$>ۑfgsFA34-B69>R@TzG ٟ=5G@iΨ5J[Béjf4fxMdD9|,ՐȔGfIJPȿ3%ά֚~5^q0ط lں. 05jPe?BZ$1u$$=❎7HthafX G”@:N쨗.LfOG>ôpDyNGlM)[30Lҽ៚ۉA!4#Zوk)l}CHw+S uHiCcLwY+l50g]dGGyƑ]xG i 3Tr~OPF\ xRHt:8 yr_ɓPKJ A8QPa,0mHDiѶ^RH ,J;ʩ2}rf>N-ӬC[3 5'ECҬFөfyn*uLE?lrFЌ,1YKs R#͆x!zG$/6H.ÐH֘Z..3 ++Xq@T8֝0``k#a@=TQɔʹX%tֻ; U Q[Wf@Drpy =-3݂#ha0L|$Gy' zdAТ 93V˨{N%9ZvUx:}t}ZB36a|zE?Z\ PnݬihF.  B(GTbYPBt%4F,FHUmV s?1d俰lNa 3E45ju*6 x6[3P71s*N^k)B!ި3?sÏr-־Wu~:1>,v-.cgLjSF"Cl"k,ףS.v֜ +Y4A6 :-3K%1Q팈0-ju[/f)W ;v~OP(\Q.#BLZzBLYa7?5Q'Xc[ )U*ͯ^1 A8ݩ0ֹ,(Czdu"ָ#aVY<]*ۜ?7טKvHTNw-X&uaäN^$\wn5#QO(Bv<3l1Q +Q3Dbz71NF1jU90\3F>oIftvk4k6,6c똊JTI邮' /]gttwֱCs+UjE a2er:vN!dh4{&Ǡ Ƙ3;l'12YרV]040~a(f!MW!- XmD)AoE eR̓#JA+:R֝ RECqi:WZ&c @jp\oJVI&1qR&R;=>'PZ.z™Ud2 x B޻4TB5:<NJ[yTm HZ 2:$_Mla( x0 Yb-1l'&e j̐_~j0 J R#⼉x"rc);姇щy^4U۩r8COB*Eﱌ6nh 8"5dUI.mt\F4gm p[=ޑ;E :ϷR?OnQ`v>V_?_PE]NJ{?BJ+~Fp'#Ŭ,cp'dV[oJDQ,Q )7_lxx#`t,Za]VetAv;ڂpwjFG"MC` ƪR[ bkq|OuYFKdU×,GFXLPh ݬsƴ__2)ɼs@.ZJP(]IaIz9lWJ j+TTm80 5o9nd--- ɼ IDATiE,k-Y!2+ UK&8ncT2Όd2Ȧ <|>Z=XF%arA~`n&l7eJޱ9s/Rn_)o.s[),2ʥ;6QA ҕ0 -bYn/..*]goaj[tp[h(-^z=$d FCDKS*#5mV~Feb)R,nsAbvDBXg L*Qd dE3diMR,9U˨.)n,JGO%[u4Saqq>sFx_?i4l@zjBޱa=@ ҕ@OyOo$_g4`LdQ6c?S;R6Xo~;cCۏ8^q:w8džxS$3Bp5;᜴{|YW$ԸSZvCX'&;D\V)vz7`iM*)F]*cl ڵ(zBNI5 \'C$2 8F\RA!xQjS($Lqhq1MZRJ~u2bj-`EJ ߅|Vs]rj=:m53xV*` , נMw_#N8' քr-EuF;}6R M#ghr`KۏgT4차Tt[cjcv a8b;T9(fvdcdhSj`_Lf /" WCIjS(PfbRJ2Ӿw27$TtKz+it^\&-ٚ8;bRT.22*" X5~DE5"M /FKemBh(պSUΩ(3N1, p_jأh4kg<]6S:.w;v6׻Y#l <K"|M4'" /BhTPz\PBt%^GB)IgMet_^e,=ZƙYw,j閌*#HA\{Llv-Vv{v.vG吝$V/ ;kbc;EHA B˥2a(B ҕ,dd[u2?5ۘ*ʨ @H3!ٽN \.\C7[QRFmtO9smyL:;>pzH )n!aQ#;`UAqiomDžUx'Rw;Wm6`8kvR" )Zkלd %=[ι0)k 5)JQX|A׉$r2DEm:/,>*El:Xni^H$=clSbIT_Ϸ h(J`HRux_r%-fHUJHq@=oc6SK?,.I!K3w/NR!oǺ "_,}ֳ"*9R\kes֡?B:$ět{9 Ku*G*GXl6  (Jf8 LvhZٚ05zmOȤS+wFLk6ע0x?zd2՜hyaY\j|P&ݬ>CXuZټu<t;@罟` /_edHl2"|xLK6Zr76P(]jxNNLDijrU"y䂑k%no}hٚ^xb#%oE}ڨZ\wU<  nS2.޺Jlt.jGkYXKY$А_uKێK UmmIjg8KZz{gsZ`Q %տ5&Zi_?j+I?tq[bBN)LMtPBtżgK,.}SvZJ Ly--: ^aЂZ#].\oe%8X2/uZeTXmȈ_e$wh`_6 Ӳnc2Fp>Uj8 3|&E22T t-@x@ؚVvrr0PeA">)J9VSD$V*Nz֩ȿa6ND1 fq4߅elI"ǪF˚ P*,>dl,-Yh v v {C0"j*`NfYj*U5vcGsL ! pv73˜- MUpq&?ЦN.) -eO{ uW?8 -YUsod5өnaH?(72־N8n^iC)i?2%,XG#/Bq'#>ZRO:lMI'{.T+V+c^Gz* l_n9AK!Tl1dSGsuNHh r#S;Zc,'c$2e8+IɥgBѧDP_Fpr$roϚɕRZ Purgb D^Ov;#B*ºWř o?68MyϷljr Z rR<'⼉h3*A܆_D.j`( L %?"n8` ¤:AWә[r} 02iJ97uGc1NCl]vG ˹ܪ tKP(]GPJXRΖ66 ?/~ hD"+Ɖo SϚ-)HړQ5RlUjBmaF5ߐL&HóVNR)RZ7rQ{PeO+ՀL Bӗ}m3>yr2~%ٝfp:- s8AYFN!;[j;AaâX"-\/j18iZVdߝA(k 5)Jad5l#&ӂ2h시[ϻ G({T#_' _ g.ֶiix"4{fj\X6݆ɐcm7bOzdeA:c`TNP(]VWZ~WPѐ*ą~k,fN1f**<ý-m-=[IqK* VnEND͔ wzo1S3!5MM%JFD#?VpOe,A*<Ç7,3L`t,m۬ieK l6^C ^C*=8ȯ^;Tz'm=kvl;٦Q7D҃dj=KCd-<6;{7Z.(A u,.}]CQb1ZUݩ cF}}t"_*L\n4\4˲=I8 4]3X=,-#b\ڳax&Ժ$صypBv˸ҿ +m;sHHj Kmyky C+VZ{|wёi$,t̪ݎS0I"(_M'FM4a(sRJ OPh C:Tm!3w`o˟׉vpْ*|3US~754rIWt~h}K `#um8Ͱ-K Vs֭: O4 qR? 95Oי HV݈҉-jw䐵U"A;ы9T2J~4]rdBP(]GPH.0MsUfz?YmedSډȿTqg"fr|X.gzX-Ξ#45cw[GhH^:0R8ġLTB5߽%B3K#ަJ9cq}?).Pa imʦx3A*#CEjS.S5'F|܏r~+UiѠ|zM3:I(zoRM.Nݠ?ǬIߴ[*ԟm}}Vͬ& Ƥ25)JW!Kq3; 'VPg$/aa}L$ O볏oZQCRޓޘiROAS 8;PT LZNV# {h_gGL,b%͟"YbÆAyoA vK%A$7 z>&9=v|.53) Cb}f;#{'/H3d3΄bp}E]r)g˧S_ E-cU*^؆p,匇C;LJi^yg- R2ڦ`JLLXXk&sNCkt N\&p?ٴP +xҋe jS("l-Xx8ghRQ Rbl\;/V_[?Q@twqi/Npm|\n@qBҼ;55xax?_sElKg'}IPo >a;>4|@-׬*j_D|LjVvAR: }둔˷Gi/:Z9+$(GkkFr )q;#lB U'y1Vph%KF^RswkOTȂ^ )6"'74}Bd7&ajK&y2$p_Axޞ|jw} GxVU>Z<5!*=g.ʨ0%KMcCAt<$!bhV3N5I(2|Y{;zYd ײnӎ~G!(2Zgz;fEy^"䁁D8ۗh\%OPri!z:'6<\}2.IFS"{re*yhglZ)pHVZfXL=Zs;-in4!"*}C8[_Dl;#9c'JFǒ3 5`X{b,1ljA0bM=*#hR_.tot\?fSMf?UQrH=TGZQjv"\S猙 %P(݅NNoyBj1ێ2(084E"{s /hK,ULθ"m9D֏E~s5#+ UqQ +d# 咕B"'޸Jŝȿf6:N|߬DRjBk3Nd9r6T\kBu'%Hkwg-ޛ=I]5ܳkj 6RDiF4,m6rl238gL: @D7(lzשׁ-e<<}~=2"3/{Fx\||GuX@R&6Ip5 Vy4^gč*PryNF]bj@[rzIIL;YY^K\v9T]>.o s2g.U^$IH9-eh]qsr#p1p룀_:nە9z1_Ƀ\=~A{)oOǵڊST].zL$J)VSo+"?NJal&'8$2`=!=)mng0 ?Ɂ-@qr Mv5/[{29ђIILnGKR&rq4 ([*>{͗:{0F20W0{GO!8'3Zk \3cp!i+M>)ZewsV1MtGMb<h\Ugݵ'pHfٖ?i|Y7ta9zaq_4.z2Ţ(>B@DR<<!E:W|jbOɹIUؔOqgq4Pv_x2-B27z1W`YEBF MuT:'8@&{} &@%F{B4ҭi)Ex*PVFG\{.!'&d#t5Mj<Yw'np~!S=q1uŅ+C,ʿlݲ NTxG%k- }&Xe|ޘ璒1+cqis-'*`-h>g07eo߾_~~/^įʯ_Gv'3l~hG_ZNJ@P w?zkؘڲO;xә!YjzG%@(O^@IqTk't N =4q|52!L (Ai)*a;PjB'%s"Ң*"-ǀ;^h4 ƥ|f]ՃDׁQ-6Ӥ}x`4BoxbHϿ<Ļx{~~Aš[28`uy{{YR*%%%3^O//Q&*7o/V7E6C%v| œJ!8_\zҏ#? !,'0MqȢRmMBr} 'WϻdcuJ;ދ?%փ)?ߥXo2ۜe_RR23<|A*.]v_R ;m,.0׬CQs܄a}6.]K.8|s;\L}]C'B 0uz{3Mhb!ږq~ F3zPeD&W z&'q Ȱ}?m*[twĪE<w[DW[gMx%?]40v,UE}s%W0fF;dJ dh2 c,ʿ05r8 ǎG׼^v3qYm4kx %S%%%3Çi= ۶wѨB驐+2ۆm[yȲ`~)E:AS(VelS":!6.O bUhI}TlAnoަ^iLd$\vRmfY6"oT~u' 4dˤp:1:D<t{ђebxjn$ܜˣc)OԂcqKşb^bV=ċ4,~BLO n"wjsvZ<σ@\ry~Vx-W+w q?^oDOR`^B"y;CoGOMlpm@gϻף#DH|o::7zT::qjFSy'?z{}\^Mr [#ng|oc{G3^lyv~ zkm{N՟J ߆\ϼJEՅi;-ؖ L˂aʨh6t>eEQ`fE5|txuQuU8Là:J?7Λ| mdsW^d'qK"L^R3?O[XX;}nnrdžWR,1 ̦UMk}cjQJځC>p><5!+(Bmqڻ0{;Rdpъ&yb?)wFSD[GެJYн$ ŏG$j55f%k 2ܔ ɒӁ8RaLn^{ 0 ._ݿv/3|}wמ~?/z=o&VVV+>ooPϿGxVqկ)oV>i5Q=l=]/'"{צR{ǿ3WyKǭ'OgS`?p Kx#<;M?{E藢 W翍2線|kYa3/czf]obWg^z?Ku ]'+O<".\V%{ֵ}w#]Us{ml=xoCTjWat۸9k‡~+7~?7{;o5_)6.cM )Ff|zo/$p2{ loD{io?{F32o.ʝ9zbw_Xl-ڒ%8ck 㿉"n'b4NksIIIIqnmvqxWsxO=lt >o5dYm@//_":\ůگQCWQo0qc]9F௫warmkfWr bEzm@ٯg0'w~׳;WWl0Cs'mNGÉ?欳oj5(!?̇zUziKz@"8R+oo k>һ5+MM<#2/!P~yqy>gy|Xz!zk p6R=<~3jQ KJJf ..^\Z_4j- eCx42O}S'? UUQohjtŹ6[+H{XkXso`kJ֩(Wzzmy:U'Z?R1/Rq1ZKh ̓yA!-;{prtYZXԩb V}NE~+zPINQKYIvYPq LТi'R">kΫ0䓄[[5%Xv?/ޭ=ظޘI04|YpVSoxrΝ6ʞ`CAj5/`@8h& `Ӎ=rhz3Ūo җ幤$ֻmSzuEG =ۦ7ETBkBJ'> &42i=c^84V*hpQ]M S?hIh]8=_['(D푓f8.HyOuS<hl* 絁6{=~Y+TJFe ,?{8V–U1+5ݦ?}{_\D(.<\Ox )M7Wjħjx#&ȓэ0xsv ،vP`qy9+ mwzi&R0"Λ^ՕKڡl-Y•_2%&a+ǿCGyd N] ^`g~]=.Q]z2MnAIN&Ok{mglZ %z[4+a5q㍶<ظ4cESD:Phހ0%2}D}i%C =S8.;ʵa %6USըypOq@ *{xzq.${\Q7![W)hQ?{c#mG\բ!NÜw3`thH*;fNGXc/FU&NKB-ǵJ &_MVBR~Yɼ~X]+QC]}0{F lɵ$J0;O*4+jpE1'>$1 % KJJfv;d[KpƔ9c{TM/~UR'm'ϣ*tvNlC9$qI*{ه;o O}a$]ky*߾Knz &a4 -H+lknbuyNƞM@W6'|qFQs׾1'shv4hjw#H\:*_|#鳽D%$ $.&]N#ZB%k0?,%r4mS)&Ÿ wG%*9b7qsFī(rw*Ic:Jxl?NII`jA("VqM;uHRĚX--3|y}w-M|30Ieo` 1@`dKY7C\i0D72ƻ ` mZ"4;7eWM ZC4ok8/(#^̙~dO&CaqX4xmf<=5FAcӯW$&\75:)*ʴۅ#`f ibH7>z=y[7{7 >TuY@ SeYSq6Xn~dt(!`\嫘_ N>]aZ͐3 Cu)PU~POXnE%Kn&u=pD5 ~׵Qf$llPeSh 9JLHBd> SWOTx?\v%Fi=|xz>zi'  sM b9:[nE۪tqǧ.KYnym'EUU\ ars~ |`AfWhkXHYqt${oϡ-߃ܰ Nx"EX( /^ra}s킫Le0%(!` I,l%kХfC ^ٝ_Fm[/aŹv ӎw sRʞnto ߎyvOzIda+^P{tx.()Jp}bFb+u5 ^?_bP]0a=\39ês 44k<=Պ 2_ǯU%9FQg{T)!`lsDTGTronfy/_LzebUt5t#%{'_f_!s%q^Rsqiev{Ra7;9^2(ў6C|'qA~\&/Mp\|մqUl5v4a9LA|MǏ?P*҇ *F#eSu_n^M~_Wh4S nbs!҅U teyX\/uo\vBJL2/)) ⳗ$pvaG7-${?^'>)ew6CYs iX;ǦBUf 웵lY,% Z2Gq (MwSh% 8h{'6!47Q@%HI;3v̡f'OZ "S8B~ILwo\h+* f;vB89J3=Q,hQ豇ZMHKd"m#?Jt h~O|b7Z5frq<ӗqbT%֍& [|s{a8Ftp h.@**c#.67pi(6>GP'.+G{02^&m =нn$OSk{Fhj*Ѵ!7qʿ_jn=Ks|)#? bm&$+L7ۮFOq!Z)SA2|V^4Q4 /'BF!Cu.ؚ12 (Vڤn'( .^*=[Y$ dIIL1_5iC8t֭o:*Q?*ɋ@*nӬ ho'OjPЭj M%h͕suA߰VEUӼ̌R0kZ?xoJZZ?S6d3d}O՗3?(T5baT: jܷeiCHaH e~}U~; i ]Y`xC7qLnF>vY5=q3;iYAgv]NCG(577o%=4%zJRj&+}߹G@U"= kL3hcU #68UFYYed1z2f'g?كW)0+(=l4@W¡Ə֛W4oC*9=࿤d&ITPlbJ4mV$X#5l$=MSsPqAOdjѠrJ,: &}ڔ~_)hT?~@e0G_AU\D*;|<aW; tI48,^0pg}:ZBPN lmb@efV)x0ʼ= K!Rrn֩"оq4L`Gfϴly;4*Tњ_ݟr5I&{ 8aןƥFY6F[{F Zlo?6Ar:ne" 'Ȓӡ KJJfsq p^l.)jIUD .l <В}ʞnɸuBY]^ǎPf1rH߿8juS,NNJ谕@ uy5‐M?Fk|'0R9oȗ_4P +p,ׇ/os85HK<jAٴ!nzUـ“֟=*>%Qd 'EE+"yvg )xRoW1h0p9 ݓ7FWdyфmѣ KJJfs1Pz)5Z:[Mcl3Y$$9tчHx7'gfA\B3?XT`H^TvO{8ˈ|1"ޯbk@Md_iMI4q VԜg|=>,7sj `+\ߎ%NCAWM`e> 9>x٫Z"P uJZ L,\`Çw`8-Vɣ}ୟDvvk ($̖ӽ?l>=}*&g:y4 xcjW|H5 ,X] o T䚷~L-ī + *㊈ӧ KJJfs,Rg̚BYq0n0v6߇k8F$n3n'Utu[P%ŀ*N^8kJ$%w)p IDAT ơ#LcrSF;=ʜ< mƢ#7*'H>N><4.[;->b] R͢W#IR[ojx ^eJ#Ye9 5}8/3 IL=?|XMFlʦ}#ZHO%,hN7S3s2ؕ>C#2^ ?M3 KJJfb1KW{<1v-vr@;+t\v" kk ,'*{vpf4 r)pɰ÷}V%%V.qf~|>746NZfj&%68zr'm4>ؗ1#44p I'T<}ҝH? ",w9y(dZh̢dA~{ú@U{H'L5UvW-ϔ c  ވ Y$YTFʨ)T E^z⟀JN_KJJJm$]L<4P/6,F%62EV1-r!r݉]~RU.eyO `ML~GA%Lr %@ |2ֈYfJt[iGs6Wd3 |SʋFLUNS&۾0)sQY/M/]ӂIاd ʿ#ekU!ʀ4x7U/d#脆'pz_|UA\_٬P%%%3Aع縰3NMcxZ+H|e!bpeۉCAFuȣV$ԗ+u|s_ ڐVOcooo'CL L1}E5NZ=V>D4[gE AtMfQrW1_io:mZjg hnލ@u >}o; 02<+ԗ+-Dv+;2rj ݜ8u$G8Y0Dk3YiIid M1}a1U}{1Se 6Oh +T Y!A)* @ u7tv$@,spe*Mv5\s>>>TR\{5!SRς5~5W-X (]Z,O~<Ԯ̋^l-& .'!ꔉ4;qz!-VXnrX;H AD D]6E'pĀȧ,UW,V<Ю8KW,BxPOu;yK;c80yYM4%ؘNd)Z&<ο }|JMz]IՖ⳨3JH]a*bZ!oMvZRg4loPԨ2De Mڶ1] Fb cd0n9l g Ԃs^8GGGh$Yh';T6c~͛`hI2'{?mq {:~? ʨ"&d [gI9\>u3/Eel pM[`J@ɡ D6I({ [q޳0խ|;M;A@ȢG7czK KTF4*b2Yl-Ai/7e1\fզ+Fm"H&OMY4XKAB O]&Tpq9=OP-ӃlO ][];=|xԶK56ЭD+4]'[6%er)v%x,I0`:)Y&wqhƉqFks45/ 㕥huV$"G?Ӕ ;Y4Ћ H tOa,?^0nf JS%%%g d¹b M"N!MN϶>:.AN̊$q7I=u3Zͯbmy#~HW„gs Hb|+滋WLh@ m\|ϡ&8. xrm?zXo{s$Y[$N&|Vk*9 $Qozuo-tC=~Po3~%q3S՜\#5g;l&])5)Sl z]XђE]Jñh5=sM7=i^:J>M/Gh y|KJJΜ1<2&nR6\`QMJl=2'Q*8pGle/MJpr~n^63e%@D7B71["Xm.d̍'`0oZ齰-EUXQE˱ͷ?J$XFš}aA紕phى,r'V{SV _GJ`_; uHR5R]X([֊?, p6=?.ù'!i~Ur j_key~6@1?]لa_H<,< Y KJJSzOCM{yt{JоTl,N@?D3 szo 49{8̿qh?R}7nɉ2xHfGBk +0wdzz[XSo3I&Æs2 mz.SO;, ܛ(rn-= fAUVkuynP-srfs1 u;NО嵫'~p?ujȸG3cig!\~jY8Ȁ馯ח?% m@*dYDi?C {u;;AL3?͊3TP`Bd)3g %A4MUGCi5 F{J{*:uݔDjQٺ{ M FYǷ 7 gNG]g  >3)uKW[z>MV\,w_|𩏶r=|cJ9"8mx.]UXt|I Ui+ļ}`O"y$U}:AKS@QT$XP4 XT0~4\'biCB5+>VQ8[a3 <+\'- Uu5AkAK&+<E8Vl] ?__NiwV<>ge0 _wrJR@#:Xu5lBkPd D3t ŕ h!WXWGlrWж ãЀ,i g>\E^rSQ5;!seNNg_M,C3aMCc`nzTÇA2m>*`L_k, 4-f2_=ok7s*?z3>{:]ͯ(B" xRyUBhŦL ~ Mki$@H]@T[ ٮ.*2&dٛѾWJL(ji^0k:m6CGK~~i8 5wz?whХ'!ߠ7^GSw]B d :-L= ໯jz4񊊸2Vgw^>F]>'nIgcm}kPxg/΃+pA!, 8Xy5O~w;=κx hUfCܺ.8_,f>%:S%%%gJ g:iiqfq w(\/曰 (yʨ-rq=C1՝i`ŽWWxXke$]Wgp+3[@eS5ǟU? |%l]L:69~øO8y.^m5`J5uCO^n$q -Ͻ"dWҰ 4 ][ɞohly K&rAP]^`+c+=ς j?8ar^`waS\ߟ qnGKgi\H. H 'v~Y7;U;\+Cq0lKvҽJ>Ȁ$ "48քIznS%%%gN; 6ezY)c,e[Ox֬kc {]XyNOݺpi-?v2 \y*9 ԂFT&$}<2K)ӿ$LZUUJ+J)M+œyS86:l[.x¯S'|+)F9S0it*N8A&5糮 @b~xG࿤CRmV; ]SqhCWaKlM=PU2=\n tm61`HhYFy6V@Hvpr.޳K|\{ظ-k\ 2TX+9jbd!8ZafK ~b#^/|32mCkh4 ]‹NR]ݐ+M87d6hcJNgsCg{/*ǼkiyǸNd>kRMZ'6}J)wp{qr/Phϒp㟿_ ˉY*n'8]Mj`7F31TCr\pþ6qX̚K&O9mxW0% d{=0(tsPY zj*{Q^scxJuUŻËPl?JtOL%.7YrZ^}^$`Bs(P{qO a` bi9 uoR/qh y;os '~ٟ=-Y`h mb.O~&bGV[Ts;/ar&.P'גѶxhEWWY; $ZSX #ik bX'7Sh(]J; 87jjW?g?;2F6T'X ZrD-V?q'֭` nxx6}|'#)y}E -߶Dg(}@Fc1 gWyWS?co]}>>_SVAV1xVױ\\JI=<qӧ)>,"X/sўh)'D*5  >KNN9a*YJ&7 t1[] + s.c{42 PUzmz?sϬ4ÛH]c3e_m IDATkL-a%ܫKu:lgɑJw Awz-Hu$%#8ip'm*cc9M? HaGU]J$VGn +eWZG̦$61iHPZy /( F-,ܨ,xA` 'eUBHտ}}w8o=i^]6G=rNA,.I 7% 7X8 ϼy}@ 0F~ JVs40Oykz|ϛirvyҫj_z/M ;3nx"}~;ɤT/1$n[V3obaisTXNtBp~+e_RRrŬ$N >2|u |Q9)G$c\eDM[Kt׎?,ÿ_^z|׶sM*@e4l[,me}͍?ZR[%Lty2xJ#xW"y\4tEVjxʭbzzgWW ς=_Te>%.釒Y+}jX@ වm!eRk\X՝}i;N9nYζQpB#VR℮PL`䡢&7@Ul^a'џO߸;>ČxʠpKVKNO~ e_RR23ؕb}P/goV93/F[ѦN.4Z?)#TlA6Mj}v~ޭ bi<%MRt#e baܹ9 '.[fϳP'7}༡k:tLsiOC*΍LoKTi*'\OW_P/n%^z.T:zҗCVpx82{}jY lsêo$}{z] $oF+H Yܿfp"ϑVB'M{kw<2VQJH@Y4 }J.)ς2/))9S\h./3(-qKM >?~~Tv8ʞi (_l-arBwW?9[ƾ2SjTRaѝ?Y` BԲJ}T/$<,=>4vqԓW(:F"U@q=΅#AySE=7<5?UEF YDgnd KY}i-nvSBR;a7S9M&4(딹d%nzH,|Z=XS-3;QpAfB>Be_RRrp.'/. Mʡmhp-qFvG3 ܠ?{+5 sM~Q5ҦA=< ڇ,35Әj-4/ ׁ<ڥJ}ġT?=qB7c//*_L=NeGDKۤZQpW8ndͪb!Rr:Y=v|6|RR~Z'%#}g|rk< E!.uE@ /uK5۹,wMHKrm(,qU`ahl% KJJΔCogIj_\l䜔:(@F6mz @%'+BweeӎQ է^{*~|«['(-|Lӿ. t]CV#8 j!Irx@Z/&:*V_~/UFNSALӔനٟrON8^bWuDk$p/A+Y¨YZ$Иx'ϝ罖ٹy}0$}/!ߟYMe|)7/12vp1xN5OW}'M`Kpd gW8S%%%34F-77r>eyV1lfA갮z8^x>$pxcty5nMf4rcabgboS }aӿpl1E1ʣqwp[{K2Xr|( yRx*Ç^0M{{5u=n?J¡f,@N~7X]HŞ/Wk+kW#cm=Ed^,gzg%Db{v;Ɯg?=_wHRi2Fm6FӄxEzKFuڸ~% KJJ⪣L+Gy?zȏiѨ{t8ʞ VsDZ;xS-`nׂ22dRt3˄FFsC iM=9ncʜ 3d8ϒz,Fb@F±cӔgҞt%9_p9Z֫ۛNfSoeH ð_W?UtKX^ * fӜOy 4m,Y͸v㸏w%<5ÛI76KoN.r4^+8>~e m$W[4Q~8V7ɧأ<='fR@1>mwNR!f惭Y)1ѵ \ҞUJuF 15_s; "Y1Tj6'ⰽ7t驞a3Ө,нܱO]brW֑qV2 UU#ֆ/p=zzD?ŭj"p4ȑ睸QwuWwOL4.SڢBVPeZGCmh7+9Ч Wؐ*B"e"E3á8==Gw]up&>ËD"@Pݓ. d"s"Գi>]$0&#;%ܙpʿi˛&i0R4D3Tc8U21hu:Yoe%LOHH)~D2 Ki<ʹK) (",t)P)-h D9RpX#2T S(= 3EY|qr@j^̒|U\$ai {͟85Z.:(!f?.dzThwKX`2Έ B;E30tSBm:ˣ3C`Zj38b[N"q&mrԎ]EJc>L.tdT}oUavA`[*wh:ikhZj쿭1iљrʿY D;jiF{R1TT+JOHH)E~N(( jTد0wgąitoxErv:|,{Dqg~NA`hIQ:^Zh$BBL;8 p(w҃m0 Q}{/?(.,7^Zp~?O}SXYYa,M9ьalpa#{u Ww'ogq,lP")QQk'[ Lfqb{DF ->]'OnNdR"M,)8{~)K\Z 1PȲR{x\{tnfȿIsזϬ> v9V`nה L(W+cV0{3kaT ~שCFh7l18?~~tBa-A"XKr27٦Һ9v~OHH9s-"zĆjEF%ѴL:Bq=.sc[>EQŰ!u*we -"k\A2_<= hcPL=к1B %1fc.+(\\#p\jdh O`.l0`x\ض `d1qA,r;PK n^;Ms+ځX|H]AH7n '&hŽ;("B60zy/6{ל\gb% &n /%0Ѳ1'vPsʃi~ԏy96Z{{b%ಽǼΨrߗm]TGvʝYAes~ \q!X:r/o"Kwe R]*A%l~vPܠn?rMSJОit !v0\a#eKsNb  mE}4[?$BBT4 rr[[$B "ʁgEχi>c0{sҾ]8cI SwA\K/݃Bu}H4 P?88^'3w7 Kex7 ж,x 8v{{G0  ]yG]o'?OEͱ:?oݺ5q|{>M=tt]-~S!?Ne+}>ɩV`R|덇Ji 8xT0~}<]9t7KBѵh4ꫯ⻿wſ ؜yޙßkؗ;N=_`gV*n|Q_87q86 |Pソq,}i4(WyI?!!aR),..bqqsRGƳ/eFvSu䗗VVQP-ˍ7p%, j竕B_ `轞;U%5rDvb+o K ǽK <4PxP!gF?w-4Ěj3d+Ru=M\mhY㜑&"{4#*ݔD ĉ؟OJcŸG ,XĆ X?E~]Hj4-Ȋ :*BO1\˿CҊObV"Vz)~)aPt6ఫkFg8 %Nގe_qP*aDoZ# jiuieqBg)̀'&IMb'$$ E! z6u.lA߆dɕ,1wٿݨD!矿?oo͛'?I!m딛G\.dGymoDC,kؚ^ rqhhbѪr;Unق|R/ f"j < C.y6^>"âT߉Ze]z/},4&X w ښ4VvdyԥYEo;;7+,RLPy4 >[}2-gdʐE17NZ±dގm_B^pc`>_ϒ{blʉ0"zgM.͝vt6FᐠZ#7q޿ɒ 3 E/L-? dVq~ @Qg~;9XM7pO ~gԧJD\xy^@! ;*i_{fĈ(6Eҽ*XM$g\xbWrd#M}V_<97huj56ƈcAo@`2r^+LF}Qx/ 4 7r8<|8ȿ*CQdy.*؟O/q0ke4NW/܏Ƙb`p4\υFmTt;gV|Q͹N;JW'#ڋF=W _\?=_'/W٪$;8mq@†s:ajuݶdخ 0`ӑ}'EBݟE%fLHzBB̡p0!Q#l eB<4MC:)2%d2a'm>+9!G}zbv2Ėr 2YXBa< ՗~.0q,%2&-(DE7Gp 6i\;d˧Aa 7k~SPC_CxȞ2Ƶ5Dj{1Esd.HXͿkWv>sVρ?EAdX*@k")]Pt6E/Q'(JQm~տ}M)~[ødžO)-DS&6T1`;iVWed@ř=͈fPn4д ¿PK͖{>sH&ӏ~4+K`g l#HQ.juҺ3v_4a:N,,N񟐐03t]C6 ƣΒ^]6xgѨM}~?NjgL>kϽw*VَNDk/N70UQ9*aIQy1P*{>ttә};M(u9r/9x<Hű-rdz?U<'l^הHtnpqpÃX»YcN%j6tHjz,m3(!qǛ>v&8YʫZ((?btt:qHƩuFek{^02a"u1uM YC##R,qt_uugzao*h!u0y?!!afԐr,i_ =ֺ>@L+Zh9x.\ӁݢjC/⣿vmm/OE^gxRT4/.(-ڃ7n&L|"dǕΛz)i~ w˟>{e3 6md;ȟ-7<[bߗcDbx"t؟BJZ }v%|s: ZӊGRu{Ͱ'Ĺ|bC=BXQ#Tľ~2 ;O:qsfoJ"NU,|xucw:Utn(Ch[rcf`QbG$BBLՉ/RWd"U0.E"gZ[x Y˅O޼ G=uk.KPmє"&,KFگhb8ᨱϕ7ѽE9xңLeef,6TvΔd"e @3,huhzNIjwRR?EQ9QLb>g Un&PcW̽[+Ap< F~w"{T{$h6Cm.Sb\A|`Y]1Ds/oSxlmEE@lwrca̟  3LG@>|&-ɫ^y}\# *0`2U|Ó)mP]'Ѩ,ɘ<慳7^=h,nȢ35NciE}^Aw8"<Ɓ?)GX'Xک'9,Ës!725]*=䏯q,JBHy4&lI3kX\Z#7*u^R/8o̓L<AUYRy^@%6GnJAfy<WU>mt]]tz%=DtGCE7KFod,Ie U8۟wNƤ[bY?tmڤ/SO"âi{t-J'tĝ-5+0 OSHЭp0Yd*U"2jdj컑`LR=_aVvðz躡\#32A3]A _k\aw?u4 #^MD¤ #1fcE~?CSH/7Qn&<֠G~˭CN1!67Iͤ=5 ɹ dk^P܈SE8(EB˶( \S m."VK/~`ϐbq~Ktt@{-6aiϓ6ǯĐOFӟ?|n=l>UP x`MR<K~3Qy\*޶pR!xR>ETmf?\GFՂ ;kǯ jdZ uRТi`xr]|j3_Ćqۉ6!?"qu1չOZCχ=F˛5p(JJS?8ET'&ς%iH9 |_3{A-l[=x^ aې EZDYG,foݾ?g譴xQq-~/X MKFӚnQy I1iڄLV <`P(;03h 67rEoݼ{'~,‘86w>[wh+D#{>bݎkaՉjtS JWBl8_UIv4OJ6kAd+q()8ە&*瓗HÃx%|qaS3]F5Nxd:i8s`]Z.P1n'{I(Md\ @QB}Cj{2Tm;)@4#dh>6DF.=1BWiȊC)?p}w;ivx<W Րӡ4g_].1\)-8] @]x OX!W\sm%ƐYIwϱ)LHPkh69.LنUJ;js̀ cH8<܅Yrtawqy&T+4ߑw%[7=Ʊ``̻m'fVM]aS8"88V5ɅJA ntq %9P'i!s%: 9NX?_[Tx 1e;F탶X7}yR4ɹSmNkg;}!E,zJO [?NJAUJwᙴ_{h6aSS)8 9qa"8"z x_oeK+A%I!:׺֙ K|DO d'I&TUϥzF0O=wO* B09 x^*D[ "ۏ_p_'RWZfM}>?(t焳ES'B|}TuTbi4=٢Db/.Ck2qDfp{S&Z׶cW?؆94?nX|R4c+G{U;vLKR ׫MM7W֜m"Rߖݞtɭ?8lR5 *=}$v ajT6*Hp['Mb'$$Cd)iizk!xăܔˆJytAzݬ#մ Mų[_[dENw{3OSMa_E@Qd~$aY=0ڑpFАɶ.6E3*l| p;9p2d9g!"D>AT^w7Niq* 5O (Dj|]k@w {}gZ.ji:SӍHf,+F[ IDATS=5| k$O˜$\p '&=0ڥ^iMksjeWrJ<(wgɑ 3 \qtu !*bFDV$qho@m++vMht Wݫ>>@EzN3X8;lҌF~Ηagg MNq੾;]Mae/FF_:Qu(qf eWHOg2J R Y:!7PA#}xO##E5>xƛ§S]_+eGX}'{uiǓX>8KɕU5(;S2R̡T&9 AŠ쭢%DCccGҡr8N_feFljOHHZ*0큅.?%yMwQ9:FZL {5{+k")X =3ty.L~ӡ>f|˟sYҝhՈJ-gA'#UbM)Uz{ VL>VB\-j!+1LSs|uf|-(ccӻ ўy9`Kvi4 @*'-\ ʙܵU@diޝZgaةN-91g; Z?H1N a"H:l`ntt8mS*St$gU4,q鳅TxuӃIEӯr2>p5kd`c5 V*f/P1) (V(-4 "Ⓓ>TgѐSfv:4l~!Ʃ#ukiIcvFt77P=FqL:x 3LIѝ_ȣ&OFCwQk2GRs23qdmTr,<)<5vළXo E9ҁ gwe Fb'$$̄cz9A߇>oQ&bkCRS0-c[[m0c]dpjJshQ~< ^੮ys~iB()b ǿ͟O_qj. mzF$QTp̰$f|%ȲxPv|TL ]Y{;#c6$^ S\i9<5NgyX1KhQYۧp'd;VDwCIj Bs-@Z5.gQF RvHr0fB4gԙ8@vx84 ͞nK')Av_6keܹJ܇g@RrF$3%Ob'$$̄G_7;\- ;aTpnr-L8j[_Aq¢WWgڎL4jy6 9uLkoGbOq3)lŘNC7=( 0V;'$' Eڿ*C3=j"k0NѶw7PplnA Bd3pVZ'SZFnWox=?V dlE*S[ylLU:2 TD'ݾlLFo.E'%BGBQMlm:Q=1rN f*2(S6}5LtߦvolwkX8,*EY٣Db'$$ Tf)h)+5/$g,M=zt#:N*N Wr,"ޞN샠%R@  Nb8jgEMpe<:YJ>U{~\=z)m4e\Y[%O:{`gVrX>TTe1;1Xlǰ;?5,LZFǐPlz'iy5Mw ,<:?KOp즸90ٔ*9 t827БKƻu ]#A|we+bIŕLjMb'$$LU.DZwFN,Kzby,iRϲޞxOC5}s0J#,] {p"fXOώp Nj7fSn6xg "no(%qxzAQI`HՔ e.n:O[!PvmUUe0A jZlmYѬdI!ƛgl=} Ij +`ۆT /i 0[v|fo?Dݼ@9Epi-,vg E"|6}n۠J7f=OdU2Uȼte89蟅(nBDYX 2B :eho""״Nvu4N $vFKman^~Mfo%,^{ B1~j7IT8zFz8B$hi6\Ǯ5عV}R3p^X^à B٩?NM%7EŧQ(2*2rմ~/aa+pzh*L 8մ["~PBݨPT&cnߙYf q%?!!akM[>~T;䅠}/k_E|sF&{QJeѦG%:ERKk4jP+Qgb=+8hR6xNX8۱4kwqT!Q^`rd\Ț58ɥ(omS=s %VyyCهȰeGwo@*uDK]wj?v4ep:\+^ɜY7Bהوbu+hKs7II EN@C4{ xz?j%"ÂjE$}~L_~fgBfJ>=fѮ=-#&_;'bS8 E_ts`A]J{pCS{g[ڟtoP? 0 s)gzt[K(k6%HMb@"Gƕ/Dz8&AC.((^=nBp Ip%clx#Fk;7^\1}+BF״X-ȭ\c㰔o"av"<;G)b z'SM?˴R;XFC-' aP8˱(0T^5ێ;?!!a03V0=8Eu6+iמB:*MKHY4Y Cz/>/gj)1wSc{g⡹D",k92=AY^/):uzjjGPeU)ngڏM>*r--XHOkOTga؃WB܄kz0)Â{{ޏNI&J +X_Ņ}KPL.B}N$n@",K,FL!ROSvXN3I2%#VkWVWe{KͿĽW+Q-c(3UyÑՐ47LYBRh1z5ߜa?M"Ըr39`p5Bb´C!4݌-;aTd wHC֬O0G雯\ ˵WgKGXSh꿪xAG%<Afc5QIX,.@VpD[xٴ:/&1tUE1HJ0l" )pm{wQ.U\ϓle| MԘ`Ec:3ƹ)m8o^{ e!UyH䷞)_';.W@S(z"G尡zl ?({Lyr  CwHӿMCȰ(XFSj'd%0Uc N͟<-;ar/ob9̀V$1ힱp,Ƚ6Ӗ^Ňu;p ֣= Cä} kߪxPB DP yߣxP*F]~G6R7TJ RhXճ6UXwJ{ZTtS6 ҭlu_ZoG,>}^o?u8}E.+ANhvd-mM`蕯0'SrV4gK$d޲qCDt!K߇~H—{H=c$]{t+-lL$*ܒX9Dvf6U~JG KͥX!8gXKׯ^p0}#lez ^=%[(m̸fG?ܔsn~ mY6ь, c_vaxtUF{{;|Bj6Bhs#[QuՏԔhnkL4Y/9hs@,k4adŻXRTUA>âyaIZuV3)&r(-#ס U yUt3DTvA\n̲;U.KHBAR^ygsW't0`~ X Ot6c"}BYU{Y $sWGۺuv_Vpct)rtZ }'!'DZ0Ji 80!ظ%?W)Ӱ'HH A>@ov{_p}}r)AAjVwmYrԠ~ .f ?xURjɤp5"NBeԵܸVu!6AZw-ݨSK[AEοnܶ`dTi&/ kADyt  ov*)Є\My-M9Z=,km e'QB`d5{=iг iKR yH$~Ү.d6/rS0n}rrY98xSJΰB{^*\@Hnw$;tP~ SZrȦ/uEg"v \LXQ4ZmpZ w\{?䔂`x^} F n!EPaN4caxe֢;) e= "$ܩҮlu濘>BNqadpS) YEGI˥mi#l,(a?U*k)<}vmlQ:f*f/j9"OkO~uΠiij#kHh7fOMrbݏddA%Bw.y℥/R\es A& ӌd(xAH P\υ pQ /(ʘ4Փ^ͺ XZ/( ˎIH  nkix/BpYH~( 鶼|[fƇ0- '˛K.'E4,%O] lAhc-cq |^FBN%쯎adQx`ODe%XMhKwBdt{\hWX-ϓN6t,_nT5U\ vwA24Ğ\%5`>ޑ[-N󿛏~+H7 mp6 bNa\݀TS?4Ͼ~ ,Vwp1 hi)F$TUDێ m%m z'qo<҃KK}K;ϝ.[;5dB(nդ!dRqQcێgJIJ8[Hf lIJ30OA0gTtjҩ$cIuhsP7b&LmleU0'kax?moYx@] HHbswu;ULNaf6l W26X~Ͼ^={vW ba>avsOgk׾9x}L]m[q^ёVY\JM:[ 3]EG: *ynHCͷq <1 "X{4p|]Hk9EpvC;`nhعBtМ.,nKe Ddgd%dO+9֫6"-C-ر3p]oF^C]&moQRjy];e1K\#soE.Teff"]0Yŗu>])kP#uAYXA9|Hqhu~e;BdF+FZ bvʍF.#g@LgXl۪,m ?OQ3{A?U cyٳgi^~e߁hYq \B{~@ul$ƽup{ 5,?s~gnȻH9zjcMDauŔ/z5 _BIRZ~ut:=Rףi|CH2Efхcp4~!$4xO5~}j}=<يXis7?B@*`ym(4 W[ލ>y=[xCǹsP2p{ bޅܧ[5&>UC w?&ۑ}VtqRg"CNF'yY_b>qtٚi fK_3+F>F> ŐOI :v"!Pu4~0UJSL*6$0tExG> zB\Fhr7po|;uP/—R^L1'u]1N!~ND$$L>Ə?l*VYWmlAO,߅m& S[!s;Vlm Wլ60rμo04<sOjiQGe`yN̮+_[]"VwzC5rQwOॠxhH'ƭ"cX5@41 Gnjar%3HTُېd 99ۊBb"yslSrגGF$#.U*bKObMBX>~X-.s9D&a`19N@ -䬏`w5+8A,2"C0Ma5\ODe%V{%]o:~BӲHYvƷ~1Gk~LF @Zl] uսGi舢Pw64PMQ\LT"eW03ᱧ]S sp7 _A=[p) q$:B#%nYk8$V_ޞ!\ GGpm3Х'{.2z'FN08+_Aҥ'|-e%C[l… 5ξч.z=9Fw CShpu .t ?O^Kb oI R tϟa}qBX!}osZ*/`oD$ Xe"/FW(:|ïi30'ʇfF]ٳ$dOB}oT"DKs{Q8~y-iK:{=><-~1nV,gji&y-a&(iD5d@sg%z;?p59ǡ|jusN. F:5c65>;'q-,xemz~>_} /o%,H_n=2r~>_,hxjcflX/.z-;t>LMhQGU:9n_?F3zxU.H95Gňaa~>|t 6$Ll0`ThSG羂\~mm-e%&_C4F3ݛUٱ+nV |}8}׼+^nϜz FXF׳nrjG[ Gg}, 1x-wx~9ssx;V\:ʪ©ĢC\8 Ƶz]#4/փkWͷ!wy7]{۔0KBr4<M,zw;;%yxjGO/[~!?@rXjmzJ튈ԠN>x07;)N~ 6+XĕߜzUijt@b`|]*nPv6H$*""""Mp0 DDDDDDD0 .'""""""u,GDT @ @:_ME\.tttˆVZo? l_jaffT"/]בdf"""lTeDD5( l6C5!L&8X,Mj!ִ~Pپg (pSҲd] 011Q–mmg(-Q0 Q#G>(NgT^/$Պ{UDDDD[d*R}ɴzfll tSQLLLt3DT6,jVDDDDD""""""1'""""""q j"* M* """"m?Moo/+ """"m?;}0==qȲ\m nma`dd@HͩICkk+6rmuP%lV~Pk) `ODTk4N纟Ce\.ttteDDDD[[)Y@Zap?QiooG6u}Mu,#͢}ZHDDD5mTř"d RTU-q(^FDDDT*""""""eDDDDDDD""""""1'""""""q j""""""1'""""""q j""""""1'""""""q j""""""1'""""""q j""""""1'""""""q j""""""1'""""""q j""""""1'""""""q j""""""gaҍ """"""!˜ nmM~ D[BDDDDDDD%wa k+*"""""""ڰQoxZ܆(IENDB`flower-0.8.3/docs/screenshots/pool.png0000644000076500000240000021267512324702473020066 0ustar mherstaff00000000000000PNG  IHDRziCCPICC ProfileXY 8ן˵]ى=KH%ZH"J!k"$%d)JByy̙3gΜwUK RL \\p 0yOT% 6;,L~Q>@ Cp- ̦<ԈM| ,DAl_a{[<vOG&S "tD=XpߠpU:>d_=8$'+Le"BqOs%,4|H @lb}@@?sozSaF~mOE8#!{,6;6fFO/j|oK_?#c#^PC4LޱN#Sւn++T[sZ^ ޟbb/Emwk.j/(F*dxLREn42@۴D,~ULP` K`~=i}TßL-9f/>|?A柵 J#]'~Ko*i?b1k5Jn:Q-G&T=@5Pݨ_f! ekȌ~ zW(/o* AഥuпIF7")?C6@k#vFlfCsY6h]dT῎-[l%|@p/{"(AT}0PRPTgW{nL؞ F6A+4AB^:f|)1h~NJ@h=` v\nĺ x/H S 8 A1(W P@ ]<#`L0p"A?$ ICJ:C yAP8 %@P:.Au6=h-(fya1XVa H8NOp|[.9<(EQ(u!GQPPiTՈj5ƢIh,fhG:}>.Gסosu Ãhb1.^L*&SiG w,ˆǪ! f`ck}wEljilpd]5qxZbnE^>^S<6Y>6>=`l{|$~ lfy/  9 %  Յ[DEDDD^҈]s;"V/6%!n./^%>*AЕ(x&T +=qDIՓNaO,bʊzwt]@vZ3r%>;kې'w*o\5< ¢w0pbKĊr1JJ:/_(*M/]+ //+PVQQSy ~ՆjK5l5k{]aqZڂ[[iuP]\\}`xkC[oݑS$ؔ{{)6Gܟm hy:=;L::;j?lzc]]u*ݷ<գSTiCFoc{-F̟u=~788<>4>;<"ח1/WFbFr^*z-f\u7oߎy7>D⇜IɊ)iޏ>ND̬̦~bTYs/s.s_)_7esΗ-l[h]]|=R?v.;/O]ŭI5[nmlD)PToeH wA!\|׶os K|?.GsnllE`; 2BC4 O U+7c,1c8Uyw av@daRg#QYΰ6Mp0ss3'#pIW.(cyRE2dO%ɇ*)nS")M*DJL95}FO1ffyNͮ93%1.p>OSxdkiIr=,VU_\]RqmRݭ %; 7ML"ת&g;:[V=~mDG`/Og?3ƒC*/4_ꍘZ y<^{:8C>̊Eq eߛ~|^Q[4-(7pBi4ՈV@WcT0X.L$Ӌ23p łaŲ1ssqps;yXnf@".ыb?%nIKJ I/KJg5(+)vREGeF'< c9|-Sږ?tJtt7)JFƪK&qfZf+wwгV)f6Dg;a>G̝y?4rA>q}QOO/u2Ż)h@ Ltg=DHGrRpŨԧэ1{c#q&@ 4Sk19jq6#qxቛ';N eNd}9zf=g=p5?P!(~ɪRSpEFbo٪z[Mе njߊ\?tQNHӹ-o1kl}P㸮{+V잵 zsXzo:]χ?͂Ug(AL%h9z@z d$5>-b@sh ua_ěH&GGZNC7?b1VDL#f ^~)bpx_EӸ!g# х8JM?ɰ̘,\G2&=g dYebb{ɾ‘˩9ȳ{υ_+/%'.l*=&f#&>"Q(-%"A\&XVF 4JnWQUT]W{DW5"甞.g27mzyݎVSl>;m8\\vI+{L>Gw |b=B<҉r8U؎x}ԄKٓ2S=Zf>|RCYم9w\и]YQQSuj5 cu 4}l&Wt~{l}gp y0RntķY/~W<.S^Zli|uZ=@$h;eBH–p4\?Bi{e=c0uE*6{A,^DJs Mȧe=NBw(MldHdglac&2ד.yRP{ޢѨyK+:eze5wL0'౐ԷMyޮܾ֡q+.Cw9HO#w

,H۫&oqdjЌlЧϾ_~ }[rZa̟kˁ˽+*+y+kޫ-kkֵϬm((e3@WbXX)X+FQu0P}tF{eЄ pHYs   IDATxyTՙU]] 64. h\ IjH"$$NI4f8ĉA#hdKXdߑEihz{~ܥNݾUMOV=ssﹼ{L&?0cR 00?O4R_/_/KO_ X JdQ4g8t݅_.'ogxǯ;R/_E_?>PD"Rjng t@G8#/KRR_/]`0c#Hl5Mso\dO?:j0̩FwN\S ѿO?__E_O>imF,Sл:E'b]qN~ Fws'ɴ'DO6DO6DO6DO6DO6DO6:ң+VPVV/Hqzyvgu%3~if|v~,ӦV^;[?_fϛZ?_ϕzy_E(bرI    Y=*u4tç;|;㯳O@ i|tן//Y>555 "a-q߿?_|q@.u8R*C*a[m _G?Աթ+|s_E_E_Eѿ#{~mˣzߐ~'nfF>hNF{G ކP^~~i~/G=9eVtzE,_ǞOUo}4_i/~eDߏot_EX=zL}}='Ofڵv6Bz#9Hvxekl;~ ^~ܽ'_HJz;6tr>g%E_w 蟫ޢ/onn&?rH6l@II SN;W_}J) K\6X8vtې|{ Qz*ȑ#֖r驲ٝ'>gn(//N]z_wտ#=;꿥E_;/ϕW^I4UVc555@QQݛv6Çի9GX~rݻ'XG&P*bӦM 62w>;EGa݌1N_^~hW\v'wQQ֏˽ەC/7ޠW^b1 3ח\r}U(:xI&TTTpg@uu5 4 6u~ǎѣG쌽AQQQa H޴iV} pF@ˍ^ְ:ɖ# -ohw7e7 uϞ=1Mݻw3tP $z3>oә?=0uݽw=W?{oαloG6ѷ ;M6/蟟Jq:uj;~~uuu9^򛛛ٶmyyy}A$---lݺ6 Faao8hii鴽Ç덧7b,c֭WTTd9va$CZG]vзoߜ?d^OF,]l7+_wl75MǎBM?:Jvr>~qv>~m//%K߿uYvI :t$JH&.p8پ}; 2:bСC <8묘a0uk^zbgԣW^Ը d=[4.[w1555TLe`X ^xvt.^z/ S[kL&v f* \(S@Yi?AaNc[ e?OTTTPSSC~u^ݛ4,bk\BeO-Oٖeyg\}~R?2rޛIo7S_E?&/~s9rT*q<?+cLOx5j7/O ݮa]=!;{u^[[ȑ#Q PNaiA`P7x#W^y%` ;v`ʕlذ7_0%'1 ` P4 *gMZM+832@)+ۏ8JiVe_6'iWC"{fӦM'uP(y;jG^^[4͛͏n{Ltt^z{{6 p@ @*ʸI=Q{.!/~EtڎS&Hde6RkY^/y4ݰ|@P(.ԧ Pw){ކq:~jϯ^:8((( aO2sҗɓk$& RUUEUU_W%Űuk3SLGC(eL@Ț?e : ʬMҳ 703=Ko0ikVQRԬ#+lgEMÊ{PJ'0룮r&??X,RY|zACCC5l}7\tnkgi87@u>6c{uKgꯗuBE_Eѿ;?7.aX#.vJAAA;b^Qj 0MK"H.8!S555ײq.83b&L7 P\\W_ͨQ2ki Ls\ˊWzvy_BJ_N=)MgeLSer5t![ ikWʺu=z4pD"3fL2oR},D"nwt:p@ @CCEEE.R*w;?QV7AZẃrLtoD]:{o`~n_o|ME[V/'S3J7P cǎQVV(رczE4M.D]WRR!F.z;(eV^QQa5R(k٬ 9Om۶"JQWW e-++gtr~~76 !enzyofAz\#޺ е~#/aůq>}BMM:jjjhiiO>sΧCwޝO׻wo#.>:G`0i*LeTi63P 7, /="$\؃Sϥo@L(ZDє{ypR6cCQ4JQy,xm徫h~]{4OW?he瀭Ń۷’RJKK pCS(» hhQW4{[%1҈Bwxa斫qX)OEF7X-[IQQ9-}MLj L4{+ef/+A9ij:׋24` \sgi???ID"477L$aҤI9I>}ow;ĝk˯e|Ғqz;k/^я7{Ӂln:/ڏKyo2_Mۯjw9E_!2yI~RQXXȡCؾ};MMMۊ -:vߥ}TWWg+..>v8vAIIIN{#F ///nG_2XϣR^VN2iH9+cpZ\,*`(EYCYx{y߁?Cly(;Bak^Lg j̃`lO|[pKE'[)UUGND^+B3- (5/cԃBP|Go CfԬ6Ǯ9xl|G.<u$GTZfo& i\n'eހ2\'ΟӇf鞗T2vlN[[|$v74MNKK 4/yl7.]o%MO瘾Is̱JOn:lik3Wo"/ar 9;Z{ JB &u; OE,o?չy/ͮ^l<WoG|_#/|o_υC!^qg)ňq\^[^Q[[[I$D"A"pxr/H$hmm-bPJQ__O^\?J)Uϧ7RґW0\w R1{U S7R4| cƌa@/g9I4 a̘1 Ћ_"82~>}CL,}h3> s5_`}OQT#>Yïz}2O1ヌ9S)Mx31#Pl&W+N9(/\y9<:zj/-:?sxolН{+7:⭨3'>~ @t ӆv .9|@ o߾\wu 2{キ]PA%͙U?KgM~R.:3osB@zFgяru3} K!E_ʵ߾_93<ڵ_1! t}*8yYf&+~s=A>/L)So^W G)U[c\]wl?^v wy]~*+g>vpܹNo&L J1qDYj&L?JRZZJ*$D2S};)Yw7 xh4[۷xGls*>Pןo;xrݺSun3Ec&__E?o:tHyt*%ꭨoy^iC{=T{OZ_HoP0httO/2/r^Rb|s~kJ;19d855KF9Ww*okk#RTTđ#Gի IDAT)**r;뿭-M ~;3J#MJ/O9xG[tݗ:E_E_?q+08ٌ %WaSTԯ!+^ic>lYyxxb/_SLkR9tE$-[0|pv[[MMM$ LO;i_דAOO3ΫeÌ$I0D "l߾D3<#qgt>G\u>|uN{c(/cf/d;e<z>g6F4_C[w#GhlldQ[VaG7#Zea}0ga6ʰ&+` חup\kQ],W S??&Jq ۷i}71-)u#:/׆//gk??ؿ2 #lG'lFpO,[A1:/6:sN u(ֳJ)-p*cO'¿Aaa!]@ @~(((8owɕn__WQ)4W~7Z_E_+7 W^wYtXN9A_uR)BPM}GROsN8ojoׯ0 pwIv z"PR{Wf##n7bIgJf" 7]'yw-={i2L&fϞ=v1thnβ&oߩvȸzܳů}_vLE_{G'OF<Wٜ}L&I$d<FY:|rvC I8& vx@ GJ)Ç51썓 gR \JR,*ds=s#| ׾ہeg@+}+%_ /_2Jk,;BvjFl%;AI]"(=¿K'Uw .T%ߓ*DP{R(ơC*`727T:Ww6w-]W38~ e{uxNGO /_ /R СC @ @ ݀RP aEYɠYje?dZ[[wtY)?G" /OH$C/ vq ϧo߾x'O5r7)o#5]nR:t9컓bp3,JmʘOuM>"Rݻ !RP@ @ MMM޽JByyEh`+@) 4\e'ʤP`: (SaS[ 宛vl(ͪt_}-*h@ @ :Fqq1@C9o"~T@DPan\~秉FLegrWfs;3H߉mC-b;p&6S6< \ @ A7`={dϞVvď!7(d2fT3Q~ܞRk3c7ݖU%>$aHp-@ X˪شiTrm unP(D*ww-Ggq}Tl:t>;ogtYǞӥN ?:jjjj k׽1c;_iܹ9. ԡ@ @ 8ݱgV^71_6oѣ;]^).?:tܹ0())s=Hď;K=Y[%KQQl>J4Faaq-K.B! `͚5$IE]D߾}yy"3;~ݱ_|+_aܹ]\WKaY]۹ ?,B>Rۼ,9dj`5ʒfm4Φ"TUrj1k3@ ;v`Ջ#Gq.~h7zAyy9AR֭c׮]|%Xe?k y۝Uהk;لׯ[ϛK-2Sl޲)S`xf gnЖ[0Oʚvd6J,# aЀB-(23aP[֯[oAAA!ee41ME}Cү_?jп?PS;3~.1^x!sy uy _ŅsnVK yn>o%I;E֑ľb39x`w {iO/^D3奟p'qV>>%fۻ)a'#ϟُp1`Ulشo5~n4O_G[`|/#6qL as(FŊ+H&^&,?Zឳ"+a|MZ[(,,UW1mT?R@YncOJ z ܚve(|R 0n80-˦2mB֟2Mwr<+k1Ls*1 B!ijimv6'kKRZZJ4Z9f}fsF-,&B?Axy':7|1\;acJj$_5,ۓ3طDD"Akcd2?ʎ};h[inKc8hhl R5Y>=Nvpm! NƺZV,\KkAQ̄B'"@&~2o.msC^{loE Rxf䷙@ )B]]|@UU}&-d흶T uM+NQ^^δi0I("Ze-]ߐR*6KMCXl%%%瓗W_M$N;rgT*75UAYY9u0ƆF7;>&aZ|9s2d0MҲRMJC}=G!J:=<9O2ITnK9uN3g_ʹAdsٝ@/a>9:Jp` (cVa3m*qdEt81G_Ga7>/o<f@ ?n:$gϞ .^zEF2bJnv@;W cuGCCN:H$B2$L&ݸōOlxҁw= >|0o6%%%D"W_}5(3e _ȭyQ% 1455  燳AC}=DQb.ixbڻ]|p_!2@Aԓϳ>P9\~|ڨ&sa:߿}=k❧]~a棝Sh_`ަ~:y VX=w]Jځ[Wen|؍:{M|o1,ty%3_2{3@ >8r(+W}^];yd&O~Oٳgw69(~41YZoXϘ1cغuu EPβp-5l.!m{Kof۟> G(D0,xiZI)- P"??>YFNYo0`\hmh٬z>SJqXeew7ol //"j?;nbc1O~4M Ӂ_9ϛ/OU8uoyo⹿ef򷧙8BkXL/@}z_ٌ?qᬙ\xo)cWdж̜3V?~ Yȃ Ws Y𙉽nQ̻5^8Gp /.;[{REae5H(NhCݒGy(L'S)I ̐a+Dɗ< vy3.ghm4lcY0v)e!`Լ&4\5.[̀;{ؽ>q3Ɖ7ǟZ᛫$:6-\ĸknAҳy!'(q܋Zo>&|:c0ߺH޲M GB8f}Π}"D:rRXwdƗՌcj?HݦTY)ٿ>Ͽ<כoMwy<.C08g_O"gp'apvPM=wKY&xyy}@ G5qFƍ۶m#JΒnKA5k16l M>|\r^e/vPԶgO(Þ#ZXH$Ox<ΞߧOW=&(B J)Z[[o_w]pTp~XKOySJK vZCr#2 -Ob^pqӽ⍍TL4cϑ`7j`fDx4 YȘGOև~҇έ#&[`Nr(8/'ry&^x5Q.=M1…Ob.=Έʝw'V%/wq7uâNnu'Iظ}}[+|[B1US/ޣpb@ }1Gbpd3{,y{b 7UkV ZR#АkS5-1TYG?(Q_s.xkcg͍ʹ`o5$wq^arm3回ˊ0!yGGO1lj3IF fa=Q -o(&7{2sF3>r^ Dw%=-KޅIw^eЀ2w8TAvgt%o0SyKxT/[ B֝óҌq%~v:OkxFrc_gp Kep@ 3q뭟c<3w}YW,7a\}չvʲ2[N 610E(k֬aΝ(,,X| }h5kҡ:; ;ߓ$N:d[I<geյ'Jon,L)z/LL%iii){c5L 2EEE#`sN6l`!Y=x~4x{e7دq,gg5 ;y72'SC͞,^3c8=:hyp o̙3װx EÁ8˞ye[Wއ#Xsyu-`uM#$eKgvK}mNH԰ykft`ezfkI{,)cw}jHR4\_Qd:мk do&x8`dM< n^%u02:ظrM%x[Sa|zFkɿlڃYfw@2e`ge2"y4R{p;+Wn&?ɩd`L̘tOPs]j8 ?[,!*_ZCms}k^fQ5T^4g8Ư|! ?_2yH wzP[w`h<:۽3c`J 3<Ӛ4vܲ755SUUh_1(DkzJ)-)0 Nʐikm%PP\R̊+xe+cF)+v_3 L1p@ `A .䦛n4#4 Cvb8Ѳ[о/3رczy3eȅ?g3.2gL9_|BVX1Ҳٲe >Ɉs;ޏ|]l^XO ylu⹿Pn}3}hnygt;z{ J?e(.eS^#SZvkF<;ef/gz@^o/ D?yc\z?0_vkDK]pp3:*\a75ZEUt%ogp5]L\uмG>13: -G'Z@ZWv;ts gYiK=ƒw.EF2;9~tO, -oɌi.DF2cR%K]?>=&@ =Ys-ښ)j!3~2mmI7mnnfڴi(`׮]QPP@0d޽O+̈ǑsƎ;U^Ș J]V0{eASSUUUL<9]Ύj߆ᄙ܆Pn}A1ۖhnj& PJQ\TL~~="9nm7a?G ٿ?˗/'LI$R)`0HP(\@;޽L8bm̝;~8kzW"XcPbeNzA1zx1bS^d#p!xX 3=x#oFŲN%oH"HIEao\JP@" JZZ)ҫ rWYrlesmN F<.$iHD5N&6?7w^/d.R^R`$N o\}w*=|44)~$HDtih-@8Z@ 4M~ӟr73p@R,[WPYy&7x#hF{1nz/%K0`nH  \] 4Mڨ+rȈz[{kX:,hMPYY\oM4eܸqǸ[ ,ʭ=ӎBZ[[AAqQ]L?Ov[$ n୷{ 8 L׭# B}ʙ).OO慊)!^; d+ KuÔђ=Ι|Trݨn`q-nA8JL6cgIɾW.~ӵY tykd[KJJU_$Z`pI6@ >رcp?Ͼ}9Y~=r3gqcƌkm4[)¹hQ˳6.("D<(ïR cǎ }tGϧz:݁dy4MwIe~ֻGңG***(,,$Juu $:=Y @Ff3WcS͈a;{ ;A@  ^ qyQ^^Ƨ?}#ekjj* Xt)gjoɒ%+\a+P__RiӦѯ_]ە0twq?Maݱw2ff?BO/ҟ^Yn/v֟$  H)TQ}{9w9l@ @ ѣ,X6? \pAvŢEŸK8qBV{K,Z}Gy!QT\D^(Dk4ضm dmDrnh̠2-z+>&\7d3^oKLWk}p`?cǎ4 "@ L&YryG`0i٩~ksʀ/gݺJSP{Y3EJҟhX Q__O@ @ 555ByQ0ffNď!ήڤ w6#mǞu^ g7#.{$PwQ\{Y5ڧ7 v؁B~M @ H&9r[6ӿpTǏ uVeͦ*?WJ˦voT̝Nd|/*{}+8rֶ(M @ >S^^A(d4Mg;`Z=KkOa֗HkOlindnʫJ N4/wvMĬc!AϞD"òo@ @ tDx"nM?*BN|v790P^އhZ>v$>%@ 'xy\{MwT#+K僮 _ȗo*OBoAHf xp4-8] K@ MNN]8 =J Hr6QP4r 4_0?.M]0-,B+ Q\N~SqZLyg㣪fI&{I}AAA .PbZk~~բbJ+bZ7,*BT5 $$d_'31IN& ~>y{Ϲ{<9\S[: C۽~^\eld', z{b^"Yͻˆ`F*(d/ L~s:Q;;'EX| 0Wo+, !ݼ0Un]l"wsnQN`O,|)*0@;tbHkSk; lge&<[[ lgUݺ:+`0OT8(-qM+2xy١lEeo׳iQ Z"""f#ؗMP/}i.?cly}z_¥Ě!?!^EZ~}e540D6q<=4+5Yn GٜNqo1wVCM[g?0~ .k 3П2~OhDL؋ӧגhJ4KFs9;qRp&f7%1s[/Y9ėn1E8Ά RQ沨_g[jvNa鱀[fEs໿_đoa)ӧޜ7ct`4lVƾ]1lN'G/U:5!0n*l/~,=oYQq{_DRDDD~*Ww"gW1< oѼw{<Dp#g1x+/=7<ɞlj ,xRLI^?PNoXCi {ۆ'a#Pk.`)wHۙ7*z8֑Ѹ7~`rE⇼9ׅb;*0}XcI8#4^=ahptkĹ]KsD"pfSt'>+qZ 1D 7ssJ91<̡H`^۬t.O_cG eNLa|l58ȾÁ2s[9]M׵:Q˹chrrt!ح o4Ev{CB58B_FNgk4)"-+]C$^`dଈ&JsS8J9}23\BzwG7/ Ŝp=~86^0]yA!9I.88}22/"v%8: ǫB+_Kfm77=`;{C*J=UkpL`O_t@%%dfM>xy0U]`t]{q)gNDCܮ@уO#>S| ]䁡JV /9]wO?!,=xc T&vpaGj%+I@HK*"(+>n*\홰I>J#3ӍTX=]@a1.~mI/IUR Nq_{WOof[/O`œX/"""6"^WFƁfMڊ+˕Cvz&V/~qL-NWᅩ4{oRSbi|]ق (˾ƦW[F_r7aV&cgacRc)#2N9 öދmT1Hj #ŷ\#TeP`:9[>1 qe%A.'$p0@җ)xXH+:2rKfs3Z9S4'S{+z) vα$ak^]~9Ҝu|-%3kb(#j/9IXh|seعMBm~mZl>X^q^T0-ggd4kOI>yC|&i o 3fc"*_Mo|.fHKs?'Y○e ]M@Qj,ϑl/K&zIMtk.U#i|}=QJT#h12`O;ɇhk`ѐ9q˄ ܼj0a `;H#5u~n=Kz2 S)h&*ً[4uA@qڻ|y2V}߾NG B7ʑs)ٞ^h$- " |2[o8_Sn460Cj5uF(/1GUwsWD0re#i?t9C('vԃ#9r<DtB.:( C/*2LaƷB r)c?|&&G*'`Mk%xP\|r]1 셵K+k0O4 #pX;k51KXSz+K8;Gmp NoS~-ctgL|K#Ls53rYi4v Ӌ9O:&᣽1gMh F 3cI'pxNbDi'wGOX~$܉)RFD_rKٝQy>"L3+}Vg, |9r[.$:DQye@n>r{_T~.jl4ӥ?d ]=߃\r ]6vpc]C~{]9vt-Q\:RnY8gқkad0MP\Kk""""mr۽`We6[S$O?(/{k{az(f@cQ>G ТtH/>[6VfhF d*ΰi'&6Q`NܞWkd  *wV $a#/cNR0~JB׭p]1m#dBH();Ax˶d̺.{$)Z~p,$qGۈlq;* %Nv 7ᡄxI)??0&NрQWHXX7N}`4D0~O| & 98aQ4ߞJdbI`00f4dP ryU w, Y ^=bLs=0$rpݢ.6!;giGL̑xWqyo4p=]ŗMFO0ŦH9pj,#f#! a$R38ncZi ʪ%| 16/n9QQ!:uu 3\CYZ&uiF{GfHw6 cɦ~ ?t:5u4 ^xώ F g<^.x~91)#1Yh0V"^].@iuRA; A G^;bG0|_PL@jNO(!(^!t $[ pB51lfȲ!=3A+GH>Q#3!g/p%Vp'fq凞ɣ9p`'5aV'>|kߤT-JN,N~~# F?c}#`'I5+ sM! 쎽,M3/LENDŽhr Lu8v ҳe\>zeUs=P0 t3yb4g!ǓZ5rQ샧78kh NWNÇ v%0zOWFv%( G[ו+L>C$Fl( w 8I .F\˔#| $JqX_ Mj׋=/JwK8N'y"jq[W~e0M;;}]i^ŷG Էϲ4n4'S,9āS Bgvy}Shu2-Nm#s(&%H54ʴV@ʶ1کQsӈƗ7<{g2@?d6Y>/_W'FEW*J=7e:>&6ū R%xؑ76x  1r^rK_l:zX<%N\3>U@kyV.7+\wmn LZ82&@DwLN_`]hT6oT9ݢt&N>ET^ 6[@@sϜkCڸ9@wB{Ƙo̴ IDATtQ}'ʐ+"NNh0e=5,>(8-Oǰ EGg7*-tYq ?ݛ0^ʹ0$GoN߯uPTR™5x×1r0icc㷛!zs ygؑJ_OH 2q7*h~[ǟ4 l'f,,ܟ ¾~]i=/#?83xݯs{G|zSº#^FN \={xkm2 0Pu/Vݟg?\|05ޖTR@y0 yM_qoMaH `7^Dvki+objDyV/bB{\Ê@xvKV]g-r<y#o/ǂٗL?M:͵1At27gD% \\N߃4k͋:Ag&6[j9n+@vvd`!F\]w3W }>@IY#F#%YKWWfV -",! }`#2+^Vr SN$/[~/C+\`/?18,*Ww*0\+l"ǰ?+ӹntr y/9!}c_0yHj gb3U7:mک)>s@YI6`zO߼O0z"'5xx1rٲSzLuߧW#>d0{1$%a3(9=F#&ӵkϔ0<lTU20`rV[վSde+t<]ӅO>ky 80xA+6Va%'k ;@9u}"EWPG>q }'?򓿯"_Oף*%%>LS7I7]G[y0r3l, lZf!"""1N'~|6@HqdnٜΊ' /hz5Q9/p?q&VNmdN)A=3 ʝCO)o7O)?JWȉO1*(f߲(øٌf;su40 /@QZl7rة5?z׸Kehf'8Vz6l]|CE!E$O>AXX-=?|ŗ.~( f;)w*+8 H.PB|czZںҳy:2((9ZYFckmW6Owj|\ *k}ڪj>> EDDDDDDZ eeeNAEEEGIDDDDDDc41L***z[DDDDDDN'ZXDDDDDD `l7P-"""""" EDDDDDD@(q"""""""n[DDDDDD `l7P-"""""" EDDDDDD@(q"""""""n[DDDDDD `l7P-"""""" EDDDDDD@(q"""""""n[DDDDDD `l7P-"""""" EDDDDDD@(q"""""""n[DDDDDD `l7P-"""""" EDDDDDD@;m)qqӣ1=n3s|1 Tt:S7bse؁<_S~l\޶2G̣+I0S3ܯt~+""""r񋂃kެ\^ߞt2 /t%Qi8H?cٜIc݋k\wQsgbbQ-"""""'؍-U©SbzEZϮ Nq,bx8cYG[ ԟn=I6E b=+Y~T'> [UgX^%10M呵NZ ͚)Ϫ51lm/#(j"֍Jc7Wcx ft*AM^Ϛͫ;iaQuo<]?Ȏ}Y{ W;?(hf_^G!_$3Z˰ hv1?llD¯f[jշ0ڪi^6;gNx)B.bƼ֝](f[c>k6?AZL,|-& R7܉QO \@K ~W/L#u'`bN^塻[;h*=}]uZ򇴢/5mL4xI, >bjyeVfwu:XBw sds~OWέ"""""rh)7ζ?yB+W/НIu_|| oꟅlƋMqMKi<̙3kXicyyvy5%PG3ydd,_gϩ{Sbfex!,ڋm:jp[| \DDDDD.m` Y(VDޣ=K+&c6$꿻x3x썏{4C;cy㱅,|΄OsYXsjs4u Kx(wi4Tyj p?g,r!b?|W_nMmv۴gn<ʌe=_ZoKpB"LjbzأXbv~}_k~DDDDD6k'sS4mVľh/h 80"J64Djɴfh\(W.k+ӌf%} -Ҭa^[~q"޼kk6~ē(,Vԟj^p*W6 i9PQQ<-t:(%=+2;`#g_t:\E87lf/(+@u# Q.Upf,3x6kd^P;6v?Q>UTSYy|]19=2;f~݈ hUU7a- 3+2v3f//C j+Z,(My96z& "|?E|B jZs>Vv__|띢j2vGu>y|>r4d ,"x+VW AaoDDDDDN]^4 ^""""".m 4ģ WqU憋HRΊ>{l\> ::[2ȏ9U-ؕ@F^6׋<$ȷyu{\cĥb6;v8z-]LJDDDDD~,Nl5w7DJDDDDD~,uqp(0i9=-"""""" EDDDDDD@(q"""""""n[DDDDDD `l7P-"""""" EDDDDDD@(q"""""""n`vwRDDDDDD킂ܚi0ܚȏqwP-"""""" EDDDDDD@(q"""""""n[DDDDDD `l7P-"""""" EDDDDDD@(q"""""""n[DDDDDD `l70EN|JJJ(++kS ///||| `0ttqDDDDDDbp;LII___6ۄnBz t<, Tp `6 ۛ.\@`lUPP%%%] =ifzv\DDDDDD:ޅ t EDDDDDD@(q"""""""n[DDDDDD ]x9fk0ڰ$"O%'xY"ƫGMi; y s zR<«Vo"fp t2~#n;Sͯm ʱx!~]癘?bRg՞OH'yl̈_ 8Y b{_`'mŔ5wWXϳ_]uiݽQg~:Gz-oKi1Eܞɶw 222H'o==ٖ&amdXrǾfKQRNw#n29l-̮$c#[cHsIiTꁥ\~6&2fĝ8x }xxNGw-6;IJ^"g Z_ؒ5 *Ȗ-Ct9<>RUպ7'W歌ȹ7>-Y G^RDDDDZS`Wbڽ+7=%S?YHMc1N*GcF_Cx&m>4SDkNm>N<4S`~6ʃ} lW|¢nwoƍԯtʳ]G<'ץ\;`γ`[|xUl[_}d?-'@`4l:u@WxK;XZ0O_ψ{cz漴W?~F?Nm?9zdN'fs5FEDDDZs`W˛Eۡ0fn+j̫}_  wjS3͇CLS74#2ݬ-+KV2([Ĕ7'ս? ̙jup {A 4P&lyd:lU_>)ƒWIGlX9>WٯDDDD:Mm&N{a<d=-/[qFrpאľ 8W>2y68=n#3k5l5s'1fI sֿ[p``WDu/|t2R~SXr9tZnצyX*΍፛DaݵhwO-g0 ^=wlȣuhtʺ7^vum{Yeql9!nyo5P&X6=VNMf<{4ۧO4TۣF[rnX)A -eoz:YI EDDDS"x^m/>n(Yla70q"C\:jr'<ّO*[H 2O`McOym>W ϱ|k={gGDOk4y$@$S=jUkdįOxa)':g\\:.tؗNC XtKkC6rc ʻ-rc??*qW c_ȈT,u/=nضs|&vpgчǏuFrێW275Fę>[T}iN`ۀe 앋Hknz~+^ v+gh^)eߚl,+ c%Q?aub._RQKsҵ;4P7w8o'57Uf|&s&F9l:މnpuǜϚ Gpb { OsX0}0i;Rz>:2BXY1 c{+#m{{!nz'ȓ nu|^ &,=G|a:bmj~s7_P@vg/՞L\"C^OG鼳u=']wڰvժt?Y3WwPr;K;R3>QXQKg{u' 5z~$t{t%¼Hٳş́3If|7 &NY”s~&4 &OٖOB-\\:͘ESyYk*o\3 {r,G8Gm8Scxw ٰW?t o)>ʖ{1`x"kWL:Gƛ x~Xȧ0n%Mu!wPWyf2nx|0YUsnqW@x{<1ײD'f^n,x^g֨ ˉ80Ϭ@!XxPEceӢU?ꧣj x+d!r٣aL?O5y||Og'wtW>]593(τL+&!f~9Kc^Wk^!D{`j\ Nwĉ۷Eiz?m),,7&UYԳ5h:L߃m#L~zz;7;]{^8,< ][߯{V=VC z\kIlE8Z=מnN߇r ʊۑC՗@oFp<;Ck}~X4U^CfI{w}&PXIq[<w]DY|*pރ-"""JNB jgʯ5mp}mmM_֤mmjj{[h^]L͹M-N- kj=Kw+L~q0aΈ[Bua<{wt """r4vgtCDJU]oĮaoI-ӞbVw`<`Hr˯!"""rQ-"#iչ^%""""""rR-"""""" EDDDDDD@(q"""""""nٻ㯒ДE@РEZ )SYمR b1)FEV6`UAʠpUe^Q&VtPPHiJM6 G${s>'9ߣ[DDDDDD$`1v)].{u""""""r\~!/NEDDDDDD'.KlP-""""""JEDDDDDDB@ H( %"""""""![DDDDDD$`lP-""""""JEDDDDDDB@ H( %"""""""![DDDDDD$`lP-""""""JEDDDDDDB@ \*>]2+?ݏiHf=0V}Du7UM{\ \C׃[:w7_ Ye^e\0EDDDDQJfDHl/+YKw;~̤6@b&nz +,Đ2^cC}& =+dKsˣ=q\X7N! , =Lkԃ$c݌:<1fœt%eϒ{|<Ú?7l,qø3 Г{Osg 1Hp#1]?uh_HH(~Ò K$ӯ $ۿH0FF=68]ϩxRlei/wI;xIӣcꧾx6q;1Ac;t3F`񀁓 Ho{Ig]3,+ _l[{ LةphTU9\Hjq xݞL*JپEϥkrG}mx{anXfEW^c~A\(򰰰rU“1L~zw:LBݟԥ+"r4ə 1W[<NDrxbZK˰≙9t?WupW;NE] t: Gvؠ[OiE;sϤTVN]fͤ4}&Ġ1no:@d`;SSs 'qW :xHM8ka> d2v87Hao>Vk>eC1tkbCa ~DD?"nҥq}ќ.W !ll t\p,Jg06]/615iw%`TFc8`D9c [&|>z25 S=_#{ž'C}łdz 1O[K8r]Mow##anIc~ HsHIfOMU/r^q;_cawF*Jwla,@yܶ%E5)iތ\24X3X=pTNz~ о_""矰8-LǮ{뻏'6[#0 rcn]v|JnMX6l014wK}^w?5lw|JnK3VvN*÷@[|g,CKr{z% uFScia; ׍=gFF>.HR9c`"lj@SMy`"0Qo쳧9}ԏ%TWdnh֤`>@N-yr4-:溣aaaHZяOU`6aоW֘ǻMOɄt~b4KL=X*ιlm,1Bڱ$~#ԙ%uY%>_?HHI#q_cg23(oa3q,m:wGb%w)e;XUodxxKm%d?;|k:<0g}ܿX`9 ,>+ >sc>0o4D{RZC񓦒dq٢鿏ge̠hi&y{Tdk=:l\:4fNf>tbnu,"":* 8FtBDD؉04r/3 )m!aN8 cSRj\7ߟ yIW6p"Ē8q( 'Mfg5MYIyb[P/\̥&&wʎ{'QٞE;eЇ9L<ߵ1ui6UAᩓ ""rB`o=rITPw-"mdBwm0Dvlta8WN]H}W׽/G,+.v?=pziĜݷ]>yF "3w!K|K ].O$cr|#8,W't:jOY=e |v'p"%vӯN5u'kk],""ZLDD |ku;a6 td_v}ͮے|3G3sb+"+vllT% ݵO0/79w7%3 ?cAܵIb+קEszED|kEDDڀQ!"<)(u+uRfeut2$% .q,H"dض`1ON^{6M=w>"zb=y(3EZ?|K)㬟3׏t""" q^4.O#{\,Po4 \..Iyͨ{{rvzxr'iy`%Q 術Y(o:+xjd_ݖ#Xnt#³Wۃ1Sp$VSS }jȹCC vi.`UPYiȨ3{oI`7um*qb <ҌٯC8r*0`@ߧr*=}tUgfSٟ4-) %""\.".""r LEtLDu5V%2FtsĩXUcP$߿"""N 928lr&|ۧ"" `HHS!/""""3`  o`rD]~'*'v_D_jp=英H"N{mEOՇqHWmwrngxr3aSkˠ_2W68E}{())e+ IDATM /gmboI)%,~y6c$oh]amy7E^,Śؒ63m6eN:_,k|r2峹Z7G_DDDD~4)^xYDH{1} iM"ح- QE#"j` =\{@i#7sU:SoFx\vuյ\ _LDDDDm;Y{V];T]ߍ+E6.)ֲlK?_{=wV*=m+K>gO{Aʒ+K`ϩĽԤl|K +Ӆ=3llYReiU"g Фby~iS#c?8kXoJ$(EDDDlԶ vsG[R8*RYtB2ΪYS+vrw<$?yI[e9s6߳ڗH-1}Y?|YQBǥ! |-KnƏ8.9oϽ e}\<:{,g26b;3}M\ҵ;׏ǯ-z^6^^p?b,=o(k%ߜ>("w#Ww~zqi8Fᣘ.^c:;ETYՁAS`8_3FNǥNƺ'ӗm,lF=.9DGj Nl LaY 2K@Os {! Sм\ާ)lȹ }ydуl|x*CdS@GzKKhXﱏc hig0}fE% oDDD=zigA]-rg`mvv:'f=N@\n:rՈ;?Mf4fœ4;]BGDuUsJ+t7sXr?GFCU%_C\M QDDDVSS =zb75?`m 8h"dh6,, ;F"ip`2Gi@sC={)[]-~\s<, hOr9yۭY~.~6qOS<߁E<(N Ir>'·72$q&o|<'l<s@^]2qۻ9kٵm-7x#vT`+~_UӲ89$߅Sf+)k7U%V//)ڛQ>Eu&bnJjj*I;@=GDvDNK,MHfb<ت_Jv\bSp9š9diبxa@2Ϟӫ%3_E0~,@RPX =\DDD\f 8o ^fދfs]H'~6;too5.0iT^ݕGu 2JjÞ$yOaB=ˌ݀ٯOB7-"0k04bOˌgg.oςصc'_Ba/Qܙ.oɥf#ŧ1ۥ>gx.(njc͢< &@ĩ$Y=t)#>ʼO?7DgϽ$-KݾJEDDD=m`w/={#eoboP} 8DI?}TYW0o[#d &LVQu/2mxzTjq=lW9G u_L}27@ťX,6>A\&Ug#el` LԭUnvhuݚx<1ǵdx lqw9fs=_`kcxF}q 0T#Kc:=\DDD m:əŞM2xbf,e|J˱nYAJVD{=@gR*+ȟlUB3=*?-{V)r[@k (+/ǺM&e5Ex ((LZ,XRSqG3!zKk]UdPTn3A& Sw,Nr4n"mIM wP^QFT2!}O%~efn!$؏.WX Vcr20zpf_DDD׶5QpVg$#99e鬞OVd`lj* Hh,LezJ*x'#{6odD'^.`\Ri aSbεGyI,I`RF CE܋^^L!0UU/`\sfM<]&l_@/ cԯI9ei1W?] 3#xtþuNL_¤ຐrO,&.d_!{4o=ChFS7]>5lU`l2Խӎ gvN*Cu7V֒>k9;qW>nfLs3|1oəӠ鍧n;o<ۖ=ag&6;Sf?5تwر`4 W"""rp\m7ݘ _ k0aM &fSvO[#pKًشΉix6`"*g?~6V&"""rjl9#m=2x~ǕjIDDDDDDD?SEDcU<""""lP-"""""":E\DDDDBn߲o߾%z_X+墨:}}㹸}^t$![DDDDB믿￧sݛHڷoQov&x块raZX,FG¨fq1X,rѡCvWZZZ:%***h׮oU`HHvJJJ֭۷`0h {oc].ڵ#<<Ӊ``Ϟ=7r|Ml޾ԩk׮(TNl :{  Y_syﰰ0:t@qq1Nߖsm֡YL Dqq1:uJےL ,,ڵk{m0`3C z%,k l9- CnE 4B|`7ƿm Z[uNKݿ[VDC:EBl¶A䴪?عmjIڒD_knۏB Ni&W~־.UWCr[K7vs145ֶ;r|ϛG1ib?+{ĉ 8AP`{U5V-&#G{Ymp vj>*ߔ5?a{ym~FN% ǎn . wU^c}6)h5Gy7+-VJJJ())a,f$1mٶVw[u`YKWpt: k;'Csoϱ9<Щ͙V\ʕ+9qD󨰾OY^Orx=[xz%4?` 0_~i$aCY-lpU6Y%,i.7gYJ IZŞ{_DfM.2:7b~e[];64Pz79xvf&im?u݁f54ۺu㗿evlnnw=dX<.×Ozhclvu W~y7=Ѓp߭ ;c# ~tt |,4l `PWR[O#.fceUlMR l+u^ϣZDRRS:)scl%~ªPa5q 7~y#QikÇ}e7nķi(dY8K9p8<5l݅H{z_o_-V~<OObya1-c..¥i~J#-m[ct-I,xJ?b[mœ Wmg69l"mӬXokux,-\x~\k94-"""f'O?q&'N8g#2RX69w;_7__gH:%+QI)<߉j?TcFyp|K|? x,1I,ٟ[9c1}lc4α?hh\_?IϞ=?I޽}Iw<$i;?n&(jjjpVW: ǒq{Q'kZ;%!wc6y,Lw_t0c wQ"댘ͯ~ziY5`Ȝ4z{!L$`2CHxÂ~h8ʑ嘮H\FLDU֌@T JY% ZMM WY9zf<33%`zʅaʜN#gM՜1L "XSF\/^HE 䩌`Gkx汹X}V|LjR߶U?w,śH{}q zٍxkq*K;^P (³k;Y))PC@ 9 I[u[G#""g7yA9* ƿL@kdZ?ǹ}fj%pc7xqVڜ"|s.^DŽiټr4 e"ß jrgDM}"sESȚ9Ǯx|Tʌ8"-#mǟn`Ka[ o'cB?a]w7+<ۭ{rwV_Gl}-0ftub;ϱH|qn츗1iT$Mřʶ!g%ZOł7B1}tα+xb@^ /競HDDDX?-ߜ_?1o,#gs}h702Ƒ/r}Oz:_M4|2 caZccy^]i5E$F,|+{y51^X7@ƺ'ƾ;;͍pOQoEorߠ{}Q`;5&.1z^nmW.&x؋x~+zћ3k5I{lMRy׬׭_ds-U-:m`tt^n[W#} 9!%1}DZIO l< \ƅMžh.7k6bb }%Q!C>= ch__9k Ln=qrs"_7V£[bȹI )lds;fώ=|U{dgqW{fsώm4n4m-Ʈn?E`0pIנ)ip@,^ !~,sY5E_ #]k#a|P[d;3[A~BNɶe>~vЙ#2᛽ ;i!p>q8~}I o`!pu;76{#xvlext)0]w ۹'c:Ke` }-HR87UY3%""^zuV.߲F}k)M`J[R^SSÑ#Gk=1>˹&9sqKlb{~"q8Or[g;P}mgfrK"#s6 Muِ;Yx+ʏR ⋡ё1r;#]4@LaD^L(fcXZ[Suzh{[togPsG[,I?3'xπt?*9񴯲v" Ϻ+k<$$[n_K+rDžr[ۨ1n (vvާ%fc;S/saO}yX=LDDD$@ C+Zm_KO9A);`\߹N`II"btGDD们#Nu d[WhhRv""""""ݖ 8t{#ȷHH """""""[DDDDDD$T` lP-""""""3ŠHS 茰"$Eu^XQ` """KEDDDDDD@H N[DDDDN:W_}ӧJjSkpPZZl/"">}T㫯K.aN'j5]Sp8ٳ'QQQA̪sTWWB=t""""`fBBt'bCCOZ'袋8q}`0;*EDDD$ 1͘L&~h?444`4t""""0!!!*Aɿ\`w'"""""ҥ lRT`˅*(OUp؎x.or{A/?3ϼ_V[K`;/๼YDD.<޾c/Z9I֞bgv9Yi 6dln9|X1|J@kjMG\\2+;uY~s[IK2X19l6MҖleűnoue,ӼmkOs-]WرqA+kpT #9c7g97&vw١۞?BorEO"ڱ@uз8o=HC_.PRV~-\w5S|n0HBڈӑm龂Z`HV&dc^ fZlI/}7"jfO~HTJ&%3qP2y2b̛2 ϸPs7µ<<N3P^)Y Hef|t;5~MaI!9X: 0g1m:v o#+mKSTbf0?3IK[loȿ, X8E)vGy"k?`Zu[wuDZ|7z Z"]Y l+'x`?ٓphEu8牙O?O||<@4?}FI6?1yrΟ{ 6G1e6=($[GiZy ˖?cp }CG<CBR(ǶkތՑÛ7*0qm8y0{[>7$sYdNTvbҘJ`I^d:J}bUM ;2;6#0G>ŷp8Ux>OZKlUߜS$W\eoQzBn#.CJt5)r^`u`v.ѽi5 $=59v%-ba>$M>fsmzdU y˞d%) iWfXyذIcDD_ufN.l2onr>^"TO5i:bxbH:ENzmDD;y>03n'\珌BIB;te1l^{Ff_@.a j} CG/H^HBೃFӑ7# W~ɦG I䭘EL0by%9~LShgdkxv5CgK/5[s>)71( O~ٛ ذSct| [6.Sk p]jndܬyeV7(ײ=;n<B Op,Sa[:y{2۞%wM&[UVʀ[gcy` l#p"ƺdm)bdLJo/ nmWRRQGPW! E&#lYf5uT-4(_'ߣX={s`ԣ'ώ}ggu4Qnۃ€IOUӺ>f%>;qӾ1~;EcQv,6;>O/M zF mw2&B[3a+ך144޲YvKı-#|I'51cSUugR S-Wji)&q纠>J*hhRfc9pzn kY,NfvkmѴ,,e9^g,3̰ S)o2efݞXl[UEɮ f@oo}mvc"ǂ[)|&eligV<âBX~fsKLK۱gGz%b`y?XWl^;0cjChqΙ'_~C W[X6)쬰:+ij弇|emncj괷8XؒŊ& \n;xŪxxؼq6}Dϡ#Mm;vbUƜzmͿg]ίJw $g\ p4SRsY13s_Υ$vlmJ\51 2v[/!-$1qD,`\LmaLz4D ypE!%1i-{*Ck ksrp/Wo*xۚ@ĕ߾;{Ɩ+8 biOϺCői)qk-1>?5E'S2Fg1WulM}ơwa(2-rλxx<4+VM77<49X,?yh,,E)Xkm-?fz]qy_~璻gҮ9e3;ʷ۶q^ϝu ҞZD:WMel}{ZG[;5xvRۭM^k&{8p""B0 حVj1a6ywXu^iosŌ=wnO>!66cnsخvl6B7$$Ps, PcО=i8{j)}s` ,,Z%!!!|s;Wg0444=W_}W\ 9`UuFvხ'#}XK[mڻ瓃H{ 5ѯF7b6bռ`ԫܖE,9aa|3"sfOhN}}ቈB`mfy~o4̍ncU,K+*EDDDDK Ӷ GgϞm38/[+"""""ҥtYu'"""""ҥ l %Ci?;zDDDD{6leee;.MmvwW[[˿/.`^Dի ӧO;.KmO?4iTdd$C !""svW*EDDD$`.b.`i?f0ꪫ1bDS F^ۍ.`0`4(oHHnS VDH絈| P`uJ=_lg WYZ$U; w݅H """""""[DDDDDD$T` lP-""""""*EDDDDDD@H S0V=W$=àkgB0Bк)Pse;Kc-W|+_O|Υg$̠̚09}ߙZY=/]v^{z=xLp}uEDDDBl[5oe]e)Hywt>υst6;vkp)9L p݋[}SvG/y/A)<ğ3OIѓ϶<IOrM/A|CS۞vk(am|Mxٌ Nwx&cbBa͌[*Ю}[f+m1?"y^7L)<~#bxy(s#F_rg(;ZKO%6օ[bqmW\`s긊HW $^iz X^6gXo )  /yϣ1EP|d<뮊#zCĭ0|Mu֕Cy ok6y.tOC5'mIޏ0w(s_vɬz\xh ;A_p&|[ z lvn~-Fk4 }tK Z\ ɼږoEo$eJ(BR/ΟYR?:""""}\Ơh/v;˱b&>_9 8#װogD[y%9-:*6oSq{`9囦uWY f4* W,xѽEC_l]+6Yڏxrýs`l>=#zyr>n{y+ pzQ*mϧu'+H _:춄9 ;X~j[. [CIW\?:""""!gw)P;x,\89RBi)Zc;yr廔ɮuOtqOq"rW?3{ٍHiƃE09~ل;XS.?[liϲʊ]]#3_'!6Z}t`4xy(8؃qc'315{[^OP#yq<~rtk?u|lt*_uyپ"H3вFEDDDDCCC#-~~i{0ah2_w W|B_=#i2g)Wkˆ30zFxrYjjm#?-k瑿U[o>{] u63G`l?,I?3'x\<-o{]=u6G_9&ڏ#or\ѓ P-yVzҶ}|^7Os~;ml'r!WY~w;  l S/Gh\x3~qH\N^1/g\DFPDT3^ziAD՗7Q ȋqgz8DZw[2Qjksm9~%.tA);sz??#파yGikYe\'W'gH.@u.q/2 w{o1y|=gϨHg %❥Kϡ{~m4k%"1D\DD{鲗ZqvmHG5]"""""""݄ lP-""""""*EDDDDDD@H """""""[DDDDDD$Lt_eqg y-""""_caE$H* NADDDL lP-""""""*EDDDDDD@H """""""[DDDDDD$T` l0}+t8jlZϗԸ(:voZO1ג<5k[yHR'`hW|ۉx:k*aU޵GT4-q1ڎm;//nkZоp8FD>\D"/ <+%W5D10g]RY"0"[mZ{4j 诘84FeSrO2S2TF_1fD{9+&{|hSX].2 `Ɗ-U'9 7rJ`LjMO[DRFbNSDDDD vU? W*p$Ee؏<`(e],G\M@]ٛ-[Z+,/3'.588sdqNogަt6a5Ácz1\LGIˎ2 @#nGZZ>l2`Hm!P}eC uv:&1EDDDD `q$ǹkho>.!y&ҴbfvpĨ00+i>%Y~ >>̯&%Xӟ )`(2BɻPBy+fAGI3G`x`LNa{3#+8J}bMAa0x\xq1Y3'bUDOcM0Ǭ[5CuVNX 1JK8VeeٙUW9~Tҁct1)12||2}Ƨ7*=B$g ""hF_<r/KX L}י93A|s8e}e/lKlQ۞!&JzHQjrcYe 53cGB̈́G'ߜLꦻ0`.""""nA*a!;o5bŒR19ړǁ>TA+tfutVgm)bdLJo/Vs6,bo!\D8@!ÈnLvo#fؾ"݄ ^MO[Ȩ]emya\ +V `!g.o3.C;%@Xt[VÙLs.6d ̮0&=ˮ@ Cp- ̦<ԈM| ,DAl_a{[<vOG&S "tD=XpߠpU:>d_=8$'+Le"BqOs%,4|H @lb}@@?sozSaF~mOE8#!{,6;6fFO/j|oK_?#c#^PC4LޱN#Sւn++T[sZ^ ޟbb/Emwk.j/(F*dxLREn42@۴D,~ULP` K`~=i}TßL-9f/>|?A柵 J#]'~Ko*i?b1k5Jn:Q-G&T=@5Pݨ_f! ekȌ~ zW(/o* AഥuпIF7")?C6@k#vFlfCsY6h]dT῎-[l%|@p/{"(AT}0PRPTgW{nL؞ F6A+4AB^:f|)1h~NJ@h=` v\nĺ x/H S 8 A1(W P@ ]<#`L0p"A?$ ICJ:C yAP8 %@P:.Au6=h-(fya1XVa H8NOp|[.9<(EQ(u!GQPPiTՈj5ƢIh,fhG:}>.Gסosu Ãhb1.^L*&SiG w,ˆǪ! f`ck}wEljilpd]5qxZbnE^>^S<6Y>6>=`l{|$~ lfy/  9 %  Յ[DEDDD^҈]s;"V/6%!n./^%>*AЕ(x&T +=qDIՓNaO,bʊzwt]@vZ3r%>;kې'w*o\5< ¢w0pbKĊr1JJ:/_(*M/]+ //+PVQQSy ~ՆjK5l5k{]aqZڂ[[iuP]\\}`xkC[oݑS$ؔ{{)6Gܟm hy:=;L::;j?lzc]]u*ݷ<գSTiCFoc{-F̟u=~788<>4>;<"ח1/WFbFr^*z-f\u7oߎy7>D⇜IɊ)iޏ>ND̬̦~bTYs/s.s_)_7esΗ-l[h]]|=R?v.;/O]ŭI5[nmlD)PToeH wA!\|׶os K|?.GsnllE`; 2BC4 O U+7c,1c8Uyw av@daRg#QYΰ6Mp0ss3'#pIW.(cyRE2dO%ɇ*)nS")M*DJL95}FO1ffyNͮ93%1.p>OSxdkiIr=,VU_\]RqmRݭ %; 7ML"ת&g;:[V=~mDG`/Og?3ƒC*/4_ꍘZ y<^{:8C>̊Eq eߛ~|^Q[4-(7pBi4ՈV@WcT0X.L$Ӌ23p łaŲ1ssqps;yXnf@".ыb?%nIKJ I/KJg5(+)vREGeF'< c9|-Sږ?tJtt7)JFƪK&qfZf+wwгV)f6Dg;a>G̝y?4rA>q}QOO/u2Ż)h@ Ltg=DHGrRpŨԧэ1{c#q&@ 4Sk19jq6#qxቛ';N eNd}9zf=g=p5?P!(~ɪRSpEFbo٪z[Mе njߊ\?tQNHӹ-o1kl}P㸮{+V잵 zsXzo:]χ?͂Ug(AL%h9z@z d$5>-b@sh ua_ěH&GGZNC7?b1VDL#f ^~)bpx_EӸ!g# х8JM?ɰ̘,\G2&=g dYebb{ɾ‘˩9ȳ{υ_+/%'.l*=&f#&>"Q(-%"A\&XVF 4JnWQUT]W{DW5"甞.g27mzyݎVSl>;m8\\vI+{L>Gw |b=B<҉r8U؎x}ԄKٓ2S=Zf>|RCYم9w\и]YQQSuj5 cu 4}l&Wt~{l}gp y0RntķY/~W<.S^Zli|uZ=@$h;eBH–p4\?Bi{e=c0uE*6{A,^DJs Mȧe=NBw(MldHdglac&2ד.yRP{ޢѨyK+:eze5wL0'౐ԷMyޮܾ֡q+.Cw9HO#w

,H۫&oqdjЌlЧϾ_~ }[rZa̟kˁ˽+*+y+kޫ-kkֵϬm((e3@WbXX)X+FQu0P}tF{eЄ pHYs   IDATxyUŕ?-ݯiF QQw&qQfL0CN!3Ɉq&nĈDDQQAvٻ^zǽz_7▱6޽Uu9Uym.RJ}IJ,R^򴗿=#|ͦ#m{8(m GXE'Q ÿo7i mJ9`eVssX,63LNVJa۶W`05;d@)K.ah3Vg?ď]쐭zeQv-xٶM0(OoJ6%oX okԞ =?eVK999?%_%dF=tJtlolɏǏU. H76)Swt~bDJ)lFm#_oÿo7 ÿo7T*E*Y[L& aJRQVIJ9ѕ~VIL#od2Fm"ifk({4z˲2lQƛ-φÿo7 bCÿo܏y/''gk./V*_7WN g1^_1~:lP' r۳Y{ WΟ70 ÿo7 &̞=xIŮ' uuu}vm3C~DdՉ֍ Jfk~IPCt r6VW{~e:$hT*q/[#q`7q ÿo7 _vE***رcGF`"2dȐiӦ ӉѯeN?_lly.~# l/;x#ۉ=DΩueÿ ÿor?޽{C4%ːl_DRb@ ]<:ï?[h7 ÿo7 _FII ׯ'pgb <8kJxʉtfDozm; OR]z ˲2"'Ѷmvh4ڦLH?#G{ir㤃3zn+xRCIg~y  у޽{q_wo{]D6(`[햭o7 w\qS___8q" 3qIAMz2^g3 ÿo2 /ĩܹsӧ_~!y+^NdouoŖػe 5h:'DqϞY WHdY{ذ|7,ff,ˢ[A :c&QTӧ'UT{wW-aUl۹ ߧ# أ&ѭ;@kLzFkYl&Ms=(s 'Ie:.$5?|AKqa۶m;3t}ߕO"T&>lꓕ^/}m柰t=z~=Ozz:'g׃~.ڛ ÿo7ϛ7|6òD"b6rJ|3䂞AbY;֬a#tK9woӴk'yj {g CׁUo\;/?ʶE/+¸ QH|_5[ڝw{XQqmز?U Go1{ؽgeet/&!z{1~8 VP` e+7 lGak3~vg3~=Lu~t@?~ RXv=z?O]OoK9+%|?׫_'J2mRjYDz,oqzwfmͮÿo7 oܸuFNNXh4iPē[ epp2n; : AA%:kvFIEEla 2s> rJ,u<_Ya)+(VᑯZ~ ssY8=M+ye<۔vg ɤGɶA)gnq6 Dm Kf, ,b Cl/AUe֭ 8GrEoBATcG_c!tPr徎YǗH$ϺN}/[pm%PWzϢo7 ÿ7y;?Lo?d"{KFI~y  sɑC{Ō׷2l^6lZʅg#aO”e9.eʷ=g`h@Wupx2`0Չj6l a#tN~>XwN?Ἄ#ցl8p3<3Mz"x7y饗8rYgqʩbI=(7$ܺ,VIDIaae侮B9D'RVe_B#F`޼yӇ\ qA7p꓋A^ʹi(¶m(++# y7&}|/XEOR/}r2HجգTP(]u]E5c7ݗlGK&n>v4 ÿo7\u{+sqyQXX)mvl1?/`ϣW"IjZ()&8QRL22/+{UJen*F- B PX}]VDY v {.38Hi&,YիiiiAQv&!r!BV9mKV@݄6v3Ka+eyRJ|v/8ĵCڐe+b+?c'[N|' cXG4$999Dغu+J)JJJ{&I}bHgV>KO)MRfL*8^TZK ?=Oz_h׷T]c_o7 ÿ+xm |o6!Q,ǟ8"`aCn, yEyW8Pd2!GtHoW}B'Y?/ _&h)C등Rҵ7K ÿo7޽{3_=-K{[L d2IGаw?PR8 p43ǣ 9h7?+@~!=V ;܄J@ݺyd zlۦWy_y\r"Вj>@2nU'HVMv͸q<,68I>۲,ƍ3<oA :#Fd8R.` մ?;S[ȘB ӞrJ߱Nľ`[XZ:YNv[Nю>Ry͓T{cUspel u=a+SY gǏeIO:ԹxW2bH"ţ]GW!b z $c5OIIIƀmrlW~?g$QY \zj=Z+y,d-,vՙ?Hd?qQlEΗ)|? ÿo7?Cx܋R S4z{-{JO%t8k!CK8= 'e6Ž" 9ya"TnS bBA&(&#F?t¦k(( vA8Vb m;4n6b1gReIqN hK}}=*x~>vrc\[qYmIPjxf6.fqWZsm0"R~$FN~7(k,Y`?~[?<~W1^(DJ_esѣXr555c&LȊ?LRٻ%,!Dݻ3\@LD?jODzbڵdDs!O^2Pv2Ro'^'A^W}?ľz./$ BDIg7 ÿyПHn@|գVU,GOeP؅$˻XуeсmE?z(b||nX"F.T*++ٷo_FWJQTT3._蓓[ Ô@* 'OW2uth^m$6Xu#R?n#Vr_J_!$mW|?J;##:V]~?o7 ÿ? D4]1>΁Rm}5ljbWS#eц (*g)+ m3B*"G۸=g6m;~ȁ 2dkHu&q q8WlG ruʉ3|?'ձdGzDh7~YAMKrөY!G[cu|&-yt$rK[Oe/cO'ISPzg2]Aj*~2CFOھ,&^ /}$w̰n+P_&-7ʓ[Z]W߷+%_)שV/?I+mֶŁvWAI`ێ3m9^[A n'yd3IU,Y6L\:F?? ÿo7tC%uYBEPԣuֲ}f,^EٰᐟOkkGe9z\i*/n ~5PPܗ(BxJ Tt+杫ٱ{3kn|* Jo@bwFmtdGӺ(=ǫY0 8ow s'ТĩU+ ps7Խ `ÊF~~\7ՏrQlw2g}֨"C\p=B AF̘Ϥ~ֽNxma Wʈo.XE|I6^^ Rǟ#j[QrRv6jV~җL:~kbW 27PX^cv|q=I !2J*ph4JKK ?CvA^ H$B0@}գÂEY~K:M-3Ҭ'D$Io,˛핥_:=A#~~$?s,$ݡ6K2 ÿo7x<'''.`@#c\*?SNL&b455mjN~&H[[[ "=T>p8RN"LKS'[DK9`qC'qܨ4>*ZY=fy5qbtC8sdR7Zq](YMMLg.9Z?WA'NW?Ƚ|Xs(yl.2o J ^@3 ՍfO>v?`Ǧ<#7bX-78鑈syߡ IDAT GUC_vg8C$j:}hWmZs(O?)((K_*9O&2p@vIUUUF/..f޽׻&'鯐߽{wjkk3+jQ . ad( fRO z4V,5[~súRnZP?d>o7 ÿYOpb\7(o'/% 둗 hq<5H1n izB~Dιvf CTRR\>kw l'9rOW'\׿ M&4I@KBjrW?_1W;|c6Cr3.n?'Yvp=G)84J6) l)whLO7tft`-˖vFߵLEǿ|2vMiiso{n-[Ƅc&t?HRUU"lBEE^1I]ijj[n W)WWZO.*^GYQ`}IF^=o_tn%,]2Vwv ]u^ ÿo7?+m&o &TV'D I7<[At}^w}Ͻ^/޺Y@4@ @޳gOh66+yFΝ; ӏ;< w&@~n#N0Vm 'x,#{\?Wl}[slŔ=?ܑ}g`c)<|on>XR 8+RR>'n'ʛ%p톓)U.^SPq˞N̟xa=ڏgh6ӟvmu.[R"J1f9a,cuQ^=d={}ѻwoO}p'0f<=sq>1G{91N770=GGzd[G2t Rm۶ѯƏGcc#louw~S|[h:nkh`3Oq4MB(RHYad,Xc#IBexq޺elm"TD u_ׯb."xcО{M6K),d8rζ4~,p 9") vNm|׏_e_TT{ǎ۷M߽{7{(#~2_\޽OĠ<2nHG4XU:Kl^>R)rss=2J=RDo7 ÿHupQ? )O\ qoG>tb$EtRq}^|޾};Ouk!qd…VXR*B---^{z[,'O\?# HN-3]~0'Pz甥B9s:ߺ7yp&{fTk\tJ<=ms {0V&tʽ?"'&H;}rPWwuw_Fu},u4o7 +JBBm}(]!zƲ,`R.xƨWtwW"z#J)q}R*b,˲صk}Y4:v#N_~_~uHGE (}عs'{999qF*++)(( ///C`6 %+?yWA}.ä.eelNLǬOm{,-VHˌÿo7 HY G$ yIa1TL"8-ߺDHD0iz L0e\G;JaqI'o{(8cwvI\LebS^NY; SZ.ý3]XY}I;_QGyM/--%P__Ϟ={I'?8lYYYXq*~=K~}b˗qKʸ*.2J)_&aѯX)\$`ÿo7 Ok…J'YoXX~RL&: 97&=`J&wIF1D% >^02H]Gt.%kwo.ӵ(M"8>l7 ~ ),*knO%ܗ @蓡>cD?e ';% 3u8GerH)u{Jz>3 ÿo7>Tq.ंR\ek(P)Sg#ER /%O7^oؽ{7eqʩ.(:ލ<y;ݤk*5Dru8eUI+lu +Kwe:xi/ͦmu ^O$X05b/٢/CP|O&@ѩG% Ȩ葈0o7 oYz.$R騆,?@=]d'FDZVz+p`" .ƶg<Ȋ+(((`S(.*uVkuxTjj ߱$I ??6mB/J?;Y>i';}|PN}`}'3~!TI3 ÿo72zH 1mgM7vHDBסG-Rm*" + zzR1G{XWY'CrGbYuu(;IYwuQ^{HeMVDZ^:YtV-Q~`]Ut\i ~sټy3W1_ @xzOOSb%vGuYL-jdjÿo7 _)FNGqZ[ZK{lmW,v|:L@1bV! b #F1bĈ#좔ڱsp{p%Zqm)mJidAU.Gο|-O%]GeDidM ~2 ~7 ~7 ~7 R6֎;eYSqZnFrC$0}w .4}w .4}w .4}w .4}w .4}w .4}w(!Wx>ru~뽓8Jt㝀Gʱ-S I0 ~7 ~7 ~7 R k{u,Oni$|v*#AyP{i^k&]OUK9oooV;]QWQ[:vT|TIQ*pZNt`,{!eYqn&Yh:򺪣y Ngwp 4 ~3;Ixܤ/һwoT/!%\Iieh\OϹq޼q/Xd!]ҿ$"h<me FAAd#F1bĈ#FضM6nHUUp ?*gP ²-O)vGϕ{ l^lB ,wy]IȂ%%YwNlS d(3|ڵCRRRB^^q1bĈ#F1bcHqq1 ?* d(@zG"_m `g.+7Tz2 Ǝ͔Dy/:h,JQQq1bĈ#F1b0IJ,zVTa&۸?19>LŌ?//ZeT*UJρ?LsmĈ#F1bĈ#8۪֮]K+BIb}R`#޾o)6c.v>-o js:WGi߳g[ne֭9=+Uo_N~mӧwxgcĈ#F1bĈ#_tٶm|:g֭cԨQίjgu?n޼gy˲ѣ&MϧwY"nRx{qH+^{5{(~yTnvA%- ,Yn-4uisnt@nmYcqoE())ӪuM7Gƍ!+:t(߾j<>uuuvI{\{>}z$?x%#wDYmK8n|7YIu+i*}Я_?C("Lkl2.(Bݶ,yͤwzIV-+:O<e$ ^/V)-D5yCw>Aa(Ν򜤊 V Z.=)ck3G())O>AkTZ~:cC}#ά`J.8٭}:/>}:'|2eeeۗt֍pNNrCu*m 2#n0[$ɪ7nuKqWmE]}={/Ƕm"ݺu )2 /z.XѣyyyD"MF~~%?-6)˶nvQeYTTTP,HoztynݺW_͸qhii!Jѽ{w.Rjjjضm$ R&]|^LB'PĒ ߾tkV;/3$1`ӹdHɮC$/ Dfla`(w7\z\t/^ :LfԮD#<~oϋ3~qrҦR)AU܈#F17V\I2tFW Fݽ'p/s HL߿W^y%@ Cf7ԸZŨ'Gnw{mIq?m&/nݺ9sУG L6Bׄi02E^{wvz}pC^$]b߾}ܹr9FA]]?L2k,6l@qq1ٞ]?"~7f|?ahIrooq''Ӿo|/2kҽ| 6Q9V=^(gͯz8ww-^+gobգӸ`55m%'?__>8n- 782 }pȄ 4?q:Ż^ gv ?:;om?egLdlb2x\_y䗳Xy!3?\y1{&*r9Kmϻc9R ظُ<˦zB 3)訜,6< o%_ƿ^9]5N uSqIR@rh9<Ĭ|Af=0r)g.~f;3{Q"'s =мu/ ΐn,vY17}Q=:-ཽ Z6.ho{EQdJX?yh_nvE:֟ 9kk@p:vAY3gͥN.b@z3Y˵̐f',1 eXqMq7Yr\>$IF9{"vݝ\4Kb5xc(ξ;?6z#F1baIm~,yDŽﮝ0a&Lhs}ƌm62!gW_7SO`ɒ%9\Ag[z/`]Phq~ )**"I$2=H.UUyxiNoرs Q+   Ale{z //?qR1c_#F,T*Eiiiq+g&p|$^'^sg}ˏd)qo_yi0|jx'3YO"X/0oɵ=C9`99*V49<|ד8Dc k\*:w7EJ3FkgQ-(;:(uw͚ 5@ IDAT/#̝9^Dp-ӹwӳC?~q'Q1f?|}k&ڗc޾LJQI.1bĈ#Ϊ5k3fLoذT*9-Y/=c;w.P7|pv@9i>ݲJ^nYUfmo9X^u֊+ͥ>D(//~466b  Fh{6Vq\V44;YCȩܠ 3q~`;hnn&73m7Nˏ$A{.߼>ix6[^:X=e#οbN{{WLaRN:ȯ@I_c4S ds)\L -ȯa/_7_G#Ѻ 5ih76Vc".fN:M̙9˸7qFDn(ٹ+K2*wӏ9ؑ ~A`Pp(!y;,&r|on96|sy䒉J7[0+ vʩx&UTjv2ًگu?}RZS\FOγb,_m*kgbنjZ^ ï*CDʵzEFxρ쭧p/~@ .LL=wMfаQMtD9]IS\qÝ)!.KK؏ Gap. E@~5j+| 7l(D"lhpEAe=KYXZĤsJϤO1?DҸ{S] ;GD*N b߾z(jr3<0+1̾nn!i3,{W#D_vwd0K&7ۈ#F\/]Gdw&3gBw {pimQ|8SM!B' 3DSdT{<@dqpT¼7fcsGsuY,:*;f5r-;=-8 vIX;0O1sg,+@} -jB}R BlؐKyP0{XS0$؂Cvƃ\r`+}>_F5ay#F1baKaa!_~|O=?=\cuY>mNY/#h?1LNcXEn_ʻKnn.A~iP0eʔFaWrDH$…^H" JĝwɢEؾ}{;vO$zяOWʴ,Wmf{R,F,رË6ضMII ¶Pzv|KKK7xC&믳`<>L2I&B$ 1TDV[k[.+okkŪzbJ @VdLf&LL,9KϷm[w9o]uOʆoz{1Q0spehh1vURZvw%o'*DX8W75?S?]> h`ͫfO!I 5A\l*x+XMkKYAN.W3:0YV@QEXQmMzqmo$Fuq=<?' / qڥ.[(&ˍv囩v(./qWqyY 2eδt|jl|D[]0!AO⹧_awQEXn7c3q@II\OnP2Pz2'!ߢwq>/,LE濳.o<?ž 'Ί},& 1TW}z\>  oWAA/|IcР~OWOb 3e DmvRtIڷky}eNeYd$^ˆ mX4d0\OQ>_yUQ _~Y'?9l@>O~9Ne޼ /WSav-m7_Uup:)ط}.we2l )deD폦3*33W0]Dm#G(=Jrr2III466r뭷rrlӧO^_:vǠ/g[gfѣ7+:EӷozPiF@uoϾaFkj=p17.(XDEE)$g[n'!!_={0yRVZڵkٶ};}i2FeIc'9{*O[vCtčCka}S_z<;_zw‚7Vpq" cG>y{7LLj(| ZjQ\?+)~y?W{+ɤɀ~+V~Œ֬GO̪ny TasEGqwzk Fg%9v>WMnO"[`6GOn^ӉfwZ{zRf=Kܿz_X@O1sſ>Æ7ͺ'A{#['A3Xpo>,!I#ٍtgV\sm[V0KG8Ʌ\'cq@]y t79=.W&4fA|x|ˢFqς{}_>}oOL`U֮<5iyY6@~wK<,ς$;3+/ū^䧫u-<51!.6-" ߇Qy$n ߋmQoXF]{36y&O!ϤX<}Țy;yyjLk~#'Y_' %;nusBDDDz͛=zLȔ[, &ng z@;E} [j?&lظ{ظXlV;vO?ҜI;wwt?)m߂#6ݻw+`L2ٳgj[0Z5W\kf&n Zg-Irr QvZŝ<Ļ:;ꈈ+Bcc#5558N<6 A\\y :Fwc?pOâp~p}wkʚzl8Cۼ>: 5GR <5T@\R\WGhqIÞOC 5vPCe}9Q‹dm3ո`I&:+syCZrחw= 7tocuZ8ډ󔸜TX!'<3OokֶxYxW^\wfߛI<,e8 ̋{;Վao^'NZ}~EtҾnu9q7.g5.xp]R ܷމR].Akqut=6v߾Ӻ""">MMM<vm 84Yf k~JVV&7tz)>:/ <1hU!(LMM^/nDCC@Pk,ogܳ;h8vx]+|9v @]]_)(8ʥ^yo###c//&ǖ&-Zoٚ??fqQDDDGVfV@MjgFPkM۷o71֎n%9^aa!O{c/22N)ONN "++8***hllx.630alMkcۺEk;^iLY-t$4W6m[N[ZZL܈?%%];w-t-[0`ML-[ n6vZzih󚠶osr΁MӤF7^7s!XW_+~ů?ZmDFFJD;hfڀ@L0[oQnu]󉶶x2f@Mf"ӿGp1߲s(~ =/111DGǴ?noC> 77m7[:5xeNw_+~ůW_+~ůT2[fMyhzʖ54|&40?0Ch=Q|sJ7<Ŗ?p.-oRs):u87 j&У ر卋d[9B{-[Y+~ůW_+~ůtgcT̿  ހRܦ[ 6;{]0 ߟmiP+~ůW_+~ůMشiS7CGie]g<B \b8 o8LuԺW_+~ůW_+~;񛦉yi /-}L0L_4]@`moުX-obw 8R_+~ůW_+~ů{;~ҥKќ"""""""4MlGS-g7g\!U^~ADDDDD4Ml[X,9&جl^bXz; _[X %"""""E="Ƣli".қ4D\DDDD"g"LEDDDDD*r&ԃ-""""r~P3^"g"""""31Dy7|≯~!bmx:fh1~Zw-g 9?L3n5bP^uncDAsퟲ ;I[tY0Q4)qID!@]nba`9△CMӕx=ڒx0h]FR)jM rYh(^}3- %ֲYZM-vRDa/uR7eI[w(+i$_^]zV45oiXbtxEDo^~+qI ]YDTBQoUs5L0 zDF#aEBTlzSNg8[+㦺KLc(>{{D\s'λ^+?C3rS32̊Ӯ'bf]]Ȗ/䈐*g5˨ |"0t IDATݾ?~sl6Y;Ws3ՌIXkX:lKV/òNb`r͈kǚ5.O}2wϞ]4  煕oas1o|e_-x NUuwꐻ=j#Vg|V ;n=x8Y޴ELH؞Eyk d5Oys4Ocٛ<[XO0KDK8k?n x-9h2(`7uucQSJ']ݳđNoD vࡶQNqwGm'yv{Zt:`(SdEIe˪\&_r Ƃ,F)"!m,(`_}&_1_w{-bwWq"MaЩ\yMjs'6]L%V,@\pơabq>3"gHZoI͏]qԻjZ,d9G t=+5~Lq;3Uh^ۥlZ!zco f щg> c+ ;ϵ% ;u|VlgO!Rާ/#')yS1 z,1dX4g]L-/&7ORi}ק²C0 #r " @))?ٔCRW6S|վVRӷOF#%&)՞rOqt5 vh?#64P|NÓIM;#U[? O]kx5G\ɼ G^>j٤#:m$sAuu4Mrz Q&:X|ϮYNH3:/ s䌘d9A߿j $&E`4(+rgPQmI#]5Ӛ=RJ5at(0ILC$e'߇&(j+cĜc4, `#, N}0IϹ8QEkH۱gzJDS %=exg䨇lGs,X/""""VIɶ. urjP/N~岋eצ#u{&(MlY;F8<ç[NpnfKeGÿ["/ %[Xk7H|͟\8ݵǿ~;'L%}\G>v9dgm.&P ,_2]p3,Ӻ>;kAEDSxԄe `%>dv? 7^Chѿ?ߐoqH_KUA",પ)ӷGQ_/}Futn:m "_&#-_p|T GذJsw{n__=~X^c~颖{M+qcriVߚC|'aԶZ:Wс^'g1uu #״@S4cƌ< aŌ~x=}S qw0 dK} #;|^~V`<~qy( ྑ>?g"Ƕ?=z6["Ks}!{kAPp , t7?R"<|şdDE?b aI}'6l1mz㳧4V|eŕ\8r2JcN&rqA0dDxeI}<0#IpI8[|j4'%FMg:`ITP^[I3kzqhc<2UuDǍ MyD<8Z\?|tl3 \ō_a{ IƠ1źqXq%ؤH~Jk9qɕn 8xݾM͟%H0w捡#>6h,Aӽ> 0 .re ^DbKB4 'a]8gO>cTKwCbGFWX`PT" ܔ2п:AP;0wa@ nfs} ٹ/'c3)C6"7W\bcD1k'#{^௻7`X ":ٯ'z/[1 #a;i8(#8x2>ߣro.<^NHQG`w#pd MGCDx`dMqX ۊL7 "Nm5FsGqׅJƀWaG-lAнGMDDDkLl#=#e7N{/wl&`M#` [kŰfUFpU0!e Lr䯐~9>}nK' 4p>:k1,-U[NHj),-o&shE|UT tdaρd:[̀15'6cv}zG H"9P@`75\DjxHpBQ!F& hRT~ }io8Q%1ފ2_090A$sxϋ8F>p,)..~T}k h6- ;W73fáf1,#78)!Og 7rZ6„<{%ehx}x]૷@U:W^ Jf`,J7k$҅6kh)ܫ/"[JWzq[rCRT޺\8$Y̬5\8>6payBINioᯟ`KdbbZÛ`8. *e"#+ɶY}tvT|PVC6``Zhh~^~%sq k}AaZmu&FVZR'0tȠnǛNF$zsp%{Z+(8~}201tEa> w ;90huCޭh ZңUGtz*aZ辇Ç0>:.+ AgCC=^ I8@uRP; 8iG03uvm.n_k ,hw>_PSs};H̑췼W}.fĈ[p̷n޹I!3Ytau O)ǔ{`໇G\4KTʔHLw#qb`mN0}'o3#҂5Mll2it6? ByNr{4%GT3rV:C$ad¶uDY@12;H8qa4hL][ .*~VhG2gNNW*;IHz:ٴ_QSoȥ71|bboQe^ep6.M7>yr~P)\  ?[j=j8(< :l3@$'>s1IW0YM=C.cTzxέT7đ<?f&QuEw0Læ  ޽|3VEOOVCvpsba7ͼ(pQ1%qs WslG)g2ve%G """"]s3/wˆӉ{ 77x{'D^I uwQ(2o$ؗBN PWH''bkZjA(XCI ~WmXN2M&-=LU9\ϔ逓_=R2308ha-T\Kj\ cO8HU(5-K+kH-W-e}rڕi0Z*V&"l? )*&O{,1iWpì+hl̶XS. jwHt(5U+9 gB3;7lٷԥOgToD '5Sw+MTŎJ &%"ʂ]'NIquf~a`"=X-l䒌AłjGZ;,']O>{} nPRU΀F4Lκ; OX{qu&cCD!f,䬯1S|`栧st72#o㞑nXve""""4Mg w :no07rR@T\R\{8ߘ(.$cXoʝQ(n2kۼگ '>Ƹ$dڇzQ\uCCwڐT_B.bX`"ڢ%6nܩXżmC˪/-$؁r} շdX>1㠩Zw{O$H\n=RpAblG{l4RU[٠GnVqyJN_G }3&7`}m ܭsL$v>͢okۯy k KDMF<_[_͸::Eyo19g':H"/ɿ}S]y9 1Ӳ2(4>Ir2(:`ӵl{7ܿ("tUPAF?D|ۃ9wie+6|4>: 9 X~w|VT/_0wʠe-YM9Q]GXᛇ~GuS^l4u߳du }|&; FDDDDD)= /{;KV6#0) )\_N_1wX]:8OmҬ>%'r}HKQND>%w^.imiBt\f=7䇇Cl*Yr Kϒlo?>|k>x`Ǹe:EDDDDDE=`/,sӫiM_]|kX_od dO8yc4fa>6mƫFʿ.Yŭ,y9],;em7~1'$oY/lzg-0bV'(%u䃶1_rr2fjC꾩,xE#X]_<-^ʲeK?ϋZչw>gɒ%l|/.egzH{[(~L2G0{ YaDhϜC|>vvOpRmzO35wx4d 2+mywywV`Ŋ ,`uzuW`*"T`XaC}o^^je3 ]>΢zs#$m=jrYclz[k捌 qtdhs%*\|]ðvocf²~^MF"b9z#bꞜXMDDDDD=0M'>=KAq=ƘW&ƙ10[obl&~~=oĐ3At7БЗ\zaIc#%$贑=G7,w/ںzp;@ac124Y,GmaZw_wwHy=I$Ÿz,VuTOns&2dEu(.WPV+v[ixܥ8{H;<ԟ˿c,g~5दv3QgyA muR0hߖ9nжͯotpKn  """""'؎~B'fGLj[{HТȫ ;!vqhdF/fCfeG߸:$Qy03= TV-FcF;{ M YSm;$FPY˅A{쭼N'WOy}О XpV; WCK9oqC.m,nB_5dcC|:N,Z;Er]g.[J0љ8F'^u]9퇹kLNc^߱[ۙ:)fX y6rߥ<%dsa'ϫ,dq#C:6m+p9?@m%yMYX?{سc5Οdڨ$ :w»࿖yO>;6e#m53RLcKG3F'NS;Isسo>˔9CKM._Se0'ywfgBh.Vj S{{pyx]Nmx|''"""""眞=?=:[&_b:KLGgGt|~!+;SrXtϴ.W>XW1קÌKK

ӫ"޵kKxdc;D7˝=S1Qwu̔\3Gd)/.g>"M +xhf׏y2[==s0Ϟ2S´n~{zE˘ӝȞ0Sγz^9ܻ1Z"ש*"""""gKYҧ{f93YxvzӸi,y!fv2z܇Xbߛ\Zl(w "aIrwnvlHHi| Q?taNzwxvȝï8v`ĬsFL/ZE{^3Oj޲T} _dbs7rrj<-~ŇNdfUeEACD%'%!=ut^;X06CgxBFizcGy}o<Uǂjǜ}<ρW [Hṋ:;LcEDDDDDR}9 _>sޯyayK,qv2?95s9GDDD@("""""""~[DDDDDD`l?0up88wyyyuqLpp0!!!4nܘ.EEERUiiibX0l6rrr᪫∈Hs8D\ٳf7nF#aaa4hЀguqDDDDDP-UMӦMJXXyyyu] `Kl6e<oEDDDD%?P-"""""" EDDDDDD@("""""""~`ȯXG_z`;?ƊIp2 ":dLX̂OFnK![~TLeRV}ost 0xt7nPESwҌˬ񻎯0Gj˥8?0e߉}hհԺOjuwf[a.X n2wٚ~DƟ-W4<=7c[?CaٗoKq8o#;{GXv,]Pl2xX֪R.cAX8jfWuHe̤l<ɝDrLG9u]:Mٽ=±@@#=ĩ5/_?_^7GUӝw3pJߎ e,zt{A꡹<;Zd3?M:'lRDDDD^`Y<+&Egm3g<6#%358 f\nfZ>3oǦ q{p%zOEu2S5K6efny}DڻzG1X9u<-*GǸJWYtvt+>%]v+ƚK>zx{6Ŧc2VrFfL՝]LY}'ts 1+?N$Ծsz4޽V_@5fEDDDj~`zތ~J1_q㊃kBoǮw #I c⟜=C=C=_kΰ\'ƆCřԍѽ`Zkx>mxbrHgۊJ̬Ry ?6_c2xa递{t\s0mb|9{Fߓ9W{?$,K`ȃ w%m2xoḃCɤONc[<߾'>\JDDDDj lp(:4=/C2Go~KYXOXssz!dVxsyq\}+_u !ȵhu&S{ ы ۹ +͔3ѹhkݩUZn]~4RƖwJg嗓!c'+ܤ )/d38o_/dl97v^/={v5w$)GH#ڗfo=ӾIu7|²?L9 6Y,c.dJ N'omȾ&іzFZ0HNOda""""~\"+Yom$V:ϧ>p`ѓgwMt헾"L@ʞƞ2+q ѵ-W__I]m$CUyC{,יGi|(_~3Q%x[KSq +u*=}ǠBزÚ%҂qO ct~ n@SŴ( I,v9grhooa vtd;Bë1]ؙۘ3|_74{ky Fse<][pٻӅӷ3|m2?\דA}{Aa>p%M|y;oclYʛ<zMlgb;8nmTz{\~T] gtD \M}p} ݐovعM+X^z} :+.$rF)GspI.osu ؓ7ľGpCr)`4~azܓ78^Xt'٩|L6<"z8k]ղ6p ~83ƞ?6@0~[^{<]}eG%hv+// u}}{0 [ovmm*M)&kz{r3i[!g.?TJDDD7fҭU%9'8C#;V~( t", @>6v1n?2zmg}Y<:43M3ftmu<~7/^}mrsV<ѩ]#8V1<2\׫gq6-㧠\Q~4FSZ y%!?(~޴VŃ=o>i oX̱_6оb߄s9Xa lk1•[9˖ =uea2ż^^s/ly6~=- dV1!<Ձzt6|՛`ſ.gh ? ecgxzK2\YK: 槥,M[hw+gq]>D Cl[{k.@Ϟ <4夳Ɍ\+Kx9KoBDDDDD~ji5syj\Bys4H /KMygc{0S!ſ{A<.v1ofeis|4`c־мͳ}OHO}\zF89_Ą?r-D.aX}[UY9r!ȄP^,|̄'?ɵCkѦ&9ODD~~-.ux2cL%G놞i{o| @f1!g2\{+\0FT.x}AJ޿}/7LFW[4v-7ynNY{.}tOקx쿶҇{2cvOv-oKy[;1!P-`.~ڳMZL$~hOĿdz N'V (**rsO}=~ 8w<dΝֳnUyngJ?ҺOU۠doҡC7,Sb 9M!A4jф?_3\Bؖ6R?99؀RN:u ` 4ۦMuSU>[r\g8kи Γg/ AJ'!=-ݥ ޯWΝƝl~g8M!f" ( 7c?\cHgL6-"""RCr ν>Pÿj}u k}~]LU9W/VuSulOU}8X?g]x}nd0vfp8v`.9}oۤ޵ry@L" w{Kf'~Drh؉o-7@DDDfG \+3o(""""բ[D7B""""~=KDDDDDD2[DDDDDD`l?P-"""""" EDDDDDD@(33g^O &[D"@TKځ݋XwN\.J|syQOc>w?2MdzR"ӷLb!Ul0ff¹#/WQpM`2zOʅFC7q"""""@{ù/vʬRFv' <:r8dϊJHRx~f fΏg+@ _Ք66a ej"ޔÝC~ֺGtLc^oD! ^&>H;n乘rus8eWI; h۽ǀ6|g{[Px;~IhXMFgfYSj>8z9B & zﻶ_NZǩɵc05^wp5M#(vII\yE[,t1nՊ݉ߑ L͈8-bڭ9 Xh۹9)'h;p7*U6Qf{Egm4;͗IƎK<ڇRp*OWqCӥNf,[yνdOb2ـI1׉f`0Xhݏwm,kAzp8ZOu+ū8 ~⣅'iӁIst$ގ$TaįJs*[jg~HC(,)[н8jM|ѽ3MbW@>xnKѴ)辸w4k @֏[>^ٸx{ݢ߯>\o+ݻ_Mc{6{}A's+('܂t6'~խ1dm6EYxG\ֹ#{s lT:ddggq_p3ijnۄ3GX8ㅸsdveg]ζdm;ӹm Τn:Rj,䒺m=3};8)DƮ i(CA6ilXHZ+jjm]p v֮DJ~}$g8dY+ed@/47O2E;x: lVr5AR5iwiOpI&pq[{ p#-u[,훬dٶdXg@[`@ggϹ1n֤wy'|S%iu jX}8<۱r5h(MJ |lg~ɟjEDDDDr`[6t:o2Ҋ)ݎp81TMy^תtif GHyJBX 7hB%+B;vQRlKHŎ`0d:5N>;B$/G۴ˀa +?K0g[Ҳɮd_Z-_7iu%>8 4Sےvk)'{-S^vvnu0r~/y@8QKnI+v<RS/rߵj^zAx[Bݯ=~;]1̫n*`ZFBL34c.#z7egSJ33-( |ϕ.Y6KG Ehp {Qt8[طaOAfe0t/iKgUyLX=`2;W ;oNд>/ٜٚF^8+dfP>N<mڻ3`|_Tqp=4u8^/@ @3ٳśOh`0G)^Cj*kTA;6} vUҧ]mET?i$uYxΐu?Q;l:ǃwh'hܶ=8%~*g_FdWfzKf<=+ Heݣxotoul5 ^7ӂ ]>I ,&5i W:q!e+KJ֢Xvo`Kdmd1]|S9rϾӳSs$%eH0Уc(~M.6ro2o@0qWKWlӣ+I|9!o Qޜrc7{fZN=1;&n,OvTW|]|jym#"""""5/~X n/a{Pɟ_L,y'"2uZnA&Ɣd ,kT* v;bԽ7z|0i;K : ,<0;ݺUZ盄AWqsf3nr6ɣuF9ɽcaۺ,_LLAt /gwDnFHߝe؝Kc{S0G.+pHfc`9CFf3$oNdtۺ.UOhgɞ5Y!\S3bqGs}# ޼ud}0:RiyN@,g2?qwnZXY;Z")޿3{YWUY~T@QQßϷu;`';+͆BbyݎfL垝\گJvv6V͍kTeT5`6<}@Q 6LKaJVl6#T5M_^EX  "(uXpo^ҞZ7YؘuXlvm'껝mF#}[^Vzkz; =g}ԽmS=[DDDDbWCx4nҤDfۊ䃿;M@@iܤ& lqωb=X|݌-قM.6=Ah{KEa}T 䑚}-|',W6WJg;vvT{gճOETeqeQFVͥL[lHٶ;F^[6_Y直v.RODDDDDj߂\6-O&"""""V79-,.o4Z3j75 ("""""""~P+>w'N󵑽DEEλ:tK#UBXXf=`[DDDDlʉ'~ǕW^WpZ ^&00.H{iB`@p/443gФI!^DDDDZ X,F}jS}yϧPEs@R# //:V"""""%j%)ؗ+ ^Q}yѱ)[`W\Hc%""""R`KR6G6}ƚ} )3-8!0{ G Un;ϼ?UlhLT߁}D\aV] `s^|TWh[|s³)~'3<|tzG i?1Z_DDDDDI3RdlӃ{ɒٛu4,n`0 pz> b K=F@_KnnǀKG˩ MUڡ**GETlzz3l]oxtOq2ö 2*}3~:+TNׇhaٰB᩿WpwI:X67Yu/@ÁÑͦo/,~p͈[60~ԻZKpq m$}9Wl"Uܴ$4>|KofaOٚ&`KRSxm<9s<,Xߏv{op=3yu9yÁԷ;zr˖"@LQQQrw/rޝӛ” Ľ,;Ͽ˿nfs 6'9irr+O̊˹t&:ҥ)|qXH>x ArRInY;;>y[0ipޝ5<\c7Oag~p"s^ sVsyl^1+''ҫW)z-ˁ;ʈޘc"x Rˁ{K&G^_<% ʕnp88qyoEDF2<'\?av"[B S v-_̀\3&B7O3⾔F{>N`x Lzhӗ>̇"nddV43iƬ6pǭΜ|o%]QTT(zzvmOX0($hOÆQ}FeKaip.Axk3/!@Kڰ۝۴6zdn/" >>bq @ڶl\%m 88W5A3O PTB@a2+ybg[G8+@zt fUlg`߻[MXlc>eѧWpl`W7p8+\_ͯeߤҝ=֜eWiu hL+O2;..CGhg4G v8- 6VN&<}p`٦Qε?m``G,@.vG EDDDDJ&gRTfVv& "ӯsK7mJMiԤ wwlyk8]+x!<U%//yO^0uoaƊ;E։F?Md{O4c GNOap"ͮ3_g9e*4~: Cl I`_mSy %yz43’vAl=}?$VFg"""""4-JgYڋ66Gc~7W?a³oRg"Xymև%o?{__1]zm^kK,{۽;ϿAׅp'xu<ʳX2g`fЬ[DDDDD@QQ&߭HRR7poyʯn'**sWV)dr>&o 9}k2@Ն1V+@G~VhXT@v;B%|l`0`2˳L1,&ŁvɄfja ӽπ4*n/w:wf (*rd2QXXnh4X\6}*T'NpW.""""yC3RT7^׹OvEE  qfa(zۯfF 3/jAFAA:w`Ӆl6 vB J[}} H Rw^ +gE4MjR6_ylwH+3EJDDDDlW`_^tDDDDDJ(zEEJDDDDlc ؗN"""""R v9|0ڵd2;{S}yZdddЩS.HaÆ4oޜCqyg/rڵ!hܸ1m۶%$$.HPTT|&H])**n| """""8MΤPv D_ΉP-F@@6liPDDDDDD`l?P-"""""" EDDDDDD@cE#?kZtA]:glCiks`cՀ"?=l-8x'̆ƒ`MNAwu1.;j&uK__KZ!CC.OQKUYc_8L+zclxp so%кAD@S {~y0w"""""""~:$\[{c;K&VDDDDDD/́ j~a~əa 0ʽDDDDDDD-=KDDDDDD`l?P-"""""" EDDDDDD@yZ"" QmXߌ3EDDDض3Ytiȭ?L0r{f2 >O&аheZ.0ʬ):xvL1|`5l7g>?`uQv35UD7zEGb֟t^D5Qa_2%*5mwao3l1c]]Gl'wm8 e՗@6ưAU@ζ6٦>VZk᪮3lH/.5w?4p;x 41hg_VP2Gΐny,>ڹwݮQ]7v<>kޒ7D0sˊI߱e3yHvs}V_NUI7oeGݪz 0}U>{c R$f0d36M?fAT ɳaރΥ2}ӽ;@Bki˗hiRa)I_~~|-mZ.DN-GaH^Jc).e&`+GLY W:DhA,_>;18vstR`^߹\Rw)gV}[p.@1 &gG% +46h;i6V3il/ccc_%d>6?f畛̌Imcx ٗq 7!:I<8ӈˤ;kt4f,pT;k~$ ͖3#:v,u=KLzq#әnƎe-Xĝa<7?D)Vbk%u^OرXȚqǏpxJ}-w:^z;5{nڤ#zt"22.C7i3q.fol?0 ˌKgI߃3.q q}Ǿ:g7vr} d%`R\cNbG{ZSMccX⦭^xͦ%J-tkq]b"y=~2:]~ߑQl^]quvw<x)+ƮZp֠Eܬp_Ϫ:[}%VcѥHNDFv"fp}oU/3\A\l4z"lScN]zdPs~U+.gL.u{(bH"1e\6W{Zw1ß D2n+p3/'*ABR"$%BT 1Ox H2BC쭌g<)QĢq=t%nLkA V+Mn{aϓHX[D1=0ŻFD + ?msΑg󋗝;@Rb 6H/O byeDGv?YFjovD8ߋ)W'iM"o!CRb:i\lѵ>AԬI"kuΑDb>/὏9JNR D#hQ2{VILZf`>7\%G1gKtO%1~6M!W{9XZ6+*60bw[}{pRHHJdtmleK_3%ޙ_+R ǝ|A3TbIDh},b9$nojJJ0d}tr=mSGwq$%.!)^.?~0j8Z\Qan7mbf<&%^b£|!Yyb?UDF [\f~w8_iguqQ<>=_N{ܱ8PeǕΗeǾS[I*zyڌ:pdHcQښe*-KxA]a;P2<}=w<CcSm;uw*'}~s;g{ӞY>_2Mg+ V;S_Mq((<. VC3b`T[R+rɷKIFΓ#!*vBʼ͵ /m+wD<;/}CWp >x0W.$`+̞8 YO>;h&Z.R@~_vqskPjg)X2&cxrD" pQX?Q>GiáoA]dTf<i;ԇ)&Dʒ6eq' q>cz$ ^SD%cXʺO|Ѧ\?"v ѝn HJH3&oK")l$x/UfcϱMaaΑ'C\>ܓڧwӖWtRV:?~8X e٥ϛ^fw:MK*/nwaӽX,/cNκ}Ps]Uǯ ?_O oZsH-dM"ިyj^"S^N,h_6fj|>lB@tRbnFD@B"rdqMyRU{-ds`>tӌbP0p88lU0>=K>yd/Yyw.g㮯#1G򐎷4%m50>:7eICp YA݋ NHgpdS> f4*𬩍u&{}6Lxm׼aF~<*ּʁz )597hץz<|CPf5s3f=OKcXAY,`h>א|N|m=C횲&#LgQ9qK ^*ðNVccjWp]Ι?g5I;Oͽx.U:_z}U~V6\XRv, }.k祘'ҥ@.[f1~^&~x+3wmcZc9pNuɪ=9u*A}*[\76 z+ 귘H̸wXm?r]׾ޒfZth @L\ƦMk`ôە v3~wJNqlf;e;]^~}3Gi~8͢hzKQ@mxf`h̀qQ@"<`Ԑ(uܖ `/;//wMU?iҦMJE7\ ~0P LGPeFȢ8Jiuof?6ISzͽpn*VTyK: +7*>IGHxI;K?C:ی$KU/K% "#gNs ?::E&i q,fvrՅ m?=ܡuXqC;(mۋ:{.:ڼcg gΞulN_າSm:m/gN.ȭWh*{=or!rߐG^D,&sĽ'Itzk}./mU"Λ/Wd_L}:$q@؇h+#ѵ 0ILl`⇈i_؋:FKZe >CųYN :]n~*y]t5`qC\>|Y1FOMV]l}ɤU7`!}GM,{~ΧQa~oGe=kL\y宿Ҍk_.F,̼2a:O;ɖylClIΟJgm bla̪ŏb=mnjJ]xژ0Lu'2o [q!z:Ds~TrM/[~ƺiWU,qPo/jwXuѨ Oq[rגx<͸ӀKjQÀ$N"vdV׽v6ێ{{֓nnGMx1C*UUs7.T֩BxO`k4H֋Ʋ*>Gh(mcW1?>1{LVm?I {zGN02zҽtt|/ˊMIvaV{1',u1{ בžiFr 7 r/,kO>Mng6cxdŖN$O&qeSJŪkO8f-]-L!jXW᧞lrȯ#$wa&+J1!t>[K8>Rjb~ Mr/\/Z2ǵ{ulqW>׏t*F ɛqw@:[:ǹ(51$'O:Jv}ݕ\e?l}٬˖]taxy۫.Sl#fu.`]ֶ̋JmIv 2kFuzFKmزbo>,um;'/%Uob_݃;}U羒@mtzօBxf)| htO gZ1@GUW0jh$'j-a_5AMْoχ5aa%*t~Jhh-l9Vш)EVIOSh>W;O/_ۘHVF,n䤪6㬪RܲmξWgd1O'>?OzW+U2ʯ(d=Ƒ3Zn߻ϹmϯwPіT{6mV9*7E[ʭZwU'$0_ilz6pk[ѺuUu;Kwgяqwקq7U/[=Op;FԶr+Vu϶zҔ6ڝmNtn]羲zz7;}Wn7JuPKXX@X*|8/R XZ-aڊPUn岪]ǣ4}Vu+'vPa[U[1+v5{W4؄t"ݮ/Yljq+Ү*&<\U.-˝unEmUEeyHUP}nfQjUufjnslw7ߓu75?kj֣-"̚6-EU390йU'쏤VeP!ӾU?ٝ:;OM<PlڎSWrM}N5gMC۾:xj\mnԾ:}vc~o ߁+8-Ҫs/Zy6md+-!nov` !1JUUOsda;) y>Zh}E)>%RroGӭIPG6ʵ@2q?4W9&ˮn]偁QNSLڶk^|i&dsM#aMOuuL22nؐg+J`M$ ްpoSxa:btiF]<ǥHϲ;)hψP +I}%#('h'&E?Yͼ27j*_!CԄlC|BQy, |]e, rsQ?'l]h.=ޘV7͑%c*Z4@(Jޙ_Nmk&,Yl53a3=`9oӪ몦5җ]@_AѴpͺ!Cڇ نbiɄb͎:u~ d-~t }¹SpgHS=$?䧾Br #!)I;WNdͶoȧ=o=/z0^^%>DM6l|s vUB!`)ɽ=+V-YȶXe=O:lCL q_^^+ƿ@j]ޛ2qci^ON\΋,9坭tO^ˢto\Ot>ϜPv _},f &9*5}wǗ< dˇ<B4jpp#xx\zE19B 8}*o9e?O}Cue 8YIx!B02츅;%9Wn/jYy ׾bV2ľؖj5/i&d6EVíV3 dX Li]@ ̤Xh !ץ"X۳ Gg ^:^A~Pweъq:cn <"C*ւѴh7p6p'Ns-1~3vJ{s\r2ʤ=.m vZn;]/nbnM=8K S׿^3[a__~o+/W.0^O<ÈM3a>]ҿv>wH^8kѼ .=d3 ltnS}6+!CڇY fVӆB{ݺ*,|ŏk_|"յ;hU[&wp埱^5_"^GՀP[D,& ,V a uq1ϔ+A QNc۠EugH3XU3u\:InOn8=5.$.Jo@m߶!j]$|-.m/O wpS~l~Ӈ U1=3Oel[OXSȡEi/Ln=ON W}_!Cن_ۧ IDATG5F/) O|%9C/}7U}KwU\uVώ`Wdutҁ, ҁ+dUU>gX wbE?>Oh.d>8koϛ̟73c)7%uǫ,u,mcm3+cWRYufc~җao`ѴG[ wjkp|JeK;}"ېZgS?m`>琗pkTWH_.fDFZN.zb}qD.ɷ}_!CxlC8Eܝe"W4ۤ:0S>Y_dc;|qcx -6>!z[iv.F 6˃d~p??Y3ih7?i&k꫱3e h0VZ_CA"^Rmt ly'o٤3n>b..%e]03䙬pן",]ĸ|rxI d@1רixьX1g짼 I{yϸ1l,'M@vCP7k๙/0~0(" y LRK]$b{mgx?u|u}ժ{owujB}ف!7K pz]_c~s+/Vn $HMP~/M[͔-YzP9|҇%>DM67sx@6y_ͨV,@sK z/wv<4ahu-h;MkJGf.HѨ~ˍ7yFvUg6g9ƕmK HZ|(N};OᎅcP#cS.É?;VY9-M770-M?m~Q M lLN t#M]"cZ!cjDtE!RrF6*t8yߧ=qfS<<ҨO}n;_lH#hjc(Bs>d;h'ymbggXK-IфbAQ4|N^ΤVo T*B-!T*U-q=*oU=3C`DNT|u;?mK҇ ˮ$7e=fy8wH5!ߩ*VI{a {}Z&%~*ӌB.UDC 8(?0p\^u:Wh[D[/汴/&Ni;GZ5M3 ODsJ8.V=Vm|.~W"{.-W !Wv;?ޛߴ4b$/c: ;ԣ=8W?@w@G4N m5h g*G{\/4rP]Uy&$vUQ`Tjvt5:^_^oėxmw<5 WfIm\/TI_vOku-/id-bCq\%;h9Ԍ<@w˂t| m5 \!/ۆ[dǁ(zHOB:+>G7A֕} W\kY&|d̵}kIdÊ=͘+(W $оck^~qgT+wi>`̞4aϿpxWOE(k{ϫe7SƯ>TWH_vx\O8wH5!ߩuǿz½Z1MԨ.tك`A"/egt '=<<6CEiHJVjel";T|aOժf!{\*_`QʔYF0rr Pغ+oЈ\xiBC<{!9&cMu˖ir,\Q*T>o_lO lψ3WJB! ~Kw0Y-k7A{ 8(俻 %7`"Ӫ!w=A `7l%}z 9I܋n4nބ2|Ng>_?FLKY+[f񳅦=߿^Qwȶpi7i⢾OK)$'.3iQ, ~jeNOcu,.Hq}h:dpoTw!՘كb-{넨CB!wջt&F"Co~9[Wkw,ݞ_O7r 6]sDـ# ,f ,buLj5m?a[[8FlO~…c[&U8m1x0W:g%avY߫k^򧈞ROa}o8MwXѡQ,T7P`FT`b˸UGf횯`&gȝZ$oIN|K_!CԄq&g'/yt#7Sgo^Ɇ7L05rãnRlez7_y,)i U[EMQnr&B!ަT1]'1,?ϓj޲^d2VGMi+;w9zjwU=[d-B!{;E\M΄B!Kl $jk` !B!MQU6W.` !B!b)k` !B!^`Pl% ڴ[!Bǒk=XQϖB!¯T*ZΞF /@ *ia`6{*|2B!B5J&$}n8}]-aᝢiӋƠje-B!R Pt$DRV B!BxC [RNT*Ud-B!|9C+ B!B` !B! l!B!d-B!Bx B!BPl6œw;ce !B!2=+KQ<˓8^]S$'%w_r/q!jBڏHa9E\!B!` !B! l!B!d-B!Bx B!BB!B2B!B!<+B!BFZ=n|n4ןfEV2B!B=Dim@}]%i 8o/ (֫ l!B!_SoVBeaN %K& cd|'(ٵy7W(dʥay8&~Bk> s<<#'mJ<ثI_!CԄlC|CQҏId$t_WGxɄ-# :-Jə%;u1V93郳P+d;qGtRb%r+ i7}@Vf3\tKKbb"{ItSȩҗ]dsh&~׭u,ϪV-i&d`ŒM_, i]&"nZQ( `OpGV=G?']xu ZQpޙ: wiU[Ihsފ_6VW;Uzև ˮi@@2W +Օ;Wz8wH5!Ql69-~0Pl6|ώ`g&`Q|  8%/FBL 111SX=nKNU/ۇռ &_:N9$1O r*d.å~'v⒗B `*Y1/es.bbb8 V`ˏSP]!}b 6>zR6\:_ / ei  xˋ!Cڇ)ن>MW={O`[y02P6f.0^Fk/aO_糽tf Յm^Qn~*R!FWAvG/{,_LKj/'yd/b.\; 3`!&`OZ,$} ~"F6},)IND>Bkg;f&I02OxlLg`[kgtr;I'Gj^;y|)[ռK;}moRVF2f,4D.Plf ,4ԅR}}Gq|1کvsh; Ί 1Zws*<3npq0 kfys s] Wc{{wtguw88?MVF&ڞݙg;IFqPZh}Sc/{bo3W$y>7p ~܇ ˕3yb)#73X2@ǴL[8Zsgp%\O#SVYBlskIӗcaCxqd͆ ͅ$CIлu#TXO׾JODkwЪt-LL?c^k:E'lNtӊ〻aduX8ψi,m 8M>.{ [DEQz.ψ.Y Ӱ_ͬn-PTrEc;b֢;]C#O}CuA͜;m}@DS4:ЊKi-mHꊦ W}_!CنG5F/) O|%9C/}7U}KwU\uV`[ er(I}wcHޱy`C҃4O 881kwnđy"MOĹr̞7;.?Ξ1$R5]o-`1z4-ՓPg/}\^YH4 C@au LJ,˗}_!Cن:lm9>>$Oۿ疩8? L\1 zZHr ?  ^XLlپ\jPa?R^W ,Phl6ʆn}-VreCs}BQUZ_o_B;} *lV#?XhGPH%/POk<3 U\̷<* gr hk@{]JY$*lm# VbսS|rla]\ҩmY-b5vfO$`+ϐymtUq5iK8aj cIvz&']UmI?x/|aq~(%?҇:%NHi?Q` ϬŅ$3@8:.ɷ}_!CxlC8Eܝe"W4ۤ:0S>Y_dc;|qcx -6>!z[iv.F 6˃d~p??Y3ih7?i&k꫱3e h0VZ_CA"^Rmt ly'o٤3n>b..%e]03䙬pן",]ĸ|r[5k;s q[k#dfԖظ8OnO/'8Xq_e2rœMNLsD!cwœ̌cKv~d 0oB\񲓖nw$U&0j}Zp/q!jB!SUV+GA`y=>-f?cniFS!*XHnh8Yygp+f4{-"έXZqഝdu#&~ ^'"RŹnyfy_+wжo>?iϽC U\߫?+;aoZ~vұT[Oўtы+ ;#t|cyk'4x[@bq#gyjա(o`Sk@LDwڿjoCyv iQъXբ׺;?VJ˥(?҇()Jr_]ˋ!Cڇ.نxPܼ.Wc58lhep~i?68;«6ߓMQ晁+e۰_<`:?8EU\hT'tY77ȺR5{mB4|d o-)Ұ\lsc`p w `˯"l2*we=UmPW׶U}Ier.OO}'ۧ'Yi&d;չ.70~ZOC?iY؅.#{l9HE N3'f(!b^h0mCBI7jX-zB_BMd9: Z5,dK[ ,J\2WHFNn@[6+oЈ\xiBC<{!9&c 9+\Q*T>o_M΄B!6Pîe>:beвv$Hn}D .Lqz ac2dHsȺ#s[&s dJsjٚ1 >-])*A LEIDATfЖ~zc۰N~~#¥doSy~3-F !՜9/.4׻?_1[(ڢTwrn~w/qۃ|{B!BԂY:Sfun?x+I5Aa;nϯ`r9OlL`a T3{p:ڌcQis0sԭ-ih#6اYR?‹-Sf _*6b+GH۰?5`SDZJtQ'WOٰ>7w;tP[̨TeH6ؿ3 +]ƭ=00n|uork5%y+Or[%7i&;79t h\RG@!oTjb8AA:W! )Lͮ(,[Y͗i&$KjJ#r SӪWWխ"׍&_}2B!B=`aQnrB!)6"^o껖B!5h$M| B!~𻸲#4{B, 4'-l!B!_STDϞ˙Pr1+ f >w,l!B!_SThBBx`ߧ&WN|ZvLt;4Z B!T*jf:i$DRV B!BxC [RNT*Ud-B!|9C+ B!B` !B! l!B!d-B!Bx B!BPl6œw;ce !B!2=+KQ<{o[}[p^]S$'%w_r/q!jBڏH˔SąB!BB!B2B!B!<@B!B![!B!` !B! l!B!l!B!kyguuvJþ140*'uB!L&$&"4v @_WIxBc\Zj 2B!B5EQ&6ibui4 "gOyJUUOs%~2{AKl폶US1[I`yG8PFUػe?d <"bT*'U>TWH_vgwb|?tb[~Fvo\c8wH5!P/ӴaC龮 [F y)J:w3c{{.v(Yrγ!<ڭgXrؿnLů/\&׾g]Ŀ|2OºuXR._/l ^}%fճ .m|Vj8wH5!P!KF:6&/?Yȿ(jvUA>#jVj( J*Vd# |QJ((@ *}{g~{:oM!cdHXs:껯m&>TWH_vM:Rxvn>^6E¡g6*Zoi&d3͆"&擏|>}y2/nuk)ġٛ#$<|C8y(ÇgS>q:8$>5C2tSi_8MJίɯ +er/_dТNfo+7#\J\Wh_!JV{:t(9SAJqJ9~>TWH_X>0*6ޮږC,xenM,`!rK;}mHyճ/lnb=LJ[5d=VY\% RSXo|ɋY}>w2g.`/*[CxmN'xsơlègyrܳ__CGϣOD.o8v ?͍.˯/?җ]8jǜ++to4C.?p.em$qf,X̮A"V/q!jB!aSlJjZf0@VK-?@I+PBK5NC죰jG~Nۮ:ٹ}:08n~:x?J[5vk 癱^NJһ.&J ݟp2E~H !V6r+LJI+]ޝsxLЪktr~ lo=-Z*Ǩ= q#0o@J{~܇ ˕3uBz{2v<7v>)IVr,95nmEBul>ɵ߇%>͒mo(6j6l6c '=@֍Pa!?+~\*?A23+zݯqE<6Kc\>6v+7Fi3u ]x 6qhAsG؏/ڸG *pq c˷GeɂH_O6\#t'ñ9Ԣ;]$BrUɬl!vYYE W}_!CنG5F/) O|%9C/}7U}KwU\uV`C}GMY{8ԥ)sbȡf"qk~0;;_Է NӲS,ro+oҽL]3u.L?f{γںON4(~%$m)`X3>TWH_RD,{t f=NP}i[i6`,h;?q98&Oۿ疩8? L\1 zZHr ?  ^XLlپ\jPa?R^W ,Phl6ʆn}-VreCs}BQUZ_oͽ.(vUجF~ȱ6BNK^ yfo/yh"UH׀ ԕmI.ThڄGXĪ{91]ƣ|os׼;W Ľ/d#evVy+\SXF  lĽt)_[1tXMd]w)WR׎qOr_0Y q4航a+&}ύpـMہO>TI_.f_.Rߩmu v]o!Cڇ$نxq;/D9o&'iٷI?tKa|&ȈwǂZl }Cӎ1|\l#=ɀ%&~~.0c%f"1n|L+Wc1r1f*}>F&r`6DQ֣fO$Ig݆}$]\fK`*g^/;'3Y+;?1EX~q+ߣ/6nˈYؚ}X h_0,YwՁOn8h<1}c74%AVZDDz{3X\KZ |Ve8<|vnο%oTWH_vMiZV)ij9uۺ aCxQ ":3M({3$ 띤:fh{γ^DS]en3R~yɘC+ȩ{U~C' m_|Ffo =N/" "}4~R7Dos54EcYڇV2\+grmIQ~]/vh־KP}$iwoSVẅ}uR\uκ۔QzeNY9E]X>>+Tw-T8˧O|u%*PU<ՔWO(?Yx;TQk*:M+/_F-QR*Aiȅ*ZiL5f}?~TM}j~~}s`A J)P(NzC C  s$zrrٹp 92?˲ڸdJ->C1L嚺fI#ˍ^]}ΛYWn¿_q]rfZ(T:[[ZwT'K IhNTd4&cV;T8]w[Uh iK ;"&[ @1jڌQBɘ )Ő=]wwNs:J=-67+\c}T^:>]chXN/]w2%!} ol/Ԙh]ĀW^cT2IʿN>E{RK4k$ %)YL AVVu!I;u5 WoȼYܩ?!$ifeIc%In ?M{6ܤ_sb /N[UH>HRS$CmwӶ[o3L>l.1oyCXe:{תirKh0$5ozNƒj>,]#hΰia}&սbA*V5rHyT$MnP1]z]XEe/.H3G)Jf.(/RgyD'-XԷ΍ o|Xɳ5i~/> Lۼyv/tlpZ,]^wj4em6f،5uzM*ШˮPub6Yeӭp4vbt콍͊iʞ//[e/k=/^N}.^i>9?+IJTʞ{ox@ Cp- ̦<ԈM| ,DAl_a{[<vOG&S "tD=XpߠpU:>d_=8$'+Le"BqOs%,4|H @lb}@@?sozSaF~mOE8#!{,6;6fFO/j|oK_?#c#^PC4LޱN#Sւn++T[sZ^ ޟbb/Emwk.j/(F*dxLREn42@۴D,~ULP` K`~=i}TßL-9f/>|?A柵 J#]'~Ko*i?b1k5Jn:Q-G&T=@5Pݨ_f! ekȌ~ zW(/o* AഥuпIF7")?C6@k#vFlfCsY6h]dT῎-[l%|@p/{"(AT}0PRPTgW{nL؞ F6A+4AB^:f|)1h~NJ@h=` v\nĺ x/H S 8 A1(W P@ ]<#`L0p"A?$ ICJ:C yAP8 %@P:.Au6=h-(fya1XVa H8NOp|[.9<(EQ(u!GQPPiTՈj5ƢIh,fhG:}>.Gסosu Ãhb1.^L*&SiG w,ˆǪ! f`ck}wEljilpd]5qxZbnE^>^S<6Y>6>=`l{|$~ lfy/  9 %  Յ[DEDDD^҈]s;"V/6%!n./^%>*AЕ(x&T +=qDIՓNaO,bʊzwt]@vZ3r%>;kې'w*o\5< ¢w0pbKĊr1JJ:/_(*M/]+ //+PVQQSy ~ՆjK5l5k{]aqZڂ[[iuP]\\}`xkC[oݑS$ؔ{{)6Gܟm hy:=;L::;j?lzc]]u*ݷ<գSTiCFoc{-F̟u=~788<>4>;<"ח1/WFbFr^*z-f\u7oߎy7>D⇜IɊ)iޏ>ND̬̦~bTYs/s.s_)_7esΗ-l[h]]|=R?v.;/O]ŭI5[nmlD)PToeH wA!\|׶os K|?.GsnllE`; 2BC4 O U+7c,1c8Uyw av@daRg#QYΰ6Mp0ss3'#pIW.(cyRE2dO%ɇ*)nS")M*DJL95}FO1ffyNͮ93%1.p>OSxdkiIr=,VU_\]RqmRݭ %; 7ML"ת&g;:[V=~mDG`/Og?3ƒC*/4_ꍘZ y<^{:8C>̊Eq eߛ~|^Q[4-(7pBi4ՈV@WcT0X.L$Ӌ23p łaŲ1ssqps;yXnf@".ыb?%nIKJ I/KJg5(+)vREGeF'< c9|-Sږ?tJtt7)JFƪK&qfZf+wwгV)f6Dg;a>G̝y?4rA>q}QOO/u2Ż)h@ Ltg=DHGrRpŨԧэ1{c#q&@ 4Sk19jq6#qxቛ';N eNd}9zf=g=p5?P!(~ɪRSpEFbo٪z[Mе njߊ\?tQNHӹ-o1kl}P㸮{+V잵 zsXzo:]χ?͂Ug(AL%h9z@z d$5>-b@sh ua_ěH&GGZNC7?b1VDL#f ^~)bpx_EӸ!g# х8JM?ɰ̘,\G2&=g dYebb{ɾ‘˩9ȳ{υ_+/%'.l*=&f#&>"Q(-%"A\&XVF 4JnWQUT]W{DW5"甞.g27mzyݎVSl>;m8\\vI+{L>Gw |b=B<҉r8U؎x}ԄKٓ2S=Zf>|RCYم9w\и]YQQSuj5 cu 4}l&Wt~{l}gp y0RntķY/~W<.S^Zli|uZ=@$h;eBH–p4\?Bi{e=c0uE*6{A,^DJs Mȧe=NBw(MldHdglac&2ד.yRP{ޢѨyK+:eze5wL0'౐ԷMyޮܾ֡q+.Cw9HO#w

,H۫&oqdjЌlЧϾ_~ }[rZa̟kˁ˽+*+y+kޫ-kkֵϬm((e3@WbXX)X+FQu0P}tF{eЄ pHYs   IDATxyՙufifo",Eq!QdPq4ML߉NC'w^1M48#. ,B 44M/]T=uϭf<χު:M:|^O'Ot{NO̥[*iدv ÿo7 ÿs4tzp:zT*5BEP:E~F+UʉHY\wRwNCdzN$\͟Fos{bYV:ysErtz>?_o7 ÿ_th7 ~:Jt JIR.7Lo="9W'u}劄H~鬽AϏYw0 ÿo7 6 ,YD"miiiaQRY."F# \wD:>xr)=1lPG~$DǤ4\{ѯc7iso s1 \;'~/z]r%hP(]?q3gEpܹ C~DՉ֕ J) Q1;cw\P.xz\A ÿo7X ÿ߯+<3+ʰaò~ <N揰;E.SR.2tIޣ<;.~% \/S_=ݑDR~58 ÿ/l1 ÿ##//X,F, 3lذ,]oօ:;.?RW":&59޽z}@ \oN]zr FlLzÿo7 ÿo)--%ǹ صkXQFeaΙ3gd֕/D;Dtrl2XWOw\BǦc$wkHWf[;⠽v6 ÿo7 Ǒ&"HNKKKٱchK.p8LUUwfذaY[wV;U7N+Mo9\JUmgwP]zt:^)CDzF >@md2ɡC8vXM:~rߋ vڻImJWգr+ǟF/۝vu&]~ȇ0$S^^N~D"[xH"O&@Bׯ\ÿo7 g_/}/N8ԩS9s'Ns)WM Ν;N^;P)Co/J}2Nc_mp8L*j3Hr'Y[pBV-uViFQQQ1Q4޽={0aBj\$> 3qIArMz:fc ÿo7'inn/fŊߟ"vWլ!y;v(^Ndo1+{6nȞ=(С 9 F>%}T QeY4;΍kؿsuwcYe ?^y:~REIxm:̾A8}(:cz&xI>~96l`ڴiTVVxεtm!(C+{YI w/Q2.۷W^yǓ>33$~5IdSvRיQe}29y7_hob3 ÿo(RPPݻ@4ƿԣ\9/9}uot:m&Eeyy,&^V=_ǹj7 ÿuu5Ջ<8X3fdaxR#eK#1NnK>M/ tTPzyV}yzMct6cKq/OWv` KIԏucu۬գtP(_"vuOhL&}b ÿo7[u}+|'5kEEE]߶m MHo%Q'},Fd#}S)s쭷 R3(wvBQ Vs劣nn0ʘ%>@s$TP(D:fWG$#;(Hijm$>ͮ|(=#$.j iem8:6(f߹Osхn2,,e;g,gBl> \( [@)m5Rďrr?{\R[/xWXRUU:th,:FAAAA/Vٻw/W#b3tz?ʟLV.z#>a>ȵ>ymuv#H|:0I4_e ÿo7[O8AkkkfY˖-ꫯKǪ=@z_ =v@Ìb-ã5ZKD!bIgNŰT+E=^{0K z8u a%8e7LL'HXqEA}86 =z+P'J:v'OvyuQ²'H^+ӟ)d׮][-[p)/]0t%qplmr"K)dӶdMh9km9Bj[;~q,4 wrC\;Y- Ɵg 5Y-O|' c-#T7yJ"2vnK ?5OzU/y(i}KLz]+ÿo7 7&O8=m&T&7V ( /,&XeA0@0 ߲( ?*G3 JEy, ԣpI1V$rRAT$P59q"JwH~eEES'#C)E QAEYq6M$Yd\eqqzMII T-AEFo1K0eO`#G2rHo@)yXC )S\%P%{l3=5N9e?-hNYvV)|gɊRn}qWEm~0.4%%%ݛ#Gзo_o+ɓd92!Akz:N3h >LIIIέEѹkWǿr'"X zW6W柘JYգd"#ݱO~^P{_&hC'Rҵg}ÿo7 ȑ#Ys݃-JQ&T*h7~,MjйxIǧgO&lڲѣ桔E<cۖ7p8R 66Eyyy/**ҬB26D7<?NiiiAQS9vuK^)W~g$QY YIEZJKQsEEozbdV5/|I2`0خp0 ÿo0% /J7N+xXYé(ЫH?~HII)%\6_}&>LeS{V$kWrepT){%2gzǕ<6/5|v[rWwO˻]?TقѿK{ٚlu3i!?m;?ƍxSב+.mI3ѐs_p_oN۵Ⱥ^~=uk7 ÿazz=?S(c]l9Zf57I}q!?i=zx۶I$Y!N_ԋ~/xs^ymW}>;y嵷o`KRɤt:Mia||bl|u+r`-Rm/^F^k SFNG2Eqz >U:88Ul;V ruIr}8[[DL}\z{Oެ;Aͺ[ّ!yw<̗rUs0miC=(,Ә}/n; <}?>e+6T^8Xul-3 ?O)5|癭,zl-I_] #/m:LCjN}bӊ'GXi;_QھrJa򧜴׽?q`m[H;mwu5Jvallq Rg'#?//ʤFB4eĉD"yO >6㿰FoFZ15I"1v{!a4z~9ם %韠Ħ'M}O|_LXR"5ꓓԥQ"˹>qĥc/ego7 HWA_R%t)x`9}wf7(Kϱc1rkYSr\Y*Kġ6n@azT\ȀgH$HV*/ ITD>>ٶm7YV'Nr`~Qz?{,öm***2N@AC+8)>^ +`N)qllʆ~8w'raEԓg\o jn]vanvJn]&s/S H(R(;Ɇ~ W2m`|Ͽsd?b>[yasE[c? 5,zv[cs?kEU(Vȓs_Ve_9es[ q {q;j_Xȁ]Y5_筑$O_d敟<`|F IDAT֬PqZ\ ΪnףYΨwӺEq`UwDE:0F۴tXx<oN"'N~k|$i*"0d?QR{S㲯?u??)KI"Ls'9kXTs)HU E72Ymx='^d$#hm V ==D]ݱ:>)KluW_y5 ÿom$bODW8dsXI'$yP"h\)SKr]=zv"dU>}2iwmg̘1(hnn08rQ{G}hAhii+Gw'6=nsC9`z}Qz &in۶"`qM|cw\'do_⿻_c7 ÿAo]VI"(T݃EzD@;9d<1NWw0=GG ~^dJۓPcAL8&2/)ٞ ~|_s:o|^G :~E(ޓeoj"E,/[,RRhqozs\u͕D!/y|۠sb-SAY-9r1;Hh F ]8;]m>s h3kkkׯY@Mǿn\MMMRYYc#vSʁLDS7ĺ'W=,sMnzND"^bc%yu"7 ÿoo7pB)HuEqQi? O\ sɧ|#z$EJ'{-z]}3u*Kc(׭q@rUVez뭷PJQUUE(ԩSlٲ'xw*`>PcÑ| :3"2}=,&#&m|}1o$ۧrumS)n+G^^ceԯ Y!aB';ӿr_qoY֛6mO>YvFΡC(,,${E6B D,^C~(~#LRY蓢n#J\Go X/[OOr^Fc ÿo7!tK( hDvۛeGo,r>"_ǭ 3ʕ2XʕީRʻ\ߪR(˲,:Ā()-uV%oHggis/QQJ,]AD03Mt8ݽYq"IV!pu,n0{)--J9(!"MǩcׁJ&@}+9wڹ477g]j֮jGށr| VdЦVm|k8t!C]#eDPt+OD Sp8˨A"RA)u7 ÿoi R9QBPRE z#>=+^0J=0 K&Q[[eY\tDaZZO w#biގr7ZJh9hYnNzYt%{'] eKri{-Â7?$I^X[ÿo7 οR +)#H'J$j,]불C0 瓗G0 #F1bĈ#:pp$Kqm)mJidV*G|-|KS7%P2׭ooooh8,˒r$uf%j/G|w]5]5]5]5]5]5]UP'_eeTyʍ 8{!\5WO+ ȸyKGY7juXHooooRXkje|sk%yI ̓x|x5S]¯TJ?~׿1dȐN1bĈ#F1bĈ۷7|oc۷3v.WJ:wc=oeY3m4>PTT{gE,>"]/_eOwʾ}ce =@+w˺rm}r>f7:o,ˢw^k!v7j&H0b9m0~y}8q3>5]{͹xowNW8Y:rݕdRΞxFgf;7r ]Zy8ʸ?'{7ږPЋgMe`u/dc2$;3Xf ft#7q9]1bĈk.Dyy9FbmreM=QvJs8p & Jxٰa ,p"${m˒L}dU_dٲe L5|c+D5yC|u$U467 ;BQVRmҹ;u,y!JKK߿?`{Z:رc`BF|{F%]YLn8٭<3?TcXx1n1׎z#F1]3ѣGvZRT+ت]+m)E$o9q;v+VE?R@97n.EUʶQ_w{ zA߾}yLgX)le 8i<L8#xn:/ 8~8'N6t D4\t.&سk˖.=zp2|~ӟ2|.Bz8@^u !s>`F. v$Jj')6n;ظ]LjqMqRT&E8jv^oJ4ђLiE4k.vphJҍ뚤6bWıg{Ѓ#pV@~ Zz7mo|oRh7Ƽ70+,bVl558p۶mj*N>]mGb$)_I Msqu3լxLNkla;o.WMƮgvۑ7fce.]7hz_uF_/b}żC'w|> yjr)_CmaݺYv5IwԔNg0m,^ vq(sp?g!?]Ǫ~ۿX8{d4Gy<ӯc޼\Z긴qͼy7Cyke+(v%'Nlz {tskգ,zl1PR l#1bĈihhС9>P]]BT' ڊ 'ӧ\s mFի/r\oH)gpWu=F3gӶDܧ,ۺuDeQQQA: //lfLѣ=J^gĉ:ut:M޽ꪫc߾}L& Ju [tOxÒT $]q_\3mp)ff&#INgɹv80#Eg59Z(o8O\ɤ~w+B`{wrr9㻿͊'ّIW$2;;GOVu_#ܕY,ìFgĴ:_gP^M5Smw2|֭HëaӪ89#ajvusɊj@y73kV?]HY &Mmw{HկΛ20Us9\VX)WfV_?nM5kØ;6#0|u_ުkS; G Zs#qjؿM`̞J%0:b) ȋOaWq Gd)-L柿v=[.o-Xs0nHC0">w/(,tFȪorxwXqGί;Pő&4[ō1bH/ 6m"J9~+#GwO?͊+H&Ri ȵ^K *sxsJ[9{444H$'"[,kk̼N*#pm{7q޽,_r̙3"RɄׄi0E^{wvsQ*@8&ٶnʷ]WxץS||ҿTĩYb{Zdl!@#MYjZ^jft'WNpWkl3Qkr~z?c#J5kpYvVEGqy 47d̹1k8b`omord GSZFg8`0vd1fvΤ(ݸ-T IDATExӯE#@Em\; g1KmϿ PЈ#F˱cYwvʔ)L2 Ⱦ}:/9^=/_|1֭ع: :sv~q]/V팅&7j+{泌bMMMqp(S?~:!p~kN権?u&5_ ٹ+\/Gy8orZ_d~]8loӋY=w9 &bU#)B?}gp$cаjcYӘ9c =_) ᓸx֧PtZ]v˙tQ]iɚH?.z{d/=GO27IU{,^(.8K"Tѵ5̼NcoMÒUGqۏ4: v) 7mYJb)ryRq=˹+)LFL6ΫR2T~/o]K},_Q_˔9ڲa< fuoqf?ʞʸ˳߁l_u|/Ep ^4{7#xiJ ]3 |g2ROm;),{)̹,^z4b Jcc}gNy'=" MqL8ʆ(7F*W/d9hjy;8p~4Ue3'$,}#ô@!wg6/8bB4U`] ~7S8হe:e[yULvHw/Uhٿ`rLv; #8cz(MK 8v?B5/TLwA͚?v%eV:y.C$ظb9g^-py*7(A p_,E(N+ZZZD#m[=U[`6Xc)r|$Q/fvH$ihhh_e-Z=M߻4?Yss \_i=Nsa&zNX̱S@. ?KGaz!YFVU9/5w,?'lbFΘ6P\[:㿅ՇMlU%xr׺[+ut1okwVTq+3IkY.*ᮯ"k<6eR^dc66J %J=ܒFqne`2ngm4<=ޡ3:]y!%C'1,Ct=q# :^,V01&6Z_q֙#)Ctx+w`#STVV+#@E iwpVQR> KY?Ǝ%ċvt.&EX @4ʑgơGA'SZN6Us9X_.cQkxG-y`_"i[8 #&x&#nؗcls#F1b/=zફ⩧wpێĶm^|E֮]_΀ڤqv/e">sQXXeYB[g|ĸqc;w\'[)lgWeI2sٲeK6gp8g$A)E~~>7ݏna+O]Sྣccaa+().& 8id ( ns(B %%6lv?ɜs`Ɵ1msaFk Ess -.~OCm]]n{M/W|>قN&ؾ%v列r ,]0Mf_M*՝},~qMM]  O[cU S6Yh9w6zO d„Ñ߼\ç[ p8g?sm]HyFܒ“J9mH4OE]‘s,Y+P1*zǝ%kI1D}Jo ,.7a8aWqʩzT]cGydn=_wTP1Ͻ<6wϣKg{w}dg;Pjnhšʕ@Gv= ^#{hzᠦ&ιS`Z!0;Dy W*nʈ|<^4Ei k_r- eiΜ3Ï`9q LN$^̝nMC\ ;| f] L5{ހŕX^׸hYp?^RezbNijkni]?LSSxR_Ah<ŸzQϿ(f OuMwyw-oNȊq@3-ΫZy-Yc&ٰF7wc3C?tnܩ be!rKl;/az`N=gfڜiݽ#6 Fw7 t! (;t,,Fh&due]G0pxs-Цܠ׷m0M᦯NnWW98zLn=_λtz:w~Ѭ׬ͺ 5HX~mۍ^%_b!, Lyw?NCz&ptXJm5f 3>g;}gQjHXXKrY8zJv*%#|_ PZ1ZV߀/no&h^~؎ë0fɃ|AzNV[ ~B7k.y~u;xs=СC+{|o[ ehjhdB.\ÇQd~moߎh$!!NڵkAw?my\ 3rb2p\x<ZZZxټy3-//r%|t2oW NntHyyyi%>>UQz]Z<&$$^g׮]|aC}G|԰wOq1s˗O6Sosrv(0~iw>ʮԞ,fݺ]-ƎzjjO棿 Lx>6uO?l>T!1cDXbWmQo#X<Ԗa9p8joY?vmeTZmx<ʶ{gqZ;&*kqx<*yj SE?/ݻk?M6gVk%W5I8*pn#CrB/FQM{-?~zk0.W2;Uj=`=Ⱥ 23GY(ڰ5r#0쓬+.ZKT:O-ExM*e@NnJޭ|n`;T[Iee)vh)]o*)H%6/Ȣ x_nv^_NmXT"JjpxT\e%>[ɻ dN"ԗytIL131c1A”^Xg*jsPVVC܉u뉍#%&^x7a᭗BfAx0 ct{kÓaZl&ʎstL*o`GE/u 13`LfX4l^Gqe#l;f0q;[+m`+gփi3!xe)p3|׭as irHEQZ C(}P>_YY6И$L&o z^/(nn}Qy9t3g"uP 5|'-.&m ^s}Kvsx6߲?5_erNljs`6X,Mq#+X ~';~^k_Ƿm@Μ˵SXY~ĝff억<&cJV;}(#`*g&,fuOou3pYso<*~/->2÷C]}NY=Z.V>.2YDI n<'y_ݏiI769#{vHYH6>X/82?3|q{gN`wIX#k?CG~}̝ǾK, :]aOnmsca]̍t94?CಥM{뉣\IupyGwmjep#VdʇXn}d8Z\V˯֮/ļ<܏w톌{t qߡgxNnP\U V=cn|t}ʄ ﶧbٱ߲v<Lc0&a':>;4~wg&nV>a wdiDRBqq)**bܸNSnJan 4C~-,[4QFb-uz_nv#N(}xqΙp~׿u]v-X,]t `1ۛiBEfhoO!ڒC%n{3m.ao}{M469#.) cǿ=pxD&+bHMp:lM80bc8fsΌX{ xl41cMM6t:c ] *Æ;qIu:gak꿾Irzca&sXybXF]uqzg}<Mx<Jo&];.|+5MI}i'C?/]﷩:HRj\7Su} ~?ÃѨ.B!D_y^{1.]СC4͛7'[_l'x;xw6ܩrUh?vZv܉hb۩رvEYYC#?JTTnݧыv/}k|8؏Zg  ,TYEZZ ;P #~!:^!B!D|KE1Gfok]G0F&Ԭ[lC[Ҕ`fag?IhmC?`ƀ vağ K.B!o\.UUU޳l54ݻwkqOa IDAT'v4w,,*OhΕִ+l_Z;wįiU8.<( K/K/Kaǯ鉊"99A `,\ eìB {G9Mh]@Co{\KD̷_QHKK'&&. ʄ1LŸt_ \ ?3w/K/K/K[[mP<kMQ]C+?y{Aੀ?HETE@)=0Ŗ?pN}  )VZm8WڗkUC^XﴇjY%~_%~_%~ˎ| rߎ%t`+>?`&TwïFX~XI%/K/K/K/5MCٵkW; ;{ Q:tF辶Nu/@ j%~_%~_%~_%siFAr" ͗?jС|`P_û;9w$K/K/K/K:~K/,B!B9MЗ&/ ȭs֟B!h^UI{E!B\<4 :U[q:U=!!B`+` !"OU$B! *-BJ B!h&]ąC !B r&02șB! gB#-B!b" ! r&B!.&Aξ.q$&aփHM}OqIq!Bq1.SfƥgLEq-[q^Ĕ?˓E.32E<̄X=ni\şGq 1𤋸B!9;&1+ম Z]DfH氯oٓxH0>:<(dK"QFi&*['B! 4] rR>;b24:kW@m_(zxh棷`[ tלGq4v\(,1v$AO6(zV5z7& ¥Vp ׋>6NvzV;ϴ`\buQuX;_GW[S Sԙx59~롥=VTL.3WIvT!fs͵B!EoZgN]P47mek.nR1}]b[HI"Fn{-a낱*]Pn@[A|Ǹ!>y8XpQZW0sR;I}7;$f/^Qu?FUk7]ϲEwnq̘:hAEq6CV}fSU'a0_mXM1Q~̜8J?ÖSug1z-cgOpUhcl#*&"*v27ͻՃ^T$C*5Ø2=>8G]deXîΣk)Brf^HA ekQ{'YXQ/Wh]hKg6oik9Lvt'l2T p5V!Œq?dEAG?׾* (t&ᷰxB az8t௼o0K`.} Nm6eHԡyhOhq&\{;m[x9}Y*l $e3:2>9FSO,C?2ZŤ1{*J[-)MAkvPb7bxU z=lňCWk4`p0kWL>J*}3Mc0,GUgK|xrGSpm_T=6igct5pb?J^^C5]7;' ʛC{PKHGp *Z !⢧1 @<~Ξ6]YɢTxL>59fm#3k*|\(̾@(.}*O V&tVZ kpIn`x:{>`&wJ=zDZ:%e #3~Mhqc8R5=YXCs秅K{'*j;h.Ac aizMDh>zUEq:il%.#DAU#!*NܸU5s8}҆)+ECeCcuhIIf@%3-NPm6Wlnhl +HHȠ*^()kxgc6*u΃gS3eg\*QsTE ?l6<+]gJ&mI2Ȉ/SjF㽓D|L^<y"¯'îkΩnY'UM4$ %>^ֺց?4ViWo/ Q :hR&&pspgGWq`WpO.0y?)r?u#s=r~)X̀u&N kqMEҦv">@2(CZ .=rO32o9Y~oɤveIIeqD/.;):J@ r4yY㠥!cNÔxK*ÏoJUt*Q=*fFHhֿұ o_O(K_A[O+٧ Qn:5֌|P[]bo'6ݟALxH" 2)#GᕿLt^%bй]=^׻g{6LS2w˞Z4gA! g:U._-q93Il?HF} -)[cg߰RFF7xCOt>b2@ɏqj7IL Ir$|C v\<g?yⶕ='clH {p !-s}Ç% 7HIL'whF sgu~g`pzJUC X}DqT:r ҇X=W_}蒧3>:1zyҌ9aGU'2zㆍȉxf0>@Xrg(J/9sT9 /^CK6󉖎QH>e$Nt-wE{l0Um28 vߣ{ @nAˍ!N/06&`e׎8UJ21V( 92q%BFvգ(Dߥ|=!BpzUl vAPye|g|\կPK@8I]7& Pp5Ai?c)LE𙨥/C\uz;G\jax݌*jp` @ 59C[j1 w+*HeѲGYNBivGR;&.!o͉pnsIlcsg1^БpsK94-zRS|[L46yHX.awy_wPN%)4u$Wu\ EEU}(~;c!*< ǨwulNS=eu?f!Tݟ\2<ko{kk${,kx"x'vtD^S(B!Ĺ"`7>2JGz6+}KW3v Z7>*'+䤑9Of:ӍdehӀjUVE+5Gfdp~S:9fd_W\{ Nlb18OBs9ePTt.CJSaYW̫_I}N2ofdI2Om 4Qn䒂opy>60)z -$᣿x)Ӹ%uÉ]gAzx]KnMx_j6SfvA>XmöͳHO3Ft[4YGoFg* QrAթ?+mB S4_+qǢ9q;=h^ N3\uMzdb΅7ɀ-ɋb-6S#~|2SGVx&]ѳ1aP8u:wh04MQ'&];\˨k;B!_64]C4}4&Oc;7ta!S:H3(4̼&t [#'[kUN/^Jqq%Ń T*cæs߿H#5s"38b;ET:/gHtf-VEUTJ*23}9#}hEC3`\jN1!a(xNQQF{ZuK7ǐ{W˄-w1wN|VN<ɝz_>NafLz9! g`8_\z¤쬨:H&tpt&$._(l"9ZF;R 15ͫ!!t_|;Ql`v VT_ug.qu10F2x{'_klL|ۚ0<|6c}0cBVx_>70gH" %^ܟx ǁ0;Jmت ʚB\ /ùʹ@5'+vwE.2rj_ w]\zJ B!}k g;ndXo o~,q3Ili}V?:雛/q ԺZU3+QM'4_N0_ƲX{0'^2M!4O|" ˆж0+; qNaHF6ɀ}'m}*wcd)l+s?c5D'^ʈ\ @K^i%4RW<7uli 0IO mϢct2Ѻ(Z*53b6j]fZg!Qݯ3-p%#Ry댤3$`rܟAnD㤡S)!B̃`-+/^Ɯ H7'1-M;jNBsL+^Q Yg^Azf`FN}ըpW γ{:A&$N^hnpn\NN9$i`fDSf09%mc+=tC֖֕16>Oc0{pvz\z_Z4jZ<.Wu=r0G:tC|z qtOj;?B!}c@ZۉN'2@SQ{ݐNf{o55Gr2GyYT=e2<8Xy~9#"/73\0`WTB!"Ev.٫W-Pz0]MUmJ6=rY\TruI;[|Oq6G~rCB!B[ gS!ހşiڪ6RfBޜ? !B1 thAkNv.w !B$Νlھ3<H $B!bi4BHq!Bq1` !.:j# !BEӐ.B!]ąB!E\[y:El!BqА.B"]ąB!Ddl!A΄B!DB y[!B\L$B IB!D9B L!B\L44[$B!B!΂i(vҬV+.\#B!B\p IIISRR[!B!8ݮy<^﹎I!B!ਪNCz-B!B9MӐa~B!B[!B!In- IDATB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!IB!B[!B!@!B!<_~۷Ѹ\sފ[@JTҖ,E"^z5EQ"^B!Bu:);ěb-vnh{QQZ4IB!Biy 箝DMh6puX/56VHN"k&]ąB!Biun!51O]ݹtZ1%%Ѱo/)l!B!`i{ù`x57iZD[!B!.`׋&DF$B!Bqz5ȶ^ I-B!0KpCMju &Ң"?uuQ&)&Yi j^F{8H-B!4ۗΩw4  zUAGٿl||odm#WxjϸLF="J3Plh[ncbjߞʜ4NѫҁpMw\K^TB!BZ95 -: pX')h5L$%zFWg_9oD$;8RjHl}ĵ֬rōLLܔ4k>|߼sB!|؂]ol ;_qQD @N4Q`#k1$֌bP(mk!Qqs  bpq?CupE\I\bt,f#zSdfU*1 Ȟ6Xs"m`ZuliLn KL(sQP]B!B~xx_v^ ɔ܌%5r|62S.AezX~l[8cfdд%ݓX>?78=̿}w, <̼Wq=|(Nn L# Pw+3^x_]=o%Ě^>g}C0ȿ*/B!"E_u.2ffOSyɻrD1f[<mu1(X3 눛}cfEa}m.!`1gy0C 9cL&ii۟9ï${i>E2s4&+Gu$ξĔ hwC960n76''8l4bkFlG}{ia]=455ap8.˜1}_u}?rM5Xmx2R;=hΦJ+_a22R1v(ӫ=uwm|)PW_b}su>:vW_^VM#`DU}e[Qe9秿zݹ(_Ol8p{矒p. oyVA/HEOb`ؿ~ :bgZ^ &?;>E [hGvR'zߧ$nc]OvO8ʯfk8 < ,xmSjwm䄿/`ߺUgOyW&}]JS;r՝[vo}ؾ";?MG;fD>]==4?e7m F0?Me S|3i٩;O?: 0?h0LDc|t3M CgL o<Wiޯ:s;M:]s8:c$~l\V'M%ӧ|MS'\wGp}zZ_'uGtԵCu̚0K:~:^ag!w߸,^òa*e{q)NAq ִ`YOK+ǟeB#4i.\ ^Ϛ hZDZX.ߖVՁ}jM[ۇ h`@Ӽ=yiw>g}MnM|k) stߴ_E9f;2=5~|k,sZ_99{=lllbqg]莐G?~GyǷ{[')vmu-s֞d;'|9s L]u, Im|1&_  sztN ̭͛3/[W1݄$߯yuge__P}rf6ѫhhl ^_ﵾl|h\L[r ]%cu|OuX$&(2s ugr2iWgvIв3{i;_Bz彡Q1λQ^77Pmnko7J|z}9@`@<ݶ#'1t=<;LF %TR)hPQLRXP>[lBpv-juPAP#C @` 3c&$LDNu備}Z{}qOl]1ؽyqu.(0ۢ#lUV+c7t8f8YpI#ð0wAi~MF`_rvu,7.&uRo%w?J056ΌöQ}akȫA;~qJ׼"HNӋ .ȝ?с \Î ?SP ⹓Xu<Կy;>d[}w * Pv7s/4j C3uP/Lu|jټK>< _3aŇ|_70E|Cӆ~o?ԧEDDЎ 뗭^^C'Ye0G4 WNv坷a1p+νMmpR펦,n1q S=]˃uC, }+఑sKSħCXvO7u}q{p>pTW5+}f #nz8նG )-x'5M*g7|T^A/·236|{19;Sν.ע6H@~TR{oLb_={i1<s (L7joǿ FwCu Kb?l ;n2{0wӐz6|QB1;n\~upo:$ A3c1A|˅={6IS%v0%qQ8={0b1?q(|oL\iďT[=_!)i(O܃!w_RDžW~OYNl+1vo6պdk>42p: 6o{u:S}WXz2 * =LJs©gk?:OW}ʷcJ>MvքFXw,̤t [ʩq wmS;}mkqLt^q8}> >-""\`uDƩe=~Ͼ%sZ}Rz`$Pw9*S&릺SNaQq6b9 UG;k2A<o=m^' bJe %3\. ;<|&螤fvثپmoDO6w`6rJy[4 {^w^ܱAy'a:ryNz@˷ G=5Dgxpt:G[f1op `I_QO4^y#v?$hs{'6fg,\la~;OXTdvb*p".).K /4{M%pv#sRO#/O[>G-XV%n ʸ~?χ{_,XSbispup6ׯuйe L~=Ë#ar qPC9G%@2Gdk 4}? }5vz/hAǀ.kG(-]MkgM7ڹs| {N A/捹[]Pls@Gk QPM*Y#/Nl~]qq(Мc$s{{p/:QǮOWPPREG\L.|e;wh 1@S-g\m6 kP*\G9`J`g!2sTRۋ|+?Jt[5A [•$&`w#`{Scta>y{{v6|}~_kgo8+wC@,i0ffIᑟ{?a=&';1N߷DQxLɒMTd&N Ňَn{|{MPmۛQ~pfjO7@DDĈ+rrwyɐEiYpCev=L XJp3lxfRs>&mnY4 ʛ&{v^.;@tLVsr-_AB/M-΋{d=>C;O FJ@8{v)a@C@ -uCN{bR)k.9ܲu_*ׅYB[w q7 ?1(ѻKS{0TUQUSCMM 55UTU4 jvX[fC| 6;X=b]v0zûl \ <{r2n=CkzZErʯlSpu Q 7|1tNwA~lv|ekXVΞkǰ| R1)>-""Rq/: viz4LNJ5$TŔS)q S_)g5lo[ͶgXy:Ƶ-9]kH NfuF%t6b|{u:Rݾ堮rvIfs}E U_6ɑ,0ԟ?Hk8?p"+ot\[/Q5<|#l33v}-{E[Y p1gHlXPfj+Z@}gVV,0}ǡMa3_VGGi_q[6Rÿr3[פ1/qݟH )WRu%v {p{ڒسEpx%= q O<ʩ]Gw`[wi'*LJ͚I޳ gEem/-M{K g~EEW12Y3sn/s<ѧ!{0aerHHLk\TCzm+{kol>鷍䡇7NxݕIfNX0 VהAיfs9[Nr^w MϝGG&]2=C{WU;C) FOͷ Z;*lW3WC6V%= %v.1${ t9 [,mcÚ_8Ά5+ --WMÄӧEDDFO|e^͐]ҡLowɱo-noOz{$Ic0+!3?5sRM2Y˞-%=D3yy;%񠮾/kczY.M M+-+ᾁ˷h-ery{ ?WH/Lj̻ʞhxo,q=8Kɛt"JjNƎJi23Fu7c.<4wmp$5uf;-N} /Û$ ƛ:]<\gdۢ"6cs}PbJ${ѝ `Am0y*8 ܄*\G8q ">%#r˝@W]f^=W`e?Iwr'nNWNjn'%߄8n@~oxm>\K2z@W`afR^)z޵v ),DE#9lL8wvîuyˍZ݁G9=\6:߽W`* IDATsy Djak{UǨVڿq0@q=iI[(,wuB'&}riS#m8[WRϊ|)#TԟELM=b,9仟^4n!qVx0IQN-|D;5Lp+)S"Q7߁z?xBhZ:`Ci5-.?kji< ǷTnӸz;3apFk,[(WHLN&7`b-7 kªg#:vso+XJ(װa&&]CYa5 Flxǵ\cgv `_v=Kz[I9/2ԧEDD⎻f;DG8yeeD<zZy<+cRY1OԶidU\J 7/N#=5XKn%Ĵlff6Mls )uGy7,:d){zp8X `r+üX> `0x)O5+v' 1> `*go8!y0?wbc'T5 glN=y L( 5Q|Ǡ}u'ߍ7Lo~^ ױ\9$~m0;h<$dq:??8s㽩b<, n;|kv70b\hTgeHPzznZn ; c$5o I /W1Ic :泐hُÝM}ZDD^TTOжjq PphUvbei7sc6өSa|vLۑ_pĄ o۽ezv7~(B9(""g vK/QQQL]t^urgC^Il(oɦu`H[ \(EحhmGz~!^#""""r騀Q&0 lTJJrbX_ȅ"`t.1Q Edt{EDDDDDD., EDDDDDD"@H("""""""[DDDDDD$`DlP-"""""" EDDDDDD"@H("""""""[DDDDDD$`DlP-"""""" EDDDDDD"@H("""""""[DDDDDD$#`uuunݺE4(cDEEE4Q aD\DDDDDD$`DlP-"""""" EDDDDDD"@H("""""""[DDDDDD$`DlP-"""""" EDDDDDD"@H("""""""[DDDDDD$`DlP-"""""" EX_xYV=\U[yOoumi窭EBU~zȹӷ_f g?_ %gxh UV"6"\xons7(++/7\DF)}IVncuuI;'„;O#w= #jZ[DD RfAluF^ wTE.Tg"g/bӿTթL[Nɤ[o hި-(,CN nF41]+!"?ѱxS #ՆaûP_Z`VB +YS~>.qݘL&bd2Z3eZBc7h `lDrFKIK#--l^Zw7fO#;%{8 ٽiԔ04^]rG)soaF1f=k v_`ty"KKՂm`/Ȝ1giv_=rsx9 Rڤ<ݏyl5ԄY/9Y(&_L \65nm3=;CTrkfe3}ѶƤ6e7 C'_{YK(k35v˅"9xj5~CcӦMuVc¯ mܳذZ7k_;jk~6+jdjqdjX qdaN2qo VaB㫽{Ui~xMz4~7jXg|~x_bXO%uj5~+iTnoòHz=??8jU2!pU՘oɫqLPRhb 3tf_%?uocdյϟłeL]m`[Y3R@s0\2[TfOl*!{bwzJ7w f[9xDDem ]DsTaэ,MX%L\]6q0{ ;~AX/2ngZPh<Vx݄m(&G f6Mi-2"r1.f-Kg3Gv}6Ų}F?Mn_əD.^9}x֕7hPɆo19kJ[-査U/N8o T{-S+T>*=E-y*mW9{l@μŬZeVjE>B< j7|ܜ5WSn5ju&țfQ+J\e Fcn(iQΝضmߎT0|'o<1by$ f1>g| ;|'5S ,W (ƶq1S殆3-yC;W9\DⰟ13m92sVRZ^h)|&EyKQixglX>n ᶫ-ȅ܇Ĥ$HLJ%cL|6ʫԜUPe)cf@؆T]'٬9n <jM~ ;mkbo:H~&Mi-*]".Ҍȟ_f2'IfqX2ʔ,%dYY/OSWYygg5,:a \b|hfLNy2Ò(` )V4wf3OgL|Ϧ7'ʜ<I3kktVV-[Hh6)9-X=),)r 7&df̦>I'?}4.d,;e5w-F$k"/ԔMKD4cwѐབྷML]허' ^":BPlL_6Xh#>Sfn6-_]cnp3"cb;bk`4n&9͓1c/[/`|\Nł2ݨV\DD`, gL<6.<r孱[B[OkD=t4Oag#}錧v{UcȅEHvh`9hnqi3 """"ߝ kݧo߁uQYsbDwJ˵ęB4ii#~xa\kGeUDyaI~SlY#)wsDEE❓ p⎎%=m{grz$K .3خ6IQVbNzL]l;TwrbalN?8֯H6Nm~l~~hL&c;v1Ly"P@hڟH9c`egB\,(8ϡɝiܙ6܆pgcoelY37 9Kd?ytwwNs|b2w ?oC87^?ϙrg$.ZNNZo=\ Ms2=rf-4QDRC6*lgCmǏ>cvv&w͝屺p?vH<>T bQD:ܙ9 ؁Q,N~n8YGNkϗ1mt\S[l,~̩K>9>m'-Җs/eM&)L*K>'6ST#܍zǜYkqsã+L]03x@'jJ@ `2a'2s"Sc!6=aڥ|}.3?aNx:7ft'm`jG68NM17`ª׸|$?o5ٹ$W!k8.T^1ߙQ9%ROqU9%q')ߙQV P{WwbPKi<ҟ'|}ADD6Y~g w% +VE\\=tW$aR)_tl?Čט>i6߿-y?+fPR<8vs˓m17,GC8ZZtvP/:oJ%nD3@!{˝#| Wiվ/1 /@}X"H1u i`%-_'E#%Qa2};h?$_ZOU W: x_-p o[˿M-+K=\tj[_t`[TߥqQo}OYKueeRLv8xM\ޔ8[-ݰ TFRGV LQ0{>̢?nW~ҵӘyfI3r}7p*̱|| ySVߦy4f΃Ɍ$L$_GfU1?p""RSkMߑo5mݎ|ﴑ)||&}cE#Ey<#+|k{XC;ߛf&pd;=i+5QY]i6%b"** Élo}r 5ou~_ C$']\Y"rQYwG<ws3[{;vrEt\<~jm}8>j{E _GÆa`g"wOe7t:o@m8H̱ě0,Qi:0%2 ]v:"3`: 6͂g_/cqPšg<2G_|Ql$8yy2s^77Z-;kfsN 럥OVyGgkb`O7XYtRv yrsdBgScv7Ɠiq_e^([MOt9 ӲxsݳovJsf5d Lry V0tBΚYXgo}6>5@x}:l̹%| =JAA1Nf?%ɯ7/c+5jcrI=ɤ/.]w2c5X).(hh~޶NƜ[aQߟ5k8\l˜'.`/w}_Zy}@ p53N%m]M=8nqKV&!ρJ1GB+ckxwXr< ЖtcS + 8ƶ(Sxc4ǵo.+s1"߮iuϩ$XxK&YI j<_RrɼN2V~i׺Vx1x?`v ݬ-=AVVX~2Vૣ-;^İZ۹ߘ;jX'۾0`6jcj+n=-_}!}[8gTw| u>dx] IcxB}r]kjk;Xgx<v+q]5+c|m_S璽Ox3V1wA򕛌V12dYJ_.[wa.4jnrSuOm Ӽ}\. gQ֏MLqۿ-;~z]]]hw\sKk}>쏄J3ж9~><r< dp1:*hK/=6hw#acw`;]O4>SETҹdLCfwU`/+bciK)-`Vôl^]7PQRs{hќLj˞5gL=NNN逽qΐi:HwnOCM;#Sx*l=x4d9^bAd&?琝6Cxl"J}jyTm媳CX}p4+|2ʷקpR-.c5Ykpb|m7.Ԝ 6.IH?h]CjLNcС=6{o>x= B3r5&ۙs0G/bY3/֘ƜlVw,Pc#~p>T>!ƳڹԆtBQK=欱!QK5S/F{D5g9tQt>@{u.p(+?ʱ̵)|)Y PL-+ nGLzn-Xqn,k =}Ͷ7ʛ)fJ9/1;luATtuϟ[r9`;5T={?`eBN֔}u\|wQM׉)zcSaYdf.5SS|@,ILK'FMgauld\ wlcf\Sc,\]bT3C9u)Sf,i}p+Mӡ{k}[YEjv7nwm%k`#nZ7nMeVB-Rb+ɘ1Auӕג,!nw,Pc]FF{g-ޅx&xP;ڒ)馠c,X18 ?NI߁rjm7>Q۾%r.:+c+ pNBmqK_7`2C{~YY,q1}&2xz;;u l)rpejsWxoUT]4՞ҙ9in9 O 6(=b'::˅{2-jWٓ}HRTtb< ?,ڪ[!9&eocmӚf.-@*sK 6_Ġ묾xHr$0ô9=)l[8<Pa#7HmkF1ƬOP g a9kYl#G6;׮Z뻿 d7)Kܛ)!Pu[Pӂ ݘ-gțE^@ m5nڦ7S) Ų<~1Cj\YX -ϡl>w%D>;AƳ>*{KՖcFtclSyr-Lt-*|9s؂_Ol<s<]c8OHԑ=ڏ@ꀦߝpx4{(Y>j"M un'ΘG?6ܖ͔!n\F1<}s8vHs|>u4EE5x1c^] uh>0 ϧAWM^dOcvC2LJ&t^vm]tOi|z9e!?y}k סQw|u @vW0v@`!w[e>ItmC+F۔#>wxn,^ ohc~r~ }>b,mJ5M0/x`؇Lh֟ Z`ISGԴV^1n9han6t>DIG|r"gj2t۠o|N>ZgZe6e٧g!`[8Zjض3wr30UE?8aJNR7~KAD|Cv~;\MC/PpWS\TѮT~^gǏL29VRSfbm (V O=GB/ӵ)yg2&Mimv "7ER֭?{wUE328}7ya`iaYb[jkJҮ~߶ڶh&hekd$)! 2c|<|3⹎NNG7С (V q(&=X͜(%_qcИr50 0~ ^Acx>.ׯ;[, yeVG};!E Ya/+8=Go1]/m*y\TQ1'>.^W"uI`rfiɝ1rZ,K6 7?x2 ߴ2`ؖΚgp9{ՋYқ cRdݽBfJNA9;3tlghNM|2,'~^ LcInsٶLO=k_Dvg,t{1I}3Fn~+2+&={Ǽd%~d ƣYdffIyp S_!99t747;1}ҳr?NB;OY?w_K Ʉ{vZǭICo/s]y,\Nn~>[aBA_۶}bd]Cv~V0<)Zo\9|UVm)pw^eͺ"M%ӿX&_sUj鉯Yȳ/lxQo:k[dٲy=abI9xW""ʐ?Tӿ0kXM \j,SlpII.ޛ1/1~AB< {RLGb UXCK~p5f6&Z|a'$Z2/fKL 48F}1^brt+pgJ¢&Ҥc˴0 >]`̌ŌlAr^u>p_a6*¶&-*ulF{G[⥕hel/=Gx[7 y=leC;nK"y!{tcv|Kpw}n^sk fgx9^Wqoi9{-Flr_m~3㍳H]tisoLb B=rL}έ]mX0Z*wPib0`1ӆy͆ $Ăpf{ڳZG2=bT. z{9Խ-^iRCUlmQ`a0V(>U7|S{TnT3廷]>{ۜWYz޽/}@'yDkK8q\\gkƪuo*mUq;3Omܛ:n9㏯t\mV_D..+O7XBzu:Hy&,2,/W >3 _e˹.k;5_^LUr_L>>?}yV}ҁԵXj 'suΛj7[PPcJ`Jse lg!u/̯ mq>oO\6~ u~oW-09c`l?P-""""""JEDDDDDD@ (%"""""""~[DDDDDD`& MP{jW بϊH]Q# vkzmW^UDٕQcewoxS-oߝ\}VD.N~^#q?P-""""""JEDDDDDD@ (%"""""""~[DDDDDD`1Łqc#;W] .lUrwǾ:\8N9ػc tUDDDDDD*lR׬?]#a1hki4lp/TD:۶|y4..KFl: t5DD.J.[)@> ʦ:u U97\38 c#^& `Tf?$qS=R> pv/ ϪED)0 37nG2K%-EL_QUwg)1VsٺXsɶ^B捰ȣ՘'\,|2eth׼,co+\r7n񟼗f..@+2*36yK1W٢._q6,\Ķ2Oq6-b\eU@k'İX|5Uڎd[wRsnUǢy0`:U.gnNH]w+@}ؓ7Ob݁M  ZT}:syꄁ{cJelr9\ݰ:')NӤǽ̙` q.>9W\aoW6({U8_i >|mBw'"RJfh3YǘoqEl}4jۤa{ٸ Bs:qtb00Kϖ#oc@w_<>E S3gx j[+# vNWuk4g\2w'{Fhh&:t &5-:өW|mY-"la3 $7l,.[.+}^"7ŤoEa0]ђIGD^3dQ=fɻlV^O Z>qk?f?~\o^uyٽ)} cr2h’hkN>]{B.f`ͼgYSnڠrmT?0 U;` ҩS9S~2n0SOv~vRD.z vnmfE[`ɲDfnJǯv b#Pz& b-RH5[i~b דw-hڂkګtN{ u}_чkYֵ;*[xi;owfE~{1ǏKT g*VQ)(XWED9`̛n}!q̢[s*UmhGrȁ0ۍRLZ}(\.pWp׀\My-yfЦ94,BףZIHǤyv z0r=kq{`|‹ߧ[lI??!w/,:4/sxG9C?!GY1s15mbhKd{ZEp6;9v̥_d}.:ZhɠbZn v+&F 7\d+/Gpڊu}X{9ϖF2t$}VqC\V;$pMxjXfrLP$@4{+uYe/E0_iNQ*?*i1w|6rE?}<#EGO0vgG򐳶QO`2g搗m;5V|{(9K~e<űLޝ} :]*))O'S8׶"pCNK,0aBɿǘ02&ȄtCp盝""rVFn֗\X;?GaA[zrgJE_s+oӱB~n5g az+3c?aӏ #_GF>=?awbm;ED/09kw slzq`nYsung'T~1H>e]|7o/ȟryw`O+}B՗ѣ:ןRKic t%"\I͏%9v-ޅ]撠e%6Vݞ%]J*{%3ҢGF~x]DDΓ6uV`Ӷlnw_Dgx7>O ٌ$S\60mpr \U2o6#wiy{X~rܩL龽!Cm |mKyf?##}pk\ A%]DN>6Хyo+IQLSC&Cb|" &&8 l1xX6]vKw"}ᮼ +<iLІ48u#=0~X "rveз~/7-oso <,qtʟ;k9N;E6F`CgLwr򤽬,faK ߜv;6ٌb?-(R|wsau`W<@4ic~y̖r. f,|SizA#NyA⺓X{_EDB0`61|+&E˩`f.Fe0c6{N 7TDj}r.g vڲwǾ@Wジ{@WADuxk㩧$ې[n_V_ 'R}]@?x]4h`nD誈TﺲD[DDDDDD.KDDDDDDQ-""""""JEDDDDDD@ (%"""""""~[DDDDDD`& ݕQ{jWN~*Y+j$(^K۠vC6Xيr1GDn%"""""""~[DDDDDD`l?P-""""""JEDDDDDD@ (c+ rL :eDDDDDD)Kl̝<t{: F#0rr2É|hShZ*>ĚwגOp4NV]-LiNul8&L:ne{0Zt"W~=w;=?A\70˙eD6P]8ؓrymO~PqK2nK$̞cŁ8k-$w mBӊpB0i+򻗒 ¾⸜ gNWBLnsFNcy&U'"R&`9޲H"##cm[zfa5Ӈ%; (LeF\ɲg2n SQ@꒙%eD0m9@RpC|j6g%84 LDD;>t>[ә;4VOdEz6ز;&2 cNq3ד_.vGFF<>%2>Pj:bpw2mh՗ް@n`+&"RI@ne v,b_byںIOd8H]9ԕ0 #$36r4mB~]7D^\DLq}ۡm.Bz)x6"Rk$66ٯZwVp]J~5Տգ)+$|fw009v4SLXV!ةZQ|OrKP|̨iyӵ<, cYXiz/a oA G ZDŽU),ߜCx3"Zqbwݳ'^WTGrȰ2' `Be(tm0@KΤ&:GF' @8f?Kv-j|j;K]lzWo:GbFBg{v""hV`҂<5`Iz)͗0vpJP5ż4vW䫜KV)tN@U^]a`bPv  }lߜ Mq, @X rv+L6V1e~@z}|@I:8ev7+8ł b!vtsR6sEG Kt7gG* ݎkXDgrRMWt27s: @;R2y\HN~nLK`/,*[zNwxjz2H]2TGRg2*a6 aɻCCt㤾$\W,dV1UZҵ?H7 2Tr ٱcx?V^ơ]dsdLsUaqfW7ߛ)gɄ{ tDD*7 fV<Ţbc Xɼn]f,e3EaI7z:qoc +-fw& aڨز<^1'3ZMϛ%X[H}f0օ$jH$05>%?Ԏ3?~sbaVq Nj@m4m{9ͬRM< {RLG.AOv]iyvϼ+ӉZ ,&8XC0/l[N:~m!PѼw"GGf b)ɼ?l *gWй!N۱;0X0JɇJfӆ-ܾ$!DYΫ:-9#gS4 my]ndFiSDDl}-BED.#:M¹cD8w"QCe0 0Gju:6 Hݡ[DDDDDD`l?P-""""""JEDDDDDD@ (cM&Ԯ""RrQF.{Dڮ H+/V8"5u(%"""""""~[DDDDDD`l?P-""""""JEDDDDDD@ ]AAA/""""""qt^LKSJlwf[SY|^xQzb""RKO8Fiv)[yIlw<>_qyy3x`4n[:>]ZZtt;VVODDj[xfLlX dިW C>eu0;vMDC[/YoᵗFt5~ᑤzoK1,znvgϤU$kdmitekP7cB c#.^. `8¸0u!~$,w %޼D>H@\mCHc8ȧߗ^]. 4-LȾ6Q1#)ОGfOC55bHJckY>ЀPDDj# "k#ldž3?i5bc073iW ;HaA$2yKV]JbnW;S}U'%{>W|kC-K;xaX_ǒ'6oe׾̀A ID-w'ND]>hBľ<|%d|G?3殡i 8UIZ/~naf&^>S cyay6A9Md uo8ma?d@ˋꎣg=Y/r+1n=LDDXƍ'e-f=)[0wGRz4~0Ә`zǎ2~ 7Us˾);}l/d+ޣHj'*>DŽnǼ\6Ex5~s`wť{x+첺紹vHa#}hLnLamfwne3)d)| O-}JwM-K^TGc$uwv{!cpqqvCHm`He'mn XKqwlϱ&Pob4=g\_s~<i@\, [=>Os?P m[Ǹ4[isLcED+ hٝ~EL/ºXoo*`jϠpx]\m\pMw=;bݷ􋍡}F ̀l aY)^WyÝa!Wߛcf4j\Y➟GfA)b"m ],8,h೯oH_^0??ǃ y)w?ZsKB_V)g=ܪ?o:˸db侘~m{JetI1xFj-O}ʏ 7DŽ5>| ojiӧOn ti2^UxgV]4EVMMpQTl |ʏrorN7ѝ ics80YeOM<ܕQv-ڽ`֡W$`eڴO""ٮ 68\y;f8+zu vCLV1NNٽ cj-]ODꖚ.vUܓ f̖e8xx}مÛ璜̪`̦1$+o5;DD}|1Pjܬ=#\WDkϜUyu>Og%k}o ;`l?P-""""""JEDDDDDD@ (%"""""""~`BweDUDDCB.6"RWHݷ5QlA*"Rm/b1BMa".""""""JEDDDDDD@ (%"""""""~[DDDDDD`l?P-""""""@W@DDD.˷[V IDATU傂j&"""uO@lW!ּ|˦vJ-harOwpwpbiev; fwf NuaZc#}R~n7CzSDD5+,};{A~:"ۅWqfSUjOcG{!z0ykcIQDj^`nwgےIvv695sOfpd;kfŇw0sXY5?cﮙ8ɬO%|#:qBXDDqf3LWDC#[Ft| tMJ6oA3#XdUl3Vl|r]9"R]}șQtbN^5;#$2r"+ҳKdfH-}Җqs,;ie܉ݘUnYyI1'>^hV *.RgzjekHHNJ&wK}""rQrgo~+lu7Ja2=$D8F ǏqGN1[XNv'<6%%("ZB6b97Ӻp$m 񱸖mWH{qOmPKF@ {2HoY6%Sfa{1-'0ih!jw{'[6oOd9w#I?*pԌf0gi2؄i| y3-]9=EAГ:scp`7s[XYgc`_ߐSq&&6%iɡ˘WOK{?n:F>9"r.`/eag@27M1,5&h=xV|z] pcG1΄u+l5<5)Αx3"ZQXDN|7'AɼMI,/=L ܙd/uID:&`+҇dN$$gL,۵:8`O!)N"e4މ]N8`4VEkq\n.-P@J'0DD6fc3z=15F~w,NgKyޏ[۱U(\.pB{DGN~<^XqjMbXwr[,ĎN`NfN(0uS6He3ά\>p飧b-u0y(ZF_`,3;3դ>Y7ȧhoYrx>p~/t@9yqNJ&d8'OaA#Z-*Uą m 2~l+qC@rF 'o ,dc=C&~é30wgcwа$S 1`iHeæfz" 9LVvơ]dWIa jRb,Ҿ}@2O]CVN.+xjZ2čSC%>DD>y -3\/m&|!Jdᴓ%ǒ *,k8GD!օ$jH$05>%?Ԏ3?ъf֙${ibRz5͂IQO˛c lh .P KO`c:q6;ck\r<,FLYj"ύObx{ޱ3X=9K7 ؈Ow7v""K;X)fOb|ꙧL⽧̂cmxu5JQcoz;f?F|zbc XɼbkVf{ A爈>}wmo}.]j-cqH}Qqr] ?2`x>gi0LKev Fx>DDx7ҨkՏ;JU k9""( ق&kڵ&RyRD?LDDDDDDnP-""""""JEDDDDDD@ (%"""""""~ 8Nw"""""""Ʀ:bEDDbgA!M9bŊCXL-9r(rw"""bI~,$dm-]ӧOZh$Y]9 Z*8(1,]14mmrEDDꚾoky. _K,bhH^5QE]jە>+"ܮ)W%"""""""~[DDDDDD`l?P-""""""JEDDDDDD@ (c+ """rAAA5\G H}d=Bꚵ|k<,m-8mv` ūp&Y[ow?F\IIP8O?s1Wo:t|c! G\a9nPPΜoHوp {)t("ΞGIKz-U(|\lgc *ӁmmrII.8Tmg{7jolƙ7#%rϒT"VRǪڈs,18~=#tkK<>[p]TwMͿ'\ƙ1k%\ӗoSҀ}{Zne% YhT"6μvNam=\՗oSRֹ~}16^(* 6 )ըXiCtԘjs$*圽D.6JEDDꙢ[Iv $z`Of<'jt4P g}0`Xu_Yp: L!)ѱ~[{&ӆ3K&V°ً9sn_ .xwQRPT)aUkv[ ܖHڞسIrcHP_V&$.vfY<|w8m"U{v:/xSxв"\.ǽ}LjR:>Ɔn:X!g"""~ OAmxe=Ή瑙(mYnjE0(27س61c1̔aJeÂs6{,sfp{߻4q!)i?_:.wR`KH ?Xv&З[4C<8`,%LdX`^ڎ].w/lvYxex8%kOO;{a21d7̂>c7&Ɣ㭍#w׿VE.V-""RϘ[_K40+n8bЩ=F%U^3^ږ?3AY=eL|E}֕$&-W\8ɖ/e%>(׶nBfd]SHAT^Nnڿ?ײd'̛̈́Ջx*)&pϿx{HC|gZ&ą{Wݮlۺ}ZF '((oXzezk;E(Hxz]u{!CsF R6w<'w#ll]Wp?7ultNº: lwn-h)> \W.P|Y}XC{\`7p_g´JfeڒDGkȾ"#pۘ1zFG`mQy )~{wU5 2(ޥɆieZ溊YXkaIenKKV-EM\LLL%͛㫈(2 c```f@5|s|:s᪾b+bs >߭_纎k}nzmOʋ2*f e9OzbA8^ Oc׫W 짭i;Z 0RQaܩ+fY9a#7jfJ ЪU+V襭kQ'j{X:{)rqx9]CQ86+^r '7qX'LJw-c2_uC:U!ias}pN|J9'v$)4@4rW9Kātm;T n%a]BRv[kJ.U]5p(8ǭf$Y#_%((-RO^b_Zl&8,Ǵ_$24lHɯ}˜A<^'֫_5r 6!`eL]~_<~CTVz+Jucb1YAPGjJiNT`0Ǔ0˚P5kH7@=,=%o9̃>^`M ~k~TSّc8A;7) gAxi!ln=jE g PmŌsޕ,bL{Uz\W=lѰp] #|kյiֽ$=)C/{;_h V+pǜl9\4>5.ν{1cik_dzx4'əH seԓG<9qpzfNnJ7s%[!d,`0Ӝ(I {+ Rv&GJJ9c={UyxvP\[0>%@#!MEE&Gp9Rd6f.XϑZ990n"nTLO|Cp`> V}GQIr7$aUx?#El_ipC^sOκC |l&>krW/b =="MfEDDZ7+L&g^;O-{X Lc'&zzScy!,;%@p63q,s,yz{>nqo%|i. 4%ErMڱ0Zl2{>uߕX-60l2݊DK-[=ݭ[kYA>OZ]Egznw+X-LɽKuk=\7^CkE`^ oqj^jKg6~}-g iWQ6;טC3"""-Ilvm}f$\Uc0f>Owk $ج[ɹPϔ)`?~N;f`0x)uLK˥[DDD:Y%_}5[%оr3_y# ]:ޥ%MDDDDDDD@"""""""~[DDDDDDT` l?P-""""""*EDDDDDD@\DDDĿve_DΈYi.T`43;~Si̢OϊYyKEDDDDDD@"""""""~[DDDDDDT` l?P-""""""*EDDDDDD b' """hrrȞ!;3o 65= /K_~ X-wGz-|K1+q/nJcׁ>孀ݸ VvgeIZ# 5,Y&gWg0 {,oq.mXNN!ѷYl=mpG)S-""sk, gl 2ylf3}ſfTq2y3෣tg1xL}0spi@TT>?B?}m@I0/ynDDIJ!`aKz\@%9JrK*pn|>־K?j8+HVYY?ltڹXGGeeN 9v{~vEm;}8""8JkLS:hhu8pDDTLqݿYGD;;?tDDD8H}^gʽ9"""~~йoKuϑO=獿bygjbMp=.5NiEηs*++əHKUa܋[:&$lả\@I^/M$228^{Ւ,YtMdyVkڊs֑8!D[HLL$. ԴT@D:/s;I:1 7&@wm I"c7g=w>cyQmz#1my̵̙9 3W[s04#*EDDZsfbV8qԍBsRVQl ˠ8 Y#K{n ]@cɺ:ԥiH´XX| ðI9N6ct\JaL=z4#o5M)J OB寒F,O @; tw]l߰X)}>_|Jv,"~AOq[ NfÉ 9e#|;"""-)z)O/jgltuO9'X>5F8ӆ G613&>|<VmcNae/V:sYJTq}J 3Hّ?cǒǘ+ڗliع/Am:Cv T?Į#jՊ t}ycWvGJ 8Xuxc΄7?9} 6LVV')g6ntݜJEH c)̧f=))61?){Ӫ:#6\pwW[G# OwKmƄ^|:+Ϊ4!}Ff^}9qi36ԗ{mXA61PWz_(+( Lrx_~X3?*k=)#s%Yؽc۳!6v䵣ϕc1NusWLH ˸q|5gaCH%đ6i/K`FBىB+|E/y}&&a\#>@bBo < kYV}3#zF?=_ϥY׺[eo8hM_3@ ;ҳ #GƑ:n>rY#_;Xuyۆb~"Icj:ƸV.4"NxYRsWLia¢^6[r),,$oZ2) "qu+ >]|2Nb"5lAAq19?;BLۆ9JƎeIDATJ(رYg )3W_\BJp}:lgWZW!X?9vP\RHۉȁ{U H-Bn!lwZ Jٱ69pM=<̖}buj8W=,Y,")SJ f[>o'NdNՍ ;W[>G H cyk52&D8D],qQTwIńAf$&2%>UmQc?wtHFV3&ߍκ4Ufhgve j\àF_,`ၯ8۪cTl4'*EDDQ|.]s+MپG~-Slrit3?P-""""""*EDDDDDD@"""""""~[DDDDDDT` l?P-"""""";̢O/v "gD4*EDDk:E\DmWQYveD\DDDDDDT` l?P-""""""*EDDDDDD@"""""""~[DDDDDDT`AN@DDD.G>MV^^Jzb&0 /{@ FsT'K2B.N[l7~d_V6{U0.35 #}gb1VO<>c%=rZ[<6N8V3/oq WN[j*K c%f7~רiT`(6G~Pv:##:%@?Y`Vʻg BiGI}w,́Qؚ _=Axu/Ǵ?f [3tn9ĒXxr"Ci@^fOIXYҽ^Sʧɿյ?j [32uyw=^ɺqB(Qވ :J꘱zeq8 HS[DD%1ugL$ 3PcԞ%<6!V cs.߸Y,/Xeo=it,^IS !^>&\k>ݯ3IǸg4"M-""R]/gԘwȵ@yI:/ǯ#cud sWmb-Zךs'T='YU-lXϣ^PC̍Wax}i=V kH;vPΙSIr Z6\)ܕ apUɣINmH3vO:q<8Qq1=\8ԏ6/[H[{X^Ȁ%;ud1d;;ܵ |lxgb+1Z[DCoJ3"""-#lOPQV†t6d+isqÇ$<{x%Mr`s/;Cb/sIMOS!q,~9 yvI䚠">KbrFVnۦRY|-TZ3q5'ant/8n [@%뗳_1{ϹW V~ʯrS?k]nb "ov7{pct_mJ #\ml|><}0MdMtx2cH'. 0~3N}{^5KO[Z}ŴGcԕ@ج|ʏ]53\lXh*+֮(ͫZy^ʆc9^NPm86+^r '7qX'LJw-c2_uC:U!Ҧ9 Tcp{`- ÿtz%$'Nea<:} aWv*8 Pu1-"6r94‚]!8VZ4-%  /@AiԹ?^Y)Bq1?Lt-?q6s`bfc/C}׾eΠ R AvBJ2x./avGN_a,Z9[Z=y|61JHM?"͉ li4o_a[Ocx?磎1{^>5/(]|*vk]9y˸>4lI<oLy o?:݂ɱZtTj 1'u>b2`Ӭxָ|:qzƌ-~-Ҝ0"""rv*j~1dʬ39RRʑyp +0ug2vPn7TuF6H[!dՌc0Ӝ(I 6ml+`7 fi]Մ`"7'ܜ\,v_u9Rr]k2'CӍ鉯tg(*>I$̃1}j=gpk1-ޗܚ8~wjp,|c+ 5)W_czki4-""bi 6|S5 NkdZU:R灼7w"ƿ  %ǿNʘ8q/Φ_6f XbcN/uIFS-:WL[1FI;%ֵ!G/ɹy0e\|=:q#`hWy6q?'DJ˫4I<܇( W;/,j JHJL୪ע^dBr>~f'"CN#?c"m>w?^\oPYYs EDD̢OSOcPO ljm<`cjet [HHe>+/t!KҒf#.v""¨fG3f""r11]"""""""~[DDDDDDT` l?P-""""""*EDDDDDD@񃀋׮식>+"ͅ lff`/v "YY2>=/qu"""""""~[DDDDDDT` l?P-""""""*EDDDDDD@"""-Qeol826/{m? Ƿ8TGB*/?/N`߉X+.+wo=u|~!㋴T;4KGni om),8؇f/XMcGt~i,O1w|?=~CPC{N3ɯ3>c~# _R-""Ң;<HM`9 |};+ v86p80 5[`44CV7N5OIkߩn8&DÁ]W{}-yOp47flZ=44os0%"""-L起*q)& 3C0o( ̜Idg,,-o-/bUDFFϜ2*UO&FFvF~UZq&׉}'8Z8vy9[fzt,[zv ɵ{=]Qъ2Kɴ.\N9 TT~N5bJ}'c3Aw-{XN/YƖO~i]".""C97td60+3+n&2Mi;P#bI&O8B\b07?;PoV0v  g{d1Cj3ae:K˰ok;v7+H[͆r0Ru&3no,oJ版Z1Y|p,<9݉O2ӡsw%NGZɇb72wG6:/å /f,l\k@]d7M`o7z#Eiqv @doi7F 8Fh*Kpm8rؾ{T7.;1nx{:]s95S'S \Ea wj;l:Iunu[ kjhP 81\6UghY1Kj=ɦ;W [YhCܐXz])1whhc.t9S Jŕm8},|`` wu|_c8sq{qYG(_F̉ 9lع~\%^SbaҘ:syd-gi[;t4y# cPc-#%,Gi@x&{N^ޗ mB0`,v=}1v{F,g|k@ p4U> !m۷$*_nw/N>Ƙ9ζ.'3W8! @K'{]@pyyxdn<Xgq hTw&(Nr]ĺu.aLOU+}jWG@ZiCCPICC ProfileXY 8ן˵]ى=KH%ZH"J!k"$%d)JByy̙3gΜwUK RL \\p 0yOT% 6;,L~Q>@ Cp- ̦<ԈM| ,DAl_a{[<vOG&S "tD=XpߠpU:>d_=8$'+Le"BqOs%,4|H @lb}@@?sozSaF~mOE8#!{,6;6fFO/j|oK_?#c#^PC4LޱN#Sւn++T[sZ^ ޟbb/Emwk.j/(F*dxLREn42@۴D,~ULP` K`~=i}TßL-9f/>|?A柵 J#]'~Ko*i?b1k5Jn:Q-G&T=@5Pݨ_f! ekȌ~ zW(/o* AഥuпIF7")?C6@k#vFlfCsY6h]dT῎-[l%|@p/{"(AT}0PRPTgW{nL؞ F6A+4AB^:f|)1h~NJ@h=` v\nĺ x/H S 8 A1(W P@ ]<#`L0p"A?$ ICJ:C yAP8 %@P:.Au6=h-(fya1XVa H8NOp|[.9<(EQ(u!GQPPiTՈj5ƢIh,fhG:}>.Gסosu Ãhb1.^L*&SiG w,ˆǪ! f`ck}wEljilpd]5qxZbnE^>^S<6Y>6>=`l{|$~ lfy/  9 %  Յ[DEDDD^҈]s;"V/6%!n./^%>*AЕ(x&T +=qDIՓNaO,bʊzwt]@vZ3r%>;kې'w*o\5< ¢w0pbKĊr1JJ:/_(*M/]+ //+PVQQSy ~ՆjK5l5k{]aqZڂ[[iuP]\\}`xkC[oݑS$ؔ{{)6Gܟm hy:=;L::;j?lzc]]u*ݷ<գSTiCFoc{-F̟u=~788<>4>;<"ח1/WFbFr^*z-f\u7oߎy7>D⇜IɊ)iޏ>ND̬̦~bTYs/s.s_)_7esΗ-l[h]]|=R?v.;/O]ŭI5[nmlD)PToeH wA!\|׶os K|?.GsnllE`; 2BC4 O U+7c,1c8Uyw av@daRg#QYΰ6Mp0ss3'#pIW.(cyRE2dO%ɇ*)nS")M*DJL95}FO1ffyNͮ93%1.p>OSxdkiIr=,VU_\]RqmRݭ %; 7ML"ת&g;:[V=~mDG`/Og?3ƒC*/4_ꍘZ y<^{:8C>̊Eq eߛ~|^Q[4-(7pBi4ՈV@WcT0X.L$Ӌ23p łaŲ1ssqps;yXnf@".ыb?%nIKJ I/KJg5(+)vREGeF'< c9|-Sږ?tJtt7)JFƪK&qfZf+wwгV)f6Dg;a>G̝y?4rA>q}QOO/u2Ż)h@ Ltg=DHGrRpŨԧэ1{c#q&@ 4Sk19jq6#qxቛ';N eNd}9zf=g=p5?P!(~ɪRSpEFbo٪z[Mе njߊ\?tQNHӹ-o1kl}P㸮{+V잵 zsXzo:]χ?͂Ug(AL%h9z@z d$5>-b@sh ua_ěH&GGZNC7?b1VDL#f ^~)bpx_EӸ!g# х8JM?ɰ̘,\G2&=g dYebb{ɾ‘˩9ȳ{υ_+/%'.l*=&f#&>"Q(-%"A\&XVF 4JnWQUT]W{DW5"甞.g27mzyݎVSl>;m8\\vI+{L>Gw |b=B<҉r8U؎x}ԄKٓ2S=Zf>|RCYم9w\и]YQQSuj5 cu 4}l&Wt~{l}gp y0RntķY/~W<.S^Zli|uZ=@$h;eBH–p4\?Bi{e=c0uE*6{A,^DJs Mȧe=NBw(MldHdglac&2ד.yRP{ޢѨyK+:eze5wL0'౐ԷMyޮܾ֡q+.Cw9HO#w

,H۫&oqdjЌlЧϾ_~ }[rZa̟kˁ˽+*+y+kޫ-kkֵϬm((e3@WbXX)X+FQu0P}tF{eЄ pHYs   IDATx{UU\朹a@ 7$*H!JiJ)=>a=f>YF=֣ɯXbiDDD>300sku{]~{Bǚr!g@ @tqz:§t::kSDi3az?:w^k5Ϳ_Lkx< !yg6"x<>MiNE^(:j0I =,XJGOwmX]mCzurGG(9Bg&^7< !4ͿckU<ͿcS{vkմK4rQ/Wgdd|}h4z$C5ztƒPRԟѺ1񸱪2&˔5z6z57585!3m%VFm#;ޚͿ_k5Ϳ_D"A"GLJIH$ґB""RWʺ%]%U2ݍ]6pw#s62UjFkNֹ=1 #nk"9*^5/]k5Ϳ_Pk6wc^e:tH vRsDVN*Aߥ1ԲUwPgt$k>IjtYw{6kuPsc: 04Ϳ_k5Ϳ_o}}=/&:[477swګZ7U:]YQH'jCTn'nN;j;wGWTͿ<מmh5ڜk;é\4Ϳ?I0v]b`\c֬Y)~PH@RԛQ &Rt&nө6Pu$]^O^sE-C!ӺH$RkD*n47nͿ_k5Ϳοb8 :4%wH SQϥJ;[ltyddd D" b+-rO!܍GwP R U_{L'H{5oa=ZMk9r Yy=Y4wGm\T܊?jJ}(Ǒl.5PS@^mMXw.&gv)>a*Sgs>͟lWg{Jd^O>P;/OfV&;*vPTTS䱚F݂QW6^9#8ܴ*^ ֤ 'zRhL-BX+v3i 6Suj2],VWW}.̱cݻAuHٷ|>_ *cG_^W0Y&mUuF,W^W1b]թjeKnz ;;ߥ~Ϳ_k5siӦtdqˌo \5j8%=vVZ }^˻͵L)W2&Tpph8LӶ>?)c+ٽML X5aöyl]2 Bu}4)ofD84:Πh'N0s$!`,_S/]!;~0lG؟$!ɭa( -]K,[)04O!#G/ӷo_8y$X8EAN͔4m233)((9oM$૦9/J= uR''Yz,[UQj45Hsu<5*nW-NͿ_k5ʿjo!ߜ>,g&''Ki9xhp71:+ޱ8 Za'3*3c7_v+H1@݁G^v '#úwӌI45dTӅ_`Mii)d)0 jkk6lYYYmx9Q_u|ukk+MMMݻbrssیWF嘡nWWJnY_uRvp#'>u”P#Yկݝ_^V'tǓ' 櫓;5Ϳ_kO:Z[[S|40Xd _W>cU5 Ar[ ;' AaFVVDkw*UEҧ!0OZ7a J hЧ!;jAlJQ' ԱHhq222(,,$ w^B!IRXdYjUJWV~|Bge IEڋJc:a'yM~W'e5_QLhWT T-Kc_Ak5Ϳ;|mIuuu)4M|B$ je2+= y~ٹxs2!+ A0 zz@0,|yr1A "^L @]EP䐓IN077!QӋEx37sٳ'yyy1[a؋Κc|dĉ}^/eeeo}BX΋a?kC03 ޤ76c_dmh8iYL['Ѵ 13iRLaZΚ!2[s[]WEMKZh#;)O ٳ'GwNBɓ'Kqe?dU^SөTff& Z.npjwOND$'VY5+c=1qWhU'9i5;۝_PI͋{jo,C'J_Ok5Ϳ濻9r$žnU0{wIT<'3h8r B_!,Nԁ g tn4'+w#քoHi =$jLӤwa?̦AydyhIPm c6Mi jtGMjjj?~cPĔN6 3x/fȑ)5) @4Ngơ?16̤%¯0aVbN]Uϰck%ܜgk9.sYΞa)SݧǏaIZ,:iҙc[maQaضQcCyfRNNBBϲu鳳BFMywD_zG}F2*+1Yh#RuT'tQgi7^]cXJO7Yԫ%˔z?4Ϳ_k?}hԉRS3kҳ܂|[=zZc͠şFƌvȓe&yGp>/~@."gU #1B%#Dx=Ru=l#?,mGiM9 ) 47ƭ6`&H>}X6uO\vk.d?OVA3F{dlLZs^z*e6DF _r5Szf&6fĥ/j)CLaF7'N`&Lƌ-[%agO<O ZG$! :?++W&E{wPzMEEP(% ɠ%ʮ:(,So]ŭwO=p'#Y_<XjtGպ{uU˕ҍ޲>X G,-e_k5Ϳ_Hj@Y9yg.-ec$BcQ/=9y9y {X\h𠁔5x<((@%ֽiʼn01I4iٺ0-qS!P$Vi37zs`aD< /^+)+ۆYW4x1z<СC&,'y0$Uܦa4n{g1ALa*d̹X5o$By!Bژba2[Yx>]cBB\)?eҷ05煽` b5+G9*=ΤPyy!?r%[g% Muj&&aA/PaJmklaӜ.^ٸӦRa$3f4D"}߱H$Bnn.Gi"a X%%%=z4 !)/I=~B $ LurQtqGtDŪSUj5Ϳ_{"D6U13>lj|bZ65qmf.Nfs'XPDL$4D"AfN^8|t;*w;s~f.tIb1DPv?3pMoob/p` {VyL,F( Řpj0'N`С!MۙItŴ}qSΗ}/UNw⻙?X]}E!NWꏹBޫz<}vL'ώjn6!E<} zî0YSKXRH:Wyljkpy?[b,|f-1!үxyo[S_o_S{Z1m7B_۩TV_ +lΟt`MS:f:=( Lr11Mi+2;i?A&@0f Ǐ'"`С8qMΦ 12I-Drٳ')e5<ם e~Oj JISpqWvO|2[^Dҕ?ݤNN,2nW'N9qKXk5ͿߧBݎ.%t0w@rQlŽ)=EkkCaXO VHp=KͻCA۷n ;үx9DH.K$ J #n@n**vb>{"%#x3SR]~ØIqqq2#Pn==5#-U:G¾W༿s߽Yiҩ31E+(pO/Խldo1FȘq;|񗫹e'/; ޺L^_5,lG!f{`J,Y|큟gZKζWU:]7b?: qQ,h^xS r5] ~L*~kb WRNcvnv|r'=N<wJ"p!~p8LKK @}; /I\`KSSA`F%UtuuL'$&iVqMqg5 Ùԭ핥<yyUc=Lt,[NͿ_k55> <`<OGG"|%ϣtE8H&MMS~Momm oE 3 ߏV"LKS']Dx~¹dTɓ4FMBbS?jkk8p ^p$  aHGi|("W=ۗv.La9D1ZY\USz͵w-j2 L"%f_u6oe1  $ӟ{c߱/_kv!ﳘ5*#|o 8~{§Hͻ5pj$K~&6hi IDAT6eld_(eoR|F<֪nWI)ΨsӺAq`2*~?taNiα@H % @]]׿g?Yvq <9B~srS##+$zٓcǎQ\\gRHd96%B0RLfbzS)N j4V'HK\~)UqX㿴{Vx6l{5Ϳ_k?*|"HJWP*FTO^~(G\VZ4ɓNP $B>L-;re=$jTUI}2q)x6K~Z)nNy#.&/|czX璛+ogs.`,]B/Y_y]9Cě 8GV:\795I&6* j& p>l/+\Ѐ [xbďaq1t1Sλ5 g䏘~NoDj;ܡS=mI.'45ukN6ݮmjO:M6RSSC~~37ߤ72┖6?77={P\\L pM|Ձ/++&z2*˕+t'u@ZGQ+'GU#hqV55&zugW|H]rA:3j5Ϳ_TO50OjpH7)ʪtL6 (1xȃԩF%zy]{zVE$FxhW{E8NڦƶzeQFqA<dzgfymG;Vt.dp6w1~翆7X_.|1+1>AO1sǛ/%qA.>!@2+B9?^v?6V/xM.$_^u El|~]:2{m/7Svb=ڍeh:fmu3֧PN8G'gI"`ر3˦M83 P{c(zBASS)s(ѣƓFIzɡ\GꜟJW'65:樓8''\Y?QdUez֎#eV;k9,_Gk5ͿXvEM!###IU=xY4Rd8>{8PD5:" ͭG`Hjt>Bo>ill$bp~4}kL<9o; rl)_c P' Hٹ)^ni[|ė!/py,\۠qlf"q/99Gږoؘ;i' m8;6~?sssywû>@~CnnnJP䘢upU666RSSCIIɇĠdތv_)K2gtf7s]ȤށTʶuΰ+26ddx~0V*d¾#I:}zgwUwFaoez2qСCdggR6B &???^C~(~#9!RQ'EutUNjVUj:uRձPTͿ_k5ߧV"H8 %I,D~7Ͷ7md5zc1o LuGmqNy,ƕQ !sUAbli,08t#/Vei:f#*/"/bnu!AI/q0WkIGHʦ]cv?8?g8KꤰsM v ao8; DBۗҧOAnn.MfffJ^/mƙr,_'#r:~Brd] H.tdg*fu"4Mg'`nrGU\zk5Ϳ_?=};J!˂UC?xՈdxzjU4Fn'JHLjIlju3qD[/CE`;?SN7tUBp9$&7[ #,%H&`$vKvN'$"Y}MKg+0 Ǚt 5F_;%%%m~~>`z>FOubp:5U)T]rqW'|9nQU9 P94|i7VOdI@Ϳ_k5ƪUJ(dbՐ姺,. q'JLObǭw($Blh*N|X,$_PһGSSS i눶eU9r+z=Yڔ.㣞OwQ?^|s 0hР/ri:c~1T)~?ePwj[N2R,˔uek5Ϳ_' @zX*ϫ5f{,SOGL#1LS ARI`/Oskhy7X &]Cև\C4 [^JZmwŐ{-'pR]eK){-Ư 3b\*hAtQa8]CU . PT룎2ݓ!R'GF=k5Ϳ_a 2ɨ\&W JUcT[ԥwYSU a95~_5~_5~_5 )>2"RQ2rT cBVIҔ"pJNT`*&<潫bsE$P2uuWGj]*O"k镧wp 5~;H;z:a_`J`y )e^;Y0d r' xVB]d00S|:TðaBdffj[-ZhѢE-ZNAx W_߾Q>GX;|΁<4V4K3u^ةtAUp/}[QJ0@cfF"'8&77W;ZhѢE-ZhrbUYEr?PѧI9r(]]խ"%HQ)j xǣk-ZhѢE-ZhVsSQQk|]I$)8G!FnCOzؔ}F\g_H۞*Çw^˨Qի)>7s]/DFZ`AoF ԩ-ZhѢE-Zh˾}x<̟ٱcGr~!D?#q<3lذ0(**bʔ)| _ ''kE! pc?"]/xW~0=DIvi1r =@ {˺ðM~4}vt@nmD#QAϞ=B?Z>djwTVVᥗ^"2l0~ 1d1c纆9裏r7`n8qv'CFA~m'C; |iszrSikKPc M9gP?C@[h`ǖ1y?_ˇۗړ/u&6t]-ZtO8pEEE1+`5G{\4ۗsa|>xW_}7rwNvGE{MÐuۙN/U(ƒ%K/ 5|_a1p|J~|Co}1.!Pung%445y1<;@6~gq2VP(D߾}zλǎGð|}|#4++؝< ''Fyiݞ}qϿN g(y&S[g"ի͓&(8|cz}\͒#N &s7ݕ)r-3ӑh|:f~Zq0"ou/by? 8v|+WQºq{iĴ/ڎ La V?))((w̺x`,0LVT>LX#Yy!v:' 9y328~8u'뻅_F4lt6&S%O>III \x,X,X /zz?#[? yxǺ6p\8#@rV'}9cD""x<"|*FcqEEUUUTu4FiluE[)&NZ9 ;X!խM_EUl?5SK"nE_gK3d^6GXWT^kNMj7#TZFml/ZhѢ_W9t eee";;ʮ+_7j ի\s i ѣoftOgWqUpWӟDQQAϟOVV&$v-#mSۺՂuDaP\\LZ0 ##O ]%nGO?4=z 33nB"gϞ\}ֲo>rrrbx<L!M'>i$.:ĺpl);L?uv 8w]EڵUDi᪡iRtv]CB9bya &}E]:U^wA,ӑ]Iw$H*+g*(d* ^/7 ׸.n`ivA|ϯe kÐm8?ާgU-,cZ+jb2t<:;y\fOqj ;lěNP:n"d\Vp8[.gŴ!WL/ ye]駰@-Z|j;[l![~-eee9>X|9b1u޴VxZ^"DQ233 ȭs?&_'KCw^-[FQQ999~ϟOvvXJggpׄ)0RE*Y߾Nx(UѣG~'NAf0]ѣlFI]]?#k.HwzgOg7ߜrړr+Yb߶ ֥p,z>qS41[~wr ^X)U{k^~~p?n}zY>^{v;ߘjoU=%Yj+䧃},n+r3kYxCfpmSMpm7r?cfK p<Z-'g>`d:CT#fsVz TPe`f.fR7g˿f h_{SK63hO=O\:֛^Vh]TK#jYt=啩[G^cܻj\4T…?dܻ|\Q y/={VTțp`hj.g#ߢ{O_M}g2 W湷2)ܰ9~A=t CѼǞۙTlik&'m8BhӞ;HB/?;[̸!.dshE}6isqg䳊;a+"LNnR\VZwWt46g1[ "UÎ?NS[ ̽}.^w8H5YqLVP՜~gբE-B9v8ֽwN8'9=?f߾}9^ :]t֭#7׺Zvnm/V-匁t&oXC=DNNx<;8y$XG#  _wRӗ^tJ[<ox|~</^Swb23mm 2h:Ρp=–oibW3k.,wO6&ii]|@8͇vPUt\}(v; e@v,}d1c A"կL,K@CL-)u*!ff3hκVf߳!ff>YC}&W9sX28?Mz%?xsb\PcMgp}S]/~ח8 UX̢.-D }gl"ȴo {kAdH9#.LRp!?Mp-멪x!Ә3w xrv L-y+.,Yrv$mHE.3xrR~L/j4ܙx9<'_W |_%+ɘް?c̘پz~b*#{\;B|BWq`ą|c xUXKF$TW*A ,b2κy ݲBަ-jk[2+{۰6oL   9[A F6oAhʹq\N [>SAkgb|^/fBL hP4v:O f$I .RrU}m dCs__|s?sƳ3 +0;)%ưc-@:>(g LKhhip%1}a< V?߽R5k`Μ2;,ν*K'pr.oE); cXS+GvevFՍgNba˪>_ugqu-%]}6fzdTqMyyf` Nø˹g\}oZ2appF ˆi26dRQ-+V9"VO=k}|n ݋SQst|:I%P3m;ROP/0{&mWhѢEj^x']DZHL^cu\zׯMkr{W_2 K1/~3ft ɖg+RrKI2ضm[6g!~?m$AAff&?ޏn`HW>uM.;) /7Hkc#\%+@yͳɧIs0̱w0MC3,/WVinj;jaoSm4ᲯK9 d_nOxɡ}ϗ?Iz ka򡐵6-9 0x1m:o7GXv amLuϖe^ +U4Se˳Z6ʩY릥I$'>o?hu 6ٹn*‰a Ҭnv-m~w˪'WRzp# pK>Y=NCm)?]/B(3S-[aq8|>|WzLrrcFpu4G=4zGn51-￟z ߏ|>'?@#UUx|:Ύ(%4F5Pd;^8`#PluA0*?WS09|e?\c\n.`ݞ*; 3j2o EyS%V`ݓ;~Q @u^Cxt^vɢۙǘ^J?K='ğ?vn,ǏHߨvEǒ:#Xb]OaqSEupVW M)o>‚Ԟ'~ UKA`f\?ZȀ,]?`sm@69W$''3k7ٰa?<<@ہrW^\s5mgs:i#`PWϘ1L2]vaYYY曬]Nzz:V%K W^yIjDeۡ< on3_ă>ȪU8t >Kfel:RtKn7nz>!0'??py$MOOl66l|M<{Ǒ#Gزl=+3'yOu8y K_~ >X²eZPpr ?3^jN?a̝77fO$&\zyV,'.#) I[X̆F\>_Ú7ʚXTRtvW能 "{R*jnJU~Hoߏ7߯zsFJ)`dRPe6njj*X T# wF[{BԗP= (̓i ?zz NKJ%MۧjǠwk_trwVSQ]Ay@TTQkE+~ٱ+(vu[ǥSXS~^zf9$Lb\;Px揬-M%2!4xZQ$ll!X \u.FO1mtu+aَ 6e]ܫs =,xvcV,=kvWt6P5#]u[e%4TSv-n0n"~'Άjvl,9TkmtW˅*\2蔯 ~w+ p-76RtS-VAđ'~bqux EL 񛿮kYwc096SSn;Mxvn~;MIW%6R]v8qz2PGU6h7vW;qVAe\y4h#|& +ֳ F|VNS2L}3Mo|恪380at} ɠAN9(ک69(& >|L222x<|\z饸nl6t֍_z[xM-5哌5^Cr뭷g_|69aQ֭ #(HjD=_QQ5XLuxгzLqM7㏓Ƌ/Ν;7n<9ݲ>RG}Ėrus eŎ4 #?ǑyHh>lkWaԳ70\ z< 3~f?WY _h~`۱=4xZfrޭ{msd[o%j_ènO'5?w.آL?9+ZK'0s,Xi}#sgjA~>oaz`ߧ@їsYbH'eڸ^ w$FnU~b3Em~b!@S^=s( hF %ۙ~:o1<ķYSw 󇖆 0a'Lf?m $^ #ѦqY+n5PѦpg>wm35rDߏǗ?>56 K/塣}&NXY2YfNsg^\޿?{X7 ك̴S<} -\΂~ȸcT}1c0SF=C+`~)ھ?3mö0mJ bk N>6ƍ:t SnY,Gf?iXQ4m spn=-3g >[=NrJ26[&$[m3-Fpt#6 AJJ ̞="<^O߷p~GiwnwR>-l)3>1zWc--b_#QGkiAbJ Us5;:\Զo7~ffb?G~'e8/KgC n?X9@[> wⓧngn:Q;4898n:p$vi.㧡qEEN4= 'V2s2OҳOCu n )5| c/T5roĐՎa?u l %၅+'O#ӡ5"Nu N'.Z*w6x 54XdI;;;Isy${?w i=6ӺN"""x'9s&z4MVZG'7pF|I̙CNN#[۷N#B1;;%K~zv;@Eee%s;!C?m_$8xԬa~fE;TIPSS# bټ+dee1uT̀i Nxĵ@8fDotc'oiii\-`BFF&vD坉0;CC/k.RRRZ/l67ߌ#9gS1;9ь `K #&v'dDl)d; v紩Rh7ĎAՎFIppfvzg%(`awInuݰlhi.c%5s>w.VR;>]_s0Gtl[ W@.5낺8 ;G:V$6Hps{j;(~9J; j/żTڿ]Y={/Lia.rJJJx[f駟ru׵_a 5u|oYn9|0vHIIgAԘZΌ6i0JJJL #Ґ| v+//ko؊߹3333illR ((( %%< \s cҤIl3n9լYYŒkYWE]tG|ҝIcڶNkXSpNZ9@]]-cƌaɒ׿~x<}]>l\3DV\wn}oF4t?Z,RRRX`ɬY۷)]41lb#܂Hun֦umZͨێ=jB=ˍ|cXo=ގDNĿo>te ?cǎxb</_~Ǐ?a}t۴0ydFx K,Ga%55J1 ƦS揁7o6-Fr3Qp (Fp硭6"*34UhYT?H077].~J2v8۽ADDDDDDԼ^/˗CAAB||<>ש1@h6/}>qk?^6#|p"YYd)oFی??⏋رc;$Zpvx"~Z\-mDh3DՍzBiL#2YԆt$G6ȑ,7/ IDAT塟z@kmƀ v~ğm(((h}\DDDDDD:RYYɦ͛(,,$.شiiҭݦ1*Od+ iSWԾN,nU>. ~4ϻ#_+~ůW_+~~oڈ'++89 ܂ffHsmT &~9 -H4u}0fTPf"3T beQAnnIII$&&$~ڏ?\oЦLTLJI7[L nD6?\ȶFW_+~ůW_MذaC;ء O`a$N3z F$dDpWW_+~ůW_+~v7MKxiy`uyp LC&> jݼ~6';6'W_+~ůW_+^Bs294JG YSv]˖DDDDD4ibX %"sWDDDDa`Z,JE$ADDDDKl6`HY %""""r01YԂ-"]l."5E\DDDD.$LD9 9.lh32LDDDD.$Aξ.ddⰁWϑ#]?9E\DDDD.$]E_KC.̝3RDDD.x]ւ=nIW5QZc5NBA.9oq:':ҲfO1;0[}LesuwQ:wL=Bre'~'*;Y=nZĖO~Ů.;؉1I >0YZxg[Ӯ֚8Ic |t vܥugGh;auٱ3ŞwLϖOdWގB|?KH`6i9VAVf Ui>ɚ_|@f~ fC?sе ^hr°U/npo)P@Jb(]B5e7V Lji}rq>.浊B}%9L[g^LqÆy%EaNĝ6fBf\Զ:vnol f֍JIFm6z/C_͑q6.rZV緞8?Ի"uG7So@h.+*"| M0 p=0N`doNqF2i즛%D 4am&CWkw Gf5 vgWs]X"UQ2z4,FŒ3y7ғoyޕx\ {w{8sӧ &+[*& &p奣Ş))8abjq>\L`#H5łwShq7bX(3P{d-{kZ^0"qoL0Zv-d+$ꗀߌL"1}scuƱ.; pq x:>L.*{%#h)agRG3[  4 αD8rQp)ɛKZ#Z,>DyХʫԷ۽݆ @"}ry71x`= C]E `-igaTטA& %x|tPAzK]E}8z%bWOFtZ\rHfnwcnw=\ îco|m&F*>> }2薝 u/m 4zCOC#jH.Nnr&`_t7@:@{㦺KBAMeӐBv7;5JĞZ|4RU%/w2zgC x>l){2ΰ>7UV1[CmeN=IKaXsߟLrO!  [7|@ -T#.AVnbkkawBԜx-ώ"""K몪ҩ.n3(2cKQgB<&\:Ztq X|oYUVFs 8?0XUw΍lmw3wZmwhE|8_ %ׇ=]|_euۙ]|EdQv{һ`n ns)]9R`a'뀂`2]zc,_Pn;^992@x|Н=D~z^˷8|q]2ș5T<6e7} g֑G^[\Dd0֐w:?gvjK*fѧ0z&ּ~@5O{Kaͺ{?W8pg=Rgyhp}czIoO~]{=ƍڼ^2tqK!Ƶ,.Ϸ}9d`%_Rʣ]G~EIcB4~̶rR&ѧp*]wKӿ.|kJ Up rB܍ﲡl#ov؀W=*ǏexV֐w,a:ϥwJ^)y4cL+CW񑙇ݚA{?fHI`ۡ4ƽXl?#g -l쁤v{|s_w56.>-kD.r;w'zYˍ\^ݟ K}k.ͣx CK[D=;_4Л_-'Ͽ^ോ`uXp$'rqwH `p]6'ܬ`KYB`'BkQ`@KOz' %qZlpFb}cߠ8?#`Ѓ{lۿc'<4]cT[ ,6`e{24iXQ澖>)l9~򀃬ߺIf={ l9~_-m7М$ٳlJu l=CJ}OF5+[=P[ &LaX}ű|ch_ߍʝuKFLN z]-ZGڷE|zge"'ÛJsIKo'ѲgKO'# G, eg篰qN'gO)6F\:P8l]5WQ-^&BpF؍Ű<#??u6#-_3[gjt8=hS϶CUa?FǁQf`\OXvYkNXwp"fk |yRIV ) i7IOvX.a>C9kD -#ԼZ?;.Z%]sð`1x,y^{Ҧ~3D֝n|8Jeg\ Ǿ<0?3uM&3tgM4\>K%pqU;Zk(=ZOa^/z$-+boEerz7x)xMՂM1`WRՂ#%H&ማڬxL|lV8x V/m[{r>3 (#1)YqV&mrezzǿzzt._iʇG:= 6`מ_˸!!-76<7yi;^<ԤkPO5tK.l.gY}d 6;C92j~{ٵ kBqgљ kg೭p(ul%>{'BZ|?ft:±Kp$IpK 3@KPY7`?Q$Rȶ8sg :<8{ॹяikm$Ňq2>>ڎȗ-4MWnz _cXj.+ٰ1}WUHB1gPt04rX&ϣB+VFN;vZ嬡rmU2p iͧh1l`9 %H,NwbFOc0TxBS4qr=EӰ'a+{C-Z9?gz'L >5#eH2ʫ-\S7 [ӸvhwhZ>w*Cx$xo˟G10c͌}3{X\e<+\OA7Py8}[8PL_r#18x:%d74hjnhb*S#o]xNX쪨cB~7bWY3KhsCg1|%a50^2oN;1g[c28{"=M`pn~fz̟P9?"uM\3nz ܟ4 .UWѭ`4E)xڃԿ?uk&U1n2~ʶߡ'|kY!9Hg[c<+hU # ^ۼCjd8װH3433l}pn搌^7? h.l\}fwdG4Ev`UԜr{Նt]I˜U"mu/ٻ>!;BBf tDţ> Msv죲MvCq9׀^XvRFy?% G󍯏\Oȿcą%XzkY-^˔kK+^}ݘ+Wp5cŦ*nS϶m/R0fF^ E\S7֞^" XEj6N1xj AaXGll+;NN;:FZ,9_EsXZ8VutXXkgj9DU1 sFi鼹lAXGm)iEe75+Ye*,ޮWf ޯ͵+Yc )_(( K?=;sg+*_UinNk ٱu|^O[kG3tLjZV#"""rv[X'مQYc. )). tOW7;C8]T`M yrt#_7g`y׾10"8я|^|e߉퓯:ayE~}=GI̸}*^Gȹ٣ 4/-ZW]z/ff%R,V =9 ԵF6'fhXXp!D=4yK&w9..%ZδCYt:wuA|qYOܟ]Ovi$⡮ DDDD]2vX?bdty,ǒa=k?{2od%sW@^޺{ª*,}FhgL;q)8ys{s_Gl9aG.}$c4;#_?m}WgqrguKvs~h9tGkɧlܚL௢=gZzX]箮3:_KCܸ?#5'c6˝FDDD$ԂKZḤ{J7x|:P_qytmȑ=ky9r!Ǥ|v?{O1zL9Gj\鹆O)WFܦgZ1K v:I֔Pt>_/3$""""rv5W:&RBr%LDN,ODDDDu; I n׳nF'ȅD 6g=]H|[DDDD.$E`\HB-_ g"rt8?D]Ek\H] %"{VC \8LE\Dȅ45t r&""""M%"]F`ȅD t%""""r! g"e4ș\HLLlG`|ibN IDATyjp[DDDDDD XV0^i&iDDDDDDD;aS`940"""""""1[DDDDDD$`ĀlP-""""""JEDDDDDDb@ H (%"""""""1[DDDDDD$`ĀlP-""""""JEDDDDDDb@ H ([WThll+9#`>6iF*x<=zTXH.""""""g_ u$4'صő:EDDDDDDb KFFF4M3`jEDDDDDDb"!!zȹfb^2aP-""""""JEDDDDDDb@ H (%"""""""1[DDDDDD$lg;<SMBnLj>x-ݴ/}S ׉ǚ0߷i4}Gwε`j5n=ϵF>7Ƿ6 J\v-Ius؛q}y we|:T/⁥\tjS?M6uq|R o{{evz~[ߋ$Ra˚_I{~9DDDDDD|su=#zvϕe'nRߡ>̻bKϦϿo3wTi9X׺Z;ƎWJ/lMuA o;F @-~y"ogo`ʉL끫oln;;d29Amdɏ^ohͮmYo~ 4)Gֵ7h?Zn&x^s;e>eKXLwԚ;߁e 22&[lS#{QvhM;~X49``2XUY|;s2]#PV\S(zΡp;|ݮ4SI MݝcO|Fx?ǭ;_cY ('""""""s;嶸33h0o,xO]#GVo<=< $0}VDۺ^z֓3k;.}bѫײ(Tzd"f> {f>?g_NDDDDDDOF 0c9ryy9ݻw?{:i$$$`v8"""""_ %?ÁŢ Ά@ j 8l#""""P-p<͆ag; bp\PԼ',0  %"""""""1[DDDDDD$` W~?.uafc[ӯ_|5%o^PK@ eksLO.oe/pBeknOl` yOO}*ױwzUmz$Tkv$/׸GV) KY|ߝ㫬۱w^#?>v։D(O>c:8uIf'0A\vt_ .~z<6;8«śy_vۿY'"""""M t}CwSq{`3zhF7ְno[ OgM`g/7 g㣪f$@X"EEe bE(.TCb5ڂ >RmPXA"HE@$df dB&5/&s=;092klϮ9#qѵ{W\q5&mhƍ7v\킝oke""""""Rޢ=dl!+{ 3gL?ٙ;egf{wv[(kfh*>oF<^dC~i=;xx;{7E7\|ۯ}eNcEDDDDgș.p/J*?x9\=>R:ҟ¶kL״~\ ;R0 ֯?# *..{y+ %]Q1i4-5L]⎺7Pkx8i(X%es^DDDDD| rYM wPOBW|{,!ʍ{O.<(YtWDDDDDPgf.mN4@cT8A {wmNǙ }۟BOʼnVb `J/.6F- -@ `gNOfL{Umg~iInx\0`(<=a3X9vfe?TѬO^~ yVW˸~~he""""""a,~߰X,5gڴicZ{R*.`b0 }dYtVfф 9v F4J(RT+|>_}z뮈cvv5 C3R}a2X6yhdDDDDDDD\BɎLtq(`@[DDDDDD """""""&Pn4x>i-1CR\\\]iͥCuF_%1'))-[}v?^ihӦ IIIuF[bR&MhҤI]wCDDDDD-1 EDDDDDDL-""""""bl(`@[DDDDDD """""""&P1 EDDDDDDL-""""""bl(`@[DDDDDD """""""&P1; R[<;v`ΝuѮ];:vݮ>DDDD"Ĥ͛7{ni׮8 b`iKp_Zi}o6NNv^o)))vs1HMM]v''X-1񐗗Gq8lP@r"RU״~uhMF۟j%..χfc֭iF3""""atĜ]vb /kV??h wNb@nni鳈H}94j(jw3h?h:X}Fnn.MDDD> Ĥrεi΄Yx3f%&_dg÷4-1-BQ"rv=cE|E0JoE|E^\9C^xe5GjD{k^ya1OC@Ɂyn?n*}?}c A}֭[ٸqc2`TLK롟3͸.f\פѭ1'3DF]~K9fR!2D?ٯI*޽9NGN{V+a.c?ys %\%= x&6g)[ד5s6~_U2W~U"UfM֩~0²a,^BRSSq\e~} """r&Qwt<&|^ͤ:[拝֭)a ܃Dè Ras~1zS(jc6:_mL=fرG1TFw=컭:okIys(\'.Ɍq88Gt~ʍ?8p@Xѿ ǮL* Ѷ?E`_|9v`Ŋr-e[V|>fEDDDPZ_p0>Nj{'?_C'2yzm.wwkof2Z[Ü?'3;ưss<׃`Ɍ }]?NgbTz vz1qܜ'߾_#/ @j~(zv'YosS& VW A o^ saw ؛c e$q OHYKi{ e1sBv>>ɔ˟Y4M^#gw k:ʹL{8I,dwtF?x7vgXM,C{^_R@,.܋W;o/_|wp~6eҖ\ZAKn~DĿs쥠T>{L|f1\GsKz'r?[Ŀel}g-<ȃҧ%[`ANhTڿX*UwTƿn:RRRܹsnݺPU} """i>Pb_ٌfs7N r>~9cNkW2a_ck?є[{xTYˆK/=0uļW 1K- P;û7!bƼn'T[VQ0\gmzo%塉brrw)3 ֻxDթw?2osےzR{$ kab-?,7GWGEˁ3[{_W< 8XXoЖN}n@Ϟ< Rq4ɠA\u$ci>yGm?.bȐ! 2+ADDDD,zF~ k6^Щ) 7lL66:e\t)x:^4-{`̀9xyα1h?9df:?):oa0 ~?>9ȞZ0,[ae P=9'w$V\aMGyӭҿbV{{tlZlp?KG=60&Z҃B {. Kop^az$5mm]B v̈́ ~?~(G{Z]ګKk~]?z֫~]LDDD T{JCrD*ƏRq~KM9 ~֚;puXZwǼK>z7[p{G{7e~>:NI˟a=e{c}g-[j mlf #ZiX,>V9N xкcM,/wvi@ kj(bXX ,DқUVM(K`t %X031eW1wo3 8t#ž;(9(;fCرoa雒E}صk[l Sml4]o?%;4=IgAh3?̝FO@^C't/Y`FGfHſK<<.ꧏS`2te*<ƄCC}1e=fZQ-Bᷠ 摛KKhv't>~})}i_;͆3 Y7pٰZi3x@ ~pםO;a9,Ovt P2gVK~9A:;m:"uƟ(Kr FyOHL&\O(<8=i?(̥ܒ3Yݚ.+v{5\mXhժ `~7Ҿ}{Щ mt.HyoFxϞ=iƴ߅.{<.-TW}5i'b^].*Znv[r%Z">>N||< 823 E=> F qz9~<0Τx{qVP\47CP.Ȳ_ӹ{^OJ }-4F ?ݞq׉2_zs(Vfp{߲e ;w-oSO=Eaa!O=.W`III EEEz),,d\s5u2Sevv5 C3 -f9zVӉ,W/i _, D;-eBЉ)vШ#jee<2@#.bcRf8 FiLEv387vF#(b}ӯ:h36 IDATq˽#ۻ;1 r}""""]YkΙ482F~Ⱥ]dls.wú7.^p&ϯL]B {ͼvx#~·e0ߕȾYVvZEDDD,lIY+SuP\5c^u՝X,8=O+4~ʪ3 ͆ H —ohԤ~M?kJfyrA8PDg3Ϲ5ޟƯf>*l%oۍf+uD5Y[HeU+٩,!#?p _Gv{^N:ԘDDDDbĜs9kҤIcq2KkrQK55^/|>\xᅧX-1tұcGmF۶meFjmUT \E5e}JII ǎct]~ [dy^rrr˫뮈ČRSSEDD3;l]v]ҵk׺4"S(`@[DDDDDD """""""&P1 EDDDDDDL-""""""bl(`@[DDDDDD """""""&P1 EDDDDDDL-""""""bl"cvY]ڵcǎCDDD$!ILڼy3w&99vڑ0 , aeX7{fϼ䐚nVn7ǎ#++TڵkwR}U s<yyy4oÁf $*2 U~MWƯפnYV|l6nJ6m4-"""F`Kٵk X,-\Ⱥfh3Spޯ/- 枖>zKF Zȩ/}7_j ݷl撚jjDDDD3`KL )\[L9Si[bRm/Nv;|[)AhMd~(9uzMTa/weYL˰ac쫬=zZvma-*k~>C_ Ut[m쳾bM xl>~3PX+F!֭lܸ1jfEDDD*p/YW*9qgU4uSjM̜j}9/^ŋ)(((WL0@DDDL`{,}w\f' H^\%La~~cjǑ +ݦ}b#JuToU>Uʏ9* 9CmZ+9c~CRxx/UŬSݟ[_|9vX\+HY 6`xf]+cR[ϳcHKK#-m,o U̓SYҲ42fsO.lȞ>aSWּEFZaZ%%թ6e˽egڃ{/dlZ/eU,|WL]6㥱xxKة u^1\fM9{NBx @'nz;t#s ,j%Дځ*r2V3,U<ݪڿ;?t}QoV"///FdEDDDuNwOIXj qw8%CDZ$,dzFK7rܕy y'k4cnXrbi>q,bċ?l< +!cN[Ē٤eg op"뺈Y0n:-'cdzJ .Nf#d[-:HVNsfnaL͛ktn*PyɆZzrKE+cgd%zKi~` 6rZfHOw]* i֭#%%Ν;n֭ aZ1 CZDDD *2y c>^'/-Hg򫏓d3yï|/c.g'[Ye 2ɤ^3YiwwkցtMEɰ-"MKZiu70O⎮.zg& NϦPx025sMf]/I3֯79{|,ܦW-K<KK\ |㹂vX^C aȐ!DDDD$qѣ3Op8w#&cxo3rNѵαz21``vr^x)(Ա5N6\Ca##c4HiOѩ}9̟XrSUcɔA{SK2t6;B?9;\ `q]+>FFU<B?(0goöw?^67ONwryi+YwJkZ>I_f,ԖlF0kL{9{=wˁ'6*䆌2' 8>z7sR{e02Ź:\YqYN|9{_usx:~$@~̚X}žxJ'j/Z6Ѣ( 9&w=F4vcbLMsO68wx0\J㥌Z[U}DmƭҦ];RSѦE -j̹TdWN}O>ڵ-[n})v&""""e5lW7i'3:kNAn ޙ28}4eO L_2rE;ԍ`Pxz2a v\Jj^o9+?J1a#,gSqN>25G2rF>8﹂}̼dZs͔yr'k_ĸbƒ1؀8;ٟVT3tꂳᷠM9x^3|~-7jtlqR2XoCoBV0`K.o}k*x_DDDDʲ~gڴicZ{hn|崕9|E`,ve3 }>Y,m/tr9<^] α>}ZXlvrPǷ.gZCzݸ[cTXW\IVnOBB̸+;ֶ-[ܹshy{dz) yꩧpPTTDaa!^B5\S'9UfgW0 v7v_,zY.ND6.׉`ls:q9U_}zlyy-PT\*m(ZOG_5X(* s7Ne5?=y\ޝwމa$%%ss)ATg: -v3Բ!9Mo&MlKE eu)2PG~🃳z\m,ڂh_jk׮ .^DDDDRnpZ2[Ti9lWչjte'X6YThʪ3 ͆ H XUo URԯ~MiuQzx_"|P.'"""R "ϟfskv{?_W}U """")`Ki߾=nVj%đ""ۯjDOeV߰S?:Sy HmQs9vZ4iz,:Nf qM.JUSa __롢c>|.SꇈHQt:ر#۶mm۶2[#UĶUUjd"]d쏿UԾjcǎ{n:wݮBDDDDY~al_-r^/999uWDbFJJ """R] .N׮]ڵk]wEDDDDD} EDDDDDDL-""""""bl(`@[DDDDDD """""""&P1 EDDDDDDL-""""""bl(`@[DDDDDD """""""&P1 ={jY3V&MF"""""""7M-1 EDDDDDDL-""""""bl(`@[DDDDDD """""""&P1 EDDDDDDL-""""""bl(`@[DDDDDD """""""&uDju#k*ߺNӽ]o;~τax< x<$!!Ӊb 38ٳ&M֞HMyJ4\I4v5!.;>}Ͳ_tė)7 "csbq\ """"1$??6mژ֞abϬ|aPC?P+n;[ Ͱ%xf<6/pi>l6aqok )) ׋fS )`KL1 y͓wtw]w*s>Z6jk1 L.((e˖19x """"R!l)ap(% iѯv*EeaxIHHnL[bx _]w#&~PaF m""""Rs sқC;WDDDDjN[blV&}CSrMjަQ䨁|Xm~,jS 5 g """"Rbș8apӀE}"nJ6N(&<1IM58;q^t>/mJ ,ĵH`$(#~+9X1yX4^X r~w(&)=z56/ǩd HfT77+`HU4-1F3ޮ   +s; E3Ȟ~/aNjGz;܈5OD+yy~>oxye8Ul~e]<;[<glxpu3xTsr?yV |쉯qe#^'5{:՜~kN+ËM¸?kX(2 .ebz:餧d{8/,ZҲt&n7n\_CeYICDDDD* sjw=\_|Wf;0]߆f\z6L/+_A}sN\o700vH.v~XO,~<W ;ⲟMr8}?${V'r8Uݻ`oDӳl[{w%y}\Iv~G<뫰x;,NL?z!O{x=Gϗ˘9(^~~^e8w?Ʋs3`S?)ُ0o_=ėʴ[2_IC![DDDD-1fδ[},۾ĝ{'w&An۸.mҭ}A5o%ahѨ)ݯQ۟²I`K̩jisECxm<*9_^r <hӷݹq?IgaxS^{F1|ן>zCQ{H=x/[8ЎV\tWVD/X +)Ñ" e/Oe_=icx0 H@^|@۝v~?y2felcW| """"Rl95Ҿ|8 l\t==+Z ՗VFa~*i/)9oyi]v} OE18]I]%{>G_r@@SӖ/?0a%g\>K|z} 璳[aXd\^ޣ#pfYb00?Y})۬px """"R-Ss^Ǜd2>"l I~w9}[<#orXwWUy__}|M3tOe>:pU+4_@9[ӿ1{fkr"o U[Z^ʴ_?bֲ}0mcٳW04V S\]߰ c _'Bux?5?;|m/WBx_v6,1x;LXq1f%T{ ,?2hEѯOb݋>^]6%й~E%@1X}Z_`ZBxK),f6kv$`ܛ-uacpx"~V"k5OS6 {'=vn>l$6i.B\b;[E/tp8rBH-~ <^;x^ npX)(݉^oxӉ *#%%%tDDDD~ϧM6gf%"gUHNjO IDATw|_p)`iboU~Tg^/^ĻO 1R\lVv~)^x.))k`0%N-ae}/,,q TA[bYQ@޿pv6YUywr_w&n9~ڬj_ۆHGk7rƺ:cQ(`K1s=/?o|yTѱT)K[b[Y" xEDDD%(`K;WDDDDjN[bNƸ9^݈unv{ u9)`K̹,Oз):p8S_II u 9{%~En>|G&Z1$k#>W 5~֭[l4k Yx֭v=tDDDD~Vb~"Os?Y|kc]w޹%?O3j1.))a޽9rcǎqkGFHNNu82ADDDD7lj@6bfE WvDDDDųs,K( zM%tVPqeADDDD$$ڧc,""""R#""""""bl(`@[DDDDDD """""""&P1 EDDDDDDL-""""""bl(`@[DDDDDD """"""Xa[t:f7)""""""b*azoX,z֞gV*#GPRR7{"""""""5fZq8$''Lih EDDDDDDD̠-""""""bl(`@[DDDDDD """""""&P1 EDDDDDDL-""""""bl(`@[DDDDDD """""""&P1 EDDDDDDL`F="v=_X5i7}7,i zl; N["%2m9}.o~]]wCDDbO}z'=ouC<[M&ֶa/[bk9c8$GVpo6}vV1EJyGMo}̛OcG31ӚP+ 3=` /6K\;MDDDDDD䌥1 EDDDDDDL-""""""bl(`@ߧ%"""aժgXj'"""uf'~Aצ}n9xk)Kw-gz׆o?zo >ť5|kqq'vD.T\a}ћ.cŲ|6~rh޶ȕ]qSrR_IԿ^"R1Yt-ŭ.pFו9`tkx'\Ǿh8:snX : E?nb9߂O(i33́^tsu9uE?m <[R:{2ϿBOz~IFK^,""{&]=/ɜO[tx:>;ݪfkP_D)X n `*{<}2S}{fΟ5cQ7`>QY276x<a`TrG֭FUv*~FL´)x ''7c""r8p=|§([ZbpO57ԇʷ{Uxў_ Wy}"tS8{̛=?piǻ$9[ކ䌸̑#tzeL;4;%Ic3xշxu@dmSK`٦{d֤ҺixvQ7nH7ט19㮉)o ImG.SclF WyG@7Yr _E]EưZ[W7fMblƬOf,Ɩ6l,/=1c2,Vf 7 cXl,2NbU=_82&ed0v7SYxȚ5c3X}yY{5dt]IMM[?i?MeSROZކn/rڋt乷nfꥎ2r۸@*O[ffFoƿ2 ggAvJ'=r1r Ћ^deg1y~ƨƓ 6-9}<kjo1ɍ']13l*\,9vR1芫nxkq36\Zղ/%Řᷝ[!+'B=m9Yy!?m5)̜ 9:=4SlKk_g\w$z F˝3$Pxy+f1~=_KK6ŰO08chrr#~Y|*|~:@sx=?Z+O%}~p¿g[T0bզ҆nG&wq5IB,Q\L m4Wlc͌f|~˘ag] s5kֈ0 Q s:9?ΩNu)~_>z߈ MԂ Z4z]XC+yhĖM=]'3ǏgN "ɥ@l#A!c՟GH^s(?^jiQ:pfq5n 9Tȷ(Ȼ+NYHO4kaPqWA:3/|[!~nr~X ٠?,Ȼ#PD μ-ѿ-YoW+cJ;Jޡ4)`,@]=Qܖ? (-iIܾ苯0%dF'b.RƏO`Q}8} QΎ*[+vQv{@7-@x~=x?*.@솙 P69 *ip2#@]UUVU&BWDzR"w͘(\MKBk / ʆ7.2#zfor#9Q} aEj듫J烁# Z-t\C|iPSIzImqe+3 DDd4;% %I'w,Bڐu3l9p%IH_ı,3\?|&#Ⱦ>$," )s(7v*sd% [6/d=С= [ȼ {5rC4t$1R[8ssC8sEPTDVy>[ 34|>B*A Y;gZe7 d喞hwU~~aXx NSfШwgO&fuHB6F^U|ЯuRXDƟ;Cza]_{s`N//D|M$dؿYԍ4Pϫ1>/`]Dq&E ^"toq<RX{4tS,( NE&ps@Qa+X :H؆(p?YqO[OCzhШ8C8󡲗Yد{^B!2;z#k <lV+L KD0tt4{~QDAac2#gA4l-^ڭń`7[6}T*KZҙF=Bjb\iAn`vd,o¾կоjy&ut zZW.w$'輨՛,̶xc"#W|<>RjB_op~ 2=_a C8m|T7/4~]bvX;l "q_5Z&[#C#I; 71կ=+OR(;~DZj~v|`5Bp9L )jd]ƮyR;QC[!)!9}+cY.]MUmlC&ggqo۪ B!^(iڛ&cI#l!BX;hO6(B!B!2B!B!LB!Bj l!B![!B!2B!B!LB!Bj`q]muf[?V[ZB!B!ăҽ^jKKբ A$+݊BQ-;'}$V3ݫ߹[՞,B!B!LB!Bj l!B![!B!2B!B!LB!Bj l!B![!B!.B!RԜ=Gbe4.RٜNtQB!l!Be%_3 5]FSw-j8VÈ˰O ߰_O?`E*5E k-u}/kBWLJ|r s}~N1ѫPR3{8,,*s&z.y0N=6+)SI88wfhbXCk$N^6>ؽ&k FjK.L̲L뇵15mͶ_q\ۭ{NB Pkx{m g n^a;9x嚾 TO/ab1 ;8s:acWӷh>m ys$<H>TIyh\6m7 {Ι3\afcW_})mɿo{*ˆ/e/_NsW* s>N巛Oھnv[LŔZ|twnHNF?D칆Z0ki:|ʜ9#aѴ/h]nZ4{!6L.& ~sP`UT7k{k5daۨu+۪T]d)ӪE=݉VMڅD2CfJ\1![zԫW[벯)_[ [N-sӗmlĨl;LUSTw 6I7Ǐރ}ӻt_,~] keKvw-㮆& KwX*a.U8KSA++ᝰQthSqvQXTmlqL/Fp:]^İD\LeR "+ǔɟq27#("N^dA'nd}Pt%;&5BVT>ui k4~6ҡKAthXyU-{*v A%!CHxslۛ|&B}c)[w3+)MkXqy.[&K9>c? mH^"mYƣ'ԗ&ױ}q|Wo} ģnMq+QT7#;vg*bwK MǍ)nd_IĢl[[ֵ[ˍ7qǏܦTiReێo8i yg2p59DoX} Yu$lJRRU|U/vMt:0sg5%y+5S=ESmX܁K_bK.]v\wWԶWl*ĠX܆d~ޛW3qi.lC߅u`Z imY]KfUV a~,"$1S'ڵ <$*^۾*>)ePP#3/ f,n|xޖ'3mt}ʹk@C^鮛L[5GHJя+&ƙ4~z0nmU|p-L'x'`N2/">⑧ƍHDPҴs k]:!(lĜIUe_.gz.$tl3}j|v6ġHة+4k6$5&YzG>a[Z666hӢH} Y1ϕ+W~ݟ0gM3yeav,Lwoenz#|?LZ d>?N>̝!{K770vpĬ#ɉ c [HܱϏe^^hqy1`5,Ok/BΫP bVH 37,d&4R|[(L?K^-VznXzR`!ѡŧ0^'{1ȣV jͥEr\K?K5y7ϧ/6~"sn5?a(pLOx`OfT}׎|lP2C/G~<73Ռ 8[t~~'.%w 5оik:vm|lyv'0p8T-bo鸬m K"|KC IDATEw5 omsӝy#Y*4l >nZs1g78|gmMUSnx9ArgiJQ9 [U4mDC= @6YŸ]k5?X1k" [?\uKīj-Sz]ibWC3f :̅qtl?!-өx/*G:XXXsۛ |t[nS T\c͙h\~kq 93vs>P~V 4#^@'b1JNJ2kvAQۙ=|oemz qVwv47eH`2n˫oWfSAJC(p4^;l؈hMA>НY_=}3'+iC$U?L8\ZBQ~O~&2!{ j=i&3_ڭE?}G"t(ܔ@kw>& FBGfn۝t`z3ؽ]MUSC4ee=>3*l6uB363'd+p ӲEIT\Uxy yЌ/+ ki[͔epBA_]!9u+=XӺBO: ġ?qrnȁˍpQ4D8gulM;oCϼl}s˭tMm4"99t}|HoO'4jg~>O}3&㝼iK_Xcf)C&XE:Y(iȨJt}Ϝ^.0Fght0^[^fw朒x=1t~x3_)26x^N6N||٦M<1W3c)_z_mj:nj,le2M!gfmıl_AmZ;(3B~eӫuM-ٳE%'a^;wtZPPdQp$Vm#Vrqrijtů(zF#e9K7^_''"p- y}Go;R2mmq\i'W+4t_߭$t |6ڻڂڦsDӟw'1p?7[`dj^YE 5Y,2׷BI׀ʼK`Fm` ͵_~iϊl=Iuu!Pb9kzg3?~W9xA=c@wf0 Z6󺯶?5VQcYd-Zh~T>kÉYX=e!L tR:+'7VQFRKc4ӟmwV[?$+`jN$Vy6LnO:;9ޙ;7ۀ2ϡGE(dǩq<jN绵ikxv[3Q|9˩;i uqp_&>*Gbfwذg!Q;HɎ˯Ft5ϻS<26]W+..6U_m?Ѷ{i\\o f>>,C#YU"yS_2SjO5rVr]ZS^fMTtyˇ~X^Aѧ،1kik 4b+̈Z뫗ĝ [f0G`l.fx`:^fk ,ϳ!+FTjtjPؘ/\a+*Ktܶ~3!FCńvrH;XO~ LݳW~`ѵW6e=|x2m`JDt[m~?r.?h+f8s4f}֯-{1%~vOonlYf6B<,SZV%ngAs{4i X!b-_K :~0sgLƭus5,)LO|AK#.7o9|'h ΞA~[МSȫɢ c;u2\%k_*֖X7ɗkh^ ΗScyiu-M΅0j'ݻweoHzM/kv\(*-(|kl,HFѠ$i,o [ߊʔ>܋;6&< x\~7ܭ{c,,,(,u! :uI;s**u2u]Lv:XHK;*컙!|yK4*! 2i+ *x;/ -u0d{CۗQUùde2 n^Y۪\ǫRn y;87gm_8U )-C<[H^-%ǵ">/W8UߴZ13f(ckG"uKĥMU۽*M[;k9w+WZÿm-3Zbi]TZck]a˕}B [yo,p4Dk;TN4[-oUTR'sawpe±v5}wO-!uVV 5՞nvFZ>g5X > [;s6U a*|K]Ynћ/&t EC,Wo# oL'QOn./B!['_sIqȝGۻӮs.cY!}+ ᕿR<| ugp[Gd&s2~䊏Bt}d-?U9sGaH'ɓ#B!B!!l!B![!B!2B!B!LB!Bj l!B![!B!2B!B!ݻwoXmi !B!Jz--VR3P-o(/ZwOIfHWqsX !B!@&B!B!D5 B!BQ d-B!BT` !B!@&B!B!D5 B!BQ d-B!BTEM@!~T*bcc@XYY鉯oME!D%B!8sc;(,,̙3tQjV~ˆ˰/޽[OH<SJFDinaaqiin3a8MOQi>Ɋ?RӰV(jv_ij5w/ťC;q%Dm~:_Rn`Бa>Y2V61Th;3ԳyiooGiul?ISwo=g禮bX0t2FʦN!?aȏ`m-үیԵE%~w C'coTy8|uEE۪hMf+ٺ~0gz6 .ӢQz<Զ?lc"^2^owm5;|x1F 꽌[2@'Newl|k< y룊cuo>}T1MӾZYy cu崃tYӵdq1ZGQ nY=3toc񪲬^>g4F'ga^khMZ[ gq|lrBѱf:m59V?ysiviѲm9zIcӐVrXbN[Wr{*>=CoxtY|i9xiTMq WeS]: l;hu;$l[وWWn&.5 ?ȘZL.Oo;D v'xuhGeXWHp )S6_! _++g6e/sYilUKz aAM.||| b'PE>DLS~$>JRRU|%9G+ݧJ"$(6.)cHW8 rSV캘| j;1kСD)F-uB.l[vP$_;jX5`OX.SLjmqIa-Q٧\'~ 7 Ej -|fBZ|Bō麴 ~?_T)|6b?X~mp:ƕם1%˹m@VAْlj'{EBaSNżK kS֧6>Q" <`8|kS^rXUiLaj&\ԏ@i,~l+~zخ$SfӬ(ģ=Rt's/r.myyx{ s&_)%;/W4]['*q73Q+4ZWn#ydɧp_f6ttQo𬋜hu~8*+\ᗙB(8, jϪ5\Ksş BHhyK%P%'d|tr?Y%LυÿK,ID` mEv.$p2tmL ]O͸[v6|4Q<:V66 ~MH=dFvH43ye $p2wifo$dr ?1?H?M⣈Zޙykimug2=cq~M?E6exosh:ͣC>GS|z;W—1 P '4p ꄏox^UdBY Sպ{8\i~;YX5hԺŘow)}ɗXwh6_z›#pN1ąYpx:M<~+u̴E /Ԯ$3rluW$;q*xieU'>S<7LO+M˽2 qo>؁Dz3:TL;[&Ïhh>;L}(4P|M OqZq\a}X`<U)&(|#}H* `bh3/lo@~XشCM٠Ϣ0g{ $#|Az(2҉:'>\`_\^I\c6N09nWS}vOO;ۮ E,\oTYд%ABj.;d@ٱ"Ub螰ΏaM"xïn xVNO_@֏yFJhE:5s619 H xd?&x4!$짻{{k֑HBFٱPŪqkb 45S8UPe]/s:/ںѿ,%?ݶ+^R8K;ٗW0'#5#jU߃};s.8Beejz|i180u|mI-z-qwL9V z/@dvwn$ԗ o"1ii(65*}ǙC$һ=G rB}&Y;ao7FYYN0@{#jO'mto}Rxy-ftơosXd_殫?X)flhRX5+"ceˣy.#!e6n! AN|"cX =QIG~Bݶ7O7rJ_<`:(j;#Oֱk=y󆕄KFL-rE eF4,y4ֿCoG3flVx='#N¾kc^Ʉb%6?MdB 3i71 YN&@—M] nM8uLJ hݔY͙^0=]SU}$ԺݖNBa20ܙp.-Ώg=R(kB*3c;e|ViXm][DM5&5J$9?:Hn0cɩ"bf.*:^<֋qBY /㖍boXjƣR5ap vќ]P:9vtٸ.wyպ(E*\ 1=j7BJS\"S3pV锒}^[-Cizsqd[(ݜ]Gwh :$ڃo}oѼE af-ȜH2P^?vqoi_2)MB }|2e¾:0ء)Fe%m{6?t g=s"it ^ّ\iڏ6i ,3Vro/6զ,orfFa]{#i.t676M4F0{/oml괔Fc~9 .Fh78 }(ģ.md޼2;nOBChm?]ޫ.FB Zp6zI8E٢4 Oݩ s'O7Em4BҖg>% 0o G..0t,)}Kt`XA]@uI=d$%ҠO0GN'7+w}ԙchaS 0mW0u2?!#x/4*[msautS3Q\lhmp ">E{ H.JK x:E ?W#bt45 ߄ff1~og8yT nQVm=ἄs<HPnMߧ7 7p DnP|׹xN3l=@ Rr\wׯf@7cQx?ym*zohO/%S vAw{_A˼MN(,UZp춡6>9dajnWPvS|a60tGٛ̍ytpǪ[?fuL i:Q1j(ꍍtqз< #COKl=ujCNL.iY(F_0Ӌ %GM(SMk*}0!,Ј^HKjs X%Vm$Ov?E*iҋ[7Hϖx\%_ɊYs s7Yti=v1{>XXeY8{&,h9!gЫ ddPB4HO(ޢLͅm? <_{)Ml:X@Gj|N`dE6֏G34k 5˙\\ؗV%5U[~EJV)gv3t|ےTf=2I餧a@nOk2I7|ɥSl ; [|[{CG̈8?0/3Uyp ^B\fLaDwK8p}.qI>0=xg /\@e*~mgWqs8~ f\ڼH/'ŻLԩ|<jWAlǥm#-bmѵ8']}Sc.c~X@;x5=블+g"8\P0TIc/;WN8ۀk=1tSc:ޑE.lڠdq-u3VM"PW(A)Mޭ ̵INkq+{49_ܮcXu42Mif/xl›X>į {5a/fDۿ(W#,Z(x^gt'~YV\/ޭE"2r/Q\u3ugXiaMٹK>Ovz<>i2m] 'k<!wX)ݾ0GMMTLS 夷.=dެYobwz3c$t;3fC(~ `rn_` x#}?'$=f)=7oAs ӭ\P*yxLwd2=K**ԖP4Ծj-.jERK,tZ[Bdb~d; ɜ{=3sϽw5-]cxeEMRGN:1!2|z ^(}>l[=)2 EK\M.{-&c7+g+3҆8-7CkXں V1FoVCk|ެĐ\l'[^FfՆf0 d>L`]p=p>TM拾ݱ;{068k eլ5ԣ ;eI,d|ՍI#rф="͛:̻՟GfQe <`ܣ|sQ{'gxfhkzKߪ[|6>k.]>%&s]o{8C30Z>3PpXiXuWC8V͍.cl+k9p|־ɃO,ihc&!^giT݅7˽͑}!RZezxjf<颂:UryRwϦ12U*+1!S"ϙnPw48YnU;8nmCWy%NbLk^5uFd3}/T{hE0^*; /3w<H6ɇ*Sx^ @R ?ŝ;w̲CоFO]+|22Ae2H`ggy99dtXٕ{i+^g[j %Rud(ǿqwIjQcgY"tRتcUXK{v 9L'%K qRdK^v }??|MfTǪdrt5z)-6)Z{l ֚\NrʹMJih4.8bMch]|[ 6V<ۆeYbr+Pw ڵkMX;P,n&^hܸ'+6ge|LS*v8 ]Fo/n 4^8"%wy/OҼ|'wC?3ʉήK; FuM/["ֲtZ:ـvr'Pʗa+RWuRdS[V/#7/20>rt/ҞZJwþԇ6v^cYYY[ ; HD|P/`Wt*'o.gYwUVuU`גּf@f{݇FyE9&BanQWeN6u_&h<{[=VT[!^E^]&æI&:ux <==^Ⱥg&%7'G+vdgj4[9qR4 {-ЖГXx~*u*r"=*}(tt C!p3HghѢmB!ӡC)~k=|n>QRIB!B!]d-B!BT` !B!@&B!B!D B!BQd-B!BT` !B!@&B!B!Ds玾"~֞ kK!B!_YamzTZMk͊"d !'I[吼W"*MD\!B!2B!B!*LB!B l!B![!B!2B!B!*LB!B l!B!*;!B{?~!dj3+;VmKOFT١!(B!? Gydvr d<R١T ^_߽,#Ν;d~;͔%OFmix>MxflhJKeQm>ʔ>L3XYI>=*Mu U-i=NܺD* VGm̖Y܉ewXqֆbi"ߏPMOk8p4!έզ.&tzgo8]WJcQj= ; aWcIx -w=p*)\ǜ^{)S+6a3DҐ4W./+ωͲ\+s9׬QA?Jcd w59T*e+3~ l$2˕|BcY4V17΄L}e@=XTs K L.\a3q}_ѵIK8MY*72PTNK#+{%w7Z^*;j@ W-g:5cxKLﳤF^=RYSjYPIgk`~zn% uVr#l=i|{2d 8>-=G68cjÞݓXP~xrYx"$]|:sUI&lNjIOoY&~'_x\V{Q̵ܔLrjsubj"7L5w4%^ӑAM"rjbmQGku4-3~ÏQa*5P;5@.yVXYƯWZ:.8R\gM294?&;]80L Ukg}x2?|6΄dy.y/4SZf|?GbgyxFl@âϱvx Dj^lG{C[d2PU1VrOxzPGo?kgd+Rg R;ֽjӻ=lFmq{D<879WY=9DyuA2;՛gzD~ -nzo^8m&uTl +WB_636;ǕY=asٸ! ~"&o.r^)}x} 8~|ܗ-R/zZ3ٷkٚE#0hOphijT4SY6l2p"ׯE0;p9/tdqae:Zµ+۲'OI5V*4'^5ONR)PapZ( m Dx:@v^~?~Z+k)5. &ijq ]I%M4eJܶ3]t; [T-J ֩EVX|cR/s333{gBTg&uM:ͮ>łe?cRw)oފ &[_׎ȄTj >d^;C:9 ӱMP.@L_׹mς}<ؑ=goXye=:Qz-B7?҂vȘݱ1V!5=KZ&ghfMp7:;/^h|V1물ȜIr˧T ~55~-y@r/@C^xMfnGF_>khgl`l6LyPOq۵춛P\d^ylŭ nٌc 8:}^^80t̕ X<c(UUX1zRW,pb2a6/8aP,pBHFY2/UˬlȍV<A p2[ah'9rY <-غ:ҨSc~hnp8>d =5zs&v3 pZ0i, IDAT'yM3yy@*a|ث͜ x=B^R-C..ǧSCF4-1ztPcU@<?&(`Ö~}\ WJnY}DtcȧyLu /h^]*ѷ6p㽠)u}  [<hXx9YB@7rW`aHnqe}T6_u8zhsCy'Y>\F6=耴XTU![K: g0H:_7RiPޭ@BÑ<߼UKK'Dnp9@qƃKc8yS> yOi2}MD_N?p4?2ab>o҄ɾN(*&n3 &vΏCavU~|?貳1`KWI 5\`5ԒM`^&fO*xuoXøD4A9O UUH'0/2 >7Cvw:1whOs@b /561>SpFBj?|l@\K^;sv|Vd[_gbYMXu+u$m?u2Rl$-9MZ=c Na3vMuN^7_9Ld;7׶mfk8lUAނ_y}xVUזw)#r\8 7pJ] lM^OumhEn K웭`]3endoߒ7Ky#Ll w~̦-AdrKDGԪd/ a+ w[r?&X?= $m˶-6% % cqk`+7OmT5Tsl(ތJm:N^BOήlcWe #:Q7iaP>ʸUǗ|,ьدj>u`8Kӏƃҙx{RY4cQOcj4OMRIp% ~Ǟlh̔'G35dqiQ|mO`p==,a1QiW9p`:uË}sFg0.J_eV_. K껸y'xW3ܺţ$0'4(v/EG2f!~v3ϲwuMǔdfZ fkJJX?+/ĀAv%+;1hoêflvv- ȧAK#.>9d$E:uz1`5s7Z8&;W9U%߶3fq&2qXY/yv{p)3_cϑX5w5Lkgs 7ۺ/oJMcLď|UFy-.Oi_}WW4Q1u1*R ]?uOq+&0ۭC8W psƋΏ՛4B-yY#L%ʰIްp]C-bvEJAaWY R[å^5>"|d\q')#'ؐ$z. k<؟עtn׫Ĺ0,a;L%.&˦r }&1}KpHqI+j1~,VmEshGMI+:XOXzr  㬹GLǙu_OWޥ;ݻd6 ?-FL sὮ>i4u.gbn [mO6_89C͖7lc9uMX J{B\_4Q):cY<Ӛd|mUxT.>VîL:cYax,ܹg05(|m3f* K$#K%hٖykϭ-^gT[srj <7.L<쭈o RU f傥j*.ݔ%fQ]aWGuPve=o]E%5+TbZwS"FSe&66U*R^fd*o;m]°1%cU\[&WXV1ww\C)8~);^2]` UZ̹ĒT'<4D!>Ic5=s0qPrE2wou=ʳ3\Dcŝ\2umQ|'yqgoEоF kO?3["K[bkW8H,5jl5wnUl5y+G6ZL]sQVA'ֿ G*R]3sJ]8.]ĺZVF\^nr획r+ăg!SkbuYJS8wvo$x\lXGk~LCU ,gˉcXntJ-Le,4lExjP="J(znwٿuݧ.H_GuOyNҙs/a~U׃BT.ydwe@]!Tj =\(9efS/{vzcSBݰ+_~2* L DCOn$7B!*hߗ@痓!d تmՋ!Uv(òw/cZ `w׼O*1!`?r4I!F?;ώ0}R(z&}ģ{B!Bq[!B!2B!B!*LB!B l!B![!B!2B!B!*LB!B `q}E>Э=֖B!Bqѳ*"*2HrB!*|6gV9$~KąB!B l!B![!B!2B!B!*LB!B l!B![!B!2B!B!*B!W999DDDInnnesYYYѤI:tP١!0A` !˜:uꑘ\r)"##+;Fחw/ˈ趸sN?F3SiX^tOt;WM{i>*Ga 5wk< OXk;fjA4Qcq# OHٹ =l XRN|eޘ倦-xXW/CKz' bX uMƐ0X8`"Ľor5lD}+\71n(Rh[ڄ!6ERĆRCi,\h>d]RxTZFds1÷x:ԨfcYpgBo*ߔX~ /޹^oA*<#:44&MTvFN&"<"6z+oR:|s4Qx)Vv$vi}/LĎl͞cP"%9a#7ܞ+gGtx?m$h=~h xfM: mZ~ k؋ r_&JW=Iˆs͓A|'GKjec*cq'4:/zZcGcַ&c%0 wG3q ʹn43Qn+>yi۬£Z=WښaPWr03bzc=3OFi8G2fVMj-;v[~=)X"45^ԕS'._<+:8L} {+J ߮&* CZ1]OIYgLaףhYqt)vttЯ f7w!~at6ٗm9r]`1yook;ǭ tFx6S.Ix8X>6'An /yflpcXuz6T@Kn"!̏c˛ʽRݥTL)U#fX[E1d4G?AKȯ oC:1,I qe]V86GrLeMFTsKp+.w͟40Uu6tƝ{F鬂 WH%;E;^PD[_Vrt٠چSrO?k+zŝ`A84[ÌFMs%>Oϻ 5;Co]\鸤.{9CceǑo7}ZWZ9@V^eUV>ڽ|Vm3q3_q$P0.X,#eս×;?t2eƣҺ]w|A\KoVļOr!1aL,yWFnx(hSq7Ѫ4k3x"/4LRsoB٩MK䡡azNFu?,IF:GF5zgkdyY% G eUr'Z rRS)#`^j6Pc"AQ2a!dq^db"/pذo7󖩫ZPOy.$ :},"{LObqNZ@|]ᛘ4o1^7!SW&0?{Na/GbCV1p:z2Ǖ˻g++y2uM3}%ԁI63rN~A8o_O$$*m6+3!'ڃCJiCL؉gBЀ4 O6:ԛȦөolE]WZ{71hh]AD5};c\½\oIwYqt&SC $B%Qڄ$5]{|{KV\g+xsѻ7i_/D7t&cHN?jk$X| 8nyl[g/1&:Z1qU[mrcl7ASyb>սA qļ#^el<`WcN " v&L>YΙjMV0}- NnЁ]H8~kM^YcEAftA;/>~#vv`< qa 7 'j7OnCqodӈZќTг.\NɚkҀ3<Ѹ>qїҼ62/kZ=fCvkG~bp bokmF烉=C(/;ܫ[p[wjN2q A3v$zc'r/gҼN_gO,D:}1E wZ݇N%oG<: b:vÓ%ehZ|[a r1>g@ ɷдoVdh 'p2zV^q5\`^)eauk"M@>.<Օzt6߸^v; fi#8ycq nelGIDAT7޾t@r(!䴯}2f>_푞aMڴj@ xs{kr8oߦBÿzlg3|ԕ#՟(}tp.`ikvR۽|tu>Τ&Ձ|kL|-fƖ.)7oQYaQ^t07 f_5op5)kXP*g5ȗH C>bؖ<;X%7uqOJA7zis#@$^^UQTƎ@ Pn?%\[s' %.87X7WFdM7jn i.E^:nC?pY jvjq[!W$,ؑ߃9s4i;)\N sc؞tp m^7qNJ6D1cqϰy_qKw|w:+wU}T$%x~hZãŴۥF^Z6@F%ϟtcJflzbgy[_%~*K'ا*S5ziz=PO^#W-X諼}2of,ǡl'&9ƈ7?H+x6ʴce} qS<f'ko8bqaOX6+fmm/+ e7ڭͩGTqPl .^opfvl*sK^yy kkb>U^s$d xZ pahq})+Yq;de,Ϗ +~rB*cEzC:ujXB%^Įom6))mγ([x^k*wrb?KZEM /1i7Fى ν <|G2'yaxǷM%G': t] /0i%W9`okL=UkA \)z3z-?mC-+N Չ&V=* CQ?}XZA)wXt9Z8V%rbg_ms˶/.6cɟzǝ ᒥgBME@BT\ #9EvU [Ù͂^6qڭ1!.l1xMKv.d } _5(ެ~mm 遜$+ǍD^a>\ޘHԮ-.hȈ옖?ɸ{"?3h7Eܱb7@wm}$o!Td 3ܠ7eg#EZ/_z-lpBJb &1g3(CG*۝ۚqwXn9( #qtl`B,^1ǖƭ}O7=jd.+8L?VA]-tb{ե~[lUx1'j^7[V \*xaQۂ{SsizK|Tv3zrIR[q<j$C4Hh~5E)ͅUMe{or`GD%ۡӒw h2Yȁc.m56Qh'نZ-q0!`8z|6ŏOE20p{fCKM%nʖ9f×H;Ś)3ar{."?!22'X=:&W|?eG6k5c}^KYZGyeDyz#/$ZWkT`9 šlZZ$_~Ml@N[,s>bR\J~̎{LaA&cn"cDr'Nģq`ScQmUg&>3~֠iHb/Ul7oɣQc﯃J$ƏVjXn/(-S-_V͍c? 12 `h, 5YfnOVCwp-9mu4j<̼:W":ד ?(rn;7_^o/# иt=%o1xVװ3 nK`|gIl\Z&7U'zr&7z^wn& !{3qg`~}~gDM5ަlۇIJ<¢c \|ż[}mOԪ75cGW7=1;l@Ʈ1k5kb θ8JrVղ[|do@mv6bTY:'8U7&OK; fu&V~bq|^qy+aC+W!fz2k ѵ\Vx{b'}.31T+ a=9/vmt7+Bk}?0#}Kߚ`Eb=+BT aצUk ZX0hq.K ,غÖ~϶sCZ:p_ZV1<ТߛQ\MkM#Kr.s.x|@㈳ixٷ9~]g;NbLk^5uFd3x·db@q׽Rz4Wy/_Z՗mk;nC 8m|ri; *Ź{\ZsXܹsG_,;tkkT,/ܵg!##Ti,!/, vvXXXCN]A*}֛e?-X/lP-]AR}[Wc ,-XVI]|lX&2/L^:FSPiE[R(KՃ^*RDPlk;AiPU/?WPsM?[#S'禲~!}.s.".j黟SR_g?_ַ5!/7v.o7ovsZ`S?*J`O!˪ZbXZ1IYI׺^!V#[ҟ*%Y,.Uem3áQBt5^7rʦN@FFSgpk?>A>p|/<f"0 /lRֶ/8CY">_Nmi*J}{Oo5&v%})钤Bd7MIENDB`flower-0.8.3/docs/screenshots/worker-tasks.png0000644000076500000240000030611312324702473021540 0ustar mherstaff00000000000000PNG  IHDR`iCCPICC ProfileXY 8ן˵]ى=KH%ZH"J!k"$%d)JByy̙3gΜwUK RL \\p 0yOT% 6;,L~Q>@ Cp- ̦<ԈM| ,DAl_a{[<vOG&S "tD=XpߠpU:>d_=8$'+Le"BqOs%,4|H @lb}@@?sozSaF~mOE8#!{,6;6fFO/j|oK_?#c#^PC4LޱN#Sւn++T[sZ^ ޟbb/Emwk.j/(F*dxLREn42@۴D,~ULP` K`~=i}TßL-9f/>|?A柵 J#]'~Ko*i?b1k5Jn:Q-G&T=@5Pݨ_f! ekȌ~ zW(/o* AഥuпIF7")?C6@k#vFlfCsY6h]dT῎-[l%|@p/{"(AT}0PRPTgW{nL؞ F6A+4AB^:f|)1h~NJ@h=` v\nĺ x/H S 8 A1(W P@ ]<#`L0p"A?$ ICJ:C yAP8 %@P:.Au6=h-(fya1XVa H8NOp|[.9<(EQ(u!GQPPiTՈj5ƢIh,fhG:}>.Gסosu Ãhb1.^L*&SiG w,ˆǪ! f`ck}wEljilpd]5qxZbnE^>^S<6Y>6>=`l{|$~ lfy/  9 %  Յ[DEDDD^҈]s;"V/6%!n./^%>*AЕ(x&T +=qDIՓNaO,bʊzwt]@vZ3r%>;kې'w*o\5< ¢w0pbKĊr1JJ:/_(*M/]+ //+PVQQSy ~ՆjK5l5k{]aqZڂ[[iuP]\\}`xkC[oݑS$ؔ{{)6Gܟm hy:=;L::;j?lzc]]u*ݷ<գSTiCFoc{-F̟u=~788<>4>;<"ח1/WFbFr^*z-f\u7oߎy7>D⇜IɊ)iޏ>ND̬̦~bTYs/s.s_)_7esΗ-l[h]]|=R?v.;/O]ŭI5[nmlD)PToeH wA!\|׶os K|?.GsnllE`; 2BC4 O U+7c,1c8Uyw av@daRg#QYΰ6Mp0ss3'#pIW.(cyRE2dO%ɇ*)nS")M*DJL95}FO1ffyNͮ93%1.p>OSxdkiIr=,VU_\]RqmRݭ %; 7ML"ת&g;:[V=~mDG`/Og?3ƒC*/4_ꍘZ y<^{:8C>̊Eq eߛ~|^Q[4-(7pBi4ՈV@WcT0X.L$Ӌ23p łaŲ1ssqps;yXnf@".ыb?%nIKJ I/KJg5(+)vREGeF'< c9|-Sږ?tJtt7)JFƪK&qfZf+wwгV)f6Dg;a>G̝y?4rA>q}QOO/u2Ż)h@ Ltg=DHGrRpŨԧэ1{c#q&@ 4Sk19jq6#qxቛ';N eNd}9zf=g=p5?P!(~ɪRSpEFbo٪z[Mе njߊ\?tQNHӹ-o1kl}P㸮{+V잵 zsXzo:]χ?͂Ug(AL%h9z@z d$5>-b@sh ua_ěH&GGZNC7?b1VDL#f ^~)bpx_EӸ!g# х8JM?ɰ̘,\G2&=g dYebb{ɾ‘˩9ȳ{υ_+/%'.l*=&f#&>"Q(-%"A\&XVF 4JnWQUT]W{DW5"甞.g27mzyݎVSl>;m8\\vI+{L>Gw |b=B<҉r8U؎x}ԄKٓ2S=Zf>|RCYم9w\и]YQQSuj5 cu 4}l&Wt~{l}gp y0RntķY/~W<.S^Zli|uZ=@$h;eBH–p4\?Bi{e=c0uE*6{A,^DJs Mȧe=NBw(MldHdglac&2ד.yRP{ޢѨyK+:eze5wL0'౐ԷMyޮܾ֡q+.Cw9HO#w

,H۫&oqdjЌlЧϾ_~ }[rZa̟kˁ˽+*+y+kޫ-kkֵϬm((e3@WbXX)X+FQu0P}tF{eЄ pHYs   IDATx}`TŽ?gwd!DXkU-mhi Wmݖzm+ZHR";ABmv7{yٓ :잙~9̙ !F/!n4l!@4> XWWWWWW0(v|>B`&>2l.20f 7~ՕP+J J_W T< Z4}X1;[]!NEwLΠ2|TO{Gh4S!9>dd"{*Y Ye>ntĵp2?PgO_W+>m{nEOW+}P+J?[>JSw?hСC\z)6Ju=%s4'S#8ӝ#tgC8;O('?7{N~4fFҍ|QZveײ'G2Y+MiJ_fYFw.]W+?iazA(qƱqF"H>,n$i@ N{4Vn"ӿw ׂ<ޖ |!lA;O;9e[tJ߂_Wg_ 6-[PTTĄ  .`ٲeoiiB[Lfܭ5sDDz%sHHΆۉNǎX,2e;OE}qxɡ2rrrvnN7m{gzv_W+_g_ꫯ& ºuTUU1l0^/Bm+RĒq#Nn"eK<OIltvA,* w^JJJ4h@ e遂?+t]'PWWϐ!C|ww֟Y}qg핉|\1tV7J7rqR+V֭[ٸq#k.jf>rrr:njjN"V (++W^wQdmmm=z^yy9yyyGX~2ի'XgH'P"`۶m <{l*(|R!wB;ƾ}:t(999Y_NnhWLv-oz?_-ԗ;L+Ww_W+JSoIyy9pK^^e]j߭ts6FO<3<fhhh`v)w}ĉNߟ=zd<0`eee):d?m۶QYYiW4kT 40e5㸫t  @4ע&Mf|sV (5`ݳgOt]g߾} 4u o9ٙ;OgOӴjw}Ttut~wΛu,]9Yk6fJ?(-(ӷM:J_/t$ &tׂ(u(? gM~~4Ν;b <|֖!Cˍ'7b8fΝY+((p29Eqg;z(xA§ {wH]13XnV\%WnjN~8ueoʛM} _W+JA˗ӷo_ZZZ8묳(..>g[ߝ;Y8rB'Hm~k.8p`etޑ#GJ;+i]'ȶҝ4rD"ACCÆK4@0~,^8Lk,^i2 3@$}t輚իIni:tH,7W+..&??uٓsg2)ݲ,t)/o4CJwv#s##S9˜v9eJ?&J_V?رcH$)#߸ꪫ=d9+1ƅF|I!4'b'cٸV66lBŠ4CӍ voꫯ aݬY-[fzFd86 &Bhh蚆d匹Ing@a7y'M̋avX)JC^ضm)׬uM|>׎Qːrrr͵߂kt~?;oȲ]1?ӭ[.'t˭Ϧ4<D"&-Cg{vuY韄_W+no'L4Mit !tYNۻa[<>^)O[{^|>_U+ ct՞[u577G^^ ͜dSկ~qH륺joK-Bf?FR MFCL@؆?m$ʌu&QWiœ7B75(B7զOAGfzVЈtuN$]룱R&77p8li\zAsss5t}3ou\dligܞriX7@~mV7˾w Yl/BW+Jҿ['7,#yyyۯr.N^^^bNQj uK@.8!۰r.X3iw .7PXXȵ^Skusgǿ=/縞u U`{yz YNhB+'ܑtRJ֭R1&)RlY{:ɐ-C/頙mW񧽽M61b~?h͛73rȔe2!(FIII;]/CdXe~?f :][!DJo} ͭong;dnS!߈[uvxݼ,*βJeWW+O>kBnp2!CAA'N`Qy)' :]B6y<~rwY{G8Tώ+e?e6jb9nf6",HZFX4=];raF\Xs1ೣ7H.40g`IQ[G{\~in:?N"`Ѡilܸzb_uطox^iyyy8qR}_XG_]%%%RXXɹu ׿u<(󆔮w-2 -wy2:.sA kGW+J&[Z+**hkk`-x^<QQQa;*`+k{+D<~zY"ˣyqz@X+ttBkھF߲e ?^zA@:;|z{"Vog X@{yh ]KgR RPpϾSwrߵ3y_  ~Fs0f|k, BGKлw1E```A޷miA ̽m<tAov\ տe|A`&h}}^|l8 }uth0t<-!h=n=#-LycZ73?QΥh4֭[ٺe hB=wTZnAPTTS!}Z[[kA|d^mSu{@o 9f]'senrc"Hu߱}:oF|D"a[dt<2ݴ6N߭wvGg(W+JV>Wn :@JطoMMMq8۷:g/;%Я_?=ѣGׯ~?eSԞtIe` p 8 o21T5# hg!'yG'|_W*ecC3_{ ghomɬ+/~ @.3[&11ief=3gy Ąqxk- GMw3?S2d[mq-[ %sءW|vrss;@ @(" ;v,~nFӫ׿Lܺ:.gZ|RYgg?qq;o:q- CQ|73#_.#uλݴnn7j On_wW+B ଳJ_umKkGdÏ><w1l=Kz&}nb\=M*'{Q1q_@`Ai; Lci~pA6#5My~L,Ye[n}x)Sβj5`@8_L"i> ݏ$wߥ~ ։'xs+Kе:Rb\k477SZZl[ἁYsk[g˞Ϻdκ<囥[27gٕܒ<ucvO6vJ_w泾+=rc3n+ng$iD;YgE-ٜH5l&^nZbۓRLkҁs|޽{s 70p@e4@x])50yr&Iu5O5|_.5}Ylfcy8'(Y+1kJuG+'<O!g#xϗpfVFB୺WP" 7򥫆 6-zV=+jlo'/G;;by W㷐k;#H0frhIXnw}zDb8p@ rʳINκ׿ƎD"7/lgygW@NvvNOu;YV_ZNO=OW+J$_;rp iUƹy:ܾ9lwIm9w6svΓT}U[[K*cs& gid0YS|K_bĉv~7wa{^O8Eh˛hi "%phKAA %Ҽ.JKGExA9fiG?Fyyyݷh6ǎ~6tÄBKϻs[nlq9ͭctcԟ}52kKNln u n7`+J_Ww]x,dn'G edJ:+k5w[vrwhjjbS#ưf'5XbwǏs5אK(bΝYݻwu? @#X܃f[u@ ෎[1m {o7~Oc' \Fe3=xAaMJ׭w>#1]n,_^we4͛Sl ;v={kXGCCCJ؝*/we+HtxFYwa˝\Ggߜ,ofwWvJ6T+?-k\"n9GDuV@v"-/+1;O>etI+Kw i ֖̜̓ʫD"XX/!Htfw?0?q%,G1? 4p],v IDAT1'jIWO)!`׮F93?J,q-]!ȣ2oWki7nW+cJQ+JL`g+@YcM[ *(N'(2wkL8n}?v--- >H{Ԉ3zMvVӌhZ~i #Ќn+4X3 %2f,RdK&al`eUO<`-ѻwwo:5cv[RF$yqe:.rNJ_Wk?ҟv!iZ N'L`5XV['cNae^n lp7eokkcϞ=1gRaU2ҟ:ps9:(4ioogƍx<C^^iu;ӝKdrd8dJΠǜ}4V]mC H+uܕYKj~7ƎXHg f]msK^j2)B=*4)anYZ`q iJHdQs=u#_ }m_@5B D_삤}dB(+++_xMa'+dkdJW"ySdP*TſKG%#UAߑwHUDPw #GǬfAvdd/Qc}9ldFRS8mcbMfhj=f8ӟP_W_W_Wȑ#ln@˅0d e,ȺG?S__O{{26.gOϐHfwϟ!_??C"3zRQQ[7פ)o-1]nN[vrw+<`gM>2Q4jO#6?}B !8x g H /AAkk+鱗_Ni?3@5ۨCf(R) 1B;a5Z F@ی&M;Rvw3ꠧp9 C-WPPPPPPPPPPP: x<9R{|:0scX_u1k3SυۚM!gFVoJ lӁ5al0{tmWB7i={Fvď>;(dR|(CnG~yHəlK( xMTp_b۶mWw܁ϗVa>D"nn[tďBX`c-COFؔu24-|vEɲn='K%h?2S:멬Ғ7ǹ#͊7ٳ3u] 0S; ;8gp}vFuy!D8+Sxg4Mj?|<?"n-qvd2wi&/_%JJJ:~JE&Ӆ( 'ߵFXZ|>a8}K.w޼d v l#t8SOٳgw!Ȏgi*>*Ğli*]Bh-8ʢ;lߴFRYt5ZJNYmNuF|$pZaߏr ֭ۺ`,уRz$ 6m޽{@ 0t!~נk\=+4a)vH3 o޴V $'ؾc;Ǐ/p.kܠ-9Y1mImp8M ek\C36|m޴7||JJJxEEE:we]&!G躽^]XYy'Yz=x=<>--jm{Ŋ s9ù)|_)71)+-%JAAϗ= <O?tVy¥ͷr=`d=[!W~s+dsh6jv#FioǓ9"]3P,NvXaP%$7dw==Nupm JrNźV/H{^A|"i?۶mw [kOޑmTT"g׮]Y"shb|o)--eĉB,c.ŏnOgpM\"rssk%'SziܛNH 4MhxxKs|w@0ZBrss8p X ]).)f 475q1<DǃnsSO=uj bTfK2sO1gɕ_ 0jObQ`Wfs`K8n5Lb'}:a 0m60,=!v/ypw#uJ>“Fѣ;x<\{#,|!nbOWnGRb#FڊşO?MM444 4h#ҥK%///YɆw_OfhPy߿=-$V3M?;fLƢMoLzwL?M1aiֳSӺ9r^zx%&Φij_nY8w&.v~9?p|Z 4@+jо|1 Oˮ̿Z`o|ڰ3Ơ@t3^=EKd{z]<suM>Ϯ68w]N>gc~kwVg 3fMfݷb?Nj˶ՙqa=rkb35Fw]uQmZa҅kK_$VGdϾCu }?иM~9w"@03ѝ}{s:w1~f u#[W.1ϧV, ϯ6ك7o݅O0}.SPPPPPP8=qq֬;?ɼvܸq71*帵Yg6yfF Ν;g=19!eR૙\|Mɷ?=zE,"DxvB!z{Kp .^Hߊ h 17O}磍!'N4RRRߟہ?1sqfrrrB0jvq ![6o&ӷo_|3ຮ %z|xrLJȎ5.s2mX)^:ޘy>t6o*9Ʈ|j2ۏx|ۇ\<7f_b2k >C6.Wcz>MY4F;8Ne:xʼ۪ɯ VI4.>~]929N|ov7\EHɗ6{W2yRgge#tn?S"Vn8̸+-#YkS˒uރ辥|E½7!<<l#VqZ"l[Qeamd6 ˣr o'7gTl(Mɤ;o)ߟJF18FjNt']$[_bӍ]4㏫z]0:F@#M4nmL6Ckxv ^<4sZ>''`~>,G$T2 ~xc{{כq<"e%?8ǣH$$#}yq8$ "HR]=|;gx/o?fioKyfR)YF>`-2P6鳌d€[\_/Y hn Cdo<9+YoۇG, ͜;i͡X.vU M oI\6cCZԽg ]{;Ӈn%\wϸapӦ+_慹kymt~2uDwnaǻD0k48Iʍ$.d77't+C_I˰2Č̨KwS5U@;0޼+dj;ȋ?0f.@t/-RCO`; t1 ўev/+C{]0}]FK3 ?6NS`e>F_SeFpya`f)7F8t}[TzqC8,ٸ[G@tlڎ]0ZSB ky0gֱk[Yfz&cb.\5PݻBH~xۚookoϚfHX¦7ބ)_t4/PGSkMŽ;f"`#ٔW3\z+'o#Ur՗ 762<.Mx16z[w,bޢJFF3aX,Jc[ƈq]gf3"Wn$0q4gafޯp=36g.ޯ!j- *beR@ q{s@N!4~e@唛,$mJe4; \k4\| S*eѢ4\c:J&JUJ,lbG!WZgPu 卶| @ed |= F,tlł_euM@ۚydJ:"}a"5uD˃k 4;\+n\'q3~9'G,T\9oxGK%"R`L|T{и/LYSPPPPPP8Q]=o+r-V&D}]TTud m%ŏy~6kK׍}>~]Yx1OĈ#ƏiVDmD>c׳䤷Y exÍ/!x4||RJO J\׍֮쒺rZnh#inj-ɿ6d4 :֋546|۹s'}1+׬^MM!.| +znWGB'\ G`б@_s q)pdG63c4{ؽ𱃛jȴ@[F4T{`cew0U3pQe3Z #8 ^MHH dښ5=qջaҍS3'0G~.k#0y9@J`~ZBrS@ۘ2/,ze1u\9|Q]iIg`0v4d@9Lc* ;[?]ɛτ&hr|d+ueԵ+\9㲬M6i!@ڝҌ4|99.eh=q55øoQ凥 me#?sX9N-6s:}|P+y]# C`ů.!:q::/x돃=ddܭaMl0orhV-Pq%3kcJz>S9O /~z{9ᄡ+ӿm{bY-jG #h` 6g|99y47gMDY<|!@=)`Ȱ@!_}a}ϲHH4feqIP_SCC(J4ZϊYP} !(5̒:(?2~''H̟ߨP2@ ʆ2"P2Ba20 vnj 4Gn_ʼ0 :ٸ(}p]% 7ԃ0\Ad|y};͡ ذa_@2Qm0³Rx \jwfv]sF\(]ϘI^y#0Iu9Rk1=Pe[P */2V>q ev55O ĸEkhngRxvZB5B=)Srkˮ@?_ J.*ZMmى}?U"T?q-gh yZV,#u@!}HY/CMF<{z l)((((((|bpgێ[՝nY"Gijj"4Mc„ "ގ!/իWqS?O8ඟxiVFYhr %%)1iҬ}zNTMKY~f'N #8͕F.[vf<{=~bYz5bjKhjlbǎ߿bt]gh扑;(=./jz<18v?p(z;jƋf̂ S|m|l*7CSkF?9`~c- JjVw -K- ,1౷wT[h ˀo<0&y/T&҃oi0SL*r9M.k-lh^6F*Q {lafp 7oy?Ef5F72$onurJ~BŨɌa-|%Xr• V{ƁK<³<җSPPPPPPdaÆ sWnָqcY ~Z eR@jhd cB!&NKNNyyyx^<_Wz9޳Gx5lYˡfeZs VB4Z[[fܸqrfTth|4+Lf7 16C5D8!sD";vm6f>Gz9tV"DF{a~?@E]D߾}ӳAƌCaC&fϞ#<6\p%WHa2o+=Bi=ra )-A-PXZx;FZNC^aig i%wM#‰pz߉h3MQx)*+Q&_FQcjn-o>eϜ^_=]29QCQ A'hh?HCb< ~us?7[]ӥ$Xo춱r v89k'#7@s3Q`w 2ο4/'kn& .܌?XP3Qd&$!BQ<7g|ח۶ EɖSPPPPPP8m:?ϸ[߿?BV\ɪUA3bc>/k?]˛]ų`-Wv+"h<_TT ~%Xy5D>\ԉ:ߌ]Ѭ) -p`~G[[/55 ټy3v+gq#G;_h81U-cxq16ˣ,D<(ůmMs}tg%?x:ށTz^u{Id?//|ֻǏӣG'Htu $'= F~;֝`(fռ]֖rфRp o&' xLii k[k>>]" `ڴiDGGѣlAr WnnwkUmkn_yAT{QY]7 7,X,f+'v"4&&Nl59WrJ>}dgǏg͚TTTp8֯_O\k趷Gf|}{LG1̦ڗ Ajg975X 'E Vm ׏aE5MMuיv]ZFIƎGhhhpy&c?0aXiԴ+k5j75nSGb7ۨ o4CQQ!EDDDDDsrssZ}QvVaX;6ꦺ#q.ej~XJMF?[*h4|1=;޽{s,96tOࡃP.vwh``:|M51HaӵM wٺ4<*7 a>KUUu&J6X,սMkj{ V] w/ۼC)^Mױ vMzi6l~/Zvͳ*Oq.ROq.ROq.o+g48u3նŀ=\uo.xj&&'R_+~ůW_+~ů;~~5EDDDDDD΀aXw8P-g-_!(}qw """""^`V٤[쉈 Y H75ȹՃmR-]&%"""""Y="Ƭlsa".ҝ4D\DDDDܠID&997h3nls&9fLDDDDl !,/VrSfqsC¼2_|nw k7ĭkydV?%Y+yvSy[z 97'9;by8;B^y5A #z~?*@ŁVđ?aYIy XbɄG-=sC-k?r'ץxhtn}'3oz/䶷3&>[4c $vMJ*!wse8).pZ"""e=Ӧ, ]ó7|{? SD`Ge.E jjr]i5Wj5n L-ynu0FEq~̕8;0GDqpZ #oeP;Y!,3sJNZE.Msti&V?٫Y{m뻐.žpycܸ`c]O m 9>L!l)lr .7pp* srvMdyM`Z.d׶l"Ǘ*=dć ڼj?xvxYARDDDܳ{yKŗbH:wtcc 7萫8_<Ž<u5ri,z OVME.׮IQѣI4qL:_U qG _Jo: 9t|o70^9I3W03*C+xci< x8}ק*=߭4+=s14dx@"3a#_"IjHIݟ`g&,/AJ>aڬa n_=MGbPv5B C5uj*vU願M:EhA|G?O%u|־ ?[u!Ej 2S1}sRlg̚ͅH80=!C1ao(>&&Vs"""gEĎ#pogwK+t'v>s`1+9-˯ :n сC=q}}T7]嬽[e{J#^2)u65 f@%y- uWIMUm`1^n0:Jp$K +8EHsG0O$1q ڽ и󁪢 f;}}JM!My?~ $FMaPRYY9.v1/a(#-۠o89ǰՀnb4$|pVVrD?b&<ć&D{?@[?O__~% o7x) W砕@zD ydWO8\zve>Q_\M-s$ 3|/$ƽ~¬b\CB惩NnV5~&O> D~?JrpjE٠:vr zBfj)a u=w<X.׌[0Tm65* NSR`WLV}0p)TRTGsܷºgSdPHx_!z=eAfsA +;{Oګ%r!~R~\8 ;Sa9勌 ,a6/J,d6 @Nv4bwewb17~i?JO07">΁C4`17MA!718qa Ǎ˂="'Q{a 3ϡqd:=KIgt}{&+M WUDD*K#pVu)njČw`Bݤv,ジ>=|'g*bYVF_sGSx%u,⶙MXJg1fgb5181nǽ4ANYɻ}w\?L'C(^Ϫ^Ŕp;?q8IG  \oܖ{w0^x)d}xVk/ڞL>.W|c =S C'l1?a_}Ո={ч%@G= f0y̍ ##$ET6,/l|/׾@8.⮪Q֡ϐieɉFew}" W?DTH6{;Rε[csV)#(OHt7R;|ЉY'>ln!a2ץa&1ٻs`Ϥ/PU?V:(=c#;bLMUB,} ܷJ`B"1h@eINrD>an<]˒)a9Mx_+%_rAd0On'J.DL{%1\4WeNcyyc/; 8L@LI37{!c|I;(b/oc)kg;;|kj_K kC4i4ŧ>Ӵ4z\aW3>} S8?|4#).cw!0&AIV&Sv?+]D弞MX'61b6hqSCd]rVG*;n~c^[ eۗ!߻ҠIL8KF}F6KY<% ^թOGiuk W_yH.{`d 9UC"+$[Z>bezWX^s5[C*"F@#9O6[OtoZEzM<7Yރp׽1c 'M""""]݃wkZmujoT7 ?1S7lkh9Cu lP1dȡ09yʨIT`*Mpr{=r q*&L~/DEԡyVLf>lSΟ3#*~&˴ &J.>?(]"Wލ Ș= s)796<'V< כf26_ Vrl8X;vr!N2 gTR3ٓU虜!}uɮ1~^%mi}|D]0wi%lw~X{|&3A/gKQhjaN{^D Ooh j'ꩤQr[l2"^wh/̜,*)#Y >:>@p %o #W?|4Lw #c׮O('4q)(8H Pr(Հ[]_CVN*#†{J05T IDAT;ޠ~+w؃B)*v+Ă`ڜ1a8A -r6ġWq#]Mܰon7h{V5x]4=ʄs4>df_CFR (о8z9u)g)e{.&'Nb#‡@-01giw\8E1oº}) Ɍ^dnG%K=ډ{⪯Y?8 Q`b| 4~OR@_Y1^c~ݞތx"%(;P^dy\ָ'<Hw20Z,MN pZrl\w/K.OyOO`Zmg5|ZɯH`4&,3+tk:sR:18 p< cgK}bd)-+,x_Fǟ܋3/QcL 8}%E7b ds,׮Ow),M1I#s 9]`+- R*}{TL{8{og|ĕ\u>38ؠ2Q=AI4[ CL JX1o-_kX&S}qEblwlL]|PELҾ|uEe[|{ܧ޿~"c6a/ee;rI9]m2XmX68[$d=4 ˱SQ]EpHV1[XjS27g0\m׌7nQUʉQcPUVIȈ0yzɫ5Lo~gEq)*P^OԈ L9}2|L5TYTS^0L ~K_vDDDD62]^^S_萾Lt1ǶoL8Ar&Cl_,>&JOPpf^ o )P9LO)??F]MuPp6zE3jk>~I6ЗSOy?h2~@IU+dU]BlL v*LJV2%? l,1wwO.9J) Jm+b``dQPJds0,d<'?y3 P?|vAiy9KVr*~^Bed`x$f&^ź/C5\5| OU:r>?`0( jhBuxZ&<"}lQLԈ{!Q?Ƕ,c~PUSWRTTNF ZΠ)22b!SZ(nt?fgraTppF9f?{{ r2\cc|]tL~k?\7 2O aK3hb|l }qmwSr{ W_y#?HȰFa72lÚPFl;% vMI >+hX`νD)-qgA511/%c_X{Y@]=H{z<>e6cxٽ1{ P-9PHBcaR6na#!($Ѡ'le$7y9FgP8PesVg"l"щdekOHN"sűu+ f-$rŮ:c1z-jf7,5Xg{O|BX%Lz#fwn8#gqYTUdON,cs"}"^Iw2GIZR;bf2f}My̘[fy8}0~YYw3]E~ֿW`'TaLJz%^}[(+5ׁl&9m;GͦX,kq_ WYp0&L; &P] _SL}j]GI\uE/3yv r\Vc'?w[vC Y- 6iqpӍP^PqgNfH(;3%};.cpUf}qpIqpLbԈm(?{H0 3|v \95GrWY_p#~!CQဝS8_AXI p-Q>+ӯƒkjGknse\ 18>h fd6QJV/눼g`J3Wu&^ڀ<6oG+yxðq]VKA`)=gRO6/v{v{}P+(VOl}8_*J:4 [gu&uzS+쾞vmQ[h!h Ÿ* K $x=k]AqyE}l믶c4wlΖzMcVsP~\ifir=ވ{[{k`7ߏ>̾8 ).Nħak In_Kg˹EqQd}OO1W>Kn:rEG3l3>HDDDDDz<$g]YٜnAlN68εM;[ p:⢀,akH9{)gG3>%s&"""""]ŀo2O`wYvjYmNn&=gB99]7LUu)/;5zDDDDD Je[{D@[DDDD`]=ga3iDDDDD0q!"""""qlb1)9hHqsahlnIDDDDD ZKlsln[DDDDܠID&997X N*9a`ڱcOuuuw#""""""C޽FDD[DDDDDD|||TYYi8Njjj;&oٌbTSScl3 Ma,""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^[DDDDDD @WJY\FۖLn G>l$% S㱞v?_[m9ל c[Y" ^[)S vL8ݿ6|+""""ro>-śH#JIPٲepB>|JEDDDDtN?X$$1$oof~v]d͊6U-Vl6%"""""rnzmFۋsOv2 ?$Xb#5SNN NCI#2i 3pb;ibHgq.G%#>C7$$cV-NG-V|}[Yk 'h4UVݼv7 G6%vRSHIˡgHlY~sE~IՀ5>ѱE6{y璕Mn~>zEXh9tyvΏxY,y',|T =NOKW8W₥'ב٤H~,z4kE47HI iz}xmMbY‡[~;v>]$f\6]uKIj s揊j\c򵍶=j= ߗ#ìmq?3n^8z7 ׂͼ_XbX w߾ւo.|זrՏZKV÷1xIpZI|^?&)މ8MҬ>|'0ϣҷWLD%qI"Pu%49탫%Mڴv9 ZLX~Un;YqWҫCJXk_W̑\$d8dQKF3j\.aߺ%rx轇:%ʢ_"3|^R?^mЄޘ_k"""""ңuM]?5 %mj{%ܿj)t,V{B"w?7~}~e V\_ƍ|ՄOYi:4&^|t3MS S& bݷ1ʫ.`̟:بx&]~ ~3NzݹgcA0'xc0ix< ̾g{nҫ~TwgIDNff dxeg}4]`qdsd#zǤP/v@Y6d< 05L]Q\}&ֲ-av9rCK͂f#f˜Qv>&d߆u"ķڔn;2hm ormGҙW e4N;l$)h.Z5dJ(a3`ݮ8-3Ш?מboQ7\e)|4{ur32Jh6-Kou㠲V& :jy{{ba6F5?Lj97x?fR"4ztWpSvGڼC޳KYUV,"x^Aw*H:i/#u{s o|tc!y\41MzIXlw`Àᑹ&]~k_XV63@s,Kn ˛LQ̦ d86NKi-M\veg6x]Zzζͼ]+q)h0Lר̥kYzs;Δ"""""rt,W-hs|;6|9˗?O0C=]sa?gq#cZǺͬ ־s7Ş٠wXb5:1y?e_`RjIG+:CCIȲw,]`QbOx: s?eQ GpWzA2zƢYf=?x.kd[~Mrf9?, l,ܼ;ݱimfߎ/+ Vo+?>g|XsF\X7#go?sy],{m^\ۜd2WDDDDDz&SMM`F۝edQZAGGa"]VKn^TV_(}b^U稽.Ueok2x.+7.gx3st]:d2xj}a=0\ၮMiՏ>Fv|]8PTZaGxx$a5j +R*Gh+o/o~FEDDDD wa #6=p,0,֧:S=G;[_{Oۈycyŗ7\מ֙a #>7hBTlgN?6¢b ;DDDDD vw'=ͫXt2na0mjz^EDDDD[liOk#EDDDDDGS}y,2wcw:s&[=3ȷ'9NUp2J*#&.g^fV+A0So 0`=W"""""mqVgo%""""""wEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^[DDDDDD ޮUx]XXW3&ɫ|!"""""""ޠ[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^[DDDDDD `xl/P-""""""JEDDDDDD@ (%"""""""^`D5aPTTDyy9@hh(&1L555,='O$88@s;,AII %%%2 IDAT qo*,,fzN&V0),,pDDDDDz %"^T\\LxxxwqVQ^^aJEp`6;>VV|\DDDDHS-""""""JEDDDDDD@ (%"""""""^`eF5L]HϣχȹG$؆}7{rfw!7sK s*x>=߳Faǽ15mKS=?E28U؈[g/cVDPw֭UdVUx+w^6 Sþo3_{1w՚~k?+7]4c|Q]F%@kOi{wyg>˖1W>{Y9X9_->CĝilH?DF 2 Op<}-}ՖgcCj2^ix=I;X] eY¥+c]z|kGL ;~@>urOs*;cغu+["-;S)((T;zp/m46ή]yؐ|r<@.^ 2åq,~^.=Kyؐ[vZHl=KƲ6?g6odͳXmOMK1hhkMUHOy?c_цEkOKmikawz{`ʟ0urӷB;ڼ-rmyV{gsɝ{ f.;=n P%gg<4 |N2y6f_絝=,`XgObLgcƻ{inCVϾAQ5xgalXm]Jnt^vr4 bbTO2?G21ןLuFetTG yS؇gQ\m>c [(xApmoxɏEr.nqc_$vu5xb,p坌R2?aS$8i#J:Yx݋^gcFث?5G>|;믿믿s*?~=7[>OhTvD_;ܮr=AYS|6U?_Ωl|vuݿ$Er?5MEm ީ7rCQe'N`ko"ʡ _yFX1VB\ߐU{Mܷ9ؓ,?_ĒaORv/9$WX TWl)) +^fpYb+;a*yfΎy[kGY.$'~F$,2%`_سjn^gP WcaEopwݕ,?#51gIbFB@v8S`knA [o_'m?fƓTe+4f-_38$eͭy̻{>R5@8oyMͼ_,֎r=lr*(7c@ ׭דr> %;o?ɰqjTά,rrS`1D}0u4>?QSw4_`z֌m-EL9ɮH Y~O9f=ɮ# xZI?cN𵔃u&C,-|( 7* mϯS[tG,4k|"`0p1!0(֧q85** rr9Ws(pp4F\.>Jw^@ן ǵ l5ƣ\&ö/Lvyٖ=WUWo峱im~-|?lȺcx{ܠ݅\rӖ3~c|鬁^P}i`W>Ϗ=1S>öj0a3aǻ` oa{uéK0~p}=pÚ +6YۖJv}T3+` 1854.cA|5),? ɯiT77~]6&Oo>d[yriKf΢?W=1' fX@HT^:쵟ϡ]o 5{z}10s4@ps֫fUIfs,N̞2_,ygZ_aLx>s'X6FO~ 2ips{8tco{?Ƅ@P/B8 & W>Q697rՅuz"+6 Oݸ{h^V+Z9>|s@=c5q| #]8(p ee ico՟WS_>?9vG~70o>\.l'ǘv]!j0zPRϩCidd%v2a#CJ;7<=.g[ޞd g1dȕu(6;a]!ȧVGa2 ;j15< Ϻc,V:cvqUzqNleXVVkc?p ; kG"C g.}yμB[=W^v;v%~uL_wADDDufe56GgTn}8㽹٘'ua3SIz-g/gyR3!6>GO]˲:b5^z֌޶ŋ瓖Y#g1ahjٴYF-MxqF Șޒ#;\FJOnX{3y-vvcg ڸOFU95Px(,r` cDYz"v&Rs[*csiGEDDD.mLW:.yT%{ed 4l,Qs}ؔ9yN6Җ<ٵ%i,=5ϓl֕(dlIX"b?Ò)ck&)$OrRn}h$wڄ5JJbwֿ֣wnrjf\:Z'6ל(nO }: 'eYJ\m[&$^m&Pmf0WoRfozĕ)oX-ʪ=vחMId޼$|o_n91eeH>@76*a&ncT.3y1A?㝔f^|FGoN{*Kރ8bGIC8nLf\߬žIy| e~o{&.|q3n s|ɷL&L@1!y/6ntp?ƎuqPn;.T7|-6 )-i2ԁkBL-vʾݙ-qDN=-jN%_9uކi"Cgx3x$ >N9" Okvb7ir LA' ҋ3}Ϻ= Nww2S헜 v䟵y=Wჺ$yc[}Ja􍰳c[s\|'q޶zW4Yyg9k+i2ѡ |o'3 9z%8 }#U9f/?gS'ʫ~[ u|>Bwy0lF="""":Z ,n(CKŰp6?ϟ]ڎէ/̛921GH[JTTPl+vf/> -*shXFiUtQ&i󙒘1/1K?NN3aV()hzC_{18$Q#yj^<㟩>߀"aKcA& 'Gw·~y+3r r(r\)tLL97r'dp`s{,pCvp:d 0~D܁Xvس Ӂ Mk(}"BSP` kVtwM坭9drpxfĤ{:q?yT݀젠 rT>=>3lEܹㅷ1qDTڝ|̥?<"hc[]Cc{9U< Y'w|ƫ g7CSgQ=:p`۵q7;pTn½m7*f/Fޫ2>w?!wqc/mK """"Z'n@T\(Ngeۉ> Ée~PƞE$޻fV%7ܳȦe6>[cGPyBD ?o,7 ~l a`;y* b@S/c@ tWoBٛ96L23u8)^3cbسj{;Uw|B}#aevnȃ$<vƸg 3ań_>g5۷gU2ldں{ 8[Xty;)caX]0FQ{3]ٴ޷MǏ5XO?-R/"""ҦZ%gQǔYI,M寻ѹڛw {- ,p6 Jnk,]Uث6pS?]1R7,GIXg1_A X:2hfŹkk\ko֛B\=O+nD I,]qo,fsC [y9\(6pz>[",R/=EIrBzpנߔ6Z՞\c@h ,j(1F1< `?`9_Z-;Gc̞% c߫SuvX0FXx}øګ=觞(wy^s)wQνaةͰaѽWcvlH k2D4iv<kKj2e|gk5mQC '|bOVi#+:wIɅ; BҨl9.3i ̗w0(_Cm|Je<{c>냛3 ٳWgOܝH'K׸UʫFk*^™ IDATڵO:ꬹ2ANՒVkOBy۩cc- vI[ ?QcO0v4%v4 wݪ 2` txuزc[8=GYquOs[ûԘEq%-XD̈8q>~+N9nz"Luw&n91f!Pn2QvV>rHpŧzDDDDm:؍֭#*vP(g,BδA>ۿ;Lr376s?șoݯ*ST-֑ǷcE9?q\af4bG3m-Y زw49&pwwS8o?oZn8u|j|̘klTGCC}gj,P$dfƁ:I\zc[]ƺNgxL~X>߱n&*sshG"w%p/sn; %7;9'rS&sGƒΒWdc//v u]Kzնlh$C 2N_iXg~< ua]kaᴡXOyi<`哘-_=#ŋczR9 O rV NXͨI}\a3b׿z $'3󿫢H\5 (c |c\jy=ɐ#av'v2#г\6!a!@΢3\~W+/L "ħSIcj׫_ҬK| m{<j,Wfl>W9_iʍ tk6v]bk0i<|ٿc-oM&&!"1μlޛ_U`4KzͫX#b{u4|kL\HHlcڭ_c[81֧79b?gN>?H-zxztJ {sBzV6n>@9Xúk: s/؋QIwM*,'-|#""""mҟChXԅ7gV}ymNCAjRfVݼτ3w(}|oE#'ǦѼ2k3.<3u%kY0:҂՜Wgon|.Jd2MP13]Yw[׼#(;Cbޯ!"2 \ <\;&Gvm[*v2rruOS ǰkfaGt:-pa֟ti]:ٽ-GPLN)+îvY[/ mukϭ?`^3FO [#]Up8A~QKzxfycQ:q*'{t85iDtyE=;w&Π}+UdϹ#""""Ef|~6j5:D l|equm;6>{j؄ą|>'10I'+MLO_ ϓbu޽K,|s8?Ȋ5иk?5ƦrXXZ˭۹sP䧾icQS8^m>U !vk#"koLFmuuϪXkUϮvv.8(7czιA/)q87R[cUzj;i.Kċ9slT\k\Ls"bjEIӸG/f[Uϋb>#2`g[ضfZ1gh{I @gћbwGDDDD}ə\, G[끋|ϵ-"àEDDDDZqaP,""""REQ-""""""b%"""""""P-""""""b%"""""""P-""""""bY^^Q>le簗_h&DDDDDDDk@W[b2~rk/}~?fB- 4V4ݾ vi[.wSd?#8lvUrxbSp%""""""rirrrބ y+,VDDDDDDAxpWleEWmx}1D_9W`("Nxƽ̇1l(1l(1lzZ. ݁3㝷0|Yj7No}Α=8K-mT?8aH""""sy})!kwԇ2"vojyd}ȑ71G]ݕ=UcNv3?Ŭ*Ͻw_0?I[tщVh6bsyu3 qYt:1LXPȥWy#~b-wo#s c~vȄ3Gƌzۻ+p撒ce=H޸&I;ݩUDŴ ;& <>dntGq{ ^oγm՟=x$qs>UVL`.qNmTۇ3`~Bw-#5(DU6T."""r۷͞#QYNgǸg,<^w0)qH$QwrC{!ϭz0.li]`[¸cNѱ}ɳ4^a~RRB8/]|*e>cߥ`D 2W&⨧}gNHxO{k_ᅻO S[ pʛ;x5b1I6Km'g Ν۳'W/^u9!Fy B֑\|-.&ua?%B;s Wd{q bn,,5=+g, O⌍QqULuo n\͕^T_s ,,[."""r(bfFO˅V_;+$ [Koo׏9+ОC̀ozc_v˛XY"f)3.j9^OH[H h;+zw 1 "I 31͓S\tIO"b Ԓ}ZŃxkPdwK7z:w_9 سvp[."""rYgǑ3 a:.`i6'wo8H.gH$MQU׆};)(f?0]S-U7'2={;2g)gr3y{|8] /<pZk 2HxG>DR1OQo6zx~'(<ω]prz3 \>Xb#7PYYdefosrAsə|voZT3'1g,eT6XǯC||#̝(3El{,Ʉ{bzኈ6n`">5 x23+#f~-IrN%eW+Z+ """Җg42???;(.+T8s6&K{y}tӰ\.W`D5`UM3sk|\c2lEDDD.w<d&$TI"/9esj6%bUW>hPKlj\%g"""""""/JEDDDDDD [DDDDDDJEDDDDDD [DDDDDDJEDDDDDD [DDDDDDJEDDDDDD [DDDDDDJEDDDDDD hjEDDDt~&"Z$tgKT+""""͐DDI:u`@ `@ `@ `@ `l˅墬2WQV7^Zw%UxN}ū/mD/"""b"u6yn .\MD䇦fm;fQk9SfP~|6j_DDD0\^(M|~S2*f # hE_՘qR{\]뻘]@AAN0n:EDDDڂ,˄yk?gtO+M<Mgжeg,J X@s9֓Mtt4 ,yo Ezγ=%Z1c EGZZNrv豊cʲ4{omڏ4\BBt411$.:y͢;0""""F Q iITIDr3ؖEOtf_zg/ >E؍bvD{/y[Ay-aɞ ANWdo[g\}*Eb &eS}9¸N{>>DV<C<$NnW=+d:lcjS=v3:d7SzSf'`WH<\DDDa=G'c4`e7߰m3d2iZDPD̀plح  ^!z "~ '/8˙B,7 dcpVl;v+ ct1;vy1:?5s^1_BƲQШ et>ܱl\?=23y@>ŕ{;ٱj.6e{d%gzm;|9$"""|VnçU!#"Hm`܌-+eNY5{*\1'ӞcR4>ݟD;{7 RL&‡Nc^,Qo;^36gr5^` ^K#=;5uvztm-3BhJ 'Gvn;S)0VSDDD\ws>Ūk< cSi[C7*'3q>-Ɍx-ڱDelख़lIS'aPv6̶XlK/ua?ϱ NE6Dzqi"sf$2v{) ёXd“OL$S7EunK 9KH6Mf|lp\6Ύńȥ%"v:/:I,l"GFiDD.'~.#dNNwY^}誵˱J N/XZM))+#jm0A^8&ӧ>`;JʪW#YA`Hkiݎ +&'MCr vMX^&+Vk{ł7X6-Z|+jm4SDDDRs.i[īw5WJw1U+"""r9ѹ1-"""""""JEDDDDDD [DDDDDDJEDDDDDD [DDDDDDJEDDDDDD [DDDDDDJEDDDDDD [DDDDDDJEDDDDDD ՊH3LDHݷVDDDDa_~DDٗaxE\DDDDDDJEDDDDDD [DDDDDDJEDDDDDD [DDDDDDJEDDDDDD [DDDDDDJEDDDDDD [DDDDDDJEDDDDDD  \.v3f{_*+;oa1t,oN aD""""3gٽ+.#kwԇ+Lr? dYС7 sp\Moع!(f0ƒ;K`:^fͼZ'9[fPڨ 6y`yrfE䇧 nou7ѯ )#pڙO'(Xu'HH^=ɴT6? R"""vx?sKfspkaz"<  ol."ʮRDRF]9ߜ$+,y`ʜO 8w?xoH۟i!uHgmDol*99p\híQj^|-E9g Me;-0'?w?+<YmrAsə|voZTkL"GY%kۻZc%p,/]8%"Zc{\ē۫+#f~-Ig:iZ挎CG{Z Ë.?Y6r ߯gh% dQ\vкEDDDDDDDp@=} 23n2 2]"""""""FP-""""""b%"""""""P-""""""b%"""""""P-""""""b%"""""""P-""""""b%"""""""P-""""""b%"""""""P-""""""b%"""""""P-""""""b%"""""""P-""""""b%"""""""P-""""""b%"""""""P-""""""b%"""""""P-""""""b%"""""""P-""""""b%"""""""P-""""""b+t\57:sYr X?t3&FY*alɵc {`l;""""""dx]}_0eFW&<{y5<)4Ù6. r2R2*3j=tko@DDDDDDl';6.9sٓŸJ|e i?$O-""""""ҒZ>.j/zk3-ڸՌ z5Clv .A5-""""""?l-`H%e9)()ڞQxF`1k-1~ee|8+0o?'Ey(v "<+bs嗛cC|_Ǩw3r""""W^^2D5ba]60}LGMe3ĬiwqQU_8#(*~E$ fM;fcI#}NM??SCZ3^yAE Af` a1QǣGkZkk}i;;q^ժ_6ewemx*؃Y{!]* Yɐףܜnhk\\\HO@t|4)բ#btmm1a8<woTnes[cx<aMm*#{8wPh]x~'B!SZZzw?eoٹ¹,lڏʲ7c; yF(.&X F ,s(G`\Ia4yI4$sQGt}?][xVSÞM;Ac8:Pׯ3El5 Sy$l$UAAڰb[KK'2<*b)3~4q˰xKKKI.PtdNwf;O6 (HE|s4uT~}y-" 4d]3L[\\#kޝx.8LgH:<]IV>'t:t:=b1&MZ̓$b0h@졭iE/rl K6E@Qj<54dhuMEOd}d׏р.7ĭkؓXY Ak4` mIĘlr \sZF (hs38e1GwZru l}ܑx~mn.٩1OQs\-A U; Q 5"^;v!S+ߎ܌d:B.uvcI?J@nY: GHiOz.Rs iɾ̆;ɯʲ[߳}gŻ]OZN{!BQܥl=-'uUi3k6Rٛ"#Z+eԓ_H9.mX{%% ~y{/2Cb*'ѫӖΠ5$E؞ oק7 /evE~j1oڦ7:۝v}ֺ)+6%Ӥмp4Eٳ\n0WWەQ#StWvs2ƫp{q~ ٕJҶԩOۻvz3|q'2hصme嵭xO^ņCd&Ɠ:˛a[ɇRE~فmwf[Fn@9;Rtŧ(L2W P¥C[z$Z)v,gFSC%PBھ8Fh1?t1AՉrNv>tT.ѳbؚ @'1Pȭ B!B#wg[{L[>A! -yI\=Y<ԯǷ@*,iaӏҴ\9}h;w|}Ə~vߺlO1?>^JʮoӊvO;@WeePb(0QKpk؉1CIZ}/@ͧCy'@*Ot'Kվm>XA ][xY>hij/n #wGFt@yE#_Q%Ks;7zRuPTBkH̄^Cem%9;>_ܠ/)^o1Oh;0µ&jK7}d~Tcգe5ٹAPc4<#-'а^w2r@f U *?eGG-c9d\{+Vˇs.;bH^@ FΜʤwKd MIβ5-c4E+b;>-|O!BZ7]ܾrBs6A퍏?oT*_Yy~I134myyx| a+TWxy0cf'S3y$AS#gEF-hs {`L$RE/(Wg@YK'+~9@nLoʷ)ႆCW*LwOå;_SC:t 4Dr0jxvn"ŗ_&;`?ۮjz2W;ⱊ+~2=wʱh̿euI{v10u3"1q1Ѽ*t)kkMʑ2bB!rv\דBmv;%JIlڛNЈX䅕ǓT!7Q`~SO06 *S,dx2 b\=@ˇ_0:aEx߁Ҽjt'Fos] 4u{ JKUփ\֬|+?e3/#@Q{NW_JqdJ6g1٦t +,GoM&o曓t Gַ_٢g`{jO6I5ƫog 6f1 CvnN#ʨ2DpJՑkT(QؽJ,][FNd 4,jFtgwgx[Wp _8_coW?VW)N-HCw3f#B!DmlNf!}mN 54zt7_%, ٖ8EWI;Le}!O7Qݩ/,6 >es`}MLZŽ/QCWѬ]y>m(Nja2/\ [gANpEYk.tP˓PL.;x~dQ:n;jEylށ*ӈh@_jХ6jMj7ͮS4J@Cs`u CCYEyu`quՃګ`\ŢR)h dddcNKo & 0h0wi+N~uFg4eH%1 tt,!B!j!ReXM߹|tlzbTR_}q1Ÿz^YZZZmgD}m1(F ~>VGmˢJ )U^坧uJ cIlm"t{xtyyGa?] ͑\:|}Z[Zm6H:vW|N;˟ꆔaTV# WZۑkI[J긣R?V'Ѐ W))4#J+x0Յ| !BQ۔ޝt9mP(P*(;+׏ 28lzot)@u#{6yxo'&v'QMܮҢ, С)n9/TҡES݃3=.RiUvUNc+!B!j3w s2ܭu-mŨv?ܦ_o{UVw7vI:%ufRYnomJ!BoPþ!wmH/uCi}֬K'9~.|mzW3§)O!B!T:޸[}LS!B{y[atB!-  !B!4NB!B0B!BB!B!@:B!B!H[!B!pq}I!t/u7V!B!BeGPzJeRRRRO&Kn?VxuZH> 0BwaqB-ɼNw~(<ⴼKKK4\\Цng\ !B!5<SM&<.4D !B!Nܳ buz;:n B!B O NqsvB!B!D&B!B!@:B!B!H[!B!p` !B!N l!B! -Bz{[ IDAT!B8@!RҹHB=`&v}"7K1cn>OyqtrPo_M?'bpoBS3cu}±ty'LmĽ9_ W̺ 1WԽ.tOUXdP!n.T4l֒Þe@F: ]P)1ϖua+M78m06 oN`yaIϑMߒgncS;STIo_MftA(6o[;Ncuʜf݆ru_t N0&}7%PsAx܋)9a;3&?FE;yUj3ըÉ]:l!6N5hU&0n3d~R vA;~Ơ򨞦) B;Y3'$NcB:8 s$ewԊEO^Fևn"jj8AAA15j)G2w55OVn`弩М8šyl:].idM?l+s1PBBG3sY4%HЄ>sluK|U(3n&ŸA睷XSY#l:4l]Oc(OgiČjiG$/N޵S]OxZ2J &"":5ٖktu.:Hөb{["8[7 Mk15:@KšL5>;NSkY|xc F@fqSFiu1SNetӿs{3u $IF3q7ٺk;m!fz\8ѱ1~#JO@ V&%q@ j4ILV«#gO^b`fL)c^' z{bqO !%bPo C'Ϡo.k/5[ո% q5?ֱY&l\0~aՕWKS\xxts30 % $i֒,ig+hu(L/O?neʤNl D.FoէkzLb_RK[5,Qp C_ 0,gf[3ca3w|[>.̾dm&gFۆn4>2}پ<$ƎTFthGwIJg4VvNto1m㝉ϡ h0_Oǵa/-\@Wzw%-WPOa⛹I!/w,$@BTpQX i?'7AVK'!eM c?vӅ(h : !p/Xy4R4Dkz1 gO+[IҦN)l27v>Cp"u9frEW$)CIN\k#<- Ss ՞]wCQGJ Fpfڥ ^ҿʴIo >:rPi򃩃_(x&Xn䘗)ͫ-#/[Z6qUVhk>#> ӻP΍dI<܇v@=%V0m9i,f*-,n æ hЊ@Jp?y pEυWHZ>-+vF= QeѪɷQګ ~wg/4ncQǥSh6$:.+> 婋 OͣJKB<Ism4Į$p+^f2G|Zn}}ssdB-6 Bxzh0~ hm i JH:tXó0~wZ߭m'ޝglC|K5$)O\F);`Aey|8 - ;VEfT~@o{L%Mk @p2&w6\ D^Wcz:'3SHmSgxe0ш64K3;Mj^!jB~^NQ,PuL~:Zl(znZUQ<챛F 5ĕ+xjX/u㠿UDEM2-5j̜9wߝ8G_Ϸ?TGFSSN 3T#y)eV)DL=nM*yj':&2qs@11_߿?PeD1$7NUf~k~\CBʓ9;5РY_09Y\l  nÐ`qFL+̿tXFix}Hjz9|v !Kœ`FlŸ8 /ӽDoF#'EG͆{n#Jy<;mm^%#EU<[ymcMxf/Հ;gvqg^z3RF&:> D3o"M2l0.$f_jB{w=8[j<@YȰ> sC"S x ǚվGѫɷ[/PX\]Q`mU@)u9=vu5̬Rep!b$>-5;4vz)3E& X`Gq?f8"Mu)4`3V6blOa Ē;ѡ6΄v z؅M#I̝ku<?$R4x!/|le{ٗ-zU>1_^4{SJzM uV.z?o ,$:6 Y7&$E / HZg;2mAs)i,? o9|a16s0=L]>ˋ[51x}  `&ըßَ |:%̜bPϖG1pwnp))))uqqqZ9?ҧPiYii):PP)V׬l}zZ=(x*8 4[F4ِw.}؈^Wh,?>Z;-qq)q\yUeuNP9/9 G^9MY[7b/Gnc?߶o{uPZZ aWp289=ztz=*y溶vﵽHގZr] Tկa(~oJ*o|x>tB!Gݺx؜_cfGӎc7uQ9nӃ?!:~!+nsBJY(Jv&Rv=`;nԡB{N% a3A6v'zl-w 2I_Υ=֑} :qVWC6f3)Z$4cRȻO #{yy)Ocz3ZYzc{moOaFhaޥuxM"_ ~zw~y;ŹI[Ӄ&*}1('FQ<˖G~4iP)=t|M6A\Vl7.[ǔvݘ~O~>.VcՕf\uw!`O<9{#ZدݶӔ_~F puu).vi4Q)jGX2#'ż`_7 }j^dZh{`OܝOkXGA7qܣ'gjsg?m3x O1*^LeίwWh?rh͵8%ij䭯PV|4s%p6Σ!_OI(9Oˆ>MǦo{2'"xnE~<ǙĭZr~ХŢM?4q[މ9hm3[5z=|R|+ǭ3Xm9uDڦW 6A]&7ՙػy(8XPcպp%m[RWQCz+衰?|{=]'md'E_)Ϥn7wZ/fʪ?̊܍c@+jv{q=0WZ׌K 720DW yUY XM~zB>$֐LKxpQ1aVn>bz>xf& 'dT(i,? @n$hzxױ6y:-FW\Ǭ -kԤ4] =[7"ΪU_9 H`y_^ҹKxs b}f{Cu]q(lȊlja/ϪՔlRl%)W~yys R?ٵXyu q%&&n\;.qq|},ٞYk0U} .|ȳˈ;L"nV::E"n<;Puоj>  [Ò#|pis+ ~^h%0y+puw,>X {iەam= utzxYߔi^gװbeuٔgj1.ѿ+o?Iekm va[,o-617m˶,6şdݬ8p~6ڍz뇷"ZgŐaCXwLa~^ B03CGcޱ5g$3 v+!~b0f&\ϴvx+/Z66$ij/6^ 2fk%s""׮''] !K.uǐqǤQѭ---ƝGΧ.*P`œM3 "g9~,uW9j vm؀?s6FOA-ͶC ovF|CZ&ԵZu&?[T^t .Hrn;>22]T?%gK, i6o-DTPOMM'0p2O㵈e$g,,6?DJrO[q%S;?̬q!#X2|wc-KM'm^+\ξXO1gL+gNUnbպ>Ȩ譊Q7;W~I@1u8ܚMbg'3m+Zv0Qɂ _0W;%`?ksܧݼXtej؎^=8}Uz]tyzA"p@zPPdjir\MC:OdJ|L[6N1'^X7'1Klk^YnloM"L٧Vo`xM '/zF Ї:Ŋ恼rw̛S {Q(L[ƦĞ a,ٚVcY-^惤Pq4y?qO<yg74%;.e޳6EJC^V hRl-i9@S0hoR7V[kmQ\L S)E5U n?dNpI1iDD$C0v l'vb(>IyFnu?S2 B&pѴ3ix~V60kq!+"itm9ƀp"CrB/MΗ2΀G{֛OKLFS~g[~ їyy!ʴ[ }{z=Orβ+QPp]׿H9:s4t' :s-&Y4WrOVC[1G~vܹ6jN.7d"6ʷ;i嫗F#-N{g#!CAJp/!p oWn6?w&xX\\\:ʆՎiy 3!rG5kIc0)+V~H/0Q8;(͘&~,?us8 l*j`, }Fw0zL,<ŀgsOo({tbҖoxZ<Y\/bc _ 3agjjZIڮ c0Q%46ӹyOeoz?ɰOHxܼԘ/Hf >D>x}I`{^ rBkYhn^Q?2}}` _{hyvm,/8hG~L-zԇBSp%FƢ551ϑpsURTǧ4/$"6װmD"̷lyn^j..VTw" }zj(1ՃeyZ,2o #Pϐ~m!,'%Lh۔ÉA2<ū7?&->JNĮC;hONEv_Pdq!:9|rlcsb;GS51d8eݶVZ;l~y}ՉͲoll|iq_Sx7t ?ʌ/ l&/mHnNCH*刈baxo[,h";h1vힱ9u >x6{wނ[{ˢDo0b߳P˕7X>CZ@z gكi͇YŒǺSBF(ϳ( ּ hJzfA8Ty5˫Q{ut `wG)qO_jĻ{4;1"ݿpKY.t-={P7S&&*0'_XݗhUbpQTvtaƨw(}^Z;l<5z.VgۿgK$coղXݗzoxk\Ua| m٬`Ӧi訏xuD܁̛9P=7x;]_Ƃd#Rj{=vIݘq.A~ĪI,*y}#+3 ;ti,4Yf=j,2ĴAՏ*_&qGгWk2m6H>]j^?_zO !^aRfͶO.6yfjeSxܷO5ڲ}PAatg 6wpln{|׀4̉n\OW?OП&@_wOB*nYAmwVHVw_ßzys==rZn߻g,Lۃ)zgHBCV]tmK]Dgomjƫz=x*i^!|g0wS dľSv~yyey~i#}g`z6:z2]+@OWyD"Wxp5h]1啘_.Bvp˗Hm'#xz eDZ` c5OIɃ2xJy,[i=[=XblCWJ/誴K)<4 MF}2 PrT33擔" E@=%@?^J+s~)~Qקx$%bH7l{t 8t*b0t$|mjj;UՔ>n6}1/Ni,.^%" Dj^h42͎t۾${*?dVtXC^GQ e# ;юТ1D9LT-i.cƂ՘Td򵓏 LwB*"S"&m^tm[o?6d&sbS (mfmDގ|| Y|1E:y#Z3;v|"313 |'s`G[Aszw%BZ ZOE\Los 0"[/әJ~Q- 7|HJ%vŮb!us8z-a9=:,XZ1yb"9OO_m2(NoSԷDX^v먦emRb('3k/M@Z]Zp$7Ώqc_EʯƦEOGݶ /% Z/a掰jj;e~5z;nul]GeNl{k^zu`.mJ6OkqͽDZJi)ioӓֵ,Na=[ɩȡ<j`7%'i 3=w"6y|Iz^[W2?BG||Z>3/|*\ t=6ٹ49ٙ$, Ld9]* y;Ns]CX#6]ђb˷ '*G6$xqۯ l;{W s/ :> wG固?SXg YɬQ[l ?)odîHL] />7n>`x2?96]C#CskA[<ێ͔(|%SǴx)Ɣwy;~V sc?0qh@:G3L箎O<.><~%:aLӇܠy1Lm1$hLoDǎ0%S&|Igd`ƶXɪ>J>7-L;ǬM1saˬeBPnncCs2;b7tnR?*ǵخsKޯ4y.ѫȷgOL9z~ĜjPTfl[m1Oh"ssy0yd3"taU 5y@TU?4 KIb KhY&y45sIĥw##DquTuf``?ʜs{Ϲs?]b9wե]rr4.H#16:5r u,6t\O*\9_bm|x?jo4fʲ ;Φn#MQ-|EuskS~ѽy|fCuS8q_ cn0f!,t<~ ?Q.k--ߛ,e(d4-Hguj@5kǒs?Ȕ ۝V2qޏR鲹aٕy &O5|dtҹ)ks:0ev! g @@K>a{=&)޽{N_]4+Y^vVwTG ($JJAXv&,7--Cm)]-(/m!G6a|5QJI2*..(S+R;FVU>sԅl(ɹ[շ79bogoa%T̜}Ͻ"2Cym-RH]eYdqfg66m.Ӷ2s15^"^TKTH0ǪeR[Ҿ(Zڿ39J`r.*]MR8K>ZG?Fup4y"BTj5$r\JNѦcz&:,z9>TFރ^]TdoXƃ<;uVMRL^TRט{hLwV]p2941VV_-ZvƮ-G60؞{ؚhGվ$:Uit:-\NFw]e8:2=H;ѵ2M!NATr}9[n,n`g_zWVK5KJY*/muyD(_q(im\-!blʴRP^}KylbL* +UnS}tݭ 90T1NvߟAePE>S a#ExpLy>b_ӹ[ c*߲, <5R+l\w^/zNB*'t%~=brsqZNJ?țm[WueUz<,W7AUgd?WeTY>G?<yTq`35>B]1} ;[mdj5yWF1 l^&^ |4 s'm3@ CV~=ʩSGHu*T)FL?@ 1ƚq667Iq @ @ U` @ @P @ @ ` @ @P @ @ ` @ @P @ @ ` @ @P ܻwOW$Od @ @XWtV4#*SIAՓp{@ . VBc+G.~?A9͏.4WF"C$y?0 {rNM&ZS5ycVPk~jؤ(3ps@Aԗǣ0}%/!,/6-8yT`m7e'v ^?#'7I8: ͽLTf/vog˦4S3qف; 5kї[qܻj*Ww8pl9sk^{Jb|1=G`׮)i^FY^JtZvw8xA-Y|,sHggcڐvpw*Gڴ#r֙ YT~\>qsɷ!:ݩ'y29aoZKJmDq<ɢNĿccVW)غv;չj5~Ox!g=Щ|αDޭ GI8{B;W|:vMT LNba РR=g3wֺ$vJΘ{οX6c~f&IJ=Vˈlxm-oy߷3,^ mG`W'q$\Ak|Hcnd+6f;l_͜ҭayF\z3 >* 8;{:_ń_꠯Wxџ耾'hO²a_hgAeu@m_z%eɾ'l`Ζݭre@S|^Fq4з)›]#\k+T&gt&" 2+%P?? a9ĭeݏХO+}wQc7zF]\UJ2 F9GR-Swk1zzR$i|'̩Oyn~?w%oNA84venjuċ)nk\95M[qpAl6f@aimodWnF9DK,R H 'Nu|ʙ|H=Ĩ/=V3.G'pf78]myo7.`H h6 ldxZ?u㩗*o9nҺW}*ewI`W4}r%n$ BY{[GDmNHt_(.ݷLGH` L?=,t$b39]>$44@iLsXV_rѦ39w8:ެ^)g3FrHOXI1Y([9tC~TkR2i6ߊQ1fB%f_ƅUtnh .޽}oKd^>޼ Z-ZYC>fuyhPT99(Uƃ+ dP)JUZ nU-E9,JLQ 0aо%cB\:.`fZ8d𿐱|# ppԸ ]EPX#.ٮzRb$tM }䕨>(3 Ï9 Dzn7֡^r~@-@c?{HS#kOwArڱehwO&/C?Úyz 2ûB(1c$oZs8sńZ酢_KWfg m 5M۲mM&y]lRU)59nZhn¢*qYWWS`E`Wy %<9 @OW-ڜzּsqܔ atX˹8N:ye >k[9_T),VϺܾ||{Ұ.>=}armM[ñ!묓iۗOK|'S`Bpfwl5 JF[kwYHo@'_3#̳ rdm Io_ {VRWA9k4@O 0<,,FEj@iwAqi::(hcFa{i IDATT7H;b&_=g F * ~i :uſE̙68r@ spdu'ykF!X)߿]QXÈ1 h_a GqG"jXɡa;e'^ħtY.ak dVt8C"8&HdW-?9dmCoѳ7U̞S?*(Hsـ;C{M0Oq\0ec987C͑lzkUa~)=~ r '4Cn 8qq{$ydYx(lcEJnjҸNjrİZvmZ֮Y#~[Hzڼ=x_߆uu'ЭZu2}^e.oZ/rLƂ?-BE3 x=d ?0|GL؁C?&A^%#0ethΚvzEXZ^&7Rmrv*L׷qH,!,or.!0٨$g~Ohߘd4if`UvbڀMb~wֵu'SC^2](InGKy*xbހt'Уd-Fi@y=?W&<кA}@ϋxsAQ~ڃA@{Gk ~ҞCq,=/V8Kwe\uneW&Sil4 aĢ!?N+,XBAOsR#w/q(ܿ{yyT՛ݬ$7$$N[\؟r&ţc{zwND6A zÞƗa%aO&ofSnI_㆝t%_TgKׯ-cr-Pp'bt_i r̂LK[X%>e Rr|yqq nePv uAu2/as⊫eN+LeіEAw#7VaDY߼)1J' J 0vs?+MEX/{^+˿rIFp_оK!z^z[V8FFCЈx. lJ榚| t 'jNF@Gf'Ͼ$&-cz#< W[U8_|ju wd#'*^5^L[ Tgy$ #3%:GqdD9i :ߒ@OKTݼۮ)$۽Zٖv4ɿbǑ(zf˒mL"MakPm7#8G oő tXӷa}gBµ#5v%fDEKMA! Y:sƭufX?hŸ 8" 7$G{\ uMM8uCNا(JT S'rBnɢ!% 2 u`n|3bTkz/%w-VqSg֘϶IE;|Nn9ЩGYt(7"7y U:wO])iW/5j gq.ơl=zҴF pӃ%hȕ9<ց9SrÍ "_L82O!*C φ}idfW;P-Z8pfgAZ^ZiA/92y1~/Ӫ !r_ ~I@7.=+s8aX*A (5)4J߬N&+˿JJH9uNդ']DžɶMǪ3\Ҵd~/JZ̍ԭo>7޳ho)Kηd] +o4*+=d/$XG>4&g{IC=hdg̈́$|f1l{;Z@5C`Q/ujpA9Qb:NŒt:_9}x?ɜH!L,G)Ees$%3,8Ǔd>lz+pB բsN&^ɕ~OEx2TIy}6+Yظ-@7|C{U;O ƅ?g0llodӾtw\mȺ1<[n?EJ _IIA uy(G5o-Gͥo=됕{)@^w`T&n^`O٭]̛jtܪ[Խ{o)l߼&d6Bn G[]j6d=.sRnMj!oHʼ_]ߧLӇb7ɜc{'BB Cf[KZN&gb2_}ތ$U2a KzL A-0դsʚdffp_ }/V0#9%ՓX{4ldv|оIUV!$ƷN=)+e z IȎ$h8/ 0Ϥ<1s-mk&p2e{R;G΢8~ UⒸ{lBadnlYı 1 ̖}ֻ\: @Ѐیl!E1h<տ-ѝ z0az|dk?)oӗi8QnL a^ǼeMoƲHਘ>Dץ)6{G-=;=/ [:',;K' (n$V6h9dž>QZݳH[W;(ڟƦO} ̔ ;`Y@ cf3lbLivo7C/ØǢ$|nXw/M:N3pIJ{Ö.l3Cau]6e1/Ӹ 2OJ'`|>5oe;.cp 2yEST2p1=VgNX F-("}~4 Fh|B[EL00Krj$*,[YakaO@2{)ݻyWZO%U>~x}7E @ xbЯ_9u 8qoKP1~<6w@ kO؞'ͶǑ*L@ @ Ob-@ A% &@ @ Tb-@ A% &@ @ Tb-@ A% &@ @ Tb-@ A%`s=]e~ׯs ءtZdkQ>h$cwӬ/-Z*$_#J<> py!>Qkwt$ ssG뎭Tm vNP'"2ژo|RNbpG-TS)yJzesc\[b?oؘU` ]kr2eju5[_'|ipj>of2R3BhZ=Zz?"~S%l<%%lRkJlmm -1W<=hvc{7j+l-٫#;7c mfASEO9boo) |j>#O+Ǔ?#{y,-dWVek bkMKY?3zͺeư5'~3c\uv6diK>?{YD9o/a Xood%q,iq)LSx039Èt,>j\֥О%l j yY[fL,5H#_6CU,HӴ&IƜ?M\C+tL\\}\N'%vstFie'}=sA{µU^gaM@Oˑ-}IǮ72Ztd\B9*<4%eǮiN_},ʱ7]"ա&ϳ=. p7dtduf?S9BgsS9`ډx,.wpr9)ז.mg9tIk2dMs9Ɉy^FӼP\brt'NlWժ=uT;WpAf\w͋M$!鐪Zwq%7`Vp{ h|>uK˞>%ȹu}ѕn9C` 5ȿ:עNl߾dlt>;bDH3tl֗kl:Ş>%1W : 8j}[TG8@p\% f|Sc` tGo0Mq. 슟YIڴ$~ƾt/c!dj'xg ߦI3i|?V+ l&9N9@qi0Ϸnu4g#Mӑ}rbaNW 1Cm2Bdzz[n+vlƃ-w{~-f^?+'gb;ɓX%FJთ7y3bڔ9V-مvu|wu7ȥ79S]gYkK /Wxo,o=<|m=C8.%Rc7/6.ͪv%X_7?F)ێ[NM Jhe;v@~.9@΍u|USziJ9q}})N\!?7uLCfq 孎ɚ]r+5* _];B/8zXږC8U>P&%39 RH%{ Lg⟴_M C`KV2g8@5냗3Pƥ&N#dNέ ݽ|@,ʗu9wC'nd|UI)6smOEbX:,]I=}􂾞cfœX;_jYr rȜ|oٗcmskat6L0=x&+UtGgX}a{m&]F2.t4u2aLNiZG_Q/3'{t}Ǭ^R.h7OVZ'u̲r}aѿcIWA9.Juufå{x/u2i S.lu_ƅUtnh  q9{wc_YαoMV,UBzy>ZkP^MP䑯נЊBRU ?פib{a| >a3Yپ.1E,M> o9$O⪳`@G௸( pZ ļ>}z)~ XWz.hQRt(8K>=,Œ _ʗ)zI<ijemfB_,yRJg2y(r*o}= Y|"87[v dd%}ɧJ_ch9O[7Cqbfo *cab{9zl@7܋S IDAT&^-zCV4oG/BևQ_'21|,S29Io %̌5aK 8„BkPÓ<2!J:~߰ V~XUuߜNloFLaخOS]m>h~֤&y|zJkM9W2Zj@ӵ4 v0v4w%g㘴uwӹ \cvSUFEZ~(K@t5h=V?Ro zAf_ԋPfXzvF}7w9Eƨ εC}0Wu:79NW[X,l[txEZV/O |v&QרdJq:IG8 *_aI2oI!"sᡓY ϙȋu&6gjgG1DdXn]c K pFAzБ%mM p+Oo>'8Z- {W"Zڭ$ԍggjxOt;^: #+ykV\/ $cj%˂\ 5 +w _E]ɯpϽ)wj}l,<?Ӌwj3KuIn9Є.J[Y4y34+TҎ7";94.31}^@\j_D5T{Kv7͙&Ψn}wdMD,n68I_phϭh FN>L#Xrq^#z³{ژ#Pή+Dz:~-nC}H yP\UbFzV'0{LAu#> |a1/l,Z7xW@̲c{ǵ.ME\/+˿r9'*JG6|ֻF.-ޯ G]h=Wr ۼrsZNNҝ;H&yDp7ޚ䀵;|O}XO8x?ʯTkE؀HFЏYJD$,ܲ:OhOgJ[a>c5aSeE{ElنWޜƺVw;RR%uWlKugȐg*QelP +ij<^{3}@[ۇ@] t⻩7ş9. $5n8vbцT!BFX?%^S`4Riܨ%Sw{5tsc6vkz=h’Ŭ/qَ\ YDƌ.Xv4/ޣ+U t:;fu7 MJx!lסRUtDc%'؇cc]2ukzL䜈\X>Pj6$eュIvd޸%6yyYM2-d˦9K{\mf$ޣ11_s?43ciY.d)ȪY-hGl>FsbQ%}*K.T, wXo0ܼ|@O5:q~)Է$NI:2ok|>>iT'RmF[HV&|I@{3`qPk8E|p%P‚`د8b;]_8^CYч_ ew ~CG~Ų"f^N;ϪZQdmo3(rQ91[F.vp"լl ]SàKvx0\ٿ24`՞m#-W? lt=Sϱgrf3*&d]t7￀LXYyjC5Q v.䒖&ʏYJ;d y]_9|W-m>߲s81ŗASntL$޻%dF2#~7iY bLh<}L۽Y98уz$FbTd}bї\99(} ޹N"dE2Zj4nK+N`s9 nBdR?5zQzۙ$Hhe倱DƝ;gSۜ]'ȩٰ ҼN4~4 `ݷ+ ǒh]84⿛j7d=Z c?}ʹMwT:>_~G"l!~ubp;&7$^zW^$Gs7qaSEo3f/Q51y~ ƸsNq됙 l;pўI I -J`vƝ▟~fAaS̶ sȏF?bvGٲLoCݙ3z{+p1lhy 1f"m8*bqgovm9AP涨s_14 zͦ3y]̇MdId Qg;' d=1~:b6Ƭ] {Yԝ7=S;?T)E);JQ lK-;|@3Y^_/{bұ1yԪ_ֽ.f{7μkL|TW2L@$ ! F*6jV]׽Gw-˶[jwEwPJQ 6n, 1bLd$3sI23_I&C2s~9's|Bೀc0 _sކ{fmCoԄmpUp )cKcSA_~?,XϏy/xO.do< y_.Xz{ ;R$yFoP{N{$j w(}*-R>kTA_бpӃ)%Cs (qv^ƞ~ţs$j6nൟ#!Z=I݉4& ?.zw}L= Hpwy޿^ū7|Ye;?z?|}#M"~R;VMIW▞;@WWC*d$4__5{=YsI!k,Df0rMh"g03~lOŘfH5C>T^8ҮT9pq8FsIA> 2Tƾ{wx=12^ Bv`Cs8f026BY[Wf0aaǦq5/ %)% x*߫/K/~ fXN9S&ONbBJźDm?_K_wgy3ދW;Gzo?#"\.}-ī\(S#q">r+ޤsφflZJGHNb|{B2nqkCmII.V? Q}GK`Wd """""C& WQm&Pz7%u#k0_` Gk.4v%("""""""q[DDDDDD$`'}u''""""""W!OM"99x'+""""""D )O7 Kgx'+""""""2| sRZܓ{i&γt㝼y ѝ.;?!<#Y$nO$r}I1:{:pz⚶PRHMT,R 5m322]"""""""[DDDDDD$`āl8P-"""""" EDDDDDD@H("""""""q[DDDDDD$`āl8P-"""""" EDDDDDD@H("""""""q[DDDDDD$`āl8P-"""""" EDDDDDD@H("""""""q=O]]==@)fi$$$ĻX"""""""#*?Gk{wdmT7WrwX␗šW~m`%Y3֖o ~mTƂu|Ln=4ʶjߟ9C=ڎe۶sH{בb?1)ed񯃈iDn?J:@6{%Zo/ca"9fXGAhlySkloo d&=# s;hbw@ sak= |-Y{<]v,e4gFJRr2PpbyNb>h42yb:~>>dvN5&nJ~168/r'KU+EDDA/ ѲYvTh`qFXj/[bwJ=ɣ S ~Sᆭǔ-|wy3TM?(e a*_/^dž塋\ ٸ7 شo7[Ff0>{0jymB_hD>]]/cA/Qt_;)] a뿶hvmNi}ҡgaW2V;4FZzG2~1#7 Ta-k+gn!~^/<"""r$2^h|ͭ|goPЂ`r!ơCx̀>}V#tp P.Z]7ؽu!k~?SGXXM/Z̶t az m R6]Q1fV.tqScmP;ZR`uV o/m'[C^?zj1AUͿQT7{o}rso K ήbӃtw/` CdYц\:xvcΓ@H |èQ<1yPy'L#C)\`> sG9N-7ޑ`=CKX`0|}#5N#""""0"t(-ƺwﳺb` Je8IZ 6~ mƇȨגk6Kylߛfl>ߞyz3(H.7ܳí'_٘[Û<;!ǝCw{o|3.$:>(!׃5T@J&OM l]4?ڻ0 ɾ%tU˹v\.)N[)xW0oWsޅ` 35u;q>ˋ~v.:Xz D,Khnj+䏘7~yN$IQf2ࠡ 7bW7.7~-,OBP꫏n+Aj?]K8wk2fnﭏ<o h}tĂ;8 q0bʞqRp ncZ\VvcHdS8u"̊.۰e^gk~zV+io&YǶA#"""kQ6dQzw9tcXNsw8V*ݸg̫zqB3l#6G:9LH |%Mֆ_F|츂mL /]~Sߏ waC~u؝4ۗ0+}UAYE˸{Dz XIâݩ3dfu `?]uHnfoE#+rHwRQo~_sqFެiwuW{C%;>lAIJɡZ<ojN']ZW'FJ7\ hYt=f7'*wʅvWӵGqqnwЮl m"tI!&DWZ[g"?6H l?I#?y+dcnX>esv1lM'p,ӧGSK;E}&+@6C] X%̙CZb3NnQ^6)Ko{D<n>9=FFW$H#֦8JrN}L\=~ FW;ʸ`,SFMp0F`;lX,l])dcbOq`N~l9OS)>낤dODS0.JX[N)3s#rGW 뚱;$gr+X\S'a )MFVvF,n)bpOdn7nw23n_N㧻qX>rVĝ%J 0xt[zaw8ǩ1坘FruIToΌiyLe_]$ @6s }ҮS ӹ/y޺桊Oq:p|r 7&K~sc ADF67}Y>DpFt2\lX$fݧk;boP~K3Oywc>񛧸oSmm,sz63(_ m1s:ӖS쭜\„)S<_QN;8xry6Ngi4I]uۻɿDԩQv@^Nf\ucʝIF]*`L#{tn)D7]sVNPЖLђ(魂q wR_5>z}pru:՗#uց;hFY}ǚw`abb&%K#o^ \zsmt݀'Κg#o>E'=h;k'23HkON;( 5 Zh`ꬩK6cf?a҅q\AK$bysu=KQ=}sٛ8\׻g2cML24r&B:""""=N2^rV[N-`jm5AL3b M˷7? orߍAW<1=&{tRZ2 [ wҵܐm7x$5K$OCQ?9h>>>nbth?LKaVgcbp8iiݓL"͔՛swOaBHyջOcZS&^Gc@MzM7%vMM%dBn_`w.SgNz,'i;dzR;ޣzvlg@3'Q 7OFt'X[C:p00k^^L/c8|)ȘAVZmv*$/o~/%p׃IKa)1"""2P )ꆭ l59Tx M_}66=3`;&bK. }ŦU[jxn7B^Î29k{:a3{٧?xq^q/C/ [:h;Aɽq>gO[1 ӡM_^M1.q]0-޳m6:DBxo>#y1hhwmΈ%8[3)cy9߯;mGALtl3Ɲu;u|̇V k7ckiV\Gǒ!im zO.cudP(ն @e&q$!v0dO;}Xa 70'í>0Ϡ0qc{(v-=_6;)9?gO S$;2;|:%S\>-m!hnvPZxR/]Κ#hfJ\L@6ģUoy aC#,]lԺ kPߕf#l(_<{yCSwVb3@ &^Ul&c݂|s0]Nut~*ٹoDS{I90.KURwۇb_ [kwouF WQ{'_kbBjZȲ׿8f>;%g9̟TûgkRݛ*bm.,\<p2>6pOԻ$Eދ-o^y3Piޝ1lzriPg<[1եmW'7J¤c2Ke]vCE$6,%V?e9D\DbETUDDD`Ȑ(h 42`|(ĄK]+YBBB}"ڥ.D@ť.7e3EKgVY\&'""""""2l$2M-$;j?Pn+_IENDB`flower-0.8.3/docs/screenshots.rst0000644000076500000240000000121112326704261017116 0ustar mherstaff00000000000000Screenshots =========== Worker dashboard: .. image:: screenshots/dashboard.png :width: 100% Task dashboard: .. image:: screenshots/tasks.png :width: 100% Worker tasks: .. image:: screenshots/worker-tasks.png :width: 100% Graphs: .. image:: screenshots/monitor.png :width: 100% Worker info: .. image:: screenshots/pool.png :width: 100% .. image:: screenshots/broker.png :width: 100% .. image:: screenshots/limits.png :width: 100% .. image:: screenshots/queues.png :width: 100% Task info: .. image:: screenshots/task.png :width: 100% Configuration viewer: .. image:: screenshots/config.png :width: 100% flower-0.8.3/docs/tasks.py0000644000076500000240000000052012324702473015526 0ustar mherstaff00000000000000from celery import Celery from time import sleep celery = Celery() celery.config_from_object({ 'BROKER_URL': 'amqp://10.0.2.2', 'CELERY_RESULT_BACKEND': 'amqp://', 'CELERYD_POOL_RESTARTS': True, }) @celery.task def add(x, y): return x + y @celery.task def sub(x, y): sleep(30) # Simulate work return x - y flower-0.8.3/docs/tasks_filter.rst0000644000076500000240000000122512561016565017261 0ustar mherstaff00000000000000Tasks filtering =============== By now, tasks can be filtered by worker, type, state, received and started datetime. Also, filtering by args/kwargs/result value available. Task filter syntax ------------------ Flower uses github-style syntax for args/kwargs/result filtering. - `foo` find all tasks containing foo in args, kwargs or result - `args:foo` find all tasks containing foo in arguments - `kwargs:foo=bar` find all tasks containing foo=bar keyword - `result:foo` find all tasks containing foo in result If the search term contains spaces it should be enclosed in " (e.g. `args:"hello world"`). For examples, see `tests/utils/test_search.py`. flower-0.8.3/flower/0000755000076500000240000000000012561016723014377 5ustar mherstaff00000000000000flower-0.8.3/flower/__init__.py0000644000076500000240000000014612561016633016511 0ustar mherstaff00000000000000from __future__ import absolute_import VERSION = (0, 8, 3) __version__ = '.'.join(map(str, VERSION)) flower-0.8.3/flower/__main__.py0000644000076500000240000000061312502222677016473 0ustar mherstaff00000000000000from __future__ import absolute_import from __future__ import print_function from flower.command import FlowerCommand from flower.utils import bugreport def main(): try: flower = FlowerCommand() flower.execute_from_commandline() except: import sys print(bugreport(app=flower.app), file=sys.stderr) raise if __name__ == "__main__": main() flower-0.8.3/flower/api/0000755000076500000240000000000012561016723015150 5ustar mherstaff00000000000000flower-0.8.3/flower/api/__init__.py0000644000076500000240000000107412405107470017260 0ustar mherstaff00000000000000from __future__ import absolute_import import tornado.websocket class BaseWebSocketHandler(tornado.websocket.WebSocketHandler): # listeners = [], should be created in derived class def open(self): listeners = self.listeners listeners.append(self) def on_message(self, message): pass def on_close(self): listeners = self.listeners if self in listeners: listeners.remove(self) @classmethod def send_message(cls, message): for l in cls.listeners: l.write_message(message) flower-0.8.3/flower/api/control.py0000644000076500000240000004204412561016565017212 0ustar mherstaff00000000000000from __future__ import absolute_import import time import logging import collections from tornado import web from tornado import gen from ..views import BaseHandler logger = logging.getLogger(__name__) class ControlHandler(BaseHandler): INSPECT_METHODS = ('stats', 'active_queues', 'registered', 'scheduled', 'active', 'reserved', 'revoked', 'conf') worker_cache = collections.defaultdict(dict) @gen.coroutine def update_cache(self, workername=None): yield self.update_workers(workername=workername, app=self.application) @classmethod @gen.coroutine def update_workers(cls, app, workername=None): logger.debug("Updating %s worker's cache...", workername or 'all') futures = [] destination = [workername] if workername else None timeout = app.options.inspect_timeout / 1000.0 inspect = app.capp.control.inspect( timeout=timeout, destination=destination) for method in cls.INSPECT_METHODS: futures.append(app.delay(getattr(inspect, method))) results = yield futures for i, result in enumerate(results): if result is None: logger.warning("'%s' inspect method failed", cls.INSPECT_METHODS[i]) continue for worker, response in result.items(): if response: info = cls.worker_cache[worker] info[cls.INSPECT_METHODS[i]] = response info['timestamp'] = time.time() def is_worker(self, workername): return workername and workername in self.worker_cache def error_reason(self, workername, response): "extracts error message from response" for r in response: try: return r[workername].get('error', 'Unknown reason') except KeyError: pass logger.error("Failed to extract error reason from '%s'", response) return 'Unknown reason' @classmethod def get_active_queue_names(cls): queues = set([]) for worker, info in cls.worker_cache.items(): for q in info.get('active_queues', []): queues.add(q['name']) return queues class WorkerShutDown(ControlHandler): @web.authenticated def post(self, workername): """ Shut down a worker **Example request**: .. sourcecode:: http POST /api/worker/shutdown/celery@worker2 HTTP/1.1 Content-Length: 0 Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 29 Content-Type: application/json; charset=UTF-8 { "message": "Shutting down!" } :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 404: unknown worker """ if not self.is_worker(workername): raise web.HTTPError(404, "Unknown worker '%s'" % workername) logger.info("Shutting down '%s' worker", workername) self.capp.control.broadcast('shutdown', destination=[workername]) self.write(dict(message="Shutting down!")) class WorkerPoolRestart(ControlHandler): @web.authenticated def post(self, workername): """ Restart worker's pool **Example request**: .. sourcecode:: http POST /api/worker/pool/restart/celery@worker2 HTTP/1.1 Content-Length: 0 Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 56 Content-Type: application/json; charset=UTF-8 { "message": "Restarting 'celery@worker2' worker's pool" } :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 403: pool restart is not enabled (see CELERYD_POOL_RESTARTS) :statuscode 404: unknown worker """ if not self.is_worker(workername): raise web.HTTPError(404, "Unknown worker '%s'" % workername) logger.info("Restarting '%s' worker's pool", workername) response = self.capp.control.broadcast( 'pool_restart', arguments={'reload': False}, destination=[workername], reply=True) if response and 'ok' in response[0][workername]: self.write(dict( message="Restarting '%s' worker's pool" % workername)) else: logger.error(response) self.set_status(403) self.write("Failed to restart the '%s' pool: %s" % ( workername, self.error_reason(workername, response) )) class WorkerPoolGrow(ControlHandler): @web.authenticated def post(self, workername): """ Grow worker's pool **Example request**: .. sourcecode:: http POST /api/worker/pool/grow/celery@worker2?n=3 HTTP/1.1 Content-Length: 0 Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 58 Content-Type: application/json; charset=UTF-8 { "message": "Growing 'celery@worker2' worker's pool by 3" } :query n: number of pool processes to grow, default is 1 :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 403: failed to grow :statuscode 404: unknown worker """ if not self.is_worker(workername): raise web.HTTPError(404, "Unknown worker '%s'" % workername) n = self.get_argument('n', default=1, type=int) logger.info("Growing '%s' worker's pool by '%s'", workername, n) response = self.capp.control.pool_grow( n=n, reply=True, destination=[workername]) if response and 'ok' in response[0][workername]: self.write(dict( message="Growing '%s' worker's pool by %s" % (workername, n))) else: logger.error(response) self.set_status(403) self.write("Failed to grow '%s' worker's pool: %s" % ( workername, self.error_reason(workername, response))) class WorkerPoolShrink(ControlHandler): @web.authenticated def post(self, workername): """ Shrink worker's pool **Example request**: .. sourcecode:: http POST /api/worker/pool/shrink/celery@worker2 HTTP/1.1 Content-Length: 0 Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 60 Content-Type: application/json; charset=UTF-8 { "message": "Shrinking 'celery@worker2' worker's pool by 1" } :query n: number of pool processes to shrink, default is 1 :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 403: failed to shrink :statuscode 404: unknown worker """ if not self.is_worker(workername): raise web.HTTPError(404, "Unknown worker '%s'" % workername) n = self.get_argument('n', default=1, type=int) logger.info("Shrinking '%s' worker's pool by '%s'", workername, n) response = self.capp.control.pool_shrink( n=n, reply=True, destination=[workername]) if response and 'ok' in response[0][workername]: self.write(dict(message="Shrinking '%s' worker's pool by %s" % ( workername, n))) else: logger.error(response) self.set_status(403) self.write("Failed to shrink '%s' worker's pool: %s" % ( workername, self.error_reason(workername, response) )) class WorkerPoolAutoscale(ControlHandler): @web.authenticated def post(self, workername): """ Autoscale worker pool **Example request**: .. sourcecode:: http POST /api/worker/pool/autoscale/celery@worker2?min=3&max=10 HTTP/1.1 Content-Length: 0 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 66 Content-Type: application/json; charset=UTF-8 { "message": "Autoscaling 'celery@worker2' worker (min=3, max=10)" } :query min: minimum number of pool processes :query max: maximum number of pool processes :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 403: autoscaling is not enabled (see CELERYD_AUTOSCALER) :statuscode 404: unknown worker """ if not self.is_worker(workername): raise web.HTTPError(404, "Unknown worker '%s'" % workername) min = self.get_argument('min', type=int) max = self.get_argument('max', type=int) logger.info("Autoscaling '%s' worker by '%s'", workername, (min, max)) response = self.capp.control.broadcast( 'autoscale', arguments={'min': min, 'max': max}, destination=[workername], reply=True) if response and 'ok' in response[0][workername]: self.write(dict(message="Autoscaling '%s' worker " "(min=%s, max=%s)" % ( workername, min, max))) else: logger.error(response) self.set_status(403) self.write("Failed to autoscale '%s' worker: %s" % ( workername, self.error_reason(workername, response) )) class WorkerQueueAddConsumer(ControlHandler): @web.authenticated def post(self, workername): """ Start consuming from a queue **Example request**: .. sourcecode:: http POST /api/worker/queue/add-consumer/celery@worker2?queue=sample-queue Content-Length: 0 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 40 Content-Type: application/json; charset=UTF-8 { "message": "add consumer sample-queue" } :query queue: the name of a new queue :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 403: failed to add consumer :statuscode 404: unknown worker """ if not self.is_worker(workername): raise web.HTTPError(404, "Unknown worker '%s'" % workername) queue = self.get_argument('queue') logger.info("Adding consumer '%s' to worker '%s'", queue, workername) response = self.capp.control.broadcast( 'add_consumer', arguments={'queue': queue}, destination=[workername], reply=True) if response and 'ok' in response[0][workername]: self.write(dict(message=response[0][workername]['ok'])) else: logger.error(response) self.set_status(403) self.write("Failed to add '%s' consumer to '%s' worker: %s" % ( queue, workername, self.error_reason(workername, response) )) class WorkerQueueCancelConsumer(ControlHandler): @web.authenticated def post(self, workername): """ Stop consuming from a queue **Example request**: .. sourcecode:: http POST /api/worker/queue/cancel-consumer/celery@worker2?queue=sample-queue Content-Length: 0 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 52 Content-Type: application/json; charset=UTF-8 { "message": "no longer consuming from sample-queue" } :query queue: the name of queue :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 403: failed to cancel consumer :statuscode 404: unknown worker """ if not self.is_worker(workername): raise web.HTTPError(404, "Unknown worker '%s'" % workername) queue = self.get_argument('queue') logger.info("Canceling consumer '%s' from worker '%s'", queue, workername) response = self.capp.control.broadcast( 'cancel_consumer', arguments={'queue': queue}, destination=[workername], reply=True) if response and 'ok' in response[0][workername]: self.write(dict(message=response[0][workername]['ok'])) else: logger.error(response) self.set_status(403) self.write( "Failed to cancel '%s' consumer from '%s' worker: %s" % ( queue, workername, self.error_reason(workername, response) )) class TaskRevoke(ControlHandler): @web.authenticated def post(self, taskid): """ Revoke a task **Example request**: .. sourcecode:: http POST /api/task/revoke/1480b55c-b8b2-462c-985e-24af3e9158f9?terminate=true Content-Length: 0 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 61 Content-Type: application/json; charset=UTF-8 { "message": "Revoked '1480b55c-b8b2-462c-985e-24af3e9158f9'" } :query terminate: terminate the task if it is running :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request """ logger.info("Revoking task '%s'", taskid) terminate = self.get_argument('terminate', default=False, type=bool) self.capp.control.revoke(taskid, terminate=terminate) self.write(dict(message="Revoked '%s'" % taskid)) class TaskTimout(ControlHandler): @web.authenticated def post(self, taskname): """ Change soft and hard time limits for a task **Example request**: .. sourcecode:: http POST /api/task/timeout/tasks.sleep HTTP/1.1 Content-Length: 44 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Host: localhost:5555 soft=30&hard=100&workername=celery%40worker1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 46 Content-Type: application/json; charset=UTF-8 { "message": "new rate limit set successfully" } :query workername: worker name :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 404: unknown task/worker """ workername = self.get_argument('workername') hard = self.get_argument('hard', default=None, type=float) soft = self.get_argument('soft', default=None, type=float) if taskname not in self.capp.tasks: raise web.HTTPError(404, "Unknown task '%s'" % taskname) if workername is not None and not self.is_worker(workername): raise web.HTTPError(404, "Unknown worker '%s'" % workername) logger.info("Setting timeouts for '%s' task (%s, %s)", taskname, soft, hard) destination = [workername] if workername is not None else None response = self.capp.control.time_limit( taskname, reply=True, hard=hard, soft=soft, destination=destination) if response and 'ok' in response[0][workername]: self.write(dict(message=response[0][workername]['ok'])) else: logger.error(response) self.set_status(403) self.write("Failed to set timeouts: '%s'" % self.error_reason(taskname, response)) class TaskRateLimit(ControlHandler): @web.authenticated def post(self, taskname): """ Change rate limit for a task **Example request**: .. sourcecode:: http POST /api/task/rate-limit/tasks.sleep HTTP/1.1 Content-Length: 41 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Host: localhost:5555 ratelimit=200&workername=celery%40worker1 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 61 Content-Type: application/json; charset=UTF-8 { "message": "Revoked '1480b55c-b8b2-462c-985e-24af3e9158f9'" } :query workername: worker name :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 404: unknown task/worker """ workername = self.get_argument('workername') ratelimit = self.get_argument('ratelimit') if taskname not in self.capp.tasks: raise web.HTTPError(404, "Unknown task '%s'" % taskname) if workername is not None and not self.is_worker(workername): raise web.HTTPError(404, "Unknown worker '%s'" % workername) logger.info("Setting '%s' rate limit for '%s' task", ratelimit, taskname) destination = [workername] if workername is not None else None response = self.capp.control.rate_limit( taskname, ratelimit, reply=True, destination=destination) if response and 'ok' in response[0][workername]: self.write(dict(message=response[0][workername]['ok'])) else: logger.error(response) self.set_status(403) self.write("Failed to set rate limit: '%s'" % self.error_reason(taskname, response)) flower-0.8.3/flower/api/events.py0000644000076500000240000000172512405107470017030 0ustar mherstaff00000000000000from __future__ import absolute_import import sys from ..api import BaseWebSocketHandler class EventsApiHandler(BaseWebSocketHandler): def open(self, task_id=None): BaseWebSocketHandler.open(self) self.task_id = task_id @classmethod def send_message(cls, event): for l in cls.listeners: if not l.task_id or l.task_id == event['uuid']: l.write_message(event) EVENTS = ('task-sent', 'task-received', 'task-started', 'task-succeeded', 'task-failed', 'task-revoked', 'task-retried') def getClassName(eventname): return ''.join(map(lambda x: x[0].upper() + x[1:], eventname.split('-'))) # Dynamically generates handler classes thismodule = sys.modules[__name__] for event in EVENTS: classname = getClassName(event) setattr(thismodule, classname, type(classname, (EventsApiHandler, ), {'listeners': []})) __all__ = list(map(getClassName, EVENTS)) __all__.append(getClassName) flower-0.8.3/flower/api/tasks.py0000644000076500000240000003541312561016565016661 0ustar mherstaff00000000000000from __future__ import absolute_import import json import logging from datetime import datetime from threading import Thread from tornado import web from tornado import gen from tornado.escape import json_decode from tornado.web import HTTPError from celery import states from celery.result import AsyncResult from celery.backends.base import DisabledBackend from ..utils import tasks from ..views import BaseHandler from ..utils.broker import Broker from ..api.control import ControlHandler logger = logging.getLogger(__name__) class BaseTaskHandler(BaseHandler): def get_task_args(self): try: body = self.request.body options = json_decode(body) if body else {} except ValueError as e: raise HTTPError(400, str(e)) args = options.pop('args', []) kwargs = options.pop('kwargs', {}) if not isinstance(args, (list, tuple)): raise HTTPError(400, 'args must be an array') return args, kwargs, options @staticmethod def backend_configured(result): return not isinstance(result.backend, DisabledBackend) def write_error(self, status_code, **kwargs): self.set_status(status_code) def update_response_result(self, response, result): if result.state == states.FAILURE: response.update({'result': self.safe_result(result.result), 'traceback': result.traceback}) else: response.update({'result': self.safe_result(result.result)}) def normalize_options(self, options): if 'eta' in options: options['eta'] = datetime.strptime(options['eta'], self.DATE_FORMAT) if 'countdown' in options: options['countdown'] = float(options['countdown']) if 'expires' in options: expires = options['expires'] try: expires = float(expires) except ValueError: expires = datetime.strptime(expires, self.DATE_FORMAT) options['expires'] = expires def safe_result(self, result): "returns json encodable result" try: json.dumps(result) except TypeError: return repr(result) else: return result class TaskApply(BaseTaskHandler): @web.authenticated @web.asynchronous def post(self, taskname): """ Execute a task by name and wait results **Example request**: .. sourcecode:: http POST /api/task/apply/tasks.add HTTP/1.1 Accept: application/json Accept-Encoding: gzip, deflate, compress Content-Length: 16 Content-Type: application/json; charset=utf-8 Host: localhost:5555 { "args": [1, 2] } **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 71 Content-Type: application/json; charset=UTF-8 { "state": "SUCCESS", "task-id": "c60be250-fe52-48df-befb-ac66174076e6", "result": 3 } :query args: a list of arguments :query kwargs: a dictionary of arguments :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 404: unknown task """ args, kwargs, options = self.get_task_args() logger.debug("Invoking a task '%s' with '%s' and '%s'", taskname, args, kwargs) try: task = self.capp.tasks[taskname] except KeyError: raise HTTPError(404, "Unknown task '%s'" % taskname) try: self.normalize_options(options) except ValueError: raise HTTPError(400, 'Invalid option') result = task.apply_async(args=args, kwargs=kwargs, **options) response = {'task-id': result.task_id} # In tornado for not blocking event loop we must return results # from other thread by self.finish() th = Thread(target=self.wait_results, args=(result, response, )) th.start() # So just exit def wait_results(self, result, response): # Wait until task finished and do not raise anything r = result.get(propagate=False) # Write results and finish async function self.update_response_result(response, result) if self.backend_configured(result): response.update(state=result.state) self.finish(response) class TaskAsyncApply(BaseTaskHandler): DATE_FORMAT = '%Y-%m-%d %H:%M:%S.%f' @web.authenticated def post(self, taskname): """ Execute a task **Example request**: .. sourcecode:: http POST /api/task/async-apply/tasks.add HTTP/1.1 Accept: application/json Accept-Encoding: gzip, deflate, compress Content-Length: 16 Content-Type: application/json; charset=utf-8 Host: localhost:5555 { "args": [1, 2] } **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 71 Content-Type: application/json; charset=UTF-8 Date: Sun, 13 Apr 2014 15:55:00 GMT { "state": "PENDING", "task-id": "abc300c7-2922-4069-97b6-a635cc2ac47c" } :query args: a list of arguments :query kwargs: a dictionary of arguments :query options: a dictionary of `apply_async` keyword arguments :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 404: unknown task """ args, kwargs, options = self.get_task_args() logger.debug("Invoking a task '%s' with '%s' and '%s'", taskname, args, kwargs) try: task = self.capp.tasks[taskname] except KeyError: raise HTTPError(404, "Unknown task '%s'" % taskname) try: self.normalize_options(options) except ValueError: raise HTTPError(400, 'Invalid option') result = task.apply_async(args=args, kwargs=kwargs, **options) response = {'task-id': result.task_id} if self.backend_configured(result): response.update(state=result.state) self.write(response) class TaskSend(BaseTaskHandler): @web.authenticated def post(self, taskname): """ Execute a task by name (doesn't require task sources) **Example request**: .. sourcecode:: http POST /api/task/send-task/tasks.add HTTP/1.1 Accept: application/json Accept-Encoding: gzip, deflate, compress Content-Length: 16 Content-Type: application/json; charset=utf-8 Host: localhost:5555 { "args": [1, 2] } **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 71 Content-Type: application/json; charset=UTF-8 { "state": "SUCCESS", "task-id": "c60be250-fe52-48df-befb-ac66174076e6" } :query args: a list of arguments :query kwargs: a dictionary of arguments :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 404: unknown task """ args, kwargs, options = self.get_task_args() logger.debug("Invoking task '%s' with '%s' and '%s'", taskname, args, kwargs) result = self.capp.send_task( taskname, args=args, kwargs=kwargs, **options) response = {'task-id': result.task_id} if self.backend_configured(result): response.update(state=result.state) self.write(response) class TaskResult(BaseTaskHandler): @web.authenticated def get(self, taskid): """ Get a task result **Example request**: .. sourcecode:: http GET /api/task/result/c60be250-fe52-48df-befb-ac66174076e6 HTTP/1.1 Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 84 Content-Type: application/json; charset=UTF-8 { "result": 3, "state": "SUCCESS", "task-id": "c60be250-fe52-48df-befb-ac66174076e6" } :query timeout: how long to wait, in seconds, before the operation times out :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 503: result backend is not configured """ timeout = self.get_argument('timeout', None) timeout = float(timeout) if timeout is not None else None result = AsyncResult(taskid) if not self.backend_configured(result): raise HTTPError(503) response = {'task-id': taskid, 'state': result.state} if timeout: result.get(timeout=timeout, propagate=False) self.update_response_result(response, result) elif result.ready(): self.update_response_result(response, result) self.write(response) class GetQueueLengths(BaseTaskHandler): @web.authenticated @gen.coroutine def get(self): app = self.application broker_options = self.capp.conf.BROKER_TRANSPORT_OPTIONS http_api = None if app.transport == 'amqp' and app.options.broker_api: http_api = app.options.broker_api broker = Broker(app.capp.connection().as_uri(include_password=True), http_api=http_api, broker_options=broker_options) queue_names = ControlHandler.get_active_queue_names() if not queue_names: queue_names = set([self.capp.conf.CELERY_DEFAULT_QUEUE]) queues = yield broker.queues(sorted(queue_names)) self.write({'active_queues': queues}) class ListTasks(BaseTaskHandler): @web.authenticated def get(self): """ List tasks **Example request**: .. sourcecode:: http GET /api/tasks HTTP/1.1 Host: localhost:5555 User-Agent: HTTPie/0.8.0 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 1109 Content-Type: application/json; charset=UTF-8 Etag: "b2478118015c8b825f7b88ce6b660e5449746c37" Server: TornadoServer/3.1.1 { "e42ceb2d-8730-47b5-8b4d-8e0d2a1ef7c9": { "args": "[3, 4]", "client": null, "clock": 1079, "eta": null, "exception": null, "exchange": null, "expires": null, "failed": null, "kwargs": "{}", "name": "tasks.add", "received": 1398505411.107885, "result": "'7'", "retried": null, "retries": 0, "revoked": null, "routing_key": null, "runtime": 0.01610181899741292, "sent": null, "started": 1398505411.108985, "state": "SUCCESS", "succeeded": 1398505411.124802, "timestamp": 1398505411.124802, "traceback": null, "uuid": "e42ceb2d-8730-47b5-8b4d-8e0d2a1ef7c9" }, "f67ea225-ae9e-42a8-90b0-5de0b24507e0": { "args": "[1, 2]", "client": null, "clock": 1042, "eta": null, "exception": null, "exchange": null, "expires": null, "failed": null, "kwargs": "{}", "name": "tasks.add", "received": 1398505395.327208, "result": "'3'", "retried": null, "retries": 0, "revoked": null, "routing_key": null, "runtime": 0.012884548006695695, "sent": null, "started": 1398505395.3289, "state": "SUCCESS", "succeeded": 1398505395.341089, "timestamp": 1398505395.341089, "traceback": null, "uuid": "f67ea225-ae9e-42a8-90b0-5de0b24507e0" } } :query limit: maximum number of tasks :query workername: filter task by workername :query taskname: filter tasks by taskname :query state: filter tasks by state :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request """ app = self.application limit = self.get_argument('limit', None) worker = self.get_argument('workername', None) type = self.get_argument('taskname', None) state = self.get_argument('state', None) limit = limit and int(limit) worker = worker if worker != 'All' else None type = type if type != 'All' else None state = state if state != 'All' else None result = [] for task_id, task in tasks.iter_tasks( app.events, limit=limit, type=type, worker=worker, state=state): task = task.as_dict() task.pop('worker') result.append((task_id, task)) self.write(dict(result)) class ListTaskTypes(BaseTaskHandler): @web.authenticated def get(self): """ List (seen) task types **Example request**: .. sourcecode:: http GET /api/task/types HTTP/1.1 Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 44 Content-Type: application/json; charset=UTF-8 { "task-types": [ "tasks.add", "tasks.sleep" ] } :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request """ seen_task_types = self.application.events.state.task_types() response = {} response['task-types'] = seen_task_types self.write(response) class TaskInfo(BaseTaskHandler): @web.authenticated def get(self, taskid): """ Get a task info **Example request**: .. sourcecode:: http GET /api/task/info/91396550-c228-4111-9da4-9d88cfd5ddc6 HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate, compress Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 575 Content-Type: application/json; charset=UTF-8 { "args": "[2, 2]", "client": null, "clock": 25, "eta": null, "exception": null, "exchange": null, "expires": null, "failed": null, "kwargs": "{}", "name": "tasks.add", "received": 1400806241.970742, "result": "'4'", "retried": null, "retries": null, "revoked": null, "routing_key": null, "runtime": 2.0037889280356467, "sent": null, "started": 1400806241.972624, "state": "SUCCESS", "succeeded": 1400806243.975336, "task-id": "91396550-c228-4111-9da4-9d88cfd5ddc6", "timestamp": 1400806243.975336, "traceback": null, "worker": "celery@worker1" } :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request :statuscode 404: unknown task """ task = tasks.get_task_by_id(self.application.events, taskid) if not task: raise HTTPError(404, "Unknown task '%s'" % taskid) response = {} for name in task._fields: if name not in ['uuid', 'worker']: response[name] = getattr(task, name, None) response['task-id'] = task.uuid response['worker'] = task.worker.hostname self.write(response) flower-0.8.3/flower/api/workers.py0000644000076500000240000001263512561016565017231 0ustar mherstaff00000000000000from __future__ import absolute_import import logging from tornado import web from tornado import gen from .control import ControlHandler logger = logging.getLogger(__name__) class ListWorkers(ControlHandler): @web.authenticated @gen.coroutine def get(self): """ List workers **Example request**: .. sourcecode:: http GET /api/workers HTTP/1.1 Host: localhost:5555 **Example response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Length: 1526 Content-Type: application/json; charset=UTF-8 Date: Tue, 28 Jul 2015 01:32:38 GMT Etag: "fcdd75d85a82b4052275e28871d199aac1ece21c" Server: TornadoServer/4.0.2 { "celery@worker1": { "active_queues": [ { "alias": null, "auto_delete": false, "binding_arguments": null, "bindings": [], "durable": true, "exchange": { "arguments": null, "auto_delete": false, "delivery_mode": 2, "durable": true, "name": "celery", "passive": false, "type": "direct" }, "exclusive": false, "name": "celery", "no_ack": false, "queue_arguments": null, "routing_key": "celery" } ], "conf": { "CELERYBEAT_SCHEDULE": {}, "CELERY_INCLUDE": [ "celery.app.builtins", "__main__" ], "CELERY_SEND_TASK_SENT_EVENT": true, "CELERY_TIMEZONE": "UTC" }, "registered": [ "tasks.add", "tasks.echo", "tasks.error", "tasks.retry", "tasks.sleep" ], "stats": { "broker": { "alternates": [], "connect_timeout": 4, "heartbeat": null, "hostname": "127.0.0.1", "insist": false, "login_method": "AMQPLAIN", "port": 5672, "ssl": false, "transport": "amqp", "transport_options": {}, "uri_prefix": null, "userid": "guest", "virtual_host": "/" }, "clock": "918", "pid": 90494, "pool": { "max-concurrency": 4, "max-tasks-per-child": "N/A", "processes": [ 90499, 90500, 90501, 90502 ], "put-guarded-by-semaphore": false, "timeouts": [ 0, 0 ], "writes": { "all": "100.00%", "avg": "100.00%", "inqueues": { "active": 0, "total": 4 }, "raw": "1", "total": 1 } }, "prefetch_count": 16, "rusage": { "idrss": 0, "inblock": 211, "isrss": 0, "ixrss": 0, "majflt": 6, "maxrss": 26996736, "minflt": 11450, "msgrcv": 4968, "msgsnd": 1227, "nivcsw": 1367, "nsignals": 0, "nswap": 0, "nvcsw": 1855, "oublock": 93, "stime": 0.414564, "utime": 0.975726 }, "total": { "tasks.add": 1 } }, "timestamp": 1438049312.073402 } } :query refresh: run inspect to get updated list of workers :query workername: get info for workername :query status: only get worker status info :reqheader Authorization: optional OAuth token to authenticate :statuscode 200: no error :statuscode 401: unauthorized request """ refresh = self.get_argument('refresh', default=False, type=bool) status = self.get_argument('status', default=False, type=bool) workername = self.get_argument('workername', default=None) if status: info = {} for name, worker in self.application.events.state.workers.items(): info[name] = worker.alive self.write(info) return if self.worker_cache and not refresh and\ workername in self.worker_cache: self.write({workername: self.worker_cache[workername]}) return if refresh: try: yield self.update_cache(workername=workername) except Exception as e: msg = "Failed to update workers: %s" % e logger.error(msg) raise web.HTTPError(503, msg) if workername and not self.is_worker(workername): raise web.HTTPError(404, "Unknown worker '%s'" % workername) if workername: self.write({workername: self.worker_cache[workername]}) else: self.write(self.worker_cache) flower-0.8.3/flower/app.py0000644000076500000240000000420012517232767015536 0ustar mherstaff00000000000000from __future__ import absolute_import import logging from functools import partial from concurrent.futures import ThreadPoolExecutor import celery import tornado.web from tornado import ioloop from .api import control from .urls import handlers from .events import Events from .options import default_options logger = logging.getLogger(__name__) class Flower(tornado.web.Application): pool_executor_cls = ThreadPoolExecutor max_workers = 4 def __init__(self, options=None, capp=None, events=None, io_loop=None, **kwargs): kwargs.update(handlers=handlers) super(Flower, self).__init__(**kwargs) self.options = options or default_options self.io_loop = io_loop or ioloop.IOLoop.instance() self.ssl_options = kwargs.get('ssl_options', None) self.capp = capp or celery.Celery() self.events = events or Events(self.capp, db=self.options.db, persistent=self.options.persistent, enable_events=self.options.enable_events, io_loop=self.io_loop, max_tasks_in_memory=self.options.max_tasks) self.started = False def start(self): self.pool = self.pool_executor_cls(max_workers=self.max_workers) self.events.start() self.listen(self.options.port, address=self.options.address, ssl_options=self.ssl_options, xheaders=self.options.xheaders) self.io_loop.add_future( control.ControlHandler.update_workers(app=self), callback=lambda x: logger.debug('Successfully updated worker cache')) self.started = True self.io_loop.start() def stop(self): if self.started: self.events.stop() self.pool.shutdown(wait=False) self.started = False def delay(self, method, *args, **kwargs): return self.pool.submit(partial(method, *args, **kwargs)) @property def transport(self): return getattr(self.capp.connection().transport, 'driver_type', None) flower-0.8.3/flower/command.py0000644000076500000240000001000212561016565016364 0ustar mherstaff00000000000000from __future__ import absolute_import from __future__ import print_function import os import sys import atexit import signal import logging from pprint import pformat from tornado.options import options from tornado.options import parse_command_line, parse_config_file from tornado.log import enable_pretty_logging from celery.bin.base import Command from . import __version__ from .app import Flower from .urls import settings from .utils import abs_path from .options import DEFAULT_CONFIG_FILE logger = logging.getLogger(__name__) class FlowerCommand(Command): ENV_VAR_PREFIX = 'FLOWER_' def run_from_argv(self, prog_name, argv=None, **_kwargs): env_options = filter(lambda x: x.startswith(self.ENV_VAR_PREFIX), os.environ) for env_var_name in env_options: name = env_var_name.replace(self.ENV_VAR_PREFIX, '', 1).lower() value = os.environ[env_var_name] option = options._options[name] if option.multiple: value = map(option.type, value.split(',')) else: value = option.type(value) setattr(options, name, value) argv = list(filter(self.is_flower_option, argv)) # parse the command line to get --conf option parse_command_line([prog_name] + argv) try: parse_config_file(options.conf, final=False) parse_command_line([prog_name] + argv) except IOError: if options.conf != DEFAULT_CONFIG_FILE: raise settings['debug'] = options.debug if options.cookie_secret: settings['cookie_secret'] = options.cookie_secret if options.url_prefix: logger.error('url_prefix option is not supported anymore') if options.debug and options.logging == 'info': options.logging = 'debug' enable_pretty_logging() if options.auth: settings['oauth'] = { 'key': options.oauth2_key or os.environ.get('FLOWER_OAUTH2_KEY'), 'secret': options.oauth2_secret or os.environ.get('FLOWER_OAUTH2_SECRET'), 'redirect_uri': options.oauth2_redirect_uri or os.environ.get('FLOWER_AUTH2_REDIRECT_URI'), } if options.certfile and options.keyfile: settings['ssl_options'] = dict(certfile=abs_path(options.certfile), keyfile=abs_path(options.keyfile)) if options.ca_certs: settings['ssl_options']['ca_certs'] = abs_path(options.ca_certs) # Monkey-patch to support Celery 2.5.5 self.app.connection = self.app.broker_connection self.app.loader.import_default_modules() flower = Flower(capp=self.app, options=options, **settings) atexit.register(flower.stop) def sigterm_handler(signal, frame): logger.info('SIGTERM detected, shutting down') sys.exit(0) signal.signal(signal.SIGTERM, sigterm_handler) self.print_banner('ssl_options' in settings) try: flower.start() except (KeyboardInterrupt, SystemExit): pass def handle_argv(self, prog_name, argv=None): return self.run_from_argv(prog_name, argv) def early_version(self, argv): if '--version' in argv: print(__version__, file=self.stdout) super(FlowerCommand, self).early_version(argv) @staticmethod def is_flower_option(arg): name, _, value = arg.lstrip('-').partition("=") name = name.replace('-', '_') return hasattr(options, name) def print_banner(self, ssl): logger.info( "Visit me at http%s://%s:%s", 's' if ssl else '', options.address or 'localhost', options.port ) logger.info('Broker: %s', self.app.connection().as_uri()) logger.info( 'Registered tasks: \n%s', pformat(sorted(self.app.tasks.keys())) ) logger.debug('Settings: %s', pformat(settings)) flower-0.8.3/flower/events.py0000644000076500000240000001013512502222677016257 0ustar mherstaff00000000000000from __future__ import absolute_import from __future__ import with_statement import time import shelve import logging import threading import collections from functools import partial import celery from tornado.ioloop import PeriodicCallback from tornado.ioloop import IOLoop from celery.events import EventReceiver from celery.events.state import State from . import api try: from collections import Counter except ImportError: from .utils.backports.collections import Counter logger = logging.getLogger(__name__) class EventsState(State): # EventsState object is created and accessed only from ioloop thread def __init__(self, *args, **kwargs): super(EventsState, self).__init__(*args, **kwargs) self.counter = collections.defaultdict(Counter) def event(self, event): worker_name = event['hostname'] event_type = event['type'] self.counter[worker_name][event_type] += 1 # Send event to api subscribers (via websockets) classname = api.events.getClassName(event_type) cls = getattr(api.events, classname, None) if cls: cls.send_message(event) # Save the event super(EventsState, self).event(event) class Events(threading.Thread): events_enable_interval = 5000 def __init__(self, capp, db=None, persistent=False, enable_events=True, io_loop=None, **kwargs): threading.Thread.__init__(self) self.daemon = True self.io_loop = io_loop or IOLoop.instance() self.capp = capp self.db = db self.persistent = persistent self.enable_events = enable_events self.state = None if self.persistent and celery.__version__ < '3.0.15': logger.warning('Persistent mode is available with ' 'Celery 3.0.15 and later') self.persistent = False if self.persistent: logger.debug("Loading state from '%s'...", self.db) state = shelve.open(self.db) if state: self.state = state['events'] state.close() if not self.state: self.state = EventsState(**kwargs) self.timer = PeriodicCallback(self.on_enable_events, self.events_enable_interval) def start(self): threading.Thread.start(self) # Celery versions prior to 2 don't support enable_events if self.enable_events and celery.VERSION[0] > 2: self.timer.start() def stop(self): if self.persistent: logger.debug("Saving state to '%s'...", self.db) state = shelve.open(self.db) state['events'] = self.state state.close() def run(self): try_interval = 1 while True: try: try_interval *= 2 with self.capp.connection() as conn: recv = EventReceiver(conn, handlers={"*": self.on_event}, app=self.capp) try_interval = 1 recv.capture(limit=None, timeout=None, wakeup=True) except (KeyboardInterrupt, SystemExit): try: import _thread as thread except ImportError: import thread thread.interrupt_main() except Exception as e: logger.error("Failed to capture events: '%s', " "trying again in %s seconds.", e, try_interval) logger.debug(e, exc_info=True) time.sleep(try_interval) def on_enable_events(self): # Periodically enable events for workers # launched after flower try: self.capp.control.enable_events() except Exception as e: logger.debug("Failed to enable events: '%s'", e) def on_event(self, event): # Call EventsState.event in ioloop thread to avoid synchronization self.io_loop.add_callback(partial(self.state.event, event)) flower-0.8.3/flower/options.py0000644000076500000240000000523312561016565016453 0ustar mherstaff00000000000000from __future__ import absolute_import import types from tornado.options import define from tornado.options import options DEFAULT_CONFIG_FILE = 'flowerconfig.py' define("port", default=5555, help="run on the given port", type=int) define("address", default='', help="run on the given address", type=str) define("debug", default=False, help="run in debug mode", type=bool) define("inspect_timeout", default=1000, type=float, help="inspect timeout (in milliseconds)") define("auth", default='', type=str, help="regexp of emails to grant access") define("basic_auth", type=str, default=None, multiple=True, help="enable http basic authentication") define("oauth2_key", type=str, default=None, help="OAuth2 key (requires --auth)") define("oauth2_secret", type=str, default=None, help="OAuth2 secret (requires --auth)") define("oauth2_redirect_uri", type=str, default=None, help="OAuth2 redirect uri (requires --auth)") define("max_tasks", type=int, default=10000, help="maximum number of tasks to keep in memory") define("db", type=str, default='flower', help="flower database file") define("persistent", type=bool, default=False, help="enable persistent mode") define("broker_api", type=str, default=None, help="inspect broker e.g. http://guest:guest@localhost:15672/api/") define("ca_certs", type=str, default=None, help="SSL certificate authority (CA) file") define("certfile", type=str, default=None, help="SSL certificate file") define("keyfile", type=str, default=None, help="SSL key file") define("xheaders", type=bool, default=False, help="enable support for the 'X-Real-Ip' and 'X-Scheme' headers.") define("auto_refresh", default=True, help="refresh dashboards", type=bool) define("cookie_secret", type=str, default=None, help="secure cookie secret") define("conf", default=DEFAULT_CONFIG_FILE, help="configuration file") define("enable_events", type=bool, default=True, help="periodically enable Celery events") define("format_task", type=types.FunctionType, default=None, help="use custom task formatter") define("natural_time", type=bool, default=True, help="show time in relative format") define("tasks_columns", type=str, default="name,uuid,state,args,kwargs,result,received,started", help="Slugs of columns on /tasks/ page, delimited by comma") define("auth_provider", default='flower.views.auth.GoogleAuth2LoginHandler', help="auth handler class") # deprecated options define("url_prefix", type=str, help="base url prefix") define("inspect", default=False, help="inspect workers", type=bool) default_options = options flower-0.8.3/flower/static/0000755000076500000240000000000012561016723015666 5ustar mherstaff00000000000000flower-0.8.3/flower/static/css/0000755000076500000240000000000012561016723016456 5ustar mherstaff00000000000000flower-0.8.3/flower/static/css/flower.css0000644000076500000240000001010212561016565020464 0ustar mherstaff00000000000000.graph .content { width: 1200px; } .graph .chart { display: inline-block; } .graph .chart path { -webkit-transition: opacity 0.2s linear; } .graph .slider { margin-top: 10px; } .graph .legend { display: inline-block; position: relative; left: 8px; } .graph .legend-container { position: absolute; right: 0; bottom: 26px; width: 0; } .graph .chart-container { position: relative; display: inline-block; } .graph .smoother { margin: 0 0 10px 16px; width: 100px; } .rickshaw_graph .detail { left: -1000; } .graph .chart { border: 1px solid #f0f0f0; } .graph .side-panel { padding: 0 20px 20px 0; display: inline-block; vertical-align: top; } .graph .side-panel section { color: #505050; font-size: 12px; } .graph .side-panel section h6 { margin: 0 0 1em 0; font-size: 12px; font-weight: normal; } .graph .side-panel .ui-slider-horizontal { height: 1px !important; border-color: #e0e0e0; margin-bottom: 10px; } .graph .side-panel .ui-slider-handle { border-color: #a0a0a0; height: 9px !important; width: 9px !important; top: -5px !important; border-radius: 6px; outline: none; cursor: pointer; } .graph .legend { background-color: white; margin-left: 0; padding: 0; left: 0; } .graph .legend .label { color: #404040; background-color: white; } .graph .legend .action { color: black; opacity: 0.5; } .graph .legend ul { padding: 0; } .graph section { border: none; border-top: 1px solid #eaeaea; padding: 15px 0; } .graph .smoother { margin: 5px 0 0 10px; width: 90%; } .graph .legend .label.disabled { opacity: 0.4; } #renderer_form.toggler { display: block; margin: 0; } #renderer_form.toggler input[type=radio]:checked { outline: 2px solid steelblue; } #renderer_form.toggler input[type=radio] { -moz-appearance: button; background: white; margin: 0 7px; width: 39px; height: 26px; position: absolute; } #renderer_form.toggler label { display: inline-block; padding: 0; width: 39px; padding-top: 27px; text-align: center; font-size: 10px; color: #808080; background-repeat: no-repeat; position: relative; margin: 0 7px; cursor: pointer; } .spacer { margin-top: 20px; margin-bottom: 20px; } .span6 table { table-layout:fixed; word-wrap: break-word; } .span6 table caption + tbody tr td:first-child { width: 25%; } .btn-group-justified{ display: inline-block; width: 100%; float: left; } .btn-group-justified .btn{ display: table-cell !important; float: none; width: 1%; } .panel { padding: 15px; margin-top: 60px; margin-bottom: 20px; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-heading { padding: 10px 15px; margin: -15px -15px 15px; font-size: 17.5px; font-weight: 500; background-color: #f5f5f5; border-bottom: 1px solid #dddddd; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel-footer { padding: 10px 15px; margin: 15px -15px -15px; background-color: #f5f5f5; border-top: 1px solid #dddddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel-primary { border-color: #428bca; } .panel-primary .panel-heading { color: #ffffff; background-color: #428bca; border-color: #428bca; } .panel-success { border-color: #d6e9c6; } .panel-success .panel-heading { color: #468847; background-color: #dff0d8; border-color: #d6e9c6; } .panel-warning { border-color: #fbeed5; } .panel-warning .panel-heading { color: #c09853; background-color: #fcf8e3; border-color: #fbeed5; } .panel-danger { border-color: #eed3d7; } .panel-danger .panel-heading { color: #b94a48; background-color: #f2dede; border-color: #eed3d7; } .panel-info { border-color: #bce8f1; } .panel-info .panel-heading { color: #3a87ad; background-color: #d9edf7; border-color: #bce8f1; } .panel>.table, .panel>.table-responsive>.table { margin-bottom: 0; } .filter-column { width: 50%; } .filter-column.left { float: left; } .filter-column.right{ float: right; } .filter-actions { width: 100%; display: inline-block; } flower-0.8.3/flower/static/favicon.ico0000644000076500000240000000576312324702473020023 0ustar mherstaff00000000000000PNG  IHDRa OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME,3`}y%IDAT8͓PE{ M KJFSL>!FBvm4;J'Io1j>WJ)oE{hNSF,֒9{ND0ul`09A\.\. '}-Yn1n(( 88l6F;?MjEI_^R X,XVI v;0d20o[}1u5UUEV~ZKYOAzL8oOȁJDÐ+Jlr+VIENDB`flower-0.8.3/flower/static/img/0000755000076500000240000000000012561016723016442 5ustar mherstaff00000000000000flower-0.8.3/flower/static/img/apple-touch-icon-114-precomposed.png0000644000076500000240000002620012324702473025141 0ustar mherstaff00000000000000PNG  IHDRrr݅},GIDATxY]U-[5%YjŶV}H*ܜ}ι-_{ ki$^+vt[t'zɢkeOzg?׏OtpߏN]=V<厊Scd;T;]>PgYD;\{rߟ4h/Tαſ;.VϹHN7;7tGX9ބwBClqy07ϺG/"#s1_jθ]toތ{}hV};ZУͳ>ٞKO~bhnS"Eя{]垉ރ:?GĞs5w ֎׼wշa7}5\m{Ǩ4ѮQMۍu(Gq?qqShwӑfpx # =0):iQwd$]S9tb5w'RGwS{i n3NhO@g͸s3̾i){ygN";.lro;.p'c3Y?̹O 0Vi)m=@O{ukN}۰ewĵ &~r#]Qn cm@ ϣm"LJ`N䤁I)"HB1͘sCFm0M~%R pc81gLXϔI7Zq$H~-!fx:,d3Aoq v?fClasԻ]kCIg rPI5Tf03ҙ:blSIΤO)`0Ӝ{uЄSgJ߉j L a0)fa2 Duqd9sQHkv'ˀPr W"HIi%Hu&a3™`щm٬l# ('@t%5֙ӒIFT~,ݘfmI79Sxo٬&?B3)+>"a"@)0IV}sPaX`u&a~H M4,3ZM#s #7&[JYg*L܏iIyMgfCjadЄ\J 3Xgj3K5"0+7#݇6y9RTbCgauf 5a`5RlHiƙleXba&:*L &Jg2q$H@=ZgNKr3e,I8 ?}&|o=52{uTvFLPrwMu&A*Lk"Z O-j LTp5 фYW09ԢlPKg& Єq&3DJFKxy}ʆYim6ߧg?k#]ծW6 "4&}jl9` ҆Y SiY kǙLl "OC43b ~Gj;@3>ӎ3δlW+4|?\4o ȾM5PMf8Svx6mI&L[l֖bY00 I OP<΄K9|0f u&R6 `Є!2Zg2ʾ ?(W.^5OH$*L{^ lֆou粵õ,ml$$407f Һm+!½aVkI Q>kD ӆYS 3 vhbǙ6Cgjyq j6̾IwĞ y)g2 IW*=amZU ]3rM6 Pߙp:8-qfXhW|wP&:uh`6T04~SL tM|#ARfb)f&A9ՕZΣ3805+ lXWRiV,>4C`քU [h Tԙԡug@y հdsfobur+fЄ D>7YҋM*>d 3 h@r q0 g2 vhpDJxqY7mr&am6Ii909y9ӷue `f)oء ]4aI3m6˾fu!@Lu60Y0 L<0+q& ʟc6δ0SLΜ(L *V}Bg @[KcKg\to_pp%EWZQ&ۀJg0K0K3GФ1?Yi+@)p{UM aSUgLNkY:If9E~S`:Jۻ Lu&UEO6MT"gҕ0 @w;LMby~ŻLA0I18V@R 3 ;4!LJaBSLާ  ZM27\7g}LlŻ:A fP+Bg'>7Og?+g)CAx9wG sڊk藨<v|ݻ/=cXIY0m `ҍ609TgrZ¬rϺ auhB:Δ$Hì:3dP0zkO}-"ڬf RWҦꂮT ZȽ80)E۴}&[Dۈgн5zWϻZ4raZgRiCM~<ə w&ǚ人#}w&A0ՙ6[ס A&VX0x=_ g aC>0Ǚk+n+A%AMRyU.: q}&k]Y:3Xq 3B{f Z;D"hRޤ1=gBxFURHpNg*L A%H[ AMJmePT:2 s.IZ7kAq´Tfں{`d̚LfM&Tg2ʳ'm-7?H6lR֙LLgftf5N`"aR T@VEN+LdUgi¤SBg& ++@A2&W&x|h;@kZΣ+Mp|;r^sڬgy0E*lw&H0%ZA6ElgjY,+p#Z0;+` 줸sfZrM)L]kxF+jDGT]Yu& *.'Ci.>[6wqX[2 qnORت+ܙ#_W܋_^}@/9~| wu%u<鯛%P_dJJ]Y( U S6nI'n_Է1?MTٻ .g6O.VjҀӺ=!uP,D{LΣ%vz}_s /+ 1u*UG9beH/S`lV"$75@v]jI*ek-qN{ aRmBq kgԒ}if' 4LR UfRZSg&AArNԵ)+84(6~=rbpҺY]L6nM$ipH$ ŕs<$ҩtb&@Ϥq&p4flnOv:%fa(8A~5a:/mwtfeRu&aF}fK* ӆٸr^f;w$aR> ơEM5e'ץdLg0 &ikt4e &;UcUNd[&HK5άXgR3 l$3VY:oOל6blL tnK55dӍ9@|G8-sSgNZg !ҕ:Sa>SaJ[6[U ֙xe uuE9U"h}t#f/_2i\'&/ B%g {Wa6/IŒ(Pf Hŝtb3~~uE:¤+)[b[ĽIC }dRP%fz9fF>[q `?E7 >cx SARƙ !̰h`&qS`xW$ЍP 3 N蒭 ic,tXmmor 3vlzW  TaJfT5ZUgRfh1H5}TgF f="m30&/9iͶ)- @ˀ fG*'e+Xx|7i7nKγRoͶ3 D:ΚP:cb'3[V¤L $۸0Z7e)lkg~NH|inbd}s^_$Li O[a#Lt̆Y&AiǙ6L~.H])05Ԯ*q„*&4Qyg>n4&ơCvfy5:[7I33RY EZYjaY+/d5XeH:%me6v`&ML90 W lV&fӆ&l&~/~yBD<2Yqgri,8gĮl!H8"HJpά0F,0NEwFt&LY=נYŒgj9Ò Tb*y0):Vb-0^xNN|fKNU>2t&Aw7=+nIYhìHlf!A04YHWoݥ#D@G3%w 3̆Qx6q&`lf2!j((Y40u> n]~,8Ւ=B^ 5@Gnj7/lt|a&tG@3w/# 0KYYl$~A@.?zܚY=0m6{H| H@&]I)TtW4lE^p 73phufBg H )Y 3.066kڬf;sP|۟Sww z~gKݳG'?);_]n宬k ida&@HKn[ QSL:Sì3Y30y+;7";Y;>w^xZuFu9rx׏L-dTYa֞ХZZgf6-+K IņYj+[S40$Hi&6kَA"- "H%Ҁ둶Ebm,7U#U{>ra&;Z9~ t3#J3agߙg*HSWRq0pK@zZQٖ )=[i`$J{F&@$6|q(< IYM3We8Ľ,ؑRK w 靝ג~'s\#JmNŃWF6vaBmr|v?<8H2p=@3)hBiivܗ5@61]yC韝0A=p:\U"AR#vEJ_γ EȒhü"34!H[` PX8\wZóDI xv^]ϙp@ +[v4e g|@0m(vI^-2i*@TX40cM34)vH9 aQ¼>SjC-kEi04YBS+@SgluI溥9DWj` S& vϙ>\SVaV7m 8SdC,4H>uK@w>4PflD@i?YCK¤,L;4af)?f Њ*Q)nE=0qTxǭsx~ur9nMro͚甧f l>p&eRlCG^yY&o ,۠hLVa~r/BO/WO,[[ ) JƙyJLL弄qf9X*pfqC33kCՋHì&@ 5٬1E26Jx jtkSGڣc3u{٠CM6dIuv=ơvkď5 0hE>Lgϴ0~!ȗ8AM"kR4&;|lI7_%`kc5@)n]3 5 Sdaƌ3٠hYؑ]&@6OVgٷξWݢ Cȑ1 MzBu&(*jq L]rRWʰ$JwjY00K.$Ηz<2`F$S@gy,%cN}$ԄY SYg09SeN~_;`F˶zܚfNެ Tg*P483.3Ņ Ss8}%nW̸>[؏tfY0!f#gcM,L/x_¯- ]<;=NERiepGDH+ $@Q&彺2(0JgnvACdzYB@se,!&$@|7C{~_IfH@+ܼ3(Td']h ԂʏPWWg"J&K9S&Ad3u{af'ʻ> ę ,B%L3y`!'RKkDҜj)T' i P!_4 ~)@0a53 S 3SǙi ,"IyI+.O.(]i[~_gMق&@PTRBfhb7l,Zfr$+7?_v@駤8k,,@SV+ `I SϛmB^9 ȻpeL(e5BلlV Pj ocs2/ur: >̤=<Ct&ckmJA*Lf}gT7iؾ<~,DdU ZgRӜХ00;3Y ((Y`5E5}&Uxo GQ#@sHfl.f>3TKY10Ѭ II̬RZM8P+00KL?6=i,vqi655jj̸lrf_Zr_Gw2̦Mi(eA05@v*s(0e#;wF{9]Wil@\Ǚ6as&ۡ)g-=$7TY:3R.&D&e&&h`wdb̤-} ,LZ" vu{I'q_> P PB~q~/?Yrޡep̬gVdلrۜ3ӲYv:5!HfVI0A_OahT[jΚP)@F)@6-gnm @G0PO3sA(L,e.Iϴ+Sg\L7{tjx4۪~@ٶOچΤ3&A}dKgЕXh KE}-z,$8ӇԡIҀ;ӆ٤S-uzClҖϔ30E=ӀJ dn@^bE sBƙaOrfJnkvqk̴Eg{  =!niHyyWXoo\+,)h`R&iP]&q34T%`&}??;Eб0olYGhD%s+t!d%A:fJ.+M-%d[) fq0 n3 LvteuK,f[MJaF$̲5l>33q P`(LJ7 ya?S F[3h`a3oQ5[`u*ìnMrf#5ҙI-l̏^+&?ٔI^)B]6L\jɾRB,[O,̛q&mi#T̺:T:90 Џ" aȪKntM~lٰ6Ke-B{=g PX*y,]X P%˶+3!(u&T+@xQte\5Z[γ_řKɢHл ̬̆Yg LδFt] XPɯڡIA(,Cڬ(5b-͚5@_@Dһ? zK wJ5 Cgb3*@I _QyMRu $Ȅ\TlvWՙ5fv>mAR|dI&Xo/5 LufP+S&Uy?}՞FKx=83~;zy{F|֏#G/;cЃxqш;(zuwO^u_7ϪG0މ++c/>X?+}3vهNR $|n;V88I$'ܱI7w-O-RS$O DxW8T @gI QHAJC9Bt."D"2@9Rc,AwN 7L(nfw\Lw減]pS7vϤ9ۆ]뎶Zw;ۮ#wX64?׾F0vwP6ucnRC\1ᦡq(64)"D b( _lļg+4ٙtaB,o ̌퉑ky#} дoC÷D FQ j)~T'bb"5gUDD(YR)NkyYtPDZ #kH{M1Q^vFg}SN= |{v1CS6zd^woB&칽D sgDU4  .-Y07ZYF " q eg+qgu"?>'JC>D,h&ݚ:ԥ1FsYټuX@5X!"@\`b fHcug !aίX3ŷ(D\k<[lshKKs\'q~1dD;K )"Z$Bcd 5"Mb-%i?&6`ZQѪwN/ӡ :EKyyF  Х)@DV']t{gjT dFy1?ko0;ӑ%?wY%Zb`]bM.>Ӎ&6_ͥeՉ,HW1蝩Q9NO~\;p#ŭc ODE ؔx(7ƸlHkD>D'@VlLb( c"wܙb0y31|DYJg4i|X3C[Nj5F]sOlk$@3<7 uiDΚj:E]BPԇ☈)v j_VrmL|{PP'b` 6^;D>DKDsY:x7,ɥ -3O\ r>X'R=ٺ=F|b|$&|#Du|wDQVlQ UBc(;ҽNe  "bD;#HEiR̲.A PXcH@Z2&2wx;x,񳚁$KلE0]>) F?ѳ"Z"4UԤ%bDA`n{6|1D(р]qL/QF(UlLlM]ɍ0,"'B,v Q؀!b\\-'DALD.([_s{n8qc%³DX'<0 h5wdGX<4S{[@?Ĺϳ?Qds|gO߿?ugo~7Oc0;Kv!)6BZ' ,Z 1&ܜz"wi6agBVC#c"4r avb`x(XOdqs?.7VYd;3Ybwm4/ԏXHц,~<%j=@>̈́(zf-kI EKD>il"DzTv-J;Xfeӄ\wv "Q^&G RW"qo!X"@+"ȪMwC_2w$Dj|#~~},Ύd ]\ODKt s~Ql{w"j$DbTYauрEѝa˜(D;ckU#tg1kBT4ް ; +}-X;c"=[nW6w((ʬPMeqцX"[8 o#DĬeghaԬ g֚DK|f "TDho=wqZ {̥٩ ڲ3DKD; Qa-UR[薲> <~qQXbݧ 4U3^ٸUuöGh"N,aq r[8ZAtD2#F!DL ևbwdLp5 ܙQk;StLd;`}kD[薚v"(@tgΒ)Q0DDx>+!TOV|>"|"ffzh-;-@2)~XGEKAz1g+` {g>'S)~;! `~эEPP'Ҡ,D ;o8,Q)@5:+b"=X'yL,W6poVb͋PX<3IikbKT%D2W: 3o)/K\=םqb@K~>_RBy;jϊPoX;K"D]hΛˎl*Tkؖtge:TsD {1[z6gzvW{>0jp&X͈+%5 +yX!H ڕ <*BvGŧ+Xk-yxgŗg$!9է="DPݷDQՂJbc܀5wƂ'jXvͅ->m";K.@bEiv4!Tp>QYQh2[l/~O,Ч? ,[r=wٯ:^=`(*^vf{u>^K/>uuqQZ6Nu0ŧr !.b,DK/ԗ a܉ǷDpg y ϥllhQAt.*R?!|p7<7 )0%AVq#zxP Ky?*@?zGX8G,Kd.y5dAUc2$B+ ; bfӝ!&,QABO|T{+&Yk\c- N=%U|oށ5עmjs5,m`C3{W -![3Jo^$@DҒuaYLA !XehU6Q}T]&V[q2~g~k}]??)  9nAtU,Z!ݙ+ J/s+C.ԌN׳h/>4y!51}nK @xC#քM- LW(!SQ"DLlffx.>3B+j- t\w\Xy7,2VCx,gՕ`$;He3SU91Ow"E= ;`DwН)~*2[h>Z u }gcDKr$}uu5'@%Z/<:D+THKb"EBRTk!JB>?y9yu#ϊ3|x~ϼ^m:e|C( H܉CBK_fvtLP ;j{@!ǘ % J$ZO*{P ycD Y [`q )> ҂Xӝ:k@8! 1+c.,(c9Uٙa6鸶31ϣ][ѿj0Js;ZqDqv&s͋atg:HzWoŷ;`U !om*@rgqۃ;>,{Ͱ@%ʴUa*huQXθ:V^ѭ}ewr:ehLaDXӕΦ&kqv&ECDKĊYhT9 Wɭ}|͋qvfud -hz&(EFh" x +A?Հ-3BcNFDxrkB_PFH-RmQLIvH1Y"fg1Qa ϐZ!B|i>3B*%7/޽VQQDmItgavѝE,68|KCS' 롤;cS3"hԯe"`Dj} :ʹڳ^yA``sUR;2UO`AW=ŧIw:jFYfetg\O//Ѣ6ʈ%̴%KՊШ2K3puڻ;U ii0d"PvfWvnhP.g9V/ۇ0&Ÿu FW`¢W@@#p,L%X']eg,4;D)7;|¶Ыp9?Zf3Ӈ\n-|y&Pa4T½u -/@Dc\y/"@7%"@2X'bP#rcmZ}gDlQ}h/]$#l/ͳ3 T_XMlEg~u~ԍ9/&k3\(Җ4߼~\;+FDtgR^v(6Fu -u Wt/>T#!wFG>{?8:Fѩ (Xq>w6y~bθبHt A!b`͘(U'h YcP t2ugDSB#py׷x* qs~:5ӝ @FU%"DYvVJ~ѥ1;FZ#H 4. {w0m1Q^xTmԘ*NK3s?@Dq{ʇHbfhjeNք]wJVbНٙ2D*LJ(;f_@y W}K$Z^K,0-"uUװ_iT>D-ɷDl}DP @dbY`=(X "` @\da@ x1;cf%4WԥIrLc 1ggщ(M ;` Q2&*z='Dti Cw6(=eiЏlKAN[RW!eHDܘ. #31TwPtVҘ*hԋ[tgـ%2 Z!%RxҘAE bw[ ։P0v0 Qc%c"X"BZ"^" w*(uefdC"wFK07:-C\"Kni d3b:QqvkJݙvlE\&RWwi^xbnkFjx[ blي5 *2[!Օe )랥ou3L7 OMcWB#a[,&2Kd D+ ArEk{+UUB1Q HVl31㷻3g giLك Gáf HT53:kX;ŝ {@K/e~{;EBJ&|WP"ygi}g[A:>WQy$klLS'N|[C6 >냼Q?"a!. \_3e XO.6$ D9QIsC|'2e :I$}^ɚ{[zU 8Ńl"!Q>OĄDPL8JLHuy\11`t cK'& =:G͇䶇XF}oΨD8/ tDaO[ښ3Œ5@UgO'%ĜU9Iƴ@ы/Ohm \MiDl`ҨDj8̘h$/}I.5wLƱQ%>Q F}*Fnq#S77t[ 8GVnx)Ey<:/|3vo{K8pm[۶ fZ4 P)7='8*SAb(7gB"ܜ2J {m/~GY6^YH uBD5>QDhZЫcv-#l ȃm&NaҀ!'{86 tc1ĕ^XOHX'&d"ODZМEDo'LDDf3@n\كJڙi{_:@/F^%U|iR_4]c-1-{#T Ҕ42}B OjkU<_ ^^=-#w[@5 w@*UK Jˬi`* Pr?`D@Q5ZsMH#4[;3UD%ږ=ک {syݼSApDxzfn^|!X!WODE$:F:Id u6ZrR)Q*P8DD"Ἑ#$ddCt5 (Z)r%@n zyg62OD%j'b3:N62*$w' Ԙ"H$%Q]4gXWvf6KMi'"nAllhKb@WQ,//Hc "+8)y"IǢ9LFg&=VhJu^wHGg4g 4i./ڌqcsF7>\UeHf6>QJ-Cx:xk; Dtk?⇓f%'*QX!~Ȣ/RY~Ռ2ՙc]Sc5jsyI0y+CDfۋ+mԡc c 5XS4:i'T.VUIґ$bŽb!~ ;x",[A@e?n} x$"hʼU,{ȳ:Dh̕!`Ε!$o {"am8Cs"^i}|% aNu^R!uޜyld>M LKNFj}@$(yJYOT*^j"4g% p a\@%|"3-It0J$#c(Wh>eh):tf3 FkyBP6@W) kHN5@Xk1h5;=>QD}p t(5g(:s$9)y.θ0@XSP/mk~ Yސ4+=XP<X=T`摈=Ѳ謴ߑz h>I2,wX179ewL׆?p6,<HqdQS')|"Xs3Q8c|P cM<ȆT"W򙍦vvM6l$љ㙍< ?q1 +jz:A,pB?t6ίi/!QtvH]\a Ț23O%*/jcDE!yV>F( N_;;|*LUg-{>s HtJeєk󉊗XˋD=l7of#a3wZs*Ѿ3`(TMiXe'9=cT=vc³ UKݝ?Y D'- :O$FE%:av+!Q'#y5bكJDXJlv&-e Di,WU9sEz zD=ôL+2Hjp94P\,fK$!>6;% ~Ed tuy0'i$n c=FҼ9axwD gVpz\Id>! 6,8~ T0c˱$b{lS$ mMdDat*c>[-03h?S33~@Vip2;1Vh͐| h~K۟OX%ŷ=Dul4BX? t]UE"#=;(u0:+3s]6ďӝg8Inn{5,D,&:h$*L/oL' _L/J4ʐ0+C!8ք80O$RP@ܜ8M:lĹ.\kdzf-$w!~ =3.c5{_ Hs_y\64n[^P ) P|"Ӵ*īBe:`>Μc,4gCh-u%;覐hA $! F<T[Ntoq/fJߵ!_ַ6pUT"+W,>woow ͻ#4NCa|7H;C4N]MDhgpDiWh)h"DF8M"T|'ݚMub;6MНԄ]IоW{>ݗ<Ә,58=x>O]Mݔ\ %Wd 1E)|2]Mݍ~z3_C9\Su ~}/ hpGGiGKFZiv4ֶv4hڵq3&6nhW{?;bct[r煻ӓ#pЂ9cɠv&qPSePq]i@qt˺n +  AGY݅Ȑw@tltsl5}`4 7sASeP|β e@y}v8:VF}5d/t,MRRP̎)u3mPq*UW}2@JL?; >qTI.DДw&1h'W1(фT]ek]RTO]T]حQ(FT]I]1*FXp7FKU.Yʩ+Bв^uQK X:(Ex4 ({kTR0LO2L,G;k _>#4^>>^{U:Swvq8FRu#2FR&-ub8; %E)N/z'93tPƆ(1hkU @&@x%_ ]*S`^cAQ@G$uQeW1 ȗ2T]=u92Qa0/Һ!aI!m{(bBuWSg$-yl/ƺQZ Hvt= R P0__k33nQ"0Z@ (TbMu= 9\%H{=`ҡӡ̩3Λ\P?.Ru5$RV),⨾F u\5~rj^g/s>@w.~usA3s T z- ^1hG فjQQ'C8DQcB1qG-)]TAǟ&U@i`PiuG9HӾKQqQTNf@;c|䃅]Z?H(86$=\͡-tretI)B X FjF!)FPXwK GZ@9xu+)"@ê++UWRX(L+ j( (RJ @]B?ZAYP9Ãt3u}oA& rz\hX ]UeWQ((- y? u1uQ 7͜G9~.w}ŗhj Ǵ^m€b$gRN]ʩ+z N"]=Ԛzqrz90ucu=OsquLsl/dLPA(/c/*pp;@C:(~zr\c T ćp>]}MBV-s]^`M Q]R/v 4(@4HO)y1iefdzP ߓӵ-4<kqTQ H?)GqϠb$@+pA饍lQw>d蔜y8"lyl(OC^aP@SeO@8+@0j73^h1HGq8u!*BK5O낐IsE'h7& 17qvrYiժN(B^qUH݀ hN<#Ƚ.P5*9@YĖ0IHE2[g<i&G!F!{@q2Rwc>S.GΕH0lIKlh[u @AQXh:BP}ftzg@S9,EyA0`juqnO g"߲<64"1- ȹ>(]<߫Z(?/ { p7@y*Gstkn{Pمoc>꫋9RT^rd7zP@zִag 1Z@dT3RS@5@/- @E֨tFWɷ`N+ndN=#qNP7Bn-8굫G7?BLomzOQݍ |7RqFL/Tes)"8ʐJv!N|@j)kClFl:/ca ڈ؊؊=*Ħ =vb[@(!v~cx>Yr@JI]8Ñ͇ICP2AiHQ)FHWV9 -"m{@}bdz~i-`X@/FÀ,Tqc5 Fb$:4 νni"1eܩgw;ZCt^Q4 ֨_wT@mi:`*BؕQ}5~ФkCr Z׏n^iJkd Hh_@ 3>JAc\zk=%pwbbG@GΣF!_Ѡ\WRTRQI]q!b@ټkICYt%T ORA}aiA# H@䭔ˀWZ߭1z̓y%m7R<@Zb;U-u!=uT[)bGKU-f3I0'~vIENDB`flower-0.8.3/flower/static/img/apple-touch-icon-72-precomposed.png0000644000076500000240000001306112324702473025065 0ustar mherstaff00000000000000PNG  IHDRHHUGIDATx͜YlqǯDIj6R$ZʝBIJe9q /RnmcE:q4N%Ŷoi뇢H)%5-}6P[;p|ˇV?ιi?s9< ~{_Uf]qѷ|r8|DӄC#t :?wtL)tNNtj@c48Nй4I3St/3t>;Ie3tO}94ݟϲ z8MO$=\:M#x.`|t'o`Haн^).Z0s/F:R߮Q*m>*llsQ"T6@}P?TZAkû o!FCxOv~hCva(341la<6F'=#4wNhcT܏tkFts=a:9L2@båmњ2+uS-)m(%J4(GMymûp۷cXM4c 7v` I)$!ܐ$@2N0+w~w >Гa\pRK>,oHc^)Ħ"C*d!rHW7'!$nv7)$v;)1SrI)/'K2BLM7;i a>6*ە·}0pN$BR'a*$@p+I0/:ɆFvW7qk iNn III$lK'б6K2~izʫ˯+ >^kʷ_Wgaz]:w1~Y=>4;ws*%沪9I`nP,)S .r i m*xe@A>k~H/>w$7qc@N 5dBj 8I !4'i6N HS5wG׮($#ݖ`.7ؿA$d sI'2{MIƴ@9Ids@@]2_ M#(-ٽuIMVy=pnbH{3Zp6qcUHY͇7:WMMQNI&CN$ܜ[!ٜK |Ipo HN»Q8Ҵkuv79BpS']^|s w$BB HZNpZR'YH( @y"EZL:%$o뤲p0;!E)IS'm U_~߽zG]#Aoӛ #l;}Inp!m?)}UZ!tNKݖ`Kz78 a䮈̃1JaHƍQ(B_g?\y7 *$ 7IZLv1Rplɘ$ 5V7I/]@$1)Q\6%NqM\&}`J}nO˶dvLdJJŤRApCRIId$w[.@;=%ٻ3Q>7de t(q? +EЗlӍiߎn1QH*UPf.rUvl? =n+uPyv%7T)-+Sme\ mHpCvN$(쑒Ir xtUM_7` sPDC޶ V@Z'qke!AIu&nSqN9\*IU`YHp`Z@p_[& 82G۷Ns7 m:Cxw?tpOZzC3'_ꍞi^B @ 9NZTH]{de;b<Hiu*pCN[d=4.RpVW7!mXl1,&Iz$o8\{CdrRBsMvuwA_,K\{2u(BMdYܓp4q['p[rO%.v ɽf s8 +NbpP6dӫ4_[8GJ)$)$W5 7hX 6BDdr 7yH!MZHz .` JNa 74 )f K,$h!G/;9 KS0@C]> )ꄛe8[HKu@Hr;Uvq5Hvuc'l \\(A(jqCus:[H Id`5j暋o A$յ!RHՄu1@fs7{U]b)9omd7v[X8)B |dK|W ~ٛ uV7b);O}pz^,t{܀-a@8I!:qPyۦ[Y<\y7~pewXZNX$B A@1 5&mQD!A9zuST[%$@R'Ս$VP?.chCR &Ir޾.@` BhrBZ$(%\i4RۉŧR+j[fAw$B@ ['pxuKg!y$!40x[T'bfy 1 I>K@ g5Op/ |=/:e7 f͖5I q둒BNN`^!Y'[I J 1޷\ 7C &EHP /i 7I i^p!Error! " + message); $("#alert").show(); } function show_success_alert(message) { $("#alert").removeClass("alert-error").addClass("alert-success"); $("#alert-message").html("Success! " + message); $("#alert").show(); } function get_selected_workers() { return $('#workers-table tr').has('td.is_selected > input:checked'); } function select_all_workers() { $('#workers-table td.is_selected > input').filter(':not(:checked)').click(); } function select_none_workers() { $('#workers-table td.is_selected > input:checked').click(); } function toggle_selected_workers(event) { var $checkbox = $('#select-workers-toggler'); if ($checkbox.is(':checked')) select_all_workers(); else select_none_workers(); } function shutdown_selected(event) { var $selected_workes = get_selected_workers(); /* atomic would be better with list of ids (not-names) */ $selected_workes.each(function () { var $worker = $(this), worker_name = $worker.attr('id'); $.ajax({ type: 'POST', url: '/api/worker/shutdown/' + worker_name, dataType: 'json', data: { workername: worker_name }, success: function (data) { show_success_alert(data.message); }, error: function (data) { show_error_alert(data.responseText); } }); }); } function restart_selected(event) { var $selected_workes = get_selected_workers(); /* atomic would be better with list of ids (not-names) */ $selected_workes.each(function () { var $worker = $(this), worker_name = $worker.attr('id'); $.ajax({ type: 'POST', url: '/api/worker/pool/restart/' + worker_name, dataType: 'json', data: { workername: worker_name }, success: function (data) { show_success_alert(data.message); }, error: function (data) { show_error_alert(data.responseText); } }); }); } function refresh_selected(event) { var $selected_workers = get_selected_workers(); if (!$selected_workers.length) { $.ajax({ type: 'GET', url: '/api/workers', data: { refresh: 1 }, success: function (data) { show_success_alert('Refreshed'); }, error: function (data) { show_error_alert(data.responseText); } }); } $selected_workers.each(function () { var $worker = $(this), worker_name = $worker.attr('id'); $.ajax({ type: 'GET', url: '/api/workers', dataType: 'json', data: { workername: unescape(worker_name), refresh: 1 }, success: function (data) { show_success_alert(data.message || 'Refreshed'); }, error: function (data) { show_error_alert(data.responseText); } }); }); } function on_worker_refresh(event) { event.preventDefault(); event.stopPropagation(); $.ajax({ type: 'GET', url: window.location.pathname, data: 'refresh=1', success: function (data) { //show_success_alert('Refreshed'); window.location.reload(); }, error: function (data) { show_error_alert(data.responseText); } }); } function on_pool_grow(event) { event.preventDefault(); event.stopPropagation(); var workername = $('#workername').text(), grow_size = $('#pool-size option:selected').html(); $.ajax({ type: 'POST', url: '/api/worker/pool/grow/' + workername, dataType: 'json', data: { 'workername': workername, 'n': grow_size, }, success: function (data) { show_success_alert(data.message); }, error: function (data) { show_error_alert(data.responseText); } }); } function on_pool_shrink(event) { event.preventDefault(); event.stopPropagation(); var workername = $('#workername').text(), shrink_size = $('#pool-size option:selected').html(); $.ajax({ type: 'POST', url: '/api/worker/pool/shrink/' + workername, dataType: 'json', data: { 'workername': workername, 'n': shrink_size, }, success: function (data) { show_success_alert(data.message); }, error: function (data) { show_error_alert(data.responseText); } }); } function on_pool_autoscale(event) { event.preventDefault(); event.stopPropagation(); var workername = $('#workername').text(), min = $('#min-autoscale').val(), max = $('#max-autoscale').val(); $.ajax({ type: 'POST', url: '/api/worker/pool/autoscale/' + workername, dataType: 'json', data: { 'workername': workername, 'min': min, 'max': max, }, success: function (data) { show_success_alert(data.message); }, error: function (data) { show_error_alert(data.responseText); } }); } function on_add_consumer(event) { event.preventDefault(); event.stopPropagation(); var workername = $('#workername').text(), queue = $('#add-consumer-name').val(); $.ajax({ type: 'POST', url: '/api/worker/queue/add-consumer/' + workername, dataType: 'json', data: { 'workername': workername, 'queue': queue, }, success: function (data) { show_success_alert(data.message); setTimeout(function () { $('#tab-queues').load('/worker/' + workername + ' #tab-queues').fadeIn('show'); }, 10000); }, error: function (data) { show_error_alert(data.responseText); } }); } function on_cancel_consumer(event) { event.preventDefault(); event.stopPropagation(); var workername = $('#workername').text(), queue = $(event.target).closest("tr").children("td:eq(0)").text(); $.ajax({ type: 'POST', url: '/api/worker/queue/cancel-consumer/' + workername, dataType: 'json', data: { 'workername': workername, 'queue': queue, }, success: function (data) { show_success_alert(data.message); setTimeout(function () { $('#tab-queues').load('/worker/' + workername + ' #tab-queues').fadeIn('show'); }, 10000); }, error: function (data) { show_error_alert(data.responseText); } }); } function on_task_timeout(event) { event.preventDefault(); event.stopPropagation(); var workername = $('#workername').text(), taskname = $(event.target).closest("tr").children("td:eq(0)").text(), type = $(event.target).html().toLowerCase(), timeout = $(event.target).siblings().closest("input").val(); taskname = taskname.split(' ')[0]; // removes [rate_limit=xxx] $.ajax({ type: 'POST', url: '/api/task/timeout/' + taskname, dataType: 'json', data: { 'workername': workername, 'type': timeout, }, success: function (data) { show_success_alert(data.message); }, error: function (data) { show_error_alert(data.responseText); } }); } function on_task_rate_limit(event) { event.preventDefault(); event.stopPropagation(); var workername = $('#workername').text(), taskname = $(event.target).closest("tr").children("td:eq(0)").text(), ratelimit = $(event.target).prev().val(); taskname = taskname.split(' ')[0]; // removes [rate_limit=xxx] $.ajax({ type: 'POST', url: '/api/task/rate-limit/' + taskname, dataType: 'json', data: { 'workername': workername, 'ratelimit': ratelimit, }, success: function (data) { show_success_alert(data.message); setTimeout(function () { $('#tab-limits').load('/worker/' + workername + ' #tab-limits').fadeIn('show'); }, 10000); }, error: function (data) { show_error_alert(data.responseText); } }); } function on_task_revoke(event) { event.preventDefault(); event.stopPropagation(); var taskid = $('#taskid').text(); $.ajax({ type: 'POST', url: '/api/task/revoke/' + taskid, dataType: 'json', data: { 'terminate': false, }, success: function (data) { show_success_alert(data.message); }, error: function (data) { show_error_alert(data.responseText); } }); } function on_task_terminate(event) { event.preventDefault(); event.stopPropagation(); var taskid = $('#taskid').text(); $.ajax({ type: 'POST', url: '/api/task/revoke/' + taskid, dataType: 'json', data: { 'terminate': true, }, success: function (data) { show_success_alert(data.message); }, error: function (data) { show_error_alert(data.responseText); } }); } function on_dashboard_update(update) { var total_active = 0, total_processed = 0, total_failed = 0, total_succeeded = 0, total_retried = 0; $.each(update, function (name) { var id = encodeURIComponent(name), sel = id.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/%@])/g,'\\$1'), tr = $('#' + sel); if (tr.length === 0) { $('#workers-table-row').clone().removeClass('hidden').attr('id', id).appendTo('tbody'); tr = $('#' + sel); tr.children('td').children('a').attr('href', '/worker/' + name).text(name); } var stat = tr.children('td:eq(2)').children(), active = tr.children('td:eq(3)'), processed = tr.children('td:eq(4)'), failed = tr.children('td:eq(5)'), succeeded = tr.children('td:eq(6)'), retried = tr.children('td:eq(7)'), loadavg = tr.children('td:eq(8)'); stat.text($(this).attr('status') ? "Online" : "Offline"); stat.removeClass("label-success label-important"); stat.addClass($(this).attr('status') ? "label-success" : "label-important"); active.text($(this).attr('active')); processed.text($(this).attr('processed')); failed.text($(this).attr('failed')); succeeded.text($(this).attr('succeeded')); retried.text($(this).attr('retried')); loadavg.text($(this).attr('loadavg').toString().replace(/,/g, ', ')); total_active += $(this).attr('active') ? $(this).attr('active') > 0 : 0; total_processed += $(this).attr('processed'); total_failed += $(this).attr('failed'); total_succeeded += $(this).attr('succeeded'); total_retried += $(this).attr('retried'); }); $('a#btn-active').text('Active: ' + total_active); $('a#btn-processed').text('Processed: ' + total_processed); $('a#btn-failed').text('Failed: ' + total_failed); $('a#btn-succeeded').text('Succeeded: ' + total_succeeded); $('a#btn-retried').text('Retried: ' + total_retried); } function on_cancel_task_filter(event) { event.preventDefault(); event.stopPropagation(); $('#task-filter-form').each(function () { $(this).find('SELECT').val(''); $(this).find('.datetimepicker').val(''); }); $('#task-filter-form').submit(); } function create_graph(data, id, width, height, metric) { id = id || ''; width = width || 500; height = height || 300; metric = metric || ''; var name, seriesData = []; for (name in data) { seriesData.push({name: name}); } var palette = new Rickshaw.Color.Palette({scheme: 'colorwheel'}); var graph = new Rickshaw.Graph({ element: document.getElementById("chart" + id), width: width, height: height, renderer: 'stack', series: new Rickshaw.Series(seriesData, palette), maxDataPoints: 10000, padding: {top: 0.1, left: 0.01, right: 0.01, bottom: 0.01}, }); var ticksTreatment = 'glow'; var timeUnit = new Rickshaw.Fixtures.Time.Local(); timeUnit.formatTime = function(d) { return moment(d).format("yyyy.mm.dd HH:mm:ss"); }; timeUnit.unit("minute"); var xAxis = new Rickshaw.Graph.Axis.Time({ graph: graph, timeFixture: new Rickshaw.Fixtures.Time.Local(), ticksTreatment: ticksTreatment, timeUnit: timeUnit }); xAxis.render(); var yAxis = new Rickshaw.Graph.Axis.Y({ graph: graph, tickFormat: Rickshaw.Fixtures.Number.formatKMBT, ticksTreatment: ticksTreatment, }); yAxis.render(); var hoverDetail = new Rickshaw.Graph.HoverDetail({ graph: graph, yFormatter: function(y) { if (y % 1 === 0) return y + metric; else return y.toFixed(2) + metric; } }); var legend = new Rickshaw.Graph.Legend({ graph: graph, element: document.getElementById('legend' + id) }); var shelving = new Rickshaw.Graph.Behavior.Series.Toggle({ graph: graph, legend: legend }); var order = new Rickshaw.Graph.Behavior.Series.Order({ graph: graph, legend: legend }); var highlighter = new Rickshaw.Graph.Behavior.Series.Highlight({ graph: graph, legend: legend }); legend.shelving = shelving; graph.series.legend = legend; graph.render(); return graph; } function update_graph(graph, url, lastquery) { $.ajax({ type: 'GET', url: url, data: {lastquery: lastquery}, success: function (data) { graph.series.addData(data); graph.update(); }, }); } function current_unix_time() { var now = new Date(); return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds())/1000; } $.urlParam = function(name){ var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href); return results && results[1] || 0; }; $(document).ready(function () { if ($.inArray($(location).attr('pathname'), ['/', '/dashboard']) != -1) { var host = $(location).attr('host'), protocol = $(location).attr('protocol') == 'http:' ? 'ws://' : 'wss://', ws = new WebSocket(protocol + host + "/update-dashboard"); ws.onmessage = function (event) { var update = $.parseJSON(event.data); on_dashboard_update(update); }; } //https://github.com/twitter/bootstrap/issues/1768 var shiftWindow = function() { scrollBy(0, -50); }; if (location.hash) shiftWindow(); window.addEventListener("hashchange", shiftWindow); // Make bootstrap tabs persistent $(document).ready(function () { if (location.hash !== '') { $('a[href="' + location.hash + '"]').tab('show'); } $('a[data-toggle="tab"]').on('shown', function (e) { location.hash = $(e.target).attr('href').substr(1); }); }); if ($(location).attr('pathname') === '/monitor') { var sts = current_unix_time(), fts = current_unix_time(), tts = current_unix_time(), updateinterval = parseInt($.urlParam('updateInterval')) || 3000, succeeded_graph = null, failed_graph = null, time_graph = null, broker_graph = null; $.ajax({ type: 'GET', url: '/monitor/succeeded-tasks', data: {lastquery: current_unix_time()}, success: function (data) { succeeded_graph = create_graph(data, '-succeeded'); succeeded_graph.update(); succeeded_graph.series.setTimeInterval(updateinterval); setInterval(function () { update_graph(succeeded_graph, '/monitor/succeeded-tasks', sts); sts = current_unix_time(); }, updateinterval); }, }); $.ajax({ type: 'GET', url: '/monitor/completion-time', data: {lastquery: current_unix_time()}, success: function (data) { time_graph = create_graph(data, '-time', null, null, 's'); time_graph.update(); time_graph.series.setTimeInterval(updateinterval); setInterval(function () { update_graph(time_graph, '/monitor/completion-time', tts); tts = current_unix_time(); }, updateinterval); }, }); $.ajax({ type: 'GET', url: '/monitor/failed-tasks', data: {lastquery: current_unix_time()}, success: function (data) { failed_graph = create_graph(data, '-failed'); failed_graph.update(); failed_graph.series.setTimeInterval(updateinterval); setInterval(function () { update_graph(failed_graph, '/monitor/failed-tasks', fts); fts = current_unix_time(); }, updateinterval); }, }); $.ajax({ type: 'GET', url: '/monitor/broker', success: function (data) { broker_graph = create_graph(data, '-broker'); broker_graph.update(); broker_graph.series.setTimeInterval(updateinterval); setInterval(function () { update_graph(broker_graph, '/monitor/broker'); }, updateinterval); }, }); } }); return { toggle_selected_workers: toggle_selected_workers, select_all_workers: select_all_workers, select_none_workers: select_none_workers, shutdown_selected: shutdown_selected, restart_selected: restart_selected, refresh_selected: refresh_selected, on_alert_close: on_alert_close, on_worker_refresh: on_worker_refresh, on_pool_grow: on_pool_grow, on_pool_shrink: on_pool_shrink, on_pool_autoscale: on_pool_autoscale, on_add_consumer: on_add_consumer, on_cancel_consumer: on_cancel_consumer, on_task_timeout: on_task_timeout, on_task_rate_limit: on_task_rate_limit, on_cancel_task_filter: on_cancel_task_filter, on_task_revoke: on_task_revoke, on_task_terminate: on_task_terminate, }; }(jQuery)); flower-0.8.3/flower/templates/0000755000076500000240000000000012561016723016375 5ustar mherstaff00000000000000flower-0.8.3/flower/templates/404.html0000644000076500000240000000040512365172640017574 0ustar mherstaff00000000000000{% extends "base.html" %} {% block container %}

{% end %} flower-0.8.3/flower/templates/base.html0000644000076500000240000000675112503636125020206 0ustar mherstaff00000000000000 Celery Flower {% block extra_styles %} {% end %} {% block navbar %} {% module Template("navbar.html", active_tab="") %} {% end %} {% block container %} {% end %} {% block extra_scripts %} {% end %} flower-0.8.3/flower/templates/broker.html0000644000076500000240000000214312436677004020555 0ustar mherstaff00000000000000{% extends "base.html" %} {% block navbar %} {% module Template("navbar.html", active_tab="broker") %} {% end %} {% block container %}
{% for queue in queues %} {% end %}
Queues
Name Messages Unacked Ready Consumers Idle since
{{ queue['name'] }} {{ queue.get('messages', 'N/A') }} {{ queue.get('messages_unacknowledged', 'N/A') }} {{ queue.get('messages_ready', 'N/A') }} {{ queue.get('consumers', 'N/A') }} {{ queue.get('idle_since', 'N/A') }}
{% end %} flower-0.8.3/flower/templates/dashboard.html0000644000076500000240000000777612510076510021225 0ustar mherstaff00000000000000{% extends "base.html" %} {% block navbar %} {% module Template("navbar.html", active_tab="dashboard") %} {% end %} {% block container %}
{% for name, info in workers.items() %} {% end %}
Worker Name Status Active Processed Failed Succeeded Retried Load Average
{{ name }} {% if info.get('status', None) %} Online {% else %} Offline {% end %} {{ info.get('active', 0) }} {{ info.get('task-received', 0) }} {{ info.get('task-failed', 0) }} {{ info.get('task-succeeded', 0) }} {{ info.get('task-retried', 0) }} {{ humanize(info.get('loadavg', 'N/A')) }}
{% end %} flower-0.8.3/flower/templates/error.html0000644000076500000240000000057212365172640020423 0ustar mherstaff00000000000000{% extends "base.html" %} {% block container %}

It looks like you have found a bug! You can help to improve Celery Flower by opening an issue in https://github.com/mher/flower/issues

{{ bugreport }}

{{ error_trace }}
        
{% end %} flower-0.8.3/flower/templates/monitor.html0000644000076500000240000000416412502222677020761 0ustar mherstaff00000000000000{% extends "base.html" %} {% block navbar %} {% module Template("navbar.html", active_tab="monitor") %} {% end %} {% block container %} {% end %} flower-0.8.3/flower/templates/navbar.html0000644000076500000240000000216612561016565020545 0ustar mherstaff00000000000000 flower-0.8.3/flower/templates/task.html0000644000076500000240000000660012510076510020221 0ustar mherstaff00000000000000{% extends "base.html" %} {% block navbar %} {% module Template("navbar.html", active_tab="tasks") %} {% end %} {% block container %}
Basic task options
Name {{ getattr(task, 'name', None) }}
UUID {{ task.uuid }}
State {% if task.state == "SUCCESS" %} {{ task.state }} {% elif task.state == "FAILURE" %} {{ task.state }} {% else %} {{ task.state }} {% end %}
args {{ task.args }}
kwargs {{ task.kwargs }}
Result {{ getattr(task, 'result', None) }}
{% for name in task._fields %} {% if name not in ['name', 'uuid', 'state', 'args', 'kwargs', 'result'] and getattr(task, name, None) is not None %} {% end %} {% end %}
Advanced task options
{{ humanize(name) }} {% if name in ['sent', 'received', 'started', 'succeeded', 'retried', 'timestamp', 'failed'] %} {{ humanize(getattr(task, name, None), type='time') }} {% elif name == 'worker' %} {{ task.worker.hostname }} {% elif name == 'traceback' %}
{{ getattr(task, name, None) }}
{% else %} {{ getattr(task, name, None) }} {% end %}
{% end %} flower-0.8.3/flower/templates/tasks.html0000644000076500000240000001732012561016565020417 0ustar mherstaff00000000000000{% extends "base.html" %} {% block navbar %} {% module Template("navbar.html", active_tab="tasks") %} {% end %} {% block extra_styles %} {% end %} {% block container %}
{% if sort_by %} {% end %}
to
to
{% if 'name' in columns %} {% end %} {% if 'uuid' in columns %} {% end %} {% if 'state' in columns %} {% end %} {% if 'args' in columns %} {% end %} {% if 'kwargs' in columns %} {% end %} {% if 'result' in columns %} {% end %} {% if 'received' in columns %} {% end %} {% if 'started' in columns %} {% end %} {% if 'runtime' in columns %} {% end %} {% for uuid, task in tasks %} {% if getattr(task, 'name', None) is None %} {% continue %} {% end %} {% if 'name' in columns %} {% end %} {% if 'uuid' in columns %} {% end %} {% if 'state' in columns %} {% end %} {% if 'args' in columns %} {% end %} {% if 'kwargs' in columns %} {% end %} {% if 'result' in columns %} {% end %} {% if 'received' in columns %} {% end %} {% if 'started' in columns %} {% end %} {% if 'runtime' in columns %} {% end %} {% end %}
{% raw sort_url("Name", "name", sort_by, params) %}UUID{% raw sort_url("State", "state", sort_by, params) %}argskwargsResult{% raw sort_url("Received", "received", sort_by, params) %}{% raw sort_url("Started", "started", sort_by, params) %}Runtime
{{ task.name }} {{ task.uuid }} {% if task.state == "SUCCESS" %} {{ task.state }} {% elif task.state == "FAILURE" %} {{ task.state }} {% else %} {{ task.state }} {% end %} {{ task.args }} {{ task.kwargs }} {% if task.state == "SUCCESS" %} {{ task.result }} {% elif task.state == "FAILURE" %} {{ task.exception }} {% end %} {{ humanize(task.received, type=time) }} {{ humanize(task.received, type=time) }} {% if task.timestamp and task.started %} {{ '%.2f' % humanize(task.timestamp - task.started) }} sec {% end %}
{% end %} {% block extra_scripts %} {% end %} flower-0.8.3/flower/templates/worker.html0000644000076500000240000003476112561016565020613 0ustar mherstaff00000000000000{% extends "base.html" %} {% block navbar %} {% module Template("navbar.html", active_tab="workers") %} {% end %} {% block container %}
{% for name,value in worker['stats']['pool'].items() %} {% end %}
Worker pool options
{{ humanize(name) }} {{ humanize(value) }}
Worker PID {{ worker['stats'].get('pid', 'N/A')}}
Prefetch Count {{ worker['stats'].get('prefetch_count', 'N/A')}}
Pool size control
{% if worker['stats'].get('autoscaler', None) %}
{% for name,value in worker['stats']['autoscaler'].items() %} {% end %}
Autoscaler options
{{ humanize(name) }} {{ humanize(value) }}
{% end %}
{% for name,value in (worker['stats'].get('consumer', None) or worker['stats'])['broker'].items() %} {% end %}
Broker options
{{ humanize(name) }} {{ value }}

Active queues being consumed from

{% for queue in worker.get('active_queues', []) %} {% end %}
Name Exclusive Durable Routing key No ACK Alias Queue arguments Binding arguments Auto delete
{{ queue['name'] }} {{ queue['exclusive'] }} {{ queue['durable'] }} {{ queue['routing_key'] }} {{ queue['no_ack'] }} {{ queue['alias'] }} {{ queue['queue_arguments'] }} {{ queue['binding_arguments'] }} {{ queue['auto_delete'] }}

Processed number of completed tasks

{% for name,value in worker['stats']['total'].items() %} {% end %}
{{ name }} {{ value }}

Active currently executing tasks

{% for task in worker.get('active', {}) %} {% end %}
Name UUID Start time Ack PID args kwargs
{{ task['name'] }} {{ task['id'] }} {{ humanize(task['time_start'], type='time') }} {{ task['acknowledged'] }} {{ task['worker_pid'] }} {{ task.get('args', 'N/A') }} {{ task.get('kwargs', 'N/A') }}

Scheduled scheduled (eta/countdown/retry) tasks

{% for task in worker.get('scheduled', {}) %} {% end %}
Name UUID args kwargs
{{ task['request']['name'] }} {{ task['request']['id'] }} {{ task['request']['args'] }} {{ task['request']['kwargs'] }}

Reserved tasks that have been received, but are still waiting to be executed

{% for task in worker.get('reserved', {}) %} {% end %}
Name UUID args kwargs
{{ task['name'] }} {{ task['id'] }} {{ task['args'] }} {{ task['kwargs'] }}

Revoked cancelled tasks

{% for task in worker.get('revoked', []) %} {% end %}
UUID
{{ task }}

Task limits

{% for taskname in worker.get('registered', []) %} {% end %}
Task name Rate limit Timeouts
{{ taskname }}
{% for name,value in sorted(worker.get('conf', {}).items()) %} {% if value is not None %} {% end %} {% end %}
Configuration options
{{ name }} {{ value }}
{% if isinstance(worker['stats'].get('rusage', None), dict) %} {% for name, value in worker['stats']['rusage'].items() %} {% end %} {% end %}
System usage statistics
{{ name }} {{ value }}
{% end %} flower-0.8.3/flower/urls.py0000644000076500000240000000611612561016565015746 0ustar mherstaff00000000000000from __future__ import absolute_import import os from tornado.web import StaticFileHandler from .api import events from .api import control from .api import tasks from .api import workers from .views import auth from .views import monitor from .views.broker import BrokerView from .views.workers import WorkerView from .views.tasks import TaskView, TasksView from .views.error import NotFoundErrorHandler from .views.dashboard import DashboardView, DashboardUpdateHandler from .utils import gen_cookie_secret settings = dict( template_path=os.path.join(os.path.dirname(__file__), "templates"), static_path=os.path.join(os.path.dirname(__file__), "static"), cookie_secret=gen_cookie_secret(), login_url='/login', ) handlers = [ # App (r"/", DashboardView), (r"/dashboard", DashboardView), (r"/worker/(.+)", WorkerView), (r"/task/(.+)", TaskView), (r"/tasks", TasksView), (r"/broker", BrokerView), # Worker API (r"/api/workers", workers.ListWorkers), (r"/api/worker/shutdown/(.+)", control.WorkerShutDown), (r"/api/worker/pool/restart/(.+)", control.WorkerPoolRestart), (r"/api/worker/pool/grow/(.+)", control.WorkerPoolGrow), (r"/api/worker/pool/shrink/(.+)", control.WorkerPoolShrink), (r"/api/worker/pool/autoscale/(.+)", control.WorkerPoolAutoscale), (r"/api/worker/queue/add-consumer/(.+)", control.WorkerQueueAddConsumer), (r"/api/worker/queue/cancel-consumer/(.+)", control.WorkerQueueCancelConsumer), # Task API (r"/api/tasks", tasks.ListTasks), (r"/api/task/types", tasks.ListTaskTypes), (r"/api/queues/length", tasks.GetQueueLengths), (r"/api/task/info/(.*)", tasks.TaskInfo), (r"/api/task/apply/(.+)", tasks.TaskApply), (r"/api/task/async-apply/(.+)", tasks.TaskAsyncApply), (r"/api/task/send-task/(.+)", tasks.TaskSend), (r"/api/task/result/(.+)", tasks.TaskResult), (r"/api/task/timeout/(.+)", control.TaskTimout), (r"/api/task/rate-limit/(.+)", control.TaskRateLimit), (r"/api/task/revoke/(.+)", control.TaskRevoke), # Events WebSocket API (r"/api/task/events/task-sent/(.*)", events.TaskSent), (r"/api/task/events/task-received/(.*)", events.TaskReceived), (r"/api/task/events/task-started/(.*)", events.TaskStarted), (r"/api/task/events/task-succeeded/(.*)", events.TaskSucceeded), (r"/api/task/events/task-failed/(.*)", events.TaskFailed), (r"/api/task/events/task-revoked/(.*)", events.TaskRevoked), (r"/api/task/events/task-retried/(.*)", events.TaskRetried), # WebSocket Updates (r"/update-dashboard", DashboardUpdateHandler), # Monitors (r"/monitor", monitor.Monitor), (r"/monitor/succeeded-tasks", monitor.SucceededTaskMonitor), (r"/monitor/failed-tasks", monitor.FailedTaskMonitor), (r"/monitor/completion-time", monitor.TimeToCompletionMonitor), (r"/monitor/broker", monitor.BrokerMonitor), # Static (r"/static/(.*)", StaticFileHandler, {"path": settings['static_path']}), # Auth (r"/login", auth.LoginHandler), (r"/logout", auth.LogoutHandler), # Error (r".*", NotFoundErrorHandler), ] flower-0.8.3/flower/utils/0000755000076500000240000000000012561016723015537 5ustar mherstaff00000000000000flower-0.8.3/flower/utils/__init__.py0000644000076500000240000000152612517232767017665 0ustar mherstaff00000000000000from __future__ import absolute_import import uuid import base64 import os.path from .. import __version__ def gen_cookie_secret(): return base64.b64encode(uuid.uuid4().bytes + uuid.uuid4().bytes) def bugreport(app=None): try: import celery from celery.app import set_default_app import tornado import babel set_default_app(app) return 'flower -> flower:%s tornado:%s babel:%s%s' % ( __version__, tornado.version, babel.__version__, celery.bugreport() ) except (ImportError, AttributeError): return 'Unknown Celery version' def abs_path(path): path = os.path.expanduser(path) if not os.path.isabs(path): cwd = os.environ.get('PWD') or os.getcwd() path = os.path.join(cwd, path) return path flower-0.8.3/flower/utils/backports/0000755000076500000240000000000012561016723017527 5ustar mherstaff00000000000000flower-0.8.3/flower/utils/backports/__init__.py0000644000076500000240000000000012502222677021630 0ustar mherstaff00000000000000flower-0.8.3/flower/utils/backports/collections.py0000644000076500000240000001432512510076510022416 0ustar mherstaff00000000000000from __future__ import absolute_import from __future__ import print_function from operator import itemgetter from heapq import nlargest from itertools import repeat, ifilter class Counter(dict): """Dict subclass for counting hashable objects. Sometimes called a bag or multiset. Elements are stored as dictionary keys and their counts are stored as dictionary values. >>> Counter('zyzygy') Counter({'y': 3, 'z': 2, 'g': 1}) """ def __init__(self, iterable=None, **kwds): """Create a new, empty Counter object. And if given, count elements from an input iterable. Or, initialize the count from another mapping of elements to their counts. >>> c = Counter() # a new, empty counter >>> c = Counter('gallahad') # a new counter from an iterable >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping >>> c = Counter(a=4, b=2) # a new counter from keyword args """ self.update(iterable, **kwds) def __missing__(self, key): return 0 def most_common(self, n=None): """List the n most common elements and their counts from the most common to the least. If n is None, then list all element counts. >>> Counter('abracadabra').most_common(3) [('a', 5), ('r', 2), ('b', 2)] """ if n is None: return sorted(self.iteritems(), key=itemgetter(1), reverse=True) return nlargest(n, self.iteritems(), key=itemgetter(1)) def elements(self): """Iterator over elements repeating each as many times as its count. >>> c = Counter('ABCABC') >>> sorted(c.elements()) ['A', 'A', 'B', 'B', 'C', 'C'] If an element's count has been set to zero or is a negative number, elements() will ignore it. """ for elem, count in self.iteritems(): for _ in repeat(None, count): yield elem # Override dict methods where the meaning changes for Counter objects. @classmethod def fromkeys(cls, iterable, v=None): raise NotImplementedError( 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.') def update(self, iterable=None, **kwds): """Like dict.update() but add counts instead of replacing them. Source can be an iterable, a dictionary, or another Counter instance. >>> c = Counter('which') >>> c.update('witch') # add elements from another iterable >>> d = Counter('watch') >>> c.update(d) # add elements from another counter >>> c['h'] # four 'h' in which, witch, and watch 4 """ if iterable is not None: if hasattr(iterable, 'iteritems'): if self: self_get = self.get for elem, count in iterable.iteritems(): self[elem] = self_get(elem, 0) + count else: dict.update(self, iterable) # fast path when counter is empty else: self_get = self.get for elem in iterable: self[elem] = self_get(elem, 0) + 1 if kwds: self.update(kwds) def copy(self): 'Like dict.copy() but returns a Counter instance instead of a dict.' return Counter(self) def __delitem__(self, elem): 'Like dict.__delitem__() but does not raise KeyError for missing values.' if elem in self: dict.__delitem__(self, elem) def __repr__(self): if not self: return '%s()' % self.__class__.__name__ items = ', '.join(map('%r: %r'.__mod__, self.most_common())) return '%s({%s})' % (self.__class__.__name__, items) # Multiset-style mathematical operations discussed in: # Knuth TAOCP Volume II section 4.6.3 exercise 19 # and at http://en.wikipedia.org/wiki/Multiset # # Outputs guaranteed to only include positive counts. # # To strip negative and zero counts, add-in an empty counter: # c += Counter() def __add__(self, other): """Add counts from two counters. >>> Counter('abbb') + Counter('bcc') Counter({'b': 4, 'c': 2, 'a': 1}) """ if not isinstance(other, Counter): return NotImplemented result = Counter() for elem in set(self) | set(other): newcount = self[elem] + other[elem] if newcount > 0: result[elem] = newcount return result def __sub__(self, other): """ Subtract count, but keep only results with positive counts. >>> Counter('abbbc') - Counter('bccd') Counter({'b': 2, 'a': 1}) """ if not isinstance(other, Counter): return NotImplemented result = Counter() for elem in set(self) | set(other): newcount = self[elem] - other[elem] if newcount > 0: result[elem] = newcount return result def __or__(self, other): """Union is the maximum of value in either of the input counters. >>> Counter('abbb') | Counter('bcc') Counter({'b': 3, 'c': 2, 'a': 1}) """ if not isinstance(other, Counter): return NotImplemented _max = max result = Counter() for elem in set(self) | set(other): newcount = _max(self[elem], other[elem]) if newcount > 0: result[elem] = newcount return result def __and__(self, other): """ Intersection is the minimum of corresponding counts. >>> Counter('abbb') & Counter('bcc') Counter({'b': 1}) """ if not isinstance(other, Counter): return NotImplemented _min = min result = Counter() if len(self) < len(other): self, other = other, self for elem in ifilter(self.__contains__, other): newcount = _min(self[elem], other[elem]) if newcount > 0: result[elem] = newcount return result if __name__ == '__main__': import doctest print(doctest.testmod()) flower-0.8.3/flower/utils/broker.py0000644000076500000240000001330612561016565017404 0ustar mherstaff00000000000000from __future__ import absolute_import import sys import json import socket import logging import numbers from tornado import ioloop from tornado import gen from tornado import httpclient try: from urllib.parse import urlparse, urljoin, quote, unquote except ImportError: from urlparse import urlparse, urljoin from urllib import quote, unquote try: import redis except ImportError: redis = None logger = logging.getLogger(__name__) class BrokerBase(object): def __init__(self, broker_url, *args, **kwargs): purl = urlparse(broker_url) self.host = purl.hostname self.port = purl.port self.vhost = purl.path[1:] username = purl.username password = purl.password self.username = unquote(username) if username else username self.password = unquote(password) if password else password def queues(self, names): raise NotImplementedError class RabbitMQ(BrokerBase): def __init__(self, broker_url, http_api, io_loop=None, **kwargs): super(RabbitMQ, self).__init__(broker_url) self.io_loop = io_loop or ioloop.IOLoop.instance() self.host = self.host or 'localhost' self.port = 15672 self.vhost = quote(self.vhost, '') or '/' self.username = self.username or 'guest' self.password = self.password or 'guest' if not http_api: http_api = "http://{0}:{1}@{2}:15672/api/{3}".format( self.username, self.password, self.host, self.vhost) self.validate_http_api(http_api) self.http_api = http_api @gen.coroutine def queues(self, names): url = urljoin(self.http_api, 'queues/' + self.vhost) api_url = urlparse(self.http_api) username = unquote(api_url.username or '') or self.username password = unquote(api_url.password or '') or self.password http_client = httpclient.AsyncHTTPClient() try: response = yield http_client.fetch( url, auth_username=username, auth_password=password) except (socket.error, httpclient.HTTPError) as e: logger.error("RabbitMQ management API call failed: %s", e) logger.error("Make sure RabbitMQ Management Plugin is enabled " "(rabbitmq-plugins enable rabbitmq_management)") raise gen.Return([]) finally: http_client.close() if response.code == 200: info = json.loads(response.body.decode()) raise gen.Return([x for x in info if x['name'] in names]) else: response.rethrow() @classmethod def validate_http_api(cls, http_api): url = urlparse(http_api) if url.scheme not in ('http', 'https'): raise ValueError("Invalid http api schema: %s" % url.scheme) if not url.path.startswith('/api/'): raise ValueError("Invalid http api path: %s" % url.path) DEFAULT_REDIS_PRIORITY_STEPS = [0, 3, 6, 9] class Redis(BrokerBase): sep = '\x06\x16' def __init__(self, broker_url, *args, **kwargs): super(Redis, self).__init__(broker_url) self.host = self.host or 'localhost' self.port = self.port or 6379 self.vhost = self._prepare_virtual_host(self.vhost) if not redis: raise ImportError('redis library is required') self.redis = redis.Redis(host=self.host, port=self.port, db=self.vhost, password=self.password) broker_options = kwargs.get('broker_options') if broker_options and 'priority_steps' in broker_options: self.priority_steps = broker_options['priority_steps'] else: self.priority_steps = DEFAULT_REDIS_PRIORITY_STEPS def _q_for_pri(self, queue, pri): if pri not in self.priority_steps: raise ValueError('Priority not in priority steps') return '{0}{1}{2}'.format(*((queue, self.sep, pri) if pri else (queue, '', ''))) @gen.coroutine def queues(self, names): queue_stats = [] for name in names: priority_names = [self._q_for_pri(name, pri) for pri in self.priority_steps] queue_stats.append({ 'name': name, 'messages': sum([self.redis.llen(x) for x in priority_names]) }) raise gen.Return(queue_stats) def _prepare_virtual_host(self, vhost): if not isinstance(vhost, numbers.Integral): if not vhost or vhost == '/': vhost = 0 elif vhost.startswith('/'): vhost = vhost[1:] try: vhost = int(vhost) except ValueError: raise ValueError( 'Database is int between 0 and limit - 1, not {0}'.format( vhost, )) return vhost class Broker(object): def __new__(cls, broker_url, *args, **kwargs): scheme = urlparse(broker_url).scheme if scheme == 'amqp': return RabbitMQ(broker_url, *args, **kwargs) elif scheme == 'redis': return Redis(broker_url, *args, **kwargs) else: raise NotImplementedError @gen.coroutine def main(): broker_url = sys.argv[1] if len(sys.argv) > 1 else 'amqp://' queue_name = sys.argv[2] if len(sys.argv) > 2 else 'celery' if len(sys.argv) > 3: http_api = sys.argv[3] else: http_api = 'http://guest:guest@localhost:15672/api/' broker = Broker(broker_url, http_api=http_api) queues = yield broker.queues([queue_name]) if queues: print(queues) io_loop.stop() if __name__ == "__main__": io_loop = ioloop.IOLoop.instance() io_loop.add_callback(main) io_loop.start() flower-0.8.3/flower/utils/search.py0000644000076500000240000000530712561016565017367 0ustar mherstaff00000000000000import re def parse_search_terms(raw_search_value): search_regexp = r'(?:[^\s,"]|"(?:\\.|[^"])*")+' # splits by space, ignores space in quotes if not raw_search_value: return {} parsed_search = {} for query_part in re.findall(search_regexp, raw_search_value): if not query_part: continue if query_part.startswith('result:'): parsed_search['result'] = preprocess_search_value(query_part[len('result:'):]) elif query_part.startswith('args:'): if 'args' not in parsed_search: parsed_search['args'] = [] parsed_search['args'].append(preprocess_search_value(query_part[len('args:'):])) elif query_part.startswith('kwargs:'): if 'kwargs'not in parsed_search: parsed_search['kwargs'] = {} key, value = [p.strip() for p in query_part[len('kwargs:'):].split('=')] parsed_search['kwargs'][key] = preprocess_search_value(value) else: parsed_search['any'] = preprocess_search_value(query_part) return parsed_search def satisfies_search_terms(task, any_value_search_term, result_search_term, args_search_terms, kwargs_search_terms): if not any([any_value_search_term, result_search_term, args_search_terms, kwargs_search_terms]): return True terms = [ any_value_search_term and any_value_search_term in '|'.join([task.args, task.kwargs, str(task.result)]), result_search_term and result_search_term in task.result, kwargs_search_terms and all( stringified_dict_contains_value(k, v, task.kwargs) for k, v in kwargs_search_terms.items() ), args_search_terms and task_args_contains_search_args(task.args, args_search_terms) ] return any(terms) def stringified_dict_contains_value(key, value, str_dict): """ Checks if dict in for of string like "{'test': 5}" contains key/value pair. This works faster, then creating actual dict from string since this operation is called for each task in case of kwargs search. """ value = str(value) try: key_index = str_dict.index(key) + len(key) + 3 # + 3 for key right quote, one for colon and one for space except ValueError: # key not found return False try: comma_index = str_dict.index(',', key_index) except ValueError: # last value in dict comma_index = str_dict.index('}', key_index) return str(value) == str_dict[key_index:comma_index].strip('"\'') def preprocess_search_value(raw_value): return raw_value.strip('" ') if raw_value else '' def task_args_contains_search_args(task_args, search_args): return all(a in task_args for a in search_args) flower-0.8.3/flower/utils/tasks.py0000644000076500000240000000506312561016565017246 0ustar mherstaff00000000000000from __future__ import absolute_import import datetime import time from celery.events.state import Task from .search import satisfies_search_terms def iter_tasks(events, limit=None, type=None, worker=None, state=None, sort_by=None, received_start=None, received_end=None, started_start=None, started_end=None, search_terms=None): i = 0 tasks = events.state.tasks_by_timestamp() if sort_by is not None: tasks = sort_tasks(tasks, sort_by) convert = lambda x: time.mktime( datetime.datetime.strptime(x, '%Y-%m-%d %H:%M').timetuple() ) any_value_search_term = search_terms.get('any', None) result_search_term = search_terms.get('result', None) args_search_terms = search_terms.get('args', None) kwargs_search_terms = search_terms.get('kwargs', None) args_search_terms = search_terms.get('args', None) for uuid, task in tasks: if type and task.name != type: continue if worker and task.worker and task.worker.hostname != worker: continue if state and task.state != state: continue if received_start and task.received and\ task.received < convert(received_start): continue if received_end and task.received and\ task.received > convert(received_end): continue if started_start and task.started and\ task.started < convert(started_start): continue if started_end and task.started and\ task.started > convert(started_end): continue if not satisfies_search_terms(task, any_value_search_term, result_search_term, args_search_terms, kwargs_search_terms): continue yield uuid, task i += 1 if i == limit: break sort_keys = {'name': str, 'state': str, 'received': float, 'started': float} def sort_tasks(tasks, sort_by): assert sort_by.lstrip('-') in sort_keys reverse = False if sort_by.startswith('-'): sort_by = sort_by.lstrip('-') reverse = True for task in sorted(tasks, key=lambda x: getattr(x[1], sort_by) or sort_keys[sort_by](), reverse=reverse): yield task def get_task_by_id(events, task_id): if hasattr(Task, '_fields'): # Old version return events.state.tasks.get(task_id) else: _fields = Task._defaults.keys() task = events.state.tasks.get(task_id) if task is not None: task._fields = _fields return task flower-0.8.3/flower/utils/template.py0000644000076500000240000000506212502222677017731 0ustar mherstaff00000000000000from __future__ import absolute_import from __future__ import unicode_literals import re import sys from datetime import datetime from datetime import timedelta try: from urllib import urlencode except ImportError: from urllib.parse import urlencode from babel.dates import format_timedelta from pytz import timezone, utc PY2 = sys.version_info[0] == 2 string_types = (str, unicode) if PY2 else (str,) KEYWORDS_UP = ('ssl', 'uri', 'url', 'uuid', 'eta') KEYWORDS_DOWN = ('args', 'kwargs') UUID_REGEX = re.compile(r'^[\w]{8}(-[\w]{4}){3}-[\w]{12}$') def format_time(time, tz): dt = datetime.fromtimestamp(time, tz=tz) return '%s.%s' % ( dt.strftime("%Y-%m-%d %H:%M:%S"), dt.microsecond) def humanize(obj, type=None, length=None): if obj is None: obj = '' elif type and type.startswith('time'): tz = type[len('time'):].lstrip('-') tz = timezone(tz) if tz else utc obj = format_time(float(obj), tz) if obj else '' elif type and type.startswith('natural-time'): tz = type[len('natural-time'):].lstrip('-') tz = timezone(tz) if tz else utc delta = datetime.now(tz) - datetime.fromtimestamp(float(obj), tz) if delta < timedelta(days=1): obj = format_timedelta(delta, locale='en_US') + ' ago' else: obj = format_time(float(obj), tz) if obj else '' elif isinstance(obj, string_types) and not re.match(UUID_REGEX, obj): obj = obj.replace('-', ' ').replace('_', ' ') obj = re.sub('|'.join(KEYWORDS_UP), lambda m: m.group(0).upper(), obj) if obj and obj not in KEYWORDS_DOWN: obj = obj[0].upper() + obj[1:] elif isinstance(obj, list): if all(isinstance(x, (int, float) + string_types) for x in obj): obj = ', '.join(map(str, obj)) if length is not None and len(obj) > length: obj = obj[:length - 4] + ' ...' return obj def sort_url(name, key, sort_by, params=None, class_name='sort'): new_params = {} extra_class = '' title = 'Order by %s DESC' % name if params: new_params.update(params) if sort_by == key: extra_class = 'asc' if sort_by == '-' + key: extra_class = 'desc' title = 'Order by %s ASC' % name if not sort_by or sort_by == key or sort_by.lstrip('-') != key: new_params.update({'sort': '-' + key}) else: new_params.update({'sort': key}) return '%s' % ( class_name, extra_class, urlencode(new_params), title, name ) flower-0.8.3/flower/views/0000755000076500000240000000000012561016723015534 5ustar mherstaff00000000000000flower-0.8.3/flower/views/__init__.py0000644000076500000240000000672412561016565017662 0ustar mherstaff00000000000000from __future__ import absolute_import import re import inspect import traceback from distutils.util import strtobool from base64 import b64decode import tornado from ..utils import template, bugreport class BaseHandler(tornado.web.RequestHandler): def render(self, *args, **kwargs): functions = self._get_template_functions() assert not set(map(lambda x: x[0], functions)) & set(kwargs.keys()) kwargs.update(functions) super(BaseHandler, self).render(*args, **kwargs) def write_error(self, status_code, **kwargs): if status_code in (404, 403): message = None if 'exc_info' in kwargs and\ kwargs['exc_info'][0] == tornado.web.HTTPError: message = kwargs['exc_info'][1].log_message self.render('404.html', message=message) elif status_code == 500: error_trace = "" for line in traceback.format_exception(*kwargs['exc_info']): error_trace += line self.render('error.html', status_code=status_code, error_trace=error_trace, bugreport=bugreport()) elif status_code == 401: self.set_status(status_code) self.set_header('WWW-Authenticate', 'Basic realm="flower"') self.finish('Access denied') else: message = None if 'exc_info' in kwargs and\ kwargs['exc_info'][0] == tornado.web.HTTPError: message = kwargs['exc_info'][1].log_message self.set_header('Content-Type', 'text/plain') self.write(message) self.set_status(status_code) def get_current_user(self): # Basic Auth basic_auth = self.application.options.basic_auth if basic_auth: auth_header = self.request.headers.get("Authorization", "") try: basic, credentials = auth_header.split() credentials = b64decode(credentials.encode()).decode() if basic != 'Basic' or credentials not in basic_auth: raise tornado.web.HTTPError(401) except ValueError: raise tornado.web.HTTPError(401) # Google OpenID if not self.application.options.auth: return True user = self.get_secure_cookie('user') if user: if not isinstance(user, str): user = user.decode() if re.search(self.application.options.auth, user): return user return None def get_argument(self, name, default=[], strip=True, type=None): arg = super(BaseHandler, self).get_argument(name, default, strip) if type is not None: try: if type is bool: arg = strtobool(str(arg)) else: arg = type(arg) except (ValueError, TypeError): if arg is None and default is None: return arg raise tornado.web.HTTPError( 400, "Invalid argument '%s' of type '%s'" % ( arg, type.__name__)) return arg @property def capp(self): "return Celery application object" return self.application.capp @staticmethod def _get_template_functions(): return inspect.getmembers(template, inspect.isfunction) flower-0.8.3/flower/views/auth.py0000644000076500000240000001255412561016565017062 0ustar mherstaff00000000000000from __future__ import absolute_import import json import functools import re import urllib as urllib_parse import tornado.web import tornado.auth from tornado import httpclient from tornado.options import options from celery.utils.imports import instantiate from ..views import BaseHandler class GoogleAuth2LoginHandler(BaseHandler, tornado.auth.GoogleOAuth2Mixin): _OAUTH_SETTINGS_KEY = 'oauth' @tornado.web.asynchronous def get(self): redirect_uri = self.settings[self._OAUTH_SETTINGS_KEY]['redirect_uri'] if self.get_argument('code', False): self.get_authenticated_user( redirect_uri=redirect_uri, code=self.get_argument('code'), callback=self._on_auth, ) else: self.authorize_redirect( redirect_uri=redirect_uri, client_id=self.settings[self._OAUTH_SETTINGS_KEY]['key'], scope=['profile', 'email'], response_type='code', extra_params={'approval_prompt': 'auto'} ) def _on_auth(self, user): if not user: raise tornado.web.HTTPError(403, 'Google auth failed') access_token = user['access_token'] try: response = httpclient.HTTPClient().fetch( 'https://www.googleapis.com/plus/v1/people/me', headers={'Authorization': 'Bearer %s' % access_token}) except Exception as e: raise tornado.web.HTTPError(403, 'Google auth failed: %s' % e) email = json.loads(response.body.decode('utf-8'))['emails'][0]['value'] if not re.match(self.application.options.auth, email): message = ( "Access denied to '{email}'. Please use another account or " "ask your admin to add your email to flower --auth." ).format(email=email) raise tornado.web.HTTPError(403, message) self.set_secure_cookie("user", str(email)) next = self.get_argument('next', '/') self.redirect(next) class LoginHandler(BaseHandler): def __new__(cls, *args, **kwargs): return instantiate(options.auth_provider, *args, **kwargs) class GithubLoginHandler(BaseHandler, tornado.auth.OAuth2Mixin): _OAUTH_AUTHORIZE_URL = "https://github.com/login/oauth/authorize" _OAUTH_ACCESS_TOKEN_URL = "https://github.com/login/oauth/access_token" _OAUTH_NO_CALLBACKS = False _OAUTH_SETTINGS_KEY = 'oauth' @tornado.auth._auth_return_future def get_authenticated_user(self, redirect_uri, code, callback): http = self.get_auth_http_client() body = urllib_parse.urlencode({ "redirect_uri": redirect_uri, "code": code, "client_id": self.settings[self._OAUTH_SETTINGS_KEY]['key'], "client_secret": self.settings[self._OAUTH_SETTINGS_KEY]['secret'], "grant_type": "authorization_code", }) http.fetch( self._OAUTH_ACCESS_TOKEN_URL, functools.partial(self._on_access_token, callback), method="POST", headers={'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, body=body) @tornado.web.asynchronous def _on_access_token(self, future, response): if response.error: future.set_exception(tornado.auth.AuthError('OAuth authentication error: %s' % str(response))) return future.set_result(json.loads(response.body)) def get_auth_http_client(self): return httpclient.AsyncHTTPClient() @tornado.web.asynchronous def get(self): redirect_uri = self.settings[self._OAUTH_SETTINGS_KEY]['redirect_uri'] if self.get_argument('code', False): self.get_authenticated_user( redirect_uri=redirect_uri, code=self.get_argument('code'), callback=self._on_auth, ) else: self.authorize_redirect( redirect_uri=redirect_uri, client_id=self.settings[self._OAUTH_SETTINGS_KEY]['key'], scope=['user:email'], response_type='code', extra_params={'approval_prompt': 'auto'} ) @tornado.web.asynchronous def _on_auth(self, user): if not user: raise tornado.web.HTTPError(500, 'OAuth authentication failed') access_token = user['access_token'] req = httpclient.HTTPRequest('https://api.github.com/user/emails', headers={'Authorization': 'token ' + access_token, 'User-agent': 'Tornado auth'}) response = httpclient.HTTPClient().fetch(req) emails = [email['email'].lower() for email in json.loads(response.body.decode('utf-8')) if email['verified'] and re.match(self.application.options.auth, email['email'])] if not emails: message = ( "Access denied. Please use another account or " "ask your admin to add your email to flower --auth." ) raise tornado.web.HTTPError(403, message) self.set_secure_cookie("user", str(emails.pop())) next_ = self.get_argument('next', '/') self.redirect(next_) class LogoutHandler(BaseHandler): def get(self): self.clear_cookie('user') self.render('404.html', message='Successfully logged out!') flower-0.8.3/flower/views/broker.py0000644000076500000240000000207112561016565017376 0ustar mherstaff00000000000000from __future__ import absolute_import import logging from tornado import web from tornado import gen from ..views import BaseHandler from ..utils.broker import Broker from ..api.control import ControlHandler logger = logging.getLogger(__name__) class BrokerView(BaseHandler): @web.authenticated @gen.coroutine def get(self): app = self.application broker_options = self.capp.conf.BROKER_TRANSPORT_OPTIONS http_api = None if app.transport == 'amqp' and app.options.broker_api: http_api = app.options.broker_api broker = Broker(app.capp.connection().as_uri(include_password=True), http_api=http_api, broker_options=broker_options) queue_names = ControlHandler.get_active_queue_names() if not queue_names: queue_names = set([self.capp.conf.CELERY_DEFAULT_QUEUE]) queues = yield broker.queues(sorted(queue_names)) self.render("broker.html", broker_url=app.capp.connection().as_uri(), queues=queues) flower-0.8.3/flower/views/dashboard.py0000644000076500000240000000673212561016565020051 0ustar mherstaff00000000000000from __future__ import absolute_import import logging from functools import partial try: from collections import OrderedDict except ImportError: from ordereddict import OrderedDict from tornado import web from tornado import gen from tornado import websocket from tornado.ioloop import PeriodicCallback from ..views import BaseHandler from ..api.workers import ListWorkers logger = logging.getLogger(__name__) class DashboardView(BaseHandler): @web.authenticated @gen.coroutine def get(self): refresh = self.get_argument('refresh', default=False, type=bool) app = self.application events = app.events.state broker = app.capp.connection().as_uri() if refresh: yield ListWorkers.update_workers(app=app) workers = {} for name, values in events.counter.items(): if name not in events.workers: continue worker = events.workers[name] info = dict(values) info.update(self._as_dict(worker)) info.update(status=worker.alive) workers[name] = info self.render("dashboard.html", workers=workers, broker=broker) @classmethod def _as_dict(cls, worker): return dict((k, worker.__getattribute__(k)) for k in worker._fields) class DashboardUpdateHandler(websocket.WebSocketHandler): listeners = [] periodic_callback = None workers = None page_update_interval = 2000 def open(self): app = self.application if not app.options.auto_refresh: self.write_message({}) return if not self.listeners: if self.periodic_callback is None: cls = DashboardUpdateHandler cls.periodic_callback = PeriodicCallback( partial(cls.on_update_time, app), self.page_update_interval) if not self.periodic_callback._running: logger.debug('Starting a timer for dashboard updates') self.periodic_callback.start() self.listeners.append(self) def on_message(self, message): pass def on_close(self): if self in self.listeners: self.listeners.remove(self) if not self.listeners and self.periodic_callback: logger.debug('Stopping dashboard updates timer') self.periodic_callback.stop() @classmethod def on_update_time(cls, app): update = cls.dashboard_update(app) if update: for l in cls.listeners: l.write_message(update) @classmethod def dashboard_update(cls, app): state = app.events.state workers = OrderedDict() for name, worker in sorted(state.workers.items()): counter = state.counter[name] started = counter.get('task-started', 0) processed = counter.get('task-received', 0) failed = counter.get('task-failed', 0) succeeded = counter.get('task-succeeded', 0) retried = counter.get('task-retried', 0) active = started - succeeded - failed - retried if active < 0: active = 'N/A' workers[name] = dict( status=worker.alive, active=active, processed=processed, failed=failed, succeeded=succeeded, retried=retried, loadavg=getattr(worker, 'loadavg', None)) return workers flower-0.8.3/flower/views/error.py0000644000076500000240000000040112405107470017227 0ustar mherstaff00000000000000from __future__ import absolute_import import tornado.web from ..views import BaseHandler class NotFoundErrorHandler(BaseHandler): def get(self): raise tornado.web.HTTPError(404) def post(self): raise tornado.web.HTTPError(404) flower-0.8.3/flower/views/monitor.py0000644000076500000240000000602312502222677017600 0ustar mherstaff00000000000000from __future__ import absolute_import from collections import defaultdict from tornado import web from tornado import gen from celery import states from ..views import BaseHandler from ..utils.broker import Broker from ..api.control import ControlHandler class Monitor(BaseHandler): @web.authenticated def get(self): self.render("monitor.html") class SucceededTaskMonitor(BaseHandler): @web.authenticated def get(self): timestamp = self.get_argument('lastquery', type=float) state = self.application.events.state data = defaultdict(int) for _, task in state.itertasks(): if (timestamp < task.timestamp and task.state == states.SUCCESS): data[task.worker.hostname] += 1 for worker in state.workers: if worker not in data: data[worker] = 0 self.write(data) class TimeToCompletionMonitor(BaseHandler): @web.authenticated def get(self): timestamp = self.get_argument('lastquery', type=float) state = self.application.events.state execute_time = 0 queue_time = 0 num_tasks = 0 for _, task in state.itertasks(): if (timestamp < task.timestamp and task.state == states.SUCCESS): # eta can make "time in queue" look really scary. if task.eta is not None: continue if task.started is None or task.received is None or\ task.succeeded is None: continue queue_time += task.started - task.received execute_time += task.succeeded - task.started num_tasks += 1 avg_queue_time = (queue_time / num_tasks) if num_tasks > 0 else 0 avg_execution_time = (execute_time / num_tasks) if num_tasks > 0 else 0 result = { "Time in a queue": avg_queue_time, "Execution time": avg_execution_time, } self.write(result) class FailedTaskMonitor(BaseHandler): @web.authenticated def get(self): timestamp = self.get_argument('lastquery', type=float) state = self.application.events.state data = defaultdict(int) for _, task in state.itertasks(): if (timestamp < task.timestamp and task.state == states.FAILURE): data[task.worker.hostname] += 1 for worker in state.workers: if worker not in data: data[worker] = 0 self.write(data) class BrokerMonitor(BaseHandler): @web.authenticated @gen.coroutine def get(self): app = self.application capp = app.capp broker = Broker(capp.connection().as_uri(include_password=True), http_api=app.options.broker_api) queue_names = ControlHandler.get_active_queue_names() queues = yield broker.queues(queue_names) data = defaultdict(int) for queue in queues: data[queue['name']] = queue.get('messages', 0) self.write(data) flower-0.8.3/flower/views/tasks.py0000644000076500000240000000606712561016565017250 0ustar mherstaff00000000000000from __future__ import absolute_import import copy try: from itertools import imap except ImportError: imap = map import celery from tornado import web from ..views import BaseHandler from ..utils.tasks import iter_tasks, get_task_by_id from ..utils.search import parse_search_terms class TaskView(BaseHandler): @web.authenticated def get(self, task_id): task = get_task_by_id(self.application.events, task_id) if task is None: raise web.HTTPError(404, "Unknown task '%s'" % task_id) self.render("task.html", task=task) class TasksView(BaseHandler): @web.authenticated def get(self): app = self.application capp = self.application.capp limit = self.get_argument('limit', default=None, type=int) worker = self.get_argument('worker', None) type = self.get_argument('type', None) state = self.get_argument('state', None) sort_by = self.get_argument('sort', None) received_start = self.get_argument('received-start', None) received_end = self.get_argument('received-end', None) started_start = self.get_argument('started-start', None) started_end = self.get_argument('started-end', None) search = self.get_argument('search', None) worker = worker if worker != 'All' else None type = type if type != 'All' else None state = state if state != 'All' else None tasks = iter_tasks( app.events, limit=limit, type=type, worker=worker, state=state, sort_by=sort_by, received_start=received_start, received_end=received_end, started_start=started_start, started_end=started_end, search_terms=parse_search_terms(search), ) tasks = imap(self.format_task, tasks) workers = app.events.state.workers seen_task_types = app.events.state.task_types() time = 'natural-time' if app.options.natural_time else 'time' if capp.conf.CELERY_TIMEZONE: time += '-' + capp.conf.CELERY_TIMEZONE params = dict((k, v[-1]) for (k, v) in self.request.query_arguments.items()) columns = app.options.tasks_columns.split(',') self.render( "tasks.html", tasks=tasks, columns=columns, task_types=seen_task_types, all_states=celery.states.ALL_STATES, workers=workers, limit=limit, worker=worker, type=type, state=state, sort_by=sort_by, received_start=received_start, received_end=received_end, started_start=started_start, started_end=started_end, params=params, time=time, search=search ) def format_task(self, args): uuid, task = args custom_format_task = self.application.options.format_task if custom_format_task: task = custom_format_task(copy.copy(task)) return uuid, task flower-0.8.3/flower/views/workers.py0000644000076500000240000000167712517232767017626 0ustar mherstaff00000000000000from __future__ import absolute_import import logging from tornado import web from tornado import gen from ..views import BaseHandler from ..api.workers import ListWorkers logger = logging.getLogger(__name__) class WorkerView(BaseHandler): @web.authenticated @gen.coroutine def get(self, name): refresh = self.get_argument('refresh', default=False, type=bool) if refresh: try: yield ListWorkers.update_workers(app=self.application, workername=name) except Exception as e: logger.error(e) worker = ListWorkers.worker_cache.get(name) if worker is None: raise web.HTTPError(404, "Unknown worker '%s'" % name) if 'stats' not in worker: raise web.HTTPError( 404, "Unable to get stats for '%s' worker" % name ) self.render("worker.html", worker=dict(worker, name=name)) flower-0.8.3/flower.egg-info/0000755000076500000240000000000012561016723016071 5ustar mherstaff00000000000000flower-0.8.3/flower.egg-info/dependency_links.txt0000644000076500000240000000000112561016722022136 0ustar mherstaff00000000000000 flower-0.8.3/flower.egg-info/entry_points.txt0000644000076500000240000000015212561016722021364 0ustar mherstaff00000000000000[celery.commands] flower = flower.command:FlowerCommand [console_scripts] flower = flower.__main__:main flower-0.8.3/flower.egg-info/pbr.json0000644000076500000240000000005712561016723017551 0ustar mherstaff00000000000000{"is_release": false, "git_version": "de82fe3"}flower-0.8.3/flower.egg-info/PKG-INFO0000644000076500000240000001423112561016722017166 0ustar mherstaff00000000000000Metadata-Version: 1.1 Name: flower Version: 0.8.3 Summary: Celery Flower Home-page: https://github.com/mher/flower Author: Mher Movsisyan Author-email: mher.movsisyan@gmail.com License: BSD Description: Celery Flower ============= .. image:: https://img.shields.io/pypi/v/flower.svg :target: https://pypi.python.org/pypi/flower .. image:: https://img.shields.io/pypi/dm/flower.svg :target: https://pypi.python.org/pypi/flower .. image:: https://travis-ci.org/mher/flower.svg?branch=master :target: https://travis-ci.org/mher/flower Flower is a web based tool for monitoring and administrating Celery clusters. Features -------- - Real-time monitoring using Celery Events - Task progress and history - Ability to show task details (arguments, start time, runtime, and more) - Graphs and statistics - Remote Control - View worker status and statistics - Shutdown and restart worker instances - Control worker pool size and autoscale settings - View and modify the queues a worker instance consumes from - View currently running tasks - View scheduled tasks (ETA/countdown) - View reserved and revoked tasks - Apply time and rate limits - Configuration viewer - Revoke or terminate tasks - Broker monitoring - View statistics for all Celery queues - Queue length graphs - HTTP API - Basic Auth and Google OpenID authentication API --- Flower API enables to manage the cluster via REST API, call tasks and receive task events in real-time via WebSockets. For example you can restart worker's pool by: :: $ curl -X POST http://localhost:5555/api/worker/pool/restart/myworker Or call a task by: :: $ curl -X POST -d '{"args":[1,2]}' http://localhost:5555/api/task/async-apply/tasks.add Or terminate executing task by: :: $ curl -X POST -d 'terminate=True' http://localhost:5555/api/task/revoke/8a4da87b-e12b-4547-b89a-e92e4d1f8efd Or receive task completion events in real-time: .. code-block:: javascript var ws = new WebSocket('ws://localhost:5555/api/task/events/task-succeeded/'); ws.onmessage = function (event) { console.log(event.data); } For more info checkout `API Reference`_ and `examples`_. .. _API Reference: http://flower.readthedocs.org/en/latest/api.html .. _examples: http://nbviewer.ipython.org/urls/raw.github.com/mher/flower/master/docs/api.ipynb Installation ------------ PyPI version: :: $ pip install flower Development version: :: $ pip install https://github.com/mher/flower/zipball/master Usage ----- Launch the server and open http://localhost:5555: :: $ flower --port=5555 Or launch from celery: :: $ celery flower -A proj --address=127.0.0.1 --port=5555 Broker URL and other configuration options can be passed through the standard Celery options: :: $ celery flower -A proj --broker=amqp://guest:guest@localhost:5672// Documentation ------------- Documentation is available at `Read the Docs`_ and `IPython Notebook Viewer`_ .. _Read the Docs: http://flower.readthedocs.org .. _IPython Notebook Viewer: http://nbviewer.ipython.org/urls/raw.github.com/mher/flower/master/docs/api.ipynb Screenshots ----------- .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/dashboard.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/pool.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/tasks.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/task.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/monitor.png :width: 100% More screenshots_ .. _screenshots: https://github.com/mher/flower/tree/master/docs/screenshots Getting help ------------ Please head over to #celery IRC channel on irc.freenode.net or `open an issue`_. .. _open an issue: https://github.com/mher/flower/issues Contributing ------------ If you'd like to contribute, simply fork `the repository`_, commit your changes, run the tests (`python -m tests`) and send a pull request. Make sure you add yourself to AUTHORS_. If you are interested in maintaining the project please contact. .. _`the repository`: https://github.com/mher/flower .. _AUTHORS: https://github.com/mher/flower/blob/master/AUTHORS Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Topic :: System :: Distributed Computing Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Operating System :: OS Independent flower-0.8.3/flower.egg-info/requires.txt0000644000076500000240000000006012561016722020464 0ustar mherstaff00000000000000celery>=2.5.0 tornado>=4.0.0 babel pytz futures flower-0.8.3/flower.egg-info/SOURCES.txt0000644000076500000240000001450512561016723017762 0ustar mherstaff00000000000000AUTHORS CHANGES LICENSE MANIFEST.in README.rst setup.cfg setup.py docs/Makefile docs/api.ipynb docs/api.rst docs/auth.rst docs/conf.py docs/config.rst docs/docker.rst docs/features.rst docs/index.rst docs/install.rst docs/man.rst docs/reverse-proxy.rst docs/screenshots.rst docs/tasks.py docs/tasks_filter.rst docs/.build/doctrees/api.doctree docs/.build/doctrees/auth.doctree docs/.build/doctrees/config.doctree docs/.build/doctrees/docker.doctree docs/.build/doctrees/features.doctree docs/.build/doctrees/index.doctree docs/.build/doctrees/install.doctree docs/.build/doctrees/man.doctree docs/.build/doctrees/reverse-proxy.doctree docs/.build/doctrees/screenshots.doctree docs/.build/html/.buildinfo docs/.build/html/api.html docs/.build/html/auth.html docs/.build/html/config.html docs/.build/html/docker.html docs/.build/html/features.html docs/.build/html/index.html docs/.build/html/install.html docs/.build/html/man.html docs/.build/html/objects.inv docs/.build/html/reverse-proxy.html docs/.build/html/screenshots.html docs/.build/html/search.html docs/.build/html/searchindex.js docs/.build/html/_images/broker.png docs/.build/html/_images/config.png docs/.build/html/_images/dashboard.png docs/.build/html/_images/limits.png docs/.build/html/_images/monitor.png docs/.build/html/_images/pool.png docs/.build/html/_images/queues.png docs/.build/html/_images/task.png docs/.build/html/_images/tasks.png docs/.build/html/_images/worker-tasks.png docs/.build/html/_sources/api.txt docs/.build/html/_sources/auth.txt docs/.build/html/_sources/config.txt docs/.build/html/_sources/docker.txt docs/.build/html/_sources/features.txt docs/.build/html/_sources/index.txt docs/.build/html/_sources/install.txt docs/.build/html/_sources/man.txt docs/.build/html/_sources/reverse-proxy.txt docs/.build/html/_sources/screenshots.txt docs/.build/html/_static/ajax-loader.gif docs/.build/html/_static/basic.css docs/.build/html/_static/celery.css docs/.build/html/_static/comment-bright.png docs/.build/html/_static/comment-close.png docs/.build/html/_static/comment.png docs/.build/html/_static/doctools.js docs/.build/html/_static/down-pressed.png docs/.build/html/_static/down.png docs/.build/html/_static/file.png docs/.build/html/_static/jquery.js docs/.build/html/_static/minus.png docs/.build/html/_static/plus.png docs/.build/html/_static/pygments.css docs/.build/html/_static/searchtools.js docs/.build/html/_static/underscore.js docs/.build/html/_static/up-pressed.png docs/.build/html/_static/up.png docs/.build/html/_static/websupport.js docs/_static/.keep docs/_templates/.localtoc.html.swp docs/_templates/localtoc.html docs/_templates/page.html docs/_templates/sidebarintro.html docs/_templates/sidebarlogo.html docs/_theme/celery/theme.conf docs/_theme/celery/static/celery.css_t docs/screenshots/broker.png docs/screenshots/config.png docs/screenshots/dashboard.png docs/screenshots/limits.png docs/screenshots/monitor.png docs/screenshots/pool.png docs/screenshots/queues.png docs/screenshots/task.png docs/screenshots/tasks.png docs/screenshots/worker-tasks.png flower/__init__.py flower/__main__.py flower/app.py flower/command.py flower/events.py flower/options.py flower/urls.py flower.egg-info/PKG-INFO flower.egg-info/SOURCES.txt flower.egg-info/dependency_links.txt flower.egg-info/entry_points.txt flower.egg-info/pbr.json flower.egg-info/requires.txt flower.egg-info/top_level.txt flower/api/__init__.py flower/api/control.py flower/api/events.py flower/api/tasks.py flower/api/workers.py flower/static/favicon.ico flower/static/css/bootstrap-datetimepicker.min.css flower/static/css/bootstrap-responsive.css flower/static/css/bootstrap-responsive.min.css flower/static/css/bootstrap.css flower/static/css/bootstrap.min.css flower/static/css/flower.css flower/static/css/jquery-ui.css flower/static/css/rickshaw.min.css flower/static/img/apple-touch-icon-114-precomposed.png flower/static/img/apple-touch-icon-144-precomposed.png flower/static/img/apple-touch-icon-57-precomposed.png flower/static/img/apple-touch-icon-72-precomposed.png flower/static/img/glyphicons-halflings-white.png flower/static/img/glyphicons-halflings.png flower/static/js/bootstrap-alert.js flower/static/js/bootstrap-button.js flower/static/js/bootstrap-carousel.js flower/static/js/bootstrap-collapse.js flower/static/js/bootstrap-datetimepicker.min.js flower/static/js/bootstrap-dropdown.js flower/static/js/bootstrap-modal.js flower/static/js/bootstrap-popover.js flower/static/js/bootstrap-scrollspy.js flower/static/js/bootstrap-tab.js flower/static/js/bootstrap-tooltip.js flower/static/js/bootstrap-transition.js flower/static/js/bootstrap-typeahead.js flower/static/js/bootstrap.js flower/static/js/bootstrap.min.js flower/static/js/d3.layout.min.js flower/static/js/d3.min.js flower/static/js/flower.js flower/static/js/jquery-1.7.2.min.js flower/static/js/jquery-ui-1-8-15.min.js flower/static/js/rickshaw.min.js flower/templates/404.html flower/templates/base.html flower/templates/broker.html flower/templates/dashboard.html flower/templates/error.html flower/templates/monitor.html flower/templates/navbar.html flower/templates/task.html flower/templates/tasks.html flower/templates/worker.html flower/utils/__init__.py flower/utils/broker.py flower/utils/search.py flower/utils/tasks.py flower/utils/template.py flower/utils/backports/__init__.py flower/utils/backports/collections.py flower/views/__init__.py flower/views/auth.py flower/views/broker.py flower/views/dashboard.py flower/views/error.py flower/views/monitor.py flower/views/tasks.py flower/views/workers.py requirements/default.txt requirements/dev.txt requirements/docs.txt requirements/test.txt tests/__init__.py tests/__init__.pyc tests/__main__.py tests/api/__init__.py tests/api/__init__.pyc tests/api/test_control.py tests/api/test_control.pyc tests/api/test_events.py tests/api/test_events.pyc tests/api/test_tasks.py tests/api/test_tasks.pyc tests/utils/__init__.py tests/utils/__init__.pyc tests/utils/test_broker.py tests/utils/test_broker.pyc tests/utils/test_search.py tests/utils/test_search.pyc tests/utils/test_template.py tests/utils/test_template.pyc tests/views/__init__.py tests/views/__init__.pyc tests/views/test_auth.py tests/views/test_auth.pyc tests/views/test_dashboard.py tests/views/test_dashboard.pyc tests/views/test_error.py tests/views/test_error.pyc tests/views/test_monitor.py tests/views/test_monitor.pyc tests/views/test_tasks.py tests/views/test_tasks.pycflower-0.8.3/flower.egg-info/top_level.txt0000644000076500000240000000000712561016722020617 0ustar mherstaff00000000000000flower flower-0.8.3/LICENSE0000644000076500000240000000301112324702473014102 0ustar mherstaff00000000000000Copyright (c) 2012, Mher Movsisyan and individual contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Celery Flower nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. flower-0.8.3/MANIFEST.in0000644000076500000240000000036612502222677014646 0ustar mherstaff00000000000000include AUTHORS include CHANGES include LICENSE include MANIFEST.in include README.rst recursive-include docs * recursive-include flower/static * recursive-include flower/templates * recursive-include tests * recursive-include requirements *.txt flower-0.8.3/PKG-INFO0000644000076500000240000001423112561016723014177 0ustar mherstaff00000000000000Metadata-Version: 1.1 Name: flower Version: 0.8.3 Summary: Celery Flower Home-page: https://github.com/mher/flower Author: Mher Movsisyan Author-email: mher.movsisyan@gmail.com License: BSD Description: Celery Flower ============= .. image:: https://img.shields.io/pypi/v/flower.svg :target: https://pypi.python.org/pypi/flower .. image:: https://img.shields.io/pypi/dm/flower.svg :target: https://pypi.python.org/pypi/flower .. image:: https://travis-ci.org/mher/flower.svg?branch=master :target: https://travis-ci.org/mher/flower Flower is a web based tool for monitoring and administrating Celery clusters. Features -------- - Real-time monitoring using Celery Events - Task progress and history - Ability to show task details (arguments, start time, runtime, and more) - Graphs and statistics - Remote Control - View worker status and statistics - Shutdown and restart worker instances - Control worker pool size and autoscale settings - View and modify the queues a worker instance consumes from - View currently running tasks - View scheduled tasks (ETA/countdown) - View reserved and revoked tasks - Apply time and rate limits - Configuration viewer - Revoke or terminate tasks - Broker monitoring - View statistics for all Celery queues - Queue length graphs - HTTP API - Basic Auth and Google OpenID authentication API --- Flower API enables to manage the cluster via REST API, call tasks and receive task events in real-time via WebSockets. For example you can restart worker's pool by: :: $ curl -X POST http://localhost:5555/api/worker/pool/restart/myworker Or call a task by: :: $ curl -X POST -d '{"args":[1,2]}' http://localhost:5555/api/task/async-apply/tasks.add Or terminate executing task by: :: $ curl -X POST -d 'terminate=True' http://localhost:5555/api/task/revoke/8a4da87b-e12b-4547-b89a-e92e4d1f8efd Or receive task completion events in real-time: .. code-block:: javascript var ws = new WebSocket('ws://localhost:5555/api/task/events/task-succeeded/'); ws.onmessage = function (event) { console.log(event.data); } For more info checkout `API Reference`_ and `examples`_. .. _API Reference: http://flower.readthedocs.org/en/latest/api.html .. _examples: http://nbviewer.ipython.org/urls/raw.github.com/mher/flower/master/docs/api.ipynb Installation ------------ PyPI version: :: $ pip install flower Development version: :: $ pip install https://github.com/mher/flower/zipball/master Usage ----- Launch the server and open http://localhost:5555: :: $ flower --port=5555 Or launch from celery: :: $ celery flower -A proj --address=127.0.0.1 --port=5555 Broker URL and other configuration options can be passed through the standard Celery options: :: $ celery flower -A proj --broker=amqp://guest:guest@localhost:5672// Documentation ------------- Documentation is available at `Read the Docs`_ and `IPython Notebook Viewer`_ .. _Read the Docs: http://flower.readthedocs.org .. _IPython Notebook Viewer: http://nbviewer.ipython.org/urls/raw.github.com/mher/flower/master/docs/api.ipynb Screenshots ----------- .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/dashboard.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/pool.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/tasks.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/task.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/monitor.png :width: 100% More screenshots_ .. _screenshots: https://github.com/mher/flower/tree/master/docs/screenshots Getting help ------------ Please head over to #celery IRC channel on irc.freenode.net or `open an issue`_. .. _open an issue: https://github.com/mher/flower/issues Contributing ------------ If you'd like to contribute, simply fork `the repository`_, commit your changes, run the tests (`python -m tests`) and send a pull request. Make sure you add yourself to AUTHORS_. If you are interested in maintaining the project please contact. .. _`the repository`: https://github.com/mher/flower .. _AUTHORS: https://github.com/mher/flower/blob/master/AUTHORS Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Topic :: System :: Distributed Computing Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Operating System :: OS Independent flower-0.8.3/README.rst0000644000076500000240000001006512561016565014576 0ustar mherstaff00000000000000Celery Flower ============= .. image:: https://img.shields.io/pypi/v/flower.svg :target: https://pypi.python.org/pypi/flower .. image:: https://img.shields.io/pypi/dm/flower.svg :target: https://pypi.python.org/pypi/flower .. image:: https://travis-ci.org/mher/flower.svg?branch=master :target: https://travis-ci.org/mher/flower Flower is a web based tool for monitoring and administrating Celery clusters. Features -------- - Real-time monitoring using Celery Events - Task progress and history - Ability to show task details (arguments, start time, runtime, and more) - Graphs and statistics - Remote Control - View worker status and statistics - Shutdown and restart worker instances - Control worker pool size and autoscale settings - View and modify the queues a worker instance consumes from - View currently running tasks - View scheduled tasks (ETA/countdown) - View reserved and revoked tasks - Apply time and rate limits - Configuration viewer - Revoke or terminate tasks - Broker monitoring - View statistics for all Celery queues - Queue length graphs - HTTP API - Basic Auth and Google OpenID authentication API --- Flower API enables to manage the cluster via REST API, call tasks and receive task events in real-time via WebSockets. For example you can restart worker's pool by: :: $ curl -X POST http://localhost:5555/api/worker/pool/restart/myworker Or call a task by: :: $ curl -X POST -d '{"args":[1,2]}' http://localhost:5555/api/task/async-apply/tasks.add Or terminate executing task by: :: $ curl -X POST -d 'terminate=True' http://localhost:5555/api/task/revoke/8a4da87b-e12b-4547-b89a-e92e4d1f8efd Or receive task completion events in real-time: .. code-block:: javascript var ws = new WebSocket('ws://localhost:5555/api/task/events/task-succeeded/'); ws.onmessage = function (event) { console.log(event.data); } For more info checkout `API Reference`_ and `examples`_. .. _API Reference: http://flower.readthedocs.org/en/latest/api.html .. _examples: http://nbviewer.ipython.org/urls/raw.github.com/mher/flower/master/docs/api.ipynb Installation ------------ PyPI version: :: $ pip install flower Development version: :: $ pip install https://github.com/mher/flower/zipball/master Usage ----- Launch the server and open http://localhost:5555: :: $ flower --port=5555 Or launch from celery: :: $ celery flower -A proj --address=127.0.0.1 --port=5555 Broker URL and other configuration options can be passed through the standard Celery options: :: $ celery flower -A proj --broker=amqp://guest:guest@localhost:5672// Documentation ------------- Documentation is available at `Read the Docs`_ and `IPython Notebook Viewer`_ .. _Read the Docs: http://flower.readthedocs.org .. _IPython Notebook Viewer: http://nbviewer.ipython.org/urls/raw.github.com/mher/flower/master/docs/api.ipynb Screenshots ----------- .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/dashboard.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/pool.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/tasks.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/task.png :width: 100% .. image:: https://raw.github.com/mher/flower/master/docs/screenshots/monitor.png :width: 100% More screenshots_ .. _screenshots: https://github.com/mher/flower/tree/master/docs/screenshots Getting help ------------ Please head over to #celery IRC channel on irc.freenode.net or `open an issue`_. .. _open an issue: https://github.com/mher/flower/issues Contributing ------------ If you'd like to contribute, simply fork `the repository`_, commit your changes, run the tests (`python -m tests`) and send a pull request. Make sure you add yourself to AUTHORS_. If you are interested in maintaining the project please contact. .. _`the repository`: https://github.com/mher/flower .. _AUTHORS: https://github.com/mher/flower/blob/master/AUTHORS flower-0.8.3/requirements/0000755000076500000240000000000012561016723015624 5ustar mherstaff00000000000000flower-0.8.3/requirements/default.txt0000644000076500000240000000005012561016553020005 0ustar mherstaff00000000000000celery>=2.5.0 tornado>=4.0.0 babel pytz flower-0.8.3/requirements/dev.txt0000644000076500000240000000003312436677004017145 0ustar mherstaff00000000000000-r default.txt -r test.txt flower-0.8.3/requirements/docs.txt0000644000076500000240000000011512436677004017320 0ustar mherstaff00000000000000-r default.txt futures Sphinx sphinxcontrib-fulltoc sphinxcontrib-httpdomain flower-0.8.3/requirements/test.txt0000644000076500000240000000000512436677004017345 0ustar mherstaff00000000000000mock flower-0.8.3/setup.cfg0000644000076500000240000000012212561016723014715 0ustar mherstaff00000000000000[wheel] universal = 1 [egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 flower-0.8.3/setup.py0000644000076500000240000000421212510076510014604 0ustar mherstaff00000000000000#!/usr/bin/env python import os import re import sys from setuptools import setup, find_packages version = re.compile(r'VERSION\s*=\s*\((.*?)\)') def get_package_version(): "returns package version without importing it" base = os.path.abspath(os.path.dirname(__file__)) with open(os.path.join(base, "flower/__init__.py")) as initf: for line in initf: m = version.match(line.strip()) if not m: continue return ".".join(m.groups()[0].split(", ")) def get_requirements(filename): return open('requirements/' + filename).read().splitlines() classes = """ Development Status :: 4 - Beta Intended Audience :: Developers License :: OSI Approved :: BSD License Topic :: System :: Distributed Computing Programming Language :: Python Programming Language :: Python :: 2 Programming Language :: Python :: 2.6 Programming Language :: Python :: 2.7 Programming Language :: Python :: 3 Programming Language :: Python :: 3.3 Programming Language :: Python :: 3.4 Programming Language :: Python :: Implementation :: CPython Programming Language :: Python :: Implementation :: PyPy Operating System :: OS Independent """ classifiers = [s.strip() for s in classes.split('\n') if s] install_requires = get_requirements('default.txt') if sys.version_info < (3, 0): install_requires.append('futures') setup( name='flower', version=get_package_version(), description='Celery Flower', long_description=open('README.rst').read(), author='Mher Movsisyan', author_email='mher.movsisyan@gmail.com', url='https://github.com/mher/flower', license='BSD', classifiers=classifiers, packages=find_packages(exclude=['tests', 'tests.*']), install_requires=install_requires, test_suite="tests", tests_require=get_requirements('test.txt'), package_data={'flower': ['templates/*', 'static/**/*', 'static/*.*']}, entry_points={ 'console_scripts': [ 'flower = flower.__main__:main', ], 'celery.commands': [ 'flower = flower.command:FlowerCommand', ], }, ) flower-0.8.3/tests/0000755000076500000240000000000012561016723014243 5ustar mherstaff00000000000000flower-0.8.3/tests/__init__.py0000644000076500000240000000200712510076510016345 0ustar mherstaff00000000000000try: from urllib.parse import urlencode except ImportError: from urllib import urlencode import tornado.testing import tornado.options import celery from flower.app import Flower from flower.urls import handlers from flower.events import Events from flower.urls import settings from flower import command # side effect - define options class AsyncHTTPTestCase(tornado.testing.AsyncHTTPTestCase): def get_app(self): capp = celery.Celery() events = Events(capp) app = Flower(capp=capp, events=events, options=tornado.options.options, handlers=handlers, **settings) app.delay = lambda method, *args, **kwargs: method(*args, **kwargs) return app def get(self, url, **kwargs): return self.fetch(url, **kwargs) def post(self, url, **kwargs): if 'body' in kwargs and isinstance(kwargs['body'], dict): kwargs['body'] = urlencode(kwargs['body']) return self.fetch(url, method='POST', **kwargs) flower-0.8.3/tests/__main__.py0000644000076500000240000000050712504711113016327 0ustar mherstaff00000000000000import unittest import tornado.testing from glob import glob def all(): test_modules = list(map(lambda x: x.rstrip('.py').replace('/', '.'), glob('tests/**/*.py'))) return unittest.defaultTestLoader.loadTestsFromNames(test_modules) if __name__ == "__main__": tornado.testing.main() flower-0.8.3/tests/api/0000755000076500000240000000000012561016723015014 5ustar mherstaff00000000000000flower-0.8.3/tests/api/__init__.py0000644000076500000240000000000012405107732017111 0ustar mherstaff00000000000000flower-0.8.3/tests/api/test_control.py0000644000076500000240000001265012510076510020103 0ustar mherstaff00000000000000from mock import MagicMock from flower.api.control import ControlHandler from tests import AsyncHTTPTestCase class UnknownWorkerControlTests(AsyncHTTPTestCase): def test_unknown_worker(self): r = self.post('/api/worker/shutdown/test', body={}) self.assertEqual(404, r.code) class WorkerControlTests(AsyncHTTPTestCase): def setUp(self): AsyncHTTPTestCase.setUp(self) self.is_worker = ControlHandler.is_worker ControlHandler.is_worker = lambda *args: True def tearDown(self): AsyncHTTPTestCase.tearDown(self) ControlHandler.is_worker = self.is_worker def test_shutdown(self): celery = self._app.capp celery.control.broadcast = MagicMock() r = self.post('/api/worker/shutdown/test', body={}) self.assertEqual(200, r.code) celery.control.broadcast.assert_called_once_with('shutdown', destination=['test']) def test_pool_restart(self): celery = self._app.capp celery.control.broadcast = MagicMock(return_value=[{'test': 'ok'}]) r = self.post('/api/worker/pool/restart/test', body={}) self.assertEqual(200, r.code) celery.control.broadcast.assert_called_once() def test_pool_grow(self): celery = self._app.capp celery.control.pool_grow = MagicMock(return_value=[{'test': 'ok'}]) r = self.post('/api/worker/pool/grow/test', body={'n': 3}) self.assertEqual(200, r.code) celery.control.pool_grow.assert_called_once_with( n=3, reply=True, destination=['test']) def test_pool_shrink(self): celery = self._app.capp celery.control.pool_shrink = MagicMock(return_value=[{'test': 'ok'}]) r = self.post('/api/worker/pool/shrink/test', body={}) self.assertEqual(200, r.code) celery.control.pool_shrink.assert_called_once_with( n=1, reply=True, destination=['test']) def test_pool_autoscale(self): celery = self._app.capp celery.control.broadcast = MagicMock(return_value=[{'test': 'ok'}]) r = self.post('/api/worker/pool/autoscale/test', body={'min': 2, 'max': 5}) self.assertEqual(200, r.code) celery.control.broadcast.assert_called_once_with( 'autoscale', reply=True, destination=['test'], arguments={'min': 2, 'max': 5}) def test_add_consumer(self): celery = self._app.capp celery.control.broadcast = MagicMock( return_value=[{'test': {'ok': ''}}]) r = self.post('/api/worker/queue/add-consumer/test', body={'queue': 'foo'}) self.assertEqual(200, r.code) celery.control.broadcast.assert_called_once_with( 'add_consumer', reply=True, destination=['test'], arguments={'queue': 'foo'}) def test_cancel_consumer(self): celery = self._app.capp celery.control.broadcast = MagicMock( return_value=[{'test': {'ok': ''}}]) r = self.post('/api/worker/queue/cancel-consumer/test', body={'queue': 'foo'}) self.assertEqual(200, r.code) celery.control.broadcast.assert_called_once_with( 'cancel_consumer', reply=True, destination=['test'], arguments={'queue': 'foo'}) def test_task_timeout(self): celery = self._app.capp celery.control.time_limit = MagicMock( return_value=[{'foo': {'ok': ''}}]) r = self.post( '/api/task/timeout/celery.map', body={'workername': 'foo', 'hard': 3.1, 'soft': 1.2} ) self.assertEqual(200, r.code) celery.control.time_limit.assert_called_once_with( 'celery.map', hard=3.1, soft=1.2, destination=['foo'], reply=True) def test_task_ratelimit(self): celery = self._app.capp celery.control.rate_limit = MagicMock( return_value=[{'foo': {'ok': ''}}]) r = self.post('/api/task/rate-limit/celery.map', body={'workername': 'foo', 'ratelimit': 20}) self.assertEqual(200, r.code) celery.control.rate_limit.assert_called_once_with( 'celery.map', '20', destination=['foo'], reply=True) def test_task_ratelimit_non_integer(self): celery = self._app.capp celery.control.rate_limit = MagicMock( return_value=[{'foo': {'ok': ''}}]) r = self.post('/api/task/rate-limit/celery.map', body={'workername': 'foo', 'ratelimit': '11/m'}) self.assertEqual(200, r.code) celery.control.rate_limit.assert_called_once_with( 'celery.map', '11/m', destination=['foo'], reply=True) class TaskControlTests(AsyncHTTPTestCase): def test_revoke(self): celery = self._app.capp celery.control.revoke = MagicMock() r = self.post('/api/task/revoke/test', body={}) self.assertEqual(200, r.code) celery.control.revoke.assert_called_once_with('test', terminate=False) def test_terminate(self): celery = self._app.capp celery.control.revoke = MagicMock() r = self.post('/api/task/revoke/test', body={'terminate': True}) self.assertEqual(200, r.code) celery.control.revoke.assert_called_once_with('test', terminate=True) flower-0.8.3/tests/api/test_events.py0000644000076500000240000000000012405107732017715 0ustar mherstaff00000000000000flower-0.8.3/tests/api/test_tasks.py0000644000076500000240000000613612561016565017564 0ustar mherstaff00000000000000from mock import Mock from datetime import datetime, timedelta from celery.result import AsyncResult import celery.states as states from tests import AsyncHTTPTestCase class ApplyTests(AsyncHTTPTestCase): def test_apply(self): from mock import patch, PropertyMock import json result = 'result' with patch('celery.result.AsyncResult.state', new_callable=PropertyMock) as mock_state: with patch('celery.result.AsyncResult.result', new_callable=PropertyMock) as mock_result: mock_state.return_value = states.SUCCESS mock_result.return_value = result ar = AsyncResult(123) ar.get = Mock(return_value=result) task = self._app.capp.tasks['foo'] = Mock() task.apply_async = Mock(return_value=ar) r = self.post('/api/task/apply/foo', body='') self.assertEqual(200, r.code) body = bytes.decode(r.body) self.assertEqual(result, json.loads(body)['result']) task.apply_async.assert_called_once_with(args=[], kwargs={}) class AsyncApplyTests(AsyncHTTPTestCase): def test_async_apply(self): task = self._app.capp.tasks['foo'] = Mock() task.apply_async = Mock(return_value=AsyncResult(123)) r = self.post('/api/task/async-apply/foo', body={}) self.assertEqual(200, r.code) task.apply_async.assert_called_once_with(args=[], kwargs={}) def test_async_apply_eta(self): task = self._app.capp.tasks['foo'] = Mock() task.apply_async = Mock(return_value=AsyncResult(123)) tomorrow = datetime.utcnow() + timedelta(days=1) r = self.post('/api/task/async-apply/foo', body='{"eta": "%s"}' % tomorrow) self.assertEqual(200, r.code) task.apply_async.assert_called_once_with( args=[], kwargs={}, eta=tomorrow) def test_async_apply_countdown(self): task = self._app.capp.tasks['foo'] = Mock() task.apply_async = Mock(return_value=AsyncResult(123)) r = self.post('/api/task/async-apply/foo', body='{"countdown": "3"}') self.assertEqual(200, r.code) task.apply_async.assert_called_once_with( args=[], kwargs={}, countdown=3) def test_async_apply_expires(self): task = self._app.capp.tasks['foo'] = Mock() task.apply_async = Mock(return_value=AsyncResult(123)) r = self.post('/api/task/async-apply/foo', body='{"expires": "60"}') self.assertEqual(200, r.code) task.apply_async.assert_called_once_with( args=[], kwargs={}, expires=60) def test_async_apply_expires_datetime(self): task = self._app.capp.tasks['foo'] = Mock() task.apply_async = Mock(return_value=AsyncResult(123)) tomorrow = datetime.utcnow() + timedelta(days=1) r = self.post('/api/task/async-apply/foo', body='{"expires": "%s"}' % tomorrow) self.assertEqual(200, r.code) task.apply_async.assert_called_once_with( args=[], kwargs={}, expires=tomorrow) flower-0.8.3/tests/utils/0000755000076500000240000000000012561016723015403 5ustar mherstaff00000000000000flower-0.8.3/tests/utils/__init__.py0000644000076500000240000000000012405107732017500 0ustar mherstaff00000000000000flower-0.8.3/tests/utils/test_broker.py0000644000076500000240000000466312504702675020316 0ustar mherstaff00000000000000import unittest from mock import MagicMock from flower.utils import broker from flower.utils.broker import RabbitMQ, Redis, Broker # python 2.6 support if not hasattr(unittest.TestCase, 'assertIn'): import unittest2 as unittest broker.requests = MagicMock() broker.redis = MagicMock() class TestRabbitMQ(unittest.TestCase): def test_init(self): b = Broker('amqp://', '') self.assertTrue(isinstance(b, RabbitMQ)) self.assertFalse(isinstance(b, Redis)) def test_url(self): b = RabbitMQ('amqp://user:pass@host:10000/vhost', '') self.assertEqual('host', b.host) self.assertEqual(15672, b.port) self.assertEqual('vhost', b.vhost) self.assertEqual('user', b.username) self.assertEqual('pass', b.password) def test_url_defaults_rabbitmq(self): for url in ['amqp://', 'amqp://localhost']: b = RabbitMQ(url, '') self.assertEqual('localhost', b.host) self.assertEqual(15672, b.port) self.assertEqual('/', b.vhost) self.assertEqual('guest', b.username) self.assertEqual('guest', b.password) def test_url_defaults_redis(self): for url in ['redis://', 'redis://localhost', 'redis://localhost/0']: b = Redis(url, '') self.assertEqual('localhost', b.host) self.assertEqual(6379, b.port) self.assertEqual(0, b.vhost) self.assertEqual(None, b.username) self.assertEqual(None, b.password) class TestRedis(unittest.TestCase): def test_init(self): b = Broker('redis://localhost:6379/0') self.assertFalse(isinstance(b, RabbitMQ)) self.assertTrue(isinstance(b, Redis)) def test_url(self): b = Broker('redis://foo:7777/9') self.assertEqual('foo', b.host) self.assertEqual(7777, b.port) self.assertEqual(9, b.vhost) def test_url_defaults(self): b = Broker('redis://') self.assertEqual('localhost', b.host) self.assertEqual(6379, b.port) self.assertEqual(0, b.vhost) self.assertIsNone(b.username) self.assertIsNone(b.password) def test_url_with_password(self): b = Broker('redis://:pass@host:4444/5') self.assertEqual('host', b.host) self.assertEqual(4444, b.port) self.assertEqual(5, b.vhost) self.assertEqual('pass', b.password) if __name__ == '__main__': unittest.main() flower-0.8.3/tests/utils/test_search.py0000644000076500000240000000775612561016565020304 0ustar mherstaff00000000000000import unittest from collections import namedtuple from flower.utils.search import parse_search_terms, stringified_dict_contains_value, satisfies_search_terms class TestSearchParser(unittest.TestCase): def test_any_value(self): self.assertEqual( {'any': 'someval'}, parse_search_terms('someval') ) def test_result_value(self): self.assertEqual( {'result': 'resval'}, parse_search_terms('result:resval') ) def test_kwargs(self): self.assertEqual( {'kwargs': {'some_kwarg': 'some_value'}}, parse_search_terms('kwargs:some_kwarg=some_value') ) self.assertEqual( {'kwargs': {'some_kwarg1': 'some_value1', 'some_kwarg2': 'some_value2'}}, parse_search_terms('kwargs:some_kwarg1=some_value1 kwargs:some_kwarg2=some_value2') ) def test_args(self): self.assertEqual( {'args': ['some_value']}, parse_search_terms('args:some_value') ) self.assertEqual( {'args': ['some_value1', 'some_value2']}, parse_search_terms('args:some_value1 args:some_value2') ) def test_strip_spaces(self): self.assertEqual( {'any': 'someval'}, parse_search_terms(' someval ') ) self.assertEqual( {'kwargs': {'some_kwarg': 'some_value'}}, parse_search_terms(' kwargs:some_kwarg=some_value ') ) def test_quotes(self): self.assertEqual( {'result': 'complex kwarg'}, parse_search_terms('result:"complex kwarg"') ) self.assertEqual( {'kwargs': {'some_kwarg1': 'some value1', 'some_kwarg2': 'some value2'}}, parse_search_terms('kwargs:some_kwarg1="some value1" kwargs:some_kwarg2="some value2"') ) class TestStringfiedDictChecker(unittest.TestCase): def test_stringifies_args(self): self.assertEqual( True, stringified_dict_contains_value('test', 5, "{'test': 5}") ) def test_works_for_nonexisting_kwargs(self): self.assertEqual( False, stringified_dict_contains_value('non_exisiting_kwarg', '5', "{'test': 5}") ) def test_works_for_kwargs_in_different_parts_of_string(self): for key, value in [('key1', '1'), ('key2', '2'), ('key3', '3')]: self.assertEqual( True, stringified_dict_contains_value(key, value, "{'key1': 1, 'key2': 2, 'key3': 3}") ) class TestTaskFiltering(unittest.TestCase): def _create_task(self, result=None, args=None, kwargs='{}'): args = args or [] TaskMockClass = namedtuple('Task', 'result args kwargs') return TaskMockClass(result, args, kwargs) def setUp(self): self.task = self._create_task( args=['arg1'], kwargs="{'kwarg1': 1, 'kwarg2': 22, 'kwarg3': '345'}", ) def test_kwarg_search_works(self): self.assertEqual( True, satisfies_search_terms(self.task, None, None, None, {'kwarg1': 1}) ) self.assertEqual( False, satisfies_search_terms(self.task, None, None, None, {'kwarg1': 2}) ) self.assertEqual( False, satisfies_search_terms(self.task, None, None, None, {'kwarg2': 2}) ) self.assertEqual( True, satisfies_search_terms(self.task, None, None, None, {'kwarg3': '345'}) ) def test_args_search_works(self): self.assertEqual( True, satisfies_search_terms(self.task, None, None, ['arg1'], None) ) self.assertEqual( False, satisfies_search_terms(self.task, None, None, ['arg2'], None) ) self.assertEqual( False, satisfies_search_terms(self.task, None, None, ['arg'], None) ) if __name__ == '__main__': unittest.main() flower-0.8.3/tests/utils/test_template.py0000644000076500000240000000403212502222677020630 0ustar mherstaff00000000000000import unittest from flower.utils.template import humanize, format_time class TestHumanize(unittest.TestCase): def test_None(self): self.assertEqual('', humanize(None)) def test_bool(self): self.assertEqual(True, humanize(True)) self.assertEqual(False, humanize(False)) def test_numbers(self): self.assertEqual(0, humanize(0)) self.assertEqual(3, humanize(3)) self.assertEqual(0.2, humanize(0.2)) def test_keywords(self): self.assertEqual('SSL', humanize('ssl')) self.assertEqual('SSL', humanize('SSL')) self.assertEqual('URI', humanize('uri')) self.assertEqual('URI', humanize('URI')) self.assertEqual('UUID', humanize('uuid')) self.assertEqual('UUID', humanize('UUID')) self.assertEqual('ETA', humanize('eta')) self.assertEqual('ETA', humanize('ETA')) self.assertEqual('URL', humanize('url')) self.assertEqual('URL', humanize('URL')) self.assertEqual('args', humanize('args')) self.assertEqual('kwargs', humanize('kwargs')) def test_uuid(self): uuid = '5cf83762-9507-4dc5-8e5a-ad730379b099' self.assertEqual(uuid, humanize(uuid)) def test_sequences(self): self.assertEqual('2, 3', humanize([2, 3])) self.assertEqual('2, foo, 1.2', humanize([2, 'foo', 1.2])) self.assertEqual([None, None], humanize([None, None])) self.assertEqual([4, {1: 1}], humanize([4, {1: 1}])) def test_time(self): from pytz import utc self.assertEqual(1343911558.305793, humanize(1343911558.305793)) self.assertEqual(format_time(1343911558.305793, utc), humanize(1343911558.305793, type='time')) def test_strings(self): self.assertEqual('Max tasks per child', humanize('max_tasks_per_child')) self.assertEqual('URI prefix', humanize('uri_prefix')) self.assertEqual('Max concurrency', humanize('max-concurrency')) if __name__ == '__main__': unittest.main() flower-0.8.3/tests/views/0000755000076500000240000000000012561016723015400 5ustar mherstaff00000000000000flower-0.8.3/tests/views/__init__.py0000644000076500000240000000000012405107732017475 0ustar mherstaff00000000000000flower-0.8.3/tests/views/test_auth.py0000644000076500000240000000207012436677004017757 0ustar mherstaff00000000000000import base64 from tests import AsyncHTTPTestCase class AuthTests(AsyncHTTPTestCase): def test_auth_without_credentials(self): ba = self._app.options.basic_auth self._app.options.basic_auth = ["hello:world"] r = self.get('/') self._app.options.basic_auth = ba self.assertEqual(401, r.code) def test_auth_with_bad_credentials(self): ba = self._app.options.basic_auth self._app.options.basic_auth = ["hello:world"] credentials = base64.b64encode("not:good".encode()).decode() r = self.get('/', headers={"Authorization": "Basic " + credentials}) self._app.options.basic_auth = ba self.assertEqual(401, r.code) def test_auth_with_good_credentials(self): ba = self._app.options.basic_auth self._app.options.basic_auth = ["hello:world"] credentials = base64.b64encode("hello:world".encode()).decode() r = self.get('/', headers={"Authorization": "Basic " + credentials}) self._app.options.basic_auth = ba self.assertEqual(200, r.code) flower-0.8.3/tests/views/test_dashboard.py0000644000076500000240000000062512436677004020751 0ustar mherstaff00000000000000from tests import AsyncHTTPTestCase class DashboardTests(AsyncHTTPTestCase): def test_workers_page(self): r = self.get('/dashboard') self.assertEqual(200, r.code) self.assertTrue('Broker' in str(r.body)) def test_unknown_worker(self): r = self.get('/worker/unknown') self.assertEqual(404, r.code) self.assertTrue('Unknown worker' in str(r.body)) flower-0.8.3/tests/views/test_error.py0000644000076500000240000000025212405107732020137 0ustar mherstaff00000000000000from tests import AsyncHTTPTestCase class ErrorTests(AsyncHTTPTestCase): def test_404(self): r = self.get('/unknown') self.assertEqual(404, r.code) flower-0.8.3/tests/views/test_monitor.py0000644000076500000240000000141112405107732020473 0ustar mherstaff00000000000000import time from tests import AsyncHTTPTestCase class MonitorTest(AsyncHTTPTestCase): def test_monitor_page(self): r = self.get('/monitor') self.assertEqual(200, r.code) self.assertTrue('Succeeded tasks' in str(r.body)) self.assertTrue('Failed tasks' in str(r.body)) def test_monitor_succeeded_tasks(self): r = self.get('/monitor/succeeded-tasks?lastquery=%s' % time.time()) self.assertEqual(200, r.code) def test_monitor_completion_time(self): r = self.get('/monitor/completion-time?lastquery=%s' % time.time()) self.assertEqual(200, r.code) def test_monitor_failed_tasks(self): r = self.get('/monitor/failed-tasks?lastquery=%s' % time.time()) self.assertEqual(200, r.code) flower-0.8.3/tests/views/test_tasks.py0000644000076500000240000000061312405107732020134 0ustar mherstaff00000000000000from tests import AsyncHTTPTestCase class TaskTest(AsyncHTTPTestCase): def test_task_page(self): r = self.get('/tasks') self.assertEqual(200, r.code) self.assertTrue('Seen task types' in str(r.body)) def test_unknown_task(self): r = self.get('/task/unknown') self.assertEqual(404, r.code) self.assertTrue('Unknown task' in str(r.body))