pax_global_header00006660000000000000000000000064145224466670014532gustar00rootroot0000000000000052 comment=866a08aa68dbbec3c61d88f04ed239e5711f0deb thumbor-plugins-gifv-0.1.4/000077500000000000000000000000001452244666700156245ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/.coveragerc000066400000000000000000000000701452244666700177420ustar00rootroot00000000000000[run] branch = True omit = */tests/* */setup.py thumbor-plugins-gifv-0.1.4/.github/000077500000000000000000000000001452244666700171645ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/.github/dependabot.yml000066400000000000000000000007651452244666700220240ustar00rootroot00000000000000# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: "pip" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "daily" thumbor-plugins-gifv-0.1.4/.github/workflows/000077500000000000000000000000001452244666700212215ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/.github/workflows/codeql-analysis.yml000066400000000000000000000044421452244666700250400ustar00rootroot00000000000000# For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. # # ******** NOTE ******** # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # name: "CodeQL" on: push: branches: [ master ] pull_request: # The branches below must be a subset of the branches above branches: [ master ] schedule: - cron: '35 12 * * 5' jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ 'python' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Learn more about CodeQL language support at https://git.io/codeql-language-support steps: - name: Checkout repository uses: actions/checkout@v2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v1 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild uses: github/codeql-action/autobuild@v1 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines # and modify them (or add more) to build your code if your project # uses a compiled language #- run: | # make bootstrap # make release - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v1 thumbor-plugins-gifv-0.1.4/.github/workflows/release-please.yml000066400000000000000000000035051452244666700246360ustar00rootroot00000000000000on: push: branches: - master name: release-please jobs: list_modules: runs-on: ubuntu-latest outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v2 - id: set-matrix run: echo "::set-output name=matrix::$(find . -type f -name 'Dockerfile' | awk -F\/ '{print $3"/"$4}' | jq -Rsc '. / "\n" - [""]')" release-please: name: release-${{ matrix.subject }} runs-on: ubuntu-latest needs: list_modules strategy: matrix: subject: ${{fromJSON(needs.list_modules.outputs.matrix)}} steps: - name: Set environment run: | echo "PACKAGE_NAME=$( echo "${{ matrix.subject }}" | awk -F\/ '{print "thumbor-plugins-"$2}' )" >> $GITHUB_ENV - uses: google-github-actions/release-please-action@v3 id: release with: monorepo-tags: true release-type: python path: thumbor_plugins/${{ matrix.subject }} package-name: ${{ env.PACKAGE_NAME }} - uses: actions/checkout@v2 if: ${{ steps.release.outputs.releases_created }} - uses: actions/setup-python@v2 if: ${{ steps.release.outputs.releases_created }} with: python-version: '3.x' - name: Build package if: ${{ steps.release.outputs.releases_created }} working-directory: ./thumbor_plugins/${{ matrix.subject }} run: | pip install -U pip pip install -U build python -m build - name: Publish a Python distribution to PyPI if: ${{ steps.release.outputs.releases_created }} uses: pypa/gh-action-pypi-publish@release/v1 with: user: __token__ password: ${{ secrets.PYPI_API_TOKEN }} packages_dir: thumbor_plugins/${{ matrix.subject }}/dist skip_existing: true thumbor-plugins-gifv-0.1.4/.github/workflows/stale.yml000066400000000000000000000031721452244666700230570ustar00rootroot00000000000000# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time. # # You can adjust the behavior by modifying this file. # For more information, see: # https://github.com/actions/stale name: Mark stale issues and pull requests on: schedule: - cron: '22 13 * * *' jobs: stale: runs-on: ubuntu-latest permissions: issues: write pull-requests: write steps: - uses: actions/stale@v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: This issue is stale because it has been open 30 days with no activity. Remove the stale label or add a comment, or this issue will be closed in 5 days. You can always re-open if you still feel this is still an issue. Tag @guilhermef for more information. stale-pr-message: This PR is stale because it has been open 45 days with no activity. Remove the stale label or add a comment, or this PR will be closed in 10 days. You can always re-open if you feel this is something we should still keep working on. Tag @guilhermef for more information. close-issue-message: This issue was closed because it has been stale for 5 days with no activity. close-pr-message: This PR was closed because it has been stale for 10 days with no activity. days-before-issue-stale: 30 days-before-pr-stale: 45 days-before-issue-close: 5 days-before-pr-close: 10 exempt-draft-pr: true operations-per-run: 300 exempt-pr-labels: 'autorelease: pending,dependencies' thumbor-plugins-gifv-0.1.4/.github/workflows/test.yml000066400000000000000000000036121452244666700227250ustar00rootroot00000000000000name: Run tests on: push: pull_request: types: [opened, reopened] jobs: list_test_subjects: runs-on: ubuntu-latest outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v2 - id: set-matrix run: echo "::set-output name=matrix::$(find . -type f -name 'Dockerfile' | awk -F\/ '{print $3"/"$4}' | jq -Rsc '. / "\n" - [""]')" test: name: ${{ matrix.subject }} runs-on: ubuntu-latest needs: list_test_subjects strategy: matrix: subject: ${{fromJSON(needs.list_test_subjects.outputs.matrix)}} steps: - uses: satackey/action-docker-layer-caching@v0.0.11 continue-on-error: true with: key: thumbor-plugins-test-${{ matrix.subject }}-{hash} restore-keys: | thumbor-plugins-test-${{ matrix.subject }}- thumbor-plugins-test- - uses: actions/checkout@v2 - id: build-test-image run: docker build -t test_image -f thumbor_plugins/${{ matrix.subject }}/tests/docker/Dockerfile . - id: run-tests run: | MODULE_PATH=${{ matrix.subject }} MODULE="thumbor_plugins.${MODULE_PATH////.}" docker run --rm -v$(pwd):/app test_image /bin/bash -c "pip install -r test_requirements.txt && pip install -e thumbor_plugins/${{ matrix.subject }} && pytest --cov=$MODULE thumbor_plugins/${{ matrix.subject }}/tests && coverage lcov" - name: Coveralls uses: coverallsapp/github-action@1.1.3 with: github-token: ${{ secrets.GITHUB_TOKEN }} path-to-lcov: coverage.lcov flag-name: run-${{ matrix.subject }} parallel: true finish: needs: test runs-on: ubuntu-latest steps: - name: Coveralls Finished uses: coverallsapp/github-action@1.1.3 with: github-token: ${{ secrets.github_token }} parallel-finished: true thumbor-plugins-gifv-0.1.4/.gitignore000066400000000000000000000013041452244666700176120ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ 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 .cache nosetests.xml coverage.xml # Translations *.mo *.pot # Django stuff: *.log # Sphinx documentation docs/_build/ # PyBuilder target/ .idea *.DS_Store .env/ .vscode/ thumbor-plugins-gifv-0.1.4/.release-please-manifest.json000066400000000000000000000005331452244666700232710ustar00rootroot00000000000000{ "thumbor_plugins/optimizers/pngcrush": "0.1.3", "thumbor_plugins/optimizers/jpegrecompress": "0.1.3", "thumbor_plugins/optimizers/jp2": "0.1.2", "thumbor_plugins/optimizers/optipng": "0.1.3", "thumbor_plugins/optimizers/pngquant": "0.1.3", "thumbor_plugins/optimizers/gifv": "0.1.4", "thumbor_plugins/optimizers/mozjpeg": "0.1.2" }thumbor-plugins-gifv-0.1.4/CODE_OF_CONDUCT.md000066400000000000000000000121461452244666700204270ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at guilherme@souza.tech. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. thumbor-plugins-gifv-0.1.4/CONTRIBUTING.md000066400000000000000000000024551452244666700200630ustar00rootroot00000000000000## Steps There are a few things you'll need to start hacking on it properly. 1. [Fork it](http://help.github.com/fork-a-repo/) 2. Install dependencies and initialize the environment 3. Hack, in no particular order: - Write enough code - Write tests for that code - Check that other tests pass - Repeat until you're satisfied 4. Submit a pull request ## Install dependencies To run the tests, you will only need [Docker](https://www.docker.com/). ## Creating a new optimizer Each folder in [optimizers](https://github.com/thumbor/thumbor-plugins/tree/master/thumbor_plugins/optimizers) is a separate package. You can copy an existing optimizer and rename it to create a new one. You will find a [Dockerfile](https://github.com/thumbor/thumbor-plugins/blob/master/thumbor_plugins/optimizers/gifv/tests/docker/Dockerfile) on each of them that will be used when running the integration test. ## Running the tests Imagine that you just created a new optimizer named `doge`, then to test it, you need to run `make test_doge`. ## How should my commits look like? This project is using [release-please](https://github.com/googleapis/release-please) to manage all the packages. So make sure that your commits are following the [Conventional commits message](https://www.conventionalcommits.org/en/v1.0.0/#summary) thumbor-plugins-gifv-0.1.4/LICENSE000066400000000000000000000020641452244666700166330ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 Globo.com 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. thumbor-plugins-gifv-0.1.4/Makefile000066400000000000000000000006301452244666700172630ustar00rootroot00000000000000setup: @pip install -e .[tests] test_%: @docker build -t $* -f thumbor_plugins/optimizers/$*/tests/docker/Dockerfile . docker run --rm -v$(CURDIR):/app $* /bin/bash -c "pip install -r test_requirements.txt && pip install -e thumbor_plugins/optimizers/$* && pytest --cov=thumbor_plugins.optimizers.$* thumbor_plugins/optimizers/$*/tests" test_unit: pytest -s `find . -type d -name 'unit' | tr "\n" " "` thumbor-plugins-gifv-0.1.4/README.md000066400000000000000000000034751452244666700171140ustar00rootroot00000000000000# thumbor-plugins [![Github Actions - tests](https://github.com/thumbor/thumbor-plugins/actions/workflows/test.yml/badge.svg)](https://github.com/thumbor/thumbor-plugins/actions) This monorepo contains multiple plugins that should be used on [Thumbor][thumbor] to add new capabilities, like GifV or Mozjpeg compression. Each of the optimizers is released and can be installed separately. ## 📜 List of thumbor-plugins You can find the plugins in: https://pypi.org/search/?q=%22thumbor-plugins%22&o=-created ## ⚙️ Installation ```bash pip install thumbor-plugins-mozjpeg pip install thumbor-plugins-gifv ``` ## 🎯 Usage After installing the packages, just add the plugins you need to the OPTIMIZERS list on your thumbor.conf ```python OPTIMIZERS = [ 'thumbor_plugins.optimizers.mozjpeg', 'thumbor_plugins.optimizers.gifv', ] ``` Each optimizer contains parameters that can be used to configure how it runs. ## 👍 Contribute thumbor-plugins is an open-source project with many contributors. Join them [contributing code][contributing]. ## 🚨 Breaking change This repository used to be released under a single package in previous versions, `thumbor-plugins`. We broke down into multiple packages to make it easier for developers to contribute, test, and use different versions. For example, the mozjpeg optimizer is released on the package `thumbor-plugins-mozjpeg`, and the Gifv one on the package `thumbor-plugins-gifv`. ## Third Party Integration tests uses a bug.png picture by [Marcelo Jorge Vieira][marcelometal] licensed under [CC-BY-4.0][cc-by-4]. [cc-by-4]: https://creativecommons.org/licenses/by/4.0/ [contributing]: https://github.com/thumbor/thumbor-plugins/blob/master/CONTRIBUTING.md [marcelometal]: https://www.flickr.com/photos/marcelometal/540719764/ [thumbor]: https://github.com/thumbor/thumbor thumbor-plugins-gifv-0.1.4/codeql-analysis.yml000066400000000000000000000044421452244666700214430ustar00rootroot00000000000000# For most projects, this workflow file will not need changing; you simply need # to commit it to your repository. # # You may wish to alter this file to override the set of languages analyzed, # or to provide custom queries or build logic. # # ******** NOTE ******** # We have attempted to detect the languages in your repository. Please check # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # name: "CodeQL" on: push: branches: [ master ] pull_request: # The branches below must be a subset of the branches above branches: [ master ] schedule: - cron: '45 17 * * 6' jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ 'python' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Learn more about CodeQL language support at https://git.io/codeql-language-support steps: - name: Checkout repository uses: actions/checkout@v2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v1 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild uses: github/codeql-action/autobuild@v1 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines # and modify them (or add more) to build your code if your project # uses a compiled language #- run: | # make bootstrap # make release - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v1 thumbor-plugins-gifv-0.1.4/release-please-config.json000066400000000000000000000001041452244666700226440ustar00rootroot00000000000000{ "bootstrap-sha": "abbad25f2d17370e46b0ad4921713312ba30d989" } thumbor-plugins-gifv-0.1.4/test_requirements.txt000066400000000000000000000000511452244666700221430ustar00rootroot00000000000000pytest==7.* thumbor==7.* pytest-cov==4.* thumbor-plugins-gifv-0.1.4/thumbor_plugins/000077500000000000000000000000001452244666700210455ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/__init__.py000066400000000000000000000000011452244666700231450ustar00rootroot00000000000000 thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/000077500000000000000000000000001452244666700232525ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/__init__.py000066400000000000000000000000001452244666700253510ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/000077500000000000000000000000001452244666700242055ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/CHANGELOG.md000066400000000000000000000045311452244666700260210ustar00rootroot00000000000000# Changelog ## [0.1.4](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-gifv-v0.1.3...thumbor-plugins-gifv-v0.1.4) (2023-11-07) ### Miscellaneous Chores * release 0.1.4 ([1ddc858](https://github.com/thumbor/thumbor-plugins/commit/1ddc858bb340cff4383bc6460774f2b56bf32045)) ## [0.1.3](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-gifv-v0.1.2...thumbor-plugins-gifv-v0.1.3) (2023-10-30) ### Bug Fixes * **gifv:** Add WebM tests ([a61332a](https://github.com/thumbor/thumbor-plugins/commit/a61332a864e73debdb94f1527a8f4d17d26e947d)) ### [0.1.2](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-gifv-v0.1.1...thumbor-plugins-gifv-v0.1.2) (2022-02-22) ### Bug Fixes * Improve package description ([b1dc8ce](https://github.com/thumbor/thumbor-plugins/commit/b1dc8ce2958ea0fd08d64a776fbe4972844e1247)) ### [0.1.1](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-gifv-v0.1.0...thumbor-plugins-gifv-v0.1.1) (2022-02-14) ### Bug Fixes * trigger release ([#50](https://github.com/thumbor/thumbor-plugins/issues/50)) ([a76f637](https://github.com/thumbor/thumbor-plugins/commit/a76f637ff14c326cb0d7987948a974ba807e83ff)) ## 0.1.0 (2022-02-13) ### Bug Fixes * set initial version ([7df5544](https://github.com/thumbor/thumbor-plugins/commit/7df5544d5c372c05549c1ada1dab294af23c6fcf)) * Testing release-please ([40f942b](https://github.com/thumbor/thumbor-plugins/commit/40f942ba1f427c82138827438be680f0438a1518)) * Trigger release ([8012ca7](https://github.com/thumbor/thumbor-plugins/commit/8012ca7dd35a19cb00208312de3560800dcca661)) * trigger release-please ([bc27734](https://github.com/thumbor/thumbor-plugins/commit/bc27734ca3e0aa3b55f7dde6dad8dd3038713a75)) * trigger release-please ([957b0e3](https://github.com/thumbor/thumbor-plugins/commit/957b0e3c06c798087b83f7034d27d740a2c1faaf)) * trigger release-please ([c4ed257](https://github.com/thumbor/thumbor-plugins/commit/c4ed2571b38319da4e625c356a5c24475330275a)) * trigger release-please ([562ccc3](https://github.com/thumbor/thumbor-plugins/commit/562ccc3c319fcb5886294f6717fbfa7ca4f3ab3e)) * trigger release-please ([eeb8500](https://github.com/thumbor/thumbor-plugins/commit/eeb850087653f227f8694f0d3fb43d4cfc831518)) * trigger release-please ([0cb4484](https://github.com/thumbor/thumbor-plugins/commit/0cb44843244fd0140597cab414f9a1a6fe908440)) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/__init__.py000066400000000000000000000064131452244666700263220ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license # Copyright (c) 2011 globo.com thumbor@googlegroups.com import re import subprocess from os.path import exists import webcolors import thumbor_plugins.optimizers.gifv.config # noqa from thumbor.optimizers import BaseOptimizer from thumbor.utils import logger class Optimizer(BaseOptimizer): def should_run(self, image_extension, image_buffer): if "gif" in image_extension and "gifv" in self.context.request.filters: if not exists(self.context.config.FFMPEG_PATH): logger.warning( "gifv optimizer enabled but binary FFMPEG_PATH does not exist" ) return False return True return False def optimize(self, image_buffer, input_file, output_file): file_format, command_params = self.set_format() bg_color_hex = None if "background_color" in self.context.request.filters: filters = self.context.request.filters.split(":") bg_filter = [ filter for filter in filters if filter.startswith("background_color") ][0] bg_color = re.search(r"\((.*?)\)", bg_filter).group(1) bg_color_hex = self.normalize_color_to_hex(bg_color) command = [ self.context.config.FFMPEG_PATH, "-y", "-f", "gif", "-trans_color", f"0xff{(bg_color_hex[1:] if bg_color_hex else 'ffffff')}", "-i", input_file, "-filter_complex", "scale=trunc(iw/2)*2:trunc(ih/2)*2", "-an", "-movflags", "faststart", "-f", file_format, "-pix_fmt", "yuv420p", ] command += command_params command += [ "-qmin", "10", "-qmax", "42", "-crf", "23", "-maxrate", "500k", output_file, "-loglevel", "error", ] subprocess.call(command, stdin=subprocess.DEVNULL) self.context.request.format = file_format def set_format(self): if "webm" in self.context.request.filters: file_format = "webm" command_params = [ "-quality", "good", "-cpu-used", "4", "-b:v", "500k", ] else: file_format = "mp4" command_params = ["-profile:v", "baseline", "-level", "4.0"] return file_format, command_params def normalize_color_to_hex(self, color_string): try: return webcolors.normalize_hex("#" + color_string) except ValueError: pass try: return webcolors.name_to_hex(color_string) except ValueError: pass try: return webcolors.normalize_hex(color_string) except ValueError: pass if color_string: logger.error("background_color value could not be parsed") return None thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/config.py000066400000000000000000000002651452244666700260270ustar00rootroot00000000000000from thumbor.config import Config Config.define( "FFMPEG_PATH", "/usr/local/bin/ffmpeg", "Path for the ffmpeg binary used to generate gifv(h.264)", "Optimizers", ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/setup.py000066400000000000000000000026051452244666700257220ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- from setuptools import setup setup( name="thumbor-plugins-gifv", version="0.1.4", keywords="thumbor ffmpeg gifv mp4", author="Guilherme Souza", author_email="guilherme@souza.tech", url="https://github.com/thumbor/thumbor-plugins", license="MIT", description="Thumbor optimizer to add support to Gifv(mp4)", long_description=""" Available Configs: - FFMPEG_PATH This package is part of the thumbor-plugins repository. For more information, visit: https://github.com/thumbor/thumbor-plugins """, classifiers=[ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Multimedia :: Graphics :: Presentation", ], packages=[ "thumbor_plugins.optimizers.gifv", ], package_dir={ "thumbor_plugins.optimizers.gifv": ".", }, install_requires=[ "webcolors==1.11.1", ], ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/000077500000000000000000000000001452244666700253475ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/__init__.py000066400000000000000000000000001452244666700274460ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/docker/000077500000000000000000000000001452244666700266165ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/docker/Dockerfile000066400000000000000000000002201452244666700306020ustar00rootroot00000000000000FROM python:3.9-slim WORKDIR /app RUN apt-get update -y && \ apt-get install -y \ gifsicle \ ffmpeg &&\ apt-get clean thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/integration/000077500000000000000000000000001452244666700276725ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/integration/__init__.py000066400000000000000000000000001452244666700317710ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/integration/imgs/000077500000000000000000000000001452244666700306315ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/integration/imgs/animated.gif000066400000000000000000000104071452244666700331040ustar00rootroot00000000000000GIF89addc !!$$'')),,..11446699;;>>@@CCFFHHKKMMPPRRUUXXZZ]]__bbddggjjllooqqttvvyy||~~!d! NETSCAPE2.0,dd  H*\xPÇ#JHŋ3V\Ǐ CIɓ#\ɲ˗0cʜIf8sɳϟ@ ӁѣH*]ʴӧP6}@իXjʵׯ[!KٳhӪ]˶mpʝKݻx{W߿ LÈǐ#KL˓)h̹ϠCMt S^ͺװc˞ڂ۸sͻ@ȓ+_μ1HNسkν{ ËOӫ_^˟O(hr 6F(Vafv (z`(,04h8<; DiH&L6dPF)TViXfW`)dihYlp)tis|矀*蠄h &袌6裐F*餏`饘f馜v駠 jꩨꪬꫫ 무j뭸뮼k +k&ǪF+Vkf[ v+k㲠+o ,`' 7G Wlgw $l(,r 0,4l87@-DmH'] L7PG-TWmSӠ\w`-dv hlp-o`x|߀ n'7 Wngwy.褗n騧.n^/o7G/W}gw/`觯oHL&0'H Z̠7xA!x GH(La 0 gH3$w@ H"HL&:PD#XX̢.z` c@2hL6kDH:x̣>1 IBL"yH%8򑐌$'IJZd%Nz (GIRd*WV򕰌,gIZƲ ̥.w^ 0K'L2f:Ќf3@jZ̦6nzۄ8IrL:v3 yO) @JЂMhAІ:D'JъZF7юz HGJҒ (MJWҖ0LgR+8ͩNwӞ@ jO@ԢHMRԦ:KłTJժZXͪVծf5 ` XJֲhMZzV-p\J׺xk]׾ `Kb:d'KF ͬf7z hGY/MjWֺmk@ͭnwpKMr&7 ЍtKZͮv{]1x xKMoy|K !d,dd !!$$'')),,..11446699;;>>@@CCFFHHKKMMPPRRUUXXZZ]]__bbddggjjllooqqttvvyy||~~  H*\xPÇ#JHŋ3V\Ǐ CIɓ#\ɲ˗0cʜIf8sɳϟ@ ӁѣH*]ʴӧP6}@իXjʵׯ[!KٳhӪ]˶mpʝKݻx{W߿ LÈǐ#KL˓)h̹ϠCMt S^ͺװc˞ڂ۸sͻ@ȓ+_μ1HNسkν{ ËOӫ_^˟O(hr 6F(Vafv (z`(,04h8<; DiH&L6dPF)TViXfW`)dihYlp)tis|矀*蠄h &袌6裐F*餏`饘f馜v駠 jꩨꪬꫫ 무j뭸뮼k +k&ǪF+Vkf[ v+k㲠+o ,`' 7G Wlgw $l(,r 0,4l87@-DmH'] L7PG-TWmSӠ\w`-dv hlp-o`x|߀ n'7 Wngwy.褗n騧.n^/o7G/W}gw/`觯oHL&0'H Z̠7xA!x GH(La 0 gH3$w@ H"HL&:PD#XX̢.z` c@2hL6kDH:x̣>1 IBL"yH%8򑐌$'IJZd%Nz (GIRd*WV򕰌,gIZƲ ̥.w^ 0K'L2f:Ќf3@jZ̦6nzۄ8IrL:v3 yO) @JЂMhAІ:D'JъZF7юz HGJҒ (MJWҖ0LgR+8ͩNwӞ@ jO@ԢHMRԦ:KłTJժZXͪVծf5 ` XJֲhMZzV-p\J׺xk]׾ `Kb:d'KF ͬf7z hGY/MjWֺmk@ͭnwpKMr&7 ЍtKZͮv{]1x xKMoy|K ;thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/integration/imgs/gradient.gif000066400000000000000000000042011452244666700331120ustar00rootroot00000000000000GIF89addc !!$$'')),,..11446699;;>>@@CCFFHHKKMMPPRRUUXXZZ]]__bbddggjjllooqqttvvyy||~~!,dd  H*\xPÇ#JHŋ3V\Ǐ CIɓ#\ɲ˗0cʜIf8sɳϟ@ ӁѣH*]ʴӧP6}@իXjʵׯ[!KٳhӪ]˶mpʝKݻx{W߿ LÈǐ#KL˓)h̹ϠCMt S^ͺװc˞ڂ۸sͻ@ȓ+_μ1HNسkν{ ËOӫ_^˟O(hr 6F(Vafv (z`(,04h8<; DiH&L6dPF)TViXfW`)dihYlp)tis|矀*蠄h &袌6裐F*餏`饘f馜v駠 jꩨꪬꫫ 무j뭸뮼k +k&ǪF+Vkf[ v+k㲠+o ,`' 7G Wlgw $l(,r 0,4l87@-DmH'] L7PG-TWmSӠ\w`-dv hlp-o`x|߀ n'7 Wngwy.褗n騧.n^/o7G/W}gw/`觯oHL&0'H Z̠7xA!x GH(La 0 gH3$w@ H"HL&:PD#XX̢.z` c@2hL6kDH:x̣>1 IBL"yH%8򑐌$'IJZd%Nz (GIRd*WV򕰌,gIZƲ ̥.w^ 0K'L2f:Ќf3@jZ̦6nzۄ8IrL:v3 yO) @JЂMhAІ:D'JъZF7юz HGJҒ (MJWҖ0LgR+8ͩNwӞ@ jO@ԢHMRԦ:KłTJժZXͪVծf5 ` XJֲhMZzV-p\J׺xk]׾ `Kb:d'KF ͬf7z hGY/MjWֺmk@ͭnwpKMr&7 ЍtKZͮv{]1x xKMoy|K ;thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/integration/test_gifv.py000066400000000000000000000022251452244666700322370ustar00rootroot00000000000000import os.path from tornado.testing import gen_test from thumbor_plugins.test_helpers.engine import EngineCase class GIFVTest(EngineCase): optimizer = "thumbor_plugins.optimizers.gifv" fixtures_path = os.path.join(os.path.dirname(__file__), "imgs") @gen_test async def test_gifv(self): response = await self.http_client.fetch( self.get_url("/unsafe/filters:gifv()/animated.gif") ) self.assertEqual(response.code, 200) self.assertEqual(response.headers["Content-Type"], "video/mp4") @gen_test async def test_gifv_with_background(self): response = await self.http_client.fetch( self.get_url("/unsafe/filters:gifv(mp4):background_color(ff00ff)/animated.gif") ) self.assertEqual(response.code, 200) self.assertEqual(response.headers["Content-Type"], "video/mp4") @gen_test async def test_gifv_webm(self): response = await self.http_client.fetch( self.get_url("/unsafe/filters:gifv(webm)/animated.gif") ) self.assertEqual(response.code, 200) self.assertEqual(response.headers["Content-Type"], "video/webm") thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/unit/000077500000000000000000000000001452244666700263265ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/unit/__init__.py000066400000000000000000000000001452244666700304250ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/gifv/tests/unit/test_gifv.py000066400000000000000000000047431452244666700307020ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license # Copyright (c) 2011 globo.com thumbor@googlegroups.com from shutil import which from unittest import TestCase, mock from thumbor.config import Config from thumbor.context import Context, RequestParameters from thumbor_plugins.optimizers.gifv import Optimizer from thumbor.utils import EXTENSION class GifvOptimizerTest(TestCase): def setUp(self): self.os_path_exists_patcher = mock.patch( "thumbor_plugins.optimizers.gifv.exists" ) self.mock_os_path_exists = self.os_path_exists_patcher.start() def tearDown(self): self.os_path_exists_patcher.stop() def get_context(self): conf = Config() conf.FFMPEG_PATH = "/usr/bin/ffmpeg" ctx = Context(config=conf) ctx.request = RequestParameters() ctx.request.filters.append("gifv") return ctx def test_should_run_for_gif(self): optimizer = Optimizer(self.get_context()) self.assertTrue(optimizer.should_run(".gif", "")) def test_should_not_run_for_not_gif(self): optimizer = Optimizer(self.get_context()) for ext in EXTENSION.items(): if ext != ".gif": self.assertFalse(optimizer.should_run(ext, "")) def test_should_not_run_if_binary_ffmpeg_path_does_not_exist(self): self.mock_os_path_exists.return_value = False optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".gif", "")) def test_should_parse_background_color_with_valid_value(self): optimizer = Optimizer(self.get_context()) magenta_unicode_hex = "#ff00ff" self.assertEqual( optimizer.normalize_color_to_hex("ff00ff"), magenta_unicode_hex ) self.assertEqual( optimizer.normalize_color_to_hex("#ff00ff"), magenta_unicode_hex ) self.assertEqual(optimizer.normalize_color_to_hex("f0f"), magenta_unicode_hex) self.assertEqual(optimizer.normalize_color_to_hex("#f0f"), magenta_unicode_hex) self.assertEqual( optimizer.normalize_color_to_hex("magenta"), magenta_unicode_hex ) def test_should_not_parse_background_color_with_invalid_value(self): optimizer = Optimizer(self.get_context()) self.assertEqual(optimizer.normalize_color_to_hex("asdfasdfasfd"), None) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/000077500000000000000000000000001452244666700237455ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/CHANGELOG.md000066400000000000000000000014361452244666700255620ustar00rootroot00000000000000# Changelog ### [0.1.2](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-jp2-v0.1.1...thumbor-plugins-jp2-v0.1.2) (2022-02-22) ### Bug Fixes * Improve package description ([b1dc8ce](https://github.com/thumbor/thumbor-plugins/commit/b1dc8ce2958ea0fd08d64a776fbe4972844e1247)) ### [0.1.1](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-jp2-v0.1.0...thumbor-plugins-jp2-v0.1.1) (2022-02-13) ### Bug Fixes * trigger release ([#50](https://github.com/thumbor/thumbor-plugins/issues/50)) ([a76f637](https://github.com/thumbor/thumbor-plugins/commit/a76f637ff14c326cb0d7987948a974ba807e83ff)) ## 0.1.0 (2022-02-13) ### Bug Fixes * set initial version ([7df5544](https://github.com/thumbor/thumbor-plugins/commit/7df5544d5c372c05549c1ada1dab294af23c6fcf)) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/__init__.py000066400000000000000000000025671452244666700260700ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license import thumbor_plugins.optimizers.jp2.config # noqa from thumbor.optimizers import BaseOptimizer from thumbor.utils import logger from PIL import Image class Optimizer(BaseOptimizer): def __init__(self, context): super(Optimizer, self).__init__(context) self.jp2_quality = 80 if self.context.config.JP2_QUALITY: if isinstance(self.context.config.JP2_QUALITY, str): self.jp2_quality = int(self.context.config.JP2_QUALITY) else: self.jp2_quality = self.context.config.JP2_QUALITY def should_run(self, image_extension, buffer): return "jp2" in self.context.request.filters def optimize(self, buffer, input_file, output_file): im = Image.open(input_file) if im.mode in ["1", "P"]: if im.mode == "1": target_mode = "RGB" else: # convert() figures out RGB or RGBA based on palette used target_mode = None im = im.convert(mode=target_mode) return im.save( output_file, "JPEG2000", quality_mode="dB", quality_layers=[self.jp2_quality], ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/config.py000066400000000000000000000001741452244666700255660ustar00rootroot00000000000000from thumbor.config import Config Config.define("JP2_QUALITY", "41", "Optimization level for jp2 optimizer", "Optimizers") thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/setup.py000066400000000000000000000024651452244666700254660ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- from setuptools import setup setup( name="thumbor-plugins-jp2", version="0.1.2", keywords="thumbor optimizers jp2", author="Guilherme Souza", author_email="guilherme@souza.tech", url="https://github.com/thumbor/thumbor-plugins", license="MIT", description="Thumbor optimizer to run jp2", long_description=""" Available Configs: - JP2_QUALITY This package is part of the thumbor-plugins repository. For more information, visit: https://github.com/thumbor/thumbor-plugins """, classifiers=[ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Multimedia :: Graphics :: Presentation", ], packages=[ "thumbor_plugins.optimizers.jp2", ], package_dir={ "thumbor_plugins.optimizers.jp2": ".", }, ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/000077500000000000000000000000001452244666700251075ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/__init__.py000066400000000000000000000000001452244666700272060ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/docker/000077500000000000000000000000001452244666700263565ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/docker/Dockerfile000066400000000000000000000002371452244666700303520ustar00rootroot00000000000000FROM python:3.9-slim WORKDIR /app RUN apt-get update -y && \ apt-get install -y \ libopenjp2-7 \ libopenjp2-7-dev && \ apt-get clean thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/integration/000077500000000000000000000000001452244666700274325ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/integration/__init__.py000066400000000000000000000000001452244666700315310ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/integration/imgs/000077500000000000000000000000001452244666700303715ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/integration/imgs/gradient.jpg000066400000000000000000000020221452244666700326640ustar00rootroot00000000000000JFIFC       C ddbRQ  ?뇨8 낃uA]pP`(0W\+  낃uAŊLJT"S̊ O2(0U<ȠT"S̊ O2(0U<ȠT"S̊ O2(0U<ȠŊB* V UAU`P`(0UX* V UAU1(SUE"EU(9TPr*UQAȪUE"EU(9X*B*U (0UAA PP`T*U (0UAAUpUX* V UAU`P`(0UX* V *0WS O8(0Uߪ_~;=ߡ_wz/C|_~;=ߣthumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/integration/test_jp2.py000066400000000000000000000007151452244666700315410ustar00rootroot00000000000000import os.path from tornado.testing import gen_test from thumbor_plugins.test_helpers.engine import EngineCase class Jp2Test(EngineCase): optimizer = "thumbor_plugins.optimizers.jp2" fixtures_path = os.path.join(os.path.dirname(__file__), "imgs") @gen_test async def test_jp2(self): result = await self.http_client.fetch(self.get_url("/unsafe/gradient.jpg")) self.assert_result_smaller_than_original(result, "gradient.jpg") thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/unit/000077500000000000000000000000001452244666700260665ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/unit/__init__.py000066400000000000000000000000001452244666700301650ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jp2/tests/unit/test_jp2.py000066400000000000000000000026451452244666700302010ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license # Copyright (c) 2011 globo.com thumbor@googlegroups.com from shutil import which from unittest import TestCase, mock from thumbor.config import Config from thumbor.context import Context, RequestParameters from thumbor.utils import EXTENSION from thumbor_plugins.optimizers.jp2 import Optimizer class Jp2OptimizerTest(TestCase): def get_context(self): conf = Config() conf.JP2_QUALITY = "80" ctx = Context(config=conf) ctx.request = RequestParameters() ctx.request.filters.append("jp2") return ctx @mock.patch("thumbor_plugins.optimizers.jp2.Image") def test_should_convert_image_as_rgb(self, pil_image_mock): image_opened_mock = mock.Mock() image_converted_mock = mock.Mock() image_opened_mock.convert.return_value = image_converted_mock pil_image_mock.open.return_value = image_opened_mock image_opened_mock.mode = "1" optimizer = Optimizer(self.get_context()) optimizer.optimize(None, "input_file", "output_file") image_opened_mock.convert.assert_called_with(mode="RGB") image_converted_mock.save.assert_called_with( "output_file", "JPEG2000", quality_mode="dB", quality_layers=[80] ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/000077500000000000000000000000001452244666700263025ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/CHANGELOG.md000066400000000000000000000022101452244666700301060ustar00rootroot00000000000000# Changelog ### [0.1.3](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-jpegrecompress-v0.1.2...thumbor-plugins-jpegrecompress-v0.1.3) (2022-02-22) ### Bug Fixes * Improve package description ([b1dc8ce](https://github.com/thumbor/thumbor-plugins/commit/b1dc8ce2958ea0fd08d64a776fbe4972844e1247)) ### [0.1.2](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-jpegrecompress-v0.1.1...thumbor-plugins-jpegrecompress-v0.1.2) (2022-02-14) ### Bug Fixes * Add long_description to jpegrecompress ([8be2974](https://github.com/thumbor/thumbor-plugins/commit/8be297446e580ee37ea4e270fc1a80185eff169a)) ### [0.1.1](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-jpegrecompress-v0.1.0...thumbor-plugins-jpegrecompress-v0.1.1) (2022-02-13) ### Bug Fixes * trigger release ([#50](https://github.com/thumbor/thumbor-plugins/issues/50)) ([a76f637](https://github.com/thumbor/thumbor-plugins/commit/a76f637ff14c326cb0d7987948a974ba807e83ff)) ## 0.1.0 (2022-02-13) ### Bug Fixes * set initial version ([7df5544](https://github.com/thumbor/thumbor-plugins/commit/7df5544d5c372c05549c1ada1dab294af23c6fcf)) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/__init__.py000066400000000000000000000027261452244666700304220ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license import os import subprocess import thumbor_plugins.optimizers.jpegrecompress.config # noqa from thumbor.optimizers import BaseOptimizer from thumbor.utils import logger from PIL import Image class Optimizer(BaseOptimizer): def __init__(self, context): super(Optimizer, self).__init__(context) self.runnable = True self.jpegrecompress_path = self.context.config.JPEGRECOMPRESS_PATH if not ( os.path.isfile(self.jpegrecompress_path) and os.access(self.jpegrecompress_path, os.X_OK) ): logger.error( "ERROR jpeg-recompress path '{0}' is not accessible".format( self.jpegrecompress_path ) ) self.runnable = False def should_run(self, image_extension, buffer): return ("jpg" in image_extension or "jpeg" in image_extension) and self.runnable def optimize(self, buffer, input_file, output_file): command = "%s --strip --accurate --loops 10 %s %s" % ( self.jpegrecompress_path, input_file, output_file, ) with open(os.devnull) as null: logger.debug("[JPEG-RECOMPRESS] running: " + command) subprocess.call(command, shell=True, stdin=null) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/config.py000066400000000000000000000002541452244666700301220ustar00rootroot00000000000000from thumbor.config import Config Config.define( "JPEGRECOMPRESS_PATH", "/usr/bin/jpeg-recompress", "Path for the jpeg-recompress binary", "Optimizers", ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/setup.py000066400000000000000000000025641452244666700300230ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- from setuptools import setup setup( name="thumbor-plugins-jpegrecompress", version="0.1.3", keywords="thumbor optimizers jpegrecompress", author="Guilherme Souza", author_email="guilherme@souza.tech", url="https://github.com/thumbor/thumbor-plugins", license="MIT", description="Thumbor optimizer to run jpegrecompress", long_description=""" Available Configs: - JPEGRECOMPRESS_PATH This package is part of the thumbor-plugins repository. For more information, visit: https://github.com/thumbor/thumbor-plugins """, classifiers=[ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Multimedia :: Graphics :: Presentation", ], packages=[ "thumbor_plugins.optimizers.jpegrecompress", ], package_dir={ "thumbor_plugins.optimizers.jpegrecompress": ".", }, ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/000077500000000000000000000000001452244666700274445ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/__init__.py000066400000000000000000000000001452244666700315430ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/docker/000077500000000000000000000000001452244666700307135ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/docker/Dockerfile000066400000000000000000000006311452244666700327050ustar00rootroot00000000000000FROM python:3.9-slim WORKDIR /app RUN apt-get update -y && \ apt-get install -y wget bzip2 && \ wget https://github.com/danielgtaylor/jpeg-archive/releases/download/2.1.1/jpeg-archive-2.1.1-linux.tar.bz2 && \ tar -jxvf jpeg-archive-2.1.1-linux.tar.bz2 && \ mv jpeg-recompress /usr/bin/ && \ rm jpeg-archive-2.1.1-linux.tar.bz2 && \ apt-get purge -y wget bzip2 && \ apt-get clean thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/integration/000077500000000000000000000000001452244666700317675ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/integration/__init__.py000066400000000000000000000000001452244666700340660ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/integration/imgs/000077500000000000000000000000001452244666700327265ustar00rootroot00000000000000gradient.jpg000066400000000000000000000020221452244666700351420ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/integration/imgsJFIFC       C ddbRQ  ?뇨8 낃uA]pP`(0W\+  낃uAŊLJT"S̊ O2(0U<ȠT"S̊ O2(0U<ȠT"S̊ O2(0U<ȠŊB* V UAU`P`(0UX* V UAU1(SUE"EU(9TPr*UQAȪUE"EU(9X*B*U (0UAA PP`T*U (0UAAUpUX* V UAU`P`(0UX* V *0WS O8(0Uߪ_~;=ߡ_wz/C|_~;=ߣtest_jpegrecompress.py000066400000000000000000000007561452244666700363610ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/integrationimport os.path from tornado.testing import gen_test from thumbor_plugins.test_helpers.engine import EngineCase class JPEGRecompressTest(EngineCase): optimizer = "thumbor_plugins.optimizers.jpegrecompress" fixtures_path = os.path.join(os.path.dirname(__file__), "imgs") @gen_test async def test_jpgerecompress(self): result = await self.http_client.fetch(self.get_url("/unsafe/gradient.jpg")) self.assert_result_smaller_than_original(result, "gradient.jpg") thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/unit/000077500000000000000000000000001452244666700304235ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/unit/__init__.py000066400000000000000000000000001452244666700325220ustar00rootroot00000000000000test_jpegrecompress.py000066400000000000000000000046771452244666700350230ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/jpegrecompress/tests/unit#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license # Copyright (c) 2011 globo.com thumbor@googlegroups.com from shutil import which from unittest import TestCase, mock from thumbor.config import Config from thumbor.context import Context, RequestParameters from thumbor.utils import EXTENSION from thumbor_plugins.optimizers.jpegrecompress import Optimizer class MozJpegOptimizerTest(TestCase): def setUp(self): self.os_path_isfile_patcher = mock.patch("os.path.isfile") self.os_access_patcher = mock.patch("os.access") self.mock_os_path_isfile = self.os_path_isfile_patcher.start() self.mock_os_access = self.os_access_patcher.start() def tearDown(self): self.os_path_isfile_patcher.stop() self.mock_os_access.stop() def get_context(self): conf = Config() conf.JPEGRECOMPRESS_PATH = "/usr/bin/jpeg-recompress" ctx = Context(config=conf) ctx.request = RequestParameters() return ctx def test_should_not_run_if_binary_missing(self): self.mock_os_path_isfile.return_value = False optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".jpeg", "")) def test_should_not_run_if_binary_not_executable(self): self.mock_os_access.return_value = False optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".jpeg", "")) def test_should_run_only_for_jpg(self): optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".png", "")) def test_should_run_for_jpg(self): optimizer = Optimizer(self.get_context()) self.assertTrue(optimizer.should_run(".jpg", "")) def test_should_run_for_jpeg(self): optimizer = Optimizer(self.get_context()) self.assertTrue(optimizer.should_run(".jpeg", "")) @mock.patch("subprocess.call") @mock.patch("PIL.Image.open") def test_should_run_mozjpeg_binary(self, pil_image_mock, subprocess_call_mock): optimizer = Optimizer(self.get_context()) optimizer.optimize(None, "input_file", "output_file") subprocess_call_mock.assert_called_with( "/usr/bin/jpeg-recompress --strip --accurate --loops 10 input_file output_file", shell=True, stdin=mock.ANY, ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/000077500000000000000000000000001452244666700247255ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/CHANGELOG.md000066400000000000000000000014561452244666700265440ustar00rootroot00000000000000# Changelog ### [0.1.2](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-mozjpeg-v0.1.1...thumbor-plugins-mozjpeg-v0.1.2) (2022-02-22) ### Bug Fixes * Improve package description ([b1dc8ce](https://github.com/thumbor/thumbor-plugins/commit/b1dc8ce2958ea0fd08d64a776fbe4972844e1247)) ### [0.1.1](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-mozjpeg-v0.1.0...thumbor-plugins-mozjpeg-v0.1.1) (2022-02-13) ### Bug Fixes * trigger release ([#50](https://github.com/thumbor/thumbor-plugins/issues/50)) ([a76f637](https://github.com/thumbor/thumbor-plugins/commit/a76f637ff14c326cb0d7987948a974ba807e83ff)) ## 0.1.0 (2022-02-13) ### Bug Fixes * set initial version ([7df5544](https://github.com/thumbor/thumbor-plugins/commit/7df5544d5c372c05549c1ada1dab294af23c6fcf)) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/__init__.py000066400000000000000000000031311452244666700270340ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license import os import subprocess import thumbor_plugins.optimizers.mozjpeg.config # noqa from thumbor.optimizers import BaseOptimizer from thumbor.utils import logger from PIL import Image class Optimizer(BaseOptimizer): def __init__(self, context): super(Optimizer, self).__init__(context) self.runnable = True self.mozjpeg_path = self.context.config.MOZJPEG_PATH self.mozjpeg_level = self.context.config.MOZJPEG_QUALITY or "75" if not ( os.path.isfile(self.mozjpeg_path) and os.access(self.mozjpeg_path, os.X_OK) ): logger.error( "ERROR mozjpeg path '{0}' is not accessible".format(self.mozjpeg_path) ) self.runnable = False def should_run(self, image_extension, buffer): return ("jpg" in image_extension or "jpeg" in image_extension) and self.runnable def optimize(self, buffer, input_file, output_file): intermediary = output_file + "-intermediate" Image.open(input_file).save(intermediary, "tga") command = "%s -quality %s -optimize %s > %s" % ( self.mozjpeg_path, self.mozjpeg_level, intermediary, output_file, ) with open(os.devnull) as null: logger.debug("[MOZJPEG] running: " + command) subprocess.call(command, shell=True, stdin=null) os.unlink(intermediary) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/config.py000066400000000000000000000004011452244666700265370ustar00rootroot00000000000000from thumbor.config import Config Config.define( "MOZJPEG_PATH", "/opt/mozjpeg/bin/cjpeg", "Path for the mozjpeg binary", "Optimizers", ) Config.define( "MOZJPEG_QUALITY", "75", "Optimization level for mozjpeg (0-100)", "Optimizers" ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/setup.py000066400000000000000000000025441452244666700264440ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- from setuptools import setup setup( name="thumbor-plugins-mozjpeg", version="0.1.2", keywords="thumbor optimizers mozjpeg", author="Guilherme Souza", author_email="guilherme@souza.tech", url="https://github.com/thumbor/thumbor-plugins", license="MIT", description="Thumbor optimizer to run mozjpeg", long_description=""" Available Configs: - MOZJPEG_PATH - MOZJPEG_QUALITY This package is part of the thumbor-plugins repository. For more information, visit: https://github.com/thumbor/thumbor-plugins """, classifiers=[ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Multimedia :: Graphics :: Presentation", ], packages=[ "thumbor_plugins.optimizers.mozjpeg", ], package_dir={ "thumbor_plugins.optimizers.mozjpeg": ".", }, ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/000077500000000000000000000000001452244666700260675ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/__init__.py000066400000000000000000000000001452244666700301660ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/docker/000077500000000000000000000000001452244666700273365ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/docker/Dockerfile000066400000000000000000000014301452244666700313260ustar00rootroot00000000000000FROM python:3.9-slim WORKDIR /app RUN apt-get update -y && \ apt-get install -y \ wget \ cmake \ autoconf \ automake \ libtool \ nasm \ make \ pkg-config \ zlib1g-dev \ libpng-dev && \ wget https://github.com/mozilla/mozjpeg/archive/refs/tags/v4.0.3.tar.gz && \ tar xf v4.0.3.tar.gz && \ cd mozjpeg-4.0.3/ && \ mkdir build && \ cd build && \ cmake -G"Unix Makefiles" ../ && \ make install && \ cd /app && \ rm -rf v4.0.3.tar.gz mozjpeg-4.0.3 && \ apt-get purge -y \ wget \ cmake \ autoconf \ automake \ libtool \ nasm \ make \ pkg-config && \ apt-get clean && \ /opt/mozjpeg/bin/cjpeg -version thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/integration/000077500000000000000000000000001452244666700304125ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/integration/__init__.py000066400000000000000000000000001452244666700325110ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/integration/imgs/000077500000000000000000000000001452244666700313515ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/integration/imgs/gradient.jpg000066400000000000000000000020221452244666700336440ustar00rootroot00000000000000JFIFC       C ddbRQ  ?뇨8 낃uA]pP`(0W\+  낃uAŊLJT"S̊ O2(0U<ȠT"S̊ O2(0U<ȠT"S̊ O2(0U<ȠŊB* V UAU`P`(0UX* V UAU1(SUE"EU(9TPr*UQAȪUE"EU(9X*B*U (0UAA PP`T*U (0UAAUpUX* V UAU`P`(0UX* V *0WS O8(0Uߪ_~;=ߡ_wz/C|_~;=ߣthumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/integration/test_mozjpeg.py000066400000000000000000000007311452244666700334770ustar00rootroot00000000000000import os.path from tornado.testing import gen_test from thumbor_plugins.test_helpers.engine import EngineCase class MozJPEGTest(EngineCase): optimizer = "thumbor_plugins.optimizers.mozjpeg" fixtures_path = os.path.join(os.path.dirname(__file__), "imgs") @gen_test async def test_mozjpeg(self): result = await self.http_client.fetch(self.get_url("/unsafe/gradient.jpg")) self.assert_result_smaller_than_original(result, "gradient.jpg") thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/unit/000077500000000000000000000000001452244666700270465ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/unit/__init__.py000066400000000000000000000000001452244666700311450ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/mozjpeg/tests/unit/test_mozjpeg.py000066400000000000000000000052221452244666700321330ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license # Copyright (c) 2011 globo.com thumbor@googlegroups.com from shutil import which from unittest import TestCase, mock from thumbor.config import Config from thumbor.context import Context, RequestParameters from thumbor.utils import EXTENSION from thumbor_plugins.optimizers.mozjpeg import Optimizer class MozJpegOptimizerTest(TestCase): def setUp(self): self.os_path_isfile_patcher = mock.patch("os.path.isfile") self.os_access_patcher = mock.patch("os.access") self.os_unlink_patcher = mock.patch("os.unlink") self.mock_os_path_isfile = self.os_path_isfile_patcher.start() self.mock_os_access = self.os_access_patcher.start() self.mock_os_unlink = self.os_unlink_patcher.start() def tearDown(self): self.os_path_isfile_patcher.stop() self.mock_os_access.stop() self.mock_os_unlink.stop() def get_context(self): conf = Config() conf.MOZJPEG_PATH = "/usr/bin/mozjpeg" ctx = Context(config=conf) ctx.request = RequestParameters() return ctx def test_should_not_run_if_binary_missing(self): self.mock_os_path_isfile.return_value = False optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".jpeg", "")) def test_should_not_run_if_binary_not_executable(self): self.mock_os_access.return_value = False optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".jpeg", "")) def test_should_run_only_for_jpg(self): optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".png", "")) def test_should_run_for_jpg(self): optimizer = Optimizer(self.get_context()) self.assertTrue(optimizer.should_run(".jpg", "")) def test_should_run_for_jpeg(self): optimizer = Optimizer(self.get_context()) self.assertTrue(optimizer.should_run(".jpeg", "")) @mock.patch("subprocess.call") @mock.patch("PIL.Image.open") def test_should_run_mozjpeg_binary(self, pil_image_mock, subprocess_call_mock): optimizer = Optimizer(self.get_context()) optimizer.optimize(None, "input_file", "output_file") self.mock_os_unlink.assert_called_once_with("output_file-intermediate") subprocess_call_mock.assert_called_with( "/usr/bin/mozjpeg -quality 75 -optimize output_file-intermediate > output_file", shell=True, stdin=mock.ANY, ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/000077500000000000000000000000001452244666700247325ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/CHANGELOG.md000066400000000000000000000022301452244666700265400ustar00rootroot00000000000000# Changelog ## [0.1.3](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-optipng-v0.1.2...thumbor-plugins-optipng-v0.1.3) (2023-10-30) ### Bug Fixes * replace images with unknown authors ([#71](https://github.com/thumbor/thumbor-plugins/issues/71)) ([5914c9a](https://github.com/thumbor/thumbor-plugins/commit/5914c9a8671ba094dfd471bfcea3236e74ab5d5f)) ### [0.1.2](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-optipng-v0.1.1...thumbor-plugins-optipng-v0.1.2) (2022-02-22) ### Bug Fixes * Improve package description ([b1dc8ce](https://github.com/thumbor/thumbor-plugins/commit/b1dc8ce2958ea0fd08d64a776fbe4972844e1247)) ### [0.1.1](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-optipng-v0.1.0...thumbor-plugins-optipng-v0.1.1) (2022-02-13) ### Bug Fixes * trigger release ([#50](https://github.com/thumbor/thumbor-plugins/issues/50)) ([a76f637](https://github.com/thumbor/thumbor-plugins/commit/a76f637ff14c326cb0d7987948a974ba807e83ff)) ## 0.1.0 (2022-02-13) ### Bug Fixes * set initial version ([7df5544](https://github.com/thumbor/thumbor-plugins/commit/7df5544d5c372c05549c1ada1dab294af23c6fcf)) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/__init__.py000066400000000000000000000026371452244666700270530ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license import os import subprocess import thumbor_plugins.optimizers.optipng.config # noqa from thumbor.optimizers import BaseOptimizer from thumbor.utils import logger class Optimizer(BaseOptimizer): def __init__(self, context): super(Optimizer, self).__init__(context) self.runnable = True self.optipng_path = self.context.config.OPTIPNG_PATH self.optipng_level = self.context.config.OPTIPNG_LEVEL if not ( os.path.isfile(self.optipng_path) and os.access(self.optipng_path, os.X_OK) ): logger.error( "ERROR optipng path '{0}' is not accessible".format(self.optipng_path) ) self.runnable = False def should_run(self, image_extension, buffer): return "png" in image_extension and self.runnable def optimize(self, buffer, input_file, output_file): command = "%s -quiet -fix -preserve -force -keep -o%d -out %s -- %s" % ( self.optipng_path, self.optipng_level, output_file, input_file, ) with open(os.devnull) as null: logger.debug("[OPTIPNG] running: " + command) subprocess.call(command, shell=True, stdin=null) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/config.py000066400000000000000000000003411452244666700265470ustar00rootroot00000000000000from thumbor.config import Config Config.define( "OPTIPNG_PATH", "/usr/bin/optipng", "Path for the optipng binary", "Optimizers" ) Config.define("OPTIPNG_LEVEL", 5, "Optimization level for optipng (0-7)", "Optimizers") thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/setup.py000066400000000000000000000025421452244666700264470ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- from setuptools import setup setup( name="thumbor-plugins-optipng", version="0.1.3", keywords="thumbor optimizers optipng", author="Guilherme Souza", author_email="guilherme@souza.tech", url="https://github.com/thumbor/thumbor-plugins", license="MIT", description="Thumbor optimizer to run optipng", long_description=""" Available Configs: - OPTIPNG_PATH - OPTIPNG_LEVEL This package is part of the thumbor-plugins repository. For more information, visit: https://github.com/thumbor/thumbor-plugins """, classifiers=[ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Multimedia :: Graphics :: Presentation", ], packages=[ "thumbor_plugins.optimizers.optipng", ], package_dir={ "thumbor_plugins.optimizers.optipng": ".", }, ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/000077500000000000000000000000001452244666700260745ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/__init__.py000066400000000000000000000000001452244666700301730ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/docker/000077500000000000000000000000001452244666700273435ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/docker/Dockerfile000066400000000000000000000001721452244666700313350ustar00rootroot00000000000000FROM python:3.9-slim WORKDIR /app RUN apt-get update -y && \ apt-get install -y \ optipng &&\ apt-get clean thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/integration/000077500000000000000000000000001452244666700304175ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/integration/__init__.py000066400000000000000000000000001452244666700325160ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/integration/imgs/000077500000000000000000000000001452244666700313565ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/integration/imgs/bug.png000066400000000000000000004607321452244666700326550ustar00rootroot00000000000000PNG  IHDR,brzTXtRaw profile type exifxmPm!):*ݵn9õn (fN%%/B..;ʴwp Q4Z  U4*6={ZW##/kT2ViT8Nyv~.NeW"i "VdMS{LefIۭз&/;kEUFh\'mzTXtRaw profile type iptcxmAn0D>E``fp$Rw]*ԿiA'ϯ}Tǁvu2t"~F^gO*-#/_. u'tW!\L,5Os8!1tG9(19JP=P e-hwLY*>(mےh-v"~{}yRoTBRpiCCPICC profilex}=HPO[R*vQP]8*BZu0y4iHR\ׂ?Ug]\AIEJ/)}wT+e ![a>c\b>')x=uRxwߟիM8 xxf9GXIRω' #e8̈IGbJJ Marcelo Jorge Vieira Marcelo Jorge Vieira CC-BY bug +bKGD pHYs  tIME XRa IDATxĽі#I,fx3fMGzvg3=w$:J&n  l ɶp,FG _ F"` <$@@CI#MREm״-MIu]?_~]_?~=u]_sJ*1H"A2b8H:~82s$"4IfEId$Vu Af~?dD$ /$ADpH D$½.$L9\\kֲmK2""i{dbM98϶ \zk)_Okx][`o^^1"c 摙df8̑#G23Lj"bo9E8?x#8#3iܥEۖ)i%<&fS}Y?x>Y#'????~ |$g`"8B8#ICR_%T,¥\Kˆ 6,dQ_ք  IQlsP@>0 Ľ}{ؒ24O`˖YZZk]|5y}=5לrq?ME""X1Yc1RJ"b $QaADp܁A$ Agd2āl`wF|FtvY_Ecus0 /O?; mwӁ 6`2ڠ )[ЪThzΚsVMy\UҪUVYꅾA͂"A`DxdLiFW;X6`7V@;eŽ'P7t~:,"d[,vSMؤ`VM@ĸ+DpUv PeWRIq ϧω__~>ׯfQe1\k"2:"`S+(E Z\|j2Aaea5 ᾒSٺ ԀKGҮ7Tr>B4ms@6E%J\kiκz>ח窩kyxVa ^$; q#̊ 12C*i̡S*$m(mI F؀`,~'+"$U_$>!vd-2؀7E"bǒW׹HtÏ^[S?CVa@@0u9__sM]U婪kZ5VYrHYB FlKe#dF0s$wPv~$bWe[8{tW>x "Jd9謙0!a/#l \ CƑ3H XP-.yV⯧&K<kb./y rxN>uFC1Q`^DE";Eݩ,Wy.SZKsZkt1ll @XpqmEIhKIK;EcjKHq{R;ʰz#W]UZKka.\+F(0Gxg YfLU$3""i3G($fDȊH1 @"#" A@yq0>LƑlb Uy^EuPZu9 ޙhT" l6ɲva UF ^uk͹Zbpk~^e`?dgxS dy8f޶C}0:"kM+AGܒa\5)~U}]Zsi UXUUU\K,AD"h%BLʮV6""q0& @DFXdn2EU&.ΪAF1Y>G*OcMкagY &ZZ[@D5L+dˌf9rgW 7=/fqәa"hsp+嬎 Te*Q*e,,|*UaTX)KUXmQɴ<}^Ifccqy8u2Ff82<>Hrq쌲w fΚY*U*ZkDB7l]/G{l~߀iZEဏo*9eVe*gz| EZ95\U ___55WkZ^*NfZ\ER" 79-%0@7Z-%9G!Ã]5翥62-mK &cOr߸|?މ^p.wIf:*QUcu<83sΩu12k~ؔkCj9pDD)Y*bDF$KpiTb |*<Ϧ23F|e/ڬp4ۄE4o eIpx_f6[,s4gRS*55ūQ2V-J\jTP3 4ARA b`pdqq8cqs㈈cnN ޢ6̖wzXK`Dq0@fwD!:n`G=\J" 6 6SOW.M^|XhҰ#aKFGm}(|8[s9s<#qkǯX95 a 91΁"Q>Z B8#OD81 #31 "a[z6|Pg[/>7q%0z242]Ft5, ^5לe\ sYxT\%L>ku*ZT 5lcP1?jDDqGc4T=>#3)0IƷ+֦vXUϚ OUusת*YUQ>DTvN*<$6d!5AHAиemwp`-$YΥgRLKeT _|N]/UZu\sV-X*F1 NdjJ=͘W+ 8!'+f0PwkHvns5uM^0aMw@f{e0= AjU%d`mxqeܥڍ"#)"]Bmn鈗X !F4A ],n٫DIT "B04ZS8:~Mjw[ kle( xG 85gsգ9+G1 Ou}Ik r!K ,I`X֤Fr$#5q1Ȉ#q~8ȣ)c<_}V[Zu MC$n[]$1':zUم>4p-yzΫE*_^i.G,m4Rk֪*%h"wGU /O/oh?8>>sG~oTj,C&Cªãj5Ɯ99gQUuŜYUeMDx&Վϒ,S$|h_펋،wOD<8ӵ/̦TV%תU~κ_\b%-!9e1wjSHhaD`氱U6h2n _Cn;ZE 8x7I1vÝ&ba\I▬} 7kئ`.|5o[9*̝ ಆ_VUfUeSqq>8cH cWL?qGcD[U_ c01 ;7cAiM-v(o uKxԷlͼ)P&.hgWU(UKxcƨ>r^m#nysX[LgX9?>>>q|~qkd/.:ߙwIXm]K%mZrU\HXk!ZZK, w&vN*,WTDh[_骶<h$:эQ gIŹU9/r\KZHS3δa2" G2DE:JÔ@rOe WhnI1 ;\*jn7"ֱߺR{a;^/y Ja `lk@覓7Tl}V÷!4 5m}Bʣ|slj1NaD" yqhmUF9v= d"a˰^V܌}nܱwi[ 0-l o .cs׵5k)gaWa)*X0E$.i fD hi3FhY8?<yt{n MQ}9Y"$\N5<8ڎ_Ӭn۰-+Aۏv$igXk5tUNxULT^/ y{2QȄPc^.@)$KZp X{P^$7GV6},L+۫w<Է;o^i߄4m/(Ƭ1F39TUc@b嶬9gbZق.2s7/199>qn*$@Fc 2#[N.qG NV9 J@CkGv)Aňm etL"qGKќKS31FmIDHt]m7'ٳ16ote^; w}*%ВgյZs%/b.Pj n iunk/k88x?|~yydr1$"7TuҠ'F KX(BD83uΓk䀫&Hڛs4̊*mQcwdfl8T [:ÚKU57 K'iۻ~ziK2dQw#x{(.rtHjgH?N]C8rKt-펛R"s;H`|Q 8up!ݽĠ:o醻|9T&5tc:IkuņR95*\O"GOyGv:v0ˌ~F\ GGa1<l>3`K Hᖛh?\]<_=wA]U=?^ ݳn1",/U۬Tz/f1VH[E6]j|7wvDdK xog;m=?"300?onF`z?,!) `! PPFG8nc *&wÛ"z_ 6Z;nnCVodvYLWrK=CETIg4Uki9@&\h+Ao |u\X& 8yJ̎ؼk,,tf+0clưrIrOS`v ý64q4zv7 ͒[#Jp[ C꤬ɘ"ӎ;_-DIzPAEHG6HF 7kJF.A|Wysc8ggKqq#bgzU`XpЏ<92p |y<>7Ww#1]"6FbZp+$>;Q=S'6nTjݤ(w}3U#ZJptw.o@HEklHxqlܹ_Jދc8Czɦ!o_Ek mqS)=]`5眫@EHVB,,8*PdW[onV98?h:9>1F>lj#p@$@ǽTg1&}A}diQ)8'bphk4(x6yKP/bmjiW.y/ */A-^= L$*@jׂɻZ' 3*,iV!Iq[=&!NU}G4 g; xy{B]Vhu/t36f7jm{{}}ߤW>ڴnOI00QT]Ks QJEK'Yitp`$|ǏǏ qvԼtAc] Ѿj%ޙDM C3o/mru'ې%zCQ<7l(]#rUOYzg[o'7 "z,F3zaoÛ :8;,lAd 讄lꢺtOJql3558%ܭggĐ#r0d"ǝ^\8k*QTRkV-|[',^suCO2@FB=tO !,aPbtt!` 5<??o?>||q1yxtE 6עx]f@v;ȧC{ 3U&C !";W@.U3~?:,%im淙tذ`Дd2mr]& Vw &+!"qWn @|YZkH_juюQ$ AJac%gPY"yۂ%NzU}rHЋƲ li=:Y3AHanvϫ%V6uśjnPAO*T18=+T8yϏϿ=>~|<q|#8H;}i?+? $0w3|0!a [őa:TBRy_\J]q;:EXQn]-U8g޷in9ƺP NXv^B R"˩nW}UXP `Xj.zS$a\7 |Y_mL6niil GM.xO,(@ߺ jn@ 4jpG#*4no]NBgslp[c9B:pz|BFUJ: ,dF2Fםu:B{J^>9Oh{i9cOB-ԂZZOkSm}gGog =Q0vܳtĘb-1#މH#qrgoQP虴|8~|q RGhA$M߃*/91#) 2p *KZGA )nWba&V߷V{y61QI{w6Fd}˛dlkeN _ $J #aM-ːm6sΛ= QnſB7COEDwXqM9^B{F|ܳD3"꺛.## gq~7;T6۰)ÀA(pd8Zpg,CU ,Gag6ݮ0|ӷ-a~_-}ck5n!MZ5WbȺh Qy{^Nvjo MJ\E=*038F?~s?<ǁ#qb Po}WoO{$07ڜCmLP!QcTU՞/Wj'#{&-[Jl&Kܔ|#j_7 =į[c96oM-1FtRoo" ݹۦ@`Ndb õv\wپ͵5UD-jSn3Qu\NMIk^VYMlԞqܣ=X3sGd<?|sks2) JzPlZ#$# Y+2}A*r}W!z*S Y)-`oztw{ 9EvQV2M|'ޗGYMmϸg{teFY{g-3T7Vme]vѹԓdF.ؗnW@0%Zm>B=d88FmV ۣgvFa%8"3+ck|sVu7&/v/.eƈm.81qdPPp\Ukr׆߇. F*]p7@eޝ7o[ꞚJYH--3ҵLaeNRHGU:,HiQs2/xлBr$&M^i?Xޕw%О2E-Rzsu?H' dp s#iX(gy_A&z)HbnSiP ا/IQeB?K s֛V䈔<" !Q gٝl^̣|ɖ[ Ҋi1f =h涷y*MvV x,BMq3܅7 hb0d#T^ ʀjk'g$d2%){};FAH?Jᒢ,/_߿޾Oi4i$[-9V]jzzz@JFX  ֌S-bQBH{2GJ^EDɯeKFs+lozWjc^>t';Evj$,xLj衠cUf]nSE̞ϼ;+E`~n^.!EEP&Dԭ1BUcsTI(ČXLmٳZ&UϏIqvMvfqOs(&w HV,㡊`A4}!ܥ7hWOehЄxBvTBR`I) QQI6& OtiM2Me^t%vC;G<űֹW+IgAYtZӗ/;}YN_eYV;&](̻?DS! gWڄ KRB<+3oɈP'F0lzgo)]MWa-ܺWlZ i*JGS>f e ȏv=1Xv0 i"4NmMML {dvhݐippnzfB\럖OUMǔV&+T1}*z(*D7^m :5.9]~xI GxZEhY׈h"=Ht<,5a:*B+T5HnKmR4ID}j`Y@0% 5eYPf>ߗt4/%&Kʘ*d+>k s+Jϯ$|Ƣ T¹ZzN^[G kSu:WN:Nvl\(y̦*B^vOukأd6ѧ&}MK^@]\n4&L UEF Z^IDHa#!MR6 tuy >O5VtN WHJJqYrXAN~;tw9Q0pB2OrpB\0;Pj1yZN鼼Me׈iד2_@lem^|~+lT VRp*X^Bzm?ϟ>| pzMgOPjn6{D6HAzDzr3q|H]O΀v4eR!iQgf$9(*bN<)lqyVn9gJZFW-ٝ/Ä8ή=TUPUjU[1GX[DHZ^EP ϸu K{>.ɳ_BMx7xq,fe)4 RsA!C-0xU:JU {zo8! *LD>dV/%Oe]($;I&թY\e>4͋MKzڧiE&ە> iQ7Uu17X] jIcl1B裕NަP#9I&=%JWX6ku=JogG}Md4wi@0Q}lO\ޕJY1=;Ġ?Hf;>~ b.j^;:0krS|2(I.Ww+D?g$nb4J1*VMx5Ybp:=BHwpF)iLޝ G f H扙 QIKDb7bGCkʤV3jqe@[@L(ENӼR0D=km4I/tZNRLcLgmd:,(yep>> -&QĆ5Hj`!]0YѠ;, -CT%='p-NfIFc+{:R~ݑR*%ãwkdK"թ[@XK2i6 d:0gHOq J'7vX&4JVqO%));ʉ5F^ Rn:؂`- pur1١enޏ+5 C`m<|LD3īkďaqړ~2ScYT[X@IuiSn Ef̧2-6-Z&IblS)Le'Tnj3_`+}xn~qٸk< W1?n{i[/dzPP#DFxwsc£a_q P >j~ ff.=E"$ XvԞHk1JmUz06GDMnܥi퇊iUL5,9CmN@sopcx(CS J݈& 1Zk ,ꞵU SIPp8`P=&hio̮R&mBTe^Χ/.:˭XYa[FkN!Em^~>Not:ӄSVnt.$73gϑ&0F(H GQzSvĸ+=zT{}wk#a AS,һNr+z;9SQ2j6m"`2rOJA{c^2Bc)4<({+R5Ͳeܫhym}Q;126aED.EaSsb:QVm Sj꺒%p|zPm.R4b4>c+RCOn~S*K/alva;<=yx%&ؼ7}ⱞl*άfx7T[E*/`}Y|$1|KۦiᑗQψʄӄeɰ Zq@Z)Br]b0JsN6#dR{ "`-N@m8 "# DTA˶#i*BV/EmHoF!!Jc !u<]8\ULqDRT*cXwP8yѱ|,n >MC?.qL9MuXy2c#TEsqw*N)N\Q3A=lݣf"J@tΎ i<]m8ԥX BĹ @Lz׈r~C)X+S׸QnYeߧ/v>Rd._~|ŀ!u{볎=0#:QzQm?nǭ"G oγX 'Lkaڗ{ھh7 (i<%Ug,bQbZczn2U] -u>|e2TzB([}0 n]Y:&ƩK@_&C##ݦXTd='w+ w[O:G~x9>VB?j~=fujȃLjg[ c$AD >@mVԊ[C}$l-{  cm"k0kѨ nEJ2Ch"駞7FiBzHUZ_Moh2$u-i="c4=1b .ĪR,=tPURyVJ5V mPV9)g]NLT 炤_Mȿbu:MDyg{!zߞC0N9}>JVauQ@FᚤLs$8u5kRQ.uEs5\(B1#5a6~ CA S5f)c B 4#J &\nMBTC}X.%mY#3tEPgWGl4Y^KIL=aR(,0DK"3h&65Χiu-si.|{Uez܈åra$e&)y%MC 03EdGUqimCvȶ-9 <wvM@҈R'LgNmCVz}VhD10pkf]jC]ր;;[Mߘj!&@( [İ [ؔŨj` vUHx %2GDzBI(kD1QdⲐHT$BjMoA-Iq48%g Is07\K)gM8M8)]ZeT3UUQD7X &fFN%P#2<ɂp|2*8v?*XGNN3|@sQH0; Nz4"#>CT2ɠzʹ47WcR=m2| %"U.OqSo w'@DTIb\K&d͛"@f7iSnT3I>$- kҬ":h@%nժ GkpG㖡*CSL48V1m[j-\BMFL Q0J%*BD$4B4[ϋPU@VY,. BaQd0Ԡ 0l09-qBdDP!XE*XDf.f8OPXK)Eq1+Q dOi1{bae1?#TQJqi y 3F@(ړ [b:{tVLMd<Ɓ(I'}j[JzH.Ak~%1 `]ڼͥ[fKh׌5TUw?ڢ{zeT w,y줜5 G hoПc{?߮xɔ\hh̴ ZCߞG@>^+o3ŗOjCsJױf͚bEa$ !TEv@@>+u*x40dtp`xS-;a&l"jY oܚ4VkWc)Ӊv 0I CK?(zkӹMM7Ā& B N&4kGt,kL,Do!Ԣ4QP3HC[-=˷O7I

[;>ɇ-auz| )cࡦ~d}T^>r#`s%$%ZR548m;;N`vxݸ*1 ^z?2>=C>G30HTPPt"M,%dueDMD% bA{`۪Z;]e|X" c4-?\Bj5͠FnE3"(l2%T@-Sf 4; ~|T Nbs {|ዹQp2r"ǿt l _W7ƶY/;dx뤂!)!5:)kI^v lژ#Ђ ԳTp+;;LY5MJ+=-E&MvJz/޵Ѻ(Hgk-"cr5i(& EV_nbic-D*0WT5C_5"TexU5Czy d=t 2wCU؍4FsaFdM 00C,:4G~ɑٍ!7slLo4魽?gzYv0,{Vi_\^6V?_^- ^{2v}N@6JPA԰ wL \P5w3A>#"jЃe2xs'ad*٥)TPv4DtfV&@%/^A4=Nktl>1u-+b[HRbfP`! dE$+DUm> 1\zt7<~v逇i%|wdƣGl8nz'd=޿HFG nV8d~X/)WyCM11%pv,ā54l 9B'P" Ir(n4wx&J-T?iP9h5IaT4B4&SVRek{­_[Z+ˏi&5Ӻ e7K4h#DGuwAt81XB*obԉ$ ,) ^fKKW.IXxw40؟w2[>=#Ύ qK2z>pC\dh GũN!܇Dz,/73AsV3t'g÷+h*xK9:Ej4ASD^ Y4_kkE"R+#u!t)ݱZ)HrRV۰b&pM^dp6 O6yNeߋɆek|~V((۞O*ʞy3+yǭK s4Sģa\G2W|Ş[}s_^A̐lGM$}!0ج̦bh+QIudԞ 8:>^D0VPIP ƈ i"œe7` -VvYVo_o_W)$XwF,ASk8O6r[X"VݽoJ/=7r%K `Y';$U#AU^j_}|Bz.cs,`LjglLV.eRsVk,:0TD,ItedV&B{ΥӆM  RH;Rf)KYf;- AwFQ蔈WoQzv]kZo!6ָmXhڏ4GkuV&rKݽO'"{$bH LDTTSKs>Fb ~ٕxVlOrF<?" Biul~h{9&\CV13w%C;sKfƇ4tF=` C(I*^ kTޢ:t"i0F3Α&-Ϭ;t| ###ȏ8p! ;'KĤYeM$hm:|Gu;h-{Zkn]k\!2qRWZ$#փZTkkVo-Zmmk q~ƞjhKнǾEs?c~l[oθ_W āgpK٨>,w!ȔN290cpͫk f +owG(>1Jd$_T*dzZ -(ŖSM[׫@M@NE ݜŽ(C<zD`G[ N`2s9O־.rSz4bRo&*P YIm>DvX$=ZkV[kQkmqei)οNo3pF4itRR+p[)QMo|m PVGîR!-b]^N'/Nt  i $EI@K[DPV%êƢmii;30\2_Nk9_yf}B%1Ŏ?V7fTA߫ ݥs+Vy{ ,!Njb}( \=pХ{H'p&yY߰M{+ J##M]JHD˩Â`h0FzIڷrmu/oOoSrk3Ztz>Ԧbo*Yjek6^/qmh"}6o}L,g{+5 r)n׺.&֢}g.L~7~XV .Q2XEDCDxM\EB Ĕl%3 1]twWYLY,HS \$T\5&Lo!BE] @01ݩy1CWDo+; @}q흓AxKIR l&B.@+UṁLdU7!AʹaP+;hV/ }ızxglg9YP2u\<$] k^/*@"h & ]ALLgߞd;L"F»"2+)RVܾL~K2G]/М;L tIQ0iuD7y2vo?s$|+ޕ~su݃(]dqxDn{$n1Tbs9f?⩃hM'?5=&06Au`gK~70z)/.ϯr?9Q>Pޏ ED#0'wr5w q4e",*PԌzqEOLs "< qȆt.q2~-v_Mg')۵^o^R)2IZg]؊-e^r42ٛƕ -Gz˭]Vnq5\,rz[o_-t>e|^_@iZb:VM#fZզbL׃R ptWm6cޒ½#LEr4)ܘtS"P{ng{% j;.Z'tX^݆w6Z7ɫ<%Rσr. c઼98c$'?I~zf>WofdO ҴQRDԙrqYEn\ܝ]'jUm9*i8 `E"xD^n]?Nu~\K|X[^gטqMOęSx/Kcm@Fzmޚգ!fQ-tz?N弔ST8Y j0CI3k'ik]׵3 b:^d""fڷqX#`~MbsN(G ۪Md{GObvCQ;@}Ok>m6Xw=ZD HV IQڷl3[QxN=9?ݍwq/‘}y 9kn@>E;Dsl"iElqi֛6WƌY:kҘL0QAApJ3 炦&"4r99s_տs~^o?n+ou^=POj﫼] _oMG!&F~ܼ[^%~\XeM?:IeuGݳ/>F/mo+[vTu,Mђjd!?~Л '˰7n&dXUw>C{X+"޹3Kʀ/.Ne{V/fHb)с/'`tfDG-> fb1! "+ĝt9h7vNɃPH$?Srre&n䑉%xt&@RM6Amn֢J2a\*U{&iˮ.VԪ J^X;vAz4"mFV}*ζ{$=U3P3PEBLJpqJ,@.YL.PdeQ D.T]bϵBvs5=69hFe(*nsSȜ}_W0hJ!bX+w`+;3}׶"%g-B=_> ؁(ڛhfsZ "(ae46P4/OA7hr(*?񪵃c4 &SuMJ#>K fс)gƈ8uGvW 4 a7xC2 Ⱦ 7$?%wف q:ScQ4:O׃#cG̘9CX@cE\ (Jm GQ=6G$x搑wIM͠w5;{P7wbdBUz\FH1ՅT4XQuU %%}pUzD=::\!}ѻ]ތԌM WE v!"ҵfn_4YRߗLHeY훎 EqqWbMO{_%{J0mw+$1Q:Þ&uOsVOWDq_ICy1<πcehu\yYHt0g\xK[Ϯ ̡t$fH:I/=YM> X_MG5ƘW̕F"+ Ȗ6ۂr<1@KnC4Gǩ0e2QiCuhz4;BjVF >&{)tC^A=ЃA0B'@4Œ`5нf<{ҪԎS]/VQ64sXܑyX6>` F3N?9 *TΫ M;Oyav*FH9c Zs=N)&R%{S:*̞~>RԬ'r9i/$#Jp B .ԝFiEP$k@;wPbi%=[T\&ވJS^{+v^)C2@`&+G65 N^ŧZ 6*u 8$hAtqa1 d;GFg=`褦B6ѯ8f'Iw nOꁳp@&t'uC}fRtjT7"YtK8+쏂?'=|7k qd攣DI0.'A@sMgwsJZL#vA$c6C`UpL M}TUCuNщ4`*;V֭v )a;3%1:c3 1q}0#ڬ̸))`%by~/CPRD-\Z ~lxzEå6', hG^,B}Ջr[p"uQ~iɻuI.۷LwU ,q}ßIg0[mRuN@nW]xe^pI^V>UU)gBO:V7J>,'f\]]Ǽ IDATPcOx<`4r '\IBԓa `JMC.8thyLTu<<t 3rIFcg5an ,6/(dG9Gyғ;qgȣfE~XB3)}|Ls>#8rd!ȝ&sLnf'/nއWȅ<YDfYJG% JlTwPB$; PA2܇rrK\*B!N1s8ydC zӶeG/XIE_D{G!w;3FōEݞ`Bڝ6eߩ7jٶO__{.ӧvZ{$v=s_Il}\/VŪ;H*At0Heׁ'E%Cܟ|^tjgC_6 Oۜh9A4wM32Ġ1;_'}(l#WF#:C:}N1APgF24;1S{<>/@|Jw3vG~|~D`;SĂ9;sBl 溔$enQ^DFAPIOwtNe10I-DcH]1(ʫVhn V* Kb m.q(r^@"V/LmUKM/^>wټo6:zYRЮA]-ٵilm^W?싫S\\?]pU5iusw_7}uw˧ՋʟLvEQ2٢'u$h):)H Gڧð6;  Chs>[:Md '0lc@]38}yrS8 vߌC فf8cO8;ez$9<eJpFCD&m=8߃?`Ǥ˂m!pqy<rp`jEfd́ӔS ;`$PY6[zL[ Fꪔģ F1TQ0"E!bʹ"[FuV ɒ%E#ȭm;yG`^a*WovE4ۯۋb7˟~{I,oۯ}[>rzXxQosZ%}ݫo~sys5rӂǂpƨ%V鍝@|@DN)Ua}H`ji5L|,m?˔4>b0\I9 zx>=fSpw#|2IuMh96[A1fLO<=悥M=3ܼgABc}w46~΍a] 0!s\`*AT Zx@,DU7'0tPH%7=WX.ʍh]#NjNn@t ir%[mEC)00ԭwOn<7~:v'/^VWmO)*m}'=A$EjVūumX}kPV&٧~u;v]nWo\+a}JE`'RD RNL3-#NǎJءѪH -L4cBy5XKdn&MT.cm 0h<399gS͝AO5hz9#z:ekUOC"&BȸMDyAyR''ACs;hseV& rC`q gI2Y9b,֋1bKI=ExNi 9IQ1g;ֈ}]B+ ]%O0s+ ԒKHsQAU}&n}bMR˗}ͻ_"jܴ[黯_6ʆ;Z`կuw?/xnϕojqW+Wnv(W fcc}|7^-9}öm}6F^gU}1R!q$g"t'בd曾 ֩_L2[IN t6 GNLpmh m~\og/'Spjy;@\6֋+.[!_Jx&\b `|Wf^Y)fN0=ԌOٺMl&|,C0_?&b=S~:%c[?HLIDbxy,4W(s^?!KBd f.$XP(Y 8(cq7Ԧԫ$8-j~4sH0͈IpTVeR46E6ypDX4;R&Pr8؈iQT~7bO7݇ެW˚?oHxUiͷ}7mY{R0GMF/ٴRM~ mƩ_\}u]]q-o7rATUIA4dd\yD2]@;g[4]nʎy{5dUxNTo?}ƤI|=r0ŠO#pfPN i9eid:ݞ 4"w >B?}Ɯ.Dݓ9y#8+s,Z^Xn V7& ܡ9*1 53v'ٸIi,JVɌA&쥩j贊,"Y)_xHnMn}]mz p/vۛ˪~᾿^]_d'}DX*9X5d 뫫E5=ڵz%,BdnyқwouUqU@7 Lt)e ͌ޙ|q= 2?ԶΒ 9}z+ʦaCcK3dfs"Q; ϔt<v8 1m$@% @. X⁴8uXn3 ,fWKXͣ 0WoS#mp6Qb 0N9}ƘPxe ̩zs,VN0ܔ}(p$dZ QXx(651$n}ۥdpbBFR6a&[J;CA=i_Mʟjk%CLVjk,mׂ- }0%œmӿtY|\> Z<'DyfD*eY\.~/{Y^ BȨš=D:cTr^vIWϾW(/'W5-EԂv{ӂDAH,3u<٨"m"Ё\ȧ|]6q|/SޖXTɈ[v|fkTz}';BdLnl;5=uvĀw{ gkLyF8F3Ё5ur@$mt4<8yf1H5E [lXրeF(ȉ3 @rsyƹ3nJC~=4>F?YЃ>ؙ/ͼqc \e(s  p!dyj DRXKn`c#J,p*9YD4#`Rb\̅A8dd 37uMvzj! \պ价.uo~_TC}wĘR?N0EJX..1.w],BY[oR5B]cuz*3Z͇WmX\^]= JM>~oE}-+-׬kʸ bf*SnÏz!ia{p :HjX  }p72su75wGr3#u5ځ0щdbVg |cKbsQ~;\rg?k^a4L0fCnθ)rBJi}ٙ3Z`[3H~LI䃠g5YL:5LJ=dlډm[?!Artx z0b)$W~gfO.]cI pX( 1WP,_0MޜXrMIP$/ژb)b+HNbr&X(v&F"J:&5+aKJQexCh,(uK2m77ϞݻDaQوJrB\,{P)!޽znYԚm'EZ*1o{wHf΄\5]]VZѴt?zrnV&cL\Kۥ*e6I~U۾j]%ψȓ椢;r7d4HDOdп@s:9yo3OffvfbVh 'L[@Y,7M1HUׇͧ3@7*xװ:҈ؙA\>GawgNYKډ|vשuA:10l *2J* 0OsLaOJтRXJcqv 87DK*P3x)LՉT)Bj}QKQA(jqm߻f{sO]f}ݽ^6j͔߿XNIN( R߶4T%fmߥVfsk^,eZ>w_g?ZO뺤LfcQq , uخy#~-T.__JsD~s1:|:Y;?1sq3.p˦"daV @h1{Q6i7Ѷ7dc2d1bpi0ؐDz}QN07ZOjd06I;Z#IٚG99@9_A͉ B`;h5Qj:xK]ibxʑsF;1qz'0?i~`BVcO !4 wŘ96Gwfl6^lpu-[ zKI3+Wv%~<vdz*W LMٜav7fAn9!\Tf_dAˢϖ,~v._ﯿ~Bi.s`jZ0R­WuBjJdP4RP*ޫhbW"*)( vwWr?.k*(u^Z]G?p_TeuQxuYJl{y#-c~{/j,LMF1ܨWea˶,l\,~t-u"BK_n]߶>XƺŪ(NApƁC"A2l372`l?/򝙌ՅI"Tdݩ`jp3_P({e#L+~Ҭa[4 hσOv aF<'Ϸ`"f9k2V|t7墼E\|MZQ0W][Fw@eA*DU.PpS]IE!I `QHfT;`fwwR)Y9;ckZ,'Tg,jPv4wXYԭ4i<Kdwww} dΡ ڻyXQe^wzxmWA/ewSmC1ݶon7G'~qOT''͚q|grUm@F8(_6aUf&33r7s"$alz`$6a>F +!8C%vp(L6<759 H 2C\'d eؙrX!|,28xQe,IL>b7T)0%o쐱zڃB88ٳj4P!`svE/,<; A!^-֥Floͷلx+oOZ\R) !^\qtOF˫^krJaNI)q^DY"1 b8bu^|껾*di߶o݋j6ƮBm޼{-"e5.uIeI\EUx$.̚nwszafͶu vԖWW0{ͻogbNw|! x]obW%^;`40NF?~؀&f|yдr K+ 53MhL)1! dA"6-A>`#Sq:p'<#y O|ac/%嘶j4 ZshKY8N L 8U N3n%ʰA 5,asxf9{bAd@D֦Bg sK :' ,3zHsx?p招MAnH䕳kRT؂c`U/AI@omon{sFP-mKx[]t:{RVE;7_断1͛BNTW ~leI׋v\\^x˗Ozz}b{{p?g߿-*DXWEUj6-Dq_x.B} ‰Z\]#]kjT@fۭVy,w^YXVݳ>*|>wۻ^_CQhzTu}i|eK-"3RX&e3ά3  ;PlzG38i賓jrȬM)sP'3dceSv,Ȟ-KQ|i*Sf ,_!~8! DOfݤB)+8x `<0| (!`N,.D6z+0/MF+-X 6m0f`f,p$@~{`\#i6f6&:0do&(h6FlwM?j:kSbfnL%Xw}|p7ьT[cd$<[sr⃌]X܄J۸M?wg~_/ji{{ߵEU!_z2T_, WU` {Q/(,uI̔\[.p2^V^ϯW։UV˫]?/JzŶoVccjk]U<{0CT- R.}0I$}t{paIzqq[ \7<HOQ?]~YpW}-r'0CgxGo]63d : Dɑ3a~u. ){rdxügd ɋ% F gP C$"E<3$y3%=T@L$C3EL{!:)N we > DXR(Db)AAHA<@"#GPp|%羂9[C'1eae}puKXaf`@B+NYI@}վ믺Wfӟŧ_~R\owoP\V.LE- dz90)5ĥPGNPc exñws5X*]H^^\=dy~_*Z].7?ɟ}?˿ov;O1Qa B]itcרG~r`UMWUref ""ާNU=}8m~\6w|?7r:q]xvW^eqP* +<ҬG.=؛:g= .=X6a.6h`gub2#`b0 qNNUN/ecɖ-wD|]ڒnpȗy0z`0z?b0Eql ZK{GjT(Vs"v,}p +N+O̢ DT"f0)6O%U0f(fe\fi:r6M'0g`py!qr1 C-4#~M% Lp70뛦4!"/&"8-.k:|^DlH:liz ͭYaߓNUu0E%9ތĤp#ršl ?\={y=Ώ|pttObV^=+| ͖6q[J͎m2s-TF;o썉DtѨQ"4ΝCwnqEU= W}w*V-[| We|iۮ^_=?!EY"(Fq%sib1Pg@%k7 ZBEۺ):Lr^Ku^w\K,Dbr,YM[F*EPtZjЀX ̥ 2U )#(*>[BB iEF3H`Q))*%9`"qd-ӎo'zH5!1)8PBs@3#'$&%Gƈ +P:HR{Tr-*7яiD;C BOY~ѫB,F64u" u8A̔;QR4 `t ʺ盋]exq/&XgS7_\_"17될+s-[cRD`@)t@+Zܼ D&igf+Qio{?\|Go_<{??W/āt+zO_~ɇW[%ϺWl T2Bf.uUQblXDT(Ր9]zD $%H0R@&7?SU*W뫽BACt|+S,f~du͸vⷘ)=^@0K,Y 2dT< x0H RЛHzH:4m.iȎ-႖jQQ P%/<ҷYx?Л{$s6G@`Tm##0'` CZֈ'TodEG Ź6[hQuM~f RStNtqtj#fAo=vZB&P<[(qٸZ'zӗ쳟ۿO6o?.vEsIX-I pzDX̜@]S0F(t-h :(Kjh"B JIYnz88ۛU%n^\N^6/|ઘ]ָS 9$1Q][7fcra"$dHȩ=/6tBwf؟Li/ 4`FCKI&sLƬB(V0%`z¡g!8&ǔN:v& FHlB* <р>-=h ѥΎ:4tgJNsP0c23; G9{0B "Ӂ1THi ؔi_%!35z%or$eJ2vCocހoYˀ2WS@ h1PGrU^=,jl8~pwi "g$W'_yj* k?-A#rDk.~_k<x%(+ةZMր dҹ|Sty޶NBHUU-K7?wl^(=|t׿/%Puֵ_.7Wu(u5qPU8;C=ׇ"P'7mȔ(!h%K@rQDm֫.""1Fnt!@uv1qEQ,p`l?#&M'񥏀(g"$cPU!QUUY2e1hPAD٬_ٟ \UX;Te.cP" m)=>p>n% r|4dg!" C틩4̈pI,ȥ9q8mtjqh&.}0rPC04Ո搄2ЈLвHu`o!!30rwDBDHS3Xߘ['5_rˀ)"x1ՉoāJ]EI`pGD9גPo,(MΆj 2i$=|d k1D/ѯ_c ( ڄ.۫ΟrB{\>'>N y$@EMGV s ש]ѽuI~5by!Fbf@ DU - 6`fdӼaf MӺdvlff pjg Z&S ukӆ)P+VAqPszo=_VUuU%N1ˑjX1Ʈ4_rjY"$Rwt11݋ӳ|Ÿ2jY1$B=>"9<&g6\ Xh9}r춎φ->U3]F64341#@V:6 >,f!E4Bp]ol5#*v$ߜ}py%qљ-yĎX(HH$ Ue[OOꫯs ԺV#"8n.S`_ݣ|hUTyY} %lMh8Ãi:(ʤP1"b]כE!#OG.6\fAtJ(Vp`WG}7WgӯucW"1"3Thj^<;R1BӪ(ťN,HM:trblfШ,)f 27kp#VPw\k'u\菻$m7now;s#Ӈ"R}îNSQIOףbnB k1Aù9VE$ӓu nZW޻𝏫}8).C NcjdbN+]C[^h?}4 kѕp]]|#}-eW )XԮL;Vc45eʹrVᴋ\SkON,6k۵"yƦLaɼZsK zCmUPlbևoO^'W>_}uy~7< "A"Z`PY"us{;CT0bnU͓6\IKo i&8$D9ce[E^9(i @<53ULIOK1*"w]Rj&K?ޗkRowSQP"Dd&0@ C EN]" -Ѱ \sf+rNZ4;@\ i}C3HkRWR҄t67AMRui`Q5$4CKgK1Dޱ FހfاӎTLL :1ԂYT 1rJJg5(Įhc@A@S 5k]?Vo.lG|oqpڀ+، ԸwJ.5hvR,o֛C5 IDATUk_Z 2EVDdrٵrY"( A1Ӯ u+W-o}W.N_W 닋jU0Qcmi߻O+ṯ**pU t||6}f{niΩ "P414#9 ɳb#&8.Ŷ9V)~8>;S7=ї'͔hDZb-])`5XХMA9 E!' *ZDg:q .Ol^K9>j5XD{+mQFtPYD4NGr ;)B$2̱Hɘ]3!z4N!,Ŕ72?F|<0KoLC!3YB"v-pxy,7q;Z Uf'.}, Esn$<#(lV`Čx,NJ٢\_oUvRPy0΃G)hS^XDdiཧjևkoϮE#Z'ydZŷ-..@h&&!B&!H ъj^5m'8/_ԍЩbsucd2;;?lne5[bffw+t/JNBtDu 1hQɤkNep2?ؿ{Wfk__M%s8ON&p heUIA1yR b!O: >-bNׂ*8;qKp#'6 [F,9d!t&am##((Y.$#bS0HjCZ;)Ūں6@, oykQtC7@{;޸>U)n5>QMxd4_zPB*I}B @9-ir "ocb30@NvGS,^A/W^`b|pyeEDeD$@艩:~W߶Wy+p]"yO'ġz$@n*j!b|V9x|uS1v4WP7 ))բtP7\')Wxɤ\̊_NGTUuo~&n rId9BNZ&@DPO&e1C ^O>ӽT m5'˵jaXLl]DhhOĠ\S5B$E,A<y&df 5z!.jK yffd1봬vtȗx(a"FRkd7!@wgc=@PЌq0CLj@!(-g0JJ%XosefSsP YĈ>{&n fzX1 g.1f YhqQ;0(٤zCRj倳5}vⴵIC5KTȚV؊qv۴{(MvIAڝmO~ D2xq;O> P3zm42@>mb)G?n6g>]l@ؒJ {^ZNЕmDd@̨2 ͦk{/> *l%,DD:T (a}}*Ӣ(\N̳ê<($nOyv+iC-h 0GV$#1F*H l;]]Օs{{H9W:l.;Mϗj~3/gzVzkfZ)'_l+CXW 劆i'lй6O3Xt"C;hȗ%e9ec n}0:S@"AĨ@dT0%B*8.i%QrARbHj@J@Iː c aJ@Đ1a]Cr020w}ՍvnG,:&(Lv_w8`d B:(G`&]{sK v>gxom-m/[wL 'r[.F,iN_Ze}i4o=f}cD_0Qta\w,t%t[@l]^5OObjW֔$!$~hP-]ۀRL]9vAde^r\ܹs'`w`_?߶ WFtVIZ8p%rNf[0.wrɲ!]\6%vEE9t{r*|e@U {/5%U{ TMT ,+2J/2XoeP;jxc-'1Kr폹{49UwHB4P#T16MƦ)T)[Uujop7iɘMN0sF|18;[2zQ?kI4AQ &{6DhjX$:ɐOI irQP, mj 3$Q"b$ k'!2T4d7Lqһ)~*iSNIU{cQUP}0$ҌJ$YW?'#"e9"(bPǑeP3SMAA@4݆7Ʋ"rof M@yOfpp!L&tw>wϮuΓ !.^jx+x>+'Ԋ Lʒp]kC%[ 1 EyW:$`-C#,@ ]hoDI5qQt̾-'z㏊,Yǝ ua:Ia羾ͫBW+FBKtj+| ;eh ;={е1܃?zF#h)>H!߰I F{(`׺z_e##Z UJz12 "Q^4$F"SG6%l5yBSP"5@ĊDʢVwa7o 7daLGվBc gh6<(bRL6sF!yn +F*zWUq!"Dꋱ)x;]"#&$Grc?0IE5*P=AJ bulN1aujWxߜ៫)=͠Ƀ'Q[+,sn0%&D cȐ!գ`pZOڵ([eEOq0f =aZ@۶)Ko(DZlUE)VAD]zvӞc1djLT2,;&ɬ,6{T H p-LJ{Gw-U/ps)㶫eX+nzU2c+IP#45ޕe9Zuޖ{Wwk_T0%q04eFFtiӗ:h{*I [fҘ`½Fiű _@0`ߩ2y9d\=)~y`< {|QD5OQr3jMB"oۀS؛wo(rϑzXՕc "h)Z>rUelKh`h ̌H"-)X""Jқz7L$dĤ`F R"s7i7}`D/lY  Ɖ2t#45wַ1/ ;>gҵkO]ޘL%7YH,wD`A[qĊd.tRhtuٳ?VK."k4ݏ~s h Tc&UQ5fWݐ22P F":|rݺi.>*9ݮ7ϕj4 ՠ Mé[pWW8w]]<̗6 v" L@FSNԄH coڢ9S  D VkHdKr!*?fX7F|YY6}I vS(f`͊ Ö#Ti!;4^@?5/Oմ+]{ 1JaDliWqw^l}$M0ʔC=j2srHz-}g7tSD9 dhq` *K"05" dA0L@(HBA${R,RΦ̔Ԃ3Bb'nNͲg[sf}V%(}G5!$ j U1ZqSh}2n;02 jt+Z  @Ҁ07_~9-/IxY=9|wt.͢Cpb_g0*]mBPVm[OE#nx \Ⓒ`]QX2R9X &D&r`_9ODQa+ZN|{_f1nW%$l99Rt]YwaS'nۍV㎩rJ%̦ل H;r]Yb긊.&-YuF>NޕOom'cԅnYj^C~QM-k4zC\H4<]i`` [ ]@H,H>|(aj?h*lO!VBx~ވ!)Kd"x/t=+9`jI 2*%fu.5TM3GI ~Ap 5><4Gfna6FW[8po+r9 %^BD)ֆÑ"  GDTXoXֱ~>Ϸ's(⥜?>z}t%@jH[kyh DDfESp+Dy񻟭.^LEnPM:hɩ55]pPWΦVb,eNJv{,6Jԗ;˽rq|Gjֆ(ċ/ۋizUw!PIӢi!jlFCOἬdf4.{/Fcu[1ZM_# 8ۣ_->8?9inL8:UA :5*m#sP&Ͷ]ަ9^'LQm$OZRfmwJsK)D4Ȇt|0˻k\0B@F$2V`F22f :\ Dj 2r6 jE)`np`^bp?Y;D$2MA#0COAdf?@!#4ˎ9AE $D#`v{Q~˿_xhK+|=,ˠf`p!E Bù odϑb"*Z5bīŢtf=n_}cE9a@I\.NAE"&t!SSb:lZNG>yr`u[5" Y]d?ôٴ*:mUNϾ=:O_gDc [&8GZ` 񞫒++I5q."b:&h]Ŧ؂GV$AIs'N0͐9F]i }{|xpуD@ED[] 5~;GBrӬkl9ˆQU\'W  yMO?ǿ+]{po1w2%m./_Z ]JvNDQĄ lWq cq\|@qqj`6$v~.^ͦhmCNJLDg˷LR}&!4pg `+0UU#tp=Mjm=vϩ IDAT͘"SPgP hHA+Q@,ɷLLIL5S`)}3Gݿ{uM{>> H _QzH[4kYQG3ko&nB@bD3 2? [@/go#Ybڻ9==iE " P-0aɀڐh&eaֳtWwU{9?""]h43+#"#;,lԌhl@T$4 cU ("*(}5~=!:5LIRY{ɟ?{O t~Xɫ*:]=8K􃟶,XZk8Lb>|_y/Y<ׅƹjYb6(эt7'(קtu3k_a11BRkY-~r<~sHR:C YƎ4@5e &aJx1/lE(`U5S&dD `kJTL$! ):@: XLńz;7,+0+d?j%2"s#D=O!IRskp3 F[b}֥4b6;}v3Kz[w2c  $` lFMܬC)+3Xhj T-I"\M훟LmK7P Bjelxvzz>gno8lJRn5Ɉ(% 1`e2'7GwwNp/:f׎M4 O]xxwh7+a?=y}L65볪qt۶:s!##umK:y룗w+,e隣33BՏ~ßM,J ??պ!EU5QL {Fڎ΅W(Rg]cy7Uʲ?Ƽ!ޤ#.e}1pnd :,YrPDSF+r?LA w챚DV]"b[{<kmnɅJF7` ;S.V@93Q\(PTa0)$C(i6:yxuvD唦Ooc&<*[w+KoEQ I Y|o}^`4FV_6ع0"qI')D\j\ɢjR8&?;~W??{$1(dOR$obj z~qNxDs 2[;\ xqL:v^]ya2]oVD:*)e&v/MMҹD̚vbTOS =֣DZMyٸYW|o^&]uNWO'[󽙱6<!Q}|I[F.բ %DYo l d#(kdX*#RTӦu`>HNOO׿qƘ"c8?[J"0h1]jZ*/^VTx|og/NpzhWON=9":7l|}~ ~}~sX}έER]@͋  Q>APVoԯWh!]?n+k`; \bi|]FT22l LLQ l]LAI3߸.k^>2HGˊl;yarrV bs|xۂz45FwWMy#+L0 q=ՖUE @gBLWO=|<ڝߞ=H$}_Vgkfb_BF6J;A^QP0&T,S֧Ӊ/~ĚeX.@$ObRNnnݻ}w~`ٍn%+d, MrUuNmK;{'n<UvuC`[<~ULl2c*bŘhI]mGq8G''nzxT!$ o8~yu>qq>߼??OoGZ*3F5@@F̯K׾Y&Hʦe djY5|[eSh3314ou(k{-CF6C;@y^+ހjړ{K..ĝ!T1"(aD]-+i DD4GCXMDp8=tn)؀ ,UѨ;_]K?͑!ֳ 4Sz٪bH0tR~ ֱPrCyuuZ={O>'7nz;~ïݹͫ[="tVaYĦ~Z 57޿J:vմMӭnR *v&+'Ab _zb׋Ԇ䌑urH.}_d&{A6M TFkƓʵ ͚ };RH<oo<.kۨAB"sw lj~qsWu]E`D-\Kw Qk"N }k}Ks-JL鷇tˊ16ixKJR6dP8u*eUv&a] }"Mk/[9 ) VQ{XAQ%0V滻|ߤ;,,oM_Ϊ/vh2m}"(3Ddv~"HLDL(c B,@0vX{:yx v_Lܧbm,1D%"{$uc`TLC%`$dv̜gj B XZ-K__m}<Gʀ їmʢp1JjqW}Ã{|pݏ޻sbu#ޕ.jGay]:Jދzܚ8ѳx|vX- ]i:VӽYɈ u:b:*Ȼ|'zO=0DigTّv]6pmjb!(c^իh~W7nnJ/>?P:'ŶE_Fwİp|:Zn=6վ4Ev1K@Wx_ّyS6!.N'- kC`w.gWE -WЀ T{^ŀN([~z %aFc3 t*0M0hcu՟p7f]\}]Nqo3j0vQUuT2rnm| "dgCA$C蒮^?/%|fnX0 DPr<Mq9Muӟݯ|Wn7pYWkw ɬO}<}ZWu.˲|݀yRdrqzZsƝlv0?`tl"!Oo.51]F_Vd"5M[/z /xiRs:8Vݙir7O}pSxiJaQ~:dA{M>ku8;ٿkpTzlkW]^l,mnuaxL% ]r=KjW؋(2! (3٣%zc8數fWƟJ:@٧9aj`}>f v\BKԣ`Ȁ+b6UȞгg4m25U1&2,FQ { d$,Edf)19Fh^E3"3TĤL-9r~{6 EѱSݚ2uys=RBEGTVD&CV5bCWEr͸8?uI_=wK:yTM  1W#Uf0GDgOfdx7L؉!Lg7yWOV''^u kiҦ6rrr/j].NҊu|qr0b! ʞ<`;_^U{d`1ܘ{xg}fJQR$>٧[]|fBAW̓oOU~|~jIJ]{4N]}|7 ]x9ݕd>j4fݢ*\^d1ø /G3!!bv\tks.܁,o,7["hmJ,CG`̒)*9@0Sm:;vvhM3="a<ѮGU&G˅^7i a^v_;~?fnܺ=`")i2K tEQu]UUE1p23Zsb?z}u:}}W^:;($ke\UmYE9Ahz 壟ݣ;yxwo8&܍3;>=}uvt\+\,I),VM闏>y^.+y"Ÿ@M굵5#"$B Uc+ttp]/'9Q`gΊze0_'X6U9{Űj*9'گ_b,|25:b֡EB*`UQ&9lvx8P/- IdLp{GmwEC'"҅R&eu օ RDEoJ-;)/o+\3m4 /Yf<$c t uرY~=poSKEQj*"yn}ZSÁ`7ݱa $2(gPigy|?~'Gdw>`!Ւc]\Rj91ۅ "p&Rr%QjÓ_mƋ夘5-'fͽ;!tK璂eKQ5^>D`)ucVqs9Of>8yOlo2^b]]Hi?XW˗_rStTxU-=rg0އ8l|A u躶`Ž/<%9??^ D>ΗzpPv!vxWs?:'qgM"1Y>0%K(2Gc)iR*IϻW{~yjgEMTYl1]'5)%@W,S9u0-y96CҨSЉKIэq1-EAթDjjL歕j:. ߿BݵPs/y*Z׹,[Pu1UiY$# 4#h)YݫrE~ o۽nX_9!+a/LN/_\[9/]hoYyׇH&{(kzA>ҁ5~tƶiٚ IDATb]^=/N i\MwZDU@U6ZM, vamJ/n~VIL-ۣCQ9'sRv=_ RTlIW'?3NoMn&R()FQAB^]eYJuJi3) 8CP%܉/[Koo_Tt+/}ش]Dc2:@0dRIIm(O̬i][*uSK$Њ6zXuu55lhRN(ѨO#v]G{SB]IBό`GX Qh634ەJ2cl'rzsav}o ۖn+wLB@܉aE^d]eEXue^[$Ie^ɬx30$Dxܲw)vlI]ވ"弚$ڵ؄]q&Yz<5DnݹQLKOɛ)8!CFF""sq9m>w5CJ]}694p0+_k % BGg_/W c)֎4 i#SrT (ŋU-)` jNBJy]KG13YB&aROTnhAITKl^/;`%zqRDԁ\Tm.><(@޽u07!KQDm/uRޯ.I* $l98l'W>MAd]im)7."0=,eR!sm*BqK,lK!|Љ5n9y$}jCĥhPUHDzqtg}vh#5hGޏff I,Zo7DiK(fI@^W#sG?\֕HB7|ٸ`oRHClBP4D{A.WuK) F m.)X׶)vq\0'"S״1fPSHL@M *)AlY[שK&iCˆX&1Įwc14$%!TtN Ԛv6y,KkuqQ޾q% Q J)I,9F4f z`bҠ ƾ3M kGϭt߶-kf!NriXǧl!ڳZtݗb7].y;i `hf5o&ug{;lY>p+@mI {ES̷n=`h] `PJ&ΖX=nXC02%ҕJI5heL8b?UTPd1Ơc&0i-?՗_L5z;weQYv.sዢ\ofcoEBE;W@eY0HDŽ`  wb3;KcĶkw9IlFR8}n7^>~Gi t-6ڈ> JL3{vK04mXtk4"x75[ՕQdgώA3"hy'vmL;G]gNEkp;f(I UރJ[49%߶mi_߾?O:l4vSFZ#X(ω}vK>δI:B  bN`HA4Ƒ}#jcRb.fծum7&ٴ &0BԄQ%i)IȀ4!lG"46q`7؍PbB [2ŝR !u]SvݬO{7I L0*JD{V**(!"D5dD$@ݨYBw~֨`[ݱ ˽@+\`xm]uA"Wߗv?gD7.y\^}EfԖˎ-eTj*#.7չ?G$Uy;au>T4?.8DnbᎵ *!#/[Dgf1;&qf %m$ ^p8N?}/}tw~O&Y(!d~_c&0#"}@zP&*);Uu1sQsKr]ZNUM,)}ϟ}?*Aؙ"'U Q~|Z.'g׋q]KC,]2%3vHJnyR2æijXrooσ9JJHِ=cF3]J]L]JiDC*IcWb+:6K m ҕ4)";WE2q( zdDU1b%ddsAgҧY@i2 K+J_;&* m b3I29 [ԫ))K mZ]je ]7i.9e&n mG}Î]Z/P% 6uc =af6(b~`kpx-KheSfy""fx%dBȌ L@TR15TG}Vwv7o}7?{N*@P\3!KMN;3/AYSJ9Wb@@F"0c44EQ,1 JQe  >OT,=I)1^D@;K41yx}Mc1BPI"`2%?^T&Lfs4 O<)ʐd7H:Vc )jUd ΁"EYl5%c QdDVs @#Va oh`*˶ #UHR6gLRQ8H&t$E&0A,2e~m[LN/ }LP3вyԐrS)tmDRݰEvQßxK_x_ASUE9ȎWoCܛA z!BfbTQSJf&TMvu R애 4FGGTB\bs&feOf9$&~s@%pICTI fWpuY,+)" qJߞVUEicWI#]lR'Z*'8 2@$Xk)%T#DDUM TNR!R s7)HDD{3$̦u 5ͩNKv LQEc]@FbRB:-UMU5;"|J-s@%wQ3 SKy̶[JC` ;_Aެ `f -̹eNgfJ 8hH2nю ,J<\1S04K~Reb̆dGșh24D)%BG$SbG7aA8M'?xO38_;d>;HD̢JӬp ( B9bE!X)dW^<0{L)#8bV%SG<_e5*dRcdD0VHhh4`&<T-")]`"t?f  pƀ`IcM֍J7^322.cBt[ A$am ;DjjIU6p AHPU%msNoj#6gt8W:4sq"Jy6 1f!͝10!A͗S]{g\nV-;*f h; ))Y pd\ԱפA:G<0]EYPB wܶ@]?KVqp{M7@]ڻ6ҷtvaSS"^o{Yegʿ"WI6"O2+KR]v<Ĕ@""#@35.tUHiɸGhZAԮJېs=~{FEe`Jߨ6#" ɔ:$fnj WY7,1Blඦ4 0"0#!9``,8?*EXYD)|AB"jZGFx-1 Ԑ( .y_QAQ8 ;ly:23&N@D4ZBɞyh 8[kybU "`̓*tjksg٨gf5%0AP@ђ1ƎsjSjF(Gku;֠300!xe?&\8Hz#N)P.d οvq`;&ǶJrb!zCkG*qߴx m#wM.7ymZoIO7nW`wyLkȮ,P T$(U,YB{//xQl!iIױGneXi? !0s%L`ln_pN@XD,˂2 03E%#))jQΖz<*x" @P7-E0D 1.Ũ @11Bg!jvmLALbQ4H  S.JKjb=Sg:*]3sٖAT(RD@S4a&@ fi:r>?_$>DC۝i2d|G} Dij5O4s-E}g&tm*\QKFdfyG/GN`am~ B3^mc{F_Y.L"cWٲ$p[xx".,1'44d$VÊҳrS ~e#|ĩq5[ 'B fVUBD`2)n<f VB$C"+r>( ^^K&G28Tֹ &ۡm)ۨ2vaHź f*놼ZKڦY#.}Ñ -m~vƉ Ō%XsZrLrQ@9hQ-0QH"SI2l})FqlX?n#`弎ҼԯFXH&( Q @M5P~m4KUmX#$1f"3M"rB3Jo}km+~)5AfI aLHBm1Xץ]U붉]&(Xޚ4hI-zCIrMAB5I2zFxx(.1Ւ4uS H C Vw!@uֱPkCvk$it9$a9GS $A !:0ҤpA>H`%4+6zwt੗ ꬏t&8*?!8݆=2jYDp>|!I>a&76ޒ6E k#[-(2szVp~ԇ7Ω=NSj>[r7\իZizxovw[4\Z%eD5n2H$P)djiLTh@5)]ORkqRE$pm1;#!3[K{fJU@>_i_'"eDŽͬXu,ZVui>a:a&a:kUU5U5-5WD !tqpŔ91.>8H'DbH^sˡSDSPAM)8 T_Z5‹a/F+;IͳJcuxkg,7Y"0 ['<c8Q'Qb^.W'GTwe9 99P| 921 JU1u<ūOO?a!6}&/ 7>bg_sЧKêWK닋إ1ہ ֪ 23I!fҊţj^3N/n.ZWmS|pVѲ*\Û-JMQYkZ<<լ4͇np؏n?M]3x >mBp 436HGv0BHLe&Le߿Jn+Cbbuݐ:x`us`gBHhȭis.1]jfq̵.R35Mie6|JhŊ 伷}|p~Xl;}_^[G\&bh#v%Yڎ93c!29"q;>?!ŐIنl!Ę:%6D1q)TR"BZ~~X̵r^.fnͫg HjVk.% :X !irWWה֌dfi~>oooqqZkKڟ|L7wGEf ABFUG{UF MHA@Ճ$$L^Ԁ*͹VbYp=. [(` &QmHiXȬ/n]iʼn_|@HDVXM?/f< kliS3EPܛ֢Bm1-@4"kp6 A&T5,ctb|_)~Dxq-xCܧTSsy=D Fpf~N0ƚiE0z_5Zw 1&;_pA Zt݇7Ͽnч:u䔺HqVŘB!`u$耉 ˣY^MD  -C73_:TWAZkE'b\VcfռZ0VϚUT]b}y($>ZU:Oai&.E_䦦: !nuRensC) TPPɉ(D"3S AL5׌ 1``V;ʎ~)4 A\̙9έZ (BSE2@r5ņg5_^_lɯV+b}V*́p],ZkfE4ftCoݟc5lno3fX ܈ SQQ}^,^L=!?Fucf \Oyhqn6fR0'ӣ}L=ȱkSbٓ*Yk 6&dDB:Zlu72R8m ÇnNh{{}}bX_|6e҆*viDHB솠)f^\\<{b7h1 ^P]f&3.MErkفRJC1 "4cr0vq\ݡ)Wy0oo>w9Z@*ou,Ba^asSz<똭#%4d0P DHn66OX2;8"3E$g/1V !cUՅø\TQbvE=J%QSH'L':BJ~xuoj``T,8 ъ5) pc`{UUmW vHm7)"3 dC@~zV#uk!Yc~{<;hQGx3D̎&B>?zNJ"i{\grCuoYڶx p$# h\9r ȘC53 DP+,BVD`{otv7v wrQkqÐ/6J.nM7}T<#p'Ɉ<9x$aѤ.XԪ:73:\J)B^kuWku"w{=2aP Ҭ6ڬ,Tq*vݻwwwwR+ԙk!GիuDp )a}G/!ۛ?h;ETF LY5N!31&I&5Yf~p:q58&|"֦ӥ}}Li\x i 6iDDlItqQ|!Cy,(pd;{2U񏛷+GSRq{.Bb Q#Ԏ&:#7aUA(Yh"9Vun{w~;} -:EnX߬֗R !1D6ft.EuzN fcǘ jn235D$U@tN``j:;R8&a\Jǘv^Tvx=ܽwi="u4.S]quXV1 2@jow-aIwspb%~9DUib Pk^ HfBVpIAb@cȽH^?J898^^ӺV/^n{uu~x=2xAUy>!I&V8Zb:c .636y{ûwwwqux5u4cL};$$bHՌ%p˜'~lHIڠ̭VRPe_rItl&rW.f( dm ͎9~%e{]9W7KV%Hbw 4RJͰJZd^1&*EB7_wt? #]ǘ)UyZ!DEDXhQ6ie@CFZk%n풖b4oGϕSDrjJDCbMY4M~ok%poy}{&좍'8ݼZ:rt[Ї_s,9CݫiF7(ZI裨e0jfc{S@_=>{6a"Fy[z\]NM} l%vU{\-sr03X"K QHt4Z-¾u'R7t2,[?_JǜdkBtTE`ꃏݏww?>̹bYS0^Mă nXma;sʀDxPOو­eR @Mݵ8l=KРF Uu&~n&fpM]BU yE9iz6xfGQGqsuHNI[ujuyi@K77W777]y˼7 |/ůw>u6zX;(9jR,v}C Bbh ARJ$kUr-yed(B\11BYm1Çw.Aa%k~_mR?|o~n{q\͆CQ 0)-@3?"*Y7ljX\ dXL/ @vPs050u5f ԚŗȹM@-Plc@N^ L(<ɦ~)q1?)hx^;aQCNYbv>쿥Sbޑu 37G3/:~$9Ysxт'j+T*ATD,wL( ֚^Q ygu}n}v}V%m 3r@*vj]݊AǠ-BR`Z qDچQsBA" msnl؈12u`Zp\gǥybT$̇qr)Jt"^^ktyz_pXu0*qyR 5!/"f!9%FR@4'o?p?Vx/ 1jHUD+`it4h2*# `'asY*{)w{ ]cb),,NV]gC0mNCR>R<;xC8HP Z՗i O>i;5|]4u'#=R8LDrAB"gwsg/zrzTRYQ*$$$!YT܄eUT %Pk-Zռ"ܼ~"""3 g?i8L& d"r4Ӭ.^]frӻmvBREفFoo_A˛>X2 Zxx81I}*.U!p_CCOvj^4cka,yv 4Q3p\l%mڂtJ8%Ys={tV-F!0QC=[~8oj!ۤnױ]vPǭnTݳYF0zPйcR*.F!&C,fdJvSëG'V7$QsJչiBQsΪ#3C@EykԐcd@f:jyiWwzL\N( S1:.$ =BTk;ŗFB@Vp!  fټ乶Ε)ԫ:uڗ2j- Rw%" X̬9HB꺮pTɧU! Oׯ.*cɼ2qBë+Ӱn8w)9rU5A,ıjS*Pu덪~q{ j76۬_{P'*"&@Ddhm5bQg٧4ڬ␤nv%8}1p~Wo֧յwa'B#f씾__\f?v Ρ6_L_3޽j`JLf])u<"|x$EaBZ R\0v̻iF  jеcw X5DtyZ1=ox2~Q}>?*֣co/'.Q@zKB"OȏyycțDM0RG{3-#rլ fz\z `G/Tp0~~pй2E}w9pxQ* ap$s$vIdG3.O8Eiժ ݝ({)њAɪi:4u) ́z fPK-pyv׉!_)r+BefZ\*5 &6UkΑs ܋mկ>̥a:l$MBdbC{[GƓEC*Ԕ"9gB7m"3#ySvlߔJWE>x8d.]yFt>eb>gyXSp>A CjT#V6Y"t,Q\BLj7?XCċ/ᢻB"Rk5G ȉ%q9tbLA[qRZ=RԂ#84kiX#0<Ϡ4՚͛Wwq[B"lJ-J<'pP2!&Da`P7:ZU*\pX ײzUACTSj|`-y B{T] _~}Žc)w].6iXيא:RU׊`BƦ-IPDBKqτL [DlKQ眵־4Ğ7_&u7>Q`^}U F<#kA/|P`?r%xTtѯpwaɼm=M{b`fq&;LE9$D PoV}35:UP Јȍ ;p]/}??'Q~/J|"Ёy} U4s~/e<?//ɼ)@1576j嗺9 3:C=~ؾ}S MM bt`1!2TwR5%ϟ8 IDAT8Le03⢨6s 12ArZۿ\BqGfRL5SVjQO2!) Be$PZB5k.n+R*s@u^349#sH]1)*:ebX ſw7.ѡ w;avb@A@)Z[xD/U"ȱgGpfVH]\\xۿ; ":J![uw:|?ɽNÊ (g_8ϫu'.KZfqCwkq=~^tJ2fʤ"lK(Я_o8K:e%eӆb(xФ$g؏nO'iO>q<9WUfd>ozvOBrH#xf}azΆ_*"9.k kG:# ǻjsp0.2l$%ϗ$nFbEb`drBfz'0Le)ߚ1UFsRfw1" dWtwQnOc)Vs$!TĠZ]$-ǀYHÅ\qJÕUV̪jV zel&Z̼#cN$׿ュ/.WnXw(hEJB')YmJL`Ԁaɪ8cQۏsUG!CZ^jq!m6w_~Z F,K$!J^߮混ӏB[' U 5`\Wk-aⱼ^ɻ U1!pϫe7_8~[h&=03fPH~) JnW q%\ gFQXLıL؋ѧ.>:%cIIG+AIK<'[LG;4Eo1@&v>ƑDa2uleMCpurlP:jBSܨ\Jmnip c&niUc1# 幌䦥TU?۴uޗÄ?.`LhJZ]Ihr7 1 ЎHbKt~C`!IRl6ݐPD^}~bn,s:$GzR]'¼enS͕d3 RVzH~}YfBdn^?@[Fεݑ ͠:@H9f%jz }ᐁ **!(Dgtds&$F@p&DGOm>!9\O{jL~)pmy.z`fH e ĈETQCDsـܽRd|Fw,l(5,jsUUbAdG@bERdE@N-4UjS9`[g߲^hGH6o9#S\S=u IT&ŏ*WGl+!)e/qpAugSYչC7VGq FmI;Y.Db檕Ș7G/ץ0Vk s&pA& H̬IJs1?̈mN5uY9yjE2ČൎYw݆d03G"g@eҒ!.)v68<6춇vBJH!D 1fFD\s9W GtuS<$ao )^JXH2(0#U`YhXsD`77b1ZbIq$^VfҪ\XHbG1 @ P̈&тZ]WtWGK$2?\' <[JJS>80 a-:lZVn^mtriN}Q"a1Rd"2 "eSfa|cJzo0뗻}WO|uha߮{pѼ]=So̝gY/W/Yo}Pv_V]<աBS*ϜS1#.g?O?gvZT5j9-3sӊh)BD":DOK ȳ3zjӸ   |8'rF2cɖ$2xyR TQH"f0" @Ĵ@,DV(A L T@ƀέꘗKU=̶ C0Mt*< $|Z8x)u%B?*` xSwrաtӺO S;p Yy'=H`V&L+ (%r윙"8!s0AЬmOj@Dz\ucQeJL7q_j# m "1\b}n61&4%@3!E@HҼ1YՒi$0Ef8lTs@cX ;̀ѲϋXİĘv@sɃƧO~统|W=J \b1k>Bq+ /f8m۶)b{)1x_?woo7[DtlMH)6)X2ImK)S8E1kܷʰ-EҀ96d{;\C삀H5SeS v2# Z,h@C+BX4M3*af4o18 ]K%yzwH^~/]1HT籈bFlSohzx[U1j辩r, ?NkvqNIHDĦ"QE)PJ=7>~CUPT>aJFVT:*47q<;<3Dh *13s%RhF6dBXD i)e%ف [ӄjLc(w}:=ɇ]8"HNg4A U"cƓ BIf` !zٌЇvq3 1MH{vWaO/_~K;I;Zo6>V )u-6KCwW~\3|IvDڶ1D0`pmk[Z yhD^D`Ӓ \Gnq x"2y$cA]C)d1`EyCƹjψs;OF8c33#<&t]-? _?>z"M.ܲ_Ƽ`A$#c %tу /5Ƀ Ǐξ\.+!htݿІa\]_795U|_=2J{[busNUɡ*X*"ȓdCS2ksD-E886DF hLa6_3aB2*aXSطvHYuT N)3z(E,PMbI@ ,iIvM]Uޛa6_,N0P/O,*IؔY>7?pq QwFIZ3Q` ~=ض.߰OVo_?ګw}˻aK *kb-S<uc<>:9 *+iZ(""WSIT3"U*=,xQpR$3ޣZEyrh'dj?pj \ "s~zB$ۉַRfLl5D@r! -9C<7H&*B1ˤM=X03hvϟ_^^^T('gRdbfbRM8@Dl*qqз  4M`/HOqn/~x&0ƭJ.)&Q"E#TJo/nVbjF7ѩa$:殁~Sh!kZChBgfgW06n}ו!rZ Ն%2w," ~tWWޣ]_8{|&ۇ}ݏ_w|\7ew݌|ꪨgdknחuyL9b vZ,炞e1qHLDRqƵX*۽6u ks@jX?*R3QMP+ $#G4#-Z(r02!4'^vFLWL'@\#@b-JB9!=sqߠ^'H#HFV9\HC k*M}!=Q^˼a8 %"pfc3Ȁ P{F`bGv%~Īe:MU '20k=ԩ*!JQ  f)Z մ1D33@&vQy)اU 1Nƹe 9lWOpXXEp\cFۮCQ!ZJMBp"O{#e% * %[z꺙o/n~wPWuKu=1ɸߵh4j!HljB"S[_?;$ԌDx[`44]ݣ7#_\*kdLcRCiPlfA#W/[r/kk7ڨ.(dbi#NR R#Ѫ+v]-86pwe:&i.I!Si&-u |#4[";{ot:O|4dfYp557{2D@C A 3vuͫg_>O>iͭ^Ay ec)C4iPī4lT1%: agYcGc8Cb&V# H, 9< ^HTYqں8u[L(rrJ'5'ӹ".kZg|owtubEqVUƓAfB3"MFW ru80D`*HȫWN#B@Te #FB 4"9bژ97a6?CLj;OZT^hI1}p]D E`E+Y=Xq^ۡ]\Ki/T3;r)9gm[$!du| T! M)pZhi&wy#Pj3mPX_q>uj =<[O~X2[?~xj̥µsC{?NIp؃s"Pϵ~.y?C&YV"D޻&8In`"D~72s9WRz8>O~u9_=5?^>o}=26zT62dP1G$3-h☊:[czi W{^]39_p^`ngnl q 6je˄[AmİQ3YC))+zzPND::|ZON#igވ9h8EoH_v<>q.=NB;x7{C*)A}ؕ<D iJe[#v:""%DЎކVncbHs·g(zH`vLDpҫ”Ȏk sΞ#Tь\9kfg]sɳ8/(8>|߾wb,B}?yϺÇC"" <1qn7vGM*M"^[349??#_4E;n؀l~C~Qj[>稫Fx͌~Մ54AuLޓCݩ|D7_buyG;QL?p*w2O]-2Z,tN<3ewhDT :ߪ$E\zu0E-Mj70NVknœ)3H-)ٻ \1{j>]hGB]?/7Ͼjf>g:j]Z;b9g3=??ED$_Bp.4 8bWa2"!3\=Dg}A0#G%3 ot<VѡDi{SWPcxooo۶$U 爼sADK !Y4P nl֝|Q&cB`y+ߞ-[4s j^f5ҾX_,>cT[@+pƌ ᓮ)"* gĜn &vn;ʆI-k$XJFv6/௒F4{aSJGͺ&+CUOT7a.*NNo y LjV= [azxq}f/5ӗpѵ~~kzO7?o~'YT;3y-߻޷A bٙYԃ/ 8BvZAlq=~]WGfŲB;<#nju))֏.dzg[V9_nJ,kRgdF4}ӟCs[ggx C8;Я̂N Bjj j}p*]kW{ɉKa+9vT|r[bjDDjz-q9Iu6|+wo_G}te`J},XvIao4vǩܛqYId'n䬃L |jFbZ]^1$өkM9\M*"TUS)Ru:UQQU9盦ef5Ms*"_g%& UC5U)} ac.řsN5YoØK6})4$"G=a ci0֎$?=1ǬϾ</?|ru!<8 \wP02F5A'ڍy›ZJ&@-7"90sVgCM q̥0<\^ݼ|}:@f|SQ |79Q'O>i/|׋JYՇ~:d-EEN촌D*[sP މ 8!Gp[;ASM UR4RM+uEKѴ|T7iEJt|sְA"߇eX: S%Av j4! IS*iea̳$fCj Gd4ejDcIԂ@TfDPEJ*0WԖRp1N* )$pHSLjȉ b& US#9dFŔb 糮ga܎%&F/~?l٤}rՏ~_}TL>_4MSR~^CH@7;DTKrBR"u|*pY6V+q(ѻF6]L8$ryywjdPaZ/:YmZS+]+9lpC;\C|y)w> W7rg_ꃋ%ff5  B j j H1cEdR4;<Ӿ[mѢ"texBpv M;@إeQɠ`c:h[oFzY)K #b5A(w]uhq8~"B n$51Ț6cBUjd6jSYw~Z=~n~.;ۏe(o/G/^]/.눅6 R:{4v_9~cS(5}v9]ahj(ŶR_ e#FWjDŐH~& xX*Ǘ R=Io NX턳U'&hE S='22x4r Bj:y(btESIwRmXFߛS ’4: ^sriF ^}kh Q%*j"␪x~,Jr9'Rv`z2WHHD"EU&D}p>4aeꨢ; /tp7qSbT,¾=;w_vռdń#i E !4uf:WWWҸkC`a9!!1lkb0ma88"cXr?}uf׶M4)&!rFb&v{缪 ADtA*Zr)hѺ8ԽK=1#Qvm;U-*ι|u!2\"9"h%crDUc{h„LcއN@1m&x!x~ۆrZT$SЄ$!P)qz)D},9Pbtd3aR V `w뇮  [SiQ!E"xJ9~OZyQ`7 !ߠBv@Q>6fW_@q鞐#0t'a]+l,2:-^&!m';*`@GȀݘ|Y>V{,04!u!2Q\J.u~~Nx4N@_2T1_߿~7W]Ro }WQj6O1.RJxJK]}3SιrT%߼yb˒RKښ) . u} `yKmUMcoJ)Cߛbt!<\JQBe98R E$ǿD=r:`1IN<|[J)c"n7pkMvHֽ{xx8l)HXXQDIVUð;TTq$HLaG,͔w}믴OyIg(A%Soξ5\#,ont㹡;;%'bT֬)?Xd<"o8n`_⦝k>M}xFm^ B?   6U26}&xA*Z[HBY [kᤛegt DM }WA"YoM\k!+X5uule)xYte-Ϛ!0aWU~wvC-K!?>}HtOwWSOax7ÛR7| xe} ]`>,4MDt8>}4x|ǮCt:T/fVJiVZkYcHK>k-Rk܆JB@j QBm5ua mV0fI~_zWGm0e|5,\miCPi\v]F !H"Rxe<55&N̼,KkeY @[ZK"shOo/~?O1U: ugr:mBL ^AA̘[QU'GS#`@Y[HVwjthy$ėwmrOV+Gg(6նv_i_bXl(~;6V>֨&5yϓGfg~ : #3>+{\#3ZsZm-VeU[kլ.^LĄq ^ХY؅z]zy>}<}ju7w^*y^HvwM{^Ģ g|~<]eiRs,?ZjwÛ!FT[Y[c$Bbw!\e? ru!".?M?MjJ2RXd-j4RJ4i)-^U%$RCbԟ1eէ6mK!祴Rz|z\90^.^D\=suDD,5NO<1RɅB̵2.K織Z!zKf !ƍCI,b!b)`h]Zk|wDBJ,!1%rn$pdz̀ĝ`]:!*"Ud3<Wi'VAI7VtjU *&?nzձXA)=?$0xi||퀞'6^8nP.!l -~j:Vl5cm[d"V[KU6qAeܴ0#4JkimZ[+.@ܟRJ-i#fP\ۯ"ZsI/2дݿ{eCHQqxBO\ZǏ?U ^ָV[?͘a9_.Nhx 놔 OO.ubw<왨Ւ%PJ{x㕙])u0DƢ M-܌̧o3+q7 $%>x^| 2^eYiաE$8N C/yUncÚhMqy4?>~:ϭ*!ZYXptWF(%)(Z[oLi{"<1FFbVI`%bVB؜[ n dV  eH+Q*B@%2|U1gC_`/3ּ@ћyXи i+.d>{֖k=q} ՇtFik<~'& ֹ*}9= DD˰X"IDD!PC"8DwŒcM1)%^MxQt]5t`'1w.?鲿{?Vix#0t-/L:js@ִv߿bB"S17ղ.v]:bj%q,O"ɢ|ZQH-,ժʹo$ʹՊ%Z]׳0t]DŽ$8t="zgL"G]i:K)WAZm}!&L1͛OWsi^=@jm"r\.牙Si3jSs2CpU"ZkE\hKJ)5Rka-]<Z뒁x;_˼h)]%W:/K\.J!Ԭ+nLĶz"x" 0" "NL@!$jHԐȐW_Co|Dht>+(ş;J~?A埑gu)A4UF"6NT[ODUM!(XAL U1Y5(EQSShJ%k+  p:jl~6"&Zf*4m6FDFMDR=BL}7%$oԢ$1q$EkrLsZզ$t@RuU?Xk$[Đbd^P^ǡ$Jy8ytth]R ]xi~R7^.>}JQCXe%K.R%"@ !Ĩ4) ZZ[7ð5 yZ Y4TyZ!d$iH<"VIXMOS-mߗ\y~S)u'ke7PKY.S`,822 \өQ TkVpLAZ+J`Zs-K-5黴BlZ5_nOӥR]lh -u\%>w"cH!Ddb@! U% r 9W? ߤ@+@l3TDGM ؐF<U4tt|B2DhlVyZuktEn m@6:!}gLWADH_Ιm vPrݓ֋kk.6jsjȩp_7XW]wL$@&|+ < ys%D2US'| gwjes>k,d`ʹ ZU; ç t#Kခl7o޼y۷_5aB0Ǽ%/eT[!VGjZ{;"Rz7oi'@)u&3"nio6kOK8 S^=WӼDWJɹRs^{އm@['iZkH[~ERJOsnCc/pH !<>>=>>20t<^S^b"֐)i?}b_l}: V$;.vK1F<}rGlaEH1!mz:ydcL1 i$%  r.zPU Rr P]Mi%W86/spn3?sN1sJZf 12Nx@"L)~2M[a.q @@c$&@kAZWڳc"~}?~fv'bpR"f2Mhj-]W >}zJ}:)lQ[iVJ'exֽԫᥗ`g*ԱveF>VK?7 $ܓj]5kVp-*lM .Cj7bVn8YZfz\]hlM(I0gdu,A 7q N7S,K9eyrUсv?$> Ոf[-_(!лCU_s[_q|}aFZܤD(Վh! W#j`\J׫u?R KC  l_&]B]׹)J[@RL U#aUb-7\K "eS*<#cL)9%k=r6J+ߍ#mM9ό&*#CR0鍥5mkE)H pps5PkW0Z\QuO*{4Md3+9\R)x8c}?2S):29Lk:|9/433[?[[Lr`cۅQVÆiϑy11W_OO!uZu]jZ[3U  a\i55)2_g]wd#T0g~gʛֶi/e/BZԧîwxs80 "^ A[)2⛯G3\|uc1&_6s;7v|?i'lm$-O~$F9˿UHZsrOOO6l IDAT5 NO#rl<<6@ysǧgv z~)5FX]\hN[Enk3}BXc5fRt'6U]]5iSTk+dϔC],)fsY L\y ; :ZesyK6ߵ;l1<̛tyj%BZveu1O)Bu|>===ϧZK|>%ޭaVrҚ _0ZlC nP 05qH2e~#K Ɋ,Rkxx¾+].$Z=KZ)5t{$tāC6*(K)vֆ28[~ЦOwZ)eYy"גy.n(FDÛ7op{>K))acBr\޽}w~;OK(@A m ^s%6}^${?W1>m}ճ5Ot qHs,7D`̥qmއ]7@/Xoik[8m _閸Y}:8mP}N\Wf ]<Tms Ķctu_ 5φt>>"bDBH) +sd!RrˆQc1 CRTDզm` pι Hl.N,xljXxQ)9>bLTT.sK^?N1ys;cDEd- YJf C?L<{sT!vWi7jVju,yEe,cpo8u"81p7ׂ$upSxgs9o@"N]'!K 4PmcY4/g091ׯvbLaH!RrAP6ͳbDR+1&>x}3i/dDK1x_DmuU|&{K5 5xž!l/f .ùϩ>/# ͠պr^ܫ5!D&B@=?9aע̥@Ֆu) r}63ի"# 6(1T֐JmE\ ..v)D!FR ژQ$0E΋"֖VR*4H;En S$LZ ~H1Q]NO 8*S(Kmw}:ww\FBq@%>}Nވ0Hם!檥]?DY1u>b\Ki^o|4xOeK+rܴ9Z !|9%׮2S(hma˼*]$*w5W->}XeR$:Nb`Ux@Vj+bZUZUF ,e#VZpe˘c sFF R,%ԬK- b c$,0R%q<.djUO1Oc]}J~zwrB )A We *_MLWߧzn.i+tRz!fVC5vf'(VF`h  bV/v?՟!R? u1FfaUEWZ^'bЉBTc3q}m[πX]eTk="l! KJ];@88&Rrke<(&%/kf IHmh59糺֢("R[=_.p\) ! ZuuB@cbDT"oIbLp88DMDwwR ZDlz  =1y[Z*aN1VVU335ĉy~6/EDR:{Ǻε;me%/ oXW1ijUAK.t7X[wBJSmJ`ƫ;>1][Bt9.1/1Lݤ@lk}۾B9e_uE@ DO?„٨m+tALU3`QcWfEoQ?h_+Vu6.G+UOω,DY ~tPO3`Kj\#%0"okMD5hOOO!ZI% )~KjXX\iป[\+Rku;//S4e.%WݿT/)@4/`DK^J)őMȾ:|zz@ǰj,!H|Cת/'Uup!37^]؉"6SwMՈ;,:n<÷l9gM.ˢVS%0= 8Mp@a6コRLo]8H+|瀺=:Aإ`7 ҉H˙!I9+f~ !8c#"(,|9_իor>bJi Bd"#;%Bb~AE~v?<qZ,S2Kobo7z[̞_l MOfEtM\]5.$W̺ DRRyC`jVK^fer~2y~ՒK.t7ISL f?zn2wݖ t|nws5uMDV,ztt7|NR4겔ZycXP"/t>8.#KT$mx52@q&-sܔ`UO[Ru`5hΗFtz\,L,|}a7b%p 7"'8}S謨u@b`vUэ`W`Z=hwnHce/[of" #Bc4B"lPUzt!v>-9jUůBcAYIDDI6`z=ӊVu U^v]bHK;D2NjP󲠁 hys!2~~i󼜟O_{R|߼ys8:$}ݜ|>O}Mӥr5lr̈q=.ۭ1e}\-BpM@vj8 bL!t'յD||jeB^ZJ~ @l3N "t!y5 ED+WG[<ϥdoUMm)ǻ;D,@[/OZea'rk63"6/L7~DRKJ&()Kp:-mڳMF:ж~2'-῿Պf>z* 0z$3ԚfNbq[߭fL7ƿ?}5yX66 b#YLKHZm׹vS+9g$֕|+VDaF @stk6O5$|xz}}_=@MsYyt5ga}4yy^jbe#-e9/)%`)~o\`g4$ֲvOSu3fD$Ӽ4ӧV2zu?#"HҊ_ A߻ T1)2Ř!"5U'xE֔Zi,7Ŕ i͎; 8ͣڊ0]}&CXUnp1ez%}Ӵ, pAwa>c:Udy=?". 8ROǏ1ҴhZiaNxxuODVo­~Dsn$S|Vw} v^z(<{Oyu$韬 ̜Z&mSmZe>ҥEq"\JiKə<^0mA1 dSJ9x[$"A~L[1.<>>ֺt(Si1 Am !>֚:@]ֻ@lݻ#Jι$CC ("Q!k 6H)eЖEum>J)qպ6py*8R~KF,0-Mڍq;{=WD#  5I21;|o?}}{qӚ(5R 0'DV tf:b^6Xׇ ݎh6Sh.OP )-~8 fMqLośI*dfnv\a; 33ea`ʈȴåm xd͟ȉv1Qz;>]VCXN=VEn6n[„YGumEz A9.CNk ƫuD4k+"vQ`) HUhqd{bu˔k0Gf,p'tzq>iꫯҬ%vº٧?Wջlݪ/}6bIJ7cJZR55Ȫif`КlDtr/D.ZkZBuZJ1[GAJ9jd{-Ls*6Ј;nf]hƳ 90!CUCqO0nnHBmLp8"Ax<޿st8 w?_t>,mYWSQLF8K~}zo, q5f@v%3,4L IDATo~ n4rDOkGӇ-HF<9}<d:6y[{W5o^>nG(Pp} gPٸG;lKH[meAhiO_xշ~rrx$m<A|T[e?$1ϭ(ð 7KOUOh׸oU|(4BaVB`V^z[-T4[Gp}#ܾJY2i7/;B$ gI0, $;N[`s2F!j}?LPD!8ϳ9`Xz1ګAmj˥{W%!c$MeJ?^Sx:$)DHֵm]X,76swK V˔sJׯ^^EOC .dS> _Ⱥ_ھm'*D H C.GwFaok7e8 ES`X=D9 1#r)%vN$9u4MMDN i:!<@D̖eaj,7oBce:|e-ݫWz5t9 \;3r^IXU+4|9[!.ܝOu#2t8| 11ʊO-L3RJqn0Qw0N(Ff&TX8M޽[j+#%͆?q-˲I⁴eVlޙѳYK1E콏*"ֆuk]Cs Tks3 @mZ<_W^%pGYyYkNvE__m}a|)7_~?\ yY$F;y;M6 +7x1= M%/ o8ΰ>̘̹I @=e cbnei CW!m ic"փt{s(sV1 433!]PEץډ0aT캿6܅^DkK%ʉI)vcEum}B,4xSjCUD)@ sNxjTW_rh+m{\|4rSHl;18[ѱ+(t<;Тswu<aw΂"歩RJ9߽^}[@rv`CtSDt÷r_>ݻw'>H|M4tBIPfѓ!oA)~s0~cS["{99p-IF`ؑ# imZkԺ3$YI( g2ru@,%w:9`9gk=j :{ nt3sC" NdM9$"]]+XF_B@``eJ\D&4tHf}EkL9qJ@`)zqpn.*)ږ,'d]zJt>8NkKqf{:.PWEGTkkIo9Ҏrx4M_u[T #u]C)2{z,MQO\x8Մ*kc̒HX-m]*R/LM-IR(ĦpSE㞈\OLRJ"8%2t:_KMץֵaS"={7^ץ p8Tq4HݺP\W(u]Z5sm>ގcݽkmQ2xnnvzo:c6?SB T8%JYH9R.6Lg^@!Mc9tsYՙuL2 ]u/jWE'tu]˺.Ws}mQ Y(.9I¡bfSIEKm".B\X8|ןvUAYץӲ\650px^cdo\a14Pc`8{럤A &crGE؇hTNzB¼ST'„̌S Gnms=v 4"s_rX g/gftR~AԊb$$с$# sZ nqU,d,ɦuC3G%!.t0"0Kn40M%猝y.fNfU+^̨CֻNtdPudu3@jRU-m,r)%ݝgw콇|,OŋRz]޼y{N$dC8SDRpƛԬYPDI1t1BxF'#4dFDw 9 [kz]FDЦL4 pJɬZH$A 4(M"PdfGh81f7e6Dݴ*co;AWta`Pz[L9@M=:{}uX /|>?o?w~|UyzY4 7Jżi|C5S!TQa=[zCx-:6<H)J9\%'g   aX}c3oLͶFJ yfO88f9jcĴL!k$aF< 4J4 bBr)e!^>Ljm1Qhf@B&{ ZC݈:4J)2Of J޸*k]!A!̃1G:4,l1 1~DДdP Y8D$Lw֗RR'!qW1Qn96xE -aҀ 1%l4"%eIҔJ*S9=&ӝGcDeJ )D|K(:0y G%ɥ,= C3Ќ{ #ec6\:{; ZktCāf&T̖0ŋWh[HWMyF7SMLm]qDLI/^|[39{2U~JCDQ71o!z'BiǪp>_%^Lڴ~7! ZyJQÑ΄3Q:O Ǒ*2n5A$\$ewh81dĆAD׶,pw^,=q`mw­bD3 PNdum?v$%rN:parN` Fpw?f_ZWf{y>2믗O~?].P8յJt6k(7ŃGm]8w0E=I>> \Egj|̘)M/S.1kouݤ!s$0Kw(8,^i$\DR*9OLbؼ͚6`nU@LgIH,KJ UىH[W V뵷ͥo»oY$ KRE9Z뱦 Fڤn1$E, hAE\ꝙ$"9I _ZZu5"ƑC;a\oʞFv]x`{x{n9a#$,%NIYX( tRJF.#U{ 4l^dN<6 =,+V1O7ɫC;qAzjAR-(D 2!'!Ax2Zkk1s׮ڏ#2$M穔 k|)O;1O<mݻmuN]ko-ު[FYˊTc+$i*"tuJ,xzֳ{( 7N a@ DD)L51Iy*P#lӧ^$ >E>#/6# -@EmHknɄ[jRJ1 ֵjLTFpeo#(:8qʇ"'G^ERJ(+e4@D/oc#AYҘ!Ru3}k]_~pmqY \޽_JnØ%)`[R ^EġƤ`ؚJkS}x %fOD4͹A,U>y1"C2MhnjFH"2k!oF$"m=ҞMrM4 LcH=aP#4Ndf,c]"\K s·8BR9!s2%Fu/_}w_|!Ns0ʘfV=b??y9憼_c~ G_~+2Ea ɻD8F2 wEWAODˆ1rT0JV>.LG! a&JL) Aވ͵(2d>}l \#koiWPu&JRd$vnȆ,KFV޻uUKpYm͐I;1HF&ifk͔PfꀑH^:͓^/9[]NC{3>f 8LnX a:Ύ4!|8Զ"X.4' 8RhZy%&\ \ҁ)kru[~u% xL]) 唦<$Oa45pGĩ$NL좐8$12ddQ`GЈ(djaFn-O9e),Ō941o(g^ͪ 0L$s,$)@nkM; Jf&pj^ݜ3A"FNLY2!C I$Bn@)129!Q8եxvY; o JR[wLvmRz_}tБ́|`.x:6D@!!'񙄋oDl[3n=tz"#p08UֺvU"ļ{ܰ7ѪD8.D !k gkȼU?#WA•hԵV]b:z}4w@@wMDFD6.:21s ֊pJe4EY;~RbI9 Jpwq jwua&ևuY]8@eSPʌĽ)2!9lA6޵K2/ϖ{wo?)u k1f{o} md$\rx%Z_?OPu37o|3Fo!z657j? nP3`X;a]0  5ƍ067 mSwYTMvmjw\޲ ɷ4KwmaDwt`׷Y)RYkպ #E0&@pS"`8{r9% 4D>JxkʣWsMRHn"h߾[Wt#VM(#QowqINH0p3J9\ݛ˗iT~^S9duu$r򮔩Ls(w;j,G#{ڣĔXƲi^R24r]kg,B)%bb)0M` %"-)3W5rhuZ׺Ժ\/VU^R$NY4<$LLȒ$ g0pxĮfaC-ERT,RG LO b#$1f\/׾ָY0tw>?XO~;~0IMjo/micĵm7؍P ƄҾz IDATiM7m ~fhˆ T97B[[kkwsStw p_C%@G/30@tyӈpP!Cdvkx&L=,Ѣ532ACUJ"ܱEN:26t<GTCԪujut-KS~^ ApC]kAzY6$rk Et:iUmn#1MSk㻷.XJ>a:Ob몭d( 63!4~l|· NI5$u?3Y#Cwz^օYU͡wOzk- ?YaPBzt"7e)R )u@D@`6S-Q7@SF )` pYDT"mU0bMG"LT Y_u׮5Sb/np8\BrCMJ CL뺢{H..[ e{ݺ֏OωpudC 4%3X{^mlQctus0 B}cL!şS^&|~*l:y)m2] Qogo쟺%YC&1ڳol[9l]).{fDf$9ҘV0$ġK)iH%3F6au.׋Z<VH$FIeT$C|eD1S1f̔K?q,-G*1K?G!Ljqbct8Rʒw/``2o_o;\D5F\X EXS_F9|#f?~T=9vOI;Q $oh5Aҋ w6C.cBuZO@8Z@D@߳Yukۄx6&eq ?KK"XY$~$= 0I2^;Bp>!5˹bou]ZI̤vy|0G TھH2pI%w7yֵVLHR\pgI1Of"PU%I7y8j ئ1 cΉRH0DgPsSɥD{JSVXQbaxhͼZ[5Db8sv y){jn8 1;abFadȃnceHcrDc@#D,9#LbxAX*i ŹǘJfŗhNq%$O"#0 gBt0'hi5C_|۷p:uwK%# 5 y[/vR?Q~)>ru`&w9h|:_ݪc܎W33kb^Tg+O$R۸mimcު[w3 zct0#U򻎅K˹\|;D>x!2p`=mHҌ`OdMWDR1}WO~w޽{.;zS(qg‘z[7)󚿱ǿa?F]zx #ܜQ؝i Sʒ 3AbkӪ:iKlР8zc#3Ғ]UZwe!̌019"Q"Fu]C1p}:*2 ZsU&tS퍑Rǒ7H>uX{Ws,lnH8T&s굶Jz]Ό"<\[[ā T%l HX{QwkE %pnhFnz]\;"˥kO6"VU4\&TW_WueT;hS.'faۂH_|2D2DĜDjRk>FP:XwkW͚{GrTnݵi[u-#s&b$a sJ 9ukZ;32:Z][=vkŻ[(AGjoZ3@\#7-Ǒ852s߄NJe~pyg>G'o)F 40L`Έ!,ڨ(MX=f_GkΣ(AnF &yi<}$m?Ã12e_ 7?>PT0 QuG&;jSE:&7V{ :z. ಏ(M7Sծ/ > 6rDdd".$dЬ^[c8h.!`f6a.$a2D޵Km?yhEL =L`0u]/DDM;1bNZ%^d= ML7)0>SfRDvŧ 2 =q}C !CN%"5S5pql+FۃCy`hש1BIgc-;PhzDW<-,DH6>Fu]eZ/n=/};x}O͟||xfYZkkwb! 4R\'f# 01߃$Mq,8<}3 ߷<1$#wV b0dVQHJ94)֫6f 9f;斘ރBT҂ִހ(˔$3DDs(DeMda$ѳEQ[41 a.^ VvSJ9xAc1RY#C5H&0nCEM#F3rC=,#OEUIXPّb:g>x# Yc{vlS6MA3"~j__u_ڿOgɁ[4̒aѥ+clO?aOtCƟO`6|H@"(CT{ E7j{}|3>y2=٧_DVTVʔR|v1!m<>Pp%l}mÀrF DPk7 ֨mW@9Z;D)%MSJOu%!? J!ўx/e,Ld1J)zZUTx>hRp3 ,ޛyDO6<` IRɹEz'˒o?2{z^@JZ%> B$e AѢf G(h![ %$Lwu{NVfS5@ zzj=7s?-$)ʀҼ,9 ?2Q3|Ќ휜 nzlҼL[CplZ叵nNm㙄27ɑS,b, 7 bV@Xx^chQ궻5F|z/ڪhKҬђ~+Wo[߹,oʪ]N_4@/R[S53cn[ay@_A_N"QSu&f2v{~~nOv*>eTQ|*,־yq)KNڮQ͹P& #E C!~{ Q,9"?4֓CmaM)s-i^KR.=˺.x&Uէ~hD #.\3LJmď#" )a,5BXS7eYAs^뒳teRJ E.cJK.(<ܟ2@7d)?BONpRMV#*8܍> N/nmzC*v2L퀎GfcuBu;mx@An-/lf>ݼE F0sRV ܤ{kZE8t纇u^ʲ5%&]| %-~_Տ^ވfb$\$%wr -)RRuSJYaaݽ9ԿSm)ṔT~w{/C:DR(~Q+$'{Kp;ޡhÑgOIf5N!(O@Q7o-8A!wʯ4.e$tE4bv$F_xOo/UIU",Kﷷ?Oß>=ݬeY~T0h±W_OSW>UI%)٣YQ 3abϷw[YU_8Q919+4fE='HV"Ee ҼZtع s1qCkcxPNEoI!ݪ qK䍼yN,$VnrNA=?P, csv˲>K$I!#v (kzq4s&^ʒ2>|}`2$)7huT:3a3(:Mf%NbqzEq!})"GIŞ#+f#/-˒{;)$GNPQDp7ۑNи*$=W9sk! $֌ɺhPSluy8:R0 &aw>므Dj,E%_ּYm!ruv^2e}^_ow KJ \'[W`!տowE䜷m̒J*LFaNȂ!0M\U#+EV }ڬWV~|xS^mߚ"=u,v~3L~bi-JYTӶ݉h]0Zs5u-+9BLnFukͪB`nͨȪ9remKYUKE&!&"=p]L9-tVzaRaD I 7(ICE %fєAfvƀ\^yDG#7o`{״0ڼ )w20+4fTKY6I@5jSNʚBԉ j$D$" zH4eɂ}HY# QN}OsEr"ba oU\ϏL ۶?źar{+_>OozF*<7zGl w\!g=?r9O~"IQ/4H}x,Hx(Ve}ϷVPMe]/ BhP̈>AB޾%SIi|, 8H=jkwɓ8t̜;\в2ph=6֩9=\zVM"bP?asVTD?ߞouR\du0i۶y|sJ9-KRecJ :Zk{;|0rF8H sJHA^á#CE%UU? H%H49%щZ9; wd( `=6c5=w& 8@ 9&nV6237B{;"j26NׅJBIIi. ~)y: Fgvt MV1Z..S<5au]Q৔mW~~|APN0h᭶ ,IcwZp飽_M2Q :CK Ѵ'E$ wl5|ououx%\ErrS1dVnBjуv:հ7<%=O)F݈p4QF-Ǫ,׬I]w=1"Ud'&;@" ]V)<%%oOOO̵z^#}xѹ޹1R4hd!]hލjQkݞgZ!8,*v"*Fj A) }f[0 $'7?3`" IDATcsV%c ";ZGJ?AQ'V?N^zܠ1G}ך?Wh ,0aVnP˻Z3`a('VW -cD,HC ? ]^vŝ CDf'|wk^eћ˯_?7u)yiKIY|-+KrNN>/ح*o&ƿ%s8r}&hbF'vk͢9 r* "Oz%쭥$q}$dqtT9/RpN#=f&NVDs^:r̻~d),ZGOÖ՚B$ψµت*}K^s)=5 _%hkͼ%G d>Uk9JIP^vh#܍뾛!0[PY >3FZCH >x|(ijر{ ,RAd(uhVG!BPkC4Ū=\i; =0*Zm~o$T駕V4(%(TFMu<. 5V/Z#wgFRU9(+*g 7df1c&q7e{23Q0(L)S3߯SɉZѯmOI/ǚC)}Gw\Anjz2 T ǐ\RJ[5a[Sx3\xm&:k3oV< R{kٰ݂ɉ% g; ~!J/U2Z97X co4axmrdFfRx7( %(T|A, buj%vxrvi x̄S?hRr2F97G9~$N#ZE脋圯kI?=?=%KO>y??ß_YO> 3D'ʯ3*՟SyM$ u {}!QU"J>/9Z%E~yЬQ=\]Q [)^:Z;eTN]iսT=N&#X9W !Dj̘HEʲKƁsFGTrI)(-ܭEIQFHʥPm!0%]R)qPpK!<0Ǝf $嵬jlrI$ե,[m }%8mVk=fІ* `fdБ4@')86Z zuVR8$ؙ0fpSk X$Qh"&͚KPdMi'KUM0UE̛!M+kH^K^ ?<~.Kk 'Ck,cXZZd-O/}KO>޿{޽,o>]?> )k G4ȟ4#|qUtk_̈T13K\h*)-9ќJeMLrf ?܀27x/dcK#W3G&D*Na-Zr%2:&RV ;XkaYC*I˲ H純jnx.v_8ZkP\rk ¬fsNEZO:S4缮뺮5""5%Zj oxRBQ{EF,8OGk=`YP 0 zF|Q栳YU;B,*YIYA't&xzE=GP!Fz42AC7yuSa3rƓH⢇x:-K0UbLI0K)lQwwok_?~cD~6ͣ(Х?$} 9rCR>H;:&}hLQS]IR2@.YHUe]Zk0u~~ΊSU.%*R^e]!.mV[Pl ڗeef$l'+e ᥬ%H2s Ey`fض 2"Z5笒R5^9?RZGAf6pHUâ֬;güN,/x;KSA%]AqB&1]P C5nUU;I (Tafim7hwZ4q%1q8g2 }Ց/g\sG۾ oID$$*4iZ?|t}Oտ|Uqc=t`bE ~-- Iܛk5K䍍fT[|܁ 'hc98s,"|j0&lB朴(gliRrI??E3՜)/ɉa<K^a6̪NfQ]<NawShRItHgfkA!)U˪y ͚е/Z`rjabͪ sk6BC( #PL0VǶN $U cwehn 5QaNDJ$d#TFF6ffuo1H']]JJ?|Oo/FRMdAVѐLB# v^ ^pG6 `~ANz8Qa>>‘0f- Z(EB=ptz.wAaSpBN)-e=N]6ԥJkt:4Ј-:w*]QJ)*"a֜me{w۶;Z+\Hsbfu}@̥t۠N*,cWrẃj{ݑa>"\MXBD|Z.y@9cډpV) Ny=V]rKG4lJp$ Ř֝"dƦz@򤣚5| +>`oFN jEYЁ:<#7EgXDr}33MI%_Ss◾mͿ?_p]^J Tw'HE%B$#]K*IS{!4'jY(t_q.=A>{ifLkfZ9ƬZJd,4nG ?CiHvbdZb2|,_(&J%,벪#9%hխ su߫Pɉͭ%ܥamvGa솪j֗e),NS)d}o*GU=(f@A);y#0ՄAljZkmQ֔R4)1LKR3G8J) )gyk_Ώlžl@:Mfh݂~q$r@O7ϙAè&?a@ DDϓ  ІBPmh odN^E*\]].2z 3i_UP)yYƢ<>R;}^/e Q"W="?BD9=ْ- w^)H83%&aJG{`y̓Kb(/٣4gl"iޙb-Pҥֶ{Δ%fON6$ɍlf%|bN-wIDZL)>ѼDiBcTŽP{¼_]YRjvf~6UFWqZ3v%+waCZ$jVjh{4~RJ*9d  ⎔"B8&̬"C3]?9 mo{=}>;"NA 1IIs9B=g4fC77/vh"FS!)~zBΏЙw~Ɵ:bأKվ?bgV06m(4BC5"[ZDcM8cSأq%]ĠI>$rL $EžmwsZdYSzÒR*Keo޿7~˼ǿwz|||w7{U)M1y FHke"JW"GڨKcA~,SU'C{PX"ا)9BN"{ 'f_wn*%3D:RHZ82DF]<]!ѓDq+32 4 p>>3Mfvݾm{IgLk;J󒔑Z˲֌{)3͌'∨AdAU`?Fsw\-𲊒p^uajNpԗʥ=޵Ĝ #a\ 1Hd+8r96]o}ws"gĈ18hgB9R1kO\͎{/':yBD$\UIR` +}d7U*r9RJ9v~-K?ɛO߾7~g?oG|gVabsp!Y% 1{?46: F0!3/щx8ziԣsobdM$6*~ԡߙ3s eu_xcRHgzR\?Fu&vwZô %$~dPHNSi%ĵmyX.IPAqak939' 0n"mǑ G(?"}H,A]).i@͛ZjkYsͫG oGkf[1x-F#sEO*˲ۜaLyBF s"98ܓPhlc8_ۙ]K'vz!9k;;fvg"^jમԂls9Xb\<x.I" )Kzu${b0sJslo۷^O>.EEh-g~og^/;y&q7̑4dP>Z}w+~ Yq'9,1\;"]Fcм$U U0JD*,,v,DH$yF.XO.Y˺{UL 1#xNED³:tZCύ3 B(0^ k¡-ADQRV !)Y>tTxʡ%PKGEsH,;e^JIZr΢jf)j9Ubf^RNə-E5lUS 'L2>3<!("Bg\cfܕN{t Llu{@I9,h" 77]("C9*gn :!@x!zD9^<)8U .e1r̰U@l@m*9*vV,#¬Vj5%Q{w21g$VRi\o{"㛧Ov'_7o_o?B\wZ%; dCJ$&%l8 R(Z &M4G[Y5"f-*Ul̬mH31 fFswym.@_kZ?G&I܃Yk:߰C:TM$$H$)WswG֣:`zTꞤaydD$O_z35R AJ^+W{YiL]1a8Zk9l缌!s ~3#}B֨G(?|:0#TGx~nѠyޞp#9Ԝ/ͼH<{NfcFxD`~wGr=^e|ɏϾƖ\!8o/mx"Wzy?HҺuBR/P{USj ilANNjF2$9Wѣ?PQb}AvT+qzB\D5ԒPgv;3%g)Gpk-211YBK0;(0!m^ڐ;?XͥJND8{uU!v{N/&"-ܽVSQVfS?o)lxy&R9F2zQ<~txF }VqO̩sf2Ɗc*4#Blqy1Gi>}⧦5OH+dIHxdU2Ź8xgTR☖&bK>/gT9~^Ӣ~JoѿWG\cS ϝ]-)cwh@CG!&8 vxT֘et}BQ~xxbTBUQp' IDATaV@j03מ'G#þ0u#Nf Pse KΘ2w=e2A;uRsn~4nI$EfI9 f.E`kތpӘN<RϋYGg8v ?̱oRh=DZ[D5^w]Bqj0ʎJa֬5pAy0t _ypPc<'\N1Ć]Cgz%֔00C*UhfeN$zww6Nֈ)c:Gžau۩Y4'%=8R"}#ݾG_N9}w{.Y3?ƻRnnda'($J^4X1O%Λq`TC? )%%j{kfmG;c;u&^!k'}F~B_QFI` f;K`Ay};rv{~=?+qoNE3;3FJ"Aѱm7 {j̉^i\IUn>'"5sm۽%Վw"%Gqzm[#uhGim4gYwGn?^{YsUrmV%%)Y0/I5l{~~x|?owoM ;C3>rfʇrw$L)?)s\qKMHB*p&.IJʽUr} Xhg"X0< JV3ՉXfp0,uOL~6@yجDjIU"VK)W*r6뜙w H𨙛 OX{L'^Ҥ)sʋJ,Ij|3;2>zE~b롮E$M*`zɪ%-\.`V3=Q'.j=V2EDn՝Ghc3jJoRZ-\XJ`KlM̚Rkܥg`8[Pv<۶Y̓όQꂬng9+3hsV,K<5 x% C"dMr&¾YaW53;/#LR֣abE?dOt{utII*y:OU Ixt.9&*5qc3T!Dj1!m5&rrf~b/4lgXƘaXk "80jCf>9B䈌Ng"j-iwj'w4baN,tz."(Z7V.lz|~P?Q ʗגס}m M\Y޶ o7p\>|ir>O{ 2&o !D ¥hdn{X)L,N~5aʭ5sӏi۶]Wfnp5߿wSJvsIݟ,DD8 lHL8IZiUZ+岊Hm MEŌWp,|mIg<^8,X#P@@'"XH͜ݹO4R_9q8PNΣ. /a/Ciϸj|Rk7{AIC\+d(PPp$@ 4lc;FHIuG+{Ś(k#NVxe_;h0HA5z&N7к;|imʻ2dl$/ײ**~p0j/YSDD } an*.x^%TbQgo=r &) 3jmSR !+Q )LJԑ{$,%5C$(Z)PW\"KS]<~e-lg^"VOB\RAjݫ{ꢍĴq}%s#jN"WH~rYb^K)7m4Ԓm*ݡsV jkTi VmmVwG)XjM^RJN*iߣ-"Zu:;}GX̭G3c˚ Xk{,M%x{A`Ms 3ꤪk(wΆSOi􎉕Y݈Sx :͘o(DKȽ9$)b3 }(<)S&bHI!,yRs; *r4-CNOZugrx+6̃;NdޥALd=%pUؑRqѢ@JK*i `?oV9B8R뾽ݞSJ~~ab*%%֪ۉFfQE{.cGX39pA69䣱Dp烙-3EhxL.I} П7^NU#$ ""Bbt-6!BdtoY9O׀Yk ҽLUkmN#Y8zF\)#9Ib ݎ)]Wkk̂SD KP {j߬;v}=DS.)j^}ŲS!Btu'fRcAݏW'3`H@iKs:_\JYG h Z}~~޶$uǐ9yADq s#98G$|8:x "Tūyk֪[t%#s.Y{#;z@Q =7:g@WоiҪ-O5i>xXn=km!ߗ18p4":,9^ |'7^-{򒎔<:-Xۤ#x%5b&r9䎦EtdcoC. ^J$=%Xc3,r-tseIAn ~b9h#&jأDBD.? qpe&`,!.Ǐ>?>ueS3 BJp렔^noǡ},`”d,kAc PvX~A֎YRz6fMDtQ5+|ζmc7o>|||̜v0ؘŏGqH)'윏$ܩ;ѣa*Mv`Rp'N|ϺWSH['t ?)JӉ0Uo>!.L PDt* kyp.­^.KT"avfaMY2.Q;$an8 s 1l=;4y_`l}`14Xx3c9Nf +]rF'Bʪ~vx5miGQ{f>0"9qjfmNMD:oP5 'U.KRݪ ΰh3y$T`ᵒ^<(ZCdY5FR ,fZ=OVP Fֈ{)޿J@0z# ""v䎘^|]RYrJ}۰@)wV@2ڈ))4aBs!t1gbԜO;QҀ-5!8>3сs5@ }CI$O-X ı*0 3#iTq:SJUK዗ ~TC_teZzNNjUU!~`zҾI7y۟+\SJJkI+yP f:G R|4Epɶ=l3oa8VeU,݋?}R"aX4 a3MHDH$" y!T9/=-/%1maERa tLDʈƳn"nA{wjG06<е}SJ!Z#v,yYG!ǡKJy^ͧt"/˲{kv,e PY,fݝ܉aaMr.)KF(j6ѣH/_{x09?cy}A6H/wnaAkwijΥ>=).]SgDF| WGywύ۹ V@DgPUJrԆG*EX C{&4/ 1bLi($%|5Pf@>5Hjq*#bg"_rӶvo[=a 8}^TI>NRf止:ᶋd; $"b7w**M?*+ B>ƈ8Bl qP=+fuK,cK#DIU@B<;AR7`)Tku'ږeema/5IqZ%?R f IuQ]ȂDv5nKw @)`PIax.dNT>Oulfei#s?CC aO7,xB!!I t:x9_Y:^L0u %ÿZg)?[C{A=KuhB╫yD! 0iRI@NJpk{9N@;Kf3]I$"bݙ9`&*KN֪Yc қӂ7@4"#eod5ldDy+Q Euݒ$9r4#iң芦 k;Օхdְm.篪23sUKjZ_jaҿ=-pot+{ϝ/A|F垖aZnec G :EqǃSZz;!jbu]?;sPP?/rθiU7:%0?9?3K)=T5"uxӟBD=Nyݍ{{8֓\--?' )d ^D {2Ht萭7ͧw'yd>3AsQ7P JnS2Ju`rPxt`ru@m-UA.F” cĐDHM0)VX\qs/,}y!vE%Wg%8%VVށ&6 j܃q|߾[=VVYj-RWw&otԇiUƤF2qVc'Q3.oG{-Rս#QJ )% @@J 3=kWE dp{ށ>cG74bwSbE`ULJHnر+(r^jMx∀&d-b4QiA{? l&EٔT DDjQ-Iv1=)$#{j<!84B8&I Ï5}"fG!vU)X=+ 51tc3΃F@%9@ Lt1I|i6LjET:cRxi]CYEDT 5UcZ`&~H7|sQ<@g!VfZDy8ỷ+"")Kjղy71ThWJG8Jo{kef䲚R(/"]Ui$˓{tq / 3vd2k+qj1GUfQFRAK.;W>m!T q^/u}IQy˸ҩڕv=x38jKקmn5Zv[0|e7$w@LF^ kvW&o)bǔ&" ~AhCd_r RX?G\ @?ff*5\AINy%cBn\NL[T7."PvV Zq~r+?o@TfH D+u=2(c֒S<3P7 tW_))s#fE\ {FTQ=Ҿ%ңS5נkSa%'(/R @f>"<_"~i% tE8P@0%y14Q~lrxGpj-QH>$0f~܇HH<™4!<g쫑$-cT=|AͿ)Jvn9ui Fh ,~{7V^j5sL~b*6zwѫ,#e$#DJ0GIܵ<_ٸ< tXA_1-Jֈ;k`;9lL[gwٞDbIgPqqyď_j/ӇY7Ǝ-WfyĐYz z;:HgGkDRya;9iIMfŋb͙HJg3#̲ʛ<`/:ʉ%kG !>F-nCIK&oŠKU,tE]Fp=k 9⥸nR]cxT&"l[ ʆ/[8 0B=)"8xwUe)<RK=(JVLmLEe Irly'9>./ s* Li`ӄ(-G|aO]Mz0 £e[DDV-cT(W{&yVHJ< 33xM4"Cħ Tå),y P(b) u]un]Ҹc~KLVM`̺ZqfīYu2^b0g<|Z,pC)U^YYE`fK*"uDnRǖ400D2l>/+ewҳ}l&!v{aeYڄk >7cƧDO%3v6|`~ s/m*LEtod#^r5fTG=gsojj8?y6ܯ e IDATY֝lܤ#Y*X-٧'f;fu:Q I“VpGp7c Chljt9LWOl?Wf>2䩬 3.t졢bRl([ENGo}ӽo@/Y-7ʾܗ*\\D'X%&y*)Jx\1O?W{٭orW6];CH Bd@01#rLAPP" KLXV&E!ʷ.c;y6wծy({|u描)y"j„y乒mWb:e!((D ؒ0£A\Ͽ#(dޕ(jMSW+I80'ǵ'8z`9"ܽcx{p2:[jb\8Y)"2Ѥ4'xX`eZ,aԗ!i"fܜ8P`p^Ŗ2E)EUR),F\׵X@0h̔ίtf3Y#rzfQQU y+LoN&+9}fۆݩ1>-(4 ax]`ja7:]O С'̈́ gADy & XLX%`RC~x~-~^q W "q-IbUՄ rj;cW*llvF0S6pwȡ2/E߮bƖDJE\jY!¥X-]}K?$$qї HnVs6J"\TEv)pT({x!:XSΡͺ爔;t'C"-F~DDldIK΃)CsFGh1ru9;YI6Bвc]|OiʹY`uj{Xݗ"6G[Y:*0N#R$ޚ Ob.bϳ]~%~-.Fz1Kg,?t Cq3b!LG6040;bv=د^~CϿQO B:alS(2MYP"0.1ؘERՔIMKPz!(@Li"SӊnbYGLw%ƣe֐e椘"@Tf)`Va(ZzyS&ze!/a%Ay@@ȶٖAɡx=qR̢҅IL* G!w+b߷_#"nVZscҝ iWfVjf2Ĕh{$m:\M;f")\ j{Fff`Z6#B!vW%u؜phnK.;K<1):8~>s_iȓ@;76oieX cH^HcyNu~ MK7GF ^o%]t4MKeqUǘ%vn45kϯò slpbߋ@w 6ESrXˬD]TGlْ9y&o4] @՝nq#o%`w8{92帛Lޮ~^<:HLpFo.JY16Geֺk.H&%ύH&P;{kNL>ItZ53L [sxzYrHZY ".Hó̻GΞh$H|0M˸ (3ӫe HCO =: Ƞbi|- oozfS?(֞A2`ľۊ{P^Wqf.^7}OMUx,eƛ u-(uȗ _ "|ۚ'KfeWrVq=}T8ͼda:7ØL( DL=8s4#ϐ hJeބsU0VXD}}!b >yNǻ>:aٚzM 70+E$ffM0jI5R6k"-I(@֔Eܸ֭z[BUMJQ "gDͺ@'rG< uHD{CR$n0\f}#c<3f:׻В>eK 2C@DŽ2- ?brao^Y(_G1xs[rq5!lƦ]@Aál}v3R')+cCV#yCJ[ 8;_83j |xC} {'cHb|[^IENDB`thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/integration/test_pngcrush.py000066400000000000000000000007161452244666700340360ustar00rootroot00000000000000import os.path from tornado.testing import gen_test from thumbor_plugins.test_helpers.engine import EngineCase class PNGCrush(EngineCase): optimizer = "thumbor_plugins.optimizers.pngcrush" fixtures_path = os.path.join(os.path.dirname(__file__), "imgs") @gen_test async def test_pngcrush(self): result = await self.http_client.fetch(self.get_url("/unsafe/bug.png")) self.assert_result_smaller_than_original(result, "bug.png") thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/unit/000077500000000000000000000000001452244666700272245ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/unit/__init__.py000066400000000000000000000000001452244666700313230ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/unit/test_pngcrush.py000066400000000000000000000043731452244666700324750ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license # Copyright (c) 2011 globo.com thumbor@googlegroups.com from shutil import which from unittest import TestCase, mock from thumbor.config import Config from thumbor.context import Context, RequestParameters from thumbor.utils import EXTENSION from thumbor_plugins.optimizers.pngcrush import Optimizer class PNGCrushOptimizerTest(TestCase): def setUp(self): self.os_path_isfile_patcher = mock.patch("os.path.isfile") self.os_access_patcher = mock.patch("os.access") self.mock_os_path_isfile = self.os_path_isfile_patcher.start() self.mock_os_access = self.os_access_patcher.start() def tearDown(self): self.os_path_isfile_patcher.stop() self.mock_os_access.stop() def get_context(self): conf = Config() conf.PNGCRUSH_PATH = "/usr/bin/pngcrush" ctx = Context(config=conf) ctx.request = RequestParameters() return ctx def test_should_not_run_if_binary_missing(self): self.mock_os_path_isfile.return_value = False optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".png", "")) def test_should_not_run_if_binary_not_executable(self): self.mock_os_access.return_value = False optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".png", "")) def test_should_run_only_for_png(self): optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".jpg", "")) def test_should_run_for_png(self): optimizer = Optimizer(self.get_context()) self.assertTrue(optimizer.should_run(".png", "")) @mock.patch("subprocess.call") @mock.patch("PIL.Image.open") def test_should_run_mozjpeg_binary(self, pil_image_mock, subprocess_call_mock): optimizer = Optimizer(self.get_context()) optimizer.optimize(None, "input_file", "output_file") subprocess_call_mock.assert_called_with( "/usr/bin/pngcrush -reduce -q input_file output_file", shell=True, stdin=mock.ANY, ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/000077500000000000000000000000001452244666700251075ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/CHANGELOG.md000066400000000000000000000022361452244666700267230ustar00rootroot00000000000000# Changelog ## [0.1.3](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-pngquant-v0.1.2...thumbor-plugins-pngquant-v0.1.3) (2023-11-04) ### Bug Fixes * replace images with unknown authors ([#71](https://github.com/thumbor/thumbor-plugins/issues/71)) ([5914c9a](https://github.com/thumbor/thumbor-plugins/commit/5914c9a8671ba094dfd471bfcea3236e74ab5d5f)) ### [0.1.2](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-pngquant-v0.1.1...thumbor-plugins-pngquant-v0.1.2) (2022-02-22) ### Bug Fixes * Improve package description ([b1dc8ce](https://github.com/thumbor/thumbor-plugins/commit/b1dc8ce2958ea0fd08d64a776fbe4972844e1247)) ### [0.1.1](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-pngquant-v0.1.0...thumbor-plugins-pngquant-v0.1.1) (2022-02-13) ### Bug Fixes * trigger release ([#50](https://github.com/thumbor/thumbor-plugins/issues/50)) ([a76f637](https://github.com/thumbor/thumbor-plugins/commit/a76f637ff14c326cb0d7987948a974ba807e83ff)) ## 0.1.0 (2022-02-13) ### Bug Fixes * set initial version ([7df5544](https://github.com/thumbor/thumbor-plugins/commit/7df5544d5c372c05549c1ada1dab294af23c6fcf)) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/__init__.py000066400000000000000000000030431452244666700272200ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license import os import subprocess import thumbor_plugins.optimizers.pngquant.config # noqa from thumbor.optimizers import BaseOptimizer from thumbor.utils import logger class Optimizer(BaseOptimizer): def __init__(self, context): super(Optimizer, self).__init__(context) self.runnable = True self.pngquant_path = self.context.config.PNGQUANT_PATH self.pngquant_quality = self.context.config.PNGQUANT_QUALITY or "65-80" self.pngquant_speed = self.context.config.PNGQUANT_SPEED or "3" if not ( os.path.isfile(self.pngquant_path) and os.access(self.pngquant_path, os.X_OK) ): logger.error( "ERROR pnqquant path '{0}' is not accessible".format(self.pngquant_path) ) self.runnable = False def should_run(self, image_extension, buffer): return "png" in image_extension and self.runnable def optimize(self, buffer, input_file, output_file): command = "cat %s | %s --speed %s --quality=%s - > %s" % ( input_file, self.pngquant_path, self.pngquant_speed, self.pngquant_quality, output_file, ) with open(os.devnull) as null: logger.debug("[PNGQUANT] running: " + command) subprocess.call(command, shell=True, stdin=null) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/config.py000066400000000000000000000006141452244666700267270ustar00rootroot00000000000000from thumbor.config import Config Config.define( "PNGQUANT_PATH", "/usr/bin/pngquant", "Path for the pngquant binary", "Optimizers" ) Config.define( "PNGQUANT_QUALITY", "65-80", "Optimization level for pngquant ([0..100]-[0..100])", "Optimizers", ) Config.define( "PNGQUANT_SPEED", "1", "Optimization speed for pngquant 1-11, 1 is slowest", "Optimizers", ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/setup.py000066400000000000000000000026041452244666700266230ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- from setuptools import setup setup( name="thumbor-plugins-pngquant", version="0.1.3", keywords="thumbor optimizers pngquant", author="Guilherme Souza", author_email="guilherme@souza.tech", url="https://github.com/thumbor/thumbor-plugins", license="MIT", description="Thumbor optimizer to run pngquant", long_description=""" Available Configs: - PNGQUANT_PATH - PNGQUANT_QUALITY - PNGQUANT_SPEED This package is part of the thumbor-plugins repository. For more information, visit: https://github.com/thumbor/thumbor-plugins """, classifiers=[ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Multimedia :: Graphics :: Presentation", ], packages=[ "thumbor_plugins.optimizers.pngquant", ], package_dir={ "thumbor_plugins.optimizers.pngquant": ".", }, ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/000077500000000000000000000000001452244666700262515ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/__init__.py000066400000000000000000000000001452244666700303500ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/docker/000077500000000000000000000000001452244666700275205ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/docker/Dockerfile000066400000000000000000000001731452244666700315130ustar00rootroot00000000000000FROM python:3.9-slim WORKDIR /app RUN apt-get update -y && \ apt-get install -y \ pngquant &&\ apt-get clean thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/integration/000077500000000000000000000000001452244666700305745ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/integration/__init__.py000066400000000000000000000000001452244666700326730ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/integration/imgs/000077500000000000000000000000001452244666700315335ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/integration/imgs/bug.png000066400000000000000000004607321452244666700330320ustar00rootroot00000000000000PNG  IHDR,brzTXtRaw profile type exifxmPm!):*ݵn9õn (fN%%/B..;ʴwp Q4Z  U4*6={ZW##/kT2ViT8Nyv~.NeW"i "VdMS{LefIۭз&/;kEUFh\'mzTXtRaw profile type iptcxmAn0D>E``fp$Rw]*ԿiA'ϯ}Tǁvu2t"~F^gO*-#/_. u'tW!\L,5Os8!1tG9(19JP=P e-hwLY*>(mےh-v"~{}yRoTBRpiCCPICC profilex}=HPO[R*vQP]8*BZu0y4iHR\ׂ?Ug]\AIEJ/)}wT+e ![a>c\b>')x=uRxwߟիM8 xxf9GXIRω' #e8̈IGbJJ Marcelo Jorge Vieira Marcelo Jorge Vieira CC-BY bug +bKGD pHYs  tIME XRa IDATxĽі#I,fx3fMGzvg3=w$:J&n  l ɶp,FG _ F"` <$@@CI#MREm״-MIu]?_~]_?~=u]_sJ*1H"A2b8H:~82s$"4IfEId$Vu Af~?dD$ /$ADpH D$½.$L9\\kֲmK2""i{dbM98϶ \zk)_Okx][`o^^1"c 摙df8̑#G23Lj"bo9E8?x#8#3iܥEۖ)i%<&fS}Y?x>Y#'????~ |$g`"8B8#ICR_%T,¥\Kˆ 6,dQ_ք  IQlsP@>0 Ľ}{ؒ24O`˖YZZk]|5y}=5לrq?ME""X1Yc1RJ"b $QaADp܁A$ Agd2āl`wF|FtvY_Ecus0 /O?; mwӁ 6`2ڠ )[ЪThzΚsVMy\UҪUVYꅾA͂"A`DxdLiFW;X6`7V@;eŽ'P7t~:,"d[,vSMؤ`VM@ĸ+DpUv PeWRIq ϧω__~>ׯfQe1\k"2:"`S+(E Z\|j2Aaea5 ᾒSٺ ԀKGҮ7Tr>B4ms@6E%J\kiκz>ח窩kyxVa ^$; q#̊ 12C*i̡S*$m(mI F؀`,~'+"$U_$>!vd-2؀7E"bǒW׹HtÏ^[S?CVa@@0u9__sM]U婪kZ5VYrHYB FlKe#dF0s$wPv~$bWe[8{tW>x "Jd9謙0!a/#l \ CƑ3H XP-.yV⯧&K<kb./y rxN>uFC1Q`^DE";Eݩ,Wy.SZKsZkt1ll @XpqmEIhKIK;EcjKHq{R;ʰz#W]UZKka.\+F(0Gxg YfLU$3""i3G($fDȊH1 @"#" A@yq0>LƑlb Uy^EuPZu9 ޙhT" l6ɲva UF ^uk͹Zbpk~^e`?dgxS dy8f޶C}0:"kM+AGܒa\5)~U}]Zsi UXUUU\K,AD"h%BLʮV6""q0& @DFXdn2EU&.ΪAF1Y>G*OcMкagY &ZZ[@D5L+dˌf9rgW 7=/fqәa"hsp+嬎 Te*Q*e,,|*UaTX)KUXmQɴ<}^Ifccqy8u2Ff82<>Hrq쌲w fΚY*U*ZkDB7l]/G{l~߀iZEဏo*9eVe*gz| EZ95\U ___55WkZ^*NfZ\ER" 79-%0@7Z-%9G!Ã]5翥62-mK &cOr߸|?މ^p.wIf:*QUcu<83sΩu12k~ؔkCj9pDD)Y*bDF$KpiTb |*<Ϧ23F|e/ڬp4ۄE4o eIpx_f6[,s4gRS*55ūQ2V-J\jTP3 4ARA b`pdqq8cqs㈈cnN ޢ6̖wzXK`Dq0@fwD!:n`G=\J" 6 6SOW.M^|XhҰ#aKFGm}(|8[s9s<#qkǯX95 a 91΁"Q>Z B8#OD81 #31 "a[z6|Pg[/>7q%0z242]Ft5, ^5לe\ sYxT\%L>ku*ZT 5lcP1?jDDqGc4T=>#3)0IƷ+֦vXUϚ OUusת*YUQ>DTvN*<$6d!5AHAиemwp`-$YΥgRLKeT _|N]/UZu\sV-X*F1 NdjJ=͘W+ 8!'+f0PwkHvns5uM^0aMw@f{e0= AjU%d`mxqeܥڍ"#)"]Bmn鈗X !F4A ],n٫DIT "B04ZS8:~Mjw[ kle( xG 85gsգ9+G1 Ou}Ik r!K ,I`X֤Fr$#5q1Ȉ#q~8ȣ)c<_}V[Zu MC$n[]$1':zUم>4p-yzΫE*_^i.G,m4Rk֪*%h"wGU /O/oh?8>>sG~oTj,C&Cªãj5Ɯ99gQUuŜYUeMDx&Վϒ,S$|h_펋،wOD<8ӵ/̦TV%תU~κ_\b%-!9e1wjSHhaD`氱U6h2n _Cn;ZE 8x7I1vÝ&ba\I▬} 7kئ`.|5o[9*̝ ಆ_VUfUeSqq>8cH cWL?qGcD[U_ c01 ;7cAiM-v(o uKxԷlͼ)P&.hgWU(UKxcƨ>r^m#nysX[LgX9?>>>q|~qkd/.:ߙwIXm]K%mZrU\HXk!ZZK, w&vN*,WTDh[_骶<h$:эQ gIŹU9/r\KZHS3δa2" G2DE:JÔ@rOe WhnI1 ;\*jn7"ֱߺR{a;^/y Ja `lk@覓7Tl}V÷!4 5m}Bʣ|slj1NaD" yqhmUF9v= d"a˰^V܌}nܱwi[ 0-l o .cs׵5k)gaWa)*X0E$.i fD hi3FhY8?<yt{n MQ}9Y"$\N5<8ڎ_Ӭn۰-+Aۏv$igXk5tUNxULT^/ y{2QȄPc^.@)$KZp X{P^$7GV6},L+۫w<Է;o^i߄4m/(Ƭ1F39TUc@b嶬9gbZق.2s7/199>qn*$@Fc 2#[N.qG NV9 J@CkGv)Aňm etL"qGKќKS31FmIDHt]m7'ٳ16ote^; w}*%ВgյZs%/b.Pj n iunk/k88x?|~yydr1$"7TuҠ'F KX(BD83uΓk䀫&Hڛs4̊*mQcwdfl8T [:ÚKU57 K'iۻ~ziK2dQw#x{(.rtHjgH?N]C8rKt-펛R"s;H`|Q 8up!ݽĠ:o醻|9T&5tc:IkuņR95*\O"GOyGv:v0ˌ~F\ GGa1<l>3`K Hᖛh?\]<_=wA]U=?^ ݳn1",/U۬Tz/f1VH[E6]j|7wvDdK xog;m=?"300?onF`z?,!) `! PPFG8nc *&wÛ"z_ 6Z;nnCVodvYLWrK=CETIg4Uki9@&\h+Ao |u\X& 8yJ̎ؼk,,tf+0clưrIrOS`v ý64q4zv7 ͒[#Jp[ C꤬ɘ"ӎ;_-DIzPAEHG6HF 7kJF.A|Wysc8ggKqq#bgzU`XpЏ<92p |y<>7Ww#1]"6FbZp+$>;Q=S'6nTjݤ(w}3U#ZJptw.o@HEklHxqlܹ_Jދc8Czɦ!o_Ek mqS)=]`5眫@EHVB,,8*PdW[onV98?h:9>1F>lj#p@$@ǽTg1&}A}diQ)8'bphk4(x6yKP/bmjiW.y/ */A-^= L$*@jׂɻZ' 3*,iV!Iq[=&!NU}G4 g; xy{B]Vhu/t36f7jm{{}}ߤW>ڴnOI00QT]Ks QJEK'Yitp`$|ǏǏ qvԼtAc] Ѿj%ޙDM C3o/mru'ې%zCQ<7l(]#rUOYzg[o'7 "z,F3zaoÛ :8;,lAd 讄lꢺtOJql3558%ܭggĐ#r0d"ǝ^\8k*QTRkV-|[',^suCO2@FB=tO !,aPbtt!` 5<??o?>||q1yxtE 6עx]f@v;ȧC{ 3U&C !";W@.U3~?:,%im淙tذ`Дd2mr]& Vw &+!"qWn @|YZkH_juюQ$ AJac%gPY"yۂ%NzU}rHЋƲ li=:Y3AHanvϫ%V6uśjnPAO*T18=+T8yϏϿ=>~|<q|#8H;}i?+? $0w3|0!a [őa:TBRy_\J]q;:EXQn]-U8g޷in9ƺP NXv^B R"˩nW}UXP `Xj.zS$a\7 |Y_mL6niil GM.xO,(@ߺ jn@ 4jpG#*4no]NBgslp[c9B:pz|BFUJ: ,dF2Fםu:B{J^>9Oh{i9cOB-ԂZZOkSm}gGog =Q0vܳtĘb-1#މH#qrgoQP虴|8~|q RGhA$M߃*/91#) 2p *KZGA )nWba&V߷V{y61QI{w6Fd}˛dlkeN _ $J #aM-ːm6sΛ= QnſB7COEDwXqM9^B{F|ܳD3"꺛.## gq~7;T6۰)ÀA(pd8Zpg,CU ,Gag6ݮ0|ӷ-a~_-}ck5n!MZ5WbȺh Qy{^Nvjo MJ\E=*038F?~s?<ǁ#qb Po}WoO{$07ڜCmLP!QcTU՞/Wj'#{&-[Jl&Kܔ|#j_7 =į[c96oM-1FtRoo" ݹۦ@`Ndb õv\wپ͵5UD-jSn3Qu\NMIk^VYMlԞqܣ=X3sGd<?|sks2) JzPlZ#$# Y+2}A*r}W!z*S Y)-`oztw{ 9EvQV2M|'ޗGYMmϸg{teFY{g-3T7Vme]vѹԓdF.ؗnW@0%Zm>B=d88FmV ۣgvFa%8"3+ck|sVu7&/v/.eƈm.81qdPPp\Ukr׆߇. F*]p7@eޝ7o[ꞚJYH--3ҵLaeNRHGU:,HiQs2/xлBr$&M^i?Xޕw%О2E-Rzsu?H' dp s#iX(gy_A&z)HbnSiP ا/IQeB?K s֛V䈔<" !Q gٝl^̣|ɖ[ Ҋi1f =h涷y*MvV x,BMq3܅7 hb0d#T^ ʀjk'g$d2%){};FAH?Jᒢ,/_߿޾Oi4i$[-9V]jzzz@JFX  ֌S-bQBH{2GJ^EDɯeKFs+lozWjc^>t';Evj$,xLj衠cUf]nSE̞ϼ;+E`~n^.!EEP&Dԭ1BUcsTI(ČXLmٳZ&UϏIqvMvfqOs(&w HV,㡊`A4}!ܥ7hWOehЄxBvTBR`I) QQI6& OtiM2Me^t%vC;G<űֹW+IgAYtZӗ/;}YN_eYV;&](̻?DS! gWڄ KRB<+3oɈP'F0lzgo)]MWa-ܺWlZ i*JGS>f e ȏv=1Xv0 i"4NmMML {dvhݐippnzfB\럖OUMǔV&+T1}*z(*D7^m :5.9]~xI GxZEhY׈h"=Ht<,5a:*B+T5HnKmR4ID}j`Y@0% 5eYPf>ߗt4/%&Kʘ*d+>k s+Jϯ$|Ƣ T¹ZzN^[G kSu:WN:Nvl\(y̦*B^vOukأd6ѧ&}MK^@]\n4&L UEF Z^IDHa#!MR6 tuy >O5VtN WHJJqYrXAN~;tw9Q0pB2OrpB\0;Pj1yZN鼼Me׈iד2_@lem^|~+lT VRp*X^Bzm?ϟ>| pzMgOPjn6{D6HAzDzr3q|H]O΀v4eR!iQgf$9(*bN<)lqyVn9gJZFW-ٝ/Ä8ή=TUPUjU[1GX[DHZ^EP ϸu K{>.ɳ_BMx7xq,fe)4 RsA!C-0xU:JU {zo8! *LD>dV/%Oe]($;I&թY\e>4͋MKzڧiE&ە> iQ7Uu17X] jIcl1B裕NަP#9I&=%JWX6ku=JogG}Md4wi@0Q}lO\ޕJY1=;Ġ?Hf;>~ b.j^;:0krS|2(I.Ww+D?g$nb4J1*VMx5Ybp:=BHwpF)iLޝ G f H扙 QIKDb7bGCkʤV3jqe@[@L(ENӼR0D=km4I/tZNRLcLgmd:,(yep>> -&QĆ5Hj`!]0YѠ;, -CT%='p-NfIFc+{:R~ݑR*%ãwkdK"թ[@XK2i6 d:0gHOq J'7vX&4JVqO%));ʉ5F^ Rn:؂`- pur1١enޏ+5 C`m<|LD3īkďaqړ~2ScYT[X@IuiSn Ef̧2-6-Z&IblS)Le'Tnj3_`+}xn~qٸk< W1?n{i[/dzPP#DFxwsc£a_q P >j~ ff.=E"$ XvԞHk1JmUz06GDMnܥi퇊iUL5,9CmN@sopcx(CS J݈& 1Zk ,ꞵU SIPp8`P=&hio̮R&mBTe^Χ/.:˭XYa[FkN!Em^~>Not:ӄSVnt.$73gϑ&0F(H GQzSvĸ+=zT{}wk#a AS,һNr+z;9SQ2j6m"`2rOJA{c^2Bc)4<({+R5Ͳeܫhym}Q;126aED.EaSsb:QVm Sj꺒%p|zPm.R4b4>c+RCOn~S*K/alva;<=yx%&ؼ7}ⱞl*άfx7T[E*/`}Y|$1|KۦiᑗQψʄӄeɰ Zq@Z)Br]b0JsN6#dR{ "`-N@m8 "# DTA˶#i*BV/EmHoF!!Jc !u<]8\ULqDRT*cXwP8yѱ|,n >MC?.qL9MuXy2c#TEsqw*N)N\Q3A=lݣf"J@tΎ i<]m8ԥX BĹ @Lz׈r~C)X+S׸QnYeߧ/v>Rd._~|ŀ!u{볎=0#:QzQm?nǭ"G oγX 'Lkaڗ{ھh7 (i<%Ug,bQbZczn2U] -u>|e2TzB([}0 n]Y:&ƩK@_&C##ݦXTd='w+ w[O:G~x9>VB?j~=fujȃLjg[ c$AD >@mVԊ[C}$l-{  cm"k0kѨ nEJ2Ch"駞7FiBzHUZ_Moh2$u-i="c4=1b .ĪR,=tPURyVJ5V mPV9)g]NLT 炤_Mȿbu:MDyg{!zߞC0N9}>JVauQ@FᚤLs$8u5kRQ.uEs5\(B1#5a6~ CA S5f)c B 4#J &\nMBTC}X.%mY#3tEPgWGl4Y^KIL=aR(,0DK"3h&65Χiu-si.|{Uez܈åra$e&)y%MC 03EdGUqimCvȶ-9 <wvM@҈R'LgNmCVz}VhD10pkf]jC]ր;;[Mߘj!&@( [İ [ؔŨj` vUHx %2GDzBI(kD1QdⲐHT$BjMoA-Iq48%g Is07\K)gM8M8)]ZeT3UUQD7X &fFN%P#2<ɂp|2*8v?*XGNN3|@sQH0; Nz4"#>CT2ɠzʹ47WcR=m2| %"U.OqSo w'@DTIb\K&d͛"@f7iSnT3I>$- kҬ":h@%nժ GkpG㖡*CSL48V1m[j-\BMFL Q0J%*BD$4B4[ϋPU@VY,. BaQd0Ԡ 0l09-qBdDP!XE*XDf.f8OPXK)Eq1+Q dOi1{bae1?#TQJqi y 3F@(ړ [b:{tVLMd<Ɓ(I'}j[JzH.Ak~%1 `]ڼͥ[fKh׌5TUw?ڢ{zeT w,y줜5 G hoПc{?߮xɔ\hh̴ ZCߞG@>^+o3ŗOjCsJױf͚bEa$ !TEv@@>+u*x40dtp`xS-;a&l"jY oܚ4VkWc)Ӊv 0I CK?(zkӹMM7Ā& B N&4kGt,kL,Do!Ԣ4QP3HC[-=˷O7I

[;>ɇ-auz| )cࡦ~d}T^>r#`s%$%ZR548m;;N`vxݸ*1 ^z?2>=C>G30HTPPt"M,%dueDMD% bA{`۪Z;]e|X" c4-?\Bj5͠FnE3"(l2%T@-Sf 4; ~|T Nbs {|ዹQp2r"ǿt l _W7ƶY/;dx뤂!)!5:)kI^v lژ#Ђ ԳTp+;;LY5MJ+=-E&MvJz/޵Ѻ(Hgk-"cr5i(& EV_nbic-D*0WT5C_5"TexU5Czy d=t 2wCU؍4FsaFdM 00C,:4G~ɑٍ!7slLo4魽?gzYv0,{Vi_\^6V?_^- ^{2v}N@6JPA԰ wL \P5w3A>#"jЃe2xs'ad*٥)TPv4DtfV&@%/^A4=Nktl>1u-+b[HRbfP`! dE$+DUm> 1\zt7<~v逇i%|wdƣGl8nz'd=޿HFG nV8d~X/)WyCM11%pv,ā54l 9B'P" Ir(n4wx&J-T?iP9h5IaT4B4&SVRek{­_[Z+ˏi&5Ӻ e7K4h#DGuwAt81XB*obԉ$ ,) ^fKKW.IXxw40؟w2[>=#Ύ qK2z>pC\dh GũN!܇Dz,/73AsV3t'g÷+h*xK9:Ej4ASD^ Y4_kkE"R+#u!t)ݱZ)HrRV۰b&pM^dp6 O6yNeߋɆek|~V((۞O*ʞy3+yǭK s4Sģa\G2W|Ş[}s_^A̐lGM$}!0ج̦bh+QIudԞ 8:>^D0VPIP ƈ i"œe7` -VvYVo_o_W)$XwF,ASk8O6r[X"VݽoJ/=7r%K `Y';$U#AU^j_}|Bz.cs,`LjglLV.eRsVk,:0TD,ItedV&B{ΥӆM  RH;Rf)KYf;- AwFQ蔈WoQzv]kZo!6ָmXhڏ4GkuV&rKݽO'"{$bH LDTTSKs>Fb ~ٕxVlOrF<?" Biul~h{9&\CV13w%C;sKfƇ4tF=` C(I*^ kTޢ:t"i0F3Α&-Ϭ;t| ###ȏ8p! ;'KĤYeM$hm:|Gu;h-{Zkn]k\!2qRWZ$#փZTkkVo-Zmmk q~ƞjhKнǾEs?c~l[oθ_W āgpK٨>,w!ȔN290cpͫk f +owG(>1Jd$_T*dzZ -(ŖSM[׫@M@NE ݜŽ(C<zD`G[ N`2s9O־.rSz4bRo&*P YIm>DvX$=ZkV[kQkmqei)οNo3pF4itRR+p[)QMo|m PVGîR!-b]^N'/Nt  i $EI@K[DPV%êƢmii;30\2_Nk9_yf}B%1Ŏ?V7fTA߫ ݥs+Vy{ ,!Njb}( \=pХ{H'p&yY߰M{+ J##M]JHD˩Â`h0FzIڷrmu/oOoSrk3Ztz>Ԧbo*Yjek6^/qmh"}6o}L,g{+5 r)n׺.&֢}g.L~7~XV .Q2XEDCDxM\EB Ĕl%3 1]twWYLY,HS \$T\5&Lo!BE] @01ݩy1CWDo+; @}q흓AxKIR l&B.@+UṁLdU7!AʹaP+;hV/ }ızxglg9YP2u\<$] k^/*@"h & ]ALLgߞd;L"F»"2+)RVܾL~K2G]/М;L tIQ0iuD7y2vo?s$|+ޕ~su݃(]dqxDn{$n1Tbs9f?⩃hM'?5=&06Au`gK~70z)/.ϯr?9Q>Pޏ ED#0'wr5w q4e",*PԌzqEOLs "< qȆt.q2~-v_Mg')۵^o^R)2IZg]؊-e^r42ٛƕ -Gz˭]Vnq5\,rz[o_-t>e|^_@iZb:VM#fZզbL׃R ptWm6cޒ½#LEr4)ܘtS"P{ng{% j;.Z'tX^݆w6Z7ɫ<%Rσr. c઼98c$'?I~zf>WofdO ҴQRDԙrqYEn\ܝ]'jUm9*i8 `E"xD^n]?Nu~\K|X[^gטqMOęSx/Kcm@Fzmޚգ!fQ-tz?N弔ST8Y j0CI3k'ik]׵3 b:^d""fڷqX#`~MbsN(G ۪Md{GObvCQ;@}Ok>m6Xw=ZD HV IQڷl3[QxN=9?ݍwq/‘}y 9kn@>E;Dsl"iElqi֛6WƌY:kҘL0QAApJ3 炦&"4r99s_տs~^o?n+ou^=POj﫼] _oMG!&F~ܼ[^%~\XeM?:IeuGݳ/>F/mo+[vTu,Mђjd!?~Л '˰7n&dXUw>C{X+"޹3Kʀ/.Ne{V/fHb)с/'`tfDG-> fb1! "+ĝt9h7vNɃPH$?Srre&n䑉%xt&@RM6Amn֢J2a\*U{&iˮ.VԪ J^X;vAz4"mFV}*ζ{$=U3P3PEBLJpqJ,@.YL.PdeQ D.T]bϵBvs5=69hFe(*nsSȜ}_W0hJ!bX+w`+;3}׶"%g-B=_> ؁(ڛhfsZ "(ae46P4/OA7hr(*?񪵃c4 &SuMJ#>K fс)gƈ8uGvW 4 a7xC2 Ⱦ 7$?%wف q:ScQ4:O׃#cG̘9CX@cE\ (Jm GQ=6G$x搑wIM͠w5;{P7wbdBUz\FH1ՅT4XQuU %%}pUzD=::\!}ѻ]ތԌM WE v!"ҵfn_4YRߗLHeY훎 EqqWbMO{_%{J0mw+$1Q:Þ&uOsVOWDq_ICy1<πcehu\yYHt0g\xK[Ϯ ̡t$fH:I/=YM> X_MG5ƘW̕F"+ Ȗ6ۂr<1@KnC4Gǩ0e2QiCuhz4;BjVF >&{)tC^A=ЃA0B'@4Œ`5нf<{ҪԎS]/VQ64sXܑyX6>` F3N?9 *TΫ M;Oyav*FH9c Zs=N)&R%{S:*̞~>RԬ'r9i/$#Jp B .ԝFiEP$k@;wPbi%=[T\&ވJS^{+v^)C2@`&+G65 N^ŧZ 6*u 8$hAtqa1 d;GFg=`褦B6ѯ8f'Iw nOꁳp@&t'uC}fRtjT7"YtK8+쏂?'=|7k qd攣DI0.'A@sMgwsJZL#vA$c6C`UpL M}TUCuNщ4`*;V֭v )a;3%1:c3 1q}0#ڬ̸))`%by~/CPRD-\Z ~lxzEå6', hG^,B}Ջr[p"uQ~iɻuI.۷LwU ,q}ßIg0[mRuN@nW]xe^pI^V>UU)gBO:V7J>,'f\]]Ǽ IDATPcOx<`4r '\IBԓa `JMC.8thyLTu<<t 3rIFcg5an ,6/(dG9Gyғ;qgȣfE~XB3)}|Ls>#8rd!ȝ&sLnf'/nއWȅ<YDfYJG% JlTwPB$; PA2܇rrK\*B!N1s8ydC zӶeG/XIE_D{G!w;3FōEݞ`Bڝ6eߩ7jٶO__{.ӧvZ{$v=s_Il}\/VŪ;H*At0Heׁ'E%Cܟ|^tjgC_6 Oۜh9A4wM32Ġ1;_'}(l#WF#:C:}N1APgF24;1S{<>/@|Jw3vG~|~D`;SĂ9;sBl 溔$enQ^DFAPIOwtNe10I-DcH]1(ʫVhn V* Kb m.q(r^@"V/LmUKM/^>wټo6:zYRЮA]-ٵilm^W?싫S\\?]pU5iusw_7}uw˧ՋʟLvEQ2٢'u$h):)H Gڧð6;  Chs>[:Md '0lc@]38}yrS8 vߌC فf8cO8;ez$9<eJpFCD&m=8߃?`Ǥ˂m!pqy<rp`jEfd́ӔS ;`$PY6[zL[ Fꪔģ F1TQ0"E!bʹ"[FuV ɒ%E#ȭm;yG`^a*WovE4ۯۋb7˟~{I,oۯ}[>rzXxQosZ%}ݫo~sys5rӂǂpƨ%V鍝@|@DN)Ua}H`ji5L|,m?˔4>b0\I9 zx>=fSpw#|2IuMh96[A1fLO<=悥M=3ܼgABc}w46~΍a] 0!s\`*AT Zx@,DU7'0tPH%7=WX.ʍh]#NjNn@t ir%[mEC)00ԭwOn<7~:v'/^VWmO)*m}'=A$EjVūumX}kPV&٧~u;v]nWo\+a}JE`'RD RNL3-#NǎJءѪH -L4cBy5XKdn&MT.cm 0h<399gS͝AO5hz9#z:ekUOC"&BȸMDyAyR''ACs;hseV& rC`q gI2Y9b,֋1bKI=ExNi 9IQ1g;ֈ}]B+ ]%O0s+ ԒKHsQAU}&n}bMR˗}ͻ_"jܴ[黯_6ʆ;Z`կuw?/xnϕojqW+Wnv(W fcc}|7^-9}öm}6F^gU}1R!q$g"t'בd曾 ֩_L2[IN t6 GNLpmh m~\og/'Spjy;@\6֋+.[!_Jx&\b `|Wf^Y)fN0=ԌOٺMl&|,C0_?&b=S~:%c[?HLIDbxy,4W(s^?!KBd f.$XP(Y 8(cq7Ԧԫ$8-j~4sH0͈IpTVeR46E6ypDX4;R&Pr8؈iQT~7bO7݇ެW˚?oHxUiͷ}7mY{R0GMF/ٴRM~ mƩ_\}u]]q-o7rATUIA4dd\yD2]@;g[4]nʎy{5dUxNTo?}ƤI|=r0ŠO#pfPN i9eid:ݞ 4"w >B?}Ɯ.Dݓ9y#8+s,Z^Xn V7& ܡ9*1 53v'ٸIi,JVɌA&쥩j贊,"Y)_xHnMn}]mz p/vۛ˪~᾿^]_d'}DX*9X5d 뫫E5=ڵz%,BdnyқwouUqU@7 Lt)e ͌ޙ|q= 2?ԶΒ 9}z+ʦaCcK3dfs"Q; ϔt<v8 1m$@% @. X⁴8uXn3 ,fWKXͣ 0WoS#mp6Qb 0N9}ƘPxe ̩zs,VN0ܔ}(p$dZ QXx(651$n}ۥdpbBFR6a&[J;CA=i_Mʟjk%CLVjk,mׂ- }0%œmӿtY|\> Z<'DyfD*eY\.~/{Y^ BȨš=D:cTr^vIWϾW(/'W5-EԂv{ӂDAH,3u<٨"m"Ё\ȧ|]6q|/SޖXTɈ[v|fkTz}';BdLnl;5=uvĀw{ gkLyF8F3Ё5ur@$mt4<8yf1H5E [lXրeF(ȉ3 @rsyƹ3nJC~=4>F?YЃ>ؙ/ͼqc \e(s  p!dyj DRXKn`c#J,p*9YD4#`Rb\̅A8dd 37uMvzj! \պ价.uo~_TC}wĘR?N0EJX..1.w],BY[oR5B]cuz*3Z͇WmX\^]= JM>~oE}-+-׬kʸ bf*SnÏz!ia{p :HjX  }p72su75wGr3#u5ځ0щdbVg |cKbsQ~;\rg?k^a4L0fCnθ)rBJi}ٙ3Z`[3H~LI䃠g5YL:5LJ=dlډm[?!Artx z0b)$W~gfO.]cI pX( 1WP,_0MޜXrMIP$/ژb)b+HNbr&X(v&F"J:&5+aKJQexCh,(uK2m77ϞݻDaQوJrB\,{P)!޽znYԚm'EZ*1o{wHf΄\5]]VZѴt?zrnV&cL\Kۥ*e6I~U۾j]%ψȓ椢;r7d4HDOdп@s:9yo3OffvfbVh 'L[@Y,7M1HUׇͧ3@7*xװ:҈ؙA\>GawgNYKډ|vשuA:10l *2J* 0OsLaOJтRXJcqv 87DK*P3x)LՉT)Bj}QKQA(jqm߻f{sO]f}ݽ^6j͔߿XNIN( R߶4T%fmߥVfsk^,eZ>w_g?ZO뺤LfcQq , uخy#~-T.__JsD~s1:|:Y;?1sq3.p˦"daV @h1{Q6i7Ѷ7dc2d1bpi0ؐDz}QN07ZOjd06I;Z#IٚG99@9_A͉ B`;h5Qj:xK]ibxʑsF;1qz'0?i~`BVcO !4 wŘ96Gwfl6^lpu-[ zKI3+Wv%~<vdz*W LMٜav7fAn9!\Tf_dAˢϖ,~v._ﯿ~Bi.s`jZ0R­WuBjJdP4RP*ޫhbW"*)( vwWr?.k*(u^Z]G?p_TeuQxuYJl{y#-c~{/j,LMF1ܨWea˶,l\,~t-u"BK_n]߶>XƺŪ(NApƁC"A2l372`l?/򝙌ՅI"Tdݩ`jp3_P({e#L+~Ҭa[4 hσOv aF<'Ϸ`"f9k2V|t7墼E\|MZQ0W][Fw@eA*DU.PpS]IE!I `QHfT;`fwwR)Y9;ckZ,'Tg,jPv4wXYԭ4i<Kdwww} dΡ ڻyXQe^wzxmWA/ewSmC1ݶon7G'~qOT''͚q|grUm@F8(_6aUf&33r7s"$alz`$6a>F +!8C%vp(L6<759 H 2C\'d eؙrX!|,28xQe,IL>b7T)0%o쐱zڃB88ٳj4P!`svE/,<; A!^-֥Floͷلx+oOZ\R) !^\qtOF˫^krJaNI)q^DY"1 b8bu^|껾*di߶o݋j6ƮBm޼{-"e5.uIeI\EUx$.̚nwszafͶu vԖWW0{ͻogbNw|! x]obW%^;`40NF?~؀&f|yдr K+ 53MhL)1! dA"6-A>`#Sq:p'<#y O|ac/%嘶j4 ZshKY8N L 8U N3n%ʰA 5,asxf9{bAd@D֦Bg sK :' ,3zHsx?p招MAnH䕳kRT؂c`U/AI@omon{sFP-mKx[]t:{RVE;7_断1͛BNTW ~leI׋v\\^x˗Ozz}b{{p?g߿-*DXWEUj6-Dq_x.B} ‰Z\]#]kjT@fۭVy,w^YXVݳ>*|>wۻ^_CQhzTu}i|eK-"3RX&e3ά3  ;PlzG38i賓jrȬM)sP'3dceSv,Ȟ-KQ|i*Sf ,_!~8! DOfݤB)+8x `<0| (!`N,.D6z+0/MF+-X 6m0f`f,p$@~{`\#i6f6&:0do&(h6FlwM?j:kSbfnL%Xw}|p7ьT[cd$<[sr⃌]X܄J۸M?wg~_/ji{{ߵEU!_z2T_, WU` {Q/(,uI̔\[.p2^V^ϯW։UV˫]?/JzŶoVccjk]U<{0CT- R.}0I$}t{paIzqq[ \7<HOQ?]~YpW}-r'0CgxGo]63d : Dɑ3a~u. ){rdxügd ɋ% F gP C$"E<3$y3%=T@L$C3EL{!:)N we > DXR(Db)AAHA<@"#GPp|%羂9[C'1eae}puKXaf`@B+NYI@}վ믺Wfӟŧ_~R\owoP\V.LE- dz90)5ĥPGNPc exñws5X*]H^^\=dy~_*Z].7?ɟ}?˿ov;O1Qa B]itcרG~r`UMWUref ""ާNU=}8m~\6w|?7r:q]xvW^eqP* +<ҬG.=؛:g= .=X6a.6h`gub2#`b0 qNNUN/ecɖ-wD|]ڒnpȗy0z`0z?b0Eql ZK{GjT(Vs"v,}p +N+O̢ DT"f0)6O%U0f(fe\fi:r6M'0g`py!qr1 C-4#~M% Lp70뛦4!"/&"8-.k:|^DlH:liz ͭYaߓNUu0E%9ތĤp#ršl ?\={y=Ώ|pttObV^=+| ͖6q[J͎m2s-TF;o썉DtѨQ"4ΝCwnqEU= W}w*V-[| We|iۮ^_=?!EY"(Fq%sib1Pg@%k7 ZBEۺ):Lr^Ku^w\K,Dbr,YM[F*EPtZjЀX ̥ 2U )#(*>[BB iEF3H`Q))*%9`"qd-ӎo'zH5!1)8PBs@3#'$&%Gƈ +P:HR{Tr-*7яiD;C BOY~ѫB,F64u" u8A̔;QR4 `t ʺ盋]exq/&XgS7_\_"17될+s-[cRD`@)t@+Zܼ D&igf+Qio{?\|Go_<{??W/āt+zO_~ɇW[%ϺWl T2Bf.uUQblXDT(Ր9]zD $%H0R@&7?SU*W뫽BACt|+S,f~du͸vⷘ)=^@0K,Y 2dT< x0H RЛHzH:4m.iȎ-႖jQQ P%/<ҷYx?Л{$s6G@`Tm##0'` CZֈ'TodEG Ź6[hQuM~f RStNtqtj#fAo=vZB&P<[(qٸZ'zӗ쳟ۿO6o?.vEsIX-I pzDX̜@]S0F(t-h :(Kjh"B JIYnz88ۛU%n^\N^6/|ઘ]ָS 9$1Q][7fcra"$dHȩ=/6tBwf؟Li/ 4`FCKI&sLƬB(V0%`z¡g!8&ǔN:v& FHlB* <р>-=h ѥΎ:4tgJNsP0c23; G9{0B "Ӂ1THi ؔi_%!35z%or$eJ2vCocހoYˀ2WS@ h1PGrU^=,jl8~pwi "g$W'_yj* k?-A#rDk.~_k<x%(+ةZMր dҹ|Sty޶NBHUU-K7?wl^(=|t׿/%Puֵ_.7Wu(u5qPU8;C=ׇ"P'7mȔ(!h%K@rQDm֫.""1Fnt!@uv1qEQ,p`l?#&M'񥏀(g"$cPU!QUUY2e1hPAD٬_ٟ \UX;Te.cP" m)=>p>n% r|4dg!" C틩4̈pI,ȥ9q8mtjqh&.}0rPC04Ո搄2ЈLвHu`o!!30rwDBDHS3Xߘ['5_rˀ)"x1ՉoāJ]EI`pGD9גPo,(MΆj 2i$=|d k1D/ѯ_c ( ڄ.۫ΟrB{\>'>N y$@EMGV s ש]ѽuI~5by!Fbf@ DU - 6`fdӼaf MӺdvlff pjg Z&S ukӆ)P+VAqPszo=_VUuU%N1ˑjX1Ʈ4_rjY"$Rwt11݋ӳ|Ÿ2jY1$B=>"9<&g6\ Xh9}r춎φ->U3]F64341#@V:6 >,f!E4Bp]ol5#*v$ߜ}py%qљ-yĎX(HH$ Ue[OOꫯs ԺV#"8n.S`_ݣ|hUTyY} %lMh8Ãi:(ʤP1"b]כE!#OG.6\fAtJ(Vp`WG}7WgӯucW"1"3Thj^<;R1BӪ(ťN,HM:trblfШ,)f 27kp#VPw\k'u\菻$m7now;s#Ӈ"R}îNSQIOףbnB k1Aù9VE$ӓu nZW޻𝏫}8).C NcjdbN+]C[^h?}4 kѕp]]|#}-eW )XԮL;Vc45eʹrVᴋ\SkON,6k۵"yƦLaɼZsK zCmUPlbևoO^'W>_}uy~7< "A"Z`PY"us{;CT0bnU͓6\IKo i&8$D9ce[E^9(i @<53ULIOK1*"w]Rj&K?ޗkRowSQP"Dd&0@ C EN]" -Ѱ \sf+rNZ4;@\ i}C3HkRWR҄t67AMRui`Q5$4CKgK1Dޱ FހfاӎTLL :1ԂYT 1rJJg5(Įhc@A@S 5k]?Vo.lG|oqpڀ+، ԸwJ.5hvR,o֛C5 IDATUk_Z 2EVDdrٵrY"( A1Ӯ u+W-o}W.N_W 닋jU0Qcmi߻O+ṯ**pU t||6}f{niΩ "P414#9 ɳb#&8.Ŷ9V)~8>;S7=ї'͔hDZb-])`5XХMA9 E!' *ZDg:q .Ol^K9>j5XD{+mQFtPYD4NGr ;)B$2̱Hɘ]3!z4N!,Ŕ72?F|<0KoLC!3YB"v-pxy,7q;Z Uf'.}, Esn$<#(lV`Čx,NJ٢\_oUvRPy0΃G)hS^XDdiཧjևkoϮE#Z'ydZŷ-..@h&&!B&!H ъj^5m'8/_ԍЩbsucd2;;?lne5[bffw+t/JNBtDu 1hQɤkNep2?ؿ{Wfk__M%s8ON&p heUIA1yR b!O: >-bNׂ*8;qKp#'6 [F,9d!t&am##((Y.$#bS0HjCZ;)Ūں6@, oykQtC7@{;޸>U)n5>QMxd4_zPB*I}B @9-ir "ocb30@NvGS,^A/W^`b|pyeEDeD$@艩:~W߶Wy+p]"yO'ġz$@n*j!b|V9x|uS1v4WP7 ))բtP7\')Wxɤ\̊_NGTUuo~&n rId9BNZ&@DPO&e1C ^O>ӽT m5'˵jaXLl]DhhOĠ\S5B$E,A<y&df 5z!.jK yffd1봬vtȗx(a"FRkd7!@wgc=@PЌq0CLj@!(-g0JJ%XosefSsP YĈ>{&n fzX1 g.1f YhqQ;0(٤zCRj倳5}vⴵIC5KTȚV؊qv۴{(MvIAڝmO~ D2xq;O> P3zm42@>mb)G?n6g>]l@ؒJ {^ZNЕmDd@̨2 ͦk{/> *l%,DD:T (a}}*Ӣ(\N̳ê<($nOyv+iC-h 0GV$#1F*H l;]]Օs{{H9W:l.;Mϗj~3/gzVzkfZ)'_l+CXW 劆i'lй6O3Xt"C;hȗ%e9ec n}0:S@"AĨ@dT0%B*8.i%QrARbHj@J@Iː c aJ@Đ1a]Cr020w}ՍvnG,:&(Lv_w8`d B:(G`&]{sK v>gxom-m/[wL 'r[.F,iN_Ze}i4o=f}cD_0Qta\w,t%t[@l]^5OObjW֔$!$~hP-]ۀRL]9vAde^r\ܹs'`w`_?߶ WFtVIZ8p%rNf[0.wrɲ!]\6%vEE9t{r*|e@U {/5%U{ TMT ,+2J/2XoeP;jxc-'1Kr폹{49UwHB4P#T16MƦ)T)[Uujop7iɘMN0sF|18;[2zQ?kI4AQ &{6DhjX$:ɐOI irQP, mj 3$Q"b$ k'!2T4d7Lqһ)~*iSNIU{cQUP}0$ҌJ$YW?'#"e9"(bPǑeP3SMAA@4݆7Ʋ"rof M@yOfpp!L&tw>wϮuΓ !.^jx+x>+'Ԋ Lʒp]kC%[ 1 EyW:$`-C#,@ ]hoDI5qQt̾-'z㏊,Yǝ ua:Ia羾ͫBW+FBKtj+| ;eh ;={е1܃?zF#h)>H!߰I F{(`׺z_e##Z UJz12 "Q^4$F"SG6%l5yBSP"5@ĊDʢVwa7o 7daLGվBc gh6<(bRL6sF!yn +F*zWUq!"Dꋱ)x;]"#&$Grc?0IE5*P=AJ bulN1aujWxߜ៫)=͠Ƀ'Q[+,sn0%&D cȐ!գ`pZOڵ([eEOq0f =aZ@۶)Ko(DZlUE)VAD]zvӞc1djLT2,;&ɬ,6{T H p-LJ{Gw-U/ps)㶫eX+nzU2c+IP#45ޕe9Zuޖ{Wwk_T0%q04eFFtiӗ:h{*I [fҘ`½Fiű _@0`ߩ2y9d\=)~y`< {|QD5OQr3jMB"oۀS؛wo(rϑzXՕc "h)Z>rUelKh`h ̌H"-)X""Jқz7L$dĤ`F R"s7i7}`D/lY  Ɖ2t#45wַ1/ ;>gҵkO]ޘL%7YH,wD`A[qĊd.tRhtuٳ?VK."k4ݏ~s h Tc&UQ5fWݐ22P F":|rݺi.>*9ݮ7ϕj4 ՠ Mé[pWW8w]]<̗6 v" L@FSNԄH coڢ9S  D VkHdKr!*?fX7F|YY6}I vS(f`͊ Ö#Ti!;4^@?5/Oմ+]{ 1JaDliWqw^l}$M0ʔC=j2srHz-}g7tSD9 dhq` *K"05" dA0L@(HBA${R,RΦ̔Ԃ3Bb'nNͲg[sf}V%(}G5!$ j U1ZqSh}2n;02 jt+Z  @Ҁ07_~9-/IxY=9|wt.͢Cpb_g0*]mBPVm[OE#nx \Ⓒ`]QX2R9X &D&r`_9ODQa+ZN|{_f1nW%$l99Rt]YwaS'nۍV㎩rJ%̦ل H;r]Yb긊.&-YuF>NޕOom'cԅnYj^C~QM-k4zC\H4<]i`` [ ]@H,H>|(aj?h*lO!VBx~ވ!)Kd"x/t=+9`jI 2*%fu.5TM3GI ~Ap 5><4Gfna6FW[8po+r9 %^BD)ֆÑ"  GDTXoXֱ~>Ϸ's(⥜?>z}t%@jH[kyh DDfESp+Dy񻟭.^LEnPM:hɩ55]pPWΦVb,eNJv{,6Jԗ;˽rq|Gjֆ(ċ/ۋizUw!PIӢi!jlFCOἬdf4.{/Fcu[1ZM_# 8ۣ_->8?9inL8:UA :5*m#sP&Ͷ]ަ9^'LQm$OZRfmwJsK)D4Ȇt|0˻k\0B@F$2V`F22f :\ Dj 2r6 jE)`np`^bp?Y;D$2MA#0COAdf?@!#4ˎ9AE $D#`v{Q~˿_xhK+|=,ˠf`p!E Bù odϑb"*Z5bīŢtf=n_}cE9a@I\.NAE"&t!SSb:lZNG>yr`u[5" Y]d?ôٴ*:mUNϾ=:O_gDc [&8GZ` 񞫒++I5q."b:&h]Ŧ؂GV$AIs'N0͐9F]i }{|xpуD@ED[] 5~;GBrӬkl9ˆQU\'W  yMO?ǿ+]{po1w2%m./_Z ]JvNDQĄ lWq cq\|@qqj`6$v~.^ͦhmCNJLDg˷LR}&!4pg `+0UU#tp=Mjm=vϩ IDAT͘"SPgP hHA+Q@,ɷLLIL5S`)}3Gݿ{uM{>> H _QzH[4kYQG3ko&nB@bD3 2? [@/go#Ybڻ9==iE " P-0aɀڐh&eaֳtWwU{9?""]h43+#"#;,lԌhl@T$4 cU ("*(}5~=!:5LIRY{ɟ?{O t~Xɫ*:]=8K􃟶,XZk8Lb>|_y/Y<ׅƹjYb6(эt7'(קtu3k_a11BRkY-~r<~sHR:C YƎ4@5e &aJx1/lE(`U5S&dD `kJTL$! ):@: XLńz;7,+0+d?j%2"s#D=O!IRskp3 F[b}֥4b6;}v3Kz[w2c  $` lFMܬC)+3Xhj T-I"\M훟LmK7P Bjelxvzz>gno8lJRn5Ɉ(% 1`e2'7GwwNp/:f׎M4 O]xxwh7+a?=y}L65볪qt۶:s!##umK:y룗w+,e隣33BՏ~ßM,J ??պ!EU5QL {Fڎ΅W(Rg]cy7Uʲ?Ƽ!ޤ#.e}1pnd :,YrPDSF+r?LA w챚DV]"b[{<kmnɅJF7` ;S.V@93Q\(PTa0)$C(i6:yxuvD唦Ooc&<*[w+KoEQ I Y|o}^`4FV_6ع0"qI')D\j\ɢjR8&?;~W??{$1(dOR$obj z~qNxDs 2[;\ xqL:v^]ya2]oVD:*)e&v/MMҹD̚vbTOS =֣DZMyٸYW|o^&]uNWO'[󽙱6<!Q}|I[F.բ %DYo l d#(kdX*#RTӦu`>HNOO׿qƘ"c8?[J"0h1]jZ*/^VTx|og/NpzhWON=9":7l|}~ ~}~sX}έER]@͋  Q>APVoԯWh!]?n+k`; \bi|]FT22l LLQ l]LAI3߸.k^>2HGˊl;yarrV bs|xۂz45FwWMy#+L0 q=ՖUE @gBLWO=|<ڝߞ=H$}_Vgkfb_BF6J;A^QP0&T,S֧Ӊ/~ĚeX.@$ObRNnnݻ}w~`ٍn%+d, MrUuNmK;{'n<UvuC`[<~ULl2c*bŘhI]mGq8G''nzxT!$ o8~yu>qq>߼??OoGZ*3F5@@F̯K׾Y&Hʦe djY5|[eSh3314ou(k{-CF6C;@y^+ހjړ{K..ĝ!T1"(aD]-+i DD4GCXMDp8=tn)؀ ,UѨ;_]K?͑!ֳ 4Sz٪bH0tR~ ֱPrCyuuZ={O>'7nz;~ïݹͫ[="tVaYĦ~Z 57޿J:vմMӭnR *v&+'Ab _zb׋Ԇ䌑urH.}_d&{A6M TFkƓʵ ͚ };RH<oo<.kۨAB"sw lj~qsWu]E`D-\Kw Qk"N }k}Ks-JL鷇tˊ16ixKJR6dP8u*eUv&a] }"Mk/[9 ) VQ{XAQ%0V滻|ߤ;,,oM_Ϊ/vh2m}"(3Ddv~"HLDL(c B,@0vX{:yx v_Lܧbm,1D%"{$uc`TLC%`$dv̜gj B XZ-K__m}<Gʀ їmʢp1JjqW}Ã{|pݏ޻sbu#ޕ.jGay]:Jދzܚ8ѳx|vX- ]i:VӽYɈ u:b:*Ȼ|'zO=0DigTّv]6pmjb!(c^իh~W7nnJ/>?P:'ŶE_Fwİp|:Zn=6վ4Ev1K@Wx_ّyS6!.N'- kC`w.gWE -WЀ T{^ŀN([~z %aFc3 t*0M0hcu՟p7f]\}]Nqo3j0vQUuT2rnm| "dgCA$C蒮^?/%|fnX0 DPr<Mq9Muӟݯ|Wn7pYWkw ɬO}<}ZWu.˲|݀yRdrqzZsƝlv0?`tl"!Oo.51]F_Vd"5M[/z /xiRs:8Vݙir7O}pSxiJaQ~:dA{M>ku8;ٿkpTzlkW]^l,mnuaxL% ]r=KjW؋(2! (3٣%zc8數fWƟJ:@٧9aj`}>f v\BKԣ`Ȁ+b6UȞгg4m25U1&2,FQ { d$,Edf)19Fh^E3"3TĤL-9r~{6 EѱSݚ2uys=RBEGTVD&CV5bCWEr͸8?uI_=wK:yTM  1W#Uf0GDgOfdx7L؉!Lg7yWOV''^u kiҦ6rrr/j].NҊu|qr0b! ʞ<`;_^U{d`1ܘ{xg}fJQR$>٧[]|fBAW̓oOU~|~jIJ]{4N]}|7 ]x9ݕd>j4fݢ*\^d1ø /G3!!bv\tks.܁,o,7["hmJ,CG`̒)*9@0Sm:;vvhM3="a<ѮGU&G˅^7i a^v_;~?fnܺ=`")i2K tEQu]UUE1p23Zsb?z}u:}}W^:;($ke\UmYE9Ahz 壟ݣ;yxwo8&܍3;>=}uvt\+\,I),VM闏>y^.+y"Ÿ@M굵5#"$B Uc+ttp]/'9Q`gΊze0_'X6U9{Űj*9'گ_b,|25:b֡EB*`UQ&9lvx8P/- IdLp{GmwEC'"҅R&eu օ RDEoJ-;)/o+\3m4 /Yf<$c t uرY~=poSKEQj*"yn}ZSÁ`7ݱa $2(gPigy|?~'Gdw>`!Ւc]\Rj91ۅ "p&Rr%QjÓ_mƋ夘5-'fͽ;!tK璂eKQ5^>D`)ucVqs9Of>8yOlo2^b]]Hi?XW˗_rStTxU-=rg0އ8l|A u躶`Ž/<%9??^ D>ΗzpPv!vxWs?:'qgM"1Y>0%K(2Gc)iR*IϻW{~yjgEMTYl1]'5)%@W,S9u0-y96CҨSЉKIэq1-EAթDjjL歕j:. ߿BݵPs/y*Z׹,[Pu1UiY$# 4#h)YݫrE~ o۽nX_9!+a/LN/_\[9/]hoYyׇH&{(kzA>ҁ5~tƶiٚ IDATb]^=/N i\MwZDU@U6ZM, vamJ/n~VIL-ۣCQ9'sRv=_ RTlIW'?3NoMn&R()FQAB^]eYJuJi3) 8CP%܉/[Koo_Tt+/}ش]Dc2:@0dRIIm(O̬i][*uSK$Њ6zXuu55lhRN(ѨO#v]G{SB]IBό`GX Qh634ەJ2cl'rzsav}o ۖn+wLB@܉aE^d]eEXue^[$Ie^ɬx30$Dxܲw)vlI]ވ"弚$ڵ؄]q&Yz<5DnݹQLKOɛ)8!CFF""sq9m>w5CJ]}694p0+_k % BGg_/W c)֎4 i#SrT (ŋU-)` jNBJy]KG13YB&aROTnhAITKl^/;`%zqRDԁ\Tm.><(@޽u07!KQDm/uRޯ.I* $l98l'W>MAd]im)7."0=,eR!sm*BqK,lK!|Љ5n9y$}jCĥhPUHDzqtg}vh#5hGޏff I,Zo7DiK(fI@^W#sG?\֕HB7|ٸ`oRHClBP4D{A.WuK) F m.)X׶)vq\0'"S״1fPSHL@M *)AlY[שK&iCˆX&1Įwc14$%!TtN Ԛv6y,KkuqQ޾q% Q J)I,9F4f z`bҠ ƾ3M kGϭt߶-kf!NriXǧl!ڳZtݗb7].y;i `hf5o&ug{;lY>p+@mI {ES̷n=`h] `PJ&ΖX=nXC02%ҕJI5heL8b?UTPd1Ơc&0i-?՗_L5z;weQYv.sዢ\ofcoEBE;W@eY0HDŽ`  wb3;KcĶkw9IlFR8}n7^>~Gi t-6ڈ> JL3{vK04mXtk4"x75[ՕQdgώA3"hy'vmL;G]gNEkp;f(I UރJ[49%߶mi_߾?O:l4vSFZ#X(ω}vK>δI:B  bN`HA4Ƒ}#jcRb.fծum7&ٴ &0BԄQ%i)IȀ4!lG"46q`7؍PbB [2ŝR !u]SvݬO{7I L0*JD{V**(!"D5dD$@ݨYBw~֨`[ݱ ˽@+\`xm]uA"Wߗv?gD7.y\^}EfԖˎ-eTj*#.7չ?G$Uy;au>T4?.8DnbᎵ *!#/[Dgf1;&qf %m$ ^p8N?}/}tw~O&Y(!d~_c&0#"}@zP&*);Uu1sQsKr]ZNUM,)}ϟ}?*Aؙ"'U Q~|Z.'g׋q]KC,]2%3vHJnyR2æijXrooσ9JJHِ=cF3]J]L]JiDC*IcWb+:6K m ҕ4)";WE2q( zdDU1b%ddsAgҧY@i2 K+J_;&* m b3I29 [ԫ))K mZ]je ]7i.9e&n mG}Î]Z/P% 6uc =af6(b~`kpx-KheSfy""fx%dBȌ L@TR15TG}Vwv7o}7?{N*@P\3!KMN;3/AYSJ9Wb@@F"0c44EQ,1 JQe  >OT,=I)1^D@;K41yx}Mc1BPI"`2%?^T&Lfs4 O<)ʐd7H:Vc )jUd ΁"EYl5%c QdDVs @#Va oh`*˶ #UHR6gLRQ8H&t$E&0A,2e~m[LN/ }LP3вyԐrS)tmDRݰEvQßxK_x_ASUE9ȎWoCܛA z!BfbTQSJf&TMvu R애 4FGGTB\bs&feOf9$&~s@%pICTI fWpuY,+)" qJߞVUEicWI#]lR'Z*'8 2@$Xk)%T#DDUM TNR!R s7)HDD{3$̦u 5ͩNKv LQEc]@FbRB:-UMU5;"|J-s@%wQ3 SKy̶[JC` ;_Aެ `f -̹eNgfJ 8hH2nю ,J<\1S04K~Reb̆dGșh24D)%BG$SbG7aA8M'?xO38_;d>;HD̢JӬp ( B9bE!X)dW^<0{L)#8bV%SG<_e5*dRcdD0VHhh4`&<T-")]`"t?f  pƀ`IcM֍J7^322.cBt[ A$am ;DjjIU6p AHPU%msNoj#6gt8W:4sq"Jy6 1f!͝10!A͗S]{g\nV-;*f h; ))Y pd\ԱפA:G<0]EYPB wܶ@]?KVqp{M7@]ڻ6ҷtvaSS"^o{Yegʿ"WI6"O2+KR]v<Ĕ@""#@35.tUHiɸGhZAԮJېs=~{FEe`Jߨ6#" ɔ:$fnj WY7,1Blඦ4 0"0#!9``,8?*EXYD)|AB"jZGFx-1 Ԑ( .y_QAQ8 ;ly:23&N@D4ZBɞyh 8[kybU "`̓*tjksg٨gf5%0AP@ђ1ƎsjSjF(Gku;֠300!xe?&\8Hz#N)P.d οvq`;&ǶJrb!zCkG*qߴx m#wM.7ymZoIO7nW`wyLkȮ,P T$(U,YB{//xQl!iIױGneXi? !0s%L`ln_pN@XD,˂2 03E%#))jQΖz<*x" @P7-E0D 1.Ũ @11Bg!jvmLALbQ4H  S.JKjb=Sg:*]3sٖAT(RD@S4a&@ fi:r>?_$>DC۝i2d|G} Dij5O4s-E}g&tm*\QKFdfyG/GN`am~ B3^mc{F_Y.L"cWٲ$p[xx".,1'44d$VÊҳrS ~e#|ĩq5[ 'B fVUBD`2)n<f VB$C"+r>( ^^K&G28Tֹ &ۡm)ۨ2vaHź f*놼ZKڦY#.}Ñ -m~vƉ Ō%XsZrLrQ@9hQ-0QH"SI2l})FqlX?n#`弎ҼԯFXH&( Q @M5P~m4KUmX#$1f"3M"rB3Jo}km+~)5AfI aLHBm1Xץ]U붉]&(Xޚ4hI-zCIrMAB5I2zFxx(.1Ւ4uS H C Vw!@uֱPkCvk$it9$a9GS $A !:0ҤpA>H`%4+6zwt੗ ꬏t&8*?!8݆=2jYDp>|!I>a&76ޒ6E k#[-(2szVp~ԇ7Ω=NSj>[r7\իZizxovw[4\Z%eD5n2H$P)djiLTh@5)]ORkqRE$pm1;#!3[K{fJU@>_i_'"eDŽͬXu,ZVui>a:a&a:kUU5U5-5WD !tqpŔ91.>8H'DbH^sˡSDSPAM)8 T_Z5‹a/F+;IͳJcuxkg,7Y"0 ['<c8Q'Qb^.W'GTwe9 99P| 921 JU1u<ūOO?a!6}&/ 7>bg_sЧKêWK닋إ1ہ ֪ 23I!fҊţj^3N/n.ZWmS|pVѲ*\Û-JMQYkZ<<լ4͇np؏n?M]3x >mBp 436HGv0BHLe&Le߿Jn+Cbbuݐ:x`us`gBHhȭis.1]jfq̵.R35Mie6|JhŊ 伷}|p~Xl;}_^[G\&bh#v%Yڎ93c!29"q;>?!ŐIنl!Ę:%6D1q)TR"BZ~~X̵r^.fnͫg HjVk.% :X !irWWה֌dfi~>oooqqZkKڟ|L7wGEf ABFUG{UF MHA@Ճ$$L^Ԁ*͹VbYp=. [(` &QmHiXȬ/n]iʼn_|@HDVXM?/f< kliS3EPܛ֢Bm1-@4"kp6 A&T5,ctb|_)~Dxq-xCܧTSsy=D Fpf~N0ƚiE0z_5Zw 1&;_pA Zt݇7Ͽnч:u䔺HqVŘB!`u$耉 ˣY^MD  -C73_:TWAZkE'b\VcfռZ0VϚUT]b}y($>ZU:Oai&.E_䦦: !nuRensC) TPPɉ(D"3S AL5׌ 1``V;ʎ~)4 A\̙9έZ (BSE2@r5ņg5_^_lɯV+b}V*́p],ZkfE4ftCoݟc5lno3fX ܈ SQQ}^,^L=!?Fucf \Oyhqn6fR0'ӣ}L=ȱkSbٓ*Yk 6&dDB:Zlu72R8m ÇnNh{{}}bX_|6e҆*viDHB솠)f^\\<{b7h1 ^P]f&3.MErkفRJC1 "4cr0vq\ݡ)Wy0oo>w9Z@*ou,Ba^asSz<똭#%4d0P DHn66OX2;8"3E$g/1V !cUՅø\TQbvE=J%QSH'L':BJ~xuoj``T,8 ъ5) pc`{UUmW vHm7)"3 dC@~zV#uk!Yc~{<;hQGx3D̎&B>?zNJ"i{\grCuoYڶx p$# h\9r ȘC53 DP+,BVD`{otv7v wrQkqÐ/6J.nM7}T<#p'Ɉ<9x$aѤ.XԪ:73:\J)B^kuWku"w{=2aP Ҭ6ڬ,Tq*vݻwwwwR+ԙk!GիuDp )a}G/!ۛ?h;ETF LY5N!31&I&5Yf~p:q58&|"֦ӥ}}Li\x i 6iDDlItqQ|!Cy,(pd;{2U񏛷+GSRq{.Bb Q#Ԏ&:#7aUA(Yh"9Vun{w~;} -:EnX߬֗R !1D6ft.EuzN fcǘ jn235D$U@tN``j:;R8&a\Jǘv^Tvx=ܽwi="u4.S]quXV1 2@jow-aIwspb%~9DUib Pk^ HfBVpIAb@cȽH^?J898^^ӺV/^n{uu~x=2xAUy>!I&V8Zb:c .636y{ûwwwqux5u4cL};$$bHՌ%p˜'~lHIڠ̭VRPe_rItl&rW.f( dm ͎9~%e{]9W7KV%Hbw 4RJͰJZd^1&*EB7_wt? #]ǘ)UyZ!DEDXhQ6ie@CFZk%n풖b4oGϕSDrjJDCbMY4M~ok%poy}{&좍'8ݼZ:rt[Ї_s,9CݫiF7(ZI裨e0jfc{S@_=>{6a"Fy[z\]NM} l%vU{\-sr03X"K QHt4Z-¾u'R7t2,[?_JǜdkBtTE`ꃏݏww?>̹bYS0^Mă nXma;sʀDxPOو­eR @Mݵ8l=KРF Uu&~n&fpM]BU yE9iz6xfGQGqsuHNI[ujuyi@K77W777]y˼7 |/ůw>u6zX;(9jR,v}C Bbh ARJ$kUr-yed(B\11BYm1Çw.Aa%k~_mR?|o~n{q\͆CQ 0)-@3?"*Y7ljX\ dXL/ @vPs050u5f ԚŗȹM@-Plc@N^ L(<ɦ~)q1?)hx^;aQCNYbv>쿥Sbޑu 37G3/:~$9Ysxт'j+T*ATD,wL( ֚^Q ygu}n}v}V%m 3r@*vj]݊AǠ-BR`Z qDچQsBA" msnl؈12u`Zp\gǥybT$̇qr)Jt"^^ktyz_pXu0*qyR 5!/"f!9%FR@4'o?p?Vx/ 1jHUD+`it4h2*# `'asY*{)w{ ]cb),,NV]gC0mNCR>R<;xC8HP Z՗i O>i;5|]4u'#=R8LDrAB"gwsg/zrzTRYQ*$$$!YT܄eUT %Pk-Zռ"ܼ~"""3 g?i8L& d"r4Ӭ.^]frӻmvBREفFoo_A˛>X2 Zxx81I}*.U!p_CCOvj^4cka,yv 4Q3p\l%mڂtJ8%Ys={tV-F!0QC=[~8oj!ۤnױ]vPǭnTݳYF0zPйcR*.F!&C,fdJvSëG'V7$QsJչiBQsΪ#3C@EykԐcd@f:jyiWwzL\N( S1:.$ =BTk;ŗFB@Vp!  fټ乶Ε)ԫ:uڗ2j- Rw%" X̬9HB꺮pTɧU! Oׯ.*cɼ2qBë+Ӱn8w)9rU5A,ıjS*Pu덪~q{ j76۬_{P'*"&@Ddhm5bQg٧4ڬ␤nv%8}1p~Wo֧յwa'B#f씾__\f?v Ρ6_L_3޽j`JLf])u<"|x$EaBZ R\0v̻iF  jеcw X5DtyZ1=ox2~Q}>?*֣co/'.Q@zKB"OȏyycțDM0RG{3-#rլ fz\z `G/Tp0~~pй2E}w9pxQ* ap$s$vIdG3.O8Eiժ ݝ({)њAɪi:4u) ́z fPK-pyv׉!_)r+BefZ\*5 &6UkΑs ܋mկ>̥a:l$MBdbC{[GƓEC*Ԕ"9gB7m"3#ySvlߔJWE>x8d.]yFt>eb>gyXSp>A CjT#V6Y"t,Q\BLj7?XCċ/ᢻB"Rk5G ȉ%q9tbLA[qRZ=RԂ#84kiX#0<Ϡ4՚͛Wwq[B"lJ-J<'pP2!&Da`P7:ZU*\pX ײzUACTSj|`-y B{T] _~}Žc)w].6iXيא:RU׊`BƦ-IPDBKqτL [DlKQ眵־4Ğ7_&u7>Q`^}U F<#kA/|P`?r%xTtѯpwaɼm=M{b`fq&;LE9$D PoV}35:UP Јȍ ;p]/}??'Q~/J|"Ёy} U4s~/e<?//ɼ)@1576j嗺9 3:C=~ؾ}S MM bt`1!2TwR5%ϟ8 IDAT8Le03⢨6s 12ArZۿ\BqGfRL5SVjQO2!) Be$PZB5k.n+R*s@u^349#sH]1)*:ebX ſw7.ѡ w;avb@A@)Z[xD/U"ȱgGpfVH]\\xۿ; ":J![uw:|?ɽNÊ (g_8ϫu'.KZfqCwkq=~^tJ2fʤ"lK(Я_o8K:e%eӆb(xФ$g؏nO'iO>q<9WUfd>ozvOBrH#xf}azΆ_*"9.k kG:# ǻjsp0.2l$%ϗ$nFbEb`drBfz'0Le)ߚ1UFsRfw1" dWtwQnOc)Vs$!TĠZ]$-ǀYHÅ\qJÕUV̪jV zel&Z̼#cN$׿ュ/.WnXw(hEJB')YmJL`Ԁaɪ8cQۏsUG!CZ^jq!m6w_~Z F,K$!J^߮混ӏB[' U 5`\Wk-aⱼ^ɻ U1!pϫe7_8~[h&=03fPH~) JnW q%\ gFQXLıL؋ѧ.>:%cIIG+AIK<'[LG;4Eo1@&v>ƑDa2uleMCpurlP:jBSܨ\Jmnip c&niUc1# 幌䦥TU?۴uޗÄ?.`LhJZ]Ihr7 1 ЎHbKt~C`!IRl6ݐPD^}~bn,s:$GzR]'¼enS͕d3 RVzH~}YfBdn^?@[Fεݑ ͠:@H9f%jz }ᐁ **!(Dgtds&$F@p&DGOm>!9\O{jL~)pmy.z`fH e ĈETQCDsـܽRd|Fw,l(5,jsUUbAdG@bERdE@N-4UjS9`[g߲^hGH6o9#S\S=u IT&ŏ*WGl+!)e/qpAugSYչC7VGq FmI;Y.Db檕Ș7G/ץ0Vk s&pA& H̬IJs1?̈mN5uY9yjE2ČൎYw݆d03G"g@eҒ!.)v68<6춇vBJH!D 1fFD\s9W GtuS<$ao )^JXH2(0#U`YhXsD`77b1ZbIq$^VfҪ\XHbG1 @ P̈&тZ]WtWGK$2?\' <[JJS>80 a-:lZVn^mtriN}Q"a1Rd"2 "eSfa|cJzo0뗻}WO|uha߮{pѼ]=So̝gY/W/Yo}Pv_V]<աBS*ϜS1#.g?O?gvZT5j9-3sӊh)BD":DOK ȳ3zjӸ   |8'rF2cɖ$2xyR TQH"f0" @Ĵ@,DV(A L T@ƀέꘗKU=̶ C0Mt*< $|Z8x)u%B?*` xSwrաtӺO S;p Yy'=H`V&L+ (%r윙"8!s0AЬmOj@Dz\ucQeJL7q_j# m "1\b}n61&4%@3!E@HҼ1YՒi$0Ef8lTs@cX ;̀ѲϋXİĘv@sɃƧO~统|W=J \b1k>Bq+ /f8m۶)b{)1x_?woo7[DtlMH)6)X2ImK)S8E1kܷʰ-EҀ96d{;\C삀H5SeS v2# Z,h@C+BX4M3*af4o18 ]K%yzwH^~/]1HT籈bFlSohzx[U1j辩r, ?NkvqNIHDĦ"QE)PJ=7>~CUPT>aJFVT:*47q<;<3Dh *13s%RhF6dBXD i)e%ف [ӄjLc(w}:=ɇ]8"HNg4A U"cƓ BIf` !zٌЇvq3 1MH{vWaO/_~K;I;Zo6>V )u-6KCwW~\3|IvDڶ1D0`pmk[Z yhD^D`Ӓ \Gnq x"2y$cA]C)d1`EyCƹjψs;OF8c33#<&t]-? _?>z"M.ܲ_Ƽ`A$#c %tу /5Ƀ Ǐξ\.+!htݿІa\]_795U|_=2J{[busNUɡ*X*"ȓdCS2ksD-E886DF hLa6_3aB2*aXSطvHYuT N)3z(E,PMbI@ ,iIvM]Uޛa6_,N0P/O,*IؔY>7?pq QwFIZ3Q` ~=ض.߰OVo_?ګw}˻aK *kb-S<uc<>:9 *+iZ(""WSIT3"U*=,xQpR$3ޣZEyrh'dj?pj \ "s~zB$ۉַRfLl5D@r! -9C<7H&*B1ˤM=X03hvϟ_^^^T('gRdbfbRM8@Dl*qqз  4M`/HOqn/~x&0ƭJ.)&Q"E#TJo/nVbjF7ѩa$:殁~Sh!kZChBgfgW06n}ו!rZ Ն%2w," ~tWWޣ]_8{|&ۇ}ݏ_w|\7ew݌|ꪨgdknחuyL9b vZ,炞e1qHLDRqƵX*۽6u ks@jX?*R3QMP+ $#G4#-Z(r02!4'^vFLWL'@\#@b-JB9!=sqߠ^'H#HFV9\HC k*M}!=Q^˼a8 %"pfc3Ȁ P{F`bGv%~Īe:MU '20k=ԩ*!JQ  f)Z մ1D33@&vQy)اU 1Nƹe 9lWOpXXEp\cFۮCQ!ZJMBp"O{#e% * %[z꺙o/n~wPWuKu=1ɸߵh4j!HljB"S[_?;$ԌDx[`44]ݣ7#_\*kdLcRCiPlfA#W/[r/kk7ڨ.(dbi#NR R#Ѫ+v]-86pwe:&i.I!Si&-u |#4[";{ot:O|4dfYp557{2D@C A 3vuͫg_>O>iͭ^Ay ec)C4iPī4lT1%: agYcGc8Cb&V# H, 9< ^HTYqں8u[L(rrJ'5'ӹ".kZg|owtubEqVUƓAfB3"MFW ru80D`*HȫWN#B@Te #FB 4"9bژ97a6?CLj;OZT^hI1}p]D E`E+Y=Xq^ۡ]\Ki/T3;r)9gm[$!du| T! M)pZhi&wy#Pj3mPX_q>uj =<[O~X2[?~xj̥µsC{?NIp؃s"Pϵ~.y?C&YV"D޻&8In`"D~72s9WRz8>O~u9_=5?^>o}=26zT62dP1G$3-h☊:[czi W{^]39_p^`ngnl q 6je˄[AmİQ3YC))+zzPND::|ZON#igވ9h8EoH_v<>q.=NB;x7{C*)A}ؕ<D iJe[#v:""%DЎކVncbHs·g(zH`vLDpҫ”Ȏk sΞ#Tь\9kfg]sɳ8/(8>|߾wb,B}?yϺÇC"" <1qn7vGM*M"^[349??#_4E;n؀l~C~Qj[>稫Fx͌~Մ54AuLޓCݩ|D7_buyG;QL?p*w2O]-2Z,tN<3ewhDT :ߪ$E\zu0E-Mj70NVknœ)3H-)ٻ \1{j>]hGB]?/7Ͼjf>g:j]Z;b9g3=??ED$_Bp.4 8bWa2"!3\=Dg}A0#G%3 ot<VѡDi{SWPcxooo۶$U 爼sADK !Y4P nl֝|Q&cB`y+ߞ-[4s j^f5ҾX_,>cT[@+pƌ ᓮ)"* gĜn &vn;ʆI-k$XJFv6/௒F4{aSJGͺ&+CUOT7a.*NNo y LjV= [azxq}f/5ӗpѵ~~kzO7?o~'YT;3y-߻޷A bٙYԃ/ 8BvZAlq=~]WGfŲB;<#nju))֏.dzg[V9_nJ,kRgdF4}ӟCs[ggx C8;Я̂N Bjj j}p*]kW{ɉKa+9vT|r[bjDDjz-q9Iu6|+wo_G}te`J},XvIao4vǩܛqYId'n䬃L |jFbZ]^1$өkM9\M*"TUS)Ru:UQQU9盦ef5Ms*"_g%& UC5U)} ac.řsN5YoØK6})4$"G=a ci0֎$?=1ǬϾ</?|ru!<8 \wP02F5A'ڍy›ZJ&@-7"90sVgCM q̥0<\^ݼ|}:@f|SQ |79Q'O>i/|׋JYՇ~:d-EEN촌D*[sP މ 8!Gp[;ASM UR4RM+uEKѴ|T7iEJt|sְA"߇eX: S%Av j4! IS*iea̳$fCj Gd4ejDcIԂ@TfDPEJ*0WԖRp1N* )$pHSLjȉ b& US#9dFŔb 糮ga܎%&F/~?l٤}rՏ~_}TL>_4MSR~^CH@7;DTKrBR"u|*pY6V+q(ѻF6]L8$ryywjdPaZ/:YmZS+]+9lpC;\C|y)w> W7rg_ꃋ%ff5  B j j H1cEdR4;<Ӿ[mѢ"texBpv M;@إeQɠ`c:h[oFzY)K #b5A(w]uhq8~"B n$51Ț6cBUjd6jSYw~Z=~n~.;ۏe(o/G/^]/.눅6 R:{4v_9~cS(5}v9]ahj(ŶR_ e#FWjDŐH~& xX*Ǘ R=Io NX턳U'&hE S='22x4r Bj:y(btESIwRmXFߛS ’4: ^sriF ^}kh Q%*j"␪x~,Jr9'Rv`z2WHHD"EU&D}p>4aeꨢ; /tp7qSbT,¾=;w_vռdń#i E !4uf:WWWҸkC`a9!!1lkb0ma88"cXr?}uf׶M4)&!rFb&v{缪 ADtA*Zr)hѺ8ԽK=1#Qvm;U-*ι|u!2\"9"h%crDUc{h„LcއN@1m&x!x~ۆrZT$SЄ$!P)qz)D},9Pbtd3aR V `w뇮  [SiQ!E"xJ9~OZyQ`7 !ߠBv@Q>6fW_@q鞐#0t'a]+l,2:-^&!m';*`@GȀݘ|Y>V{,04!u!2Q\J.u~~Nx4N@_2T1_߿~7W]Ro }WQj6O1.RJxJK]}3SιrT%߼yb˒RKښ) . u} `yKmUMcoJ)Cߛbt!<\JQBe98R E$ǿD=r:`1IN<|[J)c"n7pkMvHֽ{xx8l)HXXQDIVUð;TTq$HLaG,͔w}믴OyIg(A%Soξ5\#,ont㹡;;%'bT֬)?Xd<"o8n`_⦝k>M}xFm^ B?   6U26}&xA*Z[HBY [kᤛegt DM }WA"YoM\k!+X5uule)xYte-Ϛ!0aWU~wvC-K!?>}HtOwWSOax7ÛR7| xe} ]`>,4MDt8>}4x|ǮCt:T/fVJiVZkYcHK>k-Rk܆JB@j QBm5ua mV0fI~_zWGm0e|5,\miCPi\v]F !H"Rxe<55&N̼,KkeY @[ZK"shOo/~?O1U: ugr:mBL ^AA̘[QU'GS#`@Y[HVwjthy$ėwmrOV+Gg(6նv_i_bXl(~;6V>֨&5yϓGfg~ : #3>+{\#3ZsZm-VeU[kլ.^LĄq ^ХY؅z]zy>}<}ju7w^*y^HvwM{^Ģ g|~<]eiRs,?ZjwÛ!FT[Y[c$Bbw!\e? ru!".?M?MjJ2RXd-j4RJ4i)-^U%$RCbԟ1eէ6mK!祴Rz|z\90^.^D\=suDD,5NO<1RɅB̵2.K織Z!zKf !ƍCI,b!b)`h]Zk|wDBJ,!1%rn$pdz̀ĝ`]:!*"Ud3<Wi'VAI7VtjU *&?nzձXA)=?$0xi||퀞'6^8nP.!l -~j:Vl5cm[d"V[KU6qAeܴ0#4JkimZ[+.@ܟRJ-i#fP\ۯ"ZsI/2дݿ{eCHQqxBO\ZǏ?U ^ָV[?͘a9_.Nhx 놔 OO.ubw<왨Ւ%PJ{x㕙])u0DƢ M-܌̧o3+q7 $%>x^| 2^eYiաE$8N C/yUncÚhMqy4?>~:ϭ*!ZYXptWF(%)(Z[oLi{"<1FFbVI`%bVB؜[ n dV  eH+Q*B@%2|U1gC_`/3ּ@ћyXи i+.d>{֖k=q} ՇtFik<~'& ֹ*}9= DD˰X"IDD!PC"8DwŒcM1)%^MxQt]5t`'1w.?鲿{?Vix#0t-/L:js@ִv߿bB"S17ղ.v]:bj%q,O"ɢ|ZQH-,ժʹo$ʹՊ%Z]׳0t]DŽ$8t="zgL"G]i:K)WAZm}!&L1͛OWsi^=@jm"r\.牙Si3jSs2CpU"ZkE\hKJ)5Rka-]<Z뒁x;_˼h)]%W:/K\.J!Ԭ+nLĶz"x" 0" "NL@!$jHԐȐW_Co|Dht>+(ş;J~?A埑gu)A4UF"6NT[ODUM!(XAL U1Y5(EQSShJ%k+  p:jl~6"&Zf*4m6FDFMDR=BL}7%$oԢ$1q$EkrLsZզ$t@RuU?Xk$[Đbd^P^ǡ$Jy8ytth]R ]xi~R7^.>}JQCXe%K.R%"@ !Ĩ4) ZZ[7ð5 yZ Y4TyZ!d$iH<"VIXMOS-mߗ\y~S)u'ke7PKY.S`,822 \өQ TkVpLAZ+J`Zs-K-5黴BlZ5_nOӥR]lh -u\%>w"cH!Ddb@! U% r 9W? ߤ@+@l3TDGM ؐF<U4tt|B2DhlVyZuktEn m@6:!}gLWADH_Ιm vPrݓ֋kk.6jsjȩp_7XW]wL$@&|+ < ys%D2US'| gwjes>k,d`ʹ ZU; ç t#Kခl7o޼y۷_5aB0Ǽ%/eT[!VGjZ{;"Rz7oi'@)u&3"nio6kOK8 S^=WӼDWJɹRs^{އm@['iZkH[~ERJOsnCc/pH !<>>=>>20t<^S^b"֐)i?}b_l}: V$;.vK1F<}rGlaEH1!mz:ydcL1 i$%  r.zPU Rr P]Mi%W86/spn3?sN1sJZf 12Nx@"L)~2M[a.q @@c$&@kAZWڳc"~}?~fv'bpR"f2Mhj-]W >}zJ}:)lQ[iVJ'exֽԫᥗ`g*ԱveF>VK?7 $ܓj]5kVp-*lM .Cj7bVn8YZfz\]hlM(I0gdu,A 7q N7S,K9eyrUсv?$> Ոf[-_(!лCU_s[_q|}aFZܤD(Վh! W#j`\J׫u?R KC  l_&]B]׹)J[@RL U#aUb-7\K "eS*<#cL)9%k=r6J+ߍ#mM9ό&*#CR0鍥5mkE)H pps5PkW0Z\QuO*{4Md3+9\R)x8c}?2S):29Lk:|9/433[?[[Lr`cۅQVÆiϑy11W_OO!uZu]jZ[3U  a\i55)2_g]wd#T0g~gʛֶi/e/BZԧîwxs80 "^ A[)2⛯G3\|uc1&_6s;7v|?i'lm$-O~$F9˿UHZsrOOO6l IDAT5 NO#rl<<6@ysǧgv z~)5FX]\hN[Enk3}BXc5fRt'6U]]5iSTk+dϔC],)fsY L\y ; :ZesyK6ߵ;l1<̛tyj%BZveu1O)Bu|>===ϧZK|>%ޭaVrҚ _0ZlC nP 05qH2e~#K Ɋ,Rkxx¾+].$Z=KZ)5t{$tāC6*(K)vֆ28[~ЦOwZ)eYy"גy.n(FDÛ7op{>K))acBr\޽}w~;OK(@A m ^s%6}^${?W1>m}ճ5Ot qHs,7D`̥qmއ]7@/Xoik[8m _閸Y}:8mP}N\Wf ]<Tms Ķctu_ 5φt>>"bDBH) +sd!RrˆQc1 CRTDզm` pι Hl.N,xljXxQ)9>bLTT.sK^?N1ys;cDEd- YJf C?L<{sT!vWi7jVju,yEe,cpo8u"81p7ׂ$upSxgs9o@"N]'!K 4PmcY4/g091ׯvbLaH!RrAP6ͳbDR+1&>x}3i/dDK1x_DmuU|&{K5 5xž!l/f .ùϩ>/# ͠պr^ܫ5!D&B@=?9aע̥@Ֆu) r}63ի"# 6(1T֐JmE\ ..v)D!FR ژQ$0E΋"֖VR*4H;En S$LZ ~H1Q]NO 8*S(Kmw}:ww\FBq@%>}Nވ0Hם!檥]?DY1u>b\Ki^o|4xOeK+rܴ9Z !|9%׮2S(hma˼*]$*w5W->}XeR$:Nb`Ux@Vj+bZUZUF ,e#VZpe˘c sFF R,%ԬK- b c$,0R%q<.djUO1Oc]}J~zwrB )A We *_MLWߧzn.i+tRz!fVC5vf'(VF`h  bV/v?՟!R? u1FfaUEWZ^'bЉBTc3q}m[πX]eTk="l! KJ];@88&Rrke<(&%/kf IHmh59糺֢("R[=_.p\) ! ZuuB@cbDT"oIbLp88DMDwwR ZDlz  =1y[Z*aN1VVU335ĉy~6/EDR:{Ǻε;me%/ oXW1ijUAK.t7X[wBJSmJ`ƫ;>1][Bt9.1/1Lݤ@lk}۾B9e_uE@ DO?„٨m+tALU3`QcWfEoQ?h_+Vu6.G+UOω,DY ~tPO3`Kj\#%0"okMD5hOOO!ZI% )~KjXX\iป[\+Rku;//S4e.%WݿT/)@4/`DK^J)őMȾ:|zz@ǰj,!H|Cת/'Uup!37^]؉"6SwMՈ;,:n<÷l9gM.ˢVS%0= 8Mp@a6コRLo]8H+|瀺=:Aإ`7 ҉H˙!I9+f~ !8c#"(,|9_իor>bJi Bd"#;%Bb~AE~v?<qZ,S2Kobo7z[̞_l MOfEtM\]5.$W̺ DRRyC`jVK^fer~2y~ՒK.t7ISL f?zn2wݖ t|nws5uMDV,ztt7|NR4겔ZycXP"/t>8.#KT$mx52@q&-sܔ`UO[Ru`5hΗFtz\,L,|}a7b%p 7"'8}S謨u@b`vUэ`W`Z=hwnHce/[of" #Bc4B"lPUzt!v>-9jUůBcAYIDDI6`z=ӊVu U^v]bHK;D2NjP󲠁 hys!2~~i󼜟O_{R|߼ys8:$}ݜ|>O}Mӥr5lr̈q=.ۭ1e}\-BpM@vj8 bL!t'յD||jeB^ZJ~ @l3N "t!y5 ED+WG[<ϥdoUMm)ǻ;D,@[/OZea'rk63"6/L7~DRKJ&()Kp:-mڳMF:ж~2'-῿Պf>z* 0z$3ԚfNbq[߭fL7ƿ?}5yX66 b#YLKHZm׹vS+9g$֕|+VDaF @stk6O5$|xz}}_=@MsYyt5ga}4yy^jbe#-e9/)%`)~o\`g4$ֲvOSu3fD$Ӽ4ӧV2zu?#"HҊ_ A߻ T1)2Ř!"5U'xE֔Zi,7Ŕ i͎; 8ͣڊ0]}&CXUnp1ez%}Ӵ, pAwa>c:Udy=?". 8ROǏ1ҴhZiaNxxuODVo­~Dsn$S|Vw} v^z(<{Oyu$韬 ̜Z&mSmZe>ҥEq"\JiKə<^0mA1 dSJ9x[$"A~L[1.<>>ֺt(Si1 Am !>֚:@]ֻ@lݻ#Jι$CC ("Q!k 6H)eЖEum>J)qպ6py*8R~KF,0-Mڍq;{=WD#  5I21;|o?}}{qӚ(5R 0'DV tf:b^6Xׇ ݎh6Sh.OP )-~8 fMqLośI*dfnv\a; 33ea`ʈȴåm xd͟ȉv1Qz;>]VCXN=VEn6n[„YGumEz A9.CNk ƫuD4k+"vQ`) HUhqd{bu˔k0Gf,p'tzq>iꫯҬ%vº٧?Wջlݪ/}6bIJ7cJZR55Ȫif`КlDtr/D.ZkZBuZJ1[GAJ9jd{-Ls*6Ј;nf]hƳ 90!CUCqO0nnHBmLp8"Ax<޿st8 w?_t>,mYWSQLF8K~}zo, q5f@v%3,4L IDATo~ n4rDOkGӇ-HF<9}<d:6y[{W5o^>nG(Pp} gPٸG;lKH[meAhiO_xշ~rrx$m<A|T[e?$1ϭ(ð 7KOUOh׸oU|(4BaVB`V^z[-T4[Gp}#ܾJY2i7/;B$ gI0, $;N[`s2F!j}?LPD!8ϳ9`Xz1ګAmj˥{W%!c$MeJ?^Sx:$)DHֵm]X,76swK V˔sJׯ^^EOC .dS> _Ⱥ_ھm'*D H C.GwFaok7e8 ES`X=D9 1#r)%vN$9u4MMDN i:!<@D̖eaj,7oBce:|e-ݫWz5t9 \;3r^IXU+4|9[!.ܝOu#2t8| 11ʊO-L3RJqn0Qw0N(Ff&TX8M޽[j+#%͆?q-˲I⁴eVlޙѳYK1E콏*"ֆuk]Cs Tks3 @mZ<_W^%pGYyYkNvE__m}a|)7_~?\ yY$F;y;M6 +7x1= M%/ o8ΰ>̘̹I @=e cbnei CW!m ic"փt{s(sV1 433!]PEץډ0aT캿6܅^DkK%ʉI)vcEum}B,4xSjCUD)@ sNxjTW_rh+m{\|4rSHl;18[ѱ+(t<;Тswu<aw΂"歩RJ9߽^}[@rv`CtSDt÷r_>ݻw'>H|M4tBIPfѓ!oA)~s0~cS["{99p-IF`ؑ# imZkԺ3$YI( g2ru@,%w:9`9gk=j :{ nt3sC" NdM9$"]]+XF_B@``eJ\D&4tHf}EkL9qJ@`)zqpn.*)ږ,'d]zJt>8NkKqf{:.PWEGTkkIo9Ҏrx4M_u[T #u]C)2{z,MQO\x8Մ*kc̒HX-m]*R/LM-IR(ĦpSE㞈\OLRJ"8%2t:_KMץֵaS"={7^ץ p8Tq4HݺP\W(u]Z5sm>ގcݽkmQ2xnnvzo:c6?SB T8%JYH9R.6Lg^@!Mc9tsYՙuL2 ]u/jWE'tu]˺.Ws}mQ Y(.9I¡bfSIEKm".B\X8|ןvUAYץӲ\650px^cdo\a14Pc`8{럤A &crGE؇hTNzB¼ST'„̌S Gnms=v 4"s_rX g/gftR~AԊb$$с$# sZ nqU,d,ɦuC3G%!.t0"0Kn40M%猝y.fNfU+^̨CֻNtdPudu3@jRU-m,r)%ݝgw콇|,OŋRz]޼y{N$dC8SDRpƛԬYPDI1t1BxF'#4dFDw 9 [kz]FDЦL4 pJɬZH$A 4(M"PdfGh81f7e6Dݴ*co;AWta`Pz[L9@M=:{}uX /|>?o?w~|UyzY4 7Jżi|C5S!TQa=[zCx-:6<H)J9\%'g   aX}c3oLͶFJ yfO88f9jcĴL!k$aF< 4J4 bBr)e!^>Ljm1Qhf@B&{ ZC݈:4J)2Of J޸*k]!A!̃1G:4,l1 1~DДdP Y8D$Lw֗RR'!qW1Qn96xE -aҀ 1%l4"%eIҔJ*S9=&ӝGcDeJ )D|K(:0y G%ɥ,= C3Ќ{ #ec6\:{; ZktCāf&T̖0ŋWh[HWMyF7SMLm]qDLI/^|[39{2U~JCDQ71o!z'BiǪp>_%^Lڴ~7! ZyJQÑ΄3Q:O Ǒ*2n5A$\$ewh81dĆAD׶,pw^,=q`mw­bD3 PNdum?v$%rN:parN` Fpw?f_ZWf{y>2믗O~?].P8յJt6k(7ŃGm]8w0E=I>> \Egj|̘)M/S.1kouݤ!s$0Kw(8,^i$\DR*9OLbؼ͚6`nU@LgIH,KJ UىH[W V뵷ͥo»oY$ KRE9Z뱦 Fڤn1$E, hAE\ꝙ$"9I _ZZu5"ƑC;a\oʞFv]x`{x{n9a#$,%NIYX( tRJF.#U{ 4l^dN<6 =,+V1O7ɫC;qAzjAR-(D 2!'!Ax2Zkk1s׮ڏ#2$M穔 k|)O;1O<mݻmuN]ko-ު[FYˊTc+$i*"tuJ,xzֳ{( 7N a@ DD)L51Iy*P#lӧ^$ >E>#/6# -@EmHknɄ[jRJ1 ֵjLTFpeo#(:8qʇ"'G^ERJ(+e4@D/oc#AYҘ!Ru3}k]_~pmqY \޽_JnØ%)`[R ^EġƤ`ؚJkS}x %fOD4͹A,U>y1"C2MhnjFH"2k!oF$"m=ҞMrM4 LcH=aP#4Ndf,c]"\K s·8BR9!s2%Fu/_}w_|!Ns0ʘfV=b??y9憼_c~ G_~+2Ea ɻD8F2 wEWAODˆ1rT0JV>.LG! a&JL) Aވ͵(2d>}l \#koiWPu&JRd$vnȆ,KFV޻uUKpYm͐I;1HF&ifk͔PfꀑH^:͓^/9[]NC{3>f 8LnX a:Ύ4!|8Զ"X.4' 8RhZy%&\ \ҁ)kru[~u% xL]) 唦<$Oa45pGĩ$NL좐8$12ddQ`GЈ(djaFn-O9e),Ō941o(g^ͪ 0L$s,$)@nkM; Jf&pj^ݜ3A"FNLY2!C I$Bn@)129!Q8եxvY; o JR[wLvmRz_}tБ́|`.x:6D@!!'񙄋oDl[3n=tz"#p08UֺvU"ļ{ܰ7ѪD8.D !k gkȼU?#WA•hԵV]b:z}4w@@wMDFD6.:21s ֊pJe4EY;~RbI9 Jpwq jwua&ևuY]8@eSPʌĽ)2!9lA6޵K2/ϖ{wo?)u k1f{o} md$\rx%Z_?OPu37o|3Fo!z657j? nP3`X;a]0  5ƍ067 mSwYTMvmjw\޲ ɷ4KwmaDwt`׷Y)RYkպ #E0&@pS"`8{r9% 4D>JxkʣWsMRHn"h߾[Wt#VM(#QowqINH0p3J9\ݛ˗iT~^S9duu$r򮔩Ls(w;j,G#{ڣĔXƲi^R24r]kg,B)%bb)0M` %"-)3W5rhuZ׺Ժ\/VU^R$NY4<$LLȒ$ g0pxĮfaC-ERT,RG LO b#$1f\/׾ָY0tw>?XO~;~0IMjo/micĵm7؍P ƄҾz IDATiM7m ~fhˆ T97B[[kkwsStw p_C%@G/30@tyӈpP!Cdvkx&L=,Ѣ532ACUJ"ܱEN:26t<GTCԪujut-KS~^ ApC]kAzY6$rk Et:iUmn#1MSk㻷.XJ>a:Ob몭d( 63!4~l|· NI5$u?3Y#Cwz^օYU͡wOzk- ?YaPBzt"7e)R )u@D@`6S-Q7@SF )` pYDT"mU0bMG"LT Y_u׮5Sb/np8\BrCMJ CL뺢{H..[ e{ݺ֏OωpudC 4%3X{^mlQctus0 B}cL!şS^&|~*l:y)m2] Qogo쟺%YC&1ڳol[9l]).{fDf$9ҘV0$ġK)iH%3F6au.׋Z<VH$FIeT$C|eD1S1f̔K?q,-G*1K?G!Ljqbct8Rʒw/``2o_o;\D5F\X EXS_F9|#f?~T=9vOI;Q $oh5Aҋ w6C.cBuZO@8Z@D@߳Yukۄx6&eq ?KK"XY$~$= 0I2^;Bp>!5˹bou]ZI̤vy|0G TھH2pI%w7yֵVLHR\pgI1Of"PU%I7y8j ئ1 cΉRH0DgPsSɥD{JSVXQbaxhͼZ[5Db8sv y){jn8 1;abFadȃnceHcrDc@#D,9#LbxAX*i ŹǘJfŗhNq%$O"#0 gBt0'hi5C_|۷p:uwK%# 5 y[/vR?Q~)>ru`&w9h|:_ݪc܎W33kb^Tg+O$R۸mimcު[w3 zct0#U򻎅K˹\|;D>x!2p`=mHҌ`OdMWDR1}WO~w޽{.;zS(qg‘z[7)󚿱ǿa?F]zx #ܜQ؝i Sʒ 3AbkӪ:iKlР8zc#3Ғ]UZwe!̌019"Q"Fu]C1p}:*2 ZsU&tS퍑Rǒ7H>uX{Ws,lnH8T&s굶Jz]Ό"<\[[ā T%l HX{QwkE %pnhFnz]\;"˥kO6"VU4\&TW_WueT;hS.'faۂH_|2D2DĜDjRk>FP:XwkW͚{GrTnݵi[u-#s&b$a sJ 9ukZ;32:Z][=vkŻ[(AGjoZ3@\#7-Ǒ852s߄NJe~pyg>G'o)F 40L`Έ!,ڨ(MX=f_GkΣ(AnF &yi<}$m?Ã12e_ 7?>PT0 QuG&;jSE:&7V{ :z. ಏ(M7Sծ/ > 6rDdd".$dЬ^[c8h.!`f6a.$a2D޵Km?yhEL =L`0u]/DDM;1bNZ%^d= ML7)0>SfRDvŧ 2 =q}C !CN%"5S5pql+FۃCy`hש1BIgc-;PhzDW<-,DH6>Fu]eZ/n=/};x}O͟||xfYZkkwb! 4R\'f# 01߃$Mq,8<}3 ߷<1$#wV b0dVQHJ94)֫6f 9f;斘ރBT҂ִހ(˔$3DDs(DeMda$ѳEQ[41 a.^ VvSJ9xAc1RY#C5H&0nCEM#F3rC=,#OEUIXPّb:g>x# Yc{vlS6MA3"~j__u_ڿOgɁ[4̒aѥ+clO?aOtCƟO`6|H@"(CT{ E7j{}|3>y2=٧_DVTVʔR|v1!m<>Pp%l}mÀrF DPk7 ֨mW@9Z;D)%MSJOu%!? J!ўx/e,Ld1J)zZUTx>hRp3 ,ޛyDO6<` IRɹEz'˒o?2{z^@JZ%> B$e AѢf G(h![ %$Lwu{NVfS5@ zzj=7s?-$)ʀҼ,9 ?2Q3|Ќ휜 nzlҼL[CplZ叵nNm㙄27ɑS,b, 7 bV@Xx^chQ궻5F|z/ڪhKҬђ~+Wo[߹,oʪ]N_4@/R[S53cn[ay@_A_N"QSu&f2v{~~nOv*>eTQ|*,־yq)KNڮQ͹P& #E C!~{ Q,9"?4֓CmaM)s-i^KR.=˺.x&Uէ~hD #.\3LJmď#" )a,5BXS7eYAs^뒳teRJ E.cJK.(<ܟ2@7d)?BONpRMV#*8܍> N/nmzC*v2L퀎GfcuBu;mx@An-/lf>ݼE F0sRV ܤ{kZE8t纇u^ʲ5%&]| %-~_Տ^ވfb$\$%wr -)RRuSJYaaݽ9ԿSm)ṔT~w{/C:DR(~Q+$'{Kp;ޡhÑgOIf5N!(O@Q7o-8A!wʯ4.e$tE4bv$F_xOo/UIU",Kﷷ?Oß>=ݬeY~T0h±W_OSW>UI%)٣YQ 3abϷw[YU_8Q919+4fE='HV"Ee ҼZtع s1qCkcxPNEoI!ݪ qK䍼yN,$VnrNA=?P, csv˲>K$I!#v (kzq4s&^ʒ2>|}`2$)7huT:3a3(:Mf%NbqzEq!})"GIŞ#+f#/-˒{;)$GNPQDp7ۑNи*$=W9sk! $֌ɺhPSluy8:R0 &aw>므Dj,E%_ּYm!ruv^2e}^_ow KJ \'[W`!տowE䜷m̒J*LFaNȂ!0M\U#+EV }ڬWV~|xS^mߚ"=u,v~3L~bi-JYTӶ݉h]0Zs5u-+9BLnFukͪB`nͨȪ9remKYUKE&!&"=p]L9-tVzaRaD I 7(ICE %fєAfvƀ\^yDG#7o`{״0ڼ )w20+4fTKY6I@5jSNʚBԉ j$D$" zH4eɂ}HY# QN}OsEr"ba oU\ϏL ۶?źar{+_>OozF*<7zGl w\!g=?r9O~"IQ/4H}x,Hx(Ve}ϷVPMe]/ BhP̈>AB޾%SIi|, 8H=jkwɓ8t̜;\в2ph=6֩9=\zVM"bP?asVTD?ߞouR\du0i۶y|sJ9-KRecJ :Zk{;|0rF8H sJHA^á#CE%UU? H%H49%щZ9; wd( `=6c5=w& 8@ 9&nV6237B{;"j26NׅJBIIi. ~)y: Fgvt MV1Z..S<5au]Q৔mW~~|APN0h᭶ ,IcwZp飽_M2Q :CK Ѵ'E$ wl5|ououx%\ErrS1dVnBjуv:հ7<%=O)F݈p4QF-Ǫ,׬I]w=1"Ud'&;@" ]V)<%%oOOO̵z^#}xѹ޹1R4hd!]hލjQkݞgZ!8,*v"*Fj A) }f[0 $'7?3`" IDATcsV%c ";ZGJ?AQ'V?N^zܠ1G}ך?Wh ,0aVnP˻Z3`a('VW -cD,HC ? ]^vŝ CDf'|wk^eћ˯_?7u)yiKIY|-+KrNN>/ح*o&ƿ%s8r}&hbF'vk͢9 r* "Oz%쭥$q}$dqtT9/RpN#=f&NVDs^:r̻~d),ZGOÖ՚B$ψµت*}K^s)=5 _%hkͼ%G d>Uk9JIP^vh#܍뾛!0[PY >3FZCH >x|(ijر{ ,RAd(uhVG!BPkC4Ū=\i; =0*Zm~o$T駕V4(%(TFMu<. 5V/Z#wgFRU9(+*g 7df1c&q7e{23Q0(L)S3߯SɉZѯmOI/ǚC)}Gw\Anjz2 T ǐ\RJ[5a[Sx3\xm&:k3oV< R{kٰ݂ɉ% g; ~!J/U2Z97X co4axmrdFfRx7( %(T|A, buj%vxrvi x̄S?hRr2F97G9~$N#ZE脋圯kI?=?=%KO>y??ß_YO> 3D'ʯ3*՟SyM$ u {}!QU"J>/9Z%E~yЬQ=\]Q [)^:Z;eTN]iսT=N&#X9W !Dj̘HEʲKƁsFGTrI)(-ܭEIQFHʥPm!0%]R)qPpK!<0Ǝf $嵬jlrI$ե,[m }%8mVk=fІ* `fdБ4@')86Z zuVR8$ؙ0fpSk X$Qh"&͚KPdMi'KUM0UE̛!M+kH^K^ ?<~.Kk 'Ck,cXZZd-O/}KO>޿{޽,o>]?> )k G4ȟ4#|qUtk_̈T13K\h*)-9ќJeMLrf ?܀27x/dcK#W3G&D*Na-Zr%2:&RV ;XkaYC*I˲ H純jnx.v_8ZkP\rk ¬fsNEZO:S4缮뺮5""5%Zj oxRBQ{EF,8OGk=`YP 0 zF|Q栳YU;B,*YIYA't&xzE=GP!Fz42AC7yuSa3rƓH⢇x:-K0UbLI0K)lQwwok_?~cD~6ͣ(Х?$} 9rCR>H;:&}hLQS]IR2@.YHUe]Zk0u~~ΊSU.%*R^e]!.mV[Pl ڗeef$l'+e ᥬ%H2s Ey`fض 2"Z5笒R5^9?RZGAf6pHUâ֬;güN,/x;KSA%]AqB&1]P C5nUU;I (Tafim7hwZ4q%1q8g2 }Ց/g\sG۾ oID$$*4iZ?|t}Oտ|Uqc=t`bE ~-- Iܛk5K䍍fT[|܁ 'hc98s,"|j0&lB朴(gliRrI??E3՜)/ɉa<K^a6̪NfQ]<NawShRItHgfkA!)U˪y ͚е/Z`rjabͪ sk6BC( #PL0VǶN $U cwehn 5QaNDJ$d#TFF6ffuo1H']]JJ?|Oo/FRMdAVѐLB# v^ ^pG6 `~ANz8Qa>>‘0f- Z(EB=ptz.wAaSpBN)-e=N]6ԥJkt:4Ј-:w*]QJ)*"a֜me{w۶;Z+\Hsbfu}@̥t۠N*,cWrẃj{ݑa>"\MXBD|Z.y@9cډpV) Ny=V]rKG4lJp$ Ř֝"dƦz@򤣚5| +>`oFN jEYЁ:<#7EgXDr}33MI%_Ss◾mͿ?_p]^J Tw'HE%B$#]K*IS{!4'jY(t_q.=A>{ifLkfZ9ƬZJd,4nG ?CiHvbdZb2|,_(&J%,벪#9%hխ su߫Pɉͭ%ܥamvGa솪j֗e),NS)d}o*GU=(f@A);y#0ՄAljZkmQ֔R4)1LKR3G8J) )gyk_Ώlžl@:Mfh݂~q$r@O7ϙAè&?a@ DDϓ  ІBPmh odN^E*\]].2z 3i_UP)yYƢ<>R;}^/e Q"W="?BD9=ْ- w^)H83%&aJG{`y̓Kb(/٣4gl"iޙb-Pҥֶ{Δ%fON6$ɍlf%|bN-wIDZL)>ѼDiBcTŽP{¼_]YRjvf~6UFWqZ3v%+waCZ$jVjh{4~RJ*9d  ⎔"B8&̬"C3]?9 mo{=}>;"NA 1IIs9B=g4fC77/vh"FS!)~zBΏЙw~Ɵ:bأKվ?bgV06m(4BC5"[ZDcM8cSأq%]ĠI>$rL $EžmwsZdYSzÒR*Keo޿7~˼ǿwz|||w7{U)M1y FHke"JW"GڨKcA~,SU'C{PX"ا)9BN"{ 'f_wn*%3D:RHZ82DF]<]!ѓDq+32 4 p>>3Mfvݾm{IgLk;J󒔑Z˲֌{)3͌'∨AdAU`?Fsw\-𲊒p^uajNpԗʥ=޵Ĝ #a\ 1Hd+8r96]o}ws"gĈ18hgB9R1kO\͎{/':yBD$\UIR` +}d7U*r9RJ9v~-K?ɛO߾7~g?oG|gVabsp!Y% 1{?46: F0!3/щx8ziԣsobdM$6*~ԡߙ3s eu_xcRHgzR\?Fu&vwZô %$~dPHNSi%ĵmyX.IPAqak939' 0n"mǑ G(?"}H,A]).i@͛ZjkYsͫG oGkf[1x-F#sEO*˲ۜaLyBF s"98ܓPhlc8_ۙ]K'vz!9k;;fvg"^jમԂls9Xb\<x.I" )Kzu${b0sJslo۷^O>.EEh-g~og^/;y&q7̑4dP>Z}w+~ Yq'9,1\;"]Fcм$U U0JD*,,v,DH$yF.XO.Y˺{UL 1#xNED³:tZCύ3 B(0^ k¡-ADQRV !)Y>tTxʡ%PKGEsH,;e^JIZr΢jf)j9Ubf^RNə-E5lUS 'L2>3<!("Bg\cfܕN{t Llu{@I9,h" 77]("C9*gn :!@x!zD9^<)8U .e1r̰U@l@m*9*vV,#¬Vj5%Q{w21g$VRi\o{"㛧Ov'_7o_o?B\wZ%; dCJ$&%l8 R(Z &M4G[Y5"f-*Ul̬mH31 fFswym.@_kZ?G&I܃Yk:߰C:TM$$H$)WswG֣:`zTꞤaydD$O_z35R AJ^+W{YiL]1a8Zk9l缌!s ~3#}B֨G(?|:0#TGx~nѠyޞp#9Ԝ/ͼH<{NfcFxD`~wGr=^e|ɏϾƖ\!8o/mx"Wzy?HҺuBR/P{USj ilANNjF2$9Wѣ?PQb}AvT+qzB\D5ԒPgv;3%g)Gpk-211YBK0;(0!m^ڐ;?XͥJND8{uU!v{N/&"-ܽVSQVfS?o)lxy&R9F2zQ<~txF }VqO̩sf2Ɗc*4#Blqy1Gi>}⧦5OH+dIHxdU2Ź8xgTR☖&bK>/gT9~^Ӣ~JoѿWG\cS ϝ]-)cwh@CG!&8 vxT֘et}BQ~xxbTBUQp' IDATaV@j03מ'G#þ0u#Nf Pse KΘ2w=e2A;uRsn~4nI$EfI9 f.E`kތpӘN<RϋYGg8v ?̱oRh=DZ[D5^w]Bqj0ʎJa֬5pAy0t _ypPc<'\N1Ć]Cgz%֔00C*UhfeN$zww6Nֈ)c:Gžau۩Y4'%=8R"}#ݾG_N9}w{.Y3?ƻRnnda'($J^4X1O%Λq`TC? )%%j{kfmG;c;u&^!k'}F~B_QFI` f;K`Ay};rv{~=?+qoNE3;3FJ"Aѱm7 {j̉^i\IUn>'"5sm۽%Վw"%Gqzm[#uhGim4gYwGn?^{YsUrmV%%)Y0/I5l{~~x|?owoM ;C3>rfʇrw$L)?)s\qKMHB*p&.IJʽUr} Xhg"X0< JV3ՉXfp0,uOL~6@yجDjIU"VK)W*r6뜙w H𨙛 OX{L'^Ҥ)sʋJ,Ij|3;2>zE~b롮E$M*`zɪ%-\.`V3=Q'.j=V2EDn՝Ghc3jJoRZ-\XJ`KlM̚Rkܥg`8[Pv<۶Y̓όQꂬng9+3hsV,K<5 x% C"dMr&¾YaW53;/#LR֣abE?dOt{utII*y:OU Ixt.9&*5qc3T!Dj1!m5&rrf~b/4lgXƘaXk "80jCf>9B䈌Ng"j-iwj'w4baN,tz."(Z7V.lz|~P?Q ʗגס}m M\Y޶ o7p\>|ir>O{ 2&o !D ¥hdn{X)L,N~5aʭ5sӏi۶]Wfnp5߿wSJvsIݟ,DD8 lHL8IZiUZ+岊Hm MEŌWp,|mIg<^8,X#P@@'"XH͜ݹO4R_9q8PNΣ. /a/Ciϸj|Rk7{AIC\+d(PPp$@ 4lc;FHIuG+{Ś(k#NVxe_;h0HA5z&N7к;|imʻ2dl$/ײ**~p0j/YSDD } an*.x^%TbQgo=r &) 3jmSR !+Q )LJԑ{$,%5C$(Z)PW\"KS]<~e-lg^"VOB\RAjݫ{ꢍĴq}%s#jN"WH~rYb^K)7m4Ԓm*ݡsV jkTi VmmVwG)XjM^RJN*iߣ-"Zu:;}GX̭G3c˚ Xk{,M%x{A`Ms 3ꤪk(wΆSOi􎉕Y݈Sx :͘o(DKȽ9$)b3 }(<)S&bHI!,yRs; *r4-CNOZugrx+6̃;NdޥALd=%pUؑRqѢ@JK*i `?oV9B8R뾽ݞSJ~~ab*%%֪ۉFfQE{.cGX39pA69䣱Dp烙-3EhxL.I} П7^NU#$ ""Bbt-6!BdtoY9O׀Yk ҽLUkmN#Y8zF\)#9Ib ݎ)]Wkk̂SD KP {j߬;v}=DS.)j^}ŲS!Btu'fRcAݏW'3`H@iKs:_\JYG h Z}~~޶$uǐ9yADq s#98G$|8:x "Tūyk֪[t%#s.Y{#;z@Q =7:g@WоiҪ-O5i>xXn=km!ߗ18p4":,9^ |'7^-{򒎔<:-Xۤ#x%5b&r9䎦EtdcoC. ^J$=%Xc3,r-tseIAn ~b9h#&jأDBD.? qpe&`,!.Ǐ>?>ueS3 BJp렔^noǡ},`”d,kAc PvX~A֎YRz6fMDtQ5+|ζmc7o>|||̜v0ؘŏGqH)'윏$ܩ;ѣa*Mv`Rp'N|ϺWSH['t ?)JӉ0Uo>!.L PDt* kyp.­^.KT"avfaMY2.Q;$an8 s 1l=;4y_`l}`14Xx3c9Nf +]rF'Bʪ~vx5miGQ{f>0"9qjfmNMD:oP5 'U.KRݪ ΰh3y$T`ᵒ^<(ZCdY5FR ,fZ=OVP Fֈ{)޿J@0z# ""v䎘^|]RYrJ}۰@)wV@2ڈ))4aBs!t1gbԜO;QҀ-5!8>3сs5@ }CI$O-X ı*0 3#iTq:SJUK዗ ~TC_teZzNNjUU!~`zҾI7y۟+\SJJkI+yP f:G R|4Epɶ=l3oa8VeU,݋?}R"aX4 a3MHDH$" y!T9/=-/%1maERa tLDʈƳn"nA{wjG06<е}SJ!Z#v,yYG!ǡKJy^ͧt"/˲{kv,e PY,fݝ܉aaMr.)KF(j6ѣH/_{x09?cy}A6H/wnaAkwijΥ>=).]SgDF| WGywύ۹ V@DgPUJrԆG*EX C{&4/ 1bLi($%|5Pf@>5Hjq*#bg"_rӶvo[=a 8}^TI>NRf止:ᶋd; $"b7w**M?*+ B>ƈ8Bl qP=+fuK,cK#DIU@B<;AR7`)Tku'ږeema/5IqZ%?R f IuQ]ȂDv5nKw @)`PIax.dNT>Oulfei#s?CC aO7,xB!!I t:x9_Y:^L0u %ÿZg)?[C{A=KuhB╫yD! 0iRI@NJpk{9N@;Kf3]I$"bݙ9`&*KN֪Yc қӂ7@4"#eod5ldDy+Q Euݒ$9r4#iң芦 k;Օхdְm.篪23sUKjZ_jaҿ=-pot+{ϝ/A|F垖aZnec G :EqǃSZz;!jbu]?;sPP?/rθiU7:%0?9?3K)=T5"uxӟBD=Nyݍ{{8֓\--?' )d ^D {2Ht萭7ͧw'yd>3AsQ7P JnS2Ju`rPxt`ru@m-UA.F” cĐDHM0)VX\qs/,}y!vE%Wg%8%VVށ&6 j܃q|߾[=VVYj-RWw&otԇiUƤF2qVc'Q3.oG{-Rս#QJ )% @@J 3=kWE dp{ށ>cG74bwSbE`ULJHnر+(r^jMx∀&d-b4QiA{? l&EٔT DDjQ-Iv1=)$#{j<!84B8&I Ï5}"fG!vU)X=+ 51tc3΃F@%9@ Lt1I|i6LjET:cRxi]CYEDT 5UcZ`&~H7|sQ<@g!VfZDy8ỷ+"")Kjղy71ThWJG8Jo{kef䲚R(/"]Ui$˓{tq / 3vd2k+qj1GUfQFRAK.;W>m!T q^/u}IQy˸ҩڕv=x38jKקmn5Zv[0|e7$w@LF^ kvW&o)bǔ&" ~AhCd_r RX?G\ @?ff*5\AINy%cBn\NL[T7."PvV Zq~r+?o@TfH D+u=2(c֒S<3P7 tW_))s#fE\ {FTQ=Ҿ%ңS5נkSa%'(/R @f>"<_"~i% tE8P@0%y14Q~lrxGpj-QH>$0f~܇HH<™4!<g쫑$-cT=|AͿ)Jvn9ui Fh ,~{7V^j5sL~b*6zwѫ,#e$#DJ0GIܵ<_ٸ< tXA_1-Jֈ;k`;9lL[gwٞDbIgPqqyď_j/ӇY7Ǝ-WfyĐYz z;:HgGkDRya;9iIMfŋb͙HJg3#̲ʛ<`/:ʉ%kG !>F-nCIK&oŠKU,tE]Fp=k 9⥸nR]cxT&"l[ ʆ/[8 0B=)"8xwUe)<RK=(JVLmLEe Irly'9>./ s* Li`ӄ(-G|aO]Mz0 £e[DDV-cT(W{&yVHJ< 33xM4"Cħ Tå),y P(b) u]un]Ҹc~KLVM`̺ZqfīYu2^b0g<|Z,pC)U^YYE`fK*"uDnRǖ400D2l>/+ewҳ}l&!v{aeYڄk >7cƧDO%3v6|`~ s/m*LEtod#^r5fTG=gsojj8?y6ܯ e IDATY֝lܤ#Y*X-٧'f;fu:Q I“VpGp7c Chljt9LWOl?Wf>2䩬 3.t졢bRl([ENGo}ӽo@/Y-7ʾܗ*\\D'X%&y*)Jx\1O?W{٭orW6];CH Bd@01#rLAPP" KLXV&E!ʷ.c;y6wծy({|u描)y"j„y乒mWb:e!((D ؒ0£A\Ͽ#(dޕ(jMSW+I80'ǵ'8z`9"ܽcx{p2:[jb\8Y)"2Ѥ4'xX`eZ,aԗ!i"fܜ8P`p^Ŗ2E)EUR),F\׵X@0h̔ίtf3Y#rzfQQU y+LoN&+9}fۆݩ1>-(4 ax]`ja7:]O С'̈́ gADy & XLX%`RC~x~-~^q W "q-IbUՄ rj;cW*llvF0S6pwȡ2/E߮bƖDJE\jY!¥X-]}K?$$qї HnVs6J"\TEv)pT({x!:XSΡͺ爔;t'C"-F~DDldIK΃)CsFGh1ru9;YI6Bвc]|OiʹY`uj{Xݗ"6G[Y:*0N#R$ޚ Ob.bϳ]~%~-.Fz1Kg,?t Cq3b!LG6040;bv=د^~CϿQO B:alS(2MYP"0.1ؘERՔIMKPz!(@Li"SӊnbYGLw%ƣe֐e椘"@Tf)`Va(ZzyS&ze!/a%Ay@@ȶٖAɡx=qR̢҅IL* G!w+b߷_#"nVZscҝ iWfVjf2Ĕh{$m:\M;f")\ j{Fff`Z6#B!vW%u؜phnK.;K<1):8~>s_iȓ@;76oieX cH^HcyNu~ MK7GF ^o%]t4MKeqUǘ%vn45kϯò slpbߋ@w 6ESrXˬD]TGlْ9y&o4] @՝nq#o%`w8{92帛Lޮ~^<:HLpFo.JY16Geֺk.H&%ύH&P;{kNL>ItZ53L [sxzYrHZY ".Hó̻GΞh$H|0M˸ (3ӫe HCO =: Ƞbi|- oozfS?(֞A2`ľۊ{P^Wqf.^7}OMUx,eƛ u-(uȗ _ "|ۚ'KfeWrVq=}T8ͼda:7ØL( DL=8s4#ϐ hJeބsU0VXD}}!b >yNǻ>:aٚzM 70+E$ffM0jI5R6k"-I(@֔Eܸ֭z[BUMJQ "gDͺ@'rG< uHD{CR$n0\f}#c<3f:׻В>eK 2C@DŽ2- ?brao^Y(_G1xs[rq5!lƦ]@Aál}v3R')+cCV#yCJ[ 8;_83j |xC} {'cHb|[^IENDB`thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/integration/test_pngquant.py000066400000000000000000000007221452244666700340430ustar00rootroot00000000000000import os.path from tornado.testing import gen_test from thumbor_plugins.test_helpers.engine import EngineCase class PNGQuantTest(EngineCase): optimizer = "thumbor_plugins.optimizers.pngquant" fixtures_path = os.path.join(os.path.dirname(__file__), "imgs") @gen_test async def test_pngquant(self): result = await self.http_client.fetch(self.get_url("/unsafe/bug.png")) self.assert_result_smaller_than_original(result, "bug.png") thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/unit/000077500000000000000000000000001452244666700272305ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/unit/__init__.py000066400000000000000000000000001452244666700313270ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngquant/tests/unit/test_pngquant.py000066400000000000000000000045361452244666700325060ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license # Copyright (c) 2011 globo.com thumbor@googlegroups.com from shutil import which from unittest import TestCase, mock from thumbor.config import Config from thumbor.context import Context, RequestParameters from thumbor.utils import EXTENSION from thumbor_plugins.optimizers.pngquant import Optimizer class PNGQuantOptimizerTest(TestCase): def setUp(self): self.os_path_isfile_patcher = mock.patch("os.path.isfile") self.os_access_patcher = mock.patch("os.access") self.mock_os_path_isfile = self.os_path_isfile_patcher.start() self.mock_os_access = self.os_access_patcher.start() def tearDown(self): self.os_path_isfile_patcher.stop() self.mock_os_access.stop() def get_context(self): conf = Config() conf.PNGQUANT_PATH = "/usr/bin/pngquant" conf.PNGQUANT_QUALITY = "65-80" conf.PNGQUANT_SPEED = "1" ctx = Context(config=conf) ctx.request = RequestParameters() return ctx def test_should_not_run_if_binary_missing(self): self.mock_os_path_isfile.return_value = False optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".png", "")) def test_should_not_run_if_binary_not_executable(self): self.mock_os_access.return_value = False optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".png", "")) def test_should_run_only_for_png(self): optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".jpg", "")) def test_should_run_for_png(self): optimizer = Optimizer(self.get_context()) self.assertTrue(optimizer.should_run(".png", "")) @mock.patch("subprocess.call") @mock.patch("PIL.Image.open") def test_should_run_mozjpeg_binary(self, pil_image_mock, subprocess_call_mock): optimizer = Optimizer(self.get_context()) optimizer.optimize(None, "input_file", "output_file") subprocess_call_mock.assert_called_with( "cat input_file | /usr/bin/pngquant --speed 1 --quality=65-80 - > output_file", shell=True, stdin=mock.ANY, ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/test_helpers/000077500000000000000000000000001452244666700235465ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/test_helpers/__init__.py000066400000000000000000000000001452244666700256450ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/test_helpers/engine.py000066400000000000000000000027151452244666700253720ustar00rootroot00000000000000import os.path from shutil import which from tornado.testing import AsyncHTTPTestCase from thumbor.app import ThumborServiceApp from thumbor.config import Config from thumbor.context import Context, ServerParameters from thumbor.importer import Importer class EngineCase(AsyncHTTPTestCase): def get_app(self): cfg = Config(SECURITY_KEY="ACME-SEC") server_params = ServerParameters(None, None, None, None, None, None, debug=True) server_params.gifsicle_path = which("gifsicle") cfg.DETECTORS = [] cfg.STORAGE = "thumbor.storages.no_storage" cfg.LOADER = "thumbor.loaders.file_loader" cfg.FILE_LOADER_ROOT_PATH = getattr(self, "fixtures_path", None) cfg.ENGINE = "thumbor.engines.pil" cfg.USE_GIFSICLE_ENGINE = True cfg.FFMPEG_PATH = which("ffmpeg") cfg.ENGINE_THREADPOOL_SIZE = 10 cfg.OPTIMIZERS = [ getattr(self, "optimizer", None), ] if not cfg.ENGINE: return None importer = Importer(cfg) importer.import_modules() ctx = Context(server_params, cfg, importer) application = ThumborServiceApp(ctx) return application def assert_result_smaller_than_original(self, request, original_image): original_image_size = os.path.getsize( os.path.join(self.fixtures_path, original_image) ) self.assertLess(int(request.headers["Content-Length"]), original_image_size)

[;>ɇ-auz| )cࡦ~d}T^>r#`s%$%ZR548m;;N`vxݸ*1 ^z?2>=C>G30HTPPt"M,%dueDMD% bA{`۪Z;]e|X" c4-?\Bj5͠FnE3"(l2%T@-Sf 4; ~|T Nbs {|ዹQp2r"ǿt l _W7ƶY/;dx뤂!)!5:)kI^v lژ#Ђ ԳTp+;;LY5MJ+=-E&MvJz/޵Ѻ(Hgk-"cr5i(& EV_nbic-D*0WT5C_5"TexU5Czy d=t 2wCU؍4FsaFdM 00C,:4G~ɑٍ!7slLo4魽?gzYv0,{Vi_\^6V?_^- ^{2v}N@6JPA԰ wL \P5w3A>#"jЃe2xs'ad*٥)TPv4DtfV&@%/^A4=Nktl>1u-+b[HRbfP`! dE$+DUm> 1\zt7<~v逇i%|wdƣGl8nz'd=޿HFG nV8d~X/)WyCM11%pv,ā54l 9B'P" Ir(n4wx&J-T?iP9h5IaT4B4&SVRek{­_[Z+ˏi&5Ӻ e7K4h#DGuwAt81XB*obԉ$ ,) ^fKKW.IXxw40؟w2[>=#Ύ qK2z>pC\dh GũN!܇Dz,/73AsV3t'g÷+h*xK9:Ej4ASD^ Y4_kkE"R+#u!t)ݱZ)HrRV۰b&pM^dp6 O6yNeߋɆek|~V((۞O*ʞy3+yǭK s4Sģa\G2W|Ş[}s_^A̐lGM$}!0ج̦bh+QIudԞ 8:>^D0VPIP ƈ i"œe7` -VvYVo_o_W)$XwF,ASk8O6r[X"VݽoJ/=7r%K `Y';$U#AU^j_}|Bz.cs,`LjglLV.eRsVk,:0TD,ItedV&B{ΥӆM  RH;Rf)KYf;- AwFQ蔈WoQzv]kZo!6ָmXhڏ4GkuV&rKݽO'"{$bH LDTTSKs>Fb ~ٕxVlOrF<?" Biul~h{9&\CV13w%C;sKfƇ4tF=` C(I*^ kTޢ:t"i0F3Α&-Ϭ;t| ###ȏ8p! ;'KĤYeM$hm:|Gu;h-{Zkn]k\!2qRWZ$#փZTkkVo-Zmmk q~ƞjhKнǾEs?c~l[oθ_W āgpK٨>,w!ȔN290cpͫk f +owG(>1Jd$_T*dzZ -(ŖSM[׫@M@NE ݜŽ(C<zD`G[ N`2s9O־.rSz4bRo&*P YIm>DvX$=ZkV[kQkmqei)οNo3pF4itRR+p[)QMo|m PVGîR!-b]^N'/Nt  i $EI@K[DPV%êƢmii;30\2_Nk9_yf}B%1Ŏ?V7fTA߫ ݥs+Vy{ ,!Njb}( \=pХ{H'p&yY߰M{+ J##M]JHD˩Â`h0FzIڷrmu/oOoSrk3Ztz>Ԧbo*Yjek6^/qmh"}6o}L,g{+5 r)n׺.&֢}g.L~7~XV .Q2XEDCDxM\EB Ĕl%3 1]twWYLY,HS \$T\5&Lo!BE] @01ݩy1CWDo+; @}q흓AxKIR l&B.@+UṁLdU7!AʹaP+;hV/ }ızxglg9YP2u\<$] k^/*@"h & ]ALLgߞd;L"F»"2+)RVܾL~K2G]/М;L tIQ0iuD7y2vo?s$|+ޕ~su݃(]dqxDn{$n1Tbs9f?⩃hM'?5=&06Au`gK~70z)/.ϯr?9Q>Pޏ ED#0'wr5w q4e",*PԌzqEOLs "< qȆt.q2~-v_Mg')۵^o^R)2IZg]؊-e^r42ٛƕ -Gz˭]Vnq5\,rz[o_-t>e|^_@iZb:VM#fZզbL׃R ptWm6cޒ½#LEr4)ܘtS"P{ng{% j;.Z'tX^݆w6Z7ɫ<%Rσr. c઼98c$'?I~zf>WofdO ҴQRDԙrqYEn\ܝ]'jUm9*i8 `E"xD^n]?Nu~\K|X[^gטqMOęSx/Kcm@Fzmޚգ!fQ-tz?N弔ST8Y j0CI3k'ik]׵3 b:^d""fڷqX#`~MbsN(G ۪Md{GObvCQ;@}Ok>m6Xw=ZD HV IQڷl3[QxN=9?ݍwq/‘}y 9kn@>E;Dsl"iElqi֛6WƌY:kҘL0QAApJ3 炦&"4r99s_տs~^o?n+ou^=POj﫼] _oMG!&F~ܼ[^%~\XeM?:IeuGݳ/>F/mo+[vTu,Mђjd!?~Л '˰7n&dXUw>C{X+"޹3Kʀ/.Ne{V/fHb)с/'`tfDG-> fb1! "+ĝt9h7vNɃPH$?Srre&n䑉%xt&@RM6Amn֢J2a\*U{&iˮ.VԪ J^X;vAz4"mFV}*ζ{$=U3P3PEBLJpqJ,@.YL.PdeQ D.T]bϵBvs5=69hFe(*nsSȜ}_W0hJ!bX+w`+;3}׶"%g-B=_> ؁(ڛhfsZ "(ae46P4/OA7hr(*?񪵃c4 &SuMJ#>K fс)gƈ8uGvW 4 a7xC2 Ⱦ 7$?%wف q:ScQ4:O׃#cG̘9CX@cE\ (Jm GQ=6G$x搑wIM͠w5;{P7wbdBUz\FH1ՅT4XQuU %%}pUzD=::\!}ѻ]ތԌM WE v!"ҵfn_4YRߗLHeY훎 EqqWbMO{_%{J0mw+$1Q:Þ&uOsVOWDq_ICy1<πcehu\yYHt0g\xK[Ϯ ̡t$fH:I/=YM> X_MG5ƘW̕F"+ Ȗ6ۂr<1@KnC4Gǩ0e2QiCuhz4;BjVF >&{)tC^A=ЃA0B'@4Œ`5нf<{ҪԎS]/VQ64sXܑyX6>` F3N?9 *TΫ M;Oyav*FH9c Zs=N)&R%{S:*̞~>RԬ'r9i/$#Jp B .ԝFiEP$k@;wPbi%=[T\&ވJS^{+v^)C2@`&+G65 N^ŧZ 6*u 8$hAtqa1 d;GFg=`褦B6ѯ8f'Iw nOꁳp@&t'uC}fRtjT7"YtK8+쏂?'=|7k qd攣DI0.'A@sMgwsJZL#vA$c6C`UpL M}TUCuNщ4`*;V֭v )a;3%1:c3 1q}0#ڬ̸))`%by~/CPRD-\Z ~lxzEå6', hG^,B}Ջr[p"uQ~iɻuI.۷LwU ,q}ßIg0[mRuN@nW]xe^pI^V>UU)gBO:V7J>,'f\]]Ǽ IDATPcOx<`4r '\IBԓa `JMC.8thyLTu<<t 3rIFcg5an ,6/(dG9Gyғ;qgȣfE~XB3)}|Ls>#8rd!ȝ&sLnf'/nއWȅ<YDfYJG% JlTwPB$; PA2܇rrK\*B!N1s8ydC zӶeG/XIE_D{G!w;3FōEݞ`Bڝ6eߩ7jٶO__{.ӧvZ{$v=s_Il}\/VŪ;H*At0Heׁ'E%Cܟ|^tjgC_6 Oۜh9A4wM32Ġ1;_'}(l#WF#:C:}N1APgF24;1S{<>/@|Jw3vG~|~D`;SĂ9;sBl 溔$enQ^DFAPIOwtNe10I-DcH]1(ʫVhn V* Kb m.q(r^@"V/LmUKM/^>wټo6:zYRЮA]-ٵilm^W?싫S\\?]pU5iusw_7}uw˧ՋʟLvEQ2٢'u$h):)H Gڧð6;  Chs>[:Md '0lc@]38}yrS8 vߌC فf8cO8;ez$9<eJpFCD&m=8߃?`Ǥ˂m!pqy<rp`jEfd́ӔS ;`$PY6[zL[ Fꪔģ F1TQ0"E!bʹ"[FuV ɒ%E#ȭm;yG`^a*WovE4ۯۋb7˟~{I,oۯ}[>rzXxQosZ%}ݫo~sys5rӂǂpƨ%V鍝@|@DN)Ua}H`ji5L|,m?˔4>b0\I9 zx>=fSpw#|2IuMh96[A1fLO<=悥M=3ܼgABc}w46~΍a] 0!s\`*AT Zx@,DU7'0tPH%7=WX.ʍh]#NjNn@t ir%[mEC)00ԭwOn<7~:v'/^VWmO)*m}'=A$EjVūumX}kPV&٧~u;v]nWo\+a}JE`'RD RNL3-#NǎJءѪH -L4cBy5XKdn&MT.cm 0h<399gS͝AO5hz9#z:ekUOC"&BȸMDyAyR''ACs;hseV& rC`q gI2Y9b,֋1bKI=ExNi 9IQ1g;ֈ}]B+ ]%O0s+ ԒKHsQAU}&n}bMR˗}ͻ_"jܴ[黯_6ʆ;Z`կuw?/xnϕojqW+Wnv(W fcc}|7^-9}öm}6F^gU}1R!q$g"t'בd曾 ֩_L2[IN t6 GNLpmh m~\og/'Spjy;@\6֋+.[!_Jx&\b `|Wf^Y)fN0=ԌOٺMl&|,C0_?&b=S~:%c[?HLIDbxy,4W(s^?!KBd f.$XP(Y 8(cq7Ԧԫ$8-j~4sH0͈IpTVeR46E6ypDX4;R&Pr8؈iQT~7bO7݇ެW˚?oHxUiͷ}7mY{R0GMF/ٴRM~ mƩ_\}u]]q-o7rATUIA4dd\yD2]@;g[4]nʎy{5dUxNTo?}ƤI|=r0ŠO#pfPN i9eid:ݞ 4"w >B?}Ɯ.Dݓ9y#8+s,Z^Xn V7& ܡ9*1 53v'ٸIi,JVɌA&쥩j贊,"Y)_xHnMn}]mz p/vۛ˪~᾿^]_d'}DX*9X5d 뫫E5=ڵz%,BdnyқwouUqU@7 Lt)e ͌ޙ|q= 2?ԶΒ 9}z+ʦaCcK3dfs"Q; ϔt<v8 1m$@% @. X⁴8uXn3 ,fWKXͣ 0WoS#mp6Qb 0N9}ƘPxe ̩zs,VN0ܔ}(p$dZ QXx(651$n}ۥdpbBFR6a&[J;CA=i_Mʟjk%CLVjk,mׂ- }0%œmӿtY|\> Z<'DyfD*eY\.~/{Y^ BȨš=D:cTr^vIWϾW(/'W5-EԂv{ӂDAH,3u<٨"m"Ё\ȧ|]6q|/SޖXTɈ[v|fkTz}';BdLnl;5=uvĀw{ gkLyF8F3Ё5ur@$mt4<8yf1H5E [lXրeF(ȉ3 @rsyƹ3nJC~=4>F?YЃ>ؙ/ͼqc \e(s  p!dyj DRXKn`c#J,p*9YD4#`Rb\̅A8dd 37uMvzj! \պ价.uo~_TC}wĘR?N0EJX..1.w],BY[oR5B]cuz*3Z͇WmX\^]= JM>~oE}-+-׬kʸ bf*SnÏz!ia{p :HjX  }p72su75wGr3#u5ځ0щdbVg |cKbsQ~;\rg?k^a4L0fCnθ)rBJi}ٙ3Z`[3H~LI䃠g5YL:5LJ=dlډm[?!Artx z0b)$W~gfO.]cI pX( 1WP,_0MޜXrMIP$/ژb)b+HNbr&X(v&F"J:&5+aKJQexCh,(uK2m77ϞݻDaQوJrB\,{P)!޽znYԚm'EZ*1o{wHf΄\5]]VZѴt?zrnV&cL\Kۥ*e6I~U۾j]%ψȓ椢;r7d4HDOdп@s:9yo3OffvfbVh 'L[@Y,7M1HUׇͧ3@7*xװ:҈ؙA\>GawgNYKډ|vשuA:10l *2J* 0OsLaOJтRXJcqv 87DK*P3x)LՉT)Bj}QKQA(jqm߻f{sO]f}ݽ^6j͔߿XNIN( R߶4T%fmߥVfsk^,eZ>w_g?ZO뺤LfcQq , uخy#~-T.__JsD~s1:|:Y;?1sq3.p˦"daV @h1{Q6i7Ѷ7dc2d1bpi0ؐDz}QN07ZOjd06I;Z#IٚG99@9_A͉ B`;h5Qj:xK]ibxʑsF;1qz'0?i~`BVcO !4 wŘ96Gwfl6^lpu-[ zKI3+Wv%~<vdz*W LMٜav7fAn9!\Tf_dAˢϖ,~v._ﯿ~Bi.s`jZ0R­WuBjJdP4RP*ޫhbW"*)( vwWr?.k*(u^Z]G?p_TeuQxuYJl{y#-c~{/j,LMF1ܨWea˶,l\,~t-u"BK_n]߶>XƺŪ(NApƁC"A2l372`l?/򝙌ՅI"Tdݩ`jp3_P({e#L+~Ҭa[4 hσOv aF<'Ϸ`"f9k2V|t7墼E\|MZQ0W][Fw@eA*DU.PpS]IE!I `QHfT;`fwwR)Y9;ckZ,'Tg,jPv4wXYԭ4i<Kdwww} dΡ ڻyXQe^wzxmWA/ewSmC1ݶon7G'~qOT''͚q|grUm@F8(_6aUf&33r7s"$alz`$6a>F +!8C%vp(L6<759 H 2C\'d eؙrX!|,28xQe,IL>b7T)0%o쐱zڃB88ٳj4P!`svE/,<; A!^-֥Floͷلx+oOZ\R) !^\qtOF˫^krJaNI)q^DY"1 b8bu^|껾*di߶o݋j6ƮBm޼{-"e5.uIeI\EUx$.̚nwszafͶu vԖWW0{ͻogbNw|! x]obW%^;`40NF?~؀&f|yдr K+ 53MhL)1! dA"6-A>`#Sq:p'<#y O|ac/%嘶j4 ZshKY8N L 8U N3n%ʰA 5,asxf9{bAd@D֦Bg sK :' ,3zHsx?p招MAnH䕳kRT؂c`U/AI@omon{sFP-mKx[]t:{RVE;7_断1͛BNTW ~leI׋v\\^x˗Ozz}b{{p?g߿-*DXWEUj6-Dq_x.B} ‰Z\]#]kjT@fۭVy,w^YXVݳ>*|>wۻ^_CQhzTu}i|eK-"3RX&e3ά3  ;PlzG38i賓jrȬM)sP'3dceSv,Ȟ-KQ|i*Sf ,_!~8! DOfݤB)+8x `<0| (!`N,.D6z+0/MF+-X 6m0f`f,p$@~{`\#i6f6&:0do&(h6FlwM?j:kSbfnL%Xw}|p7ьT[cd$<[sr⃌]X܄J۸M?wg~_/ji{{ߵEU!_z2T_, WU` {Q/(,uI̔\[.p2^V^ϯW։UV˫]?/JzŶoVccjk]U<{0CT- R.}0I$}t{paIzqq[ \7<HOQ?]~YpW}-r'0CgxGo]63d : Dɑ3a~u. ){rdxügd ɋ% F gP C$"E<3$y3%=T@L$C3EL{!:)N we > DXR(Db)AAHA<@"#GPp|%羂9[C'1eae}puKXaf`@B+NYI@}վ믺Wfӟŧ_~R\owoP\V.LE- dz90)5ĥPGNPc exñws5X*]H^^\=dy~_*Z].7?ɟ}?˿ov;O1Qa B]itcרG~r`UMWUref ""ާNU=}8m~\6w|?7r:q]xvW^eqP* +<ҬG.=؛:g= .=X6a.6h`gub2#`b0 qNNUN/ecɖ-wD|]ڒnpȗy0z`0z?b0Eql ZK{GjT(Vs"v,}p +N+O̢ DT"f0)6O%U0f(fe\fi:r6M'0g`py!qr1 C-4#~M% Lp70뛦4!"/&"8-.k:|^DlH:liz ͭYaߓNUu0E%9ތĤp#ršl ?\={y=Ώ|pttObV^=+| ͖6q[J͎m2s-TF;o썉DtѨQ"4ΝCwnqEU= W}w*V-[| We|iۮ^_=?!EY"(Fq%sib1Pg@%k7 ZBEۺ):Lr^Ku^w\K,Dbr,YM[F*EPtZjЀX ̥ 2U )#(*>[BB iEF3H`Q))*%9`"qd-ӎo'zH5!1)8PBs@3#'$&%Gƈ +P:HR{Tr-*7яiD;C BOY~ѫB,F64u" u8A̔;QR4 `t ʺ盋]exq/&XgS7_\_"17될+s-[cRD`@)t@+Zܼ D&igf+Qio{?\|Go_<{??W/āt+zO_~ɇW[%ϺWl T2Bf.uUQblXDT(Ր9]zD $%H0R@&7?SU*W뫽BACt|+S,f~du͸vⷘ)=^@0K,Y 2dT< x0H RЛHzH:4m.iȎ-႖jQQ P%/<ҷYx?Л{$s6G@`Tm##0'` CZֈ'TodEG Ź6[hQuM~f RStNtqtj#fAo=vZB&P<[(qٸZ'zӗ쳟ۿO6o?.vEsIX-I pzDX̜@]S0F(t-h :(Kjh"B JIYnz88ۛU%n^\N^6/|ઘ]ָS 9$1Q][7fcra"$dHȩ=/6tBwf؟Li/ 4`FCKI&sLƬB(V0%`z¡g!8&ǔN:v& FHlB* <р>-=h ѥΎ:4tgJNsP0c23; G9{0B "Ӂ1THi ؔi_%!35z%or$eJ2vCocހoYˀ2WS@ h1PGrU^=,jl8~pwi "g$W'_yj* k?-A#rDk.~_k<x%(+ةZMր dҹ|Sty޶NBHUU-K7?wl^(=|t׿/%Puֵ_.7Wu(u5qPU8;C=ׇ"P'7mȔ(!h%K@rQDm֫.""1Fnt!@uv1qEQ,p`l?#&M'񥏀(g"$cPU!QUUY2e1hPAD٬_ٟ \UX;Te.cP" m)=>p>n% r|4dg!" C틩4̈pI,ȥ9q8mtjqh&.}0rPC04Ո搄2ЈLвHu`o!!30rwDBDHS3Xߘ['5_rˀ)"x1ՉoāJ]EI`pGD9גPo,(MΆj 2i$=|d k1D/ѯ_c ( ڄ.۫ΟrB{\>'>N y$@EMGV s ש]ѽuI~5by!Fbf@ DU - 6`fdӼaf MӺdvlff pjg Z&S ukӆ)P+VAqPszo=_VUuU%N1ˑjX1Ʈ4_rjY"$Rwt11݋ӳ|Ÿ2jY1$B=>"9<&g6\ Xh9}r춎φ->U3]F64341#@V:6 >,f!E4Bp]ol5#*v$ߜ}py%qљ-yĎX(HH$ Ue[OOꫯs ԺV#"8n.S`_ݣ|hUTyY} %lMh8Ãi:(ʤP1"b]כE!#OG.6\fAtJ(Vp`WG}7WgӯucW"1"3Thj^<;R1BӪ(ťN,HM:trblfШ,)f 27kp#VPw\k'u\菻$m7now;s#Ӈ"R}îNSQIOףbnB k1Aù9VE$ӓu nZW޻𝏫}8).C NcjdbN+]C[^h?}4 kѕp]]|#}-eW )XԮL;Vc45eʹrVᴋ\SkON,6k۵"yƦLaɼZsK zCmUPlbևoO^'W>_}uy~7< "A"Z`PY"us{;CT0bnU͓6\IKo i&8$D9ce[E^9(i @<53ULIOK1*"w]Rj&K?ޗkRowSQP"Dd&0@ C EN]" -Ѱ \sf+rNZ4;@\ i}C3HkRWR҄t67AMRui`Q5$4CKgK1Dޱ FހfاӎTLL :1ԂYT 1rJJg5(Įhc@A@S 5k]?Vo.lG|oqpڀ+، ԸwJ.5hvR,o֛C5 IDATUk_Z 2EVDdrٵrY"( A1Ӯ u+W-o}W.N_W 닋jU0Qcmi߻O+ṯ**pU t||6}f{niΩ "P414#9 ɳb#&8.Ŷ9V)~8>;S7=ї'͔hDZb-])`5XХMA9 E!' *ZDg:q .Ol^K9>j5XD{+mQFtPYD4NGr ;)B$2̱Hɘ]3!z4N!,Ŕ72?F|<0KoLC!3YB"v-pxy,7q;Z Uf'.}, Esn$<#(lV`Čx,NJ٢\_oUvRPy0΃G)hS^XDdiཧjևkoϮE#Z'ydZŷ-..@h&&!B&!H ъj^5m'8/_ԍЩbsucd2;;?lne5[bffw+t/JNBtDu 1hQɤkNep2?ؿ{Wfk__M%s8ON&p heUIA1yR b!O: >-bNׂ*8;qKp#'6 [F,9d!t&am##((Y.$#bS0HjCZ;)Ūں6@, oykQtC7@{;޸>U)n5>QMxd4_zPB*I}B @9-ir "ocb30@NvGS,^A/W^`b|pyeEDeD$@艩:~W߶Wy+p]"yO'ġz$@n*j!b|V9x|uS1v4WP7 ))բtP7\')Wxɤ\̊_NGTUuo~&n rId9BNZ&@DPO&e1C ^O>ӽT m5'˵jaXLl]DhhOĠ\S5B$E,A<y&df 5z!.jK yffd1봬vtȗx(a"FRkd7!@wgc=@PЌq0CLj@!(-g0JJ%XosefSsP YĈ>{&n fzX1 g.1f YhqQ;0(٤zCRj倳5}vⴵIC5KTȚV؊qv۴{(MvIAڝmO~ D2xq;O> P3zm42@>mb)G?n6g>]l@ؒJ {^ZNЕmDd@̨2 ͦk{/> *l%,DD:T (a}}*Ӣ(\N̳ê<($nOyv+iC-h 0GV$#1F*H l;]]Օs{{H9W:l.;Mϗj~3/gzVzkfZ)'_l+CXW 劆i'lй6O3Xt"C;hȗ%e9ec n}0:S@"AĨ@dT0%B*8.i%QrARbHj@J@Iː c aJ@Đ1a]Cr020w}ՍvnG,:&(Lv_w8`d B:(G`&]{sK v>gxom-m/[wL 'r[.F,iN_Ze}i4o=f}cD_0Qta\w,t%t[@l]^5OObjW֔$!$~hP-]ۀRL]9vAde^r\ܹs'`w`_?߶ WFtVIZ8p%rNf[0.wrɲ!]\6%vEE9t{r*|e@U {/5%U{ TMT ,+2J/2XoeP;jxc-'1Kr폹{49UwHB4P#T16MƦ)T)[Uujop7iɘMN0sF|18;[2zQ?kI4AQ &{6DhjX$:ɐOI irQP, mj 3$Q"b$ k'!2T4d7Lqһ)~*iSNIU{cQUP}0$ҌJ$YW?'#"e9"(bPǑeP3SMAA@4݆7Ʋ"rof M@yOfpp!L&tw>wϮuΓ !.^jx+x>+'Ԋ Lʒp]kC%[ 1 EyW:$`-C#,@ ]hoDI5qQt̾-'z㏊,Yǝ ua:Ia羾ͫBW+FBKtj+| ;eh ;={е1܃?zF#h)>H!߰I F{(`׺z_e##Z UJz12 "Q^4$F"SG6%l5yBSP"5@ĊDʢVwa7o 7daLGվBc gh6<(bRL6sF!yn +F*zWUq!"Dꋱ)x;]"#&$Grc?0IE5*P=AJ bulN1aujWxߜ៫)=͠Ƀ'Q[+,sn0%&D cȐ!գ`pZOڵ([eEOq0f =aZ@۶)Ko(DZlUE)VAD]zvӞc1djLT2,;&ɬ,6{T H p-LJ{Gw-U/ps)㶫eX+nzU2c+IP#45ޕe9Zuޖ{Wwk_T0%q04eFFtiӗ:h{*I [fҘ`½Fiű _@0`ߩ2y9d\=)~y`< {|QD5OQr3jMB"oۀS؛wo(rϑzXՕc "h)Z>rUelKh`h ̌H"-)X""Jқz7L$dĤ`F R"s7i7}`D/lY  Ɖ2t#45wַ1/ ;>gҵkO]ޘL%7YH,wD`A[qĊd.tRhtuٳ?VK."k4ݏ~s h Tc&UQ5fWݐ22P F":|rݺi.>*9ݮ7ϕj4 ՠ Mé[pWW8w]]<̗6 v" L@FSNԄH coڢ9S  D VkHdKr!*?fX7F|YY6}I vS(f`͊ Ö#Ti!;4^@?5/Oմ+]{ 1JaDliWqw^l}$M0ʔC=j2srHz-}g7tSD9 dhq` *K"05" dA0L@(HBA${R,RΦ̔Ԃ3Bb'nNͲg[sf}V%(}G5!$ j U1ZqSh}2n;02 jt+Z  @Ҁ07_~9-/IxY=9|wt.͢Cpb_g0*]mBPVm[OE#nx \Ⓒ`]QX2R9X &D&r`_9ODQa+ZN|{_f1nW%$l99Rt]YwaS'nۍV㎩rJ%̦ل H;r]Yb긊.&-YuF>NޕOom'cԅnYj^C~QM-k4zC\H4<]i`` [ ]@H,H>|(aj?h*lO!VBx~ވ!)Kd"x/t=+9`jI 2*%fu.5TM3GI ~Ap 5><4Gfna6FW[8po+r9 %^BD)ֆÑ"  GDTXoXֱ~>Ϸ's(⥜?>z}t%@jH[kyh DDfESp+Dy񻟭.^LEnPM:hɩ55]pPWΦVb,eNJv{,6Jԗ;˽rq|Gjֆ(ċ/ۋizUw!PIӢi!jlFCOἬdf4.{/Fcu[1ZM_# 8ۣ_->8?9inL8:UA :5*m#sP&Ͷ]ަ9^'LQm$OZRfmwJsK)D4Ȇt|0˻k\0B@F$2V`F22f :\ Dj 2r6 jE)`np`^bp?Y;D$2MA#0COAdf?@!#4ˎ9AE $D#`v{Q~˿_xhK+|=,ˠf`p!E Bù odϑb"*Z5bīŢtf=n_}cE9a@I\.NAE"&t!SSb:lZNG>yr`u[5" Y]d?ôٴ*:mUNϾ=:O_gDc [&8GZ` 񞫒++I5q."b:&h]Ŧ؂GV$AIs'N0͐9F]i }{|xpуD@ED[] 5~;GBrӬkl9ˆQU\'W  yMO?ǿ+]{po1w2%m./_Z ]JvNDQĄ lWq cq\|@qqj`6$v~.^ͦhmCNJLDg˷LR}&!4pg `+0UU#tp=Mjm=vϩ IDAT͘"SPgP hHA+Q@,ɷLLIL5S`)}3Gݿ{uM{>> H _QzH[4kYQG3ko&nB@bD3 2? [@/go#Ybڻ9==iE " P-0aɀڐh&eaֳtWwU{9?""]h43+#"#;,lԌhl@T$4 cU ("*(}5~=!:5LIRY{ɟ?{O t~Xɫ*:]=8K􃟶,XZk8Lb>|_y/Y<ׅƹjYb6(эt7'(קtu3k_a11BRkY-~r<~sHR:C YƎ4@5e &aJx1/lE(`U5S&dD `kJTL$! ):@: XLńz;7,+0+d?j%2"s#D=O!IRskp3 F[b}֥4b6;}v3Kz[w2c  $` lFMܬC)+3Xhj T-I"\M훟LmK7P Bjelxvzz>gno8lJRn5Ɉ(% 1`e2'7GwwNp/:f׎M4 O]xxwh7+a?=y}L65볪qt۶:s!##umK:y룗w+,e隣33BՏ~ßM,J ??պ!EU5QL {Fڎ΅W(Rg]cy7Uʲ?Ƽ!ޤ#.e}1pnd :,YrPDSF+r?LA w챚DV]"b[{<kmnɅJF7` ;S.V@93Q\(PTa0)$C(i6:yxuvD唦Ooc&<*[w+KoEQ I Y|o}^`4FV_6ع0"qI')D\j\ɢjR8&?;~W??{$1(dOR$obj z~qNxDs 2[;\ xqL:v^]ya2]oVD:*)e&v/MMҹD̚vbTOS =֣DZMyٸYW|o^&]uNWO'[󽙱6<!Q}|I[F.բ %DYo l d#(kdX*#RTӦu`>HNOO׿qƘ"c8?[J"0h1]jZ*/^VTx|og/NpzhWON=9":7l|}~ ~}~sX}έER]@͋  Q>APVoԯWh!]?n+k`; \bi|]FT22l LLQ l]LAI3߸.k^>2HGˊl;yarrV bs|xۂz45FwWMy#+L0 q=ՖUE @gBLWO=|<ڝߞ=H$}_Vgkfb_BF6J;A^QP0&T,S֧Ӊ/~ĚeX.@$ObRNnnݻ}w~`ٍn%+d, MrUuNmK;{'n<UvuC`[<~ULl2c*bŘhI]mGq8G''nzxT!$ o8~yu>qq>߼??OoGZ*3F5@@F̯K׾Y&Hʦe djY5|[eSh3314ou(k{-CF6C;@y^+ހjړ{K..ĝ!T1"(aD]-+i DD4GCXMDp8=tn)؀ ,UѨ;_]K?͑!ֳ 4Sz٪bH0tR~ ֱPrCyuuZ={O>'7nz;~ïݹͫ[="tVaYĦ~Z 57޿J:vմMӭnR *v&+'Ab _zb׋Ԇ䌑urH.}_d&{A6M TFkƓʵ ͚ };RH<oo<.kۨAB"sw lj~qsWu]E`D-\Kw Qk"N }k}Ks-JL鷇tˊ16ixKJR6dP8u*eUv&a] }"Mk/[9 ) VQ{XAQ%0V滻|ߤ;,,oM_Ϊ/vh2m}"(3Ddv~"HLDL(c B,@0vX{:yx v_Lܧbm,1D%"{$uc`TLC%`$dv̜gj B XZ-K__m}<Gʀ їmʢp1JjqW}Ã{|pݏ޻sbu#ޕ.jGay]:Jދzܚ8ѳx|vX- ]i:VӽYɈ u:b:*Ȼ|'zO=0DigTّv]6pmjb!(c^իh~W7nnJ/>?P:'ŶE_Fwİp|:Zn=6վ4Ev1K@Wx_ّyS6!.N'- kC`w.gWE -WЀ T{^ŀN([~z %aFc3 t*0M0hcu՟p7f]\}]Nqo3j0vQUuT2rnm| "dgCA$C蒮^?/%|fnX0 DPr<Mq9Muӟݯ|Wn7pYWkw ɬO}<}ZWu.˲|݀yRdrqzZsƝlv0?`tl"!Oo.51]F_Vd"5M[/z /xiRs:8Vݙir7O}pSxiJaQ~:dA{M>ku8;ٿkpTzlkW]^l,mnuaxL% ]r=KjW؋(2! (3٣%zc8數fWƟJ:@٧9aj`}>f v\BKԣ`Ȁ+b6UȞгg4m25U1&2,FQ { d$,Edf)19Fh^E3"3TĤL-9r~{6 EѱSݚ2uys=RBEGTVD&CV5bCWEr͸8?uI_=wK:yTM  1W#Uf0GDgOfdx7L؉!Lg7yWOV''^u kiҦ6rrr/j].NҊu|qr0b! ʞ<`;_^U{d`1ܘ{xg}fJQR$>٧[]|fBAW̓oOU~|~jIJ]{4N]}|7 ]x9ݕd>j4fݢ*\^d1ø /G3!!bv\tks.܁,o,7["hmJ,CG`̒)*9@0Sm:;vvhM3="a<ѮGU&G˅^7i a^v_;~?fnܺ=`")i2K tEQu]UUE1p23Zsb?z}u:}}W^:;($ke\UmYE9Ahz 壟ݣ;yxwo8&܍3;>=}uvt\+\,I),VM闏>y^.+y"Ÿ@M굵5#"$B Uc+ttp]/'9Q`gΊze0_'X6U9{Űj*9'گ_b,|25:b֡EB*`UQ&9lvx8P/- IdLp{GmwEC'"҅R&eu օ RDEoJ-;)/o+\3m4 /Yf<$c t uرY~=poSKEQj*"yn}ZSÁ`7ݱa $2(gPigy|?~'Gdw>`!Ւc]\Rj91ۅ "p&Rr%QjÓ_mƋ夘5-'fͽ;!tK璂eKQ5^>D`)ucVqs9Of>8yOlo2^b]]Hi?XW˗_rStTxU-=rg0އ8l|A u躶`Ž/<%9??^ D>ΗzpPv!vxWs?:'qgM"1Y>0%K(2Gc)iR*IϻW{~yjgEMTYl1]'5)%@W,S9u0-y96CҨSЉKIэq1-EAթDjjL歕j:. ߿BݵPs/y*Z׹,[Pu1UiY$# 4#h)YݫrE~ o۽nX_9!+a/LN/_\[9/]hoYyׇH&{(kzA>ҁ5~tƶiٚ IDATb]^=/N i\MwZDU@U6ZM, vamJ/n~VIL-ۣCQ9'sRv=_ RTlIW'?3NoMn&R()FQAB^]eYJuJi3) 8CP%܉/[Koo_Tt+/}ش]Dc2:@0dRIIm(O̬i][*uSK$Њ6zXuu55lhRN(ѨO#v]G{SB]IBό`GX Qh634ەJ2cl'rzsav}o ۖn+wLB@܉aE^d]eEXue^[$Ie^ɬx30$Dxܲw)vlI]ވ"弚$ڵ؄]q&Yz<5DnݹQLKOɛ)8!CFF""sq9m>w5CJ]}694p0+_k % BGg_/W c)֎4 i#SrT (ŋU-)` jNBJy]KG13YB&aROTnhAITKl^/;`%zqRDԁ\Tm.><(@޽u07!KQDm/uRޯ.I* $l98l'W>MAd]im)7."0=,eR!sm*BqK,lK!|Љ5n9y$}jCĥhPUHDzqtg}vh#5hGޏff I,Zo7DiK(fI@^W#sG?\֕HB7|ٸ`oRHClBP4D{A.WuK) F m.)X׶)vq\0'"S״1fPSHL@M *)AlY[שK&iCˆX&1Įwc14$%!TtN Ԛv6y,KkuqQ޾q% Q J)I,9F4f z`bҠ ƾ3M kGϭt߶-kf!NriXǧl!ڳZtݗb7].y;i `hf5o&ug{;lY>p+@mI {ES̷n=`h] `PJ&ΖX=nXC02%ҕJI5heL8b?UTPd1Ơc&0i-?՗_L5z;weQYv.sዢ\ofcoEBE;W@eY0HDŽ`  wb3;KcĶkw9IlFR8}n7^>~Gi t-6ڈ> JL3{vK04mXtk4"x75[ՕQdgώA3"hy'vmL;G]gNEkp;f(I UރJ[49%߶mi_߾?O:l4vSFZ#X(ω}vK>δI:B  bN`HA4Ƒ}#jcRb.fծum7&ٴ &0BԄQ%i)IȀ4!lG"46q`7؍PbB [2ŝR !u]SvݬO{7I L0*JD{V**(!"D5dD$@ݨYBw~֨`[ݱ ˽@+\`xm]uA"Wߗv?gD7.y\^}EfԖˎ-eTj*#.7չ?G$Uy;au>T4?.8DnbᎵ *!#/[Dgf1;&qf %m$ ^p8N?}/}tw~O&Y(!d~_c&0#"}@zP&*);Uu1sQsKr]ZNUM,)}ϟ}?*Aؙ"'U Q~|Z.'g׋q]KC,]2%3vHJnyR2æijXrooσ9JJHِ=cF3]J]L]JiDC*IcWb+:6K m ҕ4)";WE2q( zdDU1b%ddsAgҧY@i2 K+J_;&* m b3I29 [ԫ))K mZ]je ]7i.9e&n mG}Î]Z/P% 6uc =af6(b~`kpx-KheSfy""fx%dBȌ L@TR15TG}Vwv7o}7?{N*@P\3!KMN;3/AYSJ9Wb@@F"0c44EQ,1 JQe  >OT,=I)1^D@;K41yx}Mc1BPI"`2%?^T&Lfs4 O<)ʐd7H:Vc )jUd ΁"EYl5%c QdDVs @#Va oh`*˶ #UHR6gLRQ8H&t$E&0A,2e~m[LN/ }LP3вyԐrS)tmDRݰEvQßxK_x_ASUE9ȎWoCܛA z!BfbTQSJf&TMvu R애 4FGGTB\bs&feOf9$&~s@%pICTI fWpuY,+)" qJߞVUEicWI#]lR'Z*'8 2@$Xk)%T#DDUM TNR!R s7)HDD{3$̦u 5ͩNKv LQEc]@FbRB:-UMU5;"|J-s@%wQ3 SKy̶[JC` ;_Aެ `f -̹eNgfJ 8hH2nю ,J<\1S04K~Reb̆dGșh24D)%BG$SbG7aA8M'?xO38_;d>;HD̢JӬp ( B9bE!X)dW^<0{L)#8bV%SG<_e5*dRcdD0VHhh4`&<T-")]`"t?f  pƀ`IcM֍J7^322.cBt[ A$am ;DjjIU6p AHPU%msNoj#6gt8W:4sq"Jy6 1f!͝10!A͗S]{g\nV-;*f h; ))Y pd\ԱפA:G<0]EYPB wܶ@]?KVqp{M7@]ڻ6ҷtvaSS"^o{Yegʿ"WI6"O2+KR]v<Ĕ@""#@35.tUHiɸGhZAԮJېs=~{FEe`Jߨ6#" ɔ:$fnj WY7,1Blඦ4 0"0#!9``,8?*EXYD)|AB"jZGFx-1 Ԑ( .y_QAQ8 ;ly:23&N@D4ZBɞyh 8[kybU "`̓*tjksg٨gf5%0AP@ђ1ƎsjSjF(Gku;֠300!xe?&\8Hz#N)P.d οvq`;&ǶJrb!zCkG*qߴx m#wM.7ymZoIO7nW`wyLkȮ,P T$(U,YB{//xQl!iIױGneXi? !0s%L`ln_pN@XD,˂2 03E%#))jQΖz<*x" @P7-E0D 1.Ũ @11Bg!jvmLALbQ4H  S.JKjb=Sg:*]3sٖAT(RD@S4a&@ fi:r>?_$>DC۝i2d|G} Dij5O4s-E}g&tm*\QKFdfyG/GN`am~ B3^mc{F_Y.L"cWٲ$p[xx".,1'44d$VÊҳrS ~e#|ĩq5[ 'B fVUBD`2)n<f VB$C"+r>( ^^K&G28Tֹ &ۡm)ۨ2vaHź f*놼ZKڦY#.}Ñ -m~vƉ Ō%XsZrLrQ@9hQ-0QH"SI2l})FqlX?n#`弎ҼԯFXH&( Q @M5P~m4KUmX#$1f"3M"rB3Jo}km+~)5AfI aLHBm1Xץ]U붉]&(Xޚ4hI-zCIrMAB5I2zFxx(.1Ւ4uS H C Vw!@uֱPkCvk$it9$a9GS $A !:0ҤpA>H`%4+6zwt੗ ꬏t&8*?!8݆=2jYDp>|!I>a&76ޒ6E k#[-(2szVp~ԇ7Ω=NSj>[r7\իZizxovw[4\Z%eD5n2H$P)djiLTh@5)]ORkqRE$pm1;#!3[K{fJU@>_i_'"eDŽͬXu,ZVui>a:a&a:kUU5U5-5WD !tqpŔ91.>8H'DbH^sˡSDSPAM)8 T_Z5‹a/F+;IͳJcuxkg,7Y"0 ['<c8Q'Qb^.W'GTwe9 99P| 921 JU1u<ūOO?a!6}&/ 7>bg_sЧKêWK닋إ1ہ ֪ 23I!fҊţj^3N/n.ZWmS|pVѲ*\Û-JMQYkZ<<լ4͇np؏n?M]3x >mBp 436HGv0BHLe&Le߿Jn+Cbbuݐ:x`us`gBHhȭis.1]jfq̵.R35Mie6|JhŊ 伷}|p~Xl;}_^[G\&bh#v%Yڎ93c!29"q;>?!ŐIنl!Ę:%6D1q)TR"BZ~~X̵r^.fnͫg HjVk.% :X !irWWה֌dfi~>oooqqZkKڟ|L7wGEf ABFUG{UF MHA@Ճ$$L^Ԁ*͹VbYp=. [(` &QmHiXȬ/n]iʼn_|@HDVXM?/f< kliS3EPܛ֢Bm1-@4"kp6 A&T5,ctb|_)~Dxq-xCܧTSsy=D Fpf~N0ƚiE0z_5Zw 1&;_pA Zt݇7Ͽnч:u䔺HqVŘB!`u$耉 ˣY^MD  -C73_:TWAZkE'b\VcfռZ0VϚUT]b}y($>ZU:Oai&.E_䦦: !nuRensC) TPPɉ(D"3S AL5׌ 1``V;ʎ~)4 A\̙9έZ (BSE2@r5ņg5_^_lɯV+b}V*́p],ZkfE4ftCoݟc5lno3fX ܈ SQQ}^,^L=!?Fucf \Oyhqn6fR0'ӣ}L=ȱkSbٓ*Yk 6&dDB:Zlu72R8m ÇnNh{{}}bX_|6e҆*viDHB솠)f^\\<{b7h1 ^P]f&3.MErkفRJC1 "4cr0vq\ݡ)Wy0oo>w9Z@*ou,Ba^asSz<똭#%4d0P DHn66OX2;8"3E$g/1V !cUՅø\TQbvE=J%QSH'L':BJ~xuoj``T,8 ъ5) pc`{UUmW vHm7)"3 dC@~zV#uk!Yc~{<;hQGx3D̎&B>?zNJ"i{\grCuoYڶx p$# h\9r ȘC53 DP+,BVD`{otv7v wrQkqÐ/6J.nM7}T<#p'Ɉ<9x$aѤ.XԪ:73:\J)B^kuWku"w{=2aP Ҭ6ڬ,Tq*vݻwwwwR+ԙk!GիuDp )a}G/!ۛ?h;ETF LY5N!31&I&5Yf~p:q58&|"֦ӥ}}Li\x i 6iDDlItqQ|!Cy,(pd;{2U񏛷+GSRq{.Bb Q#Ԏ&:#7aUA(Yh"9Vun{w~;} -:EnX߬֗R !1D6ft.EuzN fcǘ jn235D$U@tN``j:;R8&a\Jǘv^Tvx=ܽwi="u4.S]quXV1 2@jow-aIwspb%~9DUib Pk^ HfBVpIAb@cȽH^?J898^^ӺV/^n{uu~x=2xAUy>!I&V8Zb:c .636y{ûwwwqux5u4cL};$$bHՌ%p˜'~lHIڠ̭VRPe_rItl&rW.f( dm ͎9~%e{]9W7KV%Hbw 4RJͰJZd^1&*EB7_wt? #]ǘ)UyZ!DEDXhQ6ie@CFZk%n풖b4oGϕSDrjJDCbMY4M~ok%poy}{&좍'8ݼZ:rt[Ї_s,9CݫiF7(ZI裨e0jfc{S@_=>{6a"Fy[z\]NM} l%vU{\-sr03X"K QHt4Z-¾u'R7t2,[?_JǜdkBtTE`ꃏݏww?>̹bYS0^Mă nXma;sʀDxPOو­eR @Mݵ8l=KРF Uu&~n&fpM]BU yE9iz6xfGQGqsuHNI[ujuyi@K77W777]y˼7 |/ůw>u6zX;(9jR,v}C Bbh ARJ$kUr-yed(B\11BYm1Çw.Aa%k~_mR?|o~n{q\͆CQ 0)-@3?"*Y7ljX\ dXL/ @vPs050u5f ԚŗȹM@-Plc@N^ L(<ɦ~)q1?)hx^;aQCNYbv>쿥Sbޑu 37G3/:~$9Ysxт'j+T*ATD,wL( ֚^Q ygu}n}v}V%m 3r@*vj]݊AǠ-BR`Z qDچQsBA" msnl؈12u`Zp\gǥybT$̇qr)Jt"^^ktyz_pXu0*qyR 5!/"f!9%FR@4'o?p?Vx/ 1jHUD+`it4h2*# `'asY*{)w{ ]cb),,NV]gC0mNCR>R<;xC8HP Z՗i O>i;5|]4u'#=R8LDrAB"gwsg/zrzTRYQ*$$$!YT܄eUT %Pk-Zռ"ܼ~"""3 g?i8L& d"r4Ӭ.^]frӻmvBREفFoo_A˛>X2 Zxx81I}*.U!p_CCOvj^4cka,yv 4Q3p\l%mڂtJ8%Ys={tV-F!0QC=[~8oj!ۤnױ]vPǭnTݳYF0zPйcR*.F!&C,fdJvSëG'V7$QsJչiBQsΪ#3C@EykԐcd@f:jyiWwzL\N( S1:.$ =BTk;ŗFB@Vp!  fټ乶Ε)ԫ:uڗ2j- Rw%" X̬9HB꺮pTɧU! Oׯ.*cɼ2qBë+Ӱn8w)9rU5A,ıjS*Pu덪~q{ j76۬_{P'*"&@Ddhm5bQg٧4ڬ␤nv%8}1p~Wo֧յwa'B#f씾__\f?v Ρ6_L_3޽j`JLf])u<"|x$EaBZ R\0v̻iF  jеcw X5DtyZ1=ox2~Q}>?*֣co/'.Q@zKB"OȏyycțDM0RG{3-#rլ fz\z `G/Tp0~~pй2E}w9pxQ* ap$s$vIdG3.O8Eiժ ݝ({)њAɪi:4u) ́z fPK-pyv׉!_)r+BefZ\*5 &6UkΑs ܋mկ>̥a:l$MBdbC{[GƓEC*Ԕ"9gB7m"3#ySvlߔJWE>x8d.]yFt>eb>gyXSp>A CjT#V6Y"t,Q\BLj7?XCċ/ᢻB"Rk5G ȉ%q9tbLA[qRZ=RԂ#84kiX#0<Ϡ4՚͛Wwq[B"lJ-J<'pP2!&Da`P7:ZU*\pX ײzUACTSj|`-y B{T] _~}Žc)w].6iXيא:RU׊`BƦ-IPDBKqτL [DlKQ眵־4Ğ7_&u7>Q`^}U F<#kA/|P`?r%xTtѯpwaɼm=M{b`fq&;LE9$D PoV}35:UP Јȍ ;p]/}??'Q~/J|"Ёy} U4s~/e<?//ɼ)@1576j嗺9 3:C=~ؾ}S MM bt`1!2TwR5%ϟ8 IDAT8Le03⢨6s 12ArZۿ\BqGfRL5SVjQO2!) Be$PZB5k.n+R*s@u^349#sH]1)*:ebX ſw7.ѡ w;avb@A@)Z[xD/U"ȱgGpfVH]\\xۿ; ":J![uw:|?ɽNÊ (g_8ϫu'.KZfqCwkq=~^tJ2fʤ"lK(Я_o8K:e%eӆb(xФ$g؏nO'iO>q<9WUfd>ozvOBrH#xf}azΆ_*"9.k kG:# ǻjsp0.2l$%ϗ$nFbEb`drBfz'0Le)ߚ1UFsRfw1" dWtwQnOc)Vs$!TĠZ]$-ǀYHÅ\qJÕUV̪jV zel&Z̼#cN$׿ュ/.WnXw(hEJB')YmJL`Ԁaɪ8cQۏsUG!CZ^jq!m6w_~Z F,K$!J^߮混ӏB[' U 5`\Wk-aⱼ^ɻ U1!pϫe7_8~[h&=03fPH~) JnW q%\ gFQXLıL؋ѧ.>:%cIIG+AIK<'[LG;4Eo1@&v>ƑDa2uleMCpurlP:jBSܨ\Jmnip c&niUc1# 幌䦥TU?۴uޗÄ?.`LhJZ]Ihr7 1 ЎHbKt~C`!IRl6ݐPD^}~bn,s:$GzR]'¼enS͕d3 RVzH~}YfBdn^?@[Fεݑ ͠:@H9f%jz }ᐁ **!(Dgtds&$F@p&DGOm>!9\O{jL~)pmy.z`fH e ĈETQCDsـܽRd|Fw,l(5,jsUUbAdG@bERdE@N-4UjS9`[g߲^hGH6o9#S\S=u IT&ŏ*WGl+!)e/qpAugSYչC7VGq FmI;Y.Db檕Ș7G/ץ0Vk s&pA& H̬IJs1?̈mN5uY9yjE2ČൎYw݆d03G"g@eҒ!.)v68<6춇vBJH!D 1fFD\s9W GtuS<$ao )^JXH2(0#U`YhXsD`77b1ZbIq$^VfҪ\XHbG1 @ P̈&тZ]WtWGK$2?\' <[JJS>80 a-:lZVn^mtriN}Q"a1Rd"2 "eSfa|cJzo0뗻}WO|uha߮{pѼ]=So̝gY/W/Yo}Pv_V]<աBS*ϜS1#.g?O?gvZT5j9-3sӊh)BD":DOK ȳ3zjӸ   |8'rF2cɖ$2xyR TQH"f0" @Ĵ@,DV(A L T@ƀέꘗKU=̶ C0Mt*< $|Z8x)u%B?*` xSwrաtӺO S;p Yy'=H`V&L+ (%r윙"8!s0AЬmOj@Dz\ucQeJL7q_j# m "1\b}n61&4%@3!E@HҼ1YՒi$0Ef8lTs@cX ;̀ѲϋXİĘv@sɃƧO~统|W=J \b1k>Bq+ /f8m۶)b{)1x_?woo7[DtlMH)6)X2ImK)S8E1kܷʰ-EҀ96d{;\C삀H5SeS v2# Z,h@C+BX4M3*af4o18 ]K%yzwH^~/]1HT籈bFlSohzx[U1j辩r, ?NkvqNIHDĦ"QE)PJ=7>~CUPT>aJFVT:*47q<;<3Dh *13s%RhF6dBXD i)e%ف [ӄjLc(w}:=ɇ]8"HNg4A U"cƓ BIf` !zٌЇvq3 1MH{vWaO/_~K;I;Zo6>V )u-6KCwW~\3|IvDڶ1D0`pmk[Z yhD^D`Ӓ \Gnq x"2y$cA]C)d1`EyCƹjψs;OF8c33#<&t]-? _?>z"M.ܲ_Ƽ`A$#c %tу /5Ƀ Ǐξ\.+!htݿІa\]_795U|_=2J{[busNUɡ*X*"ȓdCS2ksD-E886DF hLa6_3aB2*aXSطvHYuT N)3z(E,PMbI@ ,iIvM]Uޛa6_,N0P/O,*IؔY>7?pq QwFIZ3Q` ~=ض.߰OVo_?ګw}˻aK *kb-S<uc<>:9 *+iZ(""WSIT3"U*=,xQpR$3ޣZEyrh'dj?pj \ "s~zB$ۉַRfLl5D@r! -9C<7H&*B1ˤM=X03hvϟ_^^^T('gRdbfbRM8@Dl*qqз  4M`/HOqn/~x&0ƭJ.)&Q"E#TJo/nVbjF7ѩa$:殁~Sh!kZChBgfgW06n}ו!rZ Ն%2w," ~tWWޣ]_8{|&ۇ}ݏ_w|\7ew݌|ꪨgdknחuyL9b vZ,炞e1qHLDRqƵX*۽6u ks@jX?*R3QMP+ $#G4#-Z(r02!4'^vFLWL'@\#@b-JB9!=sqߠ^'H#HFV9\HC k*M}!=Q^˼a8 %"pfc3Ȁ P{F`bGv%~Īe:MU '20k=ԩ*!JQ  f)Z մ1D33@&vQy)اU 1Nƹe 9lWOpXXEp\cFۮCQ!ZJMBp"O{#e% * %[z꺙o/n~wPWuKu=1ɸߵh4j!HljB"S[_?;$ԌDx[`44]ݣ7#_\*kdLcRCiPlfA#W/[r/kk7ڨ.(dbi#NR R#Ѫ+v]-86pwe:&i.I!Si&-u |#4[";{ot:O|4dfYp557{2D@C A 3vuͫg_>O>iͭ^Ay ec)C4iPī4lT1%: agYcGc8Cb&V# H, 9< ^HTYqں8u[L(rrJ'5'ӹ".kZg|owtubEqVUƓAfB3"MFW ru80D`*HȫWN#B@Te #FB 4"9bژ97a6?CLj;OZT^hI1}p]D E`E+Y=Xq^ۡ]\Ki/T3;r)9gm[$!du| T! M)pZhi&wy#Pj3mPX_q>uj =<[O~X2[?~xj̥µsC{?NIp؃s"Pϵ~.y?C&YV"D޻&8In`"D~72s9WRz8>O~u9_=5?^>o}=26zT62dP1G$3-h☊:[czi W{^]39_p^`ngnl q 6je˄[AmİQ3YC))+zzPND::|ZON#igވ9h8EoH_v<>q.=NB;x7{C*)A}ؕ<D iJe[#v:""%DЎކVncbHs·g(zH`vLDpҫ”Ȏk sΞ#Tь\9kfg]sɳ8/(8>|߾wb,B}?yϺÇC"" <1qn7vGM*M"^[349??#_4E;n؀l~C~Qj[>稫Fx͌~Մ54AuLޓCݩ|D7_buyG;QL?p*w2O]-2Z,tN<3ewhDT :ߪ$E\zu0E-Mj70NVknœ)3H-)ٻ \1{j>]hGB]?/7Ͼjf>g:j]Z;b9g3=??ED$_Bp.4 8bWa2"!3\=Dg}A0#G%3 ot<VѡDi{SWPcxooo۶$U 爼sADK !Y4P nl֝|Q&cB`y+ߞ-[4s j^f5ҾX_,>cT[@+pƌ ᓮ)"* gĜn &vn;ʆI-k$XJFv6/௒F4{aSJGͺ&+CUOT7a.*NNo y LjV= [azxq}f/5ӗpѵ~~kzO7?o~'YT;3y-߻޷A bٙYԃ/ 8BvZAlq=~]WGfŲB;<#nju))֏.dzg[V9_nJ,kRgdF4}ӟCs[ggx C8;Я̂N Bjj j}p*]kW{ɉKa+9vT|r[bjDDjz-q9Iu6|+wo_G}te`J},XvIao4vǩܛqYId'n䬃L |jFbZ]^1$өkM9\M*"TUS)Ru:UQQU9盦ef5Ms*"_g%& UC5U)} ac.řsN5YoØK6})4$"G=a ci0֎$?=1ǬϾ</?|ru!<8 \wP02F5A'ڍy›ZJ&@-7"90sVgCM q̥0<\^ݼ|}:@f|SQ |79Q'O>i/|׋JYՇ~:d-EEN촌D*[sP މ 8!Gp[;ASM UR4RM+uEKѴ|T7iEJt|sְA"߇eX: S%Av j4! IS*iea̳$fCj Gd4ejDcIԂ@TfDPEJ*0WԖRp1N* )$pHSLjȉ b& US#9dFŔb 糮ga܎%&F/~?l٤}rՏ~_}TL>_4MSR~^CH@7;DTKrBR"u|*pY6V+q(ѻF6]L8$ryywjdPaZ/:YmZS+]+9lpC;\C|y)w> W7rg_ꃋ%ff5  B j j H1cEdR4;<Ӿ[mѢ"texBpv M;@إeQɠ`c:h[oFzY)K #b5A(w]uhq8~"B n$51Ț6cBUjd6jSYw~Z=~n~.;ۏe(o/G/^]/.눅6 R:{4v_9~cS(5}v9]ahj(ŶR_ e#FWjDŐH~& xX*Ǘ R=Io NX턳U'&hE S='22x4r Bj:y(btESIwRmXFߛS ’4: ^sriF ^}kh Q%*j"␪x~,Jr9'Rv`z2WHHD"EU&D}p>4aeꨢ; /tp7qSbT,¾=;w_vռdń#i E !4uf:WWWҸkC`a9!!1lkb0ma88"cXr?}uf׶M4)&!rFb&v{缪 ADtA*Zr)hѺ8ԽK=1#Qvm;U-*ι|u!2\"9"h%crDUc{h„LcއN@1m&x!x~ۆrZT$SЄ$!P)qz)D},9Pbtd3aR V `w뇮  [SiQ!E"xJ9~OZyQ`7 !ߠBv@Q>6fW_@q鞐#0t'a]+l,2:-^&!m';*`@GȀݘ|Y>V{,04!u!2Q\J.u~~Nx4N@_2T1_߿~7W]Ro }WQj6O1.RJxJK]}3SιrT%߼yb˒RKښ) . u} `yKmUMcoJ)Cߛbt!<\JQBe98R E$ǿD=r:`1IN<|[J)c"n7pkMvHֽ{xx8l)HXXQDIVUð;TTq$HLaG,͔w}믴OyIg(A%Soξ5\#,ont㹡;;%'bT֬)?Xd<"o8n`_⦝k>M}xFm^ B?   6U26}&xA*Z[HBY [kᤛegt DM }WA"YoM\k!+X5uule)xYte-Ϛ!0aWU~wvC-K!?>}HtOwWSOax7ÛR7| xe} ]`>,4MDt8>}4x|ǮCt:T/fVJiVZkYcHK>k-Rk܆JB@j QBm5ua mV0fI~_zWGm0e|5,\miCPi\v]F !H"Rxe<55&N̼,KkeY @[ZK"shOo/~?O1U: ugr:mBL ^AA̘[QU'GS#`@Y[HVwjthy$ėwmrOV+Gg(6նv_i_bXl(~;6V>֨&5yϓGfg~ : #3>+{\#3ZsZm-VeU[kլ.^LĄq ^ХY؅z]zy>}<}ju7w^*y^HvwM{^Ģ g|~<]eiRs,?ZjwÛ!FT[Y[c$Bbw!\e? ru!".?M?MjJ2RXd-j4RJ4i)-^U%$RCbԟ1eէ6mK!祴Rz|z\90^.^D\=suDD,5NO<1RɅB̵2.K織Z!zKf !ƍCI,b!b)`h]Zk|wDBJ,!1%rn$pdz̀ĝ`]:!*"Ud3<Wi'VAI7VtjU *&?nzձXA)=?$0xi||퀞'6^8nP.!l -~j:Vl5cm[d"V[KU6qAeܴ0#4JkimZ[+.@ܟRJ-i#fP\ۯ"ZsI/2дݿ{eCHQqxBO\ZǏ?U ^ָV[?͘a9_.Nhx 놔 OO.ubw<왨Ւ%PJ{x㕙])u0DƢ M-܌̧o3+q7 $%>x^| 2^eYiաE$8N C/yUncÚhMqy4?>~:ϭ*!ZYXptWF(%)(Z[oLi{"<1FFbVI`%bVB؜[ n dV  eH+Q*B@%2|U1gC_`/3ּ@ћyXи i+.d>{֖k=q} ՇtFik<~'& ֹ*}9= DD˰X"IDD!PC"8DwŒcM1)%^MxQt]5t`'1w.?鲿{?Vix#0t-/L:js@ִv߿bB"S17ղ.v]:bj%q,O"ɢ|ZQH-,ժʹo$ʹՊ%Z]׳0t]DŽ$8t="zgL"G]i:K)WAZm}!&L1͛OWsi^=@jm"r\.牙Si3jSs2CpU"ZkE\hKJ)5Rka-]<Z뒁x;_˼h)]%W:/K\.J!Ԭ+nLĶz"x" 0" "NL@!$jHԐȐW_Co|Dht>+(ş;J~?A埑gu)A4UF"6NT[ODUM!(XAL U1Y5(EQSShJ%k+  p:jl~6"&Zf*4m6FDFMDR=BL}7%$oԢ$1q$EkrLsZզ$t@RuU?Xk$[Đbd^P^ǡ$Jy8ytth]R ]xi~R7^.>}JQCXe%K.R%"@ !Ĩ4) ZZ[7ð5 yZ Y4TyZ!d$iH<"VIXMOS-mߗ\y~S)u'ke7PKY.S`,822 \өQ TkVpLAZ+J`Zs-K-5黴BlZ5_nOӥR]lh -u\%>w"cH!Ddb@! U% r 9W? ߤ@+@l3TDGM ؐF<U4tt|B2DhlVyZuktEn m@6:!}gLWADH_Ιm vPrݓ֋kk.6jsjȩp_7XW]wL$@&|+ < ys%D2US'| gwjes>k,d`ʹ ZU; ç t#Kခl7o޼y۷_5aB0Ǽ%/eT[!VGjZ{;"Rz7oi'@)u&3"nio6kOK8 S^=WӼDWJɹRs^{އm@['iZkH[~ERJOsnCc/pH !<>>=>>20t<^S^b"֐)i?}b_l}: V$;.vK1F<}rGlaEH1!mz:ydcL1 i$%  r.zPU Rr P]Mi%W86/spn3?sN1sJZf 12Nx@"L)~2M[a.q @@c$&@kAZWڳc"~}?~fv'bpR"f2Mhj-]W >}zJ}:)lQ[iVJ'exֽԫᥗ`g*ԱveF>VK?7 $ܓj]5kVp-*lM .Cj7bVn8YZfz\]hlM(I0gdu,A 7q N7S,K9eyrUсv?$> Ոf[-_(!лCU_s[_q|}aFZܤD(Վh! W#j`\J׫u?R KC  l_&]B]׹)J[@RL U#aUb-7\K "eS*<#cL)9%k=r6J+ߍ#mM9ό&*#CR0鍥5mkE)H pps5PkW0Z\QuO*{4Md3+9\R)x8c}?2S):29Lk:|9/433[?[[Lr`cۅQVÆiϑy11W_OO!uZu]jZ[3U  a\i55)2_g]wd#T0g~gʛֶi/e/BZԧîwxs80 "^ A[)2⛯G3\|uc1&_6s;7v|?i'lm$-O~$F9˿UHZsrOOO6l IDAT5 NO#rl<<6@ysǧgv z~)5FX]\hN[Enk3}BXc5fRt'6U]]5iSTk+dϔC],)fsY L\y ; :ZesyK6ߵ;l1<̛tyj%BZveu1O)Bu|>===ϧZK|>%ޭaVrҚ _0ZlC nP 05qH2e~#K Ɋ,Rkxx¾+].$Z=KZ)5t{$tāC6*(K)vֆ28[~ЦOwZ)eYy"גy.n(FDÛ7op{>K))acBr\޽}w~;OK(@A m ^s%6}^${?W1>m}ճ5Ot qHs,7D`̥qmއ]7@/Xoik[8m _閸Y}:8mP}N\Wf ]<Tms Ķctu_ 5φt>>"bDBH) +sd!RrˆQc1 CRTDզm` pι Hl.N,xljXxQ)9>bLTT.sK^?N1ys;cDEd- YJf C?L<{sT!vWi7jVju,yEe,cpo8u"81p7ׂ$upSxgs9o@"N]'!K 4PmcY4/g091ׯvbLaH!RrAP6ͳbDR+1&>x}3i/dDK1x_DmuU|&{K5 5xž!l/f .ùϩ>/# ͠պr^ܫ5!D&B@=?9aע̥@Ֆu) r}63ի"# 6(1T֐JmE\ ..v)D!FR ژQ$0E΋"֖VR*4H;En S$LZ ~H1Q]NO 8*S(Kmw}:ww\FBq@%>}Nވ0Hם!檥]?DY1u>b\Ki^o|4xOeK+rܴ9Z !|9%׮2S(hma˼*]$*w5W->}XeR$:Nb`Ux@Vj+bZUZUF ,e#VZpe˘c sFF R,%ԬK- b c$,0R%q<.djUO1Oc]}J~zwrB )A We *_MLWߧzn.i+tRz!fVC5vf'(VF`h  bV/v?՟!R? u1FfaUEWZ^'bЉBTc3q}m[πX]eTk="l! KJ];@88&Rrke<(&%/kf IHmh59糺֢("R[=_.p\) ! ZuuB@cbDT"oIbLp88DMDwwR ZDlz  =1y[Z*aN1VVU335ĉy~6/EDR:{Ǻε;me%/ oXW1ijUAK.t7X[wBJSmJ`ƫ;>1][Bt9.1/1Lݤ@lk}۾B9e_uE@ DO?„٨m+tALU3`QcWfEoQ?h_+Vu6.G+UOω,DY ~tPO3`Kj\#%0"okMD5hOOO!ZI% )~KjXX\iป[\+Rku;//S4e.%WݿT/)@4/`DK^J)őMȾ:|zz@ǰj,!H|Cת/'Uup!37^]؉"6SwMՈ;,:n<÷l9gM.ˢVS%0= 8Mp@a6コRLo]8H+|瀺=:Aإ`7 ҉H˙!I9+f~ !8c#"(,|9_իor>bJi Bd"#;%Bb~AE~v?<qZ,S2Kobo7z[̞_l MOfEtM\]5.$W̺ DRRyC`jVK^fer~2y~ՒK.t7ISL f?zn2wݖ t|nws5uMDV,ztt7|NR4겔ZycXP"/t>8.#KT$mx52@q&-sܔ`UO[Ru`5hΗFtz\,L,|}a7b%p 7"'8}S謨u@b`vUэ`W`Z=hwnHce/[of" #Bc4B"lPUzt!v>-9jUůBcAYIDDI6`z=ӊVu U^v]bHK;D2NjP󲠁 hys!2~~i󼜟O_{R|߼ys8:$}ݜ|>O}Mӥr5lr̈q=.ۭ1e}\-BpM@vj8 bL!t'յD||jeB^ZJ~ @l3N "t!y5 ED+WG[<ϥdoUMm)ǻ;D,@[/OZea'rk63"6/L7~DRKJ&()Kp:-mڳMF:ж~2'-῿Պf>z* 0z$3ԚfNbq[߭fL7ƿ?}5yX66 b#YLKHZm׹vS+9g$֕|+VDaF @stk6O5$|xz}}_=@MsYyt5ga}4yy^jbe#-e9/)%`)~o\`g4$ֲvOSu3fD$Ӽ4ӧV2zu?#"HҊ_ A߻ T1)2Ř!"5U'xE֔Zi,7Ŕ i͎; 8ͣڊ0]}&CXUnp1ez%}Ӵ, pAwa>c:Udy=?". 8ROǏ1ҴhZiaNxxuODVo­~Dsn$S|Vw} v^z(<{Oyu$韬 ̜Z&mSmZe>ҥEq"\JiKə<^0mA1 dSJ9x[$"A~L[1.<>>ֺt(Si1 Am !>֚:@]ֻ@lݻ#Jι$CC ("Q!k 6H)eЖEum>J)qպ6py*8R~KF,0-Mڍq;{=WD#  5I21;|o?}}{qӚ(5R 0'DV tf:b^6Xׇ ݎh6Sh.OP )-~8 fMqLośI*dfnv\a; 33ea`ʈȴåm xd͟ȉv1Qz;>]VCXN=VEn6n[„YGumEz A9.CNk ƫuD4k+"vQ`) HUhqd{bu˔k0Gf,p'tzq>iꫯҬ%vº٧?Wջlݪ/}6bIJ7cJZR55Ȫif`КlDtr/D.ZkZBuZJ1[GAJ9jd{-Ls*6Ј;nf]hƳ 90!CUCqO0nnHBmLp8"Ax<޿st8 w?_t>,mYWSQLF8K~}zo, q5f@v%3,4L IDATo~ n4rDOkGӇ-HF<9}<d:6y[{W5o^>nG(Pp} gPٸG;lKH[meAhiO_xշ~rrx$m<A|T[e?$1ϭ(ð 7KOUOh׸oU|(4BaVB`V^z[-T4[Gp}#ܾJY2i7/;B$ gI0, $;N[`s2F!j}?LPD!8ϳ9`Xz1ګAmj˥{W%!c$MeJ?^Sx:$)DHֵm]X,76swK V˔sJׯ^^EOC .dS> _Ⱥ_ھm'*D H C.GwFaok7e8 ES`X=D9 1#r)%vN$9u4MMDN i:!<@D̖eaj,7oBce:|e-ݫWz5t9 \;3r^IXU+4|9[!.ܝOu#2t8| 11ʊO-L3RJqn0Qw0N(Ff&TX8M޽[j+#%͆?q-˲I⁴eVlޙѳYK1E콏*"ֆuk]Cs Tks3 @mZ<_W^%pGYyYkNvE__m}a|)7_~?\ yY$F;y;M6 +7x1= M%/ o8ΰ>̘̹I @=e cbnei CW!m ic"փt{s(sV1 433!]PEץډ0aT캿6܅^DkK%ʉI)vcEum}B,4xSjCUD)@ sNxjTW_rh+m{\|4rSHl;18[ѱ+(t<;Тswu<aw΂"歩RJ9߽^}[@rv`CtSDt÷r_>ݻw'>H|M4tBIPfѓ!oA)~s0~cS["{99p-IF`ؑ# imZkԺ3$YI( g2ru@,%w:9`9gk=j :{ nt3sC" NdM9$"]]+XF_B@``eJ\D&4tHf}EkL9qJ@`)zqpn.*)ږ,'d]zJt>8NkKqf{:.PWEGTkkIo9Ҏrx4M_u[T #u]C)2{z,MQO\x8Մ*kc̒HX-m]*R/LM-IR(ĦpSE㞈\OLRJ"8%2t:_KMץֵaS"={7^ץ p8Tq4HݺP\W(u]Z5sm>ގcݽkmQ2xnnvzo:c6?SB T8%JYH9R.6Lg^@!Mc9tsYՙuL2 ]u/jWE'tu]˺.Ws}mQ Y(.9I¡bfSIEKm".B\X8|ןvUAYץӲ\650px^cdo\a14Pc`8{럤A &crGE؇hTNzB¼ST'„̌S Gnms=v 4"s_rX g/gftR~AԊb$$с$# sZ nqU,d,ɦuC3G%!.t0"0Kn40M%猝y.fNfU+^̨CֻNtdPudu3@jRU-m,r)%ݝgw콇|,OŋRz]޼y{N$dC8SDRpƛԬYPDI1t1BxF'#4dFDw 9 [kz]FDЦL4 pJɬZH$A 4(M"PdfGh81f7e6Dݴ*co;AWta`Pz[L9@M=:{}uX /|>?o?w~|UyzY4 7Jżi|C5S!TQa=[zCx-:6<H)J9\%'g   aX}c3oLͶFJ yfO88f9jcĴL!k$aF< 4J4 bBr)e!^>Ljm1Qhf@B&{ ZC݈:4J)2Of J޸*k]!A!̃1G:4,l1 1~DДdP Y8D$Lw֗RR'!qW1Qn96xE -aҀ 1%l4"%eIҔJ*S9=&ӝGcDeJ )D|K(:0y G%ɥ,= C3Ќ{ #ec6\:{; ZktCāf&T̖0ŋWh[HWMyF7SMLm]qDLI/^|[39{2U~JCDQ71o!z'BiǪp>_%^Lڴ~7! ZyJQÑ΄3Q:O Ǒ*2n5A$\$ewh81dĆAD׶,pw^,=q`mw­bD3 PNdum?v$%rN:parN` Fpw?f_ZWf{y>2믗O~?].P8յJt6k(7ŃGm]8w0E=I>> \Egj|̘)M/S.1kouݤ!s$0Kw(8,^i$\DR*9OLbؼ͚6`nU@LgIH,KJ UىH[W V뵷ͥo»oY$ KRE9Z뱦 Fڤn1$E, hAE\ꝙ$"9I _ZZu5"ƑC;a\oʞFv]x`{x{n9a#$,%NIYX( tRJF.#U{ 4l^dN<6 =,+V1O7ɫC;qAzjAR-(D 2!'!Ax2Zkk1s׮ڏ#2$M穔 k|)O;1O<mݻmuN]ko-ު[FYˊTc+$i*"tuJ,xzֳ{( 7N a@ DD)L51Iy*P#lӧ^$ >E>#/6# -@EmHknɄ[jRJ1 ֵjLTFpeo#(:8qʇ"'G^ERJ(+e4@D/oc#AYҘ!Ru3}k]_~pmqY \޽_JnØ%)`[R ^EġƤ`ؚJkS}x %fOD4͹A,U>y1"C2MhnjFH"2k!oF$"m=ҞMrM4 LcH=aP#4Ndf,c]"\K s·8BR9!s2%Fu/_}w_|!Ns0ʘfV=b??y9憼_c~ G_~+2Ea ɻD8F2 wEWAODˆ1rT0JV>.LG! a&JL) Aވ͵(2d>}l \#koiWPu&JRd$vnȆ,KFV޻uUKpYm͐I;1HF&ifk͔PfꀑH^:͓^/9[]NC{3>f 8LnX a:Ύ4!|8Զ"X.4' 8RhZy%&\ \ҁ)kru[~u% xL]) 唦<$Oa45pGĩ$NL좐8$12ddQ`GЈ(djaFn-O9e),Ō941o(g^ͪ 0L$s,$)@nkM; Jf&pj^ݜ3A"FNLY2!C I$Bn@)129!Q8եxvY; o JR[wLvmRz_}tБ́|`.x:6D@!!'񙄋oDl[3n=tz"#p08UֺvU"ļ{ܰ7ѪD8.D !k gkȼU?#WA•hԵV]b:z}4w@@wMDFD6.:21s ֊pJe4EY;~RbI9 Jpwq jwua&ևuY]8@eSPʌĽ)2!9lA6޵K2/ϖ{wo?)u k1f{o} md$\rx%Z_?OPu37o|3Fo!z657j? nP3`X;a]0  5ƍ067 mSwYTMvmjw\޲ ɷ4KwmaDwt`׷Y)RYkպ #E0&@pS"`8{r9% 4D>JxkʣWsMRHn"h߾[Wt#VM(#QowqINH0p3J9\ݛ˗iT~^S9duu$r򮔩Ls(w;j,G#{ڣĔXƲi^R24r]kg,B)%bb)0M` %"-)3W5rhuZ׺Ժ\/VU^R$NY4<$LLȒ$ g0pxĮfaC-ERT,RG LO b#$1f\/׾ָY0tw>?XO~;~0IMjo/micĵm7؍P ƄҾz IDATiM7m ~fhˆ T97B[[kkwsStw p_C%@G/30@tyӈpP!Cdvkx&L=,Ѣ532ACUJ"ܱEN:26t<GTCԪujut-KS~^ ApC]kAzY6$rk Et:iUmn#1MSk㻷.XJ>a:Ob몭d( 63!4~l|· NI5$u?3Y#Cwz^օYU͡wOzk- ?YaPBzt"7e)R )u@D@`6S-Q7@SF )` pYDT"mU0bMG"LT Y_u׮5Sb/np8\BrCMJ CL뺢{H..[ e{ݺ֏OωpudC 4%3X{^mlQctus0 B}cL!şS^&|~*l:y)m2] Qogo쟺%YC&1ڳol[9l]).{fDf$9ҘV0$ġK)iH%3F6au.׋Z<VH$FIeT$C|eD1S1f̔K?q,-G*1K?G!Ljqbct8Rʒw/``2o_o;\D5F\X EXS_F9|#f?~T=9vOI;Q $oh5Aҋ w6C.cBuZO@8Z@D@߳Yukۄx6&eq ?KK"XY$~$= 0I2^;Bp>!5˹bou]ZI̤vy|0G TھH2pI%w7yֵVLHR\pgI1Of"PU%I7y8j ئ1 cΉRH0DgPsSɥD{JSVXQbaxhͼZ[5Db8sv y){jn8 1;abFadȃnceHcrDc@#D,9#LbxAX*i ŹǘJfŗhNq%$O"#0 gBt0'hi5C_|۷p:uwK%# 5 y[/vR?Q~)>ru`&w9h|:_ݪc܎W33kb^Tg+O$R۸mimcު[w3 zct0#U򻎅K˹\|;D>x!2p`=mHҌ`OdMWDR1}WO~w޽{.;zS(qg‘z[7)󚿱ǿa?F]zx #ܜQ؝i Sʒ 3AbkӪ:iKlР8zc#3Ғ]UZwe!̌019"Q"Fu]C1p}:*2 ZsU&tS퍑Rǒ7H>uX{Ws,lnH8T&s굶Jz]Ό"<\[[ā T%l HX{QwkE %pnhFnz]\;"˥kO6"VU4\&TW_WueT;hS.'faۂH_|2D2DĜDjRk>FP:XwkW͚{GrTnݵi[u-#s&b$a sJ 9ukZ;32:Z][=vkŻ[(AGjoZ3@\#7-Ǒ852s߄NJe~pyg>G'o)F 40L`Έ!,ڨ(MX=f_GkΣ(AnF &yi<}$m?Ã12e_ 7?>PT0 QuG&;jSE:&7V{ :z. ಏ(M7Sծ/ > 6rDdd".$dЬ^[c8h.!`f6a.$a2D޵Km?yhEL =L`0u]/DDM;1bNZ%^d= ML7)0>SfRDvŧ 2 =q}C !CN%"5S5pql+FۃCy`hש1BIgc-;PhzDW<-,DH6>Fu]eZ/n=/};x}O͟||xfYZkkwb! 4R\'f# 01߃$Mq,8<}3 ߷<1$#wV b0dVQHJ94)֫6f 9f;斘ރBT҂ִހ(˔$3DDs(DeMda$ѳEQ[41 a.^ VvSJ9xAc1RY#C5H&0nCEM#F3rC=,#OEUIXPّb:g>x# Yc{vlS6MA3"~j__u_ڿOgɁ[4̒aѥ+clO?aOtCƟO`6|H@"(CT{ E7j{}|3>y2=٧_DVTVʔR|v1!m<>Pp%l}mÀrF DPk7 ֨mW@9Z;D)%MSJOu%!? J!ўx/e,Ld1J)zZUTx>hRp3 ,ޛyDO6<` IRɹEz'˒o?2{z^@JZ%> B$e AѢf G(h![ %$Lwu{NVfS5@ zzj=7s?-$)ʀҼ,9 ?2Q3|Ќ휜 nzlҼL[CplZ叵nNm㙄27ɑS,b, 7 bV@Xx^chQ궻5F|z/ڪhKҬђ~+Wo[߹,oʪ]N_4@/R[S53cn[ay@_A_N"QSu&f2v{~~nOv*>eTQ|*,־yq)KNڮQ͹P& #E C!~{ Q,9"?4֓CmaM)s-i^KR.=˺.x&Uէ~hD #.\3LJmď#" )a,5BXS7eYAs^뒳teRJ E.cJK.(<ܟ2@7d)?BONpRMV#*8܍> N/nmzC*v2L퀎GfcuBu;mx@An-/lf>ݼE F0sRV ܤ{kZE8t纇u^ʲ5%&]| %-~_Տ^ވfb$\$%wr -)RRuSJYaaݽ9ԿSm)ṔT~w{/C:DR(~Q+$'{Kp;ޡhÑgOIf5N!(O@Q7o-8A!wʯ4.e$tE4bv$F_xOo/UIU",Kﷷ?Oß>=ݬeY~T0h±W_OSW>UI%)٣YQ 3abϷw[YU_8Q919+4fE='HV"Ee ҼZtع s1qCkcxPNEoI!ݪ qK䍼yN,$VnrNA=?P, csv˲>K$I!#v (kzq4s&^ʒ2>|}`2$)7huT:3a3(:Mf%NbqzEq!})"GIŞ#+f#/-˒{;)$GNPQDp7ۑNи*$=W9sk! $֌ɺhPSluy8:R0 &aw>므Dj,E%_ּYm!ruv^2e}^_ow KJ \'[W`!տowE䜷m̒J*LFaNȂ!0M\U#+EV }ڬWV~|xS^mߚ"=u,v~3L~bi-JYTӶ݉h]0Zs5u-+9BLnFukͪB`nͨȪ9remKYUKE&!&"=p]L9-tVzaRaD I 7(ICE %fєAfvƀ\^yDG#7o`{״0ڼ )w20+4fTKY6I@5jSNʚBԉ j$D$" zH4eɂ}HY# QN}OsEr"ba oU\ϏL ۶?źar{+_>OozF*<7zGl w\!g=?r9O~"IQ/4H}x,Hx(Ve}ϷVPMe]/ BhP̈>AB޾%SIi|, 8H=jkwɓ8t̜;\в2ph=6֩9=\zVM"bP?asVTD?ߞouR\du0i۶y|sJ9-KRecJ :Zk{;|0rF8H sJHA^á#CE%UU? H%H49%щZ9; wd( `=6c5=w& 8@ 9&nV6237B{;"j26NׅJBIIi. ~)y: Fgvt MV1Z..S<5au]Q৔mW~~|APN0h᭶ ,IcwZp飽_M2Q :CK Ѵ'E$ wl5|ououx%\ErrS1dVnBjуv:հ7<%=O)F݈p4QF-Ǫ,׬I]w=1"Ud'&;@" ]V)<%%oOOO̵z^#}xѹ޹1R4hd!]hލjQkݞgZ!8,*v"*Fj A) }f[0 $'7?3`" IDATcsV%c ";ZGJ?AQ'V?N^zܠ1G}ך?Wh ,0aVnP˻Z3`a('VW -cD,HC ? ]^vŝ CDf'|wk^eћ˯_?7u)yiKIY|-+KrNN>/ح*o&ƿ%s8r}&hbF'vk͢9 r* "Oz%쭥$q}$dqtT9/RpN#=f&NVDs^:r̻~d),ZGOÖ՚B$ψµت*}K^s)=5 _%hkͼ%G d>Uk9JIP^vh#܍뾛!0[PY >3FZCH >x|(ijر{ ,RAd(uhVG!BPkC4Ū=\i; =0*Zm~o$T駕V4(%(TFMu<. 5V/Z#wgFRU9(+*g 7df1c&q7e{23Q0(L)S3߯SɉZѯmOI/ǚC)}Gw\Anjz2 T ǐ\RJ[5a[Sx3\xm&:k3oV< R{kٰ݂ɉ% g; ~!J/U2Z97X co4axmrdFfRx7( %(T|A, buj%vxrvi x̄S?hRr2F97G9~$N#ZE脋圯kI?=?=%KO>y??ß_YO> 3D'ʯ3*՟SyM$ u {}!QU"J>/9Z%E~yЬQ=\]Q [)^:Z;eTN]iսT=N&#X9W !Dj̘HEʲKƁsFGTrI)(-ܭEIQFHʥPm!0%]R)qPpK!<0Ǝf $嵬jlrI$ե,[m }%8mVk=fІ* `fdБ4@')86Z zuVR8$ؙ0fpSk X$Qh"&͚KPdMi'KUM0UE̛!M+kH^K^ ?<~.Kk 'Ck,cXZZd-O/}KO>޿{޽,o>]?> )k G4ȟ4#|qUtk_̈T13K\h*)-9ќJeMLrf ?܀27x/dcK#W3G&D*Na-Zr%2:&RV ;XkaYC*I˲ H純jnx.v_8ZkP\rk ¬fsNEZO:S4缮뺮5""5%Zj oxRBQ{EF,8OGk=`YP 0 zF|Q栳YU;B,*YIYA't&xzE=GP!Fz42AC7yuSa3rƓH⢇x:-K0UbLI0K)lQwwok_?~cD~6ͣ(Х?$} 9rCR>H;:&}hLQS]IR2@.YHUe]Zk0u~~ΊSU.%*R^e]!.mV[Pl ڗeef$l'+e ᥬ%H2s Ey`fض 2"Z5笒R5^9?RZGAf6pHUâ֬;güN,/x;KSA%]AqB&1]P C5nUU;I (Tafim7hwZ4q%1q8g2 }Ց/g\sG۾ oID$$*4iZ?|t}Oտ|Uqc=t`bE ~-- Iܛk5K䍍fT[|܁ 'hc98s,"|j0&lB朴(gliRrI??E3՜)/ɉa<K^a6̪NfQ]<NawShRItHgfkA!)U˪y ͚е/Z`rjabͪ sk6BC( #PL0VǶN $U cwehn 5QaNDJ$d#TFF6ffuo1H']]JJ?|Oo/FRMdAVѐLB# v^ ^pG6 `~ANz8Qa>>‘0f- Z(EB=ptz.wAaSpBN)-e=N]6ԥJkt:4Ј-:w*]QJ)*"a֜me{w۶;Z+\Hsbfu}@̥t۠N*,cWrẃj{ݑa>"\MXBD|Z.y@9cډpV) Ny=V]rKG4lJp$ Ř֝"dƦz@򤣚5| +>`oFN jEYЁ:<#7EgXDr}33MI%_Ss◾mͿ?_p]^J Tw'HE%B$#]K*IS{!4'jY(t_q.=A>{ifLkfZ9ƬZJd,4nG ?CiHvbdZb2|,_(&J%,벪#9%hխ su߫Pɉͭ%ܥamvGa솪j֗e),NS)d}o*GU=(f@A);y#0ՄAljZkmQ֔R4)1LKR3G8J) )gyk_Ώlžl@:Mfh݂~q$r@O7ϙAè&?a@ DDϓ  ІBPmh odN^E*\]].2z 3i_UP)yYƢ<>R;}^/e Q"W="?BD9=ْ- w^)H83%&aJG{`y̓Kb(/٣4gl"iޙb-Pҥֶ{Δ%fON6$ɍlf%|bN-wIDZL)>ѼDiBcTŽP{¼_]YRjvf~6UFWqZ3v%+waCZ$jVjh{4~RJ*9d  ⎔"B8&̬"C3]?9 mo{=}>;"NA 1IIs9B=g4fC77/vh"FS!)~zBΏЙw~Ɵ:bأKվ?bgV06m(4BC5"[ZDcM8cSأq%]ĠI>$rL $EžmwsZdYSzÒR*Keo޿7~˼ǿwz|||w7{U)M1y FHke"JW"GڨKcA~,SU'C{PX"ا)9BN"{ 'f_wn*%3D:RHZ82DF]<]!ѓDq+32 4 p>>3Mfvݾm{IgLk;J󒔑Z˲֌{)3͌'∨AdAU`?Fsw\-𲊒p^uajNpԗʥ=޵Ĝ #a\ 1Hd+8r96]o}ws"gĈ18hgB9R1kO\͎{/':yBD$\UIR` +}d7U*r9RJ9v~-K?ɛO߾7~g?oG|gVabsp!Y% 1{?46: F0!3/щx8ziԣsobdM$6*~ԡߙ3s eu_xcRHgzR\?Fu&vwZô %$~dPHNSi%ĵmyX.IPAqak939' 0n"mǑ G(?"}H,A]).i@͛ZjkYsͫG oGkf[1x-F#sEO*˲ۜaLyBF s"98ܓPhlc8_ۙ]K'vz!9k;;fvg"^jમԂls9Xb\<x.I" )Kzu${b0sJslo۷^O>.EEh-g~og^/;y&q7̑4dP>Z}w+~ Yq'9,1\;"]Fcм$U U0JD*,,v,DH$yF.XO.Y˺{UL 1#xNED³:tZCύ3 B(0^ k¡-ADQRV !)Y>tTxʡ%PKGEsH,;e^JIZr΢jf)j9Ubf^RNə-E5lUS 'L2>3<!("Bg\cfܕN{t Llu{@I9,h" 77]("C9*gn :!@x!zD9^<)8U .e1r̰U@l@m*9*vV,#¬Vj5%Q{w21g$VRi\o{"㛧Ov'_7o_o?B\wZ%; dCJ$&%l8 R(Z &M4G[Y5"f-*Ul̬mH31 fFswym.@_kZ?G&I܃Yk:߰C:TM$$H$)WswG֣:`zTꞤaydD$O_z35R AJ^+W{YiL]1a8Zk9l缌!s ~3#}B֨G(?|:0#TGx~nѠyޞp#9Ԝ/ͼH<{NfcFxD`~wGr=^e|ɏϾƖ\!8o/mx"Wzy?HҺuBR/P{USj ilANNjF2$9Wѣ?PQb}AvT+qzB\D5ԒPgv;3%g)Gpk-211YBK0;(0!m^ڐ;?XͥJND8{uU!v{N/&"-ܽVSQVfS?o)lxy&R9F2zQ<~txF }VqO̩sf2Ɗc*4#Blqy1Gi>}⧦5OH+dIHxdU2Ź8xgTR☖&bK>/gT9~^Ӣ~JoѿWG\cS ϝ]-)cwh@CG!&8 vxT֘et}BQ~xxbTBUQp' IDATaV@j03מ'G#þ0u#Nf Pse KΘ2w=e2A;uRsn~4nI$EfI9 f.E`kތpӘN<RϋYGg8v ?̱oRh=DZ[D5^w]Bqj0ʎJa֬5pAy0t _ypPc<'\N1Ć]Cgz%֔00C*UhfeN$zww6Nֈ)c:Gžau۩Y4'%=8R"}#ݾG_N9}w{.Y3?ƻRnnda'($J^4X1O%Λq`TC? )%%j{kfmG;c;u&^!k'}F~B_QFI` f;K`Ay};rv{~=?+qoNE3;3FJ"Aѱm7 {j̉^i\IUn>'"5sm۽%Վw"%Gqzm[#uhGim4gYwGn?^{YsUrmV%%)Y0/I5l{~~x|?owoM ;C3>rfʇrw$L)?)s\qKMHB*p&.IJʽUr} Xhg"X0< JV3ՉXfp0,uOL~6@yجDjIU"VK)W*r6뜙w H𨙛 OX{L'^Ҥ)sʋJ,Ij|3;2>zE~b롮E$M*`zɪ%-\.`V3=Q'.j=V2EDn՝Ghc3jJoRZ-\XJ`KlM̚Rkܥg`8[Pv<۶Y̓όQꂬng9+3hsV,K<5 x% C"dMr&¾YaW53;/#LR֣abE?dOt{utII*y:OU Ixt.9&*5qc3T!Dj1!m5&rrf~b/4lgXƘaXk "80jCf>9B䈌Ng"j-iwj'w4baN,tz."(Z7V.lz|~P?Q ʗגס}m M\Y޶ o7p\>|ir>O{ 2&o !D ¥hdn{X)L,N~5aʭ5sӏi۶]Wfnp5߿wSJvsIݟ,DD8 lHL8IZiUZ+岊Hm MEŌWp,|mIg<^8,X#P@@'"XH͜ݹO4R_9q8PNΣ. /a/Ciϸj|Rk7{AIC\+d(PPp$@ 4lc;FHIuG+{Ś(k#NVxe_;h0HA5z&N7к;|imʻ2dl$/ײ**~p0j/YSDD } an*.x^%TbQgo=r &) 3jmSR !+Q )LJԑ{$,%5C$(Z)PW\"KS]<~e-lg^"VOB\RAjݫ{ꢍĴq}%s#jN"WH~rYb^K)7m4Ԓm*ݡsV jkTi VmmVwG)XjM^RJN*iߣ-"Zu:;}GX̭G3c˚ Xk{,M%x{A`Ms 3ꤪk(wΆSOi􎉕Y݈Sx :͘o(DKȽ9$)b3 }(<)S&bHI!,yRs; *r4-CNOZugrx+6̃;NdޥALd=%pUؑRqѢ@JK*i `?oV9B8R뾽ݞSJ~~ab*%%֪ۉFfQE{.cGX39pA69䣱Dp烙-3EhxL.I} П7^NU#$ ""Bbt-6!BdtoY9O׀Yk ҽLUkmN#Y8zF\)#9Ib ݎ)]Wkk̂SD KP {j߬;v}=DS.)j^}ŲS!Btu'fRcAݏW'3`H@iKs:_\JYG h Z}~~޶$uǐ9yADq s#98G$|8:x "Tūyk֪[t%#s.Y{#;z@Q =7:g@WоiҪ-O5i>xXn=km!ߗ18p4":,9^ |'7^-{򒎔<:-Xۤ#x%5b&r9䎦EtdcoC. ^J$=%Xc3,r-tseIAn ~b9h#&jأDBD.? qpe&`,!.Ǐ>?>ueS3 BJp렔^noǡ},`”d,kAc PvX~A֎YRz6fMDtQ5+|ζmc7o>|||̜v0ؘŏGqH)'윏$ܩ;ѣa*Mv`Rp'N|ϺWSH['t ?)JӉ0Uo>!.L PDt* kyp.­^.KT"avfaMY2.Q;$an8 s 1l=;4y_`l}`14Xx3c9Nf +]rF'Bʪ~vx5miGQ{f>0"9qjfmNMD:oP5 'U.KRݪ ΰh3y$T`ᵒ^<(ZCdY5FR ,fZ=OVP Fֈ{)޿J@0z# ""v䎘^|]RYrJ}۰@)wV@2ڈ))4aBs!t1gbԜO;QҀ-5!8>3сs5@ }CI$O-X ı*0 3#iTq:SJUK዗ ~TC_teZzNNjUU!~`zҾI7y۟+\SJJkI+yP f:G R|4Epɶ=l3oa8VeU,݋?}R"aX4 a3MHDH$" y!T9/=-/%1maERa tLDʈƳn"nA{wjG06<е}SJ!Z#v,yYG!ǡKJy^ͧt"/˲{kv,e PY,fݝ܉aaMr.)KF(j6ѣH/_{x09?cy}A6H/wnaAkwijΥ>=).]SgDF| WGywύ۹ V@DgPUJrԆG*EX C{&4/ 1bLi($%|5Pf@>5Hjq*#bg"_rӶvo[=a 8}^TI>NRf止:ᶋd; $"b7w**M?*+ B>ƈ8Bl qP=+fuK,cK#DIU@B<;AR7`)Tku'ږeema/5IqZ%?R f IuQ]ȂDv5nKw @)`PIax.dNT>Oulfei#s?CC aO7,xB!!I t:x9_Y:^L0u %ÿZg)?[C{A=KuhB╫yD! 0iRI@NJpk{9N@;Kf3]I$"bݙ9`&*KN֪Yc қӂ7@4"#eod5ldDy+Q Euݒ$9r4#iң芦 k;Օхdְm.篪23sUKjZ_jaҿ=-pot+{ϝ/A|F垖aZnec G :EqǃSZz;!jbu]?;sPP?/rθiU7:%0?9?3K)=T5"uxӟBD=Nyݍ{{8֓\--?' )d ^D {2Ht萭7ͧw'yd>3AsQ7P JnS2Ju`rPxt`ru@m-UA.F” cĐDHM0)VX\qs/,}y!vE%Wg%8%VVށ&6 j܃q|߾[=VVYj-RWw&otԇiUƤF2qVc'Q3.oG{-Rս#QJ )% @@J 3=kWE dp{ށ>cG74bwSbE`ULJHnر+(r^jMx∀&d-b4QiA{? l&EٔT DDjQ-Iv1=)$#{j<!84B8&I Ï5}"fG!vU)X=+ 51tc3΃F@%9@ Lt1I|i6LjET:cRxi]CYEDT 5UcZ`&~H7|sQ<@g!VfZDy8ỷ+"")Kjղy71ThWJG8Jo{kef䲚R(/"]Ui$˓{tq / 3vd2k+qj1GUfQFRAK.;W>m!T q^/u}IQy˸ҩڕv=x38jKקmn5Zv[0|e7$w@LF^ kvW&o)bǔ&" ~AhCd_r RX?G\ @?ff*5\AINy%cBn\NL[T7."PvV Zq~r+?o@TfH D+u=2(c֒S<3P7 tW_))s#fE\ {FTQ=Ҿ%ңS5נkSa%'(/R @f>"<_"~i% tE8P@0%y14Q~lrxGpj-QH>$0f~܇HH<™4!<g쫑$-cT=|AͿ)Jvn9ui Fh ,~{7V^j5sL~b*6zwѫ,#e$#DJ0GIܵ<_ٸ< tXA_1-Jֈ;k`;9lL[gwٞDbIgPqqyď_j/ӇY7Ǝ-WfyĐYz z;:HgGkDRya;9iIMfŋb͙HJg3#̲ʛ<`/:ʉ%kG !>F-nCIK&oŠKU,tE]Fp=k 9⥸nR]cxT&"l[ ʆ/[8 0B=)"8xwUe)<RK=(JVLmLEe Irly'9>./ s* Li`ӄ(-G|aO]Mz0 £e[DDV-cT(W{&yVHJ< 33xM4"Cħ Tå),y P(b) u]un]Ҹc~KLVM`̺ZqfīYu2^b0g<|Z,pC)U^YYE`fK*"uDnRǖ400D2l>/+ewҳ}l&!v{aeYڄk >7cƧDO%3v6|`~ s/m*LEtod#^r5fTG=gsojj8?y6ܯ e IDATY֝lܤ#Y*X-٧'f;fu:Q I“VpGp7c Chljt9LWOl?Wf>2䩬 3.t졢bRl([ENGo}ӽo@/Y-7ʾܗ*\\D'X%&y*)Jx\1O?W{٭orW6];CH Bd@01#rLAPP" KLXV&E!ʷ.c;y6wծy({|u描)y"j„y乒mWb:e!((D ؒ0£A\Ͽ#(dޕ(jMSW+I80'ǵ'8z`9"ܽcx{p2:[jb\8Y)"2Ѥ4'xX`eZ,aԗ!i"fܜ8P`p^Ŗ2E)EUR),F\׵X@0h̔ίtf3Y#rzfQQU y+LoN&+9}fۆݩ1>-(4 ax]`ja7:]O С'̈́ gADy & XLX%`RC~x~-~^q W "q-IbUՄ rj;cW*llvF0S6pwȡ2/E߮bƖDJE\jY!¥X-]}K?$$qї HnVs6J"\TEv)pT({x!:XSΡͺ爔;t'C"-F~DDldIK΃)CsFGh1ru9;YI6Bвc]|OiʹY`uj{Xݗ"6G[Y:*0N#R$ޚ Ob.bϳ]~%~-.Fz1Kg,?t Cq3b!LG6040;bv=د^~CϿQO B:alS(2MYP"0.1ؘERՔIMKPz!(@Li"SӊnbYGLw%ƣe֐e椘"@Tf)`Va(ZzyS&ze!/a%Ay@@ȶٖAɡx=qR̢҅IL* G!w+b߷_#"nVZscҝ iWfVjf2Ĕh{$m:\M;f")\ j{Fff`Z6#B!vW%u؜phnK.;K<1):8~>s_iȓ@;76oieX cH^HcyNu~ MK7GF ^o%]t4MKeqUǘ%vn45kϯò slpbߋ@w 6ESrXˬD]TGlْ9y&o4] @՝nq#o%`w8{92帛Lޮ~^<:HLpFo.JY16Geֺk.H&%ύH&P;{kNL>ItZ53L [sxzYrHZY ".Hó̻GΞh$H|0M˸ (3ӫe HCO =: Ƞbi|- oozfS?(֞A2`ľۊ{P^Wqf.^7}OMUx,eƛ u-(uȗ _ "|ۚ'KfeWrVq=}T8ͼda:7ØL( DL=8s4#ϐ hJeބsU0VXD}}!b >yNǻ>:aٚzM 70+E$ffM0jI5R6k"-I(@֔Eܸ֭z[BUMJQ "gDͺ@'rG< uHD{CR$n0\f}#c<3f:׻В>eK 2C@DŽ2- ?brao^Y(_G1xs[rq5!lƦ]@Aál}v3R')+cCV#yCJ[ 8;_83j |xC} {'cHb|[^IENDB`thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/integration/test_optipng.py000066400000000000000000000007271452244666700335160ustar00rootroot00000000000000import os.path from tornado.testing import gen_test from thumbor_plugins.test_helpers.engine import EngineCase class OptiPNG(EngineCase): optimizer = "thumbor_plugins.optimizers.optipng" fixtures_path = os.path.join(os.path.dirname(__file__), "imgs") @gen_test(timeout=30) async def test_optipng(self): result = await self.http_client.fetch(self.get_url("/unsafe/bug.png")) self.assert_result_smaller_than_original(result, "bug.png") thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/unit/000077500000000000000000000000001452244666700270535ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/unit/__init__.py000066400000000000000000000000001452244666700311520ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/optipng/tests/unit/test_optipng.py000066400000000000000000000044321452244666700321470ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license # Copyright (c) 2011 globo.com thumbor@googlegroups.com from shutil import which from unittest import TestCase, mock from thumbor.config import Config from thumbor.context import Context, RequestParameters from thumbor.utils import EXTENSION from thumbor_plugins.optimizers.optipng import Optimizer class OptiPNGOptimizerTest(TestCase): def setUp(self): self.os_path_isfile_patcher = mock.patch("os.path.isfile") self.os_access_patcher = mock.patch("os.access") self.mock_os_path_isfile = self.os_path_isfile_patcher.start() self.mock_os_access = self.os_access_patcher.start() def tearDown(self): self.os_path_isfile_patcher.stop() self.mock_os_access.stop() def get_context(self): conf = Config() conf.OPTIPNG_PATH = "/usr/bin/optipng" ctx = Context(config=conf) ctx.request = RequestParameters() return ctx def test_should_not_run_if_binary_missing(self): self.mock_os_path_isfile.return_value = False optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".png", "")) def test_should_not_run_if_binary_not_executable(self): self.mock_os_access.return_value = False optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".png", "")) def test_should_run_only_for_png(self): optimizer = Optimizer(self.get_context()) self.assertFalse(optimizer.should_run(".jpg", "")) def test_should_run_for_png(self): optimizer = Optimizer(self.get_context()) self.assertTrue(optimizer.should_run(".png", "")) @mock.patch("subprocess.call") @mock.patch("PIL.Image.open") def test_should_run_mozjpeg_binary(self, pil_image_mock, subprocess_call_mock): optimizer = Optimizer(self.get_context()) optimizer.optimize(None, "input_file", "output_file") subprocess_call_mock.assert_called_with( "/usr/bin/optipng -quiet -fix -preserve -force -keep -o5 -out output_file -- input_file", shell=True, stdin=mock.ANY, ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/000077500000000000000000000000001452244666700251035ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/CHANGELOG.md000066400000000000000000000022361452244666700267170ustar00rootroot00000000000000# Changelog ## [0.1.3](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-pngcrush-v0.1.2...thumbor-plugins-pngcrush-v0.1.3) (2023-10-30) ### Bug Fixes * replace images with unknown authors ([#71](https://github.com/thumbor/thumbor-plugins/issues/71)) ([5914c9a](https://github.com/thumbor/thumbor-plugins/commit/5914c9a8671ba094dfd471bfcea3236e74ab5d5f)) ### [0.1.2](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-pngcrush-v0.1.1...thumbor-plugins-pngcrush-v0.1.2) (2022-02-22) ### Bug Fixes * Improve package description ([b1dc8ce](https://github.com/thumbor/thumbor-plugins/commit/b1dc8ce2958ea0fd08d64a776fbe4972844e1247)) ### [0.1.1](https://github.com/thumbor/thumbor-plugins/compare/thumbor-plugins-pngcrush-v0.1.0...thumbor-plugins-pngcrush-v0.1.1) (2022-02-14) ### Bug Fixes * trigger release ([#50](https://github.com/thumbor/thumbor-plugins/issues/50)) ([a76f637](https://github.com/thumbor/thumbor-plugins/commit/a76f637ff14c326cb0d7987948a974ba807e83ff)) ## 0.1.0 (2022-02-13) ### Bug Fixes * set initial version ([7df5544](https://github.com/thumbor/thumbor-plugins/commit/7df5544d5c372c05549c1ada1dab294af23c6fcf)) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/__init__.py000066400000000000000000000023641452244666700272210ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # thumbor imaging service # https://github.com/thumbor/thumbor/wiki # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license import os import subprocess import thumbor_plugins.optimizers.pngcrush.config # noqa from thumbor.optimizers import BaseOptimizer from thumbor.utils import logger class Optimizer(BaseOptimizer): def __init__(self, context): super(Optimizer, self).__init__(context) self.runnable = True self.pngcrush_path = self.context.config.PNGCRUSH_PATH if not ( os.path.isfile(self.pngcrush_path) and os.access(self.pngcrush_path, os.X_OK) ): logger.error( "ERROR pngcrush path '{0}' is not accessible".format(self.pngcrush_path) ) self.runnable = False def should_run(self, image_extension, buffer): return "png" in image_extension and self.runnable def optimize(self, buffer, input_file, output_file): command = "%s -reduce -q %s %s" % ( self.pngcrush_path, input_file, output_file, ) with open(os.devnull) as null: subprocess.call(command, shell=True, stdin=null) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/config.py000066400000000000000000000002131452244666700267160ustar00rootroot00000000000000from thumbor.config import Config Config.define( "PNGCRUSH_PATH", "/usr/bin/pngcrush", "Path for the pngcrush binary", "Optimizers" ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/setup.py000066400000000000000000000025201452244666700266140ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- from setuptools import setup setup( name="thumbor-plugins-pngcrush", version="0.1.3", keywords="thumbor optimizers pngcrush", author="Guilherme Souza", author_email="guilherme@souza.tech", url="https://github.com/thumbor/thumbor-plugins", license="MIT", description="Thumbor optimizer to run pngcrush", long_description=""" Available Configs: - PNGCRUSH_PATH This package is part of the thumbor-plugins repository. For more information, visit: https://github.com/thumbor/thumbor-plugins """, classifiers=[ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Multimedia :: Graphics :: Presentation", ], packages=[ "thumbor_plugins.optimizers.pngcrush", ], package_dir={ "thumbor_plugins.optimizers.pngcrush": ".", }, ) thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/000077500000000000000000000000001452244666700262455ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/__init__.py000066400000000000000000000000001452244666700303440ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/docker/000077500000000000000000000000001452244666700275145ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/docker/Dockerfile000066400000000000000000000001731452244666700315070ustar00rootroot00000000000000FROM python:3.9-slim WORKDIR /app RUN apt-get update -y && \ apt-get install -y \ pngcrush &&\ apt-get clean thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/integration/000077500000000000000000000000001452244666700305705ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/integration/__init__.py000066400000000000000000000000001452244666700326670ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/integration/imgs/000077500000000000000000000000001452244666700315275ustar00rootroot00000000000000thumbor-plugins-gifv-0.1.4/thumbor_plugins/optimizers/pngcrush/tests/integration/imgs/bug.png000066400000000000000000004607321452244666700330260ustar00rootroot00000000000000PNG  IHDR,brzTXtRaw profile type exifxmPm!):*ݵn9õn (fN%%/B..;ʴwp Q4Z  U4*6={ZW##/kT2ViT8Nyv~.NeW"i "VdMS{LefIۭз&/;kEUFh\'mzTXtRaw profile type iptcxmAn0D>E``fp$Rw]*ԿiA'ϯ}Tǁvu2t"~F^gO*-#/_. u'tW!\L,5Os8!1tG9(19JP=P e-hwLY*>(mےh-v"~{}yRoTBRpiCCPICC profilex}=HPO[R*vQP]8*BZu0y4iHR\ׂ?Ug]\AIEJ/)}wT+e ![a>c\b>')x=uRxwߟիM8 xxf9GXIRω' #e8̈IGbJJ Marcelo Jorge Vieira Marcelo Jorge Vieira CC-BY bug +bKGD pHYs  tIME XRa IDATxĽі#I,fx3fMGzvg3=w$:J&n  l ɶp,FG _ F"` <$@@CI#MREm״-MIu]?_~]_?~=u]_sJ*1H"A2b8H:~82s$"4IfEId$Vu Af~?dD$ /$ADpH D$½.$L9\\kֲmK2""i{dbM98϶ \zk)_Okx][`o^^1"c 摙df8̑#G23Lj"bo9E8?x#8#3iܥEۖ)i%<&fS}Y?x>Y#'????~ |$g`"8B8#ICR_%T,¥\Kˆ 6,dQ_ք  IQlsP@>0 Ľ}{ؒ24O`˖YZZk]|5y}=5לrq?ME""X1Yc1RJ"b $QaADp܁A$ Agd2āl`wF|FtvY_Ecus0 /O?; mwӁ 6`2ڠ )[ЪThzΚsVMy\UҪUVYꅾA͂"A`DxdLiFW;X6`7V@;eŽ'P7t~:,"d[,vSMؤ`VM@ĸ+DpUv PeWRIq ϧω__~>ׯfQe1\k"2:"`S+(E Z\|j2Aaea5 ᾒSٺ ԀKGҮ7Tr>B4ms@6E%J\kiκz>ח窩kyxVa ^$; q#̊ 12C*i̡S*$m(mI F؀`,~'+"$U_$>!vd-2؀7E"bǒW׹HtÏ^[S?CVa@@0u9__sM]U婪kZ5VYrHYB FlKe#dF0s$wPv~$bWe[8{tW>x "Jd9謙0!a/#l \ CƑ3H XP-.yV⯧&K<kb./y rxN>uFC1Q`^DE";Eݩ,Wy.SZKsZkt1ll @XpqmEIhKIK;EcjKHq{R;ʰz#W]UZKka.\+F(0Gxg YfLU$3""i3G($fDȊH1 @"#" A@yq0>LƑlb Uy^EuPZu9 ޙhT" l6ɲva UF ^uk͹Zbpk~^e`?dgxS dy8f޶C}0:"kM+AGܒa\5)~U}]Zsi UXUUU\K,AD"h%BLʮV6""q0& @DFXdn2EU&.ΪAF1Y>G*OcMкagY &ZZ[@D5L+dˌf9rgW 7=/fqәa"hsp+嬎 Te*Q*e,,|*UaTX)KUXmQɴ<}^Ifccqy8u2Ff82<>Hrq쌲w fΚY*U*ZkDB7l]/G{l~߀iZEဏo*9eVe*gz| EZ95\U ___55WkZ^*NfZ\ER" 79-%0@7Z-%9G!Ã]5翥62-mK &cOr߸|?މ^p.wIf:*QUcu<83sΩu12k~ؔkCj9pDD)Y*bDF$KpiTb |*<Ϧ23F|e/ڬp4ۄE4o eIpx_f6[,s4gRS*55ūQ2V-J\jTP3 4ARA b`pdqq8cqs㈈cnN ޢ6̖wzXK`Dq0@fwD!:n`G=\J" 6 6SOW.M^|XhҰ#aKFGm}(|8[s9s<#qkǯX95 a 91΁"Q>Z B8#OD81 #31 "a[z6|Pg[/>7q%0z242]Ft5, ^5לe\ sYxT\%L>ku*ZT 5lcP1?jDDqGc4T=>#3)0IƷ+֦vXUϚ OUusת*YUQ>DTvN*<$6d!5AHAиemwp`-$YΥgRLKeT _|N]/UZu\sV-X*F1 NdjJ=͘W+ 8!'+f0PwkHvns5uM^0aMw@f{e0= AjU%d`mxqeܥڍ"#)"]Bmn鈗X !F4A ],n٫DIT "B04ZS8:~Mjw[ kle( xG 85gsգ9+G1 Ou}Ik r!K ,I`X֤Fr$#5q1Ȉ#q~8ȣ)c<_}V[Zu MC$n[]$1':zUم>4p-yzΫE*_^i.G,m4Rk֪*%h"wGU /O/oh?8>>sG~oTj,C&Cªãj5Ɯ99gQUuŜYUeMDx&Վϒ,S$|h_펋،wOD<8ӵ/̦TV%תU~κ_\b%-!9e1wjSHhaD`氱U6h2n _Cn;ZE 8x7I1vÝ&ba\I▬} 7kئ`.|5o[9*̝ ಆ_VUfUeSqq>8cH cWL?qGcD[U_ c01 ;7cAiM-v(o uKxԷlͼ)P&.hgWU(UKxcƨ>r^m#nysX[LgX9?>>>q|~qkd/.:ߙwIXm]K%mZrU\HXk!ZZK, w&vN*,WTDh[_骶<h$:эQ gIŹU9/r\KZHS3δa2" G2DE:JÔ@rOe WhnI1 ;\*jn7"ֱߺR{a;^/y Ja `lk@覓7Tl}V÷!4 5m}Bʣ|slj1NaD" yqhmUF9v= d"a˰^V܌}nܱwi[ 0-l o .cs׵5k)gaWa)*X0E$.i fD hi3FhY8?<yt{n MQ}9Y"$\N5<8ڎ_Ӭn۰-+Aۏv$igXk5tUNxULT^/ y{2QȄPc^.@)$KZp X{P^$7GV6},L+۫w<Է;o^i߄4m/(Ƭ1F39TUc@b嶬9gbZق.2s7/199>qn*$@Fc 2#[N.qG NV9 J@CkGv)Aňm etL"qGKќKS31FmIDHt]m7'ٳ16ote^; w}*%ВgյZs%/b.Pj n iunk/k88x?|~yydr1$"7TuҠ'F KX(BD83uΓk䀫&Hڛs4̊*mQcwdfl8T [:ÚKU57 K'iۻ~ziK2dQw#x{(.rtHjgH?N]C8rKt-펛R"s;H`|Q 8up!ݽĠ:o醻|9T&5tc:IkuņR95*\O"GOyGv:v0ˌ~F\ GGa1<l>3`K Hᖛh?\]<_=wA]U=?^ ݳn1",/U۬Tz/f1VH[E6]j|7wvDdK xog;m=?"300?onF`z?,!) `! PPFG8nc *&wÛ"z_ 6Z;nnCVodvYLWrK=CETIg4Uki9@&\h+Ao |u\X& 8yJ̎ؼk,,tf+0clưrIrOS`v ý64q4zv7 ͒[#Jp[ C꤬ɘ"ӎ;_-DIzPAEHG6HF 7kJF.A|Wysc8ggKqq#bgzU`XpЏ<92p |y<>7Ww#1]"6FbZp+$>;Q=S'6nTjݤ(w}3U#ZJptw.o@HEklHxqlܹ_Jދc8Czɦ!o_Ek mqS)=]`5眫@EHVB,,8*PdW[onV98?h:9>1F>lj#p@$@ǽTg1&}A}diQ)8'bphk4(x6yKP/bmjiW.y/ */A-^= L$*@jׂɻZ' 3*,iV!Iq[=&!NU}G4 g; xy{B]Vhu/t36f7jm{{}}ߤW>ڴnOI00QT]Ks QJEK'Yitp`$|ǏǏ qvԼtAc] Ѿj%ޙDM C3o/mru'ې%zCQ<7l(]#rUOYzg[o'7 "z,F3zaoÛ :8;,lAd 讄lꢺtOJql3558%ܭggĐ#r0d"ǝ^\8k*QTRkV-|[',^suCO2@FB=tO !,aPbtt!` 5<??o?>||q1yxtE 6עx]f@v;ȧC{ 3U&C !";W@.U3~?:,%im淙tذ`Дd2mr]& Vw &+!"qWn @|YZkH_juюQ$ AJac%gPY"yۂ%NzU}rHЋƲ li=:Y3AHanvϫ%V6uśjnPAO*T18=+T8yϏϿ=>~|<q|#8H;}i?+? $0w3|0!a [őa:TBRy_\J]q;:EXQn]-U8g޷in9ƺP NXv^B R"˩nW}UXP `Xj.zS$a\7 |Y_mL6niil GM.xO,(@ߺ jn@ 4jpG#*4no]NBgslp[c9B:pz|BFUJ: ,dF2Fםu:B{J^>9Oh{i9cOB-ԂZZOkSm}gGog =Q0vܳtĘb-1#މH#qrgoQP虴|8~|q RGhA$M߃*/91#) 2p *KZGA )nWba&V߷V{y61QI{w6Fd}˛dlkeN _ $J #aM-ːm6sΛ= QnſB7COEDwXqM9^B{F|ܳD3"꺛.## gq~7;T6۰)ÀA(pd8Zpg,CU ,Gag6ݮ0|ӷ-a~_-}ck5n!MZ5WbȺh Qy{^Nvjo MJ\E=*038F?~s?<ǁ#qb Po}WoO{$07ڜCmLP!QcTU՞/Wj'#{&-[Jl&Kܔ|#j_7 =į[c96oM-1FtRoo" ݹۦ@`Ndb õv\wپ͵5UD-jSn3Qu\NMIk^VYMlԞqܣ=X3sGd<?|sks2) JzPlZ#$# Y+2}A*r}W!z*S Y)-`oztw{ 9EvQV2M|'ޗGYMmϸg{teFY{g-3T7Vme]vѹԓdF.ؗnW@0%Zm>B=d88FmV ۣgvFa%8"3+ck|sVu7&/v/.eƈm.81qdPPp\Ukr׆߇. F*]p7@eޝ7o[ꞚJYH--3ҵLaeNRHGU:,HiQs2/xлBr$&M^i?Xޕw%О2E-Rzsu?H' dp s#iX(gy_A&z)HbnSiP ا/IQeB?K s֛V䈔<" !Q gٝl^̣|ɖ[ Ҋi1f =h涷y*MvV x,BMq3܅7 hb0d#T^ ʀjk'g$d2%){};FAH?Jᒢ,/_߿޾Oi4i$[-9V]jzzz@JFX  ֌S-bQBH{2GJ^EDɯeKFs+lozWjc^>t';Evj$,xLj衠cUf]nSE̞ϼ;+E`~n^.!EEP&Dԭ1BUcsTI(ČXLmٳZ&UϏIqvMvfqOs(&w HV,㡊`A4}!ܥ7hWOehЄxBvTBR`I) QQI6& OtiM2Me^t%vC;G<űֹW+IgAYtZӗ/;}YN_eYV;&](̻?DS! gWڄ KRB<+3oɈP'F0lzgo)]MWa-ܺWlZ i*JGS>f e ȏv=1Xv0 i"4NmMML {dvhݐippnzfB\럖OUMǔV&+T1}*z(*D7^m :5.9]~xI GxZEhY׈h"=Ht<,5a:*B+T5HnKmR4ID}j`Y@0% 5eYPf>ߗt4/%&Kʘ*d+>k s+Jϯ$|Ƣ T¹ZzN^[G kSu:WN:Nvl\(y̦*B^vOukأd6ѧ&}MK^@]\n4&L UEF Z^IDHa#!MR6 tuy >O5VtN WHJJqYrXAN~;tw9Q0pB2OrpB\0;Pj1yZN鼼Me׈iד2_@lem^|~+lT VRp*X^Bzm?ϟ>| pzMgOPjn6{D6HAzDzr3q|H]O΀v4eR!iQgf$9(*bN<)lqyVn9gJZFW-ٝ/Ä8ή=TUPUjU[1GX[DHZ^EP ϸu K{>.ɳ_BMx7xq,fe)4 RsA!C-0xU:JU {zo8! *LD>dV/%Oe]($;I&թY\e>4͋MKzڧiE&ە> iQ7Uu17X] jIcl1B裕NަP#9I&=%JWX6ku=JogG}Md4wi@0Q}lO\ޕJY1=;Ġ?Hf;>~ b.j^;:0krS|2(I.Ww+D?g$nb4J1*VMx5Ybp:=BHwpF)iLޝ G f H扙 QIKDb7bGCkʤV3jqe@[@L(ENӼR0D=km4I/tZNRLcLgmd:,(yep>> -&QĆ5Hj`!]0YѠ;, -CT%='p-NfIFc+{:R~ݑR*%ãwkdK"թ[@XK2i6 d:0gHOq J'7vX&4JVqO%));ʉ5F^ Rn:؂`- pur1١enޏ+5 C`m<|LD3īkďaqړ~2ScYT[X@IuiSn Ef̧2-6-Z&IblS)Le'Tnj3_`+}xn~qٸk< W1?n{i[/dzPP#DFxwsc£a_q P >j~ ff.=E"$ XvԞHk1JmUz06GDMnܥi퇊iUL5,9CmN@sopcx(CS J݈& 1Zk ,ꞵU SIPp8`P=&hio̮R&mBTe^Χ/.:˭XYa[FkN!Em^~>Not:ӄSVnt.$73gϑ&0F(H GQzSvĸ+=zT{}wk#a AS,һNr+z;9SQ2j6m"`2rOJA{c^2Bc)4<({+R5Ͳeܫhym}Q;126aED.EaSsb:QVm Sj꺒%p|zPm.R4b4>c+RCOn~S*K/alva;<=yx%&ؼ7}ⱞl*άfx7T[E*/`}Y|$1|KۦiᑗQψʄӄeɰ Zq@Z)Br]b0JsN6#dR{ "`-N@m8 "# DTA˶#i*BV/EmHoF!!Jc !u<]8\ULqDRT*cXwP8yѱ|,n >MC?.qL9MuXy2c#TEsqw*N)N\Q3A=lݣf"J@tΎ i<]m8ԥX BĹ @Lz׈r~C)X+S׸QnYeߧ/v>Rd._~|ŀ!u{볎=0#:QzQm?nǭ"G oγX 'Lkaڗ{ھh7 (i<%Ug,bQbZczn2U] -u>|e2TzB([}0 n]Y:&ƩK@_&C##ݦXTd='w+ w[O:G~x9>VB?j~=fujȃLjg[ c$AD >@mVԊ[C}$l-{  cm"k0kѨ nEJ2Ch"駞7FiBzHUZ_Moh2$u-i="c4=1b .ĪR,=tPURyVJ5V mPV9)g]NLT 炤_Mȿbu:MDyg{!zߞC0N9}>JVauQ@FᚤLs$8u5kRQ.uEs5\(B1#5a6~ CA S5f)c B 4#J &\nMBTC}X.%mY#3tEPgWGl4Y^KIL=aR(,0DK"3h&65Χiu-si.|{Uez܈åra$e&)y%MC 03EdGUqimCvȶ-9 <wvM@҈R'LgNmCVz}VhD10pkf]jC]ր;;[Mߘj!&@( [İ [ؔŨj` vUHx %2GDzBI(kD1QdⲐHT$BjMoA-Iq48%g Is07\K)gM8M8)]ZeT3UUQD7X &fFN%P#2<ɂp|2*8v?*XGNN3|@sQH0; Nz4"#>CT2ɠzʹ47WcR=m2| %"U.OqSo w'@DTIb\K&d͛"@f7iSnT3I>$- kҬ":h@%nժ GkpG㖡*CSL48V1m[j-\BMFL Q0J%*BD$4B4[ϋPU@VY,. BaQd0Ԡ 0l09-qBdDP!XE*XDf.f8OPXK)Eq1+Q dOi1{bae1?#TQJqi y 3F@(ړ [b:{tVLMd<Ɓ(I'}j[JzH.Ak~%1 `]ڼͥ[fKh׌5TUw?ڢ{zeT w,y줜5 G hoПc{?߮xɔ\hh̴ ZCߞG@>^+o3ŗOjCsJױf͚bEa$ !TEv@@>+u*x40dtp`xS-;a&l"jY oܚ4VkWc)Ӊv 0I CK?(zkӹMM7Ā& B N&4kGt,kL,Do!Ԣ4QP3HC[-=˷O7I