pax_global_header00006660000000000000000000000064135235365530014524gustar00rootroot0000000000000052 comment=8a6c9d2094da016673d5695ec07c173de2e4de3e django-q-1.0.2/000077500000000000000000000000001352353655300132245ustar00rootroot00000000000000django-q-1.0.2/.gitignore000066400000000000000000000014611352353655300152160ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover .DS_Store # Translations *.pot *.mo # Django stuff: *.log # Sphinx documentation docs/_build/ # PyBuilder target/ dev-requirements.txt dev-requirements.in manage.py db.sqlite3 *.ipynb *.rdb .venv .idea djq node_modulesdjango-q-1.0.2/.readthedocs.yml000066400000000000000000000001071352353655300163100ustar00rootroot00000000000000build: image: latest python: version: 3.6 setup_py_install: truedjango-q-1.0.2/.travis.yml000066400000000000000000000017561352353655300153460ustar00rootroot00000000000000language: python services: - redis-server - mongodb python: - "3.6" - "3.7" env: - DJANGO=2.2.4 - DJANGO=1.11.23 matrix: exclude: - python: "3.7" env: DJANGO=1.11.23 sudo: true dist: xenial addons: apt: packages: - tcl8.5 before_script: - git clone https://github.com/antirez/disque.git disque_server - "cd disque_server/src && make && PREFIX=../ make install && cd -" - "./disque_server/bin/disque-server &" - ./disque_server/bin/disque PING install: - pip install -q django==$DJANGO - pip install -r requirements.txt - pip install pytest --upgrade - pip install pytest-django codecov sphinx - python setup.py install script: - coverage run --source=django_q -m py.test - sphinx-build -b html -d docs/_build/doctrees -nW docs docs/_build/html after_success: - codecov notifications: webhooks: urls: - https://webhooks.gitter.im/e/cbcff78c4be241602332 on_success: change on_failure: always on_start: never django-q-1.0.2/CHANGELOG.md000066400000000000000000001071061352353655300150420ustar00rootroot00000000000000# Change Log ## [v0.9.4](https://github.com/koed00/django-q/tree/v0.9.4) (2018-03-13) [Full Changelog](https://github.com/koed00/django-q/compare/v0.9.3...v0.9.4) ## [v0.9.3](https://github.com/koed00/django-q/tree/v0.9.3) (2018-03-13) [Full Changelog](https://github.com/koed00/django-q/compare/v0.9.2...v0.9.3) **Closed issues:** - \[Wishlist\] Please provide a changelog in a text format in your repo. [\#293](https://github.com/Koed00/django-q/issues/293) - django-q collides with existing app of name `tasks` [\#199](https://github.com/Koed00/django-q/issues/199) **Merged pull requests:** - Add option for acknowledging failed tasks \(globally and per-task\) [\#298](https://github.com/Koed00/django-q/pull/298) ([Balletie](https://github.com/Balletie)) - Changing the path location where Django-Q is inserted. [\#297](https://github.com/Koed00/django-q/pull/297) ([Eagllus](https://github.com/Eagllus)) ## [v0.9.2](https://github.com/koed00/django-q/tree/v0.9.2) (2018-02-13) [Full Changelog](https://github.com/koed00/django-q/compare/v0.9.1...v0.9.2) **Closed issues:** - \[Debian\] The new release contains a python3-only line. [\#291](https://github.com/Koed00/django-q/issues/291) - Support Python 3.x Only Since 0.9.0? [\#286](https://github.com/Koed00/django-q/issues/286) - Error when using error reporters - AttributeError: 'generator' object has no attribute 'load' [\#276](https://github.com/Koed00/django-q/issues/276) - Question: how to show the running task on the django-admin with redis as broker [\#270](https://github.com/Koed00/django-q/issues/270) - Overflow on repeats fields [\#255](https://github.com/Koed00/django-q/issues/255) - apps.py: Attempted relative import with no known parent package [\#249](https://github.com/Koed00/django-q/issues/249) - Django and Django Q on different server with Redis as broker [\#237](https://github.com/Koed00/django-q/issues/237) - The `django\_q/tests` directory isn't in the tarball [\#226](https://github.com/Koed00/django-q/issues/226) - django scrapy project can't connect to redis [\#217](https://github.com/Koed00/django-q/issues/217) - django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. [\#216](https://github.com/Koed00/django-q/issues/216) - Add Sentry support [\#210](https://github.com/Koed00/django-q/issues/210) - Tasks in the queue are not being processed [\#203](https://github.com/Koed00/django-q/issues/203) - Result is - [\#176](https://github.com/Koed00/django-q/issues/176) - ERROR invalid syntax \(\, line 1\) - while passing objects as arguments [\#170](https://github.com/Koed00/django-q/issues/170) - "InterfaceError: connection already closed" being raised when a test is run [\#167](https://github.com/Koed00/django-q/issues/167) - AppRegistryNotReady Exception on Django 1.10 Dev [\#164](https://github.com/Koed00/django-q/issues/164) - Retry possibility? [\#118](https://github.com/Koed00/django-q/issues/118) **Merged pull requests:** - Fix python3 only code [\#292](https://github.com/Koed00/django-q/pull/292) ([Eagllus](https://github.com/Eagllus)) ## [v0.9.1](https://github.com/koed00/django-q/tree/v0.9.1) (2018-02-02) [Full Changelog](https://github.com/koed00/django-q/compare/0.9.0...v0.9.1) **Closed issues:** - Django 2.0 admin last run urls [\#289](https://github.com/Koed00/django-q/issues/289) - The model Schedule is already registered [\#285](https://github.com/Koed00/django-q/issues/285) **Merged pull requests:** - Fix urls being escaped by admin [\#290](https://github.com/Koed00/django-q/pull/290) ([Eagllus](https://github.com/Eagllus)) - fixing entry\_points annotation to expose class rather than module [\#287](https://github.com/Koed00/django-q/pull/287) ([danielwelch](https://github.com/danielwelch)) - Allow SQS to use environment variables [\#283](https://github.com/Koed00/django-q/pull/283) ([svdgraaf](https://github.com/svdgraaf)) ## [0.9.0](https://github.com/koed00/django-q/tree/0.9.0) (2018-01-08) [Full Changelog](https://github.com/koed00/django-q/compare/v0.9.0...0.9.0) ## [v0.9.0](https://github.com/koed00/django-q/tree/v0.9.0) (2018-01-08) [Full Changelog](https://github.com/koed00/django-q/compare/v0.8.1...v0.9.0) **Closed issues:** - Django-q calls task twice or more [\#183](https://github.com/Koed00/django-q/issues/183) **Merged pull requests:** - Django 2 compatiblity [\#279](https://github.com/Koed00/django-q/pull/279) ([Eagllus](https://github.com/Eagllus)) - fix usage of iter\_entry\_points [\#278](https://github.com/Koed00/django-q/pull/278) ([danielwelch](https://github.com/danielwelch)) - Updates Travis to test for Django 2 and the LTS versions [\#274](https://github.com/Koed00/django-q/pull/274) ([Koed00](https://github.com/Koed00)) - Django 2.0 compatibility [\#269](https://github.com/Koed00/django-q/pull/269) ([achidlow](https://github.com/achidlow)) ## [v0.8.1](https://github.com/koed00/django-q/tree/v0.8.1) (2017-10-12) [Full Changelog](https://github.com/koed00/django-q/compare/v0.8.0...v0.8.1) **Closed issues:** - Django Q tasks are not executed with ./manage.py test [\#266](https://github.com/Koed00/django-q/issues/266) - Unable to delete scheduled task item that was created in the admin. [\#258](https://github.com/Koed00/django-q/issues/258) - \ [\#257](https://github.com/Koed00/django-q/issues/257) - Failed tasks and Chain [\#254](https://github.com/Koed00/django-q/issues/254) - async and chains returns different task id ! [\#244](https://github.com/Koed00/django-q/issues/244) - Python3. Async hook doesn't seem to work [\#240](https://github.com/Koed00/django-q/issues/240) - Workers stall and do nothing [\#239](https://github.com/Koed00/django-q/issues/239) - How is logging handled [\#209](https://github.com/Koed00/django-q/issues/209) - ask close\_old\_connections use! [\#198](https://github.com/Koed00/django-q/issues/198) **Merged pull requests:** - Updates botocore, certifi, chardet, docutils, idna and psutil [\#267](https://github.com/Koed00/django-q/pull/267) ([Koed00](https://github.com/Koed00)) - Replaces some relative imports [\#264](https://github.com/Koed00/django-q/pull/264) ([Koed00](https://github.com/Koed00)) - Updates packages and Django version [\#263](https://github.com/Koed00/django-q/pull/263) ([Koed00](https://github.com/Koed00)) - Use 32 bits integer for repeat field to avoid overflow with frequent scheduled tasks [\#262](https://github.com/Koed00/django-q/pull/262) ([gchardon-hiventy](https://github.com/gchardon-hiventy)) - Error reporter [\#261](https://github.com/Koed00/django-q/pull/261) ([danielwelch](https://github.com/danielwelch)) - Remove dependency `future` [\#247](https://github.com/Koed00/django-q/pull/247) ([benjaoming](https://github.com/benjaoming)) ## [v0.8.0](https://github.com/koed00/django-q/tree/v0.8.0) (2017-04-05) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.18...v0.8.0) **Closed issues:** - How do you actually initiate periodic scheduled tasks in production [\#221](https://github.com/Koed00/django-q/issues/221) - Enhancement: add signals [\#219](https://github.com/Koed00/django-q/issues/219) - very slow performance with global sync: True setting vs. async\(sync=True\) [\#214](https://github.com/Koed00/django-q/issues/214) - daemonic processes are not allowed to have children [\#211](https://github.com/Koed00/django-q/issues/211) - send\_mail problem [\#202](https://github.com/Koed00/django-q/issues/202) - Starting qcluster crashes python in OSX Sierra [\#201](https://github.com/Koed00/django-q/issues/201) - How can I run django-q qcluster with supervisor process manager [\#196](https://github.com/Koed00/django-q/issues/196) - Can't get attribute 'simple\_class\_factory' on module 'django.db.models.base' [\#191](https://github.com/Koed00/django-q/issues/191) - \[Q\] ERROR reincarnated pusher Process-1:4439 after sudden death [\#188](https://github.com/Koed00/django-q/issues/188) - Can not pass async\(\) non-core functions [\#178](https://github.com/Koed00/django-q/issues/178) **Merged pull requests:** - Update to Django 1.11 & Python 3.6 [\#230](https://github.com/Koed00/django-q/pull/230) ([Koed00](https://github.com/Koed00)) - Add django 1.11 support [\#228](https://github.com/Koed00/django-q/pull/228) ([bulv1ne](https://github.com/bulv1ne)) - Update tasks.rst [\#222](https://github.com/Koed00/django-q/pull/222) ([wirasto](https://github.com/wirasto)) - Add signals [\#220](https://github.com/Koed00/django-q/pull/220) ([abompard](https://github.com/abompard)) - fix a race condition in orm broker [\#213](https://github.com/Koed00/django-q/pull/213) ([yannpom](https://github.com/yannpom)) - Option to undaemonize workers and allows them to spawn child processes [\#212](https://github.com/Koed00/django-q/pull/212) ([yannpom](https://github.com/yannpom)) - Replace global Conf mangling with monkeypatch [\#208](https://github.com/Koed00/django-q/pull/208) ([Urth](https://github.com/Urth)) - Explaining how to handle tasks async with qcluster [\#204](https://github.com/Koed00/django-q/pull/204) ([Eagllus](https://github.com/Eagllus)) - supervisor example in Cluster documentation fix \#196 [\#197](https://github.com/Koed00/django-q/pull/197) ([GabLeRoux](https://github.com/GabLeRoux)) - Update brokers.rst [\#187](https://github.com/Koed00/django-q/pull/187) ([pyprism](https://github.com/pyprism)) - Package update 21 7 [\#184](https://github.com/Koed00/django-q/pull/184) ([Koed00](https://github.com/Koed00)) - Guard loop sleep made configurable [\#182](https://github.com/Koed00/django-q/pull/182) ([bob-r](https://github.com/bob-r)) - Add option to qinfo to print task IDs [\#173](https://github.com/Koed00/django-q/pull/173) ([Aninstance](https://github.com/Aninstance)) - Log id returned by broker [\#148](https://github.com/Koed00/django-q/pull/148) ([k4ml](https://github.com/k4ml)) ## [v0.7.18](https://github.com/koed00/django-q/tree/v0.7.18) (2016-06-07) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.17...v0.7.18) **Closed issues:** - ValueError\('need more than 1 value to unpack',\) [\#171](https://github.com/Koed00/django-q/issues/171) - Successful tasks are not being saved to the database when 'save\_limit' config setting is 0 [\#157](https://github.com/Koed00/django-q/issues/157) **Merged pull requests:** - Updates dependencies [\#175](https://github.com/Koed00/django-q/pull/175) ([Koed00](https://github.com/Koed00)) - Updates Django and some packages [\#169](https://github.com/Koed00/django-q/pull/169) ([Koed00](https://github.com/Koed00)) ## [v0.7.17](https://github.com/koed00/django-q/tree/v0.7.17) (2016-04-24) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.16...v0.7.17) **Closed issues:** - Typo in parameter passed to broker in get\_broker [\#158](https://github.com/Koed00/django-q/issues/158) - Circus stop only stops first process [\#155](https://github.com/Koed00/django-q/issues/155) - Allow task custom name [\#146](https://github.com/Koed00/django-q/issues/146) - Worker recycle causes: "ERROR connection already closed" [\#144](https://github.com/Koed00/django-q/issues/144) **Merged pull requests:** - Updates packages for testing [\#166](https://github.com/Koed00/django-q/pull/166) ([Koed00](https://github.com/Koed00)) - allow scheduler to schedule all pending tasks [\#165](https://github.com/Koed00/django-q/pull/165) ([thatmattbone](https://github.com/thatmattbone)) - Updates docs and tests for new Django versions [\#163](https://github.com/Koed00/django-q/pull/163) ([Koed00](https://github.com/Koed00)) - Fixes typo in custom broker handler [\#159](https://github.com/Koed00/django-q/pull/159) ([Koed00](https://github.com/Koed00)) ## [v0.7.16](https://github.com/koed00/django-q/tree/v0.7.16) (2016-03-07) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.15...v0.7.16) **Fixed bugs:** - "connection already closed" while testing [\#127](https://github.com/Koed00/django-q/issues/127) - Async argument 'timeout' fails if broker timeout is set to None [\#125](https://github.com/Koed00/django-q/issues/125) **Closed issues:** - Scheduled task name behaviour inconsistent [\#150](https://github.com/Koed00/django-q/issues/150) - SystemError: Parent module '' not loaded, cannot perform relative import [\#142](https://github.com/Koed00/django-q/issues/142) - OrmQ broker MySQL connection errors on ORM.delete\(task\_id\) [\#124](https://github.com/Koed00/django-q/issues/124) - Task stays in queue when executing a requests.post [\#97](https://github.com/Koed00/django-q/issues/97) **Merged pull requests:** - Updates Django to 1.9.4 and 1.8.11 [\#153](https://github.com/Koed00/django-q/pull/153) ([Koed00](https://github.com/Koed00)) - Fixes for several issues [\#152](https://github.com/Koed00/django-q/pull/152) ([Koed00](https://github.com/Koed00)) - Updates to Django 1.8.9 and 1.9.2 [\#143](https://github.com/Koed00/django-q/pull/143) ([Koed00](https://github.com/Koed00)) ## [v0.7.15](https://github.com/koed00/django-q/tree/v0.7.15) (2016-01-27) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.14...v0.7.15) **Closed issues:** - Make orm polling interval configurable [\#139](https://github.com/Koed00/django-q/issues/139) **Merged pull requests:** - Adds custom broker setting [\#141](https://github.com/Koed00/django-q/pull/141) ([Koed00](https://github.com/Koed00)) - Adds poll option for database brokers [\#140](https://github.com/Koed00/django-q/pull/140) ([Koed00](https://github.com/Koed00)) ## [v0.7.14](https://github.com/koed00/django-q/tree/v0.7.14) (2016-01-24) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.13...v0.7.14) **Closed issues:** - app file structure [\#100](https://github.com/Koed00/django-q/issues/100) **Merged pull requests:** - Adds task result update [\#138](https://github.com/Koed00/django-q/pull/138) ([Koed00](https://github.com/Koed00)) - Save task now creates or updates [\#136](https://github.com/Koed00/django-q/pull/136) ([Koed00](https://github.com/Koed00)) - Fixes acknowledgement bug for failed tasks [\#135](https://github.com/Koed00/django-q/pull/135) ([Koed00](https://github.com/Koed00)) - Removes duplicate test [\#134](https://github.com/Koed00/django-q/pull/134) ([Koed00](https://github.com/Koed00)) ## [v0.7.13](https://github.com/koed00/django-q/tree/v0.7.13) (2016-01-08) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.12...v0.7.13) ## [v0.7.12](https://github.com/koed00/django-q/tree/v0.7.12) (2016-01-08) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.11...v0.7.12) **Closed issues:** - Bug? Hourly schedule\_type runs in reverse [\#128](https://github.com/Koed00/django-q/issues/128) - scheduling repeating tasks [\#121](https://github.com/Koed00/django-q/issues/121) - documentation or design issue? [\#114](https://github.com/Koed00/django-q/issues/114) - Catch\_up States [\#110](https://github.com/Koed00/django-q/issues/110) - foo.bar.tasks.my\_task fails with "No module named bar.tasks" when running in AWS / Elastic Beanstalk [\#105](https://github.com/Koed00/django-q/issues/105) - Q Cluster auto-launch? [\#102](https://github.com/Koed00/django-q/issues/102) **Merged pull requests:** - v0.7.12 [\#132](https://github.com/Koed00/django-q/pull/132) ([Koed00](https://github.com/Koed00)) - Adds Rollbar support for exceptions [\#131](https://github.com/Koed00/django-q/pull/131) ([Koed00](https://github.com/Koed00)) - Updates packages and Django for testing [\#130](https://github.com/Koed00/django-q/pull/130) ([Koed00](https://github.com/Koed00)) - Fix for unusable ORM Broker connections [\#126](https://github.com/Koed00/django-q/pull/126) ([kdmukai](https://github.com/kdmukai)) - Adds a check for duplicate schedule names. [\#123](https://github.com/Koed00/django-q/pull/123) ([Koed00](https://github.com/Koed00)) - fixed typo [\#117](https://github.com/Koed00/django-q/pull/117) ([Eagllus](https://github.com/Eagllus)) - Update example to use string for the schedule\_type [\#115](https://github.com/Koed00/django-q/pull/115) ([Eagllus](https://github.com/Eagllus)) - Updates Blessed [\#113](https://github.com/Koed00/django-q/pull/113) ([Koed00](https://github.com/Koed00)) - docs: rephrased the missing schedule description [\#112](https://github.com/Koed00/django-q/pull/112) ([Koed00](https://github.com/Koed00)) - Updates botocore for testing [\#111](https://github.com/Koed00/django-q/pull/111) ([Koed00](https://github.com/Koed00)) - Updates Django [\#109](https://github.com/Koed00/django-q/pull/109) ([Koed00](https://github.com/Koed00)) - Updates botocore for testing [\#108](https://github.com/Koed00/django-q/pull/108) ([Koed00](https://github.com/Koed00)) ## [v0.7.11](https://github.com/koed00/django-q/tree/v0.7.11) (2015-10-28) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.10...v0.7.11) **Closed issues:** - fetch\(\) only works for the first task, returning None for subsequent tasks IDs [\#99](https://github.com/Koed00/django-q/issues/99) **Merged pull requests:** - docs: added Async class [\#104](https://github.com/Koed00/django-q/pull/104) ([Koed00](https://github.com/Koed00)) - adds `Async` class [\#103](https://github.com/Koed00/django-q/pull/103) ([Koed00](https://github.com/Koed00)) - Adds timeout to group key cache object [\#98](https://github.com/Koed00/django-q/pull/98) ([Koed00](https://github.com/Koed00)) ## [v0.7.10](https://github.com/koed00/django-q/tree/v0.7.10) (2015-10-19) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.9...v0.7.10) **Merged pull requests:** - Adds task chains [\#96](https://github.com/Koed00/django-q/pull/96) ([Koed00](https://github.com/Koed00)) - Updates botocore for testing [\#95](https://github.com/Koed00/django-q/pull/95) ([Koed00](https://github.com/Koed00)) - Updates Requests and Blessed requirements for testing [\#94](https://github.com/Koed00/django-q/pull/94) ([Koed00](https://github.com/Koed00)) - Updates Arrow and Blessed for testing [\#93](https://github.com/Koed00/django-q/pull/93) ([Koed00](https://github.com/Koed00)) - Updates botocore for testing [\#92](https://github.com/Koed00/django-q/pull/92) ([Koed00](https://github.com/Koed00)) ## [v0.7.9](https://github.com/koed00/django-q/tree/v0.7.9) (2015-10-08) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.8...v0.7.9) **Merged pull requests:** - Updated botocore for testing [\#91](https://github.com/Koed00/django-q/pull/91) ([Koed00](https://github.com/Koed00)) - adds version info to qinfo [\#90](https://github.com/Koed00/django-q/pull/90) ([Koed00](https://github.com/Koed00)) - Adds version and broker info to qinfo [\#89](https://github.com/Koed00/django-q/pull/89) ([Koed00](https://github.com/Koed00)) - Updates botocore, requests and six for testing [\#88](https://github.com/Koed00/django-q/pull/88) ([Koed00](https://github.com/Koed00)) - adds `cached` option to `async\_iter` [\#87](https://github.com/Koed00/django-q/pull/87) ([Koed00](https://github.com/Koed00)) - moves hook signal in separate module [\#86](https://github.com/Koed00/django-q/pull/86) ([Koed00](https://github.com/Koed00)) - Updates psutil to 3.2.2 [\#85](https://github.com/Koed00/django-q/pull/85) ([Koed00](https://github.com/Koed00)) ## [v0.7.8](https://github.com/koed00/django-q/tree/v0.7.8) (2015-10-04) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.7...v0.7.8) **Merged pull requests:** - Adds cached result backend [\#84](https://github.com/Koed00/django-q/pull/84) ([Koed00](https://github.com/Koed00)) - Update tests for Django 1.8.5 [\#83](https://github.com/Koed00/django-q/pull/83) ([Koed00](https://github.com/Koed00)) - updates botocore to 1.2.6 for testing [\#81](https://github.com/Koed00/django-q/pull/81) ([Koed00](https://github.com/Koed00)) ## [v0.7.7](https://github.com/koed00/django-q/tree/v0.7.7) (2015-09-29) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.6...v0.7.7) ## [v0.7.6](https://github.com/koed00/django-q/tree/v0.7.6) (2015-09-29) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.5...v0.7.6) **Closed issues:** - Cluster dies when started with Postgres [\#79](https://github.com/Koed00/django-q/issues/79) **Merged pull requests:** - \#79 close django db connection before fork [\#80](https://github.com/Koed00/django-q/pull/80) ([Koed00](https://github.com/Koed00)) ## [v0.7.5](https://github.com/koed00/django-q/tree/v0.7.5) (2015-09-28) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.4...v0.7.5) **Closed issues:** - Getting "MySQL server has gone away" on new tasks after idling [\#76](https://github.com/Koed00/django-q/issues/76) **Merged pull requests:** - docs: mention Django 1.9a1 support [\#78](https://github.com/Koed00/django-q/pull/78) ([Koed00](https://github.com/Koed00)) - Adds stale db connection check before every transaction [\#77](https://github.com/Koed00/django-q/pull/77) ([Koed00](https://github.com/Koed00)) ## [v0.7.4](https://github.com/koed00/django-q/tree/v0.7.4) (2015-09-26) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.3...v0.7.4) **Merged pull requests:** - Adds MongoDB broker [\#75](https://github.com/Koed00/django-q/pull/75) ([Koed00](https://github.com/Koed00)) - Removes root imports [\#74](https://github.com/Koed00/django-q/pull/74) ([Koed00](https://github.com/Koed00)) - Removes pycharm stdin bug workaround [\#73](https://github.com/Koed00/django-q/pull/73) ([Koed00](https://github.com/Koed00)) - adds compatibility section to docs [\#72](https://github.com/Koed00/django-q/pull/72) ([Koed00](https://github.com/Koed00)) - Only show lock count when available and greater than zero [\#71](https://github.com/Koed00/django-q/pull/71) ([Koed00](https://github.com/Koed00)) - Python 3.5 compatibility [\#70](https://github.com/Koed00/django-q/pull/70) ([Koed00](https://github.com/Koed00)) - docs: Replaced redis pooling with broker pooling example. [\#69](https://github.com/Koed00/django-q/pull/69) ([Koed00](https://github.com/Koed00)) ## [v0.7.3](https://github.com/koed00/django-q/tree/v0.7.3) (2015-09-18) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.2...v0.7.3) **Merged pull requests:** - Adds a wait option for results. [\#68](https://github.com/Koed00/django-q/pull/68) ([Koed00](https://github.com/Koed00)) ## [v0.7.2](https://github.com/koed00/django-q/tree/v0.7.2) (2015-09-17) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.1...v0.7.2) **Merged pull requests:** - orm: Improves locking behavior [\#67](https://github.com/Koed00/django-q/pull/67) ([Koed00](https://github.com/Koed00)) - tests orm queue admin overrides [\#66](https://github.com/Koed00/django-q/pull/66) ([Koed00](https://github.com/Koed00)) - Adds remote orm admin view [\#65](https://github.com/Koed00/django-q/pull/65) ([Koed00](https://github.com/Koed00)) ## [v0.7.1](https://github.com/koed00/django-q/tree/v0.7.1) (2015-09-16) [Full Changelog](https://github.com/koed00/django-q/compare/v0.7.0...v0.7.1) **Merged pull requests:** - Adds configuration output and other enhancements [\#64](https://github.com/Koed00/django-q/pull/64) ([Koed00](https://github.com/Koed00)) ## [v0.7.0](https://github.com/koed00/django-q/tree/v0.7.0) (2015-09-14) [Full Changelog](https://github.com/koed00/django-q/compare/v0.6.4...v0.7.0) **Merged pull requests:** - Adds Django ORM broker [\#63](https://github.com/Koed00/django-q/pull/63) ([Koed00](https://github.com/Koed00)) - Updated wcwidth [\#62](https://github.com/Koed00/django-q/pull/62) ([Koed00](https://github.com/Koed00)) - Adds Fastack option to Disque broker [\#61](https://github.com/Koed00/django-q/pull/61) ([Koed00](https://github.com/Koed00)) - Updates test dependencies [\#60](https://github.com/Koed00/django-q/pull/60) ([Koed00](https://github.com/Koed00)) ## [v0.6.4](https://github.com/koed00/django-q/tree/v0.6.4) (2015-09-10) [Full Changelog](https://github.com/koed00/django-q/compare/v0.6.3...v0.6.4) **Closed issues:** - `qcluster` command doesn't handle interrupts. [\#56](https://github.com/Koed00/django-q/issues/56) **Merged pull requests:** - Adds Amazon SQS broker [\#58](https://github.com/Koed00/django-q/pull/58) ([Koed00](https://github.com/Koed00)) - \#56 cpu\_affinity not supported on some platforms [\#57](https://github.com/Koed00/django-q/pull/57) ([Koed00](https://github.com/Koed00)) - docs: `cache` option [\#55](https://github.com/Koed00/django-q/pull/55) ([Koed00](https://github.com/Koed00)) ## [v0.6.3](https://github.com/koed00/django-q/tree/v0.6.3) (2015-09-08) [Full Changelog](https://github.com/koed00/django-q/compare/v0.6.2...v0.6.3) **Merged pull requests:** - Adds IronMQ broker [\#54](https://github.com/Koed00/django-q/pull/54) ([Koed00](https://github.com/Koed00)) ## [v0.6.2](https://github.com/koed00/django-q/tree/v0.6.2) (2015-09-07) [Full Changelog](https://github.com/koed00/django-q/compare/v0.6.1...v0.6.2) **Merged pull requests:** - Fixes backward compatibility problems with django-picklefield [\#53](https://github.com/Koed00/django-q/pull/53) ([Koed00](https://github.com/Koed00)) ## [v0.6.1](https://github.com/koed00/django-q/tree/v0.6.1) (2015-09-07) [Full Changelog](https://github.com/koed00/django-q/compare/v0.6.0...v0.6.1) ## [v0.6.0](https://github.com/koed00/django-q/tree/v0.6.0) (2015-09-06) [Full Changelog](https://github.com/koed00/django-q/compare/v0.5.3...v0.6.0) **Merged pull requests:** - Adds pluggable brokers [\#52](https://github.com/Koed00/django-q/pull/52) ([Koed00](https://github.com/Koed00)) - \#50 adds psutil as alternative os.getppid provider [\#51](https://github.com/Koed00/django-q/pull/51) ([Koed00](https://github.com/Koed00)) ## [v0.5.3](https://github.com/koed00/django-q/tree/v0.5.3) (2015-08-19) [Full Changelog](https://github.com/koed00/django-q/compare/v0.5.2...v0.5.3) **Merged pull requests:** - v0.5.3 [\#49](https://github.com/Koed00/django-q/pull/49) ([Koed00](https://github.com/Koed00)) - adds `catch\_up` configuration option [\#48](https://github.com/Koed00/django-q/pull/48) ([Koed00](https://github.com/Koed00)) - consolidates redis ping [\#47](https://github.com/Koed00/django-q/pull/47) ([Koed00](https://github.com/Koed00)) ## [v0.5.2](https://github.com/koed00/django-q/tree/v0.5.2) (2015-08-13) [Full Changelog](https://github.com/koed00/django-q/compare/v0.5.1...v0.5.2) **Merged pull requests:** - Adds global `sync` configuration option [\#46](https://github.com/Koed00/django-q/pull/46) ([Koed00](https://github.com/Koed00)) ## [v0.5.1](https://github.com/koed00/django-q/tree/v0.5.1) (2015-08-12) [Full Changelog](https://github.com/koed00/django-q/compare/v0.5.0...v0.5.1) **Merged pull requests:** - Adds `qinfo` management command [\#45](https://github.com/Koed00/django-q/pull/45) ([Koed00](https://github.com/Koed00)) ## [v0.5.0](https://github.com/koed00/django-q/tree/v0.5.0) (2015-08-06) [Full Changelog](https://github.com/koed00/django-q/compare/v0.4.6...v0.5.0) **Closed issues:** - Too many workers [\#43](https://github.com/Koed00/django-q/issues/43) **Merged pull requests:** - Adds a n-minutes option to the scheduler [\#44](https://github.com/Koed00/django-q/pull/44) ([Koed00](https://github.com/Koed00)) ## [v0.4.6](https://github.com/koed00/django-q/tree/v0.4.6) (2015-08-04) [Full Changelog](https://github.com/koed00/django-q/compare/v0.4.5...v0.4.6) **Closed issues:** - sem\_getvalue not implemented on OSX [\#40](https://github.com/Koed00/django-q/issues/40) **Merged pull requests:** - Replaces qsize == 0 with empty\(\) [\#42](https://github.com/Koed00/django-q/pull/42) ([Koed00](https://github.com/Koed00)) - Workaround for osx implementation [\#41](https://github.com/Koed00/django-q/pull/41) ([Koed00](https://github.com/Koed00)) ## [v0.4.5](https://github.com/koed00/django-q/tree/v0.4.5) (2015-08-01) [Full Changelog](https://github.com/koed00/django-q/compare/v0.4.4...v0.4.5) **Closed issues:** - Getting 'can't pickle lock objects' using async\(\) [\#38](https://github.com/Koed00/django-q/issues/38) **Merged pull requests:** - Sets pickle protocol to highest [\#39](https://github.com/Koed00/django-q/pull/39) ([Koed00](https://github.com/Koed00)) - fixes save\_limit +1 [\#37](https://github.com/Koed00/django-q/pull/37) ([Koed00](https://github.com/Koed00)) - Moves unpacking task from Worker to Pusher [\#36](https://github.com/Koed00/django-q/pull/36) ([Koed00](https://github.com/Koed00)) ## [v0.4.4](https://github.com/koed00/django-q/tree/v0.4.4) (2015-07-27) [Full Changelog](https://github.com/koed00/django-q/compare/v0.4.3...v0.4.4) **Merged pull requests:** - closes old db connections on monitor and worker spawn [\#35](https://github.com/Koed00/django-q/pull/35) ([Koed00](https://github.com/Koed00)) - Updated to future 0.15.0 [\#34](https://github.com/Koed00/django-q/pull/34) ([Koed00](https://github.com/Koed00)) - Group filter and queue limit indicator [\#33](https://github.com/Koed00/django-q/pull/33) ([Koed00](https://github.com/Koed00)) ## [v0.4.3](https://github.com/koed00/django-q/tree/v0.4.3) (2015-07-24) [Full Changelog](https://github.com/koed00/django-q/compare/v0.4.2...v0.4.3) **Merged pull requests:** - Adds queue limit and encryption salt [\#32](https://github.com/Koed00/django-q/pull/32) ([Koed00](https://github.com/Koed00)) - adds Haystack example [\#31](https://github.com/Koed00/django-q/pull/31) ([Koed00](https://github.com/Koed00)) ## [v0.4.2](https://github.com/koed00/django-q/tree/v0.4.2) (2015-07-22) [Full Changelog](https://github.com/koed00/django-q/compare/v0.4.1...v0.4.2) **Closed issues:** - Timeout doesn't work [\#28](https://github.com/Koed00/django-q/issues/28) **Merged pull requests:** - Minor linting and fixes [\#30](https://github.com/Koed00/django-q/pull/30) ([Koed00](https://github.com/Koed00)) - timeout as float [\#29](https://github.com/Koed00/django-q/pull/29) ([Koed00](https://github.com/Koed00)) ## [v0.4.1](https://github.com/koed00/django-q/tree/v0.4.1) (2015-07-21) [Full Changelog](https://github.com/koed00/django-q/compare/v0.4.0...v0.4.1) **Merged pull requests:** - Adds `save` override options for tasks [\#27](https://github.com/Koed00/django-q/pull/27) ([Koed00](https://github.com/Koed00)) - Expanding coverage [\#26](https://github.com/Koed00/django-q/pull/26) ([Koed00](https://github.com/Koed00)) ## [v0.4.0](https://github.com/koed00/django-q/tree/v0.4.0) (2015-07-19) [Full Changelog](https://github.com/koed00/django-q/compare/v0.3.5...v0.4.0) **Merged pull requests:** - Added a group example [\#25](https://github.com/Koed00/django-q/pull/25) ([Koed00](https://github.com/Koed00)) - Adds failure filtering to group functions [\#24](https://github.com/Koed00/django-q/pull/24) ([Koed00](https://github.com/Koed00)) - Adds count\_group\(\) and delete\_group\(\) [\#23](https://github.com/Koed00/django-q/pull/23) ([Koed00](https://github.com/Koed00)) - decoding values\_list on a picklefield is faster [\#22](https://github.com/Koed00/django-q/pull/22) ([Koed00](https://github.com/Koed00)) - Adds task groups [\#21](https://github.com/Koed00/django-q/pull/21) ([Koed00](https://github.com/Koed00)) ## [v0.3.5](https://github.com/koed00/django-q/tree/v0.3.5) (2015-07-17) [Full Changelog](https://github.com/koed00/django-q/compare/v0.3.6...v0.3.5) ## [v0.3.6](https://github.com/koed00/django-q/tree/v0.3.6) (2015-07-17) [Full Changelog](https://github.com/koed00/django-q/compare/0.3.5...v0.3.6) **Merged pull requests:** - Tests now run with logging level debug [\#20](https://github.com/Koed00/django-q/pull/20) ([Koed00](https://github.com/Koed00)) - docs: small edits [\#19](https://github.com/Koed00/django-q/pull/19) ([Koed00](https://github.com/Koed00)) - Adds a `timeout` override per task [\#18](https://github.com/Koed00/django-q/pull/18) ([Koed00](https://github.com/Koed00)) - Adds management commands to the tests [\#17](https://github.com/Koed00/django-q/pull/17) ([Koed00](https://github.com/Koed00)) - Docs: Added a report example [\#16](https://github.com/Koed00/django-q/pull/16) ([Koed00](https://github.com/Koed00)) ## [0.3.5](https://github.com/koed00/django-q/tree/0.3.5) (2015-07-15) [Full Changelog](https://github.com/koed00/django-q/compare/v0.3.4...0.3.5) **Merged pull requests:** - Adds cpu affinity to workers [\#15](https://github.com/Koed00/django-q/pull/15) ([Koed00](https://github.com/Koed00)) - Clean up redis key after test [\#14](https://github.com/Koed00/django-q/pull/14) ([Koed00](https://github.com/Koed00)) - Adding sphinx build to Travis [\#13](https://github.com/Koed00/django-q/pull/13) ([Koed00](https://github.com/Koed00)) - Adding examples to the docs [\#12](https://github.com/Koed00/django-q/pull/12) ([Koed00](https://github.com/Koed00)) ## [v0.3.4](https://github.com/koed00/django-q/tree/v0.3.4) (2015-07-12) [Full Changelog](https://github.com/koed00/django-q/compare/v0.3.3...v0.3.4) **Merged pull requests:** - Testing with Arrow 0.6.0 now [\#11](https://github.com/Koed00/django-q/pull/11) ([Koed00](https://github.com/Koed00)) - Schedules of type ONCE will selfdestruct with negative repeats [\#10](https://github.com/Koed00/django-q/pull/10) ([Koed00](https://github.com/Koed00)) ## [v0.3.3](https://github.com/koed00/django-q/tree/v0.3.3) (2015-07-10) [Full Changelog](https://github.com/koed00/django-q/compare/v0.3.2...v0.3.3) **Closed issues:** - Documentation for mocking in case of testing [\#7](https://github.com/Koed00/django-q/issues/7) **Merged pull requests:** - Fixes save pruning bug [\#9](https://github.com/Koed00/django-q/pull/9) ([Koed00](https://github.com/Koed00)) ## [v0.3.2](https://github.com/koed00/django-q/tree/v0.3.2) (2015-07-09) [Full Changelog](https://github.com/koed00/django-q/compare/v0.3.1...v0.3.2) **Closed issues:** - No module named builtins [\#4](https://github.com/Koed00/django-q/issues/4) **Merged pull requests:** - Updated docs [\#6](https://github.com/Koed00/django-q/pull/6) ([Koed00](https://github.com/Koed00)) - Added 'future' to setup.py dependencies [\#5](https://github.com/Koed00/django-q/pull/5) ([nickpolet](https://github.com/nickpolet)) ## [v0.3.1](https://github.com/koed00/django-q/tree/v0.3.1) (2015-07-08) [Full Changelog](https://github.com/koed00/django-q/compare/v0.3.0...v0.3.1) ## [v0.3.0](https://github.com/koed00/django-q/tree/v0.3.0) (2015-07-08) [Full Changelog](https://github.com/koed00/django-q/compare/v0.2.2...v0.3.0) **Merged pull requests:** - Switched to uuid4 instead of luid [\#3](https://github.com/Koed00/django-q/pull/3) ([Koed00](https://github.com/Koed00)) ## [v0.2.2](https://github.com/koed00/django-q/tree/v0.2.2) (2015-07-07) [Full Changelog](https://github.com/koed00/django-q/compare/v0.2.1.1...v0.2.2) **Merged pull requests:** - Stabilizing stop procedures [\#2](https://github.com/Koed00/django-q/pull/2) ([Koed00](https://github.com/Koed00)) ## [v0.2.1.1](https://github.com/koed00/django-q/tree/v0.2.1.1) (2015-07-06) [Full Changelog](https://github.com/koed00/django-q/compare/v0.2.1...v0.2.1.1) ## [v0.2.1](https://github.com/koed00/django-q/tree/v0.2.1) (2015-07-06) [Full Changelog](https://github.com/koed00/django-q/compare/v0.2.0...v0.2.1) ## [v0.2.0](https://github.com/koed00/django-q/tree/v0.2.0) (2015-07-04) [Full Changelog](https://github.com/koed00/django-q/compare/v0.1.4.1...v0.2.0) ## [v0.1.4.1](https://github.com/koed00/django-q/tree/v0.1.4.1) (2015-07-02) [Full Changelog](https://github.com/koed00/django-q/compare/v0.1.4...v0.1.4.1) ## [v0.1.4](https://github.com/koed00/django-q/tree/v0.1.4) (2015-07-01) [Full Changelog](https://github.com/koed00/django-q/compare/v0.1.3...v0.1.4) ## [v0.1.3](https://github.com/koed00/django-q/tree/v0.1.3) (2015-06-30) [Full Changelog](https://github.com/koed00/django-q/compare/v0.1.2...v0.1.3) ## [v0.1.2](https://github.com/koed00/django-q/tree/v0.1.2) (2015-06-30) [Full Changelog](https://github.com/koed00/django-q/compare/v0.1.1...v0.1.2) ## [v0.1.1](https://github.com/koed00/django-q/tree/v0.1.1) (2015-06-28) [Full Changelog](https://github.com/koed00/django-q/compare/v0.1.0...v0.1.1) ## [v0.1.0](https://github.com/koed00/django-q/tree/v0.1.0) (2015-06-28) \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* django-q-1.0.2/LICENSE000066400000000000000000000020711352353655300142310ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 Ilan Steemers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. django-q-1.0.2/MANIFEST.in000066400000000000000000000004001352353655300147540ustar00rootroot00000000000000include LICENSE include README.rst include CHANGELOG. recursive-include django_q/locale * include django_q/management/*.py include django_q/management/commands/*.py include django_q/migrations/*.py include django_q/brokers/*.py include django_q/tests/*.py django-q-1.0.2/README.rst000066400000000000000000000153031352353655300147150ustar00rootroot00000000000000.. image:: docs/_static/logo.png :align: center :alt: Q logo :target: https://django-q.readthedocs.org/ A multiprocessing distributed task queue for Django --------------------------------------------------- |image0| |image1| |docs| |image2| Features ~~~~~~~~ - Multiprocessing worker pool - Asynchronous tasks - Scheduled and repeated tasks - Encrypted and compressed packages - Failure and success database or cache - Result hooks, groups and chains - Django Admin integration - PaaS compatible with multiple instances - Multi cluster monitor - Redis, Disque, IronMQ, SQS, MongoDB or ORM - Rollbar and Sentry support Requirements ~~~~~~~~~~~~ - `Django `__ > = 1.11.23 - `Django-picklefield `__ - `Arrow `__ - `Blessed `__ Tested with: Python 3.6. 3.7 Django 1.11.x and 2.2.x .. warning:: Since Python 3.7 `async` became a reserved keyword and was refactored to `async_task` Brokers ~~~~~~~ - `Redis `__ - `Disque `__ - `IronMQ `__ - `Amazon SQS `__ - `MongoDB `__ - `Django ORM `__ Installation ~~~~~~~~~~~~ - Install the latest version with pip:: $ pip install django-q - Add `django_q` to your `INSTALLED_APPS` in your projects `settings.py`:: INSTALLED_APPS = ( # other apps 'django_q', ) - Run Django migrations to create the database tables:: $ python manage.py migrate - Choose a message `broker `__ , configure and install the appropriate client library. Read the full documentation at `https://django-q.readthedocs.org `__ Configuration ~~~~~~~~~~~~~ All configuration settings are optional. e.g: .. code:: python # settings.py example Q_CLUSTER = { 'name': 'myproject', 'workers': 8, 'recycle': 500, 'timeout': 60, 'compress': True, 'cpu_affinity': 1, 'save_limit': 250, 'queue_limit': 500, 'label': 'Django Q', 'redis': { 'host': '127.0.0.1', 'port': 6379, 'db': 0, } } For full configuration options, see the `configuration documentation `__. Management Commands ~~~~~~~~~~~~~~~~~~~ Start a cluster with:: $ python manage.py qcluster Monitor your clusters with:: $ python manage.py qmonitor Check overall statistics with:: $ python manage.py qinfo Creating Tasks ~~~~~~~~~~~~~~ Use `async_task` from your code to quickly offload tasks: .. code:: python from django_q.tasks import async_task, result # create the task async_task('math.copysign', 2, -2) # or with a reference import math.copysign task_id = async_task(copysign, 2, -2) # get the result task_result = result(task_id) # result returns None if the task has not been executed yet # you can wait for it task_result = result(task_id, 200) # but in most cases you will want to use a hook: async_task('math.modf', 2.5, hook='hooks.print_result') # hooks.py def print_result(task): print(task.result) For more info see `Tasks `__ Schedule ~~~~~~~~ Schedules are regular Django models. You can manage them through the Admin page or directly from your code: .. code:: python # Use the schedule function from django_q.tasks import schedule schedule('math.copysign', 2, -2, hook='hooks.print_result', schedule_type=Schedule.DAILY) # Or create the object directly from django_q.models import Schedule Schedule.objects.create(func='math.copysign', hook='hooks.print_result', args='2,-2', schedule_type=Schedule.DAILY ) # Run a task every 5 minutes, starting at 6 today # for 2 hours import arrow schedule('math.hypot', 3, 4, schedule_type=Schedule.MINUTES, minutes=5, repeats=24, next_run=arrow.utcnow().replace(hour=18, minute=0)) For more info check the `Schedules `__ documentation. Testing ~~~~~~~ To run the tests you will need the following in addition to install requirements: * `py.test `__ * `pytest-django `__ * disque from https://github.com/antirez/disque.git * Redis * MongoDB The following commands can be used to run the tests: .. code:: bash # Create virtual environment python -m venv venv # Install requirements venv/bin/pip install -r requirements.txt # Install test dependencies venv/bin/pip install pytest pytest-django # Install django-q venv/bin/python setup.py develop # Run required services (you need to have docker-compose installed) docker-compose -f test-services-docker-compose.yaml up -d # Run tests venv/bin/pytest # Stop the services required by tests (when you no longer plan to run tests) docker-compose -f test-services-docker-compose.yaml down Locale ~~~~~~ Currently available in English and French. Translation pull requests are always welcome. Todo ~~~~ - Better tests and coverage - Less dependencies? Acknowledgements ~~~~~~~~~~~~~~~~ - Django Q was inspired by working with `Django-RQ `__ and `RQ `__ - Human readable hashes by `HumanHash `__ - Redditors feedback at `r/django `__ .. |image0| image:: https://travis-ci.org/Koed00/django-q.svg?branch=master :target: https://travis-ci.org/Koed00/django-q .. |image1| image:: http://codecov.io/github/Koed00/django-q/coverage.svg?branch=master :target: http://codecov.io/github/Koed00/django-q?branch=master .. |image2| image:: http://badges.gitter.im/Join%20Chat.svg :target: https://gitter.im/Koed00/django-q .. |docs| image:: https://readthedocs.org/projects/docs/badge/?version=latest :alt: Documentation Status :scale: 100 :target: https://django-q.readthedocs.org/ django-q-1.0.2/django_q/000077500000000000000000000000001352353655300150065ustar00rootroot00000000000000django-q-1.0.2/django_q/__init__.py000066400000000000000000000001731352353655300171200ustar00rootroot00000000000000VERSION = (1, 0, 2) default_app_config = 'django_q.apps.DjangoQConfig' __all__ = ['conf', 'cluster', 'models', 'tasks'] django-q-1.0.2/django_q/admin.py000066400000000000000000000057761352353655300164670ustar00rootroot00000000000000"""Admin module for Django.""" from django.contrib import admin from django.utils.translation import ugettext_lazy as _ from django_q.conf import Conf from django_q.models import Success, Failure, Schedule, OrmQ from django_q.tasks import async_task class TaskAdmin(admin.ModelAdmin): """model admin for success tasks.""" list_display = ( u'name', 'func', 'started', 'stopped', 'time_taken', 'group' ) def has_add_permission(self, request): """Don't allow adds.""" return False def get_queryset(self, request): """Only show successes.""" qs = super(TaskAdmin, self).get_queryset(request) return qs.filter(success=True) search_fields = ('name', 'func', 'group') readonly_fields = [] list_filter = ('group',) def get_readonly_fields(self, request, obj=None): """Set all fields readonly.""" return list(self.readonly_fields) + [field.name for field in obj._meta.fields] def retry_failed(FailAdmin, request, queryset): """Submit selected tasks back to the queue.""" for task in queryset: async_task(task.func, *task.args or (), hook=task.hook, **task.kwargs or {}) task.delete() retry_failed.short_description = _("Resubmit selected tasks to queue") class FailAdmin(admin.ModelAdmin): """model admin for failed tasks.""" list_display = ( 'name', 'func', 'started', 'stopped', 'short_result' ) def has_add_permission(self, request): """Don't allow adds.""" return False actions = [retry_failed] search_fields = ('name', 'func') list_filter = ('group',) readonly_fields = [] def get_readonly_fields(self, request, obj=None): """Set all fields readonly.""" return list(self.readonly_fields) + [field.name for field in obj._meta.fields] class ScheduleAdmin(admin.ModelAdmin): """ model admin for schedules """ list_display = ( 'id', 'name', 'func', 'schedule_type', 'repeats', 'next_run', 'last_run', 'success' ) list_filter = ('next_run', 'schedule_type') search_fields = ('func',) list_display_links = ('id', 'name') class QueueAdmin(admin.ModelAdmin): """ queue admin for ORM broker """ list_display = ( 'id', 'key', 'task_id', 'name', 'func', 'lock' ) def save_model(self, request, obj, form, change): obj.save(using=Conf.ORM) def delete_model(self, request, obj): obj.delete(using=Conf.ORM) def get_queryset(self, request): return super(QueueAdmin, self).get_queryset(request).using(Conf.ORM) def has_add_permission(self, request): """Don't allow adds.""" return False admin.site.register(Schedule, ScheduleAdmin) admin.site.register(Success, TaskAdmin) admin.site.register(Failure, FailAdmin) if Conf.ORM or Conf.TESTING: admin.site.register(OrmQ, QueueAdmin) django-q-1.0.2/django_q/apps.py000066400000000000000000000003351352353655300163240ustar00rootroot00000000000000from django.apps import AppConfig from django_q.conf import Conf class DjangoQConfig(AppConfig): name = 'django_q' verbose_name = Conf.LABEL def ready(self): from django_q.signals import call_hook django-q-1.0.2/django_q/brokers/000077500000000000000000000000001352353655300164555ustar00rootroot00000000000000django-q-1.0.2/django_q/brokers/__init__.py000066400000000000000000000111741352353655300205720ustar00rootroot00000000000000import importlib from django.core.cache import caches, InvalidCacheBackendError from django_q.conf import Conf class Broker(object): def __init__(self, list_key=Conf.PREFIX): self.connection = self.get_connection(list_key) self.list_key = list_key self.cache = self.get_cache() self._info = None def enqueue(self, task): """ Puts a task onto the queue :type task: str :return: task id """ pass def dequeue(self): """ Gets a task from the queue :return: tuple with task id and task message """ pass def queue_size(self): """ :return: the amount of tasks in the queue """ pass def lock_size(self): """ :return: the number of tasks currently awaiting acknowledgement """ def delete_queue(self): """ Deletes the queue from the broker """ pass def purge_queue(self): """ Purges the queue of any tasks """ pass def delete(self, task_id): """ Deletes a task from the queue :param task_id: the id of the task """ pass def acknowledge(self, task_id): """ Acknowledges completion of the task and removes it from the queue. :param task_id: the id of the task """ pass def fail(self, task_id): """ Fails a task message :param task_id: :return: """ def ping(self): """ Checks whether the broker connection is available :rtype: bool """ pass def info(self): """ Shows the broker type """ return self._info def set_stat(self, key, value, timeout): """ Saves a cluster statistic to the cache provider :type key: str :type value: str :type timeout: int """ if not self.cache: return key_list = self.cache.get(Conf.Q_STAT, []) if key not in key_list: key_list.append(key) self.cache.set(Conf.Q_STAT, key_list) return self.cache.set(key, value, timeout) def get_stat(self, key): """ Gets a cluster statistic from the cache provider :type key: str :return: a cluster Stat """ if not self.cache: return return self.cache.get(key) def get_stats(self, pattern): """ Returns a list of all cluster stats from the cache provider :type pattern: str :return: a list of Stats """ if not self.cache: return key_list = self.cache.get(Conf.Q_STAT) if not key_list or len(key_list) == 0: return [] stats = [] for key in key_list: stat = self.cache.get(key) if stat: stats.append(stat) else: key_list.remove(key) self.cache.set(Conf.Q_STAT, key_list) return stats @staticmethod def get_cache(): """ Gets the current cache provider :return: a cache provider """ try: return caches[Conf.CACHE] except InvalidCacheBackendError: return None @staticmethod def get_connection(list_key=Conf.PREFIX): """ Gets a connection to the broker :param list_key: Optional queue name :return: a broker connection """ return 0 def get_broker(list_key=Conf.PREFIX): """ Gets the configured broker type :param list_key: optional queue name :type list_key: str :return: """ # custom if Conf.BROKER_CLASS: module, func = Conf.BROKER_CLASS.rsplit('.', 1) m = importlib.import_module(module) broker = getattr(m, func) return broker(list_key=list_key) # disque elif Conf.DISQUE_NODES: from django_q.brokers import disque return disque.Disque(list_key=list_key) # Iron MQ elif Conf.IRON_MQ: from django_q.brokers import ironmq return ironmq.IronMQBroker(list_key=list_key) # SQS elif Conf.SQS: from django_q.brokers import aws_sqs return aws_sqs.Sqs(list_key=list_key) # ORM elif Conf.ORM: from django_q.brokers import orm return orm.ORM(list_key=list_key) # Mongo elif Conf.MONGO: from django_q.brokers import mongo return mongo.Mongo(list_key=list_key) # default to redis else: from django_q.brokers import redis_broker return redis_broker.Redis(list_key=list_key) django-q-1.0.2/django_q/brokers/aws_sqs.py000066400000000000000000000034161352353655300205130ustar00rootroot00000000000000from django_q.conf import Conf from django_q.brokers import Broker from boto3 import Session class Sqs(Broker): def __init__(self, list_key=Conf.PREFIX): self.sqs = None super(Sqs, self).__init__(list_key) self.queue = self.get_queue() def enqueue(self, task): response = self.queue.send_message(MessageBody=task) return response.get('MessageId') def dequeue(self): # sqs supports max 10 messages in bulk if Conf.BULK > 10: Conf.BULK = 10 tasks = self.queue.receive_messages(MaxNumberOfMessages=Conf.BULK, VisibilityTimeout=Conf.RETRY) if tasks: return [(t.receipt_handle, t.body) for t in tasks] def acknowledge(self, task_id): return self.delete(task_id) def queue_size(self): return int(self.queue.attributes['ApproximateNumberOfMessages']) def lock_size(self): return int(self.queue.attributes['ApproximateNumberOfMessagesNotVisible']) def delete(self, task_id): message = self.sqs.Message(self.queue.url, task_id) message.delete() def fail(self, task_id): self.delete(task_id) def delete_queue(self): self.queue.delete() def purge_queue(self): self.queue.purge() def ping(self): return 'sqs' in self.connection.get_available_resources() def info(self): return 'AWS SQS' @staticmethod def get_connection(list_key=Conf.PREFIX): config = Conf.SQS if 'aws_region' in config: config['region_name'] = config['aws_region'] del(config['aws_region']) return Session(**config) def get_queue(self): self.sqs = self.connection.resource('sqs') return self.sqs.create_queue(QueueName=self.list_key) django-q-1.0.2/django_q/brokers/disque.py000066400000000000000000000045511352353655300203260ustar00rootroot00000000000000import random import redis from django_q.brokers import Broker from django_q.conf import Conf class Disque(Broker): def enqueue(self, task): retry = Conf.RETRY if Conf.RETRY > 0 else '{} REPLICATE 1'.format(Conf.RETRY) return self.connection.execute_command( 'ADDJOB {} {} 500 RETRY {}'.format(self.list_key, task, retry)).decode() def dequeue(self): tasks = self.connection.execute_command( 'GETJOB COUNT {} TIMEOUT 1000 FROM {}'.format(Conf.BULK, self.list_key)) if tasks: return [(t[1].decode(), t[2].decode()) for t in tasks] def queue_size(self): return self.connection.execute_command('QLEN {}'.format(self.list_key)) def acknowledge(self, task_id): command = 'FASTACK' if Conf.DISQUE_FASTACK else 'ACKJOB' return self.connection.execute_command('{} {}'.format(command,task_id)) def ping(self): return self.connection.execute_command('HELLO')[0] > 0 def delete(self, task_id): return self.connection.execute_command('DELJOB {}'.format(task_id)) def fail(self, task_id): return self.delete(task_id) def delete_queue(self): jobs = self.connection.execute_command('JSCAN QUEUE {}'.format(self.list_key))[1] if jobs: job_ids = ' '.join(jid.decode() for jid in jobs) self.connection.execute_command('DELJOB {}'.format(job_ids)) return len(jobs) def info(self): if not self._info: info = self.connection.info('server') self._info= 'Disque {}'.format(info['disque_version']) return self._info @staticmethod def get_connection(list_key=Conf.PREFIX): # randomize nodes random.shuffle(Conf.DISQUE_NODES) # find one that works for node in Conf.DISQUE_NODES: host, port = node.split(':') kwargs = {'host': host, 'port': port} if Conf.DISQUE_AUTH: kwargs['password'] = Conf.DISQUE_AUTH redis_client = redis.Redis(**kwargs) redis_client.decode_responses = True try: redis_client.execute_command('HELLO') return redis_client except redis.exceptions.ConnectionError: continue raise redis.exceptions.ConnectionError('Could not connect to any Disque nodes') django-q-1.0.2/django_q/brokers/ironmq.py000066400000000000000000000024731352353655300203420ustar00rootroot00000000000000from requests.exceptions import HTTPError from django_q.conf import Conf from django_q.brokers import Broker from iron_mq import IronMQ class IronMQBroker(Broker): def enqueue(self, task): return self.connection.post(task)['ids'][0] def dequeue(self): timeout = Conf.RETRY or None tasks = self.connection.get(timeout=timeout, wait=1, max=Conf.BULK)['messages'] if tasks: return [(t['id'], t['body']) for t in tasks] def ping(self): return self.connection.name == self.list_key def info(self): return 'IronMQ' def queue_size(self): return self.connection.size() def delete_queue(self): try: return self.connection.delete_queue()['msg'] except HTTPError: return False def purge_queue(self): return self.connection.clear() def delete(self, task_id): try: return self.connection.delete(task_id)['msg'] except HTTPError: return False def fail(self, task_id): self.delete(task_id) def acknowledge(self, task_id): return self.delete(task_id) @staticmethod def get_connection(list_key=Conf.PREFIX): ironmq = IronMQ(name=None, **Conf.IRON_MQ) return ironmq.queue(queue_name=list_key) django-q-1.0.2/django_q/brokers/mongo.py000066400000000000000000000040771352353655300201560ustar00rootroot00000000000000from datetime import timedelta from time import sleep from bson import ObjectId from django.utils import timezone from pymongo import MongoClient from pymongo.errors import ConfigurationError from django_q.brokers import Broker from django_q.conf import Conf def _timeout(): return timezone.now() - timedelta(seconds=Conf.RETRY) class Mongo(Broker): def __init__(self, list_key=Conf.PREFIX): super(Mongo, self).__init__(list_key) self.collection = self.get_collection() @staticmethod def get_connection(list_key=Conf.PREFIX): return MongoClient(**Conf.MONGO) def get_collection(self): if not Conf.MONGO_DB: try: Conf.MONGO_DB = self.connection.get_default_database().name except ConfigurationError: Conf.MONGO_DB = 'django-q' return self.connection[Conf.MONGO_DB][self.list_key] def queue_size(self): return self.collection.count({'lock': {'$lte': _timeout()}}) def lock_size(self): return self.collection.count({'lock': {'$gt': _timeout()}}) def purge_queue(self): return self.delete_queue() def ping(self): return self.info is not None def info(self): if not self._info: self._info = 'MongoDB {}'.format(self.connection.server_info()['version']) return self._info def fail(self, task_id): self.delete(task_id) def enqueue(self, task): inserted_id = self.collection.insert_one({'payload': task, 'lock': _timeout()}).inserted_id return str(inserted_id) def dequeue(self): task = self.collection.find_one_and_update({'lock': {'$lte': _timeout()}}, {'$set': {'lock': timezone.now()}}) if task: return [(str(task['_id']), task['payload'])] # empty queue, spare the cpu sleep(Conf.POLL) def delete_queue(self): return self.collection.drop() def delete(self, task_id): self.collection.delete_one({'_id': ObjectId(task_id)}) def acknowledge(self, task_id): return self.delete(task_id) django-q-1.0.2/django_q/brokers/orm.py000066400000000000000000000044571352353655300176360ustar00rootroot00000000000000from datetime import timedelta from time import sleep from django.utils import timezone from django import db from django.db import transaction from django_q.brokers import Broker from django_q.models import OrmQ from django_q.conf import Conf, logger def _timeout(): return timezone.now() - timedelta(seconds=Conf.RETRY) class ORM(Broker): @staticmethod def get_connection(list_key=Conf.PREFIX): if transaction.get_autocommit(): # Only True when not in an atomic block # Make sure stale connections in the broker thread are explicitly # closed before attempting DB access. # logger.debug("Broker thread calling close_old_connections") db.close_old_connections() else: logger.debug("Broker in an atomic transaction") return OrmQ.objects.using(Conf.ORM) def queue_size(self): return self.get_connection().filter(key=self.list_key, lock__lte=_timeout()).count() def lock_size(self): return self.get_connection().filter(key=self.list_key, lock__gt=_timeout()).count() def purge_queue(self): return self.get_connection().filter(key=self.list_key).delete() def ping(self): return True def info(self): if not self._info: self._info = 'ORM {}'.format(Conf.ORM) return self._info def fail(self, task_id): self.delete(task_id) def enqueue(self, task): package = self.get_connection().create(key=self.list_key, payload=task, lock=_timeout()) return package.pk def dequeue(self): tasks = self.get_connection().filter(key=self.list_key, lock__lt=_timeout())[0:Conf.BULK] if tasks: task_list = [] for task in tasks: if self.get_connection().filter(id=task.id, lock=task.lock).update(lock=timezone.now()): task_list.append((task.pk, task.payload)) # else don't process, as another cluster has been faster than us on that task return task_list # empty queue, spare the cpu sleep(Conf.POLL) def delete_queue(self): return self.purge_queue() def delete(self, task_id): self.get_connection().filter(pk=task_id).delete() def acknowledge(self, task_id): return self.delete(task_id) django-q-1.0.2/django_q/brokers/redis_broker.py000066400000000000000000000033371352353655300215070ustar00rootroot00000000000000import redis from django_q.brokers import Broker from django_q.conf import Conf, logger try: import django_redis except ImportError: django_redis = None class Redis(Broker): def __init__(self, list_key=Conf.PREFIX): super(Redis, self).__init__(list_key='django_q:{}:q'.format(list_key)) def enqueue(self, task): return self.connection.rpush(self.list_key, task) def dequeue(self): task = self.connection.blpop(self.list_key, 1) if task: return [(None, task[1])] def queue_size(self): return self.connection.llen(self.list_key) def delete_queue(self): return self.connection.delete(self.list_key) def purge_queue(self): return self.connection.ltrim(self.list_key, 1, 0) def ping(self): try: return self.connection.ping() except redis.ConnectionError as e: logger.error('Can not connect to Redis server.') raise e def info(self): if not self._info: info = self.connection.info('server') self._info = 'Redis {}'.format(info['redis_version']) return self._info def set_stat(self, key, value, timeout): self.connection.set(key, value, timeout) def get_stat(self, key): if self.connection.exists(key): return self.connection.get(key) def get_stats(self, pattern): keys = self.connection.keys(pattern=pattern) if keys: return self.connection.mget(keys) @staticmethod def get_connection(list_key=Conf.PREFIX): if django_redis and Conf.DJANGO_REDIS: return django_redis.get_redis_connection(Conf.DJANGO_REDIS) return redis.StrictRedis(**Conf.REDIS) django-q-1.0.2/django_q/cluster.py000066400000000000000000000551421352353655300170500ustar00rootroot00000000000000# Future from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals from time import sleep # external import arrow import ast # Standard import importlib import signal import socket import traceback # Django from django import db from django.conf import settings from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from multiprocessing import Event, Process, Value, current_process # Local import django_q.tasks from django_q.brokers import get_broker from django_q.conf import Conf, logger, psutil, get_ppid, error_reporter from django_q.models import Task, Success, Schedule from django_q.queues import Queue from django_q.signals import pre_execute from django_q.signing import SignedPackage, BadSignature from django_q.status import Stat, Status class Cluster(object): def __init__(self, broker=None): self.broker = broker or get_broker() self.sentinel = None self.stop_event = None self.start_event = None self.pid = current_process().pid self.host = socket.gethostname() self.timeout = Conf.TIMEOUT signal.signal(signal.SIGTERM, self.sig_handler) signal.signal(signal.SIGINT, self.sig_handler) def start(self): # Start Sentinel self.stop_event = Event() self.start_event = Event() self.sentinel = Process(target=Sentinel, args=(self.stop_event, self.start_event, self.broker, self.timeout)) self.sentinel.start() logger.info(_('Q Cluster-{} starting.').format(self.pid)) while not self.start_event.is_set(): sleep(0.1) return self.pid def stop(self): if not self.sentinel.is_alive(): return False logger.info(_('Q Cluster-{} stopping.').format(self.pid)) self.stop_event.set() self.sentinel.join() logger.info(_('Q Cluster-{} has stopped.').format(self.pid)) self.start_event = None self.stop_event = None return True def sig_handler(self, signum, frame): logger.debug(_('{} got signal {}').format(current_process().name, Conf.SIGNAL_NAMES.get(signum, 'UNKNOWN'))) self.stop() @property def stat(self): if self.sentinel: return Stat.get(self.pid) return Status(self.pid) @property def is_starting(self): return self.stop_event and self.start_event and not self.start_event.is_set() @property def is_running(self): return self.stop_event and self.start_event and self.start_event.is_set() @property def is_stopping(self): return self.stop_event and self.start_event and self.start_event.is_set() and self.stop_event.is_set() @property def has_stopped(self): return self.start_event is None and self.stop_event is None and self.sentinel class Sentinel(object): def __init__(self, stop_event, start_event, broker=None, timeout=Conf.TIMEOUT, start=True): # Make sure we catch signals for the pool signal.signal(signal.SIGINT, signal.SIG_IGN) signal.signal(signal.SIGTERM, signal.SIG_DFL) self.pid = current_process().pid self.parent_pid = get_ppid() self.name = current_process().name self.broker = broker or get_broker() self.reincarnations = 0 self.tob = timezone.now() self.stop_event = stop_event self.start_event = start_event self.pool_size = Conf.WORKERS self.pool = [] self.timeout = timeout self.task_queue = Queue(maxsize=Conf.QUEUE_LIMIT) if Conf.QUEUE_LIMIT else Queue() self.result_queue = Queue() self.event_out = Event() self.monitor = None self.pusher = None if start: self.start() def start(self): self.broker.ping() self.spawn_cluster() self.guard() def status(self): if not self.start_event.is_set() and not self.stop_event.is_set(): return Conf.STARTING elif self.start_event.is_set() and not self.stop_event.is_set(): if self.result_queue.empty() and self.task_queue.empty(): return Conf.IDLE return Conf.WORKING elif self.stop_event.is_set() and self.start_event.is_set(): if self.monitor.is_alive() or self.pusher.is_alive() or len(self.pool) > 0: return Conf.STOPPING return Conf.STOPPED def spawn_process(self, target, *args): """ :type target: function or class """ p = Process(target=target, args=args) p.daemon = True if target == worker: p.daemon = Conf.DAEMONIZE_WORKERS p.timer = args[2] self.pool.append(p) p.start() return p def spawn_pusher(self): return self.spawn_process(pusher, self.task_queue, self.event_out, self.broker) def spawn_worker(self): self.spawn_process(worker, self.task_queue, self.result_queue, Value('f', -1), self.timeout) def spawn_monitor(self): return self.spawn_process(monitor, self.result_queue, self.broker) def reincarnate(self, process): """ :param process: the process to reincarnate :type process: Process or None """ db.connections.close_all() # Close any old connections if process == self.monitor: self.monitor = self.spawn_monitor() logger.error(_("reincarnated monitor {} after sudden death").format(process.name)) elif process == self.pusher: self.pusher = self.spawn_pusher() logger.error(_("reincarnated pusher {} after sudden death").format(process.name)) else: self.pool.remove(process) self.spawn_worker() if process.timer.value == 0: # only need to terminate on timeout, otherwise we risk destabilizing the queues process.terminate() logger.warn(_("reincarnated worker {} after timeout").format(process.name)) elif int(process.timer.value) == -2: logger.info(_("recycled worker {}").format(process.name)) else: logger.error(_("reincarnated worker {} after death").format(process.name)) self.reincarnations += 1 def spawn_cluster(self): self.pool = [] Stat(self).save() db.connection.close() # spawn worker pool for __ in range(self.pool_size): self.spawn_worker() # spawn auxiliary self.monitor = self.spawn_monitor() self.pusher = self.spawn_pusher() # set worker cpu affinity if needed if psutil and Conf.CPU_AFFINITY: set_cpu_affinity(Conf.CPU_AFFINITY, [w.pid for w in self.pool]) def guard(self): logger.info(_('{} guarding cluster at {}').format(current_process().name, self.pid)) self.start_event.set() Stat(self).save() logger.info(_('Q Cluster-{} running.').format(self.parent_pid)) scheduler(broker=self.broker) counter = 0 cycle = Conf.GUARD_CYCLE # guard loop sleep in seconds # Guard loop. Runs at least once while not self.stop_event.is_set() or not counter: # Check Workers for p in self.pool: with p.timer.get_lock(): # Are you alive? if not p.is_alive() or p.timer.value == 0: self.reincarnate(p) continue # Decrement timer if work is being done if p.timer.value > 0: p.timer.value -= cycle # Check Monitor if not self.monitor.is_alive(): self.reincarnate(self.monitor) # Check Pusher if not self.pusher.is_alive(): self.reincarnate(self.pusher) # Call scheduler once a minute (or so) counter += cycle if counter >= 30 and Conf.SCHEDULER: counter = 0 scheduler(broker=self.broker) # Save current status Stat(self).save() sleep(cycle) self.stop() def stop(self): Stat(self).save() name = current_process().name logger.info(_('{} stopping cluster processes').format(name)) # Stopping pusher self.event_out.set() # Wait for it to stop while self.pusher.is_alive(): sleep(0.1) Stat(self).save() # Put poison pills in the queue for __ in range(len(self.pool)): self.task_queue.put('STOP') self.task_queue.close() # wait for the task queue to empty self.task_queue.join_thread() # Wait for all the workers to exit while len(self.pool): for p in self.pool: if not p.is_alive(): self.pool.remove(p) sleep(0.1) Stat(self).save() # Finally stop the monitor self.result_queue.put('STOP') self.result_queue.close() # Wait for the result queue to empty self.result_queue.join_thread() logger.info(_('{} waiting for the monitor.').format(name)) # Wait for everything to close or time out count = 0 if not self.timeout: self.timeout = 30 while self.status() == Conf.STOPPING and count < self.timeout * 10: sleep(0.1) Stat(self).save() count += 1 # Final status Stat(self).save() def pusher(task_queue, event, broker=None): """ Pulls tasks of the broker and puts them in the task queue :type task_queue: multiprocessing.Queue :type event: multiprocessing.Event """ if not broker: broker = get_broker() logger.info(_('{} pushing tasks at {}').format(current_process().name, current_process().pid)) while True: try: task_set = broker.dequeue() except Exception as e: logger.error(e, traceback.format_exc()) # broker probably crashed. Let the sentinel handle it. sleep(10) break if task_set: for task in task_set: ack_id = task[0] # unpack the task try: task = SignedPackage.loads(task[1]) except (TypeError, BadSignature) as e: logger.error(e, traceback.format_exc()) broker.fail(ack_id) continue task['ack_id'] = ack_id task_queue.put(task) logger.debug(_('queueing from {}').format(broker.list_key)) if event.is_set(): break logger.info(_("{} stopped pushing tasks").format(current_process().name)) def monitor(result_queue, broker=None): """ Gets finished tasks from the result queue and saves them to Django :type result_queue: multiprocessing.Queue """ if not broker: broker = get_broker() name = current_process().name logger.info(_("{} monitoring at {}").format(name, current_process().pid)) for task in iter(result_queue.get, 'STOP'): # save the result if task.get('cached', False): save_cached(task, broker) else: save_task(task, broker) # acknowledge result ack_id = task.pop('ack_id', False) if ack_id and (task['success'] or task.get('ack_failure', False)): broker.acknowledge(ack_id) # log the result if task['success']: # log success logger.info(_("Processed [{}]").format(task['name'])) else: # log failure logger.error(_("Failed [{}] - {}").format(task['name'], task['result'])) logger.info(_("{} stopped monitoring results").format(name)) def worker(task_queue, result_queue, timer, timeout=Conf.TIMEOUT): """ Takes a task from the task queue, tries to execute it and puts the result back in the result queue :type task_queue: multiprocessing.Queue :type result_queue: multiprocessing.Queue :type timer: multiprocessing.Value """ name = current_process().name logger.info(_('{} ready for work at {}').format(name, current_process().pid)) task_count = 0 if timeout is None: timeout = -1 # Start reading the task queue for task in iter(task_queue.get, 'STOP'): result = None timer.value = -1 # Idle task_count += 1 # Get the function from the task logger.info(_('{} processing [{}]').format(name, task['name'])) f = task['func'] # if it's not an instance try to get it from the string if not callable(task['func']): try: module, func = f.rsplit('.', 1) m = importlib.import_module(module) f = getattr(m, func) except (ValueError, ImportError, AttributeError) as e: result = (e, False) if error_reporter: error_reporter.report() # We're still going if not result: db.close_old_connections() timer_value = task['kwargs'].pop('timeout', timeout) # signal execution pre_execute.send(sender="django_q", func=f, task=task) # execute the payload timer.value = timer_value # Busy try: res = f(*task['args'], **task['kwargs']) result = (res, True) except Exception as e: result = ('{} : {}'.format(e, traceback.format_exc()), False) if error_reporter: error_reporter.report() with timer.get_lock(): # Process result task['result'] = result[0] task['success'] = result[1] task['stopped'] = timezone.now() result_queue.put(task) timer.value = -1 # Idle # Recycle if task_count == Conf.RECYCLE: timer.value = -2 # Recycled break logger.info(_('{} stopped doing work').format(name)) def save_task(task, broker): """ Saves the task package to Django or the cache """ # SAVE LIMIT < 0 : Don't save success if not task.get('save', Conf.SAVE_LIMIT >= 0) and task['success']: return # enqueues next in a chain if task.get('chain', None): django_q.tasks.async_chain(task['chain'], group=task['group'], cached=task['cached'], sync=task['sync'], broker=broker) # SAVE LIMIT > 0: Prune database, SAVE_LIMIT 0: No pruning db.close_old_connections() try: if task['success'] and 0 < Conf.SAVE_LIMIT <= Success.objects.count(): Success.objects.last().delete() # check if this task has previous results if Task.objects.filter(id=task['id'], name=task['name']).exists(): existing_task = Task.objects.get(id=task['id'], name=task['name']) # only update the result if it hasn't succeeded yet if not existing_task.success: existing_task.stopped = task['stopped'] existing_task.result = task['result'] existing_task.success = task['success'] existing_task.save() else: Task.objects.create(id=task['id'], name=task['name'], func=task['func'], hook=task.get('hook'), args=task['args'], kwargs=task['kwargs'], started=task['started'], stopped=task['stopped'], result=task['result'], group=task.get('group'), success=task['success'] ) except Exception as e: logger.error(e) def save_cached(task, broker): task_key = '{}:{}'.format(broker.list_key, task['id']) timeout = task['cached'] if timeout is True: timeout = None try: group = task.get('group', None) iter_count = task.get('iter_count', 0) # if it's a group append to the group list if group: group_key = '{}:{}:keys'.format(broker.list_key, group) group_list = broker.cache.get(group_key) or [] # if it's an iter group, check if we are ready if iter_count and len(group_list) == iter_count - 1: group_args = '{}:{}:args'.format(broker.list_key, group) # collate the results into a Task result results = [SignedPackage.loads(broker.cache.get(k))['result'] for k in group_list] results.append(task['result']) task['result'] = results task['id'] = group task['args'] = SignedPackage.loads(broker.cache.get(group_args)) task.pop('iter_count', None) task.pop('group', None) if task.get('iter_cached', None): task['cached'] = task.pop('iter_cached', None) save_cached(task, broker=broker) else: save_task(task, broker) broker.cache.delete_many(group_list) broker.cache.delete_many([group_key, group_args]) return # save the group list group_list.append(task_key) broker.cache.set(group_key, group_list, timeout) # async_task next in a chain if task.get('chain', None): django_q.tasks.async_chain(task['chain'], group=group, cached=task['cached'], sync=task['sync'], broker=broker) # save the task broker.cache.set(task_key, SignedPackage.dumps(task), timeout) except Exception as e: logger.error(e) def scheduler(broker=None): """ Creates a task from a schedule at the scheduled time and schedules next run """ if not broker: broker = get_broker() db.close_old_connections() try: for s in Schedule.objects.exclude(repeats=0).filter(next_run__lt=timezone.now()): args = () kwargs = {} # get args, kwargs and hook if s.kwargs: try: # eval should be safe here because dict() kwargs = eval('dict({})'.format(s.kwargs)) except SyntaxError: kwargs = {} if s.args: args = ast.literal_eval(s.args) # single value won't eval to tuple, so: if type(args) != tuple: args = (args,) q_options = kwargs.get('q_options', {}) if s.hook: q_options['hook'] = s.hook # set up the next run time if not s.schedule_type == s.ONCE: next_run = arrow.get(s.next_run) while True: if s.schedule_type == s.MINUTES: next_run = next_run.shift(minutes=+(s.minutes or 1)) elif s.schedule_type == s.HOURLY: next_run = next_run.shift(hours=+1) elif s.schedule_type == s.DAILY: next_run = next_run.shift(days=+1) elif s.schedule_type == s.WEEKLY: next_run = next_run.shift(weeks=+1) elif s.schedule_type == s.MONTHLY: next_run = next_run.shift(months=+1) elif s.schedule_type == s.QUARTERLY: next_run = next_run.shift(months=+3) elif s.schedule_type == s.YEARLY: next_run = next_run.shift(years=+1) if Conf.CATCH_UP or next_run > arrow.utcnow(): break # arrow always returns a tz aware datetime, and we don't want # this when we explicitly configured django with USE_TZ=False s.next_run = next_run.datetime if settings.USE_TZ else next_run.datetime.replace(tzinfo=None) s.repeats += -1 # send it to the cluster q_options['broker'] = broker q_options['group'] = q_options.get('group', s.name or s.id) kwargs['q_options'] = q_options s.task = django_q.tasks.async_task(s.func, *args, **kwargs) # log it if not s.task: logger.error( _('{} failed to create a task from schedule [{}]').format(current_process().name, s.name or s.id)) else: logger.info( _('{} created a task from schedule [{}]').format(current_process().name, s.name or s.id)) # default behavior is to delete a ONCE schedule if s.schedule_type == s.ONCE: if s.repeats < 0: s.delete() continue # but not if it has a positive repeats s.repeats = 0 # save the schedule s.save() except Exception as e: logger.error(e) def set_cpu_affinity(n, process_ids, actual=not Conf.TESTING): """ Sets the cpu affinity for the supplied processes. Requires the optional psutil module. :param int n: affinity :param list process_ids: a list of pids :param bool actual: Test workaround for Travis not supporting cpu affinity """ # check if we have the psutil module if not psutil: logger.warning('Skipping cpu affinity because psutil was not found.') return # check if the platform supports cpu_affinity if actual and not hasattr(psutil.Process(process_ids[0]), 'cpu_affinity'): logger.warning('Faking cpu affinity because it is not supported on this platform') actual = False # get the available processors cpu_list = list(range(psutil.cpu_count())) # affinities of 0 or gte cpu_count, equals to no affinity if not n or n >= len(cpu_list): return # spread the workers over the available processors. index = 0 for pid in process_ids: affinity = [] for k in range(n): if index == len(cpu_list): index = 0 affinity.append(cpu_list[index]) index += 1 if psutil.pid_exists(pid): p = psutil.Process(pid) if actual: p.cpu_affinity(affinity) logger.info(_('{} will use cpu {}').format(pid, affinity)) django-q-1.0.2/django_q/conf.py000066400000000000000000000154471352353655300163200ustar00rootroot00000000000000import logging from copy import deepcopy from signal import signal from multiprocessing import cpu_count # django from django.utils.translation import ugettext_lazy as _ from django.conf import settings # external import os import pkg_resources # local from django_q.queues import Queue # optional try: import psutil except ImportError: psutil = None class Conf(object): """ Configuration class """ try: conf = settings.Q_CLUSTER except AttributeError: conf = {} # Redis server configuration . Follows standard redis keywords REDIS = conf.get('redis', {}) # Support for Django-Redis connections DJANGO_REDIS = conf.get('django_redis', None) # Disque broker DISQUE_NODES = conf.get('disque_nodes', None) # Optional Authentication DISQUE_AUTH = conf.get('disque_auth', None) # Optional Fast acknowledge DISQUE_FASTACK = conf.get('disque_fastack', False) # IronMQ broker IRON_MQ = conf.get('iron_mq', None) # SQS broker SQS = conf.get('sqs', None) # ORM broker ORM = conf.get('orm', None) # Custom broker class BROKER_CLASS = conf.get('broker_class', None) # Database Poll POLL = conf.get('poll', 0.2) # MongoDB broker MONGO = conf.get('mongo', None) MONGO_DB = conf.get('mongo_db', None) # Name of the cluster or site. For when you run multiple sites on one redis server PREFIX = conf.get('name', 'default') # Log output level LOG_LEVEL = conf.get('log_level', 'INFO') # Maximum number of successful tasks kept in the database. 0 saves everything. -1 saves none # Failures are always saved SAVE_LIMIT = conf.get('save_limit', 250) # Guard loop sleep in seconds. Should be between 0 and 60 seconds. GUARD_CYCLE = conf.get('guard_cycle', 0.5) # Disable the scheduler SCHEDULER = conf.get('scheduler', True) # Number of workers in the pool. Default is cpu count if implemented, otherwise 4. WORKERS = conf.get('workers', False) if not WORKERS: try: WORKERS = cpu_count() # in rare cases this might fail except NotImplementedError: # try psutil if psutil: WORKERS = psutil.cpu_count() or 4 else: # sensible default WORKERS = 4 # Option to undaemonize the workers and allow them to spawn child processes DAEMONIZE_WORKERS = conf.get('daemonize_workers', True) # Maximum number of tasks that each cluster can work on QUEUE_LIMIT = conf.get('queue_limit', int(WORKERS) ** 2) # Sets compression of redis packages COMPRESSED = conf.get('compress', False) # Number of tasks each worker can handle before it gets recycled. Useful for releasing memory RECYCLE = conf.get('recycle', 500) # Number of seconds to wait for a worker to finish. TIMEOUT = conf.get('timeout', None) # Whether to acknowledge unsuccessful tasks. # This causes failed tasks to be considered delivered, thereby removing them from # the task queue. Defaults to False. ACK_FAILURES = conf.get('ack_failures', False) # Number of seconds to wait for acknowledgement before retrying a task # Only works with brokers that guarantee delivery. Defaults to 60 seconds. RETRY = conf.get('retry', 60) # Sets the amount of tasks the cluster will try to pop off the broker. # If it supports bulk gets. BULK = conf.get('bulk', 1) # The Django Admin label for this app LABEL = conf.get('label', 'Django Q') # Sets the number of processors for each worker, defaults to all. CPU_AFFINITY = conf.get('cpu_affinity', 0) # Global sync option to for debugging SYNC = conf.get('sync', False) # The Django cache to use CACHE = conf.get('cache', 'default') # Use the cache as result backend. Can be 'True' or an integer representing the global cache timeout. # i.e 'cached: 60' , will make all results go the cache and expire in 60 seconds. CACHED = conf.get('cached', False) # If set to False the scheduler won't execute tasks in the past. # Instead it will run once and reschedule the next run in the future. Defaults to True. CATCH_UP = conf.get('catch_up', True) # Use the secret key for package signing # Django itself should raise an error if it's not configured SECRET_KEY = settings.SECRET_KEY # The redis stats key Q_STAT = 'django_q:{}:cluster'.format(PREFIX) # Optional error reporting setup ERROR_REPORTER = conf.get('error_reporter', {}) # OSX doesn't implement qsize because of missing sem_getvalue() try: QSIZE = Queue().qsize() == 0 except NotImplementedError: QSIZE = False # Getting the signal names SIGNAL_NAMES = dict((getattr(signal, n), n) for n in dir(signal) if n.startswith('SIG') and '_' not in n) # Translators: Cluster status descriptions STARTING = _('Starting') WORKING = _('Working') IDLE = _("Idle") STOPPED = _('Stopped') STOPPING = _('Stopping') # to manage workarounds during testing TESTING = conf.get('testing', False) # logger logger = logging.getLogger('django-q') # Set up standard logging handler in case there is none if not logger.handlers: logger.setLevel(level=getattr(logging, Conf.LOG_LEVEL)) logger.propagate = False formatter = logging.Formatter(fmt='%(asctime)s [Q] %(levelname)s %(message)s', datefmt='%H:%M:%S') handler = logging.StreamHandler() handler.setFormatter(formatter) logger.addHandler(handler) # Error Reporting Interface class ErrorReporter(object): # initialize with iterator of reporters (better name, targets?) def __init__(self, reporters): self.targets = [target for target in reporters] # report error to all configured targets def report(self): for t in self.targets: t.report() # error reporting setup (sentry or rollbar) if Conf.ERROR_REPORTER: error_conf = deepcopy(Conf.ERROR_REPORTER) try: reporters = [] # iterate through the configured error reporters, # and instantiate an ErrorReporter using the provided config for name, conf in error_conf.items(): for entry in pkg_resources.iter_entry_points( 'djangoq.errorreporters', name): Reporter = entry.load() reporters.append(Reporter(**conf)) error_reporter = ErrorReporter(reporters) except ImportError: error_reporter = None else: error_reporter = None # get parent pid compatibility def get_ppid(): if hasattr(os, 'getppid'): return os.getppid() elif psutil: return psutil.Process(os.getpid()).ppid() else: raise OSError('Your OS does not support `os.getppid`. Please install `psutil` as an alternative provider.') django-q-1.0.2/django_q/core_signing.py000066400000000000000000000051541352353655300200330ustar00rootroot00000000000000from __future__ import unicode_literals import datetime import time import zlib from django.core.signing import BadSignature, SignatureExpired, b64_decode, JSONSerializer, \ Signer as Sgnr, TimestampSigner as TsS, dumps from django.utils import baseconv from django.utils.crypto import constant_time_compare from django.utils.encoding import force_bytes, force_str, force_text dumps = dumps """ The loads function is the same as the `django.core.signing.loads` function The difference is that `this` loads function calls `TimestampSigner` and `Signer` """ def loads(s, key=None, salt='django.core.signing', serializer=JSONSerializer, max_age=None): """ Reverse of dumps(), raise BadSignature if signature fails. The serializer is expected to accept a bytestring. """ # TimestampSigner.unsign() returns str but base64 and zlib compression # operate on bytes. base64d = force_bytes(TimestampSigner(key, salt=salt).unsign(s, max_age=max_age)) decompress = False if base64d[:1] == b'.': # It's compressed; uncompress it first base64d = base64d[1:] decompress = True data = b64_decode(base64d) if decompress: data = zlib.decompress(data) return serializer().loads(data) class Signer(Sgnr): def unsign(self, signed_value): # force_str is removed in Django 2.0 signed_value = force_str(signed_value) if self.sep not in signed_value: raise BadSignature('No "%s" found in value' % self.sep) value, sig = signed_value.rsplit(self.sep, 1) if constant_time_compare(sig, self.signature(value)): # force_text is removed in Django 2.0 return force_text(value) raise BadSignature('Signature "%s" does not match' % sig) """ TimestampSigner is also the same as `django.core.signing.TimestampSigner` but is calling `this` Signer. """ class TimestampSigner(Signer, TsS): def unsign(self, value, max_age=None): """ Retrieve original value and check it wasn't signed more than max_age seconds ago. """ result = super(TimestampSigner, self).unsign(value) value, timestamp = result.rsplit(self.sep, 1) timestamp = baseconv.base62.decode(timestamp) if max_age is not None: if isinstance(max_age, datetime.timedelta): max_age = max_age.total_seconds() # Check timestamp is not older than max_age age = time.time() - timestamp if age > max_age: raise SignatureExpired( 'Signature age %s > %s seconds' % (age, max_age)) return value django-q-1.0.2/django_q/humanhash.py000066400000000000000000000141531352353655300173400ustar00rootroot00000000000000""" humanhash: Human-readable representations of digests. The simplest ways to use this module are the :func:`humanize` and :func:`uuid` functions. For tighter control over the output, see :class:`HumanHasher`. """ from argparse import ArgumentError import operator import uuid as uuidlib from functools import reduce DEFAULT_WORDLIST = ( 'ack', 'alabama', 'alanine', 'alaska', 'alpha', 'angel', 'apart', 'april', 'arizona', 'arkansas', 'artist', 'asparagus', 'aspen', 'august', 'autumn', 'avocado', 'bacon', 'bakerloo', 'batman', 'beer', 'berlin', 'beryllium', 'black', 'blossom', 'blue', 'bluebird', 'bravo', 'bulldog', 'burger', 'butter', 'california', 'carbon', 'cardinal', 'carolina', 'carpet', 'cat', 'ceiling', 'charlie', 'chicken', 'coffee', 'cola', 'cold', 'colorado', 'comet', 'connecticut', 'crazy', 'cup', 'dakota', 'december', 'delaware', 'delta', 'diet', 'don', 'double', 'early', 'earth', 'east', 'echo', 'edward', 'eight', 'eighteen', 'eleven', 'emma', 'enemy', 'equal', 'failed', 'fanta', 'fifteen', 'fillet', 'finch', 'fish', 'five', 'fix', 'floor', 'florida', 'football', 'four', 'fourteen', 'foxtrot', 'freddie', 'friend', 'fruit', 'gee', 'georgia', 'glucose', 'golf', 'green', 'grey', 'hamper', 'happy', 'harry', 'hawaii', 'helium', 'high', 'hot', 'hotel', 'hydrogen', 'idaho', 'illinois', 'india', 'indigo', 'ink', 'iowa', 'island', 'item', 'jersey', 'jig', 'johnny', 'juliet', 'july', 'jupiter', 'kansas', 'kentucky', 'kilo', 'king', 'kitten', 'lactose', 'lake', 'lamp', 'lemon', 'leopard', 'lima', 'lion', 'lithium', 'london', 'louisiana', 'low', 'magazine', 'magnesium', 'maine', 'mango', 'march', 'mars', 'maryland', 'massachusetts', 'may', 'mexico', 'michigan', 'mike', 'minnesota', 'mirror', 'mississippi', 'missouri', 'mobile', 'mockingbird', 'monkey', 'montana', 'moon', 'mountain', 'muppet', 'music', 'nebraska', 'neptune', 'network', 'nevada', 'nine', 'nineteen', 'nitrogen', 'north', 'november', 'nuts', 'october', 'ohio', 'oklahoma', 'one', 'orange', 'oranges', 'oregon', 'oscar', 'oven', 'oxygen', 'papa', 'paris', 'pasta', 'pennsylvania', 'pip', 'pizza', 'pluto', 'potato', 'princess', 'purple', 'quebec', 'queen', 'quiet', 'red', 'river', 'robert', 'robin', 'romeo', 'rugby', 'sad', 'salami', 'saturn', 'september', 'seven', 'seventeen', 'shade', 'sierra', 'single', 'sink', 'six', 'sixteen', 'skylark', 'snake', 'social', 'sodium', 'solar', 'south', 'spaghetti', 'speaker', 'spring', 'stairway', 'steak', 'stream', 'summer', 'sweet', 'table', 'tango', 'ten', 'tennessee', 'tennis', 'texas', 'thirteen', 'three', 'timing', 'triple', 'twelve', 'twenty', 'two', 'uncle', 'undress', 'uniform', 'uranus', 'utah', 'vegan', 'venus', 'vermont', 'victor', 'video', 'violet', 'virginia', 'washington', 'west', 'whiskey', 'white', 'william', 'winner', 'winter', 'wisconsin', 'wolfram', 'wyoming', 'xray', 'yankee', 'yellow', 'zebra', 'zulu') class HumanHasher(object): """ Transforms hex digests to human-readable strings. The format of these strings will look something like: `victor-bacon-zulu-lima`. The output is obtained by compressing the input digest to a fixed number of bytes, then mapping those bytes to one of 256 words. A default wordlist is provided, but you can override this if you prefer. As long as you use the same wordlist, the output will be consistent (i.e. the same digest will always render the same representation). """ def __init__(self, wordlist=DEFAULT_WORDLIST): if len(wordlist) != 256: raise ArgumentError("Wordlist must have exactly 256 items") self.wordlist = wordlist def humanize(self, hexdigest, words=4, separator='-'): """ Humanize a given hexadecimal digest. Change the number of words output by specifying `words`. Change the word separator with `separator`. >>> digest = '60ad8d0d871b6095808297' >>> HumanHasher().humanize(digest) 'sodium-magnesium-nineteen-hydrogen' """ # Gets a list of byte values between 0-255. bytes = [int(x, 16) for x in list(map(''.join, list(zip(hexdigest[::2], hexdigest[1::2]))))] # Compress an arbitrary number of bytes to `words`. compressed = self.compress(bytes, words) # Map the compressed byte values through the word list. return separator.join(self.wordlist[byte] for byte in compressed) @staticmethod def compress(bytes, target): """ Compress a list of byte values to a fixed target length. >>> bytes = [96, 173, 141, 13, 135, 27, 96, 149, 128, 130, 151] >>> HumanHasher.compress(bytes, 4) [205, 128, 156, 96] Attempting to compress a smaller number of bytes to a larger number is an error: >>> HumanHasher.compress(bytes, 15) # doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: Fewer input bytes than requested output """ length = len(bytes) if target > length: raise ValueError("Fewer input bytes than requested output") # Split `bytes` into `target` segments. seg_size = length // target segments = [bytes[i * seg_size:(i + 1) * seg_size] for i in range(target)] # Catch any left-over bytes in the last segment. segments[-1].extend(bytes[target * seg_size:]) # Use a simple XOR checksum-like function for compression. checksum = lambda bytes: reduce(operator.xor, bytes, 0) checksums = list(map(checksum, segments)) return checksums def uuid(self, **params): """ Generate a UUID with a human-readable representation. Returns `(human_repr, full_digest)`. Accepts the same keyword arguments as :meth:`humanize` (they'll be passed straight through). """ digest = str(uuidlib.uuid4()).replace('-', '') return self.humanize(digest, **params), digest DEFAULT_HASHER = HumanHasher() uuid = DEFAULT_HASHER.uuid humanize = DEFAULT_HASHER.humanize django-q-1.0.2/django_q/locale/000077500000000000000000000000001352353655300162455ustar00rootroot00000000000000django-q-1.0.2/django_q/locale/fr/000077500000000000000000000000001352353655300166545ustar00rootroot00000000000000django-q-1.0.2/django_q/locale/fr/LC_MESSAGES/000077500000000000000000000000001352353655300204415ustar00rootroot00000000000000django-q-1.0.2/django_q/locale/fr/LC_MESSAGES/django.mo000066400000000000000000000144051352353655300222440ustar00rootroot00000000000000Þ•UÄql01DMV\ m y†&¶»ÂÅÊÒîö&ÿ&+0?Yo† § ® ºÇÊÍÕ Þ ÿ  , 6 ? Z ` h q y ƒ “ ¤ § ° ³ º  Ê Ñ ã ç ù  # = D ^ o *‚ )­ "× $ú ( H $O -t ¢ ³ Í á ô  # 9 W p Ž ª ô½ ² ÃÏ ×áñ /"RXj mx€ ¨)½çðø #*Nj‚›­Æàã æ ð<þ;Rdx ‡’°·ÀÔÜäô   &06=Z_%tš( ÉÐé55O'…B­8ð)11@c¤ ½Þô+J(d""°ÓîN=3AG#I6,)B>E &H:+RL;2 !PDU-%F8.S$M@75 1 K0?C9TJ<Q"*'/ 4( O-- {} {} on {} --Avg timeClustersDailyFailed [{}] - {}Failed taskFailed tasksFailuresGeneral information over all clusters.HostHourlyIdIdleMinutesMonitors Q Cluster activityMonthlyNext RunNumber of minutes for the Minutes typeOncePoolProcessed [{}]Q Cluster-{} has stopped.Q Cluster-{} running.Q Cluster-{} starting.Q Cluster-{} stopping.QuarterlyQueuedQueued taskQueued tasksRCRQRepeatsRestartsResubmit selected tasks to queueSchedule TypeScheduled taskScheduled tasksSchedulesStartingStarts a Django Q Cluster.StateStoppedStoppingSuccessSuccessesSuccessful taskSuccessful tasksTQTasks/{}UpWeeklyWorkersWorkingYearly[Press q to quit]daye.g. 1, 2, 'John'e.g. x=1, y=2, name='John'hourmalformed return hook '{}' for [{}]minuten = n times, -1 = foreverqueueing from {}recycled worker {}reincarnated monitor {} after sudden deathreincarnated pusher {} after sudden deathreincarnated worker {} after deathreincarnated worker {} after timeoutreturn hook {} failed on [{}] because {}second{} created a task from schedule [{}]{} failed to create a task from schedule [{}]{} got signal {}{} guarding cluster at {}{} monitoring at {}{} processing [{}]{} pushing tasks at {}{} ready for work at {}{} stopped doing work{} stopped monitoring results{} stopped pushing tasks{} stopping cluster processes{} waiting for the monitor.{} will use cpu {}Project-Id-Version: POT-Creation-Date: 2018-08-05 15:48+0200 PO-Revision-Date: 2018-08-05 18:28+0200 Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 2.1.1 X-Poedit-Basepath: ../.. Plural-Forms: nplurals=2; plural=(n > 1); Last-Translator: Thierry BOULOGNE Language: fr X-Poedit-SearchPath-0: brokers/redis_broker.py X-Poedit-SearchPath-1: brokers/orm.py X-Poedit-SearchPath-2: brokers/mongo.py X-Poedit-SearchPath-3: brokers/ironmq.py X-Poedit-SearchPath-4: brokers/disque.py X-Poedit-SearchPath-5: brokers/aws_sqs.py X-Poedit-SearchPath-6: management/commands/qmonitor.py X-Poedit-SearchPath-7: management/commands/qinfo.py X-Poedit-SearchPath-8: management/commands/qcluster.py X-Poedit-SearchPath-9: tasks.py X-Poedit-SearchPath-10: status.py X-Poedit-SearchPath-11: signing.py X-Poedit-SearchPath-12: signals.py X-Poedit-SearchPath-13: queues.py X-Poedit-SearchPath-14: monitor.py X-Poedit-SearchPath-15: models.py X-Poedit-SearchPath-16: humanhash.py X-Poedit-SearchPath-17: core_signing.py X-Poedit-SearchPath-18: conf.py X-Poedit-SearchPath-19: compat.py X-Poedit-SearchPath-20: cluster.py X-Poedit-SearchPath-21: apps.py X-Poedit-SearchPath-22: admin.py --{} {} sur {}--Temps MoyenGrappesQuotidienEchec [{}] - {}Tâche échouéTâches échouéesDéfaillancesInformations générales sur tous les clusters.HôteToutes les heuresIdEn attenteMinutesActivité du cluster Moniteur QMensuelProchaine exécutionNombre de minutes pour le type de minutesUne foisPiscineTraitement de [{}]Q Cluster-{} a été arrêté.Q Cluster-{} en cours d'exécution.Démarrage de Q Cluster-{}.Arrêt de Q Cluster-{}.Tous les quart-d’heureEn file d'attenteTâche en file d'attenteTâches en file d'attenteRCRQRépéterRedémarragesResoumettre les tâches sélectionnées à la file d'attenteType de plannificationTâche planifiéeTâches planifiéesPlanificationsDémarrageDémarre un cluster Django Q.StatutArrêtéEn cours d’arrêtSuccèsSuccèsTâche réussieTâches réussiesTQTâches/{}HautHebdomadaireProcessusActifAnnuel[appuyez sur q pour quitter]jourex. 1, 2, ‘Jean’p. ex. x = 1, y = 2, Nom = ‘Jean’heurehook de retour mal formé' {} 'pour [{}]minuten = n fois,-1 = Toujoursmise en file d'attente de {}processus recyclémoniteur réintégré {} après un arrêt intempestifpousseur réintégré {} après un arrêt intempestifprocessus réintégré {} après arrêtprocessus réintégré {} après un arrêt une attente trop longuele crochet de retour {} a échoué sur [{}] parce que {}seconde{} a créé une tâche à partir de Schedule [{}]{} Echec de la création d'une tâche à partir de Schedule [{}]{} à reçu le signal {}{} surveillance du cluster à {}{} Surveillance de {}{} en cours de traitement [{}]{} tâche envoyé à {}{} prêt pour le travail à {}{} arrêté de travailler{} arrêt des résultats de surveillance{} a cessé de pousser les tâches{} arrêt des processus de cluster{} en attente du moniteur.{} utilisera le CPU {}django-q-1.0.2/django_q/locale/fr/LC_MESSAGES/django.po000066400000000000000000000155031352353655300222470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-08-05 15:48+0200\n" "PO-Revision-Date: 2018-08-05 18:28+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.1.1\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "Last-Translator: Thierry BOULOGNE \n" "Language: fr-FR\n" #: admin.py:48 msgid "Resubmit selected tasks to queue" msgstr "Resoumettre les tâches sélectionnées à la file d'attente" #: cluster.py:54 msgid "Q Cluster-{} starting." msgstr "Démarrage de Q Cluster-{}." #: cluster.py:62 msgid "Q Cluster-{} stopping." msgstr "Arrêt de Q Cluster-{}." #: cluster.py:65 msgid "Q Cluster-{} has stopped." msgstr "Q Cluster-{} a été arrêté." #: cluster.py:71 msgid "{} got signal {}" msgstr "{} à reçu le signal {}" #: cluster.py:169 msgid "reincarnated monitor {} after sudden death" msgstr "moniteur réintégré {} après un arrêt intempestif" #: cluster.py:172 msgid "reincarnated pusher {} after sudden death" msgstr "pousseur réintégré {} après un arrêt intempestif" #: cluster.py:179 msgid "reincarnated worker {} after timeout" msgstr "processus réintégré {} après un arrêt une attente trop longue" #: cluster.py:181 msgid "recycled worker {}" msgstr "processus recyclé" #: cluster.py:183 msgid "reincarnated worker {} after death" msgstr "processus réintégré {} après arrêt" #: cluster.py:202 msgid "{} guarding cluster at {}" msgstr "{} surveillance du cluster à {}" #: cluster.py:205 msgid "Q Cluster-{} running." msgstr "Q Cluster-{} en cours d'exécution." #: cluster.py:239 msgid "{} stopping cluster processes" msgstr "{} arrêt des processus de cluster" #: cluster.py:264 msgid "{} waiting for the monitor." msgstr "{} en attente du moniteur." #: cluster.py:285 msgid "{} pushing tasks at {}" msgstr "{} tâche envoyé à {}" #: cluster.py:306 msgid "queueing from {}" msgstr "mise en file d'attente de {}" #: cluster.py:309 msgid "{} stopped pushing tasks" msgstr "{} a cessé de pousser les tâches" #: cluster.py:320 msgid "{} monitoring at {}" msgstr "{} Surveillance de {}" #: cluster.py:334 msgid "Processed [{}]" msgstr "Traitement de [{}]" #: cluster.py:337 msgid "Failed [{}] - {}" msgstr "Echec [{}] - {}" #: cluster.py:338 msgid "{} stopped monitoring results" msgstr "{} arrêt des résultats de surveillance" #: cluster.py:349 msgid "{} ready for work at {}" msgstr "{} prêt pour le travail à {}" #: cluster.py:357 msgid "{} processing [{}]" msgstr "{} en cours de traitement [{}]" #: cluster.py:398 msgid "{} stopped doing work" msgstr "{} arrêté de travailler" #: cluster.py:543 msgid "{} failed to create a task from schedule [{}]" msgstr "{} Echec de la création d'une tâche à partir de Schedule [{}]" #: cluster.py:547 msgid "{} created a task from schedule [{}]" msgstr "{} a créé une tâche à partir de Schedule [{}]" #: cluster.py:595 msgid "{} will use cpu {}" msgstr "{} utilisera le CPU {}" #: conf.py:169 msgid "Starting" msgstr "Démarrage" #: conf.py:170 msgid "Working" msgstr "Actif" #: conf.py:171 msgid "Idle" msgstr "En attente" #: conf.py:172 msgid "Stopped" msgstr "Arrêté" #: conf.py:173 msgid "Stopping" msgstr "En cours d’arrêt" #: management/commands/qcluster.py:9 msgid "Starts a Django Q Cluster." msgstr "Démarre un cluster Django Q." #: management/commands/qinfo.py:11 msgid "General information over all clusters." msgstr "Informations générales sur tous les clusters." #: management/commands/qmonitor.py:9 msgid "Monitors Q Cluster activity" msgstr "Activité du cluster Moniteur Q" #: models.py:104 msgid "Successful task" msgstr "Tâche réussie" #: models.py:105 msgid "Successful tasks" msgstr "Tâches réussies" #: models.py:121 msgid "Failed task" msgstr "Tâche échoué" #: models.py:122 msgid "Failed tasks" msgstr "Tâches échouées" #: models.py:131 msgid "e.g. 1, 2, 'John'" msgstr "ex. 1, 2, ‘Jean’" #: models.py:132 msgid "e.g. x=1, y=2, name='John'" msgstr "p. ex. x = 1, y = 2, Nom = ‘Jean’" #: models.py:142 msgid "Once" msgstr "Une fois" #: models.py:143 msgid "Minutes" msgstr "Minutes" #: models.py:144 msgid "Hourly" msgstr "Toutes les heures" #: models.py:145 msgid "Daily" msgstr "Quotidien" #: models.py:146 msgid "Weekly" msgstr "Hebdomadaire" #: models.py:147 msgid "Monthly" msgstr "Mensuel" #: models.py:148 msgid "Quarterly" msgstr "Tous les quart-d’heure" #: models.py:149 msgid "Yearly" msgstr "Annuel" #: models.py:151 msgid "Schedule Type" msgstr "Type de plannification" #: models.py:153 msgid "Number of minutes for the Minutes type" msgstr "Nombre de minutes pour le type de minutes" #: models.py:154 msgid "Repeats" msgstr "Répéter" #: models.py:154 msgid "n = n times, -1 = forever" msgstr "n = n fois,-1 = Toujours" #: models.py:155 msgid "Next Run" msgstr "Prochaine exécution" #: models.py:180 msgid "Scheduled task" msgstr "Tâche planifiée" #: models.py:181 msgid "Scheduled tasks" msgstr "Tâches planifiées" #: models.py:204 msgid "Queued task" msgstr "Tâche en file d'attente" #: models.py:205 msgid "Queued tasks" msgstr "Tâches en file d'attente" #: monitor.py:33 msgid "Host" msgstr "Hôte" #: monitor.py:34 msgid "Id" msgstr "Id" #: monitor.py:35 msgid "State" msgstr "Statut" #: monitor.py:36 msgid "Pool" msgstr "Piscine" #: monitor.py:37 msgid "TQ" msgstr "TQ" #: monitor.py:38 msgid "RQ" msgstr "RQ" #: monitor.py:39 msgid "RC" msgstr "RC" #: monitor.py:40 msgid "Up" msgstr "Haut" #: monitor.py:90 monitor.py:165 msgid "Queued" msgstr "En file d'attente" #: monitor.py:92 msgid "Success" msgstr "Succès" #: monitor.py:95 monitor.py:173 msgid "Failures" msgstr "Défaillances" #: monitor.py:101 msgid "[Press q to quit]" msgstr "[appuyez sur q pour quitter]" #: monitor.py:120 msgid "day" msgstr "jour" #: monitor.py:137 msgid "second" msgstr "seconde" #: monitor.py:140 msgid "minute" msgstr "minute" #: monitor.py:143 msgid "hour" msgstr "heure" #: monitor.py:151 msgid "-- {} {} on {} --" msgstr "--{} {} sur {}--" #: monitor.py:153 msgid "Clusters" msgstr "Grappes" #: monitor.py:157 msgid "Workers" msgstr "Processus" #: monitor.py:161 msgid "Restarts" msgstr "Redémarrages" #: monitor.py:169 msgid "Successes" msgstr "Succès" #: monitor.py:177 msgid "Schedules" msgstr "Planifications" #: monitor.py:181 msgid "Tasks/{}" msgstr "Tâches/{}" #: monitor.py:185 msgid "Avg time" msgstr "Temps Moyen" #: signals.py:21 msgid "malformed return hook '{}' for [{}]" msgstr "hook de retour mal formé' {} 'pour [{}]" #: signals.py:26 msgid "return hook {} failed on [{}] because {}" msgstr "le crochet de retour {} a échoué sur [{}] parce que {}" django-q-1.0.2/django_q/management/000077500000000000000000000000001352353655300171225ustar00rootroot00000000000000django-q-1.0.2/django_q/management/__init__.py000066400000000000000000000000001352353655300212210ustar00rootroot00000000000000django-q-1.0.2/django_q/management/commands/000077500000000000000000000000001352353655300207235ustar00rootroot00000000000000django-q-1.0.2/django_q/management/commands/__init__.py000066400000000000000000000000001352353655300230220ustar00rootroot00000000000000django-q-1.0.2/django_q/management/commands/qcluster.py000066400000000000000000000012201352353655300231320ustar00rootroot00000000000000from django.core.management.base import BaseCommand from django.utils.translation import ugettext as _ from django_q.cluster import Cluster class Command(BaseCommand): # Translators: help text for qcluster management command help = _("Starts a Django Q Cluster.") def add_arguments(self, parser): parser.add_argument( '--run-once', action='store_true', dest='run_once', default=False, help='Run once and then stop.', ) def handle(self, *args, **options): q = Cluster() q.start() if options.get('run_once', False): q.stop() django-q-1.0.2/django_q/management/commands/qinfo.py000066400000000000000000000026241352353655300224150ustar00rootroot00000000000000from django.core.management.base import BaseCommand from django.utils.translation import ugettext as _ from django_q import VERSION from django_q.conf import Conf from django_q.monitor import info, get_ids class Command(BaseCommand): # Translators: help text for qinfo management command help = _('General information over all clusters.') def add_arguments(self, parser): parser.add_argument( '--config', action='store_true', dest='config', default=False, help='Print current configuration.', ) parser.add_argument( '--ids', action='store_true', dest='ids', default=False, help='Print cluster task ID(s) (PIDs).', ) def handle(self, *args, **options): if options.get('ids', True): get_ids() elif options.get('config', False): hide = ['conf', 'IDLE', 'STOPPING', 'STARTING', 'WORKING', 'SIGNAL_NAMES', 'STOPPED'] settings = [a for a in dir(Conf) if not a.startswith('__') and a not in hide] self.stdout.write('VERSION: {}'.format('.'.join(str(v) for v in VERSION))) for setting in settings: value = getattr(Conf, setting) if value is not None: self.stdout.write('{}: {}'.format(setting, value)) else: info() django-q-1.0.2/django_q/management/commands/qmonitor.py000066400000000000000000000011421352353655300231430ustar00rootroot00000000000000from django.core.management.base import BaseCommand from django.utils.translation import ugettext as _ from django_q.monitor import monitor class Command(BaseCommand): # Translators: help text for qmonitor management command help = _("Monitors Q Cluster activity") def add_arguments(self, parser): parser.add_argument( '--run-once', action='store_true', dest='run_once', default=False, help='Run once and then stop.', ) def handle(self, *args, **options): monitor(run_once=options.get('run_once', False)) django-q-1.0.2/django_q/migrations/000077500000000000000000000000001352353655300171625ustar00rootroot00000000000000django-q-1.0.2/django_q/migrations/0001_initial.py000066400000000000000000000060351352353655300216310ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models, migrations import picklefield.fields import django.utils.timezone class Migration(migrations.Migration): dependencies = [ ] operations = [ migrations.CreateModel( name='Schedule', fields=[ ('id', models.AutoField(verbose_name='ID', auto_created=True, serialize=False, primary_key=True)), ('func', models.CharField(max_length=256, help_text='e.g. module.tasks.function')), ('hook', models.CharField(null=True, blank=True, max_length=256, help_text='e.g. module.tasks.result_function')), ('args', models.CharField(null=True, blank=True, max_length=256, help_text="e.g. 1, 2, 'John'")), ('kwargs', models.CharField(null=True, blank=True, max_length=256, help_text="e.g. x=1, y=2, name='John'")), ('schedule_type', models.CharField(verbose_name='Schedule Type', choices=[('O', 'Once'), ('H', 'Hourly'), ('D', 'Daily'), ('W', 'Weekly'), ('M', 'Monthly'), ('Q', 'Quarterly'), ('Y', 'Yearly')], default='O', max_length=1)), ('repeats', models.SmallIntegerField(verbose_name='Repeats', default=-1, help_text='n = n times, -1 = forever')), ('next_run', models.DateTimeField(verbose_name='Next Run', default=django.utils.timezone.now, null=True)), ('task', models.CharField(editable=False, null=True, max_length=100)), ], options={ 'verbose_name': 'Scheduled task', 'ordering': ['next_run'], }, ), migrations.CreateModel( name='Task', fields=[ ('id', models.AutoField(verbose_name='ID', auto_created=True, serialize=False, primary_key=True)), ('name', models.CharField(editable=False, max_length=100)), ('func', models.CharField(max_length=256)), ('hook', models.CharField(null=True, max_length=256)), ('args', picklefield.fields.PickledObjectField(editable=False, null=True)), ('kwargs', picklefield.fields.PickledObjectField(editable=False, null=True)), ('result', picklefield.fields.PickledObjectField(editable=False, null=True)), ('started', models.DateTimeField(editable=False)), ('stopped', models.DateTimeField(editable=False)), ('success', models.BooleanField(editable=False, default=True)), ], ), migrations.CreateModel( name='Failure', fields=[ ], options={ 'verbose_name': 'Failed task', 'proxy': True, }, bases=('django_q.task',), ), migrations.CreateModel( name='Success', fields=[ ], options={ 'verbose_name': 'Successful task', 'proxy': True, }, bases=('django_q.task',), ), ] django-q-1.0.2/django_q/migrations/0002_auto_20150630_1624.py000066400000000000000000000011721352353655300226020ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ ('django_q', '0001_initial'), ] operations = [ migrations.AlterField( model_name='schedule', name='args', field=models.TextField(help_text="e.g. 1, 2, 'John'", blank=True, null=True), ), migrations.AlterField( model_name='schedule', name='kwargs', field=models.TextField(help_text="e.g. x=1, y=2, name='John'", blank=True, null=True), ), ] django-q-1.0.2/django_q/migrations/0003_auto_20150708_1326.py000066400000000000000000000021031352353655300226030ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ ('django_q', '0002_auto_20150630_1624'), ] operations = [ migrations.AlterModelOptions( name='failure', options={'verbose_name_plural': 'Failed tasks', 'verbose_name': 'Failed task'}, ), migrations.AlterModelOptions( name='schedule', options={'verbose_name_plural': 'Scheduled tasks', 'ordering': ['next_run'], 'verbose_name': 'Scheduled task'}, ), migrations.AlterModelOptions( name='success', options={'verbose_name_plural': 'Successful tasks', 'verbose_name': 'Successful task'}, ), migrations.RemoveField( model_name='task', name='id', ), migrations.AddField( model_name='task', name='id', field=models.CharField(max_length=32, primary_key=True, editable=False, serialize=False), ), ] django-q-1.0.2/django_q/migrations/0004_auto_20150710_1043.py000066400000000000000000000014021352353655300225720ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ ('django_q', '0003_auto_20150708_1326'), ] operations = [ migrations.AlterModelOptions( name='failure', options={'verbose_name_plural': 'Failed tasks', 'verbose_name': 'Failed task', 'ordering': ['-stopped']}, ), migrations.AlterModelOptions( name='success', options={'verbose_name_plural': 'Successful tasks', 'verbose_name': 'Successful task', 'ordering': ['-stopped']}, ), migrations.AlterModelOptions( name='task', options={'ordering': ['-stopped']}, ), ] django-q-1.0.2/django_q/migrations/0005_auto_20150718_1506.py000066400000000000000000000011151352353655300226100ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ ('django_q', '0004_auto_20150710_1043'), ] operations = [ migrations.AddField( model_name='schedule', name='name', field=models.CharField(max_length=100, null=True), ), migrations.AddField( model_name='task', name='group', field=models.CharField(max_length=100, null=True, editable=False), ), ] django-q-1.0.2/django_q/migrations/0006_auto_20150805_1817.py000066400000000000000000000015001352353655300226110ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ ('django_q', '0005_auto_20150718_1506'), ] operations = [ migrations.AddField( model_name='schedule', name='minutes', field=models.PositiveSmallIntegerField(help_text='Number of minutes for the Minutes type', blank=True, null=True), ), migrations.AlterField( model_name='schedule', name='schedule_type', field=models.CharField(max_length=1, choices=[('O', 'Once'), ('I', 'Minutes'), ('H', 'Hourly'), ('D', 'Daily'), ('W', 'Weekly'), ('M', 'Monthly'), ('Q', 'Quarterly'), ('Y', 'Yearly')], default='O', verbose_name='Schedule Type'), ), ] django-q-1.0.2/django_q/migrations/0007_ormq.py000066400000000000000000000014071352353655300211620ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models, migrations class Migration(migrations.Migration): dependencies = [ ('django_q', '0006_auto_20150805_1817'), ] operations = [ migrations.CreateModel( name='OrmQ', fields=[ ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)), ('key', models.CharField(max_length=100)), ('payload', models.TextField()), ('lock', models.DateTimeField(null=True)), ], options={ 'verbose_name_plural': 'Queued tasks', 'verbose_name': 'Queued task', }, ), ] django-q-1.0.2/django_q/migrations/0008_auto_20160224_1026.py000066400000000000000000000006351352353655300226070ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('django_q', '0007_ormq'), ] operations = [ migrations.AlterField( model_name='schedule', name='name', field=models.CharField(blank=True, max_length=100, null=True), ), ] django-q-1.0.2/django_q/migrations/0009_auto_20171009_0915.py000066400000000000000000000007251352353655300226210ustar00rootroot00000000000000# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('django_q', '0008_auto_20160224_1026'), ] operations = [ migrations.AlterField( model_name='schedule', name='repeats', field=models.IntegerField(default=-1, help_text='n = n times, -1 = forever', verbose_name='Repeats'), ), ] django-q-1.0.2/django_q/migrations/__init__.py000066400000000000000000000000001352353655300212610ustar00rootroot00000000000000django-q-1.0.2/django_q/models.py000066400000000000000000000161071352353655300166500ustar00rootroot00000000000000from django import get_version from django.template.defaultfilters import truncatechars from django.urls import reverse from django.utils.html import format_html from django.utils.translation import ugettext_lazy as _ from django.db import models from django.utils import timezone from picklefield import PickledObjectField from picklefield.fields import dbsafe_decode from django_q.signing import SignedPackage class Task(models.Model): id = models.CharField(max_length=32, primary_key=True, editable=False) name = models.CharField(max_length=100, editable=False) func = models.CharField(max_length=256) hook = models.CharField(max_length=256, null=True) args = PickledObjectField(null=True, protocol=-1) kwargs = PickledObjectField(null=True, protocol=-1) result = PickledObjectField(null=True, protocol=-1) group = models.CharField(max_length=100, editable=False, null=True) started = models.DateTimeField(editable=False) stopped = models.DateTimeField(editable=False) success = models.BooleanField(default=True, editable=False) @staticmethod def get_result(task_id): if len(task_id) == 32 and Task.objects.filter(id=task_id).exists(): return Task.objects.get(id=task_id).result elif Task.objects.filter(name=task_id).exists(): return Task.objects.get(name=task_id).result @staticmethod def get_result_group(group_id, failures=False): if failures: values = Task.objects.filter(group=group_id).values_list('result', flat=True) else: values = Task.objects.filter(group=group_id).exclude(success=False).values_list('result', flat=True) return decode_results(values) def group_result(self, failures=False): if self.group: return self.get_result_group(self.group, failures) @staticmethod def get_group_count(group_id, failures=False): if failures: return Failure.objects.filter(group=group_id).count() return Task.objects.filter(group=group_id).count() def group_count(self, failures=False): if self.group: return self.get_group_count(self.group, failures) @staticmethod def delete_group(group_id, objects=False): group = Task.objects.filter(group=group_id) if objects: return group.delete() return group.update(group=None) def group_delete(self, tasks=False): if self.group: return self.delete_group(self.group, tasks) @staticmethod def get_task(task_id): if len(task_id) == 32 and Task.objects.filter(id=task_id).exists(): return Task.objects.get(id=task_id) elif Task.objects.filter(name=task_id).exists(): return Task.objects.get(name=task_id) @staticmethod def get_task_group(group_id, failures=True): if failures: return Task.objects.filter(group=group_id) return Task.objects.filter(group=group_id).exclude(success=False) def time_taken(self): return (self.stopped - self.started).total_seconds() @property def short_result(self): return truncatechars(self.result, 100) def __unicode__(self): return u'{}'.format(self.name or self.id) class Meta: app_label = 'django_q' ordering = ['-stopped'] class SuccessManager(models.Manager): def get_queryset(self): return super(SuccessManager, self).get_queryset().filter( success=True) class Success(Task): objects = SuccessManager() class Meta: app_label = 'django_q' verbose_name = _('Successful task') verbose_name_plural = _('Successful tasks') ordering = ['-stopped'] proxy = True class FailureManager(models.Manager): def get_queryset(self): return super(FailureManager, self).get_queryset().filter( success=False) class Failure(Task): objects = FailureManager() class Meta: app_label = 'django_q' verbose_name = _('Failed task') verbose_name_plural = _('Failed tasks') ordering = ['-stopped'] proxy = True class Schedule(models.Model): name = models.CharField(max_length=100, null=True, blank=True) func = models.CharField(max_length=256, help_text='e.g. module.tasks.function') hook = models.CharField(max_length=256, null=True, blank=True, help_text='e.g. module.tasks.result_function') args = models.TextField(null=True, blank=True, help_text=_("e.g. 1, 2, 'John'")) kwargs = models.TextField(null=True, blank=True, help_text=_("e.g. x=1, y=2, name='John'")) ONCE = 'O' MINUTES = 'I' HOURLY = 'H' DAILY = 'D' WEEKLY = 'W' MONTHLY = 'M' QUARTERLY = 'Q' YEARLY = 'Y' TYPE = ( (ONCE, _('Once')), (MINUTES, _('Minutes')), (HOURLY, _('Hourly')), (DAILY, _('Daily')), (WEEKLY, _('Weekly')), (MONTHLY, _('Monthly')), (QUARTERLY, _('Quarterly')), (YEARLY, _('Yearly')), ) schedule_type = models.CharField(max_length=1, choices=TYPE, default=TYPE[0][0], verbose_name=_('Schedule Type')) minutes = models.PositiveSmallIntegerField(null=True, blank=True, help_text=_('Number of minutes for the Minutes type')) repeats = models.IntegerField(default=-1, verbose_name=_('Repeats'), help_text=_('n = n times, -1 = forever')) next_run = models.DateTimeField(verbose_name=_('Next Run'), default=timezone.now, null=True) task = models.CharField(max_length=100, null=True, editable=False) def success(self): if self.task and Task.objects.filter(id=self.task): return Task.objects.get(id=self.task).success def last_run(self): if self.task and Task.objects.filter(id=self.task): task = Task.objects.get(id=self.task) if task.success: url = reverse('admin:django_q_success_change', args=(task.id,)) else: url = reverse('admin:django_q_failure_change', args=(task.id,)) return format_html('[{}]'.format(url, task.name)) return None def __unicode__(self): return self.func success.boolean = True last_run.allow_tags = True class Meta: app_label = 'django_q' verbose_name = _('Scheduled task') verbose_name_plural = _('Scheduled tasks') ordering = ['next_run'] class OrmQ(models.Model): key = models.CharField(max_length=100) payload = models.TextField() lock = models.DateTimeField(null=True) def task(self): return SignedPackage.loads(self.payload) def func(self): return self.task()['func'] def task_id(self): return self.task()['id'] def name(self): return self.task()['name'] class Meta: app_label = 'django_q' verbose_name = _('Queued task') verbose_name_plural = _('Queued tasks') # Backwards compatibility for Django 1.7 def decode_results(values): if get_version().split('.')[1] == '7': # decode values in 1.7 return [dbsafe_decode(v) for v in values] return values django-q-1.0.2/django_q/monitor.py000066400000000000000000000213411352353655300170500ustar00rootroot00000000000000from datetime import timedelta # external from blessed import Terminal # django from django.db import connection from django.db.models import Sum, F from django.utils import timezone from django.utils.translation import ugettext as _ # local from django_q.conf import Conf from django_q.status import Stat from django_q.brokers import get_broker from django_q import models, VERSION def monitor(run_once=False, broker=None): if not broker: broker = get_broker() term = Terminal() broker.ping() with term.fullscreen(), term.hidden_cursor(), term.cbreak(): val = None start_width = int(term.width / 8) while val not in (u'q', u'Q',): col_width = int(term.width / 8) # In case of resize if col_width != start_width: print(term.clear()) start_width = col_width print(term.move(0, 0) + term.black_on_green(term.center(_('Host'), width=col_width - 1))) print(term.move(0, 1 * col_width) + term.black_on_green(term.center(_('Id'), width=col_width - 1))) print(term.move(0, 2 * col_width) + term.black_on_green(term.center(_('State'), width=col_width - 1))) print(term.move(0, 3 * col_width) + term.black_on_green(term.center(_('Pool'), width=col_width - 1))) print(term.move(0, 4 * col_width) + term.black_on_green(term.center(_('TQ'), width=col_width - 1))) print(term.move(0, 5 * col_width) + term.black_on_green(term.center(_('RQ'), width=col_width - 1))) print(term.move(0, 6 * col_width) + term.black_on_green(term.center(_('RC'), width=col_width - 1))) print(term.move(0, 7 * col_width) + term.black_on_green(term.center(_('Up'), width=col_width - 1))) i = 2 stats = Stat.get_all(broker=broker) print(term.clear_eos()) for stat in stats: status = stat.status # color status if stat.status == Conf.WORKING: status = term.green(str(Conf.WORKING)) elif stat.status == Conf.STOPPING: status = term.yellow(str(Conf.STOPPING)) elif stat.status == Conf.STOPPED: status = term.red(str(Conf.STOPPED)) elif stat.status == Conf.IDLE: status = str(Conf.IDLE) # color q's tasks = str(stat.task_q_size) if stat.task_q_size > 0: tasks = term.cyan(str(stat.task_q_size)) if Conf.QUEUE_LIMIT and stat.task_q_size == Conf.QUEUE_LIMIT: tasks = term.green(str(stat.task_q_size)) results = stat.done_q_size if results > 0: results = term.cyan(str(results)) # color workers workers = len(stat.workers) if workers < Conf.WORKERS: workers = term.yellow(str(workers)) # format uptime uptime = (timezone.now() - stat.tob).total_seconds() hours, remainder = divmod(uptime, 3600) minutes, seconds = divmod(remainder, 60) uptime = '%d:%02d:%02d' % (hours, minutes, seconds) # print to the terminal print(term.move(i, 0) + term.center(stat.host[:col_width - 1], width=col_width - 1)) print(term.move(i, 1 * col_width) + term.center(stat.cluster_id, width=col_width - 1)) print(term.move(i, 2 * col_width) + term.center(status, width=col_width - 1)) print(term.move(i, 3 * col_width) + term.center(workers, width=col_width - 1)) print(term.move(i, 4 * col_width) + term.center(tasks, width=col_width - 1)) print(term.move(i, 5 * col_width) + term.center(results, width=col_width - 1)) print(term.move(i, 6 * col_width) + term.center(stat.reincarnations, width=col_width - 1)) print(term.move(i, 7 * col_width) + term.center(uptime, width=col_width - 1)) i += 1 # bottom bar i += 1 queue_size = broker.queue_size() lock_size = broker.lock_size() if lock_size: queue_size = '{}({})'.format(queue_size, lock_size) print(term.move(i, 0) + term.white_on_cyan(term.center(broker.info(), width=col_width * 2))) print(term.move(i, 2 * col_width) + term.black_on_cyan(term.center(_('Queued'), width=col_width))) print(term.move(i, 3 * col_width) + term.white_on_cyan(term.center(queue_size, width=col_width))) print(term.move(i, 4 * col_width) + term.black_on_cyan(term.center(_('Success'), width=col_width))) print(term.move(i, 5 * col_width) + term.white_on_cyan( term.center(models.Success.objects.count(), width=col_width))) print(term.move(i, 6 * col_width) + term.black_on_cyan(term.center(_('Failures'), width=col_width))) print(term.move(i, 7 * col_width) + term.white_on_cyan( term.center(models.Failure.objects.count(), width=col_width))) # for testing if run_once: return Stat.get_all(broker=broker) print(term.move(i + 2, 0) + term.center(_('[Press q to quit]'))) val = term.inkey(timeout=1) def info(broker=None): if not broker: broker = get_broker() term = Terminal() broker.ping() stat = Stat.get_all(broker=broker) # general stats clusters = len(stat) workers = 0 reincarnations = 0 for cluster in stat: workers += len(cluster.workers) reincarnations += cluster.reincarnations # calculate tasks pm and avg exec time tasks_per = 0 per = _('day') exec_time = 0 last_tasks = models.Success.objects.filter(stopped__gte=timezone.now() - timedelta(hours=24)) tasks_per_day = last_tasks.count() if tasks_per_day > 0: # average execution time over the last 24 hours if not connection.vendor == 'sqlite': exec_time = last_tasks.aggregate(time_taken=Sum(F('stopped') - F('started'))) exec_time = exec_time['time_taken'].total_seconds() / tasks_per_day else: # can't sum timedeltas on sqlite for t in last_tasks: exec_time += t.time_taken() exec_time = exec_time / tasks_per_day # tasks per second/minute/hour/day in the last 24 hours if tasks_per_day > 24 * 60 * 60: tasks_per = tasks_per_day / (24 * 60 * 60) per = _('second') elif tasks_per_day > 24 * 60: tasks_per = tasks_per_day / (24 * 60) per = _('minute') elif tasks_per_day > 24: tasks_per = tasks_per_day / 24 per = _('hour') else: tasks_per = tasks_per_day # print to terminal print(term.clear_eos()) col_width = int(term.width / 6) print(term.black_on_green( term.center( _('-- {} {} on {} --').format(Conf.PREFIX.capitalize(), '.'.join(str(v) for v in VERSION), broker.info())))) print(term.cyan(_('Clusters')) + term.move_x(1 * col_width) + term.white(str(clusters)) + term.move_x(2 * col_width) + term.cyan(_('Workers')) + term.move_x(3 * col_width) + term.white(str(workers)) + term.move_x(4 * col_width) + term.cyan(_('Restarts')) + term.move_x(5 * col_width) + term.white(str(reincarnations)) ) print(term.cyan(_('Queued')) + term.move_x(1 * col_width) + term.white(str(broker.queue_size())) + term.move_x(2 * col_width) + term.cyan(_('Successes')) + term.move_x(3 * col_width) + term.white(str(models.Success.objects.count())) + term.move_x(4 * col_width) + term.cyan(_('Failures')) + term.move_x(5 * col_width) + term.white(str(models.Failure.objects.count())) ) print(term.cyan(_('Schedules')) + term.move_x(1 * col_width) + term.white(str(models.Schedule.objects.count())) + term.move_x(2 * col_width) + term.cyan(_('Tasks/{}'.format(per))) + term.move_x(3 * col_width) + term.white('{0:.2f}'.format(tasks_per)) + term.move_x(4 * col_width) + term.cyan(_('Avg time')) + term.move_x(5 * col_width) + term.white('{0:.4f}'.format(exec_time)) ) return True def get_ids(): # prints id (PID) of running clusters stat = Stat.get_all() if stat: for s in stat: print(s.cluster_id) else: print('No clusters appear to be running.') return True django-q-1.0.2/django_q/queues.py000066400000000000000000000051551352353655300166750ustar00rootroot00000000000000""" The code is derived from https://github.com/althonos/pronto/commit/3384010dfb4fc7c66a219f59276adef3288a886b """ import sys import multiprocessing import multiprocessing.queues class SharedCounter(object): """ A synchronized shared counter. The locking done by multiprocessing.Value ensures that only a single process or thread may read or write the in-memory ctypes object. However, in order to do n += 1, Python performs a read followed by a write, so a second process may read the old value before the new one is written by the first process. The solution is to use a multiprocessing.Lock to guarantee the atomicity of the modifications to Value. This class comes almost entirely from Eli Bendersky's blog: http://eli.thegreenplace.net/2012/01/04/shared-counter-with-pythons-multiprocessing/ """ def __init__(self, n=0): self.count = multiprocessing.Value('i', n) def increment(self, n=1): """ Increment the counter by n (default = 1) """ with self.count.get_lock(): self.count.value += n @property def value(self): """ Return the value of the counter """ return self.count.value class Queue(multiprocessing.queues.Queue): """ A portable implementation of multiprocessing.Queue. Because of multithreading / multiprocessing semantics, Queue.qsize() may raise the NotImplementedError exception on Unix platforms like Mac OS X where sem_getvalue() is not implemented. This subclass addresses this problem by using a synchronized shared counter (initialized to zero) and increasing / decreasing its value every time the put() and get() methods are called, respectively. This not only prevents NotImplementedError from being raised, but also allows us to implement a reliable version of both qsize() and empty(). """ def __init__(self, *args, **kwargs): if sys.version_info < (3, 0): super(Queue, self).__init__(*args, **kwargs) else: super(Queue, self).__init__(*args, ctx=multiprocessing.get_context(), **kwargs) self.size = SharedCounter(0) def put(self, *args, **kwargs): super(Queue, self).put(*args, **kwargs) self.size.increment(1) def get(self, *args, **kwargs): x = super(Queue, self).get(*args, **kwargs) self.size.increment(-1) return x def qsize(self): """ Reliable implementation of multiprocessing.Queue.qsize() """ return self.size.value def empty(self): """ Reliable implementation of multiprocessing.Queue.empty() """ return not self.qsize() > 0 django-q-1.0.2/django_q/signals.py000066400000000000000000000017731352353655300170300ustar00rootroot00000000000000import importlib from django.db.models.signals import post_save from django.dispatch import receiver, Signal from django.utils.translation import ugettext_lazy as _ from django_q.conf import logger from django_q.models import Task @receiver(post_save, sender=Task) def call_hook(sender, instance, **kwargs): if instance.hook: f = instance.hook if not callable(f): try: module, func = f.rsplit('.', 1) m = importlib.import_module(module) f = getattr(m, func) except (ValueError, ImportError, AttributeError): logger.error(_('malformed return hook \'{}\' for [{}]').format(instance.hook, instance.name)) return try: f(instance) except Exception as e: logger.error(_('return hook {} failed on [{}] because {}').format(instance.hook, instance.name, e)) pre_enqueue = Signal(providing_args=["task"]) pre_execute = Signal(providing_args=["func", "task"]) django-q-1.0.2/django_q/signing.py000066400000000000000000000021621352353655300170170ustar00rootroot00000000000000"""Package signing.""" try: import cPickle as pickle except ImportError: import pickle from django_q import core_signing as signing from django_q.conf import Conf BadSignature = signing.BadSignature class SignedPackage(object): """Wraps Django's signing module with custom Pickle serializer.""" @staticmethod def dumps(obj, compressed=Conf.COMPRESSED): return signing.dumps(obj, key=Conf.SECRET_KEY, salt=Conf.PREFIX, compress=compressed, serializer=PickleSerializer) @staticmethod def loads(obj): return signing.loads(obj, key=Conf.SECRET_KEY, salt=Conf.PREFIX, serializer=PickleSerializer) class PickleSerializer(object): """Simple wrapper around Pickle for signing.dumps and signing.loads.""" @staticmethod def dumps(obj): return pickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL) @staticmethod def loads(data): return pickle.loads(data) django-q-1.0.2/django_q/status.py000066400000000000000000000064131352353655300167070ustar00rootroot00000000000000import socket from django.utils import timezone from django_q.brokers import get_broker from django_q.conf import Conf, logger from django_q.signing import SignedPackage, BadSignature class Status(object): """Cluster status base class.""" def __init__(self, pid): self.workers = [] self.tob = None self.reincarnations = 0 self.cluster_id = pid self.sentinel = 0 self.status = Conf.STOPPED self.done_q_size = 0 self.host = socket.gethostname() self.monitor = 0 self.task_q_size = 0 self.pusher = 0 self.timestamp = timezone.now() class Stat(Status): """Status object for Cluster monitoring.""" def __init__(self, sentinel): super(Stat, self).__init__(sentinel.parent_pid or sentinel.pid) self.broker = sentinel.broker or get_broker() self.tob = sentinel.tob self.reincarnations = sentinel.reincarnations self.sentinel = sentinel.pid self.status = sentinel.status() self.done_q_size = 0 self.task_q_size = 0 if Conf.QSIZE: self.done_q_size = sentinel.result_queue.qsize() self.task_q_size = sentinel.task_queue.qsize() if sentinel.monitor: self.monitor = sentinel.monitor.pid if sentinel.pusher: self.pusher = sentinel.pusher.pid self.workers = [w.pid for w in sentinel.pool] def uptime(self): return (timezone.now() - self.tob).total_seconds() @property def key(self): """ :return: redis key for this cluster statistic """ return self.get_key(self.cluster_id) @staticmethod def get_key(cluster_id): """ :param cluster_id: cluster ID :return: redis key for the cluster statistic """ return '{}:{}'.format(Conf.Q_STAT, cluster_id) def save(self): try: self.broker.set_stat(self.key, SignedPackage.dumps(self, True), 3) except Exception as e: logger.error(e) def empty_queues(self): return self.done_q_size + self.task_q_size == 0 @staticmethod def get(cluster_id, broker=None): """ gets the current status for the cluster :param cluster_id: id of the cluster :return: Stat or Status """ if not broker: broker = get_broker() pack = broker.get_stat(Stat.get_key(cluster_id)) if pack: try: return SignedPackage.loads(pack) except BadSignature: return None return Status(cluster_id) @staticmethod def get_all(broker=None): """ Get the status for all currently running clusters with the same prefix and secret key. :return: list of type Stat """ if not broker: broker = get_broker() stats = [] packs = broker.get_stats('{}:*'.format(Conf.Q_STAT)) or [] for pack in packs: try: stats.append(SignedPackage.loads(pack)) except BadSignature: continue return stats def __getstate__(self): # Don't pickle the redis connection state = dict(self.__dict__) del state['broker'] return state django-q-1.0.2/django_q/tasks.py000066400000000000000000000511071352353655300165110ustar00rootroot00000000000000"""Provides task functionality.""" # Standard from time import sleep, time # django from django.db import IntegrityError from django.utils import timezone from multiprocessing import Value from django_q.brokers import get_broker # local from django_q.conf import Conf, logger from django_q.humanhash import uuid from django_q.models import Schedule, Task from django_q.queues import Queue from django_q.signals import pre_enqueue from django_q.signing import SignedPackage def async_task(func, *args, **kwargs): """Queue a task for the cluster.""" keywords = kwargs.copy() opt_keys = ( 'hook', 'group', 'save', 'sync', 'cached', 'ack_failure', 'iter_count', 'iter_cached', 'chain', 'broker') q_options = keywords.pop('q_options', {}) # get an id tag = uuid() # build the task package task = {'id': tag[1], 'name': keywords.pop('task_name', None) or q_options.pop('task_name', None) or tag[0], 'func': func, 'args': args} # push optionals for key in opt_keys: if q_options and key in q_options: task[key] = q_options[key] elif key in keywords: task[key] = keywords.pop(key) # don't serialize the broker broker = task.pop('broker', get_broker()) # overrides if 'cached' not in task and Conf.CACHED: task['cached'] = Conf.CACHED if 'sync' not in task and Conf.SYNC: task['sync'] = Conf.SYNC if 'ack_failure' not in task and Conf.ACK_FAILURES: task['ack_failure'] = Conf.ACK_FAILURES # finalize task['kwargs'] = keywords task['started'] = timezone.now() # signal it pre_enqueue.send(sender="django_q", task=task) # sign it pack = SignedPackage.dumps(task) if task.get('sync', False): return _sync(pack) # push it enqueue_id = broker.enqueue(pack) logger.info('Enqueued {}'.format(enqueue_id)) logger.debug('Pushed {}'.format(tag)) return task['id'] def schedule(func, *args, **kwargs): """ Create a schedule. :param func: function to schedule. :param args: function arguments. :param name: optional name for the schedule. :param hook: optional result hook function. :type schedule_type: Schedule.TYPE :param repeats: how many times to repeat. 0=never, -1=always. :param next_run: Next scheduled run. :type next_run: datetime.datetime :param kwargs: function keyword arguments. :return: the schedule object. :rtype: Schedule """ name = kwargs.pop('name', None) hook = kwargs.pop('hook', None) schedule_type = kwargs.pop('schedule_type', Schedule.ONCE) minutes = kwargs.pop('minutes', None) repeats = kwargs.pop('repeats', -1) next_run = kwargs.pop('next_run', timezone.now()) # check for name duplicates instead of am unique constraint if name and Schedule.objects.filter(name=name).exists(): raise IntegrityError("A schedule with the same name already exists.") # create and return the schedule return Schedule.objects.create(name=name, func=func, hook=hook, args=args, kwargs=kwargs, schedule_type=schedule_type, minutes=minutes, repeats=repeats, next_run=next_run ) def result(task_id, wait=0, cached=Conf.CACHED): """ Return the result of the named task. :type task_id: str or uuid :param task_id: the task name or uuid :type wait: int :param wait: number of milliseconds to wait for a result :param bool cached: run this against the cache backend :return: the result object of this task :rtype: object """ if cached: return result_cached(task_id, wait) start = time() while True: r = Task.get_result(task_id) if r: return r if (time() - start) * 1000 >= wait >= 0: break sleep(0.01) def result_cached(task_id, wait=0, broker=None): """ Return the result from the cache backend """ if not broker: broker = get_broker() start = time() while True: r = broker.cache.get('{}:{}'.format(broker.list_key, task_id)) if r: return SignedPackage.loads(r)['result'] if (time() - start) * 1000 >= wait >= 0: break sleep(0.01) def result_group(group_id, failures=False, wait=0, count=None, cached=Conf.CACHED): """ Return a list of results for a task group. :param str group_id: the group id :param bool failures: set to True to include failures :param int count: Block until there are this many results in the group :param bool cached: run this against the cache backend :return: list or results """ if cached: return result_group_cached(group_id, failures, wait, count) start = time() if count: while True: if count_group(group_id) == count or wait and (time() - start) * 1000 >= wait >= 0: break sleep(0.01) while True: r = Task.get_result_group(group_id, failures) if r: return r if (time() - start) * 1000 >= wait >= 0: break sleep(0.01) def result_group_cached(group_id, failures=False, wait=0, count=None, broker=None): """ Return a list of results for a task group from the cache backend """ if not broker: broker = get_broker() start = time() if count: while True: if count_group_cached(group_id) == count or wait and (time() - start) * 1000 >= wait > 0: break sleep(0.01) while True: group_list = broker.cache.get('{}:{}:keys'.format(broker.list_key, group_id)) if group_list: result_list = [] for task_key in group_list: task = SignedPackage.loads(broker.cache.get(task_key)) if task['success'] or failures: result_list.append(task['result']) return result_list if (time() - start) * 1000 >= wait >= 0: break sleep(0.01) def fetch(task_id, wait=0, cached=Conf.CACHED): """ Return the processed task. :param task_id: the task name or uuid :type task_id: str or uuid :param wait: the number of milliseconds to wait for a result :type wait: int :param bool cached: run this against the cache backend :return: the full task object :rtype: Task """ if cached: return fetch_cached(task_id, wait) start = time() while True: t = Task.get_task(task_id) if t: return t if (time() - start) * 1000 >= wait >= 0: break sleep(0.01) def fetch_cached(task_id, wait=0, broker=None): """ Return the processed task from the cache backend """ if not broker: broker = get_broker() start = time() while True: r = broker.cache.get('{}:{}'.format(broker.list_key, task_id)) if r: task = SignedPackage.loads(r) t = Task(id=task['id'], name=task['name'], func=task['func'], hook=task.get('hook'), args=task['args'], kwargs=task['kwargs'], started=task['started'], stopped=task['stopped'], result=task['result'], success=task['success']) return t if (time() - start) * 1000 >= wait >= 0: break sleep(0.01) def fetch_group(group_id, failures=True, wait=0, count=None, cached=Conf.CACHED): """ Return a list of Tasks for a task group. :param str group_id: the group id :param bool failures: set to False to exclude failures :param bool cached: run this against the cache backend :return: list of Tasks """ if cached: return fetch_group_cached(group_id, failures, wait, count) start = time() if count: while True: if count_group(group_id) == count or wait and (time() - start) * 1000 >= wait >= 0: break sleep(0.01) while True: r = Task.get_task_group(group_id, failures) if r: return r if (time() - start) * 1000 >= wait >= 0: break sleep(0.01) def fetch_group_cached(group_id, failures=True, wait=0, count=None, broker=None): """ Return a list of Tasks for a task group in the cache backend """ if not broker: broker = get_broker() start = time() if count: while True: if count_group_cached(group_id) == count or wait and (time() - start) * 1000 >= wait >= 0: break sleep(0.01) while True: group_list = broker.cache.get('{}:{}:keys'.format(broker.list_key, group_id)) if group_list: task_list = [] for task_key in group_list: task = SignedPackage.loads(broker.cache.get(task_key)) if task['success'] or failures: t = Task(id=task['id'], name=task['name'], func=task['func'], hook=task.get('hook'), args=task['args'], kwargs=task['kwargs'], started=task['started'], stopped=task['stopped'], result=task['result'], group=task.get('group'), success=task['success']) task_list.append(t) return task_list if (time() - start) * 1000 >= wait >= 0: break sleep(0.01) def count_group(group_id, failures=False, cached=Conf.CACHED): """ Count the results in a group. :param str group_id: the group id :param bool failures: Returns failure count if True :param bool cached: run this against the cache backend :return: the number of tasks/results in a group :rtype: int """ if cached: return count_group_cached(group_id, failures) return Task.get_group_count(group_id, failures) def count_group_cached(group_id, failures=False, broker=None): """ Count the results in a group in the cache backend """ if not broker: broker = get_broker() group_list = broker.cache.get('{}:{}:keys'.format(broker.list_key, group_id)) if group_list: if not failures: return len(group_list) failure_count = 0 for task_key in group_list: task = SignedPackage.loads(broker.cache.get(task_key)) if not task['success']: failure_count += 1 return failure_count def delete_group(group_id, tasks=False, cached=Conf.CACHED): """ Delete a group. :param str group_id: the group id :param bool tasks: If set to True this will also delete the group tasks. Otherwise just the group label is removed. :param bool cached: run this against the cache backend :return: """ if cached: return delete_group_cached(group_id) return Task.delete_group(group_id, tasks) def delete_group_cached(group_id, broker=None): """ Delete a group from the cache backend """ if not broker: broker = get_broker() group_key = '{}:{}:keys'.format(broker.list_key, group_id) group_list = broker.cache.get(group_key) broker.cache.delete_many(group_list) broker.cache.delete(group_key) def delete_cached(task_id, broker=None): """ Delete a task from the cache backend """ if not broker: broker = get_broker() return broker.cache.delete('{}:{}'.format(broker.list_key, task_id)) def queue_size(broker=None): """ Returns the current queue size. Note that this doesn't count any tasks currently being processed by workers. :param broker: optional broker :return: current queue size :rtype: int """ if not broker: broker = get_broker() return broker.queue_size() def async_iter(func, args_iter, **kwargs): """ enqueues a function with iterable arguments """ iter_count = len(args_iter) iter_group = uuid()[1] # clean up the kwargs options = kwargs.get('q_options', kwargs) options.pop('hook', None) options['broker'] = options.get('broker', get_broker()) options['group'] = iter_group options['iter_count'] = iter_count if options.get('cached', None): options['iter_cached'] = options['cached'] options['cached'] = True # save the original arguments broker = options['broker'] broker.cache.set('{}:{}:args'.format(broker.list_key, iter_group), SignedPackage.dumps(args_iter)) for args in args_iter: if not isinstance(args, tuple): args = (args,) async_task(func, *args, **options) return iter_group def async_chain(chain, group=None, cached=Conf.CACHED, sync=Conf.SYNC, broker=None): """ enqueues a chain of tasks the chain must be in the format [(func,(args),{kwargs}),(func,(args),{kwargs})] """ if not group: group = uuid()[1] args = () kwargs = {} task = chain.pop(0) if type(task) is not tuple: task = (task,) if len(task) > 1: args = task[1] if len(task) > 2: kwargs = task[2] kwargs['chain'] = chain kwargs['group'] = group kwargs['cached'] = cached kwargs['sync'] = sync kwargs['broker'] = broker or get_broker() async_task(task[0], *args, **kwargs) return group class Iter(object): """ An async task with iterable arguments """ def __init__(self, func=None, args=None, kwargs=None, cached=Conf.CACHED, sync=Conf.SYNC, broker=None): self.func = func self.args = args or [] self.kwargs = kwargs or {} self.id = '' self.broker = broker or get_broker() self.cached = cached self.sync = sync self.started = False def append(self, *args): """ add arguments to the set """ self.args.append(args) if self.started: self.started = False return self.length() def run(self): """ Start queueing the tasks to the worker cluster :return: the task id """ self.kwargs['cached'] = self.cached self.kwargs['sync'] = self.sync self.kwargs['broker'] = self.broker self.id = async_iter(self.func, self.args, **self.kwargs) self.started = True return self.id def result(self, wait=0): """ return the full list of results. :param int wait: how many milliseconds to wait for a result :return: an unsorted list of results """ if self.started: return result(self.id, wait=wait, cached=self.cached) def fetch(self, wait=0): """ get the task result objects. :param int wait: how many milliseconds to wait for a result :return: an unsorted list of task objects """ if self.started: return fetch(self.id, wait=wait, cached=self.cached) def length(self): """ get the length of the arguments list :return int: length of the argument list """ return len(self.args) class Chain(object): """ A sequential chain of tasks """ def __init__(self, chain=None, group=None, cached=Conf.CACHED, sync=Conf.SYNC): self.chain = chain or [] self.group = group or '' self.broker = get_broker() self.cached = cached self.sync = sync self.started = False def append(self, func, *args, **kwargs): """ add a task to the chain takes the same parameters as async_task() """ self.chain.append((func, args, kwargs)) # remove existing results if self.started: delete_group(self.group) self.started = False return self.length() def run(self): """ Start queueing the chain to the worker cluster :return: the chain's group id """ self.group = async_chain(chain=self.chain[:], group=self.group, cached=self.cached, sync=self.sync, broker=self.broker) self.started = True return self.group def result(self, wait=0): """ return the full list of results from the chain when it finishes. blocks until timeout. :param int wait: how many milliseconds to wait for a result :return: an unsorted list of results """ if self.started: return result_group(self.group, wait=wait, count=self.length(), cached=self.cached) def fetch(self, failures=True, wait=0): """ get the task result objects from the chain when it finishes. blocks until timeout. :param failures: include failed tasks :param int wait: how many milliseconds to wait for a result :return: an unsorted list of task objects """ if self.started: return fetch_group(self.group, failures=failures, wait=wait, count=self.length(), cached=self.cached) def current(self): """ get the index of the currently executing chain element :return int: current chain index """ if not self.started: return None return count_group(self.group, cached=self.cached) def length(self): """ get the length of the chain :return int: length of the chain """ return len(self.chain) class AsyncTask(object): """ an async task """ def __init__(self, func, *args, **kwargs): self.id = '' self.started = False self.func = func self.args = args self.kwargs = kwargs @property def broker(self): return self._get_option('broker', None) @broker.setter def broker(self, value): self._set_option('broker', value) @property def sync(self): return self._get_option('sync', None) @sync.setter def sync(self, value): self._set_option('sync', value) @property def save(self): return self._get_option('save', None) @save.setter def save(self, value): self._set_option('save', value) @property def hook(self): return self._get_option('hook', None) @hook.setter def hook(self, value): self._set_option('hook', value) @property def group(self): return self._get_option('group', None) @group.setter def group(self, value): self._set_option('group', value) @property def cached(self): return self._get_option('cached', Conf.CACHED) @cached.setter def cached(self, value): self._set_option('cached', value) def _set_option(self, key, value): if 'q_options' in self.kwargs: self.kwargs['q_options'][key] = value else: self.kwargs[key] = value self.started = False def _get_option(self, key, default=None): if 'q_options' in self.kwargs: return self.kwargs['q_options'].get(key, default) else: return self.kwargs.get(key, default) def run(self): self.id = async_task(self.func, *self.args, **self.kwargs) self.started = True return self.id def result(self, wait=0): if self.started: return result(self.id, wait=wait, cached=self.cached) def fetch(self, wait=0): if self.started: return fetch(self.id, wait=wait, cached=self.cached) def result_group(self, failures=False, wait=0, count=None): if self.started and self.group: return result_group(self.group, failures=failures, wait=wait, count=count, cached=self.cached) def fetch_group(self, failures=True, wait=0, count=None): if self.started and self.group: return fetch_group(self.group, failures=failures, wait=wait, count=count, cached=self.cached) def _sync(pack): """Simulate a package travelling through the cluster.""" from django_q.cluster import worker, monitor task_queue = Queue() result_queue = Queue() task = SignedPackage.loads(pack) task_queue.put(task) task_queue.put('STOP') worker(task_queue, result_queue, Value('f', -1)) result_queue.put('STOP') monitor(result_queue) task_queue.close() task_queue.join_thread() result_queue.close() result_queue.join_thread() return task['id'] django-q-1.0.2/django_q/tests/000077500000000000000000000000001352353655300161505ustar00rootroot00000000000000django-q-1.0.2/django_q/tests/__init__.py000066400000000000000000000000001352353655300202470ustar00rootroot00000000000000django-q-1.0.2/django_q/tests/settings.py000066400000000000000000000056371352353655300203750ustar00rootroot00000000000000import os import django BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = ')cqmpi+p@n&!u&fu@!m@9h&1bz9mwmstsahe)nf!ms+c$uc=x7' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django_q', 'django_redis' ) MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) MIDDLEWARE = MIDDLEWARE_CLASSES ROOT_URLCONF = 'tests.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] # Database # https://docs.djangoproject.com/en/1.8/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # Internationalization # https://docs.djangoproject.com/en/1.8/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django_q': { 'handlers': ['console'], 'level': 'INFO', }, }, } # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.8/howto/static-files/ STATIC_URL = '/static/' # Django Redis CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/0", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "PARSER_CLASS": "redis.connection.HiredisParser", } } } # Django Q specific Q_CLUSTER = {'name': 'django_q_test', 'cpu_affinity': 1, 'testing': True, 'log_level': 'DEBUG', 'django_redis': 'default'} django-q-1.0.2/django_q/tests/tasks.py000066400000000000000000000011431352353655300176460ustar00rootroot00000000000000from time import sleep def countdown(n): while n > 0: n -= 1 def multiply(x, y): return x * y def count_letters(tup): total = 0 for word in tup: total += len(word) return total def count_letters2(obj): return count_letters(obj.get_words()) def word_multiply(x, word=''): return len(word) * x def count_forever(): while True: sleep(0.5) def get_task_name(task): return task.name def get_user_id(user): return user.id def hello(): return 'hello' def result(obj): print('RESULT HOOK {} : {}'.format(obj.name, obj.result)) django-q-1.0.2/django_q/tests/test_admin.py000066400000000000000000000056271352353655300206630ustar00rootroot00000000000000from django.urls import reverse from django.utils import timezone import pytest from django_q.tasks import schedule from django_q.models import Task, Failure, OrmQ from django_q.humanhash import uuid from django_q.conf import Conf from django_q.signing import SignedPackage @pytest.mark.django_db def test_admin_views(admin_client, monkeypatch): monkeypatch.setattr(Conf, 'ORM', 'default') s = schedule('schedule.test') tag = uuid() f = Task.objects.create( id=tag[1], name=tag[0], func='test.fail', started=timezone.now(), stopped=timezone.now(), success=False) tag = uuid() t = Task.objects.create( id=tag[1], name=tag[0], func='test.success', started=timezone.now(), stopped=timezone.now(), success=True) q = OrmQ.objects.create( key='test', payload=SignedPackage.dumps({'id': 1, 'func': 'test', 'name': 'test'})) admin_urls = ( # schedule reverse('admin:django_q_schedule_changelist'), reverse('admin:django_q_schedule_add'), reverse('admin:django_q_schedule_change', args=(s.id,)), reverse('admin:django_q_schedule_history', args=(s.id,)), reverse('admin:django_q_schedule_delete', args=(s.id,)), # success reverse('admin:django_q_success_changelist'), reverse('admin:django_q_success_change', args=(t.id,)), reverse('admin:django_q_success_history', args=(t.id,)), reverse('admin:django_q_success_delete', args=(t.id,)), # failure reverse('admin:django_q_failure_changelist'), reverse('admin:django_q_failure_change', args=(f.id,)), reverse('admin:django_q_failure_history', args=(f.id,)), reverse('admin:django_q_failure_delete', args=(f.id,)), # orm queue reverse('admin:django_q_ormq_changelist'), reverse('admin:django_q_ormq_change', args=(q.id,)), reverse('admin:django_q_ormq_history', args=(q.id,)), reverse('admin:django_q_ormq_delete', args=(q.id,)), ) for url in admin_urls: response = admin_client.get(url) assert response.status_code == 200 # resubmit the failure url = reverse('admin:django_q_failure_changelist') data = {'action': 'retry_failed', '_selected_action': [f.pk]} response = admin_client.post(url, data) assert response.status_code == 302 assert Failure.objects.filter(name=f.id).exists() is False # change q url = reverse('admin:django_q_ormq_change', args=(q.id,)) data = {'key': 'default', 'payload': 'test', 'lock_0': '2015-09-17', 'lock_1': '14:31:51', '_save': 'Save'} response = admin_client.post(url, data) assert response.status_code == 302 # delete q url = reverse('admin:django_q_ormq_delete', args=(q.id,)) data = {'post': 'yes'} response = admin_client.post(url, data) assert response.status_code == 302 django-q-1.0.2/django_q/tests/test_brokers.py000066400000000000000000000237311352353655300212360ustar00rootroot00000000000000import os from time import sleep import pytest import redis from django_q.brokers import get_broker, Broker from django_q.conf import Conf from django_q.humanhash import uuid def test_broker(monkeypatch): broker = Broker() broker.enqueue('test') broker.dequeue() broker.queue_size() broker.lock_size() broker.purge_queue() broker.delete('id') broker.delete_queue() broker.acknowledge('test') broker.ping() broker.info() # stats assert broker.get_stat('test_1') is None broker.set_stat('test_1', 'test', 3) assert broker.get_stat('test_1') == 'test' assert broker.get_stats('test:*')[0] == 'test' # stats with no cache monkeypatch.setattr(Conf, 'CACHE', 'not_configured') broker.cache = broker.get_cache() assert broker.get_stat('test_1') is None broker.set_stat('test_1', 'test', 3) assert broker.get_stat('test_1') is None assert broker.get_stats('test:*') is None def test_redis(monkeypatch): monkeypatch.setattr(Conf, 'DJANGO_REDIS', None) broker = get_broker() assert broker.ping() is True assert broker.info() is not None monkeypatch.setattr(Conf, 'REDIS', {'host': '127.0.0.1', 'port': 7799}) broker = get_broker() with pytest.raises(Exception): broker.ping() def test_custom(monkeypatch): monkeypatch.setattr(Conf, 'BROKER_CLASS', 'brokers.redis_broker.Redis') broker = get_broker() assert broker.ping() is True assert broker.info() is not None assert broker.__class__.__name__ == 'Redis' def test_disque(monkeypatch): monkeypatch.setattr(Conf, 'DISQUE_NODES', ['127.0.0.1:7711']) # check broker broker = get_broker(list_key='disque_test') assert broker.ping() is True assert broker.info() is not None # clear before we start broker.delete_queue() # async_task broker.enqueue('test') assert broker.queue_size() == 1 # dequeue task = broker.dequeue()[0] assert task[1] == 'test' broker.acknowledge(task[0]) assert broker.queue_size() == 0 # Retry test monkeypatch.setattr(Conf, 'RETRY', 1) broker.enqueue('test') assert broker.queue_size() == 1 broker.dequeue() assert broker.queue_size() == 0 sleep(1.5) assert broker.queue_size() == 1 task = broker.dequeue()[0] assert broker.queue_size() == 0 broker.acknowledge(task[0]) sleep(1.5) assert broker.queue_size() == 0 # delete job task_id = broker.enqueue('test') broker.delete(task_id) assert broker.dequeue() is None # fail task_id = broker.enqueue('test') broker.fail(task_id) # bulk test for i in range(5): broker.enqueue('test') monkeypatch.setattr(Conf, 'BULK', 5) monkeypatch.setattr(Conf, 'DISQUE_FASTACK', True) tasks = broker.dequeue() for task in tasks: assert task is not None broker.acknowledge(task[0]) # test duplicate acknowledge broker.acknowledge(task[0]) # delete queue broker.enqueue('test') broker.enqueue('test') broker.delete_queue() assert broker.queue_size() == 0 # connection test monkeypatch.setattr(Conf, 'DISQUE_NODES', ['127.0.0.1:7798', '127.0.0.1:7799']) with pytest.raises(redis.exceptions.ConnectionError): broker.get_connection() @pytest.mark.skipif(not os.getenv('IRON_MQ_TOKEN'), reason="requires IronMQ credentials") def test_ironmq(monkeypatch): monkeypatch.setattr(Conf, 'IRON_MQ', {'token': os.getenv('IRON_MQ_TOKEN'), 'project_id': os.getenv('IRON_MQ_PROJECT_ID')}) # check broker broker = get_broker(list_key=uuid()[0]) assert broker.ping() is True assert broker.info() is not None # initialize the queue broker.enqueue('test') # clear before we start broker.purge_queue() assert broker.queue_size() == 0 # async_task broker.enqueue('test') # dequeue task = broker.dequeue()[0] assert task[1] == 'test' broker.acknowledge(task[0]) assert broker.dequeue() is None # Retry test # monkeypatch.setattr(Conf, 'RETRY', 1) # broker.async_task('test') # assert broker.dequeue() is not None # sleep(3) # assert broker.dequeue() is not None # task = broker.dequeue()[0] # assert len(task) > 0 # broker.acknowledge(task[0]) # sleep(3) # delete job task_id = broker.enqueue('test') broker.delete(task_id) assert broker.dequeue() is None # fail task_id = broker.enqueue('test') broker.fail(task_id) # bulk test for i in range(5): broker.enqueue('test') monkeypatch.setattr(Conf, 'BULK', 5) tasks = broker.dequeue() for task in tasks: assert task is not None broker.acknowledge(task[0]) # duplicate acknowledge broker.acknowledge(task[0]) # delete queue broker.enqueue('test') broker.enqueue('test') broker.purge_queue() assert broker.dequeue() is None broker.delete_queue() @pytest.mark.skipif(not os.getenv('AWS_ACCESS_KEY_ID'), reason="requires AWS credentials") def canceled_sqs(monkeypatch): monkeypatch.setattr(Conf, 'SQS', {'aws_region': os.getenv('AWS_REGION'), 'aws_access_key_id': os.getenv('AWS_ACCESS_KEY_ID'), 'aws_secret_access_key': os.getenv('AWS_SECRET_ACCESS_KEY')}) # check broker broker = get_broker(list_key=uuid()[0]) assert broker.ping() is True assert broker.info() is not None assert broker.queue_size() == 0 # async_task broker.enqueue('test') # dequeue task = broker.dequeue()[0] assert task[1] == 'test' broker.acknowledge(task[0]) assert broker.dequeue() is None # Retry test monkeypatch.setattr(Conf, 'RETRY', 1) broker.enqueue('test') sleep(2) # Sometimes SQS is not linear task = broker.dequeue() if not task: pytest.skip('SQS being weird') task = task[0] assert len(task) > 0 broker.acknowledge(task[0]) sleep(2) # delete job monkeypatch.setattr(Conf, 'RETRY', 60) broker.enqueue('test') sleep(1) task = broker.dequeue() if not task: pytest.skip('SQS being weird') task_id = task[0][0] broker.delete(task_id) assert broker.dequeue() is None # fail broker.enqueue('test') while task is None: task = broker.dequeue()[0] broker.fail(task[0]) # bulk test for i in range(10): broker.enqueue('test') monkeypatch.setattr(Conf, 'BULK', 12) tasks = broker.dequeue() for task in tasks: assert task is not None broker.acknowledge(task[0]) # duplicate acknowledge broker.acknowledge(task[0]) assert broker.lock_size() == 0 # delete queue broker.enqueue('test') broker.purge_queue() broker.delete_queue() @pytest.mark.django_db def test_orm(monkeypatch): monkeypatch.setattr(Conf, 'ORM', 'default') # check broker broker = get_broker(list_key='orm_test') assert broker.ping() is True assert broker.info() is not None # clear before we start broker.delete_queue() # async_task broker.enqueue('test') assert broker.queue_size() == 1 # dequeue task = broker.dequeue()[0] assert task[1] == 'test' broker.acknowledge(task[0]) assert broker.queue_size() == 0 # Retry test monkeypatch.setattr(Conf, 'RETRY', 1) broker.enqueue('test') assert broker.queue_size() == 1 broker.dequeue() assert broker.queue_size() == 0 sleep(1.5) assert broker.queue_size() == 1 task = broker.dequeue()[0] assert broker.queue_size() == 0 broker.acknowledge(task[0]) sleep(1.5) assert broker.queue_size() == 0 # delete job task_id = broker.enqueue('test') broker.delete(task_id) assert broker.dequeue() is None # fail task_id = broker.enqueue('test') broker.fail(task_id) # bulk test for i in range(5): broker.enqueue('test') monkeypatch.setattr(Conf, 'BULK', 5) tasks = broker.dequeue() assert broker.lock_size() == Conf.BULK for task in tasks: assert task is not None broker.acknowledge(task[0]) # test lock size assert broker.lock_size() == 0 # test duplicate acknowledge broker.acknowledge(task[0]) # delete queue broker.enqueue('test') broker.enqueue('test') broker.delete_queue() assert broker.queue_size() == 0 @pytest.mark.django_db def test_mongo(monkeypatch): monkeypatch.setattr(Conf, 'MONGO', {'host': '127.0.0.1', 'port': 27017}) # check broker broker = get_broker(list_key='mongo_test') assert broker.ping() is True assert broker.info() is not None # clear before we start broker.delete_queue() # async_task broker.enqueue('test') assert broker.queue_size() == 1 # dequeue task = broker.dequeue()[0] assert task[1] == 'test' broker.acknowledge(task[0]) assert broker.queue_size() == 0 # Retry test monkeypatch.setattr(Conf, 'RETRY', 1) broker.enqueue('test') assert broker.queue_size() == 1 broker.dequeue() assert broker.queue_size() == 0 sleep(1.5) assert broker.queue_size() == 1 task = broker.dequeue()[0] assert broker.queue_size() == 0 broker.acknowledge(task[0]) sleep(1.5) assert broker.queue_size() == 0 # delete job task_id = broker.enqueue('test') broker.delete(task_id) assert broker.dequeue() is None # fail task_id = broker.enqueue('test') broker.fail(task_id) # bulk test for i in range(5): broker.enqueue('test') tasks = [] for i in range(5): tasks.append(broker.dequeue()[0]) assert broker.lock_size() == 5 for task in tasks: assert task is not None broker.acknowledge(task[0]) # test lock size assert broker.lock_size() == 0 # test duplicate acknowledge broker.acknowledge(task[0]) # delete queue broker.enqueue('test') broker.enqueue('test') broker.purge_queue() broker.delete_queue() assert broker.queue_size() == 0 django-q-1.0.2/django_q/tests/test_cached.py000066400000000000000000000150751352353655300210000ustar00rootroot00000000000000from multiprocessing import Event, Value import pytest from django_q.cluster import pusher, worker, monitor from django_q.conf import Conf from django_q.tasks import async_task, result, fetch, count_group, result_group, fetch_group, delete_group, delete_cached, \ async_iter, Chain, async_chain, Iter, AsyncTask from django_q.brokers import get_broker from django_q.queues import Queue @pytest.fixture def broker(monkeypatch): monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default') return get_broker() @pytest.mark.django_db def test_cached(broker): broker.purge_queue() broker.cache.clear() group = 'cache_test' # queue the tests task_id = async_task('math.copysign', 1, -1, cached=True, broker=broker) async_task('math.copysign', 1, -1, cached=True, broker=broker, group=group) async_task('math.copysign', 1, -1, cached=True, broker=broker, group=group) async_task('math.copysign', 1, -1, cached=True, broker=broker, group=group) async_task('math.copysign', 1, -1, cached=True, broker=broker, group=group) async_task('math.copysign', 1, -1, cached=True, broker=broker, group=group) async_task('math.popysign', 1, -1, cached=True, broker=broker, group=group) iter_id = async_iter('math.floor', [i for i in range(10)], cached=True) # test wait on cache # test wait timeout assert result(task_id, wait=10, cached=True) is None assert fetch(task_id, wait=10, cached=True) is None assert result_group(group, wait=10, cached=True) is None assert result_group(group, count=2, wait=10, cached=True) is None assert fetch_group(group, wait=10, cached=True) is None assert fetch_group(group, count=2, wait=10, cached=True) is None # run a single inline cluster task_count = 17 assert broker.queue_size() == task_count task_queue = Queue() stop_event = Event() stop_event.set() for i in range(task_count): pusher(task_queue, stop_event, broker=broker) assert broker.queue_size() == 0 assert task_queue.qsize() == task_count task_queue.put('STOP') result_queue = Queue() worker(task_queue, result_queue, Value('f', -1)) assert result_queue.qsize() == task_count result_queue.put('STOP') monitor(result_queue) assert result_queue.qsize() == 0 # assert results assert result(task_id, wait=500, cached=True) == -1 assert fetch(task_id, wait=500, cached=True).result == -1 # make sure it's not in the db backend assert fetch(task_id) is None # assert group assert count_group(group, cached=True) == 6 assert count_group(group, cached=True, failures=True) == 1 assert result_group(group, cached=True) == [-1, -1, -1, -1, -1] assert len(result_group(group, cached=True, failures=True)) == 6 assert len(fetch_group(group, cached=True)) == 6 assert len(fetch_group(group, cached=True, failures=False)) == 5 delete_group(group, cached=True) assert count_group(group, cached=True) is None delete_cached(task_id) assert result(task_id, cached=True) is None assert fetch(task_id, cached=True) is None # iter cached assert result(iter_id) is None assert result(iter_id, cached=True) is not None broker.cache.clear() @pytest.mark.django_db def test_iter(broker): broker.purge_queue() broker.cache.clear() it = [i for i in range(10)] it2 = [(1, -1), (2, -1), (3, -4), (5, 6)] it3 = (1, 2, 3, 4, 5) t = async_iter('math.floor', it, sync=True) t2 = async_iter('math.copysign', it2, sync=True) t3 = async_iter('math.floor', it3, sync=True) t4 = async_iter('math.floor', (1,), sync=True) result_t = result(t) assert result_t is not None task_t = fetch(t) assert task_t.result == result_t assert result(t2) is not None assert result(t3) is not None assert result(t4)[0] == 1 # test iter class i = Iter('math.copysign', sync=True, cached=True) i.append(1, -1) i.append(2, -1) i.append(3, -4) i.append(5, 6) assert i.started is False assert i.length() == 4 assert i.run() is not None assert len(i.result()) == 4 assert len(i.fetch().result) == 4 i.append(1, -7) assert i.result() is None i.run() assert len(i.result()) == 5 @pytest.mark.django_db def test_chain(broker): broker.purge_queue() broker.cache.clear() task_chain = Chain(sync=True) task_chain.append('math.floor', 1) task_chain.append('math.copysign', 1, -1) task_chain.append('math.floor', 2) assert task_chain.length() == 3 assert task_chain.current() is None task_chain.run() r = task_chain.result(wait=1000) assert task_chain.current() == task_chain.length() assert len(r) == task_chain.length() t = task_chain.fetch() assert len(t) == task_chain.length() task_chain.cached = True task_chain.append('math.floor', 3) assert task_chain.length() == 4 task_chain.run() r = task_chain.result(wait=1000) assert task_chain.current() == task_chain.length() assert len(r) == task_chain.length() t = task_chain.fetch() assert len(t) == task_chain.length() # test single rid = async_chain(['django_q.tests.tasks.hello', 'django_q.tests.tasks.hello'], sync=True, cached=True) assert result_group(rid, cached=True) == ['hello', 'hello'] @pytest.mark.django_db def test_asynctask_class(broker, monkeypatch): broker.purge_queue() broker.cache.clear() a = AsyncTask('math.copysign') assert a.func == 'math.copysign' a.args = (1, -1) assert a.started is False a.cached = True assert a.cached is True a.sync = True assert a.sync is True a.broker = broker assert a.broker == broker a.run() assert a.result() == -1 assert a.fetch().result == -1 # again with kwargs a = AsyncTask('math.copysign', 1, -1, cached=True, sync=True, broker=broker) a.run() assert a.result() == -1 # with q_options a = AsyncTask('math.copysign', 1, -1, q_options={'cached': True, 'sync': False, 'broker': broker}) assert a.sync is False a.sync = True assert a.kwargs['q_options']['sync'] is True a.run() assert a.result() == -1 a.group = 'async_class_test' assert a.group == 'async_class_test' a.save = False assert a.save is False a.hook = 'djq.tests.tasks.hello' assert a.hook == 'djq.tests.tasks.hello' assert a.started is False a.run() assert a.result_group() == [-1] assert a.fetch_group() == [a.fetch()] # global overrides monkeypatch.setattr(Conf, 'SYNC', True) monkeypatch.setattr(Conf, 'CACHED', True) a = AsyncTask('math.floor', 1.5) a.run() assert a.result() == 1 django-q-1.0.2/django_q/tests/test_cluster.py000066400000000000000000000363521352353655300212530ustar00rootroot00000000000000import sys import threading from multiprocessing import Event, Value from time import sleep from django.utils import timezone import os import pytest myPath = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, myPath + '/../') from django_q.cluster import Cluster, Sentinel, pusher, worker, monitor, save_task from django_q.humanhash import DEFAULT_WORDLIST, uuid from django_q.tasks import fetch, fetch_group, async_task, result, result_group, count_group, delete_group, queue_size from django_q.models import Task, Success from django_q.conf import Conf from django_q.status import Stat from django_q.brokers import get_broker, Broker from django_q.tests.tasks import multiply from django_q.queues import Queue class WordClass(object): def __init__(self): self.word_list = DEFAULT_WORDLIST def get_words(self): return self.word_list @pytest.fixture def broker(monkeypatch): monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default') return get_broker() def test_redis_connection(broker): assert broker.ping() is True @pytest.mark.django_db def test_sync(broker): task = async_task('django_q.tests.tasks.count_letters', DEFAULT_WORDLIST, broker=broker, sync=True) assert result(task) == 1506 @pytest.mark.django_db def test_cluster_initial(broker): broker.list_key = 'initial_test:q' broker.delete_queue() c = Cluster(broker=broker) assert c.sentinel is None assert c.stat.status == Conf.STOPPED assert c.start() > 0 assert c.sentinel.is_alive() is True assert c.is_running assert c.is_stopping is False assert c.is_starting is False sleep(0.5) stat = c.stat assert stat.status == Conf.IDLE assert c.stop() is True assert c.sentinel.is_alive() is False assert c.has_stopped assert c.stop() is False broker.delete_queue() @pytest.mark.django_db def test_sentinel(): start_event = Event() stop_event = Event() stop_event.set() s = Sentinel(stop_event, start_event, broker=get_broker('sentinel_test:q')) assert start_event.is_set() assert s.status() == Conf.STOPPED @pytest.mark.django_db def test_cluster(broker): broker.list_key = 'cluster_test:q' broker.delete_queue() task = async_task('django_q.tests.tasks.count_letters', DEFAULT_WORDLIST, broker=broker) assert broker.queue_size() == 1 task_queue = Queue() assert task_queue.qsize() == 0 result_queue = Queue() assert result_queue.qsize() == 0 event = Event() event.set() # Test push pusher(task_queue, event, broker=broker) assert task_queue.qsize() == 1 assert queue_size(broker=broker) == 0 # Test work task_queue.put('STOP') worker(task_queue, result_queue, Value('f', -1)) assert task_queue.qsize() == 0 assert result_queue.qsize() == 1 # Test monitor result_queue.put('STOP') monitor(result_queue) assert result_queue.qsize() == 0 # check result assert result(task) == 1506 broker.delete_queue() @pytest.mark.django_db def test_enqueue(broker, admin_user): broker.list_key = 'cluster_test:q' broker.delete_queue() a = async_task('django_q.tests.tasks.count_letters', DEFAULT_WORDLIST, hook='django_q.tests.test_cluster.assert_result', broker=broker) b = async_task('django_q.tests.tasks.count_letters2', WordClass(), hook='django_q.tests.test_cluster.assert_result', broker=broker) # unknown argument c = async_task('django_q.tests.tasks.count_letters', DEFAULT_WORDLIST, 'oneargumentoomany', hook='django_q.tests.test_cluster.assert_bad_result', broker=broker) # unknown function d = async_task('django_q.tests.tasks.does_not_exist', WordClass(), hook='django_q.tests.test_cluster.assert_bad_result', broker=broker) # function without result e = async_task('django_q.tests.tasks.countdown', 100000, broker=broker) # function as instance f = async_task(multiply, 753, 2, hook=assert_result, broker=broker) # model as argument g = async_task('django_q.tests.tasks.get_task_name', Task(name='John'), broker=broker) # args,kwargs, group and broken hook h = async_task('django_q.tests.tasks.word_multiply', 2, word='django', hook='fail.me', broker=broker) # args unpickle test j = async_task('django_q.tests.tasks.get_user_id', admin_user, broker=broker, group='test_j') # q_options and save opt_out test k = async_task('django_q.tests.tasks.get_user_id', admin_user, q_options={'broker': broker, 'group': 'test_k', 'save': False, 'timeout': 90}) # check if everything has a task id assert isinstance(a, str) assert isinstance(b, str) assert isinstance(c, str) assert isinstance(d, str) assert isinstance(e, str) assert isinstance(f, str) assert isinstance(g, str) assert isinstance(h, str) assert isinstance(j, str) assert isinstance(k, str) # run the cluster to execute the tasks task_count = 10 assert broker.queue_size() == task_count task_queue = Queue() stop_event = Event() stop_event.set() # push the tasks for i in range(task_count): pusher(task_queue, stop_event, broker=broker) assert broker.queue_size() == 0 assert task_queue.qsize() == task_count task_queue.put('STOP') # test wait timeout assert result(j, wait=10) is None assert fetch(j, wait=10) is None assert result_group('test_j', wait=10) is None assert result_group('test_j', count=2, wait=10) is None assert fetch_group('test_j', wait=10) is None assert fetch_group('test_j', count=2, wait=10) is None # let a worker handle them result_queue = Queue() worker(task_queue, result_queue, Value('f', -1)) assert result_queue.qsize() == task_count result_queue.put('STOP') # store the results monitor(result_queue) assert result_queue.qsize() == 0 # Check the results # task a result_a = fetch(a) assert result_a is not None assert result_a.success is True assert result(a) == 1506 # task b result_b = fetch(b) assert result_b is not None assert result_b.success is True assert result(b) == 1506 # task c result_c = fetch(c) assert result_c is not None assert result_c.success is False # task d result_d = fetch(d) assert result_d is not None assert result_d.success is False # task e result_e = fetch(e) assert result_e is not None assert result_e.success is True assert result(e) is None # task f result_f = fetch(f) assert result_f is not None assert result_f.success is True assert result(f) == 1506 # task g result_g = fetch(g) assert result_g is not None assert result_g.success is True assert result(g) == 'John' # task h result_h = fetch(h) assert result_h is not None assert result_h.success is True assert result(h) == 12 # task j result_j = fetch(j) assert result_j is not None assert result_j.success is True assert result_j.result == result_j.args[0].id # check fetch, result by name assert fetch(result_j.name) == result_j assert result(result_j.name) == result_j.result # groups assert result_group('test_j')[0] == result_j.result assert result_j.group_result()[0] == result_j.result assert result_group('test_j', failures=True)[0] == result_j.result assert result_j.group_result(failures=True)[0] == result_j.result assert fetch_group('test_j')[0].id == [result_j][0].id assert fetch_group('test_j', failures=False)[0].id == [result_j][0].id assert count_group('test_j') == 1 assert result_j.group_count() == 1 assert count_group('test_j', failures=True) == 0 assert result_j.group_count(failures=True) == 0 assert delete_group('test_j') == 1 assert result_j.group_delete() == 0 deleted_group = delete_group('test_j', tasks=True) assert deleted_group is None or deleted_group[0] == 0 # Django 1.9 deleted_group = result_j.group_delete(tasks=True) assert deleted_group is None or deleted_group[0] == 0 # Django 1.9 # task k should not have been saved assert fetch(k) is None assert fetch(k, 100) is None assert result(k, 100) is None broker.delete_queue() @pytest.mark.django_db @pytest.mark.parametrize('cluster_config_timeout, async_task_kwargs', ( (1, {}), (10, {'timeout': 1}), (None, {'timeout': 1}), )) def test_timeout(broker, cluster_config_timeout, async_task_kwargs): # set up the Sentinel broker.list_key = 'timeout_test:q' broker.purge_queue() async_task('time.sleep', 5, broker=broker, **async_task_kwargs) start_event = Event() stop_event = Event() # Set a timer to stop the Sentinel threading.Timer(3, stop_event.set).start() s = Sentinel(stop_event, start_event, broker=broker, timeout=cluster_config_timeout) assert start_event.is_set() assert s.status() == Conf.STOPPED assert s.reincarnations == 1 broker.delete_queue() @pytest.mark.django_db @pytest.mark.parametrize('cluster_config_timeout, async_task_kwargs', ( (5, {}), (10, {'timeout': 5}), (1, {'timeout': 5}), (None, {'timeout': 5}), )) def test_timeout_task_finishes(broker, cluster_config_timeout, async_task_kwargs): # set up the Sentinel broker.list_key = 'timeout_test:q' broker.purge_queue() async_task('time.sleep', 3, broker=broker, **async_task_kwargs) start_event = Event() stop_event = Event() # Set a timer to stop the Sentinel threading.Timer(6, stop_event.set).start() s = Sentinel(stop_event, start_event, broker=broker, timeout=cluster_config_timeout) assert start_event.is_set() assert s.status() == Conf.STOPPED assert s.reincarnations == 0 broker.delete_queue() @pytest.mark.django_db def test_recycle(broker, monkeypatch): # set up the Sentinel broker.list_key = 'test_recycle_test:q' async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) start_event = Event() stop_event = Event() # override settings monkeypatch.setattr(Conf, 'RECYCLE', 2) monkeypatch.setattr(Conf, 'WORKERS', 1) # set a timer to stop the Sentinel threading.Timer(3, stop_event.set).start() s = Sentinel(stop_event, start_event, broker=broker) assert start_event.is_set() assert s.status() == Conf.STOPPED assert s.reincarnations == 1 async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) task_queue = Queue() result_queue = Queue() # push two tasks pusher(task_queue, stop_event, broker=broker) pusher(task_queue, stop_event, broker=broker) # worker should exit on recycle worker(task_queue, result_queue, Value('f', -1)) # check if the work has been done assert result_queue.qsize() == 2 # save_limit test monkeypatch.setattr(Conf, 'SAVE_LIMIT', 1) result_queue.put('STOP') # run monitor monitor(result_queue) assert Success.objects.count() == Conf.SAVE_LIMIT broker.delete_queue() @pytest.mark.django_db def test_bad_secret(broker, monkeypatch): broker.list_key = 'test_bad_secret:q' async_task('math.copysign', 1, -1, broker=broker) stop_event = Event() stop_event.set() start_event = Event() s = Sentinel(stop_event, start_event, broker=broker, start=False) Stat(s).save() # change the SECRET monkeypatch.setattr(Conf, "SECRET_KEY", "OOPS") stat = Stat.get_all() assert len(stat) == 0 assert Stat.get(s.parent_pid) is None task_queue = Queue() pusher(task_queue, stop_event, broker=broker) result_queue = Queue() task_queue.put('STOP') worker(task_queue, result_queue, Value('f', -1), ) assert result_queue.qsize() == 0 broker.delete_queue() @pytest.mark.django_db def test_update_failed(broker): tag = uuid() task = {'id': tag[1], 'name': tag[0], 'func': 'math.copysign', 'args': (1, -1), 'kwargs': {}, 'started': timezone.now(), 'stopped': timezone.now(), 'success': False, 'result': None} # initial save - no success save_task(task, broker) assert Task.objects.filter(id=task['id']).exists() saved_task = Task.objects.get(id=task['id']) assert saved_task.success is False sleep(0.5) # second save - no success old_stopped = task['stopped'] task['stopped'] = timezone.now() save_task(task, broker) saved_task = Task.objects.get(id=task['id']) assert saved_task.stopped > old_stopped # third save - success task['stopped'] = timezone.now() task['result'] = 'result' task['success'] = True save_task(task, broker) saved_task = Task.objects.get(id=task['id']) assert saved_task.success is True # fourth save - no success task['result'] = None task['success'] = False task['stopped'] = old_stopped save_task(task, broker) # should not overwrite success saved_task = Task.objects.get(id=task['id']) assert saved_task.success is True assert saved_task.result == 'result' @pytest.mark.django_db def test_acknowledge_failure_override(): class VerifyAckMockBroker(Broker): def __init__(self, *args, **kwargs): super(VerifyAckMockBroker, self).__init__(*args, **kwargs) self.acknowledgements = {} def acknowledge(self, task_id): count = self.acknowledgements.get(task_id, 0) self.acknowledgements[task_id] = count + 1 tag = uuid() task_fail_ack = {'id': tag[1], 'name': tag[0], 'ack_id': 'test_fail_ack_id', 'ack_failure': True, 'func': 'math.copysign', 'args': (1, -1), 'kwargs': {}, 'started': timezone.now(), 'stopped': timezone.now(), 'success': False, 'result': None} tag = uuid() task_fail_no_ack = task_fail_ack.copy() task_fail_no_ack.update({'id': tag[1], 'name': tag[0], 'ack_id': 'test_fail_no_ack_id'}) del task_fail_no_ack['ack_failure'] tag = uuid() task_success_ack = task_fail_ack.copy() task_success_ack.update({'id': tag[1], 'name': tag[0], 'ack_id': 'test_success_ack_id', 'success': True,}) del task_success_ack['ack_failure'] result_queue = Queue() result_queue.put(task_fail_ack) result_queue.put(task_fail_no_ack) result_queue.put(task_success_ack) result_queue.put('STOP') broker = VerifyAckMockBroker(list_key='key') monitor(result_queue, broker) assert broker.acknowledgements.get('test_fail_ack_id') == 1 assert broker.acknowledgements.get('test_fail_no_ack_id') is None assert broker.acknowledgements.get('test_success_ack_id') == 1 @pytest.mark.django_db def assert_result(task): assert task is not None assert task.success is True assert task.result == 1506 @pytest.mark.django_db def assert_bad_result(task): assert task is not None assert task.success is False django-q-1.0.2/django_q/tests/test_commands.py000066400000000000000000000005361352353655300213660ustar00rootroot00000000000000import pytest from django.core.management import call_command @pytest.mark.django_db def test_qcluster(): call_command('qcluster', run_once=True) @pytest.mark.django_db def test_qmonitor(): call_command('qmonitor', run_once=True) @pytest.mark.django_db def test_qinfo(): call_command('qinfo') call_command('qinfo', config=True) django-q-1.0.2/django_q/tests/test_monitor.py000066400000000000000000000021441352353655300212510ustar00rootroot00000000000000import pytest from django_q.tasks import async_task from django_q.brokers import get_broker from django_q.cluster import Cluster from django_q.monitor import monitor, info from django_q.status import Stat from django_q.conf import Conf @pytest.mark.django_db def test_monitor(monkeypatch): assert Stat.get(0).sentinel == 0 c = Cluster() c.start() stats = monitor(run_once=True) c.stop() assert len(stats) > 0 found_c = False for stat in stats: if stat.cluster_id == c.pid: found_c = True assert stat.uptime() > 0 assert stat.empty_queues() is True break assert found_c is True # test lock size monkeypatch.setattr(Conf, 'ORM', 'default') b = get_broker('monitor_test') b.enqueue('test') b.dequeue() assert b.lock_size() == 1 monitor(run_once=True, broker=b) b.delete_queue() @pytest.mark.django_db def test_info(): info() do_sync() info() for _ in range(24): do_sync() info() def do_sync(): async_task('django_q.tests.tasks.countdown', 1, sync=True, save=True) django-q-1.0.2/django_q/tests/test_scheduler.py000066400000000000000000000124241352353655300215420ustar00rootroot00000000000000from datetime import timedelta from multiprocessing import Event, Value import arrow import pytest from django.db import IntegrityError from django.utils import timezone from django_q.brokers import get_broker from django_q.cluster import pusher, worker, monitor, scheduler from django_q.conf import Conf from django_q.tasks import Schedule, fetch, schedule as create_schedule from django_q.queues import Queue @pytest.fixture def broker(monkeypatch): monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default') return get_broker() @pytest.mark.django_db def test_scheduler(broker, monkeypatch): broker.list_key = 'scheduler_test:q' broker.delete_queue() schedule = create_schedule('math.copysign', 1, -1, name='test math', hook='django_q.tests.tasks.result', schedule_type=Schedule.HOURLY, repeats=1) assert schedule.last_run() is None # check duplicate constraint with pytest.raises(IntegrityError): schedule = create_schedule('math.copysign', 1, -1, name='test math', hook='django_q.tests.tasks.result', schedule_type=Schedule.HOURLY, repeats=1) # run scheduler scheduler(broker=broker) # set up the workflow task_queue = Queue() stop_event = Event() stop_event.set() # push it pusher(task_queue, stop_event, broker=broker) assert task_queue.qsize() == 1 assert broker.queue_size() == 0 task_queue.put('STOP') # let a worker handle them result_queue = Queue() worker(task_queue, result_queue, Value('b', -1)) assert result_queue.qsize() == 1 result_queue.put('STOP') # store the results monitor(result_queue) assert result_queue.qsize() == 0 schedule = Schedule.objects.get(pk=schedule.pk) assert schedule.repeats == 0 assert schedule.last_run() is not None assert schedule.success() is True assert schedule.next_run < arrow.get(timezone.now()).shift(hours=+1) task = fetch(schedule.task) assert task is not None assert task.success is True assert task.result < 0 # Once schedule with delete once_schedule = create_schedule('django_q.tests.tasks.word_multiply', 2, word='django', schedule_type=Schedule.ONCE, repeats=-1, hook='django_q.tests.tasks.result' ) assert hasattr(once_schedule, 'pk') is True # negative repeats always_schedule = create_schedule('django_q.tests.tasks.word_multiply', 2, word='django', schedule_type=Schedule.DAILY, repeats=-1, hook='django_q.tests.tasks.result' ) assert hasattr(always_schedule, 'pk') is True # Minute schedule minute_schedule = create_schedule('django_q.tests.tasks.word_multiply', 2, word='django', schedule_type=Schedule.MINUTES, minutes=10) assert hasattr(minute_schedule, 'pk') is True # All other types for t in Schedule.TYPE: schedule = create_schedule('django_q.tests.tasks.word_multiply', 2, word='django', schedule_type=t[0], repeats=1, hook='django_q.tests.tasks.result' ) assert schedule is not None assert schedule.last_run() is None scheduler(broker=broker) # via model Schedule.objects.create(func='django_q.tests.tasks.word_multiply', args='2', kwargs='word="django"', schedule_type=Schedule.DAILY ) # scheduler scheduler(broker=broker) # ONCE schedule should be deleted assert Schedule.objects.filter(pk=once_schedule.pk).exists() is False # Catch up On monkeypatch.setattr(Conf, 'CATCH_UP', True) now = timezone.now() schedule = create_schedule('django_q.tests.tasks.word_multiply', 2, word='catch_up', schedule_type=Schedule.HOURLY, next_run=timezone.now() - timedelta(hours=12), repeats=-1 ) scheduler(broker=broker) schedule = Schedule.objects.get(pk=schedule.pk) assert schedule.next_run < now # Catch up off monkeypatch.setattr(Conf, 'CATCH_UP', False) scheduler(broker=broker) schedule = Schedule.objects.get(pk=schedule.pk) assert schedule.next_run > now # Done broker.delete_queue() django-q-1.0.2/django_q/tests/urls.py000066400000000000000000000001731352353655300175100ustar00rootroot00000000000000from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ] django-q-1.0.2/docs/000077500000000000000000000000001352353655300141545ustar00rootroot00000000000000django-q-1.0.2/docs/Makefile000066400000000000000000000163711352353655300156240ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = -nW 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 coverage 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 " applehelp to make an Apple Help Book" @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)" @echo " coverage to run coverage check of 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/DjangoQ.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/DjangoQ.qhc" applehelp: $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp @echo @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." @echo "N.B. You won't be able to view it unless you put it in" \ "~/Library/Documentation/Help or install it in your application" \ "bundle." devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/DjangoQ" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/DjangoQ" @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." coverage: $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage @echo "Testing of coverage in the sources finished, look at the " \ "results in $(BUILDDIR)/coverage/python.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." django-q-1.0.2/docs/_static/000077500000000000000000000000001352353655300156025ustar00rootroot00000000000000django-q-1.0.2/docs/_static/cluster.png000066400000000000000000001732431352353655300200030ustar00rootroot00000000000000‰PNG  IHDR²Q¹©T¬ IDATx^ìtÇÆ?$8$¸k)îÅÝ¡ZJ)E‹(V¬8ü)^ x±EŠwwww ˆ@ò?wó’&!!o_ö½·»ïÛsr ÍÌ{w¸ý2ov&ø € D3 Ït™H€H€H€H€@!ËI@$@$@$@$`H²†L&    å    0$ YC¦N“ PÈr ’…¬!ÓF§I€H€H€H€(d9H€H€H€H€ I€BÖi£Ó$@$@$@$@²œ$@º"pÿÕ»ÒrèÊ):£DÛ“6QœKš¤! —&@!ëÒégð$ ?÷_¾™hÑZëÏ3z¤ hÑÚ¦Iw¶&¶h„HÀå PȺü Ð Y}åCso(d5GJƒ$àÊ(d]9ûŒtH€BV‡IÑÒ% Y-iÒ ¸< Y—Ÿ@ú"@!«¯|hî …¬æHi\™…¬+gŸ±“€ PÈê0)ZºD!«%MÚ"—'@!ëòS€H@_(dõ•ͽ¡Õ) ’€+ uåì3vÐ! Y&EK—(dµ¤I[$àò(d]~  è‹…¬¾ò¡¹7²š#¥Ape²®œ}ÆN:$@!«Ã¤hé…¬–4i‹\ž…¬kMÔÑcÆ8Í-FL× Ûu¢ ð¸ëïã—ÏÈSÈ9{Vøn!ËziE:ÜÄ õÒÈüµòBV+’ư“>fü8+ÏÏîÒK5Þ=ó ØÛó·Þù&UÓOom?%d;·m…UË—~ärôèÑ'n\$Kžyó@£o›¢jšá†Ö¶Y¬_³CFŽAÛŽõ¾Süyùâ/˜‡­›6àò… xýú&L„l9s¢JõšhÒ¬<'ÖÆ7ãYÖKm2®K+f©—º„ë`§(d ÜÉÃ¥wK÷Bí5ãâ;ÙooŸ¼ ø·Å—²áá¬Q§.¦Îž‡8qâ„ú1…lhZ+–.Æ€Þ=ñÊÓ3ÂYéîáÉ3ÿ@åj5¢>s $dY/£žn½Z0K½Ô+_GúE!ëHÚ΋BÖù9°›f)ÌÖ¬ÈÖoø5FŽŸÌ2 oÞ¼ÁÍë× ÂlÙŸ •ŸÕý²¦Ï]€hÑþ+ukÿ^‰+/¢|å*(\´˜Ýòaó¦MÁ/?÷V\Í•'/:víŽReÊ!q’$xxÿ>öïÙ…é“ÃÕË— «Þ#'ü†ï[¶ŽZh²QãÇÞš0K½Ô†ÁPÈ<*ݧU ÌHÍÍR˜­²_7iЉÓgF˜žsf£o÷•Ÿÿ±h)du–Oh'ŽEÝ*ðáÃ|×¢FMø 1bÄø“··7ºþÐëV¯BìØ±±y÷~dË‘Óvœ²¶³cO͘¥^jÄÀ†(d œ<\§µšQº˜¥0k!d%g-›|ÍëÿAþ‚…°qç^£¤Ña~6¨U öîA©2e±|íeÅ5¢ÇÏÏU˔ĥ çQ²t¬\¿Ùv?)dmgÇžš0K½Ô ˆ QÈ8y6¸N!k4£t1KaÖJÈŠH±&ωK×2UjåïŸÚ#{îÌiÌ™9‡öíÅÇðáý{$Mž%J•ƺ o‚¡¦CîÌéñÊó%î< Ù²0{Ú\8NÙʯ@A´ëôc¸/ùûûã¯%báœÙ¸zå²Ò¾xÉRèÕo öìÜaû¡gßþèùsÿPã={ú3&O–ëqçÖMÄtsC¶ì9Рq4mÑ nnnVMW³l‘JÛÕ›þE±’¥"í'/‚5ÿ¦¡Òn÷‘Èš-{¤}Âm@!k7öÒ”€YꥦP jŒBÖ ‰³Ñm YÁ¡›Y ³VBöýû÷Èš:|}}•}²õ¾ a YÙWÛ³sˆÈôðHŒ4éÒ)oïß¿{Wùø=V¬XXºú”ø¢tðt²]zü„‰cG)«š)R¦Ä³§O!«˜òL˜:›6 î#¶º´kÕ+–+ÿ-Sæ,p‹KÙ‡*c”.WÛ¶lúHÈž9uß5¨§O#f̘ø<{x¿{‡ׯ)vŠ/ËWA^ÌŠì™=}*õý I“%Ç™k·"k®ü\8æý,^¿zµ(d­âÍFö%`–zi_JưN!kŒ…ŠUªaÑŠ¿C ÙÏŸ)ß‹ýn?õEÂD‰ðüÙStnÛ;·mEê4ipôü•àÎdÅwÀO=±úÿù—! Yùl)Ù ~”î}»w¡QH™*N\ºþ‘ý}Þ"Ôùò«ú}ž6d5uëÞƒÈ7䤀ZË*韺r#ܬׯƒÝ;¶…²ßÔ«¥ìí;h0~ìx\VاÉWõ”à^ý GŸ~Ÿœ²ÁB6þ©Ží[|¯ì®Y·f/\bÛ? YÛ¸±—¦ÌR/5…bPc²MœnSÈÚÎÝÌR˜µ²ErgSö¸ö2ºõø¤ ʱìE½|ñnÞ¸Ž×®)BXÞÖ¡›9e{t ç£LùŠX¶æ«§·ˆyõr–ì艓­îª!…¬mÜØKSf©—šB1¨1 Yƒ&ÎF·)dmg„nf)ÌZ Y¹©*gÆ4ÊÇùs—ü…j5k}RÈÊ V#R„kÈG¶äÈ™ [7mŒPÈnÙsyòåPÈÊñ_r ØïS&aHÿ¾¨R½æ/[î´’—ÆÆ JÈJž/_bõæm(V¢d¸ý¦üoœâµZµ1wqà‹d=A['IŠs7îX5½EÈçΜNñcø˜ñhõC«ú}ÔˆBÖ6nì¥)³ÔKM¡Ô…¬Ag£Û²6‚3B7³f­„ìæ ëÑòÛFÊKV'/_WD¨<áZ°w×N4®_[Yu-]®<ª×®‹ì9r"{ΜH–<í߇/kT‰²]8÷ôéÖå“g±†»"›ësÜ¿wOyÑ,¢Y±"f­Y‘•çòÅ +åÌÖðN-Èœå3l;pä£S Bžv°fËvåLÙÈY•­V¶|||ФyKŒþߤ`1{äÐAtlÝ÷îÜQŽ +P¸ˆò"™¬ÐŠý…Wsmz(dmÂÆNÚ0K½Ô–Š1­QÈ3o¶zM!k+9ô3Ka¶FÈÖoø5FŽŸœ•þàõê5®\¾ˆ•Ë–_6ÞÇìá Ùï}¥\BP°peµ1èä9Å`̯C!{Jå‰7.®? <7VµBVúÌš6¿üÜ[Y圽p1Š—úB±%/—µý¾ äv1yB Y¹„ |ñBxpÿ¾rSØø)Ó•þòHûv;Sλ•ŸÍ[ºÂêÙºxþ\ôîÖEÙR‘'tîÞ_”)«öÇ)DÈJuÐ3tÔX´éÐÉjûá6¤?öÖ„€Yê¥&0 n„BÖà Té>…¬J`Fjn–Âlµ&/²MàÓ~ÿhõ26þ¾yðmdj§ëË/°xÁºwxD*¤U ŒÍíAÀ,õÒlŒf“BÖh‹š¿²Qã§ëÞf)Ìö²ò‚Tñ|¹”·ó½ß½ ¼äàÌÄ×á9Ý¿g7š6¬oooe_oÆL™áëãƒ;·o)ûOåˆ-Ùr£˜) YS¦ÕhA™¥^»=ü¥µUýÚ¤Õon¢ì™Y ³=„¬äß®Y<ö 9råÆˆñ•—œõܹu 3&Oľ=»q÷Îmå%­ 3¡fÝzhÕ®¹»;Ë5ûK!kÆ!Rf©—‘ê (d] É!B¤5q¾ÍR˜í!dMœvã…F!k¼œ™Ðc³ÔK¦FuH²ª‘º…¬¡Ó÷içÍR˜)dM²fË(ð=€éâ[B ´=ÄtK÷Bí5ã‚~fSôA…¹ÖÚ±ˆ• üýñìÌ52ù:6DúÊEáûê üß@œ$‰lC‹N¯ïŠHÍÙ²6R•ÈóQv‚VdÅvD㼺q'&,†¿ßÈmEŸ}Yé+Åöv#ñîñ ¤,‘ŶRDí£#çáïû|ý¯s#¤*žW–ý‹o)ÿÍÏë­bCÚË*°ˆûÓÓV(}¢ÇŒ¼"Y¾¬xyåÎL[ ¿·ÞÊÞžlMª!m¹‚Qž]f)Ì^½kàï_&Ê@h@Ÿ¢GŸ—&Qܽút.”Wš~‚$dY/Y/ 0÷ å¢-BöWÝ,°À/¼ ~éËP¸ álI³D)+²’¹Tþ„=…¬çµ»ØñÃhÔÛ: W–lU¶äïò5vÿ8E¶T¶¼yø [›FíÆãõ­ØÕi*ýÑ 3¦Âí-‡pcÝ^”›ÜSŽ^w£è€–xïã‹=Ý'Â=KäëÔ[›A±_Ú(¢ðõ퇊ýrSz!Aº¡RÈF4αQ à‘=£"`ß>|†ósÿA‘Ÿ›#äŠì«›÷qzò_(9²#bÄríMqóŸ½Ê˜"dEÀWšÝ1bÇÂñ1‹;i"ähZ›DÑ­a.âûôäå(ó[loý+Jüúƒ"ÎEØïê8%GuDÂô)£4ÁÌ"d£I@;v²¬—¬—ÚMU×¶¤FÈŠH½`€E®M×ÑŸß²GVl7+,Û¹0ßÃîÇ£Îú ¡VdeåñÑ¡sðºû¯o=ÄÝíGQóïÑŠp<ª.Ê'´{{MBÂôÿ‰n?¯wÈÝ®>ÒU(¥‰E!%|ìLa °^†©Ë¬—üG¢Gj„¬¬¼Ê[ñgô}RÈÅñë< #`ƒðص0ßX»··B¹É½‚…lîÖuQš¦\A$Íóܳ¤Å–ï£æªQŠ=:b¾òBV°µ|¿³ãXälQ )‹ Ù]xyùÒW.†s3W‡²ÍDòŸã³¯*D(d#G:ø¼|ÇG/âñ± xtø<*Ì諬ôí‘•í ‡‡üÏV€ûgéðþ­7.Ì[Ês(ÂU^ z©-èûŒÕKâèˆy¨ºpp°Ož×ï)øØÈù¨¾L>Ø|¼Ÿy"V¢øÿ½cÆ2oß¼Éäçë›ÆþCF>B‚ ¼^zzúº{x}pïÞFs"ïÅá`~]gZPȺN®M)…¬©ÒÉ` µã”H’,YÏwoÞiÙ®}ŒšuëÆI’4bÅä΢G†Wžžxúä16®_ÿrÑœY±|||êØî|ïŒáókŒÔˆ+³O æ×ÿhŒa’BÖy¢—aPÈrJ˜™…¬öÙÍ™*MÚÇ/\q×Þ´ý->öEre{ãííÀþ£ræ×iÓÄi YM0Òˆ£ PÈ:š8Çs$ Yi'Mž|îðÑã[ÔkÐPcËŽ37à§žžsfNï`žãF5ÆH̯1òd'/)dí–fíK€BÖ¾|iݹ(d5æŸ)s–‹[ö0ÞŠ IDATÌž q4÷ìÜŽî;,¿ïÎ7ã1¼9æ×ð)ŒJ²Q¡Ç¾N#@!ë4ôØ(dµ…ì;vìG7¿ÐÇÑ6ÆvþìÔ¯^ùš×ë×Ym4aÖn̯Y3k]\²Öqb+ ÕYB莦(d5ʼn ©Ò¤9püÂU]œkkh÷ïÞ ¨]¥Âƒ‡÷掠ՆIû1¿&M¬•aQÈZ ŠÍôE€BV_ù 7Ú Õ–gÆDîî'/Þ~`ˆ#·" ýîíÛ•K÷|åé™X[<†·Æü>…Q €B6JøØÙY(dEžã:‚…¬¶”)t´å©7k̯Þ2âX(dË›£iD€BV#4£K²Ú¦…BG[žz³Æüê-#Žõ‡BÖ±¼9šF(d5I3º$@!«mZ(t´å©7k̯Þ2âX(dË›£iD€BV#4£K²Ú¦…BG[žz³Æüê-#Žõ‡BÖ±¼9šF(d5I3º$@!«mZ(t´å©7k̯Þ2âX(dË›£iD€BV#4£K²Ú¦…BG[žz³Æüê-#Žõ‡BÖ±¼9šF(d5I3º$@!«mZ(t´å©7k̯Þ2âX(dË›£iD€BV#4£K²Ú¦…BG[žz³Æüê-#Žõ‡BÖ±¼9šF(d5I3º$@!«mZ(t´å©7k̯Þ2âX(dË›£iD€BV#4£K²Ú¦…BG[žz³Æüê-#Žõ‡BÖ±¼9šF(d5I3º$@!«mZ(t´å©7k̯Þ2âX(dË›£iD€BV#4£K²Ú¦%B¡óàþ} êÛ {wíÄû÷ïñy¶ìèùsTªZ]ñ kšäØ}ä$Ò¤M«­Ga¬>°ýê­{F8ÎÝÛ·*—.îùÊÓ3±]1žqæ×x9ÓÒc Y-iÒ–ÃPÈ: 5r Ym¡G(t¾kPŸ}þ9~þe(bÇŽÛ¶¢]󦨲ç²|–×®^AÆL™3fLm=¢Õ’'ó«%MãÙ¢5^Îè1 YN3 Õ6» åK£ñ÷ÍѼuÛà·lÜ€\¹ó ]† ¡Vd§ýö?ü9oâ'Lˆ’_”ÆÆÖâ𙋘>i"N; o¼|ù˜>g²Š{æÔI îׯ_¿F´hÑÐ¥{/Ô®ÿ¥2ÖÔÿÇâóÈÝ9råÆÙÓ§¸"k[Þ™_Û¸™¥…¬Y2ébqPȺXÂ],\ Ym¡Ð9~ôºwüA­xÉR(V²ªÕ¬„‰)ÿ-hkÁµ+—Ñ·ûøgû.xx$Fïn]°kû¿ÁBvÑÜ?ðïþÈ7.ztj)S¡k¯Þ¨X²(æ-ý ÙsæÂógOQ«b9,\ñ7Ü»‡Ÿºv¦ûàîá®íÛâ¹³²¶åùµ›YzQÈš%“.…¬‹%ÜÅÂ¥Õ6ᑾ tõò%Ú¿{wïÂþ=»±tõ:äÌ'XÈΚ6nn±ÐoðPÅ3Í7 ²—.œÇÄé3•ŸÉ í­×Ñ q|S·&>û<[p4žž/ÑÈpœ9y~~~2rŒò³Ã ¯î²¶åùµ›YzQÈš%“.…¬‹%ÜÅÂ¥UŸðôîDÐ-\¡óèáüÒ·7&Ïš77·à®"(-~;!XÈΙ9Ñ ý‡ SÚ]<;i,do^¿†Ñ' Yùþ«¯£S›8zþJ°m3q’¤3||}}1tÔXåg'ŽEï®)dÕç]z¸R~E´=² “i{QÈš6µæŒBÖÜùuõè(dÕÏ€®è àT˜îá 9¥ |±B¨Xµ~èô#R¥IÙBйm+4kÕM[¶²²ÂÚ³s¬ß±‰'Á€Þ=±uÓ:}AY OÈ6¥ æÅà£Q{ãú5ÈžÜu[wàé“'ø±}lÞµI’&C¿žÝpäÐA YõyPÈš,¿ŒP@>mCeÊ^²¦L«ùƒ¢5Ž]9B YõÙ  ''ÃÚ?z¾së† ê‡}»wã×k¤N“M[´BÇn=”—³B¿5{úTÌÿcâĉƒ\yòâÔ‰ãØyèX„BVVh9Œ¡ýûÂËË þþþø±çOø²Ñ7Jts~Ÿ®|%H˜ ÁÑÇ(dÕç=B!+?0A~ƒ¬œ—ÀJ mÃdÚ^²¦M­¹£5w~]=: YÛf@@ˆn^!íËDîî'/Þ~àa›Yàô‰ã8t`?Úv”_`æÔÉ8~ä0fÌ[h«IÕýxŽl„È"Ý#læ7¬€•dNçp3²x\ìç².–p³„K!k–L2ŽðȆMYU|L<ª¤“ƒÂôð° ‘»û×Q²^¯_£W—ޏtñ‚²R›6]zŒùm R§I£ÊÁ¨4![¶hwÞÞÞ‡£bG£¾òË–ìEÅLìX±c¸ùøE\[è%¿– /Úß„qÈç®eûŒ­ašµŸò@)³ȸÌI€BÖœyeTÿÈ ¨"0+Œ•,Ù/;4‘»û²¨YU^Ø©±ÙХоözýºž†Pcö;ËG܇â:÷I?A‚™Wî=<3Í Oˆ÷ƨfÙNÑ+zȽ _p_ŽÑ'ˆˆ…,ç @HòÌî–`EÀÊ>YÙŽòGÏz@­³­ýt\lÌšßL–¼‚­übÖÀ<0§ $@Q$@!E€ìN&#pѲ‚}<„€ ѬBÇ™)¤Õ˜þ'~Q ´5¼·ü²¦ñè4G$àh²Ž&ÎñH@¿dvˆe¥JV`Ã>²ÚçŽBVc¦V¬¸‹ •“9~åñ[ç9p Y'@ç$`Pª„l‹Æ ±kû6%T岄èÑ£+ß>{ÉSÈKÒÖ?rLW‡–ͰÿäYë;…ÓÒ ¡%û*;VÈ2¿*3Íæ$@v!@!k¬4J¦$ JȆ$P8gVLž9¥Ê”µ …¬Íè¬íÈüZKŠíH€tC€BV7© #$ {š Vÿ“'Âïý{<{úÍ[·E—?AŽp’ÛºîÞ¾­\q[´x åšÛBV.=èЪ¦Ìœƒâ¥¾PŽ+²âb~UÍ$6&Ð Y=d>€1h&tüüüP¿Z%LŸ³2eRnŽ*U0.ß}„5«V`Û–M˜µ`1|}}ñÓÐgà`Í¥º³öô$d™_íóK‹$@v&@!kgÀ4Of")K–{ŽžÊ#F ÆuøàüøCë ·oÞ¬¥ƒ ô$dÁüê`FÐ U(dUábcpm‰“&Ý1aÊŒòÕjêAÚ–‹ÁýúøÌœ:y €±¶Yд—®„,ó«iniŒHÀ(d™C€‰T*R¬øòµ[w$1jL“¹ûùùù%ૃt%d0¿:˜tHÀz²Ö³bK iÓ¦]ÚèˆÚõ6Šo4 ¿üÜÇsÕ_K={òd’N|×›e~u21è €u(d­ãÄV$@!,RtkÛKIÌöú±Ó«{·oßµc‡¶ÑÔǘ_þs'0  Y£dŠ~’€Î¤M›~Yêti+wèÒ-Iåê5àææ¦3—/^`ûÖ-Ò¿Ïk_ßñ¯^¾¢3'u)d…ó«³™BwH€Â%@!ˉA$’&M6 ¡»{–7^¯ãûx{ÇŽŠ1­ú&H˜ÐëÉãÇÉÓ¦OÍËËkÏÓÇG¸¦•} íèVÈZbd~5L6M‘ hO€BV{¦´H®JÀ€¼D¥‡'ÀKoôàÌ'|л é:ó«óÉD÷HÀ PȺbÖ3 €^IÈê…ý  `²œ $@$à<²ÎcÏ‘I€L@€BÖId$@†%@!kØÔÑq = ÕCè €« uÕÌ3n MPÈj‚‘FH€HÀ&²6ac' $@!Ë™@$@Î#@!ë<ö™HÀ(dMD†@$`X²†M'Ð Y=d> ¸* YWÍ<ã&Є…¬&i„H€l"@!k6v" @²œ $@$à<²ÎcÏ‘I€L@€BÖId$@†%@!kØÔÑq = ÕCè €« uÕÌ3n MPÈj‚‘FH€HÀ&²6ac' $@!Ë™@$@Î#@!ë<ö™HÀ(dMD†@$`(î<-SÈ*u.álCÔÀ#˜àCêø @vïìÐ À}¥ÌÇFzÃì°ÕÆþìfr²&O°ÃcÁ³3`š7%Òø@yÝ$°@Ëÿø™2r¥w °À O-ât6€Û¾ '€f~ÐÀ.‹ø@Ä­ˆ×âQ²{ °IïðèŸsPÈ:‡»FeÁ3Cƒ3ô0Ê2°¬Ìºˆgùþ-€øÎpŠc’€å—ª†¾CC-DÈ–ò—¬ènè`uˆ>òßÛX W!;@*-måûdº 6?´ðµåßÊ=˲Ò+«Å5-[#Ï[l=àeñ¡šÅÎ!fÔ5PȺFží¥¬"±àÙƒ,mºo±-„x_¡%€y®€1ê’ÀJ"†ãÝ6‹PœâgiÜàb»LØ®!·D$dp@:ËÖiwÀf!WdP@+Ë6‡Þ–U_Y–S=Ì´üÌ_—„锿(d5Gê2Yð\&Õ ÔdUvd˜neE)¡Æ¢I°–€Ôõ DH†}DhÊ «ˆÎ 'µelb/#Ä!+ûie¬|![6X¶)ˆÉBv €ÏCˆæ˜Þ(j²²ú{ÝÚ`ÙÎ(dÍ‘GgDÁ‚ç êÓLB®ÊJ\\5SvKËÇù%È'²—[„b,×,{ºemÈç&€®Ö„ùïk-Ûâ„ØZÐßb³“¥­¼È%¿¼ÉÖÑ#²Ÿ¶’e¿íßäeÈBVV…[^>²%G¶¹=¶YYÑ•}½|\ˆ…¬ %[ãPYð4Js.G äª,Wc].ýº XD¡|¤//mÉö‚bd+ÌÏÓÖqùl°åE0²ª*µŽåcY- :µ e[€ìÁ•±vZÆZh§¥È>qÙC[ݲ×UÚȉ ²W¶|cÔ¯L «ÁßRÈêr>9Ä) Y‡`6å ,x¦L+ƒr0 UY®Æ:<‡‹€¼Ø%§È©²â)GhÉ*l6Ë["VÃ>²GUVU3Xö§ÊKYr×0ÇoÉêëŸ X^“²bXúÊÉòÞ…T³ò²˜ìו}¯¿ý±Ò7è¥0Ù{ @ò²—ü[⊬ Nl YLº†!³ài“¦\’€üÏYÞø–}|H@Ï>³¬¶ÊÊ,Ð  YݤÂTްà™* ÆFò©…ü[È*&>‹dÿÄùÄ{Ä â§^?âGÞÄÞÅÞÅÞ¾®x¾xsÕ²?QþŒè@z]d7 06 YcçÞ“ è‡@~9gÓ¨›HóÈš ðÉDÏÄE+o½ÈUIòymÐßå{ùU¾ä­ù’ÏHå9×è ðêó'pòpç) /ÂÈ>Fyц ¸, Y—M='Ѐ@£”@£ç@íTÀ‡/€…È—¬©õ´Yñà{xï øÄ–<–YŽ/ÒzHÚ# ] Õuzè € äMt÷¾+ø5âç³¼‚íh_8`!àuð¦zSåràÍ?@<ÄeO7¶ ì~”Ó` Y :ÓÄŽ·`ëÆ Ø²q=R$O-š#a„H:5R¥JüçÇñàÁýéùêæÏ›gÏž¡rš¨Z£&ÊWªâÌP8¶I¨©ë²&Iº«…ÁÂëj8^5ïÔ²¥vlÒ¸Ùë@ÀÀÀgÄK!«Dg˜X½b9&ƒ é3 ^½º¨[·.Ò¦U Å;w°nÝ:¬Y³·ïÜA×Þ}Q陼Ήcš„€šºN!k’¤»J,¼®’iëãTSð>a5c4àÆ& Z¤{[ïšn[.&ïß±4p’BVˆŽ4±sÛVŒøe òäÎñãÇ!Mí~QÛ«×O¸xéú †²*924Žejê:…¬I’nö0XxÍžaÛãSSð>%dcW†n®ðÁè/¶ï|µ¹¹ŒBÖöéëðž}ºuÁ£{w1fÌhäÏÿñÞVooo¬]»ÇÇéÓ§ƒ·äÈ‘/^ Þj } *„zõê!V¬:qâz÷3aä„ß'465uBÖØ¹v ïYx]"Í6©¦à}JÈÆÎ5âkñö“ÍÁ8¨cW à$ðú6·—QÈ:(oQæùóg¨òEq,þóO”/_þ#SóæÍÃ’%K°{÷ne‹Aƒ Bí“•½²²76hìëׯ±bÅ ¬Y³*TÀ·ß~‹æÍ›dwûöíhÞ¼þ݉ÜMwY^TR¾Ÿ  ¦®SÈr*é– ¯nS£+ÇÔ¼O Ù„ÀÉ*€G_é*Bm 0 ð| $ÖÀ:…¬íibÿžÝø¡ùwÊ kØm‹-BŸ>}о}{/^U«VUíÊæÍ›qèÐ!Ìš5 £GF“&MBÙíyóæÅ¼¥+P¼Ôªí³ƒëPS×)d]o~"b^C¤INª)x‘ Ù€Gg5ÔÒEtÚ:1@µ€&²ÚÂÕ©µëW¯ W§ö8p`(=Š–-[¢@ŠøÔbŸìÝ»wQ|öìYÈ oÁ‚CY¬XqLš9³dÑ)-º¥jê:…¬^²F?‚ °ðr2¨! ¦àY#d¥l/È  §GtÜÖ@¥x  YgK;×dA`Üð!‰Ø¹sçbÕªU9r$òäɣ݀K²òÛ»woee¶Y³f‰ÙþÃF XI™|H |jê:…,g‘®°ðê*†pFMÁ³VÈJ»%Öh  ¢!H„ïäêÀ3cñ?A—=PÈ8¡Vº.[³Ê)€§OŸ†êÑ­[7¼zõ sæÌ±Ò’íÍdÏlòäÉ1nܸPF<<ÍàØ±chÓ¶6ìÜël×8¾Î¨©ë²:Kž+ºÃÂëŠY×.f5Ok!ÖÞË*©|´€¼f$Båî#YEõ€À»aEÔÊ;ãgÈÉ"`ÝÄ@ò_"ˆe[C&ËWTRÈF…ž~ûÊÞ»·nÆ’%²&ð‘ó[å¢{œN –ÄÉ“'•#¿äÖ¯ §Q£¯Q¥v=ÔùÒ̧7«%Åöjê:…,ç‹S °ð:¿)WSðì-d­*‚WD«ˆZ¿¢V„mdEÙÚ1>ÕŽBV Šú³Q©dQü»uKð ^rÙ\V°páBÝ8+7€Éµ¶7V|’¿jÕ©ƒ-{êÆG:â|jêzd53#€],Qá 0Οºò€…WWé0¤3j ž^„¬³ASÈ:;Ú¿ãß-X0s6mÚlCF ö+*V©öÑPÍ}‰ݺB.§fÍšèÒ¥Kð÷öò-*veìôéÓñÏ?ÿ(fäÏ)Ó¦cîÒQ1˾&! ¦®SÈš$éF Ãì…Wn+ëÓ­ š¶h.=2Zz 寚‚G!K!k¨Émq¶KÛÖX¹| <'Fâ$IÐðpÔ¬[/8”êeKaÞÜ9Á7f,Xr-mйsg̘1CÙ‹-Z4ĈC9þêÿûräÈaŽ àêÕ«H•Jí9~ü8Ú¶m ¹ÝKù¾Uë6ظkŸmÙËTÔÔu YS¥Þ8Á˜µðŠ€ܯ?z¤¼p±ëÐq¤Ï(Ç1ó±5Ok![Çrult‹a¹‰«9µw—㓬¶¤0vyü–ƒ@k4Ì‹ÏQ0[øúÊ5@Üxñ(‘; uê¡dþ\8yâD°°L:µr{–M²"b'Nœ¨ôõóóC§NpæÌ8pÀ&µ²<@áÂ…qÿþ}Åù¾PáÂ8~ñšM>±“¹¨©ë²æÊ½a¢)˜=‹© oHûòÅ %µêÖǬ…ÿ]i˜äÌQ5ÏBv€âÃ'ü` 5kU®(dýýýñáÃåËßòçûïƒÿþáƒÿ÷Ý.¸ÅFPå¿[ÚÚöLJ÷ïÇñÿoœOõkÃ_lùÒv°Ý~†Œ'”Ï6BúÒçþ6Þ[l*? Óßëõ+¼}û6ÔŽ;ÆNš‚å.Àž]rwQàS¡BìØ±Cù{X!+ÿmÿþýʶOOOT®\íÛ·GÆ •öò½ô©_¿>úõë§|ä/' ˆ8–³i“%K²mÚ´Qn {õêzõê…îÝ»+14r¼V@@råÊ…)S¦ I’$¨^½ºr’ÂöíÛ•=¼Ò>¤Ÿ2v™rå°|Ý&ƒU ºkjê:…¬=2@›‘øºNuÓÞ'OžâÑð|üø P±jUÄ‹?Rl5oÞ¼ÁÆuk|>|ø°$ –â'ªïTmh–Ù°B¶§eeU •P€¬{Éz˜\M+Ê¡HrèP{¥„²§-«³Ã°À"þûÙäÀ{"œeý*'€1*‚—Ù¯_?@6$ưñKB¾±£Gž%]† Ñþ¥áB…¬ò÷èÑ£+sËWtËŸ1cÄ þ{ŒÑÿû{ôÿÚ÷ §¿b+z Í@»Ñ•ÕÈáõ—6AãûƆb/¬ ±k±aUÿ| á§Åñ5ؖŇÀH®lŠÐUêK‚V¿Œ…/}ƒùrZ½0 âµ[·nxüø±rŽkDB6þü(Y²$îÞ½«0>|8Š-ªœO+BVÄë/¿ü‚K—.!_¾|Š(–¶d«Àœ9s6cÆŒQ^èZ°`"d=<<ðçŸ*q<þœ+²*þͺZS YW˸ãU³"«÷Â[»þW˜7ëwĈ>ÞÞÁÿ£iѦ²fËnÀìËå/_Œ<𭟯oç(xž4!0hH ²/-j΀Eœ¶±) ›e«¬¥50Ê"Poh `./‹x @¾¤ì^¼hù~¶EÄžð3€µæø€¨wQ”±T8.B¶!ðÖ'pYôµ-_¢ª¤_ò‰møwÏÁxÿ‰Ò@‘ªˆ°P‚ì?ñ¦Â]—oúû”I1ddåI¸úuš·nÌ%²­Z"0ãÆ«´—ÕÕR¥J)+¥éÓ§PÈÖ®]eË–…ü¢("T^ +W®œbC„ìùóç‘!Cå{wwwåû–-[âÊ•+Ê÷òˆ`•qåš\±!§(¬À=².?­? €B–óC÷ÌVxe?ìˆÁC ÚÜyóaëÞƒºÏ…ÑTSð>kÆ„ÀÉ€‡aWd/è ‡|D @„ìréð›eu5hŒÞŠÈ@. ¯ðȪ«`r!+çY€/B·— ?Y‰½F¬>Ò²"û€Œ£ö¡UKÌyíåö«5+ÿBã¦Í"t¢gç¨âÙŸþY9Á@V@#²"<åZÛ±cÇâÂ… (R¤ˆòñ¿¬ÖŠ •ý´ñâÅSVp7mÚ¤Έ„ìâÅ‹•Kvî܉„ ¢cÇŽxñâäÌØ°BVþÛ¹sç”- òðYçÍ1=ެ¦®SÈê1ƒ.à“Ù ¯Ú½{"O¾ühÞ¦ dÔy!ª)xö²w,[ d﫬ֆ²¯-[ Æ( ÷Ë[N8±*ï¢Z°Àï–•XÙÿ*û%dA&[,bW^&“}³²Î›wzyæ´)pã¦ì}•篿þR¾ä†¯È„¬ˆÉfÍš)/mÉ^WÙ [dE¶ÿþX±b…"JEÌÊ1^òWDB6eÊ”Á/ˆÉèìÙ³cöìÙÁ/{…\‘•½¾ÿþ{e•WžqãÆá?Ц}'=¡¥/N" ¦®SÈ:)I®>¬«^ùhNÎnäc?j ž=„¬|Ô/ÇoI–åÕ¾º–m2VH!+ߟ°QyÙKúÈ=LU¼ì%íd¥VvÊ‹dòÁ«ˆV±/»åƒeÙ?+/{QÈÚo^ÉòÙÓ§ðSç8yRf”cºD|úøÈ®m}>²×WŽÁ+OžÏuäL0æXjê:…¬1slJ¯YxM™V»¥¦àQÈRÈÚ}Bêd€Wžž(ž7^¾|Ê#Y™}üø±²ÝÀÞl'#ÀB®Äʘ²2|êÊMċϻ‘ì£ÚWS×)dšeúÍÂk¤: $5B–BÖSR7CÚ¿#~éÇBm%§,Y²#FŒ@4÷WN'èÓ§Z¶ljO¬ T¸p =EŠ×|\45uBÖZÌÊi­ZµBŽ90zôhdÈ!ÊÞÊ™°"`¯^½ŠyóæŸNdXDìôy ‘>£V·ÞGÙeÐ)5uBV§Ite·Xx]9ûêcWSð(d)dÕÏ0ã÷8|`?šÓ§OŸþH°.]ºTŸ-Z´@ñâÅQ³fMÕË¥ ‡V¶+ˆ(ºì È쉕#·–¬þ‡+±ªéºf5uBÖ5çˆî£fáÕ}Štã š‚G!K!«›‰ë`GdëV•/ŠcîÜ9¨T©ÒG£‹]¶lä4ºuë*·o¹»»#uêÔÁ_<€|Ý¿¯_¿Æ_ý…5kÖ Fhܸ1š6mú‘]±×î‡öضÿ0÷Ä:8çFNM]§5r¦Mî; ¯É¬Qxj …,…¬FÓΰfú÷ì†[ׯa̘Ñ(\¸ðGqÈ1Yk׮űcÇpêÔ)E¸ÊWöìÙqéÒ%EÔ¦I“rc˜ô¯W¯¢Gþ‘¹ì wï>Èœ-~Ë#¶ ;aœä¸šºN!ë¤$qXë °ðZÏÊ[ª)x²²®øo$lÌ{vîÀÈÁ‘õ³Ï0~ü8MöÇ!ûd{öê…7o¡ßàa¼ì€Î&jê:…¬MˆÙÉÑXxMÜ8ã©)x²²Æ™Ùö÷tÝß«0e¤HžõêÕU¶d̘QõÀ²vݺuX³f-=yŒn?ýŒZõê«¶Ã$D@M]§å¼1^C¥Ë!Ϊ)x²²™”d÷Žíغq¶n\D‰¡E‹æÊŸAÛ‚öɆÜ#+éé‰ùóæÃëÍT©^UjÔD™ò =ÝÕ#5uBV¤O‘`á‘Ë4PSð>%ÃçÀæ%@W÷蜻äÕ Þô‰_8óO·×¦³M\8wû÷ìÆ¥ çñäÑC@?À͈åĈ ø¥nÝ2½Üä{7À× x|@¦ä¸óüµê¾ì`,j ž#{ÀÀ3ÉtèŸ5.QÈZCÉàmZ4nˆ&Í[¡jš„ºN!k„ŒÒG›¤Kœ·Ÿ½Bôèò .³PSðtÆ@¶Èjl^~0Wg>Zã…¬5” Þ¦m³&¨ßàkÔªWßà‘Ð}#PS×)dQúh,)“àü­ûˆÇw1Ù";PSðtLö½„¼¸^¾wæ‘´¶â¡µ•œÎû½|ñ‰§¨\0#«±õÊEq€œÕýYVyŸ‘ hO@M]§Õž?-ê„@öô©pôÜe$L”HñH¶ă‹ø˜Š€š‚§£À[˜hY rKVe»˜£#?­q…BÖJk#ï”-ZyóÀOýbÆäßPªLYÄŒ}»ÿˆ¢%JáÏ•« Ý5 5uBÖ(Y¥Ÿ‘‚ÉãÇâ§~‘6}zäÉ’»Ç»·ïе}[´nß5êÔÔ‹€š‚§£Èdõ5€˜ä·«ÞxcÀUY YM,-]Ò¿/þ˜1 ñã'@Üxñðîíø½hÑ¢aÉßëP¤Xq-‡£-& ¦®SÈr☆@@@ÒzÄG¼øñQºly?zÅJ–ÂÎmÿâÃû÷Øuø2dÊdšxH 5O'̪ØàWƒø[Äì/·i6ëÄWkÜ µ†’AÛHM•Úò‘Û½¶î=hЈè¶¨©ë²FÈ(}´šÀØ_‡aêoàëãwx¾ <;¾Jõ˜¿l¥ÕvØÐ8Ô´F|¬^‘½ré"¾ûªÆŽƒ¼yóÂÝÝ݈ñÒgÐ=¹üçúõëÊW»vípîæ=Ä+üãQS×)d#É) ¯1&=½4>[ ¯š‚§SJ>r¸€ÀóŒ÷X%dÏž>….mZââÅ Æ‹“€ <}ú3eÂÕûO …šºN!û‰´²ðfÎÓQ“PSxÕ
V­È¦q÷Ñ QF –>“€ ìÞ½?÷€ëqi šºN!û‰ÉÂkÄ®ôÙ,¬-¼j žNÙ¼À·xèÔÑÜŠTÈÞ¹u+ ]ó&8yüxdÿÏ1Väô– BàîÝ»µëüŸ½«êè¢'¸'Xqw(^Ü­ Pܵ…âP¬¸Kqh¡8Å-Ü%8MpKˆá$HþïlþMH²ovßî¾7;ó}ùÌ›¹÷ÌÌÙ³÷Ý™qÅ®#'t±yxÝ”CY Öõ& O+sB¯VFBÚá¨(%^ÂÓ(– Y߇ÃÜêÖÄÇL}æhtˆ¤Y}#ðàÁƒ° *âôU]¬A^7åà YI¼ú^´Òzý# ”xyO£¨ÐÝŸ© Õc1 |ªÇa•6‹„€R>ÕŠÏ<¼.…l4£&‰W+ÓYÚá¨(%^ÂÓ(–!Òøz™½þвú3i±ƒ! ”Oµ ¯K!+…¬Væ­´C"¥ÄËCx…X YŒ4K" JùT+þòðº²RÈjeÞJ;$Ž*dßH €­‹ŒÈêqԤͅ€²¸ÙK¦8Ô—Îj¥ÄËóÍ]ƒn’I¯¤@‚VE Y=Žš´Ù¡PʧZ…‡×eDVFdµ2o¥GÈJ!+ç¾D@"`U¤•Y«N0Ù¸D@"ð=J‰—ç›»Fq~ ã·È¬FMŒÑ,‘µÁ¨%Ožïß¿g—J„††"~üø¬×>>X¼x±Ég·nÝŠ©S§²úqâÄA¹rå0fÌ,XÐä³²‚6Pʧڰàáu‘•Y«Í[I¼VƒÖ!VJ¼<„§Qà^È€­‹²6µÛ·o#W®\ß’¦TÈ.Z´cÇŽÅ¿ÿþ‹ªU«âÓ§OX²d † ‚#GŽ H‘"6ô^ve.JùÔÜöÕ~އץ•BVíù÷]{’x­±(%^ÂÓ(PRÈjt`´hVt|ºqãF8ýøñ#‚ƒƒÑ£G&6¯^½Š®]»²(î—/_ЫW/tèÐÕ5DdçÍ›‡… bÏž=È!C¸ÛôLÆŒ±zõjÔ¬Y3†¶·oߎêÕ«£{÷îhÒ¤ «CÿîÙ³'6lˆ‹/¢oß¾xõꜜœ˜MToܸqÀܹsÙ3ôï'Ož`æÌ™Ì~zþÖ­[øüù34h€Ñ£G³çe1¥|j^ëê?ÅÃë¦f…¼AÞDcñ •Äk1„Ù€Râå!<ùq- Z=‘µá¨Eŧ$^Ë—E¡f„ IDAT/µk×"[¶l¸ÿ>ræÌÉÄ# Ú’%K2aøàÁ >+W® ²”°nÝ:xxx eÊ”<¹rå Š+†·oß"^¼x~wìØ1&TŸ>}­%ñ[¨P!¸»»£@L¨–.];wîĆ ¢²7Fݺuѹsg&ÌIø’˜íر£ ‘«+¥|ª¯yx] ÙhFMžZ Þt–Ä«–ŽÔ’Râå!<â÷@6$hõX¤µá¨Exýú5ˆż~ý:Ö¬YÄ# ÎN:¡ZµjìÇÍÍ ©S§fBvúôé ÄæÍ›™(\ B6$$$<'×P‡¢·Í›7ÇóçÏ£²...¬OÊã5”/^`òäÉÌΨ"²3fÌ@âĉ™;6{Œ„t:u0kÖ,"-VWJùT+^óðº²RÈZ}ÞJâµ:ÄBv ”xyO£@I!«ÑÑ¢YQñé³gÏðã?²È%Ef .Ì„`PP­ôª~ï޽طovïÞóçÏ3¡Kéƒfé$ZS¤HÁeCjÁŠ+˜¤ríÚ5]0`KMرcjÔ¨ÁÒš6mÊêT¨Pýû÷GªT©Ð²eK|­[·f©Å$‘J’"ž”R@"”^ËÓ©$pézÆ#Û¥K&")5!r¡S (?•6{UªT‰EtI߸qƒµQ´hQÖåÒ’8õööF‰%X^-Ec©?в¶jÕ d;ýîäÉ“,RL›ÆNœ87oÞ råʬ}Ê‘¥´‚L™2±¼ÝwïÞ¡bÅŠ »uëfC¤ÅêJ)ŸjÅk^—BV Y«Ï[I¼V‡XÈ”/ái()d5:0Z4+ºT­6mÚ°]í$xæÌ&“%KÆ¢¥$cÅŠ…zõê±SŒ7{‘ˆ¥\ÖñãÇ3Á¹ð¥t¯tüE\}}}™ð¤MZ”&жm[–“KÑ`:Ù€6”QºÂ©S§Xt–ú ÍfC‡e—þM}yyy!sæÌ,w–6v‘¥H-E‰IhÓÿQ;'N”›½,˜JùÔ‚.T}”‡×¥•BVÕÉUc’x­±(%^ÂÓ(POä¢7¨µÏ”Y2"k !Obu×®]¨_¿¾€Þ‰ç’R>ÕŠç<¼.…¬²Z™·V·C¯Õ!Vµ¥ÄËCxª¨^cOè\{$hõX¤Õã¨I› ¥|ªPxx] Y)dµ2o¥(%^ÂÓ(ÄRÈjt`¤YQPʧZñ—‡×¥•BV+óVÚ!pT! ´z,2"«ÇQ“6;RÈYUq“„§R?7#Ï‘µBÙ€DÀ"”/Ï7w‹ ²ÞÃA A«Çb’×%ŸêqX¥Í"! ”Oµâ3¯Ëˆ¬ŒÈjeÞJ;$Ž‘^Ⱦyó&¬fù2¸w÷Ž©Ï¹ $+ àååÖ»o?§µÛ<¬ÐºúMJ!«¦’xUQ6!°¥ÄËCx˜cÍG@‚VÅdD–œjR¯V,[~Ƚ•6KôŠÀªU«päÄIŒ™;²réâ°'ÁÁè;hˆŸÞ×®†9«6n¿°°0düáÝÎE^75`RÈMш·t¡¼až¯"vœ8¦æ.Cß_»¢q³æ¨P¹ª.í7eôª¥ÿ‚>Xú úÃTU]üÞ\âå!<áBV£ca¶YêÔÀ#F¡ôOåÌnCË.˜3+,(À#ÇOòóâ²×Ű½{bÏ‘Bú§å¹•m<¼njÀ¤ÕÛèsØ›)¥sؽ çˆ#¨íÖ®5~nØõ5æ@E?U—-þ7½¯cÂô™ú1Ú –òžºW£I?% Õc1+"«GGc²¹Nåò˜ô×l)ö£h®1¤rX5ë¯K!«Ùa´¾a¢ ÙÞÝ» |¥ÊhÚ¢•õÁ´CkW­À™“ž˜1o¡z×N—<„§«#Xâ  4´z,RȨR¦.]<ùòëq MÚ,…¬Iˆdàáu)dU^oM‰.d÷é…‚EŠ¢M‡NzEönÝ´{Ʋ‡ÿ#ÀÃëRÈ:ðÌ]ÈŽ2?dÊŒ.¿ör”IÄ®]½Kÿ[/¤Jâ!<¥mÚ¸Þ#e Õc‘YEsgÇÞcžº9§“w¢I!Ë‹˜¬o <¼.…¬%HëüYÑ…ìÄÑ#‘Ä9 zõ¨ó‘ŠÚü#÷cáœÙX³Å]Hÿ”:ÅCxJÛ´q½‡h‡ Z=)däÍœg®ø i²dzC“6K!k"YAExx] Y×[S¢ Ù¿¦LħŸ0pؽ "{O{žÀ¤±£°e×>EõE­ÄCxÅ@ Y YYÓ$ÇM¿ ˆr^dß¥å™ ²®¥ð𺲖¢­ãçE² fÏÄ“à Œ;AÇ£½é—.^À}Ç®ÃÇ…ôO©S<„§´M×{ ´z,‘¥ƒô3§J ßçoô8~Šl–BVL²’Jððº²*®ÇfD²KýÛ7|0~Ú_z“6ßð¾ŽîÚâЩs&ëŠ\‡ð4ŠÃ}• Õcqx!û6$…seÅíÇÁz?E6K!«&YI%xx] Y•@×c3¢ Ù5+—ãìéS˜1w‡Ç¤ÍîÝCó†?ãä¥k&ëŠ\‡ð4Šƒ²˜˜Ìzùâ]× ç¤IñôI0*—.+wôú]$jOÞ¿~ Cd!kü;3™Æ-Uê4ìï‘/D D—´zuM÷vó𺲺nó]Ènݸ{wíÄü—™’†Ÿ ðGíJåpñÆ] [i}ÓxÏúÖ˜ÕÃ=:† Z=‡ŒÈ.ÿwF ꮿýŽ]º¡aê8zæ"fLžˆ•Kc½» ëür„†µ«ƒxfüÔ¸áãÃnöª]¯¾Ó°ýðömèfH=—iÇaÁ¬™øsüD+^‚Ýìµdõ:§1ÇàØáCtË2e¡{¡d±5<¼.…¬­GÇŽýQNåô‰ã1nÊtö-Û dœh÷ôJ”.cG -ïzÎŒiH•:5Z¶mÝ;¶cýšUDLضy#æý5«7mÕõ·ìsgNcûæøcä„~ø:»ÒûÁcÐØöýµ¦Ï]@„l9:j‡ð4ê–²SfeJéL7#âóçÏHœÄ!!oàää„lÙsàðéó¦×üïwmw]õ+vlægìØ±ñîí;„~ ÅŸã&¢}箚÷!&_<Žby²#nܸøò% ‰'{òƉ®£¯V³6Vnجkÿôl<¯K!«ç‘æ´ò¸òdJ‡ ¢R•jصÃ=¬®kC§Cûö 44^7ï"eªÔœ­j«úâó0aôŸˆ+6jýü3èõûó§Oáëû9såÆþ§µe0§5·oÝDr¥Ù§kã&ؾe*V©†S'ŽÈ×ïEg‹ú¯ÎCxõ–BêÕ ÕcqȈ, Ô˜aC°tÑB|øð!|Ü’8;ã¿Íî(QŠ.kÓ)[´ãQã’$‰3núêß9tqÎú5«ñáýûpè5÷½‘;o>!|Ô£<¼.…¬GØ›‡ìÕ+–²E›(I¼}óu—m“æ-1ûïÅ´¬G çÌ‚'ÁÁìŠ"ÀK–<9»>²RÕêÚ1ÔLKºwh÷Í›ØÓ‰'aQ øñã£]ç®5a²™­ê÷1ÂÓ¨—wԠׇ²”'[$W6„†þ_ÈÒµØëÝwjtªñ›EQÙ½ó§O¿rN’$6zœî£±$(*ûcÞxo$de4–ž¨ý¯;¤¥#™ØÛ7o‚ºƒˆÀÀäÎ7oÞ@Ú´éà’6-Ò°?Ó!gîܨ\­zxb¸Úƒf«ö(*›/K|üø1¼KAç½oé>kpˆˆ·Ï¯]ñúÕ«p3düç®ß´ÌVíÇð:Ì8 D¢Ýëæ=$O‘ª}k±qÂÓ¢ý¤ÕèÀ(1«G‡¶,uÉðÅò€çᮩ5ŽÊŠ5Œ¯qTV¤h¬žµ¯;Œõ¹~ {wy`ÿ®xðà>ºté‚ĉ!]ºtHŸ>}„?àïïßô÷·o±hÑ"dÍ–5êÔE­º?ëöµƒqTV´h¬˜*—.Ž›>Þ쟉%”YsѸYs%ŸKº¨3jè`,_üOø+Í›`ÁÒº°]m#yOí¾Ujï6€Zß­JMÚ´‡ÈÊwnßBÝÊðúõ+¸5k9‹þµ)ø¶èÌ•¥/Ï"Ec ØGeõEëððºðBvÑü9liüxñáÚÀ \]Qº´ù¹K§NÂ6wwlÛº Ÿ¿|F›ŽÑ©ûo¶àÕú0ŽÊŠ5€tæÔI´iÚˆEe“%Kï‡UÃO+ ý" è vÊÉÛ}ä²çÈ©ÓljáÙÔ0åÝP Z=‡²4`nõjáÌIOÜô DÂD‰ô8†&m.U(/ž=y‚ÛþOLÖÕcŠÊn\»»ÓeJ4­ÃÃë Ùu«Wb¨hÕª~ïÕ Ù²eS}mÝ»w3gͺuë0tÔX4mÑJõ>¬Õ EeW,Y„†Mš “«&õjãô)Oü9vºüÚÓZPÚ­ÝÙÓ§b攉ø±D)lôØm7;ìÝ1áÙÛÖhú—BV££Ô,ºœ„Efë7Púˆîê]¾tïBÞ¢ôOåtg»ƒé5¼çñcpm䦤ºfêØLëÌœ…uëm§uxx]8!»Çc°?•-‹)S&ÃÅÅ%Ê wüøqœ\]]ѰaCv^ q!QL‚6iÊ”˜6G;·I‰°hM} ˆî£èþ™ߘ~ÏCx–ôcÅgo¨@¯»…²‡öïž];Ù> —4.hß¾œMî¯xùê–/[ާOŸ¢zº,ÈQ¹P¡½"º"ùçZ‡‡×…²ïÞ¾e‘©ysç NJ5‹X&Mš„½{÷"EŠL„Òý·mß¾ áçÏŸ³¾ ô]3îÛ·£ÿØwâ4;ÉE¤E~¢û(ºj­ ÂS«O•Û‘BVe@ÕjŽnœ3} 2gÊŒ ¾~vd̘‘»ùG±ÏŽmÛÜñðÑ#ôôhƒ¦Šè>ŠäŸ#i^×½=ö ~q­‹Ë—/#GŽxáŸþÁàÁƒÑ½{wLœ8QuΠ¶/^ŒÉ“'£sçÎÚ¿yó& .Œ­{ ˆ ¯)iÑF7`¢û(ºj/DÂS»o•Úó@É•$hõX„‹È>°FŽ@Á0}ú4dÈAµq!Q;`À@øÜ¸¡£Ç² MìQD÷Q4ÿMëð𺮅ìáýûØf—Ó§NFà«W¯â—_~Aùòå™ÈLž<¹ÕxâÙ³gL,Ÿ={kÖ¬A¾|o)Q¢$ÿ9å+ÓUêÖ+¢-Ú¨ÝGÑý³Öìç!{ö”]ÿüßêÕ¨\¹²ZÍšlçàÁƒh×®=ö{žÆoÍ"º"úç¨Z‡‡×u)d)Ä>vØßEbÿøãÐkÚ˜e¯Ò¼ys–â0~üø&PdvÜô™ª¦ˆ¸h#›è>ŠîŸ-Ö!áÙÂ3ú¸NG‘øzƒ‡þŠî#²žÇŽ¢[»V,EMÍ4¥CIŸ[… ²µ­v¼•è>ŠèŸ#k^×¥dçB92#$$$G´mÛ–D@¯ùí]&L˜ŠÐÒM`Æ…6~Ýô ]'jiqÑFÆDtE÷ÏÒ9®ôyÂSÚ¦ë]Ð Z=] Ù»·oaÀoÝqò¤§Ý±/Uª4fÿ³Y²gWÕÑ}Ñ?G×:<¼®;![®X!ìÛ»'ÂÆ.±E‹E¿~ýT]ü–46uêTvFí’%K›aÇw¹6À‘³-i".ÚÈ€ˆî£èþY4Á9æ!<ΦmU] Y[!©ú29mÜhMˆXƒi$f‡€Re£>·œ*Ñ}Õ?G×:<¼®+!Ûï·îhÛ²y„#¶(€ŽÒÒB$62ÁPzA;nܸð_Ñõ¶6mÁÔ9óyùˆÕuу!º¢ûgÖĶà!³ k>z%Ö“ ÕcÑeD–Òz*•(Š'O´wå*mP>}ÅÇâœYÑ}Õ?©u^×¥[,¶¬]mÛ¶†=mìòðð°kN¬©OÚøåææ†fÍš…W­[ïg´hßÕk}æmL퉺h}ÝGÑý3µ¬ñ{³Fÿ*´y@ $hõXt)d‹çˉsgÏÚ%'ÖÔ ?|øåËWÀé«–d!º"ú'µÎ×ÕÁÃ뺲•JÃv÷má7vÑ[t3ו+ô íBWÜnÚ´)üh®k×®¡i³f8pò—á".ÚȈî£èþqMh•*óžJ]ªÝŒ²j#j¢½?úôB‡¶­mz:¯‹Àªµë1aúLÞGY}Ñ}Õ?©u²ëV¯„×é“X¶liø‚¦];wî´é[f± €;wî qãÆ¸téRx­[·A™JUàö bLQ­±ç¢û(º¦g±uj d/h@ûßÊ£B]Ed鼿e çcÏžÝÖ™*¶Z­ZutëÝ8Ï!ÝGQý“Zçÿ‹‡‡×u‘-’++®^¹æ%ÝØuþüyüý÷ß*R†u›êÔ©Ê•+‡Ž;²Ž?~Œ%Kâ¼÷m“‹ºhÝGÑý39‰­X‡ð¬h†%MÓ7Ü6HÐê±èJÈÖ,_«V®°êej "}ÎuîÒ;çjRtEõÏѵŽñ$çáuÍ ÙEóçàyPþš1#ÜGÚÜEÇ[YóÆ..ÖPP™6Э_ÁÁÁáµ{õúé3gE‡n=blAÔEkì´è>ŠîŸ‚%`µ*<„g5#,kX YËðSü4]ÿ|t߬YóŸâgì]±iÓf¨ñsÔoÔX‘)¢û(ªRëDœÞ<¼®y![¡xvÜV¶lÙ˜—“&MÂË—/Ùí]z+DÚ´i1`Àfú­[·Øq\‡NŸÖQ­±Ã¢û(ºö^‡<„go[£éß @;ÿÏ=Ò¨¡Ñ˜¥›ˆlµ²%±ß^MnðŠnÈiãW½úõ±÷Ø)E³BtEõÏѵNäÉÍÃëš²>ׯ¡Wç¸zõkêXXXªU«ºÒO…ì¯Zµ*:n~Þ|ù°håäÌ'J—D]´ÆÎŠî£èþÙ{-òž½m•BÖ~#phÿ^¬øg!vïÞe?#Ìì¹zõèÒ«*š¸æ\tEõOjï¯kZÈΞ>NŸB1áÛu¯›7ofGmÑ z- 4å˺ºº2 Œx‰“â·>ß_æ ê¢5;Ñ}Ý?-¬CÂÓ‚½QØ@7¤t@‘Y=]Dd‡öïƒR?E1§riqæÌ™ƒK×|0vÊ´ÍÝGQýst­Õ¤æáuM Y×ê•1wÎl”.]šùÙ¾}{T©RíÚÑ[8}–ÿý'OžÄâÅ‹™'Nœ@ÿƒ°e÷þïuÑ;*º¢û§…UÈCxZ°7 .èÀ²+ÿìçœ.„l‰ü¹pæôid̘Ñ~H™ÙóƒP±b%œºâc ¢û(ªŽ®u„²O‚ƒPí§R ÷1eÊ”ì(+Úì¥×B›½èè°   pR¥J…c.#EŠ”ÜuÑ;)º¢û§…u(…¬ÝGAóBöÊ%/ þý7\¼HßôY *ŒYÿü‹| Fé€è>ŠêŸÔ:Q¯G^×lDvãÚÿððÆ»Þõøñã2dŽ;¦O2²ºlÙ²øë¯¿P¦Lö¿ ‚Ì9ó QSº¥òkuÑžè>ŠîŸV"áiÅæHvÐnÏ.ôª²4/dÿ™7ÉÅGïÞ½5:L›5mút¼ÿ têþk”•E÷QTÿ]ëD7óyx]³BvÒ˜QH›2†Êüœ:u*'NŒ_z›¦íÔ |§?¢_¿¯y±cÆŒÁË·0`èðp#E]´Æ£ º¢û§•ÅCxZ±9’tÅ_7Ñ_¢Qÿ™¥y!; gT«\1üomõu‹-ÂQÏS˜2kn”D÷QTÿ]ë-d#OZºH B… èÐöDè»P~ìéÓ§AÄD%*‚uÑœè>ŠîŸVV¡²v Í Ù¶M¡_ŸÞ¨S§ŽÝÁ2×€;v`îüXºvc”Mˆî£¨þ9ºÖZÈFž´uëÖE¯^½tMD†óððÀ‚ @ÄD…þ={î<,[÷ÿÓD]´Æ“VtE÷ÏÜdµŸ@Èž@[é)2«Ç¢y![»âOX¶t Š+Ž/½£ý GEÑ¢EÙÿÓ­‘ݺuÃîÝ»Q«V-ö6l`oÏœ9£xl¦M›ŸðM½ŠŒ¡â… бSgì:r"ÊZ¢û(ªŽ®u„²‘'-ÐÒ¥Kà ‡œ÷óóc9OÀ§OŸØÍY£F‰^s m&9r$V­Z…sçΡyóæ¸}Ûô5²QõGy½Ý»wÇÕ«W#üš©K—.ìš]*Q”¨‹ÖÑ}Ý?sטÚÏ dI!ý€­‹æ…l±<Ùáuñ"Ò¥K߯£bÅŠèÓ§ûÿúõëÃÉÉ ™2e¼yóØÿ‡§OŸž}.(-Ö²þþþø±xq\ð¹¥¢û(ªŽ®u„²‘'-ÉÅHDD¯‰òäÉÃnùŠ?>öìÙƒ¦M›²z¹råRÊ9êíß¿ÇÇ©S§ðþý{<~üÙ³g7«­è„,RñâÅYÛT¢"(Q­1¢û(ºf- +<$…¬@åkRóB¶YýÚ8väÈw^QZ½Ûºu+Þ½{‡¬Y³² kj×® ºQ‹ }–¬Y³%J”Ÿ8sæLÄŠ ... ýyóæe7NßSЂ¸6ô"²$ˆ.\È>ŸèfÇ?ÿü;wîdüäÏŸsçÎÈ“$I4lØÕ£·u†c'®P©Öoßåèˆî£¨þ9ºÖZÈFž´t~¬ñXä|É’%Yò¾ñ×Û·oGáÂ…‘%K&hûöí‹W¯^±oÙtêA“&MX¤•^‰°£°f̘ÁrpéÓ£GP¯^=v•¬!"Kß°éÕ‰ÛçÏŸ3Z»v-~øá‡hû‰NÈ’í‘ý‰LP¢.ZãI+º¢ûǧu¬W[!{@/Êß][NsZÖ¼îK¥¯¯/Š):‘-½õ£‹wHœ’x¥ÔƒR¥J±`ùݺuk¶¿)½µ£º×¯_}>PZÂåË—7n\&pIÈ,XëÖ­cm“X={6{·dÉÄŽS¦LaâwÅŠH ¦OŸŽ®]»²ß‘X6.æFdEñQÔ1tt­#´Uò-…Űù‹DhùòåA7g%Mšoß¾E¡B…àîîÎÎm}òä û†Kß„_¿~ÍŽ¾ºrå KG ùûï¿QGdS ˆ¨¨U„ ™€¦(ñ°aâí‡È1ªÔK"²¢M^(šT^ IDATQ‰É°0E÷ÏÅcg²§Ð¹P$hõX4/d£Jó1MŸ+W®ÄüùóÙçq;1Ò¤IÃ+åÐ’ð¤HjHH›†BB—Û¶mc‚–>K¨ÐçÕ d˜"­TjÖ¬‰[·n!Y²dìß”GŸ'gÏžeB–Úˆî  99²"ù(ê:ºÖZÈ*É1@ß|é|Ùƒ²¨í¾}û˜X­V­K=0”/^`òäÉÈ‘#‹ÌÞ¿ŸýŠk›6màíí£¥oÎË–- '*ʧ¥ç¢ë‡nQ3GV$R"_D%&Ã8‰îŸV—²v Í Ù˜6^4ˆÝöEº(ZJâ•>Gè-]¾CÁ777–rFéÆB–¢¬‡f 2Pš€AÈnܸƒf›”)hBmÑgEË–-Ù5åT(àòæÍ–¦@B–ÚH:u”jÉ©"ø(ê:ºÖZÈšÚÉGQMJЧ×;ô*ÇPzöìÉÒš5kÆƒÒ …ž¡oÐU¥WD$€ BÖðï˜"²´é‹r DEÿnÕªU´ýP*BTBÖÒS D %ÂPTb2Ì7Ñý³»|úf€Bö$€¾(2«Ç¢y!Û¿gTæY­ôYBû, 'P¤”rcé?EBé-Ef)pAuHìþ÷ß .¦€E`# YCŽ,mì¥À ¥¢Q*¥øuvvfç¢Sª¥1˜²¦Î‘ÝGQýst­#´5u¶ å¸Ò t±}£¾qã–”3Û¢E äÌ™“}«¦ÿ#ÑIÉú'Ožd¯‡¢²D0Dj^^^N- ¢ŠJÈÒ·øèúyúôi”B–‰^%QN•¨JÔEk @¯ßÒu!d‡è‹’E Gx«§…ù«ÄJa¸â}c&O±ºè>ŠèŸÔ:QOi^w2±ˆ² S¤³*Yl êpžk*˜3k&;… µU©R%´oß^AWÚ¬BùPtlåÅR¡ôƒƒÿÀæ]û¾3XÄEÙIÑ}Ý?-¬2ÂÓ‚½QØ …¬ æð}X¶p>öì‰úB˜`vÕªUG·ÞýP¡r•ÛÝGQýst­Õ¤æáuM Ù93¦",ô=&N˜Àüܲe ;ïÎåÓkquue×ÓÒUˆT„ÎÉñkï¯ù²ÆEÔEëH>:ÂÚ{-òž½m¦ÿc†Ð÷ZÚgÊ,®…©Æ¬ùûªeŠcïž=ºJ/ ½ ?»ºbßqeÇ ‹î£ˆþ9ºÖZÈÞôñFömpýú×¼ ºM‹nÄ¢“ôXhÃ#h|CYîŠèŸ£kȳ›‡×5/dÿ]8Á~¾˜5kf¸Ÿ´Ù‹D m’ÒK bg Òf/Cùí·žÈ”='Úué£".ÚÈ‹î£èþÙsòž=팡oÚ‡0ŸZÑŽ3º‰ÈdGÀâ¹³±oß^í %UªTÅoý¡\ÅJ\¶Šî£ˆþI­qŠóðºæ…,¹ù.âȦ¸V¸*GÞ¨F‡g—)Sg¯ß4i‘ˆ‹6²Ó¢û(º&'±+ðžͰ¤i)d-AÏŒg‡ôï¶-š£jÕªfþŒÑ£)ØòµlÞ²[·ïÀä™sÍêJ´E¢û(ºfMl @È0 Z=]Fd @ß¿w½»t™3ö³$b,[‰LYÔºƒè«—¢û(šRë‘5NÅEá±c;èu½¡Ðôïéºrm”‰'âÁƒX¸pa¸A”áÖ¤ žú®¬9ÖŠ¶h£Â@tE÷Ïœymî3ÙÆ A«Ç¢k!K€Ÿ9é‰v¿¸áòåËÈœ9³ÍÇ€rbéT›5[w¨‰ì„è>ŠæŸ£k^×MjaQ~øðy3¥Ãû÷ï#¬ÓŽ;"GŽ ­½ Eb?~AÄ’MqâÄÁýàˆ;¶Å&жh£DtE÷ÏâI®°ÂSؤ­«I!kkÄ£èÒ~j”+¥K—°‹klUèt‚®Ýºã€ç‹sbMÙ,º"ùçèZ‡‡×u'di¡^ºxÃû÷Á¹s/>|8;_–rgíU('¶@Ò È–¢E‹aêÜ(X¸ˆj¦‰´h£EtE÷OµÉCC<„g {Ìèc?€‰HÐê±è>"k ú°þ}ðàîL™2Å‹·ÚxÐeƒ F¶Ü¹1~ªyGl™kœè>ŠâŸ#k^×¥¥Å{üð!¬^²[·n‰°–ׯ_Q£Faûöí,Bk«Bº^½z ”ã]Ô¿kƒh×¥~â<ÔZ©í¢,Ú˜üÝGÑýS:—Í©ÇCxæ´oƒgö « IÐê±%diŽ>„‰£F gŽ˜>}šªé÷ïßGÿpïþ 5–û²µ&ˆè>ŠâŸ£j^×­edsè ¦Œõ]d–Žæúå—_P²dIv•mêÔ©ÕZûßµC7v <˜©µfÍšð#¶ );bÜD«‰XC?¢,Ú˜JtE÷ÏZ‹‡ð¬eƒ…íJ!k!€Öz|û–͘;c \Ò¸ AW¸ºº"K–,ÜÝQ,W¶msG`pú ‚z r·cD÷QÿQëð𺮅,-j ½7¨Y•%éçÉ“'Â:_²d ™íÛ·Ç”)SàädÊ]å4ñå˶¹lÕªUL,SÆ…6v.\»W5À”…",ZG÷ÑÆÐÔóüž‡ðxÚµa]º+u*´z,ÂEd#ÂÑC±o×NìÛå¤I“¢}ûvìÏôéÓ#C† ìOúñ÷÷g?´G‚þ|ñò%–/[Ž7!!¨Q».jÔ©‹ •«hrŒE÷Qïþ9šÖááuSÊŽ¾zÒõ‰jb eIúÓ¦M…kýúߑĴiÓØ…D<ôš~Ò¤IÃM&ì[µ»»;^¿~úõë£_¿~ßµ³iófP¾.]x ÆÆ.nCÙ}â’xõþáâchÎÜŽü á©ÑŸÚØ`:´z,Váu­á}í*<Å ïë @€¿?=|€”©SãÍë×H›6Ò¥O4iÓ!w¾|(_±2òæ/ Uw¢´+*>¸–&mZ¼zùÒIï>F域ŸoX„ ññãGÍúçHZ‡‡×…²†•8ð÷ßð,8S§Lf®" †ÊŸmÙ²%hâOdácøfM'$P䕎Ó"ñJB˜þŒ\(½`à ÁpIŸÞìsb­ÁvQ-ÚÀÀóa”‘.]z'‰7 À...Öý‡KtcHãöØÏéÓgÐý‡§¹sŸ‡ðÌíÃÊÏI!ke€­ÝüƵÿ±àÁì¿[»+»µ¿`ά° Œ?É”n°›–t|ÙëbØÀÞ=±çÈ ÍûçZ‡‡×M ˜."²Æ“wÿž],IÿÇb?²]§ôÚ'ªrêÔ)xzz²«n ¯ƒèOJO¸qãF¸¸¥çéZÜråÊ¡T©RQ¶åëëËvŸ^¾rCF徱˒Ågɳ™R:‡Ý zNÇ‚™š–tc·gCÞ¼AÑ<ÙqË/Èn6X»ãÚ•ÊaÊÌ9(\ìGkw¥ÙöyO£Nì@ÛÖIÐê±8TD6ªÚ¶y#vowÇ‚¥+ô8~Šl–BVL6«$ºÖááuSFwBÖ0‹6­[ƒ £FÀ­±~ÿ½×w›°Ô˜mtRÁÌ™³°mÛ6 =šþ¢F³6kCt!ûüù3”/V×îûÚ S[wTí§R˜»h ò(hë®5ÓáiÆèˆ†ì0 Z=‡²»¶»cãºÿðï*í^—néÄ’BÖR­ó¼¨Z‡‡×…²†)³ôïX±dû'¥Ðõ¶]5·?~ÛÜÝ™x/Ú´ï„v]º™Ûœ]Ÿ]È f…Ÿàuó®]q¶fçJÅÒ5ë‘3×ÿoº³fZl›‡ð´h?)d5:0JÍÚ·{'V-ýË×mRúˆîêI!«í!MëððºðBÖ0õnß¼=;=°÷Nܺáƒ.]»!QÂßí:5Þyj¼û4äí[,úçäÉ—Õk×E­z?#GÎ\ÚžÙ&¬]Èú=z„†uªãìÕº§˜Œ/S$?ÖoÛ‰ÌYÕÚ©?¨xO£Þí0ç› Õ¨‰1šåðÙ#÷cáœÙX³Å]ã§Èf)dÁd÷J¢h^w!k<»è•óáýûpçÖ-PÔŽØ@ ræÊ…Û·n±ÍAiÓ¥ƒKºôpI›9sçFåj5}©Ró'guãlÔáÙÈ$Þn¤åELcõÏž>…q#†bÛÞƒ³L=s¤UKÙ’ixx] YÓx [Ct!{õò%ôû­;ö;)ìæÍœg®ø i²dÂúhÊ1Â3Õ–~¿À$hõX>"K‡ÕÿÑ÷wvލE YQGV›~ñðº²ÚC›X%º½xþ†ìƒGm‚§=:Éž.®Ýóeç!;já!Dãz5Ù9²Ž\xO£8m°€^“¹>"ŠÜ]Ø "¢)dEYmúÅÃëRÈjs mb•èBvõ²%ðºxSg͵ ž¶îäîÛhÛ´1Ž_¸lë®5ÕáiÊðÿ³ÀJ$hõX^ÈÒ eH–_¾Õãø)²Y YE0ÉJ*!ÀÃëRȪº›]È.]ô7nßðÁøiéqxLÚ|Ãû:ºwh‹C§Î™¬+rÂÓ(RÈjt`xÌ¢£ðè‘8qâð<¦›ºRÈêf¨„0”‡×¥bÈÍsBt!ûϼ9xìç‹Q&›ÆŸºrÉ ý{ýнG=5n©uÍã!<ëZbv뛬@‚VEFdäHŸWïcÆæ/_¼ø1y²dñÞ¼y“ÄÒ6?|ø/vìØŸâĉóÅÒ¶Ò¤Mû(0 ~ܸqÏ?öl>€£–¶©ày)dΙOžAê4. Ó_)dõ7fz¶˜‡×¥ÕóH[h{d!''SSÂÂN­üø»·oÃ_íM7ñâÇCŸX¹WÛ5O— 8'MÊ:×®ô}ô¨•ú=EhÑ!…,»uÃztèÚQ".¸ï;Œ 3bÜÈáø©|ET­QÓÊÐ[¯ù?bÞÌ(_©2J”* c!ë}í*öïÙÎÝÕu*Ŧuk@W}7mÑ —½.† ìÝ{Žœpzóú5Î…vº KZë,[Ž^7¥Z² ÷–YUÂÛ! O%ì,næÔ‰ãèß³&Θ‰ŠUªÁ dO{žpÔ§&N§ÿ¯jq?öl J™([¾ÆLšÊ¢•)R¤Äo}úaÚ„qðºp«6êõ„£¯¨þѯ7®^ò¬¿ãÁ½»Xò÷B¬Ú¸[6¬Ã²Ecá²UHŸ!ƒ=‡Àæ}óž™Æ%Èž#çíåk7fÌ‘;·™MØç±-Ö¿Y¼pÞ©‹çÎÖ°¢Éë¯^¾DÁì™@€¿÷Á¶ÍѪmÌš>…‰£µ[¶£ôO嬻õ›nß¼)Ž:€¼ù àÇ%ÃBB^#8(ÈéôIOdËžûŽŸ²¾VìaÚÕÔ»'’&OŽŽ]»‡íض%K—q¢oh\>}eÅÞeÓ1!ÀÃëRÈ:Ø\ú!EÑK—>núx‡åÍ_ÀÉÏ÷(Ò÷èÙkÄŠK׈Œ6Kÿ¡¡(Z¼âÆ z/^„~À£÷ñîÝ;öÁrðäY]ûgŽñ<„gNû~øáÜž£žÅS¥JmÎãvfë† o&ùsÛÇZ[ɇ²„åŸ ÄŠ%‹Ù›,â˜ÏŸ?ãmHòæ/ ÄZ¤KWÊ-ˆ÷ïÞ±ÈkìØ±AÑÊĉ“`óÎ=(T´˜•¦”íš-’+èŠá„ "nÜx ýÀ¾ˆô4½¶!²§ððº²6y¦Ž‹y³f ôÃ$Hïß¿Cüøñѱۯ1v¼îÑ ÚtA¯Åˆ”èUë‡؇Œ(‡•W(QwnÝdc•(qböÁ)Ò ï$ä!<Þ¶“¥H1¸GÏ>#00!ï³Zªßö—&ûwïlà„ìrX!KQ»ŒÉG€4‰³3»M°z­:V€ÚöMþÚ©=è–DãR¢T¸ï;h{c¬Ð#ùF§¿PZš¡ˆôyaÈlÒ$¯K!k“!ÑV'™R:³È¡P4A„h¬ÁŸÞÝ»€^Jâ$I0lô8´ïÜU[a¦5Û¶â÷nXÖPªÕ¬•ôzz“™@|{Œ‡ðx{J–,Ù}÷}‡²äÊ“—÷QMÕ§W¥FXõüùó6V0Ìa…,ai §Ïç½oYfû4i•% DüÒlˆÊ’$be4Ö>s͸W^—BÖþães Œ‰W¤h¬HÿÇQþÇÂx÷îë7ìä)Ràú}?›ãlÍi‡ô“à¯÷º“Pßü4²dËfÍ.5Û6áq:‘0Nœ8¯>}¥ûî/_¼€¦®uo¾~õ*'Jª;´%€²¹¤`o~èõûô9óѰI3%¸é¦ŽqTV¤h¬aŒ£²2«iÉÃëRÈjcÌln…!*+Z4Öd§Öͱk»;û`™6{5ýÅæ[³Ã5+—cÄà,­ ¡[SÌ_²ÜšÝiºmÂãt$sÞ|ö5ªS›<öèþ¤‚èÜ%Rjܬ9*T®¢}U[¼`^½z‰~ƒ‡êËp•­å!<ή¥U—õ{ôófNÇí[7pïÎe=ÈZ‰iÒ¤Aü Q¶BE ö'׳Z¨ÌÃëRÈ*1I¼ @’U$"`.ñò§‰RÈ*L±½uí7ÀÔ©SP¨P!$K–LY²–D@"À…•v÷î]öÓµkW\»ïÇŽÓKááu)dMŒª$^½L{i§Þ0—xy#)d•¦HÈ^½| ½:w€·²Ve-‰€D@žF­º?cÀÐáprr‚!"»mÓœ8z±bÅ‚“ØïfÌÿ÷îÜA×¶-Y_ºÿ†ßúô‹€¥ŒÈêoqmݺM›6EªT©Â§yU­Z5,Z´I’$QÕ©qãÆ! sçÎŶmÛpýúu 2$Ê>ȶ©S§ÂÇLJ}¹*W®ÆŒƒ‚ ªj“lL=¤uÀsdejÿ’ÄË™|"z”/Ï7wN¼cŒÈÞ½sqãÆE臈7.*U­†¾ƒ† ÁBøwá|\öºˆó2±:oæ Üð¾ŽÙ/Fë&P¤Ø8lž?×U±vËvü9d ªÕ¨…–í:€„q—¶-™˜mѦ]!»rÉbð<ƒ„‰aú¤ñxìç‡ésæCFd9GWãÕ‰O‡Ž«W¯†[úüùsT¯^¿üò  ¤ªÆB–ú¥èþ¤I“¾ëƒDôرcñï¿ÿ¢jÕª¬Þ’%K˜è=räŠ)¢ª]²1uPʧêôfy+<¼.#²2"kùŒûÖ‚$^Õ ” PJ¼<„Ç ¬¢Ô‚÷î¡uÓFLpþÚ»/ë¢yÃú¸w÷6’&MÆþMö $ÀÎCÇÍ%<½®EÈw¥H[Îô©‘5{Žð´„woߢJš;yZ!àÿ£'Naí^¹ä…-šâÜõ[RÈr®Ö«GŧwïÞEíڵѯ_?tïÞÁÁÁèÙ³'nݺ…ÏŸ?£Aƒ=z4‹Ô:;vì`_¶Ò§OeË–!uêÔ,‚J‘Wú;ú÷“'OX$–þ¿uëÖhÒ¤ ‹î÷îÝ;‚` EÆŒ±zõjÔ¬Y3„$dItoß¾‰m²Ú¡Bÿ&;6lˆ‹/¢oß¾xõ곓ž£zÆBšž¡“]3gÎŒÑO­£VìSʧZ±—‡×¥•BVµy+‰W¯j“IGB–|¾|ñêר‚õî;Qú§rhæZš4C‹¶í$$JCBÞ Uê4L”?é3d`¿£ƒT©R£pÎ,8|æ²fËÎþŸ¢µqãÄEgçBÖÿ±ÆLšÊê\8wÝ;´Á™+>RȪ9ù4Ðñ©››œ™HýðáòæÍ‹-Z0qI‘þÆ£nݺèܹ3‹â“ $1[¥J”-[¾¾¾L¨’(,Y²$jÕªeRÈ’ ."{åÊ+V oß¾E¼xñ" tìØ1&TŸ>}­%ñ[¨P!¸»»£@L¨–.];wîĆ ÂS" ÙèüìØ±£FJ&H!+S ô1Síl¥$Þÿ YI¼–OF¥ÄËóÍÓ*EYC›þ1ÇÂÞc'ñϼ9pß² ›vìfBtH¿Þxñâ,YŽöÍ› hñè3ð&Vk”+U·bÜŸÃY”vòÌ9xÿîÕ©Ví;¢M‡N„ìÒE ±ç¨'’'O~¿uG¢Ä‰1~ê LŸ8/_¾¹Æ¾ÊYΑ×@uãÀ Ù)S¦`ùòå8xð 2dÈÀò°'NŒœ9s†GñI`Ö©SÓ§OGÅŠÂ"¸$v+UªÄ¼2‘U"d©Ýøñ¿žØa({öìAóæÍaHˆ*"ëââÂr|óäÉþ­‹É“'³¨²!G×XÈΘ1#Z?gÍš¥‘Ò‡ JùT+ÞððºŒÈF3j2G–:Kâý*d%ñòϨžPJ¼<„Çi—}õò%Ê/‚n=G×ßzaÒ˜‘Ø·{Û˜•#W.L›3Ÿmö ð÷Çþ½ñèÁ&F¨nóÖmÙÿÔ·oÞd¸Úõêcè¨1ßmöÚí± ó§OQäÇâ˜4cËgNz¢C‹f¨ãÚÓfϋલœ#¯êQ½ájÔ¨Þ¼yƒ}ûö±9’(Q"¶)+GŽÌâgÏž±TŠâRjÀéÓ§qàÀ¬Zµ ôì„ Øï?~Œ4iÒ°”ЬÒs†Ô‚˜„¬!µ`ÅŠL0S¹ví‹®0€mþ¢t†5j k×®l³• * ÿþlãZË–-ñèÑ£p„ýýýÙÿÓæ1²kÞ¼¯swĈxýú5å1ù©¡Ò… JùT+Îððº²RȪ6o%ñJâUm2i<µ@M?yÚZ0{&î߽â¶¥TJ/øçŸ˜ ¤Hk¦L™°páB¼{÷ŽEa»té‚%J S§Nðôôd"ÄéîÝ»™È¤h.mتW¯H¶k׎EQ…ì¨Q£ØÊO\/^Ìòpi³Ey)ýruoܸÇ£hÑ¢Ì6Ê¥%qêííÍ졼ZŠÆR™¾ì·jÕ ·oßf¿;yò$(568q‚‰õÊ•+³öɆèüìÖ­›6KVH!+S t0Mío¢$^I¼jÎB¥ÄËóÍÓ>ÍÝì%…,çê¸zT|JîÐIôJ„# ¾^½z±H(Eh)Guâĉ,Š?lØ0lܸ‘EgIÌ’ØÍŸ??ËE¥[ú?WWW&0/_¾AÈ?~œåÚRЉÞÈ…l£t²R(âJ"›„'åãRš@Û¶mÙ†®Â… ³Èo‡˜}§NbÑYжÒ Ú”F—þMâÖËË ™3gf¹³ä YŠÔFç§Ž‡Ø¦¦+åS›Cg<¼.#²2"«Ú¼•Ä+‰WµÉ$#²jB ‘UNÙXXݵkê×Wÿf; ¸åH!+#²–Ï"Ù‚æÄ«¹!‰`RâåùæÎ鱿"²œö‡W—BÖ\ääs1PʧZñ–‡×eDVFdµ2o¥)d­48„lB:-ŒÓŒLÉS¤ð¾~ß/qtÏÉͳœˆÊê•BVFdUžR²9‰€DÀJ‰—ç›{¤>/H@Y .¸é'SÒdɼ|ú'7e«ÖIÈ&@ÛÜs~û3?€Â²Ø 5§?RÈr&«Kl€R>µµ]ÑõÇÃë2"+#²Z™·Ò‰€­#²Ü@ÂŽJ(€7tÔ&gc“&Kö»`Bvº¥¢®äï×ë¾–W¾^EÆW¤åÃKÖ–Ø)deDÖæ“Nv(pt”/Ï7÷(0Í €.³üZü€ºI“%;/˜MàIþ¾ÂÌ9gRȾyó&¬fù2t‹™©à‰™&ÈÇ$˜ðòò ëÝ·ŸÓÚmºŠ‡×M‘JGà€BV¯.æº4R`”/áE‚‹.‹o €ߢ°Tå6€\DÞìE‘gƒx§¿°À:9§•I!Kí5©W +–- ?¼Ÿ³Y]" °ºãȉ“3yš­ØîQ^—B6†q‘Äk»I+{’DF@)ñò€ŠßÄ+ سßÄ[ã¾õ@öoYÈ’‹oÐæ®§~@¹À¿(òMÐ’¨=ª`f*²;¶nÁÖuÿÁÃc‡‚&e‰€D@MÒ¦KÇ®ÏvI›NÍf­Ö¯K!Ã0HâµÚ• KL" ”x^)#ñzë›x¥èãóoF,ý–7ú¢°F†eΘ)Ó‰³Woü`ÒXWðóõ kX«šŸŸï£L‘L5ˆÙ~þúö»Tß-‰ÚÜÖ¶žÑ¸©HÈÒ³Û6cóšÕìûܹ©iY$k!@GLÒ»aõfwdÉFû9õQðz¸#RÈšSI¼ú˜ôÒJ10‡x£!¼BßÄk ÁFâÕ? ¤(G6-€4‘~—,~üø÷‚žÇ×;º×®\F£:5î¼yýšN*ˆ\>X C¿£ðM³oÂ6³‘¨=cTW±¥gvºoÃ’¿çÃÿ±BCi¿™,z@àóçÏaaaat“—)Ý w„·ÑÅÅW._†k#7ü>`rçͧ+Ÿ¥Uy¸$ñª ¨šûŠØqâ V¬X6êQvc æ¯á•1м~þ&^× tèJ\eœ@‚.BI—>ýǰÿË%ÿ, c·¶ªdö`µ)ãÇŸÑãàѸù R \X0gVXP€?FŽŸ$ùTÄÖ˜ORÈjl@¤9öAà—õÂzöí •«JâµÏX¥×gOŸ`ë¦Ø¶iü|¡ZÍÚX¿fõËïÞYãâ‚DÙsæºzüü%ý$—EBÝçÚ5´nÚèÐc?ߪV |ü äÈ™+¥ 4hÜõ5ÖÝ«L+a#L³RÈ 3”ºpD Y] “4ÒÚH!km„m×~È›7L¸nÛ¼×®\A·&hà֥ʔá™iqî"Å~<¶ëðqÝå<~ì‡5ªÞõó}D¹±1¥ ˜ {,f YãFÏœôd_l(¯6O¾|_#µÜ@©²Ø)dí?Žd¯K!ëH3ÃÁ|•BV~Åë"([7m@ÆŒ?0áÚ°IS¤L•ZyO•e#‘PEÈ7êyìè·Hí&*ZŒEiIØ&qv–èÛ )dí¼ƒvËÃëRÈ:è$q·¥µß(ßôñÏyMììyµÆæ³"B÷¬º5Fë衃pß²‰ ÛRe~bgÔ’¨M˜0¡Ð jÍ9)dµ6"bÛÃÃëRÈŠ=Ú;)dm;üïßg§ Ц-::ËpÖköt„©õ áYÏ ‡nÙªBÖÙƒûö°3j)Â_±rvF-‰Ú¸qé¦aY¬‰€²ÖDW¶^—BVÎaBÖúCày}úô ;m€¬-¯*å!<ë#â=ØLÈ£»w×NvF-Ej«×®ÃD-å\;9™úXsÈ1²Øi)d-†P6À¯›ZñòÔàeUm! …¬uÆãÅóçá§ Ü»sûÛY¯MQ¬x ëth¢U³‹âwj!k ë®íîáé?7hÄ¢´õ4yz(…¬ Á–]qÝØ(…¬œ0Â" …¬zCûþýûð[¶¼ÎŸ O(S®¼z˜Ù’²f§Þcv²Æ®Pêû– qûõ8¯&ìlbY,C@ YËð“Oó!ÀÃëRÈòa+kë)d-,:i€ŽË:r`ø-[•«Õ°¼a[à!<»UÒ)–% ç€sŠˆ;>N€ÏŸáË—À—ÄH™ö5ž%œB;ö;ÄŠý±c¿EÈ›[øøÞÀmw¾ýùYIÇ6®£)!kðýË—/á/Ú·7üâ…˜n‰³1nºêN Y] —îåáu)du?ÜÒèBÖ¼¹AWÃ’x¥ 5ì¨,·¦šŽhñžyˆ(~ª€JH’Ì “dÀó œHáòiˆ…ôY!}V ^ þ·Ÿx ¿þ›~>¼>¼Bßûóðòðä1àw÷žÄÁó HÞ ><«§[p_±uÖ«¨I!kìnhhhøq^'ŽaQZׯnÐÚ—2ë ‘å-K!k9†²åððº²Êq•5u†€²Êìð}á›¶*W¯ñ5úÚ¸‰òìX“‡ð¬`fS¤HÓ¯_üŒ.ŸQ Tä* ä,$¡lU.O›^¡¸qþB?|@¼økðêù:GUîMisš²ÆŽ¼{û6üâ…ógO‡_¼P¡r¥þ:d=)drØíæ4¯K!k·a’[)dcFøäñcá‘×bÅK†ç½&HÀÚC£jû<„§RÇ…àœ¼/Þ…´B¾QÁ51²çš;™Ùv= îùû׿Á¿÷ø‚yxÿf€`³ÛäPWBÖØ½×¯^}ÔnÙ„«—/ÃõÛµeËWàGAð'¤|€5æ¯K!«±Á“樇€²ßcyáÜÙðM[9rå ¼&Kn…è¡zCcK<„g¡IyÜebÇ**“¢lm A" ›Tññ`?ÀspÄý=âÄÙŒWmØ"§V·BÖýgÏž²3jIØÞ¾y3üâ…Reʪ8HúmJ YýŽ-çáu)dõ8ÂÒfEH!û¦ëW¯|Mؼ©S§ ß´å’6"µ^‰‡ðÌö%UÚÕCC´’9 šÝŒÍ<DIþ@Èë)VîW!kŒQpP`øÅ ¾„_¼ðc‰’V†R»ÍK!«Ý±Ñ2^—BVÄàÀ>ù=z„Œ™21" Ù¤KŸÞ!йsûVxä•n=b·l5nŠÌY³ ç?á™á|%8Å:·±Q¥‘Ûù‘µ³>Àëø-¼~N‡ü~°’5 Ycœü?¿x!((ðkNmÃÆ(\ìG+Á©f›Ö¯ƒBEŠaÄØñX8wvXP€?FŽŸä4còìß½ [÷@¼xñ´c°´Dxx] Ya†]:Bõ—û±Š—,͈wø þa=ûöÇÃû÷FŒÆÍšcʬ9Âåçë‹­׳,ïBBÂ#¯¹òäÖgrŒ‡ð¸€HáÒ©ÓÍE¯)É;×£šªüÓá3¾|¦oxþV°Mh!kŒ—ïÇl}Ñb¯^¾d¢¶~£Æ(P¨°`µ“$XgO›:õá§òñéó§° çÎ:…}ù‚&Í[â¯ùÛßHiððº²BNÇuªg—ŽØ¼~-’&M†ÄI’àÕË€“èLÉçÎ#Sº¬NœòôIpøi~~¾hؤ;m P‘¢â8iÂÂS J’ä¿#kž‰è1^CI°Š­ºâ`·Oxó27€{¶ùq‡²ÆŽß¿w—åÓR^-]BëŽDmž|ùU†×¾ÍeN Ÿ>~D¼øñAöãÇ ·‚sÒ¤ö5Nö.,<¼.…¬°ÓÀ1£Ü¶Ò…ò±ãRϵ!­üOPÞ¼~~Ú€÷µká§ ”,]Fÿxà!}úš6°i#NŸ<~Ú@ùJ•ÍH¨gxOãÉ7~fzÄUPWUüî³?Æ›çU4Þá…¬1–7¼¯Ã}ó&v¤eG¢ÖµQdÉ–MEÈmÛ”!*K½Êh¬m±wÔÞxx] YG%û9*«çh쎭[Øi{¯I(*["nÔ¬SO¹±ÇÂÖMXîk¹ ¿8бcÇÖ$¾Z2Їðb´Û9ùbÔlÑ UÝ´äžul™?ô-®i `‹ H!Ë "]LÂnÛ¼™²deQZJAHÆ…³%ÛU_8w6?ÆÈ “lשìÉaàáu)dvšˆï8s˜¿`Adøáë¹²Z+gN ?ëµ@¡BhèÖ” ØD‰kÍTMÛÃCx1:’ÂåÚ È<⟠À…C 𨇠ƒ+…¬ |µ›;oÞo—/¸!EŠ”´jÙ£W.y®°¾é}A D``rç΃›7o°ˆ²KÚ´H“6;¥á§ Q°0í!”E" <¼.…¬:˜ËVìˆí>zð¼¯]Ep`éæÊ•·nÝd¤›6]:Fºù B¥jÕ#g.»XL¯éÕ"E^3fÊÌ„kC·&H™Jü·ÙÖœ‡ðb´!^üŒý/’ˆwXÁw~{ÖÏ;Š—O*©0.RȪ"5áyìè·Ë6¡`‘¢pmÔ˜¥Øâ˜«Cû÷b߮ػË.i\о};8;;#}úôH—.]øŸð÷÷‡áÏ—¯^aù²åxúô)ª×©‹šuê¢rµ*!"›qTxx] YG%:÷ûìéSØ»söîôMb"Ý4iÒ0²5þ!Â5þ ²eËáË 5ëþŒuêÁÚÇVÝôñÆÖ_Óè‰Ä+ýdȨæÆq¨æó^ ÝäFòÔ‡0~m LÑÏ£þÂ0«ÿ=¼~‘C£¥UÄÈM=tÛÿ×ÞY€U•mqüv!6ØÝÝc‚˜Ø#vwŒŽcÇ<[ÇŽ±°»»»qlQ LÄ@á}k_îåÂ9pãœ{×~à=gïµûÌzöY{­ÛÄnmé²åEŽZ AH’Ô°©)ÊÜS‘•þ°nØ 4@¦Xø¦gÏža÷îÝØ¹sž>{†¾C† {¹1Øã×YÈÆ†0ßc6$`ÿ5iR§†³SU4lØùòå“mÏÝ»w±sçNœð}S§ X±È±­TPf×®]¸zõ*nܸ¡ %ÈŸ??h@j@÷–,YRl($Lùo¢k×®aȡȔ-;&Íœ-Ù>¾ Èñë,dùyQ<…³gbíʘ1}:5Š: ½ÒºpáÈqjC ÈéÞ»wOjP¢D ”/_uëÖrÎÛ¶mÃÀAƒÐ¾s7tïÓW¿Ä. ½ž{âýH6P¼d)I÷óEq' ÇáE+d$º·d¨ß1îF)½‡ÃCàuó¾5D@0 Y3­÷=»…ÿÙ½}+\4…ê5jüKkÞ¿‡ËaÝÚµprŠü›»»;Ö¯_S§N‰ƒ&Mš„‹“%K±±ÚøØOŸ>aË–-âí–³³3Z¶l‰öíÛGÿرchß¾Žœ½»”†xäÌœ‡59~…¬É–…Š ?»uFÑÂ1jäÈH·ïرkÖ¬}wuuN4eÊ”:áJNW?>ÖÏÏO8éƒ Aܶm[á¬#¶qãÆãÎýøgá¿Qš Ë6àyõŠ(R@Å ÊU¨›)ò=q$ ÇáE+d“&¿ŽUí‘5/P)ê?vâhª2n_9È’'ûWÄ×φˆ£`!«€•¥â)»¶oÁÞ;t…j׫¯³Œ’uoßZì°F # ?:tèPôèÑåÊ•CÍš5eψü*m&,Y²S¦LA«V­ÂõAáEŠû†-ì+eÓµ¾äøu²Ö÷|¨fÆuœ*bЀhÓ†Ò]†µÓ§OcРA"¼ R¥JB”ÊÉ·*ʽîØêçâÅ‹˜>}:*T¨nŒ•+WbÎÜyØsì”ø÷!^)×+ÂФÊrCÕjÕUp IDATÃÓR •ãðb²ÓvØcÞ0 L5 œüÿ3W<ãsö@ùš!˜Ô…¬âL¾ÂW…æ¨=zð€µuêÕÇÒùsqîÜÙp^¾|;vDñâÅ…ø4Dœ¬Å7oÞíðÒ›0ýV¶l9Ìùw9²åÌ)r|‡Õã×YÈZÍc¡ž‰ÒᨕÊaíêÕ"þJ¿Ñ_ùô—=‰OÚ9ˆk;wîœÅ9sæÄêÕ«ÃuwéÒ%tîÒ¥Ëý÷¥ÿêÂj¹Zðn]\šá~9O’¥‹f2åÜz™aFFòÇw`ÑH PYÀ¥)ðÞ—…¬0+­ËÀÀ@̘ô7¶oÚ€§OŸ†3oÅŠ pªI“&¡paÃÇñÓÎï!CÄÎl»ví"‰Ù&¢ìoá7”Æí19~…¬ùÖ‰Gþr…óãèÑ#È“',×ë“'O@1¯[·na†n{öìA‹-ÄA†Ì™3뺿}û6œ«¹àúýG†’û39O²¥ oÎ\ÛÅ+ÈZ3tsvåŒzN€®Ø Y3,„釤˜Øª¥‹ãíÛ·áïׯüýý±|ùr£E1³”‘6ô›½½=.üw—cf¾ê@Ž_g!«Î5¶X«;·nŽî]:‹S°ÚF±WÝ»w"3qâÄF›û—/_„X¦°‚jÕªéÆÙ¼e V¯]‡Å+×mlî8öä8b?ú l2;x iä8<ÙBV{Ã{_0¼H›(T(\°3_ÑHsyù¸u¸uxý¨ö;àü;`/ò´YÈJ{¸T|Õ°~}б]›pÙ h'6mÚ´&±Z„cÇŽÅçÏŸÃíÌ=zk6lÂijTLšM79~…¬1V€û”MàØáC8{ü0æÏ›§»÷úõëâ ¥Ô2u£Óµ”á@?v¬gÏ^pªåŠ*Õ8¹·©×#ºñä8¼X YíÁÁ€ç™0Á˜25P¢ :)1v9ˆeó ü<ø<>¾Î%ÖÄÀ’ÈÎ[<ú.YÈÊF®¦¨Øû¢8xð€ÎlЉõðð0I8Á¯XQ¬l5DÆmsq©Žî} ²“³š³­F& ǯ³5òbp÷ÒT)]{÷ìFÞ¼yu7P‚o:øecÓc*m 9WÑ!‰dÉ’‰WpÚFñ²MÜÜpìü9]ñµF& ÇáÅYÈFìà™à} xxK#,}Ÿ™sùJhvBS¦ìÓ†~O$N$HÄ‹ÿkSH¤_üo¿w±ê÷–ÒghDô»W@æ\ñœ«0»(&ƒtÒ,d¥³Rá•5+•ÇšÕ«tÅ(;ÁøñãE‘s·:uê`âĉºlW®\A—®Ý°ïÄis›Æã+ˆ€¿“BÈà$Cm3p¾A=(J1eÓº5¸zî V®t×™DE è4mÑ¢EÍf&Uµ¡Ø.*¶ m­[·AgüÞ¬…ÙìâÃãð .d#vüS³Kúæ…æ‹(‰Qú?æ3ª!Á@ü„@ÂD@öü€÷m€þh ú¡¹ I’é‰à´šŸ)¬Á!+!Kܲqã§à»©8˩ñ~ý:•Q½a2×¢zÓÖ´i3Ô¨×õÿn.³x\…ã×YÈ*lñ¬Ñœˆ.\ˆÿþû ,0;Žnݺ¡L™2èÚUsX†(˜}I" Çá]ÈJÅC‚—-}ý ÔˆÚ‰4»µ¦xÁBVêJ©î:—ßÊàÈáCº^Tì€ÌFL/hΉQñ:ÐK™b´~µnýú8äaº³æœ?39~…lÌ<ù #Xµl |}ž`挺QR¥JoooPzs7J[S @¼yóFgÊŸöEÖ<ùк½”25÷H_ŽÃSŒ•0/£^ÂBÖ¨xÍÕùñ#‡°êßE8p`¿Î„L™2rb¢Ø¡æE•+W¥UÔ¶êÕk kŸ~¨â–1ÆPãq?ê# ǯ³UßúZ”Å5+—ÇšUa±\”kÐ××Ó¦MSÌ<û÷ïlÙ²NüRã˜.Å,0DŽÃ3ˆýüÚD*@vPÓ:jÒsU Íq|h=ðÎh©yf×XÈ*nI aÐðýP¶dqôìÙStG•µ¨€Ì¨Q£ ѽAû ,”F[,aîܹð¼u¦†Ï7kÐA¹3Õã×YȪfY-ÏÐç>>h\ÛÏô*ÎT¯^ûöíC„ 3á¯_¿Š2¸‡ÒÙä˜1#öŸ8 ŽŠ±ÓZ ‘ãð *d§í’&(“ÁÛÀÒñ€[O Œ‹æ ÖÏŸ€]*e. Ye®K­*]0.^¸Ú…¥V«V- 85k*¯Ü2ùùùóçcïÞ½ÂVÚ­R¥*Îÿw'ŽøvK ǯ³µ„WéV.[‚'÷ïbáBM,,å¤^GŽQÜŒœœœ0nÜ8T­ZUØÖµk7ä+R ­;tRœ­Öf‡g!«íôô^àÔ.`øb@GöÚ)àÈfàg@»¹•ëµZOîëgŽÙÿ÷À'? IMõ-*)»qŽF “X¦´^Á!@»!À£[À¶EÀ÷ošƒaõÚ…ËË[v²òx©àêÿ<¯cèŸàÚµ«ÂÚo߾´k}‚ „}ñãk²x)R³ÿ]†… _2W±ذ( Èñë,dù!2¶Mc`¿¾ t,Ô"¾Â7›aQ 1ä2Ì_´+ÖoV’™Vi‹‡gT!K ¦ôæoЄ4ë Ììt¡ ? ´YcÛ3vTÀ`z`ÄÀ!pá@bxàl`÷ àµÐq¸FÔÎdÌ 4íŒët ä.¼zªéÐ }Xiå²1"RÛÿΟ û¤‰Ð·o_aú¦M›DIï7*v*Mš4o~ÿ]“­`úŒøöèÜ£—bmfÃLC@Ž_g!kš5áQ" B«Æõàq’²»iZîܹÅéÚ\¹r)Ž×½{÷Ä)[*“«m•*WƦ=Í’çVq€Ìh‡gT!Kydgôfî¿#ûíkhµ-ð¼| ˜² x÷RŽ0!´ô1íЮœŒ^Lî 4è,£1ùÄvàé \ `û¿À°…aSY2V³‹[¥ôU`!+•J®Ô»'\œª S'Í[¢aÆ¡dÉ’hÖ¬™bg@EgnÞ¼‰ÿýïÂÆ%K–àÔÙó˜:;¬0ŽbgÃŒJ@Ž_g!kÔ¥àÎEàéãÇhѨ.¼=—¼þµÝ·xá t¡©ò5{°¦B“žÀ¸@·1@®"€¯0í`À, céËýk!ÛåÂK €í:e!+’±/©]¥ÜW,×UÌ*Q¢¨,í¼yó°lÙ2qˆVÆE¶<~üXd  \Ù‹-Š•yrEo©–.]Š;w‚ªþõý§%­QÑÊÑM™`¨Ñï:wÁþ“g¤uÀWY,~…¬Å> ŸØ=»±cÓzìÜ¡ùÿÉíÛ·‹„Ý©S§V¬Ó¥ÙŽ;Šjõ4D“VmQ˵®Âi[¶y2^ô“N–Ð2Ô ZùB–ªoQ£Wÿêâ¦ÉX@M»#K1²´Ëúâ1ÌH•xrh3HSáW;²T(aÓ<À놦—]jͽÍÿ¼þÓ„üø¦IýU«PÊIÞ"G²-Ì@rÏd•Ø) Y‰ ŒyY‰|9qýÚ5888ˆaqíÚ5Œ9‡F¥J•°vmh JÖRÑòk±²ïß¿e¼iL‡BÆ&Ož,yš/_¾D©R¥ðâÅ qý^²T)\½ûPr|¡eá×YÈZæ# üY­Z¾Þ÷ncÑBM¬9ROOO*ÖéöèÑCìvtïÞ]ØÜ½GØ¥I‡º )¸[øúõëvÍ›ø¨(aš—$ ½ŽB ´‚v’&?!)´@ ص  Ôd!ˆM»rBS¦¶HyMz¯¥ã€ü¥äÅÁF7n˜mNéFØ…îÂÒ]ÄeE憾µ³Õû®ÿ3½Ñ£ßÓ'M–léb÷Õ‰CBBú,¾k¿‡‹Ÿ¡ÿoú×èÿ š¶Þýû ýƉ0Ž#üýÚ¾B¢¸V÷Y${5¶Çho”ãk8„›1Ñ»Vÿ³ˆcˆÏ@•Œ#Ï-J{"Rn=}Z·êÎÎÎ8~ü8ºté‚”)SŠœ²Tˆ Y2Úl ,JwHB”ü/‰IÊ?Ka^´nmÚ´q¶Ô¨8 }F©X ÅáÒ4íŽ,áææ&î£Ãf ¡b”²0^¼x¢:â¬Y³`gg‡Úµk‹l ÇŽýïÚµKØ©m•«VŦÝbó_ ßcAXÈZÐbZêT–.œ‰âëŠ Pì)9A üWªÓ­P¡‚H¿¥-Œ@6Ïœ5 I’Ð&7s ?~¼zý ;‰÷kcÒ‘ðŠðñ7£‘4ùpƒÙu35‡»ºŒrˆÊh°îà{€¦„mÞâ€[/Íî¯!Z˜%1JÂ^?qóGü$-EšRï»þÏÚÏÅ¿bÕjÕãÙØØÀÖÖFìÛÚÚŠƒºï6¶°‰øoú¿k¶± wÝ©¯Ðkml¢þŒ¶hôï?Óÿ¢Ÿ>‹d/)tºV’½áçvOdd¯–‰Ö¾(m e ÉÞÐ>Ôt†çõëQîÈfÏžׯ_»¯$POŸ>þùEŠÁ«W¯„­Q£Hü>þþþ ”ƒäë¨`AòäÉÅõ@ù^óåˇwïÞ‰øVmhþŽ,Þ:þ¼Èš@©µh€vk—/_.„, cÚ¦b äWyGÖÿQ[V,d-k=-r6ÑíÈ*Õé’3.]ºt¸Ù\ £mÇιFj™” ‡GÕ+è¥vGö3€(äàäÃ^j#mG–*6Œ0êî[†_çÐu/µz­.FV©N—cd•ù¼Épx H˜ô¬&{< =FV™äYõa/³TË4 Z ¶ü ¡c² û’_e- ]Qò©C‡E–,YÄN)Uú¢ƒYÿý·²ôv‰„ì‡tB–Äí‰'D&®^^^ºÝ^íïkÖ¬‰RÈR<.§²7nÜ;¼$”IÈjC(KÁâÅ‹Ay¹©qÖc?%êé_†_g!«žeµ,K•µ€â¶”êt9k2ŸA‰/mèëòÛ¡;°Z« Ù°åí `jhv‡ÁV…¬Hƾd`®—G–²PL?Å©’O¥Wÿ½{÷»£tÀjæÌ™;v¬.´ÀÅÅEìšÒ}Ÿ>}a;w±±R„,õåçç'ba'L˜€‹/ŠÐªÞE}H¦Ý]}!Kydoݺ%55Î#kì§D=ýKôëbBœ~K=ëjQ–>{òÍÔÁcoo1/:`@¯¢è€R.ç‘Uæ#(Ãáåpÿ³`! Å¿–°ê,d%@2ö%ÿ.˜‡”‰èbø7oÞ ú¢VZŸzá”/_^ÄË+V,œ¥xÕ?þøCæ¢`Í›7ŸS,¯!Ka”Ñ…ªtQʯ!C†ˆrãK!Yª@Yiô…,]Û¶m[4n¬ÉL‡Ç‚.=¤Fµ›*÷o.2ü: Ys-’µKέECWœñðСț7/Š/Ž¢E‹ŠÝ%9ÝB… Ê)Òë8m«X©26ïåÊ^æ~–å8¼hl5޽v X6!ìå’Í’hØES Ú¨ÖÀÇwšTZÔR¦j¶*1­[Ìä,+ Y9´Œtíܻ͞'®_¿&F 1Jñ®ß¿7Òˆqï–2ÐaMqà@áÂE0wé ä/X(îsª& ǯ󎬪—ZÝÆ·kö;úÿÙT†¥l¡®þýû+nbÓ¦MÛ7o0u*½q…H³ðß%X¾n“âlµ6ƒä8<³Ùýká‹5CS~Xªþµm‘¦:WúÌ!Ûz ¿¤æš‡7Y€q«ÔŒ³œ,dÃÕ̽–-”gÏž~”í~’?­U«–™-‹<|Ī^´ì\Í烦Š7óãð¢±Òx¡ú;²ZŽonœúNÓÙÏxñ€  ð;P¯PGóðFi,d‚ÕÜž8zî‹ààÁ°‚´;K%À3gÎlnótãSy\:LF»°ÚæâRÝû@e'gŨɆ˜€¿ÎBÖ|ëÄ#¨Uå7¬rw±±Ôè$íóçÏ1c•{WF£J5¹råŸþ) º|ù2ºuï½ÇÃâ{•a©uZ!Çá)GÈnî^zþyGÖÇ X8hÒ(YÕ8‹ÊBÖ8\Ðkµò¥pèàA]xÁºuë@¯ñõËÓšÛL:HFg(Ÿ,5¶õ4ÀáÓÌm¯rü: Y…,šµšAá/¼böl*ó®iiÒ¤ÁƒÄ Ws·×¯_‹Dâ”È[ÛþèÝT¡eÛöæ6Ç Çá)FÈ.ÿHë4èYÈ’‘kg Í(– Y#@UF—;·mÁñý{±qãA”¡€ŠÐAZs·ˆEÈž&MÜP§QÔmÈå¾Í½>J_Ž_g!«”U³b;ÊÌ‹óçÃ^}Q‚ìk×®‰²‰æn”¸û·ß~ù©ÑÎAU'gœ¿–½ÀÜ6ZûøržÙ…lP pá°í_`ä UúÈBöÍs`ö` ^{ ¼‘é°µèÿl"Vù"Jùa©ª—¹…Ñ›7Ú  véÒ%tïÙ {2·i<¾‚Èñë,d´pÖjÊ– ëpÑã$V¯^¥CP·n]‘$›z›«QÁøñãE†mkÙ²ªÔ¨…FnšWbÜÌO@ŽÃ3‹]ö·fw•ZÂD@–<@ýŽ@¶|š£ÙO ®ÄIßjk®1Vc!k,²Šè÷Ôñ£X:o>¤³gÕªUâ -3Wkݺ5È··jEö4ÍÙ¹þ8«)ŒÆ\“åqãD@Ž_g!'Ô|³¡8•-‰;¶#þüº.©"L@@âÇo¨a$÷óíÛ7QœÆ×6ª5Þ¼E 9{Ir?|¡ñ ÈqxÑXcœÃ^ÆŸ~ìF`!;n*ºë¯}Ñ®e T«VMgõ AƒDq*t`êF¹Á)øäÉ“uCSÕ± [¶áÓÿ1µ9<žÂ Èñë,d¾˜ÖbÞ‰£Gpêð,\0_7e*¥HÁSnS7*•Kå ( º[÷î¨^·!Ÿª5õbÄ0ž‡ÇB6” Y…=ÅÆ1'b^Y…^ëûûû›TÌ’ˆÍ!úô飛(ç5Κ[J¯rü: YKYu ˜ÇœéSaˆÿ…Öݦ)QLjÓ¦ME•©Z™2e°eËdË–M7äСÃ0Y ôê7ÀTfð8 Èqx,dYÈJ|¬,â2ÿQ®H~øùù…›íÌÒAV 70v£ÍJ¦¿KcÒΰçƒÇHš,™±MàþUH@Ž_g!«Â¶d“»·oömZ‹Ô,ÚFq]íÛ·ÇÝ»w…ó3Vûøñ£mذa¨‚¶Ñï·lÃ‚åæ‹-3Öœ-¡_9…, YKxæåÌáÂÙ3˜8f.^ŸÚв¬_¿'NÔ¥?”ÓoL×Rv‚¡C‡¢cÇŽábbé¾R¥Jcì”é(]¶\LÝðçVJ@Ž_g!k¥‰’§ý[±BØ·wèõ¾¶QnY™” ±Aƒ7çÎ:±ìàVä€Nû6mÖW< >&whr Y²†yêÔÕËcï‡èÛµ3.^ /fÉ¿uêÔIøÖ)S¦ kÖ¬qž½E#ëååwww]vmÇ$bº¯F–lÙã<w`¹äøu²–û¨vfÁÁÁ¢PÂò¥KQ¶lÙpóhÛ¶­pÓ§OGÅŠã–*†Ñý 6Œò­Ò2d(räÍ‹ÿMã[ø(mJrü: Y£-wl(‹çÍÆŠaÆôépss‹²Ûýû÷ƒB®_¿.v èKëtµÂ¶xñâb·V­¨«%mÚ´  B×^}е—‘Jƒ ÷£# Çá±e!Ëÿéhxœ8ŽIcG!w®\˜1cºAâcµl)N–|©÷ã'>v;à‡N69~…¬l¼|ƒ9ø<}Š £†ãÕsát+W®l03h‡vàÀAÈœ-FN˜„L™3¬oîÈøä8<²,dÿDªk„ÝÛ·aÞÌ©HŸ.=6l B ôSJ ÅÀîÞ½;wî‚ï›×è7ø/ÔmØHêí|G@Ž_g!˪\»rŽdI“ÀÙÉI¼Ò*T¨ì9P•.Šë:åá/_0rÂD+QRv?|ƒù Èqx,dYÈšÿ‰U¦§ŽÃáýûpxÿ^ØÙÙ¡C‡öâ»6Œ@'«#K?û}üˆ•î+ñùËÔ¨íŠu\¹hŒ2—XUVÉñë,dUµ´l¬–ÀÕKqøÀ>Ü·?¾GÇ.]:]|¬6FVf ýþæÍ¬pwGâ$IP˵jÔ©‹¥J3Xãð¢™fVdÊqׄÕHV1“Mÿð6sß‚ï³"1^óYìS¥ºsûñsÎl3+U\qçÖMœõ8…{wnãï+¼zù¾¾¯;Ox=x€ ààèˆt·@Tªâ„üåo(¨irü: Y³,jH½áä±#¸só&^¿z)œî«W/…Ó}èåGátÓ;8"ÁÂpr©Žl9rÒîËŒä8¼hÍ´ˆ»â#a"3ÎÆDCß¾¬šrŸü ‘‘ž…¬‰–‡aÖB@Ž_g!k-OÏ“ X(9/Zöé¼ÑeTvä+Äa¡È€Ã3{ÝñæEGÌ‘…¬ rL€ „ã×YÈò“Ø€ª Èqx1ÙͨÓÚ •꩚‡$ã—ÿˆ+'HÄ®•t}ô±5Dî‚ 0²ü 0&`… &d¦pj¼MÿHiñ§õy†Çwªð6À\YÈ"wÁ˜ Y~˜°B²€]šè::7rZðÁ•Cëã;Âÿ]/=.,d ’»aìVø,IDATL@C@Ž_çÐ~j˜P59OÂD‹!C–ó½"±„kÕwIÀ`XÓúaÈm,dÕ÷$°ÅL@Ñäøu²Š^J6Ž 0˜Èqx1õ%>ÏUh²å&½ )ö$ mô‹æ ñÇçðüáqŽÅBÖ€0¹+&ÀxG–Ÿ&À¬ˆ€Á…,±³O·]ëµ­åìÌÎì·/»àý«Í~ÖLûŠ€¯xÿªÿXÎ]Êm,d¥Pâk˜L@Ž_g!++_Ș€ Èqxq²?Eê®H4r¶GÕÉ‘«pœº3ÊÍ×<€S»ðÒû5>ù5pÁ(ã„ï”…¬ óLÀšÈñë,d­éÉà¹2 $ Çáhú‘2Í_°±q„Sãä(W°Km ®cÑÍ«§€Çîï8³ÏÉRœƒßÛÉöÇ¢§ØÞÂB6¶äø>&À¢$ ǯ³å‡ˆ 0Uãð <ѼH”¤RØ×FàÌÈ_*ò•Hˆ,dÍÇžGfLÀ°µ€Eä)0& Z,dU»tl8`J ÀBV «À60&`­XÈZëÊó¼™0²ÁÈ0&À$H à[èÕ,d%cã ™`‘ °å§‚ 0&`Z³äð€üú¨  ;€Þ¡??7­I<`L@XȪsÝØj&ÀÔK €íB\@ ÜPF½ScË™`¦%ÀBÖ´¼y4&À˜ø@áPŸ$ð @u`L€ H#ÀBV'¾Š 0&`H´+»@*½N/(oÈA¸/&À˜€¥`!ké+ÌócL@©ôwey7V©«Äv1& h,d½™¯¯oÓóhiÒ¤yôæéÓ§ûÌó]|Pþ•Bs++à ¶BÑB`ã‘É.ñ=²Š^&6Ž 0%pppèicc3yäÈ‘vU«VEªT©¬Ó"Ùðöí[>|8`Μ9|||(dá¾" e£˜@/ü¾,…MgÃ$°±éšÑ.ÉR²’hñEL€ X+ìÙ³·(\¸ð‚Ý»wë§ÊRŽÒ¥K¿¾råJ÷Ta0iÕXÈZõòËŸ< YùÌø&À¬Ž@WW×m{÷îÍ Ö™gÉ’å¥OV3Pë ZÝ,d­g­ 2S²ÁÈ0&`Áw¬[·®¡“““jg9eÊ”€aÆðj'Á†[}!ëh—$Ú9ÿ Iß6¦·ÊVÁMm“üü=(äÓ÷À¸¯ Yµ-=Û˘€‰ ÄË•+×C//¯l&× Ã]¹rnnn‡?~\Ë sgLÀÀXȨB»c!«Ð…a³˜°8™‹-zÄÓÓ3ŸšgöäÉ“êÕ«_õòò*­æy°í–O€…¬å¯1Í…¬u¬3Ï’ 0óÈfooýÇöæ7%ö-^¼øG???ÕV‹ý¬ùN5ˆ(d·nÝŠ¹sçâÝ»w A–,Y0dÈ8;;#¦Ð‚E‹‰{©ÙÛÛcþüù(^¼¸ø}âĉX±b~þü‰6mÚ`ܸq°± {Ó½nÝ:¬^½û÷S;MëÞ½;V®\‰øñã‹ßK–,‰S§NEœ={v¸»»ƒÂ‘èÚW¯^!mÚ´YŽ¥K—búôéðññAŠ)аaCL›6MüüðáCŒ3kÖ¬1ÈXÆì„…¬1érßL€ 00,dùi`&$ /dçNž€Û·o£bŊضm‚‚‚(D»wïF‡ЮC§_ÆÈR8 ‰¼«W¯"}úôX¿~=ÆŽ‹{÷îaß¾}1bNŸ>-„f:uÐ¥K´jÕ þþþ9r¤¢*TÀt³/R¤ˆ¿¥KGÿbÃXBöÂ… ¨_¿>Ž9‚¢E‹ qOvÛÙÙ MÿN¶Ÿ?Þ„+»¡XÈÆŽßŘK€…¬\b|=ˆ}!Û¸¦3¶oß.vQÿûï?!Ü6lØ€Aƒ 1yáÒå{»Qzôèè«zõêÂooo+V ?~D·nÝ7o^ |;Ï4ÏÌ™3‡ëxïÞ½èׯŸç´KíÙ³gâwê‡8ÑïuëÖ÷ÓõMù®S¦L‰Y³f ´ =zôh1_«`Á‚b.©S§F½zõÄœˆñûý÷ßÅõÄŸú&!_¦L¼yó½{÷ƃÄçôGíj“ØîÕ«âÅ‹ÊgMó"Þ?;ÞôG í’›ZÈRåš9ÇáÙä[™`j$ÀBV«Æ6«–€¾Ý¹n% .ŒþýûãÒ¥Káæ4tèP´lÝ&¤xÑ"1ž|'!׬Y38:: U»vm±£Û¢E Ñç‰'ðçŸâƺ1¶lÙz¯Ý‘%ñ:pà@!>säÈ!^áS؉H)BÖ××WŒAâ1Q¢DbÇwñâÅ8wô3Ÿ$ItêÔIØú¿ÿý/\×$IÈÒîrÙ²eÅŽ1ÍE»C¬¿#{íÚ5´oßBÄ’ÀlÞ¼¹¨Ä€v¬—/_.çÔ©SqóæM¬ZµJÙäÉ“ L×æÌ™»ví;Á$„I˜’è'ëêê*v„ÅN9‰YÅdÍ%Ož<âZàÄóÇèÚµ«˜—}:“f- Ø0o[¥Z×À†3&K,dc Žoc±!QÈ’`¢ÝOZ/_¾bŠذaÃмe«ÅŠF+d?}ú„¶mÛ"a„b‡5A‚¨Y³¦‹úB–Ä2‰?m‹(d#Î…Ä[²dÉD\*Åíê·_íÈ>}úT¼þ§{Μ9#v˜i§“„,ÍÄ-5ú®Y¸pa”?þ,î§/µ... x`}!K1Àÿüó2eʤëãõë×BÐvîÜY줒À¥F!$ é²$úÛµk'þxÑ.1Åk™§¹çÎ[aj_¿~»Â-[¶÷Ó\©Ñ<¨bþüù…´žùòå3ùŽ,Ùò €f›`LÀz°µžµæ™*€€¾ý½V5ǺcÇ!ÊhGoÒ¤Ib72¦Ðš ½oРOú‡¹h±@b‡• \Ú¤ØÛ_ ÙË—/‹­ø%!›4iRqè*C†ðµR¢²›Û´iS±»L¯÷I`Ó®. X®Ô7‰Q­Õÿ]kÓìÙ³E¼/‰Em£Wü4>}'!®‘0aîß¿/¬i‰KÝnAñÀ$hµ"”Ä1õMB–¿Ñ<µB–l¥]Z­¥Vš;íRçÊ•Kôñþý{!zoݺ%vii^ÚF!ÇŽ_d…'Tq©iÒY²åNhhÁ]<çl`LÀTXÈšŠ4Ãè ÙÓ&ŠK±ô:Ÿš§§§ˆÁìØ±c´‡½èU> ^:ÑO;„ú+Å«RÆzÍO;‰­[·Ö ;º6âŽ,½R§ØS % 1H;ž‡ÆñãÇ#­[TB–bPïÞ½+3Å¥öìÙ'OžÄ;w$ YzõO‡Ô(Ž·|ùòâ•>ýLB˜D;‰~ =¸~ýº8ðE;Ï´ËJ; 7n1ÁtÝÌ™3ÅïRA±¶Ä“v]iwWŠ¥p + $¾P¥J6@"]_ÈR( l¯Ô(lïѧŸÉ…ìbt Nc 7&À˜€u`!kë̳Tˆé·è°íD’0%H‚– èuuté·þúë/L™2Eìê7ê‡^‹ÓÎ.‰@Ú奨Î3fÀÖÖVwiT¡3K"î¡øÏeË–!cÆŒ’„ì—/_„ ¦9P¦Š#]²d‰HÍEiÁ¤ìÈÒ@ ,_$Héµ~åÊ•…í´ÃL¡ Ô/5Ú¦PúŒYÑœiJFxøðáØ³g˜3 ]š›ö°WL;²$d_¼x>}úqN±»5L)tA_ÈRú£ƒ;…/Ð.q³I˜ÄäBÖÀ_4Çÿ¸1&À¬ƒ YëXgž¥BpA…,„‘Í0uÖít¶ ZÝ^`äæî™P ²ŠY 6ݵ†U6}e/-UGt¤ÏÁ:0ó,™``!Ë0!}!›<‘¦‚Ö¯ZH‚ml`B;y¨¸ °?ƒcLã(66]3Ú%Y*§#JÁE¿ª¸ã|`L@Ýd Y:Kq`”&ÈÁ!ìo~JD©q(&-6NLÓ)bŠ£‹Mãµ±¡Æ÷˜ƒ€¾5Çø<¦ÊÄBÈÒ É;ÏÍ+»À™Pq¬²é³¹L€ 0˜°‰Î H€…¬aZCW±²Z4Ψ,FEÙ= D ìB$°5Õ5¦‡¦lª±L5Ï)ú9¦uˆésSò5ÔXj›“{¦H‘¢ ¿¿¿¿%JLÆ´#K¹©Äæ¡C‡Ä©c*÷H;¶T/ýìÙ³"·%p¦œŒãÇ)ôwd©íÎRYM:±,¥ñެJ|¼ôh,íÁV‚Álƒy ØÚºg´KrZNhAtSÁrö1õÓç4†©®1Õ8<§èõ˜Ö!¦ÏMÉ×Pcñœ~ýL˜Š”qR¦L¹ØÏÏ*ÆØ´B–rSê7JOS«V-Z@å)ÇãÖ­[Ež=zˆÄã”+“ÒàlÞ¼YTJkS©R%Q’꼓x¥t:TZ“®)Q"¦=ƒ0 XÈÆ¸t|`*& Å™«xzl:`L Ö Z@‰Ã)19Õ.§F ß©Ò%#§§èÚÖ¤IñíÚV«VMä ¤j<´ƒ+§±•C‹¯eL@mXȪmÅØ^&ÀLEÀàB–vY‡ª²7nÜ€““6mÚ$þ]_ÈRiMúŒ’œ“ ¥ç”xœJvjŸKÁBV %¾† 0µ`!«Ö•c»™06ƒ YªNå.)´€â`©T%•‡\¼x1òæÍ‹mÛ¶‰ª“N%6©ì$…,h³P]xªÑNe(©þ¹”ÆBV %¾† 0µ`!«Ö•c»™06ƒ Ùïß¿cÈ!"ÅÆ–.]sçÎå!=<>>S\Ršl`LÀXÈ’&÷Ř€5H =%úÏ ¾B¬a!xŽL€ 0%:b^&À˜`L€ 0&#ÿ7f±—¼ÌIEND®B`‚django-q-1.0.2/docs/_static/favicon.ico000066400000000000000000000353561352353655300177370ustar00rootroot00000000000000 h6  ¨ž00 ¨%F(  :Ì¡:Ì¡B:Ì¡ :Ì¡Ý:Ì¡ö:Ì¡ö:Ì¡Ý:Ì¡Ÿ:Ì¡A:Ì¡:Ì¡:Ì¡‹:Ì¡ì:Ì¡ÿ:Ì¡ÿ:Ì¡û:Ì¡û:Ì¡ÿ:Ì¡ÿ:Ì¡ë:Ì¡Š:Ì¡:Ì¡:Ì¡«:Ì¡þ:Ì¡ú:Ì¡À:Ì¡t:Ì¡N:Ì¡N:Ì¡u:Ì¡Á:Ì¡ú:Ì¡þ:Ì¡©:Ì¡:Ì¡:Ì¡:Ì¡ÿ:Ì¡ð:Ì¡u:Í¢:Í¢:Ì¡v:Ì¡ð:Ì¡ÿ:Ì¡‹:Ì¡:Ì¡E:Ì¡ë:Ì¡û:Ì¡s'þ¾c_b bbd[bbdšbbdšbbdZc^b *ö¹:Ì¡u:Ì¡ü:Ì¡ë:Ì¡C:Ì¡£:Ì¡ÿ:Ì¡¾8Ò¥eY_ bbdšbbdúbbdÿbbdÿbbdúbbd™fX^ 8Ò¤:Ì¡À:Ì¡ÿ:Ì¡ :Ì¡à:Ì¡ÿ:Ì¡rbbd]bbdúbbdÿbbdÿbbdÿbbdÿbbdùbbd\:Ì¡t:Ì¡ÿ:Ì¡Þ:Ì¡ù:Ì¡ú:Ì¡Jbbdbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbd›:Ì¡M:Ì¡û:Ì¡÷:Ì¡ù:Ì¡ú:Ì¡Jbbdžbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdœ:Ì¡D:Ì¡ø:Ì¡ø:Ì¡á:Ì¡ÿ:Ì¡pbbd`bbdûbbdÿbbdÿbbdÿbbdÿbbdúbbd_:Ì¡D:Ì¡ù:Ì¡à:Ì¡¥:Ì¡ÿ:Ì¡»7Ô¦ e[`bbd bbdübbdÿbbdÿbbdûbbdžbbd:Ì¡D:Ì¡ù:Ì¡£:Ì¡H:Ì¡í:Ì¡ú:Ì¡oÿôc`cbbdbbbd¡bbd¡bbdabad:Ì¡E:Ì¡ä:Ì¡F:Ì¡:Ì¡‘:Ì¡ÿ:Ì¡í:Ì¡n:Í¢ :Í¢:Ì¡1:Ì¡D:Ì¡†:Ì¡:Ì¡:Ì¡°:Ì¡ÿ:Ì¡ø:Ì¡»:Ì¡m:Ì¡G:Ì¡G:Ì¡m:Ì¡À:Ì¡¡:Ì¡:Ì¡:Ì¡:Ì¡:Ì¡’:Ì¡ï:Ì¡ÿ:Ì¡þ:Ì¡ù:Ì¡ù:Ì¡þ:Ì¡ÿ:Ì¡£:Ì¡:Ì¡:Ì¡H:Ì¡¨:Ì¡ä:Ì¡ü:Ì¡û:Ì¡ã:Ì¡¦:Ì¡<øàÃÃñžy80 0 8ž}ýÃÏàø( @ :Ì¡:Ì¡:Ì¡]:Ì¡œ:Ì¡Ë:Ì¡æ:Ì¡ñ:Ì¡ñ:Ì¡å:Ì¡Ê:Ì¡›:Ì¡[:Ì¡:Ì¡:Ì¡:Ì¡,:Ì¡‰:Ì¡Ö:Ì¡ø:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ø:Ì¡Õ:Ì¡ˆ:Ì¡+:Ì¡:Ì¡:Ì¡{:Ì¡ã:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡â:Ì¡y:Ì¡:Ì¡,:Ì¡·:Ì¡ý:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ü:Ì¡µ:Ì¡*:Ì¡7:Ì¡Ð:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ü:Ì¡â:Ì¡·:Ì¡“:Ì¡:Ì¡€:Ì¡“:Ì¡¸:Ì¡ã:Ì¡ý:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Î:Ì¡5:Ì¡-:Ì¡Ð:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ü:Ì¡É:Ì¡i:Ì¡$:Ì¡:Ì¡:Ì¡%:Ì¡k:Ì¡Ê:Ì¡ü:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Î:Ì¡+:Ì¡:Ì¡¸:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡í:Ì¡}:Ì¡:Ì¡:Ì¡€:Ì¡î:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡µ:Ì¡:Ì¡:Ì¡:Ì¡þ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ã:Ì¡S:Ì¡:Ì¡:Ì¡V:Ì¡å:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ý:Ì¡{:Ì¡0:Ì¡ä:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ì:Ì¡Sbbdbbdbbd:Ì¡:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡é:Ì¡ù:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡vbbd^bbdþbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdþbbdZ:Ì¡{:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡õ:Ì¡ù:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡vbbd_bbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdþbbd[:Ì¡u:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ö:Ì¡î:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡‰bbdDbbdöbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdõbbdA:Ì¡t:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ë:Ì¡Õ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡®:Ì¡bbdbbdÕbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÒbbd:Ì¡t:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ñ:Ì¡¨:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Û:Ì¡bbdbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbd|:Ì¡t:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡£:Ì¡h:Ì¡ú:Ì¡ÿ:Ì¡ÿ:Ì¡û:Ì¡_bbdbbd¿bbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbd¼bbd:Ì¡t:Ì¡ÿ:Ì¡ÿ:Ì¡ù:Ì¡c:Ì¡(:Ì¡Ý:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡¿:Ì¡bbd+bbdÀbbdþbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdþbbd½bbd):Ì¡t:Ì¡ÿ:Ì¡ÿ:Ì¡Ù:Ì¡$:Ì¡:Ì¡”:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡û:Ì¡rbbdbbdbbdØbbdøbbdÿbbdÿbbdøbbd×bbdbbd:Ì¡t:Ì¡ÿ:Ì¡ÿ:Ì¡:Ì¡:Ì¡6:Ì¡è:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ç:Ì¡IbbdbbdbbdHbbddbbddbbdGbbdbbd:Ì¡t:Ì¡ÿ:Ì¡å:Ì¡1:Ì¡:Ì¡‡:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ý:Ì¡I:Ì¡:Ì¡:Ì¡:Ì¡u:Ì¡ÿ:Ì¡:Ì¡:Ì¡:Ì¡À:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ç:Ì¡p:Ì¡:Ì¡:Ì¡s:Ì¡M:Ì¡v:Ì¡½:Ì¡:Ì¡5:Ì¡Ø:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ú:Ì¡½:Ì¡[:Ì¡:Ì¡:Ì¡:Ì¡:Ì¡]:Ì¡¿:Ì¡û:Ì¡b:Ì¡K:Ì¡1:Ì¡@:Ì¡Ø:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ú:Ì¡Ù:Ì¡ª:Ì¡„:Ì¡p:Ì¡p:Ì¡„:Ì¡ª:Ì¡Ú:Ì¡ú:Ì¡ÿ:Ì¡ÿ:Ì¡a:Ì¡:Ì¡:Ì¡5:Ì¡Â:Ì¡þ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡a:Ì¡:Ì¡‰:Ì¡ê:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡`:Ì¡:Ì¡7:Ì¡—:Ì¡ß:Ì¡û:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡û:Ì¡Ý:Ì¡’:Ì¡!:Ì¡:Ì¡):Ì¡l:Ì¡­:Ì¡Ù:Ì¡ò:Ì¡ý:Ì¡ü:Ì¡ñ:Ì¡Ø:Ì¡ª:Ì¡i:Ì¡':Ì¡ÿðÿÿ€ÿÿÿü?øðøàüàÿÿÁÿÿƒƒøÁƒàÁ‡ÀáÀà€à€à€ð€ð€ð€ðÀð‡ÀñƒàñƒðñÁÿÿóÀÿÿóàÿ÷ðùÿøÿüÿþÿÿ€ÿÿðÿ(0` $:Ì¡:Ì¡%:Ì¡W:Ì¡Š:Ì¡µ:Ì¡Ò:Ì¡ã:Ì¡ë:Ì¡ë:Ì¡ã:Ì¡Ò:Ì¡´:Ì¡‰:Ì¡U:Ì¡$:Ì¡:Ì¡:Ì¡:Ì¡^:Ì¡©:Ì¡Þ:Ì¡÷:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡÷:Ì¡Ý:Ì¡§:Ì¡\:Ì¡:Ì¡ :Ì¡{:Ì¡Ô:Ì¡û:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡û:Ì¡Ó:Ì¡x:Ì¡:Ì¡ :Ì¡g:Ì¡Õ:Ì¡þ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡þ:Ì¡Ó:Ì¡d:Ì¡ :Ì¡,:Ì¡­:Ì¡ù:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ù:Ì¡ª:Ì¡):Ì¡:Ì¡L:Ì¡×:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ô:Ì¡H:Ì¡:Ì¡:Ì¡_:Ì¡é:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡û:Ì¡é:Ì¡Ò:Ì¡¾:Ì¡³:Ì¡³:Ì¡¾:Ì¡Ó:Ì¡ê:Ì¡ü:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ç:Ì¡[:Ì¡:Ì¡:Ì¡_:Ì¡í:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ü:Ì¡Û:Ì¡™:Ì¡X:Ì¡+:Ì¡:Ì¡ :Ì¡:Ì¡:Ì¡ :Ì¡:Ì¡,:Ì¡Z:Ì¡›:Ì¡Ý:Ì¡ý:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ë:Ì¡[:Ì¡N:Ì¡é:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡þ:Ì¡Ó:Ì¡p:Ì¡:Ì¡:Ì¡:Ì¡!:Ì¡s:Ì¡Õ:Ì¡þ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ç:Ì¡I:Ì¡/:Ì¡Ø:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ð:Ì¡‹:Ì¡:Ì¡ :Ì¡:Ì¡ñ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ô:Ì¡+:Ì¡:Ì¡°:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ü:Ì¡T:Ì¡:Ì¡:Ì¡W:Ì¡Þ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡«:Ì¡ :Ì¡m:Ì¡û:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ó:Ì¡;:Ì¡>:Ì¡Ö:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ú:Ì¡h:Ì¡$:Ì¡Ø:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ú:Ì¡:bbdbbdbbdbbdbbdbbd:Ì¡>:Ì¡Þ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Õ:Ì¡!:Ì¡‚:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ï:Ì¡Qbbdbbd)bbdqbbd¯bbdÑbbdÞbbdÞbbdÐbbd­bbdobbd'bbd:Ì¡V:Ì¡ñ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡}:Ì¡ :Ì¡Ù:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡†:Ì¡bbdbbd‡bbdãbbdþbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdþbbdábbd„bbd:Ì¡:Ì¡‹:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Õ:Ì¡:Ì¡f:Ì¡ý:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Î:Ì¡bbd8bbdÆbbdþbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdþbbdÃbbd5:Ì¡:Ì¡Ñ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ü:Ì¡a:Ì¡:Ì¡±:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ý:Ì¡jbbd9bbd×bbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÔbbd5:Ì¡o:Ì¡þ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡¬:Ì¡:Ì¡-:Ì¡ã:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Õ:Ì¡bbdbbdÈbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÄbbd:Ì¡:Ì¡Ù:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡à:Ì¡):Ì¡b:Ì¡ú:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡bbdbbdbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbd‡bbd:Ì¡:Ì¡–:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ø:Ì¡\:Ì¡—:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ù:Ì¡Obbd/bbdåbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdâbbd+:Ì¡T:Ì¡û:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡:Ì¡Â:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ã:Ì¡$bbdzbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdt:Ì¡(:Ì¡æ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡»:Ì¡Þ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡É:Ì¡bbdbbd·bbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbd²bbd:Ì¡:Ì¡Î:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ø:Ì¡ï:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡²:Ì¡bbdbbdÙbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÔbbd:Ì¡:Ì¡¸:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ê:Ì¡÷:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡¦:Ì¡bbd%bbdæbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdâbbd":Ì¡:Ì¡¬:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ò:Ì¡÷:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡¦:Ì¡bbd&bbdçbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdãbbd":Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ó:Ì¡ð:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡±:Ì¡bbdbbdÛbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbd×bbd:Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ë:Ì¡á:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ç:Ì¡ bbd bbd¼bbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbd·bbd:Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Û:Ì¡Å:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡à:Ì¡!bbdbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbd|:Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡¿:Ì¡œ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ø:Ì¡Jbbd6bbdêbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdèbbd2:Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡•:Ì¡h:Ì¡û:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ˆbbdbbd˜bbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbd“bbd:Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ù:Ì¡`:Ì¡2:Ì¡æ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ï:Ì¡bbd'bbdÒbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÏbbd#:Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡â:Ì¡,:Ì¡ :Ì¡·:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡û:Ì¡`bbdFbbdâbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdßbbdB:Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡±:Ì¡:Ì¡n:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Å:Ì¡bbdFbbdÔbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÑbbdC:Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡þ:Ì¡g:Ì¡%:Ì¡ß:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ý:Ì¡y:Ì¡bbd'bbd›bbdíbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdÿbbdìbbd˜bbd%:Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ú:Ì¡ :Ì¡:Ì¡Œ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡è:Ì¡Dbbdbbd8bbd‡bbdÁbbdßbbdëbbdëbbdßbbdÀbbd…bbd6bbd:Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡„:Ì¡+:Ì¡ß:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ð:Ì¡.bbd bbdbbd+bbd+bbdbbd :Ì¡:Ì¡§:Ì¡ÿ:Ì¡ÿ:Ì¡Ú:Ì¡&:Ì¡y:Ì¡ý:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Æ:Ì¡-:Ì¡:Ì¡§:Ì¡ÿ:Ì¡ü:Ì¡p:Ì¡:Ì¡¼:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡Ð:Ì¡C:Ì¡:Ì¡:Ì¡5:Ì¡:Ì¡:Ì¡§:Ì¡ÿ:Ì¡´:Ì¡:Ì¡9:Ì¡á:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡è:Ì¡w:Ì¡:Ì¡:Ì¡|:Ì¡Ñ:Ì¡':Ì¡:Ì¡¨:Ì¡ß:Ì¡2:Ì¡\:Ì¡ð:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ü:Ì¡Ã:Ì¡\:Ì¡:Ì¡:Ì¡^:Ì¡Æ:Ì¡þ:Ì¡ç:Ì¡&:Ì¡:Ì¡‘:Ì¡T:Ì¡:Ì¡o:Ì¡ô:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ù:Ì¡Ì:Ì¡„:Ì¡D:Ì¡:Ì¡ :Ì¡:Ì¡:Ì¡ :Ì¡:Ì¡D:Ì¡…:Ì¡Î:Ì¡ù:Ì¡ÿ:Ì¡ÿ:Ì¡æ:Ì¡&:Ì¡:Ì¡#:Ì¡:Ì¡:Ì¡p:Ì¡ð:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ö:Ì¡Ý:Ì¡Á:Ì¡ª:Ì¡ž:Ì¡ž:Ì¡ª:Ì¡Á:Ì¡Ý:Ì¡ö:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡æ:Ì¡&:Ì¡:Ì¡]:Ì¡â:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡æ:Ì¡&:Ì¡::Ì¡¾:Ì¡ý:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡æ:Ì¡&:Ì¡:Ì¡|:Ì¡â:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡æ:Ì¡&:Ì¡:Ì¡-:Ì¡:Ì¡â:Ì¡þ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ý:Ì¡ß:Ì¡‚:Ì¡ :Ì¡:Ì¡':Ì¡s:Ì¡¼:Ì¡ê:Ì¡ü:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ÿ:Ì¡ü:Ì¡ç:Ì¡¸:Ì¡m:Ì¡#:Ì¡:Ì¡ :Ì¡6:Ì¡n:Ì¡£:Ì¡Ì:Ì¡ç:Ì¡ö:Ì¡ý:Ì¡ü:Ì¡õ:Ì¡å:Ì¡Ê:Ì¡ :Ì¡j:Ì¡3:Ì¡ ÿÿàÿÿÿÿÿÿÿü?ÿÿðÿÿÀÿÿ€ÿÿÿþøüÿÿ?øÿÿ€ðÿÿàðÿÿðàÿÿøÀ?øüÀ?ÀüÀ€þ€ÿÿ€þ€ü?ü?€ü?€ø€ø€ø€ø€ø€ø€ø?€ü?€€ü?€þ€ÿÿÀ€ÿƒÀÀÿƒÀ?ðÿƒàÿÿÿ‡ðÿÿÿðÿÿÿøÿÿߟüÿÿ¿þøÿÿÿÿ€ÿÿÀÿÿðÿÿøÿÿÿÿÿÿÿàÿÿdjango-q-1.0.2/docs/_static/info.png000066400000000000000000000260551352353655300172530ustar00rootroot00000000000000‰PNG  IHDRÄKøNðsBITÛáOàtEXtSoftwareShutterc‚Ð IDATxÚíw|UÇ™÷Ÿ9íö¢[T®$B*š¨6Ń ¶)v0Ø$±Ä‰—[ì4oœ7‰ßMvY'yw“upâÄ`‚p¥Ø`:€$$„Ê•nïíô÷I 0ºº‰:ß ;šs®æüæ™ß”3ƒ¼ÎƒÁ`0L_!p`0 ƒÁfƒÁ`0 6 æò þpÙ¹·mœxѧ²3§õ¯EÁ„Á`®;. æ¦DÑñ •ŒKƒÁ`3Á`úÒÒ¦âbÀ`0ØL`0˜Ë"Ó±ÊA¾:A”¨An½A>?™!û3Û6fòã¢fþ)k–xQ®“:A©,¯1Oí=Ëz¨!“ß‹JÍõUë¹8B¤,Aíº4 D•ÿâèÐÚì q@p‡JÚü¶‡Ú©Ö‚Ö¯¢z)ØD0åMz!Ó{BrZ3çxÈž“häPZà€5jW <†U•´™Ç©Ž¯5·¯7k´IGr‚ç”Hôð†¬ÉQäÌiý@¯]X“f‘:¿¯Çf7MýÀiSº„•‚Á`3Á`.?è œâª"u3ê ™¢ÐœéÙ«5]iiŽì'KÛº¬Kr¹OHÆù' VQ´g9?ÑÊšXï¾ÅžãúŠÑÍ®K·r\ɶ3´º÷FZö¤ÉSjr òZw ޝËyDí\ŸòøÒzN2gHˆæÉLeL”VÉ‚=õ3Ï—q*}ˆÐyQQØž¥Ób›Æ"V! @No ŸV§E;< _—&hýZ3vÌ ^€‰ÁôÇP‚Œà¿T“.¨ˆœRC[L1JË*KíiYrйP¡CŸ.’Él—17¥æV dBÉSž¶„µ#¼ E Ù˜¨Ê$’Ö0xÕ –PÅ ‚ïÂH’¤ŠèGú”–ÔpŠ¡n½àÜô…¿MTØ’V¥TiŒ* "’ÕŽˆ‰g- U¸fJ½4ym ƒÁ#ÌÀÂk½oDØó ­?sY“’î-©'$š‹5œëœÚ@m ÔÛwèÈe¹‹JÀ—B"Çn)ìù`xÐЕxtE*…vh„ „DÒ2€ ê9 âÚPef¸E)ð!X ¤îo£HLÿµ·Sd2ß­:n#•CDÙmŠ&âÆ¡ºÆƒÁ`3Á p5Šç×麖. ’§¨’zäk %‘JßôaìŸd5wÔªÇhbµ–PeAðHÀz“F+_n uïÚwO¸t@àòI’"ôi_p[ïmTE•%‘‹þ]Î# eXŸ'»N¤ÁA¾Æ g´«uò5( › f@AeŠQWšÔãXGk ádäa™|tʹÒpŽH=×ù¯©jÆF5ýžw uõ˜‘ s]3¡2Á{®.\ðʘ˜©.µQi>žâ—”#ýÄfKÌϳ̈́rjD×ü¡`0˜äscA²Ú²˜ÔëkP‹Q†=“åkF©æ:›ã¯W Q†­Ëò·¥Ôä ç¬Áz-¢Å8͵ë9V¢ôÉ+Ó±>3Ô®#ÊøÉÜ€ãê6È¢xF\£RbPÚ“ãRö:fN§ ˈCX—#àº0<2Á`’#ÓÃÓyÞEaQ¦läˆïdʹv…E‰ä6 c}gS¸›¨ŒÊôGH@ª¸jL£9¿£µ•猉ÜÀ–R?ˆô`—ié9v5&)f˜Ñ.ì²µ¯Í:¡Ó’NåùRÍËj‡Åû´DAƒR‚ÁÜp |j(sS±´­Ë¢ïë¶ÏÄÅU›?\j¯ ØîmŸ‰›Åaù2í-ª§Ì™ø¥P æ†Os`07gã*2Èy›¼×ˆ„Æ4QëÓY±“À`nDð4só R¬‹&ô­Ó´9”ÍgzÉDZ}. ×­´Ïƒ(vòŠÖ¢šÜ·ö2"¡Ž›éUÀ©H,ål0nÛað @ezïŸÎ6ˆ`Á÷:nÿÕÚA{\Í•LuO–ÐÓÀùÕU»­:›íðÖ#uvËf†šDà™cïeï²Ðó½n3¡Í-Ryí¹mÚg_[†åÖÈ1& ˆ­ ÞnÁ—ŒJò‘¡Ž—O÷Ž)dÕŠ:´•_˜;:»}IuQ—,Û·paP8”µù’•oU‰ö!2fþ𣎿ñ–òÉgÓ±ìúÝÇé ’|ŒÛ+ú®«8W¬ PRÒxا+K|SÇDr­CPU™¾¯7õ&Ø7º°ÕÅó§[׿ò^•K‚¦M«×OZµäþÂ÷_«ŽcÕ P¨ˆ눆zO¿ ÿH¹3Óô[Öd¹XYkNØttLæM5«KìOÞƒ6ÿÉvÑ !Îm›©ÓnÛÑ“Ì%ž¹ ìÔ?s¿lïŒïdºÞÍ¡­9Ÿû‘ÂȃH~¯É{põïiš…—ºö3"éŠÈEij‚¬öùƒ•¯µ¶ É  <7~aÛ8ÑøÙºL'ÚFºï^â ÖØŽúQREuë×äx|0œØgûðˆ‚—oa‰&õª¢o<³TýÑ+ožÔ?·‹XwŒ$HɽÄÃ>X@\Œj;–^é £¢0¨Ây÷³.Ömá'G$ºä KHºœ4úr/Ì-ŠºiÊe QvKcL¸'jn瘘&*ô¾JOеƒø–S*ã×ÔšœÏ›ºV×ßneòæÌ-Ô _}ã ®|cÓ»þô«X~ýƒ¿íãzÈ!]~"±õAQ„1tÿ"y4óÝ-j?‹H“Ùc¡ÔªCÜࣞ(Œ2©H€Ô˜UóFqã0pfB{.*˜Ùg×_D$!YIËÃYÕ—d±ëÚuǪÝ+ûËökúP—]D Ã%ÎEð«ÈP‡Û®üͨžï…¹µá‚t\•(,»q/j&]¥ƒ@ ÑqCÁ*ØL­ÜÚ±H‚²,RÂÁÄRW¬Æüùæd¾hÓ·6ë¨ÝŽå›6þúÅít×÷T>ö“Çu›~ùßGv¼¾‹9Fû<”w«yð ÷ÜIê·w+99±]a€¥MQ+R|qDãg(=§NY€—½à/lÁ{úLlqY¡8ë–caYZ¬¡Î‹ß 0åÞq{éÞù‰t+›™-Ó&íÙ‰e{B,šÎ1ŠZS|ôLŸíüïBþØ`I.kÔŠ*›3˜UT°ÛË{|ˆ‰\Y!«Q‰Z¯¢:L®~ß4ôǤ’¸ÕÂfäÄÊÆûÊL½íÞî…¹µ#Š˜2>T«¨s 0µ­Rq±ðR"×f¬tðs|é‚VÏLv7*ŽT*S %2Ѷ/kk#wÇBÏÕm)Q™ó¶664žíü×Ô¥¸³él³';wý^Ø!Ýö/Tš±ÎI6 %[ßlD¾`hB£ ¹¡3b©ŸwÙ ÞÂŽ×mÙî¼äÉFåÙ•/|âáÁ®›ëðú82"§3ÖÄ‚S*‚S ’Þ³ií5L|Þãm…ÊÎNà’§Cȳ7矇‘SíýФºË·è[à賕–/”®qÕ(SdÊ$–÷¨m±v‚‚3më!nÖÌÖ'î.¤Þ½!ódD6|šýQ…·bzÛx€@úÛµ•gz­‚½Ü s‹‡`–ö²îÓ¶³@¸kT°HÌKJ 2GÞµ‰3¼3 ¨Š95û7XŽ]Q·I¢ê¶f—´Í[@¯ßdôX¢˜…«Ów7ß5Ïwö–¶g±õ)À nã§{¹ÙÓìOÌΧ9´#ƒŸíIµ‹Ùˆ}›kØô›UÌSß|öwËiÞ[³ãµWןa±ÒPÃøÔP ƒÁ`0W~Ý ƒÁ`0 6 ƒÁ`°™À`0 ƒÍƒÁ`0l&0 ƒÁ`°™À`0 s-!­Vë ø­¸‰ß:7[§9ÑDá r0 æ´em/ŽzOjÝέR·ëQ×ÔIþ‰åbK•,€¹†P@ê¢fúFá”ânMÕkå9‹°ß`²î\öÔòé%fšsUoýûëëö»ñŽ®ým O¾Ã_’Ë+ yÒïÐýÜrï§Þ &cò#Ï®œmúüåüo=—’°û–tÛ!eÍj~häEçv ¶¿lV¥²_9ëÑœ®&ü^¬6ëõZÙ8¶uŬ\B_x×Ò‡î›6,S œ«zûš¿¼½Ç…·‚@3¿ãaÇH¤Ù÷‘¥%&gŽðÜñ Z—³×ç?úeñÃ?ûש޵«^8°L^¾òùùç²®Kº_Ú9E|æ×wÚÎ÷Õ>VVé¸L›Âû©÷cÛ¦=ñÌw&r ±+vß’nW¢úO¶è]½7)N§è­x—a§ëòIø´L:ëÎ%sm-›W­;턼9ßYùìb-?~§ wåÌLø‡ë¨¯ÖfTº8™tFKÅ”ØÑwµ¬Å÷è²pÝšAû<€b'¯h-ªÉ}k/# š+™êž8,¡§ó««v[6P"iíK.@ÚØ¤Ùîò<â鯣ÆÀ­Q!ÔÅó§[׿ò^•K‚¦M«×OZµäþÂ÷_«ŽcéõC×C“ÈPPÕ»ÓjœÀ¡jêÚß:¹IiEþiBy‰Ä•Ç>Ê<à$ iRõêø¸™žQœÄRÎã¶¿ÐKRß.x-Í„6·H}äµç¶iŸ}mYªÂî[Òm Oú\ x©0–ø¦Ž‰äZ†6 ªþ2}_—6˜<Ç·F ªßÿsVS V,yuÐo]1R·a·='õñ‚×´€½Wÿî ¦YDÊÂF}JÂÕáÇŨ¶cé•:* ƒ*œwÏs·¯ÎªpM™þ/P—ÙŸ¼«ßîG¦ûçMÑÚšó¹)Œ<øˆ›D¢©ö;Tiz"Öîf±“@3!Aœé&’À*©òŒ¡Š|Tõ¶¹Î… rÄr|DËÈÑÜþv¥Ô·\¦ð¨L¢v£©ÖEP'vš ŠÆ[ ë¬6k îw•¯õÆAcÑ’8z^=2«Ú¹Ù<{nûãÅŠ†jÝ©jm£'…óÁ)nÔĘT“µy·š•<ÎÞ“’¨—™$$"¡¢ ˆ†ig·ïØSR_/x}Ú6”²°¡OI·ou0ú—­ôŸÿ©uóàM $Äš GºDY{X?®,”®‘ëãÝžƒÔŸÓ5Û,§¼bò&”hÒK_¾tñ¶Ï^¯Ã#Âi&zh“1PƸ c—ÛýÓˆ@!àú”KÔ²Z ÁΪ"ó´;Æ[¡|e<9 $ìÆÍoèÒò"¥eá»õð –?5$_e…>Kž/¬|IIÔËËdÓ.Kõ|ÏÃO]gt'ª 5­”Ðy…“úzÁ_Ø}Kº]‰è?Úl8?ôÎ;rYš\ʳ 4B€D¢ˆ]Æ&0maÔOš¿ÁyT _x¦¢õÍßo憨™ @Å©Iwv d•AAåT—ùÝ®ç˜}ë3ëbô'sDB¾Ì¾©ä¢¿¶fNº%¢ŽõDa”IEˆ¤Æ¬‚˜7ŠÇÚúµ]#ýç ûÎí Ï]îš;Vµf?It(ËÐÓ"µ$I=«Ä€nÇíA[d؈ÐäÅŠºôw>Ñu¼˜×cR_/xƒ [îSÒí‹@<Ì%k&cèþEòhæ»[Ô~‘&ÿ²ÇBýø/¾„.rof‰v9‰¡ ôòƒÂ¦—W}fÇK/B!i£CÓºtD ƒóÙ­ö "’¬¤å®NgUwé߯ €¡$B*Øõ/#dèc.1¬ˆ€eèÊE Í-(¼§ÏÄÒÊ DgŒ(,K‹5Ôy±ª¤´Cª– hÌ"‘T‡2Ï8#`Éç_³°I’’i¾33ŠØu?ÍþûF=Yä/3v‹Í—Kºª ÞÀÂî[¦;´)jEŠª#?‹€Òsê«|E©çêì)ßÌí“Xôâ¿-”ß}ù·ï×Çñ Ø@CfåMŽ)æ¹ %*¸‚I®iyèô6Km€DH*4R-©Ùawx†Y$În8ÞBŠ,5‡*ÆÆ‰0IgâòŠÃÖ„ÒGrßr±98P^ ûÛ–æ &yÆfJ\»¾êfß´J¸Õ“—Ì/曚ƒŠüÙß||ìøïõ_ùD¬¼þè]YƒSËY#©ôìrïÔ©yŸ©Ö—L½²D¤Dù„P&AFXÄh¹ÌÁq ÏøzN’{V/Bþ˜p… !Ÿ]*M'OUê=<$Iêã¯KC•×Üá¾_na÷-é¶RÓå‡'ªT±‹[:Ds¥#ãê ª%€ÔY‘i³BJÔ~Âнà)hKxÌPT{XüZé)m¡ÑÙÔ©#6­J–e&=T>˜<ý•6tq´½‰$zY'±øÇ¯9ÁtÌ~©sýwÝb”€£ÏV𹯵gw¾äIñC+¼#¢€@úÛµ•Ûͧ¨Ï¹mlÒwù ©–ª´Æ o¹Ãö/7ýÊ,:cÊÒ§¾9«ÌLóÞšoýïš/x—‰~2æàì9AVAAŠyT5•æµ ß›zIÖa¾;ƇsŒ°õWfVº$MêQ½H(ºË9­8¡¥Å=êªÝ];¿%IêÛ¯KÃt×ÿýÃÃõ¿¸xÓª$Âî[Òm‡”5«ù¡Aúµÿ0]új(mã]³+b 8ŸæÐzãl»9w •˜±Â>Rѯd¯Ù¥˜ø¼ÇÛ •]ȳ7矇1iuÐoýöô»¯g´~Í Ü,ý:ÌàGÿßoæ[.þÐùÁ +×ã&ÌL”–výW™ÿ-§ñ„mýn‹Ç„0 ƒÁ¤Öéèv6O·øòé¾"%s¶‰ÁÝg ƒÁ`0Wh&ñ>Mƒ_Ò ê'>žƒÁ`0L*t›æÀ`0 ƒ¹rðy^ ƒÁ`°™À`0 ƒÍƒÁ`0˜›”‹`¦žÉ·â;.u½¡%v³‘ÜÄo›­Óœèmg*uqû·uMäŸX.¶TiÂxi(f€@¨G¤«ŸíŸÝÒú§¦`0¶¬íñÅQïImBˆé Жðä;ü%¹¼’™'ýÍÑÏ-'}7Pì‹Õf½^+Ƕ®˜pó4“{ïÏÿsYñ™?<þ³a¼‹G åÜÓ¼¨ôkûÙ%ôV[Û®ÛÆ4²aŒýѱŠMoZÛoòÍqT#_øëKã—”îÁ_>þû“É_¤Í£ç<¼hÖ„² 5‚„óÔÎõ]³«ëÐ<©þÀ·W,—§#¤Pó¡ÍÿXýÁ©Ðm½%!! ¸iV†rÛêìS‘¾—">oYàôÚ¬ËxÅz4§« ÿ­´£“uç²§–O/1Óœ«zëß__·ßÒŸ‡˜ŒÉ<»r¶éó—/Þ¨ “1~ÑÒgŽjV[ý‡§^Ýsþ¶rú»–>tß´a™jà\ÕÛ×üåí=®[rã*>s‰kˆ;mçûj+«t\¦M %nÄ^ÔÍܺ½tŸÒžÀ;¹ög©:÷ÚÖ•dÓÇœ<õg|€Hú¯c׊fÇŒå<•Λ?(³gÞüñO7‘ç㨺ô±–S'É^$5CFÀñÿù÷FW\•?sÅÓ+_⛟{ë,@è+¾÷Ò²A‡þôVU… £øá÷~ôýö•¿Ýº}‘.:"X™™/œ>N h”£-‘l|º‡TÞeØéº•ŠVYüðÏþuªcíª,“—¯|þEþùŸ¬kì¥G Û´'žùÎD®!öõÖ2ãîŸüz¹fÿšÿùÅ5ú!t)·ç\tÖKæÚZ6¯ZwÚ ys¾³òÙÅZ~üέ¸ '•ÈPPÕ»ÓjœÀ¡j:Ó½`¥´"ÿ´ ¡<‹DbƒÊcepv®³`l{ï ˜DàéÆÃéÛ)c¢¹’©î‰Ãz8¿ºj·õ`ÕÑŠ"mlÒlwyž@ñtãQcàüùbVߣËÂukíó Š¼¢µ¨&·sóã$O¾ç{êø¸™žQœÄRÎ㶆ëÒÌP3øƒQÇßxKùä³éØô|˜q…@†žôºî ÏW6–ø¦Ž‰äZ†6 ªþ2}ßjC‘í[¸0(ÊÚ|HÉÊ)åÒ õ•ÒšOjèîÍcO5…PÇ˧{DzjEÚÊ/ÌǤÜ[uÐo]1R·a·)jC™ã}ðÁpbŸíÃ# ^N-É ¯Hβ[Ý¿H5…âÆ/l'?[—éàDÛH÷ÝKÄÛQïã‚dºÞÍ¡­9Ÿû‘Âȃoà×Q3Cî} È·í“ÑÔ;Ï„&gÂËJå³kë;N²â•‡œ÷‘þ~³glåcôö=û·ñQ ¤P8œK4ZëNćB…Fýa? \Çu¡‘ácÙó7 ½IDATá–´¢c¸kx©<¡÷HÌ›éœbÔoøS®ãÛ'ð–µï|IKQp˜7ýÕ¬.±?yÚü'Û%Ó\SæŸÿ Ôeö'ïºÔfËëßÊ«Û<÷¾À¾·½‘îX1%h=iqHIbï m.ÉWùÔw6Ú’¿îT@S^l¦ª[“ö(%ïÁÕ¿;¤iÖ¥‰ª`Ö0¨]—ùÈO~?)O“h?þÙº7·œî˜¤ë9×Å5B•¦'bínö–tÏ”jçfóì¹í+ªu§ªµ²3ZPܨ‰1©&kónuÇQçEYÛ÷¤ÕHIá*Sí8{N–@¶0` U䣪·Íu.‘#–ã#ZFŽæö·+%SxT&Q»ÑTë"¨;ÍÅNãÕÔÄžïŃL’PÑDôóº/ašüäsÓí«ôQ3«Aàwg®!±fÑ.•×Ö+ ¥käú8‚Þ´!  Ìõ.x Ùiûødç¡w‚¢9Qz垪KO§»lM!mþ1Væà›¦z? êö¦§å·LŸ8¹UÕk¤Aˆ¨Ùf9åEs\‹JF/š­?ýÆŽ>5ÙÏúù~PÌÄÏí~ó§ommë,®~ïþôøË¯þrè—mÙãô‡^ýÕ{çnã}ûÉ´ð0yn;skÏ%BeÅüÑŒ øô'}ò‘ì^‡Š`2C…*¦ò-Åæ‰î=z' («+*¦²Êþ‰úúT2bj/KÄ›)ɬ:ç'“PpjH}’Ø{C@¨Íˆ{ÏŸ*F½qÐX´$@jÃÓèSO‡Ø”jË‚ò÷ÿñ‡Ÿ¶Hy³¾÷ÌK/p/üâc—˜$×E[_¾tñ¶Ï^¯‹ß’r¦ a7n~C—–)- ßý¨‡o°|ø©ÁÅbø,=x¾TôpèétŸßr% 莑0vÙÙ±Ý7"PD-«Êì,m™§Ý¸3‘ä^¼L6í²TÏ÷<üTÐuFw¢ÊPÓJ ×zÙ3ø¾ç¾kÛõëWøð(×|Yš\ʳ 4B€D¢ºÌ\rm Їæ?ÖÕÚ6]p½æ@BQEjmõÑTjЬÉàVáˆt‘js385Rõ>\'0mák¸°‰Êšµh ·ÿWü©éX ìÿãó5j•>½hÊ} žz,ñïÙÙÎi»paÁÙµ|c<=ñÐÒ¹µÿ±ñdð6­²©$l`Õ;ÜpŠSdiY$­ÒäDª¶J1qrȶKÕĉ¶QQ…Ã|&ÔñÄ@–Q‡ôd Éò*O $ ‰£8@F2¢—Ø{£oÿ~R©WB¬rõïß©ŠÉmV˜ú«9ã­Ÿ}äHeÈ© ¾ðLEë›/¾ßÈÞšz¦:;]þs†}ç ‡ö†ç.wÍ«Z³Ÿ‘d’,{”Ù"D€€Ù·>³®Û»p2G$d ¿¦y©ç§M¥Ò‰ïù^ t;ÖhÚ"ÃF„&/TÔ¥¿ó‰îš¾VÊäÍ™[¨5¾úÆ>\ùƦ'vÿüé?V'p{?ýcèþEòhæ»[Ô~‘&ÿ²ÇBçS“jCÖâ[N©Œ#\Skr>o"å”r•—EÝ®àäÔjÊUÓ‹«ƒ,!éÚ…l¤)¾~NûÇ¿¯‰¥zS)æsÄ|`om¬=Ç¿úÇ'¾yàЫGb„¡â©ïV´¾öôÖ¦˜ »Wÿ6úìªçŸj\ùÛÊÛrÑÅ•–  /üA¸ë£p‰9m  p½¡íÏȱ¥=1jˆÜ²MÓ9O/Ðõ­ÄÜ‘¡ô3i.™-Å&Ι¼·ì¼S‘¯ öÞˆQOF™T$€@jÌ*ˆy£}Vš$Äy9êtõ Ä#$7i¨Î$wCþèå…M/¯úÌ~ËNëQwxBª– äšE@ägJó9EýœH.øUd(‰Ãmä%™Ä°"¡,ƒ\B€(Á¢9Ÿ†$$+ib8«úªîu¾&D캃vݱj÷ŠÅþ²ýÚƒ×ò•W¾iã¯_Ü~ÞC) ûÉãºM¿üï£;>’u€¡MQ+R|qDãg(=§F©j#Vcþ|s2a_´Àé[›u´»fzÊ…Ä¼Š²ÉZíOQ`(êP° 6S+·vd!…,‹”p01¹ÕaÀ|™yÒâ©Êÿ³Íñõ&‹Ð =Úì=VÕÔSFˆ ­QP€2Éfb»ý}W™õ:bª©ùiämi&(k¸XK6lÍ<ÔµÌvÂýî’aì—R£êcçàžQñ4*”#©?>GžŸmkÜž~æ1Ç7¾`yÂß`þ`WªñY–ÈÐ/°÷Ø{½¼§ÏÄ—ˆ³n €0–¥Åê¼ü•¨÷¢pî©mbŽ.M{»É)cÍ7A -Ø«‘Cª‚E/¾ü ôîË¿û >~ o @ï˜,’ÈLç¬Y±aÓ\“¬DS #€ÀTUªè2ç¼ÉáœtÎ’Ï*4öRb@¿ï zcRIÜja3rbeã}e&D¿î„S,šé+J´ÆDé4ïà®Ù^1¢lOˆEÃ9FQkŠžé³¥02‘ä^@ùcƒ%¹¬Q+ªtlÎ`V!PÁküÊ«Ìy[Ïvþkj‹ˆRÜÙt¶Ù“À³Ý/‰("À Mh”¢!74cFìÂ~ ©hC&ÚöemmäîXè¢ê=aˆT !NP§Üw®ÍXéà+æø Ò­ž-˜ìoT©Tò}­„"oî’âÈÎ÷_fù93tÙ_zî…Ÿ.Ëg. c”.\1ꨡ¹fkNñÔ¥ßthüÈg5€wŸ8MŸ³dö›)Í’7~ÁŠ{ÓýGÝž+0¥ôáauTs¸Vér*\N…Ë®=|šÔ…ÓéNÓÐZ¥²ƒcÊY®Þh¿0)ëKý…¼áã ¶³¶Wj‚)bbWVÈjT¢ÖÀ«¨«¨_Ibï B¼nËvÇà%O>0*Ï6¨|ávíØ\KªÞ¤ÄN¿»Ý9dé™0$3£pú²ïL%xÔ'öæ$ÿø•GÒ­}¿†T\Z\RZ\4ØÌÜŠ{ØQ Í ” ˜Guò“ì f«2× ¾;Æ{M€ ¨¿úP×[!>Íþ¨Â[1½m¼ @ ýíÚÊŽ×MEúèæ,å÷ìeAR¤ZªÒ¾´{Ë;#«jï‡&Õ]¾EßòGŸ­´|¡të|äñy·v.1â–<@ž½9ÿ<ĈIî%eŠL™äÑÒ€âõ¡-Öºndo·ñÓ½Üìiö'fçÓÚ‘ÁÏöœ°MIU·5Ó¸¤mÞzý&£GL’KÊç7¹L9¯¤Í™#ïÚÄÞÔÅœšý,Ç:Æ9’T‡kÝÙЗ/ºÛÒ¼asýå¦åÄPsk ˜Öæð…ˆ*&Äô‰Ë_\jR€j>¹ã÷ÿöοrìä_~ý:·âÁÿÇ %@ÌQµõ¯¬«»-'üvD¡¬Òw{™™pŸÐG‡GdšÛZ`Û gXûˆ,²j'Ó}(SŒQ¼>8ïÁ. ¬|/s¿½÷Á™¶õ7kfëwRïÞy2„€JÌXa©ïü~ÐÁ#Ùkv1}Œó7 \æ߬bžú泿[NóÞš¯½ºþ Û‹z“žyç•WÅï~ó{ÿþ "ÍûÞzõ/»{[ GgLº»€˜øÄKÏèüà…•ëo½&ðä s“ Ìs-»—?önæ1')Ê@*¸’¹ö™*óßÖë#x¼s=Á/+b0ÌÍd*Šj¼†SNRìXfÎÒN7H™Ä[ôc°™À`0L  ˆ“‘-¡’L‘D€hÑZèŸQ.zjUl&0×[œxšƒÁ`nH¡`ŠkòðxšPܧ8{Ü´¯JÃsl&0 ƒÁÜÌài ƒÁ`0ØL`0 ƒ¹~üÌ]]dÛw,¼IEND®B`‚django-q-1.0.2/docs/_static/logo.png000066400000000000000000000137661352353655300172650ustar00rootroot00000000000000‰PNG  IHDR€œ·*£+bKGDÿÿÿ ½§“ pHYs.#.#x¥?vtIMEß à6X¨ƒIDATxÚíy¼EµÇ¿÷BVa a‘M dOÔd û¦Š6,>xø‚ዬ¢< )ETP0/È*(MX^@6! !$!` IHrý£ªM1Ì;=U=Ó3™óùÌgî™®íüêÔ©S§Îé Å¨ð½Èüg``+àóÀÆÀzÀ `M 7Ðè¯9À»úõ0˜î{ÑËÝÕÕŒÔÑJ /Æ…!À¾úµ°AFÕ¾< <<è{ѬfDG 0}p4p ЯAMšÜüÖ÷¢G› Í €ý1šéy£åÀÍÀ­¾=Ý€£Ù^Œ ý€±À¹ÀM‚Õ·‹|/ ó*:óÌxMãÂ-À"à’&b>À&À-ŸÐUŒ —ieÓì[[T˜ñë×£[l£r¥ïEç¶%@…6ãµZ±j5æœÓ^º÷Ÿp‚V¢¾CëRWž³zNÚ1¸þìJ›V `Ìz˜Ýfþ*$4óW/Æ…IÀˆ6V½%` à9`­6 V±% Fo´™¿ ÀXïÏîkû*´†‰À©í!_…`0ÿ4Þ¨3˜:Ê}uÎ?x_¿ÖÖÖ¯¡(?‚MÍÍÚ¨ù¿Žk@ß^žnó½èñ*Ÿ™QÚþ’>ì©ÁQ÷Ý“ëÃ¤ŽŒ™§ÔqŒž¤ïE×׫¡N'†¥xt™ïE½,êÝÇ÷¢Gr­jæ_V'æ/nÖò½h'àúz Í÷¢åÀU¾ Öî–աꛊqáÀ¼K€€Û2ˆ…Àõ¾Ÿ§5µ®þ è•‘˜ì õ½è•Ü vžÍxœ/ËãËŒCw»WX¬ Ì·Ñ :v˜b\è ÄŽkôÏ;óõq0x&£*:—ôrÛXÚé_2ÚY,ò½hwàã&Úe-ð½hpðIåoXŒ w7\h^ ì˜A'_AùïߟÔÕ,d´µ¨m of xQŒ ¢aТÿ‹Àø Æp‚ïEC¥Í|C·}¡ïE[èÝ‚kºµÖ²tÚ2_wî¡ :%|/:£Ùf}OÒÀ÷¢Ñ9…>\Ë8uÚvª.6rÜ™ƒ}/ú)-JzX1.¤¶»tØÌ~m™ã¸#Ã}/šF›zÚvG«Ë«Y§%Š]¯g{mæ[êi$L‡ÅìßxÜaÃó½è®zŽT ¡”­&@`¾] l–€mõk¬ïE×Ö‘ñëƒQ–´þ¨«â]À\ÔÕðyÀìPÊšø^´o–àkÀdG}ºß÷¢ƒ2fø ”×ñÔqnº§óˆ*°=ðBOR Vü ØÆAú^4 «K“_Eîì¨ÈJ9µ ð°ïEû9•zíÿ20ÅQªBi Œ ÜCv/‹€ÃB)ª·‘ ¼¯ß¬4¾©vº Kõå*ß‹œ0?"yÿB Ä{(ÇÓ,ÝÝúB¼…rûwrFö4¾if1. öwа}/úžKM>â:àeTüŸzѦÀŒ@ˆ tò€“Ù4’Æ:jرÍ¡ý!^Înà@_ñÐ;o (Æ…Ó+}ŸVLžå MS|/úƒCíþ]`µŒõŽzû¸ðQŽ0p0ÁJ Ô³u8nœ= ¶Ìß¾-´^(åû9PÚ øG¹1ïHQñ À·-ÛÿœïE;[2”ÀòK‹QÞ@K]ïjÀxß‹.µÝœà ýçØ¬ýÆ–k&ù¦¾Àë9R O´]>ºQcCs}/ì`ÝŸLsÐ/C)Gç@¬á{Ñ¢Z%À‘Ú~£æŸÚDÌ8!â蜴åˆrÒ·Z¸°ÕO°ýÀDšî0t—FÒ¨rJ`µØÛ²òi¾Í®õa½îßFsÒê7äàØyŸšt€b\ØãÒd4Î÷¢«-´þ,<¡.±‚…êNÅÇUKãðÇ–&[Îþkh~º"R`ÏTK€^3<ÛZ}/šžÕ6¦‰èì´a—Zt€a–•þÑRóC‹PvÃj€­ãÇ“–Ï· rЗ/Ö€-+µÿÃ[4¸þ­R \„r« zï¿-F»4°ú~i%À†ÀW-´ÿ¯ÒzÔÐ>ãÂzi°¾e} -Ÿß¾°]ƒëœ¶‡7 ÚÈ¥@_ËÊæ[>¿A `Ã×ß? ú4X´b<áF÷©Oô¶¬ìCËç;Úp>&½ÓÀ6®Í´©”lFX>¿4 –XV6°Á$4¿Ácº¸ž°wóZó €%i0·ÁÞ‚xÁå^½WOØ®Wÿß‚˜^«{˜ÄiKsÒ`¶mmŸ°…ÅãSZS,C¬ c¾Í­¾¹¸ÝbcùšÜjÜ¥|²Æ‰d;–ewuiEF=QJ¹ x©…øYÌ\àµZ`’üK–ÏßÚB¸ÕÒ=Üv,?s2[ÍíàiÀ•ÚÞ)˜\Ý Ü¥µWèž–ÏOK%ôºc{#¸o1.li1h I-Àÿ_X(ÒãÂnÚ§€^wžrPqÍR@‹Ìq-€š#¢h>¸¸÷TjÀ÷"JØÑ€PÊ?51óJ9˲Œ£,Ÿ_è{ÑœZtPž½»[T¾·6b,®%0„–ǰ2¿_³Ñ7lÄ?*‘íàárV{7ðƒpF­QA´ø¸¸ ™¶ÞÎÚˆÿÓ´ã›ÛÁw;hÀi´è i.óðc¡”×ça쀻k¾¬¯vÙú )Æ«[Fz)h–{+B)÷¶½^Œ #Péflh¶ïEïØ,à&4üU– Ä!M€ E½ÒA[ºå]g•(p‘Ác¿b\ꯑï;;s\/à&Îq·¼K+xö>i÷ú^t˜‹Q„Øx.gÌß"”òMãÂØYaÞ÷½h=+ `ÐOôëÐb\ØÍE¤ÐPÊçqŸ¯¨VúXËóµåïk˜ðãJ_¦‰*úô5Ó÷¢M\Ž~ Ä_Q9A†RŽpY`1.|„§Ú¨–vÀ÷"|/š<í QŸ+Æ…±™O(ån@#.“îJ9Âe(‰Íóô½hA%ûKG ;w‡3kc™ü¸Éßב}DŽ B)/)­ÛVô£Âº¾é¨_ñ½hª“% ¤¡³psÅé-ß‹6w¼˜@øà:QJy«KÆ—Œí?±w¦xÑ÷¢=ˆjMçêtn³b\˜àr æJyîã:Zíª¡Èe(„@g(å¿:2`þ¯1¿jÙd {w—7îÉ:E¬fÜêºßÃPy 7>¬ÞAÅ!~erî–Õ#ºW1.| ¸ÙQq/ù^´mÖ8p™çoW ®GžàjDw½réuÿ@tvtG´¿ïEʺñÏ;9lxÕ [4ówžwX죾íSímÓÇŸàxLþ È(»v™¿‘cæ|#Íøu8èHœâ¸[ÐCº³`~fì«}/J¥ wÚvÄ÷¢Xî¸#3€/µ°$øZÌÿ§ïEãÒŽ™Œ:2ƒAššdÉÃìÿ.ÙÜxQ“ºè î²P™Ãb\xÄ›Í,ò“HßWePÅÕ¾Õä½Ý骃¾B6÷ù÷.Æ…Q™¾›•6+Æ…eÔæ½½Z‹èw-’?·ÉhûïãÂÍ" ŒY?eÛÏ*·á6É·;]¶Ä÷¢÷€#2êhp¼žI#ò £M_/Æ…åZáËŠöð½h‰Ín©Óu‹|/úð?vz5àŸ0í– mUŒ Û³_ƒÎô½È6»ûjqtnœH+ÑZÀcÚq"™¹„ÖUî¥$cô¿¾ÝàøYÍß‹(Æ…‡¨Ÿ“ÆRTL¡£}/z£N³þ‹¨ó/½êÔÏßø^tŒÍºŸ9J@0û{íii!ð6p…ïE?+mS-ý0þ? 8eÆí_ç~Ýï{ÑA®˜Ÿ)J@07ɧj¥QññžAy3M^÷½hy7íîlºÕ<u/¯/*gq£È9ó3@—ƒ4Ô…rúèÐ fÃÓ:û™*ålºáûãærIÛË^¬tÉ]“ó©g‡ Ip-ò¥t’ïEŬ˜O½o€`8ö¡gZ†ú^ôJ–̯;JÀЕ’~ƒ6¯?E¯Ûù^´´•u6°£‹P®å—·yþoç{ÑJBº·$±æ{Ñy¨|vKVaÆÏ6ñ½èê¬E~n–€2KB'ppÉ*Æü³€|/êjDå9ˆ¾]Šº.öä*ÀøÉÀß‹j½°ÒZ0ÄÞ|ß‹öÐËÂŒdü À¦¾ŒÎ«ØHç×Ü'eÒEîE¸43= Y¯ƒª–€„¡â6Iàûå‚4æ:›h ßñ½èXÔ%ÍÃÉw>¡™¨ë^ýµ¯äœ¼6´éòò™Û¤b\Œ:`ºؼÁM{Yïbó½h^i[ÛÈ kj‹ ¬¸~fùÀ=¨8 ›…é-€ÀÑWƒ`”ïà—ê*xz•»h ð„çïù^´¤¾Ê ptýP)ØVc¥ËörýZ‚ l½‚6µ©MmjS›ÚÔ¦6µ©MmjS›ÚÔ¦œQi¬âjcwB|8žÏ:%|‚ÊþûPÊŸ&…Ö#v^›R3`40è£y÷6ð›PÊ»*ñ®#¢Ú$O£B)çW‹È6X²›í¡”BL¾‰²jvG](ï£Q¨. „S‘éÝЊPÊ‘z©8/bmsê¢å:å¤I›ìÖ|-ö»´˜ßxWORº™¼ÉŸ‹C)w×ÿß±U DõÐJ¡”ÇÓÿ¶´òPÊe¡”ÿ¬%…JµÏ$¿s•¦%oåt3ö?få æíHÆÞàÝ^¬t¥»3”²êäÑŸ*å“÷208â`’ÎïK ÄT¢é]( !kh¯ëWêÀ2T¬þÛ›»ÛAèT0ê²—ÛB\¬•þ(7ëéÀ÷B)ßêi'b|ÿ@ˆ#QWÕ:µx¢Ëù8Å q&*íKà#=YƇR¾b¹3:S¿¥|¿FJdýG`x Äö¦¸o(å#)ОDý¸;”ò(ãó¤¼B)*Ãü_ÇU(úCà¨PÊËÔ™”}*LËžʹ7”ò°Jƒq<*fAß åL ¥<½‡r¶¥²·Q¤Û»" 4ÓŽGÝ ¥ìp ©ÞA…¸¹ÖÆ+8ÙNБ© ó_3˜¿•ÆåT‚§Gõçk˜ŠJºÛ`þ\TXº“€Ëô¬84âù¥ƒp¡îC_Ci=(ÍÜqZ ÄSåÊÑŠÙ^À«ó_ÎNÖíIì&ý÷À4K…KYåÏŽV•Ûõû«[ «Fü<ŠºíCéVDÓõéNn©•—Q¸K‹L¶£'†RÞVòÝùcC!î ¥<®„qǰ2–á4-­L±Bœ\ü'àBÜJù’™ù9 Ü.T ¢ÝB)§—iϱZy¼J™6Ùå¶%cn«§$ålm#Þ3 ]£‡íË(T~€o‡R^ÚÍ,˜J¹*nÀ}Äåè2ÌO¤Í5z±]I}ÉN&¥®×üÏXÐB)ÏÖ³à뻕$ŒJÊù¤õrà.-@%•¾ åX¯Œ¹­¢©Ûðn  Ìusi^¨ÿJycw[CÌ&"oÍ@ˆÃÊtú¹PÊ_VÚú„R^©K€ÿ0²‰j,Oûv·¶šóù /0ÊÙ\+»Ç…R.ª´¶‡RNnÒÿþwʱNÆ·#Ëj»O:-ÄÈÖ¦±¨‡G†ë÷+{B°ÞMÌ0,Ї–éôÏ«lj3ï(ý>)”òØ–ô5‰itˆÑÿC“A ¥ü]•c–¤‚ï‘&°ö[ú}ˆ£% áݬN 1’A~®‡ Í;SS 8q¶/w)ô*;šÌÜAÆWIySSôuªQn_ýÙдå„RšíšbÈÿªßªác!ú”,]Ižãgl–€$›Çozø]oãïÅ)Ê_Rf©1-ŽÕ0nY‹gÒuIŠõÔŒ^Ò¯´œÇ/MhÙdŒBRÌ.ÒËÎl` ­õ3€to­KÀÅÆ ^×ÃÏÍÆmR úP²¡·“ò«‘Fº½C+”³MŠq3mg¦¸¯èí%€LÑîdi¨ÛÛËÐC¥,v¦d<Ãñú£Ÿ„R.ì¡ñ‹5Nª&ac DG²Þf@‰½á„*@T(g“@ˆ-«öÉ%Jašu;9}qY•KÎ3ÆîkmÔÙÁ‰úÿ±¥¢±ÚxJï{g…RžUeÇoÐï§B ©ôŒðŸgÁy]ï“¥%âÊ*žùŠ¡8ší|ø 1Lugp2@Ýßà·iu. ˜$Òê÷!Î5úTéÙÇ £Y’v篡”צ€¶œ=cXñ¶¯Ö¶­> 4pžM´Y³ñÆÏ5(÷&ç¤r.0Q4.b\…¶x(O¨îè›ú}§@ˆÉ@°†¶&ëþ·ÒîçõX à/ú£Ë!îOt¬|KMï›Bô„ø”CÈHVvh«Õv¨ƒŸ ‹ß<½&ÎëæÀ&)oDbÏ×Ùø;+nB½¶ Ð&åq†µÃX³kIÙ‡‡Rþ¾ŠA €[€9¡””˜¥ŸG¥m•(ú‡Z¬/A%u<•þ¦‹O»Ì­JùQÇ´µ-®~¯-[hœe<`(åµJ0ÝöIÀÁÆW÷hEñ/š?kê¾¥y—ïïÆø¾ljJ€?èYºe³ž <œa0b(å î˜ßÃÌ{]WžØêG럣·k7ûp±ÆZ©£´ ÃÀ³#+VvЍ«àïê~'¹f_©À³Q!@¥©¿xI .aþ^µ2¿¤í‡˜ú„në/QQF?ÐvƒIZwI˜i(åÖ†‘m]`Z'=Gâúð`ÞNŪ ×C)×BäÍ*óýý€Jy²¡õ¾`|ÿwcÆVCÉï^¬0ûQþepº¶ÛÏîÁêx¹–p·—ùÙ"-úéõØ…)—PÊŸé“Á1† ”^ÎÖ¥¯ûü°‚^ZãޒϺ…J9«TüT!¦ª>^„è:–\Jùni=ƒC)ç˜FŒ@ˆÕz&ë2Ö ¥|¿¤ÜÍsP!6F9]Ì ¥\n”±­¢µB)?ìN<ë¿éem^òÛzxIB¬§¥õâd<»«;b°°Ãa剕íeýÑçµI7Wqê8ù™PÊaU>“œ.:9Ï9‹¦–ìO?Ì#ó5%”»BŒ¯Â&Ñ[‹ðDÙ¢ €2Û@ˆó´Ö‰¡åŽB)ÿl˜V/„¸ª»>¡\»Ì¬ŸßÎÊï¯QÔQ+Óõz¼»ÞžÁÊ¿(”r÷¼vØhûS(ŸÄdk{#Êð#­®_É6ðàPÊÉ­&:,òÃ<™Ð¡”æýZ˜‚õ~¿-ö ¥œF ’ÍX?ÒûæCšù%ÛÀ3´±f‚Þ2­0˜þ0&”r Êm¬%é_0CCšüYãIEND®B`‚django-q-1.0.2/docs/_static/logo_large.png000066400000000000000000000701161352353655300204270ustar00rootroot00000000000000‰PNG  IHDRnƆºÐsBIT|dˆ pHYs.#.#x¥?vtEXtSoftwarewww.inkscape.org›î< IDATxœìÝw¸$E½Æñï²»,°ä € HÔ‹Œ DAZ¥óEÅ„s[¥@1ƒJ›à¥ ½ 9çÝsÿèY÷lb÷œ33¿ê®÷ó<óœÕ{wæçt¿]]]5iddi>ܲÀªÀ*óüýçéÀ4`Éy~.ìϳ€Çz¯ÇGýyQÿùaà?Àíó¼îγJ‘LR‰Ÿî™ÀŒ¼ÖdÎ ~šE¶1z¸¸ùËÁíÀ­ÀuyVÝi–P$*"ðÁM66ÖeþýÒ6ÉÌÜ\\=ÏÏëó¬zÒ2˜H[¨ˆ Yïj~óÞëy½Ÿ›ÐŒ+xkO701øGžU÷Xi‘ñÁ-A}E¿5sNø›ϰÌÕb7—Œz]¡Ñ‘…SéÜt`;Àõ^Û+˜†JÛcÀŸU ò¬ºÙ6’H¸ÉÔCú/î½¶&™†’AûpVïuNžUç‘QzWù{SŸð_¬d›H = TÔeàÌ<«þbœG¤¯T$y>¸-€W/¶BWù²`·Ò+Àoò¬zÄ8È„¨H’|pÏè½64Ž#Íó0ð àà·yV=aœGdÌT$>¸M¨OøÇ‘ö¸8º œŸgÕ,ã<"‹E@ZÍ·1s®ô75Ž#íwppJžU—Z‡y:*Ò:>¸ƒÃ¨ŸÍ±pð#ê2ð7ë0"óRÖðÁí¼‰zB_j›çHÜþ |ðyV=`FT¤á|p«9ÐA÷õ%~'ßȳê¯Öa$m*Ò8>¸IÀîÔWûûKÚ&— ¯?Õ¦EbA@÷õ}ý·ëÇé—Û.ð<«n±#éPèùàž¼í®'í5ø9õís¬ÃHû©H´|p›ï^ L5Ž#2LW_¾—gÕcÖa¤T$:>¸ï¥^‹_$e·Ÿ¾gÕÃÖa¤]T$ >¸©Àk¨¯øõì¾ÈÜ¦ ¥_TÄ”n ðà(`mÛ4"Ñ»ø2ð•<«îµ#ͦ &|p“×E3úEÆêêGϳê.ë0ÒL*2T½gø>Žî™¨‡oŸÏ³êvë0Ò,*24>¸ý€OϳÎ"Ò2˳ê8ë ÒS¬Hûùà^|ØÚ:‹HK-ì¨ÈbSñÁm|pÖYDDdn*Òw>¸5€c¨7é™dGDD@@úÆ7 8ø°¬qy*Ò>¸ý©W,[×:‹ˆˆ,š €Lˆn àKÀnÆQDDd Td\|p«Ÿ¢Þžw ã8""2F*2f>¸C¨g÷¯bEDDÆG@›n]êUÇ´KŸˆHéÈ"õÖí'õb>ËÇ‘>P§Õ›ä÷]àùÖYDD¤Td|pKQïÔ÷>ô=iØe>>¸].°u ù/Ü’À§÷ %|EDZM@ðÁm œ leEDDO ¸>¸7üED’¡€„ùàV¥žáÿrë,""2\*‰òÁ½8XÃ:‹ˆˆ Ÿ @bzýŽÞ&ú‰ˆ$K !>¸ç?¶´Î"""¶4 0>¸——¡“¿ˆˆ €ÖóÁ- | ù‹ˆH @‹ùàVN^hEDDâ¢ÐR>¸ç§k[g‘øh@ ùà:ÀÑÉ_DDB#-ÒÛÁïëÀ¡ÖYDD$n*-áƒ[ø%Yg‘ø©´€n3à7ÀZÖYDD¤4 á|p/*tò‘1Ph0Ü¡ÔWþË[g‘fQh(Ü'˜jEDDšGs¦·™Ï÷€×Yg‘æRhÜJÀÀ®ÖYDD¤ÙTÂ78ØØ8Šˆˆ´€ @øà6ΞmEDDÚA“#×{Æÿèä/""}¤1\œ<Ó8Šˆˆ´ŒnDÊ·#õ3þ+Xg‘Ö™<<¸ˆ×CÔ ÓeGý\vÿÝôÞKvF¬H³¨DÈ·ð êªÈâxø'pMïu-p/ 8±çYõð Bøà–aN)X XXžŸÏBEa&YfQˆŒî%ÀéÀRÖY$:#À-Ì9É~ý_žUæW€yV=<Ü ÜüiÞÿÜ4`]\Ö–V^‘”©DÄ·?p ZÝ/uÿ >±_Íœ“ü?{'ØF˳êqꮫçý¿ùà&k[;;ÛË 3£H T"áƒ{ p0Ù:‹ Ý“À%À¹½×%yV=aÉFoãÖÞëLÜÀfÔe`v)ØÀ*£H[L15LžîÀQ!KÅ,àÏÌ9á_؆+ûaòÁ­ lÏœR° š3óÛ<«ö¶!Í¡`Ì·õ„¿%­³È@ý9'ü ò¬ºÏ8O«øà&›S/“½°éM4T1Q0äƒÛ•z˜S“žÚçzê“ý9ÀyyVÝaœ')>¸g/^ ìI[@ÆDÀˆn{à÷ÔKI;\ œœœgÕõÖa¤æƒ[؇º ìM{o$W|pSYyVÍ´ÎÒDºçlÀ·õ•¿NþÍw7p*pbžU—X‡‘ùåYu?p2p²ni`/ê2°/°’e6™°U€£€·[i" ™nà`Uë,2nO¿¢¾ÚÿMª3ö›®wõ¸uØŸzá¢&Kq`uà6à½yV}Á:OÓ¨ ‘î9Ôû¬aEÆå"À§åYu¯uéŸÞâD¯¦¾’ÜÞ8Îx¥\F€ò¬ú‰q¤FQܳ¨O k[g‘1¹žúJÿ$Ý×Oƒnkê"ðZš5A7åð°GžUFj€!ðÁ-\H½º™Äï!êE™¼&éòÁ­ ¼x+õRűK½Ül¯²¾xR{Nvè|pS€ÓÐÉ¿ î>¬“gÕ[uòO[žU÷ôî+o¼„zwÎY¶©dV~ãƒ[Å:Hè)€Áû:õ£G¯;€ãoäYõ u‰Koyâ33}pëQ ¬lLfCàg>¸ôö…ÐÀùà>¼É:‡,Ô-À;yV«“¿,JžU7äYõ>ê-n²M$ ±pBos)Y ˆî@àë²@×Ç'è><«J܉@ø°ºm*™ÇÔ[RÐ:H¬40>8œ¨}Æå*à`£<«º:ùËDåYõDžU_§ž$x$pq$™Û‘>8Â.„ @Ÿùà6~L³Î"ÿõgê…^6˳ê$-*ý–gÕ#yV ¬|ŠúI‰Ã×}pš‡µz °z[”^ <Ç:‹õº ŸÊ³êLë ’ÜjÀ‡¨' ëb@.܃ÀÎyV]9àH¢€>émGz:ùÇà6à <«œNþb!Ϫ;ó¬z7õ#„ßž2Ž”ºå€_ûàžm$&*ýóY`w뉛 |Ø8ϪS¬ÃˆäYusžU`àGÔKÖŠgQ—€å¬ƒÄB |p¯Þk#qYžUïʳêë0"£åYumžU¯¥Þg@ÃÐv6~Ò[ -y*äƒ{.ð}ë »‹úyl§û{»<«þ<Ÿú‰Gã¤êEÀ7­CÄ@`zCIgËZgIÐÐ¥~¤¯ì­Ö&½<«žê=1ð<àlë<‰:Ìw¸uk*ó`#ë ºØ!Ϫ7åY¥ç®¥‘ò¬º>Ϫ9õH– ×ç}pÛZ‡°¤0N½e~_i#1÷‡ÛäYu©u‘~ȳêDเ·Î’˜©Ài½]“¤0>¸=O[çHÌ©‡û¿ª…|¤mò¬º+Ϫ×/¤^ªZ†cÞ3@`Œ|pkQ?Î3Ù:K"þ ì™gÕÁyVýÇ:ŒÈ åYu6õÜ€cÑÚò/ð~ëTÆÀ·õ•èªÖYñ[`«<«Îµ"2,yV=šgÕ‘@ë<‰ø”ngëæ06GÉ}I ̤^FõÅyVÝiFÄBžUv¾f%S€õ–pN† ÀbòÁm|Â:Gþ ìžgÕ1z´OR×Ûmð€×  †mMàäÞHo’ùÜtê¡­5X³‡ü/´"“<«N¥^@èoÖYZîÀG¬C ‹ Àâùõ¦2òY„<«®¶C ÚGSY@`|pûQ/5+ƒ¡!‘Å”gÕ#½Ç;ÀcÖyZj2à}pK[4€§áƒ[“z¹Y ù‹ŒCžUßv@k ÊFÀ1Ö!M`!z Cœ¬b¥…4ä/2AyV]Aý¨àO­³´Ôá>¸Voñ®°p咽"ý¥!‘>ɳêþ<«öŽž°ÎÓ2“€ï÷6}k%€ðÁm|Æ:G ]dòé¯<«¾H=/@úkêIà­¤0ÞИf¥eÎvÕr¾"ƒ¡ß­9Ô·¯uˆAP˜_ØÅ:DËüxIžUZ‡®®uóÁTFéÍú?Î:GË|80ϪǭƒˆˆŒÓêÀ7¬Cô› Àܾ¬`¢E>–gÕÛò¬šeDDd‚ðÁíc¢ŸTz|p¯ö³Îѳ€·äYu´u‘>úZ›R|p+¢·úåqà€<«¾mDD¤ÏfGY‡è€ÚqÀÖ!Zà`ï<«N·""2 ïõÁmb¢’/>¸]ÑZÿýp;õc~ç[ ©Ô“›/éàƒ[øõŠO2~×®·4©ˆHÛíâƒ{½uˆ‰Jº‡Z‡h¸?;æYuƒu‘!ú¼neë‘lðÁ=ƒMæ0òW`Ï<«î°""2d«ÇZ‡˜ˆd ð)`yë võ„¿û¬ƒˆˆ)|p;Z‡¯$ €nK °ÎÑ`w{åYu«uC“€¯ööiœ$ õîN©þ³OÔCÔëúÿÓ:ˆˆH¶±1É}p¯vµÎÑPOûåYu™u‘ˆ|º‰+&U|pKŸ³ÎÑP³€Cò¬:Û:ˆˆHdž ab¬’*ÔÿͰÑP‡çYušu‘H}À÷Lëc‘Lèmõû!ë utžU_·!"±å€OX‡‹d p40Ý:D};ϪY‡i€Ã|p›Z‡X\IÜs€Æ/ÛhàtàmÖ!DDb2 šg–D>L±Ñ0ç¯Ë³j–u‘y±îÖ!Ǥ‘‘ë åƒ{.ð7Ò);ýp9°[žUX‘ÁëÅÔ·Ç––í½fÿy&ð õúÍþs·,±I+2‡nuà6ë p%°UžUQŸ`S¸*þ8:ùÅÝÀËtòo‡NQ<ØØxÔÏg0÷‰~™q¼ï,攂ÙÅààjàšÞÏ«»eyïÄÿ)Dg à•Ô·Q£ÕêÜæÀh»ßÅ5ì›gÕo¬ƒÈâëÅ`æ>ÉoL½Ó岆Ѡ^6újæ.WuËòFÓTÒ üØ2æQ€¶|üÇâs:ùǯS“¨¯0öè½v¡¾’Ñj½×ΣÿËNQü8·÷:¯[–ÿ2È&2H›¯Î°²0­ðÁe€–¬]|»æYõ”u™_§(žËœþn@£÷!_€˜»ÜnœG ò¨G ·Žu Í#Ÿ´Ð ÷¯ÑÉ?¢X†úêa`w` ÛD·^ïu@§(þA]Π.zEšhKàeÀÏ­ƒ,H+G|p;P_ÑÊ¢POúû•uÔõ†öwr`âÖ¶[€“€»ey•u‰GF.ϳjkë ÒÖp°—uކøBžUﵑ²NQlL}Ò?XË8NìàSºey§u±Õðò<«~ab^­+½™ÿWZçhˆK€]ò¬zÒ:Hj:E±*ðZê}Ä·1ŽÓDOgQ—_vËò1ãà[À»ey‡už€—Æv«µUÀ÷,àFt`]QIµU§(¶>L=!H¦Æ£@ø\·,o±#ƒ×°pižUÛ[‡­màXàýÖ9à‹yVa"¢Ø•úÄÿBë, y‚úÖÀ±Ý²¼Î:Œ Nà ÀŽyV]lb¶Ö<èƒ[x³uŽøðëm×)ŠSŸøu–-Iý8á;Eq*pL·,ÿfœIà@4 5#>¸wÇ[çˆÜ}ÔTÜd¤­:Eñ à£ÀVÖYä¿F€_ë–¥&·HGžÖ˳êfë Ð’Üà]Ö9à=:ùF§(6¾¼È:‹Ìgðr`ßNQ|8ª[–÷g’4MÞiÚ³KÞ«µ­CDî"àûÖ!Ú¦SKwŠâhà¯èä»ÉÀÿWwŠâuÖa$Yܘwà„¶-dóôfou=ê¦êÅ>Àߣ€iÆqdñ­œÔ)Šó:E±‰uIÎÊÔë˜küÜnÀyÖ9"÷¥<«Þm¢-:E±ðeêaei¶'/GwËòaë026 œ0Û?€M­/ÊÚ0ðë‘»zRšLP§(–ìÅ«ÐÉ¿-¦R?:üNQ¼Ò:Œ$ã¹Dp˰ÑÀ·*°ŸuŽÈ‘gÕƒÖ!š®SQo/ý ŠûwÒWk§wŠâÇ¢XÞ:Œ$Á|âz£ õ’¿KZ‡ˆØ9yVýÈ:DÓõ&Œ]<Ï:‹ Ü«€?wŠ"ÊÝÛ¤UöòÁmh é c bOP?n"ãÔ›áߥފvYë<24ëuŠB¿?2H“€CM4u ngàÖ9"ö™<«>l¢©zCþ§›[gS?ë–åÖAd~ ž8ÛmÀZyVÍ´øð&èêáþ|Ú:DSuŠâ ê!üåÕÔ·´²£ ÂÀ‹­>¼‘À·"õ½:Y°Ãó¬zÄ:DÓtŠb©NQ|ø!ò—9Ö.îÅÛ¬ƒH+™Ýhd–¶©_i›ß±ëÅšÔ›thdIdðõNQœÔ) M<–~Ú×·šÅ7µè ½`‡[‡hšÞýþ‹€-­³Hô^üªS!’~™ŠÑÊ€+>¸íнمùLžU7Z‡h’NQl üXÇ:‹4Æ ó;EarÕ&­dr qxƒu€HÝ|Á:D“tŠboà\`Uë,Ò8PuŠb]ë Ò ›úà¶ö‡6ªøà&û[çˆÔñyV=j¢):Eq0õñÓ­³Hcm@½^ÀÖA¤†> ШìhØm~÷ß°Ñ¢8ðÔ÷ÞD&buà¢ØÍ:ˆ4Þk|pCÜÞ´p u€H}Eëý/Z§(&uŠâ8ê[%“¬óHk,œÕ) NÊD¬ì=ÌlLðÁMAÿ,ȃÀW¬C4Ä7÷Y‡VšœÖÛ7Bd¼†Z"S€=U¬CDè›yVÝc"v¢ø$ðfëÒjKßïM.—úà†¶ÎD“ €†ÿç÷(p¼uˆØuŠâÀG¬sH¦?éÅvÖA¤‘–§~Ìt(Q|pSWXçˆÐwó¬úuˆ˜uŠâ@àËÖ9$)Ó_wŠbcë ÒHC[æ¾€º­d"2OŸ³³NQ¼€z¶S¾çÒ«¿ëų­ƒHã¼¼7çmàšr`ÔðÿüNȳêfë±êÅó3­Û.VÖ~Û)Š•­ƒH£¬ì1Œоô&D¼Ü:GdfÇZ‡ˆU§(6~ƒvô{›Pï°Œui”¡Üˆ¾P/þ³‚uˆÈœšgÕuÖ!bÔ)Š5€ß¡£$;P?"8”a]i…WôV¾¨&€[ˆÌðë1ê`Ì0Ž"2¯}€O[‡ÆX ØeТиiÔOHí)àdëú$°“u‘1ú€ö Å0ÐÛÑêzvvŽßiÙß¹õ °Î!2“€;Eñ,ë µ=ù8`Ì@ÃÿsóÖbÒ;pžˆîûKs­ œÒ)Š?ï-µ"°í Þ\ ~n"2ß§>€Š4ÙÎhKžÞÀnDY|p3í¤5Çó¬zÌ:D,z;ü mËL‘ûH§(fX‡h¥U€XˆŒ†ÿ{:E±p¼u‘>ZøŠu‰Ö6>¸ì†kpÖ"rp¡uˆˆ|XÓ:„HŸ½´S/µ!Qš ì9ˆ7޵h9×9NʳjÄ:D :Eñ<àpë"ò•NQ,mB¢´Û Þ4ºàƒ[ -ÿ;š†ÿNQL¾h5i«À‡­CH”rQ]@Wÿ£]’gÕµÖ!"ñz´à´ßû:E¡ ™×æ>¸éý~Ó €îÿÏ¡« S+ÇYç‚%¯[‡èLfë¨Äë àTë‘ø4õþØ")xA§(°!ÑéûèxT ·þf#¿Î³êëÖ:E±1ðfë"Cv\§(¦Z‡¨ìÐï7ŒªÏ¦Y‡ˆÄiÖ"ñAâûžŠ Ú:ÀÁÖ!$*;øàúºôylVMœã\ëÖ:E±.pu#ìElÇh±³2°Q?ß0¶/—îÿ×þžgÕÖ!"ðôØŸ¤k@sd´¾Þˆ­ôýGCéê¿(ÖÞ`CÄØ‡zk`ˆ@ŸGÉ£)>¸ÕgXçˆDòx/š"ò<@KËl­ØÜ:@$fX‡°Ô)ŠUÑ̑ٴ: Ìö\Ü2ýz3€ø\‘gÕ½Ö!Œ½èÛ—\¤á¶í…¶¿¨ÏÙ›ôóÍb¡PKzø¿S+o·Î!Èl›õëTâ“tÞ ¬`B$2»vŠb{ë…çõë¢(>¸)Às­sDà)àBëÆµ )ýn´­So‚‘ºÿͳê!ëVzW8Xç‰Ô¢XÊ:„˜kÝ- ÿ×RþÏ­ˆDlàeÖ!ÄÜ>¸UúñF*qI¶tŠbIà@ë"‘;Ä:€D¡/£±€¾ÝÓh°Ç‹¬CÚ‡z­kY¸½;E¡Ó¤/çÌX €Fàâ<«³aHÃÿ"‹6x­u1׎ÜtàÙÖ9"òðÿÊÀK¬sˆ4„nHkFfXˆDÊÿ½="²¸²NQôm58i¤¾l CX×:@$®²`HÃÿ"c£ß™´­âƒ[v¢o¢‡ûò¬ºÃ:„…NQ¬ lgC¤a4@fLô b(3¬Dàë†^`@¤Öî…ÍJÛŒ‰¾A @#i€=¬ˆ4”~wÒ6c¢o ‡” ÀîÖDJ m3&ú*qH²tŠbSà™Ö9Dj·NQL²!fÖ™è˜ÜJhëW€«­ÑÕ¿Èø=ØÔ:„˜™1Ñ7°ÐÕ?Ì®³aDC˜"£ß¡t͘è¨Ø»)ϪǭC [§(–v³Î!Òp*éZµ·’î¸Y€ ßÃh$ïÿ[+Y‡i¸]{eZÒ4c"Ùú‹£ `éÝÿ™¸­¬Cˆ™µ&ò—­ À*ÆŸ™ý.¥kÕ‰üeë0¡ð-‘jØÒ:€HKla@ÌLè"Úºh ÁÐ)ŠegYçi‰¾ì 'ÔèúÀƒyVÝj€X"ý£ß§t5º¤>ðOëF6¶ Ò"ËwŠbuëbbå‰üe³àƒ›Ä÷ÀMÖŒèŠE¤¿ô;•¦ÆŽ¬L6üü—ªØYÚ1ùê÷ IDAT—â<ˆR"Ãâï– €F+Åñ €4©4TŠ_^‘ÁPH“n4TŠ_ÞR"ÃâïVŠÇÐyi ¡Rüòj@d0TÒ¤ÐP)~yUDC MºÐP)~ySK½ö¹HŠ®§Þ)3uZþw޾ž#c+•u€HLB_zºeypªu#ÇvËRö´‰GËûù†±€ËЊ€³½Ú:@$>$=*Iº8Á:„5Ü’ÀË­sDâOyVõu^TT ϪÇ`#/õÁ­hÂZ·,ÿ”Ö9D†ìÈnYêböV¶‰¾ß"ªôè6@mp€uˆH ÜmBdHÎï–å­CDâëéû¹Q n¹u€tËònê ÒvOo·ÜÊÔ#RßíûSr1= 0‡óÁ­o"%p‰u‘ûb·,¯²‰×KZ‡ˆÄÕyVÝÓï7®äYupuŽˆh è= ý6ôX ´×ÍÀÑÖ!"¢Ð922]èÑm€9¶‹nY^|Ã:‡È€¼«[–[‡ˆnC`;ëQHÔú>8g""Gÿ±!ÒgguËò§Ö!"¢‘Ϲ%Uα …õtËò~à=Ö9DúèqàÖ!bმ„F>G»9ϪkñÆQ€<«nþi#"øà¦Y‡ˆEï©ó­sˆôÉ1ݲ¼Þ:DDvfX‡ˆÈÀ¶‚޲ô¤¾ÿõh+/µ™×}Ÿ+2d—P¯v)shøn*¢Û£uËòÿ€7X癀{»e©m¯{|pK£eÐG{’Þ¹\@½ùÔ^¬çÖ-Ë_Ç[ç§7ôЬÌñr`yë©ò¬zpPomȳê1tŸw´)Àk­CDèHàRë"ct|·,a"BéœÛ@G£-=º 07Ý›Goøô@êáT‘&¸-m=Ü3Y爌 €ü×ó}p[Z‡ˆM·,ÿ¼Ñ:‡ÈbÐ}ÿ…{#0Ù:DDþgÕ_ùQ€<«®CËÏëCÖbÔ-ËŸ_²Î!²oìV¥7ùï]Ö9"3ð ਠ@Fæ¶¿ncë‘z?ð'ë" ñ¥^Q•ùÀ3­CDF8Ë:@d–>h"F½aÕW·Xg™Çï© ªÌÃ7ý»™×SÀÙƒþ&€s=ÑPùàÖµ£nYÞ ì… ’x\¼R÷ýê`-ë‘9/Ϫý!Ñ€Þã€6›ÛàÖ!bÕÛO}_àë,’¼/é–åCÖAbäƒ[=± §ãC¢/=§YˆÐ|pkZ‡ˆU·,/¦^Qì)ë,’¬[uËòNë ;ØÀ:DdžÎÆ5¥ü¸ß:Dd¦ïµ³nYþ8±Î"ɹØ[3þ®·ëŸæ3Íïœ<«†r ³ Ϫ'€ŸYçˆÐ›µ<ðÓë–å‰Àû¬sHR^Ú-Ë>ÃÝû›[‡ˆÐP†ÿ¡! G·æ· zvv‘ºeùàsÖ9$ 3×tËòÖAàÃÖ"4Ô‹Ý&€ß£å^ä>¸¬C4À€X‡V:ZãÑ|p{ÛYçˆÐïó¬ºoXÖ˜gÕÐ&F4ÌòÀÿX‡ˆ]·,G¨ùšui¥'Cºeù}ë ¡«ÿÚð?4¨ôè6À‚½Ë7Ý:Dìºe9«[–ÿeEZåaê{þ?´Ò>¸€Ý­sDèq†üÈ{Ó À9ÀÝÖ!"´ ðëMÑ-ËOo¦¾_+2w{vËò·ÖADWÿ öÛa,þ3Z£ @žUO?µÎ©÷øà¦Y‡hŠnY~‡z€Ç­³Hcý°S·,/µÒ>¸-€}¬sDj¨ÃÿаÐóë‘Z=0&ݲ<ƒzÙà¡¶ni…¿;vËòjë óY둺ƒGÝWò¬ºˆú—Oæw”NkjA·,/vn·Î"q°s·,ÿm¤I|p¯ö¶Î©æY5ô¥ËWz¾k RÓ/[‡hšnY^ 8àZë,½_/è–¥IƒÞ$å/YçˆX×âC›Z<ºw»0ûùà^l¢iºeyð| îÃI#Ì>¼¼[–Z‡i ¢ÿæó¬ºÂâƒ'Œ4s™t܃¬sDêz`³ÞNŠ2F¢x ðE`)ë,…[€×ju¿ññÁm\LµÎ©7åY¥€12ùÖë£-6Ç­[–ß¶§ÞÊUÒö`+ü'äèä¿0§X}xc @žUç£{¶OçHÜs¬C4Uo^Àó1üåSOQ/½o·,ï²ÓT>¸ƒ]­sDìGyV=dõáS¬>¸O¾ k"RÓ€¯š0Nݲ|8¨SçQO®\Ú8’ ÇÍÔú\d¤Éz{”|Þ:GäLG²;Ðóê5¸eÁööÁío¢éºeÙ¥Þ¸DÏ|·ß¯€-uòï‹OÏ´±+ó¬ú“e€F€<«î`Èk'7З´OÀÄõövß 8=ÒF·¯ë–åK»eyu˜¦óÁm ¼Õ:GäÌç±5ºô|Ë:@äž |Ì:DtËò±nY~ Ø ÐÚïí0ø °Q·,O¶Ó>¸IÔÿ&[g‰ØCÀIÖ!ûàh>¸+€-¬sDìI`«<«´‚buŠbêÅMžmEÆåbàmݲ4y»­|po¾m#r_ɳêÖ!Ú0ðë‘›JÝÈ¥ºey:°1ð94¥IîœNþýåƒ[8Æ:GäfR¯3b®-#SЕآäyVh¢:E±)ðuôÈSÌF¨Ÿú`·,µ­øøàJàPë‘;-Ϫ­C@K €î}ÀqÖ9"w7õ­€›­ƒ´U§(^lbEæò[à£Ý²4uÝf>¸}¨÷J˜d%rÛæYõ¿Ö! ]`êçw—³Î¹ Ø-Ϫ§¬ƒ´U§(&¯> dÆqR6œ|¦[–Á:L›õv!½XÅ:KäþgU4£„­)>¸/GXçh€có¬ÒRÁCÐ)н¨‹ÀÎÖY2“zÇcºey•u˜¶óÁM.v´ÎÒ/˳ê—Ö!fk[X‹z.@ÓW8´`Ÿ<«Î´’ŠNQìL]ö²ÎÒbOP/vlowGÜqÀû¬s4ÀÕÀ&yVEsÒmUí8w[æYõoë )éEF½­ì+hÏS8Ö¦^TåóݲÔ÷yˆtßLÌvý[˜6€­€?[çhˆ Ýó¬ši$5¢X8ÈMã4ÑppðÓnYšm¨’*Ý÷“;€µó¬ŠjÑÖÜÙÀžÖ9â˜<«>d"e½QׯV5Ž»kœØ-K=ÍbD÷ýÇì¨<«>eb^m-;°ÎÑ#À‹ó¬ÒÒ¶Æ:E1x õ¨À¾À’¶‰¢qð#ÀwËòRë0¢ûþct/°nžU÷[™W+ €îwÀ ­s4ÄÔónµ"µNQ¬ H]v&½Ç[oÎ~ üª[–Oç‘Ý÷³çYõë Òæ°p‰u޹ØSóâÓ)Š)À6À½×ŽÀR¦¡úï.à|ê“þyݲÔÖËÒ}ÿ1»X/Ϫ(稴¶øà~ìc£A>•gÕQÖ!äéuŠb°s Á¶Ôû=4ÉýÔ·éÎ¥žÌ÷—nY¶÷`Ôºï?.ï˳êóÖ!¦í`+  ¡ªÅ5 Ø;Ϫß[‘Å×)ŠéÔ+nÔ{mØû¹ökb<ü“zòÞì×?¨OømjÝ÷³Û©¯þµ²0­.>¸ÓWZçh;¨çÜfD&¦7©p=æ/Ï žS°°,ã/È3G½n¦>Á>áߢ+ûæÓ}ÿq9<Ϫ¯Z‡x:)€Í€+Ñ¢+cñ'`<«¶"ƒÕÛ·`:s Áì×òÔå`Þ“ü_ݲŒöÊFúÇ÷<êÛ5+Zgi[€çÄöÜÿ¼Z_|p§¯±ÎÑ0¿öͳJûÜ‹$Ê7ƒz±5£4Í[ò¬ú¶uˆEIåªøãÔW2²ø^œàƒÓŸH‚|p«Ro£¬“ÿØÜ|Ï:ÄâH¢äYu p’uŽz-ð%ë"2\>¸eßPÏ‘±9º)#§I€žPÏH–±9ܧ¥‚Eმ œN½ö„ŒÍ•ÔKU7B2 Ϫ[€ã¬s4Ô§}p‡Y‡‘ÁêÝò;ú ŒÝ;ó¬šebq%SzŽ£~TIÆî[>¸WX‡‘úõ­?»Óó¬ºÀ:ÄX$Uz 2|À:GCMNñÁíbDDúÏ÷Aàpë õ8 \$)©gÕ)ÀEÖ9j)à>¸-¬ƒˆHÿøà Ê kâ yVÝhb¬’+=ï¤ÞWÆnà,ÜzÖADdâ|p/¢f=b·ÇX‡$ @žU—QOt‘ñYø­îÖADdü|p;§Rßâ“ñù`¬»ý-J’ çC@#ÿG‹Äs¨GRÛ§^¤zKüþ’öm-=LÿKƒû›W² ·ÙîyMÌVÀï}pÚ\¤A|p[g£õý'êyV5övr² çxàzë ·ðGÜÚÖADdÑ|p{çSï )ã÷Ã<«.¶1I€ÞNMo±ÎÑùà6µ"" çƒ;€z‰_ݺ›˜{€#¬CLTÒ Ϫ³Xçhgúàv´""óóÁ½8XÒ:K ‘gÕÖ!&*ùÐó ñÿcF`%àlܾÖADdÜÑÀ×Ð1¿ÎγªO‘éËäYuZ«_–ÎðÁ½Á:ˆHê|p“}pß޲ÎÒo¶Ñ/*=yV üÊ:GKL¾ïƒ{¿u‘Tùà¦?Þd¥E>šgÕ Ö!úE`no´Ñ"ÇúàŽïí0&"Câƒ[ø-°Ÿu– Ô›%µ† À(yVÝL½@ôÏ»{{Œ‹È€ùàV.vµÎÒ"O‡åY5Ó:H?©Ìï@£ŸíŒÐë¨7šnD¤Í|pÏ¡ÞìLvõ×ò¬ºÂ:D¿©Ì#ϪYÀaÀÖYZfoà­(2>¸ ¨€u­³´ÌuÀÇ­C ‚ ÀäYuð1ë-´|pÛYiÜ¡À…hu¿~› ¼!ϪǬƒ ‚ ÀÂG}Múkêƒ¿Š–ˆ5ÜtœJêGp¥¿>gUebP&Œ4vƒóÁ­üm˜1(¿ n×÷ZišÞn~§Q/Å-ýw1°sÛ&þ¦€§Ñ{*@{ ÎË€ËuK@dl|p‡—¢“ÿ <Üæ“?h`±øàNrë-ö$pdžUÇ[‰™nYà[ÔOÖÈàäyVhbÐTƒn9àJ4»vÐtK@d!|p›Sùod¥å~”gÕk­C ƒn,†<«¤nÜ­Š€n ˆ,€îMÔCþ:ùÖ¿H趯FÆÀ÷qôxà0è–€ÿ}ü6Ä©±™ÀnyVýÑ:Ȱ¨Œn2õ³¶;XgI„n H²|p[Pùoh%ŸÊ³*©]UÆÈ·.õ¦+YgIÄ¿€×µùY\‘Ñz›g½ø°”qœT\ì‘gÕSÖA†I`|p{¿Fs(†eøð<«î¶#2(½«þo¢QÆaº Ø:Ϫۭƒ › À8ùàŽŽ¶Î‘˜»ßͳJ_\i ÜòÔÇ“w“ã¤äI`÷TGu;~Ÿ~e"1«ß.òÁmeF¤|p¯®Þ‰NþÃöžTOþ € ñÁ­\¬o%A3©·n>*Ϫû­ÃˆŒ•ncàëÀÖYõÃ<«¶aI`‚zëq_,c%Q·ïͳê‡ÖAD‡nà(à=ÀTã8©ú °CžUX±¤Ð>¸ƒ€l¼-ϪXYÜË/SïŠ)6gÕõÖA¬©ô‰îËÀáÖ9÷$p<ðÉ<«¶#2[ïñá¯ûXgIÜðÒ<«~m$*}⃛ œ ìdEø?à]yVaDÒæƒ›¼Ÿúé•¥ã|"Ϫ[‡ˆ… @ùàžI=`†q©G=pžuIKï‚àõÔ'þõŒãHí§À«ôñ*}æƒ{.p°¢uù¯‹©—ùüui7ÜRÀaÔWýkÇ‘9.¥~ÞÿQë 1QÜîÀYÀ’ÖYd.—Ÿ~šgÕ,ë0Ò>¸e©—ï}ðLã82·íó¬ºÃ:HlTÄwà­sÈý88%µµ¿¥¿zkN½ˆÏÊÆqd~÷;êé S ÜGOXç…º8øAžUOX‡‘æðÁ­¼x;°¼qY°'½4háTÌ÷êÉ@¯Ÿº©/ "OÏ·&ð>àMhñ¯Ø½>Ï*Â> €ëÍ> -÷ÙwR¯#ð<«°#ñðÁÍŽÞL3 #‹ãè<«>f"v*Càƒ[úÉ€M¬³Èb¹øàó¬ºÜ8‹ñÁM^D=‚·?0Å6‘,¦“ò¬:Ä:D¨ ‰nê°¦u“¿'Ror‹u¼ÞN“‡¡ýMs.ðbÍéY<*CÔÛýëàÖYdÌfQï7àÓó¬zÈ6Žô“îÙÀë¨Oü›Ç‘ñ¹x‘~7Ÿ Àùà¶ ^¡n%ë,2n?£ø}žU3óÈ8ôžÝߟú¤¿;°„m"™€?{hkð±Q0àƒÛ8XÎ:‹LØíÀÉÀ‰yV]aFž^ï¾þ ¨Oúû¡™ümðw`×<«î¶Ò4*F|p;S? P{üúÁÉyVýÛ:ŒÌáƒÛ’9÷õW7Ž#ýs-°KžU·[i"C>¸¿DµÑß©'$\gÕ}Æy’âƒ[›úÑÛÙ¯gÙ&’ø°sžU7[i*c>¸—§S­³ÈÀÌ¢¾GynïõÇ<«¶Ô.>¸g0÷ }ÛD2`·R_ù_o¤ÉT"àƒ;€ú>òdë,2ORïN6»\¬Ç–Ʀ·ÿ®Ì9áof›H†èNê{þZß‚T"áƒ{=ð=49EdN!z²`n>¸éÀNÌ9áo~WRtõlÿ+­ƒ´ @D|p' ÇR÷õ„Âk€«{?¯®Ï³êIË`ƒÖ{4oC`£y^›¡Ûd©ûðÂ<«þj¤-T"ãƒÛø°¤u‰ÎSÔ{›_3ï+ϪÿX ÜÀÚÔ'ö™ûD¯Éz² ·{æYõOë m¢!ÜÞÀO¥­³HcÜÇÜ¥àZà^àÁy_ƒº½àƒ[’zm‹y_Ï`î“üÀRƒÈ ­t#õÉÿFë m£)ÜnÔ.kEÚçQP ðzˆzbêìù²,ø?û¥Q+é·k¨OþZWcT"æƒÛ8XÑ:‹ˆÈý…úžÿÖAÚJ³h#–gÕ%Ô3žï²Î""2Dÿ 쮓ÿ`©D®·ý®ÀmÖYDD†àÀ ò¬ºÇ:HÛ©4@žUW»ZõJDÚìL`¯<«°’€†È³ê:`ê=¯EDÚæ›ÀKó¬zÄ:H*4 °a|pKQïCÿ*ë,""}0¼?ϪÏ[IF&Ϫǀý²ˆHÓ= ¼Z'h0Ü[¯¢M„D¤yî^–gÕ¥ÖAR¥Ðp>¸}¨—Ö‚A"ÒW/Ñê~¶TZÀ·ðk` ë,""‹p>ðÊ<«îµ’:ÍhÞZÛQ¯œ%"+Oý˜ŸNþÐ@‹øà–ºÀAÖYDDFyxOžU_µ"s¨´î€/ ýÓEÄÞmÔ3ý+ë 27€–òÁíüXÓ:‹ˆ$ëBà€<«n·"óÓ€–ʳê"`kàë,"’¤/{èä/´œn ðYà=ÖYD$ <«N±"OO >¸WßCëˆÈà\Kýˆß߬ƒÈ¢é@"ò¬ú1°-p•ui¥ŸÛèäßHŒniê}ÞfEDZáàˆ<«¾mDÆF Q>¸}©o ¬fEDërà <«®¶"c§[‰Ê³êWÀæÀo­³ˆHãŒP$n¯“si q>¸IÀáÀ±À4ã8"¿[<Ϫs¬ƒÈĨ>¸Í“M­³ˆH´~–gÕÝÖAdâTä¿|pKŸÞaED¢òð®<«ºÖA¤Td>>¸ßfG{P/ìs­ué/M”ùäYõ;`3à‹ÀLã8"bã>àMÀî:ù·“Fäiùà¶¾KýÄ€ˆ¤á§À;ò¬ºÍ:ˆ Ž €,Ro?÷GKÇ‘Á¹•úĆu<Yl>¸ ï»Zg‘¾ºÀûó¬ºß:Œ ‡ €ŒIo݀èŸXÁ8ŽˆLÜ?©'ùýÁ:ˆ — €Œ‹n êm†&Ç‘±{˜úwøsyV=nF†O@&Ä·-ðe`{ë,"²XF€GæYõoë0bG@&¬w[à ꫉gÇ‘…»xgžU—Z{*Ò7>¸e€ï–6Ž#"süø pRžU:è   àƒ[88Ð:‹Hâ£Þµï³yV=lF⢠ãƒÛ øYgIÐiÔõýË:ˆÄI@ª7?`?àh´Ó È0üøhžUÁ:ˆÄM@†Â·õ-Ú¦i¥³£ò¬ºÄ:ˆ4ƒ € •n2p0ðQ`=ã8"mp!ð-ä#c¥ &|pS7Ö2Ž#ÒD—R_ñÿÞ:ˆ4“ €˜òÁ-I½å臀5Œãˆ4ÁŸ©ïñÿÚ:ˆ4› €DÁ·õ²ÂGljÑ9Àçó¬:Ë:ˆ´ƒ €D¥÷ÔÀ¾À{]ŒãˆX{ 8•úÄ…ui‰–nê"°?0Ù8ŽÈ0=@½=ï—ó¬ºÙ:Œ´“ €DÏ·.ð. ¦Ç¤[¨7×úNžUX‡‘vSÆðÁ­¼x+zr@„9ö IDATÚ%P¯šyjžUOZ‡‘4¨HãôÚ›úé}€)¶‰DÆå~àd ›gÕåÖa$=*Òh>¸5¨×8 X×8ŽÈ⨨ïïÿ8ϪG¬ÃHºT¤zOìI=*ðr`IÛD"s¹ðÀwó¬ºÊ:Œ¨H ùàV^O=*°‘qI×põÕþyV=nœGd.*Òj>¸-z¯õãHûS?»ÿ“<«n5Î#²P*’ ÜÖÌ)š/ ýt)sNúzn_A@’Ô[dèàÕÀ:Æq¤™.£>éÿ8ϪY‡+Ižn;àUÀK€MŒãH¼ž.~E}Ò¿Á8È„¨ˆŒâƒ[xqïµ'°¬m"1v+pp&pvžU÷çé‘…èmU¼s Á¦¶‰dž.¢>៙gÕ•ÆyDF@d1õFöî½vV³M$}r-ps®òµ¿$A@dœ|pر÷ó¹À$ÓP²(S¯»_Q_éWyVÝiIĆ €HŸô6+Úº 8``ÓPr½}ïu™ä©©ˆ ˆn*°%°5°yïõ<`Ë\-v+ð௽Ÿʳꟶ‘D⥠2d>¸u˜»llL¶ÌÕ §>Éÿ÷•gÕݦ©DF@$>¸¥¨× ØX˜A½ZáºÀ³%ÌÂÙxøpã¨×õÀ߀kó¬še˜M¤TD"×»•°6s ÁŒQ^X˜n•oF€û©wÈ»™¹Oò77·æY¥ƒ“È©ˆ´€nu˜ýZyžÿ<û5˜F½]òèŸ úóì'fQ_‘?<±ˆ??@}bŸ÷uÏè?çY5sÿDdñ©ˆÈõFféd-ÒN*""" Jmb‘ˆˆˆ  ""’$‘©ˆˆˆ$H@DD$A*""" RI €ˆˆH‚TDDD¤ ""’ ‘©ˆˆˆ$H@DD$A*""" RI €ˆˆH‚TDDD¤ ""’ ‘©ˆˆˆ$H@DD$A*""" RI €ˆˆH‚TDDD¤ ""’ ‘©ˆˆˆ$H@DD$A*""" RI €ˆˆH‚TDDD¤ ""’ )³ÿÐ)Š¥€Í¥úðÞ#ÀcÀC£^÷7vËòÖ>¼¿ˆˆÈÐtŠb`}``ÙQ¯iÀ#Ì}¾»¸¾[–Û¤]´I###tŠbGÀSÿƒ Ã#ÀõÀu@þü©[–éóEDD¨SK[;Ûô^+Žãín£>×]TÀ…ݲ¼¾OQ'dÒa‡úà `ºq–Ç?g'wËò&Û8""’ŠNQ¬ ì 8`ù~Ü­À…ÀéÀ/»eùØ?k¡&vè¡g¯°øð§1BÝ”NNí–å}ÆyDD¤ez·¾_¼Ø‹Q·Å‡èà'Ôç»ó»e92¬žtØ¡‡ÞgŸç|߯×ózqŸµ¿{=ß³ÏÞk¿k}0W‡ÝŒ€£€sª º)èãMà0à„¨ú^§Éd2™Lý "ÛÇï´/¸øfT½£ŠÁ»1èã~lbÆwÚ‘L&“ÉÔ“ ²$p"°V‡]i–I@Šª¯”9p7}œìßéÕ€ 2°°4ð8VÖ˜·*2™L¦C‘½c€é:íK <lU¯.k@op ¶ô^”XyáÌXIÅ(L4¡ln¶ŒªOV0ö ‘aÀÀÑÀLSüj2p<µ½Ûn¿2™L¦W "sgPM…Ûà1LØîÍô3˜‘žwó Ó–|îIÀ€#ËÈ ð —U—D>† -‡-ÉŒæ/aèW€í£êe%Œå&ˆœÈ &ãÏEÕ‰mr)“Édz– ²VV·p ýÜ\Ü ú<íyø‘é’‹a*»k+Ó—àוØjÀK­ Òö ?‚ÈRÀVX-f+ÚD`רª¥8Ö€ ²p©ÃôQõ°ªýÉd2™^&ˆ¬ü‘Ö„í^~ü¸µÌ—·¤;°°°1­Éî?|1ª>Õ쵦$ˆ¬•ilFóÍŠ¾U.Ï«þ "×bQ]#ÞfÉ«™L&S AdK`Í¿aŽ.‹ªï—æØ‘Ùm€ï‹49ÌSÀ:QõÁf®]ÐGY8ØæöQ޾S•ªRÚû ˜ÕyÈÒQõþ*|Éd2™^&ˆ|ø%ͽ4^Uo,×+AdZlü»ÀRM ñ"°~T½³èµmUŒª;+771Ä>ÀOÊõêCô%|x™»*G2™L¦W "8‰âϳ‡õ¢ê†zøDÕ‰Qõ,/n/,ï óW‘eŠž»¶@Qõ¬1}ƒÈå{Qõ-ࡇÜ[…™L&Ó«‘Í_<ì=,“~é¨zEéN5I ~,œWðð9+‚H¡­„ÚQurT=«³¿§àáG‘*p ¬s¡‡Û£ê*ò!“ÉdzŽ ò9àŠ=ÇžÖŠª‡Õµý|T}.ªn 솕zù8¶àV:슠¨úVNqzÁCO "ëVàÒ!XÆ`¼å1d2™L¦’ºß…˜ÖŒ—+€OGÕ›ªñª\¢ê)Àg€G ¶pyª6hHWQõí¨*ÀÁ›8;ˆ,X²/¯cBe`¾lU(ó¼™L&Ó«‘™±%ro6ÀiÀ†­ÖÍ·›¨z°pWÖäÒu@Qõ(,/À«†4ð» Rj¿çô-ü K,¹K@\&ª^^æù2™L¦Ç9X²€ý‘Q5tkvT}Í»¦Àa_"_kdTÛ2@/A䫘`ƒ7˜96ªîW¡K™L&“©€ ²3ÖÇË~Qõتüi'Ad&r´¾ó·€U£ê}tí @QõwØJ€—}ƒÈêUù“Éd2™òI[¸?-pÈQCåá’7Ǥ‰=ÌœD|Îw}UOöwšNNâ ™L&“éŽÇßLîÔ¨Z$O¬+ˆªow;YøÆ@¿@Tý pªÓ|9àÛº“Éd2™’Hÿ[8ͯf‡^·U_6À’Ì=™šð}„!$öþî´=¬H½d&“ÉdÚOêª÷K§ùóÀ¶e´Ê­3Qõ9¬¡çïœèw+dHQõ,Jü¯Ã|VüÛ™L&“é Ûb-u1 {øÿ»bjAT½8Êi¾MYbêR@TýÖTÁÃ.Adž*ýÉd2™Ls¤¶æ'GÕ«ªô§††Of~¬¹Þ‡(µ&¾Fœ ì|ºÝLضÁ÷Ë:q™9ª¾YÖxí •—Ì„ &½¼]UŲ "3Q¡¿IQk&ìíâͨúnçé6RíLX?ó À[íh¡ÚM$Í‘ÉsÔ ›‹;ìž§˜8Ü ª¾Ÿ:!^%¸ƶAäШúdß?t½À@‘U±.‚&åU`dTõl t®áÀAÀ×QX{Æ‹€}“Z`ÇI>®¬ ,| $õ·ô&Aù0¦txpCT}£-7 ˆìŠu|\óõj`¨úLc DzeÇbAã"égn>:7ïÏ`óò0p p]T}¬¹¿¤Þ‘‘˜É*Øõ2Iÿ¬ïaZë}sspmT-"eÚu‘…èŽúëKÿ&þ6G·cs4$¯ŸV "w`ßÍFlUϮڟºDξæ0ýyTݳï†lD~lé0Ý!ªŽkòÓ>×ϯV‰ª¯43v«‘°’‘m€/PL:³?ÞÇnX¿~U½Y¨¥2ÈÅþ2°ZT}Ø1ÆtÀºÀÖÀ&øË‹â1à\`\·K?‘å±}×/cb«<…é¶ŸUo+a¼ŽDVÀ¾W› —0䓘ÈË9QõöÆëz‚Ȳøš¿ý=ª.Wµ?u&ˆ,€½°õtNÉ+ÀÇûV2‡ê@GbI —F€¦ì-´¿‡?ØÍó$`«&ÇnŠôF²Ö„h¶‡Ž5cZ8.ˆ\ Uo.ñƒ’Ú~m€_Ï©B®2Èñ³c]¶öĺg•ÅÂØ*ÐAAd<ð£¨êíÙqR@´=v=/Uòð#oß "ÿNÎHI»]C™ØØøTÉÃ/„]“{‘1Á›3ëÚ±®Mlë´ûQ¥^tQõ™ òk 40 X¸†ø @¹{ÃŒ‰ÀQõù&Æ¿ëØ4€Y£ê{EÇn—ñòéª>ß\|¯]¶‚È8ìïŒQQõ‰©ŽŽ=„ÅÊbÚÁÀžQõÆ6¯0ik,qvdOýo¬_Æ/ÚñÝh…tíì†%£-ÐÆS? ü8±×r‚È0à _“Kt«Î™‘ÑÀX.×`ü>ª~†`@?œà°™øj“ã7JPA9˨D†‘ý€byí|ø¬ ÜDÎ "óU|.OBЇÞ`“ôóݘ’X»þ`{—בӂȜm<¯‹ ²¶Oí}øÌü=ˆ|¾ÍçvDÖÀ¹_ÐÞ‡?Àÿa÷¯{‚ÈÚm>w§ƒïš<1?ü´õy©Ãt“ 2+ôFp–´Õˆu›ßó°m´/Ó4Ad1ì&þcZßÇn…aØòèƒAdÓ Ïãžï 2m9Ë-{YÛË0@€»ëÒƒ"ˆLDŽnÂ:Yv’%€¿¦ ÉÕü‘éƒÈ ص³l‡ÝY¸:ˆœ’òzzÏýx"–”ùÏVö XÂóÐ’"”ç"ùl·õ"[aÿ:%ÀÌü1ˆ[vëå"‘9€+ÐxI¬,Œ"{wÒ‰”2ؗƹ1íD€[‚È¢v$ˆŒÂª^ö¤^s´ pSY¤ÓŽ´±›kzEô§^sØ¿wØÌ†•ÉuAäH,ë¼ÕÌþªØ¸<ˆtbUb$v¯Û²épàø rL'NDVÂÆÕ:q~Ë·ÏÍ¿¦ØY¹S>4àÓÀAd°¼£®&­rxæßs_ï)RÒè…ÓÞXHÜ xêñ׬ڑVIËÚË8¯;_® "ó¶ù¼?¥sKþöO˹m{»LÍT®ÚýYevàŠŠ·‘ú%ˆ¬\…U“Ô™9±m“:íHE¬Bÿ:SsuÕŽt)žyY)ˆÌØ@Jñdb¯Tµ/­d1Ïvna˜‰Ø¾æÁX6ý:Ø›×ǰËâXt¸Ö1ñLh§YúáÚùàivÉ&õ},)tMlzN,im9lor¬9Éã-ø¸ Åz›7MÙKje5æ àD¬Ìh`ULôj6l{ceLsB°¿ë¡Î5p~i61·0AäKXiÔL- óv]ì l̇çè؃­oŽNÀ2Ø›eFl«móƨ+ž•Øg¢ê#•{Ò\ç°™Xf¨ëLÉuÀú lF·Ã‘øÍU+LÄ䎪ÿÄöUà_Sž3Õ?¯‰ÝÔv x&ýâÀeAdíV+äFààò¨úÒ vÏóA·ÉqX]ûÒÀ¦X°T4ÈÙ3ˆ¼U(ê°—”xø{š« ¹ 8/‰ª÷ b÷&ö3%û¤Õ1Áœ¢ÛkÓg¥ùùkÁc DÆ`yBÍÜïÎÆæèƒØ½‰ýLÉÞ©AËFX0^4—g8pNš£k [gVþD6¨QMó?ïFÕ‹š =ï "?ÃÄ—öf.0ÄáA䞨zq³> Dz¸\Bñ·Ú§€C€³Zi«šsDŽÇV”ޤØwlzì-wlTý[³~ FY {ó/š]ÿ$ð=L¹¯•9zx ˆ‡ †ý“¡ö2¸(ˆŒ‰ªÞVèuÇs •¿µ*îÁôÄ@³Ü6{»¦½Éà v°VTݨ•‡ÿÔDÕ—£ê¾Ø[ý9_ûÊ*yZ¦•‡ÿ”DÕ7¢ê!ØÍ«è˜g¦ìüÒ"3c«>s8쿘ØÍbQõ̲zªGÕÉQõ÷X9Û˜©—Y°À±t…T ý¬rÅËX ·XTWò‹) î ¶J75³$•Ë¡€'heû¤ðÌOOcKá(C×»4R3–q+G:X=ªzö‚š"ª>U·Ãö;‹tÈûNi¤ÌX%/_ˆª¿¬B@$•%m†é2x™8«dWNÁ¸^>U©J¢7ª¾UOÄòŠ¥£€_W4y¾>ó}<‚õš8¶*‰Þ¨únTý9–/P¤§Ähàô*|j')ÏéÓ Žg~î™ ÉzêVV÷küYÉ}¢êNíj[UËölï|J†gt 2lO{•¨z}•'‰ª“¢êXKjïç°fÙ¡Œó'}¯Ž:X~Ì*QÕÓW¼eRwÀÕñ©–õ±1°kY>¤¹ö4 ëãjlŽÛç/¤ê¶pEÃ6 "R‘Kíbf|I¼WìG·óDcfï™ áÉfo% ¸T‚ÈÖøkÙß6ŒªmÉ,Ÿ’ô@]kìa.н!—ÁCÀØv¶]ªg` pž~ǶºŒ›–µ+pÈéÀ: ’K'µ•ÞøYÃ~T†Ôtšã"×ß©ÀºíîêU_6Ī/¼Dê^Æ8ÞJ•Z´%¯1ž²÷Yz-xÓaS$«2’€Î±NóÉXKã"o ¥’šE­%`Ç òÙê<ú¯›4¨~¨„¨z–,æa^¬š Å4ä=\ „N5ãI+%{á—sk Ô*‡ce¯.vëTâjÚ¦úp¾ó¹ŽM•„'˜õÿò–Ã&ýP—€oâ¿‘UÿP¥3ÒÛõæ€ç2 Ë ¯šIÀÖ)Ûº#DÕ£ð·›Þ«YõÄ 2?Váá~l^JIbk‘¯·;m·"M·âM3wsšÿØ.ªzWp*!G,±×Ã×ë ©Ü$žkßsïuÝ^¡;Uá «Å6mÍñ¬d¿•€R‡ˆÿkN»ïGÕ·«t¤·°~…GEÕW+»ÎÃÍ4bõ R´õ+ø–OoŠª,8v[ˆªWv˜¶nâ[â»1^U/ibüÊIy>W9L§Ç„…º O0c;ûht)9è‡Ú¯¤½»U¦÷âßWn;©ÔëWÓáØÃ«lžÅtÙkCÚËý®Ó|½‚Ãoç´Û¿à¸íæ,o£ÍÞ9ªûòùø*Kš™£Nã †QŸ\­ºâ©&ê EŒž¤ºN¯xk“¿[“®Á8_¹ÎœûüªmZä*|û¸ky "Ã×Éòâ¨êiŠÕ1’œ­Garù"‰nAdÀ“orAT½Õ;n'ˆªwâÛb[9ˆŒªØ²ñö Y R/ºŸ6¯öL€=ügtØ=]µ# XËaóHT-"¢Ò¢ê‹À¹ÓϤÄÇ2©ëîd|8c ;_kï"5÷Äëçç Œ¹&>5Í^ž£Ž“Ê-=rmû¶ÔOŽÌ“½x.˜ t0"Ã1…´FÔòá6_Gàû»½¼¯%f§ø“ÃæãDÆ:l^ÇÚ@wwÏ9ìÖ*0¦gŽ^n*0f'¹ xÑa·VÅ~TKǾr/ºOC©ž –pØ<Úáeõeñå)tSpàYŠ/³ðºvI!7‰·½­÷&ç ž®è”àOQ ¬’¹fG‘†É`)ÿÇ“/0çhTñèÔ Ï}¸ÈYO‘:zî§öRàI’º¯r/ÇóÆwKÍßnû𔹤çÙCì4ž%îÙ$m|O«® ^?é°ñæÿ Å9šßrpðtŠ\ªË{Tɪør‚në‰ ˆ,‚/+²ÓûÆž/ªçÁQ7<>—Ù†ùùǪŠg6ží ïͽ«®›Ô·ÁÓr×sÝxæh2ÝqÝLÉ‹€§GA­Zœ;¸Áa3 _^G/²¡ÃæÑ¨úâðÊ]©›:l&.‘šÃaÓm7)ðùÜðm·žä¨Nó‚ÃÆóÖê¹f^«ª}Å<,ÔÀÆsÝxæèåN5üi–¨:9ˆ¼4Rü+ó»U9QõÅ òO QχMZŠZy "ó`ù)#±è[Kø®nä°¹|ËC Æ5ÐF÷(¹ Õ`†Õ½º!‘Ëó°ñ|?‡ê5>¿=‚0yŽºÏöÆ—+(nAdG,ßáb¬åóuÀÝAÄ#7ИËâË ú+ô@ÄBVr˜zÕªÆs£ò¼9Ö ÏÃð½ñf>ÌP½fÀçwYÀPž£nü^]ã°™ßÛní"gòÑÕ™%€kƒÈºM½³Ãf)tÈX6Þæ5Uây+ìÆˆ×ësÇ;1v!CõšŸßžkÆ3G#6uÄ3Gݰ"65—à“e÷<ðêÈÏùÝ À…Eƒ€´â‘»¾5ª¾C<"sáëvT½»jx¶ æ«Ü‹òñt6Ì4ÇP½f ¼ëÆ3GÝzzü®C‡ÓB¤RÙ ¦ë‘ªö§L‚Èÿ£˜5ì Ìé°ûß¼éØ ßòŸG{¼xt°»ñFÕ­ n`¨^3PÞuÓësÔu@Â{_ö6ت Þœ w´w âk ÛmŸÁB”wò*|vÛrÚy¤ukG*Ëô4=š8¹Ä*¢JIR×G8dÐ u=Ü9Ö‡Z´É ˆŒvtšÿ¨J_ âù¢®˜V7º‰¢½í3N’Ô²Gä§Û>ƒÒüª¯ã{ î¶9Zßaã½>êʉX#«F¬ìT±/eòSàŠöƒÇãÓº¸›©ªÝ†\Dfdª(g.«Iò_)âið}ñkAYX¾Ó~ qîuØt[¹TÙþz¾[Ý6GÅ·ûÒgWU_ÂǤ»Ú“šNmJ‹A@ÙØÆyüÁS_ C.~ ,é´ýa•Ž%mE<å0í¦•ç&•i têjÝ¢žöâËîcïi…üÙnÉ•"³âëoÒiyó28_"çÜÀ¹)¤öDÕwh!" §9»1ª~¤{ä ‚Èöø—ÆEÕ›«ô§I< XëvQÂÒ—;í@à¹f¦6©Ú‘’Xòµ ¿XFe‘­€ƒ:íG¯’¥öwšÏü±ÓÂ)I›àb¬·{夷bOÓ€±¶ù+t©!Ad>à"Š%9{ß»’¨z6þ—$°ÕÒDÆÕ5¿£¤¹~ÓàÜïš ˆŒ®Á0EޮƖþë¾ïß»Þe¼DNK BÚNŠ®Ïjh˜©”¨ú{àJ§ùÿ×OFyé‘E°2µ¶jðGÕsð×Ç/Œ"KTçÑÀ‘E±9ú„ó›XGõ!ª hÁöî¨ËÊÎ@$M›»€›8ÜÝE°ö@™.ˆˆ%~Œ)xø]À¦ÝºU¤X¯Áö»ÚÖ~7­Êü»éÔe¢×Ùÿé"ÀÍA¤­8©Dë6üªeóM|å¶‹·‘¶Jp‘Ïc‹;yØ¥›¥›`Wlu¤K·‘Ÿ×Mù1ˆ,D®À^¦ZYsµ ‚Ȱ”t7ö,ª|w°~*«ëfŽ ˜œçgÛÛQþDæÀ2÷ªú\?Qõ!à™»YØŽŽjAdWŠ•î–NÚGÞ£À!³—‘ï´iŽvþŒ¯Ýo{EUOσ!CJìÜ ÿªWÓß"¡S+§}‘y‚È1X_/–4là  v@z£Üø;Ù5ó†p0¦Æb?nÒ¾5¾¾Ø},„'§V‘¥D¦"{Ñ}Ôz‚TþSdyt,о#½y–NY=ˆ\•¹v|µ(ªž Z&5Ó`âV·U%2D>DnÄzšQ$<7ªÙÄ¿ÁH sÒœîÁüÀ©À£Adïvç‘‘Aähàq,gDɧ4¨äe’ÝØ’bÙýSs1Vëï]Þ«=Qõ¹$¬sþ•áX¦ìöAäXàØVUÁ’LëÖX¦ÿ¨VÆÊ´…ÝÑøšÆô±V;}p@T½§U'ÒþùQÔ³/Ä®Ø6HѪ•€k‚ÈeصüÖD–İfú5ÜBýÕ +%ª¾D¶Á^”¾ÝÄ `mu "¿®Œªï—è&ð?” €¯coûU¿ˆ÷›FÕUt," ka7§Ï#KöWÀé­yHUo "[`«"E>·™± ˆý‚È_KK½z)"^k’²!­g™6U'¤Àñ:ŠË뮋5ºÛ湸͛L›’¬6®›iO‰_a¢êÛ)ÿa<°tÁÃ76"ãƒ9ºÝ³Ÿ¶VÀæg£ôßÍÌÑ? S}|O“æ}Ï ò p6ÓpV,Qp;àå r-öý¹k­\8™<5n[X[1] _#§ÁxûìWwÚ÷ Ûy§< #ûašÂE=€fÆÊöFao$Ÿ¤Ü²Ÿ7ÝRiH[ "¯Ñ¸$q¹¨ú÷’η5– Òjðv/V3þü?ïóaùÇnÞ­.K}¡1[£œt³m”ßðå¨z¡×¹NDÎÀ4Ýã»QÕ+î3عæÇVZM¸{Ûš›òšy˜ƒ®™a:õ­–>ŠÝsi|'ª×â¹HåWãO¸ˆø`Ž^àƒ9š››¾ï×ÒØ÷«>U=-Ä{Š ²6ö_f çìº|S”|{ö¼™~7#¶B; výĪ7¥¹`d î¾<‡õŽ)Òpí,1þ ð?DêÜÔå~`‹”Ô3䉪ç‘Wó)ž9%ˤŸªù>p¾ SQõßAd ö†ê}cèyJò¦ânìMéD¥UŸ "ŸÅVÈZ9ç|ÀÊñjPîÄ’œ_lùºŽ¨zMR‹ý °vIÃŽ>•~:ů°dÏ AdSŠZ ¨]`Þ~ ¬Ò+ÿ>¢ê娸ùNû2€¢ê;íH¢ê+؃©Ö+#X6÷šQµí×vT} ÛŽ¬»†þŸµòÃp¢ê¿±íËýñµ‚®3ëEÕoô=ü¡¥VÂç‘‘ÝܬU÷éÕ½¯¨z ¶~M§}é‡Ç€ÏDUoç®LHߕͰ-½Ò“›ZdVòº^T}½SN$½M0Íý:Îѡ؞·?ÐÚBTU‚½µŸ×išà}¬ÅÒS'ðõÑd0+pT·a™“c¢ê½v¦Ó¤÷ X• ÌÛÅ8,8»«ÓŽd>JTUÆâëØžÄ–³©ƒbg𣣱¥ã‡:íOâqà‹Qõð:ÌQ·UŸŽª[bY÷wvÚ“±²Æ%£êªÚš Ö˜x­yÛÆ}ØòbQõÌSº”¨:)ª%•ÙGº(÷c£êQõÕ©~÷_¿MMÀ§Ìæ¹^ÿã°é4ý;¢êÍÀ²ÀÁXóNð.–­ý©:6ꊪ7`y2‡`ÉS`¶2²dTõöÉ @T½2ª®„å˜Xk“°J¯å£êÖIÔËEAÀìÓ`Ùàuä]l¿rc`Ù¨zN5™C…¨úpT]K߯Sÿ Ζª×àÛ»4îá}¯óómt½NÆ’ÈêŽç{Wé*JT}7ª…e¾ÿŒö°d¦%¢êÁuÞÆ‹ªR€½&ÎÓ.}‘w°äÙÅÓÊÈÑ5©QõЍº¦ÿpÐiÅØç1ˆOFÕM›­+üm8p,&[&7amMÏK‰K™¤7©¿‘5°~Ð_¦üNkï—§;WdŽcðfA?vžûDLôd†~rTí†U­ó€Ã0’þ¸¸£ŽDÕ§½R§Í]±€®Õr¸þxûnŸUŸ«`üÊH¥vß "G`[ÛbAAÙ<‚•͞܉DÈ^#ªÞÜDvÃr?¶Åº¿”É¿±„Ó‹€+¢uól™¨úŽ£:`2pô°É“'“¾øÒ~ià·°·œñÀõÀêÀëF»uŠDfÄVQ¾ˆíû.ÚäP/`KfW秌颾œˆ5a™’ÉÀqQu¿ãl½AN]y°Iß(§$ÉÉþ+¯›’DÕ'ÚîT"ˆ¬ˆ½IŒÅÊâš¹!¾‡í·Ž.J7Û">œlÞÀ¬€f"+aölŽšÑËx ô®.Lɽ™DF+cŸëLÀg®†~¸û¼Çãj– 2p2Õ™|/ªZŒ?leK–ýLÆ–±þ;ÅÏ«X"ßÃéç¹nßÏ"¯Óø »cÀÔ¤ÞKabL£±ºåY°¿aZ>ø¬þâًjpþÏ_ÂäWþU¯mbœÑÀNØßòö…:«Û®§ 2/Ö¸gYìûr;ð«)K}:Mº!.]/£±^³¦Ÿ1¿ßÀ®›§øàû}_+ÁX¹«ZŒŽS’æh>˜£‘Ø‹Á,ؽÍÏØ=‚Íѽyy¿þ‘¹°—§>!»¹±Ï¶ïgì{ðVúyKn} Kà|8ªv$7)Ýs7Áë 4ÿdŠD¦Ãö3Ix.VÖ4“é’ k£>ߊª¿lƒ;™Ì£ÛÊëÆ|øô»½½Ù3™Ìxä„»b»'“©#µéØ¥xu¦;&l’é-’üéNؖ³X^ÄéÝV;žV×t˜æDáL¦Iò @k,â°y)«veÚAÙ¸ ØKÞÛ ˆÀAdŽNúÖkc{çÈ[k™L“ä 5ÖsØ–Ô”Édš M’úyoè0½¯j_2¬6}°–£[‘¯´Ë™V"³[:LïªSµD&Ómä yVÅúz7¢ª|™Þe9‡Í‰AdîÊ=i}€yvu”rÍdº†4ÏAN»|“Ê´OcŸù0ÉßÚDæöuš×½µq&SkrÐAd,¦®×ˆÛ;©æ–é).wÚmDö®Ô“Ö8‰ÆÊšUÌd2&I{ÿ^ÝúÁ´ï3™2¹xÆi{\ñì±·• ²3¦Fêá”*}Édzç(lÿ¿o¿©Ø—L€ÔCc7§ù0ଠ²v…."ˆ,‹{â5¬D&“i ˆìˆ5Mòpjîf˜i'QõüAçಠ²Q….¹H}H®å£ÍâÇQ5‹ke2-’'©¡Â©Nów°ö·™L»ÙxÑi;ðÇ ²k…þ JÚŠ¸˜ÓyÈ¿°æ™L¦Er3 AäëØ’ãôÎC‰ªGTèR&3 AdC,'`0]€©ù-°k»Þ¬S«Òã±Nˆ^&kGÕë«ñ*“é-ò À ‘i‚È1ÀéøþÿŸ$˜É”NT½“.ÂVÀA䫸ô!‚ÈúÀý{øƒõ0ÏÿL¦$ò À‘/`òO8ì]`¨zG5^e2~‚È‘øõ*¦äàȨúç’ý ¬ÛÄáç[FÕ|ÃÊdJ"SD†c€hî&•{“gjE9 ؾÉÃïÆçFÕ§›<ÿ<ÀW€UšôãfàsQõ&Ïd2ýг@êŽ6ú…=ðךíšvRTݽï2™rHmu lÝâPÿ®îÂ\=¼ ¼LfÅ|F£1iâ1À2´¶Õx°q®¨Édʧ§€ òeLft|jc^ÎvÈË“™:D¦~|³Ó¾älÙÿíN;’É Ez&"?Â_Ã_„qÀNQõý ÆÎdJ#ˆ Nw$ÿž|;ªNì´#™ÌP¥'€ ²¶|9¬ä¡OÄöý‡þ$f†Iýï7ØÖWù/¢êo;íH&3Ôé†72Ø’rþ€oFÕ=òÃ?ÓMDÕk°ýù‹:íK?Ü ¬˜þ™L{è•`t‰cýX=ªž\☙LÛˆª/DÕMM€Ç;ìÀK€`%´ÿê´3™L¯Ð+Àã%Œñ–C°|Tý[ ãe2%ªþ XKŒ}¶.¼‚å$,UOÏ«i™L{é•€/W4yøëXBÒO£ê åy•ÉÔ‡ 2=°#¦ÎWDüª"pJTýoÅçÊd2Ð@9»ÔÉXÒàYÀy¹óX¦—"KcÂ=›‹—4ì£ÀeÀ¸¨z[Icf2™è™ ˆì‚-ã/<Å?OžÆôɯÆGUoGµLfÈDæÆb*~£O‹³ pÈ[Ø–ÛÃéçìûôLåÎf2™Bü?KØ5¨«Ð-IEND®B`‚django-q-1.0.2/docs/_static/monitor.png000066400000000000000000000222121352353655300177760ustar00rootroot00000000000000‰PNG  IHDR„bFWU®sBITÛáOàtEXtSoftwareShutterc‚Ð IDATxÚíÝw|ÕöðsïÌlÉ–ô„$„P¤·AñÒTT•&*ˆJ}à OÅ.TŠøÄ'*†&"ø¤L ©R6e³½ÌÌýý‘D¢²b Ér¾?ÉdæÌÜ9çÞ»³{ÉáÇçÍ›gµZ!„BMâ)@!„š_ý¿ŠŠ <!„PScˆO4úd„'_ ½ävŒãÅx1^ŒãmñNS#„BÍhdŒ®)ûžÐÿ[Æi8<>Í)›/{€tL:µÆ3‚º–ÅX.•,•ƒ=ã¤<éÇ—åØ…á Ù›”#í{õX͇«[Ú)dpáu÷‰su¶Äñ#P%iñC6ÉY›¥ìTæa Œ¤‘£¸®ý mÐõj×—±üW=¿æÔü$Dж㸎ÝÉUÏ©h¿w`‘ÿ·@jy—ü¯¹Z[~øBªr³Ü-búæÐ÷åzOæüU-¾‘3“üó?DSõÑ÷ ]&raþàºÁâpgJ¿})å1Y }¸>Pm ¯1³ü¿çEÕ\Eß.b¦¸w5ëòšÐ&Gƾ‡@è£Âm(ßä9-s·L¡‚š(Z~%‰å¼+ž£\ÏyT¯dÖó¬¤ ˜¯_L®+?ðAB¬ä{ñì;L¹Rhz#6f¨øÜ“æán™By¢&J€òmbj é2‡¡ræ:éÈdÈ*_ˆºÕ#B—Xð”Êç6JÇ>&CçQ5¹Á⥠åI¿¬–È­|ÿÉ„·°âãÌ%KDË.ÆN–³YÌ8ÆÜ ô}¹^“¹uíöMbÆqæf ˆ í¦ó¢@.’ö'J686×}±Þr½Fœj™ø·!BNYúÇÒ¹ F#h»N-­Gia…$fÕˆ>"«‡ËÞ¯—ý¨”’$•L‰í1‘ ô«÷úЬèéôO²Ýª\·Ç¸È¦NS~  <ݾøy±0›µ %õµçKnoɪ3¸üÜuÚ³CÎ9Êô÷ñíº\÷±òÞÏåòh¸Ÿ/äA!„è""¹Î…rñ^Ùî¡jù‹WÁŠÿ+YÛòwL¤j $°›O—>™e¯ðœâüó%£„8®×\˜ÞÇŠ1ƒ²/Äß2HÏ|a™ŠG¶’¡R€õ'1-ƒôZćhÀv^®þžÁ ýˆkÁÓÔÞ/váñœ•KXFýФ“ë˜Þ’Ÿ àXec _§cTÏõ-4‚ïÔ–(<,ï3ñè2t¼½žAÅ6ñdé6[ c’xê=Ð-ætÍ£'Nxà(H"0å—lÏàµûfî21³‚ÛêøÑTå‘++À7ŠSmŒò…SŒFq~È%7V¼àb΃þ~¢º‘êu$³ö/(ú†±ÂužÈ9´ ÃçûSŒå½êΫ;ý.9÷$ ™ÌÇĤË8Zø©\9ž†©Á] ˜ mCTÔ¡\ˆO_ffe¹éÐz.КïzÜ}´¤E ¡]劉¶z’ö’Ð.´U?ÓíUù¯ôwpµ=KÒ~ÉÞÆì"ø ^^m—3è¹|l{€˜û¹‚ÅR‘‘ÓE4ƒkçf¥;¥2™tŒ%Ä[{&^Û¹o¶góQÖ¾iJ”Às:|#60¼á6T·ú~ÜÀ TMAºÁâep¸AJ|´3ée† 7Ž$b$wf•Tf¥QM78þ»ÃðG„ŽQr‘tl=f››„„×\T¡Qyd«ÂÔ Èi_L¤­:‘àž4º á|÷Ê3s0R3ïJ@GhI A7„Ö—•¥ÊƳrÖZéü­üàÉ´ž·Ã=ÙÒo[å ¹L®ùûLöÞÓ“+™ÕÅJWÕíÌÎÖÄ!‹ÇŤãÕ—Œ„?À·VqéöJ½¶ó`ÌG" {XèÍL¥Ôdæ ã½1¨¢jžÐ¤þDÅÀlh©Å˜e h á«éwyûÇÚsƒß ÆÙ˜&Ÿ~K*œ$ L|{R„Ö–.Ò2?ÑDu$l 6ëÐ_Ü÷®T<šÆx{ Ñ)§½#™úòƒŸ¦Z-ˆ¿Š»7ÖûÀ ¤ûKBÛàf/ו¿å~Âó  !_}˜Ì{7¢&0—³6xˆ@T¾ÒóP„}¢O¬g<§÷°VãÈ/§•FÆÀ§Ç„ùË]Kk«“.noòžVã—B¢!~ VU\šXœÑj/&÷Vƒ¸nO 7„ÊãLüÃ0Yö¡F@ÔÌæÚRUÈZtp| Æœ²Åbmâb¹‹w·#‡‰ @*“tþ¾UŒAIc{CÙ6© ›ÙräÓÛd¾ TTí•2Èf#³çˆ PÆ\.RQÉìÂiæñ€ÜÒR˜§”™ò˜Íà`Uy¬ªђ؛؅ݲC¹TÎ:ÙÒ±SNù—˜þ³\–Ǫ2å³›${ ôz½¨–hxVšÅd©P>³Ÿýi„ýçëëG; "%ŸI™¿2›‘Uœ’R?’*\Íï•~“ÒO0[¡œõ¥,uäBuM:ใ ™ tÛ(ž~ÕãÐÅsý'Ôpx·lÀÝhñêÛrŸß¶‰G~&€x.Ò¾.’èé¼}£”ºJ4]¹¾P? hn£žž}E ìÀ%L¥Mû$99tèÐüùóóóóñ‹È1^Œã½¢I““âÁYèt¾gü5æãÅö|MÈ,{…'ïað°ëúÜR= Eà׫ „®Ž*ž¿E’Ên”ÁÜhñ¢&Å!tÕ´ý8-Æ‹c„B¨(‰KTÄ5§#ºøž1^„B¨iºx B!,Æ!„c„Ba1F!„°#„B‹1B!„Å!„BXŒB!,Æ!„ÂbŒBa1F!„c„B‹1B!„°#„BXŒB!„Å!„ÂbŒB!,Æ!„ãF¥ˆzæD~Ò}Qž|Ÿs›³ßŒr?êý·ÓËÔØýC¡F.Æšî¾ùïùCAêþw&õÖ]Éß‘ígvlû!ßÎZܹ"êøyo~ùÓÉ\ƒÁ°û™XR³9zV’ár7Ü­—€)bG¬Øq<×`È;¹óåQm51{Û^ó[eçÇ’ CÒ¬èkSÈ…å½;;ên”:‰}—†*û •pe™*‰ùÚ-Äx6lfé/Ž }"%Ø=X>{‘qibÙ‚Y¶aígÔß2âñ²ùËŒKËͱê OŽõß§oK9N/¯÷’ϯ6ÿƒÿ€­u³ÿÙO ×½]%[× Ëý÷##GNzÿìm¯}¾<>à²X±gù¼5ÉrË+ƼFíLÙúæê_ªê^éâ­³GÜYëgxä#[NX)€"ú‰MëÆÛ¾|lè‡7Ç~´eV¬Àûöjª˜©kž ç×'&‘YÌ”–ê¶(ñêhôÊ’!dк}.¡… °ÞKÀí;}‹POøÿ.à³ š½lý&ÙV·j=§ß½%ð“õÚï²ì=² òéÚTÿ}Šñ¶”ãôöúKçó«ÍÿÕ\;g­®£Æ,ýµ©³áÅXÖöŸ6Æ?çEïïOK;øÑ ¯dhî}b ¾:×êûoÌÏxû®1+¾?‘k0œÚ>5R þ}AuïáOÓÔÚ^×þ˜R`0~û齇ûT°¹¨û’ò“WÍ^¹ýT¦Á½Õøè¦â”-_Z¸òƒ-?ê뉧<ûtjµ”\ÝÀ^.‘)»<øplù¿¾µ?#óà{‹ß/Žž8¾›ŠyÛ^½7¾ã¬·'¤¬\“j¾.E‹Èà0ñ4D º™•ýg–ùQÆ…ˆ´Šº%”0ÖÚ}™1>ÑØãþ*½òbŠŸdé?¦J?ÊÖm©1~™±G?ýc³RŒ²%Ì)ÕÊ Ý$Æ'ã7צ¦D=Ý”0Ú9ÕÔ+ј0³<"@ª©™RÕ'ј0£"|¤½ïÌ2?ÚLk8 ŸN°oÚ§·ùJ'ƒ¸³>ûúhš—¯NNR¤1WÇvÀ1Mš_~R¤ã Tiû)Ol4PŸ,ÖŸb¼Íõ8yMhDD¨F¸üë/Ͻí§Þ×3wYFZu ø-=¿¡¹ áåïÛ]kLù­ŖO^Puíßú÷K5#—=RõʃÝã:Þ2룳.Àµç®è¨¸›ß(þè˜ø÷Z¾uÕ€S«ï4pô«G^Ùº"¡v„MÃFÇç/¼¹Sû;W>´rQoÿæ=Á§¿õÉ;açLJ, ô]DÚÎ*t¸Kަ˜Zõïêï};Svž²ú!ó«/ÿPqýZ,æ!Pâௗ$Ó($É%¼D€aíë,[º.Ð-ueêÌ|HÜ1Nv~UpòÛÁ†Rá÷Ȇ8ºÝä(ø4Àh¥Àeð'_ =¹_w‰Ù®ºCóëK¡é>f¨EBT÷XÚiÅüSökõ öfû.3ãÙc+]{ô'ì¾úN8J޳W¹î”ƒ»xÚ B^!È|•÷ûãm¶Çɧ|}üø7S;ý>wÝ ¸.±Ÿz{°ºÉßg †³?nž? ‚ohýhxåÑ…ûƒ¹ÔZ“`e[©üÃuuvXüï…oýœmqÛ %.÷6tgš¾Ý¥LY¹|ÓÉܼS[V®Hæï|¬Ÿ¶f·Î]k6§»dgÖîm9B·ø¡÷L¹ÈÛïÇv­?l&@u`.²GÞùYFææÑ­EU©ç¼mPÅL[;·bù »ÍÒuk\º´ræ}Ê’/4{>Åx[Òq^û¸Ü¥I¯/yrÊØ1Ÿú¸ø¦g¿ØúdTÞ¦à¯ÙIcî´cÏå;Î$ ]œº8õ¼]`öì” ŠøŽtXU¾É »m¦Ôªšñ„DyªwÑŽž±üñ4XJ Påb>=ÚNÛÏX;½tí=; Ò5¼*—PEœ*&„‰êî¼ÈwŽljÉQÉÉjÙOíåÕOï+ç<øùÉઽE¼Súóõ•ÂäŽaV¾ŒØmWÔÜYeíþÝ”ñŒu²šÈ–Êšsà¹ È¡Îæx¹CŧZ·Z*ûæeMWóøÚ#ò9¿weUÚgеÚÍ2â~á–bÕÁJðmÞî_Œ·Y'qŸyPÔûäïÄåu?—à8ÿÙ[ç«ÿx<97ôø®É÷wúøÍT÷UO5<íËÖ’*Їi)€ T¦‡ªbËïƒæ±]áÃ:ÄûQ3Æêî£9ω)£Ç=Ú³hÓâ3žêã”-E&ÐGhÊ~~~èPáæ)þ`*2K²|éíŠø ¡Ý,¯Ýã¢Ã9÷>Û{ä—¦k:ð"fêäAÓÎÅr.‰'Z³š¹ËŸm7üõú‘o”Æ™; ²žúQwÙ!>k±9Ž ótÒÊž+y¸vËøçJ}ø|²Ÿ ”eU\åÄ1ÊÜ~?ë^#ê(§à‹ ´·Ž¨>òsûæLµ·û·yg!ß÷jóúÆeÏ?yÆÄ†ЀG:Þ§‹Nœ¶…öìÈpú®ñ‘ÎÓG ¯z†•UËv†÷hWýñT¢ŽëéÎͪla ©{Lߪè‹mg]µ×Ø|æÈMç‘ÕOP‡õëPz,­Êëv×é·©1lÎ>d­›4|Ú.óµ>ÄE¬nÔÞe+æåRÞçÑI`wPâ õ kâ –Ô"Ø/÷æ(­à*ò…Âïü]ƒ± yĘZ¨ƒQ]íÇ„øOówJçTóÞj5ÿ­VóßjõÜ­»> yí´Ê*1SD›ÆOR˜¾Ô&å2oñP¼Šß0z»1Þf}œ‚.<::\'üݸþ²Ÿ+¢nÝ+*rÊ< ‰ìo¼gl=ºþ[kÛç^~jp×®·N_¹ð&û·ýb¾êøt§»ç’ÄI}ÚÄôš°dIy÷§Ç¬Í1Mt§î=ºwVMD§=ºµ ­}s@ÕgúCa©·Ü‹Ü™/6å†L{yöàoñÒÌpÃæÏÓœÄÛvf+8—Y#+ßìfcvVåšçv"«S*dS%O*©U…8D nV’®V ·µŠò­Å¨a!CYå¾¢ëB3…ŒÓ~ÁcÍþWÿQEb#Î+µ#­Áa¢ÐÑÓ¶ƒ³yæ.æ"…¥¼¡”7”ò…•¼‡©Œ+uµøkÆ…VŽ{Œh©šÅ°ÖbD¤ª’¾yô`W—8OëgÏÖ!ÊœSÄã³ßáâí>Åx›óq2E‡ÉÛþ?xUÏëëÉçÝ×ׇŒZúú¼É#õK8jλÕd}öUzƒ¦‹þÆ»“¬êÔ‹ãÿ¡ú×ÂÍ»Bå¹oLH½]³ûóá§©›Û}Šñ6ð8½¾Þk>¿šü¿ÊhsÅMX<~žžT¦í}mÜ‚u… ûÖrèСùóççççcBÍÑ0{ÿç©An†ç!ä³ð›‚QóœEˆa\J%#áRTO‡ó”Úƒ•!äÓx<¨Ùcøßc‹Öš‰öÃêôÓj¬Å!,Æ]W4‡ÏZ„ç!tå=<!„c„B‹qÃpQ÷%åŸx&ê¯jªˆzæDþŸVyBÍÓmÎ~3Êý¨÷ßÖ]µ !„ÐUcq÷ŽßWNÎ?»Ý Cƒ…ëw„²ýÌŽm?äÛ›þžË,FÍ”K2 I³¢ zV’ár7Ü­—ëÙÏõ_Ü›)HäÂòÞu7JÄ>‹KC•ý¯—pe™*ɇžÅâZþÇ–£ƒÁyü?‹ÇDûÊDéè5¶ü饯¥‰åó¦‰7)¨¿eÄãeó——&–-šcÕ>­;jˆiÊìÒK§³À¿,LJ—?¾Â¸t ðÕAš,ÿ\—ãl¬|ëu?•®tœ"ÿ4sô¡wÜûÔ›ù·ÎØðÑ´˜ëöap±bÏòyk’+šþF¨1jUÌÔ5Oó¿_+Þ:{ĵxö€G>²å„•zßOS,î-2‹™òÁRÝv@%ÞBbcÿ[Bö­ï|\˜¹çÝ÷Ÿnõßywôí;äé-ú™kßÛÖÊ1uÞôõîÖ~É_~²A—t ì5íŸZÏéwo üd½ö»,{‡lC|ä!;¦PNj\ò»[ß1Jn€YSäŸëqœ•o½ì§ñòÀ•c©*/+3#ýdÒϯ8Lû×TWcxÛìͧr †œý«ÆG×îMÛkâÚS Ão?½÷pÝï>fÈ _þœi0rN}µdl4P3ݼjöÊí§2 †ì:ûQÿ¾ zLYwš:àŽ'ÎíyзbÊì]š Ùæ¿.["†v÷ÎÕ,e¾þéº&É?×à8yMhDD¨F¸\Þn´ý4^¸úwðÉú[Ÿ¼v~|ÈRß%j¢Å½Åb%NþzIÒ1‚qA’\ÂKøÖŽ±Î²õ©ëÑRçQ¡Î„ˆÔÉãdçW'¿l(½¸Ð4#Lâèv“£àÓ£•—ÁŸ|1ôä~Ý%f7º:èͯ/…¦;ø˜¡QÝci§ó? LÙ¯Õ'Ø›ç»ÌÄ™žtÐ>êŽÎBün6:Êöó÷g[þw3u´PÎ~å³—-zÞ<~ Óü©ÙR1¸‹§½ ä‚/&0>Ü<º‡îÇjç|ZåŸÆ=N¦è8åëãÇ¿™Úé²å°‘öÓˆyàêQ·4kÞíܹý)5« ‰—¿ôujfêŽÖç Ýâ#Æ4}»K™²rù¦“¹y§¶¬\‘ÌßùX?­Ì†<óôݼ%ËÏ>öÕK«ŽÆN¸7¶fÀëܵfsºKvfíÞ–S½Ÿzîû¡Ä§¾Œ{æ­}®Ë73°5é¶*fÚÚ¹Ë_Øm¾ô’U\äí÷c»Ö®w¦ZÜ[*$-SÉ:3¹`æõ’Z#IÅ‚¤ ­º8Ý{4ÅÁSÈîÕy:»üÏ4g!¹5e&Z‘{±ÍòƒœÝ{ÚŠ> (1_þà¹tEQ©"˜SÔr„¨äÓ°Èv.ëNmY1ïIWdg¨šiò’Ë-˜ðÿÊ®Œ‚‚̽oh×<üüAcËWQV0!Èvk+ý¾ þ›~p ·Üß…Ôä jïû¬qéÒÊ™÷)K¾Ðì5útulýÆñö4Uþiªãl´x/\éܶpï÷é÷V—Âüƒÿ|ò_Õ+ª³òŒ€d¯pÈJ­Š h§.N=o—« gvÊE|Ç@ºO“&<öëœ1÷j, ¨¾ËYU¾É »m¦Ôªêï$°ª__›óÉO[gÐO™|´¢I»ç´ýŒµÓK×Þ³Ó ]úl’è1Oõ.ÚñÏ3–+ê_÷Ž«ˆSÅ„0Q]ÂùÎ’M-9*9Y-û ²½œ¯>VÎ9xðó“á÷…‰Šx§ôç3/…Éì|±Û®¨Y³ÊÚý»)ã% ëd5‘-•5çÒsAC›åÂM\«Û_Û´Ðï£gÇnOƒncþ¹ê³5ÙCgì.¡e#4‡· év€"Ýžîæ‰}e¿ÓÄJdUÚgеÚÍ2â~á–bÕÁJ_-NbÈmÎþA2}z1Œfõ8‰ûÌûƒ¢Þ¸ÒåŠÿþ~/\i1fž³ò¬Õ]UœÁt±§È˜\·@.ÞÍ—¼ÉÅ_Wºûß‚ÆþðžÌåÏ#Ñ/>€ôé×ZØWÕ”ùOÑqDBh·„ÃËk·,:œsï³½G~i’”ÑãíY´iñOýq5ÕâÞÄLòsûf­ò„tfÚàò9ËOIes–|»JHqûd¼M•šê8-ÞÆËW:M-šÎ§Ÿ=›~¾n%ö6j=—í ïÑ®úã¦D×3Ò›U)‹Ndˆ†t×þý·™ªÛÔ·ŸŽÝ<þõaO½3£_Sft×é·©1lÎ>d­›4|Ú®ši|¦î1y|«¢/¶u]î7ÑâÞÄE¬nÔÞe+æåRÞçÑI`wPâ õ kŽ;XR‹`¿Ü¸´‚«È ¿Lâ¤ïIDATów rÄF4$mQ u0ª k{]ÍtÉ\¢Ôûq;ŽL’d¢öWµøQSg ±R°º&gù°ó/ón”¯bÄgŸkReoúà½êÿ´_g”nù€Owûj¼M•û8]xtt¸N¸^ûiÄ<Ðø¹ƒXO|ºÓÝsIâ¤>mbzMX²¤¼ûÓcVJLûßüÜyËêwŸÑ%¶M§>#Ÿ\ñþ‚ ©£~íg~°8àãÙ¯þ|xõœw•Ï}0·³öºôÞ.¹¸4³œË¬‘•ov3‡1;«ÀR“¼T}¦?–ºq»Á}¹ý4ÕâÞD$V;§TȦJžTR« qˆ@ܬ$]­nkåZ‹QÃ,B†²Ê}E †f §ý‚Çšý¯þ©Bb#Î+µ#­Áa¢ÐÑÓ¶ƒ³yæ.¹èÀîü໗ͽ§Gll÷»f-»7ìž ´pD,T¥Ú¬·ãBÄðnÖ;Ú) '¨Jú>æÑƒ]]â<­cœ=GXG„(sN/|‡ SŠ‘R¨!J±U¤ w%g4Öügr1ææÊK‰ËgkqSåŸÆ=N¦è0yÛáÃÿ}´îƒW È·W¾ŸFÌ×às‘Ì”¼lâÂWßXðí/¯@UöŽ%^8ZÉÀœºbôûª¥oîyZî²3G¾þW‘÷q6SözîàŽg[WÿôΑ¼wN¿1hä»úç>œC¿¿ú 8òÖÜÏGoûpñÞá/œ¸æos\íbÔ@‚¦Nÿ]Á~šhqo™Ù+8ŽP›‹Sean‰€¸S“y·3ÍÔ@<£HOÒ]éR†Œ9wi g»: ²&Ôήˆõ—@è²ÔÀÊÖ噯÷[]ö¸ª63*©‘’ý‚âšaRHygò|ÿUϯNzF ÎÒãŸ.œü¯˜³õh~bQ­˜0‹P"g¿þÛ3Lâ±0uó݃AIˆT¥>½]³ûœo¼ŸêޏÓ<¥}õŸM<PòÞ‡¤n0M”®ýq6V¾õ²ŸFËäСCóçÏÏÏÏ„š¡aöþÎSƒÜ¸Œ"BÈwá7£f‡Eˆa\J%#áRTO‡ó”Úƒ•!äÓp=cÔüб üï±EkÍDûauúi5Öb„c„®+šÃg­Âó€ºòž„B‹1B!„Å!„BXŒB!,Æ!„ÂbŒBa1F!„c„B‹1B!„°#„BXŒB!„Å!„ÂbŒB!,Æ!„c„Ba1F!„°#„B‹1B!„Å!„BXŒB!,Æ!„ÂbŒBa1F!„c„B‹1B!„°#„BXŒB!ÔxþÏ =X}ŒIEND®B`‚django-q-1.0.2/docs/_static/scheduled.png000066400000000000000000001430371352353655300202600ustar00rootroot00000000000000‰PNG  IHDRà7¥á¼”sBITÛáOàtEXtSoftwareShutterc‚Ð IDATxÚìÝ@÷ý?ðWÈ%‰$€‰òCƒü’T@‘´‚­V±•®ºÕ®µ³nm¿ŸÖO[·¶ëÙ~´]W×Ù­¶+®âŠ«¸â*Ø€J¡%•àŒ%A ˜@îr÷ý#?¿­¶`_?”$÷¾{ßÝû.Ï{ç ‹a@!„BM ^¸ B!„€ŽB!„€ŽB!„t„B!„t„B!„0 #„B!„0 #„B!„!„B!„!„B¡Û›!„BèG¥µµµ­­­µµÕd2Ùl6Ü ß3¡P2ê,†anúRIíÏn¯µ/é™·‹âLÞ ØSù»ç âµo¾¶ØÿfϾúwÏ儹¯¾‘<î‚–úOïÒ³^|õ)ç¨ÃMtWë‰BÍf³UTT477㦘ÂÂÂ233¹\î°ç‡ö [ôÕÅEeµç f € xþB©$"\®X‘6ÂHçéeZücsrâ®™–'úêL®K•†’up"«“§MÀ¬-+9ÝIp‚ÓV,Æ}ŠB]Éd*--íëëÃM1A477¬X±B(ŽÐ- ¿¼Siöx‘¢¬&£ÆdÔ‚3Ò¤?|&#Û•eåj xÖdEœÿUóØÄ_I…4Õ–”+­@cW$O›Yج)+-7H"‹¥þ¸ŸB¡1Øl¶ââbÐ2÷Kiiéý÷ßïÙ>ÐÛK \qV KM öç[Lí½æœÎ4 ×ö6[„B¡ï¢¢¢Óù÷ï¿øüõ¯½Ê4}}}ÕÕÕ™™™#º¥]ã ®â¼ç7+<û—-íä¾I²³¾¬¨¤J­3Yxb™\‘›»8â˜ýéââ2•ÆQŒH¢äŠÜÜ4)쉀ˆ#bsÖ¯K¶þfk•»?ܪÜþ„ÒYÛ×_SŒì ¿¾Õi¨:TZ©ÖÍ<¡T–‘ûpNè<­í§Kö)5&+‚𴼇ó’ƒ=:’-ÚÊ¢CUõÎ5„@›ºbõ ¹ç$dgý‚JµÑ „ /¾±Nj©ÿto™Æ o7Y)Ç9b¸É—:F&“…†† èÂõ>n¬.;-Ë‘KÝ#HøÓ‚‡Ä’·ïTzöB[eÁöúÚµ[žZÞº«Ö:t#4¦vNÆêÑFËí•îUg<¹y]Üõ^!;+wmÚ”¬&]mѮڪÔ'Ÿxìù·=ô¨>x¹ÜèÚØfCmÁ6«ÿO9.#ƳMÔ¦o<Õj ˆŒ‹’+÷¹0aûíÙ2y”x c¢ì£QzDF,¡VS`(ß½µ€ˆ¥áQòäÔÔäÁ¾ñžúü]Ît.ÎØðpv8߬.Þ]Pk«¦àƒªØ—£vˆvVîv¦"<ë±u §½¶pw‘Ú æÚwËe›“ýl/~×©Ä Ù9i2i6h”§-œàìMÏ$h wˆØµ›²ƒ9À5|Œsu,õ»w¹ÒO–±"#A̱µõ§u#º)£I ËPÈ…íÕÅJæÓ¥çò¢âø@ê‹ßuÆI^l¤`ÒPµ÷ƒRƪÝ{Þx,Ž–†½{Ýk—”»"YhQ—Vé®r‘q]‰ôÖÔÁqÑœôØ3bmé®5 É}2/œa08‚„åkeB©4XÈãÖvuñî‚Z3€¡øÀ9Å/ã8@ê«êŸ‡ÈrŸZ—Ì#­¦v­FU¯!ø£]hTîÚQàXIÖ3›ˆµ ˜»îù'õeùùµfaÖ¦õrpü¥è,ÛåjJ¬ø¶ø“ÊÁ øF¦/Mšæ ÝÍuee &;Û?Z‘½­mö!f‹R—Æûø-Z›Çýô³æPEvjX0Ðý­²´Rc q¬=ei=[Q¦48¯ZØlaÂêûLë¬?x¨¦ÃvóöQbbâ°€|ù†Í¹»w©Íî.8£NeÔ©ªŠŠ’Ö?óXÚ4èQ—8B³ËK–r¦-^—§ªß¥¦ eUíŠÕ£Ü§¯³¶Ì%yO€i9ëóN?—o 4%õ=É‹ùíe®~y^Ò“[s&¨¸ä´˜åoñ'À@G ŠŠ¸Z‚½ÎÕIÞ‹®‘0qòdÅ(st•‰ÍËE& Ú fˆã“ú*WÍeoȉãÀ´Õ+j_.5XkK5ëâä}•+KòžzL1 ä±þ¦gw©©±ÖD¿euGæâ“J„¿$*ÊãÖ™þqriuIÙÞ"½Élµ$éê¡×©ÛÉ8ÁTO{{§É?8XçܳCô¨>Þæè™&Âs7oÎ{'ó¥q jm&"<*Ê•BÛ«Ê ®¦´é©ÕQˆ ç´?—¯JUª±ÄÉGIè×ÓY›7? å$ñôŽù‚Ic"Óü9×·M@œ·i]ò4X±"¼|—ç¬:U•F÷Šlr\ªÄ[^ÞZjºÞã :Bý¨™LWÿ [éݧêêøBi|d\HM¹ÁÆ™¯ˆƒþT™dé zØB¹b”gi&8RE²@¥4•;ß ’ؤœÕ«“‡5Ê䨊 õ©«¥ó«oŒNmóÏàdwö ÁÑ~MZ3)çl§×Ñx±®šó…Âqé$9îmâõ£Â;ƒÃ:+Ò¤uíÕ`¹k,9'86œ(5Q×y|ùã=(B‰+‰ãC¯¦cÀúÞø˜°øžÁÀ…zC†&t c¤rà %~0ðmM¦ÍÖÊžµhhd³µ/üøìL™,L"•Æ,’ЏŸj õË™ºM‡½©¹În³³…©ÐÝXw¶©/@”?Í›Ç Jù@ðãw;f:-(äjËe5„aBˆYiÙ³©BÀ3†ÕZWsö‚ 2Y¶È³¶Ýݽ6€“±­Ï5GÊL‘‘a1"1ÀÂe[[;`VLör©±£µ¹±±ÃlB#è­omtýM2bø1gZT²"*YdgýÇÛw9FèëÛÉ4ÿkÏ"G –Wí ·jý¾Óê ]7!ïF’3@’À»þ]Bº6&ií¡¾ó~¾®:Œ? kº>SIÝôTž<˜dûÿ³sH<åG=üâ3á‡J«Ô®ole6¨Êwk̼7u´‰Y¹÷@Æ–"nìJºåg2>óݶ‰Gõø¤d|M‹œ0ÇB¡IB(^e:O/ñð–¯X+w<#•K} F° Åâç°§Î¥.KõÖ©T^hn䲟*¤‘BN3¸‹°¹B‰Ðnêp”´Ùí®:—Ó{æ³B¥ ¸<®ÝjåÊV޶,;Û13öˆÊ±¨Ö²O5ÙØ<Ûfµ±gÊ<²ÕUÖóf.Í˳雚Äñ\›¡²°Ø/‹ ‰Z (þÄÑ˽­Ý¼Ð¸ÔÈÆC£·Ô³|ë0Æ"8Öáa4µ;¯…I9±Á| ÛÕí#£ÔâuQ‹HK§þtá»*+€U­l'ã<;Ê©¹2MQ­ ÀX¾}çù-«¯ÖNŒZ=Ú[{½ž”;ÆãôhÝýãÂÁ¨íôÛðy{›Œ£eEÀñåÚöz=™Å²½Þ@]ÿñ…BèG-44tì€îJ@ç™ U‡Ø¢„Ìx±<Ò÷`[«b""›ÏB´Ì Àfjî†ÒxYˆÍ)Ÿ6t؉ÝÒÍž¥XÆ>ÛdqŒ”KGo_w«bdó盚@–/î®ÞlD%èn}«E%›ݪñ[ ˆç5QX7Ú²¬ˆÅ²È™~"ù4€yØLM& Mœ/£ºÃ2ÓÂzO}ú¯¦fHEqò™½­byÈðži»ü¤‘‘!"oè=[SÓ.°ƒWàü•wÇM•Ç›BÒ—.ò¹ŽëJ_]V°â¾óCš+Ûl7q’pzêä« óyb™,B,ð²]§Rº¾?(uܪÏ?VKìVS¦Ò? Ìˉ• 8¤¹Ý UŸVÖê¥^Z7Zž NRHŠ `(|w/'O! æÕlÒkêOWך’7¿”Ì‘f¤ «JM`­Ý¹ rs’%0ÏÕŸ6+6?žÀ9Úª.«n ƒ9ÀFHG½mÞøVG–K8` ·îhÏU$ÁjÒªk ÒuO)Æù«÷©"I¨,7PêwX—›!rœßƒ¬­®·ä¼¸%ÍŸ#͈%T*Ç¢ÞýV$ ,ê²Â‘ª‚¡sñÀî½dªÐT[Reü~ë0ÚøB×fÖ–WÕs$<àøK#„îA¦Ú’úäåRR]¼»Ü4üj©d×ÇZqjZ¬T8M àQ$E‘£‡[àðb~FHnÝ­²Jwìðß²Y1æO„r®OÚ«ÊN b_!loVå®]‚¼,ߤ*.tî}"A!ýêï&µ‡ñl“ñ™–°X\Xhkí®wyŠ(ÐV˜×xŽ/|oB¡µ1_ó‹Õªª×49z˜Z!2Z!‰ñk¨9rÊO‘˜¹BÚ­ïè>ØM eÇÄŠÔ´Ë{[ TÀ·Ô¾³GJiѳâÌèü¶úxM›Ý5GªùŠùñ‹Ba »ùXåY3ÌQ {›²¬žŸ—–-‹ñLÅ1ƒÕÚ6rY¶¶úºVÑ‚¨L…Xßd¤†,_SQ!R¤ÆdfÕÝ\]ÙÐc·÷••‰–¦Ë³—ËŒm ²Ì^}sg\|Ø‚„z}Xšü¾‡£»½L ô•Õœ-ŠS¬Šè¶t0FùË3R¥ÞfsW_Ï•ž`jð,yêݹwE‹ølºë«/O´RÀ M]š8 |ir†<zººÍÝŽo!x‚ éœÄ%+V¦FLõaÛ7"-C.${Ìf÷Dñ¬yKRæJ}ÙÀÅÊ8íß^0^qJïð EœÿˆH×±:"yFj¸·µ»Ëì\à %±IKDOã \¨úòŒÀ7þ®%a>dûñÒÚn~xÆ’86ÛVú’XÙÝeî3®^DüÅÊÉaŽq6>Òy ¤ýÞd¥’¤•½Pá¸=?z‰b–/G4W.캠3tBYúºMyÓÏV©¯äw-–úíÊÒZÓ-«Ã(ØþÑт텳c+x§æ$‹¦EÏœ!O«xdcfßñ# œÐô¥‰SÙl‡mµýVË€sO!G/XùÈÆ{\›tèêp|#’£ÉoN4™hÓ™S„Ió¤ü‘»ø3ãƒût.v[•‚©É9éÁ¶oØ‚ŒX!Ùm2u™]»5\žñàÆ9W×~õö0ÊfÚôU‰²•öhíì©×Þ&㜰ý£Ä L­Z»xÂØŒ‡©pÍ‹MÏIžÆ†q_!„~Ôf̘ñí·ßâ‰~Ïêêêêêê®>¯¯ovv¶çzÃ0¸íš4Hý§/ouŒræ¾ú^A!4n&“©´´´¯¯7ÅÄÁårW¬Xáù Qeˆ Bhé©~wW½$#C.  À¤«-Ùëƒ.Q$a:G!t„Báý÷ßôèÑÑǺ ïÝÌ™3—,YÂår‡=¡ ìÑ©Ô:Ué°§y±k7eLÃ̓Bèúp¹ÜìììÖÖÖ¶¶¶ÖÖV“É„ƒ^¾¡¡¡aaažãÎ=á„&t>×—í-ªÖhÛMîoeHerEΊd)þôB!t{€ŽB!„Ðâ…›!„B! è!„B! è!„BMlλ¸\óê!„B¡[-11‘ð|€[!„BhÂÒjµº+¾¸nc6=à}ÐB!„&çý÷X X ¹ €aXÀ`ÿ }‹LŽ"ÐB!„& Ú‘ÏÆÕX,püɸþf`¹ÀÂ"“¥t„B¡I†¡i`±gÄcXàˆ}ÎÀÇ0Î?hÆ1 €Á"“¦t„B¡I†fqÎÙÙÊxù¤&L ð˜ÀÞs¹¼ÉœÀ2_0ž¸ÌŽ›6ƒCS_Ò’ìé!SX”¡Ýb¦\]ñŒ3-: ®ÐèZŠc|ƒEny‘[Ðñž0hÂÂ/C#„šÜ Ž”,/ç s·µ‡ÙGQ }¥ûŠžb™­všñröÑ2 lQД`/ÒÜv¥‹ Ú1Ú5Ú= šî¥x0,ho`a‘*r :Æ 41 »tÔjµ?x•"""p¿ „ºŽ€ngÀñ•B°†¶;ž¦.º¾íwMİ|ü§H§²zÌfÝÆ 9sã„Á^À‰K[Ý×—:xü¹3Á|6 ßbÑ\ènécˆÀ œH®Ýb¹Äò æÑÚÆvõÖà` p¥Lw¬dXÀÐ0¤b€En¨kh@÷Ðκæâ.ŽÐD6¬¡†„„ü€•9tèPxx8î„B×ÐÆy#÷è NtÜôhèѵU\¢]ïvŒv}Q‘&/´ô "|ýÁnЛM”ÝÄxËgO !l-ºîð‰ Ÿ2w6\Q]¾Ì0Àæóx¦ÞÆ.¦× øc>Ë9´ÚÉ1†ÚãUWÅ‹ÜPöЀî™`³¤(êË/¿>þ¾ûîóóóc±X7–ãšÈy!„šèv÷Ä::bA¯ûò•;0½VЦY´32´+«Ó4ué²åJ˜¯¿—ýÒ¥Þf‹ À.œá˜ˆðöfLŽWºNžï³8Nöô:Ó¥ãæ€ŽŒ9¤—Ø=Ö‹ÜPЇõ “$¹gÏž3gÎÐ4-‘H†ikkS*•.\xúé§ íkÇ ƒ&c"§iz<…<¤ñ.gœEðÀA!t8îÂ8Æ‘Pú —5ýΡÀx9c9MÛiW_-4ímgh†±;ØúNïµØY °˜>Úΰۨ~èÁ[2ÀbÆ5@ƒaßo°ÚYÏŠa‘+BŒÐéüË/¿T«ÕB¡pÍš53fÌ€ŽŽŽÂÂBFSXX¸~ýz‡ƒ9ý8: ýE¸‰EðÀA!t]ì4, \o`®r†¡ívGøsß=€f0 3vжQ\B2Ý6´v÷]¢øÓ¹SfÚšú>OêOŸ9cp¡]CÜwçïé8—B3î¿õñ¬¹±"0F@g±X$I:¾Nwÿý÷Ï™3Çñ|XXغuëÞ~ûm¥R™““Âf³Ýè˜3Ðd 讇=§w=ýÌÊ4=ýþ3’ï|úí?¯•Ýœ%öŸþåü_'}ùŸGÄÐB}÷€Î0,šÇ´Æ•ņfhÚyÇm†ååH‚ ÃØGþcš¦íýç.ZƒÃy¢Ð@Ñ´ÞòšÎ“g:“"$!óìÙeêé¥h»k–vgw½»£ž†å¾¯·c¼‹W5XC+†En¬Èa’$»»»CCC¥R©ãy«ÕjµZY,ÖìÙ³kjj.]º$‹½¼¼0g IÐ=è=ÿÞtߟýß;röž>Ðßrú‹ V MûÜ”%Ò4ÃCÑWB¡ë}[püÜ 0@ö–Vö9FH°Ü_¥é‹êæ½Î¸GÕ(µ5à…,SKëp%B`™ÍÇ¿îpýØ¥£HGëÞç»”s)Ìàõ€ÇR<Š0®?h,òÝŠ\% »³„Ífëëë3›Í4M³Ùl‚ ¦L™âˆ5v»ÍfcÎ@“: ;v·´ ˆO”z3 ÞÒ¤Üÿ—À0LËžx³¬¥À?þñ?}ðx¼O˾5÷þ¦¶Çf(žûàO?—ùÿ¶4³(énïòå-é…Ú¿Ç•ýæ±ßïéïøÜ?ýý·>Ì€ñø;þ­è‹†ÿ¬× ÿþx¼8!„nŒ¦Y®w÷ýú\_|SqDB–sì3`‘ÉRäjaŸÎÎΖ–Çf³¹\.›Íf³Ù3xÇÌhrt骧îþã/RìS$ÅÅ%-\¸,+Iìýg¶ox_úúѯ“| çÄÙ›ÿ¶¬ôqÑ’ßW4Îð÷hù8;煲ܻèiéIüààÖB±´ìÊþ߆ÜO¿úW¼Oˉ= 30Ð#Øk• IDAT}øÓ¯>ð?ÿÇÌ•¯•ý¤ðnÐß3‚v =­û›w^Ø\}^ß30 ïu[ihoQÚC+çqišî8^t>öÙb¹4Ms%©K$Ð_ËxKsV¥qiˆœç} ½‹¦ýðÀA!tƒÝÕCÊrýöëÞ|,ÆuÓmpý‚¥+ôa‘ÉUdô€îåå•™™ÙÞÞÞØØ¨×ëçÎËb± ƒc‚îîî)S¦`@G·I@̼˜Ì¼Çà7uÏ-zðã3¯þ/‚%oþû/iƒRú¿yî'ÏêŸØWð~œõÆE[švü„k9Í0´çˆsšq~3‡ ¹Þ>à1† „B×ÉN{ô¨:¿}èŠv,Ö`Ç,Ã8îÂíüö!™$EÆ è@„¯¯ï}÷Ý÷ù矷´´TVVÚívš¦g̘aµZu:Ýo¼ñÓŸþ4--Íf;¾*Š9MÆ€Î0 @ÿù=¿-<ôXNœÈ §áDCϬ$Þ¿%Þ;ßÊ?Sð‹8è×Wíˆ]bîèå,‰0Œµå¼¾œ½Œ{ÄWÐ9Ò­;jRší Õ=Òy ÀsBÏ1 #„ºŠÙ\Ü·±®.Ë€îîÔóòòòòòòööÈËËëêêêéé.—ØÑÑñÑGÀž={hš^¸p¡#£û~Òý†5T†a¼ƒ"guìx|Ñÿ¼½½½¥©íúèg$¿.Øöòó?Ÿ¿c¼A0kåkå¤þæ7’M«Ó÷ˆD‚ ïgÖvGt€Y>zU¿iíüßxÏZùÎGwx¾Ì ™t”ú »š¸u?„E°Á"Xd’ ÄwóÛ: w뻤PWW7{ölÇ A8º)Š"I’$IÚ}'u›ÍVWW÷ùçŸÓ4MÓôÏ~ö³… AQ”{ÖçÏŸOLLÄMŒ&ÏvÞÞÞ?`}ª««³³³q¿ „§ÎÎN è··¦¦¦ÄÄÄQ†¸¸»ô¿CD¸¾9Ê0 AóæÍ³ÛíÅÅŰÿþääd///ü¤M 7úK¢ßS}B!„Fââ¾»9‹År wñ ,‹¦iGyiié† ìvûD:ÇhC\&P}B!„®Öƒ>*‹Åår†INNž7ož···c:v¢IaXC=uêÔ„ªB!„Ð($Ékóööö¼;²H]]n\4Áº¿¿VVt„BMЀ~?jŸ1cnY41á„Bý:B!„Bè»tü¨!„B! è!„Bè&![ ·¾W×?˜ô¦J2W禄rÆYþÜ_^üH S37o^&âyîÃW>ÒP¾ þß–Õã‰[Çám;*º@öÈÖG£8תªÏÔˆÄkîÅû¼ã„B¡Û0á…ÄÄN¥:´š6}]Ñž ˆ-KD×7ƒ®ãÅšôGcý¾‡ºN ‘úô_jëêÒžØSúâI~¸ûÜ `kF!„º „dæ­•ózëßÙº¯ z[zI N½³½¸ ¤¾ø„Ü ÷ä;[‹ŽDiжÊî ú,Ùz²èÀ—*}„¯4qÅÚò@è8úÞŽ’6Y±ùÒ§¶ØöÞ©>"bõÃAGvŸêÐ|ôâóS37oY6Êe‚4gãr^ÇÑm;Jºà’¶‹LòƒŽÃ;»Þ­çþòÊGZ˜šóü–%~-[ßSõûÈÆZUuú>ð‘f>ôè²HÞíÐ#""°5#„BMXZ­vœS¶U¨¨møÄ¦„r€—.-Þ¯×?×+Oòë=WÛéQ£¦s߈ÐjO«—<ä}{k?z¯HKAPÌ‚Оj<µïý~[ÖF¦¯]¡ÚQÜV\pÔgÆ©S}@ÈÖ¬]Ür9F[Ñx À'"!v*q•Ý{©Í 1•pÍ;~÷kNhe‰ !*U›¾bEâæe"Îí´£ºÙlÆvB!t ÚUmΰ=#b*~±KdE{4úãêËI -uzB–5zhæ„dÞI´ì×ÙºzðÙ˵Z (gíꔩÐ5µí%]ªÿhs#cEéåÖo/Ò—ìoð‰Y›'÷ˆ]¶¬EÕXÑ32×äE õû^y~²`ízÏñ-ÄØë']ó«G“ü:üZvTtu5]¢àö è^Ø‚B!„n3Ò_Ù¾}û‹,ð…>MÑGÇ;€'ËŒõh;ÞØ¢­k "ÒÇìÔæø%¬HŸ }§Šk»(çsdߥ^€K%ÜúÊ+[ÿXÒÐÕÒ ˜¸,ÁÇqAx—ìzF‘!!>@µi›ºFë<§F<ã+ùáçÈðäí¶û/MØl6¶f„B¡Û†ßŒˆ©pªzµ]ä‡3#3ÁWuêÒÑÏ÷Q@ĤÏà]%"Š2WÄßÓØxÉÚ}ƒüú!háƒ+{Þ‰ ©@¶Þ¯rÜ‘¥ïDá©”_¥‹8à3FÀö’ùÐF9Uÿá¶}šK' þ“²y™ˆã(HY­ô¶t¬q[ï¸ÁµóòÂÞt„B¡ÛA[EaA#ô¶4ê‚¢‚8œÐôô©§Jºô—|bÓ#®þÕJ^ì²;ƒKÜÒ#JŠ´—Nýç$+"z;ÚZ´]²›#É–â‚]@È|$¢â¯%mÅÇe¿Z"âð¦út¶xO*H–¹,iÌ(~òé%;*ººŽÖf®šB@¥/ÞSØçT]?¶Ý‡¡!„BèvCµ5ªTÚ.ð ’-|è¡t×ÍÅE ™!àµ`Æ5‡m‹RV8Ç­8zÊCÿ/7Qê×Õxª¢â„JÛåµ v*ÕT”ª Ùš—4ªºS׈٢ô2€j,®» œ¨k‚èÓªZˆ„…!?¶ÝÇrü>Q]]]\\ܤ¨ñ矎GúÞÜ{ï½î¿/^¼ø]f5}útÜž!„¾‹‹/~Çò¹|ü÷Û‹/ù$þêżܤMSSSbbâ¤À“˜˜ˆû}êêê†=rƒñ‡€ŽBè‡ÕÛt²V¥ª¸05%3ÓùÄEà&@hüŸ8!„B“ÙUw¸¤®|#rºS„ù|Rt¼‹ B# ;.hÚÀºÞTï(‚‡B¡gFÞ«Ûóp;Lª€~-TGÕ?}ë›¶fÕœ±îmIuŸo¼3;€è>ýÙë¢Õ"ì¥G· šfn }E:¾©¨P_¶Û7c"#b·0œ8|¬ÅÆö W,K:´Þÿ–®m·Ú€•–™"á_wu©ŽªýÇ–Ý77`œz/¨/òfÍygæmÿÙJ²rÕ>¶'„Bèêźj¿à€ñ›‹ì@ÿ>µ®':aŒwmÚ|þ›ÿ²çȦ²üâ–Üi÷ç°X¸•Ñä5ì¸âÒsú£W^Ýõï3Þþ³“ïydË–µñþãŸÕðÔZS¦f/¼oíL¶IUüEÅE÷F_+¢SjÜqßÑC’.fƪÙ|oÀÒôågÕaÞBÜÐZ³Xã=z©+ºoÔA3£Å>ãš9\×ÌB! ècäóvu;7áž”Ž’ÿ½—ê謳4+žÔvÛؼ™‹sfjN·ÛzzŠÿù5W”’³ØO}ô?ÖÅ÷/mª£•ª;[8{á’T)zi$|«uÀÒk¥ä,ãE á]îèÖ[»ví©S§Ü,XPPPpÍTMÓ4@ÿéßܹæ¸â½ýõ÷Ìðèo9¾ï}5]?‰õ»Á€Nu7€ä.‰‹Ódq¾_7´[cžÁÛÒ¬üòäù;[”µ$!°¯æÈ‰‹¶¾Ë_I¿'ÝýIgÊç°BÚ³=lÑ+¿<¡í6ÛÎ&ßs—Œ½òèIm· €í;3å®ô0¾GÁUUeC‡ x!ÉY²(Ó٪ʯڬÀÎ˹SØpò‚µÇPúÏÿ²îºKÆ1CKseɉ V6ÏW$ûðZ!„¯¦¦&χ‘‘‘¸M~´ÝÒòMG@Üâi¡¢0û— —çgŠ èmüO•A”³f¹Ø`ÀByó…óC.¨¢W®Œôèvö“ÙÛN”7pÓ׬ãè(¯¯YÉ»ÍÊŽ^¾<Ô›2Vü£ü›ËÒT!Ñ­þç ©ëV†yãžA·ØSO=µnÝ:χãIÕŽtã× ¼Ÿ¯|ýn©ã oé‡w,`¦ÿÌßžxâ':Àvî뼡ë£ûzlܾã'o??¶ír¿5Å}|ZšŽV]ßõ“U¡Þ–¦#û¿"Ø®O¹YÀr~âÍã¢Ñ÷ÆÝ‰>V÷9Œ>Ä…¶ö3ý MÓ4ô|±>mc¹`Ö‹åG—•H{+3ˆ¦inìªõÒ7œ±<äsÍC ¿®í²ÕÎd_ŸÝ;Œïñý!cUXô±æË„ň—ï™<Í} s‚Óx0¦U¯on:~ &tYÞ|¶âÝÄxŽÎ¡Œ,÷ò|eŠûÒgTçy#ÚcÕÜÇóÈR­À&gÂuìc:BÝ*æ¶ßÿí[£,þe7ãnŠ´¡²öoóÒbßÑ^¥ ß´™Â¤ Üî7×µ'¡:m3—?ò¨Óƒé¦úf‹·X&ì­¯7À€eÀq9»Í6,yDŠAß`°À€þL“M)«ßžêÖ7·Zn`5.}v_tddddddƳ_ü`ÑäâèD÷¹# Ó47r‰´ãDÙš¦i¿œ¿¹páÜDÝ´…fÚ‰aœœ#ׯv¥,”IA_o°Pš†^at(èQ$´66ÀÒ\¯qXÀGÕkì´PŽ¿šÏêí~">1äån ; tV|Ú¢D¡­ÃdóË„}õuz‹«´ÑâY­(‘MS×Ü똡¥ÓØK‘¡Ð\×äzÎB›Ë¶÷P£Íˆ °hô½mš…­!„n!Ó¹‹F??¢Ùpþû'”îŒþ”™ÆÍ~]{ˆ ejh²Iƒ7Kô ‹ P64õFÅ/Ut—•íûØÎf?L±rQ¨H eŸý½Ž'Z´*Ûu«"4]!+«(ü¸€ S,å `uY}ÍÇÊšÓ~ºêºÇ Ý÷ÙÙû<ÿPÑds•¾óQ9Fµe¿÷ÖÚŸ?+ùè…U³ý ÇØÓA #IMeòó«ó–ˆúŠòõ±Åzï·ˆÐÔ¥ñGÊ ?®¶_XúÒ˜¡_7åÏRdv9²ïc;W$_šJ Xâfï>[YÑÔm6O$[º4jÈ=^¬­§¾¨é°°¢3#ùà³tioűÂíl¶¸"yöR1×5¹w˜bYbEÅÁO”À¶[©X&ö M_6¿²ìà'5À¶0qÅÝ1~ÂèHþáCûš¸ÂÄw2ÀYŠTÃáâO5~|.—ëÇÅ/‚#„Ð- Ì}ÇÏPÑYsfŸøæËf[L×ÑþÞ%¿ÙÙ{Åf"¦þ|Ud8tþuOËìæ-}þpÍ?q/-ôè#¸ü¯ƒšã—'ð™BÃTKóù?Wu™)š´á æü|®¯µQûe§Ý|ä«ÿó&fgͽ?ÈròKÍ À–þ|Ùt žó¯Ë‘êêê'E÷ïß?YªŠ&»ººº5kÖ¸jµZç|ÐQýÁ;ö”¨/x{Iç-ùÙæÍÄù÷7ìyúéÕÞ³V¾¶ëµ‘còãÇ{Î !„ºZ­¶««Ëó™‘wq!ÛÎÿîýóŸG 5õ¿ûZüÒºІʚmÄ[Ö†Kªñ`í¿"俞ËÕ•×þóÒb_ÎÀ¥÷öèç>0oÑà0êüášØs^ZÈ¿ré£=ÿm޹ãµÅ¾0`³xsùp¥ó£O 1ÈS¦ôÛûÕÙÅ)¿xкò¯þá-ûß…PçË¿ú;fËb_üÑÒñkjjJLLÄ‹„®Ãà`•i)¾½ÿÑ·‡¿Êùé{¥?ez„Bè{y§j®7,.œˆ”„U6×™C–À+P"@ÖN >áòÞgúæ…ÑzCô瞃È)‹ªH\À€)Â%aœ¿9Òÿ•®Ï‹õç-@mî¥8f:eÊRuMÖËlÍï·‚¤h2¨Ÿ è× :B7ÐB¡ hàòÑ&ò2Ô?{€´3Æ3}KòØ®or®@ xéÔ‹G4—Å_Ûb– ¯öÏlÇý'7âå[æò9`9²çÃÈ;ø±ÙÑKç="ñÂ]¡ïÉø”#„B? ssëyAÄ«MÙvö·‡.ÌcrîÜÿüïy¾xKðÐHMðBèh,d/‡ê«3 ´Õîèà /OuÑÓ¼øXh/ ø‰¯?Ÿhk¿oz00Ч»âˆi:B·’ç"„BLc­90^&t=æMO€†#í‘KÇ(À žžàÝ©Kš<<³³ds‹·}ê#`{ù9¤šŸ²pê{G¾ú½À‡G°Å|G¦çΖOýâHͯ½}–Ê’wß—š?~p6?aqLx î—ë†_EhLþ$ŠBý°Æó%ÑësYÿŸõÜýP\þNäÄ0‰¿$ZW‡¿CˆB!ô]кò¯þzŽ_8ÓùD3ù:öh"„B}g^áYIÿ—…ÛaBîÜ!„Ba@G!„Bïâ‚B!4i|×o…¢É{ÐB!„š@{еZ-n„B!„&J@ˆˆøî³Ójµ7e>·n†ß§I]ù!Ü_?ž-¦ÕjCCCqÞfZ[[ñF?†Ó×Õ^¶]¬*QvØhš///¶01gI8ïjÅì]_> —Þ1•c¢t„B!4‰q§gÜ{?Ø»jÿ]A¦Ü›*ÂÄ!„BM<Ö‹_Ÿøº¹—ðÎIM‰rl_WlîΔ@‘m÷°µÕVÕ·÷ÛišæƦ¤FNSÍ¿•œEËî˜ÊvtµëŸÿ, Ûl¶¯¾úêòåËv»}ØKl6{êÔ©‰‰‰\.· B!„ЄŽç-'k. Þs§ˆkm9^r¢NxOª°£î¤^|Ï!\kËñ’Vðà c3–%qÀzñxY]sè‘Â9³Ùÿ5ÍM±í¦ÿê!l‘ÓùÐëêêX,VJJʨ¯j4šºººÔÔTÜ‚!„B˜½·¥Û'2QÄÞôèàzåE³sÑäºÐýœÒ1iû7'Î_ê·@¿¥Ÿk±Gòasü¾T_´Š‚.©/ùDÏÅê?d@ïììLKK£išÅb1 3ìßY³fèýýýýýý6›m¬­VëxÀ—,_Ÿ›$$å®_.q·t^lVvvV’”4¨Ëw¿¼­¤¼ÎºK?(»îB/<5Ë![ŽoÏWgÙŽí…µ:2"5;77+YÆ3©ëu– \aNpFvVVVF’Øqù—”‘•••ü}g ^lVnnvª„0ë”»Š'ÕqÚQ–_i¼…&f¦)V(Òfñ¬Ï¿_ØLâqvM]]]¸žð¿K÷›ÐßÔd²€õâÙvNpÓ…t»Þl{wKG?Ømvö¿)l{×Åæ^× g®hŽÔö͉oúƒçãèæïÅ`:Ã0C:H’$É‘}çî)ŠVdÔù€06u‘¥¬¨Ö ‚„E©±|†±8&$(r3„Ë“v½ð¾ÊPüiâ§äükÏÐ㡱èƒÊ¤g¤Ž§a˜îÓ»Þ,P›¬‚ðä5Ö& 9–úíϼ¯aL ¡k4Z qRîr‰®´¼Ö`&$‹6=¹.ÖHÓé¢üƒUÀÇd¯Û#» ÉyŒÊ R—çe]OÚš>~îM¥U²vû‹þ¦²—_Øod½ðz¿êåö IL„U£1Q„8iýS’…mYÁþrµÎdàI’ÖnÚ,Ķ|3 Û_ýiðd©YÙ©R>¬í1Yø ÃŒØëƒë¹’?W*UFŠ'Y´áÉu±þ=ê¢üªF£€Ê2Ö<š'÷°hJvï-m4Z ÐÝ€Û¼ðJ©I˜ýÊ+¹ÁäéíÏ|¨#žùÃ&0®Ú9]PZk0€ <ÕÑÆÝ´$#7€Ôî­¯5š²¬5ySÕï6ˆ˜Çß|JÎ'5»Ÿ{»Ö¾~û3‚§ßVQ<™L ×­ ˆYóä&…”s‡ÃX- ·æÀªÜþ„Â}û©ª ÿÐi‰ ’äµO®—û£æž½8ÿÄOL‡Á­N^þêPÁ¡ß^¦x¢9мõwоÍÿ¿¿¶òâýõ£³: ÞøSM//þ¡Çg•¼ÿ-Pÿ}ÿÿˆrû›Åö /laŽb:çÞ·¯ê°v˜,Lèå‚ß¾Sc¾æµg .W¾ñZQ‡ßâg›+ê(|í­ê^ÞÌxÑå3z7=í¡yÑ‚ÙQ¹gϸ÷Þ{nô”;ô•QR†”C¶+‡µœå¦·wj€Rï|b#ˆ×¼þªÂ}¦u¾­HRSùj¥Føèó²ƒÛG;xÍecœÆÑ¤9áwWo}>ßÀKzîÍ  ÙõôÛ**üñ·Ÿ—óG{/&Ô%Eåjƒ™BžºþÉu±œÑÎf`ª/Ì߯Ԙ¬O›ûÔ¦ ž¶¬  ´Þ`¦x‚ðÔ ÏäÉnZç oFÊ|Ó‰ÿ.²p„sαBSÚOœ<ò6›ããã8{‡Í >Vsä?S¦pÙœ)>îvöTYä”óMÓgãðóï= Õv¯þïMÀUÈ•ŠÒ©ÚIù¸?¢æ%¬I2ì?fØ¿»j­Ç½=ùÁ1²‰0Õ*#Uï—ÜUñæÙ­êw4¼ðxãú%û•W–_uZÊ ’¬åÂÚƒJCmÁ¡,ùzåÎ7÷ë€'ËZ“$4kjÕ: éÑÐÍ×&I@g°ªò_&xb™, {mýÚ‹/¾Sy&ÿÃü°Ž¯{!pñƇæ…ö 'þTÖÓ.Ÿå'öe¤¹÷2a<ñuΙλV¬V[¬¬.ûúbõþšÅ¿½SüãJçóæÍkkkûüóÏÇ™ÑÇóÆ7²!½(SîÞròuÙUo—A’ýx®L<Ê¥‘át½Ð_( ¾FwΈÓxž±'Ï ¿çªgcÏ7³ÁðñÎR#²×Æ ÚÕJ]»Õ2êÙ,Û°ûýrH²].“F¥³X,ÚC;÷×Zy kO˜Û5j#IÜxCaOMº7wÈÙmúwN¿cèD\ÑK– ? NŸ¿túhg¢Žv20:‡Ÿÿà=è7Ò=<Ö“ž]Ìà ãŠú=UÌ8zDGWá=,R½uLw°pL‘Ô—W—¶›,æËŽ˜`cŽ£€ìž5«dæÀúÚ}FÞì{VeG˜¡¾ö Ñjê¾Òr¬Þ šƒ;ßtµD}K3û;wsŒQy^xJªchK`ŒÁ\ñì õÜ޾ÈU«²¥¤X¥ü‹ÎÚiaºÛ«tDÌC×Èù‹²VÝÌË%ìPò80ëéßðþýïcõÝe«Õ¨Qî[Ýþìsá#w©ñÒGWMÓõ/þÓhi¿bëT6€¡üý7ËólWw^!”€dÍÆ‡2ü-õµUfö?¤ÀÐFÑ}®J&eþÛJ×ü4¶¬@Îè݆®Â¼˜{xš:]ééhTS X´t6Ï5_aJJR?†©>ö—óFU[÷lÕø‡1Z¸ñà›/tl‘E7. d®¨ËT€YU°SåzwÓµÛ˜pG#OILB ®LU~Y§6hô£N,Ç„Ciuy•¹Çj°tZ˜Eaá<8œÀ°˜˜˜Îq€Ò”‘ááYÒ=‰£Žñð|ÌÃYúÓÔ3ï*/*"+DèO|Ó ßúË;® rQßCGÌXù‹û ÛþÙôõ·@DÞÿË•3Ø4H#ý ¬ƒð”EEq†,†¦z«ÿòZ5øÉòË¥Alš¤;ž¦i×ôŽ¿QêÊ•‹/³Ï|ý¯‹ñÊMÿXÂÝ'Ÿ|âHçâÈèàúO¹0äÝ…¥!Ùbˆ-‡àøÍ@©‘ÌŽ‰‰á ™»ó}(áÉíË8Ð^tµƒwøiÏØ“è„¿õÏ64øí8y#h/zÁÀKyäÑU€EYõÛ£žÍ‚  UE‡ôRIxÒÒEÂÄãX­ªCEæpIxÌ¢{OÒ?4{×7G5Yüæ, Ãáç·Y@š9‡åu˹* @„'ˆ‰qt×ÿ¼ð•?K¬}¯ÎÙCÆ0L[Éþð/#–¾fU,yrÏ?­Î…0îų ÎàÂÉ —üê‰E®ÂÞ„CcŒÊ Rî¹ß½$†49úÕHr”|îü“ Ü—!Î!«žãoùùšlW·û¥Ü¿1å~Ò¤Ú÷Ö_NšÍ:ƒE2r Ù]lž³•Ùœƒ7þÏ=bçsžqŒ;&x„Çß=3Š´ ¾±¿hsœý³g œ1²1®ÿ]´aKSuG ÿÞ³ßJxÉ’p‚aHç2€aÆF:æM\×á0f ð¢|ßq#˜{HÆ]q¬|ö‘W—1GÈcÌží±Q@3êÄÝÕo¾ñ÷f§ÜÏR^㾿Ÿ4Í] Ã0˜õ«g9GÊkÏë uºÆ:¥öWÛå# »¶²÷Œ»½»¾ŸrMç¨üÔEKuW!ühšÚu8RVË•:€àší`Ö¶Ÿ¨{WŠê?=ÖÖ^ÒÉ«@Úlƒ<º#¸{ùƒ~ cAA;;¸3º¯¯ïužr=Ž/€åÎQÒ¨-G6ò„<ô¼®¾öÁëyÇ“÷ä9á_qDÇ;4xœ4G¾ÒÜÆ8õ 8ŸeŽ=©ÑΫNžWÔ1ÿ÷ôʧXzLÕlÐ5ÖéëjÛý»µÒ q9Ξ:÷Î{çb‹¹Ýº©ñdª GuLÉKL‰á9&0×–uÂåóuuÍV fßÿ“¹ÿŸ½·kºúÿÿŸ±íµÛ€ p Á8åB‡\«3 õ#P %’foÍwh¥d ~û)š‰oSú¨ä^„úN,?!j,E@d„ "8t‚À6.6ÆöÚ¿?† 8” MôÜoÞjgç<Ïó\=^Ï×yL”a ÏÔ-ò})¥†ñ‚+ïµ€)s$ÃTy­­Ó¸÷ ½¶óv4¢m›©P(Ë9q†>Å®‘Ü–*gÅÆ¸™ òø‡.cÓ=‘B3è¼)ó‘u/ÿ¾a˜?²¯W.]tW_Üß8´ïçYÞÌÎ*á5³ˆÏ"†£¦Ï`¾n+?ñmú~{îHQZUÕÃxÎö®øcMð‰_õ¼&2xžŒì™ð§3Œ`OHª„¥2¿Ï>åa·êÄg~¹H¥)>˜ðM‡™@{љ߆’Ü{¬§BÝÕ×îÕÝúåÄ¥`¿á¤ö;׊î ÿð³·YEл*oC•ˆÃ§L–sêþ½vN°ß°GK HKòóÛÚ‹N‰ˆ£‚†ÓÿÌp觇›r\ƒ&º¥_®(ÝŸüó°/Þæ¹oUÜ;óÓoĉ#Ií÷n]«"F|±€Þ ¼W”Ÿ_u';·€áÉcsì$þ,XÒ¦ ûa¦x•Tùð:Û”UùE%ÊáÃM/>~SÞòÓÜ8q ç>ô¼î@¨µ«««‹â2gËUÝ­hãçB)¹ÖréÔYêDš¶©²äºêÍe95žÚ•^£¥¼îÍ®/ºý{Ó¿˜ëdÚE¤´õW¯–u±ÙN#ÝÜè.dóºg˜'µ}û¾kÕé»NÙ|îD¡™¨šò³/mꋚúŠ;0zoí ¸¸xàKÏ;d{~æOCf¸y·éHøí´ýFz‘NÐÖä—Àðá£F2IýÍåO¼=§q$ЇЄO'Êh ½u6ób­öÚm÷O¬Åo¿ãÉÈΑ:4lŠ›©ôF˜óá‡AFg³[ûOH¸~A³xPu&圔JMù¡ý—è~¼`ωí‡ åšþ&/Ä+.Ð „§l3"Yö”µgŸ€\xê°ÔÖÝu”!Aç­Üs·ˆ4{WþÿD¾åÙ_ÀºŸ × =L="#GÝ8pK ÐÕE´ ïX±ððž;£ÜL‰Z#ËYýLGÍ_½vìÿ®O€é0ÿ±">‹ºÑEvØ”pßÒWî_I?cïÊ4è|<0øè‡Œ)ÿ^ ÇŽe—ž;V`:l|8…ˆñ3™¯i£‚|Gå––^É)"3>ü­ˆ)ú`˜‘&0ª¥ˆöá±ÿ&;UpãܱR0eŒ ²%t1‚νõ¿é¥¹Çöß5òá- š{Ÿ“"—ž:ußu8 @Û{-ïêêbLùt%KÏ.ÍI¿DÇ/È”Øï“q=ûÃ÷MΩ#b zü;­çÍ,ù­ì£WäZ"cÔ›‘ y´.  |8<©‡3}~rgów¹uç¶ïþÿ/ŽÕKÿ¿ÒÜôùDš½Ç[4⃛÷…§Ë:ÁÔ~|ØÂ0{"ÉÞHbÓaSƒnÉ­HßsãÆ2¸§««ËÔù->'E Î=œRàúïXSÙéSrµ`:ÌõÍð÷û¹òï/‚®×ëõz²ÛìÙ¯W½­…®.½ž<òOçQ>/¼öëÉk@±q{Ó²£øÈÞÜ ò,x‡]ßµ5EX´÷ÈÈÕ‹¼‡ó§½^uûÚɃå³WÇøÑú”ÐÕÕ¥×S¹ï|8£ñ»¬†‚½©vŸ~Ê»ž&l*:mǵ¢¨ºººôz}Whúà ˆW%‚>wîÜþ¾z‚úéâ+9âîq@ Œ5Ò‘ˆ4{#=8oþϨªÓ·„ÇR®qæ~;‘ntŒÀoÏiÍØCiÂg¼>ê^ú­Šs'îê¾uÙet-¦Žð‹ý7ñpz®aî4µò%ÒÜŒÍf¦¶tåog_Ñ‘1*è­ù¾´N%éÞ¹c¥94{ðÈpZÛ_e^3´¾P(twwïù…@ 0œwnôg"‘¨««‹Ïç÷ùüÞ½{ÇDû=ÃçÉ6þäeo/Í#ë¶]‘Ó¿\i¸ã¢¹•²jG™–ó¯oVz˜ý3“æü '{ØôÜÚz7D¼@´¶¶¢)ñÒOø÷îÝc0¨_bª««y<^¿t77·7n\½zõñX@°°°pssèôA½ÆÒèÔ^ÿÊ¿ å¶üiöÄ‡ÑØµþËÿ»3êGm@ÍŠ@½ñŠÓ¯@§ÓéîîîZ­ñ#Ê•JE4_LÝ?Nú®w-‰Îõýèy{Œ19þ»Éÿˆï_‘"h#¨· ^*N"‘žz  t4þÑ|<6D-GuHê-/gÅt¹? êD"èt`Îòðóàéåºö;UR&w$½OêŽêóÙ´êN ¿·§9ÿ{¢º–?~-€Ààqè¼ôg&Ð_œ:µò²šzË@!˜âÏgEÀ‹²Õ¬™Ü`®“‹oVœèæNÓf;=ÔßZ¹, uŸç(Ð%É ä8Xù<» Ÿ'CÚøWÔ^¯ŽÇ”J%j>Ô!¨·¼Ü`LG&©VÚ¡¨Ë¿\.Åuz½žÂò ôq4‡Î†?. k•`b¢'Xºó}(e¥M¹ü¯å$¦×$»ÇU¸®õV­†5á1}Ž7þq±@,’9Ö¢×Ñð†¢‹%•N¯×“cüü¬@Zx&Ÿ4qæ8+‚Aê_RùÌò¡ˆó/—Ët&&zÀü§Žc¢Ð{_ni;òïg×ÚxgPòyv>O†´ñ¯ ¨½^¡¶FzËоž¸³Qܤ3cN Ëkª£):ªs.ëX“,ëËj)¼Óì0®#`/›º §©ým_´¢ì'ÙöùZ× ,¨¥O˜5Íë¬ÉͪšáÚ`̤™ÞtÖå^ŠÙÓœ˜£G7¥þ¶ôf-p&2AZX.wšÆ5ƒ¨k>.Ð@ CòÖ…Ÿ«K{^ Ç@×Q/¼X%Õ€N¥© X–6¤RáåBG{ËÞÞöé{`pÉÍ&’ß²ˆÖµ×IMض˜Ú»²(ù†U’ÒË·šT:P)U˜RçdJ猦+¯ë´µi*o¢¸zX,KMÉåÜv{{–½Ú¹Ž:@ ÄKɃ=èEtKùårÜãÍ™Ž¦ “žÉ×ét渙³œ%’ºav©Í¤™Þ´'æÙYWÑHqò2®¡ }_uˆ JZ¦;Ñ Ð^ñ«ÀðŒ©©ýh›²²ÚF•Xn9ÆÁLGNše+•HëÊ/•Ütž2Ò5˜  @¼ÄèUzs:é‰ @×ÑÞI Û:rÇñÆXjd­8L ×hŒçÐQ{«•Îu¤?®ÍéöL½¤¶]ºÖšF•á’×Ìiæ]KX®ëNŒÙŽvÀK/—ªX£ ;Ùñöv9ÓÞÉ•Çs É%*j«nP@ â%†Àãnyñò…:…`B¢QT¥Ëdš“ƒ)£  ût9…Á›dßk«y{uus ÛXx›`Çó“\.È>O¡$ èÖ¥ÂìóæædNya'XqÌoUÛ2< ª“Wæ×*õ÷@ôˆ(è@ /Ÿ· šÒ÷Có‘A3û<kõØ'˜­wp˜·ÑLé3g÷["f;nÊÌ>Ÿ™ÚûÛIÛÙ(Ñ0\œÌN`Ž›2µè@ ˆç®¥4çRµ’6z"m4ÿë½KW–ÿÑÚ"Óéún"–VV.cÆ¿f2£êu÷…ÅGŠ[ëÚÕZ¢}|€û\O+ò=@ Ä+ÁÊcZ˜òÃÀè÷!ћ׋M^??¿ÀÇðóó3yíµ›×‹V„þ^ùý»íj’™)Ze{áù+?ÞÑüE{µ’]ə˓zý[qèv(Å®ò{Ú¿í­âJáÝû&eímÁÕ_)«&yQä¦jÔÕÛfÌ^+ÄŸþuurØûÉ•ø_ªœìô{s ¥È'O—)þÄOÕÕYGÆþ¤ƒ¢$=³°ùA¿—)ÄþÙo¹ýWòÏVí‰àÂs"ŽÕ<|[öÝœ°]"õ_¯Îßh¾!IMêÇÁ‚ùÿƪ:sׂ¿ãÌgeðûü ³V ƒ—¥ìô{=<0%6«¹ÿ´â̵ïÍ œÅŸ0{AìI‘¼{”‰Ž&DN™8;òчÆ|(¿úYo¿÷¨ëa@‰mÜÈÕ•C™+~Èù&­¸´@%IÚž[ªzqÌSæ:—Zûb?§•¦îÊ´ÿRS{5~¿Hú|,éIËÙðÃÿ-?t·ý™Ò¦Ÿ­;úUÑ' EËÎÕoÓ‰‘RDü#ôAo‘Iýüüºººººº^{íµ>ÿ5jT^^Þ¯†ûx®ppà˜¨ì-,Tko‰•š‘%ˆNd- U$¤)Þûx¨î¼¾ÍyPf"ŕ»Dú÷G'ݨ­GRþÆ=²ÓЬŸŸc«ã’ߟà„¹Sú yõ‰”<Ö>‹ÜW|=®ìc#twvè ZÚo¹ƒW5ijÄ1zwvô­—·qÁ÷N,2H²bR…·%äÙ/˜½ÕY'q¯É¬G‹d|>cв5÷ùîø–€ÜpĬ‚>ù®>ññòµ½Å8╇ׄ˜Ÿ~²–åÆ.]›âyh¥ÖŸ±×WŸÚ=Ãz`v=-±ñ¢ùB÷BÓñ³&ÍgThLeÌYó£XšúâçŸU Uò‚ÿ—¯½ ˜èA_.»žr}÷¦€oœ©>ÈýˆE wvvâø“"}*Õ§:°ÑJë±tip·¸hj¯&œ³Zñ¡3½öêÚSj޾½C#S“}xtÙÍV™VÝN´yï]/7 €¶%7³ì|ƒZ@wàFÏè©Å5·²ÊDjµøÀ¹“DzØ»¾ãuµÇ³ªDmz ‡ó¼>ò±"µÕ9u³¢C§Õã¾< óȵN™îJÂÝÙ{Å›Oߺ#ËÝ”°-»ZTYO_^»pká]ìý‡W»c ¿–¿ãt™È,†\æ¸ãøžñu]!<öõ¦Ÿo(p sXÅ£‚ºbÛ{qYRÀ0Nðêo—úXȯ¥Äo=-”á4CŽ;à•û6g¶Ô`ŸÎ9ˆ9FnÜMÍMJLùý>Žã0"xõÖE^4YaRâ¶sµ¸Ç™ž1;–c›w‰kßš‹Q=Vˆ÷ypVjÍÑ­'îÞÇ?~?—fõÆÆÑҸȃ³AìœÍ˜Ï™DÚ!§°p+Qv…LÞ"cÎÞ°#Ò ¿–¶~Çé*p`LþxÚ@cbHöÛ×½ÊõªÏÜüõñrÀÁÜë_q«CAœ¹9þp‰p58†$lô®Ú³Ó ¸(ýÛ¯(R¨ãÇl\d ²Œå ~ÿäÖ €,cù‚sïŸÜ1ÄÎIvc—få×:Æmvë–ª ¶Þ~"Òä×¾~g‡óî}Qœ—zªQW§m+õZñ©#kÆÖÝoTîZðÅ‹e#^™ù|ã´máÉÂfþ kuÅæw¶:îÞÅ~ðzǾ((*Onþúx‰ÇìxƒùЬoÐÃvà ¶á¢ÝÁ‹KM“và’ü"|ürk`øÌóÀ7]•€“ã3óaMêû NÎ:t:Ò±¿¢Ùs’’¤Çý;¹`xÅÄ}îÔk «ÏüèŸcR›ªÆ#‡KΓFåÝ9ø$L± æ~½’È`Í÷¼»K=>~ÆÀvÕKÒ6_÷Ürz‡MqcÓÒ¯€¸á„CZD| €"w}bc;<©êê´÷boôZ¾º9þŒãÆ}[xT…p×Gñ[Jð¡9Dí>¼Âš  (Y¿hó±YÇb¹ë~³‹;tyC]“öÞ§70—E«C›¹ßšÇIúòüýí§'0%/]›Ì?4O|Îjõ©­^dÀë+jh 篖¦½“s*Á«w$Ûq^lDz¼bã¾.(=ƒs[½hŠ’¸÷W íÝý©#Y–µpQJ~Èv>þÛú7‚7ÛÊœ^øé¶<Ï Ǽoô,W~ms¼Àk뾯84 VÍߑ럀mÚW3g×Ép€LT†S{WmpDÛÝý w«\ƒ3g^¶kísäç k\”ºü³øìC{‚ûÍAzŸµfãÉ,L]|€Ê{?K+›³Ú“å.17æeŸúeÙ»²hïÿoÀ‹|gËÿDgŽU{׉ß%3ÂûéEêŠäOc«weòPŸýÑ;™O˹£ðÓÙÁP9"VÄFñàùµ´ßÁë+ pE•c>ø •)ªj€þî)á·7¿5kPY<þ⯖=9”n,1ƒ7w1͉O-ú‘‘½Çíäå‡BXT2@}æGïí* ÞÔ÷ê…äóÉÖL–¹©zõ»W³¡&uÑg)Õ3]Ÿ¹B×9îñ!P_¾å¿%ÅÎA®µÅÇeì¥ }™DTxy[N£óÛVu¯Î:ÜbäÒ_¦±•SÛ¡62aÝÛT3Pœ=þuÛ¯¿TÈxA<©¤Žº]ªÚ£!;üë£ Ãt’#‡JŽß±ýÏÙþ@Uq+ÈBw¯ðn§óxWбzYsÃG #*û;§öùr-]+=òCɹFv¸-ÁÖßÝ 33åâç«9c†õ´PÛvúÀ}ú þrhbѨµížþßð,H’]* ü‡‹ú™Qoº™ƒ¦±ü›S7Ç/ôö(¼Í~oÁ¦9@‘{(÷¤Èa¹3ÛJnµjKÕ&òÒ¦ö±l™HAmeF,==¬¹•™ÛÿbýL(¼Å Îõ Ì„¼Š·ºVQ’‚`6èˆC 6š{…W¶]j O›ãåö,GÑÜÒÞt[²i;Óž& :©³]ZõqG]cñ¶k˜*ÕýXÓ^_Ö¢€¬Ü Ã--T@s0mÏ)NÕ²\l]™f ûS0e72k?Ht£•JÃ@ÞwáÏZEüèI²•ÜïR…‹7¨üÅ<*Py³Þ ~ñ›÷qÇ%çoË.•Hq\Þ¢ðïÀÕ-YBFÄ@¦ËPV’yS"Ý·ê½}jpd8s´£úä¶/¾ šìéà ð¢üù˜‡3 ¨ 6ƒA3ll ²˜˜BªumV~­HœðÑA\ޱ¤Oß–‹³ ïV߈_~@£s‰‚ä?¬æ‡Ä¯Å|ž§ß ƒÁßÞøð!Ô €—} –âãc}¬s™Ã:(ɃûÛdEåΚÁcõr=Ù)jžÕG?\U|ëu°ÖkEãe™Qj’-8X 0bî¡‹(¹”ïï}Ìz‘MWWœÈÇ‚¾sÀ ŠtJ>˜' ŸÃê§+–`ü þ šõ)Š’1cfPÔdlýwìVçÓ >´§ÝmXž(z3á¨ð§º4m–ÜlŒ  –änþôë/œŽfüÉÄT÷(÷Ýyddo7Ó¶m-¬º¯Àq‰ÂJ¦èS_šƒ3ªÝ0*ÓÁ™ À`›ãù²>Áøg‚©‡³…°GŒ7¯­©hפ2åÞCM­óN­–dl¥ P=l ê\zíâúóífìÿo@d°©ýŸÚ›J•̹c¨$ SLöL$ m3Œ6A„T±F²¦ /ÿoq›¯ç¯"?ÊŠšÒ㩼¥• IDATçöÞÓq¸÷†¹6`jkÉ ÉÖœH·£Ó€HNÖ‹ÕÚvÉéó÷Ä24rµ­á¹ªGÉ «ø¸‹³ƒ­ÇH h¥©?ä+ì§½ñ¥CS©Òj®§ È$ƒµíµ÷î¶kNÏÉÐwjéíZÖCÔ‹ Ë~¬m—©AÓ®¥«5@¤Ž·ÕžoTz´7ÑýÝ9×îT´Yµ7]ÈýYøÈÃZÅŸX¬‰KõÀËv\q£¶}kòšI\ÞÈ­¿ÌŽD’ñÒ t­B˜uå`e'˜Ù¼îdûC¯=L}B&…?Ù†‡OìmÞ[ðp›;°ƒ6Ø5–Õ6Ý*.>™Ç^±`ôŸÛ«ƒã€=1|öw¦,#amºÓ껂ؘäèÇÿ.3HzŠ€ÀÍÝVlÝÎïeÖ†Ó»JòKo³7oÛåµãðêÃ6*ô½Á°×£wìcÌi_Ùµ©sÏØaôŽcþW ‹K Æn;¸èÐàçÔ•ýØ8`±ÞŒtK9|úw§Óêà-¼—gǼcÌ>AÌcª=}W.wÑ!wìE¶\!ü9Wz>ž›xŽwü&žeg¬Yq*6Ðç"ë¾0¦:òg9oÞ]#‡' tùµ”剅cþw¥aÓFåRñªN!éNTòÊê®úÌñ¦ÆWÈÔÁŒ¿ž¸ÿ¢ûÙë:'ùãï$ÿJÜ’èÊP_[ûÖ®»éy·¸V@0Ìî¶>¾_òzHk­ÔÈJ¡êìùk¦ç¤ž=—>è5¯?„§¯}DF°!½ªØ\-f8½g$¹ÿ³£ÇÕÏ£øN}è¸ûCúá!¾_:SIm·¿Ik},%Åãí©_ÖJnÝ‘ž¿yÒÁ7a3ziHô£ÕD„Çv¢ê€h;zE”½<^qø|þÛœ–†ç˜Ã­_~; @îb*»ÙtEIò}‹5¬©ê´¨tVatÂ,Øb=¨˜€‰½¹}‚ï×çj²ËšK]n?\ßÓ¦n…›^†xÝŬüF@¯×€‰‰ É{sLÝo%¶Sƒ¹=Ï7ÔI ÏÒø3]éÏÅ´ÎÆªZ×Ît¹g³alƒeK€…· þ þvuuÇ«Ž½í4ûKï5õu'D?¾ d ™³Ÿ1ûÍ×)$þ숈ˆˆÙSFšKK°3Ñï¹I®SÕUUÕ©t€Ø<òì‹P‹ÌÊííuÝ‚ÜùÏÔ—ä6ÃwfVÉŽÝZ"ÙÂw³×‘œDæLòδ³—ÉVs¢üçÌu?žU´¾P¦ ö»o±ˆ²;{³Š;D$]ùãGQ€4šëZ\¼6Ù„á<áËÌ'Ô1çÅq±‰ "Ì4*ÇÙWøÍظ¨pùÒàdŒ5Öûá– ™ðxÊÉYAá®–CÚ„Õù_Ç¿‚`®a[ã‚h!}±ã£sJì ¾_»42ÅŠÊd`r`ÌŸëüqlȪóßþotâWõ‰›Ãf+€æ„ßÏŠO\+Å©dŒ1vÑê`½£CŽ­}kv2Óû«ãYìa½ñ÷éø¹!4‡7¾Ý±x ÍÀ˜±5A¶~ÇGS¶âÓ3jëã4Z¯rWì^´íë/ælÃ0†{ðjž'.<¼v}œ‚LÅ0‡7Vǹ‘1èUµg%}1÷E>ØúõüÙÛÔ€qø«¿ foQ4;áßag¨4+Gjÿ»„äá6'€!èˆæ3^ê)¿ñÃ>oùW½þ“œ^ŸV%‘HaÕ;EÎlÜþOo~i.:Q6,bõÃCõŠôTlÎýëÓ1¿}½h•б‡uk\kþê—W}’æÎÊ4ûðo ÷±mËC¶¢´üí?}áæòþW‘‰_¿3{3Õ}îWk Ï\ñ!./=ñEâ×RÌÑî–u¨ ®>ñýaÉŠà¨> c4qïÙ3VtQ#öv²gLŒÃÚßÏ¢YQ™TÙƒ C?Î1ºdÔf}¿¸sÞ`?› ºâÜñ §•êN‚ÕÌo7 ÀX沈kÇŸûdgŸñ®O])žÅ}ŠCn楄B¢©¹Àˆ¶sfØì:sv¹Ö„aÇ$>Z}õ÷.æ&du¶kÉ®½ÃºÆfžô“B›7þRü˜12Ì¥ð¿rLÍI¦æz-<~!¥—]/Ù›Ù d‘l93dxß*ÑvΛ6?œúm™ljN’j ç¥!ÊÔ,Á—j 08£? diÔ.óÔå„kd…DzxùanãL®±¡€íWò½{.–f²ðo6Á_Áå¿¿|ïÑÊGZŒôcù'|¶¤û²|_ŠéXZq1[ÒÚ¡¦ÇÄ@®A×Z~©ÆŸéjÞ^¹\¦31Ñæà?u“Ð#$þt©%‡Ò$‘«4Žßf­°\"ïË1'¹Z:ëþ¸ü‡X®0aŽö÷sebº–?~½ÔÊdT*•JeÂò™4Ž©ª.+•ºËÙM˜¹“ŸŸ¥{(ïÉk]]]  GºŒïùŹ3ÿõñyÒ¹B………oÎz·Ï‡­w,mG¢}ƒžáódÀÆË¯®}g·ãî}‹9=?•~oiáŠÃýâ‚øÇÚk°”ë¦E_c ‡V:aÈcCÍr\®ÀhTP¿ûhÛ°-?Fþ¹kAuÅæ·¶2úùgƒxß‚å²Õ=5ô+5„UW]¾5ß}Ìâ?‹J£¡HšÆŠoN©ç/ôâô"S^I»xŃÿ¬‹Šhê‹7žg®è}ŠÎ`M"Ea|Þšî‹Ðú†€ÄQTߪŸ3OìèZŠÎ4~aþ†‹>]cîiÜij°Ú+²/HÐMaš£¥ª´Zê4މuÖUH€H'@»Q=N!è[5ÈÛW c†aèn@ ÄKŒN^]˜_«ÔPlÜ™æ‘ SG?éåËg~Ö˜£}l ýDÃéö\ËêËgN“Ì8“XÈíO¡ß‡Dÿè!Ñ—ÆøWÔ^¯ŽÇP[£‰@½eèN_yH1t1<$j‚@ @¼8 Ž@ @ Ž@ @ Œñè!Ñ×4­ƒ’ã`åóì2|ž iã_AP{½:Cm:$õäÄèVVV?»–––AÉçÙeø<ÒÆ¿‚ özu<†ÚuHê-CwúBÍ÷*€¶¸ @ H #@ c‘ @ ^ðº‹Yù8€^¯“÷昺ßJl§sÍ{¤ÕI ÏÒø3]éÈoH #@ ž ˜ý¤°еhüÂüm ºÆºÇÓ,ÇLô31GNC@ ñ€K+.fKZ;TÀô˜ȵ"èZË/Òø3]ÍÛ«ó/—Ët&&zÀü§Žcü¨½ôWAo–AçwTe_Œ™1ÉžÐR]xµ¢I¥ 1Fûùs­º–Ò‹5:½^ob9ÊßÏ•‰^wþôæöô޳÷ t¥P+ Ž@ 0 S¶bþÁ!Lh¯È¾P"áL± —uÒòr¹ÓÔ0®9èp]OM5Úì\y]§­£©®¥ªJeãÃÂtÒ¢‚jsŸ™þLàEÙ—Kmf޳¢ öÀxcQváMû™tЫT¬©ÓFš"ÿš@Çq¼¸¸X&“étº>_+++‡aØ€ Q)ë›Û„ç‹ßÕ›ñOްÆã@ žljIs[&AÜ®‡@cYjJ.ç¶;ØÛ³ìí¬zŹMíÇ0ÊÊj;:nÖg"“ k¯©—w˜fvÍèôzK•@'+¿Z.éЀFÙAëÐLèNöHÿú=ÅE(€ŸŸ_àcøùù½öÚk†¡©èʪ}EÇïêÇdmó6dÌO¾UÿàÊïnföüõ¿î¿§ë'½üb®¸^kx£¼°;;Y¬Rm¤®ÌH;û ¶jaÜô¨ôúʖ挨€¨ôæWf|¨…qÓÃSÅß–%NMªTÿõ¦L ý;¿ŠÔ —„‡†‡‡††F'ž­WˆÓWFMçx{óÃW¦UÊ_ sÅ©¡ÞÞ˃hSsz”÷#øK2ž0~Œ{F^™¶2”ÏçðC{»K]–Þ³CÉó–ô(* êQ×5€÷-ån>#¨.îÎX¸='n¯°Haáúä´Œ(6¨Åi £ã¼ÔéÖ“s 1€MVW¦-Y›±ŒóbØ[™‘Žó&Û•ÍkæO·´l©þ;Îî À6æueJìAXyBÀ·n¬|/6…wb¥ ê3VƦ«ÈózçÀ]w:-t€¦?=±±R^ÜæëS¿ˆIK†÷»H˜80zðJ£r×rTC}éZ˜MŠœW±-X2}æÏ‘64Ëëάʾ.•K¥Öó¶îˆv'C}ú²…;ËÔLÞ²ÄÄp¦`}R•B±2l:™Ê[—ºŽ ÏK]™þ{~•”Ƌٱ#Ú¥÷º/¯LÛ´þ`^½ÈLÞ⤤p»Êôõq)y 5`.¡+7®ä[ƒ\°dzð\ÔÒf©¸1I‰¡Ôìèˆôð©¡ÖÐ|vÙ{GƒLå7¤Æ%­R€Z¹DoÝÍÎ_š:/#•OƒfAR|RF™˜v4©ÂÿÀé8¼Gí¤À]œ”Î!¿¤#Gý¸W›3¢#‹Ï&š3¢#²ŸÝ€ –Lß9"œ-ÌȿˉÿÞÝÐFy+#’Ü÷¤Gs@.Œ‹Häv¿y'~¹¸Al™JÀF&›Ê2‡Ç¥”ÊÕä£Q³arâ2—MÑG󛧇Z¨Ë"8{Ò£Ù^ïL怼2-aýA¡XM¶cªhkΦN§ †Æ<ÓŸ‡óâü­ÀÚ?Ї'æ7¬tá;4)-¸2)"v N H?‘aèÆJyZó=6‰õž¢êÓ£"Ò˜<šT*—JɼyÁX~v•\.•sïÜú¬g Uú­%‡Ú¡Ð*º|ßO¼i ¾úy¦eBÌëÍ'.îk@£U·©™_Äûb¿ôù$ÀYt5þD£’h@áíõÙ4ks#EˆBcýÌ{-=~“¨-N”fÜSk,8ܘ·9lmú­%æj«BÛÖªá=Âú^½H¡iS‘'FúE'õ_ MÅyáþëí-Õf~ä8oKå…äœ K¦…¢S©PÁpÎ$bs~³V©Ð±ƒ|?ó£a k*)ùÏùÆf-,mçFxM²†»Y9ÅÔÐÙ¡Ò´QX‹£=<)}Kê¸ùx}5¢\áž‚v¥V§¡PC#¦«ŠcŽ)­¡U¥iӚ͈˜:œ­·7î­iMHZ°à¸ÄD¾>‚¨¼°û÷‹,&®¯PX};¦"5ïl3ˆz•5w¾×$K€ªâ|ñž¢–6 YS4mÖ’ç3k~¹°ÇÚÿÛ €NôË…=Tÿo§ÑZE¥ßgJêµ:–ä:Í÷sïA€wÚîÄ篓› ‚ؽlÆ­Éûrß´úÈ—W êäÕ…ùµJ=ÅÆ=ÙW]›;Œ¢•”ÐG³ ;” ¶<þ¸Â‚K§Ë@3ö¸@¦½½§ºðÂùjsŒ@173Qâ tF£V?éV¼F£ùí¶pvõ+¸š!"kJÈ¡ó-*®w_æÙñþó¶™9@‡H¸*S4Õy¬ëÛî®Û«Þˆ™ìOåÐ+ÁvÕÇ<¶¶nKrE†„õ>ë9_çaœ¨­;y4¹0.tÙïËÒöÄqÈÍÑÉùá{ø4æä5'BØ42@}zTÔ¶üà=Ó×­<!Xy:‰GµÔr'jÇÊ$šxgÔÂmùá{ø=f&yÞ¦å±u? ¬A^)(ÃÔeI±)°òGßZ]™ºpI|Ɖ=¡d`ŽÙºÌ…õéÑQ›²ý÷ðó’“ŽŠC—q >û`ÕØ˜Dëæì婸²Œ³|¨ë˪0rÏE66AÈßsv Y.LˆJè[;ï ]’r=$‘7ÔºúnrD@J÷c8Ž3ç€Q¯ö«P¥ vq;Ïîd“Õ•Iûh¼Å“ñå©eóÜÉÍy)BNôŠ—T[O_·î÷…K¦ü>vòXhà$ìà÷ZF僿oÝ r§®:ú;øïàr˜á줣¿×‡†³ûIX–´ü y;5ÔgDE¤?-gEþò)Ð8þóV&Dó %yF-¯R`Lêƒð,ST=邯Z° hv¼àeëVòŸJ7–˜É‹Ž¡q™Š7o¾Ç'1~ß“ýcöD¹›Ï. ÛTµ.-- âÔð%)U!‰îϼ3œø~‘ÃIÐz{Ýî’‚ÑýD ]#¦lm[ÆÞ+¥Þ^žDôý€3&aõK"€¢vKry÷䩯c<¤ÞK¦âDIgü–H TùG.¸ÎŠ $» ¿UR‡èêçÇ$¼ƒ>´&´ý¾ê|ch´}‡ßµ^îo¶_ãgCÔ5ä&d5ºFRÀŒãd…)j×m¿.z{râX3h®ø"õfµ÷×Öª-YêOµ„¦¢+ñǪœc¸ÖÂù6QS”zþx‰³§ŸY_]öx}¡n®~îgÁÞÀ[[jˆPéÓ#ÇyR¡õzÁª_D¼W6•½øã6T€üÂîÜ#7âÇhµÍ*«Ï?òp¦t#"§EZ’tw³r¶œoñ‹°Ö\/ùÏuê矸RtwÏçl”ôãm[V¦Äâí)ñhå¢fÒ ôŒÂûW ê\zÀLÈ«x«k5P )r`å6»Ç[Û °à¯™>!3 £Õ'ÌðbÜ´qOš+Zë”4'Û‡r‰@wòvêÈvÜ´‡o| ÿ³Ÿa¤ö ôÞp‹|³UNJͼR¡âáeC«äxf­¨Y£M›ÊÖÈ5‘äìÅfSÀʃª©xþ×x›Ç¥iÇdR¹vd ±™d¹T@EYê¶õù•õroP0¥F®‘Èì`>Ïš À àÐòëåV?µ8[ˆ…ì ° ¹ð@œ*Äy þÖ@v ™ÇNÍ®’‡º`Öîl›Çg¦äßU‡òãËS…‹×PSʃ·òhܱ´¤¤Ø„²É<^?€ ð`»isY†˜ó!2Fc2±‡_<¨0Ý™r¡1"£òˆ˜ÔÑmuYbX@ƒÐˆW¹ýä@u åõÞ Dv‰žÇŒJÉ—oåd󞦣†âáïŒøàDú2fÙуâÉ;NGÓ„é))é)…¼•ô©º2uY\epRjí…0]}ýh>ÆßÁ!yò<ʨBW‹3„XðVÃ(cÒžòлuÈËád2€\œ‘½2›‘ô”÷òÌŸyb°ãr™  ®lZË=Úÿ–~ÓÜãÝt»¡ßæ{|ë“„Æqá&>;“ãÂ`ÚÑÔùÒç1c­I–6ÞTQi³Î¯wèéZæÕ Öî½ÍŒ¢j»t¾$_¢TjõmjG•$Ÿí¹Ó `²dJ¤Q½®U\)îJŠŠ4Z0S–ìÊ"€9ÕÔ‚BaI3K2¨ÔJeÑi0g'|Æs|`ÏÝ"iCsçv‹ oªÔˆ$öp:S eË €J7S5wh¡UÜØÆâúYÀfìÈç«D î3–•5Ll¬IÊf5¤ÒÔìíwõ@ámgþx}­©Î”–#Ç„"g¦«³½' ðf Q-ØTK޽u«¸^l¢F”[–"nkR¦Mk¡ÒÉ®~ÎTƒÊÓ·‰*”Hï*t êl³Öh@'*i±ðóp¥ÁÂ’ý t"Ù™¥;û‹pÿX[WŽ Ï™2(=ãRýEð²WÜ(€-Aßš¼f—·rë/Erç½¢:±£úbN©ãú ?g„úÀ°íúG4‚o…A˃uAüŸ#·GDønMÃZoÇímé1? qüÃ5 =¼"sK65,Þ¹#ÑÝZ-\–ôèã+Í@¢\}/„O†]æE3£R3yØïÌè.dp;q¢,?_($G%¥'žHâ=ÌòSJ'¿Ì‡õôçU| °ƒ?pOIIpÓÕ!;y´—Æ1œeéEËuÛ¼” uHZ› ìe;¹xèÂÔ²^@.ܹ,.ß=)uå‹Ry¹0M m€%Ó3W9{ IDATà¸<[mg¬YqïÞ¬30AØ”Æá‡»lJËáI½¯gÈ4.¯zð|£BŠS¹4òÊ꾊÷÷§Å•IÕ¡Öƒ”ø‰Fh{š›žw‹kõ­Ú¾«@SÑÕ‰ýªìÌ"Ï8Rœ?zª·m-¡ípòUÖØíëÆ>Ê¢OЧ{éÑÑtbĤ^7lUÊK1@óð5I `ã=ùˆ·ñ©Û.È7±W´[ùg—6ÍãZ@ $ïèYGz4´‘ú­?Œ™"ºÙX!–Ù[qöí)ŸQ{ÖWD t¢Ìü­Î«æw¦Bű ‡W}"áFaáü ÏY¤Žë—>/=hdT•ô ¥Q¼#§mK*DÍ—2+Žp|ÿóö œg&öæö ¾_Ÿ«É.k.ue¸ýp}O›ºzlzy1wšâ„äòóçyô¹qÅžÅ'ïé@)®J9ñGƽÁØC´Šœ?Á¿çÔ êT-xÐ*iiÓvOvf ¹«'·ÈÔLwkuCewøœŒÑ AúÄ£äeé©éer2'x¬<;-Onô …Ív|&<šß êÊÌ£õœC„—ËÕÍy©™8/”Cvðbwá¦õ±ÑÁl€æ2AÆå‡G¯LXÉ'‹ÅA qy´ÊŒ¼fW «¤¯Ú¸1êU2“õb)@sUYÃS´º5?š_ŸŸÍŒžÇyyÅäФ¿çÎni‹åv\6ÔõqQ U¡;¬|q.Mä£B»˜y@ äålõ—¦gT™ÆÁeõrP7T‰åd;Ž\Q©P7—å×w·´º2#5-ï±#Zä•yy†ßÉ+3VÒxîÌî1»3MÐ'µQÏØù`ÂôüfhÎObþvýU¢>OPÙ¬u½ 5_Íå³É g¤¦ž«”øÑdÒOk>c“XÎé§gSSÏ>»£ªôJ-@«HT µò롘qÉõÿ`n¤ëb?Ÿhµõ*²ëX¦%@ÑÞðä°=—¢…ßpÍ¥óµ†C]:$ E’¿¼’FxÑ›s+ŠZuŠ–¢›O?HÇ’ck!¹#lÕ蚮߹Kµu¥äÆX}ÍE÷Àq,'4„÷¡3¡ÉP­Z£¨àn3ËaEßѪ³Ír¦@«¸Ûj¤²…,Y,€¦ážZ@b¦4—HêµZyEw—%˜QIÊæÎÐ*D͆͵ʊ› 3ŽÃÔiã>™F×HÊÁèþvuuÇ«Ž½í4ûKï5õu'D?¾ d!½ˆxÎ<ºòžäRùm×!-(‡zŽkèðg¿¶9wì•É9fT¢9U¯*‘9Ç›¼qoÖo«ùy½ØÍAæ­\ÆY¹$4“Ƥ1iRÃÂO Xzpe?‰˜¶Îh˜I*LMN燻Óh Iáq‰üõ@êØÅIIá˶~÷“0NpÂÖPk9.NYš,•«™îÑ[»Z/œ‡UÙEûw¯»Ò¼¤Ø„*5™F¦rçÅ…sÄ݆º,N á½³ãú38¯Ö¸!»ñ*ðb³c†¦SiÖÀS:ä±á|¦@¾øåÙÞb¤Ž.1[—­_¿$,£Nó_“´˜ ÎNÉnhÀ’N1DW™Á{N$¸ÿ³{¡šóŽ–±£Ö<ìÇ4Þ<ž|Szåâ¸e“³×G„S©d6»[mZO_·ò÷e •Ësp3I^u49…Ë è†Vä§,•—¿lÇJw2ÈËR’Ò™;÷¶¢Á¨g\'΋‹‹à'Ðܣמ¹¬O_¶,µª¡A Ë#ò¸Ñ;w†³ÕráÑØ¸8)Ž6Â?zgB ÔUiÉ) +B¢ûèl£‰{N&ý”Òðäæ3:‰õë£WâÌädàÎ{FWé'÷fQé€bÁó¤<ŒL« ~¹SÓA<¾7û8éó?òÒôýÄoÎ4«-Gr¾ ’Ì($¥Ÿ´ºö\z&½í7ç—’[+4$ŠÅÄkï¿ZK¯ «šKöïÎN"Å5h¼<íI*kîç3J’÷fÑÉÒv~$— pwQ0cõU ³Š¿oÖ™QfÖÑ@šÖÚ-ÛÅJ-˜YÛé` `6ÃÅæXîgEd 3v%c9zÌ%%ñÛEf¢%¥[ÁÛxŸ#º¿±ÈtW–(&Àöí‘Z²j;ÉŒB¶é¾é¡k*)ùÏ %PH$ŠÕœ‡A9ìÁå¿¿|ïÑÊGZŒôcù'|¶¤û¾ì§¸ ^@^ëêê¡PÈãñz~qüøqŸ'ü²°°pîܹ}>¼}ûö믿>ˆö z†Ï“×x¹`IèÑy=»%¬ŒHáH‹b?=µ\M¦‘ >}É’¼Ò’†ú>çÜ^ê²Äˆ8òÖ+]ÈÈcCÍrµ\N¦Ñ@.LŒJbïLû“gð¨Ë˜{ÒŸÇù„âáˤ ÿø%Ð?Õ¬ª‹»s+B¦t³Ø}ÄÊDo  \|õó,fÂÇ¯Û ÆõS‡–`NUþ‘‹Y£ƒÖ{›ý‰_k¶l¿3ý³Oâ_œ %WâóÖ^5“ ‰¾,¿ªŸ3 Ôñ^bª««y<^¿½˜Á`ˆD"ggg£ßŠD"Ô?^>ê3R®s'°”6;ná&¡Ã0šKèÊ4ä¾?G³ 9›æBF®z¨«vF/Ël #3y‹Wþi™Ý ¨âDïà<—Ž&’Ã_uÞ?'.Þ¥ÒçDò¼Ñ‘ä/8ªÆ”äâRˆ$kg×Ͻ®Î•]ÍjV7¨¨ÓÿFù>,ß”©û $ùù y0Ñ~Ò„a^ê/.ýFÐ%IYYYKK‹^ß÷ðr`iiéáá1lذ\’vDdÈ0¤Aíõêx µ5êÔ[†îô…"¤/7O {{{kµÆÿf.@ R©È‰@ ÄàÒ¯@Ç0 Ã0ä @ âyb‚\€@ @ Ž@ @ @G @ @G @ äÑC¢---ƒ’ã`åóì2|ž iã_AP{½:Cm:$õäÄè]¤Aù[¹-ƒ”ϳËð¹ÿ¡lü«8]£öze<†ÚuHê-Cuúz±Ìé,ß“pè6ØÌø2vÊ_8Ÿ½³d{ÂѰ™ýe¬_ÿ?×Ô¤møþšŠêûéê9lÒ+&Ð@ CMÍ7|/T=RzVžü9³ý.l;kr>™s­ADŠ•£Ų̂0Ó¡ã‚Î’ä„£µF¾°{gígÞCãOŸ£=è@ /D;7O7®EÛR+üùPnã€ÕmyÚžŒk  ÚØÙÙÐ@ÞPUÕÔ9´êN³u°±±±±±¢ÞS¬lllllìØ´!˜Ft@ ˆ— ;þ»Q^¦ò’íŽ6€¼F®â•íßd4€Ã¼µ1^4yÁö ??zÛ¦©²^ @á}²ú]G€FÖ¨êþ^^™sò×Ü  Øñ¢–¼ëÒý3mË“É9Wj@å†.ZÄ&@guÎ3 ɉV¯ûÎŽ s¡€¦±è§C?_kÒRl<ùcýÉzMã¯II‚à~¸a‘ ©³rOÂþÛ`5ãËÕSú½å•¿þ7£ ªI@±qãÏ~wŠS¯ø¾©Ó»1±²œÍßdµ€•߇±3m@–»ýËýF=àT¾}ÃÏ `ãhSuåF‹–hã9{Á;Þ¶¤÷L@t@ ˆ—ÁÓîÛ÷sPÆø±IÀð r€ÚÜJ9È+‹àõ —^ò—DeÓ@%LÛŸv:§ ¼F [ 45'¿ßŸu£AA±ãzºq­TòGâºåJÆ5•• @Q•ñ_¡ @Ó˜³'%ëFƒÊÎÓ×—Kk¹}yÿ÷§ë5 ©ÿuÿOך´@up¤ÕŸ4ýÉzijN~¿_PÕ<_ÞëĦY){reûíS=Ðtåp}yDmÓµŸöÿZ¯ù[Å!Ž@ x„¶áƵU * :¾nEÚ˜)\"@mn¹ :«…µDnPßÍå ^ÔlO+"´Ü¾v9ëçCß³vsZ‘ @s;GØïÄ~¶(êƒEŸ­Žé¹ûõy±±1Ÿ.ð¤@Se‹FÓ”›Û¯ÏŽ 9óÝwxT€¡ FÙTt­ìf³hɧKx”¾†?ysG··w£Bg†þÿíÝ}\WÞ?üo 3$ä’ £4Š ”bUn¼¤öÒ>ØÕ­u·Ú_Ýõeû²ºµê¶ÚUV[ëÝúsK¯jwm]­Z«W•Þ²(•RÅÁHI‘&Á<@˜Iðþ#ÚŠ¢â³âçý‡/™Ìœ™œdf>sræÌ³“5¾D Oóݪ”ëÕ€|Ôô©“'>÷ÒÔ¾Dd-;ÔÜzK«»èâÐÓ„ÿnéœx‘ýÄÎþùƒa×? û.,Ò¤j…†²ÆÂãõÒõD¾}“û^Ñ[ƒ Nœº0q’¥¾¶¶¦¬pY£µlOΈ¸'íV7ÉÕ]Ýe)ׄJ‰x‘Ä—ˆÈí&²[DDµ_¾¿üË‹s¹š¬ímV ƒC¥DÄÈûÊ©¤±ë+Œ.§º¼›á:þùª¥¿Nt4Û»Y+שa¨”!"_©\HärYí·¸º;ÐÏwp'*~l±Z<Ïe/ ‚@¹¼¿vè#>l7VÑZ²¯lݹ36·›È×_£™’¢’a׸“¤}åôƒƒìµV~t0ÃD¤ÆIÊ~h>°{¯ÃM¾“#®Èçmõ¥µ¾ýµ¡Š­"BÜ|â%.—ÝåJå¾Ôè¶Ö×Û)Xzež¼R™ˆio³´:>Ò¦;wð&7Ùm^¿®øùø‘Ÿdèȸ)q䘘õë^ú‹}ÑçoªÙöš5OÍ·¬Ø¶\wÝ+GéWùÜã ½º½š³¹z6FNf‚ŽS7Œ+Y1ù•ï8–!"’†'d¼0gÖ(ÕUjÒ²ç•ç·flÝœÁæÏþ³I[ÿ5J‚´~í‰Å¥ÿb5ܰùùˆûy¯ÜøÂôXÞÛönêíúô,»§=¿Æpñ/IìÂ/W§_mÿ­Ë^²xSiÃÁ±¿ðÖÛ“£¥Dä¨þbõ’OÊI’^X~a"w,kæbzëËÙÑ~7YÛ——põu]zêbžÓù+Zh°88RhR_~ïÕôPö¾øD]?|¾[»¸·8`üSCcÅwve­ÕÅKöÉæÍÒö¹©§yãá¥ûäóþ­|8îs»ÿUT7zÜÜh¾ðŸ•ãÆÍ q\œÒ퓼Óôï¯+ëœmM~ÚåÓ½‰¦ÀsžºC¦â¢ÆBòšœÐ{D€ ò­ÑÆüí[Ž“½þ¸‘ˆ(¨CDÄ„&'Ëȱ›‰„Ú.ÚÏy{EÎçù_P$—’½±ÙED!Ú#­“ÿÁZûåêÊúSS½;ùÏÿgØÕ¾íLPrrÐ9ÍÆü%:µÄm·ž®­u§¾úšnXœ¼¨ÈjÜõéöƈ¶²¢Kb¸<4Ä—¬nãžÏ·§e]t¦ïhäøÃBi\„Ðmm®¯©M^Ø¿»õrÍp•üχ־Â&ƒ‘ˆäq‰AþA·¸ºÛЭsbbâùóçÏŸ?ÿÈ#\öo¿~ý<ؽ5ˆÇ=5jJ¸\æKDŽ}ëó÷ØÈÖÞqk[-;uÌDµ+Ö|udoxêD…àA>,ù©çåìêæÉ^ÿÅ6Ç ´„^,Á]Á>úÇv<Aä¨+Úò÷Õ387¬MSu5§âÉsŸ$"r Ö:Õ`ß…_œÞëØÖšœ\üãªã_±¤¦*n[±â„·½;²û,+Oþó‡oT±í5;^™»ä³a[çDp'6-ùŒæ|¹+¹—¥pþì%ŸÄ}þºš%SÎü¥KjM~“n¶¶»(á*ëêœé»œ‡•'ÏyoŽN%!Ká¢Ù+×T>±:î~9H‰†NHù}èÝ8GøG'­‰Æ.Ógö€‰³þË›¯˜ÒýMõû©*þôÑûof öC-^ÜA>äÓA–Ÿ>ùéã¿\-Ix /y—5 ƒ4ºñ“’/Ó‚ãRCrv5 ûè¢!˜‘jSG41Ô66{k ÒèÆ?—¬ ¢ˆÉþ£hçžCÇ e$ Ñ]sÐB&xôŸ_¦í{ eEF"_aP„61BJŒbü'9>ßSf,)thFŒýp1‰3ýŸ|6®ù˲æÚ²z͈Q!EE]t~a"&ÿyºh×ÞC†’¢Z"_IPß8]Ð\_£BRÇWì/soPÜ“ÓLJ2D·¼ºÛÐÛÚÚ8Ž»V»„ËÕ½U#£„ä4}•ýs“ÍVi#ß ¨)ZÿÛs4 é#66œ#Ô®ÝRUçñaÜ$ ×ÌxªoßÖÂÏ ~V1ÆÓÕNùôq>967oiõIøÝ¸ß‡vœ,8ºí„Íí&M~*>6 µðŸùû”Rgk›ÓMáçf„Ýö®8–¿/]“[ã ‰ÂÏÁ=Nd/Zò‡ÕúŸÙ'þ¹iá`–ìeŸ,^»û˜‰üT »%bm§fõú/Vïøù ÷Ê …Rù+Ö>cXú§u•‘"~΢·žV³dÑ¿Ÿ¹fŸ‘kç8eÜœµKÓÙKV½ìÕuö>XF¹¾³î ‰ã8ê¼0sá¥Q¤½fݳóK#Õ¬Ùá0[%ã½ûzœ¤½rÍ´E9fb‰ØÈ´…ïÍNèÅ•.za%Œþ9¿Ð øã»#ý¿ù""‡©Ñ9ð­­=)1å~øÎºr q3uÅ¢gú³Žüù“W² ZLf§…Ô3V/šÙõIÜôբ뽵EŸ½´„m}3†%âNdM_àxëËW¹eS–˜ã¢&‡Ýê™´|íóÑ~Dö²-‹×n9f!bU©³ß}ûf²—$rÔË«YÓÄÕŸ”¤¾¥ã çÏ^Yì –H3uÅ¢©ƒ%Ž‹ ç¿~\[žyõøœMËS%Ddúâ•?•¼ðùj4«ß¿¸ÙßÒÈ·æ¨×üa§þljz/¢öÊ•Ï®ŽøøÓ©¡ÿ¿öÓ©‘ä8±så;ÛJë86DÁ5Šçå¬}â¶<ù"tTz¨÷¢=<^#ÙbvrD¦â#Üй ½ˆH‘ð»Xîï‡M¤Ž UúêŸ8‘5}ÁM¯¬‹®².ªßøÂô>ßý|ÄÕæé—ì½*°;,6úñÞwl®tÑ”%1Ñdq˜­ŽÈIËß{>úÒ_¢¼‡M Ûh±˜­ŠÇ§ÄÛóõ?;f8ï½·ÒnßµÙªË×8Ýà$™L`kš7+¾/Ź€ÈeÞ÷uéþfžˆ‰Œ1Eéï2½ÿqEo­¤®¢¹I1xùôÞg ~Ü\nµ£ðãíŠaËŸ¦_›ÀÏ]yJº¢™ÒbÜ–c¨>×Á“o]üÌù¥/^¶I1¶£K³}fÍŠôõ¶4ëméOü>\`«.ßxàŒÅM¼¯dÄØ!£˜_äÿ_£$ŒZÛÚÝ6¿ÞÓž‹xÙÏÕ.SÖ†Êè©£Ç)ˆÈs2ûÛÍâ„¥£®(JH.k~N龺6·ŸŸ´½]”>îõ>u9ùYUíäK$ 7lJ´\¦÷?>æ.²ãÛÚ;ÂFŽ˜'¹"õ¹Nü¸¹ü\›»ÃW¡šüÔPØZ˜}lc;O$ ×ÌH´·oë…†óð_—úuJ{—ggÞòó¶lÃ1 Ob?_§Ï¸?ŒN ¸ùïÆ9OÝââ7‰ÈçâøÉ¡Å yóàŸŽý—ÌçÁiGg"ž[¶ê¹kÌ Ð ¢=ÍBmr—5D‰“_¼J iÿñ/ößyšöÿ¬Zõ[ëôÄ¿®šø[QêÑ/¾6º‹èž8u~âÔ‹Nœ|ɶÅOÿÛ+¿1uÙª©¿Í¥ÿ’v|7êB1záªÑ7R¾!‰SÇžzÙìÝ]Ý] è<Ï···_cIž¿‘;XÛ­Çjš-DD> ±ynËÆ{ÌÕ5Çœ’ñÁò 6ýQ¥X@ä(ü¼pguøÜDn·Å%Ÿ5up¤X@DôDÄŸÜW°Ù9`b¨ÀVud›%töF(}=æ’¢5š¢ÿ[BD¢pÍ칿Ûüïõ¥ûšTOßÖvÓWKWþ÷îîµ¥ŽãŸýIG-ß¾å™ÅõDDŽÂe™….Úº6NÒ^³eÚüãøÝüg¾ZìXñé¼þ,q!s?ÏPIüˆNgÏœ–¥O[lÞµnŸ|á׫ãýˆ;]Y/%ò~ˆœE¿rÁºö—>Xªj¯|gÍ‘ø7½ÜŸ%{ýqó•™UeÌ_ž¦"{ÙÊgW’ñé¼þáS?Þ4¯—„ÈQºì¥•['l£"â,’‰+6-”ÑôÑ/‘iÏ¢?팗¦àN|ºä3ż͛JÉQòÞÌw²“7O–þÌêÌx)Õ¯{áµO*Ó3»nfS<~Ý·ÆF¿8I1m“~Nf²ÔQúY¾dò{ý¨”ˆUŽ[ø?£TdÙ=í¥uŤrßÎ_š£Éܺ6FB–ãùÆ›ÿü¤1OhŸ3‘."~Þ‡;C,‘%wÑô•ùOlθ"yG¤¿¨ÞòY¾)5CÕ^³ã gòŠác:çjW>5a ITºÔ—ßš|ÿ6¥sÕ[RRft¤|bhÖŽïLéO«®r8«\÷ê6vaVvª‚NçÎ|6ûz%;õ¯NJcI9ü™yó§êºñ-°—mùŽâß g‰s¬òâ"ë¨q´ù݉ھ꺺)/KÕŠkÎCÄÿûKÚyFñøü2®¬:–œôÖÛÃd)œ;û/F~>#⊽þ•åOF°§wNj—ãã7èܱ÷ž_¼«>í¥ÛÕ-ê\íúœ–ØÉc^eZ¥+²‰ˆlUG¯8Èër)†¿=Eéï2oÛtxsè˜Y}ˆ<¼= jöœJ_j­úaà ñÌ™Iý„ž_ òÿïeʼn¯<%uŽîs»ÿ÷”,=ei(C®¦o*ÍúëUÄ›´8C=ÂWŸoägD1|Ó©£:3D@çj×tŒŸ:n ˜ø¦ŠU_W ýÃ`""?Õ”§ííË—oËÛS=P×¹EL46òØæ²s©£Ws¾Ñ/uj@—E¹óì£o¼&£Ö>Ï/$"'%½îïOÔzêèŠý5£"µ}ˆˆ|‚†ÍRSÅÒí•uÚáý:‡ ÛO?n¨Ïž™)ôØŒÍg|ù“9¥GÇ.þï†\%_}¿­ª÷ÜA×û)ä²³³Â±÷+-ºäåqÆÙõ/Ã-~;ôg~ð¦óê "ÖÇï/º…FG=2J ìGd{Í¡#eeùÍDòÄÔæ!<'=(5p·FqQÄ,}=†\Ö}[ŠöÔÕdíS®úïà›¯wÛþÏÿ¿"òñU(SŸ1BLäv×ém6Ú,íÄÛܲvžˆÈׯŸ®7_Úê‹VŸæÖ¼rØP¸vÖÒN"6$ÖÛ«U1Hî(qpDìM¿5iêTͦ-¹¦äÇË· Ÿ:/‚ˆ#b:µŠˆHñ(ëhtݘcèýÌŠ ‘bàmê¹à¨ËݸòàñÓVÎaq°ê.mR¤NIøÇÇ»ëÒ¦žÞô­tÒGƒ{~Ǥúu/MÿÌHDôè”Ïw¼!þna.ëGÔn*\ùê; Ô[ÿu;›Co§öÊÅlò‡á,±ÉÏ«×}vÐôôä.:W—[ʦ.Oòî#rÉu>UEú?³'ú±DŽú=«ÿ4uôî¥ ×nno¯Ù27³zÜÒFJˆ¸¹€¼Sµ-œ1uðuçb¾¹)ÿM‹~Ù«¯­ìýùÛq—YƒÂÞ}p\oK¶Ñ1#¢Ó ¬"B£b‰H®ÈãU«T+¸JK;EÜž[hlÆ_šêQ¡ ùû1Œ/OÄÿrå¹À-8ÚÈ }:Пˆ„©ÑÌÚ*߇H ¬ô%"O]…U:tp?! d ]>’ó§$·mãú⣭DDacŸx#üô1«ƒr +‰ˆ¨ÍMŒë׆«®6É7xÔP¿wš[£” úfÑÐQ}|Éfüåg¿sÛ=DDmn™ÍM2"Qp Â—ˆ| ¦ÍÒÎS¹m߆_:ˆÈ·Ï°åST‘ ½é«š†Ç†*êNÕ)¢¦í§+ŠrÙŽòú´wDFôë=~6Óîý¿ÔYx7ñööà‹Ãløõ É¥nk››ÌËöÛˆˆüCçÍÜZqN¡‹‹ôVW¸Jæ¶þ»ÎÙÐttMï!Qk;Ñ5CÁ•gg[sy«rŠV‘ŸPtËiߟ. ¢øà!G›JˆèÝä÷|ñYtðM"*<ý}Zèó=âÍ[Kö攸HÒ7}úØà‡1Ÿ?05pçºÓ\ÒèàODB†ñ¿ÓÞÁ_gïh IDAT_¼öV_èƒþkSzÝþâíçÔ³Ÿ)¦“ÿûíÎ.?“¦êõßwŒŸª¼ø¦ƒF¼Ñ©i¡õŽW Ç{Íæ³8·W®{åCÓ¬Ìw3cíeKžÊ"o{üî¬Òâòã%¹+×důݴðQâµ¥ŽX:–«¯KÉ©ÒÿgÓÀƒõGËv,Èú$cí†9jöjÛÛNIJ–=K—|¥^¸6+9”5}ñÊŸŽu5ïÙ¢• \ñáÞF;)’æÔ¹ÜqY‹Ú-¾5"ùåaë–íú¶ñˆ)iîÝhšµ×|û³dàÕmýËâƒÉ«—nÐ)èDÖôÅW LqSÇqù$_ÑX=k¾ê!8ôEÌù4NçÙ­üT “‡IWZÚÓ÷åýÊŽ’]…æ3ôÊ”"âœçü¶nòÔ®vKŽãHÂvû]°®´%©¢W~\o§kt{Ù's3õƒ–~ôº7಄3\ÜuN¢–ø]c]·RÛÝY×uçQÄg¨¹eG,'¹Æqð­,ݹ Y‘ ‹wù¹ÀmîôrKt›˜«ž$º:%ù*gÌΘñ[k ‘_дéZšyãÕ7‰ˆD…Wkòm”Œçï};¾ÁæM »d>Ï/—ÆÜDÄÄNù¯µÞpßT¿â}uçbŽ:ú%©dD¶+‹r›]~ÿ óçõ_ê“1âh s®vÕ––+Þû…ÊRÆ¥¬ûí¿²¢„Œ”οQ·Þ`pá»ü4ošù„‰Ã–Žxg_}î±³å1ŠëúŸsí-tI§—ßu»¿ôxW«iâk«ï§ ½ãß9ÞÙ°óë゚³x}Þâòw6‘OL\ ÿí\IGë94Z)ÛÑ`ëªï«iç×?+Ç I¾ÐA飕YôUåçÝqÂADÔn*ͯ¼‘çnuû­é^H§]ï|F_¼úiRõš3;¶z{´;êK*oî `ÜéÃ[g–šýò`–³Ò˜')X"‹Áè¸êuý»)ªïV¯k9#é¡ì|~úpá GDí¦ÂÏŽpš‘ªût4!GéÖ2ÕŸ7䨕}`WvÑÎåI–ÝÙ5ä'Ž`ÇO;ˆˆk¬©·±!Ã#ìsNpDœåØÓ…OŸ«Þ³uÇAË•uúƒõ""Guö¶jiì@å…ú“/Š,—Çrß™¶º:#ób:'"R% cfëÏ‘EÿU9›4\ucµÍÕïÙº%·¾;ÿW[ץLJ.çqË¿¸êúo?+£Aîl¹çìGDöÊ_œ‰ÎPK.;ì\oÿëºzoŒ($PÔüs¥“ˆø_mm |eCƒù£e-­Däj)<ÁGunQbzGûY*LgÜDnÇIcû Ÿ’dªAóî£ÖV""ùTCó·Â»>=‰UcC»sª~ QLj‰ˆd᡽›ªö]DDîÖºª&[·ÏECDÕÊö:{ gº.ÊW£àË«l<ÎzÒ»yí­m¾²Á}$ ‘­¹ÅÖÝÞªLŸKÉ©:7QkSS]»lh¯ÿþ—3¦˜Ê›nü±/2eù#OD­Mgnù螺 Άm†­ÿ­žôư7O;vT_¾{Th2Ü]w¼«FDš0:í67‰dÊ¡I'ÞÞ•ô­Q~]´´ÌO*d˜®öÒ3úcE¶vѾïï#"Ÿ~é)3 ›m)Û¶ißf"øE' ¹ó—+lôË‹ž™Ÿ9ý±B*Qp]>š–*}ÅKú¹³ÓÖ±ªAÃ~ ÀR²í“’ŸŽ‘ꉇí^<%CþÄ{«çÌ _òÊ 9R¹D)±xO¿Ü™œÅ™KÌœÄU ziašâ×^4ª'—¾kžÿÚ?”ü+£zëÒw8X)ˆ ›³"NBTÿÛ*ˆÈR¸ø¥B»ƒó âͥτe¼’¼`íÌgÄ ©DB…\qò<¸vÍQ«äçÏFDlÄ‹+>øÝKï.üp傶؉H1÷­Ônד_\·ÞQDzZïǦ¤G^£8EúŠùÕ‹3'æX?R$Í~Ws¹üçε‰ˆXix|Æüæ WÑàæ ZºäÙ—$J±BÊ©¯º|èȉ‘YŽq“>”Ã\röò 2ß1s±ISÞ}û~í…öÈŽc½ŸYøkWgIüóqŽ•ÙÕ³^MŸ3òÛw^š.‘°¡½/dÜ^© çýå[H­‹á.üä¨ÞúÏš¸‰#¯úõ™K8ˆ#V3òågô#"ÇñõY»•™3.»ÌÍÝômãvÍÜŒ5ÞVÈÔ¾\0°ÿ o=Ÿùγ“VIOyëMïï]¦Ýso1˜Lfú˳G¢_\ñîÓª®k»½fÇ?6™æ¥M½ò¢úŠØ®×ué!ˆºœ‡³WîXùáÅU¿ðî›W6Ÿs¦Ë¦oµ8Ú%Ñ‹¼÷}Z:v®su•ê½±SEpÌ´Ø6~œ½YàîG¾2"’uq.`N:ôëÒeëx"&,vèÌh†:‹ Œ:¾N¿êÃãä'ëä!?Á ’ÈW>yÊàm9G–é=D$R„>÷TØoɳ‹M"†˜~I*÷¦¡c•Z¸ѳ3Z7æä¿ÑNDE䀙ºn££#÷1záîÕ.ŠêҵǾ*~ý0‰äÊH7‘/‘"jbýö‰‘¸ÃMÝÝŸeqC§5ÝøqOD²àÉOëÒGŒÏ)]ûq¥›È×/`Äeì ç—àÉéAYßüg®ÛG¢ô½å@“¨Júgņ/NlŽ ˆJT%-=ô]ì’>B5yî²GΟ?OD%%%Qý‡^ú¾o¶'$\k\!½^?nÂå?´4 ŽºÛwÛ ¼›º½ñöÃKžý8âãO_î”2-»§ÍÖÏÛÔÁÑo«öšuÓ2iEÖœþD‡éú-Ï,¨~óÓ·t’ûôËv6÷O¿Ï}æß«ŸèÕóîîy«[ÎÙ¬TBDŽ’g®éýîîÞ^¹ò©ÕŠËwù;£îÓés- ¿\pO/¹ÒE/¬Ó}¸áiÕÝþX]?|^trlê¯Ã,ò.#yÌeÅkª£?­ºÙŸs=­n¿/¹J¾ú>?zÔëqþ=mw󭾌?¹š¶mªP<íøå~âây!ÃñM•«¾nÿýâ½]XùÓGWìWλæ8è]ªúÅßôþß{«¨ù,™ÙO2â¾:|Y­~ÉV«Õˆ³=IMMN§»êg \Q]]Ýõ˜®ÕÕÕ Tâ­§áÊ5Óå4’*mþ¼È‡±ê¿zï“bgçiLÄäW_Ù­Àí(Ù´ƒÒ>ÐÝ·½G¸êÏ6™’æ'÷Âw½'áª×½ú—l±,«Œ›±bö 1Òx°úÑ)ïÞ•]ÞRRÆNž?ða~NYÛÑo .<¨¨õè×EÛyÆ×G¤ò”êæ3µ«yó¿ŽV¶ãË("ÌÔú÷¼Šã›*Öl?m!ÆÏ/:!~ò}wÎ÷œÑ¯9êà}}D~#Ò‡Eúþö "‹ßÍ<î)Z’ðɘO™Š‹Ñca)Ã{X„äª-èÖ³gNž8f;gíè¸ü¡B@ݰ\Ù»;—¤·»Eäñ@oüCŸ×ÃScø¬ñ…|[ÜÃZÐ{¶ë´ ‹erÍ@ÛãîòU@,ÁWî?¶ÆÕÿª>£œ9>Ð{‹³©èÈGNÍ_Ódæ‹ÿaPK÷±«t–eY“xÀ˜O4œ‘J}ë~9ÙøP÷q{`ù  z·£ð˜;æ‰èÿ’ÙöÕq¨t¸—øæÆ|tIÜÿ_Ž˜m¨t¸w:êJͤ ‹ò%™ºO¤­¡ ýä‹*è!Ú-jx •.8FDÄ{Ο9æ= {<°ý¾å¶”x»Ê¹sÞMôÆ?„ðy=<5†Ï_HÀ·¥G¾/[Ý铲¾Ë¦‡y‡‚ç+ßÊnøeD´È>Xns¹\~Ÿx7=ÐÿÂçõðÔ>k|!ß–úÎ\ÇØƒ•¿>¨‰ ‹#s®©úvù냊t:ªà¾U[[‹õlÞá&Q€û::  Üç0êÀw…> Ђ€€]A€Äc;õ£¾Âh版‘†k†Dɨt¸ÚNå•z´©4r–8«¡(?¯Hž!BÕ  ÀÝæ±¬h’ÆOÐÈY""V®IŒ¯û¦ü¤5,Vf.ü橼ÓÅ;y¡&q”F. âš*•œlá‰|˜ ØÔ¤g®ÔëOZx" NL@û;:Ül@oir ƒ•—4—³*¡«Éî!‘‡s)‡ŒMS[ÍþœRSäè0j8TtR˜8nbˆˆÈÃqD\ƒ¾Ø’2!Y& ¶úÂ}‡j‚Ó4bÔ,:Üvq„JìMí2Æ`ãIåiYæ,ÿsß{ûᔿ>P»ý£å¬eï…3Ôzbóò¬še“igÖš´äƒá½ZOl^¾†ºþæ™ò²öÐsKÞëïO¼1gåÚÍÚÌYÊ‚õÛÍ/|oŒŠŒ9+—»;õºaT)ÓRòÖ¶Íþë´p†ˆxÙs ‡0Dtöàû«¶”jçjÍy» š¹™SÂ"¾•gˆZ‰ˆèÜOÛ²¶ü2|æëé}ýùÛ³M¿ñÞ˜^tq&€»Ð{=þzæãÄ¿[›µ¹ ~áU§„>#s]Fm…ÁPQš—µ8/eÉ_'ÓaÅÏŒïÅ1þþD<£ŒÓߟˆúFɲiãù¶ÃgÌ´~eCD|O}ÎñçÎT´j¦Å÷""ÿþc†)KÍ׿|¨8ø‹Ù½ùý¿1DÄó6 0·¶Ú›Uc’T …'é³§øšE˜K7gåÕž#"·ÍFµ6ŠWj5´a}–;>N;<^@DÄ·V|¶ÊÐgÒsGöbˆˆQŇ·mÎúÈ4<>N?(îN@÷b‡‘mßYqvŒª×e¯ôêß«oüÈÍû ¶4=9ò:ëô'jã‰7É´/þµÓm—gÏóÛŸþ¾d&òvkw_œÈ_ÙÑFÔ÷¹…îm=L—”Ã\³cTÑìò@?*!BLm5¹ûã'$ ˆ¸úýßÔh'Žñ4ìßý£8LætrlXB¬wa®¡ §B5&M#&"OSñ7zñcãcåhV¿ãÝÛ×ä$Þz2oWÍÅ¿::ؾDä±–•óÚ´‰Qb²–çæ”iš«u¤èp¹TcÆF‰ˆÈVNDD¬Júc±Áª"p ͤó»Ðà'ðï×¹:‘«ÙÄ+ã#Ä"’÷Óˆ §Z8ÍÕz³ûÈÔa¢Ë UjÔl~•96I\WeÔ†‹QÑw% £à¡ÕqIBï¢u\9@º¯¢¾1ÐàR%¨XÔ:Ü’[dôÆŽF:¿ ÐàÚÊaã'C=    :tè7¸ìy¢G°Á"X‹`,‚E°È½[лøa,‚E°Á"X‹`‘{¸ôÜ€Ž..6OSá®üÓÄ0"UšØxµòj##¶ÊÍ1ž˜Â]üAtŸô›jA€û‰À¿_êø!rg­Ñ Ï6&mH×ÿ…%¦*…å÷T@OÄÊÕI‰a®šcM×xdÿÞìììÝ»wï-¬±zˆˆÚå—š=¿.à1ëwgÿè}<Ö³w7yPwßo-èr¹Õpß²Z­7¸„ 0LLå-. ‘)µ)ㇱDÔÖP˜WR:V-ºbnå€~‚ü*slR°Àc®2RäcJ´¯ßÓ€=ÍÅpËT^t²Ùå!"W«‹mõ\Љd‘¤û*Ú‚ƒš+š…1±räst¸ñ¼Åä$Y œu‡J[ÔcÒÔ2Ù*÷æ·\¥ëŠ(l@бcÆ&W=P.F ÞèƒÐ#qÖšâC Bõà`–<œG –ŠDkCýê=ËÙàá\yQ¹K5@Å¢ï ´ ô žÖ“y»êï0‹ÚÑcÔr‘,2Võ½>w¿XÌ ñµFnÈ5jñÉš°~è~Ž€·HœüÌs]¾" KH »|ZTÚ¤¨Nÿ!"jk2ñŠ5ºŸ# À=æ±–ø¾¦U:à±Ht?G@€{M ;1õp¯á&Qt@@@@tt¸G<Ö#»w6yÊ5ìØ¾ûG«÷¯¶S¹;rkÚn ¨³³/.|a’Y¿{o¥ ÕŒ€Ý#E(¨¥Áæ!"ÝhRs³‹ˆˆk1:…ª êè€qÐzJBŒº*š]$;̬ZXWcæ4bÝØ"ÖŠ‰ˆÚþ¡CF qæJ½þ¤…'"aÐàÄ„(ÙoerM凚‚S´-ÚV³_½fÜèqõ9UacÒÔx°Ñm„t€ž‚UFˆ fŽÚÌM¤P…‹] -r6™=aR‘³æP‰S2qâĉFGÙKÕ·× /6…Œš0qâĉãxŽªq^(®ÃY_œ§o‰JÌ^\‡(\«°WDDκª–@m8Òùí…t€C¤VÔ·´1F—´ŸLδ4Øœ N±ZÁqæSÍ­­®‚½DDä!“çZN5·¶Ø‹r ¦ëò‘ËXœ×œ0&)¬s×68&”+6XÕ±d0¸‚T,êº$…’¾þtM( ‘2˜NMv»P¥¼²}¤Ú”ñ—öHñ4ùG&¦ ‘ .™h%b¥J»¹ÁÒvYB(c4l^•)˜Œù˜R€j¿ÍÐÅ %ôÀ©«®Â$ð&rq˜ÒUSÑ$±Ê¨@geE£w8Óln#A`”’¯«hpzˆˆ<Ôcý1;ûG«§ó¶ò½Ùz³Ž€×!`¤“¡‰óæóú—Tx£y³Ôœ¬w"~ß3 'a‚úÉL'›¹0ÖVSGá‘þ5u‚wSå!}•¹ƒÈ'0R—8$DDNCnnT%t¹8—³C9䱄°ŽS%-.NŸ»—ªt£"‰:ì5ú\S³ÓERubÊ`ö×$ßPS¡“¦‘§©ø½ø±ñ±r<¾è¡ '°Áý”6CC›ÇjhDFÊ.äeOSÉ¡“ÌôI'MÐI®o#"òð.:qôè±iI¦«¬q”N(T%¤O=D) êpµtD¦fLœ4a0Õ•/é-ê´¡œÁ`õ×PÑ,ŒQ## @g £Ô;kêê«LL¿pñ…´ç±Õ›I¥Q‰ˆˆ ÑD0-õv£ˆT²D$ðvØ]]ÄEÿPu0KD"e°³º.éû"PjÔ¬±Êì!g]•=P.Fõ# ÀåØÀ~a®c%&±&Lt½mÁ¥3\¥ß¹àbbdˆ::¿$‹ m®¨o4\ª*u€]$jù]¼6>>ì·Ä,E(Éd0µ×h¨ç#¯Þ}|<<ßÍ›DEaÚ {É¡Šì§D÷–Û7‰ô<¢M ]Ò(.Ö%FÒçìÒ ¤‘‰£"X"¾ËeUU•>g7# MHU_÷b@© et?¿}9þ<•””èt:TÀ}«¶¶V¡PÜw›e«Ü›ß›ž†.·¬¦¦F§Ó¡nŽÇ|$·Èè Œt~! ÀÍ(‡Ÿ8 õp›á&Qt@@@@t€FqèA<¶S?ê+Œvžˆi˜V§‹º…'yl§ f¥&JÖ½"lå{ \ ãðLQt "j;U”WêѦNÐÈY⬆¢ü¼?:J|³Ý^WU#Pw7 :\§m'+š¤ñ4r–ˆˆ•kãë¾9f°F ›|S©™06Œ%ò4©xØUsIDAT~S6.-Jä¬/.ª0sžŽŽ¡*~TB„˜œ†ÜÜ:iãty„ªÙêfÞnÏÛ[Á(ãS‚ùú‹ËO·vùH#Fų\ÃþÝ?ŠÃdN'dž%Äz·ƒk(È©PIÓˆ‰ÈÓTü^üØøX9B>:ÀCÐ[š\Â`¥è·)l JÈ5Ù=ÔuºP?&B$ "gͼ’UJ‘‡w’zÂØ–ˆ8ÿº†Jõ˜±,ÙÊó+hpÚÄ–<ÖòÜïKT’‰:\.Õ˜±Q""²•{ת҆þXl°ª‡È\CE³0鈈®“‹§K fžˆ<.™]& b”‘ÁlóšZœžÒ¼½¥DDÄ“Ðé¢@"™:LtÙZ•5›_eŽM×UÙµáb|èa— ]Mæ6’] Ìœ¹É% dIàCDž S=""µ¢¨‚‹7>BD³þ›bÇC|®ë}”CÆŒ»4¼s-D]Í.‹ ÝWQßhp©T,>›azJ@—÷Ó*í¥‡k¬xÍác®ZFDB)ãjrzˆˆ3""êpuøˆ¥,y̧L®®JôPï[¨ ›Ë«Ìœ7äÛÌVîÛ" ÓÙKÕPd?ŒérƒÐ‚Ðcˆ¢RR©¤¤hw9Ožg#KOf‰H ׯ_”›+ …B!CD$Pjå >ŒTØU@W§C¹»+„ ݘdmJW\üÍ®ÀCBÕàQIræêW JM(k´Ä¨ÑýüF=rþüy"*))Ñét¨€ûVmm­B¡èîÜÛ©â‚ÒÖˆ”ÔXå=ébb«Ü›ß›ž†.ÝVSS£ÓéЂÐ dQÉQ÷fÝó‘Ü"£'0v4ÒùM@@€Û|q 6~â0ÔÃMÂM¢耀€€èèp8Oص·ÜûQ"­2w×~ƒóæÊò˜õ»÷VÚP©èp³ÄQ‰ñšCåV‘Çf8Tå£MÒˆQ/ŒƒÐSˆ¢ã9EåaIÂÒ*ŸØ4o<çÌ•zýI OD Á‰ Q2×x¤ Ôäòttt0 mb’Z. §!7·NÄ8]¡:!Æ[b[Íþ}õšq£#DDÄÕäT…IS#õ# @7#úp1'?ϤïÍÑ\ƒ¾Ø’2!Y& ¶úÂ}‡j‚Ó4b¥6eü0–ˆÚ óJêBǪEDÞIê cCX"¹Ù[^¸VQqÌèŒÐˆÉYWÕ¨MD:G@€ˆèaÚ0¡™ÓFzƒ´§åTsk‹½(×àý“ˆuyHè2•lvyˆÈÕêb[=j1ÊÈ`¶sqlpL(Wl°ªcÉ`p%¨XT1:Ü"Á¥ü#Ó†È/™ä¬9TÚ¢“¦– ÈV¹7¿Å{c©@à#¸¢42FÃæU™‚ÉH‘)¨ß;ÿ¢ z.A`”’¯«hpzˆˆ¿ ЂГ±a‰)Z½>ow) <äž”¢TFƪ¾×çî‹Y#^/u‹T‚¨¨CŽîçwÅ#çÏŸ'¢’’N‡ê¸oÕÖÖ*Š{°bùÈÞ¢Ž¤ èàr‡ÕÔÔèt:´ ÀUq …¹úf*!éünA@€«bÃ’3&¡î*Ü$ €€è÷¹ÿç^ÿÆ9J¬VIEND®B`‚django-q-1.0.2/docs/_static/successful.png000066400000000000000000002277201352353655300205010ustar00rootroot00000000000000‰PNG  IHDR”#ë?ÌxsBITÛáOàtEXtSoftwareShutterc‚Ð IDATxÚìÝy@gþ?ðwÈE D@PaE±R¬Öû*¶Ú­¶«]·v­íºêZÛ¯úkÕ²=lµ‡­GE«U[µ­GETEâ‚V”C@N 9ç÷GÆzÔ¶¢Ÿ×Lò<3óÌ<™ç3Ï33,†a@!„B!äáÆ —Ë© !„B!äaÞDFFRYB!„Òy—4 ©ýàB!„ÒÙÙ.‰b ,í.b °ÀëŸöR’‡= o„B!„<",ÖØaZã8€Å‚õ%ÓòšaÀj‰€EI:K Þ!„ByD0 X,ÆÖügX¬!-`Û cý `(I§IBÁ!„B! cmê[»mÀ88Æ„»¹¶ù‚¹Q™Vdp pe©®ÕœR²Ãzwñãš.ç×Ù]½œ]Y¦Šj­ÊÔÒ…ÇØ" Û[´-s±Žùc(ÉïžäÁotïJòТóB!äÞÀ°,°FpX¶yª]£ ,À¨1™KSCS¹‰¥Ò™-Œƒ­o‡a,`{¸;ËŒªª¦z,‹õ’«–k´Z¯Åb¡u.Ã,°àn“`Q’ûJò»ô¼Q™<„:œV(..þÓ) €¶ !„Bdðff`½½ ,†±˜­“M×+ê¯6·|‰a9º8ûº±Uª’&¦%dàöí-•9àö÷î ƒüuµ§¾ÝÄ2'6hÖj ¯5”iŽÄ=)gÖjëXŽ2¥¸ :¿‰us Z"ÖƒX`,h·` $÷“ļµ¹nŽu{ =é›t vT//¯?qa8н{wÚ(„ByÁÃØnXØ:"¸!½»†KªÒë,-M"Æli¹i†Åx­L#ºÀ\Q®R˜Ì †ÑÃÍ‹c(+i¨…cÏîÎ}{ )W©dl'@¡.¨gÔ0 Ó²l—rÙX¯ÙjóiË‚’ÜOέ­[kN&“éÈ‘#gΜQ(f³Y ôéÓgâĉ"‘ˆÅbÝ_ŒGÈÃËB!„túàÍÒÚƒcíÀ± ʦF3F­3Y,,‹-B`,-qœÅbªSj›ü….æº:u©Åu•J9x~Ý¥~Ö/qø2>£°¦hª?sE£µ]¨u³‡ÈyXopo?Úõ.µ^ÛEIî'‰ýž7£Ñ¸eË–¼¼<‹ÅâããÃ0LUUUffæµk×þùÏŠÅb´ï££F0éŒÑšÅb¹›DmêÏÝÎç.“PÅ!„BȃÞ,`ÁzÇBÆzݘʯ) ›mÃñÀ8ØB6‹Åliéãa`±´\uef, c¶¾1hÎ^QkÍ,‹Ñk,f.˜ ¦f–›··gÀb¦eÐÃXïµXŒÅ¶ mŒ’ÜWέH£ÑxäÈ‘üü|©T:yòd???µµµ;wî,,,ܹsçÌ™3¹\.µAÉ㼡ýƒñ“PÅ!„Bȃe¶0`±Xhiå´t¬1ŒÅl¶­w907ƒ7Æl²LãÓUdQé+4u&§®<ç ‰¡HÃ8: |],yy }ë˜KKË%u¶»ÜÃö,iÛ\,Lëkëò´]0Jr_Iìô¼Fë­&MšÔ«W/ëtÿéÓ§§¤¤dff&%%yyy±ÙìÖÎ7jƒ’μµ¼m<·þŸ þ{´°±pñðÄ?S>I~0sl>÷rÔ¿ûùùO Þ!„òo ò0°>)ŒaZâ4†±0‹í‰b ËÁ%0 cf¬±ÃX,sóåë:Yw‡·Ä£‹:-ëÆ™¼ý]}¼$Q€Ùd¬W4ªMsK–f[7_k†ÕúÜ2ë@ƒ–Å`µ_0Jr?I:o ÃƆ†ooo___ëtN§ÓéX,V=²²²êêê<==¨ J:uðfíyküaîÄO\>>|i”Ÿ#šËÎý¸ç¢Nk±8>9Z, Ær›>>ª8„By°l×°Y¬·À``T:®±ŽºcµÞ¾Äb¹ž_ºÍ6PÈ”•YœkÀÀR”Uî)CK´–J•ñ¿FÀÚíÓò ²ÚÊmµ¶¦Œm.ÌÍX±Í\Ú$aZ^X(ÉoJb'xkmg F£R©, ›Íæp8ÎÎÎÖ&¯Ùlf³ÙÔ%:x³¾m(+Ó{̉ôå3 ¾oÿñóû Ã4—íY2oõѲfÀ¥ÏœuŸÏéãX¶}ò˜ÅÙŽü†¿ñùº¿;Ö|•¿·ÿSü´íie±;‹wõ>ºøÅÿÛ{¥±ü>ã×m]æÈèk2ÞŸõÕÞ/Öº$¬Ü¹uNGª8„Bù˜-VK3£õžó-7.¹Ùò°† ,ÛµV $%‰àaGGÇ7n”•• 6›ÍãñØl6›Í.,, ‹™›7¥6(éÜÁ›ï¸Wžúà¥èÛ‡÷ïÝ»lìÈ„þžŽhÎ{wöß•Çþ×ß§æ=ùÚW#Íñ¶6½ÀÏÅ(ÛôdÒ’£ãw>Å@ßXVÛ{í–óŸ{¸¸Ô¬ráÅñßœÿ¾csÙ©S £ô¾Ïsþs—+Ä}ûè´O¹PÅ!„BÈïÃbÙöV“­oqó²|[OZkà@I:G;Á‹Å ÊËËËÊÊŠwtttpp`³Ù‡®ªª puuíÐî¤6(éŒÁ›­“Ù}ܧك.žN;uê¢ü‡·W/\2moÚ£?^¼‚ׯþè ¹QqµÖÒ¥áÂûK^;}¥¼Q¯/¯õhÐY,°ð=½8eX #€êö^ {}jÏb±ð|b†ù 9›áû&‹qçYد7Ou½Å"¢ŠC!„ß+xkébaµ<÷™Õro ¦å¡bXÖ‡@·|‘’t’$v‚7‡øøøêêê‚‚‚òòò¾}û²X¬‚‚‚ŠŠ ëœ)x#Hð€×%4~Jhü”±XþÆàg6å½µxØê>tscó…7¦½^>o{ê†Þ.ͧÿ6xc±XŸkÙrQ›…aKÛ+Ü,Œí` `áñÑf\2UB!„Ÿïóâú/ŸóaàóïÔwÞü×_£ÞÓƒqÐØ·¿LŠY¼Øg-bw~£-k ß hö—o•ÏMŽZ«øAcßÿò/ü›3í¾jgy:Dš¿ßÃÁ) %¡$”„’PJò¨&‘H$Ôä{„±†‘Ëå=zô°s޵Ád2F£Ñhi}@`0ärù¾}û,‹Åbyî¹çbcc9ŽÉdjÍñÊ•+‘‘‘T²äaÓv?pãÆ >Ÿÿ'.ÏéÓ§Ÿ|òIÚ.„ByPnܸAÁÛ£­ã°ÉÖ®ë3¸9ZîbÂ0 ‡ÃéׯŸÙlÞ¿?€]»v 0ÀÁÁF‘Ná¶×¼=ËC!„Bȃ·¶1›õ‹Å²¡lÛÐd±X‹ÅÚ±vèСٳg›Í懡LÈݰ7lò!ZB!„Bî¼ÝÚóf‹Åâñx à 0 _¿~|>ßzÁu N¡ÃŽzöìÙ‡jy!„B¹‡àÍh4Þ1 ŸÏo{±Ð­Iär9•,yȃ7—„„ Þ!„BH' Þàð-???*Vòp¢aŠ„B!„‚7B!„B!¿ðF÷!„B!„‚7B!„BÈŸÍX¶sÅÇòæ›±€›oxü„ñÑÞ\*›Î¼Ñ°IB!„B—À+4ÌÍT[\XU.ß»E°h¤J' Þôz=•!„B!¯ø)ÉuÎû+¶WA]«6‚söýw÷WÁ÷™¥ó"D€úÌû+öÞ|{“:ÏægË›9n¡q›3›„±óq¯J]ñqn³ch|¸:ûlysð ËgõlÎÿiçOg 뚎[@dÒø§#<¸-Y{M^új‘±,uÅǹÍÂ_4Á«þ§÷ÞK¯‡oì@n¼¸Þäè5pÊŒ aÚ^ƒ·€€* B!„B:¯âââ»üfUúÎÔ\Smq·È8o.áq¾ûw•—g\VGô©/gWˆëÙ.rƒ2cã–³U€£W€»úÌÁrS‡|› ÒåîÁÁw±lÏû[Îj·€PwuaañÙí«¹‹f†ÝqáÊO‡Ç /<•[uv˽Gá[‡àM¥RQYB!„ò80UäVY_:º¹q@6,xï–ÂòŒ|eÿð2y9À Žë)h»œ©àÿ÷¿ôàÖ{罃õí3v‹Ÿ?¤0^Þ,לàóg… l×Ú»¬ l‡ÜÊ}ü ÉÑ(=*ßÝ[Wu¦@GÑ[ *B!„B+¾Ï,÷Ýw—¾0Pˆæâƒ©éµF@æTe”ËËN@\@ûØÍØ\«7?€›·{Ç|¬¡ šÕõ&"ow®[€hªtRoY6Ž››DnnºZ‘6ÚG¼l6›Ê‚B!„LJÈ/À g5PWÖàúŇ sÏÖÛ÷“ÆNhœ_ûØ \G A}™aÔ×Ý[pZúÓEnT™Ô•õ:xŒõÅjz Z“Æ@]WÛÜ!S]e=zz ¾²Î@à!¤[av Þ¨ ŽB!„ÇBUúÎÔ¨Ë ÊÀ=Ì \ï¸8·³ëËëǰŽýn$¡q^û÷VÕ§ü~™7*‹ëo?nÀ°HaÁYMá—|ê®.,ÔŽ¡ÃzŠÀñö¢JSw$5µRP&¯º%iýÁß/öCYa=¯èP3yÅl„B!„<^LU¹¹ÅõptŽ1#º%>ò÷8öèg§ÃK=kÆ@/G4W•Õ»E'ù—k÷ê5®ßÓŸìæX_\PX7ßÈÉO\ïSz9¢¹<÷²)86 cjN@R´[]qU3½"Ÿ™A×»µÅbF.—÷îÝ»S,î¾}ûh›‘?Ò˜1cZ__¿~ý·dÕµkW*OB!„ü~®_¿.‘üÆXG™±öÝýuŽ‘_:Å^ô£ÎÈpÀXùÓ{¤×ÃwòÒyýE`ñµ?½÷^z='ø…å³zÒPI»8n‰###i³‘?†\.ï0ÅËËëþ²:pào„By˜©‹Îdçæ¦×nÑñ^ö£'µüÓ÷3D=ƒÝ5eòÜzÀ1tX˜ˆÊŽ‚7BB ÃP!B!äQd¬—ÿtPÞ a@ÒŒ'1~d˜€ÊîÞèn“„ØÕ¡jX,f€u¯Ÿ5 Õ2B!„<ĸ~SÞzwʾ$è9aÞ&üN à1rÑ»#iCÜEðv'¦Ú;\š<®×íºEM W êÜC{¸r áÜîúÁ†xP×y”X, pow‘D_{!==_i6Cà7pø€»€ ¯8õÓÉ2[Ø}øÈR[]ÓW9|òjÆY⌧|Zj ºøÄѳe:°Ù’°øø¾üÛN¼'¦Ú»NºŽœØ×õ.¨¯å_õº«Y™ª~ÞuÖgì¸^N´çB!„´o,Ö¯v&èk.\çu•èòKCÂoÓH³¨®\ø…Ý+Ø¢ÞÞ0»pY,*bÒ©u¨7‡M6žûrù[ëÈ«Õ|—F½°hQr—»Ïªcœ’u4Ÿ;1¹[‘»ÿÇô_<Æ„Ü)|3ÝÈ/Á_&N iÛpDþ†…°¯ýüc-‹Õ2Oõ¥ôÓÊ€§ž —š¯Ù}4Ëkʎ݉÷U>,ÖÝVuSSÉ…|÷n!žŽw•9î)sB!„ Þ ¯Î¯„Š©ýáø/ÊÞ1Ö3üÚÒÌcgŠÌ[ÐmhR·ÂsÕ†ÆÆýßþç4T”ìgÝÐIC=8úªÜcÇskÍ[Ú#vXŒ¯Ô÷ì-tõqÒéôZµÙ#:i¨¿“IŸºêÈ"99ùìÙ³­o˜ššzLjËb±@ó¹ÅOLÎþñ®œQ~Ž@sYÆö÷·gÕOûÕëu­–™ê¯TÀg„#‹….Á½…ÿ»X­ · Ê´¥™GÎ\i4lð„aáMÖáS× å{¯xÅŠk »¸boo1ÔÕ«5îÑVÿ¢öÑ…Ë×'ÂG~©7{ íMl½iË3œ*Ö€Í6³¥Fv‚¶<óØ™âÀv‹çïÔ»± ¯Í=qüb­€Àk@Â`WLŠK'ŽŸ¯ÒàIû%=!½xæš®±âз¿°]ÃGŒfß’! -=~ðÔ5[ ôð€, Þ!„»WTTÔöm`` •Éã¼iË.ÔŠú uóð ÄO•Qñž¨ ~>Qá‘4y´'ÐkM|'i”׵ܱcùÐ`;en®:•v‘7y¦¿“¾0)®nÛùÖ:×a¹ÑT¦f¥-ñY,Àu’ò Å:‹™cgb›eT_;Wì7yœ/0éMK]pì”&dô³"˜Ô¿?Vì9º[˪JO¤UøŒœ–èʶèðž´_¼'†¨O"ê‚·dèUuìD­wÒôO¨ î*6SÏ!„BHûàíר‹ò¤ÝœÀq dÈ­Ò'ú¢öŠB1ÂÓÚhä;q³½´¦ÆâZø$ø8àûöä(j0ŠžG°Gä-0i)„ I¾®¹‘?FttôÀ­oŒŽŽ¾›T ÃÍeW<¹ßzëÉæ¼·g€e žòlÎÛ0vꋩǾÆó·/¬©¡H!‰óæpêî“™v­Ñäíò»@êÍ;—q$=°›¯7oôµWª4jíO;­ÏO0ƒ­6˜Z—PQX¥Q4ÞsÑö!xÚæÆâ*tKq€Ãç0µ™ƒ½ ›E AÈPOQ`osrÚU !„BÚo¿rj»¡ø¢Ò 9¾íËã`6#·Úàç…¶c²lYØ2²þoûºåüÿÍwvK§ ,ÛÀ(®XFÁ"¤ÖηÛu»Áþ°I‹®™Ñ73‹Å‚Ægú[š z-M;6òh†~Кxw‹Å 7Ówõž<íTwÇ;Ö2pD®<ƒRgf‰9€Q£1óýÚ\2Úfpbk>,Ö¯]Ö.×IÊ7WiŒ,0锞«ÇîÄ6yqeƒ¦>ZY^^Z”±'Ë{ä”(€íùÔÔжcCM5¬Öùƒ‡OÔåæ !Ó+mª›Bh­ü·fhª›Ã±%á´üPPÏ!„ò ©ªÖ~uµ&¸Ïª‘®Ö'TŸÊþ¤)ø?‰bEË zFöÃÉ៛nº~a–Í3q®ŠœR-ß3XªÎÉ©ÑôZ½õ>èfƒ¡C“Ô5Ðå+´ôåyEi ôv}¦†òÒJí}¬CÝî‰!C^ÿŸþO{K:kçÛÝw»Yƒ7‹…8Ì·öÔÑk‹Å"Jú*ïÚµË{¦zè,Z £‹ ÃØØ®”ûµ³(Ò`_”çThÓ‹jiˆ·SûŠ$ÕÔèhKsÊáéïz/W‡:y‡¸ª/Þ0ÚŠœrø†H9ö'¶©ê-ÛÕ;¨Ï Á‘RC­ÂÀ÷ –jräåZÛÇ55Ú¶+ÐÓÃP(/U›À¤½Q£6q\½Q*/j™¦5`óØfµÞö2为j ËÕ ¯*¬5˜h?%„B0Ååë5]ÜW¨ÛÙÜ¡hR\,2ø¿y‘o×Ì‹Eêž}‡7=º}“™Í†“ÿ𱃽="qt÷V¹Àcð¸'[nIÉñŽ|4}ç¦t€í<<1ˆìÎKSzòhé gÇÝó5oîw_šØæýŸõ–tB¿Òçf—u¤¤û“K¦¬Iþëë>_.×Ã@cMc3ÜÆ'&†Ù¼ùtM¿aÍ÷n.›Æ¿»çzs¼cû>ºsS:Ø"ÿ¸ÄÐö·>q _{øðöMf€ç‘ïÍi?±M¥­9¹û§BÁlÆO›7ò<â¦<ÝÓIœW{ø§¯sÌàyD$ÆX‡%Ú›ØJWyöǬZ°]CâÀMLT§ŸÜ¹ÉÌf›Áóˆx2Ñ“×òu¾ÿð‘‘ééß} ¶liàð‘ž"︑QÇ~÷uØ`K#Ÿ~*T$ túéÀö"ž4òé§ìdè4<¦â§ýߊœx<žˆGw0"„B,“&#ÏÔ71 Ç©œ#¥†Ðž<*’N„Å0Œ\.ŒŒì‹»k׮β¨ä —Ë'OžÜú¶¸¸X ØÞÔžþ|Õ{[æ×|¾»o¿aϽöÚÔÞ.Í·üóŸï®øAcß^ÿv’‡õëm³"„ByàŠ‹‹ëëëÛN¹õn“ƪ+ÿwÀòÒ_{Š‹.ü_Žû¦z‰iØdçA§µ ¹7@v‰ž•²kVJÇOy¡Ï~|èY;ß'„ByÚ2¥9 ÷öáþÞþi¥r•×01 o„<ÚÁ!„BH§£W+2*‘ózÍLMžfX¬ †‚7BAww!„BÈÃHUZyEðÖŒ®R€±êÒ²×+ö¤€‚7BAÖçÂB!„tBÍÙ*IŸ`iË{®{×p\<\myŠÊ†‚7B1T„B霣§Çµ{>G<íÅAàÓÿm€,Öö‚Pðö`ÈårÚl„B!„ Þjt³uB!„BÈãÉŠ€B!„B(x#„B!„òÐ K!„ByDR!<¨çB!„B:[Ï[qq1•!„B!„<ìÁÛyzUqq1=‹ª„P#÷º½½½©:µÊÊÊÇ­&>œ?>ÔóÈ£a“„B!„Ò Ð K!„By<®ÿ¼OîØÕÕØl06YDaÑQÝÅl³ª0óLaƒÁb±88ùFÆþÅKsmÆg,î®æ&¤½üš Õf0ªÕfÿác¢¤†ªÿÉ)W'ï¿Äöï*0×füp2‰±©ÙØdt ŽŽ vcS‘ÿÁ›Á`8þ¼R©4›Í>b³Ùnnn‘‘‘<ŠB!„ÎÄb0Ê ë.€®ìÄ‘3E‰ÁÎÎþQÃylÀ\éè©<ÅÈ()ss³4"1F ð `¨Í>zÆ9,LÊn*:#o 6ÆÏ榢GÏ”I†ŭfé_žˆr†®èçƒ9ÕþúRÀðGor¹œÅbEGGÛý´°°P.—ÇÄÄPñB!„Ò™8ˆýeÈüä… †`g4e](U˜›´<•RÀùÊÄ7Ó™UE§ÎÔÉba(+©Ój›Oü”oýì&£ÛÙOæ yLµÖ‹VžSV¾=¼ • !ª’ݶó`N‰ÊpRY@ÿ)³'TozýÝLÏìÕÿàr×Y‹ï-•±ü›7W¤)¤ãW®J¢Jý›6biúÎ=?ç]S›Ž@âÙí/ãgŽñ¯ÝöŸÿféºÎü¿7ú‰ÿ¨%1VìYµæ¸Ròô²7ŸÒ†¹[7.^²WѱÙö5 ‡þùQ!<“W¿=ÔåAlž‹ïÍû¨ö÷oß´4–o[¼â„ê9Ö6^>ºsïÑœ… GìÓ3bø”)ƒdi³×l¶€¹V~æ /:i¤æªûò,¶ÏÙ웣 Uòù܈‘Ú¦9ˆÂ†Œ tn›]3Ð~˜¤™ªÂ¼577777Ûܬu:ݽͧæÐçGý'‰~ôi%èÓ]\Yw'*BX£ñè{ï 8æÉ0™±º¸0'7§D;nIÙ™(Ò×ýwïu‚¢†‡xšjJ¯æåå]Óñ§’é4œ‚‡?™pÃhRdŸÈUÓ=fHw¸2'Ù“ÉS" íùH÷s>s}¶Ç„ût5ùçòO½hó¶fïçÇLa, IDATû/ðµNÃ0 çÖ¯NÍWè¬'&º˜<;y€”«ÍywÁ†HCC9%5:Žgÿñ£}J¥eW¨8>ƒçþcz˜ ŒŠs{7w¢Paž¡ONŸLM_òðºM½ÇŒž2¤õ„†¡hÓ«3u>Éï.â¢8úæ’]5â„%+§8xsÉ®ŽOh€®°PaâxöŸùÊìR@[|4uWZ~‰B|ú'Ï=€ÎŽªb´åç*‚cžŒñuܨÐ"ë½w3u*¾xão_ˆ/Y>$û£Ž–¨L@›c‰±|Û’•'UâðÁÝ«³suOK2Û¥Z9]Z~45õPv… €¸{ŒõØeTœKýb×¹•I èZt´mîw#ꮟ¿@5ô‰¨®F•RùGÿÍÒ¸¾ù?ó7‹½¾lŠèêþÔ½§©ÕIPìøãûˆa¼ºñßëòL‚  Ñõ«µ:ˆzŸ3khWõñUoï­åxuÕ]½¦† kTòß’ûˆ]éñ»~þßu5Q·¨ñ3'÷“pÊó»6ï=MmH»mºeË»ÓÇŒãêêzwQÐ=a|wÀ˜_}:·Àä>zŠõ¾¡pçι¦îsú‡Kª¶-YyR%è.Sä–¨ îž0>™‡2 :qèäs‡Ë¸@cþÞÍ;OÔèŽ4xÈäYS"nBŠ£ÿ÷Q!SþGóþÏÉ+—úX±þ\­ué1zæÌ!¾-Ç]LÓåm+SN*¡3—¾#ÕßZUGosؽó~k,?¸-[xŽ[¾4ÉÖ×–\~.ÛÈa˜Gß\²«F<8L›]Ýýÿ}¥{ùÑÔÔÙ:[;xfò·zï’å‡Ò'—//3ž{wÁÆNø‚ÿÎõÉ·6ƒƒQ\¨0q¤ý§/˜#½ßî<‘«Z~xŸ¶ÙÌ•EÄ:ƒíØ'Ìṉ̃ÃebG6—+æÞr“smN¾ÒÀ3ž9|ÛÙ?:6$06¶éœüà^ ›mWÚ+6–‚·?0x»Ýîøëï– |rÿŠ]'+v}q"YÐæœŒ,tHp€”£Èþî»ìÌ›ÃÃD´{MÒ!CúçÊ®ÉÞµK›Ó_w(»âäÎ̤·†7¦¾»1S<¹©}·>5`õì`†I:™šÔ%sRÒ'—/ý«ß5©à“0Zšý]fEvꄈ™.™­ÞUApÂäþRUav~‰Ö8@Jµ€ÀÉ·¿J*t¹›W.Ø gpÄÑã†Ožœ²«Ð$<+9B*“qbŸþ£cºËºÂ´ißm>±|¼­…¦ÊÍ,‘ºxúøôLš|ùÃ6©T'RVï*‘ÆÌ\0XZ}h}jæÆõ>ÿ >š²1SihBB˜1{ïÉm†ßFе_W\»®ËK]óïT<‚úÄ&4~|к½WM’A3&÷‘xz¨¿ÿéÑëðˆ?¾kÍñ½§o\Çù÷ëOKlMAŸ¤ä¨«SOÿ²wóñ^‹ûYN¹]cŸÔ/k×Þ¼¬Í»þò³<Ïoxï5ITò¼A’š£wemÙØÕÿÕ ãë¶d)!é5thˆñüþÓ×·mêåååååÕvÊùóçŸYé´Üî ÜCi…%iÛŒý‡ŽÁ´Â‚½{ ‡Ì VìMùèPOœ7ús ¿[ÿ]ÚƒW/ˆh9g/Ž˜þ䉔C5ðyrÎø`±LŒFÏà˜ñIÝ¥Uî]™Ù©›ƒÃ—¶Ü¥Á¨ÈüâÓ x&ücnŒŠÝZ—FØ?ìÜÅVU’¯à9d€ŒklT¨tF#À •:Ö!kºÂÌB©‹§¯L :÷EÊ®“8|Ü”0Õ‰i™S ]9óÒþ“úçîJÍÌÞüEXè¿bî·?Û5≨¶‘Û-xÈÈàßòˆ“Øò¹×ISn©§^}‡Œî{Û$Ò¨Ñ#éÇìw Þîã\Ò]ö¼1ÀñõÂàÜ5'K¾ÛÉi™Îˆ»†úä¤>T­Ðª” m40 ך xÔäqÁ*INööAQãž P!'û»¢¡©ìdŽ @áw­n©õåeLêt «ÛÔ A÷èëpII¨#‡ibZ+Gk‚Ö—âðqãžô5zæf~Z¢»¡eªO”œÐ›á Nwõ˜G±ŠIþ¹XðÃ's K”:]Maæ®”üê×WLö—p“ ¸Gh¨ ch0ç@fZ¶¢Q¥2ÐÞhb‰5+ÏIË——€±¸mªÆÌ%™›S2ms«.¼QmÌQ‚ÈæL@¹âèÉ%†jä½°X,íÞ»~ù5þ¡C™yW¯Õ7ëj¯fí]w©ú•¥ã|Ý8€É10 gO1T§Ï^8½ÇMÜ‹kìRrþÜڼ £†Xôï&èi9{ú«¢Ú¼ê¦ ˆüú‡‡u…kizÞ‰úÒK7n4žº@™•º.«åÔÚ•Õ† JÀ1âÙ¿ŽõÇuEúékõ c鸔¬gŸ}ö믿n;¥ªªj̘1b±øWÊà6-Cë¿ÖqËžƒÇM..,Ï,”ëdƒ'â”_r¢0פÒ˜§ÏÕ¨HÛ°:­¥Êåß0„ûÚB)ŽÄ¿‡‡j8â¡¡¡\Ž¡ÝqètÚ U£NÚZƒmFŠë7+Mð÷ÉÝ9 ÓpÙ^u6„Û=ìگϦ¶Y7Cqê›ÿÍ5Ù~OV,k¶ƒßX‘ìË´9)& ûägžìïbô¿‘óÖae~f•!¡¥“¤Í[_s|¢£Ãƒ¹>G3·×”çT¢ÅtÒ–‚·¼µütû\döÇr©å{Uÿûßïk8þq“Ç…Ïlù¶@gÝ;Á´î§l÷æ^Ëi©ü0€dØßç n‰×¸b $I' Þlç £GMj݉£õ²në€å[mÖ—NëÙ£­Sû[F.UçW‹¢'ý-z`Tän_ó镪¤¢‰ñ±~n`†6ÿ‹•/˜$}ÇŽJ”Ö|÷åáš[ë\Ûã˜5•µêqz<÷ú3ÝmG(®@l» ³ÖXƒ¶B@ í.hsuÖ/w\UInv…Ï í.8¬TÉ¿Kë1Xp¥PÙ¾Fîc#ª~ùþ£}_{‡õðsçÖ©¸‡ˆ£#h®=wîÂ@¿ÀàþÞØW™ÿýî*ïÚŒìfÀ½w˜a¬› þâ¹,•:÷Ç2€íåÈÔ€®2ç\VQÙ±3jÀ-,ÜU$èï}•E?~zXoŽº,?·Ò{ú¬ž~ŽÇêÕ9?žŒÕ?–ù3Ï<³}ûvcÆŒqvv¾ãÚÛo¢ãù[zLÛ@åfÕa†#‰ —>¦”ïúA’.Cu¡ü‚2úÕW£oÞk”áˆ9€©üLf|<ÅÕ*IWO¡P¡m?#Ï/ü]¼ýí¯.elعì™`»ÕùÕÁv»w¼qüG 9³õRÍ÷o¿U80⎓=ž]ôWÑŽÏÊ¿ß! ðìû”í¾¤³oð6qà…¯ÎÖœÝýCשСchs” {ù5ìØqøÂ‘—g¿‰ŽT U1€¨GÜÀ.œ=vGäßoâØIÃ< ~lßÜ®|ÿÕÏKçO!ÿòÈ•#ŸméÚׇcçhc§Ôµ]ªEc翆»_8¶û ŽÄ?:N è1õ¯ñНÒ/}ÿUE×N7h´mîZ‡.çîÑ‘gòó³+óp„¾áO|:®‹ˆM Íß[PüÓ¶b÷ø×æ|áÕνg²÷í8n±OONê¶­]eꢴ=ÙÇ- ~|r_¡EimÿÖæü¸³¾Ž^á#““¼Øľôwfï¾cùûŠpÜ|#ò»OŽU¦žºüÓ¶ë^¶VÊcÕóf5uêTN'îfÕï²ç ·»CN¬Íʼn _æìøþLÁ‘$=â<ÚµA9þ#žêQ¸ïŠ|Çg¹þSß~ib\Á×—vZá*ã¦v#‰|nZƲ¯¯d|ùmäžf§:snsؽ›à  |é?¢w¦àÒÙc—Àˆ<{ôˆówd]‡uE¾8_õõ×?^ø~ëpDþŸ}vš?‡AŸIñþŸ¥—^øþûšë Ü\EÁ[3Ôxö}êÙ©=ô#óXb1 #—ËûôéÓvjzzºõynvÓ\½z•a˜øøøÓ+**|||¨L ¡zAU1rOñWîaxïŒÅ[ßþ¼Àäûì²—ÃÚÜ'­>#eõu¨¼1Þ›Æ)¯¬~©÷NK%‘Hh‡|„Ùïy -((8wîÜ­'ZØl¶‹‹Khhè]õ¼B¨^BUŒü¡ñ–+mï@×#RM줫ÌÐÅ´¤…­ç-,,¬íTƒÁÐÔÔd2Ù¿/.›Í …<^Çg9TVVz{{S™Bõ‚ªbäž6¢H$¢rèÔÔjõãVΟÊÊJêy{´Ùïyãr¹wÀ@=o„Ü%ª„P#¿îñ»šŒj"­2!.x£˜úq'„ª¡Hh#Ò*“‡Šmؤ››•!„B! ›|´ÙzÞ\=ºÿö¼jKH>„—0уýÀ²…¹ôÀ‘”Ë&xýåä®N¿š‡±òüÒí•:¾÷‚9ýü9¿{I¨.žXzH·>+^è&þ¶„6ãË´õè6êÉ×zq;iø³ËB!„ß¼ýrñ<Ûm÷ÓÂÂÂ_.žéýp­ [(›þ|öƒÍXàë¢×sܸ´¿ß¾lß’%)Çkà5þ‹]sƒø÷—‹&gwºaèè¨.4Y›šÒgýŽy~xÑU¦§Ê&=íÇ ¿ôÎØÅ†5ß,ës?'™”é{2¤‰cú(÷Ï™¶côŽm£Ø#OõE÷”G</»õ£§R^ÿ0­PQ`¢å âíϳlÓœÙZßóú¯N[…6{·!ß.\sðšQ8tÍžµá<ʶ¿òª|áúœ›¡lÿï|~AÞq Ï$Êö-\µI^®Ñ!í5fÑòyñCÞšsŽTß\h·¤/·.ê{É„éKç¬/¨ªWö~óÀ§±B»•$}á´Íãw|eÿÓ¶å}ëêÐÈ7.}ë@‚·z¥"::ša†aX,V‡¿=zô8}úô]eoëÎâ„„IUWk®ë$½ždg»”Ug∽§Oé骫ùÛN”_ª7/ï§“úDJØÐX½ïXáÙR•Ú ðûÄ x>¬MþMåë?ϽdF·Áñ¯ôµ”)®A´v IzúxÖV^ª·pÄî&ö“°sMn•×õ¸9£¾IÁ>ÆÖ§f)=þÝüÊëzHü{ÍäÃQ©¸TªçÀ˜+Ž¥­>¯çxŽtªþ¹H4eÄ‹¾Æ‚cÿÛy^¡„ƒÄÍAw»¢05îþüäq-ºzâµ^Ž->½Þ|!HÚTþÞ†Ükpž0{X¼‹±"7ï›ÓÕ×´€ÓµgÈô¤n> IqäH~ºµØü®þÁÏGÖ¾{HõyKß˃{ø;3|;v š´Næí˯«ÕlŽÄC6alD_¶m£õtQ]UÔš$þ½f ðá&üXÞþ|…ÒZÚQ}§GI`.=rêó˵ހã$î;¨Ïôp·v¡¬I“žš¾§ÿðå}Åöó±m~½üËK²ê³ÿ××ñ–‚ºu‹‡›Ówgÿ\¥Ó™8ˆÜÜãGDŒðå¶v–F vWÊ+®òƒßLnºÝªÁNÁzV[~Ç2üƒŽm7Šªù~" ·n*ôIÚÜPÑoÉO™µýMïĨ.<@õé;ƒ3MéÔ=£ÇXƒ7~È¢ƒ{ï{kTÿæÛàAÖàMòô†ÃO?ÐU}ûÙiÙ„xYÇ&‚2mÉÚ‚¡k÷|ˆË;^ž³6­÷ª{Í;¿ç7~¾e­O¯œñq ŒCÞÍ=§lݬ¬àå{¾ pãÔ;¯oÈ(¬1Äüó·Sj’wmMèCÞú¯|upyŸ'=ÿ“•!2>ª÷/œýÎÖ¤˜ùA}^ßqêõ–FùáWŸ=áÅCå{É¡¼\†ž~¿)Œë¿âÛxåþ9Óüö•´·:†Ü”%é~+·¾ɫ޽xö’Û&Èn›W6zákB$|MÁ{s_]r8jÛh‰Ún†²MË—îÈ-SÈBÛåàõÁ7«Ý9ô¶»oܲBnqóÖÌ‹” ¡ÌX<÷”K kÃï*áŒ6â#°Q}páòMòâjþø¶ Ÿ°àƒe‘2ž¾èÛ9¯,ÝÜßî¹Eeúš¥{šx-f¸¼uéfÌÛµ7®‹2cáÜ¥Ÿ…oy-g/«²Ï—¤”Žÿäàh?~uÚÂùKS·ü;„€°èû íb懱ĹÏàM§Ó †_ Êš›ïe.¦K%º ‰€S¥S¤ñ»ù=Ø µªÊmÇ|úŽó@eλßW¨áÐ5ÐÛS[{¾ªbsªQ0{@(j¿NÍÎÒN®}|ùºªšK—5ÆÖàÍ¬Éø!÷’‚À¿¼%ä6kìÔýËu"±‡ª¡VU·ó`eßd_NynÊÏ•:@äîîÏ×^ªïxvíü/Ý$΂ª&eé/_œt_>ÌÎ =SUÑ~ÀzÅ`MVæ†óM€ƒ‡Tª¯WÞ¶¤…‘Ý9ÇóMµ¿4{áÊkÌPyµ)H\[}€Xâ…âW$ Î~Ÿ¹¿ /ï¡^²áRU­ÊÙ7Þ_ñs© |il˜Xâ.¾¥cÐ\s:ó‹ó:8Icû‰Ñ¤ºRª¸ÒdîkhªQñû†yrók®—|qRº|_þý‰Í¥‘ß„ \8Y–wòìfqÂÜ^l­Ê(pw‘ð¡Rœ/Uÿ9[ä•0Ñ£uFÆŠÓçöÔN>sGùŠÑ|›|lß®=ÿK-ìíXö¶x8·¦É¡«¯·§ØAUUWW³ÿûÿ9z´ì­Y'ËàæOî­«æb¿`cîX†¿Ô¦ÌKOýü›´Rß—6,÷ã]JYr\YÅ]:ù´ßÌåÉ™ 7ÞúI¢0d½2uÓˆŸ<-ÌY#ûiw–+±jöÏ„5Îë»è«Øêís^–·/Ï6;Ìê7ût\N¡áòÆWç(ÓàÉâg­x3Qh.ïIyû›¬Jø’ˆß\ƒAS­0  'rãñ•<EÙº5J…AØ;\Ò®L 9o­±<¡ Pi7¹A™ùáÒùš ÑÓžŸÔåT3åþWfnÏÚ<ëë#Ïíùp@k?Gê¤ù󶮈¨Þ>çeùs[Ö¶íɱ³:†ÂÃ9¼A«{ ÈÇ­û&çÆ„Ûu¤€ï—hëp Š ä¯ÑÂR»9ðüž_µå™Ü¥c×ÿÖunÝ7l9ÏÍØ3j˾i~º„Ûv!µF©á õäÝ>aÛ>® o!"Ø TÔ+øÒÚÅíû©:Ô…øIÁ5iç«5ŠzÞÐ…ïÿ{€6âcºeIk7$\^?ãõ6Ó¼c¬’|߈`aª¢Étj —w,]‡—VŽO}å‚- ÌÌ6ô{%ª IÔ3} ÿï\5ýìd¥¹*¯–MäÇ ‹›ÙÝ’ô2}Hнõo:h¯«w/~yÝ%H"æ-^61§/Z7yqYL_Íñã±lzý¦]åeµBöÒ®ÉþÊŒ÷V}v¼Æ`0 [⢵³"xw:^“Ç;x3z½þW’Æ{™‹`ÂÔ!ñ’–Ž—Á1¯E òco¥7™”¤™•j€ãßïãdN¦zÁç§Nik~.möGa–à{Îùë€PGÆŠJ³l]d§Ï¯Ä~s“ºÞîj¥n£ßìæj¬W™¼UYÕ:€ãþ¯©¾bSõ‡d_í°¨ÉÃâ]Ì5ÇÒWž×)Kêö‚7x…¾1Ê[Âgs9š}šx ²4Jh»æ  -ÏY¤Þd+f—'&öëÛSÊɯÑÕU+›¤Yµ€ZÕÙªæ®å &@äï-15îËRœ~O„ôå=TçwVê®^»ÞÜýz#€Í÷t—úô ™ê p¸ž=~.UÁÉ{ä°nb@[žóa»9† êôÀá$®AaÝ'$q6lq·`Ĩ~ñ.P¸{ëd“²¤NÑÏá§R Ö×ÙÔT·úœîRnƒ¶—,tâp¥âj¥FåeyÓU³þºÊ‚–àMWš¿>¿ ?=±OG ±ò6ùض’Ç€˜¹‘Î6ÛÉ|}Ó–ÂÛsýG |ºÉÞç8>ûÂEe]©R«æë¯ÖÕéôšš&ô°5ù±ccFzq8l®êì¯Ú`¤Û-Ø'úÅ·/Ã?^Ypø›M›Ó«¥ƒ&Í\¹cŒ!  ÊøxÐÛ%0deÞæ²tÄ¢OcePî›>k]æè÷ã i — ^µãÃ!”éå²ø…“v/Ѭܸ '0äloiàl_žR9á‹c‰2TüÛÜ7¶ly$Cç¬xÚ§>õƘõiÏlã}ëIë…+ePç¾3yíg£7.è雼aë‚.B@“óÖ¬wvŒÚ1O”U¼„EëøK„"ÞŒa³Tï_üòž¾ %†Ë—n–,ض5T|Íì·Ämmo]쉔io}X¸rÇZP½ï¯óSN‡/¨ú UÿÂŽƒ±BªóŠxâËúf}>zËWñBú¢¶ém+X¹gÆØo4¬ÿbÄ·fÚ’½e‰³üø·®Ë¬E£Óß þ`Ë32šôÛ—Þó²;­‚0bÁ{¼%<@yxñŒwÒ¶NX67uòéyß[µÝ%j”žÌË %<ƒ²ÊÀ4mõ¿/Ìxýƒˆ|ëRÜÊãÚ4.•‡×=÷É a‡=çªöüÛ¢•[n;PVÙa‡±»œ2ÿñËvÍ’‰}ÑgÓ–¿Ì?7eþ7¼eë ’@]”‘ǃ÷è NÏ~vüÁ~deÔÊU­+e8½|ÂüÓšn#Vlh?ú³tϺLß—¾äüà IDAT·IÎ z~펉e»¿Iya£!8>ùÅ© =¿&Š_ÒÌÀÔÍéÕñ£eú¢o·7Å­´ÓHí°:E†(´®,O(D}™¸sœ©LÛ‘+úœ 0Ü[MYóÇ'ò ô0iÁÂäÈ;—F›}$‘S_¶Ù†‚ÿ7ëå=5’¡ ß-û•„íHC^Z;+H„êݯÌþéQŸ&JnùiZöi¬D_´nìÜ}1|²-D¨>õƘi3Üò«B‘6" ÎM=Žˆe¾»#oœJYr:nåÚÑáÔ–•ÕjxÒ–5Jxš"¾ÍYÛ›YñdÁÂê§ËGûñ¡Q VÚÎíŠß;*BYdüKËæÞæ·ôA¸µ‡¾²e´LÈ*Ìž¾>+qm€¦Ú0`Á†¹AR¡PÄKx€2cñüϤ Çø£z÷òÏ Ï½¿o€†«ëæ.]¿eÁݯÉã¼=xl\mnζ+ÓŒ0ª›,ÄîB'~Wg@ •ʤnÖ€ØÃÇ6¸ŽëãÍm‰=ôç/ë€ï$r¼ÃŒÎ|`‚0ê¬óòrûÕ–:[äËÇyôZÉ^©ñ…ž.Ž\&}­Çßç–~¤&Õµú¦–7µ \/ߨ¹¤R\*Ñ–šBk”æÖ]mÒœ0!ŠZ-Óù=?Ÿ¿Ù¢Ók9âø(éùt…®¢dgE 肱‚;Ì‘Ý7¦{·ò¢kªšŸ®ù€“çÌ"Û_(p@¯U«,jPlþâ§6íI½ Ú³ßÚV¤N|t¼… jók€Í•8³›T·É§eŽb©3uuMµ­¥Úu­½-ÞTýujv– G$fß20ÕÁÓ](v¶vÜÙ_5Io¿`ÉŸSïô—Þ;ÿ oIJ·&øßëUH?W¦Olß§Ê“DJðÝ‚¤ÎeÁB<™Ld¬Vÿî¿©´;ßFÔ¥¾²êêˆå·„LÕû–|ixiMrO*ï'«Ðy«^Jùऑ§Ÿ¿QÃï+ °:ã0è«3Þ™ÿöë;¾j \ïû·ôvÇœ[ 9TóKjÊÚ¬ÂÁP­qSêÀ“EM‹¸Ù0”m_•R5þý7C„Pfø¥Z±ñé@¯¿ÒÉׄ‚·?Wäì€:‹J©ÕBèdÒ_o±˜#óTŠšænbGÆšZ³§-êr‰ï…“—ê~Ù”ëýZø¯^©Äi}"[à ÔÁ6¯Û&0ÿöÎ>ª©+ÝÿßB8G!AM¢„T13Pu ¥é˜2¼«ÄNkÅÑŠö‚v{\» : NZ…Ö UA[p¦Â¬A´6Ž…ŸáBÀ†¨IPÀs@úû#Ay Š/ííèþüáÂä콟—½ÏÙÏ~öÙ15¶€Ë0WZî/<¸Óij邸WTä<î÷©ãú\<<ÀUM-GË,íp ø¨}Äå/kŽÞ/rœøÎ@ƾì?Û½{_§ƒ§«ÃËÿÃqmÚÆ›Zmã±K7Ûµu%¦±3»¥í Å¶;cWF½ÖhÔ6Þ8U©û±íÚ¿®´I'ôÖô›¦|×ÐŽ¡3^ó›d ­ït€Ë¹^{¸Ž†/Z$uiS~üPヲ¼ ~òëš‚ÆýE?¾ |ÞÕ…k·;»$‡y­íµ•¡v<Îi¬*oíýÀÛ?¦|üÿêÕ¯î©æÊȰ÷.îøEû<í»úóD¯Of._yQõIÿLs­Ñr.}Õüt€5é-ëÄG§&÷æ²5ÝktËíÎyö¯Šç9{cêì Ï]²2ë›l”õzZ0ÇŸ›Peê\Ÿä½Ô®‘™ªôå;ôï$mMòå3î§µhv¯Ïå®þ|އUNÖeüêä^[9zï(!<Ãü~çÍñ…1è¬;›öʬ/OŸjh·W%C\%^Si€Ñ¥í-û´ðLêçGÿzìfÛÝé¯×Ø?½2@ý·•§o 6P=AÀ:ëÊ¿(ùë§}öLhWÉÊÿ÷öJpð p{ÀV:ŽëK€Úc§÷½°ÿ˜¾ý~Wya‚ sKFŽyÁÅù…‰Cq§Ý pÆŒyžp\åRWõ'5‡ËëOŸÿþØ·ç>;ÖØr»ùÐÞ£‰_×T6Yºë:ÚÅÑšQDsÝþ¢ ‡Ïßê~tT©ÿç‹óêÚ“-]æàÆ¿ûVW{ɱʬüo¿Ð­é0ñÌÑ@û‰cWޝ?]Q{øhev¹Å ŽN`9uòÒá¢Ê£Íýž7ù,ÏQ@§Vs¨¶Ô3÷Øõx'ÇZtÿúöÒÁ^DäÖOµ Û‰Ùðgƒ¿8wcò¯ãg ÎgþyÞÛq»Ë }¯áºS¦šf€¹îœnà·PyžÁÞ×òX÷Ó[jK«L ø´EßÔ§üL~mn©ô%ÙUü™ã•ydmoÀ²Ú✷YR¾ÅØJy˦ˆ)ÀÔPÓl¯ŒþpBª>|ct÷Ö ÑLêÄî¼j 0úsê*ÓàÅó ö¾–õé)kSõ©LšSµ”gr~ôÆAtcƒÍ…¹Îôް« Å¥,VË?žõXs£…ç<‘O¦šF‹µFšâBo2ÛQs–÷µÃÅ ,ÀV«ë‰þüÁu*ÖbÍK›Ê³‹Ù©!4`8“—U\Ë Î=d N|–œØO]ñ ’kÃ’zGnúãYŽëÚwuÞÁC‡÷8¼÷Àç+¼¸²÷'ÍCèOU–˜Êó/P/Š¬Êæ›*v‰Ùÿ=™ @w¦Ûbú’쳬·-¢{¬{é`lÑ3ü€@_>À6Õ™ìšÚ Þ’p6 1¾{3'|˜Ûåô½çÌÀªJJM ºƒ_ƒNcüV¿îôå·UuºáÀw÷PÌš0~Ñ‚…þücU§´FM @»øMê„»ñ‘£`ÂE…º ùæÁ¢Fß×uØ„ë¸ß-m:»¿ò¦ùF‹“ûð¡m7ÛáÀ¿—3sà´Þ¬lfà8ÔW6eѸ!è¿M°OäùꋊÖÊ‚«7Ë/uøJ†rn´vÞ§õ1cFáÊu`Ô8+0T2’w²Á H& wG·€À÷éK‡ÊõµZ]=ÚÅkÂ(×!Γ$®?j¯jàÀé6ç¿—\€1æxž>T×^{©áÇÖQ¯NÖÛn^#Ý*n”_0à8M˜ó›»ûNÑyËXÙÌØNƒ7ÀKÊßs¾Õü«ÚXUÝ`¨ëp?®Ó¨‘/¶|zÆX{©±ÝS,q¾©iëk§QÞoMººýSY¤ X:Õ~=ƒqÏ;çO˜ü§Îªk)?ßá;AÀÇÕÞÂú«fß°8=À†?7´G@øš€p¶¡Ôôš‹Œ_´ÄkeüÛs¹ÏMt¿ Vb\mBÒœWXŠ?pÅV™oð"ÿà óÂxc‚·%w_ç¾1º>éÝWv² Dò†{ƒYÉ3•$,)1[XzLð:Õ\1¶Ø¼$ìPàŽgã‡ÊU[—%oyka:€[ÐFÕl1`h-ÿtÍö5–×[¾:u‰5Ma)Ý•e”ØãåJj¯8Ê7r×’)âG]7¿÷æŽË,¸Þ!«·ùR%])V½;ûŸ\ÞnÏÓºËfKvZf¾1ÞN”hOúÅè ²†™ÿ²d«V–ËŸî<,HŠì3je•]³P;ÞÞÔ˜¹»R—ùØ­­Mÿ ¸±ÁØ|nù¢‰Ë·&MçÃRþiÒú5° ¼eËv¬OØ`¿o˜*fz-HéË`®ÊÛ²ã#Ë‚ò\¸uuÖûàNÅj÷¾7{·ÉÌòýæ}˜8™ °Mê¬ë¢ÃBó£&½d N|œh]È[™S£×ñþ›g½%nUŠôÅ{7]£¶¯ ÛÈ?újÍx4}ü9¼ç0ð)Ÿ…æ'}ðæ[®ß¼ ë<) Á~Uç·¼¾¦ÄìÂõöHÝ1ׇÀš/ä­Iê¶Ø¼­_¤Å%xëcdšŽ³~ùÂ"Þ®€k²óÜ`/¼£¤‰å¯Yx5"x[jtxÒ]Ò–ÙoXðÆEÇ‘˜…`㹟~ú©¢¢â7>S{~zôŸ_ܧXyyùÌ×þÔçÛ×>ê7¿v;ókZhÚ‰s§åúÚæ.Œ—ðg/·gÇçþ9Qígá?c\ S—¾ ‰;£}ÈÆz¯“'1Ä Åï¾U~#n^ žyȸ È#''•1©HæíéÆ~æÍÅu„÷xiçûoo9:8ºpÉ:8@ @ ü_oEQyÃ…@ @ ~-8@  Þ@ @‚7@ @ Á@ @ ~%Ø,y®ãæ©îIÕC ~ª‚RU·¢Q ¥î4t9öŠÃP­…Dø8‚ CSòC ³ _I{ê°›ã‹Ç&dH)]þʈø|iN„xÀh÷0Õþd?!mÖ¤DDÅæ(…f»50Ú¬¸ØÜŠz£ûÄ^5pS¤ÉèÊj·oôSH(Ɉ•Šy0¨ã¨R.†¤HUð†8ñ)p"t±q™5Mtxá!±{’¤bš©Î‰Z—%+ˆ‘<švÚ´˜ÍõYG”Zw$vq\Šw^¼ª3ã²›§– êØq™Ò¼XÚ^ö?$3¯û™·ööv–e†èßÛ·o?L+º›´ï‘‡c—¡îÒߎÝê?Ò¾ÅÓ&ˆ¦ùŒô°¦µèaîC0lœxÚÑ´ ¢IÛsìpÜn¿ ®ï„ÑÁ“Ež.Mu?|”÷cë}Z¾ÖXa¡Ý]¦åx^åY pûzÆgg ëÚÜ'{kúHç[ÆÂý§¿¹yOõ“ßÔWµv F© W,."WgàV}mÆYûK7¾+Mø§®Ž# ìÖÕpI“Xh`6 ÓÁ1mòØà áöªŠségÛî|?Ö¬¶´á''ßLs'7qèK^ Iw€ÈÜ(<Û‚!:ë*κzç>‚6¾ròc¥?þìÜñÛŸ½ìãÚa4,ù¼GYÃ¥­Ã]…@›ñêÇ»ÏYMw§åxaM}çÀ¦{Pµ„ûFmš‚”åìÅ™3Àh6Ç›òãæ*¢rjJcä‘G¬‹)‘G¦"^.ŠŠˆˆP„*¢²l 抬¥\.—ËC#TGþ_Ž*·¾éPÔìPEDЦ¥">Ô¶Ì莨"Cå¡¡òÐÕ0Õ) yDlLdD„2442¥ÂÜo½9E!ˆ‰êu£IRÊeÖö"­ù¦">TŸ!÷÷W~ömZ¤ÂŠÜßßß*¹îˆ*R¡P(BC•±9ÕÌ€ºØx*²b• …Bª°å¤Ìš¬ehhh¨\®ˆÊªn©Ø¼©ÂrqÓÜÐPEL©NQ(Rª™ž *BC#“rÒâ##"”ŠPeüìéÂT§« õé‹CCQYÚ{Kûý­÷`ÌêX…­vEL–Æ ŽlJ©±œˆªŒ/5÷ ê «Åa!>4@û„(ÅšÂ3£ÍŠ+ÓªæŠ$¥"¾WBŽ©ÎJ©F+%=zÎ;}Ÿ[oTÇ/PD¤T3ÊUY9ÑÞ¼>öìÑa väS*ᆭ@×½ *—Ëå¡ÊØ|-†574O@Ñ4 b™ÜOL0 o¢TÐk6ÄT¤gêBV‡1@qÆX¶yqhDlÚ‘ê'”Š3DÊcmICA¤¼WBB›¥”Çv'ot9¡±}29vÔa´”\9‘Ðâp]qÅ}D¥%¡¡~BÏ;Л2ë,¨Z™–8m†à±'wû†MI…¿"Kk Фr©˜Àl1š)™;=pÁ]9J&Š‰ŠŒP*B•±ýòT}ÆBJNJ¬õ¦‘Tj&N|v(V¤ääe„»÷|E,•Ši´DêÍcæ¾7ÎÁjg®®h‡ÍÐÄòÈ@¶¬XË ©¬”•F #¤liYÓ@uÞ¿¡G[³gd]~Œín*WÆZ„LuŠ"4&)>2Ôß?TUüEŒÒúÌ •ùû+³´ ê”(¥B¡ UD¥U˜ñ¼&<Û™·ŽŽ†¹_ö¸££ãaZª˜+57†û—o,†Úë7Ð3©å8KÜ<÷ÝûÕ¸aoM™<Äþ¿‹ökø>q—pð |k´#à»iùíz­±þ&3²óVÝ¥všouŠ êÓWº>6ú­±Ö?<_ÜúÖ(êö‰É•UwšOêïøÞ®>Ù |£fržw®ý&óZË7µ·ÿ`[!£ƒçÎíäÄqrÁõû+õÖÒWf ;Îï+ÞV×e¸ÚιéXo1æ ¾)i8Ó¦̑8uˆZ¾ËÖµ]©oèzù˶»UuµEwsh‡Áxò WÛXtß6žŸ8W,âè4UµÕßÕa˜Äk¡í7«˜bUœÔ †Œä²“LgýÍ.Œnûf_å77­a§ƒË¸Ik^µÕæ>=ðýi\gŽcÇ•ï>b—щü§cÚ¾âmuÌÉã[ómîðTþ~ÓD'könS—>錄ð—Œú[­·ntBXkßtRNm…ýjGQd„Ý/j+ÎÎÌ*Ö gD,J;,³®ú­[7C.ߟ£‚)-`!PlÌ‹aȘ»½L™!gŽÄÅx§¤ùñ`ШëÝåªðüsR^¼ 0¹ÝœÜ¸ÍMá9j…º‚¨ˆ˜\ŸüpÈc“Ú¬ŽQ¤‡ç(Åý—œ7¦„Ša®PÍU¥…åÅûH"3 â…W#¡ûë­ +VyïÉ0«¶^¤ûƒTàIc÷ iÀp$fîæâeèÆØì¹êØÃýx™&#K‰m¥yŠ561´,2u]§y? IDATÅܸÍÒ4y¡ê¢õs¸CPÕÚuóv×-=ÆKïÿõÒÝïÛnÞTÄ"Þpë ¿=ã9 î0èìˆÁmjÐùÝþ£ßÝ»!1­¸£û®Tuäfàä2tX¿†œ†p݇¡lÊÙmÚÁ ‡ËÅI«ìõú–†î,¤“¾Ý¡ ³hØH®®PÈà0RD£®½ã&Óq/–v¹÷ò±g¨3`M•dº6 T-Hð6Pä¦QÍ^\H…%¦•<ìJ-z‹€'‘Ðffmaµ8"ѺÑRè'Z»3M±Îg™\l]ù ÷IÉÔ½A $Þî4Ê]Â3k»Ÿr÷ ¸b‰xC¼Íé𡚊37WèŒ,k6šefî-Q„‡ú‰{,¦Å¥S«÷GúÐЖ©ktìæ(kËè âG¥¸çÄúØ7¨Sr™ðîxÎP6Pqð$òH•<Ò\¯Z¹à•ÌEy91’Ÿi;“P¾H–ž’¯ ‹ÔeóÂ÷øÙi§:bôÊc®H‰J1GfDûÐû5ÃöœRÒ4`Ö¨"cUÞ)2ÞšêÓ7x~ÊH¿^ ùÅœ7”ªGm空#‰ûv*Jèg]\Kå‚̲zF!¤ûÞšºGWëíÍ@¹»óÝÏŸ NüÏs"S_’’e߃юö‹IIÙšÆòÄ c¦¥\«_xzÚ«s€†ƒþFžhÑdmßTV­3³l“E`d  Üeá!Ò{76F›“°Yž±Ñƒºàb“1}eD:0HŒ,~^Hðö„¹c¨m®ë0znd ß´¯ÞxüAöß»wv6È:û]+œÆú%üq” ܾp쇆;& ú[ØXÏ]Gß·^Û×»­úžÿ»mihÀsœ…4Ðñ²?ŽiÓ¾ \.ÐöØ ö£³Yè´Âóþ÷"ÒNGw÷»Ùδ¯F{9Ô~“0àI€0Ð6Χ§pFü9Nñç^ß¶õ ži –æ[c†sºnèNÃi§ûUÛ¯x?Ó9_dµ„Ou{R½3³Ó£‡…G†+üZ¬eûñÌãó(ÇŲ, P”¡ .6ß[•–#ÓºœˆÅí;êMqê‰IY¶iº™jORÏl3ØcX€ò^–Ög‰1>/OSVVQ¡NHÉOÊK‘>Xe;Ë ƒÒå‘­§ÍЉWËS’s¤BT§Ì^á. X£-ú3YJpw  ¬ÙÌö|PkóSÔÞÑy~OâÉmGNs©**^—‘*á™Õ‘Š\»N.Ë,æ-:â'æA›*6†ÆçÖ„«î‰D‹å!k̰†dŒ&;¥Fº.I2ˆâŒ®¢0++ç„N²1#<ä‘"7v€¿ûÀ“. aWf t½—©îóÖÓ]u$wžYk›Í²f xî’(ꤨÍõŠŒ4[tJ=L ¶ý¤àIäJŸÍ)Z3î?ïtßJÞŒªÔÛ„uÐÍì ï 4X1Å$N| œh/4M‹‰/óKÉŠ½°ô íx>JU– ËQF@.¦i£7—­±t'Œ,·;;:@øôdAQŒ&%jsÓ²´Ô$?!S;;Åþ¥šôØ\îº=¶›Ëõ‹Í赕£÷ŽÂ3Ì/ó;oíßV¤ïû·ª‚&‰†÷Žpöe]ªº€vÑV}¼ï»¿¸Pv³ã|Þw…FB¿oßwÛwæ@m—nÕÖûCAѹ¿6Þêtpæè¬ú®ê@ѹŒs÷Û¡:|¸ù …¿Ñv<Ž8ÃÇyIi µ>1ëLÆÒ꺀¡ÁAjÐÅíšî1«}VÃ7±,B•Qp8I)¨H_ªŒMëÒÏ6Öæš ;༅çâ£Ëɵ­h®.Õ@ hsSSŸB¿Au®Z:u¶Fâ7¨3!X–a­«‚YÕâ0©Ðb4Ó>r©˜ Ú£½2ºü„ͺð”»Ïe÷¥N˵ûÅè*Ôš‡x›‰çâ£ËÌ´½íe¨V«u0hÔ5”·\«Š•ÓZ­Í…Ù¾4÷Á®.²X-ÿxÖcÌZ Ï/d¢Œ5Z³Õ!4ÅC“ÑlGÍ0]~±–˜êâ|O˜7€áˆJuQ¹'o/36½û Lޤd1ÊXù£œêѯÃèìÈÉÌIx€Y«1²hIÈDsqŽõå³¶¢ÂÀK(­íM!¦©Zw? Cé‘R댖©.È­H»ß·Ó¦–Eß³Ú/莤D)fÇdUûD¦ÎO‹UHéÜs½ÆÈsP-àA§5€¡FÓÔo(Ñ>á‘îêMÛ›f,ë¿ÛΞ:´$Dʪ 5f:unµ8L*´N¿òÓrúÊTçÄ,N³DîI¼»ýs ìéQ]jÀ\]]Í“ú nk€¾aÖäguŸ jÖQWŒ¶8«~2Áà:k¶¾›d(Í*d¥ Js² y.nOˆŸ%'ö»1ê â#T5ŠÔ=½"7Ý‘¬,ë9¼¥í5ÈŠ´øL(£¥<À=PFUä—Êò+(Y ûuØÐãÑÏÈæ&Fè'˜¦j£]SލâKeIIݺ ýÂÄš´LëkmŒA£.}’gþÃù…2o7ßÐ\iß²‰C€§YtÞ®·möcªênXïˆBùoÄÛÞǦúMÖéŸ×„ùœòò¾‹'úãçÓ¼\aly~õWô†;pv½xþ„±€ã¾l¹¿°¨æd­ñ;#‡an£Ÿ)ˆuɇ\ÜW¢¯ªÓÕ ¹¾SF"œ÷DZºÔ×ÕÕŸ´ˆ¥£9 õÕ06hÂËÚ '7OV´D¿}ùqN`âþßK§ìûGõÉõ'gÁÈÐW'Íí8øâöM÷˜Õ>Û1œD¡’E0ÚRu¿³ãi¿ÈhsK¹O,¾ß~;¡"QU“*gi‚ÀÕ©2¿E²üøP9O’¼+´û:IxJ¬6~±<…-–Ǧ„K€Á¬äOÄÏ=a63´$d]r„‹·9BÉðx<0è·ÊÍ”nÞ\aäj£fg $‹Ò2"¢ÓÖmVÅ)²Ìx>Šu‰òÁ›I¨HN1ª’ÈU @ ¤‹R'KSâT5 Í£¹ÞáñJ h÷e‘•ò|_lF²÷ «–ØÑ…öQFzGE½"çyGf¤Iîc½Ìwh¿e«ýââæ*yž€×íBžl™";v¶ý:Œª¿œBy¬²0>B™-àñx4k“\•¢ŒOš+ß܉ËRR”ëÒ–©T )\b¹*Y) æ²Ì¨Íqf–Ï;d]Z´5Ma.MÉ4†ôÜÌEKí@O\–-}ä“ò Qs7kXð¼ÃÖ%ûÑ-^&Ž[¬Èçò„ž½ ÝâJIŠ9$Â^ºÂž:´lõFyB¼Bn²˜«àfMfJ¾ mYŸáP“›YÖd¡6ÏUoJž±'ÆÇn LuÚÊøbm½ÑX¥(ô‹MM’ a)Ë\g Ê[“ëGØ`¿o+²Òó•¶TÍs7oŽ7²,¨±ËÒÖY'ÐîT¬63J‘n43¿Èä$)`šŠ3ÓkbÃ>ƒðU/ˆŸ'Zòbb²jššŒX9·Ô;2-M)n*Î,nj¢R¿bMA B2òT~Ц§Ã;oÞ¼>~ÿý÷¿ýío{}Ôów®‡kžE쌋ÿ$˜ê”ˆx$Ý{i‰@x ‡˜¡ rAaøþŒÐÇYc4ªÙ*AÆÀ'Å<Éù ¶e~ÔQŠÜð‚Î"N$NüØ=!•f#R*>ŸO O1ö3o|>¿¶¶ÖËËËî·µµµ¤[„'6_•Ö÷HjZ¢\#ãã~Æ%Šì̦@•\øxÕ4©k$‘©¿ÌDü—l‹8‘8‘@ üаŸyÓëõ¦¹¹¹««ïË`ŽŽŽÃ‡Ÿ4i’››ÛƒW „g2.2ÄĉĉDå_L*’byº0óæïïßÙiÿE,GGG.—KlG @ ÿÇÁEQE $@ „_ Ä@ @‚7@ @ à@ @ HðF @ „_ ¶Kš››ŸHuOªái‚Œ  1q"q"Qù`Ĉ¤+>ÁÛONßH~BõOÕ½Œ  1q"q"QùàæõÈï¼=Ým“@ @‚7@ @ à@ @ HðF @ ¼@ o@ ð4Á±ûéO]lõ¥ÿw³ÙtçÎ>_9::1ÂgÂÔç¨'"A[mÙÚ¯pt‹‰~ñίÃ*·ï9y¬£äÁë¥N—óìÒ‚?õeÕ+ÃHy0¦*Õž:†/ÿï ñCžpÝ×þýMâ™vŒöO™'r"¦&@ àíÊÅJG‡ç¦M›f÷Ûššš++}'M{"8¹÷“ “¸þЬâ$‘ŒômÁ(>ÉL~a˜†Ã ÛO\ƒûŸ}µÂ‹~´Z,çòÕ쌰!KyÔ¼í~;D{<å¦Ó©s*~;WáA`ª¶¼Ïn;¸ÁïQ™LêC%‚Ù~\¦‚åó„ØöÄ~5‡©+:Ô8%\.êÿ•áÔö5©Çk,ày¯U­–Ûo³!kùÒ¿gïþŸòßz<)=zNªo^ܶ¢úîŒm‡’'S`rW¾W±â@òdê m(رåÓ  ,Ü‚VÇGËø@ÃḤ¬ŠF‹¥‚q³×ª¢å|V³ííåGõ÷„1ëó½ký`¯ø“À ^¿|çå¦fÓÄ…Ó¹v‰:n~ööØÿ¶§½û«ÀR±{ý¦ÂËfPÿèä5³$Ô}<ž³&)O£·X@yË£WY/°ó™ì¿k×\±­?^0{MwmÜIk¿Jž%ÄCô ºïHÙ’°»¤ÆdaÁ÷–/Û¶j–˜TÁ_âħÀ‰ÖÛ„fçÒl¸ûDÓ®OØ{Nk±°”ÇŒ…6Îñâ=–v}뇾dsrfY3À²ÿe‰+‚ÅýñíIéÅ,ÍM·vc˜_­Å„GÞšMÆiÓ¦ýôÓO?ýôÓsÏ=×çß^x¡´´t•ßùßI«ëâxüõ£œº2‹–I],G?U´ÀëµWW¸Xª´ÆNç¡@Gã™ÿùòZ§ãð/TUß4ƒ3vÒ”wfŠ\qçê·Ç·V2!p1V^e:]f½ôÖ8g¸¥?|¬ê”¶µภä¯þnöo†à¶>åã³õðòHSÅÕZÚ{㟽½å¸9´4Þ¨jFÛ\ýV½K ¦Ê“++ÁYžà^õ?_^ë¤G*&àôù¦'ÌÑ^{iÿ¿«š;¾»X1ËOÊwЦ«Ý_T£iË(¦õú<ÿê«ÿ3y:-ßj .MwÚÅ/`Ò‚3ÚJ>?þe3ø>£Ý®ëªš»8®#ç(ýƒøŽ}MÛiÜ·«¬œïë¡+¼œp[¿s×Ùª;ôôðày⮫ç5Kõõm]çyß³ÆŽæØ Èq÷ü/gý±:ÆëOÓ}ž°µÕ¤«jé:bôŸf‰Íå—þU×Úîè:=,`ž×¦ÆCE5§›Ú;¡#Ó?y¶—3ÕùFÊž:ÜÜõq!G.~i|ß^vçÚÅKˮֶtC]]f½¤ã =zêÓj‹™éÀqv$ó[0y„€ÛÆ£ÿ<÷/m{§#=ŠfžÎÈêô´§lÍÞ¬Ù'ÇWŒç=N}¦ò܃–‰!B àdüóÀ3p3³h s…Ͷo´ïÚ¢¿?²7ô'æyˬÁ_±«XñD5×åe–ŠæÈE}§¦ã É—g$Úã‰êï.O>>1)ØÞôÎ#rWqd·Ö¥‰oì)¢Ájîõœ†ô%åÞªCy/òNmY³«¤æøsÌ…l¿ñÕÞ`!XÍηW¦©hJ¶ê“D_ }AÜÒ-{g®òò[sàÔšîIyñ{oOq§ ;d¯8LÕ ðñx¬0N(ÿ0On*X>¿ðñ•´§{~{‚Ú#qïGRJŸ¿4¡pÊþ9¢×(EaqŸmóåÓ–Ë)+ÞK(ØÆ7Û­mÈR­?p¾Á(ß«—€·ÊzÛíý½-Z*âÂT¿bËöªàäɃ*ø Cœø8ú¢8UVÅ÷zúžÂ¯Þ±A*¢˜º¼å+×gû÷][|íìÔo*NÞrQöÙá9"° ¹+ßM(²Gnù4a»öOŠÂÊÑXqj«º®#_• Ú/ÕœªÖ¤q¸În úšê €žï:ZÛâ·Ü45_ÍÎÕñÝGŒrn­ok9u´fºdÒèN}VÎy ž»›¯s{eñØ×§ÚÃ¯¨4iønv‚ö›$v6Ü­_ëÐiR\5c¨ß$ÿNÛÆÚëãÔÖÒ1täH_>c¥¶¥òØYž{°rsúëÓW»à8Ôk ·ãú§-j3iÔ9Ÿ<®³l—ʃªÚžpÂÔä´þÍREªˆ²¸¬°½Ÿ„p¶|弬™»?QpÏÅÏ[oœìeÑ[ÌÍ÷7>LïEæó9 ©9@‰ä+VzÊ«¿Æ._Xœ˜”»$ÝoÇgá"0úã[’ÒÕ×ðå+>\+¡.ý͸sÞ¾T“ÉblæÎŒß;™Û{½9ý͸sOÊh¹wSµ}A|‘@IBÖn[ dÏÅ/Ü™W½º¤†ÿç­²ïþ¦6€EßÔ:~ÃO\}ñŽÒ/˜À²”oDbü\Ø×Å~Às>gSêá,ø3–¸n:ß\•“œWcÃRÞó>Üæ›óÁ‹±êíY;)ï%ŸlóÌyS…m»£%w4›ù3æM1«Ëë[-FŒ_½mCýt™bܽ¥°¹Z5'›ò˜Ÿø¡$Õ¶´ßßz4û ,%q+¶”Y@<ßˆÄø?öø;k-­ë_ŸGq'­Ý“À»ÔÕ¸ÍÚèIð‘Ï,ª±Y ß]|4`×Îe>”¥bÇ»›,Ë>OöÈl¿0eõ*¦jKwÏý_SÛ¾l4!iél·àm©Ñ>Ó×î™®Ï]þnEo{öè0[7ú_î+'—­ÞýÞªÂ%’/ùpcˆ°TÚþÁÁr š?å‚e-z# !EñFP´‰Q€-­h1YîÄÉü^6aÏ}¼W?S,tv‹³¦²Ôõ«,^aó#ç˽„O`˜™ V¾}bá¡ä)ëßGJ}ñnž#gîªËÑ{?”sès—¿[±ð‹äž™;ê°5Åç(ÙÖ‰\¢7¼Òž3Ì(‘Ú#8Ä–pñ ô¤N\³\­Ý(Ȥ/Âϯ}çãê|·oØ’9 ß>ôÚ‡ç{N¶u!³Åd¡¼f¸Qì™ãš³ S¼Y“±ÙÏeÉñ½óT}Æ‚|®÷µã•z‹±™š÷Ѻ¹Ä‰Ï¨E³’wWï|{MÏÄÓƒ­szÌonޱ•zÉÿÚÙ«`Íz3D<ŠË¥Às¢`©­Ð‹æÈøé©SmW[º ¶‰‚r”“©öÃ=W®ßi»Î@ÒTSÞŒ÷–|,Ÿ#ª=¾ÿFË)íí Û wúëÿåÎá8:¡ñ\ÊÑæN[EÃ^UN4`s÷dq36`Ô•J-\Çx*_ £ÑZñÈEò{ÁʼnC;h¿Ö™ŽdjÌEÎÍC?=uªíÚ1ííÑ?TÝhqÌ©/ ¹}ú‹cû­¡Ç-Ý¿´]€`ά “\º¼Zol=Ó^uþfÛ8[Œ6öµ—cÇ i¹øïõGZp«¹¥s §éÜÎ>ÂOó.5˜ëµ·NçÂØÑ¸•_Þp¦¾:ù¿Æ8uŒj©üR×^[ÿcçp›§ÝÇ¿ÿš˜O;: é8}¯-'[bsää÷#žwº~Aµ·ÁÜÖbê„km­†œG¿ó§)NÇÔü£»´Ìérãœ?r틊1/IÿºpÓ„¡Ó_ž0~ÐúcV~Í5›èN’™/)nµ˜Àaè0î î£g¾ÊåÀÀxå$&c­ÎÒ2 ¦ÆÖÚ;Ì-] õG¯vôô?Éç‰mï¼= 0¦Ëų²Õzlî¢Ä2¾«×ÊJ>–}¶?„¶¼l€5dÁ̵ÓE0^°$½,ì#9{¿åÍä̰ݫ}ÆDìÚ»ZÈ,ç6-ÙràµÑ"€55QÁkw®–ð¹<êíW–ÐÄ¿{hÒê>[½{}6õþ½ãy°Tl[úAaÐþ0{ºØ}™ŽoJ½’x Yè/^µ½tòê¦9ÌŸMç‚Õkê(WßÕ&•öÅ9S׳¼MAÝ¡·_?hÙ±ó3ŸÕl›Ÿð÷†%t]–¬ SoñÞñE¸€E=°õ"ER;eõŽCb>˜ŠãßÞ¢Þ¼aEΛ¥Ñ_«¦ô‰T™k&–Ùb9.ŸbMM,%›¿uÝ…·×옒*+ÚT”˜Ôcri*ÞYÄ[ø‰ŒÛ§çÔ¶U~ÀKübÀ²¦>Æ®œ"ɾZ"âL]æ‚øL|ƒäüöU© ; e|˜ëJ4Äa®.]úÖES_YL‰Iw•bKUsV•ZÆÎüpWïÝŸÚCéec–í󤀊S^‘É” %ù·ÿy7ë-xg^°ÏÏ7Eñ˜µÈ3'[­—‡‰˜º¼Ü3(äf IDATÖ D;“Ô>êXŒ×,”'ת,Å墹Á<8Î4?pž;c¡`®†ÖòUo„PàJ^œ»:.Bú`kôèÀ—Î[Æóìáöòæ%ïºÆŸ÷Q˜è>{!ð]–¼Ä‹}þÊ¥›Õ!ü~·¦ ÓùL]úë+îød¿/×|êýÙ»/z±ß]…8‘80ŸÏ9)ÆØKG>’vVC…Ä­U¯z/¸tü _4Y»c:¬È›«/,m ó a1²0›,SçÃÑßÈ3V~&âÒ€®pé‚å!ÉA‹ž}qõ®^.—G/`*‰_•)ˆ›->_•É.üèð‹|°µé+Ö§Ë¿X=˜ç5áÙ Þž.‚©#Q{£]Óx£ãxƽ¤;¬±±Ê¥¥à{F'7h³ ]Ì×h¾œøñå{™Ã[w#O·‘\Whkm©o¾›ûê2wº9ûiEÚïìÊpÛÜÚÀu$ׇ~ÞhCKKg;p¸õ>·££Õ½³?ûW™ÓC"GC]hЉ.è'¼ìK® ÇZŒ§®®v.Ó'rë×ÛtV:VÙ£æ6Àrh®Û°!N@Ã;ŽC]îåâœ8ÎC³Õ’&ÆêG>€ƒ`$ m{g Óö¡³ýêÖëwÍÜ g¯qÓËËO5·–ŸÔ”€Ëô9Aó~Óqú§ö×1€ÃPçîô&ÐÑÚÒ\¿QŽOѸcª¶¼¾ªˆš¹!uo°äaßB¢øROp=ÆR–& ÌE5ns}¹À/ç vg—^ózG&QP¸gú§WLáž øÞ" %òàµ6˜û®‚âŠÆò€çìmɼh‚¥?ºw{ñ½‘eÍÍ–ÀV(°7‚ýî=eÙêÝë?¦¢÷Í÷¢ÑPVZ«c·/?cİ ebìé®Ýå碲ÆZ­ji¶uI•Y®·/wû®õ›®M QX6˜MAÞ>×mŠ7%ðä³U&4kO—ÁY/Rô@,Úâ¬-¥—uͬÅd¡<Ù‡ï,üøËV¼÷fiÀ†Ëz¾Âg>Ÿùñµ m!¢‡ž0Õõë0Ð÷—“m>—™z¸²Ñİl}³‡™eµêsTÈGÖ×ÒxžA2Àp*'—ü|w{ápæî¢ôÂY»l¹GJ¦*<Ãê ’Þ]¾S´ÿî»(¦’ígço³m5œ¨8xA‘k‚"-µùÉï¿5'kÑgŸE{P?ÏpäËç|¼ë°6$B·÷8ïOì½'ÙGúaűœKY“nž÷Q´'°QÖç…³i °4$¿—ìuXÀ{Àœ¸Oßàú…EøõRhüº½êu¦òM«ÞÛâöÅÆîõûûv*J0κ¸ ’ÊøŸži`BzçT)¾Ô“€á%piðöä D"^‡Þü³ßS‰ÿóœÈÔå¬Lª© dzílNÒü=§^¶õëyÜŠf}Z˜•}~JìäñÑI˶ïxÖn–çæ!é°Ð“¸/è™ÓÏÈã-Wr¶'—×\³°¬Þ2ÂÄ@‰æË§Ü›° ¹IÛ›Þøh£/¦’Â+zãî÷ìÆ‰‰ÿÁÏk ޞξã\p£õËj:á0u‚h*}åX¥î_—ºÚoÜÐû–Ôa!Cù4Ðgñ‚Ycù6mîÀ… ôÍÏ8û}ê¸ÞATË`šs`7,évx.¸ÑÕbjk×¹“ù±\]9C;€v´Þjé„kK;¹py@;†ÎxÍo’‹5&¹Ón_spî#<0ì¥ÉCl×|{‰Ã#ÆNåN|g  c_öŸíÞ}c§ƒ-0¤Cïȱ·y[›[:ǸrºŒ7WÚi`QïEm61½ÖÇzõŽ]o‡¾zݨm2VVþ ii=Uv}–‹ñpÛ+‘mêÏj§!Ö¶n›Z§ç°OÚwõç‰^ŸÌ\¾òxØœˆù!ãZ¬eØŸKêîø,Ëe*P­Ï÷\›º3HLés—¿«±w­áÔ–5¥ãwئéðã>Iêy`{n°ÍÔo#Sû,1®ú⫪ò²óçNì^ºýŸ¾RMy°ÊvžrƒÒå‘­§=ð~BiP²ê3)Õ;ßNè¥S¿^áÆ§X“à°˜XŠïNõœµXØžê†ü%ÞK¾ð{On;rZÊ7ÅeR«>Ú%÷àYJ/̳Ñ–í=ΛÈOÄ…(:ÕÍ4+)¯fÎÚ{"Q"¹\´å@­^¶s¦×LZè1ˆâ¬¾¢8'ûï%:·à Ûæ†#‡¢ËÄ´@ʹW/¯©4Ц;ømÍ©óõ§Ê«}}öðõ®'¨‚««Ó%;£—Jûg _ó€Îº³iÿ¨Ìúòô©6€v{U2ÄuŒøym Û÷ü;åsõþ»¯k Ïí´Ÿ8våØùúÓµ‡Vf—[V07ŸßŒÐÒÞ ;ÖØÒùèæõ£¶†´/ÏìûGÙgÚ.`èôÁýŽé§¹<¸yèŸçòÿÝhì÷}Ë¥3ëw•}yáú­¶üo¤³3Àrêä¥ÃE•G›ïJ žê  õÐ×gòVî»Ðþ”Œ=e-bª>U¢ƒIsª–ò RÎÞ¸"ˆnl°€¢¹0×™Òvu¡¸”Åjùdzkn´ð|ƒ'ò)ÀTÓh±ÖHS\èMf;jÎò¾v¸¸Øjõaç,o.l/ß¿öÉW«¸™›25Ý· ƒ:=»cöêG:œ±_‡ÑÛ‘“5á!÷÷àæÆËF%‘7«óJ-`n8WaâŠÇPZõ9°Muz¸P0œ9^Ú`¶¶ðP­`r÷Qrú¢íÅüw–ܳÚ/è‹w¾7{áûÙu^‹ä%E+&?Ò)–†‹Í\1Ÿ(ºF˜j/^ë7”(¯ðy¢ÉéM²ÈÀ~3I{êPù¶´Hc Wÿ½V2Eh~fæž2õË0ä­\•iž÷Iêü»§ê Tƒ½in]¹MKmáÁZÞ¤ñ‚Û oX4…9ùUÛßê’j €i8ž}ýùƒëT¬Åš—6•g³SCÎÃD~Žõp>üù'Òøáì9¼ïª¾×™*š8p‡ú$øw4*芦¼ézùùfó°^é5ÂGø/{Ãùóï®TÖè‚ÏÃS>mô¨À€†7¬ÒÿÔÜ|ÕmÈóŽ×êÀ@WG`À+Šß9}§ù‡ÖT©m0pÐ_ÎCÿpÙ`¡lè¥Ï¯òš·‹MZ÷ à÷é‹‡Ë Õ:}-ÚÕ{ô°AμõiÞ˜èq‡‹ª¾oh,º •ýÎ?RtߨÛU¨xµ>÷„ɬ«?~µS"Á¿×Ñ=„/¹Ôÿûb]%z ÷XŸ™SÜœ81šwž6U_¼rÓK$v¹®±mauü?oŒjüò²æZãI†ïÇs@Cç34iÏ ¨åAQl]©-*¸g.2jÞï%Ésgp(®»ð~8Þ´ IÕ)©Ó§° ^ðâÍR¿ÐyGRfFpG„nI ½}gÔšøÚÔw§lcA e‹×GyýYÉ3—¤,(±XYzDèJå ±(dyæÂ®<.‡½]¥™MœÚå³ö <çmø jÁæ[7-Ÿ“gÀñŽX²Zöw‘iiJóÚÌ…SÒX€â‹N›0Êt&{yZ5CqhŽ÷¬%‘bPs¢ùÉ §òü°Å«ŸU{ÚÑ…òVÌô^”1…ã=oËfñ}¬÷€¼(å?'~ŒrÕ[ 8|W—¼€q`ÕofóWïëv` x¡k––/_>} Ú=t¥2TV{`U†5ú“YÞ"¬Xszáò´€Ï”!öÒÎ]Õ’%«û³çÖ¨Z·t×%}£Ùš:wƈР©±¾½:ÌšÞròB–E¥,ž»ÇÃáP6E¹V¤½¾nよu ÀõΚõŠ¥›cÓ6½='›À=d2R[Êw.ÏXneYp|dË2ØÒÖÒí¹&Ùún¯¯P{ÅP~1Ûˆu!ÜXüÞ[[/±àø„-ÛâG”dAŒHùnäW®›'ÇÞV"i¤x›uꛣìD‰öÔ¡'į–®K™aø±i6­¬—vn;ÂOé1ªç–5Z©­sC·5bÆöÌX_»5°ÕÙÉ늯ԙšÎ.šS4fÑæÔI˜søõ…€¥òЦ­ëL, Ê3xÎæ•¶Yìƒ;«Ûû^ä.³…åùÏ\¿a`T¹ÖÄG„õçGMî‘8ñ·àDÛBÞ’”¼*ƒÁ„÷ß:ã=oÃf…ÐP¼÷XC#•±$"öÈ/ûà‹å£p¥èÃOà3=TD=Œvvê÷ŽWÆ®ÝòÞ)Xn಴9ž˜s›ÞX^bqåøFgnáK¡{”à­‡‘i6>~ĪEsЏn>Çlç¹Á^úpkIË[>çÊ-tKf|Têj}ê¦È7­¸#Bâ“CHÌBè⹟þY­V¿à;¾û§_õyPPÐ}Š•——O}ý=>¼~õÇ!Ã^ 6íÆ­óEÿ:yËi Úš›5 7!³…¼âJ,óâW>.˜šì٩ذ-Þ—l¬'<»CÌXüîÛÅ3>K }œÃ-™ÊMo¤ñ¶ïŠÿól €íÕö¿y`Ç$q"qâ3ù°{B*?e#÷S*³‹ýä×7^uuµ···Ýo«««!Ý¢_´ÝjýwÍÍvpàu—Mñ'‘Ð'uù[rÊZîýÌÙsúÒX)9™ðô`«÷ì5'…<æÏ4”Vœ¹ù—™ˆÿ’m''„ÿ"ìgÞšŒÿÖjšo4uvöÜ¢æèè8hðo_7¾ûƒW „ß55йúP±òb;ž¿cáó®d@ ýÃ~æM­V˜8qâ¤^Lœ8ñ¹çž³]@ <.âac½ø± jíÁèòåòt-óȵXÔùù¥Æ®¿Kã¤ò,ݳo:ýÑÜ]—Í2\–¬yD UyùK×ßÑÒè|ã“t±¶ 慨†ScÂeR©,<&UÕg›ºÜhi`7¤ ¥Ì½=GwT©ÊÕŒ­WåE‡wýý¤ûk2F.W(ärE\zWŸÓå'F‡Ë¤ÒÀ@ixLºÊhsˆü¡Ã•¦âOãÑDEx¸400Neék¨âd1}~ÛÝÞ½Õ`QgÅÉeR™L¦H¾Óïúòxn‚"\&•JeÑÊ;÷Yƒ¥4Yw·‹ó£»YNWзì÷^#E#ïR(ZY gú[ð†8ñpb×ý8]Ñý‰v×2EbžÖò¸Úõ¬zUjœB®PÈåò˜Ô£z¦¯:Áè¦Æ„Ëd²pytr¾ö¿Ã\ƒ°Ÿy3™L'NüùçŸþùççž{®Ç¿/½ôRiii¿ª¿Õ°æ/gjà4vœàúeCƒÁ#½ÿo–Ÿ÷mµg΢2Ô´tNž£ýâþ éÔQ[ômÊ÷ øÂ‰NM§ЃBÿðÊŸ^îüv{É @û©=ÿïœBüþw§¾U^lwœ=C@YuÉéš: ŠMœü;§‡mÔžäí–²"ÍÁ³&c@s$!þ±!WtT–üõ‚õÓ ÀÙuD666кgóxåeoÝ'¾÷gÉš®Ÿ9ÿU3\_ØðÞ˜‘NÐóÍû'oâù€ì…#†ôjöúå 9ß\9ojÏ‹fþal°Àñ¶¾úûaÆSW*øüuѰSŸ.¨¿ÙÚÀa0Ø´ˆ¹Øù~oo=S¤Þ­¾~wgc#Z¤L’x;×^>VcmœóÃ#ÆÏò`Ï&­g¾9ðìµpt…oÏúÿ9}È °†riO™ÚAsíw«i3šÎ×0Îh:lY¸~8ÑAàë?ÑáÛ¢Êí΃E±1’à!ÏRÈfÔ6оb.˜ªœœ*Ùîïý¹SŸ©4/×2&B* ®tGiÁoàffÑÎÍŸ®‹i´¿ò¨ê‘½Ñ Ú“ç#Søsäy¥ò'+hÕþ•H.¢{ÍUS”d;ŽæúB›;?níÑCYá;ˆcòJcîNgdûˆh0š»=G—¥(óM+Ê— UʤtUUü4æüäô†y‡ Â`4é36M—Ò”‡|åîT }A\ôÆœˆàd_eA©ò¶¢q³ %4ôyöŠÃ¨ÕÁW,xÁáéùáÆ‚èÈÂÇWÒž:¬zcrñÈÔ‚JŸ¿$:9_’-ê³Ú#B¹/Í_@[4éÑqÉ…Áy Ån Œ.7)q¿ºÖä1æž8Á™G³¤ôeµÛ7z)$%ìH”ˆ¸0ª’g+Ó/„¥KúUð†8ñp"ô‰I9êª:ª›ðü°ÄÝ©Íhóâæ'åJ ĪúG×*/LÎ+ˆÑåÍIVIrÃöêlÈIØX{T!¦õGç'¥ûJöÿÏÛŒ@xö3o7oÞdY–a˜¾þ½uëÖôÒ~þ²ÕU8ȸQ[½ãŒÀµS¥)_ékœøá/‡ºwÖ]Ôl(4²wƒk›PøêHLó±Cgn9{Oy<|GFLò• q|òv :ËüóCµ©møÈ·ÃGúµ[Õß~ÿá…[@gËõ6á°W%#_õâ ¥ùÔW§îî,møþò‰Æž+7CÆxû9-úo h¿ñÏ 7‰LØ;ô`ëÿ•rðÇó¦NO_ÑÄçŒ?ÕøqŹ»–¾yâÛÚÊ–N[¤·:Ž‹B%Ã%î7L†ƒÎV¶ßG÷ŽÚoJ?P_¿'Ï‘|ºí†½uuÇÇg kZ=ƽüö¤¡.7L…û¾ÿözo›tèU¥|­Á‰úÊ ¡/v6š*­}Ê|«!'÷â)S;\‡ŒGëŸíç«[]ÑiÔ^Tî©Òàx8¢í†>§è*ûŒDmš‚ôEäü`4“‹M ùI3äqyU¥ ²˜£¶5I¦4AS`u²L—-—Çåv­ZÔ¹ ™L&“…G+þ+O¹¿¶áp\d¸<:]Ó¬NïZfôG•1á²ðpYx´ò¨žmº\˜­IW[z­7§ËeÑ q÷\ÀhR2©­½[¾„Q'‡Ë“S£eŠ¿ËŠ‘ÛÚ$×UÆÈåryx¸"1OËô©‹ý€G›¨ËåòpyWNÊ¢ÉMP„‡‡‡Ëdò¸\m³zãZµõÂÚááò„#£M—ËÓµLwåáá1©yYÉ1ÑÑ y¸"ù¨öta´ÙÊBSmöüðpy\®îîÒ~oë=X‹*QÞU»+ÞRÓi¬¿É¶w•4N#¦‹Û„ͧöè[/×Öµ»Ù¶Ò9‹Gÿï†QíÂÖMß«;šNÔ;ü_À‹Þßè§‘GÏ;ÕO¬Qºö@Å·×mA‘ƒëËc—6®éøoÿa´„Óég½šròæù3M-c<ƽýš·ÑXYo½1Fµ²ƒ©»Þ aW““‚ߟÈqqrtÐöíA ‹ðv¨Ô2§N5Í 1œºÐ"¹Ø¹E÷¯Í…×»ìè4Hþv€‹JpöŸ2Ëõ½É僒c-†Âê[ã¼»¡3ƒ§wvvrvurŒ‹ÿݵú«ÕÆ›70•×Z«Þ ¿}éÞþí…›<Ã'§NtaëÕñ»ô­€–j퉀ï7m¤Àéy—êos›¿­¾5QPÙS<NÎ.7¿€ßþƒs›*?³/³7ªO1€£pyü„qºÞy{x¾3yšàvbó÷ÁkC¸×N}÷G­mFk+†Q¿â¡Ç5Å{rr‹õ‚ÉÑó²ŽHm+¤þ+WNVeËöåÉ`JËú˜EðåkvÈD0æGÏÈ(Sì1G“ |² ²ü¹0jTµ2eT~‚%õP²/ 0êý·'8û“66Då©ä"è â¢öûæG_–˜&ÓU‚<½8*O!ê½ä¼&=\‹Z9C™q(ÙW³£ YÀ…í£ýŠ‚€1éé°•y+Å|.—^8%€¾ a~¾de˜€Ñf%íá¯Ì+ðç¢VF¯Í—å)ìéb7áh<ªLÕ„e¤‹}~Ìü¥’• sÙ„‚£2.½¦Šä¿r¤4gú¡Üp.FÛ½|—‚ú™›•ßc1»»=ïí0v剣R%ˆ¸£ÍŠ^’­ K«7.ÙC­Ù§’ `Ѫ4DŠôÄãѳ§H‚E“45ëŽRLibø’ãÖ‘i;îMêö§—‰ã÷ùÒ@Åiߘ *?wãülÖ'l^lL¸/÷© EqDŒonn±^¦1Úýû-“Sƒ{7ÖC‹©ÁBùpmÊR\L:+ðà\¡±x¿š+‹õ؇«ÁZ¶dŠ”W•¨Œ‘pûÑÒ¾|IL<ׇßM!MêŒù‡ø“×ìˆݧà=ðÇħ%ør¡Ï‰ÞX¼C.èukÚ°C&`´é‘³óƒwçæùs-ªyvqŒT!zª÷SâÄ_§-ê=Ç!Y#¶æ>’v])Û5kŽÏ›r|Ìä1h+3ïÜ”{ÔɈ|¸úÂãº0…˜†ÅÄÂb²¶ü½I IDAT>½z™?yå¡—ôùÑÑea;d‹ž Nޱ̇Ïåré°¹ŒªäùY|¥B }~R»£@*£ÍŠNÊ ;”ØŸç5á·¼=v† q´`Z´ŸÚ÷õ©»#•iîÍGÑ‚@Kçõ[O±ÑööZCs]K×Ά¶6ë`úpëÿë–¡bÚÐúÏ%9Zppq¥{g“\„ƒ‡rlág÷àÖÙ/D4X[ãrõ14A ··Z¬Í5wï7ÚÛÚ¬ 9®œè‘ ׯߩÊA$äáØ ;>>sâ§Áƒ[¬{›ñ§‘Ã{Þ#oØB2ÓÅ÷ÿrñ·­× è!ž£Dö¢—®ºæ†¡ð+C!Wáÿ.òïKæ`@0tä€Çï9Î.]ýÔ€ §+]Üö+wŒF9¿ŠØu$\ü°«³4_â#®XL[ôXt…ZQôÛFK¿LèìÎ4ÅzßX™È¶ò回£1Fù€â‹}§˜µÛÞ¶©êˆÐ+ŽE—n‰ÙïKìCÔ ˆØ}RAÓ€EW ŒITú¤K¹hªGßàú+büïQÈ?¹àL²±T9?n£èòv$qßNE üm‹ "‰ŒŸSVËÈtÏ[ÓíÑÅÑùøpP\Fÿôĉ¿>'2ÚÜ„dmXz®}C<Šv]—höïÑMÎ<ÃUççääçìQKmÅ{Ö韙¾1!<‹åŠÄbÆBK8OB³ÞFcÕäf¬-Óê-,Û`囀(iT˜äîÑå¥lÔGíXãÏ…QUp¡Á”½$:+Ä&ü?¯ $x{Š8 \xý>pÖðÛçV´;z8áF÷«nÙb*'ÑÎÐÙCö¶[mmõ8p—$ÿS÷ ¯ß ´b`¸bl`W¨ÐÉ‚ãl¨>¨e€!ÿ›øj0§µ(ûÛÏLýÈÂ_\_xãÚÁ‹É¹\ÇLþìž ñç8hì¼a¼Ù®k;Sk€!CìœëqíÂå7þËiè­ŸÖü¥¢æAºv:ÚõÆ6 ¿gÇ©‹€nÂUû‡‘C»ºC'8WAñÐÒ>2eÅÈ©ZwõÛSúºÃá /¿Ý‡Ì.íÎÀMX­7Ú1Äéðaœøl@û¯Ü铳';n~qDTL”Ü¿¯ÅZ–±Ï<ÇË#œeY€¢ŒI‰ù>ʬ<™ˆÖçEÏ¿`7ØQ­MRIÍ횦[À—*w§vÏ61ý=öˆ(ŸØ¬KŒÉ‡iÊÊÔjUvtz~ê¡tɃU¶ÓÉú¥Ë#[O—›¬’¥§åIЦÏH^áÁ§XSWôg1±ÿÎ^! X‹…íþ Öå§«|â=‘4ìÈi)UÆeÓ+wìs-ªù~»N.Ë)æÎ;ê/âB”˜)2…'﯊RÞ‰ÉÂ<6À’1š=éU’•©â~gôêÂÜܼãzQØšQa¹±}üÝ®d^»$§˜¯¿à«¼Ï[OwÔó=¸]×l–µXÁ?`ÒgT¥Æm¬•ïÈêŠN©‡©¡k?)¸b™ÂwcºÎ‚ûÏûûÝ7¹£,5¡kfÜï‚¶ßw,‹Ç˜b'>N´šf%$—ù§ç&Þ?ùÚ1šœ&"O*A”åÃÊççjâ%Ý^6ìV'×W¡ÌUôyŠhÈžô[‚ÅhÒã66Äfe¦ú ubdz1gvâ~ÎÊÝÑ]7;–㟸㞭÷î(!ü†ùýΛӠi¨ùVs ¤öŸg~,(:û×Â+7n¿µÕV¯ýðÐé ÛÏVgu<|€¶š³›?;µáã‹uÝè]†9TYó`8¿óvPóåwË?>þ~®þN²nÈËÞi E¿»¨êÛ3µß–Tî=pú€¡wª³íüß¿‹Û~¶èòk]s ô%óñO-?fø×Þ¿W¶¿gòáøì„o"i´rGÁ‘T_=?\‘˜Õû¤=®mª21,Uj=Ûç¼…ëæ«ÏÛo;ZÑ¢-ÕAñiKCCÿ0¾v¿JzÕ ?Ì¿_gB°,ÃÚV rµ¢‰Àj²Ð¾2‰ˆŒº*»ã@ŸŸ²Q•~ç¹ì&¥TYûmÇŠ1zµJóo3q}Â|õ99]o{µ*•FªŠò‘)b•‰2Z§³‚¢9°T™Òvu¡¸”ÕfùdzcÑY¹þac4`ªÒYl¡).L;jFøêó‹u Àh‹óõ¾>\Æ£JåÅîC+¹9‰Ù·ÏÀ„ñhz.£H”=Ê©½:ŒÞŽœŒÉñd©˜ Xt €‡±çÙ^~±èÔj#W$¦t]o 1 Z=<üù4Œ¥GKm3ZF[°¿Š/¹ý¾¾0½€gÎj¿8 ?š'LÈÕúÆdÉÏJ”KiFe©Õ˜¸|  ù\èu&0Viz %Ú7*ÆCµ6£arlïÝvöÔ¡ÅaVU¨±Ð«ökEmú•Ÿ•×ëœPF›—0?˳;3æÎöϾj°§‡¶´K‹¶`–+ñç÷ÝV}âÉϽ}‚ªEsT¥52]q®þR~ÿ:k±½›d,Í-d%r1 Kór úyF_wˆKNìucÔ$G+«ä™»ï‰ÜôGssmçð>²v6øb®éx™í8I£NgñðÑ}ÖÙõ¥:+9ŠxÉY+íedKÃöLƒÖd×ÔÆ£ÊäRijêmÝþ"MVŽíµ6ƨQ•>É3 ¿rþS™7GQˆtÀ Ÿ•*kô5hŽ_ÀÐÁw3oíµ— ƇÁϋޞá7Ò ÷Õi#Ëþ^[Óh8Öhu xq\@ÀÌ §Ö25:«ßËüÁ7®ÝxÔF{áò»·ç\¤9|Átþb3—ÁC$c8”Ð-~Ró_Oš*Ï]iñ}ÞÛõºº¥¿ õîqôrœ$²a}ý¸%«œé¼»èÊy­¾‚çGÎüÃèq€^§Ã ˜_}ú3mó‰3mcøÔ?hT;ûEL˜yëìáš› ?1^ÏÓÆŸ8Ñ.xÄ. U¨62pì>L.èÕ;ˆ^æqêê µ €³ëWecÞöv¦Ð‡Ì^ü?EÓ_ÿ®¯«©o}^8ÒF{¶úÐN|Öb8±4Z)ft¥ª^gÇÓþ1ñ> Kf”r(®Ht¿ývùeUJr¸Œ¥iðƒ—eJýÃæIó“Ãe\qXÚöðÛ׉£ÒuÉóeé h‘,1=J ôg%ÏtÖ{À|‡ö]柔4CÁåsùÜÛ.äJcå{#eé|ij^j·ÕwAøš•eIqá¹ hQØÊ´pmnR†5fwŒ¯k”e³“”’}é2£ÉÉ®’¬LíO:Êx4yI¶Fß`²&ÏPˆÃR3|{ueo9²DEar´bŸËåÒl—äÊtErê ÙZÐàŒ‰MOW¬ÌŠU*gËÓ9D2ešB-e9q“,, ®OØÊ¬x[šÂRšžc ë¾Ý‰–Ø+€»#^òÈkàÆ‚¸5,¸>+Óüi€–ÄÇŠ’æËó9\˜k/Í/š¬§[¢í-èÛS‡–.[#KI–Ë,_šnÜ¢ÉIÏçgÅöUûsÊ¬ÔÆª¶;}ÔŽÝ ¾vk`´YK’‹uµ&“:N^蟘™*ÀZ–³$)É”,!3ÑŸî³-À~ß0©s³ó]'¨Z.ì߸1ÙIJ FÇf­´MXÜ©X]Nœ<Ûdaøþ1i©.À4çdW%FÈ}ûá«{d Nü-8Ѷ—[ÕÐ`Â’¥>1YY QCqNqC•>Š-ÅÛqHé]av6|¢ÂEôÃhg§~ßø´„µkã"s)XnðÊôX1`±['£^§²p¸>ÒyY¹Ñ¾O&ïÖÓÈ4“˜ NŒ“rù\>×ÄÚËfo<ÞÀò“"‹Pü°´Ý‰Ñ™© )J¹Ì€+–ŧÊ@ ØxîçŸV«ÕÉ=[Ž<tŸbååå3gÎìñá?üðâ‹/>ž<]?àìõÊŽ·‡=KûèlÇlÀuä†÷ÆŽüO„̬¡òâà8;·3z©ŽÁ`IÈ_#Ü(2ž2Ob\üa´éÑÉH½ûÒð 1cAÌì¨};Âç 2RÉßÑ÷I1Or`þ‚mÙ¢Uœ|TAg ''þêvOHå§lä~JÅãñÈ£áÆ~Áãñª««½½½í~[]]MºÅÃÑÞTTbà1ñ…‘ÿ©d':®M5µà8ÐOâ;‰Üÿeèò•Y=¤¦ÅŠ• R.1á).QìÉiVÊWMƒªJ“ùËLÄɶˆ‰ Âö3oƒA£Ñ455uvö|÷ÉÑÑqÈ!cÇŽuwwð 𛇌  1q"q"Qù“ФXžmú̼¶··ÛýÖÑÑ‘ÃáÛ@ Â8x£(Š¢È–:@ @øoÁ˜€@ @ HðF @ ¼@  Þ@ ð_B×%MMMO¤º'Uð,AÆ@†8‘8‘¨ü àææFºâo"xûÙyÈéÃO¨ᙺ·“qA !F N$N$*ÿ\¿ú#ù·g²m’@ @ HðF @ ¼@  Þ@ @‚7@ @ à@ @ ž%œì~ús'«½ø¯ëM掎Ž_9::qsó=þ9êÛloúlûÉrÆiü§ÆŒpü¯3É-Cú‡gj1púÂßËwÿ¢CWøu†¶ÿߦèç]ìm»rúÏŸ7¶» ÿ€áNOQÄï?ýfß5<ÿÚk7 k:ê¿;¶¹‚qýE1̹?µš+•»k̲èCF Cƒ@ @ø5o—/T8:<7qâD»ßVUU]¾Pá7vâoÍXG óc§¡.ΤãžLÝ‘””Œãðxóã/{ÓV‹õl¾Š$`-›™á¿í@¼ç3n:½*Oýâ ¹'€©ÜôF2»åàjÿGYd2«—ðÃ"ý9Ì‹fˆ8°/â‰ýjSStøJ@”LØû+ãÉŒå™Çª¬àz…®P.“Ùo³.wÑÂ`ïü?¸ùXjºõœL¿CI[ŠjÛ8“·NG­Û¿ä=õâiã¨'lt¶®`ë¦ç­X¸‡,KŽ—ò€º#I©¹ê+Vkø/G®PÆËx¬fËÜE_î í6퓽+üa¯ø“À¨ZµhÛ¥†&ó˜5…;&qìUÒ¬=oØmÿÛîöî­«zתµ…—, øñi˧‰©ûx‡Õ6²‹æ”pÝB7¤…ì_í¿õã(!ñM©ÙªF<Ùâõ+dBÔd¿•tÖÇj0[MMœ©É›Çqî]oÎ~+鬨‹2Yï^ÀTfÌN.2(qØŠ-‹ƒìÙä9› õ®U•Tñþ´Yzê¯*3X -£VøHÎ1o]—}Þ –¥ü¢7$Ïð…}]ì<çòÖf©bÁ‚7yÑú•“x–ʼ”´CUV0,å3sý¿¼u筦ʹӶQ> >Úâ•÷–[vÅ‹¯ÜQÐljâMž`Q•×¶XMµlËê0zé`Úµ©°©ŽZ:}å9kÃzqf×Ò~oëÑìƒT°–$-ÞTfpý¢7$Gû³ÇÖm«¶¶¬zc&Å»bwJ÷nPWTå>mÀW):XTe ±¾;ÿë íÛb})«zë»k­±Ÿ¤„ºe2Î,[êÉTnºÝs†ÿÏøÖϯ˜‘º0Ò=tKf¼ï¤»'ö/zW}¯=»u˜Ík/õ”“Ãjw½·´°Ž@ e Ö¯ VíáŒuËõ,h^À;kÖƒe­ EqÝ(ÚL€0¨+­h5›XΘq¼{lžýp¯aª2TèígÍe™«–Z½#fÅÌ’y?‰I•¹`ÉÜãs§M l=çpæ„;y޼K/Åï]/ã0ì_ô®zΧiÝ39vÔa«ŠÏRÒÍc8„aozgX9Cœøu¢pZÚöPí¶¹Ë»}&šjKHÒ#|8y¦¸G~{`-W ¹‡CëLõa«z×fæG‰l.·Õl(;ÃŽ_$À ŠËnpüŽg8:x€SÜÍÕëw_¾ÚÑz•Á¨¾_4]cÀÉi oˆ÷è¦OsnsúEnŒùRñÁÜ=*_:cÞ†R!~ËVHK>”~¼/Œ¶¼¬5dþÔ;& a>2{AvYÄ2öX’²È'õ@¦æKª+BYÒŒüë†]Ë|)€=»ÿög¿2C?ýãï„0Å-~ÿ‹ŸFoò¢õrOÊròýÈmÇ¢¶GŠz/Z'­ÂrnÓ[i9»–ùŽˆÞ¾w™€XÏ®]°éÀëâ…kn BWl[&æq¸ÔÜ)  ’ß=Ý-ã`jº—ïRPxî­[·},屚-³RþV¶À“î­Ë‚ªM>[?°ªú¶^ŒðA*p–m=,âQ€¹8yî&U辈ÐÕ‹óÞ*ÿRÐ#ReÍ,%ìŠå8<Š57°”tÖæ•çç.ß)-Z[²!3¤ÛäÒ\¼­ˆ;ç#)§GÏ©n­XÇÝðiŸeÍ=:Œ]9…â7W±@ȘšœÙÉ9Ùjñ¹Œ¥©ÕÛ ¥ˆÞ§à=ðýbÓxsaÈ_²p£*hG¯×­iõŽI<¦&û•8{e IDATÅG‚·~´Ïc9ù~ä®có&ôº«''–syǰzÕ xaI+TKß -5Ù #Vl½œ÷°k8^ó¿ªÓ[)±4zÅâH_ÊZe¥ø·Kpx”µÆj›å²?lzãõ p„YìêÅ!O$×ÛÈ“—|!äЀ¾páìmåai!«°lûbo>‡Ã¥Bç0—$/Íá'EŠaÈWæ°s>82¶:{ñªlÙ§Ëúó¼&üvƒ·'…‹÷Ë“ÊËO6µ”ŸÐ”€ë¤é!3Gô! Íq<À@;sµ@{Åáo*îNl˜Vt4ªË2T×oN.õ]::wÓÊy Ø6éµß¬¿ÖrõNs-°\e`аá]çs89ãvNq£#F=ƒŽÞai'Þp·®-ŽNœáƒÑf ÞSù5pv¥»]l®8¹â®>mÍ-÷VêäìN­°/j3¼;¢vK@Ý×&í×ê+ÀëêÜ3´prç9€ gpLcKzÖÜúýßOî«a‡.ô] ô’ ·oý}ôw=ÛOº ÷X¼—›_ ~aä•šÚæÆo¾iü€‹û¼¹$¿Žm“Lå¦7–QSWgî ?ì[HOâ%ŽçHÊÚ`…åJQ•ûŒ ~à’ñ€:»3K_7z¿#€0$Ê+{çes”(ž§@ =¹-u–žk  8‘<àú…úXs.˜áK¾Þ›Q|Þ`bYK“5ض,JyF¼êwÁjw­úŠÿl–7º²Òj=›±è´mÃ2”™±§ 8v—Ÿ‹Ê®Të” ÷Ø_)¡‰åøøq2¶¯Z{9düØ Ù!`íÛ`] rGð8î><ß‹ÇVšxÒ¬=]úg½áU°êŠs7•^Ò7±V³•òb¾³ðÂ’×—-~ï­Ò ÕÛb»¿Âg9—óacÈ–0áCO˜jzuzËÉ6Íɨ?š9ó\p­³¹áF38ƒ´·Ö·Ðî]ß‘¿æ¢úFo®8ûÑ¿‹æÌuuÀµÎâQó‚wéÓÞ1p¨#®u¯Óá~¢^pn¢ÅÚÜŽAÝÖn:r›¸½0{„aßù›åE_™ð’ÍsZÛÍm9¢ÕÚ ´»«ãðÌ–Tk»Z}¤††Ì["qmU}rìp“}ÙÐbûOçM¸ìô@iûÄNåmF.‰ÙxŤ»ríd…þ§ÖÆ\n•H\~ ãŽö[öÉïs-91=zVب¾VûöiÉ@=Ÿe€¢ÌÊUù^+2·…ˆ(ÃþEïjì]k<¹iyé¨ [»¦éVð‚“>Jí~`{¶¿ÍÔ‹1™=–—~úEeyÙ¹³Çw-ÌøjõÊ€«lç)×/]Ùzºï§”†¤)?–ð Ý67åzõ wÅš-€ÕÌR<ª›ä¬ÕÊvP×åo+ñYð©ÿ“xrÛ‘ÓZ¾6)‡ZúÁv™'×Z2Î!»mÙÞcÜY‡ý…ã3ÝÍÓRUM_qW$J(“ 7¨¶À’±šƒÙUc—mðìGqÖ .ÎÛó·½{èê-3Â)rcq_‹ß™À‹žÊ¾Ÿ£â5Tz¿“Ôw0|WO¾;Çr¥k½€µZáêù€<йdãò ÝÔno¬¥¦ª+BàxÊ^÷Þ´½Î‚ûÏûûÝ7x^ìÚ3ftÍûû]°…í÷„Ëâ1¦˜Ä‰Ï€톦KRËÇ(?êkã_Ï ØK;‹ÙˆmA"!D 6û°³þtðRü¸nDZt³Ÿ+G <'‡yfXÊÛ‡ÃVÝ^ⳚYNWÊ”²Õ@ ƒ¦rR*Í=£ÙǤ…E1•Ù‹¶ÞIÝœêÇcúÜOkÕìZµŸ³ì“éž6X×QËÒîÙÊqïŽÂo˜§û;oÍO¯Ú^öùù«?ÝÎ2q‡º8;9»»è<ÿ]ÅÁïª/µô޾É$ƒÔžÐ)¯ýþÜß|wöão®4·;tÐþïŠÊ#ßÛw‘yLñ‰½ÇÓ£ÏÚ[¶³ðtæ'_ÿå›ë­ý*ê(ÎÚëÿõ—¼ïsÿ^ö—íª}ºÛò¸püFš)vZ¾)ü±±Ýñ¥àá<à¦îòç¥?|®VUz1÷Ë‹Õ#þ ßÐúcî—gó‹þõ»Qßlâ4xèø)“\€Öú}'šÚœÉF»¨=Z¶­°"óàå«€ÓpïñƒšÃ€ë‡¿:›ÿÏ+ÍptëÉU|ÝtŸH„ãN¸ù¿—íÌ?¹MÛ~»=´û¬¼­²HõçOÏ©ª›Í]Ë¡+ø«€M˜±&íÀ—É‘üs9š97iW¹±ç5Ê\ÕİԜÕ÷ý*×+Ô§ñÐÛ~zkui¥¶z”àšÊ«Þ_jCÉžJÞÔ—ûµÄÈv½ËêŠóªÜ§IxVS å# Q€¹®Ên×0IÉ4D­‰¿½5H85:¾ëÖ Œá¬ªÒÜcq½B}swž´1kO–èaÖœ¬¦¼B³â×,¡¯ÔYAÑXjÌ黺PÊj³üãYµ\±rýBÇð(À\uÅj«‘¦80˜-vÔœæÓx¤¸ŽX­êˆÞkš€¹8mÓ…×?úb)'gmŽæöäèÊÞÓ¹ì‘gìÕa vädÍ&xÊ=¹€åÊ% €ËFYT‡J­`©;«6sD#(ê¬؆ÜGñ)O+­³[]x¸š?îöQr†¢ŒbÞ; îÌYí ÅÛÞ‹œóþžïyJ—{¤s¬uš8"P|ôWÌ`®¾ÐØk(QÞQ3…ÇÓ²¤1Á½f’öԡIJ¶´Hc`Pý­Z °M¿ söŸ4÷J Z²4Ç2ó£ÌYwNÕë«{³Øšò.¬Õ…«¹cGñûn«¾aÕæåWZ»þV•hÍ,¦îØžsÈë_§b­¶¼´¹|O1;>Ì“Œ§å÷óaÖ]âÄß’{É /^7;­:"õÞÈÍp,÷À1}ŸðFr̪3̵W¬^BÚ¾<#¤TÙÁ=ÊTuã¼¹R…åFæòüóTð!ýéÛÅ %{ΰ>Ò'rÄK/#[ /(ذ 5f»¦6ª6¥œ Ú|{ß&oT„û¥ì½g-À+KJÍ nÏíŸjí=„/¹Ôÿûb]%z ÷XŸ™SÜœ )žê¢ºÚk'¯YŽößkŠïü>}ñp¹¡Z§¯@»z6h?ršgcQ]­®îûÑX§ŸêÛK¾ÂÙsyßTžÔ™4Ííê?n 3nö§¨³hì²?ºþîÇó ×*§A|ÙPçn»+Œ}m´÷nMuÓåÜsÂ?Kn_\ßXÀ‘~~ÄpñCÝ"¿¸ðõëéÒÕßôpî³-Êtê‡Mœøòiî‡Íç+ŽŒ–)~œ0àÜáòk•Ú8Ò#}½f¾6bW¡âÕúÜ&³®þøÕN‰Ô?fBóÎÓ¦ê‹Wnz‰Ä.×5}ŵNü鯉‹ô?5™tNî~C›+®õyåC{°ÏÊܽ‡º«¯•Ÿ7pr$=ý…_Ý8ОAQ˃¢ØºR[TpÏ\dÔ¼ÞK’çÎàP\wáý2p¼i’ªSR§Oa)¼àÅ›¥~¡ó¤ÌŒàŽÝ’zû:Ϩ5ñµ©ïNÙÆ‚ʯòú³’g.IYPb±²ôˆÐ•Ê" bQÈòÌ…3\y\,'Ï€ã±dµ¬ÿfâMKSš×f.œ’Æ\tÚ„Q¦3ÙËÓªŠCs¼g-‰ƒò˜ÍO^8¥ç¿øƒ-^ý¬ÚÓŽ.”·b¦÷¢¤ˆ)ïy[6‹ïc½äE)ÿ9ñc”«ÞZÀá»ò¸,àÜÀ˜ˆ«Þx3›¸z_·KÀ ]³´|ùòé{XÐî¡+•¡°Ú«2¬ÑŸÌòaÅšÓ —§|¦ °—v,YÝŸ=·FÕº¥».éÍÖÔ¹3F„nHõíÕaÖô–“²,¢(eñÜ=n‡²)ʰ"íõuD¬ΨwÖ¬W,Ý›¶éí9Ùî!k”‘"ÀØR¾syÆr+Ë‚ã#[–¹À–¦°–nÏ5ÉÖw{9‡’Ø+€ò‹Ù¾ @ô¨ËüÆâ÷ÞÚz‰Ç'lÙ?  $ bDÊw#¿âpÝ<9@H)Þfúæ(;÷e{êÐâWKץ̉°üÀØ4›VÖK;·á§ÆôU‡sË­ÔÖ¹¡[€1c{f¬¯ÝØêìäuÅWêLMgÍ)³hsê$¬å;SW-·‚å#ݺxÝg[€ý¾aVÌ9üzˆÂÀRyhÓÖu&–åÜZÒÀò–Ï9€r Ý’•ºZŸº)òM+îˆøä³ºxîçŸV«Õ/øÞ@}ýÕçAAA÷)V^^>õõ?öøðúÕ‡ {Ø”@x†ÆS“=;¶Åû’õ„ÿŸ½wkêJÿßrÙ[%á’D ©BFRåÛ •ÈÔ]¦çWb§Æ9J¬5Ö´´#Ø£ÁGcA‚§Z…j ÕçT˜g€¶6V„ GŠa PCÐ$\²÷àï€rI¯ÓÑõùÃ'öz/+{½ë]{ñì1sùo—/:”ý(ÇPµ;ÞÌ`íÝÏ ó)Þ Q­à­Ã¹sȈȈÏäÃî1‰ü„•<Â^±X,@<»8ϼùú±êëëÓoëëë}|‘[ ˆÇMSÑ®¼ª!;©=®¡óOº>ÿ )2åQšk®¬\¼óéLğ潑įç™·VsË?ôºŽöÖÞÞ¡ÇŠ¸»»{ûø BÂüØãï¿@<÷ q@ !†@FDFD"?µ^¡ÌÛ³óÌ›—·_ðawó÷‘ÜÝܽh@ @ þÕÁ†a†ÞpA @ ˆ_ nH@ ‚7@ @ à @ @ Pð†@ @ ˆ_ }–¼`o{,Í=®vˆg 4.4ÄȈȈHä§€ŸŸrÅç"x{,–nmmEƒ@ q@ !†@FDFD"ÿKøå—_Ðßy{¶AÛ&@ o@ @Á@ @ à @ @ (xC @  Þ@ âYÂÃéUš¦kjj¬VkOOϯÜÝÝýüü„B!†aÿ¿ûî£S]ñ¥ÜÄ=îi,ý>õgÊ3è•Ü·Ç ªu«yËŸi€Ño¯}}¾ï¯PÜ›ßç|ÀAÒù[§yŽ¨Æ ‰\V(5Þ‹Îú Ÿüocmg/þÛ·gúW”´ƒ¿øw»f¶k¹‡ÏŸléÿ9¢·M•»€óÊ«ŸÌ÷A#@ ñÜâ<ó¦Õj`öìÙs†1{öì^xÁQxXlÇKþYÛÙëÉö ô ôòÆN;ãÐS¯9²¥pFhàXÇã9Ó e(J–DDDDH2õÔÃëW[TTiîû\™ ’dž}ÕËTņ>Q:¥˜PèRƒfºHgëû\,ÉŠÌÓÄúbu™ÑÅÓåbB$"ÄòtË{T2QÄDI•Ô`Ï1”)¥¢ˆˆ"YK9¼J-÷}~ÜþZ¬”K$R©D"MÈìó9CQ²LLˆD"±ìqócÃ%|8£*ÿ¤±wÌÔÈœE nþ¸÷û¼ðÿ±+ŠÙvùBÞwWÎ[ºÜ8/òÿaz$Ç ­ùpiÝÉúŽöœ!$"þ3¢·ÌIãž·ÌÅ…g6tÙÝqÿQä­Ú ÝÁ SàŽM¼;)p”ËîÛIÓ‘Cç7tÙqïè?¼òîä¡Eió•Cÿ«?y­Ë0†ÍŽ~=|Éä1Ðyõ—C¥õ?]£ìž^ŒÐÙ/åcwvsÑ%Úp:!ßdw÷ýíäÞó;ÚŸþ»ð…¾¦#¥µà45uÉ$žë¸¦Ý ÿM£ÖÒëÉæ­Xþ*ê Ë•»ûtN™º&ðŽOžûê=‚#—jWfê¼ú¼ÿ­ÓZzÁ‹á‹lî€7æ¥G ÑÛÍïs4GÚì–¶Ú[¿y›ã^o¸qÞáÐXú½ò\7EÖ6Þ^à÷ó®óÏ?¾ý3p~G|Ål3üã@iýù–n;¸ù¼È{{ÑôH_wpz}€&áüŶvð†ÿ)Öÿו7¥Ìúf<„Ϫ./¯Ž8ðCróQÚ³TªU¶i±"ÀåV? †£ª¢…R çQ:Æg‰ÍŲ%.¤3qhívEy`zq®3­‘)Š„jÏe ¸¬òëŒ0nÓeÊ%‘j)Çæ´Ê JI.Ð6Zü§ j™U–-ÂïÛW§¾1L ‘”›,ä1Á¬Q,Uf^ˆÉލâSñ0"‹“Sò´uÍx܀γc’¤ y8¥W'¬HQ‰Š“øƒ¥sQ ÞrL-á üÑܪ¼0W],ãeP¯+4B•˜ãL9¸³êλ‡@üÚqžyëêê¢iš¢(WÿÞºukdíÛ¤{ Ÿ-œ ïÖn19|¶¶Û34Ší p³þJS7iù¾¿›Æ¤¯þ_ꑞ·ô„ðf¿èf¾võ³}5çnܺž»ïL‰¾£}”¯p*7tyþiwÞ8ÜüñðÏGºìî£CùÞcîv¦ÇXQ•ö½©‰b§òBGQ /*_i»G÷[®hIÜß €ê8^Xs†Û4¶ïìñk]c^äþ6ÄÛn±”©øòjÜjþLuñä5»ÿÔÀX!oº¯½þ2iwzñ¾]êiÓšÜxl7êü÷?+K,ÀaŒho¸xàò½L`ÖoŒò渃ÝbÌ+l¼ñ0¾áJàÒLäµÏT—µ–^ðñÎÅí=®ZöÌžàx8‡ÆF]s÷™ü›ÙŽÝ‘lžxΤ)¡¿™íà9ž'~E á¢M”ù—µ-£„s¦.žŠ·_»ú™ªÖØ ®®Ð$ðÆãÝ Ú³G¯öüj¢6]qf’tÁŠ< €ÒmW”[š‹RIÔu•I„¼Ì±äHU&òb3¥UDBr‚L&“ˆ% ª¾ÅB›V•$%‚ Ä2eÙÿ©•ÍGˆ%²L]‡V!î[¦ŒeJ¹˜‹ ±LYf¤(}¦„%'Ée2©X,ÏÔÚ†­7gJYR ”.]Jˆ÷“;ò%”V!–(Ò“eDD„tßÙr‰"""ÂÑsc™R.‘H$b±4Y­§\Êâ<àѪ’¥‰D"–ôå¤l:U’T,‹ B’ Òwh·oÕ’¶.‹%IÅfJŸ)‘dê©JÄbyº:[!—ɤ±TQfg²Púe‰¥1g…X,IPî.í×ÞýE°i’%}­K’T:€¹lkfy"yX,UTÚu%z^lL€‡ÄHyº’:ePÉi¶ž›6]*Q JÈQzU¦V˜(åðœ÷?Ù¦(h´hK%²L=B©*V'3‡ès€Ã˜ô(}¶\Lô—)v¤lzµB&&‚K“‹ @Ѷf 8“á8Àa<l Åœ&dšARÚœ¿FäI2Õ…¹qƒÞ·àb!œ/ fÒÛÐÎû8#±šm€3˜0qü¾Ê¹o÷quΙ’EI}¿¦„4¹HOõ=[ÅIé ¹8"B¬,ÿ*IêxfŠER•̩̚D"‹% ÙZ۞׈ç;óf·Û)ê^d»Ý>²æ9 ‰¯Þ¸z½ÞÜÕ>Šªm¹q“"$„ò' ÝoüD™~4õø·`üofûöÔ–Û<ƒ^N]âïÕÝ:擊㦒ú[ПìÀ¹ëgÎöÆ«=^£œ7¦âÆ^)Tsµ©Ó-pöÔ%|w€›wnëËŸô;nÝOí½>üI‹_÷ÃÀÞýüSøðËæûôÔn4p^ _Ax{Þ]{ùÌùvÓm¡34N¯O[8P“Ðúå'Ç;»Ûza‚û¿:j+ÏÏS•9se˳‰+¤a7ÎÕä_«% *«\Ì"Ø’-¹ÌE²E»«¤¹U–’\œ]œÆ³NÓèO(㊒lé…Š€ÒôOp R¶7Ç©5‹dI!Eql"9CÂÇmš$IfyœZʾä¼%SÌ›V¹H™[¨áËs‹&8.H‹“ü(‹Ù¨ÞÈg3™ø{¯%€±8iE‘pc ‡Òg§ä³7ª‹Ã˜`Ó*e[‹µÔ™,NŽæ2eº.&»8“`,’¯Ø^)ÜØ¼]E'—L Œº:Ì;lãaeÞÂB•˜ ”~`ý>jé‚|[Ö×j‡Ò)( â$>>\–Del¹2ø@‘Œ6kíÉýï'S˜| ŒÇÁÌeI‹¶—Ǩ¥â-Éù‹4ÉÇKÁƒ~ãõÕf²1ÚÒLá"yÖFí¢”íÂl¢DyH?@ \u.ß]ÂŒ? bñýÍŸÌì¢!‹Ùõ9Øaœö“ÇK/Lâ1(}¶lMŽ.&¯Ý¾&ÛòµFÄ›^£Ã€'ÍL>![úZ±0’g³ˆÒ³ïEU&‹×œ c3r§ ™UüįCpÕñyn±Ô )Rm_‘CÇ,—‹C˜Ol(òcå!*U¹‘ò(}Amnzäð› Çfi¶aÁL‡°Óª¶h IDAT“ pÿ\¡¹¼@Ë$âýèk¬Zóš&?2.Y)2Gp§;¾ÀÊ™ÁìéÒ­8ÚÌž»%7–wŠƒ`OKÌH a‚±H.Û^™+á ûiJË%8”>sÁÒ¢È*uÓ¦I’ä”ËERÞý=EFü÷4¢M›„[øø Ðu[ˆ¶Ó_“´%™àG¼eˉ ¯˜6w4ó•Yw~)gXõ'Å0%³çn,Œå1qc‘L¶»*&—ÀÀf¤#¹ë‚ÙL&yÌÅŠl¶RÊcQJ6Ÿ[,â¥Ï–¥dÇ&äyx~ƒ·ÇÙœ»ïÌÉvððñq¿;C÷`ÏŸìñÓÅníYK¨¹ ‚fs}Á~žì.à <ð@@'´µÙÛoQ¾cû·8zNðtÕ8M¶ß`¹Cfç·ÌàÁãx0¾ÍpËHöšZ›,½ý¥ÚíÝC”ĵ½m·ze¦ÌƒÃñ·±\ºìm”óâÂ~¦§´—´à4G”úº³‹„Ë. î€çw€‡¹ÜËdôˆùúù€ñ&t·wÃo®Õhowa¦›à0ÛÈ6Éî›-dó¼ù(.e¿ÑÖ æŸ+~Ø%ÊÅõ!šôàèü×çÛtÊ+J°Ø´ìcbþƒ®Îâla0€Éçã6£ l†=O–æØhÉ #8§3]¹1$žà96ãB2ótæ¸`ÀØü`0>Óf°QCÜ0Ï`N‹ ¶å\°@Ö\ž·½\k´Ð´ÍbÙ(ðÀù’8qoÀâovJ¶îky†*M‘ÞžàˆGm4…9Ò-Ceg³ ª®¤ª±Î"Ë lÏB1ƒ§133S”º¹B¡ˆñ\®AÞÉç0ü…ÁÀÙÁlú‚…>N9“edÚ“ûßW›¡$o»Fg´Ð¤…Ä‚éwŽ8=³J–°H¹E†œÖääçfÄ>ð³ÛV7ÌaÀ8¼Ÿ´E›·]¡5X(šn´ðm4e(×b±¹"3„˜5*5  µEy9ÅÙE±¹òejÎPÆbÅŠ„LurH_ÇÍšÌ*®?ž3W¹ªL>!Wr›¾H¹fékyË ÕIü'´ŒC,ådb导rfÜ0'÷"ðíŽM›™i“ç&†àô´À‰=pJŠã6C±Rž¬ .Î1ïs«!¾Á “Êà ¦(>£0W*W$lç*û#‰{:Æ s,.ð„;¯ª‘’pð¡?Mý£‹afæïϤŒO>A€ŒøïgDJ¯JRèc2U®1¤S”uê ŽPFÍöŠ”àc* ®+È7ÌÍ:&gj‹òòŠòòµÂd‡†)ÇYõ'¾ Wò4R§Ú½µJo´Ñt3ɶPæ/Š‹Þýa£ êÔíÆ¸Ü-aL0kŠ/4[rÖÈr(øØ÷^#PðöÈܸpùd;{òÿ$¾4öÖµ-ÿ]ÓÐ÷{Àl®ÏÅ«íg/éö|Á(€†´ô¶›»:éÕM5’¾¾žcè‚6Kó-¾ï(°M=žçc£Fy:2$À ›Fq¼:»f;Lp’lÅc`¡o¿qhPÇ{}d“#Äb Úe:†ƒtÙÚÞ=Ñ×£÷†‰O_ܳø].ÙZ{µµöì?Ë©†Ÿê¢¦:»(pÑ%wp½›ónvßÃïÝÉ»ƒ¾¼9(kkmÀ9£úLm¿e·lá?>.ÕèéÒLÝž]@v´wƒï@Ïò}i×–—‡s#w"77€Þ!w4õ?£¼ûéîÃÅÛœ_wÓÀÖÜãÛx +8/?'aEylœÓ¦‘K œ¹*¯œ¹¼,ŒÇ^rÏ"VÔÅ)ïv ç1þÛóëlàÉ(]~fpc:Õ)£¶D¥RŸ0òb¶äÆÅX¢Í=ÓÕêxÏg@Ã7U; µiªËÍž‚Ù®O®°_ÕVx:moM-ø¼8ðF;ßÉ!ÐÙ˜¦:{¸ò“†^€ÑÑQl0×+3¾ßùÝ•Z3Õ·»Ô×wL›“‹>£¸K#¤©B›s¸25ßx`ÌTAè(wŸ £ÀÞpv硟Òö]lºo®Ôx3ñyÐÙ¨Ì9±%燾=“Œ¯¯'˜ÏžÏ-¹ð½¡7”˜È¸ÙP{@óÏÏ4–j.æ¾X{ËÝÅõ_ëÈÃy"™2·øXº”­ÍY!–&g?ié[ê,Øê´FÚå¼…bT8ŽV´é+ufÀظ­¹yH NX [_ 15ù:vL؈Öi𢫂Å*=/VÈ!-6<„òp³¡Î⬎±(u»1.óÎc×?F„i² §†QF­F÷o31ƒcBŒyy}o{™õÌ:MLHåÉÊd7HÀpØœ÷æ8•cb¤Có¦=Êf ™a1Ó88€¥Î`sǘÐl±936ÄXTn (}y‘1$6˜ æ2¥ò‚ô@áFf^rNÿ˜`.ËTQÒ‡Ûø3ÌaŒNúIY,ÀŸ+â3l…œ3ÍV®v¼üb3hµf&úÞ¢šõFðcã`®,«tÌh)}qA[Øÿ¾±$³˜ŸxgÎê¼:€±,3A² I¥‘g+ÊN–êÜ[£ÎÂôgc8› FƒÀ\§k6”ð8¹¿fëîæ¹ñÃwÛ9çÇiM‰ÎFMž+ä8¦_EÙêaç„RzuÒŠlR~ K~gû§«œÉ¡¯ìë€M_œ¯g ÃØ®ïåÂ7lº"Uÿ ª6]™Fo¦€2”«´&bÌ©h›ãÕ#s¥ª„Jø8€¹R­*á1}û€Œø<qØ£±X!SÖI² ŠÜŒe*U™Ñuce¿ÈFªŠ &x8°ùLˉ*Çq’fƒÁæÌÃ](ÇYõ'Ä0%Ûš)vdd€jÖ[œªÚ\¦TTŠÒÓû-Ç ‹åé²ó¯µQf¦Ò D@óD[÷ _Qú¾ãäûôp6®Þu>ÆïÂG—êp›>›ãå˜2ñ§+{(½r^ol7΋‹ÿ0uÆ(ð_Á)¹|¼Á¢mÀˆ1W{ø,\2µùp­¶Åtü{:Ç ®9ò6î¼×#SG=XqãüEÜñ ©‚wc'Þ+Pòèn¼l2÷À˜ñV,™è18e4Êÿ?ß ?ô¿ú“×L'ưNJ_Ÿ¾d‚;c…®ÿ¤¿Ú ÿ ß¼ûR Góð‹<pÑ%úÑ4ïÙÝu^OÞ7ÿÐÄ?Œóð _|áô‘FªÁ@†Nfû´ßh¿k¸R£k3šô§7;þ§ÔØÔÞÑÌö pokê/Æ#&»Ü£¦þÖpþ¤¥í¤¶ÃÌô»ˆéÊ壕þSÛh: îx¢``¾Î¯ÿºÁù"™R$£ •šagÇãaòÄà¤5‹*“Ç»—Gp$iʺT…˜ qØ‘ë²Da1ËEE 1ÁäÇdì÷—ãÇe&+ˆL p‘œÇÉJžå„bÑ ›Âù13d<€Øä¹)ÛeR&›ÉdÃV¹©ÊíÛµ†!aA>`üåÙ¹²ÄìÛ•)• ˜!’iÄÈÕÄ‘ddZ”éK %€³…Ë3#§Y*3S”uÎÄÁq )pÿx9gŒ(b‡%çf°i¾Yð©<8!á5‚,ÏÍæßC{÷™ïàañëÂRRI™l&›ÙoB¦(^’Ÿ¼€Èd‹ÒÕéVß9â-«RÄ* p^ÌÆ 1(½*e7)? áÁeÕÒ¥ðëL‚Céòrê„ÓG’Ž2—)ÖäèŒÍR±HÊIÏJ æ0ÊáýäÉÒ…LšÏf2™8Ý×se¦T‘¾ˆØ 80¦ÅgfJ7fÇ+•K%™ àÊ )Àl«ÊKØžb£i`ÇlÌNt¤)l•™y–˜›¹p¡³ê€O‹ÏM>ôÜÊ\œ°h»ŽfpìÆŒ0&ÆóRVHŠLŸélóo®”Ÿi‹‘9KW8­ÛB¤*$„ €-JÊttܦËË,bgÇuyUÍ$¶}‘f»ã4.÷@RˆÓ(}öE¹¡ÑbÑ&HJÂ’³Ò UykRRl@L$e%‡á.ïàÜ7,ZUN‘´ïUÛ…‚íÛš,02>{£c~|§¢ y ’‹b‡É3Ò…Lª¹)æq̧x/Gô£IÄ»8Sñ¹œ:ù +y„½b±XèÑð ã<óÆb±êëëÓoëëë‘[ œb¿u³VßepóÏ??ì9܆¡H™=ôHjœ/ݘ$b"å žàE~^s¤òQOŸkÖÔñåYOg"þ4ï…ŒˆŒˆ@ ~E8ϼ™L&N×ÚÚÚÛÛ;¤‚»»»¯¯ïôéÓÇÿâ¹  12"2"ù©õ ¥Xžm\fÞ"""º»Ÿ èîîÎ` | @ @ü«ƒ7 Ã0 CÚA @ ˆ_ nH@ ‚7@ @ à @ @ Pð†@ @ ˆ_ }–´¶¶>–æW;ijbdDdD$òSÀÏϹâs¼Ýöô},>ü˜ÚA ž©ßv4.4ÄȈȈHä§@Ûõ¢¿óölƒ¶M"@  Þ@ ‚7@ @Á@ @ Pð†@ @ ¼!@ ij„‡Ó«·{iýÅÿkkµöôô ùÊÝÝÝ×Ï/dêË/¸ayÏÎÆÿÞ«»øÜeÑÒqî¿N½t\øqSYø…m{7й‰SºÛ8ù]Œ#¢7 Ǹ*e¿rú¿þÜÒ=fÂGï‡OänöKEe{ Àzù·Ê×|:@ ˆ‡ Þ._¨qw{aöìÙN¿­««»|¡&tú쇼§ûhAÛ»g4wGøwöO>lhŒc¡üíc„j:–šºûD ø¿µï/«øÃµBž-ÒÐscgq€¬NX¼;lÏáÄ€g\uFZ;i‘$ªvÇ› zבÍa³ÈdÕ­`Ç,c€µxՒñ‡¿Ž}l5‡j(=z%<ŽàÿÊ|j÷ú¬ãu$0ƒ¢7(×ÎïÙ¤ZõÞg¿ÐwþEì<ž> xNVhaÊ®ÒF;c30 › Ö|¨]}8cö˜•N7ºã‹ó$4ŒZ§H±šŽ¥¤«´WHÒìÉ 6( ­ÛõΪoMw;í7ÿ˃ÂÀYõÇY³iÕžKÍ­Öi[Jrç0œMÊ’ü·pþí@}HíþM[K.ÙcG$f¬ŸÏÇîaqõúôB‰$ &ÓÖ: »lÁvúã¥û§ìÝ»ˆ×çÇ–.Ù]×ßcú†¿dÌçÀø>t¤ìHÝ_Qg%i`ñ»ÖÎça#ªø”AF|Œèø™Ðíy/6ßy¢J6¥zݧ›…\Œj(\µfS~ÄеEW°I¾Ù;(è¥òV)ª_V|^:“‹ƒ#pµ–gì¸ Úwl!覂5¤V† XN{â¬:ño¼uuuÑô½¼øÖ­[#iÝnÔe•]µÁè°é\VÏÍkW,õ×í0vPKÚo~Ì7ô2',Àù“Mº“?ç{G¯žÜ÷õõšË×Fß©0àJwK§Û‹yã½Ý:šMº-Åߜ寚ù’™\”tõí=‘à[¾3tΞ3Õ›5ÖÛÚî#j«É0Êo]WŒõúK»;=•‹'ö)¥§MwÝ÷E?7[+U{²º÷Œõ}³Óf¸t¤ž·fò(‹¶j§¦¼Ç¾N°».ÖÒë²=Ûæ®9Zõçæ^ðf¿ìïvUCw²*ˆÿrAÝÇF}1çɪ}ç»<^œàçMµZ‡®ZÞøîÎÂnv7ž?û÷©ó~/øÍË—/×ܱ¼9GŸ€?Ÿ#¶ê4ê/Ž7LŒß« Àjw§ž°6{núceÀr¥¬*E{ðó]½f±jÞþÏ%Œ³ŠÅ›,3¤‰´µ’þomËZ"ÀlçÔ©Yjã«×-ll¡W-«`úE§eD¬Ì ût_(Óñé9š`«·m ¸ÐóÇ”³Á¡X³•´´2æ)v&Ï` ^oÎùcÊY~f!ï jw/U”ZÀø1v­žÅ¡Ï*–í‘ QSQÇzw§è§ÿÑXHSsç”͇?—0LåŸ~œsÞ 4…ÊÒ‹BÀ¹,Ξsê­YÇêh 5wÕ¶sX¶ZujFa /Þ¶+TýñyÒRûÎü=XðÊÏw©ÿ¨„]ûùWîhµ´²æ.·iª;I LY·ks †ÉnÙ¿£¤µ [»0 X’¶ŸÕ·´?\{8}?ÈŠ”Õ;ªHÀ˜¡²4…,Œ>þñžz²sÓ›‹1Æô Rg1ïu¥uãço  „XÀ;RZGF‘%¬øvÖÞ=ñ!©ýôƒ­dü—©QœÙ€ÝçÃ×­  jwô{΄߿|óÏW¬þÞ‚ñÑ»²Cæl80ÇT°êí`}p˜[". í'ƒÖïÿpmI—X¹mK €ÔÝýñ‘j# 8+üý-Û"¦I“…†1ý0ÜŠpgõ¥I«…fL›Á¤úìgMó”Ñ£Óê´µ*kÓZR»D¾„pÃ0³¯yçIJ£31Çço—Íšy'Ï¡^´öRâÁmL«>Ð.û*c`&lj8t]ùYL´s¸1o rŽœ5/t•H< :¦/á"ˆ ÂN´ ƒÓ°yúWqç6½¹çQe¾ã}Éœeï}ã«cK€3£Ï…l¤•ÄsÇc®+Ìq-Ü áÁ´ÕÒj… ø Åà<Õ±@, n9^c"-­ØÜ”O6Îd #>§FäÎÏØ­ßóÎú×xs¢ I|bx0Cmé¤õÿ¾îH¤ÝŒZüyòL‡umWL6à21¦'æ¢'®ª?Ò2¢3%›ŠäÔÒ¬ðDÅfiF5äüQÑ9ã÷=íã:jþlìªo¼fõþ¶¹`´D9üŠMem×´¿\}y’ᛚSíŽwÝG ÂVÏh½·º;N]WÿK8Æn¬ÙT`ìôàã­[õ2,‡öVUSÝW;z½'Îw¹ÆÞƒ¤Ïã;o”õRùU¾ÆÄ-ZžvXÄÅB×mU|&Ú÷u èê*kÈìyrçpÁzléÊœªØOúxв48ýpV(¬—4W¸DÊ¢¢T2mÿº €>[Ð?Á)Pî6.Ü÷C L¥ «?*˜ôUkîªm’Ìvê£{ŽÇí]À¾h²-† ¶s;þ˜‘»]ÈDÙÞƒë8 òìÖ•;¿q8‘ @[›±è {ÖñY &öÎk+ÀT¬øàèôu1,Z¿S>kÝ×§0Ôîzïã’¨¯cÉâôId=¾5ëRLÚá .€éØŠµ»+g¬kþTM½{¸th“®ó]·yzõ±_ @5 ¬ß' ñè;o!?ݳOÄ¢u»–¤þµ)fe>\–•b5;‚?ý*Ž ¤ÆµöäÜû‰À_÷éQ °–+ÞÙ¡‰þ:6zójõ+¿Q†‰T©+qûb9 £­Í4&Z²sãùwÖž%*ÝZ•–5`ri-ßSÊ\ö¹ˆ1ÄsêoÖ|ÌLûÊåFYë‡qÚO.ÿ­ÍYÉeP yKy:b3ÿÜîµG°Í{JD,°5Tè0àÅn[WùÞÛo•¾<“KZg¥¥ßŠ®T.\[IÎÛ¶wðîOÃÑœª‰ñ‡‚0Õ1<ã°´©¢èÈîw÷ÓÁ„ìýÅÑ!OnŠ0y:_c"b¹TCaAgTš“IêqHK ‰1Âb ´6‘÷3­ÇŸcÌ]Æ ¬…ÎêµoÅ`ÀàÏ\kÈC: IDAT´.E&¼¿6øK¸8ž4Àô¥í+?8Úš›òI,÷ÁÏX)`‚©hÍ{Û5³rcXÃ~š6çÎaQ 9o®>ùéç_‡2l§>Z°ÿøò™Ã~U‘lçÔ' |óDl„è_v¼ùÆn`p…DüæÕQÚt¢ؽôoMFã‹dV/a°bR6hÖ~]9en(4OÜð©«]µÎ«?¹†+yb¹ ÀXòÞÒ=Õ1Q&z溽«lƒ‰E/k…bm;eLEÊ™YŒñáÁ,ÀØA,ºÖJAN;“edÚ“sï+i(Wí¨¼dl¥I+‰=ĶVŒb[ÕêÿX9kóžø¯ðÙÎå}Öµ+†ûÀ¦†a¦áý¤[Ïæe«¹b¥hº±5ÀFÓÍY,æÇkiÌ (€ù”º€–¹?Š>,oiNÉü½}¹GL¤,9M›ŠÓ?Xµ‡ûõ7L¬»ÿJ/ÙÕ·Ô|ÚUu`DÉ×GÉÉú¢ŒÞ^¨Z¾o_bÀz…E,žõÙÞc†™ñàqæ[Ÿ;{Orˆ8\À´;äÙÌõ9¶ÅŸ$aô´ÀšÿeÉ ›Š3>HÉSÎbÞgN<Ä7a±²°AMÙxP³ÑZ½uí‡;Ƶ¥ýþžN…±';¸Bë‹ÓMTÌàœ*Ʊ÷°½š‚ƒ€q¹L»ÉöÄS‘ÿýŒH5¨×¤×ÏS:2‡`ÎÜYQŽá”©bÇÚ×>@6šüƆ-s¸8ÝT¤ø`í~Á7kêþªníüf1Cû7Õ%ªüsá.2TN«Oyä}@Õ<…¼¬ÞQ]×BÒ´‰ô³RƵ„¿; › Òw7¿õÉ–PX+J.›,û?Zº€"o¥uÿç5oŒ½gŒäñë×-†fKMÍ?u§ª®KÞ}ÑËÓ‹Áè‚Ñsß›îå¸ÞcÆè4n¹\[Ýà7yË»ö­k™Ÿý_c_þJ°)Y0¨¤ÖEÉ>z»(/§7é±´¤C#;ºãn1÷—¤ÿ_Öà;^Zg¸ÙÝbµÏn’øx/wèpy‡oþy²ÆÜ„ÀßF,ðï¿Üí6ÞÛÂè‚[×;aŠtµßì|´·‡ßâÕ±‹¶ÕÞ1y2=zú;é·ÁŸÝzŸËq‡‡®û2MðÅ‘¼UkŽÇ.”-‰™âj±–zb›ð±‡øÅ§i ìÅÊMEA²öDñ0SÁªtÎÊšOíX_9%íÓ¾i: ¬È”ÏÓ˜AŸém°Iò¬!KŒk¿úKmuÕ¹³'ö¿·ûo›ÿ¢ ¿¿ÈNžr#’塵g8üQjeT†rŸú=裸i˜WŒga´ÕÀÒJc,l@Ïi’¤>¨›ŠöT¯ü*ìq<¹ô“¬Þš’‡­ýd/À$+V,+tÑV<Î\r4ŒËnbÖxëüôº…îv ãwÇáz8B2Zw$§núº´€T§MÚruþ_+Œã£7ïZóP‘ ÷Ôx?̲yôGyVs­àý×Áð]qØã¶+}ë4I‚WÀ}Öë­Û×ï6Ìû¤c-ö -`}#€xC°co“ î=ï±o°Âcƒè­g¬Ð7µqÅNzÄ¿ Ð4<Âñ0¢ÓÐtMzõ4åç®6þ9+€9Â*œ;ka#µÖJÅ0Ø Y,°€¹1»KL4M~QNÇî™ÅãoåÎ`zÉ»G.%Îpvp æ¬:Lyœ/qtÒ€aTmΪOMï§ïLeQ.÷Ó’ºý› ë¾\àèí5e]Æ ­ƒw” žcžì9OoÚ[õçóׯõ§‰˜cÇ :Qć7o‚@׉ï.w®ñgmý±okò«É‘4îéáÐaüûüírãC”ÄãqèúûÿV}Qtjþn2É‘ƒÖ†¯KÏ;×nw]òÉÇ×ÞÄT/h,«ÚSR“uäòu ‚—}F\]è 'uǪ>÷Ëw?œÝ÷Ý•/Þ<è<ª®R•üœUÖ/ 'MÎÄFŒWøÐX¦Ù¦þ1íÏÆ®tÍÛÛ¬u‡¾½XqÅþ|<Œ7sÑ–ŒÃß(°Ïå½»ø”ýÕæ¡eþ˜µ®•[ÃY£ë·P™AÑÁ-…‡ûéÉúÊZ+`,œ45©Áš2U_Pi0UäײæMÑ™tß°´¡\]7~¾EZ:±`Q8°6Õµ:«c:–šeŠÛ’Ø¿5ˆ;/;±¿POP¦³šZëȕŠŠnQ}qÊQŪ?Ua«îT=%]’¸eu~¥‰ g€­Áú€†p* ÆÀH‡æM{´í É žÆÂ¬uWHG‹8Æ“ÕæDÌùÁ-ÇÊ›hZ¯9f šÌ€¾—ïßøü/ky[ótýϬÉÉ·/X÷P‡3s““~ÒV LÛ•K0>1Ŧ)¬$lMgµVo"fМ5ÐÍ &?…ùôñÊ&€®/9ZϞєœ©tw9ëý•wæ¬Î«˜Ê÷|¸`ÙGù ‚åi‡ Ó%3êܲéB+ƒÇÂ06ŒW¬Öú -Æ&ˆ[Ì=‘‘Ó,’G›I:ãáte©Ž“æ¯õ¼˜pŽcúU’WpjØ+¿ …kÖæÙžµäΩz®Zp6‹m¨îëY_r¤ž9} Ûõ½\ø©+QÕ’}Ÿ5z+ TÓñüs0-‚52§¢IG^ÚZ_N¿€˜OªÊëG¶›b`Ÿ'#냱üã¥õ±éƒ#7ÓqÕáãF׌§ûE6U䟡ƒE\bEXÕ‘ #€©JÓä?CÀV ê9c¢¬WH—·8­þè S2i¢X³"CYtsƒÕ©ªÍš©gf¥)ú7Ƴ¦ÄŽ¿”s𬠀6×VTZèŸt?ÑÖGûs_sõ›j-˜¼ø5?ÏnÓ€"c^‘¾êñƒîïzK­¾F{û†…0ÚÐU±éZç¸×gp]•|ò¸52iÔ¹£Õ7jõàŽ†-~}¢÷Hw{ºŸù~ñhµ©Þ`lÜK0uœ·Ç˜ çØ¿Óý½ÞR£¿s†¤Ó°‘ØÈó¥×gJ¨³7t]o¦ýqk3îø=3¨îfM™uEWÝÚV}¾Ã:î7Q=Ÿ¿ˆÌŠ[?+Žnª¬4 ›‹LY¾R°FñÎ"ÆϽWŽ5?-¥>5}ák4†+rõNQhôòˆc©‹c™£weDßyPÅmIlLÿàµ=4`\bõ¶¸€‘¬äY+RWVØHŸ½Q¹ˆ»*j}Ö{‹¼XLhðöèªÌÚ]ÓÊh\¿$°€åiŸÄ­Ü¹áÓë—©mÀÄ®ÙLŒ\M¬ùJëÖ¬÷^Ë 0ö YÆÌ)–39ë3ê)Œ3KÖ,àæ¿LÆV¼÷Z +lõ'»‚FØt€Y0t±`UJìk Áò];ù÷ÐÞ}ò¢XزÄiÊM\É`{±˜4@3B{xÓ›oå°#6=àÀ`EoY[½~ýÂ|ðñѕѠõ‡7í&e_.ð`ÖÓï­Ï?¤ŒâЗ¾Ø_/\³y${nÍš×î¿dl±’éï,š–2Ìa¶ ï'+j]liêêwòý æ”9sCÆo_û1`À˜òþ–mÒµ;ã3v¼½,‡㣶(ðÌÕ_¬ß½ž¤i`ë²V:Òdå^•…Ø6àåLè¬:`¡ò½+Ãy»Ìo.ÿðŸ^¢³nW(€ WÊyÊüÁô ` ŸÉñD ø{Èyo9[tw&>3q³èãÔe±6vD|†C*òÒ{ޱÓåC†CÝQUU ‰}úNô§ØÄE{³âCœ¶@×ç(>.¿Òdi=»jYé´U;Óç°€¬þ"}ÓzhÀ‚EñŸ®ž‚»¼€sß°jä}#JÊ[máŽO?¶Ð4`‘ËvntÌïïT´áà‡ ö[m4+lñ¶´ ºY£ú¬!16f$ÔdPŸ#:òÖ¤ªëL& |ôÇ3‚åi;¥\SùÁãÍ-Øî5±»€M|ò—õSàJég_BðÂhæ´€Àv¾p}z¿È‹wn™É€•;ßßµéÝ·vÆðX—µ,0HTÆoÝõá›G0Ð̈uË\ôsRýqoC”ŒÓ‰‰7­ZVÊôc°V'Ï úÒgŸV4Ó¬õËŽæ½++1.}³1}Ç‚·H`NŒJTD¡˜ÑÇ ·oßÖjµ¿ yyàÕoÿöçY³fÝ£Zuuõ¼7þcÈŶëÿô÷¤ÓçûõZÕàåéÙMµ\µ\£€9}ŽržŸçs¯™óqA5ä,M‡´=‰!hc=âÙbæòÞ._t(#úQ·¤jw¼™ÁÚ»?žÿæS¼8þ¢ZÁ[‡sç0‘ŸÉ‡Ýcù +y„½b±X€xvqžyóõcÕ×× §ßÖ××ûø"·@ ¡·Ãji¼Ú àÞŸeEZA<ME»òª:_ó X¸6^„ÎCF<9èúüƒ¦È”¨Gü³Í•õ‹w>‰øÓ¼2"2"øá<óÖjnù‡^×ÑÞÚÛ;ô< wwwo_AH˜{üýW ˆç4.4ÄȈȈHä§Ö+”y{¶qžyóòö ž"ìîq~,‡»›»­ƒ#@ Ä¿:xÃ0 ÃÐ.@ ñkÁ ©@ @ Pð†@ @ ¼!@  Þ@ ñ+¡ïÀ’ìm¥¹ÇÕñ,Ɔ‰üðóóC®ø\oÅÒ­­­Èc4.4ÄȈȈHä ¿üò ú;oÏ6hÛ$@ @ à @ @ (xC @ ¼!@ o@ @Á@ @Q:¥˜PèRƒfºHgëû\,ÉŠÌÓÄúbu™ÑÅÓåbB$"ÄòtË{T2QÄDI•Ô`Ï1”)¥¢ˆˆ"YK9¼J-÷}~ÜþZ¬”K$R©D"MÈìó9CQ²LLˆD"±1ßdw÷ýíäÞó;ÚŸþ»ð…¾¦#¥µà45uÉ$ÞP•÷4–~¯<× @‘µ°â£Û+ˆìš6Ã?”ÖŸo鶃›Ï‹¼·M¶Õü雋.q«Ƈ箚è5,V4ž9›ó±‰‚1lXÈ›0:ö?__Âè¶U•ꎜµ˜{p†0*,>Šã·Z¿/9ôrGû ëÃó§ Ô™Rím[;¸qÆ{š[(ÀyÊaÀ-ò|ƒÅî5ÚÝíŇN_íºÙn>ìqócÃ%|Ïçz Rf}3ÂgU——WGø!9Œù(íY*Õ*Û´X`Šr+‹ŸÚ GUE ¥>x˜²LóÐÖhÖ䫃 i8u¥äñv´® OÓŠyø°¹jªò‘[¦ ½jEÂÖ²Âl1ÇI|¹ºR~wЏ('˜‡¥»ë9†liUHFi‘ˆf2%Sóÿ·w¶ÁM\i¾ÿ/¶ÕÆQƒ“V*¸CbMÂH¡°XöŠÁÚlèdSj>¸¹[#WQÔEžÚµ¶j-îÝÈ3UV>ÐT]¤ÚY:39UcUîX¾—ȤÊJíDÞ­Ø5Ü!kÃ,šÍ ("—=‘³Ð"A]Ø´0tÛ8÷ƒlð‹ &¼Ì$œß š>§Ÿç<çí9Ï9GÃ9½þa8Ìñ€”ÛÛ›àMÐÒR£/Tß/9(CÐÞ´±ä„׊4Ô¬611(Î)šðîî³×Pc¥’#ŸÉÂj6Ý`&^Šóù„{gßý+YJ= ÔvƒßçÄí17»lTMƒøî!›‰RÓ’Û諹LjÉ´l´Íß“Sjêä`¬?ÜvPw•µdÝX¢‰óuúí,|2°[”Î:%ûŠ>bˆ¿F„œð·ERÃ9ªižðŒÓß´³”–‰y›Û¢Ž„ϼP»R/”z˜ï? žÝK¸YhÙX³'´GùBÄsGû]fJî÷7·I–Þ€*) ð¤tlçúõ뺮kš¶ÜŸ7nܸ—¯LËãÔÆ-ëž/›Éžûé¯&L´)ã“Ûþ´öµMŒéæõó©O:NOÞJ0uqä½La3 ó™-<±nM016ÒyzÁªOEõzþÅr(«þËïoxÍô•üñÐÁc—>׌öMìÆJmôÜ9ñèŽßžè]~ïÔåÜMLÝvŽÆS—V±Ì*@;sì”Ø§Àd¬&FÏu}º´ÜÊÖ¾ômÅ€Ãòñ •+ÒA¿tVìþ4õE¥ý/6íÚDM\¼ðvô|Þ8'<żöýïìÚ¶f©Kt-û‰ø/òçÖ>óôFã<±qcèèGo§”©õµ{øÚÓ…Ô±SoŸ½L~td°ëÜÕ #³mÓÓ5Z!ulèàÇj)cÝûÕàÏRã(¾–aqsÙ§äBY­™};Þþ̪ åÒ{G?9?ý˜¶@-ŸNH>×ÎæHZ´t(0 äâm‚76<èã<ýÅ‚Ö}œ'‘´T€ã¼~¯ÛíxÁ]ATSQŸ‹ã8ŽãÝbÿÄÄž±ÜûÞ¼à–ÒWS~vX“ûEÏñ<Ç»Å~Y´Œ$pn¿Ïãv»xÞ#¥Ô%ëÍ’À¹}Þ/hé ‹s¿ç)ÆK´T€A¿›ÛºÕõίá·uëÖ¢är¿èAày—?–Ñ–Õ¥´Ã“Šú]‚ ¼0“RÓQŸ‹çyžão4s5:*œ=ÐÈó‚/‘×2’ Hm¾‚Ï{‚±pÀãv»ÞèÏ£”.Z¦CìSÆ:šy^ðF³·—ö—–ÞÝUP“~a6wÁM«@¾ÿ€4\8îßÉó®À ºÀ©ë˰ N+PV§‹M÷ «Z6êæ\áŒ@M]B`A@NËD¥”½ÕežWsþögÿ3Ð3¦$»·”Ñ`âÄh"Öj¡•ç¼ “/!'´LØÃssï$Š!5 ¸yŽã8ÞåghºšS4Í(ŠÖÁÙX €ª(]ggÌ µTGDv¾á4a™äš2jæÝþpæ…âò çŸ BänA@"uqþ¹àsóþE‘œêhÙDÊÀ¹êh€bMVy uQ)3ÏÛLÚRo1¨rËå@™=áøáíÌ}OºoÕY%…­B4;ëÙ9;KP Šj°:j¨åΫÊ^çõy=n—À»üKâT‹Ú‚“üÅNÃT‰_#²‚ëílª™Ôƒåx;K Ìv ­+ê⎳ä ˤÒÕlN@ihŠ‚šI娆íf Ëyêõ¡¬¶Œ$c±T!ËqßloʹüÅX –‘Þ xø­[yqàÿø\Å1“wlÝêŠfä“’×%Ï ÞpJ]ÁxMx¼#oSSSšv§°òÔÔÔ½|eµÐhßQËÕ¿þ‡c…üÈ——±öé­Žziâü…«òøê©¼râ ä/Lê˜ë~žÝt°‘5U–UTN¸ísicEŸ©œb×1µÛ66rõØ‘ß/ºy«žxió¸»î6\½ço^ÝašúÝ‘É_¸®cÞiºêaËHßè8ª×ý`ÇwŸž¾ò‹“/þ×úØR‰üš½ýinlääøs¯ÍvéOÿ½góFcEEeEÅÀëßü»?«¾xð{Ôk{^ùáú™Óï|ø³‹¸|ACÝÔb_á¯Ö Ÿœ˜Yk~a×ëO09r÷"½9šË¦ïoiæÖTÜX}þÓÓg&.}„ºuÃ}£Wad°Ã\ \ËþÇÁ¾ñYk•¯öl©úøÒ$PQ»å ç¹êéÜÁƒ§Ïÿw\~t`öüõ&»qfcáË7ÿíú™ÓW®­/$.Ϋwíq&Œo8ÑúËñÏO~6¶mÓbc•Žô^ð<¿=¸­J¿jýßòd‰Jgò¶¾rù—#ùë•Úù/.Oj¹€ÕUÓÓòéîHt@6mwï à(®ÚÚÛ·';¸wc‚ ÚàÐ2³FØßɱÈÇÝo ¹:9­¿ÍŸ°„a|:9VÉMqŸì X)@KõÌMpzÚB¹¦XR`!'¼n_5Þ ç?$˜)5餦˜‹]ºä¼_âY¨)±Q 7ô¬fOg"`¢Q|ÔãJøjM‘)g{¬ÝÌÐ4õ7¯úÈ _sÜÞî4i™p[7ÓKØh¨)Ñ} ÎÅ\¥t)pÌ÷‹Á´3œX@Ž{šCƒöö\(ªûý MNÖØÚ÷Û#?èò4-3?ý¬‚r̵³[=ünÌaÒÒâÎ@O–÷™©¥º´Š ¢¥+îf¨ÉåKÏSs7h»¿«Ÿ5Q@¾ß×pÆ\ü~wcÒÿd§üÝÀΦ¦ƒ®ä4Êá9Üžjl ÙÃ\Ÿx– vqóRù·úè–.½¨æd&Oèp|Ñböüò\XaJÊÉš›‚½>–´Lؽ¯#í šS¡}݆ýï&&¨™dÚÖ%ù»w¿š°×³ªâ†o)¥ úù}Ç µ ‡:†³=Ò¹õ]+,“œ²z:®l2 5wèçÞo¥ZS47x¬Ñè€Ì¹X-ÓÓ£nÖ/ýØ"uT%§,tQYm„’-wæzR4×Rè÷–Cahß«hs}“_ôØé|éVÝÆîi¥-Ì<…ÒÁÆæ÷sÌöý ì.€©k=ä³Òãwh ¾S0-éšvr&-#íÜ¯ïŠÆl´šô ‡‹}¨ý)1â7Óˆjªû8ìûÍÔ=½0ï!Åïß¼ÙûêñºíuÈ™Åà µÐrßñ¬Óe¦ *:T¥ðˆÇ÷%…Ìloïm`i ãn÷[CÎNÎ@•õú@熦iÊùß䓿0#ºÌãma­¥3á0AË„Ýmag¯%ã5áñuÞU¦r¸q}rú¦|zPìŸ*žX½vI8ª¢ÒXS]i0?2T¾f2]Á’IDATÇËÌÉ~erì³®±ÏT½¸Il|rìÒÕϯÍ%¼4P+Ó{Uuu á.1ŸùkÊYSÕ@7äÂ\X©œbMUÕå /øDEUpsö[•«€™)@Ÿž^"ð×`êòø €ü©½§n?œ(, v®ŽÞî·nNLO¡0`íúêE¾’^˜˜åíÿõ¯ó´×& … ¨z¾ªª«ª0>ycr¨^d¬é©ü åµëïh‚B®óÓ'&”¯][6ùXÆÛÒâÎæ>CÃÁð¼ù^Wg)Æna€6›)UV¡fû2¬û`q£¥ÉÆ™€lÉ™@z@¶¶plqa³É*EÒù& ŒÙRC0Ô˜i5«j‹›ÁÈš ëœµã¬«!7 ¤dE×UEu¨jÊ,4ñ6vÞâo¸­ÃðÆ»+…ìPrXÖCÞ¢?ªêš¡nY¬ JÍ6´á¾¡±ál›»4ÕÀ*m©£%©MLo·Ûœƒ–]ƒ¼¥ m6kìб0úYEƒ™ÒJé²²ÒóÔÜU5Û %Ó²¢”‚Á¢ß{e1ñAiÈímLÖïmÔüLG‡¼ýPÃ=Ýêð’ y©œº’Š„©¬¢éú˜bVu-;24t:L@[9OFcZKW/§§â‘ŽD8ÞÐé±R@9¤äiMNš½RMÌo<Ÿ”z´¦9.?´\rÐfÎ#r5÷í~5²·7æ3?¤-`&n¯£CŠg}ãâþüíèc×î([{×aK¤»ÃÛ<ÐÐäilË-ÖêZiæ /_cë€ÁO´ùã1ãXJ޹›Ï–tv’Ú’uÁèì4]㻂ó£MÚJ¯=Òƒ¥%¼h‰1ÐÛ›J¥’n)ì•ì+h…Ku^‘._»ô²Q_ ÉI‡bv2Rc`žò%jE cЕYïOUtsk'”說Ϩ³q)iiíµ=ˆ‘»„œê èí Ú;;y3­&=BOI#Eè½ý6–ë?Ì*| g¸I¼-ÅrΚP÷°Š¢K¦¥»¥a{{м‚äšœê‹FcÇeÖ¹¿³Éùµ<7}™/‚¶ïuêû"Œ|ÖÒ"ÞáÔÓ-uÌL ­fg‡]-€6ßez˜O½¡1¡3<ëî%‡Ùý¤ ÍœË’²*î<ï_qÝ0Ù‹&*˜÷¯8¡ª¯¸¡ ë¸)&1â·Àˆ¥\Ó°/0d“¢þeB%_XüPKGZCÌÁ²`}a‹.4GÓ­vmu‰Q@޹ÜàþpgÿTƒ––¼¡\KøpÐfÒRþRéWÓþc{—{¶³Ó6ç‚­ w”cÍ}†×õ¥:Ž|$¦4`Õæ—×UcUU9€éó'Ïýð“ÎOVvóÏô•#?øñÑá¡ …¹ÀÕêZãR'¡rC5|Þwê'GÅ^åþÜÛ5;¶Œþrè'½©ƒÑOs@Eí†mà=~e¹çLÀäèù®ägû0y®ãè¹ó7Pe¤*(#‘>sôôÄ’±®¢v SLeNýøç'?›Û3  úY¡vp½¿ï|âôØG'GŽö¥Þþ¸€êg…g޼3ØÑ{òà/Ç<¿í;µKÿrã+ÊŒþò×?zçø£rɨZEù*—ßÿðì/zÏ>ž-bn±3ñAÐŤ:šy—?¼ô¦=º†R† €:œ’õeç-´Åi•c=Å«ÕÌ`:C©¹Ü¢&›“Éô$e“ÝiÆi[Ѻ®éÅUÁD4Ã6ØME¥¬œ¥€|v¸d“ão†ä&éÖ°[ãt’ážâašœJ¦ïá4mqZåHdö´W>“LÊȧ“à çòøE?Ge³(#Ôá{mî%u1ІB±äï¯ô45[ mÎ:(ÃYµhÊ@#§¨%Ôl°Êñ¬h™¸lm°Ðòý¢xÖÕÕÛNGüsw`"ß/E5—Ÿû:·z,©0r 95Ey»ÃLj6­è(³³Nˆ¿¨ÙT*O³fCvö¤–ËȨ±1òƒýƒÅ­–Iô 3ö¹óvrŸ”`ZZoÍYK'ä~É+ìôE3VOøƒxØ/Ø¿ÖÜKK+t c(††œU ?œÎ-iJ”µÉS“<ðVn{ËÒÝv¥Ô¡ÌN»žìK«ädO†m°›ŠÓ¯x8¶äžP-ó5‡ ž®Ãž[Û?—Ë¡”™ÁYÔL¢;CÛmÌòßZ¦n¨éxtîU5ÝŸÌä5Zv š‚ÍÁ¬¬Réjñ”Q~0Ú§Û3äcÑÄ ïî›/1âãdÄ%£œ¸Åaáp×ÏMîFûåe_(ù1ÓÊñ¡â“ùlV­™½£eöld*ˆÀÕj§íø¾¤ÕœÆÔ×ÛL€–Ë(%‹:ß/ÁàœåL¶6޵iùtr0anºýh>35®œT´Ù‹ ë*Ê]]+ÿóØèèØ‰k__þùØ .¬(_mß°fläÒÿ»`ÕÚgÖíÙa{¥Ä:WÅæ›ýȹÔÄÕóªíVç2×ïÇMb_¯³ò“ÿûñå3ç (£^ܴᇠÏUßq ð`X¿YÜ»úȇŸ¥Æ.PF=o~nC% æM{¬§Žd®ŸÿÝØXáiaëÚE+kÕuÿå\ø÷È©ñ‰/®V<[]um|eO—¨zeÏ+¦ß?«œ9w@ÕÚj{Ñ€ªWö¼<ÕwæýO•“çnÝ6I— Vlløó]7>yôzî¢öâ³Tþ¢†rjÑÏóUoÙÒ<òïG2WOœžÚ¼…1áÂcÜ%Qf‡[t¸µì`rÉÝñ”ÍÓjñík4h–½Su3 Åá7<§S˜ú7;lνŽx€çh³óÐÏù¹÷ÌM’?hæ$ Ëù¥&3°’•<åx ñ¸ªj”ÙÙ~ÈÍ þím!·‹fhš††%«ÜÚ`(”RŒYïÎnóÞp§»5ÜÛ„¨ €¶ í¹•“I8$)bp7'jÅØ÷JõuÊ Ô&kM-M—TM‹Ç´ÏÍÅ›¿óe…Y›KèBY]‹×û*G[+¹(¹ÁFî(ëZ$ÉÕnÅÝ‚dÀrâ! äÕ¡ˆ7Ô¦ê:h‹³=ÜZ S¨ƒRDqÎßÌEÙK%@Õµt¶Ú¿öjy>ám ¥uЖ†öC6  ì­-l[³7Ò&3Xv»Ë,©Nw©pE)u(Çû¹7§ŒÃ'WÓ)΄[5‡ážÈP®`5&C`07uvù¬%sÐ2á}옢¤¼BŸÍ8È™PŠìkkS¡Ã`á|‡ý6jÙo¥ë†’ŠvÄ]³7¨ªg{B¡€¢ë0ÔÖ·„Ûo1îR©ôlÄ+t(ªÆØ<‡‚vÐr‘Žaƒ`]­È@Œø8±¸çóE‡s9û-žpØÅæ"¹œAj~µ‚bœ½¢ Ù¾ŽXšx–*ù]2Uë!ßÞQƒ:]ß.µ˜h©;½IÕH[{ÃQ÷¬b%$yXÎÛ¢B¦4¿Ïì÷ }4C3´Rb4×Ò¡ã9iÛ9ÀÀ8uù݇ƒ¹7ESÐf®5È@(ò'_}õU*•²Ûl9zï½÷¾÷½ïÝ!Ùo~ó›]»v-zøûßÿþ…^XðhöjþÕ{þûë;ªIiÿq0ÿÅ‘á‰Jª¢|fâÒ—ç•0/ý¤õ»¤Ó/ûà +*¦59«|®a­ýåŸ6¸õ§›ãyetlîçûìÖæµçF¸7²q1¼øJjÊìj÷9hR8„‡¸DÑÉÕ‹œéþ²É%‡ÍžÃf"þ(¿EŒHŒH þˆ(y»téR:¾råÊÌÌ¢_ZCYYYuuõæÍ›Ÿyæ™»¯@=¤]¤‰ˆ‰‰ÊL*bùv³lämëÖ­Óӥϡ•••FRv@ ðvÞ ƒÁ@6»@  «H@ qÞ@ @œ7@ @ Î@ @ þH˜½°äÊ•+$»•ðm‚´ 411"1"Qùðä“O’ªøX8o_UT?:ü€ò!¾U};iibbDbD¢ò#`üËÏÈï¼}»ùÿûlÙ&_ÌÓéIEND®B`‚django-q-1.0.2/docs/admin.rst000066400000000000000000000063211352353655300160000ustar00rootroot00000000000000.. _admin_page: .. py:currentmodule:: django_q Admin pages =========== Django Q does not use custom pages, but instead leverages what is offered by Django's model admin by default. When you open Django Q's admin pages you will see three models: Successful tasks ---------------- Shows all successfully executed tasks. Meaning they did not encounter any errors during execution. From here you can look at details of each task or delete them. Use the group filter to filter your results by schedule name or group id. The table is searchable by `name`, `func` and `group` .. image:: _static/successful.png Uses the :class:`Success` proxy model. .. tip:: The maximum number of successful tasks can be set using the :ref:`save_limit` option. Failed tasks ------------ Failed tasks have encountered an error, preventing them from finishing execution. The worker will try to put the error in the `result` field of the task so you can review what happened. You can resubmit a failed task back to the queue using the admins action menu. Uses the :class:`Failure` proxy model Scheduled tasks --------------- Here you can check on the status of your scheduled tasks, create, edit or delete them. .. image:: _static/scheduled.png Repeats ~~~~~~~ If you want a schedule to only run a finite amount of times, e.g. every hour for the next 24 hours, you can do that using the :attr:`Schedule.repeats` attribute. In this case you would set the schedule type to :attr:`Schedule.HOURLY` and the repeats to `24`. Every time the schedule runs the repeats count down until it hits zero and schedule is no longer run. When you set repeats to ``-1`` the schedule will continue indefinitely and the repeats will still count down. This can be used as an indicator of how many times the schedule has been executed. An exception to this are schedules of type :attr:`Schedule.ONCE`. Negative repeats for this schedule type will cause it to be deleted from the database. This behavior is useful if you have many delayed actions which you do not necessarily need a result for. A positive number will keep the ONCE schedule, but it will not run again. You can pause a schedule by setting its repeats value to zero. .. note:: To run a ``ONCE`` schedule again, change the repeats to something other than `0`. Set a new run time before you do this or let it execute immediately. Next run ~~~~~~~~ Shows you when this task will be added to the queue next. Last run ~~~~~~~~ Links to the task result of the last scheduled run. Shows nothing if the schedule hasn't run yet or if task result has been deleted. Success ~~~~~~~ Indicates the success status of the last scheduled task, if any. .. note:: if you have set the :ref:`save_limit` configuration option to not save successful tasks to the database, you will only see the failed results of your schedules. Uses the :class:`Schedule` model Queued tasks ------------ This admin view is only enabled when you use the :ref:`orm_broker` broker. It shows all tasks packages currently in the broker queue. The ``lock`` column shows the moment at which this package was picked up by the cluster and is used to determine whether it has expired or not. For development purposes you can edit and delete queued tasks from here. django-q-1.0.2/docs/architecture.rst000066400000000000000000000102241352353655300173670ustar00rootroot00000000000000Architecture ------------ .. image:: _static/cluster.png :alt: Django Q schema Signed Tasks """""""""""" Tasks are first pickled and then signed using Django's own :mod:`django.core.signing` module using the ``SECRET_KEY`` and cluster name as salt, before being sent to a message broker. This ensures that task packages on the broker can only be executed and read by clusters and django servers who share the same secret key and cluster name. If a package fails to unpack, it will be marked failed with the broker and discarded. Optionally the packages can be compressed before transport. Broker """""" The broker collects task packages from the django instances and queues them for pick up by a cluster. If the broker supports message receipts, it will keep a copy of the tasks around until a cluster acknowledges the processing of the task. Otherwise it is put back in the queue after a timeout period. This ensure at-least-once delivery. Most failed deliveries will be the result of a worker or the cluster crashing before the task was saved. .. note:: When the :ref:`ack_failures` option is set to ``False`` (the default), a task is considered a failed delivery when it raises an ``Exception``. Set this option to ``True`` to acknowledge failed tasks as successful. Pusher """""" The pusher process continuously checks the broker for new task packages. It checks the signing and unpacks the task to the internal Task Queue. The amount of tasks in the Task Queue can be configured to control memory usage and minimize data loss in case of a failure. Worker """""" A worker process pulls a task of the Task Queue and it sets a shared countdown timer with :ref:`sentinel` indicating it is about to start work. The worker then tries to execute the task and afterwards the timer is reset and any results (including errors) are saved to the package. Irrespective of the failure or success of any of these steps, the package is then pushed onto the Result Queue. Monitor """"""" The result monitor checks the Result Queue for processed packages and saves both failed and successful packages to the Django database or cache backend. If the broker supports it, a delivery receipt is sent. In case the task was part of a chain, the next task is queued. .. _sentinel: Sentinel """""""" The sentinel spawns all process and then checks the health of all workers, including the pusher and the monitor. This includes checking timers on each worker for timeouts. In case of a sudden death or timeout, it will reincarnate the failing processes. When a stop signal is received, the sentinel will halt the pusher and instruct the workers and monitor to finish the remaining items. See :ref:`stop_procedure` Timeouts """""""" Before each task execution the worker sets a countdown timer on the sentinel and resets it again after execution. Meanwhile the sentinel checks if the timers don't reach zero, in which case it will terminate the worker and reincarnate a new one. Scheduler """"""""" Twice a minute the scheduler checks for any scheduled tasks that should be starting. - Creates a task from the schedule - Subtracts 1 from :attr:`django_q.Schedule.repeats` - Sets the next run time if there are repeats left or if it has a negative value. .. _stop_procedure: Stop procedure """""""""""""" When a stop signal is received, the sentinel exits the guard loop and instructs the pusher to stop pushing. Once this is confirmed, the sentinel pushes poison pills onto the task queue and will wait for all the workers to exit. This ensures that the task queue is emptied before the workers exit. Afterwards the sentinel waits for the monitor to empty the result queue and the stop procedure is complete. - Send stop event to pusher - Wait for pusher to exit - Put poison pills in the Task Queue - Wait for all the workers to clear the queue and stop - Put a poison pill on the Result Queue - Wait for monitor to process remaining results and exit - Signal that we have stopped .. warning:: If you force the cluster to terminate before the stop procedure has completed, you can lose tasks or results still being held in memory. You can manage the amount of tasks in a clusters memory by setting the :ref:`queue_limit`. django-q-1.0.2/docs/brokers.rst000066400000000000000000000176621352353655300163710ustar00rootroot00000000000000Brokers ======= The broker sits between your Django instances and your Django Q cluster instances; accepting, saving and delivering task packages. Currently we support a variety of brokers from the default Redis, bleeding edge Disque to the convenient ORM and fast MongoDB. The default Redis broker does not support message receipts. This means that in case of a catastrophic failure of the cluster server or worker timeouts, tasks that were being executed get lost. Keep in mind this is not the same as a failing task. If a tasks code crashes, this should only lead to a failed task status. Even though this might be acceptable in some use cases, you might prefer brokers with message receipts support. These guarantee delivery by waiting for the cluster to send a receipt after the task has been processed. In case a receipt has not been received after a set time, the task package is put back in the queue. Django Q supports this behavior by setting the :ref:`retry` timer on brokers that support message receipts. Some pointers: * Don't set the :ref:`retry` timer to a lower or equal number than the task timeout. * Retry time includes time the task spends waiting in the clusters internal queue. * Don't set the :ref:`queue_limit` so high that tasks time out while waiting to be processed. * In case a task is worked on twice, the task result will be updated with the latest results. * In some rare cases a non-atomic broker will re-queue a task after it has been acknowledged. * If a task runs twice and a previous run has succeeded, the new result wil be discarded. * Limiting the number of retries is handled globally in your actual broker's settings. Support for more brokers is being worked on. Redis ----- The default broker for Django Q clusters. * Atomic * Requires `Redis-py `__ client library: ``pip install redis`` * Does not need cache framework for monitoring * Does not support receipts * Can use existing :ref:`django_redis` connections. * Configure with :ref:`redis_configuration`-py compatible configuration Disque ------ Unlike Redis, Disque supports message receipts which make delivery to the cluster workers guaranteed. In our tests it is as fast or faster than the Redis broker. You can control the amount of time Disque should wait for completion of a task by configuring the :ref:`retry` setting. Bulk task retrieval is supported via the :ref:`bulk` option. * Delivery receipts * Atomic * Needs Django's `Cache framework `__ configured for monitoring * Compatible with `Tynd `__ Disque addon on `Heroku `__ * Still considered Alpha software * Supports bulk dequeue * Requires `Redis-py `__ client library: ``pip install redis`` * See the :ref:`disque_configuration` configuration section for more info. IronMQ ------ This HTTP based queue service is both available directly via `Iron.io `__ and as an add-on on Heroku. * Delivery receipts * Supports bulk dequeue * Needs Django's `Cache framework `__ configured for monitoring * Requires the `iron-mq `__ client library: ``pip install iron-mq`` * See the :ref:`ironmq_configuration` configuration section for options. Amazon SQS ---------- Amazon's Simple Queue Service is another HTTP based message queue. Although `SQS `__ is not the fastest, it is stable, cheap and convenient if you already use AWS. * Delivery receipts * Maximum message size is 256Kb * Supports bulk dequeue up to 10 messages with a maximum total size of 256Kb * Needs Django's `Cache framework `__ configured for monitoring * Requires the `boto3 `__ client library: ``pip install boto3`` * See the :ref:`sqs_configuration` configuration section for options. MongoDB ------- This highly scalable NoSQL database makes for a very fast and reliably persistent at-least-once message broker. Usually available on most PaaS providers, as `open-source `__ or commercial `enterprise `__ edition. * Delivery receipts * Needs Django's `Cache framework `__ configured for monitoring * Can be configured as the Django cache-backend through several open-source cache providers. * Requires the `pymongo `__ driver: ``pip install pymongo`` * See the :ref:`mongo_configuration` configuration section for options. .. _orm_broker: Django ORM ---------- Select this to use Django's database backend as a message broker. Unless you have configured a dedicated database backend for it, this should probably not be your first choice for a high traffic setup. However for a medium message rate and scheduled tasks, this is the most convenient guaranteed delivery broker. * Delivery receipts * Supports bulk dequeue * Needs Django's `Cache framework `__ configured for monitoring * Can be `configured `__ as its own cache backend. * Queue editable in Django Admin * See the :ref:`orm_configuration` configuration on how to set it up. Custom Broker ------------- You can override the :class:`Broker` or any of its existing derived broker types. .. code-block:: python # example Custom broker.py from django_q.brokers import Broker class CustomBroker(Broker): def info(self): return 'My Custom Broker' Using the :ref:`broker_class` configuration setting you can then instruct Django Q to use this instead of one of the existing brokers: .. code-block:: python # example Custom broker class connection Q_CLUSTER = { 'name': 'Custom', 'workers': 8, 'timeout': 60, 'broker_class: 'myapp.broker.CustomBroker' } If you do write a custom broker for one of the many message queueing servers out there we don't support yet, please consider contributing it to the project. Reference --------- The :class:`Broker` class is used internally to communicate with the different types of brokers. You can override this class if you want to contribute and support your own broker. .. py:class:: Broker .. py:method:: async_task(task) Sends a task package to the broker queue and returns a tracking id if available. .. py:method:: dequeue() Gets packages from the broker and returns a list of tuples with a tracking id and the package. .. py:method:: acknowledge(id) Notifies the broker that the task has been processed. Only works with brokers that support delivery receipts. .. py:method:: fail(id) Tells the broker that the message failed to be processed by the cluster. Only available on brokers that support this. Currently only occurs when a cluster fails to unpack a task package. .. py:method:: delete(id) Instructs the broker to delete this message from the queue. .. py:method:: purge_queue() Empties the current queue of all messages. .. py:method:: delete_queue() Deletes the current queue from the broker. .. py:method:: queue_size() Returns the amount of messages in the brokers queue. .. py:method:: lock_size() Optional method that returns the number of messages currently awaiting acknowledgement. Only implemented on brokers that support it. .. py:method:: ping() Returns True if the broker can be reached. .. py:method:: info() Shows the name and version of the currently configured broker. .. py:function:: brokers.get_broker() Returns a :class:`Broker` instance based on the current configuration. django-q-1.0.2/docs/chain.rst000066400000000000000000000060231352353655300157710ustar00rootroot00000000000000.. py:currentmodule:: django_q Chains ====== Sometimes you want to run tasks sequentially. For that you can use the :func:`async_chain` function: .. code-block:: python # async a chain of tasks from django_q.tasks import async_chain, result_group # the chain must be in the format # [(func,(args),{kwargs}),(func,(args),{kwargs}),..] group_id = async_chain([('math.copysign', (1, -1)), ('math.floor', (1,))]) # get group result result_group(group_id, count=2) A slightly more convenient way is to use a :class:`Chain` instance: .. code-block:: python # Chain async from django_q.tasks import Chain # create a chain that uses the cache backend chain = Chain(cached=True) # add some tasks chain.append('math.copysign', 1, -1) chain.append('math.floor', 1) # run it chain.run() print(chain.result()) .. code-block:: python [-1.0, 1] Reference --------- .. py:function:: async_chain(chain, group=None, cached=Conf.CACHED, sync=Conf.SYNC, broker=None) Async a chain of tasks. See also the :class:`Chain` class. :param list chain: a list of tasks in the format [(func,(args),{kwargs}), (func,(args),{kwargs})] :param str group: an optional group name. :param bool cached: run this against the cache backend :param bool sync: execute this inline instead of asynchronous .. py:class:: Chain(chain=None, group=None, cached=Conf.CACHED, sync=Conf.SYNC) A sequential chain of tasks. Acts as a convenient wrapper for :func:`async_chain` You can pass the task chain at construction or you can append individual tasks before running them. :param list chain: a list of task in the format [(func,(args),{kwargs}), (func,(args),{kwargs})] :param str group: an optional group name. :param bool cached: run this against the cache backend :param bool sync: execute this inline instead of asynchronous .. py:method:: append(func, *args, **kwargs) Append a task to the chain. Takes the same arguments as :func:`async_task` :return: the current number of tasks in the chain :rtype: int .. py:method:: run() Start queueing the chain to the worker cluster. :return: the chains group id .. py:method:: result(wait=0) return the full list of results from the chain when it finishes. Blocks until timeout or result. :param int wait: how many milliseconds to wait for a result :return: an unsorted list of results .. py:method:: fetch(failures=True, wait=0) get the task result objects from the chain when it finishes. Blocks until timeout or result. :param failures: include failed tasks :param int wait: how many milliseconds to wait for a result :return: an unsorted list of task objects .. py:method:: current() get the index of the currently executing chain element :return int: current chain index .. py:method:: length() get the length of the chain :return int: length of the chain django-q-1.0.2/docs/cluster.rst000066400000000000000000000121021352353655300163630ustar00rootroot00000000000000 Cluster ======= .. py:currentmodule:: django_q Django Q uses Python's multiprocessing module to manage a pool of workers that will handle your tasks. Start your cluster using Django's ``manage.py`` command:: $ python manage.py qcluster You should see the cluster starting :: 10:57:40 [Q] INFO Q Cluster-31781 starting. 10:57:40 [Q] INFO Process-1:1 ready for work at 31784 10:57:40 [Q] INFO Process-1:2 ready for work at 31785 10:57:40 [Q] INFO Process-1:3 ready for work at 31786 10:57:40 [Q] INFO Process-1:4 ready for work at 31787 10:57:40 [Q] INFO Process-1:5 ready for work at 31788 10:57:40 [Q] INFO Process-1:6 ready for work at 31789 10:57:40 [Q] INFO Process-1:7 ready for work at 31790 10:57:40 [Q] INFO Process-1:8 ready for work at 31791 10:57:40 [Q] INFO Process-1:9 monitoring at 31792 10:57:40 [Q] INFO Process-1 guarding cluster at 31783 10:57:40 [Q] INFO Process-1:10 pushing tasks at 31793 10:57:40 [Q] INFO Q Cluster-31781 running. Stopping the cluster with ctrl-c or either the ``SIGTERM`` and ``SIGKILL`` signals, will initiate the :ref:`stop_procedure`:: 16:44:12 [Q] INFO Q Cluster-31781 stopping. 16:44:12 [Q] INFO Process-1 stopping cluster processes 16:44:13 [Q] INFO Process-1:10 stopped pushing tasks 16:44:13 [Q] INFO Process-1:6 stopped doing work 16:44:13 [Q] INFO Process-1:4 stopped doing work 16:44:13 [Q] INFO Process-1:1 stopped doing work 16:44:13 [Q] INFO Process-1:5 stopped doing work 16:44:13 [Q] INFO Process-1:7 stopped doing work 16:44:13 [Q] INFO Process-1:3 stopped doing work 16:44:13 [Q] INFO Process-1:8 stopped doing work 16:44:13 [Q] INFO Process-1:2 stopped doing work 16:44:14 [Q] INFO Process-1:9 stopped monitoring results 16:44:15 [Q] INFO Q Cluster-31781 has stopped. The number of workers, optional timeouts, recycles and cpu_affinity can be controlled via the :doc:`configure` settings. Multiple Clusters ----------------- You can have multiple clusters on multiple machines, working on the same queue as long as: - They connect to the same :doc:`broker`. - They use the same cluster name. See :doc:`configure` - They share the same ``SECRET_KEY`` for Django. Using a Procfile ---------------- If you host on `Heroku `__ or you are using `Honcho `__ you can start the cluster from a :file:`Procfile` with an entry like this:: worker: python manage.py qcluster Process managers ---------------- While you certainly can run a Django Q with a process manager like `Supervisor `__ or `Circus `__ it is not strictly necessary. The cluster has an internal sentinel that checks the health of all the processes and recycles or reincarnates according to your settings or in case of unexpected crashes. Because of the multiprocessing daemonic nature of the cluster, it is impossible for a process manager to determine the clusters health and resource usage. An example :file:`circus.ini` :: [circus] check_delay = 5 endpoint = tcp://127.0.0.1:5555 pubsub_endpoint = tcp://127.0.0.1:5556 stats_endpoint = tcp://127.0.0.1:5557 [watcher:django_q] cmd = python manage.py qcluster numprocesses = 1 copy_env = True Note that we only start one process. It is not a good idea to run multiple instances of the cluster in the same environment since this does nothing to increase performance and in all likelihood will diminish it. Control your cluster using the ``workers``, ``recycle`` and ``timeout`` settings in your :doc:`configure` An example :file:`supervisor.conf` :: [program:django-q] command = python manage.py qcluster stopasgroup = true Supervisor's ``stopasgroup`` will ensure that the single process doesn't leave orphan process on stop or restart. Reference --------- .. py:class:: Cluster .. py:method:: start Spawns a cluster and then returns .. py:method:: stop Initiates :ref:`stop_procedure` and waits for it to finish. .. py:method:: stat returns a :class:`Stat` object with the current cluster status. .. py:attribute:: pid The cluster process id. .. py:attribute:: host The current hostname .. py:attribute:: sentinel returns the :class:`multiprocessing.Process` containing the :ref:`sentinel`. .. py:attribute:: timeout The clusters timeout setting in seconds .. py:attribute:: start_event A :class:`multiprocessing.Event` indicating if the :ref:`sentinel` has finished starting the cluster .. py:attribute:: stop_event A :class:`multiprocessing.Event` used to instruct the :ref:`sentinel` to initiate the :ref:`stop_procedure` .. py:attribute:: is_starting Bool. Indicating that the cluster is busy starting up .. py:attribute:: is_running Bool. Tells you if the cluster is up and running. .. py:attribute:: is_stopping Bool. Shows that the stop procedure has been started. .. py:attribute:: has_stopped Bool. Tells you if the cluster has finished the stop procedure django-q-1.0.2/docs/conf.py000066400000000000000000000240271352353655300154600ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Django Q documentation build configuration file, created by # sphinx-quickstart on Fri Jun 26 22:18:36 2015. # # 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 import alabaster myPath = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, myPath + '/../') os.environ['DJANGO_SETTINGS_MODULE'] = 'django_q.tests.settings' nitpick_ignore = [('py:class', 'datetime')] # 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 = [ 'alabaster', 'sphinx.ext.todo', 'sphinx.ext.intersphinx', # 'sphinx.ext.autodoc' ] intersphinx_mapping = {'python': ('https://docs.python.org/3.5', None), 'django': ('https://docs.djangoproject.com/en/1.8/', 'https://docs.djangoproject.com/en/1.8//_objects/')} # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # source_suffix = ['.rst', '.md'] 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 = 'Django Q' copyright = '2015-2018, Ilan Steemers' author = 'Ilan Steemers' # 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 = '1.0' # The full version, including alpha/beta/rc tags. release = '1.0.2' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = 'en' # 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 = False # 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 # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True # -- 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 = 'alabaster' # 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.None html_theme_options = { 'description': "A multiprocessing task queue for Django", 'logo': 'logo.png', 'github_user': 'Koed00', 'github_repo': 'django-q', 'github_banner': True, 'travis_button': True, 'analytics_id': 'UA-64807059-1' } html_sidebars = { '**': [ 'about.html', 'navigation.html', 'relations.html', 'searchbox.html', ] } # Add any paths that contain custom themes here, relative to this directory. html_theme_path = [alabaster.get_path()] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = 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 = '_static/favicon.ico' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr' # html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # Now only 'ja' uses this config value # html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. # html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = 'DjangoQdoc' # -- 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': '', # Latex figure (float) alignment # 'figure_align': 'htbp', } # 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 = [ (master_doc, 'DjangoQ.tex', 'Django Q Documentation', 'Ilan Steemers', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. latex_logo = '_static/logo_large.png' # 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 = [ (master_doc, 'djangoq', 'Django Q Documentation', [author], 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 = [ (master_doc, 'DjangoQ', 'Django Q Documentation', author, 'DjangoQ', 'A multiprocessing distributed task queue for Django.', '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 django-q-1.0.2/docs/configure.rst000066400000000000000000000354121352353655300166740ustar00rootroot00000000000000Configuration ------------- .. py:currentmodule:: django_q Configuration is handled via the ``Q_CLUSTER`` dictionary in your :file:`settings.py` .. code:: python # settings.py example Q_CLUSTER = { 'name': 'myproject', 'workers': 8, 'recycle': 500, 'timeout': 60, 'compress': True, 'save_limit': 250, 'queue_limit': 500, 'cpu_affinity': 1, 'label': 'Django Q', 'redis': { 'host': '127.0.0.1', 'port': 6379, 'db': 0, } } All configuration settings are optional: name ~~~~ Used to differentiate between projects using the same broker. On most broker types this will be used as the queue name. Defaults to ``'default'``. .. note:: Tasks are encrypted. When a worker encounters a task it can not decrypt, it will be discarded or failed. workers ~~~~~~~ The number of workers to use in the cluster. Defaults to CPU count of the current host, but can be set to a custom number. [#f1]_ daemonize_workers ~~~~~~~~~~~~~~~~~ Set the daemon flag when spawning workers. You may need to disable this flag if your worker needs to spawn child process but be careful with orphaned child processes in case of sudden termination of the main process. Defaults to ``True``. recycle ~~~~~~~ The number of tasks a worker will process before recycling . Useful to release memory resources on a regular basis. Defaults to ``500``. .. _timeout: timeout ~~~~~~~ The number of seconds a worker is allowed to spend on a task before it's terminated. Defaults to ``None``, meaning it will never time out. Set this to something that makes sense for your project. Can be overridden for individual tasks. See :ref:`retry` for details how to set values for timeout and retry. .. _ack_failures: ack_failures ~~~~~~~~~~~~ When set to ``True``, also acknowledge unsuccessful tasks. This causes failed tasks to be considered as successful deliveries, thereby removing them from the task queue. Can also be set per-task by passing the ``ack_failure`` option to :func:`async_task`. Defaults to ``False``. .. _retry: retry ~~~~~ The number of seconds a broker will wait for a cluster to finish a task, before it's presented again. Only works with brokers that support delivery receipts. Defaults to 60 seconds. The value must be bigger than the time it takes to complete longest task, i.e. :ref:`timeout` must be less than retry value and all tasks must complete in less time than the selected retry time. If this does not hold, i.e. the retry value is less than timeout or less than it takes to finish a task, Django-Q will start the task again if the used broker supports receipts. For example, with the following code .. code:: python # settings.py Q_CLUSTER = { 'retry': 5 'workers': 4, 'orm': 'default', } # example.py from django_q.tasks import async_task async_task('time.sleep', 22) First, ``time.sleep`` is called by the first worker. After 5 seconds second worker will also call ``time.sleep`` because retry time has exceeded and the broker return the task again for the cluster. After 21 seconds from the call to ``async_task`` all four workers are running the ``time.sleep(22)`` call and there is one retry in queue; tasks are started after 0, 5, 10, 15 and 20 seconds after the ``async_task`` was called. After 22 seconds the first worker completes and the task is acknowledged in the broker and the task is not added to task queue anymore but the task that was already in the run queue will run also. So in this example, ``time.sleep`` was called 5 times. Note also that the above issue might cause all workers to run the same long running task preventing new tasks from starting shortly after the task has been started by ``async_task``. In this case the retry time handling could cause the task that has not been started by any worker to be put on work queue again (even multiple times). compress ~~~~~~~~ Compresses task packages to the broker. Useful for large payloads, but can add overhead when used with many small packages. Defaults to ``False`` .. _save_limit: save_limit ~~~~~~~~~~ Limits the amount of successful tasks saved to Django. - Set to ``0`` for unlimited. - Set to ``-1`` for no success storage at all. - Defaults to ``250`` - Failures are always saved. guard_cycle ~~~~~~~~~~~ Guard loop sleep in seconds, must be greater than 0 and less than 60. .. _sync: sync ~~~~ When set to ``True`` this configuration option forces all :func:`async_task` calls to be run with ``sync=True``. Effectively making everything synchronous. Useful for testing. Defaults to ``False``. .. _queue_limit: queue_limit ~~~~~~~~~~~ This does not limit the amount of tasks that can be queued on the broker, but rather how many tasks are kept in memory by a single cluster. Setting this to a reasonable number, can help balance the workload and the memory overhead of each individual cluster. Defaults to ``workers**2``. label ~~~~~ The label used for the Django Admin page. Defaults to ``'Django Q'`` .. _catch_up: catch_up ~~~~~~~~ The default behavior for schedules that didn't run while a cluster was down, is to play catch up and execute all the missed time slots until things are back on schedule. You can override this behavior by setting ``catch_up`` to ``False``. This will make those schedules run only once when the cluster starts and normal scheduling resumes. Defaults to ``True``. .. _redis_configuration: redis ~~~~~ Connection settings for Redis. Defaults:: # redis defaults Q_CLUSTER = { 'redis': { 'host': 'localhost', 'port': 6379, 'db': 0, 'password': None, 'socket_timeout': None, 'charset': 'utf-8', 'errors': 'strict', 'unix_socket_path': None } } For more information on these settings please refer to the `Redis-py `__ documentation .. _django_redis: django_redis ~~~~~~~~~~~~ If you are already using `django-redis `__ for your caching, you can take advantage of its excellent connection backend by supplying the name of the cache connection you want to use instead of a direct Redis connection:: # example django-redis connection Q_CLUSTER = { 'name': 'DJRedis', 'workers': 4, 'timeout': 90, 'django_redis': 'default' } .. tip:: Django Q uses your ``SECRET_KEY`` to encrypt task packages and prevent task crossover. So make sure you have it set up in your Django settings. .. _disque_configuration: disque_nodes ~~~~~~~~~~~~ If you want to use Disque as your broker, set this to a list of available Disque nodes and each cluster will randomly try to connect to them:: # example disque connection Q_CLUSTER = { 'name': 'DisqueBroker', 'workers': 4, 'timeout': 60, 'retry': 60, 'disque_nodes': ['127.0.0.1:7711', '127.0.0.1:7712'] } Django Q is also compatible with the `Tynd Disque `__ addon on `Heroku `__:: # example Tynd Disque connection import os Q_CLUSTER = { 'name': 'TyndBroker', 'workers': 8, 'timeout': 30, 'retry': 60, 'bulk': 10, 'disque_nodes': os.environ['TYND_DISQUE_NODES'].split(','), 'disque_auth': os.environ['TYND_DISQUE_AUTH'] } disque_auth ~~~~~~~~~~~ Optional Disque password for servers that require authentication. .. _ironmq_configuration: iron_mq ~~~~~~~ Connection settings for IronMQ:: # example IronMQ connection Q_CLUSTER = { 'name': 'IronBroker', 'workers': 8, 'timeout': 30, 'retry': 60, 'queue_limit': 50, 'bulk': 10, 'iron_mq': { 'host': 'mq-aws-us-east-1.iron.io', 'token': 'Et1En7.....0LuW39Q', 'project_id': '500f7b....b0f302e9' } } All connection keywords are supported. See the `iron-mq `__ library for more info .. _sqs_configuration: sqs ~~~ To use Amazon SQS as a broker you need to provide the AWS region and credentials either via the config, or any other boto3 configuration method:: # example SQS broker connection Q_CLUSTER = { 'name': 'SQSExample', 'workers': 4, 'timeout': 60, 'retry': 90, 'queue_limit': 100, 'bulk': 5, 'sqs': { 'aws_region': 'us-east-1', # optional 'aws_access_key_id': 'ac-Idr.....YwflZBaaxI', # optional 'aws_secret_access_key': '500f7b....b0f302e9' # optional } } Please make sure these credentials have proper SQS access. Amazon SQS only supports a bulk setting between 1 and 10, with the total payload not exceeding 256kb. .. _orm_configuration: orm ~~~ If you want to use Django's database backend as a message broker, set the ``orm`` keyword to the database connection you want it to use:: # example ORM broker connection Q_CLUSTER = { 'name': 'DjangORM', 'workers': 4, 'timeout': 90, 'retry': 120, 'queue_limit': 50, 'bulk': 10, 'orm': 'default' } Using the Django ORM backend will also enable the Queued Tasks table in the Admin. If you need better performance , you should consider using a different database backend than the main project. Set ``orm`` to the name of that database connection and make sure you run migrations on it using the ``--database`` option. .. _mongo_configuration: mongo ~~~~~ To use MongoDB as a message broker you simply provide the connection information in a dictionary:: # example MongoDB broker connection Q_CLUSTER = { 'name': 'MongoDB', 'workers': 8, 'timeout': 60, 'retry': 70, 'queue_limit': 100, 'mongo': { 'host': '127.0.0.1', 'port': 27017 } } The ``mongo`` dictionary can contain any of the parameters exposed by pymongo's `MongoClient `__ If you want to use a mongodb uri, you can supply it as the ``host`` parameter. mongo_db ~~~~~~~~ When using the MongoDB broker you can optionally provide a database name to use for the queues. Defaults to default database if available, otherwise ``django-q`` .. _broker_class: broker_class ~~~~~~~~~~~~ You can use a custom broker class for your cluster workers:: # example Custom broker class connection Q_CLUSTER = { 'name': 'Custom', 'workers': 8, 'timeout': 60, 'broker_class: 'myapp.broker.CustomBroker' } Make sure your ``CustomBroker`` class inherits from either the base :class:`Broker` class or one of its children. .. _bulk: bulk ~~~~ Sets the number of messages each cluster tries to get from the broker per call. Setting this on supported brokers can improve performance. Especially HTTP based or very high latency servers can benefit from bulk dequeue. Keep in mind however that settings this too high can degrade performance with multiple clusters or very large task packages. Not supported by the default Redis broker. Defaults to ``1``. poll ~~~~ Sets the queue polling interval for database brokers that don't have a blocking call. Currently only affects the ORM and MongoDB brokers. Defaults to ``0.2`` (seconds). cache ~~~~~ For some brokers, you will need to set up the Django `cache framework `__ to gather statistics for the monitor. You can indicate which cache to use by setting this value. Defaults to ``default``. .. _cached: cached ~~~~~~ Switches all task and result functions from using the database backend to the cache backend. This is the same as setting the keyword ``cached=True`` on all task functions. Instead of a bool this can also be set to the number of seconds you want the cache to retain results. e.g. ``cached=60`` scheduler ~~~~~~~~~ You can disable the scheduler by setting this option to ``False``. This will reduce a little overhead if you're not using schedules, but is most useful if you want to temporarily disable all schedules. Defaults to ``True`` .. _error_reporter: error_reporter ~~~~~~~~~~~~~~ You can redirect worker exceptions directly to various error reporters (for example `Rollbar `__ or `Sentry `__) by installing Django Q with the necessary `extras `__. To enable installed error reporters, you must provide the configuration settings required by an error reporter extension:: # error_reporter config--rollbar example Q_CLUSTER = { 'error_reporter': { 'rollbar': { 'access_token': '32we33a92a5224jiww8982', 'environment': 'Django-Q' } } } For more information on error reporters and developing error reporting plugins for Django Q, see :doc:`errors`. cpu_affinity ~~~~~~~~~~~~ Sets the number of processor each worker can use. This does not affect auxiliary processes like the sentinel or monitor and is only useful for tweaking the performance of very high traffic clusters. The affinity number has to be higher than zero and less than the total number of processors to have any effect. Defaults to using all processors:: # processor affinity example. 4 processors, 4 workers, cpu_affinity: 1 worker 1 cpu [0] worker 2 cpu [1] worker 3 cpu [2] worker 4 cpu [3] 4 processors, 4 workers, cpu_affinity: 2 worker 1 cpu [0, 1] worker 2 cpu [2, 3] worker 3 cpu [0, 1] worker 4 cpu [2, 3] 8 processors, 8 workers, cpu_affinity: 3 worker 1 cpu [0, 1, 2] worker 2 cpu [3, 4, 5] worker 3 cpu [6, 7, 0] worker 4 cpu [1, 2, 3] worker 5 cpu [4, 5, 6] worker 6 cpu [7, 0, 1] worker 7 cpu [2, 3, 4] worker 8 cpu [5, 6, 7] In some cases, setting the cpu affinity for your workers can lead to performance improvements, especially if the load is high and consists of many repeating small tasks. Start with an affinity of 1 and work your way up. You will have to experiment with what works best for you. As a rule of thumb; cpu_affinity 1 favors repetitive short running tasks, while no affinity benefits longer running tasks. .. note:: The ``cpu_affinity`` setting requires the optional :ref:`psutil` module. *Psutil does not support cpu affinity on OS X at this time.* .. py:module:: django_q .. rubric:: Footnotes .. [#f1] Uses :func:`multiprocessing.cpu_count()` which can fail on some platforms. If so , please set the worker count in the configuration manually or install :ref:`psutil` to provide an alternative cpu count method. django-q-1.0.2/docs/errors.rst000066400000000000000000000023221352353655300162210ustar00rootroot00000000000000Errors ------ .. py:currentmodule:: django_q Django Q uses a pluggable error reporter system based upon python `extras `__, allowing anyone to develop plugins for their favorite error reporting and monitoring integration. Currently implemented examples include `Rollbar `__ and `Sentry `__. Error reporting plugins register a class which implements a ``report`` method, which is invoked when a Django Q cluster encounters an error, passing information to the particular service. Error reporters must be :ref:`configured` via the ``Q_CLUSTER`` dictionary in your :file:`settings.py`. These settings are passed as kwargs upon initiation of the Error Reporter. Therefore, in order to implement a new plugin, a package must expose a class which will be instantiated with the necessary information via the ``Q_CLUSTER`` settings and implements a single ``report`` method. For example implementations, see `django-q-rollbar `__ and `django-q-sentry `__ django-q-1.0.2/docs/examples.rst000066400000000000000000000246771352353655300165440ustar00rootroot00000000000000Examples -------- .. py:currentmodule:: django_q Emails ====== Sending an email can take a while so why not queue it: .. code-block:: python # Welcome mail with follow up example from datetime import timedelta from django.utils import timezone from django_q.tasks import async_task, schedule from django_q.models import Schedule def welcome_mail(user): msg = 'Welcome to our website' # send this message right away async_task('django.core.mail.send_mail', 'Welcome', msg, 'from@example.com', [user.email]) # and this follow up email in one hour msg = 'Here are some tips to get you started...' schedule('django.core.mail.send_mail', 'Follow up', msg, 'from@example.com', [user.email], schedule_type=Schedule.ONCE, next_run=timezone.now() + timedelta(hours=1)) # since the `repeats` defaults to -1 # this schedule will erase itself after having run Since you're only telling Django Q to take care of the emails, you can quickly move on to serving web pages to your user. Signals ======= A good place to use async tasks are Django's model signals. You don't want to delay the saving or creation of objects, but sometimes you want to trigger a lot of actions: .. code-block:: python # Message on object change from django.contrib.auth.models import User from django.db.models.signals import pre_save from django.dispatch import receiver from django_q.tasks import async_task # set up the pre_save signal for our user @receiver(pre_save, sender=User) def email_changed(sender, instance, **kwargs): try: user = sender.objects.get(pk=instance.pk) except sender.DoesNotExist: pass # new user else: # has his email changed? if not user.email == instance.email: # tell everyone async_task('tasks.inform_everyone', instance) The task will send a message to everyone else informing them that the users email address has changed. Note that this adds almost no overhead to the save action: .. code-block:: python # tasks.py def inform_everyone(user): mails = [] for u in User.objects.exclude(pk=user.pk): msg = 'Dear {}, {} has a new email address: {}' msg = msg.format(u.username, user.username, user.email) mails.append(('New email', msg, 'from@example.com', [u.email])) return send_mass_mail(mails) .. code-block:: python # or do it async again def inform_everyone_async(user): for u in User.objects.exclude(pk=user.pk): msg = 'Dear {}, {} has a new email address: {}' msg = msg.format(u.username, user.username, user.email) async_task('django.core.mail.send_mail', 'New email', msg, 'from@example.com', [u.email]) Of course you can do other things beside sending emails. These are just generic examples. You can use signals with async to update fields in other objects too. Let's say this users email address is not just on the User object, but you stored it in some other places too without a reference. By attaching an async action to the save signal, you can now update that email address in those other places without impacting the the time it takes to return your views. Reports ======= In this example the user requests a report and we let the cluster do the generating, while handling the result with a hook. .. code-block:: python # Report generation with hook example from django_q.tasks import async_task # views.py # user requests a report. def create_report(request): async_task('tasks.create_html_report', request.user, hook='tasks.email_report') .. code-block:: python # tasks.py from django_q.tasks import async_task # report generator def create_html_report(user): html_report = 'We had a great quarter!' return html_report # report mailer def email_report(task): if task.success: # Email the report async_task('django.core.mail.send_mail', 'The report you requested', task.result, 'from@example.com', task.args[0].email) else: # Tell the admins something went wrong async_task('django.core.mail.mail_admins', 'Report generation failed', task.result) The hook is practical here, because it allows us to detach the sending task from the report generation function and to report on possible failures. Haystack ======== If you use `Haystack `__ as your projects search engine, here's an example of how you can have Django Q take care of your indexes in real time using model signals: .. code-block:: python # Real time Haystack indexing from .models import Document from django.db.models.signals import post_save from django.dispatch import receiver from django_q.tasks import async_task # hook up the post save handler @receiver(post_save, sender=Document) def document_changed(sender, instance, **kwargs): async_task('tasks.index_object', sender, instance, save=False) # turn off result saving to not flood your database .. code-block:: python # tasks.py from haystack import connection_router, connections def index_object(sender, instance): # get possible backends backends = connection_router.for_write(instance=instance) for backend in backends: # get the index for this model index = connections[backend].get_unified_index()\ .get_index(sender) # update it index.update_object(instance, using=backend) Now every time a Document is saved, your indexes will be updated without causing a delay in your save action. You could expand this to dealing with deletes, by adding a ``post_delete`` signal and calling ``index.remove_object`` in the async_task function. .. _shell: Shell ===== You can execute or schedule shell commands using Pythons :mod:`subprocess` module: .. code-block:: python from django_q.tasks import async_task, result # make a backup copy of setup.py async_task('subprocess.call', ['cp', 'setup.py', 'setup.py.bak']) # call ls -l and dump the output task_id=async_task('subprocess.check_output', ['ls', '-l']) # get the result dir_list = result(task_id) In Python 3.5 the subprocess module has changed quite a bit and returns a :class:`subprocess.CompletedProcess` object instead: .. code-block:: python from django_q.tasks import async_task, result # make a backup copy of setup.py tid = async_task('subprocess.run', ['cp', 'setup.py', 'setup.py.bak']) # get the result r=result(tid, 500) # we can now look at the original arguments >>> r.args ['cp', 'setup.py', 'setup.py.bak'] # and the returncode >>> r.returncode 0 # to capture the output we'll need a pipe from subprocess import PIPE # call ls -l and pipe the output tid = async_task('subprocess.run', ['ls', '-l'], stdout=PIPE) # get the result res = result(tid, 500) # print the output print(res.stdout) Instead of :func:`async_task` you can of course also use :func:`schedule` to schedule commands. For regular Django management commands, it is easier to call them directly: .. code-block:: python from django_q.tasks import async_task, schedule async_task('django.core.management.call_command','clearsessions') # or clear those sessions every hour schedule('django.core.management.call_command', 'clearsessions', schedule_type='H') Groups ====== A group example with Kernel density estimation for probability density functions using the Parzen-window technique. Adapted from `Sebastian Raschka's blog `__ .. code-block:: python # Group example with Parzen-window estimation import numpy from django_q.tasks import async_task, result_group, delete_group # the estimation function def parzen_estimation(x_samples, point_x, h): k_n = 0 for row in x_samples: x_i = (point_x - row[:, numpy.newaxis]) / h for row in x_i: if numpy.abs(row) > (1 / 2): break else: k_n += 1 return h, (k_n / len(x_samples)) / (h ** point_x.shape[1]) # create 100 calculations and return the collated result def parzen_async(): # clear the previous results delete_group('parzen', cached=True) mu_vec = numpy.array([0, 0]) cov_mat = numpy.array([[1, 0], [0, 1]]) sample = numpy.random. \ multivariate_normal(mu_vec, cov_mat, 10000) widths = numpy.linspace(1.0, 1.2, 100) x = numpy.array([[0], [0]]) # async_task them with a group label to the cache backend for w in widths: async_task(parzen_estimation, sample, x, w, group='parzen', cached=True) # return after 100 results return result_group('parzen', count=100, cached=True) Django Q is not optimized for distributed computing, but this example will give you an idea of what you can do with task :doc:`group`. Alternatively the ``parzen_async()`` function can also be written with :func:`async_iter`, which automatically utilizes the cache backend and groups to return a single result from an iterable: .. code-block:: python # create 100 calculations and return the collated result def parzen_async(): mu_vec = numpy.array([0, 0]) cov_mat = numpy.array([[1, 0], [0, 1]]) sample = numpy.random. \ multivariate_normal(mu_vec, cov_mat, 10000) widths = numpy.linspace(1.0, 1.2, 100) x = numpy.array([[0], [0]]) # async_task them with async_task iterable args = [(sample, x, w) for w in widths] result_id = async_iter(parzen_estimation, args, cached=True) # return the cached result or timeout after 10 seconds return result(result_id, wait=10000, cached=True) .. note:: If you have an example you want to share, please submit a pull request on `github `__. django-q-1.0.2/docs/group.rst000066400000000000000000000103221352353655300160400ustar00rootroot00000000000000.. py:currentmodule:: django_q Groups ====== You can group together results by passing :func:`async_task` the optional ``group`` keyword: .. code-block:: python # result group example from django_q.tasks import async_task, result_group for i in range(4): async_task('math.modf', i, group='modf') # wait until the group has 4 results result = result_group('modf', count=4) print(result) .. code-block:: python [(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (0.0, 3.0)] Note that this particular example can be achieved much faster with :doc:`iterable` Take care to not limit your results database too much and call :func:`delete_group` before each run, unless you want your results to keep adding up. Instead of :func:`result_group` you can also use :func:`fetch_group` to return a queryset of :class:`Task` objects.: .. code-block:: python # fetch group example from django_q.tasks import fetch_group, count_group, result_group # count the number of failures failure_count = count_group('modf', failures=True) # only use the successes results = fetch_group('modf') if failure_count: results = results.exclude(success=False) results = [task.result for task in successes] # this is the same as results = fetch_group('modf', failures=False) results = [task.result for task in successes] # and the same as results = result_group('modf') # filters failures by default Getting results by using :func:`result_group` is of course much faster than using :func:`fetch_group`, but it doesn't offer the benefits of Django's queryset functions. .. note:: Calling ``Queryset.values`` for the result on Django 1.7 or lower will return a list of encoded results. If you can't upgrade to Django 1.8, use list comprehension or an iterator to return decoded results. You can also access group functions from a task result instance: .. code-block:: python from django_q.tasks import fetch task = fetch('winter-speaker-alpha-ceiling') if task.group_count() > 100: print(task.group_result()) task.group_delete() print('Deleted group {}'.format(task.group)) or call them directly on :class:`AsyncTask` object: .. code-block:: python from django_q.tasks import AsyncTask # add a task to the math group and run it cached a = AsyncTask('math.floor', 2.5, group='math', cached=True) # wait until this tasks group has 10 results result = a.result_group(count=10) Reference --------- .. py:function:: result_group(group_id, failures=False, wait=0, count=None, cached=False) Returns the results of a task group :param str group_id: the group identifier :param bool failures: set this to ``True`` to include failed results :param int wait: optional milliseconds to wait for a result or count. -1 for indefinite :param int count: block until there are this many results in the group :param bool cached: run this against the cache backend :returns: a list of results :rtype: list .. py:function:: fetch_group(group_id, failures=True, wait=0, count=None, cached=False) Returns a list of tasks in a group :param str group_id: the group identifier :param bool failures: set this to ``False`` to exclude failed tasks :param int wait: optional milliseconds to wait for a task or count. -1 for indefinite :param int count: block until there are this many tasks in the group :param bool cached: run this against the cache backend. :returns: a list of :class:`Task` :rtype: list .. py:function:: count_group(group_id, failures=False, cached=False) Counts the number of task results in a group. :param str group_id: the group identifier :param bool failures: counts the number of failures if ``True`` :param bool cached: run this against the cache backend. :returns: the number of tasks or failures in a group :rtype: int .. py:function:: delete_group(group_id, tasks=False, cached=False) Deletes a group label from the database. :param str group_id: the group identifier :param bool tasks: also deletes the associated tasks if ``True`` :param bool cached: run this against the cache backend. :returns: the numbers of tasks affected :rtype: int django-q-1.0.2/docs/index.rst000066400000000000000000000023461352353655300160220ustar00rootroot00000000000000.. Django Q documentation master file, created by sphinx-quickstart on Fri Jun 26 22:18:36 2015. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to Django Q =================== Django Q is a native Django task queue, scheduler and worker application using Python multiprocessing. Features -------- - Multiprocessing worker pools - Asynchronous tasks - Scheduled and repeated tasks - Encrypted and compressed packages - Failure and success database or cache - Result hooks, groups and chains - Django Admin integration - PaaS compatible with multiple instances - Multi cluster monitor - Redis, Disque, IronMQ, SQS, MongoDB or ORM - Rollbar and Sentry support Django Q is tested with: Python 3.6. and 3.7, Django 1.11.x LTS and 2.2.x Contents: .. toctree:: :maxdepth: 2 Installation Configuration Brokers Tasks Groups Iterable Chains Schedules Cluster Monitor Admin Errors Signals Architecture Examples * :ref:`genindex` * :ref:`search` django-q-1.0.2/docs/install.rst000066400000000000000000000155001352353655300163550ustar00rootroot00000000000000Installation ============ .. py:currentmodule:: django_q - Install the latest version with pip:: $ pip install django-q - Add :mod:`django_q` to ``INSTALLED_APPS`` in your projects :file:`settings.py`:: INSTALLED_APPS = ( # other apps 'django_q', ) - Run Django migrations to create the database tables:: $ python manage.py migrate - Choose a message :doc:`broker` , configure it and install the appropriate client library. - Run Django Q cluster in order to handle tasks async:: $ python manage.py qcluster Requirements ------------ Django Q is tested for Python 3.6 and 3.7 - `Django `__ Django Q aims to use as much of Django's standard offerings as possible The code is tested against Django versions `1.11.x LTS` and `2.1.x`. Please note that Django versions below 2.0 do not support Python 3.7 - `Django-picklefield `__ Used to store args, kwargs and result objects in the database. - `Arrow `__ The scheduler uses Chris Smith's wonderful project to determine correct dates in the future. - `Blessed `__ This feature-filled fork of Erik Rose's blessings project provides the terminal layout of the monitor. Optional ~~~~~~~~ - `Redis-py `__ client by Andy McCurdy is used to interface with both the Redis and Disque brokers:: $ pip install redis .. _psutil_package: - `Psutil `__ python system and process utilities module by Giampaolo Rodola', is an optional requirement and adds cpu affinity settings to the cluster:: $ pip install psutil - `Hiredis `__ parser. This C library maintained by the core Redis team is faster than the standard PythonParser during high loads:: $ pip install hiredis - `Boto3 `__ is used for the Amazon SQS broker in favor of the now deprecating boto library:: $ pip install boto3 - `Iron-mq `_ is the official python binding for the IronMQ broker:: $ pip install iron-mq - `Pymongo `__ is needed if you want to use MongoDB as a message broker:: $ pip install pymongo - `Redis `__ server is the default broker for Django Q. It provides the best performance and does not require Django's cache framework for monitoring. - `Disque `__ server is based on Redis by the same author, but focuses on reliable queues. Currently in Alpha, but highly recommended. You can either build it from source or use it on Heroku through the `Tynd `__ beta. - `MongoDB `__ is a highly scalable NoSQL database which makes for a very fast and reliably persistent at-least-once message broker. Usually available on most PaaS providers. - `Pyrollbar `__ is an error notifier for `Rollbar `__ which lets you manage your worker errors in one place. Needs a `Rollbar `__ account and access key:: $ pip install rollbar Add-ons ------- - `django-q-rollbar `__ is a Rollbar error reporter:: $ pip install django-q[rollbar] - `django-q-sentry `__ is a Sentry error reporter:: $ pip install django-q[sentry] - `django-q-email `__ is a compatible Django email backend that will automatically async queue your emails. Compatibility ------------- Django Q is still a young project. If you do find any incompatibilities please submit an issue on `github `__. OS X ~~~~ Running Django Q on OS X should work fine, except for the following known issues: * :meth:`multiprocessing.Queue.qsize()` is not supported. This leads to the monitor not reporting the internal queue size of clusters running under OS X. * CPU count through :func:`multiprocessing.cpu_count()` does not work. Installing :ref:`psutil` provides Django Q with an alternative way of determining the number of CPU's on your system * CPU affinity is provided by :ref:`psutil` which at this time does not support this feature on OSX. The code however is aware of this and will fake the CPU affinity assignment in the logs without actually assigning it. This way you can still develop with this setting. Windows ~~~~~~~ The cluster and worker multiprocessing code depend on the OS's ability to fork, unfortunately forking is not supported under windows. You should however be able to develop and test without the cluster by setting the ``sync`` option to ``True`` in the configuration. This will run all ``async`` calls inline through a single cluster worker without the need for forking. Other known issues are: * :func:`os.getppid()` is only supported under windows since Python 3.2. If you use an older version you need to install :ref:`psutil` as an alternative. * CPU count through :func:`multiprocessing.cpu_count()` occasionally fails on servers. Installing :ref:`psutil` provides Django Q with an alternative way of determining the number of CPU's on your system * The monitor and info commands rely on the Curses package which is not officially supported on windows. There are however some ports available like `this one `__ by Christoph Gohlke. Python ~~~~~~ The code is always tested against the latest version Python 3 and we try to stay compatible with the last two versions of each. Current tests are performed with 3.6 and 3.7 If you do encounter any regressions with earlier versions, please submit an issue on `github `__ .. note:: Django releases before 1.11 are not officially supported on Python 3.6 Django releases before 2.0 are not supported on Python 3.7 Open-source packages ~~~~~~~~~~~~~~~~~~~~ Django Q is always tested with the latest versions of the required and optional Python packages. We try to keep the dependencies as up to date as possible. You can reference the `requirements `__ file to determine which versions are currently being used for tests and development. Django ~~~~~~ We strive to be compatible with last two major version of Django. At the moment this means we support the 1.11.x and 2.2.x releases. Since we are now no longer supporting Python 2, we can also not support older versions of Django that do not support Python 3. For this you can always use the pre 1.0 release, but it's no longer maintained. django-q-1.0.2/docs/iterable.rst000066400000000000000000000061121352353655300164750ustar00rootroot00000000000000.. py:currentmodule:: django_q Iterable ======== If you have an iterable object with arguments for a function, you can use :func:`async_iter` to async them with a single command:: # Async Iterable example from django_q.tasks import async_iter, result # set up a list of arguments for math.floor iter = [i for i in range(100)] # async_task iter them id=async_iter('math.floor',iter) # wait for the collated result for 1 second result_list = result(id, wait=1000) This will individually queue 100 tasks to the worker cluster, which will save their results in the cache backend for speed. Once all the 100 results are in the cache, they are collated into a list and saved as a single result in the database. The cache results are then cleared. You can also use an :class:`Iter` instance which can sometimes be more convenient: .. code-block:: python from django_q.tasks import Iter i = Iter('math.copysign') # add some arguments i.append(1, -1) i.append(2, -1) i.append(3, -1) # run it i.run() # get the results print(i.result()) .. code-block:: python [-1.0, -2.0, -3.0] Reference --------- .. py:function:: async_iter(func, args_iter,**kwargs) Runs iterable arguments against the cache backend and returns a single collated result. Accepts the same options as :func:`async_task` except ``hook``. See also the :class:`Iter` class. :param object func: The task function to execute :param args: An iterable containing arguments for the task function :param dict kwargs: Keyword arguments for the task function. Ignores ``hook``. :returns: The uuid of the task :rtype: str .. py:class:: Iter(func=None, args=None, kwargs=None, cached=Conf.CACHED, sync=Conf.SYNC, broker=None) An async task with iterable arguments. Serves as a convenient wrapper for :func:`async_iter` You can pass the iterable arguments at construction or you can append individual argument tuples. :param func: the function to execute :param args: an iterable of arguments. :param kwargs: the keyword arguments :param bool cached: run this against the cache backend :param bool sync: execute this inline instead of asynchronous :param broker: optional broker instance .. py:method:: append(*args) Append arguments to the iter set. Returns the current set count. :param args: the arguments for a single execution :return: the current set count :rtype: int .. py:method:: run() Start queueing the tasks to the worker cluster. :return: the task result id .. py:method:: result(wait=0) return the full list of results. :param int wait: how many milliseconds to wait for a result :return: an unsorted list of results .. py:method:: fetch(wait=0) get the task result objects. :param int wait: how many milliseconds to wait for a result :return: an unsorted list of task objects .. py:method:: length() get the length of the arguments list :return int: length of the argument list django-q-1.0.2/docs/monitor.rst000066400000000000000000000116221352353655300163770ustar00rootroot00000000000000Monitor ======= .. py:currentmodule::django_q.monitor The cluster monitor shows live information about all the Q clusters connected to your project. Start the monitor with Django's `manage.py` command:: $ python manage.py qmonitor .. image:: _static/monitor.png For all broker types except the Redis broker, the monitor utilizes Django's cache framework to store statistics of running clusters. This can be any type of cache backend as long as it can be shared among Django instances. For this reason, the local memory backend will not work. Legend ------ Host ~~~~ Shows the hostname of the server this cluster is running on. Id ~~ The cluster Id. Same as the cluster process ID or pid. State ~~~~~ Current state of the cluster: - **Starting** The cluster is spawning workers and getting ready. - **Idle** Everything is ok, but there are no tasks to process. - **Working** Processing tasks like a good cluster should. - **Stopping** The cluster does not take on any new tasks and is finishing. - **Stopped** All tasks have been processed and the cluster is shutting down. Pool ~~~~ The current number of workers in the cluster pool. TQ ~~ **Task Queue** counts the number of tasks in the queue [#f1]_ If this keeps rising it means you are taking on more tasks than your cluster can handle. You can limit this by settings the :ref:`queue_limit` in your cluster configuration, after which it will turn green when that limit has been reached. If your task queue is always hitting its limit and your running out of resources, it may be time to add another cluster. RQ ~~ **Result Queue** shows the number of results in the queue. [#f1]_ Since results are only saved by a single process which has to access the database. It's normal for the result queue to take slightly longer to clear than the task queue. RC ~~ **Reincarnations** shows the amount of processes that have been reincarnated after a recycle, sudden death or timeout. If this number is unusually high, you are either suffering from repeated task errors or severe timeouts and you should check your logs for details. Up ~~ **Uptime** the amount of time that has passed since the cluster was started. .. centered:: Press `q` to quit the monitor and return to your terminal. Info ---- If you just want to see a one-off summary of your cluster stats you can use the `qinfo` management command:: $ python manage.py qinfo .. image:: _static/info.png All stats are summed over all available clusters. Task rate is calculated over the last 24 hours and will show the number of tasks per second, minute, hour or day depending on the amount. Average execution time (`Avg time`) is calculated in seconds over the last 24 hours. Since some of these numbers are based on what is available in your tasks database, limiting or disabling the result backend will skew them. Like with the monitor, these statistics come from a Redis server or Django's cache framework. So make sure you have either one configured. To print out the current configuration run:: $ python manage.py qinfo --config Status ------ You can check the status of your clusters straight from your code with the :class:`Stat` class: .. code:: python from django_q.monitor import Stat for stat in Stat.get_all(): print(stat.cluster_id, stat.status) # or if you know the cluster id cluster_id = 1234 stat = Stat.get(cluster_id) print(stat.status, stat.workers) Reference --------- .. py:class:: Stat Cluster status object. .. py:attribute:: cluster_id Id of this cluster. Corresponds with the process id. .. py:attribute:: tob Time Of Birth .. py:method:: uptime Shows the number of seconds passed since the time of birth .. py:attribute:: reincarnations The number of times the sentinel had to start a new worker process. .. py:attribute:: status String representing the current cluster status. .. py:attribute:: task_q_size The number of tasks currently in the task queue. [#f1]_ .. py:attribute:: done_q_size The number of tasks currently in the result queue. [#f1]_ .. py:attribute:: pusher The pid of the pusher process .. py:attribute:: monitor The pid of the monitor process .. py:attribute:: sentinel The pid of the sentinel process .. py:attribute:: workers A list of process ids of the workers currently in the cluster pool. .. py:method:: empty_queues Returns true or false depending on any tasks still present in the task or result queue. .. py:classmethod:: get(cluster_id, broker=None) Gets the current :class:`Stat` for the cluster id. Takes an optional broker connection. .. py:classmethod:: get_all(broker=None) Returns a list of :class:`Stat` objects for all active clusters. Takes an optional broker connection. .. rubric:: Footnotes .. [#f1] Uses :meth:`multiprocessing.Queue.qsize()` which is not implemented on OS X and always returns 0. django-q-1.0.2/docs/schedules.rst000066400000000000000000000152051352353655300166700ustar00rootroot00000000000000Schedules ========= .. py:currentmodule:: django_q Schedule -------- Schedules are regular Django models. You can manage them through the :ref:`admin_page` or directly from your code with the :func:`schedule` function or the :class:`Schedule` model: .. code:: python # Use the schedule wrapper from django_q.tasks import schedule schedule('math.copysign', 2, -2, hook='hooks.print_result', schedule_type='D') # Or create the object directly from django_q.models import Schedule Schedule.objects.create(func='math.copysign', hook='hooks.print_result', args='2,-2', schedule_type=Schedule.DAILY ) # In case you want to use q_options schedule('math.sqrt', 9, hook='hooks.print_result', q_options={'timeout': 30}, schedule_type=Schedule.HOURLY) # Run a schedule every 5 minutes, starting at 6 today # for 2 hours import arrow schedule('math.hypot', 3, 4, schedule_type=Schedule.MINUTES, minutes=5, repeats=24, next_run=arrow.utcnow().replace(hour=18, minute=0)) Missed schedules ---------------- If your cluster has not run for a while, the default behavior for the scheduler is to play catch up with the schedules and keep executing them until they are up to date. In practical terms this means the scheduler will execute tasks in the past, reschedule them in the past and immediately execute them again until the schedule is set in the future. This default behavior is intended to facilitate schedules that poll or gather statistics, but might not be suitable to your particular situation. You can change this by setting the :ref:`catch_up` configuration setting to ``False``. The scheduler will then skip execution of scheduled events in the past. Instead those tasks will run once when the cluster starts again and the scheduler will find the next available slot in the future according to original schedule parameters. Management Commands ------------------- If you want to schedule regular Django management commands, you can use the :mod:`django.core.management` module to call them directly: .. code-block:: python from django_q.tasks import schedule # run `manage.py clearsession` every hour schedule('django.core.management.call_command', 'clearsessions', schedule_type='H') Or you can make a wrapper function which you can then schedule in Django Q: .. code-block:: python # tasks.py from django.core import management # wrapping `manage.py clearsessions` def clear_sessions_command(): return management.call_command('clearsessions') # now you can schedule it to run every hour from django_q.tasks import schedule schedule('tasks.clear_sessions_command', schedule_type='H') Check out the :ref:`shell` examples if you want to schedule regular shell commands Reference --------- .. py:function:: schedule(func, *args, name=None, hook=None, schedule_type='O', minutes=None, repeats=-1, next_run=now() , q_options=None, **kwargs) Creates a schedule :param str func: the function to schedule. Dotted strings only. :param args: arguments for the scheduled function. :param str name: An optional name for your schedule. :param str hook: optional result hook function. Dotted strings only. :param str schedule_type: (O)nce, M(I)nutes, (H)ourly, (D)aily, (W)eekly, (M)onthly, (Q)uarterly, (Y)early or :attr:`Schedule.TYPE` :param int minutes: Number of minutes for the Minutes type. :param int repeats: Number of times to repeat schedule. -1=Always, 0=Never, n =n. :param datetime next_run: Next or first scheduled execution datetime. :param dict q_options: options passed to async_task for this schedule :param kwargs: optional keyword arguments for the scheduled function. .. class:: Schedule A database model for task schedules. .. py:attribute:: id Primary key .. py:attribute:: name A name for your schedule. Tasks created by this schedule will assume this or the primary key as their group id. .. py:attribute:: func The function to be scheduled .. py:attribute:: hook Optional hook function to be called after execution. .. py:attribute:: args Positional arguments for the function. .. py:attribute:: kwargs Keyword arguments for the function .. py:attribute:: schedule_type The type of schedule. Follows :attr:`Schedule.TYPE` .. py:attribute:: TYPE :attr:`ONCE`, :attr:`MINUTES`, :attr:`HOURLY`, :attr:`DAILY`, :attr:`WEEKLY`, :attr:`MONTHLY`, :attr:`QUARTERLY`, :attr:`YEARLY` .. py:attribute:: minutes The number of minutes the :attr:`MINUTES` schedule should use. Is ignored for other schedule types. .. py:attribute:: repeats Number of times to repeat the schedule. -1=Always, 0=Never, n =n. When set to -1, this will keep counting down. .. py:attribute:: next_run Datetime of the next scheduled execution. .. py:attribute:: task Id of the last task generated by this schedule. .. py:method:: last_run() Admin link to the last executed task. .. py:method:: success() Returns the success status of the last executed task. .. py:attribute:: ONCE `'O'` the schedule will only run once. If it has a negative :attr:`repeats` it will be deleted after it has run. If you want to keep the result, set :attr:`repeats` to a positive number. .. py:attribute:: MINUTES `'I'` will run every :attr:`minutes` after its first run. .. py:attribute:: HOURLY `'H'` the scheduled task will run every hour after its first run. .. py:attribute:: DAILY `'D'` the scheduled task will run every day at the time of its first run. .. py:attribute:: WEEKLY `'W'` the task will run every week on they day and time of the first run. .. py:attribute:: MONTHLY `'M'` the tasks runs every month on they day and time of the last run. .. note:: Months are tricky. If you schedule something on the 31st of the month and the next month has only 30 days or less, the task will run on the last day of the next month. It will however continue to run on that day, e.g. the 28th, in subsequent months. .. py:attribute:: QUARTERLY `'Q'` this task runs once every 3 months on the day and time of the last run. .. py:attribute:: YEARLY `'Y'` only runs once a year. The same caution as with months apply; If you set this to february 29th, it will run on february 28th in the following years. django-q-1.0.2/docs/signals.rst000066400000000000000000000024021352353655300163440ustar00rootroot00000000000000Signals ======= .. py:currentmodule:: django_q Available signals ----------------- Django Q emits the following signals during its lifecycle. Before enqueuing a task """"""""""""""""""""""" The ``django_q.signals.pre_enqueue`` signal is emitted before a task is enqueued. The task dictionary is given as the ``task`` argument. Before executing a task """"""""""""""""""""""" The ``django_q.signals.pre_execute`` signal is emitted before a task is executed by a worker. This signal provides two arguments: - ``task``: the task dictionary. - ``func``: the actual function that will be executed. If the task was created with a function path, this argument will be the callable function nonetheless. Subscribing to a signal ----------------------- Connecting to a Django Q signal is done in the same manner as any other Django signal:: from django.dispatch import receiver from django_q.signals import pre_enqueue, pre_execute @receiver(pre_enqueue) def my_pre_enqueue_callback(sender, task, **kwargs): print("Task {} will be enqueued".format(task["name"])) @receiver(pre_execute) def my_pre_execute_callback(sender, func, task, **kwargs): print("Task {} will be executed by calling {}".format( task["name"], func)) django-q-1.0.2/docs/tasks.rst000066400000000000000000000360501352353655300160370ustar00rootroot00000000000000Tasks ===== .. py:currentmodule:: django_q .. _async: async_task() ------------ .. warning:: Since Python 3.7 `async` became a reserved keyword and was refactored to `async_task` Use :func:`async_task` from your code to quickly offload tasks to the :class:`Cluster`: .. code:: python from django_q.tasks import async_task, result # create the task async_task('math.copysign', 2, -2) # or with import and storing the id import math.copysign task_id = async_task(copysign, 2, -2) # get the result task_result = result(task_id) # result returns None if the task has not been executed yet # you can wait for it task_result = result(task_id, 200) # but in most cases you will want to use a hook: async_task('math.modf', 2.5, hook='hooks.print_result') # hooks.py def print_result(task): print(task.result) :func:`async_task` can take the following optional keyword arguments: hook """" The function to call after the task has been executed. This function gets passed the complete :class:`Task` object as its argument. group """"" A group label. Check :doc:`group` for group functions. save """" Overrides the result backend's save setting for this task. timeout """"""" Overrides the cluster's timeout setting for this task. See :ref:`retry` for details how to set values for timeout. ack_failure """"""""""" Overrides the cluster's :ref:`ack_failures` setting for this task. sync """" Simulates a task execution synchronously. Useful for testing. Can also be forced globally via the :ref:`sync` configuration option. cached """""" Redirects the result to the cache backend instead of the database if set to ``True`` or to an integer indicating the cache timeout in seconds. e.g. ``cached=60``. Especially useful with large and group operations where you don't need the all results in your database and want to take advantage of the speed of your cache backend. broker """""" A broker instance, in case you want to control your own connections. task_name """"""""" Optionally overwrites the auto-generated task name. q_options """"""""" None of the option keywords get passed on to the task function. As an alternative you can also put them in a single keyword dict named ``q_options``. This enables you to use these keywords for your function call:: # Async options in a dict opts = {'hook': 'hooks.print_result', 'group': 'math', 'timeout': 30} async_task('math.modf', 2.5, q_options=opts) Please note that this will override any other option keywords. .. note:: For tasks to be processed you will need to have a worker cluster running in the background using ``python manage.py qcluster`` or you need to configure Django Q to run in synchronous mode for testing using the :ref:`sync` option. AsyncTask --------- Optionally you can use the :class:`AsyncTask` class to instantiate a task and keep everything in a single object.: .. code-block:: python # AsyncTask class instance example from django_q.tasks import AsyncTask # instantiate an async task a = AsyncTask('math.floor', 1.5, group='math') # you can set or change keywords afterwards a.cached = True # run it a.run() # wait indefinitely for the result and print it print(a.result(wait=-1)) # change the args a.args = (2.5,) # run it again a.run() # wait max 10 seconds for the result and print it print(a.result(wait=10)) .. code-block:: python 1 2 Once you change any of the parameters of the task after it has run, the result is invalidated and you will have to :func:`AsyncTask.run` it again to retrieve a new result. Cached operations ----------------- You can run your tasks results against the Django cache backend instead of the database backend by either using the global :ref:`cached` setting or by supplying the ``cached`` keyword to individual functions. This can be useful if you are not interested in persistent results or if you run large group tasks where you only want the final result. By using a cache backend like Redis or Memcached you can speed up access to your task results significantly compared to a relational database. When you set ``cached=True``, results will be saved permanently in the cache and you will have to rely on your backend's cleanup strategies (like LRU) to manage stale results. You can also opt to set a manual timeout on the results, by setting e.g. ``cached=60``. Meaning the result will be evicted from the cache after 60 seconds. This works both globally or on individual async executions.:: # simple cached example from django_q.tasks import async_task, result # cache the result for 10 seconds id = async_task('math.floor', 100, cached=10) # wait max 50ms for the result to appear in the cache result(id, wait=50, cached=True) # or fetch the task object task = fetch(id, cached=True) # and then save it to the database task.save() As you can see you can easily turn a cached result into a permanent database result by calling ``save()`` on it. This also works for group actions:: # cached group example from django_q.tasks import async_task, result_group from django_q.brokers import get_broker # set up a broker instance for better performance broker = get_broker() # Async a hundred functions under a group label for i in range(100): async_task('math.frexp', i, group='frexp', cached=True, broker=broker) # wait max 50ms for one hundred results to return result_group('frexp', wait=50, count=100, cached=True) If you don't need hooks, that exact same result can be achieved by using the more convenient :func:`async_iter`. Synchronous testing ------------------- :func:`async_task` can be instructed to execute a task immediately by setting the optional keyword ``sync=True``. The task will then be injected straight into a worker and the result saved by a monitor instance:: from django_q.tasks import async_task, fetch # create a synchronous task task_id = async_task('my.buggy.code', sync=True) # the task will then be available immediately task = fetch(task_id) # and can be examined if not task.success: print('An error occurred: {}'.format(task.result)) .. code:: bash An error occurred: ImportError("No module named 'my'",) Note that :func:`async_task` will block until the task is executed and saved. This feature bypasses the broker and is intended for debugging and development. Instead of setting ``sync`` on each individual ``async_task`` you can also configure :ref:`sync` as a global override. Connection pooling ------------------ Django Q tries to pass broker instances around its parts as much as possible to save you from running out of connections. When you are making individual calls to :func:`async_task` a lot though, it can help to set up a broker to reuse for :func:`async_task`: .. code:: python # broker connection economy example from django_q.tasks import async_task from django_q.brokers import get_broker broker = get_broker() for i in range(50): async_task('math.modf', 2.5, broker=broker) .. tip:: If you are using `django-redis `__ and the redis broker, you can :ref:`configure ` Django Q to use its connection pool. Reference --------- .. py:function:: async_task(func, *args, hook=None, group=None, timeout=None,\ save=None, sync=False, cached=False, broker=None, q_options=None, **kwargs) Puts a task in the cluster queue :param object func: The task function to execute :param tuple args: The arguments for the task function :param object hook: Optional function to call after execution :param str group: An optional group identifier :param int timeout: Overrides global cluster :ref:`timeout`. :param bool save: Overrides global save setting for this task. :param bool ack_failure: Overrides the global :ref:`ack_failures` setting for this task. :param bool sync: If set to True, async_task will simulate a task execution :param cached: Output the result to the cache backend. Bool or timeout in seconds :param broker: Optional broker connection from :func:`brokers.get_broker` :param dict q_options: Options dict, overrides option keywords :param dict kwargs: Keyword arguments for the task function :returns: The uuid of the task :rtype: str .. py:function:: result(task_id, wait=0, cached=False) Gets the result of a previously executed task :param str task_id: the uuid or name of the task :param int wait: optional milliseconds to wait for a result. -1 for indefinite :param bool cached: run this against the cache backend. :returns: The result of the executed task .. py:function:: fetch(task_id, wait=0, cached=False) Returns a previously executed task :param str task_id: the uuid or name of the task :param int wait: optional milliseconds to wait for a result. -1 for indefinite :param bool cached: run this against the cache backend. :returns: A task object :rtype: Task .. versionchanged:: 0.2.0 Renamed from get_task .. py:function:: queue_size() Returns the size of the broker queue. Note that this does not count tasks currently being processed. :returns: The amount of task packages in the broker :rtype: int .. py:function:: delete_cached(task_id, broker=None) Deletes a task from the cache backend :param str task_id: the uuid of the task :param broker: an optional broker instance .. py:class:: Task Database model describing an executed task .. py:attribute:: id An :func:`uuid.uuid4()` identifier .. py:attribute:: name The name of the task as a humanized version of the :attr:`id` .. note:: This is for convenience and can be used as a parameter for most functions that take a `task_id`. Keep in mind that it is not guaranteed to be unique if you store very large amounts of tasks in the database. .. py:attribute:: func The function or reference that was executed .. py:attribute:: hook The function to call after execution. .. py:attribute:: args Positional arguments for the function. .. py:attribute:: kwargs Keyword arguments for the function. .. py:attribute:: result The result object. Contains the error if any occur. .. py:attribute:: started The moment the task was created by an async command .. py:attribute:: stopped The moment a worker finished this task .. py:attribute:: success Was the task executed without problems? .. py:method:: time_taken Calculates the difference in seconds between started and stopped. .. note:: Time taken represents the time a task spends in the cluster, this includes any time it may have waited in the queue. .. py:method:: group_result(failures=False) Returns a list of results from this task's group. Set failures to ``True`` to include failed results. .. py:method:: group_count(failures=False) Returns a count of the number of task results in this task's group. Returns the number of failures when ``failures=True`` .. py:method:: group_delete(tasks=False) Resets the group label on all the tasks in this task's group. If ``tasks=True`` it will also delete the tasks in this group from the database, including itself. .. py:classmethod:: get_result(task_id) Gets a result directly by task uuid or name. .. py:classmethod:: get_result_group(group_id, failures=False) Returns a list of results from a task group. Set failures to ``True`` to include failed results. .. py:classmethod:: get_task(task_id) Fetches a single task object by uuid or name. .. py:classmethod:: get_task_group(group_id, failures=True) Gets a queryset of tasks with this group id. Set failures to ``False`` to exclude failed tasks. .. py:classmethod:: get_group_count(group_id, failures=False) Returns a count of the number of tasks results in a group. Returns the number of failures when ``failures=True`` .. py:classmethod:: delete_group(group_id, objects=False) Deletes a group label only, by default. If ``objects=True`` it will also delete the tasks in this group from the database. .. py:class:: Success A proxy model of :class:`Task` with the queryset filtered on :attr:`Task.success` is ``True``. .. py:class:: Failure A proxy model of :class:`Task` with the queryset filtered on :attr:`Task.success` is ``False``. .. py:class:: AsyncTask(func, *args, **kwargs) A class wrapper for the :func:`async_task` function. :param object func: The task function to execute :param tuple args: The arguments for the task function :param dict kwargs: Keyword arguments for the task function, including async_task options .. py:attribute:: id The task unique identifier. This will only be available after it has been :meth:`run` .. py:attribute:: started Bool indicating if the task has been run with the current parameters .. py:attribute:: func The task function to execute .. py:attribute:: args A tuple of arguments for the task function .. py:attribute:: kwargs Keyword arguments for the function. Can include any of the optional async_task keyword attributes directly or in a `q_options` dictionary. .. py:attribute:: broker Optional :class:`Broker` instance to use .. py:attribute:: sync Run this task inline instead of asynchronous. .. py:attribute:: save Overrides the global save setting. .. py:attribute:: hook Optional function to call after a result is available. Takes the result :class:`Task` as the first argument. .. py:attribute:: group Optional group identifier .. py:attribute:: cached Run the task against the cache result backend. .. py:method:: run() Send the task to a worker cluster for execution .. py:method:: result(wait=0) The task result. Always returns None if the task hasn't been run with the current parameters. :param int wait: the number of milliseconds to wait for a result. -1 for indefinite .. py:method:: fetch(wait=0) Returns the full :class:`Task` result instance. :param int wait: the number of milliseconds to wait for a result. -1 for indefinite .. py:method:: result_group(failures=False, wait=0, count=None) Returns a list of results from this task's group. :param bool failures: set this to ``True`` to include failed results :param int wait: optional milliseconds to wait for a result or count. -1 for indefinite :param int count: block until there are this many results in the group .. py:method:: fetch_group(failures=True, wait=0, count=None) Returns a list of task results from this task's group :param bool failures: set this to ``False`` to exclude failed tasks :param int wait: optional milliseconds to wait for a task or count. -1 for indefinite :param int count: block until there are this many tasks in the group django-q-1.0.2/pytest.ini000066400000000000000000000000671352353655300152600ustar00rootroot00000000000000[pytest] DJANGO_SETTINGS_MODULE=django_q.tests.settingsdjango-q-1.0.2/requirements.in000066400000000000000000000001311352353655300162720ustar00rootroot00000000000000arrow blessed django-picklefield hiredis redis psutil django-redis iron-mq boto3 pymongo django-q-1.0.2/requirements.txt000066400000000000000000000020001352353655300165000ustar00rootroot00000000000000# # This file is autogenerated by pip-compile # To update, run: # # pip-compile --output-file requirements.txt requirements.in # arrow==0.14.5 blessed==1.15.0 boto3==1.9.205 botocore==1.12.205 # via boto3, s3transfer certifi==2019.6.16 # via requests chardet==3.0.4 # via requests django-picklefield==2.0 django-redis==4.10.0 django==2.2.4 # via django-picklefield, django-redis docutils==0.14 # via botocore hiredis==1.0.0 idna==2.8 # via requests iron-core==1.2.0 # via iron-mq iron-mq==0.9 jmespath==0.9.4 # via boto3, botocore psutil==5.6.3 pymongo==3.8.0 python-dateutil==2.8.0 # via arrow, botocore, iron-core pytz==2019.2 # via django redis==3.3.6 requests==2.22.0 # via iron-core s3transfer==0.2.1 # via boto3 six==1.12.0 # via blessed, python-dateutil sqlparse==0.3.0 # via django urllib3==1.25.3 # via botocore, requests wcwidth==0.1.7 # via blessed django-q-1.0.2/runtests.py000066400000000000000000007773611352353655300155120ustar00rootroot00000000000000#! /usr/bin/env python # Hi There! # You may be wondering what this giant blob of binary data here is, you might # even be worried that we're up to something nefarious (good for you for being # paranoid!). This is a base64 encoding of a zip file, this zip file contains # a fully functional basic pytest script. # # Pytest is a thing that tests packages, pytest itself is a package that some- # one might want to install, especially if they're looking to run tests inside # some package they want to install. Pytest has a lot of code to collect and # execute tests, and other such sort of "tribal knowledge" that has been en- # coded in its code base. Because of this we basically include a basic copy # of pytest inside this blob. We do this because it let's you as a maintainer # or application developer who wants people who don't deal with python much to # easily run tests without installing the complete pytest package. # # If you're wondering how this is created: you can create it yourself if you # have a complete pytest installation by using this command on the command- # line: ``py.test --genscript=runtests.py``. sources = """ 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 """ import sys import base64 import zlib class DictImporter(object): def __init__(self, sources): self.sources = sources def find_module(self, fullname, path=None): if fullname == "argparse" and sys.version_info >= (2,7): # we were generated with = (3, 0): exec("def do_exec(co, loc): exec(co, loc)\n") import pickle sources = sources.encode("ascii") # ensure bytes sources = pickle.loads(zlib.decompress(base64.decodebytes(sources))) else: import cPickle as pickle exec("def do_exec(co, loc): exec co in loc\n") sources = pickle.loads(zlib.decompress(base64.decodestring(sources))) importer = DictImporter(sources) sys.meta_path.insert(0, importer) entry = "import pytest; raise SystemExit(pytest.cmdline.main())" do_exec(entry, locals()) # noqa django-q-1.0.2/setup.cfg000066400000000000000000000000311352353655300150370ustar00rootroot00000000000000[bdist_wheel] universal=0django-q-1.0.2/setup.py000066400000000000000000000041721352353655300147420ustar00rootroot00000000000000import os from setuptools import setup, Command with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme: README = readme.read() os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) class PyTest(Command): user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): import subprocess import sys errno = subprocess.call([sys.executable, 'runtests.py']) raise SystemExit(errno) setup( name='django-q', version='1.0.2', author='Ilan Steemers', author_email='koed0@gmail.com', keywords='django distributed task queue worker scheduler cron redis disque ironmq sqs orm mongodb multiprocessing rollbar', packages=['django_q'], include_package_data=True, url='https://django-q.readthedocs.org', license='MIT', description='A multiprocessing distributed task queue for Django', long_description=README, install_requires=['django>=1.11', 'django-picklefield', 'blessed', 'arrow'], test_requires=['pytest', 'pytest-django', ], cmdclass={'test': PyTest}, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Web Environment', 'Framework :: Django', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Operating System :: POSIX', 'Operating System :: MacOS', 'Programming Language :: Python', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Topic :: Internet :: WWW/HTTP', 'Topic :: System :: Distributed Computing', 'Topic :: Software Development :: Libraries :: Python Modules', ], entry_points={ 'djangoq.errorreporters': [ 'rollbar = django_q_rollbar:Rollbar', 'sentry = django_q_sentry:Sentry', ] }, extras_require={ 'rollbar': ["django-q-rollbar>=0.1"], 'sentry': ["django-q-sentry>=0.1"], } ) django-q-1.0.2/test-services-docker-compose.yaml000066400000000000000000000003601352353655300216170ustar00rootroot00000000000000version: '2.2' services: disque: image: efrecon/disque:1.0-rc1 ports: - '7711:7711/tcp' redis: image: redis:latest ports: - '6379:6379/tcp' mongo: image: mongo:4 ports: - '27017:27017/tcp'